自分だけのするめぼっとを作ろう!

元イベント:http://partake.in/events/3fcea6d7-0bab-4597-82db-86439aadb1b9

この記事はCompetitive Programming Advent Calendar Div2012の 5 日目の記事です

去年に続いてなんか自分がつくったものを書きます!
とりあえず今回はするめぼっとについてかきます!
これ作ったの 2010 年 の 5 月ぐらいなんだなぁ(しみじみ)

するめぼっととは

TopcoderSRM の時間を通知するぼっとです!

するめがあったー (tc_srm_jp_bot) on Twitter
https://twitter.com/tc_srm_jp_bot

詳しくは書きのサイトを!

tc_srm_jp_bot - nise_nabeのサイト
https://sites.google.com/site/nisenabe/tc_srm_jp_bot

必要なもの!

git だ!
java だ!
ant だ!

appengine で動かす準備をしよう!

Google App Engine で動かしてます!
作成当時タダで使えて 1 分毎に更新処理ができるみたいな感じだったような.
今でも 1 分毎の cron が動かせるようなところってそんなにないような [要出典]

Downloads - Google App EngineGoogle Developers
https://developers.google.com/appengine/downloads?hl=ja

とりあえずダウンロードして置いときます!
/tmp とかでいいんじゃね.(win は知らない)

$ cd /tmp
$ wget http://googleappengine.googlecode.com/files/appengine-java-sdk-1.7.3.zip
$ unzip appengine-java-sdk-1.7.3.zip

するめぼっとを動かす準備をしよう!

ソースを取得してきます!

$ cd /tmp
$ git clone https://github.com/nise-nabe/SRMNotifier.git
$ cd SRMNotifier
$ cp src/twitter4j.properties.sample src/twitter4j.properties
$ cp war/WEB-INF/appengine-web.xml.sample war/WEB-INF/appengine-web.xml
$ cp build.properties.sample build.properties

ビルドの準備をしよう!
ダウンロードしてきた appengine のバスを指定します!

$ vim build.properties
sdk.dir=/tmp/appengine-java-sdk-1.7.3


ついったーの API を使う準備をしよう!

詳しいことはいろんなところに譲る!

My applications | Twitter Developers
https://dev.twitter.com/apps

なんか consumer key とかいろいろ取ってきます(割愛)

$ cp src/twitter4j.properties.sample src/twitter4j.properties
$ vim src/twitter4j.properties
oauth.consumerKey=hoge
oauth.consumerSecret=hoge
oauth.accessToken=hoge
oauth.accessTokenSecret=hoge

app-engine を使う準備をしよう!

アプリケーションを作ります!(実際に作ったのは数年前なので今ので動くのかは確認してない)

Create an Application
https://appengine.google.com/start/createapp

ここの Application Identifier を下記ファイルの hogehoge のところにいれます.
version はテキトーでいいです.

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
        <application>hogehoge</application>
        <version>7</version>

        <!-- Configure java.util.logging -->
        <system-properties>
                <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
        </system-properties>
        <threadsafe>true</threadsafe>
</appengine-web-app>

念のためテストを動かそう!

パーサのテストを書いてます!本物のページをそのまま保存してるファイルを使っています!

$ ant test

ローカルで動かそう!

$ ant runserver

データベースを更新する!
http://localhost:8080/updater

アクセスした瞬間に通知する必要がある時通知する!(SRM やってない時間だと何もしないと思う)
http://localhost:8080/notifier

本番環境にデプロイしよう!

メモ · nise-nabe/SRMNotifier Wiki
https://github.com/nise-nabe/SRMNotifier/wiki/%E3%83%A1%E3%83%A2

ここの手順のアップデートのようにしましょう!

$ appcfg.sh update war

なにかがおかしい!?

なんとか頑張ってください!

自分で作る!

日本語以外で通知する!

$ vim src/notifier/SRMNotifierServlet.java
 27   private static final String[] msgs = { "開始24時間前です", "開始12時間前です",
 28     "登録を開始しました", "開始1時間前です", "開始30分前です", "開始15分前です", "開始5分前です",
 29     "Coding Phase を開始しました", "Coding Phase を終了しました",
 30     "Challenge Phase を開始しました", "終了しました" };

通知時間を変更する!

$ vim src/notifier/SRMNotifierServlet.java
 31   private static final long[] dates = { -toLong(24, 60), -toLong(12, 60),
 32     -toLong(3, 60), -toLong(1, 60), -toLong(1, 30), -toLong(1, 15),
 33     -toLong(1, 5), 0, toLong(1, 75), toLong(1, 80), toLong(1, 95) };

通知する時間を日本以外にする! Locale.JAPAN を別のやつにしてフォーマット書き換えよう!

$ vim src/notifier/parser/SRMCalendarParser.java
 29     format = new SimpleDateFormat("yyyy年MM月dd日(E) HH時mm分", Locale.JAPAN);

余談

作った時は「あるだろう」と思って探したらなかったのでとりあえず作った感じ.
最初の方は SRM のほうが不安定で実施時間と全然違ったり(今でもたまにそうか)ひやひやしてたけどまあ自分用だしいいやと割り切った.
あとたまに Google App Engine のほうが落ちたりしてたので(こちらは開催時間外だったのでよかったような)
するめというのはりんごさんがするめするめ言ってた時期に作ったからだった気がする
アプリ名とか名前とか統一感がないのはわざとです(キリッ
画像は手書きです

蛇足

ホントはいろんなところからかき集めてきた情報を使ったカレンダーを出すつもりで実装してたけど公開まで間に合わなかったのでごめんなさい
この記事はバタバタ書いた.
米画面はイメージです

Twitpic - Share photos and videos on Twitter
https://twitpic.com/aw71vs/full