自分を追い込むためのLINE botを作った

この記事は[Yahoo! JAPAN 18 新卒 2 Advent Calendar 2018](https://adventar.org/calendars/3419) 19日目の記事です。
前回の記事は@nokonoko2057さんの[AutoLayoutでアニメーションさせる話](https://qiita.com/nokonoko2057/items/2defd645d8337a04c4fe)
でした。

１枚目はこちら [Yahoo! JAPAN 18 新卒 Advent Calendar 2018](https://adventar.org/calendars/3388)

## はじめに
アドベントカレンダーにある他の方々の記事を見ると、技術の解説とかの文章が上手で、勉強になる記事がたくさんあり、本当にすごいなと思います。
僕は仕事とは別で趣味で開発した、自分を追い込むために作ったアプリケーションの話をさせていただきます。


## 成果物
その日行った筋肉トレーニングを記録してくれるLINE bot

<div align="center">
<img src="https://qiita-image-store.s3.amazonaws.com/0/180797/4fadf368-0dfc-e42b-5de9-3a56b808ff0a.png" width=25%>
</div>

## 作った経緯
僕は週に2日ほどスポーツジムで筋トレをしています。主にフリーウェイトトレーニングをすることが多いです。
使用した負荷(ダンベル)の重さや繰り返した回数(rep)、セット数などを記録し、残しておくことは、自分ができる限界を知ることができ、自分を追い込むことに繋がります。

以前、一つのトレーニング種目を行う前に、「行うトレーニング名」、「重さ」そして「回数」をLINEに記録して管理していました。しかし、それだと次の問題がありました。

- トレーニング名を入力するのが面倒(トレーニングで疲弊した腕を使って文字列を入力することは不可能に近い)
- 記録したトレーニングを行えなかった(途中で筋力の限界がきてしまった等)時、記録の修正ができない。


そこでLine BOT([LINE Messaging API](https://developers.line.biz/en/services/messaging-api/))を使ってトレーニングを簡単に記録できるLine botを作ろうと思いました。

## つかいかた
用意した機能は次の5つです。今回はその中のトレーニングを記録するフローを紹介します。

- 追加：よく行うトレーニング名を登録し、ワンタップで選択可能にします 
- 記録：ユーザのトレーニングを記録します
- 削除：記録したトレーニングの中から選択したものを記録から消します。
- 参照：入力した日付に行ったトレーニングを振り返ります。
- 初期化：モードを選択する前まで戻ります

まず、記録モードに入ります。
そうすると、トレーニングメニューの一覧カルーセル形式でが出てきます。

<div align="center">
<img src="https://raw.githubusercontent.com/PinkPhayate/LPtrainer/master/img/IMG_9271.jpg" width=30%>
</div>

次に、行うトレーニングをクリックし、回数-セット数-使用する重りの重さを入力します。
テキスト入力でも可能ですが、追い込まれている腕には結構な負担です。
iPhoneでは、「8の3の10」と読み上げることによって、写真のような文字列が入力できます。


<div align="center">
<img src="https://raw.githubusercontent.com/PinkPhayate/LPtrainer/master/img/IMG_9273.jpg" width=30%>
</div>

こうすると、行った記録が保存されます。


## 技術のはなし
[LINE Developers](https://developers.line.biz/en/services/messaging-api/)と、[Flask](http://flask.pocoo.org/)を使ってLINE botを作成しました。トレーニング情報の記録にはPostgreSQLを使い、herokuにデプロイしました。

LINE botの作り方については詳しく説明された記事がたくさんありますので、割愛させていただきます。
[LINE BOTの作り方を世界一わかりやすく解説（１）【アカウント準備編】 - Qiita](https://qiita.com/yoshizaki_kkgk/items/bd4277d3943200beab26)


## 開発で苦労したこと
### ユーザとの対話を実現する

本アプリケーションでは、アクセスしてきたユーザとの対話により、処理内容を決定するため、ユーザのステートを管理することが必要です。ステートを管理する方法として、KVSを使って管理をすることが挙げられます。

herokuから[Memcached Cloud - Add-ons - Heroku Elements](https://elements.heroku.com/addons/memcachedcloud)が提供されており、それを用いることで実現できます。しかし今回は、アプリケーションに連携するコンポーネントが増えて、管理が面倒になってしまうことを考慮し、トレーニング内容を記録しているPostgreSQLにステート管理情報も記録することにしました。

![SoWkIImgAStDuOhMYbNGrRLJ22v9B4ari5BGUBAlM_F5YXalUpPnSK445QmUDpGyRbxsk7dFuwPjZnjxdlMqFrqtwt7ZzCUDonutzZvkdF-uUH58jhdpSTEa9_ldFkjf1ClkUzmu4se8mX93g2MFcrSzRW9gM_EuQSdZfbrGsmmLh1GGfZMkVheUPCZZfkuNApS_txBXSUEgPysjJnTin6MH8S8Y8wX5XWRUwGeMHQa52iOAnQabK8kCm1Pr0Eq7szNzk7dpuwODJzjQdwxR2JGS4WHeXXk13GS66PT3QbuACFW0](http://www.plantuml.com/plantuml/png/SoWkIImgAStDuOhMYbNGrRLJ22v9B4ari5BGUBAlM_F5YXalUpPnSK445QmUDpGyRbxsk7dFuwPjZnjxdlMqFrqtwt7ZzCUDonutzZvkdF-uUH58jhdpSTEa9_ldFkjf1ClkUzmu4se8mX93g2MFcrSzRW9gM_EuQSdZfbrGsmmLh1GGfZMkVheUPCZZfkuNApS_txBXSUEgPysjJnTin6MH8S8Y8wX5XWRUwGeMHQa52iOAnQabK8kCm1Pr0Eq7szNzk7dpuwODJzjQdwxR2JGS4WHeXXk13GS66PT3QbuACFW0)



## 最後に
Line Botに関しては、非常に多くの記事があり、情報も溢れているので、技術的な内容をあまり書きませんでした。
同じくトレーニングをする方々にこれを使ってもらい、フィードバックをいただけたら幸いです。