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

itochin2の日記(仮)

主に備忘録。Perl、MySQL、Unity、開発管理などについて情報を残していきたい。

合法ラーメンbotをモジュール化した

perl

去年思いつきで「本年度の合法ラーメンは全て終了しました」って
スクリプトを書き換えたら、戻すのを忘れて
年明けでも表示されてしまうという悲劇的なバグがあった。

相変わらず自分の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で戻したけどアカン奴な気がする。

gitに上げました

https://github.com/ayumu83s/Gouhou