<?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/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Invisible Blocks &#187; FacetsTour</title>
	<atom:link href="http://invisibleblocks.wordpress.com/tag/facetstour/feed/" rel="self" type="application/rss+xml" />
	<link>http://invisibleblocks.wordpress.com</link>
	<description>for building invisible machines</description>
	<lastBuildDate>Wed, 21 Oct 2009 17:58:48 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='invisibleblocks.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/4f043f3049fde8b61c72e5cf324315fd?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Invisible Blocks &#187; FacetsTour</title>
		<link>http://invisibleblocks.wordpress.com</link>
	</image>
			<item>
		<title>Trading Space for Speed: Memoizing with Ruby Facets</title>
		<link>http://invisibleblocks.wordpress.com/2008/04/14/trading-space-for-speed-memoizing-with-ruby-facets/</link>
		<comments>http://invisibleblocks.wordpress.com/2008/04/14/trading-space-for-speed-memoizing-with-ruby-facets/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 11:37:26 +0000</pubDate>
		<dc:creator>Daniel Bernier</dc:creator>
				<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[FacetsTour]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyFacets]]></category>

		<guid isPermaLink="false">http://invisibleblocks.wordpress.com/?p=78</guid>
		<description><![CDATA[Recently, I talked about a faster, cheaper way to calculate Fibonacci numbers.  One of the optimizations I made was to remember the value of each Fibonacci number:  since F(7) is always 13, instead of recalculating it each time N=7, we can stuff 7 -&#62; 13 into a look-up table for future reference. The [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=invisibleblocks.wordpress.com&blog=290283&post=78&subd=invisibleblocks&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Recently, I talked about a <a href="http://invisibleblocks.wordpress.com/2008/03/22/a-faster-cheaper-fibonacci-definition/">faster, cheaper way</a> to calculate <a href="http://en.wikipedia.org/wiki/Fibonacci_number">Fibonacci</a> numbers.  One of the optimizations I made was to remember the value of each Fibonacci number:  since F(7) is always 13, instead of recalculating it each time N=7, we can stuff <em>7 -&gt; 13</em> into a look-up table for future reference. The function builds up a cheat-sheet, to avoid doing the re-work.  It remembers.</p>
<p>This is called <a href="http://en.wikipedia.org/wiki/Memoization">memoization</a>, and it&#8217;s a nice way to trade memory for performance.  But it only works when the function always returns the same answer for a given set of arguments &#8212; otherwise it&#8217;s first-in wins, forever.  This property of a function, returning the same answer for the same args, is called <a href="http://en.wikipedia.org/wiki/Referential_transparency_%28computer_science%29">referential transparency</a>.</p>
<h4>A Sample Implementation</h4>
<p>There are lots of ways you could memoize a function.  Hash tables are a natural choice, since they map a key to a value, just like functions map arguments to a value.  Even if you implement it differently, a hash table is a good working model for memoization.</p>
<p>Let&#8217;s briefly consider factorials.  The regular version:</p>
<pre class="brush: ruby;">
class Unmemoized
    def factorial(n)
        puts n
        if n &lt; 1
            1
        else
            n * factorial(n-1)
        end
    end
end

unmemoized = Unmemoized.new

5.downto(1) { |i| puts &quot;\t#{unmemoized.factorial(i)}&quot; }</pre>
<p>&#8230;and the memoized version:</p>
<pre class="brush: ruby;">
class Memoized
    attr_reader :factorial_memo
    def initialize
        @factorial_memo = {}
    end

    def factorial(n)
        puts n
        unless @factorial_memo.has_key? n
            if n &lt; 1
                @factorial_memo[n] = 1
            else
                @factorial_memo[n] = n * factorial(n-1)
            end
        end

        @factorial_memo[n]
    end
end

memoized = Memoized.new

5.downto(1) { |i| puts &quot;\t#{memoized.factorial(i)}&quot; }

puts memoized.factorial_memo.inspect</pre>
<p>Printing the hashtable is especially telling:  <code>{5=&gt;120, 0=&gt;1, 1=&gt;1, 2=&gt;2, 3=&gt;6, 4=&gt;24}</code> It reads like a look-up table for factorials.</p>
<h4>Memoization in Facets</h4>
<p>As relatively easy as that example is, it has its drawbacks: we need to track our previous results in a separate variable, the memoization code is mixed up with the actual calculation (the part we care about), we can&#8217;t easily use it with other functions, and the pattern only works for functions of one argument.  <a href="http://facets.rubyforge.org/">Facets</a> makes memoization trivial, and removes all these issues.</p>
<pre class="brush: ruby;">
require 'facets/memoize'

class FacetsMemoized
    def factorial(n)
        puts n
        if n &lt; 1
            1
        else
            n * factorial(n-1)
        end
    end

    memoize :factorial # &lt;= HINT
end

facets_memoized = FacetsMemoized.new

5.downto(1) { |i| puts &quot;\t#{facets_memoized.factorial(i)}&quot; }</pre>
<p>In case you missed it, this is just like <code>Unmemoized</code> above, except we added line 13, <code>memoize :factorial</code>&#8230;that&#8217;s it.  Just like <code>attr_reader</code> and friends, you can pass a list of symbols to <code>memoize</code>, and it&#8217;ll work on functions with any number of arguments:</p>
<pre class="brush: ruby;">
require 'facets/memoize'

class MemoizedMath
    def add(n, m)
        n + m
    end
    def mult(n, m)
        n * m
    end
    memoize :add, :mult
end</pre>
<h4>When You Might Use Memoization, and What to Avoid</h4>
<p>There are a number of places where this is useful: calculating a value by <a href="http://mitpress.mit.edu/sicp/full-text/sicp/book/node12.html">successive approximation</a>, finding the path to the root node in an immutable tree structure, finding the <em>N</em>th number in a recursively-defined series, even simple derived values (like &#8216;abc&#8217;.upcase).  In general, a function is a good candidate if it only looks at its arguments (no global, class, or member variables, no files or databases) &#8212; especially if those arguments are immutable.</p>
<p>Relying on side-effects (printing to standard out, writing to a database or file, or updating a variable) in memoized methods is a bad idea: they&#8217;ll only happen the first time your method is called with those arguments, which is probably not what you intend. (Unless you&#8217;re printing the arguments to illustrate how memoizing works.) On the other hand, relying on side-effects <a href="http://www.google.com/search?q=favor+immutability">is generally a bad idea</a> anyway. Even if you don&#8217;t use a functional programming language, you can still benefit from minimizing state changes.</p>
<h4>Further Reading</h4>
<p>If memoization sounds interesting to you, you might like Oliver Steele&#8217;s article about <a href="http://osteele.com/archives/2006/04/javascript-memoization">memoizing JavaScript functions</a>.  If you&#8217;re curious about immutability, you might like this <a href="http://www.artima.com/intv/blochP.html">Joshua Bloch interview</a>.  If you&#8217;re interested in functional programming, there are worse places to start than the excellent <a href="http://mitpress.mit.edu/sicp/full-text/book/book.html">Structure and Interpretation of Computer Programs</a>.  And of course, there&#8217;s more where that came from, in <a href="http://facets.rubyforge.org/">Ruby Facets</a>.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/invisibleblocks.wordpress.com/78/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/invisibleblocks.wordpress.com/78/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/invisibleblocks.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/invisibleblocks.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/invisibleblocks.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/invisibleblocks.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/invisibleblocks.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/invisibleblocks.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/invisibleblocks.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/invisibleblocks.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/invisibleblocks.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/invisibleblocks.wordpress.com/78/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=invisibleblocks.wordpress.com&blog=290283&post=78&subd=invisibleblocks&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://invisibleblocks.wordpress.com/2008/04/14/trading-space-for-speed-memoizing-with-ruby-facets/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/360300f6962b973dae989991dc204f75?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bonsaigiant</media:title>
		</media:content>
	</item>
		<item>
		<title>Ruby Facets: Symbol.to_proc, Class.to_proc</title>
		<link>http://invisibleblocks.wordpress.com/2008/03/28/ruby-facets-symbolto_proc-classto_proc/</link>
		<comments>http://invisibleblocks.wordpress.com/2008/03/28/ruby-facets-symbolto_proc-classto_proc/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 16:52:57 +0000</pubDate>
		<dc:creator>Daniel Bernier</dc:creator>
				<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby Facets Tour]]></category>
		<category><![CDATA[FacetsTour]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyFacets]]></category>

		<guid isPermaLink="false">http://invisibleblocks.wordpress.com/?p=77</guid>
		<description><![CDATA[One pretty well-know idiom in Ruby, and Facets, is Symbol.to_proc.  It lets you turn these:

[1, 2, 3].map { &#124;num&#124; num.next }  #=&#62; [2, 3, 4]

%w[alpha beta gamma].map { &#124;word&#124; word.upcase }
#=&#62; [&#34;ALPHA&#34;, &#34;BETA&#34;, &#34;GAMMA&#34;]
&#8230;into these:

[1, 2, 3].map(&#38;:next)
%w[alpha beta gamma].map(&#38;:upcase)
It&#8217;s a nice little trick, though it&#8217;s not to everyone&#8217;s taste.  If you&#8217;re already [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=invisibleblocks.wordpress.com&blog=290283&post=77&subd=invisibleblocks&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>One pretty well-know idiom in Ruby, and <a href="http://facets.rubyforge.org/">Facets</a>, is <code>Symbol.to_proc</code>.  It lets you turn these:</p>
<pre class="brush: ruby;">
[1, 2, 3].map { |num| num.next }  #=&gt; [2, 3, 4]

%w[alpha beta gamma].map { |word| word.upcase }
#=&gt; [&quot;ALPHA&quot;, &quot;BETA&quot;, &quot;GAMMA&quot;]</pre>
<p>&#8230;into these:</p>
<pre class="brush: ruby;">
[1, 2, 3].map(&amp;:next)
%w[alpha beta gamma].map(&amp;:upcase)</pre>
<p>It&#8217;s a nice little trick, though it&#8217;s not to everyone&#8217;s taste.  If you&#8217;re already comfortable with <code>Symbol.to_proc</code>, you can skip down to the <code>Class.to_proc</code> section.  But if you&#8217;re not, it&#8217;s worth a minute of your attention to learn it.  Read on&#8230;</p>
<h4>How it&#8217;s done</h4>
<p>When a method takes a block, you can call yield, to run the block.</p>
<pre class="brush: ruby;">
def with_a_block(a_param)
    yield
end
with_a_block('param') {
    puts 'in the block'
}</pre>
<p>Or, you can name the block as the last parameter to the method, and put an ampersand in front of it.  The ampersand makes ruby convert the block to a procedure, by calling <code>to_proc</code> on it.  (So any object with a <code>to_proc</code> method can work this way, if you want.)  This example works just like the last one:</p>
<pre class="brush: ruby;">
def named_block(a_param, &amp;blk)
    blk.call
end
named_block('my_param') {
    puts 'in the named block'
}</pre>
<p>Symbol&#8217;s <code>to_proc</code> method creates a procedure that takes one argument, and sends the symbol to it.  Sending a symbol to an object is the same as calling a method on it:  <code>object.send(:method)</code> works the same as <code>object.method</code>.  In the earlier <code>upcase</code> example, each word is passed to a procedure that calls <code>upcase</code> on it, giving us a list of uppercased strings.</p>
<pre class="brush: ruby;">
&amp;:upcase
# becomes...
lambda { |obj|
    obj.send(:upcase)
}
# or...
lambda { |obj|
    obj.upcase
}</pre>
<h4>Class.to_proc</h4>
<p>So <code>Symbol.to_proc</code> creates a function that takes an argument, and calls that method on it.  <code>Class.to_proc</code> creates a function that passes its argument to its constructor, yielding an instance of itself.  This is a welcome addition to the <code>to_proc</code> family.</p>
<pre class="brush: ruby;">
require 'facets'

class Person
    def initialize(name)
        @name = name
    end
end
names = %w[mickey minney goofy]
characters = names.map(&amp;Person)

puts characters.inspect

&amp;Person
# becomes...
lambda { |obj|
    Person.new(obj)
}</pre>
<p><b>Why it&#8217;s nice</b></p>
<ul>
<li>It&#8217;s fewer characters &#8212; it <a href="http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg01552.html">semantically compresses</a> your code.</li>
<li>It lets you think, <i>makes</i> you think, on a higher level.  You think about operations on your data, rather than handling one item at a time.  It raises your level of thinking.</li>
<li>It works with <a href="http://weblog.raganwald.com/2007/01/closures-and-higher-order-functions.html">first-class functions</a>, which are worth understanding.  They give you <a href="http://blog.grayproductions.net/categories/higherorder_ruby">new ways to elegantly solve some problems</a> (well, new to some audiences).  They&#8217;re not fringe anymore &#8212; they&#8217;ve been in C# since v2.0.</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/invisibleblocks.wordpress.com/77/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/invisibleblocks.wordpress.com/77/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/invisibleblocks.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/invisibleblocks.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/invisibleblocks.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/invisibleblocks.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/invisibleblocks.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/invisibleblocks.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/invisibleblocks.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/invisibleblocks.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/invisibleblocks.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/invisibleblocks.wordpress.com/77/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=invisibleblocks.wordpress.com&blog=290283&post=77&subd=invisibleblocks&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://invisibleblocks.wordpress.com/2008/03/28/ruby-facets-symbolto_proc-classto_proc/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/360300f6962b973dae989991dc204f75?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bonsaigiant</media:title>
		</media:content>
	</item>
		<item>
		<title>Hartford Ruby Brigade starts with a tour of Ruby Facets</title>
		<link>http://invisibleblocks.wordpress.com/2008/03/17/hartford-ruby-brigade-starts-with-a-tour-of-ruby-facets/</link>
		<comments>http://invisibleblocks.wordpress.com/2008/03/17/hartford-ruby-brigade-starts-with-a-tour-of-ruby-facets/#comments</comments>
		<pubDate>Tue, 18 Mar 2008 02:36:24 +0000</pubDate>
		<dc:creator>Daniel Bernier</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby Facets Tour]]></category>
		<category><![CDATA[FacetsTour]]></category>
		<category><![CDATA[Hartford.rb]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyFacets]]></category>

		<guid isPermaLink="false">http://invisibleblocks.wordpress.com/?p=76</guid>
		<description><![CDATA[As Rob Bazinet has said, the Hartford Ruby Brigade is having its first meeting on March 24.  You can get all the details from his post.  Come join us!  There&#8217;s even a book raffle.
I&#8217;ll be giving the first presentation, a tour of Ruby Facets.  Facets is a pretty huge library (even [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=invisibleblocks.wordpress.com&blog=290283&post=76&subd=invisibleblocks&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>As <a href="http://rbazinet.wordpress.com/2008/03/15/first-meeting-of-the-hartford-ruby-brigade/">Rob Bazinet has said</a>, the <a href="http://groups.google.com/group/hartford-ruby-brigade">Hartford Ruby Brigade</a> is having its first meeting on March 24.  You can get all the details from his post.  Come join us!  There&#8217;s even a book raffle.</p>
<p>I&#8217;ll be giving the first presentation, a tour of <a href="http://facets.rubyforge.org/">Ruby Facets</a>.  Facets is a pretty huge library (even after they moved some really neat parts into <a href="http://blow.rubyforge.org/">their</a> <a href="http://stick.rubyforge.org/">own</a> <a href="http://english.rubyforge.org/">projects</a>), and it&#8217;s crazy to think we could cover it all in one night.  I&#8217;ll quickly touch on the simple features, just to let you know they&#8217;re there, and I&#8217;ll spend more time with some of the interesting parts.  If you&#8217;re stuck, it&#8217;s a good chance Facets has what you need; the trick is knowing it&#8217;s there, and where to look &#8212; I want to point out enough of Facets to help you with that.</p>
<p>I&#8217;ll also start a <a href="http://invisibleblocks.wordpress.com/tag/FacetsTour">Tour of Facets</a> series here, starting with this post.  I&#8217;m aiming for two to four posts a month, and will cover everything in the presentation, and then some.  So, on with the tour&#8230;</p>
<p><b><i>compare_on</i> and <i>equate_on</i></b></p>
<p>Remember the first time you saw <code>attr_reader</code> and <code>attr_writer</code>?  These tiny helpers got me excited about ruby, not just because they meant less typing and DRY-er code, but because they meant <i>I</i> could make helpers to generate methods, too, if only I could think of a reason to do it.</p>
<p>Facets has a great example of why you&#8217;d want to do that: <code>compare_on</code> and <code>equate_on</code>.</p>
<p>Most ruby programmers know you can make your objects sortable by defining <code>&lt;=&gt;</code>, the spaceship method, on them.  Typically, you wind up delegating to some attribute:</p>
<pre class="brush: ruby;">
class Person
   attr_reader :fname, :lname
   def initialize(fname, lname)
      @fname, @lname = fname, lname
   end
   def &lt;=&gt;(person)
      @lname.&lt;=&gt;(person.lname)
   end
end</pre>
<p>Facets adds <code>compare_on</code>, which generates the spaceship method for you, based on that attribute.  Not only that, but you can <code>compare_on</code> multiple fields, and it handles the hairy logic for you automatically:</p>
<pre class="brush: ruby;">
require 'facets/compare_on'

class Person
   attr_reader :fname, :lname
   def initialize(fname, lname)
      @fname, @lname = fname, lname
   end
   compare_on :lname, :fname
end

people = []
people.push Person.new('Adam', 'Smith')
people.push Person.new('John', 'Adams')

people.sort #=&gt; John Adams, Adam Smith</pre>
<p>Correctly implementing the spaceship operator isn&#8217;t too hard, but object equality gets tricky in any language.  Facets helps you here by implementing ruby&#8217;s main three equality methods for you: <code>==</code>, <code>eql?</code>, and <code>hash</code>.</p>
<pre class="brush: ruby;">
require 'facets/compare_on'

class Person
   attr_reader :fname, :lname
   def initialize(fname, lname)
      @fname, @lname = fname, lname
   end
   equate_on :lname, :fname
end

a_pres = Person.new('John', 'Adams')
another_pres = Person.new('John', 'Adams')
[a_pres].include?(another_pres) #=&gt; true</pre>
<p>Again, you can equate on multiple attributes (<code>fname</code> and <code>lname</code>), and it handles all the details for you. Hope to see you at the Hartford Ruby Brigade!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/invisibleblocks.wordpress.com/76/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/invisibleblocks.wordpress.com/76/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/invisibleblocks.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/invisibleblocks.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/invisibleblocks.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/invisibleblocks.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/invisibleblocks.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/invisibleblocks.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/invisibleblocks.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/invisibleblocks.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/invisibleblocks.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/invisibleblocks.wordpress.com/76/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=invisibleblocks.wordpress.com&blog=290283&post=76&subd=invisibleblocks&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://invisibleblocks.wordpress.com/2008/03/17/hartford-ruby-brigade-starts-with-a-tour-of-ruby-facets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/360300f6962b973dae989991dc204f75?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">bonsaigiant</media:title>
		</media:content>
	</item>
	</channel>
</rss>