2019-06-07PythonとMySQLを使ってLINEBotをつくりました。今回作ったBotアプリはこちら!布団を干していた時、雨に気づかずびしょびしょになってしまった...。そんな失敗から、雨が降る少し前にLINEで教えてくれるBotをつくりました!雨が降る前と晴れる前にかえるが教えてくれます。今回このBotをつくるにあたって、ユーザーの位置情報を登録するためにDBを使う必要があったので、SQLについて一から勉強しました。学習&制作期間はおよそ一週間でした。学んだことや教材などを初日から振り返っていきます。スポンサーリンクもくじ1日目:LINEBotでDBを使おうと思い立つ2日目:DBの環境構築に手こずる3日目:PytonでSQLを操る4日目:SQLを学びつつYahooAPIと接続5日目:Heroku上にMySQLの環境構築6日目:BOTが完成するも、謎のバグに苦しむあまがえるBOT1日目:LINEBotでDBを使おうと思い立つ思えばあれは、Javascriptの勉強をしている最中でした...。イヤホンをして勉強をしていたら、いつの間にか雨が降っていたことに気づかず、干していた布団がびしょ濡れになっていたのです...・そこで僕は思いました。自宅で雨が降る直前に通知をくれるアプリさえあれば...!イヤホンつけて勉強してたら、雨に気づかなくて布団が大変なことになってしまった...。雨が降ってきたら通知くれるBOTとか需要ありそう。2018年11月29日ここから僕の一週間の戦いが幕を開けたのです。天気を知るAPIはいくつかありましたが、今回はYahooAPIを使用することにしました。参考にした記事はこちら。使ってお天気情報を取得したついでにラズパイにAquesTalkPiで喋らせてみるさて、気象情報を取得するAPIは簡単に使えたのですが、ここで1つ問題がありました。DBを触ったことのなかった僕は、APIを利用するための位置情報を保存する手段がなかったのです。これはSQLについて学ぶチャンス!というわけで早速勉強をはじめました。2018年11月29日SQLの教材はとりあえずProgateを使いました。2日目:DBの環境構築に手こずるSQLについて概要はつかめたものの、どうやらDBには色々な種類があることがわかりました。SQLite、MySQL、PosgreSQLなどなど他にもたくさんあり、何を使ったらいいかよくわからない状況でした。調べた結果、Herokuで使用できて、かつシンプルで使いやすいMySQLを使うことにしました。MySQLはシンプルで早いのが売りらしく、GoogleやYahooのサービスでも利用されているという記事も見かけました。使ってみようと試みるも例によってローカルの開発環境構築でつまづきました...。して環境構築って毎回こう大変なのでしょう。Ubuntu18.04にMySQLの環境をつくる【備忘録】なんとかローカルでのMySQLの環境構築を終えたものの、さらなる難関が待っていたのです。2018年12月1日3日目:PytonでSQLを操るさてさて、無事にローカルにSQL環境が構築されたわけですが、BOTで使うにはこれをPythonで操作できるようにしなければいけません。Pythonで簡単なSQL操作を行うコード自体は難しくはなかったのですが、一切ログインできないという問題が発生しました。エラーログを見てもさっぱりわからず、MySQLのドキュメントを読んだり、エラーログを検索してみたり、試行錯誤すること数時間...。ハマりまくって3日かかりましたが、ついにPythonでMySQLをいじるのに成功したんですー!!原因は、環境構築時に、sudoコマンド使わないとログインできない設定になっていたことっぽいです...。独学なので進みは遅いですが、きっとこうやって試行錯誤した経験は活きると思って引き続きがんばろ。href="https:>ついに成功!!単純に最初の初期設定で、sudoユーザー以外がログインできないような設定にしていたことが原因でした。エラーって、解決するとなんてことない内容が多いですよね。2018年12月3日ちなみにエラーと格闘する中で知ったことなのですが、MySQLのウェルノウンポートは3306らしいです。時間はかかりますが、独力でエラー対処をしていると色んな学びがありますね。2018年12月2日さて、話はそれましたが、3日かけてようやくPythonでMySQLを操作するスキルを身に着けたので、いよいよ4日目からはBOT開発に着手していきます。2018年12月3日SQLの書籍も購入し、調子よくユーザー情報登録機能とWEBアプリ連携の実装を進めていきました。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ならエラーなくデプロイできる。前にもwhitenoiseの導入の時に似たようなエラーにぶつかったことがあったので、スムーズに解決できました。エラー対処の経験は蓄積しますね。2018年12月4日これだけいいところなのにそろそろ仕事に行かねばならない辛さ。2018年12月4日ついにHeroku上のMySQLにBotのユーザー情報を保存することに成功したんです...!天才なのかもしれない...!もうちょっと進めたらまたハマるのは目に見えてるので、今日は天才モードのまま仕事に行ってきます。2018年12月4日あと一歩のところまできてテンションが上がってます。趣味プログラマは、どうしても仕事が中心になるので時間の確保大事ですね。プログラミングは朝が捗るのです。最初にぶつかったのは、DBに2回以上接続しようとすると弾かれるという謎のバグでした...。原因わからなくてMySQLのドキュメントを頑張って解読しようとしてました。1人で開発するときって、プログラミングだけでなくてインフラやDB、ネットワークなんかの知識もある程度必要になりますね。今のテクノロジーって高度にブラックボックス化されてて、中々全容を把握できないので大変です...。うーんなぜだろ?デプロイした直後はDBの更新が反映されるのに、2回目以降は必ずこのエラーがでる。query'完全に再現性のあるバグだー。2018年12月5日DB、Heroku、Python、Flask、各種パッケージ...。勘で原因の仮設立てて、総当たり的に潰してるからだいぶ時間かかるわー。2018年12月5日とはいえ、このバグも原因はなんてことないシンプルなものでした。DBとの接続をcloseしないまま次の接続を始めようとしてたから二回目以降エラーになっていたのだ...。接続を切らなきゃいけなかったんですね。そりゃ、接続しっぱなしのところにもう一度接続しようとしたらエラーになりますよね。一難去ってまた一難、接続の問題は解決したのですが、今度は別のエラーが発生しました。原因は言語化しづらいんですが、どうもDBに短時間に連続して接続するとエラーが発生するようで、DBへの接続と切断をメソッドごとに行っていたらエラーが発生するようになったようです。descriptor」ってエラーが返ってくる。DBへの接続をメソッドをごとではなく、プロセスごとにしたら解消された。今回のBOT開発を通して、設計の重要さを痛感しました。どんな技術を使うか、どんなアルゴリズムを組むか、どんな流れで動かすか、無数の選択肢の中から目的に合わせて最善の選択をするには広く深い知識が必要なんだろうなぁと感じます。あまがえるBOTちなみに完成したBOTはこちらです。布団を干していた時、雨に気づかずびしょびしょになってしまった...。そんな失敗から、雨が降る少し前にLINEで教えてくれるBotをつくりました!雨が降る前と晴れる前にかえるが教えてくれます。2018年12月6日トライアル版なので最大50人しかユーザー登録できないのですが、まだ空きがあるので、よければ友達追加してみてください笑サービスが終了してリンク先にいけない場合がありますがご容赦ください。コメントをキャンセルメールアドレスが公開されることはありません。千葉県を中心にボランティア活動や勉強会などを行っています。好きな言語はC#とPythonとC++です。関係の技術が好きです。XamarinとかTypeScriptも触ってます。質問・相談・お仕事のご依頼は、Twitterまたは問い合わせフォームまで。今月の人気記事1一年間プログラミングを独学した過程を振り返ってわかったこと。