SyntaxHighlighter

StackEdit CSS

2012年12月9日日曜日

OnlineJudge自作1

きっかけ

 今度学校で、ショートコーディング大会を開催しようと思っている。
 最初はあらかじめソースを提出してもらって、当日は結果発表をしようと思っていたが、地味という声があった。
 考え直した結果、簡易ジャッジシステムを作って、当日、リアルタイムでランキングすればそれなりに盛り上がるなぁと思った。そこで前に作った、簡単なオンラインコンパイラをベースに改造していく。

オンラインコンパイラ

Ubuntu 12.10(Server)をVirtualBox上で稼働させて、Windows(ホスト)からアクセスした。
 コンパイルを実行(POST)すると、CGIにソースが流し込まれる。CGIはPerlで書かれており、これは流し込まれたソースをファイルに保存して、コンパイルし、実行して、標準出力に書き込む。返ってきたやつはOutputに書き込まれる。
 さまざまな言語に対応させるためにはどうしたらいいか考えたら、3つのタイプに分けられることに気づいた。

  • C++みたいな、コンパイル→実行のネイティブタイプ。これはコンパイル時にはエラーがあるが、実行時にはない。
  • Javaみたいな、中間言語にコンパイルされるタイプ。こちらは実行時にもエラーがある。
  • Rubyみたいな、コンパイル不要のスクリプトタイプ。いきなりインタプリタを実行する。
 コンパイルと実行を分けていたがあまりにも共通部分があったので考えたら、実行関数の、引数の1つのエラーメッセージを渡したときに、エラー判定をすることで、結構すっきりすることが分かった。Perlは引数を渡さなかったら、undefinedになるのでそれを利用した。C++にも似たようなものに、デフォルト引数があるが、これはあらかじめ値をセットしなければいけない。
 アルゴリズム的にはそんなに難しくないが、サーバー(仮想だが)を立てるところからするのは初めてで、なかなか手間取った。普段使っているC++とは違う文化を感じられていい経験になったと思う。

準備

今回のは前のように無計画にいくわけにはいかないと思ったので、少し考えてから作成に取り掛かることにした。
まず必要な機能の列挙

  • ユーザー識別。これがないとランキングできない。
  • ソース提出&コンパイル。これは前のが活きると思う。
  • ステータスキュー&ランキング表示
これを踏まえ、次の構成にしようと考えた。
ディレクトリ構造は、
という風にすることにした。
 ステータスファイルをどのように持とうかと思ったが、とりあえずXMLにすることにした。持つデータは階層構造にした方がいいと思ったからだ。ちなみに持つデータは、
  • 現在のポイント
  • 問題ごとの情報。コードサイズ、実行時間、使用メモリ
を考えている。
 ステータスキューは、csvにすることにした。これは階層構造は不要で、むしろ2次元データのほうが嬉しいからだ。
 ユーザー識別は、答え(=ググる)を見ずに自分で実装したかった。何か使えそうなものはないかと探していたら、cookieが使えそうなことが分かった。cookieに、エントリーページで入力してもらったユーザーIDをいれておき、ソース提出画面や、ステータスキュー、ランキング画面で、cookieのuseridが空だったら、エントリーページに飛ばすということにした。まぁ使うのはショートコーディング大会のときだけだから、この程度でいいと思った。

思いのほか大変そうだ…

0 件のコメント:

コメントを投稿