Mac開発環境まとめメモ(主にVim)
Vim
- Macのctagsは古いので、brew install ctagsして新しい方をctagsのaliasとして登録しておく
- scalaはctagsに対応していないので別途~/.ctagsに記述が必要
- ctags -R `pwd`としないと相対パスになってしまう
- scalaのクラスライブラリのところでctagsした後、プロジェクトホームでctagsする際は、aオプションで追記モードにすることを忘れずに
- ctags -aR
- unite-tagsを入れておこう
- lightline入れる
- 挿入モードを抜けると自動的にIMEをオフにする
KeyRemap4MacBookのprivate.xml編集
<?xml version="1.0"?> <root> <list> <item> <name>LeaveInsMode with EISUU (Terminal)</name> <identifier>private.app_terminal_esc_with_eisuu</identifier> <only>TERMINAL</only> <autogen>--KeyToKey-- KeyCode::JIS_EISUU, KeyCode::JIS_EISUU, KeyCode::ESCAPE</autogen> </item> </list> </root>
zshでCtr-aが効かなくなっていた件
全く同じ悩みを抱えていた人が!
http://d.hatena.ne.jp/sotarok/20080926/1222368908
なんとなくoh-my-zshを入れた辺りで効かなくなったような気がする・・。
はっきり覚えてないので気のせいかも。
地味にイライラしていたので本当なおってよかった。
GitHubのリポジトリを他のアカウントに移動
EMRで利用する際のログについて
nginxのltsv形式のアクセスログをfluentd経由でS3に保存すると、type fileで出力したものと同じで、以下のようなフォーマットとなる。
日付 タグ jsonフォーマットのデータ
実際にはgzに圧縮されて。
S3のデータをインプットにEMR(hive)で計算しようにも使いづらい印象。
というのは、いろんなサイトで見かけるサンプルはたいていtsv形式のものをS3に保存してあって、それをインプットに計算するというものが多いからだ。
・・・うーん、うーん、と困って色々見ていたところ、以下のサイトを発見し、このフォーマットでも問題ないことが分かった。
http://memocra.blogspot.jp/2012/12/emr.html
LATERAL VIEW json_tuple関数で、JSONをパース分割すると通常のカラムとしてSELECTできます。
具体的には以下のような感じ。
SELECT dt,host,user,method,path,code,size,referer,agent FROM fluentLog LATERAL VIEW json_tuple(fluentLog.json, 'host', 'user', 'method', 'path', 'code', 'size', 'referer', 'agent') j AS host,user,method, path, code, size, referer, agent
※fluentLogは事前に定義済み
これこれ!
これが知りたかったんです。すっきりしました。
あとこちらも参考にさせていただきました:http://takemikami.com/technote/archives/877
ag(the Silver Seacher)
インストール
EC2のAmazon Linuxにインストールしてみました。
yum installでさくっと入るとよかったんですが、見つけられなかったのでソースから。
$ git clone git://github.com/ggreer/the_silver_searcher.git
agの場合は、build.shが用意されているのでそれを実行。
$ ./build.sh
で、エラー。
./build.sh: line 16: aclocal: command not found
インストールする。
$ sudo yum install automake
エラー。
No package 'libpcre' found
インストールする。
$ sudo yum install pcre pcre-devel
エラー。
No package 'liblzma' found
インストールする。
$ sudo yum install xz xz-devel
やっとビルドされました。
$ sudo cp ag /usr/bin/
nginxのaccess.logをfluentdでS3に格納するまで
俺俺メモです。
環境
- EC2 (Amazon Linux AMI 2013.03.1 64bit)
- nginx 1.2.9(ソースコンパイルはせずにyum install nginxで入れたもの)
- fluentd 0.10.33(td-agentを利用。s3プラグインは最初から入っていたものをそのまま利用)
※nginxもfluentdも同一EC2インスタンス上で稼働
nginx
ログフォーマットをLTSVに変えました。それだけ。
/etc/nginx/nginx.conf
log_format ltsv "time:$time_iso8601" "\thost:$remote_addr" "\txff:$http_x_forwarded_for" "\tmethod:$request_method" "\tpath:$request_uri" "\tstatus:$status" "\tua:$http_user_agent" "\treq_size:$request_length" "\treq_time:$request_time" "\tres_size:$bytes_sent" "\tbody_size:$body_bytes_sent" "\tapp_time:$upstream_response_time"; access_log /var/log/nginx/access.log ltsv;
fluentd
いきなりS3にアウトプットせずに、まずはファイルにアウトプットする。
/etc/td-agent/td-agent.conf
<source> type tail path /var/log/nginx/access.log tag nginx.access pos_file /tmp/td-agent/nginx.pos format ltsv </source> <match nginx.access> type file path /var/log/fluent/access_log #path /tmp/fluent-test.log </match>
うまくいったのを確認して、S3にアウトプットする設定に変更。
<source> type tail path /var/log/nginx/access.log tag nginx.access pos_file /tmp/td-agent/nginx.pos format ltsv </source> <match nginx.access> type s3 aws_key_id [アクセスキー] aws_sec_key [シークレットキー] s3_bucket [バケット名] s3_endpoint s3-ap-northeast-1.amazonaws.com path logs/ buffer_path /var/log/fluent/s3 time_slice_format %Y%m%d-%H # time_slice_wait 10m flush_interval 5s utc </match>
アクセスキーとシークレットキーというのがどこから取ってきたらよいのかよく分からなかったので記録。
- AWSのトップページにアクセス。
- 画面右上の「アカウント/コンソール」から「アカウント」を選択。
- 画面左のメニューから「セキュリティ証明書」を選択。
- 以下に表示されている「アクセスキーid」と「シークレットアクセスキー(「表示」をクリック)」がそれ。
あとハマったのはバケット名のところ。
既に登録していたS3のバケット名を入れていたのにうまくいっていなかった。
というかエラーメッセージはアクセスキーやシークレットキーがおかしいと言っていたのでなかなか気付けなかった。
以下、エラーメッセージ。
2013-06-22 13:51:11 +0000 [error]: unexpected error error="aws_key_id or aws_sec_key is invalid. Please check your configuration"
2013-06-22 13:51:11 +0000 [error]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/fluent-plugin-s3-0.3.1/lib/fluent/plugin/out_s3.rb:162:in `rescue in check_apikeys'
2013-06-22 13:51:11 +0000 [error]: /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/fluent-plugin-s3-0.3.1/lib/fluent/plugin/out_s3.rb:160:in `check_apikeys'
・・・略・・・
rubyのコードを読んでてなんとなく、バケット名を既存のものではなく存在しないものにしたらどうなるんだろう?と思ってやったら、その場合は新たにバケットを作るようだった。
def ensure_bucket if !@bucket.exists? if @auto_create_bucket $log.info "Creating bucket #{@s3_bucket} on #{@s3_endpoint}" @s3.buckets.create(@s3_bucket) else raise "The specified bucket does not exist: bucket = #{@s3_bucket}" end end end
/usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/fluent-plugin-s3-0.3.1/lib/fluent/plugin/out_s3.rb
実際、「Creating bucket.....」のログが出てたわ。
んで、そのようにしたら急にエラーが出なくなって、その新しく作ったバケットにログが出力されるようになりましたとさ。
・・・何が悪かったのか結局よくは分からなかったけど、とにかくこれで動いた。S3に保存された!