SlideShare a Scribd company logo
Implementing data
synchronization API for
mobile apps
Michele Orselli
CTO@Ideato
micheleorselli / ideatosrl
_orso_
mo@ideato.it
Agenda
scenario design choices
implementation alternative approaches
Dealing with conflicts
A1
A2
?
Brownfield project
several mobile apps for tracking user generated
data (calendar, notes, bio data)
iOS & Android
~10 K users steadily growing at 1.2 K/month
Scenario
MongoDB
Legacy App based on Codeigniter
Existing RPC-wannabe-REST API for data sync
Scenario
For every resource
get updates:
POST /m/:app/get/:user_id/:res/:updated_from
create/send updates:
POST /m/:app/update/:user_id/:res_id/:dev_id/:res
Scenario
api
~6 different resources, ~12 calls per sync
apps sync by polling every 30 sec
every call sync little data
Scenario
Rebuild sync API for old apps + 2 incoming
Enable image synchronization
More efficient than previous API
Challenge
Existing Solutions
Tstamps,
Vector clocks,
CRDTs
syncML,
syncano
Azure Data
sync
Algorithms Protocols/API
Platform
couchDB,
riak
Storage
Not Invented Here?
Don't Reinvent The Wheel,
UnlessYou Plan on Learning More About Wheels
J. Atwood
2 different mobile platforms
Several teams with different skill level
Changing storage wasn’t an option
Forcing a particular technology client side wasn’t
an option
Architecture
Architecture
c1
server
c2
c3
sync logic
conflicts resolution
thin clients
In the sync domain all resources are managed in
the same way
Implementation
For every app:
one endpoint for getting new data
one endpoint for pushing changes
one endpoint for uploading images
Implementation
GET /apps/:app/users/:user_id/changes[?from=:from]
POST /apps/:app/users/:user_id/merge
POST /upload/:res_id/images
The new APIs
Silex Implementation
Silex Implementation
Col 1
Col 2
Col 3
Silex Implementation
Col 1
Col 2
Col 3
Sync Service
Silex Implementation
Col 1
Col 2
Col 3
Sync Service
Silex Implementation
Col 1
Col 2
Col 3
Sync Service
Silex Implementation
Col 1
Col 2
Col 3
Sync Service
Silex Implementation
Col 1
Col 2
Col 3
Sync Service
Silex Implementation
$app->get(“/apps/{mApp}/users/{userId}/merge”,
function ($mApp, $userId, $app, $request)
{
$lastSync = $request->get('from', null);
$data = $request->get(‘data’, false);
$syncService = $app[‘syncService’];
$syncService->merge($data, $lastSync, $userId);
$response = new JsonResponse(
$syncService->getResult()
);
return $response;
}
Silex Implementation
$app->get(“/apps/{mApp}/users/{userId}/merge”,
function ($mApp, $userId, $app, $request)
{
$lastSync = $request->get('from', null);
$data = $request->get(‘data’, false);
$syncService = $app[‘syncService’];
$syncService->merge($data, $lastSync, $userId);
$response = new JsonResponse(
$syncService->getResult()
);
return $response;
}
Silex Implementation
$app->get(“/apps/{mApp}/users/{userId}/merge”,
function ($mApp, $userId, $app, $request)
{
$lastSync = $request->get('from', null);
$data = $request->get(‘data’, false);
$syncService = $app[‘syncService’];
$syncService->merge($data, $lastSync, $userId);
$response = new JsonResponse(
$syncService->getResult()
);
return $response;
}
Silex Implementation
$app->get(“/apps/{mApp}/users/{userId}/merge”,
function ($mApp, $userId, $app, $request)
{
$lastSync = $request->get('from', null);
$data = $request->get(‘data’, false);
$syncService = $app[‘syncService’];
$syncService->merge($data, $lastSync, $userId);
$response = new JsonResponse(
$syncService->getResult()
);
return $response;
}
Silex Implementation
$app->get(“/apps/{mApp}/users/{userId}/merge”,
function ($mApp, $userId, $app, $request)
{
$lastSync = $request->get('from', null);
$data = $request->get(‘data’, false);
$syncService = $app[‘syncService’];
$syncService->merge($data, $lastSync, $userId);
$response = new JsonResponse(
$syncService->getResult()
);
return $response;
}
Silex Implementation
$app['mongodb'] = new MongoDb(…);
$app[‘changesRepo’] = new ChangesRepository(
$app[‘mongodb’]
);
$app[‘syncService’] ? new SyncService(
$app[‘changesRepo’]
);
GET /apps/:app/users/:user_id/changes?from=:from
Get changes
timestamp?
timestamp are inaccurate
server suggests the “from” parameter to be used
in the next request
Server suggest the sync time
Server suggest the sync time
c1 server
GET /changes
{ ‘next’ : 12345,
‘data’: […] }
Server suggest the sync time
c1 server
GET /changes
{ ‘next’ : 12345,
‘data’: […] }
GET /changes?from=12345
{ ‘next’ : 45678,
‘data’: […] }
data format
{id:‘1’, ’type’:‘measure’,‘_deleted’: true}
{id: 2’,‘type’:‘note’}
{id:‘3’,‘type’:‘note’}
ps: soft delete all the things!
what to transfer
How do we generate an unique id in a distributed
system?
unique identifiers
How do we generate an unique id in a distributed
system?
UUID (RFC 4122): several implementations in PHP
(https://github.com/ramsey/uuid)
unique identifiers
How do we generate an unique id in a distributed
system?
Local/Global Id: only the server generates GUIDs
clients use local ids to manage their records
unique identifiers
unique identifiers
c1 server
POST /merge
{ ‘data’: [
{’lid’:‘1’, …},
{‘lid’:‘2’, …}
] }
{ ‘data’: [
{‘guid’:‘58f0bdd7-1400’, ’lid’:‘1’, …},
{‘guid’:‘6f9f3ec9-1400’,‘lid’:‘2’, …}
] }
mobile generated data are “temporary” until sync
to server
server handles conflicts resolution
conflict resolution algorithm (plain data)
conflict resolution:
domain indipendent: e.g. last-write wins
domain dipendent: use domain knowledge to
resolve
conflict resolution algorithm (plain data)
function sync($data) {
foreach ($data as $newRecord) {
$s = findByGuid($newRecord->getGuid());
if (!$s) {
add($newRecord);
send($newRecord);
continue;
}
if ($newRecord->updated > $s->updated) {
update($s, $newRecord);
send($newRecord);
continue;
}
updateRemote($newRecord, $s);
}
conflict resolution algorithm (plain data)
function sync($data) {
foreach ($data as $newRecord) {
$s = findByGuid($newRecord->getGuid());
if (!$s) {
add($newRecord);
send($newRecord);
continue;
}
if ($newRecord->updated > $s->updated) {
update($s, $newRecord);
send($newRecord);
continue;
}
updateRemote($newRecord, $s);
}
conflict resolution algorithm (plain data)
function sync($data) {
foreach ($data as $newRecord) {
$s = findByGuid($newRecord->getGuid());
if (!$s) {
add($newRecord);
send($newRecord);
continue;
}
if ($newRecord->updated > $s->updated) {
update($s, $newRecord);
send($newRecord);
continue;
}
updateRemote($newRecord, $s);
}
conflict resolution algorithm (plain data)
no conflict
function sync($data) {
foreach ($data as $newRecord) {
$s = findByGuid($newRecord->getGuid());
if (!$s) {
add($newRecord);
send($newRecord);
continue;
}
if ($newRecord->updated > $s->updated) {
update($s, $newRecord);
send($newRecord);
continue;
}
updateRemote($newRecord, $s);
}
conflict resolution algorithm (plain data)
remote wins
function sync($data) {
foreach ($data as $newRecord) {
$s = findByGuid($newRecord->getGuid());
if (!$s) {
add($newRecord);
send($newRecord);
continue;
}
if ($newRecord->updated > $s->updated) {
update($s, $newRecord);
send($newRecord);
continue;
}
updateRemote($newRecord, $s);
}
conflict resolution algorithm (plain data)
server wins
conflict resolution algorithm (plain data)
c1
{ ‘lid’:‘1’,
‘guid’:‘af54d’,
‘data’ :‘AAA’
‘updated’: ’100’ }
{ ‘lid’:‘2’,
‘data’ :‘hello!’,
‘updated’: ’15’ }
server
{ ’guid’:‘af54d’,
‘data’:‘BBB’,
‘updated’ : ’20’ }
conflict resolution algorithm (plain data)
c1 server
{ ‘lid’:‘1’,
‘guid’:‘af54d’,
‘data’ :‘AAA’
‘updated’: ’100’ }
{ ‘lid’:‘2’,
‘data’ :‘hello!’,
‘updated’: ’15’ } POST /merge
{ ’guid’:‘af54d’,
‘data’:‘BBB’,
‘updated’ : ’20’ }
conflict resolution algorithm (plain data)
c1 server
{ ‘lid’:‘1’,
‘guid’:‘af54d’,
‘data’ :‘AAA’
‘updated’: ’100’ }
{ ‘lid’:‘2’,
‘data’ :‘hello!’,
‘updated’: ’15’ } POST /merge
{ ‘guid’:‘e324f’,
‘data’ :‘hello!’,
‘updated’: ’15’ }
{ ’guid’:‘af54d’,
‘data’:‘BBB’,
‘updated’ : ’20’ }
conflict resolution algorithm (plain data)
c1 server
{ ‘lid’:‘1’,
‘guid’:‘af54d’,
‘data’ :‘AAA’
‘updated’: ’100’ }
{ ‘lid’:‘2’,
‘data’ :‘hello!’,
‘updated’: ’15’ } POST /merge
{ ‘guid’:‘e324f’,
‘data’ :‘hello!’,
‘updated’: ’15’ }
{ ’guid’:‘af54d’,
‘data’:‘BBB’,
‘updated’ : ’20’ }
conflict resolution algorithm (plain data)
c1 server
{ ‘lid’:‘1’,
‘guid’:‘af54d’,
‘data’ :‘AAA’
‘updated’: ’100’ }
{ ‘lid’:‘2’,
‘data’ :‘hello!’,
‘updated’: ’15’ } POST /merge
{ ‘guid’:‘e324f’,
‘data’ :‘hello!’,
‘updated’: ’15’ }
{ ’guid’:‘af54d’,
‘data’:‘AAA’,
‘updated’ : ’100’ }
conflict resolution algorithm (plain data)
c1 server
{ ‘lid’:‘1’,
‘guid’:‘af54d’,
‘data’ :‘AAA’
‘updated’: ’100’ }
{ ’guid’:‘af54d’,
‘data’:‘AAA’,
‘updated’ : ’100’ }
{ ‘lid’:‘2’,
‘data’ :‘hello!’,
‘updated’: ’15’ } POST /merge
{ ‘guid’:‘e324f’,
‘data’ :‘hello!’,
‘updated’: ’15’ }
{‘ok’ : { ’guid’:‘af54d’ }}
{‘update’ : { lid:‘2’, ’guid’:‘e324f’ }}
conflict resolution algorithm (hierarchical data)
How to manage hierarchical data?
{
‘lid’ : ‘123456’,
‘type’ : ‘baby’,
…
}
{
‘lid’ : ‘123456’,
‘type’ : ‘temperature’,
‘baby_id : ‘123456’
}
conflict resolution algorithm (hierarchical data)
How to manage hierarchical data?
1) sync root record
2) update ids
3) sync child records
{
‘lid’ : ‘123456’,
‘type’ : ‘baby’,
…
}
{
‘lid’ : ‘123456’,
‘type’ : ‘temperature’,
‘baby_id : ‘123456’
}
function syncHierarchical($data) {
sortByHierarchy($data);
foreach ($data as $newRootRecord) {
$s = findByGuid($newRootRecord->getGuid());
if($newRecord->isRoot()) {
if (!$s) {
add($newRootRecord);
updateRecordIds($newRootRecord, $data);
send($newRootRecord);
continue;
}
…
conflict resolution algorithm (hierarchical data)
function syncHierarchical($data) {
sortByHierarchy($data);
foreach ($data as $newRootRecord) {
$s = findByGuid($newRootRecord->getGuid());
if($newRecord->isRoot()) {
if (!$s) {
add($newRootRecord);
updateRecordIds($newRootRecord, $data);
send($newRootRecord);
continue;
}
…
conflict resolution algorithm (hierarchical data)
parent records first
function syncHierarchical($data) {
sortByHierarchy($data);
foreach ($data as $newRootRecord) {
$s = findByGuid($newRootRecord->getGuid());
if($newRecord->isRoot()) {
if (!$s) {
add($newRootRecord);
updateRecordIds($newRootRecord, $data);
send($newRootRecord);
continue;
}
…
conflict resolution algorithm (hierarchical data)
function syncHierarchical($data) {
sortByHierarchy($data);
foreach ($data as $newRootRecord) {
$s = findByGuid($newRootRecord->getGuid());
if($newRecord->isRoot()) {
if (!$s) {
add($newRootRecord);
updateRecordIds($newRootRecord, $data);
send($newRootRecord);
continue;
}
…
conflict resolution algorithm (hierarchical data)
no conflict
…
if ($newRootRecord->updated > $s->updated) {
update($s, $newRecord);
updateRecordIds($newRootRecord, $data);
send($newRootRecord);
continue;
} else {
updateRecordIds($s, $data);
updateRemote($newRecord, $s);
}
} else {
sync($data);
}
}
conflict resolution algorithm (hierarchical data)
remote wins
…
if ($newRootRecord->updated > $s->updated) {
update($s, $newRecord);
updateRecordIds($newRootRecord, $data);
send($newRootRecord);
continue;
} else {
updateRecordIds($s, $data);
updateRemote($newRecord, $s);
}
} else {
sync($data);
}
}
conflict resolution algorithm (hierarchical data)
server wins
conflict resolution algorithm (hierarchical data)
{ ‘lid’:‘1’,
‘data’ :‘AAA’
‘updated’: ’100’ }
{ ‘lid’:‘2’,
‘parent’:‘1’,
‘data’ :‘hello!’,
‘updated’: ’15’ }
c1 server
POST /merge
conflict resolution algorithm (hierarchical data)
c1
{ ‘lid’:‘1’,
‘data’ :‘AAA’
‘updated’: ’100’ }
{ ‘lid’:‘2’,
‘parent’:‘1’,
‘data’ :‘hello!’,
‘updated’: ’15’ }
server
POST /merge
{ ‘lid’:‘1’,
‘guid’ :‘32ead’,
‘data’ :‘AAA’
‘updated’: ’100’ }
conflict resolution algorithm (hierarchical data)
c1
{ ‘lid’:‘1’,
‘data’ :‘AAA’
‘updated’: ’100’ }
{ ‘lid’:‘2’,
‘parent’:‘32ead’,
‘data’ :‘hello!’,
‘updated’: ’15’ }
server
POST /merge
{ ‘lid’:‘1’,
‘guid’ :‘32ead’,
‘data’ :‘AAA’
‘updated’: ’100’ }
conflict resolution algorithm (hierarchical data)
c1
{ ‘lid’:‘1’,
‘data’ :‘AAA’
‘updated’: ’100’ }
{ ‘lid’:‘2’,
‘parent’:‘32ead’,
‘data’ :‘hello!’,
‘updated’: ’15’ }
server
POST /merge
{ ‘lid’:‘1’,
‘guid’ :‘32ead’,
‘data’ :‘AAA’
‘updated’: ’100’ }
{ ‘lid’:‘2’,
‘parent’:‘32ead’,
‘data’ :‘hello!’,
‘updated’: ’15’ }
{‘update’ : { ‘lid’:‘1’, ’guid’:‘af54d’ }}
{‘update’ : { lid:‘2’, ’guid’:‘e324f’ }}
e.g.“only one temperature can be registered in a
given day”
how to we enforce domain constraints on data?
enforcing domain constraints
e.g.“only one temperature can be registered in a
given day”
how to we enforce domain constraints on data?
1) relax constraints
enforcing domain constraints
e.g.“only one temperature can be registered in a
given day”
how to we enforce domain constraints on data?
1) relax constraints
2) integrate constraints in sync algorithm
enforcing domain constraints
from findByGuid to findSimilar
first lookup by GUID then by domain rules
“two measures are similar if are referred to the
same date”
enforcing domain constraints
enforcing domain constraints
c1 server
enforcing domain constraints
c1 server
{ ’guid’:‘af54d’,
‘when’:‘20141005’ }
enforcing domain constraints
c1 server
{ ‘lid’:‘1’,
‘when’:‘20141005’ }
{ ’guid’:‘af54d’,
‘when’:‘20141005’ }
enforcing domain constraints
c1 server
{ ‘lid’:‘1’,
‘when’:‘20141005’ }
{ ’guid’:‘af54d’,
‘when’:‘20141005’ }
POST /merge
enforcing domain constraints
c1 server
{ ‘lid’:‘1’,
‘when’:‘20141005’ }
{ ’guid’:‘af54d’,
‘when’:‘20141005’ }
POST /merge
enforcing domain constraints
c1 server
{ ‘lid’:‘1’,
‘when’:‘20141005’ }
{ ’guid’:‘af54d’,
‘when’:‘20141005’ }
POST /merge
{ ’guid’:‘af54d’,
‘when’:‘20141005’ }
Binary data uploaded via custom endpoint
Sync data remains small
Uploads can be resumed
dealing with binary data
Two steps*
1) data are synchronized
2) related images are uploaded
* this means record without file for a given time
dealing with binary data
dealing with binary data
c1 server
POST /merge
POST /upload/ac435-f8345/image
{ ‘lid’ : 1,
‘type’ :‘baby’,
‘image’ :‘myimage.jpg’ }
{ ‘lid’ : 1,
‘guid’ :‘ac435-f8345’ }
Implementing this stuff is tricky
Explore existing solution if you can
Understanding the domain is important
What we learned
vector clocks
Conflict-free Replicated Data Types (CRDTs)
Constraining the types of operations in order to:
- ensure convergence of changes to shared data by
uncoordinated, concurrent actors
- eliminate network failure modes as a source of
error
CRDT
Gateways handles sync
Data flows through channels
- partition data set
- authorization
- limit the data
Use revision trees
Couchbase Mobile
Distributed DB
Eventually/Strong Consistency
Data Types
Configurable conflict resolution
- db level for built-in data types
- application level for custom
data
Riak
See you inVerona!
jsDay 13th-14th of May
http://2015.jsday.it/
phpDay 15th-16th of May
http://2015.phpday.it/
Questions?
http://www.objc.io/issue-10/sync-case-study.html
http://www.objc.io/issue-10/data-synchronization.html
https://dev.evernote.com/media/pdf/edam-sync.pdf
http://blog.helftone.com/clear-in-the-icloud/
http://strongloop.com/strongblog/node-js-replication-mobile-offline-sync-loopback/
http://blog.denivip.ru/index.php/2014/04/data-syncing-in-core-data-based-ios-apps/?lang=en
http://inessential.com/2014/02/15/vesper_sync_diary_8_the_problem_of_un
http://culturedcode.com/things/blog/2010/12/state-of-sync-part-1.html
http://programmers.stackexchange.com/questions/206310/data-synchronization-in-mobile-apps-
multiple-devices-multiple-users
http://bricklin.com/offline.htm
http://blog.couchbase.com/why-mobile-sync
Links
Vector Clocks
http://basho.com/why-vector-clocks-are-easy/
http://www.datastax.com/dev/blog/why-cassandra-doesnt-need-vector-clocks
http://basho.com/why-vector-clocks-are-hard/
http://blog.8thlight.com/rylan-dirksen/2013/10/04/synchronization-in-a-distributed-system.html
CRDTs
http://christophermeiklejohn.com/distributed/systems/2013/07/12/readings-in-distributed-systems.html
http://www.infoq.com/presentations/problems-distributed-systems
https://www.youtube.com/watch?v=qyVNG7fnubQ
Riak
http://docs.basho.com/riak/latest/dev/using/conflict-resolution/
Couchbase Sync Gateway
http://docs.couchbase.com/sync-gateway/
http://www.infoq.com/presentations/sync-mobile-data
API
http://developers.amiando.com/index.php/REST_API_DataSync
https://login.syncano.com/docs/rest/index.html
Links
phones https://www.flickr.com/photos/15216811@N06/14504964841
wat http://uturncrossfit.com/wp-content/uploads/2014/04/wait-what.jpg
darth http://www.listal.com/viewimage/3825918h
blueprint: http://upload.wikimedia.org/wikipedia/commons/5/5e/Joy_Oil_gas_station_blueprints.jpg
building: http://s0.geograph.org.uk/geophotos/02/42/74/2427436_96c4cd84.jpg
brownfield: http://s0.geograph.org.uk/geophotos/02/04/54/2045448_03a2fb36.jpg
no connection: https://www.flickr.com/photos/77018488@N03/9004800239
no internet con https://www.flickr.com/photos/roland/9681237793
vector clocks: http://en.wikipedia.org/wiki/Vector_clock
crdts: http://www.infoq.com/presentations/problems-distributed-systems
Credits

More Related Content

What's hot

Parse Advanced
Parse AdvancedParse Advanced
Parse Advanced
Tushar Acharya
 
Bringing Transactional Guarantees to MongoDB
Bringing Transactional Guarantees to MongoDBBringing Transactional Guarantees to MongoDB
Bringing Transactional Guarantees to MongoDB
Paul Robinson
 
React lecture
React lectureReact lecture
React lecture
Christoffer Noring
 
JS Fest 2019. Anjana Vakil. Serverless Bebop
JS Fest 2019. Anjana Vakil. Serverless BebopJS Fest 2019. Anjana Vakil. Serverless Bebop
JS Fest 2019. Anjana Vakil. Serverless Bebop
JSFestUA
 
My Top 5 APEX JavaScript API's
My Top 5 APEX JavaScript API'sMy Top 5 APEX JavaScript API's
My Top 5 APEX JavaScript API's
Roel Hartman
 
Use Kotlin scripts and Clova SDK to build your Clova extension
Use Kotlin scripts and Clova SDK to build your Clova extensionUse Kotlin scripts and Clova SDK to build your Clova extension
Use Kotlin scripts and Clova SDK to build your Clova extension
LINE Corporation
 
Creating sub zero dashboard plugin for apex with google
Creating sub zero dashboard plugin for apex with googleCreating sub zero dashboard plugin for apex with google
Creating sub zero dashboard plugin for apex with google
Roel Hartman
 
Akka: Actor Design & Communication Technics
Akka: Actor Design & Communication TechnicsAkka: Actor Design & Communication Technics
Akka: Actor Design & Communication Technics
Alex Fruzenshtein
 
Designing The Right Schema To Power Heap (PGConf Silicon Valley 2016)
Designing The Right Schema To Power Heap (PGConf Silicon Valley 2016)Designing The Right Schema To Power Heap (PGConf Silicon Valley 2016)
Designing The Right Schema To Power Heap (PGConf Silicon Valley 2016)
Dan Robinson
 
Rxjs swetugg
Rxjs swetuggRxjs swetugg
Rxjs swetugg
Christoffer Noring
 
Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...
Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...
Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...
Codemotion
 
Rxjs ngvikings
Rxjs ngvikingsRxjs ngvikings
Rxjs ngvikings
Christoffer Noring
 
Inversion Of Control
Inversion Of ControlInversion Of Control
Inversion Of Control
Chad Hietala
 
Using Change Streams to Keep Up with Your Data
Using Change Streams to Keep Up with Your DataUsing Change Streams to Keep Up with Your Data
Using Change Streams to Keep Up with Your Data
MongoDB
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projects
Ignacio Martín
 
Goal Based Data Production with Sim Simeonov
Goal Based Data Production with Sim SimeonovGoal Based Data Production with Sim Simeonov
Goal Based Data Production with Sim Simeonov
Databricks
 
Tweaking the interactive grid
Tweaking the interactive gridTweaking the interactive grid
Tweaking the interactive grid
Roel Hartman
 
Controller specs
Controller specsController specs
Controller specs
Alexander Miller
 
201410 2 fiware-orion-contextbroker
201410 2 fiware-orion-contextbroker201410 2 fiware-orion-contextbroker
201410 2 fiware-orion-contextbrokerFIWARE
 
Bare-knuckle web development
Bare-knuckle web developmentBare-knuckle web development
Bare-knuckle web development
Johannes Brodwall
 

What's hot (20)

Parse Advanced
Parse AdvancedParse Advanced
Parse Advanced
 
Bringing Transactional Guarantees to MongoDB
Bringing Transactional Guarantees to MongoDBBringing Transactional Guarantees to MongoDB
Bringing Transactional Guarantees to MongoDB
 
React lecture
React lectureReact lecture
React lecture
 
JS Fest 2019. Anjana Vakil. Serverless Bebop
JS Fest 2019. Anjana Vakil. Serverless BebopJS Fest 2019. Anjana Vakil. Serverless Bebop
JS Fest 2019. Anjana Vakil. Serverless Bebop
 
My Top 5 APEX JavaScript API's
My Top 5 APEX JavaScript API'sMy Top 5 APEX JavaScript API's
My Top 5 APEX JavaScript API's
 
Use Kotlin scripts and Clova SDK to build your Clova extension
Use Kotlin scripts and Clova SDK to build your Clova extensionUse Kotlin scripts and Clova SDK to build your Clova extension
Use Kotlin scripts and Clova SDK to build your Clova extension
 
Creating sub zero dashboard plugin for apex with google
Creating sub zero dashboard plugin for apex with googleCreating sub zero dashboard plugin for apex with google
Creating sub zero dashboard plugin for apex with google
 
Akka: Actor Design & Communication Technics
Akka: Actor Design & Communication TechnicsAkka: Actor Design & Communication Technics
Akka: Actor Design & Communication Technics
 
Designing The Right Schema To Power Heap (PGConf Silicon Valley 2016)
Designing The Right Schema To Power Heap (PGConf Silicon Valley 2016)Designing The Right Schema To Power Heap (PGConf Silicon Valley 2016)
Designing The Right Schema To Power Heap (PGConf Silicon Valley 2016)
 
Rxjs swetugg
Rxjs swetuggRxjs swetugg
Rxjs swetugg
 
Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...
Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...
Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...
 
Rxjs ngvikings
Rxjs ngvikingsRxjs ngvikings
Rxjs ngvikings
 
Inversion Of Control
Inversion Of ControlInversion Of Control
Inversion Of Control
 
Using Change Streams to Keep Up with Your Data
Using Change Streams to Keep Up with Your DataUsing Change Streams to Keep Up with Your Data
Using Change Streams to Keep Up with Your Data
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projects
 
Goal Based Data Production with Sim Simeonov
Goal Based Data Production with Sim SimeonovGoal Based Data Production with Sim Simeonov
Goal Based Data Production with Sim Simeonov
 
Tweaking the interactive grid
Tweaking the interactive gridTweaking the interactive grid
Tweaking the interactive grid
 
Controller specs
Controller specsController specs
Controller specs
 
201410 2 fiware-orion-contextbroker
201410 2 fiware-orion-contextbroker201410 2 fiware-orion-contextbroker
201410 2 fiware-orion-contextbroker
 
Bare-knuckle web development
Bare-knuckle web developmentBare-knuckle web development
Bare-knuckle web development
 

Similar to Implementing data sync apis for mibile apps @cloudconf

WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015
Fernando Daciuk
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
Hugo Hamon
 
Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5
Elena Kolevska
 
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
Amazon Web Services
 
Advanced redux
Advanced reduxAdvanced redux
Advanced redux
Boris Dinkevich
 
Angular Tutorial Freshers and Experienced
Angular Tutorial Freshers and ExperiencedAngular Tutorial Freshers and Experienced
Angular Tutorial Freshers and Experienced
rajkamaltibacademy
 
SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!
Sébastien Levert
 
Nodejs do teste de unidade ao de integração
Nodejs  do teste de unidade ao de integraçãoNodejs  do teste de unidade ao de integração
Nodejs do teste de unidade ao de integração
Vinícius Pretto da Silva
 
Reduxing like a pro
Reduxing like a proReduxing like a pro
Reduxing like a pro
Boris Dinkevich
 
GraphQL Bangkok Meetup 2.0
GraphQL Bangkok Meetup 2.0GraphQL Bangkok Meetup 2.0
GraphQL Bangkok Meetup 2.0
Tobias Meixner
 
Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015
Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015
Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015
NoSQLmatters
 
NoSQL meets Microservices
NoSQL meets MicroservicesNoSQL meets Microservices
NoSQL meets Microservices
ArangoDB Database
 
NoSQL meets Microservices - Michael Hackstein
NoSQL meets Microservices - Michael HacksteinNoSQL meets Microservices - Michael Hackstein
NoSQL meets Microservices - Michael Hackstein
distributed matters
 
DataStax: 0 to App faster with Ruby and NodeJS
DataStax: 0 to App faster with Ruby and NodeJSDataStax: 0 to App faster with Ruby and NodeJS
DataStax: 0 to App faster with Ruby and NodeJS
DataStax Academy
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
Jonathan Wage
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasminePaulo Ragonha
 
Average- An android project
Average- An android projectAverage- An android project
Average- An android projectIpsit Dash
 
The Return of JavaScript: 3 Open-Source Projects that are driving JavaScript'...
The Return of JavaScript: 3 Open-Source Projects that are driving JavaScript'...The Return of JavaScript: 3 Open-Source Projects that are driving JavaScript'...
The Return of JavaScript: 3 Open-Source Projects that are driving JavaScript'...
Ben Teese
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryTatsuhiko Miyagawa
 
SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!
SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!
SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!
Sébastien Levert
 

Similar to Implementing data sync apis for mibile apps @cloudconf (20)

WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
 
Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5
 
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
 
Advanced redux
Advanced reduxAdvanced redux
Advanced redux
 
Angular Tutorial Freshers and Experienced
Angular Tutorial Freshers and ExperiencedAngular Tutorial Freshers and Experienced
Angular Tutorial Freshers and Experienced
 
SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!
 
Nodejs do teste de unidade ao de integração
Nodejs  do teste de unidade ao de integraçãoNodejs  do teste de unidade ao de integração
Nodejs do teste de unidade ao de integração
 
Reduxing like a pro
Reduxing like a proReduxing like a pro
Reduxing like a pro
 
GraphQL Bangkok Meetup 2.0
GraphQL Bangkok Meetup 2.0GraphQL Bangkok Meetup 2.0
GraphQL Bangkok Meetup 2.0
 
Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015
Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015
Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015
 
NoSQL meets Microservices
NoSQL meets MicroservicesNoSQL meets Microservices
NoSQL meets Microservices
 
NoSQL meets Microservices - Michael Hackstein
NoSQL meets Microservices - Michael HacksteinNoSQL meets Microservices - Michael Hackstein
NoSQL meets Microservices - Michael Hackstein
 
DataStax: 0 to App faster with Ruby and NodeJS
DataStax: 0 to App faster with Ruby and NodeJSDataStax: 0 to App faster with Ruby and NodeJS
DataStax: 0 to App faster with Ruby and NodeJS
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
 
Average- An android project
Average- An android projectAverage- An android project
Average- An android project
 
The Return of JavaScript: 3 Open-Source Projects that are driving JavaScript'...
The Return of JavaScript: 3 Open-Source Projects that are driving JavaScript'...The Return of JavaScript: 3 Open-Source Projects that are driving JavaScript'...
The Return of JavaScript: 3 Open-Source Projects that are driving JavaScript'...
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 
SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!
SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!
SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!
 

More from Michele Orselli

Tackling Tech Debt with Rector
Tackling Tech Debt with RectorTackling Tech Debt with Rector
Tackling Tech Debt with Rector
Michele Orselli
 
Comunicare, condividere e mantenere decisioni architetturali nei team di svil...
Comunicare, condividere e mantenere decisioni architetturali nei team di svil...Comunicare, condividere e mantenere decisioni architetturali nei team di svil...
Comunicare, condividere e mantenere decisioni architetturali nei team di svil...
Michele Orselli
 
A dive into Symfony 4
A dive into Symfony 4A dive into Symfony 4
A dive into Symfony 4
Michele Orselli
 
A recommendation engine for your applications codemotion ams
A recommendation engine for your applications codemotion amsA recommendation engine for your applications codemotion ams
A recommendation engine for your applications codemotion ams
Michele Orselli
 
A recommendation engine for your applications phpday
A recommendation engine for your applications phpdayA recommendation engine for your applications phpday
A recommendation engine for your applications phpday
Michele Orselli
 
Hopping in clouds - phpuk 17
Hopping in clouds - phpuk 17Hopping in clouds - phpuk 17
Hopping in clouds - phpuk 17
Michele Orselli
 
A recommendation engine for your php application
A recommendation engine for your php applicationA recommendation engine for your php application
A recommendation engine for your php application
Michele Orselli
 
Symfony e micro (non così tanto) services
Symfony e micro (non così tanto) servicesSymfony e micro (non così tanto) services
Symfony e micro (non così tanto) services
Michele Orselli
 
Hopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to anotherHopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to another
Michele Orselli
 
Vagrant for real (codemotion rome 2016)
Vagrant for real (codemotion rome 2016)Vagrant for real (codemotion rome 2016)
Vagrant for real (codemotion rome 2016)
Michele Orselli
 
Vagrant for real codemotion (moar tips! ;-))
Vagrant for real codemotion (moar tips! ;-))Vagrant for real codemotion (moar tips! ;-))
Vagrant for real codemotion (moar tips! ;-))
Michele Orselli
 
Migrare a Symfony 3
Migrare a Symfony 3Migrare a Symfony 3
Migrare a Symfony 3
Michele Orselli
 
Vagrant for real
Vagrant for realVagrant for real
Vagrant for real
Michele Orselli
 
Continuous, continuous, continuous
Continuous, continuous, continuousContinuous, continuous, continuous
Continuous, continuous, continuous
Michele Orselli
 
Deploy a PHP App on Google App Engine
Deploy a PHP App on Google App EngineDeploy a PHP App on Google App Engine
Deploy a PHP App on Google App Engine
Michele Orselli
 
Deploy a php app on Google App Engine
Deploy a php app on Google App EngineDeploy a php app on Google App Engine
Deploy a php app on Google App Engine
Michele Orselli
 
Sf2 wtf
Sf2 wtfSf2 wtf
Manage a project portfolio
Manage a project portfolioManage a project portfolio
Manage a project portfolio
Michele Orselli
 
Developing sustainable php projects
Developing sustainable php projectsDeveloping sustainable php projects
Developing sustainable php projectsMichele Orselli
 
Zend Framework 2 per chi viene da Symfony2
Zend Framework 2 per chi viene da Symfony2Zend Framework 2 per chi viene da Symfony2
Zend Framework 2 per chi viene da Symfony2Michele Orselli
 

More from Michele Orselli (20)

Tackling Tech Debt with Rector
Tackling Tech Debt with RectorTackling Tech Debt with Rector
Tackling Tech Debt with Rector
 
Comunicare, condividere e mantenere decisioni architetturali nei team di svil...
Comunicare, condividere e mantenere decisioni architetturali nei team di svil...Comunicare, condividere e mantenere decisioni architetturali nei team di svil...
Comunicare, condividere e mantenere decisioni architetturali nei team di svil...
 
A dive into Symfony 4
A dive into Symfony 4A dive into Symfony 4
A dive into Symfony 4
 
A recommendation engine for your applications codemotion ams
A recommendation engine for your applications codemotion amsA recommendation engine for your applications codemotion ams
A recommendation engine for your applications codemotion ams
 
A recommendation engine for your applications phpday
A recommendation engine for your applications phpdayA recommendation engine for your applications phpday
A recommendation engine for your applications phpday
 
Hopping in clouds - phpuk 17
Hopping in clouds - phpuk 17Hopping in clouds - phpuk 17
Hopping in clouds - phpuk 17
 
A recommendation engine for your php application
A recommendation engine for your php applicationA recommendation engine for your php application
A recommendation engine for your php application
 
Symfony e micro (non così tanto) services
Symfony e micro (non così tanto) servicesSymfony e micro (non così tanto) services
Symfony e micro (non così tanto) services
 
Hopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to anotherHopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to another
 
Vagrant for real (codemotion rome 2016)
Vagrant for real (codemotion rome 2016)Vagrant for real (codemotion rome 2016)
Vagrant for real (codemotion rome 2016)
 
Vagrant for real codemotion (moar tips! ;-))
Vagrant for real codemotion (moar tips! ;-))Vagrant for real codemotion (moar tips! ;-))
Vagrant for real codemotion (moar tips! ;-))
 
Migrare a Symfony 3
Migrare a Symfony 3Migrare a Symfony 3
Migrare a Symfony 3
 
Vagrant for real
Vagrant for realVagrant for real
Vagrant for real
 
Continuous, continuous, continuous
Continuous, continuous, continuousContinuous, continuous, continuous
Continuous, continuous, continuous
 
Deploy a PHP App on Google App Engine
Deploy a PHP App on Google App EngineDeploy a PHP App on Google App Engine
Deploy a PHP App on Google App Engine
 
Deploy a php app on Google App Engine
Deploy a php app on Google App EngineDeploy a php app on Google App Engine
Deploy a php app on Google App Engine
 
Sf2 wtf
Sf2 wtfSf2 wtf
Sf2 wtf
 
Manage a project portfolio
Manage a project portfolioManage a project portfolio
Manage a project portfolio
 
Developing sustainable php projects
Developing sustainable php projectsDeveloping sustainable php projects
Developing sustainable php projects
 
Zend Framework 2 per chi viene da Symfony2
Zend Framework 2 per chi viene da Symfony2Zend Framework 2 per chi viene da Symfony2
Zend Framework 2 per chi viene da Symfony2
 

Recently uploaded

Search Result Showing My Post is Now Buried
Search Result Showing My Post is Now BuriedSearch Result Showing My Post is Now Buried
Search Result Showing My Post is Now Buried
Trish Parr
 
一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理
一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理
一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理
ufdana
 
急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样
急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样
急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样
3ipehhoa
 
Gen Z and the marketplaces - let's translate their needs
Gen Z and the marketplaces - let's translate their needsGen Z and the marketplaces - let's translate their needs
Gen Z and the marketplaces - let's translate their needs
Laura Szabó
 
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
ysasp1
 
Meet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdf
Meet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdfMeet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdf
Meet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdf
Florence Consulting
 
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
fovkoyb
 
Italy Agriculture Equipment Market Outlook to 2027
Italy Agriculture Equipment Market Outlook to 2027Italy Agriculture Equipment Market Outlook to 2027
Italy Agriculture Equipment Market Outlook to 2027
harveenkaur52
 
[HUN][hackersuli] Red Teaming alapok 2024
[HUN][hackersuli] Red Teaming alapok 2024[HUN][hackersuli] Red Teaming alapok 2024
[HUN][hackersuli] Red Teaming alapok 2024
hackersuli
 
1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样
1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样
1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样
3ipehhoa
 
Bài tập unit 1 English in the world.docx
Bài tập unit 1 English in the world.docxBài tập unit 1 English in the world.docx
Bài tập unit 1 English in the world.docx
nhiyenphan2005
 
Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...
Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...
Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...
CIOWomenMagazine
 
JAVIER LASA-EXPERIENCIA digital 1986-2024.pdf
JAVIER LASA-EXPERIENCIA digital 1986-2024.pdfJAVIER LASA-EXPERIENCIA digital 1986-2024.pdf
JAVIER LASA-EXPERIENCIA digital 1986-2024.pdf
Javier Lasa
 
重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理
重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理
重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理
vmemo1
 
7 Best Cloud Hosting Services to Try Out in 2024
7 Best Cloud Hosting Services to Try Out in 20247 Best Cloud Hosting Services to Try Out in 2024
7 Best Cloud Hosting Services to Try Out in 2024
Danica Gill
 
可查真实(Monash毕业证)西澳大学毕业证成绩单退学买
可查真实(Monash毕业证)西澳大学毕业证成绩单退学买可查真实(Monash毕业证)西澳大学毕业证成绩单退学买
可查真实(Monash毕业证)西澳大学毕业证成绩单退学买
cuobya
 
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
cuobya
 
一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理
一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理
一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理
keoku
 
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
zyfovom
 
原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样
原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样
原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样
3ipehhoa
 

Recently uploaded (20)

Search Result Showing My Post is Now Buried
Search Result Showing My Post is Now BuriedSearch Result Showing My Post is Now Buried
Search Result Showing My Post is Now Buried
 
一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理
一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理
一比一原版(CSU毕业证)加利福尼亚州立大学毕业证成绩单专业办理
 
急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样
急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样
急速办(bedfordhire毕业证书)英国贝德福特大学毕业证成绩单原版一模一样
 
Gen Z and the marketplaces - let's translate their needs
Gen Z and the marketplaces - let's translate their needsGen Z and the marketplaces - let's translate their needs
Gen Z and the marketplaces - let's translate their needs
 
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
 
Meet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdf
Meet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdfMeet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdf
Meet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdf
 
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
 
Italy Agriculture Equipment Market Outlook to 2027
Italy Agriculture Equipment Market Outlook to 2027Italy Agriculture Equipment Market Outlook to 2027
Italy Agriculture Equipment Market Outlook to 2027
 
[HUN][hackersuli] Red Teaming alapok 2024
[HUN][hackersuli] Red Teaming alapok 2024[HUN][hackersuli] Red Teaming alapok 2024
[HUN][hackersuli] Red Teaming alapok 2024
 
1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样
1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样
1比1复刻(bath毕业证书)英国巴斯大学毕业证学位证原版一模一样
 
Bài tập unit 1 English in the world.docx
Bài tập unit 1 English in the world.docxBài tập unit 1 English in the world.docx
Bài tập unit 1 English in the world.docx
 
Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...
Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...
Internet of Things in Manufacturing: Revolutionizing Efficiency & Quality | C...
 
JAVIER LASA-EXPERIENCIA digital 1986-2024.pdf
JAVIER LASA-EXPERIENCIA digital 1986-2024.pdfJAVIER LASA-EXPERIENCIA digital 1986-2024.pdf
JAVIER LASA-EXPERIENCIA digital 1986-2024.pdf
 
重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理
重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理
重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理
 
7 Best Cloud Hosting Services to Try Out in 2024
7 Best Cloud Hosting Services to Try Out in 20247 Best Cloud Hosting Services to Try Out in 2024
7 Best Cloud Hosting Services to Try Out in 2024
 
可查真实(Monash毕业证)西澳大学毕业证成绩单退学买
可查真实(Monash毕业证)西澳大学毕业证成绩单退学买可查真实(Monash毕业证)西澳大学毕业证成绩单退学买
可查真实(Monash毕业证)西澳大学毕业证成绩单退学买
 
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
 
一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理
一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理
一比一原版(SLU毕业证)圣路易斯大学毕业证成绩单专业办理
 
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
 
原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样
原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样
原版仿制(uob毕业证书)英国伯明翰大学毕业证本科学历证书原版一模一样
 

Implementing data sync apis for mibile apps @cloudconf