概要
jupyter notebookで時間がかかる作業をする場合、終わるまで別の作業をすると思いますが、
そちらの作業に没頭してしまい、元の作業が終わっていたことに気づかないことがよくあります
対処法として通知を飛ばしたくなると思います。現時点で僕が一番いいと思った方法をまとめます
通知の要件
同じ悩みを持つ人はたくさんいるので様々なpipのpluginが公開されています。いろいろpipを漁ったのですが、結論を先にいうとslackのwebhook apiをそのまま叩くのが一番シンプルでよさそうということになりました
通知の要件としてはデスクトップ通知で画面に割り込んでくれたり、スマホが振動したりするのが分かりやすくて良いです。slackであれば自分にメンションを飛ばせば通知が飛ぶのでシンプルに実現できます
(notify_runというweb pushを使うライブラリがあるのですが、PCとスマホの両方に通知を飛ばすのはslackを使ったほうが楽です)
(slackのアカウントが無い人は自分用に適当に作ってください。無料アカウントが使えます)
slackのwebhookの有効化
下記の公式ページに従って有効化してください
https://api.slack.com/incoming-webhooks
jupyterでの準備
jupyterの上の方のセルで関数を定義しておきます
webhook urlはPOST通信で叩きます。HTTPアクセスを行うのに、デフォルトで入っていることの多いrequestsプラグインを使うのでインポートします
(aws sagemakerのjupyter環境にはデフォルトで入っていました)
(もしrequestsプラグインが入っていなければpip install requestsしてください)
import requests
def slack_notify(msg = 'おわったよ'):
slack_user_id = '<あなたのアカウントのuser_id>'
slack_webhook_url = '<先程設定したwebhookのurl>'
requests.post(slack_webhook_url, json={"text":f"<@{slack_user_id}> {msg}"})
(slackwebというラッパーライブラリがあるのですが、上記を書くのと変わんないのと、pip installをする手間が面倒なので使いません)
user_idの調べ方は下記記事を参照してください
https://qiita.com/ryo-yamaoka/items/7677ee4486cf395ce9bc
通知を送りたい処理で関数を呼び出す
重い処理の最後で先程定義した関数を呼べば通知されます
なんか重い処理
slack_notify()
いちおう文字列を与えるとメンション内容が変わるようになっています
なんか重い処理
slack_notify('データのダウンロードが終わった')
当然ですが、関数定義のjupyterのセルを実行しておくのを忘れると、関数が未定義でエラーになります
それが嫌な人は上記のセルの中身をまとめて各呼び出し側に書くことになると思います