<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Virtuous Code</title>
	
	<link>http://devblog.avdi.org</link>
	<description>"The three virtues of a programmer: laziness, impatience, and hubris" -- Larry Wall</description>
	<lastBuildDate>Thu, 23 May 2013 18:31:20 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/VirtuousCode" /><feedburner:info uri="virtuouscode" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>VirtuousCode</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>“Confident Ruby” now in Beta!</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/X-WJaiLB4OY/</link>
		<comments>http://devblog.avdi.org/2013/05/19/confident-ruby-now-in-beta/#comments</comments>
		<pubDate>Sun, 19 May 2013 17:37:31 +0000</pubDate>
		<dc:creator>Avdi Grimm</dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Books]]></category>

		<guid isPermaLink="false">http://devblog.avdi.org/?p=7600</guid>
		<description><![CDATA[Hey, remember when I said I&#8217;d finish Confident Ruby by September 1, 2012? Ha ha! That was a funny joke! Seriously though, this book has taken much longer than intended, partly as the scope grew, but mostly because of other &#8230; <a href="http://devblog.avdi.org/2013/05/19/confident-ruby-now-in-beta/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="https://shiprise.dpdcart.com/cart/add?product_id=39130&amp;method_id=39361"><img class=" wp-image-7625 alignright" alt="Confident Ruby 3D" src="http://devblog.avdi.org/wp-content/uploads/2013/05/paperbackbookstanding.png" width="174" height="230" /></a>Hey, remember when <a href="http://devblog.avdi.org/2012/06/05/confident-ruby-beta/">I said I&#8217;d finish Confident Ruby by September 1, 2012</a>? Ha ha! That was a funny joke!</p>
<p>Seriously though, this book has taken much longer than intended, partly as the scope grew, but mostly because of other projects getting in the way. Such as the launch of <a href="http://rubytapas.com">RubyTapas</a>. I&#8217;m hugely appreciative of all the early-access buyers who supported the project and have been patient through this process.</p>
<p>Those early buyers have already heard the news, but now I&#8217;m letting the rest of the world know: as of now, Confident Ruby is finally content-complete and entering a Beta phase. That means that while there is plenty of editing, clean-up, and tweaking to do, all the major content (a little over 150 pages&#8217; worth) is now in place.</p>
<p>I intend to spend one month getting Confident Ruby into shape for a final release. At the end of that month, <strong>I will be raising the price to $35</strong>. Until then, you can still get it for $25. As always, if you don&#8217;t have the scratch you can <a href="mailto:contact@shiprise.net?subject=Confident%20Ruby%20Postcard%20Offer">send me a postcard</a> instead.</p>
<div class="cta "><p class="medium"><a href="https://shiprise.dpdcart.com/cart/add?product_id=39130&amp;method_id=39361">Buy Confident Ruby now!</a></p></div>
<p>Curious about what&#8217;s inside? The nutshell version is that this is a patterns book, focused on the method level of code. It&#8217;s all about how to make methods that are &#8220;confident&#8221;: that is, they tell a clear, straightforward story without a lot of distracting provisos and digressions. In order to get you from &#8220;timid&#8221; code to confident code, I lay out 32 patterns for collecting input, delivering output, and handling failure within a method. There&#8217;s a strong emphasis throughout on removing the scourge of <code>nil</code> values from code, and replacing them with more semantically meaningful constructs.</p>
<p>Here&#8217;s the current table of contents, if you&#8217;re curious:</p>
<ul class="indent">
<li>Introduction
<ul>
<li>Ruby meets the real world</li>
<li>Confident code</li>
<li>A good story, poorly told</li>
<li>Code as narrative</li>
<li>The four parts of a method</li>
<li>3.times { rejoice! }</li>
<li>Collecting Input</li>
</ul>
</li>
<li>Sending a strong message
<ul>
<li>Conditionally call conversion methods</li>
<li>Define your own conversion protocols</li>
<li>Define conversions to user-defined types</li>
<li>Use built-in conversion functions</li>
<li>Use the Array() conversion function to array-ify inputs</li>
<li>Define conversion functions</li>
<li>Replace &#8220;string typing&#8221; with classes</li>
<li>Wrap collaborators in Adapters</li>
<li>Use transparent adapters to gradually introduce abstraction</li>
<li>Reject unworkable values with preconditions</li>
<li>Use #fetch to assert the presence of Hash keys</li>
<li>Document assumptions with assertions</li>
<li>Handle special cases with a Guard Clause</li>
<li>Represent special cases as objects</li>
<li>Represent do-nothing cases as null objects</li>
<li>Substitute a benign value for =nil=</li>
<li>Use #fetch for defaults</li>
<li>Use symbols as placeholder objects</li>
<li>Bundle arguments into parameter objects</li>
<li>Yield a parameter builder object</li>
<li>Receive policies instead of data</li>
</ul>
</li>
<li>Delivering Output
<ul>
<li>Write total functions</li>
<li>Call back instead of returning</li>
<li>Represent failure with a benign value</li>
<li>Represent failure with a special case object</li>
<li>Return a status object</li>
<li>Yield a status object</li>
<li>Signal early termination with =throw=</li>
</ul>
</li>
<li>Handling Failure
<ul>
<li>Prefer top-level rescue clause</li>
<li>Use checked methods for risky operations</li>
<li>Use bouncer methods</li>
</ul>
</li>
<li>Refactoring for Confidence</li>
<ul>
<li>MetricFu</li>
<li>Stringer</li>
<li>Parting Words</li>
</ul>
</ul>
<p>And here&#8217;s a video of the talk that started it all:</p>
<p><a href="http://www.youtube.com/watch?v=T8J0j2xJFgQ">http://www.youtube.com/watch?v=T8J0j2xJFgQ</a></p>
<p>And here&#8217;s that big friendly &#8220;buy now&#8221; button again!</p>
<div class="cta "><p class="medium"><a href="https://shiprise.dpdcart.com/cart/add?product_id=39130&amp;method_id=39361">Buy Confident Ruby now</a></p></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=X-WJaiLB4OY:du98llpX0z0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=X-WJaiLB4OY:du98llpX0z0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=X-WJaiLB4OY:du98llpX0z0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=X-WJaiLB4OY:du98llpX0z0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=X-WJaiLB4OY:du98llpX0z0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=X-WJaiLB4OY:du98llpX0z0:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=X-WJaiLB4OY:du98llpX0z0:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/X-WJaiLB4OY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://devblog.avdi.org/2013/05/19/confident-ruby-now-in-beta/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://devblog.avdi.org/2013/05/19/confident-ruby-now-in-beta/</feedburner:origLink></item>
		<item>
		<title>RubyTapas 100th Episode Giveaway</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/w63lgPzcScI/</link>
		<comments>http://devblog.avdi.org/2013/04/30/rubytapas-100th-episode-giveaway/#comments</comments>
		<pubDate>Tue, 30 Apr 2013 21:00:16 +0000</pubDate>
		<dc:creator>Avdi Grimm</dc:creator>
				<category><![CDATA[Announcements]]></category>

		<guid isPermaLink="false">http://devblog.avdi.org/?p=7579</guid>
		<description><![CDATA[On May 22, the 100th episode of RubyTapas will arrive in subscribers&#8217; inboxes and RSS readers, and I&#8217;m marking the occasion with a great big giveaway! I&#8217;ve got a whole pile of eBooks and other goodies to give out. Check &#8230; <a href="http://devblog.avdi.org/2013/04/30/rubytapas-100th-episode-giveaway/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p dir="ltr">On May 22, the 100th episode of <a href="http://rubytapas.com">RubyTapas</a> will arrive in subscribers&#8217; inboxes and RSS readers, and I&#8217;m marking the occasion with a great big giveaway! I&#8217;ve got a whole pile of eBooks and other goodies to give out. Check out these prizes, and check back later because I may be adding more before I&#8217;m done!</p>
<p dir="ltr"><strong>UPDATE:</strong> This giveaway is now over. Thanks to everyone who entered, and congrats to the winners!</p>
<h2 dir="ltr">Everyone</h2>
<p dir="ltr"><strong>Everyone</strong> who enters will receive a 20% discount for <a href="http://getcloudapp.com/">Cloudapp Pro</a> and 10% discount on all <a href="https://appsignal.com/">AppSignal</a> plans for the first 12 months! Yep, everyone!</p>
<h2 dir="ltr">Grand Prize</h2>
<p dir="ltr">One lucky winner will receive:</p>
<ul>
<li>A full year of RubyTapas!</li>
<li>
<div>Free ticket to <a href="http://www.baruco.org/tickets">Barcelona Ruby Conference</a> (travel/accommodations not included)</div>
</li>
<li>1-year free <a href="https://appsignal.com/">AppSignal</a> Small plan</li>
<li>1-year membership to<a href="http://learnable.com"> learnable.com</a></li>
<li>1-year subscription to <a href="http://store.getcloudapp.com/">CloudApp Pro</a></li>
<li>1-year subscription to <a href="http://railscasts.com/pro">RailsCasts Pro</a></li>
<li>
<div>2-month subscription to <a href="https://learn.thoughtbot.com/products/14-prime">thoughtbot Learn Prime</a></div>
</li>
<li><a href="http://www.sitepoint.com/books/sinatra1/?utm_source=sitepoint&amp;utm_medium=internal&amp;utm_campaign=sinatra">Jump Start Sinatra by Darren Jones</a></li>
<li><a href="http://railsoopbook.com/">Rails As She Is Spoke by Giles Bowkett</a></li>
<li><a href="http://www.upgradingtorails4.com/">Upgrading to Rails 4 by Andy Lindeman</a></li>
<li><a href="http://backboneplugins.com">Prosthetics And Orthotics: Lessons Learned In Building Plugins For Backbone.js by Derick Bailey</a></li>
<li><a href="http://www.noelrappin.com/">Master Space and Time With JavaScript by Noel Rappin</a></li>
<li><a href="http://www.clean-ruby.com/">Clean Ruby by Jim Gay</a></li>
<li>
<div><a href="http://rebuilding-rails.com/">Rebuilding Rails by Noah Gibbs</a></div>
</li>
<li>
<div><a href="http://patshaughnessy.net/ruby-under-a-microscope">Ruby Under a Microscope by Pat Shaughnessy</a></div>
</li>
<li><a href="https://leanpub.com/everydayrailsrspec">Everyday Rails Testing with RSpec by Aaron Sumner</a></li>
<li><a href="http://www.workingwithunixprocesses.com/">Working With Unix Processes by Jesse Storimer</a></li>
<li><a href="http://mobilebbbook.com/">Mobile Web Patterns with Backbone.js by Nick Gauthier</a></li>
<li><a href="http://gittyapp.com">Gitty App for GitHub</a></li>
</ul>
<h2><span class="Apple-style-span">Second Prize</span></h2>
<p>Two winners will receive this package:</p>
<ul>
<li>Six months of RubyTapas!</li>
<li>
<div>Free ticket to <a href="http://www.baruco.org/tickets">Barcelona Ruby Conference</a> (travel/accommodations not included)</div>
</li>
<li>6-month free <a href="https://appsignal.com/">AppSignal</a> Small plan</li>
<li>6-month subscription to <a href="http://store.getcloudapp.com/">CloudApp Pro</a></li>
<li>6-month subscription to <a href="http://railscasts.com/pro">RailsCasts Pro</a></li>
<li><a href="http://www.sitepoint.com/books/sinatra1/?utm_source=sitepoint&amp;utm_medium=internal&amp;utm_campaign=sinatra">Jump Start Sinatra by Darren Jones</a></li>
<li><a href="http://railsoopbook.com/">Rails As She Is Spoke by Giles Bowkett</a></li>
<li><a href="http://www.upgradingtorails4.com/">Upgrading to Rails 4 by Andy Lindeman</a></li>
<li><a href="http://backboneplugins.com">Prosthetics And Orthotics: Lessons Learned In Building Plugins For Backbone.js by Derick Bailey</a></li>
<li><a href="http://www.noelrappin.com/">Master Space and Time With JavaScript by Noel Rappin</a></li>
<li><a href="http://www.clean-ruby.com/">Clean Ruby by Jim Gay</a></li>
<li>
<div><a href="http://rebuilding-rails.com/">Rebuilding Rails by Noah Gibbs</a></div>
</li>
<li>
<div><a href="http://patshaughnessy.net/ruby-under-a-microscope">Ruby Under a Microscope by Pat Shaughnessy</a></div>
</li>
<li><a href="https://leanpub.com/everydayrailsrspec">Everyday Rails Testing with RSpec by Aaron Sumner</a></li>
<li><a href="http://www.workingwithunixprocesses.com/">Working With Unix Processes by Jesse Storimer</a></li>
<li><a href="http://mobilebbbook.com/">Mobile Web Patterns with Backbone.js by Nick Gauthier</a></li>
<li><a href="http://gittyapp.com">Gitty App for GitHub</a></li>
</ul>
<h2>Third Prize</h2>
<p><strong>97</strong> more winners will receive the following prizes:</p>
<ul>
<li>A 3-month <a href="http://getcloudapp.com/">Cloudapp Pro</a> membership</li>
<li>1-month subscription to <a href="http://railscasts.com/pro">RailsCasts Pro</a></li>
<li>25% discount on all <a href="https://appsignal.com/">AppSignal</a> plans for the first 12 months</li>
<li>10% off <a href="http://www.upgradingtorails4.com/">Upgrading to Rails 4 by Andy Lindeman</a></li>
<li>A coupon to get <a href="https://leanpub.com/everydayrailsrspec">Everyday Rails Testing with RSpec by Aaron Sumner</a> for just $8</li>
<li>
<div>10% off <a href="http://www.workingwithunixprocesses.com/">Working With Unix Processes by Jesse Storimer</a></div>
</li>
<li>10% off <a href="http://www.noelrappin.com/">Master Space and Time With JavaScript by Noel Rappin</a></li>
<li>$5.00 off <a href="http://backboneplugins.com">Prosthetics And Orthotics: Lessons Learned In Building Plugins For Backbone.js by Derick Bailey</a></li>
<li>$10.00 off <a href="http://mobilebbbook.com/">Mobile Web Patterns with Backbone.js by Nick Gauthier</a></li>
</ul>
<h2>How to enter</h2>
<p>Just fill out the form below! All entries must be submitted by May 21st at 23:59 UTC. I&#8217;ll announce the winners on this blog on May 22nd.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=w63lgPzcScI:krraVsdkQdw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=w63lgPzcScI:krraVsdkQdw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=w63lgPzcScI:krraVsdkQdw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=w63lgPzcScI:krraVsdkQdw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=w63lgPzcScI:krraVsdkQdw:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=w63lgPzcScI:krraVsdkQdw:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=w63lgPzcScI:krraVsdkQdw:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/w63lgPzcScI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://devblog.avdi.org/2013/04/30/rubytapas-100th-episode-giveaway/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://devblog.avdi.org/2013/04/30/rubytapas-100th-episode-giveaway/</feedburner:origLink></item>
		<item>
		<title>RubyTapas Freebie: The End of Mocking</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/EV7Wo23IEIk/</link>
		<comments>http://devblog.avdi.org/2013/04/22/rubytapas-freebie-the-end-of-mocking/#comments</comments>
		<pubDate>Mon, 22 Apr 2013 19:32:32 +0000</pubDate>
		<dc:creator>Avdi Grimm</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyTapas Samples]]></category>
		<category><![CDATA[Screencasts]]></category>
		<category><![CDATA[mock-objects]]></category>
		<category><![CDATA[mocking]]></category>
		<category><![CDATA[mockobjects]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://devblog.avdi.org/?p=7573</guid>
		<description><![CDATA[At the borders of our systems, mockist testing hits a point of diminishing returns. In this free episode we take a look at when to stop mocking and start integration testing.]]></description>
				<content:encoded><![CDATA[<p>At the borders of our systems, mockist testing hits a point of diminishing returns. In this free episode we take a look at when to stop mocking and start integration testing.</p>
<a href="http://fast.wistia.net/embed/iframe/sugrtlbt7s?autoPlay=true&controlsVisibleOnLoad=true&endVideoBehavior=reset&playerColor=707070&plugin%5BpostRoll-v1%5D%5Blink%5D=http%3A%2F%2Frubytapas.com&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BbackgroundColor%5D=%23f92661&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5Bcolor%5D=%23fff&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BfontFamily%5D=Gill%20Sans%2C%20Helvetica%2C%20Arial%2C%20sans-serif&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BfontSize%5D=36px&plugin%5BpostRoll-v1%5D%5Btext%5D=Want%20more%3F%20Subscribe%20to%20RubyTapas%21&plugin%5Bsocialbar-v1%5D%5Bbuttons%5D=email-download-twitter-reddit-googlePlus-facebook&plugin%5Bsocialbar-v1%5D%5BdownloadType%5D=original&plugin%5Bsocialbar-v1%5D%5BshowTweetCount%5D=true&popover=true&version=v1&videoHeight=450&videoWidth=800&volumeControl=true" class="wistia-popover[height=478,playerColor=707070,width=800]"><img src="http://embed.wistia.com/deliveries/b4ba19ddb3fa8944131c3c6a764708f7bef2c93c.jpg?image_play_button=true&image_play_button_color=707070e0&image_crop_resized=450x253" alt="" /></a>
<script charset="ISO-8859-1" src="http://fast.wistia.com/static/popover-v1.js"></script>
<div class="boilerplate">
Like what you see? This is just a taste of <a href="http://rubytapas.com/?utm_source=devblog&utm_medium=article&utm_campaign=sample">RubyTapas</a>! Sign up today to get three videos a week, along with full source code and transcripts.
<div class="cta ">
<p class="small"><a href="https://rubytapas.dpdcart.com/subscriber/add?plan_id=10&amp;plan_term_id=17&utm_source=devblog&utm_medium=article&utm_campaign=sample">Subscribe Now!</a></p>
</div>
Or <a href="http://rubytapas.com">click here to learn more</a>.
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=EV7Wo23IEIk:A135TknFZgI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=EV7Wo23IEIk:A135TknFZgI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=EV7Wo23IEIk:A135TknFZgI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=EV7Wo23IEIk:A135TknFZgI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=EV7Wo23IEIk:A135TknFZgI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=EV7Wo23IEIk:A135TknFZgI:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=EV7Wo23IEIk:A135TknFZgI:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/EV7Wo23IEIk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://devblog.avdi.org/2013/04/22/rubytapas-freebie-the-end-of-mocking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://devblog.avdi.org/2013/04/22/rubytapas-freebie-the-end-of-mocking/</feedburner:origLink></item>
		<item>
		<title>RubyTapas Freebie: Utility Function</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/v3pX_MOQaI4/</link>
		<comments>http://devblog.avdi.org/2013/04/15/7566/#comments</comments>
		<pubDate>Mon, 15 Apr 2013 16:53:01 +0000</pubDate>
		<dc:creator>Avdi Grimm</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyTapas Samples]]></category>
		<category><![CDATA[Screencasts]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://devblog.avdi.org/?p=7566</guid>
		<description><![CDATA[Some functions are useful in many different contexts. In this free episode we&#8217;ll explore some ways to make them available both to library code and to client code of a library.]]></description>
				<content:encoded><![CDATA[<p>Some functions are useful in many different contexts. In this free episode we&#8217;ll explore some ways to make them available both to library code and to client code of a library.</p>
<a href="http://fast.wistia.net/embed/iframe/1l20i3yara?autoPlay=true&controlsVisibleOnLoad=true&endVideoBehavior=reset&playerColor=707070&plugin%5BpostRoll-v1%5D%5Blink%5D=http%3A%2F%2Frubytapas.com&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BbackgroundColor%5D=%23f92661&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5Bcolor%5D=%23fff&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BfontFamily%5D=Gill%20Sans%2C%20Helvetica%2C%20Arial%2C%20sans-serif&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BfontSize%5D=36px&plugin%5BpostRoll-v1%5D%5Btext%5D=Want%20more%3F%20Subscribe%20to%20RubyTapas%21&plugin%5Bsocialbar-v1%5D%5Bbuttons%5D=email-download-twitter-reddit-googlePlus-facebook&plugin%5Bsocialbar-v1%5D%5BdownloadType%5D=original&plugin%5Bsocialbar-v1%5D%5BshowTweetCount%5D=true&popover=true&version=v1&videoHeight=450&videoWidth=800&volumeControl=true" class="wistia-popover[height=478,playerColor=707070,width=800]"><img src="http://embed.wistia.com/deliveries/139a8c62019fa2b3df1e01af053d5c21e36d75fc.jpg?image_play_button=true&image_play_button_color=707070e0&image_crop_resized=450x253" alt="" /></a>
<script charset="ISO-8859-1" src="http://fast.wistia.com/static/popover-v1.js"></script>
<div class="boilerplate">
Like what you see? This is just a taste of <a href="http://rubytapas.com/?utm_source=devblog&utm_medium=article&utm_campaign=sample">RubyTapas</a>! Sign up today to get three videos a week, along with full source code and transcripts.
<div class="cta ">
<p class="small"><a href="https://rubytapas.dpdcart.com/subscriber/add?plan_id=10&amp;plan_term_id=17&utm_source=devblog&utm_medium=article&utm_campaign=sample">Subscribe Now!</a></p>
</div>
Or <a href="http://rubytapas.com">click here to learn more</a>.
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=v3pX_MOQaI4:_NWjmkT4mQg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=v3pX_MOQaI4:_NWjmkT4mQg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=v3pX_MOQaI4:_NWjmkT4mQg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=v3pX_MOQaI4:_NWjmkT4mQg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=v3pX_MOQaI4:_NWjmkT4mQg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=v3pX_MOQaI4:_NWjmkT4mQg:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=v3pX_MOQaI4:_NWjmkT4mQg:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/v3pX_MOQaI4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://devblog.avdi.org/2013/04/15/7566/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://devblog.avdi.org/2013/04/15/7566/</feedburner:origLink></item>
		<item>
		<title>RubyTapas Freebie: Gem Love Part 2</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/gG-HlJJBzzw/</link>
		<comments>http://devblog.avdi.org/2013/04/01/rubytapas-freebie-gem-love-part-2/#comments</comments>
		<pubDate>Mon, 01 Apr 2013 13:00:16 +0000</pubDate>
		<dc:creator>Avdi Grimm</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyTapas Samples]]></category>
		<category><![CDATA[Screencasts]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[datamapper]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://devblog.avdi.org/?p=7558</guid>
		<description><![CDATA[I have a few ongoing miniseries in RubyTapas. In this, the second installment of a miniseries chronicling the creation of a Rubygems plugin and an associated server, I touch on a number of topics including acceptance testing, the shellwords standard &#8230; <a href="http://devblog.avdi.org/2013/04/01/rubytapas-freebie-gem-love-part-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I have a few ongoing miniseries in RubyTapas. In this, the second installment of a miniseries chronicling the creation of a Rubygems plugin and an associated server, I touch on a number of topics including acceptance testing, the <code>shellwords</code> standard library, the TDD rhythm, and the DataMapper ORM.</p>
<a href="http://fast.wistia.net/embed/iframe/xh232o8sie?autoPlay=true&controlsVisibleOnLoad=true&endVideoBehavior=reset&playerColor=707070&plugin%5BpostRoll-v1%5D%5Blink%5D=http%3A%2F%2Frubytapas.com&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BbackgroundColor%5D=%23f92661&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5Bcolor%5D=%23fff&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BfontFamily%5D=Gill%20Sans%2C%20Helvetica%2C%20Arial%2C%20sans-serif&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BfontSize%5D=36px&plugin%5BpostRoll-v1%5D%5Btext%5D=Want%20more%3F%20Subscribe%20to%20RubyTapas%21&plugin%5Bsocialbar-v1%5D%5Bbuttons%5D=email-download-twitter-reddit-googlePlus-facebook&plugin%5Bsocialbar-v1%5D%5BdownloadType%5D=original&plugin%5Bsocialbar-v1%5D%5BshowTweetCount%5D=true&popover=true&version=v1&videoHeight=450&videoWidth=800&volumeControl=true" class="wistia-popover[height=478,playerColor=707070,width=800]"><img src="http://embed.wistia.com/deliveries/2f976c93329ce73d45be797a7fd844bc17c3093f.jpg?image_play_button=true&image_play_button_color=707070e0&image_crop_resized=450x253" alt="" /></a>
<script charset="ISO-8859-1" src="http://fast.wistia.com/static/popover-v1.js"></script>
<div class="boilerplate">
Like what you see? This is just a taste of <a href="http://rubytapas.com/?utm_source=devblog&utm_medium=article&utm_campaign=sample">RubyTapas</a>! Sign up today to get three videos a week, along with full source code and transcripts.
<div class="cta ">
<p class="small"><a href="https://rubytapas.dpdcart.com/subscriber/add?plan_id=10&amp;plan_term_id=17&utm_source=devblog&utm_medium=article&utm_campaign=sample">Subscribe Now!</a></p>
</div>
Or <a href="http://rubytapas.com">click here to learn more</a>.
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=gG-HlJJBzzw:drhmkZQ3JOM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=gG-HlJJBzzw:drhmkZQ3JOM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=gG-HlJJBzzw:drhmkZQ3JOM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=gG-HlJJBzzw:drhmkZQ3JOM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=gG-HlJJBzzw:drhmkZQ3JOM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=gG-HlJJBzzw:drhmkZQ3JOM:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=gG-HlJJBzzw:drhmkZQ3JOM:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/gG-HlJJBzzw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://devblog.avdi.org/2013/04/01/rubytapas-freebie-gem-love-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://devblog.avdi.org/2013/04/01/rubytapas-freebie-gem-love-part-2/</feedburner:origLink></item>
		<item>
		<title>RubyTapas Freebie: Hash Default Value</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/9W6DI-peT9E/</link>
		<comments>http://devblog.avdi.org/2013/03/18/rubytapas-freebie-hash-default-value/#comments</comments>
		<pubDate>Mon, 18 Mar 2013 18:51:48 +0000</pubDate>
		<dc:creator>Avdi Grimm</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyTapas Samples]]></category>
		<category><![CDATA[Screencasts]]></category>

		<guid isPermaLink="false">http://devblog.avdi.org/?p=7551</guid>
		<description><![CDATA[Today&#8217;s cautionary episode demonstrates and explains a Hash gotcha that often comes as a surprise.]]></description>
				<content:encoded><![CDATA[<p>Today&#8217;s cautionary episode demonstrates and explains a Hash gotcha that often comes as a surprise.</p>
<a href="http://fast.wistia.net/embed/iframe/bffuk2vmsx?autoPlay=true&controlsVisibleOnLoad=true&endVideoBehavior=reset&playerColor=707070&plugin%5BpostRoll-v1%5D%5Blink%5D=http%3A%2F%2Frubytapas.com&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BbackgroundColor%5D=%23f92661&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5Bcolor%5D=%23fff&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BfontFamily%5D=Gill%20Sans%2C%20Helvetica%2C%20Arial%2C%20sans-serif&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BfontSize%5D=36px&plugin%5BpostRoll-v1%5D%5Btext%5D=Want%20more%3F%20Subscribe%20to%20RubyTapas%21&plugin%5Bsocialbar-v1%5D%5Bbuttons%5D=email-download-twitter-reddit-googlePlus-facebook&plugin%5Bsocialbar-v1%5D%5BdownloadType%5D=original&plugin%5Bsocialbar-v1%5D%5BshowTweetCount%5D=true&popover=true&version=v1&videoHeight=450&videoWidth=800&volumeControl=true" class="wistia-popover[height=478,playerColor=707070,width=800]"><img src="http://embed.wistia.com/deliveries/5e3cb34729ea323e1e8a0fdaae94065985826932.jpg?image_play_button=true&image_play_button_color=707070e0&image_crop_resized=450x253" alt="" /></a>
<script charset="ISO-8859-1" src="http://fast.wistia.com/static/popover-v1.js"></script>
<div class="boilerplate">
Like what you see? This is just a taste of <a href="http://rubytapas.com/?utm_source=devblog&utm_medium=article&utm_campaign=sample">RubyTapas</a>! Sign up today to get three videos a week, along with full source code and transcripts.
<div class="cta ">
<p class="small"><a href="https://rubytapas.dpdcart.com/subscriber/add?plan_id=10&amp;plan_term_id=17&utm_source=devblog&utm_medium=article&utm_campaign=sample">Subscribe Now!</a></p>
</div>
Or <a href="http://rubytapas.com">click here to learn more</a>.
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=9W6DI-peT9E:0-D6BwGABDM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=9W6DI-peT9E:0-D6BwGABDM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=9W6DI-peT9E:0-D6BwGABDM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=9W6DI-peT9E:0-D6BwGABDM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=9W6DI-peT9E:0-D6BwGABDM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=9W6DI-peT9E:0-D6BwGABDM:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=9W6DI-peT9E:0-D6BwGABDM:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/9W6DI-peT9E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://devblog.avdi.org/2013/03/18/rubytapas-freebie-hash-default-value/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://devblog.avdi.org/2013/03/18/rubytapas-freebie-hash-default-value/</feedburner:origLink></item>
		<item>
		<title>RubyTapas Freebie: Streaming</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/wN29zCF8CrE/</link>
		<comments>http://devblog.avdi.org/2013/03/11/rubytapas-freebie-streaming/#comments</comments>
		<pubDate>Mon, 11 Mar 2013 13:00:28 +0000</pubDate>
		<dc:creator>Avdi Grimm</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyTapas Samples]]></category>
		<category><![CDATA[Screencasts]]></category>

		<guid isPermaLink="false">http://devblog.avdi.org/?p=7546</guid>
		<description><![CDATA[Does code optimized for RAM usage need to be ugly? Find out, in this free episode of RubyTapas.]]></description>
				<content:encoded><![CDATA[<p>Does code optimized for RAM usage need to be ugly? Find out, in this free episode of RubyTapas.</p>
<a href="http://fast.wistia.net/embed/iframe/5p5kuxecoi?autoPlay=true&controlsVisibleOnLoad=true&endVideoBehavior=reset&playerColor=707070&plugin%5BpostRoll-v1%5D%5Blink%5D=https%3A%2F%2Frubytapas.dpdcart.com%2Fsubscriber%2Fadd%3Fplan_id%3D10%26plan_term_id%3D17&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BbackgroundColor%5D=%23f92661&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5Bcolor%5D=%23fff&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BfontFamily%5D=Gill%20Sans%2C%20Helvetica%2C%20Arial%2C%20sans-serif&plugin%5BpostRoll-v1%5D%5Bstyle%5D%5BfontSize%5D=36px&plugin%5BpostRoll-v1%5D%5Btext%5D=Subscribe%20to%20RubyTapas&plugin%5Bsocialbar-v1%5D%5Bbuttons%5D=email-download-twitter-reddit-googlePlus-facebook&plugin%5Bsocialbar-v1%5D%5BdownloadType%5D=original&plugin%5Bsocialbar-v1%5D%5BshowTweetCount%5D=true&popover=true&version=v1&videoHeight=450&videoWidth=800&volumeControl=true" class="wistia-popover[height=478,playerColor=707070,width=800]"><img src="http://embed.wistia.com/deliveries/28e1d1e1653c515c842d3ccb48f8b09f637456a9.jpg?image_play_button=true&image_play_button_color=707070e0&image_crop_resized=450x253" alt="" /></a>
<script charset="ISO-8859-1" src="http://fast.wistia.com/static/popover-v1.js"></script>
<div class="boilerplate">
Like what you see? This is just a taste of <a href="http://rubytapas.com/?utm_source=devblog&utm_medium=article&utm_campaign=sample">RubyTapas</a>! Sign up today to get three videos a week, along with full source code and transcripts.
<div class="cta ">
<p class="small"><a href="https://rubytapas.dpdcart.com/subscriber/add?plan_id=10&amp;plan_term_id=17&utm_source=devblog&utm_medium=article&utm_campaign=sample">Subscribe Now!</a></p>
</div>
Or <a href="http://rubytapas.com">click here to learn more</a>.
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=wN29zCF8CrE:rP2grszlyww:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=wN29zCF8CrE:rP2grszlyww:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=wN29zCF8CrE:rP2grszlyww:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=wN29zCF8CrE:rP2grszlyww:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=wN29zCF8CrE:rP2grszlyww:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=wN29zCF8CrE:rP2grszlyww:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=wN29zCF8CrE:rP2grszlyww:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/wN29zCF8CrE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://devblog.avdi.org/2013/03/11/rubytapas-freebie-streaming/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://devblog.avdi.org/2013/03/11/rubytapas-freebie-streaming/</feedburner:origLink></item>
		<item>
		<title>RubyTapas Freebie: Scanning a String</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/vypqPWV4MeQ/</link>
		<comments>http://devblog.avdi.org/2013/03/04/rubytapas-freebie-scanning-a-string/#comments</comments>
		<pubDate>Mon, 04 Mar 2013 14:00:14 +0000</pubDate>
		<dc:creator>Avdi Grimm</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyTapas Samples]]></category>
		<category><![CDATA[Screencasts]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubytapas]]></category>
		<category><![CDATA[searching]]></category>
		<category><![CDATA[strings]]></category>

		<guid isPermaLink="false">http://devblog.avdi.org/?p=7525</guid>
		<description />
				<content:encoded><![CDATA[<p><iframe width="620" height="349" src="http://www.youtube.com/embed/U4dXfwbWbnU?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<div class="boilerplate">
Like what you see? This is just a taste of <a href="http://rubytapas.com/?utm_source=devblog&utm_medium=article&utm_campaign=sample">RubyTapas</a>! Sign up today to get three videos a week, along with full source code and transcripts.
<div class="cta ">
<p class="small"><a href="https://rubytapas.dpdcart.com/subscriber/add?plan_id=10&amp;plan_term_id=17&utm_source=devblog&utm_medium=article&utm_campaign=sample">Subscribe Now!</a></p>
</div>
Or <a href="http://rubytapas.com">click here to learn more</a>.
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=vypqPWV4MeQ:RYYvH05F6_A:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=vypqPWV4MeQ:RYYvH05F6_A:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=vypqPWV4MeQ:RYYvH05F6_A:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=vypqPWV4MeQ:RYYvH05F6_A:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=vypqPWV4MeQ:RYYvH05F6_A:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=vypqPWV4MeQ:RYYvH05F6_A:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=vypqPWV4MeQ:RYYvH05F6_A:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/vypqPWV4MeQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://devblog.avdi.org/2013/03/04/rubytapas-freebie-scanning-a-string/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://devblog.avdi.org/2013/03/04/rubytapas-freebie-scanning-a-string/</feedburner:origLink></item>
		<item>
		<title>RubyTapas Freebie: Caller-Specified Fallback Handler</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/LTCHpHmentA/</link>
		<comments>http://devblog.avdi.org/2013/02/25/rubytapas-freebie-caller-specified-fallback-handler/#comments</comments>
		<pubDate>Mon, 25 Feb 2013 14:00:04 +0000</pubDate>
		<dc:creator>Avdi Grimm</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyTapas Samples]]></category>
		<category><![CDATA[Screencasts]]></category>

		<guid isPermaLink="false">http://devblog.avdi.org/?p=7513</guid>
		<description><![CDATA[Sometimes it&#8217;s hard to decide how to handle a failure in a method call. Raise an exception? Return a nil? Log an error? The best choice may differ depending on where the method is being called. In today&#8217;s free RubyTapas &#8230; <a href="http://devblog.avdi.org/2013/02/25/rubytapas-freebie-caller-specified-fallback-handler/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Sometimes it&#8217;s hard to decide how to handle a failure in a method call. Raise an exception? Return a nil? Log an error? The best choice may differ depending on where the method is being called. In today&#8217;s free <a href="http://rubytapas.com">RubyTapas</a> episode, we look at a technique for deferring the decision about how to deal with a failure to the point when a method is called.</p>
<p><iframe width="620" height="349" src="http://www.youtube.com/embed/Lb6AFi36n3M?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<div class="boilerplate">
Like what you see? This is just a taste of <a href="http://rubytapas.com/?utm_source=devblog&utm_medium=article&utm_campaign=sample">RubyTapas</a>! Sign up today to get three videos a week, along with full source code and transcripts.
<div class="cta ">
<p class="small"><a href="https://rubytapas.dpdcart.com/subscriber/add?plan_id=10&amp;plan_term_id=17&utm_source=devblog&utm_medium=article&utm_campaign=sample">Subscribe Now!</a></p>
</div>
Or <a href="http://rubytapas.com">click here to learn more</a>.
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=LTCHpHmentA:K_6RRrBL5KA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=LTCHpHmentA:K_6RRrBL5KA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=LTCHpHmentA:K_6RRrBL5KA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=LTCHpHmentA:K_6RRrBL5KA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=LTCHpHmentA:K_6RRrBL5KA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=LTCHpHmentA:K_6RRrBL5KA:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=LTCHpHmentA:K_6RRrBL5KA:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/LTCHpHmentA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://devblog.avdi.org/2013/02/25/rubytapas-freebie-caller-specified-fallback-handler/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://devblog.avdi.org/2013/02/25/rubytapas-freebie-caller-specified-fallback-handler/</feedburner:origLink></item>
		<item>
		<title>Taking a break from pair programming</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/Gs8yMK5CW9Q/</link>
		<comments>http://devblog.avdi.org/2013/02/19/taking-a-break-from-pair-programming/#comments</comments>
		<pubDate>Tue, 19 Feb 2013 14:00:59 +0000</pubDate>
		<dc:creator>Avdi Grimm</dc:creator>
				<category><![CDATA[Announcements]]></category>

		<guid isPermaLink="false">http://devblog.avdi.org/?p=7221</guid>
		<description><![CDATA[About seven months ago I officially put out my shingle as a consulting pair-programmer. Since then I&#8217;ve logged around 250 hours of pair programming with at least 60 different programming partners. Most of that was paid sessions, but I also &#8230; <a href="http://devblog.avdi.org/2013/02/19/taking-a-break-from-pair-programming/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>About seven months ago <a href="http://devblog.avdi.org/2012/07/09/stepping-off-the-ledge/">I officially put out my shingle as a consulting pair-programmer</a>. Since then I&#8217;ve logged around 250 hours of pair programming with at least 60 different programming partners. Most of that was paid sessions, but I also did one free Open-Source session per week. Until RubyTapas subscriptions started shooting up at the end of last year, pair programming was my primary source of income.</p>
<p>&#8220;Consulting pair programmer&#8221; isn&#8217;t exactly a crowded niche. I know of some other freelance programmers who do a lot of remote pairing, but I&#8217;ve yet to hear of anyone else making a living on short (2-hour) sessions with many different clients. I wasn&#8217;t at all sure what the response would be like when I started the experiment. I half expected that I&#8217;d get an initial burst of interest which would then tail off after a month or two.</p>
<p>In actuality, the response has yet to abate. I&#8217;ve had little trouble filling my available time with pairing appointments, and I&#8217;m still receiving a steady stream of new inquiries every week. All this from no PR other than some links on my blog and an occasional mention on Twitter or <a href="http://rubyrogues.com">Ruby Rogues</a>.</p>
<p>It&#8217;s been a remarkable experience. Getting to see the Ruby world from the perspective of many different programmers with a broad range of experience has been incredibly valuable. Especially as someone who tries to put a lot of educational material out, I can&#8217;t think of a better way to get an idea of where people are coming from, and what concepts they have the most trouble with.</p>
<p>It has also been exhausting. As anyone who with pair-programming experience knows, a productive pairing session can leave you much more drained than the equivalent amount of time spent solo coding. Pairing keeps the focus and energy high. Not to mention that when people are paying for my time, I have a strong imperative to be 100% &#8220;on&#8221; from beginning to end. Some days I did four sessions&#8212;that&#8217;s four different people, working on four different projects&#8212;in a row. Those were exhilarating days, but also some of the most tiring I&#8217;ve known in my career.</p>
<p>In late September I launched <a href="http://rubytapas.com">RubyTapas</a>, my subscription screencast service. Since then it has grown by leaps and bounds. As of today it has well over 1000 subscribers. This has caused a shift in my priorities. I&#8217;m no longer a consultant with some products on the side. RubyTapas is my primary source of income, and hence it is now my focus.</p>
<p>The months of transition, during which RubyTapas wasn&#8217;t yet big enough to support us, but still required a great deal of time in order to turn out three videos a week, were difficult. Keeping up with enough pairing sessions to pay the bills;  spending many hours writing, recording, and editing videos; and oh yeah, also dealing with a new baby with only a tenuous grasp on the concept of &#8220;sleep&#8221;&#8230; let&#8217;s just say I didn&#8217;t get a lot of rest. We talk about technical debt; I feel like I&#8217;ve run up some stress debt which it&#8217;s now time to pay down.</p>
<p>Which is why I&#8217;ve decided to put my pairing services on hiatus for a while. I&#8217;m going to focus on making videos, finishing <a href="http://confidentruby.com">Confident Ruby</a>, and on my rather full 2013 conference schedule. I&#8217;ll obviously be keeping my scheduled appointments, and those of you on my OSS pairing queue: don&#8217;t worry, I&#8217;ll keep going down the list. But I&#8217;m taking down my pairing contact form for now.</p>
<p>There&#8217;s a lot I could write about my experiences pairing with so many different developers. I&#8217;m not really sure where to start though, so I&#8217;d like to open the floor instead. What would you like to know? As they say on Reddit: AMA!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=Gs8yMK5CW9Q:ckpSKynl6L8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=Gs8yMK5CW9Q:ckpSKynl6L8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=Gs8yMK5CW9Q:ckpSKynl6L8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=Gs8yMK5CW9Q:ckpSKynl6L8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=Gs8yMK5CW9Q:ckpSKynl6L8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=Gs8yMK5CW9Q:ckpSKynl6L8:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=Gs8yMK5CW9Q:ckpSKynl6L8:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/Gs8yMK5CW9Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://devblog.avdi.org/2013/02/19/taking-a-break-from-pair-programming/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		<feedburner:origLink>http://devblog.avdi.org/2013/02/19/taking-a-break-from-pair-programming/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 1.794 seconds. --><!-- Cached page generated by WP-Super-Cache on 2013-05-23 14:31:29 --><!-- Compression = gzip -->
