2012-03-04(日) [長年日記]
■ Kindle向けニュース配信システムをHeroku上に移動した
約1年ほど前から稼動していた各種ニュース(といっても現時点では日経新聞とInternet Watchだけ)をKindleに配信するシステムを、自前サーバ上のcronからHeroku上のClockworkに移植して、今日から実用開始した。
Kindle向けにニュースを配信する仕組みとしてはレシピが豊富なCalibreを使うのがメジャーなんだけど、クライアントPCを24H稼動しておくというのが節電が叫ばれるいまどきのソリューションとしてはイマイチと感じていて、長らく自分のサーバで回していたんだけど、もうちょっとPaaS(というかHeroku)を使い慣れておきたいと思っていたので練習台に。
Herokuでcron相当のサービスというとClockworkを使うということらしいので、1時間ごとに起きるように組んで、実際に配信するかどうかの判断は別途させるようにした。clockプロセスひとつでDynoを1個使ってしまうので、UIはなし。セコい(笑)。じゃあ設定はどこから与えるかというと、環境変数で指定したURLから毎回読み込むようにしたのだった。Dropboxにでも入れておけばどこからでも設定変更ができるという塩梅。
Heroku上でmobiファイルを生成させるためにkindlegenをgem化したり、メール送信にActiveMailerを使おうと思ったがRailsじゃなければその下で使っているMailを素で使ったほうが楽だとわかったり。もっとも、一番苦労したのはUTCで動いているHerokuに適切なTZを与えることだったりして(Time#localtimeに引数があるなんて初めて知ったよ)。まぁいろいろ勉強になります。
最初はちゃんとWeb UIをつけて誰でも登録して使えるようにしたら便利じゃね? と思っていたんだけど、人のサイトを勝手にスクレイピングして他人に配信するのはどう考えても違法なのであった。あとSendGridのfreeプランはメール送信数に制限があるし(ので各自で動かさないといけない)。とはいえコードは公開してあるもののドキュメントないから誰も動かせないだろうな(笑)。
こんなふうに自前で生成した「電子書籍」をメールで簡単にリーダーに送れて、それをクラウド上で管理できるというのがKindle最大のメリットで*1、このPersonal Documentサービスが完全におれをKindleにロックインしてしまっているのだよなぁ。他社でもこれ相当のことができないと、何かあったときの移転先に困るんだが。KoboやSONYには類似のサービスないのかな。
*1 少なくとも自分で電子書籍を作成できるギークにとっては、だけど。
clockwork でも良いんですけど cron の置き換えは https://addons.heroku.com/scheduler がオススメです。こっちだとWebとも同居できます。
また新事実だよ……
HerokuのTZ設定は以下のコマンドを利用するという方法もありますね.
$ heroku config:add TZ=Asia/Tokyo
例えば海外旅行中は配信時間を変更したいという場合、タイムゾーンは運用中に(Herokuコマンドなしで)設定できないと困るので、外部の設定ファイルで変更したい要件なのでした。
Heroku Schedulerを見てみたけど、機能的にはまさにcron相当でプロセスをキックしてくれるだけなんだね。状態をオンメモリで引き継ぎたい場合にはClockworkの方が向いているし、今回のアーキテクチャはそれなりに面白いからこのままでいいや、と判断。
READMEつけた。
https://github.com/tdtds/kindlizer-backend#readme