<?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>Cantina Consulting &#187; steve</title>
	<atom:link href="http://www.cantinaconsulting.com/author/steve/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cantinaconsulting.com</link>
	<description></description>
	<lastBuildDate>Tue, 27 Jul 2010 18:47:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Grails &#8211; Exporting / Importing Domain Objects using DefaultGrailsDomainClass</title>
		<link>http://www.cantinaconsulting.com/2010/07/15/grails-exporting-importing-domain-objects-using-defaultgrailsdomainclass/</link>
		<comments>http://www.cantinaconsulting.com/2010/07/15/grails-exporting-importing-domain-objects-using-defaultgrailsdomainclass/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 18:48:38 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Groovy on Grails]]></category>

		<guid isPermaLink="false">http://www.cantinaconsulting.com/?p=422</guid>
		<description><![CDATA[Lately I&#8217;ve been working on a multi-tenant web app that contains a good-size number of domain objects. Within these objects, there exists a sub-set belonging to a root object, and the need arose to be able to quickly duplicate / populate the data within these objects between different instances of the app. It has become [...]]]></description>
			<content:encoded><![CDATA[<p>Lately I&#8217;ve been working on a multi-tenant web app that contains a good-size number of domain objects. Within these objects, there exists a sub-set belonging to a root object, and the need arose to be able to quickly duplicate / populate the data within these objects between different instances of the app. It has become quite an interesting problem: certainly one could create some SQL scripts to export/import data, but how does one do it in a user-friendly, Groovy/Grails manner?</p>
<p id="_mcePaste">The key turned out to be the discovery of the <a title="DefaultGrailsDomainClass" href="http://www.grails.org/doc/1.3.x/api/org/codehaus/groovy/grails/commons/DefaultGrailsDomainClass.html" target="_blank">DefaultGrailsDomainClass</a> . This class performs a series of introspections on your domain objects, and allows you to programmatically access quite a bit of information on them. For example, suppose we had the following domain object:</p>
<div>
<pre style="padding-left: 30px;">class Pizza{</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 60px;">String name

BigDecimal diameter

List toppings

hasMany = [toppings:Topping]</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 30px;">}</pre>
</div>
<p id="_mcePaste">Class &#8216;Pizza&#8217; contains a name / description, diameter, and a many-to-many relationship with the &#8216;Topping&#8217; class (although not defined here). Nice and simple&#8230; now, the good stuff.</p>
<p id="_mcePaste">By passing a Domain Object class to DefaultGrailsDomainClass, we can access a good deal of info about that Domain Object. Among other things there are methods to access a Map of the constraints, determine whether or not a property is a relation (1:1,1:m,m:m), and access the properties directly by obtaining a set of <a title="GrailsDomainClassProperties" href="http://grails.org/doc/1.3.x/api/org/codehaus/groovy/grails/commons/GrailsDomainClassProperty.html" target="_blank">GrailsDomainClassProperties</a> . Of particular use to me is the DefaultGrailsDomainClass.getPersistantProperties() method, which returns a GrailsDomainClassProperty List of all the properties that are persisted to the database. That&#8217;s pretty excellent.</p>
<p id="_mcePaste">To illustrate this, let&#8217;s get the persistent properties for a Pizza:</p>
<address id="_mcePaste" style="padding-left: 30px;"><span style="color: #333333;">def pizzaProperties = new DefaultGrailsDomainClass(Pizza.class).getPersistantProperties()</span></address>
<address style="padding-left: 30px;"><span style="color: #333333;"><br /></span></address>
<p id="_mcePaste">pizzaProperties now contains a list of &#8216;DefaultGrailsDomainClassProperty&#8217; objects. If we iterate through them, we can see the following information:</p>
<address>
<p><span style="color: #333333;">[name=diameter,type=double,persistent=true, optional=false, association=false, bidirectional=false, association-type=&lt;null&gt;]</span></p>
<p><span style="color: #333333;">[name=name,type=class java.lang.String,persistent=true, optional=false, association=false, bidirectional=false, association-type=&lt;null&gt;]</span></p>
<p><span style="color: #333333;">[name=toppings,type=interface java.util.List, persistent=true, optional=true, association=true, bidirectional=false, association-type=one-to-many]</span></p>
<p> </p>
<p> </p>
</address>
<p id="_mcePaste">Think of the possibilities of what can be accomplished by programmatically accessing the properties on your domain object! However, I am not exceedingly clever:</p>
<div>
<address style="padding-left: 30px;">def exportClassSingle(ConfigObject co, String className, objInstance){</address>
</div>
<div id="_mcePaste">
<address style="padding-left: 60px;">if(objInstance){</address>
</div>
<div id="_mcePaste">
<address style="padding-left: 60px;">/*</address>
</div>
<div id="_mcePaste">
<address style="padding-left: 90px;">The DefaultGrailsDomainClass allows discovery of the persistent properties for a domain object.</address>
</div>
<div id="_mcePaste">
<address style="padding-left: 60px;">*/</address>
</div>
<div id="_mcePaste">
<address style="padding-left: 60px;">def props = new DefaultGrailsDomainClass(objInstance.class).getPersistantProperties()</address>
</div>
<div id="_mcePaste">
<address style="padding-left: 60px;">/*</address>
</div>
<div id="_mcePaste">
<address style="padding-left: 90px;">getPersistantProperties generates a list of &#8220;DefaultGrailsDomainClassProperty&#8221; which contains a
<p>good deal of info about each property.</p>
<p> </p>
</p></address>
</div>
<div id="_mcePaste">
<address style="padding-left: 60px;">*/</address>
</div>
<div id="_mcePaste">
<address style="padding-left: 60px;">for(p in props){</address>
</div>
<div id="_mcePaste">
<address style="padding-left: 90px;">if(!p.isAssociation()){</address>
</div>
<div id="_mcePaste">
<address style="padding-left: 120px;">co[className][p.name] = preExportClean(objInstance[p.name])</address>
</div>
<div id="_mcePaste">
<address style="padding-left: 90px;">}</address>
</div>
<pre id="_mcePaste">
<address style="padding-left: 90px;">else{//do something clever!}

}</address>
</pre>
<pre id="_mcePaste">
<address style="padding-left: 30px;">}</address>
</pre>
<p id="_mcePaste">The exportClassSingle method above accepts the ConfigObject which will be populated with the domain object&#8217;s data, the name of the class, and an instance of the domain object. It is relatively simple: it takes the class, loads its persistent properties, loops through through them and if the property is not an association, it is added to the config object.  By repeatedly calling the method for each of our Domain objects, we build up the ConfigObject which contains class and instance data. The preExportClean() method looks for and escapes any usage of &#8216;$&#8217;, which can cause some odd behavior if not escaped. We ignore associations here because in the real app, everything is connected to one root object; if there were associations among the child objects that we wished to capture then the above method would be quite different.</p>
<div>
<p>The resulting ConfigObject can then be converted into a String containing a DSL describing your objects and data. The string can then be loaded back into a ConfigObject using the ConfigSlurper.</p>
</div>
<p id="_mcePaste">Given the following DSL:</p>
<div id="_mcePaste">
<pre style="padding-left: 30px;">pizza{</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 60px;">pizza_0{</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 90px;">name="Small"</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 90px;">diameter="8.0"</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 60px;">}</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 60px;">pizza_1{</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 90px;">name="Medium"</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 90px;">diameter="14.5"</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 60px;">}</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 60px;">pizza_2{</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 90px;">name="Large"</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 90px;">diameter="21.0"</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 60px;">}</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 30px;">}</pre>
</div>
<p id="_mcePaste">and assuming it&#8217;s saved in a String called &#8216;pizzaDSL&#8217;, we can import this data into our system using the following steps:</p>
<div id="_mcePaste">
<p>1. Import the DSL using ConfigSlurper.</p>
</div>
<pre style="padding-left: 30px;">ConfigObject config = new ConfigSlurper().parse( pizzaDSL )</pre>
<p id="_mcePaste">The ConfigObject config now contains a map of ConfigObjects. Using the key of &#8216;pizza&#8217; returns a map of 3 more ConfigObjects.</p>
<p>2. Construct objects using the configObject.</p>
<div id="_mcePaste">
<pre style="padding-left: 30px;">config["pizza"].each{key,map-&gt;</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 60px;">Pizza p = new Pizza()</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 60px;">p.properties = map</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 60px;">//set toppings</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 60px;">p.save()</pre>
</div>
<div id="_mcePaste">
<pre style="padding-left: 30px;">}</pre>
</div>
<div id="_mcePaste">
<p>One could also iterate through the root config object (in the case where we had more objects, e.g. &#8216;topping&#8217;) and use the key to determine which object to create and populate. This simple case has only one class, Pizza (and thus only one key).</p>
</div>
<p id="_mcePaste">3. Celebrate</p>
<p id="_mcePaste">Well, that&#8217;s it. I hope this helps explain the usage of the Default Domain Class and that you all find a usage for it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cantinaconsulting.com/2010/07/15/grails-exporting-importing-domain-objects-using-defaultgrailsdomainclass/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boston Grails Users&#8217; Group</title>
		<link>http://www.cantinaconsulting.com/2009/06/02/boston-grails-users-group/</link>
		<comments>http://www.cantinaconsulting.com/2009/06/02/boston-grails-users-group/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 19:14:26 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.cantinaconsulting.com/?p=181</guid>
		<description><![CDATA[As I&#8217;ve mentioned before, we here at Cantina are big fans of Groovy and Grails, and we are disappointed that the language is not used more widely. To do our part to spread joy that is Groovy, we&#8217;ve started a group on Meetup.com for Boston-based users (start local!). Check us out here: http://www.meetup.com/Grails-Boston. Our focus [...]]]></description>
			<content:encoded><![CDATA[<p>As I&#8217;ve mentioned before, we here at Cantina are big fans of Groovy and Grails, and we are disappointed that the language is not used more widely. To do our part to spread joy that is Groovy, we&#8217;ve started a group on Meetup.com for Boston-based users (start local!). Check us out here: <a title="Grails Group on Meetup" href="http://www.meetup.com/Grails-Boston" target="_blank">http://www.meetup.com/Grails-Boston</a>. Our focus will be to get together with other fans of Groovy/Grails and share ideas, present work members have done, show-off some plugins (check out <a title="Cantina Consutling Grails Plugins" href="link http://www.cantinaconsulting.com/grails-plugins/" target="_blank">ours</a>), and generally expand everyone&#8217;s knowledge of the language and framework. We&#8217;d love to have anyone who&#8217;s interested join us, even those new to Grails.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cantinaconsulting.com/2009/06/02/boston-grails-users-group/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Putting a Stranglehold on your GUI Applications with wxPython</title>
		<link>http://www.cantinaconsulting.com/2009/05/14/wxpython_first_impressions/</link>
		<comments>http://www.cantinaconsulting.com/2009/05/14/wxpython_first_impressions/#comments</comments>
		<pubDate>Thu, 14 May 2009 22:12:32 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[wxPython]]></category>

		<guid isPermaLink="false">http://www.cantinaconsulting.com/?p=152</guid>
		<description><![CDATA[It&#8217;s been a few weeks now since I signed up with the group here at Cantina, and so far I&#8217;ve had a great time. I&#8217;ve had the opportunity to learn quite a bit about online video distribution &#38; technologies, expand my knowledge of Flex / Flash, play around with Amazon&#8217;s Cloud solutions, and learn the [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a few weeks now since I signed up with the group here at Cantina, and so far I&#8217;ve had a great time. I&#8217;ve had the opportunity to learn quite a bit about online video distribution &amp; technologies, expand my knowledge of Flex / Flash, play around with Amazon&#8217;s Cloud solutions, and learn the excellent framework <a title="Grails" href="http://www.grails.org/" target="_blank">Groovy on Grails</a>. If you are familiar with Rails and like Java, I suggest giving it a try. The rest of the guys here are big fans and we&#8217;re doing our part to expand the Grails community and develop some great plugins.</p>
<p>In turn, I hope to encourage the use of my current favorite language, Python (see <a href="http://www.diveintopython.org/" target="_blank">http://www.diveintopython.org/</a> for a good tutorial). For an interpreted language (it does compile to c byte code at runtime), its capabilities and community support are overwhelmingly substantial. I&#8217;m continually surprised as I discover more; its breadth is so great, that Python leaves itself open to <a title="Python - flying" href="http://xkcd.com/353/" target="_blank">satire</a> ( also: <a href="http://xkcd.com/409/" target="_blank">here</a> and <a href="http://xkcd.com/413/" target="_blank">here</a>). I could drone on,  evangelizing its advantages at some detail (and bore everyone to tears, I&#8217;m sure), but that&#8217;s not why I&#8217;m writing today. No, the point here is to give a quick presentation on a particular package I&#8217;ve just started using that amazes me, and it should get more use: <a title="wxPython.org" href="http://www.wxpython.org/" target="_blank">wxPython</a>.</p>
<p>WxPython is module for Python that is essentially a wrapper for an open source project called <a href="http://wxwidgets.org/" target="_blank">wxWidgets</a>, so most of the credit should go to them. WxWidgets is certainly widely used (link: <a href="http://wxwidgets.org/about/users.htm" target="_blank">http://wxwidgets.org/about/users.htm</a> ); it&#8217;s a package that allows developers to quickly and easily access the GUI components in Windows, OS X, and various flavors of Linux. This allows development of applications that look native to the OS. WxPython allows one to rapidly develop applications entirely in Python, that look native to the OS. Imagine writing an application in OS X, then moving the code to a Windows or Ubuntu machine and having it work and look perfectly without any modifications! No more dealing with .dlls or compiling on individual machines.. just &#8216;python &lt;appname&gt;.py&#8217;.</p>
<p>In practice, it&#8217;s surprisingly easily to generate an entire event-driven application. The basic order of implementation is (1) design layout of your buttons,menus, widgets, etc, (2) implement event handlers, (3) bind event listeners to buttons / actions. I&#8217;d post some of my code, but it&#8217;s almost all currently in an NDA&#8217;ed project, so instead here&#8217;s some sample code from <a href="http://wiki.wxpython.org/AnotherTutorial" target="_blank">http://wiki.wxpython.org/AnotherTutorial</a> that creates a program with a toolbar:<br />
<span style="color: #0000ff;"><br />
</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;">#!/usr/bin/python</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
# toolbar.py</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
import wx</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
class MyToolBar(wx.Frame):</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"> def __init__(self, parent, id, title):</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(350, 250))</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"><br />
vbox = wx.BoxSizer(wx.VERTICAL)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar = wx.ToolBar(self, -1, style=wx.TB_HORIZONTAL | wx.NO_BORDER)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar.AddSimpleTool(1, wx.Image(&#8217;stock_new.png&#8217;, wx.BITMAP_TYPE_PNG).ConvertToBitmap(), &#8216;New&#8217;, &#8221;)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar.AddSimpleTool(2, wx.Image(&#8217;stock_open.png&#8217;, wx.BITMAP_TYPE_PNG).ConvertToBitmap(), &#8216;Open&#8217;, &#8221;)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar.AddSimpleTool(3, wx.Image(&#8217;stock_save.png&#8217;, wx.BITMAP_TYPE_PNG).ConvertToBitmap(), &#8216;Save&#8217;, &#8221;)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar.AddSeparator()</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar.AddSimpleTool(4, wx.Image(&#8217;stock_exit.png&#8217;, wx.BITMAP_TYPE_PNG).ConvertToBitmap(), &#8216;Exit&#8217;, &#8221;)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar.Realize()</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> vbox.Add(toolbar, 0, border=5)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.SetSizer(vbox)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.statusbar = self.CreateStatusBar()</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.Centre()</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"><br />
self.Bind(wx.EVT_TOOL, self.OnNew, id=1)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.Bind(wx.EVT_TOOL, self.OnOpen, id=2)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.Bind(wx.EVT_TOOL, self.OnSave, id=3)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.Bind(wx.EVT_TOOL, self.OnExit, id=4)</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
def OnNew(self, event):</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.statusbar.SetStatusText(&#8216;New Command&#8217;)</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
def OnOpen(self, event):</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.statusbar.SetStatusText(&#8216;Open Command&#8217;)</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
def OnSave(self, event):</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.statusbar.SetStatusText(&#8216;Save Command&#8217;)</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
def OnExit(self, event):</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.Close()</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
class MyApp(wx.App):</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> def OnInit(self):</span></p>
<p style="text-align: left; padding-left: 90px;"><span style="color: #0000ff;"> frame = MyToolBar(None, -1, &#8216;toolbar.py&#8217;)</span></p>
<p style="text-align: left; padding-left: 90px;"><span style="color: #0000ff;"> frame.Show(True)</span></p>
<p style="text-align: left; padding-left: 90px;"><span style="color: #0000ff;"> return True</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
app = MyApp(0)</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;">app.MainLoop()</span></p>
<pre style="text-align: left;"><span style="color: #ff0000;">
</span></pre>
<p><span style="color: #000000;">results in this (on Ubuntu):</span></p>
<div id="attachment_153" class="wp-caption aligncenter" style="width: 363px"><a href="http://www.cantinaconsulting.com/wp-content/toolbar.png"><img class="size-full wp-image-153" title="Ubuntu_wxpython_app" src="http://www.cantinaconsulting.com/wp-content/toolbar.png" alt="Resulting application in Ubuntu" width="353" height="263" /></a><p class="wp-caption-text">Resulting application in Ubuntu</p></div>
<p>While not much to look at, certainly, briefly think about what&#8217;s going on here. In ~45 lines of code, we have a fully functional application. It doesn&#8217;t do much,  yet, but imagine what we could do if you started hooking up some of your existing Python code, or hooking in some other Python modules. There&#8217;s a lot of power in this; the mind can hardly grasp the possibilities of, say, Windows apps powered by Python (take that, Visual Studio). I feel strongly that it has the potential to handle some serious projects, if given the opportunity.</p>
<p>This would be intensive, but I&#8217;m still learning wxPython myself. So far, it&#8217;s been great fun, and I highly recommend others to check it out. I&#8217;d love to see some examples out there of anyone who&#8217;s developed apps in the framework (a quick search doesn&#8217;t reveal much), and perhaps I&#8217;ll post some of my own as I start using it more.</p>
<p>Until then, try taking a look at wxPython.org (link) and the wxPython wiki (link). Give it a shot; I&#8217;m sure you&#8217;ll love it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cantinaconsulting.com/2009/05/14/wxpython_first_impressions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
