たのしいオンラインジャッジの実装 (Making On-line Judge is Fun)
こんばんは! kagamiz です.
今回はオンラインジャッジを実装する話を少しします. (このスライドの補足説明みたいなものです.)
★書いてる人について
- 競技プログラミング以外のプログラミング経験はほとんどなし. (C とC++ のSTL の一部に精通している程度.Ruby は学校の授業でやっている程度)
- Web 系のプログラミングは2 度目. (1 度目は 古いかがみずおんらいんじゃっじ)
- ミズゴロウがすきです.
★とりあえず完成したものをみせてよ!
- 写真はりまくります.
これはトップページです. CSS はいろんなものを併合しています.
問題ページはこんな感じのレイアウトです. 数式には, このブログにも使っているmathJax を利用しています. (キレイ)
問題を提出すると, Submission のページに飛びます. F5 を押さなくても, Codeforces のように自動でリロードしてくれます.
ちなみに, たまに仕様(?)でDB の文字列の末端にゴミが付着します. (リロードすると消えてくれます.)
ゴミが出現した後は高確率でInternal Server Error が次の文と一緒にでるのですが, F5 を押しつづければ消えるのであまり気にしないことにします(不治の病です).
[error] Premature end of script headers: ****.wsgi, referer: http://new-koj.hoge.fuga/ [notice] child pid *** exit signal Segmentation fault (11)
直す方法知ってる方がいたら教えてください. 泣いて喜びます.
★どんな環境で作ったの?
- Web はFlask というPython のフレームワークをつかいました. Python わかんないけど先輩から聞きながらがんばりました.
- DB はmongoDB, ジャッジとの通信はrabbitMQ で行っています.
★実装について
- まずはFlask のドキュメントのクイックスタートを一通り踏襲しましょう.
- Web 側はログインの機構ができれば(これまたクイックスタートにかかれています), あとはDB からデータをとってきたりするところが出来れば"実装するだけ" です. ログインの機構やDB とのやりとりは, 僕の先輩が作った機構 を参考にすると取り掛かり安いと思われます.
- ジャッジ側のスクリプトは, メッセージとして送られてきたSubmission ID をDB から呼び出してから処理をしています. 時間とメモリの監視は/usr/bin/time に任せています.(セキュリティ面での対策はまだ何もとっていないので, Closed Beta で公開するとしても故意の攻撃は止めてください...)
- Codeforces 風に更新せずに結果がみれる機構は, テストケースを1 つ終える度にDB の1 つのレコードをまるごと更新して, 1秒毎にajax でDBの状態をサーバに問い合わせる事で実現しています.