ばんぶーのひとりごと

ばんぶーが、好きなことをおしゃべりします。

JPHACKS2022参加記

作った成果物を見たい人はこちら

技術のお話だけ読みたい人はここここ

JPHACKS2022とは

イノベータを目指す学生のための日本最大のハックイベント

らしいです。

全国6ブロックのオンラインの予選を経て、本選に出場してきました。

JPHACKSについて、詳しくはこちら

JPHACKSに出ようと思ったきっかけ

技育展を終え、「事業化目指してます」テーマに出したチームで、さらに開発を進めよ〜とか考えてました。

でも、なんか気づいたらクビになってました。

そのチームを一緒にクビになったいょむくん(@_iyom_)と、「一緒に開発したいね〜」ってなったので、ひとまず一緒にAtCoderの典型90問とか解いていました。

そんな時、どこで見つけたか忘れたけどJPHACKSを見つけたので、出てみることにしました。

チーム名は「ふたあい」です。

二藍という色の名前が由来ですが、エモい意味が込められているので、そのうちお話します。

チームのTwitterもゆるゆると2人でツイートしているので、ぜひフォローしてください🥰

アイディア出し

miroのマインドマップを使用して、アイディアを出しました。

今回のテーマは "X-Tech 2022" とざっくりしていたので、スポンサーオリジナルテーマやスポンサー様からの提供物を参考に

  • 不動産
  • 飲食
  • コミュニケーション

などのテーマで課題を出していきました。

その最中に「IT格差をなんとかしたくない?」といょむくんが言い始めて、いいな〜って思ったので、IT格差で課題を出していきました。

課題を出す手が止まったら、その中でITの力で解決できそうなものを探しました。

ITに疎い人はググるという発想がない→そもそもググり方がわからない→じゃあ分からないことを入力すれば、Google検索のためのキーワードを教えてあげよう!

という発想に辿り着きました。

製品の概要

ターゲットは高齢者。

そのため、60歳以上の約7割が利用しているLINEを選択しました。

元々スマホに入っていないアプリをわざわざ入れてもらうのは、ITに苦手意識がある人にはハードルが高いですからね…😢

作成したLINE Bot「しらべるん」に対して口語で知りたい内容(例: フルートってどうやったらうまく吹ける?)を送信すると、Google検索結果画面に飛べるリンク(例: 「フルート 吹ける 方法」のクエリを追加したURL)を返してくれます。

しらべるんの動作画面

友達追加はこちら、もしくは下記QRコードからどうぞ!

https://cdn.discordapp.com/attachments/1040240119459880990/1041708231032061992/L_gainfriends_2dbarcodes_BW.png

アップデート情報等を告知しているTwitterアカウントはこちらです!

開発フェーズ

LINE Botで調べるとめっちゃGoogle Apps Script(以下GAS)の記事が引っかかるので、とりあえずGASを使用しました。

デプロイもherokuなどを使わなくてよく、ボタンひとつでできちゃうので、助かるな〜と思ってました(サーバーサイド人間がいなかったので)。

ひとまず

で開発を進めていました。

gooラボAPIは、口語から検索ワードを作る際に形態素解析API、固有名詞抽出APIを使用しました。

GitHubアカウントさえあれば誰でも簡単に使えるAPIなので、APIを始めて使ってみる人にもgooラボAPIはオススメです。

途中で動詞を終止形にする必要があるのではないかと思い、方法を探しました。

自力では見つけられなかったので、所属サークルで質問したところ、先輩からspacyというPython自然言語処理ライブラリを教えていただきました。

とても便利なライブラリで、コピペだけで動詞を終止形にできちゃいました!

しかし、GASでPythonのコードを呼び出すために、Pythonで書いたものをAPIにしてデプロイする必要がありました。

私はサーバーサイド完全未経験でしたが、がんばってFastAPIを使ってAPIにし、herokuでデプロイまでしました(えらすぎ)。

heroku無料プラン終了の情報はすでに知っていたので、detaという無料のサービスを使ってデプロイしようとしていました。

"Hello World"まではdetaでデプロイできたのですが、実際に作ったAPIをデプロイしようとするとライブラリの容量が大きすぎたのかデプロイできず…。

私はDockerがわからなかったので、結局herokuを使うことにしました(detaもDocker不要です)。

※ちなみにこの記事を書いている今は、herokuからGoogle Cloud Runに移行するために必死にDockerと戦っています😢

そんなこんなで、予選当日までに一応動くものができました、やったね👏🎉🎊

JPHACKS予選

予選はCブロックに参加しました!予選はオンラインでの開催でした。

当日は開発に追われているというよりも、リポジトリの中身をきれいにしたり、READMEを丁寧に書いたり、プレゼンの資料を作ったりを頑張っていました(READMEは頑張ったので全人類見て!)。

プレゼンは90秒。時間が短いので、85-90秒に毎回収まるようになるまで、必死に練習しました(えらい)。

その甲斐あってか、懇親会では運営の方に「プレゼン上手だね」って褒めていただけました(えへへ)!

実はCブロックには本選で優勝したチームの方がいらっしゃって、ちゃんとCブロックのオーディエンス賞を獲られていらっしゃいました。すごすぎて叶わないなって思いました。

他のチームの発表が見れて、楽しかったです。

懇親会では、gooラボAPIを提供してくださっているNTTレゾナットさんの方が真っ先に私たちのブレイクアウトルームに来てくださいました。

とても素敵な方で、いっぱい褒めてくださったり、アドバイスくださったり、お話してて楽しかったです。

その後も色々な方が来てくださって、アドバイスを頂けて、とても勉強になりました。

予選の結果発表

「2人チームで、しかもLINE Botという既存のプラットフォームを利用しているから、本選行くのは難しいよ」って何回か言われていたので本選出場は全く頭になかったのですが、なぜか本選行けることになりました(やったー)!!!👏🎉🎊

本選出場は狙ってなかったのですが、gooラボAPIを使ったので、スポンサー賞のひとつであるNTTレゾナント賞は狙ってました。

ということで、本選までの約2週間の追加開発が決定しました!

元々本選に出れると思ってなかったので、チーム2人とも割と忙しいスケジュールになっており、大変でした…。

そして結果発表を受けて、アドバイスをくれている狼花ちゃん(@rouka_chan)とともに反省会を行いました(めっちゃ真面目)。

反省会では、YWKという手法で行いました(いつもKPTしか使ったことがなかった)。

追加開発

追加開発では、

  • LINE Botの応答の速度向上
  • 検索ワードの精度向上

の2点に注力しました。

LINE Botの応答の速度向上

GASが遅いと予想したので、全てFastAPIに移植しました。

それにあたり、line-bot-sdkを使用しました(ハッカソンプルリク投げました!人生初OSSにプルリク!!!)。

このプルリクでは、default_actionをREADMEに追加してね!みたいな内容を投げました(詳しくはここの少し上を見てね)。

でも、実際のところはGASが遅いというよりも、各種APIの呼び出し回数の多さの方が問題のようでした。

そこで、Pythonginzaというライブラリを用いて、形態素解析を行うように変更しました。

これにより、応答速度が28%短縮されました!!!

検索ワードの精度向上

検索ワードの精度向上として、「明日までの課題の終わらし方」という例文を入力した場合の出力結果が、

before:「明日 課題 終わる 方」

after:「明日 課題 終わらし方」

になりました。

精度向上のために、係り受け解析を導入しました。

JPHACKS本選

本選は、東京で行われました。ということで、久々に東京へ遊びに行きました!

本選以外のお話

前日入り&後泊したのですが、前日は高校の時のお友達と会い、本選の翌日は舞浜周辺をうろついていました(遊んでばっかでごめんなさい、いょむくん)。

舞浜でディズニーに入らず何してたの?という人は、このツイートを見てください😡

本選前日は、LINE BotをFastAPIに移植した時にカルーセルテンプレートのdefault_action(default_actionとは、カルーセルのどこを押してもURLに飛ぶ機能的なもの。詳しくはこちら)が動かなくて、ホテルで必死に戦っていました。

line-bot-sdkの丁寧なREADMEを読んでもわからず、クラスの定義まで見に行きました(えらい)。

なぜかデプロイして数時間後に動くようになったのは、今でも謎です。

本選当日

当日は、朝早くの集合でした(徹夜明けのいょむくんの顔が死んでた)。

徹夜でいょむくんが検索ワードの精度向上をしてくれたので、私はイマイチどんなアルゴリズムで動いているのかわかっていなかったです(よくない)。

当日は、ざっくり書くと

  1. プロジェクターの投影等チェック
  2. プレゼン(8分間)
  3. 展示会
  4. 結果発表
  5. 懇親会

という流れでした。

プレゼン

8分ってとても長いですね。私は普段長くても5分のLTしかしないので話すことがなくなりました。

予選の時よりもプレゼン練習に割けた時間が少なかったので、反省ポイントです。

プレゼンでは、前半が私、後半がいょむくんがしゃべりました。

プレゼン資料はこれでした(結構canvaで資料作っているチームが多かった気がします。canvaも知名度上がってきたね)。

展示会

展示会形式のイベントは初めてだったので、ワクワクでした。

私たちは、チラシを用意していきました。

チラシ-表

チラシ-裏

チラシは、よくまとまっているなどの反応を頂けて嬉しかったです(結構文言とかも考えたので!)。

他のチームは学会のポスターセッションのサイズのポスターを貼っていて、すごいなぁってなりました。

展示会では、見てくれる人と対話できるのがいいなぁと感じました。

スポンサー企業の方、審査員の方から、質問だけでなくアドバイスも頂けて嬉しかったです。

いただいたアドバイスは、きちんと反省会のタイミングで2人でまとめました。

展示会後半では、チームの人が自分たちのブースに残っていれば、参加学生も他のチームを見に行って良いというシステムでした。

しかし、私たちは2人チームなので、ほとんど他のチームを見に行く余裕がなく、それが少し心残りです…😢

結果発表

本選では色々な賞が用意されていましたが、私たちは、狙っていたNTTレゾナント賞をいただくことができました!

私たちはFlutterで作りたい作品があるので、スマートフォンがもらえたのは嬉しかったです!

実機デバッグに使わせていただく予定です。

他の賞はいただくことができなかったので、後日の反省会で「どうすれば受賞できたのか」という反省を行いました。

あと、お土産をいっぱいいただきました。スポンサー企業さまありがとうございます🥰

「しらべるん」のその後

「しらべるん」は継続的に開発を行い、さらに精度の向上や保守管理をしていく予定です。

すでに、2022年11月28日にherokuの無料プランが終了するので、今は必死にGoogle Cloud Runへ移行作業中です(執筆時。公開時にGoogle Cloud Runに移行完了しているかは、神のみぞ知る)。

今はDockerから逃げながらこの記事を書いています。

アップデート情報をお知らせするために、Twitterアカウントも作りました(ふぉろーしてね🥰)。

自然言語処理はどこまででも突き詰められそうなので、もっとやっていきたいという思いが強いです。

また、精度向上以外にも、このAPIをLINE Bot以外のプラットフォームで使用することも考えられると思います。

ということで、今後も継続的に開発していく予定なので、「しらべるん」をよろしくお願いします!

友達追加してね!

lin.ee

https://cdn.discordapp.com/attachments/1040240119459880990/1041708231032061992/L_gainfriends_2dbarcodes_BW.png

※ 2022.12.04現在、Heroku無料プラン終了につき「しらべるん」はお休みしてます。Google Cloud Runへの移行が完了し次第、一斉送信でお知らせするので、気長に待ってくれる方は友達追加してください🥰

お知らせ

LINE Bot開発にあたって感じたこと、学んだことなどを、12/2にLINE Developer Community忘年LT大会でお話してきました。

発表資料はこれです。

また、GASについて学んだことを、「Google Apps Script(GAS)ではじめてのLINE Bot作成 - GASのメリット・デメリット」というタイトルで12/8にQiitaのアドカレに公開予定です(すでに書き終わってる、えらい)。

公開後はこちらにリンクを貼るので、Qiitaも読んでください🥰