2014年9月15日月曜日

Vagrant起動時に、[Error relaunching VirtualBox VM process: 5]と表示されて起動しない。

本日これで3時間ほど無駄にしたわけですが・・・

結論から言いますと、Windows7+VirtualBoxのバージョン4.3.14で発生します。

なんかアンチウイルスソフトが原因??・・・

対処法は、最新の4.3.16に上げることです。


てっきり仮想マシンがお亡くなりになったと思って、泣く泣く再構築したのですが、結果症状変わらず・・・・








俺の休みが・・・・・



俺的メモ:RailsでCronで動かすバッチ処理を書きたい。でもActiveRecordは使いたい。

RailsなWebアプリケーションフレームワークでcronで動かす前提なバッチ処理プログラムを書くという変態奇特な方がいらっしゃったのでメモ。

【Rails】バッチ処理を実装したいけどActiveRecordを中で使ったりもしたいし


RAILS_ROOT/lib/tasks/直下にdel_user.rbってな感じで作成する(実は/lib配下ならどこでもいい)
実行は

rails runner Tasks::DelTmpUsers.execute

な感じ。
クラス名は、/lib/に作成したディレクトリ名の先頭大文字にしたもの::Hogehogeって名前にしないといけない。

例えば、/lib/crontask/hogehoge.rbに配置したら、
クラス名は
Crontask::Hogehoge
になる。

注意点は、モデルクラスの読み込みはされないので、使うモデルはrequireしないといけない。

Railsのテストサーバ(WEBric)はシングルスレッド?!

このところ、Rails漬けな生活を余儀なくされつつあって、四苦八苦しながら日々少しづつ山を崩していますが、地味にハマったのでメモ。

Railsな人には常識なのかもしれませんが、Railsの開発サーバである、WEBrickは、実はシングルスレッドで動作しているので、同時に複数のリクエストを処理できません。

なお、当然これはWEBrickの制約なので、Rails自体がマルチスレッドで動作しないわけではありません。

簡単に実験してみました。(Ruby 2.1.2 + Rails4)

rails g controller test1 index
rails g controller test2 index
っと、2つページを作成し、test1のindexアクションにこんな感じでスリープを入れます。


class Test1Controller < ApplicationController
  def index
    sleep(30)
  end
end

rails s
でWEBrickを起動し、localhost:3000/test2/indexにアクセスします。
普通にtest2のページが表示されるはずです。
では、その状態で別のブラウザまたは別のタブを開いて、localhost:3000/test1/indexにアクセスします。

開くのに30秒ほどかかるはずです。

では、test1にアクセスして、読み込み中のときに、test2を開いてみましょう。
おそらくtest2も応答待ちになったと思います。

ちなみに、Productionモードで起動しても同じでした。

開発用簡易サーバということで、あまり負荷がかかるのを想定されていないのでしょうが、
コントローラに重いトランザクション処理をさせて、別ブラウザで他のページを参照するテストが全く動かなくて焦りました・・・
(RubyというかRails的には、そもそも長時間サーバを専有するようなコードは書くべきではないし、やるなら別スレッドで非同期処理しろってことなんでしょうけど。)

なお、Apache+Passengerの環境では、普通にマルチスレッドで処理されるので、上記のような問題はありませんでした。

開発サーバでもマルチスレッドで動作させたい場合は、unicornなどを使用すると良さそうですが、
開発マシンのメモリがガシガシ食われるのでvagrant環境だとちょっと厳しい。