SlideShare a Scribd company logo
1 of 57
Download to read offline
44




Peter Friese / Stefan Reichert, Zühlke Engineering


CouchDB mobile
From Couch To 5k in 1 Hour
Peter Friese




  @peterfriese
  peter.friese@zuehlke.com
  xing.to/peter
  http://peterfriese.de
Stefan Reichert




             @stefanreichert

stefan.reichert@zuehlke.com

       xing.to/stefanreichert

http://blog.wickedshell.net/
What we will cover today


 1   What is CouchDB?


 2   Serious amount of demos!


 3   Couch25K - A Runner’s App
What is CouchDB?

                   1
CouchDB is...
CouchDB is...
          A NoSQL Database.
CouchDB is...
            Document-Oriented.
   {
   !   "name": "Peter",
   !   "company": "Zühlke Engineering",
   !   "email": "peter.friese@zuehlke.com",
   !   "languages": [
   !   ! "Objective-C",
   !   ! "Java",
   !   ! "C#",
   !   ! "JavaScript"
   !   ]
   }
CouchDB is...
            Schema-Free.

                Put anything
                you like into
                your CouchDB.
                Really.
CouchDB is...
          Erlang-Powered.
CouchDB is...
                 RESTful.

 GET
 PUT            Fully embraces
 POST           HTTP verbs
 DELETE
CouchDB uses...




http://research.google.com/archive/mapreduce.html
                                                    Map/Reduce (JavaScript).
CouchDB uses...

   Map/Reduce (JavaScript).

Input
{"ip":   "212.23.45.12","traffic": “18278", date: “2012-03-11”},
{"ip":   "74.12.345.1","traffic": “345", date: “2012-03-11”},
{"ip":   "212.23.45.12","traffic": “112244", date: “2012-03-12”},
{"ip":   "212.23.45.12","traffic": “8657", date: “2012-03-13”},
{"ip":   "74.12.345.12","traffic": “12", date: “2012-03-12”},
{"ip":   "10.122.111.22","traffic": “122222", date: “2012-03-11”}
CouchDB uses...

   Map/Reduce (JavaScript).

Mapper                   Input for Reducer
212.23.45.12    18278    212.23.45.12    18278
74.12.345.1     345      212.23.45.12    112244
212.23.45.12    112244   212.23.45.12    8657
212.23.45.12    8657
74.12.345.1     12       74.12.345.1     12
10.122.111.22   122222   74.12.345.1     345

                         10.122.111.22   122222
CouchDB uses...

   Map/Reduce (JavaScript).
Input for Reducer After Reduce
212.23.45.12    18278    212.23.45.12    139179
212.23.45.12    112244
212.23.45.12    8657

74.12.345.1     12       74.12.345.1     357
74.12.345.1     345

10.122.111.22   122222   10.122.111.22   122222
CouchDB features...
       Robust Replication.
CouchDB features...
          Robust Replication.
                     Laptop


  Phone


                     Server
Demos

        2
Calling Home

  curl localhost:5984


{"couchdb":"Welcome","version":"1.1.0"}
Creating a New DB

 curl -X PUT localhost:5984/helloworld



                         {"ok":true}
Deleting a Database
 curl -X DELETE http://
 localhost:5984/helloworld


                             {"ok":true}
Creating a New Document
 curl
   -X POST
   -H "Content-Type: application/json"
   localhost:5984/helloworld
   -d @peter.json


 {"ok":true,"id":"f8e42aaa4bc77124c28
 6be13f000054e","rev":"1-4dc37117e0da
 26d9c50dc92d4cbb04cc"}
Curious? GET Your Document!
 curl http://localhost:5984/helloworld/
 f8e42aaa4bc77124c286be13f000054e



 {
     "_id": "f8e42aaa4bc77124c286be13f000054e",
     "_rev": "1-4dc37117e0da26d9c50dc92d4cbb04cc",
     "name": "Peter",
     "company": "Zühlke Engineering",
     "email": "peter.friese@zuehlke.com"
 }
Anatomy of a Document
{
    "_id": "f8e42aaa4bc77124c286be13f000054e",
    "_rev": "1-4dc37117e0da26d9c50dc92d4cbb04cc",
    "name": "Peter",
    "company": "Zühlke Engineering",
    "email": "peter.friese@zuehlke.com"
}

           UUID - very
          unique identifier
Anatomy of a Document
 {
     "_id": "f8e42aaa4bc77124c286be13f000054e",
     "_rev": "1-4dc37117e0da26d9c50dc92d4cbb04cc",
     "name": "Peter",
     "company": "Zühlke Engineering",
     "email": "peter.friese@zuehlke.com"
 }


revision revision              hash (body,
number counter                 attachment,
                              _deleted flag)
Welcome to Futon!


         Admin interface for CouchDB
         CRUD for Documents
         Manage Views
         Manage Replication
Couch25K - A Runner’s App

                     3
Basic Idea




         2-way       2-way

 Phone       IrisCouch       Phone
CouchDB Mobile




                     n e ?
                P h o
        o u r
     n y
   o
CouchDB Mobile

Your app   CouchCocoa lib     Ektorp lib   Your app




           CouchDB          CouchDB
CouchDB Mobile
 Your app   CouchCocoa lib    Ektorp lib   Your app




             TouchDB lib     TouchDB lib




             SQlite          SQlite
CouchDB Mobile


   “TouchDB is a lightweight CouchDB-
   compatible database engine suitable
   for embedding into mobile or desktop
   apps. Think of it this way: If
   CouchDB is MySQL, then TouchDB
   is SQLite.”  - Jens Alfke, Couchbase
                Labs
Start a Local Couch
 CouchTouchDBServer *server =
  [CouchTouchDBServer sharedInstance];
 NSAssert(!server.error,
  @"Error initializing TouchDB server: %@",
  server.error);

 self.database = [server
  databaseNamed:@"couch25k"];

 NSError *error;
 if (! [self.database ensureCreated:&error]) {
   // raise error
   self.connected = false;
 }
Start a Local Couch
try {
  TDServer touchDBServer = new TDServer(filesDir);
!
  HttpClient httpClient = new
   TouchDBHttpClient(touchDBServer);
  CouchDbInstance couchDBInstance =
   new StdCouchDbInstance(httpClient);
!
  CouchDbConnector couchDBConnector =
   couchDBInstance.createConnector(COUCH25K_DB,true);
! ...
} catch (IOException e) {
! Log.e(TAG, "Error starting TDServer", e);
}
Trackpoints



  {
      "run": "run-peterfriese-19",
      "user": "peterfriese",
      "lon": "9.990512659959458",
      "time": "2012-03-24 07:39:27 +0000",
      "lat": "53.73176022303823"
  }
Saving a Trackpoint
NSDictionary *trackpointProperties =
 [NSDictionary dictionaryWithObjectsAndKeys: (...)

CouchDocument *trackpointDocument =
 [database untitledDocument];

RESTOperation* op = [trackpointDocument
 putProperties:trackpointProperties];

[op onCompletion: ^{
 if (op.error)
   NSLog(@"Couldn't save the new item");
 }];
[op start];
Saving a Trackpoint
Ektorp: JPA for CouchDB
  public class TrackPoint extends CouchDbDocument


Repository Support
  public class TrackPointRepository extends
  ! CouchDbRepositorySupport<TrackPoint>


... so saving a TrackPoint is pretty easy
  trackPointRepository.add(trackPoint);
Sync with the Server


NSURL *url = [NSURL
 URLWithString:
   @"http://peterfriese.iriscouch.com/couch25k"];

[self.database replicateWithURL:url exclusively: YES];
Sync with the Server
Pull from Server
 ReplicationCommand commandPull = new
  ReplicationCommand.Builder()
    .source(COUCH25K_REMOTE_DB)
    .target(COUCH25K_DB)
    .continuous(true).build();

 try {
   couchDBInstance.replicate(commandPull);
 } catch (Exception exception) {
   Log.e(TAG, exception.getMessage(), exception);
 }
Sync with the Server
Push to Server
 ReplicationCommand commandPush = new
  ReplicationCommand.Builder()
    .source(COUCH25K_DB)
    .target(COUCH25K_REMOTE_DB)
    .continuous(true).build();

 try {
   couchDBInstance.replicate(commandPush);
 } catch (Exception exception) {
   Log.e(TAG, exception.getMessage(), exception);
 }
Demo
Display List of Runs (JavaScript)

     Map                 Reduce
                       function(keys, values)
 function(doc) {
                       {
   emit(doc.run, 1);
                         return sum(values);
 }
                       }


  run-1    1
  run-1    1
                       run-1     3
  run-1    1
                       run-2     2
  run-2    1
  run-2    1
Display List of Runs (Obj-C)

Map
[design defineViewNamed: @"runs" mapBlock: MAPBLOCK({
 id run = [doc objectForKey:@"run"];
 if (run) emit(run, nil);
})


Reduce
reduceBlock:REDUCEBLOCK({
 return [NSNumber numberWithInt:values.count];
})
Display List of Runs (Java)

Map
new TDViewMapBlock() {
  public void map(Map<String, Object> doc,
    TDViewMapEmitBlock emitter) {
    if (doc.containsKey("run")) {
      emitter.emit(doc.get("run"), doc.get("_id"));
    }
  }
}
Display List of Runs (Java)
(Re-) reduce
new TDViewReduceBlock() {
 public Object reduce(List<Object> keys, List<Object>
   values, boolean rereduce) {
   if (rereduce) {
     int sum = 0;
     for (Object object : values) {
       sum += (Integer) object;
     }
     return sum;
   }
   return values.size();
 }
};
Filtering
        Peter           Stefan

            Filter by name




    sync 2-way        sync 2-way

Phone           IrisCouch    Phone 2
Filtering
CouchDB
by_user:

 function(doc, rq) {
   if(doc.user == rq.query.username) {
     return true;
   }
   return false;
 }
Filtering
NSArray *replications =
 [self.database replicateWithURL:url exclusively: YES];

CouchPersistentReplication *from =
 [replications objectAtIndex:0];
from.continuous = YES;

from.filter = @"couch25k/by_user";
NSDictionary *filterParams = [NSDictionary
 dictionaryWithObjectsAndKeys:
   @"peterfriese", @"username", nil];
from.query_params = filterParams;
Filtering
Map<String, Object> queryParams =
 new HashMap<String, Object>();
queryParams.put("username", "stefanreichert");

ReplicationCommand commandPull = new
  ReplicationCommand.Builder()
   .source(COUCH25K_REMOTE_DB)
   .target(COUCH25K_DB).continuous(true)
   .filter("by_user")
   .queryParams(queryParams).build();
try {
! couchDBInstance.replicate(commandPull);
} catch (Exception e) {
! Log.e(TAG, exception.getMessage(), e);
}
Maps, please!
Query Trackpoints by Run
Map
mapBlock: MAPBLOCK({
 NSString *run = (NSString *)[doc objectForKey:@"run"];
 id time = [doc objectForKey:@"time"];
 NSMutableArray *key = [[NSMutableArray alloc] init];
 [key addObject:run];
 [key addObject:time];
 emit(key, doc);})

[run-peter-1,   2012-03-23   10:10]   {lat:...,   lon:...}
[run-peter-1,   2012-03-23   10:11]   {lat:...,   lon:...}
[run-peter-2,   2012-03-26   20:05]   {lat:...,   lon:...}
[run-peter-2,   2012-03-26   20:06]   {lat:...,   lon:...}
[run-peter-2,   2012-03-26   10:07]   {lat:...,   lon:...}
Query Trackpoints by Run
Query
CouchQuery *query = [[self.database
 designDocumentWithName: @"couch25k"]
 queryViewNamed: @"waypoints_by_run"];

CouchLiveQuery *livequery = [query asLiveQuery];

[livequery setStartKey:
 [NSArray arrayWithObjects:self.runKey, nil]];

[query setEndKey:
 [NSArray arrayWithObjects:self.runKey, @"ZZZ", nil]];
Query Trackpoints by Run
Map
new TDViewMapBlock() {
  public void map(Map<String, Object> document,
   TDViewMapEmitBlock emitter) {
   if (document.containsKey("run")) {
     document.get("run"), document.get("_id"));
   }
}
Query Trackpoints by Run
Query
ViewQuery viewQuery = new
 ViewQuery().designDocId("_design/TrackPoint")
   .viewName("trackpoint_by_run")
   .key(runId);
ViewResult result = db.queryView(viewQuery);
List<TrackPoint> trackPoints = new
 ArrayList<TrackPoint>();

for (Row row : result.getRows()) {
  TrackPoint trackPoint = get(row.getValue());
  trackPoints.add(trackPoint);
}
return trackPoints;
And finally...




        http://josephta.me/about-joseph-tame/
... a Tribute to Steve Jobs
                                  GPX
                                of J   cou
                                            rtes
                                     ose         y
                                         ph
                                  - T       Tam
                                      han        e
                                          ks!




         http://bit.ly/HbDRod
Relax!




 44
Thanks!
Peter Friese
Principal Consultant
                                                      rt   @peterfr
Zühlke Engineering GmbH                 @stef anreiche             iese
Am Sandtorkai 66
20457 Hamburg                        Availa
                                            ble fo
+49 151 108 604 72                   discu         r con
                                           ssing          sultin
                                                  all th         g,
                   rt
           Reiche Engineer          mobil                ings
    Stefan
            Software
                                          e and
    Senior                      H   frost
               nginee
                      rin g Gmb           y beve
             E
     Zühlke torkai 66                            rages
             nd
      Am Sa           rg
              Hambu
      20457
                           6
                 961 43 3
       + 49 173


                                                           PS: we’re hiring...

More Related Content

What's hot

MongoDB: tips, trick and hacks
MongoDB: tips, trick and hacksMongoDB: tips, trick and hacks
MongoDB: tips, trick and hacksScott Hernandez
 
Logstash-Elasticsearch-Kibana
Logstash-Elasticsearch-KibanaLogstash-Elasticsearch-Kibana
Logstash-Elasticsearch-Kibanadknx01
 
Realtime Analytics Using MongoDB, Python, Gevent, and ZeroMQ
Realtime Analytics Using MongoDB, Python, Gevent, and ZeroMQRealtime Analytics Using MongoDB, Python, Gevent, and ZeroMQ
Realtime Analytics Using MongoDB, Python, Gevent, and ZeroMQRick Copeland
 
MySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELKMySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELKYoungHeon (Roy) Kim
 
Side by Side with Elasticsearch and Solr
Side by Side with Elasticsearch and SolrSide by Side with Elasticsearch and Solr
Side by Side with Elasticsearch and SolrSematext Group, Inc.
 
Logstash: Get to know your logs
Logstash: Get to know your logsLogstash: Get to know your logs
Logstash: Get to know your logsSmartLogic
 
mongoDB Performance
mongoDB PerformancemongoDB Performance
mongoDB PerformanceMoshe Kaplan
 
GCPUG meetup 201610 - Dataflow Introduction
GCPUG meetup 201610 - Dataflow IntroductionGCPUG meetup 201610 - Dataflow Introduction
GCPUG meetup 201610 - Dataflow IntroductionSimon Su
 
Debugging and Testing ES Systems
Debugging and Testing ES SystemsDebugging and Testing ES Systems
Debugging and Testing ES SystemsChris Birchall
 
Rapid, Scalable Web Development with MongoDB, Ming, and Python
Rapid, Scalable Web Development with MongoDB, Ming, and PythonRapid, Scalable Web Development with MongoDB, Ming, and Python
Rapid, Scalable Web Development with MongoDB, Ming, and PythonRick Copeland
 
아파트 정보를 이용한 ELK stack 활용 - 오근문
아파트 정보를 이용한 ELK stack 활용 - 오근문아파트 정보를 이용한 ELK stack 활용 - 오근문
아파트 정보를 이용한 ELK stack 활용 - 오근문NAVER D2
 
Building .NET Apps using Couchbase Lite
Building .NET Apps using Couchbase LiteBuilding .NET Apps using Couchbase Lite
Building .NET Apps using Couchbase Litegramana
 

What's hot (20)

MongoDB: tips, trick and hacks
MongoDB: tips, trick and hacksMongoDB: tips, trick and hacks
MongoDB: tips, trick and hacks
 
Elk stack
Elk stackElk stack
Elk stack
 
Logstash-Elasticsearch-Kibana
Logstash-Elasticsearch-KibanaLogstash-Elasticsearch-Kibana
Logstash-Elasticsearch-Kibana
 
OrientDB
OrientDBOrientDB
OrientDB
 
Realtime Analytics Using MongoDB, Python, Gevent, and ZeroMQ
Realtime Analytics Using MongoDB, Python, Gevent, and ZeroMQRealtime Analytics Using MongoDB, Python, Gevent, and ZeroMQ
Realtime Analytics Using MongoDB, Python, Gevent, and ZeroMQ
 
MySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELKMySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELK
 
Elk stack @inbot
Elk stack @inbotElk stack @inbot
Elk stack @inbot
 
Side by Side with Elasticsearch and Solr
Side by Side with Elasticsearch and SolrSide by Side with Elasticsearch and Solr
Side by Side with Elasticsearch and Solr
 
Logstash: Get to know your logs
Logstash: Get to know your logsLogstash: Get to know your logs
Logstash: Get to know your logs
 
mongoDB Performance
mongoDB PerformancemongoDB Performance
mongoDB Performance
 
GCPUG meetup 201610 - Dataflow Introduction
GCPUG meetup 201610 - Dataflow IntroductionGCPUG meetup 201610 - Dataflow Introduction
GCPUG meetup 201610 - Dataflow Introduction
 
wtf is in Java/JDK/wtf7?
wtf is in Java/JDK/wtf7?wtf is in Java/JDK/wtf7?
wtf is in Java/JDK/wtf7?
 
Debugging and Testing ES Systems
Debugging and Testing ES SystemsDebugging and Testing ES Systems
Debugging and Testing ES Systems
 
Rapid, Scalable Web Development with MongoDB, Ming, and Python
Rapid, Scalable Web Development with MongoDB, Ming, and PythonRapid, Scalable Web Development with MongoDB, Ming, and Python
Rapid, Scalable Web Development with MongoDB, Ming, and Python
 
Elastic Search
Elastic SearchElastic Search
Elastic Search
 
아파트 정보를 이용한 ELK stack 활용 - 오근문
아파트 정보를 이용한 ELK stack 활용 - 오근문아파트 정보를 이용한 ELK stack 활용 - 오근문
아파트 정보를 이용한 ELK stack 활용 - 오근문
 
Building .NET Apps using Couchbase Lite
Building .NET Apps using Couchbase LiteBuilding .NET Apps using Couchbase Lite
Building .NET Apps using Couchbase Lite
 
ElasticSearch
ElasticSearchElasticSearch
ElasticSearch
 
Unqlite
UnqliteUnqlite
Unqlite
 
LogStash in action
LogStash in actionLogStash in action
LogStash in action
 

Similar to CouchDB Mobile App in 1 Hour

OSCON 2011 CouchApps
OSCON 2011 CouchAppsOSCON 2011 CouchApps
OSCON 2011 CouchAppsBradley Holt
 
Flask and Angular: An approach to build robust platforms
Flask and Angular:  An approach to build robust platformsFlask and Angular:  An approach to build robust platforms
Flask and Angular: An approach to build robust platformsAyush Sharma
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomyDongmin Yu
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on AndroidSven Haiges
 
Couchdb: No SQL? No driver? No problem
Couchdb: No SQL? No driver? No problemCouchdb: No SQL? No driver? No problem
Couchdb: No SQL? No driver? No problemdelagoya
 
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016Luigi Dell'Aquila
 
REST with Eve and Python
REST with Eve and PythonREST with Eve and Python
REST with Eve and PythonPiXeL16
 
Introduction tomongodb
Introduction tomongodbIntroduction tomongodb
Introduction tomongodbLee Theobald
 
Advanced CouchDB Rotterdam.rb July 2010
Advanced CouchDB Rotterdam.rb July 2010Advanced CouchDB Rotterdam.rb July 2010
Advanced CouchDB Rotterdam.rb July 2010Sander van de Graaf
 
Barcelona MUG MongoDB + Hadoop Presentation
Barcelona MUG MongoDB + Hadoop PresentationBarcelona MUG MongoDB + Hadoop Presentation
Barcelona MUG MongoDB + Hadoop PresentationNorberto Leite
 
Infrastructure-as-code: bridging the gap between Devs and Ops
Infrastructure-as-code: bridging the gap between Devs and OpsInfrastructure-as-code: bridging the gap between Devs and Ops
Infrastructure-as-code: bridging the gap between Devs and OpsMykyta Protsenko
 
NoSQL - An introduction to CouchDB
NoSQL - An introduction to CouchDBNoSQL - An introduction to CouchDB
NoSQL - An introduction to CouchDBJonathan Weiss
 
Apache CouchDB talk at Ontario GNU Linux Fest
Apache CouchDB talk at Ontario GNU Linux FestApache CouchDB talk at Ontario GNU Linux Fest
Apache CouchDB talk at Ontario GNU Linux FestMyles Braithwaite
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기NAVER D2
 
Solutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
Solutions for bi-directional Integration between Oracle RDMBS & Apache KafkaSolutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
Solutions for bi-directional Integration between Oracle RDMBS & Apache KafkaGuido Schmutz
 
Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...
Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...
Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...confluent
 
Блохин Леонид - "Mist, как часть Hydrosphere"
Блохин Леонид - "Mist, как часть Hydrosphere"Блохин Леонид - "Mist, как часть Hydrosphere"
Блохин Леонид - "Mist, как часть Hydrosphere"Provectus
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksMongoDB
 

Similar to CouchDB Mobile App in 1 Hour (20)

OSCON 2011 CouchApps
OSCON 2011 CouchAppsOSCON 2011 CouchApps
OSCON 2011 CouchApps
 
Flask and Angular: An approach to build robust platforms
Flask and Angular:  An approach to build robust platformsFlask and Angular:  An approach to build robust platforms
Flask and Angular: An approach to build robust platforms
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomy
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
 
Couchdb: No SQL? No driver? No problem
Couchdb: No SQL? No driver? No problemCouchdb: No SQL? No driver? No problem
Couchdb: No SQL? No driver? No problem
 
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
 
REST with Eve and Python
REST with Eve and PythonREST with Eve and Python
REST with Eve and Python
 
Introduction tomongodb
Introduction tomongodbIntroduction tomongodb
Introduction tomongodb
 
Advanced CouchDB Rotterdam.rb July 2010
Advanced CouchDB Rotterdam.rb July 2010Advanced CouchDB Rotterdam.rb July 2010
Advanced CouchDB Rotterdam.rb July 2010
 
Barcelona MUG MongoDB + Hadoop Presentation
Barcelona MUG MongoDB + Hadoop PresentationBarcelona MUG MongoDB + Hadoop Presentation
Barcelona MUG MongoDB + Hadoop Presentation
 
Infrastructure-as-code: bridging the gap between Devs and Ops
Infrastructure-as-code: bridging the gap between Devs and OpsInfrastructure-as-code: bridging the gap between Devs and Ops
Infrastructure-as-code: bridging the gap between Devs and Ops
 
NoSQL - An introduction to CouchDB
NoSQL - An introduction to CouchDBNoSQL - An introduction to CouchDB
NoSQL - An introduction to CouchDB
 
Apache CouchDB talk at Ontario GNU Linux Fest
Apache CouchDB talk at Ontario GNU Linux FestApache CouchDB talk at Ontario GNU Linux Fest
Apache CouchDB talk at Ontario GNU Linux Fest
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기
 
Solutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
Solutions for bi-directional Integration between Oracle RDMBS & Apache KafkaSolutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
Solutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
 
Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...
Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...
Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...
 
Doctrine and NoSQL
Doctrine and NoSQLDoctrine and NoSQL
Doctrine and NoSQL
 
Play!ng with scala
Play!ng with scalaPlay!ng with scala
Play!ng with scala
 
Блохин Леонид - "Mist, как часть Hydrosphere"
Блохин Леонид - "Mist, как часть Hydrosphere"Блохин Леонид - "Mist, как часть Hydrosphere"
Блохин Леонид - "Mist, как часть Hydrosphere"
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New Tricks
 

More from Peter Friese

Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsPeter Friese
 
Firebase & SwiftUI Workshop
Firebase & SwiftUI WorkshopFirebase & SwiftUI Workshop
Firebase & SwiftUI WorkshopPeter Friese
 
Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsPeter Friese
 
Firebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroesFirebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroesPeter Friese
 
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift LeedsPeter Friese
 
async/await in Swift
async/await in Swiftasync/await in Swift
async/await in SwiftPeter Friese
 
Firebase for Apple Developers
Firebase for Apple DevelopersFirebase for Apple Developers
Firebase for Apple DevelopersPeter Friese
 
Building Apps with SwiftUI and Firebase
Building Apps with SwiftUI and FirebaseBuilding Apps with SwiftUI and Firebase
Building Apps with SwiftUI and FirebasePeter Friese
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebasePeter Friese
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebasePeter Friese
 
6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase Auth6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase AuthPeter Friese
 
Five Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase AuthFive Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase AuthPeter Friese
 
Building High-Quality Apps for Google Assistant
Building High-Quality Apps for Google AssistantBuilding High-Quality Apps for Google Assistant
Building High-Quality Apps for Google AssistantPeter Friese
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google Peter Friese
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on GoogleBuilding Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on GooglePeter Friese
 
What's new in Android Wear 2.0
What's new in Android Wear 2.0What's new in Android Wear 2.0
What's new in Android Wear 2.0Peter Friese
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinGoogle Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinPeter Friese
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android WearPeter Friese
 
Google Play Services Rock
Google Play Services RockGoogle Play Services Rock
Google Play Services RockPeter Friese
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android WearPeter Friese
 

More from Peter Friese (20)

Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI Components
 
Firebase & SwiftUI Workshop
Firebase & SwiftUI WorkshopFirebase & SwiftUI Workshop
Firebase & SwiftUI Workshop
 
Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI Components
 
Firebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroesFirebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroes
 
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 
async/await in Swift
async/await in Swiftasync/await in Swift
async/await in Swift
 
Firebase for Apple Developers
Firebase for Apple DevelopersFirebase for Apple Developers
Firebase for Apple Developers
 
Building Apps with SwiftUI and Firebase
Building Apps with SwiftUI and FirebaseBuilding Apps with SwiftUI and Firebase
Building Apps with SwiftUI and Firebase
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and Firebase
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and Firebase
 
6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase Auth6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase Auth
 
Five Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase AuthFive Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase Auth
 
Building High-Quality Apps for Google Assistant
Building High-Quality Apps for Google AssistantBuilding High-Quality Apps for Google Assistant
Building High-Quality Apps for Google Assistant
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on GoogleBuilding Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google
 
What's new in Android Wear 2.0
What's new in Android Wear 2.0What's new in Android Wear 2.0
What's new in Android Wear 2.0
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinGoogle Fit, Android Wear & Xamarin
Google Fit, Android Wear & Xamarin
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android Wear
 
Google Play Services Rock
Google Play Services RockGoogle Play Services Rock
Google Play Services Rock
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android Wear
 

Recently uploaded

New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Scott Andery
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 

Recently uploaded (20)

New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 

CouchDB Mobile App in 1 Hour

  • 1. 44 Peter Friese / Stefan Reichert, Zühlke Engineering CouchDB mobile From Couch To 5k in 1 Hour
  • 2. Peter Friese @peterfriese peter.friese@zuehlke.com xing.to/peter http://peterfriese.de
  • 3. Stefan Reichert @stefanreichert stefan.reichert@zuehlke.com xing.to/stefanreichert http://blog.wickedshell.net/
  • 4. What we will cover today 1 What is CouchDB? 2 Serious amount of demos! 3 Couch25K - A Runner’s App
  • 6. CouchDB is... CouchDB is... A NoSQL Database.
  • 7. CouchDB is... Document-Oriented. { ! "name": "Peter", ! "company": "Zühlke Engineering", ! "email": "peter.friese@zuehlke.com", ! "languages": [ ! ! "Objective-C", ! ! "Java", ! ! "C#", ! ! "JavaScript" ! ] }
  • 8. CouchDB is... Schema-Free. Put anything you like into your CouchDB. Really.
  • 9. CouchDB is... Erlang-Powered.
  • 10. CouchDB is... RESTful. GET PUT Fully embraces POST HTTP verbs DELETE
  • 12. CouchDB uses... Map/Reduce (JavaScript). Input {"ip": "212.23.45.12","traffic": “18278", date: “2012-03-11”}, {"ip": "74.12.345.1","traffic": “345", date: “2012-03-11”}, {"ip": "212.23.45.12","traffic": “112244", date: “2012-03-12”}, {"ip": "212.23.45.12","traffic": “8657", date: “2012-03-13”}, {"ip": "74.12.345.12","traffic": “12", date: “2012-03-12”}, {"ip": "10.122.111.22","traffic": “122222", date: “2012-03-11”}
  • 13. CouchDB uses... Map/Reduce (JavaScript). Mapper Input for Reducer 212.23.45.12 18278 212.23.45.12 18278 74.12.345.1 345 212.23.45.12 112244 212.23.45.12 112244 212.23.45.12 8657 212.23.45.12 8657 74.12.345.1 12 74.12.345.1 12 10.122.111.22 122222 74.12.345.1 345 10.122.111.22 122222
  • 14. CouchDB uses... Map/Reduce (JavaScript). Input for Reducer After Reduce 212.23.45.12 18278 212.23.45.12 139179 212.23.45.12 112244 212.23.45.12 8657 74.12.345.1 12 74.12.345.1 357 74.12.345.1 345 10.122.111.22 122222 10.122.111.22 122222
  • 15. CouchDB features... Robust Replication.
  • 16. CouchDB features... Robust Replication. Laptop Phone Server
  • 17. Demos 2
  • 18. Calling Home curl localhost:5984 {"couchdb":"Welcome","version":"1.1.0"}
  • 19. Creating a New DB curl -X PUT localhost:5984/helloworld {"ok":true}
  • 20. Deleting a Database curl -X DELETE http:// localhost:5984/helloworld {"ok":true}
  • 21. Creating a New Document curl -X POST -H "Content-Type: application/json" localhost:5984/helloworld -d @peter.json {"ok":true,"id":"f8e42aaa4bc77124c28 6be13f000054e","rev":"1-4dc37117e0da 26d9c50dc92d4cbb04cc"}
  • 22. Curious? GET Your Document! curl http://localhost:5984/helloworld/ f8e42aaa4bc77124c286be13f000054e { "_id": "f8e42aaa4bc77124c286be13f000054e", "_rev": "1-4dc37117e0da26d9c50dc92d4cbb04cc", "name": "Peter", "company": "Zühlke Engineering", "email": "peter.friese@zuehlke.com" }
  • 23. Anatomy of a Document { "_id": "f8e42aaa4bc77124c286be13f000054e", "_rev": "1-4dc37117e0da26d9c50dc92d4cbb04cc", "name": "Peter", "company": "Zühlke Engineering", "email": "peter.friese@zuehlke.com" } UUID - very unique identifier
  • 24. Anatomy of a Document { "_id": "f8e42aaa4bc77124c286be13f000054e", "_rev": "1-4dc37117e0da26d9c50dc92d4cbb04cc", "name": "Peter", "company": "Zühlke Engineering", "email": "peter.friese@zuehlke.com" } revision revision hash (body, number counter attachment, _deleted flag)
  • 25. Welcome to Futon! Admin interface for CouchDB CRUD for Documents Manage Views Manage Replication
  • 26. Couch25K - A Runner’s App 3
  • 27. Basic Idea 2-way 2-way Phone IrisCouch Phone
  • 28. CouchDB Mobile n e ? P h o o u r n y o
  • 29. CouchDB Mobile Your app CouchCocoa lib Ektorp lib Your app CouchDB CouchDB
  • 30. CouchDB Mobile Your app CouchCocoa lib Ektorp lib Your app TouchDB lib TouchDB lib SQlite SQlite
  • 31. CouchDB Mobile “TouchDB is a lightweight CouchDB- compatible database engine suitable for embedding into mobile or desktop apps. Think of it this way: If CouchDB is MySQL, then TouchDB is SQLite.” - Jens Alfke, Couchbase Labs
  • 32. Start a Local Couch CouchTouchDBServer *server = [CouchTouchDBServer sharedInstance]; NSAssert(!server.error, @"Error initializing TouchDB server: %@", server.error); self.database = [server databaseNamed:@"couch25k"]; NSError *error; if (! [self.database ensureCreated:&error]) { // raise error self.connected = false; }
  • 33. Start a Local Couch try { TDServer touchDBServer = new TDServer(filesDir); ! HttpClient httpClient = new TouchDBHttpClient(touchDBServer); CouchDbInstance couchDBInstance = new StdCouchDbInstance(httpClient); ! CouchDbConnector couchDBConnector = couchDBInstance.createConnector(COUCH25K_DB,true); ! ... } catch (IOException e) { ! Log.e(TAG, "Error starting TDServer", e); }
  • 34. Trackpoints { "run": "run-peterfriese-19", "user": "peterfriese", "lon": "9.990512659959458", "time": "2012-03-24 07:39:27 +0000", "lat": "53.73176022303823" }
  • 35. Saving a Trackpoint NSDictionary *trackpointProperties = [NSDictionary dictionaryWithObjectsAndKeys: (...) CouchDocument *trackpointDocument = [database untitledDocument]; RESTOperation* op = [trackpointDocument putProperties:trackpointProperties]; [op onCompletion: ^{ if (op.error) NSLog(@"Couldn't save the new item"); }]; [op start];
  • 36. Saving a Trackpoint Ektorp: JPA for CouchDB public class TrackPoint extends CouchDbDocument Repository Support public class TrackPointRepository extends ! CouchDbRepositorySupport<TrackPoint> ... so saving a TrackPoint is pretty easy trackPointRepository.add(trackPoint);
  • 37. Sync with the Server NSURL *url = [NSURL URLWithString: @"http://peterfriese.iriscouch.com/couch25k"]; [self.database replicateWithURL:url exclusively: YES];
  • 38. Sync with the Server Pull from Server ReplicationCommand commandPull = new ReplicationCommand.Builder() .source(COUCH25K_REMOTE_DB) .target(COUCH25K_DB) .continuous(true).build(); try { couchDBInstance.replicate(commandPull); } catch (Exception exception) { Log.e(TAG, exception.getMessage(), exception); }
  • 39. Sync with the Server Push to Server ReplicationCommand commandPush = new ReplicationCommand.Builder() .source(COUCH25K_DB) .target(COUCH25K_REMOTE_DB) .continuous(true).build(); try { couchDBInstance.replicate(commandPush); } catch (Exception exception) { Log.e(TAG, exception.getMessage(), exception); }
  • 40. Demo
  • 41. Display List of Runs (JavaScript) Map Reduce function(keys, values) function(doc) { { emit(doc.run, 1); return sum(values); } } run-1 1 run-1 1 run-1 3 run-1 1 run-2 2 run-2 1 run-2 1
  • 42. Display List of Runs (Obj-C) Map [design defineViewNamed: @"runs" mapBlock: MAPBLOCK({ id run = [doc objectForKey:@"run"]; if (run) emit(run, nil); }) Reduce reduceBlock:REDUCEBLOCK({ return [NSNumber numberWithInt:values.count]; })
  • 43. Display List of Runs (Java) Map new TDViewMapBlock() { public void map(Map<String, Object> doc, TDViewMapEmitBlock emitter) { if (doc.containsKey("run")) { emitter.emit(doc.get("run"), doc.get("_id")); } } }
  • 44. Display List of Runs (Java) (Re-) reduce new TDViewReduceBlock() { public Object reduce(List<Object> keys, List<Object> values, boolean rereduce) { if (rereduce) { int sum = 0; for (Object object : values) { sum += (Integer) object; } return sum; } return values.size(); } };
  • 45. Filtering Peter Stefan Filter by name sync 2-way sync 2-way Phone IrisCouch Phone 2
  • 46. Filtering CouchDB by_user: function(doc, rq) { if(doc.user == rq.query.username) { return true; } return false; }
  • 47. Filtering NSArray *replications = [self.database replicateWithURL:url exclusively: YES]; CouchPersistentReplication *from = [replications objectAtIndex:0]; from.continuous = YES; from.filter = @"couch25k/by_user"; NSDictionary *filterParams = [NSDictionary dictionaryWithObjectsAndKeys: @"peterfriese", @"username", nil]; from.query_params = filterParams;
  • 48. Filtering Map<String, Object> queryParams = new HashMap<String, Object>(); queryParams.put("username", "stefanreichert"); ReplicationCommand commandPull = new ReplicationCommand.Builder() .source(COUCH25K_REMOTE_DB) .target(COUCH25K_DB).continuous(true) .filter("by_user") .queryParams(queryParams).build(); try { ! couchDBInstance.replicate(commandPull); } catch (Exception e) { ! Log.e(TAG, exception.getMessage(), e); }
  • 50. Query Trackpoints by Run Map mapBlock: MAPBLOCK({ NSString *run = (NSString *)[doc objectForKey:@"run"]; id time = [doc objectForKey:@"time"]; NSMutableArray *key = [[NSMutableArray alloc] init]; [key addObject:run]; [key addObject:time]; emit(key, doc);}) [run-peter-1, 2012-03-23 10:10] {lat:..., lon:...} [run-peter-1, 2012-03-23 10:11] {lat:..., lon:...} [run-peter-2, 2012-03-26 20:05] {lat:..., lon:...} [run-peter-2, 2012-03-26 20:06] {lat:..., lon:...} [run-peter-2, 2012-03-26 10:07] {lat:..., lon:...}
  • 51. Query Trackpoints by Run Query CouchQuery *query = [[self.database designDocumentWithName: @"couch25k"] queryViewNamed: @"waypoints_by_run"]; CouchLiveQuery *livequery = [query asLiveQuery]; [livequery setStartKey: [NSArray arrayWithObjects:self.runKey, nil]]; [query setEndKey: [NSArray arrayWithObjects:self.runKey, @"ZZZ", nil]];
  • 52. Query Trackpoints by Run Map new TDViewMapBlock() { public void map(Map<String, Object> document, TDViewMapEmitBlock emitter) { if (document.containsKey("run")) { document.get("run"), document.get("_id")); } }
  • 53. Query Trackpoints by Run Query ViewQuery viewQuery = new ViewQuery().designDocId("_design/TrackPoint") .viewName("trackpoint_by_run") .key(runId); ViewResult result = db.queryView(viewQuery); List<TrackPoint> trackPoints = new ArrayList<TrackPoint>(); for (Row row : result.getRows()) { TrackPoint trackPoint = get(row.getValue()); trackPoints.add(trackPoint); } return trackPoints;
  • 54. And finally... http://josephta.me/about-joseph-tame/
  • 55. ... a Tribute to Steve Jobs GPX of J cou rtes ose y ph - T Tam han e ks! http://bit.ly/HbDRod
  • 57. Thanks! Peter Friese Principal Consultant rt @peterfr Zühlke Engineering GmbH @stef anreiche iese Am Sandtorkai 66 20457 Hamburg Availa ble fo +49 151 108 604 72 discu r con ssing sultin all th g, rt Reiche Engineer mobil ings Stefan Software e and Senior H frost nginee rin g Gmb y beve E Zühlke torkai 66 rages nd Am Sa rg Hambu 20457 6 961 43 3 + 49 173 PS: we’re hiring...