<?xml version="1.0"?>
<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom">
   <channel>
      <title>Ruby and/or Rails</title>
      <description>Pipes Output</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=nDr4vAkP3BGAwuIYlvXiAA</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=nDr4vAkP3BGAwuIYlvXiAA&amp;_render=rss&amp;page=2"/>
      <pubDate>Thu, 01 Oct 2015 01:33:19 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <item>
         <title>Double Shot #1558</title>
         <link>http://afreshcup.com/home/2015/9/30/double-shot-1558.html</link>
         <description>&lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.loggly.com/ultimate-guide/&quot;&gt;Ultimate Guide for Logging&lt;/a&gt;&lt;/strong&gt; - Crowdsourced resource hosted by Loggly but with info on a bunch of different tools.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.gitcolony.com/&quot;&gt;Gitcolony&lt;/a&gt;&lt;/strong&gt; - Hosted or on-premises git solution with an emphasis on code reviews.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/printercu/rails_stuff&quot;&gt;rails_stuff&lt;/a&gt;&lt;/strong&gt; - A medley of little modules and helpers for Rails.&lt;/li&gt;
&lt;/ul&gt;</description>
         <author>Mike Gunderloy</author>
         <guid isPermaLink="false">http://afreshcup.com/home/2015/9/30/double-shot-1558.html</guid>
         <pubDate>Wed, 30 Sep 2015 11:40:12 +0000</pubDate>
      </item>
      <item>
         <title>Double Shot #1557</title>
         <link>http://afreshcup.com/home/2015/9/29/double-shot-1557.html</link>
         <description>&lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.hashicorp.com/blog/nomad.html&quot;&gt;Nomad&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.hashicorp.com/blog/otto.html&quot;&gt;Otto&lt;/a&gt;&lt;/strong&gt; - New resource manager/scheduler and orchestration tool from Hashicorp.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.nemil.com/musings/shinyandnew.html&quot;&gt;chasing the shiny and new&lt;/a&gt;&lt;/strong&gt; - Thoughts on the trend in developers of always needing to be moving to the latest language. &lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://blog.phusion.nl/2015/09/14/monitor-and-analyze-your-passenger-applications-with-union-station/&quot;&gt;Monitor and analyzer your Passenger apps today with Union Station&lt;/a&gt;&lt;/strong&gt; - Phusion has built a custom app monitoring solution specifically for their own server.&lt;/li&gt;
&lt;/ul&gt;</description>
         <author>Mike Gunderloy</author>
         <guid isPermaLink="false">http://afreshcup.com/home/2015/9/29/double-shot-1557.html</guid>
         <pubDate>Tue, 29 Sep 2015 11:27:12 +0000</pubDate>
      </item>
      <item>
         <title>Double Shot #1556</title>
         <link>http://afreshcup.com/home/2015/9/28/double-shot-1556.html</link>
         <description>&lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.zulip.org/&quot;&gt;Zulip&lt;/a&gt;&lt;/strong&gt; - Open source group chat from Dropbox.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://webxray.org/&quot;&gt;webXray&lt;/a&gt;&lt;/strong&gt; - Run-it-yourself analyzer to see which web pages are pinging which trackers.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.michelada.io/whats-new-in-rails-5&quot;&gt;What's new in Rails 5?&lt;/a&gt;&lt;/strong&gt; - Another rundown on the major features that are coming down the pike.&lt;/li&gt;
&lt;/ul&gt;</description>
         <author>Mike Gunderloy</author>
         <guid isPermaLink="false">http://afreshcup.com/home/2015/9/28/double-shot-1556.html</guid>
         <pubDate>Mon, 28 Sep 2015 11:05:33 +0000</pubDate>
      </item>
      <item>
         <title>Generating Word Search Puzzles</title>
         <link>http://weblog.jamisbuck.org/2015/9/26/generating-word-search-puzzles.html</link>
         <description>A walk-through of the author's word search puzzle generator
 — 7-minute read&lt;img src=&quot;http://feeds.feedburner.com/~r/buckblog/~4/-C3NJaQKGv8&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">http://weblog.jamisbuck.org/2015/9/26/generating-word-search-puzzles.html</guid>
         <pubDate>Sat, 26 Sep 2015 06:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Double Shot #1555</title>
         <link>http://afreshcup.com/home/2015/9/21/double-shot-1555.html</link>
         <description>&lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.learnenough.com/command-line&quot;&gt;Learn Enough Command Line to Be Dangerous&lt;/a&gt;&lt;/strong&gt; - Draft ebook from Michael Hartl for you Rails developers.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://daniel.haxx.se/blog/2015/09/16/a-curl-cheat-sheet/&quot;&gt;A Curl Cheat Sheet&lt;/a&gt;&lt;/strong&gt; - Condensed list of the most common command line options for curl.&lt;/li&gt;
&lt;/ul&gt;</description>
         <author>Mike Gunderloy</author>
         <guid isPermaLink="false">http://afreshcup.com/home/2015/9/21/double-shot-1555.html</guid>
         <pubDate>Mon, 21 Sep 2015 11:47:53 +0000</pubDate>
      </item>
      <item>
         <title>Default Scopes are an Anti-Pattern</title>
         <link>http://weblog.jamisbuck.org/2015/9/19/default-scopes-anti-pattern.html</link>
         <description>ActiveRecord's default_scope feature is exposed as an anti-pattern, with examples showing two common ways it is abused. It is proposed that explicit scopes are a superior solution
 — 5-minute read&lt;img src=&quot;http://feeds.feedburner.com/~r/buckblog/~4/znXk5QCxeAU&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">http://weblog.jamisbuck.org/2015/9/19/default-scopes-anti-pattern.html</guid>
         <pubDate>Sat, 19 Sep 2015 06:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Double Shot #1554</title>
         <link>http://afreshcup.com/home/2015/9/18/double-shot-1554.html</link>
         <description>&lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://medium.com/@sylvain.joyeux/flexmock-revival-flexmock-2-0-released-f0aa3f4a364c&quot;&gt;flex mock revival: flex mock 2.0 released!&lt;/a&gt;&lt;/strong&gt; - One of the late Jim Weirich's gems has a new maintainer and a new version.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/ndenev/mpssh&quot;&gt;mpssh&lt;/a&gt;&lt;/strong&gt; - Tool for executing commands on multiple ssh servers in parallel.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://tenderlove.github.io/heap-analyzer/&quot;&gt;Not Very Good MRI Heap Analyzer&lt;/a&gt;&lt;/strong&gt; - A way to get a look at the heap dump from a Rails application.&lt;/li&gt;
&lt;/ul&gt;</description>
         <author>Mike Gunderloy</author>
         <guid isPermaLink="false">http://afreshcup.com/home/2015/9/18/double-shot-1554.html</guid>
         <pubDate>Fri, 18 Sep 2015 11:53:22 +0000</pubDate>
      </item>
      <item>
         <title>Double Shot #1553</title>
         <link>http://afreshcup.com/home/2015/9/17/double-shot-1553.html</link>
         <description>&lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.scoutapp.com/articles/2015/09/16/profiling-rails-with-stackprof&quot;&gt;StackProf: The Holy Grail of Rails Profiling&lt;/a&gt;&lt;/strong&gt; - How to get some insight into production code without bollixing it up.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://htty.github.io/htty/&quot;&gt;htty, the HTTP TTY&lt;/a&gt;&lt;/strong&gt; - A more or less fun way to interact with web servers from the command line.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://openseadragon.github.io/&quot;&gt;OpenSeadragon&lt;/a&gt;&lt;/strong&gt; - Pure JS image viewer offering support for high-resolution zoomable images.&lt;/li&gt;
&lt;/ul&gt;</description>
         <author>Mike Gunderloy</author>
         <guid isPermaLink="false">http://afreshcup.com/home/2015/9/17/double-shot-1553.html</guid>
         <pubDate>Thu, 17 Sep 2015 11:05:59 +0000</pubDate>
      </item>
      <item>
         <title>Double Shot #1552</title>
         <link>http://afreshcup.com/home/2015/9/14/double-shot-1552.html</link>
         <description>&lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://etia.co.uk/&quot;&gt;Crab&lt;/a&gt;&lt;/strong&gt; - Command-line SQL interface to your file system.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://ipfs.io/ipfs/QmNhFJjGcMPqpuYfxL62VVB9528NXqDNMFXiqN5bgFYiZ1/its-time-for-the-permanent-web.html&quot;&gt;HTTP is obsolete. It's time for the distributed, permanent web&lt;/a&gt;&lt;/strong&gt; - Neocities is implementing IPFS for distributed web sites.&lt;/li&gt;
&lt;/ul&gt;</description>
         <author>Mike Gunderloy</author>
         <guid isPermaLink="false">http://afreshcup.com/home/2015/9/14/double-shot-1552.html</guid>
         <pubDate>Mon, 14 Sep 2015 11:40:42 +0000</pubDate>
      </item>
      <item>
         <title>Little Things: Heredocs</title>
         <link>http://weblog.jamisbuck.org/2015/9/12/little-things-heredocs.html</link>
         <description>Another minor-but-useful feature of Ruby&amp;mdash;heredocs&amp;mdash;is demonstrated
 — 4-minute read&lt;img src=&quot;http://feeds.feedburner.com/~r/buckblog/~4/kkaYUfqCm1E&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">http://weblog.jamisbuck.org/2015/9/12/little-things-heredocs.html</guid>
         <pubDate>Sat, 12 Sep 2015 06:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Double Shot #1551</title>
         <link>http://afreshcup.com/home/2015/9/10/double-shot-1551.html</link>
         <description>&lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://httpbin.org/&quot;&gt;httpbin&lt;/a&gt;&lt;/strong&gt; - Online HTTP request/response service for testing a wide variety of endpoints in your client code.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://flexboxin5.com/&quot;&gt;flexbox in 5 minutes&lt;/a&gt;&lt;/strong&gt; - Learn the ins and outs of this new CSS feature in an interactive tour.&lt;/li&gt;
&lt;/ul&gt;</description>
         <author>Mike Gunderloy</author>
         <guid isPermaLink="false">http://afreshcup.com/home/2015/9/10/double-shot-1551.html</guid>
         <pubDate>Thu, 10 Sep 2015 12:31:09 +0000</pubDate>
      </item>
      <item>
         <title>Double Shot #1550</title>
         <link>http://afreshcup.com/home/2015/9/9/double-shot-1550.html</link>
         <description>&lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.kickstarter.com/projects/909377477/rails-composer-with-rails-tutorials?ref=project_link&quot;&gt;Rails Composer with Rails Tutorials&lt;/a&gt;&lt;/strong&gt; - Kickstarter trying to fund further development on this &quot;Rails generator on steroids&quot;.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.justinweiss.com/blog/2015/09/08/keeping-your-logs-from-becoming-an-unreadable-mess/&quot;&gt;Keeping Your Logs from Becoming an Unreadable Mess&lt;/a&gt;&lt;/strong&gt; - Using tagged logging in Rails.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://vaidehijoshi.github.io/blog/2015/09/08/youve-got-mail-action-mailer-plus-letter-opener/&quot;&gt;You've got Mail: Action Mailer + Letter_Opener&lt;/a&gt;&lt;/strong&gt; - A gem to open mails inside browser tabs during development.&lt;/li&gt;
&lt;/ul&gt;</description>
         <author>Mike Gunderloy</author>
         <guid isPermaLink="false">http://afreshcup.com/home/2015/9/9/double-shot-1550.html</guid>
         <pubDate>Wed, 09 Sep 2015 11:35:10 +0000</pubDate>
      </item>
      <item>
         <title>Little Things: Hashes &amp; Procs</title>
         <link>http://weblog.jamisbuck.org/2015/9/5/little-things-hashes-and-procs.html</link>
         <description>The interchangability of hashes and arity-1 procs is demonstrated as one of the endearing little features of Ruby
 — 3-minute read&lt;img src=&quot;http://feeds.feedburner.com/~r/buckblog/~4/w_qcSzHBKdA&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">http://weblog.jamisbuck.org/2015/9/5/little-things-hashes-and-procs.html</guid>
         <pubDate>Sat, 05 Sep 2015 06:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Double Shot #1549</title>
         <link>http://afreshcup.com/home/2015/9/4/double-shot-1549.html</link>
         <description>&lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://eliotsykes.com/quiet-assets&quot;&gt;Debug Rails Faster with Quiet Assets &amp; Quieter Logs&lt;/a&gt;&lt;/strong&gt; - How to make Rails be a bit less verbose in its logging.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.rubymotion.com/news/2015/09/03/announcing-rubymotion-4-0-free-cross-platform-games-watchos-2-0.html&quot;&gt;Announcing RubyMotion 4.0: free Starter edition, cross-platform games, watchOS 2.0&lt;/a&gt;&lt;/strong&gt; - Ruby for iOS continues to improve.&lt;/li&gt;
&lt;/ul&gt;</description>
         <author>Mike Gunderloy</author>
         <guid isPermaLink="false">http://afreshcup.com/home/2015/9/4/double-shot-1549.html</guid>
         <pubDate>Fri, 04 Sep 2015 11:30:55 +0000</pubDate>
      </item>
      <item>
         <title>Ideas are Cheap</title>
         <link>http://weblog.jamisbuck.org/2015/8/29/ideas-are-cheap.html</link>
         <description>Paralyzed by a fear of ruining a great idea, the author set himself
a challenge to prove that he had far more ideas to draw on
 — 3-minute read&lt;img src=&quot;http://feeds.feedburner.com/~r/buckblog/~4/nkD6LUJ05YE&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">http://weblog.jamisbuck.org/2015/8/29/ideas-are-cheap.html</guid>
         <pubDate>Sat, 29 Aug 2015 06:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Reducing a Number to Its Sign</title>
         <link>http://weblog.jamisbuck.org/2015/8/5/reducing-a-number-to-its-sign.html</link>
         <description>A simple technique is presented for extracting the sign of a number
 — 3-minute read&lt;img src=&quot;http://feeds.feedburner.com/~r/buckblog/~4/njfFX856oKc&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">http://weblog.jamisbuck.org/2015/8/5/reducing-a-number-to-its-sign.html</guid>
         <pubDate>Wed, 05 Aug 2015 06:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Writing a Klondike Puzzle Solver</title>
         <link>http://weblog.jamisbuck.org/2015/8/4/writing-a-klondike-puzzle-solver.html</link>
         <description>In which the author presents a Ruby program that solves Sam Lloyd's famous &quot;Back from the Klondike&quot; puzzle
 — 13-minute read&lt;img src=&quot;http://feeds.feedburner.com/~r/buckblog/~4/6jg89-LEw10&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">http://weblog.jamisbuck.org/2015/8/4/writing-a-klondike-puzzle-solver.html</guid>
         <pubDate>Tue, 04 Aug 2015 06:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Flipper: Insanely Easy Feature Flipping</title>
         <link>http://feedproxy.google.com/~r/railstips/~3/isWp4gJl6Xc/</link>
         <description>&lt;p&gt;Cross posted from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://johnnunemaker.com/flipper/&quot;&gt;JohnNunemaker.com&lt;/a&gt; as it seems relevant here too.&lt;/p&gt;
&lt;pre&gt;
                                   __
                               _.-~  )
                    _..--~~~~,'   ,-/     _
                 .-'. . . .'   ,-','    ,' )
               ,'. . . _   ,--~,-'__..-'  ,'
             ,'. . .  (@)' ---~~~~      ,'
            /. . . . '~~             ,-'
           /. . . . .             ,-'
          ; . . . .  - .        ,'
         : . . . .       _     /
        . . . . .          `-.:
       . . . ./  - .          )
      .  . . |  _____..---.._/ _____
~---~~~~----~~~~             ~~
&lt;/pre&gt;
&lt;p&gt;Nearly &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/jnunemaker/flipper/commit/8257cc68a9a2ff6fb6b3ae6c497b15309c4d0d7b&quot;&gt;three years ago&lt;/a&gt;, I started work on Flipper. Even though there were other feature flipping libraries out there at the time, most notably &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/FetLife/rollout&quot;&gt;rollout&lt;/a&gt;, I decided to whip up my own. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://speakerdeck.com/jnunemaker/dont-repeat-yourself-repeat-others&quot;&gt;Repeating others&lt;/a&gt; is, after all, one of the better ways to level up your game.&lt;/p&gt;
&lt;p&gt;My main issue with rollout was that it was inflexible. You couldn&amp;#8217;t change the ways in which a feature was enabled (ie: adding percentage of time rollout). You had to use redis. The list goes on. I poked around and couldn&amp;#8217;t find anything like what I was looking for and I was in the mood to create, so I started flipper.&lt;/p&gt;
&lt;p&gt;Most of the work was done off and on over the course of a few weeks. At the time, I was working on traffic graphs for GitHub and I wanted a way to turn features on/off in a flexible way.&lt;/p&gt;
&lt;h2 id=&quot;naming-is-hard&quot;&gt;Naming is hard&lt;/h2&gt;
&lt;p&gt;Flipper started as a simple ripoff of rollout with the primary difference being the use of adapters for storage instead of forcing redis. I struggled through awkward terminology and messy code for a while, until a great conversation with &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://opensoul.org&quot;&gt;Brandon Keepers&lt;/a&gt; led me to the lingo flipper uses today: Actor, Feature and Gate (thanks Brandon!)&lt;/p&gt;
&lt;p&gt;An &lt;strong&gt;actor&lt;/strong&gt; is the thing trying to do something. It can be anything. On &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt;, the actor can be a user, organization or even a repository. Actors must respond to &lt;code&gt;flipper_id&lt;/code&gt;. If you plan on using multiple types of actors, you can namespace the flipper_id with the type (ie: &amp;#8220;User:6&amp;#8221;, &amp;#8220;Organization:12&amp;#8221;, or &amp;#8220;Repository: 2&amp;#8221;).&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;feature&lt;/strong&gt; is something that you want to control enabled-ness for. On &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://speakerdeck.com&quot;&gt;SpeakerDeck&lt;/a&gt;, I have a feature for search. With the click of a button, I can disable search if it is causing issues. On GitHub, we do thousands of feature checks per second across nearly 30 features (at the time of this writing) in different states of enabled-ness. If I told you what they were for I would have to kill you.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;gate&lt;/strong&gt; determines if a feature is enabled for an actor. There are currently five gates &amp;#8212; boolean, actor, group, % of actors and % of time. Amongst these you can rollout a new feature or control an existing one in whatever way you desire.&lt;/p&gt;
&lt;h3 id=&quot;the-gates&quot;&gt;The Gates&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;boolean gate&lt;/strong&gt; allows completely enabling or disabling a feature. Think of it as a short cut to turning a feature fully on or fully off quickly. Enabling the boolean gate means the feature is on all the time for everyone. Disabling the boolean gate clears all enabled gates so the feature is completely off. Think of disable like a reset.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code class=&quot;ruby&quot;&gt;flipper = Flipper.new(adapter)
flipper[:search].enable # turn on
flipper[:search].disable # turn off
flipper[:search].enabled? # check&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;actor gate&lt;/strong&gt; allows enabling a feature for one or more specific actors. If you wanted to enable a new feature for one of your friends, you could use this gate.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
flipper = Flipper.new(adapter)

flipper[:search].enable_actor user # turn on for actor
flipper[:search].enabled? user # true

flipper[:search].disable_actor user # turn off for actor
flipper[:search].enabled? user # false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;group gate&lt;/strong&gt; allows enabling a feature for one or more groups. A group is a named block of code that returns true or false for a given actor. You could have a group for everyone in your company, or only engineering, or perhaps all users in the US or Europe. Anything your heart can imagine can be converted to a group and the entire group can be enabled at once.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
Flipper.register(:admins) do |actor|
  actor.respond_to?(:admin?) &amp;amp;amp;&amp;amp;amp; actor.admin?
end

flipper = Flipper.new(adapter)

flipper[:search].enable_group :admins # turn on for admins
flipper[:search].disable_group :admins # turn off for admins

person = Person.find(params[:id])
flipper[:search].enabled? person # check if enabled, returns true if person.admin? is true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;percentage of actors gate&lt;/strong&gt; allows slowly enabling a feature for a percentage of actors. As long as you continue to increase the percentage, an actor will consistently remain enabled. This allows for careful rollouts of a feature to everyone without overwhelming the system as a whole.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
flipper = Flipper.new(adapter)

# turn search on for 10 percent of users in the system
flipper[:search].enable_percentage_of_actors 10

# checks if actor's flipper_id is in the enabled percentage by hashing
# user.flipper_id.to_s to ensure enabled distribution is smooth
flipper[:search].enabled? user

# turn search off for percentage of actors, other gates could retur true still
flipper[:search].disable_percentage_of_actors # sets to 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;percentage of time gate&lt;/strong&gt; allows enabling a feature for a random percentage of time. This is great for dark shipping and load testing. We actually used somehing similar to this to launch traffic graphs. We wanted to be positive that we could stand up to real traffic, so we performed ajax requests behind the scenes based on a percentage of time to the new feature. This allowed us to crank up the traffic, hit a bottleneck, kill the traffic, fix the bottlneck and repeat.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
flipper = Flipper.new(adapter)


# turn on logging for 5 percent of the time
# could be on during one request and off the next
# could even be on first time in request and off second time
flipper[:logging].enable_percentage_of_time 5

# turn off logging for percentage of time
flipper[:logging].disable_percentage_of_time # sets to 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/jnunemaker/flipper/blob/master/docs/Gates.md&quot;&gt;the gates are fully documented in the flipper repo&lt;/a&gt; as well.&lt;/p&gt;
&lt;h2 id=&quot;adapters&quot;&gt;Adapters&lt;/h2&gt;
&lt;p&gt;The adapter pattern is used to store which gates gates are enabled for a given feature. This means you can store flipper&amp;#8217;s information however you desire. At the time of this writing, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/jnunemaker/flipper/blob/master/docs/Adapters.md&quot;&gt;several adapters already exist&lt;/a&gt;, such as in memory, pstore, mongo, redis, cassandra, and active record. If one of those doesn&amp;#8217;t tickle your fancy, creating a new adapter is really easy. The &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; for an adapter is this:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;features&lt;/code&gt; &amp;#8211; Get the set of known features.&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;add(feature)&lt;/code&gt; &amp;#8211; Add a feature to the set of known features.&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;remove(feature)&lt;/code&gt; &amp;#8211; Remove a feature from the set of known features.&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;clear(feature)&lt;/code&gt; &amp;#8211; Clear all gate values for a feature.&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;get(feature)&lt;/code&gt; &amp;#8211; Get all gate values for a feature.&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;enable(feature, gate, thing)&lt;/code&gt; &amp;#8211; Enable a gate for a thing.&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;disable(feature, gate, thing)&lt;/code&gt; &amp;#8211; Disable a gate for a thing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At GitHub, we actually use a &lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt; adapter fronted by memcache for performance reasons.&lt;/p&gt;
&lt;h2 id=&quot;instrumentation&quot;&gt;Instrumentation&lt;/h2&gt;
&lt;p&gt;Flipper is wired to be &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/jnunemaker/flipper/blob/master/docs/Instrumentation.md&quot;&gt;instrumented out of the box&lt;/a&gt;, using ActiveSupport::Notifications &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; (though AS::Notifs are not specifically required). I even included automatic statsd instrumentation for those that are already using statsd.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code class=&quot;ruby&quot;&gt;require &quot;flipper/instrumentation/statsd&quot;
statsd = Statsd.new # or whatever your statsd instance is
Flipper::Instrumentation::StatsdSubscriber.client = statsd&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If statsd doesn&amp;#8217;t work for you, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/jnunemaker/flipper/blob/master/examples/instrumentation.rb&quot;&gt;you can easily customize&lt;/a&gt; wherever you want to instrument to (ie: InfluxDB, New Relic, etc.).&lt;/p&gt;
&lt;h2 id=&quot;performance&quot;&gt;Performance&lt;/h2&gt;
&lt;p&gt;Flipper was built based on my time working on Words with Friends and to be used at GitHub, so you can rest easy that it was built with performance in mind. The adapter &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; is intentionally made to allow for fetching all gate values for a feature in one network call and there is even (optional) built in memoization of adapter calls, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/jnunemaker/flipper/blob/master/docs/Optimization.md&quot;&gt;including a Rack middleware&lt;/a&gt; which enables memoizing the fetching a feature for the duration of a request.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve also thought about making it easy to allow for batch loading of features, though I haven&amp;#8217;t needed this yet on any site I&amp;#8217;ve worked on, so for now it remains a thought rather than an implementation.&lt;/p&gt;
&lt;h2 id=&quot;web-ui&quot;&gt;Web UI&lt;/h2&gt;
&lt;p&gt;As a cherry on top, I&amp;#8217;ve also created a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/jnunemaker/flipper/tree/master/docs/ui&quot;&gt;rack middleware web UI&lt;/a&gt; for controlling flipper, which can be protected by any authentication you need. Below are a couple screenshots (at the time of this writing).&lt;/p&gt;
&lt;h3 id=&quot;list-of-features&quot;&gt;List of features&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;h3 id=&quot;viewing-individual-feature&quot;&gt;Viewing individual feature&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;All the gates can be manipulated to enable features however you would like through the click of a button or the clack of a keyboard.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Flipper is ready for the prime time. As I said earlier, we are now using it on GitHub.com for thousands of feature checks every second. The &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; changed a bit in 0.7, but is pretty stable now. Drop it in your next project and give it a try. If you do, please let me know (email or issue on the repo) as I love to know how people are using things I&amp;#8217;ve worked on.&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/railstips?a=isWp4gJl6Xc:UdWPq3esCAE:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railstips?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/railstips?a=isWp4gJl6Xc:UdWPq3esCAE:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railstips?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/railstips?a=isWp4gJl6Xc:UdWPq3esCAE:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railstips?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/railstips/~4/isWp4gJl6Xc&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <author>John Nunemaker</author>
         <guid isPermaLink="false">55bf5b8ad4c96106840498fa</guid>
         <pubDate>Mon, 03 Aug 2015 12:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Writing a Simple Recursive Descent Parser</title>
         <link>http://weblog.jamisbuck.org/2015/7/30/writing-a-simple-recursive-descent-parser.html</link>
         <description>A simple implementation of a field-based query string, with binary operations, using a recursive descent parser
 — 6-minute read&lt;img src=&quot;http://feeds.feedburner.com/~r/buckblog/~4/h4dMx7cQOLE&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">http://weblog.jamisbuck.org/2015/7/30/writing-a-simple-recursive-descent-parser.html</guid>
         <pubDate>Thu, 30 Jul 2015 06:00:00 +0000</pubDate>
      </item>
      <item>
         <title>tar.gz in Ruby</title>
         <link>http://weblog.jamisbuck.org/2015/7/23/tar-gz-in-ruby.html</link>
         <description>A method is described for reading and writing tar and gzip files, using only the Ruby standard library
 — 5-minute read&lt;img src=&quot;http://feeds.feedburner.com/~r/buckblog/~4/By2C9f6q0oU&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">http://weblog.jamisbuck.org/2015/7/23/tar-gz-in-ruby.html</guid>
         <pubDate>Thu, 23 Jul 2015 06:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Mazes for Programmers</title>
         <link>http://weblog.jamisbuck.org/2015/7/8/mazes-for-programmers.html</link>
         <description>The announcement of a completed project with expressions of relief and disbelief, and a brief animation to celebrate the occassion. The author looks forward to other projects to come.
 — 1-minute read&lt;img src=&quot;http://feeds.feedburner.com/~r/buckblog/~4/woXJx3HFCOs&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">http://weblog.jamisbuck.org/2015/7/8/mazes-for-programmers.html</guid>
         <pubDate>Wed, 08 Jul 2015 06:00:00 +0000</pubDate>
      </item>
      <item>
         <title>A week with a Rails Security Strategy (and page update)</title>
         <link>https://rorsecurity.info/journal/2015/05/05/a-week-with-a-rails-security-strategy-and-page-update.html</link>
         <description>Two things, a page update and my new article &amp;#8220;A week with a Rails Security Strategy&amp;#8220;. Page update: This site hasn&amp;#8217;t been very active recently, I&amp;#8217;m working to make it more useful. Enter your e-mail in the header to notify you when it&amp;#8217;s ready. I published a new article &amp;#8220;A week with a Rails Security &amp;#8230;</description>
         <guid isPermaLink="false">https://rorsecurity.info/?p=249</guid>
         <pubDate>Tue, 05 May 2015 14:01:05 +0000</pubDate>
         <content:encoded><![CDATA[<div class="entry-content">
<p>Two things, a page update and my new article &#8220;<a rel="nofollow" target="_blank" href="http://bauland42.com/articles/a-week-with-a-rails-security-strategy/">A week with a Rails Security Strategy</a>&#8220;.</p>
<p><strong>Page update:</strong> <span>This site hasn&#8217;t been very active recently, I&#8217;m working to make it more useful. Enter your e-mail in the header to notify you when it&#8217;s ready.</span></p>
<p><strong>I published a new article &#8220;<a rel="nofollow" target="_blank" href="http://bauland42.com/articles/a-week-with-a-rails-security-strategy/">A week with a Rails Security Strategy</a>&#8221; on my site:</strong></p>
<p>You&rsquo;re a busy person. Security is not a very visible feature in most applications, and so sometimes it&rsquo;s not a priority. Of course you know it&rsquo;s important, but how can you fit it into your busy schedule?</p>
<div id="_mcePaste"></div>
<div id="_mcePaste">The answer may be in the power of habits and a <a rel="nofollow" target="_blank" href="http://bauland42.com/articles/a-week-with-a-rails-security-strategy/">Rails security strategy</a>&#8230;</div>


</div>
<img src="http://feeds.feedburner.com/~r/RubyOnRailsSecurity/~4/PdwT-nt3bb8" height="1" width="1" alt=""/>]]></content:encoded>
         <category>Updates</category>
      </item>
      <item>
         <title>Review: Redis Applied Design Patterns</title>
         <link>http://feedproxy.google.com/~r/obie/~3/vHZ_zbA16xU/review-redis-applied-design-patterns.html</link>
         <description>&lt;div&gt;&lt;p&gt;Redis is one of the most popular NoSQL databases, and for good reason. Even though you wouldn't want to use it as your primary datastore, Redis is a high-performance complement for caching frequently used data and running certain types of calculations such as leaderboards. I'm far from a master of Redis, but my presentations about Redis are some of my most popular online content, getting thousands of views every month.&lt;/p&gt;&#13;
&lt;p&gt;In the Packt Publishing book, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.packtpub.com/big-data-and-business-intelligence/redis-applied-design-patterns&quot;&gt;Redis Applied Design Patterns&lt;/a&gt;, author Arun Chinnachamy provides a concise guide to Redis for experienced developers wondering what Redis can do for them. The book opens with a crash-course 3-chapter primer on NoSQL for those coming from a background in relational databases. After that, the rest of the book focuses features unique to REDIS within the context of application use cases such as caching and auto-suggest features.&lt;/p&gt;&#13;
&lt;p&gt;The initial chapters feel a bit rushed and amateur, featuring statements like this one that are likely to provoke anger or amusement in experienced developers (bold emphasis mine):&lt;/p&gt;&#13;
&lt;blockquote&gt;&#13;
&lt;div title=&quot;Page 21&quot;&gt;&#13;
&lt;div&gt;&#13;
&lt;div&gt;&#13;
&lt;p&gt;&lt;span style=&quot;font-family:georgia, palatino;font-size:11pt;&quot;&gt;The main advantage of NoSQL is that there is no concept of normalization. This is the reason why you get more performance from a NoSQL database when seen against a normalized SQL database. There is a trade-off in that you are sacrificing data consistency in the NoSQL database, &lt;strong&gt;but the benefits achieved in doing so are higher&lt;/strong&gt;.&lt;/span&gt;&lt;/p&gt;&#13;
&lt;/div&gt;&#13;
&lt;/div&gt;&#13;
&lt;/div&gt;&#13;
&lt;/blockquote&gt;&#13;
&lt;p&gt;Despite that, I'm still a fan of having a central point of reference for each major technology that I employ in my stack, which is one of the main reasons why I maintain that my&lt;em&gt; Rails Way&lt;/em&gt; series is still valuable after all these years. Otherwise you're reduced to bouncing around a myriad of online sources, an effort that can be frustrating and overly time consuming. This case is no different, the Packt book is a good central point of reference to Redis, although I would advise ignoring the more subjective parts of the book and making use of it purely as a reference tool.&lt;/p&gt;&#13;
&lt;p&gt;Overall the author employs a concise, direct style that makes it easy to read and digest. It is also chock full of pointers to external resources, making it a good all-around guide to have around when working with Redis on a day-to-day basis. It's only $11 for the ebook version, which makes it easy to recommend.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=vHZ_zbA16xU:-U1PkkeTKPg:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=vHZ_zbA16xU:-U1PkkeTKPg:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=vHZ_zbA16xU:-U1PkkeTKPg:RJU-JkLLmTY&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=vHZ_zbA16xU:-U1PkkeTKPg:RJU-JkLLmTY&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=vHZ_zbA16xU:-U1PkkeTKPg:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=vHZ_zbA16xU:-U1PkkeTKPg:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=vHZ_zbA16xU:-U1PkkeTKPg:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=vHZ_zbA16xU:-U1PkkeTKPg:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=vHZ_zbA16xU:-U1PkkeTKPg:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <author>Obie Fernandez</author>
         <guid isPermaLink="false">tag:typepad.com,2003:post-6a00e54fdca911883301bb07b9a381970d</guid>
         <pubDate>Mon, 01 Dec 2014 15:56:59 +0000</pubDate>
      </item>
      <item>
         <title>Raptor: A Forthcoming Ruby Web Server for Faster App Deployment</title>
         <link>http://feedproxy.google.com/~r/RubyInside/~3/_mOFJ1CRIVI/raptor-a-new-ruby-web-server-for-faster-app-deployment-6168.html</link>
         <description>&lt;p&gt;&lt;img src=&quot;http://www.rubyinside.com/wp-content/uploads/2014/10/raptor3.jpg&quot; alt=&quot;&quot; title=&quot;raptor3&quot; width=&quot;650&quot; class=&quot;alignnone size-full wp-image-6169&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.rubyraptor.org/&quot;&gt;&lt;em&gt;Raptor&lt;/em&gt;&lt;/a&gt; bills itself as a new Ruby &quot;app server” and it claims to blow everything else out of the water performance-wise (by between 2-4x!) whether that’s Unicorn, Puma, Passenger, or even TorqueBox on JRuby.&lt;/strong&gt; The bad news for now is there’s no source or repo yet and only a handful of people (including me) have been given a sneak peek, although a public beta is promised on November 25th.&lt;/p&gt;
&lt;h3&gt;The history of Ruby webapp deployment&lt;/h3&gt;
&lt;p&gt;The deployment of Ruby (and therefore Rails) webapps was a painful mess for years, a state I lamented 7 years ago  in &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.rubyinside.com/no-true-mod_ruby-is-damaging-rubys-viability-on-the-web-693.html&quot;&gt;No True ‘mod_ruby’ is Damaging Ruby’s Viability on the Web&lt;/a&gt;. Thankfully, shortly thereafter a number of projects came out to make life easier, the most famous being &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.phusionpassenger.com/&quot;&gt;Phusion Passenger&lt;/a&gt; (then known as &lt;em&gt;mod_rails&lt;/em&gt;) in April 2008.&lt;/p&gt;
&lt;p&gt;Things have continued to improve gradually over the years, with Passenger getting consistently better, and new approaches such as those offered by &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://unicorn.bogomips.org/&quot;&gt;Unicorn&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://puma.io/&quot;&gt;Puma&lt;/a&gt;, using JRuby, as well as proxying through Nginx, coming into the picture.&lt;/p&gt;
&lt;h3&gt;Enter Raptor&lt;/h3&gt;
&lt;p&gt;Raptor, a new entry to the burgeoning world of Ruby Web servers, boasts some compelling features. &quot;Visibility&quot; is cited as a key feature so that you can look ‘into’ your app and analyze its performance as easily as possible using a JSON API (so building your own tools around the API should be simple). Raptor also uses the HTTP parser from Node which itself was derived from Nginx’s HTTP parser; both are renowned for their speed and stability. Raptor boasts a zero-copy, concurrent, evented architecture which makes it efficient memory and IO-wise - so even if you have slow clients or a slow network, these won’t bring your app server to a stuttering standstill.&lt;/p&gt;
&lt;p&gt;Another feature that jumped out at me is &lt;em&gt;integrated caching.&lt;/em&gt; Raptor doesn’t rely on an external services like memcached or Redis at all, but is truly internal and optimized specifically for Web workloads. If you’ve never set up caching before, this could provide a big boost as with Raptor it’ll be available “out of the box”.&lt;/p&gt;
&lt;p&gt;The initial results seem promising. Fabio Akita has &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.akitaonrails.com/2014/10/19/the-new-kid-on-the-block-for-ruby-servers-raptor&quot;&gt;already shared some early benchmark results&lt;/a&gt; which broadly mirror my own experience (disclaimer: as someone with rather little experience and authority in benchmarking, my benchmarks are oriented around Raptor’s own benchmarking suite) but, as always, YMMV and such benchmarks are &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://twitter.com/YorickPeterse/status/523935547455447041&quot;&gt;often criticized.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;The waiting game..&lt;/h3&gt;
&lt;p&gt;The team behind Raptor promise they’ll be releasing some interesting blog posts soon about the technology behind it, including how the cache is implemented and has been optimized, how the zero-copy system works and how it’ll benefit your code, and similar things. So keep an eye on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.rubyraptor.org/&quot;&gt;rubyraptor.org&lt;/a&gt;, especially around November 25th.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/RubyInside?a=_mOFJ1CRIVI:vRCVExCDbCU:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/RubyInside?a=_mOFJ1CRIVI:vRCVExCDbCU:3H-1DwQop_U&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/RubyInside?i=_mOFJ1CRIVI:vRCVExCDbCU:3H-1DwQop_U&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/RubyInside/~4/_mOFJ1CRIVI&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <author>Peter Cooper</author>
         <guid isPermaLink="false">http://www.rubyinside.com/?p=6168</guid>
         <pubDate>Tue, 21 Oct 2014 13:20:59 +0000</pubDate>
      </item>
      <item>
         <title>Ruby&amp;#8217;s Unary Operators and How to Redefine Their Functionality</title>
         <link>http://feedproxy.google.com/~r/RubyInside/~3/B4Wup3_1oH4/rubys-unary-operators-and-how-to-redefine-their-functionality-5610.html</link>
         <description>&lt;p&gt;&lt;img src=&quot;http://www.rubyinside.com/wp-content/uploads/2011/11/unary.gif&quot; alt=&quot;&quot; title=&quot;unary&quot; width=&quot;140&quot; height=&quot;140&quot; class=&quot;alignnone size-full wp-image-5612&quot; style=&quot;float:right;margin-left:18px;margin-bottom:18px;border:1px solid #458;&quot;/&gt;In math, a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Unary_operation&quot;&gt;unary operation&lt;/a&gt; is an operation with a single input. &lt;strong&gt;In Ruby, a unary operator is an operator which only takes a single 'argument' in the form of a &lt;em&gt;receiver&lt;/em&gt;.&lt;/strong&gt; For example, the &lt;code&gt;-&lt;/code&gt; on &lt;code&gt;-5&lt;/code&gt; or &lt;code&gt;!&lt;/code&gt; on &lt;code&gt;!true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In contrast, a &lt;em&gt;binary operator&lt;/em&gt;, such as in &lt;code&gt;2 + 3&lt;/code&gt;, deals with &lt;em&gt;two&lt;/em&gt; arguments. Here, 2 and 3 (which become one receiver and one argument in a method call to &lt;code&gt;+&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Ruby only has a handful of &lt;em&gt;unary&lt;/em&gt; operators, and while it's common to redefine binary operators like &lt;code&gt;+&lt;/code&gt; or &lt;code&gt;[]&lt;/code&gt; to give your objects some added syntactic sugar, unary operators are less commonly redefined. In my experience, many Rubyists aren't aware that unary operators &lt;em&gt;can&lt;/em&gt; be redefined and.. technically you can't &quot;redefine an operator&quot; but Ruby's operators frequently use specially named &lt;em&gt;methods&lt;/em&gt; behind the scenes, and as you'll know.. redefining a method is easy in Ruby!&lt;/p&gt;
&lt;h3&gt;A Quick Example with -@&lt;/h3&gt;
&lt;p&gt;Let's ease into things with the &lt;code&gt;-&lt;/code&gt; unary operator. The &lt;code&gt;-&lt;/code&gt; unary operator is &lt;strong&gt;not the same thing as the - binary operator&lt;/strong&gt; (where a binary operator has two operants). By default, the &lt;code&gt;-&lt;/code&gt; unary operator is used as notation for a negative number, as in &lt;code&gt;-25&lt;/code&gt;, whereas the &lt;code&gt;-&lt;/code&gt; binary operator performs subtraction, as in &lt;code&gt;50 - 25&lt;/code&gt;. &lt;strong&gt;While they look similar, these are different concepts, different operators, and resolve to different methods in Ruby.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using the - unary operator on a string in &lt;em&gt;irb&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; &lt;strong&gt;-&quot;this is a test&quot;&lt;/strong&gt;
NoMethodError: undefined method `&lt;strong&gt;-@&lt;/strong&gt;' for &quot;this is a test&quot;:String&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The String class doesn't have unary &lt;code&gt;-&lt;/code&gt; defined but irb gives us a clue on where to go. Due to the conflict between the unary and binary versions of &lt;code&gt;-&lt;/code&gt;, the unary version's method has a suffix of @. This helps us come up with a solution:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;str = &quot;This is my STRING!&quot;

def str.-@
  downcase
end

p str     # =&amp;gt; &quot;This is my STRING!&quot;
p -str    # =&amp;gt; &quot;this is my string!&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We've defined the unary &lt;code&gt;-&lt;/code&gt; operator by defining its associated &lt;code&gt;-@&lt;/code&gt; method to translate its receiving object to lower case.&lt;/p&gt;
&lt;h3&gt;Some Other Operators: +@, ~, ! (and not)&lt;/h3&gt;
&lt;p&gt;Let's try a larger example where we subclass String and add our own versions of several other easily overridden unary operators:&lt;/p&gt;
&lt;pre&gt;class MagicString &amp;lt; String
  def +@
    upcase
  end

  def -@
    downcase
  end

  def !
    swapcase
  end

  def ~
    # Do a ROT13 transformation - http://en.wikipedia.org/wiki/ROT13
    tr 'A-Za-z', 'N-ZA-Mn-za-m'
  end
end

str = MagicString.new(&quot;This is my string!&quot;)
p +str         # =&amp;gt; &quot;THIS IS MY STRING!&quot;
p !str         # =&amp;gt; &quot;tHIS IS MY STRING!&quot;
p (not str)    # =&amp;gt; &quot;tHIS IS MY STRING!&quot;
p ~str         # =&amp;gt; &quot;Guvf vf zl fgevat!&quot;
p +~str        # =&amp;gt; &quot;GUVF VF ZL FGEVAT!&quot;
p !(~str)      # =&amp;gt; &quot;gUVF VF ZL FGEVAT!&quot;&lt;/pre&gt;
&lt;p&gt;This time we've not only redefined &lt;code&gt;-/-@&lt;/code&gt;, but the &lt;code&gt;+&lt;/code&gt; unary operator (using the &lt;code&gt;+@&lt;/code&gt; method), &lt;code&gt;!&lt;/code&gt; and &lt;code&gt;not&lt;/code&gt; (using the &lt;code&gt;!&lt;/code&gt; method), and &lt;code&gt;~&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I'm not going to explain the example in full because it's as simple as I could get it while still being more illustrative than reams of text. Note what operation each unary operator is performing and see how that relates to what is called and what results in the output.&lt;/p&gt;
&lt;h3&gt;Special Cases: &amp;#038; and *&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;&amp;#038;&lt;/code&gt; and &lt;code&gt;*&lt;/code&gt; are also unary operators in Ruby, but they're special cases, bordering on 'mysterious syntax magic.' What do they do?&lt;/p&gt;
&lt;h4&gt;&amp;#038; and to_proc&lt;/h4&gt;
&lt;p&gt;Reg Braithwaite's &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://weblog.raganwald.com/2008/06/what-does-do-when-used-as-unary.html&quot;&gt;The unary ampersand in Ruby&lt;/a&gt; post gives a great explanation of &lt;code&gt;&amp;#038;&lt;/code&gt;, but in short &amp;#038; can turn objects into procs/blocks by calling the &lt;code&gt;to_proc&lt;/code&gt; method upon the object. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;p ['hello', 'world'].map(&amp;#038;:reverse)  # =&amp;gt; [&quot;olleh&quot;, &quot;dlrow&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enumerable#&lt;code&gt;map&lt;/code&gt; usually takes a block instead of an argument, but &lt;code&gt;&amp;#038;&lt;/code&gt; calls Symbol#&lt;code&gt;to_proc&lt;/code&gt; and generates a special proc object for the &lt;code&gt;reverse&lt;/code&gt; method. This proc becomes the block for the &lt;code&gt;map&lt;/code&gt; and thereby reverses the strings in the array.&lt;/p&gt;
&lt;p&gt;You could, therefore, 'override' the &lt;code&gt;&amp;#038;&lt;/code&gt; unary operator (not to be confused by the equivalent binary operator!) by defining &lt;code&gt;to_proc&lt;/code&gt; on an object, with the only restriction being that you &lt;em&gt;must&lt;/em&gt; return a Proc object for things to behave. You'll see an example of this later on.&lt;/p&gt;
&lt;h4&gt;* and splatting&lt;/h4&gt;
&lt;p&gt;There's &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://endofline.wordpress.com/2011/01/21/the-strange-ruby-splat/&quot;&gt;a lot of magic to splatting&lt;/a&gt; but in short,  &lt;code&gt;*&lt;/code&gt; can be considered to be a unary operator that will 'explode' an array &lt;em&gt;or&lt;/em&gt; an object that implements &lt;code&gt;to_a&lt;/code&gt; and returns an array.&lt;/p&gt;
&lt;p&gt;To override the unary &lt;code&gt;*&lt;/code&gt; (and not the binary * - as in &lt;code&gt;20 * 32&lt;/code&gt;), then, you can define a &lt;code&gt;to_a&lt;/code&gt; method and return an array. The array you return, however, will face further consequences thanks to *'s typical behavior!&lt;/p&gt;
&lt;h3&gt;A Full Example&lt;/h3&gt;
&lt;p&gt;We've reached the end of our quick tour through Ruby's unary operators, so I wanted to provide an example that shows how to override (or partially override) them that should stand as its own documentation:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;
&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MagicString&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;+@&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;upcase&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;-@&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;downcase&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;~&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Do a ROT13 transformation - http://en.wikipedia.org/wiki/ROT13&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;A-Za-z&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;N-ZA-Mn-za-m&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;to_proc&lt;/span&gt;
    &lt;span class=&quot;no&quot;&gt;Proc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;to_a&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reverse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

 def !
   swapcase
 end
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;MagicString&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;This is my string!&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;str&lt;/span&gt;                   &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &amp;quot;THIS IS MY STRING!&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;str&lt;/span&gt;                   &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &amp;quot;Guvf vf zl fgevat!&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+~&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;str&lt;/span&gt;                  &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &amp;quot;GUVF VF ZL FGEVAT!&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;%w{a b}&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;str&lt;/span&gt;       &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; [&amp;quot;This is my string!&amp;quot;, &amp;quot;This is my string!&amp;quot;]&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;str&lt;/span&gt;                   &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &amp;quot;!gnirts ym si sihT&amp;quot;&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;str&lt;/span&gt;                   &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &amp;quot;tHIS IS MY STRING!&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;              &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &amp;quot;tHIS IS MY STRING!&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; &amp;quot;gUVF VF ZL FGEVAT!&amp;quot;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;It's almost a cheat sheet of unary operators :-)&lt;/p&gt;
&lt;h3&gt;A Further Example: The TestRocket&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/peterc/testrocket&quot;&gt;TestRocket&lt;/a&gt; is a tiny testing library I built for fun a few years ago. It leans heavily on unary operators. For example, you can write tests like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;+-&amp;gt; { Die.new(2) }
--&amp;gt; { raise }
+-&amp;gt; { 2 + 2 == 4 }

# These two tests will deliberately fail
+-&amp;gt; { raise }
--&amp;gt; { true }

# A 'pending' test
~-&amp;gt; { &quot;this is a pending test&quot; }

# A description
!-&amp;gt; { &quot;use this for descriptive output and to separate your test parts&quot; }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;-&amp;gt; { }&lt;/code&gt; sections are just Ruby 1.9+ style 'stabby lambdas' but, with assistance from Christoph Grabo, I added unary methods to them so that you can prefix &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;~&lt;/code&gt;, or &lt;code&gt;!&lt;/code&gt; to get different behaviors.&lt;/p&gt;
&lt;p&gt;Hopefully you can come up with some more useful application for unary methods on your own objects ;-)&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/RubyInside?a=B4Wup3_1oH4:ia34VeyLBSg:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/RubyInside?a=B4Wup3_1oH4:ia34VeyLBSg:3H-1DwQop_U&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/RubyInside?i=B4Wup3_1oH4:ia34VeyLBSg:3H-1DwQop_U&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/RubyInside/~4/B4Wup3_1oH4&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <author>Peter Cooper</author>
         <guid isPermaLink="false">http://www.rubyinside.com/?p=5610</guid>
         <pubDate>Thu, 16 Oct 2014 05:05:16 +0000</pubDate>
      </item>
      <item>
         <title>Africa Calling</title>
         <link>http://feedproxy.google.com/~r/obie/~3/fP-XgN08rU0/africa-calling.html</link>
         <description>&lt;div&gt;&lt;p&gt;Reposting from my Medium blog&lt;/p&gt;&#13;
&lt;p&gt;&#13;
 &#13;
&lt;a rel=&quot;nofollow&quot; class=&quot;m-story&quot; target=&quot;_blank&quot; href=&quot;https://medium.com/@obie/6b9000223c75&quot;&gt;Africa Calling&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=fP-XgN08rU0:QsWvFKPjfz8:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=fP-XgN08rU0:QsWvFKPjfz8:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=fP-XgN08rU0:QsWvFKPjfz8:RJU-JkLLmTY&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=fP-XgN08rU0:QsWvFKPjfz8:RJU-JkLLmTY&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=fP-XgN08rU0:QsWvFKPjfz8:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=fP-XgN08rU0:QsWvFKPjfz8:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=fP-XgN08rU0:QsWvFKPjfz8:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=fP-XgN08rU0:QsWvFKPjfz8:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=fP-XgN08rU0:QsWvFKPjfz8:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <author>Obie Fernandez</author>
         <guid isPermaLink="false">tag:typepad.com,2003:post-6a00e54fdca911883301bb079882be970d</guid>
         <pubDate>Tue, 14 Oct 2014 19:09:54 +0000</pubDate>
      </item>
      <item>
         <title>Do. Or Do Not. There is No Try.</title>
         <link>http://feedproxy.google.com/~r/obie/~3/erV3ZAFGSec/do-or-do-not-there-is-no-try.html</link>
         <description>&lt;div&gt;&lt;p&gt;&lt;/p&gt;&#13;
&lt;p&gt;A reminder that I come back to time and again.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=erV3ZAFGSec:nMTgWcxUp5U:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=erV3ZAFGSec:nMTgWcxUp5U:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=erV3ZAFGSec:nMTgWcxUp5U:RJU-JkLLmTY&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=erV3ZAFGSec:nMTgWcxUp5U:RJU-JkLLmTY&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=erV3ZAFGSec:nMTgWcxUp5U:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=erV3ZAFGSec:nMTgWcxUp5U:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=erV3ZAFGSec:nMTgWcxUp5U:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=erV3ZAFGSec:nMTgWcxUp5U:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=erV3ZAFGSec:nMTgWcxUp5U:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <author>Obie Fernandez</author>
         <guid isPermaLink="false">tag:typepad.com,2003:post-6a00e54fdca911883301b7c6dfe5e1970b</guid>
         <pubDate>Sun, 14 Sep 2014 18:16:18 +0000</pubDate>
      </item>
      <item>
         <title>Demo of QuickMVP</title>
         <link>http://feedproxy.google.com/~r/obie/~3/HF7-m5-qQH0/demo-of-quickmvp.html</link>
         <description>&lt;div&gt;&lt;p&gt;&lt;/p&gt;&#13;
&lt;p&gt;The video features my partners at Javelin, Grace and Trevor, presenting &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://quickmvp.com?utm_campaign=obie&quot;&gt;QuickMVP&lt;/a&gt; to the NY Tech Meetup, one of the most prestigious in the world. I don't think our idea particular complicated or anything, but I'm proud of our execution on this one.&lt;/p&gt;&#13;
&lt;p&gt;QuickMVP is a landing page builder + easy creation of Google Ads to drive early adopter traffic + tool suite to be able to analyze results of your experiments in a way that's compatible with lean startup best practices. This video is actually one of the best demos of the software out there. Learn why this product is driving more and more recurring revenue for us every month.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=HF7-m5-qQH0:eVlqwnyH-co:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=HF7-m5-qQH0:eVlqwnyH-co:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=HF7-m5-qQH0:eVlqwnyH-co:RJU-JkLLmTY&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=HF7-m5-qQH0:eVlqwnyH-co:RJU-JkLLmTY&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=HF7-m5-qQH0:eVlqwnyH-co:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=HF7-m5-qQH0:eVlqwnyH-co:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=HF7-m5-qQH0:eVlqwnyH-co:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=HF7-m5-qQH0:eVlqwnyH-co:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=HF7-m5-qQH0:eVlqwnyH-co:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <author>Obie Fernandez</author>
         <guid isPermaLink="false">tag:typepad.com,2003:post-6a00e54fdca911883301b7c6dec79a970b</guid>
         <pubDate>Fri, 12 Sep 2014 14:45:47 +0000</pubDate>
      </item>
      <item>
         <title>The Future of Consulting</title>
         <link>http://feedproxy.google.com/~r/obie/~3/3FA8OD3XxzI/the-future-of-consulting.html</link>
         <description>&lt;div&gt;&lt;p&gt;I am doing an online (live) panel discussion with special guests a little less than an hour from now.&lt;/p&gt;&#13;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.airpair.com/airconf2014/keynote/future-of-consulting&quot;&gt;https://www.airpair.com/airconf2014/keynote/future-of-consulting&lt;/a&gt;&lt;/p&gt;&#13;
&lt;p&gt;&lt;strong&gt;Here is a brief list of topics that we hope to cover:&lt;/strong&gt;&lt;/p&gt;&#13;
&lt;div&gt;&#13;
&lt;div&gt;- state of software consulting today. static? growing?&lt;/div&gt;&#13;
&lt;div&gt;- what are the external forces shaping change in the industry?&lt;/div&gt;&#13;
&lt;div&gt;- opportunities of ongoing engagement outside traditional project-based models&lt;/div&gt;&#13;
&lt;div&gt;- should firms be looking to unbundle services?&lt;/div&gt;&#13;
&lt;div&gt;- or additional bundling and/or co-promotion of educational and othe rservices (ala Thoughtbot)&lt;/div&gt;&#13;
&lt;div&gt;- what is the proper balance of generalists vs. specialists on staff? what are hiring challenges?&lt;/div&gt;&#13;
&lt;div&gt;- how does a firm stay “top of mind” at clients between projects?&lt;/div&gt;&#13;
&lt;div&gt;- deployment of proprietary tools make sense? shared IP?&lt;/div&gt;&#13;
&lt;div&gt;- pricing: time vs. value based?&lt;/div&gt;&#13;
&lt;div&gt;- new competitors and business models? real threat?&lt;/div&gt;&#13;
&lt;div&gt; &lt;/div&gt;&#13;
&lt;/div&gt;&#13;
&lt;div&gt;&lt;strong&gt;Feel free to add questions for the panelists on the talk page's chat section &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.airpair.com/airconf2014/keynote/future-of-consulting&quot;&gt;here&lt;/a&gt;. To access the chat, you must be registered for AirConf and RSVP for the panel. If you're a little late to the show (starts 3pm ET) don't worry, you can just hit play on the Youtube player and watch it from the beginning. We'll try to address any questions/comments posted before the scheduled end time around 4pm ET.&lt;/strong&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=3FA8OD3XxzI:s3siarE63q8:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=3FA8OD3XxzI:s3siarE63q8:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=3FA8OD3XxzI:s3siarE63q8:RJU-JkLLmTY&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=3FA8OD3XxzI:s3siarE63q8:RJU-JkLLmTY&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=3FA8OD3XxzI:s3siarE63q8:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=3FA8OD3XxzI:s3siarE63q8:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=3FA8OD3XxzI:s3siarE63q8:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=3FA8OD3XxzI:s3siarE63q8:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=3FA8OD3XxzI:s3siarE63q8:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <author>Obie Fernandez</author>
         <guid isPermaLink="false">tag:typepad.com,2003:post-6a00e54fdca911883301a511f0b63b970c</guid>
         <pubDate>Tue, 05 Aug 2014 18:12:48 +0000</pubDate>
      </item>
      <item>
         <title>How to Write and Publish a Technical Book (and make lots of money)</title>
         <link>http://feedproxy.google.com/~r/obie/~3/YiIWAHbA4bA/how-to-write-and-publish-a-technical-book-and-make-lots-of-money.html</link>
         <description>&lt;div&gt;&lt;div id=&quot;mc_embed_signup&quot;&gt;&lt;form target=&quot;_blank&quot; action=&quot;http://msabundle.us6.list-manage1.com/subscribe/post?u=c793578277c9e5564660f804d&amp;amp;id=8e07e3b3cd&quot; class=&quot;validate&quot; id=&quot;mc-embedded-subscribe-form&quot; method=&quot;post&quot; name=&quot;mc-embedded-subscribe-form&quot;&gt;&#13;
&lt;h2&gt;Over the course of the last few years, the tech publishing market has changed. Authors are in a much better position than ever before.&lt;/h2&gt;&#13;
&lt;p&gt;If you are serious about success as a technical author, here are your up-to-date instructions. As long as your content is solid and valuable to your audience, I believe this is how you make the most money. You'll also reap serious long-term benefits.&lt;/p&gt;&#13;
&lt;p&gt;&lt;strong&gt;First of all, are you talking to a publisher about a book deal already? Maybe you have a book proposal and/or outline in hand already?&lt;/strong&gt;&lt;/p&gt;&#13;
&lt;p&gt;Good. That's a good starting place, but it's time to get in the driver's seat. Put the discussion with the publisher on hold. Be nice and tell them that you're interested in doing a book with them later in the year. Promise to get back to them once you make progress on your manuscript.&lt;/p&gt;&#13;
&lt;p&gt;Many publishers will balk at this change of events, but don't worry about it. What I'm going to teach you is how to build leverage. You're going to need as much of it as possible later on when you go back to them.&lt;/p&gt;&#13;
&lt;p&gt;&lt;strong&gt;Now, I'm assuming that you have a title and concept worked out.&lt;/strong&gt;&lt;/p&gt;&#13;
&lt;p&gt;At this point you should also have a first draft of a book outline. Go to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://leanpub.com/sign_up&quot;&gt;leanpub.com&lt;/a&gt; and create an author account. As part of signing up you'll have to create a book. Enter your title and description. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://leanpub.com/help/manual#leanpub-auto-images-and-cover-pages&quot;&gt;Follow the instructions for creating and uploading a cover image&lt;/a&gt;. It doesn't have to be fancy.&lt;/p&gt;&#13;
&lt;p&gt;Done? Publish your leanpub landing page and announce the book project to your social network. You want to start generating interest from your audience of early adopters as soon as possible. You also want the search engines to pick up your new landing page and start building a foundation for traffic to flow its way.&lt;br&gt; &lt;br&gt;Time to start writing the book. (I can give you advice on how to be an effective writer, but that's a separate topic. Make sure to subscribe to the mailing list below to find out more.) While you are writing, your leanpub landing page collects email addresses of interested parties. Many of them will freely tell you how much they're willing to pay for the book when it's available. That's very valuable information.&lt;/p&gt;&#13;
&lt;p&gt;&lt;strong&gt;Time to publish.&lt;/strong&gt;&lt;br&gt; &lt;br&gt;Publish your incomplete book on leanpub once you have 3 chapters written. Doesn't matter if 3 chapters is &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://leanpub.com/buildingawebsiteonheroku&quot;&gt;only 10% of your book&lt;/a&gt;. If you wait longer than that you are losing income and valuable feedback from early adopters. The great news is that at that point, you start earning 90% royalties even though the book is far from complete. I promise that the income and interest from your early buyers will keep you motivated to make progress.&lt;/p&gt;&#13;
&lt;p&gt;&lt;strong&gt;Keep writing.&lt;/strong&gt;&lt;/p&gt;&#13;
&lt;p&gt;This middle phase will take between 3 and 6 months for most people, perhaps more for difficult topics. Keep publishing every time you finish a new chapter or have significant amounts of new content. Keep making money throughout this time.&lt;/p&gt;&#13;
&lt;p&gt;&lt;strong&gt;Back to the negotiating table.&lt;/strong&gt;&lt;/p&gt;&#13;
&lt;p&gt;When you get to about 75-80% finished then you want to contact traditional publishers like Wiley or Pearson and/or whoever you initially spoke to about a book in the first place. Tell them that you're interested in their best offer. The best thing that can happen at this point is a bidding war over who will publish your title. (You shouldn't bother with Pragmatic Programmers. Want to know why I say that? Subscribe to the mailing list below.)&lt;/p&gt;&#13;
&lt;p&gt;&lt;strong&gt;Cash Advances&lt;/strong&gt;&lt;/p&gt;&#13;
&lt;p&gt;If you're a first time author with a popular topic, traditional publishers should be willing to advance you at least $5k USD. That is money that you'll never have to return, which is why publishers seem stingy with advances. It's all risk to them. But since your book is almost done, you've gone a long way towards mitigating that risk for them. That should loosen their pursestrings somewhat.&lt;/p&gt;&#13;
&lt;p&gt;Half of the advance will be payable on signing the book deal. The other half will be payable on delivery of final manuscript. Consider the promise of that money your incentive to make a final push and finish the book.&lt;/p&gt;&#13;
&lt;p&gt;&lt;strong&gt;Royalties&lt;/strong&gt;&lt;/p&gt;&#13;
&lt;p&gt;Royalties for print should start at 18% of net revenues to the publisher. (Expect that figure to be around $10-20, so you're only making a few dollars on each sale. That's just the way it works, don't fret about it.) The real money comes later, when you open up new business opportunites. But that's another topic.&lt;/p&gt;&#13;
&lt;p&gt;Royalties are not a single number. You'll also negotiate a multi-tiered ramp up to 25% royalties as your sale numbers grow and hit stretch targets. Selling 10 thousand copies of a print tech book these days is a solid success and should be compensated accordingly.&lt;/p&gt;&#13;
&lt;p&gt;&lt;strong&gt;What about ebooks?&lt;/strong&gt;&lt;/p&gt;&#13;
&lt;p&gt;You're going to negotiate hard for a 25% royalty on ebooks, but be willing to accept a little less. Don't get greedy and blow it.&lt;/p&gt;&#13;
&lt;p&gt;&lt;strong&gt;Profit!&lt;/strong&gt;&lt;/p&gt;&#13;
&lt;p&gt;Once you negotiate a deal you're happy with, sign it and finish your book. Submit the manuscript and get the balance of your advance. Plan on discontinuing Leanpub sales once the officially published version is available on Amazon and in stores.&lt;/p&gt;&#13;
&lt;p&gt;You'll be cashing royalty checks every six months. Plus you get many other intangible benefits. Traditional publishers can open the door to other writing opportunities in periodicals, speaking engagements and even video appearances. There's also the credentializing effect! Every other schmuck these days has an ebook. But traditional print still provides a strong foundation for launching successful consulting careers.&lt;/p&gt;&#13;
&lt;h2&gt;Are you an aspiring author? Interested in reading more in-depth content about how to succeed like I have?&lt;/h2&gt;&#13;
&lt;p&gt;&lt;span style=&quot;font-size:1.5em;&quot;&gt;Subscribe to my mailing list&lt;/span&gt;&lt;/p&gt;&#13;
&lt;div class=&quot;mc-field-group&quot;&gt;&lt;label for=&quot;mce-EMAIL&quot;&gt;Email Address &lt;/label&gt; &lt;input class=&quot;required email&quot; id=&quot;mce-EMAIL&quot; name=&quot;EMAIL&quot; value=&quot;&quot;&gt;&lt;/div&gt;&#13;
&lt;div class=&quot;mc-field-group input-group&quot;&gt; &lt;/div&gt;&#13;
&lt;div class=&quot;mc-field-group input-group&quot;&gt;&lt;strong&gt;Interested in... &lt;/strong&gt;&#13;
&lt;ul&gt;&#13;
&lt;li&gt;&lt;input type=&quot;checkbox&quot; value=&quot;1&quot;&gt;&lt;label&gt;Consulting&lt;/label&gt;&lt;/li&gt;&#13;
&lt;li&gt;&lt;input type=&quot;checkbox&quot; value=&quot;2&quot;&gt;&lt;label&gt;Software&lt;/label&gt;&lt;/li&gt;&#13;
&lt;li&gt;&lt;input type=&quot;checkbox&quot; value=&quot;4&quot;&gt;&lt;label&gt;Photography&lt;/label&gt;&lt;/li&gt;&#13;
&lt;li&gt;&lt;input type=&quot;checkbox&quot; value=&quot;8&quot;&gt;&lt;label&gt;The Pursuit of Happiness&lt;/label&gt;&lt;/li&gt;&#13;
&lt;li&gt;&lt;input checked type=&quot;checkbox&quot; value=&quot;16&quot;&gt;&lt;label&gt;Authoring a Tech Book&lt;/label&gt;&lt;/li&gt;&#13;
&lt;/ul&gt;&#13;
&lt;/div&gt;&#13;
&lt;div class=&quot;clear&quot; id=&quot;mce-responses&quot;&gt; &lt;/div&gt;&#13;
&lt;div style=&quot;&quot;&gt;&lt;input name=&quot;b_c793578277c9e5564660f804d_8e07e3b3cd&quot; type=&quot;text&quot; value=&quot;&quot;&gt;&lt;/div&gt;&#13;
&lt;div class=&quot;clear&quot;&gt;&lt;input class=&quot;button&quot; id=&quot;mc-embedded-subscribe&quot; name=&quot;subscribe&quot; type=&quot;submit&quot; value=&quot;Subscribe&quot;&gt;&lt;/div&gt;&#13;
&lt;/form&gt;&lt;/div&gt;&#13;
&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=YiIWAHbA4bA:I7XyJ1K5iMA:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=YiIWAHbA4bA:I7XyJ1K5iMA:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=YiIWAHbA4bA:I7XyJ1K5iMA:RJU-JkLLmTY&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=YiIWAHbA4bA:I7XyJ1K5iMA:RJU-JkLLmTY&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=YiIWAHbA4bA:I7XyJ1K5iMA:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=YiIWAHbA4bA:I7XyJ1K5iMA:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=YiIWAHbA4bA:I7XyJ1K5iMA:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=YiIWAHbA4bA:I7XyJ1K5iMA:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=YiIWAHbA4bA:I7XyJ1K5iMA:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <author>Obie Fernandez</author>
         <guid isPermaLink="false">tag:typepad.com,2003:post-6a00e54fdca911883301a511ab87f5970c</guid>
         <pubDate>Tue, 29 Apr 2014 00:56:23 +0000</pubDate>
      </item>
      <item>
         <title>&lt;div&gt;&lt;p&gt;Glad to announce that my latest book, The&amp;hellip;</title>
         <link>http://feedproxy.google.com/~r/obie/~3/oJg9Iw_lrNQ/glad-to-announce-that-my-latest-book-the-lean-enterprise-is-now-widely-available-in-print-and-kindle-editions-on-amazon-ge.html</link>
         <description>&lt;div&gt;&lt;p&gt;Glad to announce that my latest book, The Lean Enterprise, is now widely available in print and Kindle editions on Amazon. Getting lots of great reviews already!&lt;br/&gt;
 &lt;/p&gt;&lt;/div&gt; 
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=oJg9Iw_lrNQ:2_0ZXDKXx0c:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=oJg9Iw_lrNQ:2_0ZXDKXx0c:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=oJg9Iw_lrNQ:2_0ZXDKXx0c:RJU-JkLLmTY&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=oJg9Iw_lrNQ:2_0ZXDKXx0c:RJU-JkLLmTY&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=oJg9Iw_lrNQ:2_0ZXDKXx0c:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=oJg9Iw_lrNQ:2_0ZXDKXx0c:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=oJg9Iw_lrNQ:2_0ZXDKXx0c:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=oJg9Iw_lrNQ:2_0ZXDKXx0c:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=oJg9Iw_lrNQ:2_0ZXDKXx0c:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <author>Obie Fernandez</author>
         <guid isPermaLink="false">tag:typepad.com,2003:post-6a00e54fdca911883301a73da52243970d</guid>
         <pubDate>Tue, 08 Apr 2014 22:41:55 +0000</pubDate>
      </item>
      <item>
         <title>Of Late</title>
         <link>http://feedproxy.google.com/~r/railstips/~3/IWdXzww_Cl8/</link>
         <description>&lt;p&gt;A lot has changed over the years. I now do a lot more than just rails and having railstips as my domain seems to mentally put me in a corner.&lt;/p&gt;
&lt;p&gt;As such, I have revived &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://johnnunemaker.com&quot;&gt;johnnunemaker.com&lt;/a&gt;. While I may still post a rails topic here once in a while, I&amp;#8217;ll be posting a lot more varied topics over there.&lt;/p&gt;
&lt;p&gt;In fact, I just published my first post of any length, titled &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://johnnunemaker.com/analytics-at-github/&quot;&gt;Analytics at GitHub&lt;/a&gt;. Head on over and give it a read.&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/railstips?a=IWdXzww_Cl8:0N_bqrGt4o0:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railstips?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/railstips?a=IWdXzww_Cl8:0N_bqrGt4o0:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railstips?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/railstips?a=IWdXzww_Cl8:0N_bqrGt4o0:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railstips?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/railstips/~4/IWdXzww_Cl8&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <author>John Nunemaker</author>
         <guid isPermaLink="false">530b9aabf002ff02ea0001c1</guid>
         <pubDate>Mon, 24 Feb 2014 19:00:00 +0000</pubDate>
      </item>
      <item>
         <title>TechPeaks: Startup Life in the Italian Alps</title>
         <link>http://feedproxy.google.com/~r/obie/~3/QKhBUx9mFrw/techpeaks-startup-life-in-the-italian-alps.html</link>
         <description>&lt;div&gt;&lt;p&gt;Last summer (2013) I was honored with an invitation to serve as a mentor for the inaugural group of entrepreneurs welcomed into the TechPeaks accelerator program. It opened my eyes to what's possible when a progressive local government achieves effective cultivation of innovation and startups. Quite an experiment the Italians pulled off last year, and the results have encouraged them to do it again this year, with notable evolutions to their program that I believe make it an even better opportunity for aspiring entrepreneurs.&lt;/p&gt;&#13;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; class=&quot;asset-img-link&quot; target=&quot;_blank&quot; href=&quot;http://blog.obiefernandez.com/.a/6a00e54fdca911883301a3fbd3046d970b-pi&quot; style=&quot;display:inline;&quot;&gt;&lt;img alt=&quot;Techpeaks-main&quot; class=&quot;asset  asset-image at-xid-6a00e54fdca911883301a3fbd3046d970b&quot; src=&quot;http://blog.obiefernandez.com/.a/6a00e54fdca911883301a3fbd3046d970b-500wi&quot; title=&quot;Techpeaks-main&quot;&gt;&lt;/a&gt;&lt;/p&gt;&#13;
&lt;p&gt;Here's one of the coolest aspects of it, that really sets this program apart from traditional accelerators such as YC and TechStars: &lt;strong&gt;You don't even need to have a startup idea or be part of a team to qualify!&lt;/strong&gt;&lt;/p&gt;&#13;
&lt;p&gt;There are &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.f6s.com/techpeaks&quot;&gt;two ways to apply to the program&lt;/a&gt;: 1) with an idea, team optional or 2) as an individual technologist &lt;strong&gt;without an idea&lt;/strong&gt;. If you get accepted without an idea, the program functions as a matchmaker, with the expectation that you will band together with other people in the program on their ideas, or come up with new ideas to pursue. Out of a total of 50 participant slots available, a maximum of 20 are reserved for these individual &lt;em&gt;explorers&lt;/em&gt;.&lt;/p&gt;&#13;
&lt;p&gt;If I didn't have a family and my own startup at the moment, you better believe I'd be knocking down their door to accept me as an explorer.&lt;/p&gt;&#13;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; class=&quot;asset-img-link&quot; target=&quot;_blank&quot; href=&quot;http://blog.obiefernandez.com/.a/6a00e54fdca911883301a3fbd2fef3970b-pi&quot; style=&quot;display:inline;&quot;&gt;&lt;img alt=&quot;Trento-Italy&quot; class=&quot;asset  asset-image at-xid-6a00e54fdca911883301a3fbd2fef3970b&quot; src=&quot;http://blog.obiefernandez.com/.a/6a00e54fdca911883301a3fbd2fef3970b-500wi&quot; title=&quot;Trento-Italy&quot;&gt;&lt;/a&gt;&lt;/p&gt;&#13;
&lt;p&gt;All participants are relocated to Trento, a college town with some of the most gorgeous vistas I've ever seen, nestled in between vineyards in the Italian alps. It's a relatively quick train trip from Milan and a fantastic place to live. Your accomodations and living expenses are covered by the program, which has a duration of four months, from March 25, 2014 until July 25, 2014. Teams that make progress are eligible for hundreds of thousands of euros in startup grants and additional follow-on funding if they continue operations in the Trento area.&lt;/p&gt;&#13;
&lt;p&gt;The TechPeaks 2014 application deadline is January 20th. I encourage you to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://techpeaks.eu/the-program/&quot;&gt;check it out&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=QKhBUx9mFrw:WmVqANza8s4:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=QKhBUx9mFrw:WmVqANza8s4:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=QKhBUx9mFrw:WmVqANza8s4:RJU-JkLLmTY&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=QKhBUx9mFrw:WmVqANza8s4:RJU-JkLLmTY&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=QKhBUx9mFrw:WmVqANza8s4:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=QKhBUx9mFrw:WmVqANza8s4:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=QKhBUx9mFrw:WmVqANza8s4:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=QKhBUx9mFrw:WmVqANza8s4:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=QKhBUx9mFrw:WmVqANza8s4:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <author>Obie Fernandez</author>
         <guid isPermaLink="false">tag:typepad.com,2003:post-6a00e54fdca9118833019b045f552f970d</guid>
         <pubDate>Tue, 07 Jan 2014 14:00:54 +0000</pubDate>
      </item>
      <item>
         <title>Robert Williams, man to watch in 2014</title>
         <link>http://feedproxy.google.com/~r/obie/~3/FULqMnzcfb8/robert-williams-man-to-watch-in-2014.html</link>
         <description>&lt;div&gt;&lt;p&gt;I recently interviewed Robert Williams, founder of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://letsworkshop.com/obie/&quot;&gt;Workshop&lt;/a&gt;. Over the course of the last year Robert went from full-time employment, to successful freelancing, to launching a successful online business helping other freelancers to succeed using his methods.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;What is your background?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;My background is in design. I went to an expensive art school - which I now regret, because 90% of the education I use on a daily basis is stuff I learned online (mostly for free).&lt;/p&gt;
&lt;p&gt;I worked at a few design agencies after college, then in the marketing department for a large nursery - but those jobs left me unfulfilled and wanting to start my own business. I got that opportunity after I got fired from my job only a few months after receiving a raise, to boot.&lt;/p&gt;
&lt;p&gt;I decided that instead of going to interviews I’d look for freelance work full-time. This was an epiphany for me, because I truly became grateful for having been let go from my 9-5 job.&amp;nbsp;I spent my first week literally laying out on the beach everyday - and the freedom was awesome. That was the point where I knew I probably wouldn’t ever hold a 9-5 job again.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;How did you manage your freelance work?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Starting my own freelance design shop has been one of the most educational experiences in my life. I realized I had to stand out from the average designer online. This simply wasn’t happening on sites like dribbble, twitter, and behance. On those sites you’re competing with thousands of the world’s best designers and you don’t get to highlight your specific skill.&lt;/p&gt;
&lt;p&gt;I decided to delete my portfolio website, and focus on contacting leads 1-on-1 in order to a) &amp;nbsp;track the amount of people who were replying to me and asking to see my portfolio and b) have more control over how I was presenting myself and my services.&lt;/p&gt;
&lt;p&gt;This had pretty great results, I was able to make $30k in my first six months freelancing (without a portfolio website). This fascinated me and I began to study and collect evergreen principles to freelancing. The fact was that most places online tell you to post on twitter and dribbble and ‘get your name out there,’ but for someone just starting out this isn’t the right move.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Okay, so what is the right move for a new freelancer?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;I created an optimized system for finding the best leads online quickly, and made templates for stuff like emailing prospects, onboarding new clients, getting world-class feedback and more. Optimizing my freelance business has been one of my biggest passions in the past year.&lt;/p&gt;
&lt;p&gt;Recently, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://letsworkshop.com/obie&quot;&gt;I started a new project focused on helping other freelancers do the same; Workshop&lt;/a&gt;. I send the web’s best leads to a private list of freelancers every day. I also send all of my secrets and techniques to building my freelance business to members, which has been an awesome experience.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;How did you decide to get into this particular business?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;I got the idea from desperately wanting this service for my own business. As freelancers, we charge anywhere from $50-$1k per hour, and if you factor in the time is takes to look for work - you’re spending a fortune on finding work.&amp;nbsp;I wanted a service that automated this process for me, but that was high quality. A few other people were doing like a auto-generated lists of leads, but the quality was really low, and not worth the money.&amp;nbsp;It was something that I needed to do for my business anyway so I really liked the idea of charging for this service.&lt;/p&gt;
&lt;p&gt;Then, about 5 weeks ago, I was listening to a podcast interview with Ruben Gamez from bidsketch. He said one thing in particular that really resonated with, ‘a lot of people are listening to podcasts nowadays but not many are actually doing something actionable as a result.’&lt;/p&gt;
&lt;p dir=&quot;ltr&quot;&gt;I decided then and there to pursue this idea - and try to grind it out. I put together a quick landing page, using techniques from online courses I’ve taken in the past year including, earn1k, recurring revenue for consultants, 30x500, email marketing for startups, and a few others.&lt;/p&gt;
&lt;p&gt;I was also a member of JFDI, a private community of bootstrappers, who really helped me talk through my landing page and iterate quickly by providing me an extra set of eyes (or ten). This community support was integral in keeping my confidence up when people started to question my authority and service. I literally had one person sign up on the first day. I spent like 5 hours finding the 5 most awesome leads I could, and sent them over to him. Luckily over the next few days I got some traction and things began to take off.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;What differentiates you from potential competitors?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;What I’m doing differently, is 100% hand-curating every single lead I send. I aggregate thousands of job leads everyday and painstakingly comb through them by hand. I have strict, and vigorous criteria for finding the best leads.&lt;/p&gt;
&lt;p&gt;The projects are all stuff I would apply to. Nothing that would have a budget of less than $1000 and I make sure every lead is remote, and open to freelancers everywhere. Also, I try to make sure and do a little extra legwork to include things like the company website and contact email if possible.&lt;/p&gt;
&lt;p&gt;The result is a list of 5-10 leads that have all the relevant info for a busy freelancer, and none of the fluff. 90% of the work is done for you. All you have to do is reply to these 5-10 leads and you will have a constant stream of people entering your prospect cycle.&amp;nbsp;&lt;/p&gt;
&lt;p dir=&quot;ltr&quot;&gt;Members no longer have to worry about job boards which were really designed for full-time work anyway, and instead reply to everything from their inbox. I also offer to monitor any job boards members want me to, so you can literally use me as a virtual assistant.&lt;/p&gt;
&lt;p&gt;The difference between me and a virtual assistant you would find on places like odesk, is I’m an experienced freelancer myself. No one is going to be able to decipher the great leads from the riff-raff as good as you do, unless they’re a high-paid consultant themselves, which I am.&amp;nbsp;&lt;/p&gt;
&lt;h3 dir=&quot;ltr&quot;&gt;&lt;strong&gt;What have been your biggest mental obstacles?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Subconsciously it was wanting to see success immediately. I heard people like 37signals and Amy Hoy talk about growing slowly, and totally agreed, but it wasn’t until I actually started this project that I realized I’ve been way too impatient in the past.&amp;nbsp;&lt;/p&gt;
&lt;p dir=&quot;ltr&quot;&gt;90% of growing a great business is just grinding it out. Sure, you need luck, timing, and help from others, but if you’re not there everyday it doesn’t matter. You can look at this as a negative or a positive. It’s up to you.&amp;nbsp;You can be impatient and give up on all of your ideas… or you can decide to do something regardless of how long it takes. But make sure you charge from the beginning, otherwise you won’t know how you’re doing.&lt;/p&gt;
&lt;p&gt;To me, it’s one of the greatest strengths, because I don’t have control over whether someone with a million followers tweets out a link to my website, but I do have control over whether I put in effort each and every day.&amp;nbsp;I’m okay with growing slowly because I’m building, learning, and I want to be in it for the long-term. I also want to create the absolute best service for freelancers and help them build an awesome business for themselves.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Thanks Robert!&lt;/strong&gt;&lt;/h3&gt;
&lt;h2&gt;&lt;strong&gt;Are you a freelancer? Check out &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://letsworkshop.com/obie/&quot;&gt;Workshop&lt;/a&gt; for yourself.&lt;/strong&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=FULqMnzcfb8:qjt_755tGZk:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=FULqMnzcfb8:qjt_755tGZk:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=FULqMnzcfb8:qjt_755tGZk:RJU-JkLLmTY&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=FULqMnzcfb8:qjt_755tGZk:RJU-JkLLmTY&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=FULqMnzcfb8:qjt_755tGZk:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=FULqMnzcfb8:qjt_755tGZk:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=FULqMnzcfb8:qjt_755tGZk:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=FULqMnzcfb8:qjt_755tGZk:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=FULqMnzcfb8:qjt_755tGZk:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <author>Obie Fernandez</author>
         <guid isPermaLink="false">tag:typepad.com,2003:post-6a00e54fdca911883301a5102bcd60970c</guid>
         <pubDate>Wed, 01 Jan 2014 18:23:02 +0000</pubDate>
      </item>
      <item>
         <title>Haml's little-known list_of helper</title>
         <link>http://feedproxy.google.com/~r/obie/~3/ItiMd5VEGpk/hamls-little-known-list_of-helper.html</link>
         <description>&lt;div&gt;&lt;div title=&quot;Page 418&quot;&gt;&#13;
&lt;p&gt;TIL that given an &lt;span style=&quot;font-family:'andale mono', times;&quot;&gt;Enumerable&lt;/span&gt; object and a block, the &lt;span style=&quot;font-family:'andale mono', times;&quot;&gt;list_of&lt;/span&gt; method will iterate and yield the results of the block into sequential &amp;lt;li&amp;gt; elements.&lt;/p&gt;&#13;
&lt;p&gt;&lt;strong&gt;Haml&lt;/strong&gt;&lt;/p&gt;&#13;
&lt;p&gt;&lt;span style=&quot;font-family:'andale mono', times;&quot;&gt;%ul&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;font-family:'andale mono', times;&quot;&gt;  = list_of [1, 2, 3] do |item|&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'andale mono', times;&quot;&gt;    Number #{item}&lt;/span&gt;&lt;/p&gt;&#13;
&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;/p&gt;&#13;
&lt;p&gt;&lt;span style=&quot;font-family:'andale mono', times;&quot;&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;font-family:'andale mono', times;&quot;&gt;  &amp;lt;li&amp;gt;Number 1&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;font-family:'andale mono', times;&quot;&gt;  &amp;lt;li&amp;gt;Number 2&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;font-family:'andale mono', times;&quot;&gt;  &amp;lt;li&amp;gt;Number 3&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;font-family:'andale mono', times;&quot;&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;/p&gt;&#13;
&lt;p&gt;The &lt;span style=&quot;font-family:'andale mono', times;&quot;&gt;list_of&lt;/span&gt; method also optionally takes a hash of options applied to the output li tags as attributes.&lt;/p&gt;&#13;
&lt;hr&gt;&#13;
&lt;p&gt;Interested in more information like this? You can download my book &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://leanpub.com/tr4w&quot;&gt;The Rails 4 Way&lt;/a&gt; at Leanpub today. Final print edition on Addison Wesley coming early next year.&lt;/p&gt;&#13;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=ItiMd5VEGpk:tQw806D4Wmg:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=ItiMd5VEGpk:tQw806D4Wmg:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=ItiMd5VEGpk:tQw806D4Wmg:RJU-JkLLmTY&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=ItiMd5VEGpk:tQw806D4Wmg:RJU-JkLLmTY&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=ItiMd5VEGpk:tQw806D4Wmg:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=ItiMd5VEGpk:tQw806D4Wmg:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=ItiMd5VEGpk:tQw806D4Wmg:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?i=ItiMd5VEGpk:tQw806D4Wmg:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/obie?a=ItiMd5VEGpk:tQw806D4Wmg:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/obie?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <author>Obie Fernandez</author>
         <guid isPermaLink="false">tag:typepad.com,2003:post-6a00e54fdca9118833019b015d916e970d</guid>
         <pubDate>Wed, 20 Nov 2013 11:59:00 +0000</pubDate>
      </item>
      <item>
         <title>Installing Powerline on OS X + homebrew</title>
         <link>http://feedproxy.google.com/~r/riab/~3/sBVYFg6lJxw/</link>
         <description>I&amp;#8217;ve always wanted to get that fancy Powerline status bar and prompt. Chevrons and git branch icons in the terminal just sounds so&amp;#8230; defying: I&amp;#8217;d failed to get it working properly before because of a combination of outdated Powerline docs and confusion between OS X&amp;#8217;s system python/vim and homebrew&amp;#8217;s python/vim. Some of my former colleagues [&amp;#8230;]</description>
         <guid isPermaLink="false">http://blog.codefront.net/?p=1383</guid>
         <pubDate>Sun, 27 Oct 2013 08:29:12 +0000</pubDate>
         <content:encoded><![CDATA[<p>I&#8217;ve always wanted to get that fancy <a rel="nofollow" target="_blank" href="https://github.com/Lokaltog/powerline">Powerline</a> status bar and prompt. Chevrons and git branch icons in the terminal just sounds so&#8230; defying:</p>
<p><a rel="nofollow" target="_blank" href="http://blog.codefront.net/wp-content/uploads/2013/10/Powerline-example.png"><img src="http://blog.codefront.net/wp-content/uploads/2013/10/Powerline-example.png" alt="Powerline screenshot" width="520" height="306" class="alignnone size-full wp-image-1392"/></a></p>
<p>I&#8217;d failed to get it working properly before because of a combination of outdated Powerline docs and confusion between OS X&#8217;s system <code>python</code>/<code>vim</code> and <a rel="nofollow" target="_blank" href="http://brew.sh/">homebrew&#8217;s</a> <code>python</code>/<code>vim</code>. Some of my former colleagues detailed the pains and hours lost getting Powerline setup, so I gave up.</p>
<p>Anyway, I got a new Mac for work recently and decided to try again, and it was easier than I thought. You (including you, future Chu Yeow) can use this guide if you&#8217;re using homebrew to install <code>vim</code> and <code>python</code> (and everything else like <code>zsh</code> and <code>tmux</code>).</p>
<h4>Installing Powerline on OS X</h4>
<ol>
<li>Install python with homebrew: <code>brew install python</code></li>
<li>Install vim with homebrew: <code>brew install vim --env-std --override-system-vim</code>. You must <strong>install vim after python</strong> so that it&#8217;ll compile with homebrew&#8217;s python.</li>
<li>Install powerline with pip: <code>pip install https://github.com/Lokaltog/powerline/tarball/develop</code>. Powerline should get installed to <code>/usr/local/lib/python2.7/site-packages/powerline</code>.</li>
<li><code>open /usr/local/lib/python2.7/site-packages/powerline</code> &#8211; you should see the files required for integration with zsh, vim, tmux, etc. in the <code>bindings</code> directory. All you need to do now is to include these bindings in your zsh, vim and tmux config files &#8211; it&#8217;s that simple!</li>
<li>Add Powerline to vim by adding these lines to <code>~/.vimrc</code>:
<pre><code>source /usr/local/lib/python2.7/site-packages/powerline/bindings/vim/plugin/powerline.vim
set laststatus=2</code></pre>
</li>
<li>Add Powerline to tmux by adding this to <code>~/.tmux.conf</code>:
<pre><code>source /usr/local/lib/python2.7/site-packages/powerline/bindings/tmux/powerline.conf</code></pre>
</li>
<li>Add Powerline to zsh by adding this to <code>~/.zshrc</code>:
<pre><code>source /usr/local/lib/python2.7/site-packages/powerline/bindings/zsh/powerline.zsh</code></pre>
<p> If you use <code>oh-my-zsh</code>, be sure to <code>source</code> the Powerline bindings after oh-my-zsh&#8217;s.</li>
<li>Grab a patched font from <a rel="nofollow" target="_blank" href="https://github.com/Lokaltog/powerline-fonts">https://github.com/Lokaltog/powerline-fonts</a> (I use Inconsolata), and install it (just download, double-click the font file, and Install). If you don&#8217;t use any of these fonts, you&#8217;ll have to <a rel="nofollow" target="_blank" href="https://powerline.readthedocs.org/en/latest/fontpatching.html#font-patching">patch your favorite font</a> yourself (<em>have fun with that!</em>)</li>
</ol>
<p>That&#8217;s all you need! Go crazy and start tweaking your Powerline colorscheme.</p>
<img src="http://feeds.feedburner.com/~r/riab/~4/sBVYFg6lJxw" height="1" width="1" alt=""/>]]></content:encoded>
         <category>Programming</category>
      </item>
      <item>
         <title>This Month in Ruby: PeepCode Acquired, Rails 3.2.14, And More</title>
         <link>http://feedproxy.google.com/~r/RubyInside/~3/DnV1vfvXHoM/this-month-in-ruby-peepcode-acquired-a-free-rails-4-0-book-rails-3-2-14-and-more-6156.html</link>
         <description>&lt;p&gt;Welcome to a roundup of Ruby news, articles, videos, and more, for July 2013 cobbled together from my e-mail newsletter, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rubyweekly.com/&quot;&gt;Ruby Weekly.&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Highlights include: PeepCode acquired by Pluralsight, Practicing Ruby archives made public, Rails 3.2.14, and an interesting interview with Matz.&lt;/p&gt;
&lt;h3&gt;Featured&lt;/h3&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.rubyflow.com/items/9606-practicing-ruby-s-public-archives&quot; style=&quot;font-weight:bold;&quot;&gt;The First Four Volumes of Practicing Ruby, Now Available Online&lt;/a&gt;&lt;br /&gt;
Practicing Ruby is a high quality, paid Ruby journal run by Gregory Brown, but he's made archives of over 60 articles available to the public. There's a ton of stuff to enjoy here.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://peepcode.com/blog/2013/leveling-up&quot; style=&quot;font-weight:bold;&quot;&gt;PeepCode Acquired by Pluralsight&lt;/a&gt;&lt;br /&gt;
Ruby and Rails screencasting pioneer Geoffrey Grosenbach has announced he has sold Peepcode to Pluralsight, a large online training provider.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://myronmars.to/n/dev-blog/2013/07/the-plan-for-rspec-3&quot; style=&quot;font-weight:bold;&quot;&gt;The Plan for RSpec 3&lt;/a&gt;&lt;br /&gt;
RSpec 2.0 was released in October 2010 and RSpec 2.14 will be the last RSpec 2 feature release. Work on RSpec 3 has begun and Myron Marston shares what's going to be involved.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://weblog.rubyonrails.org/2013/7/16/Rails-3-2-14-rc2-has-been-released/&quot; style=&quot;font-weight:bold;&quot;&gt;Rails 3.2.14 RC1 and RC2 Released&lt;/a&gt;&lt;br /&gt;
A variety of bug fixes for Rails 3.2 &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://weblog.rubyonrails.org/2013/7/12/Rails-3-2-14-rc1-has-been-released/&quot;&gt;arrived in 3.2.14 RC1&lt;/a&gt; with one minor regression fixed in RC2. Final due soon.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://weblog.rubyonrails.org/2013/7/23/Rails-3-2-14-has-been-released/&quot; style=&quot;&quot;&gt;Rails 3.2.14 Released&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
  &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://fredwu.me/post/54175219257/the-future-of-computing-the-future-of-computer&quot;&gt;&lt;img src=&quot;http://s3.amazonaws.com/nlga/uploads/item/image/12267/125.png&quot; width=&quot;133&quot; height=&quot;100&quot; style=&quot;float:right;margin-left:14px;margin-bottom:16px;border:1px solid #1173c7;&quot;/&gt;&lt;/a&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://fredwu.me/post/54175219257/the-future-of-computing-the-future-of-computer&quot; style=&quot;font-weight:bold;&quot;&gt;The Future of Computing - An Interview with Matz&lt;/a&gt;&lt;br /&gt;
Last year, Ruby's creator Yukihiro 'Matz' Matsumoto released a book called &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.amazon.co.jp/dp/4822234630/&quot;&gt;The Future of Computing&lt;/a&gt; (only in Japanese, I believe) and did an interview with a Chinese publisher. Fred Wu has translated it into English.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://myronmars.to/n/dev-blog/2013/07/rspec-2-14-is-released&quot; style=&quot;font-weight:bold;&quot;&gt;RSpec 2.14 Released&lt;/a&gt;&lt;br /&gt;
Myron Marston unveils the last 2.x feature release of the popular spec framework and announces work is well underway for the future RSpec 3. 2.14 includes a new feature called 'spies' which is shown off here.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.youtube.com/watch?v=5ZjwEPupybw&quot; style=&quot;font-weight:bold;&quot;&gt;Functional Programming and Ruby&lt;/a&gt;&lt;br /&gt;
At GoRuCo 2013, Pat Shaughnessy gave a 40 minute talk comparing Haskell (a functional language) to Ruby and looked at how to implement common functional patterns in Ruby. Well explained and backed by good slides.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Reading&lt;/h3&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rubysource.com/streaming-with-rails-4/&quot; style=&quot;font-weight:bold;&quot;&gt;Streaming with Rails 4&lt;/a&gt;&lt;br /&gt;
Saurabh Bhatia looks at Rails 4's support for live streaming (the ability to send partial requests out to the client on the fly).
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://pivotallabs.com/reading-the-ruby-source/&quot; style=&quot;font-weight:bold;&quot;&gt;Reading the Ruby Source to Understand Rails Idiosyncrasies&lt;/a&gt;&lt;br /&gt;
I'm not sure you always need to dig quite so deep but Eno Compton takes an interesting journey through MRI's source code to see the difference between &lt;code&gt;Range#cover?&lt;/code&gt; and &lt;code&gt;Range#include?&lt;/code&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.alexmaccaw.com/faster-deploys&quot; style=&quot;font-weight:bold;&quot;&gt;Speed Up Heroku Deploys&lt;/a&gt;&lt;br /&gt;
Alex MacCaw was suffering from slow deploys to Heroku but he found a workaround.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.overacker.me/blog/2013/07/10/getting-started-with-rbenv/&quot; style=&quot;&quot;&gt;Managing Ruby Environments on OS X: Getting Started with rbenv&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://pragtob.wordpress.com/2013/07/17/shoes-4-a-progress-report/&quot; style=&quot;font-weight:bold;&quot;&gt;Shoes 4 – A Progress Report&lt;/a&gt;&lt;br /&gt;
Shoes was a graphical toolkit put together by Why the Lucky Stiff that made it simple to create GUI apps in Ruby. Since Why disappeared, others have picked up work on it, and Shoes 4 is set to be a complete rewrite.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.lunarlogicpolska.com/2013/put-yourself-on-rails-with-a-push-of-a-button/&quot; style=&quot;font-weight:bold;&quot;&gt;Put Yourself on Rails with A Push of A Button&lt;/a&gt;&lt;br /&gt;
A technique for quickly bringing up a workspace for doing Rails work (including terminals, a Rails console, a Rails server, etc.)
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://engineering.nulogy.com/posts/automatically-scaling-heroku-workers/&quot; style=&quot;&quot;&gt;Automatically Scaling Heroku Workers&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://leanpub.com/multi-tenancy-rails&quot; style=&quot;font-weight:bold;&quot;&gt;Multitenancy with Rails: An E-book by Ryan Bigg&lt;/a&gt;&lt;br /&gt;
Ryan Bigg, of Rails in Action fame, is writing an e-book about building a multi-tenanted Rails app.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.socialcast.com/incremental-redesign-with-rails/&quot; style=&quot;font-weight:bold;&quot;&gt;Incremental Redesign with Rails&lt;/a&gt;&lt;br /&gt;
Lars Klevan shows how to use &lt;code&gt;prepend_view_path&lt;/code&gt; to make in-progress redesigns on a production codebase simpler.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.lunarlogicpolska.com/2013/declutter-lib-directory/&quot; style=&quot;font-weight:bold;&quot;&gt;How to Declutter Your 'lib' Directory&lt;/a&gt;&lt;br /&gt;
If you have an established Rails project, its 'lib' folder might be getting a little full. Kuba Suder looks at ways to clean it up and put things elsewhere.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://reefpoints.dockyard.com/ruby/2013/07/10/design-patterns-template-pattern.html&quot; style=&quot;font-weight:bold;&quot;&gt;Design Patterns: The Template Method Pattern&lt;/a&gt;&lt;br /&gt;
An introductory Ruby-oriented look at arguably the simplest design pattern.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://pivotallabs.com/object-oriented-rails-writing-better-controllers/&quot; style=&quot;font-weight:bold;&quot;&gt;Object Oriented Rails: Writing Better Controllers&lt;/a&gt;&lt;br /&gt;
Damien Le Berrigaud of Pivotal Labs tries to avoid stubs and mocks and leans on dependency injection to test his controllers' code.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.hashrocket.com/posts/vimscript-and-you&quot; style=&quot;font-weight:bold;&quot;&gt;Vimscript And You&lt;/a&gt;&lt;br /&gt;
HashRocket's Jonathan Jackson demonstrates how you can use RSpec against Vim to aid in the development of a Vim plugin with Vimscript.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.rubymotion.com/post/52794967908/motionphrase-next-level-localization-for-rubymotion&quot; style=&quot;font-weight:bold;&quot;&gt;MotionPhrase: Next Level Localization for RubyMotion Applications&lt;/a&gt;&lt;br /&gt;
PhraseApp is a translation management tool for producing multilingual Web sites, Rails apps, etc, but it also works for localizing RubyMotion apps too, as demonstrated here.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://madebydna.com/all/code/2011/06/24/eigenclasses-demystified.html&quot; style=&quot;font-weight:bold;&quot;&gt;Ruby's Eigenclasses Demystified&lt;/a&gt;&lt;br /&gt;
Andrea Singh looks at Ruby's quirky 'eigenclasses' (a.k.a. metaclasses) and explains things in both code and diagrams. Dates from 2011 but worth revisiting.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rubysource.com/the-self-pipe-trick-explained/&quot; style=&quot;font-weight:bold;&quot;&gt;The Self-Pipe Trick Explained&lt;/a&gt;&lt;br /&gt;
Jesse Storimer shows off a cute Unix trick/technique in Ruby.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.drurly.com/blog/2013/07/08/practical-rspec-wrapping/&quot; style=&quot;font-weight:bold;&quot;&gt;Practical RSpec Wrapping&lt;/a&gt;&lt;br /&gt;
Why would you want to use &lt;code&gt;around&lt;/code&gt; hooks in RSpec? Dru Riley explains.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://pothibo.com/2013/07/authentication-with-warden-devise-less/&quot; style=&quot;&quot;&gt;Authentication with Warden, Devise-Less&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wesbos.com/migrating-to-sublime-text-3/&quot; style=&quot;&quot;&gt;Can I Use ST3 Yet? Migrating to Sublime Text 3&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://blog.engineyard.com/2013/using-postgresql-hstore-in-a-rails-application-on-engine-yard-cloud&quot; style=&quot;font-weight:bold;&quot;&gt;Using PostgreSQL's 'hstore' in A Rails Application on Engine Yard Cloud&lt;/a&gt;&lt;br /&gt;
If you want to take advantage of schemaless features without abandoning your relational database, using 'hstore' within Postgres is a great option. Here's an  introduction on using the hstore PostgreSQL extension in a Rails app.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.xdite.net/posts/2013/07/21/implement-subdomain-custom-domain&quot; style=&quot;font-weight:bold;&quot;&gt;Implementing Subdomain and Custom Domain Support in Rails&lt;/a&gt;&lt;br /&gt;
A look at how one development team implement subdomain and custom domain features in their Rails app.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.dcxn.com/2013/07/12/introduction-to-vagrant-for-rails-developers/&quot; style=&quot;&quot;&gt;An Introduction to Vagrant for Rails Developers&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://codegangsta.io/blog/2013/07/21/creating-cli-applications-in-go/&quot; style=&quot;&quot;&gt;On Distributing Command Line Applications: Why I Switched from Ruby to Go&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Events&lt;/h3&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.dotrb.eu/&quot; style=&quot;font-weight:bold;&quot;&gt;dotRB: The Largest Ruby Conference in France (October 18, Paris)&lt;/a&gt;&lt;br /&gt;
Following on from a successful 'dotJS' JavaScript event comes dotRB. Announced speakers so far include Steve Klabnik, Konstantin Haase, and Brian Ford.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://nickelcityruby.com/&quot; style=&quot;&quot;&gt;Nickel City Ruby Conference - September 20-21, 2013 - Buffalo, NY&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Watching&lt;/h3&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://video.la-conf.org/2013&quot; style=&quot;font-weight:bold;&quot;&gt;11 Talks from La Conf Paris&lt;/a&gt;&lt;br /&gt;
Some big names to enjoy here including Yehuda Katz, Amy Hoy, Sandi Metz, and Steve Klabnik.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.youtube.com/watch?v=4_TqAMWbzfw&quot; style=&quot;font-weight:bold;&quot;&gt;Deathmatch: Bundler vs Rubygems.org&lt;/a&gt;&lt;br /&gt;
At GoRuCo 2013, Andre Arko told the story of the quest to make 'bundle install' faster.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.codeship.io/2013/07/16/testing-tuesday-14-how-to-set-up-rspec.html&quot; style=&quot;font-weight:bold;&quot;&gt;How to Set Up RSpec&lt;/a&gt;&lt;br /&gt;
A well produced 6 minute screencast.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.youtube.com/watch?v=t8dj56h2gbg&quot; style=&quot;font-weight:bold;&quot;&gt;To Know A Garbage Collector&lt;/a&gt;&lt;br /&gt;
Mike Bernstein discusses his experiments with MRI Ruby's garbage collector, his investigations into other languages and the influence of their GC implementations, the history of the subject, and more.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rubyrogues.com/114-rr-elixir-with-jose-valim/&quot; style=&quot;&quot;&gt;The Ruby Rogues Discuss 'Elixir' with José Valim&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.youtube.com/watch?v=ronr_CG8x0Y&quot; style=&quot;font-weight:bold;&quot;&gt;Kata and Analysis with Jim Weirich &lt;/a&gt;&lt;br /&gt;
From RubyConf India 2013 comes a live coding session by the inimitable Jim Weirich where he walks through the popular 'roman numeral' conversion kata using TDD along the way.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.youtube.com/watch?v=pwv7ZBAHE4s&quot; style=&quot;font-weight:bold;&quot;&gt;Aaron 'tenderlove' Patterson's RubyConf India 2013 Keynote&lt;/a&gt;&lt;br /&gt;
An hour with Ruby and Rails core contributor Aaron 'tenderlove' Patterson covering esoteric Ruby stuff and Postgres to career advice and cats. &lt;em&gt;Warning: The audio is rather poor here and cuts out entirely for the second half so don't waste your time if this will drive you crazy.&lt;/em&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.codeship.io/2013/07/02/testing-tuesday-12-euruko-2013.html&quot; style=&quot;font-weight:bold;&quot;&gt;5 Minutes of EuRuKo 2013&lt;/a&gt;&lt;br /&gt;
European Ruby conference (EuRuKo) took place in Athens last month and Clemens Helm has put together a 5 minute collection of clips and insights from the event. Includes Matz, Xavier Noria, Benjamin Smith, Pat Shaughnessy and Steve Klabnik.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.youtube.com/watch?v=qkvEjZ-mGQA&quot; style=&quot;font-weight:bold;&quot;&gt;Nokogiri: History and Future&lt;/a&gt;&lt;br /&gt;
Nokogiri is the most popular way to parse and process XML in Ruby and at GoRuCo 2013, Mike Dalessio gave a short 11 minute talk on the origins of the project, how to determine if it suits you, and looks at some of the tooling around it.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rubyrogues.com/113-rr-devops-with-nathen-harvey/&quot; style=&quot;&quot;&gt;The Ruby Rogues Discuss 'DevOps'&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jstorimer.com/blogs/workingwithcode/8256963-interview-daniel-huckstep-on-rubys-stdlib-and-golang&quot; style=&quot;&quot;&gt;Daniel Huckstep on Ruby's Standard Library and Go (the language)&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Libraries, Code and Tools&lt;/h3&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.propublica.org/nerds/item/upton-a-web-scraping-framework&quot; style=&quot;font-weight:bold;&quot;&gt;Upton: A Web Scraping Framework&lt;/a&gt;&lt;br /&gt;
A Ruby-based web-scraping framework that abstracts away the common parts of web scraping so developers can concentrate on the unique parts of their project.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/chrisvfritz/language_filter&quot; style=&quot;font-weight:bold;&quot;&gt;LanguageFilter: Detect and Optionally Filter Multiple Categories of Language&lt;/a&gt;&lt;br /&gt;
Wave goodbye to sex, hatred, profanity, violence, etc, in your app.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jimmycuadra.github.io/lita/&quot; style=&quot;font-weight:bold;&quot;&gt;Lita: A Ruby Chat Bot with Redis-based Storage&lt;/a&gt;&lt;br /&gt;
Can be twisted to work with any chat service and extended with plugins.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/banister/funkify&quot; style=&quot;&quot;&gt;Funkify: Haskell-style Partial Application and Composition for Ruby Methods&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/mancmelou/lexeme&quot; style=&quot;&quot;&gt;Lexeme: A Simple Lexical Analyzer Written in Ruby&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/moger777/missingly&quot; style=&quot;&quot;&gt;Missingly: A DSL for Handling method_missing Hooks&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/jclem/q-defer&quot; style=&quot;&quot;&gt;Q: A Lightweight Promises Implementation in Ruby&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://discuss.gemnasium.com/t/pkgr-make-a-package-out-of-a-rails-app-in-5-minutes/59&quot; style=&quot;font-weight:bold;&quot;&gt;Pkgr: Make A Debian Package Out of A Rails App in 5 Minutes&lt;/a&gt;&lt;br /&gt;
A high-level tool that turns Rails applications into native Debian packages.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://flynn.io/&quot; style=&quot;font-weight:bold;&quot;&gt;Flynn - Open Source Platform As A Service, Powered by Docker&lt;/a&gt;&lt;br /&gt;
Flynn is an as-yet-unreleased Heroku-inspired system to simplify deploying and maintaining apps. Instead of using complex config management systems, Flynn allows self-serve management of containerized deployments. The creator is currently trying to raise money to work on the project.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rackerlabs.github.io/rumm/&quot; style=&quot;&quot;&gt;Rumm: A Command Line Interface and API to Rackspace Cloud&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.rubymotion.com/post/56232015979/new-in-rubymotion-blocks-rewrite-retain-cycle&quot; style=&quot;&quot;&gt;New in RubyMotion: Blocks Rewrite, Retain Cycle Detection, Better Crash Reporting&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Jobs&lt;/h3&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bendyworks.com/careers&quot; style=&quot;font-weight:bold;&quot;&gt;Software Craftsperson at Bendyworks&lt;/a&gt;&lt;br /&gt;If you're the type of person who learns new languages as a matter of course, contributes to open source for fun, and ships code with a calm and collected professionalism: you seem like our kind of developer. Join our world-class team in Madison, Wisconsin.&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.rabble.se/jobb/#backend-api-utvecklare&quot; style=&quot;font-weight:bold;&quot;&gt;Senior backend- / API-developer at Rabble (Stockholm, Sweden)&lt;/a&gt;&lt;br /&gt;Tired of bullshit ads? Help us develop Sweden's leading app for mobile offers, where customers and businesses meet on equal terms! Join us in the heart of Stockholm to play with geospatial data and Ruby API's all day long!&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
  &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://supadupa.me/jobs&quot;&gt;&lt;img src=&quot;http://s3.amazonaws.com/nlga/uploads/item/image/12492/i.gif&quot; width=&quot;133&quot; height=&quot;100&quot; style=&quot;float:right;margin-left:14px;margin-bottom:16px;border:1px solid #1173c7;&quot;/&gt;&lt;/a&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://supadupa.me/jobs&quot; style=&quot;font-weight:bold;&quot;&gt;Ruby on Rails developer at SupaDupa (London, UK)&lt;/a&gt;&lt;br /&gt;
We're looking for an experienced Ruby on Rails developer to join the small team behind SupaDupa.me, an e-commerce platform aimed at creatives. Excited about the challenge of working on the full stack, from front-end dev to system administration? Get in touch!
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://las-it.github.io/blog/2013/07/05/ruby-programmer-it-and-system-automation/&quot; style=&quot;font-weight:bold;&quot;&gt;Ruby Programmer: IT and System Automation&lt;/a&gt;&lt;br /&gt;Want to change the future of education? We are trying to build an awesome team that enjoys challenges and results. Interested? Come work with us in beautiful Switzerland.&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jobs.rubyinside.com/a/jbb/job-details/865115&quot; style=&quot;font-weight:bold;&quot;&gt;RoR/Agile Developer at Simon &amp;#038; Schuster [New York, New York]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jobs.rubyinside.com/a/jbb/job-details/868471&quot; style=&quot;font-weight:bold;&quot;&gt;Ruby on Rails Developer at WegoWise [Cambridge, Massachusetts]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://hire.jobvite.com/j/?cj=oqRWWfwT&amp;#038;s=Ruby_weekly&quot; style=&quot;font-weight:bold;&quot;&gt;Ruby Developers at HouseTrip (London, UK)&lt;/a&gt;&lt;br /&gt;
Want to work with a 18-person team of passionate Ruby developers who love good code and care for their product in central London? We are currently hiring. Ranked by Wired Magazine the number two start-up in London (2012), HouseTrip is Europe’s largest holiday rental booking website!
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://cooperpress.com/jobs&quot; style=&quot;&quot;&gt;Get your job listing in a future issue of Ruby Weekly&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Last but not least..&lt;/h3&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://twitter.com/n0kada/status/351556831958667264&quot; style=&quot;font-weight:bold;&quot;&gt;ruby -run -e httpd . -p5000&lt;/a&gt;&lt;br /&gt;
Run a local HTTP server with a single line of Ruby. Just one character longer than the classic &lt;code&gt;python -m SimpleHTTPServer&lt;/code&gt; but more obviously flexible (plus, it's Ruby ;-)).
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/RubyInside?a=DnV1vfvXHoM:29Glx9CO5-8:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/RubyInside?a=DnV1vfvXHoM:29Glx9CO5-8:3H-1DwQop_U&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/RubyInside?i=DnV1vfvXHoM:29Glx9CO5-8:3H-1DwQop_U&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/RubyInside/~4/DnV1vfvXHoM&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <author>Peter Cooper</author>
         <guid isPermaLink="false">http://www.rubyinside.com/?p=6156</guid>
         <pubDate>Thu, 25 Jul 2013 16:25:44 +0000</pubDate>
      </item>
      <item>
         <title>Does the GIL Make Your Ruby Code Thread-Safe?</title>
         <link>http://feedproxy.google.com/~r/RubyInside/~3/X_p9hIpi7y4/does-the-gil-make-your-ruby-code-thread-safe-6051.html</link>
         <description>&lt;p&gt;&lt;img style=&quot;float:right;margin-right:18px;margin-bottom:18px;&quot; src=&quot;http://www.rubyinside.com/wp-content/uploads/2013/06/lock.png&quot; alt=&quot;&quot; width=&quot;125&quot; height=&quot;125&quot;/&gt;&lt;strong&gt;&lt;em&gt;This is a guest post by &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jstorimer.com/&quot;&gt;Jesse Storimer&lt;/a&gt;. He teaches the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jstorimer.com/products/unix-fu-workshop?utm_source=ri&amp;amp;utm_medium=web&amp;amp;utm_campaign=gil-3&quot;&gt;Unix fu workshop&lt;/a&gt;, an online class for Ruby developers looking to do some awesome systems hacking in Ruby and boost their confidence when it comes to their server stack. Spots are limited, so check it out the class while there's still room. He's also the esteemed author of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jstorimer.com/products/working-with-unix-processes&quot;&gt;Working with Unix Processes&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jstorimer.com/products/working-with-tcp-sockets&quot;&gt;Working with TCP Sockets&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jstorimer.com/products/working-with-ruby-threads&quot;&gt;Working with Ruby Threads.&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are some misconceptions in the Ruby community about this question surrounding MRI's GIL. If you only take one thing away from this article today, let it be this: &lt;strong&gt;The GIL does not make your Ruby code thread-safe.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;But you shouldn't take my word for it.&lt;/p&gt;
&lt;p&gt;This series started off just trying to understand what the GIL is at a technical level. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jstorimer.com/blogs/workingwithcode/8085491-nobody-understands-the-gil&quot;&gt;Part 1&lt;/a&gt; explained how race conditions could occur in the C code that's used to implement MRI. Yet, the GIL seemed to eliminate that risk, at least for the &lt;code&gt;Array#&amp;lt;&amp;lt;&lt;/code&gt; method we looked at.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jstorimer.com/blogs/workingwithcode/8100871-nobody-understands-the-gil-part-2-implementation&quot;&gt;Part 2&lt;/a&gt; confirmed that the GIL did, in fact, make MRI's native C method implementations atomic. In other words, these native implementations were free from race conditions. These guarantees only applied to MRI's native C functions, not to the Ruby that your write. So we were left with a lingering question:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Does the GIL provide any guarantee that your Ruby code will be thread-safe?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I've already answered that question. Now I want to make sure that the misconception doesn't go any further.&lt;/p&gt;
&lt;h2&gt;Race conditions redux&lt;/h2&gt;
&lt;p&gt;Race conditions exist when some piece of data is shared between multiple threads, and those threads attempt to act on that data at the same time. When this happens without some kind of synchronization, like locking, your program can start to do unexpected things and data can be lost.&lt;/p&gt;
&lt;p&gt;Let's step back and recap how such a race condition can occur. We'll use the following Ruby code example for this section:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;
&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Sheep&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;initialize&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@shorn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;false&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;shorn?&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@shorn&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;shear!&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;shearing...&quot;&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@shorn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This class definition should be nothing new. A &lt;code&gt;Sheep&lt;/code&gt; is not shorn when initialized. The &lt;code&gt;shear!&lt;/code&gt; method performs the shearing and marks the sheep as shorn.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.rubyinside.com/wp-content/uploads/2013/06/sheep.jpg&quot;&gt;&lt;img class=&quot;size-medium wp-image-6063 alignleft&quot; src=&quot;http://www.rubyinside.com/wp-content/uploads/2013/06/sheep-300x220.jpg&quot; alt=&quot;&quot; width=&quot;210&quot; height=&quot;154&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;
&lt;pre&gt;&lt;span class=&quot;n&quot;&gt;sheep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Sheep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;

&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;times&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;unless&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sheep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shorn?&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;sheep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shear!&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The bit of code creates a new sheep and spawns 5 threads. Each thread races to check if the sheep has been &lt;code&gt;shorn?&lt;/code&gt; If not, it invokes the &lt;code&gt;shear!&lt;/code&gt; method.&lt;/p&gt;
&lt;p&gt;Here's the result I see from running this on MRI 2.0 several times.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;
&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; ruby check_then_set.rb
&lt;span class=&quot;go&quot;&gt;shearing...&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; ruby check_then_set.rb
&lt;span class=&quot;go&quot;&gt;shearing...&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;shearing...&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; ruby check_then_set.rb
&lt;span class=&quot;go&quot;&gt;shearing...&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;shearing...&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Sometimes the same sheep is being shorn twice!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you were under the impression that the GIL made your code 'just work' in the presence of multiple threads, this should dispel that.&lt;/strong&gt; The GIL can make no such guarantee. Notice that the first time running the file, the expected result was produced. In subsequent runs, unexpected output was produced. If you continued running the example, you'll see still different variations.&lt;/p&gt;
&lt;p&gt;These unexpected results are due to a race condition in your Ruby code. It's actually a common enough race condition that there's a name to describe this pattern: &lt;strong&gt;a check-then-set race condition&lt;/strong&gt;. In a check-then-set race condition, two or more threads check a value, then set some state based on that value. With nothing to provide atomicity, it's possible that two threads race past the 'check' phase, then both perform the 'set' phase.&lt;/p&gt;
&lt;h2&gt;Recognizing race conditions&lt;/h2&gt;
&lt;p&gt;Before we look at how to fix this, first I want you to understand how to recognize this. I owe &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://twitter.com/brixen&quot;&gt;@brixen&lt;/a&gt; for introducing to me the terminology of &lt;em&gt;interleavings&lt;/em&gt; in the context of concurrency. It's really helpful.&lt;/p&gt;
&lt;p&gt;Remember that a context switch can occur on any line of your code. When switching from one thread to another, imagine your program being chopped up into a set of discrete blocks. This sequential set of blocks is a set of interleavings.&lt;/p&gt;
&lt;p&gt;At one end of the spectrum, it's possible that there's a context switch after every line of code! This set of interleavings would have each line of code interleaved. At the other end of the spectrum, it's possible that there are no context switches during the body of the thread. This set of interleavings would have all the code in its original order for each thread. In between these two ends, there are lots of ways that your program can be chopped up and interleaved.&lt;/p&gt;
&lt;p&gt;Some of these interleavings are OK. Not every line of code introduces a race condition. But imagining your programs as a set of possible interleavings can help you recognize when race conditions &lt;em&gt;do&lt;/em&gt; occur. I'll use a series of diagrams to show this code may be interleaved by two Ruby threads.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.rubyinside.com/wp-content/uploads/2013/06/interleavings-legend-100.png&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-6088&quot; src=&quot;http://www.rubyinside.com/wp-content/uploads/2013/06/interleavings-legend-100.png&quot; alt=&quot;&quot; width=&quot;457&quot; height=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Just to make the diagrams simpler, I replaced the &lt;code&gt;shear!&lt;/code&gt; method call with the code from the body of the method.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Consider this diagram the legend for the ones to follow; the code highlighted in red is the set of interleavings from &lt;em&gt;Thread A&lt;/em&gt;, the code highlighted in blue is the set of interleavings from &lt;em&gt;Thread B&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Now let's see how this code could be interleaved by simulating context switches. The simplest case is if neither thread is interrupted during the course of executing this code. This would result in no race conditions and would produce the expected output for us. That might look like this:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.rubyinside.com/wp-content/uploads/2013/06/interleavings-first-100.png&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-6092&quot; src=&quot;http://www.rubyinside.com/wp-content/uploads/2013/06/interleavings-first-100.png&quot; alt=&quot;&quot; width=&quot;473&quot; height=&quot;358&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now I've organized the diagram so you can see the sequential ordering of events. &lt;strong&gt;Remember that the GIL locks around the execution of Ruby code, so two threads can't truly run in parallel&lt;/strong&gt;. The ordering of events here is sequential, starting at the top and working down.&lt;/p&gt;
&lt;p&gt;In this interleaving, &lt;em&gt;Thread A&lt;/em&gt; did all of its work, then the thread scheduler triggered a context switch to &lt;em&gt;Thread B&lt;/em&gt;. Since &lt;em&gt;Thread A&lt;/em&gt; had already done the shearing and updated the &lt;code&gt;shorn&lt;/code&gt; variable, &lt;em&gt;Thread B&lt;/em&gt; didn't have anything to do.&lt;/p&gt;
&lt;p&gt;But it isn't always this simple. Remember that the thread scheduler could trigger a context switch at &lt;em&gt;any&lt;/em&gt; point in this block of code. This time we just got lucky.&lt;/p&gt;
&lt;p&gt;Let's look at a more nefarious example, one that would produce unexpected output for us.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.rubyinside.com/wp-content/uploads/2013/06/interleavings-first-variation-100.png&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-6091&quot; src=&quot;http://www.rubyinside.com/wp-content/uploads/2013/06/interleavings-first-variation-100.png&quot; alt=&quot;&quot; width=&quot;462&quot; height=&quot;451&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this possible interleaving, the context switch occurs right at a point that can cause trouble. &lt;em&gt;Thread A&lt;/em&gt; checks the condition and starts shearing. Then the thread scheduler schedules a context switch and &lt;em&gt;Thread B&lt;/em&gt; takes over. Even though &lt;em&gt;Thread A&lt;/em&gt; already performed the shearing, it didn't get a chance to update the &lt;code&gt;shorn&lt;/code&gt; attribute yet, so &lt;em&gt;Thread B&lt;/em&gt; doesn't know about it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thread B&lt;/em&gt; checks the condition for itself, finds it to be &lt;code&gt;false&lt;/code&gt;, and shears the sheep again. Once it finishes, &lt;em&gt;Thread A&lt;/em&gt; is scheduled again and finishes execution. Even though &lt;em&gt;Thread B&lt;/em&gt; set &lt;code&gt;shorn = true&lt;/code&gt; when it ran through the code, &lt;em&gt;Thread A&lt;/em&gt; does it again because it picks up exactly where it left off.&lt;/p&gt;
&lt;p&gt;A sheep getting shorn twice may not seem like much to care about, but replace sheep with invoice, and shearing with collecting payment; we would have some unhappy customers!&lt;/p&gt;
&lt;p&gt;I'll share one more example to illustrate the non-deterministic nature of things here.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.rubyinside.com/wp-content/uploads/2013/06/interleavings-take4-100.png&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-6093&quot; src=&quot;http://www.rubyinside.com/wp-content/uploads/2013/06/interleavings-take4-100.png&quot; alt=&quot;&quot; width=&quot;468&quot; height=&quot;451&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This just adds more context switches, so each thread progresses a little bit at a time, but keeps switching back and forth. Let your mind take this to its logical conclusion, it's possible for a context switch to happen on any line of the program. The interleaving that occurs can also be different each time the code is executed, so it may produce the expected result on one iteration, and an unexpected result the next time around.&lt;/p&gt;
&lt;p&gt;This is really a great way to think about race conditions. When you're writing multi-threaded code, you want to be thinking about how the program might be chopped up and interleaved, and the effects of various interleavings. If it seems that some interleavings will lead to incorrect results, you should re-think your approach to the problem or introduce synchronization with &lt;code&gt;Mutex&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;This is terrible!&lt;/h2&gt;
&lt;p&gt;At this point it seems fitting to tell you that you can make this code example thread-safe by introducing synchronization with &lt;code&gt;Mutex&lt;/code&gt;. It's true, you &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://gist.github.com/jstorimer/5802725&quot;&gt;can do that&lt;/a&gt;. But I intentionally cooked up this example to prove a point;  it's terrible code. You shouldn't write code like this in a multi-threaded environment.&lt;/p&gt;
&lt;p&gt;Whenever you have multiple threads sharing a reference to an object, and making modifications to it, you're going to run into trouble unless you have some kind of locking in place to prevent a context switch from happening in the middle of the modification.&lt;/p&gt;
&lt;p&gt;However, this particular race condition is easily solvable without explicitly using locks in your code. Here's one solution using &lt;code&gt;Queue&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;
&lt;pre&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'thread'&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Sheep&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;sheep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Sheep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sheep_queue&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Queue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sheep_queue&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sheep&lt;/span&gt;

&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;times&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;begin&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;sheep&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sheep_queue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

      &lt;span class=&quot;n&quot;&gt;sheep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shear!&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;rescue&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ThreadError&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;# raised by Queue#pop in the threads&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;# that don't pop the sheep&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I left out the &lt;code&gt;Sheep&lt;/code&gt; implementation because it's the same. Now, instead of each thread sharing the &lt;code&gt;sheep&lt;/code&gt; object and racing to shear it, the &lt;code&gt;Queue&lt;/code&gt; provides the synchronization.&lt;/p&gt;
&lt;p&gt;If you run this against MRI, or any of the other truly parallel Ruby implementations, it will produce the expected result every time. &lt;strong&gt;We've eliminated the race condition in this code.&lt;/strong&gt; Even though all the threads may call the &lt;code&gt;Queue#pop&lt;/code&gt; method at more-or-less the same time, it uses a &lt;code&gt;Mutex&lt;/code&gt; internally to ensure that only one thread can receive the sheep.&lt;/p&gt;
&lt;p&gt;Once this single thread receives the sheep, the race condition disappears. With just one thread, there's no one else to race with!&lt;/p&gt;
&lt;p&gt;The reason I suggest using &lt;code&gt;Queue&lt;/code&gt; instead of a lock is that its simpler to use a Queue correctly. Locks are notoriously easy to get wrong. They bring new concerns like deadlocking and performance degradations when used incorrectly. Using a data structure is like depending on an abstraction. It wraps up the tricky stuff in a more restrictive, but simpler API.&lt;/p&gt;
&lt;h2&gt;Lazy initialization&lt;/h2&gt;
&lt;p&gt;I'll just quickly point out that lazy initialization is another form of the the check-then-set race condition. The &lt;code&gt;||=&lt;/code&gt; operator effectively expands to&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;
&lt;pre&gt;&lt;span class=&quot;vi&quot;&gt;@logger&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Logger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# expands to &lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@logger&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;nil&lt;/span&gt;
  &lt;span class=&quot;vi&quot;&gt;@logger&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Logger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;vi&quot;&gt;@logger&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Look at the expanded version and imagine where the interleavings could occur. With multiple threads and no synchronization, it's definitely possible for that &lt;code&gt;@logger&lt;/code&gt; to be initialized twice. Again, initializing a &lt;code&gt;Logger&lt;/code&gt; twice may not be a problem in this case, but I have seen bugs like this &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/krisleech/wisper/commit/38c7783887a5dabdb7d7c93910dcedbf6d94f308&quot;&gt;in the wild&lt;/a&gt; that &lt;em&gt;do&lt;/em&gt; cause issues.&lt;/p&gt;
&lt;h2&gt;Reflections&lt;/h2&gt;
&lt;p&gt;I want to leave you with some lessons at the end of all this.&lt;/p&gt;
&lt;p&gt;4 out of 5 dentists agree that multi-threaded programming is hard to get right.&lt;/p&gt;
&lt;p&gt;At the end of the day, all that the GIL guarantees is that MRI's native C implementations of Ruby methods will be executed atomically (but even this has &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jstorimer.com/blogs/workingwithcode/8100871-nobody-understands-the-gil-part-2-implementation#comment-930773796&quot;&gt;caveats&lt;/a&gt;). This behaviour can sometimes help us as Ruby developers, but the GIL is really there for the protection of MRI internals, not as a dependable API for Ruby developers.&lt;/p&gt;
&lt;p&gt;So the GIL doesn't 'solve' thread-safety issues. As I said, getting multi-threaded programming right is hard, but we solve hard problems every day. One way that we work with hard problems is with good abstractions.&lt;/p&gt;
&lt;p&gt;For example, when I need to do an HTTP request in my code, I need to use a socket. But I don't usually use a socket directly, that would be cumbersome and error-prone. Instead, I use an abstraction. An HTTP client provides a more restrictive, simpler API that hides the socket interactions and associated edge cases from me.&lt;/p&gt;
&lt;p&gt;If multi-threaded programming is hard to get right, maybe you shouldn't be doing it directly.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;If you add a thread to your application, you've probably added five new bugs in doing so.&quot;&lt;/p&gt;
&lt;p&gt;- &lt;a rel=&quot;nofollow&quot;&gt;Mike Perham&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;We're seeing more and more abstractions around threads. An approach that's catching on in the Ruby community is the Actor model of concurrency, with the most popular implementation being &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://celluloid.io&quot;&gt;Celluloid&lt;/a&gt;. Celluloid provides a great abstraction that marries concurrency primitives to Ruby's object model. Celluloid can't guarantee that your code will be thread-safe or free from race conditions, but it wraps up best practices. I encourage you &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/celluloid/celluloid/wiki/Basic-usage&quot;&gt;give Celluloid&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://railscasts.com/episodes/367-celluloid&quot;&gt;a try&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These problems that we're talking about aren't specific to Ruby or MRI. This is the reality of programming in a multi-core world. The number of cores on our devices is only going up, and MRI is still figuring out its answer to this situation. Despite its guarantees, the GIL's restriction on parallel execution seems like the wrong direction. This is part of MRI's growing pains. Other implementations, like JRuby and Rubinius, are running truly parallel with no GIL.&lt;/p&gt;
&lt;p&gt;We're seeing lots of new languages that have concurrency abstractions built-in at the core of the language. The Ruby language doesn't have any of this, at least not yet. Another benefit of relying on abstraction is that the abstractions can improve their implementation, while your code remains unchanged. For example, if the implementation of Queue switched from relying on locks to using &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://gist.github.com/jstorimer/5298581&quot;&gt;lock-free synchronization&lt;/a&gt;, your code would reap the benefits without any modification.&lt;/p&gt;
&lt;p&gt;For the time being, Ruby developers should educate themselves about these issues! Learn about concurrency. Be aware of race conditions. Thinking about code as interleavings can help you reason about race conditions.&lt;/p&gt;
&lt;p&gt;I'll leave off with a quote that's influencing much of the work being done in the larger field of concurrency today:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Don't communicate by sharing state; share state by communicating.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Using data structures for synchronization supports this; the Actor model supports this. This idea is at the core of the concurrency model of languages like Go, Erlang, and others.&lt;/p&gt;
&lt;p&gt;Ruby needs to look to what's working in other languages and embrace it. As a Ruby developer, you can do this today by trying out and supporting some of these alternative approaches. With more people on board, these approaches could become the new standard for Ruby.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks to Brian Shirai for reviewing a draft of this.&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/RubyInside?a=X_p9hIpi7y4:7cl6I14axe4:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/RubyInside?a=X_p9hIpi7y4:7cl6I14axe4:3H-1DwQop_U&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/RubyInside?i=X_p9hIpi7y4:7cl6I14axe4:3H-1DwQop_U&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/RubyInside/~4/X_p9hIpi7y4&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <author>Jesse Storimer</author>
         <guid isPermaLink="false">http://www.rubyinside.com/?p=6051</guid>
         <pubDate>Wed, 19 Jun 2013 14:19:34 +0000</pubDate>
      </item>
      <item>
         <title>Let Nunes Do It</title>
         <link>http://feedproxy.google.com/~r/railstips/~3/zCrZNoIGZdQ/</link>
         <description>&lt;p&gt;In a moment of either genius or delirium I decided to name my newest project after myself. Why? Well, here is the story whether you want to know or not.&lt;/p&gt;
&lt;h2&gt;Why Nunes?&lt;/h2&gt;
&lt;p&gt;Naming is always the hardest part of a project. Originally, it was named Railsd. The idea of the gem is automatically subscribe to all of the valuable Rails instrumentation events and send them to statsd in a sane way, thus Railsd was born.&lt;/p&gt;
&lt;p&gt;After working on it a bit, I realized that the project was just an easy way to send Rails instrumentation events to any service that supports counters and timers. With a few tweaks, I made Railsd support &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://instrumentalapp.com&quot;&gt;InstrumentalApp&lt;/a&gt;, a favorite service of mine, in addition to Statsd.&lt;/p&gt;
&lt;p&gt;Thus came the dilemma. No longer did the (already terrible) name Railsd make sense. As I sat and thought about what to name it, I remembered joking one time about naming a project after myself, so that every time anyone used it they had no choice but to think about me. &lt;strong&gt;Thus &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/jnunemaker/nunes&quot;&gt;Nunes&lt;/a&gt; was born&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Lest you think that I just wanted to name it Nunes only so that you think of me, here is a bit more detail. Personally, I attempt to instrument everything I can. Be it code, the steps I take, or the calories I consume, I want to know what is going on. I have also noticed that which is automatically instrumented is the easiest to instrument.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I love tracking data so deeply that I want to instrument your code. Really, I do&lt;/strong&gt;. I want to clone your repo, inject a whole bunch of instrumentation and deploy it to production, so you can know exactly what is going on. I want to sit over your shoulder and look at the graphs with you. Ooooooh, aren&amp;#8217;t those some pretty graphs!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But I don&amp;#8217;t work for you, or with you, so that would be weird&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Instead, I give you Nunes. I give you Nunes as a reminder that I want to instrument everything and you should too. I give you Nunes so that instrumenting is so easy that you will feel foolish not using it, at least a start. Go ahead, the first metric is free! Yep, I want you to have that first hit and get addicted, like me.&lt;/p&gt;
&lt;h2&gt;Using Nunes&lt;/h2&gt;
&lt;p&gt;I love instrumenting things. Nunes loves instrumenting things. To get started, just add Nunes to your gemfile:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;# be sure to think of me when you do :)
gem &quot;nunes&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once you have nunes in your bundle (be sure to think of bundling me up with a big hug), you just need to tell nunes to subscribe to all the fancy events and provide him with somewhere to send all the glorious metrics:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;# yep, think of me here too
require 'nunes'

# for statsd
statsd = Statsd.new(...)
Nunes.subscribe(statsd) # ooh, ooh, think of me!

# for instrumental
I = Instrument::Agent.new(...)
Nunes.subscribe(I) # one moooore tiiiime!&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With just those couple of lines, you get a whole lot of goodness. Out of the box, Nunes will subscribe to the following Rails instrumentation events:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;process_action.action_controller&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;render_template.action_view&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;render_partial.action_view&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;deliver.action_mailer&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;receive.action_mailer&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;sql.active_record&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;cache_read.active_support&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;cache_generate.active_support&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;cache_fetch_hit.active_support&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;cache_write.active_support&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;cache_delete.active_support&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;cache_exist?.active_support&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to all the wonderful information those events provide, you will instantly get some of these counter metrics:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;action_controller.status.200&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;action_controller.format.html&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;action_controller.exception.RuntimeError&lt;/code&gt; &amp;#8211; where RuntimeError is the class of any exceptions that occur while processing a controller&amp;#8217;s action.&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;active_support.cache_hit&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;active_support.cache_miss&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And these timer metrics:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;action_controller.runtime&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;action_controller.view_runtime&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;action_controller.db_runtime&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;action_controller.posts.index.runtime&lt;/code&gt; &amp;#8211; where &lt;code&gt;posts&lt;/code&gt; is the controller and &lt;code&gt;index&lt;/code&gt; is the action&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;action_view.app.views.posts.index.html.erb&lt;/code&gt; &amp;#8211; where &lt;code&gt;app.views.posts.index.html.erb&lt;/code&gt; is the path of the view file&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;action_view.app.views.posts._post.html.erb&lt;/code&gt; &amp;#8211; I can even do partials! woot woot!&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;action_mailer.deliver.post_mailer&lt;/code&gt; &amp;#8211; where &lt;code&gt;post_mailer&lt;/code&gt; is the name of the mailer&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;action_mailer.receive.post_mailer&lt;/code&gt; &amp;#8211; where &lt;code&gt;post_mailer&lt;/code&gt; is the name of the mailer&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;active_record.sql&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;active_record.sql.select&lt;/code&gt; &amp;#8211; also supported are insert, update, delete, transaction_begin and transaction_commit&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;active_support.cache_read&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;active_support.cache_generate&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;active_support.cache_fetch&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;active_support.cache_fetch_hit&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;active_support.cache_write&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;active_support.cache_delete&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;active_support.cache_exist&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;But Wait, There is More!&lt;/h2&gt;
&lt;p&gt;In addition to doing all that work for you out of the box, Nunes will also help you wrap your own code with instrumentation. I know, I know, sounds too good to be true.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
class User &amp;lt; ActiveRecord::Base
  extend Nunes::Instrumentable # OH HAI IT IS ME, NUNES

  # wrap save and instrument the timing of it
  instrument_method_time :save
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will instrument the timing of the User instance method save. What that means is when you do this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;# the nerve of me to name a user nunes
user = User.new(name: &quot;NUNES!&quot;)
user.save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;An event named &lt;code&gt;instrument_method_time.nunes&lt;/code&gt; will be generated, which in turn is subscribed to and sent to whatever you used to send instrumentation to (statsd, instrumental, etc.). The metric name will default to &amp;#8220;class.method&amp;#8221;. For the example above, the metric name would be &lt;code&gt;user.save&lt;/code&gt;. No fear, you can customize this.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class User &amp;lt; ActiveRecord::Base
  extend Nunes::Instrumentable # never

  # wrap save and instrument the timing of it
  instrument_method_time :save, 'crazy_town.save'
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Passing a string as the second argument sets the name of the metric. You can also customize the name using a Hash as the second argument.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class User &amp;lt; ActiveRecord::Base
  extend Nunes::Instrumentable # gonna

  # wrap save and instrument the timing of it
  instrument_method_time :save, name: 'crazy_town.save'
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In addition to name, you can also pass a payload that will get sent along with the generated event.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
class User &amp;lt; ActiveRecord::Base
  extend Nunes::Instrumentable # give nunes up

  # wrap save and instrument the timing of it
  instrument_method_time :save, payload: {pay: &quot;loading&quot;}
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you subscribe to the event on your own, say to log some things, you&amp;#8217;ll get a key named &lt;code&gt;:pay&lt;/code&gt; with a value of &lt;code&gt;&quot;loading&quot;&lt;/code&gt; in the event&amp;#8217;s payload. Pretty neat, eh?&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I hope you find Nunes useful and that each time you use it, you think of me and how much I want to instrument your code for you, but am not able to. Go forth and instrument!&lt;/p&gt;
&lt;p&gt;P.S. If you have ideas for Nunes, create an issue and start some chatter. Let&amp;#8217;s make Nunes even better!&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/railstips?a=zCrZNoIGZdQ:kuD9dLwDlmA:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railstips?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/railstips?a=zCrZNoIGZdQ:kuD9dLwDlmA:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railstips?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/railstips?a=zCrZNoIGZdQ:kuD9dLwDlmA:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railstips?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/railstips/~4/zCrZNoIGZdQ&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <author>John Nunemaker</author>
         <guid isPermaLink="false">5170477f7a5072364c0026b6</guid>
         <pubDate>Thu, 18 Apr 2013 19:20:00 +0000</pubDate>
      </item>
      <item>
         <title>Using duplicity for full server backup on Ubuntu 12.04</title>
         <link>http://feedproxy.google.com/~r/scientist-home/~3/LrOlrSGFtb0/using-duplicity-for-full-server-backup-on-ubuntu-12-dot-04</link>
         <description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; class=&quot;reference external&quot; target=&quot;_blank&quot; href=&quot;http://duplicity.nongnu.org/&quot;&gt;duplicity&lt;/a&gt; is a great full featured backup tool, providing &amp;quot;encrypted
bandwidth-efficient backups using the rsync algorithm.&amp;quot;  I&amp;#8217;m choosing it for my
backup needs primarily for the follow reasons:&lt;/p&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;Supports a fleet of backup server types, and even a chroot&amp;#8217;d SFTP server will work&lt;/li&gt;
&lt;li&gt;Works with Linux, FreeBSD, and OpenBSD, out of the box&lt;/li&gt;
&lt;li&gt;Does not require root access on the backup server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To perform full server backups using duplicity on your Ubuntu 12.04 system,
simply perform the following.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Install duplicity:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
sudo apt-get install duplicity
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Perform backup (using &lt;tt class=&quot;docutils literal&quot;&gt;rsync&lt;/tt&gt; method):&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
$ sudo -H duplicity --no-encryption &amp;#92;
  --exclude /mnt --exclude /tmp --exclude /proc --exclude /sys &amp;#92;
  / rsync://&amp;lt;user&amp;gt;&amp;#64;&amp;lt;host&amp;gt;//&amp;lt;backup-directory&amp;gt;
&lt;/pre&gt;
&lt;p&gt;You&amp;#8217;ll need to replace &lt;tt class=&quot;docutils literal&quot;&gt;&amp;lt;user&amp;gt;&lt;/tt&gt;, &lt;tt class=&quot;docutils literal&quot;&gt;&amp;lt;host&amp;gt;&lt;/tt&gt; and &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;&amp;lt;backup-directory&amp;gt;&lt;/span&gt;&lt;/tt&gt; with
your backup username, host, and directory, respectively.  See the &amp;quot;Full
Example&amp;quot; below for more info.&lt;/p&gt;
&lt;p&gt;Output should look something like:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
Import of duplicity.backends.sshbackend Failed: No module named paramiko
Import of duplicity.backends.giobackend Failed: No module named gio
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: none
No signatures found, switching to full backup.
&lt;/pre&gt;
&lt;p&gt;If you&amp;#8217;d like your backups to be encrypted, simply remove the
&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;&amp;#8211;no-encryption&lt;/span&gt;&lt;/tt&gt; option and provide a passphrase when prompted.  You&amp;#8217;ll
need this same passphrase to restore from a backup.  It is a symmetric key.
Keep the key very safe; if you lose it, &lt;strong&gt;your backups will be useless&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Schedule regular backups&lt;/p&gt;
&lt;p&gt;The next step is to set this up in &lt;tt class=&quot;docutils literal&quot;&gt;cron&lt;/tt&gt;, so your backups are done
regularly.  The following entries in &lt;tt class=&quot;docutils literal&quot;&gt;/etc/crontab&lt;/tt&gt; will perform a full
backup once a week, Sunday at midnight, then incremental backups the other 6
days of the week (also at midnight).  Additionally, we want to clean up
backups that are too old, so we add an additional entry to keep only the
latest two full backups (plus incrementals).&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
0 0 * * sun     root    duplicity full --no-encryption --exclude /mnt --exclude /tmp --exclude /proc --exclude /sys / rsync://&amp;lt;user&amp;gt;&amp;#64;&amp;lt;host&amp;gt;//&amp;lt;backup-directory&amp;gt;
0 0 * * 1-6     root    duplicity --no-encryption --exclude /mnt --exclude /tmp --exclude /proc --exclude /sys / rsync://&amp;lt;user&amp;gt;&amp;#64;&amp;lt;host&amp;gt;//&amp;lt;backup-directory&amp;gt;
0 8 * * sun     root    duplicity remove-all-but-n-full 2 --force rsync://&amp;lt;user&amp;gt;&amp;#64;&amp;lt;host&amp;gt;//&amp;lt;backup-directory&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;section&quot; id=&quot;full-example-for-an-arp-networks-vps&quot;&gt;
&lt;h2&gt;Full Example for an ARP Networks VPS&lt;/h2&gt;
&lt;p&gt;At &lt;a rel=&quot;nofollow&quot; class=&quot;reference external&quot; target=&quot;_blank&quot; href=&quot;http://www.arpnetworks.com&quot;&gt;ARP Networks&lt;/a&gt;, we provide raw backup space to customers for 10 cents per
GB.  The example below will illustrate how to do a full backup of your Ubuntu
or Debian VPS.  Assuming your backup username is &lt;strong&gt;johndoe&lt;/strong&gt;, simply perform
the following steps.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Add &lt;tt class=&quot;docutils literal&quot;&gt;root&lt;/tt&gt; SSH public key to backup server&lt;/p&gt;
&lt;p&gt;Create an SSH key for &lt;tt class=&quot;docutils literal&quot;&gt;root&lt;/tt&gt; as follows:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
sudo -H ssh-keygen -t rsa -b 2048
&lt;/pre&gt;
&lt;p&gt;Accept the defaults and choose a good passphrase.&lt;/p&gt;
&lt;p&gt;See the &lt;a rel=&quot;nofollow&quot; class=&quot;reference external&quot; target=&quot;_blank&quot; href=&quot;https://portal.arpnetworks.com&quot;&gt;Portal&lt;/a&gt;, click on the &lt;em&gt;Backup Space&lt;/em&gt; service, and then click the link
to submit an SSH key.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Install duplicity:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
sudo apt-get install duplicity
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Perform backup (using &lt;tt class=&quot;docutils literal&quot;&gt;rsync&lt;/tt&gt; method):&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
$ sudo -H duplicity --no-encryption &amp;#92;
  --exclude /mnt --exclude /tmp --exclude /proc --exclude /sys &amp;#92;
  / rsync://johndoe&amp;#64;backup01.cust.arpnetworks.com//home/johndoe
&lt;/pre&gt;
&lt;p&gt;&lt;tt class=&quot;docutils literal&quot;&gt;backup01.cust.arpnetworks.com&lt;/tt&gt; is one of our backup servers.  If the
&lt;a rel=&quot;nofollow&quot; class=&quot;reference external&quot; target=&quot;_blank&quot; href=&quot;https://portal.arpnetworks.com&quot;&gt;Portal&lt;/a&gt; lists a different server for you, use that one.&lt;/p&gt;
&lt;p&gt;Additionally, as mentioned above, if you want your backups to be encrypted, remove the
&lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;&amp;#8211;no-encryption&lt;/span&gt;&lt;/tt&gt; option.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Schedule regular backups&lt;/p&gt;
&lt;p&gt;Put the following in your &lt;tt class=&quot;docutils literal&quot;&gt;/etc/crontab&lt;/tt&gt;&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
0 0 * * sun     root    duplicity full --no-encryption --exclude /mnt --exclude /tmp --exclude /proc --exclude /sys / rsync://johndoe&amp;#64;backup01.cust.arpnetworks.com//home/johndoe
0 0 * * 1-6     root    duplicity --no-encryption --exclude /mnt --exclude /tmp --exclude /proc --exclude /sys / rsync://johndoe&amp;#64;backup01.cust.arpnetworks.com//home/johndoe
0 8 * * sun     root    duplicity remove-all-but-n-full 2 --force rsync://johndoe&amp;#64;backup01.cust.arpnetworks.com//home/johndoe
&lt;/pre&gt;
&lt;p&gt;Note: Please adjust the backup time to your own preference, otherwise many
backups may fire off at the exact same time, slowing down the host.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#8230;and that&amp;#8217;s all there is to it!&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=LrOlrSGFtb0:hdlpzglzGB4:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=LrOlrSGFtb0:hdlpzglzGB4:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=LrOlrSGFtb0:hdlpzglzGB4:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=LrOlrSGFtb0:hdlpzglzGB4:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=LrOlrSGFtb0:hdlpzglzGB4:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=LrOlrSGFtb0:hdlpzglzGB4:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=LrOlrSGFtb0:hdlpzglzGB4:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=LrOlrSGFtb0:hdlpzglzGB4:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <guid isPermaLink="false">http://scie.nti.st/2013/4/13/using-duplicity-for-full-server-backup-on-ubuntu-12-dot-04</guid>
         <pubDate>Sat, 13 Apr 2013 12:23:00 +0000</pubDate>
      </item>
      <item>
         <title>This Week in Ruby: Matz on Ruby 2.0, Numerous Conference CFPs, Tenderlove on define_method</title>
         <link>http://feedproxy.google.com/~r/RubyInside/~3/hgtA2eQfkGI/this-week-in-ruby-matz-on-ruby-2-0-numerous-conference-cfps-tenderlove-on-define_method-6043.html</link>
         <description>&lt;p&gt;Welcome to this week’s roundup of Ruby news, articles, videos, and more, cobbled together from my e-mail newsletter, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rubyweekly.com/&quot;&gt;Ruby Weekly.&lt;/a&gt; Sorry these roundups have been missing for a couple of months, I've been focusing very heavily on the e-mail newsletters which are continuing to grow like crazy! :-) I hope to get back into blogging more soon.&lt;/p&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
  &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://blog.heroku.com/archives/2013/3/6/matz_highlights_ruby_2_0_at_waza&quot;&gt;&lt;img src=&quot;http://s3.amazonaws.com/nlga/uploads/item/image/9315/thumb_matz.png&quot; width=&quot;133&quot; height=&quot;100&quot; style=&quot;float:right;margin-left:14px;margin-bottom:16px;border:1px solid #1173c7;&quot;/&gt;&lt;/a&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://blog.heroku.com/archives/2013/3/6/matz_highlights_ruby_2_0_at_waza&quot; style=&quot;font-weight:bold;&quot;&gt;Matz on Ruby 2.0&lt;/a&gt;&lt;br /&gt;
Matz spoke about Ruby 2.0 ('the happiest release ever') for 30 minutes at the Heroku Waza event a week ago and the video is already available to watch. He stresses that &quot;Ruby 1.8 will die soon&quot; and encourages everyone to upgrade.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://tenderlovemaking.com/2013/03/03/dynamic_method_definitions.html&quot; style=&quot;font-weight:bold;&quot;&gt;Dynamic Method Definitions&lt;/a&gt;&lt;br /&gt;
Aaron 'tenderlove' Patterson says that &quot;depending on your app, using define_method is faster on boot, consumes less memory, and probably doesn’t signigicantly impact performance&quot; compared to eval-based techniques. (And he has the numbers to prove it.)
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://steelcityruby.org/cfp.html&quot; style=&quot;font-weight:bold;&quot;&gt;Steel City Ruby Conference 2013 CFP Now Open&lt;/a&gt;&lt;br /&gt;
Steel City Ruby takes places in Pittsburgh, PA on August 16-17 and the CFP is now open if you want to submit a talk. The Burlington Ruby Conference has &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://burlingtonruby.com/speak.html&quot;&gt;a CFP open too&lt;/a&gt;, as &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://docs.google.com/spreadsheet/viewform?fromEmail=true&amp;amp;formkey=dDFuUVdkY2pkd0I4TTZhRmdSaEdVcFE6MQ&quot;&gt;does RubyConf India.&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.rubygems.org/2013/03/05/2.0.1-released.html&quot; style=&quot;&quot;&gt;RubyGems 2.0.1 Released: A Bug-Fix Release&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Reading&lt;/h3&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://matt.aimonetti.net/posts/2013/03/05/inspecting-rails-4-request-dispatch-using-ruby-2-dot-0/&quot; style=&quot;font-weight:bold;&quot;&gt;Inspecting Rails 4 using Ruby 2.0 and TracePoint&lt;/a&gt;&lt;br /&gt;
Matt Aimonetti shows off a practical use for Ruby 2.0's TracePoint execution tracing functionality.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://cirw.in/blog/find-references&quot; style=&quot;font-weight:bold;&quot;&gt;Visualizing Memory Leaks in Ruby 1.9&lt;/a&gt;&lt;br /&gt;
Conrad Irwin on some clever work to extend ObjectSpace with a new find_references method to perform better analysis on object and memory usage on Ruby 1.9.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://zerowidth.com/2013/02/24/parsing-toml-in-ruby-with-parslet.html&quot; style=&quot;font-weight:bold;&quot;&gt;Parsing TOML in Ruby with Parslet&lt;/a&gt;&lt;br /&gt;
Recently, GitHub founder Tom Preston-Werner created an interesting INI-influenced 'TOML' format. In this series of posts, Nathan Witmer looks at what's involved in building a parser for TOML using the Parslet PEG parser construction library.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/matthewrobertson/ress&quot; style=&quot;font-weight:bold;&quot;&gt;Introducing Ress: A System for Building Mobile Optimized Rails Apps&lt;/a&gt;&lt;br /&gt;
Matthew Robertson introduces his new system for building mobile-optimized Rails applications using semantic, media query-based device detection and server side component optimization.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://speakerdeck.com/peterc/ruby-2-dot-0-walkthrough-the-best-bits&quot; style=&quot;font-weight:bold;&quot;&gt;Ruby 2.0 Walkthrough: The Best Bits&lt;/a&gt;&lt;br /&gt;
Some slides from my yet-to-be-released 'Ruby 2.0 Walkthrough' that quickly skim through what I consider to be the 'best bits' (and not just the headline features).
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.meldium.com/home/2013/3/3/signed-rubygems-part&quot; style=&quot;&quot;&gt;A Practical Guide to Using Signed Ruby Gems - Part 1: Bundler&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.devmynd.com/blog/2013-3-rails-ember-js&quot; style=&quot;font-weight:bold;&quot;&gt;Rails + Ember.js&lt;/a&gt;&lt;br /&gt;
An introduction to the open source Ember.js JavaScript app framework for Rails developers.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.devmynd.com/blog/2013-3-effective-rails-part-2-hiding-activerecord&quot; style=&quot;&quot;&gt;Effective Rails, Part 2: Hiding ActiveRecord&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Watching and Listening&lt;/h3&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://vimeo.com/61087285&quot; style=&quot;font-weight:bold;&quot;&gt;Sinatra in SIX Lines: How to Do Crazy Stuff with Ruby&lt;/a&gt;&lt;br /&gt;
A talk by Konstantin Haase at Ruby Australia.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Libraries and Code&lt;/h3&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.phusion.nl/2013/03/05/phusion-passenger-4-0-release-candidate-4/&quot; style=&quot;font-weight:bold;&quot;&gt;Phusion Passenger 4.0 Release Candidate 4&lt;/a&gt;&lt;br /&gt;
Leading Rack-based app deployment tool Passenger gets yet another step closer to the 4.0 release.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://krainboltgreene.github.com/time-lord/&quot; style=&quot;font-weight:bold;&quot;&gt;time-lord: A Human DSL for Time Expressions&lt;/a&gt;&lt;br /&gt;
A gem that gives you more human like expressions for time and space math. Get fun like &lt;code&gt;1.hour.ago.to_range&lt;/code&gt; and &lt;code&gt;200.minutes.ago.to_words&lt;/code&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/Shopify/identity_cache&quot; style=&quot;font-weight:bold;&quot;&gt;identity_cache: Opt-in Read-through ActiveRecord Caching, From Shopify&lt;/a&gt;&lt;br /&gt;
IdentityCache lets you specify how you want to cache your model objects, at the model level, and adds a number of convenience methods for accessing those objects through the cache. Uses Memcached as the backend cache store.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jmettraux.github.com/2013-02-28-neg.html&quot; style=&quot;font-weight:bold;&quot;&gt;neg 1.1.0: A Small PEG Parser Library&lt;/a&gt;&lt;br /&gt;
&quot;One could say it’s a small brother of Parslet.&quot;
&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/injekt/gridhook&quot; style=&quot;&quot;&gt;Gridhook: A Rails Engine to Provide An Endpoint for SendGrid Webhooks&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://a.ttack.tk/&quot; style=&quot;&quot;&gt;Gem Attack: Show Post-Initialization Notifications on Your Released Gems&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Jobs&lt;/h3&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bignerdranch.theresumator.com/apply/PPxl0c/Web-Application-Developer.html?source=RubyWeekly&quot; style=&quot;font-weight:bold;&quot;&gt;Web Application Developer for Big Nerd Ranch&lt;/a&gt;&lt;br /&gt;Seeking smart, kind folks who want to make the world a little better through developing, training and writing about cutting-edge code.&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://replaypoker.theresumator.com/apply/Supv29/JS-Rails-Developer-Remote.html&quot; style=&quot;font-weight:bold;&quot;&gt;JS / Ruby Developer at ReplayPoker (Full-Time, Remote) &lt;/a&gt;&lt;br /&gt;Looking for a challenge? Our company is looking for a top-notch junior to mid level developer to join our small team and make a big difference!&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jobs.rubyinside.com/a/jbb/job-details/790480&quot; style=&quot;&quot;&gt;Senior Ruby/Rails Developer at HotelTonight [San Francisco, California]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jobs.rubyinside.com/a/jbb/job-details/794026&quot; style=&quot;&quot;&gt;Software Engineer at Goodreads [San Francisco, California]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jobs.rubyinside.com/a/jbb/job-details/794101&quot; style=&quot;&quot;&gt;Talented Foodie Rails Developer Wanted at America's Test Kitchen [Brookline, Massachusetts]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jobs.rubyinside.com/a/jbb/job-details/797271&quot; style=&quot;&quot;&gt;Applications Developer at Central Intelligence Agency [District of Columbia]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jobs.rubyinside.com/a/jbb/job-details/802287&quot; style=&quot;&quot;&gt;Senior Ruby on Rails Developer at SponsorPay [Berlin, Germany]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jobs.rubyinside.com/a/jbb/job-details/803306&quot; style=&quot;&quot;&gt;Software Engineering /Academic Applications Developer at Dartmouth College [Hanover, New Hampshire]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jobs.rubyinside.com/a/jbb/job-details/805424&quot; style=&quot;&quot;&gt;Software Engineer at Nextpoint [Madison, Wisconsin]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jobs.rubyinside.com/a/jbb/job-details/806334&quot; style=&quot;&quot;&gt;Senior Back End Software Engineer at The Washington Post - Service Alley [District of Columbia]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jobs.rubyinside.com/a/jbb/job-details/807997&quot; style=&quot;&quot;&gt;Ruby Developer at HouseTrip [London, United Kingdom]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jobs.rubyinside.com/a/jbb/job-details/808342&quot; style=&quot;&quot;&gt;Applications Developer at Merchants Bonding Company [Des Moines, Iowa]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Last but not least..&lt;/h3&gt;
&lt;div style=&quot;margin:16px 0px;&quot; class=&quot;item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/awilliams/RTanque&quot; style=&quot;font-weight:bold;&quot;&gt;RTanque: A Robot Programming Game for Rubyists&lt;/a&gt;&lt;br /&gt;
Players program the 'brain' of a tank and then send their tank into battle with other bots. Based upon the Java project 'Robocode.'
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/RubyInside?a=hgtA2eQfkGI:CH-JrxBg51s:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/RubyInside?a=hgtA2eQfkGI:CH-JrxBg51s:3H-1DwQop_U&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/RubyInside?i=hgtA2eQfkGI:CH-JrxBg51s:3H-1DwQop_U&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/RubyInside/~4/hgtA2eQfkGI&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <author>Peter Cooper</author>
         <guid isPermaLink="false">http://www.rubyinside.com/?p=6043</guid>
         <pubDate>Thu, 07 Mar 2013 12:44:43 +0000</pubDate>
      </item>
      <item>
         <title>How to add a new partition on OpenBSD</title>
         <link>http://feedproxy.google.com/~r/scientist-home/~3/txR8YNseQNs/how-to-add-a-new-partition-on-openbsd</link>
         <description>&lt;p&gt;Following the same theme as my &lt;a rel=&quot;nofollow&quot; class=&quot;reference external&quot; target=&quot;_blank&quot; href=&quot;http://scie.nti.st/2013/3/4/how-to-resize-an-openbsd-root-partition/&quot;&gt;last post&lt;/a&gt;, instead of claiming space added to
the end of a volume by &lt;strong&gt;extending&lt;/strong&gt; an existing partition (technically, a
&amp;quot;slice&amp;quot; in OpenBSD), I will show how to &lt;strong&gt;add&lt;/strong&gt; a new partition using this
space.&lt;/p&gt;
&lt;p&gt;I find it convenient to create the new slice as the &amp;quot;d&amp;quot; slice and then put
&lt;tt class=&quot;docutils literal&quot;&gt;/home&lt;/tt&gt; onto it.&lt;/p&gt;
&lt;p&gt;So, let&amp;#8217;s get started.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Boot into the system&amp;#8217;s rescue disk:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
&amp;gt; boot bsd.rd
&lt;/pre&gt;
&lt;p&gt;Then select &lt;tt class=&quot;docutils literal&quot;&gt;(S)hell&lt;/tt&gt; at the prompt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Claim extra space&lt;/p&gt;
&lt;p&gt;Re-initialize the MBR, using the entire disk.&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
# fdisk -i wd0
Do you wish to write new MBR and partition table? [n] y
Writing MBR at offset 0.
#
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Add a new slice for &lt;tt class=&quot;docutils literal&quot;&gt;/home&lt;/tt&gt; (the &amp;quot;d&amp;quot; slice)&lt;/p&gt;
&lt;p&gt;This system has only the root slice and swap.  We will add a new slice, using
all the unused space at the end.  In the following example, I have a 120GB
volume, where 20GB is used by root and swap, and the rest unallocated.&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
# disklabel -E wd0
Label editor (enter '?' for help at any prompt)
&amp;gt; p
OpenBSD area: 64-251658225; size: 251658161; free: 209728575
#                size           offset  fstype [fsize bsize  cpg]
  a:         38812976               64  4.2BSD   2048 16384 38128
  b:          3116610         38813040    swap
  c:        251658240                0  unused
&amp;gt; a
partition: [d]
offset: [41929650]
size: [209728575]
FS type: [4.2BSD]
Rounding offset to bsize (32 sectors): 41929664
Rounding size to bsize (32 sectors): 209728544
&amp;gt; p
OpenBSD area: 64-251658225; size: 251658161; free: 31
#                size           offset  fstype [fsize bsize  cpg]
  a:         38812976               64  4.2BSD   2048 16384 38128
  b:          3116610         38813040    swap
  c:        251658240                0  unused
  d:        209728544         41929664  4.2BSD   2048 16384    1
&amp;gt; w
&amp;gt; q
No label changes.
#
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Create a filesystem on the new slice:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
# newfs /dev/rwd0d
/dev/rwd0d: 102406.5MB in 209728544 sectors of 512 bytes
506 cylinder groups of 202.47MB, 12958 blocks, 25984 inodes each
super-block backups (for fsck -b #) at:
 32, 414688, 829344, 1244000, 1658656, 2073312, 2487968, 2902624, 3317280,
 3731936, 4146592, 4561248, 4975904, 5390560, 5805216, 6219872, 6634528,
 7049184, 7463840, 7878496, 8293152, 8707808, 9122464, 9537120, 9951776,
 ...
 [snip]
 ...
 193229728, 193644384, 194059040, 194473696, 194888352, 195303008, 195717664,
 196132320, 196546976, 196961632, 197376288, 197790944, 198205600, 198620256,
 199034912, 199449568, 199864224, 200278880, 200693536, 201108192, 201522848,
 201937504, 202352160, 202766816, 203181472, 203596128, 204010784, 204425440,
 204840096, 205254752, 205669408, 206084064, 206498720, 206913376, 207328032,
 207742688, 208157344, 208572000, 208986656, 209401312,
#
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Migrate &lt;tt class=&quot;docutils literal&quot;&gt;/home&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Here, we mount the root filesystem (which contains the old &lt;tt class=&quot;docutils literal&quot;&gt;/home&lt;/tt&gt;), and
also the new filesystem, and finally migrate the data from old &lt;tt class=&quot;docutils literal&quot;&gt;/home&lt;/tt&gt; to
new space.&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
# mount /dev/wd0a /mnt
# mount /dev/wd0d /mnt2
# (cd /mnt/home; tar cf - .) | (cd /mnt2; tar xpf -)
# rm -rf /mnt/home
# mkdir /mnt/home
&lt;/pre&gt;
&lt;p&gt;Note, the &lt;tt class=&quot;docutils literal&quot;&gt;tar&lt;/tt&gt; command above is a nice platform independent way of copying
everything from one directory to another, preserving everything (permissions,
etc&amp;#8230;).  The &lt;tt class=&quot;docutils literal&quot;&gt;cp&lt;/tt&gt; command is different on Linux and the *BSDs, yet
&lt;tt class=&quot;docutils literal&quot;&gt;tar&lt;/tt&gt;, used in the above fasion, is identical on Linux, FreeBSD, NetBSD,
and OpenBSD.  I thank Todd Fries of &lt;a rel=&quot;nofollow&quot; class=&quot;reference external&quot; target=&quot;_blank&quot; href=&quot;http://freedaemonconsulting.com&quot;&gt;Free Daemon Consulting&lt;/a&gt; for teaching me
that one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Mount on boot&lt;/p&gt;
&lt;p&gt;The following command will add the new &lt;tt class=&quot;docutils literal&quot;&gt;/home&lt;/tt&gt; to your &lt;tt class=&quot;docutils literal&quot;&gt;/etc/fstab&lt;/tt&gt; so it
is automatically mounted upon boot.&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
# echo &amp;quot;/dev/wd0d /home ffs rw,softdep 0 1&amp;quot; &amp;gt;&amp;gt; /mnt/etc/fstab
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Clean up:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
# umount /mnt*
# reboot
&lt;/pre&gt;
&lt;p&gt;Now enjoy the extra space!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=txR8YNseQNs:a5MRyGmJBdc:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=txR8YNseQNs:a5MRyGmJBdc:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=txR8YNseQNs:a5MRyGmJBdc:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=txR8YNseQNs:a5MRyGmJBdc:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=txR8YNseQNs:a5MRyGmJBdc:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=txR8YNseQNs:a5MRyGmJBdc:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=txR8YNseQNs:a5MRyGmJBdc:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=txR8YNseQNs:a5MRyGmJBdc:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <guid isPermaLink="false">http://scie.nti.st/2013/3/5/how-to-add-a-new-partition-on-openbsd</guid>
         <pubDate>Tue, 05 Mar 2013 11:30:00 +0000</pubDate>
      </item>
      <item>
         <title>How to resize an OpenBSD root partition</title>
         <link>http://feedproxy.google.com/~r/scientist-home/~3/eo3FBdWqwfI/how-to-resize-an-openbsd-root-partition</link>
         <description>&lt;p&gt;At &lt;a rel=&quot;nofollow&quot; class=&quot;reference external&quot; target=&quot;_blank&quot; href=&quot;http://www.arpnetworks.com&quot;&gt;ARP Networks&lt;/a&gt;, sometimes we have to resize an &lt;a rel=&quot;nofollow&quot; class=&quot;reference external&quot; target=&quot;_blank&quot; href=&quot;http://www.openbsd.org&quot;&gt;OpenBSD&lt;/a&gt; root partition to
satsify a customer requirement, template requirement, or something else along
those lines.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve sometimes seen customers struggle to do this themselves, so the following
is an example of how I resized a root partition from 5 GB to 9 GB, leaving 1 GB
for swap.  The underlying volume was already expanded from 5 GB to 10 GB, to
give us room to do this.&lt;/p&gt;
&lt;p&gt;So, let&amp;#8217;s get to it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Boot into the system&amp;#8217;s rescue disk:&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
&amp;gt; boot bsd.rd
&lt;/pre&gt;
&lt;p&gt;Then select &lt;tt class=&quot;docutils literal&quot;&gt;(S)hell&lt;/tt&gt; at the prompt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class=&quot;first&quot;&gt;Resize:&lt;/p&gt;
&lt;p&gt;Grab the &lt;tt class=&quot;docutils literal&quot;&gt;growfs(8)&lt;/tt&gt; program from the root partition.  This isn&amp;#8217;t included
with the rescue disk, for some reason.&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
# mount /dev/wd0a /mnt
# cp /mnt/sbin/growfs .
# umount /mnt
&lt;/pre&gt;
&lt;p&gt;Re-initialize the MBR, using the entire disk.&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
# fdisk -i wd0
Do you wish to write new MBR and partition table? [n] y
Writing MBR at offset 0.
#
&lt;/pre&gt;
&lt;p&gt;Change the size of the slices.&lt;/p&gt;
&lt;p&gt;This system has only the root partition and swap.  The idea is to remove the
swap partition, then extend root, and finally put the swap partition back.&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
# disklabel -E wd0
# Inside MBR partition 3: type A6 start 63 size 20964762
Treating sectors 63-20964825 as the OpenBSD portion of the disk.
You can use the 'b' command to change this.

Initial label editor (enter '?' for help at any prompt)
&amp;gt; p
OpenBSD area: 63-20964825; size: 20964762; free: 9446220
#                size           offset  fstype [fsize bsize  cpg]
  a:         10490382               63  4.2BSD   2048 16384    1
  b:          1028160         10490445    swap
  c:         20971520                0  unused
&amp;gt; d
partition to delete: [] b
&amp;gt; p
OpenBSD area: 63-20964825; size: 20964762; free: 10474380
#                size           offset  fstype [fsize bsize  cpg]
  a:         10490382               63  4.2BSD   2048 16384    1
  c:         20971520                0  unused
&amp;gt; c
partition to change size: [] a
Partition a is currently 10490382 sectors in size, and can have a maximum
size of 20964762 sectors.
size: [10490382] 9G
Rounding to cylinder: 18876312
&amp;gt; a b
offset: [18876375]
size: [2088450]
FS type: [swap]
&amp;gt; p
OpenBSD area: 63-20964825; size: 20964762; free: 0
#                size           offset  fstype [fsize bsize  cpg]
  a:         18876312               63  4.2BSD   2048 16384    1
  b:          2088450         18876375    swap
  c:         20971520                0  unused
&amp;gt; w
&amp;gt; q
No label changes.
#
&lt;/pre&gt;
&lt;p&gt;Grow the filesystem using &lt;tt class=&quot;docutils literal&quot;&gt;growfs(8)&lt;/tt&gt;&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
# growfs /dev/wd0a
We strongly recommend you to make a backup before growing the Filesystem

 Did you backup your data (Yes/No) ? Yes
new file systemsize is: 4719078 frags
Warning: 216792 sector(s) cannot be allocated.
growfs: 9111.1MB (18659520 sectors) block size 16384, fragment size 2048
        using 45 cylinder groups of 202.47MB, 12958 blks, 25984 inodes.
super-block backups (for fsck -b #) at:
 10781088, 11195744, 11610400, 12025056, 12439712, 12854368, 13269024, 13683680, 14098336, 14512992, 14927648, 15342304, 15756960, 16171616, 16586272, 17000928, 17415584, 17830240,
 18244896
#
&lt;/pre&gt;
&lt;p&gt;Give it a rinse.&lt;/p&gt;
&lt;pre class=&quot;literal-block&quot;&gt;
# fsck /dev/wd0a
** /dev/rwd0a
** Last Mounted on /
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
100205 files, 418854 used, 4172217 free (97 frags, 521515 blocks, 0.0% fragmentation)

MARK FILE SYSTEM CLEAN? [Fyn?] y


***** FILE SYSTEM WAS MODIFIED *****
#
&lt;/pre&gt;
&lt;p&gt;And that&amp;#8217;s pretty much it.  Everything is done within &lt;a rel=&quot;nofollow&quot; class=&quot;reference external&quot; target=&quot;_blank&quot; href=&quot;http://www.openbsd.org&quot;&gt;OpenBSD&lt;/a&gt;&amp;#8217;s rescue disk
kernel &lt;tt class=&quot;docutils literal&quot;&gt;bsd.rd&lt;/tt&gt;, no need to have a separate CD-ROM / USB rescue disk
utility.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=eo3FBdWqwfI:Mm6RFd-2PHo:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=eo3FBdWqwfI:Mm6RFd-2PHo:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=eo3FBdWqwfI:Mm6RFd-2PHo:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=eo3FBdWqwfI:Mm6RFd-2PHo:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=eo3FBdWqwfI:Mm6RFd-2PHo:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=eo3FBdWqwfI:Mm6RFd-2PHo:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=eo3FBdWqwfI:Mm6RFd-2PHo:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=eo3FBdWqwfI:Mm6RFd-2PHo:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <guid isPermaLink="false">http://scie.nti.st/2013/3/4/how-to-resize-an-openbsd-root-partition</guid>
         <pubDate>Mon, 04 Mar 2013 10:58:00 +0000</pubDate>
      </item>
      <item>
         <title>Having a Javascript moment with Ruby, WTF is going on here...</title>
         <link>http://feedproxy.google.com/~r/scientist-home/~3/F0dKCx5R0rE/having-a-javascript-moment-with-ruby-wtf-is-going-on-here</link>
         <description>&lt;p&gt;WTF is going on here?&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;14&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;15&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;16&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;17&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;irb&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;(rdb:1) sum&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;244.4&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;(rdb:1) amount&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;244.4&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;(rdb:1) sum != amount&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;(rdb:1) sum.to_f&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;244.4&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;(rdb:1) amount.to_f&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;244.4&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;(rdb:1) sum.to_f != amount.to_f&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;(rdb:1) sum == amount&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;(rdb:1) sum.to_f == amount.to_f&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;(rdb:1)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;First guess is some type conversion problem&amp;#8230;&lt;/p&gt;
&lt;p&gt;Still investigating.&lt;/p&gt;

&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=F0dKCx5R0rE:sgoPhYdJrCY:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=F0dKCx5R0rE:sgoPhYdJrCY:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=F0dKCx5R0rE:sgoPhYdJrCY:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=F0dKCx5R0rE:sgoPhYdJrCY:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=F0dKCx5R0rE:sgoPhYdJrCY:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=F0dKCx5R0rE:sgoPhYdJrCY:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=F0dKCx5R0rE:sgoPhYdJrCY:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=F0dKCx5R0rE:sgoPhYdJrCY:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <guid isPermaLink="false">http://scie.nti.st/2013/3/1/having-a-javascript-moment-with-ruby-wtf-is-going-on-here</guid>
         <pubDate>Sat, 02 Mar 2013 02:55:00 +0000</pubDate>
      </item>
      <item>
         <title>Using the quota command within a chroot environment</title>
         <link>http://feedproxy.google.com/~r/scientist-home/~3/srjfQwm3PFI/using-the-quota-command-within-a-chroot-environment</link>
         <description>&lt;p&gt;I was recently using &lt;a rel=&quot;nofollow&quot; class=&quot;reference external&quot; target=&quot;_blank&quot; href=&quot;http://olivier.sessink.nl/jailkit/index.html&quot;&gt;Jailkit&lt;/a&gt; on &lt;a rel=&quot;nofollow&quot; class=&quot;reference external&quot; target=&quot;_blank&quot; href=&quot;http://ubuntu.com&quot;&gt;Ubuntu&lt;/a&gt; to set up a chroot environment for
users of a backup storage server.  I wanted to give the users the ability to
check their quotas with the regular &lt;tt class=&quot;docutils literal&quot;&gt;quota&lt;/tt&gt; command.&lt;/p&gt;
&lt;p&gt;I go about telling Jailkit that the chroot directory will need the &lt;tt class=&quot;docutils literal&quot;&gt;quota&lt;/tt&gt;
binary.  This should be all that is needed, or so I thought.&lt;/p&gt;
&lt;p&gt;Upon checking a quota as a chroot&amp;#8217;d user, it barfs the following error,&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;console&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; quota
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;quota: Cannot open quotafile /home/aquota.user: Permission denied&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;quota: Quota file not found or has wrong format.&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;From what I can tell, this is a very misleading error message.  The permissions
of &lt;tt class=&quot;docutils literal&quot;&gt;aquota.user&lt;/tt&gt; are always &lt;tt class=&quot;docutils literal&quot;&gt;0600&lt;/tt&gt;, readable / writable only by &lt;tt class=&quot;docutils literal&quot;&gt;root&lt;/tt&gt;.
This can&amp;#8217;t be changed, not even as &lt;tt class=&quot;docutils literal&quot;&gt;root&lt;/tt&gt;.  Witness.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;console&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;-rw------- 1 root root 7168 2013-02-27 22:32 /home/bkusers/home/aquota.user&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;Using a bit of &lt;tt class=&quot;docutils literal&quot;&gt;strace&lt;/tt&gt; and some luck, I find what the &lt;tt class=&quot;docutils literal&quot;&gt;quota&lt;/tt&gt; command is
really looking for is &lt;tt class=&quot;docutils literal&quot;&gt;/proc/sys/fs/quota&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;It simply does a &lt;tt class=&quot;docutils literal&quot;&gt;stat()&lt;/tt&gt; system call on that directory within &lt;tt class=&quot;docutils literal&quot;&gt;proc&lt;/tt&gt;, so
if you simply do,&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;console&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; sudo mkdir -p /home/bkusers/proc/sys/fs/quota
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;then the &lt;tt class=&quot;docutils literal&quot;&gt;quota&lt;/tt&gt; command works like a charm within the chroot environment.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;console&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; quota -s
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;Disk quotas for user testuser (uid 1007):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;go&quot;&gt;       /dev/md3      16       0   3907M               4       0       0&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;My chroot directory in these examples was obviously &lt;tt class=&quot;docutils literal&quot;&gt;/home/bkusers&lt;/tt&gt;, modify
accordingly for your needs.&lt;/p&gt;

&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=srjfQwm3PFI:YNofO55jEEo:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=srjfQwm3PFI:YNofO55jEEo:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=srjfQwm3PFI:YNofO55jEEo:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=srjfQwm3PFI:YNofO55jEEo:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=srjfQwm3PFI:YNofO55jEEo:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=srjfQwm3PFI:YNofO55jEEo:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=srjfQwm3PFI:YNofO55jEEo:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=srjfQwm3PFI:YNofO55jEEo:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <guid isPermaLink="false">http://scie.nti.st/2013/3/1/using-the-quota-command-within-a-chroot-environment</guid>
         <pubDate>Fri, 01 Mar 2013 11:50:00 +0000</pubDate>
      </item>
      <item>
         <title>The 'Yes' men</title>
         <link>http://feedproxy.google.com/~r/scientist-home/~3/lE08xup_qlQ/the-yes-men</link>
         <description>&lt;p&gt;Let me turn a corner and cover a non-technical topic here for once&amp;#8230;&lt;/p&gt;

&lt;p&gt;Several years ago, I had a job where I had to ask myself the following question, &amp;#8220;Do I do what I think is right, or do I do what will make my new boss happy?&amp;#8221;&lt;/p&gt;

&lt;p&gt;Now, this was not a moral question, it was simply about how to do some measurements / benchmarking and systems stuff; pretty low key, no big deal.&lt;/p&gt;

&lt;p&gt;I stuck to my guns and at some point shortly after, I didn&amp;#8217;t have that job anymore. ;)&lt;/p&gt;

&lt;p&gt;In my case, there really wasn&amp;#8217;t any big life altering changes to myself or anyone else regardless of which decision I made.  But in some cases, this can really go the wrong way&amp;#8230;&lt;/p&gt;

&lt;p&gt;Let me illustrate by quoting something from my reading last night; the book was Amy Goodman&amp;#8217;s (Host of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.democracynow.org&quot;&gt;Democracy Now!&lt;/a&gt;) &amp;#8221;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.haymarketbooks.org/pb/breaking-the-sound-barrier&quot;&gt;Breaking the Sound Barrier&lt;/a&gt;&amp;#8221;, and within was a quote from Grammy Award-winning soul singer John Legend when he gave the commencement address at the University of Pennsylvania,&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Too often, in business and in government, people are rewarded for having the answer that the person they report to wants them to have: &amp;#8220;Yes, sir.  We can provide mortgages to people who have no down payment and can&amp;#8217;t afford the monthly payments.&amp;#8221;&amp;#8230;  &amp;#8220;Yes, ma&amp;#8217;am.  I can write a legal brief to justify torture.&amp;#8221;&lt;/p&gt;&lt;strong&gt;John Legend&lt;/strong&gt; &lt;cite&gt;Commencement Address at the University of Pennsylvania 2009&lt;/cite&gt;&lt;/blockquote&gt; 


&lt;p&gt;Stick to your guns, fuck your boss.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=lE08xup_qlQ:VMgSGhQtIaI:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=lE08xup_qlQ:VMgSGhQtIaI:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=lE08xup_qlQ:VMgSGhQtIaI:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=lE08xup_qlQ:VMgSGhQtIaI:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=lE08xup_qlQ:VMgSGhQtIaI:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=lE08xup_qlQ:VMgSGhQtIaI:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=lE08xup_qlQ:VMgSGhQtIaI:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=lE08xup_qlQ:VMgSGhQtIaI:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <guid isPermaLink="false">http://scie.nti.st/2013/2/17/the-yes-men</guid>
         <pubDate>Sun, 17 Feb 2013 10:47:00 +0000</pubDate>
      </item>
      <item>
         <title>Migrated from Mephisto to Octopress</title>
         <link>http://feedproxy.google.com/~r/scientist-home/~3/ya7-EIxAqZQ/migrated-from-mephisto-to-octopress</link>
         <description>&lt;p&gt;I&amp;#8217;m proud to say I&amp;#8217;ve dusted off this blog and migrated from Mephisto to
Octopress.  Now I can actually post new content (the old Mephisto system
got so dated and went to dependency hell that I was hardly able to do
anything besides keep the static cached files up).&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m going to try to go through all the posts and cleanup / fix any loose
ends.  So far the import went pretty smooth and I&amp;#8217;ve only burned a few
hours (instead of a whole weekend).&lt;/p&gt;

&lt;p&gt;I was unable to successfully import the comments, so those will be gone
forever.  Most were spammy anyway, and any comments posted at least
within the last year or two use Disqus, and those are still around.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d like to get my usual theme working again, but alas, that is very low
priority right now.  Perhaps a new look is warranted anyway.  However,
at least, I can move away from the default theme.  Gotta read more
docs&amp;#8230;&lt;/p&gt;

&lt;p&gt;Let me know if anything is out of the ordinary.&lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=ya7-EIxAqZQ:AiVZA3thxig:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=ya7-EIxAqZQ:AiVZA3thxig:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=ya7-EIxAqZQ:AiVZA3thxig:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=ya7-EIxAqZQ:AiVZA3thxig:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=ya7-EIxAqZQ:AiVZA3thxig:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=ya7-EIxAqZQ:AiVZA3thxig:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=ya7-EIxAqZQ:AiVZA3thxig:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=ya7-EIxAqZQ:AiVZA3thxig:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <guid isPermaLink="false">http://scie.nti.st/2013/2/12/migrated-from-mephisto-to-octopress</guid>
         <pubDate>Tue, 12 Feb 2013 10:01:00 +0000</pubDate>
      </item>
      <item>
         <title>Testing Octopress...</title>
         <link>http://feedproxy.google.com/~r/scientist-home/~3/XnSYIpdTZb0/testing-octopress-dot-dot-dot</link>
         <description>&lt;p&gt;Testing 1 2 3&amp;#8230;&lt;/p&gt;

&lt;p&gt;is this thing on?&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=XnSYIpdTZb0:gwhNZqKNOJE:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=XnSYIpdTZb0:gwhNZqKNOJE:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=XnSYIpdTZb0:gwhNZqKNOJE:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=XnSYIpdTZb0:gwhNZqKNOJE:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=XnSYIpdTZb0:gwhNZqKNOJE:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=XnSYIpdTZb0:gwhNZqKNOJE:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/scientist-home?a=XnSYIpdTZb0:gwhNZqKNOJE:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/scientist-home?i=XnSYIpdTZb0:gwhNZqKNOJE:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;</description>
         <guid isPermaLink="false">http://scie.nti.st/2013/2/12/testing-octopress-dot-dot-dot</guid>
         <pubDate>Tue, 12 Feb 2013 08:38:00 +0000</pubDate>
      </item>
      <item>
         <title>An Instrumented Library in ~30 Lines</title>
         <link>http://feedproxy.google.com/~r/railstips/~3/dSPZWr8NZy4/</link>
         <description>&lt;h2&gt;The Full ~30 Lines&lt;/h2&gt;
&lt;p&gt;For the first time ever, I am going to lead with the end of the story. Here is the full ~30 lines that I will break down in detail during the rest of this post.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;require 'forwardable'

module Foo
  module Instrumenters
    class Noop
      def self.instrument(name, payload = {})
        yield payload if block_given?
      end
    end
  end

  class Client
    extend Forwardable

    def_delegator :@instrumenter, :instrument

    def initialize(options = {})
      # some other setup for the client ...
      @instrumenter = options[:instrumenter] || Instrumenters::Noop
    end

    def execute(args = {})
      instrument('client_execute.foo', args: args) { |payload|
        result = # do some work...
        payload[:result] = result
        result
      }
    end
  end
end

client = Foo::Client.new({
  instrumenter: ActiveSupport::Notifications,
})

client.execute(...) # I AM INSTRUMENTED!!!&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;The Dark Side&lt;/h2&gt;
&lt;p&gt;A while back, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.railstips.org/blog/archives/2011/03/21/hi-my-name-is-john/&quot;&gt;statsd grabbed a hold of the universe&lt;/a&gt;. It swept in like an elf on a unicorn and we all started keeping track of stuff that previously was a pain to keep track of.&lt;/p&gt;
&lt;p&gt;Like any wave of awesomeness, it came with a dark side that was felt, but mostly overlooked. Dark side? Statsd? Graphite? You must be crazy! Nope, not me, definitely not crazy this one. Not. At. All.&lt;/p&gt;
&lt;p&gt;What did we all start doing in order to inject our measuring? Yep, &lt;strong&gt;we started opening up classes in horrible ways&lt;/strong&gt; and creating hooks into libraries that sometimes change rapidly. Many times, updating a library would cause a break in the stats reporting and require effort to update the hooks.&lt;/p&gt;
&lt;h2&gt;The Ideal&lt;/h2&gt;
&lt;p&gt;Now that the wild west is settling a bit, I think some have started to reflect on that wave of awesomeness and realized something.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I no longer want to inject my own instrumentation into your library. Instead, I want to tell your library where it should send the instrumentation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The great thing is that &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html&quot;&gt;ActiveSupport::Notifications&lt;/a&gt; is pretty spiffy in this regard. By simply allowing your library to talk to an &amp;#8220;instrumenter&amp;#8221; that responds to &lt;code&gt;instrument&lt;/code&gt; with an event name, optional payload, and optional block, you can make all your library&amp;#8217;s users &lt;strong&gt;really&lt;/strong&gt; happy.&lt;/p&gt;
&lt;p&gt;The great part is:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;You do not have to &lt;strong&gt;force your users to use active support&lt;/strong&gt;. They simply need some kind of instrumenter that responds in similar fashion.&lt;/li&gt;
	&lt;li&gt;They &lt;strong&gt;no longer have to monkey patch&lt;/strong&gt; to get metrics.&lt;/li&gt;
	&lt;li&gt;You can &lt;strong&gt;point them in the right direction as to what is valuable to instrument&lt;/strong&gt; in your library, since really you know it best.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There are a few good examples of libraries (faraday, excon, etc.) doing this, but I haven&amp;#8217;t seen a great post yet, so here is my attempt to point you in what I feel is the right direction.&lt;/p&gt;
&lt;h2&gt;The Interface&lt;/h2&gt;
&lt;p&gt;First, like I said above, we do not want to force requiring active support. Rather than require a library, &lt;strong&gt;it is always better to require an interface&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The interface that we will require is the one used by active support, but an adapter interface could be created for any instrumenter that we want to support. Here is what it looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;instrumenter.instrument(name, payload) { |payload|
  # do some code here that should be instrumented
  # we expect payload to be yielded so that additional 
  # payload entries can be included during the 
  # computation inside the block
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Second, we have two options.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Either have an instrumenter or not. If so, then call &lt;code&gt;instrument&lt;/code&gt; on the instrumenter. If not, then do not call &lt;code&gt;instrument&lt;/code&gt;.&lt;/li&gt;
	&lt;li&gt;The option, which I prefer, is to &lt;strong&gt;have a default instrumenter that does nothing&lt;/strong&gt;. Aptly, I call this the noop instrumenter.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;The Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;#8217;s pretend our library is named foo, therefore it will be namespaced with the module Foo. I typically namespace the instrumenters in a module as well. Knowing this, our noop instrumenter would look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;module Foo
  module Instrumenters
    class Noop
      def self.instrument(name, payload = {})
        yield payload if block_given?
      end
    end
  end
end&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you can see, all this instrumenter does is yield the payload if a block is given. As I mentioned before, &lt;strong&gt;we yield payload so that the computation inside the block can add entries to the payload&lt;/strong&gt;, such as the result.&lt;/p&gt;
&lt;p&gt;Now that we have a default instrumenter, how can we use it? Well, let&amp;#8217;s imagine that we have a Client class in foo that is the main entry point for the gem.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;module Foo
  class Client
    def initialize(options = {})
      # some other setup for the client ...
      @instrumenter = options[:instrumenter] || Instrumenters::Noop
    end
  end
end&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This code simply allows people to pass in the instrumenter that they would like to use through the initialization options. Also, by default if no instrumenter is provided, we use are noop version that just yields the block and moves on.&lt;/p&gt;
&lt;p&gt;Note: the use of || instead of #fetch is intentional. It prevents a nil instrumenter from being passed in. There are other ways around this, but I have found using the noop instrumenter in place of nil, better than complaining about nil.&lt;/p&gt;
&lt;p&gt;Now that we have an &lt;code&gt;:instrumenter&lt;/code&gt; option, someone can quite easily pass in the instrumenter that they would like to use.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;client = Foo::Client.new({
  :instrumenter =&amp;gt; ActiveSupport::Notifications,
})&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Boom! Just like that we&amp;#8217;ve allowed people to inject active support notifications, or whatever instrumenter they want into our library. Anyone else getting excited?&lt;/p&gt;
&lt;p&gt;Once we have that, we can start instrumenting the valuable parts. Typically what I do is I setup delegation of the &lt;code&gt;instrument&lt;/code&gt; to the instrumenter using ruby&amp;#8217;s forwardable library:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;require 'forwardable'

module Foo
  class Client
    extend Forwardable

    # forward instrument in this class to @instrumenter, for those unfamilier
    # with forwardable.
    def_delegator :@instrumenter, :instrument

    def initialize(options = {})
      # some other setup for the client ...
      @instrumenter = options[:instrumenter] || Instrumenters::Noop
    end
  end
end&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we can use the &lt;code&gt;instrument&lt;/code&gt; method directly anywhere in our client instance. For example, let&amp;#8217;s say that client has a method named &lt;code&gt;execute&lt;/code&gt; that we would like to instrument.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;module Foo
  class Client
    def execute(args = {})
      instrument('client_execute.foo', args: args) { |payload|
        result = # do some work...
        payload[:result] = result
        result
      }
    end
  end
end&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With just a tiny wrap of the instrument method, the users of our library can do a ridiculous amount of instrumentation. For one, note that we pass the args and the result along with the payload. This means our users can create a log subscriber and log each method call with timing, argument, and result information. Incredibly valuable!&lt;/p&gt;
&lt;p&gt;They can also create a metrics subscriber that sends the timing information to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://instrumentalapp.com&quot;&gt;instrumental&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/eric/metriks&quot;&gt;metriks&lt;/a&gt;, statsd, or whatever.&lt;/p&gt;
&lt;h2&gt;The Bonus&lt;/h2&gt;
&lt;p&gt;You can even provide log subscribers and metric subscribers in your library, which means instrumentation for your users is simply a require away. For example, here is the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/jnunemaker/cassanity/blob/master/lib/cassanity/instrumentation/log_subscriber.rb&quot;&gt;log subscriber&lt;/a&gt; I added to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/jnunemaker/cassanity&quot;&gt;cassanity&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;require 'securerandom'
require 'active_support/notifications'
require 'active_support/log_subscriber'

module Cassanity
  module Instrumentation
    class LogSubscriber &amp;lt; ::ActiveSupport::LogSubscriber
      def cql(event)
        return unless logger.debug?

        name = '%s (%.1fms)' % [&quot;CQL Query&quot;, event.duration]

        # execute arguments are always an array where the first element is the
        # cql string and the rest are the bound variables.
        cql, *args = event.payload[:execute_arguments]
        arguments = args.map { |arg| arg.inspect }.join(', ')

        query = &quot;#{cql}&quot;
        query += &quot; (#{arguments})&quot; unless arguments.empty?

        debug &quot;  #{color(name, CYAN, true)}  [ #{query} ]&quot;
      end
    end
  end
end

Cassanity::Instrumentation::LogSubscriber.attach_to :cassanity&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All the users of cassanity need to do to get logging of the &lt;span class=&quot;caps&quot;&gt;CQL&lt;/span&gt; queries they are performing and their timing is require a file (and have activesupport in their gemfile):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;require 'cassanity/instrumentation/log_subscriber'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And they get logging goodness like this in their terminal:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;full image&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;The Accuracy&lt;/h2&gt;
&lt;p&gt;But! &lt;span class=&quot;caps&quot;&gt;BUT&lt;/span&gt;, you say. What about the tests? Well, my friend, I have that all wrapped up for you as well. Since it is so easy to pass through an instrumenter to our library, we should probably also have an in memory instrumenter that keeps track of the events instrumented, so you can test thoroughly, and ensure you don&amp;#8217;t hose your users with incorrect instrumentation.&lt;/p&gt;
&lt;p&gt;The previous sentence was quite a mouthful, so my next one will be short and sweet. For testing, I created an in-memory instrumenter that simply stores each instrumented event with name, payload, and the computed block result for later comparison. Check it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;module Foo
  module Instrumenters
    class Memory
      Event = Struct.new(:name, :payload, :result)

      attr_reader :events

      def initialize
        @events = []
      end

      def instrument(name, payload = {})
        result = if block_given?
          yield payload
        else
          nil
        end

        @events &amp;lt;&amp;lt; Event.new(name, payload, result)

        result
      end
    end
  end
end&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now in your tests, you can do something like this when you want to check that your library is correctly instrumenting:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;instrumenter = Foo::Instrumenters::Memory.new

client = Foo::Client.new({
  instrumenter: instrumenter,
})

client.execute(...)

payload = {... something .. }
event = instrumenter.events.last

assert_not_nil event
assert_equal 'client_execute.foo', event.name
assert_equal payload, event.payload
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;The End Result&lt;/h2&gt;
&lt;p&gt;With two instrumenters (noop, memory) and a belief in interfaces, we have created immense value.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;full image&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;p&gt;Without any further ado, here are a few of the articles and decks that I read recently related to this.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://railscasts.com/episodes/249-notifications-in-rails-3&quot;&gt;RailsCasts: Notifications in Rails 3&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://speakerdeck.com/nextmat/digging-deep-with-activesupportnotifications&quot;&gt;Digging Deep with ActiveSupport Notifications&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://speakerdeck.com/tenderlove/code-charcuterie&quot;&gt;Code Charcuterie&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://gist.github.com/566725&quot;&gt;Instrument Anything in Rails 3&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.paperplanes.de/2012/3/14/on-notifications-logsubscribers-and-bringing-sanity-to-rails-logging.html&quot;&gt;On Notifications, Log Subscribers and Bringing Sanity to Rails Logs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fin&lt;/h2&gt;
&lt;p&gt;Go forth and instrument all the things!&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/railstips?a=dSPZWr8NZy4:tpL92ScRdN0:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railstips?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/railstips?a=dSPZWr8NZy4:tpL92ScRdN0:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railstips?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/railstips?a=dSPZWr8NZy4:tpL92ScRdN0:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railstips?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/railstips/~4/dSPZWr8NZy4&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <author>John Nunemaker</author>
         <guid isPermaLink="false">510006ed7a507277eb000ac0</guid>
         <pubDate>Wed, 23 Jan 2013 20:00:00 +0000</pubDate>
      </item>
      <item>
         <title>A Simple Tour of the Ruby MRI Source Code with Pat Shaughnessy</title>
         <link>http://feedproxy.google.com/~r/RubyInside/~3/7e6x0tEh9H4/ruby-mri-code-walk-tour-6020.html</link>
         <description>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I'm not in Ruby core or, well, even a confident C coder anymore, but I've long enjoyed digging in the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/ruby/ruby&quot;&gt;Ruby MRI source code&lt;/a&gt; to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.youtube.com/watch?v=9IX1NfwQP1s&quot;&gt;understand weird behavior&lt;/a&gt; and to pick up stuff for my &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://cooperpress.com/rubyreloaded&quot;&gt;Ruby course.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://patshaughnessy.net/&quot;&gt;Pat Shaughnessy&lt;/a&gt; is also a fan of digging around in Ruby's internals and has written some great posts like &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://patshaughnessy.net/2012/6/29/how-ruby-executes-your-code&quot;&gt;How Ruby Executes Your Code&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://patshaughnessy.net/2012/7/26/objects-classes-and-modules&quot;&gt;Objects, Classes and Modules&lt;/a&gt;, and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://patshaughnessy.net/2012/4/3/exploring-rubys-regular-expression-algorithm&quot;&gt;Exploring Ruby's Regular Expression Algorithm.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When Pat released his &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://patshaughnessy.net/ruby-under-a-microscope&quot;&gt;Ruby Under a Microscope&lt;/a&gt; book, I knew it would be right up my street! He digs into how objects are represented internally, why MRI, Rubinius and JRuby act in certain ways and, of course, &quot;lots more.&quot;&lt;/p&gt;
&lt;p&gt;I invited Pat to take a &lt;em&gt;very high level&lt;/em&gt; cruise through the MRI codebase with me so we could share that knowledge with Ruby programmers who haven't dared take a look 'under the hood' and to show it's not as scary or pointless as it may seem.&lt;/p&gt;
&lt;p&gt;It's 100% free so enjoy it above or &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.youtube.com/watch?v=0npv906IQag&quot;&gt;on YouTube in 720p HD.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;P.S. Pat is happy to do another video digging deeper into how Ruby actually takes your code and executes it and he's able to walk through the actual virtual machine for us. If the reaction to this video is good, we'll sit down again and see if we can do it! :-)&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/RubyInside?a=7e6x0tEh9H4:6UxuVyTDVlc:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/RubyInside?a=7e6x0tEh9H4:6UxuVyTDVlc:3H-1DwQop_U&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/RubyInside?i=7e6x0tEh9H4:6UxuVyTDVlc:3H-1DwQop_U&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/RubyInside/~4/7e6x0tEh9H4&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <author>Peter Cooper</author>
         <guid isPermaLink="false">http://www.rubyinside.com/?p=6020</guid>
         <pubDate>Mon, 03 Dec 2012 15:20:31 +0000</pubDate>
      </item>
   </channel>
</rss>
<!-- fe8.yql.bf1.yahoo.com compressed/chunked Thu Oct  1 01:33:18 UTC 2015 -->
