ISUCON12 予選 参加記

今年も参加しました

結果

チーム「情報処理部」で参加して、競技中のスコアの最終値は3270、結果は322位相当でした。 メンバーは id:mizdra との2人で参加しました。

やったこと

github.com

  • Datadog の導入
  • MySQL に乗っているテーブルに index を追加
    • Datadog で APM からスロークエリを列挙して上の方にあるクエリに有効なインデックスを追加
  • ID の採番を ulid にする
    • Datadog を見ると REPLACE INTO という見慣れないクエリが見えて「なんだこれ」ってなったけどよく見たら ID を採番しているだけだった
    • uuid でもいいかなと思ったけど ulid にした
  • リーダーボードを Redis に乗せる
    • リーダーボードといえば Redis かなと思ってやってみたけど間に合わなかった...
    • 解説や他の人の参加記を見ても採用しているケースは少なかったし方針が悪かったっぽい
    • 初期データで player_score に入っているデータを Redis に乗せる必要があり、その処理を POST /init で呼ぶと30秒を超えてつらかった
      • ほとんどこの対応に時間を費やして時間内に終わらなかった
      • row_num が一番大きいやつを選べばいいことはわかっていたけど、圧縮するという発想がなかった...

できなかったこと

  • テナントのロックがきつい
    • mizdra さんが MySQL に変更していて、完了すればトランザクションで排他処理ができると思って何もしてなかった
    • 今思うととりあえずアプリケーションレイヤーで RW Lock 実装すればよかった
  • billing が重たいまま
    • 方針を考える時間がなかった
    • N+1 も残ったまま
    • サマリー作れば軽くなりそうだなという気はしていた

感想

  • 自分は Redis 化、mizdra さんは SQLite => MySQL 化をやっていて、どちらも一発逆転ホームラン的な作業をしていたのが良くなかったかも
    • どちらも完了すればスコアが大きく伸びることが期待できるけど、作業が完了しなければスコアの増分は0
    • 小さく積み重ねる系のタスクも別ラインで進めたほうが良かった
  • ほぼ触ったことのない Redis をぶっつけ本番で選んでしまった
    • ↑と似てる
    • SQLite のまま進められる改善をやればよかった
      • RW Lock の実装など
  • Datadog の無料枠が終わった
    • 来年は課金して挑みます
  • SQLite という新しいミドルウェアが出てきて新鮮だった
    • MySQL v8 なのも初?
  • 今回はいつもに増して無力感が強い予選だった
    • 個人的に ISUCON の予選突破がソフトウェアエンジニアとしての1つの目標で毎年参加している
    • しかし予選突破に近づいたことがなく、あと何を学べば目標に近づけるかがわからない...

自宅の通話環境を整備した

背景

forkwell.connpass.com

このイベントに参加するにあたって通話環境を改善したときのログです。

今は普段は3000円ぐらいのヘッドセットをつけて会社のミーティングなどに参加していますが、顔の周りがゴテゴテしているのでやめたいです。理想はいい感じのマイクを買って顔出しゲーム配信者的な環境を手に入れることです。

ゴール

  • 何かしらのマイクを買って運用する
  • マイクは仕事用の MacBook Pro と私物の MacBook Pro を繋ぎ変えられるようにする
  • あまり生活音は拾わず自分の声だけ拾ってくれると嬉しい

買ったもの

マイク

マイクの予算を1万円前後と見ていたのと、ワイヤレスイヤホンは audio-technica 製のものを使用していたのでこちらを購入しました。

www.amazon.co.jp

購入したマイクがコンデンサーマイクだったので、こちらのケーブルも購入しました。 www.amazon.co.jp

ミキサー

ミキサーもマイクと同様によくわからないので、インターネットでおすすめされていたこちらを購入しました。

www.amazon.co.jp

スタンド

マイクにはスタンドが付いてないことを知らずに慌ててこちらを購入しました。

www.amazon.co.jp

最初はこのスタンドを運用してました。しかし「声が遠い」とのフィードバックをもらったのでマイクの位置を顔に近づけるためのスタンドを別途購入しました。

www.amazon.co.jp

その他ケーブル類

マイク関係のケーブルを一切持っていなかったので、適当にそれっぽいやつをたくさん購入しました。

www.amazon.co.jp

www.amazon.co.jp

www.amazon.co.jp

感想

f:id:odan3240:20220117235602j:plain

ミキサーから生えている USB Type-C のケーブルを MacBook Pro に挿せば電源が入りマイクとイヤホンが使える環境が手に入って満足です。

マイクの音は前よりはマシになったけど遠いというフィードバックをもらっています。おそらく部屋鳴りな気がするので、部屋にカーテンを導入するなどして防止することを検討しています。

2021年 ふりかえり

去年のやつ

odan3240.hatenablog.com

OSS 関係

https://github.com/issues?q=author%3Aodanado+archived%3Afalse+-user%3Aodanado+-user%3Aodan-sandbox を眺めて思い出深いやつをピックアップ

shibayu36/merged-pr-stat

仕事で shibayu36/merged-pr-stat を使ってリードタイムの定点観測をしている関係でいくつかプルリクを投げた

リードタイムの内訳がわかるとなにか見えてこないか?という話になって投げたやつ

github.com

リポジトリを眺めていて、図があると単語がわかりやすいよねって気付いたので README を更新したやつ github.com

nuxt/eslint-config

仕事の Nuxt.js を使っているプロジェクトで eslint 周りの設定をいじっているときに、yarn create nuxt-app 直後でも eslint のエラーが発生することに気付いたやつ

eslint の config をいじればすぐ直るのはわかってたけど、いきなりプルリク投げてもなあという気持ちになったので issue でお伺いを立てた github.com

数日過ぎたけど特に返事がなくて、他のユーザーから :+1: をもらっているのもあって、プルリクを作った。しばらく経ってからマージされた。コアチームは Nuxt.js v3 関係のタスクで忙しかったのかな github.com

aspida/pathpida

副業先で pathpida の検証を行う機会があって、検証中にバグを見つけたので報告したやつ

起票から修正まで爆速ですごかった

github.com

nulab/backlog-js

仕事で Backlog の SDK をちょっと触ることがあって issue 立てたりプルリクを投げたりした

GitHub Actions に migration する issue が生えたまま着手されてなかったので、やるだけだしやるかと思ってやった

github.com

非推奨なメソッドは @deprecated アノテーションがあるとわかりやすいので issue でお願いしたやつ。爆速で対応してもらえた

github.com

レスポンスの型注釈が全部 any になっているので、具体的な型がほしいと思って issue を立てたやつ。けど作業できてなくて申し訳ない...。 github.com

nuxt/vite

Vite がリリースされてから、Nuxt.js の対応はいつなんだろうってワクワクしていたので、リリース直後に趣味プロジェクトに導入してみてエラーを報告したやつ

github.com

github.com

Nuxt.js v3 の正式リリース楽しみですね

dethcrypto/TypeChain

仕事で使っていて、あれなんか型が変だなって気付いて issue 立ててからプルリクを投げたやつ

github.com

github.com

reviewdog/errorformat

reviewdog を使用して厳しい tsconfig や eslint rule を段階的に適用する方法の紹介 を書くために reviewdog を触っていてバグを見つけたので報告したやつ

errorformat のことはよくわからないけど、再現条件と細かく書いたのでこれぐらいの情報量があれば修正されるやろ〜って思って issue を作った。実際すぐ修正されて助かりました

github.com

reviewdog のオーナーがスプラトゥーン関係の知り合いなので、見たことあるアイコンだなって思いながらコミュニケーションを取ってました

仕事

入社当初から目標にしていた役職を今年の夏に得て肩書的にも「もう新米じゃないんだな〜〜」って気持ちになった1年でした

色々大変だけど来年もがんばります

アウトプット

もともと 記事一覧 - odan blog をメンテしていく予定だったけど、Zenn のスクラップ機能がリリースされてからはスクラップに、記事の素振りのメモなどを残していくようになりました

odanさんのスクラップ一覧 | Zenn

Tweet をする感覚でどんどんコメントを書いていけるので助かってます

スプラトゥーン

今年嬉しかったことは次の3つ

  • XP26達成
  • 大王戦で優勝
  • 固定チームを作って大会に出た

XP26達成

XP24→XP25の期間が長かっただけに、思っていたより早くXP26を踏めて嬉しかったです。他のルールもXP25を何回も踏めるようになってきたので、全体的に今年1年間でスプラはうまくなったなと実感した1年間です。

XP25前後になると対面全然勝てず試合にも勝てない、のが来年の課題で、もう一度XP26を踏んでXP27にも挑戦したいと考えています。

大王戦で優勝

スプラトゥーンの社会人コミュニティの Splathon 内部で開催されたウデマエ制限付きの大会で優勝できました。今回が第三期で、第一期が準優勝、第二期が優勝だったので今回も良い成績を収めることができてよかったです。

コミュニティ内部の大会は練習相手に何度も凸って、ステージの特性や人ごとに対面のアプローチを学習していくタイプなんですが、今回はあまり練習時間が取れずどうなることやらと思っていましたが、無事に結果に繋がりました。

次も開催されたら三連覇を目指したいです(そろそろ永世称号もらえる??)。

固定チームを作って大会に出た

↑のコミュニティ内部の知り合いを集めて固定チームを作って大会に出ました。

勝っても負けても楽しいので楽しいです。

ISUCON11 予選 参加記

結果

チーム「ひとは」で参加して、競技中のスコアの最高値は23308、結果は失格でした。

ISUCON11 オンライン予選 全てのチームのスコア(参考値) : ISUCON公式Blog

環境情報の確認に失敗: セキュリティグループへのルールの追加

:cry:

isucon-env-checker を実行したのは最初の一回だけだったので気付くことができませんでした。セキュリティグループは netdata 用に直接ポートを開けていました。今思うと nginx でプロキシするとかすればよかった。

チームの方針

言語選択は Node.js でした。普段 Perl を書いているメンバーもいましたが TypeScript をかけるメンバーのほうが多いためこの選択になりました。

用意されているサーバ3台について、夕方まではそれぞれのメンバーが並列にタスクに取り組みスコアを改善し、夕方以降に複数台構成にスイッチすることでリソース効率を最大化する方針を採用しました。

担当領域については明確な分担はなくお互いがなんとなくタスクを取っていました。ただ、パフォーマンス改善のアイディア出しやタスクの優先度付けは自分が行うことで全体の進行を調整していました。

開発のフローは、GitHub Project でバックログを作成、変更をブランチを切ってプルリクを作成して、master にマージする流れでした。プルリクを作るのは GitHub Project の Automated kanban のためで、特にレビューはしていません。

個人でやったタスク

  • NewRelic の有効化
    • 慣れてないのもあって使いこなせなかったです
    • 8時間という短い競技時間でうまく使いこなせてたチームはあったんでしょうか...?
    • 練習ではかなり勉強になったので良かったです
  • デプロイスクリプトを書く
    • いつもの
    • ただテンプレ化できる作業なので、事前に準備しておきたいと思いました
  • kataribe を入れる
    • いつもの
  • 静的ファイルを nginx から返す
  • 画像ファイルをローカルに保存する
    • セッションの関係で単純に nginx から返すことはできなくて、アプリから返すようにしていました
    • 結局スコアは改善しなかったのでマージはしませんでした
    • X-Accel-Redirect については知識はあったけど、うまく引き出しから引っ張ってこれなかったのが悔やまれる...
  • 複数台構成にする
    • 1台のサーバで nginx/MySQL を動かして、2台のサーバで app を動かす予定でした
    • だた、top で CPU 負荷を見ると MySQL の CPU が遊んでいたのですべてのサーバで app を動かしました

ふりかえり

競技終了直後にチームメンバーでふりかえりを行いました。その内容 + 個人的なものを書いていきます。

  • 担当分野を決めておく
    • app 担当、ミドルウェア担当的な感じ
    • 自分はもっと司令塔ポジに集中するべきだった
      • 競技後半手を動かしすぎて考える時間が足りなかった
  • ツール群はコマンド1つでインストールされるようにしておく
  • nginx とかの config はサーバごとに Git 管理するではなく役割ごとにする
    • config/isucon1/nginx/nginx.conf のように管理していました
    • config/nginx/nginx-primary.conf を管理してデプロイ時によしなに配るほうが良さそう
  • 複数台構成にするのは初手でやったほうが良かったかも?
    • 1台構成と複数台構成でのスコアの出やすさは違うので、最初から複数台構成にして仮説検証のサイクルを回すほうが正確かも
  • 1週間前ぐらいに一度集まって予行演習する
  • コア数が2だったので pm2 を導入したほうが良かった
    • そもそも pm2 の素振りもしたことがないのでやらないといけない
  • 各施策の KPI をスコアにしない
    • 何か改善を行ってもスコアに反映されないことがあります
    • これは他のボトルネックの方がスコアに対して支配的だからです
      • kataribe の集計結果やスロークエリが改善されているなら master に取り込むべきだったなと思いました
      • 他のボトルネックが解消されたときに爆発的にスコアが伸びる可能性があります
  • 前日はよく寝る

来年に向けて

チームメンバーは来年の参加も前向きだったので来年こそ予選突破を目標にがんばります。

2020年 ふりかえり

以前のやつ

2019年 ふりかえり - odan’s diary

個人開発

  • 人向けに何か開発することがなかった
    • 難しいしモチベーションが続かない

odan3240.hatenablog.com

github.com

github.com

github.com

ブログ

情報収集

  • Twitter/はてぶにつきっきり
    • RSS リーダーを見る習慣がほしいけど難しい
  • 本は読めてない
  • 試し打ち

OSS

  • こっちに書いた

odan3240.hatenablog.com

GitHub の草

上半期はいい感じに草を生やせていたけど、下半期はスプラトゥーンと真面目に向き合ったのが原因で枯れがちになっちゃった

f:id:odan3240:20201231212433p:plain

来年

  • 個人開発
    • 必要な範囲で OSS として何か作り出せていけばいいかな
  • ブログ
    • ネタはあるけど書くのが面倒になって放置パターンが多いので、いい感じに頑張りたい
  • OSS
    • めんどくさい楽しようという方向に流されると issue 作ったりプルリク投げたりしなくなっちゃうので、いい感じに頑張りたい
  • 情報収集
    • RSS リーダーを自作したいと構想して2年が過ぎた、いい感じに頑張る
  • 本を読む
    • いい感じに読む
  • 1年、記憶持たないので半年か四半期単位でふりかえりたい
  • GitHub の草
    • 毎日でなくてもいいけど、日々 public repository にコードを書いて残していきたい
    • ネタ帳を hackmd に置いてるんだけど使いにくいし見にくいので GitHub に移す予定

2020年ブックマークランキング

odan’s diaryの2020年ブックマークランキングベスト5(累計47ブックマーク)

# タイトル
1位 Perl でちょっと CPAN モジュールを試すのに Google Colaboratory が便利 - odan’s diary
2位 カバレッジの変化をプルリクエストに通知する GitHub Actions を作った - odan’s diary
3位 2020年の OSS 活動ふりかえり - odan’s diary
4位 今年 Amazon で購入して良かったもの - odan’s diary
5位 第二期 大王戦のふりかえり - odan’s diary

generated by 年間ブックマークランキングジェネレーター

2020年の OSS 活動ふりかえり

年末なので

issue

https://github.com/issues?q=is%3Aissue+author%3Aodanado+archived%3Afalse+-user%3Aodanado+-user%3Aodan-sandbox を眺める

Can't lint .ts files when use vue-eslint-parser · Issue #864 · microsoft/vscode-eslint

  • vscode-eslint の v2 がリリースされた次の日に発生した不具合を報告した issue
  • vue-eslint-parser を使っていると .ts ファイルが lint されなくて困っていた
    • 英語がまずかったのか問題の意図を伝えるのが大変だった...

/static/bootstrap/css/bootstrap.min.css が 404 · Issue #13 · perl-users-jp/perl-users-jp.github.io

  • 会社で perl-users-jp の改修やってるって話を聞いてコントリビュートしたやつ

https なサイトでプルリクの内容をプレビューしたい · Issue #24 · perl-users-jp/perl-users-jp.github.io

VTI Error: Cannot find module · Issue #1732 · vuejs/vetur

  • VTI は VSCode の Vue.js 向けの拡張機能である vetur の CLI ツールのこと
  • リリースされて、これは!ってなって即試したらなんかエラーが出たので issue を立てたやつ

Using an index type generates an object type · Issue #646 · nestjs/swagger

  • nestjs/swagger は会社で使っていて、その中であれ?って思う挙動があったので issue を立ててみたやつ
  • 実際は仕様で close された

A type of web3-eth is incorrect · Issue #3483 · ethereum/web3.js

  • JS だと default export されているクラスが、TS だと named export されていて立てた issue
  • 明らかにバグだけど影響範囲とかあるので、このままらしい
  • TS で web3.js を使うとたびたびつらい思いをする

TravisCI is failing · Issue #387 · GoogleChrome/rendertron

  • prerendering を試してみたくて rendertron の素振りをしていたんだけど、どうやらずっと CI が落ちているみたいで立てた issue
    • この後 CI をグリーンにするプルリクも投げた
  • CI が red なまま開発する OSS もあるんだなあってちょっとびっくりした
  • テストで GCP にあるプロジェクトの DB を参照していて、なるほどなとなった
  • 今見たら GitHub Actions になってた

Add an option to disable repos.createCommitComment · Issue #126 · nwtgck/actions-netlify

  • actions-netlify は GitHub Actions から Netlify にデプロイするやつ
  • デプロイするたびにコメントがついてメールが来ていたので、無効化するオプションがほしいと思って issue を立てた

account.hashMessage is incorrect with non-ASCII characters · Issue #3523 · ethereum/web3.js

  • ASCII に含まれない文字を関数に渡すと正しく処理されないバグ
  • "🤗".length は 2 だが、Buffer.from("🤗", "utf8").length は 4 なことに起因するバグだった
  • 文字コード難しいね

エラー発生時にユーザーにエラーが発生したことを伝える · Issue #20 · mak4026/splathon_ladder_web

  • スプラトゥーンのコミュニティの Web アプリで、エラーが発生していることがユーザーに届かない仕組みだったので issue 立てた
  • このあとプルリクも投げた

createAt/updateAt is of different types for CSR and SSR · Issue #114 · nuxt/content

  • nuxt/content がリリースされて、すぐ試したらバグを踏んで issue 立てたやつ
  • Date オブジェクトが JSON に変換されるときに文字列になるんだけど、その時の方式がブラウザと node.js で異なるのが原因だった気がする

generate sitemap.xml · Issue #386 · nuxt/content

commit lock file for PetAdoptions/cdk/pet_stack · Issue #28 · aws-samples/one-observability-demo

  • Observability に興味があって、AWS の workshop を試していたんだけど、サンプルコードに lock file がなくて動作せず、lock file を push してくれという issue を立てたやつ
  • 反応ないし、似た問題を抱えている人もいないのでみんな困ってないのかな

The Japanese translation of creating-a-composite-run-steps-action.md is wrong · Issue #751 · github/docs

  • GitHub のドキュメントの日本語ページの code block とかがすごい壊れていたので issue を立てたやつ
  • 手動で直してプルリクを投げようかなって思ったけど、どうやら自動翻訳らしく issue 立てるだけで良かった
  • 今見ても日本語ページ壊れてるしいつ直るのかな...

truffle-v5: Some properties of Truffle.ContractInstance are missing · Issue #315 · ethereum-ts/TypeChain

  • TypeChain が生成する型のプロパティが不足していたので立てた issue
  • そのうちプルリクも投げる予定

プルリク

https://github.com/issues?q=is%3Apr+author%3Aodanado+archived%3Afalse+-user%3Aodanado+-user%3Aodan-sandbox を眺める (飽きてきたのでピックアップするだけ...)

DefinitelyTyped 系

  • 今年初めて DefinitelyTyped にプルリク投げたし、@types/keccak は初の Author な型定義になった
  • 今見たら週間 3000 Downloads ぐらいあるらしく嬉しい

ethereum/web3.js: Ethereum JavaScript API

  • web3.js の provider は構造的部分型を考えると send メソッドを持っていればいいんだけど、型定義がそうじゃなかったのでプルリク投げた

feat(markdownit): add types of $md by odanado · Pull Request #376 · nuxt-community/community-modules

  • 型定義がなかったので投げたやつ
  • 先に issue 立ててお伺いを立ててからのほうが良かったかな

docs: add comma by odanado · Pull Request #2533 · vuejs/vetur

  • Vetur の新しいバージョンがドキュメントと共にリリースされたんだけど、ドキュメント中のコードが文法的に invalid だったので修正のプルリクを投げたやつ

まとめ

  • 新しいツールとか新しいバージョンの OSS は結構狙い目
    • 仕事とかで普段使っている OSSwatch しておくと、新しいバージョンに気付けるので良い
  • 来年も仕事で使っている OSS に不具合を見つけたら issue 立てたりプルリク投げたりしたい