読者です 読者をやめる 読者になる 読者になる

Lilliput Steps

小さな一歩から着実に. 数学やプログラミングのことを書きます.

たのしいオンラインジャッジの実装 (Making On-line Judge is Fun)

こんばんは! kagamiz です.

今回はオンラインジャッジを実装する話を少しします. (このスライドの補足説明みたいなものです.)


★書いてる人について
- 競技プログラミング以外のプログラミング経験はほとんどなし. (C とC++STL の一部に精通している程度.Ruby は学校の授業でやっている程度)
- Web 系のプログラミングは2 度目. (1 度目は 古いかがみずおんらいんじゃっじ)
- ミズゴロウがすきです.

★とりあえず完成したものをみせてよ!
- 写真はりまくります.
f:id:kagamiz:20130508214627p:plain
これはトップページです. CSS はいろんなものを併合しています.
f:id:kagamiz:20130508214956p:plain
問題ページはこんな感じのレイアウトです. 数式には, このブログにも使っているmathJax を利用しています. (キレイ)
f:id:kagamiz:20130508214926p:plain
問題を提出すると, Submission のページに飛びます. F5 を押さなくても, Codeforces のように自動でリロードしてくれます.

ちなみに, たまに仕様(?)でDB の文字列の末端にゴミが付着します. (リロードすると消えてくれます.)
f:id:kagamiz:20130508215203p:plain

ゴミが出現した後は高確率で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の状態をサーバに問い合わせる事で実現しています.

ローカル環境での構築は特に詰まないと思うのですが, どこかのサーバに上げるときに僕みたいに詰むと辛いと思うので, 実装しようと思っている方はがんばってください...

★コード公開しないの?
- 不治の病(先述) が治る or n ヶ月経てば公開します.

てきと~に書いたので分からないことがあれば twitter (@kagamiz) またはここのコメント欄にバシバシ書いてください. この記事に追記していきます.


[最終編集 : 2013 年 5 月 8 日]