We're hiring!

From the monthly archives:

June 2008

Keep your site as fresh as your code

by ari on June 27, 2008

I am actively working on PoolParty, but the website doesn’t necessarily show that the project is in active development.

Luckily, it is hosted at github and they have an API to access their changesets. Now, on PoolParty’s website, I am surfacing the latest changeset’s time, message and author as well as a link to the changeset.

How?

Code (shortened for brevity purposes):

$:.unshift(File.dirname(__FILE__))
require "rubygems"
require "yaml"
require "open-uri"

class Grab
  @url = "http://github.com/api/v1/yaml/auser/pool-party/commits/master"
  @refresh_after = 20

  def self.latest_commit_object
    o = yaml["commits"][0]
    {
      :message => o["message"].gsub(/\n/, ""),
      :date => Time.parse(o["committed_date"]).timeago,
      :by => o["committer"]["name"],
      :url => o["url"]
    }
  end
end

The github api is slick. As you can see from above, the format for the api url looks like

http://github.com/api/version/format/username/repository/type/object

Where the variables there correspond to:

  • Current version: v1
  • Acceptable formats: json, xml, yaml
  • Acceptable types: commits, commit

Grabbing the latest changesets from the url as YAML format, we can quickly and easily parse the message into a useful hash.

I personally like the “# hours ago” syntax that 2.0 sites are popping up with everywhere, so I just added a timeago method that is very similar to the one included with rails. The source is attached.

Since I don’t want poolpartyrb.com’s load time to be dependent upon how fast it can hit github, I cache the variable so every 20 views it refreshes.

Use in Rails

Save both the files (attached below) to your lib directory.

Add this to your environment.rb

require 'grab'

Then add this helper to your application_helper.rb

  def show_latest_commit
    @latest_commit = Grab.latest_commit_object

    <<-EOS
Latest commit #{@latest_commit[:message]}
by #{@latest_commit[:by]}
#{@latest_commit[:date]} EOS end

How to use in sinatra

I use this on poolpartyrb.com, which is a sinatra site. I do basically the same as above, but generally render the code in haml instead

  $:.unshift(File.dirname(__FILE__))
  require "sinatra"
  require 'grab'

  get '/' do
    @latest_commit = Grab.latest_commit_object
    haml :home, :layout => :layout
  end

Then in my home.haml

  .note
    %strong
      Latest commit
    %br
    ==
    = @latest_commit[:message]
    
    .highlight
      == by #{@latest_commit[:by]}
    = @latest_commit[:date]

Get the code here

edit: updated location of code

{ 2 comments }


Is your EC2 server pool starting to look like this?

PoolParty can help you turn it into this:

Why would I need PoolParty?

Amazon’s Elastic Compute Cloud has made it cheap and straightforward to run your own server pool, but there are various issues with volatility, lack of load balancing between instances, no persistent instance storage (currently in private beta). Also there is no mechanism for scaling your instances dynamically (ie, adding or removing instances as your load changes).

That is all taken care of by PoolParty, a recently open sourced Ruby gem and the brainchild of fellow CitrusByte developer Ari Lerner. PoolParty takes care of the following:

  • Automatic scaling based on demand and load
  • Starting/stopping instances
  • Self-healing
  • Provisioning and bootstrapping initial software
  • Setting up S3Fuse
  • Load balancing with HAProxy
  • Built-in monitoring
  • Plug-in architecture for extendability / customization

How?

PoolParty is based on established open source technologies that have been widely used in production. It takes your EC2 server pool, and invites S3Fuse, monit, and members of the High Availability Linux Project . Now you don’t just have a pool. You have a rocking pool party. All you have to do is sign those invites! (In other words: just provide a config file and you’re done).

More Information

You can check it out at the official PoolParty website. Tutorials, walk-throughs and articles are coming soon.

If you are interested in active development, check out the source at github. Active discussion is on the PoolParty Google Group

Here are the slides from the talk Ari gave at RailsConf sessions (also available here):

Read this doc on Scribd: pool party presentation

{ 0 comments }

Ruby TMTOWTDI, Episode 1

June 2, 2008

This is the inaugural post in a series that we’ll be calling Ruby TMTOWTDI (There’s more than one way to do it). Usually the TMTOWTDI acronym is used as a disparaging term towards flexible languages, which offer a myriad ways of solving most given problems. This series, however, aims to use this property [...]

Read the full article →