zakki-cho

インプットしたらアウトプットする。アウトプットすることを考えてインプットする。

MongoDBのAggregation Frameworkを学ぶ

最近、MongoDBのAggregation Frameworkを使い始めたので、備忘録としてエントリーを書いていきたいと思います。

Aggregation Frameworkについてはこちら。
http://docs.mongodb.org/manual/applications/aggregation/

まずは、サンプルデータをインポートします。

# サンプルデータのダウンロード
$ curl -O 'http://media.mongodb.org/zips.json'
# learnデータベースのzipsコレクションにインポート
$ mongoimport -d learn -c zips zips.json
# インポートされてるのを確認
$ mongo learn
> db.zips.findOne()
{
	"city" : "ACMAR",
	"loc" : [
		-86.51557,
		33.584132
	],
	"pop" : 6055,
	"state" : "AL",
	"_id" : "35004"
}

tailプラグインのformatを書く上で最低限知っておきたいこと

tailプラグインを使う場合に、apacheやsyslogといった既存のフォーマットを使うのではなく、自分でカスタムしたフォーマットを使う際には、最低限知っておきたいと思ったのは以下の2点です。

  • エスケープ処理
  • 後方参照を伴わないグループ化

エスケープ処理

参考にさせていただいたページはこちらです。

パターンの中のエスケープ処理
http://www.rubylife.jp/regexp/ini/index5.html

以下の記号を使う場合には、エスケープ処理が必要となります。

\ * + . ? { } ( ) [ ] ^ $ - | /

fluentdの公式ページのドキュメントにあるapacheのフォーマットはこちらになります。
ところどころでエスケープ処理をしているのが分かります。

format /^(?[^ ]*) [^ ]* (?[^ ]*) \[(?

「"」(ダブルクォーテーション)は、上記のエスケープ処理が必要となる記号の中に含まれていませんが、 [^\"] のように書いても問題ないようです。
エディタによっては、"に囲まれた部分の色を変えてくれたりするので、こうしておくと見やすくなります。

"(?[^\"]*)"

後方参照を伴わないグループ化

自分は正規表現について詳しくなく、これを知らなかったのでかなり混乱しました。

(?: 〜 )

参考にさせていただいたページはこちらです。

正規表現
http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fregexp.html

後方参照を伴わないグループ化の説明は上記のページにある通りですが、要はただ括っているだけです。それだけです。


この エスケープ処理 と 後方参照を伴わないグループ化 の2つがわかると、公式ページにあるapacheとsyslogのフォーマットがわかるようになるかも?

MacにGrowthForecastをインストールしようとしてはまる

MacにGrowthForecastを導入しようとしたところ、Alien::RRDToolをインストールしようとしたところではまりました。

SoftwareDesign 6月号にある通りに、まずプラグインを一通りインストールしたあとで、Alien::RRDToolをインストールするために以下のコマンドを実行。

$ cpanm Alien::RRDTool

すると、こんなお叱りが、

! Finding Alien::RRDTool on cpanmetadb failed.
! Finding Alien::RRDTool on search.cpan.org failed.
! Finding Alien::RRDTool () on mirror http://www.cpan.org failed.
! Couldn't find module or a distribution Alien::RRDTool ()

どうしたもんかと思っていたら、以下のページに解決方法がありました。
参考にさせていただいた記事はこちら。

GrowthForecast つかってみた
http://d.hatena.ne.jp/magicalhat/20120403/1333435826

動いた手順はこちら。

$ git clone git://github.com/kazeburo/GrowthForecast.git
$ cd GrowthForecast
$ cpanm -l extlib --installdeps .
$ cpanm -l extlib Alien::RRDtool

ちなみに、cpanmの-lオプションは、モジュールをインストールするディレクトリの相対パスを指定するようです。
GrowthForecast/extlibディレクトリに依存ライブラリやRRDToolをインストールしています。

そして、無事起動。
fluentdからgrowthforecastプラグインを使ってデータを渡してみよう。

Ubuntuにfluentdをインストールしようとしてつまづく

Ubuntuにfluentdをインストールしようとして、次のコマンドを実行。

$ gem install fluentd

すると、次のようなエラーが。

/home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- zlib (LoadError)
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems.rb:540:in `gunzip'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/remote_fetcher.rb:239:in `fetch_path'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/spec_fetcher.rb:269:in `load_specs'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/spec_fetcher.rb:231:in `block in list'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/spec_fetcher.rb:227:in `each'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/spec_fetcher.rb:227:in `list'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/spec_fetcher.rb:150:in `find_matching_with_errors'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/spec_fetcher.rb:177:in `find_matching'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/commands/query_command.rb:116:in `execute'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/commands/search_command.rb:27:in `execute'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/command.rb:278:in `invoke'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/command_manager.rb:147:in `process_args'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/command_manager.rb:117:in `run'
from /home/hoge/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/gem_runner.rb:65:in `run'
from /home/hoge/.rbenv/versions/1.9.3-p194/bin/gem:21:in `

'

解決方法を探してみるとすぐに発見。
http://stackoverflow.com/questions/769496/ubuntu-noob-rails-install-fails-on-zlib

$ rvm pkg install zlib

しかし、怒られる。

zsh: command not found: rvm

インストールしてませんでした。

ということで、rvmをインストール。

$ gem install rvm

だめでした。

ERROR: Loading command: install (LoadError)
cannot load such file -- zlib
ERROR: While executing gem ... (NameError)
uninitialized constant Gem::Commands::InstallCommand

もっと根っこの部分でだめですね。

探してみると同じ文句を言われた方がおられました。
Ubuntu に ruby をインストールして zlib がないと文句を言われる
早速、zlib1g-devをインストール。

$ sudo aptitude install zlib1g-dev

そして、いざ。

ERROR: Loading command: install (LoadError)
cannot load such file -- zlib
ERROR: While executing gem ... (NameError)
uninitialized constant Gem::Commands::InstallCommand

はい。
rbenv使っている場合は何かしないとダメなのかな?

探してみると、参考になるページがありました。
rbenvでインストールしたRubyのgemコマンドがzlib云々ほざいて動かない時の対処法
ということで、rubyを再インストール。
rbenvで再インストールする方法が分からなかったので、とりあえずもう一度インストールしてみる。

$ rbenv install 1.9.3-p194

fluentdをインストール。

$ gem install fluentd

無事成功!

しかし、かなりのパワープレイでした。
もっと勉強しないとだめですね;