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: 色々直した。テストケースを保存したりしたい。