PythonとMySQLを使ってLINEBotをつくりました。
今回作ったBotアプリはこちら!
布団を干していた時、雨に気づかずびしょびしょになってしまった…。
そんな失敗から、雨が降る少し前にLINEで教えてくれるBotをつくりました!雨が降る前と晴れる前にかえるが教えてくれます。
トライアル版なので最大50人しか登録できませんが、ぜひ皆さんに使って貰えればと思います! pic.twitter.com/zUnyzXiBzo
— カシワバユキ@駆け出してない独学エンジニア (@yuki_kashiwaba) 2018年12月6日
雨が降ってきたのに気づかなくて干してた布団がびしょ濡れになった恨みをぶつけて開発しました笑
今回このBotをつくるにあたって、ユーザーの位置情報を登録するためにDBを使う必要があったので、SQLについて一から勉強しました。
学習&制作期間はおよそ一週間でした。
学んだことや教材などを初日から振り返っていきます。
もくじ
- 1日目:LINEBotでDBを使おうと思い立つ
- 2日目:DBの環境構築に手こずる
- 3日目:PytonでSQLを操る
- 4日目:SQLを学びつつYahooAPIと接続
- 5日目:Heroku上にMySQLの環境構築
- 6日目:BOTが完成するも、謎のバグに苦しむ
- あまがえるBOT
1日目:LINEBotでDBを使おうと思い立つ
思えばあれは、Javascriptの勉強をしている最中でした…。
イヤホンをして勉強をしていたら、いつの間にか雨が降っていたことに気づかず、干していた布団がびしょ濡れになっていたのです…・
そこで僕は思いました。
自宅で雨が降る直前に通知をくれるアプリさえあれば…!
イヤホンつけて勉強してたら、雨に気づかなくて布団が大変なことになってしまった…。
雨が降ってきたら通知くれるBOTとか需要ありそう。— カシワバユキ@駆け出してない独学エンジニア (@yuki_kashiwaba) 2018年11月29日
ここから僕の一週間の戦いが幕を開けたのです。
天気を知るAPIはいくつかありましたが、今回はYahooAPIを使用することにしました。
理由は、Pythonでの使い方がわかりやすく書かれた記事を見つけたからです笑
参考にした記事はこちら。
Yahoo! Open Local Platform (YOLP) を使ってお天気情報を取得したついでにラズパイにAquesTalkPiで喋らせてみる
さて、気象情報を取得するAPIは簡単に使えたのですが、ここで1つ問題がありました。
DBを触ったことのなかった僕は、APIを利用するための位置情報を保存する手段がなかったのです。
これはSQLについて学ぶチャンス!
というわけで早速勉強をはじめました。
yahooAPIを使って、雨が降りそうになったら通知するBOTをつくりたいんだけど、ユーザー情報を保存するDBの扱いに困ったので、ProgateでSQL学ぶ!
さくっと終わらせて次のステップ行くぞー!
SQL 学習コース Iを修了しました! https://t.co/iWoBb4jD0f #Progate— カシワバユキ@駆け出してない独学エンジニア (@yuki_kashiwaba) 2018年11月29日
SQLの教材はとりあえずProgateを使いました。
ここまでが初日。
2日目:DBの環境構築に手こずる
SQLについて概要はつかめたものの、どうやらDBには色々な種類があることがわかりました。
SQLite、MySQL、PosgreSQLなどなど他にもたくさんあり、何を使ったらいいかよくわからない状況でした。
色々調べた結果、Herokuで使用できて、かつシンプルで使いやすいMySQLを使うことにしました。
MySQLはシンプルで早いのが売りらしく、GoogleやYahooのサービスでも利用されているという記事も見かけました。
しかし、早速使ってみようと試みるも例によってローカルの開発環境構築でつまづきました…。
どうして環境構築って毎回こう大変なのでしょう。
なんとかローカルでのMySQLの環境構築を終えたものの、さらなる難関が待っていたのです。
エラー解決すると脳汁噴き出るからプログラミングやめられん
— カシワバユキ (@yuki_kashiwaba) 2018年12月1日
3日目:PytonでSQLを操る
さてさて、無事にローカルにSQL環境が構築されたわけですが、BOTで使うにはこれをPythonで操作できるようにしなければいけません。
Pythonで簡単なSQL操作を行うコード自体は難しくはなかったのですが、一切ログインできないという問題が発生しました。
エラーログを見てもさっぱりわからず、MySQLのドキュメントを読んだり、エラーログを検索してみたり、試行錯誤すること数時間…。
ハマりまくって3日かかりましたが、ついにPythonでMySQLをいじるのに成功したんですー!!
原因は、環境構築時に、sudoコマンド使わないとログインできない設定になっていたことっぽいです…。独学なので進みは遅いですが、きっとこうやって試行錯誤した経験は活きると思って引き続きがんばろ。 pic.twitter.com/GjbqS9ki18
— カシワバユキ (@yuki_kashiwaba) 2018年12月3日</a href=”https:>
ついに成功!!
単純に最初の初期設定で、sudoユーザー以外がログインできないような設定にしていたことが原因でした。
エラーって、解決するとなんてことない内容が多いですよね。
PythonでMySQL、環境構築と接続さえクリアしてしまえば、
cursor.execute(“”” 普通にSQLを書く “””)
db.commit()で全て実装できるっぽい!
やったぜ!
SQL勉強しよ!— カシワバユキ (@yuki_kashiwaba) 2018年12月3日
ちなみにエラーと格闘する中で知ったことなのですが、MySQLのウェルノウンポートは3306らしいです。
時間はかかりますが、独力でエラー対処をしていると色んな学びがありますね。
ポート番号3306って何かと思ったら、MySQL database systemのウェルノウンポートだったのか
— カシワバユキ (@yuki_kashiwaba) 2018年12月2日
さて、話はそれましたが、3日かけてようやくPythonでMySQLを操作するスキルを身に着けたので、いよいよ4日目からはBOT開発に着手していきます。
4日目:SQLを学びつつYahooAPIと接続
よーしやるぞー! pic.twitter.com/aVHTbuBFNW
— カシワバユキ (@yuki_kashiwaba) 2018年12月3日
SQLの書籍も購入し、調子よくユーザー情報登録機能とWEBアプリ連携の実装を進めていきました。
このあいだいつの間にか雨が降ったせいで布団がびしょ濡れになった恨みから、Python×MySQL×YahooAPIで自宅付近の降水を通知してくれるLINEBOTを開発中ー!
一番のネックだったDBへのユーザー情報の書き込みはクリアして、基幹部のコードは書けたので、あとはひたすら作業だ!! pic.twitter.com/xlvQdUrecr
— カシワバユキ (@yuki_kashiwaba) 2018年12月3日
ちなみに、YahooAPIを使った天気情報の取得はめちゃめちゃ簡単でした。
なんやかんやでアプリの大枠ができたので、Herokuへのデプロイをしていきます。
しかし、今度はHeroku上でMySQLの環境構築を行う必要があり、またしてもハマってしまったのです…。
5日目:Heroku上にMySQLの環境構築
MySQLの用意自体は比較的簡単にできたのですが、Pythonとの接続で何故か弾かれるエラーが発生しました。
試行錯誤した結果無事解決したのですが、どうやらPythonでSQLに接続するために使っていたモジュールの最新版がHerokuで使用できないのが原因でした。
【備忘録】
Heorkuに、mysql-connector-python-rfを入れる時、最新版では弾かれる。mysql-connector-python-rf==2.0.4
ならエラーなくデプロイできる。
— カシワバユキ (@yuki_kashiwaba) 2018年12月4日
前にもwhitenoiseの導入の時に似たようなエラーにぶつかったことがあったので、スムーズに解決できました。
やっぱりエラー対処の経験は蓄積しますね。
たくさんデバッグしましょう。
うぉー!!
Heroku上のMySQLにも接続できた!!
あと一歩なんです!!— カシワバユキ (@yuki_kashiwaba) 2018年12月4日
これだけいいところなのにそろそろ仕事に行かねばならない辛さ。
— カシワバユキ (@yuki_kashiwaba) 2018年12月4日
ついにHeroku上のMySQLにBotのユーザー情報を保存することに成功したんです…!
天才なのかもしれない…!もうちょっと進めたらまたハマるのは目に見えてるので、今日は天才モードのまま仕事に行ってきます。 pic.twitter.com/9DQXHQ5SIV
— カシワバユキ (@yuki_kashiwaba) 2018年12月4日
あと一歩のところまできてテンションが上がってます。
趣味プログラマは、どうしても仕事が中心になるので時間の確保大事ですね。
プログラミングは朝が捗るのです。
6日目:BOTが完成するも、謎のバグに苦しむ
その後無事にBOTが完成し、公開にこぎつけたのですが、待っていたのはバグ地獄でした笑
最初にぶつかったのは、DBに2回以上接続しようとすると弾かれるという謎のバグでした…。
全然原因わからなくてMySQLのドキュメントを頑張って解読しようとしてました。
1人で開発するときって、プログラミングだけでなくてインフラやDB、ネットワークなんかの知識もある程度必要になりますね。
今のテクノロジーって高度にブラックボックス化されてて、中々全容を把握できないので大変です…。
うーんなぜだろ?
デプロイした直後はDBの更新が反映されるのに、2回目以降は必ずこのエラーがでる。’mysql.connector.errors.InterfaceError: 2013: Lost connection to MySQL server during query’
完全に再現性のあるバグだー。
原因がわからん。— カシワバユキ (@yuki_kashiwaba) 2018年12月5日
DB、Heroku、Python、Flask、各種パッケージ…。
自分にとってブラックボックスなものを組み合わせて使ってるから、何か詰まるとすぐ原因がわからなくなる笑勘で原因の仮設立てて、総当たり的に潰してるからだいぶ時間かかるわー。
— カシワバユキ (@yuki_kashiwaba) 2018年12月5日
とはいえ、このバグも原因はなんてことないシンプルなものでした。
天才すぎる…。
DBとの接続をcloseしないまま次の接続を始めようとしてたから二回目以降エラーになっていたのだ…。— カシワバユキ (@yuki_kashiwaba) 2018年12月5日
一旦接続を切らなきゃいけなかったんですね。
そりゃ、接続しっぱなしのところにもう一度接続しようとしたらエラーになりますよね。
一難去ってまた一難、接続の問題は解決したのですが、今度は別のエラーが発生しました。
原因は言語化しづらいんですが、どうもDBに短時間に連続して接続するとエラーが発生するようで、DBへの接続と切断をメソッドごとに行っていたらエラーが発生するようになったようです。
ちょっと言語化しづらいんだけど、SQLを操作するメソッドを実行するたびにDBへの接続と切断を繰り返す設計だと、数回連続使用したらすぐに「system error: 9 Bad file descriptor」ってエラーが返ってくる。
DBへの接続をメソッドをごとではなく、プロセスごとにしたら解消された。
— カシワバユキ (@yuki_kashiwaba) 2018年12月6日
今回のBOT開発を通して、設計の重要さを痛感しました。
どんな技術を使うか、どんなアルゴリズムを組むか、どんな流れで動かすか、無数の選択肢の中から目的に合わせて最善の選択をするには広く深い知識が必要なんだろうなぁと感じます。
あまがえるBOT
ちなみに完成したBOTはこちらです。
布団を干していた時、雨に気づかずびしょびしょになってしまった…。
そんな失敗から、雨が降る少し前にLINEで教えてくれるBotをつくりました!雨が降る前と晴れる前にかえるが教えてくれます。
トライアル版なので最大50人しか登録できませんが、ぜひ皆さんに使って貰えればと思います! pic.twitter.com/zUnyzXiBzo
— カシワバユキ (@yuki_kashiwaba) 2018年12月6日
トライアル版なので最大50人しかユーザー登録できないのですが、まだ空きがあるので、よければ友達追加してみてください笑
サービスが終了してリンク先にいけない場合がありますがご容赦ください。