Thursday, April 15, 2010

Downloading files

Wow it's been a year since I've last posted!

I'm currently checking out dragonfly, the new kid on the block file processor. It's mean to replace stuff like paperclip and attachment_fu. To make things simple, especially if you don't have a lot of files, when migrating from either of those to dragonfly it may be simpler to just download the file and upload it again via dragonfly. This way you don't have to study the internals of each file management plugin.

So, here's how to download a file.

require 'net/http'

url = URI.parse ""
Net::HTTP.start do |http|
response = http.get url.path
MyModel.create! :file => response.body
# Here you tell your model to create the file.
# This is what the create action in the controller calls
# but instead of params[:file], you have response.body

Friday, April 17, 2009

Vim Setup

I've posted many a setup in vim before, but I've decided to put it on github for easier management.

Wednesday, April 1, 2009

Stars and acts_as_rateable

I recently wanted to implement a star system in Rails. I looked at this rateable plugin and followed this tutorial to create the stars.

It wasn't as cut and dried as I had hoped, so here is the code I used. It's pretty complete. Disclaimer: I used haml and sass and if you don't, you should still be able to understand the code. In case you don't use sass, here's the generated CSS that you get from the sass file.

Friday, March 27, 2009

before_create should return the right boolean!

This is a small thing, but I wasted an hour or so figuring this thing out. I had an a before_create where I set a boolean variable to false and then my tests started to fail? Why? Because before_create will stop the creation of the record if it returns false!

class A << AR::Base
before_create :set_enabled

def set_enabled
self.enabled = false
true # so that it doesn't fail

Friday, March 20, 2009

Passenger, Monit, Postfix

Setting up Passenger was quite easy, coming from the world of Mongrel. For the most part I followed this. It's pretty comprehensive, but I'll just add some stuff that I had to do on my own.

This is far from a comprehensive list, and if you just follow this things won't work. This also assumes you have _some_ knowledge of how Postfix, Monit, Linux works.

I accept and read mail somewhere else (not on the VPS that sends mail). For example, I may use Google to accept mail on the Internet, however, I don't connect my server to Google to send mail. Because of this, when postfix on my server tried to send mail to, it always something like "there is no user on this server". So I opened up /etc/postfix/ and make sure that mydestination doesn't contain your domain name. mydestination tells postfix what resides on your local machine.

mydestination = localhost.localdomain, localhost

Also, to use it, my Rails app's setting were like this:

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
:address => "localhost",
:port => 25,
:domain => ""

SilverRack and Sources
Installing the clean 8.04 on SilverRack, /etc/apt/sources.list is virtually empty. You need to add:

deb hardy main restricted universe multiverse
deb-src hardy restricted main multiverse universe

deb hardy-updates main restricted universe multiverse
deb-src hardy-updates restricted main multiverse universe

deb hardy-security main restricted universe multiverse
deb-src hardy-security restricted main multiverse universe

Then "sudo apt-get update" after

The tutorial above didn't have any tutorial for Monit or God.rb. Install the dependencies first:

sudo apt-get install flex byacc bison -y

Then monit (Make sure this is the latest and greatest version):

tar -xzvf monit-5.0_beta7.tar.gz && cd monit-5.0_beta7/ && sudo ./configure && sudo make && sudo make install && cd ../
sudo mkdir /etc/monit.d

Then make the monit file for Apache. This file basically tells monit what to watch out for, and how.

Sample /etc/monit.d/apache.monitrc

check process apache with pidfile /var/run/
start program = "/etc/init.d/apache2 start"
stop program = "/etc/init.d/apache2 stop"
if cpu > 60% for 2 cycles then alert
if cpu > 80% for 5 cycles then restart
if totalmem > 200.0 MB for 5 cycles then restart
if children > 250 then restart
if loadavg(5min) greater than 20 for 8 cycles then alert
group yourappnamehere

Since I use workling, I also made a seperate file for it:
server$ sudo vi /etc/monit.d/workling.monitrc
and paste (do a "which ruby" to find out where ruby is and replace the /usr/bin/ruby if needed)

check process workling with pidfile /var/www/yourappname/shared/log/
start program = "/bin/bash -c 'HOME=/var/www/yourappname/current RAILS_ENV=production /usr/bin/ruby /var/www/yourappname/current/script/workling_client start'"
stop program = "/bin/bash -c '/usr/bin/ruby /var/www/yourappname/current/script/workling_client stop'"
if totalmem is greater than 180.0 mb for 5 cycles then restart
if cpu is greater than 90% for 5 cycles then restart
if 20 restarts within 20 cycles then timeout
group yourappname

Then reload monit via "sudo monit reload".

Now monit needs to be told to start automatically when we startup and when/if it crashes, we'll use upstart (this is for Ubuntu only?)
 server$ sudo vi /etc/event.d/service_monit

and paste (do a "which monit" to find out where monit is and replace the /usr/local/bin/monit if needed)

# This is an event.d (upstart) script to keep monit running
# To install disable the old way of doing things:
# /etc/init.d/monit stop && update-rc.d -f monit remove
# then put this script here: /etc/event.d/monit
# You can manually start and stop monit like this:
# start monit
# stop monit
# Michael Hale (

start on startup
start on runlevel 2
start on runlevel 3
start on runlevel 4
start on runlevel 5

stop on runlevel 0
stop on runlevel 6

exec /usr/local/bin/monit -Ic /etc/monit/monitrc

Wednesday, March 18, 2009

Moving To Passenger, Workling

I've used backgroundrb for a while now. Coupled with mongrels, monit, it wasn't a pleasant experience. Oh, I forgot to mention that I was learning Linux at the time (still am actually), so it was very difficult for me.

Lately, I've been comtemplating moving my production environment to Passenger, Apache, Workling and God. The next few posts will talk about my experience and what I did. :)

For now, let me just say that this help page played a big part in speeding up my staging.

Tuesday, March 3, 2009

Cleaning Up Your ActiveRecord Sessions

I was looking for a way to do this and found a good resource to find out how (without coding it yourself!) refers to a plugin called limited session but the link is no longer valid. Check out

Update: this breaks in Rails 2.3, I think it's because of the lazy loading. I've never learned much about sessions, so for now I'll move back to file stored.