AOJの自動化ツールを作った

概要

Aizu Online Judge (AOJ) を快適に楽しむためのツールを作成し、公開した。

背景

私事だが4月からソフトウェアエンジニアとして某企業で働くことになったので、以前取り組んでいたオンラインジャッジをもう一度やろうかと考えていた。

しかし、以前オンラインジャッジをやっていた際に、単純作業を繰り返していたのが苦だった。 C++を使用していたので、プログラムが書けたら一度コンパイルし、入力データを標準入力から手入力(もしくはテキストファイルに書き出してリダイレクト)し、間違っていたらまたコンパイルからやり直し...といった具合だった。

この一連の作業が煩わしいんだよなぁと思いながら AOJ のサイトを眺めていた折、APIが公開されていることに気が付いた。

この API を使えば割といい感じに自動化できるのでは?と思い、ツールを作成した。 実装は Go で行なった。理由はまだ Go をちゃんと書いたことがなかったということと、クロスコンパイルすればどの OS でも動いてくれる(可能性が高い)からである。

aojtool

拙作 aojtool は先述した面倒な作業をコマンド一発で実行できる。 例えばこの問題のサンプルを実行したい場合、

$ aojtool run ITP1_1_c rectangle.cpp

のようにして実行できる。 提出したい時も

$ aojtool submit TP1_1_c rectangle.cpp

で提出でき、結果の確認も

$ aojtool status

で可能である。

実装

CLI フレームワークとして cobra を用いた。 サブコマンドやオプション等をいい感じに扱ってくれる大変便利なものである。

また API クライアントのアーキテクチャこちらの記事を参考にした。 詳細は当該記事を参照されたし。

type Client struct {
    Endpoint  *url.URL
    UserAgent string

    httpClient *http.Client
    cookieJar  *cookiejar.Jar

    Auth   *AuthService
    Submit *SubmitService
    Status *StatusService
    Test   *TestService
}

Client からサービスオブジェクトを参照して各種処理を実行する。 こうすることで Client のコードが肥大化することを防ぐ。

また、go の net/http/cookiejar を用いることで cookie をいい感じに扱ってくれる。 この cookieシリアライズして書き出したり読み出すことによってログインを保持している。

まとめ

AOJ を快適に楽しむためのツールを作った。 テストが全くなかったり、エラー処理(特に http リクエスト関連)がかなり雑なので、気が向いたら直していきたい。 よかったら go get して使ってみてください。

追記

  • 2019-02-18: 色々直した。テストケースを保存したりしたい。