2014年9月23日火曜日

Ruby on Rails4 で バッチ処理をする(rails runner, whenever)

railsのコマンドでrunnerというコマンドがある
例)
rails runner Tasks::AlertTask.execute
これを利用します。

crontabへの登録はcrontab -eで手書きすることもできるが、モジュール管理もできるのでrubyで書く方法をためします。

・バッチモジュール作成
> vim config/application.rb
config.autoload_paths += %W(#{config.root}/lib) # 追記する
バッチクラス作成
> vim lib/tasks/alert_task.rb
class Tasks::AlertTask

  def self.execute
    puts "Hoge"
  end
end

ちゃんと作成出来たかを確認する。
> rails runner Tasks::AlertTask.execute
Hoge

・スケジュール登録(crontabへの登録手順)
> vim Gemfile
gem 'whenever', :require => false # 追記

> bundle install

config/schedule.rbを作成
> wheneverize .

> vim config/schedule.rb

set :output, "log/cron_log.log" # ログファイルパス
set :environment, :development # 実行環境
every 1.day, :at => '5:00 am' do # 毎日5時に実行
  runner "Tasks::AlertTask.execute" # 実行するタスク(lib/tasks/alert_task.rbのexecuteメソッドを実行)
end

crontab登録
> bundle exec whenever -update-crontab

crontab確認
> crontab -l

もし、実行されなかった場合。
パターン1:
bin/rails:7: undefined method `require_relative' for main:Object (NoMethodError)
と表示される場合はrubyが複数存在する可能性があります。下記にて不要なrubyを消しましょう。
> yum remove ruby

パターン2:
/usr/bin/env: ruby: No such file or directory
と表示される場合は下記を実施。
> vim ~/.bashrc
export PATH=/usr/local/bin:$PATH

2014年9月3日水曜日

JavaScriptで数値の桁あふれでハマった・・・

お好きなブラウザで確認できるので、一度試してみるといいかもしれません。

ブラウザの開発者ツールでコンソールを表示し、下記を入力して下さい。
var i = 1118918899790958592;

この数値がiという変数に格納されていると思いますよね。
では、そのままコンソールでiを出力してみてください。
> var i = 1118918899790958592;
> i
1118918899790958600
んっ!!!!!
ということで、10の位で丸められていますね。。。
どんな桁落ちだよ。

通常こんなでかい数字を扱うことはないと思うのですが、今回利用していたAPIの戻り値がJSONでそのID的なものが数値型でこの桁数という・・・。
やられたわー。
4時間くらい楽しんでしまった・・・。