ハピネスチームビルディング第35, 36回 (Software Design2025年2,3月号)

記事や本を読んだら、簡単に感想を書こうと思った。

どんなことが書いてあったか

第35回では、仕事をする上で、ただ漫然とこなすのではなく、楽しく取り組め成長できるようにする自己実現になるのかを理解する方法が紹介されていた。

第36回では、チームのマネージャーとして、メンバーが自身の自己実現を理解できるようにする方法が、会話例とともに紹介されていた。

感想

仕事が楽しくできるようになるといいなと思って期待して読んだが、これらの記事だけではよくわからなかった。しかし、自身の自己実現について理解するのはいいことだと思うので、記事で紹介されていた本(人生を変える!「コーチング脳」の作り方)を読んでみようと思う。

月報 2025年2月

2月はあと1日あるが、明日はモンハンワイルズの発売日なので、今日書く。

今年の目標と進捗

  • iKnowで新たにマスターした語数400語以上(累計で4658語以上)
    • 今月だけで達成した。現在531語(先月から+474)
    • 目標を1609語に変更
      • 現在531語 + 5語(1日の新規アイテム数)x 308(1年の残り日数)x 0.7
  • 6冊以上の技術書を読み終える(2ヶ月に1冊)
    • 現在1冊(変化なし)
  • 2025年に予定されているAHCの三分の一に参加する
    • 現在100%(3/3)
  • 平均体重71.3kg以下を4ヶ月達成する
    • 0回(変化なし)
  • 月報を9回以上書く
    • 2回

英単語

2月

Metric               Begin Date    End Date      Difference
Date                 2025-01-31    2025-02-27    
Started Items        6576          6715          +139
Completed Items      4315          4789          +474
Completed Courses    74            75            +1
Study Time           220           226           +6

開始アイテム(赤)とマスターアイテム(緑)のグラフ

2025å¹´

Metric               Begin Date    End Date      Difference
Date                 2025-01-09    2025-02-27    
Started Items        6491          6715          +224
Completed Items      4258          4789          +531
Completed Courses    73            75            +2
Study Time           218           226           +8

年間のグラフ

1日に50アイテムを消費するようにしたので、マスターアイテムの数が急激に伸びた。来月には年の目標を達成してしまいそう。ただ、現在は今までマスター直前までいって止まっていたアイテムを消費している段階なので、徐々にマスターする速度が下がると思う。

ちなみに、今までは夜に勉強していたが、2月からは朝ごはんを食べた後でコーヒーを飲みながら勉強している。

プログラミングコンテスト

AtCoder Heuristic Contest 042とRECRUIT 日本橋ハーフマラソン 2025冬に参加した。今年開催されたAHCには全部出ている(3/3)。

今週末は第二回マスターズ選手権予選。頑張って今年も出場したい。

個人開発

iknow-toolsで生成したグラフをサーバーでホストするように設定した。また、グラフを描画するときに、現在のペースでいくとどのぐらいアイテムをマスターできるか直線で描画する設定を加えた。結構モチベーションにつながっている。つぎは、Diffの内容もホストするようにしたい。

また、AIに褒めてもらうためのSNSをノリと勢いで作っている。現在はAHCとマスターズ選手権のために開発停止中。

読書

先月に書いた通り、技術書はTidy First?を読み終えた。前述の通り、朝、技術書を読んでいた時間をiKnowに使うようにしたので技術書を読めていない。時間を見つけないといけない。

風呂読書では、「論理的思考」の文化的基盤を読み終えた。イランの作文がかなり独特で、こんなものもあるのかという気持ちになった。また、日本の作文教育の歴史みたいなのを知れた。

今は若い有権者のための政治入門という本を読んでいる。もうそこまで若くはないが、もっと政治について詳しくなれればいいなと思っている。まだ半分ぐらいなので、本の評価はできない。若干、思想の強さを感じている。

他には、鍛冶屋ではじめる異世界スローライフの2巻の前半を英語で流し聞きしたりした。途中で諦めて日本語にした。

ランニング

今月は今の所89.2km走っている。明日10kmぐらい走る予定なので、およそ100kmになる。(Garminは20km走る計画を立てているが、モンハン発売日でかつ週末に予定が入っているときにそれはきついので減らす)

体重

先月から平均が300g増えて72.8kgになった。減らすどころか増えている。間食をするたびにSNSに写真をアップロードするようにしたので、抑止力に期待したい。

月報 2025年1月

英単語

iKnowの公開プロフィールのデータを保存して解析するツールを作った。実行するとこんな感じ。

$ ./iknow-tools diff 2025-01-01 2025-02-01                        
Metric               Begin Date    End Date      Difference
Date                 2025-01-09    2025-02-01    
Started Items        6491          6580          +89
Completed Items      4258          4318          +60
Completed Courses    73            74            +1
Study Time           218           220           +2

1月9日がツールを作って、データを取り始めた日。今月は60アイテムマスターした。年始はサボって1日5アイテム(新規1、復習4)ずつだった。グラフにするとこんな感じ。

開始アイテム(赤)とマスターアイテム(緑)のグラフ

マスターアイテム(緑)が急激に増加している日は、50アイテム(新規5、復習45)勉強した。普段は20アイテム(新規4、復習16)。グラフの伸びを見ると、嬉しくなるが、かかった時間が普段の倍以上(普段は5分程度のところ、12分かかった)だったので、しんどくてすぐやめた。5分ぐらい頑張れよとは思う。

プログラミングコンテスト

AHC041に参加した。今年開催されたAHCには全部出ている(1/1)。

また、AHC039の練習をした。現在AHC037の練習をしている。

個人開発

前述の通り、iKnowの公開プロフィールのデータを保存して解析するツールを作った。サーバーなどでcronでデータを保存し、./iknow-tools diff 2025-01-01 2025-02-01でデータのDiffをとり、./iknow-tools plot 2025-01-01 2025-02-01でグラフを出力する。サボりを可視化するために作った。

pahcerに刺激されて、AHC用の便利ツールも作った。今のところ、ビジュアライザをダウンロードして、pahcerの実行スコアをコミットメッセージに追加するだけの機能しかない。テストケース毎の実行機能も加えたかったが、色々考えてテンプレートリポジトリにスクリプトを追加するだけにした。

読書

技術書はTidy First?を読んだ(厳密には今日読み終えたので2月)。また、Effective Rustをちょっとずつ読んでいる。

風呂読書(入浴時間にKindle Unlimitedで非IT系の真面目な本を読んでいる)では、「論理的思考」の文化的基盤を読んでいる。

アメリカ、フランス、日本、イランで、作文教育と歴史教育にどういう特徴があるかを調べることで、各国の論理的思考の枠組みを解析する本。アメリカとフランスの教育の特徴が解説されるところまで読んだ。両国ともに、作文(米エッセイ、仏ディセルタシオン)が大学入学試験で超重要視されるらしい。作文の論理が苦手な身としては、日本に生まれてよかったなと思った。

現在、40%ほど読み進めている。

他には、鍛冶屋ではじめる異世界スローライフの1巻を英語で流し聞きしたりした。 正直、朗読は聞き取りづらく、キャラクターの演じ分けもわかりにくく微妙である。

ランニング

走行距離は59.4kmだった。年始にサボったことが大きかったことと、現在やっているトレーニングプランがあまりハードではないことが原因だろう。

体重

運動量が少なかったことと、月末に暴飲暴食したので、72.5kgになってしまった。1kgは減らしたい。

2024の振り返りと2025年の目標

昨年の

2024年の目標

  • iKnowで新たにマスターした語数1000以上(累計で4802以上)
    • 未達成(累計4258, 増分は456単語)
  • 6冊以上の技術書を読み終える
    • 未達成(4冊)
  • 新しいプログラミング言語を1つ以上勉強する(たぶんRust)
    • 達成(Rust)
  • Kaggleの本を読んで実際に参加してみる
    • 未達成(やってない)
  • AHCで青以上になってキープする
    • 未達成(水色)
  • 月に1回ABC/ARCのバーチャルコンテストをやる
    • 未達成(やってない)
  • Rainbowshoesに全文検索を実装して、アイドルマスター以外の作品にも対応させる
    • 未達成(やってない)

iKnow

去年は約600単語だったが、大きく下がって456単語だった。あまりサボっていなかった割に増分が減ったのは、勉強しているコースが難しくなったからだと思われる。(留学生向け単語集を一気に追加したので、語彙が難しい)

Duolingo

技術書

前半までは読書ノートをNotionに書いていたが、面倒になってやめた。再開するべきかもしれない。

Python Distilled ―プログラミング言語Pythonのエッセンス

全体的に良かったと思うが、Pythonをほとんど書かない上にあまり好きじゃないので、身についたかというと怪しい

プログラミングRust 第2版

第一版を読んだ。dynを追加しないと動かないサンプルもあった。Rustの機能全部のせって感じだった。身についたかは怪しい。

バックエンドエンジニアを目指す人のためのRust

Rustで実際に何かを実装してみるという意味ではいい本だった。しかし、この本の内容だけでRustがバリバリかけるようになるかは怪しい。

初めてのGraphQL ―Webサービスを作って学ぶ新世代API

内容がoutdatedになっているので、おすすめはしない。

その他

進捗が皆無な目標が多い。目標が多すぎたことと、そもそもやる気がなかったことが原因か。

2025年の目標

  • iKnowで新たにマスターした語数400語以上(累計で4658語以上)
    • 1æ—¥1単語+α
  • 6冊以上の技術書を読み終える
    • 2ヶ月に1冊
  • 2025年に予定されているAHCの三分の一に参加する
  • 平均体重71.3kg以下を4ヶ月達成する
  • 月報を9回以上書く
    • 定期的に達成状況を振り返ったほうがいいと思ったため。

ICPC 2024 Asia Yokohama Regionalスタッフ参加記

ICPC 2024 Asia Yokohama RegionalにICPC OB/OGの会(JAG)スタッフとして参加しました。

-N日目

ご飯を食べながらOB/OGの会の勧誘ができるようにサンドイッチマンになろうと思い立つ。構想としては、勧誘用のスライドを印刷したものをクリアファイルに挟み、身体の前と後ろに掲げるというもの。クリアファイルに挟むのは食べこぼし、飲みこぼしで紙が致命的に汚れるのを防ぐため。

しかし、生来の怠け癖のせいで、直前まで準備を怠ってしまう。本当は前日までに、必要なものを買ってきて、工作まで済ましてしまうつもりだった。しかし、前日にスライドを作り、完全に透明なクリアファイルを探し出すだけになってしまう。

0日目

準備の日。

7時起き。もろもろの準備を済ませてから、勧誘スライドを印刷しようとするが、インクがなくてできず、プリンターに文句を言う。

バスに乗って、房総半島から横浜へ。天気が良くて房総半島からも富士山が見えた。

他のOB/OG会の人も勧誘準備を失敗していて安心する。

10時15分頃会場着。

11時、OB/OG会スタッフ集合。例年より金曜日のスタッフが多い気がした。いいこと。

電源ケーブルを配線する分隊のリーダーに任命される。仕事でリーダー業をやったことないので、うまく指示が出せずちょっと凹む。

お昼ご飯に、現地民おすすめの中華料理店に行く。

14時頃?東京科学大学がいたるところで東科大と略されていることに気がつく。そこはScience Tokyoだろ!→過激派により無事訂正される

休憩中に、「時代はmixi2だよ〜」みたいな話をされたので、登録してみようかなと思う。招待リンクが必要らしく、探してもよく知らない人のやつしか見つからないので一旦諦める。

昨年と同様、受付をすることになる。上層部は受付をできる人が増えるように新しい人を追加する方針らしいので、受付をするのは今回が最後かもしれない。受付のセッティングで、過去のWFのぬいぐるみを受付の机に飾る。

モックコンテスト(簡単な問題を解いて、PCやジャッジシステムに異常がないか確認すること)をする。打鍵感覚の悪いキーボードと、AI補完のない統合開発環境で、良く現役時代はこれでプログラミングしたなと思う。現役時代は素のgVim使っていたので、IDEの補完も無かったはず。現役選手マジすげぇ。

ICPCスタッフ経験者と未経験者がペアになって、電源ケーブルとLANケーブルの養生(テープで固定すること)をする。伝統技術の伝承が行われて胸が熱くなる。

18時20分ごろ解散。JAGスタッフみんなでホテルに行く。

ホテルにチェックインしてから、一緒にご飯を食べに行く人が揃うまで部屋でスロウスタート(アニメ)を観る。

現地民おすすめの中華料理店その2へ行く。みんなでICPC思い出話をする。恋するアステロイドに出てきた、筑波にある独房みたいな宿泊施設(筑波研修センター)に心当たりがありすぎたという話をした(2014年の選手宿泊施設)。

21時ごろ解散。ホテルの最寄りのローソンで勧誘スライドを印刷する。

日課の語学学習をこなす。Twitterを見ていると、知っている競プロ勢がmixi2の招待リンクを貼っていたので、そこから登録する。

翌日に備えて11時ごろに寝ようとするが、いざ寝ようとすると部屋にある時計の音が気になる。去年、時計の電池を抜いて音を止めたと言っていたスタッフがいたことを思い出し、電池を抜いて音を止める。

mixi.social

1日目

選手が来る日。

6時半起床。6時45分ごろにランニングに行く。ホテル→山下公園→ぞうの桟橋公園→赤レンガ倉庫→ホテルを走る。去年も走ったが、この辺りは走っている人も多く、眺めも綺麗で気持ちがいい。荷物を少なくするために、半袖半ズボンだったので、ちょっと寒かった。

帰ってきたタイミングでホテルの朝食会場が空いていたので朝ごはんを食べる。おにぎりはいつも2つなのだが、色々種類があって気になったので、3つとってしまう。お腹いっぱい。

9時集合。「いつも誰が誰かわからないから」という理由で自己紹介が始まる。正直、重要なのはSecの面々でJAGとバイトのスタッフは自己紹介しないでいいのではと思った。

モックコンテストをやる。インタラクティブ問題がなぜかTLEになって今年も倒せなかった。

お昼ご飯。チキン南蛮弁当だった。

1時受付開始。自分は入り口の隅の方に立っていたので、あまり学生証の確認をやっていなかった。見覚えのある徳山高専と九州大学の学生証を確認した。

2時受付終了。交通機関の遅れで遅刻する人はわかる。2時受付終了なのに、着くのが4時ごろになるのは一体何があったんだろう?

練習開始。印刷物を配る練習を何回かやる。

入り口に誰もいないことに気がついたので、流石にまずい(たまに無関係の人が入ろうとすることがあるらしい)だろと思い、入り口を見張る。

スポンサー企業の方に記念写真を撮るようお願いされたりした。写真を撮るのが下手でリテイクすることになった。申し訳ない。

17時ごろに選手が帰る。18時45分まで翌日の準備をする。

18時45分にJAGスタッフみんなで中華料理の食べ放題に行く。席がちょっと窮屈だった。料理は美味しかった。自分がお腹いっぱいになっても、他の人が頼んでいるので、すごいなぁと思っていたら、みんなも結構限界だったっぽく、明らかに消費速度が落ちていた。

21時ごろ解散。サンドイッチマン装備をつくるための紐をコンビニに買いに行く。ローソンにはなかったが、ファミマにあった。ありがとうファミマ。一番好きなコンビニです。

ホテルでサンドイッチマン装備を作ろうとしたが、ハサミがないことに気がつく。翌日の暇な時間に、大会準備用のハサミを借りて作ることにする。

風呂に入っている時に、腹に肉がつきすぎていることに気がつき、危機感を覚える。

23時ごろ就寝。

2日目

大会本番。

4時ごろに目が覚めてしまう。流石に早すぎるので、二度寝をしようとしたが、眠れず6時に諦めて起きる。忘れずに時計の電池を元に戻し、チェックアウトの準備をし、朝ごはんを食べに行く。おにぎりは2個にしておこうと思っていたが、前日なかった種類があり、結局3個とってしまう。お腹いっぱい。

会場に早めに行ったら、「コーチは302(控え室)に行け」「受付開始は8時X分です」の掲示が欲しいと言われたので作る。

7時45分スタッフ集合。受付の準備をする。

8時XX分、受付開始。学生証の確認等を他の人に任せ、自分はコーチに控え室を案内したり、事前にトイレにったりするようにアナウンスする。

9時5分全チーム受付完了。最後のチームがちゃんと時間に間に合っているのに、めっちゃ急かされていてちょっとかわいそうだった(今年は表彰式の場所が遠い都合で、運営は1分1秒でも早くコンテストを開始したかったらしい)。

9時1X分、コンテスト開始。トイレ案内人材も、印刷待機人材も足りていそうなので、会場を巡回する。

11時ごろあまり忙しくなかったので、この隙にサンドイッチマン装備を作る。その後、会場を巡回する。

お昼ご飯。かつ重弁当だった。

再度、会場を巡回する。順位表が凍結された時点でめっちゃ疲れていたので、印刷物配布部隊に戻り、終了直前まで巡回はやらないぞという強い決意を固める。

コンテスト終了。空のペットボトルを回収する。初めは、選手に入れてもらうだけだったが、他のスタッフが結構積極的に集めているのを見て、明らかに空になっているものは積極的に回収するようにした。

選手を会場から退出させにかかる。予定ではポリ袋に荷物を入れてもらう予定だったが、多くの人がカバンをそのまま持ち出そうとしていた。今回の大会で一番カオスだったと思う。

選手が退出したら、ゴミを全力で回収する。あらかた回収したら、ケーブルの養生を剥がし、ケーブルを回収し、ケーブルを束ねる。

順位発表(自分ぐらいの世代の人たちはYes/No、先生はくるくると呼ぶ)が行われるタイミングで表彰式会場に移動する。母校の徳山高専がかなり健闘していてびっくりした。

表彰式が終わったら、9階の配置を元に戻し、選手を退出させる。この辺りで歩数を確認したら、16000歩ぐらいで今年はあまり歩かなかったなと油断していた。

作成したサンドイッチマン装備をつけて懇親会会場に行く。一番ウケがよかった相手は(当然かもしれないが)スタッフだった。基本的に超内向的人間なので、選手になかなか声がかけられず、勧誘が進まなかった。よって、やってもいいという若いJAGの子に押し付けもとい代わってもらう。

人に任せっぱなしも悪いし、他にやることもないなと思ったので、iPadを引っ張り出し、iPadに勧誘資料を表示した状態で勧誘を始める。なかなか話しかけることができなかったが、懇親会中盤からは話しかける相手の基準と会話フローチャートが頭の中で出来上がり、ある程度話しかけられるようになった。会話フローチャートはこんな感じ。

  1. 「コンテストお疲れ様でした」
  2. 「来年もICPCに参加されますか?」
    1. (来年も参加する場合) 「来年も頑張ってください。OB/OGの会で、模擬国内や夏合宿、模擬地区をやると思うので、ぜひご活用ください。思う存分ICPCに参加していただいた後は、ぜひOB/OGの会にご入会いただいて、コンテストを運営するお手伝いをしただければと思います。よろしくお願いします。」
    2. (引退の場合) 「ではぜひOB/OGの会にご入会していただいて、コンテストを運営するお手伝いをしていただけたらと思います。よろしくお願いします。」
  3. (相手が出身校の選手の場合) 「これは大先輩の命令なので、絶対ということでよろしくお願いします。」

徳山高専チーム全員と話をできることができてよかった。選手にハンドルネームまで把握されていて、ちょっとびっくりした。ただ、頭の中が勧誘することでいっぱいすぎで、終わったあとでもっと長く色々話したらよかったなと後悔した。

19時過ぎ選手に退出してもらう。スタッフ全員で記念写真を撮り、20時前に解散。ご飯を食べに行こうとしている人もいたが、疲れているし、家もそれなりに遠いので帰ることにした。

帰りのバスの上で参加記を書き始める。電車では主にTwitterを眺める。

22時10分ごろ家に無事到着し、自分のICPC 2024は終了する。

反省

よかったこと

  • 疲れたが、今年も楽しかった。無事終わってよかった。
  • 徳山高専チームの全メンバーと会話ができてよかった。
  • 懇親会中盤で吹っ切れてからは、結構な数のチームを勧誘できた気がする。

改善したほうがいいなと思ったこと

  • Secでもないのにしゃしゃり出すぎる傾向にあるので自制せねばと思った。
  • 懇親会は全参加者をJAGに勧誘するぐらいの意気込みでいけたらいいな。
  • 毎年同じ勧誘会話フローチャートを使うと、選手に飽きられてしまう気がするので、来年は別のものを考えないといけないかもしれない。
  • サンドイッチマンは掲げる場所を調整するのが難しかったり、紐が肩から外れたりするので、もっと工夫するか、Tシャツに養生テープで直接貼り付けてしまったほうがいいかもしれない。
  • サンドイッチマン装備を作るのにセロハンテープを使ったが、剥がしにくかったので、次回は養生テープの方がいいかもしれない。
  • 他のJAGスタッフにも勧誘スライドを配って、手伝ってもらうのもいいかもしれないと思った。
  • すでに勧誘した人を判別するのが難しいので、来年はステッカーがあるといいなと思った。

ISUCON14参加記(124位)

ISUCON14にチーム blue最高!として参加して13188点で124位だった。

メンバーと役割分担

  • saikouさん
    • アプリケーションの改善
  • baw(blue)さん
    • データベース周り
  • 自分(blue_jam)
    • サーバー設定
    • デプロイ
    • アプリケーションの改善

今年の目標

今年のチームの(というか自分の)目標は、「複数台のサーバーを活用する」だった。

この目標にした理由は、去年は1台しかサーバーを使っていなかったため。

使ったツールなど

  • GoLand
    • 主な開発環境
  • GitHub Copilot
  • Visual Studio Code
    • 初期設定時に、リモートファイルを編集するために使用
  • ansible
    • 初期設定
    • 変更のデプロイ
  • pprotein
    • 測定
    • 内部でalpとslpを使用
      • alpは毎年お世話になっているツールなので、tkuchikiさんをスポンサーした。いつもありがとうございます。
  • pt-query-digest
    • スロークエリーログの初期解析
  • netdata
    • モニタリング

ç·´ç¿’

個人練習

11月上旬から練習を始めた。1人で行った練習は次の通り。

  • ISUCON13
  • ISUCON12予選(3回)
    • MySQLへの移行2回、SQLiteのまま1回
    • MySQLへの移行2回目は、MySQLのデータベースをバックアップから復元する手順を確認するために行った
  • ISUCON12本選
  • ISUCON11予選
  • ISUCON11本選
  • ISUCON10予選

各問題で、

  1. 初めは自分でできるところまでやり、
  2. 行き詰まったら解説を見ながら書いてあることをやり、
  3. 最後に上位陣のブログやコードを読んでできるところまでやる。

という感じで練習した。チーム練習後は、初期設定の手順表を書き、それに従ってセットアップを行うことを意識して練習をした。

11月中は、平日は仕事が終わってから、休日は別の予定がないときに、ほぼ毎日練習をしていた。今までで一番真剣にISUCONの練習をしていた。

目標は複数台の活用だったので、今年はAWSにインスタンスを立てて練習した。約1ヶ月でかかった料金は28.47ドル(4,414円)だった。後で11月中にクーポンを適用しておけば良かったと思った。

プライベートでも、仕事でも頑張っていて、燃え尽きてしまったのか、12月に入ってからはあまり練習しませんでした。主にスロウスタートやお兄ちゃんはおしまい!を読んで過ごしていた。

チーム練習

チームでの練習は11月24日に一回行った。使用した問題はISUCON12本選だった。

練習前はVS Codeリモート接続 + Liveshareでみんなで一つのサーバーにアクセスして作業しようと話していた。しかし、練習中にLiveshareが不安定であるなど都合が悪いことがわかったので、各自でリポジトリをローカルにダウンロードして開発することにした。

本番

得点の推移

開始後〜初期設定

この間に他のメンバーがやっていたこと:マニュアル読み、アプリケーションの確認

サーバーを起動するときに、練習用に使っていたAWSアカウントにCloudFormationの権限が付加されていないことに気がつきプチパニックになる。ほぼ全ての権限を持っている別のアカウントがあったことを思い出したため、そちらでサーバーを設定する。

初期設定用のplaybookを実行し始める。playbookは実行が終わったら、ベンチを実行できるように作っていた。(alp用のNginxのアクセスログとMySQLのスロークエリーログの設定など) alpやnetdata、pprotein-agentのダウンロードがうまく動かずにプチパニックになる(エラー内容は保存していないが、たぶん証明書関係のエラーだったと思う)。とりあえず、該当箇所をコメントアウトしてなんとか終了させる。

追記:どうやらansibleのバージョンが古かったことが原因らしい。

終了後ベンチマークを走らせる。なぜかアクセスログやスロークエリーログの設定がうまくいっていなかった。適当にガチャガチャやっていたら治ったので、再度ベンチを動かす。 alp用のパスへの正規表現を書き、alpの結果と、pt-query-digestの結果をチームメイトに共有する。(この時点で10時30分ぐらい)

アプリケーション側のpproteinの設定をしようとしたが、フレームワークがEchoじゃなくて混乱する。pproteinのインテグレーションコードを見たが、chiのインテグレーションがなかったので悩む。 アプリケーションのpproteinをあきらめ、chiでpprofをホスト+pprotein-agentでNginxとMySQLのログをホストにするようにする。 pproteinの設定がうまくいく。(この時点で10時45分ぐらい)

設定ファイル(nginx.conf、mysqld.conf、env.shなど)をリポジトリに追加する。メンバーにmainブランチの準備ができたことを共有。795点(10時50分ぐらい)

DBサーバーの切り離し

この間に他のメンバーがやっていたこと:

  • baw: ride_statuses, chairs, chair_locationsにインデックスを張る
  • saikou: JSONのライブラリをgo-jsonにする

DBサーバーをアプリケーションのサーバー(S1)とは別のサーバー(S2)で動かしにかかる。

11時15分ごろにDBをS2に移し替える設定が終わったのでベンチマークを実行するが、失敗する。

なんで失敗しているのかわからずに色々試している間にbawさんのインデックスのコードができたので適用してベンチを走らせる。2250点。

DBの初期化をHTTPエンドポイント経由で試したり、S2のアプリケーションを停止したりして試したが、ベンチ成功せず。 マニュアルを読んでみるとisuride-matcher.serviceなるものの記述を見つける。これじゃないかと思い、S2でサービスを止めてベンチを走らせると成功。5353点。(12時10分)

isuride-matcher.serviceをS2と3台目のサーバー(S3)でdisableしておく。

chair_locationsのテーブル圧縮(失敗)

この間に他のメンバーがやっていたこと:

  • baw: rides, couponsへのインデックス追加(7814点)
  • saikou: ユーザー情報のキャッシュ

chair_locationsが位置の履歴を全部持っているので、chair_locationsに最新位置だけを持ち、chair_locations_historyというテーブルに今までの位置の履歴を保存するようにする。

が、追加したSQLファイルをinit.shに追加するのを忘れ、スコアに影響が出なかった。「あれえ?」と思いながらも、とりあえずマージする。7668点(1時ごろ)

これのちょっと前(12時40分ごろ)に、一瞬12位になっていたらしく、チームメイトが盛り上がっていた。

ride_statusesをS3に移す

この間に他のメンバーがやっていたこと:

  • baw: isuride-macherのインターバル調整(11328点。2時ごろ)
  • saikou: オーナー情報のキャッシュ

3台目の活用方法を考える。NetdataをみるとDBにかなり負荷がかかっているので、その時点でスロークエリーのトップに来ていたride_statusesをS3に移動することにする。

10329点。bawさんが、chair_locationsの圧縮のSQLファイルをinit.shに追加していないことに気がついて、修正してくれた。その変更も合わせて13380点。2時50分ごろ。

DBサーバーを分離した後で、Netdataを眺めるとS3よりもS2の方がMySQLのCPU利用率が高かった。変更量が多かった割に、よくない変更だったかもなと思った。

chairStatsのN+1を修正&chairPostCoordinateのSELECT削減&イスごとの最新ride情報のキャッシュ

chairStatsのN+1を修正する。14431点。3時40分ごろ

chairPostCoordinateで挿入した行をSELECTで取得しているのをやめる。15833点。4時ごろ。これがチームの最高点になる。

イスごとの最新ride情報をキャッシュする。13586点。4時50分ごろ

キリもいいので、ログをオフにして再起動試験を開始する。

ログをオフ&再起動試験

ログをオフ。12574点。5時10分ごろ

チームのみんなでbawさんの画面を見ながら再起動試験を行う。再起動前と再起動後でイスの状態が違うことがあった。イスごとのride情報のキャッシュが悪さをしているのではないかという話になり、その変更をRevertする。

再起動試験はかなりギリギリまで行った。

得点公開後

追試で0点になったように見えたので、原因箇所の特定をしようとした。しかし、原因として考えられるデータを探してみても、該当データが見つからず、はっきりとした原因はわからないままだった。

反省

  • 初期設定の目標は30分だったが、1時間かかってしまった。とはいえ、想定外の事態(AWSの権限、ツールのダウンロードに失敗、Webフレームワークが変更)が複数あったので、よくやった方ではないかと思う。
    • ソースを書き始めるのは、設定ファイルをmainブランチに追加するまで待ってもらっていたが、初期設定終了後にコードをダウンロードしてもらっても良かったのではないかと思う。
  • 変更をデプロイできるのが自分だけだったので、コードの変更中にデプロイ依頼が来て集中力が途切れることが多かった。次回は各自でデプロイできるようにしたい。
  • 自分もマニュアルを読んだ方が、改善点が浮かびやすかったのかなと思った。
    • 初期設定で時間を取られるので、すぐにコードに手をつけたくなるが、じっくりマニュアルを読んだ方が改善点や制約を理解できたのだろうか。
    • 他のチームメイトにマニュアルの重要なところまとめみたいなものを作成して欲しかったなと思った。
  • 序盤の動きは良かったが、後半伸び悩んだ。
    • ちゃんとボトルネックを解決できていなかったのではないだろうか
  • ride_statusesのサーバー切り離しは余計だったかもしれない
    • サーバーを3台ちゃんと活用したいという気持ちと、時間制限から早く方針を決断したいという気持ちから、急いで着手したが、焦りすぎたかもしれない。
  • チームメイトが効果のなさそうな作業をしている気配を感じたらちゃんと止めるべきだった。

感想

去年よりはちゃんとコードを書いて得点を伸ばすことができたのでよかった。来年は特別賞ボーダーを越えられるように頑張りたい。

大会を運営している人たちには感謝をしている。しかし、追試の存在には強い疑問を覚える。

コンテスト終了後に追試で0点になる可能性があるのはかなりの恐怖である。コンテスト終了後に追試で0点になってしまったら、その日の努力が全部水の泡になる。

参加チーム数を1000に増やしたことから、おそらく追試も自動化されているのだろうと察する。もしそうなのであれば、追試を行う機能をコンテスト中に実行できるようにしてほしい。コンテスト終了後に、急に0点だと言われるのはかなり辛いだろうから。

また、(おそらく)ベンチが安定しておらず、最高点から3000点近く下がってしまうのは競技としてどうなのかと思った。

フルマラソンを走った

2024年11月10日に行われたちばアクアラインマラソン2024のフルマラソンを走った。

なんで走ったのか

コロナ禍でリモートワークになってから太ったので、2020年末〜2021年初めぐらいからウォーキングを始めた。同じ量の運動をこなすのであれば、走った方が早く終わることに気がついたので、ランニングに移行した。

1年ぐらい前から、家族から「せっかく走っているんだから、アクアラインマラソン走ったらいいじゃん」みたいなことを言われていたので応募した。どうせやるならフルマラソンだろうと思い、フルマラソンにした。(この決定をした自分を後で恨むことになる)

準備

Runmetrixのアプリにあるフルマラソンプログラム(RUN LONGER)に従ってトレーニングをした。走る回数は週3回だった。(ブログを書いていて思ったが、終了したプログラムの振り返りができないのを修正してほしい)

Runmetrixにした理由は、使っているアプリのうち、フルマラソンプログラムがあったのがそれだけだったという理由だけ。(練習開始時点ではGarminがフルマラソンに対応していなかった)

目標は完走でタイムは5時間にした。なお、大会の制限時間は6時間だった。

概ねトレーニングメニューに従って練習していた。ただ、9月ごろから20km以上を毎週一本以上走らないといけないのが辛かった。自分程度のレベルだと、20kmを走るのに休日の午後を丸々使わないといけなかった。この辺りでフルマラソンにしたことを後悔し始めた。

装備

  • asics のいい感じの吸汗速乾の半袖Tシャツ
  • ランニングポーチ(スマートフォンと家の鍵が入るやつ)
  • ランニング用の上着(着替えの中に入れて預けた)

スタートまで

天気が微妙そうで心配したが、ちゃんと全ルートで開催することになったようで安心した。(天気が荒れると、アクアラインが走れなくなり、距離が短縮され30km程度になるらしい)

家族がスタート地点の近くまで送ってくれると言っていたが、当日の交通状況がよくわからなかったので、遠慮して最寄り駅まで送ってもらった。

電車で7時50分ごろに木更津駅に着いた。ちょうどアクアラインマラソン専用の特急と同じ時間に到着したので、駅がめちゃくちゃ混んでいた。会場に着く前に駅のトイレを使おうかと考えていたが、いっぱい人が並んでいたので見送った。この頃に帽子を忘れたことに気がついた。

駅から受付までは結構歩いた。道が狭いという理由で遠回りをさせられたのと、狭い道に人がいっぱいいてゆっくりしか進まなかったので時間がかかった。

荷物を預けてからスタート地点までも結構歩いた。Googleマップのタイムラインによると、駅からスタートまで4kmぐらい歩いたらしい。(記憶では5000歩ぐらいだった)

スタート地点についてからは結構時間に余裕があったので、トイレに行った。

オープニングセレモニーには千葉県知事が来ていたらしい。知事はハーフマラソンを走ったらしい。大会の紹介で「アクアラインマラソンはアップダウンが魅力」などと言っていたが、アップダウンはない方がいいと思った。

競技中

スタートは目標タイムでグループ分けされていて、自分はEグループで3番目のスタートだった。(全部でFまであり、EとFが同時スタート)

開始直後は人が密集していてキロ7分ぐらいで走っていたらしい。目標は6分50秒だったので、若干遅かった。

初めの給水地点で水を飲んで塩タブレットを食べた。激混みでほぼ歩きながらとることになった(その後、給水地点では必ずスポーツドリンクをもらい、何かしら食べた)

7km地点ぐらいで、家族が応援していると伝えられていたので、探して手を振った。

アクアラインが近くなると人が結構ばらけて走りやすくなった。

アクアラインの交通表示が専用のメッセージに変えられていたので写真を撮った。

うみほたるに到着した頃に雨が少し降ったが、当日降ったのはこれだけだった。うみほたるには地域の特産品があると書いてあったので期待していたが、配られたのはアジの開き(酒のつまみ用のスナックみたいなやつ)だった。期待が大きかっただけにがっかりだった。

アクアラインの復路で、5時間のペースセッターの人を抜かした。自分はそれなりにスタートが後ろの方だったので、そこそこ余裕があることになった。

ハーフマラソンとの分岐地点を過ぎたら、そこそこ人が減ったように感じた。

後半になってからの筒状のゼリーは摂取しやすくてありがたかった。

30kmぐらいのところで一回トイレに行った。

32kmを過ぎたところあたりから、残りが一桁キロになったのでちょっと気が楽になった。

多分このあたりで木更津市長を抜かした。市長には絶対に負けたくないという気持ちになった。

中盤ちょっと飛ばし過ぎた(6分35秒ぐらいのペースで走っていた)ので、後半失速した。残り7kmぐらいでペースセッターの人に抜かれたのでやばいと思ってペースを上げた。ここからは、木更津市長、ペースセッターと(自分の脳内で)デッドヒートを繰り広げた。

残り2kmになってから結構長く感じた。というか、終盤に上り坂が多過ぎ。

ゴール。無事に木更津市長とペースセッターに勝つことができた。

終わってから

ゴールしてから「止まらないで先に進んでください」と言われたので、必死に足を動かして歩いた。

記念品とかを色々もらって、預けていた荷物(着替え)を受け取った。氷を配っていたのを受け取らなかったが、後で受け取っておけばよかったと思った。

荷物を返してもらってから、更衣室までが結構長かった。(そう感じただけかもしれないが)

タイツを脱ぐ気力がなかったので、上半身だけTシャツ+パーカーに着替えた。

記念品がもらえるというので、アンケートに答えた。記念品はクリアファイルとボールペンだった(まあ、そんなもんだよね)。

更衣室の周りに、地域の紹介コーナーなどがあったが、地元だし、元気がなかったのでスルーした。

駅までのシャトルバスの出発場所も結構遠くてしんどかった。

木更津駅について、階段を必死に上り、最寄り駅まで家族に車で迎えに来てもらってフィニッシュ。

感想とか

練習と本番がめちゃくちゃしんどかったので、フルマラソンはもうやらなくていい。完走もしたし。

ゆかりのある北九州や福岡のマラソンにちょっとだけ興味があるが、フルしかないみたいなので無しで。