二足歩行への一歩

技術者のハイハイの記録

jenkinsでFindBugsを実行した際に行数がうまく表示されない場合

少し枯れた話題ですが、 調べても情報がなかったので。

javaのプロジェクトを行っていると、 FindBugsを定期的に実行して、 コードレビューを効率化、というのは割と良くある事だと思います。

で、antタスクなりmavenなりでFindBugsが実行できて、 Jenkinsおじさんが青信号を返してきてくれました。 なのに下の画像のように行数が-1になってしまうという現象についてです。

f:id:kan_high:20130327195613j:plain

ここが正しく認識されると、 Jenkins上から警告されているソースの場所を確認でき、 大変便利になります。

原因は、javaソースのコンパイル時にdebug情報(ソースの行数等)、 を含めていなかった事にありました。 リリースするビルドの場合、 debug情報を含めるべきではないと思うのですが、 そのままでは上記の現象が発生します。

antの場合は、 build.xmlのjavacの要素に、 debug="on" を追加するだけでOK!

シンプルな問題でしたがなかなか解決されず放置になっていました。 ご参考までに。

mongodbを使ったRailsアプリをunicorn×nginxで動作させる

結論から言うと、mongoDBは関係ない。 もちろん、mongoDBのO/Rマッパーであるmongoidも。

unicorn×nginxという構成について情報は非常にたくさんありますが、 結局どういう仕組みなのかいまひとつピンときませんでした。

要は、当たり前っちゃ当たり前なのですが、 nginxがリバースプロキシサーバ兼WEBサーバとして、 unicornが稼働しているポートに振り分ける、 そういう設定をしてあげればOKでした。

下記は本件に関して大変わかりやすいGist。 https://gist.github.com/FoboCasteR/3811810

rails sidekiqでバックグラウンドジョブ管理②

railsのバックグラウンドジョブ実行をsidekiqで実現する第2回。

本日はWorkerを作成する所からです。

本家では

Add a worker in app/workers to process messages asynchronously:

といっておりますので、 とりあえずappフォルダ以下にworkersという階層を作ります。

そして同階層にhogeWorker.rbを適当に作って(本家より引用)、

class HardWorker
  include Sidekiq::Worker
    def perform(name, count)
    # do something
  end 
end

といった形でクラスを作ります。

do something

にやらせたい処理を書いて下さい。

putsは実行するとsidekiqコンソールに表示されるので、 実際に動いているか確認する事が可能です。

で、ここまで整えば、後は呼ぶだけです。

    $rails c
      >HardWorker.perform_async

と実行すると、sidekiqが動いてくれます。 perform_asyncを呼ぶとperform内で定義した処理を、 ジョブ実行する感じです。

Workerは4種類のオプションをもっています(また本家引用)

    class HardWorker
      include Sidekiq::Worker
      sidekiq_options :queue => :crawler, :timeout => 60, :retry => false, :backtrace => true

      def perform(name, count)
      end
    end

:queue は実行時のキューを指定できます。defaultは'default'です。 :timeout はキューでの待ち時間です。defaultはnil。動作的には無制限っぽいです。 :retry はジョブ失敗時にリトライするかどうかです。defaultはtrue。 :backtrace はエラー時のバックトレースを表示するかどうかっぽいです。

次は実際に蹴ってみてWEBUIで確認してみるところを。

rails sidekiqでバックグラウンドジョブ管理①

railsでジョブ管理を行いたかったため、 sidekiqを使ってみました。

参照 http://railscasts.com/episodes/366-sidekiq?language=ja&view=asciicast

こちらが本家 https://github.com/mperham/sidekiq/wiki

本家のHOMEにはこのように書いてあります。


It is very efficient because it is multi-threaded. Instead of using 20 processes, you just have one process with 20 threads. Yes, you will see a big improvement, even with Ruby 1.9's GIL.


訳: ハイ!エンジニアのみんなこんにちは。今日は僕が作ったとっておきのGEMを紹介するぜ! こいつがどんなものか知りたいかい!?君はとっても欲しがりさんだね。言いだろう教えてあげるよ! これはマルチスレッドでとっても効果的なんだ。 20のプロセスのかわりに、20スレッドの、たったひとつの、たったひとつの、たっっっったひとつのプロセスができるだけなんだよ!
こいつはとっても大きな改善さ!ruby1.9のGIL(グローバルインタプリタロックの略なんだぜ!こいつのせいでシリアライズされてたんだ)でもね。

どうしてこんなにもノリノリなリリースが出せるのか日本人の私にはわかりませんが、
これがきっとあちらのやり方なのでしょう。

例によってまずは書いてある通りに。

Gemfileに

gem 'sidekiq'

を記載して

\$ bundle install

を実行します。
これでgemがインストールされました。

また、sidekiqはredis(詳細はこちら:http://redis.io/ )
を使っているため、redisもインストールします。
MacOSXの場合はHomebrewを使って、

\$ brew install redis \$ redis-server /usr/local/etc/redis.conf

で、デフォルトポート6379でredisが動作しはじめます。

次はワーカーを登録します。

いったんここまで。

railsで復号可能な暗号化の実装

ほぼ下記サイト掲載情報のままですが、

https://gist.github.com/etorov/1104121

http://mono-comp.com/programming/rails-web-appli-register/

今回使っているのはAES256という暗号方式です。 AES方式の鍵長が256ビットとの事。 14ラウンド。ボクシングよりちょい長いですね。強度は十分。 鍵長がのびるとラウンドが増え、 暗号の強度は増しますが、処理に時間がかかるようになるとの事。

さて、実装ですが、

これを例えばlib以下に配置して、 modelで、

といった具合に適切なタイミングで呼び出してあげればOK

コールバックメソッドと組み合わせる事で、 ソース上の独立性を担保して実装できそう。

mongoidとactiverecordが併存する場合のmigration

mongoidとactiverecordが併存する場合で、

mongoidを優先させていると、

rails generate等のコマンド発行時にmongoidで解決しようとする。

このため、通常は、

rails g migration AddHoge

等で解決できるが、mongoidにそんなのないよ、

   error  mongoid [not found]

と怒られるので、明示的に、

rails g active_record:migration AddHoge

とする事で解決できる。

active_recordと間にアンダーバーが入るので注意。