<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Nicholas Blumhardt : Ruby</title><link>http://blogs.msdn.com/nblumhardt/archive/tags/Ruby/default.aspx</link><description>Tags: Ruby</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Ruby on MEF: Hybrid Application</title><link>http://blogs.msdn.com/nblumhardt/archive/2008/12/23/ruby-on-mef-hybrid-application.aspx</link><pubDate>Tue, 23 Dec 2008 03:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9248779</guid><dc:creator>niblumha</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/nblumhardt/comments/9248779.aspx</comments><wfw:commentRss>http://blogs.msdn.com/nblumhardt/commentrss.aspx?PostID=9248779</wfw:commentRss><description>&lt;p&gt;Since the &lt;a href="http://blogs.msdn.com/nblumhardt/archive/2008/12/14/ruby-on-mef-imports-and-exports.aspx"&gt;last installment&lt;/a&gt; in this little series, I've started to consider how Ruby/C# hybrid MEF applications might look.&lt;/p&gt;  &lt;p&gt;The result is yet another component-based calculator:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="224" alt="image" src="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_thumb_1.png" width="304" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Besides the &lt;a href="http://www.youtube.com/watch?v=lstDdzedgcE"&gt;Radiohead arithmetic&lt;/a&gt;, there &lt;em&gt;is&lt;/em&gt; one reason to get excited...&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_10.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="193" alt="image" src="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_thumb_4.png" width="218" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Ruby parts! (I bet you hadn't guessed.)&lt;/p&gt;  &lt;p&gt;The Ruby-based export and import features are heading towards a fairly natural syntax. &lt;strong&gt;&lt;em&gt;IOperation&lt;/em&gt;&lt;/strong&gt;, for example, is a regular .NET interface type:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_14.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="87" alt="image" src="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_thumb_6.png" width="305" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Let's take a look at how the Ruby implementation is woven into the app.&lt;/p&gt;  &lt;h2&gt;Configuration&lt;/h2&gt;  &lt;p&gt;This is still a work-in-progress, so configuration is basic. All of the Ruby parts are loaded from a single file that is fed into the &lt;strong&gt;&lt;em&gt;RubyCatalog&lt;/em&gt;&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_12.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="59" alt="image" src="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_thumb_5.png" width="493" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;&lt;em&gt;calculator_ops.rb &lt;/em&gt;&lt;/strong&gt;file contains part definitions like &lt;strong&gt;&lt;em&gt;Multiply &lt;/em&gt;&lt;/strong&gt;from above.&lt;/p&gt;  &lt;p&gt;An additional catalog adds all of the C# parts to the composition as well:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_16.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="37" alt="image" src="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_thumb_7.png" width="585" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Main Window&lt;/h2&gt;  &lt;p&gt;The main window is a typical WPF &lt;strong&gt;&lt;em&gt;Window&lt;/em&gt;&lt;/strong&gt; that &lt;strong&gt;&lt;em&gt;Imports&lt;/em&gt;&lt;/strong&gt; a list of operations:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_8.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="115" alt="image" src="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_thumb_3.png" width="501" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Because the &lt;strong&gt;&lt;em&gt;MainWindow&lt;/em&gt;&lt;/strong&gt; is instantiated and composed by MEF, all known exporters of &lt;strong&gt;&lt;em&gt;IOperation &lt;/em&gt;&lt;/strong&gt;will be provided, regardless of the language they're implemented in.&lt;/p&gt;  &lt;h2&gt;Bi-Directional Composition&lt;/h2&gt;  &lt;p&gt;You'll notice that the &lt;strong&gt;&lt;em&gt;MainWindow &lt;/em&gt;&lt;/strong&gt;class implements the &lt;strong&gt;&lt;em&gt;IErrorLog &lt;/em&gt;&lt;/strong&gt;contract. This allows messages from the parts to be presented to the user:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_6.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="224" alt="image" src="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_thumb_2.png" width="304" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Parts that wish to access the &lt;strong&gt;&lt;em&gt;IErrorLog &lt;/em&gt;&lt;/strong&gt;service from Ruby can import it:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_18.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="312" alt="image" src="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_thumb_8.png" width="413" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The integration (and IronRuby in general) treats interface contracts as Ruby &lt;strong&gt;&lt;em&gt;Module&lt;/em&gt;&lt;/strong&gt; objects, so the &lt;strong&gt;&lt;em&gt;IErrorLog &lt;/em&gt;&lt;/strong&gt;used by the &lt;strong&gt;&lt;em&gt;Divide&lt;/em&gt;&lt;/strong&gt; part could be implemented by a Ruby object, although I haven't tested that case.&lt;/p&gt;  &lt;p&gt;Fanatics take note: I did attempt to use IronRuby's case-transforming features to allow &lt;strong&gt;&lt;em&gt;Symbol&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;Apply() &lt;/em&gt;&lt;/strong&gt;to be specified in their natural Ruby forms (&lt;strong&gt;&lt;em&gt;symbol &lt;/em&gt;&lt;/strong&gt;and &lt;strong&gt;&lt;em&gt;apply()&lt;/em&gt;&lt;/strong&gt;) but had no success. Hopefully I'll resolve this in a future version.&lt;/p&gt;  &lt;h2&gt;Monkeypatching the Export Type&lt;/h2&gt;  &lt;p&gt;I can't say whether this will turn out to be a good move or not, but right now it seems reasonable.&lt;/p&gt;  &lt;p&gt;Notice this method call:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_20.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="25" alt="image" src="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_thumb_9.png" width="379" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In order to support MEF's lazy-instantiation feature, the &lt;strong&gt;&lt;em&gt;@error_log &lt;/em&gt;&lt;/strong&gt;attribute needs to be of type &lt;strong&gt;&lt;em&gt;System::ComponentModel::Composition::Export&lt;/em&gt;&lt;/strong&gt;, which will supply the actual instance when it is required through the &lt;strong&gt;&lt;em&gt;get_exported_object() &lt;/em&gt;&lt;/strong&gt;method. Calling &lt;strong&gt;&lt;em&gt;@error_log.get_exported_object.add_message&lt;/em&gt;&lt;/strong&gt; felt decidedly unnatural, so I've added method forwarding to the Ruby version of the &lt;em&gt;&lt;strong&gt;Export &lt;/strong&gt;class:&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_22.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="125" alt="image" src="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/RubyonMEFHybridApplication_E50A/image_thumb_10.png" width="397" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I've had to do some type aliasing to disambiguate &lt;strong&gt;&lt;em&gt;Export &lt;/em&gt;&lt;/strong&gt;from &lt;strong&gt;&lt;em&gt;Export&amp;lt;T&amp;gt;&lt;/em&gt;&lt;/strong&gt;, but otherwise this is straightforward. Rubyists, please weigh in and let me know if this implementation is less-than-desirable :)&lt;/p&gt;  &lt;h2&gt;Source Code&lt;/h2&gt;  &lt;p&gt;Once again you can download the full &lt;a href="http://cid-668630fe3ecd2791.skydrive.live.com/self.aspx/.Public/MefDlr-2008-12-22.zip"&gt;source code for this article&lt;/a&gt; from SkyDrive.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9248779" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/nblumhardt/archive/tags/MEF/default.aspx">MEF</category><category domain="http://blogs.msdn.com/nblumhardt/archive/tags/Ruby/default.aspx">Ruby</category></item><item><title>Hosting Ruby Parts in MEF</title><link>http://blogs.msdn.com/nblumhardt/archive/2008/12/09/hosting-ruby-parts-in-mef.aspx</link><pubDate>Tue, 09 Dec 2008 22:29:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9187725</guid><dc:creator>niblumha</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/nblumhardt/comments/9187725.aspx</comments><wfw:commentRss>http://blogs.msdn.com/nblumhardt/commentrss.aspx?PostID=9187725</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://codeplex.com/MEF" target="_blank"&gt;MEF&lt;/a&gt; is fascinating because of the way some initial assumptions led to a different flavor of composition technology from the ones we've seen for .NET to date.&lt;/p&gt;  &lt;p&gt;In my opinion, the most exciting &amp;#8216;parameter variation&amp;#8217; in the design process for MEF was the idea that &amp;#8216;parts&amp;#8217; should support the full range of .NET languages. The recent popularity of &lt;a href="http://www.codeplex.com/IronPython" target="_blank"&gt;IronPython&lt;/a&gt; and &lt;a href="http://www.ironruby.net/" target="_blank"&gt;IronRuby&lt;/a&gt;, and the inclusion of the &lt;a href="http://codeplex.com/DLR" target="_blank"&gt;DLR&lt;/a&gt; in .NET 4.0, meant that dynamic language support got first-class consideration.&lt;/p&gt;  &lt;p&gt;As readers of my &lt;a href="http://ubik.com.au" target="_blank"&gt;other blog&lt;/a&gt; may know, I&amp;#8217;m a fan of Ruby in particular. For that reason I&amp;#8217;m going to spend some time exploring how Ruby can fit into a MEF application.&lt;/p&gt;  &lt;h3&gt;Disclaimer:&lt;/h3&gt;  &lt;p&gt;I'm by no means a Ruby expert. Let me know if you seem me off course!&lt;/p&gt;  &lt;h2&gt;The Role of Parts&lt;/h2&gt;  &lt;p&gt;MEF&amp;#8217;s unit of composition is the &lt;strong&gt;&lt;em&gt;ComposablePart&lt;/em&gt;&lt;/strong&gt;, or just &amp;#8216;part&amp;#8217;. Each part is self-contained and opaque to the outside world. The MEF &lt;strong&gt;&lt;em&gt;CompositionContainer&lt;/em&gt;&lt;/strong&gt; wires parts together according to the primitive &lt;strong&gt;&lt;em&gt;Export&lt;/em&gt;&lt;/strong&gt;s that each part exposes and consumes.&lt;/p&gt;  &lt;p&gt;The independence of the part implementation behind these abstractions makes it possible to build a part just about any way you please.&lt;/p&gt;  &lt;p&gt;The goal of the MEF/Ruby integration is to allow parts to be written in Ruby.&lt;/p&gt;  &lt;h2&gt;C# and the Attributed Part&lt;/h2&gt;  &lt;p&gt;In the default programming model, parts are defined in C# as classes, with attributes to describe their exports and imports:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/HostingRubyPartsinMEF_71AC/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="259" alt="image" src="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/HostingRubyPartsinMEF_71AC/image_thumb_1.png" width="638" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This example is from the &lt;a href="http://www.codeplex.com/MEF/Wiki/View.aspx?title=Declaring%20Exports" target="_blank"&gt;MEF Programming Guide&lt;/a&gt;, which describes these and some other interesting export and import capabilities (like method exports, which we'll look at later in this series.)&lt;/p&gt;  &lt;p&gt;We call this the &lt;em&gt;attributed programming model &lt;/em&gt;because MEF is agnostic about how parts are defined. A good example of an alternative programming model for an earlier version of MEF is &lt;a href="http://www.managed-world.com/archive/2008/07/04/building-a-fluent-interface-for-mef.aspx" target="_blank"&gt;Jason Olson's fluent version&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;Translating Part Definitions into Ruby&lt;/h2&gt;  &lt;p&gt;I'm going to assume that if you are interested enough to read this far, you probably have at least a basic familiarity with the Ruby language, or the motivation to &lt;a href="http://www.ruby-lang.org/en/documentation/quickstart/" target="_blank"&gt;learn it&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Just as there are multiple ways of defining MEF parts in C#, there are endless ways that MEF parts could be defined in Ruby. There are two obvious ways that I can see Ruby interacting with other .NET languages via MEF:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Ruby snippets fulfil a specific role in a C# application (e.g. as command macros); or,&lt;/li&gt;    &lt;li&gt;Composite applications are built using a mixture of Ruby and C#&lt;/li&gt; &lt;/ol&gt;  &lt;h3&gt;Ruby Parts as 'Macros' (1)&lt;/h3&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;p&gt;The first approach would point towards supporting a minimal subset of MEF in order to supply Ruby snippets, probably as functions, to C# components:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/HostingRubyPartsinMEF_71AC/image_6.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="88" alt="image" src="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/HostingRubyPartsinMEF_71AC/image_thumb_2.png" width="403" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;For this imaginary example, a MEF integration would expose all similar functions from a script as &lt;strong&gt;&lt;em&gt;Action&amp;lt;Document&amp;gt;&lt;/em&gt;&lt;/strong&gt; delegates that could be imported by other parts. Export metadata could be used in order to describe the command as &amp;quot;delete selection&amp;quot; and this would be sufficient for including the command into user-defined toolbar buttons.&lt;/p&gt;  &lt;p&gt;A simple technique like this is appealing for the first kind of Ruby/MEF integration, and I'm sure it is going to be implemented widely (I've already seen something similar done in Python.)&lt;/p&gt;  &lt;h3&gt;Full-Fledged Ruby Parts (2)&lt;/h3&gt;  &lt;p&gt;The second approach - building composite applications - requires that Ruby parts support most of the key MEF programming model features. It makes more sense in this case to use Ruby classes as the primary definition of a Part, and to require that the Ruby programmer has some knowledge of MEF itself.&lt;/p&gt;  &lt;p&gt;This is the approach that I'm going to take in this series of posts.&lt;/p&gt;  &lt;h2&gt;Defining Ruby Parts&lt;/h2&gt;  &lt;p&gt;One of the wonderful things about Ruby is its flexibility. It is entirely possible to take a syntax-first approach and to work back from there towards an implementation.&lt;/p&gt;  &lt;p&gt;My 'ideal' translation of the C# sample above would look something like:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/HostingRubyPartsinMEF_71AC/image_14.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="291" alt="image" src="http://blogs.msdn.com/blogfiles/nblumhardt/WindowsLiveWriter/HostingRubyPartsinMEF_71AC/image_thumb_6.png" width="516" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;It should be possible to interchange the Ruby &lt;strong&gt;&lt;em&gt;Configuration &lt;/em&gt;&lt;/strong&gt;part for the C# one in this example &lt;em&gt;without changing any further code in the application.&lt;/em&gt; This is a really exciting possibility enabled by the DLR and MEF, and we'll try to push our implementation as far as possible in that direction.&lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h3&gt;Identifying Parts&lt;/h3&gt;  &lt;p&gt;I'm going to attempt to avoid a 'Part' base class, and instead regard any class that contains &lt;strong&gt;&lt;em&gt;export &lt;/em&gt;&lt;/strong&gt;statements as representing a part.&lt;/p&gt;  &lt;p&gt;One thing this seems to imply is that the helper methods will be on &lt;strong&gt;&lt;em&gt;Kernel&lt;/em&gt;&lt;/strong&gt;. This might not be a good thing (it's like adding extension methods to &lt;strong&gt;&lt;em&gt;System.Object&lt;/em&gt;&lt;/strong&gt; in C#) so the base class might appear in the future.&lt;/p&gt;  &lt;h3&gt;Exports&lt;/h3&gt;  &lt;p&gt;There are three kinds of exports we need to account for: exporting the entire 'part object', exporting a property value, and exporting a method. All three of these are going to appear in the body of our Ruby class definition.&lt;/p&gt;  &lt;p&gt;We'll need to use separate methods for each export type, so that we can differentiate between them. This is especially relevant in the case of properties/methods, which are the same under the hood in Ruby, but which need to be exported differently. A method export will be a delegate type, while a property export will be a value that is the result of invoking the property. Using &lt;strong&gt;&lt;em&gt;export_attr&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;export_method &lt;/em&gt;&lt;/strong&gt;would help to disambiguate this case clearly.&lt;/p&gt;  &lt;h3&gt;Imports&lt;/h3&gt;  &lt;p&gt;Imports are a bit simpler. I think that a single mechanism for importing values will suffice, and some hash parameters will allow the value to be imported into an attribute, an attribute writer (property) or perhaps via an optional block.&lt;/p&gt;  &lt;h2&gt;Where to Next?&lt;/h2&gt;  &lt;p&gt;There's no source code with this article today. I have a few unit tests working but things are a bit haphazard and not packaged up to distribute. I'm still experimenting with syntax so expect some significant changes of direction :)&lt;/p&gt;  &lt;p&gt;I'll try to keep installments in this series short - perhaps a single unit test each. We'll work from there towards an example application that pulls everything together.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9187725" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/nblumhardt/archive/tags/MEF/default.aspx">MEF</category><category domain="http://blogs.msdn.com/nblumhardt/archive/tags/Ruby/default.aspx">Ruby</category></item></channel></rss>