Monday, September 24, 2012

fluentdのインストールと簡単な使い方

fluentdはRubyで書かれたsyslogdのようなロギングミドルウェア。様々なログをネットワーク上で色々ルーティングして、たとえば最終的にMongoDBに登録したりすることができる。

fluentdをインストールして使ってみる。 インストールはgemで一発。

$ gem install fluentd

fluentdを起動するには、作業ディレクトリを作ってコマンドで設定ファイルを作成する。起動はfluentdを-cオプションでキックする。

$ fluentd --setup ./fluent
$ cd fluent
$ fluentd -c conf/fluent.conf

動作確認は別コンソールで次のように打ち込むと、先ほどのコンソールにログが出力される。

$ echo '{"json":"message"}' | fluent-cat debug.test

ここまでは公式サイトと同内容。 次に、テキストファイルをtailのようにウォッチして、fluentdに転送してみる。 conf/fluent.confを次のように記述する。

<source>
  type tail
  path /path/to/test.log
  tag debug.*
  format /^(?<log>.*)$/
</source>

<match debug.**>
  type stdout
</match>

ここで、sourceディレクティブのtagはどのmatchディレクティブにログをルーティングするかを決めるためのキーとなる。RabbitMQのルーティングキーと同じ感じ。formatディレクティブは、出力形式を正規表現で設定する。このとき、マッチした箇所に?<name>で名前を付ける。上記例だとlogという名前にしてる。

この状態でfluentdを起動して/path/to/test.logに追記すると、コンソールにログが出力される。

$ echo test >> /path/to/test.log

Wednesday, September 19, 2012

Rails3のviewで、JavascriptのオブジェクトにRubyのオブジェクトをjson(など)で渡す

Rails3のview(erb)で、Rubyのオブジェクトをto_jsonしたものをJavascriptの変数に設定する際は、html_safeメソッドを使う。
var json = <%= {:foo => "FOO"}.to_json.html_safe %>;

Saturday, September 08, 2012

MacにR + randomForestをインストール

OSX 10.7にRをインストールする。今回はMacPortsを使う。

$ sudo port install R
これでRコマンド(対話型のインタープリター)がインストールされる。終了はq()関数。
$ R
> q()

対話型のインタープリターではなく、ソースをファイルから実行するにはRscriptコマンドを使う。とりあえず引数を出力するサンプルを作ってみる。

# hello.r
arg <- commandArgs(TRUE)
cat("hello", arg, "\n")
実行
$ Rscript hello.r world
hello world

PerlのCPANやRubyのRubygemsのようなパッケージ管理ツールが組み込まれていて、install.packages関数でパッケージをインストールできる(CRANというらしい)。試しに機械学習ライブラリのrandomForestをインストール。

> install.packages("randomForest")

MacPortsでインストールしていると、/opt/local/以下の書き込み権限がないという警告がでるので、今回はコンソールにいわれる通り、~/R/...にライブラリフォルダを作った。途中でTclのダイアログでダウンロード元を選ばされるので、普通に東京を選んだ。

インストールしたライブラリを使うのにはlibrary関数を使う。

> library("randomForest")
randomForest 4.6-6
Type rfNews() to see new features/changes/bug fixes.

その他、参考サイト。

Tuesday, September 04, 2012

RubyでCSVをエスケープして出力

改行を含んだりするカラムがあるCSVを出力するとき、全てのカラムを""で囲んで出力するには:force_quotesオプションを使う。
CSV.open(filepath, "w", :force_quotes => true) do |csv_writer|
  csv_writer << ["出力する文字列"]
end
カラムごとに出力フォーマットを変更する場合は、convertersオプションを利用する。例えば2番目のカラムをテキスト形式で出力する場合は:
converter = ->(field, field_info) {
  case field_info.index
  when 1
    CSV::Converters[:text].call(field, field_info)
  else
    field
  end
}
CSV.open(filepath, "w", :converters => converter) do |csv_writer|
  csv_writer << [1, "出力する文字列"]
end
ここではCSVクラスにデフォルトで用意されているCSV::Convertersにある、文字列用のコンバーターを利用している。

Gitでタグ間の変更量を調べる

たとえばtag_1というタグを打っていて、このタグとHEADとの差分をappディレクトリ以下のみ調べるコマンドは以下。
$ git diff --shortstat tag_1 HEAD ./app
 79 files changed, 2657 insertions(+), 531 deletions(-)
--shortstatの代わりに--statを指定すると、変更したファイルごとの変更量も出力される。