Skip to content

Instantly share code, notes, and snippets.

@JuanitoFatas
Last active August 29, 2015 14:05
Show Gist options
  • Save JuanitoFatas/b21a7f8e7c8523deb3b1 to your computer and use it in GitHub Desktop.
Save JuanitoFatas/b21a7f8e7c8523deb3b1 to your computer and use it in GitHub Desktop.
@socket and chunk data

If this is not clear, you can clone the repo:

git clone git@github.com:JuanitoFatas/comer_de_tapas.git

And bundle open http.

Insert binding.pry.

@socket

=> #<OpenSSL::SSL::SSLSocket:0x007fd84121c660
 @callback_state=nil,
 @context=
  #<OpenSSL::SSL::SSLContext:0x007fd84121c688
   @ca_file=nil,
   @ca_path=nil,
   @cert=nil,
   @cert_store=nil,
   @client_ca=nil,
   @client_cert_cb=nil,
   @extra_chain_cert=nil,
   @key=nil,
   @npn_protocols=nil,
   @npn_select_cb=nil,
   @options=nil,
   @renegotiation_cb=nil,
   @servername_cb=nil,
   @session_get_cb=nil,
   @session_id_context=nil,
   @session_new_cb=nil,
   @session_remove_cb=nil,
   @timeout=nil,
   @tmp_dh_callback=nil,
   @verify_callback=nil,
   @verify_depth=nil,
   @verify_mode=nil>,
 @eof=false,
 @hostname=nil,
 @io=#<TCPSocket:fd 7>,
 @rbuffer="",
 @sync=true,
 @sync_close=false,
 @wbuffer="">

@chunk (Basically it's rubytapas's feed xml

First 16K of complete xml:

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
  <channel>
    <title>RubyTapas</title>
    <link>https://rubytapas.dpdcart.com/subscriber/content</link>
    <description/>
    <pubDate>Thu, 14 Aug 2014 16:56:00 -0400</pubDate>
    <managingEditor>contact@shiprise.net (Avdi Grimm)</managingEditor>
    <language>en</language>
    <copyright>Copyright 2014 RubyTapas</copyright>
    <generator>getdpd.com</generator>
    <itunes:summary>RubyTapas: Small plates of gourmet code.</itunes:summary>
    <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    <image>
      <url>https://getdpd.com/uploads/ruby-tapas.png</url>
      <title>Ruby Tapas</title>
      <link>https://rubytapas.dpdcart.com/subscriber/content</link>
      <width>849</width>
      <height>849</height>
    </image>
    <item>
      <title><![CDATA[229 Consequences]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=574</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode we'll meet an application written without tests, and discover the repercussions of that decision.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=34173">229-consequences.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=34174">229-consequences.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=34175">229-consequences.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-a6bbaa7e1ab10e52fdda15c8591ae77c2ada32af</guid>
      <pubDate>Thu, 14 Aug 2014 16:56:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/34175/229-consequences.mp4" length="69700715" type="video/mp4"/>
      <itunes:subtitle>Exploring the repercussions of a test-less implementation.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[228 Reconsidering Regexen]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=572</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Regular expressions are one of the most powerful tools at our disposal. But sometimes they aren't as well suited to a job as they may first appear. In today's episode we look at an alternative to regexen for validating strings.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33962">228-reconsidering-regexen.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33963">228-reconsidering-regexen.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33964">validators.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33965">228-reconsidering-regexen.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-ce0f8012ca0c9eefdfaa9f467ba4142a9df8e020</guid>
      <pubDate>Mon, 11 Aug 2014 10:24:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/33965/228-reconsidering-regexen.mp4" length="34378766" type="video/mp4"/>
      <itunes:subtitle>Sometimes a regex is the wrong tool for the job.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[227 Multiline Memoize]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=569</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we'll look at two different ways to memoize a complex method, and talk about why I prefer one over the other.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33777">227-multiline-memoize.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33778">227-multiline-memoize.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33779">227-multiline-memoize.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-ed6538bc87329d0567ff8f088bc38a5fa7a05663</guid>
      <pubDate>Thu, 07 Aug 2014 10:36:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/33779/227-multiline-memoize.mp4" length="34007494" type="video/mp4"/>
      <itunes:subtitle>Memoizing complex methods</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[226 Evil Monkeys]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=567</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In which I rant a bit about the dangers of "monkey-patching".</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33595">226-evil-monkeys.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33596">226-evil-monkeys.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33597">226-evil-monkeys.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-ec0f213c166adcf4b050d4b24c4bfbd66c77355a</guid>
      <pubDate>Mon, 04 Aug 2014 15:05:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/33597/226-evil-monkeys.mp4" length="52375720" type="video/mp4"/>
      <itunes:subtitle>In which I rant a bit about the dangers of "monkey-patching".</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[225 Unitwise]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=563</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>As our series on representing physical quantities draws to a close, we turn our attention to existing libraries, specifically the <a href="https://github.com/joshwlewis/unitwise">Unitwise</a> gem.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33433">225-unitwise.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33434">225-unitwise.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33435">quantities.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33436">225-unitwise.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-582bae49f378b33076ecd0adf7c9fa9607143389</guid>
      <pubDate>Fri, 01 Aug 2014 15:27:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/33436/225-unitwise.mp4" length="49338925" type="video/mp4"/>
      <itunes:subtitle>A gem for representing physical quantities</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[224 Surrogate Ordering]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=562</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>It's often desirable compare objects to see which is "lesser" or "greater"; but not all objects are inherently comparable. Today we'll look at a scheme for easily imposing an arbitrary ordering on a constrained set of value objects.&nbsp;</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33067">224-surrogate-ordering.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33068">card3.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33069">card2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33070">card.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33071">224-surrogate-ordering.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33072">224-surrogate-ordering.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-4584a1919cb313052bc4b3fcde35c74ecb48106b</guid>
      <pubDate>Mon, 28 Jul 2014 12:16:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/33072/224-surrogate-ordering.mp4" length="34837177" type="video/mp4"/>
      <itunes:subtitle>Imposing order on objects</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[223 Equalizer]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=561</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>We know that Value Objects are useful; today we'll meet a gem that makes them easier to build.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32929">223-equalizer.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32930">223-equalizer.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32931">point2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32932">point.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32933">223-equalizer.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-399f30be9686a392b73754a713d331466b564188</guid>
      <pubDate>Fri, 25 Jul 2014 14:06:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/32933/223-equalizer.mp4" length="22164643" type="video/mp4"/>
      <itunes:subtitle>A shortcut to value objects</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[222 String Partition]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=559</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we look at a lesser-known but handy pair of methods on Strings.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32441">222-string-partition.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32442">222-string-partition.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32443">222-string-partition.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9235edf710e646a89345f49ab26a370961aef2ad</guid>
      <pubDate>Mon, 21 Jul 2014 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/32443/222-string-partition.mp4" length="14022533" type="video/mp4"/>
      <itunes:subtitle>Splitting filenames into their component parts</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[221 Def Return Value]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=556</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Since Ruby 2.1, def returns a symbol. In this episode we'll take a look at why this matters, and how it might change the way we define methods.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32126">221-def-return-value.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32127">221-def-return-value.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32128">221-def-return-value.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9399d25e9a929e263b6c04b5cb17342544b31858</guid>
      <pubDate>Thu, 17 Jul 2014 09:42:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/32128/221-def-return-value.mp4" length="19815628" type="video/mp4"/>
      <itunes:subtitle>Exploring a Ruby 2.1 feature</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[220 Type and Class]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=554</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Where do we draw the line between objects differntiated only by state, and objects differentiated by their class? That's the question we'll examine in this episode.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31950">220-type-and-class.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31951">quantities2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31952">quantities.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31953">220-type-and-class.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31954">220-type-and-class.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-1a345fbd0ee4ff42a887aaade2e3b10e3ea1cf6f</guid>
      <pubDate>Tue, 15 Jul 2014 11:35:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/31954/220-type-and-class.mp4" length="70983067" type="video/mp4"/>
      <itunes:subtitle>When does object state warrant creating a new class?</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[219 Adamantium]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=550</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we learn about Ruby gem that makes it easier to build immutable value objects.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31639">219-adamantium.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31640">219-adamantium.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31641">measurement3.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31642">measurement.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31643">measurement2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31644">quantities.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31645">219-adamantium.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9a559c5cf2b5555aacc6dbceba42d15612a41c0c</guid>
      <pubDate>Thu, 10 Jul 2014 12:43:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/31645/219-adamantium.mp4" length="47976901" type="video/mp4"/>
      <itunes:subtitle>Making objects immutable</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[218 Spaceship Revisted]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=547</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In episode 205 we introduced the spaceship (&lt;=&gt;) operator, but we also introduced an incompatibility with how Ruby's builtin comparisons work. Today we'll address this oversight.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/downlo

The complete FEED XML:

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
  <channel>
    <title>RubyTapas</title>
    <link>https://rubytapas.dpdcart.com/subscriber/content</link>
    <description/>
    <pubDate>Thu, 14 Aug 2014 16:56:00 -0400</pubDate>
    <managingEditor>contact@shiprise.net (Avdi Grimm)</managingEditor>
    <language>en</language>
    <copyright>Copyright 2014 RubyTapas</copyright>
    <generator>getdpd.com</generator>
    <itunes:summary>RubyTapas: Small plates of gourmet code.</itunes:summary>
    <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    <image>
      <url>https://getdpd.com/uploads/ruby-tapas.png</url>
      <title>Ruby Tapas</title>
      <link>https://rubytapas.dpdcart.com/subscriber/content</link>
      <width>849</width>
      <height>849</height>
    </image>
    <item>
      <title><![CDATA[229 Consequences]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=574</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode we'll meet an application written without tests, and discover the repercussions of that decision.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=34173">229-consequences.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=34174">229-consequences.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=34175">229-consequences.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-a6bbaa7e1ab10e52fdda15c8591ae77c2ada32af</guid>
      <pubDate>Thu, 14 Aug 2014 16:56:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/34175/229-consequences.mp4" length="69700715" type="video/mp4"/>
      <itunes:subtitle>Exploring the repercussions of a test-less implementation.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[228 Reconsidering Regexen]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=572</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Regular expressions are one of the most powerful tools at our disposal. But sometimes they aren't as well suited to a job as they may first appear. In today's episode we look at an alternative to regexen for validating strings.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33962">228-reconsidering-regexen.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33963">228-reconsidering-regexen.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33964">validators.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33965">228-reconsidering-regexen.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-ce0f8012ca0c9eefdfaa9f467ba4142a9df8e020</guid>
      <pubDate>Mon, 11 Aug 2014 10:24:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/33965/228-reconsidering-regexen.mp4" length="34378766" type="video/mp4"/>
      <itunes:subtitle>Sometimes a regex is the wrong tool for the job.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[227 Multiline Memoize]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=569</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we'll look at two different ways to memoize a complex method, and talk about why I prefer one over the other.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33777">227-multiline-memoize.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33778">227-multiline-memoize.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33779">227-multiline-memoize.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-ed6538bc87329d0567ff8f088bc38a5fa7a05663</guid>
      <pubDate>Thu, 07 Aug 2014 10:36:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/33779/227-multiline-memoize.mp4" length="34007494" type="video/mp4"/>
      <itunes:subtitle>Memoizing complex methods</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[226 Evil Monkeys]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=567</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In which I rant a bit about the dangers of "monkey-patching".</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33595">226-evil-monkeys.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33596">226-evil-monkeys.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33597">226-evil-monkeys.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-ec0f213c166adcf4b050d4b24c4bfbd66c77355a</guid>
      <pubDate>Mon, 04 Aug 2014 15:05:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/33597/226-evil-monkeys.mp4" length="52375720" type="video/mp4"/>
      <itunes:subtitle>In which I rant a bit about the dangers of "monkey-patching".</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[225 Unitwise]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=563</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>As our series on representing physical quantities draws to a close, we turn our attention to existing libraries, specifically the <a href="https://github.com/joshwlewis/unitwise">Unitwise</a> gem.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33433">225-unitwise.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33434">225-unitwise.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33435">quantities.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33436">225-unitwise.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-582bae49f378b33076ecd0adf7c9fa9607143389</guid>
      <pubDate>Fri, 01 Aug 2014 15:27:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/33436/225-unitwise.mp4" length="49338925" type="video/mp4"/>
      <itunes:subtitle>A gem for representing physical quantities</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[224 Surrogate Ordering]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=562</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>It's often desirable compare objects to see which is "lesser" or "greater"; but not all objects are inherently comparable. Today we'll look at a scheme for easily imposing an arbitrary ordering on a constrained set of value objects.&nbsp;</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33067">224-surrogate-ordering.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33068">card3.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33069">card2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33070">card.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33071">224-surrogate-ordering.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=33072">224-surrogate-ordering.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-4584a1919cb313052bc4b3fcde35c74ecb48106b</guid>
      <pubDate>Mon, 28 Jul 2014 12:16:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/33072/224-surrogate-ordering.mp4" length="34837177" type="video/mp4"/>
      <itunes:subtitle>Imposing order on objects</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[223 Equalizer]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=561</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>We know that Value Objects are useful; today we'll meet a gem that makes them easier to build.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32929">223-equalizer.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32930">223-equalizer.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32931">point2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32932">point.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32933">223-equalizer.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-399f30be9686a392b73754a713d331466b564188</guid>
      <pubDate>Fri, 25 Jul 2014 14:06:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/32933/223-equalizer.mp4" length="22164643" type="video/mp4"/>
      <itunes:subtitle>A shortcut to value objects</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[222 String Partition]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=559</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we look at a lesser-known but handy pair of methods on Strings.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32441">222-string-partition.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32442">222-string-partition.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32443">222-string-partition.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9235edf710e646a89345f49ab26a370961aef2ad</guid>
      <pubDate>Mon, 21 Jul 2014 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/32443/222-string-partition.mp4" length="14022533" type="video/mp4"/>
      <itunes:subtitle>Splitting filenames into their component parts</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[221 Def Return Value]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=556</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Since Ruby 2.1, def returns a symbol. In this episode we'll take a look at why this matters, and how it might change the way we define methods.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32126">221-def-return-value.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32127">221-def-return-value.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=32128">221-def-return-value.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9399d25e9a929e263b6c04b5cb17342544b31858</guid>
      <pubDate>Thu, 17 Jul 2014 09:42:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/32128/221-def-return-value.mp4" length="19815628" type="video/mp4"/>
      <itunes:subtitle>Exploring a Ruby 2.1 feature</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[220 Type and Class]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=554</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Where do we draw the line between objects differntiated only by state, and objects differentiated by their class? That's the question we'll examine in this episode.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31950">220-type-and-class.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31951">quantities2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31952">quantities.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31953">220-type-and-class.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31954">220-type-and-class.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-1a345fbd0ee4ff42a887aaade2e3b10e3ea1cf6f</guid>
      <pubDate>Tue, 15 Jul 2014 11:35:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/31954/220-type-and-class.mp4" length="70983067" type="video/mp4"/>
      <itunes:subtitle>When does object state warrant creating a new class?</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[219 Adamantium]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=550</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we learn about Ruby gem that makes it easier to build immutable value objects.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31639">219-adamantium.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31640">219-adamantium.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31641">measurement3.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31642">measurement.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31643">measurement2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31644">quantities.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31645">219-adamantium.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9a559c5cf2b5555aacc6dbceba42d15612a41c0c</guid>
      <pubDate>Thu, 10 Jul 2014 12:43:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/31645/219-adamantium.mp4" length="47976901" type="video/mp4"/>
      <itunes:subtitle>Making objects immutable</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[218 Spaceship Revisted]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=547</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In episode 205 we introduced the spaceship (&lt;=&gt;) operator, but we also introduced an incompatibility with how Ruby's builtin comparisons work. Today we'll address this oversight.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31432">218-spaceship-revisited.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31433">218-spaceship-revisited.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31434">beer2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31435">beer.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31436">218-spaceship-revisited.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-677495622a2322c0d474e76997305ff0d3809cb6</guid>
      <pubDate>Mon, 07 Jul 2014 11:17:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/31436/218-spaceship-revisited.mp4" length="34862145" type="video/mp4"/>
      <itunes:subtitle>Dealing with disparate types</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[217 Redesign]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=545</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today, a story about a refactoring that went south, and turned out not to be a refactoring at all.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31375">217-redesign.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31376">217-redesign.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-f92a5ae3df84fc163a0631e4364c992f1ec524c7</guid>
      <pubDate>Fri, 04 Jul 2014 10:57:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/31376/217-redesign.mp4" length="85911536" type="video/mp4"/>
      <itunes:subtitle>Sometimes a refactoring isn't</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[216 Tell, Don't Ask]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=543</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode, we explore a practical application of the famous "tell, don't ask" principle.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31226">216-tell-dont-ask.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31227">216-tell-dont-ask.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31228">216-tell-dont-ask.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31229">ratio.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31230">conversion.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-a120246fdaca97e388c125b075568f989e7b17e2</guid>
      <pubDate>Mon, 30 Jun 2014 12:42:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/31226/216-tell-dont-ask.mp4" length="42223284" type="video/mp4"/>
      <itunes:subtitle>Applying the principle to unit conversions.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[215 Grep]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=541</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we look at Ruby's grep method, and explore the idea of matching objects by example.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31053">215-grep.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31054">wildcard.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31055">ratio.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31056">215-grep.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=31057">215-grep.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-4a0817708787b9ba9dd92f8a987f7cf2739a9f00</guid>
      <pubDate>Thu, 26 Jun 2014 14:16:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/31056/215-grep.mp4" length="50739186" type="video/mp4"/>
      <itunes:subtitle>Grep: not just for the command line!</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[214 Conversion Ratio]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=539</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we puzzle through a design problem that threatens to result in dozens of extra methods.&nbsp;</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30900">214-conversion-ratio.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30901">214-conversion-ratio.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30902">quantities2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30903">quantities.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30904">214-conversion-ratio.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-6f0e41ed57a6f89c33ff703fb76b1afa59962909</guid>
      <pubDate>Mon, 23 Jun 2014 11:52:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/30904/214-conversion-ratio.mp4" length="44900491" type="video/mp4"/>
      <itunes:subtitle>Representing relationships as objects</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[213 Conversion Protocol]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=535</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's topic is "conversion protocols", an extensible way to enable safe, automatic conversions between types.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30758">213-conversion-protocol.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30759">quantities5.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30760">quantities4.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30761">quantities3.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30762">quantities2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30763">quantities.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30764">213-conversion-protocol.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30765">213-conversion-protocol.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-3b965764613cdb2097448e370d555cb62d665c08</guid>
      <pubDate>Thu, 19 Jun 2014 15:44:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/30765/213-conversion-protocol.mp4" length="44247578" type="video/mp4"/>
      <itunes:subtitle>Safe, automatic conversions between types.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[212 Self Class]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=533</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode deals with a small matter of style, one that can have an impact on how easy it is to refactor code.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30550">212-self-class.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30551">212-self-class.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30552">quantity.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30553">quantity4.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30554">quantity3.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30555">quantity2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30556">212-self-class.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-12d5d64b172f2f150ec45627a943d6544b9f24ef</guid>
      <pubDate>Mon, 16 Jun 2014 11:54:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/30556/212-self-class.mp4" length="33757996" type="video/mp4"/>
      <itunes:subtitle>How to refer to an object's own class</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[211 Protected]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=530</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>The distinction between "public" and "private" method visibility in Ruby is pretty obvious. But when should we use "protected" visibility? This episode attempts to answer that question.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30387">211-protected.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30388">feet4.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30389">feet3.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30390">211-protected.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30391">feet2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30392">feet.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30393">211-protected.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-292facfac0946d86f0a9e837d75c4c4b5ca76c0b</guid>
      <pubDate>Fri, 13 Jun 2014 13:04:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/30393/211-protected.mp4" length="48632321" type="video/mp4"/>
      <itunes:subtitle>When to tag methods as protected</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[210 Implicit Conversion]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=528</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Have you ever wondered why Ruby has both #to_i and #to_int methods? Or both #to_a and #to_ary? In today's episode we'll answer this question, and look at how we can use implicit conversion methods to our advantage.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30118">210-implicit-conversion.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30119">210-implicit-conversion.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30120">month2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30121">month.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30122">months.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30123">feet.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30124">fortunes.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=30125">210-implicit-conversion.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-e6ee8eaed02922cdb15e28c0de62c0eb223ef5ec</guid>
      <pubDate>Mon, 09 Jun 2014 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/30125/210-implicit-conversion.mp4" length="70699020" type="video/mp4"/>
      <itunes:subtitle>Ruby doesn't automatically convert one type to another... except when it does.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[209 Explicit Conversion]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=523</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we look at how to convert our Feet objects back to core numeric types. In the process, we gain the ability to use our Feet objects in format strings.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29933">209-explicit-conversion.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29934">209-explicit-conversion.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29935">data.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29936">feet.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29937">209-explicit-conversion.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-2bd0b7f2e8c36e4b561a26de9b6ea4178cc9c50c</guid>
      <pubDate>Thu, 05 Jun 2014 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/29937/209-explicit-conversion.mp4" length="40151126" type="video/mp4"/>
      <itunes:subtitle>Converting from quantities to numeric types</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[208 Lenient Conversions]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=522</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>For core types like Float, Ruby has both conversion methods (#to_f), and conversion functions (Float()). When should we use one vs. the other? This episode attempts to answer that question.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29680">208-lenient-conversions.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29681">208-lenient-conversions.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29682">data.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29683">208-lenient-conversions.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-0985c1c62bad155b2780081aa4bc575674496756</guid>
      <pubDate>Mon, 02 Jun 2014 10:09:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/29683/208-lenient-conversions.mp4" length="44505459" type="video/mp4"/>
      <itunes:subtitle>When to use a conversion function, and when not to</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[207 Conversion Function]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=519</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we create a function for converting arbitrary values into Feet objects.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29348">207-conversion-function.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29349">207-conversion-function.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29350">feet.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29351">report.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29352">207-conversion-function.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-f84fa6d922730877c020399cfd3605c05243345c</guid>
      <pubDate>Thu, 29 May 2014 11:59:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/29352/207-conversion-function.mp4" length="50102395" type="video/mp4"/>
      <itunes:subtitle>A Ruby convention for converting types</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[206 Coercion]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=517</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Ruby generally doesn't allow mixing of types without explicit conversion. So have you ever wondered why it's possible to multiply 2.3 (a float) by 5 (an integer)? In today's episode we'll discover how Ruby's implicit coercions work, and how to apply them to our own custom numeric-like classes.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29130">206-coercion.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29131">feet5.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29132">feet4.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29133">206-coercion.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29134">feet2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29135">feet3.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29136">feet.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=29137">206-coercion.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-04724729e366e33899f4f4d88d32a40165574c6a</guid>
      <pubDate>Tue, 27 May 2014 10:53:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/29137/206-coercion.mp4" length="77175220" type="video/mp4"/>
      <itunes:subtitle>Coercing different kinds of numbers</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[205 Comparable]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=515</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we meet a Ruby standard module that makes it easy to make classes comparable and sortable.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28881">205-comparable.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28882">205-comparable.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28883">feet.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28884">feet3.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28885">feet2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28886">feet4.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28887">205-comparable.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-ef982a22766b3b1de10a2e936239d6bd57032b35</guid>
      <pubDate>Thu, 22 May 2014 13:04:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/28887/205-comparable.mp4" length="33646846" type="video/mp4"/>
      <itunes:subtitle>Making objects comparable</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[204 Hash Equality]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=512</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Building on the previous episode on hash tables, today we tackle the concept of hash equality: how Ruby decides if two objects are the same for the purpose of use as hash keys.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28663">204-hash-equality.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28664">feet3.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28665">feet2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28666">204-hash-equality.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28667">feet.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28668">204-hash-equality.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-0e92e74c178439bd13bf45441998886d7bcde763</guid>
      <pubDate>Mon, 19 May 2014 15:49:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/28668/204-hash-equality.mp4" length="70858210" type="video/mp4"/>
      <itunes:subtitle>Some objects are more equal than others</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[203 Hash Table]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=509</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's dish is an exploration of how Ruby is able to quickly look up keys in hashes.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28356">203-hash-table.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28357">203-hash-table.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=28358">203-hash-table.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-8c7a020dab5fe4448a4b7c17c9ab1e5b95898af5</guid>
      <pubDate>Thu, 15 May 2014 11:06:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/28358/203-hash-table.mp4" length="25024170" type="video/mp4"/>
      <itunes:subtitle>How Ruby looks things up in hashes</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[202 Identity and Equality]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=507</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode deals with the concepts of identity and equality - what makes one object equal to another.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27948">202-identity-and-equality.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27949">202-identity-and-equality.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27950">feet.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27951">feet2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27952">202-identity-and-equality.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9514bd148dd24b862f6e78d94a22b8a95120f513</guid>
      <pubDate>Mon, 12 May 2014 11:24:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/27952/202-identity-and-equality.mp4" length="35575318" type="video/mp4"/>
      <itunes:subtitle>Defining object equality in terms of state.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[201 Immutable Object]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=505</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we learn how mutability can lead to bugs in Value Objects... and how we can eliminate these types of bugs once and for all.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27433">feet5.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27434">feet4.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27435">feet3.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27436">feet2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27437">201-immutable-object.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27438">altimeter2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27439">altimeter.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27440">feet.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27441">201-immutable-object.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27442">201-immutable-object.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-00689d2784375ae6ba94e6ffbdf08e3fbbbbc781</guid>
      <pubDate>Thu, 08 May 2014 11:40:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/27442/201-immutable-object.mp4" length="44057143" type="video/mp4"/>
      <itunes:subtitle>Mutability bugs, meet Mr. Freeze!</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[200 Quantity]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=504</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode we take a look at a storied problem in software: defects caused by accidentally mixing-up the units of measurement used in calculations. And we kick off a multi-part series exploring how to build objects that represent physical quantities.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27206">200-quantity.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27207">200-quantity.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27208">200-quantity.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27209">altimeter.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27210">feet.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=27211">feet2.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-b2dd3762c62758ab37f4c8698bbd1c55de1acc24</guid>
      <pubDate>Mon, 05 May 2014 09:37:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/27207/200-quantity.mp4" length="87269589" type="video/mp4"/>
      <itunes:subtitle>Representing physical quantities</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[199 Regexp Union]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=500</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode demonstrates an easy way to build big regular expressions out of little ones.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26891">199-regexp-union.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26892">199-regexp-union.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26893">199-regexp-union.html</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-e9969577668306aff5d77075cc7b808b17a51e3f</guid>
      <pubDate>Thu, 01 May 2014 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/26891/199-regexp-union.mp4" length="11241778" type="video/mp4"/>
      <itunes:subtitle>Joining regular expressions</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[198 Decorator Transparency]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=499</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode we look at a potential complication of using the Decorator pattern, and discuss how to resolve it by enforcing Command/Query Separation.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26583">198-decorator-transparency.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26584">withdraw_and_notify2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26585">198-decorator-transparency.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26586">withdraw_and_notify.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26587">audited_account.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26588">audit_log.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26589">bank_account.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26590">198-decorator-transparency.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-8826bd7a5ed32da59535dc3c29ad7165e204ba20</guid>
      <pubDate>Mon, 28 Apr 2014 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/26590/198-decorator-transparency.mp4" length="51607363" type="video/mp4"/>
      <itunes:subtitle>Decorators and CQS</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[197 Decorator]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=496</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we explore the Decorator pattern, with the help of the SimpleDelegator standard library.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26297">197-decorator.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26298">197-decorator.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26299">audited_account.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26300">bank_account.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26301">bank_account_with_auditing.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26302">audit_log.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26303">197-decorator.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-979bc792de1d89a37e151f0e18114f3b77142860</guid>
      <pubDate>Fri, 25 Apr 2014 13:33:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/26303/197-decorator.mp4" length="69418585" type="video/mp4"/>
      <itunes:subtitle>Adding new functionality without expanding existing classes</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[196 String Templates]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=494</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Have you ever wanted a way to customize the format of certain generated strings, but felt like ERB or some other templating language was overkill? If so, today's episode should satisfy!</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26076">196-string-templates.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26077">196-string-templates.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=26078">196-string-templates.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-c6499e49ba3da474eb2a5112caf1690497308e90</guid>
      <pubDate>Mon, 21 Apr 2014 13:41:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/26077/196-string-templates.mp4" length="30179208" type="video/mp4"/>
      <itunes:subtitle>When ERB is overkill</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[195 Advanced String Formats]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=488</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Following on from the last episode, today we look at some more advanced uses of Ruby's string formatting features.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25449">195-advanced-string-formats.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25450">195-advanced-string-formats.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25451">195-advanced-string-formats.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25452">data.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-71905d67a70117b6d22f0633ca9cbaf98fab7622</guid>
      <pubDate>Thu, 17 Apr 2014 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/25450/195-advanced-string-formats.mp4" length="57031025" type="video/mp4"/>
      <itunes:subtitle>Show those strings who's boss.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[194 String Formats]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=487</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Sometimes Kernel#puts and string interpolation doesn't give us the level of control we want over our program's output. When we need to control numeric formatting and field widths, we need to understand string formats. And that's what this episode is all about!</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25445">194-string-format.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25446">194-string-format.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25447">194-string-formats.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25448">data.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-7c3fa3be0b91b78e2a01760cb771b6f0c7926a9b</guid>
      <pubDate>Mon, 14 Apr 2014 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/25447/194-string-formats.mp4" length="57274955" type="video/mp4"/>
      <itunes:subtitle>Taking control of number formatting</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[193 Pathname]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=485</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>While the File methods are great for occasional use, for programs that deal extensively in filenames we need to bring out the big guns. Today we'll get an overview of Pathname, Ruby's swiss army knife for path manipulation.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25357">193-pathname.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25358">193-pathname.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25359">193-pathname.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-4728b2992335085ec71bd524cf76868be401117f</guid>
      <pubDate>Fri, 11 Apr 2014 09:45:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/25358/193-pathname.mp4" length="44090291" type="video/mp4"/>
      <itunes:subtitle>Manipulating file paths the easy way</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[192 Filenames]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=483</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Ruby provides a lot of tools for breaking filenames into their component parts, but they aren't always well documented. Today's episode combines goes over some basics as well as a tip you might not be familiar with.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25006">192-filenames.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25007">192-filenames.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=25008">192-filenames.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-ed35fe35fcf1068069be864c4650e676fdb56bd7</guid>
      <pubDate>Mon, 07 Apr 2014 17:28:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/25007/192-filenames.mp4" length="15414927" type="video/mp4"/>
      <itunes:subtitle>Breaking filenames into pieces</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[191 Virtual Proxy]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=479</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>When loading domain objects from an external service, it can be expensive to load up associated objects with them. Today's episode takes a look at a pattern for transparently lazy-loading such associations.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24847">191-virtual-proxy.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24848">191-virtual-proxy.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24849">menu_item_mapper2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24850">menu_item_mapper3.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24851">virtual_proxy.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24852">virtual_proxy2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24853">menu_item_mapper.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24854">models.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24855">recipe_mapper.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-8e37714153d6250b9ba8ff5a7090dfcd7a2be089</guid>
      <pubDate>Fri, 04 Apr 2014 08:55:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/24848/191-virtual-proxy.mp4" length="75853990" type="video/mp4"/>
      <itunes:subtitle>A scheme for lazy-loading associations</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[190 gsub]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=478</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we look at the humble String#gsub method, and learn that it has some surprising tricks up its sleeve.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24484">190-gsub.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24485">190-gsub.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24486">190-gsub.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24487">lexicon.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24488">text.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-40b8c59b311bf7f1ed1c0cdc2a48e6123e999372</guid>
      <pubDate>Mon, 31 Mar 2014 16:13:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/24484/190-gsub.mp4" length="43674506" type="video/mp4"/>
      <itunes:subtitle>Defending national security with string substitutions</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[189-assisted-refactoring]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=473</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode, we'll examine how the availability of tools to aid refactoring can change how we write code.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24080">189-assisted-refactoring.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24081">189-assisted-refactoring.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=24082">189-assisted-refactoring.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-a9b70a25e7122dec4baede9c0acc43a39110627c</guid>
      <pubDate>Thu, 27 Mar 2014 10:10:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/24081/189-assisted-refactoring.mp4" length="52511381" type="video/mp4"/>
      <itunes:subtitle>Sometimes an IDE is useful</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[188 Fail and Raise]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=471</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode is about a semantic convention for error handling that I learned from Jim Weirich.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=23912">188-fail-and-raise.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=23913">188-fail-and-raise.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=23914">188-fail-and-raise.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-a8e7720405b427bfc7c89f99c90afec2dc3719b1</guid>
      <pubDate>Mon, 24 Mar 2014 11:08:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/23913/188-fail-and-raise.mp4" length="21567686" type="video/mp4"/>
      <itunes:subtitle>Two ways to raise an exception</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[187 More Keyword Arguments]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=468</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we go a little deeper into keyword arguments in Ruby 2.0/2.1, covering a few use cases we didn't cover in the last episode.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=23541">187-more-keyword-arguments.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=23542">187-more-keyword-arguments.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=23543">187-more-keyword-arguments.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=23544">order_burger.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-fff890a31425e917c6b8f3ab8f755b44abed06ab</guid>
      <pubDate>Thu, 20 Mar 2014 12:03:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/23542/187-more-keyword-arguments.mp4" length="40444291" type="video/mp4"/>
      <itunes:subtitle>Advanced keyword arguments in Ruby 2.1</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[186 Keyword Arguments]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=466</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode is a guide to transitioning various hash argument idioms to Ruby 2.0/2.1 keywords.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=23320">186-keyword-arguments.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=23321">186-keyword-arguments.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=23322">186-keyword-arguments.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-8991f074c7f70edf5db8a1f46ceef209f770638e</guid>
      <pubDate>Mon, 17 Mar 2014 08:50:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/23322/186-keyword-arguments.mp4" length="44000378" type="video/mp4"/>
      <itunes:subtitle>Descriptive parameters without the pain</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[185 Two Refactorings]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=463</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's dish is a refactoring approached from two different perspectives. Enjoy!</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=23051">185-two-refactorings.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=23052">185-two-refactorings.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=23053">185-two-refactorings.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-b4d063060d7012c8eebf4edf3e7d02ffae56c961</guid>
      <pubDate>Thu, 13 Mar 2014 14:57:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/23052/185-two-refactorings.mp4" length="96515539" type="video/mp4"/>
      <itunes:subtitle>Functional! OO! Fight!</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[184 Sequel, Postgres, JSON]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=458</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Recently we looked at the Sequel library for interacting with SQL databases. Today, we'll use Sequel again to play with the native JSON support in PostgreSQL 9.3.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22667">184-sequel-postgres-json.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22668">184-sequel-postgres-json.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22669">184-sequel-postgres-json.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-416c071674529a88ee41d71bd5d990d4376903a6</guid>
      <pubDate>Mon, 10 Mar 2014 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/22668/184-sequel-postgres-json.mp4" length="84774189" type="video/mp4"/>
      <itunes:subtitle>Working with JSON data in Postgres from Ruby</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[183 Extracting Ghost Load]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=457</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>We've used the "ghost object" pattern to lazily load attributes of a model object. And we've made a macro to easily declare "ghost-loadable" attribute accessors. Today we complete the generalization of ghost loading by extracting a module that makes it easy for any model object to declare lazily-loaded attributes.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22664">183-extracting-ghost-load.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22665">183-extracting-ghost-load.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22666">183-extracting-ghost-load.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-d433bf30b0e973f4d6089f96e10b04818f9ac20c</guid>
      <pubDate>Thu, 06 Mar 2014 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/22665/183-extracting-ghost-load.mp4" length="33880463" type="video/mp4"/>
      <itunes:subtitle>Extracting a reusable module</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[182 Macro]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=456</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>When is it appropriate to metaprogram? Today's episode looks at one situation in which it may be a good choice.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22541">182-macro.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22542">182-macro.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22543">182-macro.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22544">episode.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-06d32231a45e6b19233ea00fa59ac0726914c059</guid>
      <pubDate>Mon, 03 Mar 2014 09:50:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/22542/182-macro.mp4" length="25643780" type="video/mp4"/>
      <itunes:subtitle>Eliminating duplication with metaprogramming</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[181 Schwartzian Transform]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=452</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode demonstrates a technique for speeding up the process of sorting some collections.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22344">181-schwartzian-transform.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22345">181-schwartzian-transform.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22346">181-schwartzian-transform.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-5ff1edfd51f9d7e41a990e112fc789233f2541ce</guid>
      <pubDate>Thu, 27 Feb 2014 17:38:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/22345/181-schwartzian-transform.mp4" length="54674519" type="video/mp4"/>
      <itunes:subtitle>Faster sorting</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[180 Ghost Load]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=451</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode we learn at how to implement lazy loading using the "ghost object" pattern.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22078">180-ghost-load.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22079">180-ghost-load.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22080">episode.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22081">episode_mapper.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=22082">ghost_episode.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-6a41312ec3aa90024db8642528a5ea6ea7afe7ec</guid>
      <pubDate>Mon, 24 Feb 2014 10:28:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/22078/180-ghost-load.mp4" length="49704071" type="video/mp4"/>
      <itunes:subtitle>Who you gonna call?</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[179 Sequel]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=449</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>ActiveRecord has become practically synonymous with SQL database access in Ruby, but it's not the only way to talk to SQL stores. Today we'll explore Sequel, a wonderfully rich tool for interacting with many different SQL RDBMSes.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21888">179-sequel.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21889">sequel.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21890">sequel.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-aee9e5e7347fd3e4ccf32aa63220ac275f19a5cf</guid>
      <pubDate>Thu, 20 Feb 2014 11:52:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/21888/179-sequel.mp4" length="53811701" type="video/mp4"/>
      <itunes:subtitle>Talking to SQL databases</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[178 Identity Map]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=447</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In the last episode we looked at the problem of "aliasing", here there are multiple objects representing a single row in a database. Today, we'll look at one possible solution to that problem.</p>
<p>Notes:</p>
<ul>
<li>DataMapper:&nbsp;<a href="http://datamapper.org/">http://datamapper.org/</a></li>
<li>Ruby Object Mapper (ROM):&nbsp;<a href="http://rom-rb.org/">http://rom-rb.org/</a></li>
<li>Perpetuity:&nbsp;<a href="https://github.com/jgaskins/perpetuity">https://github.com/jgaskins/perpetuity</a></li>
</ul>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21658">178-identity-map.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21659">178-identity-map.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21660">178-identity-map.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21661">data_mappers.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21662">models.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21663">db.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21664">helpers.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21665">fixture.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-76965ebcd3cb2997b5039c670047f49c67a73e6a</guid>
      <pubDate>Mon, 17 Feb 2014 10:47:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/21660/178-identity-map.mp4" length="46416285" type="video/mp4"/>
      <itunes:subtitle>Putting an end to aliasing</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[177 Aliasing]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=443</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we look at a perncious problem that sometimes plagues code which uses an Object-Relational Mapper (ORM).</p>
<p>Documentation of the ActiveRecord inverse_of option mentioned in the episode can be found <a href="http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html">here:&nbsp;http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21381">177-aliasing.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21382">helpers2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21383">177-aliasing.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21384">helpers.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21385">setup.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21386">fixture.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21387">data_mappers.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21388">models.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21389">db.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21390">177-aliasing.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-4116919baac611a5d1163a9f8b03cc514cf4ea37</guid>
      <pubDate>Thu, 13 Feb 2014 15:32:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/21390/177-aliasing.mp4" length="80610942" type="video/mp4"/>
      <itunes:subtitle>ORMs and evil clones</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[176 Dotenv]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=440</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we look at a tool that I've found invaluable for managing configuration in my applications.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=20999">176-dotenv.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21000">176-dotenv.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=21001">176-dotenv.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-6bc9f4a790c3306d35fa2a9fc322b0f038346593</guid>
      <pubDate>Mon, 10 Feb 2014 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/21000/176-dotenv.mp4" length="22533926" type="video/mp4"/>
      <itunes:subtitle>Config without config files</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[175 REPL-Driven Development]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=438</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode I cover a classic development technique that doesn't get enough press these days. Interactive, exploratory development was and is common in the Lisp world, and Ruby's dynamic nature is aptly suited to take advantage of this style of programming. Today I'll show you how I used REPL-driven development in Pry and Emacs to begin to build a video export tool.</p>
<p>By the way, right after I made this episode I discovered that Conrad Irwin had done a RubyConf talk on REPL-driven development. You can watch it here:&nbsp;<a href="https://www.youtube.com/watch?v=D9j_Mf91M0I">https://www.youtube.com/watch?v=D9j_Mf91M0I</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=20800">175-repl-driven-development_0001.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-8812065c775a4f0a41195bfd9add1e7788bb73e8</guid>
      <pubDate>Thu, 06 Feb 2014 09:43:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/20800/175-repl-driven-development_0001.mp4" length="95361691" type="video/mp4"/>
      <itunes:subtitle>Developing via exploration</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[174 Multiple Assignment]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=436</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's special is a note on style with a side order of opinion. Enjoy!</p>
<p>(Note: I made a mistake in the visualization of which variables correspond to which on either side of the equals sign. Which kind of illustrates my point!)</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=20581">174-multiple-assignment.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=20582">174-multiple-assignment.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=20583">174-multiple-assignment.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-93b1e87480e2faefe3dcffa569d3215ab2281351</guid>
      <pubDate>Mon, 03 Feb 2014 10:34:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/20582/174-multiple-assignment.mp4" length="13094452" type="video/mp4"/>
      <itunes:subtitle>Assigning multiple variables on a single line</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[173 for]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=432</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Newer arrivals to Ruby sometimes wonder when to use #each, and when to use 'for'. Today, a detailed explanation of how they differ, and an opinion on when to use 'for'.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=20279">173-for.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=20280">173-for.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=20281">173-for.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-533be121d8008a765b296da22c21acf020a2e0ce</guid>
      <pubDate>Thu, 30 Jan 2014 10:21:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/20280/173-for.mp4" length="21212268" type="video/mp4"/>
      <itunes:subtitle>What's "for" for anyway?</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[172 Registry]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=431</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's dish is another one from one of my favorite cookbooks: Martin Fowler's <em>Patterns of Enterprise Application Development</em>. This time, we'll use the Registry pattern to make it easy for objects to find the collaborators they need, without hardcoding their dependencies.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=20144">172-registry.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=20145">172-registry.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=20146">172-registry.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-cf5805ade621122e559d12c5bdf4f4d1a46ad0f7</guid>
      <pubDate>Mon, 27 Jan 2014 09:53:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/20145/172-registry.mp4" length="85278653" type="video/mp4"/>
      <itunes:subtitle>Simplifying collaborator discovery</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[171 puts]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=427</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Even the most basic of Ruby methods sometimes have hidden depth. Today we'll take a look at some advanced uses of the <span style="font-family: 'courier new', courier;">puts</span> method.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19937">171-puts.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19938">171-puts.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19939">171-puts.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-e825ff5acf4dd4c3183c58dfe5a83883ce96e49c</guid>
      <pubDate>Thu, 23 Jan 2014 11:50:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/19938/171-puts.mp4" length="22357375" type="video/mp4"/>
      <itunes:subtitle>Think you know about puts? Think again!</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[170 Hash Merge]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=426</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode covers an incredibly handy capability of Ruby's hashes that I didn't know about until recently.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19630">170-hash-merge.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19631">170-hash-merge.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19632">170-hash-merge.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-e3291c6d0fbdb20fa5faa591999d50482ddf02aa</guid>
      <pubDate>Mon, 20 Jan 2014 10:10:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/19631/170-hash-merge.mp4" length="22009860" type="video/mp4"/>
      <itunes:subtitle>Putting hashes together</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[169 Caching Proxy]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=423</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>You might remember the Gateway and Mapper patterns from recent episodes. Today we'll look at how to insert a caching layer between those two patterns. In the process, we'll examine how pattern-based design decisions can make it easy to add new functionality without changing existing classes.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19406">169-caching-proxy.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19407">169-caching-proxy.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19408">169-caching-proxy.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-c8bd83b3faa63fca9d6c0eaadc87432d9eb29e2c</guid>
      <pubDate>Thu, 16 Jan 2014 09:18:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/19407/169-caching-proxy.mp4" length="46562435" type="video/mp4"/>
      <itunes:subtitle>Cleanly inserting a caching layer</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[168 Enumerable Internals]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=421</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this very special episode, guest chef Pat Shaughnessy takes us on a whirlwind tour of the Ruby internals that make the Enumerable#all? method tick.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19249">all.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19250">script.txt</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19279">168-enumerable-internals.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-05632265ab13651e07282412fe9d755af61673fb</guid>
      <pubDate>Mon, 13 Jan 2014 10:19:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/19279/168-enumerable-internals.mp4" length="46213864" type="video/mp4"/>
      <itunes:subtitle>With guest chef Pat Shaughnessy!</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[167 Debugging in Gems]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=419</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>When debugging a tricky problem, don't you sometimes wish you could just drop a line of debugging code right in the middle of a third-party gem? This episode shows how to do this in a responsible fashion.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19104">167-debugging-in-gems.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19105">167-debugging-in-gems.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=19106">167-debugging-in-gems.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9b4f03a52a16fd3e29c1c48c3e6ea4d16036a8ef</guid>
      <pubDate>Thu, 09 Jan 2014 10:07:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/19105/167-debugging-in-gems.mp4" length="115614013" type="video/mp4"/>
      <itunes:subtitle>A heretical but effective technique</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[166 Not Implemented]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=416</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Ruby doesn't have a built-in concept of "abstract" classes, but sometimes we want a way to show other programmers when methods are left as an exercise for the implementor. This episode discusses how.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18975">166-not-implemented.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18976">166-not-implemented.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18977">logical_condition.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18978">logical_condition2.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-bc9d5d94391daa889375efd308212c18726c2e16</guid>
      <pubDate>Mon, 06 Jan 2014 09:14:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/18976/166-not-implemented.mp4" length="22229287" type="video/mp4"/>
      <itunes:subtitle>Writing placeholder methods</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[165 Refactor Tapas::Queue]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=415</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In previous episodes, we got the Tapas::Queue class under test, using a couple of different thread-testing techniques. Now that it has tests, it's time to refactor.</p>
<p>The steps of this refactoring can be seen on this Github branch:&nbsp;<a href="https://github.com/avdi/tapas-queue/commits/refactor-conditions">https://github.com/avdi/tapas-queue/commits/refactor-conditions</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18735">165-refactor-tapas-queue.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18736">165-refactor-tapas-queue.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-b0698a7c42a196075f5293a66a4989b23ad42c7b</guid>
      <pubDate>Thu, 02 Jan 2014 09:21:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/18736/165-refactor-tapas-queue.mp4" length="105288643" type="video/mp4"/>
      <itunes:subtitle>Extracting common functionality, one step at a time</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[164 Mapper]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=412</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we explore a pattern for bridging the gap between different domain models.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18612">164-mapper.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18613">164-mapper.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18614">164-mapper.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-5231c8eb0a06d6e2bcecdda9e64c9c91958fcfb6</guid>
      <pubDate>Mon, 30 Dec 2013 09:11:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/18614/164-mapper.mp4" length="47261518" type="video/mp4"/>
      <itunes:subtitle>Bridging the gap between domain models</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[163 YAML::Store]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=410</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we follow up on the last episode to talk about YAML::Store. It's like PStore, only with YAML!</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18370">163-yaml-store.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18371">163-yaml-store.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18372">benchmark.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18373">lister2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18374">lister.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18375">163-yaml-store.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-3540e07b098dded9f1f1ab87dbf56d3692ed51a7</guid>
      <pubDate>Thu, 26 Dec 2013 10:34:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/18375/163-yaml-store.mp4" length="21931322" type="video/mp4"/>
      <itunes:subtitle>A more readable alternative to PStore</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[162 PStore]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=408</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode we take a look at PStore, a simple but capable persistence mechanism that ships with Ruby.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18259">162-pstore.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18260">162-pstore.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18261">write_read.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18262">seed.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18263">lister.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18264">write_read.sh</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18265">162-pstore.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-4df23d874139ddfcaedd38a7c8db0b73d9d1da32</guid>
      <pubDate>Mon, 23 Dec 2013 09:45:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/18265/162-pstore.mp4" length="51386770" type="video/mp4"/>
      <itunes:subtitle>A simple storage solution</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[161 Thread Local Variable]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=406</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode introduces the concept of thread-local variables, and shows how they can be put to use in an ActiveRecord-like library.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18026">161-thread-local-variable.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18027">161-thread-local-variable.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=18028">161-thread-local-variable.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-d011048df1e76b2bc69b5656f3bc8acac99a6639</guid>
      <pubDate>Thu, 19 Dec 2013 09:13:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/18027/161-thread-local-variable.mp4" length="59007820" type="video/mp4"/>
      <itunes:subtitle>Scoping variables to the current stack</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[160 Reduce Redux]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=403</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we revisit the Enumerable#reduce method, addressing some viewer feedback about seed values as well as exploring a novel application of reduce for traversing data structures.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17805">160-reduce-redux.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17806">160-reduce-redux.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17807">160-reduce-redux.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-54749680a9c91fefffb7307d6436c676f1e7aa51</guid>
      <pubDate>Mon, 16 Dec 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/17806/160-reduce-redux.mp4" length="28278996" type="video/mp4"/>
      <itunes:subtitle>More about Enumerable#reduce</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[159 Array Set Operations]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=400</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Sometimes we'd like to treat Ruby arrays like sets, in which each item is unique. Today's dish shows how!</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17532">159-array-set-operations.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17533">159-array-set-operations.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17534">159-array-set-operations.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-5d772653bde85e1c4a2e94ba5c430a76ac0fa4c3</guid>
      <pubDate>Thu, 12 Dec 2013 10:47:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/17533/159-array-set-operations.mp4" length="28302524" type="video/mp4"/>
      <itunes:subtitle>Treating arrays like sets</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[158 Constant Lookup Scope]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=397</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>This episode takes a look at some potentially surprising rules for how Ruby looks up constants.</p>
<p>Notes:</p>
<ul>
<li>"<a href="http://cirw.in/blog/constant-lookup.html">Everything you ever wanted to know about constant lookup in Ruby</a>", by Conrad Irwin</li>
</ul>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17341">158-constant-lookup-scope.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17343">metric.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17344">metric2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17345">metric3.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17346">planets.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17375">158-constant-lookup-scope.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-1a150f6b47f3529945a37e63b946d7a88df70c75</guid>
      <pubDate>Mon, 09 Dec 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/17375/158-constant-lookup-scope.mp4" length="32663992" type="video/mp4"/>
      <itunes:subtitle>How Ruby looks up constants</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[157 Lockstep Testing]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=393</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we'll explore a novel technique for testing multithreaded code.</p>
<p>The lockstep library can be found here:&nbsp;<a href="https://github.com/avdi/lockstep">https://github.com/avdi/lockstep</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17030">157-lockstep-testing.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17031">157-lockstep-testing.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17032">157-lockstep-testing.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-f6bd001316a691b1b2a9f1bf86c04073cde512f5</guid>
      <pubDate>Thu, 05 Dec 2013 11:09:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/17031/157-lockstep-testing.mp4" length="98662013" type="video/mp4"/>
      <itunes:subtitle>Testing threaded code without threads</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[156 Array.new]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=391</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today, special guest chef James Edward Gray II hosts, and shows us a thing or two about generating arrays pre-filled with values!</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=16379">156-array-new.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9b2cf32a2ab987e5de30c6b7aecb2a02c29b9c48</guid>
      <pubDate>Mon, 02 Dec 2013 09:50:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/16379/156-array-new.mp4" length="71091524" type="video/mp4"/>
      <itunes:subtitle>With guest host James Edward Gray II</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[155 Matching Triples]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=388</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode delves into some advanced regular expression features, including "lookahead" and "lookbehind".</p>
<p>Notes for further exploration:</p>
<ul>
<li>The book <a href="http://pragprog.com/book/ruby4/programming-ruby-1-9-2-0">"Programming Ruby 1.9 and 2.0"</a></li>
<li><a href="/plan/editpost/rubular.com">rubular.com</a></li>
<li><a href="http://confreaks.com/presenters/721-nell-shamrell">Talks from Nell Shamrell</a>. There are also <a href="http://www.slideshare.net/NellShamrell/presentations">slides</a>.</li>
<li>Nell's blog <a href="https://www.bluebox.net/insight/blog-article/using-regular-expressions-in-ruby-part-1-of-3">series on regular expressions in Ruby</a></li>
</ul>
<p>(Clip from "<a href="http://confreaks.com/videos/2610-lonestarruby2013-beneath-the-surface-regular-expressions-in-ruby">Beneath the Surface: Regular Expressions in Ruby</a>", <a href="http://creativecommons.org/licenses/by-sa/3.0/">CC</a> by <a href="http://twitter.com/@nellshamrell">Nell Shamrell</a>.&nbsp;Recorded by <a href="http://confreaks.com/">Confreaks</a> at Lone Star Ruby Conference 2013)</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=16171">155-matching-triples.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=16172">155-matching-triples.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=16173">155-matching-triples.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-5f4166f631e3133b6a7fed9a8ac045a787d06173</guid>
      <pubDate>Thu, 28 Nov 2013 09:46:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/16172/155-matching-triples.mp4" length="60368783" type="video/mp4"/>
      <itunes:subtitle>An episode on advanced regular expressions</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[154 Testing Threads]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=386</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Working with threads is hard enough, but getting them under test is even trickier. In this episode we start to look at techniques for verifying the logic of multithreaded code.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=16023">154-testing-threads.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=16024">154-testing-threads.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=16025">154-testing-threads.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-d8d28b21a0dd9fa9d7f1235ef49bd9516ccdb641</guid>
      <pubDate>Mon, 25 Nov 2013 09:29:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/16024/154-testing-threads.mp4" length="53762300" type="video/mp4"/>
      <itunes:subtitle>Unit testing threaded code</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[153 Testing Sleep]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=383</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>We try to avoid writing slow unit tests, but what if we are testing a method whose responsibilities include waiting for a period of time? In this episode we look at a few approaches, talk about the difference between testing logic and testing system interactions, and finally settle on a strategy that leads us to a more flexible design.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=15828">153-testing-sleep.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=15829">153-testing-sleep.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=15830">153-testing-sleep.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-77d49fc0580d2bb2630cbe2210d0001d86da5570</guid>
      <pubDate>Thu, 21 Nov 2013 10:24:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/15829/153-testing-sleep.mp4" length="53920415" type="video/mp4"/>
      <itunes:subtitle>How to test a method that sleeps</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[152 Progress Bar]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=378</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we look at a gem that can make command-line scripts more pleasant to use.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=15636">test-sleep-progress.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17377">152-progress-bar.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=17378">152-progress-bar.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-b48ee87e17ae635452b48037331278a41e8bfe3f</guid>
      <pubDate>Mon, 18 Nov 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/17378/152-progress-bar.mp4" length="27083322" type="video/mp4"/>
      <itunes:subtitle>Displaying visual progress for command-line scripts</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[151 Sleep]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=375</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode tackles a subject I've always wondered about: how accurate is <code>Kernel#sleep</code>?</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=15172">151-sleep.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=15173">151-sleep.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=15174">test-sleep.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-be4001143ef3181f539c1874ab0be46ba66a2896</guid>
      <pubDate>Thu, 14 Nov 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/15173/151-sleep.mp4" length="56432098" type="video/mp4"/>
      <itunes:subtitle>To sleep(), perchance to dream</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[150 Stats]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=374</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Sooner or later you'll need to generate statistics from a collection. In this episode, we look at how to produce min, max, sum, average, median, and standard deviation from a set of samples.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=15130">150-stats.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=15131">150-stats.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=15132">150-stats.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9ca19b9d8d748f4e4bd3797c284c15a2f7869bd4</guid>
      <pubDate>Mon, 11 Nov 2013 18:29:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/15131/150-stats.mp4" length="23832288" type="video/mp4"/>
      <itunes:subtitle>Deriving essential statistics in Ruby</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[149 Sum]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=371</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode takes on a simple task--summing up a list of numbers--and uses it to demonstrate both the <code>Enumerable#reduce</code> method as well as <code>Symbol#to_proc</code>.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=14893">149-sum.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=14894">149-sum.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=14895">149-sum.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-0b353dd124bcc104e4d27214e68f53b0588b9e71</guid>
      <pubDate>Thu, 07 Nov 2013 15:49:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/14894/149-sum.mp4" length="22560417" type="video/mp4"/>
      <itunes:subtitle>How to idiomatically sum up a list of numbers</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[148 Rake Invoke]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=368</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>This episode looks at how to invoke Rake tasks from other programs.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=14699">148-rake-invoke.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=14700">148-rake-invoke.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=14701">hello.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=14702">Rakefile</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=14703">Rakefile2</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-3f1a8f4eea86234fa3e0b58c1db0f9ec89e511ab</guid>
      <pubDate>Mon, 04 Nov 2013 00:29:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/14700/148-rake-invoke.mp4" length="15830205" type="video/mp4"/>
      <itunes:subtitle>Invoking Rake tasks from other programs</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[147 Atomicity]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=355</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's is another threading episode. This time around, we tackle the subject of "atomicity", and learn about the false assumption at the root of many threading bugs.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5343">147-atomicity.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5344">147-atomicity.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5345">147-atomicity.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-f8aec54a254df14453e4dbf38891640a88708f16</guid>
      <pubDate>Thu, 31 Oct 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/5344/147-atomicity.mp4" length="31045519" type="video/mp4"/>
      <itunes:subtitle>More fun with threads.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[146 Monitor]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=354</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we learn about the concept of a "recursive mutex" as we help a turtle-racing league update their software systems.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5340">146-monitor.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5341">146-monitor.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5342">146-monitor.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-378bc343078034810d85b76f50fe2945302be58a</guid>
      <pubDate>Mon, 28 Oct 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/5341/146-monitor.mp4" length="27516769" type="video/mp4"/>
      <itunes:subtitle>It's mutexes all the way down.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[145 Thread Pool]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=353</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Continuing with the general theme of threads and concurrency, today we look at another pattern for splitting up work in parallel.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5337">145-thread-pool.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5338">145-thread-pool.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5339">145-thread-pool.html</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-4fa1f9cabb34858f0c7f895269af4e31cd61c994</guid>
      <pubDate>Thu, 24 Oct 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/5337/145-thread-pool.mp4" length="34799718" type="video/mp4"/>
      <itunes:subtitle>Accelerating work with threads and work queues.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[144 Bulk Generation]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=352</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we take some already-good code and make it even better.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5334">144-bulk-generation.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5335">144-bulk-generation.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5336">144-bulk-generation.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-902579d3b227c9a603e8cd6388ac4ea403d48996</guid>
      <pubDate>Mon, 21 Oct 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/5335/144-bulk-generation.mp4" length="12179887" type="video/mp4"/>
      <itunes:subtitle>Refactoring from good to great.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[143 Thread Interruptions]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=351</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we finally discover why the Timeout module is unsafe, and a facility new in Ruby 2.0 that makes dealing with thread interruptions much less error-prone.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5315">143-thread-interruptions.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5316">143-thread-interruptions.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5317">143-thread-interruptions.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9c155830e2908afa5e9b94b9bcaba7d8fdcaa4ca</guid>
      <pubDate>Thu, 17 Oct 2013 19:14:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/5316/143-thread-interruptions.mp4" length="56227828" type="video/mp4"/>
      <itunes:subtitle>Safely interrupting thread execution</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[142 Infinity]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=349</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode, we'll simplify our thread-safe queue code by employing a "benign value" to represent the default max queue size.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5081">142-infinity.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5082">infinity.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=5083">142-infinity.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-983b7a40211a2f047595d1287824ff9ec136ae17</guid>
      <pubDate>Mon, 14 Oct 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/5083/142-infinity.mp4" length="9153000" type="video/mp4"/>
      <itunes:subtitle>Using Ruby's INFINITY constant.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[141 Bounded Queue]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=346</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>We continue to evolve our thread-safe queue implementation. Today, we add the ability to set a bound on the queue size.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=4931">141-bounded-queue.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=4932">refactor.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=4933">bounded_queue.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=4934">141-bounded-queue.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-60a9c260289709fb279c17c11aaa154a638d9038</guid>
      <pubDate>Thu, 10 Oct 2013 10:14:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/4934/141-bounded-queue.mp4" length="31056900" type="video/mp4"/>
      <itunes:subtitle>We continue to evolve our thread-safe queue implementation. Today, we add the ability to set a bound on the queue size.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[140 Threads are Hard]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=337</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode some bugs turn up in our thread-safe queue class.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=2893">140-threads-are-hard.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=2894">force_bug.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=2895">fixed.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=2896">fixed2.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=2897">break_on_timeout.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=2898">140-threads-are-hard.html</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-e25279959b422373b41db2a4aeb766689c8dd8af</guid>
      <pubDate>Mon, 07 Oct 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/2893/140-threads-are-hard.mp4" length="50246358" type="video/mp4"/>
      <itunes:subtitle>Fixing some threading bugs</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[139 Timed Queue]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=336</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Continuing to build our own thread-safe queue class, today we give it the ability to handle time out enqueues and dequeues.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=2886">139-timed-queue.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=2887">break_on_timeout.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=2888">cv.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=2889">timed_queue.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=2890">shutdown.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=2891">timeout_policy.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=2892">139-timed-queue.html</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-0137c0aa7e0a6b55c93f438b747487cbff463de2</guid>
      <pubDate>Thu, 03 Oct 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/2886/139-timed-queue.mp4" length="40072011" type="video/mp4"/>
      <itunes:subtitle>Making a thread-safe queue that can time out</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[138 Condition Variable]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=297</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>As we continue to explore the fundamental building blocks of multithreaded programming, today we encounter the Condition Variable, and what it has to do with my local delicatessen.&nbsp;</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1645">138-condition-variable.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1646">138-condition-variable.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1647">condition_variable.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-98290194a4645b1edf4f716473f4226fc845c7e5</guid>
      <pubDate>Mon, 30 Sep 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1646/138-condition-variable.mp4" length="27269176" type="video/mp4"/>
      <itunes:subtitle>Guarding scarce resources in a multithreaded program</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[137 Mutex]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=296</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we introduce the concept of a "critical section", and learn about one of the fundamental primitives that makes multithreaded programming possible.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1640">137-mutex.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1641">137-mutex.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1642">critical.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1643">mutex.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1644">naive_queue.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-21996b4c010e526ed3d7f3957d86a38772e9ea13</guid>
      <pubDate>Thu, 26 Sep 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1641/137-mutex.mp4" length="29159878" type="video/mp4"/>
      <itunes:subtitle>Keeping threads exclusive</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[136 Dead Thread]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=295</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Concurrent programming is hard, and one of the things that makes it so hard is that a thread can unexpectedly die without giving the programmer any indication. In this episode we look at some ways to make threads fail fast and loudly while in development.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1629">136-dead-thread.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1630">136-dead-thread.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1631">threads.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1632">threads_debug.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1633">threads_fixed.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1634">threads_no_deadlock.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1635">threads_raise_on_error.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1636">threads_really_fixed.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1637">threads_sized.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1638">threads_timeout.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-21bfd7498b22a74536946be33751e8a849b468b3</guid>
      <pubDate>Mon, 23 Sep 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1630/136-dead-thread.mp4" length="43007805" type="video/mp4"/>
      <itunes:subtitle>Dead threads tell no tales</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[135 Rake MultiTask]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=294</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this, the final (for now) episode of the Rake miniseries, we take a look at how to speed up Rake runs by taking advantage of multiple cores.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1626">135-rake-multitask.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1627">135-rake-multitask.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1628">Rakefile</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-195820dd766a18de2c21d007e8ca5217c3e874dd</guid>
      <pubDate>Thu, 19 Sep 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1627/135-rake-multitask.mp4" length="39189059" type="video/mp4"/>
      <itunes:subtitle>Building more than one file at a time</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[134 Rake Clean]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=291</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>My children know they are supposed to clean their place at the table after dinner. Sometimes software builds need to be cleaned up too, and today we'll learn about an optional Rake library which streamlines this process.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1619">134-rake-clean.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1620">134-rake-clean.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1621">Rakefile</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-1ac5d64a7ea686b228752e2db339fe2921855f89</guid>
      <pubDate>Mon, 16 Sep 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1620/134-rake-clean.mp4" length="34009130" type="video/mp4"/>
      <itunes:subtitle>Cleaning up after ourselves</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[133 Rake File Operations]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=290</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Rake has a lot of tricks up its sleeve. In this episode we'll look at some of the helpers it provides for performing various common operations on files.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1616">133-rake-file-operations.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1617">133-rake-file-operations.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1618">Rakefile</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-a9ef808ea0d8f783b2bc0f80d6fcdf8d58197b2f</guid>
      <pubDate>Thu, 12 Sep 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1617/133-rake-file-operations.mp4" length="28239432" type="video/mp4"/>
      <itunes:subtitle>Making, moving, and removing files</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[132 Rake Pathmap]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=289</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's dish is a real delicacy... we're going to dig into one of Rake's most powerful but little-known capabilities and see how we can easily transform collections of path names with the #pathmap method.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1613">132-rake-pathmap.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1614">132-rake-pathmap.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1615">132-rake-pathmap.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-8d6ff9aba4c189bf15c0883ffeadef6d99171448</guid>
      <pubDate>Mon, 09 Sep 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1614/132-rake-pathmap.mp4" length="34346323" type="video/mp4"/>
      <itunes:subtitle>Munging path names</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[131 Rake Rules]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=288</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we learn how to write advanced Rake rules which programatically determine the appropriate prerequisites for a given target file.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1609">131-rake-rules.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1610">131-rake-rules.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1611">131-rake-rules.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1612">Rakefile</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-c81106d0809290345842d512bef38df3bbf30307</guid>
      <pubDate>Thu, 05 Sep 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1610/131-rake-rules.mp4" length="47403174" type="video/mp4"/>
      <itunes:subtitle>Using advanced Rake rules</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[130 Rake File Lists]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=287</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>As we continue our series on Rake, today we look at the Rake::FileList and how it can help us find the files we need and ignore the ones we don't.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1602">130-rake-file-lists.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1603">130-rake-file-lists.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1604">130-rake-file-lists.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1605">Rakefile</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-52119538a9dfa09f14cf08be57c49c7dbb83ff66</guid>
      <pubDate>Mon, 02 Sep 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1603/130-rake-file-lists.mp4" length="22921458" type="video/mp4"/>
      <itunes:subtitle>Building lists of files in Rake</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[129 Rake]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=286</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we begin a series on the Rake build tool. We'll be getting into some powerful, lesser-known features as we continue on; but we'll start out with a quick review of Rake basics.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1574">129-rake.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1575">129-rake.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1576">build.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1577">Rakefile</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1578">Rakefile2</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1579">Rakefile3</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1580">Rakefile4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-f074d908690511c21a699a038946548ba2040411</guid>
      <pubDate>Thu, 29 Aug 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1575/129-rake.mp4" length="25085949" type="video/mp4"/>
      <itunes:subtitle>Automating builds with Rake</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[128 Enumerable Queue]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=283</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Queue, somewhat surprisingly, is not enumerable. Which is all the excuse we need to have some more fun with the Enumerator class, in today's episode.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1485">128-enumerable-queue.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1486">128-enumerable-queue.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1487">128-enumerable-queue.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-a162c36f26499c58d955ea0e5181379b2fafe96f</guid>
      <pubDate>Mon, 26 Aug 2013 14:14:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1486/128-enumerable-queue.mp4" length="12068133" type="video/mp4"/>
      <itunes:subtitle>More fun with Enumerators</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[127 Parallel Fib]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=279</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Last time around we introduced the Queue class. In this episode, we'll put it to work!</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1402">127-parallel-fib.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1403">127-parallel-fib.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1404">fib.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-fb3d46a18c7dbcbc56732ea447a44d40b38a60b5</guid>
      <pubDate>Thu, 22 Aug 2013 13:48:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1402/127-parallel-fib.mp4" length="59976683" type="video/mp4"/>
      <itunes:subtitle>Putting Queue to work</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[126 Queue]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=274</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode introduces the Queue standard library, and shows how it can be used to coordinate threads.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1345">126-queue.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1346">126-queue.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1347">126-queue.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-5da61d3a82ecb44c42ee79ee92b2573d3b4bf0f4</guid>
      <pubDate>Mon, 19 Aug 2013 12:17:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1346/126-queue.mp4" length="18430312" type="video/mp4"/>
      <itunes:subtitle>Introducing the Queue stdlib</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[125 And/Or]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=270</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Ruby has both symbolic and English forms of the logical "and" and "or" operators. Which one to choose may seem like a matter of taste, but that assumption can get you into trouble.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1262">125-and-or.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1263">125-and-or.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1264">125-and-or.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-b196a0f7db86e64b806c330773725e6286bbcbc0</guid>
      <pubDate>Thu, 15 Aug 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1263/125-and-or.mp4" length="28839923" type="video/mp4"/>
      <itunes:subtitle>Understanding Ruby's logical operators.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[124 Elixir]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=269</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we take a brief sojourn out of Ruby and into the Elixir programming language. I'll show you one of my first programs in Elixir and point out how the language's pattern-matching abilities can contribute to some very elegant solutions.</p>
<p>If this episode piques your interest in Elixir, here are some resources you can explore to find out more:</p>
<p>&nbsp;</p>
<ul>
<li>The Elixir home page:&nbsp;<a href="http://elixir-lang.org/">http://elixir-lang.org/</a></li>
<li>Meet Elixir, an excellent screencast from Peepcode:&nbsp;<a href="https://peepcode.com/products/elixir">https://peepcode.com/products/elixir</a></li>
<li>Programming Elixir, a book in beta by Dave Thomas:&nbsp;<a href="http://pragprog.com/book/elixir/programming-elixir">http://pragprog.com/book/elixir/programming-elixir</a></li>
</ul>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1212">124-elixir.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1213">124-elixir.html</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-b3722db3bee261d21615fa30ab86582ab0cbec9d</guid>
      <pubDate>Mon, 12 Aug 2013 10:33:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1212/124-elixir.mp4" length="30565031" type="video/mp4"/>
      <itunes:subtitle>A little diversion into the Elixir language</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[123 Removing Debug Output]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=267</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Have you ever had a project that spat out so much deubg output when it ran that you couldn't tell when it had a legitimate error or warning to report? In today's episode I'll show you how to quickly and easily track down the source of unwanted output.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1139">123-removing-debug-output.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1140">123-removing-debug-output.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1141">123-removing-debug-output.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-b0940cf027731b48f1d87ffce81d7e8305a3edf2</guid>
      <pubDate>Thu, 08 Aug 2013 12:42:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1140/123-removing-debug-output.mp4" length="26490951" type="video/mp4"/>
      <itunes:subtitle>Cleaning up chatty code</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[122 Testing Blocks with RSpec]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=266</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Last episode we looked at a simple way to test if a method executes a block as intended that will work in any test framework. But if your tool of choice is RSpec, there are some matchers that make these kinds of tests shorter and more declarative.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1096">122-testing-blocks-with-rspec.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1097">122-testing-blocks-with-rspec.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1098">122-testing-blocks-with-rspec.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-8095a859c01f2ffb64c65c2afbb4db5c79da384c</guid>
      <pubDate>Mon, 05 Aug 2013 19:03:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1097/122-testing-blocks-with-rspec.mp4" length="36179609" type="video/mp4"/>
      <itunes:subtitle>Test that a method calls a block with RSpec matchers</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[121 Testing Blocks]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=263</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode answers the question: how do you test that a block passed to a method is executed as intended?</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1050">121-testing-blocks.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1051">121-testing-blocks.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=1052">121-testing-blocks.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-023a62e1e05486c411319d31a65584982ef2fbf7</guid>
      <pubDate>Thu, 01 Aug 2013 16:28:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/1051/121-testing-blocks.mp4" length="27249355" type="video/mp4"/>
      <itunes:subtitle>Testing that a block is called</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[120 Outside-In]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=258</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode I tackle the question of how many tests are enough. I'll show how for me, it's all about how long it's been since I last got new information from a test.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=946">120-outside-in.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=947">hostconfig</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=948">hostconfig_spec.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-2388a51e93b0d526bf95d182aeac114ab948a66e</guid>
      <pubDate>Mon, 29 Jul 2013 11:05:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/946/120-outside-in.mp4" length="66297868" type="video/mp4"/>
      <itunes:subtitle>How many tests are enough?</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[119 Intention Revealing Argument]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=257</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode, we examine the pros and cons of a few of techniques for making boolean flags passed to methods read more meaningully.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=729">119-intent-revealing-argument.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=730">119-intent-revealing-argument.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=731">119-intent-revealing-argument.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-a1d3de228a3a52700640f46f7b0fb3dffcf26e51</guid>
      <pubDate>Thu, 25 Jul 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/730/119-intent-revealing-argument.mp4" length="12565963" type="video/mp4"/>
      <itunes:subtitle>Making boolean flags more readable</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[118 Even and Odd]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=256</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>A small dish today, about some numeric methods I often forget exist.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=725">118-even-and-odd.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=726">118-even-and-odd.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=727">118-even-and-odd.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-b25afd6d5232a963a1c9d170a5b5054cde28fc08</guid>
      <pubDate>Mon, 22 Jul 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/726/118-even-and-odd.mp4" length="6737776" type="video/mp4"/>
      <itunes:subtitle>Making full use of Ruby's numeric interfaces</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[117 Client Session Object]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=255</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In another peek into my ongoing behind-the-scenes work on RubyTapas, today I extract the responsibility for representing a logged-in screen-scraping user-agent session into its own class.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=722">117-client-session-object.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=723">117-client-session-object.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=724">117-client-session-object.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-bd0d9a5836f76506297539220dbcede9441fdc68</guid>
      <pubDate>Thu, 18 Jul 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/723/117-client-session-object.mp4" length="61699634" type="video/mp4"/>
      <itunes:subtitle>Extracting the responsibility for managing a client session</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[116 Extract Command Object]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=252</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's live-recorded episode I show one of the most fundamental refactorings for breaking up a large class into smaller classes.</p>
<p>Since this is a live episode there is no transcript today. The Naught codebase can be found at <a href="http://github.com/avdi/naught">http://github.com/avdi/naught</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=652">116-extract-command-object.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-cd8c9fa90354a3fb8a820c8817af7b3fedd62be4</guid>
      <pubDate>Mon, 15 Jul 2013 10:09:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/652/116-extract-command-object.mp4" length="151068348" type="video/mp4"/>
      <itunes:subtitle>Introducing a fundamental refactoring</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[115 pp]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=249</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this quick live episode I demonstrate a standard library that improves on Kernel#p</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=570">115-pp.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-ed1f8444e7324ddd7f5fcb1b82670314fc4c228e</guid>
      <pubDate>Thu, 11 Jul 2013 17:28:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/570/115-pp.mp4" length="29055935" type="video/mp4"/>
      <itunes:subtitle>An improvement on p</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[114 Null Object]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=248</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode, we encounter a starship in trouble, and a software pattern that helps cleanly disable whole categories of behavior.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=556">114-null-object.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=557">114-null-object.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=558">114-null-object.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-517ebdcd900aef1fb627b510e268b5b0766312ba</guid>
      <pubDate>Mon, 08 Jul 2013 09:12:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/557/114-null-object.mp4" length="21934985" type="video/mp4"/>
      <itunes:subtitle>Something for nothing</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[113 p]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=247</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>We all use 'puts' for debugging at some point. This episode shows why 'p' is a better choice.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=551">113-p.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=554">113-p.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=555">113-p.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-393a580ee3eb22b9d293d03f6063c40ddc6a78b3</guid>
      <pubDate>Thu, 04 Jul 2013 10:58:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/551/113-p.mp4" length="15485469" type="video/mp4"/>
      <itunes:subtitle>Better debugging with p</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[112 Special Case]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=246</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we take a look at the Special Case pattern, and see how it can be used to drastically simplify some typical logic around logged-in and anonymous users.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=536">112-special-case.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=537">112-special-case.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=538">112-special-case.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-73e7ec16a6fd36fa485025da0689ddd53853a372</guid>
      <pubDate>Mon, 01 Jul 2013 10:50:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/537/112-special-case.mp4" length="30727322" type="video/mp4"/>
      <itunes:subtitle>A pattern to help you avoid null checks</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[111 Symbol Placeholder]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=245</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Nobody wants to debug an "undefined method for NilClass" error. Today's episode shows a little trick for making these errors more meaningful.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=533">111-symbol-placeholder.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=534">111-symbol-placeholder.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=535">111-symbol-placeholder.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-c7017f8a590d23c446057fba4982c2de327df590</guid>
      <pubDate>Thu, 27 Jun 2013 09:53:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/534/111-symbol-placeholder.mp4" length="23390496" type="video/mp4"/>
      <itunes:subtitle>A cheap way to improve on nil</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[110 Catch and Throw]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=243</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>A refactoring episode, showing how to replace exceptions-as-flow-control with the "catch" and "throw" methods.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=530">110-catch-and-throw.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=531">110-catch-and-throw.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=532">110-catch-and-throw.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-896112d014236d1a7fea685c5ef56b257ae01a01</guid>
      <pubDate>Mon, 24 Jun 2013 10:53:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/531/110-catch-and-throw.mp4" length="39367234" type="video/mp4"/>
      <itunes:subtitle>Cleanly signaling early termination.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[109 SAX]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=242</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>This episode takes a look at how to use the Nokogiri gem to extract data from large HTML documents without reading the whole document into memory.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=527">109-sax.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=528">109-sax.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=529">109-sax.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9f861cc2f61b720cdf347ad66980f9f3a46d5b90</guid>
      <pubDate>Thu, 20 Jun 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/528/109-sax.mp4" length="47337365" type="video/mp4"/>
      <itunes:subtitle>Efficient XML/HTML processing in Ruby</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[108 The Trouble with nil]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=241</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>This episode explores some of the many ways we can come across a nil value, and why that's a problem.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=520">108-the-trouble-with-nil.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=521">108-the-trouble-with-nil.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=522">108-the-trouble-with-nil.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-14d94c350aef7d4289733c8e465946aadbacdad4</guid>
      <pubDate>Mon, 17 Jun 2013 09:10:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/521/108-the-trouble-with-nil.mp4" length="23247082" type="video/mp4"/>
      <itunes:subtitle>nil is nobody's friend</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[107 String Subscript Assignment]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=240</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode: super-powered string-munging with regexes and the square-bracket operator.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=517">107-string-subscript-assignment.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=518">107-string-subscript-assignment.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=519">107-string-subscript-assignment.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-682990fcd3ae769be185826bf839d0a949013a91</guid>
      <pubDate>Thu, 13 Jun 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/518/107-string-subscript-assignment.mp4" length="8956560" type="video/mp4"/>
      <itunes:subtitle>Flipping the "more awesome" switch on strings.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[106 Class Accessors]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=239</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today, some thoughts on writing class-level attribute accessors.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=509">106-class-accessors.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=510">106-class-accessors.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=511">106-class-accessors.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-395add83752da27b9b57117498ca86776bd59788</guid>
      <pubDate>Mon, 10 Jun 2013 12:01:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/510/106-class-accessors.mp4" length="9357703" type="video/mp4"/>
      <itunes:subtitle>Some thoughts on writing class-level attribute accessors</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[105 Checking for a Terminal]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=238</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we'll mimic the behavior of command-line tools like Git that automatically page their output if they detect that they are being run from a terminal.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=503">105-tty.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=504">105-tty.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=505">105-tty.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-f611f249d4e6be60ac8cd798d2142f6fc8588345</guid>
      <pubDate>Thu, 06 Jun 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/504/105-tty.mp4" length="18498644" type="video/mp4"/>
      <itunes:subtitle>How to tell if a program is being executed at the console</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[104 Parsing Time]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=237</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>It would be great if time were always represented in readable, un-ambiguous ISO8601 formats. But &nbsp;when importing legacy data we don't often have that luxury. In this episode, we look at some tools for parsing various time and date representations.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=499">104-parsing-time.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=501">104-parsing-time.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=502">104-parsing-time.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-a4ae297ee9ef49a95a894641904a35a9d03ad886</guid>
      <pubDate>Mon, 03 Jun 2013 10:13:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/502/104-parsing-time.mp4" length="25318593" type="video/mp4"/>
      <itunes:subtitle>Parsing time formats, simple and not-so-simple</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[103 Gem-Love Part 11]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=234</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Finishing up my list of TODO items, today I address some structural coupling that my test stubs have revealed.</p>
<p>This is a live episode, so no script today.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=497">103-gem-love-11.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-50012ca14dc68dfdf487252cb75b8fc2e6303d0a</guid>
      <pubDate>Thu, 30 May 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/497/103-gem-love-11.mp4" length="59107091" type="video/mp4"/>
      <itunes:subtitle>Addressing structural coupling in the Endorsement class</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[102 Gem-Love Part 10]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=233</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p><em><strong>Note:</strong>&nbsp;This week RubyTapas moves to its new release schedule of two episodes a week. I've already sent out an update detailing the reason for the change, but for those who have disabled email updates, I've also added a note to the FAQ here:&nbsp;<a href="http://www.rubytapas.com/faq#frequency-change">http://www.rubytapas.com/faq#frequency-change</a></em></p>
<p>Working through my TODO list from the recent feature additions, in today's episode I seek to resolve the semantic conflict between User and GemUser through refactoring.</p>
<p>This is a live episode, so no script today.</p>
<p>Code here:&nbsp;<a href="https://github.com/avdi/gem-love/tree/rubytapas-episode-102">https://github.com/avdi/gem-love/tree/rubytapas-episode-102</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=496">102-gem-love-10.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-8584e25f46fe0b72784fd41f145a9708dea4c972</guid>
      <pubDate>Mon, 27 May 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/496/102-gem-love-10.mp4" length="33289731" type="video/mp4"/>
      <itunes:subtitle>Refactoring the GemUser class</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[101 Intention Revealing Message]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=211</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Not all refactoring is about eliminating duplication. In today's episode we'll refactor some code for the purpose of revealing intent to future readers.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=483">101-intention-revealing-message.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=484">101-intention-revealing-message.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=485">101-intention-revealing-message.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-3dcf247d389eef3f58afbfc0dc451f0f9129885f</guid>
      <pubDate>Fri, 24 May 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/484/101-intention-revealing-message.mp4" length="32482300" type="video/mp4"/>
      <itunes:subtitle>Refactoring for readability</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[100 Screen-Scraping Gateway]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=210</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today's episode tackles the problem of talking to a web app which has no published API, using the Mechanize screen-scraping gem. In the process, we'll explore the Gateway pattern for encapsulating external resources.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=478">100-screen-scraping-gateway.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=479">100-screen-scraping-gateway.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=480">100-screen-scraping-gateway.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=481">content_post_gateway_spec.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=482">content_post_gateway.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-d46bdd017dbe03ce0d94dda4ed0a99722c37f50a</guid>
      <pubDate>Wed, 22 May 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/479/100-screen-scraping-gateway.mp4" length="78059142" type="video/mp4"/>
      <itunes:subtitle>Encapsulating external resources</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[099 String Subscript Regex]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=208</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today the focus is on a convenient way to extract substrings using regular expressions. We glossed over this technique briefly in an earlier episode, but now it's front and center.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=474">099-string-subscript-regex.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=475">099-string-subscript-regex.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=476">099-string-subscript-regex.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-f08ee5119333a8be5294e58156b7b14964b0435a</guid>
      <pubDate>Mon, 20 May 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/475/099-string-subscript-regex.mp4" length="4661081" type="video/mp4"/>
      <itunes:subtitle>Extracting substrings with regular expressions</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[098 Gem-Love Part 9]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=205</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's concluding slice of this live-coding session, I wrap up my work on adding users to Gem-Love by TDDing the server side support for API keys.</p>
<p>This is a live episode, so no script today.</p>
<p>Source:&nbsp;<a href="https://github.com/avdi/gem-love/tree/rubytapas-095">https://github.com/avdi/gem-love/tree/rubytapas-095</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=472">098-gem-love-9.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-68c25db3852e31f2b7e40869a46e939900b5cf91</guid>
      <pubDate>Fri, 17 May 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/472/098-gem-love-9.mp4" length="75231696" type="video/mp4"/>
      <itunes:subtitle>Server-side auth token support</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[097 Gem-Love 8]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=204</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>As I continue to add the concepts of users to Gem-Love, I tackle the problem of making the client side auth-token aware.</p>
<p>This is a live episode, so there is no script today.</p>
<p>Source:&nbsp;<a href="https://github.com/avdi/gem-love/tree/rubytapas-095">https://github.com/avdi/gem-love/tree/rubytapas-095</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=471">097-gem-love-8.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-a88b288195ec73b9aa84997023ec2f64bcc13588</guid>
      <pubDate>Wed, 15 May 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/471/097-gem-love-8.mp4" length="57372224" type="video/mp4"/>
      <itunes:subtitle>Building client-side support for auth tokens</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[096 Gem-Love 7]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=203</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this continuation of episode 95, I finish writing new acceptance test helpers, and get to my first proper test failure.</p>
<p>This is a live episode, so no script today.</p>
<p>Source here:&nbsp;<a href="https://github.com/avdi/gem-love/tree/rubytapas-095">https://github.com/avdi/gem-love/tree/rubytapas-095</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=470">096-gem-love-7.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-3c6b48a8155a94d70564e33e8de165048eb6f4e0</guid>
      <pubDate>Mon, 13 May 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/470/096-gem-love-7.mp4" length="42353960" type="video/mp4"/>
      <itunes:subtitle>More acceptance test helpers</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[095 Gem-Love Part 6]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=198</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Diving back into my Gem-Love project, today I begin the process of adding users to the system. Because this is a larger feature, it will be split across multiple episodes. However, since they are all parts of the same programming session, I'll be running them back-to-back to preserve continuity.</p>
<p>This episode was cut from a live recording, so there is no script available.</p>
<p>The code can be found here:&nbsp;<a href="https://github.com/avdi/gem-love/tree/rubytapas-095">https://github.com/avdi/gem-love/tree/rubytapas-095</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=506">095-gem-love-6.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-fe4eb328f1e517162477045804b70aaa79c35d95</guid>
      <pubDate>Fri, 10 May 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/506/095-gem-love-6.mp4" length="56705910" type="video/mp4"/>
      <itunes:subtitle>Adding users to a client/server app</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[094 Bang Bang]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=197</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Have you ever found yourself looking for a '#to_bool' method in Ruby? This episode explores why boolean conversion isn't needed as often as you might think; as well as how to accomplish it when it IS called for.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=463">094-bang-bang.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=464">094-bang-bang.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=465">094-bang-bang.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-73d319c58040c5b0120ea48183dd1a22d453e5c9</guid>
      <pubDate>Wed, 08 May 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/464/094-bang-bang.mp4" length="32704689" type="video/mp4"/>
      <itunes:subtitle>Converting arbitrary values to booleans</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[093 Boolean]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=196</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>A common question on Ruby forums and mailing lists is: "why is there no Boolean data type?". This episode attempts to answer that question.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=460">093-boolean.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=461">093-boolean.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=462">093-boolean.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-a724bd6408235ac38fe0dbfcc29b83994d63443c</guid>
      <pubDate>Mon, 06 May 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/461/093-boolean.mp4" length="23346900" type="video/mp4"/>
      <itunes:subtitle>Why Ruby has no Boolean type</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[092 Coincidental Duplication Redux]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=185</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Katrina Owen contributed an example of coincidental duplication I liked so much I decided to make a second episode about it. Enjoy!</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=445">092-coincidental-duplication-redux.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=446">092-coincidental-duplication-redux.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=447">092-coincidental-duplication-redux.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-5b84a418456992f342a46fe896aa2835b09bd7f4</guid>
      <pubDate>Fri, 03 May 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/446/092-coincidental-duplication-redux.mp4" length="21645987" type="video/mp4"/>
      <itunes:subtitle>Another example of over-DRYing code</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[091 Ruby 2.0: Rebinding Methods]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=184</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this, the first (but far from the last!) RubyTapas episode to focus on a Ruby 2.0 feature, we look at the implications of Ruby's newly relaxed rules for binding method objects to objects.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=442">091-ruby-2-rebinding-methods.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=443">091-ruby-2-rebinding-methods.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=444">091-ruby-2-rebinding-methods.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-6d3a819ae521e9330e2e3513929ae39fe2e7bce2</guid>
      <pubDate>Wed, 01 May 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/443/091-ruby-2-rebinding-methods.mp4" length="53863812" type="video/mp4"/>
      <itunes:subtitle>Temporarily adding methods to objects</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[090 class &lt;&lt; self]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=182</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Ruby gives as a number of options when it comes to defining class methods. This episode starts by demonstrating three of them, and then gets a bit opinionated.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=430">090-class-self.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=431">090-class-self.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=432">090-class-self.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-634a821f59b6de6261682efb3aa9d197e945e7fa</guid>
      <pubDate>Sun, 28 Apr 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/431/090-class-self.mp4" length="17523570" type="video/mp4"/>
      <itunes:subtitle>What's the best way to define class methods?</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[089 Coincidental Duplication]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=181</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>The DRY principle teaches us to get rid of duplication wherever we find it. But not all duplication is created equal...</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=433">089-coincidental-duplication.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=434">089-coincidental-duplication.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=435">089-coincidental-duplication.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-c0f31018d214f1e7af311f2b21a239820d658add</guid>
      <pubDate>Fri, 26 Apr 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/434/089-coincidental-duplication.mp4" length="29824778" type="video/mp4"/>
      <itunes:subtitle>Can code be too DRY?</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[088 Gem-Love Part 5]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=180</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this continuation of the Gem-Love project, I complete the end-to-end acceptance test, verifying that the client can talk to the server.</p>
<p>Source code here:&nbsp;<a href="https://github.com/avdi/gem-love/tree/rubytapas-088">https://github.com/avdi/gem-love/tree/rubytapas-088</a></p>
<p>Just a reminder, I'm collecting feedback so I can make RubyTapas even better! If you want your voice to be heard, fill out the survey:&nbsp;<a href="http://shiprise.wufoo.com/forms/r7x2q5/">http://shiprise.wufoo.com/forms/r7x2q5/</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=425">088-gem-love-5.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=426">088-gem-love-5.html</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-f67ca2ecd81c65e6d38400c624b7e0dee6eade92</guid>
      <pubDate>Wed, 24 Apr 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/425/088-gem-love-5.mp4" length="21256933" type="video/mp4"/>
      <itunes:subtitle>Integration client against server</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[087 Naming: Head Count]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=179</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Naming things is hard, and it's difficult to come up with hard-and-fast rules for it. But it can be helpful to learn from examples of real-world naming decisions that led to beneficial design changes. In this episode, we'll look at a method name change that clarified object responsibilities in a program dealing with live events.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=422">087-naming-things-headcount.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=423">087-naming-things-headcount.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=424">087-naming-things-headcount.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-2e89317b104a5c5d70140fdbd67065526dca00b2</guid>
      <pubDate>Mon, 22 Apr 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/423/087-naming-things-headcount.mp4" length="30829290" type="video/mp4"/>
      <itunes:subtitle>Renaming a method, for great justice</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[086 Naked Splat]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=178</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we tackle how to override base class methods while cleanly passing through multiple base-class arguments.</p>
<p>Notes:</p>
<ul>
<li>Paul Battley on <a href="http://po-ru.com/diary/destructuring-assignment-in-ruby/">Destructuring Assignment in Ruby</a></li>
</ul>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=419">086-naked-splat.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=420">086-naked-splat.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=421">086-naked-splat.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9109930112eb1ba7eadc0f2019eb7d6f42adc9bb</guid>
      <pubDate>Fri, 19 Apr 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/421/086-naked-splat.mp4" length="14480986" type="video/mp4"/>
      <itunes:subtitle>Ignoring many arguments</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[085 Ignore Arguments]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=177</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Sometimes a block or method may receive arguments that you just don't care about. This episode introduces the idiomatic Ruby way to indicate that certain arguments should be ignored.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=416">085-ignore-arguments.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=417">085-ignore-arguments.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=418">085-ignore-arguments.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9ee8bd40538092def429602944acf4e196044389</guid>
      <pubDate>Wed, 17 Apr 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/418/085-ignore-arguments.mp4" length="16470631" type="video/mp4"/>
      <itunes:subtitle>Some arguments are more interesting than others</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[084 Splat Group]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=176</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Today we take a look at a related feature to Ruby's "splat" operator: the ability to recursively destructure arrays using grouped assignment.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=413">084-splat-group.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=414">084-splat-group.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=415">084-splat-group.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-7806cd5b0701651c5881286d5ef3ac4c54c41a58</guid>
      <pubDate>Mon, 15 Apr 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/415/084-splat-group.mp4" length="18229710" type="video/mp4"/>
      <itunes:subtitle>Pulling values out of nested arrays</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[083 Custom Splat]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=172</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In today's episode we discover how to make an arbitrary object implicitly "splat"-able.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=409">083-custom-splat.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=410">083-custom-splat.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=411">083-custom-splat.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-701acce5f846152bcdd9a623ae7330f26375fc36</guid>
      <pubDate>Fri, 12 Apr 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/409/083-custom-splat.mp4" length="21647614" type="video/mp4"/>
      <itunes:subtitle>Making arbitrary objects splattable</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[082 Inline Assignment]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=171</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>It's a small thing, but judicious use of inline assignment can make code more DRY and concise. In this episode we look at how to do it, and when.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=406">082-inline-assignment.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=407">082-inline-assignment.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=408">082-inline-assignment.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-44c663f403d44b29e9c93287e68ef3c9aaa98e08</guid>
      <pubDate>Wed, 10 Apr 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/407/082-inline-assignment.mp4" length="16268528" type="video/mp4"/>
      <itunes:subtitle>To assign inline is sometimes divine</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[081 Implicit Splat]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=169</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Delving further into Ruby's destructuring assignment, or "splat", mechanism, today we look at some cases where Ruby performs splatting without an explicit '*' operator.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=401">081-implicit-splat.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=402">081-implicit-splat.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=403">081-implicit-splat.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-e3cee3be5a344a86c6339dd6ffce43ea1e81bc88</guid>
      <pubDate>Mon, 08 Apr 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/402/081-implicit-splat.mp4" length="23209364" type="video/mp4"/>
      <itunes:subtitle>Splatting without the splat</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[080 Splat Basics]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=168</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Ruby supports a limited form of destructuring assignment, in the form of the "splat" operator. In today's episode we go over splat basics, in order to lay a foundation for more advanced splatting techniques to come.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=398">080-splat-basics.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=399">080-splat-basics.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=400">080-splat-basics.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-208821d167fae5fc59cff742c7393668c9dc8603</guid>
      <pubDate>Fri, 05 Apr 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/399/080-splat-basics.mp4" length="33262279" type="video/mp4"/>
      <itunes:subtitle>Splatting out collections, and slurping them back up</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[079 Concat]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=167</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>There is more than one way to concatenate arrays, but not all ways are created equal. In this episode we'll compare three approaches in terms of both semantics and efficiency.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=395">079-concat.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=396">079-concat.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=397">079-concat.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-4cd280308ca7e64a9f7c03faf4ebc524d0e3214d</guid>
      <pubDate>Wed, 03 Apr 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/396/079-concat.mp4" length="21803485" type="video/mp4"/>
      <itunes:subtitle>Appending arrays to other arrays</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[078b Java Dregs: Double Brace Initialization]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=183</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>We all know Java is the best programming lanagueg out there, but maybe you've seen the literal syntax some lesser languages have for initializing data structures like arrays and maps. In this episode we'll look at a technique for concisely initializing Java data structures with values.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=438">078b-java-dregs.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=439">078-java-dregs.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=440">Cafe1.java</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=441">Cafe2.java</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-b3f0f611592fb3d7fea31d8c78f16b8452d9e09b</guid>
      <pubDate>Mon, 01 Apr 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/438/078b-java-dregs.mp4" length="17004891" type="video/mp4"/>
      <itunes:subtitle>Concisely initializing data structures in Java</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[078 Tail Part 7: Cooperating Objects]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=166</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In a final refactoring to our pseudo-tail(1), we use an enumerator to encapsulate the process of searching text chunks for newlines.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=392">078-tail-7-cooperating-objects.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=393">078-tail-7-cooperating-objects.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=394">078-tail-7-cooperating-objects.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-add8dcd3bbdb9b1f5b1e7ed467b8d949ef7d23d2</guid>
      <pubDate>Fri, 29 Mar 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/393/078-tail-7-cooperating-objects.mp4" length="33816961" type="video/mp4"/>
      <itunes:subtitle>The return of Enumerator</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[077 Tail Part 6: Process as Object]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=159</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Continuing to refactor our minimal tail(1) implementation, today we clean up a loop by encapsulating its state in a new object.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=381">077-tail-6-process-as-object.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=382">077-tail-6-process-as-object.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=383">077-tail-6-process-as-object.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-26781adbe5c9d2894edf6e7bbc5e2dbb8e06b5aa</guid>
      <pubDate>Wed, 27 Mar 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/383/077-tail-6-process-as-object.mp4" length="19579630" type="video/mp4"/>
      <itunes:subtitle>Representing a process as an object</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[076 Tail Part 5: Idiom]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=158</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>So far, our reimplementation of tail(1) bears a striking resemblance to the style of code we might find in the C implementation of the same utility. In this episode we'll make the code a little more Rubyish by extracting loops into block methods.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=378">076-tail-5-idiom.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=380">076-tail-5-idiom.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=437">076-tail-5-idiom-high.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-01a0e2b96221ca7918e55ae7dc87d65ca8df65e2</guid>
      <pubDate>Mon, 25 Mar 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/437/076-tail-5-idiom-high.mp4" length="51261922" type="video/mp4"/>
      <itunes:subtitle>From C to Ruby, one block at a time.</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[074 Tail Part 3: #rindex]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=155</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>We've figured out how to read chunks of text backwards from a file, now it's time to tackle searching that text for the beginnings of lines.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=344">074-tail-3-rindex.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=345">074-tail-3-rindex.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=346">074-tail-3-rindex.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-90ba8fad69a3a48e0c799e7976cbe481d8ca81d0</guid>
      <pubDate>Wed, 20 Mar 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/346/074-tail-3-rindex.mp4" length="43201107" type="video/mp4"/>
      <itunes:subtitle>Searching backwards in strings</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[075 Tail Part 4: copy_stream]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=157</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Marching right along in our reimplementation of UNIX tail(1), today we tackle the problem of dumping the tail of the file to STDOUT once we've found the starting point.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=376">075-tail-4-copy_stream.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=377">075-tail-4-copy_stream-768kbs.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=436">075-tail-4-copy_stream.html</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-607d4614ad85141c2c3f4186248e18158f8da9bb</guid>
      <pubDate>Wed, 20 Mar 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/377/075-tail-4-copy_stream-768kbs.mp4" length="21799331" type="video/mp4"/>
      <itunes:subtitle>Efficiently channeling data between filehandles</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[073 Tail Part 2: Do-While]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=151</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>As we continue to rewrite a subset of the UNIX tail(1) command, we learn how to write a do...while loop in Ruby.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=341">073-tail-2-do-while.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=342">073-tail-2-do-while.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=343">073-tail-2-do-while.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-7393ef6c5a710e2899305f3f6830daff2fc62ba1</guid>
      <pubDate>Mon, 18 Mar 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/342/073-tail-2-do-while.mp4" length="31798002" type="video/mp4"/>
      <itunes:subtitle>Ruby doesn't have a do-while loop... or does it?</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[072 Tail Part 1: Random Access]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=149</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>This episode kicks off a short miniseries on re-implementing a small subset of the UNIX "tail" command in Ruby. We'll start by learning how to jump around to arbitrary positions in a file.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=336">072-tail-1-random-access.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=338">072-tail-1-random-access.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=339">072-tail-1-random-access.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-a2fbb06ba2347709b576c2c49f3fac010dd5b0e2</guid>
      <pubDate>Fri, 15 Mar 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/338/072-tail-1-random-access.mp4" length="14156338" type="video/mp4"/>
      <itunes:subtitle>Reading files from points other than the beginning</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[071 break with a Value]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=147</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In the second of two episodes about the 'break' keyword, we discover how to override method return values to suit our own needs.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=332">071-break-with-value.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=333">071-break-with-value.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=334">071-break-with-value.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-07b75fa2401b9e11fb58540ed6dfbe81c5773ecb</guid>
      <pubDate>Wed, 13 Mar 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/333/071-break-with-value.mp4" length="23555131" type="video/mp4"/>
      <itunes:subtitle>Overriding method return values with break</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[070 break]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=146</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this, the first of two episodes on the 'break' keyword, we look at how it can be applied beyond breaking out of loops.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=328">070-break.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=330">070-break.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=331">070-break.html</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9d4929804b882799685e82fe563cac3ad7fc237b</guid>
      <pubDate>Mon, 11 Mar 2013 09:00:00 -0400</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/328/070-break.mp4" length="19873492" type="video/mp4"/>
      <itunes:subtitle>The break keyword is for more than just loops</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[069 Gem-Love Part 4]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=145</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>The last Gem-Love episode had me creating a command-line client. This time around, I use Rack and Sinatra to build a simple server.</p>
<p>Source code can be found here:&nbsp;<a href="https://github.com/avdi/gem-love/tree/rubytapas-069">https://github.com/avdi/gem-love/tree/rubytapas-069</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=326">069-gem-love-4.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=327">069-gem-love-4.html</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9fba79d538478986e44ec786f4bac99ca7cd53b4</guid>
      <pubDate>Fri, 08 Mar 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/326/069-gem-love-4.mp4" length="22400202" type="video/mp4"/>
      <itunes:subtitle>Creating a Sinatra-based server</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[068 Display Builder]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=140</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In some applications there is a many-to-many relationship between types of objects that may be displayed to users, and formats in which they may be rendered. There may even be multiple display styles within a given format: for instance, a "summary" style and a "detailed" style. In this episode well look at one possible option for decoupling <em>what</em>&nbsp;is being displayed from <em>how</em>&nbsp;it is displayed.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=318">068-display-builder.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=319">068-display-builder.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=320">068-display-builder.zip</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-0bf68eec152306a59ce0f3db2d968257f37d689e</guid>
      <pubDate>Wed, 06 Mar 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/318/068-display-builder.mp4" length="54750169" type="video/mp4"/>
      <itunes:subtitle>Decoupling what is displayed from how</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[067 Moneta]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=144</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In the last episode we gave a class the ability to cache HTTP responses in a Hash or something that behaves like a Hash. Now we'll introduce the Moneta gem, a library that abstracts many different key-value stores behind a uniform, Hash-like interface.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=322">067-moneta.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=323">067-moneta.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=324">067-moneta.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-80a24b3b8107df28c3c2a06a11e539c411b232b0</guid>
      <pubDate>Mon, 04 Mar 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/323/067-moneta.mp4" length="12948648" type="video/mp4"/>
      <itunes:subtitle>Pluggable cache backends</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[066 Caching an API]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=139</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Web services are slow to request and often have rate caps. A cache can cut down on requests to remote APIs. But how best to design the interface between the code that uses an API, and the caching layer? In this episode we'll explore that question.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=315">066-caching-an-api.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=316">066-caching-an-api.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=317">066-caching-an-api.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-b6e32891120fefa23356d574ef0dd778d21479d5</guid>
      <pubDate>Fri, 01 Mar 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/316/066-caching-an-api.mp4" length="90341870" type="video/mp4"/>
      <itunes:subtitle>Caching the results of web service requests</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[065 PulseFFI Part 7]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=138</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>This is the culmination of the last few PulseFFI episodes. I'll add some insurance to the high-level PulseFFI.mainloop method, and then make use of it in the proof-of-concept script. Finally, I'll discuss some of my philosophy for building library APIs.</p>
<p>Browse the source code here:&nbsp;<a href="https://github.com/avdi/pulse-ffi/tree/rubytapas-065">https://github.com/avdi/pulse-ffi/tree/rubytapas-065</a></p>
<p>Sorry, no transcript for this live-recorded episode.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=314">065-ffi-7.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-158461b263d469ef6c0835bf22ac3f9a1df2801f</guid>
      <pubDate>Wed, 27 Feb 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/314/065-ffi-7.mp4" length="106936838" type="video/mp4"/>
      <itunes:subtitle>Wrapping up the PulseFFI.mainloop method</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[064 Yield or Enumerate]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=137</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>A number of Ruby standard library methods return an Enumerator if no block is passed to them. In this episode, we'll learn how to emulate this behavior in our own methods.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=311">064-yield-or-enumerate.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=312">064-yield-or-enumerate.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=313">064-yield-or-enumerate.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-a4fc7c30d5362f2c35988031eee0548e0d7fe41c</guid>
      <pubDate>Mon, 25 Feb 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/312/064-yield-or-enumerate.mp4" length="10296287" type="video/mp4"/>
      <itunes:subtitle>Making iterative methods more flexible</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[063 Gem-Love Part 3]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=136</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Returning to my Gem-Love project in this episode, I use TDD to drive out a client-side implementation for the first feature. In the process, I talk about message-first design.</p>
<p>Check out the source here:&nbsp;<a href="https://github.com/avdi/gem-love/tree/rubytapas-063">https://github.com/avdi/gem-love/tree/rubytapas-063</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=309">063-gem-love-3.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=310">063-gem-love-3.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-ac8346ea71f6889985ef19c1eb79e5af52f0afd3</guid>
      <pubDate>Fri, 22 Feb 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/310/063-gem-love-3.mp4" length="53544281" type="video/mp4"/>
      <itunes:subtitle>Implementing the first feature</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[062 Fiber]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=135</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode we'll explore Ruby's lightweight concurrency primitive by using it to emulate the Enumerator class.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=306">062-fiber.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=307">062-fiber.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=308">062-fiber.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-168c76fd7441959ad2e0a3e797a4a8ca47505efe</guid>
      <pubDate>Wed, 20 Feb 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/307/062-fiber.mp4" length="51955030" type="video/mp4"/>
      <itunes:subtitle>Rebuilding Enumerator with Ruby's Fibers</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[061 PulseFFI Part 6]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=134</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Continuing in my extraction of a high-level API for the PulseFFI library, in this episode I test-drive the Mainloop.run, a composed method that brings together the work I've done so far.</p>
<p>Browse the source code here:&nbsp;<a href="https://github.com/avdi/pulse-ffi/tree/rubytapas-061">https://github.com/avdi/pulse-ffi/tree/rubytapas-061</a></p>
<p>Sorry, no transcript for this live-recorded episode.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=305">061-ffi-6.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-0009ddedd5ab01bb56900a780df61249e65e1d9e</guid>
      <pubDate>Mon, 18 Feb 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/305/061-ffi-6.mp4" length="88534465" type="video/mp4"/>
      <itunes:subtitle>Tying together the PulseFFI::Mainloop class</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[060 Ascend]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=133</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Now that we've been formally introduced to the Enumerator class, it's time to apply that knowledge in a concrete way. In this episode we use Pathname and Enumerator to locate a project-wide econfiguration file.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=302">060-ascend.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=303">060-ascend.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=304">060-ascend.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-9ecbcfa32c265d69e62779e1f332fa8f567a7d42</guid>
      <pubDate>Fri, 15 Feb 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/303/060-ascend.mp4" length="13853116" type="video/mp4"/>
      <itunes:subtitle>Searching directory ancestors with Pathname and Enumerator</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[059 Enumerator]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=132</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In previous episodes we've touched on Enumerator in passing. This time it'll take center stage, as we explore just what an Enumerator is and what it's good for.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=299">059-enumerator.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=300">059-enumerator.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=301">059-enumerator.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-20d31f438b46a88cdb8fbb077c29fb9065d11b96</guid>
      <pubDate>Wed, 13 Feb 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/300/059-enumerator.mp4" length="40092914" type="video/mp4"/>
      <itunes:subtitle>An intro to the Enumerator class</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[058 ARGF]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=131</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>This episode explores ARGF, a powerful object for working with input files in command-line programs.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=296">058-argf.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=297">058-argf.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=298">058-argf.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-de334c2d9fcbe0d4e523ee688f745893810163bf</guid>
      <pubDate>Mon, 11 Feb 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/297/058-argf.mp4" length="21796177" type="video/mp4"/>
      <itunes:subtitle>Easily work with command-line input files</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[057 PulseFFI Part 5]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=130</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this episode I continue to felsh out the high-level API for my PulseFFI library, using TDD and mock objects to define how the object model interacts with the C bindings layer. I also compare the MiniTest and RSpec mocking/stubbing libraries.</p>
<p>Browse the source for this episode at:&nbsp;https://github.com/avdi/pulse-ffi/tree/rubytapas-057</p>
<p>Sorry, no transcript for this live-recorded episode.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=295">057-ffi-5.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-e7462bafbdfaf370e4e679fb895ab51b94ac91ec</guid>
      <pubDate>Fri, 08 Feb 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/295/057-ffi-5.mp4" length="94530395" type="video/mp4"/>
      <itunes:subtitle>TDDing the PulseFFI API</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[056 xmpfilter]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=129</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this, the most requested RubyTapas episode ever, we'll take a look at xmpfilter, the program I use to evaluate Ruby expressions from within my editor.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=292">056-xmpfilter.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=293">056-xmpfilter.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=294">056-xmpfilter.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-5c274a7c86342ed6c1b5bcb997350c4d8fbd9ddb</guid>
      <pubDate>Wed, 06 Feb 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/293/056-xmpfilter.mp4" length="35061110" type="video/mp4"/>
      <itunes:subtitle>Evaluating Ruby code from the comfort of your editor</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[055 Runnable Library]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=128</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>It's a library! No, it's an executable! Relax, your Ruby files can be both require-able libraries <em>and</em>&nbsp;executables!</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=289">055-runnable-library.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=290">055-runnable-library.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=291">055-runnable-library.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-401ec9576c108e2540c2663ac714888036e0abff</guid>
      <pubDate>Mon, 04 Feb 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/289/055-runnable-library.mp4" length="41831204" type="video/mp4"/>
      <itunes:subtitle>Making libraries double as executables</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[054 PulseFFI Part 4]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=127</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this edition of a miniseries on building a wrapper library using FFI, I begin to sketch out a higher-level API for starting up a PulseAudio mainloop.</p>
<p>Source code here:&nbsp;<a href="https://github.com/avdi/pulse-ffi/tree/rubytapas-054">https://github.com/avdi/pulse-ffi/tree/rubytapas-054</a></p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=325">054-ffi-4.mp4</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-beb8343869177ba4b797e57568cb15ea5c7bff76</guid>
      <pubDate>Fri, 01 Feb 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/325/054-ffi-4.mp4" length="65000795" type="video/mp4"/>
      <itunes:subtitle>Sketching out a higher level API</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[053 Selectively Run Tests]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=126</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>Selectively running tests can be a lifesaver in a large codebase. This episode covers how to run just the tests you care about in both MiniTest and RSpec - including how to slectively run tests under Rake.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=284">053-selectively-run-tests.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=285">053-selectively-run-tests.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=286">arithmetic_spec.rb</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=287">arithmetic_test.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-509ccdfeab8e6c49bf86a6e35914e297ca6a754f</guid>
      <pubDate>Wed, 30 Jan 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/285/053-selectively-run-tests.mp4" length="57473152" type="video/mp4"/>
      <itunes:subtitle>Running just the tests you care about</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[052 The End of Mocking]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=125</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>At the borders of our systems, mockist testing hits a point of diminishing returns. In this episode we take a look at when to stop mocking and start integration testing.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=281">052-the-end-of-mocking.html</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=282">052-the-end-of-mocking.mp4</a></li>
<li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=283">052-the-end-of-mocking.rb</a></li>
</ul></div>]]></description>
      <guid isPermaLink="false">dpd-e4bd3090f74ad373eaf12ec5eba21bb3cb37c4eb</guid>
      <pubDate>Mon, 28 Jan 2013 09:00:00 -0500</pubDate>
      <enclosure url="https://rubytapas.dpdcart.com/feed/download/282/052-the-end-of-mocking.mp4" length="97700871" type="video/mp4"/>
      <itunes:subtitle>Mock objects and the point of diminishing returns</itunes:subtitle>
      <itunes:image href="https://getdpd.com/uploads/ruby-tapas.png"/>
    </item>
    <item>
      <title><![CDATA[051 PulseFFI Part 3]]></title>
      <link>https://rubytapas.dpdcart.com/subscriber/post?id=124</link>
      <description><![CDATA[<div class="blog-entry">
          <div class="blog-content"><p>In this "live-style" episode, I begin to transition the PulseFFI proof-of-concept script into a Ruby library, using my smoke test to ensure everything continues to work.</p>
<p>Browse the source code here:&nbsp;https://github.com/avdi/pulse-ffi/tree/rubytapas-051</p>
<p>Sorry, no transcript for this live recording.</p>
          </div>
          <h3>Attached Files</h3>
          <ul>
          <li><a href="https://rubytapas.dpdcart.com/subscriber/download?file_id=280">05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment