<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SmartLogic Solutions Blog &#187; Ruby</title>
	<atom:link href="http://blog.smartlogicsolutions.com/category/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.smartlogicsolutions.com</link>
	<description>News and updates from the people at SmartLogic Solutions</description>
	<lastBuildDate>Tue, 30 Nov 2010 21:39:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Announcing Winners of Free Tickets for Intro to Ruby Course</title>
		<link>http://blog.smartlogicsolutions.com/2010/11/30/announcing-winners-of-free-tickets-for-intro-to-ruby-course/</link>
		<comments>http://blog.smartlogicsolutions.com/2010/11/30/announcing-winners-of-free-tickets-for-intro-to-ruby-course/#comments</comments>
		<pubDate>Tue, 30 Nov 2010 21:39:14 +0000</pubDate>
		<dc:creator>Yair Flicker</dc:creator>
				<category><![CDATA[Baltimore]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[Lean Startup]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=1046</guid>
		<description><![CDATA[Almost a month ago we made two exciting announcements &#8211; the first was that SmartLogic will be hosting an Intro to Ruby1 course on December 10-11, 2010. The second announcement was that we would be giving away one free ticket to a local college/university student and another free ticket away to the co/founder of a [...]]]></description>
			<content:encoded><![CDATA[<p>Almost a month ago we made two exciting announcements &#8211; the first was that <a href="http://www.smartlogicsolutions.com/">SmartLogic</a> will be <a href="http://blog.smartlogicsolutions.com/2010/11/03/intro-to-ruby-on-rails-course-coming-to-baltimore/">hosting an Intro to Ruby<span style="vertical-align: super; font-size: 60%;">1</span> course</a> on December 10-11, 2010.  The second announcement was that we would be giving away one free ticket to a local college/university student and another free ticket away to the co/founder of a local startup company.</p>
<p>Well, we upped the ante and have decided to give away a total of FOUR free tickets.  We received a total of 40 submissions and were really encouraged by all of the enthusiastic responses.  Without further ado:</p>
<p><span id="more-1046"></span></p>
<ol>
<li>Brian Sierakowski &#8211; <a href="http://twitter.com/bsierakowski">@bsierakowski</a> &#8211; Managing Editor of Baltimore&#8217;s <a href="http://twitter.com/startupdigestmd" style="text-decoration: none;"><span style="color: black;">[</span><span style="color: rgb(0, 153, 0);">Startup</span><span style="color: black;">Digest]</span></a><span style="vertical-align: super; font-size: 60%;">2</span>, founder of CahootsApp and eCommunications &#038; Office Manager at <a href="http://www.gbtechcouncil.org/">Greater Baltimore Tech Council</a>.</li>
<li>Paul Kauders &#8211; <a href="http://twitter.com/pkauders">@pkauders</a> &#8211; founder of <a href="http://splitgear.com/">SplitGear</a>, a Baltimore-based company hoping &#8220;to make community based sharing of equipment the norm.&#8221;</li>
<li>Leela S. &#8211; a student at Towson University.  Leela has &#8220;never won anything before, so this would be a real treat.&#8221;  Well, there you go.</li>
<li>Eric Oestrich &#8211; <a href="http://twitter.com/EricOestrich">@EricOestrich</a> and <a href="https://github.com/oestrich/">oestrich on github</a> &#8211; a student at Towson University that participated in the debut of the <a href="http://baltimorehackathon.com">Baltimore Hackathon</a>.</li>
</ol>
<p>We&#8217;ll contact the winners shortly.</p>
<p>If you didn&#8217;t win: <a href="http://jumpstartlab.com/trainings/5-ruby-baltimore">buy a ticket</a> &#8211; or &#8211; stay tuned!  More announcements to follow.</p>
<p>Thanks to everyone that helped us spread the word.  If you&#8217;re interested in hearing what else we&#8217;re up to then please <a href="http://twitter.com/smartlogic">follow us on twitter</a>.</p>
<div style="font-size:smaller;"><span style="vertical-align: super; font-size: 60%;">1</span>&nbsp;In the original blog post I mistakenly called it an &#8220;Intro to Ruby on Rails course&#8221; &#8211; it&#8217;s actually just &#8220;Intro to Ruby&#8221; &#8211; the Rails course is a follow on.  I regret the error; my bad.<br/><span style="vertical-align: super; font-size: 60%;">2</span>&nbsp;I really, really hope I got the formatting of that correct.</div>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2010/11/03/intro-to-ruby-on-rails-course-coming-to-baltimore/" rel="bookmark" class="crp_title">Intro to Ruby on Rails Course Coming to Baltimore</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/05/05/smartlogic-wants-to-clean-up-twitter-introduces-shouldirtcom/" rel="bookmark" class="crp_title">SmartLogic Wants to Clean Up Twitter, Introduces ShouldIRT.com</a></li><li><a href="http://blog.smartlogicsolutions.com/2007/03/01/introducing-smartlogic-solutions-blog/" rel="bookmark" class="crp_title">Introducing the SmartLogic Solutions Blog</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/03/25/baltimore-adobe-livecycle/" rel="bookmark" class="crp_title">Baltimore Adobe User Group Starting Up</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/05/22/spotcrime-iphone-application-gets-techcrunched/" rel="bookmark" class="crp_title">SpotCrime iPhone Application gets TechCrunched</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2010/11/30/announcing-winners-of-free-tickets-for-intro-to-ruby-course/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Testing AJAX with Test::Unit</title>
		<link>http://blog.smartlogicsolutions.com/2010/10/08/testing-ajax-with-testunit/</link>
		<comments>http://blog.smartlogicsolutions.com/2010/10/08/testing-ajax-with-testunit/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 19:58:17 +0000</pubDate>
		<dc:creator>Nick Gauthier</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Nick Gauthier]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=979</guid>
		<description><![CDATA[If you want real end-to-end testing of a page with functioning AJAX, use Selenium. But I was interested in doing just a bit of JS speccing to make sure that the AJAX routes I called worked and that the data that came back fit the JS that I had written. So, I figured with a [...]]]></description>
			<content:encoded><![CDATA[<p>If you want real end-to-end testing of a page with functioning AJAX, use Selenium. But I was interested in doing just a bit of JS speccing to make sure that the AJAX routes I called worked and that the data that came back fit the JS that I had written.</p>
<p>So, I figured with a little <a href="http://github.com/jnicklas/capybara">capybara</a> and a little <a href="http://github.com/cowboyd/therubyracer">therubyracer</a>, I could test my javascript with real route calls. Let&#8217;s check it out.<br />
<span id="more-979"></span></p>
<p>The Javascript I want to test:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> dataObject <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> getRemoteData <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  $.<span style="color: #660066;">getJSON</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'/remote_path.json'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    dataObject <span style="color: #339933;">=</span> $.<span style="color: #660066;">parseJSON</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>We will pretend that hitting /remote_path.json returns the following response in JSON:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;my_information&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;my response data&quot;</span> <span style="color: #009900;">&#125;</span></pre></div></div>

<p>I want to test:</p>
<ol>
<li>That /remote_path.json is accessible and returns information</li>
<li>That dataObject is populated with a Javascript Object containing the params I pass down</li>
</ol>
<p>Here is my commented testing code:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  test <span style="color:#996600;">'get some information via ajax'</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    <span style="color:#008000; font-style:italic;"># Create a new JS Context. :with =&gt; self means that</span>
    <span style="color:#008000; font-style:italic;"># the global namespace is the current context</span>
    js = <span style="color:#6666ff; font-weight:bold;">V8::Context</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:with</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">self</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Load up our JS file</span>
    js.<span style="color:#CC0066; font-weight:bold;">load</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>Rails.<span style="color:#9900CC;">root</span>, <span style="color:#996600;">'public'</span>, <span style="color:#996600;">'javascripts'</span>, <span style="color:#996600;">'application.js'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Define a mock method for getting JSON data</span>
    <span style="color:#9966CC; font-weight:bold;">def</span> getJSON<span style="color:#006600; font-weight:bold;">&#40;</span>url, callback<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#008000; font-style:italic;"># When the JS wants some data, get it for real w/ capybara</span>
      visit url
      <span style="color:#008000; font-style:italic;"># And call the JS function passed in (ruby =&gt; js)</span>
      callback.<span style="color:#9900CC;">call</span><span style="color:#006600; font-weight:bold;">&#40;</span>page.<span style="color:#9900CC;">body</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    js.<span style="color:#CC0066; font-weight:bold;">eval</span> <span style="color:#006600; font-weight:bold;">%</span><span style="color:#006600; font-weight:bold;">&#123;</span>
      <span style="color:#006600; font-weight:bold;">/*</span> Mock out jQuery <span style="color:#006600; font-weight:bold;">*/</span>
      var $ = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>;
&nbsp;
      <span style="color:#006600; font-weight:bold;">/*</span> Setup the mock <span style="color:#9966CC; font-weight:bold;">in</span> the right place <span style="color:#006600; font-weight:bold;">&#40;</span>JS <span style="color:#006600; font-weight:bold;">=&gt;</span> ruby<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">*/</span>
      $.<span style="color:#9900CC;">getJSON</span> = getJSON; 
&nbsp;
      <span style="color:#006600; font-weight:bold;">/*</span> Mock out jquery parseJSON to call ruby JSON.<span style="color:#9900CC;">parse</span>
         Since the args are the same, it is plug <span style="color:#9966CC; font-weight:bold;">and</span> play!
         <span style="color:#006600; font-weight:bold;">&#40;</span>JS <span style="color:#006600; font-weight:bold;">=&gt;</span> ruby<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">*/</span>
      $.<span style="color:#9900CC;">parseJSON</span> = JSON.<span style="color:#9900CC;">parse</span>;
&nbsp;
      <span style="color:#006600; font-weight:bold;">/*</span> Trigger our JS <span style="color:#006600; font-weight:bold;">*/</span>
      getRemoteData<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;
&nbsp;
      <span style="color:#006600; font-weight:bold;">/*</span> Assert what we expect <span style="color:#006600; font-weight:bold;">&#40;</span>JS <span style="color:#006600; font-weight:bold;">=&gt;</span> ruby<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">*/</span>
      assert_equal<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot; &quot;</span>, dataObject.<span style="color:#9900CC;">access_key</span><span style="color:#006600; font-weight:bold;">&#41;</span>;
    <span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>This is not an example of an incredibly useful test, but I found the ability to bind back and forth easily between ruby and javascript to be <strong>mind-blowingly incredible</strong>. I mean, look at that last line, where I call assert and pass a javascript object to it!</p>
<p>Huge thanks to <strong><a href="http://github.com/cowboyd">Charles Lowell (cowboyd)</a></strong> for his hard work on <a href="http://github.com/cowboyd/therubyracer">therubyracer</a>.</p>
<p>Enjoy the weekend! </p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2008/11/19/timecop-freeze-time-in-ruby-for-better-testing/" rel="bookmark" class="crp_title">Timecop: Freeze Time in Ruby for Better Testing</a></li><li><a href="http://blog.smartlogicsolutions.com/2010/10/26/testpilot-rails-integration-testing-pattern/" rel="bookmark" class="crp_title">TestPilot &#8211; Rails Integration Testing Pattern</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/06/20/google-ajax-libraries-on-rails/" rel="bookmark" class="crp_title">Google AJAX Libraries on Rails</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/08/08/using-active-x-and-javascript-to-scan-from-your-web-app/" rel="bookmark" class="crp_title">using active x and javascript to scan from your web app</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/10/15/using-swfobject-to-seamlessly-upgrade-to-flash-player-10/" rel="bookmark" class="crp_title">Using SWFObject to Seamlessly Upgrade to Flash Player 10</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2010/10/08/testing-ajax-with-testunit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nick&#8217;s Highlights from Windy City Rails</title>
		<link>http://blog.smartlogicsolutions.com/2010/09/11/nicks-highlights-from-windy-city-rails/</link>
		<comments>http://blog.smartlogicsolutions.com/2010/09/11/nicks-highlights-from-windy-city-rails/#comments</comments>
		<pubDate>Sat, 11 Sep 2010 23:07:21 +0000</pubDate>
		<dc:creator>Nick Gauthier</dc:creator>
				<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Nick Gauthier]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=972</guid>
		<description><![CDATA[I attended and spoke at Windy City Rails. I tried to take more notes this time. Out of 6 talks an lightning talks, I have ~500 lines of notes. Enjoy!. Jake Scrugges &#8211; Metrics Based Refactoring: What To Do With Your Code Metrics Metric-Fu is a ruby metric bundle rake metrics:all => generates a master [...]]]></description>
			<content:encoded><![CDATA[<p>I attended and spoke at Windy City Rails. I tried to take more notes this time. Out of 6 talks an lightning talks, I have ~500 lines of notes. Enjoy!.<br />
<span id="more-972"></span></p>
<h2>Jake Scrugges &#8211; Metrics Based Refactoring: What To Do With Your Code Metrics</h2>
<ul>
<li>Metric-Fu is a ruby metric bundle</li>
<li>rake metrics:all<br />
=> generates a master report of a bunch of metrics</li>
<li>There are a lot of metrics, where do you start?</li>
<li>Everyone wants to refactor, but where do you start?</li>
<li>Flay
<ul>
<li>Analyzes code duplication</li>
<li>Finds violations of DRY</li>
<li>Solutions: Extract Method, Modules, etc.</li>
<li>Single Responsibility Principle</li>
</ul>
</li>
<li>Churn
<ul>
<li>Looks through your commits to see what stuff changes the most</li>
<li>Files that change the most are &#8220;God Objects&#8221; &#8211; stuff that does everything</li>
<li>Any time anything changes, the God Object has to change</li>
<li>Bad smell, should be smaller objects with greater focus</li>
<li>Tells you where your most volatile code is</li>
</ul>
</li>
<li>Rcov
<ul>
<li>Main reason metric-fu blows up</li>
<li>Problem is, metric-fu is mostly static analysis, but rcov is running the code</li>
<li>Rcov runs the test suite, which is sometimes hard to get working</li>
<li>Rcov makes sure your coverage is good where it needs to be (most complicated and volatile code)</li>
<li>Writing tests for the sake of coverage is harmful</li>
<li>Write tests when you are in the code and you understand it (not a week later, &#8220;let&#8217;s write some tests!&#8221;)</li>
</ul>
</li>
<li>Flog and Saikuro
<ul>
<li>Both are complexity management</li>
<li>Saikuro (pronounced cyclo as in cyclomatic complexity) measures cyclomatic complexity</li>
<li>Saikuro = number of paths through the code, and cyclomatic complexity is exponential in growth</li>
<li>Flow looks at branching, but uses ABC</li>
<li>Assignments</li>
<li>Branches</li>
<li>Calls</li>
<li>Flog generates a score based on ABC</li>
<li>&lt; 20 is good, 20-40 is a grey area, 40-60 is a warning, 60+ is FIX IT!</li>
<li>How do you fix it?</li>
<li>Extract method</li>
<li>Missing object (need a new class to handle this behavior)</li>
<li>If that doesn&#8217;t work, re-architect</li>
<li>Seriously, you don&#8217;t need complicated methods in <em>any</em> app</li>
<li>Director method: calls a couple of sub methods, doesn&#8217;t do much actual work</li>
<li>Take care not to over-factor. If you are a guest in the code, just clean it<br />
as necessary. You don&#8217;t need to fully re-organize.</li>
</ul>
</li>
<li>Reek, Roodi, and RailsBestPractices
<ul>
<li>Reek: if it could possibly be a problem, I&#8217;ll tell you</li>
<li>Roodi: only if I&#8217;m really sure, I&#8217;ll tell you</li>
<li>RailsBestPractices: just rails stuff</li>
<li>All parse the code and look for design problems</li>
<li>Very ambitious! Code trying to understand what you&#8217;re trying to do</li>
<li>Awesome because you can look up the definition of the problem and see how to fix it.</li>
<li>Trouble because it&#8217;s a machine trying to identify human problems, which is difficult</li>
</ul>
</li>
<li>Continuous Integration
<ul>
<li>Metric-fu on your code</li>
<li>Most CI&#8217;s allow you to have artifacts for a build</li>
<li>J.S. runs his nightly at midnight</li>
</ul>
</li>
<li>Pay attention to trends over time
<ul>
<li>Is your refactoring making things better?</li>
<li>Did the last feature skyrocket flay scores?</li>
<li>How is the influx of new developers affecting the code quality</li>
<li>Did the highly paid consultants produce good work?</li>
</ul>
</li>
<li>Take metrics as advice (not law)
<ul>
<li>It is a tool, use it intelligently (like a GPS system)</li>
<li>Don&#8217;t let a manager get in charge of this</li>
<li>Up to you and your team to establish conventions and stick to them</li>
</ul>
</li>
<li>Coming soon
<ul>
<li>Fail the build on bad metrics</li>
<li>Resisted for a while because there may be false negatives</li>
<li>Failing a build is a serious incident, needs to mean something</li>
<li>Metrics are not as definitive as tests</li>
</ul>
</li>
<li>Coming later (and/or soonish)
<ul>
<li>Meta metrics</li>
<li>Imagine a report that flagged a method as having high churn, poor coverage, and high complexity</li>
<li>This method is trouble waiting to happen</li>
<li>No so easy to write this feature</li>
<li>J.S. needs help!</li>
<li>Need to re-architect the system to understand classes and methods, not just lines of code</li>
</ul>
</li>
<li>Questions
<ul>
<li>Can you use other source control?</li>
<li>I think so, check out the churn gem</li>
<li>How is the performance?</li>
<li>Not great, but you only have to run it once a day</li>
<li>If you don&#8217;t have test coverage, now what?</li>
<li>start w/ rehacktoring (refactoring w/o tests)</li>
<li>do that until you understand it enough to write tests</li>
<li>write tests!</li>
<li>What about front-end heavy stuff? Javascript?</li>
<li>No idea! These are all ruby tools. Maybe there are JS tools out there?</li>
<li>You should test your javascript. Sapphire is the &#8220;new hot thing&#8221;.</li>
</ul>
</li>
</ul>
<h2>John McCaffrey &#8211; Analyzing and Improving the Performance of your Rails Application</h2>
<ul>
<li><a href="http://railsperformance.blogspot.com">http://railsperformance.blogspot.com</a></li>
<li>O(n) queries is bad</li>
<li>Code he refactored went from 2811 to 17 queries per action</li>
<li>Leverage: small amounts of work for large amounts of value</li>
<li>Delay directly correlates w/ loss of revenue
<ul>
<li>Bing: 1s = 2.8% decrease, 2s = 4.3%</li>
<li>Google: users that had a delay for a short period of time, actually searched less even after the delay was removed.</li>
<li>Yahoo: added a 400ms delay and users bailed before the pages even loaded</li>
<li>Shopzilla: reduced delay from 6s to 1.2s.</li>
<li>Conversion rate rate up 7-12%</li>
<li>Saved infrastructure costs by 50%</li>
<li>Release cost decreased</li>
</ul>
</li>
<li>Fred Wilson (VC): Speed is #1 of the 10 golden principles of successful web apps</li>
<li>So where to begin?</li>
<li>Anti-patterns:
<ul>
<li>&#8220;Scalability can be sprinkled on later&#8221;</li>
<li>Guessing, not testing</li>
<li>Ad-hoc, unstructured</li>
</ul>
</li>
<li>&#8220;Premature optimization is the root of all evil&#8221; &#8211; Donald Knuth</li>
<li>&#8220;If you can not measure it, you can not improve it&#8221; &#8211; Lord Kelvin</li>
<li>Measure</li>
<li>Repeatable tests</li>
<li>Isolate your changes</li>
<li>(Scientific method!)</li>
<li>Visibility is important for working on a team</li>
<li>Response time = latency</li>
<li>Requests per second = throughput</li>
<li>Load, utilization, scalability, throughput, concurrency, capacity</li>
<li>Performance != Scalability
<ul>
<li>Performance = response time</li>
<li>Scalability = ability to grow to more requests</li>
<li>Adding more workers will not improve latency</li>
</ul>
</li>
<li>Twitter: dynamic html = 250ms, but 3369ms is static assets
<ul>
<li>Don&#8217;t waste your time on the 250ms, go for the big slow chunks</li>
</ul>
</li>
<li>Walmart: 3 redirects, 388ms dynamic, 4580ms static content</li>
<li>Use YSlow
<ul>
<li>Do less work</li>
<li>Distribute content</li>
<li>Cache</li>
<li>Compress</li>
<li>Fight queued work</li>
</ul>
</li>
<li>Google page speed
<ul>
<li>similar to yslow</li>
<li>includes paint events</li>
<li>separates out ads and trackers from your site</li>
<li>&#8220;how fast it feels&#8221;</li>
<li>If the web is faster, they make more money</li>
</ul>
</li>
<li><a href="http://www.showslow.com/">http://www.showslow.com/</a> tracks your site (or competitors, will check every 24h)</li>
<li><a href="http://webpagetest.com/">http://webpagetest.com/</a> runs page speed and yslow for you, and show progressive rendering</li>
<li><a href="http://gtmetrix.org">http://gtmetrix.org</a></li>
<li><a href="http://zoompf.com">http://zoompf.com</a> </li>
<li><a href="http://loadimpact.com">http://loadimpact.com</a> </li>
<li><a href="http://gomez.com">http://gomez.com</a> </li>
<li>See Greg Pollack&#8217;s Scaling Rails series</li>
<li>Majority of the Alexa top 1,000 sites don&#8217;t do even the easiest things
<ul>
<li>42% don&#8217;t gzip</li>
<li>44% >2 css files</li>
<li>56% serve css from a cookied domain</li>
<li>62% don&#8217;t minify</li>
</ul>
</li>
<li>Gzip is the simplest and smartest thing you can do</li>
<li>Minify js
<ul>
<li>jsmin, yuicompressor, sprockets</li>
<li>Asset packager</li>
<li>javascript_include_tag :cache => &#8220;cache/all&#8221;</li>
</ul>
</li>
<li>Sprited images</li>
<li>Spriteme.org</li>
<li>JqueryUI gives you sprited images</li>
<li>Image optimization
<ul>
<li>Smush.it</li>
</ul>
</li>
<li>Expires and browser caching</li>
<li>Set a far-future expire to tell the browser it can cache it</li>
<li>Combined with a query string lets you version a file</li>
<li>Rails Caching: make the static parts of your dynamic content cached</li>
<li>railslab.newrelic.com</li>
<li>request-log-analyzer</li>
<li>Rack::Bug</li>
<li>NewRelic</li>
<li>Scout</li>
<li>Get on the heroku mailing list / blog to learn about scaling issues</li>
<li>Apache bench</li>
<li>httperf</li>
<li>jmeter</li>
<li>Database issues
<ul>
<li>Bad queries</li>
<li>Not utilizing explain</li>
<li>Inadequate indexes</li>
<li>N+1 queries</li>
<li>Selecting more data than needed</li>
<li>Inconsistent queries for the same data</li>
<li><a href="http://github.com/dsboulder/query_reviewer/">http://github.com/dsboulder/query_reviewer/</a> </li>
</ul>
</li>
<li><a href="http://github.com/eladmeidar/rails_indexes">http://github.com/eladmeidar/rails_indexes</a>
<ul>
<li>rake tasks to find missing indexes</li>
<li>columns that need to be sorted</li>
<li>lookup fields</li>
<li>columns used in a group-by</li>
</ul>
</li>
<li><a href="http://github.com/samdanavia/ambitions_query_indexer">http://github.com/samdanavia/ambitions_query_indexer</a> haven&#8217;t tried it yet, check it out</li>
<li><a href="http://github.com/sdsykes/slim_scrooge">http://github.com/sdsykes/slim_scrooge</a> Instruments your code and looks for bad &#8220;select *&#8221;</li>
<li>Aman Gupta</li>
<li>Joe Damato</li>
<li><a href="http://timetobleed.com/">http://timetobleed.com/</a></li>
<li><a href="http://memprof.com/">http://memprof.com/</a> </li>
<li>yajl-ruby for C++ extension json parsing</li>
<li>Ruby 1.9 for massive performance</li>
</ul>
<h2>Kevin Gisi &#8211; It&#8217;s time to repay your debt</h2>
<ul>
<li>We&#8217;re leveraging an awesome framework and language, and it&#8217;s time to give back</li>
<li>Releasing gems is easy</li>
<li>(Showing some code to refactor out into a gem)</li>
<li>Ruby community has an incredible (and overwhelming) amount of choice</li>
<li>Choice is good and important</li>
<li>There exist incomplete and unstable solutions</li>
<li>You should release a &#8220;product&#8221;, not an incomplete solution
<ul>
<li>Aesthetics</li>
<li>Utility</li>
</ul>
</li>
<li>Agile: Do the bare minimum to get something delivered
<ul>
<li>(Nick: isn&#8217;t it to embrace change?)</li>
</ul>
</li>
<li>Delivered: coded, deployed, supported, tested, extensible, usable by the client</li>
<li>Treat open source libraries and client deliverables</li>
<li>The Lazy programmer&#8217;s manifesto
<ul>
<li>I want to write code once</li>
<li>I want to be able to read code w/o docs</li>
<li>I want to be able to rely on libraries</li>
<li>I wants to use adaptable solutions for numerous problems</li>
<li>I want to always be working on something new</li>
</ul>
</li>
<li>Idea filtering
<ul>
<li>To share</li>
<li>business value</li>
<li>practical use</li>
<li>To learn</li>
<li>no requirements</li>
<li>don&#8217;t post it publicly (community does not value your stupid web framework)</li>
</ul>
</li>
<li>Testing
<ul>
<li>We all say we do it (it&#8217;s time to start)</li>
<li>RSpec and Cucumber are easy to set up</li>
<li>Design verification tool</li>
</ul>
</li>
<li>(really turning into a rant at this point)</li>
<li>Extensible
<ul>
<li>Write clean code (don&#8217;t post spikes)</li>
<li>Peer review</li>
<li>Follow the Unix philosophy: do one thing really well</li>
<li>Leverage other gems</li>
</ul>
</li>
<li>Documentation
<ul>
<li>Who&#8217;s looking at your code?</li>
<li>RDoc, YARD, etc</li>
<li>Getting Started</li>
<li>Blog post!</li>
</ul>
</li>
<li>Supported
<ul>
<li>If you can&#8217;t maintain your app, don&#8217;t post it</li>
</ul>
</li>
<li>Be Honest
<ul>
<li>Hand over the reigns if you can&#8217;t support it</li>
<li>Be a net positive</li>
<li>Don&#8217;t announce things that aren&#8217;t done</li>
</ul>
</li>
<li>If you have to
<ul>
<li>Put it in a limited venue</li>
<li>Add a disclaimer</li>
</ul>
</li>
<li>The internet doesn&#8217;t filter bad ideas very well
<ul>
<li>It does make things hard to do if they don&#8217;t work well</li>
<li>Having enough eyes</li>
</ul>
</li>
<li>&#8220;Ruby treats you like a grown up programmer&#8221; &#8211; Matz</li>
<li>What happens when grown-ups have too much fun?</li>
<li>How to be a good parent
<ul>
<li>Avoid sensory overload</li>
<li>Sometimes spoon feed</li>
<li>Remember you&#8217;re used to the status quo</li>
<li>Be a mentor <a href="http://railsmentors.org">http://railsmentors.org</a> </li>
<li>Provide solutions to problems, not blocks of code</li>
</ul>
</li>
<li>(I wish this was a &#8220;how to do a good job&#8221; and not &#8220;you suck, stop sucking&#8221;. I think he wants to be the king of the rubygems app store)</li>
</ul>
<h2>Lightning Talks</h2>
<h3>Micah Martin &#8211; Limelight</h3>
<ul>
<li>Tool to build GUIs in ruby</li>
<li>Built a gui calculator in 5 minutes</li>
</ul>
<h3>Sean Scofield &#8211; The Awesome Power of Rails Engines</h3>
<ul>
<li>Engines make it easy for frameworks to be built on top of rails</li>
<li>Engine is a complete application that can provide the stuff rails apps provide</li>
<li>app directory is auto loaded</li>
<li>You can supply models, views, controllers in your engine</li>
<li>You can override locale by dropping it in app</li>
<li>Engines extending engines, for example Spree</li>
<li>Bundler ties it all together</li>
</ul>
<h3>Mike Buselli &#8211; Brush::Pipeline</h3>
<ul>
<li>Running external OS commands</li>
<li>sys
<ul>
<li>lower level, more convenient for specific takss</li>
<li>chaining commands</li>
</ul>
</li>
<li>pipeline
<ul>
<li>better at chaining commands</li>
<li>pipeline ['head', 'README'], ['tail', '-n2']</li>
<li>Each part of the pipeline can run in different directories</li>
<li>stderr and stdout redirection</li>
<li>argv[0] renaming</li>
<li>restrict access to open files</li>
<li>Works great on POSIX including cygwin</li>
</ul>
</li>
</ul>
<h3>Chris Hallendy and Nick Lewis &#8211; Realtime Apps</h3>
<ul>
<li>Demo of node.js &lt;-> Redis &lt;-> Rails</li>
</ul>
<h3>Joe Fiorini (sp?) &#8211; Web Katas</h3>
<ul>
<li>Problem: web developers don&#8217;t know http</li>
<li>Rails is big and awesome, but it&#8217;s hard to troubleshoot</li>
<li>It allows us to ignore how http works.</li>
<li>Code Katas <a href="http://bit.ly/codekatas">http://bit.ly/codekatas</a> </li>
<li>No-framework webapp development (Rack) to learn how http cookies work</li>
<li>More Katas
<ul>
<li>Auth token</li>
<li>See Other response status</li>
<li>Move permanently</li>
<li>Session state handling</li>
<li><a href="http://bit.ly/webkatas">http://bit.ly/webkatas</a></li>
</ul>
</li>
</ul>
<h3>Jim Remsik &#8211; Improv: Comedy to Coding</h3>
<ul>
<li>Programming is a people problem</li>
<li>You write code for other people</li>
<li>We use ruby because it is expressive and easy for others to read and maintain</li>
<li>Improv after-hours at hashrock</li>
<li>Yes-and, drop your preconcieved notions at the door</li>
<li>Support your team</li>
</ul>
<h3>Malcolm Arnold &#8211; Ruby Nuby</h3>
<ul>
<li>Brand new social movement dedicated to teaching ruby on rails to disadvantaged youths</li>
<li>Maximize social good by spreading ruby</li>
</ul>
<h3>Praveen Alavilli &#8211; Monetizing your apps</h3>
<ul>
<li>&#8220;chase your dream, money will follow&#8221;</li>
<li>Still a mystery to a lot of people how the money follows</li>
<li>Indirect
<ul>
<li>advertising</li>
<li>offers</li>
<li>referalls</li>
</ul>
</li>
<li>Direct
<ul>
<li>e/m-commerce</li>
<li>freemium</li>
<li>causium (donate money to a cause)</li>
<li>pay as you use</li>
<li>free to use pay for service</li>
<li>premium content</li>
<li>digital goods</li>
<li>virtual currency</li>
<li>subscriptions</li>
</ul>
</li>
<li>Challenge: apply these models to your use cases</li>
<li>Gateway (i.e. Payflow, Authorize.net)</li>
<li>Checkout (Google, PayPal, Amazon)</li>
<li>Platform (PayPal, Amazon)</li>
<li>Also services on top (Chargify, Spreedly, Freshbooks)</li>
<li>Choose one that works the best</li>
<li>Your users need to be able to pay somehow, should not be hard to pay</li>
<li>PCI compliance for charging directly</li>
<li>secure and privacy enabling</li>
<li>Adaptive Payments API</li>
</ul>
<h2>Ryan Singer &#8211; Weaving Design and Development</h2>
<ul>
<li>UI Design and Programming, working together</li>
<li>(telling a story about working with a startup and doing design for them)</li>
<li>Designer says &#8220;let&#8217;s change this button&#8221; while pairing with dev, dev makes the change instantly</li>
<li>XP is focused on delivery</li>
<li>In XP, feedback loops are not as important</li>
<li>Feedback can be difficult if you are purely focused on delivery</li>
<li>Shared code base, code runs on designers computers</li>
<li>Avoid the designer w/ folders full of PSDs and static content
<ul>
<li>Becomes a spec, then the dev has to implement it</li>
</ul>
</li>
<li>Static files are like spikes, for exploration and experimentation</li>
<li>Actual changes need to keep up with the codebase</li>
<li>At 37Signals, no sync problem, because the designers are working in the code base</li>
<li>HAML and Mustache are out, because designers can&#8217;t deal with them</li>
<li>Templates with logic</li>
<li>Avoid helpers writing HTML and presenters writing html</li>
<li>Start together, don&#8217;t bring the designers in late, or the developers in late</li>
<li>Architecture before design leaves UX to too late in the process</li>
<li>Designers starting everything before programmers start, it may be impossible or impractical to code</li>
<li>P&amp;D decide on domain language and basic model</li>
<li>P stub models, controllers, routes, and templates</li>
<li>D few days lead on designing and building templates</li>
<li>Simultaneous
<ul>
<li>P design and build models, controllers, routes, helpers, dynamic templates</li>
<li>D design and build templates and helpers</li>
<li>Repeat this process continuously</li>
</ul>
</li>
<li>Share the codebase</li>
<li>All views are in templates w/ logic (ERB or similar, not HAML)</li>
<li>Start together for domain language and models for communication</li>
<li>constantly committing to the same codebase</li>
<li>Train designers in git and ruby and other things</li>
<li>Designers are motivated to learn so they can make changes directly: it gives them more power</li>
</ul>
<h2>Nick Gauthier &#8211; Grease your Suite</h2>
<h2>Les Hill and Jim Remsik &#8211; Sustainably Awesome</h2>
<ul>
<li>Comfortable and productive environment is crucial</li>
<li>sustainable pace is important. 40h weeks.</li>
<li>cargo culting</li>
<li>Pet friendly</li>
<li>The point is not to do what we do, but to recognize our goals. Don&#8217;t cargo cult these tips!</li>
<li>Casual</li>
<li>No Micromanagement</li>
<li>Don&#8217;t penny pinch</li>
<li>Keep a budget and spend it wisely</li>
<li>$400 per week grocery budget</li>
<li>No death marches</li>
<li>No meetings (except daily standup and project standup and monthly company status meeting)</li>
<li>No hierarchy</li>
<li>No future-proofing (software and organizational practices)</li>
<li>What do you do when a developer rm -rfs?
<ul>
<li>No sudo for devs?</li>
<li>3 manager approval before running a script?</li>
<li>Develop a backup solution and a common machine image?</li>
</ul>
</li>
<li>&#8220;Process is an embedded reaction to prior stupidity&#8221; &#8211; Clay Shirky</li>
<li>A project came along that needed work done ASAP</li>
<li>Crafted an MVP and built it without changing their process</li>
<li>The MVP did not overlap with their mockups and specs</li>
<li>Started with story cards and team boards</li>
<li>Moved to pivotal tracker</li>
<li>Tim Pope had a suggestion about how to work stories in pivotal that worked really well</li>
<li>Always open to try new things and experiment with new processes</li>
<li>Enjoy your work</li>
<li>Don&#8217;t hire people you don&#8217;t like, or without passion</li>
<li>Hire smart people that get things done</li>
<li>Must be a great cultural fit</li>
<li>Hiring
<ul>
<li>phone screening</li>
<li>week long &#8220;test drive&#8221;</li>
<li>gems you use are important</li>
<li>editors you use are important</li>
<li>test driven (and test-first) style</li>
<li>hang out after hours to check for a cultural fit</li>
</ul>
</li>
<li>&#8220;If I&#8217;m not saying &#8216;hell yeah!&#8217; about something, then I say no&#8221; &#8211; Derek Sivers</li>
<li>Firing: due to lack of communication or mistake, probably on both sides</li>
<li>Fire fast, but with compassion</li>
<li>Approach building a team the same way you build software</li>
</ul>
<h2>Yehuda Katz &#8211; Rails 3</h2>
<ul>
<li>Rails core family is getting bigger</li>
<li>Rails 2 was very intertwined</li>
<li>Broke things up cleanly</li>
<li>Instead of Railties being a big glue layer w/ initialization stack, it became a small part or Rails 3 and specifies the framework for applications and engines</li>
<li>Engines are special plugins now that inherit from Railties</li>
<li>Applications inherit from Engines</li>
<li>Railtie lets you add features to rails</li>
<li>Railties provide a series of Hooks</li>
<li>Inheriting from Railtie doesn&#8217;t do anything, but it has lots of functionality</li>
<li>Railtie lets you configure the application, such as pull in generators</li>
<li>Rake Tasks are another Railtie Hook
<ul>
<li>Extra stuff you want to have happen in rake, and not on boot<br />
rake_tasks do<br />
load &#8220;my_stuff/my_tasks.rake&#8221;<br />
end</li>
</ul>
</li>
<li>before_configuration hook = right inside Rails::Application, before user stuff happens, but you know about rails root and stuff.</li>
<li>config.to_prepare : in dev, run every time, in production, run once (i.e. compass template compilation)</li>
<li>Framework loading: ActiveSupport.on_load = i.e. when action mailer loads, monkey patch in some code. Then you don&#8217;t have to try to detect ActionMailer, you just say, when it loads do stuff.</li>
<li>Don&#8217;t do if(defined) because it depends on order</li>
<li>Decouple via Instrumentation</li>
<li>ActiveSupport::Notifications.instrument(&#8220;receive.action_mailer&#8221;) do |payload|; #callback; end</li>
<li>Worth Noting: we worked really hard making things mostly backwards compatible</li>
<li>The old way may appear to work, even if it doesn&#8217;t</li>
<li>AbstractController is decoupled from ActionController</li>
<li>ActionDispatch = Rack++</li>
<li>ActiveModel lets other persistence engines connect to ActionController. Only need to support ~5 methods</li>
<li>Tight Integration without Coupling</li>
<li>Integration first, decouple later</li>
<li>Migrating:
<ol>
<li>Install Rails 2.3.9.</li>
<li>bundler</li>
<li>rails_xss</li>
<li>Deprecations &#8211; get the count to 0</li>
<li>Upgrade</li>
<li>Deprecations again!</li>
</ol>
</li>
<li>Helpers should call partials, not generate html</li>
<li>Rails 3.1: We&#8217;re not burned out!
<ul>
<li>Engines</li>
<li>@drogus did all the engine work</li>
<li>Engine Migrations</li>
<li>Static assets (w/o copying). Leave it in the engine, and Rack::Static will find it</li>
<li>Self-contained engine</li>
<li>Built-in http caching, to get away from filesystem caching</li>
<li>fresh_when? calculates an etag from the post and returns 304 if not fresh</li>
<li>caching at the browser layer</li>
<li>etag can be based on an AR object</li>
<li>If you have Varnish, you can turn off Rack::Cache and fresh_when will be built in</li>
<li>This also means that when you turn on Akamai, you already have all the code that makes it work well</li>
<li>Enables Edge-Cached SCSS</li>
<li>Rack::Cache is like Memcache, but uses HTTP semantics</li>
<li>Assets </li>
<li>ERB == SCSS (I have content that needs to be processed before it hits the browser) </li>
<li>Solution: build in compilation pipeline</li>
<li>app.css.scss (like app.html.erb)</li>
<li>posts/index.css.scss</li>
<li>Treats CSS the same as HTML for templating</li>
<li>SCSS template handler => http response => rack::cache</li>
<li>It just works w/ varnish and the like</li>
<li>Spriting</li>
<li>Compass and lemonade are merging w/ a new sprite api</li>
<li>Put all your images in images/sprites/ 1, 2, 3, 4, .png</li>
<li>Lets you include all the images as a sprite</li>
<li>Gives you a bunch of css classes to use the sprites</li>
<li>SCSS can take CSS, and then add stuff in</li>
<li>You don&#8217;t need imagemagick, there is a pure ruby PNG spriting library</li>
<li>AutoFlush &#8211; it&#8217;s cool, read his blog, running out of time</li>
<li>flush content to the browser as it is rendering</li>
<li>Tradeoffs you have to deal with, like exceptions</li>
<li>Browser can be working on your CSS while you are doing SQL queries</li>
<li>Keep content_for at the top of the template</li>
<li>Exceptron</li>
<li>Stolen from merb</li>
<li>ExceptionsController to render and take actions when exceptions happen</li>
<li>Performance</li>
<li>We did pretty well in 3.0, definitely some trouble spots</li>
<li>More mechanisms for performance</li>
<li>Big Arel rewrite for 3.1</li>
<li>Possible to get to 2x faster over 3.0</li>
</ul>
</li>
</ul>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2010/09/07/nicks-highlights-from-ruby-hoedown/" rel="bookmark" class="crp_title">Nick&#8217;s Highlights from Ruby Hoedown</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/11/23/web-2-0-expo-nyc-wrap-up/" rel="bookmark" class="crp_title">Web 2.0 Expo NYC Wrap Up</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/06/11/multithreading-in-ruby-on-rails/" rel="bookmark" class="crp_title">Multithreading in Ruby on Rails</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/03/13/slow-actions-in-rails-projects/" rel="bookmark" class="crp_title">Slow Actions in Rails Projects</a></li><li><a href="http://blog.smartlogicsolutions.com/2010/02/01/setting-up-ubuntu-9-10-for-ruby-on-rails-development/" rel="bookmark" class="crp_title">Setting Up Ubuntu 9.10 for Ruby On Rails Development</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2010/09/11/nicks-highlights-from-windy-city-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nick&#8217;s Highlights from Ruby Hoedown</title>
		<link>http://blog.smartlogicsolutions.com/2010/09/07/nicks-highlights-from-ruby-hoedown/</link>
		<comments>http://blog.smartlogicsolutions.com/2010/09/07/nicks-highlights-from-ruby-hoedown/#comments</comments>
		<pubDate>Tue, 07 Sep 2010 13:11:46 +0000</pubDate>
		<dc:creator>Nick Gauthier</dc:creator>
				<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Nick Gauthier]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=963</guid>
		<description><![CDATA[I attended and spoke at Ruby Hoedown 2010. Below are my notes from the conference. Day One (Nuby Hoedown) David A. Black &#8211; The Well-Grounded Nuby Seven key points, with code examples Every expression evaluates to an object if statements and class definitions return objects operations are messages (==, +, etc) methods are messages (to_s) [...]]]></description>
			<content:encoded><![CDATA[<p>I attended and spoke at Ruby Hoedown 2010. Below are my notes from the conference.</p>
<p><span id="more-963"></span></p>
<h2>Day One (Nuby Hoedown)</h2>
<h3>David A. Black &#8211; The Well-Grounded Nuby</h3>
<ul>
<li>Seven key points, with code examples</li>
<li>Every expression evaluates to an object</li>
<li>if statements and class definitions return objects</li>
<li>operations are messages (==, +, etc)</li>
<li>methods are messages (to_s)</li>
<li>a[2] is equivalent to a.<a href="2"></a></li>
<li>case is really if, elsif, etc, which is really x1.===(x0), x2.===(x0), etc.</li>
<li>String === String is false! Classes define === as meaning &#8220;is the argument an instance of me&#8221;</li>
<li>Objects have lookup paths they use to find the method among their associated modules and classes</li>
<li>Super means keep searching for the next method up. Not necessarily the super class, could just be<br />
in a module that was included the most recently.</li>
<li>instance.extend(module) will include the module into that instance, not the entire class</li>
<li>every object has a singleton class that represents the instance. So the above in actually including<br />
the module into the instance&#8217;s singleton class.</li>
<li>there is always a &#8220;self&#8221;. defaults to main:Object</li>
</ul>
<h3>Kevin W. Gisi &#8211; Dynamic Ruby for Nubies</h3>
<ul>
<li>DSLs help bridge the gap between an idea and code, as a layer of abstraction</li>
<li>I got lost :-(</li>
</ul>
<h3>Lunch</h3>
<ul>
<li>Om nom nom</li>
</ul>
<h3>Nick Gauthier &#8211; The Six Ws of Testing</h3>
<ul>
<li>I think it went well. Very low on technical content but many Nubies came to talk to me afterward and said they enjoyed it. I&#8217;m sure I bored the technical folks to tears. But hey, it&#8217;s the Nuby Hoedown!</li>
</ul>
<h3>Matt Yoho &#8211; Gem Authoring and Deployment</h3>
<ul>
<li>&#8220;require&#8221; loads code once, it is smart</li>
<li>&#8220;load&#8221; loads the code without doing any checks</li>
<li>You should not &#8220;require &#8216;rubygems&#8217;&#8221; it should already be on the load path</li>
<li>Don&#8217;t use jeweler, use a real gemspec
<p>http://yehudakatz.com/2010/04/02/using-gemspecs-as-intended/</p>
<p>Unsure about this, maybe the gemspec has enough automation you don&#8217;t have to do this any more?</li>
<li>Aruba lets you write cuke specs within cuke specs. Helps with command line applications</li>
</ul>
<h3>Hack Session of DOOM</h3>
<ul>
<li>Two features and one bug on hydra!</li>
</ul>
<h3>Scott Chacon &#8211; Getting Git</h3>
<ul>
<li>http://gitref.org</li>
<li>http://progit.org</li>
<li>schacon@gmail.com (put conf name in subj when emailing questions)</li>
<li>tree -a for nice tree list of a directory</li>
<li>check out his slides for example of cool showoff styling and layout
<p>http://github.com/schacon/showoff-wrangling-git</li>
<li>Email him to ask what he uses for his diagrams and highlights (backgrounds)</li>
<li>Would be really cool to allow a [dot] keyword in showoff to interpret the following graphviz code as a diagram</li>
<li>git log branchA ^branchB<br />
show commits reachable by A but not by B<br />
for example, I&#8217;m working on branch my-feature<br />
git log my-feature ^master<br />
is the stuff I&#8217;ve done that&#8217;s not in master yet</li>
<li>git branch &#8211;merged<br />
show me all branches that have been merged (safe to delete)</li>
<li>git branch &#8211;no-merged<br />
show me all branches that have not been merged</li>
</ul>
<h2>Day Two</h2>
<h3>Bryan Liles &#8211; Coding in Anger (or is that Desperation?)</h3>
<ul>
<li>Bryan Liles sings country</li>
<li>&#8220;run through the problem, take no prisoners&#8221; &#8230; &#8220;and undoubtedly do some bad things&#8221;</li>
<li>&#8220;we build straw houses&#8221;</li>
<li>&#8220;if you do it the wrong way just to get it done, you&#8217;ll get hit in the future&#8221;</li>
<li>Cargo Cult: &#8220;we&#8217;re all guilty of it&#8221; and &#8220;it&#8217;s bad&#8221;
<ul>
<li>Copy-pasting other people&#8217;s code without understanding it</li>
<li>&#8220;Copying code is not bad&#8221;</li>
<li>&#8220;It might do the right thing, but it might not be doing the right thing&#8221;</li>
<li>Read the code first</li>
<li>Respect the copyright</li>
<li>Understand what you copy</li>
<li>Don&#8217;t &#8220;copy and paste&#8221;</li>
<li>UNDERSTAND WHAT YOU COPY</li>
</ul>
</li>
<li>&#8220;It takes a big man to understand humility&#8221; </li>
<li>Break a task down and constantly refine task estimates</li>
<li>A desperate coder is a bad coder</li>
</ul>
<h4>bonus lightning talk: You are your own sales person</h4>
<ul>
<li>you are the product</li>
<li>you are the salesperson</li>
</ul>
<h3>Justin Love &#8211; You already use Closure</h3>
<ul>
<li>Block based programming</li>
<li>containment: f = File.read vs File.open do |f| &#8230;; end</li>
<li>You can call a proc with []<br />
proc.call(a,b) is equivalent to proc[a,b]</li>
<li>duwanis in IRC: &#8220;rack of lambda&#8221;</li>
</ul>
<h3>Nick Gauthier &#8211; Grease your Suite</h3>
<h3>Matthew Bass &#8211; A/B Testing for Developers</h3>
<ul>
<li>Choose a metric</li>
<li>Do some experiments</li>
<li>Compare the metrics</li>
<li>Vanity for rails A/B testing</li>
</ul>
<h3>Yossef Mendelssohn &#8211; The Perpetual Novice</h3>
<ul>
<li>Dryfus skill acquisition model</li>
<li>Novice level: follow the rules, do what you&#8217;re told</li>
<li>Adv. Beginner: limited ability to perceive different aspects of the situation</li>
<li>Competence: multitasking, handle more information, see how actions are related to goals</li>
<li>Proficiency: higher level view of the task, prioritize, adapt</li>
<li>Expert: no longer relying on rules and guidelines, deep &amp; tacit understanding, intuition</li>
<li>be mindful of your scenario: other people (or yourself) need to deal with the work you&#8217;ve done</li>
<li>unconscious incompetence: you don&#8217;t know what you&#8217;re doing and you don&#8217;t know that you don&#8217;t know it</li>
<li>conscious incompetence: you don&#8217;t know what you&#8217;re doing, but you know that you don&#8217;t know what you&#8217;re doing</li>
<li>conscious competence: you can do it and you understand it, but you have to think about it</li>
<li>unconscious competence: it is second nature to you. You know what you&#8217;re doing and you don&#8217;t have to try</li>
<li>Dunning-krueger effect:
<ul>
<li>when you don&#8217;t know what you don&#8217;t know, you don&#8217;t appreciate the skill itself, and are therefore very confident of yourself.</li>
<li>If you understand the skills, the more competent people think they are not very competent</li>
</ul>
</li>
<li>You need to practice, outside your main work</li>
<li>Focus on getting better, the entire time</li>
<li>low level people working together can be dangerous</li>
<li>a skilled person working with a lower level person need to work at the lower person&#8217;s level</li>
<li>Shuhari
<ul>
<li>Shu: learning fundamental techique, rules and guidelines (acceptance)</li>
<li>Ha: detach, digress, and break from tradition. think for yourself</li>
<li>Ri: transcendence: moved past rules and guidelines (no form)</li>
</ul>
</li>
<li>Shoshyu: beginner&#8217;s mind. In the beginner&#8217;s mind there are many possibilities. In an expert&#8217;s mind, there are few.
<ul>
<li>Experts have a tendency to stop asking questions</li>
<li>Beginners always ask questions</li>
</ul>
</li>
<li>Something doesn&#8217;t suck just because it&#8217;s old</li>
</ul>
<h3>Starcraft interlude</h3>
<ul>
<li>Nick Gauthier vs Bryan Liles and Saxon</li>
</ul>
<h3>Ben Scofield &#8211; Keynote</h3>
<ul>
<li>Practice is important for mastery</li>
<li>Practice is not fun</li>
<li>mastery is know how to do things, not just knowing what was done</li>
<li>mastery is not required</li>
<li>as a company, deciding what not to do is as important (or more) as deciding what to do</li>
<li>Pick out what is most important to succeed, and outsource the rest</li>
<li>errbit : open source alternative to hoptoad</li>
<li>as a company, focus on the most important stuff</li>
<li>live intentionally: think about what you&#8217;re spending your time on.</li>
<li>Embrace adequacy (and mediocrity)</li>
</ul>
<h2>Day Three</h2>
<p>Family friendly ruby conf in disney world. $189/night @ contemporary. Free conference.</p>
<p>http://magic-ruby.com</p>
<h3>Michael Jackson &#8211; Parsing Expressions in Ruby</h3>
<ul>
<li>Different school of thought alternative to regular expressions</li>
<li>Regexes are great but complicated ones get really gross, even after 10 or 12 characters</li>
<li>parsing expressions are:
<ul>
<li>declarative</li>
<li>recursive</li>
<li>readable</li>
<li>easy to maintain</li>
<li>not ambiguous</li>
<li>slow :-) (in ruby)</li>
</ul>
</li>
<li>Citrus gem</li>
</ul>
<h3>John Willis &#8211; Configuration Management in the Cloud with Chef</h3>
<ul>
<li>infrastructure as code</li>
<li>need to be able to share with teammates</li>
<li>can&#8217;t have &#8220;the deploy guy&#8221;</li>
<li>Chef is a library for configuration management</li>
<li>Chef client runs on the system (to accept commands and configuration)</li>
<li>Chef server is a RESTful API</li>
<li>Each system you configure is a Node</li>
<li>Attributes are searchable</li>
<li>Knife is the tool you use to interact with the API</li>
<li>Nodes have Roles, which describe what a Node should be</li>
<li>Nodes have a Run List
<ul>
<li>What Roles or Recipes to apply in Order</li>
</ul>
</li>
<li>A Resource is a Package or a Service</li>
<li>E.G. Package &#8220;sudo&#8221; &#8220;1.6.8p12&#8243; and it figures out what package manager to use</li>
<li>Services support actions (e.g. apache supports &#8220;restart&#8221; and &#8220;status&#8221;)</li>
<li>Resources take action through providers</li>
<li>Data bags store arbitrary data
<ul>
<li>E.G. put a user w/ their ssh key in a data bag, so you can add them as a user on the server</li>
</ul>
</li>
<li>Cookbooks are shareable</li>
<li>&#8220;Open source for infrastructure&#8221;</li>
<li>Open training</li>
<li>Cloud service independence (swap from slicehost to rackspace just by adding credentials)</li>
<li>http://www.opscode.com
<ul>
<li>5 chef servers for free</li>
</ul>
</li>
<li>@opscode @botchagalupe</li>
<li>Chef beats puppet on cloud support (more vendors)</li>
</ul>
<h3>Backchannel notes</h3>
<ul>
<li>Whiskydisk for deploy</li>
</ul>
<h3>Alex Sharp &#8211; Refactoring in Practice</h3>
<ul>
<li>Shantytown application: you want to bulldoze it, but people live there</li>
<li>testing in crucial for refactoring</li>
<li>avoid the EPIC refactor</li>
<li>changing the implementation without changing its behavior</li>
<li>deprecate action
<ul>
<li>for example, hoptoad a deprecation warning on old calls to actions</li>
<li>helpful when there are ajax calls you are not sure about</li>
</ul>
</li>
<li>take out small chunks and get them under test</li>
<li>lack of framework knowledge &#8211; often using existing solutions is an easy refactor</li>
<li>Domain driven development &amp; domain modeling</li>
<li>Document the smells</li>
<li>delete code that you aren&#8217;t using</li>
</ul>
<h3>Brian Hogan &#8211; There&#8217;s a Wheel for that Already</h3>
<ul>
<li>&#8220;I don&#8217;t want to use that because I don&#8217;t like how it looks&#8221;</li>
<li>How often is &#8220;better&#8221; really just an opinion</li>
<li>Forwardable &#8211; delegate a method to another class</li>
<li>Rails.root.join(&#8216;config&#8217;, &#8216;x.yml&#8217;)</li>
<li>dir, base = path.split</li>
<li>open-uri wraps net/http, net/https, net/ftp</li>
<li>Tempfile (like tmpdir, but just for one file)</li>
<li>x = Tempfile.new(&#8216;hydra.yml&#8217;)</li>
<li>OpenStruct.new(Yaml.load(&#8216;config.yml&#8217;))</li>
<li>Observer<br />
@@@ ruby<br />
def initialize<br />
  add_observer MyObserver.new<br />
end<br />
&#8230; later<br />
call: &#8220;changed&#8221; !</li>
<li>bash alias for serving static files via webrick<br />
I wasn&#8217;t able to write it down quick enough.</li>
<li>PStore for storing data</li>
<li>CSV is great if it doesn&#8217;t need to be faster</li>
<li>Home Run for datetime speedup via C extension</li>
<li>Oh no, I had to catch my flight and I missed the rest of this awesome talk!</li>
</ul>
<h3>Glenn Vanderburg &#8211; Keynote</h3>
<ul>
<li>Wasn&#8217;t there. See notes from Lone Star Ruby Conf. It was probably the same talk</li>
</ul>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2010/09/11/nicks-highlights-from-windy-city-rails/" rel="bookmark" class="crp_title">Nick&#8217;s Highlights from Windy City Rails</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/08/04/introducing-environmentalize-an-intuitive-environment-focused-config-structure-for-your-rails-applications/" rel="bookmark" class="crp_title">Introducing environmentalist: an intuitive, environment-focused config structure for your rails applications</a></li><li><a href="http://blog.smartlogicsolutions.com/2010/08/30/nicks-highlights-from-lone-star-ruby-conf/" rel="bookmark" class="crp_title">Nick&#8217;s Highlights from Lone Star Ruby Conf</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/06/23/dont-abuse-the-session/" rel="bookmark" class="crp_title">Don&#8217;t Abuse the Session</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/07/10/merging-a-has_many-relationship-into-one-instance/" rel="bookmark" class="crp_title">Merging a :has_many relationship into one instance</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2010/09/07/nicks-highlights-from-ruby-hoedown/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nick&#8217;s Highlights from Lone Star Ruby Conf</title>
		<link>http://blog.smartlogicsolutions.com/2010/08/30/nicks-highlights-from-lone-star-ruby-conf/</link>
		<comments>http://blog.smartlogicsolutions.com/2010/08/30/nicks-highlights-from-lone-star-ruby-conf/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 21:12:05 +0000</pubDate>
		<dc:creator>Nick Gauthier</dc:creator>
				<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Nick Gauthier]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=954</guid>
		<description><![CDATA[I recently attended and spoke at Lone Star Ruby Conf 2010. I took notes on anything technical I thought would be useful to bring back and use day-to-day at SmartLogic. Keep in mind there were many excellent talks that aren&#8217;t on this list, it&#8217;s just a snippet of things I wanted to look into more. [...]]]></description>
			<content:encoded><![CDATA[<p>I recently attended and spoke at Lone Star Ruby Conf 2010. I took notes on anything technical I thought would be useful to bring back and use day-to-day at SmartLogic. Keep in mind there were many excellent talks that aren&#8217;t on this list, it&#8217;s just a snippet of things I wanted to look into more.</p>
<p><span id="more-954"></span></p>
<h2>Day one</h2>
<h3>Adam Keys &#8211; Rails&#8217; Next Top Model: Using ActiveModel and ActiveRelation</h3>
<ul>
<li>Rails 3 &#8211; ActiveSupport::Concern</li>
<li>Accessors + Concern cleans up code</li>
<li>New encryption classes for secure keys and encrypted data transfer</li>
<li>ActiveModel::Validator for non AR validations</li>
<li>validates_with MyValidator</li>
<li>ActiveModel::Serialization for hydra?</li>
<li>serialization: require ‘attributes’ and ‘attributes=’</li>
<li>serializable_hash =&gt; to_json, to_xml, from_json, from_xml</li>
<li>ActiveRelation (AREL)</li>
</ul>
<h3>Jesse Crouch &#8211; Building fast, lightweight data-driven apps using the Infochimps API</h3>
<p>Infochimps API to create linkedin’ 2nd degree network with twitter data. Check it out at <a href="http://trst.me">http://trst.me</a></p>
<h3>Aman Gupta &#8211; Debugging Ruby: Understanding and Troubleshooting the VM and your Application</h3>
<p>Slides: http://dl.dropbox.com/u/635/debugging_ruby-lsrc.pdf</p>
<ul>
<li>lsof -nPp : get open files for a specific pid</li>
<li>strace: observe functions being called. Can see reads and writes between processes, like rails hitting mysql</li>
<li>compile ruby w/ &#8211;enable-pthreads (not by default in debian or in rvm)</li>
<li>See http://rvm.beginrescueend.com/rubies/installing/ end of page for how to do this via RVM</li>
<li>tcpdump for networking</li>
<li>google perftools for ruby profiling</li>
<li>pprof ruby =&gt; graphical output</li>
<li>home_run for C based time parsing</li>
<li>perftools.rb for ruby diagrams of usage time</li>
<li>gdb.rb to executive ruby from gdb, when running ruby via gdb</li>
<li>bleak house: ruby memory leak detector</li>
<li>rack-perftools: rack middleware for perftools.rb</li>
<li>google perftools for forking</li>
</ul>
<h3>Caleb Clausen – What every Ruby programmer should know about threads</h3>
<ul>
<li>Thread safe objects: mutex, queue, sizequeue, condition variable</li>
<li>Semaphores to signal between threads</li>
<li>Mutex to lock and unlock resources</li>
</ul>
<h3>Jesse Wolgamott &#8211; Battle of NoSQL stars: Amazon&#8217;s SDB vs Mongoid vs CouchDB vs RavenDB</h3>
<ul>
<li>CouchDB is ACID, has great replication</li>
<li>Mongo has great rails support</li>
</ul>
<h2>Day two</h2>
<h3>James Edward Gray II &#8211; Ruby in the Wild</h3>
<ul>
<li>Logarithmic graphs!</li>
<li>Rubyists like to do a lot of stuff from scratch</li>
<li>&#8220;I&#8217;ve always been a fan of sqlite&#8221; &#8211; wha?</li>
<li>For fun, scatch an itch, try something new</li>
<li>&#8220;I try to make it a fun place [to work]&#8220;</li>
<li>Greg Brown wearing a Boh hat for his interview</li>
<li>Core of rake written in 30 mins</li>
<li>Rake file list in place of Dir.glob for hydra? (FileList ?)</li>
<li>File matching to compare input (source) and output (binary). Maybe for Sauron?</li>
</ul>
<h3>Chat with Scott Bellware</h3>
<p>I had a great chat with Scott Bellware about Agile, Lean, and his own style of OO integration testing. He recommended this book:</p>
<p><a href="http://www.amazon.com/gp/product/1935401009?ie=UTF8&#038;force-full-site=1">The Principles of Product Development Flow: Second Generation Lean Product Development</a></p>
<p>Also, he sent me a link to how he does his OO testing scenarios:</p>
<p><a href="http://github.com/sbellware/preview-signup">http://github.com/sbellware/preview-signup</a></p>
<p>I flew back after lunch on day two, so I&#8217;ll have to catch the rest in the videos!</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2010/09/07/nicks-highlights-from-ruby-hoedown/" rel="bookmark" class="crp_title">Nick&#8217;s Highlights from Ruby Hoedown</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/11/23/web-2-0-expo-nyc-wrap-up/" rel="bookmark" class="crp_title">Web 2.0 Expo NYC Wrap Up</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/09/19/fork-pools-in-ruby-on-rails/" rel="bookmark" class="crp_title">Fork Pools in Ruby on Rails</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/06/11/multithreading-in-ruby-on-rails/" rel="bookmark" class="crp_title">Multithreading in Ruby on Rails</a></li><li><a href="http://blog.smartlogicsolutions.com/2007/05/07/sls-welcomes-scott-davis-to-the-team/" rel="bookmark" class="crp_title">SLS Welcomes Scott Davis to the Team</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2010/08/30/nicks-highlights-from-lone-star-ruby-conf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Directory Conventions for Rack Middleware RubyGems</title>
		<link>http://blog.smartlogicsolutions.com/2010/05/13/directory-conventions-for-rack-middleware-rubygems/</link>
		<comments>http://blog.smartlogicsolutions.com/2010/05/13/directory-conventions-for-rack-middleware-rubygems/#comments</comments>
		<pubDate>Thu, 13 May 2010 15:48:27 +0000</pubDate>
		<dc:creator>John Trupiano</dc:creator>
				<category><![CDATA[John Trupiano]]></category>
		<category><![CDATA[Rack]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[conventions]]></category>
		<category><![CDATA[gems]]></category>
		<category><![CDATA[middleware]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=896</guid>
		<description><![CDATA[I just wanted to make a quick note about directory conventions for rack middleware gems. For all gems you should follow the convention of housing all of your code inside a single file and directory of the same name as your gem within lib, e.g. $> ls -l ~/projects/timecop/lib drwxr-xr-x 5 john staff 170 Jan [...]]]></description>
			<content:encoded><![CDATA[<p>I just wanted to make a quick note about directory conventions for rack middleware gems.  For all gems you should follow the convention of housing all of your code inside a single file and directory of the same name as your gem within lib, e.g.</p>
<p><code><br />
$> ls -l ~/projects/timecop/lib<br />
drwxr-xr-x  5 john  staff  170 Jan 14 20:31 timecop<br />
-rw-r--r--  1 john  staff   82 Jan 14 20:31 timecop.rb<br />
</code></p>
<p>The reason for this is related to how RubyGems hijacks Ruby&#8217;s require method.  When a gem is activated its lib/ folder is added to the load path.  This means that anything inside that directory is now accessible via the require method.  In order to avoid file naming collisions across gems, you must name these exactly the same as your gem. (see <a href="http://i-dont-trust-your-code.heroku.com/">slides for I Don&#8217;t Trust Your Code</a> for a more complete discussions of this)</p>
<p>However, this is slightly different with rack gems.  The convention for naming rack middleware is by using a dash, e.g. rack-rewrite.  The convention for requiring rack middleware though is to replace that dash with a slash, e.g. <code>require 'rack/rewrite'</code>.</p>
<p>The convention I&#8217;ve adopted for structuring rack middleware within a gem is to include a file by the same name as the gem and a rack directory in lib/, and then to include the second part of the middleware name as a subdirectory under that.</p>
<p><code><br />
~/projects/rack-rewrite (master) $> ls -l lib/<br />
total 8<br />
drwxr-xr-x  4 john  staff  136 Apr 17 18:02 rack<br />
-rw-r--r--@ 1 john  staff   22 Apr 17 18:02 rack-rewrite.rb</p>
<p>~/projects/rack-rewrite (master) $> ls -l lib/rack<br />
total 8<br />
drwxr-xr-x  3 john  staff  102 May 13 11:09 rewrite<br />
-rw-r--r--@ 1 john  staff  827 Apr 17 18:02 rewrite.rb<br />
</code></p>
<p>This allows my users to use either <code>require 'rack-rewrite'</code> or <code>require 'rack/rewrite'</code>.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2010/05/13/rack-rewrite-1-0-0-released/" rel="bookmark" class="crp_title">Rack::Rewrite 1.0.0 Released</a></li><li><a href="http://blog.smartlogicsolutions.com/2010/01/06/rack-rewrite-0-2-1-released/" rel="bookmark" class="crp_title">Rack::Rewrite 0.2.1 Released</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/11/16/rack-rewrite-for-site-maintenance-and-downtime/" rel="bookmark" class="crp_title">Rack::Rewrite for Site Maintenance and Downtime</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/11/24/rack-rewrite-google-analytics-makes-site-transitions-seamless/" rel="bookmark" class="crp_title">Rack::Rewrite + Google Analytics Makes Site Transitions Seamless</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/05/26/including-external-rake-files-in-your-projects-rakefile-keep-your-rake-tasks-organized/" rel="bookmark" class="crp_title">Including external .rake files in your project&#8217;s Rakefile &#8212; keep your rake tasks organized!</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2010/05/13/directory-conventions-for-rack-middleware-rubygems/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Rack::Rewrite 1.0.0 Released</title>
		<link>http://blog.smartlogicsolutions.com/2010/05/13/rack-rewrite-1-0-0-released/</link>
		<comments>http://blog.smartlogicsolutions.com/2010/05/13/rack-rewrite-1-0-0-released/#comments</comments>
		<pubDate>Thu, 13 May 2010 15:25:16 +0000</pubDate>
		<dc:creator>John Trupiano</dc:creator>
				<category><![CDATA[John Trupiano]]></category>
		<category><![CDATA[Rack]]></category>
		<category><![CDATA[rack-rewrite]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rubygem]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=893</guid>
		<description><![CDATA[Rack::Rewrite 1.0.0 has just been released. To install simply run: gem install rack-rewrite. Rack::Rewrite is a web-server agnostic rack middleware for defining and applying rewrite rules. In many cases you can get away with Rack::Rewrite instead of writing Apache mod_rewrite rules. Documentation is hosted at RubyForge. The source code is hosted at GitHub. Updates include: [...]]]></description>
			<content:encoded><![CDATA[<p>Rack::Rewrite 1.0.0 has just been released.  To install simply run: <code>gem install rack-rewrite</code>.</p>
<p>Rack::Rewrite is a web-server agnostic rack middleware for defining and applying rewrite rules. In many cases you can get away with Rack::Rewrite instead of writing Apache mod_rewrite rules.</p>
<p>Documentation is hosted at <a href="http://johntrupiano.rubyforge.org/rack-rewrite/">RubyForge</a>.  The source code is hosted at <a href="http://github.com/jtrupiano/rack-rewrite">GitHub</a>.</p>
<p>Updates include:</p>
<p><span id="more-893"></span></p>
<p><strong>API</strong></p>
<ul>
<li>Fix rack 1.1.0 / rails3 compatibility by eliminating reliance on REQUEST_URI env param.  Paths are now constructed with PATH_INFO and QUERY_STRING</li>
<li>Follow rack directory/require convention: require &#8216;rack/rewrite&#8217; instead of &#8216;rack-rewrite&#8217;</li>
<li>Include an HTML anchor tag linked to where the URL being redirected to in the body of 301&#8242;s and 302&#8242;s</li>
</ul>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2010/01/06/rack-rewrite-0-2-1-released/" rel="bookmark" class="crp_title">Rack::Rewrite 0.2.1 Released</a></li><li><a href="http://blog.smartlogicsolutions.com/2010/05/13/directory-conventions-for-rack-middleware-rubygems/" rel="bookmark" class="crp_title">Directory Conventions for Rack Middleware RubyGems</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/11/16/rack-rewrite-for-site-maintenance-and-downtime/" rel="bookmark" class="crp_title">Rack::Rewrite for Site Maintenance and Downtime</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/11/24/rack-rewrite-google-analytics-makes-site-transitions-seamless/" rel="bookmark" class="crp_title">Rack::Rewrite + Google Analytics Makes Site Transitions Seamless</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/09/20/timecop-0-3-0-released/" rel="bookmark" class="crp_title">Timecop 0.3.0 Released</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2010/05/13/rack-rewrite-1-0-0-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting Up Ubuntu 9.10 for Ruby On Rails Development</title>
		<link>http://blog.smartlogicsolutions.com/2010/02/01/setting-up-ubuntu-9-10-for-ruby-on-rails-development/</link>
		<comments>http://blog.smartlogicsolutions.com/2010/02/01/setting-up-ubuntu-9-10-for-ruby-on-rails-development/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 21:09:31 +0000</pubDate>
		<dc:creator>Adam Bachman</dc:creator>
				<category><![CDATA[Adam Bachman]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Passenger]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Enterprise Edition]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[environment]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=860</guid>
		<description><![CDATA[This is a document I put together at the beginning of 2010 while building yet another Ubuntu VM, digging through our internal documentation to try and find out what I needed. We've got the answers, and generally Ruby, Rails, and Ubuntu are pretty good about telling you how to install tools if you don't have them yet.

But the answers are spread out and distributed randomly. Plus, I can only see "The program '______' is currently not installed. You can install it by typing: sudo apt-get install ______" so many times before I lose interest and put off the task.

So, to prevent future headaches and help all of us out, I put together a how-to that can take a new Rails system from zero to code in a few minutes (depending on network speed) instead of half a day.]]></description>
			<content:encoded><![CDATA[<p>This is a document I put together at the beginning of 2010 while building yet another Ubuntu VM, digging through our internal documentation to try and find out what I needed. We&#8217;ve got the answers, and generally Ruby, Rails, and Ubuntu are pretty good about telling you how to install tools if you don&#8217;t have them yet.</p>
<p>But the answers are spread out and distributed randomly. Plus, I can only see &#8220;The program &#8216;______&#8217; is currently not installed. You can install it by typing: sudo apt-get install ______&#8221; so many times before I lose interest and put off the task.</p>
<p><span id="more-860"></span></p>
<p>So, to prevent future headaches and help all of us out, I put together a how-to that can take a new Rails system from zero to code in a few minutes (depending on network speed) instead of half a day. With no further ado,</p>
<h2>Setting up an Ubuntu box for Rails Development (including virtual machines)</h2>
<h4>Update everything</h4>
<pre>$ sudo aptitude update &amp;&amp; sudo aptitude dist-upgrade</pre>
<h4>Install necessary packages</h4>
<pre>$ sudo aptitude install build-essential vim \
  vim-runtime git-core subversion libsqlite3-dev</pre>
<p>We have projects in git (the newer ones) and svn, so we have to be able to switch fluidly between the two.</p>
<p>And I&#8217;m not trying to start a flame war, but Vim is the first choice for Rails development. You don&#8217;t have to take my word for it; <a href="http://weblog.jamisbuck.org/2008/10/10/coming-home-to-vim">Jamis Buck</a>, <a href="http://github.com/tpope">Tim Pope</a>, and <a href="http://www.adamlowe.me/2009/12/vim-destroys-all-other-rails-editors.html">Adam Lowe</a> all say the same. I recommend the NERDTree, FuzzyFinderTextMate, BufExplorer, and rails.vim plugins if nothing else.</p>
<h4>Install ruby</h4>
<pre>$ sudo aptitude install ruby1.8 ruby rdoc ruby1.8-dev \
  libpgsql-ruby1.8 libmysql-ruby1.8 irb libopenssl-ruby</pre>
<h4>Get rubygems from source. <a href="http://docs.rubygems.org/">http://docs.rubygems.org/</a></h4>
<pre>$ wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz</pre>
<pre>$ tar xzvf rubygems-1.3.5.tgz</pre>
<pre>$ cd rubygems-1.3.5</pre>
<pre>$ sudo ruby setup.rb</pre>
<pre>$ sudo ln -s /usr/bin/gem1.8 /usr/bin/gem</pre>
<pre>$ sudo gem update --system</pre>
<h4>Update ~/.gemrc (at least the :sources: chunk)</h4>
<pre>---
gem: --no-ri --no-rdoc
:benchmark: false
:verbose: true
:backtrace: false
:update_sources: true
:sources:
- http://gemcutter.org
- http://gems.rubyforge.org/
- http://gems.github.com</pre>
<h4>Install and setup Passenger (optional)</h4>
<pre>$ sudo apt-get install apache2-prefork-dev</pre>
<pre>$ sudo gem install passenger</pre>
<pre>$ sudo passenger-install-apache2-module</pre>
<p>and follow the instructions passenger gives you. Most folks in the office run some form of an Apache-Passenger stack for development purposes. I can explain how that setup works in a future post.</p>
<h4>Install geminstaller</h4>
<pre>$ sudo gem install geminstaller</pre>
<p>Almost all of our legacy projects use <a href="http://geminstaller.rubyforge.org/">geminstaller</a> to manage gem dependencies. In the future, new projects will be moving to <a href="http://github.com/wycats/bundler">Bundler</a>, but legacy projects matter and upgrading subsystems is not always justified.</p>
<p>&#8220;If it ain&#8217;t broke, don&#8217;t fix it&#8221; and the corollary: &#8220;because you probably won&#8217;t be able to bill it to the client&#8221; both apply.</p>
<h4>Install common packages (optional, may be required by projects)</h4>
<pre>$ sudo aptitude install imagemagick</pre>
<pre>$ sudo gem install utility_belt open_gem redgreen</pre>
<p>The first (imagemagick) is used by the Paperclip gem to manage files attached to Rails models. The second are tools that make Rails development more manageable on the command line. I highly recommend them. Besides, I&#8217;ve been sneaking redgreen in as a test dependency on our projects, so if you&#8217;re a developer here you&#8217;ll have to install it anyways.</p>
<h4>Create an ssh key (follow instructions)</h4>
<pre>$ ssh-keygen</pre>
<h3>EXAMPLE PROJECT</h3>
<p>All the stuff above won&#8217;t let you test-code-deploy without hassles, so here&#8217;s a sample run through of what the last mile of project-specific setup looks like.</p>
<h4>Get the project. SVN, Git, whatever. Go to it.</h4>
<pre>$ svn co rails-project</pre>
<pre>$ cd rails-project</pre>
<h4>Run geminstaller</h4>
<pre>$ sudo geminstaller                                 # normal</pre>
<pre>$ sudo geminstaller -c config/test/geminstaller.yml # test env</pre>
<h4>Install necessary aptitude packages</h4>
<pre>$ sudo aptitude install texlive-latex-base</pre>
<p>Don&#8217;t ask.</p>
<h4>Create the test database</h4>
<p>Mysql:</p>
<pre>$ rake RAILS_ENV=test db:create</pre>
<p>Postgres (using your username or DB username in place of &#8220;username&#8221;):</p>
<pre>$ sudo -u postgres psql</pre>
<pre>postgres=# CREATE USER username SUPERUSER;</pre>
<pre>postgres=# CREATE DATABASE username OWNER username;</pre>
<p>If you get an error regarding PGconn.quote_ident (Rails 2.3.x on Ubuntu 8.04) patch <code>activerecord-2.3.4/lib/active_record/connection_adapters/postgresql_adapter.rb</code> and add the following:</p>
<pre>def PGconn.quote_ident(name)
  %("#{name}")
end</pre>
<p>immediately after the &#8220;class PGresult&#8221; definition at the top of the file. Once that&#8217;s all done, the following:</p>
<pre>$ rake RAILS_ENV=test db:create</pre>
<pre>$ rake RAILS_ENV=test db:schema:load</pre>
<pre>$ rake RAILS_ENV=test test</pre>
<p>should work.</p>
<h3>go have fun, write code, blow our minds</h3>
<p>So that&#8217;s how we roll. Awkward requirements will still crop up as we pick up new projects (or very old projects) so you&#8217;ll always need a bit of apt/gem fu to get you through the day. Leave questions here or drop me a line at <a href="mailto:adam@smartlogicsolutions.com">adam@smartlogicsolutions.com</a> or <a href="http://twitter.com/abachman">http://twitter.com/abachman</a>.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2008/07/07/i-cant-upgrade-rubygems-from-111-to-120-on-ubuntu/" rel="bookmark" class="crp_title">I can&#8217;t upgrade RubyGems from 1.1.1 to 1.2.0 on Ubuntu</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/04/26/integrity-ci-on-passenger-222-with-ruby-enterprise-edition-on-ubuntu-804/" rel="bookmark" class="crp_title">Integrity CI on Passenger 2.2.2 with Ruby Enterprise Edition on Ubuntu 8.04</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/01/14/aptinstaller-032-released/" rel="bookmark" class="crp_title">Aptinstaller 0.3.2 Released</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/08/04/introducing-environmentalize-an-intuitive-environment-focused-config-structure-for-your-rails-applications/" rel="bookmark" class="crp_title">Introducing environmentalist: an intuitive, environment-focused config structure for your rails applications</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/06/06/deploying-rails-apps-with-capistrano-without-root-or-sudo-privileges/" rel="bookmark" class="crp_title">Deploying Rails Apps with Capistrano without root or sudo Privileges</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2010/02/01/setting-up-ubuntu-9-10-for-ruby-on-rails-development/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Rack::Rewrite 0.2.1 Released</title>
		<link>http://blog.smartlogicsolutions.com/2010/01/06/rack-rewrite-0-2-1-released/</link>
		<comments>http://blog.smartlogicsolutions.com/2010/01/06/rack-rewrite-0-2-1-released/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 22:51:29 +0000</pubDate>
		<dc:creator>John Trupiano</dc:creator>
				<category><![CDATA[John Trupiano]]></category>
		<category><![CDATA[Rack]]></category>
		<category><![CDATA[rack-rewrite]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rubygem]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=820</guid>
		<description><![CDATA[Rack::Rewrite 0.2.1 has just been released. To install simply run: gem install rack-rewrite. Rack::Rewrite is a web-server agnostic rack middleware for defining and applying rewrite rules. In many cases you can get away with Rack::Rewrite instead of writing Apache mod_rewrite rules. Documentation is hosted at RubyForge. The source code is hosted at GitHub. Updates include: [...]]]></description>
			<content:encoded><![CDATA[<p>Rack::Rewrite 0.2.1 has just been released.  To install simply run: <code>gem install rack-rewrite</code>.</p>
<p>Rack::Rewrite is a web-server agnostic rack middleware for defining and applying rewrite rules. In many cases you can get away with Rack::Rewrite instead of writing Apache mod_rewrite rules.</p>
<p>Documentation is hosted at <a href="http://johntrupiano.rubyforge.org/rack-rewrite/">RubyForge</a>.  The source code is hosted at <a href="http://github.com/jtrupiano/rack-rewrite">GitHub</a>.</p>
<p>Updates include:</p>
<p><span id="more-820"></span></p>
<p><strong>API</strong></p>
<ul>
<li>Implement $&#038; substitution pattern (thanks to <a href="http://github.com/bhb">Ben Brinckerhoff</a>)</li>
</ul>
<p><strong>Maintenance</strong></p>
<ul>
<li>Ignore empty captures instead of failing during subsitution (thanks to <a href="http://github.com/bhb">Ben Brinckerhoff</a>)</li>
<li>Play nice with Rack::Test requests which only set PATH_INFO and not REQUEST_URI (thanks to <a href="http://github.com/docunext">@docunext</a>)</li>
<li>Use QUERY_STRING instead of QUERYSTRING as per Rack spec.  Closes Issue #1.</li>
</ul>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2010/05/13/rack-rewrite-1-0-0-released/" rel="bookmark" class="crp_title">Rack::Rewrite 1.0.0 Released</a></li><li><a href="http://blog.smartlogicsolutions.com/2010/05/13/directory-conventions-for-rack-middleware-rubygems/" rel="bookmark" class="crp_title">Directory Conventions for Rack Middleware RubyGems</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/11/16/rack-rewrite-for-site-maintenance-and-downtime/" rel="bookmark" class="crp_title">Rack::Rewrite for Site Maintenance and Downtime</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/11/24/rack-rewrite-google-analytics-makes-site-transitions-seamless/" rel="bookmark" class="crp_title">Rack::Rewrite + Google Analytics Makes Site Transitions Seamless</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/09/20/timecop-0-3-0-released/" rel="bookmark" class="crp_title">Timecop 0.3.0 Released</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2010/01/06/rack-rewrite-0-2-1-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Timecop 0.3.4 Released</title>
		<link>http://blog.smartlogicsolutions.com/2009/12/07/timecop-0-3-4-released/</link>
		<comments>http://blog.smartlogicsolutions.com/2009/12/07/timecop-0-3-4-released/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 21:39:06 +0000</pubDate>
		<dc:creator>John Trupiano</dc:creator>
				<category><![CDATA[John Trupiano]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TATFT]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[rubygem]]></category>
		<category><![CDATA[tatft]]></category>
		<category><![CDATA[timecop]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=794</guid>
		<description><![CDATA[Timecop 0.3.4 has just been released. To install simply run: gem install timecop. Timecop is a RubyGem providing &#8220;time travel&#8221; and &#8220;time freezing&#8221; capabilities, making it dead simple to test time-dependent code. It provides a unified method to mock Time.now, Date.today, and DateTime.now in a single call. Documentation is hosted at RubyForge. The source code [...]]]></description>
			<content:encoded><![CDATA[<p>Timecop 0.3.4 has just been released.  To install simply run: <code>gem install timecop</code>.</p>
<p>Timecop is a RubyGem providing &#8220;time travel&#8221; and &#8220;time freezing&#8221; capabilities, making it dead simple to test time-dependent code.  It provides a unified method to mock Time.now, Date.today, and DateTime.now in a single call.</p>
<p>Documentation is hosted at <a href="http://johntrupiano.rubyforge.org/timecop/">RubyForge</a>.  The source code is hosted at <a href="http://github.com/jtrupiano/timecop">GitHub</a>.</p>
<p>Updates include:</p>
<p><span id="more-794"></span></p>
<p><strong>Maintenance</strong></p>
<ul>
<li>Fix various timezone-related issues.  Notably, when traveling to a DateTime<br />
    instance specified in a non-local timezone, convert provided DateTime<br />
    instance to a local instance and return that from DateTime.now.<br />
    Code contributed by Michaël Witrant [<a href="http://github.com/piglop">piglop</a>]
</li>
<li>Fix bug that would not allow Timecop to be used when Ruby&#8217;s &#8216;date&#8217;<br />
    library had not been previously loaded.<br />
    Code contributed by Tuomas Kareinen [<a href="http://github.com/tuomas">tuomas</a>]
</li>
<li>Fix bug when traveling to a DateTime across a DST boundary that<br />
    resulted in DateTime&#8217;s being off by an hour.
</li>
<li>Migrate argument parsing into Timecop::TimeStackItem to reduce the<br />
    responsibility of the Timecop class.
</li>
</ul>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2009/09/20/timecop-0-3-0-released/" rel="bookmark" class="crp_title">Timecop 0.3.0 Released</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/12/24/timecop-2-released-freeze-and-rebase-time-ruby/" rel="bookmark" class="crp_title">Timecop 0.2.0 Released: Freeze and Rebase Time in Ruby</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/11/19/timecop-freeze-time-in-ruby-for-better-testing/" rel="bookmark" class="crp_title">Timecop: Freeze Time in Ruby for Better Testing</a></li><li><a href="http://blog.smartlogicsolutions.com/2010/05/13/rack-rewrite-1-0-0-released/" rel="bookmark" class="crp_title">Rack::Rewrite 1.0.0 Released</a></li><li><a href="http://blog.smartlogicsolutions.com/2010/01/06/rack-rewrite-0-2-1-released/" rel="bookmark" class="crp_title">Rack::Rewrite 0.2.1 Released</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2009/12/07/timecop-0-3-4-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

