読者です 読者をやめる 読者になる 読者になる

Qiita

最近はQiitaでScalaネタで書いています。


mtoyoshi - Qiita

Mac開発環境まとめメモ(主にVim)

Vim

  • 挿入モードを抜けると自動的に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のリポジトリを他のアカウントに移動

前提

  • 業務用のコード管理にGitHubを利用
  • Microプランに申込み、Privateリポジトリを3つ利用
    • ちなみにMicroプランではPrivateリポジトリは5つまで利用可能
  • 転職に伴い移管が必要になった

別アカウントの作成

  • 引き継ぐ人にアカウントを作ってもらう
  • Microプランに申し込んでもらう
  • もともと利用していたのと同じ名前でリポジトリを作ってもらう
  • リポジトリのCollaboratorsに登録してもらう

移管作業

  • 旧環境からgit cloneする。
  • リポジトリその1にて、以下のコマンドを実行

git remote add origin2 git@github.com:NEWACCOUNT/repository1.git

  • 現在のブランチ(おそらくmasterのはず)をプッシュ

git push origin2 master

※あとはブランチを切り替えてpushしたりtagをひたすらpushするのみです

最後に

  • Collaboratorsから削除してもらう
  • リポジトリを破棄する

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/

使い方

$ ag [OPTIONS] PATTERN [PATH]

※PATHを指定しなければカレントディレクトリから再帰的に調べる。

エスケープ

$ ag 'z\.sh'

全文検索せずファイル名の一致を検索

$ ag -g abc.txt

よく使うのが、ドットフォルダ(.vimとか.sshとか)以下も含めて検索させるというもの。

$ ag --hidden -g 'powerline\.conf'

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>

アクセスキーとシークレットキーというのがどこから取ってきたらよいのかよく分からなかったので記録。

  1. AWSのトップページにアクセス。
  2. 画面右上の「アカウント/コンソール」から「アカウント」を選択。
  3. 画面左のメニューから「セキュリティ証明書」を選択。
  4. 以下に表示されている「アクセスキー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に保存された!