Recent Posts

Setting Akamai Edge-Control headers with Ruby on Rails

June 19, 2012

Just a short and sweet little tip.

Several months ago we moved one of our clients over to Akamai’s Content Delivery Network (CDN). Ww were previously using a combination of Amazon S3 and CloudFront with some benefits, but we were finding several key areas of the world were not s covered by Amazon (yet) for asset delivery. Along with that, we really wanted to take advantage of the CDN for more of our HTML content with a lot of complex rules that related to geo-targeting and regionalization of content.

I’ll try to cover those topics in another post, but wanted to share a few tidbits of code that we are using to manage Akamai’s Edge-control caches from within our Rails application.

With Akamai, we’re able to tell their Edge servers whether it should hold on to the response so it can try to avoid an extra request to the origin (aka our Rails application). From Rails, we just added a few helper methods to our controllers so that we can litter our application with various expiration times.


# Sets the headers for Akamai{lang=”ruby”}
# acceptable formats include:{lang=”ruby”}
# 1m, 10m, 90m, 2h, 5d{lang=”ruby”}
def set_cache_control_for(maxage=“20m”){lang=”ruby”}
headers[‘Edge-control’] = “!no-store, max-age=#{maxage}”{lang=”ruby”}
end{lang=”ruby”}\

This allows us to do things like:


class ProductsController < ApplicationController{lang=”ruby”}
def show{lang=”ruby”}
set_cache_control_for(‘4h’){lang=”ruby”}
@product = Product.find(params[:id]){lang=”ruby”}
end{lang=”ruby”}
end{lang=”ruby”}\

Then when Akamai gets a request for http://domain.com/products/20-foo-bar, it’ll try to keep a cached copy around for four hours before it hits our server again.

Announcing the 2012 Rails Hosting Survery

May 31, 2012

You might recall that back in 2009, we surveyed the Ruby on Rails community to gauge how people were deploying and hosting their applications. It’s been over three years, so we’ve decided to run it again…. I know… we’re crazy like that!

So… without further ado… we present the 2012 Rails Hosting Survey. We’ll be collecting responses for a month, so be sure to put it on your todo list.

Planet Argon is hiring

August 22, 2011

Hello all!

I’ve been so busy this year travelling (for pleasure and work) and helping grow the company that I’ve not had much to say here. Expect some posts soon!

In the meantime, if you’re looking for a new challenge… Planet Argon is seeking a few more Ruby on Rails developers. Interested? get in touch.

Installing Ruby on Rails, Passenger, PostgreSQL, MySQL, Oh My Zsh on Snow Leopard, Fourth Edition

February 08, 2010

Welcome to what seems like my tenth installment (actually, it’s the fourth) of showing you how I setup my development environment on a fresh OSX install. In this case, I’m actually getting a MacBook setup for a new employee with Snow Leopard.

Over the years, I’ve evolved these following steps and they’ve helped our team maintain a consistent and stable envirnment for Ruby on Rails development. I know that there are a few other ways to approaching this and I’m sure you’ll get similar results, but this approach has allowed me to maintain a hassle-free setup for the last five years.

As with all things… your milage may vary.

Phase One

During this initial phase, we’re going to install the primary dependencies and setup our environment.

XCode

The first thing that you’ll need to do is install XCode, which almost everything depends upon as this will install developer-friendly tools for you. Apple has been kind enough to ship this on your Snow Leopard DVD.

Go ahead and install XCode from the Optional Installs folder.

(might require a reboot)

You can also download it online.

MacPorts

Now we’ll install MacPorts, which the web site describes itself as, “an open-source community initiative to design an easy-to-use system for compiling, installing, and upgrading either command-line, X11 or Aqua based open-source software on the Mac OS X operating system.”

As I’ve said in past versions of this guide, this tool is about to become one of the most important tools on your operating system. It’ll be used time and time again to maintain your libraries and many of the Unix tools that you’ll be using. If you’re from the Linux or BSD world, you are likely familiar with similar tools… such as: apt-get, port, and yum.

You’ll want to download the latest stable version from http://www.macports.org/. Once downloaded, you can install it.

Once this is installed, you’ll be able to use the port command from your console.

Wget

Let’s test out your MacPorts install by installing a useful tool called wget, which we’ll use to install oh-my-zsh.

sudo port install wget
```bash
### Git and Subversion

Every development environment should have some source code management
tools available. We'll install both of these with one command.
```bash
sudo port install git-core +svn
```ruby
This will install git and subversion.

### oh-my-zsh

[Oh My Zsh](http://github.com/robbyrussell/oh-my-zsh) is the most
amazing thing to happen to shells since... well since I said so. It's
one of my open source projects that I encourage you to give a whirl.
```bash
wget http://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
```ruby
That's it. The next time you open up your terminal, you'll be running
zsh with a bunch of stuff available. For more information, visit
<http://github.com/robbyrussell/oh-my-zsh>.

### Terminal theme (optional)

I never understood why the icon for Terminal has a black background but
when you start it up the default theme is black on white.

![](http://img.skitch.com/20100208-1b92cbx8gtuttqsbdd49qspq7f.jpg)

versus

![](http://img.skitch.com/20100208-8dnmpswyumfk73h942g6u4fih4.jpg)

Anyhow, I'm a fan of the the dark background. To change this, open up
preferences in Terminal. Select **Pro**, then click on the **Default**
window so that this sticks around.

![](http://img.skitch.com/20100208-mr4q4y5btq7sscuh7ceky3ahgx.jpg)

Let's now open up a new Terminal window..

You should be looking at something like this:

![](http://img.skitch.com/20100208-psmj7mqsx38j1i2nj75n6hbcg7.jpg)

Much better... let's continue.

## Phase Two

We're now going to start installing everything we need to get this
running.

### Ruby 1.8.7.x

First up, Ruby.

Snow Leopard includes Ruby and Rails already installed, but we're going
to back these up for a rainy day. Just issue these commands:
```bash
$ sudo su -
Password:
:~ root# mv /usr/bin/ruby /usr/bin/ruby.orig
:~ root# mv /usr/bin/gem /usr/bin/gem.orig
:~ root# mv /usr/bin/rails /usr/bin/rails.orig
:~ root# logout
```ruby
![](http://img.skitch.com/20100208-b7cxbt8andg3t7ntn17r1wahfg.jpg)

Now we'll go ahead and install a fresh copy of Ruby and RubyGems via
MacPorts.
```bash
sudo port install ruby rb-rubygems
```ruby
You should now see something like this for a bit...

![](http://img.skitch.com/20100208-n9xxiaqbe6bw72qr88dgurxqdp.jpg)

Let's watch a video about bumble bees.

When it finishes installing, you should check that Ruby is available to
you and installed in `/opt/local/bin`.

![](http://img.skitch.com/20100208-tfc3ifeaau15295r9sfmfhbnm1.jpg)

We'll also take a second to create a symlink for this as some tools seem
to rely on `/usr/bin/ruby` being there.
```bash
sudo ln -s /opt/local/bin/ruby /usr/bin/ruby
```bash
Great, let's move on.

### Passenger (mod_rails)

Now that we have Ruby installed, we're going to take a quick detour to
setup Passenger with the Apache server already available on your
machine. I've been a big fan of using Passenger for your development for
over a year now.
```bash
sudo gem install passenger
```ruby
Once the gem is finished installing, you'll need to install the apache2
module with the following command:

It'll ask you to continue by pressing Enter. At this point, it'll check
that you have all the necessary dependencies and then compile everything
needed for Apache2.

![](http://img.skitch.com/20100208-x4rcmr6m5q44etk7rad2kqpmir.jpg)

Now I'll force you to watch a highlights reel of Fernando Torres... *the
best striker in the world!*

The passenger install will then show you this output, which you'll want
to stop and read for a moment and highlight the following:

![](http://img.skitch.com/20100208-ms13ub2srx2axk6ti43ifiyut4.jpg)

Then using vi or emacs, you'll want to create a new file with the
following content:
```bash
vi /etc/apache2/other/passenger.conf
```text
Then paste in the following (what you highlighted and copied above.)
```apache
LoadModule passenger_module /opt/local/lib/ruby/gems/1.8/gems/passenger-2.2.9/ext/apache2/mod_passenger.so
PassengerRoot /opt/local/lib/ruby/gems/1.8/gems/passenger-2.2.9
PassengerRuby /opt/local/bin/ruby
```bash
You'll also want to include the following below what you just pasted.
```apache
# Set the default environment to development
RailsEnv development

# Which directory do you want Apache to be able to look into for projects?
<Directory "/Users/ryangensel/development">
    Order allow,deny
    Allow from all
</Directory>
```ruby
You'll want to quickly start up your web sharing, which will start
Apache2 up via your System Preferences.

![](http://img.skitch.com/20100208-ekr2g6f5seb6iif35fteyjfi74.jpg)

![](http://img.skitch.com/20100208-rm96gmde4d8ffwjbdyqusiqr8f.jpg)

Simple enough... moving forward.

### Passenger Pref Pane

To make things as simple as possible, I'd encourage you to install the
[Passenger Preference
Pane](http://www.fngtps.com/2009/09/new-os-more-pane-passenger-preference-pane-v1-3)
(view this post for a download).

![](http://img.skitch.com/20100208-ra8p88abxtnxbq3m9711gbpryb.jpg)

### Development directory

I have a directory named `development/` in my home directory, which is
where I end up storing all of my projects. This should match whatever
you put above in the apache configuration
(`<Directory "/Users/ryangensel/development">`).
```bash
mkdir development; cd development;
```ruby
### Installing Ruby on Rails via RubyGems

Now we'll use RubyGems to install the latest version of Ruby on Rails
(and all of it's dependencies).
```bash
sudo gem install rails
```ruby
![](http://img.skitch.com/20100208-eyhg4t9sscbeiccs5rxkb5p35.jpg)

While this is installing, you can watch a video from my old band that
ended around the time that business started picking up for [Planet
Argon](http://planetargon.com).

Great, let's test out the install of Rails...

### Test Rails and Passenger

In your development directory, let's quickly a new Rails app...
```bash
rails testapp
```ruby
This will generate a new Rails application in a `testapp/` directory.

Now open up the **Passenger Preferences Pane** and add this directory as
a new application.

![](http://img.skitch.com/20100208-83rjan794eqcmy62e1u4aujtiy.jpg)

![](http://img.skitch.com/20100208-tms89ssutthhq8rkpjm392qfpb.jpg)

Press Apply...

You should now fire up your browser of choice and head to
`http://testapp.local`. If all has worked, you'll see a, "Welcome
aboard" screen from the Ruby on Rails application.

![](http://img.skitch.com/20100208-c9phjdfq8ybcu29uc5k9qiuha9.jpg)

Assuming that this worked for you, let's take a quick break to make some
tea...

## Phase Three

In this last phase, we're going to install a few database servers and
corresponding rubygems so that you can get to work.

### PostgreSQL

At [Planet Argon](http://planetargon.com), we build our web applications
on top of [PostgreSQL](http://postgresql.org). I've been a long-time
advocate of it and hope you consider using it yourself.

At this point in time, the current stable version of PostgreSQL via
MacPorts is 8.4.x. Let's install that now...
```bash
sudo port install postgresql84 postgresql84-server
```text
Once this finishes compiling, you'll need to run the following commands
to setup a new PostgreSQL database.
```bash
sudo mkdir -p /opt/local/var/db/postgresql84/defaultdb
sudo chown postgres:postgres /opt/local/var/db/postgresql84/defaultdb
sudo su postgres -c '/opt/local/lib/postgresql84/bin/initdb -D /opt/local/var/db/postgresql84/defaultdb'
```ruby
Assuming that you want PostgreSQL to always be running, you can run:
```bash
sudo launchctl load -w /Library/LaunchDaemons/org.macports.postgresql84-server.plist
```ruby
...and to start it right now, run:
```bash
sudo launchctl start org.macports.postgresql84-server
```ruby
Before you can start using it, we'll need to make sure that the
PostgreSQL executables are available in your shell path. Since you're
now using [oh-my-zsh](http://github.com/robbyrussell/oh-my-zsh), you'll
want to edit `~/.zshrc` with your favorite editor.
```bash
vi ~/.zshrc
```text
Just append this to `export PATH=` line in the file.
```bash
:/opt/local/lib/postgresql84/bin
```ruby
Your PATH might look something like the following now:
```bash
# Customize to your needs... export PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/lib/postgresql84/bin
```ruby
#### Setup database user

To setup a new database (with superuser credentials), just run:
```bash
createuser --superuser ryangensel -U postgres
```ruby
We'll now test creating a database:
```bash
createdb test_db
```text
Let's test that we can access it...
```bash
➜  ~  psql test_db
psql (8.4.2)
Type "help" for help.

test_db=# \q
```text
Great, let's drop it now.
```bash
➜  ~  dropdb test_db
➜  ~  psql test_db
psql: FATAL:  database "test_db" does not exist
➜  ~
```ruby
Okay, we'll now install the library that will allow Ruby to talk to
PostgreSQL.

Just run:
```bash
sudo gem install pg
```ruby
![](http://img.skitch.com/20100208-b4cf1pm1utkf2ihd9up432etwm.jpg)

Voila... let's move on to the inferior database...

### MySQL

We're going to run through the installation of MySQL really quickly
because you might need it.
```bash
sudo port install mysql5 mysql5-server
```text
This took ages on my machine... so let's watch a video.

We'll now setup the database and make sure it starts on system boot.
```bash
sudo -u _mysql mysql_install_db5
sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
sudo launchctl start org.macports.mysql5
```text
Let's test that we can create a database now (and that it's running.)
```bash
➜  ~  mysql5 -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.43 Source distribution

Type 'help;' or '\h' for help. Type '
```text
Great, now let's install the Ruby library for MySQL.
```bash
sudo gem install mysql -- --with-mysql-dir=/opt/local

Perfect, now we’ve got all the necessary tools to get you working on Ruby on Rails projects with either PostgreSQL or MySQL.

Summary

Thanks for following along with this guide. I hope it helped some of you setup your Snow Leopard environment. We still believe that the ideal hosting environment for your Ruby on Rails applications is a dedicated Linux server. In fact, we’re just about to release our new Boxcar Conductor tool to help with Rails deployments… stay tuned!

In the meantime, feel free to follow me on Twitter or Planet Argon on Twitter.

(oh my) Zsh themes Gone Wild! 18+

December 28, 2009

Earlier this evening, I accepted a pull-request for theme number 18, which is now included in Oh My Zsh. To celebrate, I’ve updated the themes wiki page with fresh screenshots.

Here is a sampling of some of the themes that you can use out of the box with Oh My Zsh.

Oh My Zsh is much more than a collection of themes for your zsh config. It’s a way of life[^1^](#fn1){#fnref1 .footnote-ref role=”doc-noteref”}.

Also, be sure to follow ohmyzsh on twitter now!


  1. ::: {#fn1} well.. at least while you’re in the terminal. ;-)↩︎{.footnote-back role=”doc-backlink”} :::