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
無事成功!
しかし、かなりのパワープレイでした。
もっと勉強しないとだめですね;