週末にジャッジシステムを自作しようとした話

はじめに

先週の金曜日にジャッジスステムの制作欲が湧いてきたので、作ることにしました(迫真)
平日は忙しいのでとりあえず週末2日での実装を目安に、手元環境で動く所までを目標に頑張りました

金曜日時点での構想(原文ママ)

Pythonとかイケイケな言語とDockerを使って遊びたい
curlでpostしたらレスポンスが返ってくる、程度でいい
問題文(TeXとか使うやつ)とテストケースをjsonで投げると自動で問題が追加されるぐらいのはやりたい

ぼくのぎじゅつりょく

web系と呼ばれる分野が誇張でもなく全くできません
JavaScriptで世界に挨拶する事ができません
webページやサービスを作った事がありません

できた事

flaskさんを使ってlocalhostで動く(は?)webページと自動ジャッジシステムを作れました はい
問題一覧から個別ページに飛んで、提出欄にコードを貼ってSubmitすればレスポンスの確認が可能、みたいな必要最低限の機能まではできました

・提出ファイルを保存してジャッジ環境でコンパイル、実行からの出力確認とRE,TLE捕捉ができた
・問題提出フォームから形式の合ったjsonファイルを投げると自動で問題を追加してくれるようにできた
・問題のjsonを読んで数式表示やサンプル表示まで含めいい感じにやってくれる物をつくれた
・ジャッジ用のプログラムと本体部分(外から見えそうなやつ)を分けて実装できた
・bootstrapさんを使ってまだマシな(メニュー程度はあるよ!!!!)ページが生成できた

できなかった事

localhost以外で動かせていない
・セキュリティがわからない
・OLE,MLEが捕捉できない(!?)
・例外処理が書けない
・Dockerで動いてないし、そもそもプログラムを分けただけ
・ファイルをローカルにそのまま保存するのをやめろ

など、上に書いてない事ぜんぶができていません…

開発の流れ

web系の開発で使えそうな言語の中で自力で"Hello, World!"できるのがPythonしかありませんでした よってPythonを使います
なんかFlaskってやつに聞き覚えがあって、それを使うとイケイケな開発ができそうでした Flaskを使う事にしました

1日目

まずはCLI側からソースコードをファイル形式でPOSTして、それを受け取ってみる事にしました この辺は結構楽しかった(バグが辛くないので)
とりあえずそれを†ローカルに保存†して、subprocessさんを使ってコンパイルさせてみました ちゃんと動いてくれたので嬉しい
標準入力と標準出力のサンプルを迫真の†Hard Coding†で打ち込んで、subprocessで実行した結果とdiffを取ってみました そんでもってこの結果もローカルにtxt形式で保存します(は?)(データベースがわからない)(なにもわからない)

これでCE,AC,WA,RE,TLE辺りは取得できるようになったので(メモリ使用量はどうした)、問題のjson形式による読み込みをやります
問題文、入出力、制約とかをまとめてjsonにして、それをPOSTで送りつけられるようにします
問題一覧もローカルにそのまま保存して(頭がわるすぎる)、問題idに対応するURLにソースをPOSTする形式に変更しました

ここまでが一日目にやった事です CLIからジャッジできるようにはなったけど実用性は皆無で、とてもかなしいです
ここからwebページのおべんきょうをして、最低限使える物にしていきます

2日目

上で述べた通り、ぼくはwebと名の付く任意のものがわかりません とてもつらいです
Flaskではjinja2って名前のイケてる何かを使えるらしいので、Qiitaとか見ながらがんばります
表示はbootstrapを使うとめっちゃエモい超近代的な物を作れるらしいので、それともサンプル見ながら格闘します

データ取得してhtmlに反映するやつができました
取得したデータはrender_templateから渡してjinja2でよしなに出力します
今の状態だとデザインもクソもない悲しすぎるやつなので、bootstrapさんにメニューとか各種のボタンとかを丸投げします
問題ページぐらいはマシな物にしたかったので、jsonから整形して問題文やサンプルの表示、MathJaxを導入して数式表示辺りをできるようにしました

結果

なんかこういうのができました f:id:shibh308:20180806081915p:plain f:id:shibh308:20180806081935p:plain

反省

ローカルにそのまま保存するのをやめろ(素振り)ローカルにそのまま保存するのをやめろ(素振り)ローカルにそのまま保存するのをやめろ(素振り)ローカルにそのまま保存するのをやめろ(素振り)ローカルにそのまま保存するのをやめろ(素振り)
ジャッジの隔離もしてないので悪意のある提出で死ぬ 間違えてデバッグ出力消さなかったらそれだけで多分死ぬ というかMLEの確認すらしていない
jsonの形式間違ってたら多分落ちる よくない
メモリ使用量も実行時間も表示してないので結構かなしい事になっている というかwebページの作り自体がかなしい

うれしかった事

実態はどうあれ2日で動く物ができた
うぇぶがまったくわからない人間でもなんとかなる(?)事が分かった