mobile, web and cloud - the triple crown of modern applications

43
Mobile, Web and Cloud - The Triple Crown of Modern Applications Ido Green, Developer Advocate Danny Hermes, Developer Programs Engineer

Upload: ido-green

Post on 06-May-2015

553 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Mobile, web and cloud -  the triple crown of modern applications

Mobile, Web and Cloud - The Triple Crown of Modern Applications

Ido Green, Developer AdvocateDanny Hermes, Developer Programs Engineer

Page 2: Mobile, web and cloud -  the triple crown of modern applications

Modern Mobile/Web Applications

Page 3: Mobile, web and cloud -  the triple crown of modern applications

Modern Applications

● Self Contained

● "Offline First"

● MV* Frameworks

● Device Aware

● #Perfmatters

#io13

Page 4: Mobile, web and cloud -  the triple crown of modern applications

AngularJS - Client Side Framework

Angular.js - Let you extend HTML vocabulary for your application.

● Data binding

● Extensible HTML

● Dependency Injection / Testable

#io13

More options: addyosmani.github.com/todomvc/

Page 5: Mobile, web and cloud -  the triple crown of modern applications

Mobile World - RESTful World

#io13

Photos● GET http://ex.com/_ah/api/picturesque/v1/photos● POST http://ex.com/_ah/api/picturesque/v1/photo● PATCH http://ex.com/_ah/api/picturesque/v1/photo/id

Users● POST http://ex.com/_ah/api/picturesque/v1/users/join

And more...

Page 6: Mobile, web and cloud -  the triple crown of modern applications

● Performance! #Perfmatters

● Flaky connections (e.g. cafes, car)

● Airplane, road trip, deserted island

● Consolidates the concept of permanent application.

* We will use: Lawnchair for our demo.

Offline - Why?

#io13

Page 7: Mobile, web and cloud -  the triple crown of modern applications

● Storing assets: AppCache

● Storing data: localStorage, IndexedDB, File API.

● Offline first:○ Pretend that there's no internet connection○ Implement a sync layer that works only when

online.

Offline - How?

navigator.onLine & window.(ononline|onoffline)

#io13

Page 8: Mobile, web and cloud -  the triple crown of modern applications

Google Cloud Endpoints

Page 9: Mobile, web and cloud -  the triple crown of modern applications

Modern Apps and The Server Conundrum

All modern applications have to deal with a server○ Offload Computation○ Sharing and Collaboration○ Logs

But who wants to run a server○ Spikey traffic ○ Client Server communication○ Serialization○ OAuth Dance

#io13

Page 10: Mobile, web and cloud -  the triple crown of modern applications

Google App Engine

#io13

Page 11: Mobile, web and cloud -  the triple crown of modern applications

Google App Engine

#io13

Page 12: Mobile, web and cloud -  the triple crown of modern applications

Google Cloud Endpoints

#io13

Page 13: Mobile, web and cloud -  the triple crown of modern applications

Back the Truck Up

#io13

Page 15: Mobile, web and cloud -  the triple crown of modern applications

Google APIs: Client Libraries Like Whoa!!● Web

○ JavaScript: google-api-javascript-client○ Node.js: google-api-nodejs-client○ Dart: google-api-dart-client

● Mobile○ Objective C: google-api-objectivec-client○ Java: google-api-java-client

● Server-side○ Ruby: google-api-ruby-client○ Python: google-api-python-client○ Go: google-api-go-client○ PHP: google-api-php-client○ .NET: google-api-dotnet-client○ GWT: gwt-google-apis#io13

Page 16: Mobile, web and cloud -  the triple crown of modern applications

Google APIs

Client Libraries Like Whoa!!HTML

<body> ... <script type="text/javascript"> function init() { gapi.client.load(‘urlshortener’, 'v1’, function() {}); } </script> <script src="https://apis.google.com/js/client.js?onload=init"></script></body>

Page 17: Mobile, web and cloud -  the triple crown of modern applications

What Was that Again: Google Cloud Endpoints

#io13

Page 18: Mobile, web and cloud -  the triple crown of modern applications

Demo Time!

picturesque-app.appspot.com

Page 19: Mobile, web and cloud -  the triple crown of modern applications

Data Model for CRUD App

Pythonfrom endpoints_proto_datastore.ndb import EndpointsModel

class Photo(EndpointsModel): ...

Page 20: Mobile, web and cloud -  the triple crown of modern applications

Data Model for CRUD App

Pythonfrom endpoints_proto_datastore.ndb import EndpointsModel

class Photo(EndpointsModel): title = ndb.StringProperty()

Page 21: Mobile, web and cloud -  the triple crown of modern applications

Data Model for CRUD App

Pythonfrom endpoints_proto_datastore.ndb import EndpointsModel

class Photo(EndpointsModel): title = ndb.StringProperty() description = ndb.StringProperty()

Page 22: Mobile, web and cloud -  the triple crown of modern applications

Data Model for CRUD App

Pythonfrom endpoints_proto_datastore.ndb import EndpointsModel

class Photo(EndpointsModel): title = ndb.StringProperty() description = ndb.StringProperty() base64_photo = ndb.BlobProperty('base64Photo', indexed=False)

Page 23: Mobile, web and cloud -  the triple crown of modern applications

Data Model for CRUD App

Pythonfrom endpoints_proto_datastore.ndb import EndpointsModel

class Photo(EndpointsModel): title = ndb.StringProperty() description = ndb.StringProperty() base64_photo = ndb.BlobProperty('base64Photo', indexed=False) updated = ndb.DateTimeProperty(auto_now=True, indexed=False)

Page 24: Mobile, web and cloud -  the triple crown of modern applications

Data Model for CRUD App

Pythonfrom endpoints_proto_datastore.ndb import EndpointsModel

class Photo(EndpointsModel): _message_fields_schema = ('id', 'title', 'description', 'base64Photo', 'updated')

title = ndb.StringProperty() description = ndb.StringProperty() base64_photo = ndb.BlobProperty('base64Photo', indexed=False) updated = ndb.DateTimeProperty(auto_now=True, indexed=False)

Page 25: Mobile, web and cloud -  the triple crown of modern applications

Simple GET API Request

Page 26: Mobile, web and cloud -  the triple crown of modern applications

Using Data Model for Insert

[email protected](name='picturesque', version='v1', description='Photos API for Picturesque App')class PicturesqueApi(remote.Service):

@Photo.method(path='photo', name='photo.insert') def PhotoInsert(self, photo): # do some validation photo.put() return photo

Page 27: Mobile, web and cloud -  the triple crown of modern applications

Insert With Drag and Drop Demo

Python

Page 28: Mobile, web and cloud -  the triple crown of modern applications

Update

Python @Photo.method(path='photo/{id}', http_method='PUT', name='photo.update') def PhotoUpdate(self, photo): if not photo.from_datastore: raise endpoints.NotFoundException('Photo not found.') photo.put() return photo

Page 30: Mobile, web and cloud -  the triple crown of modern applications

Add some tags to support that UI

Pythonclass Photo(EndpointsModel): title = ndb.StringProperty() description = ndb.StringProperty() base64_photo = ndb.BlobProperty('base64Photo', indexed=False) created = ndb.DateTimeProperty(auto_now_add=True, indexed=False) tags = ndb.StringProperty(repeated=True)

Page 31: Mobile, web and cloud -  the triple crown of modern applications

List and Search, All at Once

Python @Photo.query_method(query_fields=('limit', 'pageToken', 'title'), path='photos', name='photo.list') def PhotoList(self, query): return query

Page 32: Mobile, web and cloud -  the triple crown of modern applications

List Demo - Get Photos Baby!

Pythonvar req = gapi.client.picturesque.photo.list();req.execute(function(data) { data.items = data.items || []; console.log("-- We have " + data.items.length); addPhotos(data.items);});

Page 33: Mobile, web and cloud -  the triple crown of modern applications

Lemme, Lemme Upgrade U!

picturesque-app-upgrade.appspot.com

Page 34: Mobile, web and cloud -  the triple crown of modern applications

Adding auth via OAuth 2.0

Python @Photo.method(user_required=True, path='photo/{id}', http_method='PUT', name='photo.update') def PhotoUpdate(self, photo): ...

Really that easy

Page 35: Mobile, web and cloud -  the triple crown of modern applications

Adding auth via OAuth 2.0

Pythonfrom endpoints_proto_datastore.ndb import EndpointsUserProperty

class Photo(EndpointsModel): _message_fields_schema = ('id', 'title', 'description', 'base64Photo', 'updated'

title = ndb.StringProperty() description = ndb.StringProperty() base64_photo = ndb.BlobProperty('base64Photo', indexed=False) updated = ndb.DateTimeProperty(auto_now_add=True, indexed=False) owner = EndpointsUserProperty(required=True, raise_unauthorized=True)

Alternative: Using models for auth

Page 37: Mobile, web and cloud -  the triple crown of modern applications

Interface Informed by Client

● Network calls are expensive

● "Client" photo library ○ Lawnchair allows us to store photos' metadata offline○ filer.js to store the photos○ Application Cache○ HTML5 Storage

● DRY: Applies to code and to API calls○ Only retrieve photos that have been updated since the last

API call

Page 38: Mobile, web and cloud -  the triple crown of modern applications

Extending query_method

Pythonfrom endpoints_proto_datastore.ndb import EndpointsAliasPropertyfrom endpoints_proto_datastore import utils

class Photo(EndpointsModel): ... _last_updated = None

@EndpointsAliasProperty(name='lastUpdated', setter=LastUpdatedSet) def last_updated(self): if self._last_updated is not None: try: return utils.DatetimeValueToString(self._last_updated) except: raise endpoints.BadRequestException( 'Invalid timestamp for lastUpdated')

Page 39: Mobile, web and cloud -  the triple crown of modern applications

Extending query_method

Pythonclass Photo(EndpointsModel): ... def LastUpdatedSet(self, value): try: self._last_updated = utils.DatetimeValueFromString(value) if not isinstance(self._last_updated, datetime.datetime): self._last_updated = None raise TypeError('Not a datetime stamp.') except TypeError: raise endpoints.BadRequestException('Invalid timestamp for lastUpdated.')

self._endpoints_query_info._filters.add( Photo.updated >= self._last_updated)

Page 40: Mobile, web and cloud -  the triple crown of modern applications

Extending query_method

Python @Photo.query_method(query_fields=('limit', 'pageToken', 'title', 'lastUpdated'), path='photos', name='photo.list') def PhotoList(self, query): return query.order(Photo.updated)

Page 41: Mobile, web and cloud -  the triple crown of modern applications

Client Side Conventions

JavascriptPicturesqueApp.showCarousel = function() { if (!PicturesqueApp.localImagesAdded) { PicturesqueApp.populateCarouselFromLocalImages();

};

PicturesqueApp.applyLastUpdated(PicturesqueApp.listSinceUpdated);};

Page 42: Mobile, web and cloud -  the triple crown of modern applications

Key Take Aways

● Build powerful applications with Google Cloud Endpoints

● Cloud Endpoints makes for easy deployment at scale

● Use AngularJS to be more productive

● Leverage Modern Browser Features:○ Offline○ Web RTC○ Websockets○ New CSS3 artifacts○ Web workers

#io13

Page 43: Mobile, web and cloud -  the triple crown of modern applications

Questions?

Ido GreenDeveloper Relationshttp://plus.google.com/+greenido

App:: https://picturesque-app-upgrade.appspot.com/

Code: https://github.com/greenido/

Slides: https://picturesque-app-upgrade.appspot.com/slides

Danny HermesDeveloper Programs Engineerplus.google.com/+DannyHermes