名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

2021/08の振り返りと近況

ブログ書く頻度が落ちているので、8月に何をやったかだけざっくり記録を残しておく。 時期の都合もあるが、なるべく月曜日を起点に話すようにする。

8/1~8/8

PyCon JPのレビュアーとしての活動をしていた。 もう少しこの辺りは内容を温めて書きたいので、年末までに何とかしたいところ。

DBスペシャリストの申し込みをした。 ただそれ以降の予定に引っ張られて9月半ばからの勉強になりそう。 今回は午前1から受験しないといけないので、本腰入れて勉強する前に応用情報の過去問とか漁って練習していこうと思う。

k8s勉強会とか。O'Reilly Japan - Kubernetesで実践するクラウドネイティブDevOps を使って4月ごろから回し読みしていて、結構終盤まで来ている。 多分この週はセキュリティとバックアップをやっていたらしい。 最近この手のまじめなメモが形式的な形で残せていないので、うまいやり方を考えたい。

ちなみにこの辺を見たらしい。 * Kubernetesクラスタの移行にVeleroを使った話 * k9sで快適なk8sライフを送ろう! - エニグモ開発者ブログ

テスコンのあれこれをやっていたらしい。

ISUCONの練習会をした。ISUCON10のものを使って、ゴリゴリ設定周り書いたりした。 あんまりコード読む練習はこの時点ではできていない。 結果的にここで設定した Nginx の設定は活用できたので良しとする。

8/8の日曜日はかなりよく寝た。7月からの疲れが限界だった。

日記を始めたが、すぐに途切れてしまったので9月からはまた再開したい。

8/9~8/15

PyCon JPのトーク採択会議に裏側で参加していた。 いいものはいいという話になるが、当落線上になるものは人によってOK, NGが分かれて、大変だなあと思った。 この催しに関しては勉強になるので参加しているが、自分自身が Python エンジニアから離れてしまっていることもあり、来年も参加する保証はどこにもない。とはいえコミュニティのために活動することは、現状勝提供しやすいことでもあるので、コミットレベルは下げるとしても何かしろを考えたい。

各種SNSなどに対するプロフィールをこのころ一新している。 反映が間に合ってないものもいくつかあるので、登録メディアを絞ったほうがいいかもしれない。何かあるごとに見返して更新するコストのほうが高くついてしまっている。

個人の活動が少ないのでなぜだろうと考えていたけど、この週は RTA in Japan 見ていて、ほとんど作業をしていなかったからという可能性が高い。 個人的にプレイが面白いのも見どころであるが、知らないゲームを知る機会にもなっているので、見ていて満足度が高いのがあるのかも。 何かのゲームをそれなりの速度でプレイするくらいは真似してみようかなと思いつつも、あんまり競技として参加する気は起きてない(通常プレイの参考にしていて、デススマイルズのプレイをまねして地形にめり込んだりパワーアップタイミングを変えてみたら、ちょっとうまくなれた気がする)。

k8s勉強会で Jsonnet とかで設定かけるものがあるらしいけど、そもそも Jsonnet を知らなかった。 Jsonを拡張して変数埋めたり for 文埋めたりできるモノらしい。Jsonに強依存してそういうことがしたいならいいかもしれないが、個人としては Json をそういう使い方したいのかなぁ(そうなる場合はもう既存の知ってるプログラミング言語でなんとかすればいいような気がしてる)、とか思ってしまった。頭の片隅に置いておく。

あとは Helm 周りの話がよく出てくるが、最近のHelmの情報を得る方法をあまり知らないので困っていたりとか。 10のHelmチュートリアルでKubernetesの旅へ とか使えるんだろうか。

龍が如く0やったりネプトゥーヌRe Birth 1やってたのもこのころ。龍が如くはやりこみしんどくなってきてしまったので、一旦放置してて、ネプトゥーヌは全キャラだけ出そうとして少しだけやりこんでいる。

8/16~8/22

ISUCONに向けて最終調整としてRustの勉強だけしていた。MySQL 8.0のコンフィグ周りも勉強したけど、クエリキャッシュ周りが変わってしまっていてどうパフォーマンスを出せばいいのかがやっぱりわかっていないし、いまだにわかっていない。勉強不足。

そんなこんなでISUCON当日を向かえてなんとかやる。結果は前のブログに書いた通りで、施策がうまくはまった。 公式の講評はまだ読んでいないので、また今度じっくり読む。

嫌われる勇気を audible で聞いた。これは非常によかった。 人の悩みを自分の悩みと勘違いして悩みすぎるのは確かに良くないのかもしれない。そういう傾向が少なからず過去の自分にはあり、疲れた気持ちになったこともあった。これに関しては強く関与したい心理的距離が近い人物であれば、そういう関わり方をしてもよいが、そうでもない有象無象の人に対しては、もう少し気楽に構えて話を聞くだけにするのがいいのかもしれないと思った。 あとは共同体感覚。自分がかかわりたいと思う場所を自分で選んで、他人のために貢献する、を徹底していきたい。惰性でとか、流れで走してきたことも過去にはあったし、そういう時は気持ち的にきついことが多かった。そこはどうかかわりたいかと、自分が何ができるかをしっかり線引きしてもいいのかなあと。 それとエンジニアをやっていると因果関係からひも解く原因主義に陥りがちだが、現状のふるまいから現状を分析するという逆説な考え方も身に着けていきたい。OODAの本を最近読んだような気がするが、そのあたりも含めて応用できればいいのかなと思った。 他はまたもう少しアドラー自体について知りたいので勉強したらアウトプットする。

8/23~8/29

テスコンのあれこれをやり始める。この週はこれ一本にほぼ集中していた。今年も結果的にコミットメントが低かったように思うので、この手のものは一回手を引いて自分自身のスタンス自体を見直そうと思う。 とはいえ、2年出てみて、ようやく自分が何を求めてこれに参加しているのかをなんとなく理解できた。 Openクラスは自分でやるにはハードルが高すぎるので(概念の理解が甘い部分がある)、少なくとも来年は参加しないつもり。来年以降は参加できたらしたい。何がわかったのかは、いろいろ終わったら書くかもしれない。

ワクチンの接種をした。腕が上がりづらかったのと頭痛がひどかった以外は良かったかも。ただ、それ以前の日に寝付けない日々が続き、翌日すごい寝てしまった(休みだったのでよかったが)ので、次回が少し不安。体力がすごい奪われているのかもしれない。 一方で熱が全くでなかったので、それはそれで不安。大丈夫なのかな。

夜更かしグループ「yonaki.dev」 - connpass に参加したりした。 久々に友人が頑張っているのと、子育ての話を聞くのは結構面白い。テクノロジーで解決できそうなことや、人をうまく使って解決することなどが見えてきがち。二人で子育てしていくことの大変さを聞いていて感じる。 子供のころを思い出すと、母親はその当時専業主婦だった(これ地域的な問題もある)ので、完全にそれ集中とできるとまた話は別かもしれないが、現代の東京において雇用スタイルも変化している中で、夫婦だけで育て上げるというのはとても大変だと思う。育休が当然の世界に向かっていくのも強く納得できていて、それを目の当たりにしているというところだろうか。 個人としては独り身であるので実経験することとはほど遠いが、近い人が目の当たりにしている体験を共有できるというのはいいなと思った。 というわけで、気になる方は参加してみてください。

8/30~8/31

疲れて限界迎えてました。

RustのLT会 Shinjuku.rs #17 @オンライン - connpass

これ聞きながら寝落ちしてしまったようで、主催の人に申し訳ない気持ちに。これから資料追ったりしようかと思います。

9月からに向けて

忙しいことを言い訳にいろいろさぼってきたので、まずはこの辺を考えている。

  • 生活リズムを変える
    • 早く寝た方が精神衛生上良いことがわかっているので早く寝る
    • 仕事もフレックス使えるし、多少早めに始業して遅い残業減らしたほうがいいのかもしれない
      • 夕食食べる時間をずらすと、精神衛生に問題が出ることがわかってきているので、最近19時前後に夕食休憩にして、必要があればそのあと戻って作業してる(幸いそれOKなのがわかったので、活用している)
  • 運動をする
    • 健康診断も受けたんですが、体重が誤差の範囲ではなく増加しているのを感じました
      • 服もきついしなぁ
    • 忙しい時期だと作業をしなければいけないので運動さぼっていたのですが、自分でコントロールすればよいことが増えたので、9月からはなんとかできそう
    • まずはリングフィットやるけど、天気が良ければランニングも再開したい
      • 走ると結構気持ちよく感じるので
  • 勉強をする
    • 根本的にインプットする時間が足りていない
      • 1日1時間くらい本を読んだりしたい
      • ネット記事とかを効率的に収集したりとか
      • 後はメモを取って頭の中に残す努力も…
    • 直近はコンテストや資格試験の勉強とかに集中するけど、それ以降は考えていない
      • 久々にアルゴリズムやるとかもいいのかなとか
      • Coding Game触れたいなと思いつつ、無限の時間がたってしまっている
      • ほか Unity とか Blander とか 3D 技術を使って何かをしたい気持ちもあるが、何もついていってない
  • ゲームをする
    • 最新のゲームやるというより積みゲーを崩す
      • ネプトゥーヌシリーズと、閃乱カグラシリーズと、FFが結構詰まれている
      • インディーズゲームとかも本当はやりたいけど、そこまで手が回ってない
      • Steamセールで買ったものをまずは減らしていく
    • とはいえインプットしたい時期でもあるので、バランスはとっていきたい
      • 月1本くらい
    • ポケモンUniteとかウマ娘もやりたいような気がするけど、めんどいんだよなぁ
      • ウマ娘の育成、20~30分かかるという現実があって、このコストを払うのが非常に高いと感じている
      • ポケモンUniteは友達とやるときしかやる気が出ない問題がある
      • まあたぶん通話の時に誘われればやるだろうし、それ以外は自分の作業してたいな、が本音になるなぁ
  • 日記を書く
    • 記憶力の問題もあり、一月のことを思い出すのが結構難しくなってきた
    • 毎日書くのがベターだと思うけど、気持ち的に続けらないので、書きたいときに書くようにする
      • 10分くらいで今日気になった記事のリンクだけざっとはっとくだけでもいいかもしれん(読み返せてないことが多いので)
  • 週の振り返りにもう一回チャレンジする?
    • 土曜日くらいに振り返っていきたい気もする
    • これも記憶力の問題で月一で振り返りするの厳しいから
    • 月一でかく振り返りはこれのサマリで良いはず。。。

まとめ

そんな感じのお気持ち記事でした。 まあなんとなく感受して記録に残らない形にすることが増えてしまっているので、これは打開したいポイント。 その時、大事にしてたことっていうのをすぐ忘れてしまう。最近の後悔としては学生時代のことをほとんど思い出せなくなっていること。 面談や面接をする立場や、キャリアについて話す立場になってきているのを感じていて、そういうことやらないといけないシーンもあるけど、特に大学1~3年のころは忘れてしまったし、あの頃の活動を振り返ると無駄なことばっかりやって楽しんでいたなあと思う。

それもよき思い出である一方で、自分の失敗は軽めにしていただきたくとか思いつつ、難しいところである。 今自分が見て最適な行動はこれみたいなのを判断することはできるかもしれない。ただ、その話を聞く人が自分と同じ視点を持っているとは限らないし、もっと良い方法もあるかもしれない。なのでなるべくアドバイス的なものは個人的にしたくないし、話を聞くだけにとどめておきたい(一言付け加えてくるおじさんの印象が悪いという話もあるというのはわかっているので、ここ数年あまりそういうことを言わずに話を聞くことを努力しようとしている)。

とかなんとか話がそれてしまったのでここで終わることにする。8月は忙しかったことにかまけてしまったので、9月からは気持ちを新たにやっていきたい。

2021年8月の読書まとめ

積み本が多いので、読む時間もう少し増やしたいかも。

8月の読書メーター
読んだ本の数:3
読んだページ数:655
ナイス数:14

嫌われる勇気嫌われる勇気感想
Audibleでぼんやり聞いたので、とびとびの理解だが、面白かった。因果論で語りえない現状のふるまいからの分析や、他人の問題を自分の問題として捉えることによる疲弊など、思い返すと自分自身にも経験があるようなことがいくつかあり、共感できる部分も多かった。共同体感覚に対しては、自分の中のざっくりの理解では、自分が心からコミットしたい場所そのものだと思っていて、そういう場所を見つけ作れるといいのかなあと思いました。岸見さんのアドラーに関する書籍が紹介されていたので、そちらも読んでみたい。
読了日:08月27日 著者:岸見 一郎,古賀 史健
資本家マインドセット資本家マインドセット感想
Audibleで聞く。会社を買うためにマッチングサイト見てみるとか、実際に経営に持っていた話とか、そういうアイディアをもらえたのは良かった。実際のところ引き継ぎ手がいないので、消えてしまう会社や事業って存在しているんだろうなというのを感じられたし、そのあたりは視野に入れてもいいのかなと思った。一方で自伝的な部分も多く、そのあたりはあんまり覚えがないかも。
読了日:08月14日 著者:三戸 政和
LIFE SHIFT(ライフ・シフト)―100年時代の人生戦略LIFE SHIFT(ライフ・シフト)―100年時代の人生戦略感想
audibleで聞いた。人生が100年に伸びることでライフタイムが大きく変化することがデータ面からもわかったし、ライフプランについても多種多様な方向が存在すると感じた。個人的には3ステージの人生が終わることによる、労働時間の延長が起こることに対してどう行動していくかが大事かなと思いました。単に働くだけでなく、幅広く経験していくことが大事なのかもなぁ。あとは有形/無形の資産形成も少し考えていかないとなーと思いました。
読了日:08月02日 著者:リンダ・グラットン,アンドリュー・スコット

読書メーター

ISUCON11に参加しました(決勝進出したらしい)

久々に参加記です。undefinedというチームで参加して、最終スコア141453を得て決勝に進出することになったらしいです(ええ….)。

以下、時系列順に振り返りです。

5月ごろ

チーム決めのため、友達と6人集まったので2チームで参加することに。目的としてはISUCONを通してミドルウェアへの知見やパフォーマンスを上げていくためのチューニングを学ぶためで、順位は半分くらい行けばいいな~くらいのテンション。

抽選の結果、去年一緒に組んでいた pytran さんとは別のチームで参加することになり、 @mosmos_21@pxfnc と出ることに。

言語Rustにして、7月中を勉強期間、8月は練習会とミドルウェアをやりたいですね~という話をして準備を進める。

6月ごろ

ISUCON申し込みの日あたりは前職の最終出社日の後だったので、ビートマニアの椅子待ちをしてる時くらいにささっとやる。

すぐ枠が埋まったので迷わず申し込んで本当に良かった。あと業務中だからあとで~とか考えずに申し込む勢いも持っておかないと、今後は申し込みバトルに負けそう。来年は無理にでも時間を空ける(空けた分の時間は他でカバーすればいいかなと思う派で、来年生きていて参加できる保証もあるわけではないが)。

7月

転職してゆるゆるRustを勉強していた。転職先ではPHPを書いている。そのうちこれについては表になる情報が出てくると思うので、お待ちくださいまし。

ちなみに The Rust Programming Language 日本語版 これをやっていた。日本語版と英語版の両方を読んでいる(差分があるので、英語版を読むのが良いが、残念ながら英語版では自分の頭が足りず、誤読をしてしまうため併読)。

8月

7月中にRustの勉強を終わらせる気でいたが、気まぐれで PyCon JP のプロポーザルレビュアーをやった結果、Rustの勉強が終わらなかった。勢いに乗ってプロポーザルはすべて読んだ。これはこれで面白かったので、のちに書きたい。

ISUCONの練習会をした。ISUCON10の問題をやったけど、あまりスコアが上がらなかった。というか環境構築に時間がかかりすぎてしまって本質的なスコアを上げるのが難しかった。座標系にインデックス張ったりするやつ試しておきたかったなぁ。

GitHub CLI を使って PR を出したら、フォーク先じゃなくてフォーク元に対してPRが出てしまった。恥ずかしかった。悲しい。

github.com

8/15あたり

疲れ切って龍が如く0と、超次次元ゲイム ネプテューヌRe;Birth1 をクリアした(素晴らしい人間ではないので、気を抜いてしまう)。最高だったので、これについては後で書く。

Rustドキュメントをちょっと追い込んで、コレクション型までやった。

8/16~8/20

結構仕事を頑張っていたと思う、一応リード的な役割を果たす人になりつつあるので、いろいろなプロセスに入って行ったり、改善したりしている。このことについても今度書ければいいと思う。

Rustはちょっとやってた。あと MySQL 8.0 のコンフィグを覚えておきたい(練習会の時に MySQL 5.7 と同じコンフィグを書いたら、MySQL 8.0 では使えない定義だったりしたものもあってハマったので)と思って最後にQiitaをいくつか読んだ。

nginxのテンプレをここから拝借してまとめておいた。

SCARLET NEXUS がSteamでセールしているので買う。

知り合いが開催している yonaki.dev ににぎやかし参加する。育児関係に対するドメイン知識が増えたが、私は結婚も育児もしていないので、知識を活かす先がない(?)。ただお金がかかるイベントであるのは事実なので、そこに対するスケジュール、金銭管理、また赤ちゃんごとの特性なども加味しつつ、準備とリスクヘッジが大事ということはわかってきたので、プロジェクトマネジメントっぽい視点で俯瞰していかせることも多そうだと感じた(?)。

当日

これからは時間軸ごとに。

9:00

起床できた。ISUCON予選のYouTubeが始まるまで、これを見てた。(月一くらいで見てる気がする)

www.youtube.com

9:45

飯食べながらYouTubeを見る。チームメンバーは無事に集合していた。安心した。

10:00

競技開始。ポータルが正しく動いていることに驚く。

11:00

  • (全員)マニュアルを読む
  • mosさん)テーブルの構造などをつないでもらい、DBとアプリケーションの分割を担当する
  • (pxfncさん)git pull したらデプロイできるようにする。GitHubaccess tokenとかやってた気がする。
  • (yumechi) nginx のテンプレ設定を張り付ける。ISUCONのコンテスト中の説明を2人にしたり、しなかったりする。各種マニュアルをリンクするだけの人。マシンのIPを共有するだけの人。

12:00

  • (全員)各種ツール類のインストール、コードを読んであたりをつける
  • mosさん)アプリケーションとDBマシンの分離をしてくれていた。点数が2~3倍になる。助かる。
  • (pxfncさん)Rust周りの環境構築をローカルでできるようにしていたり、git pull でデプロイできるようにしたり、Rustをビルドして再実行するだけの小さいスクリプト(これが超便利だった)を作って開発をしやすくしてくれていた、助かる。
  • (yumechi) DBのgeneral logと slow_query log を出すようにして、ベンチを回して様子見。 general log から強く問題がありそうな n+1 を特定する。ちなみに設定をミスっているためか、一生 slow_query log が出なかった(なぜ?) この時点で slow query の問題より、 n + 1 のほうが問題があると考えてしまう。

general log から insert が多いシステムだと判断できたので、 insert 周りのケースで問題があるところと単に index 張って直せそうなところを中心に見ていく作戦にする。

自分自身の反省としてはここで where に condition が含まれてないので、 condition の分割優先順位は低いと思ってしまったこと。コードを見れば自明だったが、検索コストが高いことから分割すべきであった。

14:00

  • (全員)ご飯食べる。ご飯は大事。
  • mosさん)condition周りの改善ができそうということだったので、分割せずに条件分岐を最適化し始める。文字列パターンがせいぜい8通りなのでべた書きして高速化する。元の処理よりはかなり早くなっていた。
  • (pxfncさん)Rustのコード書くサポートしてもらいつつ、trendの改善に乗り出してもらう
  • (yumechi)雑にindexを張って点数を稼ぐ。trendがまずそうなので、コードを読みながら pxfnc さんと協力しながら進める。MariaDBのコンフィグをいじくりまわす。

ここでの反省は各マシンのCPU使用率や、メモリ使用率の確認を後回しにしてしまったこと。せめてEC2のダッシュボードくらいは眺めてもよかった。16:00過ぎにtopしてみてメモリの量とか見て、過去年度よりもISUCONのマシンスペックが高いことに気が付いた。もっと別の戦略もありそう。この時点でもう少し見ていればDB分割なども視野に入れられたかもしれない。

16:00

  • mosさん)マシンの接続周りの設定を変えてもらう。alp で各種APIリソースのコスト計算などを見てもらう。condition最適化の続き。
  • (pxfncさん)trendのコードを最適化してもらいつつ、Rustのサポート。
  • (yumechi)imageのカラム fetch をやめるために select * になっている部分をつぶす。多少効果があったっぽいがコンパイルエラーを発生させて0点をたくさん取った。コンパイルできるかは手元で確認しましょう。pxfncさんがクエリ書くのに苦戦しているので、自分が欲しそうなクエリを書いてRustの実装はお任せする。ついでにRustでキャラクターの値も const にしたがずっとコンパイルエラーを起こしていてすみません!!!!!!と言い続けていた。

時系列順で考えた時に下記を思い出す。

https://stackoverflow.com/questions/12752375/mysql-group-by-id-and-latest-datetime

IDのMAX = 時系列の最新かどうかについては非同期処理の場合必ずしもそうとは言えないのではないか、という一種賭けに近いところはあったのだが、下記のロジックでお願いした。

  • 各椅子のコンディションについて、椅子ごとのコンディションIDの最大値を求めててもらう(サブクエリで書けることはわかっていたが、これを再実行するコストのほうが高いと判断して、先に実施して id 列を出してもらう方法にした。実際一発で書いたほうが短くなるような気がするし、意味があったのかは確証がないが、感情的にサブクエリが実行されるより指定された id を in で調べた方が早いと感じた)
  • この結果を使って、椅子と椅子のコンディションを join して結果を求める

これによってかなりスコアが伸びた。凍結前 2.5 万くらいのスコアだったはず。

これは事実です。Rust書けなさすぎワロタとなっていた(じゃあ予選突破者人気のGoだったらどうだったかといわれると、Goのほうが触れないので余計無理なのだが。これに関しては追記参照)。

17:00

この辺りからモブプロになっていく。

  • 残り時間でやりつくした感じがあり、あまり触れないようにしていたが、延長の話が出てたのでもうひと挑戦したくなった
  • TODOになっているところを外してみることに気が付く。
    • 初期のころ、外してかなりスコアが悪化したことから触らないようにしていた
    • クエリ、レスポンス改善によりアクセス数が増えても良いのでは?という戦略になり、外すことにする。
    • drop_probability を 0.5 -> 0.1 -> 0.0 に変更してベンチを取り続けていたが、幣チームの場合は大きくスコアが上がった。3倍くらい。
    • 値を少しづつ変えてベンチを回していた
  • 調整中にベンチが凍結されてしまうので、作業がストップしてしまった。
  • (pxfncさんはビルド周りについて調べててくれていたはずだけど、あんまりチャットログが残ってないのと、僕のRustのエラーのサポートめっちゃやってくれてたので神でした)

この辺りで5~6万だった記憶。

18:00

  • nginxで一部のリクエストを分割できないか?という話になる
  • upstream でほげほげすればできそうというのを mos さんが調べてくれた(神では?)
  • 3台目アプリケーションサーバーにしようという提案をしてpxfncさんにセットアップしてもらう
  • yumechiがnginxの設定をいじりつつ、mosさんにチェックしてもらう
  • 設定がうまくいき、3台目がアプリケーションサーバーになる

www.nedia.ne.jp

この記事が参考になりました。

ログがうまく流れね~~とかそういう話しつつ、スコアが上がったからまあいっかとなる。これ本当に成功してよかった。

最後に nginx の微妙な設定を yumechi がいじったり、ログを全て出していないことを確認したり、再起動テスト(これ 17:00, 18:00 もやって試したので万全ではあったけど)やって終わりになりました。

ポータルで最後確認したのは 13.8 万程度。

18:45(コンテスト終了)

疲労困憊してた

19:00

www.youtube.com

クロージング見てたら、豚乙女さん?!?!!??!!?!?!??!!となって心臓が飛び出た。

19:30

集まって話していたけど、みんな疲れたのでそのまま落ちた。例年ならここで飲み会とかするんだろうけど、もうそんな元気すらなかった。

21:00

超次次元ゲイム ネプテューヌRe;Birth1 のやりこみや、 CELESTE Classic をISUCONチーム外から紹介してもらって遊ぶ。

8/22(翌日)

めちゃくちゃ良く寝ていた(11~12時間程度)。疲れていたんだと思う。

起きてから ABC 215 B - log2(N) を一生バグらせる。センスがない。一応解けたけどこういうことではない。多分この手の問題は C++ より Python の得意とするところなので、普段なら間違いなく Python で解く。

14時に結果が発表されたが、なぜかチーム名があり困惑した(うれしくもあったが)。勉強や準備が間に合わず ISUCON から提供されている Splunk や NewReric なども活用できず、素朴に素朴に点数を稼いでいっただけだったので、まさか残るとは夢にも思っていなかった。

まとめると下記4つの戦略が運よく大きくきれいにはまり、点数が線形に伸びていったことが良かったと思う。チームメンバーに感謝…。

  • マシンの分割(app2台、DB1台)にできたこと
  • trendの最適化
  • 全員が主体的に動けて、通話しながらチームワークを発揮できたこと。git pullやRustのビルドスクリプトなど素早く開発できたこと
  • 全員がマニュアルをよく読んでおり、点数になるポイントを抑えられたこと。最後のTODO外すなどの戦略はとても良かった。

決勝の発表後と気持ち

  • とりあえずISUCONの決勝の日、テスコンの決勝戦とも被っているので日程調整
    • 各所に頭を下げてきた。「どうしよう?!」と思いつつ、双方のチームの方にご理解いただいたのでよかった(本当に申し訳ないとは思っている)
    • この時間はこれで行きます、みたいな調整をした(ISUCONはフルで参加できず、時間帯が存在することになるが、テスコンもテスコンでコミットしたい部分があり、どちらも出ることで自分は決断することに)。
    • テスコンはこれから最後の追い込みなのでやっていく(ISUCONよりかなり貢献できてなくてチームメンバーにお礼することしかできとらんが…)
  • ワクチンの副反応が心配な時期なので、体調を万全にすべく準備しておかねば
  • 8月中はテスコンがんばって、9月はISUCONを頑張って、ISUCON終わったらDBスペシャリストやって、みたいな感じになりそうで、DBスペシャリスト終わったら少しゆっくりしたい(ほんとかな?)

まとめ

勉強目的での参加だったので、決勝に残ったこと自体がびっくりだったのですが、結果以上に(自分の都合やわがままに突き合わせてしまっている)一緒に活動しているメンバーに感謝をしています。ありがとうございます。

素朴にやった戦略がたまたまはまって点数が出たので、非常にうれしいですし、やってよかったと思います。

本番に向けてですが、復習として下記が思い浮かんでいます。すべては実施できないかと思いますが、いくつかには手を付けたいです。

  • Rustの勉強(言語が書けなさ過ぎて足引っ張ってしまったので)
  • テーブルカラムの設計(変更してダンプして、編集する、みたいなところは今回避けてしまったが、シュッとやれていれば~~と思っている)
  • 他の分析ツールとか、手法。全然知らなさすぎる。
  • コンフィグ周りをシュッとあてる方法。ansibleでやれたらな~~~と思いながらできなかった。config自体は用意できていてよかったが。
  • MySQL8勉強するか、MariaDB勉強するか。自分の知識はMySQL5.7に対してのものが多く、学習コストだとMariaDBやったほうが効率がいいような気がしている(MySQL8に対してのdiffや勘所が頭に入っておらず、MariaDBのほうが自分の直感に近いのではないかという感覚がなんとなく存在している、本当か?)
  • キャッシュ周りやオンメモリ戦略(Condition以外はメモリやキャッシュに乗せられる形のような気がしていて、うまく乗せて高速化できた可能性がある。決勝でもそのような考え方ができるシーンはあるかもしれない)
    • generated column も一瞬使ったけど、やめた。timestamp のソートには使えたかも。
  • コンフィグ周り、知識が何も足りていない
    • 雑に gzip 配信していたが、必要なかったらしい
  • インデックス設計。uuid, timestampについては即座に張ったが、複合インデックス戦略とか、-1をかけた何かを使う(ISUCON10でもあったテクだと思うが)などもあり得るかもしれない
  • DB2台戦略。DBのCPU張り津きしているのは知っていたが、APPのほうが課題間合ったので、そっちを優先してしまった。コンフィグと合わせて調査が必要。
  • Varnish、何(ISUCON感想戦で見たが、知らないもの)
  • SQLで解決できる問題はSQLで解決しましょうということ(limit 周り見直せるところは結構あった)
  • 分析方法の最適化。generalログを目でgrepするのは効率が良くないし、動的にカラムが変わるようなクエリが投げられた場合、集計がうまくいかないはず。この辺りは調べておきたい。
  • alp自分も使えるようになりたい
  • ISUCONの本を読む 3章あたりまでしか読めてない
  • 去年の自分の参加記を読み返す

追記

追記1

Rustの知見が世の中に出始めているのにもかかわらず、Rustの採用数が少ないことに驚く。決勝進出チームはわずか2チームなの意外に思う(自分はPythonPHPしか書く方は得意ではないので)。自分たち自身もRustの強みを強く生かしきれたわけではなかったが、もっと多いと思っていた。

ちなみに前職でも同じ部署だったメンバーからRustおすすめされていたこともあり、今年はRust勉強する気でいくぞ~と思っていた。

本番でいろいろやらかして恥ずかしかったのですが、コンパイルエラーめっちゃわかりやすくて体験としては良かったので、もう少し向き合ってみるかも。言語の良しあしについては何とも言い難いものの、今回の予選で自分の感覚ではこれからフィットしてくる言語かもしれないと感じました。

追記2

最終的に5桁→6桁に盛れたのでよかった! 伏線回収完了。(この発言はISUCON11 予選オープニングトークにて参加者数の桁が間違っていたことにかかっています)

追記3

自分のスキルセットとかを参考までに。

  • ISUCONに関連する言語言語
    • Pythonを仕事で3年半くらい、自然に読み書き可能
    • PHPを仕事で2か月くらい、読み書きはそれなり
    • Go, Ruby, Rust, Nodejs は読めはするけど、その言語特性に合った書き方は全くできてないと感じる
    • Perlコードゴルフ以外で読んだことない
  • ミドルウェア
    • Nginxのテンプレコンフィグを埋めるくらい
    • MySQL5.7のデフォルト設定をいくつかいじるくらい
    • 他はほぼ知らない、Redisはちょっと触ったけど、仕事でやったことはない
    • 一般的な設定までで理解が止まっていて、細かい設定勝負になると絶対に負ける
  • チューニング
    • インデックス設計は感覚レベルでしかできない
      • 最適なものを張ることというより一時しのぎだが、効果が出そうなものをやるくらいしかできてない気がする
    • クエリのフェッチや実行回数に対しての肌感がなんとなく存在しているような気がする
      • いわゆる論理的にというより、ニオイで判断するタイプなんだろうという自覚が強い
      • 今回はたまたまこれが完全にハマっただけで、運が良かったと思っている

自分が初回(4年前)に参加したときはこんな感じだったなというのを思い出す。これに比べたら、確実に成長している。ただし、まだまだ足りないところばかりである。

  • ISUCONに関連する言語言語
    • Pythonを仕事で半年くらい、読み書きはそれなり
    • PHP, Ruby, Nodejs は読めはするけど、その言語特性に合った書き方は全くできてないと感じる
    • Perlコードゴルフ以外で読んだことない
    • Rust, Goは知らない、何も理解していないので読み書きすらできない
  • ミドルウェア   なんもできないし、本当に何も知らなかったし、今思うとなぜこれで働けていたのかが正直謎になっている   ひよっこだったなあと改めて思うし、当時のメンバーはやりづらかったんじゃなかろうか…
  • チューニング
    • なんとなくインデックスを張るくらいはできるだけで、なぜインデックスをそこに張るのかの根拠がほぼなかった

追記4

去年やるといってできたこととしてはこれくらい。

  • Generated Columns への理解。結局使わなかったが、その場で作ってみるとかはしてていた。MySQLのGenerated Columnsまとめ with Rails を読んだ
  • この nginx 設定を実践した
  • nginx 周りのあるある設定は押さえた、まだ学ぶことは多い
  • CPUやメモリ使用率周りは見ることができた、見てから何も改善していないが
  • ansibleやると思ってちょっとやったが、実践投入は無理そうだった。ISUCON10の予選リポジトリとか参考にして勉強し直したい。

できなかったことはこれら。去年調べたツール系ほとんど調べてないじゃないですか。

  • Rustの勉強が不十分
  • https://namonakimichi.hatenablog.com/entry/2020/09/20/205906 で書いたことはほぼ調べてない
  • MySQL 8.0 周りはほぼ理解できてない、まずは差分を追わないと
  • 監視系、結局今年もできてない。メトリクスを見るのが弱いという自分の性質も相まって後回しになっている。よくないので、決勝までにできそうなことを探す。

追記5

チームメンバーとの分担とかを書いてない気がしたんですが、結構モブ的にやっていて明確に役割が分かれていたのは前半だけで、後半15時くらいからはモブプロっぽく画面を共有して議論する形が多かったように思います。結果的に戦略がハマったこともあり、いい感じでした。

追記6

そのうち予選で使ったリポジトリを公開するので、公開したら追記します。(管理は pxfnc さんにお任せですが)

公開されたので貼っておきます。

github.com