2019年に書いてから3年も経ってしまったのですが、今回はちゃんと書きます。特に、毎年やっていることも含めて詳しく書こうかと思います。
ICPC 2023 Asia Yokohama Regional に ICPC セクレタリーズのシステム担当の一人として参加してきました。やってきたことを紹介します。
ICPC セクレタリーズは過去の ICPC 参加者から構成されていて、ICPC の日本での大会をサポートしているボランティア団体です。過去の ICPC 参加者からなる会としては JAG こと ICPC OB/OG の会がありますが、こことは別で、もっと大会運営委員会に近いところの作業を手伝っています。
私はコンテストシステムの担当の一人として、以下の作業を行っています。2015年からやっていて、2016年を飛ばして8年目になります。
- コンテスト用コンピュータの選定
- コンテスト用コンピュータのインストール用イメージの作成
- テスト用のインストールイメージの作成と配布
- コンテスト用コンピュータへの計算機環境セットアップ
- コンテスト前後のプレゼンテーションの対応
- コンテスト中のコンピュータの障害対応、およびそれをするためのコンピュータの監視
プログラミングコンテストの環境とは
コンテストでは以下のような環境を用意します。
選手のためのコンピュータは全て大会側が用意します。全て同じ機種、同じ環境で用意します。これらはインターネットには繋がっておらず、代わりに「審判サーバプロキシ」とネットワーク接続されています。 一方、選手の書いたプログラムを評価する審判サーバはインターネット上の Google Cloud Platform 内に構築されます。審判サーバプロキシは選手からのリクエストを中継し、審判サーバへ届けます。
図のうち、選手用コンピュータと審判サーバプロキシはコンテストシステム担当の守備範囲です。ネットワークと審判サーバはそれぞれ別の班で担当しています。ハードウェア、ソフトウェアの選定と配置、障害対応を行います。
準備
今回は準備として主に以下のことをしていました。
- 6月–7月: 計算機環境のベースシステムを Ubuntu 22.04 へ更新。
- 公開から1年経過した Ubuntu LTS を使うポリシーにしているので今回更新です。何か起こった時の対処が難しいので早めに作業をしています。幸い、20.04 への更新に比べてはるかに安定してできました。
- 6月ごろから11月までずっと: 中継に渡すスクリーンキャストの仕組みを更新。
- スクリーンキャストは 2019 年に導入してからその使い道を模索していました。2022 年に 中継を担当してくれるボランティアの人がついてくれたのですが、そこでうまくスクリーンキャストが活用できなかったので直すことになりました。修正はかなり大変でしたが、結果としてまだ不十分な感じになってしまいました。また来年度に続きます。
- 1/19追記: 個別に記事を書きました。
- 8月–9月: JAG 夏合宿への審判システムの提供。
- ここ数年は JAG が行う模擬地区予選にコンテスト審判システムを貸し出してテストしてもらっていましたが、今年は JAG が模擬地区予選を行わないとのことで、代わりに夏合宿にシステムを提供することになりました。
- 9月–10月: コンテスト用コンピュータの選択及びレンタル機の発注。
- コンテスト用コンピュータはいつもレンタルで調達していて、必要なスペックの決定と台数の計算をしています。コンピュータは選手用の他に、プレゼン、審判サーバへのプロキシ、選手コンピュータの監視、中継補助など色々な箇所に使っています。
- 10月中旬: テスト用のインストールイメージの公開。
- 10月–11月: インタラクティブ問題のテストツール対応。
- 今年のK問題ではインタラクティブ問題が出て、そのテストツールが選手コンピュータにインストールされていました。これは9月末に審判団から打診が来たもので、10月あたりに仕様のすり合わせを行いました。
- 10月–11月: レンタル機でのテスト。
- コンテスト用コンピュータと同じレンタル機を借りて、コンテスト環境をインストールして挙動を確認します。それまでは VM でテストしていますが、 VM ではテストしにくい挙動はいくらでもあるのでそれをまとめてテストします。
- 11月: コンピュータセットアップ用の USB メモリの選定と発注。
- コンテスト用コンピュータをセットアップするために USB のインストーラメディアを作っています。並列でインストールするために 20 個程度用意しています。以前は台数分の DVD-R を用意していましたが、レンタルコンピュータに光学ドライブがなくなったため USB メモリを使うことになりました。
本番
ICPC Yokohama Reginal 2023 は2023年11月25–26日に、横浜産貿ホール マリネリアで行われました。スケジュールにあるとおり、一日目は登録、開会式及びリハーサルを行い、二日目に本番のコンテストを行います。 スタッフは前日から会場に入って準備をします。
24日 準備
この日は準備です。電気とネットワークを配線し、選手のコンピュータを含むコンテスト用のコンピュータ全てを配置します。目標はモックコンテスト、すなわち会場の選手用コンピュータでボランティアだけで簡単なリハーサルコンテストをやることです。
システム担当の掌握範囲は現地のコンピュータのソフトウェア設定全部。選手用コンピュータ、コンテスト用の追加のコンピュータ、アナウンス用のコンピュータ、中継に使われるコンピュータなどの設定をします。選手用のコンピュータの物理配置や、電源配線、ネットワークなどは別の人たちに任せています。また、前に書いた通り、審判システムの設定はまた別のチームが行います。
会場設営は机、電気系統、ネットワークから始まりますが、この段階ではソフトウェア設定はできません。会場設営が進み、コンピュータと電源が配備されてからセットアップの開始です。選手用のコンピュータのインストールはテストイメージの場合と同様にできるので、やり方を指示した後は他の人に任せてあります。一方他のコンピュータ、例えば審判サーバへのプロキシやらプレゼン用のコンピュータやらのセットアップは自ら進めていきます。
ここでトラブルが二件。まず無線 LAN への接続がうまくいきませんでした。コンテスト用のネットワークは有線でやっているのですが、いくつかの会場運営用のコンピュータは無線を使おうと計画していました。テスト機ではうまくできたのに現地ではさっぱりです。$ sudo netplan –debug apply
やら $ journalctl
やらを繰り返した末に諦めて有線を配線してもらいました。
次に審判サーバプロキシが正しく動作しませんでした。プロキシを通して審判サーバにうまくアクセスできないのです。これは Ubuntu 22.04 の nginx が古くて最新の TLS を読めないことが原因だった模様で、 nginx オフィシャルのパッケージに差し替えて直りました。
会場の様子ですが、配線やPCのセットアップが一通り終わりました。現在、システムが正常に動作しているかを確認しています。 pic.twitter.com/78doEIFCRK
— ICPC2023JP (@icpcjapan) November 24, 2023
無事モックコンテストがおこなえ、おおよそうまく行きました。一件だけ難しい問題を発見し記録。幸い本番では踏みませんでしたが次回には直します。
ホテル
自宅から横浜まで1.5時間くらいかかる上、スタッフとしてホテルが手配されているのでホテルに泊まります。一方、ちょうどトコジラミの話が Twitter で流行りだした頃なので何か対策したくなりました。
前もちょっと触れましたけど、都会のビジホは必ずいると言って良いほどいます。
— チカモリ (@tikamorifugeshi) November 15, 2023
海外の旅行者が持ち込んだり、都会の不衛生さが原因だとか言われてる。
海外の主要観光都市でも同じ問題が起きてるのはやはり旅行者だろうね。 https://t.co/4JH9xLQ9P1
旅先のトコジラミ対策は衣類用防虫剤のネオパラ一択です。2錠ずつ和紙で包んでる、あの臭いやつ。大袋で持参し、スーツケース内やベッドマット下やベッド内やクローゼット内や床の各所にバラ撒く。30か国超を旅し留学生寮や歴史的建物の年季入ったホームステイ部屋で地獄を見てきた、わたしの最適解。 https://t.co/uQqWNG1bAV
— ☆せれん☆ の続き (@527_serendipity) November 16, 2023
慌ててパラジクロロベンゼンを買ったものの、そのまま撒くのは危険だと知り撒くのをやめたりしました。使用上の注意にも密閉容器でのみ使用しろとか、一部のプラスチックを侵食するとか書いてあります。
結局ゴミ袋セットを買い、リュックサックは全てバスタブ内で開封し、布を含むものは服もリュックも全てゴミ袋に収めておくことだけやっておきました。本当は自分が刺されるのもアレですが、刺されたらわかるんじゃないかと思って、リュック経由で自宅に持ち込む可能性だけ排除しました。この対応は多分あまり正しくなくて、トコジラミに刺されても最初はわからないようですね。複数回刺されるとアレルギー症状が出るとか。わからないうちに刺されて、そのまま服に隠れられると持って帰ってしまう可能性があるかも。ないのかな?
幸い私の部屋にはいなかったようで、今のところは何も異変は見つかっていません。
25日 開会式とリハーサル
8時すぎには会場に到着。前日できなかったスクリーンキャストのチェック。それからプレゼン系のチェックを行いました。前日にモックコンテストがうまくいかないとこの日の午前中もモックコンテストが入りかなり忙しくなるのですが、今年はうまくいったので仕事は少なめでした。一方、プレゼン系のチェックと作業が思ったより多く、ここで手間取りました。来年は楽になるようにチケットを切っておきました。
昼過ぎから選手が入場するため、その前に支給されたお弁当を食べます。そのあと選手のコンピュータの準備を済ませて選手を待ちます。
コンテスト中は私は選手の左斜め前、演台の下手側に座っています。前に書いた通り、ここからコンテスト用のコンピュータの監視、プレゼンの補助、それから障害対応を行います。障害対応の殆どは「コンピュータが動かなくなりました」に返事をすることです。以下のような格好で座っています。
13時あたりから選手が次々入ってきます。開会式の開始は14時なので、それまでは私は様子見です。プレゼン用コンピュータには選手用の注意事項を書いたスライドを表示し、5秒ごとにページ切り替えさせて、それを選手のディスプレイに転送しておきます。
14時開会式開始。そのあとリハーサルコンテスト。ここでは私はプレゼンの補助をしています。審判システムのデモが山場ですが、ここは別チームが担当しています。直前の体調不良でデモをやる人が交代したので大変そうでしたが、結果は好評でよかったです。
リハーサルコンテストでは選手のコンピュータの様子を監視しつつ質問に答えます。コンピュータが止まったり、テンキーが動かなかったり、ディスプレイが消えたりしました。大体はすぐ直りますが、リハーサルコンテストだと機材の入れ替えもあります。また、全然提出がないチームは様子を見にいったりします。
一件手順ミスがありました。インタラクティブ問題のツールが実行できないという報告が上がりました。ツールのビルド方法にミスがあることに気づき、再度ビルドして選手コンピュータに配り選手に通達します。
中継用のスクリーンキャストのテストもしていたのですが、そこの立ち上げも遅れました。手順を自動化しておかないと難しいですね。
プラクティスコンテスト後はチーム紹介。裏で本番の準備をして終了です。選手用コンピュータの内容も初期化し、インタラクティブ問題のツールも本番用に差し替えます。この日はここで終了し、ホテルに帰ります。
26日 コンテスト本番
6:30 に起きて 8時には到着。選手は 8:40 から入場し、コンテスト本番は 9:30 スタートです。やることはプラクティスコンテストと同じく選手対応ですが、本番なので緊張感が全く違います。案件次第では審判団に照会したり、コンテスト運営に影響することもあります。
本番まではまた注意事項を書いたスライドを選手ディスプレイに表示したり、スポンサーのCMビデオを流したりします。コンテスト開始直前にはまた選手へのプレゼンがあるのでそれの対応もします。
今年はコンテスト開幕直後に一件、ログインできないチームが出ました。すぐ解決できなかったので遠隔リブートで対応。3分のロスを後で補償することになりました。そのあともコンピュータが不安定になったチームが1チーム出ましたが、これは作ったプログラムがメモリを大量に確保していたためでした。プログラムを止めてもらって直りました。それ以外には目立ったマシントラブルはありませんでした。前日にハマっていたスクリーンキャストの立ち上げも開始から程なく行えました。後から10分くらい遅れているとの報告があり、これの対応はできませんでしたが。
コンテスト監視をしつつ問題の一般公開をしたり、合間をぬってスタッフ用お弁当を交代で食べたり、コンテスト後の問題解説用のスライドをプレゼン用のコンピュータにコピーしたりもします。 14:30 にほぼ全チームのコンテストが終了、1チームは3分のロスが出たのでロスタイムが支給されて 14:33 に全チームのコンテストが終了しました。この後はアナウンスがあったり、問題解説や結果発表のプレゼンがあったりでそれの対応をします。プレゼンが始まってしまうと選手用のコンピュータはもう選手がログインしないので、takeout ディレクトリの中身とログを集めて片付けの準備をしたりもします。その後、懇親会で選手が動いた後に全部のコンピュータの電源を遠隔で切り、片付けに入ります。片付けはインストール作業などがないので手分けして行います。今年は昨年よりも懇親会に顔を出せたのでよかったです。
27日
コンテストは終わってますが、疲れたので有給を取ります。また、テスト用のレンタル機の回収が来るので、それを返して私のコンテストは終了です。
感想
準備の量がかなり多いです。今回は基本システムの Ubuntu 22.04 へのアップデートがあったのでその分が多いのですが、それ以上にスクリーンキャスト対応がきつかったです。これを実現可能にしたくてこの仕事をやっている面もあるのでやっているのですが。まだ変更しなければいけないところが多く厳しいのですが、安定したらもうすこし準備が少なくなるのではないかと期待しています。スクリーンキャスト対応については別途記事を書きたいです。
本番のマシントラブルは昨年度と比べてかなり減りました。昨年度はよくわからない強制ログアウトやら画面ブラックアウトが数件ありましたが、今年は1チームロスタイム支給の他はマシントラブルはほぼありませんでした。このあたりは準備の成果もあると思っています。
完全に余談ですが、Twitter アイコンをバッジにして懇親会に持っていったらちょっと話しやすかったです。
昨年の ICPC で、自分の Twitter アイコンを大きな名札にして首から下げてた参加者がいて、懇親会でかなりわかりやすかったので私も今年それやろうかなと思っている。参加者ではないけど。
— Yu SUGAWARA (@gusmachine) November 22, 2023
これをやってた審判団もいたのが印象に残っています。