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

コードを短く書く人のブログ

コードゴルフを稀に取り上げるブログ

AOJ watch toolsの話

AOJ watch toolsの話

この記事はICT Advent Calendarの15日目として書かれました。

前置き

どうもこんばんわ、@orisanoです。Advent Calendarで何を書こうと悩んでいましたが、
今年作ったものがあるじゃないかと気づいたのでそれを記事することにしました。
僕は今年の1月くらいからAOJ watch toolsというものを開発しつつ公開してました。
使ったこと、見たことがあるという人もいるかもしれません。
以下の3つをまとめてAOJ watch toolsと呼んでいます。

今回は僕とAOJ watch toolsの1年間を書いていきたいと思います。

きっかけ

きっかけはraimei10130くんだったと記憶しています。
当時、AOJで何問解いたかを後輩に聞くのが趣味だった僕は
皆のアイドルraimei10130くんと

僕「何問ときましたか?」
raimei10130「(◞‸◟)」
僕「何問ときましたか?」
raimei10130「0問です。」
僕「1日1問解きましょう!!!!!!」
raimei10130「わかりましたよ!!!!!!!!!!!!!!!!!!!」
僕「AOJ監視しとくから」

というやりとりをしました。これがAOJ watch toolsを作るきっかけになったわけです。
といってもこのやりとりのあと2週間ほどは普通にAOJを監視していました。
2週間たって監視も面倒くさくなってきてましたが、当時の他の1年生や2年生にも
同じようなやりとりをしていて引くに引けない状態(自業自得)だったので
ツールをつくろうと決意しました。

(この時点でのraimei10130のSolve数:0)

開発(初期)

ローカルで動く監視ツールでも良かったのですがその時の僕が
何を考えたのかはわかりませんがHTMLでやろう、JS(CoffeeScript)でやろう
という気分になっていました。おそらくその背景にはサーバ借りたくない
気持ちが強かったのだと思います。結果的にそれがいい方向に転がったと思います。
HTML+JS(Coffee)でやってdropboxのpublicフォルダでホスティングしようと
考えていましたが、ちょうどその時期にGithub Pagesの存在を知ったので
そちらでやることにしました。
いろいろやることが決まったのでもりもり開発を始めました。
当時あまりJS(Coffee)を書いたことがなかった僕はコールバック地獄にはまりながらも
ajaxAPIにアクセスしてSolve数を取得できるようになりました。
aoj_watch(ソースコードめちゃくちゃ)はかなり初期に作られています。

(この時点でのraimei10130のSolve数:0)

開発(中期)

いろいろできることが見えてきたので部内だけのsubmit一覧とか作れると
面白いかなと思い作ることを決意します。この時期くらいまでリファクタリングなど
完全に無視して突っ走っています。完璧にやばいです。
そんな完璧にやばい状況でもaoj_submit_watchは完成します。
複数ユーザの情報取得なんていうAPIは存在しなくて一人ずつ情報を取得して
クライアント側でマージするという処理を行っているのでAPIアクセスが多く
非常に重いページに仕上がっています。
この頃はユーザの追加がかなりだるかったのを覚えています。

(この時点でのraimei10130のSolve数:0)

開発(今まで)

中期を超えたあたりからAOJのdiffを取るツールがほしいと
後輩から言われていたし自分も欲しかったので 次作るのはdiffツールだと決めていました。
AOJのdiffを取るツールがあるのは知っていましたが、
学内からだとブロックされたり、レスポンスタイムアウトしたりなど
まともに使えた記憶がありませんでした。
3つ目のツールを作るときにさすがにリファクタリングをしようということで
勉強してコールバック地獄から抜けだしたり、クラス化を行ったりしました。
このリファクタリングしている時に、seka先輩にaoj_submit_watchの高速化を
やってもらい、その際にgruntでいろんな作業を自動化してもらいました。
本当に感謝しています。ありがとうございました!!!!!!!!!!!!
リファクタリングに結構時間がかかりましたが最後のaoj_compareが出来上がりました。
ぶっちゃけどのAOJ watch toolsより反響が大きく、びっくりしました。
これ以降は細かい機能追加などを今日まで行って来た次第です。
これまでorisano.github.ioにpullreqをくれた、
たいちゃん@imishinistとくまさん@higumachan725、seka先輩
本当にありがとうございました。これからもpullreqくださいお願いします。

(この時点でのraimei10130のSolve数:9)

作って思ったこと

AOJ watch toolsを作って公開してみて思ったことがあります。
それは可視化が重要ということです。これは僕自身の話なのですが
aoj_watchを作って自分のsolve数を見るようになって、
m_kyoujyuやli_saku先輩を越してやろうという具体的な目標を持つようになりました。
具体的な目標を持つことで開発当時100問解いていたかすら
怪しかった僕が376問までになり、ICT委員会の中で2位まで上り詰めました。
可視化、具体的な目標、それを効率的に達成するためツールがあると
切磋琢磨しやすくなると僕は考えています。AOJ watch toolsで
ICT委員会の競技勢の実力が上がると非常に嬉しいです。

(この時点でのraimei10130のSolve数:9)

最後に

全国のICT委員会でもこんなシステムを導入してみるといいかもしれません。
僕のGithub Pagesをcloneして、users.jsonを書き換えると
どこの組織でも使えると思います。役に立てると幸いです。
最後に言いたいのは

raimei10130が1日1問解いてたら360問くらいなはずなので頑張って問題解いてください!

明日はみずきちさんの記事だと思います。