Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

#ゆる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

Slide 3

Slide 3 text

#ゆるWeb札幌 英語学習アプリ リスニングも英作文も スピーキング?もトレーニング できる優れもの ポイント取得条件やランキングが いい具合で設定されてて ゲーム感覚でも楽しめる 登録できる友達がいないので やってる人いたら gishi_yama で 登録してください... JKLM3NOPQ 3

Slide 4

Slide 4 text

#ゆるWeb札幌 RST$U; VWXYWZ[\[\]3N[^; _`abc[N[def 4 あっ、今日はわりと真面目なLTします

Slide 5

Slide 5 text

#ゆるWeb札幌 ghij$]3N[4!"klhmXno(pqrs 5 学生が一つの教室に たくさんいると、 変動が大きくて みてても楽しい ☺ オンライン授業で 誰もいない教室に センサーおいても 変動がなくて たのしくない (ずっと700ppmのまま) 😰 Wio-Nodeで CO2センサーの APIを作って、 学生が叩く 学生の自宅で CO2センサーを 用意してもらうのは 現実的じゃない 💸

Slide 6

Slide 6 text

#ゆるWeb札幌 tuavw$xy'z{1#|}~$; •€•,Yn$‚ƒ„…†a‡Nˆ‰N; PŠ\‹#|eOŒPZ•OŽr•• ‘$’$“”Z•N; •–—˜•'*+,1VWXYW™šZ• o(pa›œ†Z••ž'PQ 6 🤔

Slide 7

Slide 7 text

#ゆるWeb札幌 Fitbit LLCによる、 心拍数、運動量、それを元にした睡眠スコアなどを 記録してくれるスマートトラッカー (スマートウォッチ版もある) 2014年には、当時発売された AppleWatch と 比較されつつ、身につけている人も増えてきてた感がある 個人的には ・電池の保ち ・軽さ ・APIデータアクセス可能な点 を重視して、Fitbitを使ってきた •ž[Ÿ ¡7:¢7:brN4‹Ž34‚ 7

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

#ゆるWeb札幌 ¥¦I9 9

Slide 10

Slide 10 text

#ゆる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

Slide 11

Slide 11 text

#ゆるWeb札幌 ©=ª:E«Q¬-„®¯$R; °±87¢¦²H³H;1´ž„µ¶ 11

Slide 12

Slide 12 text

#ゆるWeb札幌 Spring + OAuth2 だとSpring Security があげられるが、 慣れてないとOAuth2 プロパイダーにあわせて設定&テストするのは結構めんどう... ScribeJava (https://github.com/scribejava/scribejava)を使うと、 50種類ぐらいのプロパイダに簡単に接続できるらしく、良い感じだった。 Springを使ってない時や、Springでも統合認証する必要がなければおすすめかも? ©=ª:E«Q¬-„®¯$R;°±87¢¦²H³H;1´ž„µ¶ 12 Fitbit側で生成・登録された情報で手軽に使える

Slide 13

Slide 13 text

#ゆるWeb札幌 13 Fitbit APIの利用前に必要な処理例 (OAuth2クライアントの準備) ·7:¢7:;=¸¹Q¶#$º_'»¼Q½¾¿À (認証URLの発効) (アクセスコードからトークンを取得)

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

#ゆるWeb札幌 Java 17 の Records を使うと、1行で Value Object 用のクラスを用意できる ⇒ クラスの数は変わらないが、クラスのために必要な行数は格段に減った ²°©ÁQ*•€XYÃ$R²H³H;¿Ä;Ŧ±98ÆD;´ž„µ¶ 17

Slide 18

Slide 18 text

#ゆるWeb札幌 *+,QÇÈÉÊ—Ë+•Wm„• %&QÌÍÎÂËR• °Ï87ÐCÑ99:a]3Òƒµ¶ 18

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

#ゆるWeb札幌 これで私の心拍数が刻々と配信されるぜー! と思ったらそうでもなかった 1. Fitbitアプリが起動していないと、リアルタイムに心拍数を取得しない @¦¢°9±Ó¦:$š¤ž„Ô34rÕÅÖ°×ZP¤Ø34kÙÚs 21 Bluetooth Fitbitアプリ Bluetooth通信をリアルタイムに行うためには、 Fitbitアプリが(バックグラウンドでも)動いている ことが必要 ⇒ スワイプの手癖でアプリを終了してしまう スマホ側の オートメーションで とにかく常時起動の きっかけを作る (頻繁に確認されるので  かなり煩わしい) スマホアプリが 起動していないと、 Fitbit側に蓄積される だけで、アプリに 送信されない

Slide 22

Slide 22 text

#ゆる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 作る前に下調べはしっかりしよう

Slide 23

Slide 23 text

#ゆるWeb札幌 Û‚ƒ$ 23 可視化した結果から、被験者(山川)への健康へのアドバイス(ユーザーローカルAIテキストマイニングで分析) 概ね、学生が「フィジカルデータから被験者の生活を把握する」IoTサービスを体験できたのでは