HowTo: Phusion Passenger aka mod_rails for Apache
August 8th, 2008 — Posted by benedikt — Filed in Articles, Linux, Ruby, Ruby on Rails
Yesterday I decided to give Phusion Passenger aka mod_rails a try and installed it. It was dead simple to set it up and to deploy rails applications with it. I’m now using it for several “small” applications, for which the whole overhead of setting up a cluster of mongrels and a proxy doesn’t seem to be adequate. I’ll give you a short summary on how to install mod_rails for apache2 on Debian Etch.
First, install the passenger gem using RubyGems (if you don’t have Ruby and RubyGems running on your server, install them first – of course):
1 gem install passenger
Afterwards, run the passenger apache2 module installer using this command:
1 passenger-install-apache2-module
It’ll check for the required software to install the module, compile it and copy it to the correct folders. If some software is missing install it using aptitude (ie. aptitude install g++ if you’re missing the GNU C++ Compiler).
Next, create two new files in the /etc/apache2/mods-available directory. One called mod_rails.load:
1 LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.2/ext/apache2/mod_passenger.so
... and the other one called mod_rails.conf:
1 PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.2 2 PassengerRuby /usr/bin/ruby1.8
Now you can enable the module using a2enmod and restart apache.
1 a2enmod mod_rails 2 apache2ctl restart
That’s it! Now simply deploy your rails application, just make sure apache’s document root is pointing to your applications public folder. Passenger will automatically detect your rails application and start up processes as needed. You can check it’s status and stats using the passenger-status and passenger-memory-stats commands. For more details on mod_rails, take a look at it’s documentation.
My day-to-day resources on Ruby and Rails
August 4th, 2008 — Posted by benedikt — Filed in Articles, Ruby, Ruby on Rails
News
I try to keep up with Ruby and Ruby on Rails, even if I’m not working with one of them at the moment. These are the three feeds helping me to get the latest news:
PlanetRubyOnRails.com, not to be mixed up with PlanetRubyOnRails.org, is a simple feed aggregator with a set of quite informative blogs. Including the official Riding Rails Blog, Ruby Inside, and InfoQ. Unfortunately it doesn’t provide an RSS-Feed anymore, but thanks to Feed43 it’s easy to build one on your own.
Every Wednesday Gregg Pollack and Jason Seifer of Rails Envy publish their Rails Envy Podcast, covering last week’s most important topics in the Ruby and Rails community. They’re giving a short summary for every topic, together with a link in their shownotes and usually are fooling around. The podcast’s length is usually between 10 to 15 minutes.
Just like PlanetRubyOnRails, the planet of the german ruby on rails usergroup is a feed aggregator, except it includes blogs of members of the german Ruby on Rails community. (Yes, mine too …) Its far from being as active as the international one, but usually includes interesting posts.
Documentation
When I’m working on Ruby and Ruby on Rails code, I use there resources to quickly look up documentation:
Ruby-Doc.org provides the documentation for both Ruby’s Core and Stdlib. The documentation is in the default RDoc format, so I usually end up hitting [Strg]+[F] and using my browsers search function to quickly get to the relevant sections.
What Ruby-Doc.org is for ruby, api.rubyonrails.com is for rails. It’s the standard rails documentation in the default RDoc format. As with Ruby-Doc.org I use my browsers search to quickly find what I’m looking for.
Rails-Doc.org is a quite new site providing the full rails documentation. Unlike the default API documentation site (see above) it also includes documentation of older rails versions. Additionally it has a nice search engine, and adds the ability to post notes. There are other sites providing similar functionality for the rails documentation, but somehow Rails-Doc.org just feels right and I’m using more and more.
Gem Server
Did you know the fabulous RubyGem-Tools provide a server including the documentation for all your installed gems? Simple run gem server on the console, fire up your browser and navigate to http://localhost:8808. Okay, it’s just the standard RDoc documentation for each gem, without any fancy search or anything … but who cares if you’re somewhere in the middle of nowhere with no internet connection? :-)
Other
Last but definitely not least, are the RailsCasts by Ryan Bates. Every Monday he publishes a approx. 5 to 10 minute screencast on a variety of topics related to rails development. If you haven’t seen one of them yet, don’t hesitate any longer. Ryan’s explanations are concise and based on practical examples.
What are your resources on Ruby / Rails? Which blogs are you reading to stay up-to-date? Which documentation are you using? I’m interested in your comments (there are way to few anyways … ;-))!
Update (Aug 15.)
Nodeta, creators of Rails-Doc.org, released APIdock yesterday. APIdock extends the Rails-Doc.org concept to multiple projects. Currently Rails, Ruby and RSpec are included.
Using RSpactor with Linux
April 10th, 2008 — Posted by benedikt — Filed in Agile Development, Articles, Linux, Ruby, Ruby on Rails
Andreas Wolff recently released RSpactor, a (up to now) command line tool similar to autotest. Nevertheless it differs from autotest in two points. First it’s focused on RSpec and secondly it’s using Mac OS’ FSEvents to monitor file changes. According to this it only runs on Mac OS. To get it running on Linux you’ll have to change RSpactor’s Listener class to use Linux’ equivalent to FSEvents called inotify. Luckily there’s a gem called RInotify which introduces a simple class to access the inotify events within ruby. I rewrote the Listeners class yesterday to get it running on my Linux notebook:
1 # inotify_listener.rb 2 3 class Listener 4 5 def initialize(&block) 6 require 'rinotify' 7 begin 8 @spec_run_time = Time.now 9 @watching = {} 10 11 notify = RInotify.new 12 Dir.glob(File.join(Dir.pwd, '**')).each do |dir| 13 watch_desc = notify.add_watch(dir, RInotify::MODIFY | RInotify::CREATE | RInotify::DELETE) 14 @watching[watch_desc] = dir 15 end 16 17 while true do 18 changed_files = [] 19 notify.each_event do |event| 20 changed_files << build_path_from_event(event) 21 end 22 changed_files.uniq! 23 unless changed_files.empty? 24 @spec_run_time = Time.now 25 yield changed_files 26 end 27 sleep(5) 28 end 29 rescue Interrupt 30 @watching.each_key { |key| notify.rm_watch(key) } 31 end 32 end 33 34 def build_path_from_event(event) 35 File.join(@watching[event.watch_descriptor], event.name || '') 36 end 37 38 end
To get it running you simply have to install the RInotify gem and change one line in bin/rspactor:
1 # from 2 require File.join(File.dirname(__FILE__), '..', 'lib', 'listener') 3 # to 4 require File.join(File.dirname(__FILE__), '..', 'lib', 'inotify_listener')
That’s it! RSpactor should be running on Linux now and consuming much less CPU than autotest.
(You might also want to change the system()-call in lib/resulting.rb as it’s currently using growl to notify you about the test results.)
Easy SSH authentication with keychain
March 29th, 2008 — Posted by benedikt — Filed in Articles, Linux
Typing SSH passwords again and again can be a real pain. For example: Lately I started to use Capistrano to deploy my rails applications. If I want to set up the maintenance-page on the server I’ll type cap deploy:web:disable which of course prompts me for the SSH password. Then I want to deploy my application with cap deploy and again will be prompted for the password. Finally I have to cap deploy:web:enable to remove the maintenance page which – as mindful readers might have guessed already – prompts for the password. This was just one reason for me to set up SSH authentication keys. At first I was a little worried that setting it up might be a bit complicated. Luckily I was disabused. If you want to switch to key based authentication too follow these simple steps:
Key generation
The first thing you need is – of course – a pair of keys: your private key and the associated public key. To generate both fire up our favorite shell (for me it’s bash) and type:
1 ssh-keygen
This will generate both keys and ask you where to store it. Usually the default would be something like ~/.ssh/id_rsa. Simply accept the default by pressing return. Next you’ll have to enter a password for your key and confirm it. Afterwards you’ve to tell the server to accept your key on authentication. Do so by uploading the public key to the server.
1 scp ~/.ssh/id_rsa yourserver.com:~/.ssh/authenticated_keys2
If you want to add multiple keys, be sure to append it to the authenticated_keys2 file and don’t overwrite it.
First login
That’s all you have to do to switch to key based SSH authentication. Try to log in as usual by typing:
1 ssh yourserver.com
This will prompt you for your key’s password and log you in to your server afterwards. “But wait! I’m still having to type my password every time I want to log in!” you shout, and you’re right – up to now. What you need to do is running ssh-agent, adding your key and typing your password. ssh-agent will then ask for the password and store it until you shut it down. You’ll have to do this everytime you open up a new shell or put the commands into your i.e. ~/.bash_profile. Quite comfortable but we can do better.
Keychain
There is a nice little tool called keychain that will smooth the process a little for you. It’s originally developed by the Gentoo people but it’s available on other linux distributions, too. Simply install it by typing your system’s equivalent to
1 # Gentoo 2 emerge keychain 3 # Debian 4 aptitude install keychain
and it’ll be available in no time. To set it up you need to put these two lines in our ~/.bash_profile:
1 keychain ~/.ssh/id_rsa 2 source ~/.keychain/$HOSTNAME-sh
That’s it. The first time you open up a shell keychain will start ssh-agent, prompt you for your keys password and remember the running ssh-agent for all new shells. On your next SSH authentication no more password typing is required. Wasn’t complicated at all, was it?
Extended: Forms with widgets
February 14th, 2008 — Posted by benedikt — Filed in Articles, Javascript
There is a great article by Jason Long on Vitamin called ‘Streamline your forms with widgets’. In his article Jason Long describes a nice looking way to clean up a lot of checkboxes into multiple dropdown widgets. What I really liked was the idea to have some summary about the selected items next to the title of the dropdown widgets. Unfortunately he didn’t implement the updating function but just mentioned it as a possible extension. In addition he pointed out that “Any Fuel” would be much easier to read than “Fuel (Gasoline, Diesel, Alternative)”. As I was in the right mood for some Javascript I implemented the missing functionality.
At first I added four little lines to the top of the toggleDropdown() function. This little snippet checks weather the panel is currently visible (so the function was toggled to hide the panel again) and calls the updateTitle() function.
1 function toggleDropdown(panel) 2 { 3 panel = $(panel); 4 if(panel.visible()) { 5 updateTitle(panel); 6 } 7 8 // toggle the requested one 9 Element.toggle(panel); 10 11 // then hide all of the others so that only 12 // one (at most) is open at a time 13 $$('body .dd_option_panel').each(function(node){ 14 if (node != $(panel)) { 15 Element.hide(node); 16 } 17 }); 18 }
To do the actual updating of the title I used Prototype’s nifty little DOM traversal toolkit. It provides methods such as Element#select(), Element#up(), Element#down(), Element#previous() and Element#next(). All of can be supplied with a selector, similar to those in CSS.
First I select all child elements of type “input” and check their value. If the value matches “on” the checkbox is selected and I travel down to the next “label”-element to push it’s content into an array. Afterwards I check the size of this array and decide how to change the title. If none of the checkboxes are selected I add “No ” to the title and don’t display the list of the selected values. Accordingly if all are selected I prepend “Any ”. Otherwise I leave the title as it is and update the list behind it by joining the elements of the array into a string. To prevent titles such as “Any Any No Any Fuel” I clean up the title by removing either Any or No in front of the title using String#gsub().
1 function updateTitle(panel) 2 { 3 selected = new Array(); 4 panel.select('input').each(function(box){ 5 if(box.getValue() == 'on') { 6 selected.push(box.next('label').innerHTML); 7 } 8 }); 9 10 inner = panel.previous(".inner"); 11 title = inner.innerHTML.gsub(/^([Any|No])/, ''); 12 13 if(selected.length == 0) { 14 inner.update('No ' + title); 15 inner.down(".light").update(''); 16 } else if(selected.length == panel.select('label').length) { 17 inner.update('Any ' + title); 18 inner.down('.light').update(''); 19 } else { 20 inner.update(title); 21 inner.down('.light').update('(' + selected.join(', ') + ')'); 22 } 23 }
In order to get correct titles right from the beginning I update all titles after the page loaded.
1 Event.observe(window, 'load', function(event) { 2 $$('body .dd_option_panel').each(function(panel) { 3 updateTitle(panel); 4 }); 5 });
That’s it! Click here to see the changed example.
Of course all the credits for the original implementation, graphics, and idea go to Jason Long.






