ISUCON公式Blog

WINNER'S PRIZE \1,000,000



   

ISUCON7本選の出題を担当した @methane です。参加者の皆様、お疲れ様でした。

すでに Twitter でアナウンスされているとおり、本選の問題を Github で公開しています。
isucon/isucon7-final

すでに一週間以上経ってしまいましたが、この記事では本選の問題設計や攻略ポイントについて解説していきます。

お題について

予選では、夏期講習参加者や過去問を練習してきてくれた学生チームにいじわるな問題設計にならないようにと考えていました。(残念ながら失敗していた部分も多かったですが)

一方本選では、そういった気遣いを一切無視して自分たちの得意な分野の問題を出そうということで、MOゲームをお題に選びました。

「協力してレイドボスを殴るゲームにしようか。」
「ボスのヒットポイントは無限にして総与ダメージをスコアにできないかな。」
「攻撃スキル、バフ/デバフスキルみたいなのはコード量を大幅に増やす割にISUCONとして面白くないから、もっとシンプルなルールが良いよね」
「あれ、クッキークリッカーってレイドボスになるんじゃない!?」
という流れで Chair Constructor Online にすることになりました。

自分たちの得意分野をやるということで、WebSocketを使ってマルチプレイ対応することまでは考えていましたが、ボトルネックをどう作り込むかなどはアイデア時点では考えていませんでした。

アイデア段階では存在しなかったタイムスタンプや未来に反映されるコマンドを使った同期といった難しい部分は、予選期間中にお題のゲームのプロトタイプを作ってくれていた @hasi_t が作り込んでくれました。

オンメモリ戦略と分散構成

ISUCON を攻略するテクニックの1つとしてオンメモリ戦略があります。この名称は自然発生したものできちんとした定義は無いものの、私の理解では次のような方法です。

  • オンメモリ戦略: RDB上のデータを正としてプロセスメモリ上のデータをキャッシュとしてのみ利用するのではなく、プロセスメモリ上のデータを正として、RDBは永続化のためだけに使う(もしくはRDBを捨てて別の永続化手段を取る)


  • ISUCON参加者の中にはオンメモリ戦略を嫌う方もいます。
    その理由は次の2点が大きいと思います。
  • RDB 以外の永続化手段は実際のWebの現場では安全性のために利用しにくいので、ISUCONでしか使えない戦略である(現場でも活かせる方法で勝てるようにしたい)
  • シングルプロセスでマルチコアを活用できるGoが、ISUCONでよく使われる他の言語と比べてかなり有利になる


  • しかし今回の問題は明確にオンメモリ戦略が有効な問題でした。それで問題ないと判断したのは次の理由です。
  • FPS等の短時間のMOゲームならサーバーや回線のトラブル時に無効試合になるのは一般的で、信頼できる永続化は必須ではない
  • 部屋毎に接続するプロセスを固定することで、Go以外の言語でもオンメモリ戦略を効率的に実装できる


  • 今回のクライアント(Webアプリ、ベンチマーカー共に)は、APIが返したホストとポートに対して接続するように実装されており、例えば部屋名のハッシュ値などをもとに接続先を指定してやることで、動的なリバースプロキシなどを作ることなく簡単に部屋毎に接続するプロセスを固定することができました。

    そうなると、むしろシングルスレッドで動いている言語の方が、排他制御などを考えなくて良い分Goより楽な部分も出てきます。
    本選では言語間の公平性はあまり重視していなかったものの、ここだけはGoが圧倒的に有利にならないように配慮しました。

    WebSocketと非同期I/Oについて

    WebSocketを利用するお題でなおかつオンメモリ戦略が有効ということで、通常の prefork 型のWebサーバーは利用できません。さらに(少なくとも初期実装では) MySQL へアクセスもする必要があります。

    Goやnode.js (本選では async/awaitを利用) にとってはこれは得意分野ですし、Pythonもスレッドプールを利用することで比較的上手く解決していますが、 php は deferred/promise 地獄になっていますし、 Ruby と Perl はMySQLアクセス中にWebSocketの処理がブロックしてしまう状態になっていました。

    ただし、想定解法ではMySQLのアクセスは序盤で排除する前提でした。なので、この部分が苦手な言語ほど早い段階でMySQLを捨てる決断ができたのではないかと思います。

    攻略ポイント

    Python 版実装をベースにチューニングポイントを解説していきます。

    calcStatus() の後半部分の高速化

    最初の状態で遅いのは calcStatus() 関数です。

    この関数は前半で現時刻までの addings と buyings から現在の椅子の数と生産力を計算し、後半ではこれから先1秒間のスケジュールを計算します。前半部分もあとでチューニングしますが、せっかくユニットテストが用意されているので、関数のAPIを壊さずにチューニングできる部分を優先します。また、この最適化はオンメモリ化の判断の前に可能な部分でもあります。

    この中でチューニングが簡単かつ効果が大きいのは、アイテムの価格と生産能力のキャッシュと、 on_sale の計算部分です。

    価格と生産能力はマスターデータから同じ形の計算式を使って計算しています。アイテムのIDと生産個数をキーにキャッシュするとシンプルですが、ユニットテストは別のマスターデータを使っているので、最初は計算部分だけをキャッシュするとユニットテストを壊すのを遅らせることができます。例えば Python だと次のようになるでしょう。


    +from functools import lru_cache
    +
    +@lru_cache(100000)
    +def _calc_item_status(a, b, c, d, count):
    + return (c * count + 1) * (d ** (a * count + b))
    +
    +
    def calc_item_power(m: dict, count : int) -> int:
    """アイテムマスタ m から count 個目のそのアイテムの生産力を計算する"""
    a = m['power1']
    b = m['power2']
    c = m['power3']
    d = m['power4']
    - return (c * count + 1) * (d ** (a * count + b))
    + return _calc_item_status(a, b, c, d, count)

    @@ -68,7 +75,7 @@ def calc_item_price(m: dict, count : int) -> int:
    b = m['price2']
    c = m['price3']
    d = m['price4']
    - return (c * count + 1) * (d ** (a * count + b))
    + return _calc_item_status(a, b, c, d, count)


    on_sale の計算は、1000回ループの中で、さらにアイテムの種類数 (13) のループで実装されています。まだ買えないアイテムを安い方からチェックすれば、13000回のループを約1000回に抑えることができます。

    他にも、言語ごとに異なる重い部分があるかもしれません。多倍長整数演算が入っているためにどの部分が重いのかが見た目からの直感と反する事が多いはずなので、ちゃんと大きめのテストデータを用意して、(自作でも、ベンチマーク終盤の入力を保存&リプレイでも可)プロファイルを取りながら最適化しましょう。

    例えば1000回ループは buyItem や addIsu が発生した時間の回数分のループに書き換えることができますが、それをバグなしに一気に書き換えることは難しいでしょう。アプリに強いメンバーが複数人居るのでなければここで時間を溶かすべきではありません。プロファイルしながらなら、一部の特に重い部分だけをチューニングして先に進むという判断もしやすいはずです。


    部屋ごとの分散

    Pythonの場合はマルチコアを利用できないので、 5000, 5001 番ポートで1つずつプロセスを立ち上げるように設定します。

    /room/{room_name}
    のハンドラで、部屋名から一意に決まる方法で分散します。最適化が進むと部屋数が増えるので綺麗に分散する必要はないと思います。


    オンメモリ化

    部屋ごとに接続先プロセスを固定する分散方式を実装すれば、どの言語でも部屋の状態を簡単にオンメモリ化できます。

    例えば AddIsu の椅子の数は、DBに保存するときは文字列、合計を計算するときは bigint になるので、毎回変換が必要になります。メモリ上にこれらを bigint のまま載せるだけで高速化が期待できます。

    DBへの書き込みを無くす必要はありません。ただし Python や php だとスレッドプールや Deferred 地獄を削って Ruby, Perl と同じにした方が、並行処理が無くなるので部屋ごとのロックの必要がなくなって楽になります。

    もしDBの書き込み待ちでCPUが使い切れなくなってくるようであれば、プロセス数をCPUコア数と同じ2から3に増やすとか、MySQLを各サーバーで動かすなどの対策が取れるはずです。

    もちろん、MySQLを使わず部屋の状態をシリアライズして保存しても構いません。


    ステータスのキャッシュ

    まだまだ calcStatus が遅いので結果をキャッシュしたいところですが、問題があります。

    ステータス計算は addIsu や buyItem の結果として実行することが多いのですが、その処理が反映された状態のステータスを返さないといけないので、古い状態を返してしまうと fail するのです。

    ここで予選を思い出してみましょう。少し sleep を入れることで、同じ部屋の複数のメッセージをまとめてから一気にクライアントに送ることができました。

    今回も addIsu や buyItem の後に非同期な (他の WebSocket 経由のリクエストを実行できる) sleep を入れてやります。その後、キャッシュされたステータスが sleep 前の時刻より新しければそのキャッシュを返すことができます。キャッシュされたステータスが古い場合は計算しないといけないのですが、その計算結果は sleep 中の他のリクエストの結果もまとめたものにすることができているはずです。

    試しに 0.2 秒の非同期 sleep を入れた所、先ほどと同じ構成で 100199点になりました。ここまでくれば優勝ラインです。

    なお sleep 以外にも calcStatus を別スレッドや別プロセスに逃がして結果を待つようにするなどの方法があります。 複数の addIsu や buyItem 後の calcStatus をまとめて計算するのが本質なので、それを実現できるなら方法は問いません。

    ただし sleep を使う方法はベンチマーカー側の攻撃ループを待たせて全体の負荷を下げる副作用もあるので、タイムアウトを発生させることなくCPU使用率があまるくらいにチューニングが進んでから sleep 時間を減らしていくという調整ができます。 sleep を使った方法は純粋にシンプルでバグを埋め込みにくいのと、この負荷調整の効果も期待できるので、個人的には一番おすすめです。


    指数表記変換の高速化

    calcStatus の回数は大幅に減りましたが、まだまだ重いのがここです。特に多倍長整数を10進数の指数表記に変換する計算が重いです。

    初期実装ではそのまま10進数文字列にしてから先頭15文字を切り出し、残りの文字列長を計算しています。これは、例えば椅子の数が10の10万乗になると、10万桁程度の文字列を作ってから先頭だけ取って残りを捨てているようなもので、とてももったいないです。

    これは例えば、2の10乗が10の3乗より少し大きいことを利用して、次のような高速化ができます。

    +@lru_cache(100000)
    +def exp10n(n):
    + return 10**n
    +
    +
    # JSON中で利用する10進指数表記
    # [x, y] = x * 10^y
    def int2exp(x: int) -> (int, int):
    - s = str(x)
    - if not s:
    + if not x:
    return (0, 0)
    +
    + b = x.bit_length()
    + d = b // 10 * 3
    + e = d - 17
    + k = 0
    + if e > 0:
    + k = e
    + x //= exp10n(e)
    +
    + s = str(x)
    if len(s) <= 15:
    - return (x, 0)
    - return (int(s[:15]), len(s)-15)
    + return (x, k)
    + return (int(s[:15]), len(s)-15+k)


    この方法ではわざわざ10のn乗を作って除算していますが、チームメイトに数学に強いメンバーがいればもっと上手い計算方法があるかもしれません。

    この高速化を思いつかなかった場合も、 JSON の構造をよく見てみると指数表記が椅子の数と総生産力だけでなく、各アイテムの価格と生産力にも使われていることがわかるはずです。これはアイテムの個数で決まった値になるので、指数表記に変換した結果をキャッシュすることもできたかもしれません。

    その他

    現在時刻までの addings を合計しておくというのも簡単で効果があります。buying も adding のように現在時刻までの処理をまとめることができますが、そちらは影響範囲が大きいので競技時間中に実装するのは難しかったと思います。

    なお、 addings の合計までを実装した Python 実装(ただし手抜きで永続化はしていない)を python-optimized ブランチで公開しておきました。参考スコアとして、本選と同じ環境で、4台で各2プロセスに分散すると18万点台を出しました。

    反省点

    オンメモリ戦略を早めに取ったほうがいい問題だったのですが、その判断に時間がかかってしまうチームが多かったのが残念でした。
    もっとアグレッシブに、永続化をルールから外し、初期実装からオンメモリにするくらいにしてしまったほうがちょうどよいバランスになっていたと思います。そうすれば競技後の検証プロセスも減らせましたし、参照実装の各言語移植者の負担も大幅に減らせたはずです。

    また、非常に重い計算処理があるにもかかわらず、想定通りにキャッシュしてくれるチームがなかったのも残念でした。キャッシュ自体は簡単なはずですが、ロジックが複雑だったためにそこで一度 fail にハマると、キャッシュするのに臆病になってしまうチームが多かったのだと思います。初期実装でも buyItem や addIsu とそのあとの getStatus は別トランザクションになっていて、キャッシュすることで何か整合性が損なわれることはないことが明らかになっていたのですが、もっと分かりやすいヒントが必要だったかもしれません。

    この辺の難易度調整は、出題側は「こんなに重いんだから複数の有力チームはキャッシュ試してくるだろう」という思い込みがあるうえ、スケジュールが厳しいと優勝候補レベルの協力者に難易度調整済みの問題でリハーサルしてもらうのが難しいので、予選と本選の出題が1チームで間が1ヶ月しか無いとなかなか難しいものがあります。

    終わりに

    トラブルも多く、参加者、関係者に多大な迷惑をかけてしまいましたが、なんとか出題担当という大役を果たすことができました。

    出題メンバーでは、中心になって動いてくれた一番の功労者である @mecha_g3 さん、消される前提で deferred 地獄な php コードを書いてくれた @___Johniel さん、エッジの効いた問題を作ってくれた @hasi_t さん、楽しいゲーム画面を用意してくれた @halt さんと @hnw さん。

    WebSocket + MySQL + 多倍長整数という難題を、厳しいスケジュールで各言語で実装、レビューしていただいた、 @L_e_k_o 様、@mix3様、@ykzts様、@kamipo様。

    大量のサーバーをセットアップしてくれたインフラ担当の @kizkoh 様、 yokogawa-k さん。

    運営していただいたLINE株式会社の櫛井様と三木様。

    インフラを提供していただいたさくらインターネット株式会社と、サポートしていただいた横田様。

    そして度重なるトラブルを辛抱して参加して下さった競技者の皆様。

    皆様のお陰でISUCON7を成功させることができたことを感謝します。
    Read more...

    ISUCON7 本選の利用言語比率を公開します。
    ISUCON7 本選は30チームの参加があり、有効回答数は30チームでした。

    利用言語比率

    利用率の全体ランキングは以下の通りです。利用言語は自由記入で複数入力したチームもありますので合計が回答チーム数を超えます。

    Go   19組 63.3%
    Ruby   7組 23.3%
    Node.js  4組 13.3%
    Python  2組 6.7%
    Perl    0組 0.0%
    PHP   0組 0.0%

    参考として優勝チーム「MSA」の利用言語はGo、学生1位チーム「ML」の利用言語はPythonでした。


    ご参加いただいた皆さんの感想などはこちらにまとめています。
    ISUCON7 本選 関連エントリまとめ : ISUCON公式Blog
    Read more...

    [2017.12/7 13:00 更新]
    ISUCON7 本選にご参加いただいた皆さん、ありがとうございました!
    こちらでは感想エントリや何をしたかに言及されたエントリをまとめていきます。見つけた順ですが後で何かしらのルールで並び替えます。もしここに載っていないものがある場合は ISUCON7 本選のブログ書いたよ!フォームで教えていただけると助かります。重複はこちらでチェックしますのでドシドシお願いします。

    ブログを書くまでがISUCONです!

    本選のTweetはこちらでまとめています
    ISUCON7 本選 Tweet まとめ#isucon - Togetter

    ISUCON7優勝しました [MSA] - mizkeiのブログ
    ISUCON7で優勝しました - ken39arg’s blog
    ISUCON 7 で優勝してきました | ジェットゾウ
    ISUCON 7 本戦出場してきました(学生枠 2 位 / 全体 10 位でした) - 右上➚
    ISUCON7 本選で学生枠1位になりました – ymyzk’s blog
    ISUCON 7 準優勝で、やったことまとめ - Qiita

    ISUCON7本戦「Railsへの執着はもはや煩悩」で4位だった - k0kubun's blog
    ISUCON 7 本選で負けてきました - 酒日記 はてな支店
    ISUCON7本戦で何もできずに人権を失った - 夜明け
    ISUCON7 本戦で惨敗しました - abcang’s blog
    ISUCON7本戦に参加してきた - Brook's Studio
    ISUCON7本戦は惨敗でとても悲しい気持ちになりました - Nao Minami's Blog
    ISUCON7 本戦スコア0 · blog.handlena.me
    ISUCON7 勝てなかった - すぎゃーんメモ
    ISUCON7本戦で @k0kubun と @rkmathi とのチームで4位だった 「Railsはもはや煩悩(ryチーム」 - cnosuke's blog (′ʘ⌄ʘ‵)
    ISUCON7の本選に参加して椅子に座っているだけでした - くじらにっき++
    ISUCON 7 final に参加しました - mayoko’s diary
    ISUCON7本戦で惜敗してきた - Goryudyuma’s blog
    ISUCON7参加記 - bgpatのブログ
    ISUCON7本戦惜敗記(学生枠)
    ISUCON7-finalに参加しました - chigichan24のお気持ち表明
    ISUCON7 本戦に学生枠で参加してきて悔しい思いをした話
    ISUCON7決勝に参加してきました@チームinarisan - sugilogのブログ
    ISUCON7本選で惨敗した - stoshiya's blog
    ISUCON7本戦、3位でした | おそらくはそれさえも平凡な日々
    ISUCON7 本戦参加 (2017/11/25)
    ISUCON7本戦に参加してきました(惨敗) | とーふとふのブログ
    初めてISUCONに参加し、予選を勝ち抜いて、ISUCON2017本戦に参加してきました!詳しい内容は他の人に譲るとして、私はISUCONに参加したことのない人が参加したくなるブログを書きたいと思…
    ISUCON7 決勝に出ていろいろキャッシュ作戦を立てたけどダメでした - beatsync.net
    ISUCON7本戦でBigintを殺したかった話 - (/^^)/⌒●~*$ a(){ a|a& };a
    Read more...

    [追記]一部表記に誤りがありましたので訂正いたしました

    オンライン予選の利用言語比率を公開します。
    オンライン予選は407チームの参加があり、予選についてのアンケートにて有効回答数 218チームとなりました。

    オンライン予選 利用言語比率

    利用率の全体ランキングは以下の通りです。利用言語は自由記入で複数入力したチームもありますので合計が回答チーム数を超えます。

    Ruby  68組 31.2%
    Go   62組 28.4%
    Python 28組 12.8%
    PHP  25組 11.5%
    Perl   19組 8.7%
    Node.js 18組 8.3%
    C#    1組 0.5%


    本選出場が決まった30チームに限定すると以下となります。

    Go   16組 53.3%
    Ruby   6組 20.0%
    Node.js  4組 16.7%
    Python  2組 6.7%
    未回答   1組 3.3%



    ご参加いただいた皆さんの感想などはこちらにまとめています。
    ISUCON7 オンライン予選 関連エントリまとめ : ISUCON公式Blog
    Read more...

    [11/6 10:45 更新終了]
    オンライン予選にご参加いただいた皆さん、ありがとうございました!
    こちらでは感想エントリや何をしたかに言及されたエントリをまとめていきます。見つけた順ですが後で何かしらのルールで並び替えます。もしここに載っていないものがある場合は ISUCON7 オンライン予選のブログ書いたよ!フォームで教えていただけると助かります。重複はこちらでチェックしますのでドシドシお願いします。

    ブログを書くまでがISUCON予選です!

    予選のTweetはこちらでまとめています
    ISUCON7 オンライン予選 Tweet まとめ#isucon - Togetterまとめ


    参加者
    本選出場
    ISUCON7 予選通過した - すぎゃーんメモ
    ISUCON7予選2日目「Railsへの執着はもはや煩悩」で予選通過した - k0kubun's blog
    ISUCON7 予選を学生枠で突破した – ymyzk’s blog
    ISUCON7 予選突破コードをissue & PR付きで大公開! | Wantedly Engineer Blog
    ISUCON 7 予選2日目を3位で通過しました - 酒日記 はてな支店
    ISUCON7 予選突破した (白金動物園) #isucon - diary.sorah
    ISUCON7 予選通過した! - Islands in the byte stream
    ISUCON7予選を2日目3位で突破した - beatsync.net
    ISUCON7参加しました@チームinarisan - sugilogのブログ
    ISUCON7 予選1日目1位通過しました - mizkeiのブログ
    isucon7予選に参加し通過した
    ISUCON7の予選を学生枠で通過しました - くじらにっき++
    そして人権を取り戻した(ISUCON7予選突破したぞ!!!) - 雑な話
    ISUCON7の予選をはてなメンバーで通過してきました | おそらくはそれさえも平凡な日々
    ISUCON 7 予選に参加した話
    ISUCON7予選に参加しました - 男女比はカレーと福神漬けと同じくらい
    ISUCON 7 予選に参加した話
    ISUCON7に参加しました. - chigichan24のお気持ち表明
    ISUCON7 予選感想 - TITD
    ISUCON7予選通過できた #ISUCON - 水底
    ISUCON 2017 の予選を突破したので、その記録 - Qiita
    isucon7学生枠で予選通過してしまった - $a(){ a|a& };a
    ISUCON7の予選を突破しました! - abcang’s blog
    ISUCON7 予選通過した!! - Hateburo: kazeburo hatenablog
    hidekiy blog: [isucon] ISUCON7 予選通過しました
    ISUCON 7 予選1日目を1位で通過して来ました
    ISUCON7 予選1日目を1位で通過しました。 - ken39arg’s blog
    ISUCON7予選に学生チームで参加して1日目3位枠で突破しました!
    ISUCON7 予選参戦メモ | ただのメモ
    ISUCON7予選を総合4位で通過した - stoshiya's blog
    ISUCON7予選参戦記 - Goryudyuma’s blog

    ISUCON7予選1日目にチーム「ババウ」で参加して最終スコアは205148でした - Dマイナー志向
    ISUCON7に参加した - いがにんのぼやき
    ISUCON7で人権喪失を味わった #isucon - 私が歌川です
    ISUCON7に参加しました - ぬぬん!
    ISUCON 7 やまのほすけ 提出スコア 11,204 | うなすけとあれこれ
    ISUCON7 オンライン予選に参加しました - 眠すぎて明日が見えない
    ISUCON7にチーム「common.php」で出場しました。 - uzullaがブログ
    ISUCON 7 予選落ちを支えた技術 - ほとラボ
    ISUCON7に出た #isucon - はらへり日記
    ISUCON7に参加〜そして敗北へ〜 - Foreverly
    ISUCON7 に参加して相変わらず予選敗退しました。 - あいつの日誌β
    ISUCON7予選敗退を受けていま考えていること - まさ@ブログ書き込み中
    ISUCON7予選に秒速5000兆クエリというチームで参加した - Sexually Knowing
    静的ファイルのキャッシュコントロールについて #isucon 7 – そろそろちゃんとやります
    ISUCON7に参加して予選突破しませんでした。 – そろそろちゃんとやります
    ISUCON7 に、 D2C dot チームで参加してきました! – D2C dot Weblog – デジタル・マーケティングの技術&事例ブログ
    SmartHR 開発チームで ISUCON7 に参加しました | SmartHR Tech Blog
    ISUCON7予選に参加してパフォーマンスチューニングの代わりにC#実装のために全時間を使ってきた - 451 Unavailable For Legal Reasons
    ISUCON7 の予選に出た (95352点) - Unyablog.
    ISUCON7の予選に参加しました #isucon - @matsumana の技術メモ
    ISUCON7 予選敗退した #isucon - tknzk's tech log
    ISUCON7で人権を得ることに失敗した - chiastolite’s blog
    ISUCON7予選敗退してきました - ragi256のブログ
    ISUCON7 予選に参加した | TRIAL DANCE
    ハンバーグは中身が少し赤い程度が美味しい(ISUCON7予選参加記) - 日々精進
    ISUCON7 に参加して惨敗した - おうさまのみみはロバのみみ
    ISUCON7予選に参加してボロ負けしてきた – Ryosuke Sato – Medium
    ISUCON 7予選に参加しました - すてにゃん氏の技術ぶろぐ
    ISUCON7 競技者として、コーチとして、出場してきました - The paradigm shift
    何も知らないのに ISUCON 2017 に参加した - mayoko’s diary
    ISUCON 7 予選(1日目)に参加して悔しい思いをしてきました(アプリ編
    ISUCON7予選、学生枠で挑みました。 - おれ、エンジニアになるよ。
    ISUCON7「学生気分」 - Write and Run
    ISUCON7 予選2日目にチーム「学生気分」で参加した - osyoyu.hatenablog.com
    ISCUON7 予選2日目に参加して予選通過出来ませんでした #isucon - ainameの日記
    ISUCON7にrubyで参加して手も足も出なかった - azihsoyn's blog
    isucon7で惨敗した。 - フクチ@プログラミングと釣り好き大学生のブログ
    ISUCON2017に初参加した - Screaming Loud
    ISUCON7予選 参加振り返り | Dabits
    残念ながら ISUCON 7 は予選敗退で幕を閉じた | ごみばこいん Blog
    ISUCON7で予選落ちしてきた - 日頃の行い
    ISUCON7参加記録とふりかえり #isucon - Qiita
    ISUCON7予選1日目にチーム「ババウ」で参加して次点で落選しました - netmark.jp
    ISUCON7に「ガトリンガー葉の仲間たち」で参加して今年も惨敗しました - SEEDS Creator's Blog
    ISUCON7に参加したのでその雑記 - Qiita
    ISUCON7参加記録とふりかえり #isucon - Qiita
    ISUCON7の予選で敗退した - TakiTakeの日記
    ISUCON7予選で得た知見 - non117's diary
    ISUCON 7 予選敗退しました - ナチュラル @rch850
    チーム ZGB で ISUCON7 予選に参加しました - ravelll の日記
    ISUCON前線異状なし | owlWorks
    ISUCON7に初参戦してフルボッコw - めじなてっく
    ISUCON7に参加して予選敗退した - 平常運転
    ISUCON7に参加して予選を突破できませんでした😱 – okyunnura – Medium
    ISUCON7予選にチーム「Rising Sun」で参加しました | hypermkt blog
    ISUCON 7 予選に参加した - castaneaiのブログ
    ISUCON 7 予選参加 | にろきのメモ帳
    ISUCON7予選に参加してきました - Qiita
    ISUCONに初参加した - ふぁんふぁん建てました
    ISUCON7に参加してきました - Hack Your Design!
    ISUCON7の予選に参加しました - Hitori-Gotten Log
    #isucon 7 予選敗退しました | へぼい日記
    ISUCON2017参加記 - kyuridenamidaのブログ
    ISUCON7で惨敗してきました – Tatsuya Kaneko – Medium
    ISUCON7の予選2日目に参加した話 - kariaの日記 @ Alice::Diary
    ISUCON7予選で81位でした | gam0022.net
    ISUCON7予選に出場してきました(インフラ編)
    ISUCON7 予選参加した - はてなブロック

    Read more...

    ↑このページのトップヘ