Functional Online Judge

Haskellでオンラインジャッジしたいよね?
ということでこんなものができました。

http://tanakh.ath.cx/OnlineJudge/oj.cgi/

あらかじめお断りしておきますが、
いつ公開が終了するかも、いつデータを消すかも分かりません。
ジャッジシステムはデータベースの排他処理で落ちることがあるので、
いつ落ちているかも分かりません。
なるべくジャッジ中にはページを参照されませんように。
あと、ネットワーク・マシン環境ともに貧弱なので、
あまり負荷をかけられませんように。
ハッキングしようなどとも思われませんように。


とりあえず、うちのしょぼいマシンでは動かすのも大変なので、
私にサーバを貸してくださるという方、
オンラインジャッジを運営したいという方、
もしそんな奇特な方がいらっしゃれば、いつでもご連絡ください。
あと、私のデザインセンスが皆無なので、
もっとかっこよくしちゃる、という人も是非どうぞ。

                                  • -

以下、技術的な話


このCGIは(おそらくもちろんというか)Haskellで書かれている。
Haskellコンパイルできるので、コンパイルして実行している。
そのため、実行速度はなかなか速い。
種種のスクリプト言語よりおそらく速い。
Haskellsqliteを用いてデータベースアクセスをしつつHTMLを生成するという形である。


HTML生成に関してはNetwork.CGIとText.Htmlのコンビネータライブラリを用いると
非常にすんなりと実装できる。
Session周りのサポートがないので、その辺は困る。
自分で書かないといけないか?
WASHって便利?
ちなみに、Network.CGIのwrapperにバグを発見した。
バグを発見したのだが、どこにどうしていいものやら分からないので、
こっそり直して使っている。


データベースアクセスはHaskellDBを用いた。
裏はsqliteだが、まぁ、普通に使えている。
しかし、HaskellDBも微妙にしょぼい。
limitで個数しか指定できない。
開始位置を選べないと、10件目〜20件目を取ってきたい、
みたいな時にlimitに20を指定して取ってきたやつを(Haskellで)dropするしかない。
開始位置が10ならいざ知らず、数万のオーダになると厳しいと思うのだが。
あと、group byが使えない。
group byが使えないと、特定の要素が何個あるのかカウントするのに、
いちいち引っこ抜いてきて(Haskellで)lengthしないといけない。
ひとつならそれでも仕方がないが、カウントする対象が
いくつもあった場合、非常に計算の無駄だ。
用意されている関数だけで何とかうまいことできないか考えたが、
どうも無理っぽい。
あと、これもバグっぽいのだが、
同じ名前をもつキーをprojectできない。
仕方がないので、そこだけ名前を変えたりした。


とりあえず使ってみた総評は、
「今一歩?」
という感じだ。
もうちょっと痒いところに手が届いて欲しい。
まぁ、でも、コンビネータ言語によるHTMLの生成は快適そのものだし、
SQLクエリのコンビネータによる生成も(痒いところ以外は)快適だ。
なにより、書いてて楽しい。
もうちょっとライブラリが整備されていれば非常に良い。