oinume journal

Scratchpad of what I learned

2015年振り返り

2015年はざっくり言うとこんな感じだったと思う。

  • 2014年の夏から作り続けていたサービスが3月にローンチできた
  • 英語の勉強を本格的に始めた
  • 2年ぶりに趣味プロダクトを作った(dmm-eikaiwa-tsc)
  • 初心に帰ってアルゴリズムの勉強を始めた(algo)

一方で、掲げていた抱負を全部ちゃんと達成できたかというと微妙な結果だった。達成できなかった分は2016年に持ち越しかなぁ。

  • Dockerを実戦投入する
    • 手付かず...
  • アルゴリズムを深く理解する
    • algoという初歩的なアルゴリズムやデータ構造を実装し始めたけど、もともと考えていたB+Treeの実装とかそのレベルには至っていない
  • 機械学習とか自然言語処理勉強する
    • 手付かず...
  • 英語でブログエントリーを書く割合を25%にしてみる
    • これは唯一達成できた目標。30記事に対して12個を英語で書いたので40%

2015年に使った技術

仕事では正直特に新しいことには取り組んでいない。MySQLの代わりにAuroraを検証し始めたぐらいか。プライベートだと以下ぐらいしか思いつかない。

  • Heroku
  • Python 3.5のType hints
  • gb
  • CircleCI

英語

きっかけは「英語でもっとアウトプットしないと」という悲壮感からだったけど、夏ぐらいから本格的に英語の勉強を始めた。DMM英会話を数日やってみて、色んな国の先生と話すうちにその国のことを学んだりしてすごい面白かったので4ヶ月経った今でも継続してる。自分の英語の勉強方法はこんな感じ。

  • DMM英会話を週3,4回
  • 英語のPodcastを聴く
    • ChangelogTalk Python To Meを聴いてる。Talk Python To MeはTranscriptが無料で公開されているのと、requestsなどの超有名ライブラリを開発している人がゲスト出演していたりするのでマジでオススメ
  • 以下のような本で文法と単語をインプットする

毎日の英文法 頭の中に「英語のパターン」をつくる

毎日の英文法 頭の中に「英語のパターン」をつくる

毎日の英単語 日常頻出語の90%をマスターする

毎日の英単語 日常頻出語の90%をマスターする

結果として

  • カンファレンスの海外のスピーカーになんとか英語で質問できるぐらいの度胸と英語力はついた
  • 英語オンリーのランチで、なんとか言っている意味は理解して簡単な受け答えはできるようになった
  • 外人にもTwitterで絡めるようになった
  • 英語のPodcastも7割ぐらい話している英語は聞き取れるようになってきた(意味はもちろん全てはわからない)

その他

  • 子供が1歳8ヶ月になったけど、特に大きな病気をすることもなくスクスクと育っていて大変嬉しい。もうすぐ喋れそうでこれからもっと楽しくなりそう
  • 妻が仕事に復帰したけど特に大きな問題もなく生活できてる(たぶん...)
  • 通っている認証保育園の先生が本当にいい人たち過ぎて転園したくない
  • 猫のししまるが相変わらずかわいい
  • 住宅ローンを頑張ってけっこう返済した
  • 家で酒をほとんど飲まなくなった

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などのライブラリ・フレームワークを使わないで実装したけど、会社だけでコードを書いているといかに自分がフレームワークやライブラリに依存したコードしか書けないかを思い知らされて良かったです。