feature image

2023年7月8日 | ブログ記事

ICPC 2023/24 国内予選 不参加記

  1. 会場に行って環境構築の手伝いをしたり、おはなしをしたりします。
  2. 印刷された問題文 (12 部) を配る係をします。
  3. 順位表と Twitter を眺めながら問題を解きます。1 人では全部の問題に触れなくてきびしいものがありますね (3 人でもそうなんですが)
  4. みんなでカレーを食べます。

国内予選ジャッジサイトの作り方

やっぱり国内予選のバチャで手元実行の練習をしたいですよね。これを作りましょう。とりあえず最低限の機能で動けば良いです。

1 度だけやった ハッカソン のことを思い出して、Go でサーバーを作ることにしましょう。

1. 出てきて欲しいページの例を HTML で書く

できました

2. サーバープログラムを Go で書く

Echo ってやつを使うとサーバープログラムが簡単に書けます。

今回は / へのアクセスで Workspace が、 /problems のアクセスで問題文が表示されて欲しいので、

e := echo.New()
e.GET("/", getWorkspace)
e.GET("/problems", getProblems)
e.Logger.Fatal(e.Start(":8000"))

みたいな感じに書いて、関数 getWorkspacegetProblems で HTML を返せばブラウザに表示してくれます。

このままだと画像が表示されないので、

e.GET("/images/:filename", getImages)

も用意しておきます。

3. 現在時刻とか正解状況とかを HTML に埋め込む

埋め込むところに {{serverTime}} みたいな置き換え用の文字列を置いておいて、strings.Replace でがんばって埋め込みます。
いや Vue とかフロントエンドのなにかを使うべきなんですが、とりあえず動けばいいし、フロントエンドを知らない競プロer にはこれで十分です。

4. DB に正解状況とかを記憶させる

まあコンテスト中再起動しなければプログラムのメモリ上に持っておけば十分なんですが、traP の NeoShowCase にはデータベースを付ける機能があるので、付けてみます。
最近情報工学系 (系外) 300 番台の データベース を履修したので、SQL が書けます。
go-sql-driver/mysql で、データベースと接続して Go から DB にクエリを送ることができます。

5. 提出機能を実装

/submit に提出用のページを作ることにします。

e.POST("/submit", postSubmit)

ブラウザから POST でデータを提出させるようにするには、<form> タグを使います。

<form action="submit" method="POST" enctype="multipart/form-data">
   <input type="submit" value="submit">
</form>

action="submit" で提出先を /submit に、 method="POST" で提出方法を POST に、enctype="multipart/form-data" でファイルを送れるようにします。
<input type="submit"> が送信ボタンになります。

postSubmit では、正解状況とかを取得し、いろいろ判定して、結果に応じて Congratulations! とかの Result ページの HTML を返します。

6. スペシャルジャッジ

output_checker をコンパイルしておき、実行ファイルを置いておいて、提出の answer ファイルを手元に保存して output_checker を実行します。

7. NeoShowCase にデプロイ

NeoShowCase は、プログラムを traP のサーバーで動かすことができて、traP アカウントとの連携や URL 割り当てなどをやってくれるすごいサービスです。

golang - Official Image やハッカソンの例を見ながら Dockerfile を書きます。

あとは wiki にしたがっていろいろ設定すると、できました。

リンクは部内限定

練習に使ってくれて、いいはなし

感想

大学 + traP の活動をしていたらいつのまにか Web サービスが作れるようになっていて、感動…

tatyam icon
この記事を書いた人
tatyam

競技プログラミングと音ゲーをしています。 AtCoder銀冠 ICPC 2020/21 Yokohama 3 位, WF 15 位 (good_yamikin) ICPC 2021/22 Yokohama 3 位 (tonosama) ICPC 2022/23 Yokohama 1 位 (tonosama)

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2021年8月12日
CPCTFを支えたWebshell
mazrean icon mazrean
2021年5月19日
CPCTF2021を実現させたスコアサーバー
xxpoxx icon xxpoxx
2024年3月15日
個人開発として2週間でWebサービスを作ってみた話 〜「LABEL」の紹介〜
Natsuki icon Natsuki
2023年10月20日
DIGI-CON HACKATHON 参加記事「Comic DoQ」
mehm8128 icon mehm8128
2023年7月13日
アルゴリズム班はやとき王選手権「競(けい)プロ」を開催しました!
abap34 icon abap34
2023年6月23日
2023 春ハッカソン 26班 『traP Mission』
Ras icon Ras
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記