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 立てたりプルリク投げたりしたい

第二期 大王戦のふりかえり

この記事は Splathon vol.1 Advent Calendar 2020 の11日目の記事です。

f:id:odan3240:20201213163831j:plain

大王戦 とは

Splathon 内で開催されているウデマエ別の大会です。この大会は大王/王子王女/将軍の3つの Tier に分かれていて、自分が参加した大王 Tier は XP24 後半から XP27 後半までのメンバーが参加していました。開催期間は約3ヶ月間とちょっと長めの大会です。

この大会は、予選ではナワバリ含む全てのルールと指定8ステージで、各チームが総当りで4先の対抗戦を行い、決勝では予選リーグ1位と2位がフェスステージを含む5先の対抗戦を行い、優勝チームを決めます。

チームはウデマエが均等になるように組まれて、自分は弱陰性というチームで参加していました。

チームメンバーの紹介

わたこさん

  • L3 を使う弱陰性の前衛
  • 気付いたら前線キルを重ねたり、スフィアでヘイトを稼いでいることが多かった
  • 大王戦途中からジェッパを克服したらしくステージに合わせて L3D を持てていてすごい

としおさん

  • スシべ/ZAPを使う弱陰性の中衛
  • サポートが光るいぶし銀
  • イノシシになりがちな自分を「スペシャル溜まるからちょっとまって」という掛け声で引き止めてくれていた

ちゃおまるさん

  • お風呂を使う弱陰性の中衛
  • モズクの網上のスピナーにお風呂で撃ち勝つ謎性能
  • チームが慌てていても落ち着かせてくれる精神的支柱

はやぶさコーチ

  • 弱陰性のコーチ
  • ナワバリ勢で、主にナワバリの勝ち方について教えてもらった
  • チーム練習の俯瞰視点やフィードバックをいただきました
  • 居酒屋配信によって大王戦自体を盛り上げてくれた

odan

  • プライムを使う弱陰性の前衛
  • ボトムと呼ばれるチームで一番 XP が低い人
  • 時折イノシシモードになって簡単にデスする

チームの特徴の紹介

編成

弱陰性は L3 + プライム + スシべ or ZAP + お風呂を基本編成としていて、ほとんどのステージ、ルールでこの形でした。この編成に行き着いたのはチーム結成から1週間と他のチームと比べて早く、チームとしての練度を高めることが出来ました。この編成で行こうと強く推してくれたのははやぶさコーチだったので、その点でも感謝です。

勝ちパターン

勝ちパターンとしては、スシべとお風呂が基本的に偉い動きをしながら盤面を維持しつつ、L3 かプライムのどちらかが上振れて大きくカウントを進めることが多かったです。L3 かプライムのどちらか一方がうまく動けていなくても勝ちに繋げられていたのが、勝ちを重ねることが出来た要因じゃないかと考えています。

勝負強さ

自分で言うのはあれですが、弱陰性は勝負強いチームだったと思います。ほとんどの予選と決勝で流れを掴むために絶対に勝たなきゃいけない試合を、ルルステの運や個人の上振れなどによって取り切れていたと思っています。

予選と決勝でのふりかえりでは、この勝負強さを中心に見ていきます。

ふりかえり

やってない時もありましたが頻繁にふりかえりするチームでした。

  • 練習後に俯瞰視点を Watch2Gether を使ってみんなで見る
  • 「スプラノート」と呼ばれる Google Docs に練習後に非同期で練習の各試合の気になるポイントなどをお互いに書き込む

このふりかえりによって、各ステージで誰がどのタイミングでどこのポジションに入るかの共通認識が構築できて、勝ちにつながったと思っています。

予選

vs 濁点

初戦で緊張していましたが勢いで勝ちきることができた試合でした。特にナワバリで L3 の抜けから流れを掴むことができて、その後の試合もその調子良く進めることができたと思います。

vs もちココア

予選で唯一負けた試合でした。バケとホクサイの対面の圧が強くてどの試合も苦しい展開でした。

初戦のアサリと5戦目のエリアを落としたのがかなりきつかったです。初戦のアサリは最後の最後で相手にワンちゃん掴まれる動きを許してしまったのと、5戦目のエリアは長射程がいない編成えで運悪くモズクを引いてしまったのが敗因です。どっちかでも勝っていればまだワンちゃんあったのかなと思います。

vs 上振れ

初戦は落としたもののその後4本取ることができて、4-1 で勝つことができた試合でした。

ターニングポイントとなった試合は、2試合目のアジフライナワバリだと思っています。プライムで謎に裏抜けしてしまったり最後ナイス玉を抱えたりで戦犯ムーブを重ねてしまっていましたが、0.8 % 差でギリギリ勝つことができて流れに乗れました。

vs 麦わら

上振れ戦と同様に初戦のガチアサリを落としたものの、その後4本取ることができて、4-1 で勝つことができました。

3戦目のガチヤグラでモズク農園を引けたのがかなり大きかったです。もし仮にガチエリアやナワバリでモズク農園を引いていたらスプスピが暴れていただろうし、他のステージでヤグラを引いていたらバケが出てきていた可能性があり、もしその場合負けていた可能性はあったと思います。ここで、ルルステの運もあって勝つことができて、流れに乗れたと思います。

vs 母性

結果的に 4-0 とストレートで勝つことができましたが、編成的にエクキャンが可能な相手で、緊張から試合当日は会社を早退するレベルでビビってました。

4-0 で勝ち切ることができた要因はナワバリでコンブを引けたことだと思っています。試合までの1週間はバトロボさんにお願いして対キャンプの練習を繰り返していて、その中で特にコンブナワバリは重点的に練習していました。そのコンブナワバリを本番で引けたのはとても運に恵まれていたと思います。自分が L3 ベッチューを使って左通路のキャンプを抑え込めていたのはこの練習のおかげでした。

vs 7つの滞在

勝てば決勝への進出が確定する試合で、この日も緊張から会社を早退していました。結果は 4-1 で勝つことができて決勝行きを決めることができました。

この試合は、コンブナワバリとアジフライヤグラで勝ちを掴めたのが大きかったです。コンブナワバリは前日から「明日の試合でコンブナワバリを引いたら、L3 ベッチューじゃ相手のななさんの L3 に対面で勝てないだろうからプライムを持ってみよう」と考えていました。当日運良くコンブナワバリを引くことができて、狙いのプライムを持って勝つことができました。

アジフライヤグラでは延長戦で危うく逆転負けしそうになりましたが、運良く最後にヤグラに乗ることができて勝つことができました。

これらの試合のどちらかでも落としていたら危なかったと思っています。

決勝 vs もちココア

決勝の相手は予選で唯一負けていたもちココアで、予選のリベンジとなる試合でした。

勝ちの流れを掴めたのは4戦目のモズクホコでした。このモズクホコは1戦目は取れたものの、2戦目と3戦目を落として悪い流れの中の試合でした。

試合の中でも先に致命傷レベルのカウント27まで取られてしまい絶体絶命でした。しかしわたこさんの偉い動きもあって紙一重で逆転勝ちすることができました。この試合を落としていたら流れで負けもあったので、かなり大きい1勝でした。

終わりに

第二期大王戦を優勝することができました。個人的には前期の第一期大王戦は惜しくも決勝で破れていたのでそのリベンジを達成できて良かったです。 プライムとかいう塗りが弱く味方負担になりがちな武器を持たせてくれたチームメンバーに感謝です。

前回まで同様とても楽しめた大会だったので次もあれば参加したいです。

今年 Amazon で購入して良かったもの

この記事は、 大阪工業大学 Advent Calendar 2020の4日目の記事です。


こんにちは、id:odan3240 です。OIT には 2014-2018 の間在籍していました。Twitter やってます→@odan3240

クイズ

突然ですが、↓の表の2014年から2020年までの件数は何の数字でしょう

2014年 2015年 2016年 2017年 2018年 2019年 2020年
5件 22件 12件 22件 62件 81件 147件

正解はその年ごとの Amazon の注文件数の数でした。

社会人になった2018年と、2020年の注文件数が前年に比べてかなり増えていることがわかります。今年はコロナの影響で家にいることが増えたせいで、平常時だとスーパーで買い物していたものを Amazon で購入するようになったため、かなり件数が増えてました。

この記事ではそんな2020年で Amazon で購入して良かったものを紹介しようと思います。

購入して良かったもの

無洗米

これは2018年頃から購入し続けています。スーパーでもお米は買えるわけなんですが、何しろ重いので Amazon で買うと楽です。まあその代わりに重たい荷物を運んでくださっている方がいるわけですが...。

牛めし

牛丼チェーンの中だと松屋牛めしが一番好きで、会社に通勤していた頃はオフィス前の松屋によく通っていました。実はこの松屋牛めしは冷凍のものが Amazon で販売されています。味もお店で食べるのと違いがなくて気に入っています。あと1食あたりの体積が小さく冷凍庫のスペースを奪わないのもポイントが高いです。

カルピスソーダ

1.5L * 8本を Amazon で頼んでおくと1ヶ月ぐらい持つのでおすすめです。これもお米と同じくスーパーで買うと重たくて大変なんですが、Amazon だと楽だというやつです。個人的にカルピスソーダが一番美味しい炭酸飲料だと思って買い続けているんですが、好きな炭酸飲料でいいと思います。

カルピスソーダ 1.5L×8本

カルピスソーダ 1.5L×8本

  • 発売日: 2014/03/17
  • メディア: 食品&飲料

洗濯物を干すやつ(でかい)

洗濯物を干すやつは前から持っていたんですが、今年倍ぐらいサイズが大きいものに買い替えました。干すやつが大きいと一度に干せる洗濯物の量が増えるので、洗濯が1週間に1度ぐらいのペースに減って楽になりました。ただ本当はドラム式洗濯機で乾燥まで全自動化するのが正しいので、来年こそは買いたいです。

Bluetooth イヤホン

洗い物とか洗濯をしながら YouTube を見れるのが神

フライパン

食材がくっつかないのが神。フライパンを洗うのも楽になりました。

終わりに

というわけで今年 Amazon で購入して良かったものの紹介でした。

来年はここにドラム式洗濯機とか食洗機とかルンバを並べて家事の自動化をしていきたいです。

カバレッジの変化をプルリクエストに通知する GitHub Actions を作った

動機

ある日ふとこんなことを思いつきました。

テストのカバレッジを集計する SaaS として CoverallsCodecov があります。これらの SaaS は詳しいカバレッジの変化や、GitHub Status としてカバレッジ閾値を設定できたり様々機能があります。しかし、GitHub Actions がある今なら一分機能を外部に依存することなく実現できるのではと考えました。

先人が似たものを開発していないか、GitHub Marketplace で 「coverage 」をキーワードに検索してみましたが見つかりませんでした。 https://github.com/marketplace?query=coverage

そこで今回自作したのが「Coverage History Action」という GitHub Actions です。

github.com

使い方

以下のような workflow を用意します。

name: CI


on:
  push:
    branches:
      - "master"
  pull_request:
    types: [opened, synchronize]


jobs:
  report:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js 12.x
      uses: actions/setup-node@v1
      with:
        node-version: 12.x
    - name: yarn install
      run: |
        yarn install --frozen-lockfile
      env:
        CI: true
    - name: Run test
      run: |
        yarn test
      env:
        CI: true
    - name: Coverage History Action
      uses: odanado/coverage-history-action@v0
      with:
        github-token: ${{ secrets.GITHUB_TOKEN }}

この workflow が発火するタイミングは 「master ブランチへの push したとき」と「プルリクエストの登録と更新したとき」です。
前者のタイミングで、master ブランチのカバレッジGitHub Actions の cache に保存されます。後者のタイミングで、プルリクエストのコメントに2つのブランチでのカバレッジの様子が通知されます。

通知の様子

f:id:odan3240:20200531001148p:plain