<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[Benjamin Curtis]]></title>
  
  <link href="http://www.bencurtis.com/" />
  <updated>2013-05-02T07:12:33-07:00</updated>
  <id>http://www.bencurtis.com/</id>
  <author>
    <name><![CDATA[Benjamin Curtis]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/bencurtis" /><feedburner:info uri="bencurtis" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title type="html"><![CDATA[Proven: Customer interviews save you time and money]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/uVncfYEjXj0/" />
    <updated>2013-05-01T11:01:00-07:00</updated>
    <id>http://www.bencurtis.com/2013/05/proven-customer-interviews-save-you-time-and-money</id>
    <content type="html">&lt;p&gt;I&amp;#8217;m on my way home from &lt;a href="http://www.microconf.com/"&gt;MicroConf 2013&lt;/a&gt;,
having learned a lot and having had a lot of fun.  This was the third
year Rob and Mike have put on the conference, and the third year that it
has been an &lt;a href="http://twitter.com/TheDaveCollins"&gt;awesome&lt;/a&gt; experience.  As
with the previous years, the speakers and the attendees were bright,
informative, friendly, motivated, and motivating.  If you run a
bootstrapped biz, or are thinking about running one, MicroConf is the
place to be to really increase your motivation for and your knowledge
about running your business.&lt;/p&gt;

&lt;p&gt;As an aside, I&amp;#8217;m looking forward to
&lt;a href="http://www.baconbizconf.com/"&gt;BaconBizConf&lt;/a&gt; at the end of
this month for the same reasons &amp;#8211; I have no doubt it will also be a
great place to be for those who are interested in getting better at
making money. :)&lt;/p&gt;

&lt;p&gt;I could write several blog posts about terrific takeaways from this
conference, but in this one I want to focus on the urging (especially by
&lt;a href="http://twitter.com/hnshah"&gt;Hiten Shah&lt;/a&gt; and &lt;a href="http://www.twitter.com/SingleFounder"&gt;Mike Taber&lt;/a&gt;)
to focus on customer development when starting and growing your business.
This topic had a particular impact on me at this time because it&amp;#8217;s been
on my mind the last few weeks.&lt;/p&gt;

&lt;p&gt;A couple of weeks ago I had the privilege of attending
the Switch Workshop put on by the &lt;a href="http://www.therewiredgroup.com/"&gt;Rewired Group&lt;/a&gt; and hosted by Jason
Fried of 37 Signals.  That one-day workshop (which I also highly
recommend) was entirely focused on
how people make purchasing decisions, and how understanding that process
can help you find the right customers and give them the value for which
they are searching.  Going through that workshop really got
me in the mindset of putting myself in my customer&amp;#8217;s shoes (and head),
and letting that drive the decisions I make about my business.  I had
been interested in customer development before, but that workshop really
sold me on just how effective it is to talk to customers about how and
why they&amp;#8217;ve made the decisions they have made.&lt;/p&gt;

&lt;p&gt;I work with entrepreneurs quite a bit in my consulting business (in
fact, I work almost exclusively with people who have an idea and are
wondering how they can convert that idea into a business), and all too
often I see a lack of diligent customer research cause time and money to
be wasted, building a product or service that not enough people really
want.  That&amp;#8217;s the bad news.  But the good news is that this particular
problem is actually easy to overcome!  And, even better, it doesn&amp;#8217;t have
to take a lot of time or money!  And, best of all, it&amp;#8217;s even fun!  That
workshop, and the emphasis that Hiten and Mike placed on really
understanding your customer, gave me the the information and motivation
I needed to implement a process to solve this problem for my own
business and help others who face this very common problem.&lt;/p&gt;

&lt;p&gt;The super-simplified, fun-to-follow and obscenely-effective process
can be broken down into two steps.  First, follow Hiten&amp;#8217;s advice, and
start with a hypothesis, which I&amp;#8217;ll paraphrase a bit:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;We believe that (some type of customer / customer segment) has a
problem (with something or doing something)&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Once you fill in the blanks with a very specific description of what you
think your ideal customer is and with a description of what the job they
want done is, then you are ready to move on to step number two (and this
is where it gets fun): talking to those customers.  But here&amp;#8217;s the
trick: Don&amp;#8217;t talk about you!  Talk about them!  Talk about who they are
and what they do (thus making sure they really are your target customer,
and/or helping you learn about who your target customer is).  Then, talk
about what they are doing today to solve the problem that you are
thinking of addressing.  Ask them how they came to the solution that
they are using, or how they confronted the problem on which you are
focused.  If all goes well, you&amp;#8217;ll end up talking very little about the
product or service idea in your head, and instead you&amp;#8217;ll end up hearing
a lot about what they do and how they do it, which will give you such
good insights that you&amp;#8217;ll find yourself smiling as they are talking.&lt;/p&gt;

&lt;p&gt;Of course this process isn&amp;#8217;t limited to just new ideas, products, or
services.  You can use this same process when working on a new feature
for your current product, or when trying to find out why what you are
currently offering isn&amp;#8217;t quite as successful as you&amp;#8217;d like it to be.&lt;/p&gt;

&lt;p&gt;Now, you might be wondering how I know this process is worthwhile and
fun.  It&amp;#8217;s because I&amp;#8217;ve done it myself, of course! :) And I can
certainly attest that it works wonders.  In fact, I got to practice the
process while still at MicroConf, since some of the attendees are
ideal customers for my Rails application monitoring service,
&lt;a href="https://www.honeybadger.io/"&gt;Honeybadger&lt;/a&gt;.  There&amp;#8217;s a new feature I&amp;#8217;ve
been thinking about the past few weeks, and I wanted to make sure I was
on the right track with it.  I had a hypothesis that Rails developers
would like a better way to do activity X than the way they are currently
doing it.  So I found a few Rails developers that I had already been
talking to during the conference, and I asked them one question:  When
do you do activity X and why? From that one simple question, and a short
conversation that followed it, I realized that I was indeed on to
something with my planned feature.  More importantly, what I heard from
my customers let me know that my planned approach was actually a bit
flawed.  And better yet, I realized that the approach that would
&lt;em&gt;better&lt;/em&gt; solve the problem (as they saw the problem) would actually be
&lt;em&gt;easier&lt;/em&gt; for me to implement than my initial plan.  I was thrilled!&lt;/p&gt;

&lt;p&gt;I hope my small and simple experience of doing customer development &amp;#8211;
and particularly interviewing customers &amp;#8211; has helped persuade you to get
out there and do it yourself, if you aren&amp;#8217;t already doing it.&lt;/p&gt;

&lt;p&gt;If you think this sounds interesting, and you&amp;#8217;d like some help saving time
and money while using this process to help build your product or your next
feature, do &lt;a href="mailto:ben@bencurtis.com"&gt;get in touch&lt;/a&gt;.  I&amp;#8217;ll be happy to
answer your questions or provide whatever help I can.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=uVncfYEjXj0:YUOFUeZv_Ro:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/uVncfYEjXj0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2013/05/proven-customer-interviews-save-you-time-and-money/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Rails Caching Strategies (a presentation)]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/ajMsczWP6_E/" />
    <updated>2012-12-05T20:55:55-08:00</updated>
    <id>http://www.bencurtis.com/2012/12/rails-meetup-slides</id>
    <content type="html">&lt;p&gt;Tonight I gave a presentation at the &lt;a href="http://www.meetup.com/The-Seattle-Ruby-on-Rails-Developers-Meetup-Group/"&gt;Rails Meetup in Seattle&lt;/a&gt; on caching strategies with Rails, and I had a great time.  I&amp;#8217;m convinced Rails developers don&amp;#8217;t use caching enough, and we have so many good options for caching in our apps, we really should be avid practitioners of caching. :)&lt;/p&gt;

&lt;p&gt;I had a request to put my slides up, so &lt;a href="https://speakerdeck.com/stympy/rails-caching-strategies"&gt;here they are&lt;/a&gt;.  They are a bit more useful if you have the context of the words I said along with them, but that&amp;#8217;s the way these things go, right?&lt;/p&gt;

&lt;p&gt;For those of you who were there, I suppose I should apologize for mentioning (so many times) the &lt;a href="http://www.honeybadger.io/"&gt;Airbrake competitor&lt;/a&gt; that I recently launched.  After the 2nd or so time I mentioned it, it became a bit of a joke to see how many times I could mention it, and I do hope I didn&amp;#8217;t annoy you. :)&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=ajMsczWP6_E:dAbd0hzwRSs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/ajMsczWP6_E" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2012/12/rails-meetup-slides/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Looking for Ruby and Rails developers]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/oOAsKDftrJo/" />
    <updated>2012-10-04T09:22:00-07:00</updated>
    <id>http://www.bencurtis.com/2012/10/ruby-and-rails-jobs</id>
    <content type="html">&lt;p&gt;I&amp;#8217;m on the hunt for development help, so if you&amp;#8217;ve been working with
Ruby and/or Rails for a while, and you&amp;#8217;re looking for some contract
hours to fill, I&amp;#8217;d love to hear from you.&lt;/p&gt;

&lt;p&gt;A fellow entrepreneur here in Seattle and I both need someone part-time,
so between the two of us, we might be able to use all the hours you can
spare.  We&amp;#8217;re both open to intermediate through advanced Ruby/Rails
developers, with hourly prices from $60 to $120, with at least 10 to 20
hours available per week.  Both of us are looking to work with a
developer for an extended period of time, so this could be the beginning
of a beautiful friendship. :)&lt;/p&gt;

&lt;p&gt;My needs include getting help with &lt;a href="http://railskits.com/"&gt;RailsKits&lt;/a&gt;,
and &lt;a href="http://catchthebest.com/"&gt;Catch the Best&lt;/a&gt;.  If you end up helping
me with RailsKits, that could lead to additional engagements, as I&amp;#8217;m
often getting requests from people looking for development help to tweak
the Kits to meet their needs.&lt;/p&gt;

&lt;p&gt;My entrepreneur friend is looking for help for his bootstrapped startup,
which is in the early part of its development cycle.  If you are on the
more advanced end of the spectrum he&amp;#8217;ll be looking to you to help
coordinate the efforts of more junior developers, which means you&amp;#8217;ll be
able to focus on the bits you find interesting. :)&lt;/p&gt;

&lt;p&gt;I won&amp;#8217;t bore you with a required skills list &amp;#8211; if you&amp;#8217;ve been
developing web apps for at least a year or two, then you&amp;#8217;ll be
comfortable with (or be able to quickly learn) the whole stack of
technologies that we are using.&lt;/p&gt;

&lt;p&gt;To get in touch and let us know you&amp;#8217;d be interested in us throwing cash
at you in exchange for your talents, please &lt;a href="http://tesly.catchthebest.com/apply/4046/b17a"&gt;submit your info
here&lt;/a&gt;.  Be sure to include a link
to your github profile, a brief run-down of your relevant experience,
and your desired hourly rate.  This is a contract/1099 arrangement.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=oOAsKDftrJo:FMZQ8gjkvck:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/oOAsKDftrJo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2012/10/ruby-and-rails-jobs/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Missing attr_unsearchable in ransack?]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/bPWIbwyQpzQ/" />
    <updated>2012-09-20T13:30:00-07:00</updated>
    <id>http://www.bencurtis.com/2012/09/attr-unsearchable-in-ransack</id>
    <content type="html">&lt;p&gt;If you are upgrading to ransack from meta_search, and you are missing
being able to use &lt;code&gt;attr_unsearchable&lt;/code&gt; to hide various model methods from
search, you can add this to your model instead:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def self.ransackable_attributes(auth_object = nil)
  (column_names - ['company_name']) + _ransackers.keys
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In this case, &lt;code&gt;company_name&lt;/code&gt; will no longer be searchable with the
dynamic scopes that ransack creates.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=bPWIbwyQpzQ:v42kvHBKSV4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/bPWIbwyQpzQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2012/09/attr-unsearchable-in-ransack/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Easy mobile device login for Rails apps]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/XhqwfvsXneA/" />
    <updated>2012-09-10T07:17:00-07:00</updated>
    <id>http://www.bencurtis.com/2012/09/devise-login-with-cell-phone</id>
    <content type="html">&lt;p&gt;I read &lt;a href="http://techcrunch.com/2012/09/09/phoneid-lets-you-login-to-websites-without-a-username-or-password-from-your-phone/"&gt;an article&lt;/a&gt; this morning on TechCrunch about an upcoming service that makes
it easy for developers to add mobile logins to their web applications,
and I thought I&amp;#8217;d try something similar for a new project I&amp;#8217;m working
on.&lt;/p&gt;

&lt;p&gt;If you use the Devise gem for managing logins for your Rails app, and
you pass the &lt;code&gt;:token_authenticatable&lt;/code&gt; to the devise method, then your
users can log in with a link that includes an authentication token,
bypassing the email/username and password login.  With that in place,
all you need to do is generate a QR code that encodes a link to your app
with this authentication token included.  Here&amp;#8217;s how you can do that:&lt;/p&gt;

&lt;p&gt;Following the instructions of the &lt;a href="http://whomwah.github.com/rqrcode/"&gt;qr code gem&lt;/a&gt;,
install the gem by adding &lt;code&gt;gem 'rqrcode'&lt;/code&gt; to your Gemfile and running
&lt;code&gt;bundle install&lt;/code&gt;.  Generating the code can be done in a HAML view like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;- qr = RQRCode::QRCode.new(root_url(Devise.token_authentication_key =&amp;gt; current_user.authentication_token), :size =&amp;gt; 10, :level =&amp;gt; :l)
%table
  - qr.modules.each_index do |x|
    %tr
      - qr.modules.each_index do |y|
        %td{ class: qr.dark?(x,y) ? 'black' : 'white' }/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This assumes that you have devise hooked into your User model, and the
currently-logged in user is available to the view via the current_user
method.  Using the CSS from the rQRCode home page, this will display a
QR code that can be scanned on a phone.&lt;/p&gt;

&lt;p&gt;This will allow a user to log in to your app (using their laptop), scan
the QR code on their phone, and then be logged in on their mobile
browser.  Easy. :)&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=XhqwfvsXneA:_S1kwMMiE70:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/XhqwfvsXneA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2012/09/devise-login-with-cell-phone/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Print Progress Bar Background Color in Chrome]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/Y9dwALyHhPg/" />
    <updated>2012-09-08T09:04:28-07:00</updated>
    <id>http://www.bencurtis.com/2012/09/print-progress-bar-background-color-in-chrome</id>
    <content type="html">&lt;p&gt;I&amp;#8217;m working on a project today that uses Twitter Bootstrap, displays
progress bars, and has a requirement to print those progress bars.
Sadly, Chrome doesn&amp;#8217;t like to print background colors by default, so
printing the progress bars didn&amp;#8217;t work so well.  Here&amp;#8217;s the trick to get
it to work: &lt;code&gt;-webkit-print-color-adjust:exact&lt;/code&gt;.  This instructs Chrome
to print the background color.&lt;/p&gt;

&lt;p&gt;After that, adding a few more styles (in a print stylesheet) makes for nice-looking progress bars (SCSS):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.progress {
  background-image: none;
  -webkit-print-color-adjust: exact;
  box-shadow: inset 0 0;
  -webkit-box-shadow: inset 0 0;

  .bar {
    background-image: none;
    -webkit-print-color-adjust: exact;
    box-shadow: inset 0 0;
    -webkit-box-shadow: inset 0 0;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=Y9dwALyHhPg:iTQggADLJXM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/Y9dwALyHhPg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2012/09/print-progress-bar-background-color-in-chrome/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Googlebot Gotcha]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/_YGvQRJ1vxM/" />
    <updated>2012-02-28T06:33:00-08:00</updated>
    <id>http://www.bencurtis.com/2012/02/googlebot-gotcha</id>
    <content type="html">&lt;p&gt;
Did you build your site thinking that googlebot can&amp;#8217;t understand your javascript?  I did, and I was a bit surprised when I learned I was wrong&amp;#8230;
&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
About a month ago, &lt;a href="http://starrhorne.com/"&gt;Starr Horne&lt;/a&gt; and I launched a reboot of &lt;a href="http://www.officespace.com/"&gt;OfficeSpace.com&lt;/a&gt;,
which is all about helping people who are looking for office space find it.  We&amp;#8217;ve had a lot of fun trying out various techniques and technologies, including trying
different approaches to analytics.
&lt;/p&gt;

&lt;p&gt;
I was very interested in tracking on-page events, in addition to the usual page views, etc., so of course I implemented events tracking with Google Analytics.  I also
wanted to track those events internally, so along with the call to GA, I make a post ajax request to a Rails metal controller that logs the events in Redis.  For example,
when the map view gets loaded, pins get dropped on the map for buildings that have available office space, and a trigger is set on the markers to pop up a dialog with
more info about each building.  When the click event fires, json is fetched, the dialog is displayed, and a post is sent to the stats collecting controller to track an
event for previewing a building.  Since the request was a post and was triggered by javascript, I thought that only humans would trigger it.  As I watched the logs, though,
and saw googlebot posting to the stats tracker with data from the pages it was loading, I realized how wrong I was.
&lt;/p&gt;

&lt;p&gt;
So now I&amp;#8217;m a little wiser and a little more rigorous about keeping bots from creating data they shouldn&amp;#8217;t be creating.  I&amp;#8217;m also now more curious about just how much
dynamic content googlebot can index. :)
&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=_YGvQRJ1vxM:OcvYxIZl_Zk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/_YGvQRJ1vxM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2012/02/googlebot-gotcha/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Skipping Asset Compilation with Capistrano]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/0FYzhovQl10/" />
    <updated>2011-12-13T05:55:56-08:00</updated>
    <id>http://www.bencurtis.com/2011/12/skipping-asset-compilation-with-capistrano</id>
    <content type="html">&lt;p&gt;
Capistrano has a handy task that runs rake assets:precompile for you when you are deploying your Rails 3.1 application.  This gives you an easy way to get the performance boosts of having only one css file and one javascript file to load per request.  The price you pay for that benefit is the amount of time it takes to run that rake task when you are deploying.  There is a way to get the benefit while reducing that cost, though.
&lt;/p&gt;

&lt;p&gt;
Since capistrano creates a symlink for the assets that is moved across deploys, you really don&amp;#8217;t need to compile those assets for any deploy where the assets didn&amp;#8217;t change.  Instead, all you need to do is move the symlink.  However, the default capistrano for compiling the assets does compile them every time, regardless of whether any assets were changed in the set of commits that you are deploying.  The trick, then, is to check the list of files that were changed in the range of commits that are being deployed, and compile the assets only if assets show up in that list.  And here is a code snippet that does exactly that:
&lt;/p&gt;

&lt;script src="https://gist.github.com/1469195.js?file=deploy.rb"&gt;&lt;/script&gt;

&lt;p&gt;
It only supports git, as that&amp;#8217;s what I use, so if you use git, just drop that snippet into deploy.rb and enjoy quicker deployments.
&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=0FYzhovQl10:t30gSSZwj-Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/0FYzhovQl10" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2011/12/skipping-asset-compilation-with-capistrano/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Deploying New Relic Server Monitoring with Chef]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/MJFDAPTGMBk/" />
    <updated>2011-12-08T06:03:11-08:00</updated>
    <id>http://www.bencurtis.com/2011/12/deploying-newrelic-server-monitoring-with-chef</id>
    <content type="html">&lt;p&gt;
This morning I deployed New Relic&amp;#8217;s new &lt;a href="http://newrelic.com/server_monitoring"&gt;Server Monitoring&lt;/a&gt; feature for the first time (I&amp;#8217;ve used &lt;a href="http://scoutapp.com/"&gt;Scout&lt;/a&gt; previously).  It&amp;#8217;s cool to see your server vitals right next to all your app vitals, and their interface looks attractive, to boot.
&lt;/p&gt;

&lt;p&gt;
Since I deploy everything with &lt;a href="http://opscode.com/chef"&gt;Chef&lt;/a&gt;, I threw together a quick Chef recipe to automate the installation of New Relic&amp;#8217;s server monitoring agent.  It has been tested with Ubuntu 10.04 LTS, and you can configure the license key in your Chef JSON config.
&lt;/p&gt;

&lt;p&gt;
You can grab the recipe from my &lt;a href="http://github.com/stympy/chef-recipes"&gt;Chef recipe repository&lt;/a&gt; at Github.
&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=MJFDAPTGMBk:Hz70S5mvQQU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/MJFDAPTGMBk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2011/12/deploying-newrelic-server-monitoring-with-chef/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Improvements to Bundle Watcher]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/dCQ-w1R4Z2M/" />
    <updated>2011-09-17T08:32:05-07:00</updated>
    <id>http://www.bencurtis.com/2011/09/improvements-to-bundle-watcher</id>
    <content type="html">&lt;p&gt;
  I just released an update to &lt;a href="http://www.bundlewatcher.com/"&gt;Bundle Watcher&lt;/a&gt; this morning that may make it a little easier to get your Ruby gem updates tracked.  Now you can specify a URL where your Gemfile.lock resides, rather than having to upload a file.
&lt;/p&gt;

&lt;p&gt;
  You can also now see a list of bundles that your tracking, once you&amp;#8217;ve logged in via Github.  This list shows you at a glance which gems have been updated for your bundles.
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=dCQ-w1R4Z2M:XRL0BvcLhSg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/dCQ-w1R4Z2M" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2011/09/improvements-to-bundle-watcher/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Faker 1.0 released]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/6z8iFWQuRhE/" />
    <updated>2011-09-10T10:43:39-07:00</updated>
    <id>http://www.bencurtis.com/2011/09/faker-1-0-released</id>
    <content type="html">&lt;p&gt;
  Earlier this week I released version 1.0 of the &lt;a href="http://faker.rubyforge.org/"&gt;Faker gem&lt;/a&gt;.  It&amp;#8217;s been about 4 years since the initial release of the gem, and the API has been fairly stable for the last couple of years, so I figured it was a good time to make the jump to 1.0. :)
&lt;/p&gt;

&lt;p&gt;
  This release finishes the conversion to I18n.  Just about everything is in the locale files now, including the ability to define custom formats for everything &amp;#8211; company names, street addresses, etc.  And, with the magic of method_missing, you can add new items to your locale file and have them show up as methods in the Faker classes.
&lt;/p&gt;

&lt;p&gt;
  The 1.0 release also settles some long-standing issues people have had with bad interaction between Faker, Rails 2.3, and locales (especially fallbacks).  Though I&amp;#8217;m not actively seeking to support Rails 2.3, I at least don&amp;#8217;t want it to be broken, so this release should cover that.  Both Ruby 1.9.2 and 1.8.7 are fully supported.
&lt;/p&gt;

&lt;p&gt;
  Finally, I want to send out a big &amp;#8220;thank you&amp;#8221; to everyone (and there are a lot of them) who contributed code and ideas to this release.  I really appreciate the interest shown and the work done by so many people who use and love Faker.  According to rubygems.org, it has been installed over 400,000 times &amp;mdash; over 1,000 times in the past few days!
&lt;/p&gt;

&lt;p&gt;
  Of course, I&amp;#8217;m not done yet&amp;#8230; next on the feature list is Faker::Image, which will provide an interface to all those cool fake image generator services out there. :)
&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=6z8iFWQuRhE:jJPYvcJM9P0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/6z8iFWQuRhE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2011/09/faker-1-0-released/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[CentOS 5.5 net install secret]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/bei8lIOSDJE/" />
    <updated>2011-09-09T00:00:00-07:00</updated>
    <id>http://www.bencurtis.com/2011/09/centos-5-5-net-install-secret</id>
    <content type="html">&lt;p&gt;
  Today I needed to spin up a VM with CentOS 5.5.  My preferred distro these days is Ubuntu, and I had to learn the CentOS dance to get an unsupported version installed, so it took me a little longer than I would have liked to get it going.  Here&amp;#8217;s the secret:
&lt;/p&gt;

&lt;p&gt;
  When asked for the name and directory of the install image, enter vault.centos.org for the name and 5.5/os/x86_64 for the directory.  If that doesn&amp;#8217;t work for you, go back a step and disable IPv6.  After that, you should be good to go.
&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=bei8lIOSDJE:FGfMIix_Vik:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/bei8lIOSDJE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2011/09/centos-5-5-net-install-secret/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[BundleWatcher: Watching Your Gems]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/C4X-NU6JhyM/" />
    <updated>2011-06-20T05:40:23-07:00</updated>
    <id>http://www.bencurtis.com/2011/06/bundlewatcher-watching-your-gems</id>
    <content type="html">&lt;p&gt;
  My weekend project this weekend was &lt;a href="http://www.bundlewatcher.com/"&gt;BundleWatcher&lt;/a&gt;, a tool that does just one thing: watches the gems in your Gemfile for updates.  Once you upload your Gemfile.lock file, BundleWatcher will keep track of updates to the gems upon which your project depends, and you can use the atom feed for your bundle to know when updates have happened.
&lt;/p&gt;

&lt;p&gt;
  I built this to scratch my own itch.  While &lt;a href="http://rubygems.org"&gt;rubygems.org&lt;/a&gt; provides a way to subscribe to gem updates and an RSS feed to track those updates, I wanted a way to track updates for each of my projects, project by project.  Now instead of just knowing that the inherited_resources gem got updated, I can see which of my projects might need an update because that gem got updated.
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="http://www.bundlewatcher.com/"&gt;BundleWatcher&lt;/a&gt; uses the (fantastic) API provided by rubygems.org to keep track of gem updates, so as long as you depend on gems that are listed there, you&amp;#8217;ll be good to go.
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=C4X-NU6JhyM:VUO2U-Uw_bA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/C4X-NU6JhyM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2011/06/bundlewatcher-watching-your-gems/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Chef Tips]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/SKPXxVFKP3g/" />
    <updated>2011-05-25T06:20:28-07:00</updated>
    <id>http://www.bencurtis.com/2011/05/chef</id>
    <content type="html">&lt;p&gt;
  One of the best things that came out of using EngineYard Cloud was learning about &lt;a href="http://www.opscode.com/chef/"&gt;Chef&lt;/a&gt;.  Chef has changed my world when it comes to managing servers, and I now wouldn&amp;#8217;t do any amount of system administration without the kind of automation and scriptability Chef provides.  Here are a couple of tips on the reasons for and the benefits of using Chef.
&lt;/p&gt;

&lt;!--more--&gt;

&lt;h3&gt;Tip #1: Chef keeps you honest&lt;/h3&gt;
&lt;p&gt;
  Yesterday I was reminded just how useful Chef can be when I updated the wordpress layout on a client&amp;#8217;s server just by running &lt;a href="https://gist.github.com/990989"&gt;./config/chef/runchef.rb&lt;/a&gt; from my project folder.  Not only did the files I changed get pushed out (as you would expect), but I also saw a note in the output about a config file changing.  Curious about the unintended change, I did a diff of the just-updated config file with the backup file created by Chef.  The diff reminded me that I had made an emergency manual change on the server that I hadn&amp;#8217;t yet added to my Chef config (bad me).  Since Chef told me about the change to the file, and gave me the location of the backup it made just before changing the file, it was easy for me to find the differences and add them to my build templates (and commit them to my git repo).
&lt;/p&gt;

&lt;h3&gt;Tip #2: Use Vagrant for Chef recipe development&lt;/h3&gt;
&lt;p&gt;
  Recently I started working on a new slice configuration since I need to move slices away from slicehost.  Since Linux distributions and software packages are always being updated (like Debian 6 and Passenger 3.0.7), I like to start with my stock set of Chef scripts and update them for those kinds of changes.  I&amp;#8217;ll start with a clean installation of a Linux distro, and fold in my recipes one by one, making sure each is using the best method of installation and configuration.  &lt;a href="http://vagrantup.com/"&gt;Vagrant&lt;/a&gt; is a great tool for this kind of development for a few reasons:
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;It&amp;#8217;s free: You aren&amp;#8217;t spinning up an instance at EC2 or Rackspace Cloud to get a clean starting point.&lt;/li&gt;
  &lt;li&gt;It&amp;#8217;s quick: Again, you aren&amp;#8217;t depending on EC2 or RS load times, and bandwidth isn&amp;#8217;t a problem.&lt;/li&gt;
  &lt;li&gt;Local filesystem: If you want to start a Chef template from, say, a package-installed config file like /etc/ssh/sshd_config, all you have to do is 
    &lt;code&gt;cp /etc/ssh/sshd_config /vagrant/cookbooks/ssh/templates/default/sshd_config.erb&lt;/code&gt; 
    since Vagrant mounts your current working dir to /vagrant on the virtual machine.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
  Even if you aren&amp;#8217;t managing a farm full of servers, Chef is still fantastic to use.  I use chef-solo to manage all the servers for my clients, and it makes it easy to have repeatable, predictable deployments for all of them.  If you haven&amp;#8217;t used it yet, do grab Vagrant and give it a shot.
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=SKPXxVFKP3g:GGxM3hRMS5w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/SKPXxVFKP3g" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2011/05/chef/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Jekyll: Pagination, Archives, and Excerpts]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/ESgt5UbxN_Y/" />
    <updated>2011-05-23T05:53:48-07:00</updated>
    <id>http://www.bencurtis.com/2011/05/jekyll-pagination-archives-and-excerpts</id>
    <content type="html">&lt;p&gt;
  I recently converted this blog to &lt;a href="http://jekyllrb.com"&gt;jekyll&lt;/a&gt; &amp;mdash; I figured since I had to move my slicehost slices elsewhere anyway, I might as well ditch wordpress and play with something new.  It&amp;#8217;s been a bit of adventure getting the site rendered by jekyll to match the URL structure I had in place with wordpress, so I thought I&amp;#8217;d share some of the code I found and wrote to make it work.
&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;
  The first step was pagination.  My old page links were in the form of /page/2, rather than page2 like jekyll&amp;#8217;s default.  This was an easy fix, based on some comments in the Google group.  I just copied the pagination.rb from the jekyll gem into my _plugins directory and changed line 32 as follows:
  &lt;code lang="ruby"&gt;
    newpage.dir = File.join(page.dir, "page#{num_page}")
  &lt;/code&gt;
  to
  &lt;code lang="ruby"&gt;
    newpage.dir = File.join(page.dir, "page/#{num_page}")
  &lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
  One thing I didn&amp;#8217;t see in many of the blog posts I found about converting from wordpress to jekyll was detailed information on generating archive pages.  Those are the pages in the form (for my layout) of /year/month, where you&amp;#8217;d see all the posts written in that month.  Using the category plugin from &lt;a href="http://recursive-design.com/projects/jekyll-plugins" title="Jekyll Plugins - Recursive Design"&gt;Recursive Design&lt;/a&gt; as a starting point, I added year and month output, with pagination, with this &lt;a href="https://gist.github.com/986652"&gt;archive generator plugin&lt;/a&gt;.  I used a similar block of pagination code (which is just lifted from jekyll&amp;#8217;s pagination code) as a modification to Recursive Design&amp;#8217;s category plugin to get pagination for my category pages, too.
&lt;/p&gt;
&lt;p&gt;
  Finally, I wanted excerpts, or &amp;#8220;read more&amp;#8221;, like you are seeing in this blog post, and I didn&amp;#8217;t find any existing plugins that did it, so I wrote one.  My &lt;a href="https://gist.github.com/986665"&gt;excerpt plugin for jekyll&lt;/a&gt; creates an excerpt with the content of the post it finds before the &amp;#8211;more&amp;#8211; comment tag, if there is one.  In my index views, I assign excerpt = true to get _includes/post.html to render the excerpt view rather than the full content.  On the full post view, post.html renders the full content, with the &amp;#8211;more&amp;#8211; comment tag replaced with a #more anchor that can be used as a link target to continue reading where the excerpt left off.
&lt;/p&gt;
&lt;p&gt;
  After all that, and after a few other nips and tucks, my new site looks almost exactly like my old site. :)
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=ESgt5UbxN_Y:oh6vgO4yalU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/ESgt5UbxN_Y" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2011/05/jekyll-pagination-archives-and-excerpts/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Pricing Experiment Follow Up]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/_AmOOYhiO6o/" />
    <updated>2011-04-30T08:14:00-07:00</updated>
    <id>http://www.bencurtis.com/2011/04/pricing-experiment-follow-up</id>
    <content type="html">&lt;p&gt;
  Thanks so much to those of you who helped me with my &lt;a href="http://www.bencurtis.com/2011/04/a-pricing-experiment/"&gt;pricing experiment&lt;/a&gt;.  I feel it was a success, with a lot of great feedback.  
&lt;/p&gt;

&lt;p&gt;
  Before I launched the survey I had a price in mind, but I wanted to see what the prevailing opinion would be on what the price should be without being influenced by that info.  I was pleasantly surprised to find that many of those who responded were willing to pay more than the amount I had in mind, which makes me feel good about the value of the products I offer via Rails Kits.
&lt;/p&gt;

&lt;p&gt;
  The &lt;a href="http://railskits.com/oauth"&gt;OAuth Kit&lt;/a&gt; has now been priced and released, but I&amp;#8217;ll leave the survey open a little longer to let a few more folks get the coupon. :)
&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=_AmOOYhiO6o:4j02ZjWUB2c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/_AmOOYhiO6o" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2011/04/pricing-experiment-follow-up/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[A Pricing Experiment]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/7z36isPwoB8/" />
    <updated>2011-04-28T16:15:12-07:00</updated>
    <id>http://www.bencurtis.com/2011/04/a-pricing-experiment</id>
    <content type="html">&lt;p&gt;
  Today I read about &lt;a href="http://www.seattle20.com/blog/Are-You-Leaving-Money-On-The-Table.aspx"&gt;determining pricing by surveying your customers&lt;/a&gt;, and it just so happens that I have a new product ready for pricing, so I thought I&amp;#8217;d try it out.
&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;
  I am ready to release the &lt;a href="http://railskits.com/oauth"&gt;OAuth Rails Kit&lt;/a&gt;, which gives you a good example of how to integrate Twitter, Facebook, and LinkedIn into your Rails app.  If you&amp;#8217;re like me, you&amp;#8217;ve probably been asked to pull data in from LinkedIn, or push out updates to a user&amp;#8217;s Facebook stream.  This Kit shows you step by step exactly how to that.  The only thing I need now to start selling the Kit is a price. :)
&lt;/p&gt;

&lt;p&gt;
  That&amp;#8217;s where you come in.  After you check out the product page, head over to this &lt;a href="http://www.surveymonkey.com/s/SKWNGXQ"&gt;one-page, seven-question survey&lt;/a&gt; that seeks your input on what I should charge for the OAuth Kit.  In exchange for your time, you&amp;#8217;ll get a 25%-off coupon code that you can use towards a purchase of the OAuth Kit.
&lt;/p&gt;

&lt;p&gt;
  Thanks for your help &amp;#8211; I&amp;#8217;m looking forward to seeing how this turns out!
&lt;/p&gt;

&lt;strong&gt;Update&lt;/strong&gt;

&lt;p&gt;
  The Kit has now been priced and launched.  Please see &lt;a href="http://www.bencurtis.com/2011/04/pricing-experiment-follow-up/"&gt;the results of the pricing experiment&lt;/a&gt;, or go ahead and buy the Kit to easily &lt;a href="http://railskits.com/oauth"&gt;integrate Facebook, Twitter, and LinkedIn APIs in your Rails app&lt;/a&gt;. :)
&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=7z36isPwoB8:mfWzPe6j8wI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/7z36isPwoB8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2011/04/a-pricing-experiment/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Auto-spawning Delayed Job Workers]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/CqlvydYY2Us/" />
    <updated>2011-04-12T11:49:14-07:00</updated>
    <id>http://www.bencurtis.com/2011/04/auto-spawning-delayed-job-workers</id>
    <content type="html">&lt;p&gt;
  I&amp;#8217;ve been interested in simplifying lately&amp;#8230;. using Chef (solo) to configure boxes, switching to Postgres from MySQL to get decent text search without having to run sphinx, etc.  My goal recently has been to cut down the number of moving parts in my deployments to make my life a little easier.  So when a client project required background processing, I re-evaluated my stock approach to see if I could simplify a bit.
&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;
  I&amp;#8217;ve been doing background stuff with Rails for a long time, so I&amp;#8217;ve used backgroundrb, backgroundjob, delayed_job, and, most recently, resque.  I&amp;#8217;ve enjoyed them all. :)  This time around, I decided to give delayed_job another go in order to avoid having to add redis to the deployment mix just for background jobs.  There won&amp;#8217;t be a lot of background jobs in this project, so I don&amp;#8217;t need a number of workers (which would be perfect for resque), so delayed_job seemed a good fit to run these jobs.
&lt;/p&gt;

&lt;p&gt;
  The problem was that I still needed a daemon running (the worker process) to get jobs to be processed, and I was looking for a way to avoid running (and monitoring) yet another daemon.  Enter &lt;a href="https://github.com/pedro/delayed_job"&gt;pedro&amp;#8217;s fork of delayed_job&lt;/a&gt;, which automagically spins up and spins down a worker for you as jobs get created and the queue gets cleared.  Since my partner on this project went with &lt;a href="https://github.com/collectiveidea/delayed_job"&gt;collectiveidea&amp;#8217;s fork of delayed job&lt;/a&gt;, I decided to combine pedro&amp;#8217;s work with collectiveidea&amp;#8217;s more recent updates into &lt;a href="https://github.com/stympy/delayed_job/tree/v2.0"&gt;my own fork&lt;/a&gt; of collectiveidea&amp;#8217;s 2.0 branch (which is targeted at Rails 2.x).  
&lt;/p&gt;

&lt;p&gt;
  Using this fork of delayed_job, you don&amp;#8217;t need to worry about running a worker process.  When a job is created, a check is made to see if a worker is running, and, if not, one is spawned (either as a process via the rush gem if you&amp;#8217;re on a standard box/slice, or as a heroku worker via the heroku gem if you&amp;#8217;re on heroku).  When the job queue gets processed, the worker is stopped if there are no more jobs in the queue.  It is so awesome. :)
&lt;/p&gt;

&lt;p&gt;
  Since we are deploying this client&amp;#8217;s code to both heroku (for staging) and EY cloud (for production), the delayed_job initializer looks like this:
&lt;/p&gt;

&lt;script src="https://gist.github.com/916233.js?file=delayed_job.rb"&gt;&lt;/script&gt;
&lt;noscript&gt;
&lt;code lang="ruby"&gt;
Delayed::Worker.auto_scale = true

&lt;p&gt;
  if Rails.env.production?
  Delayed::Worker.auto_scale_manager = ENV['HEROKU_APP'] ? :heroku : :local
else
  Delayed::Worker.auto_scale_manager = :local
end
&lt;/code&gt;
&lt;/noscript&gt;
&lt;/p&gt;

&lt;a href="https://github.com/stympy/delayed_job/tree/v2.0"&gt;Auto-scaling delayed_job workers&lt;/a&gt; makes everybody happy &amp;mdash; long-running tasks go in the background, and you don&amp;#8217;t have to add even so much as a chef recipe to your deployment. :)
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=CqlvydYY2Us:xHIXIYhl284:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/CqlvydYY2Us" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2011/04/auto-spawning-delayed-job-workers/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Quick Tip: Sending Google Chart links via email]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/BuP7RdXAXpI/" />
    <updated>2011-02-24T11:00:45-08:00</updated>
    <id>http://www.bencurtis.com/2011/02/quick-tip-sending-google-chart-links-via-email</id>
    <content type="html">&lt;p&gt;
  Recently I had a client who wanted to deliver reports via email that contained a bunch of charts, and we decided on using Google Charts for the chart rendering.  I used the &lt;a href="https://github.com/mattetti/googlecharts"&gt;googlecharts gem&lt;/a&gt; to create the links to Google.  I encountered a problem with the charts not showing up in Gmail, even when the exact same code was working when viewing the reports at the site in the browser.
&lt;/p&gt;

&lt;p&gt;
  It turns out that the pipe character used to delimit data, options, etc., in Google Charts URLs didn&amp;#8217;t play nicely with Gmail.  Once they were encoded (converted to %7c), it worked like a champ.  So, in my (html) email views, I have this as the src attribute to image tags:
&lt;/p&gt;

&lt;code lang="ruby"&gt;
Gchart.line(..., :format =&gt; 'url').gsub('|', '%7C')
&lt;/code&gt;

&lt;p&gt;
  Problem solved. :)
&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=BuP7RdXAXpI:Qwn8v24i1X8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/BuP7RdXAXpI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2011/02/quick-tip-sending-google-chart-links-via-email/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Faker 0.9.0 released]]></title>
    <link href="http://feedproxy.google.com/~r/bencurtis/~3/tvTEPAmfvu8/" />
    <updated>2010-12-21T22:07:22-08:00</updated>
    <id>http://www.bencurtis.com/2010/12/faker-0-9-0-released</id>
    <content type="html">&lt;p&gt;
  It&amp;#8217;s been two-and-a-half years since the last release of the &lt;a href="http://faker.rubyforge.org"&gt;faker gem&lt;/a&gt;, so it&amp;#8217;s about time for another one. :)  For a long time I&amp;#8217;ve been kicking around the idea of using the I18n gem to make it easier to support different formats (think zip codes in the US vs. postal codes in the UK) without having to change the method signatures, so I sat down today to give it a whirl.  I was pleasantly surprised with how quickly I was able to get it implemented, so kudos to the folks who have done all the hard work of making that gem work as well as it does.
&lt;/p&gt;

&lt;p&gt;
  In fact, my love for that gem has grown over the last several months as I&amp;#8217;ve used it on a few different projects.  I had one client who wanted &lt;strong&gt;everything&lt;/strong&gt; localized in his Rails app, which helped me get familiar with it (and eventually enchanted with it).  One thing that I found fun to do (which may indicate I&amp;#8217;ve crossed the line into gem abuse) is to store starter data in the locale files.  For example, if you wanted to give new users a sample list of groceries when they create an account in your grocery list tracker app, you could do something like this:
&lt;/p&gt;

&lt;script src="https://gist.github.com/751161.js"&gt; &lt;/script&gt;

&lt;p&gt;
  Then you can create a list of groceries in the user&amp;#8217;s native tongue.
&lt;/p&gt;

&lt;p&gt;
  So check out the latest faker, and find crazy stuff like that and more! :)
&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/bencurtis?a=tvTEPAmfvu8:_uni2O-l35M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/bencurtis?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/bencurtis/~4/tvTEPAmfvu8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://www.bencurtis.com/2010/12/faker-0-9-0-released/</feedburner:origLink></entry>
  
</feed>
