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

Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 

Recently uploaded (20)

Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 

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...