last update: 2013/10/11

2013/10/11

#isucon の予選問題の出題に参加しました

しまった、YAPC感想ブログ書いていなかった…。れもんです。

さて、先週末予選を行ったISUCON3の出題に参加しました。先に私の立場を明らかにしておくと、@fujiwaraの同僚で、昨年からWeb業界にやってきてWebサービスの開発経験1.5年くらいのエンジニアです。とりあえず業務ではサーバーサイドのエンジニアリングを行っていますが、iOSアプリも書けますのでそっちのテクニカルなアドバイスをしたりもしています。あ、そうそう、先日@typesterが独立して退社したので、im.kayac.comのiOSクライアントは私が引き継ぎました。ISUCONが終わって落ち着いたら通知サウンドを選べるようにする対応をやりますのでお楽しみに!

もうなんか半分くらい書き終わった感じです。

出題内容についての反省項目などは既に@fujiwaraがまとめている通りで、/recentのチェックが甘かったのがやはり一番大きかったかなと。採点をしていても5回測定でスコアが常に安定するチームと安定しないチームがはっきり分かれたのが印象的でした。おそらく安定しなかったチームは本戦の一発計測ではアウトになる可能性が高いのでその辺の安定性向上を本戦までにがんばってください。

出題内容のボツネタとかもいくつかあったので、せっかくなので一つご紹介します。

個別memoページでolder/newerをループで出していましたが、@fujiwaraに「ここのクエリをループ回さずにJOIN芸で一発で取れるようにしたい。ランキングを作るSQLとかを参考にしてなんとかならないかな」と言われたので、ウーンと考えて作ってみたSQLがこちら。

SELECT 
memos.id as memo_id, newer.id as newer_id, newer.content as newer_content,
older.id as older_id,older.content as older_content FROM memos
  JOIN
    (SELECT om1.id, (SELECT COUNT(om2.created_at) FROM memos AS om2 
    WHERE om2.created_at >= om1.created_at AND om2.id > om1.id AND user = ?) rank 
    FROM memos AS om1 WHERE user = ? ORDER BY om1.created_at) om1 
    ON om1.id = memos.id 
  LEFT JOIN
    (SELECT om3.id, om3.content, (SELECT COUNT(om4.created_at) FROM memos AS om4
    WHERE om4.created_at >= om3.created_at AND om4.id > om3.id AND user = ?) rank
     FROM memos AS om3 WHERE user = ? ORDER BY om3.created_at) newer
    ON om1.rank - 1= newer.rank
  LEFT JOIN
    (SELECT om5.id, om5.content, (SELECT COUNT(om6.created_at) FROM memos AS om6
    WHERE om6.created_at >= om5.created_at AND om6.id > om5.id AND user = ?) rank
     FROM memos AS om5 WHERE user = ? ORDER BY om5.created_at) older
    ON om1.rank + 1= older.rank 
 where memos.user = ? and memos.id = ?;

とりあえずこれで取れたけど、実際アプリにこんなSQL書いてあったら卒倒するわーみたいな感じだったのでボツとなりました。同じ派生テーブルを3回つくってるので超ひどいんですが、派生テーブルに名前つけて参照することができないっぽいのでしかたないですね。

まぁなんかそんなわけで無事予選がおわりました。予選通過したけどいいスコアだった人、思ったより悪いスコアだった人もいるかと思いますが、あくまでもこれは本戦通過者を決めるための予選です! ポールポジションはありませんのでまた一からのスタートとなります! がんばってください!

予選という観点でいうと、本戦であきらかに力不足になりそうな人を先にふるい落とすのが予選の目的です。上位にオンメモリDBの人が並びましたが、「8時間でオンメモリDBに組み直す力がある人」は本戦に出るのにふさわしい瞬発力をもっていると思いますので、それはそれで良かったのではないかと思っております。

本戦でオンメモリDBできないような出題にしてほしいなーみたいな意見も見かけますが、どういう出題にするかはこれからゆっくり考えますので、本戦出場者の方はどうなるかお楽しみに! さっき社内IRCで「高速化済みの予選問題を複数台構成にして用意して『さぁこっからスコア上げてみろや』とかやったら面白そう」って言ってしまったので、そういう出題にはならないかと思います。

comments powered by Disqus