TRUNKハッカソンに出場しまたLINE BOTを作った話

お久しぶりです僕です。

今回TRUNKハッカソンhttps://trunk.fm/hackathons/ss2019)という24時間で1つのプロダクトを開発するコンテストに出場し、LINE BOTを開発したのでブログを書きました。

何らかのコンテストでLINE BOTを開発するのは3回目なのでそろそろ新しいのにチャレンジしたいですね。

何をつくったの?

LINE BOTで現在位置を送信すると近くにある飲食店を混雑度別にソートして教えてくれるっていうのを作りました。

混雑度についてはお店のドアにSens‘itというデバイスをとりつけるだけで入店者数を測る!導入簡単!LPWAで省電力!ってアピールしました。

Sens`itについてはこちら→https://www.switch-science.com/catalog/3974/

LPWAについてはこちら→https://soracom.jp/lpwa/
f:id:hahayata:20190318230752j:plain
f:id:hahayata:20190318230809j:plain

入店者数はSens`itにドア開閉センサが搭載されているので、入店者数を計算しました。
(審査員に「これだと店主一生出れないのでは?」って指摘されましたが...^^;)

技術的な話

BOT側はPythonとFlaskで開発しました。なぜFlaskかというと僕がそれしかできないからですw
その他サーバとかDBを操作するのはPHPとNode.jsで書きました。この辺は僕担当じゃないのでTwitterID:@siketyanに聞いてください!

コードはGitHubにあげています。
https://github.com/FlexiblePrintedCircuits/SuEat_BotCode

苦労したこと

僕自身DBの知識がないので、FlaskでSiketyanの作ってくれたDBだったりJSONデータをFlaskでいじるのが全然わかんなかったです...。
Siketyanに聞きまくってしまいました。Siketyanごめんね。

感想

24時間疲れた!
けど達成感は確実にある!24時間ハッカソンはHackDayに次いでこれで2回目だけど、プレゼンも含め開発がすべて終了したときのうおー!感はそりゃあもう半端ないですよね。
HackDayは深夜4時が1番きつかったけど、今回は早朝6時が肉体的にも精神的にも1番きつかったね。
イライラしてメンバーに八つ当たりしてしまった...。ごめんね...。

最後に

なんか途中で廊下で喧嘩してた人たち、結局どうなったん?

りんごループに陥った時の対処法

りんごループとは、iPhoneで見られるバグ(?)の俗称です。

普通にiPhoneを使っていたら急に電源が落ちて、再起動を永久に繰り返したり、りんごのマークがずっと画面に表示され続けるという、恐ろしいバグです。

私のiPhone(iPhone8)もしょっちゅうこのバグになるので、備忘録としてその対処法を書きます。
f:id:hahayata:20190226004816p:plain

①:音量ボタン+を押す
②:①をした瞬間に音量ボタンーを押す
③:②をした瞬間に電源ボタンを押し続ける。もういいかな?って思っても押し続ける。1分くらい押す。
④:1分くらい押し続ければ完全に電源が落ちる
⑤:普通に電源ボタンを押し、iPhoneを起動させる。
⑥:治ってるはず

ただの応急処置なので正しいやり方かは分かりません。
けど多分これで大抵治ります。
治らなかったら修理に出しましょう。これはApple社が悪いです。

以上です。ばいばい。

Python(Flask)とherokuを使ったLINEBOT開発でエラーが出てないのにオウム返しできない時

最初に

PythonでFlaskとherokuを使用した初歩的なオウム返しLINE BOTを開発していましたが、heroku logsでログを確認しても特にエラーが出てないのにオウム返しできずにいました。 今回先輩など多くの方にアドバイスを頂き解決したので備忘録として記事をかきます。

解決法

以下が、僕がオウム返しできなかったPythonコードです。

from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)
import os

app = Flask(__name__)

line_bot_api = LineBotApi('LINE_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('LINE_CHANNEL_SECRET')

@app.route("/")
def hello_world():
    return "hello world!"

@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']

    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))

if __name__ == "__main__":
    port = int(os.getenv("PORT"))
    app.run(host="0.0.0.0", port=port)

上記のコードは以下の記事を参考にしました。 https://qiita.com/suigin/items/0deb9451f45e351acf92

Pythonとなったら今まで何回お世話になったか分からないくらいプロプロの先輩(TwitterID: @JUN_NETWORK)に聞きまくった結果、原因として以下が挙げられました。

FlaskではデフォルトでデバッグモードがOFFとなっています。デフォルトでOFFなおかげで、本番環境でうっかり--productionのような本番用にスイッチするためのオプションを付け忘れて、デバッグ画面が表示してしまうようなことはありません。

引用:[https://www.subarunari.com/entry/2018/03/10/%E3%81%84%E3%81%BE%E3%81%95%E3%82%89%E3%81%AA%E3%81%8C%E3%82%89_Flask%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%E3%80%9CDebugger%E3%80%9C]

よって、

app = Flask(__name__)

の下に、

app = Flask(__name__)
app.debug = False

をつけることによってFlaskのデバッグモードをFalseにしました。

結果、無事治ってオウム返しできました。

デバッグモードをFlaseにしたのに治らない場合、以下の確認をしてみてください。

if __name__ == "__main__":
    app.run()

コードの最後がこうなっていた場合、僕の使用した環境では正常に動いてくれませんでした。 これはngrockなどを使用してローカル環境で実行するとちゃんと動いてくれるのですが、サーバをherokuにした途端動いてくれません。これはローカルならローカルで動く環境、herokuならherokuでちゃんと動く環境に適した書き方(自分でも何言ってるかわかんないんで間違ってたらごめん)をしないといけないらしいです。

よって、以下のように書き換えます。

if __name__ == "__main__":
    port = int(os.getenv("PORT"))
    app.run(host="0.0.0.0", port=port)

これら以外でBOTが正常に動いてくれない場合、herokuでのLINEアクセストークンやシリアルキーの設定、名前があっているかなど確認しましょう。

今回は以上ですお読みいただきありがとうございました。

HackDay2018に参加した話

久しぶりの投稿になります。
今回24時間で1つのプロダクトを開発するコンテスト、HackDay2018に参加したのでその話を書こうと思います。

きっかけ

HackU名古屋で最優秀賞を受賞したので名古屋会場代表で招待させて頂きました。

この記事をまとめると

・いい夢を見るためのアプリを作った。
・疲れた。
・Hack賞を取れそうで取れなかったので悔しい。
・思いのほか期待されていたのでこれからも頑張りたいモチベが向上した。

作ったもの

睡眠中に感じる周囲の音や匂いは夢の内容に影響しやすい

夢はレム睡眠の時に見ることが多い

というのを応用して、レム睡眠を検知したら事前にセットしておいた音と匂いを流すアプリを開発しました。
匂いは、匂の元を枕元に置いてプロペラを回し匂いを流すっていう原始的な方法です。
詳しくは写真を参考にしてください。
f:id:hahayata:20181218150058p:plain

システム説明

MindWaveという脳波測定キットで脳波を測定しながら寝ます。脳波というのは普通数値を持たないのですが、相対的な量や時間的変動から脳波を数値かしました。
数値化された脳波からα波だのβ波だのを検出してレム睡眠も検出しちゃうって仕組みです。

苦労したこと

そもそもレム睡眠を検出することが非常に難しくそれだけで24時間中の10時間は費やしました。
使用言語は全てPythonで、MindWaveからの脳波データを受け取るためのthinkgearというモジュールを使用しました。
このthinkgearがなかなか曲者で、ネットの情報も少ないし扱い方もよく分からなくて苦労しました。
この件で苦労してる人は他にもいるはずなので、thinkgearについては僕の書いたプログラムを交えて別記事にまとめようと思います。

その他

表彰式にて、審査員の方がHack賞の表彰をしている時に

「この賞はチーム徹夜同好会と迷いました。」

とおっしゃって頂けました。
徹夜同好会というのは僕らのチーム名です。
Hack賞をあと少しで取れるっていう感じだったので、その分嬉しさもありましたし悔しさもありました。
機会があればまたHackDayに出て今度こそHack賞を奪い取りたいと思います。

その他技術的な話(thinkgearやその他サンプルプログラム)は後日別記事にまとめます。

HackU2018名古屋で最優秀賞を受賞させて頂きました。

かなり久しぶりの投稿になります!


今回の内容はタイトル通り、8月21日に名古屋プライムセントラルタワーにて行われたHackU2018名古屋にて

最優秀賞

を受賞させて頂きました!!!!



私たちのチーム『徹夜同好会』が開発したのは、『エディマシーンズ』という小・中学生向けのパソコン学習アプリとなっています。



VRを用いた仮想空間内でマザーボードなどの上を自由に冒険でき、実際に動いて見て楽しくゲーム感覚で学べるようにしました。


実際のプレゼンはこちらから↓↓(再生時間指定してるのでURL踏んだら僕のプレゼンが流れるはずです)
https://youtu.be/-IkyK4DBX0k?t=2305




今回の記事では、とりあえずどの様な流れで開発を進めていったかを紹介し、技術的なことはまた別記事にまとめようと思います。




まず開発期間が始まり最初に始めたのは

どういう技術を使用するのかを調べて共有する

です!



今回は4人で出場し、プログラム班2人と3DCG班2人で開発を進めました。プログラム班は3DCG班が作ってくれた3DCGイメージをUnityにインポートしかっちょよくキーボード叩きます。



その際両班ごとに情報を共有すると思うんですが、

例えば、プログラム班が「Unityで開発するよ」だけだったり、3DCG班が「Blenderを使うよ」とかだけ共有したりするのは絶対にやめました!!!!



例えば3DCG班は、「Blenderを使うんだけど、プログラム班にもどういう操作方法でここまで使い方を調べてあってどこまでできるのか説明しておくね」という風に、プログラム班でも多少はなんとなくBlenderを使えるくらいまで詳しく情報を共有します。




こうすることで、プログラム班が3DCG班は大体このくらいのことまでできるっていうのを大体把握できるので、最初から困難な要求をしてしまうことも減るし、理解度に合わせて、より3DCG班がスムーズに仕事できるように内容の伝え方も工夫できます。






こういう風に、担当じゃないから放っておくのではなく、他班が使う技術だけでなく理解度やその技術の大まかな使い方も勉強しておくことで、よりスムーズな開発を進められると考えました。






実際にこの進め方を行い、スケジュール的にはかなり予定通り、焦ることなく両班とも楽しく開発を進めることができました!!!!




もしかしたら当たり前の進め方かもしれませんが、個人的には初めてこういう感じでやったので紹介することにしました。






暇な時に技術的なこともまとめようと思います。
ここまで読んでいただきありがとうございました。

寺が人間になっちった(๑>؂•̀๑)テヘペロ

今日英語の勉強しとったらこんな問題を見つけしました。


問.空欄に当てはまる適切な英語を書け。

この寺は300年前に建てられました。

This temple (        ) 300 yaers (          ).



…ん!?!?!?

日本語から忠実に英訳するなら

This temple was built 300 years ago.

になるはずなんですけど、明らかに空欄の数が1つ少ない…。



これより先は答えを含みます!!

考えたい人は見ないように!




なんとこれ、

This temple is 300 years old.


だったんです!!!!!


なぁぁぁるほどぉぉぉ⤵︎


300年前に建てられた=現在300歳


と言い換えるんですね!!!


けど300歳ってまるで人間みたいで、なんか無理やりだなあと思いました。


こんな柔軟な発想なかなかできないので、この問題を解けた人は頭が柔らかいと思います!!


以上!

先輩のしてることをとにかくパクる後輩

なんでもかんでもパクるうざい奴っていますよね。


そう、僕のことです!!!!


先輩がブログしてるのを見て僕もしよかな思って始めました。


初めまして!!!

わたくし春からとある高専高専生です!


多分プログラミング関係多めになると思います。

主にJavaを勉強しています!!

と言っても最近オブジェクト指向とは何かを学んだばかりの新参者です…


とりあえず最初のうちは先輩がやってることをパクリまくって勉強しようと思います。


以上!