Ruby アプリケーション


## Ruby インストール

参考：[CentOS5.5にRuby 1.9.3をインストール](http://blog.nownabe.com/?p=18)

### 必要なパッケージをインストール

rubyソフトをrpmで管理するために、checkinstallをインストールする。

````
# wget http://packages.sw.be/checkinstall/checkinstall-1.6.0-3.el4.rf.x86_64.rpm
# rpm -ivh checkinstall-1.6.0-3.el4.rf.x86_64.rpm
# yum -y install zlib-devel openssl-devel readline-devel \
libxml2-devel bzip2-devel libjpeg-devel libpng-devel \
freetype-devel libyaml-devel libffi-devel
````

### rubyをインストール

rubyをrpmで管理する。

````
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p448.tar.gz
# cd ruby-1.9.3-p448
# ./configure
# make
# /usr/sbin/checkinstall --fstrans=no
# rpm -ivh --nodeps --nomd5 /usr/src/redhat/RPMS/x86_64/ruby-1.9.3-p448-1.x86_64.rpm
````

## apache 設定変更

参考：[Rubyインストール](http://www.server-world.info/query?os=CentOS_5&p=httpd&f=13)

.rb の読込み設定を追加する。

```/etc/httpd/conf/httpd.conf
~
# Rubyスクリプトとして扱う拡張子を追記
# Rubyスクリプトも拡張子「.cgi」とするなら追記の必要なし
AddHandler cgi-script .cgi .pl .rb
~
````

apache を再起動。

````
# /etc/init.d/httpd restart
````

## Sinatra インストール

Ruby用のWebアプリケーションフレームワーク Sinatra を利用する。

````
# gem install sinatra
````

### Hello World を出力

Hello World を出力する main.rb をサーバ内の任意の場所に作成する。
2行目の set :environment, :production は外部からアクセスするために必要。
実行時にオプションをつけてもよい。(-e production)
[Sinatraがデフォルトでは外部から繋がらなくなってたよ](http://qiita.com/u1_fukui/items/b86b21f6ed39f4c10d5d)

```rb:main.rb
require 'sinatra'

set :environment, :production

get '/' do
  "Hello,World."
end
````

以下のコマンドで main.rb を実行。

````
$ ruby main.rb
````

http://ホスト名:4567 にアクセスすると、"Hello World" が出力される。
表示されない場合は、iptables の設定を見直す。



## mysqlを使う

ruby-mysql インストール (ver 2.9.11)

````
# gem install ruby-mysql
````

ruby-mysql 2.9.11 では mysql のパスワードタイプが古いと mysql に接続できないので、mysql でユーザーのパスワードを新しいタイプに変更する。

```mysql
SET PASSWORD FOR 'ユーザー' = PASSWORD('パスワード')
FLUSH PRIVILAGES
````

HTTPリクエストのパラメータを取得して、DBを検索する Sinatra のアプリケーションは次の通りである。

http://192.168.0.242:4567/ruby_test
のURLでGETリクエストができる。パラメーターは ?id1=102 など

```rb:ruby_test.rb
require 'sinatra'
require 'mysql'
require './content.rb'

set :environment, :production

get '/ruby_test' do
  gid1 = params[ID1].to_i
  gid2 = params[ID2].to_i

  if !(gid1 == 0) && !(gid2 == 0) then
    'NG 301'
  elsif gid1 == 0 && gid2 == 0 then
    'NG 302'
  elsif !(gid1 == 0) then
    if MIN <= gid1 && gid1 <= MAX then
      my = Mysql::new(HOST, USER, PASS, DB)
      selectSql = 'SELECT * FROM ' + TB + ' WHERE ' + ID1 + ' = ' + gid1.to_s + ';'
      res = my.query(selectSql)
      ret = ''
      res.each_hash do |row|
        id1 = row[ID1]
        id2 = row[ID2]
        letter = row[LET]
        ret = ID1 + ':' + id1 + ' ' + ID2 +  ':' + id2 + ' ' + LET +  ':' + letter
      end
      ret
    else
      'NG 303'
    end
  elsif !(gid2 == 0) then
    if MIN <= gid2 && gid2 <= MAX then
      my = Mysql::new(HOST, USER, PASS, DB)
      selectSql = 'SELECT * FROM ' + TB + ' WHERE ' + ID2 + ' = ' + gid2.to_s + ';'
      res = my.query(selectSql)
      ret = ''
      res.each_hash do |row|
        id1 = row[ID1]
        id2 = row[ID2]
        letter = row[LET]
        ret = ID1 + ':' + id1 + ' ' + ID2 +  ':' + id2 + ' ' + LET +  ':' + letter
      end
      ret
    else
      'NG 303'
    end
  else
    'NG 304'
  end
end
````