軸はこーしろーからいきますよ

基本的にただの忘備録

rbenvのインストール@ubuntu12.04

rbenvのインストール方法を残しておこうかと
試したのはUbuntu12.04.2上

参考サイト
rbenvで複数のバージョンのrubyを使用する環境を整える - memo.yomukaku.netを参考にさせて頂きました.

背景

RVMってなんか大変だったから.
autolibsがよくわかりません.
僕には難易度が高いようです.

rbenvのインストール

gitで引っ張ってきます.

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv

そしてパスを通したりします.

$ echo 'export PATH=$PATH:$HOME/.rbenv/bin' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ source ~/.bashrc

ruby-buildのインストール

rbenvはrubyのインストールまではしてくれません.
切り替えをしてくれるだけです.
なので自分でrubyのビルドなどしなければいけないのですが,
大変なのでプラグインを使う方法です.
そのプラグインがruby-buildです.

$ git clone git://github.com/sstephenson/ruby-build.git
~/.rbenv/plugins/ruby-build

おk

必要ライブラリのインストール

何もないとgemのインストール時にzlibが云々言われます.
ですんで先にインストールをしておきます.
以前のrvm requirementsコメンドで表示されたものを参考にして以下のものをインス
トールしました.

$ sudo apt-get install build-essensial
$ sudo apt-get install openssl
$ sudo apt-get install libreadline-dev
$ sudo apt-get install zlib1g-dev
$ sudo apt-get install libssl-dev
$ sudo apt-get install libxml2-dev
$ sudo apt-get install libxslt-dev
$ sudo apt-get install ncurses-dev

あとは流れで.

rbenvによるRubyのインストール

rubyのインストールを行います.
rbenvコマンドの使い方は以下のようになります.

インストール

インストールを行う場合例えば以下のようなコマンドを実行します.

$ rbenv install 1.9.3-p392
$ rbenv rehash

rbenv rehashが必要となります.
このrbenv rehashはgemで何かしらをインストールしたあとにも必要となります.
つまりgem install ***してもrehashしないと有効にならない

Rubyのバージョンを指定します.

$ rbenv global 1.9.3-p392

これでruby 1.9.3-p392バージョンのrubyを使えるようになります.
またrbenv localというコマンドでは任意のディレクトリ以下で使用したいバージョン
を指定出来ます.
例えば今1.9.3-p392と2.0.0-p0がインストールされていてglobalに1.9.3-p392が設定さ
れているとします.
つまりこんな状況

$ rbenv versions
* 1.9.3-p392 (set by /home/ooo/.rbenv/version)
  2.0.0-p0

で,~/hoge以下でだけ2.0.0-p0を使いたいとき

$ cd ~/hoge
$ rbenv local 2.0.0-p0

とするとhogeディレクトリ以下では2.0.0-p0を使うようになります.
hogeディレクトリ直下に.ruby-versionなるファイルができていると思います.
このファイルの内容で管理しているようです.
こんなかんじに成るのではないかと思います.

~/hoge$ rbenv versions
  1.9.3-p392
* 2.0.0-p0 (set by /home/ooo/hoge/.ruby-version)

参考までに以下Usage

Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   install     Install a Ruby version using the ruby-build plugin
   uninstall   Uninstall a specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

active recordだけを使ってDB操作

active recordだけを使ってrubyからDBを操作するのを目標とします.
DBはmysqlを使っています.

gemのインストール

bundlerを使ってgemの管理をします.
システムのgemとごっちゃにならないようにパスの指定をして
bundle installしてやります.

まず作業フォルダ内にGemfileを作成し中身を

source 'https://rubygems.org'

gem 'activerecord'
gem 'mysql2'

とします.
そして,

$ bundle install --path vendor/bundle

を実行します.
そうすればvendor/bundle以下にGemfileに記述したgemを置いてくれます.

bundlerが入れたgemを使ってrubyを実行する場合,

$ bundle exec ruby hoge.rb

とすれば良いようです.

参考gem管理の新標準ツール"Bundler"のTips - 昼メシ物語

active recordを使う

適当にDB名:testdb,ユーザ名:testuser,pass:testpassという感じでデータベースがあったとします.

require 'active_record'

class Hoge < ActiveRecord::Base
  attr_accessible :code, :name
end

ActiveRecord::Base.establish_connection(
  :adapter  =>  'mysql2',
  :username =>  'testuser',
  :password =>  'testpass',
  :database =>  'testdb'
)
p fields = Hoge.find(1)

ActiveRecord::Base.establish_connectionで接続を確立します.
:adapterでmysql2としているのは,なんかRailsでそんなのをdatabase.ymlに書いた気がしたから…
その上のクラス宣言はRailsで作成されたmodelをまんま真似した感じです.
別ファイルにしてrequireした方がいいんでしょうね.
まぁとりあえず動きます.

参考RubyのコードからActiveRecordだけを使う方法

crontabからrvmとbundlerを使う

crontabから以上の環境を実行したい場合,
以下のように$HOME/.rvm/scripts/rvmを実行してやるとうまいこと環境変数を読みこんでくれるようです.

* * * * * source $HOME/.rvm/scripts/rvm; rvm your-ruby-version; cd /path-to-project/; bundle exec ruby your-script.rb

なるほど.

参考gem管理の新標準ツール"Bundler"のTips - 昼メシ物語

むすび

定期的にDBにデータを突っ込んでいくってことをしたかったので
rubyを使うならactive recordを使うのが楽なのかなーと.
じゃあbundlerでgemは管理するべきだよねーと.
rails絡み以外で使ったことなかったわー,調べるかー
という背景でした.

rmagickのインストールでのエラー対処

とりあえず環境はUbuntu12.04・Rails3.2.11です.

rmagickのインストールでエラー

gruffを使おうとしたので
Gemfileに

gem 'rmagick'
gem 'gruff'

を追加してbundle installしたところrmagickのところでエラーが出てしまいました.
まぁrmagickのインストールはエラーが出るものみたいな印象.

対処

ImageMagickは前の機会で入れてあったのでそこは置いといて...

前にも同じようなことがあったのでその時の作業ログを見ながら以下を実行しました.

$ sudo apt-get install libmagick9-dev librmagick-ruby

すると”libmagick9-dev”なんぞ無い!と...
で調べていたらそれっぽい感じのことが書かれていそうな気配のところを見つけたので
ruby on rails 3 - rmagick gem install "Can't find Magick-config" - Stack Overflow
とりあえず以下を実行して見ました.

$ sudo apt-get install libmagickwand-dev librmagick-ruby

そして再度bundle install.
そしたら無事インストールできました.
どういう理屈なのかはいつか調べるかもしれないし調べないかもしれないし.

Nginx 504 Gateway timeout

504 Gateway timeoutがでたー!

Nginx+unicorn+rails@ubuntu12.04の(最低限動く)環境構築 - 軸はこーしろーからいきますよの後の話です.
Nginx+Unicorn+Railsでグラフ構造上で色々計算する(ダイクストラ法とか)ツールを
作って実験してたんですが,でかいグラフデータを投げた時にNginxが
タイムアウトしてしまいました.その時にした対処です.

Unicornの設定

とりあえずUnicornの設定を確認して見ました.
そうしたら案の定timeoutまでの時間が60秒に設定されていたので,
600秒に変更.

- timeout 60
+ timeout 600

しかし,状況変わらず.
NginxのはいてるエラーなんだからそりゃNginxの設定も見なおさなければいけないかった…

Nginxの設定

nginx連載3回目: nginxの設定、その1 - インフラエンジニアway - powerd by HEARTBEATSを参考に
設定ファイル(/etc/nginx/nginx.conf)のhttpコンテキスト設定に以下を追加しました.

+ keepalive_timeout 600;

状況変わらず.
そういうことではないみたいです.

つぎに,proxyの設定を追加しました.
さくらVPS 上で Thin で動いている Railsアプリ Gogengo! を Nginx + Unicorn で動かすようにしました(JMeter 負荷テスト付き) - bekkou68の日記を参考にさせてもらいました.

+ proxy_connect_timeout 600;
+ proxy_read_timeout    600;
+ proxy_send_timeout    600;

動いた!
その後httpコンテキストの設定の部分をコメントアウトしても動いたので,
proxyの部分の設定をしてなかったのが悪かったようです.
そんな処理をさせるのがそもそもよくないのかもしれませんがしょうがない...