<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>bitfission</title>
    <link>http://blog.bitfission.com/articles.rss</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>will leinweber</description>
    <item>
      <title>Haskell.tmbundle</title>
      <description>&lt;p&gt;I&amp;#8217;ve been learning Haskell lately, taking advantage of the downtime after graduation. I&amp;#8217;ve been meaning to learn a functional language for some time now. It was a toss up between this and erlang. I picked Haskell because someone is running a weekly lesson thread on a forum I read, and it&amp;#8217;s always more fun to learn a language with other people.&lt;/p&gt;

&lt;p&gt;The TextMate bundle for Haskell is a nice start, but there are a lot of improvements that can be made. I made a repo for it over at &lt;a href="http://github.com/will/haskell-tmbundle/tree/master"&gt;github&lt;/a&gt;, which can be cloned at &lt;code&gt;git://github.com/will/haskell-tmbundle.git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll be adding improvements to the bundle as I make them, and hopefully other people join in.&lt;/p&gt;</description>
      <pubDate>Wed, 21 May 2008 02:29:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:77b8b934-6796-4f3a-8b21-bcd29150a6fe</guid>
      <comments>http://blog.bitfission.com/articles/2008/05/21/haskell-tmbundle#comments</comments>
      <trackback:ping>http://blog.bitfission.com/trackbacks?article_id=haskell-tmbundle&amp;day=21&amp;month=05&amp;year=2008</trackback:ping>
      <link>http://blog.bitfission.com/articles/2008/05/21/haskell-tmbundle</link>
    </item>
    <item>
      <title>Test driving a file parser</title>
      <description>&lt;p&gt;My current project involves pulling gene names and group data from a tab separated file, then coloring those genes on a pathway diagram. Just like any other part of an application, the parser should be well tested. But how exactly should you go about testing all the different edge cases that the parser will see? &lt;/p&gt;

&lt;p&gt;One method I&amp;#8217;ve worked with was to have several sample files in the fixtures directory and load them. I don&amp;#8217;t really like this, for much the same reason I don&amp;#8217;t like fixtures. It&amp;#8217;s too easy for fixtures to deteriorate into a large, unmaintainable mess. But more importantly, I can&amp;#8217;t see the whole test on one screen. Parts are hidden across several files, all of which you have to read before you can understand the test. &lt;/p&gt;

&lt;p&gt;&lt;a href=http://bitfission.com/images/pathway.gif&gt;&lt;img src="http://bitfission.com/images/pathway.th.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve come up with a simple way to solve this problem. The test files should be created in the test. Now this is for tab separated files, but it could easily be changed to create csv files, or both.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;it &amp;quot;should skip empty lines and extra columns&amp;quot; do
  file = [
    [ &amp;quot;gene 1&amp;quot;, &amp;quot;group 1&amp;quot;, &amp;quot;only the first two columns count&amp;quot; ],
    [ ],
    [ &amp;quot;gene 2&amp;quot;, &amp;quot;group 1&amp;quot; ]
  ].to_test_file

  parser = Parser.new file
  parser.import

  parser.lines.should == [ [ &amp;quot;gene 1&amp;quot;, &amp;quot;group 1&amp;quot; ],
                           [ &amp;quot;gene 2&amp;quot;, &amp;quot;group 1&amp;quot; ] ]
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(I actually have the empty lines test separate from the extra columns test, I just wanted to put them together for this post.)&lt;/p&gt;

&lt;p&gt;#to_test_file is a method on Array, and it will create a file in the tmp decretory, then return the file name. Right now it can optionally take a specific file name. I&amp;#8217;ve never had reason to use that, so I&amp;#8217;ll probably remove that bit of complexity.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;class Array
  def to_test_file(filename = &amp;quot;test_file&amp;quot;)
    File.open(&amp;quot;tmp/#{filename}&amp;quot;, &amp;quot;w&amp;quot;) do |f|
      self.each do |line|
        f &amp;lt;&amp;lt; line.join(&amp;quot;\t&amp;quot;)+&amp;quot;\n&amp;quot;
      end
    end
    &amp;quot;tmp/#{filename}&amp;quot;
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Stick that in spec_helper or test_helper. &lt;/p&gt;

&lt;p&gt;Originally I had it on String, and put in all of the \t and \n myself. That was an unreadable mess. With Array you get the column and line separation implicitly.&lt;/p&gt;

&lt;p&gt;This doesn&amp;#8217;t help at all for very large or complicated files. But for small, simple files, this is one of the easiest ways for testing the parser and keeping everything all in one place.&lt;/p&gt;</description>
      <pubDate>Sat, 12 Apr 2008 21:29:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:62b8a7fe-5c72-4c05-b3f6-ed02d9dee603</guid>
      <comments>http://blog.bitfission.com/articles/2008/04/12/test-driving-a-file-parser#comments</comments>
      <category>ruby</category>
      <category>tdd</category>
      <trackback:ping>http://blog.bitfission.com/trackbacks?article_id=test-driving-a-file-parser&amp;day=12&amp;month=04&amp;year=2008</trackback:ping>
      <link>http://blog.bitfission.com/articles/2008/04/12/test-driving-a-file-parser</link>
    </item>
    <item>
      <title>When is it okay to reopen NilClass?</title>
      <description>&lt;p&gt;I just read a post advocating &lt;a href="http://blog.rubyenrails.nl/articles/2008/02/29/our-daily-method-18-nilclass-method_missing"&gt;changing NilClass#method_missing to always return nil&lt;/a&gt;. Their argument is that you no longer have to check if you actually have something before calling methods on it like:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt; @sun &amp;amp;&amp;amp; @sun.still_burning? &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Instead, you could just call @sun.still_burning?, which is nice. I usually just check &lt;a href="http://isTheSunStillBurning.com"&gt;isthesunstillburning.com&lt;/a&gt; 20 times a day to make sure, but you get the point.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://farm1.static.flickr.com/77/158529397_d0e4a4cfb0.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Now, it&amp;#8217;s a very attractive, very short solution to an every day annoyance&amp;#8212;that alone is enough to make me worry. Overriding #method_missing on NilClass just seems &lt;em&gt;wrong&lt;/em&gt;.  The better solution is to define Null Objects for all of your classes, and have those returned instead of nothing. Yeah, it&amp;#8217;s more work than the method_missing solution, but it&amp;#8217;s a lot safer and doesn&amp;#8217;t leave such a bad taste in my mouth.&lt;/p&gt;


	&lt;h2&gt;I do actually reopen NilClass though.&lt;/h2&gt;


	&lt;p&gt;Often, actually. Working with rspec and making typos can be very frustrating otherwise. If do @sum.should_recieve(:set) instead of @sun, then you&amp;#8217;ll get&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;Mock 'some mock' received unexpected message :tyop?
# or
Mock 'NilClass' expected :list_pathways with (&amp;quot;hsa&amp;quot;) once, but received it 0 times&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;The second one is easy to realize you have a typo, sure. But I know I&amp;#8217;ve wasted time wondering why the expectation failed, and I&amp;#8217;m sure you have too. By adding a few methods to NilClass, this is no longer an issue:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;class NilClass
  def should_receive(*args)
    raise &amp;quot;WARNING: you tried to add expectations to nil!&amp;quot;
  end
  alias :stub! :should_receive
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

Now we get:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;WARNING: you tried to add expectations to nil!&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
and even a line number to where the typo is.

	&lt;h3&gt;When else have you found it okay to mess around with NilClass?&lt;/h3&gt;


	&lt;p&gt;I&amp;#8217;m sure there are a few other occasions where it makes sense.&lt;/p&gt;


	&lt;p&gt;&lt;sub&gt;Sun picture from &lt;a href="http://flickr.com/photos/rogersmith/61126609/"&gt;rodger smith, flickr&lt;/a&gt;&lt;/sub&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 04 Mar 2008 03:00:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:c323cae2-7361-49c9-afb3-9bcb6f638288</guid>
      <comments>http://blog.bitfission.com/articles/2008/03/04/when-is-it-okay-to-reopen-nilclass#comments</comments>
      <category>ruby</category>
      <category>rspec</category>
      <trackback:ping>http://blog.bitfission.com/trackbacks?article_id=when-is-it-okay-to-reopen-nilclass&amp;day=04&amp;month=03&amp;year=2008</trackback:ping>
      <link>http://blog.bitfission.com/articles/2008/03/04/when-is-it-okay-to-reopen-nilclass</link>
    </item>
    <item>
      <title>Merb and Datamapper</title>
      <description>&lt;p&gt;With the recent release of &lt;a href="http://merbivore.com"&gt;Merb 0.5&lt;/a&gt;, I&amp;#8217;ve decided to use it along with &lt;a href="http://datamapper.org"&gt;datamapper&lt;/a&gt; for one of my new projects. It isn&amp;#8217;t different enough to be completely foreign, but enough to be a refreshing change. I haven&amp;#8217;t done a whole lot with either yet, but I have had a patch accepted, ran into a huge, annoying problem with autotest, and found out how to watch the SQL datamaper is generating.&lt;/p&gt;

&lt;h2&gt;stats patch&lt;/h2&gt;

&lt;p&gt;While I was in #merb earlier today, &lt;a href="http://hassox.blogspot.com/"&gt;hassox&lt;/a&gt; posted some &lt;a href="http://pastie.caboo.se/136989"&gt;current benchmarks&lt;/a&gt;. Being somewhat a stickler for statistics, I had to point out that means alone were meaningless. Not to get into all of the boring details, two distributions can have the same mean, but be completely different. Here is an image I made in Mathematica and sktich to show why:
&lt;a href="http://skitch.com/leinweber/fydc/normal-distribution"&gt;&lt;img src="http://img.skitch.com/20080120-tscppcbjptm64suuupkr63bsqe.preview.jpg" alt="normal distribution" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They all have the same mean, but a random pick from the distribution with the smaller variance of 0.5 is more likely to be actually be near the mean than with either of the ones with higher variances. If you apply this to load times, two severs could serve pages just as quickly on average. However, the one with the higher variance is going to seem a lot slower, since there are more slow points in the set.&lt;/p&gt;

&lt;p&gt;I submitted a &lt;a href="http://merb.devjavu.com/ticket/460"&gt;patch&lt;/a&gt; to add the standard deviations to each of the tests and &lt;a href="http://pastie.caboo.se/139496"&gt;clean up the output a bit&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;AutoTest problem&lt;/h2&gt;

&lt;p&gt;I was trying to get autotest up and running but kept running into this problem:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;/Library/Ruby/Site/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- rspec_autotest (LoadError)
    from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:27:in `require'
    from /Library/Ruby/Gems/1.8/gems/zentest-3.5.0/bin/autotest:35
    from /usr/bin/autotest:19:in `load'
    from /usr/bin/autotest:19&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After futilely searching for the problem for a long time, and asking in #merb where someone else was having the same problem, I was about to give up and just run my tests by hand (oh no!). I decided to check the versions of all my gems, and it turned out that zentest was only 3.5.0 when the latest was 3.7.2. I thought that was odd, because I just installed the gem that night. Odder still, updating the gem did nothing to increase the version. It turns out there is zentest and there is ZenTest&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ gem list -r | grep -i zentest
zentest (3.5.0)
ZenTest (3.7.2, 3.7.1, 3.7.0, 3.6.1, 3.6.0, 3.5.2, 3.5.1, 3.4.3, 3.4.2, 3.4.1, 3.4.0, 3.3.0, 3.2.0, 3.1.0, 3.0.0)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;edit&lt;/strong&gt;: As of Jan 20, 2008 this seems to be fixed, and there is only ZenTest&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Uninstalling zentest and installing ZenTest fixed the problem.&lt;/p&gt;

&lt;h2&gt;Watching Datamapper&amp;#8217;s SQL&lt;/h2&gt;

&lt;p&gt;This is very easy to do. Just edit your config/database.yml file to include&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_yaml "&gt;:log_stream: STDOUT
:log_level: 0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and you can see the SQL in your merb process.&lt;/p&gt;</description>
      <pubDate>Wed, 16 Jan 2008 11:51:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:6c902331-f65a-44b1-9d55-6d33cec81927</guid>
      <comments>http://blog.bitfission.com/articles/2008/01/16/merb-and-datamapper#comments</comments>
      <category>merb</category>
      <enclosure url="http://blog.bitfission.com/files/normaldist.png" type="image/png" length="41039"/>
      <link>http://blog.bitfission.com/articles/2008/01/16/merb-and-datamapper</link>
    </item>
    <item>
      <title>More on setting up Leopard</title>
      <description>&lt;p&gt;After posting about &lt;a href="http://blog.bitfission.com/articles/2008/01/12/rubygems-and-leopard"&gt;setting up a new mac&lt;/a&gt;, I started to put all the other things I found myself missing on a new install. Aside from the standard adium, quicksilver, colloquy, and others there are a few things that are good enough to share.&lt;/p&gt;

&lt;h2&gt;Blurminal&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;m a long time user of &lt;a href="http://iterm.sourceforge.net/"&gt;iTerm&lt;/a&gt; but I&amp;#8217;ve decided to give leopard&amp;#8217;s new tabbed terminal a chance. The one big frustrating thing is it lacks iTerm&amp;#8217;s ability to switch between tabs with command+arrow keys. However, a big plus is Ciar&#224;in Walsh&amp;#8217;s &lt;a href="http://ciaranwal.sh/2007/11/16/blurminal"&gt;Blurminal&lt;/a&gt;. Instead of just having a percentage of transparency, it slightly blurs whatever is behind the terminal. Here&amp;#8217;s an example: &lt;/p&gt;

&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/leinweber/fyyd/blurminal"&gt;&lt;img src="http://img.skitch.com/20080120-m9jdcraunhjaw5qhd2q7t4mr8s.preview.jpg" alt="Blurminal" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;h2&gt;macFusion&lt;/h2&gt;

&lt;p&gt;This is a &lt;a href="http://www.sccs.swarthmore.edu/users/08/mgorbach/MacFusionWeb/"&gt;nice gui&lt;/a&gt; for the OS X implementation of fuse. This allows you to mount an ssh directory locally right from the menu bar which is really awesome. One annoyance: in tiger, when you mounted something, it would appear on the desktop and the sidebar of finder, which was nice. With leopard though, that&amp;#8217;s not happening. You can still go up to the menu bar and click on one of your mounts so it&amp;#8217;s not a huge problem.&lt;/p&gt;

&lt;h2&gt;skitch&lt;/h2&gt;

&lt;p&gt;Sktich is a little app that lets you take screenshots, edit them up, and upload them in one go. It&amp;#8217;s turning out to be really useful; the image in this post was taken with it. It&amp;#8217;s still in beta right now, and I&amp;#8217;m not sure when it will be finished. One thing it needs is keyed sftp uploading. It has support for sftp, but with usernames and passwords only. They haven&amp;#8217;t said how much it&amp;#8217;s going to be once it&amp;#8217;s out of beta, but they&amp;#8217;re doing a good job of getting people hooked before that happens. First one is always free.&lt;/p&gt;

&lt;h2&gt;blue phone elite&lt;/h2&gt;

&lt;p&gt;The last one I&amp;#8217;m going to talk about is &lt;a href="http://mirasoftware.com/BPE2/"&gt;blue phone elite&lt;/a&gt;. If you have a supported phone, this will let you use your mac as a handsfree (though I&amp;#8217;ve not had great success with this), send and receive text messages through it, flash up caller id on the screen, pause iTunes when you&amp;#8217;re on a call and resume when the call is over, and a few other neat things. I have it set to run an applescript that syncs my phone when I come in range, which helps a lot because I&amp;#8217;d otherwise never remember to sync. I was having some problems with the 2.0 release so I went back to using 1.x. It looks like they&amp;#8217;ve had a few more releases, so I&amp;#8217;ll give 2.x a try again.&lt;/p&gt;</description>
      <pubDate>Tue, 15 Jan 2008 01:06:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:b5df7487-b6ed-4e8b-9ee5-72263d389548</guid>
      <comments>http://blog.bitfission.com/articles/2008/01/15/more-on-setting-up#comments</comments>
      <category>mac</category>
      <link>http://blog.bitfission.com/articles/2008/01/15/more-on-setting-up</link>
    </item>
    <item>
      <title>RubyGems and Leopard</title>
      <description>&lt;p&gt;I just got my replacement iMac (the speakers were shot on the first one) and was going about getting my development environment back together. While trying to instal &lt;a href="http://datamapper.org/"&gt;datamapper&lt;/a&gt;, it choked on the json gem.&lt;/p&gt;

&lt;pre class="source-code"&gt;&lt;code&gt;ruby extconf.rb install json&lt;br /&gt;can't find header files for ruby.&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As it turns out, the solution is very simple. I didn&amp;#8217;t have Xcode tools from the install disc on there yet. Since it&amp;#8217;s something you just put on once then forget about, it took me a while to realize what was going on. Hopefully this post helps others figure it out quicker than I did if they stumble across it.&lt;/p&gt;

&lt;p&gt;Also remember to update RubyGems. Leopard comes with 0.9.4 and we&amp;#8217;re up to 1.0.1 right now.&lt;/p&gt;

&lt;pre class="source-code"&gt;&lt;code&gt; sudo gem update --system&lt;/code&gt;&lt;/pre&gt;</description>
      <pubDate>Sat, 12 Jan 2008 16:12:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:f6f1c515-a1d0-4f06-bea2-252f556ca5cb</guid>
      <comments>http://blog.bitfission.com/articles/2008/01/12/rubygems-and-leopard#comments</comments>
      <link>http://blog.bitfission.com/articles/2008/01/12/rubygems-and-leopard</link>
    </item>
    <item>
      <title>rspec 1.1 and my open source debut</title>
      <description>&lt;p&gt;Everyone&amp;#8217;s favorite BDD framework, &lt;a href="http://rspec.info/"&gt;rspec&lt;/a&gt;, has recently come out with a lot of nice improvements and fixes. One big thing that&amp;#8217;s in there now is the ability to write stories. The best thing, however, is that I&amp;#8217;m now on the &lt;a href="http://rspec.info/community/"&gt;community&lt;/a&gt; page! &lt;/p&gt;

&lt;p&gt;Over the summer, while I was working at &lt;a href="http://collaborativedrug.com"&gt;Collaborative Drug Discovery&lt;/a&gt;, &lt;a href="http://akuaku.org"&gt;Dav Yaginuma&lt;/a&gt; from Pivotal Labs and I wrote a patch to allow the spec&lt;em&gt;parser to parse describe blocks that had :behaviour&lt;/em&gt;type set on them. This let us run focused tests on those sections. After figuring out what was wrong, it was just a matter of fixing some regexes and adding another clause. &lt;/p&gt;

&lt;p&gt;Then when I was at the rails edge conference in Chicago in August, I had a chance to meet David Chelimsky. He suggested that I submit that as a patch. I first checked with CDD to see if doing so was breaking any sort of agreement I signed or anything, then wrote some specs for the changes and submitted. Even though it wasn&amp;#8217;t all that much and it was pair-programmed, it was my first open source contribution and seeing it &amp;#8220;official&amp;#8221; now is awesome.&lt;/p&gt;</description>
      <pubDate>Mon, 17 Dec 2007 16:36:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:9dea4aac-259d-4934-870c-552f669449a3</guid>
      <comments>http://blog.bitfission.com/articles/2007/12/17/rspec-1-1-and-my-open-source-debut#comments</comments>
      <link>http://blog.bitfission.com/articles/2007/12/17/rspec-1-1-and-my-open-source-debut</link>
    </item>
    <item>
      <title>script/console sandbox mode</title>
      <description>I was exploring my &lt;a href="http://redmine.org"&gt;redmine&lt;/a&gt; install on my server by going into script/console. Whenever I tried to do anything, like finding a user, I&amp;#8217;d get
&lt;pre class="source-code"&gt;&lt;code&gt;NameError: undefined local variable or method `acts_as_watchable' for Issue:Class &lt;/code&gt;&lt;/pre&gt; followed by a stack trace. I spent a while trying to figure out why this wasn&amp;#8217;t working, then gave up.  A few weeks later I tried again, and quickly realized the problem was that I only have a production environment set up, and I wasn&amp;#8217;t telling script/console to use the production environment.

In the process of figuring out how to do that ( &amp;#8211;help ), I ran into this awesome feature I simply never knew about.
&lt;pre class="source-code"&gt;&lt;code&gt;  -s, --sandbox      Rollback database modifications on exit. &lt;/code&gt;&lt;/pre&gt; This is really cool. Especially if you&amp;#8217;re going to be mucking around with your production data. I&amp;#8217;m planning on hacking script/console to have -s enable by default if you go into the production environment. Or at the very least an alias.

</description>
      <pubDate>Thu, 06 Dec 2007 11:45:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:cbff7c2c-9333-4582-9dfc-8a2841fe44d1</guid>
      <comments>http://blog.bitfission.com/articles/2007/12/06/script-console-sandbox-mode#comments</comments>
      <category>rails</category>
      <link>http://blog.bitfission.com/articles/2007/12/06/script-console-sandbox-mode</link>
    </item>
  </channel>
</rss>
