ノンコードで個人利用の英単語学習アプリを作成する

# 概要
PowerApps を利用して英単語学習アプリを作成します。
今回は英単語の学習アプリですが、同様の仕組みで様々な学習アプリが作成できます。

# 全体の方針

 - 使いやすい
 - ワード登録機能
 - 登録されているワード確認機能
 - ランダム学習機能
 - モチベーションの維持

# アーキテクチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/b3a625b3-3c41-d651-9770-944ffd5b74f5.png)


モチベーションの維持として、LINEのMessagingAPIを利用し、JapanPowerAppsUG のキャラクターがその日の実績をほめてくれる機能を実装しています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a><a href="https://twitter.com/hashtag/MicrosoftFlow?src=hash&amp;ref_src=twsrc%5Etfw">#MicrosoftFlow</a><a href="https://twitter.com/hashtag/LINE?src=hash&amp;ref_src=twsrc%5Etfw">#LINE</a><br>ぱわーちゃん（ボット）が頑張ったらLINEで褒めてくれる<br>画像は<a href="https://twitter.com/yakandows10?ref_src=twsrc%5Etfw">@yakandows10</a>さんが作成したものです。 <a href="https://t.co/cjxK57fJ3z">pic.twitter.com/cjxK57fJ3z</a></p>&mdash; たく丸 (@taku_ma_ru) <a href="https://twitter.com/taku_ma_ru/status/1166298720331132929?ref_src=twsrc%5Etfw">August 27, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 前提条件

各種アカウントが必要です。

- PowerApps Plan1相当（Plan2-traialなど Office365プランでは今回のアーキテクチャは作成できません（MicrosoftFlow のプレミアムコネクタと CDS を利用しているため））
- LINE Bot のアカウント(LINE 連携済み) MessagingAPI を利用するため、LINEアカウントが必要になります。

## LINE Bot アカウント作成

1 LINE Developer コンソールにアクセス(https://developers.line.biz/ja/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/89c239e0-2138-d7eb-86a8-98476f178d6d.png)

2 右上のログインから LINE アカウントでログイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/69d6cf5a-4f7e-d524-1c81-c1a1566f22a1.png)

3 新規プロパイダを流れに従って作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/208d1d80-9612-0dac-3afa-8276f5c5e63c.png)


4 チャンネルを作成。Messaging API を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/bd6fb1f3-35d3-7c9f-fd7a-13e77c263237.png)


5 チャンネル作成後、下のほうのアクセストークンを発行。この時、失効時間は 「0」 を指定することで失効しなくなる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/64b0826a-22a7-4ab3-3c00-06a2849d09ef.png)

# アプリを作成

特に難しいことはしていません。
好きなように見た目を作りましょう。
サンプルとして、アプリの画像を配置しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/ba35aea6-fb2b-db9e-1be1-c4d2e176cce9.png)


スマホでの英語入力が個人的に苦手なので、ボタンをキーボードのように配置しています。それぞれ選択時に

```
UpdateContext({ctxInputItem: ctxInputItem & Button.Text})
```
としています。


後ほどアプリのサンプル（.msapp）も別に公開します。


# CDS のエンティティ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/6753c26b-2a94-089e-2ccd-16a94085974a.png)

もう少し作りこんでもいいかもしれません。例えばそれが単語なのかとか、どのタイミングで利用するかなどほかのアプリでも使えるように汎用的に作ってもいいかも。


# Flow

全体像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/a1c8fc4b-3c1f-3e8a-8002-aed04140066b.png)


最後の HTTP は1つにしたほうがメンテナンスの面からみても楽ですので、まとめてしまうことをお勧めします。

流れとして、

今日登録した一覧を取得 → 1件でも登録していたらほめるメッセージ、登録していなかったら、応援メッセージといった感じです。

レコード一覧のOData

```
createdon ge body('過去の時間の取得')
```

init GoodMessageList(アレイ)

```
[
  "これからも続けて入力しよう！！",
  "今日もお疲れ様！",
  "この調子で頑張ってね",
  "今日も１日お疲れ様",
  "今日の勉強はどうだったかな？",
  "英語は覚えられそう？明日も続けて入力しよう！"
]
```

init init BadMessageList(アレイ)

```
[
  "今日は忙しかったのかな？明日こそは頑張ろう！",
  "入力を続けて頑張ろう！",
  "今日は入力がなかったなぁ。。。",
  "まずは１日１単語から！"
]
```

上記 init の2つに関しては Excel や CDS なんかでメッセージを管理するのもありです。

作成

```
[
  {
    "type": "text",
    "text": "first(skip(variables('GoodMessageList'),rand(0,length(variables('GoodMessageList')))))"
  },
  {
    "type": "sticker",
    "packageId": "11537",
    "stickerId": "rand(52002734,52002743)"
  }
]
```

作成2

```
[
  {
    "type": "text",
    "text": "first(skip(variables('BadMessageList'),rand(0,length(variables('BadMessageList')))))"
  },
  {
    "type": "sticker",
    "packageId": "11538",
    "stickerId": "rand(51626522,51626532)"
  }
]
```


MessagingAPI の送信オブジェクトの内容になります。
詳しくはこちら（https://developers.line.biz/ja/reference/messaging-api/#text-message）
今回の内容は テキスト + スタンプのメッセージです。

HTTP

方法 POST

ヘッダー

|キー|値|
|:--:|:--|
|Content-Type|application/json|
|Authorization|Bearer {accessToken}|

{accessToken}には最初に発行したチャンネルのアクセストークンを設定します。

本文

```
{
  "to": "{userId}",
  "messages": outputs('作成')
}
```

{userId}には作成したチャンネルの一番下にあるIDを指定します。
今回は個人利用が想定なのでいいですが、いろんな人に利用してもらう場合は、別途 webHook 先を用意し友達登録時にデータベースなどに登録する流れになります。

以上で完成です。

# まとめ

個人学習用のアプリは環境さえ整えられれば、プログラミングをしなくても作成できます。
また、LINEのほかにメールやSlack、Microsoft Teams + アダプティブカードを利用すれば個人だけでなく、企業内の学習アプリとしても役立ちます。