Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
storeLive をスーパーで 動かし続けるためにやったこと/What we did to ...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Naoya Shibahara
January 30, 2020
Programming
710
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
storeLive をスーパーで 動かし続けるためにやったこと/What we did to keep storeLive running at supermarkets
Naoya Shibahara
January 30, 2020
More Decks by Naoya Shibahara
See All by Naoya Shibahara
WorkManager のすすめ / Recommendation of WorkManager
nshiba
0
1.2k
cookpadTV マルチモジュール化について/Multi modularization in cookpadTV
nshiba
1
6.4k
FireTVことはじめ
nshiba
2
5.2k
Other Decks in Programming
See All in Programming
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
190
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
340
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
540
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
5k
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
2
680
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
6.2k
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
540
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
140
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
350
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
340
Featured
See All Featured
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
390
The Curse of the Amulet
leimatthew05
1
13k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
460
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
330
The Spectacular Lies of Maps
axbom
PRO
1
810
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
180
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
590
What's in a price? How to price your products and services
michaelherold
247
13k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Transcript
storeLive をスーパーで 動かし続けるためにやったこと Cookpad Tech Kitchen #23 2020/01/30 Naoya Shibahara
自己紹介 • 柴原 直也 • メディアプロダクト開発部 ◦ 2018年新卒入社 • Android
アプリ開発エンジニア • Kotlin 2 梨原 @nshiba310 nshiba
今日話すこと • storeLive について • storeLive を動かし続けるためにやったこと ◦ データの自動更新(Android) ◦
オフライン対応(Android) ◦ 端末の状態把握(AWS IoT) • 今後やりたいこと 3 Android 固有の話が多めになります
storeLive 4
storeLive とは • スーパー等の店頭に設置する縦型55インチの 大型サイネージ • 収録された映像を再生するだけではなく、 Live配信に対応 • 買い物客が、料理デモンストレーションLive
に出演している著名人と大画面でリアルタイ ムでコミュニケーションが行える仕組み • OS は AndroidTV 5
やったこと データの自動更新 オフライン対応 端末の状態把握 6
データの自動更新 7 ユーザーの操作があるのは動画を切り替えるタイミングだけ 次の動画の切替まで選択した動画をループで再生し続ける
動画の自動更新 8
自動更新実装方法 • 特定のAPIを叩くポーリングを実装 ◦ デフォルトの間隔は10分 ◦ 取得したデータは DB に保存 •
API レスポンスに次回の実行時間が含まれていた場合にはそちらを優先 ◦ 例:ライブ配信15分前〜ライブ配信終了までは1分間隔でポーリングを 行いたいため • ポーリングは AlarmManager で実装 ◦ WorkManager は最小実行間隔が15分のため今回は使えませんでした 9
やったこと データの自動更新 オフライン対応 端末の状態把握 10
ネットワークが 不安定 11
オフライン対応 • ネットワークが原因でアプリが動かない、とお問い合わせが頻繁にあった • ポーリングや動画再生など、ユーザーの操作がない場面でネットワークが必 要になるので、単純に再読み込みボタンは置くだけでは対処できない場合が 多い • 端末は固定されていて動かせないのでネットワーク状況が良い場所に移動す る、というのはNG
• Room + LiveData を使って実装 12
Room + LiveData • Room ◦ 取得したデータを DB に保存するのに使用 ◦
基本的に取得した全てのデータは DB に保存します ◦ https://developer.android.com/topic/libraries/architecture/room • LiveData ◦ 動画再生中にデータの変更を通知する手段として使用 ◦ ポーリングで取得したデータを LiveData を使って通知します ◦ https://developer.android.com/topic/libraries/architecture/livedata 13
Room + LiveData 14
Room + LiveData 15
Room + LiveData 16
Room + LiveData 17
Room + LiveData 18
表示期間 19
表示期間 20 オフラインなので情報の取得ができなく て動画の更新ができない
表示期間 21 WHERE starts_at <= :date AND :date < ends_at
問題点 その1 22 WHERE starts_at <= :date AND :date <
ends_at onCreate で一度だけ LiveData を observe するだけだと observe した時刻でずっと比較されてしまう
問題点 その2 23 API Request に失敗するので DB にデータが Insert されず
Activity に動画の更新が通知されない
24 class MainActivity: AppCompatActivity() { @Inject lateinit var movieDao: MovieDao
private val queryTime = MutableLiveData<ZonedDateTime>(ZonedDateTimeUtils.now()) val availableMovies: LiveData<List<Movie>> = Transformations.switchMap(queryTime) { movieDao.selectAvailableMovies(it) } override fun onCreate(savedInstanceState: Bundle?) { availableArticles.observe(this, Observer { articles -> // update() method を叩くと、ここに新しいデータが来る } } fun update() { // ZonedDateTimeUtils.now().formatString() は現在時刻を String で返す viewModel.queryTime.value = ZonedDateTimeUtils.now() } }
やったこと データの自動更新 オフライン対応 端末の状態把握 25
課題 • もともとログのみで端末の状態を把握していた ◦ お問い合わせがあったらエンジニアが都度クエリして共有 ◦ インターネット接続されているかの確認や正常に動画が再生されている かどうかの確認も • 都度クエリをするのはコストが高く、事業側もエンジニアに確認しないとい
けないので、素早く確認ができない 26
端末の状態把握 • 素早く、目で見て確認したい • ちょうど storeTV という別のアプリで端末の監視/遠隔操作を実現するため にMDMを内製中だった • 当初は
storeLive でこの MDM を利用する想定はなかったが、 storeLive でも端末の監視/遠隔操作したいという気持ちが高まったので導入 • MDM は AWS IoT を用いて実装されている 27
AWS IoT 28
AWS IoTで出来ること • Thing(モノ)という単位でデバイスを管理 • MQTTを使ってデバイスと通信(JSON) • グループを使った端末の管理 • 接続状態の監視
• ルールアクションでAWSサービスとの連携 • Jobによるタスク管理 • デバイスシャドウによる端末状態の管理 29
MDM でやってることの紹介 • MQTT メッセージを使った端末操作 ◦ 再起動、初期化、スクリーンショット送信 • ルールアクションを使った端末状態の取得 ◦
接続状態、バッテリー状態、ストレージ容量など • ジョブを使ったアプリの自動アップデート 30
MQTTメッセージを使った端末操作 31
MQTTメッセージを使った端末操作 32 管理画面 Subscribe: store-tv/production/cmd/reboot/thing1 Subscribe: store-tv/production/cmd/reboot/thing2 AWS IoT
MQTTメッセージを使った端末操作 33 管理画面 AWS IoT Subscribe: store-tv/production/cmd/reboot/thing1 Subscribe: store-tv/production/cmd/reboot/thing2 Publish:
store-tv/production/cmd/reboot/thing1 `
ルールアクションを使った端末状態の取得 34
ルールアクション • 指定のTopicにメッセージが来たときにAWSサービスを連携させることがで きる • Topicを指定するにはSELECT文のようなものを書く ◦ SELECT * FROM
'store-tv/production/data/device-info/#' • 端末は該当の Topic へ端末の状態を Publish 35
ルールアクションを使った端末状態の取得 36 n 分に1回 Publish ・OS/アプリバージョン ・バッテリー状態 ・ストレージ容量 ・などなど AWS
IoT Kinesis Lambda DynamoDB ルールアクション SELECT * FROM 'store-tv/production/data/device-info/#'
ジョブを使ったアプリのアップデート 37
ジョブ • Thing やグループに対して一連の操作を行うことができる • 端末はジョブ専用の Topic を Subscribe しておく
◦ $aws/things/{Thing名}/jobs/notify-next など • ジョブのステータスを更新して進捗を管理できる ◦ 進行中、成功、失敗など • 成功 or 失敗するまでジョブは残ってる 38
ジョブを使ったアプリのアップデート 39 動的グループ AWS IoT 管理画面 S3 予めAPKを アップロードしておく
ジョブを使ったアプリのアップデート 40 動的グループ AWS IoT 管理画面 S3 ジョブ メッセージ ダウンロードURL
が入ってる 予めAPKを アップロードしておく
ジョブを使ったアプリのアップデート 41 動的グループ AWS IoT 管理画面 S3 ジョブ メッセージ ジョブ
メッセージ ダウンロードURL が入ってる 予めAPKを アップロードしておく
ジョブを使ったアプリのアップデート 42 動的グループ AWS IoT 管理画面 S3 ジョブ メッセージ ジョブ
メッセージ APKファイルダウンロード ダウンロードURL が入ってる 予めAPKを アップロードしておく
ジョブを使ったアプリのアップデート 43 動的グループ AWS IoT 管理画面 S3 ジョブ メッセージ ジョブ
メッセージ ジョブのステータスを更新 成功 or 失敗 APKファイルダウンロード ダウンロードURL が入ってる 予めAPKを アップロードしておく
今後やりたいこと • まだ、ネットワークが原因でお問い合わせをいただくことがあるので、さら に安定性を高めていきたい • 差込動画や強制動画はポーリングを使って更新しているのを、 AWS IoT の デバイスシャドウを使って更新するようにしたい
◦ まだ、デバイスシャドウに移行したときのメリット/デメリットは調べ きれてないので、まだ検討中 44