oinume journal

Scratchpad of what I learned

Heroku Schedulerやcronが正常に稼働しているかをチェックするDead Man's Snitchが便利

これはHeroku Advent Calendar 2015 21日の記事です。今回はHeroku Schedulerを監視するDead Man's Snitchというものを紹介します。

Heroku Schedulerってなに?

Heroku上で特定のスクリプトやコマンドを動かすcronみたいなもの。「みたいなもの」というのは、cronと違って「何時何分に実行する」というような厳密な時間指定ができず、10分、1時間、1日単位でしか指定ができません。イメージとしては以下のような感じ。

Heroku Scheduler setting

ただ、このような要件でも十分であれば、無料のDynoでも利用できるのがメリットだと思います。

Dead Man's Snitchでコマンドが正常に稼働しているかチェックする

Heroku Schedulerで動かしているコマンドが正常に稼働しているかをチェックすることができないか?と思って調べていたらこのDead Man's Snitchに行き着きました。原理としては

  1. Heroku Schedulerにyour_command.sh && curl https://nosnch.in/<hash>のようにコマンドを登録しておき、your_command.shが成功した時にcurlで成功したということをDead Man's Snitchに送信する(チェックイン)
  2. Dead Man's Snitch側では、1時間の間隔(*1)でちゃんとコマンドが成功しチェックインされたかどうかをチェック
  3. もし1時間以上チェックインしていなければ、指定したメールアドレスにアラートメールが送信される

という流れです。チェックインをチェックする間隔は1日, 1週間などの間隔が設定可能で、有料プランだと15分、30分の間隔もできるようです。

ちなみにチェックインされていない場合に送られてくるアラートメールはこんな感じ。

Hi <app>,

FYI "<app>" doesn't seem to be working.

Last healthy check-in: about 8 hours ago (16 Dec 16:13 UTC)

You might want to check it out:

https://deadmanssnitch.com/snitches/<hash>

Would you like to pause your snitch?

https://deadmanssnitch.com/snitches/<hash>/pause

Kind regards,

Dead Man's Snitch

なおこのDead Man's Snitchは特定のURLにGETでアクセスするだけのシンプルな仕組みなので、Heroku Schedulerだけではなくcronでも使えます。もちろんcurlからではなくプログラムのコードからでも呼び出せます。

まとめ

Heroku Schedulerやcronの死活監視に使えるDead Man's Snitchというサービスを紹介しました。データーベースのデータをバックアップするような重要なスクリプトにDead Man's Snitchによる死活監視を入れておくとスクリプトが動作していないことにすぐ気付けるのでオススメです。

dmm-eikaiwa-tscにバグ

以前紹介したDMM英会話でお気に入りの先生の空きレッスンが登録されたらメールで通知するヤツにバグがあったので、使っている人がいたらアップデートお願いします。

バグの内容はレッスン講師のスケジュール表に「休講」というステータスが出現したため、スケジュール表のスクレイピングに失敗して、Heroku Schedulerで動いているアプリケーションがエラーで止まるというものです。詳細は以下を参照してもらえればと。

bin/fetcher aborts with "Unknown schedule text:休講" · Issue #25 · oinume/dmm-eikaiwa-tsc · GitHub

今Herokuで動いているアプリについてはアップデート方法をREADMEにまとめておきました。簡単に言うとdmm-eikaiwa-tscリポジトリgit cloneしてgit push heroku masterする感じです。

ボタンワンクリックでHerokuにディプロイできるようにはしてあるのですが、このようなアップデートをいかに簡単にディプロイするかは課題ですね...

Parsing MySQL's URL in Python3

Just add urllib.parse.uses_netloc.append("mysql") if you want to parse URL such as mysql://root:pass@localhost/demo.

#!/usr/bin/env python

import urllib.parse
urllib.parse.uses_netloc.append("mysql")

if __name__ == "__main__":
    url_str = "mysql://root:pass@localhost/demo"
    url = urllib.parse.urlparse(url_str)
    print("URL={0}".format(url_str))
    print("host={0}, user={1}, password={2}, database={3}".format(
        url.hostname, url.username, url.password, url.path[1:]))
$ python3 url_parse.python
URL=mysql://root:pass@localhost/demo
host=localhost, user=root, password=pass, database=demo

DMM英会話でお気に入りの先生の空きレッスンが登録されたらメールで通知するヤツ作った

2016/11/25追記

後継のlekcijeというサービスを作ったのでぜひこちらをご利用下さい。

www.lekcije.com

動機

  • どのSkype英会話でもそうだと思うんだけど、人気のある先生はすぐ予約が埋まっちゃう
  • でもスケジュールをいちいち検索してチェックするのはダルい

というわけで作りました。

使った技術

github.com

ソースコードは↑。"Deploy to Heroku" buttonをつけておいたので、Herokuアカウントがあれば誰でもこのアプリケーションを使うことができる。やり方はREADMEを見てもらえればと。

概要

  • Heroku Schedulerで10分おきにお気に入りの先生のスケジュールのページをスクレイピング
  • 前回のスケジュール(DB)と今回スクレイピングしたスケジュールを比較
    • 新しく空きレッスンがある場合はメールで通知
  • スクレイピングしたスケジュールをDBに登録
  • スケジュールをチェックしたい先生のIDを入力する画面を作るのが辛かったので、その辺は環境変数経由でIDを渡すという手抜きな構造
    • 超ヒマになったら画面作りたい

結果

人気の先生の予約がめっちゃ取りやすくなったし、副次的な効果としてキャンセルで空いたレッスンにもすぐ気付けるようになったので、DMM英会話やってる人は使ってみたらいいと思います。

どんどん話すための瞬間英作文トレーニング (CD BOOK)

どんどん話すための瞬間英作文トレーニング (CD BOOK)

余談

これを作り始めてからGitHubに草が生えるようになった。

commits of github.com

今回は小規模だったためORMapperなどのライブラリ・フレームワークを使わないで実装したけど、会社だけでコードを書いているといかに自分がフレームワークやライブラリに依存したコードしか書けないかを思い知らされて良かったです。

まだ3大キャリアSIMで消耗してるの?MVNOのススメ

Docomo iPhone6 + IIJ mioに乗り換えてから3ヶ月ぐらいたったのでその使用感をば。結論から言うと今すぐキャリアSIMやめてMVNOに切り替えた方がいいと思う。

料金が安い

SoftbankからIIJ mioに切り替えてから、月々の利用料金が約半額になった。具体的には、Softbankの時は平均で6000円ぐらいだったのが、今では3000円以下になってる。年で考えると36000円のコストカットになるのでこれはデカい。ちなみに契約しているのはデータ通信量が3GBのミニマムスタートプランに音声通話機能をつけてる。

ちなみにこれは10月の料金明細。

スクリーンショット 2015-11-29 0.34.52

200Kbpsでも意外とイケる

自分はTwitterを見ることが多いんだけど、Twitter、メール、ネットを見るぐらいであれば200kbpsでもそこまでストレスなく見れる。なので必要なとき以外はクーポンをOFFにして200Kbpsの低速回線を使うようにして、3GB/月の通信量でおさまるようにしてる。IIJ mioだとみおぽんというアプリを使うことで簡単にクーポンをON/OFFにして回線速度を切り替えられる。自分はWebエンジニアなので、あえてクーポンをOFFにして200Kbpsの回線で自分が運用しているサイトがストレスなく閲覧できるかもチェックしてる。

あと、iOS向けのGoogle Chromeを使えば、Googleのサーバーから最適化された状態でサイトを閲覧することができるので、低速回線だとSafariよりもブラウジングが快適になる。

さらに余ったデータ通信量は翌月に繰り越せるのもいい。

回線の品質がいい

MVNOなので混雑時つながりにくいことがあるかと思いきやそういうことはなく、Softbankauなどのキャリアの回線と比べても遜色ない気がする。この3ヶ月間で「あ、なんか回線が詰まってるな」と思ったのは3,4回ぐらいだ。

端末

Apple Storeで売っているSIMフリーiPhone6(128GB)は約12万と高いので、じゃんぱらで中古のDoCoMoのiPhone6を7万円で買った。だいたいのMVNOはDoCoMoの回線を使っているので、バカ高いSIMフリー端末じゃなくてもOKっていうのは意外と知られていないっぽい。

まとめ

というわけでまだ3大キャリアSIMで消耗している人は今すぐMVNO SIMに切り替えましょう。このリンクからIIJ mioに申し込むとデータ通信量が2ヶ月間10%増量されます。

IIJ IIJmio SIM 音声通話 パック みおふぉん IM-B043

IIJ IIJmio SIM 音声通話 パック みおふぉん IM-B043