詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

ISUCON11予選敗退(92604点、30位) #isucon

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

チームは カラアゲネイティブ-ng。92604点、30位だった。通過ラインが 106094 点だったのでもうひと伸びあれば、というところで悔しい。

メンバーは去年と同じく songmu & toricls。予選の問題を見たときは AWS、IoT、時系列データベース、おれらの得意分野じゃんとか言って笑ってた。

やったこととおぼえていること:

  • 実装は Go。
  • 今回は去年の個人的な反省を活かして自分が構築、songmu & tori でアプリケーションを見る、という感じで進めていった。といっても songmu さんの秘伝の Makefile を頼りに見様見真似でやってみた、というレベルで、ミドルウェアのチューニングなどは何もやってない。
    • Makefile はさらによくなった気がする。
    • 構築してるあいだに2人でじっくりコードを読んでくれていて、方針建てがクリアだった(と思う)。
    • しかしあとから追いついた自分は全部を完全に読めていた自信がなく、自分では良い判断ができなかったようにも思う。
  • nginx を 01 に、Redis を 02、MariaDB を 03、アプリを全台に置くように分散。
    • これであまり問題にならなかったと記憶してるので、ここから再配置はしなかった。
    • Redis は初手では入れなかった。
  • 全体的に songmu さんがいい感じにブレーキをかけてくれていて、アクションの決定は拙速を免れた。これはよかった。
  • pt-query-digest を参考に、インデックスを張る系の作業を行う。
  • あとは画像周りを DB に入れてるのが重く、ファイルに保存するか……と考えたけど、Cache-Control をつけたら問題にならなくなった。
  • http.Transport.MaxConnsPerHost を大きくしたのも多少効果があったような気がする。
  • このへんで手が止まり、大きめの改修が必要だねという話をしていよいよ isu_condition を Redis 化することに。
    • ソート済みセットを使う。ここは並行実装できてよかった。
    • これで絶妙なハマりをしてしまって、コードを読んでもロジックはおかしくないように見えるのにFAILする……なぜ。
    • となってしまい、DB に入っているデータと Redis に入っているデータを目視で見比べることをしてみたところ、timestamp をわざわざ除いて JSON 化していたレコードがまったく同じ文字列になってしまっており、レコードが縮退してしまっていたことが判明。Redis のソート済みセットでは値の重複は許されない。それは知ってたわ~といいつつ直した。
  • あとは encoding/json を goccy/go-json にしただけでスコアが上がる。これには笑った。ありがとうございます。
  • 以上いろいろ取り組んでみたものの、dropProbability をなかなか上げられない、上げてもスコアが思ったように上がらなかったので苦しかった……。
    • ユーザ数に応じて dropProbability を変えてみたらいいんじゃね? と最後に思ったがうまくいかなかった。おれはこういうこと言いがちである。

割といいところ行けると思ったんだけどなー! 個人的にはアプリケーションの理解があいまいなまま走り出したのが反省点。

リポジトリはこちら:

GitHub - x-motemen/isucon11-qualifier: カラアゲネイティブ-ng

よく考えたら x-motemen に置くのどうなんってなるな……。来年もがんばります。

meishi2キーボードを作った

新卒のころから使っていた Happy Hacking Keyboard が壊れた(アンチポップさんにもらったやつ。ありがとうございます)。とくにメンテもせずに、もう10年以上使えていたので感謝の気持ちとともに新しいキーボードに買い換えることにする。Macbook Pro の内蔵キーボードはチャタリングするんでちょっとしんどい。

少し悩んで、せっかくなので自作キーボードに挑戦してみることにした。はんだ付けは小学生のときに工作教室でほんのちょっと触ったか? くらいである。「自作キーボード 入門」で検索して出てきたこれを買うことにする。見た目のかわいい ErgoDash。工具セットも買った。

で、届いたんだけど、どうも圧倒されてしまう感覚がある。自分が何をすることになっているのか全然わからない状態。

考えてみれば自作キーボードの入門セットであって、電子工作の入門セットではなかった。このまま突入しても壊してしまうだけだなと思って、小さい自作キーボードで練習することにした。

練習用と思ってこれを買う。他にも初心者向けちびキーボードはあるっぽいが、ビルドガイドがはてなブログだったので迷わず meishi2 にした。私も使ってます。

はんだ付けはうまくいってるのかいってないのかわからないまま終わり、ついにファームウェアの書き込みだ! という段階まで来たのだけど、これがなんかうまくいかない。リセットスイッチを2回クリックしても変化がない。

Waiting for USB serial port - reset your controller now (Ctrl+C to cancel)..............................................................................................................^Cmake[1]: *** [avrdude] Interrupt: 2 

QMKファームウェアの書き込みができない – 遊舎工房サポートサイト にしたがって、Pro Micro(キーボードにつけるマイコン)だけを取り外してリセットしてみようとしたが、本来なら RST と GND をショートさせるべきところを RAW と GND をショートさせてしまっていて、そして Pro Micro のランプが光らなくなった……。

あっけない死。えっ何が起きたの? こうやって金を無駄にしたのおれは? とショックを受けていたのだが、ちょさんに回路図を交えて教えてもらった。どうもヒューズを飛ばしてしまったらしい。そして時間が経ったら回復してるのでは……とのことなので改めて確かめてみるとちゃんと動いた。よかった。

その後 USB ケーブルをいくつか試したら、ちゃんとファームウェアの書き込みも成功した。データ通信できない USB ケーブルってなんだよ。ちなみにちゃんとした USB ケーブルで Pro Micro をつなぐと、macOS ならキーボード設定アシスタントが開くようだ。Windows のように接続音がしないのでどうも繋がってるのかどうか不安になるんだけど、ioreg -p IOUSB というコマンドで確認できる:

+-o Root  <class IORegistryEntry, id 0x100000100, retain 22>
  [...]
+-o AppleUSBXHCI Root Hub Simulation@14000000  <class AppleUSBRootHubDevice, id 0x100001b02, registered, matched, active, busy 0 (2 ms), retain 13>
  | +-o USB2.0 Hub@14200000  <class AppleUSBDevice, id 0x100007398, registered, matched, active, busy 0 (0 ms), retain 16>
  | | +-o USB-C Digital AV Multiport Adapter@14220000  <class AppleUSBDevice, id 0x1000073af, registered, matched, active, busy 0 (0 ms), retain 13>
  | +-o Arduino Micro@14400000  <class AppleUSBDevice, id 0x10000a833, registered, matched, active, busy 0 (2 ms), retain 19>
  +-o AppleUSBXHCI Root Hub Simulation@01000000  <class AppleUSBRootHubDevice, id 0x100001b59, registered, matched, active, busy 0 (1 ms), retain 12>
    +-o USB3.0 Hub@01100000  <class AppleUSBDevice, id 0x100007384, registered, matched, active, busy 0 (0 ms), retain 15>

この Arduino Micro というのが Pro Micro やね。ファームウェア書き込み後は meishi2 という名前になる。

というわけで完成です。長くなったのでカスタマイズは次回。

ちなみに本命の ErgoDash は作るの時間かかるな、とわかったのでその後 HHKB も買ってしまった。

mod_perlのDockerイメージをghcr.ioに上げた

趣味で mod_perl の Docker イメージを作っています。

Docker Hub の無料版における autobuild が終了となり、GitHub Packages Container Registry に移行することにした。

https://github.com/motemen/docker-mod_perl/pkgs/container/mod_perl

{perl_version}-{httpd_version}-{mod_perl_version} て感じのタグ付けです。httpd ベースなので OS のバージョンは勝手に上がる(!)

リポジトリでは、Perl のバージョンごとにディレクトリを掘っている。これを Autobuild するにはウェブからポチポチするのが必要で、バージョンを増やすたびに一つひとつ追加するのが面倒だったんだけど、GHCR なら GitHub Actions でいい感じに自動化できるんじゃね、ということで試してみた。

設定画面がこんな感じだったのでまあまあメンテが大変だったわけです。あと削除ボタンが confirm なしに消してくれるもんで一度イチから作り直したこともあった。。

f:id:motemen:20210728211700p:plain
Perlのバージョンをひとつ増やしたら3行増える様子

GitHub Actions で複数の成果物を作る場合は matrix が使えるが、この matrix を動的に生成することで、リポジトリの内容をベースに作るイメージを複数設定できる。具体的には、Dockerfile ファイルがあるディレクトリそれぞれについて、その名前のタグでビルドしたい。

fromJson() を使うと、別のジョブの output から matrix を動的に生成できる。そのために JSON 形式でディレクトリ名を一覧したい。ということで、このようなスクリプトを実行している。

find */Dockerfile -exec sh -c 'basename $(dirname \{})' \; | sort | jq -nRc '{perl_version: [inputs]}'

標準入力の一行一行を JSON の配列にするには jq -nR '[inputs]' (--null-input --raw-input) したらいいらしい。jq ベンリダナー。

あと現在の mod_perl 2.0.11 では最新の Perl 5.34.0 に対してビルドできない……ので最新版をのんびり待っているところ。

はてなで一緒に働きませんか?