合法ラーメンbotをモジュール化した
去年思いつきで「本年度の合法ラーメンは全て終了しました」って
スクリプトを書き換えたら、戻すのを忘れて
年明けでも表示されてしまうという悲劇的なバグがあった。
相変わらず自分のmacで動かしているので、これを期にいろいろ修正した。
やりたかったこと
- モジュール化する
- 依存モジュールをcartonで管理する
- テストを書く
- サクラのレンタル鯖で動かす
モジュール化する
Minillaを使ってプロジェクトのひな形を作った。
$ minil new Gouhou
コレ実行するだけで作ってくれて楽ちん。
スタンダードなディレクトリ構成とか調べだすと、その時点でモチベーション下がってくるので
こういうありがたいものは積極的に使っていくスタイルのが良い。
依存モジュールをcartonで管理する
Cartonをイチから使ったことなかったので勉強なった。
モジュールの一元管理は良いものだ。使わない理由ない。
テストを書く
とりあえずザックリ書いたけど、例外系はまったくやってない・・・
あと、外部APIに依存する部分はテスト難しい。ライブラリを上書きすれば
Twitterに依存せず出来るけど、意味あるの?って気がするしなぁ。。
そして修正して戻し忘れるのはテストでカバーできないので運用の事故。
set_fixed_timeでハマった
Test::MockTimeは実行時間を固定してくれる便利なテストモジュール
こんな感じに使った。
my $t = Time::Piece->strptime('2014/1/1 00:00:00', '%Y/%m/%d %H:%M:%S'); set_fixed_time($t->epoch);
が、これやると、9時間ズレた値で固定される。
原因はタイムゾーンの設定。
→本当は「Asia/Tokyo」になってて欲しかった。
- $t->epochはUTCでset_fixed_timeに渡される。
→UTCのまま設定されちゃうので当然テスト通らない。
解決
my $t = localtime(Time::Piece->strptime('2014/1/1 00:00:00', '%Y/%m/%d %H:%M:%S')); set_fixed_time($t->epoch);
$tにタイムゾーンを付ければOK
その他
時間系のメソッドの整理
time: 1970年1月1日 0:00からの経過秒数
localtime: 経過秒数から年や月を配列で返してくれる便利メソッド
Time::Piece::localtime:
use Time::Pieceすると、localtimeはオーバーライドされて、Time::Pieceのオブジェクトが返るようになる。
サクラのレンタル鯖で動かす
READMEにやりかたをメモしたおかげですんなりできた。
crontabに設定するスクリプトとかConfig::Pitのスクリプトとか
修正するとコンフリクトするのが課題だ。
一度設定したらもういらないので、雑にcheckoutで戻したけどアカン奴な気がする。