<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Japila :: verba docent, exempla trahunt</title>
	
	<link>http://blog.japila.pl</link>
	<description>Java EE, functional languages and IBM WebSphere</description>
	<lastBuildDate>Tue, 21 Feb 2012 22:16:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/blog-japila-pl" /><feedburner:info uri="blog-japila-pl" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>blog-japila-pl</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Today’s a palindrome – how to check palindromes in Clojure</title>
		<link>http://feedproxy.google.com/~r/blog-japila-pl/~3/H1vujENY5tM/</link>
		<comments>http://blog.japila.pl/2012/02/todays-a-palindrome-how-to-check-palindromes-in-clojure/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 22:15:34 +0000</pubDate>
		<dc:creator>Jacek Laskowski</dc:creator>
				<category><![CDATA[Languages]]></category>
		<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://blog.japila.pl/?p=747</guid>
		<description><![CDATA[There&#8217;re countries like Poland that use dates in the format &#8216;dd.mm.YYYY&#8217;, so today&#8217;s 21.02.2012. As pointed by @KevlinHenney on twitter it&#8217;s a palindrome and I was pleasantly surprised to find it out. I came up with the idea of writing a Clojure function to check if a given string is a palindrome. I remember the [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;re countries like Poland that use dates in the format &#8216;dd.mm.YYYY&#8217;, so today&#8217;s 21.02.2012. As pointed by <a href="https://twitter.com/#!/KevlinHenney/status/171912595597565952">@KevlinHenney on twitter</a> it&#8217;s <a href="http://en.wikipedia.org/wiki/Palindrome">a palindrome</a> and I was pleasantly surprised to find it out.</p>
<p>I came up with the idea of writing a Clojure function to check if a given string is a palindrome.</p>
<p>I remember the moment very well when I stumbled upon <a href="http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/conj">the (conj) function</a> and learnt that it behaves slightly different when executed with a list or an array.</p>
<pre class="brush: clojure; gutter: false; title: ; notranslate">
user=&gt; ;; use conj with a list (mind the quote mark)
user=&gt; (conj '(1 2 3) 0)
(0 1 2 3)
user=&gt; ;; use conj with an array
user=&gt; (conj [1 2 3] 0)
[1 2 3 0]
</pre>
<p>I think that in order to fully embrace the concept of functional programming is to use the three functions: <a href="clojure.github.com/clojure/clojure.core-api.html#clojure.core/map">map</a>, <a href="http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reduce">reduce</a> and <a href="http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/filter">filter</a> extensively, and so I insisted on using them to tackle the problem.</p>
<p>Here&#8217;s the function I developed to check whether a given string is a palindrome or not.</p>
<pre class="brush: clojure; gutter: false; title: ; notranslate">
user=&gt; (defn my-reverse [s]
         (let [lst (list)]
           (reduce #(str %2 %1)
                   (mapcat #(conj lst %1) s))))
#'user/my-reverse

user=&gt; (defn palindrome? [s]
         (= s (my-reverse s)))

user=&gt; (is (palindrome? &quot;21022012&quot;))
true
</pre>
<p>I solved the problem, but with <a href="http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/mapcat">mapcat</a> not <code>map</code>. Is there a way to use just the three functions &#8211; map, reduce and filter?</p>
<img src="http://feeds.feedburner.com/~r/blog-japila-pl/~4/H1vujENY5tM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.japila.pl/2012/02/todays-a-palindrome-how-to-check-palindromes-in-clojure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.japila.pl/2012/02/todays-a-palindrome-how-to-check-palindromes-in-clojure/</feedburner:origLink></item>
		<item>
		<title>AOT-compile all namespaces in a Clojure project – :aot :all in project.clj (leiningen)</title>
		<link>http://feedproxy.google.com/~r/blog-japila-pl/~3/7ci7r5VHyPk/</link>
		<comments>http://blog.japila.pl/2012/02/aot-compile-all-namespaces-in-a-clojure-project-aot-all-in-project-clj-leiningen/#comments</comments>
		<pubDate>Sun, 19 Feb 2012 19:55:03 +0000</pubDate>
		<dc:creator>Jacek Laskowski</dc:creator>
				<category><![CDATA[Languages]]></category>
		<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://blog.japila.pl/?p=743</guid>
		<description><![CDATA[It&#8217;s been a couple of times when I ran across a compilation issue while starting up the librarian-clojure project. I guess refactoring in Clojure or any dynamic programming language is not as easy to achieve as in static languages, and perhaps Ahead-of-time (AOT) Compilation could be a solution. I&#8217;m yet to join a project with [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a couple of times when I ran across a compilation issue while starting up <a href="https://github.com/jaceklaskowski/librarian-clojure">the librarian-clojure project</a>. I guess refactoring in <a href="http://clojure.org">Clojure</a> or any dynamic programming language is not as easy to achieve as in static languages, and perhaps <a href="http://clojure.org/compilation">Ahead-of-time (AOT) Compilation</a> could be a solution. I&#8217;m yet to join a project with Clojure (or JRuby) as the language so I may find it out one day.</p>
<p>I use <a href="https://github.com/technomancy/leiningen">lein</a> to manage Clojure projects and learnt to use <code>lein compile</code>.</p>
<p>There&#8217;s an issue with <code>lein compile</code> &#8211; it doesn&#8217;t compile all the available sources which was the feature I was looking for.</p>
<p>To use <code>lein compile</code> you&#8217;ll have to define <code>:main [namespace]</code> which will only compile the main namespace pointed out by the <code>namespace</code> option.</p>
<pre class="brush: clojure; gutter: false; highlight: [5]; title: ; notranslate">
(defproject librarian-clojure &quot;0.0.1-SNAPSHOT&quot;
  :description &quot;Book manager in Clojure&quot;
  :url &quot;http://github.com/jaceklaskowski/librarian-clojure&quot;
  ;; removed to ease reading
  :main librarian-clojure.run)
</pre>
<p>Run <code>lein compile</code> and you&#8217;ll see your main namespace compiled.</p>
<pre class="brush: clojure; gutter: false; title: ; notranslate">
jacek:~/oss/librarian-clojure
$ lein compile
Compiling librarian-clojure.run
Compilation succeeded.
</pre>
<p>I often consult a source code to find answers if it&#8217;s available. <a href="https://github.com/technomancy/leiningen/blob/master/src/leiningen/compile.clj">The sources of the compile task are available</a>, and it&#8217;s just a matter of time how much you&#8217;ll gain studying the sources. I don&#8217;t think you need much to learn a lot.</p>
<p><a href="https://github.com/technomancy/leiningen/blob/master/src/leiningen/compile.clj#L30">At line 30 of the compile task</a> I found the value <strong>:all</strong> of the <strong>:aot</strong> option. That was it!</p>
<pre class="brush: clojure; gutter: false; highlight: [6]; title: ; notranslate">
(defproject librarian-clojure &quot;0.0.1-SNAPSHOT&quot;
  :description &quot;Book manager in Clojure&quot;
  :url &quot;http://github.com/jaceklaskowski/librarian-clojure&quot;
  ;; removed to ease reading
  :main librarian-clojure.run
  :aot :all)
</pre>
<p>With the change in <code>project.clj</code>, <code>lein compile</code> now processes all the namespaces in the project. Huurray!</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
jacek:~/oss/librarian-clojure
$ lein compile
Compiling librarian-clojure.run
Compiling librarian-clojure.books
Warning: *server* not declared dynamic and thus is not dynamically rebindable, but its name suggests otherwise. Please either indicate ^:dynamic *server* or change the name.
Compiling librarian-clojure.core
Compiling librarian-clojure.repl

Type (go) to launch the server and run a browser.
Type (stop) to stop the server.

Compiling librarian-clojure.run
Compilation succeeded.
</pre>
<img src="http://feeds.feedburner.com/~r/blog-japila-pl/~4/7ci7r5VHyPk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.japila.pl/2012/02/aot-compile-all-namespaces-in-a-clojure-project-aot-all-in-project-clj-leiningen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.japila.pl/2012/02/aot-compile-all-namespaces-in-a-clojure-project-aot-all-in-project-clj-leiningen/</feedburner:origLink></item>
		<item>
		<title>clj-time and Joda Time to pretty-print my son’s age in Clojure</title>
		<link>http://feedproxy.google.com/~r/blog-japila-pl/~3/-8rsHgt1TdM/</link>
		<comments>http://blog.japila.pl/2012/02/clj-time-and-joda-time-to-pretty-print-my-sons-age-in-clojure/#comments</comments>
		<pubDate>Thu, 16 Feb 2012 21:50:35 +0000</pubDate>
		<dc:creator>Jacek Laskowski</dc:creator>
				<category><![CDATA[Languages]]></category>
		<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://blog.japila.pl/?p=739</guid>
		<description><![CDATA[In Clojure’s lein and clj-time to calculate my son’s age I wrote about clj-time to help me calculate my son&#8217;s age. What I missed was how to display weeks, days and hours and such in a format like: 4 months and 4 days and 5 hours and 10 minutes. Konrad Garus pointed out at org.joda.time.format.PeriodFormatterBuilder [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://blog.japila.pl/2012/02/clojures-lein-and-clj-time-to-calculate-my-sons-age">Clojure’s lein and clj-time to calculate my son’s age</a> I wrote about <strong>clj-time</strong> to help me calculate my son&#8217;s age. What I missed was how to display weeks, days and hours and such in a format like: 4 months and 4 days and 5 hours and 10 minutes.</p>
<p><a href="http://blog.japila.pl/2012/02/clojures-lein-and-clj-time-to-calculate-my-sons-age/#comment-956">Konrad Garus pointed out</a> at <a href="http://joda-time.sourceforge.net/apidocs/org/joda/time/format/PeriodFormatterBuilder.html">org.joda.time.format.PeriodFormatterBuilder</a> that would do this.</p>
<p>The following is a possible answer to my question of formatting the age of my youngest son up to minutes. Note how I almost directly copied the Java version to create the Clojure one. Ideas and comments welcome.</p>
<pre class="brush: clojure; gutter: false; title: ; notranslate">
(import 'org.joda.time.format.PeriodFormatterBuilder)

(defn format-age [interval]
  (let [builder (doto (PeriodFormatterBuilder.)
                      (.printZeroAlways)
                      (.printZeroRarelyLast)
                      (.appendMonths)
                      (.appendSuffix &quot; month&quot; &quot; months&quot;)
                      (.appendSeparator &quot; and &quot;)
                      (.appendDays)
                      (.appendSuffix &quot; day&quot; &quot; days&quot;)
                      (.appendSeparator &quot; and &quot;)
                      (.appendHours)
                      (.appendSuffix &quot; hour&quot; &quot; hours&quot;)
                      (.appendSeparator &quot; and &quot;)
                      (.appendMinutes)
                      (.appendSuffix &quot; minute&quot; &quot; minutes&quot;))
        formatter (.toFormatter builder)]
    (.print formatter interval)))

(use 'clj-time.core)

(def maksym-birth-date-time (date-time 2011 10 03 17 23))

(def maksym-interval (interval maksym-birth-date-time (now)))

(format-age (.toPeriod maksym-interval))

(in-weeks maksym-interval)
</pre>
<p>When you run it, it should print out the following output:</p>
<pre class="brush: clojure; gutter: false; title: ; notranslate">
user=&gt; (format-age (.toPeriod maksym-interval))
&quot;4 months and 6 days and 4 hours and 25 minutes&quot;
user=&gt; (in-weeks maksym-interval)
19
</pre>
<img src="http://feeds.feedburner.com/~r/blog-japila-pl/~4/-8rsHgt1TdM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.japila.pl/2012/02/clj-time-and-joda-time-to-pretty-print-my-sons-age-in-clojure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.japila.pl/2012/02/clj-time-and-joda-time-to-pretty-print-my-sons-age-in-clojure/</feedburner:origLink></item>
		<item>
		<title>(clojure.java.browse/browse-url “http://clojure.org”)</title>
		<link>http://feedproxy.google.com/~r/blog-japila-pl/~3/jGH7mgsfUjA/</link>
		<comments>http://blog.japila.pl/2012/02/clojure-java-browse-browse-url-http-clojure-org/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 23:02:34 +0000</pubDate>
		<dc:creator>Jacek Laskowski</dc:creator>
				<category><![CDATA[Languages]]></category>
		<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://blog.japila.pl/?p=734</guid>
		<description><![CDATA[While reviewing the sources of RESTful Clojure webapp skeleton w/Compojure, Ring, Enlive, and ClojureQL I found the clojure.java.browse namespace with the browse-url function I was looking for for some time. By a complete chance I stumbled upon this function which I happily incorporated in the librarian-clojure project. The function requires a URL to be open, [...]]]></description>
			<content:encoded><![CDATA[<p>While reviewing the sources of <a href="https://github.com/rcampbell/blocker">RESTful Clojure webapp skeleton w/Compojure, Ring, Enlive, and ClojureQL</a> I found the <a href="http://clojure.github.com/clojure/clojure.java.browse-api.html">clojure.java.browse</a> namespace with the <a href="http://clojure.github.com/clojure/clojure.java.browse-api.html#clojure.java.browse/browse-url">browse-url</a> function <a href="http://blog.japila.pl/2012/02/mastering-lein-run/">I was looking for for some time</a>.</p>
<p>By a complete chance I stumbled upon this function which I happily incorporated in the <a href="https://github.com/jaceklaskowski/librarian-clojure">librarian-clojure</a> project. The function requires a URL to be open, e.g.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
$ lein repl
REPL started; server listening on localhost port 44510
user=&gt; (clojure-version)
&quot;1.2.1&quot;
user=&gt; (clojure.java.browse/browse-url &quot;http://clojure.org&quot;)
&quot;http://clojure.org&quot;
</pre>
<p>Once you call this function the default browser will open with the page. Quite handy, isn&#8217;t it? And the sources of the function are easy to read through as well. It takes a mere minute.</p>
<p>It turned out that the function was already in my project (when I copied the part off the other project), but I had no time to read about and ultimately learn it. Now I did.</p>
<p>By the way, I don&#8217;t recommend reviewing the application as it appears quite old, and perhaps often misleading in its use of the web libraries. Stay away of it.</p>
<img src="http://feeds.feedburner.com/~r/blog-japila-pl/~4/jGH7mgsfUjA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.japila.pl/2012/02/clojure-java-browse-browse-url-http-clojure-org/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.japila.pl/2012/02/clojure-java-browse-browse-url-http-clojure-org/</feedburner:origLink></item>
		<item>
		<title>How I learnt git pull requests</title>
		<link>http://feedproxy.google.com/~r/blog-japila-pl/~3/dQXmYDED0sU/</link>
		<comments>http://blog.japila.pl/2012/02/how-i-learnt-git-pull-requests/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 20:47:01 +0000</pubDate>
		<dc:creator>Jacek Laskowski</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Languages]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://blog.japila.pl/?p=731</guid>
		<description><![CDATA[That was an amazing experience that ultimately turned into a git pull request into Midje &#8211; a test framework for Clojure. I&#8217;m working on a side project &#8211; librarian-clojure &#8211; which aims at providing a CRUD-like web application to manage books and when a colleague Konrad Garus cloned it to his own repo where he [...]]]></description>
			<content:encoded><![CDATA[<p>That was an amazing experience that ultimately turned into a git pull request into <a href="https://github.com/marick/Midje">Midje &#8211; a test framework for Clojure</a>.</p>
<p>I&#8217;m working on a side project &#8211; <a href="https://github.com/jaceklaskowski/librarian-clojure">librarian-clojure</a> &#8211; which aims at providing a CRUD-like web application to manage books and when a colleague <a href="http://squirrel.pl/blog/">Konrad Garus</a> cloned it to his own repo where he made some changes to, I was asking myself how to merge his changes with the repo I work with.</p>
<p>The project librarian-clojure is also aimed to let me learn Clojure and its web ecosystem, git and GitHub, and finally Heroku. Lots of stuff I&#8217;ve never worked with before. Git is amongst them.</p>
<p>So, I was wondering about merging the changes with the repo of mine. I&#8217;ve been hearing about pull requests on GitHub, but didn&#8217;t have time to grasp it. I emailed Konrad asking about it and hoping he would know the answer. He did. Early in the morning next day I found a pull request. Just at the same time when I pulled his changes to my repo and pushed them to GitHub. I remember I had to use git stash, too, while applying his changes. Quite intensive git self-learning.</p>
<p>The other day I was reading a blog post of Sean Corfield &#8211; <a href="http://corfield.org/blog/post.cfm/testing-your-project-against-multiple-versions-of-clojure">Testing your project against multiple versions of Clojure</a> where he described how to unify a set of dependencies in a Clojure project. I did use it in the librarian-clojure project and also found a note in <a href="https://github.com/marick/Midje/blob/master/project.clj">Midje&#8217;s project.clj</a> (the version I&#8217;m reffering to is <a href="https://github.com/marick/Midje/blob/ea24fcddb0276952e4b6a5e922b78f619daf7a95/project.clj">this version of project.clj</a>):</p>
<p><em>&#8220;;; TODO: Alex Jan 29, 2012 &#8211; figure out how to not duplicate these deps&#8221;</em></p>
<p>That was a call to action for me! <img src='http://blog.japila.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I had known how to do it so it was a matter of copying and pasting the solution I had found in Sean&#8217;s blog post. That&#8217;s how <a href="https://github.com/marick/Midje/pull/103">a pull request of mine was born</a>. It didn&#8217;t take long before Alex accepted the change and it&#8217;s now a part of Midje.</p>
<p>It&#8217;s rewarding when a change doesn&#8217;t take much but stays longer.</p>
<img src="http://feeds.feedburner.com/~r/blog-japila-pl/~4/dQXmYDED0sU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.japila.pl/2012/02/how-i-learnt-git-pull-requests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.japila.pl/2012/02/how-i-learnt-git-pull-requests/</feedburner:origLink></item>
		<item>
		<title>Mastering lein run</title>
		<link>http://feedproxy.google.com/~r/blog-japila-pl/~3/eQmYIxHx7Zw/</link>
		<comments>http://blog.japila.pl/2012/02/mastering-lein-run/#comments</comments>
		<pubDate>Sat, 11 Feb 2012 20:49:35 +0000</pubDate>
		<dc:creator>Jacek Laskowski</dc:creator>
				<category><![CDATA[Languages]]></category>
		<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://blog.japila.pl/?p=726</guid>
		<description><![CDATA[In hangman with lein run, Incanter, and opencsv – Counterclockwise is here, too I mentioned the hangman project in which I&#8217;d come across lein run. I decided to use it in a side project of mine &#8211; librarian-clojure. I ran lein run to see what would happen. Ouch, but not much. The error message said [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://blog.japila.pl/2012/02/hangman-with-lein-run-incanter-and-opencsv-counterclockwise-is-here-too/">hangman with lein run, Incanter, and opencsv – Counterclockwise is here, too</a> I mentioned the hangman project in which I&#8217;d come across <code>lein run</code>.</p>
<p>I decided to use it in a side project of mine &#8211; <a href="https://github.com/jaceklaskowski/librarian-clojure">librarian-clojure</a>. I ran <code>lein run</code> to see what would happen.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
jacek:~/oss/librarian-clojure
$ lein run
No :main namespace specified in project.clj.
</pre>
<p>Ouch, but not much. The error message said it all. Easy stuff, wasn&#8217;t it?</p>
<p>It also reminded me about <em>Procfile</em> for Heroku where I entered a quite similar command.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
jacek:~/oss/librarian-clojure
$ cat Procfile
web: lein run -m librarian-clojure.core $PORT
</pre>
<p>It worked fine on the command line.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
jacek:~/oss/librarian-clojure
$ lein run -m librarian-clojure.core 8080
...
2012-02-11 20:29:46.756:INFO::Logging to STDERR via org.mortbay.log.StdErrLog
2012-02-11 20:29:46.773:INFO::jetty-6.1.25
2012-02-11 20:29:46.857:INFO::Started SocketConnector@0.0.0.0:8080
</pre>
<p>With <code>:main librarian-clojure.core</code> in <em>project.clj</em> I ran <code>lein run</code> again.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
jacek:~/oss/librarian-clojure
$ lein run
Exception in thread &quot;main&quot; clojure.lang.ArityException: Wrong number of args (0) passed to: core$-main
     at clojure.lang.AFn.throwArity(AFn.java:437)
     at clojure.lang.AFn.invoke(AFn.java:35)
     at clojure.lang.Var.invoke(Var.java:397)
     at user$eval53.invoke(NO_SOURCE_FILE:1)
     at clojure.lang.Compiler.eval(Compiler.java:6465)
     at clojure.lang.Compiler.eval(Compiler.java:6455)
     at clojure.lang.Compiler.eval(Compiler.java:6431)
     at clojure.core$eval.invoke(core.clj:2795)
     at clojure.main$eval_opt.invoke(main.clj:296)
     at clojure.main$initialize.invoke(main.clj:315)
     at clojure.main$null_opt.invoke(main.clj:348)
     at clojure.main$main.doInvoke(main.clj:426)
     at clojure.lang.RestFn.invoke(RestFn.java:421)
     at clojure.lang.Var.invoke(Var.java:405)
     at clojure.lang.AFn.applyToHelper(AFn.java:163)
     at clojure.lang.Var.applyTo(Var.java:518)
     at clojure.main.main(main.java:37)
</pre>
<p>Clojure is known for &#8220;its elaborative exception messages&#8221; (quoting Stuart Halloway who said that the situation is <a href="http://www.infoq.com/presentations/Clojure-in-the-Field">&#8220;because Rick doesn&#8217;t make mistakes&#8221;</a> at 00:47:30), but in this particular case, it didn&#8217;t take much to figure out that the <em>-main</em> function in <em>librarian-clojure/core.clj</em> offers no no-args version of itself.</p>
<p>With a small change that ultimately helped me to master the format of a function definition with different args, the project boots up now with a simple <code>lein run</code>.</p>
<pre class="brush: clojure; gutter: false; title: ; notranslate">
(defn -main
  ([] (-main 9999))
  ([port] (run-jetty app {:port (Integer. port)})))
</pre>
<p>I believe I need a <code>librarian-clojure/main.clj</code> to copy the above method to and have another one to fire up a browser with the URL for the application &#8211; something similar to ClojureScript One&#8217;s <a href="https://github.com/brentonashworth/one/blob/master/src/app/clj/one/sample/repl.clj">repl.clj</a>.</p>
<p>People interested in <code>lein run</code>&#8216;s internals are requested to visit <a href="https://github.com/technomancy/leiningen/blob/master/src/leiningen/run.clj">leiningen.run</a>.</p>
<img src="http://feeds.feedburner.com/~r/blog-japila-pl/~4/eQmYIxHx7Zw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.japila.pl/2012/02/mastering-lein-run/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.japila.pl/2012/02/mastering-lein-run/</feedburner:origLink></item>
		<item>
		<title>hangman with lein run, Incanter, and opencsv – Counterclockwise is here, too</title>
		<link>http://feedproxy.google.com/~r/blog-japila-pl/~3/BIR_KwjBEqg/</link>
		<comments>http://blog.japila.pl/2012/02/hangman-with-lein-run-incanter-and-opencsv-counterclockwise-is-here-too/#comments</comments>
		<pubDate>Fri, 10 Feb 2012 21:56:25 +0000</pubDate>
		<dc:creator>Jacek Laskowski</dc:creator>
				<category><![CDATA[Languages]]></category>
		<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://blog.japila.pl/?p=718</guid>
		<description><![CDATA[It was just yesterday when I once again listened to the presentation of Stuart Halloway &#8211; Clojure in the Field and was reminded about supercsv and his arguments to expect a csv parser in the Java SDK distribution. While scanning Clojure mailing list I stumbled upon [ANN] Clojure Hangman from Jozef Wagner and hoping to [...]]]></description>
			<content:encoded><![CDATA[<p>It was just yesterday when I once again listened to <a href="http://www.infoq.com/presentations/Clojure-in-the-Field">the presentation of Stuart Halloway &#8211; Clojure in the Field</a> and was reminded about supercsv and his arguments to expect a csv parser in the Java SDK distribution.</p>
<p>While scanning Clojure mailing list I stumbled upon <a href="http://groups.google.com/group/clojure/browse_thread/thread/ab4ff709fe1ef28d">[ANN] Clojure Hangman</a> from Jozef Wagner and hoping to learn a bit about <a href="http://clojure.org">Clojure</a> and its libraries I cloned into <a href="https://github.com/wagjo/hangman">https://github.com/wagjo/hangman</a> (btw, I would not have used the term &#8216;clone into&#8217;, but that&#8217;s how it&#8217;s printed out upon cloning so I consider it correct).</p>
<p>In the blink of an eye, I found a few things in the hangman project I hadn&#8217;t known before &#8211; I learnt <code>lein run</code>, noticed Incanter in the libs downloaded (which I&#8217;ve always been meaning to learn) and finally noticed that opencsv (although it wasn&#8217;t supercvs it instantly reminded Stuart&#8217;s presentation). All in one shot which I truly appreciate. And it&#8217;s free to use, modify, study, whatever, you name it. Just clone the repo and it&#8217;s yours.</p>
<p>And I could play a little while getting accustomed with the tool. The first time I ran the app, I failed to answer the word correctly and guess what the word was. DANGER. Seriously. Happily the second attempt was quite successful!</p>
<p><a href="http://blog.japila.pl/wp-content/uploads/2012/02/clojure-hangman-won.png"><img src="http://blog.japila.pl/wp-content/uploads/2012/02/clojure-hangman-won.png" alt="" title="clojure-hangman-won" width="274" height="323" class="aligncenter size-full wp-image-719" /></a></p>
<p>Time for studying the sources. I hope to find some hidden gems there, too.</p>
<p>BTW, I&#8217;ve always been wondering how others use <a href="http://code.google.com/p/counterclockwise/">Eclipse Counterclockwise (CCW)</a> to create and/or import Clojure projects. With yesterday&#8217;s beta release of CCW &#8211; <a href="http://groups.google.com/group/clojuredev-users/msg/c89c0ed13d936b48">0.6.0 Beta of Counterclockwise</a> it looks like an excellent moment to try it out yourself. Do you just point the location to the directory of your project and type in the project&#8217;s name? I would expect some sort of import, but I can find no such a feature. Let me know your way.</p>
<img src="http://feeds.feedburner.com/~r/blog-japila-pl/~4/BIR_KwjBEqg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.japila.pl/2012/02/hangman-with-lein-run-incanter-and-opencsv-counterclockwise-is-here-too/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.japila.pl/2012/02/hangman-with-lein-run-incanter-and-opencsv-counterclockwise-is-here-too/</feedburner:origLink></item>
		<item>
		<title>Clojure’s lein and clj-time to calculate my son’s age</title>
		<link>http://feedproxy.google.com/~r/blog-japila-pl/~3/xNqKp8lDP1c/</link>
		<comments>http://blog.japila.pl/2012/02/clojures-lein-and-clj-time-to-calculate-my-sons-age/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 20:27:27 +0000</pubDate>
		<dc:creator>Jacek Laskowski</dc:creator>
				<category><![CDATA[Languages]]></category>
		<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://blog.japila.pl/?p=710</guid>
		<description><![CDATA[It&#8217;s not as easy as I initially thought to calculate the exact age of my son when the days fly by quickly and the time interval is usually measured in weeks or (less often) months, or hardly thus far &#8211; years. That&#8217;s why I thought about setting up a Clojure project with lein&#8216;s help to [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s not as easy as I initially thought to calculate the exact age of my son when the days fly by quickly and the time interval is usually measured in weeks or (less often) months, or hardly thus far &#8211; years. That&#8217;s why I thought about setting up a <a href="http://clojure.org">Clojure</a> project with <a href="https://github.com/technomancy/leiningen">lein</a>&#8216;s help to develop an application (a script, shall I say?) to calculate it for me. It&#8217;s been on my TODO list for far too long.</p>
<p>Lein is pretty easy to start with &#8211; just type in <code>lein new</code> with the name of your project and you&#8217;re done.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
jacek:~/oss
$ lein new maksym-age-clojure
Created new project in: /Users/jacek/oss/maksym-age-clojure
Look over project.clj and start coding in maksym_age_clojure/core.clj
jacek:~/oss
$ cd maksym-age-clojure
</pre>
<p>After all the book readings, I learnt that when you design an application in Clojure, use Java classes and libraries as much as possible (but not overly much!). I remembered when Stuart Halloway mentioned a Clojure library for Joda Time during his talk about Clojure &#8211; <a href="http://www.infoq.com/presentations/Clojure-in-the-Field">Clojure in the Field</a> (at 00:36:35) so I googled it to see if there&#8217;s a more recent version.</p>
<p>There is one &#8211; Sean Corfield&#8217;s <a href="https://github.com/seancorfield/clj-time">clj-time &#8211; a date and time library for Clojure, wrapping the Joda Time library</a>. It seemed a perfect fit for my needs.</p>
<p>I vi&#8217;ed <code>project.clj</code> and added the library.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
jacek:~/oss/maksym-age-clojure
$ cat project.clj
(defproject maksym-age-clojure &quot;1.0.0-SNAPSHOT&quot;
  :description &quot;Calculate Maksym's age in Clojure using Joda Time library&quot;
  :dependencies [[org.clojure/clojure &quot;1.3.0&quot;]
                 clj-time &quot;0.3.5&quot;])
</pre>
<p>Note: I don&#8217;t know how to tell WordPress to display :dependencies correctly so it contains clj-time &#8220;0.3.5&#8243; in the brackets. Anyone?</p>
<p>I ran <code>lein deps</code> and hopped into Clojure&#8217;s REPL with <code>lein repl</code>. No overly complicated stuff &#8211; quickly and easily.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
jacek:~/oss/maksym-age-clojure
$ lein deps
Downloading: clj-time/clj-time/0.3.5/clj-time-0.3.5.pom from repository central at http://repo1.maven.org/maven2
...
Copying 3 files to /Users/jacek/oss/maksym-age-clojure/lib
jacek:~/oss/maksym-age-clojure
$ lein repl
REPL started; server listening on localhost port 46468
user=&gt;
</pre>
<p>Reading <a href="https://github.com/seancorfield/clj-time#readme">the readme of the clj-time project</a> is almost like being guided by a mentor who knows what you&#8217;re up to if you&#8217;re in the room (i.e. on the project&#8217;s website). It&#8217;s concise and exactly to the point. No troubles along the way. It is during such moments when I wonder how people can claim programming is a huge undertaking?!</p>
<p>I moved along importing the <code>clj-time.core</code> (the <a href="http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/use">use</a> function) and the other functions which I doubt anyone would find hard to comprehend.</p>
<pre class="brush: clojure; gutter: false; title: ; notranslate">
user=&gt; (use 'clj-time.core)
WARNING: extend already refers to: #'clojure.core/extend in namespace: user, being replaced by: #'clj-time.core/extend
nil
user=&gt; ; maksym was born on 10/03/2011 at 17:23 CET
user=&gt; (def maksym-birth-date-time (date-time 2011 10 03 17 23))
#'user/maksym-birth-date-time
user=&gt; (in-months (interval maksym-birth-date-time (now)))
4
user=&gt; (in-weeks (interval maksym-birth-date-time (now)))
18
</pre>
<p>I&#8217;ll leave it as an exercise to you to have it as a standalone script in the project. I seem to have lost interest in it in its current form. Sorry. I&#8217;ll ditch the project and create another one for more general age calculations that would help me to remember my entire family&#8217;s birthdays. That&#8217;s the plan.</p>
<p>I&#8217;d like to thank Stuart and Sean for the enormous oversimplification of the development efforts of mine &#8211; Stuart planted the idea of using the library Sean currently maintains. Not much was left to me! <img src='http://blog.japila.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/blog-japila-pl/~4/xNqKp8lDP1c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.japila.pl/2012/02/clojures-lein-and-clj-time-to-calculate-my-sons-age/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.japila.pl/2012/02/clojures-lein-and-clj-time-to-calculate-my-sons-age/</feedburner:origLink></item>
		<item>
		<title>From lein’s sources – standalone repl, LEIN_REPL_PORT, (exit), .lein-classpath, and still no Clojure 1.3.0</title>
		<link>http://feedproxy.google.com/~r/blog-japila-pl/~3/kKg1w6v-OUk/</link>
		<comments>http://blog.japila.pl/2012/02/from-leins-sources-standalone-repl-lein_repl_port-exit-lein-classpath-and-still-no-clojure-1-3-0/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 22:51:38 +0000</pubDate>
		<dc:creator>Jacek Laskowski</dc:creator>
				<category><![CDATA[Languages]]></category>
		<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://blog.japila.pl/?p=702</guid>
		<description><![CDATA[I knew there were some changes to fire up Clojure&#8216;s REPL with lein repl outside a project, so it brought no surprise when I ran lein repl in a directory and the REPL was ready. What I was however concerned with was that the Clojure&#8217;s version was merely 1.2.1 (the latest version is 1.3.0). I [...]]]></description>
			<content:encoded><![CDATA[<p>I knew there were some changes to fire up <a href="http://clojure.org">Clojure</a>&#8216;s REPL with <code>lein repl</code> outside a project, so it brought no surprise when I ran lein repl in a directory and the REPL was ready.</p>
<p>What I was however concerned with was that the Clojure&#8217;s version was merely <strong>1.2.1</strong> (<a href="http://clojure.org/downloads">the latest version is 1.3.0</a>).</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
$ lein repl
REPL started; server listening on localhost port 16924
user=&gt; (clojure-version)
&quot;1.2.1&quot;
</pre>
<p>I have yet to figure out how to rise it one level up to <strong>1.3.0</strong> outside a project, but as I was looking at the source code of <a href="https://github.com/technomancy/leiningen/blob/master/src/leiningen/repl.clj">leiningen/repl.clj</a> I ran across the environment setting <strong>LEIN_REPL_PORT</strong> that does a magic to set nREPL&#8217;s port to a given value.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
jacek:~/oss
$ LEIN_REPL_PORT=8000 lein repl
REPL started; server listening on localhost port 8000
user=&gt;
</pre>
<p>It&#8217;s also possible to use <strong>:repl-port</strong> in a lein project to have nREPL server listen to this port.</p>
<p>Although it&#8217;s not the answer for the initial question of mine, I enjoyed it very much <img src='http://blog.japila.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Delving into the sources deeper, I ended up at <a href="https://github.com/technomancy/leiningen/blob/master/leiningen-core/src/leiningen/core/main.clj">leiningen/core/main.clj</a> in which I found the <strong>(exit)</strong> function. It appears to work in REPL just fine.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
jacek:~/oss
$ LEIN_REPL_PORT=8000 lein repl
REPL started; server listening on localhost port 8000
user=&gt; (exit)
</pre>
<p>And when I was about to leave the main issue of having Clojure 1.3.0 available in REPL for the other day, I decided to glance at <code>lein</code> shell script itself (I work with the 1.6.2 version). That seemed like a great idea! See the following snippet I took off the lein script.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
CLOJURE_JAR=&quot;$HOME/.m2/repository/org/clojure/clojure/1.2.1/clojure-1.2.1.jar&quot;
# apply context specific CLASSPATH entries
if [ -f .lein-classpath ]; then
    CLASSPATH=&quot;`cat .lein-classpath`:$CLASSPATH&quot;
fi
</pre>
<p>I couldn&#8217;t have believed what I&#8217;d found! I created a <strong>.lein-classpath</strong> file with Clojure 1.3.0 jar&#8217;s path inside hoping I eventually have that version inside REPL.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
$ cat .lein-classpath
$HOME/.m2/repository/org/clojure/clojure/1.3.0/clojure-1.3.0.jar
</pre>
<p>With the change, I had thought lein repl would&#8217;ve given me what I initially was looking for &#8211; Clojure 1.3.1 inside the REPL for a standalone lein repl session, but it was far from truth. It simply didn&#8217;t work out.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
$ DEBUG=1 lein repl
$HOME/.m2/repository/org/clojure/clojure/1.3.0/clojure-1.3.0.jar::::::test/:src/:resources/:/Users/jacek/.lein/self-installs/leiningen-1.6.2-standalone.jar
/Users/jacek/.m2/repository/org/clojure/clojure/1.2.1/clojure-1.2.1.jar
REPL started; server listening on localhost port 9641
user=&gt; (clojure-version)
&quot;1.2.1&quot;
</pre>
<p>Then I realized I&#8217;d need to fix the script to let me choose the version of Clojure. I introduced the following change.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
CLOJURE_JAR=${CLOJURE_JAR:-&quot;$HOME/.m2/repository/org/clojure/clojure/1.2.1/clojure-1.2.1.jar&quot;}
</pre>
<p>Ran lein repl and&#8230;ouch, it didn&#8217;t work either.</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
$ CLOJURE_JAR=$HOME/.m2/repository/org/clojure/clojure/1.3.0/clojure-1.3.0.jar DEBUG=1 lein repl
$HOME/.m2/repository/org/clojure/clojure/1.3.0/clojure-1.3.0.jar::::::test/:src/:resources/:/Users/jacek/.lein/self-installs/leiningen-1.6.2-standalone.jar
/Users/jacek/.m2/repository/org/clojure/clojure/1.3.0/clojure-1.3.0.jar

Exception in thread &quot;main&quot; java.lang.RuntimeException: java.lang.NoSuchMethodError: clojure.lang.KeywordLookupSite.&lt;init&gt;(ILclojure/lang/Keyword;)V
     at clojure.lang.Util.runtimeException(Util.java:165)
     at clojure.lang.Compiler.eval(Compiler.java:6476)
     at clojure.lang.Compiler.eval(Compiler.java:6431)
     at clojure.core$eval.invoke(core.clj:2795)
     at clojure.main$eval_opt.invoke(main.clj:296)
     at clojure.main$initialize.invoke(main.clj:315)
     at clojure.main$script_opt.invoke(main.clj:339)
     at clojure.main$main.doInvoke(main.clj:426)
     at clojure.lang.RestFn.invoke(RestFn.java:457)
     at clojure.lang.Var.invoke(Var.java:413)
     at clojure.lang.AFn.applyToHelper(AFn.java:172)
     at clojure.lang.Var.applyTo(Var.java:518)
     at clojure.main.main(main.java:37)
Caused by: java.lang.NoSuchMethodError: clojure.lang.KeywordLookupSite.&lt;init&gt;(ILclojure/lang/Keyword;)V
     at leiningen.util.paths$native_arch_path.&lt;clinit&gt;(paths.clj:32)
     at leiningen.util.paths__init.load(Unknown Source)
     at leiningen.util.paths__init.&lt;clinit&gt;(Unknown Source)
     at java.lang.Class.forName0(Native Method)
...
</pre>
<p>Time to report an issue to lein&#8217;s JIRA and hope it gets some love from the developers of lein. Would you support it?</p>
<p>Ah, use <strong>DEBUG</strong> to see what&#8217;s happening under the covers of the lein script when it runs.</p>
<img src="http://feeds.feedburner.com/~r/blog-japila-pl/~4/kKg1w6v-OUk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.japila.pl/2012/02/from-leins-sources-standalone-repl-lein_repl_port-exit-lein-classpath-and-still-no-clojure-1-3-0/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.japila.pl/2012/02/from-leins-sources-standalone-repl-lein_repl_port-exit-lein-classpath-and-still-no-clojure-1-3-0/</feedburner:origLink></item>
		<item>
		<title>Helping daughter and myself with Clojure</title>
		<link>http://feedproxy.google.com/~r/blog-japila-pl/~3/M4a1VDWGA48/</link>
		<comments>http://blog.japila.pl/2012/02/helping-daughter-and-myself-with-clojure/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 22:57:29 +0000</pubDate>
		<dc:creator>Jacek Laskowski</dc:creator>
				<category><![CDATA[Languages]]></category>
		<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://blog.japila.pl/?p=693</guid>
		<description><![CDATA[Right on time when I needed an idea for an application to work on with Clojure, my daughter asked me to run an assessment of her skills to memorize countries and their capitals. It was her home assignment for geography at school. And we were running quizes where I was picking the countries and capitals [...]]]></description>
			<content:encoded><![CDATA[<p>Right on time when I needed an idea for an application to work on with <a href="http://clojure.org">Clojure</a>, my daughter asked me to run an assessment of her skills to memorize countries and their capitals. It was her home assignment for geography at school.</p>
<p>And we were running quizes where I was picking the countries and capitals so she could practise. It was quite a while when I was learning it &#8211; it brought so much fun. Until she seemed a little tired. Then we stopped and after a while started over. The often we did it, the sooner she became tired. Fun was turning into frustration very quickly.</p>
<p>After a day or two I came up with an idea to write an application in Clojure instead. She could learn quite differently and hopefully more effectively (they say it&#8217;s important to change the ways we learn with different tools and techniques being changed often). She&#8217;d benefit and so would I. I couldn&#8217;t believe I&#8217;d be working on something real!</p>
<p>It took me a couple of hours before I finished the work with the following sample application in Clojure. Would you mind sharing your thoughts about its strengths and weaknesses? I do know it&#8217;s way too far from being production ready, and can&#8217;t think of a better way to have it as such without your help. I&#8217;d appreciate it very much! So would my daughter, I believe.</p>
<pre class="brush: clojure; gutter: false; title: ; notranslate">
(ns geo-tester-clojure.core
  (:use 1]))

;; can be changed by user
(def ^:dynamic *number-of-questions* 10)

(def countries-cities
  [{:country &quot;Polska&quot; :capital &quot;Warszawa&quot;}
   {:country &quot;Dania&quot; :capital &quot;Kopenhaga&quot;}
   {:country &quot;Liechtenstein&quot; :capital &quot;Vaduz&quot;}
   {:country &quot;Bosnia i Hercegowina&quot; :capital &quot;Sarajewo&quot;}])

(def score (atom 0))

(defn score-up []
  &quot;correct answer&quot;
  (swap! score inc))

(defn score-down []
  &quot;incorrect answer&quot;
  (swap! score dec))

(defn capital-correct? [{:keys [capital]} answer]
  (.equalsIgnoreCase capital answer))

(defn quiz []
  (let [qs (take *number-of-questions* (shuffle countries-cities))]
    (loop [qs qs]
      (when-not (empty? qs)
        (let [cc (first qs)]
          (print (format &quot;Enter the capital of %s: &quot; (capitalize (:country cc))))
          (flush)
          (let [answer (read-line)]
            (if (capital-correct? cc answer)
              (score-up)
              (score-down)))
          (recur (next qs))))))
  (println &quot;RESULT:&quot; @score))

(quiz)
</pre>
<img src="http://feeds.feedburner.com/~r/blog-japila-pl/~4/M4a1VDWGA48" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.japila.pl/2012/02/helping-daughter-and-myself-with-clojure/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://blog.japila.pl/2012/02/helping-daughter-and-myself-with-clojure/</feedburner:origLink></item>
	</channel>
</rss>

