2013/12/08

CentOS に rbenv で ruby2 と Rails4 の環境を構築する

最近、立て続けに似たような環境を構築したので、まとめます。キモは CentOS 6.4 に rbenv で ruby 2 の Rails 4 、 PostgresqL9 環境の構築です。

CentOS 6.4 のインストール

仮想マシン上に構築します。ホストOSは、Windows7 です。VMware で、32bit 版です。
OS のインストールは、特にこれといって特別なことはありません。ただ、後でいろいろなものを追加インストールするのが面倒なので、インストールタイプは Software Development Workstation にしています。

ひと通りインストールが済んだら、作業ユーザを sudo に追加します。

# visudo

workuser  ALL=(ALL)  ALL

あとで必要になるパッケージをインストール

$ sudo yum install git make gcc-c++ patch libyaml-devel libffi-devel libicu-devel zlib-devel readline-devel

PostgreSQL のインストール

既に古いバージョンの PostgreSQL がインストールされていますので、削除します。

# yum list installed | grep postgres

見つかったものを削除

yum remove postgresql.i686 postgresql-libs.i686

最新版を取ってきます。

# wget -P /tmp http://yum.postgresql.org/9.3/redhat/rhel-6-i386/pgdg-centos93-9.3-1.noarch.rpm

ここでは 32bit 版をインストールしています。

# rpm -ivh /tmp/pgdg-centos93-9.3-1.noarch.rpm

# yum install -y postgresql93-server postgresql93-devel postgresql93-contrib

データベースの初期化

# /etc/rc.d/init.d/postgresql-9.3 initdb

サービスの開始

# /etc/rc.d/init.d/postgresql-9.3 start

自動起動に登録

# chkconfig postgresql-9.3 on

確認します

# su - postgres

$ psql

psql (9.3.2)
"help" でヘルプを表示します.

postgres=# \l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |      アクセス権      
-----------+----------+------------------+-------------+-------------------+-----------------------
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
(3 行)

postgres=#

rbenv のインストール

インストール用のスクリプトを作ります。

※この方法、ググって調べて真似しています。どこのサイトだったか失念してしまいました。元作者の方、ごめんなさい、そしてありがとうございます。

 $ vi rbenv-install.sh

内容は

 MY_GROUP="workuser"
if [ "$MY_GROUP" = "" ] ; then
    echo '!!! undefined variable MY_GROUP.'
    echo '!!!'
    echo '!!! ex.) MY_GROUP=staff'
    echo '!!!'
    exit 1
fi

cd /usr/local
git clone git://github.com/sstephenson/rbenv.git rbenv
mkdir rbenv/shims rbenv/versions
chgrp -R $MY_GROUP rbenv
chmod -R g+rwxX rbenv

git clone git://github.com/sstephenson/ruby-build.git ruby-build
cd ruby-build
./install.sh

echo 'export RBENV_ROOT="/usr/local/rbenv"'     >> /etc/profile.d/rbenv.sh
echo 'export PATH="/usr/local/rbenv/bin:$PATH"' >> /etc/profile.d/rbenv.sh
echo 'eval "$(rbenv init -)"'                   >> /etc/profile.d/rbenv.sh


ファイルのパーミッションの変更

$ chmod 755 rbenv-install.sh

実行

$ sudo ./rbenv-install.sh

これ一発でインストールは完了します。

$ rbenv -v
rbenv 0.4.0-75-gbe5e1a4

インストール可能な ruby を一覧表示

$ rbenv install -l

$ sudo yum install openssl.i686 openssl-devel.i686 openssl-static.i686

rbenv 経由で ruby をインストール

$ rbenv install 2.0.0-p353

このマシンで使用できるように設定

$ rbenv global 2.0.0-p353
$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [i686-linux]

$ gem update --system
$ gem install bundler
$ gem update

httpd のインストール


$ sudo yum install httpd httpd-devel curl-devel

$ chkconfig /etc/init.d/httpd
$ sudo chkconfig httpd on
$ chkconfig --list httpd
httpd              0:off    1:off    2:on    3:on    4:on    5:on    6:off

 $ sudo /etc/rc.d/init.d/httpd start

iptables で 80 番を許可する

$ sudo vi /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

$ sudo /etc/init.d/iptables restart

ブラウザでアクセスすると Apache の初期画面が表示される。

Passenger のインストール

# gem install passenger
# passenger-install-apache2-module

設定ファイルを作成
# vi /etc/httpd/conf.d/passenger.conf

内容はいかの3行
LoadModule passenger_module /usr/local/...
PassengerRoot /usr/local/rbenv/...
PassengerDefaultRuby /usr/local/rbenv/...


同様に
# vi /etc/httpd/conf.d/rails.conf

以下の文字列
   <VirtualHost *:80>
      ServerName www.example.com
      # !!! Be sure to point DocumentRoot to 'public'!
      DocumentRoot /somewhere/public   
      <Directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
      </Directory>
   </VirtualHost>

作業ユーザに戻って

$ mkdir www
$ cd www

ここに Rails の環境を構築します。

$ bundle init

$ vi Gemfile
rails のコメントを外す。

rails の環境をインストール
$ bundle install --path vendor/bundle --without production

$ bundle exec rails new . --skip-bundle --database=postgresql

$ vi Gemfile
gem 'therubyracer' のコメントを外す。

$ bundle config build.pg --with-pg-config=/usr/pgsql-9.3/bin/pg_config
$ bundle install --path vendor/bundle

一旦、SELinux を解除します。最後に設定します。
$ sudo setenforce 0

$ sudo /etc/rc.d/init.d/httpd restart

$ chmod 755 /home/workuser/

データベースの設定をします。

$ vi config/database.yml

 データベースの生成権を与えます。
$ su - postgres
$ createuser -d workuser

本来のユーザに戻って
$ createdb

SELinux の設定変更

必要なパッケージをインストールします。
# yum install policycoreutils-python

# grep httpd /var/log/audit/audit.log | audit2allow -M passenger

# semodule -i passenger.pp

SELinux を有効にします。
# setenforce 1

# /etc/init.d/httpd restart

長い・・・

書き足します。

実行モードが production になっているので development に変更

 $ sudo vi /etc/httpd/conf.d/rails.conf

 <VirtualHost *:80>
   ServerName www.example.com
   # !!! Be sure to point DocumentRoot to 'public'!
   DocumentRoot /somewhere/public
   <Directory /somewhere/public>
      # This relaxes Apache security settings.
      AllowOverride all
      # MultiViews must be turned off.
      Options -MultiViews
   </Directory>
   RailsEnv development
</VirtualHost>

ページをひとつ、作ってみる

$ bundle exec rails g controller welcome index

$ touch tmp/restart.txt

ブラウザでアクセスしてみる
http://192.168.xxx.xxx/welcome/index


走らなかったら、SELinux を一旦切ってみる。で、走れば SELinux の再設定。

# setenforce 0

ブラウザでアクセスして走ることを確認

再設定
# grep httpd /var/log/audit/audit.log | audit2allow -M passenger
# semodule -i passenger.pp
# /etc/init.d/httpd restart
# setenforce 1

これで終了。

2013/11/02

paperclip の、サイズの指定方法

paperclip を使って画像を扱っているのですが、サイズ指定でこんがらがってきたのでまとめ。

環境

CentOS 6.4
ruby 2.0.0p247
Rails 4.0.0
rbenv 0.4.0-67-g3300587

">" を使った時は、縦横比が崩れずに指定枠内に全部が収まる。
"#" を使った時は、縦横比が崩れずに指定枠内に収めるが、はみ出た部分はカットされる。

2013/07/20

年齢計算

普段は PostgreSQL を使っています。自前のアプリケーション「個人データ管理システム Zebra 」でも使用しています。で、よく年齢計算なんかをしたりします。

通常は、何歳ということで「年」だけを取ってくればいいのですが、よくばって「月」まで計算しようとしています。PostgreSQL の場合は以下。

年をとるには
select extract(year from age(now(), '1960-8-22'))
月をとるには
select extract(month from age(now(), '1960-8-22'))

と、PostgreSQL の age() 関数にバリバリ、頼っているわけです。

で、ここからが本題。SQLite3 だったらどうしよう。


残念ながら age() 関数はありません。できることなら SQL 文一発で解決したいものです。そこで次のような SQL 文をいろいろググりながら作り上げました。

SELECT
  ((strftime('%Y%m%d', 'now')-strftime('%Y%m%d', birthday))/10000) AS Age,
  case
    when (strftime('%m', 'now') - strftime('%m', birthday)) < 0 then 12 + (strftime('%m', 'now') -   strftime('%m', birthday))
    else (strftime('%m', 'now') - strftime('%m', birthday))
  end as Month
from
  members

ちょっと「月」の部分の出方が違っていますが、解釈の違いということで。