はいっ、クソグラフクリエイターです。
以前こんなエントリを書いていました。


上のエントリで作ったアプリでは、optionalDataにヘルスメーターで取れる内容も記録しているんですが、特に何に使うということもないまま半年以上が経過してしまいました。
(体重のみは差分計算に利用していますが)


というわけで本日はPixelaに投稿したデータを可視化していこうと思うわけなんですがー。
出来上がったものがこちらになります。
result
丸9ヶ月経ったのでとか言いつつ、可視化のソリューション自体は以前のエントリ書いた時からやりたいなーと思いつつ、コード書くモチベーションが地をはってたのでようやく今頃できました。
7月1日にPixelaに記録を初めたんですが、最大値はもう少し前に記録しているのでトータルでは10kg程度の減でしょうか。
先月あたりまでは月1kgペースで体重を落としていった感じで、今は標準体重くらいで落ち着いています。
ちなみに、8月くらいにガクっとグラフが落ちてるところは、別の体重計に乗ったので、各項目の記録ができてなくて体重だけ記録した時ですね。

リポジトリはこちら


採用したフレームワークとか

可視化するにあたって、chartを簡単に出せるのがいいなぁと思って悩んでました。
chartと言えばmatplotlibとかかなぁ。とりあえずコマンドラインなアプリでmatplotlib使ってchartだけ出せるようにして、そこからwebに持っていくなりdesktopアプリにするなり考えるかなぁ。とぼんやり考えたりしていました。
そんなある日、とあるコミュニティでstreamlitという単語を聞いて、どんなもんか調べたらまさに思ってたことが簡単にやれそうなので採用することにしました。

streamlitだと、とりあえずやりたいことを書いていくだけでなんとなくそれっぽいWebアプリができるので、今回のようなサクッとchart出すだけみたいな要件だと便利に使えるのではないかと思います。

まさに「ようわからんけど、ええ感じにしといてくれる」感あります。

(ツイートはイメージです)

今回のアプリにしても、PixelaのAPIを順番に呼び出していくだけで思った以上に簡単にできました。
(かなり素直()に処理を書いていっているので、もう少しリファクタリングとか必要だとは思っていますが...)

ただ、状態に変化があると毎回リロードが走って状態が初期化される(formの内容は保存されている)ような挙動なので、ステップを踏んで画面を切り替えるとか、ページの内部状態とかを保持したい場合にはワークアラウンドが必要だったりします。

Formに必要な情報入れられたらAPI呼び出して、取得データを加工してChartを表示するだけのアプリであれば、必要なライブラリ(requestsとか、numpyとか、pandasとか)はすべて入っているので、ライブラリの選定とかの必要もありませんでした。
全部入りなのでさすがにDockerイメージのサイズは膨れましたが...

テーマの変更とか
dark_theme

レスポンシブ対応とかも自動でやってくれるのでかなり楽です。
mobile_view


ちなみに、私は作ったヤツをGCPのCloud Runにデプロイしてみました。
Cloud Runもgcloudインストールしたらイメージのビルドコマンド叩いてdeployコマンド叩いたらすぐに使えるようになってるのでサクッとデプロイするのは楽ですね。
コールドスタートからのスピンアップはさすがに遅いけど、個人利用なら問題ないレベルだとは感じました。
Cloud Runにデプロイしてハマった箇所としては、streamlitが定期的に/healthzへアクセスしてるみたいなんですが、Cloud Runでは/healthzは予約語みたいで404になってしばらく使うとエラー吐いてどうしようもなくなる現象が出ています。
Stackoverflowとかで紹介されていた解決方法を入れてみたらなんとかなってるかな?という状態です。
とは言え、streamlitのソースを書き換えるような強引な解決法なので、streamlitの該当のIssueをWatchして公式の対策が出れば対応しようかなと思います。

Cloud RunのURLは諸々の理由(人の作ったアプリにPixelaのtoken入れるの気持ち悪いとか、アクセスされすぎると課金ががが、とか...)で公開しませんので、試してみたい場合は、リポジトリをCloneして自身で実行してみてください。
Pythonの実行環境ない場合でも、リポジトリにはDockerfileとdocker-comopse.ymlを入れているので、プロジェクトルートでdocker-compose up --buildとかやるだけで起動すると思います。

現場からは以上です。