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

<channel>
	<title>Pivotal Labs &#187; Matthew Kocher</title>
	<atom:link href="http://pivotallabs.com/author/mkocher/feed/" rel="self" type="application/rss+xml" />
	<link>http://pivotallabs.com</link>
	<description>Agility Developed</description>
	<lastBuildDate>Wed, 22 May 2013 17:14:01 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Did we git pair?</title>
		<link>http://pivotallabs.com/did-we-git-pair/</link>
		<comments>http://pivotallabs.com/did-we-git-pair/#comments</comments>
		<pubDate>Mon, 29 Apr 2013 16:21:34 +0000</pubDate>
		<dc:creator>Matthew Kocher</dc:creator>
				<category><![CDATA[Labs]]></category>

		<guid isPermaLink="false">http://pivotallabs.com/?p=18656</guid>
		<description><![CDATA[<p>&#8220;Did we git pair&#8221; is something developers at pivotal are used to hearing shortly after committing and right before pushing. After reviewing the changes, one half of the pair usually takes over the keyboard to build the commit, something that lends itself to quick successive actions that follow on with little thought once you&#8217;ve mastered git. While we pair all the time, git is just just one of the many tools (*cough* tracker *cough*) we use that that doesn&#8217;t understand pairing. Years ago we wrote a script to make setting the git author as easy as possible, and publish it as a chef recipe in pivotal_workstation and as a ruby gem. Once the .pairs file is set up, git-pair gives us one command to run: Matthews-MacBook-Air-3:pivotal_workstation (gemify) mk$ git pair mk bc global: user.name Brian Cunnie &#38; Matthew Kocher global: user.email pair+cunnie+mkocher@pivotallabs.com global: user.initials mk bc Matthews-MacBook-Air-3:pivotal_workstation (gemify) mk bc$&#8230;</p><p>The post <a href="http://pivotallabs.com/did-we-git-pair/">Did we git pair?</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>&#8220;Did we git pair&#8221; is something developers at pivotal are used to hearing shortly after committing and right before pushing. After reviewing the changes, one half of the pair usually takes over the keyboard to build the commit, something that lends itself to quick successive actions that follow on with little thought once you&#8217;ve mastered git.</p>
<p>While we pair all the time, git is just just one of the many tools (*cough* tracker *cough*) we use that that doesn&#8217;t understand pairing. Years ago we wrote a script to make setting the git author as easy as possible, and publish it as a chef recipe in <a href="https://github.com/pivotal/pivotal_workstation/blob/master/templates/default/git_scripts_pairs.erb">pivotal_workstation</a> and as a <a href="http://rubygems.org/gems/pivotal_git_scripts">ruby gem</a>.</p>
<p>Once the .pairs file is set up, git-pair gives us one command to run:</p>
<p><code>Matthews-MacBook-Air-3:pivotal_workstation (gemify) mk$ git pair mk bc<br />
global: user.name Brian Cunnie &amp; Matthew Kocher<br />
global: user.email pair+cunnie+mkocher@pivotallabs.com<br />
global: user.initials mk bc<br />
Matthews-MacBook-Air-3:pivotal_workstation (gemify) mk bc$</code></p>
<p>Anyone reading especially closely will notice that we also put the current initials at the end of the bash prompt. (using <a href="github.com/pivotal/pivotal_workstation/blob/master/templates/default/bash_profile-ps1.sh.erb">another chef recipe</a>)</p>
<p>If your pair wasn&#8217;t paying attention and didn&#8217;t remind you to git pair, you can ammend the the commit to fix it. However, git won&#8217;t rewrite the author by default, you&#8217;ll need to run `git commit &#8211;amend &#8211;reset-author`. The usual caveats about amending commits after pushing still apply.</p>
<p>The post <a href="http://pivotallabs.com/did-we-git-pair/">Did we git pair?</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://pivotallabs.com/did-we-git-pair/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Service Oriented Foreman</title>
		<link>http://pivotallabs.com/service-oriented-foreman/</link>
		<comments>http://pivotallabs.com/service-oriented-foreman/#comments</comments>
		<pubDate>Fri, 09 Nov 2012 21:27:00 +0000</pubDate>
		<dc:creator>Matthew Kocher</dc:creator>
				<category><![CDATA[Labs]]></category>

		<guid isPermaLink="false">http://pivotallabs.com/service-oriented-foreman/</guid>
		<description><![CDATA[<p><p>I'm a big fan of David Dollar's <a href="https://github.com/ddollar/foreman">foreman</a> for starting up everything you need to run an app.  These days were seeing a number of projects that rely on multiple ruby apps with seperate gemfiles to have a usuable development environment.</p>

<p>On one project recently we had three external services which we did not want to depend on for development.  We wrote a tiny rails app for each, which had json endpoints, models for fake data, and used <a href="https://github.com/sferik/rails_admin">Rails Admin</a> almost exclusively for the UI.  This was great, but starting each one by hand was a chore, and foreman didn't want to respect the individual gemfiles.</p>

<p>The first thing that makes this dificult is bundler, which attempts to be helpful and make sure your gemset is still in effect when you shell out.  How it does this is an ugly or beautiful hack, depending on your point of view.</p>

<pre><code>    1.9.3p194 :001 &#62; ENV['RUBYOPT']
    =&#62; nil
    1.9.3p194 :002 &#62; require 'bundler'
    =&#62; true
    1.9.3p194 :003 &#62; Bundler.require
    =&#62; [...]
    1.9.3p194 :004 &#62; ENV['RUBYOPT']
    =&#62; "-I/Users/mkocher/.rvm/gems/ruby-1.9.3-p194@soloist/gems/bundler-1.2.0.rc.2/lib -rbundler/setup"
</code></pre>

<p>As you can see, Bundler has set RUBYOPT to load itself every time you shell out.  We can prevent this from happening by using <code>Bundler.with_clean_env</code>.</p>

<pre><code>    1.9.3p194 :005 &#62; Bundler.with_clean_env { ENV['RUBYOPT'] }
    =&#62; nil
</code></pre>

<p>Better! But we're not out of the woods yet.</p>

<p>RVM has recently started including rubygems-bundler in the global gemset.  I with they hadn't, but I also don't want to tell people to uninstall it every time they get a new workstation.</p>

<p>To prevent rubygems-bundler from trying to keep you in your gemset, you'll want to add a NOEXEC=skip to your environment.</p>

<p>With ruby, the cleanest way to do this is to include the env hash in your call to system:</p>

<pre><code>  system&#40;{'NOEXEC'=&#62;'skip'}, "rake -T"&#41;
</code></pre>

<p>Putting this all together, we made a script called run_app which looks like</p>

<pre><code>    #!/usr/bin/env ruby
    require 'bundler'

    cmd = %Q{bash -lc "cd ../#{ARGV[0]} &#38;&#38; source #{ENV['rvm_path']}/scripts/rvm &#38;&#38; exec rackup config.ru -p #{ARGV[1]}"}

    Bundler.with_clean_env do
      system&#40;{'NOEXEC'=&#62;'skip'}, cmd&#41;
    end
</code></pre>

<p>We call this from our main project, and can pass it a directory and the port we want it to run on.  <code>foreman start</code> now gives us an entire development environment nicely logging to one terminal.</p> <a href="http://pivotallabs.com/service-oriented-foreman/">Continue reading <span class="meta-nav">&#8594;</span></a></p><p>The post <a href="http://pivotallabs.com/service-oriented-foreman/">Service Oriented Foreman</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m a big fan of David Dollar&#8217;s <a href="https://github.com/ddollar/foreman">foreman</a> for starting up everything you need to run an app.  These days were seeing a number of projects that rely on multiple ruby apps with seperate gemfiles to have a usuable development environment.</p>
<p>On one project recently we had three external services which we did not want to depend on for development.  We wrote a tiny rails app for each, which had json endpoints, models for fake data, and used <a href="https://github.com/sferik/rails_admin">Rails Admin</a> almost exclusively for the UI.  This was great, but starting each one by hand was a chore, and foreman didn&#8217;t want to respect the individual gemfiles.</p>
<p>The first thing that makes this dificult is bundler, which attempts to be helpful and make sure your gemset is still in effect when you shell out.  How it does this is an ugly or beautiful hack, depending on your point of view.</p>
<pre><code>    1.9.3p194 :001 &gt; ENV['RUBYOPT']
    =&gt; nil
    1.9.3p194 :002 &gt; require 'bundler'
    =&gt; true
    1.9.3p194 :003 &gt; Bundler.require
    =&gt; [...]
    1.9.3p194 :004 &gt; ENV['RUBYOPT']
    =&gt; "-I/Users/mkocher/.rvm/gems/ruby-1.9.3-p194@soloist/gems/bundler-1.2.0.rc.2/lib -rbundler/setup"
</code></pre>
<p>As you can see, Bundler has set RUBYOPT to load itself every time you shell out.  We can prevent this from happening by using <code>Bundler.with_clean_env</code>.</p>
<pre><code>    1.9.3p194 :005 &gt; Bundler.with_clean_env { ENV['RUBYOPT'] }
    =&gt; nil
</code></pre>
<p>Better! But we&#8217;re not out of the woods yet.</p>
<p>RVM has recently started including rubygems-bundler in the global gemset.  I with they hadn&#8217;t, but I also don&#8217;t want to tell people to uninstall it every time they get a new workstation.</p>
<p>To prevent rubygems-bundler from trying to keep you in your gemset, you&#8217;ll want to add a NOEXEC=skip to your environment.</p>
<p>With ruby, the cleanest way to do this is to include the env hash in your call to system:</p>
<pre><code>  system&#40;{'NOEXEC'=&gt;'skip'}, "rake -T"&#41;
</code></pre>
<p>Putting this all together, we made a script called run_app which looks like</p>
<pre><code>    #!/usr/bin/env ruby
    require 'bundler'

    cmd = %Q{bash -lc "cd ../#{ARGV[0]} &amp;&amp; source #{ENV['rvm_path']}/scripts/rvm &amp;&amp; exec rackup config.ru -p #{ARGV[1]}"}

    Bundler.with_clean_env do
      system&#40;{'NOEXEC'=&gt;'skip'}, cmd&#41;
    end
</code></pre>
<p>We call this from our main project, and can pass it a directory and the port we want it to run on.  <code>foreman start</code> now gives us an entire development environment nicely logging to one terminal.</p>
<p>The post <a href="http://pivotallabs.com/service-oriented-foreman/">Service Oriented Foreman</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://pivotallabs.com/service-oriented-foreman/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>05/30/2012: Resque Me</title>
		<link>http://pivotallabs.com/05-30-2012-resque-me/</link>
		<comments>http://pivotallabs.com/05-30-2012-resque-me/#comments</comments>
		<pubDate>Wed, 30 May 2012 14:48:00 +0000</pubDate>
		<dc:creator>Matthew Kocher</dc:creator>
				<category><![CDATA[Standup]]></category>

		<guid isPermaLink="false">http://pivotallabs.com/05-30-2012-resque-me/</guid>
		<description><![CDATA[<p><h2>Helps</h2>

<ul>
<li>Using resque-scheduler with resque-status</li>
</ul>

<p>We're attempting to use both of these together, and encountered problems getting it to work.</p>

<p>Another project had found the answer. Resque scheduler only calls the correct method if you provide a custom_job_class in your yaml file:</p>

<p>This code from resque scheduler is the smoking gun:</p>

<pre><code>if &#40;job_klass = job_config['custom_job_class']&#41; &#38;&#38; &#40;job_klass != 'Resque::Job'&#41;
    constantize&#40;job_klass&#41;.scheduled&#40;queue, klass_name, *params&#41;
end
</code></pre> <a href="http://pivotallabs.com/05-30-2012-resque-me/">Continue reading <span class="meta-nav">&#8594;</span></a></p><p>The post <a href="http://pivotallabs.com/05-30-2012-resque-me/">05/30/2012: Resque Me</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></description>
				<content:encoded><![CDATA[<h2>Helps</h2>
<ul>
<li>Using resque-scheduler with resque-status</li>
</ul>
<p>We&#8217;re attempting to use both of these together, and encountered problems getting it to work.</p>
<p>Another project had found the answer. Resque scheduler only calls the correct method if you provide a custom_job_class in your yaml file:</p>
<p>This code from resque scheduler is the smoking gun:</p>
<pre><code>if &#40;job_klass = job_config['custom_job_class']&#41; &amp;&amp; &#40;job_klass != 'Resque::Job'&#41;
    constantize&#40;job_klass&#41;.scheduled&#40;queue, klass_name, *params&#41;
end
</code></pre>
<p>The post <a href="http://pivotallabs.com/05-30-2012-resque-me/">05/30/2012: Resque Me</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://pivotallabs.com/05-30-2012-resque-me/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Chef cookbook linting with foodcritic</title>
		<link>http://pivotallabs.com/chef-cookbook-linting-with-foodcritic/</link>
		<comments>http://pivotallabs.com/chef-cookbook-linting-with-foodcritic/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 06:36:00 +0000</pubDate>
		<dc:creator>Matthew Kocher</dc:creator>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[chef]]></category>
		<category><![CDATA[devops]]></category>

		<guid isPermaLink="false">http://pivotallabs.com/chef-cookbook-linting-with-foodcritic/</guid>
		<description><![CDATA[<p><p>There's a growing movement for testing chef cookbooks, which is great to see.  I haven't gotten to play with them all, but some that I've come across are the <a href="https://github.com/calavera/minitest-chef-handler">minitest chef handler</a>, <a href="https://github.com/acrmp/chefspec">chefspec</a>, and <a href="https://github.com/Atalanta/cucumber-chef">cucumber-chef</a>.</p>

<p>The lowest hanging fruit however is linting, which is where <a href="https://github.com/acrmp/foodcritic">foodcritic</a> comes in.  Foodcritic parses your cookbook, and warns you about many common errors.</p>

<p>Food critic will yell at you about all sorts of things - if you are accessing node attributes inconsistently, if you're passing valid ruby as a not_if string, if you're using /tmp instead of file_cache_path, and many more.  For a full list, see the <a href="http://acrmp.github.com/foodcritic/">github pages</a></p>

<p>Automatically running foodcritic on your public cookbooks is easy with <a href="http://travis-ci.org/">Travis CI</a>.  Just add a .travis.yml to your repo that looks like this:</p>

<pre><code>script: "gem install foodcritic -v 1.1.0 &#38;&#38; foodcritic -f any ."
rvm:
  - 1.9.3
</code></pre>

<p>And follow the <a href="http://about.travis-ci.org/docs/user/getting-started/">travis getting started guide</a>. You'll then get an email if you commit something that isn't quite up to par.</p>

<p>You can see a pivotal_workstation <a href="http://travis-ci.org/#!/pivotal/pivotal_workstation/builds/1064073">run on travis</a>.  We've still got a little ways to go to get to green, but everything it's telling us are things we'd like to do. &#40;pull requests welcome!&#41;</p> <a href="http://pivotallabs.com/chef-cookbook-linting-with-foodcritic/">Continue reading <span class="meta-nav">&#8594;</span></a></p><p>The post <a href="http://pivotallabs.com/chef-cookbook-linting-with-foodcritic/">Chef cookbook linting with foodcritic</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>There&#8217;s a growing movement for testing chef cookbooks, which is great to see.  I haven&#8217;t gotten to play with them all, but some that I&#8217;ve come across are the <a href="https://github.com/calavera/minitest-chef-handler">minitest chef handler</a>, <a href="https://github.com/acrmp/chefspec">chefspec</a>, and <a href="https://github.com/Atalanta/cucumber-chef">cucumber-chef</a>.</p>
<p>The lowest hanging fruit however is linting, which is where <a href="https://github.com/acrmp/foodcritic">foodcritic</a> comes in.  Foodcritic parses your cookbook, and warns you about many common errors.</p>
<p>Food critic will yell at you about all sorts of things &#8211; if you are accessing node attributes inconsistently, if you&#8217;re passing valid ruby as a not_if string, if you&#8217;re using /tmp instead of file_cache_path, and many more.  For a full list, see the <a href="http://acrmp.github.com/foodcritic/">github pages</a></p>
<p>Automatically running foodcritic on your public cookbooks is easy with <a href="http://travis-ci.org/">Travis CI</a>.  Just add a .travis.yml to your repo that looks like this:</p>
<pre><code>script: "gem install foodcritic -v 1.1.0 &amp;&amp; foodcritic -f any ."
rvm:
  - 1.9.3
</code></pre>
<p>And follow the <a href="http://about.travis-ci.org/docs/user/getting-started/">travis getting started guide</a>. You&#8217;ll then get an email if you commit something that isn&#8217;t quite up to par.</p>
<p>You can see a pivotal_workstation <a href="http://travis-ci.org/#!/pivotal/pivotal_workstation/builds/1064073">run on travis</a>.  We&#8217;ve still got a little ways to go to get to green, but everything it&#8217;s telling us are things we&#8217;d like to do. &#40;pull requests welcome!&#41;</p>
<p>The post <a href="http://pivotallabs.com/chef-cookbook-linting-with-foodcritic/">Chef cookbook linting with foodcritic</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://pivotallabs.com/chef-cookbook-linting-with-foodcritic/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[SF] 11/30/2011: 30 Days has Movember</title>
		<link>http://pivotallabs.com/sf-11-30-2011-30-days-has-movember/</link>
		<comments>http://pivotallabs.com/sf-11-30-2011-30-days-has-movember/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 15:30:00 +0000</pubDate>
		<dc:creator>Matthew Kocher</dc:creator>
				<category><![CDATA[Standup]]></category>

		<guid isPermaLink="false">http://pivotallabs.com/sf-11-30-2011-30-days-has-movember/</guid>
		<description><![CDATA[<p><h2>Ask for Help</h2>

<blockquote>
    <p><em>"Is there a good JS/HTML code editor that will expand to fix the contents?"</em></p>
</blockquote>

<p>A team is just getting started with putting in a code editor and is currently using ACE.  It doesn't seem like there's a way to tell it to take up as much height as it needs.  Many suggestions were thrown out, FCK and TinyMCE being two, but none was known to auto size itself.  There is one that no one can remember the name of, but they had fond memories of from the past.</p>

<h2>Interesting Things</h2>

<ul>
<li><a href="http://supermarketstreetsweep.blogspot.com/">Super Market Street Sweep</a> is coming up this weekend.  Ride your bike around SF for a good cause.</li>
</ul>

<h2>Movember Update</h2>

<ul>
<li>Webstash passed the $20k mark that Davis &#38; Sean had been shooting for--congratulations everyone!  &#40;This does not include Rob's generous Mohawk donation&#41;.  SF has raised $323.36 per stash, NY $163.40 and Boulder $210.50.  There's still <a href="http://www.movember.com/m/1925160">time to donate</a>.</li>
</ul> <a href="http://pivotallabs.com/sf-11-30-2011-30-days-has-movember/">Continue reading <span class="meta-nav">&#8594;</span></a></p><p>The post <a href="http://pivotallabs.com/sf-11-30-2011-30-days-has-movember/">[SF] 11/30/2011: 30 Days has Movember</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></description>
				<content:encoded><![CDATA[<h2>Ask for Help</h2>
<blockquote>
<p><em>&#8220;Is there a good JS/HTML code editor that will expand to fix the contents?&#8221;</em></p>
</blockquote>
<p>A team is just getting started with putting in a code editor and is currently using ACE.  It doesn&#8217;t seem like there&#8217;s a way to tell it to take up as much height as it needs.  Many suggestions were thrown out, FCK and TinyMCE being two, but none was known to auto size itself.  There is one that no one can remember the name of, but they had fond memories of from the past.</p>
<h2>Interesting Things</h2>
<ul>
<li><a href="http://supermarketstreetsweep.blogspot.com/">Super Market Street Sweep</a> is coming up this weekend.  Ride your bike around SF for a good cause.</li>
</ul>
<h2>Movember Update</h2>
<ul>
<li>Webstash passed the $20k mark that Davis &amp; Sean had been shooting for&#8211;congratulations everyone!  &#40;This does not include Rob&#8217;s generous Mohawk donation&#41;.  SF has raised $323.36 per stash, NY $163.40 and Boulder $210.50.  There&#8217;s still <a href="http://www.movember.com/m/1925160">time to donate</a>.</li>
</ul>
<p>The post <a href="http://pivotallabs.com/sf-11-30-2011-30-days-has-movember/">[SF] 11/30/2011: 30 Days has Movember</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://pivotallabs.com/sf-11-30-2011-30-days-has-movember/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Standup][SF] &#8211; 11/28/2011 &#8211; Post Turkey Edition</title>
		<link>http://pivotallabs.com/standup-sf-11-28-2011-post-turkey-edition/</link>
		<comments>http://pivotallabs.com/standup-sf-11-28-2011-post-turkey-edition/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 16:12:00 +0000</pubDate>
		<dc:creator>Matthew Kocher</dc:creator>
				<category><![CDATA[Standup]]></category>

		<guid isPermaLink="false">http://pivotallabs.com/standup-sf-11-28-2011-post-turkey-edition/</guid>
		<description><![CDATA[<p><h2>Ask for Help</h2>

<blockquote>
    <p><em>Why does my md5 change when the timezone changes?</em></p>
</blockquote>

<p>A pivot found that the tests of MD5 generation fail if the machine is in a different time zone.  While one of the inputs to the hash is the time, he swears up and down that it's integer seconds since the epoch, and is the same on both boxes.</p>

<h2>Interesting Things</h2>

<ul>
<li>Tomorrow is Mo'hawk day at the Pivotal SF Office.  It will be live streamed, with color commentary by our own Davis Frank.  The live stream may be a PPV event, please have a major credit card available.</li>
</ul> <a href="http://pivotallabs.com/standup-sf-11-28-2011-post-turkey-edition/">Continue reading <span class="meta-nav">&#8594;</span></a></p><p>The post <a href="http://pivotallabs.com/standup-sf-11-28-2011-post-turkey-edition/">[Standup][SF] &#8211; 11/28/2011 &#8211; Post Turkey Edition</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></description>
				<content:encoded><![CDATA[<h2>Ask for Help</h2>
<blockquote>
<p><em>Why does my md5 change when the timezone changes?</em></p>
</blockquote>
<p>A pivot found that the tests of MD5 generation fail if the machine is in a different time zone.  While one of the inputs to the hash is the time, he swears up and down that it&#8217;s integer seconds since the epoch, and is the same on both boxes.</p>
<h2>Interesting Things</h2>
<ul>
<li>Tomorrow is Mo&#8217;hawk day at the Pivotal SF Office.  It will be live streamed, with color commentary by our own Davis Frank.  The live stream may be a PPV event, please have a major credit card available.</li>
</ul>
<p>The post <a href="http://pivotallabs.com/standup-sf-11-28-2011-post-turkey-edition/">[Standup][SF] &#8211; 11/28/2011 &#8211; Post Turkey Edition</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://pivotallabs.com/standup-sf-11-28-2011-post-turkey-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apple Orchard &#8211; Turning Chef Recipes into OSX Images</title>
		<link>http://pivotallabs.com/apple-orchard-turning-chef-recipes-into-osx-images/</link>
		<comments>http://pivotallabs.com/apple-orchard-turning-chef-recipes-into-osx-images/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 04:30:00 +0000</pubDate>
		<dc:creator>Matthew Kocher</dc:creator>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[chef]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[osx]]></category>

		<guid isPermaLink="false">http://pivotallabs.com/apple-orchard-turning-chef-recipes-into-osx-images/</guid>
		<description><![CDATA[<p><p>Last week Brian Cunnie posted a great writeup of what we've been working on for building OSX Lion workstations.  Today, I'd like to introduce Apple Orchard - how we transform those chef recipes into ready to use OSX Lion images.</p>

<p>The story starts a few months ago, one morning after Standup while putting our dishes from breakfast away.  Over the past few days we'd been discussing how our ops group would take chef recipes &#40;generated for the most part by developers&#41; and turn them into machine images that they could deploy on a moments notice.  I approached Sean Beckett, our Director of Operations, and told him of my vision:</p>

<p><strong>no manual steps</strong></p>

<p>He looked at me like I was crazy, and he was obviously trying to figure out how to talk me down off the ledge.  I told him how Jenkins could run a job after every checkin &#40;a fact he was well aware of&#41; and how all it had to do was......  He backed away slowly.</p>

<p>A few weeks later, Brian Cunnie had gotten past the Minimum Viable Image release marker in Tracker, and I told him of my vision:</p>

<p><strong>no manual steps</strong></p>

<p>He also looked at me like I was crazy, which he often does.  The next week I had the afternoon to pair with him, and we got to work.  We already had Jenkins building our recipes on a mac mini with Deep Freeze &#40;software which allows you to reboot to a clean state&#41;, so we copied that Jenkins job at got to work.  We got an iMac, and partitioned the disk into two. </p>

<h2><a href="https://github.com/pivotalexperimental/apple_orchard/blob/master/1_reset_machine.rb">Step 1</a></h2>

<p>We boot the image to the persistent side, and image the dynamic side with a "mostly pristine" image that has X Code preinstalled, and has SSH turned on.  We then set the machine to boot from that partition, and reboot.</p>

<h2><a href="https://github.com/pivotalexperimental/apple_orchard/blob/master/2_run_soloist.sh">Step 2</a></h2>

<p>When it comes up, we SSH in, upload an SSH key, clone our public and private cookbooks &#40;our private cookbook is used for our site licenses&#41; and run soloist.  If it succeeds, we move on to step 3.</p>

<h2><a href="https://github.com/pivotalexperimental/apple_orchard/blob/master/3_reboot_to_persistent.rb">Step 3</a></h2>

<p>Reboot the machine to the persistent partition, and wait for it to come up. This isn't part of Step 2 because we want to leave the machine in the dirty state for troubleshooting if the chef run failed, and only trigger this if it succeeds.</p>

<h2><a href="https://github.com/pivotalexperimental/apple_orchard/blob/master/4_take_image.rb">Step 4</a></h2>

<p>Put a script in place that will automatically rename the machine when it first boots, take an image of the partition using diskutils, scan it for restore, and move it over to our Deploy Studio server, and create a symlink so the 'lion HEAD' build points to the newly generated image.</p>

<p>That's it.  We occasionally promote a 'lion HEAD' build to 'lion STABLE', so that we've always got an image on hand that we're confident in.  But the overhead of cutting a new image is now simply changing a symlink.</p>

<p>There are a lot of moving parts, and sometimes it breaks.  With time, it's become more reliable, but still has a lot of external dependencies.  We've recently been trying out a strategy of pre-populating the chef and homebrew caches, which seem to be helping.  Another caveat we've run into is that so far with Lion we've been unable to produce a universal image that will boot both MacBook Airs and iMacs, but we hope this may have changed with the latest 10.7.2 update.  </p>

<p>Many thanks to Brian Cunnie - while I was the reason for this madness, he's done most of the heavy lifting with my occasional help.</p>

<p>It's all open source on github, at <a href="https://github.com/pivotalexperimental/apple_orchard">https://github.com/pivotalexperimental/apple_orchard</a>.  Values for our infrastructure are hard coded, but if you'd like to generalize it and use it, fork and make a pull request.</p> <a href="http://pivotallabs.com/apple-orchard-turning-chef-recipes-into-osx-images/">Continue reading <span class="meta-nav">&#8594;</span></a></p><p>The post <a href="http://pivotallabs.com/apple-orchard-turning-chef-recipes-into-osx-images/">Apple Orchard &#8211; Turning Chef Recipes into OSX Images</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Last week Brian Cunnie posted a great writeup of what we&#8217;ve been working on for building OSX Lion workstations.  Today, I&#8217;d like to introduce Apple Orchard &#8211; how we transform those chef recipes into ready to use OSX Lion images.</p>
<p>The story starts a few months ago, one morning after Standup while putting our dishes from breakfast away.  Over the past few days we&#8217;d been discussing how our ops group would take chef recipes &#40;generated for the most part by developers&#41; and turn them into machine images that they could deploy on a moments notice.  I approached Sean Beckett, our Director of Operations, and told him of my vision:</p>
<p><strong>no manual steps</strong></p>
<p>He looked at me like I was crazy, and he was obviously trying to figure out how to talk me down off the ledge.  I told him how Jenkins could run a job after every checkin &#40;a fact he was well aware of&#41; and how all it had to do was&#8230;&#8230;  He backed away slowly.</p>
<p>A few weeks later, Brian Cunnie had gotten past the Minimum Viable Image release marker in Tracker, and I told him of my vision:</p>
<p><strong>no manual steps</strong></p>
<p>He also looked at me like I was crazy, which he often does.  The next week I had the afternoon to pair with him, and we got to work.  We already had Jenkins building our recipes on a mac mini with Deep Freeze &#40;software which allows you to reboot to a clean state&#41;, so we copied that Jenkins job at got to work.  We got an iMac, and partitioned the disk into two. </p>
<h2><a href="https://github.com/pivotalexperimental/apple_orchard/blob/master/1_reset_machine.rb">Step 1</a></h2>
<p>We boot the image to the persistent side, and image the dynamic side with a &#8220;mostly pristine&#8221; image that has X Code preinstalled, and has SSH turned on.  We then set the machine to boot from that partition, and reboot.</p>
<h2><a href="https://github.com/pivotalexperimental/apple_orchard/blob/master/2_run_soloist.sh">Step 2</a></h2>
<p>When it comes up, we SSH in, upload an SSH key, clone our public and private cookbooks &#40;our private cookbook is used for our site licenses&#41; and run soloist.  If it succeeds, we move on to step 3.</p>
<h2><a href="https://github.com/pivotalexperimental/apple_orchard/blob/master/3_reboot_to_persistent.rb">Step 3</a></h2>
<p>Reboot the machine to the persistent partition, and wait for it to come up. This isn&#8217;t part of Step 2 because we want to leave the machine in the dirty state for troubleshooting if the chef run failed, and only trigger this if it succeeds.</p>
<h2><a href="https://github.com/pivotalexperimental/apple_orchard/blob/master/4_take_image.rb">Step 4</a></h2>
<p>Put a script in place that will automatically rename the machine when it first boots, take an image of the partition using diskutils, scan it for restore, and move it over to our Deploy Studio server, and create a symlink so the &#8216;lion HEAD&#8217; build points to the newly generated image.</p>
<p>That&#8217;s it.  We occasionally promote a &#8216;lion HEAD&#8217; build to &#8216;lion STABLE&#8217;, so that we&#8217;ve always got an image on hand that we&#8217;re confident in.  But the overhead of cutting a new image is now simply changing a symlink.</p>
<p>There are a lot of moving parts, and sometimes it breaks.  With time, it&#8217;s become more reliable, but still has a lot of external dependencies.  We&#8217;ve recently been trying out a strategy of pre-populating the chef and homebrew caches, which seem to be helping.  Another caveat we&#8217;ve run into is that so far with Lion we&#8217;ve been unable to produce a universal image that will boot both MacBook Airs and iMacs, but we hope this may have changed with the latest 10.7.2 update.  </p>
<p>Many thanks to Brian Cunnie &#8211; while I was the reason for this madness, he&#8217;s done most of the heavy lifting with my occasional help.</p>
<p>It&#8217;s all open source on github, at <a href="https://github.com/pivotalexperimental/apple_orchard">https://github.com/pivotalexperimental/apple_orchard</a>.  Values for our infrastructure are hard coded, but if you&#8217;d like to generalize it and use it, fork and make a pull request.</p>
<p>The post <a href="http://pivotallabs.com/apple-orchard-turning-chef-recipes-into-osx-images/">Apple Orchard &#8211; Turning Chef Recipes into OSX Images</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://pivotallabs.com/apple-orchard-turning-chef-recipes-into-osx-images/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Standup 6/28/2011 &#8211; At least it&#8217;s pretty inside the walled garden</title>
		<link>http://pivotallabs.com/standup-6-28-2011-at-least-it-s-pretty-inside-the-walled-garden/</link>
		<comments>http://pivotallabs.com/standup-6-28-2011-at-least-it-s-pretty-inside-the-walled-garden/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 14:18:00 +0000</pubDate>
		<dc:creator>Matthew Kocher</dc:creator>
				<category><![CDATA[Standup]]></category>

		<guid isPermaLink="false">http://pivotallabs.com/standup-6-28-2011-at-least-it-s-pretty-inside-the-walled-garden/</guid>
		<description><![CDATA[<p><h2>Interesting</h2>

<ol>
<li><p>The the Riak Client gem uses nethttp by default.  While it allows you to specify a timeout for a map reduce job, it doesn't set the nethttp timeout for the connection to riak.  This means that all requests are effectively limited to 60 seconds. The project that discovered this is switching to curb.</p></li>
<li><p>The Mac App Store is actively hostile to business users.  There is no way for us to buy software through the app store without setting up a separate account for every three computers, and then you can only reuse a credit card for three accounts.  We won't be purchasing any software through the app store that isn't absolutely necessary until there's a way to purchase N licenses and use those on N machines.  Pixelmator is the first app to lose our business.</p></li>
</ol> <a href="http://pivotallabs.com/standup-6-28-2011-at-least-it-s-pretty-inside-the-walled-garden/">Continue reading <span class="meta-nav">&#8594;</span></a></p><p>The post <a href="http://pivotallabs.com/standup-6-28-2011-at-least-it-s-pretty-inside-the-walled-garden/">Standup 6/28/2011 &#8211; At least it&#8217;s pretty inside the walled garden</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></description>
				<content:encoded><![CDATA[<h2>Interesting</h2>
<ol>
<li>
<p>The the Riak Client gem uses nethttp by default.  While it allows you to specify a timeout for a map reduce job, it doesn&#8217;t set the nethttp timeout for the connection to riak.  This means that all requests are effectively limited to 60 seconds. The project that discovered this is switching to curb.</p>
</li>
<li>
<p>The Mac App Store is actively hostile to business users.  There is no way for us to buy software through the app store without setting up a separate account for every three computers, and then you can only reuse a credit card for three accounts.  We won&#8217;t be purchasing any software through the app store that isn&#8217;t absolutely necessary until there&#8217;s a way to purchase N licenses and use those on N machines.  Pixelmator is the first app to lose our business.</p>
</li>
</ol>
<p>The post <a href="http://pivotallabs.com/standup-6-28-2011-at-least-it-s-pretty-inside-the-walled-garden/">Standup 6/28/2011 &#8211; At least it&#8217;s pretty inside the walled garden</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://pivotallabs.com/standup-6-28-2011-at-least-it-s-pretty-inside-the-walled-garden/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Velocity and Devopsdays Roundup</title>
		<link>http://pivotallabs.com/velocity-and-devopsdays-roundup/</link>
		<comments>http://pivotallabs.com/velocity-and-devopsdays-roundup/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 05:22:00 +0000</pubDate>
		<dc:creator>Matthew Kocher</dc:creator>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[devops]]></category>

		<guid isPermaLink="false">http://pivotallabs.com/velocity-and-devopsdays-roundup/</guid>
		<description><![CDATA[<p><p>I spent a large part of this week at Velocity and Devopsdays.  I met a lot of great people and heard way more interesting things than I could absorb.  Here's a collection of things &#40;in no particular order&#41; I found interesting.</p>

<ul>
<li><p><a href="http://www.livestream.com/oreillyconfs/video?clipId=pla_3beec3a2-54f5-4a19-8aaf-35a839b6ecaa">Get a #&#38;%*&#38;#$##%#% SSD Already</a></p></li>
<li><p><a href="http://jsfiddle.net/">JSFiddle</a> is a gist-list site for sharing HTML/CSS/JS snippets.  Looks to be a great way to share useful examples and problems.  jQuery uses it for bug reports.</p></li>
<li><p>Dyn's <a href="http://dyn.com/enterprise-dns/dynect-platform">DynECT</a> seemed to be the standard answer for how to distribute load to different datacenters for load balancing and geo-targetting.  There is no standard answer to defeating the <a href="http://en.wikipedia.org/wiki/CAP_theorem">CAP theorem</a>.</p></li>
<li><p>There's a huge movement to rebuild Splunk in various open source projects.  <a href="http://logstash.net/">Logstash</a> is an open source project which is piecing together various open source components to get something similar, but is doing index time extraction instead of search time extraction and hasn't gotten to graphing or analysis yet.  Etsy is using Graphite extensively for metrics collection and say that developers prefer it to Splunk.  Various other companies are building app-level only metrics collection/reporting solutions.  The consensus in the devops community is that Splunk's pricing does work for the web.  As a fan of Splunk, I hope they can figure this out as it's still better than anything I've seen.</p></li>
<li><p>Etsy's work with metrics collection is interesting - they've written <a href="https://github.com/etsy/statsd">statsD</a> for aggregating things before sending to graphite and <a href="https://github.com/etsy/logster">Logster</a> for tailing logs and making graphite events out of them.</p></li>
<li><p>Joshua Timberman of Opscode has some <a href="http://www.slideshare.net/jtimberman/mwrc2011-cookbook-design-patterns">great slides on how to write a Chef cookbook</a> and I wish I'd gotten to see the talk at Devopsdays.  I tend to think they error on the side of premature extraction for reusability, but I see their point of view.  I'll definitely be using the remote_file resource and the file_cache_path.</p></li>
<li><p>2011 is shaping up to be the year of the Zookeeper alternatives.  If you're not familiar, <a href="http://zookeeper.apache.org/">Zookeeper</a> is a reimplementation of Google's <a href="http://labs.google.com/papers/chubby.html">Chubby</a> - a highly available and reliable system designed to be the system of record for where services are currently available.  Netflix has their own internal solution.  Heroku has <a href="https://github.com/ha/doozerd">Doozer</a>, and <a href="https://github.com/lusis/Noah">Noah</a> is the new kid on the block with a simple rest interface and http callbacks&#40;aka: webhooks&#41;.  Opscode is also trying to answer this need by querying the Chef server at runtime for the identities of other hosts on the network.  As environments and servers becoming ephemeral, telling every server about every server gets to be a tedious liability.  It'll be interesting to see where this goes.</p></li>
<li><p><a href="http://rundeck.org/">Run Deck</a> &#40;aside from having a great logo&#41; seems to be an interesting way to give users limitable, auditable, and repeatable access to server shells.  It's a web interface that lets you execute commands on various configurable subsets of your infrastructure.  It's got plugins so it can grab the current instances out of EC2, and a jenkins plugin so a Jenkins build can trigger a job in Run Deck.  I'll definitely be checking it out when I get a chance.</p></li>
<li><p>Pipe Viewer - &#40;pv&#41; Looks awesome.  You can put it in a series of pipes in a shell, and it'll print out a nice status bar about the amount of data passing through the pipe.  'brew install pv'</p></li>
<li><p>Opscode has a "fat" installer of chef coming out.  It goes in /opt/opscode and includes all the dependencies in the package.  This should answer a common complaint about having to install ruby to install ruby.  &#40;Yo, dawg, I heard you like Ruby&#41;</p></li>
<li><p><a href="https://github.com/stubbornella/csslint">CSS Lint</a> - Nicole Sullivan and Nicholas Zakas teamed up and introduced CSSLint at Velocity, which looks like it'll a good addition to a lot of test suites.  Nicole also mentioned some cool <a href="http://www.zurb.com/article/266/super-awesome-buttons-with-css3-and-rgba">pure CSS buttons</a> that work on dark and light backgrounds.  Lea Verou's <a href="http://leaverou.me/2010/12/checkered-stripes-other-background-patterns-with-css3-gradients/">pure css backgrounds</a> were mentioned, which went around the office a while ago but are worth a link.  It was also news to me that CSS selectors are run left to right by a browser - "ul.foo span.special *" will match all tags on the page, then narrow it down.</p></li>
<li><p><a href="http://martinfowler.com/bliki/BlueGreenDeployment.html">Blue/Green Deployment</a> is all the rage the days, and for good reason.  Netflix and Amazon are both using it.  You'll have to decide how it fits with your data storage layer, but it's worked well for me in the past and I'm glad to see it gaining popularity.</p></li>
</ul> <a href="http://pivotallabs.com/velocity-and-devopsdays-roundup/">Continue reading <span class="meta-nav">&#8594;</span></a></p><p>The post <a href="http://pivotallabs.com/velocity-and-devopsdays-roundup/">Velocity and Devopsdays Roundup</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I spent a large part of this week at Velocity and Devopsdays.  I met a lot of great people and heard way more interesting things than I could absorb.  Here&#8217;s a collection of things &#40;in no particular order&#41; I found interesting.</p>
<ul>
<li>
<p><a href="http://www.livestream.com/oreillyconfs/video?clipId=pla_3beec3a2-54f5-4a19-8aaf-35a839b6ecaa">Get a #&amp;%*&amp;#$##%#% SSD Already</a></p>
</li>
<li>
<p><a href="http://jsfiddle.net/">JSFiddle</a> is a gist-list site for sharing HTML/CSS/JS snippets.  Looks to be a great way to share useful examples and problems.  jQuery uses it for bug reports.</p>
</li>
<li>
<p>Dyn&#8217;s <a href="http://dyn.com/enterprise-dns/dynect-platform">DynECT</a> seemed to be the standard answer for how to distribute load to different datacenters for load balancing and geo-targetting.  There is no standard answer to defeating the <a href="http://en.wikipedia.org/wiki/CAP_theorem">CAP theorem</a>.</p>
</li>
<li>
<p>There&#8217;s a huge movement to rebuild Splunk in various open source projects.  <a href="http://logstash.net/">Logstash</a> is an open source project which is piecing together various open source components to get something similar, but is doing index time extraction instead of search time extraction and hasn&#8217;t gotten to graphing or analysis yet.  Etsy is using Graphite extensively for metrics collection and say that developers prefer it to Splunk.  Various other companies are building app-level only metrics collection/reporting solutions.  The consensus in the devops community is that Splunk&#8217;s pricing does work for the web.  As a fan of Splunk, I hope they can figure this out as it&#8217;s still better than anything I&#8217;ve seen.</p>
</li>
<li>
<p>Etsy&#8217;s work with metrics collection is interesting &#8211; they&#8217;ve written <a href="https://github.com/etsy/statsd">statsD</a> for aggregating things before sending to graphite and <a href="https://github.com/etsy/logster">Logster</a> for tailing logs and making graphite events out of them.</p>
</li>
<li>
<p>Joshua Timberman of Opscode has some <a href="http://www.slideshare.net/jtimberman/mwrc2011-cookbook-design-patterns">great slides on how to write a Chef cookbook</a> and I wish I&#8217;d gotten to see the talk at Devopsdays.  I tend to think they error on the side of premature extraction for reusability, but I see their point of view.  I&#8217;ll definitely be using the remote_file resource and the file_cache_path.</p>
</li>
<li>
<p>2011 is shaping up to be the year of the Zookeeper alternatives.  If you&#8217;re not familiar, <a href="http://zookeeper.apache.org/">Zookeeper</a> is a reimplementation of Google&#8217;s <a href="http://labs.google.com/papers/chubby.html">Chubby</a> &#8211; a highly available and reliable system designed to be the system of record for where services are currently available.  Netflix has their own internal solution.  Heroku has <a href="https://github.com/ha/doozerd">Doozer</a>, and <a href="https://github.com/lusis/Noah">Noah</a> is the new kid on the block with a simple rest interface and http callbacks&#40;aka: webhooks&#41;.  Opscode is also trying to answer this need by querying the Chef server at runtime for the identities of other hosts on the network.  As environments and servers becoming ephemeral, telling every server about every server gets to be a tedious liability.  It&#8217;ll be interesting to see where this goes.</p>
</li>
<li>
<p><a href="http://rundeck.org/">Run Deck</a> &#40;aside from having a great logo&#41; seems to be an interesting way to give users limitable, auditable, and repeatable access to server shells.  It&#8217;s a web interface that lets you execute commands on various configurable subsets of your infrastructure.  It&#8217;s got plugins so it can grab the current instances out of EC2, and a jenkins plugin so a Jenkins build can trigger a job in Run Deck.  I&#8217;ll definitely be checking it out when I get a chance.</p>
</li>
<li>
<p>Pipe Viewer &#8211; &#40;pv&#41; Looks awesome.  You can put it in a series of pipes in a shell, and it&#8217;ll print out a nice status bar about the amount of data passing through the pipe.  &#8216;brew install pv&#8217;</p>
</li>
<li>
<p>Opscode has a &#8220;fat&#8221; installer of chef coming out.  It goes in /opt/opscode and includes all the dependencies in the package.  This should answer a common complaint about having to install ruby to install ruby.  &#40;Yo, dawg, I heard you like Ruby&#41;</p>
</li>
<li>
<p><a href="https://github.com/stubbornella/csslint">CSS Lint</a> &#8211; Nicole Sullivan and Nicholas Zakas teamed up and introduced CSSLint at Velocity, which looks like it&#8217;ll a good addition to a lot of test suites.  Nicole also mentioned some cool <a href="http://www.zurb.com/article/266/super-awesome-buttons-with-css3-and-rgba">pure CSS buttons</a> that work on dark and light backgrounds.  Lea Verou&#8217;s <a href="http://leaverou.me/2010/12/checkered-stripes-other-background-patterns-with-css3-gradients/">pure css backgrounds</a> were mentioned, which went around the office a while ago but are worth a link.  It was also news to me that CSS selectors are run left to right by a browser &#8211; &#8220;ul.foo span.special *&#8221; will match all tags on the page, then narrow it down.</p>
</li>
<li>
<p><a href="http://martinfowler.com/bliki/BlueGreenDeployment.html">Blue/Green Deployment</a> is all the rage the days, and for good reason.  Netflix and Amazon are both using it.  You&#8217;ll have to decide how it fits with your data storage layer, but it&#8217;s worked well for me in the past and I&#8217;m glad to see it gaining popularity.</p>
</li>
</ul>
<p>The post <a href="http://pivotallabs.com/velocity-and-devopsdays-roundup/">Velocity and Devopsdays Roundup</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://pivotallabs.com/velocity-and-devopsdays-roundup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Guiderails: our Rails 3 templates</title>
		<link>http://pivotallabs.com/guiderails-our-rails-3-templates/</link>
		<comments>http://pivotallabs.com/guiderails-our-rails-3-templates/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 15:52:00 +0000</pubDate>
		<dc:creator>Matthew Kocher</dc:creator>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[guiderails]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://pivotallabs.com/guiderails-our-rails-3-templates/</guid>
		<description><![CDATA[<p><p>One of our goals for the first day a project starts at Pivotal is to deliver something the customer can see working.  One of the ways we accomplish this is making sure getting up and running with all of our &#40;more&#41; reasonable defaults only takes a few minutes.  We've been using <a href="https://github.com/pivotal/guiderails">guiderails</a> for this internally for a while now, and soft launched it last week.  I'm happy to give a full introduction today.</p>

<p>Currently Guiderails supports choosing:</p>

<ul>
<li>Mysql or Postgres</li>
<li>RR or Mocha</li>
<li>Webrat with Saucelabs support</li>
<li>Cucumber with Capybara &#40;no suacelabs support&#41;</li>
<li>SASS &#40;with HAML&#41;</li>
</ul>

<p>And includes by default:</p>

<ul>
<li>A ci_build.sh script for running your project in CI.</li>
<li>A local git repo</li>
<li>An rvmrc</li>
<li>Bundler, auto-tagger, JSON, Heroku, rspec-rails, Jasmine, and Headless gems &#40;in the global or development groups&#41;</li>
<li>Jasmine initialized for JavaScript testing</li>
<li>Respec installed</li>
<li>Some testing related rake tasks</li>
</ul>

<p>For more details, check it out on github at <a href="https://github.com/pivotal/guiderails">https://github.com/pivotal/guiderails</a>.</p>

<p>Guiderails is a great way to get going quickly on a project.  Many thanks to the Pivots that contributed.</p> <a href="http://pivotallabs.com/guiderails-our-rails-3-templates/">Continue reading <span class="meta-nav">&#8594;</span></a></p><p>The post <a href="http://pivotallabs.com/guiderails-our-rails-3-templates/">Guiderails: our Rails 3 templates</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>One of our goals for the first day a project starts at Pivotal is to deliver something the customer can see working.  One of the ways we accomplish this is making sure getting up and running with all of our &#40;more&#41; reasonable defaults only takes a few minutes.  We&#8217;ve been using <a href="https://github.com/pivotal/guiderails">guiderails</a> for this internally for a while now, and soft launched it last week.  I&#8217;m happy to give a full introduction today.</p>
<p>Currently Guiderails supports choosing:</p>
<ul>
<li>Mysql or Postgres</li>
<li>RR or Mocha</li>
<li>Webrat with Saucelabs support</li>
<li>Cucumber with Capybara &#40;no suacelabs support&#41;</li>
<li>SASS &#40;with HAML&#41;</li>
</ul>
<p>And includes by default:</p>
<ul>
<li>A ci_build.sh script for running your project in CI.</li>
<li>A local git repo</li>
<li>An rvmrc</li>
<li>Bundler, auto-tagger, JSON, Heroku, rspec-rails, Jasmine, and Headless gems &#40;in the global or development groups&#41;</li>
<li>Jasmine initialized for JavaScript testing</li>
<li>Respec installed</li>
<li>Some testing related rake tasks</li>
</ul>
<p>For more details, check it out on github at <a href="https://github.com/pivotal/guiderails">https://github.com/pivotal/guiderails</a>.</p>
<p>Guiderails is a great way to get going quickly on a project.  Many thanks to the Pivots that contributed.</p>
<p>The post <a href="http://pivotallabs.com/guiderails-our-rails-3-templates/">Guiderails: our Rails 3 templates</a> appeared first on <a href="http://pivotallabs.com">Pivotal Labs</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://pivotallabs.com/guiderails-our-rails-3-templates/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic (Feed is rejected)
Page Caching using apc
Database Caching using apc
Object Caching 1125/1215 objects using apc

 Served from: pivotallabs.com @ 2013-05-22 15:36:18 by W3 Total Cache -->