SlideShare une entreprise Scribd logo
1  sur  89
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Bringing Transactional Guarantees to MongoDB
Bringing Transactional Guarantees to MongoDBBringing Transactional Guarantees to MongoDB
Bringing Transactional Guarantees to MongoDBPaul Robinson
 
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 BebopJSFestUA
 
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'sRoel 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 extensionLINE 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 googleRoel Hartman
 
Akka: Actor Design & Communication Technics
Akka: Actor Design & Communication TechnicsAkka: Actor Design & Communication Technics
Akka: Actor Design & Communication TechnicsAlex 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
 
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
 
Inversion Of Control
Inversion Of ControlInversion Of Control
Inversion Of ControlChad 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 DataMongoDB
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projectsIgnacio 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 SimeonovDatabricks
 
Tweaking the interactive grid
Tweaking the interactive gridTweaking the interactive grid
Tweaking the interactive gridRoel Hartman
 
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 developmentJohannes Brodwall
 

Tendances (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
 

Similaire à 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 2015Fernando Daciuk
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & RESTHugo Hamon
 
Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5Elena 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
 
Angular Tutorial Freshers and Experienced
Angular Tutorial Freshers and ExperiencedAngular Tutorial Freshers and Experienced
Angular Tutorial Freshers and Experiencedrajkamaltibacademy
 
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çãoVinícius Pretto da Silva
 
GraphQL Bangkok Meetup 2.0
GraphQL Bangkok Meetup 2.0GraphQL Bangkok Meetup 2.0
GraphQL Bangkok Meetup 2.0Tobias 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 2015NoSQLmatters
 
NoSQL meets Microservices - Michael Hackstein
NoSQL meets Microservices - Michael HacksteinNoSQL meets Microservices - Michael Hackstein
NoSQL meets Microservices - Michael Hacksteindistributed 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 NodeJSDataStax Academy
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For BeginnersJonathan 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
 

Similaire à 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
 
NoSQL meets Microservices
NoSQL meets MicroservicesNoSQL meets Microservices
NoSQL meets Microservices
 
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 - 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!
 

Plus de Michele Orselli

Tackling Tech Debt with Rector
Tackling Tech Debt with RectorTackling Tech Debt with Rector
Tackling Tech Debt with RectorMichele 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 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 amsMichele 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 phpdayMichele Orselli
 
Hopping in clouds - phpuk 17
Hopping in clouds - phpuk 17Hopping in clouds - phpuk 17
Hopping in clouds - phpuk 17Michele 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 applicationMichele 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) servicesMichele 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 anotherMichele 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
 
Continuous, continuous, continuous
Continuous, continuous, continuousContinuous, continuous, continuous
Continuous, continuous, continuousMichele 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 EngineMichele 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 EngineMichele Orselli
 
Manage a project portfolio
Manage a project portfolioManage a project portfolio
Manage a project portfolioMichele 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
 

Plus de 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
 

Dernier

Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...
Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...
Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...Delhi Call girls
 
VIP Call Girls Pollachi 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Pollachi 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Pollachi 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Pollachi 7001035870 Whatsapp Number, 24/07 Bookingdharasingh5698
 
Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.soniya singh
 
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...SUHANI PANDEY
 
Real Escorts in Al Nahda +971524965298 Dubai Escorts Service
Real Escorts in Al Nahda +971524965298 Dubai Escorts ServiceReal Escorts in Al Nahda +971524965298 Dubai Escorts Service
Real Escorts in Al Nahda +971524965298 Dubai Escorts ServiceEscorts Call Girls
 
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLLucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLimonikaupta
 
Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.soniya singh
 
VVIP Pune Call Girls Mohammadwadi WhatSapp Number 8005736733 With Elite Staff...
VVIP Pune Call Girls Mohammadwadi WhatSapp Number 8005736733 With Elite Staff...VVIP Pune Call Girls Mohammadwadi WhatSapp Number 8005736733 With Elite Staff...
VVIP Pune Call Girls Mohammadwadi WhatSapp Number 8005736733 With Elite Staff...SUHANI PANDEY
 
Real Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirtReal Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirtrahman018755
 
VIP Model Call Girls NIBM ( Pune ) Call ON 8005736733 Starting From 5K to 25K...
VIP Model Call Girls NIBM ( Pune ) Call ON 8005736733 Starting From 5K to 25K...VIP Model Call Girls NIBM ( Pune ) Call ON 8005736733 Starting From 5K to 25K...
VIP Model Call Girls NIBM ( Pune ) Call ON 8005736733 Starting From 5K to 25K...SUHANI PANDEY
 
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)Delhi Call girls
 
Call Girls Sangvi Call Me 7737669865 Budget Friendly No Advance BookingCall G...
Call Girls Sangvi Call Me 7737669865 Budget Friendly No Advance BookingCall G...Call Girls Sangvi Call Me 7737669865 Budget Friendly No Advance BookingCall G...
Call Girls Sangvi Call Me 7737669865 Budget Friendly No Advance BookingCall G...roncy bisnoi
 
2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs
2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs
2nd Solid Symposium: Solid Pods vs Personal Knowledge GraphsEleniIlkou
 
Katraj ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For S...
Katraj ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For S...Katraj ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For S...
Katraj ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For S...tanu pandey
 
Dubai Call Girls Milky O525547819 Call Girls Dubai Soft Dating
Dubai Call Girls Milky O525547819 Call Girls Dubai Soft DatingDubai Call Girls Milky O525547819 Call Girls Dubai Soft Dating
Dubai Call Girls Milky O525547819 Call Girls Dubai Soft Datingkojalkojal131
 
𓀤Call On 7877925207 𓀤 Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...
𓀤Call On 7877925207 𓀤 Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...𓀤Call On 7877925207 𓀤 Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...
𓀤Call On 7877925207 𓀤 Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...Neha Pandey
 

Dernier (20)

Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...
Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...
Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...
 
VIP Call Girls Pollachi 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Pollachi 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Pollachi 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Pollachi 7001035870 Whatsapp Number, 24/07 Booking
 
Call Girls in Prashant Vihar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Prashant Vihar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Prashant Vihar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Prashant Vihar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
 
Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.
 
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...
 
Real Escorts in Al Nahda +971524965298 Dubai Escorts Service
Real Escorts in Al Nahda +971524965298 Dubai Escorts ServiceReal Escorts in Al Nahda +971524965298 Dubai Escorts Service
Real Escorts in Al Nahda +971524965298 Dubai Escorts Service
 
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLLucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
 
VVVIP Call Girls In Connaught Place ➡️ Delhi ➡️ 9999965857 🚀 No Advance 24HRS...
VVVIP Call Girls In Connaught Place ➡️ Delhi ➡️ 9999965857 🚀 No Advance 24HRS...VVVIP Call Girls In Connaught Place ➡️ Delhi ➡️ 9999965857 🚀 No Advance 24HRS...
VVVIP Call Girls In Connaught Place ➡️ Delhi ➡️ 9999965857 🚀 No Advance 24HRS...
 
Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Shahpur Jat Escort Service Delhi N.C.R.
 
VVIP Pune Call Girls Mohammadwadi WhatSapp Number 8005736733 With Elite Staff...
VVIP Pune Call Girls Mohammadwadi WhatSapp Number 8005736733 With Elite Staff...VVIP Pune Call Girls Mohammadwadi WhatSapp Number 8005736733 With Elite Staff...
VVIP Pune Call Girls Mohammadwadi WhatSapp Number 8005736733 With Elite Staff...
 
Real Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirtReal Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirt
 
VIP Model Call Girls NIBM ( Pune ) Call ON 8005736733 Starting From 5K to 25K...
VIP Model Call Girls NIBM ( Pune ) Call ON 8005736733 Starting From 5K to 25K...VIP Model Call Girls NIBM ( Pune ) Call ON 8005736733 Starting From 5K to 25K...
VIP Model Call Girls NIBM ( Pune ) Call ON 8005736733 Starting From 5K to 25K...
 
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)
 
Call Girls Sangvi Call Me 7737669865 Budget Friendly No Advance BookingCall G...
Call Girls Sangvi Call Me 7737669865 Budget Friendly No Advance BookingCall G...Call Girls Sangvi Call Me 7737669865 Budget Friendly No Advance BookingCall G...
Call Girls Sangvi Call Me 7737669865 Budget Friendly No Advance BookingCall G...
 
valsad Escorts Service ☎️ 6378878445 ( Sakshi Sinha ) High Profile Call Girls...
valsad Escorts Service ☎️ 6378878445 ( Sakshi Sinha ) High Profile Call Girls...valsad Escorts Service ☎️ 6378878445 ( Sakshi Sinha ) High Profile Call Girls...
valsad Escorts Service ☎️ 6378878445 ( Sakshi Sinha ) High Profile Call Girls...
 
2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs
2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs
2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs
 
Russian Call Girls in %(+971524965298 )# Call Girls in Dubai
Russian Call Girls in %(+971524965298  )#  Call Girls in DubaiRussian Call Girls in %(+971524965298  )#  Call Girls in Dubai
Russian Call Girls in %(+971524965298 )# Call Girls in Dubai
 
Katraj ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For S...
Katraj ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For S...Katraj ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For S...
Katraj ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For S...
 
Dubai Call Girls Milky O525547819 Call Girls Dubai Soft Dating
Dubai Call Girls Milky O525547819 Call Girls Dubai Soft DatingDubai Call Girls Milky O525547819 Call Girls Dubai Soft Dating
Dubai Call Girls Milky O525547819 Call Girls Dubai Soft Dating
 
𓀤Call On 7877925207 𓀤 Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...
𓀤Call On 7877925207 𓀤 Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...𓀤Call On 7877925207 𓀤 Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...
𓀤Call On 7877925207 𓀤 Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...
 

Implementing data sync apis for mibile apps @cloudconf