<?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>Anthony Long</title>
	<atom:link href="http://antlong.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://antlong.com</link>
	<description></description>
	<lastBuildDate>Wed, 28 Jul 2010 15:08:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Run Selenium Cases Through A Web Interface</title>
		<link>http://antlong.com/run-selenium-cases-through-a-web-interface/</link>
		<comments>http://antlong.com/run-selenium-cases-through-a-web-interface/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 15:07:28 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[QA]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Test Automation]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://antlong.com/?p=232</guid>
		<description><![CDATA[I&#8217;ve heard a couple of people ask how to run Selenium test cases through a web interface with python. Here is how you do it. I do not recommend this. Some cases can take over 30-60 seconds to run, and would cause the browser to time out before it finished, which would render the case, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve heard a couple of people ask how to run Selenium test cases through a web interface with python. Here is how you do it.</p>
<p><span id="more-232"></span></p>
<p>I do not recommend this. Some cases can take over 30-60 seconds to run, and would cause the browser to time out before it finished, which would render the case, and this mechanism useless.</p>
<p>However if you still want to give this a shot, here is some sample code to get you started.</p>
<pre class="brush: python;">
from selenium import selenium
from flask import Flask
from flask import render_template
import unittest
SERVER_SETUP = [&quot;ip_for_selenium_server&quot;, 4444, &quot;*firefox&quot;, &quot;your_base_url&quot;]

app = Flask(__name__)

@app.route(&quot;/&quot;)
def index():
    return render_template('template.html', name='index')

@app.route(&quot;/Test_1/&quot;)
def test_1():
    selenium.selenium = selenium(*SERVER_SETUP)
    selenium.selenium.start()
    selenium.selenium.open(&quot;http://example.com/&quot;)
    selenium.selenium.click(&quot;link=ishjdf&quot;)

if __name__ == &quot;__main__&quot;:
    app.run(debug=True)
</pre>
<p>Everything in the above script should be obvious. The cool part about app.run() is it has debug=True, which will restart the server whenever you edit and save the code.</p>
<p>Here is the template.html.</p>
<pre class="brush: xml;">
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;style&gt;
body{ font-size: 12px; font-family: Arial; }
&lt;/style&gt;
&lt;script src=&quot;http://code.jquery.com/jquery-latest.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;b&gt;&lt;h1&gt;Some Text Here&lt;/b&gt;&lt;/h1&gt;
&lt;script&gt;
function test(url) {
	alert(url);
   $('#result').load(url);
}
$(document).ready(function() {
   $(&quot;a&quot;).click(function(e) {
       e.preventDefault();
       var url = $(this).attr(&quot;href&quot;);
       test(url);
   });
});
&lt;/script&gt;

&lt;a href=&quot;/Test_1/&quot;&gt;Perform Test 1&lt;/a&gt;
&lt;div id=&quot;result&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Add this inside a folder within your root,  called templates/. You should have root/ and root/templates.</p>
<p>Enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://antlong.com/run-selenium-cases-through-a-web-interface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nose print bug fixed</title>
		<link>http://antlong.com/nose-print-bug-fixed/</link>
		<comments>http://antlong.com/nose-print-bug-fixed/#comments</comments>
		<pubDate>Wed, 21 Jul 2010 03:55:43 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://antlong.com/?p=220</guid>
		<description><![CDATA[I fixed the nose print bug, where the first run of a test with a print statement would pass but any run thereafter would fail. Get the fix here: http://github.com/antlong/nose If you see this error, then you need to checkout my fix: ERROR: test.test &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Traceback (most recent call last): File &#34;/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose/case.py&#34;, line 188, in [...]]]></description>
			<content:encoded><![CDATA[<p>I fixed the nose print bug, where the first run of a test with a print statement would pass but any run thereafter would fail.</p>
<p>Get the fix here:</p>
<p>http://github.com/antlong/nose</p>
<p><span id="more-220"></span></p>
<p>If you see this error, then you need to checkout my fix:</p>
<p>ERROR: test.test<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Traceback (most recent call last):<br />
  File &quot;/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose/case.py&quot;, line 188, in runTest<br />
    test(*self.arg)<br />
  File &quot;/Users/along/Desktop/nosetest/test.py&quot;, line 2, in test<br />
    print(&quot;hello&quot;)<br />
  File &quot;/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/StringIO.py&quot;, line 213, in write<br />
    _complain_ifclosed(self.closed)<br />
TypeError: &#8216;NoneType&#8217; object is not callable</p>
<p>The fix lies in editing capture.py to remove the two commented items from start()</p>
<pre class="brush: python;">
    def formatError(self, test, err):
        &quot;&quot;&quot;Add captured output to error report.
        &quot;&quot;&quot;
        test.capturedOutput = output = self.buffer
        #COMMENT THIS LINE BELOW
        #self._buf = None
        if not output:
            # Don't return None as that will prevent other
            # formatters from formatting and remove earlier formatters
            # formats, instead return the err we got
            return err
        ec, ev, tb = err
        return (ec, self.addCaptureToErr(ev, output), tb)
</pre>
<p>Also for good measure, change<br />
from StringIO import StringIO<br />
to<br />
from cStringIO import StringIO</p>
]]></content:encoded>
			<wfw:commentRss>http://antlong.com/nose-print-bug-fixed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python Credit Card Generator</title>
		<link>http://antlong.com/python-credit-card-generator/</link>
		<comments>http://antlong.com/python-credit-card-generator/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 20:07:01 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Snippets]]></category>

		<guid isPermaLink="false">http://antlong.com/?p=218</guid>
		<description><![CDATA[from random import Random import copy generator = Random() generator.seed() def creditcard(type=&#34;&#34;): def credit_card_number(generator, prefixList, length): def _completed_number(prefix, length): ccnumber = prefix while len(ccnumber) &#60; (length - 1): digit = generator.choice(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']) ccnumber.append(digit) sum, pos = (0, 0) reversedCCnumber = [] reversedCCnumber.extend(ccnumber) reversedCCnumber.reverse() while pos &#60; length [...]]]></description>
			<content:encoded><![CDATA[<pre class="brush: python;">
from random import Random
import copy
generator = Random()
generator.seed()

def creditcard(type=&quot;&quot;):
        def credit_card_number(generator, prefixList, length):
            def _completed_number(prefix, length):
                ccnumber = prefix
                while len(ccnumber) &lt; (length - 1):
                	digit = generator.choice(['0',  '1', '2', '3', '4', '5', '6', '7', '8', '9'])
                	ccnumber.append(digit)
                sum, pos = (0, 0)
                reversedCCnumber = []
                reversedCCnumber.extend(ccnumber)
                reversedCCnumber.reverse()
                while pos &lt; length - 1:
                    odd = int( reversedCCnumber[pos] ) * 2
                    if odd &gt; 9:
                        odd -= 9
                    sum += odd
                    if pos != (length - 2):
                        sum += int( reversedCCnumber[pos+1] )
                    pos += 2
                checkdigit = ((sum / 10 + 1) * 10 - sum) % 10
                ccnumber.append( str(checkdigit) )
                return ''.join(ccnumber)
            result = []
            ccnumber = copy.copy( generator.choice(prefixList) )
            result.append( _completed_number(ccnumber, length) )
            return result

        if type in &quot;visa&quot;:
            visaPrefixList = [['4','0','2','4', '0', '0', '7', '1'],]
            return credit_card_number(generator, visaPrefixList, 16)
        elif type is &quot;amex&quot;:
            amexPrefixList = [['3','4'],['3', '7']]
            return credit_card_number(generator, amexPrefixList, 16)
        elif type is &quot;discover&quot;:
            discoverPrefixList = [['6','0','1','1']]
            return credit_card_number(generator, discoverPrefixList, 16)
        elif type is &quot;mastercard&quot;:
            mastercardPrefixList = [['5','1'],['5','2'],['5','3'],['5','4'],['5','5']]
            return credit_card_number(generator, mastercardPrefixList, 16)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://antlong.com/python-credit-card-generator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Run concurrent processes</title>
		<link>http://antlong.com/run-concurrent-processes/</link>
		<comments>http://antlong.com/run-concurrent-processes/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 15:37:24 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Snippets]]></category>

		<guid isPermaLink="false">http://antlong.com/?p=216</guid>
		<description><![CDATA[import signal import subprocess, os signal.alarm(5) def oh_crap(*args): def _inner(*a): for pid in args: print &#34;Killing %d&#34; % pid os.kill(pid, signal.SIGKILL) return _inner p1 = subprocess.Popen([&#34;/usr/bin/python&#34;, &#34;alarmer.py&#34;]) p2 = subprocess.Popen([&#34;/usr/bin/python&#34;, &#34;alarmer.py&#34;]) signal.signal(signal.SIGALRM, oh_crap(p1.pid, p2.pid)) pid, sts = os.waitpid(p1.pid, 0) pid, sts = os.waitpid(p2.pid, 0) print &#34;Done.&#34;]]></description>
			<content:encoded><![CDATA[<pre class="brush: python;">
import signal
import subprocess, os

signal.alarm(5)

def oh_crap(*args):
    def _inner(*a):
        for pid in args:
            print &quot;Killing %d&quot; % pid
            os.kill(pid, signal.SIGKILL)
    return _inner

p1 = subprocess.Popen([&quot;/usr/bin/python&quot;, &quot;alarmer.py&quot;])
p2 = subprocess.Popen([&quot;/usr/bin/python&quot;, &quot;alarmer.py&quot;])

signal.signal(signal.SIGALRM, oh_crap(p1.pid, p2.pid))

pid, sts = os.waitpid(p1.pid, 0)
pid, sts = os.waitpid(p2.pid, 0)

print &quot;Done.&quot;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://antlong.com/run-concurrent-processes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Giant List of Data Models</title>
		<link>http://antlong.com/giant-list-of-data-models/</link>
		<comments>http://antlong.com/giant-list-of-data-models/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 20:02:28 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Data Models]]></category>

		<guid isPermaLink="false">http://antlong.com/?p=212</guid>
		<description><![CDATA[I was searching for a list of common data models for picka. What I came across was this monster listing. http://www.databaseanswers.org/data_models/]]></description>
			<content:encoded><![CDATA[<p>I was searching for a list of common data models for picka. What I came across was this monster listing.</p>
<p><span id="more-212"></span></p>
<p><a href="http://www.databaseanswers.org/data_models/">http://www.databaseanswers.org/data_models/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://antlong.com/giant-list-of-data-models/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Strain</title>
		<link>http://antlong.com/the-strain/</link>
		<comments>http://antlong.com/the-strain/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 18:49:29 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Reading]]></category>

		<guid isPermaLink="false">http://antlong.com/?p=204</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://antlong.com/the-strain/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter your build status with Twildbot.</title>
		<link>http://antlong.com/twitter-your-build-status-with-twildbot/</link>
		<comments>http://antlong.com/twitter-your-build-status-with-twildbot/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 14:41:52 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[QA]]></category>
		<category><![CDATA[Snippets]]></category>

		<guid isPermaLink="false">http://antlong.com/?p=165</guid>
		<description><![CDATA[This is a tiny script which will get the current status of your build, and tweet it to your twitter account. Enjoy. #!/usr/bin/env python # Watch builds on buildbot and publish to twitter from time import time, sleep from xmlrpclib import ServerProxy from urllib import urlopen user, password = &#34;USERNAME&#34;, &#34;PASSWORD&#34; bbot_url = &#34;http://buildbot.example.com/xmlrpc&#34; tweet_url [...]]]></description>
			<content:encoded><![CDATA[<p>This is a tiny script which will get the current status of your build, and tweet it to your twitter account.</p>
<p><span id="more-165"></span></p>
<p>Enjoy.</p>
<pre class="brush: python;">
#!/usr/bin/env python
# Watch builds on buildbot and publish to twitter

from time import time, sleep
from xmlrpclib import ServerProxy
from urllib import urlopen

user, password = &quot;USERNAME&quot;, &quot;PASSWORD&quot;
bbot_url = &quot;http://buildbot.example.com/xmlrpc&quot;
tweet_url = &quot;http://%s:%s@twitter.com/statuses/update.xml&quot; % (user, password)

def main():
 proxy = ServerProxy(bbot_url)
 last_time = time()

 while 1:
 now = time()
 builds = proxy.getAllBuildsInInterval(last_time, now)
 for build in builds:
 builder, build, status = build[0], build[1], build[5]
 status = &quot;OK&quot; if status == &quot;success&quot; else &quot;BROKEN&quot;
 message = &quot;[%s] build %s is %s&quot; % (builder, build, status)
 urlopen(tweet_url, &quot;status=%s&quot; % message)

 last_time = now if builds else last_time
 sleep(10)

if __name__ == &quot;__main__&quot;:
 main()
</pre>
]]></content:encoded>
			<wfw:commentRss>http://antlong.com/twitter-your-build-status-with-twildbot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding JQuery Locators to Selenium</title>
		<link>http://antlong.com/adding-jquery-locators-to-selenium/</link>
		<comments>http://antlong.com/adding-jquery-locators-to-selenium/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 15:46:12 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Selenium]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Test Automation]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://antlong.com/?p=130</guid>
		<description><![CDATA[It&#8217;s very simple to add jquery functionality to your selenium installation, and also very useful if you use the functions a lot. Add this to RemoteRunner.html &#60;script language=&#34;JavaScript&#34; type=&#34;text/javascript&#34; src=&#34;lib/jquery.min.js&#34;&#62;&#60;/script&#62; &#60;script language=&#34;JavaScript&#34; type=&#34;text/javascript&#34;&#62; function openDomViewer() { var autFrame = document.getElementById('selenium_myiframe'); var autFrameDocument = new SeleniumFrame(autFrame).getDocument(); this.rootDocument = autFrameDocument; var domViewer = window.open(getDocumentBase(document) + 'domviewer/domviewer.html'); return [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s very simple to add jquery functionality to your selenium installation, and also very useful if you use the functions a lot.</p>
<p><span id="more-130"></span></p>
<p>Add this to RemoteRunner.html</p>
<pre class="brush: xml;">
        &lt;script language=&quot;JavaScript&quot; type=&quot;text/javascript&quot; src=&quot;lib/jquery.min.js&quot;&gt;&lt;/script&gt;
        &lt;script language=&quot;JavaScript&quot; type=&quot;text/javascript&quot;&gt;
            function openDomViewer() {
                var autFrame = document.getElementById('selenium_myiframe');
                var autFrameDocument = new SeleniumFrame(autFrame).getDocument();
                this.rootDocument = autFrameDocument;
                var domViewer = window.open(getDocumentBase(document) + 'domviewer/domviewer.html');
                return false;
            }
        &lt;/script&gt;
</pre>
<p>Next, for use in selenium we have to add the locator strategy to call functions:</p>
<pre class="brush: xml;">
mySelenium.addLocationStrategy(&quot;jquery&quot;,
            &quot;var loc = locator; &quot; +
            &quot;var attr = null; &quot; +
            &quot;var isattr = false; &quot; +
            &quot;var inx = locator.lastIndexOf('@'); &quot; +

            &quot;if (inx != -1){ &quot; +
            &quot;   loc = locator.substring(0, inx); &quot; +
            &quot;   attr = locator.substring(inx + 1); &quot; +
            &quot;   isattr = true; &quot; +
            &quot;} &quot; +

            &quot;var found = jQuery(inDocument).find(loc); &quot; +
            &quot;if (found.length &gt;= 1) { &quot; +
            &quot;   if (isattr) { &quot; +
            &quot;       return found[0].getAttribute(attr); &quot; +
            &quot;   } else { &quot; +
            &quot;       return found[0]; &quot; +
            &quot;   } &quot; +
            &quot;} else { &quot; +
            &quot;   return null; &quot; +
            &quot;}&quot;
        );
</pre>
<p>To use the newly created functionality:</p>
<pre class="brush: xml;">
jquery=
</pre>
]]></content:encoded>
			<wfw:commentRss>http://antlong.com/adding-jquery-locators-to-selenium/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selenium on the cloud, with Amazon EC2</title>
		<link>http://antlong.com/selenium-on-the-cloud-with-amazon-ec2/</link>
		<comments>http://antlong.com/selenium-on-the-cloud-with-amazon-ec2/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 21:30:51 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Writing]]></category>

		<guid isPermaLink="false">http://antlong.com/?p=116</guid>
		<description><![CDATA[I am currently writing a doc which aims to provide directions, analysis and benefits of using selenium in the cloud, with Amazon&#8217;s EC2. Included in the write-up, is Boto vs. Twisted Amazon. Essentially they are the same, the main difference being, Boto is &#8216;blocking&#8217; while TxAWS is &#8216;non-blocking&#8217;. Coming soon. # Outline Boto vs Twisted [...]]]></description>
			<content:encoded><![CDATA[<p>I am currently writing a doc which aims to provide directions, analysis and benefits of using selenium in the cloud, with Amazon&#8217;s EC2. Included in the write-up, is Boto vs. Twisted Amazon. Essentially they are the same, the main difference being, Boto is &#8216;blocking&#8217; while TxAWS is &#8216;non-blocking&#8217;.</p>
<p><span id="more-116"></span></p>
<p>Coming soon.</p>
<p># Outline<br />
Boto vs Twisted Amazon (ie blocking vs non-blocking)<br />
Server Setup<br />
Controlling instances<br />
Running Tests</p>
<p>Boto -</p>
]]></content:encoded>
			<wfw:commentRss>http://antlong.com/selenium-on-the-cloud-with-amazon-ec2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iTunes: One key song deletion.</title>
		<link>http://antlong.com/itunes-one-key-song-deletion/</link>
		<comments>http://antlong.com/itunes-one-key-song-deletion/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 20:05:56 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Snippets]]></category>

		<guid isPermaLink="false">http://antlong.com/?p=108</guid>
		<description><![CDATA[This AppleScript snippet will allow you to assign a key to instantly move the currently playing song to your trash. To set this, put it in ~/Library/iTunes/Scripts then assign the hotkey via System Preferences. global addenda tell application &#34;iTunes&#34; if player state is not stopped then set ofi to fixed indexing set fixed indexing to [...]]]></description>
			<content:encoded><![CDATA[<p>This AppleScript snippet will allow you to assign a key to instantly move the currently playing song to your trash. To set this, put it in ~/Library/iTunes/Scripts then assign the hotkey via System Preferences.</p>
<pre class="brush: python;">
global addenda
tell application &quot;iTunes&quot;
	if player state is not stopped then
		set ofi to fixed indexing
		set fixed indexing to true

		try
			set dbid to database ID of current track
			set cla to class of current track
			try
				set floc to (get location of current track)
			end try
			try
				delete (some track of library playlist 1 whose database ID is dbid)
			end try
			if cla is file track then
				my delete_the_file(floc)
			end if
		end try

		set fixed indexing to ofi

	end if
end tell

to delete_the_file(floc)
	try
		-- tell application &quot;Finder&quot; to delete floc
		do shell script &quot;mv &quot; &amp; quoted form of POSIX path of (floc as string) &amp; &quot; &quot; &amp; quoted form of POSIX path of (path to trash as string)
	end try
end delete_the_file
</pre>
]]></content:encoded>
			<wfw:commentRss>http://antlong.com/itunes-one-key-song-deletion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
