ワーパパエンジニアの学び手帳

ワーパパエンジニアの業務外での学びとかガジェットネタとか

電車の遅延情報をSlackに定期的に通知する(heroku scheduler)

前もrubyで似たようなことやってますが、herokuスケジューラを使ってAPIを定期的に叩いて結果をSlackに通知するというやつ。
朝と帰りに電車の遅延情報を通知したいと思い、今回はpythonでバッチを作りました。

前のやつ↓
us-key-tech.hatenablog.com

コードは↓に置いています。
GitHub - us-key/pushTrainInfoSample

目次

やること

  1. herokuのスケジューラでpythonスクリプトを定期実行
  2. pythonスクリプトで電車の運行情報を取得し整形
  3. 整形した内容をslackで通知

動作環境

以下、pythonはインストール済みの前提で進めていきます。
コマンドはWindows環境のものです。maclinuxの場合は読み替えてください。

手順

プロジェクト作成

> mkdir pushTrainInfoSample
> cd pushTrainInfoSample  
> py -m venv env  
> env/Scripts/activate  

(コマンドプロンプトの場合は/ではなく\ )

コーディング

requestsのインストール

(env) > pip install requests

slackwebのインストール

(env) > pip install slackweb

コードの内容

今回は路線情報のAPIを叩いて運行情報を取る部分と、文字列をSlackに投稿する部分に分けて実装しています。

API叩くコード

# app/trainInfo.py  
import requests  
import json  
  
def request(nameArr):  
    url = 'https://rti-giken.jp/fhc/api/train_tetsudo/delay.json'  
    response = requests.get(  
        url,  
    ).json()  
    flg = False  
    print(response)  
    for name in nameArr:  
        for dic in response:  
            if dic['name'] == name:  
                msg = name + 'の遅延情報があります。'  
                flg = True  
    if not flg:  
        msg = '遅延情報はありません'  
    return msg  

slackに通知するコード

# app/postSlack.py
import slackweb  
import trainInfo  
import configparser  
  
# read ini  
inifile = configparser.ConfigParser()  
inifile.read('conf/config.ini', 'UTF-8')  
  
# webhook url  
url=inifile.get('settings','webhookurl')  
print(url)  
# 確認したい路線(list)  
train=inifile.get('train','lines').split(',')  
print(train)  
  
slack = slackweb.Slack(url=url)  
slack.notify(text=trainInfo.request(train))  

configparserについては後述します。

slackのwebhook URL取得

webhook URL取得については、以前書いた記事を参考に。

設定ファイルの利用

上記のslack通知するコードで登場したconfigparserですが、これを使うと設定ファイルから設定値を取得することができます。
使い方は↓の記事を参考にしました。
www.python-izm.com

今回の設定ファイルの内容はこんな感じ。

# conf/config.ini
[settings]
#slackのWebhook URL
webhookurl=https://hooks.slack.com/services/XXXXXXXX/XXXXXXXX/XXXXXXXXXXXXXXXXXXXXXX

#情報を取得したい路線をカンマ区切りで指定
[train]
lines=AAAA,BBBB,CCCC

webhookurl、linesを書き換えて使います。

ローカルで動作確認

(env) > py app/postSlack.py

slackに通知されればOK!

git管理化

(env) > git init  
(env) > git add .  
(env) > git commit -m "first commit"  

herokuにpush

(env) > heroku create pushtraininfo  
(env) > git push heroku master  

なんかエラー発生

(env) PS C:\Users\yomt0\pythonWorkSpace\pushTrainInfo> git push heroku master  
Counting objects: 1148, done.  
Delta compression using up to 4 threads.  
Compressing objects: 100% (1131/1131), done.  
Writing objects: 100% (1148/1148), 9.20 MiB | 296.00 KiB/s, done.  
Total 1148 (delta 235), reused 0 (delta 0)  
remote: Compressing source files... done.  
remote: Building source:  
remote:  
remote:  !     No default language could be detected for this app.  
remote:                         HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.  
remote:                         See https://devcenter.heroku.com/articles/buildpacks  
remote:  
remote:  !     Push failed  
remote: Verifying deploy...  
remote:  
remote: !       Push rejected to pushtraininfo.  
remote:  
To https://git.heroku.com/pushtraininfo.git  
 ! [remote rejected] master -> master (pre-receive hook declined)  
error: failed to push some refs to 'https://git.heroku.com/pushtraininfo.git'  

herokuへの新規デプロイが久々で今回色々詰まってしまったのですが、ひとまずエラーメッセージにあるURLを参考に、buildpackの設定をします。
Buildpacks | Heroku Dev Center

buildpackの設定

(env) > heroku buildpacks:set heroku/python

再デプロイ

ローカルへのコミットをしたのち、herokuに再度pushします。が、またエラー発生。

(env) PS C:\Users\yomt0\pythonWorkSpace\pushTrainInfo> git push heroku master  
Counting objects: 1148, done.  
Delta compression using up to 4 threads.  
Compressing objects: 100% (1131/1131), done.  
Writing objects: 100% (1148/1148), 9.20 MiB | 316.00 KiB/s, done.  
Total 1148 (delta 235), reused 0 (delta 0)  
remote: Compressing source files... done.  
remote: Building source:  
remote:  
remote: -----> App not compatible with buildpack: https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/python.tgz  
remote:        More info: https://devcenter.heroku.com/articles/buildpacks#detection-failure  
remote:  
remote:  !     Push failed  
remote: Verifying deploy...  
remote:  
remote: !       Push rejected to pushtraininfo.  
remote:  
To https://git.heroku.com/pushtraininfo.git  
 ! [remote rejected] master -> master (pre-receive hook declined)  
error: failed to push some refs to 'https://git.heroku.com/pushtraininfo.git'  

requirements.txtを作ってなかったから?

buildpackがpythonに対応してないぜ、的なメッセージが出ているのですが、pythonのやつを設定したばっかだしなぁと思いつつ、調べると以下の記事が。 App not compatible with buildpack - Heroku - Stack Overflow
以下コマンドでrequirements.txtを生成。

(env) > pip freeze > requirements.txt

再度gitにコミットした後、デプロイ

ログを取り忘れましたが、無事デプロイできました。

まとめ

前回記事でも書いた通り、heroku schedulerは簡単に設定できるうえ、スケジューラのみの使用で無料の範囲を超えることは個人利用ならよほどハードな使い方をしない限りないんじゃないかなと思います。
今回書いたコードで私は朝7時と18時の2回slack通知させています。(1日毎のスケジュールを2件作成)
f:id:us_key:20181225232615p:plain スケジュールの組み方は業務で使うようなスケジューラと比べると制約がありますが、個人で使う分には十分じゃないかと。
気軽にスケジュールが組めるのでお試しください!

ZOZOの2Bスーツが届いてからの話

↓の記事で予告してましたが、今回はZOZOのはなし。

us-key-tech.hatenablog.com

 

ようやく来たよ、ZOZOスーツ、じゃなくてZOZOのビジネススーツ。

 

目次

 

たくさん待ちました

 

箱でかい

箱がものすごいでかいです。カシヤマの薄く小さい箱をイメージしてたのでコンビニ受け取りにしたのですが、めっちゃでかくて運ぶの大変だった。。

f:id:us_key:20181120093143j:image

 

開封の儀

段ボールを開けると中から化粧箱が。

f:id:us_key:20181120093809j:image

 

 化粧箱の中からよくあるスーツ袋に入ったスーツがでてきます。

f:id:us_key:20181120093901j:image

 

 スーツに乗っている紙は、サイズの直しができるよ、という説明。後述しますがわたくしもこれを利用することになります。。

f:id:us_key:20181120093921j:image

 

 今回はスーツのほかにワイシャツも注文しました。スーツの間に入ってました。

f:id:us_key:20181120093939j:image

 

スーツはどんなんなん?

こんな感じ。コンビニから持ち帰る際になんとかがんばって水平を保って歩いたおかげか、そんなにしわもなく。

f:id:us_key:20181120093955j:image

 

サイズ感

たぶん伝わらないけどサイズ感。雑な加工ですみません&画質がというか鏡の埃が。。

f:id:us_key:20181120094008j:image

 

 こちらはカシヤマで作ったスーツ。やはり伝わらないですよね。

 

 

f:id:us_key:20181120094017j:image

 

問題点 

簡潔にいうと、ジャケットのウェスト部分が太いのと、裾が長い。

 

カスタマーサポートに捕捉される

 上記のツイートをしてサイズ直しをしようかどうしようかとうんうんしていたところ、カスタマーサポートからメンションが。

f:id:us_key:20181120094038p:image

お直し用のURLとは別に問い合わせフォームを案内されたのですが、直しをすべき箇所は明確(直した結果で問題ないかどうかはまた別の話ですが)だったため、お直しの依頼をさせてもらいました。 

 

お直し依頼

スーツに同封されてきた説明書きに添付されているQRコードからお直し依頼フォームにアクセスし、どこを何cm直すかを指定して送信。

メールで直しの内容確認と、送付先が案内されます。

スーツの場合、上下とも送る必要はありません。今回はジャケットのみ直しが必要だったのでジャケットのみ送りました。大き目の袋に入れてガムテープで封をして、ヤマトに集荷依頼。

 

お直しではなく作り直し対応に

 今回、直しの内容としては胴回り-2cm、着丈-3cmだったのですが、どうやらお直しで対応できる範囲を超えていたらしくこんな連絡が。

f:id:us_key:20181207131134j:image

パターンの再生成が必要になるため1ヶ月ほどかかるとのこと。

まあ時間がかかることに関しては、中途半端なものを着続けるよりいいので問題なし。気になるのは、ここにいろんな人たちから集まったフィードバックを反映させてパターンの生成手法を改善します、なんてプロセスが入るとさらに時間がかかりそうだな~というところ。

当初の配送予定からも2ヶ月くらい?遅れていたため、どこまでリードタイムがかかるかという点と、この間に何かしらの品質改善があるかどうか。

 

まだ応援はしています

まあこんな感じで手元にちゃんとしたスーツが届くまでにはまだまだかかりそうなんですが、気持ち的にはまだまだ応援したいなという気持ちです。

生みの苦しみというか、革新的なことを始めるときには初速を最大限高めたいところですが、なかなか難しいものですねというのをまざまざと感じさせられます。

将来的にはZOZOスーツ不要になるなんて話も出ていますが、スーツを作る場合には細かい採寸が必要だと思うのだけどどうなのかなー、なんてことも気になっています。

いずれにせよ、もうしばらく動向を注視していきたいなと思います。

www.itmedia.co.jp

 

2018/12/20追記

そろそろ直しの依頼をしてから1か月くらい経つかなーと思っていたら、今日こんなメールが。

うーん。がんばってー。

VSCodeでgrep

最近業務でもVSCodeを使い始めてみました。

 

といってもやることはSIerの仕事なので、コードを読み書きするだけでなく、grepしたりもします。

てことで、過去の記事でサクラエディタを使ったgrepの仕方を記事にしましたが、VSCodeで同様のことをする場合について書いてみます。

us-key-tech.hatenablog.com

 

目次

 

grepのやり方

「Ctrl+Shift+F」でファイルをまたいだ検索ができます(windowsの場合)。 

それにしても検索のスピードが恐ろしく速くて驚くよねこれ。。

サクラだと1分以上かかっていたgrepが数秒で終わるような感覚です。凄い。

※ただし、サクラだと該当箇所ごと、該当行ごと(1行に複数該当箇所があっても1件とカウント)が選択できますが、VSCodeでは該当箇所ごとの検索しかできないようです。

 

除外ファイルの指定の仕方

 検索文字入力ウィンドウの下にある「…」をクリックすると、対象ファイル、対象外ファイルの指定ができます。

f:id:us_key:20181119211539p:plain

「除外するファイル」)に除外したいファイルを指定します。

 含めるファイルと除外するファイルを分けて指定できるので分かりやすいですね。

f:id:us_key:20181119211554p:plain

出力結果をテキストに吐き出す

検索結果の一覧で右クリック→「全てのファイルをコピー」で結果全てコピーされます。

f:id:us_key:20181119211742p:plain

ペーストするとこんな感じ。

f:id:us_key:20181119212034p:plain

エクセルとかで綺麗にしたい

ファイルと該当箇所の文字列、行と列が出ているので、あとはスクリプト書くなりマクロ書くなりしてきれいにすればいいんじゃないでしょうか。

サクッとVSCode上でCSVに吐いてくれる拡張とかないのかなー。

 

まとめ

てことでVSCodegrepする方法を簡単に書いてみました。VSCode拡張機能がどんどん出ていること、そして動作がめちゃくちゃ軽快なのが最高ですね。これからもどんどん使い倒していきたいと思います!