来年の待ち人を占うAPIをAzureで組み立ててみた

この記事は、[カノジョできないエンジニア Advent Calendar 2016](http://qiita.com/advent-calendar/2016/no-girlfriend)の8日目の記事です。

2016年もそろそろ終わりと共にクリスマスも近づいておりますがいかがお過ごしでしょうか。
今年も何も変わらず、いつも通りの寂しいクリスマスやら年末年始を迎えてしまいそうな勢いです。

もはや残り少ない期間で何かしらチャンスがあるとは思えませんので、それであれば早い段階に将来に目を向けていかなければなりません。
計画性は大事です。皆さんも計画性はありますね？

計画を立てるにしてもきっかけが必要なので、その為に「待ち人を占うAPI」的なものを作ってみました。
正直な話、[こちら](http://qiita.com/se_kamo/items/24e2d873f3a010c3ee68)のパクリというかインスパイアです。

## ちなみに

**「待ち人」は別に恋人に限らないという話もあります。**
ので、あくまで参考程度にしてもらえればと思っていますが、信じる気持ちが大事です。

## 環境
次のような環境です。

* 構築: PHP 7 + Slim Framework 3
* インフラ: Azure App Server + MySQL in-app

Azureは久しぶりでしたが、GitHubと連携できるようになっていていい感じでした。
(その反面、色々と大変だった所もありましたのでその辺は別途時間を見つけてまとめておきたいなぁという所です。)

ちなみに、構築から運用まで0円でまかなっているというのもポイントです。
その代償として、しばらくアクセスが無いとプロセスが終了してしまうので、再度アクセスする時に少々待たされてしまいます。

## 概要
###　結果の取得
https://omikuji.azurewebsites.net/message
このURLにアクセスすると結果が表示されます。簡単ですね。

`/message`を外すとJSONでも取れます。[jq](https://stedolan.github.io/jq/)とか使うといいかもしれません。

```bash:結果だけ取得する
$ curl -s 'https://omikuji.azurewebsites.net/' | jq -r .message
来る
```

### 返ってくる一覧の取得
`/list`にアクセスすると、返ってくる結果の一覧が確認できます。

```bash:結果の一覧を取得する
$ curl -s 'https://omikuji.azurewebsites.net/list' | jq -r .messages
{
  "1": "来ず",
  "2": "来り難し",
  "3": "来ないが便りあり",
  "4": "早く来ず おとづれあり",
  "5": "来るが遅し",
  "6": "おとづれなし 来る",
  "7": "来る"
}
```

#### 内部での計算
内部ではIPアドレスのセグメントの数値をキーとしてで結果を算出／保存していて、 `11.22.33.44`というIPアドレスであれば、

```
1つめのセグメントが11の結果は4(早く来ず おとづれあり)
2つめのセグメントが22の結果は7(来る)
3つめのセグメントが33の結果は3(来ないが便りあり)
4つめのセグメントが44の結果は2(来り難し)
```

という風に計算していて、この4つの値の平均から小数点を切り捨てた結果が返ってきます。
また、値ごとの計算結果はDBに保存されるため、IPアドレスが変わらない限りは同じ結果になります。
(つまり、企業内など同じIPであれば誰が見ても同じ結果になります。)

### 結果の削除
...でもおみくじって引き直したくなりますよね！
そういう困った方々のために、`/`に`DELETE`でリクエストを飛ばすと自分の結果をリセットする事ができるようになっています。

```bash:結果を消して取り直す
$ curl -s 'https://omikuji.azurewebsites.net/' | jq -r .message
来ず
$ curl -s 'https://omikuji.azurewebsites.net/' | jq -r .message
来ず
$ curl -X DELETE -s 'https://omikuji.azurewebsites.net/'
$ curl -s 'https://omikuji.azurewebsites.net/' | jq -r .message
来ないが便りあり
```
1回目と2回目の結果が同じですが、DELETEでリクエストを送った後の結果は変わってます。ちょっとよくなりました。

### 結果の上書き
更に、`PUT`を利用してJSONデータを送信すると、好きな結果に上書きすることができるようになっています。
思いどおりの結果にならないと気が済まない方々もこれで安心ですね。

```bash:結果を上書きする
$ curl -s 'https://omikuji.azurewebsites.net/' | jq -r .message
来り難し
$ curl -H "Content-type: application/json" -X PUT --data '{"id": 7}' -s 'https://omikuji.azurewebsites.net/'
$ curl -s 'https://omikuji.azurewebsites.net/' | jq -r .message
来る
```

上記のような感じで、`/list`で取得した結果を元に好きなidを設定して送信してください。

## まとめ
これもう何のAPIだか分かんないですね(呆れ)

...何だかんだで用途が限られる上に小さいながらも、自分で何か作って公開するというのは凄い久しぶりだったので楽しかったです。  
特に、App Serviceを使う事でインフラ回りを考える時間が少なく済んだのは大きかったなぁとIaaSを使う事によるメリットを十分に受けられました。


## おわり
早速、来年こそは出来ていますように願って自分でも引いてみたいと思います...

```
PS C:\Users\taiko> Invoke-RestMethod -Uri "https://omikuji.azurewebsites.net/"

result message
------ -------
  True 来り難し
```

(´＾ω＾｀)

```
PS C:\Users\taiko> $body = @{"id"=7}
PS C:\Users\taiko> $json = $body | ConvertTo-Json
PS C:\Users\taiko> Invoke-RestMethod -Uri "https://omikuji.azurewebsites.net/" -Method PUT -ContentType "application/json" -Body $json
PS C:\Users\taiko> Invoke-RestMethod -Uri "https://omikuji.azurewebsites.net/"

result message
------ -------
  True 来る
```

来年は期待できそうです！！