Rails 環境調査

最近Ruby on Railsの面白さにハマり、いろいろネットで情報を収集しています。
皆さん様々な環境やサーバソフトウェアの組み合わせで試みているようですね。
今回はRailsアプリケーションを動かす環境について、自分なりのまとめです。

httpサーバ

  • lighttpd
その名の通り、「軽い」httpサーバ。また、安全で柔軟性もあるとされる。
Apacheとのベンチマーク比較でも、同等かわずかに上回るパフォーマンスとのこと。


  • Mongrel
Rails アプリケーションサーバ。Java世界で言うところの、Jakarta Tomcat。
RubyとCの拡張ライブラリで書かれている。
Apacheをリバースプロキシとして動作させ、Railsアプリはmongrel_cluster(負荷分散や複数のRailsアプリを動作させるためのMongrelプロセス複数起動)という役割で利用されることが多い。


  • WEBrick
Rubyに標準添付されているhttpサーバソフトウェア。
公式ページにはhttpサーバ構築のためのライブラリと記されている。主に開発用に使用する。

WEBrick is a Ruby library program to build HTTP servers.

via: RAA – webrick

実際にWEBrickでhttpプロキシサーバを作るチュートリアルがこちらに載っている。


httpサーバと組み合わせるモジュール

  • FastCGI
CGIはクライアントからhttpリクエストがある都度プロセスを立ち上げ、レスポンスを返した後にそのプロセスを落とす。このオーバーヘッドを無くそうとしたものがFastCGI。FastCGIによって起動されたCGIプログラムはHTTPDプロセスとは別に起動するが、CGIの処理が終了してもプロセスは残る。そのプロセスを使い回すことでパフォーマンスの向上が図れる。
こちらにより詳細な解説があります。


  • Passenger(mod_ruby)
RailsアプリケーションをApache上で動作させるためのモジュール。PHPでいうところの、mod_php。これがあればMongrelやWEBrickは不要。パフォーマンスにおいてもMongrelより(ちょっと)早いらしい。

passenger_mongrel_thin_benchmark.png 画像は公式サイトより。
インストール方法など詳細な解説はこちら


まとめ

最近リリースされたPassengerが一番手軽そうですが、信頼性についてはまだまだ未知数です。

Shindig (PHP版)を動かしてみる

Shindigとは、OpenSocialとGoogleGadgetの仕様に準拠したオープンソースのサーバソフトウェアです。Apache Software Foundation内で開発が進められています。

  • Gadget Container JavaScript — core JavaScript foundation for general gadget functionality. This JavaScript manages security, communication, UI layout, and feature extensions, such as the OpenSocial API.
  • Gadget Server — an open source version of Google’s gmodules.com, which is used to render the gadget XML into JavaScript and HTML for the container to expose via the container JavaScript.
  • OpenSocial Container JavaScript — JavaScript environment that sits on top of the Gadget Container JavaScript and provides OpenSocial specific functionality (profiles, friends, activities, datastore).
  • OpenSocial Gateway Server (does not yet exist in the repository) — an implementation of the server interface to container-specific information, including the OpenSocial REST APIs, with clear extension points so others can connect it to their own backends.
via: What is Shindig?

Shindigを動作させる事によって、自分のWebアプリケーション上でGadgetをホスティングでき、さらにOpenSocialアプリケーション機能を提供できます。
今回はShindigのダウンロードからPHP上で動作させるまでをやってみました。


ソースをダウンロード

$> mkdir -p ~/src/shindig
$> cd ~/src/shindig
$> svn co http://svn.apache.org/repos/asf/incubator/shindig/trunk/ .
しばらくするとダウンロードが完了します。最新のリビジョンは 644261 でした。


Webサーバに配置
$> cd /Applications/xampp/xamppfiles/htdocs
$> ln -s ~/src/shindig/php/gadgets .


サンプルGadgetを動かす
Webサーバを起動し、http://localhost/gadgets/ifr?url=http://www.labpixies.com/campaigns/todo/todo.xml にアクセスすると、、
1.png ガジェットコンテナは動いているようです。

iGoogleのようにガジェットを表示させるサンプルです。
pic2.png

OpenSocial Gadgetを動かす

http://localhost/gadgets/files/samplecontainer/samplecontainer.html

こちらのサンプルはOpenSocialがジェットのデモです。起動時にエラーダイアログが表示され、動いてくれませんでした。ソースを見る限り、ViewerとOwnerが “Hello” と言い合う(?)もののようです。

pic6.png

まとめ
Java版しか動かないと思っていましたが、PHP版も開発が進んでいるようです。早くすべての機能を試したいですね。

Rubyでデザインパターン -Command-

最近Rubyを勉強してます(遅いって?)。Rubyのソースを見る度に、なぜか受け付け難い雰囲気を感じていたのですが、最近会う人会う人がRuby(on Rails)で開発しているよ的な発言をされているので、やむにやまれず触発された感じです。

言語学習はやっぱりコード書かなきゃと思いましたので、ここに晒す次第です。あまりデザインパターンに意味はありません。

クラス図

class.png

CommandExecutor.rb

class CommandExecutor
def initialize
@commands = Array.new
end
def setCommand cmd
@commands << cmd
end
def execute
@commands.each do |cmd|
cmd.execute
end
end
end


AbstractCommand.rb
class AbstractCommand
def initialize
@option     = '';
@command    = '';
end
def execute
%x{@command};
end
def setOption opt
@option = opt
end
end


CurrentDirCommand.rb
require 'AbstractCommand.rb'
class CurrentDirCommand < AbstractCommand
def initialize
@command = 'pwd';
end
def execute
STDOUT << %x{#{@command}}
end
end


ListCommand.rb
require 'AbstractCommand.rb'
class ListCommand < AbstractCommand
def initialize
@command = 'ls';
end
def execute
if @option.nil? then
cmd = @command
else
cmd = @command + @option
end
result = %x{#{cmd}}.split(/\n/)
STDOUT << result.join("\n") + "\n"
end
end


MakeDirCommand.rb
require 'AbstractCommand.rb'
class MakeDirCommand < AbstractCommand
def initialize
@command = 'mkdir';
end
def execute
if @option.nil? then
cmd = @command
else
cmd = @command + @option
end
STDOUT << %x{#{cmd}}
end
end


main.rb
#!/usr/bin/ruby
require 'CommandExecutor'
require 'ListCommand'
require 'CurrentDirCommand'
require 'MakeDirCommand'
# コマンド実行オブジェクトを new
executor = CommandExecutor.new
# pwd コマンド追加
pwd = CurrentDirCommand.new
executor.setCommand pwd
# lsコマンド追加
ls = ListCommand.new
ls.setOption ' -lk'
executor.setCommand ls
# mkdir コマンド追加
mkdir = MakeDirCommand.new
mkdir.setOption ' tmp'
executor.setCommand mkdir
# 全部実行
executor.execute
exit

呼び出し制限がJavaとは異なっていて、いまいち理解できてません。

でも細かいとこですが、括弧やセミコロン省略できるだけでも、よりプログラムの本質に集中できるというかタイピング数が少なくなるせいか、生産性は高いかもしれません。

どなたかこのソースに突っ込んでください。

Page 3 of 812345...Last »