2020-09-24

Pixelaに飲酒記録するiOSショートカットに、24時を過ぎた飲酒も「今日」とする日付またぎ対応を入れた

ダメな大人なのでよくお酒を飲みます。
そこで、ちょっと前からPixelaを使って飲酒記録を取っています。

こんな感じ。
https://pixe.la/v1/users/watahari/graphs/sake.html

※2020/09/24現在

見てわかる通り、Pixelaは、日付単位の任意の数値データを記録し、GitHubの芝生風グラフを描画してくれる最高にイケてるサービスです。
なんでも可視化するのが好きなので、最近気に入っています。
土曜日の飲酒に気をつけたほうがよさそう、とか気付くことが出来ます。

さて、Pixelaは最高にイケてるので、記録するのにもAPIを叩く必要があります。PixelaUIというスマホアプリもあります。が、そもそも深酒してくると、curlもスマホもおぼつきません。

震える指と回る視界でも確実に記録するためのUIが、私には必要です。

そこで、スマホのアイコン1タップで記録をしようと思います。
PixelaのAPIはとても叩きやすいので、iPhoneの場合、iOSショートカットを使って簡単にできます。

こんなのを作りたい

Pixela への活動記録をスマホとNFCタグで自動化する(iOS / Android)
https://blog.a-know.me/entry/2020/07/19/221201

さすがサービス作者様の記事だけあって、きれいにまとまっています。
上記例では/stopwatchを使っていますが、他にも/increment/decrementが存在しますので、この辺は上述例を参考に簡単にセットアップ可能です。


問題:25時は今日か?

が、ここで問題があります。
それは、飲酒をするのは夜だということです。

24時を超えた飲酒が翌日分となるのは、データとしては正しいですが、感覚的には誤っています。その日どのくらいお酒を飲んだのか?という記録を意図しているのに、24時を過ぎたら翌日扱いになってしまうのであれば、根っからのお酒大好きっ子として「おっ24時すぎたぞ、こっからは明日分だから飲んでもいいなw」となってしまいます。NGです。飲みすぎ注意です。

※真面目にいうとMyFitnessPalとかfitbitとかのヘルスケア系データサービス、夜勤やシフト勤務等のユーザに不親切ではないでしょうか?Nintendo Switch フィットボクシングとかは日付変更時刻設定があってLGTMでした。Pixelaは違いますが、ヘルスケア用途のサービスはこの観点を頑張ってほしいなと切に思います。私は遅寝遅起きなだけですが。。

そこで、このようなiOSショートカットを組む必要があります。

※さすがに朝8時までお酒をいただくことはないです

ちょちょっとシェルスクリプト書くならともかく、スマホでこちゃこちゃショートカットをUIプログラミングするには面倒そう・・・。

実際、勘所がわかるまで結構作るのが面倒だったので、以下、作ったショートカットロジックを置いておきます。その後にポイントだけ解説させてください。


出来上がったショートカットの流れ


(ポイント1) iOSショートカットで、Pixelaのレスポンスを取り扱う

Pixel(グラフ上の任意の日のデータポイント)のGET APIでは、Jsonが返却されてきます。

https://docs.pixe.la/entry/get-pixel

{"quantity":"5","optionalData":"{\"key\":\"value\"}"}

このパース面倒だな・・・と思いきや、iOSショートカットの場合、簡単に取り扱えるようです。iOSショートカット内ではjsonは勝手にパースされ「辞書」として利用可能であり、アクションとしては「辞書の値を取得」で取得可能です(「スクリプティング」の一種)。

なので、 URLをcurl→変数に格納→JSONパースして特定項目を取り出す の流れは、下記の流れでOKです。分かってしまえば簡単でした。


これもPixelaのAPIがjson形式で応答してくれるおかげです。XMLとかPHPSerializeとかじゃなくて本当によかった・・・。

(ポイント2) データ未設定PixelをGETするとエラー応答だが、0を設定したPixelはquantity:0が応答される。

まだ何もデータを設定していないPixelからデータを取ると、エラー応答が返ってくる。quantityフィールドは存在しない。
{
  “message":"Specified pixel not found.”
  “isSuccess":false
}
一方、予め0を設定したPixelからデータを取ると、quantity:0が応答される。
{
  “quantity":"0"
}
動作確認のときにつまずいたので注意!

(ポイント3) 日付型変数をカスタムフォーマットyyyyMMddで出力することで、簡単にPixelaのAPIの形式にあう

今回の場合、現在時刻変数から「日付(yyyyMMdd形式)」と「時刻(HH形式)」を取り出す必要があります。
当然といえば当然ですが、あまり序盤に現在時刻をintやString的な変数に変形するとややこしくなります。iOSショートカットの仕組み的に、変数をtoStringして変数に入れても、代入された変数はStringではないみたいです。DateTimeっぽい変数です。
素直に、使うときに、カスタムフォーマットを利用してyyyyMMddにしましょう。

まとめ

ほぼiOSショートカットの記事みたいになりました。
しかし言いたいことは、

「こんな簡単につかえて楽しいから、Pixela使おうぜ!」

です!以上!

ほか感想など

  • 2回APIを叩いて申し訳ないので、/v1/users/<username>/graphs/<graphID>/<yyyyMMdd>/incrementが欲しい(けどちょっとマイナーそう)
  • 本当に酔っていることを考えると、NFCステッカーをトリガーにしたい。
    しかし、iPhoneXSが文鎮化してしまい、しょうがなくiPhone7を使っているので出来なかった(余ってるNFCステッカーあるのに・・・)。iPhone12早く発売されないかな。
  • もっと酔っていることを考えると、Amazon Dash Buttonを使いたい。
  • Pixelaさん無料で申し訳ないので、投げ銭(buymeacoffeeとか)いれてほしい。
    (有料機能いまのところ使わなさそうだけど、仕方がないので月1$のPatreonにはなった、数ヶ月は寄付しようと思っている)

0 件のコメント: