Cygwinでssh-addできないときは

Cygwinで普通にssh-addしようとすると…

$ exec ssh-agent /usr/bin/bash
$ ssh-add .ssh/id_dsa
Could not open a connection to your authentication agent.

こうなるはず。

こんなときは、もう一つCygwinを立ち上げ、そちらで

$ ssh-agent -d
SSH_AUTH_SOCK=/tmp/ssh-hOgehoGe/agent.8956; export SSH_AUTH_SOCK;
echo Agent pid 8956;

とやって、表示されたのを「元のターミナルで」実行してやればOK。

$ SSH_AUTH_SOCK=/tmp/ssh-hOgehoGe/agent.8956; export SSH_AUTH_SOCK;
$ ssh-add .ssh/id_dsa
Identity added: .ssh/id_dsa (.ssh/id_dsa)

(ソース:ssh-add / ssh-agent issue | The STAR experiment)
いわゆる、バッドノウハウ

CakePHPとXAMPPとEGit、おまけでDropbox

こんな要件で開発するための環境構築について。

  • 複数開発者/拠点で開発したい
  • でも非公開にしたいのでGithubは使いません
    • 有料プランにすれば?というツッコミは華麗にスルー
  • (Cake)PHPで手っ取り早く開発したい
  • GUI(Windows, Eclipse)でなんとかなりませんか?

開発ツールのインストール

Pleiades All in One のPHP版がオススメ。これ一つに、XAMPPもEGitも入っています。まさに"All-in-One"!
Eclipse 日本語化 | MergeDoc Project

公開リポジトリの作成

まず、Gitの公開リポジトリDropbox上に作成します。もちろん、一プロジェクトに付き一つ作成するだけでOKです。

手順

1. Dropbox上に公開リポジトリ用のフォルダを作成し、他の開発者(Dropboxアカウント)と共有します。
2. EclipseのGitリポジトリー・エクスプローラーに、3つのGitリポジトリーアイコンが並んでいます。「このビューへ既存のローカルGitリポジトリーを追加」("緑"のプラス記号付き)、「Gitリポジトリーを複製し、このビューへ追加」("青"い矢印付き)、「Gitリポジトリーを作成し、このビューへ追加」("黄"のプラス記号付き)です。このうちの"黄"アイコンを押します。
3. 親ディレクトリーは手順1で作成したフォルダを指定します。名前(リポジトリー名)は".git"という接尾語(?)を付けるのがお約束だそうです(例:"hoge.git")。
4. "Bareリポジトリーとして作成"にチェックを入れ、「完了」を押します。

開発用リポジトリの作成

次に、開発用のリポジトリを作成します。一人/一拠点目とそれ以降とですべきことが変わります。

共通の手順(1)

1. "HOME"環境変数を設定します。この環境変数Cygwinのホームディレクトリを示すので、すでに設定されている場合は変更しない方が吉です。そうでない場合は、"C:\Users\(あなたのユーザ名)\git"あたりがいいでしょう。

一人/一拠点目の手順

2. もう一度"黄"アイコンを押します。今度は親ディレクトリーにHOMEで設定したディレクトリが表示されるはずです。
3. 名前(例:"hoge")を付けて「完了」を押します。"Bare〜"にチェックは入れません。
4. CakePHPをダウンロード、解凍します。
5. エクスプローラ等で、中身を3のステップで作成されたhogeフォルダにコピーします。フォルダ構成は以下のようになります。

- git\
 - hoge\
  - .git\
  - app\
  (以下略)

6. Eclipseで表示をリフレッシュすると、コピーしたファイルが表示されます。
7. ".gitignore"を編集し、app/tmp(必要であれば、app/Configも)を削除します。
(参考: CakePHPで作成したアプリをGitにコミットするときの注意点 - TODO: ブログの名前を考える)
8. 開発開始前のCakePHPをいったんコミットします。

それ以降の人/拠点の手順

2. "緑"アイコンを押し、リポジトリを複製(取得)する。
3. ロケーションは「ローカルファイル...」を押して、Dropbox上に同期された公開リポジトリ(hoge.git)を選択する。
4. その他の項目を適切に選択し、「完了」を押すと C:\Users\(あなたのユーザ名)\git にリポジトリが複製される。
5〜8. なし

共通の手順(2)

9. コマンドプロンプトを管理者権限で起動し、\xampp\htdocs にシンボリックリンクをはる。

c:\pleiades-*\xampp\htdocs>mklink /d hoge C:\Users\(あなたのユーザ名)\git\hoge
hoge <<===>> C:\Users\(あなたのユーザ名)\git\hoge のシンボリックリンクが作成されました

(参考: memorycraft: FuelPHPってなんじゃ?(Eclipseとxamppでローカル開発編))
10. XAMPPを起動し、localhost/hoge が表示できることを確認する。


試行錯誤しながらだったので実際上記の通りには作業してないけど、これが最短距離、のはず。(え

fluent-plugin-mysql で time を insert する

UNIX/Linux歴が浅い自分にとって、awk等でログ解析をするのは結構壁が高い。ということで、Fluentdとそのプラグイン(GitHub - tagomoris/fluent-plugin-mysql)に飛びついたのだが、一つ残念だったのが

TODO: implement 'time' and 'tag' in key_names

なところ。
これを何とかしてみた。

1. MySQLに取り込める形で日時を出力する

標準の"%t"はFluentdに(?)先に取られてしまってどうにもならないので、MySQL出力用に「もう一つ」日時を出力しておく。datetime型に突っ込むことを想定して、フォーマットを指定しているところ("%{[%Y-%m-%d %H:%M:%S]}t")がポイント。

  LogFormat "\"%{X-Forwarded-For}i\" %l %u %t %{[%Y-%m-%d %H:%M:%S]}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined-elb
  CustomLog log/acces_log combined-elb

2. td-agent.confの修正

送信側
# vi /etc/td-agent/td-agent.conf

<source>
  type tail
  path /usr/local/apache2/logs/access_log
format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] \[(?<strtime>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
time_format %d/%b/%Y:%H:%M:%S %z
#  format apache
  tag apache.access
  pos_file /var/log/td-agent/apache.pos
</source>

(参考資料:http://fluentd.org/doc/plugin.html?#tail)

受信側
# vi /etc/td-agent/td-agent.conf

<match>
  type copy
  <store>
    type file
    path /var/log/apache/access_log
  </store>

  <store>
    type mysql
    host localhost
    database your_db_name
    username your_user_name
    password your_password
    key_names host,user,method,path,code,size,referer,agent,strtime
    table access_log
    columns host,user,method,path,code,size,referer,agent,created
# not used    flush_intervals 5s
  </store>
</match>

上記設定中に出てくる"created"はdatetime型。

このやり方で、無事アクセス日時の保存に成功^^

ELB使用時にリモートホストのIPアドレスを取得する

ApacheのLogFormatを"common"とか"combined"に指定した状態で、Elastic Load Balancer(ELB)による負荷分散を行うと、ログ(%h)にはELBのIPアドレスが残る。
“本物の”リモートホストを取得したいときは、httpd.confに以下のような設定を行う。

  LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined-elb
  CustomLog log/acces_log combined-elb

(ソース:Ken's Blog: Amazon ELB - Capturing Client IP Address)

沖縄アンカンファレンス#0

先日の沖縄アンカンファレンス #0 : ATNDに参加してきました。
スライドを作成しなかったのでEmbedできるものはありませんが、やったのはこんなネタ。

開発者と心理学

開発者に必要な知識は技術以外にもいっぱいあるよねということで、Webサービスに関するブログ等で時々出てくる心理学的なキーワードを幾つかあげてみました。
どんなキーワードだったかは参加者だけの秘密(もったいつけるほどのものではありませんが)。

クラウドルネサンス

実はこんなしゃれた(?)タイトルを付けてたのですよ!1ラインしかなかったので、きっと誰も気にしなかったと思うけど。

これは「一般ユーザのレベルまでクラウドが降りてきたら、どんなもの(サービス)になるだろう?」という問を投げて、参加者の皆様から私が教えてもらうという何とも俺得なセッション。
お礼代わりに、ここにまとめてみます。

  • 新しいデプロイ形態が生まれる
    • 過去:CDからインストール → 現在:サーバにデプロイ → 未来:ユーザが所有するクラウドにデプロイ
    • 個人情報をサービス運営者に渡さずにすむ!
    • クラウド内での通信(P2P on Cloud)
    • 自分(のサーバ)がどんな情報を受け付けるか/提供するかのディレクトリサービス or APIが必要になるんだろうね
  • 次世代ライフログ・サービス
    • 自動的にロギングされる
      • 例1.メガネ型の端末から利用者の見た映像が転送され、クラウド上で解析・記録される
      • 例2.自動販売機等で商品を購入すると、その情報が購入者のサーバに送られる
    • リコメンドがさらに的確に!


こんな感じで、一人で2本もやってしまいました。空気なんて読まない!やったもの勝ち!

ものさし

何かを計るとき、基準となる「ものさし」って大事だなあというお話。自分には、良く使うものさしが二つある。


一つは、某ソーシャルゲームにおける自分の成績。
ほぼサービス開始時からプレイを始めて、「無課金〜微課金で結構がんばってプレイしている社会人」で通してきた。当初はそれでも総合個人成績10,000位前後にいたが、「ユーザー数100万人突破!」という文句が躍る頃には50,000位くらいになっていた。「招待特典で釣ったところで、そんなユーザ、定着しやしないだろ」という意見の"大部分は"正しい。しかし、自分より上のユーザ≒課金ユーザの数を確実に底上げしたことも確かだ。
個人的には、ソシャゲの勢いは今がMAXだと思っているが、それはこの指標を今後も追っていけば自ずと明らかになるだろう。


もう一つは、某プロダクトの商標。
こいつは本当に優秀で、そのプロダクトが"本当に"成功しているのかを検証するのにもってこいだ。
IT系のニュースだったり講演だったりでは「こんなプロダクト/サービスが成功しています」という話が非常に多い。しかし、自分はその名前を聞いたことすらないということも非常に多い。そんなとき、単に自分が無知なだけなのか?それとも単に誇張されているだけなのかを見極めるために使う。具体的には、両者の名前を Google Insights for Search に放り込んで比較する。プロダクト/サービスの成功〜衰退と検索回数の遷移は高い相関関係にあるという理屈だ。
某プロダクトが優秀なのは以下の点にある。

1. それがブレイクしていないことを知っている
だから、これとどっこいどっこいのレベルであれば、それは(少なくとも今は)ブレイクしてないと言い切れる。ビジネスとして実際どの程度の規模なのかも知っているということだ。

2. 一時期、ちょっと話題になった
そのプロダクトは、昔ちょっとだけ注目を集めたことがある。自分がそのプロダクトを知ったのも、そのときだ。しかし、新しい技術情報を積極的に収集してない(と自分が認識している)技術者は知らない。その程度にバズったとき、どこまで数値が上がるかがはっきりしている。


私のことを知っている人には、私がどんなキーワードをものさしに使っているか分かるかもしれない。すごく興味深い結果が出るから一度試してみることをおすすめしたい(笑)。
そうでない人は、自分が勤めている会社名をものさしにするといいと思う。

node-decorate を作って感じたこと

今回の開発で一番おおっと感心したのは、Node.js(だけではないけど)のエコシステム、特に"npm周り"でした。
まず、install 一発でいろいろな機能(モジュール)が使えるようになるところ。package.json(Mavenのpom.xmlのようなもの)に依存関係が書いてあり、足りないものがあれば自動的に読み込んでくれます。
そしてこの package.json に然るべき情報を書いておくと、npm publishでリポジトリに登録できるところ!新しいモジュールを手軽に登録できることで機能が充実し、また別の開発者を引き寄せるというわけですね。素晴らしい!

Githubもそうですが、最近の開発は「複数の開発者がいかに協力するか」が重視されているし、それはとても良い傾向だと感じます。