10/3に開催されたKHK杯(試合配信動画はこちら)で、自作のトーナメント管理システム「Serval」を使って頂きました。参加者は88名で、Servalを使った大会としては最大規模です。規模が大きくなったこともあり、準備の段階から手を入れる箇所がいくつか出てきました。

※写真はAIで加工しています。配信側はノータッチなので、あくまで赤丸がServal関係です。
この記事では、大会前の準備、当日起きたトラブルと大会後の対処をまとめます。末尾にアンケートのお願いがあります。
Servalあって良かったなと思って頂いた方は、良いものを作るために是非ご協力をお願いします!
Servalとは?
私が製作したかわロボ大会向けのトーナメント管理Webアプリです。サーバーはGoogle Apps Script(Googleが無料で提供するサーバー機能)、データの保存先はGoogleスプレッドシートです。AIで作りました。
25年の立命杯で使われていたトーナメント管理システムの製作者に他大会へも是非展開してほしい旨をお伝えしたものの、これから本格的に研究も始まり忙しくなりそうで難しいとのことでしたので、26年の中島杯に向けて自分で作っちゃいました。
できること
- 管理PCで結果を入力すると、観客のスマホのトーナメント表が自動で更新
- 会場モニターや配信用の「別画面」に対戦カード・残り時間・本数などを表示
- 推し投票・推しコメントや応援の集計と表示
- 初戦の同士討ち回避も可能な自動トーナメント組合せ生成
- シングル/ダブルエリミネーション、4〜128枠・最大4ブロック、ブロック代表戦や3位決定戦にも対応
- 選手名簿のCSV取込、参加者リストでの受付チェック(遅刻・棄権などの状態管理)
- 次の試合を表示する「次の試合バー」と、対戦カード・勝ち上がりの演出(上位戦は派手な演出も)
- トーナメント表を画像にしてXへシェア、大会成績のCSV出力
- 【途中】試合中の優勢(将棋のAI評価値みたいな)の表示や、来てない選手を自動でLINE呼出し
大会前の準備
基本スタンスとしては、私はServalの製作者であり大会運営側ではないので、運営側でServalを使いこなして頂きました。とはいえ質問に回答したり、トラブル対応したりは製造物責任的にもちろん対応しました。かわロボの大会に関しては今後も無償で対応するつもりです。
シード設定が消えた件
準備中に「シードの設定が外れている」と連絡がありました。対策として、大会構成を変える操作の前に確認ダイアログを出すようにし、読み込みに失敗したまま保存してしまわないよう保存側にも安全策を入れました。
データ容量が上限ぎりぎり
88名分を入れた時点で容量が89%、トーナメント進行すると100%を超えるかもしれない状態になってしまいました。GASのスプレッドシートには上限があるためです。
そこで、データを圧縮してから保存する方式に変えました(ver211)。容量の問題は当面なくなりましたが、スプレッドシートを直接開いてもデータは読めなくなりました(読込みは必ずServal経由)。
1本先取と2本先取の混在
当初は切り替える試合を事前に設定する作りでしたが、リハーサルで送信エラーが出たため、チェックを1個入れて送れば1本先取、2個なら2本先取として扱う方式にしました。
どこから2本先取にするかを当日その場で決められます。
配信まわりの追加
- 配信専用モード:別画面のURLを開くだけで、別画面が自分でサーバーから最新を取り込む。2秒ごとに更新時刻を確認
- 長い機体名:省略記号で切らず、文字の高さはそのままで横幅を75%・50%に縮めて表示
- 別画面の文字サイズ調整(機体名を少し小さく、二つ名・所属を少し大きく)
- 推しコメントを別画面に常に表示(本番では使わず)
- 派手な演出:試合開始前の対戦者の演出で、二つ名のみ最初に表示する設定を追加。また、ド派手な演出も悪ノリで追加(本番では使わず)
当日起きたこと
当日の追加機能
大会中にも、運営の要望でいくつか機能を追加しました。
- 棄権・遅刻の表示:受付で使っている参加者リストで「棄権」「遅刻」などを選ぶと、トーナメント表の選手枠に「(棄権)」「(遅刻)」と表示されるようにしました。
- 赤と青の左右入れ替え:別画面の表示で、赤と青コーナーの左右だけを入れ替える設定です。会場の配置(カメラから見た赤・青の位置)と画面の左右を合わせるためのものです。
- 試合途中の本数を表示:2本先取の1本目の後も、別画面の本数が「0-0」のままに。勝者が決定後に更新する仕様にいつのまにかなっており、チェックを入れた時点ですぐ送るよう修正(ver227)。
保存が5分間できなかった
お昼前に約5分間、エラーで結果の保存と送信が失敗し続けました。原因はGoogleのサーバー側が止まっていたことで、その後は再発しませんでしたが、再発防止として次の対策を入れました(ver231)。
- 読み込みはスプレッドシートではなく一時保存領域(CacheService)から返す。サーバー側の読み込み時間は約0.6秒に
- 保存が混み合ったときは最新データを一時退避して受け付け、後からまとめてシートに書き込む。退避中も閲覧者には最新が見える
- 閲覧画面は更新時刻だけを確認し、変わったときだけ本体を読む。閲覧者が増えてもサーバーの負荷はほぼ変わらない
別画面の反映が遅い
管理PCとは別のPCで配信用の別画面を映していたところ、結果の反映に時間がかかりました。
もともと別画面は、同じPCで開いている管理画面からデータを受け取る作りでした。そのため配信用のPCでも管理画面を開いておく必要があり、その管理画面は7秒ごとにサーバーを確認して他のPCの入力を取り込んでいました。さらに、誤って上書きしないよう「試合を選んでいる間は取り込まない」作りだったため、配信PC側で試合を選んだままだと、いつまでも古い結果が表示されていました。
前日に追加した配信専用モード(別画面が自分で2秒ごとにサーバーを確認する)を使えば管理画面は不要です。加えて、管理画面も試合を選んだままで最新を取り込むように直しました(ver234)。
既に頂いている指摘
大会後に、運営や参加者の皆様から次のアドバイス・ご指摘を頂きました。ver228〜230で、いずれも対処済みです。
- 試合タイマーのリセット機能追加。時間切れを音で通知
- 2本先取の2本目で、タイマーが初期値に戻らない
- 演出をタップで飛ばしたい。演出中、文字幅が途中一瞬だけ崩れている
- 棄権した選手の試合を、不戦勝として自動で入れてほしい
- 別画面が常に見えないので、小さく表示しておきたい
アンケートのお願い
次の大会に向けて、こちらのアンケートにご協力をお願いします(3分程度)。
締切は10/12です。呼出しや別画面の見やすさやもっと盛り上げる方法など、率直なご意見を頂けると助かります。
おわりに
より大きな大会で使って頂いたことで、手元のテストでは出ない問題がまとめて見つかりました。運営の皆さん、選手の皆さん、ありがとうございました。




