2014年11月28日金曜日

rbenvの環境でcronでrakeタスクを動かしてはまった

rakeタスクを作って、localでも動いたし、staging環境で手動で動かしても動作したのに、
cronで実行させると動かなくてはまったときの話です。

まずは手動で動かすために以下のようなコマンドを手動で実行しました。
bundle exec rake aaa:bbb
とりあえず動きはしたものの、staging環境の設定で動きませんでした。
調べたところ、RAILS_ENV=stagingをつける必要があるようです。
bundle exec rake aaa:bbb RAILS_ENV=staging
手動で動いたのでcronを以下のように設定しました。
crontab -l
0 * * * * cd /home/xxx/app && bundle exec rake aaa:bbb RAILS_ENV=staging
時間が来てうまく動かなかったので調べたところ、PATHにrbenv/shimsが入ってないようでした。
cronでrbenvのrubyを使うのにはいくつか方法があるようですが、
他の環境や設定に影響を与えない/bin/bash -lc 'コマンド'でやることにしました。
0 * * * * /bin/bash -lc 'cd /home/xxx/app && bundle exec rake aaa:bbb RAILS_ENV=staging'

RAILS_ENVのところは環境別に書きかわるようにしたかったので、
crontabにつらつら書くのではなくてシェルを作って動的に変わるように対応しました。


参考URL
http://pentan.info/ruby/ror/rake_list.html
http://blog.livedoor.jp/sonots/archives/33204053.html

2014年11月21日金曜日

nginxのログ出力場所変えたらローテートされなくなった

CentOS6.5にyumでnginxを入れたのですが、
アクセスログの出力場所をデフォルトから変更したら、
ログのローテートがされなくなったので調べました。

デフォルトではローテートがちゃんとされていました。
# ls -ltr /var/log/nginx/
-rw-r----- 1 nginx adm 44342 11月  5 15:23 2014 access.log-20141106
-rw-r----- 1 nginx adm   821 11月  5 18:27 2014 error.log-20141106
-rw-r----- 1 nginx adm  7828 11月  6 03:30 2014 access.log-20141105.gz
-rw-r----- 1 nginx adm    81 11月  6 03:30 2014 error.log-20141023.gz
-rw-r----- 1 nginx adm     0 11月  6 03:30 2014 error.log
-rw-r----- 1 nginx adm     0 11月  6 03:30 2014 access.log

デフォルトから変更したら、ローテートされなくなりました。
# ls -ltr /data/test/log/
-rw-r--r-- 1 nginx root    5568410 11月  6 10:06 2014 access.log

どこでローテートの設定をしてるのか調べたところ、ここでした。
# cat /etc/logrotate.d/nginx 
/var/log/nginx/*.log {
        daily
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 640 nginx adm
        sharedscripts
        postrotate
                [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
        endscript
}

結局logrotate側を書き換えるのも嫌だったので、ログの出力をデフォルトに戻しました。

参考URL
http://oki2a24.com/2014/07/24/logrotete-settings-of-nginx-installed-with-yum/

2014年11月10日月曜日

rubyのcryptではまった件

公式ドキュメントにも書いてあるんですけど、はまったので載せておきます。。。
文字列を暗号化したかったのでcrypt使ってたら、違う文字列なのに同じ結果になってしまいました。

試したrubyのバージョンはこれです。
$ ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]

まずはcryptつかったコード。
salt = 'qwlkjrklajfkajsfkljalkfjalksjflak'
 
str1 = '12345'
str2 = '100000001'
str3 = '100000002'
 
puts str1.crypt(salt)
puts str2.crypt(salt)
puts str3.crypt(salt)

実行するとこんな感じになります。
$ ruby test.rb 
qwAFWgKJ1g.E2
qw2y5TDILwIcA
qw2y5TDILwIcA

公式のドキュメントを見てみると、cryptは先頭8文字の内容で暗号化を行うようです。
なので、この場合はDigest使うとよいみたいです。
require 'digest'
 
str1 = '12345'
str2 = '100000001'
str3 = '100000002'
 
puts Digest::MD5.hexdigest(str1)
puts Digest::MD5.hexdigest(str2)
puts Digest::MD5.hexdigest(str3)

実行するとこうなりました。
$ ruby test.rb 
827ccb0eea8a706c4c34a16891f84e7b
d69d3401d01a8ceed4549434e5ad9f40
5a5ea04157ce4d020f65c3dd950f4fa3


参考URL
http://docs.ruby-lang.org/ja/2.1.0/method/String/i/crypt.html
http://ruby-doc.org/stdlib-2.1.0/libdoc/digest/rdoc/Digest.html

2014年11月3日月曜日

railsのbefore_actionでconcernのmoduleに引数を渡す件

railsのbefore_actionでconcernのmoduleメソッドに引数を渡したいので調べました。

railsのバージョンはこれで試してます。
$ bundle exec rails -v
Rails 4.1.5

controllerとmodule
・controller抜粋
include UserAgent
    before_action -> {user_agent_check(request.headers[:HTTP_USER_AGENT])}

・module
module UserAgent
  def user_agent_check(user_agent)
    puts "____#{user_agent}____"
  end
end 

検証にjavaのクライアントで実行したので、ログに以下が表示されました。
ログ
____Apache-HttpClient/4.3.3 (java 1.5)____

before_actionにはブロックを渡せるのでそれを使って引数を渡す形です。

参考URL
http://o.inchiki.jp/obbr/213