この記事はフィードフォースエンジニア Advent Calendar 2015 - Adventar13日目です
昨日、12日目は 今年ソーシャルPLUSで捨てられた技術たち | feedforce Engineers' blog でした!
#自己紹介
ドーモ、社内ニンジャスレイヤー推進おじさんのかせいさんです
普段はアプリケーションエンジニアとして、Railsアプリの運用、改善を進めております
#今日は何話すの?
heroku+S3で動作する遅延証明書クローラーを作ったので、それの技術的要素についてのお話をします
遅延証明クローラー?
小田急線の遅延証明書のページは過去1週間分しか残しておらず、月末にまとめて印刷しようとすると困ったことになるので、定期的にクローリングしてS3に保存してくれるスクリプトを作ってみました
クロールした後、こんな感じにクロールした結果の一覧を生成してくれます
(リンクをクリックすると、遅延証明のスクリーンショットが表示される仕様です)
コードはこちら → https://github.com/kasei-san/delay_certificates
どんな仕様なの?
- 小田急線の遅延証明書のページを定期的にクローリングすること
- 小田急線以外も簡単に追加できること
- クローリングした結果を保存して、簡単に見れること
- なるたけ金銭的なコストは掛けたくない
技術的要素
上記を考慮した結果、こんなかんじになりました
- 遅延証明書は PhantomJS でスクリーンショットを取る
- HTMLのままだとcssとか画像の保持など考える事が多いので、
- Heroku で動作させる (無料なので)
- スクリーンショットの格納先は AmazonS3 (安いので)
以下、技術的要素で自分がハマった所や知らなかった所をご紹介します
遅延証明書はPhantomJSでスクリーンショットを取る
Selenium を使えば簡単にできます
こんなかんじ
driver = Selenium::WebDriver.for(:phantomjs)
driver.get("http://www.google.co.jp/)
driver.save_screenshot(File.join("./google.png"))
こんな風に取れます(画面サイズなどはデフォルトのまま)
Herokuで動作させる
Herokuで動作させるにあたって、いくつか課題がありました
- HerokuでPhantomJSを動かす
- Herokuで単純なrubyスクリプトを定期的に実行させる
HerokuでPhantomJSを動かす
Herokuのサーバには、標準でPhantomJSは入っていないので、インストールする必要があります
PhantomJSのbuildpackを追加する
Herokuにはbuildpacksという、あらかじめビルドされたバイナリパッケージのコンテナがあります
普通は、こんな感じに使用する言語のbuildpackを指定するのですが...
heroku create myapp --buildpack heroku/python
PhantomJSのbuildpackもあるので、rubyとPhantomJSそれぞれをインストールしなければなりません
複数のbuildpackをHerokuに入れたい
heroku-buildpack-multiを使う旨を宣言する
heroku buildpacks:set https://github.com/ddollar/heroku-buildpack-multi.git
.buildpacks ファイルに、インストールしたいbuildpackを記述する
https://github.com/heroku/heroku-buildpack-ruby
https://github.com/stomita/heroku-buildpack-phantomjs
あとは普通に git push heroku master
すればrubyとPhantomJSがインストールされます。簡単!
スクリーンショットが文字化けする!!
Herokuのサーバには日本語フォントがないらしく、PhantomJSで日本語のページのスクリーンショットを取ると文字化けします
そのため、.fonts
ディレクトリを用意して日本語フォントを置いてあげる必要があります
Herokuで単純なrubyスクリプトを定期的に実行させる
こちらについては別記事にまとめたので、そちらをご参照下さい
感想
HerokuではRails以外を動かしたことが、いままで無かったので色々わからない所が多かったのですが、いざやってみると色々な事が(無料で!)できるのだなぁと思いました
今まで、趣味でアプリを作るならwebサービスだろ! などと息巻いておりましたが、それにこだわらず、日々の不便を解消するようなスクリプトを作るのも中々楽しかったです
みなさんもよろしかったら、Heroku+S3で便利スクリプトライフを是非!
明日、14日目は koshigoeさんのGraphQL話です!