hama_duのブログ

ノンジャンル記事置き場

TopCoderの学習記録アプリ「するめダイアリー」を作った

最近競技プログラミングにハマりまして、本家ブログの更新ができずにいました。
半年以上ぶりの更新です。

TopCoder部のブログには既に書いた*1のですが、Google App Engineを用いて
TopCoderの学習記録アプリを作りました。
本エントリは制作物の簡単な紹介と、メイキングの解説記事になります。

http://srm-diary.appspot.com/

TopCoder*2って?

オンラインで参加できるプログラミング大会の一種で、

  • 制限時間内に解法が決まっている問題を3つ解く「Single Round Match(略してSRM)」
  • ヒューリスティクスな解法が要求される、二週間の長丁場「Marathon Match(略してMM)」

などの種目があります。アメリカのラスベガスで世界大会*3も開催されてたりします。
SRMは月二回、MMは月一回ぐらいのペースであります。

これは何をするものか?

SRMの問題を公式サイト*4からクロールしてデータベースにためておき、
問題の難易度、カテゴリごとに検索できるようにしました。
そして、「解いた問題」「解いてない問題」をコードと一緒に記録できます。
さらに、解いた問題をブログ形式に書き出せるようにしました。

以下のスクリーンショットを見ていただければ雰囲気は分かっていただけるかと。

どうやって作ったの?

URLから分かるように、Google App Engine(Python版)をつかいました。
Google App Engine用のPythonフレームワークとして、tipfy*5を使ってます。
tipfyは気軽に使えてオススメですが、日本語の解説記事があまり無いので
次回エントリで簡単なチュートリアルを書きたいと思います。

エディタはTextMate*6を使いました。(MacBookで開発してます)
有料ですがEclipseより軽いし多機能だし便利です。

感想

楽だった点

GAEでの開発だったので、

  • ボタン一発で本番環境にデプロイできる
  • データベースの管理ツールが用意されている

点が良かったです。

苦労した点

Python版に限らないのですが、データベース周りの制限がきついです。
例えば、

  • クエリにOR、JOINが使えない
  • 一度に取って来れるデータは1000件まで
  • 条件によってはソートが効かない

などなど。
なので、一度個別に取ってきたデータをつなげてORを無理矢理実装したり、
わざとテーブルを非正規化してJOINを使わなくてすむようにしたりしました。

詳しい開発の話

長くなるのでまた後程。

まとめ

みんなTopCoderに参加すればいいと思うよ。
そしてするめダイアリーへの登録も忘れずに!

*1:http://topcoder.g.hatena.ne.jp/hama_DU/20101118

*2:http://www.topcoder.com/

*3:http://www.topcoder.com/tco10

*4:http://www.topcoder.com/tc?module=ProblemArchive

*5:http://www.tipfy.org/

*6:http://macromates.com/