ヘルシープログラマ

# はじめに
皆さんいかがお過ごしでしょうか?
お元気ですか?
私は感覚的には元気だと思うのですが、観測しないことにはなんともいえません。
また、自身の健康を向上したいと思っている方も、基準を見つける必要があります。

ここでは自身の健康を観測する手段を提案するものであります。

これが SRE (Self Reliability Engineering) なんつってね。

# 私が観測したい情報

- 自分の健康状態を反映しているであろう情報
    - 心拍数
        - 高熱や不眠など明らかに体調悪いときに変動があったため
- 自身の健康状態に影響するであろう情報
    - 睡眠時間
        - 睡眠時間が少ないと気分が悪くなったりしますよね...?
    - 環境情報
        - 室温
            - 寒いと体調を崩すという俗説があるため
        - 室内湿度
            - 湿度が高いと不快に思うが体調への影響を測定したいため

健康の指標になりそうな情報や健康への影響がありそうな値を計測します。

# 必要なもの

- Fitbit
    - 心拍や睡眠が取れます
        - 他にも色々取れる
    - 電池が切れて転がっていた Fitbit Charge 4 活用
- Nature Remo
    - 室温や湿度が取れます。
    - 私は湿度も計測したかったので Nature Remo 3
    - https://nature.global/nature-remo/compare-remo/

どちらもブラックフライデーでセールしていました。(全く同じ型番か覚えていないけど今回やりたいことは他のやつでもある程度実現できるので)
来年買うといいかもね:innocent:)

# サンプル実装
New Relic への 送信はこの API を使いました。雑に metrics を送信するのに便利です。
https://docs.newrelic.com/docs/data-apis/ingest-apis/metric-api/report-metrics-metric-api/
## Nature Remo
雑コード
https://gist.github.com/m0cchi/2e2e70e7da2281fcdb2e433d411b8968

Nature Remo の API はこちらを見てください。
https://developer.nature.global/
## Fitbit

### Fitbit の API Key を取得
App を作成する。
https://dev.fitbit.com/apps

以下でわかりやすく解説されているのでこちらを参照することをおすすめします。
https://www.zenryoku-kun.com/post/fitbit-api

個人的に localhost:8080 があったほうが便利だったので QueryString を表示する簡易 Server を用意しました。
https://gist.github.com/m0cchi/28952f8bcd4d460626edd1ddb1c27fad
<!--
#### dummy server
前述した記事では localhost:8080 をたてていないので URL から拾っていたが、
`Fitbit OAuth 2.0 Tutorial` の `Authorization URL` で使う。
リダイレクトしてくるので code と state を取得したい。
https://gist.github.com/m0cchi/28952f8bcd4d460626edd1ddb1c27fad
--->
#### Scopes
私が選んだのはこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39528/79297406-e244-cb57-f587-cea20d68478e.png)

#### Token 再作成
雑コード
https://gist.github.com/m0cchi/0340d411d93c664941b18f24563f802e

暫定で redis へ token を渡して rotate します。


### Metric 収集
コード(略)
前日1日分のメトリクスを1日1回送信するのが良いかと思います。


心拍数取得
https://dev.fitbit.com/build/reference/web-api/heartrate-timeseries/get-heartrate-timeseries-by-date/

睡眠時間取得
https://dev.fitbit.com/build/reference/web-api/sleep/get-sleep-log-by-date/


# 反省
定点観測が大切であるがこの記事で示すことができなかった。
メトリクスを比べて考察までできればよかったが...
現在気になっているのは
- 睡眠時間と室温、気温の関連性
    - 睡眠時間が体調へ影響を与えているので、その睡眠への影響について気になる
    - これを書いている現在は YouTube を見ていたら寝不足なので再生履歴とかも New Relic へ送るといいのではと思ってきた
        - https://takeout.google.com/settings/takeout?pli=1


# 感想

- 世の中には色々なデータが転がっているので New Relic へ送ってみるとよいのではないでしょうか
    - 例えば Weather API とか気圧の情報が取れるっぽいので低気圧不調民は観測してみると面白そう
    - https://openweathermap.org/api
- 作業していてあるあるなのが New Relic へ metric を送れたのはいいが、 New Relic 上で見ることができないとき
    - NrIntegrationError を確認するとすぐに解決できた
        - https://docs.newrelic.com/jp/docs/data-apis/manage-data/nrintegrationerror/
- 情報を溜めるデータベースは運用し続けるのがまあまあだるいので New Relic へ任せることができるのは楽
    - とはいえ、情報を第三者へ渡していることは意識するべき
        - 「Nature Remo の人感センサーの値が時系列情報として何らかの理由で流出した場合にリスクになるのでは?」とか検討すべき
- 数年単位で情報を溜めたいときは別途手段を考えたほうがいいと思う
    - FYI: [データ保持期間](https://docs.newrelic.com/jp/docs/data-apis/manage-data/manage-data-retention/)
    - 使い分け例
        - 詳細で数週間単位の情報は New Relic
        - サンプリングし年単位の情報は自前で立てた何か
- 当然ながら New Relic の API にも rate limit があるので確認しましょう
    - https://docs.newrelic.com/docs/data-apis/manage-data/view-system-limits/
    - 私の実装的には redis で metrics を溜めて定期的にいい感じに送信するように書き換える予定です。予定。
- Nature Remo も Fitbit も API wrapper 調べた感じメンテされていないように感じたので自分で公開するのも楽しそう
- 自分の健康を仮説検証していけ