Upgrade to Pro — share decks privately, control downloads, hide ads and more …

mild-web-sap#14

 mild-web-sap#14

「授業用に簡易な心拍データ提供サーバを作った話」
ゆるWeb勉強会@札幌 OnLine #14

8c6c1f0c4c41d0640ade76bd71e9e475?s=128

Hiroto YAMAKAWA

August 30, 2021
Tweet

Transcript

  1. #ゆるWeb札幌 !"#$%&'()*+,-./+012345 山川広人(@gishi_yama) 1

  2. #ゆるWeb札幌 公立千歳科学技術大学 情報システム工学科 専任講師 R&D: Experimental Development of ICT Systems (ex:

    City-Bus Tacking System) Computer in Education, Programming and Programmer's Learning Communities: 6789:9;<=>=?=@=A;BC7DE7FGHIH 2
  3. #ゆるWeb札幌 英語学習アプリ リスニングも英作文も スピーキング?もトレーニング できる優れもの ポイント取得条件やランキングが いい具合で設定されてて ゲーム感覚でも楽しめる 登録できる友達がいないので やってる人いたら

    gishi_yama で 登録してください... JKLM3NOPQ 3
  4. #ゆるWeb札幌 RST$U; VWXYWZ[\[\]3N[^; _`abc[N[def 4 あっ、今日はわりと真面目なLTします

  5. #ゆるWeb札幌 ghij$]3N[4!"klhmXno(pqrs 5 学生が一つの教室に たくさんいると、 変動が大きくて みてても楽しい ☺ オンライン授業で 誰もいない教室に

    センサーおいても 変動がなくて たのしくない (ずっと700ppmのまま) 😰 Wio-Nodeで CO2センサーの APIを作って、 学生が叩く 学生の自宅で CO2センサーを 用意してもらうのは 現実的じゃない 💸
  6. #ゆるWeb札幌 tuavw$xy'z{1#|}~$; •€•,Yn$‚ƒ„…†a‡Nˆ‰N; PŠ\‹#|eOŒPZ•OŽr•• ‘$’$“”Z•N; •–—˜•'*+,1VWXYW™šZ• o(pa›œ†Z••ž'PQ 6 🤔

  7. #ゆるWeb札幌 Fitbit LLCによる、 心拍数、運動量、それを元にした睡眠スコアなどを 記録してくれるスマートトラッカー (スマートウォッチ版もある) 2014年には、当時発売された AppleWatch と 比較されつつ、身につけている人も増えてきてた感がある

    個人的には ・電池の保ち ・軽さ ・APIデータアクセス可能な点 を重視して、Fitbitを使ってきた •ž[Ÿ ¡7:¢7:brN4‹Ž34‚ 7
  8. #ゆるWeb札幌 £žš¤ž 8 OAuth2 Fitbitアプリ 私のFitbit 私のスマホ Bluetooth Wi-Fi/4G 在宅の学生

    (プログラミング初心者) Vanilla JS+C3.js 自作のデータ提供サーバー (Java/SpringBoot) HTTP/WebSocket 認証 1日の私 HTTP (Web-API) どんな活動してても 心拍数は 24h 変化のある データがとれる 心拍数提供 ここまでは Fitbit側が 勝手にやってくれる スケジューリングと キャッシュで 御行儀よく取得した い Fitbitサーバー
  9. #ゆるWeb札幌 ¥¦I9 9

  10. #ゆるWeb札幌 LTなので、作ってる最中に個人的に思い通りにいった・いかなかった要点だけをさらっと紹介 ソースコードは https://github.com/gishi-yama/fitbit-api-proxy です。 (application.yaml の clientId, clientSecret, callbackURLを各自設定すれば動きます)

    紹介したい内容: 1. OAuth2の設定と接続には ScribeJava を使うと便利 2. JSONのデシリアライズにはJava 17 Records 使うと便利 3. データの更新スケジューリングと簡易のキャッシュはSpringBootがやっぱり便利 4. WebSocketにしようと思ったけどRESTでもよかった(反省) *+,-./+0Q§¨ 10
  11. #ゆるWeb札幌 ©=ª:E«Q¬-„®¯$R; °±87¢¦²H³H;1´ž„µ¶ 11

  12. #ゆるWeb札幌 Spring + OAuth2 だとSpring Security があげられるが、 慣れてないとOAuth2 プロパイダーにあわせて設定&テストするのは結構めんどう... ScribeJava

    (https://github.com/scribejava/scribejava)を使うと、 50種類ぐらいのプロパイダに簡単に接続できるらしく、良い感じだった。 Springを使ってない時や、Springでも統合認証する必要がなければおすすめかも? ©=ª:E«Q¬-„®¯$R;°±87¢¦²H³H;1´ž„µ¶ 12 Fitbit側で生成・登録された情報で手軽に使える
  13. #ゆるWeb札幌 13 Fitbit APIの利用前に必要な処理例 (OAuth2クライアントの準備) ·7:¢7:;=¸¹Q¶#$º_'»¼Q½¾¿À (認証URLの発効) (アクセスコードからトークンを取得)

  14. #ゆるWeb札幌 ·7:¢7:;=¸¹Q¶#$º_'»¼Q½¾«À 14 (トークンの更新:トークン発効後の8時間以内に実施) (トークンを使ってWEBI-APIにアクセス)

  15. #ゆるWeb札幌 ²°©ÁQ*•€XYÃ$R• ²H³H;¿Ä;Ŧ±98ÆD;´ž„µ¶ 15

  16. #ゆるWeb札幌 Fitbitサーバーから取得されたJSONをデシリアライズして、必要なJSONデータを作りたい... ⇒ JavaではJacksonなどのデシリアライズライブラリと、 JSON階層にあわせてマッピング用のクラスを作るのがセオリー ⇒ マッピング用のクラス作るのがめんどくさい...(Javaは冗長だよねと言われる一端) ²°©ÁQ*•€XYÃ$R²H³H;¿Ä;Ŧ±98ÆD;´ž„µ¶ 16 クラス3(

    クラス2をもつ ) クラス2( クラス1のリストをもつ ) クラス1( time, valueをもつ )
  17. #ゆるWeb札幌 Java 17 の Records を使うと、1行で Value Object 用のクラスを用意できる ⇒

    クラスの数は変わらないが、クラスのために必要な行数は格段に減った ²°©ÁQ*•€XYÃ$R²H³H;¿Ä;Ŧ±98ÆD;´ž„µ¶ 17
  18. #ゆるWeb札幌 *+,QÇÈÉÊ—Ë+•Wm„• %&QÌÍÎÂËR• °Ï87ÐCÑ99:a]3Òƒµ¶ 18

  19. #ゆるWeb札幌 複数の学生が同時にデータを取得しようとしたときに、Fitbit側に負荷をかけたくない... トークンも8時間以内に更新しないとアクセスが継続できない... SpringBootだと、アノテーションをつけるだけでOK *+,QÇÈÉÊ—Ë+•Wm„%&QÌÍÎÂËR°Ï87ÐCÑ99:a]3Òƒµ¶ 19

  20. #ゆるWeb札幌 @¦¢°9±Ó¦:$š¤ž„Ô34rÕ• ÅÖ°×ZP¤Ø34kÙÚs 20

  21. #ゆるWeb札幌 これで私の心拍数が刻々と配信されるぜー! と思ったらそうでもなかった 1. Fitbitアプリが起動していないと、リアルタイムに心拍数を取得しない @¦¢°9±Ó¦:$š¤ž„Ô34rÕÅÖ°×ZP¤Ø34kÙÚs 21 Bluetooth Fitbitアプリ Bluetooth通信をリアルタイムに行うためには、 Fitbitアプリが(バックグラウンドでも)動いている

    ことが必要 ⇒ スワイプの手癖でアプリを終了してしまう スマホ側の オートメーションで とにかく常時起動の きっかけを作る (頻繁に確認されるので  かなり煩わしい) スマホアプリが 起動していないと、 Fitbit側に蓄積される だけで、アプリに 送信されない
  22. #ゆるWeb札幌 これで私の心拍数が刻々と配信されるぜー! と思ったらそうでもなかった 2. そもそも、Fitbitアプリ自体から、Fitbitサーバーまでの反映が15分-20分ごとだった @¦¢°9±Ó¦:$š¤ž„Ô34rÕÅÖ°×ZP¤Ø34kÙÚs 22 "...when an active Bluetooth

    connection is available, Fitbit's apps will show the summary values displayed on the device. Often, this data has not yet synced with Fitbit's servers." Fitbitアプリ 私のスマホ Wi-Fi/4G Fitbitサーバー 15-20分に一回同期 WebSocketの 意味なし --- https://dev.fitbit.com/build/reference/web-api/devices/ "Fitbit devices automatically sync every 15–20 minutes. The data is then processed server side and available via the Fitbit API. There is no live data exposed via Bluetooth." --- https://community.fitbit.com/t5/Web-API-Development/ Fitbit-Charge-HR-realtime-data/m-p/697877#M1451 作る前に下調べはしっかりしよう
  23. #ゆるWeb札幌 Û‚ƒ$ 23 可視化した結果から、被験者(山川)への健康へのアドバイス(ユーザーローカルAIテキストマイニングで分析) 概ね、学生が「フィジカルデータから被験者の生活を把握する」IoTサービスを体験できたのでは