<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Seth Vargo</title>
  <subtitle>Engineering, software, security, and advocacy</subtitle>
  <icon>https://www.sethvargo.com/assets/images/seth-vargo-1000x1000.jpg</icon>
  <id>https://www.sethvargo.com/</id>
  <link href="https://www.sethvargo.com"/>
  <link href="https://www.sethvargo.com/feed.xml" rel="self"/>
  <updated>2023-07-28T00:00:00+00:00</updated>
  <rights>Copyright 2025 Seth Vargo</rights>
  <author>
    <name>Seth Vargo</name>
  </author>
  <entry>
    <title>
      <![CDATA[Things I'm excited for in Go 1.21]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/things-im-excited-for-in-go-1-21/"/>
    <content type="text/html" src="https://www.sethvargo.com/things-im-excited-for-in-go-1-21/"/>
    <id>https://www.sethvargo.com/things-im-excited-for-in-go-1-21/</id>
    <published>2023-07-28T00:00:00+00:00</published>
    <updated>2023-07-28T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Go 1.21 has some awesome changes that improve the overall developer experience and enhance performance. There's also some great new packages and functions to streamline common operations, and even a new opt-in experiment to fix a common bug. This article highlights my favorite changes in Go 1.21.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[What I'd like to see in Go 2.0 (July 2023 update)]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/what-id-like-to-see-in-go-2/"/>
    <content type="text/html" src="https://www.sethvargo.com/what-id-like-to-see-in-go-2/"/>
    <id>https://www.sethvargo.com/what-id-like-to-see-in-go-2/</id>
    <published>2023-07-17T00:00:00+00:00</published>
    <updated>2023-07-17T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Go is one of my favorite programming languages, but it is still far from
perfect. Over the past 10 years, I have used Go to both build small side
projects and large scale applications. While the language has evolved
significantly from its original release in 2009, this post highlights some of
the areas where I think Go still has room for improvement.
Before we get started, I want to be absolutely clear: I am NOT criticizing
individual humans or their contributions. My only intent is to try and ma...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Turn reactive audit logs into proactive alerts]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/turn-reactive-audit-logs-into-proactive-alerts/"/>
    <content type="text/html" src="https://www.sethvargo.com/turn-reactive-audit-logs-into-proactive-alerts/"/>
    <id>https://www.sethvargo.com/turn-reactive-audit-logs-into-proactive-alerts/</id>
    <published>2021-04-29T00:00:00+00:00</published>
    <updated>2021-04-29T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Security engineering is an ever-evolving space. While prevention and planning are still very important, we also need to invest in detection and response. Audit logs (timestamped records that capture the entity that performed an action in a system) are very useful for retroactive analysis following a security incident, but what if they could also be used to proactively alert before a security incident occurs?]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Cancelling Sirius XM Radio]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/cancelling-sirius-xm-radio/"/>
    <content type="text/html" src="https://www.sethvargo.com/cancelling-sirius-xm-radio/"/>
    <id>https://www.sethvargo.com/cancelling-sirius-xm-radio/</id>
    <published>2020-10-28T00:00:00+00:00</published>
    <updated>2020-10-28T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[I tried to cancel my Sirius XM Satellite radio that came included with my car
purchase today. They automatically start billing after the trial ends. After
muddling through their website, I found the only way to cancel the subscription
is via chat or phone. I opted for chat, here's the transcript:
Sam (17:45:38 GMT): Thank you for your patience! My name is Sam and
I'm here tohelp you now. I see you're looking to cancel your
subscription. May I know the reason of the cancellation please? I
hope you...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Rotating Google-managed SSL certificates with zero downtime]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/zero-downtime-rotation-for-google-managed-ssl-certificates/"/>
    <content type="text/html" src="https://www.sethvargo.com/zero-downtime-rotation-for-google-managed-ssl-certificates/"/>
    <id>https://www.sethvargo.com/zero-downtime-rotation-for-google-managed-ssl-certificates/</id>
    <published>2020-10-07T00:00:00+00:00</published>
    <updated>2020-10-07T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Google-managed SSL certificates are TLS certificates that Google Cloud obtains
and manages for your domains, renewing them automatically. These are Domain
Validation (DV) certificates which support multiple hostnames (via SNI) in each
certificate. The process is conceptually similar to Let's
Encrypt.
Suppose I have a website like example.com that's using Google-managed SSL certificates on a Google Cloud Load Balancer, following these steps.
Now suppose I want to add another domain, example.co, to...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Managing Secret Manager with Terraform]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/managing-google-secret-manager-secrets-with-terraform/"/>
    <content type="text/html" src="https://www.sethvargo.com/managing-google-secret-manager-secrets-with-terraform/"/>
    <id>https://www.sethvargo.com/managing-google-secret-manager-secrets-with-terraform/</id>
    <published>2020-02-18T00:00:00+00:00</published>
    <updated>2020-02-18T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Terraform is a popular tool for managing infrastructure configurations as code, but what if your infrastructure needs to create or delete secrets like API keys or credentials? Google Secret Manager is a Google Cloud service that stores API keys, passwords, certificates, and other sensitive data. It provides convenience while improving security. This post explores how to manage Secret Manager secrets with Terraform.
The full sample code for this post is available on GitHub.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Accessing Secret Manager from Terraform]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/accessing-google-secret-manager-secrets-from-terraform/"/>
    <content type="text/html" src="https://www.sethvargo.com/accessing-google-secret-manager-secrets-from-terraform/"/>
    <id>https://www.sethvargo.com/accessing-google-secret-manager-secrets-from-terraform/</id>
    <published>2020-02-17T00:00:00+00:00</published>
    <updated>2020-02-17T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Terraform is a popular tool for managing infrastructure configurations as code, but what if your infrastructure needs secrets like API keys or credentials? Google Secret Manager is a Google Cloud service that stores API keys, passwords, certificates, and other sensitive data. It provides convenience while improving security. This post explores how to access Secret Manager secrets from Terraform.
The full sample code for this post is available on GitHub.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Using google-java-format with VS Code]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/using-google-java-format-with-vs-code/"/>
    <content type="text/html" src="https://www.sethvargo.com/using-google-java-format-with-vs-code/"/>
    <id>https://www.sethvargo.com/using-google-java-format-with-vs-code/</id>
    <published>2020-01-12T00:00:00+00:00</published>
    <updated>2020-01-12T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[I have been doing some Java development recently, and my preferred editors of choice bounce between Visual Studio Code and Neovim. My vim setup is configured to format Java source files using google-java-format, but I was struggling to achieve the same behavior in Visual Studio Code. This post explores how to format Java source files using google-java-format in VS Code.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Writing GitHub Actions in Go]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/writing-github-actions-in-go/"/>
    <content type="text/html" src="https://www.sethvargo.com/writing-github-actions-in-go/"/>
    <id>https://www.sethvargo.com/writing-github-actions-in-go/</id>
    <published>2020-01-08T00:00:00+00:00</published>
    <updated>2020-01-08T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[I was part of the GitHub Actions beta and have used GitHub Actions to run tests, close stale issues, and automate formerly-manual tasks in my repositories. Over the holiday break, I explored authoring GitHub Actions in languages other than Node.js. This post explores how to write and publish GitHub Actions written in Go, but the principles are largely applicable to any language since the deliverable is a Docker container.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Configuring Cloud Run with Terraform]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/configuring-cloud-run-with-terraform/"/>
    <content type="text/html" src="https://www.sethvargo.com/configuring-cloud-run-with-terraform/"/>
    <id>https://www.sethvargo.com/configuring-cloud-run-with-terraform/</id>
    <published>2019-12-04T00:00:00+00:00</published>
    <updated>2019-12-04T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Terraform is a popular tool for managing infrastructure configurations as code, but what if that infrastructure is serverless? Google's Cloud Run is a fully-managed serverless offering that leverages the power and flexibility of containers as a deployment primitive. This post explores how to setup and configure a Cloud Run service using Terraform.
The full sample code for this post is available on GitHub.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Secrets in Serverless]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/secrets-in-serverless/"/>
    <content type="text/html" src="https://www.sethvargo.com/secrets-in-serverless/"/>
    <id>https://www.sethvargo.com/secrets-in-serverless/</id>
    <published>2018-09-30T00:00:00+00:00</published>
    <updated>2018-09-30T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Serverless applications and cloud functions often need to communicate with an upstream API or service. Perhaps they require a username and password to connect to a database, an API key to talk to an upstream service, or a certificate to authenticate to an API. This raises questions like: How do I manage secrets in serverless environments? How do I get credentials into my serverless lambda or cloud function? How can I use secrets AWS Lambda or Google Cloud Functions?
This post describes common pat...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Seth's 10 Commandments of Air Travel]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/seths-10-commandments-of-air-travel/"/>
    <content type="text/html" src="https://www.sethvargo.com/seths-10-commandments-of-air-travel/"/>
    <id>https://www.sethvargo.com/seths-10-commandments-of-air-travel/</id>
    <published>2018-06-21T00:00:00+00:00</published>
    <updated>2018-06-21T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[I travel a lot. I spend a lot of nights in hotel rooms, a lot of miles in rental cars, and, mostly importantly, a lot of time on airplanes. As I approach my millionth mile this year, it feels appropriate to compile my 10 commandments of air travel.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Dropbox Hasn't Learned their Lesson]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/dropbox-hasnt-learned-their-lession/"/>
    <content type="text/html" src="https://www.sethvargo.com/dropbox-hasnt-learned-their-lession/"/>
    <id>https://www.sethvargo.com/dropbox-hasnt-learned-their-lession/</id>
    <published>2016-09-30T00:00:00+00:00</published>
    <updated>2016-09-30T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[You would think less than a month after a very popular HackerNews article on
how Dropbox Hacks Your Mac, the
file sharing company would be careful about the activities they are performing
in their software distribution. Nope, not Dropbox. Today they released an update
that adds a hacky overlay UI element to finder that cannot be disabled!
Like most security-conscious folks, I disabled the Dropbox finder integration
and revoked all the privileges the software requested. I did a full uninstall
and ...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Changing Mac OS X Application Icons Programmatically]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/replace-icons-osx/"/>
    <content type="text/html" src="https://www.sethvargo.com/replace-icons-osx/"/>
    <id>https://www.sethvargo.com/replace-icons-osx/</id>
    <published>2016-09-15T00:00:00+00:00</published>
    <updated>2016-09-15T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Mac OS X is notorious for being beautiful. Every vertical and horizontal line is
just perfect... until you have that one application's icon which sticks out like
a sore thumb. Obviously everyone has different aesthetic preferences, and this
is not meant to hurt anyone's feelings.
It has always been possible to replace these icons by hand. The steps generally
go like this:]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[RSpec Example Filtering for Multiple Version Testing]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/rspec-example-filtering-for-multiple-version-testing/"/>
    <content type="text/html" src="https://www.sethvargo.com/rspec-example-filtering-for-multiple-version-testing/"/>
    <id>https://www.sethvargo.com/rspec-example-filtering-for-multiple-version-testing/</id>
    <published>2016-08-29T00:00:00+00:00</published>
    <updated>2016-08-29T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Authoring a client library for an upstream service is often challenging, but testing and preventing regressions against upstream API changes is sometimes impossible. This post discusses using RSpec example metadata filtering as a way to test against different client libraries on Travis CI.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Carnegie Mellon, Mental Illness, and Suicide]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/cmu-mental-illness-and-suicide/"/>
    <content type="text/html" src="https://www.sethvargo.com/cmu-mental-illness-and-suicide/"/>
    <id>https://www.sethvargo.com/cmu-mental-illness-and-suicide/</id>
    <published>2016-03-31T00:00:00+00:00</published>
    <updated>2016-03-31T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[On Sunday, March 27, Elliot Glasgow was reported missing. Elliot was a first-year undergraduate at Carnegie Mellon University. There was a frantic push on social media by parents, professors, students, and alumni to try to find him. A graduate student, Rajat Patra, was also missing for some time. Sadly both individuals were later found dead. While these events appear to be unrelated, they have left the Carnegie Mellon community in turmoil. I want to take a moment to share my thoughts.
First and f...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Faster Rails Development with Vagrant]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/faster-rails-development-with-vagrant/"/>
    <content type="text/html" src="https://www.sethvargo.com/faster-rails-development-with-vagrant/"/>
    <id>https://www.sethvargo.com/faster-rails-development-with-vagrant/</id>
    <published>2014-12-29T00:00:00+00:00</published>
    <updated>2014-12-29T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Vagrant is an excellent tool for Rails development - you do not need to worry about installing dependencies, damaging your local workstation, or disparity between different machines and operating systems. You can quickly scale the size and shape of the virtual machine on and as-needed basis, and in a worst-case scenario you can destroy everything and start from a blank slate. However, virtual machines often come with a bit of a performance cost. In this post, I will detail some of the tips and tr...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[The 10 Myths of DevOps]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/the-ten-myths-of-devops/"/>
    <content type="text/html" src="https://www.sethvargo.com/the-ten-myths-of-devops/"/>
    <id>https://www.sethvargo.com/the-ten-myths-of-devops/</id>
    <published>2014-12-23T00:00:00+00:00</published>
    <updated>2014-12-23T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Although not officially coined until 2009, DevOps ideals have been explicitly discussed since at least 2006. Recently, however, the term "DevOps" has gained increasing popularity across a variety of fields and industries. DevOps is not a development methodology or technology; DevOps is an ideology. It is a way to facilitate organizational prosperity and growth while increasing each individual employee's happiness along the way. As DevOps has gained in prominence, a gap has been created between th...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Getting an A+ on Qualy's SSL Labs Tester]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/getting-an-a-plus-on-qualys-ssl-labs-tester/"/>
    <content type="text/html" src="https://www.sethvargo.com/getting-an-a-plus-on-qualys-ssl-labs-tester/"/>
    <id>https://www.sethvargo.com/getting-an-a-plus-on-qualys-ssl-labs-tester/</id>
    <published>2014-12-14T00:00:00+00:00</published>
    <updated>2014-12-14T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[I recently spent a few hours trying to get a perfect score on
Qualy's SSL Labs Tester. While I was not
able to achieve a "100" in every category, I feel I got pretty close:]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Show full website address in OSX Yosemite]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/show-full-website-address-osx-yosemite/"/>
    <content type="text/html" src="https://www.sethvargo.com/show-full-website-address-osx-yosemite/"/>
    <id>https://www.sethvargo.com/show-full-website-address-osx-yosemite/</id>
    <published>2014-10-17T00:00:00+00:00</published>
    <updated>2014-10-17T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[If you recently upgraded to Apple's OSX Yosemite, you may notice Safari only shows the "root" URL portion of a web address:]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Leaving Chef]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/leaving-chef/"/>
    <content type="text/html" src="https://www.sethvargo.com/leaving-chef/"/>
    <id>https://www.sethvargo.com/leaving-chef/</id>
    <published>2014-08-27T00:00:00+00:00</published>
    <updated>2014-08-27T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[I am leaving Chef.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[The Cleanroom Pattern in Ruby]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/the-cleanroom-pattern/"/>
    <content type="text/html" src="https://www.sethvargo.com/the-cleanroom-pattern/"/>
    <id>https://www.sethvargo.com/the-cleanroom-pattern/</id>
    <published>2014-08-26T00:00:00+00:00</published>
    <updated>2014-08-26T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[I recently gave a talk at Philly.rb, the Ruby meetup in Philadelphia, PA entitled "The Cleanroom Pattern - More safely evaluating DSLs with Ruby". You can watch the full Cleanroom DSL video online, but I decided to also write the contents of the talk into a blog post.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Checkout a GitHub Pull Request]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/checkout-a-github-pull-request/"/>
    <content type="text/html" src="https://www.sethvargo.com/checkout-a-github-pull-request/"/>
    <id>https://www.sethvargo.com/checkout-a-github-pull-request/</id>
    <published>2014-08-25T00:00:00+00:00</published>
    <updated>2014-08-25T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[If you work with a lot of open source projects, you may find a need to modify a GitHub Pull Request before merging to the master branch. This may be because you need to rebase, fix a failing test, or resolve a merge conflict caused by an upstream change.
If you have used the hub gem before, you are probably familiar with the following code:
$ hub checkout https://github.com/sethvargo/chefspec/pull/1 custom-branch
But hub has some drawbacks, mainly that it is "yet another thing" you need to instal...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Focus the address bar with command (⌘) + L]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/focus-the-address-bar-with-command-l/"/>
    <content type="text/html" src="https://www.sethvargo.com/focus-the-address-bar-with-command-l/"/>
    <id>https://www.sethvargo.com/focus-the-address-bar-with-command-l/</id>
    <published>2014-08-14T00:00:00+00:00</published>
    <updated>2014-08-14T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[The other day I found a fantasitc keyboard shortcut that has increased my productivity ten-fold. Working primarily on the keyboard, I find switching context to the mouse (or trackpad) an added distraction. Not only do my fingers and wrist need to context switch, but my brian also needs to think visually instead of conceptually...
Since I spend the majority of my day on the Internet, I am a heavy user of keyboard shortcuts. One of my biggest pet peeves has been moving the mouse onto the address ba...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Chef 12 drops support for Ruby 1.8]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/chef-12-drops-support-for-ruby-18/"/>
    <content type="text/html" src="https://www.sethvargo.com/chef-12-drops-support-for-ruby-18/"/>
    <id>https://www.sethvargo.com/chef-12-drops-support-for-ruby-18/</id>
    <published>2014-08-11T00:00:00+00:00</published>
    <updated>2014-08-11T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Chef has long supported Ruby 1.8.7 and REE, even beyond the announced EOL periods from the Ruby maintainers. The continued support for Ruby 1.8 has been a burden for cookbook developers who want to use the "new" Ruby 1.9 features, but must retain support for Ruby 1.8. Chef 12 has officially dropped support for Ruby 1.8!
As of opscode/chef@cf6ac3, Chef no longer supports the Ruby 1.8. This is an exciting advancement in the Chef ecosystem and hopefully increases the level of awesome!
It is worth no...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Prevent authentication timeouts during long Chef runs]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/prevent-authentication-timeouts-during-long-chef-runs/"/>
    <content type="text/html" src="https://www.sethvargo.com/prevent-authentication-timeouts-during-long-chef-runs/"/>
    <id>https://www.sethvargo.com/prevent-authentication-timeouts-during-long-chef-runs/</id>
    <published>2014-08-07T00:00:00+00:00</published>
    <updated>2014-08-07T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[If you have ever had a Chef Client run fail with a mysterious "Authentication Failed" error after a few minutes of execution, then this post is for you! Because of the way the Chef Client loads resources, it is possible for authentication headers to "timeout" in the middle of a run. Thankfully there is an easy solution!]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Unit and functional testing git with RSpec]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/unit-and-functional-testing-git-with-rspec/"/>
    <content type="text/html" src="https://www.sethvargo.com/unit-and-functional-testing-git-with-rspec/"/>
    <id>https://www.sethvargo.com/unit-and-functional-testing-git-with-rspec/</id>
    <published>2014-08-01T00:00:00+00:00</published>
    <updated>2014-08-01T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[If you have ever written a Ruby application that interacts with git, you are probably already aware of the pains of testing such behavior. As if checking if git is installed at the proper version and catching all the crazy typos was not enough, git's algorithm's for calculating commit SHAs make functional testing quite cumbersome!]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[StackOverflow is full of children]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/stackoverflow-is-full-of-children/"/>
    <content type="text/html" src="https://www.sethvargo.com/stackoverflow-is-full-of-children/"/>
    <id>https://www.sethvargo.com/stackoverflow-is-full-of-children/</id>
    <published>2014-06-06T00:00:00+00:00</published>
    <updated>2014-06-06T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[I recently experienced one of my most negative interactions with the humans of StackOverflow. I try not to rant or rave on my blog as much as possible, but I simply cannot let this go. It all boils down to this:]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Berkshelf Workflow]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/berkshelf-workflow/"/>
    <content type="text/html" src="https://www.sethvargo.com/berkshelf-workflow/"/>
    <id>https://www.sethvargo.com/berkshelf-workflow/</id>
    <published>2014-05-27T00:00:00+00:00</published>
    <updated>2014-05-27T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[There are only two fundamental assumptions for working with Berkshelf:]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Living with OCD]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/living-with-ocd/"/>
    <content type="text/html" src="https://www.sethvargo.com/living-with-ocd/"/>
    <id>https://www.sethvargo.com/living-with-ocd/</id>
    <published>2014-05-14T00:00:00+00:00</published>
    <updated>2014-05-14T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[I recently delivered one of my favorite talks - Living with OCD at BACON 2014.
This talk covers my OCD tendencies as well as how I cope with them. The slides can be found on SpeakerDeck.

]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[A brief history of DevOps]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/a-brief-history-of-devops/"/>
    <content type="text/html" src="https://www.sethvargo.com/a-brief-history-of-devops/"/>
    <id>https://www.sethvargo.com/a-brief-history-of-devops/</id>
    <published>2014-05-04T00:00:00+00:00</published>
    <updated>2014-05-04T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[I was invited by the Carnegie Mellon Information Systems Department to speak about "DevOps". These are the slides from that talk.
I posed the following question to the students and asked them to keep it in the back of their minds as we discussed the creation and evolution of DevOps.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Chef Cookbook Badges]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/chef-cookbook-badges/"/>
    <content type="text/html" src="https://www.sethvargo.com/chef-cookbook-badges/"/>
    <id>https://www.sethvargo.com/chef-cookbook-badges/</id>
    <published>2014-04-22T00:00:00+00:00</published>
    <updated>2014-04-22T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[As you may have seen across the various repositories on GitHub, README badges are all the rage these days. Whether it is Travis CI, Code Climate, or GitTip, it seems like all developers ever do is badge!]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Chef Sugar]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/chef-sugar-presentation/"/>
    <content type="text/html" src="https://www.sethvargo.com/chef-sugar-presentation/"/>
    <id>https://www.sethvargo.com/chef-sugar-presentation/</id>
    <published>2014-04-16T00:00:00+00:00</published>
    <updated>2014-04-16T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Originally given at ChefConf 2014, this talk simply titled "Chef Sugar" covers the who, what, when, where, and why for Chef Sugar. The talk begins as a small history lesson, but ends by diving deep into the Ruby internals of Chef Sugar to see who everything is wired together. You do not want to miss it!
The slides for "Chef Sugar" can be found on SpeakerDeck.

]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Delicious new Chef Sugars]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/delicious-new-chef-sugars/"/>
    <content type="text/html" src="https://www.sethvargo.com/delicious-new-chef-sugars/"/>
    <id>https://www.sethvargo.com/delicious-new-chef-sugars/</id>
    <published>2014-03-09T00:00:00+00:00</published>
    <updated>2014-03-09T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[A few months ago, I blogged about a thing called Chef Sugar. To quickly refresh your memory, Chef Sugar is an extension of the Chef core, recipe DSL, and select resources designed to make life as a Chef engineer as awesome as possible.
I first wrote Chef Sugar for incredibly selfish reasons - I was really sick of seeing the same patterns repeated across all of our cookbooks. It all started with the shell extensions, because simple methods like which and installed_at_version? are incredibly useful...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[The future of Vagrant Berkshelf]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/the-future-of-vagrant-berkshelf/"/>
    <content type="text/html" src="https://www.sethvargo.com/the-future-of-vagrant-berkshelf/"/>
    <id>https://www.sethvargo.com/the-future-of-vagrant-berkshelf/</id>
    <published>2014-01-28T00:00:00+00:00</published>
    <updated>2014-01-28T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[The Vagrant Berkshelf plugin has been rewritten to shell out to the berks CLI packaged with the ChefDK.
There seems to be some confusion about this post. We are deprecating vagrant-berkshelf, a plugin for integration Berkshelf with Vagrant. We are not depecating Berkshelf by any means.
After some internal discussions and conversations with the community, we are now looking for a new maintainer for the vagrant-berkshelf plugin. If you are interested in being part of the Berkshelf core team and man...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Chef recipe code coverage]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/chef-recipe-code-coverage/"/>
    <content type="text/html" src="https://www.sethvargo.com/chef-recipe-code-coverage/"/>
    <id>https://www.sethvargo.com/chef-recipe-code-coverage/</id>
    <published>2013-12-29T00:00:00+00:00</published>
    <updated>2013-12-29T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[How do you do code coverage with Chef?]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Using gems with Chef]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/using-gems-with-chef/"/>
    <content type="text/html" src="https://www.sethvargo.com/using-gems-with-chef/"/>
    <id>https://www.sethvargo.com/using-gems-with-chef/</id>
    <published>2013-12-21T00:00:00+00:00</published>
    <updated>2013-12-21T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Installing gems with Chef is relatively painless. Most of the time, you can use the gem_package resource, which behaves very similarly to the native package resource:
gem_package 'httparty'
You can even specify the gem version to install:
gem_package 'httparty' do
  version '0.12.0'
end
You may have also seen the chef_gem resource. What's the difference?]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Handle Faraday::Error::ConnectionFailed with middleware]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/handle-faradayerrorconnection-failed-with-middleware/"/>
    <content type="text/html" src="https://www.sethvargo.com/handle-faradayerrorconnection-failed-with-middleware/"/>
    <id>https://www.sethvargo.com/handle-faradayerrorconnection-failed-with-middleware/</id>
    <published>2013-12-21T00:00:00+00:00</published>
    <updated>2013-12-21T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Faraday is a really nice, middleware-based HTTP client for Ruby. For simple libraries, I recommend HTTParty, but Faraday is a really awesome solution when you need full control over the complete stack.
However, Faraday has one feature/flaw that I have found. If Faraday is unable to connect to a server, it throws a really nasty error. I whipped up a tiny middleware to handle this error:
class Middleware::Exceptions < Faraday::Middleware
  def call(env)
    begin
      @app.call(env)
    rescue Far...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Changing Chef Resources at Runtime]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/changing-chef-resources-at-runtime/"/>
    <content type="text/html" src="https://www.sethvargo.com/changing-chef-resources-at-runtime/"/>
    <id>https://www.sethvargo.com/changing-chef-resources-at-runtime/</id>
    <published>2013-12-21T00:00:00+00:00</published>
    <updated>2013-12-21T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[As the cookbook wrapper pattern becomes more prevalent, you may find it necessary to alter a parameter of a Chef resource in the library cookbook. For example, you may need to update the cookbook from where a file should be found, execute an action before a service starts, or change the variables passed to a template.
If you care not to dig into the Chef internals, I highly recommend Bryan Berry's Chef Rewind. But if you want to learn a little bit about resources, let's jump in.
Consider the libr...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Berksfile Magic]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/berksfile-magic/"/>
    <content type="text/html" src="https://www.sethvargo.com/berksfile-magic/"/>
    <id>https://www.sethvargo.com/berksfile-magic/</id>
    <published>2013-12-21T00:00:00+00:00</published>
    <updated>2013-12-21T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[The Berksfile is really one of the most magical compontents of Berkshelf - a cookbook dependency manager for Chef. As a core team member, I sometimes take for granted the extensibility of Berkshelf, so I decided to blog about some patterns!
Because the Berksfile is evaluated as Ruby, you have the ability to write pure Ruby code that will be evaluated at runtime.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Using Amazon Opsworks with Berkshelf]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/using-amazon-opsworks-with-berkshelf/"/>
    <content type="text/html" src="https://www.sethvargo.com/using-amazon-opsworks-with-berkshelf/"/>
    <id>https://www.sethvargo.com/using-amazon-opsworks-with-berkshelf/</id>
    <published>2013-12-20T00:00:00+00:00</published>
    <updated>2013-12-20T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Amazon Opsworks supplies its users with a nice collection of starter cookbooks on GitHub. Berkshelf prefers users treat each cookbook as its own software project, but for Opsworks users, that is not an option. Let me demonstrate a few ways you can use Berkshelf in tandem with Amazon Opsworks.
There are two common ways to force Berkshelf to use the "monolithic repo" mode. Please note: you should only follow this approach if you absolutely have to. We (the Berkshelf core team) highly recommend indi...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Spice up your recipes with Chef Sugar]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/spice-up-your-recipes-with-chef-sugar/"/>
    <content type="text/html" src="https://www.sethvargo.com/spice-up-your-recipes-with-chef-sugar/"/>
    <id>https://www.sethvargo.com/spice-up-your-recipes-with-chef-sugar/</id>
    <published>2013-12-20T00:00:00+00:00</published>
    <updated>2013-12-20T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[A few months ago, I was having a discussion with some colleagues internally and CHEF-494 came up. In short, the ticket was created by Seth Chisamore and proposed creating a core cookbook that included some useful primitives for common patterns:]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Optimizing for the Important Things]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/optimizing-for-the-important-things/"/>
    <content type="text/html" src="https://www.sethvargo.com/optimizing-for-the-important-things/"/>
    <id>https://www.sethvargo.com/optimizing-for-the-important-things/</id>
    <published>2013-12-20T00:00:00+00:00</published>
    <updated>2013-12-20T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Optimizing for the important things is one of my serious lightning talks. Originally given at Ignite Pittsburgh, this 5-minute motivational talk has been given in many cities including San Francisco and Portland.

]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Infrastructure as Code]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/infrastructure-as-code/"/>
    <content type="text/html" src="https://www.sethvargo.com/infrastructure-as-code/"/>
    <id>https://www.sethvargo.com/infrastructure-as-code/</id>
    <published>2013-12-20T00:00:00+00:00</published>
    <updated>2013-12-20T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Fletcher Nichol discusses what "infrastructure as code" means to a developer at DevOps Days: Portland.

]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Authorizers, Extractors, and Policy objects]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/authorizers-extractors-and-policy-objects/"/>
    <content type="text/html" src="https://www.sethvargo.com/authorizers-extractors-and-policy-objects/"/>
    <id>https://www.sethvargo.com/authorizers-extractors-and-policy-objects/</id>
    <published>2013-11-04T00:00:00+00:00</published>
    <updated>2013-11-04T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Recently I was working on a Rails 4 project, and much to my surprise, my favorite authorization framework is not supported! CanCan had long been my "go-to" framework for its simplicty and readability. I started searching the Internet for alternative gems, but many of them were also "not-Rails-4-ready" or had not had activity in months. As a Ruby developer, I cannot believe I did not think of this on my own! At the end of the post, the team showcases Pundit - a Ruby gem that encapsulates the conte...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Unit Testing Chef Cookbooks]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/unit-testing-chef-cookbooks/"/>
    <content type="text/html" src="https://www.sethvargo.com/unit-testing-chef-cookbooks/"/>
    <id>https://www.sethvargo.com/unit-testing-chef-cookbooks/</id>
    <published>2013-01-13T00:00:00+00:00</published>
    <updated>2013-01-13T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Okay, now that I'm done ranting about how to Unit test, let's move onto Chef.
I spoke at Chef Summit a few months ago and received a lot of questions about ChefSpec. It's very difficult to demonstrate the value in a Unit test when everyone is thinking at a higher level (acceptance testing).
Let's say I have a simple cookbook that just installs apache:
package value_for_platform(
  %w(centos redhat suse fedora) => {
    'default' => 'httpd'
  },
  %w(ubuntu debian) => {
    'default' => 'apache2'
...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Unit Testing Correctly]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/unit-testing-correctly/"/>
    <content type="text/html" src="https://www.sethvargo.com/unit-testing-correctly/"/>
    <id>https://www.sethvargo.com/unit-testing-correctly/</id>
    <published>2013-01-12T00:00:00+00:00</published>
    <updated>2013-01-12T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Let's talk about testing. Testing is fun, it's awesome, and if you want to be agile, it's a necessity. But chances are, you're doing it wrong.
Before we dive into Chef, let's look at a small Ruby example. Consider a class writes a downloads an HTML page from a website and writes the contents to a file:
require 'net/http']]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Two Factor SSH Authentication]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/two-factor-ssh-authentication/"/>
    <content type="text/html" src="https://www.sethvargo.com/two-factor-ssh-authentication/"/>
    <id>https://www.sethvargo.com/two-factor-ssh-authentication/</id>
    <published>2013-01-07T00:00:00+00:00</published>
    <updated>2013-01-07T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[With many popular websites providing two factor authentication, why shouldn't you add two-factor authentication to SSH? Public-key, Private-key encryption is generally considered to be very secure, but why not take an extra step?
This tutorial will use the open source Google Authenticator project and PAM for setting up two-factor authentication.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Install Ruby 2.0.rc1]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/install-ruby-2-0-rc1/"/>
    <content type="text/html" src="https://www.sethvargo.com/install-ruby-2-0-rc1/"/>
    <id>https://www.sethvargo.com/install-ruby-2-0-rc1/</id>
    <published>2013-01-05T00:00:00+00:00</published>
    <updated>2013-01-05T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Ruby 2.0 is no longer a work in progress! Ruby 2.0 Release Candidate 1 was released today! Here's how to get it:
Install Homebrew:
ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"
Make sure brew is up to date:
brew update
Install rbenv, ruby-build, and openssl:
brew install rbenv ruby-build openssl
Or, if you already have rbenv:
brew upgrade rbenv
Use rbenv to install Ruby 2.0 RC1
rbenv install 2.0.0-rc1]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Moving to Individual Cookbooks]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/moving-to-individual-cookbooks/"/>
    <content type="text/html" src="https://www.sethvargo.com/moving-to-individual-cookbooks/"/>
    <id>https://www.sethvargo.com/moving-to-individual-cookbooks/</id>
    <published>2013-01-02T00:00:00+00:00</published>
    <updated>2013-01-02T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[If you've been working with Chef in your organization for awhile, you've probably accumulated a bunch of cookbooks in a giant repository. With great tools like Berkshelf out there, it's become customary to rely on external community cookbooks, git repositories, and your own Chef Server for cookbooks. Essentially cookbooks have been extracted as a first-class object.
With Berkshelf, you can manage cookbooks as "dependencies", much like bundler does with a Gemfile. But that raises a big question - ...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Install Ruby 2.0 Preview 2]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/install-ruby-2-0-preview-2/"/>
    <content type="text/html" src="https://www.sethvargo.com/install-ruby-2-0-preview-2/"/>
    <id>https://www.sethvargo.com/install-ruby-2-0-preview-2/</id>
    <published>2012-12-31T00:00:00+00:00</published>
    <updated>2012-12-31T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Ruby 2.0 is still a work in progress, but it's already at preview 2. If you're looking to play with it, here are some steps to install Ruby 2.0 Preview 2 on Mac OSX Mountain Lion (and older OSX versions)
Install Homebrew:
ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"
Make sure brew is up to date:
brew update
Install rbenv, ruby-build, and openssl:
brew install rbenv ruby-build openssl
Use rbenv to install Ruby 2.0
rbenv install 2.0.0-preview2]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Ruby Local Method map Shortcut]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/ruby-local-method-map-shortcut/"/>
    <content type="text/html" src="https://www.sethvargo.com/ruby-local-method-map-shortcut/"/>
    <id>https://www.sethvargo.com/ruby-local-method-map-shortcut/</id>
    <published>2012-12-29T00:00:00+00:00</published>
    <updated>2012-12-29T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[In Ruby, we can pass blocks as directly as variables using &. This allows us to transform really simple map operations like this:
arr.map{ |a| a.downcase }
into this:
arr.map(&:downcase)
To me, the latter example is much cleaner, but there are some limitations:]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Add SSH Known Hosts with Chef]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/add-ssh-known-hosts-with-chef/"/>
    <content type="text/html" src="https://www.sethvargo.com/add-ssh-known-hosts-with-chef/"/>
    <id>https://www.sethvargo.com/add-ssh-known-hosts-with-chef/</id>
    <published>2012-12-23T00:00:00+00:00</published>
    <updated>2012-12-23T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[When connecting to an SSH server for the first time, you are often presented with a message like this:
The authenticity of host 'github.com (207.97.227.239)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)?
You may have shrugged this off, since you only ever need to agree once. However, when provisioning servers out in the cloud, there is no option to type "yes" at the command line. Attempting to c...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Moving to Octopress]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/moving-to-octopress/"/>
    <content type="text/html" src="https://www.sethvargo.com/moving-to-octopress/"/>
    <id>https://www.sethvargo.com/moving-to-octopress/</id>
    <published>2012-12-21T00:00:00+00:00</published>
    <updated>2012-12-21T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Today, I spent a few hours and migrated my entire blog from tumblr to Octopress. I did this for a variety of reasons.
First, I want to start posting more tutorials. The tumblr UI doesn't provide an effective way to add code and code snippets, it doesn't support markdown, and I don't have a ton of control over the design.
Second, tumblr goes down... a lot. With 1000+ hits on my blog per day, 83% uptime is not acceptable.
Lastly, it was recently announced that work has restarted on the Jekyll proje...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Custom Global Eco/JST helpers]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/custom-global-ecojst-helpers/"/>
    <content type="text/html" src="https://www.sethvargo.com/custom-global-ecojst-helpers/"/>
    <id>https://www.sethvargo.com/custom-global-ecojst-helpers/</id>
    <published>2012-10-02T00:00:00+00:00</published>
    <updated>2012-10-02T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Working on Envelope lately, I realized the need for custom form helpers. We use Twitter Bootstrap for the form styles and layout, but the markup is just absurd. 5-6 lines of code for a single form element is a bid absurd, in my opinion.
This isn't the first time I've been irritated about the markup required for Bootstrap Forms. Coming for a big Rails background, I wrote the bootstrap_forms gem awhile back to reduce the complexity of working with Twitter Bootstrap forms in Rails.
Turns out, Ruby !...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[A new way to cancan]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/a-new-way-to-cancan/"/>
    <content type="text/html" src="https://www.sethvargo.com/a-new-way-to-cancan/"/>
    <id>https://www.sethvargo.com/a-new-way-to-cancan/</id>
    <published>2012-05-20T00:00:00+00:00</published>
    <updated>2012-05-20T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Inspired by one of my student's code, I recently adopted a new way to define authorization with cancan.
Often times, it can be very cumbersome to keep track of all the different resources and roles inside an application. Imagine a hypothetical application that has 3 user roles (admin, employee, and guest). The cancan wiki recommends something like the following:
class Ability
  include CanCan::Ability]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Quick 960 Grid with SASS]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/quick-960-grid-with-sass/"/>
    <content type="text/html" src="https://www.sethvargo.com/quick-960-grid-with-sass/"/>
    <id>https://www.sethvargo.com/quick-960-grid-with-sass/</id>
    <published>2012-03-27T00:00:00+00:00</published>
    <updated>2012-03-27T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[960 used to be hard. I just did it in like 10 minutes. Thought I'd share...
Using SASS, we can quickly create a nice little span#{i} loop:
$content-width: 960px;]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Semantic Versioning]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/semantic-versioning/"/>
    <content type="text/html" src="https://www.sethvargo.com/semantic-versioning/"/>
    <id>https://www.sethvargo.com/semantic-versioning/</id>
    <published>2011-12-21T00:00:00+00:00</published>
    <updated>2011-12-21T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[I'm honestly sick of the discrepancies that exist between versioning. As such, I'm proposing a universal versioning scheme with actual definitions that are easy to understand and follow.
One of the biggest complaints from non-technical users of alpha/beta/release candidate software is "it doesn't work." Well duh! The problem is that most users have absolutely no idea what beta even means; and this isn't their fault, its ours.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Connecting the Information]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/connecting-the-information/"/>
    <content type="text/html" src="https://www.sethvargo.com/connecting-the-information/"/>
    <id>https://www.sethvargo.com/connecting-the-information/</id>
    <published>2011-10-17T00:00:00+00:00</published>
    <updated>2011-10-17T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Remember Google Wave? (laughter) But really, Google Wave was an attempt of connecting people. ideas, and information together in a collaborative environment. In Malcolm Gladwell's The Tipping Point, he talks of three kinds of people that generate change - connectors, mavens, and salespersons. Connectors are networkers - they connect people to information and people to people. Mavens are pedagogical information packrats - they accumulate information, but they also have a desire to share that infor...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[An icon has passed...]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/an-icon-has-passed/"/>
    <content type="text/html" src="https://www.sethvargo.com/an-icon-has-passed/"/>
    <id>https://www.sethvargo.com/an-icon-has-passed/</id>
    <published>2011-10-05T00:00:00+00:00</published>
    <updated>2011-10-05T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Today the most iconic leader of our time passed away. He challenged everything, always striving for new and innovative ways to change the world. He believed strongly that he could change the world with technology. I feel confidently that he did.
His actions and determination have inspired myself and many others to succeed - to reach for the goals that you have no chance at making. The man was never afraid to fail, and he was never afraid to tell you when he'd succeeded. His company is a direct re...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Internet Distractions]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/internet-distractions/"/>
    <content type="text/html" src="https://www.sethvargo.com/internet-distractions/"/>
    <id>https://www.sethvargo.com/internet-distractions/</id>
    <published>2011-09-30T00:00:00+00:00</published>
    <updated>2011-09-30T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[ADHD - attention deficit, oh look! A butterfly! In his June 5th, 2011 Wall Street Journal article, Nicholas Carr argues that the Internet is making us dumber. While I do not necessarily believe that "dumber" is the correct adjective in this case, I can agree with parts of Nicholas' argument. Overall, however, I do not feel that the Internet is decreasing human intellect (which is basically what Carr argues), but rather only decreasing the capabilities of human comprehension.
Hundreds of years ago...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[The Information Exchange]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/the-information-exchange/"/>
    <content type="text/html" src="https://www.sethvargo.com/the-information-exchange/"/>
    <id>https://www.sethvargo.com/the-information-exchange/</id>
    <published>2011-09-29T00:00:00+00:00</published>
    <updated>2011-09-29T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Time is money. We often hear this phrase in a metaphorical sense, but what if it were actually true? What if time could be considered a medium of exchange just like the US Dollar, The Yen, or the Euro? Throughout this thought paper, we will explore why time is an excellent medium for exchange in information markets.
Why does money work? In order for something to be a medium for exchange, it must have certain properties. First, it needs some kind of value - it needs to be measurable. Money is meas...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Newspapers aren't for Puppies]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/newspapers-arent-for-puppies/"/>
    <content type="text/html" src="https://www.sethvargo.com/newspapers-arent-for-puppies/"/>
    <id>https://www.sethvargo.com/newspapers-arent-for-puppies/</id>
    <published>2011-09-28T00:00:00+00:00</published>
    <updated>2011-09-28T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[As a child, I can recall my mother reading the newspaper with her coffee every morning. The routine was so monotonous that on days when the newspaper was late or absent, turmoil rained on our morning routines. Just a few years later, my sophomore year in high school, we canceled our newspaper subscription entirely. What changed in just a few short years? The scarcity associated with the newspaper became obsolete. The same information could also been found on the television or on the Internet. Tod...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Gaining Knowledge on Information]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/gaining-knowledge-on-information/"/>
    <content type="text/html" src="https://www.sethvargo.com/gaining-knowledge-on-information/"/>
    <id>https://www.sethvargo.com/gaining-knowledge-on-information/</id>
    <published>2011-09-27T00:00:00+00:00</published>
    <updated>2011-09-27T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Are you able to make an informed decision? What about a knowledgeable one? Over time, society has blurred the line between information and knowledge. While this is generally unimposing on the majority of the world, it is especially frustrating in the context of Information Systems. While information is the collection or aggregation of raw data, knowledge is the interpretation and use of that information in practice. Despite their differences, both are difficult to manage in today's world do to th...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Unhide hidden ~/Library in OSX Mountain Lion]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/unhide-hidden-library-in-osx-mountain-lion/"/>
    <content type="text/html" src="https://www.sethvargo.com/unhide-hidden-library-in-osx-mountain-lion/"/>
    <id>https://www.sethvargo.com/unhide-hidden-library-in-osx-mountain-lion/</id>
    <published>2011-08-15T00:00:00+00:00</published>
    <updated>2011-08-15T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Unhide hidden ~/Library in OSX Mountain Lion:
chflags nohidden ~/Library
For some reason in OS X Lion+ Apple hides the Library folder that normally appears in a User’s Home folder. To permanently reveal the folder in the Finder again, pop open Terminal, and paste the command above into it, and hit Return.
]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Install ImageMagicK on OSX Lion]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/install-imagemagick-on-osx-lion/"/>
    <content type="text/html" src="https://www.sethvargo.com/install-imagemagick-on-osx-lion/"/>
    <id>https://www.sethvargo.com/install-imagemagick-on-osx-lion/</id>
    <published>2011-07-26T00:00:00+00:00</published>
    <updated>2011-07-26T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Yay! Not only has Apple taken us a few steps back in terms of the operating system, but they've also broken my favorite memory-leaking image-manipulation tool - ImageMagick!
Thankfully, I've come up with a way to get it working again (although the process is slightly bassackwards):]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Disable Apple Mail animations in OSX Mountain Lion]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/disable-apple-mail-animations-in-osx-mountain-lion/"/>
    <content type="text/html" src="https://www.sethvargo.com/disable-apple-mail-animations-in-osx-mountain-lion/"/>
    <id>https://www.sethvargo.com/disable-apple-mail-animations-in-osx-mountain-lion/</id>
    <published>2011-07-26T00:00:00+00:00</published>
    <updated>2011-07-26T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Are you annoyed that you need to wait almost 3 seconds for the stupid Apple Mail animation to complete when replying/forwarding a message? Thankfully you can turn off that behavior with a little command line:
defaults write com.apple.Mail DisableReplyAnimations -bool YES
Should you decide that you no longer need those 3 seconds back, just change YES to NO
defaults write com.apple.Mail DisableReplyAnimations -bool NO
]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Introducing Powify]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/introducing-powify/"/>
    <content type="text/html" src="https://www.sethvargo.com/introducing-powify/"/>
    <id>https://www.sethvargo.com/introducing-powify/</id>
    <published>2011-06-03T00:00:00+00:00</published>
    <updated>2011-06-03T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[A few days ago, I wrote Powify - a simple gem for managing 37 Signal's POW. POW is an easy-to-use local Rack server capable of running any rack application under a specified local domain (defaulting to .dev) [Disclaimer - POW is Mac-only]]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Goodbye .htaccess, Hello Rails]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/goodbye-htaccess-hello-rails/"/>
    <content type="text/html" src="https://www.sethvargo.com/goodbye-htaccess-hello-rails/"/>
    <id>https://www.sethvargo.com/goodbye-htaccess-hello-rails/</id>
    <published>2011-05-21T00:00:00+00:00</published>
    <updated>2011-05-21T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Remember the good old days of PHP? Mastering a redirect was nearly impossible without complicated PHP code or writing a server instruction (.htaccess). Let's take a minute to examine the past and present, and then compare and contrast some of the advantages and disadvantages of each.]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Create a custom domain URL shortener with Rails]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/create-a-custom-domain-url-shortener-with-rails/"/>
    <content type="text/html" src="https://www.sethvargo.com/create-a-custom-domain-url-shortener-with-rails/"/>
    <id>https://www.sethvargo.com/create-a-custom-domain-url-shortener-with-rails/</id>
    <published>2011-04-26T00:00:00+00:00</published>
    <updated>2011-04-26T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[A few weeks ago I made a post about creating custom domain short URL services with bit.ly. I'm going to walk you through a simple Rails application that allows you to create a custom domain URL shortener for free!]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Show generated SQL in Rails 3 console]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/show-generated-sql-in-rails-3-console/"/>
    <content type="text/html" src="https://www.sethvargo.com/show-generated-sql-in-rails-3-console/"/>
    <id>https://www.sethvargo.com/show-generated-sql-in-rails-3-console/</id>
    <published>2011-04-20T00:00:00+00:00</published>
    <updated>2011-04-20T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[Have you ever wanted to see the resulting SQL of a query in Rails console? Well, unfortunately there's not really an 'easy' way to do this, other than hacking the console, so here we go.
Fire up your Rails console. I'm using Rails 3, but this should would in <3:
$ rails c
Loading development environment (Rails 3.0.7)
>> _
Cool, awesome, great. Now, we need to tell Rails console that we want to show what's being logged:
$ rails c
Loading development environment (Rails 3.0.7)
>> ActiveRecord::Base....]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[UI > functionality in initial webapps]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/ui-functionality-in-initial-webapps/"/>
    <content type="text/html" src="https://www.sethvargo.com/ui-functionality-in-initial-webapps/"/>
    <id>https://www.sethvargo.com/ui-functionality-in-initial-webapps/</id>
    <published>2011-04-12T00:00:00+00:00</published>
    <updated>2011-04-12T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[I am a firm believer that UI should always supersede functionality, especially in the case of new webapps. People generally lash out when I say such things, but when you're starting a small company or launching a new product, a fully functional website does you no good if people don't know how to use it. Conversely, a buggy website with helpful, encouraging error handlers will encourage users to keep coming back.
Think about it this way - if Facebook suddenly went down, would you come back in an ...]]>
    </summary>
  </entry>
  <entry>
    <title>
      <![CDATA[Custom Domain URL Shorteners with bit.ly]]>
    </title>
    <link rel="alternate" href="https://www.sethvargo.com/custom-domain-url-shorteners-with-bit-ly/"/>
    <content type="text/html" src="https://www.sethvargo.com/custom-domain-url-shorteners-with-bit-ly/"/>
    <id>https://www.sethvargo.com/custom-domain-url-shorteners-with-bit-ly/</id>
    <published>2011-04-12T00:00:00+00:00</published>
    <updated>2011-04-12T00:00:00+00:00</updated>
    <author>
      <name>Seth Vargo</name>
      <uri>https://www.sethvargo.com</uri>
    </author>
    <summary>
      <![CDATA[I recently acquired leav.in because I wanted to make my own URL shortening service. After spending a few hours making a little Rails application that connected to a backend service and a nice little UI, I decided to actually google "custom domain URL shortner." Low and behold, bit.ly offers a free service, bit.ly pro that provides custom domain short URL service and then some! It was a little difficult to fiddle through (not because of configuration, but just finding stuff), so here's a little wa...]]>
    </summary>
  </entry>
</feed>
