SlideShare a Scribd company logo
Submit Search
Upload
僕らのデータ同期プラクティス
Report
Yukiya Nakagawa
Mobile App Developer at ウォーターセル株式会社 / WaterCell Inc.
Follow
•
24 likes
•
24,165 views
1
of
40
僕らのデータ同期プラクティス
•
24 likes
•
24,165 views
Download Now
Download to read offline
Report
Technology
2015年4月25日に行われたDroidKaigiでの発表資料です。
Read more
Yukiya Nakagawa
Mobile App Developer at ウォーターセル株式会社 / WaterCell Inc.
Follow
Recommended
オンラインゲームの仕組みと工夫
Yuta Imai
869.6K views
•
56 slides
インタフェース完全に理解した
torisoup
6K views
•
39 slides
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
Game Tools & Middleware Forum
5.9K views
•
64 slides
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
Unity Technologies Japan K.K.
26.8K views
•
121 slides
WebRTCの技術解説 公開版
Contest Ntt-west
46.7K views
•
267 slides
Unityネイティブプラグインの勧め
KLab Inc. / Tech
3K views
•
48 slides
More Related Content
What's hot
ネットワーク ゲームにおけるTCPとUDPの使い分け
モノビット エンジン
18.5K views
•
63 slides
Airflowで真面目にjob管理
msssgur
809 views
•
28 slides
WebRTC SFU mediasoup sample
mganeko
5.1K views
•
21 slides
5分でわかる Sensor SDK
UnityTechnologiesJapan002
3K views
•
13 slides
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
Manabu Koga
102.6K views
•
145 slides
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
63K views
•
82 slides
What's hot
(20)
ネットワーク ゲームにおけるTCPとUDPの使い分け
モノビット エンジン
•
18.5K views
Airflowで真面目にjob管理
msssgur
•
809 views
WebRTC SFU mediasoup sample
mganeko
•
5.1K views
5分でわかる Sensor SDK
UnityTechnologiesJapan002
•
3K views
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
Manabu Koga
•
102.6K views
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
•
63K views
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
•
48.1K views
Unityで PhotonCloudを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【導入編】
GMO GlobalSign Holdings K.K.
•
28K views
サポート エンジニアが語る、トラブルを未然に防ぐための Azure インフラ設計
ShuheiUda
•
1.2K views
Photonのサービス選択の勘どころ
GMO GlobalSign Holdings K.K.
•
4.6K views
GPU最適化入門
Takahiro KOGUCHI
•
19.3K views
iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine
GMO GlobalSign Holdings K.K.
•
24.9K views
Dll Injection
Hiroaki Hata
•
3.8K views
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Yoshifumi Kawai
•
4.8K views
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
Yoshiki Shibukawa
•
18.5K views
Imprementation of realtime_networkgame
Satoshi Yamafuji
•
20.1K views
ネットワーク ゲームにおけるTCPとUDPの使い分け
モノビット エンジン
•
61.4K views
サーバPUSHざっくりまとめ
Yasuhiro Mawarimichi
•
39.5K views
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
Unity Technologies Japan K.K.
•
4.6K views
Keycloakの実際・翻訳プロジェクト紹介
Hiroyuki Wada
•
148.2K views
Similar to 僕らのデータ同期プラクティス
デブサミ関西2011 JAZ紹介
Keiji Kamebuchi
484 views
•
19 slides
垣根のないモノ作り!
Yuka Tokuyama
1.1K views
•
58 slides
北陸エンジニアず 自己紹介資料
Yuuki Kojima
1.7K views
•
22 slides
Androidとインターネット連携
高見 知英
1.2K views
•
32 slides
iPhone/Android アプリをまとめて省エネ開発する技術
vaccho
1.6K views
•
30 slides
Android IoTとプログラミング教育
Kenichi Yoshida
2K views
•
46 slides
Similar to 僕らのデータ同期プラクティス
(20)
デブサミ関西2011 JAZ紹介
Keiji Kamebuchi
•
484 views
垣根のないモノ作り!
Yuka Tokuyama
•
1.1K views
北陸エンジニアず 自己紹介資料
Yuuki Kojima
•
1.7K views
Androidとインターネット連携
高見 知英
•
1.2K views
iPhone/Android アプリをまとめて省エネ開発する技術
vaccho
•
1.6K views
Android IoTとプログラミング教育
Kenichi Yoshida
•
2K views
Io t最初の一歩
Tsubasa Yoshino
•
508 views
Cloud9のはじめかた
Koichiro Oki
•
405 views
ネイティブ原理主義
Kentarou Mukunasi
•
1.5K views
Global Solution Unit
Jun Saito
•
351 views
ロボットアプリ開発におけるNode-REDの活用
岡田 裕行
•
995 views
開発を効率的に進めるられるまでの道程
Takao Sumitomo
•
27.4K views
EDIX2015 デジタル教科書の未来と学校ICT
Naoki Kato
•
666 views
【Tokyowebmining】open compute project
Junichiro Tani
•
5.2K views
香川支部キックオフ 香川支部について
yohei iwakura
•
480 views
IoTで5days学生インターン
Kazuya Fukumoto
•
1.5K views
第1回八子クラウドナイト事前配布・趣旨説明資料です。 20170714
知礼 八子
•
928 views
Microsoft AzureでスマホからIoTまで
Masaki Yamamoto
•
2.9K views
LoRa入門
akyamajo
•
619 views
Android Lintを覚えてベテラン開発者に追いつこう #ndsmeetup
Yukiya Nakagawa
•
2.7K views
More from Yukiya Nakagawa
Atomic Designは「マルチ」で真価を発揮する
Yukiya Nakagawa
2.4K views
•
72 slides
Androidの入門書を書いたときに気にしたこと #NDS57
Yukiya Nakagawa
1.2K views
•
32 slides
React Nativeの光と闇
Yukiya Nakagawa
9.2K views
•
93 slides
アグリノートにおけるGIS情報を活かした圃場・作付管理の取り組み @ FOSS4GJ
Yukiya Nakagawa
1.9K views
•
60 slides
React Native Androidはなぜ動くのか
Yukiya Nakagawa
11.2K views
•
144 slides
CSS in JSの話 #friday13json
Yukiya Nakagawa
1.1K views
•
23 slides
More from Yukiya Nakagawa
(20)
Atomic Designは「マルチ」で真価を発揮する
Yukiya Nakagawa
•
2.4K views
Androidの入門書を書いたときに気にしたこと #NDS57
Yukiya Nakagawa
•
1.2K views
React Nativeの光と闇
Yukiya Nakagawa
•
9.2K views
アグリノートにおけるGIS情報を活かした圃場・作付管理の取り組み @ FOSS4GJ
Yukiya Nakagawa
•
1.9K views
React Native Androidはなぜ動くのか
Yukiya Nakagawa
•
11.2K views
CSS in JSの話 #friday13json
Yukiya Nakagawa
•
1.1K views
React Nativeアプリをリリースし続けるために、最初に行う8つの取り組み
Yukiya Nakagawa
•
27.1K views
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
Yukiya Nakagawa
•
25.1K views
AndroidLint #DroidKaigi
Yukiya Nakagawa
•
16.6K views
Android再入門 〜Eclipseのことは忘れろ〜
Yukiya Nakagawa
•
4.4K views
もう一度Kotlinの話をしよう #ndsmeetup4
Yukiya Nakagawa
•
1.9K views
アグリノートを支える技術
Yukiya Nakagawa
•
9K views
NDS36 Kotlin Cute
Yukiya Nakagawa
•
3.6K views
NDS36 Java7&Java8
Yukiya Nakagawa
•
3.4K views
Coworking Business Forum in NIIGATA 2013
Yukiya Nakagawa
•
1.4K views
Niigata.rb#03
Yukiya Nakagawa
•
1.2K views
PechaKucha Niigata #3 2013.7.27
Yukiya Nakagawa
•
735 views
ぼくのかんがえたふつうのあんどろいどかいはつ
Yukiya Nakagawa
•
2K views
Androidで使えるJSON-Javaライブラリ
Yukiya Nakagawa
•
16.3K views
NFCLAB会津
Yukiya Nakagawa
•
823 views
Recently uploaded
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
157 views
•
63 slides
概念モデリングワークショップ 基礎編
Knowledge & Experience
19 views
•
71 slides
JJUG CCC.pptx
Kanta Sasaki
6 views
•
14 slides
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
Knowledge & Experience
6 views
•
34 slides
01Booster Studio ご紹介資料
ssusere7a2172
209 views
•
19 slides
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
208 views
•
33 slides
Recently uploaded
(8)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
•
157 views
概念モデリングワークショップ 基礎編
Knowledge & Experience
•
19 views
JJUG CCC.pptx
Kanta Sasaki
•
6 views
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
Knowledge & Experience
•
6 views
01Booster Studio ご紹介資料
ssusere7a2172
•
209 views
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
•
208 views
概念モデリングワークショップ 設計編
Knowledge & Experience
•
10 views
さくらのひやおろし2023
法林浩之
•
76 views
僕らのデータ同期プラクティス
1.
僕らのデータ同期プラクティス Nkzn@ウォーターセル株式会社 2015.4.25 DroidKaigi
2.
裏おもしろそう・・・・・!!! こっち来てくれた皆さんありがとうございます
3.
@Nkzn (なかざん) • 中川
幸哉 (28) • WaterCell Inc. @ Niigata • UIデザイナーとアーキテクトの狭間をうろう ろしている • 日本Androidの会 新潟支部(活動停止中)
4.
私とAndroid • 2009年:卒業研究でAndroid(HT-03A) • 2010年:日本Androidの会
新潟支部立ち上げ • 2011年:現職にJOINして農業者向けアプリ作り • 2013年:Eclipseと決別してAndroid Studioを導入
5.
感想文書いたら 結構話題になってビビった
6.
Where is your
user?
7.
Where is your
user?
8.
自社アプリをオフライン化 ∼試される大地∼
9.
弊社サービスについて • アグリノート http://www.agri-note.jp • 農業生産者向けの農作業管理システム •
Webブラウザ版、Androidアプリで提供 iOS版は開発準備中 • 農業版Redmineに近づいてる
11.
水稲/コシヒカリ ほ場:A-2 作業予定・記録 日付 作業項目 作業者・作業時間 農薬名・使用量 肥料名・使用量 機械 写真 メモ マスタデータと トランザクションデータ
12.
ファーストバージョン 2012年3月リリース。 画面開いた時にフェッチしてくるやーつ。 =電波がないところでは動かない
13.
30km (電波が) 試される大地
14.
気合で同期機能を実装する AlarmManager + IntentService
???
15.
同期処理に必要なもの • 定期的に、または何らかのキックにより • バックグラウンドで通信を行い •
アプリ内のDBを更新する
16.
2013年スタイル AlarmManager IntentService 頑張ってデータを ダウンロードしてきて INSERTする処理 Intent 定期的に実行
17.
れ出るつらみ • AlarmManagerがときどき消える • IntentServiceが連続で走って止まらない •
マルチスレッドでDB叩く状態に突入 • synchronized祭り • ネットワーク有無の検知のために割と頻繁に起動
18.
Androidが提供するデータ同期機能 AccountAuthenticator + SyncAdapter
+ ContentProvider
19.
AndroidManifest.xml SyncService xml/authenticator.xml <service> xml/sync_adapter.xml <service><provider> authorities ContentProvider SyncAdapter contentAuthority accountType accountType onPerformSync() 同期処理を実装 SyncAdapter利用の最小構成
クラス ファイル パラメータ 凡例: AuthenticationService AccountAuthenticator
20.
本当に大事なのは onPerformSyncの中で何をするか public class SyncAdapter
extends AbstractThreadedSyncAdapter { // ... @Override public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { /* Elegant Synchronization */ } // ... }
21.
設計を分けれるの嬉しい ContentProvider SQLite Data Access Object UI付近のコード
SyncAdapter API Client AccountAuthenticator AccountManager
22.
使ってる人が少ない気がする
23.
ドキュメンテッドになったのが 割と最近? 2013年まで公式ドキュメントなかったっぽ い・・・?(Web Archive調べ)
25.
突然情報が出始めた 2009年 2010年 2011年
2012年 2013年 2014年 Android 2.0 Google I/Oで言及 50 Android Hacks 公式ドキュメントが公開? 50 Android Hacks日本語版 mixi-inc/AndroidTraining 弊社もこの頃から 触り始めた
26.
同期アルゴリズムの検討
27.
参考にした資料 • 50 Android
Hacksのサンプルコード • https://github.com/Macarse/50AH-code/ • Hack 23(Pythonサーバー付き) • Evernote Synchronization via EDAM • https://dev.evernote.com/intl/jp/doc/articles/ synchronization.php • https://github.com/ninjinkun/EDAMSync/blob/master/EDAM- Japanese.md (日本語訳)
28.
採用した仕組み • Full Sync,
Incremental Sync • StatusFlag("dirty" flag)
29.
Full Sync, Incremental
Sync サーバー クライアント 1 2 3 1 2 3 1 2 3 1 2 3 Full Sync Incremental Sync
30.
差分を請求する id data modified_at 1
hoge 10:00 2 fuga" 12:00 3 piyo" 15:00 4 hogehoge" 20:00 http://hoge/hoge?modified_after=13:00 last_fetched = 13:00
31.
StatusFlag ("dirty" flag) 未同期のクライアント環境でデータに変更が あったことを表すフラグ
32.
4つのStatus CLEAN サーバーから受け取ったままの状態 ADD 新規に作成された (まだクライアント側にしかない) MOD サーバーから受け取ったものに変更を施した DELETE
サーバーから受け取ったものを削除した
33.
同期の流れ
34.
同期の流れ 1. データのダウンロードを行う • 初回はFull
Sync, 2回目以降はIncremental Sync 2. サーバーで削除されていたデータをクライアントでも削除する 3. サーバーで更新されていたデータをクライアントでも更新する 4. クライアント側で作成(ADD)・更新(MOD)・削除(DELETE)されたデータ をサーバへ送信する 5. 送信が済んだデータのStatusFlagをCLEANにする 6. last_fetchedを1の時刻に更新する
35.
競合問題 > 2. サーバーで削除されていたデータをクライアントでも削除する >
3. サーバーで更新されていたデータをクライアントでも更新する 同じデータの削除や更新がサーバーとクライアント両方で行われてい た場合、競合する
36.
対応策 • 常にサーバー側が勝つ • 送信を諦める •
常にクライアント側が勝つ • サーバーからのデータを捨てる • クライアント側でマージしてからサーバーへ送る • なんとか全部生かす Evernoteはこれ アグリノートはこれ
37.
同期パターンの確認
39.
まとめ • mixi-inc/AndroidTrainingでSyncAdapterを勉強して • 50AHでSyncAdapterのサンプルを知って •
EDAMの理屈を参考にして同期の仕組みを考える • 競合解決の方針はそのサービスのポリシー次第
40.
最後に ウォーターセル株式会社では、地球人口100億の時 代に見合う食料生産のための農業革命を一緒に引っ 張っていってくれるAndroid/iOSエンジニアを探し ています。