<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet Clojure</title>
	<link rel="self" href="http://planet.clojure.in/atom.xml"/>
	<link href="http://planet.clojure.in/"/>
	<id>http://planet.clojure.in/atom.xml</id>
	<updated>2010-03-16T05:00:23+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">memoize done right</title>
		<link href="http://kotka.de/blog/2010/03/memoize_done_right.html"/>
		<id>http://kotka.de/blog/2010/03/memoize_done_right.html</id>
		<updated>2010-03-15T22:53:00+00:00</updated>
		<content type="html">&lt;p&gt;My recent post &lt;a href=&quot;http://kotka.de/blog/2010/03/The_Rule_of_Three.html&quot;&gt;on how to make memoize more flexible&lt;/a&gt; has sparked
an interesting discussion about the actual implementation. &lt;a href=&quot;http://clj-me.cgrand.net&quot;&gt;Christophe
Grand&lt;/a&gt; and Eugen Dück joined to discuss almost
everything Clojure gives you as a tool to handle concurrency. Don't miss
the evolution of a quite simple function in a non-concurrent world to a
quite complex function in case multiple threads of execution are
involved.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://kotka.de/blog/2010/03/memoize_done_right.html&quot; class=&quot;seemore&quot;&gt;See more ...&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Meikel Brandmeyer</name>
			<uri>http://kotka.de/blog/</uri>
		</author>
		<source>
			<title type="html">Kotka</title>
			<subtitle type="html">About Clojure… What else?</subtitle>
			<link rel="self" href="http://kotka.de/blog/index.rss"/>
			<id>http://kotka.de/blog/index.rss</id>
			<updated>2010-03-15T23:00:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Building Clojure with Maven</title>
		<link href="http://ianp.org/2010/03/building-clojure-with-maven/"/>
		<id>http://ianp.org/?p=495</id>
		<updated>2010-03-15T18:48:51+00:00</updated>
		<content type="html">&lt;p&gt;Just a quick reminder on the steps I needed to take to build &lt;a href=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt; and install it in my local&amp;nbsp;repository:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;download the &lt;a href=&quot;http://maven.apache.org/ant-tasks/download.html&quot;&gt;Maven Ant tasks&lt;/a&gt;, version 2.1.0 at the time of&amp;nbsp;writing;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;move them to &lt;code&gt;$ANT_HOME/lib&lt;/code&gt; (this is &lt;code&gt;/usr/share/ant/lib&lt;/code&gt; on Mac OS&amp;nbsp;X);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cd&lt;/code&gt; to my Clojure download folder, run &lt;code&gt;git pull&lt;/code&gt; if&amp;nbsp;needed;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;run &lt;code&gt;ant -Dsnapshot.repo.dir=~/.m2/repository clean nightly-build&lt;/code&gt;, this will perform a clean build and install it into the supplied repo; this can be anywhere, the default though is &lt;code&gt;/var/www/maven-snapshot-repository&lt;/code&gt; which is probably no&amp;nbsp;good;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to also install &lt;code&gt;clojure-contrib&lt;/code&gt; just change to it&amp;#8217;s download directory and run &lt;code&gt;mvn&amp;nbsp;install&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Is&amp;nbsp;simples!&lt;/p&gt;</content>
		<author>
			<name>Ian Phillips</name>
			<uri>http://ianp.org</uri>
		</author>
		<source>
			<title type="html">IANP.ORG » Clojure</title>
			<subtitle type="html">random thought and mutterings</subtitle>
			<link rel="self" href="http://ianp.org/tag/clojure/feed/"/>
			<id>http://ianp.org/tag/clojure/feed/</id>
			<updated>2010-03-15T19:00:39+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">This weekend in the Intertweets (March 14th Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/OGd7Z1rmIlI/"/>
		<id>http://disclojure.org/?p=746</id>
		<updated>2010-03-15T08:13:32+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;Talked with two devs (1 java, 1 C#) interested in clojure but repulsed by emacs – no one had yet pointed them at the various IDE plugins (via @&lt;a href=&quot;http://twitter.com/cemerick&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View cemerick's Twitter Profile&quot;&gt;cemerick&lt;/a&gt;) &amp;#8212; This post started a long thread of tweets. Clearly newcomers to Clojure need to know about all existing IDEs earlier in their research. We do &lt;a href=&quot;http://disclojure.org/where-to-start/&quot;&gt;our part&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;Adding clojure to an existing slime setup in emacs: The current recommended setup of emacs and… (&lt;a href=&quot;http://fons.github.com/adding-clojure-to-an-existing-slime-setup-in-emacs.html&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/mohegskunkworks&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View mohegskunkworks's Twitter Profile&quot;&gt;mohegskunkworks&lt;/a&gt;) &amp;#8212; This is an example of why Emacs might scare new Clojure adopters away&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;InfoQ Interview: Stuart Halloway on Clojure and Functional Programming (&lt;a href=&quot;http://www.infoq.com/interviews/stuart_holloway_clojure&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/infoq&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View infoq's Twitter Profile&quot;&gt;infoq&lt;/a&gt;) &amp;#8212; Stuart covers a lot of ground in this interview.&lt;/li&gt;
&lt;li&gt;Variations on a parametrized memoize in Clojure (&lt;a href=&quot;http://gist.github.com/330644&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/cgrand&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View cgrand's Twitter Profile&quot;&gt;cgrand&lt;/a&gt;) &amp;#8212; This is a follow-up response to @&lt;a href=&quot;http://twitter.com/kotka&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View kotka's Twitter Profile&quot;&gt;kotka&lt;/a&gt;&amp;#8217;s &lt;a href=&quot;http://kotka.de/blog/2010/03/The_Rule_of_Three.html#summary&quot;&gt;article&lt;/a&gt; on how to write modified versions of memoize with different caching strategies&lt;/li&gt;
&lt;li&gt;Google App Engine (GAE) Blog mentions Clojure as a programming language for GAE. (&lt;a href=&quot;http://googleappengine.blogspot.com/2010/03/app-engine-community-update.html&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/smartrevolution&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View smartrevolution's Twitter Profile&quot;&gt;smartrevolution&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;clj-native: see a C function being passed a clojure fn as a callback, great stuff (&lt;a href=&quot;http://github.com/bagucode/clj-native&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/kyleburton&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View kyleburton's Twitter Profile&quot;&gt;kyleburton&lt;/a&gt;) &amp;#8212; You can quickly see how it works with &lt;a href=&quot;http://github.com/bagucode/clj-native/blob/master/src/examples/c_lib.clj&quot;&gt;this example&lt;/a&gt;. Now you can use any native library from Clojure.&lt;/li&gt;
&lt;li&gt;New blog post: Yahoo Finance in Clojure (&lt;a href=&quot;http://www.paullegato.com/blog/yahoo-finance-clojure/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/pjlegato&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View pjlegato's Twitter Profile&quot;&gt;pjlegato&lt;/a&gt;) &amp;#8212; This is a re-implementation of a Ruby gem in Clojure by its own author. This plugin fetches financial data from Yahoo Finance. It is still slower than its Ruby counterpart, but the author thinks this is mainly because the Ruby version is using a native HTTP client library while his Clojure implementation is using Apache HttpClient.&lt;/li&gt;
&lt;li&gt;Mar 17: Clojure by Stu Halloway and Rich Hickey (&lt;a href=&quot;http://novajug.wordpress.com/2010/03/01/mar-17-clojure-by-stu-halloway-and-rich-hickey/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/DavidValeri&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View DavidValeri's Twitter Profile&quot;&gt;DavidValeri&lt;/a&gt;) &amp;#8212; If you are near Reston, VA on March 17 then you should definitely plan to attend.&lt;/li&gt;
&lt;li&gt;A little blog post showing how to integrate Rich Hickey into your Emacs buffer (&lt;a href=&quot;http://www.bestinclass.dk/index.php/2010/03/approaching-productivity/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/LauJensen&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View LauJensen's Twitter Profile&quot;&gt;LauJensen&lt;/a&gt;) &amp;#8212; Some notes on Emacs configuration, especially the IRC client (ERC)&lt;/li&gt;
&lt;li&gt;An in-depth tour of Enlive (&lt;a href=&quot;http://github.com/swannodette/enlive-tutorial&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/swannodette&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View swannodette's Twitter Profile&quot;&gt;swannodette&lt;/a&gt;) &amp;#8212; &lt;a href=&quot;http://github.com/cgrand/enlive&quot;&gt;Enlive&lt;/a&gt; is a selector-based templating and transformation system for HTML in Clojure. This is a very powerful library, but the documentation has always been rather sparse. This tutorial fixes this situation by providing an in-depth tour through all Enlive features.&lt;/li&gt;
&lt;li&gt;Russian speaking #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; community at LiveJournal (&lt;a href=&quot;http://community.livejournal.com/ru_clojure/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/alexott_en&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View alexott_en's Twitter Profile&quot;&gt;alexott_en&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Reflections on leaving Haskell (to clojure) (&lt;a href=&quot;http://www.alsonkemp.com/haskell/reflections-on-leaving-haskell/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/jneira&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View jneira's Twitter Profile&quot;&gt;jneira&lt;/a&gt;) &amp;#8212; A glimpse on what brings other FP developers over to Clojure (hint: it&amp;#8217;s pragmatism)&lt;/li&gt;
&lt;li&gt;Setting Clojure&amp;#8217;s Log Level (&lt;a href=&quot;http://www.paullegato.com/blog/setting-clojure-log-level/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/pjlegato&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View pjlegato's Twitter Profile&quot;&gt;pjlegato&lt;/a&gt;) &amp;#8212; &amp;#8220;Clojure.contrib.logging doesn’t have any way to set the log level. This is obviously a problem if you want to make use of various log levels (debug, warn, etc.) to separate different logging depths. Here’s a function to set the logging level on my default clojure.contrib.logging setup&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=OGd7Z1rmIlI:Jf_EhiU21xs:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=OGd7Z1rmIlI:Jf_EhiU21xs:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=OGd7Z1rmIlI:Jf_EhiU21xs:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=OGd7Z1rmIlI:Jf_EhiU21xs:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=OGd7Z1rmIlI:Jf_EhiU21xs:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=OGd7Z1rmIlI:Jf_EhiU21xs:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=OGd7Z1rmIlI:Jf_EhiU21xs:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/OGd7Z1rmIlI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Approaching Productivity</title>
		<link href="http://feedproxy.google.com/~r/bestinclass-the-blog/~3/gP1QYXRFtqY/"/>
		<id>http://www.bestinclass.dk/?p=1141</id>
		<updated>2010-03-13T21:29:01+00:00</updated>
		<content type="html">&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.bestinclass.dk%2Findex.php%2F2010%2F03%2Fapproaching-productivity%2F&quot;&gt;&lt;br /&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.bestinclass.dk%2Findex.php%2F2010%2F03%2Fapproaching-productivity%2F&amp;amp;source=LauJensen&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot; /&gt;&lt;br /&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;Time is scarce these days — and with no prospect of any extraordinary reduction in the number of tasks I need to work on my level of productivity. Here are some thoughts on getting more out of Emacs.&lt;span id=&quot;more-1141&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Preface&lt;/h1&gt;
&lt;p&gt;Productivity is many things, starting with the way we think, through the habits we end up adapting, to the tools we use. Many years of software development has made clear to me the effect of having a good IDE and I have thus defined 3 factors which greatly improve productivity and 3 factors which inhibit it.&lt;/p&gt;
&lt;p&gt;The three factors which make you more productive:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Emacs Emacs Emacs&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The three factors which slow you down:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Vim Vim Vim&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A question which came up recently in #clojure was exactly that of editors, is Emacs the only way to go ? Answer: I’m not sure. &lt;a href=&quot;http://kotka.de/projects/clojure/vimclojure.html&quot; target=&quot;_blank&quot;&gt;Vim-Clojure&lt;/a&gt; is pretty powerful, but oddly enough it only works with Vim. For NetBeans we have &lt;a href=&quot;http://enclojure.org/&quot; target=&quot;_blank&quot;&gt;Enclojure&lt;/a&gt;, which broke during installation of the latest version from Github, but I have previously had luck installing earlier versions. And finally there’s talk of an IntelliJ plugin called &lt;a href=&quot;http://plugins.intellij.net/plugin/?id=4050&quot; target=&quot;_blank&quot;&gt;LaClojure&lt;/a&gt; which looks very promising as well — If you’re not approaching Clojure from an Emacs background, try out those 2 if Emacs is too big a mouthful.&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Emacs&lt;/h1&gt;
&lt;p&gt;Emacs has a great pull on developers using all languages and it’s no different for the Clojurian. Emacs has editing capabilities which aid producitivty quite a bit, but its primary pull comes from its vast integration capabilities with other systems. Here are a few key components of my setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Color-Themes&lt;/strong&gt; which aid reading and reduce strain on eyes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git integration&lt;/strong&gt;, which makes pushing/pulling/merging/rebasing/stashing/committing etc a breeze&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gist integration&lt;/strong&gt; which lets me share snippets in a second&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ORG mode&lt;/strong&gt; which lets me manage time, appointments and above all TODO lists&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clojure-mode/SLIME&lt;/strong&gt; which lets me do REPL coding, reflections, source surfing etc&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ERC&lt;/strong&gt; which lets me chat on IRC networks directly in a buffer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Color-Themes&lt;/h1&gt;
&lt;p&gt;Normally there’s not a lot to say about this — You have a number of themes to pick from, select one you like and thats it. Except for me its not. I use htmlize whenever I post code on this blog, meaning I mark a region in my blog, hit M-x blog and the code is converted to colored HTML which is then sent to my clipboard. That means when I change color-themes, the blog changes looks. Earlier today &lt;strong&gt;&lt;a href=&quot;http://twitter.com/edt8&quot; target=&quot;_blank&quot;&gt;etate&lt;/a&gt;&lt;/strong&gt; pasted a home-grown theme on #clojure which I immediately adopted:&lt;/p&gt;
&lt;pre&gt;(&lt;span&gt;defun&lt;/span&gt; &lt;span&gt;color-theme-dark-bliss&lt;/span&gt; ()
  &lt;span&gt;&quot;&quot;&lt;/span&gt;
  (interactive)
  (color-theme-install
   '(color-theme-dark-bliss
     ((foreground-color . &lt;span&gt;&quot;#eeeeee&quot;&lt;/span&gt;)
      (background-color . &lt;span&gt;&quot;#001122&quot;&lt;/span&gt;)
      (background-mode . dark)
      (cursor-color . &lt;span&gt;&quot;#ccffcc&quot;&lt;/span&gt;))
     (bold ((t (&lt;span&gt;:bold&lt;/span&gt; t))))
     (bold-italic ((t (&lt;span&gt;:italic&lt;/span&gt; t &lt;span&gt;:bold&lt;/span&gt; t))))
     (default ((t (nil))))

     (font-lock-builtin-face ((t (&lt;span&gt;:foreground&lt;/span&gt; &lt;span&gt;&quot;#f0f0aa&quot;&lt;/span&gt;))))
     (font-lock-comment-face ((t (&lt;span&gt;:italic&lt;/span&gt; t &lt;span&gt;:foreground&lt;/span&gt; &lt;span&gt;&quot;#aaccaa&quot;&lt;/span&gt;))))
     (font-lock-delimiter-face ((t (&lt;span&gt;:foreground&lt;/span&gt; &lt;span&gt;&quot;#aaccaa&quot;&lt;/span&gt;))))
     (font-lock-constant-face ((t (&lt;span&gt;:bold&lt;/span&gt; t &lt;span&gt;:foreground&lt;/span&gt; &lt;span&gt;&quot;#ffaa88&quot;&lt;/span&gt;))))
     (font-lock-doc-string-face ((t (&lt;span&gt;:foreground&lt;/span&gt; &lt;span&gt;&quot;#eeccaa&quot;&lt;/span&gt;))))
     (font-lock-doc-face ((t (&lt;span&gt;:foreground&lt;/span&gt; &lt;span&gt;&quot;#eeccaa&quot;&lt;/span&gt;))))
     (font-lock-reference-face ((t (&lt;span&gt;:foreground&lt;/span&gt; &lt;span&gt;&quot;#aa99cc&quot;&lt;/span&gt;))))
     (font-lock-function-name-face ((t (&lt;span&gt;:foreground&lt;/span&gt; &lt;span&gt;&quot;#ffbb66&quot;&lt;/span&gt;))))
     (font-lock-keyword-face ((t (&lt;span&gt;:foreground&lt;/span&gt; &lt;span&gt;&quot;#ccffaa&quot;&lt;/span&gt;))))
     (font-lock-preprocessor-face ((t (&lt;span&gt;:foreground&lt;/span&gt; &lt;span&gt;&quot;#aaffee&quot;&lt;/span&gt;))))
     (font-lock-string-face ((t (&lt;span&gt;:foreground&lt;/span&gt; &lt;span&gt;&quot;#bbbbff&quot;&lt;/span&gt;)))))))
&lt;/pre&gt;
&lt;p&gt;Call that function from anywhere in your .emacs and you’re set.&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;ERC&lt;/h1&gt;
&lt;p&gt;I’ve gone back and forth on this a lot, but today I’ve decided that having your IRC contacts directly in your buffers make sense, so I thought I’d share. To get started, grap &lt;a href=&quot;http://www.emacswiki.org/emacs/ERC&quot; target=&quot;_blank&quot;&gt;ERC&lt;/a&gt; and add this to your .emacs:&lt;/p&gt;
&lt;pre&gt;(add-to-list 'load-path &lt;span&gt;&quot;~/.emacs.d/erc&quot;&lt;/span&gt;)
(&lt;span&gt;require&lt;/span&gt; '&lt;span&gt;erc&lt;/span&gt;)
&lt;/pre&gt;
&lt;p&gt;That will load the basic functionality. Then to set up ERC to track your nickname(s) do something like this:&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;;; &lt;/span&gt;&lt;span&gt;Only track my nick(s)
&lt;/span&gt;(&lt;span&gt;defadvice&lt;/span&gt; &lt;span&gt;erc-track-find-face&lt;/span&gt; (around erc-track-find-face-promote-query activate)
  (&lt;span&gt;if&lt;/span&gt; (erc-query-buffer-p)
      (setq ad-return-value (intern &lt;span&gt;&quot;erc-current-nick-face&quot;&lt;/span&gt;))
    ad-do-it))

(setq erc-keywords '(&lt;span&gt;&quot;Lau&quot;&lt;/span&gt; &lt;span&gt;&quot;lau&quot;&lt;/span&gt; &lt;span&gt;&quot;ljensen&quot;&lt;/span&gt;))

(setq erc-track-exclude-types '(&lt;span&gt;&quot;JOIN&quot;&lt;/span&gt; &lt;span&gt;&quot;NICK&quot;&lt;/span&gt; &lt;span&gt;&quot;PART&quot;&lt;/span&gt; &lt;span&gt;&quot;QUIT&quot;&lt;/span&gt; &lt;span&gt;&quot;MODE&quot;&lt;/span&gt;
                                &lt;span&gt;&quot;324&quot;&lt;/span&gt; &lt;span&gt;&quot;329&quot;&lt;/span&gt; &lt;span&gt;&quot;332&quot;&lt;/span&gt; &lt;span&gt;&quot;333&quot;&lt;/span&gt; &lt;span&gt;&quot;353&quot;&lt;/span&gt; &lt;span&gt;&quot;477&quot;&lt;/span&gt;))
&lt;/pre&gt;
&lt;p&gt;That will also keep ERC from annoying you with JOINS/PARTS. Then as a little something extra, I added OSD notifications for all you &lt;strong&gt;Ubuntu&lt;/strong&gt; users:&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;;; &lt;/span&gt;&lt;span&gt;Use libnotify
&lt;/span&gt;
(&lt;span&gt;defun&lt;/span&gt; &lt;span&gt;clean-message&lt;/span&gt; (s)
  (setq s (replace-regexp-in-string &lt;span&gt;&quot;'&quot;&lt;/span&gt; &lt;span&gt;&quot;&amp;amp;apos;&quot;&lt;/span&gt;
  (replace-regexp-in-string &lt;span&gt;&quot;\&quot;&quot;&lt;/span&gt; &lt;span&gt;&quot;&amp;amp;quot;&quot;&lt;/span&gt;
  (replace-regexp-in-string &lt;span&gt;&quot;&amp;amp;&quot;&lt;/span&gt; &lt;span&gt;&quot;&amp;amp;&quot;&lt;/span&gt;
  (replace-regexp-in-string &lt;span&gt;&quot;&amp;lt;&quot;&lt;/span&gt; &lt;span&gt;&quot;&amp;amp;lt;&quot;&lt;/span&gt;
  (replace-regexp-in-string &lt;span&gt;&quot;&amp;gt;&quot;&lt;/span&gt; &lt;span&gt;&quot;&amp;amp;gt;&quot;&lt;/span&gt; s)))))))

(&lt;span&gt;defun&lt;/span&gt; &lt;span&gt;call-libnotify&lt;/span&gt; (matched-type nick msg)
  (&lt;span&gt;let*&lt;/span&gt; ((cmsg  (split-string (clean-message msg)))
        (nick   (first (split-string nick &lt;span&gt;&quot;!&quot;&lt;/span&gt;)))
        (msg    (mapconcat 'identity (rest cmsg) &lt;span&gt;&quot; &quot;&lt;/span&gt;)))
    (shell-command-to-string
     (format &lt;span&gt;&quot;notify-send -u critical '%s says:' '%s'&quot;&lt;/span&gt; nick msg))))

(add-hook 'erc-text-matched-hook 'call-libnotify)
&lt;/pre&gt;
&lt;p&gt;So now when somebody highlights you, you’ll get something like this:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter&quot; title=&quot;OSD Notification&quot; src=&quot;http://www.bestinclass.dk/wp-content/uploads/osd-notification.png&quot; alt=&quot;&quot; width=&quot;535&quot; height=&quot;294&quot; /&gt;&lt;/p&gt;
&lt;p&gt;While chatting, people throw many links which don’t exactly follow the http://www.dom.com syntax, so to agressively identify those links and make them clickable, add:&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;;; &lt;/span&gt;&lt;span&gt;Be overly eager to identify URLs
&lt;/span&gt;
 (setq erc-button-url-regexp
      &lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[-a-zA-Z0-9_=!?#$@~`%&amp;amp;*+\\/:;,]+\\.&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;+[-a-zA-Z0-9_=!?#$@~`%&amp;amp;*+\\/:;,]*[-a-zA-Z0-9\\/]&quot;&lt;/span&gt;)
&lt;/pre&gt;
&lt;p&gt;I looted that from EmacsWiki and it seems to work, although I’d hate to debug it.&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;;; &lt;/span&gt;&lt;span&gt;Enable logging
&lt;/span&gt;
(setq erc-log-channels-directory &lt;span&gt;&quot;~/.erc/logs/&quot;&lt;/span&gt;)
(setq erc-save-buffer-on-part t)
(&lt;span&gt;defadvice&lt;/span&gt; &lt;span&gt;save-buffers-kill-emacs&lt;/span&gt; (before save-logs (arg) activate)
(save-some-buffers t (&lt;span&gt;lambda&lt;/span&gt; () (&lt;span&gt;when&lt;/span&gt; (eq major-mode 'erc-mode) t))))
&lt;/pre&gt;
&lt;p&gt;That’ll make sure you get everything logged correctly, so all we need to do now, is launch ship:&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;;; &lt;/span&gt;&lt;span&gt;Launch
&lt;/span&gt;
(setq erc-autojoin-channels-alist
      '((&lt;span&gt;&quot;freenode.net&quot;&lt;/span&gt; &lt;span&gt;&quot;#clojure&quot;&lt;/span&gt;)))

(erc-select &lt;span&gt;:server&lt;/span&gt; &lt;span&gt;&quot;irc.freenode.net&quot;&lt;/span&gt; &lt;span&gt;:port&lt;/span&gt; 6667 &lt;span&gt;:nick&lt;/span&gt; &lt;span&gt;&quot;yournick&quot;&lt;/span&gt;)
&lt;/pre&gt;
&lt;p&gt;There we go! Now you have Rich Hickey and the gang right in your favorite IDE and you can copy/paste snippets directly from #clojure to your REPL — Hows that for productive? If you really want to get going with ERC, make sure you stop by the &lt;a href=&quot;http://www.emacswiki.org/emacs/ERC&quot; target=&quot;_blank&quot;&gt;EmacsWiki&lt;/a&gt; entry, especially the logging can be improved I think.&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;&lt;br /&gt;
 &lt;/span&gt;&lt;/h1&gt;
&lt;h1&gt;More?&lt;/h1&gt;
&lt;p&gt;If I had more time to blog about Emacs extensions, Org-Mode would be at the top of my list. Its a very powerful mode which lets to integrate task planning seamlessly with the rest of your business in Emacs, I recommend you check it out.&lt;/p&gt;
&lt;p&gt;Regarding Raynes’ quote, we were discussing meta-programming, namely macros in Ruby and seemed to be the case that Ruby macros are so far from Lisp macros, that claiming a connection is a &lt;strong&gt;&lt;em&gt;stretch&lt;/em&gt;&lt;/strong&gt; — any Rubyists who can elaborate on why Ruby is called a “Lisp chainsaw” ?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/r-qhSHozPC_cylz-Z0OXn-28VJk/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/r-qhSHozPC_cylz-Z0OXn-28VJk/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/r-qhSHozPC_cylz-Z0OXn-28VJk/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/r-qhSHozPC_cylz-Z0OXn-28VJk/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?a=gP1QYXRFtqY:GBHQaHugD-g:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?a=gP1QYXRFtqY:GBHQaHugD-g:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?a=gP1QYXRFtqY:GBHQaHugD-g:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?i=gP1QYXRFtqY:GBHQaHugD-g:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/bestinclass-the-blog/~4/gP1QYXRFtqY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Lau B. Jensen</name>
			<uri>http://www.bestinclass.dk</uri>
		</author>
		<source>
			<title type="html">BEST IN CLASS</title>
			<subtitle type="html">Software Innovator</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/bestinclass-the-blog"/>
			<id>http://feeds.feedburner.com/bestinclass-the-blog</id>
			<updated>2010-03-13T23:00:33+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Leiningen (unknown severity): help task fails; &quot;java.util.zip.ZipException: error in opening zip file&quot;</title>
		<link href="http://github.com/technomancy/leiningen/issues/#issue/27"/>
		<id>http://github.com/technomancy/leiningen/issues/#issue/27</id>
		<updated>2010-03-13T00:00:00+00:00</updated>
		<content type="html">Leiningen (unknown severity): help task fails; &quot;java.util.zip.ZipException: error in opening zip file&quot;</content>
		<author>
			<name>BugSpy</name>
			<uri>http://bugspy.net</uri>
		</author>
		<source>
			<title type="html">BugSpy.net - Reports By Tag: clojure</title>
			<link rel="self" href="http://bugspy.net/tag/clojure/?format=rss"/>
			<id>http://bugspy.net/tag/clojure/?format=rss</id>
			<updated>2010-03-16T05:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Today in the Intertweets (March 11th Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/hk2wMC2xrB0/"/>
		<id>http://disclojure.org/?p=741</id>
		<updated>2010-03-12T07:11:03+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;Europe’s Largest Ad Targeting Platform Uses Clojure &amp;amp; Hadoop (&lt;a href=&quot;http://www.cloudera.com/blog/2010/03/why-europes-largest-ad-targeting-platform-uses-hadoop/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/ghoseb&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ghoseb's Twitter Profile&quot;&gt;ghoseb&lt;/a&gt;) &amp;#8212; Clojure is used within Hadoop.&lt;/li&gt;
&lt;li&gt;Introduction to Clojure &amp;#8211; 14 Apr &amp;#8211; Independence, USA (&lt;a href=&quot;http://www.meetup.com/cleveland-java/calendar/12849377/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/developerevents&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View developerevents's Twitter Profile&quot;&gt;developerevents&lt;/a&gt;) &amp;#8212; That&amp;#8217;s in Independence, OH. Organized by the Cleveland Java Meetup Group.&lt;/li&gt;
&lt;li&gt;Clojure Buch: a German Clojure Book (&lt;a href=&quot;http://www.clojure-buch.de/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/ajlopez&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ajlopez's Twitter Profile&quot;&gt;ajlopez&lt;/a&gt;) &amp;#8212; Another book on Clojure! This time in German :) Scheduled for September 2010&lt;/li&gt;
&lt;li&gt;Showing off @&lt;a href=&quot;http://twitter.com/hugoduncan&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View hugoduncan's Twitter Profile&quot;&gt;hugoduncan&lt;/a&gt;&amp;#8217;s swank-clojure changes to the team. You guys are in for a treat once this stuff gets merged. (via @&lt;a href=&quot;http://twitter.com/technomancy&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View technomancy's Twitter Profile&quot;&gt;technomancy&lt;/a&gt;) &amp;#8212; Hmmm. Please tell me more&amp;#8230;&lt;/li&gt;
&lt;li&gt;Clutch v0.2 with #&lt;a href=&quot;http://search.twitter.com/search?q=%23CouchDB&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;CouchDB&amp;quot;&quot;&gt;CouchDB&lt;/a&gt; change notifications support is up (also on Leiningen). Updated API and syntax (&lt;a href=&quot;http://github.com/tashafa/clutch&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/ashafa&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ashafa's Twitter Profile&quot;&gt;ashafa&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=hk2wMC2xrB0:Cb8EyL66lvo:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=hk2wMC2xrB0:Cb8EyL66lvo:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=hk2wMC2xrB0:Cb8EyL66lvo:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=hk2wMC2xrB0:Cb8EyL66lvo:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=hk2wMC2xrB0:Cb8EyL66lvo:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=hk2wMC2xrB0:Cb8EyL66lvo:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=hk2wMC2xrB0:Cb8EyL66lvo:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/hk2wMC2xrB0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Today in the Intertweets (March 10th Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/Oejeq6ONe88/"/>
		<id>http://disclojure.org/?p=739</id>
		<updated>2010-03-11T07:50:37+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;Michael Fogus talks to RubyLearning’s #&lt;a href=&quot;http://search.twitter.com/search?q=%23Clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Clojure&amp;quot;&quot;&gt;Clojure&lt;/a&gt; Course Participants (&lt;a href=&quot;http://rubylearning.com/blog/2010/03/10/michael-fogus-talks-to-rubylearnings-clojure-course-participants/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/IndianGuru&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View IndianGuru's Twitter Profile&quot;&gt;IndianGuru&lt;/a&gt;) &amp;#8212; Includes a mug shot! (@&lt;a href=&quot;http://twitter.com/fogus&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View fogus's Twitter Profile&quot;&gt;fogus&lt;/a&gt; is a co-author in &amp;#8220;&lt;a href=&quot;http://joyofclojure.com/&quot;&gt;The Joy of Clojure&lt;/a&gt;&amp;#8220;)&lt;/li&gt;
&lt;li&gt;Simple clojure memoization &amp;#8220;API&amp;#8221; w/ multiple cache strategies (was reminded of this by @&lt;a href=&quot;http://twitter.com/kotarak&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View kotarak's Twitter Profile&quot;&gt;kotarak&lt;/a&gt;&amp;#8217;s &lt;a href=&quot;http://kotka.de/blog/2010/03/The_Rule_of_Three.html&quot;&gt;recent article&lt;/a&gt;) (&lt;a href=&quot;http://gist.github.com/327842&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/cemerick&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View cemerick's Twitter Profile&quot;&gt;cemerick&lt;/a&gt;) &amp;#8212; Another set of &amp;#8216;memoize&amp;#8217; alternatives.&lt;/li&gt;
&lt;li&gt;I&amp;#8217;m heading to the #&lt;a href=&quot;http://search.twitter.com/search?q=%23montreal&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;montreal&amp;quot;&quot;&gt;montreal&lt;/a&gt; #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; group meeting today at 1.00pm (&lt;a href=&quot;http://groups.google.ca/group/montreal-clojure-user-group/msg/89b1afb2464cefc1&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/hugoduncan&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View hugoduncan's Twitter Profile&quot;&gt;hugoduncan&lt;/a&gt;) &amp;#8212; I know I am posting this too late, but this is to highlight that there is a Clojure User Group in Montreal: Bonjure&lt;/li&gt;
&lt;li&gt;Joy of Clojure TOC updates (&lt;a href=&quot;http://blog.fogus.me/2010/03/10/joy-of-clojure-toc-updates/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/fogus&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View fogus's Twitter Profile&quot;&gt;fogus&lt;/a&gt;) &amp;#8212; Some chapter reorganization + new goodies.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=Oejeq6ONe88:MKAzHO4K_uc:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=Oejeq6ONe88:MKAzHO4K_uc:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=Oejeq6ONe88:MKAzHO4K_uc:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=Oejeq6ONe88:MKAzHO4K_uc:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=Oejeq6ONe88:MKAzHO4K_uc:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=Oejeq6ONe88:MKAzHO4K_uc:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=Oejeq6ONe88:MKAzHO4K_uc:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/Oejeq6ONe88&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Leiningen (unknown severity): Leiningen strangely broken</title>
		<link href="http://github.com/technomancy/leiningen/issues/#issue/25"/>
		<id>http://github.com/technomancy/leiningen/issues/#issue/25</id>
		<updated>2010-03-11T00:00:00+00:00</updated>
		<content type="html">Leiningen (unknown severity): Leiningen strangely broken</content>
		<author>
			<name>BugSpy</name>
			<uri>http://bugspy.net</uri>
		</author>
		<source>
			<title type="html">BugSpy.net - Reports By Tag: clojure</title>
			<link rel="self" href="http://bugspy.net/tag/clojure/?format=rss"/>
			<id>http://bugspy.net/tag/clojure/?format=rss</id>
			<updated>2010-03-16T05:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Joy of Clojure TOC Updates</title>
		<link href="http://blog.fogus.me/2010/03/10/joy-of-clojure-toc-updates/"/>
		<id>http://blog.fogus.me/?p=2103</id>
		<updated>2010-03-10T20:51:22+00:00</updated>
		<content type="html">Chouser and I are working hard to get the material for the upcoming (next week, covering chapters 1-7) technical review in order.  However, we hope to have an update to the MEAP available sooner rather than later.  However, the http://joyofclojure.com site has been updated with the forthcoming table of contents.  The changes [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://blog.fogus.me/2010/01/22/de-chunkifying-sequences-in-clojure/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: De-chunkifying Sequences in Clojure&quot;&gt;De-chunkifying Sequences in Clojure&lt;/a&gt; &lt;small&gt;At the first CAP CLUG meetup I gave a presentation...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.fogus.me/2010/01/11/writing-the-next-clojure-book/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Writing the Next Clojure Book&quot;&gt;Writing the Next Clojure Book&lt;/a&gt; &lt;small&gt;Now available for purchase! Some of you may already know...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.fogus.me/2009/09/04/understanding-the-clojure-macro/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Understanding the Clojure -&gt; macro&quot;&gt; macro&quot;&gt; macro&quot;&gt; macro'&gt;Understanding the Clojure -&gt; macro&lt;/a&gt; &lt;small&gt;On page 109 of Paul Graham&amp;#8217;s ANSI Common Lisp he...&lt;/small&gt;&lt;/li&gt;
&lt;/ol&gt;

Related posts brought to you by &lt;a href=&quot;http://mitcho.com/code/yarpp/&quot;&gt;Yet Another Related Posts Plugin&lt;/a&gt;.</content>
		<author>
			<name>fogus</name>
			<uri>http://blog.fogus.me</uri>
		</author>
		<source>
			<title type="html">Send More Paramedics » clojure</title>
			<subtitle type="html">λ λ λ</subtitle>
			<link rel="self" href="http://blog.fogus.me/tag/clojure/feed/atom/"/>
			<id>http://blog.fogus.me/feed/atom/</id>
			<updated>2010-03-10T21:00:14+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html"></title>
		<link href="http://timothypratley.blogspot.com/2010/02/i-was-reminiscing-about-my-youth-and.html"/>
		<id>tag:blogger.com,1999:blog-32811356.post-2420360229327929058</id>
		<updated>2010-03-10T14:09:59+00:00</updated>
		<content type="html">&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_XAJPzyj-Ugc/S3np6uAWnRI/AAAAAAAAAso/gR7euB_8q8k/s1600-h/Pizza_gameplay.jpg&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/_XAJPzyj-Ugc/S3np6uAWnRI/AAAAAAAAAso/gR7euB_8q8k/s320/Pizza_gameplay.jpg&quot; /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot;&gt;I was reminiscing about my youth and loaded up an old game I wrote in high school... Pizza Delivery! Totally a blast to play you drive around to flashing locations on the minimap to deliver pizzas and have to refuel occasionally. Going off the road makes your car blow up :)&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://www.kudosweave.com/downloads/pizza.zip&quot;&gt;download pizza.zip&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/32811356-2420360229327929058?l=timothypratley.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>timothypratley</name>
			<email>noreply@blogger.com</email>
			<uri>http://timothypratley.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Linux Programming</title>
			<link rel="self" href="http://timothypratley.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-32811356</id>
			<updated>2010-03-10T22:30:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Today in the Intertweets (March 9th Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/UdnY5VUsOis/"/>
		<id>http://disclojure.org/?p=737</id>
		<updated>2010-03-10T07:16:28+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;RubyLeaning.com: Clojure 101 &amp;#8212; A New Course (&lt;a href=&quot;http://rubylearning.com/blog/2010/03/09/clojure-101-a-new-course/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/devfunnel&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View devfunnel's Twitter Profile&quot;&gt;devfunnel&lt;/a&gt;) &amp;#8212; Do you want to learn Clojure in 4 weeks, and for free? Just for this time, this online course is free for all. Slated to start somewhere in April, and taught by @&lt;a href=&quot;http://twitter.com/citizen428&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View citizen428's Twitter Profile&quot;&gt;citizen428&lt;/a&gt; and @&lt;a href=&quot;http://twitter.com/ghoseb&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ghoseb's Twitter Profile&quot;&gt;ghoseb&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;Already 100 signups for the #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; course at RubyLearning on the first day, seems like we have hit a nerve there. (via @&lt;a href=&quot;http://twitter.com/citizen428&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View citizen428's Twitter Profile&quot;&gt;citizen428&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Stuart Halloway talks to RubyLearning&amp;#8217;s #&lt;a href=&quot;http://search.twitter.com/search?q=%23Clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Clojure&amp;quot;&quot;&gt;Clojure&lt;/a&gt; Course Participants (&lt;a href=&quot;http://rubylearning.com/blog/2010/03/10/stuart-halloway-talks-to-rubylearnings-clojure-course-participants/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/IndianGuru&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View IndianGuru's Twitter Profile&quot;&gt;IndianGuru&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Visualizing Maps Using #&lt;a href=&quot;http://search.twitter.com/search?q=%23Incanter&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Incanter&amp;quot;&quot;&gt;Incanter&lt;/a&gt; by @&lt;a href=&quot;http://twitter.com/nakkaya&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View nakkaya's Twitter Profile&quot;&gt;nakkaya&lt;/a&gt; (&lt;a href=&quot;http://nakkaya.com/2010/03/09/visualizing-maps-using-incanter/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/liebke&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View liebke's Twitter Profile&quot;&gt;liebke&lt;/a&gt;) &amp;#8212; Using the Incanter-processing library, the author plots geographical data on a map of Turkey.&lt;/li&gt;
&lt;li&gt;Tomorrow at 1930 we start monthly #&lt;a href=&quot;http://search.twitter.com/search?q=%23Amsterdam&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Amsterdam&amp;quot;&quot;&gt;Amsterdam&lt;/a&gt; #&lt;a href=&quot;http://search.twitter.com/search?q=%23Clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Clojure&amp;quot;&quot;&gt;Clojure&lt;/a&gt; meetup. Proudly hosted by @&lt;a href=&quot;http://twitter.com/sourcesense&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View sourcesense's Twitter Profile&quot;&gt;sourcesense&lt;/a&gt; (via @&lt;a href=&quot;http://twitter.com/neotyk&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View neotyk's Twitter Profile&quot;&gt;neotyk&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Design By Contract with Clojure (&lt;a href=&quot;http://www.objectcommando.com/blog/?p=190&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/emcconne_reads&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View emcconne_reads's Twitter Profile&quot;&gt;emcconne_reads&lt;/a&gt;) &amp;#8212; Using the :pre and :post facilities of Clojure 1.1&lt;/li&gt;
&lt;li&gt;Context searching with clojure-opennlp (&lt;a href=&quot;http://writequit.org/blog/?p=351&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/thnetos&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View thnetos's Twitter Profile&quot;&gt;thnetos&lt;/a&gt;) &amp;#8212; A follow-up article to &lt;a href=&quot;http://writequit.org/blog/?p=365&quot;&gt;this one&lt;/a&gt; in which the author introduces&lt;a href=&quot;http://github.com/dakrone/clojure-opennlp&quot;&gt; clojure-opennlp&lt;/a&gt;. In this new article, the author show how to perform more meaningful text searches by finding relevant words in the context of the searched text.&lt;/li&gt;
&lt;li&gt;ClojureでMagicPacket送信スクリプト作ってみました (&lt;a href=&quot;http://d.hatena.ne.jp/otabat/20100309/1268165776&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/___otabat___&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ___otabat___'s Twitter Profile&quot;&gt;___otabat___&lt;/a&gt;) &amp;#8212; Roughly translates to: &amp;#8220;tried to write a script to send a magic packet in Clojure&amp;#8221;. A &lt;a href=&quot;http://en.wikipedia.org/wiki/Wake-on-LAN#Magic_packet&quot;&gt;magic packet&lt;/a&gt; sent to a computer will wake it up if it is asleep and the network card supports &amp;#8220;Wake on LAN&amp;#8221;.&lt;/li&gt;
&lt;li&gt;#clojure memoize and the Rule of Three (&lt;a href=&quot;http://kotka.de/blog/2010/03/The_Rule_of_Three.html&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/kotarak&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View kotarak's Twitter Profile&quot;&gt;kotarak&lt;/a&gt;) &amp;#8212; About how to implement a version of memoize that supports different caching strategies, other than keeping all the values around forever (the behavior of cloure.core&amp;#8217;s memoize impl). It is also a good article about structuring your code so it can be easily reused.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=UdnY5VUsOis:sQZsXkjuAzQ:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=UdnY5VUsOis:sQZsXkjuAzQ:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=UdnY5VUsOis:sQZsXkjuAzQ:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=UdnY5VUsOis:sQZsXkjuAzQ:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=UdnY5VUsOis:sQZsXkjuAzQ:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=UdnY5VUsOis:sQZsXkjuAzQ:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=UdnY5VUsOis:sQZsXkjuAzQ:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/UdnY5VUsOis&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The Rule of Three</title>
		<link href="http://kotka.de/blog/2010/03/The_Rule_of_Three.html"/>
		<id>http://kotka.de/blog/2010/03/The_Rule_of_Three.html</id>
		<updated>2010-03-09T22:12:00+00:00</updated>
		<content type="html">&lt;p&gt;As Joshua Bloch says in his talk „&lt;a href=&quot;http://www.youtube.com/watch?v=aAb7hSCtvGw&quot;&gt;API Design and why it matters&lt;/a&gt;“:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Write multiple plug-ins before release!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you write one, it probably won't support another.&lt;/li&gt;
&lt;li&gt;If you write two, it will support more with difficulty.&lt;/li&gt;
&lt;li&gt;If you write three, it will work fine.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;In a &lt;a href=&quot;http://groups.google.com/group/clojure/msg/fc878750ecaa7faf&quot;&gt;recent post&lt;/a&gt; of mine on the Clojure group I encountered
exactly this rule. So let's explore it using the example of
&lt;code&gt;clojure.core/memoize&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://kotka.de/blog/2010/03/The_Rule_of_Three.html&quot; class=&quot;seemore&quot;&gt;See more ...&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Meikel Brandmeyer</name>
			<uri>http://kotka.de/blog/</uri>
		</author>
		<source>
			<title type="html">Kotka</title>
			<subtitle type="html">About Clojure… What else?</subtitle>
			<link rel="self" href="http://kotka.de/blog/index.rss"/>
			<id>http://kotka.de/blog/index.rss</id>
			<updated>2010-03-15T23:00:12+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Visualizing Maps Using Incanter</title>
		<link href="http://nakkaya.com/2010/03/09/visualizing-maps-using-incanter/"/>
		<id>http://nakkaya.com/2010/03/09/visualizing-maps-using-incanter/</id>
		<updated>2010-03-09T12:30:13+00:00</updated>
		<content type="html">&lt;p&gt;When I first saw
&lt;a href=&quot;http://en.wikipedia.org/wiki/Mathematica&quot;&gt;Mathematica&lt;/a&gt;'s
&lt;a href=&quot;http://documents.wolfram.com/mathematica/Add-onsLinks/StandardPackages/Miscellaneous/WorldPlot.html&quot;&gt;WorldPlot&lt;/a&gt;
function I was impressed, its a nice way to visualize various forms
of geographical data, for some time I thought this should be a very labor
intensive task, who would go around labeling each pixel. Couple of days
ago I somehow ended up reading the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Processing_(programming_language&quot;&gt;Processing&lt;/a&gt;
article on Wikipedia, it contains an example which shows a map of the
results of the 2008 USA presidential election, turns out using &lt;a href=&quot;http://en.wikipedia.org/wiki/Scalable_Vector_Graphics&quot;&gt;Scalable
Vector Graphics&lt;/a&gt;
implementing WorldPlot functionality is extremely easy.&lt;/p&gt;

&lt;p&gt;We will be plotting how population moved between different regions in
&lt;a href=&quot;http://en.wikipedia.org/wiki/Turkey&quot;&gt;Turkey&lt;/a&gt; (in to and out of a
region). I am using data provided by &lt;a href=&quot;http://en.wikipedia.org/wiki/Turkish_Statistical_Institute&quot;&gt;The Turkish Statistical
Institute&lt;/a&gt;,
you can grab the map I used from Wikipedia
&lt;a href=&quot;http://upload.wikimedia.org/wikipedia/commons/9/9b/MapTurkishProvincesNumbers.svg&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; ;; Data for 2009
 (def pop-taken [{:id 1 :name &quot;Marmara&quot; :population 582771}
                 {:id 2 :name &quot;Iç Anadolu&quot; :population 297919}
                 {:id 3 :name &quot;Ege&quot; :population 164896}
                 {:id 4 :name &quot;Akdeniz&quot; :population 188441}
                 {:id 5 :name &quot;Karadeniz&quot; :population 256654}
                 {:id 6 :name &quot;Güneydoğu Anadolu&quot; :population 171910}
                 {:id 7 :name &quot;Doğu Anadolu&quot; :population 214082}])

 (def pop-given [{:id 1 :name &quot;Marmara&quot; :population 677395}
                 {:id 2 :name &quot;Iç Anadolu&quot; :population 310293}
                 {:id 3 :name &quot;Ege&quot; :population 181459}
                 {:id 4 :name &quot;Akdeniz&quot; :population 193231}
                 {:id 5 :name &quot;Karadeniz&quot; :population 247397}
                 {:id 6 :name &quot;Güneydoğu Anadolu&quot; :population 118611}
                 {:id 7 :name &quot;Doğu Anadolu&quot; :population 148287}])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Turkey is divided in to seven geographical regions, pop-taken represents
how many people moved in to that particular region and pop-given
represents how many people moved out of that region during 2009.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; (defn region-color [val min max]
   (lerp-color (color 0xffd120) (color 0x920903) (norm val min max)))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In order to paint the map like a heat map, we need to assign colors
using the amount of people moved in or out of a region, given a min, max
and a value in between norm will normalize a value to exist between 0
and 1, lerp-color on the other hand will calculate a color between the
given range using the normalized value. So our map will go from yellow
to dark red depending on the people moved.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; (defn map-region-color [regions]
   (let [min (apply min (map #(:population %) regions))
         max (apply max (map #(:population %) regions))]
     (map #(vector (:id %) (region-color (:population %) min max)) regions)))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now all we need to do is calculate min and max values in the data set,
iterate over the data set and return a sequence of [id color] pairs.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; (defn sktch [regions]
   (sketch
    (setup [])
    (draw 
     []
     (let [tr-map (load-shape this &quot;MapTurkishProvincesNumbers.svg&quot;)]
       (.shape this tr-map 0 0)
       (doseq [region (map-region-color regions)]
         (let [[id color] region
               child (.getChild tr-map (str id))]
           (.disableStyle child)
           (.fill this color)
           (.noStroke this)
           (.shape this child 0 0)
           no-loop))))))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Using incanter-processing library, we can load and access parts of the
SVG map. Processing sketches are made up of the functions setup and
draw, in setup as its name suggests you setup your stuff frame rate,
stroke properties etc. Draw will be called once or multiple times
depending on your frame rate, we load the map as a shape then paint it
on the canvas, then we iterate over the data set, using getChild method
of the &lt;a href=&quot;http://processing.org/reference/PShape.html&quot;&gt;PShape&lt;/a&gt; class we
can access parts of the image, the map we are using has 7 children named
1 through 7 corresponding to the geographical regions of the country, we
get the child then paint it using the color we calculated on to the
canvas. One thing to note, sketch macro just returns a PApplet so for
any function not implemented in incanter, you can access them just like
any other Java function. Now lets see the results,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(view (sktch pop-given) :size [1052 744])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&quot;http://nakkaya.com/images/post/incanter-pop-given.png&quot; alt=&quot;incanter processing map&quot; /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(view (sktch pop-taken) :size [1052 744])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&quot;http://nakkaya.com/images/post/incanter-pop-taken.png&quot; alt=&quot;incanter processing map&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://nakkaya.com/code/clojure/worldplot.clj&quot;&gt;worldplot.clj&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://upload.wikimedia.org/wikipedia/commons/9/9b/MapTurkishProvincesNumbers.svg&quot;&gt;MapTurkishProvincesNumbers.svg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Nurullah Akkaya</name>
			<uri>http://nakkaya.com</uri>
		</author>
		<source>
			<title type="html">Nurullah Akkaya: an explorer's log</title>
			<subtitle type="html">Random bits and pieces on stuff that I find interesting.</subtitle>
			<link rel="self" href="http://nakkaya.com/rss-feed"/>
			<id>http://nakkaya.com/rss-feed</id>
			<updated>2010-03-16T05:00:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Today in the Intertweets (March 8th Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/I_iVj4mDXZY/"/>
		<id>http://disclojure.org/?p=731</id>
		<updated>2010-03-09T07:36:30+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;Handy #&lt;a href=&quot;http://search.twitter.com/search?q=%23Clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Clojure&amp;quot;&quot;&gt;Clojure&lt;/a&gt; snippet for apply-ing Java methods (&lt;a href=&quot;http://paste.lisp.org/display/67182&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/citizen428&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View citizen428's Twitter Profile&quot;&gt;citizen428&lt;/a&gt;) &amp;#8212; A rather old snippet from Rich Hickey himself that makes it easy to apply Java methods to objects.&lt;/li&gt;
&lt;li&gt;Whew, new blog post about my library: Natural Language Processing in #&lt;a href=&quot;http://search.twitter.com/search?q=%23Clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Clojure&amp;quot;&quot;&gt;Clojure&lt;/a&gt; with clojure-opennlp (&lt;a href=&quot;http://writequit.org/blog/?p=365&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/thnetos&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View thnetos's Twitter Profile&quot;&gt;thnetos&lt;/a&gt;) &amp;#8212; Grab a text, break it into sentences, parse the words and &lt;a href=&quot;http://bulba.sdsu.edu/jeanette/thesis/PennTags.html&quot;&gt;tag&lt;/a&gt; them. It&amp;#8217;s that easy! Work in progress&amp;#8230;&lt;/li&gt;
&lt;li&gt;@&lt;a href=&quot;http://twitter.com/hugoduncan&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View hugoduncan's Twitter Profile&quot;&gt;hugoduncan&lt;/a&gt; &amp;#8217;s criterium is a pretty sweet start toward a fantastic benchmarking suite for clojure (&lt;a href=&quot;http://github.com/hugoduncan/criterium&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/bradfordcross&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View bradfordcross's Twitter Profile&quot;&gt;bradfordcross&lt;/a&gt;) &amp;#8212; &amp;#8220;Criterium measures the computation time of an expression. It is designed to address some of the pitfalls of benchmarking, and benchmarking on the JVM in particular.&amp;#8221;&lt;/li&gt;
&lt;li&gt;Wow! Latest Linux Journal has #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; on cover &amp;amp; Rich Hickey interview! (&lt;a href=&quot;http://www.linuxjournal.com/on-newsstands&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/sfraser&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View sfraser's Twitter Profile&quot;&gt;sfraser&lt;/a&gt;)
&lt;p&gt;&lt;div id=&quot;attachment_732&quot; class=&quot;wp-caption alignnone&quot;&gt;&lt;img class=&quot;size-full wp-image-732 &quot; title=&quot;Cover of issue 192 of Linux Journal &quot; src=&quot;http://disclojure.org/wp-content/uploads/2010/03/cover192.jpg&quot; alt=&quot;Clojure featured in Issue 192 of Linux Journal&quot; width=&quot;200&quot; height=&quot;268&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Clojure featured in Issue 192 of Linux Journal&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Analyzing Word Frequencies with #&lt;a href=&quot;http://search.twitter.com/search?q=%23Clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Clojure&amp;quot;&quot;&gt;Clojure&lt;/a&gt;, #&lt;a href=&quot;http://search.twitter.com/search?q=%23Enlive&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Enlive&amp;quot;&quot;&gt;Enlive&lt;/a&gt; and #&lt;a href=&quot;http://search.twitter.com/search?q=%23Incanter&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Incanter&amp;quot;&quot;&gt;Incanter&lt;/a&gt; by Ethan Fast (&lt;a href=&quot;http://blog.ethanjfast.com/2010/03/analyzing-word-frequencies-with-clojure-enlive-and-incanter/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/liebke&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View liebke's Twitter Profile&quot;&gt;liebke&lt;/a&gt;) &amp;#8212; Uses enlive to scrape a web page, count the words and show their frequencies graphically with Incanter.&lt;/li&gt;
&lt;li&gt;Discussing IoC in #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; for our #&lt;a href=&quot;http://search.twitter.com/search?q=%23Java&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Java&amp;quot;&quot;&gt;Java&lt;/a&gt; friends (&lt;a href=&quot;http://vimeo.com/9969396&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/fulldisclojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View fulldisclojure's Twitter Profile&quot;&gt;fulldisclojure&lt;/a&gt;) &amp;#8212; This episode of Full Disclojure&amp;#8217;s video series is very focused on Java developers who are interested in Clojure. It shows how easily one can do in Clojure what is known as Inversion of Control in the Java&amp;#8217;s world(and other imperative languages too).&lt;/li&gt;
&lt;li&gt;another html library emerges for #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; benchmarks; that makes 3 (&lt;a href=&quot;http://gist.github.com/326055&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/wmacgyver&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View wmacgyver's Twitter Profile&quot;&gt;wmacgyver&lt;/a&gt;) &amp;#8212; &lt;a href=&quot;http://github.com/weavejester/hiccup&quot;&gt;Hiccup&lt;/a&gt; is the HTML generation library that James Reeves is extracting from &lt;a href=&quot;http://github.com/weavejester/compojure&quot;&gt;Compojure&lt;/a&gt;. In this code snippet it shows that this library is very fast, close in speed to simple string concatenation.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=I_iVj4mDXZY:rrWDYB2Q60o:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=I_iVj4mDXZY:rrWDYB2Q60o:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=I_iVj4mDXZY:rrWDYB2Q60o:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=I_iVj4mDXZY:rrWDYB2Q60o:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=I_iVj4mDXZY:rrWDYB2Q60o:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=I_iVj4mDXZY:rrWDYB2Q60o:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=I_iVj4mDXZY:rrWDYB2Q60o:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/I_iVj4mDXZY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Episode 14 - Inversion of Control</title>
		<link href="http://vimeo.com/channels/fulldisclojure#9969396"/>
		<id>tag:vimeo,2010-03-08:clip9969396</id>
		<updated>2010-03-09T03:48:43+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://vimeo.com/9969396&quot; title=&quot;Episode 14 - Inversion of Control&quot;&gt;&lt;img src=&quot;http://ts.vimeo.com.s3.amazonaws.com/508/471/50847131_200.jpg&quot; alt=&quot;Episode 14 - Inversion of Control&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In this episode I review how to relate Java's inversion of control pattern to first class functions.
&lt;/p&gt;&lt;p&gt;Cast: &lt;a href=&quot;http://vimeo.com/seandevlin&quot;&gt;Sean Devlin&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Sean Devlin</name>
			<uri>http://vimeo.com/channels/fulldisclojure</uri>
		</author>
		<source>
			<title type="html">Vimeo / Full Disclojure</title>
			<subtitle type="html">NOW UPDATED TUESDAYS!

This is a series of videos designed to help teach the Clojure language.

Questions/suggestions for episodes?  Email me!

fulldisclojure@gmail.com

Full Disclojure is available under Creative Commons  by-nc-sa</subtitle>
			<link rel="self" href="http://vimeo.com/channels/fulldisclojure/videos/rss"/>
			<id>http://vimeo.com/channels/fulldisclojure/videos/rss</id>
			<updated>2010-03-16T05:00:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Leiningen (unknown severity): AOT compilations in `lein jar' ignored by jar users</title>
		<link href="http://github.com/technomancy/leiningen/issues/#issue/24"/>
		<id>http://github.com/technomancy/leiningen/issues/#issue/24</id>
		<updated>2010-03-09T00:00:00+00:00</updated>
		<content type="html">Leiningen (unknown severity): AOT compilations in `lein jar' ignored by jar users</content>
		<author>
			<name>BugSpy</name>
			<uri>http://bugspy.net</uri>
		</author>
		<source>
			<title type="html">BugSpy.net - Reports By Tag: clojure</title>
			<link rel="self" href="http://bugspy.net/tag/clojure/?format=rss"/>
			<id>http://bugspy.net/tag/clojure/?format=rss</id>
			<updated>2010-03-16T05:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">This weekend in the Intertweets (March 7th Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/sGgY91iUrb4/"/>
		<id>http://disclojure.org/?p=727</id>
		<updated>2010-03-08T07:48:52+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;My #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; talk at #&lt;a href=&quot;http://search.twitter.com/search?q=%23cojug&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;cojug&amp;quot;&quot;&gt;cojug&lt;/a&gt; on 3/9 has been posted (&lt;a href=&quot;http://www.cojug.org/index.php?option=com_eventlist&amp;amp;Itemid=27&amp;amp;func=details&amp;amp;did=74&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/wmacgyver&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View wmacgyver's Twitter Profile&quot;&gt;wmacgyver&lt;/a&gt;) &amp;#8212; If you live near Central Ohio, don&amp;#8217;t miss this Clojure talk at the Central Ohio Java Users Group by Mac Liaw. That&amp;#8217;s on 3/9/10.&lt;/li&gt;
&lt;li&gt;Clojure Pre- and post-conditions: a quest for a nicer syntax (&lt;a href=&quot;http://onclojure.com/2010/03/05/pre-and-post-conditions-a-quest-for-a-nicer-syntax/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/tm_interesting&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View tm_interesting's Twitter Profile&quot;&gt;tm_interesting&lt;/a&gt;) &amp;#8212; An alternative syntax for pre- and post-conditions that is much easier to the eye and cover some of the most common use cases.&lt;/li&gt;
&lt;li&gt;Interview with Rich Hickey, creator of Clojure (&lt;a href=&quot;http://www.simple-talk.com/opinion/geek-of-the-week/rich-hickey-geek-of-the-week/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/tm_interesting&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View tm_interesting's Twitter Profile&quot;&gt;tm_interesting&lt;/a&gt;) &amp;#8212; Good tidbits about the future parallel features.&lt;/li&gt;
&lt;li&gt;New ssh tool for #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; (&lt;a href=&quot;http://github.com/hugoduncan/clj-ssh&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/jclouds&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View jclouds's Twitter Profile&quot;&gt;jclouds&lt;/a&gt;) &amp;#8212; It&amp;#8217;s a wrapper for jsch.&lt;/li&gt;
&lt;li&gt;gen-class little brother: proxy (&lt;a href=&quot;http://kotka.de/blog/2010/03/proxy_gen-class_little_brother.html&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/kotarak&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View kotarak's Twitter Profile&quot;&gt;kotarak&lt;/a&gt;) &amp;#8212; Proxies in Clojure allows you to create new java classes on the fly in order to interoperate with the Java environment, but with some limitations. This article explores the many uses and features of &amp;#8216;proxy&amp;#8217;.&lt;/li&gt;
&lt;li&gt;A library to make Jython interop in Clojure more elegant. I created a Google Code repository for it. (&lt;a href=&quot;http://code.google.com/p/clojure-python/source/browse/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/rplevy&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View rplevy's Twitter Profile&quot;&gt;rplevy&lt;/a&gt;) &amp;#8212; Google Code? What&amp;#8217;s wrong with GitHub? ;)&lt;/li&gt;
&lt;li&gt;How to make a quick performance ping to 5 storage clouds in #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; (&lt;a href=&quot;http://code.google.com/p/jclouds/wiki/BlobStore#Clojure&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/jclouds&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View jclouds's Twitter Profile&quot;&gt;jclouds&lt;/a&gt;) &amp;#8212; A nice and simple example of how to use JClouds with Clojure.&lt;/li&gt;
&lt;li&gt;What I really want it to use rspec to test my clojure libraries (&lt;a href=&quot;http://gist.github.com/324438&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/kyleburton&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View kyleburton's Twitter Profile&quot;&gt;kyleburton&lt;/a&gt;) &amp;#8212; What is that CljHelper that he is using?&amp;#8230;. oh, wait!
&lt;ul&gt;
&lt;li&gt;jrclj (1.0.0): Helper library for working with Clojure from JRuby. (&lt;a href=&quot;http://rubygems.org/gems/jrclj&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/rubygems&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View rubygems's Twitter Profile&quot;&gt;rubygems&lt;/a&gt;) &amp;#8212; &amp;#8230; so it is a JRuby gem&amp;#8230;&lt;/li&gt;
&lt;li&gt;Call Clojure from JRuby easier than ever!  by @&lt;a href=&quot;http://twitter.com/kyleburton&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View kyleburton's Twitter Profile&quot;&gt;kyleburton&lt;/a&gt; (&lt;a href=&quot;http://github.com/kyleburton/jrclj&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/jonnytran&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View jonnytran's Twitter Profile&quot;&gt;jonnytran&lt;/a&gt;) &amp;#8212; &amp;#8230; and here is the source code. Case closed!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=sGgY91iUrb4:G-p2LnteY4M:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=sGgY91iUrb4:G-p2LnteY4M:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=sGgY91iUrb4:G-p2LnteY4M:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=sGgY91iUrb4:G-p2LnteY4M:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=sGgY91iUrb4:G-p2LnteY4M:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=sGgY91iUrb4:G-p2LnteY4M:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=sGgY91iUrb4:G-p2LnteY4M:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/sGgY91iUrb4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">proxy – gen-class little brother</title>
		<link href="http://kotka.de/blog/2010/03/proxy_gen-class_little_brother.html"/>
		<id>http://kotka.de/blog/2010/03/proxy_gen-class_little_brother.html</id>
		<updated>2010-03-06T20:35:00+00:00</updated>
		<content type="html">&lt;p&gt;Clojure provides two basic ways to interface with the host platform.
The more comprehending is &lt;code&gt;gen-class&lt;/code&gt; which I touched in &lt;a href=&quot;http://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html&quot;&gt;a previous
post&lt;/a&gt;. It's little brother is &lt;code&gt;proxy&lt;/code&gt;. Although less powerful it
is more dynamic than &lt;code&gt;gen-class&lt;/code&gt;. Let's see how it works…&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://kotka.de/blog/2010/03/proxy_gen-class_little_brother.html&quot; class=&quot;seemore&quot;&gt;See more ...&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Meikel Brandmeyer</name>
			<uri>http://kotka.de/blog/</uri>
		</author>
		<source>
			<title type="html">Kotka</title>
			<subtitle type="html">About Clojure… What else?</subtitle>
			<link rel="self" href="http://kotka.de/blog/index.rss"/>
			<id>http://kotka.de/blog/index.rss</id>
			<updated>2010-03-15T23:00:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Pre- and post-conditions: a quest for a nicer syntax</title>
		<link href="http://onclojure.com/2010/03/05/pre-and-post-conditions-a-quest-for-a-nicer-syntax/"/>
		<id>http://onclojure.com/?p=104</id>
		<updated>2010-03-05T18:15:09+00:00</updated>
		<content type="html">&lt;p&gt;When pre- and post-conditions appeared in Clojure (since version 1.1 they are &amp;#8220;official&amp;#8221;), I though that was a pretty neat feature and that I ought to use it. I added conditions to a couple of functions and was satisfied. But rather soon I noticed that I used conditions very sparingly, only where I expected wrong data to be fed into a function. Considering that bugs also happen where we don&amp;#8217;t expect them, and that conditions are great documentation as well as error-checking code, I &lt;em&gt;should&lt;/em&gt; use them more. So why don&amp;#8217;t I?&lt;/p&gt;
&lt;p&gt;Something I didn&amp;#8217;t like about pre- and post-conditions is the rather heavy syntax. For short functions, the conditions take up more space than the code itself. Moreover, parsing them visually takes some effort as well, as much as reading the code itself. Wouldn&amp;#8217;t it be nice if preconditions could be written somehow right in the argument list, and postconditions at the level of the function definition?&lt;/p&gt;
&lt;p&gt;Well, this is Lisp, so if you don&amp;#8217;t like some syntax, you just roll your own. I didn&amp;#8217;t come up with a better &lt;em&gt;general&lt;/em&gt; syntax though, but I think that what I describe below is much nicer and suitable for 90% of pre- and post-conditions used in practice. The main limitation is that each condition can depend on only one argument, or on the return value. For the other cases, there is still Clojure&amp;#8217;s general syntax, which is perfectly compatible with my extension. For those who want to play with this themselves, &lt;a href=&quot;http://gist.github.com/322909&quot;&gt;here is the code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As a first example, here&amp;#8217;s a pretty stupid algorithm to calculate integer powers of a number:&lt;/p&gt;
&lt;pre&gt;
(defn (number?) power
  [(number?) x
   (integer?) (pos?) n]
  (apply * (repeat n x)))
&lt;/pre&gt;
&lt;p&gt;The preconditions check that the first argument is a number and that the second one is a positive integer. The postcondition checks that the result is a a number &amp;#8211; the utility of this test is a bit dubious, but it serves as an illustration. Note that you can have multiple conditions per argument, and also multiple postconditions. The full form representing the condition is constructed by inserting the argument to be tested in the second position of the supplied list. The above function definition actually expands to&lt;/p&gt;
&lt;pre&gt;
(defn power
  ([x n]
   {:pre [(number? x) (integer? n) (pos? n)], :post [(number? %)]}
   (apply * (repeat n x))))
&lt;/pre&gt;
&lt;p&gt;One precondition in the above example is actually too strict. The argument &lt;code&gt;n&lt;/code&gt; needn&amp;#8217;t be positive, just non-negative. There is not simple test function for &amp;#8220;non-negative&amp;#8221; in Clojure, but with the above rule we can write this as:&lt;/p&gt;
&lt;pre&gt;
(defn (number?) power
  [(number?) x
   (integer?) (&amp;gt;= 0) n]
  (apply * (repeat n x)))
&lt;/pre&gt;
&lt;p&gt;Another possibility is to use the &lt;code&gt;-&amp;gt;&lt;/code&gt; macro:&lt;/p&gt;
&lt;pre&gt;
(defn (number?) power
  [(number?) x
   (integer?) (-&amp;gt; neg? not) n]
  (apply * (repeat n x)))
&lt;/pre&gt;
&lt;p&gt;Preconditions can be combined with destructuring. Here is a variant of Clojure&amp;#8217;s function &lt;code&gt;second&lt;/code&gt; that actually verifies that its argument has at least two element:&lt;/p&gt;
&lt;pre&gt;
(defn my-second
  [[f &amp;amp; (seq) r]]
  (first r))
&lt;/pre&gt;
&lt;p&gt;There is however one limitation: I couldn&amp;#8217;t find a way to use my new syntax with map destructuring. So for now at least it works only with vector destructuring.&lt;/p&gt;
&lt;p&gt;Comments on this syntax are welcome. Do you like it? Can you come up with something better? Or do you think that Clojure&amp;#8217;s standard syntax is just fine?&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/onclojure.wordpress.com/104/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/onclojure.wordpress.com/104/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/onclojure.wordpress.com/104/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/onclojure.wordpress.com/104/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/onclojure.wordpress.com/104/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/onclojure.wordpress.com/104/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/onclojure.wordpress.com/104/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/onclojure.wordpress.com/104/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/onclojure.wordpress.com/104/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/onclojure.wordpress.com/104/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=onclojure.com&amp;amp;blog=5872423&amp;amp;post=104&amp;amp;subd=onclojure&amp;amp;ref=&amp;amp;feed=1&quot; /&gt;</content>
		<author>
			<name>khinsen</name>
			<uri>http://onclojure.com</uri>
		</author>
		<source>
			<title type="html">On Clojure</title>
			<subtitle type="html">A blog about everything Clojure</subtitle>
			<link rel="self" href="http://onclojure.wordpress.com/feed/atom/"/>
			<id>http://onclojure.com/feed/atom/</id>
			<updated>2010-03-05T18:30:29+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">WebDAV + SSL on Debian</title>
		<link href="http://nakkaya.com/2010/03/05/webdav-ssl-on-debian/"/>
		<id>http://nakkaya.com/2010/03/05/webdav-ssl-on-debian/</id>
		<updated>2010-03-05T10:30:09+00:00</updated>
		<content type="html">&lt;p&gt;I was looking for a way to easily share documents between machines,
since WebDAV shares can be accessed by Windows, Linux or Mac machines out
of the box, I choose WebDAV over SSL. I don't use SSL for anything so
WebDAV is served from DocumentRoot. I've been using it for a few days,
so far it beats carrying USB sticks around.&lt;/p&gt;

&lt;p&gt;Enable relevant Apache modules,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a2enmod ssl
a2enmod dav_fs
a2enmod dav
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Create SSL certificate,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; mkdir /etc/apache2/ssl
 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem \
     -keyout /etc/apache2/ssl/apache.pem
 chmod 600 /etc/apache2/ssl/apache.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Create your WebDAV directory and create a password file,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mkdir /path/to/webdav/
chown www-data /path/to/webdav/
htpasswd -c /path/to/passwd.dav user
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Edit and add the following snippet to the configuration for the host you
want to enable WebDAV,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; &amp;lt;VirtualHost *:443&amp;gt;
         ServerAdmin user@host.com
         DocumentRoot /path/to/webdav

         SSLEngine on
         SSLCertificateFile /etc/apache2/ssl/apache.pem

         &amp;lt;Directory /path/to/webdav/&amp;gt;
            DAV On
            AuthType Basic
            AuthName &quot;webdav&quot;
            AuthUserFile /path/to/passwd.dav
            Require valid-user
        &amp;lt;/Directory&amp;gt;

         ErrorLog  /path/to/webdav/error.log
         CustomLog /path/to/webdav/access.log combined
 &amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Reload Apache configuration,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/etc/init.d/apache2 reload
&lt;/code&gt;&lt;/pre&gt;</content>
		<author>
			<name>Nurullah Akkaya</name>
			<uri>http://nakkaya.com</uri>
		</author>
		<source>
			<title type="html">Nurullah Akkaya: an explorer's log</title>
			<subtitle type="html">Random bits and pieces on stuff that I find interesting.</subtitle>
			<link rel="self" href="http://nakkaya.com/rss-feed"/>
			<id>http://nakkaya.com/rss-feed</id>
			<updated>2010-03-16T05:00:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Today in the Intertweets (March 4th Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/DtJprf49hxg/"/>
		<id>http://disclojure.org/?p=724</id>
		<updated>2010-03-05T08:02:25+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;Page layout can be performed at the decorator level with Enlive and Compojure (&lt;a href=&quot;http://gist.github.com/321661&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/cgrand&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View cgrand's Twitter Profile&quot;&gt;cgrand&lt;/a&gt;) &amp;#8212; This is now you can decorate Enlive templates in Compojure.&lt;/li&gt;
&lt;li&gt;Interesting talk on hardware for 1000+ core Java w/ Hardware Transactional Memory (&lt;a href=&quot;http://www.youtube.com/watch?v=5uljtqyBLxI&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/stuartsierra&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View stuartsierra's Twitter Profile&quot;&gt;stuartsierra&lt;/a&gt;) &amp;#8212; This is not a new video, but still very relevant. &lt;a href=&quot;http://blogs.azulsystems.com/cliff/&quot;&gt;Cliff Click&lt;/a&gt;, from &lt;a href=&quot;http://www.azulsystems.com/&quot;&gt;Azul Systems&lt;/a&gt; discusses the challenges that they face at building the kind of very large Java systems that they build. encounter. Pretty hardcore :). You can also check out &lt;a href=&quot;http://blogs.azulsystems.com/cliff/2008/05/clojure-stms-vs.html&quot;&gt;this infamous back-and-forth between Cliff Click and Rich Hickey&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;conjure 0.4, a rails like framework for #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; has just been released (&lt;a href=&quot;http://wiki.github.com/macourtney/Conjure/conjure-04-features&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/wmacgyver&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View wmacgyver's Twitter Profile&quot;&gt;wmacgyver&lt;/a&gt;) &amp;#8212; The list of features of this 0.4 version is impressive!
&lt;ul&gt;
&lt;li&gt;Hello World Tutorial &amp;#8211; Conjure &amp;#8211; GitHub (&lt;a href=&quot;http://wiki.github.com/macourtney/Conjure/hello-world-tutorial-2&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/ajlopez&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ajlopez's Twitter Profile&quot;&gt;ajlopez&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If you&amp;#8217;re in the Pittsburgh area on March 10th, then consider stopping by the Pittsburg Clojure Users Group. (&lt;a href=&quot;http://www.meetup.com/Clojure-PGH/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/fogus&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View fogus's Twitter Profile&quot;&gt;fogus&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Clojure wont win the battle but may win the war (&lt;a href=&quot;http://www.stumbleupon.com/su/1YmbwB/enfranchisedmind.com/blog/posts/what-killed-lisp-could-kill-haskell-as-well//r:t&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/kicauan&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View kicauan's Twitter Profile&quot;&gt;kicauan&lt;/a&gt;) &amp;#8212; This is in fact the infamous talk &amp;#8220;What killed Smalltalk could kill Ruby as well&amp;#8221;, but as the article says, this could apply to Lisp/Haskell. Interesting talk, you don&amp;#8217;t have to agree with it though.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=DtJprf49hxg:P-zjBA-focw:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=DtJprf49hxg:P-zjBA-focw:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=DtJprf49hxg:P-zjBA-focw:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=DtJprf49hxg:P-zjBA-focw:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=DtJprf49hxg:P-zjBA-focw:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=DtJprf49hxg:P-zjBA-focw:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=DtJprf49hxg:P-zjBA-focw:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/DtJprf49hxg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Today in the Intertweets (March 3rd Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/n335lxMW_S4/"/>
		<id>http://disclojure.org/?p=722</id>
		<updated>2010-03-04T07:24:30+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;#Incanter blog post roundup (&lt;a href=&quot;http://data-sorcery.org/2010/03/04/blog-roundup/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/liebke&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View liebke's Twitter Profile&quot;&gt;liebke&lt;/a&gt;) &amp;#8212; A list of recent Incanter-related blog posts&lt;/li&gt;
&lt;li&gt;Working with a java.util.HashMap in an idomatic Clojure fashion (&lt;a href=&quot;http://stackoverflow.com/questions/1665103/clojure-working-with-a-java-util-hashmap-in-an-idomatic-clojure-fashion&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/sldfj&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View sldfj's Twitter Profile&quot;&gt;sldfj&lt;/a&gt;) &amp;#8212; A stack-overflow thread about the best (most idiomatic) way to operate on a HashMap (java) in Clojure.&lt;/li&gt;
&lt;li&gt;I have a #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; benchmarking library, criterium (&lt;a href=&quot;http://github.com/hugoduncan/criterium&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/hugoduncan&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View hugoduncan's Twitter Profile&quot;&gt;hugoduncan&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Great Bay Area Hadoop meetup this month &amp;#8211; Mapreduce Online + Flightcaster/Clojure (&lt;a href=&quot;http://www.meetup.com/hadoop/calendar/12710846/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/rjurney&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View rjurney's Twitter Profile&quot;&gt;rjurney&lt;/a&gt;) &amp;#8212; That&amp;#8217;s on March 24th @ 6pm at Yahoo&amp;#8217;s Sunnyvale&amp;#8217;s offices.&lt;/li&gt;
&lt;li&gt;If you&amp;#8217;re in Seattle and interested in Clojure, the Seajure meeting is tomorrow night (&lt;a href=&quot;http://seajure.technomancy.us/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/technomancy&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View technomancy's Twitter Profile&quot;&gt;technomancy&lt;/a&gt;) &amp;#8212; That&amp;#8217;s at 7pm, in Seattle, WA&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=n335lxMW_S4:W8VckoAgSP8:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=n335lxMW_S4:W8VckoAgSP8:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=n335lxMW_S4:W8VckoAgSP8:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=n335lxMW_S4:W8VckoAgSP8:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=n335lxMW_S4:W8VckoAgSP8:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=n335lxMW_S4:W8VckoAgSP8:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=n335lxMW_S4:W8VckoAgSP8:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/n335lxMW_S4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">liebke</title>
		<link href="http://data-sorcery.org/2010/03/04/blog-roundup/"/>
		<id>http://data-sorcery.org/?p=1488</id>
		<updated>2010-03-04T02:06:15+00:00</updated>
		<content type="html">&lt;p&gt;There have been several cool blog posts over the last few weeks featuring &lt;a href=&quot;http://incanter.org&quot;&gt;Incanter&lt;/a&gt; that I would like to highlight here.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The most recent post by &lt;a href=&quot;http://nakkaya.com/&quot;&gt;Nurullah Akkaya&lt;/a&gt; demonstrates how to use &lt;a href=&quot;http://nakkaya.com/2010/03/02/analytics-with-incanter/&quot;&gt;Google analytics with Incanter&lt;/a&gt;. I&amp;#8217;m looking forward to using this code myself.
&lt;/li&gt;
&lt;li&gt;In another excellent demonstration of log analysis, &lt;a href=&quot;http://citizen428.net/&quot;&gt;Michael Kohl&lt;/a&gt; shows how to &lt;a href=&quot;http://citizen428.net/archives/418-Plot-EC2-instance-usage-with-Clojure-and-Incanter.html&quot;&gt;Plot Amazon EC2 instance usage with Clojure and Incanter&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jakemccrary.com/blog&quot;&gt;Jake McCrary&lt;/a&gt; demonstrates &lt;a href=&quot;http://jakemccrary.com/blog/2010/02/21/plotting-time-series-data-with-incanter/&quot;&gt;Plotting time series data with Incanter&lt;/a&gt;, using the new time-series chart that he contributed to the Incanter project.
&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;http://www.ccri.com/blog/&quot;&gt;Commonwealth Computer Research Blog&lt;/a&gt; has had a series of posts featuring Incanter,
&lt;ul&gt;
&lt;li&gt;The most recent of which is a fantastic demonstration of  &lt;a href=&quot;http://www.ccri.com/blog/2010/2/17/incanter-and-the-glm.html&quot;&gt;Incanter and generalized linear models&lt;/a&gt;,
&lt;/li&gt;
&lt;li&gt;The previous posts include &lt;a href=&quot;http://www.ccri.com/blog/2010/1/27/monte-carlo-pi-calc.html&quot;&gt;Monte Carlo Pi calculation&lt;/a&gt;,
&lt;/li&gt;
&lt;li&gt;and &lt;a href=&quot;http://www.ccri.com/blog/2010/1/23/functional-programming-and-root-finding.html&quot;&gt;Functional programming and root finding&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;And finally, Stuart Halloway (author of &lt;a href=&quot;http://pragprog.com/titles/shcloj/programming-clojure&quot;&gt;Programming Clojure&lt;/a&gt;) posted a screencast on &lt;a href=&quot;http://vimeo.com/9770382&quot;&gt;Circumspec, Inferior-Lisp, Clojure, and Slime&lt;/a&gt; where he briefly talks about Incanter. He also previews a cool code browser that he will be using in the upcoming &lt;a href=&quot;http://pragmaticstudio.com/clojure&quot;&gt;Pragmatic Clojure Studio&lt;/a&gt; that I&amp;#8217;m excited to be attending.
&lt;/li&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/incanter.wordpress.com/1488/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/incanter.wordpress.com/1488/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/incanter.wordpress.com/1488/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/incanter.wordpress.com/1488/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/incanter.wordpress.com/1488/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/incanter.wordpress.com/1488/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/incanter.wordpress.com/1488/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/incanter.wordpress.com/1488/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/incanter.wordpress.com/1488/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/incanter.wordpress.com/1488/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=data-sorcery.org&amp;amp;blog=7974443&amp;amp;post=1488&amp;amp;subd=incanter&amp;amp;ref=&amp;amp;feed=1&quot; /&gt;</content>
		<author>
			<name>David Edgar Liebke</name>
			<uri>http://data-sorcery.org</uri>
		</author>
		<source>
			<title type="html">Data Sorcery with Clojure</title>
			<link rel="self" href="http://incanter-blog.org/feed/"/>
			<id>http://incanter-blog.org/feed/</id>
			<updated>2010-03-04T02:30:20+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Move EC2 AMIs between regions</title>
		<link href="http://citizen428.net/archives/420-Move-EC2-AMIs-between-regions.html"/>
		<id>http://citizen428.net/archives/420-guid.html</id>
		<updated>2010-03-03T15:24:05+00:00</updated>
		<content type="html">&lt;p&gt;Today I spent some time figuring out how to move &lt;a href=&quot;http://citizen428.net/exit.php?url_id=4750&amp;amp;entry_id=420&quot; title=&quot;http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html?creating-an-ami-ebs.html&quot;&gt;EBS-backed AMIs&lt;/a&gt; between different EC2 regions. To save you the effort, here&amp;#8217;s a quick summary:&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt; create a volume from the snapshot backing the AMI&lt;/li&gt;&lt;br /&gt;
&lt;li&gt; attach this volume to a running instance and mount it&lt;/li&gt;&lt;br /&gt;
&lt;li&gt; create a new volume in the target region&lt;/li&gt;&lt;br /&gt;
&lt;li&gt; attach to a running instance, format and mount&lt;/li&gt;&lt;br /&gt;
&lt;li&gt; in the source region, connect to your instance&lt;/li&gt;&lt;br /&gt;
&lt;li&gt; rsync (over ssh, so no messing with security groups) the mounted volume to the target volume&lt;/li&gt;&lt;br /&gt;
&lt;li&gt; once the rsync is done, create a snapshot in the target region&lt;/li&gt;&lt;br /&gt;
&lt;li&gt; register this snapsho as new &lt;span class=&quot;caps&quot;&gt;AMI&lt;/span&gt; with &lt;a href=&quot;http://citizen428.net/exit.php?url_id=4751&amp;amp;entry_id=420&quot; title=&quot;http://docs.amazonwebservices.com/AmazonEC2/dg/2007-01-03/CLTRG-register.html&quot;&gt;ec2-register&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;
&lt;/ul&gt;&lt;/p&gt;

	&lt;p&gt;Not rocket science, but definitely not as good as just being able to share your own AMIs between regions&amp;#8230;&lt;/p&gt;

	&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Robert J. Berger wrote this &lt;a href=&quot;http://citizen428.net/exit.php?url_id=4752&amp;amp;entry_id=420&quot; title=&quot;http://blog.ibd.com/scalable-deployment/copy-an-ebs-ami-image-to-another-amazon-ec2-region/&quot;&gt;detailed step by step guide&lt;/a&gt; based on my short summary, you should go check it out! &lt;/p&gt;</content>
		<author>
			<name>citizen428</name>
			<email>nospam@example.com</email>
			<uri>http://citizen428.net/</uri>
		</author>
		<source>
			<title type="html">citizen428.blog()</title>
			<subtitle type="html">Too old to bother, too young to care...</subtitle>
			<link rel="self" href="http://citizen428.net/rss.php?serendipity[tag"/>
			<id>http://citizen428.net/rss.php?serendipity[tag</id>
			<updated>2010-03-15T09:00:06+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Today in the Intertweets (March 2nd Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/rckMLN5C3rg/"/>
		<id>http://disclojure.org/?p=711</id>
		<updated>2010-03-03T07:38:43+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;Fragment selectors (a new Enlive feature) are useful for webscraping too (&lt;a href=&quot;http://gist.github.com/319457&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/cgrand&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View cgrand's Twitter Profile&quot;&gt;cgrand&lt;/a&gt;) &amp;#8212; Fragments are a way of creating sub-templates in &lt;a href=&quot;http://github.com/cgrand/enlive&quot;&gt;Enlive&lt;/a&gt;. This example shows how to use them also for web scraping.&lt;/li&gt;
&lt;li&gt;tcrayford&amp;#8217;s clojure-refactoring at master (&lt;a href=&quot;http://github.com/tcrayford/clojure-refactoring&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/sldfjd&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View sldfjd's Twitter Profile&quot;&gt;sldfjd&lt;/a&gt;) &amp;#8212; Library for Emacs that provides some automated refactorings.&lt;/li&gt;
&lt;li&gt;Clojure just passed CL to become the #&lt;a href=&quot;http://search.twitter.com/search?q=%2319&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;19&amp;quot;&quot;&gt;19&lt;/a&gt; on the github high score chart (&lt;a href=&quot;http://github.com/languages/Clojure&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/IORayne&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View IORayne's Twitter Profile&quot;&gt;IORayne&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div id=&quot;attachment_716&quot; class=&quot;wp-caption alignnone&quot;&gt;&lt;img class=&quot;size-full wp-image-716   &quot; title=&quot;Clojure_is_num_19_at_GitHub&quot; src=&quot;http://disclojure.org/wp-content/uploads/2010/03/Screen-shot-2010-03-02-at-7.45.53-PM1.png&quot; alt=&quot;Clojure is num.19 at GitHub&quot; width=&quot;377&quot; height=&quot;140&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Clojure is num.19 at GitHub&lt;/p&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Google analytics with #&lt;a href=&quot;http://search.twitter.com/search?q=%23Clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Clojure&amp;quot;&quot;&gt;Clojure&lt;/a&gt; and #&lt;a href=&quot;http://search.twitter.com/search?q=%23Incanter&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Incanter&amp;quot;&quot;&gt;Incanter&lt;/a&gt; (&lt;a href=&quot;http://nakkaya.com/2010/03/02/analytics-with-incanter/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/liebke&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View liebke's Twitter Profile&quot;&gt;liebke&lt;/a&gt;) &amp;#8212; Another illustrative article on how to create instant applications with Clojure from nakkaya.com: Pull data from Google Analytics and then process it and show it in nice graphs with Incanter.&lt;/li&gt;
&lt;li&gt;Next week (3/11) is &amp;#8220;Happy Tasty Clojure&amp;#8221; from Kurt Christensen (&lt;a href=&quot;http://www.twincitieslanguagesusergroup.com/TCLUG/Default.aspx&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/jasonbock&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View jasonbock's Twitter Profile&quot;&gt;jasonbock&lt;/a&gt;) &amp;#8212; If you are near the Twin Cities by 3/11, there is a talk on Clojure hosted by the Twin Cities Languages User Group&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=rckMLN5C3rg:JiM36h3KmUk:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=rckMLN5C3rg:JiM36h3KmUk:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=rckMLN5C3rg:JiM36h3KmUk:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=rckMLN5C3rg:JiM36h3KmUk:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=rckMLN5C3rg:JiM36h3KmUk:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=rckMLN5C3rg:JiM36h3KmUk:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=rckMLN5C3rg:JiM36h3KmUk:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/rckMLN5C3rg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Analytics with Incanter</title>
		<link href="http://nakkaya.com/2010/03/02/analytics-with-incanter/"/>
		<id>http://nakkaya.com/2010/03/02/analytics-with-incanter/</id>
		<updated>2010-03-02T16:00:14+00:00</updated>
		<content type="html">&lt;p&gt;These past few days I've been playing with
&lt;a href=&quot;http://incanter.org/&quot;&gt;Incanter&lt;/a&gt;, which is a Clojure-based, R-like
platform for statistical computing and graphics. This post covers the
basic steps of using Clojure to access your Google Analytics Data with
the Google Analytics Data Export API and visualize, filter the data
returned using Incanter.&lt;/p&gt;

&lt;p&gt;Google provides a Java library to simplify use of any Google Data API
with Java, to access Analytics you need to grab the following list of
Jars from
&lt;a href=&quot;http://code.google.com/p/gdata-java-client/downloads/list&quot;&gt;gdata-java-client&lt;/a&gt;
and
&lt;a href=&quot;http://code.google.com/p/google-collections/&quot;&gt;google-collections&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gdata-client-1.0.jar&lt;/li&gt;
&lt;li&gt;gdata-client-meta-1.0.jar&lt;/li&gt;
&lt;li&gt;gdata-core-1.0.jar&lt;/li&gt;
&lt;li&gt;gdata-analytics-2.1.jar&lt;/li&gt;
&lt;li&gt;gdata-analytics-meta-2.1.jar&lt;/li&gt;
&lt;li&gt;google-collect-1.0.jar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After running &quot;lein deps&quot; add them to the lib/ subdirectory.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; (defn service [username pass]
   (doto (AnalyticsService. &quot;Clojure_Incanter_Sample&quot;)
     (.setUserCredentials username pass)))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In order to retrieve data we need a service object which handles all
interaction between our application and Analytics Data Export API.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; (defn account-feed [service &amp;amp; args]
   (let [url (URL. (str &quot;https://www.google.com/analytics/&quot;
                        &quot;feeds/accounts/default?max-results=50&quot;))
         feed (.getFeed service url (get-class &quot;AccountFeed&quot;))
         accs (reduce #(assoc %1 
                         (-&amp;gt; %2 .getTitle .getPlainText)
                         (-&amp;gt; %2 .getTableId .getValue)) 
                      {} (.getEntries feed))]
     (if (nil? args) accs (accs (first args)))))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To retrieve data for a profile, we need its table id. Asking service for
an account feed, returns a list of entries containing title, table id and
profile id but we are only interested in title and table id.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; (defn data-feed [service &amp;amp; args]
   (let [args (apply hash-map args)
         feed (.getFeed service (.getUrl (query args)) (get-class &quot;DataFeed&quot;))
         cols (map #(str &quot;ga&quot; %) (concat (:dimensions args) (:metrics args)))]
     (map (fn [e]
            (map #(.stringValueOf e %) cols))
          (.getEntries feed))))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As with the account feed, first thing we need to do is build a feed
request URL, query function handles that nothing fancy, it just calls a
bunch of setters for dimensions, metrics etc. Querying analytics service
with a data feed URL returns a list of entries, data-feed maps over them
and returns a sequence containing dimensions and metrics we requested.&lt;/p&gt;

&lt;p&gt;Now that we have some data to play with, we can start off by doing
fairly standard things, like which pages got the most visits for the
past month,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;   (def analytics (service &quot;username&quot; &quot;password&quot;))
   (def acc-nakkaya (account-feed analytics &quot;nakkaya.com&quot;))

   (def pageview (data-feed analytics 
                            :date [&quot;2010-01-26&quot; &quot;2010-02-25&quot;]
                            :dimensions [:pageTitle :pagePath]
                            :metrics [:pageviews]
                            :sort [:pageviews]
                            :num-result 10
                            :id acc-nakkaya))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is where incanter makes things fun, as long as you have a sequence
of rows, in this case what data-feed returns you can call view to
visualize the data, &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(view pageview)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&quot;http://nakkaya.com/images/post/analytics_incanter_1.png&quot; alt=&quot;incanter dataset&quot; /&gt;&lt;/p&gt;

&lt;p&gt;or we can filter the data leaving only portions of it which we are
interested, such as pages with views more than 200 and lower than 800,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;   (with-data (col-names (map (fn [[x y z]] [x y (BigInteger. z)]) pageview)
                         [:title :path :views])
     (view ($where {:views {:$gt 200 :$lt 800}})))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Alternatively you can filter the data in Clojure, requesting top 10
keywords people used to find your website and filtering the ones that
contain &quot;clojure&quot; or &quot;java&quot; in them,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;   (def keywords (data-feed analytics 
                            :date [&quot;2010-01-26&quot; &quot;2010-02-25&quot;]
                            :dimensions [:keyword]
                            :metrics [:visits]
                            :sort [:visits]
                            :num-result 10
                            :id acc-nakkaya))

    (let [words [&quot;clojure&quot; &quot;java&quot;]] 
      (reduce (fn[h v]
                (if (some true? (map #(.contains (first v) %) words))
                  (conj h v) h)) [] keywords))

 analytics.core=&amp;gt; [(&quot;clojure xml&quot; &quot;62&quot;) (&quot;clojure turtle graphics&quot; &quot;31&quot;)
                   (&quot;clojure opencv&quot; &quot;26&quot;) (&quot;detect faces from webcam+java&quot; &quot;26&quot;)]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Besides visualizing stuff using tables, we can plot graphs containing
the information we are intrested,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;   (def browsers (data-feed analytics 
                            :date [&quot;2010-01-26&quot;]
                            :dimensions [:browser]
                            :metrics [:visits]
                            :sort [:visits]
                            :num-result 10
                            :id acc-nakkaya))

   (view (bar-chart (take 4 (map first browsers))
                    (take 4 (map #(BigInteger. (last %)) browsers))
                    :title &quot;Browser/Visits&quot;
                    :x-label &quot;Browsers&quot;
                    :y-label &quot;Visits&quot;))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&quot;http://nakkaya.com/images/post/analytics_incanter_2.png&quot; alt=&quot;incanter bar-chart plot&quot; /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;   (def view-date (data-feed analytics 
                             :date [&quot;2009-11-26&quot; &quot;2010-02-25&quot;]
                             :dimensions [:date]
                             :metrics [:visitors]
                             :sort [:visitors]
                             :num-result 10
                             :id acc-nakkaya))

   (view (line-chart (map first view-date)
                     (map #(BigInteger. (last %)) view-date)
                     :title &quot;Visits&quot;
                     :x-label &quot;Date&quot;
                     :y-label &quot;Visits&quot;))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&quot;http://nakkaya.com/images/post/analytics_incanter_3.png&quot; alt=&quot;incanter line-chart plot&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://nakkaya.com/code/clojure/analytics.clj&quot;&gt;analytics.clj&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Nurullah Akkaya</name>
			<uri>http://nakkaya.com</uri>
		</author>
		<source>
			<title type="html">Nurullah Akkaya: an explorer's log</title>
			<subtitle type="html">Random bits and pieces on stuff that I find interesting.</subtitle>
			<link rel="self" href="http://nakkaya.com/rss-feed"/>
			<id>http://nakkaya.com/rss-feed</id>
			<updated>2010-03-16T05:00:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Today in the Intertweets (March 1st Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/Q4G4suY_XEM/"/>
		<id>http://disclojure.org/?p=707</id>
		<updated>2010-03-02T07:58:04+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;Published (finally) a Clojure app to get twitts from your account and push them to MySQL database (&lt;a href=&quot;http://www.b0j3.si/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/b0j3&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View b0j3's Twitter Profile&quot;&gt;b0j3&lt;/a&gt;) &amp;#8212; An interesting (brave) way of this author to learn clojure, by building a twitter app and using a database. Whatever happened to SICP? The interesting thing for me is that the author is using yet another library to access twitter? How many are there?&lt;/li&gt;
&lt;li&gt;Again, another #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; #&lt;a href=&quot;http://search.twitter.com/search?q=%23wallpaper&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;wallpaper&amp;quot;&quot;&gt;wallpaper&lt;/a&gt; done in GIMP (no PS installed :/) (&lt;a href=&quot;http://twitpic.com/160kmx&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/dsp_&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View dsp_'s Twitter Profile&quot;&gt;dsp_&lt;/a&gt;) &amp;#8212; Don&amp;#8217;t click that link yet&amp;#8230; read below first.
&lt;ul&gt;
&lt;li&gt;Turns out that #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; logo shouldn&amp;#8217;t be used in derivate works, deleting the wallpapers from twitpoic. (via @&lt;a href=&quot;http://twitter.com/dsp_&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View dsp_'s Twitter Profile&quot;&gt;dsp_&lt;/a&gt;) &amp;#8212; Awwwwww!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Look at my Software Transactional Memory implementation for Cocoa/Obj-C. Based on Clojure&amp;#8217;s. Still experimental (&lt;a href=&quot;http://github.com/aramallo/CTKConcurrency&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/aramallo&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View aramallo's Twitter Profile&quot;&gt;aramallo&lt;/a&gt;) &amp;#8212; Rich Hickey is a trend-setter.&lt;/li&gt;
&lt;li&gt;Webjureなんてフレームワークもあるのか (&lt;a href=&quot;http://github.com/tatut/Webjure&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/bojovs&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View bojovs's Twitter Profile&quot;&gt;bojovs&lt;/a&gt;) &amp;#8212; Webjure is yet another Clojure-based simple web framework.&lt;/li&gt;
&lt;li&gt;#circumspec #&lt;a href=&quot;http://search.twitter.com/search?q=%23inferior&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;inferior&amp;quot;&quot;&gt;inferior&lt;/a&gt;-lisp #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; and #&lt;a href=&quot;http://search.twitter.com/search?q=%23slime&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;slime&amp;quot;&quot;&gt;slime&lt;/a&gt; (video) (&lt;a href=&quot;http://vimeo.com/9770382&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/stuarthalloway&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View stuarthalloway's Twitter Profile&quot;&gt;stuarthalloway&lt;/a&gt;) &amp;#8212; This video is awesome in many ways. Shows a mini-browser that lets you use a web-browser to navigate your code dynamically. Shows a cool emacs configuration. Finally, it shows how &lt;a href=&quot;http://github.com/stuarthalloway/circumspec/tree/d05bdc5fb6ccb088787b35628dde2f46c7e8cc8f&quot;&gt;Circumspec&lt;/a&gt; looks today. And it looks awesome :). Watch. It.&lt;/li&gt;
&lt;li&gt;Conjure 0.4がリリースされたらしい (&lt;a href=&quot;http://groups.google.com/group/clojure-conjure/browse_thread/thread/9e4578bda97e3863&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/bojovs&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View bojovs's Twitter Profile&quot;&gt;bojovs&lt;/a&gt;) &amp;#8212; &lt;a href=&quot;http://github.com/macourtney/Conjure&quot;&gt;Conjure&lt;/a&gt; (a Rails-like web framework for Clojure) 0.4 has been released.&lt;/li&gt;
&lt;li&gt;Would be really interested in seeing feedback on this musing about &lt;a&gt;&lt;a href=&quot;&gt;&lt;a href=&quot;&gt;&lt;a href=&quot;&gt;&lt;a href=&quot;&gt;&lt;a href=&quot;http://search.twitter.com/search?q=%2343556b&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;43556b&amp;quot;&quot;&gt;43556b&lt;/a&gt;; padding: 0px; margin: 0px;&quot; title=&quot;#clojure&quot; rel=&quot;nofollow&quot; href=&quot;http://twitter.com/search?q=%23clojure&quot;&gt;#clojure&lt;/a&gt;and dependency injection (&lt;a href=&quot;http://tech.puredanger.com/2010/03/01/dependency-injection-clojure/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/puredanger&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View puredanger's Twitter Profile&quot;&gt;puredanger&lt;/a&gt;) &amp;#8212; How to do dependency injection in Clojure (or is it needed at all?)&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Are you ready for a Bay Area Clojure Bootcamp? Cast your vote now! (&lt;a href=&quot;http://www.meetup.com/The-Bay-Area-Clojure-User-Group/polls/227717/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/disclojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View disclojure's Twitter Profile&quot;&gt;disclojure&lt;/a&gt;) &amp;#8212; Amit Rathore, author of &amp;#8220;Clojure in Action&amp;#8221;  and founder of the BA-CUG is asking &amp;#8220;How much would you pay to attend a day long Clojure boot-camp?&amp;#8221;. Go ahead and vote!&lt;/li&gt;
&lt;li&gt;Vote up, if you want to see how to use tools like #&lt;a href=&quot;http://search.twitter.com/search?q=%23ant&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;ant&amp;quot;&quot;&gt;ant&lt;/a&gt; #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; and #&lt;a href=&quot;http://search.twitter.com/search?q=%23hadoop&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;hadoop&amp;quot;&quot;&gt;hadoop&lt;/a&gt; in the cloud (&lt;a href=&quot;http://www.sfjava.org/ideas/127654/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/jclouds&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View jclouds's Twitter Profile&quot;&gt;jclouds&lt;/a&gt;) &amp;#8212; Another pool: if you leave in or around San Francisco, you like Clojure and know that there are more clouds than the ones in the sky, you might want to vote for &lt;a href=&quot;http://anyweight.blogspot.com/&quot;&gt;JClouds&lt;/a&gt; to present at the SFJUG (and then attend, of course!)&lt;/li&gt;
&lt;li&gt;Episode 13 is up &amp;#8211; inferring information (&lt;a href=&quot;http://vimeo.com/9843950&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/fulldisclojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View fulldisclojure's Twitter Profile&quot;&gt;fulldisclojure&lt;/a&gt;) &amp;#8212; This episode from @&lt;a href=&quot;http://twitter.com/fulldisclojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View fulldisclojure's Twitter Profile&quot;&gt;fulldisclojure&lt;/a&gt; is about writing an inference engine in clojure. Pretty intense.&lt;/li&gt;
&lt;li&gt;Clojure + Emacs (&lt;a href=&quot;http://mdelaurentis.tumblr.com/post/421253627/clojure-emacs&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/mdelaurentis&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View mdelaurentis's Twitter Profile&quot;&gt;mdelaurentis&lt;/a&gt;) &amp;#8212; A compilation of ways to interact with the Clojure REPL from Emacs&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=Q4G4suY_XEM:G5l6LfDlEFE:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=Q4G4suY_XEM:G5l6LfDlEFE:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=Q4G4suY_XEM:G5l6LfDlEFE:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=Q4G4suY_XEM:G5l6LfDlEFE:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=Q4G4suY_XEM:G5l6LfDlEFE:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=Q4G4suY_XEM:G5l6LfDlEFE:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=Q4G4suY_XEM:G5l6LfDlEFE:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/Q4G4suY_XEM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Episode 13 - Inference</title>
		<link href="http://vimeo.com/channels/fulldisclojure#9843950"/>
		<id>tag:vimeo,2010-03-01:clip9843950</id>
		<updated>2010-03-02T02:21:27+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://vimeo.com/9843950&quot; title=&quot;Episode 13 - Inference&quot;&gt;&lt;img src=&quot;http://ts.vimeo.com.s3.amazonaws.com/498/843/49884383_200.jpg&quot; alt=&quot;Episode 13 - Inference&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In this episode I review how to write an inference engine in Clojure.&lt;br /&gt;
&lt;br /&gt;
Show notes:&lt;br /&gt;
&lt;a href=&quot;http://github.com/francoisdevlin/Full-Disclojure/blob/master/src/episode_013/episode_013.clj&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;github.com/francoisdevlin/Full-Disclojure/blob/master/src/episode_013/episode_013.clj&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;Cast: &lt;a href=&quot;http://vimeo.com/seandevlin&quot;&gt;Sean Devlin&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Sean Devlin</name>
			<uri>http://vimeo.com/channels/fulldisclojure</uri>
		</author>
		<source>
			<title type="html">Vimeo / Full Disclojure</title>
			<subtitle type="html">NOW UPDATED TUESDAYS!

This is a series of videos designed to help teach the Clojure language.

Questions/suggestions for episodes?  Email me!

fulldisclojure@gmail.com

Full Disclojure is available under Creative Commons  by-nc-sa</subtitle>
			<link rel="self" href="http://vimeo.com/channels/fulldisclojure/videos/rss"/>
			<id>http://vimeo.com/channels/fulldisclojure/videos/rss</id>
			<updated>2010-03-16T05:00:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Leiningen (unknown severity): &quot;lein test&quot; broken for Clojure 1.0.0 projects</title>
		<link href="http://github.com/technomancy/leiningen/issues/#issue/21"/>
		<id>http://github.com/technomancy/leiningen/issues/#issue/21</id>
		<updated>2010-03-02T00:00:00+00:00</updated>
		<content type="html">Leiningen (unknown severity): &quot;lein test&quot; broken for Clojure 1.0.0 projects</content>
		<author>
			<name>BugSpy</name>
			<uri>http://bugspy.net</uri>
		</author>
		<source>
			<title type="html">BugSpy.net - Reports By Tag: clojure</title>
			<link rel="self" href="http://bugspy.net/tag/clojure/?format=rss"/>
			<id>http://bugspy.net/tag/clojure/?format=rss</id>
			<updated>2010-03-16T05:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Enclojure (unknown severity): Problem in the classpath string</title>
		<link href="http://github.com/EricThorsen/enclojure/issues/#issue/7"/>
		<id>http://github.com/EricThorsen/enclojure/issues/#issue/7</id>
		<updated>2010-03-02T00:00:00+00:00</updated>
		<content type="html">Enclojure (unknown severity): Problem in the classpath string</content>
		<author>
			<name>BugSpy</name>
			<uri>http://bugspy.net</uri>
		</author>
		<source>
			<title type="html">BugSpy.net - Reports By Tag: clojure</title>
			<link rel="self" href="http://bugspy.net/tag/clojure/?format=rss"/>
			<id>http://bugspy.net/tag/clojure/?format=rss</id>
			<updated>2010-03-16T05:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Leiningen (unknown severity): enhancement - Test classification</title>
		<link href="http://github.com/technomancy/leiningen/issues/#issue/20"/>
		<id>http://github.com/technomancy/leiningen/issues/#issue/20</id>
		<updated>2010-03-02T00:00:00+00:00</updated>
		<content type="html">Leiningen (unknown severity): enhancement - Test classification</content>
		<author>
			<name>BugSpy</name>
			<uri>http://bugspy.net</uri>
		</author>
		<source>
			<title type="html">BugSpy.net - Reports By Tag: clojure</title>
			<link rel="self" href="http://bugspy.net/tag/clojure/?format=rss"/>
			<id>http://bugspy.net/tag/clojure/?format=rss</id>
			<updated>2010-03-16T05:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Anonymous function literals and syntax-quote don&amp;#8217;t work well together</title>
		<link href="http://onclojure.com/2010/03/01/anonymous-function-literals-and-syntax-quote-dont-work-well-together/"/>
		<id>http://onclojure.com/?p=99</id>
		<updated>2010-03-01T10:43:05+00:00</updated>
		<content type="html">&lt;p&gt;Clojure has a couple of macro-like features built right into the reader, providing shorthand notation for commonly needed constructs. However, unlike real macros, which are built on a sound conceptual framework that guarantees arbitrary composability (macro calls can contain macros and expand into other macros), the different macro-like features in the reader don&amp;#8217;t always play well together.&lt;/p&gt;
&lt;p&gt;Consider the following piece of code:&lt;/p&gt;
&lt;pre&gt;
(defmacro foo [x]
  `(map #(identity %) [~x]))
&lt;/pre&gt;
&lt;p&gt;At first sight, nothing looks wrong with this, other than it doesn&amp;#8217;t do anything useful. But any use of this macro causes an error message:&lt;/p&gt;
&lt;pre&gt;
(foo [:a :b])
java.lang.Exception: Can't use qualified name as parameter: user/p1__3328
&lt;/pre&gt;
&lt;p&gt;What&amp;#8217;s going on here? The error message hints at a problem with a function argument. The only function being defined is here &lt;code&gt;#(identity %)&lt;/code&gt;, which uses a shorthand notation for function literals expanded by the reader. Let&amp;#8217;s see what the macro call expands to:&lt;/p&gt;
&lt;pre&gt;
(macroexpand-1 '(foo [:a :b]))
&lt;/pre&gt;
&lt;p&gt;yields&lt;/p&gt;
&lt;pre&gt;
(clojure.core/map (fn* [user/p1__3328] (clojure.core/identity user/p1__3328)) [[:a :b]])
&lt;/pre&gt;
&lt;p&gt;So here&amp;#8217;s the problem: &lt;code&gt;#(identity %)&lt;/code&gt; is expanded by the reader into &lt;code&gt;(fn* [p1__3328] (identity p1__3328))&lt;/code&gt;. This is a perfectly valid function literal, but the other reader feature used here, syntax-quote, doesn&amp;#8217;t know about function literals. It takes the expanded function literal as an arbitrary form and does namespace resolution on all symbols. This leads to a namespace-qualified symbol for a function parameter, which is not legal Clojure syntax.&lt;/p&gt;
&lt;p&gt;Moral: use reader features sparingly, ideally one at a time. Except for syntax-quote, they only save you a couple of keystrokes, a convenience that you may end up paying a high price for in terms of debugging time.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/onclojure.wordpress.com/99/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/onclojure.wordpress.com/99/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/onclojure.wordpress.com/99/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/onclojure.wordpress.com/99/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/onclojure.wordpress.com/99/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/onclojure.wordpress.com/99/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/onclojure.wordpress.com/99/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/onclojure.wordpress.com/99/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/onclojure.wordpress.com/99/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/onclojure.wordpress.com/99/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=onclojure.com&amp;amp;blog=5872423&amp;amp;post=99&amp;amp;subd=onclojure&amp;amp;ref=&amp;amp;feed=1&quot; /&gt;</content>
		<author>
			<name>khinsen</name>
			<uri>http://onclojure.com</uri>
		</author>
		<source>
			<title type="html">On Clojure</title>
			<subtitle type="html">A blog about everything Clojure</subtitle>
			<link rel="self" href="http://onclojure.wordpress.com/feed/atom/"/>
			<id>http://onclojure.com/feed/atom/</id>
			<updated>2010-03-05T18:30:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">This weekend in the Intertweets (Feb 28th Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/kzzn1Wm3K1M/"/>
		<id>http://disclojure.org/?p=702</id>
		<updated>2010-03-01T08:20:32+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;Very simple #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; wallpaper (&lt;a href=&quot;http://twitpic.com/15fyuv&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/dsp_&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View dsp_'s Twitter Profile&quot;&gt;dsp_&lt;/a&gt;) &amp;#8212; A nice wallpaper for clojurians
&lt;ul&gt;
&lt;li&gt;Another one, this time in 1280&amp;#215;800 (&lt;a href=&quot;http://twitpic.com/15fza7&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/dsp_&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View dsp_'s Twitter Profile&quot;&gt;dsp_&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;clojure-maven-plugin now uses (run-tests) and not (run-all-tests), and defaults to including test deps for run/repl/nailgun/swank. (via @&lt;a href=&quot;http://twitter.com/talios&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View talios's Twitter Profile&quot;&gt;talios&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Clojure serialization benchmark testing printer, JSON, and binary (&lt;a href=&quot;http://gist.github.com/316675&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/mmcgrana&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View mmcgrana's Twitter Profile&quot;&gt;mmcgrana&lt;/a&gt;) &amp;#8212; Mark is running some benchmark on the different forms of serialization of clojure data structures. His own &lt;a href=&quot;http://github.com/mmcgrana/clj-json&quot;&gt;clj-json&lt;/a&gt; wins hands down. The micro-benchmark framework that he uses seems pretty generic too.&lt;/li&gt;
&lt;li&gt;I made an attempt at uniform JVM benchmarking, please help make it better (&lt;a href=&quot;http://www.bestinclass.dk/index.php/2010/02/benchmarking-jvm-languages/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/laujensen&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View laujensen's Twitter Profile&quot;&gt;laujensen&lt;/a&gt;) &amp;#8212; Speaking of micro-benchmarks, Lau has written an article trying to settle on a set of guidelines for running micro-benchmarks for the JVM.&lt;/li&gt;
&lt;li&gt;Wrote my experience with compojure&amp;#8217;s session down (&lt;a href=&quot;http://blog.experimentalworks.net/2010/02/dealing-with-sessions-in-compojure/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/dsp_&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View dsp_'s Twitter Profile&quot;&gt;dsp_&lt;/a&gt;) &amp;#8212; How to create a simple web session with loging/logout using Compojure&amp;#8217;s own session capabilities.&lt;/li&gt;
&lt;li&gt;A simple web application in Clojure using ring and enlive (&lt;a href=&quot;http://www.lshift.net/blog/2010/02/27/a-simple-web-application-in-clojure-using-ring-and-enlive&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/lshift&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View lshift's Twitter Profile&quot;&gt;lshift&lt;/a&gt;) &amp;#8212; Ring and Enlive together create a very barebones but powerful web framework. This article shows how to write a web app with them both.&lt;/li&gt;
&lt;li&gt;See #&lt;a href=&quot;http://search.twitter.com/search?q=%23clujure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clujure&amp;quot;&quot;&gt;clujure&lt;/a&gt; syntax brains curled up into a tube (&lt;a href=&quot;http://fprog.ru/2010/issue4/alex-ott-clojure/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/ignart&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ignart's Twitter Profile&quot;&gt;ignart&lt;/a&gt;) &amp;#8212; (don&amp;#8217;t blame me; this is an automated translation from Russian by Google Translate) This is a fairly long and complete article introducing clojure to Russian readers by @&lt;a href=&quot;http://twitter.com/alexott_en&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View alexott_en's Twitter Profile&quot;&gt;alexott_en&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=kzzn1Wm3K1M:JWA1UcBK73I:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=kzzn1Wm3K1M:JWA1UcBK73I:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=kzzn1Wm3K1M:JWA1UcBK73I:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=kzzn1Wm3K1M:JWA1UcBK73I:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=kzzn1Wm3K1M:JWA1UcBK73I:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=kzzn1Wm3K1M:JWA1UcBK73I:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=kzzn1Wm3K1M:JWA1UcBK73I:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/kzzn1Wm3K1M&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Getting benchmarking right</title>
		<link href="http://feedproxy.google.com/~r/bestinclass-the-blog/~3/dMwlra3uYnM/"/>
		<id>http://www.bestinclass.dk/?p=1121</id>
		<updated>2010-02-28T15:30:56+00:00</updated>
		<content type="html">&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.bestinclass.dk%2Findex.php%2F2010%2F02%2Fbenchmarking-jvm-languages%2F&quot;&gt;&lt;br /&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.bestinclass.dk%2Findex.php%2F2010%2F02%2Fbenchmarking-jvm-languages%2F&amp;amp;source=LauJensen&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot; /&gt;&lt;br /&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;Several times on this blog, I’ve dealt with issues where some kind of benchmarking was required. The method, implementation, environment all play a role and has subsequently been the object of much discussion. In this post let’s see if we can agree on some way of benchmarking.&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-1121&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Benchmarking is 4D&lt;/h1&gt;
&lt;p&gt;In my oppinion there are 4 dimensions to benchmarking which we need to deal with separately. In industry benchmarking can be crual to architecting your solution correctly and/or dealing with performance issues. Industry benchmarking needs to come as close to the real scenario as possible. If you’re working on a massive scale, benchmarking on a laptop is a no go, if your setup is heavy on I/O you need to clone your production environment in order to produce reliable results, etc etc.&lt;/p&gt;
&lt;p&gt;The second type of benchmarking is what is typical for bloggers and I’m no exception: Microbenchmarking. Microbenchmarking is where we take certain routines out and benchmark them individually, my recent &lt;a href=&quot;http://www.bestinclass.dk/index.php/2010/02/haskell-ruby-clojure/&quot; target=&quot;_blank&quot;&gt;Fibonnaci&lt;/a&gt; &lt;a href=&quot;http://www.bestinclass.dk/index.php/2010/02/haskellrubyscalaclojure-tweaked/&quot; target=&quot;_blank&quot;&gt;posts&lt;/a&gt; are examples of this. Like the commentators pointed out, there needs to be an emphasis on equality where possible. A Ruby solution won’t look like a Clojure solution, but differences like returning or printing the result should be eliminated and defining the specific area to benchmark is very important: Are we timing the function or the inner-loop?&lt;/p&gt;
&lt;p&gt;This second form of benchmarking is in divided into 2 distinct categories as well (bringing us up to the 4D benchmarking), because we have many languages which put the JVM to good effect with all the added benefits, but there are also languages that dont. Benchmarking on the JVM requires a good knowledge of both the JVM and HotSpot, whereas benchmarking outside of the JVM requires a good knowledge of whichever compiler you are working with. In that regard I couldn’t do Haskell any favors, for not having a clue about how the compiled code runs, start up times etc?&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;JVM Benchmarking&lt;/h1&gt;
&lt;p&gt;Being able to benchmark on the JVM is important and requires some background. I recommend reading &lt;a href=&quot;http://www.ibm.com/developerworks/java/library/j-jtp02225.html&quot; target=&quot;_blank&quot;&gt;this post&lt;/a&gt; in particular.&lt;/p&gt;
&lt;p&gt;The unix time function is ruled out for the obvious reasons that &lt;strong&gt;1)&lt;/strong&gt; We dont want to be affected by the startup time of the JVM and &lt;strong&gt;2)&lt;/strong&gt; We dont need it. Especially when we’re looking at single algorithm/loop etc, what we really want to know is how well that given body of code performs. Its interaction with the rest of our system can be disregarded for the sake of comparison and since we’re often dealing with very small numbers, subtle differences quickly become not so subtle. Before we can get into the actual benchmarking we need to boot the JVM.&lt;/p&gt;
&lt;h3&gt;What we dont care about&lt;/h3&gt;
&lt;p&gt;For the sake of blogging/microbenchmarking we’re typically not doing any major optimizations, because usually idioms are being compared. There are exceptions, but we can deal with them once we get there. The JVM is a fantastic eco-system which allows for rigorious introspection — all of which we can disgard for our simple exercises.&lt;/p&gt;
&lt;p&gt;Things we can disregard:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;JVM Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;–XX:+PrintCompilation&lt;/strong&gt; — This gives us a heads-up whenever a method is compiled.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;–verbose:GC&lt;/strong&gt; — Lets us keep tabs on when the GC is running&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;–XX:-PrintGC&lt;/strong&gt; — Print messages at GC&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;–XX:-PrintGCDetails&lt;/strong&gt; — More verbose GC messages&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;–XX:-TraceClassLoading&lt;/strong&gt; — Trace the loading of classes&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;–agentlib:hprof[&lt;em&gt;=options&lt;/em&gt;] — &lt;/strong&gt; Heap/CPU — read this: &lt;a href=&quot;http://java.sun.com/developer/technicalArticles/Programming/HPROF.html&quot; target=&quot;_blank&quot;&gt;options&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;All of these (and dim sum) can be very helpful in tracing performance bottlenecks, but for microbenchmarking they seem overkill. Depending on how much allocation we’re doing we might trigger some heavy GC, but in that case we should account be stripping high/low values from our timings.&lt;/p&gt;
&lt;p&gt;The things we cannot disregard:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;JVM Paramters:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;–Xms128M&lt;/strong&gt; — The minimum amount of memory the JVM allocation&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;–Xmx512M&lt;/strong&gt; — The maximum amount&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;–server/-client&lt;/strong&gt; — Depending on which we choose for a given task, you actually get &lt;a href=&quot;http://stackoverflow.com/questions/198577/real-differences-between-java-server-and-java-client&quot; target=&quot;_blank&quot;&gt;different compilers&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We should strive to keep the values identical because depending on the task they can make all the difference. The minimum amount is allocation at the JVM boot, meaning no time will be spent growing the memory space while the program is running if you don’t exceed this. Thought I haven’t checked Jarkko Oranen suggested that the preformance degradation which comes by approaching the Xmx value is due to the GC working double time to free up memory, therefore its important to set the max to an appropriate value — though it varies from test to test we should strive to keep these values identical.&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Methodology&lt;/h1&gt;
&lt;p&gt;I don’t think there’s a set standard for how we benchmark when doing blog comparisons, so allow me to introduce and outline for how we can handle comparisons done on this blog:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Do multiple passes&lt;/strong&gt;: The code being benched should be executed repeatedly a given number of times, at default for smaller algorithms could be 20 passes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Because we eventually hit GCs or other burps of the system, multiple passes ensure that we get the overall picture.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Garbage collect: &lt;/strong&gt;Dont heap it up between runs, but clean after every pass.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the simplest way in which you can tame the GC and help get uniform results.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Filter highest and lowest values&lt;/strong&gt;: Take the highest and lowest value and remove them from the timings.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When timing on the JVM some of the bumps are very significant — You can have a series of runs going at &lt;strong&gt;&lt;em&gt;5ms&lt;/em&gt;&lt;/strong&gt; and then suddenly a pass that takes &lt;strong&gt;&lt;em&gt;40ms&lt;/em&gt;&lt;/strong&gt; — Since its more a reflection of the disturbance than the actual algorithm, it can safely be stripped.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Warm up the JVM:&lt;/strong&gt; To trigger all the optimizations etc, the main loop should be repeated a number of times&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Since we’re blogging, I recommend just going for either 1 pass of the algorithm, or repeated passes of the algorithm until we’ve have been crunching for 1 minute. So if you algorithm takes 30 seconds for 1 pass, it will run twice, if it takes 2 minutes per pass, it will run once.&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Implementation&lt;/h1&gt;
&lt;p&gt;To make this fair I’ll provide a benchmark macro in Clojure and if you are also the happy user of some other JVM language which you want included in future benchmarks on this site, please provide me with a similar function/macro, which I will then both post here and use in future comparisons.&lt;/p&gt;
&lt;pre&gt;(&lt;span&gt;defmacro&lt;/span&gt; &lt;span&gt;microbench&lt;/span&gt;
  &lt;span&gt;&quot; Evaluates the expression n number of times, returning the average
    time spent in computation, removing highest and lowest values.

    If the body of expr returns nil, only the timing is returned otherwise
    the result is printed - does not affect timing.

    Before timings begin, a warmup is performed lasting either 1 minute or
    1 full computational cycle, depending on which comes first.&quot;&lt;/span&gt;
  [n expr] {&lt;span&gt;:pre&lt;/span&gt; [(&lt;span&gt;&amp;gt;&lt;/span&gt; n 2)]}
  `(&lt;span&gt;let&lt;/span&gt; [warm-up#  (&lt;span&gt;let&lt;/span&gt; [start# (System/currentTimeMillis)]
                     (&lt;span&gt;println&lt;/span&gt; &lt;span&gt;&quot;Warming up!&quot;&lt;/span&gt;)
                     (&lt;span&gt;while&lt;/span&gt; (&lt;span&gt;&amp;lt;&lt;/span&gt; (System/currentTimeMillis) (&lt;span&gt;+&lt;/span&gt; start# (&lt;span&gt;*&lt;/span&gt; 60 1000)))
                            (&lt;span&gt;with-out-str&lt;/span&gt; ~expr)
                            (System/gc))
                     (&lt;span&gt;println&lt;/span&gt; &lt;span&gt;&quot;Benchmarking...&quot;&lt;/span&gt;))
         timings#  (&lt;span&gt;doall&lt;/span&gt;
                    (&lt;span&gt;for&lt;/span&gt; [pass# (&lt;span&gt;range&lt;/span&gt; ~n)]
                      (&lt;span&gt;let&lt;/span&gt; [start#    (System/nanoTime)
                            retr#     ~expr
                            timing#   (&lt;span&gt;/&lt;/span&gt; (&lt;span&gt;double&lt;/span&gt; (&lt;span&gt;-&lt;/span&gt; (System/nanoTime) start#))
                                         1000000.0)]
                        (&lt;span&gt;when&lt;/span&gt; retr# (&lt;span&gt;println&lt;/span&gt; retr#))
                        (System/gc)
                        timing#)))
         runtime#  (&lt;span&gt;reduce&lt;/span&gt; + timings#)
         highest#  (&lt;span&gt;apply&lt;/span&gt; max timings#)
         lowest#   (&lt;span&gt;apply&lt;/span&gt; min timings#)]
     (&lt;span&gt;println&lt;/span&gt; &lt;span&gt;&quot;Total runtime: &quot;&lt;/span&gt; runtime#)
     (&lt;span&gt;println&lt;/span&gt; &lt;span&gt;&quot;Highest time : &quot;&lt;/span&gt; highest#)
     (&lt;span&gt;println&lt;/span&gt; &lt;span&gt;&quot;Lowest time  : &quot;&lt;/span&gt; lowest#)
     (&lt;span&gt;println&lt;/span&gt; &lt;span&gt;&quot;Average      : &quot;&lt;/span&gt; (&lt;span&gt;/&lt;/span&gt; (&lt;span&gt;-&lt;/span&gt; runtime# (&lt;span&gt;+&lt;/span&gt; highest# lowest#))
                                   (&lt;span&gt;-&lt;/span&gt; (&lt;span&gt;count&lt;/span&gt; timings#) 2)))
     timings#))
&lt;/pre&gt;
&lt;p&gt;The code is effectively divded into 3 sections:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warm-up:&lt;/strong&gt; A while loop runs for at least 1 minute, trapping all output so we dont see any printing from whatever we’re benchmarking.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Timings&lt;/strong&gt;: The actually expression is repeatedly run and the milliseconds spent in each pass is returned&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stats&lt;/strong&gt;: Highest/Lowest values are filtered, results are printed&lt;/p&gt;
&lt;p&gt;Using this to test our Fibonacci code from my previous post, then becomes:&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;user&amp;gt; &lt;/span&gt;(microbench 20
              (&lt;span&gt;let&lt;/span&gt; [limit (.pow (BigInteger/TEN) 999)]
                   (&lt;span&gt;loop&lt;/span&gt; [a 0 b 1 i 1]
                      (&lt;span&gt;if&lt;/span&gt; (&lt;span&gt;&amp;lt;&lt;/span&gt; b limit)
                          (&lt;span&gt;recur&lt;/span&gt; b (&lt;span&gt;+&lt;/span&gt; a b) (&lt;span&gt;inc&lt;/span&gt; i))
                          nil))))
&lt;span&gt;Warming up!
Benchmarking...
Total runtime:  110.08787899999999
Highest time :  7.98691
Lowest time  :  5.135988
Average      :  5.386943388888889&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Notice the final ‘nil’ in the code. If I had returned ‘i’ instead it would have printed the result of each pass before printing the final stats — It would not affect the timing. Or if we used the more idiomatic (?) version:&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;user&amp;gt; &lt;/span&gt;&lt;span&gt;(microbench 20
&lt;/span&gt;                  (&lt;span&gt;let&lt;/span&gt; [limit (.pow (BigInteger/TEN) 999)]
                       (&lt;span&gt;count&lt;/span&gt; (&lt;span&gt;take-while&lt;/span&gt; #(&lt;span&gt;&amp;lt;&lt;/span&gt; % limit) fib-seq))))
&lt;span&gt;Warming up!
Benchmarking...
4782
4782
4782
4782
4782
4782
4782
4782
4782
4782
4782
4782
4782
4782
4782
4782
4782
4782
4782
4782
Total runtime:  74.73764200000001
Highest time :  5.031017
Lowest time  :  3.168419
Average      :  3.696567&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Of course in that case its cheating, because the fib-seq is calculated once and then kept in memory.&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Benchmarks can be fun, but I think its important to &lt;strong&gt;1)&lt;/strong&gt; Agree on some methodology and &lt;strong&gt;2)&lt;/strong&gt; Not go nuts over a few milliseconds here and there. Certain algorithms perform better than others, and certain algorithms can be more or less idiomatically expressed in various languages. Ultimately when looking at the results we have to apply some common sense as we’re not always doing 1:1 comparisons. Using these benchmarks to definitely positively declare one language superior to the other should neither be our goal nor is it possible.&lt;/p&gt;
&lt;p&gt;If you’ve taken a look at Alex Osbornes &lt;a href=&quot;http://meshy.org/2009/12/13/widefinder-2-with-clojure.html&quot; target=&quot;_blank&quot;&gt;attempt&lt;/a&gt; at the WideFinder 2 challenge, you saw how he plowed through &lt;strong&gt;45 Gigabytes&lt;/strong&gt; of text in a blazing &lt;strong&gt;8m 4s&lt;/strong&gt; blowing both Scala and Java out of the water. Does that then conclusively state that Clojure is faster than both those languages? Of course not, Clojure compiles to bytecode, just like Scala and Java so the exact same speed could be obtained by both of them. The point is, that the concise and elegant Clojure code can be as powerful than other languages without the same level of incidental complexity being put on the user, so it makes sense to focus on the quality of the code while keeping half an eye on the performance. If all that mattered was speed, we’d all still be writing ASM.&lt;/p&gt;
&lt;p&gt;This is my proposal for a uniform way to benchmark in the future — let me know what you think, I’m only happy to accept changes, improvements, implementations in other languages etc. And JVM outsiders shouldn’t feel left out.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/VvMS5XJ4lWtQZnPE4myjTGUAXjk/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/VvMS5XJ4lWtQZnPE4myjTGUAXjk/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/VvMS5XJ4lWtQZnPE4myjTGUAXjk/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/VvMS5XJ4lWtQZnPE4myjTGUAXjk/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?a=dMwlra3uYnM:hrFNd64M5gg:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?a=dMwlra3uYnM:hrFNd64M5gg:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?a=dMwlra3uYnM:hrFNd64M5gg:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?i=dMwlra3uYnM:hrFNd64M5gg:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/bestinclass-the-blog/~4/dMwlra3uYnM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Lau B. Jensen</name>
			<uri>http://www.bestinclass.dk</uri>
		</author>
		<source>
			<title type="html">BEST IN CLASS</title>
			<subtitle type="html">Software Innovator</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/bestinclass-the-blog"/>
			<id>http://feeds.feedburner.com/bestinclass-the-blog</id>
			<updated>2010-03-13T23:00:33+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Tokyo-Cabinet-Clj (unknown severity): documentation?</title>
		<link href="http://github.com/jmtulloss/tokyo-cabinet-clj/issues/#issue/2"/>
		<id>http://github.com/jmtulloss/tokyo-cabinet-clj/issues/#issue/2</id>
		<updated>2010-02-28T00:00:00+00:00</updated>
		<content type="html">Tokyo-Cabinet-Clj (unknown severity): documentation?</content>
		<author>
			<name>BugSpy</name>
			<uri>http://bugspy.net</uri>
		</author>
		<source>
			<title type="html">BugSpy.net - Reports By Tag: clojure</title>
			<link rel="self" href="http://bugspy.net/tag/clojure/?format=rss"/>
			<id>http://bugspy.net/tag/clojure/?format=rss</id>
			<updated>2010-03-16T05:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Today in the Intertweets (Feb 25th Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/mcLbKflWprU/"/>
		<id>http://disclojure.org/?p=696</id>
		<updated>2010-02-26T07:45:49+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;This ought to be good, Cap-Clug meeting on 3/17 with @&lt;a href=&quot;http://twitter.com/richhickey&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View richhickey's Twitter Profile&quot;&gt;richhickey&lt;/a&gt; and @&lt;a href=&quot;http://twitter.com/stuarthalloway&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View stuarthalloway's Twitter Profile&quot;&gt;stuarthalloway&lt;/a&gt; (&lt;a href=&quot;http://www.eventbrite.com/event/586299638/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/mattpodwysocki&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View mattpodwysocki's Twitter Profile&quot;&gt;mattpodwysocki&lt;/a&gt;) &amp;#8212; If you are going to be anywhere between 0 and 1000 miles from Reston (VA) on March 17th, you should definitely plan to attend.&lt;/li&gt;
&lt;li&gt;My #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; concurrency talk from Øredev is online (&lt;a href=&quot;http://www.oredev.org/prod/oredev/site.nsf/docsbycodename/session?opendocument&amp;amp;sid=A63BC77001A119BFC12575D5003BC000&amp;amp;track=2556B90C592E1E23C12575A500499CC6&amp;amp;day=5&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/stuarthalloway&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View stuarthalloway's Twitter Profile&quot;&gt;stuarthalloway&lt;/a&gt;) &amp;#8212; This talk is an introduction to Clojure and its concurrency features. If you can&amp;#8217;t go to the meet-up above, you can always watch Stuart Halloway&amp;#8217;s presentation :)&lt;/li&gt;
&lt;li&gt;rosejn&amp;#8217;s midi-clj, a high level midi library to play notes, external midi devices in clojure (&lt;a href=&quot;http://github.com/rosejn/midi-clj&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/ajlopez&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ajlopez's Twitter Profile&quot;&gt;ajlopez&lt;/a&gt;) &amp;#8212; this will *definitely* be tested this weekend on my &lt;a href=&quot;http://flickr.com/photos/matrixsynth/1316733635/&quot;&gt;Virus Classic&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;rosejn&amp;#8217;s osc-clj, an Open Sound Control library for Clojure (&lt;a href=&quot;http://github.com/rosejn/osc-clj&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/ajlopez&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ajlopez's Twitter Profile&quot;&gt;ajlopez&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Talk on &amp;#8220;Emerging Languages&amp;#8221; in Palo Alto, March 10th (&lt;a href=&quot;http://www.sdforum.org/index.cfm?fuseaction=Page.ViewPage&amp;amp;PageID=622&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/hamiltonulmer&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View hamiltonulmer's Twitter Profile&quot;&gt;hamiltonulmer&lt;/a&gt;) &amp;#8212; Amit Rathore will be introducing Clojure in that talk. Clojure, Go, Scala and Ruby will be presented.&lt;/li&gt;
&lt;li&gt;#clojure + #&lt;a href=&quot;http://search.twitter.com/search?q=%23chef&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;chef&amp;quot;&quot;&gt;chef&lt;/a&gt; + #&lt;a href=&quot;http://search.twitter.com/search?q=%23cloud&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;cloud&amp;quot;&quot;&gt;cloud&lt;/a&gt; = pallet; great stuff @&lt;a href=&quot;http://twitter.com/hugoduncan&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View hugoduncan's Twitter Profile&quot;&gt;hugoduncan&lt;/a&gt;! (&lt;a href=&quot;http://hugoduncan.github.com/pallet/index.html&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/jclouds&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View jclouds's Twitter Profile&quot;&gt;jclouds&lt;/a&gt;) &amp;#8212; Pallet is used to start provision compute nodes using crane, jclouds and chef. It is designed for use from the REPL, along with Clojure scripts.&lt;/li&gt;
&lt;li&gt;A short preview of ClojureQL (&lt;a href=&quot;http://kotka.de/blog/2010/02/A_preview_of_ClojureQL.html&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/kotarak&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View kotarak's Twitter Profile&quot;&gt;kotarak&lt;/a&gt;) &amp;#8212; ClojureQL is undergoing a lot of changes in the front-end. Here is a sneak preview of how the new front-end will look like.&lt;/li&gt;
&lt;li&gt;A Resettable Memoize in Clojure (&lt;a href=&quot;http://www.paullegato.com/blog/memoize-reset-clojure/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/pjlegato&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View pjlegato's Twitter Profile&quot;&gt;pjlegato&lt;/a&gt;) &amp;#8212; Since you cannot reset a memoized function with the &amp;#8216;memoize&amp;#8217; function in Clojure&amp;#8217;s core API (yet), you can always create your own resetteable memoize. Here&amp;#8217;s how.&lt;/li&gt;
&lt;li&gt;Wrote a blog on using the with-command-line option parser in Clojure (&lt;a href=&quot;http://tech.puredanger.com/2010/02/25/clojure-command-line-options/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/puredanger&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View puredanger's Twitter Profile&quot;&gt;puredanger&lt;/a&gt;) &amp;#8212; If you need to parse command-line options, know that &amp;#8216;there is a clojure lib for that&amp;#8217;&amp;#8230; with almost no documentation. Well, &amp;#8220;there is a blog post for that too&amp;#8221;!&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=mcLbKflWprU:L1V4dGOH21E:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=mcLbKflWprU:L1V4dGOH21E:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=mcLbKflWprU:L1V4dGOH21E:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=mcLbKflWprU:L1V4dGOH21E:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=mcLbKflWprU:L1V4dGOH21E:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=mcLbKflWprU:L1V4dGOH21E:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=mcLbKflWprU:L1V4dGOH21E:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/mcLbKflWprU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Penumbra (unknown severity): Cannot run examples</title>
		<link href="http://github.com/ztellman/penumbra/issues/#issue/17"/>
		<id>http://github.com/ztellman/penumbra/issues/#issue/17</id>
		<updated>2010-02-26T00:00:00+00:00</updated>
		<content type="html">Penumbra (unknown severity): Cannot run examples</content>
		<author>
			<name>BugSpy</name>
			<uri>http://bugspy.net</uri>
		</author>
		<source>
			<title type="html">BugSpy.net - Reports By Tag: clojure</title>
			<link rel="self" href="http://bugspy.net/tag/clojure/?format=rss"/>
			<id>http://bugspy.net/tag/clojure/?format=rss</id>
			<updated>2010-03-16T05:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Plot EC2 instance usage with Clojure and Incanter</title>
		<link href="http://citizen428.net/archives/418-Plot-EC2-instance-usage-with-Clojure-and-Incanter.html"/>
		<id>http://citizen428.net/archives/418-guid.html</id>
		<updated>2010-02-25T23:46:29+00:00</updated>
		<content type="html">&lt;p&gt;Have you ever wondered which instance types you use most when dealing with Amazon&amp;#8217;s EC2? I have, so I came up with a short Clojure/&lt;a href=&quot;http://citizen428.net/exit.php?url_id=4749&amp;amp;entry_id=418&quot; title=&quot;http://incanter.org&quot;&gt;Incanter&lt;/a&gt; program to plot a nice chart like this:&lt;br /&gt;
&lt;br /&gt;

&lt;img src=&quot;http://twitpic.com/show/thumb/15byfe.png&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;EC2 usage plotted by #incanter (@liebke) on Twitpic&quot; border=&quot;1&quot; /&gt;&lt;br /&gt;

&lt;a href=&quot;http://citizen428.net/exit.php?url_id=4746&amp;amp;entry_id=418&quot; title=&quot;EC2 usage plotted by incanter&quot;&gt;(full size image)&lt;/a&gt;&lt;/p&gt;

	&lt;p&gt;Here&amp;#8217;s the code, if you have any feedback please leave a comment, this was the first time I used Incanter.&lt;/p&gt;

	&lt;p&gt; &lt;/p&gt;</content>
		<author>
			<name>citizen428</name>
			<email>nospam@example.com</email>
			<uri>http://citizen428.net/</uri>
		</author>
		<source>
			<title type="html">citizen428.blog()</title>
			<subtitle type="html">Too old to bother, too young to care...</subtitle>
			<link rel="self" href="http://citizen428.net/rss.php?serendipity[tag"/>
			<id>http://citizen428.net/rss.php?serendipity[tag</id>
			<updated>2010-03-15T09:00:06+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A preview of ClojureQL</title>
		<link href="http://kotka.de/blog/2010/02/A_preview_of_ClojureQL.html"/>
		<id>http://kotka.de/blog/2010/02/A_preview_of_ClojureQL.html</id>
		<updated>2010-02-25T22:31:00+00:00</updated>
		<content type="html">&lt;p&gt;As you might already know, I'm rewriting
&lt;a href=&quot;http://gitorious.org/clojureql&quot;&gt;ClojureQL&lt;/a&gt;. This takes a lot of time at the
moment, so I don't find much time to blog. But to not stall the blog completely
and to shorten the time a little until the first version of CQL is released I
decided to provide a little example on the look'n'feel of the new frontend. So
here we go…&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://kotka.de/blog/2010/02/A_preview_of_ClojureQL.html&quot; class=&quot;seemore&quot;&gt;See more ...&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Meikel Brandmeyer</name>
			<uri>http://kotka.de/blog/</uri>
		</author>
		<source>
			<title type="html">Kotka</title>
			<subtitle type="html">About Clojure… What else?</subtitle>
			<link rel="self" href="http://kotka.de/blog/index.rss"/>
			<id>http://kotka.de/blog/index.rss</id>
			<updated>2010-03-15T23:00:12+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">New issue of Russian Journal of Functional Programming</title>
		<link href="http://alexott.blogspot.com/2010/02/new-issue-of-russian-journal-of.html"/>
		<id>tag:blogger.com,1999:blog-6862508.post-2119779738790952443</id>
		<updated>2010-02-25T17:07:01+00:00</updated>
		<content type="html">Today the &lt;a href=&quot;http://fprog.ru/2010/issue4/&quot;&gt;new issue&lt;/a&gt; of Russian journal of functional programming was released. In this issue &lt;a href=&quot;http://fprog.ru/2010/issue4/alex-ott-clojure/&quot;&gt;my article about Clojure&lt;/a&gt; was published. This article should be first big article about Clojure in Russian. Article describes Clojure from scratch and should be useful for Lisp &amp;amp; Java programmers. It describes Clojure syntax, basic constructs, Java interop &amp;amp; concurrent programming.&lt;br /&gt;P.S. If you interested, you can read article via Google Translate...&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6862508-2119779738790952443?l=alexott.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Alex Ott</name>
			<email>alexott@gmail.com</email>
			<uri>http://alexott.blogspot.com/search/label/clojure</uri>
		</author>
		<source>
			<title type="html">Alex Ott's blog</title>
			<subtitle type="html">Blog dedicated to Software Development, Unixes, Content Filtering, Emacs, Lisp, and other things.</subtitle>
			<link rel="self" href="http://alexott.blogspot.com/feeds/posts/default/-/clojure"/>
			<id>tag:blogger.com,1999:blog-6862508</id>
			<updated>2010-03-14T17:00:30+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Comprehensive list of cloud-related links</title>
		<link href="http://citizen428.net/archives/417-Comprehensive-list-of-cloud-related-links.html"/>
		<id>http://citizen428.net/archives/417-guid.html</id>
		<updated>2010-02-25T10:34:55+00:00</updated>
		<content type="html">&lt;p&gt;Lately a lot of my working time is spent on cloud technologies, most notably the &lt;a href=&quot;http://citizen428.net/exit.php?url_id=4744&amp;amp;entry_id=417&quot; title=&quot;http://aws.amazon.com/&quot;&gt;Amazon Web Services&lt;/a&gt;. In recent month I compiled a rather comprehensive list of cloud-related links which I now decided to share with you all. &lt;/p&gt;

	&lt;p&gt;&lt;a href=&quot;http://citizen428.net/exit.php?url_id=4745&amp;amp;entry_id=417&quot; title=&quot;http://gist.github.com/314445&quot;&gt;Cloud Links&lt;/a&gt;&lt;/p&gt;

	&lt;p&gt;It&amp;#8217;s just a markdown file copied into a Gist, so if you want to add any links just fork away! &lt;img src=&quot;http://citizen428.net/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt; &lt;/p&gt;</content>
		<author>
			<name>citizen428</name>
			<email>nospam@example.com</email>
			<uri>http://citizen428.net/</uri>
		</author>
		<source>
			<title type="html">citizen428.blog()</title>
			<subtitle type="html">Too old to bother, too young to care...</subtitle>
			<link rel="self" href="http://citizen428.net/rss.php?serendipity[tag"/>
			<id>http://citizen428.net/rss.php?serendipity[tag</id>
			<updated>2010-03-15T09:00:06+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Today in the Intertweets (Feb 24th Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/DcJ6o1dyHMw/"/>
		<id>http://disclojure.org/?p=690</id>
		<updated>2010-02-25T08:06:16+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;Groovy is the #&lt;a href=&quot;http://search.twitter.com/search?q=%2321&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;21&amp;quot;&quot;&gt;21&lt;/a&gt; most popular language on GitHub. Clojure is the #&lt;a href=&quot;http://search.twitter.com/search?q=%2320&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;20&amp;quot;&quot;&gt;20&lt;/a&gt; most popular language on GitHub. Glad I switched. (via @&lt;a href=&quot;http://twitter.com/foogoof&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View foogoof's Twitter Profile&quot;&gt;foogoof&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;ClojureでCompojureを使わずにサーブレットを書く方法を書きました (&lt;a href=&quot;http://tnoborio.blogspot.com/2010/02/clojurecompojure.html&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/tnoborio&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View tnoborio's Twitter Profile&quot;&gt;tnoborio&lt;/a&gt;) &amp;#8212; For those who don&amp;#8217;t read Japanese, this roughly translates to: &amp;#8220;How to write a servlet in Clojure without Compojure&amp;#8221; (Thanks @&lt;a href=&quot;http://twitter.com/chosuke&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View chosuke's Twitter Profile&quot;&gt;chosuke&lt;/a&gt; for the help with the translation!)&lt;/li&gt;
&lt;li&gt;New chapter four &amp;#8211; Polymorphism with Multimethods &amp;#8211; added to the Clojure in Action MEAP &amp;#8211; get it &lt;a href=&quot;http://www.manning.com/rathore/&quot;&gt;here&lt;/a&gt; (via @&lt;a href=&quot;http://twitter.com/amitrathore&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View amitrathore's Twitter Profile&quot;&gt;amitrathore&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Chinarro The Robot eats XMPP in #&lt;a href=&quot;http://search.twitter.com/search?q=%23Clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Clojure&amp;quot;&quot;&gt;Clojure&lt;/a&gt; (&lt;a href=&quot;http://github.com/antoniogarrote/Chinarro&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/ajlopez&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ajlopez's Twitter Profile&quot;&gt;ajlopez&lt;/a&gt;) &amp;#8212; This robots connects to a MUC jabber room, and a #&lt;a href=&quot;http://search.twitter.com/search?q=%23hashtagged&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;hashtagged&amp;quot;&quot;&gt;hashtagged&lt;/a&gt; message is posted, the robot stores it for you.&lt;/li&gt;
&lt;li&gt;Montréal #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; luncheon on March 10th. Come join us! New users welcome &amp;#8211; I&amp;#8217;m one of them (&lt;a href=&quot;http://groups.google.com/group/montreal-clojure-user-group/browse_thread/thread/52f4c4fdf3f184af&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/jperras&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View jperras's Twitter Profile&quot;&gt;jperras&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Dean Wampler on Programming Languages &amp;#8211; Scala, Clojure, functional paradigm (&lt;a href=&quot;http://www.infoq.com/interviews/wampler-programming-language;jsessionid=DA353075438A13B6A899626C32347DCF&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/vkelman&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View vkelman's Twitter Profile&quot;&gt;vkelman&lt;/a&gt;) &amp;#8212; Dean Wampler is co-author of Programming Scala and owner/principal of Aspect Research Associates. Touches on Clojure tangentially, but interesting nonetheless.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=DcJ6o1dyHMw:hLoMy6FhVLI:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=DcJ6o1dyHMw:hLoMy6FhVLI:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=DcJ6o1dyHMw:hLoMy6FhVLI:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=DcJ6o1dyHMw:hLoMy6FhVLI:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=DcJ6o1dyHMw:hLoMy6FhVLI:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=DcJ6o1dyHMw:hLoMy6FhVLI:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=DcJ6o1dyHMw:hLoMy6FhVLI:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/DcJ6o1dyHMw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Writing Leiningen Plugins 101</title>
		<link href="http://nakkaya.com/2010/02/25/writing-leiningen-plugins-101/"/>
		<id>http://nakkaya.com/2010/02/25/writing-leiningen-plugins-101/</id>
		<updated>2010-02-25T04:00:18+00:00</updated>
		<content type="html">&lt;p&gt;I'm trying to switch, building my projects using
&lt;a href=&quot;http://ant.apache.org/&quot;&gt;Ant&lt;/a&gt; to
&lt;a href=&quot;http://github.com/technomancy/leiningen&quot;&gt;leiningen&lt;/a&gt;. Almost all of them
requires customs tasks such as building native executables, move files
around etc. Which requires I have to come up with a lein plugin for each
ant task, unfortunately not much documentation exists about writing
lein plugins, this post collects bits and pieces of information I
gathered over the web.&lt;/p&gt;

&lt;p&gt;To begin with lein tasks are functions named &quot;your-task&quot; defined in the
namespace &quot;leiningen.your-task&quot;. They take a project argument containing
information defined in defproject and command-line arguments. For simple
tasks or quickly testing something, you can simply define them in
project.clj after the defproject definition,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; (ns leiningen.foo)
 (defn foo [project &amp;amp; args] (println &quot;Hello Foo!!&quot;))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now lein should have a new task named foo, running it should print
&quot;Hello Foo!!&quot;. Of course for longer tasks, you are not going to want it
cluttering your project.clj, they can be placed under leiningen/ folder
&lt;strong&gt;not&lt;/strong&gt; src/leiningen/. Since tasks are just functions, making a task
depend on another task is as easy as calling depencies on top of the
function.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; ;;leiningen/bar.clj
 (ns leiningen.bar)

 (defn bar [projects &amp;amp; args] 
   (apply leiningen.foo/foo projects args)
   (println &quot;Hello Bar!!&quot;))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now running bar task should give you, &quot;Hello Foo!!&quot; and &quot;Hello
Bar!!&quot;. For sharing plugins across projects create a separate lein
project for the plugin, after creating a Jar with &quot;lein jar&quot; you have two
options, you can either push it to clojars and add your plugin as a
dev-dependency for your project or just move the jar to the lib folder
of the project, either way lein will pick it up.&lt;/p&gt;</content>
		<author>
			<name>Nurullah Akkaya</name>
			<uri>http://nakkaya.com</uri>
		</author>
		<source>
			<title type="html">Nurullah Akkaya: an explorer's log</title>
			<subtitle type="html">Random bits and pieces on stuff that I find interesting.</subtitle>
			<link rel="self" href="http://nakkaya.com/rss-feed"/>
			<id>http://nakkaya.com/rss-feed</id>
			<updated>2010-03-16T05:00:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Haskell,Ruby,Scala,Clojure — Tweaked!</title>
		<link href="http://feedproxy.google.com/~r/bestinclass-the-blog/~3/UjPBxJi5wVM/"/>
		<id>http://www.bestinclass.dk/?p=1112</id>
		<updated>2010-02-24T20:17:11+00:00</updated>
		<content type="html">&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.bestinclass.dk%2Findex.php%2F2010%2F02%2Fhaskellrubyscalaclojure-tweaked%2F&quot;&gt;&lt;br /&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.bestinclass.dk%2Findex.php%2F2010%2F02%2Fhaskellrubyscalaclojure-tweaked%2F&amp;amp;source=LauJensen&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot; /&gt;&lt;br /&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;Last night I did very &lt;a href=&quot;http://www.bestinclass.dk/index.php/2010/02/haskell-ruby-clojure/&quot; target=&quot;_blank&quot;&gt;small superficial comparison&lt;/a&gt;, of 3 ways of getting the first fibonnaci number consisting of 1000 digits. This attracted a lot of attention from Rubists, Haskaloonies and Clojurians alike, here I’ll share their contributions.&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-1112&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Preface&lt;/h1&gt;
&lt;p&gt;Microbenchmarking sucks, especially on the JVM. HotSpot is doing such a great job of optimizing code, that sometimes you end up getting an incorrect idea of how your code performs. Nevertheless I got, many tips for improving performance, so it seems the Internet Performance Rule of Thumb is: &lt;strong&gt;Always benchmark the Fibs&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Haskell&lt;/h2&gt;
&lt;p&gt;Team Haskell weren’t pleased completing the job in 7 msecs, so they suggested that I recompile the program using –O2. I used GHC v. 6.10:&lt;/p&gt;
&lt;pre class=&quot;sh_haskell&quot; name=&quot;code&quot;&gt;limit = 10^999
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
main = print . length . takeWhile (&amp;lt; limit) $ fibs
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt; (thanks to: “laulau”) &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Real time, average of 20: &lt;strong&gt;7 msecs.&lt;/strong&gt;&lt;br /&gt;
 Nothing gained, but 7 msecs is blazing.&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Ruby&lt;/h2&gt;
&lt;p&gt;Ruby had big room for improvement as the very clever Matrix approach didn’t yield very satisfying performance. Here’s one commentators approach&lt;/p&gt;
&lt;pre class=&quot;sh_ruby&quot; name=&quot;code&quot;&gt;limit = 10**999
def fib2(a,b)
 return b,b+a
end
a,b = fib2(0,1)
while b &amp;lt; limit
 a,b = fib2(a,b)
end
puts b
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt; (thanks to: Aaron) &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Average on 20 runs: &lt;strong&gt;35 msecs.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Huge improvement and honor is restored to the Ruby camp!&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Scala&lt;/h2&gt;
&lt;p&gt;Camp Scala was good enough to contribute a solution as well:&lt;/p&gt;
&lt;pre class=&quot;sh_scala&quot; name=&quot;code&quot;&gt;object Main {
  def main(args: Array[String]) {
    def f(a: BigInt, b: BigInt) = (b, b + a)
    val max = BigInt(10).pow(999)
    var (a, b) = f(0, 1)
    while(b &amp;lt; max) {
      val temp = f(a, b)
      a = temp._1
      b = temp._2
    }
    println(&quot;\nb = &quot; + b)
  }
}
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt; (thanks to: Rahul G ‚&lt;strong&gt;*updated*&lt;/strong&gt;) &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Average: &lt;strong&gt;18 ms&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Clojure&lt;/h2&gt;
&lt;p&gt;Clojures loops are recursive and side-effect free, but even still it looks a little clunky:&lt;/p&gt;
&lt;pre&gt;(&lt;span&gt;time&lt;/span&gt; (&lt;span&gt;let&lt;/span&gt; [limit (.pow (BigInteger/TEN) 999)]
        (&lt;span&gt;loop&lt;/span&gt; [a 0 b 1 i 1]
          (&lt;span&gt;if&lt;/span&gt; (&lt;span&gt;&amp;lt;&lt;/span&gt; b limit)
            (&lt;span&gt;recur&lt;/span&gt; b (&lt;span&gt;+&lt;/span&gt; a b) (&lt;span&gt;inc&lt;/span&gt; i))
            i))))

(thanks to: Duc)&lt;/pre&gt;
&lt;p&gt;Nevertheless, it averages at: &lt;strong&gt;5 msecs&lt;/strong&gt;. Hooray! It’s a new record!&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;If nothing else I think its fun to see these challenges approached from different languages, which is also what I like about Project Euler. And I’m certain that this will not be the last time I bring Haskell along for the ride. Last nights post were meant as small reflections on 3 very different languages, so I was a little surprised of the attention that it got — But its positive, I think its great when we all can learn a little from one another.&lt;/p&gt;
&lt;p&gt;I’m open for ideas on another arena for comparisons. We could do something crazy like solve Global Warming.. oh wait, &lt;a href=&quot;http://www.bestinclass.dk/index.php/2010/01/global-warming/&quot;&gt;I already did that&lt;/a&gt;. How about &lt;a href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=200&quot;&gt;Euler 200&lt;/a&gt; then?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/FUw-BVWESt0viYcaa2scFYmF_ME/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/FUw-BVWESt0viYcaa2scFYmF_ME/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/FUw-BVWESt0viYcaa2scFYmF_ME/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/FUw-BVWESt0viYcaa2scFYmF_ME/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?a=UjPBxJi5wVM:P5Vft869V50:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?a=UjPBxJi5wVM:P5Vft869V50:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?a=UjPBxJi5wVM:P5Vft869V50:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?i=UjPBxJi5wVM:P5Vft869V50:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/bestinclass-the-blog/~4/UjPBxJi5wVM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Lau B. Jensen</name>
			<uri>http://www.bestinclass.dk</uri>
		</author>
		<source>
			<title type="html">BEST IN CLASS</title>
			<subtitle type="html">Software Innovator</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/bestinclass-the-blog"/>
			<id>http://feeds.feedburner.com/bestinclass-the-blog</id>
			<updated>2010-03-13T23:00:33+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Today in the Intertweets (Feb 23rd Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/IPClYwx0ank/"/>
		<id>http://disclojure.org/?p=687</id>
		<updated>2010-02-24T07:07:55+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;Generic equation solver &amp;amp; macros (&lt;a href=&quot;http://vimeo.com/9666573&quot;&gt;video&lt;/a&gt; here, via @&lt;a href=&quot;http://twitter.com/fulldisclojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View fulldisclojure's Twitter Profile&quot;&gt;fulldisclojure&lt;/a&gt;) &amp;#8212; A new episode of the weekly series by Sean Devlin that expands on macro creation (he did an episode on simpler macros a couple of weeks ago). He&amp;#8217;s got some nice macro-fu going on there!&lt;/li&gt;
&lt;li&gt;Analyzing JVM performance is hard &amp;#8230;but Clojure hash-maps really are fast (&lt;a href=&quot;http://groups.google.com/group/clojure/browse_thread/thread/776943086de213f9&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/chrishouser&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View chrishouser's Twitter Profile&quot;&gt;chrishouser&lt;/a&gt;) &amp;#8212; That&amp;#8217;s from Clojure&amp;#8217;s email list; someone posts a micro-benchmark comparing the performance hash-maps in Clojure and in Haskell. The conversation that follows shows once again that micro-benchmarks are almost always flawed and that, oh well, it is really hard to make fair comparisons.&lt;/li&gt;
&lt;li&gt;Clojure job market flys past Java&amp;#8217;s and Python&amp;#8217;s!!!1!!1! (&lt;a href=&quot;http://www.indeed.com/jobtrends?q=Java%2C+Python%2C+clojure&amp;amp;l=&amp;amp;relative=1&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/cemerick&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View cemerick's Twitter Profile&quot;&gt;cemerick&lt;/a&gt;) &amp;#8212; In RELATIVE terms, that is!&lt;/li&gt;
&lt;li&gt;I find this chart of Scala/Clojure/Erlang/Haskell/F#/Lisp jobs interesting (&lt;a href=&quot;http://www.indeed.com/jobtrends?q=scala,+clojure,+erlang,+F%23,+Haskell,+Lisp&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/puredanger&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View puredanger's Twitter Profile&quot;&gt;puredanger&lt;/a&gt;) &amp;#8212; And Clojure is the one that has grown the fastest in the last 6 mo., again in relative terms. In absolute terms, it now seems to be on par with F# and getting close to Haskell and Erlang.&lt;/li&gt;
&lt;li&gt;A simple web interface to mongodb written in clojure (&lt;a href=&quot;http://github.com/sethtrain/humongous&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/sethtrain&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View sethtrain's Twitter Profile&quot;&gt;sethtrain&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Graph Reasoner for Clojure (&lt;a href=&quot;http://www.lispcast.com/projects/graph-reasoner-for-clojure/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/ml_bot&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ml_bot's Twitter Profile&quot;&gt;ml_bot&lt;/a&gt;) &amp;#8212; Graph reasoning is a way to do inference over a relationship graph.&lt;/li&gt;
&lt;li&gt;Generating deftype forms in macros (&lt;a href=&quot;http://onclojure.com/2010/02/23/generating-deftype-forms-in-macros/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/jneira&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View jneira's Twitter Profile&quot;&gt;jneira&lt;/a&gt;) &amp;#8212; When trying to write macros that generate deftypes, you will find that the standard behavior of syntax-quote might not work too well because it tries to resolve unqualified symbols to their namespace-qualified equivalents. Int this article, an alternative for syntax-quote is proposed for things like deftype.&lt;/li&gt;
&lt;li&gt;Clojure, Haskell &amp;amp; Ruby Vs Euler 25 (&lt;a href=&quot;http://www.bestinclass.dk/index.php/2010/02/haskell-ruby-clojure/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/fulldisclojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View fulldisclojure's Twitter Profile&quot;&gt;fulldisclojure&lt;/a&gt;) &amp;#8212; Speaking of micr0-benchmarks, here is a new article from Lau Jensen comparing Clojure, Scala and Haskell. Needless to day this micro-benchmark raises some discussion. His results? Clojure has the most compact implementation and Haskell is absolutely fast.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=IPClYwx0ank:2_j_KI23hEI:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=IPClYwx0ank:2_j_KI23hEI:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=IPClYwx0ank:2_j_KI23hEI:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=IPClYwx0ank:2_j_KI23hEI:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=IPClYwx0ank:2_j_KI23hEI:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=IPClYwx0ank:2_j_KI23hEI:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=IPClYwx0ank:2_j_KI23hEI:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/IPClYwx0ank&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">mwmeyer</title>
		<link href="http://mired.wordpress.com/2010/02/23/theres-not-an-app-for-that-take-2/"/>
		<id>http://mired.wordpress.com/?p=151</id>
		<updated>2010-02-23T19:59:14+00:00</updated>
		<content type="html">&lt;br /&gt;&lt;p&gt;In order to keep better track of what iPhone users are missing out on, I&amp;#8217;ve set up a page listing Android applications &amp;#8211; or at least categories of them &amp;#8211; that Apple doesn&amp;#8217;t allow on the iPhone. You can find it under Pages on the right hand side of any page on the blog, listed as &lt;a href=&quot;http://mired.wordpress.com/apps-you-wont-find-in-the-app-store/&quot;&gt;Apps you won&amp;#8217;t find in the app store.&lt;/a&gt;&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/mired.wordpress.com/151/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mired.wordpress.com/151/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/mired.wordpress.com/151/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mired.wordpress.com/151/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/mired.wordpress.com/151/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mired.wordpress.com/151/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/mired.wordpress.com/151/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mired.wordpress.com/151/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/mired.wordpress.com/151/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mired.wordpress.com/151/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mired.wordpress.com&amp;amp;blog=1432062&amp;amp;post=151&amp;amp;subd=mired&amp;amp;ref=&amp;amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Mike Meyer</name>
			<uri>http://mired.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Mired in code</title>
			<subtitle type="html">An ongoing blog of my programming interests.</subtitle>
			<link rel="self" href="http://mired.wordpress.com/feed/"/>
			<id>http://mired.wordpress.com/feed/</id>
			<updated>2010-02-23T20:30:20+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Clojure, Haskell &amp;amp; Ruby Vs Euler 25</title>
		<link href="http://feedproxy.google.com/~r/bestinclass-the-blog/~3/4xTpA5QEmk8/"/>
		<id>http://www.bestinclass.dk/?p=1092</id>
		<updated>2010-02-23T18:53:47+00:00</updated>
		<content type="html">&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.bestinclass.dk%2Findex.php%2F2010%2F02%2Fhaskell-ruby-clojure%2F&quot;&gt;&lt;br /&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.bestinclass.dk%2Findex.php%2F2010%2F02%2Fhaskell-ruby-clojure%2F&amp;amp;source=LauJensen&amp;amp;style=normal&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot; /&gt;&lt;br /&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;Haskell is a mature, statically typed, functional language which was &lt;a href=&quot;http://blog.mostof.it/ruby-vs.-haskell-project-euler-25-deathmatch&quot; target=&quot;_blank&quot;&gt;recently compared&lt;/a&gt; to Ruby in an attempt to solve &lt;a href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=25&quot; target=&quot;_blank&quot;&gt;Euler #25&lt;/a&gt;. In this post I’ll share the code, the benchmark and add a Clojure version for those interested.&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-1092&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Preface&lt;/h1&gt;
&lt;p&gt;Normally it’s bad to start with the disclaimer, but for the sake of all you angry young men with ill tempers I’ll say it anyway: Similar to the &lt;a href=&quot;http://www.bestinclass.dk/index.php/2009/12/clojure-vs-ruby-scala-transient-newsgroups/&quot; target=&quot;_blank&quot;&gt;Clojure Vs Ruby &amp;amp; Scala&lt;/a&gt; post this is in no way an exhaustive comparison between the languages, its intended at a superficial glance at a simple challenge, namely &lt;a href=&quot;http://projecteuler.net/index.php?section=problems&amp;amp;id=25&quot; target=&quot;_blank&quot;&gt;Euler #25&lt;/a&gt;, all in the name of good clean fun. Haskell is by far too vast, too impressive and too powerful to be fully dealt with in a simple exercise like this, and the Ruby code is still running :)&lt;/p&gt;
&lt;h2&gt;Euler #25&lt;/h2&gt;
&lt;p&gt;Create a Fibonnaci sequence and walk through it, until you find the first number which is 1000 digits. The Fibonnacci sequence is exceedingly simple. Its seeded with 0 1 and all consecutive values n, are generated by calculating n-1 + n-2.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181.….&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Solutions&lt;/h1&gt;
&lt;p&gt;All 3 versions are compact and powerful — I’m assuming they’re idiomatic, but if I’m wrong let me know. Like I said — If you can produce a better version, please submit it instead of taking this as an invitation to a flamewar :)&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Ruby&lt;/h2&gt;
&lt;p&gt;Ruby goes like this:&lt;/p&gt;
&lt;pre class=&quot;sh_ruby&quot; name=&quot;code&quot;&gt;require 'matrix'

limit = 10**999
FIBONACCI_MATRIX = Matrix[[1,1],[1,0]]
def fibonacci(n)
  (FIBONACCI_MATRIX**(n-1)) [0,0]
end
i = 1
i+=1 while fibonacci(i) &amp;lt; limit
puts i
&lt;/pre&gt;
&lt;p&gt;The real trick here is building the Fibonnacci seq (fib-seq), which is done by applying the Matrix form, which is a clever way to leverage some differential equations in order to produce the sequence. According to the author this runs faster than a regular memoized variant.&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Haskell&lt;/h2&gt;
&lt;p&gt;Haskell code looks very different from both Ruby and Clojure, but for a simple task like this is reads almost like plain English:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;sh_haskell&quot;&gt;limit = 10^999
fibonacci_numbers = 0:1:(zipWith (+)
                        fibonacci_numbers (tail fibonacci_numbers))

index = length w where w = takeWhile (&amp;lt; limit) fibonacci_numbers

main = do
  putStrLn(show(index))
&lt;/pre&gt;
&lt;p&gt;First the limit is defined as the first number having 1000 digits, and then a sequence seeded with 0 and 1. When you have a sequence which requires a constant look-behind of n-values, it can be represented as a recursive set of vectors. I call that a rule of thumb, &lt;a href=&quot;http://clj-me.cgrand.net&quot; target=&quot;_blank&quot;&gt;Christophe&lt;/a&gt; says its a &lt;em&gt;&lt;strong&gt;theorem&lt;/strong&gt;&lt;/em&gt;. One thing which is really great about the Haskell code, is the automatic currying which enables the author to do the elegant w = takeWhile (&amp;lt; limit). Although this example is not flaunting it, Haskell is very different from Clojure in that its statically typed and there’s been many discussions back and forth on which is to prefer, dynamic or static typing. The truth is, no one answer fits all but there’s a simple test:&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Static Typing&quot; src=&quot;http://www.bestinclass.dk/wp-content/uploads/2009/ducktyping.jpeg&quot; alt=&quot;Static Typing&quot; width=&quot;477&quot; height=&quot;396&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If the arrow and the explanation actually helped you, then static typing is for you.&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Clojure&lt;/h2&gt;
&lt;p&gt;To produce the fib-seq, we can mimic Haskell almost point for point, but where Haskell has direct support for sequences in the syntax, I need to call a few functions:&lt;/p&gt;
&lt;pre&gt;(&lt;span&gt;def&lt;/span&gt; &lt;span&gt;fib-seq&lt;/span&gt; (&lt;span&gt;lazy-cat&lt;/span&gt; [0 1] (&lt;span&gt;map&lt;/span&gt; + fib-seq (&lt;span&gt;rest&lt;/span&gt; fib-seq))))

(&lt;span&gt;let&lt;/span&gt; [limit (.pow (BigInteger/TEN) 999)]
           (&lt;span&gt;count&lt;/span&gt; (&lt;span&gt;take-while&lt;/span&gt; #(&lt;span&gt;&amp;lt;&lt;/span&gt; % limit) fib-seq)))&lt;/pre&gt;
&lt;p&gt;The noticeable exterior differences is the call to lazy-cat and the anonymous function, which all readers of this blog should be able to read without any explanation. Under the hood, Haskell is fully lazy where Clojure is now Chunky-lazy. Chunked-seqs mean that I work with the sequences as if they were fully lazy, but under the hood Clojure is realizing the sequence, one chunk at a time. If I take 50 values, 82 may in fact be calculated — this is for improved performance without wrecking the use of infinite sequences. According to one of the authors of &lt;a href=&quot;http://joyofclojure.com/buy&quot; target=&quot;_blank&quot;&gt;this book&lt;/a&gt; (which looks extremely promising btw, so go look), Rich Hickey has provided an example which eliminates the need for chunked seqs: &lt;a href=&quot;http://gist.github.com/312649&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. That is idiomatic Clojure running faster than our old seq implementation written primarily in Java.&lt;/p&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Results&lt;/h1&gt;
&lt;p&gt;So the usual indicators for expressiveness and performance are LOC and runtime speed, so here we go:&lt;/p&gt;
&lt;div&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;LOC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Runtime&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clojure&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;0.021s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haskell&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;0.007s&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ruby&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;7.1s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br class=&quot;spacer_&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Last time I benchmarked Ruby it also came in… a little late, and some commentators suggested trying out other Ruby compilers — The truth is however, that small benchmarks like this really show &lt;em&gt;very little&lt;/em&gt; and if you are working in a performance critical zone, you’ll want to test something which mimics the actual project and the actual environment. Secondarily, neither Haskell nor Clojure are optimized for performance which accounts for some of the extra Ruby code.&lt;/p&gt;
&lt;p&gt;The lesson we can take away, is that Haskell and Clojure are blazing, and Haskell is blazing to the point where I’m not finding words good enough to describe it.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/UJL4wO8FFQx8NDYa5jQgC-L6Iwo/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/UJL4wO8FFQx8NDYa5jQgC-L6Iwo/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/UJL4wO8FFQx8NDYa5jQgC-L6Iwo/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/UJL4wO8FFQx8NDYa5jQgC-L6Iwo/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?a=4xTpA5QEmk8:vp0W7usMMkE:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?a=4xTpA5QEmk8:vp0W7usMMkE:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?a=4xTpA5QEmk8:vp0W7usMMkE:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/bestinclass-the-blog?i=4xTpA5QEmk8:vp0W7usMMkE:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/bestinclass-the-blog/~4/4xTpA5QEmk8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Lau B. Jensen</name>
			<uri>http://www.bestinclass.dk</uri>
		</author>
		<source>
			<title type="html">BEST IN CLASS</title>
			<subtitle type="html">Software Innovator</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/bestinclass-the-blog"/>
			<id>http://feeds.feedburner.com/bestinclass-the-blog</id>
			<updated>2010-03-13T23:00:33+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Generating deftype forms in macros</title>
		<link href="http://onclojure.com/2010/02/23/generating-deftype-forms-in-macros/"/>
		<id>http://onclojure.com/?p=86</id>
		<updated>2010-02-23T14:36:39+00:00</updated>
		<content type="html">&lt;p&gt;One of the common uses of macros in Clojure, as in other Lisp dialects, is to abstract away boilerplate code. Instead of writing very similar lengthy forms several times, one defines a macro that specializes a template for each particular use, and then uses that macro a few times. The template is usually written using &lt;a href=&quot;http://clojure.org/reader#The%20Reader--Macro%20characters&quot;&gt;syntax-quote&lt;/a&gt;: the template form is preceded by a backquote, and inside the template a tilde marks expressions that are replaced by their values.&lt;/p&gt;
&lt;p&gt;Syntax-quote has one more effect: it resolves all symbols in the current namespace (the one in which the macro is &lt;em&gt;defined&lt;/em&gt;, not the one where it is used) and replaces the unqualified symbol by its namespace-qualified equivalent. For most symbols in most forms, this is the right thing to do in order to make the macro work in any namespace, as well as to avoid unwanted variable capture. More specifically, it is the right thing to do for symbols that are defined by the macro, and for symbols that will ultimately be evaluated (names referring to vars, in particular function names). It is not the right thing to do for symbols bound locally inside the form (function parameter names, symbols bound in a let form). And it is also not the right thing to do for symbols that just stand for themselves and are used in some special way by the form that the macro expands to.&lt;/p&gt;
&lt;p&gt;The latter situation is particularly frequent in macros that generate &lt;a href=&quot;http://www.assembla.com/wiki/show/clojure/Datatypes&quot;&gt;&lt;code&gt;deftype&lt;/code&gt;&lt;/a&gt; forms. Consider for example the following &lt;code&gt;deftype&lt;/code&gt; form, which is a simplified version of the type definition used in my &lt;a href=&quot;http://code.google.com/p/clj-multiarray/&quot;&gt;multiarray design study&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;
(deftype multiarray

  [descriptor
   data-array]
  :as this

  Object
    (equals [o] ...)
    (hashCode [] ...)

   clojure.lang.Counted
     (count [] ...)

   clojure.lang.Indexed
     (nth [i] ..)

   clojure.lang.Sequential

   clojure.lang.Seqable
     (seq [] ...))
&lt;/pre&gt;
&lt;p&gt;Of all the symbols shown in the above example, the only one for which namespace-resolution is appropriate is &lt;code&gt;multiarray&lt;/code&gt;, the name of the type being defined. All the other symbols name fields of the type, Java interfaces, or methods. They must remain unqualified. In real-life deftypes, there are of course symbols that could or should be namespace-qualified, in particular most of the symbols used inside the method definitions, which are just like function definitions. However, method definitions are often short, and rarely subject to variable capture, meaning that not namespace-resolving those symbols is rarely a problem.&lt;/p&gt;
&lt;p&gt;In a syntax-quote template, there are two ways to deal with symbols for which the default (namespace-resolution) is not appropriate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prefixing with &lt;code&gt;~'&lt;/code&gt; (tilde + quote). This is a special case of an expression inside a template, whose value is the quoted symbol. A tilde-quoted symbol is taken over into the instantiated template without namespace-resolution.&lt;/li&gt;
&lt;li&gt;Postfixing with &lt;code&gt;#&lt;/code&gt; (hash sign). Such symbols are replaced with system-generated symbols that are guaranteed to be different from any other symbol in existence. This is another technique to avoid variable capture.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For generating a &lt;code&gt;deftype&lt;/code&gt; form from a syntax-quote template, the only solution is thus to prefix all the symbols shown in the example above with tilde-quote. I tried: it works, but it&amp;#8217;s a mess. It&amp;#8217;s not very readable, and the inevitable mistakes lead to unpleasant error messages.&lt;/p&gt;
&lt;p&gt;Well, this is Lisp, and in Lisp you are always free to make your own tools if you are not happy with the ones provided by the system. What I want here is a template expansion system that doesn&amp;#8217;t do namespace resolution on symbols. However, I didn&amp;#8217;t need a full-blown equivalent to syntax-quote templates either, given that I would use those &lt;code&gt;deftype&lt;/code&gt; templates only for one application. So I came up with the following definitions, which for me are the right compromise between simplicity and useability:&lt;/p&gt;
&lt;pre&gt;
(defn instantiate-template
  [substitution-map form]
  (clojure.walk/prewalk
   (fn [x] (if (and (sequential? x) (= (first x) 'clojure.core/unquote))
	     (substitution-map (second x))
	     x))
   form))

(defmacro template
  [substitutions form]
  (let [substitution-map (into {} (map (fn [[a b]]
					 [(list 'quote a) b])
				       (partition 2 substitutions)))]
    `(instantiate-template ~substitution-map (quote ~form))))
&lt;/pre&gt;
&lt;p&gt;Compared to syntax-quote, this has two restrictions: it has no splicing, and it admits only symbols after a tilde, not arbitrary expressions. The &lt;code&gt;template&lt;/code&gt; macro takes a let-like vector as its first argument. This vector contains the symbol-value pairs for substitution inside the template. The second argument is the template form, which presumably contains tilde-prefixed symbols for substitution. Note that the Clojure reader translates &lt;code&gt;~x&lt;/code&gt; to &amp;lt;code (clojure.core/unquote x)&lt;/p&gt;, which is what the above code searches for.
&lt;p&gt;Here is an example for using such templates:&lt;/p&gt;
&lt;pre&gt;
(defmacro foo [typename fieldname]
  (template [type  typename
	     field fieldname]
    (deftype ~type
      [~field])))

(foo bar boo)

(bar 42)
&lt;/pre&gt;
&lt;p&gt;This prints &lt;code&gt;#:bar{:boo 2}&lt;/code&gt;, illustrating that the macros does what it is expected to do. Of course this is not the perfect example for the utility of my little template instantiation system, as it could just as well be written using syntax-quote!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/onclojure.wordpress.com/86/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/onclojure.wordpress.com/86/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/onclojure.wordpress.com/86/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/onclojure.wordpress.com/86/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/onclojure.wordpress.com/86/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/onclojure.wordpress.com/86/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/onclojure.wordpress.com/86/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/onclojure.wordpress.com/86/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/onclojure.wordpress.com/86/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/onclojure.wordpress.com/86/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=onclojure.com&amp;amp;blog=5872423&amp;amp;post=86&amp;amp;subd=onclojure&amp;amp;ref=&amp;amp;feed=1&quot; /&gt;</content>
		<author>
			<name>khinsen</name>
			<uri>http://onclojure.com</uri>
		</author>
		<source>
			<title type="html">On Clojure</title>
			<subtitle type="html">A blog about everything Clojure</subtitle>
			<link rel="self" href="http://onclojure.wordpress.com/feed/atom/"/>
			<id>http://onclojure.com/feed/atom/</id>
			<updated>2010-03-05T18:30:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Episode 12 - Equations</title>
		<link href="http://vimeo.com/channels/fulldisclojure#9666573"/>
		<id>tag:vimeo,2010-02-23:clip9666573</id>
		<updated>2010-02-23T07:28:57+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://vimeo.com/9666573&quot; title=&quot;Episode 12 - Equations&quot;&gt;&lt;img src=&quot;http://ts.vimeo.com.s3.amazonaws.com/485/216/48521697_200.jpg&quot; alt=&quot;Episode 12 - Equations&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In this episode I demonstrate how to use macros &amp;amp; Newton's method to numerically solve any equation for any variable.&lt;br /&gt;
&lt;br /&gt;
The code is available here&lt;br /&gt;
&lt;a href=&quot;http://github.com/francoisdevlin/Full-Disclojure/blob/master/src/episode_012/episode_012.clj&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;github.com/francoisdevlin/Full-Disclojure/blob/master/src/episode_012/episode_012.clj&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;Cast: &lt;a href=&quot;http://vimeo.com/seandevlin&quot;&gt;Sean Devlin&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Sean Devlin</name>
			<uri>http://vimeo.com/channels/fulldisclojure</uri>
		</author>
		<source>
			<title type="html">Vimeo / Full Disclojure</title>
			<subtitle type="html">NOW UPDATED TUESDAYS!

This is a series of videos designed to help teach the Clojure language.

Questions/suggestions for episodes?  Email me!

fulldisclojure@gmail.com

Full Disclojure is available under Creative Commons  by-nc-sa</subtitle>
			<link rel="self" href="http://vimeo.com/channels/fulldisclojure/videos/rss"/>
			<id>http://vimeo.com/channels/fulldisclojure/videos/rss</id>
			<updated>2010-03-16T05:00:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Today in the Intertweets (Feb 22nd Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/nvcpWw1-jtI/"/>
		<id>http://disclojure.org/?p=685</id>
		<updated>2010-02-23T07:13:01+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;My new clojure project is now up &lt;a href=&quot;http://github.com/tashafa/nozzle&quot;&gt;http://github.com/tashafa/nozzle&lt;/a&gt; Let me know what you think (via @&lt;a href=&quot;http://twitter.com/ashafa&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ashafa's Twitter Profile&quot;&gt;ashafa&lt;/a&gt;) &amp;#8212; Nozzle is a Clojure library for streaming statuses from the &amp;#8220;Twitter Streaming API.&amp;#8221;&lt;/li&gt;
&lt;li&gt;pushed full rewrite of cascading-clojure to master this morning. co-authors @&lt;a href=&quot;http://twitter.com/mmcgrana&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View mmcgrana's Twitter Profile&quot;&gt;mmcgrana&lt;/a&gt; @&lt;a href=&quot;http://twitter.com/nathanmarz&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View nathanmarz's Twitter Profile&quot;&gt;nathanmarz&lt;/a&gt; (&lt;a href=&quot;http://github.com/bradford/cascading-clojure&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/bradfordcross&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View bradfordcross's Twitter Profile&quot;&gt;bradfordcross&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;New chapter 4 for Clojure in Action: Polymorphism with Multimethods (&lt;a href=&quot;http://www.manning.com/rathore/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/ManningBooks&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ManningBooks's Twitter Profile&quot;&gt;ManningBooks&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Third draft of new #&lt;a href=&quot;http://search.twitter.com/search?q=%23Clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Clojure&amp;quot;&quot;&gt;Clojure&lt;/a&gt; testing framework (&lt;a href=&quot;http://github.com/stuartsierra/lazytest&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/stuartsierra&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View stuartsierra's Twitter Profile&quot;&gt;stuartsierra&lt;/a&gt;) &amp;#8212; This time with documentation, so you don&amp;#8217;t have to read all the code to figure out how it works ;)&lt;/li&gt;
&lt;li&gt;clojureql redesigned (&lt;a href=&quot;http://www.gitorious.org/clojureql/pages/FrontendReworked&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/wmacgyver&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View wmacgyver's Twitter Profile&quot;&gt;wmacgyver&lt;/a&gt;) &amp;#8212; ClojureQL, a clojure library for interacting with SQL databases is up for a re-design of it&amp;#8217;s query DSL. This article explains what the changes are. The end result seems much cleaner.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=nvcpWw1-jtI:czvjToUs_ws:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=nvcpWw1-jtI:czvjToUs_ws:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=nvcpWw1-jtI:czvjToUs_ws:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=nvcpWw1-jtI:czvjToUs_ws:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=nvcpWw1-jtI:czvjToUs_ws:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=nvcpWw1-jtI:czvjToUs_ws:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=nvcpWw1-jtI:czvjToUs_ws:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/nvcpWw1-jtI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">mwmeyer</title>
		<link href="http://mired.wordpress.com/2010/02/23/phrase-groups-in-clojure/"/>
		<id>http://mired.wordpress.com/?p=117</id>
		<updated>2010-02-23T01:05:59+00:00</updated>
		<content type="html">&lt;br /&gt;&lt;p&gt;A recent interview with yags* consisted of solving problems and writing demo code for them, which is pretty standard for a gs. One of the problems captured my attention, because it looked like a perfect problem to explore the strengths and weaknesses of clojure.&lt;/p&gt;
&lt;p&gt;The problem is simple enough to state: Given a set of lists of words, remove every &lt;em&gt;phrase group&lt;/em&gt; that occurs in all the lists. A &lt;em&gt;phrase group&lt;/em&gt; is any sequence of three or more words in a row. Two things make this interesting for clojure: 1) it&amp;#8217;s a purely functional problem: the output result depends only on the input values, and 2) it involves manipulating relatively deep structures &amp;#8211; at least in the solution I came up with. That is something working with immutable data structures typically makes painful.&lt;/p&gt;
&lt;p&gt;Since I&amp;#8217;m still exploring clojure, I chose to do this in Python in the interview. The code here &amp;#8211; and in the &lt;a href=&quot;http://bitbucket.org/mwm/mired-in-code/src/tip/clojure/phrase-groups.clj&quot;&gt;repository at bitbucket&lt;/a&gt; &amp;#8211; uses the same algorithm, expressed with the high-level data structures of clojure instead of Python.&lt;/p&gt;
&lt;p&gt;First, a couple of short helper functions:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure;&quot;&gt;
(defn mfilter
  &amp;quot;Return a hash-map built by removing entries for which (pred (key entry))
  returns false from mapin.&amp;quot;
  [pred mapin]
  (apply hash-map (apply concat (filter #(pred (key %)) mapin))))

(defn enumerate
  &amp;quot;Return pairs of an index into sequence, and the value at that index&amp;quot;
  [sequence]
  (map vector (iterate inc 0) sequence))
&lt;/pre&gt;
&lt;p&gt;As the document string for mfilter says, it returns a copy of a hash-map built from a map by removing entries for which the predicate applied to the key is false. Likewise, enumerate counts the elements in a sequence, starting at 0, and returns pairs of them and the counter.&lt;/p&gt;
&lt;p&gt;Note that we only have to worry about phrases of length three. A phrase of length 4 will show up as two phrases of length three with an overlap, and one of length five as three such phrases, all overlapping. So we can ignore phrases longer than three words. And of course, phrases shorter than three words aren&amp;#8217;t &lt;em&gt;phrase groups&lt;/em&gt;, so we ignore them as well.  So the list of phrases in an input list is a list triples that has two fewer elements than the input list, as the last two elements don&amp;#8217;t start phrases.&lt;/p&gt;
&lt;p&gt;The data structure used for my solution is a dictionary, index by phrase groups &amp;#8211; meaning triples of words. Each entry is also a dictionary, indexed by an input lists index in the list of input lists. The entries in those dictionaries is a list of places that that phrase group starts in the input list. I&amp;#8217;m going to call this the phrase dictionary.&lt;/p&gt;
&lt;p&gt;That leads us to the first building block function, which accepts a phrase dictionary and a  phrase, along with the index of a list and the index of that phrase in the list, and returns the update phrase dictionary:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure;&quot;&gt;
(defn add-phrase-to-phrase-dict [so-far phrase list-index phrase-index]
  (if (or (so-far phrase) (= list-index 0))
    (update-in so-far [phrase list-index] conj phrase-index)
    so-far))
&lt;/pre&gt;
&lt;p&gt;This uses the clojure function &lt;code&gt;update-in&lt;/code&gt;, which is something I don&amp;#8217;t ever remember seeing in a lisp before (though cl&amp;#8217;s &lt;code&gt;setf&lt;/code&gt; might be close). It finds an element in a nested structure &amp;#8211; like the phrase dictionary &amp;#8211; using it&amp;#8217;s first argument, which is a sequence of indices into the structure. That&amp;#8217;s &lt;code&gt;[phrase list-index] &lt;/code&gt;, so this finds the list of places where &lt;code&gt;phrase&lt;/code&gt; appears in the input list &lt;code&gt;list-index&lt;/code&gt;. Further, if the elements aren&amp;#8217;t there, it creates the intermediate map needed, and return nils if the last lookup fails. The resulting value gets passed to the second argument, along with any remaining arguments, and the result of that call is used in this position in the new version of the structure that is returned. While this might sound expensive, since everything in the structure is immutable, the two versions can actually share everything but the values along the path to the updated value.&lt;/p&gt;
&lt;p&gt;The conditional application of &lt;code&gt;update-in&lt;/code&gt; is an optimization. If the phrase we&amp;#8217;re updating isn&amp;#8217;t in the dictionary, we want two different behaviors:  if this is the first input list, we want to add that phrase to the dictionary. Otherwise, we can ignore the phrase, because it isn&amp;#8217;t in at least one input list &amp;#8211; the first one. Adding it won&amp;#8217;t change the final result, but will generate more work. So we check for it there, and then only add it if this is the first input list. The alternative case returns the input phrase dictionary unmodified.&lt;/p&gt;
&lt;p&gt;We now need to invoke this function on every phrase in every input list. Let&amp;#8217;s start with a function to invoke it on every phrase in a single input list:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure;&quot;&gt;
(defn add-list-to-phrase-dict [phrase-dict phrase list-index phrase-index]
  (reduce (fn [phrase-dict [phrase-index phrase]]
	    (add-phrase-to-phrase-dict phrase-dict phrase list-index phrase-index))
	  phrase-dict
	  (enumerate (map vector list (rest list) (rest (rest list))))))
&lt;/pre&gt;
&lt;p&gt;As input, we get the phrase dictionary we&amp;#8217;re going to update, the index of the input list in the list of lists, and the input list itself. Wanting to update a value based on processing values in a list is what the lisp function &lt;code&gt;reduce&lt;/code&gt; is for. It takes a function, an initial value, and a list, then calls that function with the initial value and each element in the list. So our function &amp;#8211; introduced by &lt;code&gt;(fn&lt;/code&gt; &amp;#8211; takes two arguments, a phrase dict and a pair of phrase-index and phrase, and returns the result of calling add-phrase-to-phrase-dict with them and the input list values. The initial value is the input phrase dictionary. We generate the phrase list by mapping &lt;code&gt;vector&lt;/code&gt; over the input list, and the results of removing the first and then second element from it, giving three-element vectors of three consecutive words &amp;#8211; which are our phrases. Again, the primitive does the right thing for us, and stops producing maps when the last list runs out, so the last two words in the initial input list don&amp;#8217;t start phrases. We pass that list to enumerate to get the index and phrase pairs we need.&lt;/p&gt;
&lt;p&gt;Given that, we basically repeat the same construct to deal with all the input lists:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure;&quot;&gt;
(defn build-phrase-dict [lists]
  (let [phrase-dict (reduce (fn [phrase-dict [list-index list]]
			      (add-list-to-phrase-dict phrase-dict
						       list-index list))
			    {}
			    (enumerate lists))
	list-count (count lists)]
    (mfilter #(= (count (val %)) list-count) phrase-dict)))
&lt;/pre&gt;
&lt;p&gt;The input is a sequence of lists. That&amp;#8217;s the sequence we reduce over here, once again passing it to enumerate to generate our indices. This time, the initial value is an empty map. The most important change is that, instead of returning the result of &lt;code&gt;reduce&lt;/code&gt; directly, we use the &lt;code&gt;mfilter&lt;/code&gt; function defined earlier to remove any elements that don&amp;#8217;t have as many entries as we had input lists. That&amp;#8217;s the criteria for inclusion &amp;#8211; that the phrase be in every list. If it isn&amp;#8217;t in some list, then it&amp;#8217;s dictionary entry won&amp;#8217;t have an entry for that list, and hence the count won&amp;#8217;t match the length of the list of lists. &lt;/p&gt;
&lt;p&gt;That&amp;#8217;s the first half the problem &amp;#8211; building up the phrase dictionary. We now need to use that to remove the phrases from the input lists. Oddly enough, the phrases themselves don&amp;#8217;t matter &amp;#8211; we just care about their positions. So we write a function that takes the list of phrase positions, and removes them from a list:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure;&quot;&gt;
(defn remove-phrases-from-list [phrase-starts list]
  (mfilter (fn [[x _]] (not-any? #(and (&amp;gt;= x %) (&amp;lt; x (+ % 3))) phrase-starts))
	   (apply sorted-map (mapcat vector (iterate inc 0) list))))
&lt;/pre&gt;
&lt;p&gt;Here's the second &lt;code&gt;mfilter&lt;/code&gt; &amp;#8211; this time, it&amp;#8217;s remove words from the list. We start by creating a sorted map indexed by word position of the words in the list. Then &lt;code&gt;mfilter&lt;/code&gt; uses &lt;code&gt;not-any?&lt;/code&gt; to check each word&amp;#8217;s position against the phrase start positions, specifically that the position is not greater than the start position and less than three plus the start posistion. If a position falls into that range for any phrase in the &lt;code&gt;phrase-starts&lt;/code&gt; list, it&amp;#8217;s removed.&lt;/p&gt;
&lt;p&gt;So all that&amp;#8217;s left is printing the result:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure;&quot;&gt;
(defn remove-shared-phrases [lists]
  (let [phrases (apply merge-with concat (vals (build-phrase-dict lists)))]
    (doseq [[idx list] (enumerate lists)]
      (println (vals (remove-phrases-from-list (phrases idx) list))))))
&lt;/pre&gt;
&lt;p&gt;This actually combines everything so far: building the phrase dictionary from the list, extracting the list of phrase positions from that, using &lt;code&gt;merge-with&lt;/code&gt; to concat the lists in each of the element dictionaries into a single list for each file, then using &lt;code&gt;doseq&lt;/code&gt; to call &lt;code&gt;println&lt;/code&gt; on the result of removing the phrases in each list from the list. At this point, we see why the output map was a sorted-map: that forces the results of each list to print in the proper order.&lt;/p&gt;
&lt;p&gt;All in all, this has been an illuminating exercise. Clojure&amp;#8217;s functions for dealing with deep structures and non-list structures work very well with them, providing what is still a very Lisp-like environment, even though we&amp;#8217;re not working with lists. In particular, the handling of what in python were special cases is right by default, which feels very much like classic lisp behavior. I&amp;#8217;d say Clojure held up very well here.&lt;/p&gt;
&lt;p&gt;*) That would be Yet Another Google Spinoff.&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/mired.wordpress.com/117/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mired.wordpress.com/117/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/mired.wordpress.com/117/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mired.wordpress.com/117/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/mired.wordpress.com/117/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mired.wordpress.com/117/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/mired.wordpress.com/117/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mired.wordpress.com/117/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/mired.wordpress.com/117/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mired.wordpress.com/117/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mired.wordpress.com&amp;amp;blog=1432062&amp;amp;post=117&amp;amp;subd=mired&amp;amp;ref=&amp;amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Mike Meyer</name>
			<uri>http://mired.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Mired in code</title>
			<subtitle type="html">An ongoing blog of my programming interests.</subtitle>
			<link rel="self" href="http://mired.wordpress.com/feed/"/>
			<id>http://mired.wordpress.com/feed/</id>
			<updated>2010-02-23T20:30:20+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Redis-Clojure (unknown severity): authentication doesn't work</title>
		<link href="http://github.com/ragnard/redis-clojure/issues/#issue/9"/>
		<id>http://github.com/ragnard/redis-clojure/issues/#issue/9</id>
		<updated>2010-02-23T00:00:00+00:00</updated>
		<content type="html">Redis-Clojure (unknown severity): authentication doesn't work</content>
		<author>
			<name>BugSpy</name>
			<uri>http://bugspy.net</uri>
		</author>
		<source>
			<title type="html">BugSpy.net - Reports By Tag: clojure</title>
			<link rel="self" href="http://bugspy.net/tag/clojure/?format=rss"/>
			<id>http://bugspy.net/tag/clojure/?format=rss</id>
			<updated>2010-03-16T05:00:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Futures and promises in Clojure (asynchronicity and concurrency, part 2)</title>
		<link href="http://www.michaelharrison.ws/weblog/?p=239"/>
		<id>http://www.michaelharrison.ws/weblog/?p=239</id>
		<updated>2010-02-22T22:42:33+00:00</updated>
		<content type="html">&lt;p&gt;A few weeks ago I posted about my initial impressions of &lt;a href=&quot;http://www.michaelharrison.ws/weblog/?p=198&quot;&gt;CommonJS&amp;#8217;s approach to concurrency&lt;/a&gt;, in particular the use of promises. Today I add my look at promises and futures in Clojure.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m aware that I&amp;#8217;m kind of writing these blog posts backwards. I&amp;#8217;m learning more as I go, which means before I&amp;#8217;m done I will no doubt regret things I have written in these opening posts. Oh well.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-239&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Clojure offers more than one option for achieving concurrency. Whereas CommonJS embraces asynchronous processes, Clojure offers the programmer a choice of synchronized or asynchronized tools for concurrency. And whereas JavaScript doesn&amp;#8217;t offer you the opportunity to spawn your own threads, Clojure most definitely offers you threads. Clojure 1.1 has added abstractions for promises and futures, and Clojure&amp;#8217;s multithreaded environment colors their usage.&lt;/p&gt;
&lt;p&gt;In Clojure, as in CommonJS, a promise is also a stand-in for an asynchronously-computed value. As Rich Hickey explains in his &lt;a href=&quot;http://github.com/richhickey/clojure/blob/1.1.x/changes.txt&quot;&gt;change notes for the 1.1 release&lt;/a&gt;: &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;A promise is a synchronization construct that can be used to deliver a value from one thread to another. Until the value has been delivered, any attempt to dereference the promise will block.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;A future, however, represents a unit of computation that can be executed on another thread. &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Futures represent asynchronous computations. They are a way to get code to run in another thread, and obtain the result.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Sean Devlin, the creator of the excellent screencasts at &lt;a href=&quot;http://vimeo.com/channels/fulldisclojure&quot;&gt;Full Disclojure&lt;/a&gt;, has a &lt;a href=&quot;http://www.vimeo.com/8320428&quot;&gt;screencast covering promises and futures&lt;/a&gt;. He offers some examples:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(def a-promise (promise))&lt;br /&gt;
(deliver a-promise :fred)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(def f (future (some-sexp)))&lt;br /&gt;
(deref f) ; blocks the thread that derefs f until value is available&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a lot of commentary out there, especially on this &lt;a href=&quot;http://bit.ly/discuss-clj-future-promise&quot;&gt;thread from the Clojure Google group&lt;/a&gt; in which different use cases for the abstractions are offered.  Here are some highlights:&lt;/p&gt;
&lt;p&gt;Laurent Petit offers this explanation of the virtues of futures and promises:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;It&amp;#8217;s an easy way to make a computation done in thread A (and using a pre-declared promise) block until thread B has delivered the promise (given it its value).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Sean Devlin adds that they are useful in dealing with mechanical objects. Instead of a while-loop to wait for an external condition to be satisfied, you can block on the value of a promise while a separate process devoted to detecting this desired condition delivers a value to the promise when and if the desired condition is met.&lt;/p&gt;
&lt;p&gt;Finally, the venerable Chouser offers another example of blocking: setting a promise and then making an RPC call that delivers its result to the promise when it is complete.&lt;/p&gt;
&lt;h3&gt;Some general background: Dataflow concurrency&lt;/h3&gt;
&lt;p&gt;Rich Hickey, in his Clojure 1.1 release notes, and Laurent Petit, on the Clojure mailing list, point out that promises and futures support dataflow programming. Dataflow programming is laid out in some detail in a 900-page textbook. There are also less complete explanations of it online.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://en.wikipedia.org/wiki/Dataflow#Concurrency&quot;&gt;wikipedia entry for dataflow concurrency&lt;/a&gt; is predictably terse and dense.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;A dataflow network is a network of concurrently executing processes or automata that can communicate by sending data over channels (see message passing.)
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I found &lt;a href=&quot;http://docs.codehaus.org/display/GPARS/Dataflow&quot;&gt;the description of dataflow concurrency in Groovy by the folks at Codehaus&lt;/a&gt; very illuminating. Basically, they define three tasks, each of which determines a value for one of three DataFlowVariables x, y, and z. &lt;/p&gt;
&lt;p&gt;These run in parallel, and, it&amp;#8217;s implied, the first task is blocked until a value for z is available. Once that&amp;#8217;s accomplished, the println line executes.&lt;/p&gt;
&lt;p&gt;In Clojure, then, would x, y, and z be promises, and the tasks be closures sent to agents?&lt;/p&gt;
&lt;p&gt;Yep.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;So this is a nice way to parallelize computation. One thread can hold the final piece of the computation and wait for others to deliver values to the promise(s) it needs. These other threads can similarly wait on other ones. This seems to replace the use of &lt;code&gt;await&lt;/code&gt; for agents, at least in some cases.&lt;/p&gt;
&lt;p&gt;Strangely, I get this example better than the ones that just sleep threads and print &amp;#8220;here I am&amp;#8221; messages. Have I become math-biased? If so, I blame &lt;a href=&quot;http://mitpress.mit.edu/sicp/&quot;&gt;SICP&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Next up: promises and futures in wordy languages&lt;/h3&gt;
&lt;p&gt;I started out talking about promises in JavaScript. Next time, I hope to say a few things about the uses of futures in C# and Java to accomplish concurrent tasks. These concepts are clearly important for anyone who wants to understand concurrency beyond specific implementations and recipes in one language or another.&lt;/p&gt;</content>
		<author>
			<name>Michael Harrison</name>
			<uri>http://www.michaelharrison.ws/weblog</uri>
		</author>
		<source>
			<title type="html">Autodidact » clojure</title>
			<subtitle type="html">Learning by Doing</subtitle>
			<link rel="self" href="http://www.michaelharrison.ws/weblog/?cat=26&amp;feed=rss2"/>
			<id>http://www.michaelharrison.ws/weblog/?cat=26&amp;feed=rss2</id>
			<updated>2010-02-22T23:00:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Redesigning ClojureQL's Frontend</title>
		<link href="http://whollyweirdwyrd.blogspot.com/2010/02/redesigning-clojureqls-frontend.html"/>
		<id>tag:blogger.com,1999:blog-5409861124354728237.post-411323033382356452</id>
		<updated>2010-02-22T17:02:56+00:00</updated>
		<content type="html">&lt;p&gt;I've not updated this blog in a while as I've been pretty busy for thepast few weeks. I've got many projects on the table and one of them isstarting to get really interesting. I'm obviously talking about thesubject of this post,&lt;a href=&quot;http://www.gitorious.org/clojureql/&quot;&gt;ClojureQL&lt;/a&gt;. I've mainly beenworking on the backend since the end of last year. In the meantime,Meikel has started a&lt;a href=&quot;http://clojureql.lighthouseapp.com/projects/34981/tickets/33&quot;&gt;rework&lt;/a&gt;of the frontend to provide a cleaner API, free from the magicalartifacts introduced by using macros like in the current (0.9.7)version. This rework have been triggered by a&lt;a href=&quot;http://zef.me/2637/on-language-design-my-problem-with-clojureql&quot;&gt;post&lt;/a&gt;carefully explaining the issue, courtesy of Zef.&lt;/p&gt;&lt;p&gt;I won't go further than a linkfest so here are the important links forthose interested in the future of ClojureQL:&lt;/p&gt;&lt;ul&gt;&lt;li&gt; &lt;a href=&quot;http://www.gitorious.org/clojureql/clojureql/commits/frontend-2.0&quot;&gt;Gitorious Frontend Rework branch&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.gitorious.org/clojureql/pages/FrontendReworked&quot;&gt;Frontend Rework Wiki Page&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.gitorious.org/clojureql/pages/DdlFrontendReworked&quot;&gt;DDL Frontend Rework Wiki Page&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&quot;http://www.gitorious.org/clojureql/pages/DataTypes&quot;&gt;Data Types Wiki Page&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We're also ready to receive your suggestions on the brand new&lt;a href=&quot;http://groups.google.com/group/clojureql&quot;&gt;clojureql group&lt;/a&gt;. Please,visit the Wiki pages and tell us about what you think.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/5409861124354728237-411323033382356452?l=whollyweirdwyrd.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>budu</name>
			<email>nbuduroi@gmail.com</email>
			<uri>http://whollyweirdwyrd.blogspot.com/search/label/clojure</uri>
		</author>
		<source>
			<title type="html">Mu</title>
			<subtitle type="html">Zen and the art of...</subtitle>
			<link rel="self" href="http://whollyweirdwyrd.blogspot.com/feeds/posts/default/-/clojure"/>
			<id>tag:blogger.com,1999:blog-5409861124354728237</id>
			<updated>2010-03-12T20:30:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">This weekend in the Intertweets (Feb 21st Ed)</title>
		<link href="http://feedproxy.google.com/~r/disclojure/~3/dWfyy4S9Tcg/"/>
		<id>http://disclojure.org/?p=679</id>
		<updated>2010-02-22T08:32:04+00:00</updated>
		<content type="html">&lt;ul&gt;
&lt;li&gt;Overtone is a #&lt;a href=&quot;http://search.twitter.com/search?q=%23Clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Clojure&amp;quot;&quot;&gt;Clojure&lt;/a&gt; based musical generation and manipulation system for live-coding and more (&lt;a href=&quot;http://github.com/rosejn/overtone&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/8quashes&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View 8quashes's Twitter Profile&quot;&gt;8quashes&lt;/a&gt;) &amp;#8212; Wraps &lt;a href=&quot;http://supercollider.sourceforge.net/&quot;&gt;Super Collider&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Looking forward to the #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; namespace management overhaul (&lt;a href=&quot;http://groups.google.com/group/clojure-dev/browse_thread/thread/46559fd9eb127bdd&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/RickMoynihan&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View RickMoynihan's Twitter Profile&quot;&gt;RickMoynihan&lt;/a&gt;) &amp;#8212; There are a few proposals out there to tidy up a little bit the namespace management. :use is considered harmful as it imports by default all the symbols in the imported package. Here are discussed some of the proposed solutions.&lt;/li&gt;
&lt;li&gt;Software Transactional Memory in JRuby using Cloby (&lt;a href=&quot;http://developer-in-test.blogspot.com/2010/02/software-transactional-memory-in-jruby.html&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/sai_venkat&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View sai_venkat's Twitter Profile&quot;&gt;sai_venkat&lt;/a&gt;) &amp;#8212; This is about using &lt;a href=&quot;http://github.com/headius/cloby/&quot;&gt;Cloby&lt;/a&gt; (by @&lt;a href=&quot;http://twitter.com/headius&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View headius's Twitter Profile&quot;&gt;headius&lt;/a&gt;, of JRuby fame) that allows using Clojure&amp;#8217;s STM in Ruby.&lt;/li&gt;
&lt;li&gt;Byte-spec: a declarative DSL for reading and writing binary file formats in #&lt;a href=&quot;http://search.twitter.com/search?q=%23Clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Clojure&amp;quot;&quot;&gt;Clojure&lt;/a&gt; (&lt;a href=&quot;http://github.com/rosejn/byte-spec&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/8quashes&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View 8quashes's Twitter Profile&quot;&gt;8quashes&lt;/a&gt;) &amp;#8212; Load and parse binary files the functional way.&lt;/li&gt;
&lt;li&gt;2nd draft of new #&lt;a href=&quot;http://search.twitter.com/search?q=%23Clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;Clojure&amp;quot;&quot;&gt;Clojure&lt;/a&gt; test framework (&lt;a href=&quot;http://paste.lisp.org/display/95188#1&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/stuartsierra&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View stuartsierra's Twitter Profile&quot;&gt;stuartsierra&lt;/a&gt;) &amp;#8212; Stuart Sierra is working on a new testing framework for clojure. This new version is targeted at Clojure 1.2 as it uses some if its new features.&lt;/li&gt;
&lt;li&gt;Writeup about my #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; RPG so far (with video) (&lt;a href=&quot;http://briancarper.net/blog/making-an-rpg-in-clojure-part-one-of-many&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/BrianCarper&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View BrianCarper's Twitter Profile&quot;&gt;BrianCarper&lt;/a&gt;) &amp;#8212; Great post about Brian&amp;#8217;s experiences in writing this RPG game in Clojure. It covers concurrency, OpenGL and making things move smoothly. If there is anything that summarizes this post for me is the following: &amp;#8220;Clojure is a mostly functional language, in the sense of strongly discouraging unnecessary use of mutable state, and this program is no different&amp;#8221;&lt;/li&gt;
&lt;li&gt;Applescript with Clojure (&lt;a href=&quot;http://nakkaya.com/2010/02/21/applescript-with-clojure/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/bubbl&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View bubbl's Twitter Profile&quot;&gt;bubbl&lt;/a&gt;) &amp;#8212; Title says it all.  Now you can control your iTunes from Clojure (that is, if you own a Mac)&lt;/li&gt;
&lt;li&gt;Some reflections on my first few weeks of heavy Clojure usage (&lt;a href=&quot;http://tech.puredanger.com/2010/02/21/clojure-experience/&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/puredanger&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View puredanger's Twitter Profile&quot;&gt;puredanger&lt;/a&gt;) &amp;#8212; Looks like we have another convert :) Main point? Can go from thoughts to code without having to create boilerplate code.&lt;/li&gt;
&lt;li&gt;creating a simple game in #&lt;a href=&quot;http://search.twitter.com/search?q=%23clojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;clojure&amp;quot;&quot;&gt;clojure&lt;/a&gt; (&lt;a href=&quot;http://ideolalia.com/creating-a-simple-game-in-clojure&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/ztellman&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View ztellman's Twitter Profile&quot;&gt;ztellman&lt;/a&gt;) &amp;#8212; Yet another game, this time using &lt;a href=&quot;http://github.com/ztellman/penumbra&quot;&gt;Penumbra&lt;/a&gt; to create the OpenGL code. The article is from the author of Penumbra himself. This article describes the design of this Asteroids game in Clojure. A very nice read!&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Notes on upcoming #&lt;a href=&quot;http://search.twitter.com/search?q=%23compojure&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;Search Twitter for &amp;quot;compojure&amp;quot;&quot;&gt;compojure&lt;/a&gt; 0.4 (&lt;a href=&quot;http://groups.google.com/group/compojure/msg/519e8fd5cd76dacb&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/wmacgyver&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View wmacgyver's Twitter Profile&quot;&gt;wmacgyver&lt;/a&gt;) &amp;#8212; Summary: More reliance on Ring for all things HTTP (some features have been crossported from Compojure to Ring), some of the libraries (HTML, routing) have been pulled from Compojure into their own libraries, and a change of syntax in how Servlet data is obtained.&lt;/li&gt;
&lt;li&gt;join me&amp;#8230; in the *future* (starting to build the pieces for a Clojure enterprise CMS) (&lt;a href=&quot;http://github.com/acfoltzer/cljcr&quot;&gt;here&lt;/a&gt;, via @&lt;a href=&quot;http://twitter.com/acfoltzer&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; title=&quot;View acfoltzer's Twitter Profile&quot;&gt;acfoltzer&lt;/a&gt;) &amp;#8212; A wrapper to JCR-283: Java Content Repository.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=dWfyy4S9Tcg:wYreLQJtdmk:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=dWfyy4S9Tcg:wYreLQJtdmk:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=dWfyy4S9Tcg:wYreLQJtdmk:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=dWfyy4S9Tcg:wYreLQJtdmk:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=dWfyy4S9Tcg:wYreLQJtdmk:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/disclojure?a=dWfyy4S9Tcg:wYreLQJtdmk:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/disclojure?i=dWfyy4S9Tcg:wYreLQJtdmk:gIN9vFwOqvQ&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/disclojure/~4/dWfyy4S9Tcg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Toni Batchelli</name>
			<uri>http://disclojure.org</uri>
		</author>
		<source>
			<title type="html">disclojure: all things clojure</title>
			<subtitle type="html">public disclosure of all things Clojure</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/disclojure"/>
			<id>http://feeds.feedburner.com/disclojure</id>
			<updated>2010-03-15T08:30:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">liebke</title>
		<link href="http://data-sorcery.org/2010/02/22/repo/"/>
		<id>http://data-sorcery.org/?p=1472</id>
		<updated>2010-02-22T00:55:14+00:00</updated>
		<content type="html">&lt;p&gt;It&amp;#8217;s been a long time coming, but &lt;a href=&quot;http://incanter.org&quot;&gt;Incanter&lt;/a&gt; is available in a public code repository (&lt;a href=&quot;http://repo.incanter.org&quot;&gt;http://repo.incanter.org&lt;/a&gt;) once again. &lt;/p&gt;
&lt;p&gt;The version available in the &lt;a href=&quot;http://clojars.org&quot;&gt;Clojars&lt;/a&gt; repository has grown increasingly out of date, but couldn&amp;#8217;t be updated due to Incanter&amp;#8217;s new modular build structure; a structure that lets developers include only the subset of Incanter functionality that they need. &lt;/p&gt;
&lt;p&gt;For instance, if you only need the functionality found in incanter.core and incanter.stats, then include the incanter-core dependency in your project.clj file. If you need charts but, not Processing visualizations, include incanter-charts. If you want access to the incanter.chrono library, but nothing else, use the incanter-chrono dependency.&lt;/p&gt;
&lt;p&gt;Instructions for building Leiningen-based projects using the repository are available on the Incanter repo&amp;#8217;s homepage, &lt;a href=&quot;http://repo.incanter.org&quot;&gt;http://repo.incanter.org&lt;/a&gt;.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/incanter.wordpress.com/1472/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/incanter.wordpress.com/1472/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/incanter.wordpress.com/1472/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/incanter.wordpress.com/1472/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/incanter.wordpress.com/1472/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/incanter.wordpress.com/1472/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/incanter.wordpress.com/1472/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/incanter.wordpress.com/1472/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/incanter.wordpress.com/1472/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/incanter.wordpress.com/1472/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=data-sorcery.org&amp;amp;blog=7974443&amp;amp;post=1472&amp;amp;subd=incanter&amp;amp;ref=&amp;amp;feed=1&quot; /&gt;</content>
		<author>
			<name>David Edgar Liebke</name>
			<uri>http://data-sorcery.org</uri>
		</author>
		<source>
			<title type="html">Data Sorcery with Clojure</title>
			<link rel="self" href="http://incanter-blog.org/feed/"/>
			<id>http://incanter-blog.org/feed/</id>
			<updated>2010-03-04T02:30:20+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Plotting time series data with Incanter</title>
		<link href="http://jakemccrary.com/blog/2010/02/21/plotting-time-series-data-with-incanter/"/>
		<id>http://jakemccrary.com/blog/?p=69</id>
		<updated>2010-02-22T00:33:30+00:00</updated>
		<content type="html">&lt;p&gt;    &lt;!--       body {         color: #D3D7CF;         background-color: #333333;       }       .builtin {         /* font-lock-builtin-face */         color: #5cacee;       }       .function-name {         /* font-lock-function-name-face */         color: #eec900;       }       .keyword {         /* font-lock-keyword-face */         color: #ee9a00;       }       .string {         /* font-lock-string-face */         color: #65A63A;       }       a {         color: inherit;         background-color: inherit;         font: inherit;         text-decoration: inherit;       }       a:hover {         text-decoration: underline;       }     --&gt;&lt;/p&gt;

&lt;p&gt;Recently I found myself wanting to plot some time series data and wanted to do this in &lt;a href=&quot;http://clojure.org&quot; target=&quot;_blank&quot;&gt;Clojure&lt;/a&gt;. Unfortunately &lt;a href=&quot;http://incanter.org/&quot; target=&quot;_blank&quot;&gt;Incanter&lt;/a&gt;, a good statistical and graphics library for Clojure, did not provide a way to plot data where the x-axis is a time value. A quick fork on github and a pull request later and now Incanter does. Since I added this functionality I thought I would write up a short example of using it.&lt;/p&gt;
&lt;p&gt;The example time series data I&amp;#8217;m using I took from &lt;a href=&quot;http://finance.yahoo.com/q/hp?s=YHOO&amp;amp;a=03&amp;amp;b=12&amp;amp;c=1996&amp;amp;d=01&amp;amp;e=20&amp;amp;f=2010&amp;amp;g=d&quot; target=&quot;_blank&quot;&gt;Yahoo&amp;#8217;s finance section&lt;/a&gt;. At the bottom of that page there is a link to download the table as a csv file. That is the data used in this example.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m using the &lt;strong&gt;read-dataset&lt;/strong&gt; function provided by Incanter.  This procedure reads a delimited file (or URL) and returns an Incanter dataset.&lt;/p&gt;
&lt;pre&gt;
(&lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function-name&quot;&gt;yhoo&lt;/span&gt; (read-dataset &quot;table.csv&quot; &lt;span class=&quot;builtin&quot;&gt;:header&lt;/span&gt; true))
&lt;/pre&gt;
&lt;p&gt;Yahoo stores the date in a yyyy-mm-dd format.  I need to convert that to milliseconds from the epoch so it can be used in &lt;strong&gt;time-series-plot&lt;/strong&gt; as the x-axis data. To do this I wrote a function which takes the string representation of the date, splits in on &amp;#8220;-&amp;#8221;, then use the &lt;strong&gt;joda-date&lt;/strong&gt; and &lt;strong&gt;to-ms&lt;/strong&gt; functions from incanter.chrono to get the number of milliseconds from the epoch.&lt;/p&gt;
&lt;pre&gt;
(&lt;span class=&quot;keyword&quot;&gt;defn&lt;/span&gt; &lt;span class=&quot;function-name&quot;&gt;to-milliseconds-from-epoch&lt;/span&gt; [x]
   (to-ms
    (&lt;span class=&quot;builtin&quot;&gt;apply&lt;/span&gt; joda-date (&lt;span class=&quot;builtin&quot;&gt;map&lt;/span&gt; #(Integer/parseInt %)
                          (.split x &lt;span class=&quot;string&quot;&gt;&quot;-&quot;&lt;/span&gt;)))))
&lt;/pre&gt;
&lt;p&gt;Now that we have a function which takes the string representation and get the milliseconds it is time to get the data I want from the dataset. The below code selects the :Close and :Date column while mapping the :Date column to a millisecond from epoch representation of date.&lt;/p&gt;
&lt;pre&gt;
(&lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function-name&quot;&gt;mod-data&lt;/span&gt;
     (col-names
      (conj-cols
       ($ &lt;span class=&quot;builtin&quot;&gt;:Close&lt;/span&gt; yhoo)
       ($map to-milliseconds-from-epoch &lt;span class=&quot;builtin&quot;&gt;:Date&lt;/span&gt; yhoo))
     [&lt;span class=&quot;builtin&quot;&gt;:Close&lt;/span&gt; &lt;span class=&quot;builtin&quot;&gt;:Date&lt;/span&gt;]))
&lt;/pre&gt;
&lt;p&gt;The next step is to use the &lt;strong&gt;time-series-plot&lt;/strong&gt; function to actually create the plot.  Because the data we have is in a dataset, we can pass in the column names as the x and y parameters and provide the data set as the value to the &lt;strong&gt;:data&lt;/strong&gt; key in the optional parameters.&lt;/p&gt;
&lt;pre&gt;
(&lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;function-name&quot;&gt;chart&lt;/span&gt; (time-series-plot &lt;span class=&quot;builtin&quot;&gt;:Date&lt;/span&gt; &lt;span class=&quot;builtin&quot;&gt;:Close&lt;/span&gt;
                             &lt;span class=&quot;builtin&quot;&gt;:x-label&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&quot;Date&quot;&lt;/span&gt;
                             &lt;span class=&quot;builtin&quot;&gt;:y-label&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&quot;Closing Price&quot;&lt;/span&gt;
                             &lt;span class=&quot;builtin&quot;&gt;:title&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&quot;Closing price over time for Yahoo&quot;&lt;/span&gt;
                             &lt;span class=&quot;builtin&quot;&gt;:data&lt;/span&gt; mod-data))
&lt;/pre&gt;
&lt;p&gt;Then we use the Incanter function &lt;strong&gt;view&lt;/strong&gt; to actually see the chart.&lt;/p&gt;
&lt;pre&gt;
(view chart)
&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://jakemccrary.com/blog/wp-content/uploads/2010/02/yhoo.png&quot;&gt;&lt;img src=&quot;http://jakemccrary.com/blog/wp-content/uploads/2010/02/yhoo.png&quot; alt=&quot;Chart&quot; title=&quot;Chart of YHOO closing price over time&quot; width=&quot;500&quot; height=&quot;400&quot; class=&quot;alignnone size-full wp-image-80&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Jake McCrary</name>
			<uri>http://jakemccrary.com/blog</uri>
		</author>
		<source>
			<title type="html">Jake McCrary's Musings » clojure</title>
			<link rel="self" href="http://jakemccrary.com/blog/tag/clojure/feed/"/>
			<id>http://jakemccrary.com/blog/tag/clojure/feed/</id>
			<updated>2010-02-22T01:00:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Major changes in ClojureX</title>
		<link href="http://citizen428.net/archives/415-Major-changes-in-ClojureX.html"/>
		<id>http://citizen428.net/archives/415-guid.html</id>
		<updated>2010-02-21T16:21:00+00:00</updated>
		<content type="html">&lt;p&gt;When ClojureX was started it tried to be everything for everybody. Not only did it checkout and compile the git HEADs of clojure, clojure-contrib and jline, it also (optionally) downloaded packages for Clojure support in TextMate or Emacs, configured and installed them. This has two obvious drawbacks. First off, people end up downloading stuff they don&amp;#8217;t need. With current disk sizes and connection speeds that&amp;#8217;s probably not much of a problem, but some users may still find annoying. More importantly though it was hard to keep up with the upstream changes, e.g. clojure-contrib&amp;#8217;s recent switch to Maven. &lt;/p&gt;

	&lt;p&gt;So now instead of trying to provide a one-size-fits-all solution I&amp;#8217;m taking a totally different approach: from now on ClojureX will only contain the most recent &lt;strong&gt;stable&lt;/strong&gt; releases of clojure, clojure-contrib and jline, as well as a very full-featured clj script:&lt;/p&gt;

	&lt;p&gt;&lt;/p&gt;

	&lt;p&gt;I know that this potentially makes ClojureX less useful to some people, but I do believe that it&amp;#8217;s one of the fastest and most painless ways to set up a Clojure development environment. &lt;/p&gt;</content>
		<author>
			<name>citizen428</name>
			<email>nospam@example.com</email>
			<uri>http://citizen428.net/</uri>
		</author>
		<source>
			<title type="html">citizen428.blog()</title>
			<subtitle type="html">Too old to bother, too young to care...</subtitle>
			<link rel="self" href="http://citizen428.net/rss.php?serendipity[tag"/>
			<id>http://citizen428.net/rss.php?serendipity[tag</id>
			<updated>2010-03-15T09:00:06+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Making an RPG in Clojure (part one of many?)</title>
		<link href="http://briancarper.net/blog/making-an-rpg-in-clojure-part-one-of-many"/>
		<id>http://briancarper.net/blog/making-an-rpg-in-clojure-part-one-of-many</id>
		<updated>2010-02-21T00:27:40+00:00</updated>
		<content type="html">&lt;p&gt;What do you get when you combine old-school Final Fantasy-style RPGs with Clojure?  Fun times for all.  Well, for me at least.&lt;/p&gt;

&lt;p&gt;I'm working on a sort of RPG engine in Clojure so I can make my own RPG.  Click the thumbnail for a &lt;strong&gt;very preliminary video demo&lt;/strong&gt; (6.5 MB) showing the engine in action.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://briancarper.net/clojure/rpg-demo.avi&quot;&gt;&lt;img src=&quot;http://briancarper.net/clojure/rpg-demo.png&quot; alt=&quot;RPG Demo&quot; title=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All I do in the video is walk around, and eventually start adding random NPCs to the map to test collision detection.  Not all that exciting, but I'm proud nonetheless.&lt;/p&gt;

&lt;p&gt;To forestall questions, yes I'll eventually post the source code, but no, not yet.  It barely works.  Just a proof of concept so far.&lt;/p&gt;

&lt;p&gt;Right now I can walk around a map while NPCs also randomly walk around the map, not much more.  So there isn't much to talk about.  But not bad for 4 days and 600 lines of code (one tenth of which is ASCII art... more on that later).  Keep in mind that I have no idea what I'm doing.  &lt;/p&gt;

&lt;p&gt;Collision detection works so people don't walk through walls or each other, and after endless tweaking I got all the animations to be very smooth, even when I add a few dozen NPCs to the map (as I do in the video).  The video is a bit jerky but it looks better in person.  All of the admittedly poor artwork is also created by myself, thanks to the GIMP and some hastily-read &lt;a href=&quot;http://gas13.ru/v3/tutorials/sywtbapa_making_sprite.php&quot;&gt;tutorials on pixel art&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It all runs on plain old Swing in Clojure.  Here's some of what went right and what went wrong so far.&lt;/p&gt;

&lt;!--more Successes and failures... --&gt;

&lt;h1&gt;Background&lt;/h1&gt;

&lt;p&gt;I've played a lot of RPGs, but I've never programmed a game more complex than Pong.  I knew what double-buffering is, and that's as far as my knowledge of game programming went when I started.&lt;/p&gt;

&lt;p&gt;My first idea was to use a plain old Swing JFrame.  I'd make a bunch of sprites saved as PNG files, read them all in and draw them on the JFrame, as many times per second as I could manage.  Then there's some global state to keep track of where everything is.  Simple enough.&lt;/p&gt;

&lt;p&gt;(PS I have no idea what I'm doing.)&lt;/p&gt;

&lt;h1&gt;Failures&lt;/h1&gt;

&lt;p&gt;My first version used Clojure agents (i.e. threads) for everything.  The game logic was a thread, the renderer ran in a thread, every NPC was its own thread.  The world itself was a single ref that all of these agents banged on. So the NPCs would tell the ref &quot;I want to move down one square&quot;, another thread might say &quot;Brian just pushed 'left' on the keyboard, so start scrolling the map&quot;.  The world-ref would kindly oblige while preventing two NPCs from standing on each other or letting the PC walk through the walls.&lt;/p&gt;

&lt;p&gt;Clojure is awesome in letting you do this in a completely safe and coordinated way.  Everything worked well.  But even for the crappy 2D graphics I'm using, all those threads caused way too much lag.  I could get a good framerate if everyone was standing still, but if I was walking while the NPCs were walking, I'd get lots of lag.  It was even worse on a slower computer.&lt;/p&gt;

&lt;p&gt;My best guess is that the reason for the lag was the constant restarting of canceled transactions due to multiple threads trying to edit the world ref 50+ times per second.  My sucky 2-core CPU couldn't keep up.  It isn't surprising that this failed, in hindsight.&lt;/p&gt;

&lt;h1&gt;OpenGL?&lt;/h1&gt;

&lt;p&gt;Next, I decided to try out OpenGL.  There are multiple options for OpenGL in Java.  One is &lt;a href=&quot;http://kenai.com/projects/jogl/pages/Home&quot;&gt;JOGL&lt;/a&gt; and another is &lt;a href=&quot;http://lwjgl.org/&quot;&gt;lwjgl&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;I program in Linux, and my video card is ancient.  I can barely get OpenGL to work in the best of times.  Installing JOGL was a slight chore (Gentoo doesn't even include it in its repo).  JOGL is not just a JAR you throw onto CLASSPATH, you need some native extensions, obviously.  I got it running somehow, but I wouldn't want to explain to someone else how I did it.&lt;/p&gt;

&lt;p&gt;I did get jwjgl to work too, eventually, which was nice.  There is a really nice Java 2D game framework called &lt;a href=&quot;http://slick.cokeandcode.com/&quot;&gt;Slick&lt;/a&gt; which uses lwjgl.  Some good games were created using this, for example &lt;a href=&quot;http://meatfighter.com/stickvania/&quot;&gt;Stickvania&lt;/a&gt;, which recently hit Reddit recently. I got Slick up and running in short order.&lt;/p&gt;

&lt;p&gt;Unfortunately Slick doesn't play nicely with a Clojure REPL.  I could build and start a game, but once the game is stopped, it never runs properly again without restarting the REPL.  Slick caches images to try to be speedy, and it seems like the cache is either corrupted or destroyed when you close down your game, for one thing.  This is not conducive to Clojure REPL-style development, and I didn't want to spend a lot of time fixing it.&lt;/p&gt;

&lt;p&gt;Another issue is that I'd really like this game to be cross-platform and available to non-hackers, and the thought of trying to tell the average gamer how to install JOGL or lwjgl was daunting, given the bullcrap I had to go through.  Not sure if I can just throw JOGL into a JAR and distribute it, maybe I can, but I didn't want to bother reading about it.  Swing on the other hand runs everywhere with no effort.  &lt;/p&gt;

&lt;p&gt;My main problem is that I know even less about OpenGL programming than I do about Swing, and don't have a month to learn.  Back to the drawing board.&lt;/p&gt;

&lt;h1&gt;Success&lt;/h1&gt;

&lt;p&gt;It turns out I don't need OpenGL anyways.  All I need is program more intelligently.  (Did I mention I have no idea what I'm doing?)  Instead of dozens of threads, my current (working) version has one thread.  It updates the game logic, then renders the game, then waits 10 milliseconds or so, then repeats this (forever).  &lt;/p&gt;

&lt;p&gt;With the single-threaded version, the logic is actually more complex than the multi-threaded version.  Agents and refs were really nice and braindead-easy to work with.  But such is life.&lt;/p&gt;

&lt;p&gt;Once I learned about keeping track of things in realtime by counting milliseconds instead of counting frames or using timeouts to do logic/render updates, things worked better.  (Did I mention I have no idea what I'm doing?)  The game loop looks like this now:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defn game-loop [#^Canvas canvas]
  (loop [last-time (get-time)]
    (let [curr-time (get-time)
          delta (- curr-time last-time)]
      (do-logic delta)
      (do-render canvas)
      (when @RUNNING
        (Thread/sleep 10)
        (recur curr-time)))))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The code to actually start the game, to give you an idea:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defn start-world [world]
  (let [#^JFrame frame (doto (JFrame. &quot;Game&quot;)
                         (.addWindowListener (proxy [WindowAdapter] []
                                               (windowClosing [e] (stop)))))
        #^JPanel panel (doto (.getContentPane frame)
                         (.setPreferredSize (Dimension. REAL-WIDTH REAL-HEIGHT))
                         (.setLayout nil))
        #^Canvas canvas (Canvas.)]
    (doto canvas
      (.setBounds 0 0 REAL-WIDTH REAL-HEIGHT)
      (.setIgnoreRepaint true)
      (.addKeyListener (proxy [KeyAdapter] []
                         (keyPressed [e] (handle-keypress e))))
      (.addMouseListener (proxy [MouseAdapter] []
                           (mouseClicked [e] (handle-mouse e))))
      )
    (.add panel canvas)
    (doto frame
      (.pack)
      (.setResizable false)
      (.setVisible true))
    (.createBufferStrategy canvas 2)
    (dosync (ref-set RUNNING true)
            (ref-set PAINTER (agent canvas))
            (ref-set WORLD world))
    (send-off @PAINTER game-loop)))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That's about it for the Swing side of things, aside from scribbling on the Canvas in the render function.&lt;/p&gt;

&lt;p&gt;The agent I wrap around the Canvas controls the thread that runs the game loop.  The agent helpfully keeps track of any exceptions that happen during the loop, and I can view those exceptions via &lt;code&gt;agent-error&lt;/code&gt;, which is handy for debugging.&lt;/p&gt;

&lt;p&gt;Note how little code it is to set up a keyboard event handler, thanks to &lt;code&gt;proxy&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    (doto canvas
      ...
      (.addKeyListener (proxy [KeyAdapter] []
                         (keyPressed [e] (handle-keypress e))))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A couple lines of Clojure for what would be a lot of senseless boilerplate in Java.  Notice how you the keyboard handler calls a normal Clojure function &lt;code&gt;handle-keypress&lt;/code&gt;.  Clojure / Java interop really is seamless.&lt;/p&gt;

&lt;h1&gt;Maps&lt;/h1&gt;

&lt;p&gt;My maps are made using ASCII art.  (Did I mention I have no id-... never mind.) Here's the code for the test map, for example.  &lt;code&gt;Map&lt;/code&gt; here is a &lt;code&gt;deftype&lt;/code&gt; (available in bleeding-edge Clojure), which takes a map of tiles, a &quot;pad&quot; tile, the map, and then a mask showing walls / tiles where the player shouldn't be allowed to walk.  My &lt;code&gt;Map&lt;/code&gt; type acts like a Clojure hash-map most of the time, but it also lets me name the fields that all maps should share, and has a proper &quot;type&quot;, among other things.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(deftype Map [tileset pad tiles walls]
  clojure.lang.IPersistentMap)

(def test-map (cache-map
               (Map {\  (tile &quot;ground&quot;)
                     \/ (tile &quot;ground-shadow-botright&quot;)
                     \&amp;lt; (tile &quot;ground-shadow-left&quot;)
                     \d (tile &quot;dirt&quot;)
                     \| (tile &quot;wall_vertical&quot;)
                     \- (tile &quot;wall_horizontal&quot;)
                     \1 (tile &quot;wall_topleft&quot;)
                     \2 (tile &quot;wall_topright&quot;)
                     \3 (tile &quot;wall_bottomleft&quot;)
                     \4 (tile &quot;wall_bottomright&quot;)
                     \u (tile &quot;below-wall&quot;)
                     \v (tile &quot;below-wall-shadow&quot;)
                     \w (tile &quot;wood-floor&quot;)
                     \c (tile &quot;cobble&quot;)
                     \b (tile &quot;bush&quot;)}

                    (tile &quot;ground&quot;)

                    [&quot;                 1----2                            &quot;
                     &quot;                 |vuuu|                            &quot;
                     &quot;1----------------4&amp;lt;bbb3--------------------------2 &quot;
                     &quot;|vuuuuuuuuuuuuuuuu/   uuuuuuuuuuuuuuuuuuuuuuuuuuu|&amp;lt;&quot;
                     &quot;|&amp;lt;1------------2               cccccccc d        |&amp;lt;&quot;
                     &quot;|&amp;lt;|vuuuuuuuuuuu|&amp;lt;       d      c      c          |&amp;lt;&quot;
                     &quot;|&amp;lt;|&amp;lt;           |&amp;lt; cccccccccccccc    d ccccccc d  |&amp;lt;&quot;
                     &quot;|&amp;lt;3------ -----4&amp;lt; c                         ccccc|&amp;lt;&quot;
                     &quot;|&amp;lt;uuuuuuu/uuuuuu/ c  1-------2    1------------2 |&amp;lt;&quot;
                     &quot;|&amp;lt;1---2 bcb       c  |vuuuuuu|&amp;lt;   |vuuuuuuuuuuu|&amp;lt;|&amp;lt;&quot;
                     &quot;|&amp;lt;|vuu|&amp;lt; c  d     c  |&amp;lt; 1-- -4&amp;lt;   |&amp;lt;           |&amp;lt;|&amp;lt;&quot;
                     &quot;|&amp;lt;3- -4&amp;lt;bcb       c  |&amp;lt; |vucuu/   3------ -----4&amp;lt;|&amp;lt;&quot;
                     &quot;|&amp;lt;uu/uu/ c        c  3--4&amp;lt; c      uuuuuuu/uuuuuu/|&amp;lt;&quot;
                     &quot;|&amp;lt;  c  dbcb       c  uuuu/ cccc         bcb      |&amp;lt;&quot;
                     &quot;|&amp;lt;  cccccccccccccccccccccccc  cccccccc   c   d   |&amp;lt;&quot;
                     &quot;|&amp;lt;  d        d                     d ccccc       |&amp;lt;&quot;
                     &quot;|&amp;lt;                    1--------------------------4&amp;lt;&quot;
                     &quot;3---------------------4uuuuuuuuuuuuuuuuuuuuuuuuuuu/&quot;
                     &quot;uuuuuuuuuuuuuuuuuuuuuuu/                           &quot;]

                    [&quot;                 xxxxxx                            &quot;
                     &quot;                 x    x                            &quot;
                     &quot;xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx &quot;
                     &quot;x                                                x &quot;
                     &quot;x xxxxxxxxxxxxxx                                 x &quot;
                     &quot;x x            x                                 x &quot;
                     &quot;x x            x                                 x &quot;
                     &quot;x xxxxxxx xxxxxx                                 x &quot;
                     &quot;x                    xxxxxxxxx    xxxxxxxxxxxxxx x &quot;
                     &quot;x xxxxx x x          x       x    x            x x &quot;
                     &quot;x x   x              x  xxx xx    x            x x &quot;
                     &quot;x xx xx x x          x  x         xxxxxxx xxxxxx x &quot;
                     &quot;x                    xxxx                        x &quot;
                     &quot;x       x x                             x x      x &quot;
                     &quot;x                                                x &quot;
                     &quot;x                                                x &quot;
                     &quot;x                     xxxxxxxxxxxxxxxxxxxxxxxxxxxx &quot;
                     &quot;xxxxxxxxxxxxxxxxxxxxxxx                            &quot;]
                    )))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This lets me make all of my tiles be simple PNG files with sane names.  I could dork around with sprite sheets, but why bother?  Emacs or Vim column-editing and overwrite modes make it easy enough to make a map this way.  Swing thankfully handles transparency for me if I use PNGs, so it's a no-brainer to make multiple map layers later, which I'll need later.  The code for reading in PNGs is brain-dead simple thanks to Java's ImageIO:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defn tile [name]
  (ImageIO/read (File. (str &quot;img/&quot; name &quot;.png&quot;))))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;cache-map&lt;/code&gt; function (below) iterates over the ASCII art (via &lt;code&gt;seq&lt;/code&gt;s on the Strings), using each character as a key into the map of real images, and builds a BufferedImage out of it.  This is cached, since the renderer needs to re-draw the background every frame.  In this function I'm also drawing a &quot;padding&quot; layer to sit under the background, so that I see endless fields of grass when I walk close to the edge of the map, instead of garbled, smeared-out graphical artifacts.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defn cache-map [amap]
  (let [height (count (:tiles amap))
        width (count (first (:tiles amap)))

        #^BufferedImage img (BufferedImage. (tile-to-real width) (tile-to-real height) BufferedImage/TYPE_INT_ARGB)
        #^Graphics2D g (.createGraphics img)

        #^BufferedImage pad (BufferedImage. (tile-to-real width) (tile-to-real height) BufferedImage/TYPE_INT_ARGB)
        #^Graphics2D padg (.createGraphics pad)]
    (doseq [[y row] (cseq/indexed (:tiles amap))
            [x tile] (cseq/indexed row)]
      (.drawImage padg (:pad amap) (tile-to-real x) (tile-to-real y) REAL-TILE-SIZE REAL-TILE-SIZE nil)
      (if-let [#^Image img ((:tileset amap) tile)]
        (.drawImage g img (tile-to-real x) (tile-to-real y) REAL-TILE-SIZE REAL-TILE-SIZE nil)
        (throw (Exception. (str &quot;Missing tile &quot; tile &quot;.&quot;)))))
    (assoc amap
      :map-image img
      :pad-image pad
      :max-map-x width
      :max-map-y height)))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This code is nasty, mostly due to converting between tile-based coordinates and pixel-based coordinates.  This code needs to be cleaned up a bit.  But that's about the most complex code you'll find in my program so far.&lt;/p&gt;

&lt;h1&gt;Who needs mutable state?&lt;/h1&gt;

&lt;p&gt;Clojure is a mostly functional language, in the sense of strongly discouraging unnecessary use of mutable state, and this program is no different.  I'm sometimes amazed how far I can get before I need mutable state at all.  The vast majority of my functions take a world value (a plain old hash-map) as an argument, and return a new world value after making changes to it.  The current state of the world is whatever value is currently in the global WORLD ref.&lt;/p&gt;

&lt;p&gt;The render loop grabs a snapshot of the world from the ref on each iteration, and then draws it.  Thanks to Clojure refs, the snapshot of the world is guaranteed to be consistent (e.g. no NPC objects in the middle of mutating themselves) and persistent (the world value sticks around as long as the renderer needs it, even if the WORLD ref is changing in another thread).  Once it's been drawn, the renderer throws the world snapshot away and it's garbage-collected later.&lt;/p&gt;

&lt;p&gt;This all happens around 50-100 times per second in my game, and there's no noticeable lag.  So that's a good thing.&lt;/p&gt;

&lt;h1&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;That's about it.  I'll post the full source code once it doesn't suck as much.&lt;/p&gt;

&lt;p&gt;In my opinion, exploring a new area of study is some of the best fun a person can have.  It's a flood of information and a surprise every 10 seconds. &lt;/p&gt;

&lt;p&gt;Making a game has been like that.  There's a huge wealth of knowledge about this kind of programming that I never knew existed.  Everything I read on this topic is new to me and fascinating.  The saddest(?) part of this whole thing is that I'm going to have more fun programming this game than I usually have playing games I buy in the store.&lt;/p&gt;</content>
		<author>
			<name>Brian Carper</name>
			<uri>http://briancarper.net/tag/clojure</uri>
		</author>
		<source>
			<title type="html">briancarper.net Tag: Clojure</title>
			<subtitle type="html">Some guy's blog about programming and Linux and cows</subtitle>
			<link rel="self" href="http://briancarper.net/feed/tag/clojure"/>
			<id>http://briancarper.net/feed/tag/clojure</id>
			<updated>2010-03-16T05:00:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Penumbra (unknown severity): targeting clojure.contrib-1.2.0</title>
		<link href="http://github.com/ztellman/penumbra/issues/#issue/16"/>
		<id>http://github.com/ztellman/penumbra/issues/#issue/16</id>
		<updated>2010-02-21T00:00:00+00:00</updated>
		<content type="html">Penumbra (unknown severity): targeting clojure.contrib-1.2.0</content>
		<author>
			<name>BugSpy</name>
			<uri>http://bugspy.net</uri>
		</author>
		<source>
			<title type="html">BugSpy.net - Reports By Tag: clojure</title>
			<link rel="self" href="http://bugspy.net/tag/clojure/?format=rss"/>
			<id>http://bugspy.net/tag/clojure/?format=rss</id>
			<updated>2010-03-16T05:00:13+00:00</updated>
		</source>
	</entry>

</feed>
