ICPC 2024 横浜大会 に、スタッフとして参加していました。私はシステム担当として、だいたい以下のような作業をしました。

  • コンテストマシンの選択
  • コンテストマシンの計算機環境セットアップ
  • コンテスト中の選手環境の監視
  • 中継へのシステムサポート

この記事では、準備として行った主な作業として、PCベンダー変更、スクリーンキャスト、印刷、そして審判システムへのログイン方法の変更を列挙しています。作業は私をふくめ、システム担当の複数のボランティアで行われました。

PCベンダー変更

例年は選手用コンピュータとして Lenovo Thinkpad を採用していましたが、今年は Dell Latitude に変更しました。

コンピュータその他を借りているレンタル業者から、Lenovo Thinkpad を避けたいとの連絡を受けました。モデルチェンジ時期と被るために、在庫が保証しにくいとのことです。代替として Dell Latitude をお薦めされました。

慣れなどの問題からあまり他のベンダに変えたくなかったのですが、仕方ないです。Lenovo Thinkpad はレンタルできる機器の中では比較的高額になっていたので、安い機器に変えるチャンスだったと見るのが妥当かもしれません。

幸い本番まで余裕があったので、ちゃんと検討を行いました。カタログ、 Ubuntu Certified Hardware、 Archwiki などを眺めたのち、Dell, HP, Lenovo の3機種を選び、事前に借りて短期間でテストして選ぶことにしました。

テストした結果、勧められた Dell Latitude を選択しました。これだけが無線LANが Ubuntu 22.04 からカーネル更新なしで動いたのが主な選択理由です。他の機種に比べて少し古かったためでしょう。

難点としては、イーサネットポートが蓋をちょっと動かして接続される仕組みになっていて壊れやすそうというところです。実際レンタル機器のいくつかはここが壊れてました。ラップトップは大きさが問題になるので、薄くするためにこのあたりに犠牲が来るのは仕方ないのだろうということでした。実際、今回テストした3台はすべてこの仕組みになっていました。

選手マシンのスクリーンキャストの方式変更

プログラミングコンテスト中は、YouTube Live で中継を行っています。この際、選手のコンピュータの映像を出せると良いと思い、その仕組みを作っています。

昨年度は https://gusmachine.dev/posts/2024/01/19/2024-01-19-icpc-screencast/ うまくいきませんでした。具体的には以下の問題が出て、1が特に深刻でした。

  1. 動画が一度に30秒しかとれない。30秒経つとループしてしまう。
  2. 動画が10分遅れている。10分前の動画が見られる状態になっている。

1はシステム的に不可避でした。中継画面合成のソフトとして、コンテストの世界大会用に使われている live-v3 というソフトを使っているのですが、これが対応している動画形式が mp4 と、WebRTCGrabber という自作のプログラムしかないためです。mp4 はストリーミング向けの形式ではなく、WebRTCGrabberの導入は難しそうでした。仕方ないので HLS で撮ったストリーミング動画を30秒ずつ mp4 に変換して、live-v3 に渡していました。30秒以内に画面を切り替えないと、30秒ずつループした動画が見えるようになっています。

今年度は、live-v3 が HLS に対応したので、問題が解決しました。

問題 2 も、ネット検索して適切そうな ffmpeg オプションを探し出して適用したら解決しました。エンコーディングの段階でバッファサイズを適切に指定すればよかったようです。

以上2点の問題が解決され、スクリーンキャストが実況で使えたようです

印刷方法の変更

プログラミングコンテスト中、選手は書いたプログラムを印刷することができます。3人チームで PC が1台しかないので、一人がPCを使っている間に他の人が印刷したプログラムを眺められるということになります。 印刷するには我々が用意した printfile というコマンドを使います。コマンドを叩くと、与えられたファイルを a2ps で ps ファイルに変換し、チーム名や机番号を書いた1ページ目をつけて、コンテスト会場に設置したプリンタで印刷します。

昨年度までは、上の処理を全て選手のマシンで行っていました。 printfile コマンドを叩くと、上記の a2ps やその他のプログラムが走るようになっていました。今年はそうではなく、上の処理を行う印刷サーバを設置し、 printfile コマンドは単に curl コマンドでサーバにファイルを POST するようになっています。

印刷サーバによって、以下の問題が解決しました。

  • 選手がうっかり大量の印刷指示を出すことを防ぐ。
  • 選手が Ctrl-P など、printfile 以外で印刷することを防ぐ。前回は選手がプリンタに直接印刷指示ができたために、これが可能でした。これをされてしまうと、どのチームが印刷した紙なのか特定できる情報がなくなってしまうので、印刷を適切なチームに配達できなくなります。

さらに、印刷サーバを監視することによって、いつごろ印刷が多く来るのかなどの情報が得られるようになりました。

審判システムへのパスワードレスログイン

選手がコンテストシステムにログインするには、ユーザー名とパスワードが必要です。ユーザー名とパスワードは昨年までは2回入力させていました。選手PC へのログインと、コンテストシステムへのログインです。これを、今年は1回にしました。コンテストシステムへのログインはパスワードレスで入れるようにしたわけです。

2024 年の Championship でも同じシステムを使ったのですが、ここで、2回入力させるのは冗長ではないかとの意見があり、やり方を模索していました。コンテストシステム DOMjudge では、パスワードレスでログインする方法がいくつか提供されています。 Championship の際に出たアイデアは IP-based login なんですが、これは偽装しやすく全く安全でないので却下していました

今回は x-header 方式を使うことにしました。HTTP リクエストヘッダにユーザ名とパスワードを書く方式です。リクエストが暗号化されていて覗き見られない環境であれば、これで十分安全だと考えました。