Pythonista for iOS で Nowplaying する

image

Apple Music で今聴いている曲をTwitterで共有する場合の定型文みたいなやつがちょっとダサい

以前はサードパーティ製アプリを使って今聴いている曲をツイートしていたのですが、使用する場合そのアプリをいちいち起動させなくてはならなくて使い勝手がイマイチなのでPythonista for iOSでスクリプトを書いてみました

そもそものPythonista for iOSに関してはこちらの記事がとても詳しいです。


このスクリプトをPythonistaのDocumentsなどの適当なフォルダに保存して共有時に呼び出せるようにします。

image

「曲を共有」ボタンを押すと「Run Pythonista script」が出てきます

image

「Run Pythonista script」を押すとNowplayingのアイコンが出てくるのでそれを押します(前もってスクリプトのショートカット登録をしてあります)

image

ツイート文が表示されるのでDoneを押してツイートします

image

こんな感じでちょっとしたPythonスクリプトが動くのが嬉しいです(いつストアから削除されてもおかしくないような気もしますが(;一_一))


参考サイト

2016.10.05 追記
iOS10になってMusicアプリの共有メニューからPythonistaのスクリプトが呼び出せなくなってしまったようなので通知センターにスクリプトを登録しました。
Pythonista for iOS のスクリプトを通知センターに登録する | aoshiman.org
追記ここまで


[Python][Twilio]特定の件名のメールを受信したら電話をコールさせる

タイトルの通りですが、特定の件名のメールを受信したら電話をコールさせたくてimaplibとtwilio-pythonを使って実装しました。

用途的には子供の習い事などで利用するバスの到着通知メールをうっかり見逃さないようにすることなのですが、もしかしたらサーバの障害通知などにも利用できるかもしれません(やらないけど)。リポジトリを貼っておくのでご参考にどうぞです。



前準備として以下のものを用意

  • Twilioのアカウントを取得して(発信元になる)電話番号を取得、アカウント作成によって生成されたAPIトークンを使用
  • あらかじめ特定の件名のメールを受信したら専用のラベルを貼るようにしておく(GmailやGoogle Appsを使用することが前提です)


処理の流れ

  1. Google Appsのメールボックスにimaplibでログインする
  2. 専用のラベル(ボックス)にメールがあるかどうかチェック
  3. メールがない場合はなにもしない
  4. メールがあり、且つタイトルが特定の件名と一致した場合、日付をチェックして今日のメールだったらあらかじめ設定してある電話番号に電話をかける、ついでにそのメールからラベルをはがす

2~4の処理を無限ループで実行し、15秒程のスリープを挟んでいます。スクリプトのデーモン化にはUpstartを使用


Twilioの運用ポイント

Twilioでコールする場合、本来はコール後に電話を取ってもらい音声案内等の処理に繋げていくものですが、今回はコールすることが目的で電話を取る必要はない。

なのでtimeoutパラメータの数値を低く設定して数コールで切れるようにしています。

Twilio Docs: Make outgoing phone calls with Twilio's REST API

実際のコードだとこんな感じ

def makecall(sid, secret, target, from_, url, timeout=10):
    try:
        client = TwilioRestClient(sid, secret)
        call = client.calls.create(
                to=target,
                from_=from_,
                url=url,
                timeout=timeout
                )

        log.info(call.sid)

    except TwilioRestException as e:
        log.exception(e)

因みに、コールするだけの場合、Twilioは料金が発生しないので電話番号の維持費だけで運用することが可能です(のはず)

通話が成立しない場合料金はかかりますか? : Twilio for KDDI Web Communications


また、自宅の電話にはTwilioの番号を登録し、読み仮名に「バスガトウチャクシマス」などと登録しています。するとその番号から電話がかかってくると読み上げてくれるので、より注意を引くことが出来ます


今後の課題

今はもともと借りていた某OpenVZなVPSで動かしているので、AWS Lambdaで同じようなことが出来るか調べようと思っています


参考にさせていただいたサイト


[kindle]スマートPythonプログラミングを買った


いつも参考にしているPython関連のブログの作者さんがPython本を出版していました。

入門書の次に読む本をコンセプトに..とのことですが、独学でなんとか中級入り口までたどり着いたけど、書き方がこれでいいのかわからん、テスト書けよって言われるけどよくわかってないみたいに足踏みしている人(私もそうです)にぴったりな本なのではと思いました。

一通り読んだだけで、これから写経しながら読みなおすのですが、この本が理解できれば一段上のステージに上がれそうな気がして勇気が出ました。もみじあめ(@momijiame)さん、素晴らしい本を出してくれてありがとうございます!


[Shizuoka]狩猟免許(わな猟)試験に合格した

image

2月下旬に狩猟免許試験(わな猟)を受験し、先日合格通知が届きました。

受験した理由は田舎で暮らしている人ならわかると思うのですが、とにかく獣害が酷いのでなんとか対策をしたいということです。鉄砲の免許ではないので止め刺しは出来ないけれど、箱罠の手伝いくらいは出来るだろうと(免状だけ持っていても駄目で狩猟者登録やその他諸々の手続きは必要ですが)。

(注)下記内容はあくまでも静岡県の今回の試験における対策です。他県や静岡県の次回以降の試験対策には合わないかもしれません。

試験についてですが、知識試験、適性試験、技能試験の三種類あって、正直対策さえしていればそうそう不合格になることはないと思います。が、全く何もしないで合格できるほど甘くはありません。
どのように試験対策をすればよいのか?ですが、一番の近道は試験の数ヶ月前に実施する猟友会主催の予備講習会に参加することです。

第2回狩猟免許試験のための 予備講習会のお知らせ ( 静岡県 ) - 一般社団法人 静岡県猟友会 - Yahoo!ブログ

この講習会は有料で一日がかりですが、過去問題集を貰えたり、罠の仕掛け方などの実技講習を行ってくれます。知識試験はほぼこの問題集から出るので必ずやったほうがよいと思います。

あと狩猟鳥獣の判定という、鳥獣の書いてある絵を見てその鳥獣が狩猟可能か(狩猟可能だったら名称も)の判定をする問題があって、これは結構難しいので鳥獣カードを自作して暇さえあれば何度も繰り返し覚えていました(イタチのオス(狩猟可)とイタチのメス(狩猟不可)の判定は最難門)。

image

あと、実技試験で罠の仕掛け方の問題があるのですが、これも予備講習会で勉強出来ます(そして同じ罠が試験に出るはずです)。私は予備講習会で使用した罠のメーカーと名称を確認してメーカーが仕掛け方の動画をyoutubeにアップしてあるのを発見したので、それを暇さえあればチェックしてました。



これで今年の目標をひとつクリアしましたので嬉しいというかホッとしています(周囲に言いふらしていたので。。)。



Frozen-Flask で build 後にHTTPサーバを実行させる

Frozen-Flaskで静的ファイルの生成を実施する場合、このようなスクリプトファイルを作って実行します

# freeze.py
from flask_frozen import Freezer
from app import app

freezer = Freezer(app)

if __name__ == '__main__':
    freezer.freeze()
実行するとbuildというフォルダが作成され、静的ファイル群はその中に生成されます。本番サーバにデプロイする場合は、build内のファイル郡をドキュメントルート等にアップロードします。
デプロイする前に生成された静的ファイルを確認する場合、今までは

$ cd build
$ python -m http.server
などとしていたのですが、freezer.run() を使えば、ビルド後にHTTPサーバ(実態はwerkzeugだと思う)が起動されることがドキュメントに書いてありました。

Frozen-Flask — Frozen-Flask 0.12 documentation

なので今は、引数なしfreeze.pyでビルド、 引数run付きで ビルド後にHTTPサーバ起動というようにしています。

import sys
from flask_frozen import Freezer
from app import app

freezer = Freezer(app)

if __name__ == '__main__':
    if len(sys.argv) > 1 and sys.argv[1] == "run":
        freezer.run(debug=True)
    else:
        freezer.freeze()

CMSやブログ的にFlaskを使っているならば、Frozen-Flaskはオススメです。また、静的サイトジェネレーター的に使う場合は下記サイトが参考になります。

Dead easy yet powerful static website generator with Flask | Code | Nicolas Perriault

PAGE TOP