去年、約80名のエンジニアにご参加頂き、大好評を頂いたこの勉強会。
満を持して第2回を開催することになりました。

楽しい忘年会シーズンを支える食べログ。バレンタインの恋する乙女を支えるクックパッド。
大規模トラフィックを支えるそれぞれのサイトのインフラ戦略、運用テクニックを
現場のエンジニアが発表いたします!

実施内容

■プレゼンテーション

パフォーマンス改善やスケール、分散処理などについて2社のエンジニア計6名がプレゼンいたします。 ※詳細は近日公開予定!

■質疑応答
会場の皆さまから、どんどんご質問をお受けいたします。

■懇親会
プレゼンテーション、質疑応答の後に懇親会を予定しております。
今回は、プロのシェフがクリスマスにちなんだ素敵なメニューをご用意いたします。

当日の詳細

■日時
12/17(木)
19:00-20:30 プレゼンテーション&質疑応答
20:30-          懇親会

■会場
クックパッドオフィス(東京都港区白金台5-12-7 MG白金台ビル5F)
http://info.cookpad.com/location

■費用
無料

■募集人数
30名(抽選)

■募集締め切り
12/14(月)18:00   当選された方には、12/15(火)にご連絡いたします。

申込方法
以下の内容をご記入の上、メールでお申し込みください。

【件名】
勉強会参加希望@クックパッド

【本文】
・お名前
・ご年齢
・勉強会に期待すること
・今はまっていること
・ご自身で作成したサイトURL(あれば)

皆さまのご応募を心よりお待ちしております。

実行委員会一同

はじめまして、技術部の西岡です。

普段の業務では社内システムやサービス開発をメインに行っています。

今年の6月に入社して以来、ひたすら何かを作っているのですが、クックパッドでは自分のやりたいことをベースに業務を決めることができるので、日々、楽しい開発ライフを送れています。

さて、クックパッドには様々な社内システムがあるのですが、その内の1つに全社員の目標を管理できるシステムがあります。このシステムでは、目標と共に顔写真や得意なことを設定する仕組みになっているため、普段あまり関わりのない人が、どのような業務を行っているのかをざっくり知ることが出来ます。

このシステムは私が開発したのですが、開発する際に少し余裕があったことと、個人的に興味があったことから、iPhoneのSafariからも閲覧できるようにしてみました。

残念ながら肝心のシステム内部の話はあまり紹介できないのですが、対応する際に調査したSafariの仕様などについての資料をアップしました。

最後の方にネイティブアプリについての言及があるのですが、先日リリースさせて頂いたクックパッドアプリではUIWebViewは利用せずに全てObjective-Cで開発しています。ここら辺の話もいずれ公開できればと思います。

クックパッドではクライアントアプリからサーバーアプリまで、816万人のユーザの期待を背負ったサービスを開発したいエンジニアを募集しています!

[技術部] webシステムエンジニア
[技術部] サーバシステムエンジニア

こんにちは。クックパッド・イベント担当のスミです。

去る11/20(金)、クックパッドオフィスにて第一回techlifeライトニングトークを開催いたしました。

当日の模様をyoutubeにて公開いたしましたので、ぜひご覧くださいませ。

最初は、クックパッドの佐々木

続いて、GREEのkajidaiさん

3番手は、PFIの太田さん

4番手は、シリウステクノロジーの藤川さん

そしてトリは、浜本階生さん

5名の方のプレゼンに続き、キッチンで懇親会も行いました。

懇親会の途中から、弊社の代表も混ぜて頂き

あちこちで熱~いトークが繰り広げられていました。

お忙しい中ご参加頂いた皆様、本当にありがとうございました!

今後もtechlifeライトニングトークは、テーマを替えて行ってまいります。

次回のテーマは「puppet」 12/3(木)19:00~です。

ご応募を心からおまちしております!

お申し込みはこちらから↓

http://techlife.cookpad.com/2009/10/24/techlife_introduction/

これからもどうぞよろしくお願いいたします。

スミ

IMG_2939

techlifeライトニングトークは、実践的な技術交流のためのイベントです。

毎回テーマを決めて、それについてプレゼンをして頂きます。

・1人5分、参加者全員発表

・LTの内容は動画で公開予定

・あなたのtechlife(技術のある楽しい生活)に役立った内容のみ発表可能

・申し込み人数が10名を超える場合は、抽選とさせて頂きます。

techlifeライトニングトークは、平日19時から!

11/20 分散処理

12/3  Puppet

12/11  Hive

-申込方法

下記項目をご記載の上、mailaddressまでメールをお送りください。

〆切は開催2日前。ご参加頂く方には、詳細のメールを差し上げます。

—————————————————

■タイトル(例えば分散処理の会なら)

「分散処理参加希望」

■本文

・お名前

・ご年齢

・ライトニングトークのおおまかな内容

—————————————————

twitterはじめました!ライトニングトークのテーマ募集中☆

@techlifecookpad

AWKのススメ

2009年10月23日

はじめまして。インフラチームの菅原といいます。

今年の7月に入社してから、コンソールとにらめっこする毎日を過ごしています。クックパッドのようにアクセスの多いサイトのサーバを扱うことが今まで無かったので、いろいろと勉強になることが多いです。

さて、インフラチームではサーバの状況をモニタリングして、サーバに問題がないかを常に把握するようにしています。そのため日常的にtailでログを追いかけているのですが、そんなときはAWKが非常に便利なことに気付き、最近はかなりAWKにハマっています。

今回は絶賛マイブーム中のAWKの活用例をご紹介したいと思います。

なぜAWKなのか?

残念ながらAWKの知名度はあまり高くないようで、社内でも「なぜRubyでやらないのか?」と聞かれることがありました。僕も入社するまではcutの代わりぐらいにしか使っていなかったのですが、あるときログ出力の整形に使って以来、AWKのおもしろさにすっかりハマってしまいました。

AWKの魅力はいろいろとあるのですが、ひとつあげるとすれば「ワンライナーの書きやすさ」です。もちろんRubyでもPerlでもワンライナーは書けるのですが、AWKはさらにワンライナーが書きやすい言語です。

仕事での活用例

普段、僕が仕事で使っているAWKスクリプトをいくつかご紹介します。AWKの文法についてはGNU Awk User’s Guideなどを参照してください。

Railsの500msec以上かかっている処理を追いかける

後からRailsのログを集計してもよいのですが、その場で状況を知りたいときは tail -f と AWK の組み合わせが強力です。次の簡単なAWKスクリプトは、遅くなっている処理をさくっと把握したいときに使っています。

$ tail -f log/production.log | ¥
 awk '/^Completed/{if($3 > 0.5) print }'
Completed in 0.56046 (1 reqs/sec) | Rendering: 0.23351 (41%) ...
Completed in 0.59227 (1 reqs/sec) | Rendering: 0.00010 (0%) ...
Completed in 1.90438 (0 reqs/sec) | Rendering: 1.87990 (98%) ...
...

Apacheの平均応答時間を追いかける

アクセスが多くなると tail -f でaccess_logを追いかけようとしても、流れが速すぎて状況を把握できません。そこでAWKで100リクエストごとの平均応答時間を計算して、現在の応答時間がどのくらいなのかを把握しています。

$ tail -f access_log | awk '
{i++; t+=$4}
i > 100 {
  print strftime("%H:%M:%S"), "|", t / i / 1000, "ms"
  i=t=0
}'
18:58:34 | 97.1538 ms
18:58:38 | 80.6553 ms
18:58:42 | 75.4794 ms

ちなみにクックパッドのaccess_logは以下のようなフォーマットで出力されます。

# ステータス, 時間, 処理時間(マイクロ秒), リクエストuri, パラメータ...
LogFormat "%>s\t%{%Y-%m-%d %H:%M:%S}t\t%D\t%U\t%q..."

上記のスクリプトを少し修正して、単位時間あたりのリクエスト数を出力するようにすると、サービスへどのくらいアクセスがあるのかを把握できるようになります。

[...]$ tail -f access_log | awk '
BEGIN{st=systime()}
{i++}
i > 200 {
  et=systime()
  printf("%s | %.1f req/sec\n",
    strftime("%H:%M:%S"),  i / (et - st))
  i=0; st=et
}'
19:10:45 | 16.8 req/sec
19:10:55 | 20.1 req/sec
19:11:06 | 18.3 req/sec

slow-query.logを追いかける

mysqldumpslowというスロークエリログ用のツールがありますが、その場で状況を知りたいときには tail -f で追いかけるのが手軽です。しかし、そのままでは少々見にくいので、次のようなAWKスクリプトで整形します。

[...]$ tail -f slow-query.log | awk '
/^# Time/ {
  q=substr(q,0,64)
  printf("%s %s %-17s %2d %s\n", d, t, h, s, q)
  d=$3; t=$4
}
/User/ {h=$5}
/Query_time/ {s=$3}
/^[^ ]/ {q=$0}'
091010 17:46:45 [192.168.xxx.xxx]   2 SELECT foo, bar, zoo FROM...
091010 17:55:29 [192.168.xxx.xxx]   3 SELECT foo FROM...
091010 17:56:08 [192.168.xxx.xxx]   3 SELECT foo FROM...

ANSIエスケープシーケンスを使えば、10秒以上かかったクエリだけ赤く表示することもできます。

awk '
/^# Time/ {
  if (s > 9) {
    printf("33[0;31m")
  } else {
    q=substr(q,0,64)
  }
  printf("%s %s %-17s %2d %s\n", d, t, h, s, q)
  printf("33[0m")
  d=$3; t=$4
}
/User/ {h=$5}
/Query_time/ {s=$3}
/^[^ ]/ {q=$0}'

まとめ

今回は、仕事で使っているAWKスクリプトをいくつかご紹介させていただきました。僕もまだAWK初心者なのでお世辞にも洗練されたコードとはいえませんが、それでも非常に役に立っています。
ちなみに、AWKのワンライナーには何か癖になるものがあり、最近はワンライナーばかり書いているので、historyがスクリプトの保存先と化しつつあります。

みなさんもAWKで一行野郎を使いこなしましょう!

おまけ

GNU Awkはソケットが使えるので、カレントディレクトリをDocumentRootとするWebサーバを、ワンライナーで書いてみました。

awk 'BEGIN{s="/inet/tcp/80/0/0";"pwd" |& getline;r=$0;while((s |& getline) >; 0){gsub(/[\r\n]/,"");if($0 ~ /^\s*$/){c="cat " r path;printf "HTTP/1.0 200 OK\r\n\r\n" |& s;while((c |& getline) > 0){print |& s}close(c);close(s)}else if($0 ~ /HTTP/){print;path=$2}}}'

きちんと改行をいれるとこんな感じになります。

awk '
BEGIN {
  s = "/inet/tcp/80/0/0"
  "pwd" |& getline
  r = $0

  while ((s |& getline) > 0) {
    gsub(/[\r\n]/, "")

    if ($0 ~ /^\s*$/) {
      c = "cat " r path
      printf "HTTP/1.0 200 OK\r\n\r\n" |& s

      while ((c |& getline) > 0) {
        print |& s
      }

      close(c)
      close(s)
    } else if ($0 ~ /HTTP/){
      print
      path = $2
    }
  }
}'

AWKを使ったことがなくても、わかりやすいコードではないでしょうか?

GNU Awkのネットワーク機能はとても面白いです。AWKを始めた人には、ネットワーク機能のマニュアルを一読することをお薦めします。