#ISUCON 2013に参加しました

ISUCON2013 に参加したやったこととか感想とか。 @w650、@nobu_ohtaとチームを組んでの参戦。 横浜会場の様子です #isucon pic.twitter.com/M7F9yac21o — NAGATA Hiroaki (@handlename) 2013, 10月 5 DS置いてあるけど狩りに行ってたわけじゃないです。 あ、始まる前は狩りに行ってたけど始まってからは行ってないです。 さっきHR51になりました。 最終的な構成 perlアプリ + nginx + mysql + redis memcachedを使っていると思ったら実は使ってなかった。 やったことを覚えている範囲で書いてみましょうか。 git とりあえずサーバー上にgitリポジトリを作る。 各自このリポジトリからcloneして、変更を加えたらpushする、とういうやり方にした。 スコアが下がる変更を入れてしまった場合にもすぐに以前の状態に戻せて便利。 post-recieve hookをいじって、pushと同時にアプリの再起動をするようにしていたけど、 ベンチを走らせている時にうっかりpushして502が出る事故が何度かあったので 結局後半はhookをつかわなかった。 apache - nginx apacheは最近全く触っていなかったので、勝手のわかるnginxに置き換え。 もしかしてLuaを使って高速化できるんじゃないか? ということでわざわざopenrestyを入れなおしたけど、やっぱり使わなかった。 アクセスログの解析 nginxのアクセスログをtailしつつベンチマークを回して、 一度のベンチマークでリクエストされるURLをチェック。 $ cat access.log | perl -nE 's!/\d+!/__id__!g; say $_' | perl -nE '/"((:?GET|POST) \S+)/; say $1' | sort | uniq -c | sort -nr 3076 GET /js/jquery.min.js 3076 GET /js/bootstrap.min.js 3076 GET /css/bootstrap.min.css 3076 GET /css/bootstrap-responsive.min.css 2482 GET /memo/__id__ 2430 GET / 1150 GET /recent/__id__ 384 POST /signout 382 POST /signin 382 POST /memo 382 GET /signin 382 GET /mypage 集計結果を見て、 GET /memo/__id__ GET / GET /recent/__id__ を重点的に攻めることに。 各テーブルのインデックス WHERE句に指定されているのにインデックスが張られていないカラムにインデックスを追加。 ここは @nobu_ohta におまかせだったので追加でどこにはたのかは把握してない。 ORDER BY created_date - ORDER BY id created_dateとidの並び順が同じだったので、ORDER BYの対象をidに変更。 stringよりintの方がソートは速かったはず。 slow logの解析 my.conf の long_query_time=0.1 にして、 吐かれたslow logをpt-query-digestにかけてチェック。 GET / と GET /recent/:page で呼ばれるmemosを取ってくるクエリの、 SELECT * FROM memos WHERE ... »

Author image handlename on #event,

YAPC::Asia Tokyo 2013に参加してきた

参加するのは今回で4回め。 今回はスピーカーとしての参加だった トークのページ 40分枠なのに30分ではなす内容は終わってしまったけど、質問をたくさんもらえたので命拾いした 自分が所属しているプロジェクトのこと(=自分が直接関わった物以外も含まれる)をはなすのであれば、もっと事前の準備をしておくべきだった 自分が直接関わったものであれば、どんな質問にも答えられるはず・・・ 浅く広くはなすとまとめるのがむずかしい 次はなすときは自分が作ったものについて深堀りしよう! 開発フローやマネジメントについてのはなしがためになった @onishi さんの はなし / 昼過ぎレビュータイムいいなー @myfinder さんの はなし / 「増やせば速くなるような仕組みを作っておく」 後夜祭のテーブルがやたらと豪華だった (@miyagawa さん、@charsbar さん、@inao さん、 @gfx さん、@akiym さん) FreakOutの方やmixiの方とも話せてよかった (主にテストの話) 運営の方々、スピーカーの方々、参加者の方々、みなさまお疲れ様でした。 @lestrrat さん、@941 さんが運営から引退されるということで、来年以降はどうなるんでしょうね。 »

モダンPHP勉強会 #2 に行ってきた

昨日グリー株式会社であったモダンPHP勉強会でメモったことへのひとり突っ込み。 引用部分がそのときのメモ、その下が見返したときの感想です。 Twig by @cocoitiban ZyngaではPHP5.3は1年ほど案件で使ってる 特にトラブルなし[2010.12.19 9:10 追記] Zyngaさんの社名をタイポしていたので修正しました。 以降は細かい変更点に対応するのが大変そうですが、新規案件なら問題なさそうですね。 今のところCentOSではじめから入っているPHPは5.1.6なので(たしか)、どうせ5.2にアップグレードするなら5.3にしてしまってもいいのかもしれません。 クロージャ使いたい。 Smaryが高速なのはキャッシュしてAPCに載っけてるから 最近のPHPはテンプレートエンジン使ってない ->テンプレートエンジンはモダンじゃない? 議論が一周してテンプレートエンジンが使う傾向に 便利で早くて綺麗でなくてはならないプログラマーからすると素のPHPをテンプレートに使うのは何でもできてとても便利なんですが、逆に何でもできすぎて本来テンプレートに書くべきでない処理まで書いてしまうことがありますよね。 テンプレートエンジンを使えば強制的にViewとControlerが分離されるので、使った方がいいのかもです。 Twig by Fabien テンプレートの継承をサポート 動的に継承元を切り替えられる おととい(12月16日)0.9.10になった 相当活発に開発されてる 後方互換ののない変更もたくさん Changelogおもしろいよ!Changelogって、自分が使っているものがアップデートされたときにしか見てないです…。 確かに読んどくと制作者の意図が読み取れていいのかも。 今までのテンプレートエンジンはレイアウトとパーツの2階層 継承部分をフレームワーク側で制御していた Twigは多段継承ができる レイアウトのパターンをより細かく分けることができるViewの操作はViewで行うってことですね。 多段継承できると大きめのサイトをつくるときに便利そうです。 ダミーテンプレートで開発することができる デザイナーと完全分業できるこれはいい! デザイナーがちょこっとHTMLをいじってそれをサーバーに反映してまたちょっといじって…。なんて操作は時間の無駄きわまりないですからね。 デザイナー側で XAMPPとかで単純なPHPが動く環境を作ってテンプレートの動作環境だけ確保 → ダミーのテンプレートを動かしながらデザイン調整 という流れ…ですよね? 見た目はSmartyに似てる Smargyはかっこが一つなのでJSとかぶるJSとかぶるとどんな弊害があるんだろう…。エディタのシンタックスチェック…とか? テンプレート内に変更する部分をブロックとして記述する 継承先ではブロックないだけを書き換えるDreamweaverのテンプレートみたいな感じですね。 フィルタ {{hoge|escape}} タグ {% block %} どちらも自分で拡張できるフィルタを拡張できると日付のフォーマットを一括変更したりできていいですね。 エスケープされるタイミングは出力直前 symfonyなんかはテンプレートに渡す前に問答無用でエスケープされる エスケープするかどうかをテンプレート側で決められる 変数の型を見てテンプレートに渡す前にエスケープするかどうかを決めることもできる最後のはフィルタの拡張に関する部分で、受け取った値から判断して好きに形式を変えられるみたいです。 キャッシュのソースが綺麗 クラスとしてキャッシュされる インデントもちゃんとされてる テンプレートの何行目かがコメントで書いてある普通に読めるコードでした。 キャッシュをはき出す処理はどうなってるんだろ。symfony野はちょっと覗いたことあるんですが、読解は2分くらいであきらめました…。 Smarty3も結構いい キャッシュは読めん 過去のものを移行するならSmartyでいいかも 新規ならTwigの方がいい感じ「Smarty3いいっすよ」とのことでしたw Twig自体のコードは結構モダン くせがあるけどかっこいい既存フレームワークのソースはちょっとでもいいから読むようにしないとなーと。 フレームワークBlankaの紹介 by »

org-modeでTODO管理

Emacs Advent Calendar jp: 2010 : ATND の10日目です。 2011-01-02 タイポ修正 勢いで参加したものの、elispはさっぱりかけないので、 日々使っている機能を紹介する路線で行ってみようと思います。 org-mode でTODO管理をする方法を紹介します。 今回は素の org-mode で使える機能について触れてみます。 org-mode? 超高機能なアウトライン記述用メジャーモードです。 日付タグを入れたりファイルやWebページにリンクを張ったり表計算とかができたりします。 この辺参照。 OrgMode - Emacs上のアウトライナー なんでorg-mode? TODOの管理方法でいろいろ試して悩んだ結果、 結局 org-mode に落ち着きました。 理由は、 emacs(= メインの作業環境)上で操作が完結する 時間が計れる の2点です。 時間が計れる TODO 管理ツールやサービスはいくつか試したのですが、 いちいち emacs を離れて入力するのは面倒 → 入力しなくなる という流れで長続きしませんでした。 TODO管理機能の使い方 ここから本題! TODOの記述 *.orgというファイルをつくって。 ** TODO ブログを書く と書けばTODO項目として扱われます。 終了したTODOは、 ** DONE ブログを書く となります。 たとえばこんな感じに。 一覧表示 基本はorg-mode の形式で書いたファイルの内容を、 org-agenda で集計して表示する形になります。 C-c a(org-agenda) でアジェンダ一覧を表示し、 その場で t をタイプするとTODO一覧になります。 各行で Space »