<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Free Geek &#187; Free Software</title>
	<atom:link href="http://freegeek.in/blog/tag/free-software/feed/" rel="self" type="application/rss+xml" />
	<link>http://freegeek.in/blog</link>
	<description>The Chronicles of Nerd-nia</description>
	<lastBuildDate>Wed, 02 Jun 2010 03:22:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Clojure Protocols &amp; Datatypes &#8212; A sneak peek</title>
		<link>http://freegeek.in/blog/2010/05/clojure-protocols-datatypes-a-sneak-peek/</link>
		<comments>http://freegeek.in/blog/2010/05/clojure-protocols-datatypes-a-sneak-peek/#comments</comments>
		<pubDate>Mon, 31 May 2010 13:06:58 +0000</pubDate>
		<dc:creator>Baishampayan</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[Free Software]]></category>
		<category><![CDATA[functional programming]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://freegeek.in/blog/?p=91</guid>
		<description><![CDATA[Clojure 1.2 introduces two very remarkable features &#8211; Protocols and Datatypes. Clojure is defined in terms of abstractions and various implementations of those abstractions. For example, vectors, maps, lists, sets in Clojure implement the sequence abstraction which lets us treat any of those data structures as sequences. Until recently it was not possible feasible to [...]]]></description>
			<content:encoded><![CDATA[<p>Clojure 1.2 introduces two very remarkable features &#8211; <a href="http://clojure.org/protocols">Protocols</a> and <a href="http://clojure.org/datatypes">Datatypes</a>. Clojure is defined in terms of abstractions and various implementations of those abstractions. For example, vectors, maps, lists, sets in Clojure implement the sequence abstraction which lets us treat any of those data structures as sequences.<br />
Until recently it was not <del datetime="2010-06-02T03:21:30+00:00">possible</del> <ins datetime="2010-06-02T03:21:30+00:00">feasible</ins> to define and implement such core abstractions in Clojure itself; one had to drop down to Java (or C#) for those tasks, but not anymore <img src='http://freegeek.in/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Clojure 1.2 now has excellent facilities for defining and implementing similar abstractions in a highly dynamic manner while maintaining fantastic performance characteristics.<br />
In this post, I will give you a brief overview of these new features and will show you how they are useful.</p>
<p><strong>Protocols</strong></p>
<p>Protocols in Clojure are similar to Java Interfaces, though not quite. Basically a protocol is a contract, a set of functionalities without any implementation. Let&#8217;s consider a simple protocol &#8211;</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defprotocol Fly
  <span style="color: #ff0000;">&quot;A simple protocol for flying&quot;</span>
  <span style="color: #66cc66;">&#40;</span>fly <span style="color: #66cc66;">&#91;</span>this<span style="color: #66cc66;">&#93;</span> <span style="color: #ff0000;">&quot;Method to fly&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>So here we have a trivial protocol Fly which declares a method fly which takes one argument &#8216;this&#8217; (which is actually the type implementing the protocol itself). In case of all methods defined via Protocols, the first argument is always the implementing type itself. The name &#8216;this&#8217; is just a convention; it could be &#8216;self&#8217;, etc. or anything.</p>
<p>When we declared the Fly protocol, two new vars were created. One is &#8216;Fly&#8217;, the protocol itself, and the other is &#8216;fly&#8217; which is a polymorphic function that will get called when we execute it on an implementation of Fly.</p>
<p>Right now, if you try to execute the method &#8216;fly&#8217; on any object, you will get an exception because no types are implementing that protocol yet, which brings us to the next topic, DataTypes.</p>
<p><strong>DataTypes</strong></p>
<p>Traditionally in Clojure whenever we wanted to have some kind of record or a property-only Class, we used maps or struct-maps. Those serve the purpose perfectly well in most cases but the problem was that those maps didn&#8217;t have any type information attached to them. As a result, we had to put some extra keys in maps to help us determine the type of a record before we could dispatch methods. There were some obvious performance limitations too; being vanilla maps, they were never as fast as Plain Old Java Objects (POJOs). Enter <a href="http://richhickey.github.com/clojure/clojure.core-api.html#clojure.core/deftype">deftype</a> and its cousin <a href="http://richhickey.github.com/clojure/clojure.core-api.html#clojure.core/defrecord">defrecord</a>.</p>
<p>In Clojure 1.2 we can define our own types using defrecord like this -</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defrecord Bird <span style="color: #66cc66;">&#91;</span>nom species<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Boom! We have a custom type, Bird with two fields, name and species. We can now instantiate a Bird like this -</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>def crow <span style="color: #66cc66;">&#40;</span>Bird<span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;Crow&quot;</span> <span style="color: #ff0000;">&quot;Corvus corax&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>We can access the fields of the Bird instance by treating it like<br />
a normal map -</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">user› <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">nom</span> crow<span style="color: #66cc66;">&#41;</span>
<span style="color: #ff0000;">&quot;Crow&quot;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">user› <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">species</span> crow<span style="color: #66cc66;">&#41;</span>
<span style="color: #ff0000;">&quot;Corvus corax&quot;</span></pre></div></div>

<p>We can also add/remove/modify keys in a record like we would do with a<br />
normal map.</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>def sparrow <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">assoc</span> crow <span style="color: #66cc66;">:</span><span style="color: #555;">nom</span> <span style="color: #ff0000;">&quot;Sparrow&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">species</span> <span style="color: #ff0000;">&quot;Passer domesticus&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>This will create a new immutable instance of Bird with different data. Note that since Clojure records are persistent and immutable, the original crow instance is not affected.</p>
<p>Now to make the Bird fly. We already have a protocol called Fly. We need to implement the protocol so that our birds can actually fly. One way to do that is to put the protocol implementation inline with the record definition itself -</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defrecord Bird <span style="color: #66cc66;">&#91;</span>nom species<span style="color: #66cc66;">&#93;</span>
  Fly
  <span style="color: #66cc66;">&#40;</span>fly <span style="color: #66cc66;">&#91;</span>this<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#40;</span>str <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">nom</span> this<span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot; flies...&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>So easy, right? If we now create another instance of Bird, it will actually be able to fly -</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">user› <span style="color: #66cc66;">&#40;</span>def kiwi <span style="color: #66cc66;">&#40;</span>Bird<span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;Kiwi&quot;</span> <span style="color: #ff0000;">&quot;Apteryx australis&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
#'user/kiwi
user› <span style="color: #66cc66;">&#40;</span>fly kiwi<span style="color: #66cc66;">&#41;</span>
<span style="color: #ff0000;">&quot;Kiwi flies...&quot;</span></pre></div></div>

<p>Great! But what happens to the Crow, and Sparrow? We created those instances when the Bird record didn&#8217;t have any implementation of the Fly protocol. You might face similar issues when you don&#8217;t have control over the code which defines the record/class. You will need to extend those types dynamically with implementation of a protocol. Enter <a href="http://richhickey.github.com/clojure/clojure.core-api.html#clojure.core/extend-type">extend-type</a>. extend-type (and its cousin <a href="http://richhickey.github.com/clojure/clojure.core-api.html#clojure.core/extend-protocol">extend-protocol</a>) allows us to implement protocols on pre-existing types. Consider the following example -</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defprotocol Walk
  <span style="color: #ff0000;">&quot;A simple protocol to make birds walk&quot;</span>
  <span style="color: #66cc66;">&#40;</span>walk <span style="color: #66cc66;">&#91;</span>this<span style="color: #66cc66;">&#93;</span> <span style="color: #ff0000;">&quot;Birds want to walk too!&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>extend-type Bird
  Walk
  <span style="color: #66cc66;">&#40;</span>walk <span style="color: #66cc66;">&#91;</span>this<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#40;</span>str <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">nom</span> this<span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot; walks too...&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>We just added an implementation of the Walk protocol to the existing type Bird. All new Bird instances created from now on will be able to Walk and Fly.</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">user› <span style="color: #66cc66;">&#40;</span>def hummingbird <span style="color: #66cc66;">&#40;</span>Bird<span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;Hummingbird&quot;</span> <span style="color: #ff0000;">&quot;Selasphorus rufus&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
user› <span style="color: #66cc66;">&#40;</span>fly hummingbird<span style="color: #66cc66;">&#41;</span>
<span style="color: #ff0000;">&quot;Hummingbird flies...&quot;</span>
user› <span style="color: #66cc66;">&#40;</span>walk hummingbird<span style="color: #66cc66;">&#41;</span>
<span style="color: #ff0000;">&quot;Hummingbird walks too...&quot;</span></pre></div></div>

<p>Cool, right? At times you might require a anonymous  object which implements some protocol or interface. You could utilise those objects in cases where you just need an object which implements a given protocol but you don&#8217;t care about its type. Clojure 1.2 gives you <a href="http://richhickey.github.com/clojure/clojure.core-api.html#clojure.core/reify">reify</a>. reify allows us to create one-off anonymous objects which implement one or more protocols.</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">user› <span style="color: #66cc66;">&#40;</span>fly <span style="color: #66cc66;">&#40;</span>reify Fly <span style="color: #66cc66;">&#40;</span>fly <span style="color: #66cc66;">&#91;</span>_<span style="color: #66cc66;">&#93;</span> <span style="color: #ff0000;">&quot;Swine flu...&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #ff0000;">&quot;Swine flu...&quot;</span></pre></div></div>

<p>Woah! Clojure can make Pigs fly <img src='http://freegeek.in/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Jokes apart, what we just did was very interesting. We just created an anonymous type which implements the Fly protocol and called the fly method on it; and it flu[sic] <img src='http://freegeek.in/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>We could implement multiple protocols in the same reify statement too,<br />
like this -</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>def pig <span style="color: #66cc66;">&#40;</span>reify
                Fly <span style="color: #66cc66;">&#40;</span>fly <span style="color: #66cc66;">&#91;</span>_<span style="color: #66cc66;">&#93;</span> <span style="color: #ff0000;">&quot;Swine flu...&quot;</span><span style="color: #66cc66;">&#41;</span>
                Walk <span style="color: #66cc66;">&#40;</span>walk <span style="color: #66cc66;">&#91;</span>_<span style="color: #66cc66;">&#93;</span> <span style="color: #ff0000;">&quot;Pig-man walking...&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
user› <span style="color: #66cc66;">&#40;</span>fly pig<span style="color: #66cc66;">&#41;</span>
<span style="color: #ff0000;">&quot;Swine flu...&quot;</span>
user› <span style="color: #66cc66;">&#40;</span>walk pig<span style="color: #66cc66;">&#41;</span>
<span style="color: #ff0000;">&quot;Pig-man walking...&quot;</span></pre></div></div>

<p>Beautiful. reify is quite similar to proxy and it is now recommended to use reify instead of proxy wherever possible because reify is much faster than proxy.</p>
<p>Before I finish off, let me explain the differences between defrecord and deftype. defrecord creates a new type and implements a few core Clojure interfaces like that of the persistent map, hashcode, keyword accessors, etc. If you are using deftype, Clojure will not implicitly implement any interface not provided by the user. In short, if you are using deftype, you will have to implement your own accessors, hashcode, etc. In most cases defrecord should suffice, but in other cases like when you need mutable fields, use deftype.</p>
<p>There is some in-depth explanation of Protocols and Datatypes on the <a href="http://clojure.org/">Clojure website</a> which you should consult if you need more information.</p>
<p><strong>Bonus Material</strong></p>
<p>Making Java Strings fly and walk <img src='http://freegeek.in/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">user› <span style="color: #66cc66;">&#40;</span>extend-type java<span style="color: #66cc66;">.</span>lang<span style="color: #66cc66;">.</span>String
                   Fly <span style="color: #66cc66;">&#40;</span>fly <span style="color: #66cc66;">&#91;</span>this<span style="color: #66cc66;">&#93;</span> <span style="color: #ff0000;">&quot;See me fly?&quot;</span><span style="color: #66cc66;">&#41;</span>
                   Walk <span style="color: #66cc66;">&#40;</span>walk <span style="color: #66cc66;">&#91;</span>this<span style="color: #66cc66;">&#93;</span> <span style="color: #ff0000;">&quot;Yes, that's me walking!&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #b1b100;">nil</span>
user› <span style="color: #66cc66;">&#40;</span>walk <span style="color: #ff0000;">&quot;foo&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #ff0000;">&quot;Yes, that's me walking!&quot;</span>
user› <span style="color: #66cc66;">&#40;</span>fly <span style="color: #ff0000;">&quot;bar&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #ff0000;">&quot;See me fly?&quot;</span></pre></div></div>

<p>PS &#8211; I wrote this today because I was sitting at home, sick. There are possibly some mistakes in this post; in which case, please let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://freegeek.in/blog/2010/05/clojure-protocols-datatypes-a-sneak-peek/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Slides from my Clojure talk at GNUnify 2010</title>
		<link>http://freegeek.in/blog/2010/02/slides-from-my-clojure-talk-at-gnunify-2010/</link>
		<comments>http://freegeek.in/blog/2010/02/slides-from-my-clojure-talk-at-gnunify-2010/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 07:51:42 +0000</pubDate>
		<dc:creator>Baishampayan</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[Free Software]]></category>
		<category><![CDATA[functional programming]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[talk]]></category>

		<guid isPermaLink="false">http://freegeek.in/blog/?p=86</guid>
		<description><![CDATA[I gave an intro talk about Clojure at GNUnify 2010, Pune today. It was supposed to be a very basic talk on Clojure aimed at Java programmers. Here are the slides - Introduction to Clojure View more presentations from Baishampayan Ghose.]]></description>
			<content:encoded><![CDATA[<p>I gave an intro talk about Clojure at <a href="http://gnunify.in/">GNUnify 2010</a>, Pune today. It was supposed to be a very basic talk on Clojure aimed at Java programmers. Here are the slides -</p>
<div id="__ss_3214693" style="width: 425px; text-align: left;"><a style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="Introduction to Clojure" href="http://www.slideshare.net/zaph0d/introduction-to-clojure">Introduction to Clojure</a><object style="margin: 0px;" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=clojure-100218040639-phpapp01&amp;rel=0&amp;stripped_title=introduction-to-clojure" /><param name="allowfullscreen" value="true" /><embed style="margin: 0px;" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=clojure-100218040639-phpapp01&amp;rel=0&amp;stripped_title=introduction-to-clojure" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration: underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration: underline;" href="http://www.slideshare.net/zaph0d">Baishampayan Ghose</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://freegeek.in/blog/2010/02/slides-from-my-clojure-talk-at-gnunify-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DO NOT WANT!</title>
		<link>http://freegeek.in/blog/2008/04/do-not-want/</link>
		<comments>http://freegeek.in/blog/2008/04/do-not-want/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 07:20:11 +0000</pubDate>
		<dc:creator>Baishampayan</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[bs]]></category>
		<category><![CDATA[Free Software]]></category>
		<category><![CDATA[hoax]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[stupid]]></category>

		<guid isPermaLink="false">http://g33k.wordpress.com/?p=33</guid>
		<description><![CDATA[Well the reason why I had to resurrect my old and unmaintained blog is that apparently, I have been nominated for the &#8220;Great Indian Developer Awards&#8221; in the &#8220;Top Committer&#8221; category. I had no idea about this until now as I have received no communication from the organisers regarding the awards and I have no [...]]]></description>
			<content:encoded><![CDATA[<p>Well the reason why I had to resurrect my old and unmaintained blog is that apparently, I have been nominated for the &#8220;<a href="http://developersummit.com/awards.html" target="_blank">Great Indian Developer Awards</a>&#8221; in the &#8220;Top Committer&#8221; category.</p>
<p>I had no idea about this until <a href="http://blogs.gnome.org/shres/2008/04/29/great-indian-developer-nomination/">now</a> as I have received no communication from the organisers regarding the awards and I have no idea how I got nominated.</p>
<p>And I think this is completely Bullshit.</p>
<p>I don&#8217;t see any reason how I can get nominated even though I haven&#8217;t been active in the <a href="http://www.gnu.org/philosophy/free-sw.html">Free Software </a>community since the last year or so.</p>
<p>I think there are <em>many</em> other people who deserve this much more than I do. Hell I don&#8217;t think I would even feature in the list of top 100 Indian Free Software developers.</p>
<p>To name a few, I would rather nominate the following (in no particular order):</p>
<ul>
<li><a href="http://t3.dotgnu.info/blog/">Gopal Vijayraghavan</a> (PHP APC, DotGNU)</li>
<li><a href="http://sayamindu.randomink.org/">Sayamindu Dasgupta</a> (GNOME, OLPC)</li>
<li><a href="http://ftbfs.wordpress.com/">Kartik Mistry</a> (Debian, OOo)</li>
<li><a href="http://www.ee.iitm.ac.in/~ee03b091/">Kumar Appaiah</a> (Debian)</li>
<li><a href="http://www.kix.in/">Ananth Narayanan</a> (Gentoo, PHP, Plan9)</li>
<li>&#8230; and many others</li>
</ul>
<p>So, the organisers, please don&#8217;t humiliate me like this and kindly take down my name from your God damned website.</p>
<p>I am just a Free Software enthusiast &#8230; <em>I don&#8217;t need no award</em>.</p>
<p>And in any case, I think this whole event is bullshit, just look at the other nominations and you will know. But that&#8217;s another story &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://freegeek.in/blog/2008/04/do-not-want/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
