SlideShare ist ein Scribd-Unternehmen logo
1 von 84
Cnam Azure
ZeCloud
17/01/2014
Windows Azure Mobile Services
Multi-Platform Apps
You don’t need a different Mobile Service
for each platform!
Connect them all!
Cross-Platform Support
Cross-Platform Support
Multi-Device Push
Windows Store

Single Platform Push Notifications
push.wns.sendToastText04(item.channel, {text1: text}, … );
Windows Phone
push.mpns.sendFlipTile(item.channel, {title: text}, …);

iOS
push.apns.send(item.token, { alert: text, payload:
inAppMessage: Details }}, …);

Android
push.gcm.send(item.registrationId, item.text, …);

{
Multi-Platform Push Notifications

function sendNotifications() {

var deviceInfoTable = tables.getTable('DeviceInfo');

deviceInfoTable.where({ userId : user.userId }).read({
success: function(deviceInfos){
deviceInfos.forEach(function(deviceInfo){
if (deviceInfo.uuid != request.parameters.uuid) {
if (deviceInfo.pushToken != null && deviceInfo.pushToken != 'SimulatorToken') {

if (deviceInfo.platform == 'iOS') {
push.apns.send(deviceInfo.pushToken, {
alert: "New something created"
} , { //success / error block});
} else if (deviceInfo.platform == 'Android') {
push.gcm.send(deviceInfo.pushToken, "New something created", { success / error block});
}
}
}
});
}
});
}
Don’t forget to check the response on error
(or getFeedback for APNS)
Also, check out
Delivering Push Notifications to Millions of
Devices – Friday @12pm
Virtual Tables
Create a table
Use it’s endpoint
Don’t call request.Execute
Custom API
•
•
•
•
•
•
•

•
Custom API Demo
Talking to Azure Storage
It’s doable
It’s not perfect

Scripts
and the Azure module
Reading Tables
var azure = require('azure');
function read(query, user, request) {
var accountName = 'accountname';
var accountKey = 'Accountkey------------nKHDsW2/0Jzg==';
var host = accountName + '.table.core.windows.net';
var tableService = azure.createTableService(accountName, accountKey, host);

tableService.queryTables(function (error, tables) {
if (error) {
request.respond(500, error);
} else {
request.respond(200, tables);
}
});
}
var azure = require('azure');

Reading Table Rows

function read(query, user, request) {
var accountName = 'accountname';
var accountKey = 'Accountkey------------nKHDsW2/0Jzg==';
var host = accountName + '.table.core.windows.net';
var tableService = azure.createTableService(accountName, accountKey, host);

var tq = azure.TableQuery
.select()

.from(request.parameters.table);

tableService.queryEntities(tq, function (error, rows) {
if (error) {
request.respond(500, error);
} else {
request.respond(200, rows)
}
});
}
var azure = require('azure');
function insert(item, user, request) {

Creating Containers

var accountName = 'accountname';
var accountKey = 'Accountkey------------nKHDsW2/0Jzg==';
var host = accountName + '.blob.core.windows.net';
var blobService = azure.createBlobService(accountName, accountKey, host);

if (request.parameters.isPublic == 1) {
blobService.createContainerIfNotExists(item.containerName
,{publicAccessLevel : 'blob'}
, function (error) {
if (!error) { request.respond(200, item); } else { /* error */ request.respond(500);}
});
} else {
blobService.createContainerIfNotExists(item.containerName, function (error) {
if (!error) { request.respond(200, item); } else { /*error */ request.respond(500);
}
});
}
}
Reading and “Creating” Blobs

var azure = require('azure'), qs = require('querystring');
function insert(item, user, request) {
var accountName = 'accountname';

var accountKey = 'Accountkey------------nKHDsW2/0Jzg==';
var host = accountName + '.blob.core.windows.net';
var blobService = azure.createBlobService(accountName, accountKey, host);

var sharedAccessPolicy = {
AccessPolicy: {
Permissions: 'rw', //Read and Write permissions

Expiry: minutesFromNow(5)
}
};

var sasUrl = blobService.generateSharedAccessSignature(request.parameters.containerName,
request.parameters.blobName, sharedAccessPolicy);

var sasQueryString = { 'sasUrl' : sasUrl.baseUrl + sasUrl.path + '?' + qs.stringify(sasUrl.queryString) };
request.respond(200, sasQueryString);
}

function minutesFromNow(minutes) {
var date = new Date()
date.setMinutes(date.getMinutes() + minutes);
return date;
}
Storage Demo
Talking REST
http://Mobileservice.azure-mobile.net/tables/*

Action

HTTP Verb

URL Suffix

Create

POST

/TodoItem

Retrieve

GET

/TodoItem?$filter=id%3D42

Update

PATCH

/TodoItem/id

Delete

DELETE

/TodoItem/id
JSON Value

T-SQL Type

Numeric values (integer,
decimal, floating point)

Float

Boolean

Bit

DateTime

DateTimeOffset(3)

String

Nvarchar(max)
Postman
&
Runscope Demo
Sending Emails
//var crypto = require('crypto');
//item.tempId = new Buffer(crypto.randomBytes(16)).toString('hex');

Sending an Email

function sendEmail(item) {
var sendgrid = new SendGrid('myaccount@azure.com', 'mypassword');
var email = {
to : item.email,
from : 'from-me@chrisrisner.com',
subject : 'Welcome to MyApp',
text: 'Thanks for installing My App!

Click this link to verify:nn'

+ 'http://myapp.azurewebsites.net/activate.html?id=' + item.id + '&tid=' + item.tempId,
createDate : new Date()
};

sendgrid.send({
to: item.email,
from: email.from,
subject: email.subject,

text: email.text
}, function(success, message) {
// If the email failed to send, log it as an error so we can investigate
if (!success) {
console.error(message);
} else {
saveSentEmail(email);
}

});
}
Setting up SendGrid Demo
The CLI
SOME

It’s awe
CLI Demo
Service Filters and DelegatingHandlers
Client side
Intercepts requests
Intercepts responses
Sending Version Info with Each Request
- (void)handleRequest:(NSURLRequest *)request next:(MSFilterNextBlock)next response:(MSFilterResponseBlock)response
{
MSFilterResponseBlock wrappedResponse = ^(NSHTTPURLResponse *innerResponse, NSData *data, NSError *error) {
response(innerResponse, data, error);
};
// add additional versioning information to the querystring for versioning purposes
NSString *append = [NSString stringWithFormat:@"build=%@&version=%@", self.build, self.version];
NSURL *url = nil;
NSRange range = [request.URL.absoluteString rangeOfString:@"?"];
if (range.length > 0) {
url = [NSURL URLWithString:[NSString stringWithFormat:@"%@&%@&p=iOS", request.URL.absoluteString, append]];
}
else {
url = [NSURL URLWithString:[NSString stringWithFormat:@"%@?%@&p=iOS", request.URL.absoluteString, append]];
}
NSMutableURLRequest *newRequest = [request mutableCopy];
newRequest.URL = url;
next(newRequest, wrappedResponse);
}
DelegatingHandlers are Service Filters

public static MobileServiceClient MobileService = new MobileServiceClient(
"https://<your subdomain>.azure-mobile.net/",
"<your app key>",
new VersionHandler()
);

using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace WindowsStore
{
public class VersionHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
System.Threading.CancellationToken cancellationToken)
{
request.RequestUri = new Uri(request.RequestUri.AbsoluteUri.ToString() + "?version=v2");
return base.SendAsync(request, cancellationToken);
}
}
}
Script Versioning
Checking the Version in Scripts

function insert(item, user, request) {

if (request.parameters.build < 2.0) {
item.description = 'Not entered';
}
request.execute({
success : function() {
if (request.parameters.build < 2.0) {

delete item.description;
}
request.respond();
}

});
}
For more on versioning, check out
Going Live and Beyond with Windows
Azure Mobile Services
Friday @ 10:30 am
Talking Twitter
v1 is dead
v1.1 is hard
function generateOAuthSignature(method, url, data){
var index = url.indexOf('?');
if (index > 0)
url = url.substring(0, url.indexOf('?'));
var signingToken = encodeURIComponent('Your Consumer Secret') + "&" + encodeURIComponent('Your Access Token Secret');
var keys = [];
for (var d in data){
if (d != 'oauth_signature') {
console.log('data: ' , d);
keys.push(d);
}
}
keys.sort();
var output = "GET&" + encodeURIComponent(url) + "&";
var params = "";
keys.forEach(function(k){
params += "&" + encodeURIComponent(k) + "=" + encodeURIComponent(data[k]);
});
params = encodeURIComponent(params.substring(1));
return hashString(signingToken, output+params, "base64");
}

function hashString(key, str, encoding){
var hmac = crypto.createHmac("sha1", key);
hmac.update(str);
return hmac.digest(encoding);
}

function generateNonce() {
var code = "";
for (var i = 0; i < 20; i++) {
code += Math.floor(Math.random() * 9).toString();
}
return code;
}

Part 1: The Helpers
var crypto = require('crypto');

var querystring = require('querystring');

function read(query, user, request) {

var result = {

id: query.id,

identities: user.getIdentities(),

userName: ''

};

var identities = user.getIdentities();

var userId = user.userId;

var twitterId = userId.substring(userId.indexOf(':') + 1);

//API 1.0

//url = 'https://api.twitter.com/1/users/show/' + twitterId + '.json';

//API 1.1

var url = 'https://api.twitter.com/1.1/users/show.json?user_id=' + twitterId;

var key = 'This is your consumer key';

var nonce = generateNonce();

var sigmethod = 'HMAC-SHA1';

var version = '1.0';

var twitterAccessToken = identities.twitter.accessToken;

var oauth_token = 'The Access Token';

var seconds = new Date() / 1000;

seconds = Math.round(seconds);

var requestType = 'GET';

var oauthData = { oauth_consumer_key: key, oauth_nonce: nonce, oauth_signature:null,

oauth_signature_method: sigmethod, oauth_timestamp: seconds,

oauth_token: oauth_token, oauth_version: version };

var sigData = {};

for (var k in oauthData){

sigData[k] = oauthData[k];

}

sigData['user_id'] = twitterId;

Part 2: The Work (part 1)
var sig = generateOAuthSignature('GET', url, sigData);

oauthData.oauth_signature = sig;

var oauthHeader = "";

for (k in oauthData){

oauthHeader += ", " + encodeURIComponent(k) + "="" + encodeURIComponent(oauthData[k]) + """;

}

oauthHeader = oauthHeader.substring(1);

var authHeader = 'OAuth' + oauthHeader;

//Generate callback for response from Twitter API

var requestCallback = function (err, resp, body) {

if (err || resp.statusCode !== 200) {

console.error('Error sending data to the provider: ', err);

request.respond(statusCodes.INTERNAL_SERVER_ERROR, body);

} else {

try {

var userData = JSON.parse(body);

if (userData.name != null)

result.UserName = userData.name;

else

result.UserName = "can't get username";

request.respond(200, [result]);

} catch (ex) {

console.error('Error parsing response from the provider API: ', ex);

request.respond(statusCodes.INTERNAL_SERVER_ERROR, ex);

}

}

}

//Create the request and execute it

var req = require('request');

var reqOptions = {

uri: url,

headers: { Accept: "application/json" }

};

if (authHeader != null)

reqOptions.headers['Authorization'] = authHeader;

req(reqOptions, requestCallback);

}

Part 2.2: The Work
That was terrible
Do this
The Easy Way
exports.post = function(request, response) {
var twitter = require(‘ctwitter.js’);
twitter.init(’consumer key',’consumer secret');
twitter.tweet(request.body.tweettext, request.user, request);
}
Get the script here: http://bit.ly/14b73Gg
Script Source Control
Enable on dashboard
Creates Git repo
Changes push from client
Shared Scripts
require(‘jsfile.js');
*Need a config change on update (for now)
Auth Part 1: Custom
Pass creds in
Validate
Hash your salt
Create a JWT
Part 1: The Helpers
Part 2: The Work
Part 3: Signing In
…or just use Auth0
http://aka.ms/authZeroZumo
Check out
Who’s that User? – Friday @ 2pm
Auth Part 2: Identity Caching
Storing Credentials in .NET
Getting and Setting Credentials
Auth Part 3: Expired Tokens
Expiration Flow
DelegationHandlers (again)
ServiceFilter (iOS)
Auth Demo
One-to-Many
Client
Server
Client
Server 1
Server 2
Remember API call #s when
considering client side one-to-many
Paging Data
Client
Server
Client
Server Scripts
On-Prem
On-Prem Solutions in Windows Azure
Data
Synchronization
SQL Data Sync

Application-Layer
Connectivity & Messaging
Service Bus

Secure Point-to-Site Network
Connectivity
Windows Azure Virtual Network

Secure Site-to-Site
Network Connectivity
Windows Azure Virtual Network
Windows Azure

Point-to-Site VPNs

<subnet 1>

<subnet 2>

<subnet 3>
DNS
Server

On-premises

VPN
Gateway

Route-based
VPN

Your datacenter
Individual
computers behind
corporate firewall

Virtual Network
Site-to-Site Connectivity
•
•

On-ramp for migrating services to the cloud

•

Windows Azure

Extend your premises to the cloud securely

Use your on-prem resources in Azure (monitoring, AD, …)

On-premises

<subnet 2>

<subnet 3>
DNS
Server

VPN
Gateway

Hardware VPN or
Windows RRAS

Your datacenter

<subnet 1>

Virtual Network
Cnam azure 2014   mobile services

Weitere ähnliche Inhalte

Was ist angesagt?

Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."sjabs
 
SISTEMA DE FACTURACION (Ejemplo desarrollado)
SISTEMA DE FACTURACION (Ejemplo desarrollado)SISTEMA DE FACTURACION (Ejemplo desarrollado)
SISTEMA DE FACTURACION (Ejemplo desarrollado)Darwin Durand
 
mobl presentation @ IHomer
mobl presentation @ IHomermobl presentation @ IHomer
mobl presentation @ IHomerzefhemel
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeMongoDB
 
The Ring programming language version 1.9 book - Part 53 of 210
The Ring programming language version 1.9 book - Part 53 of 210The Ring programming language version 1.9 book - Part 53 of 210
The Ring programming language version 1.9 book - Part 53 of 210Mahmoud Samir Fayed
 
Programming IoT Gateways in JavaScript with macchina.io
Programming IoT Gateways in JavaScript with macchina.ioProgramming IoT Gateways in JavaScript with macchina.io
Programming IoT Gateways in JavaScript with macchina.ioGünter Obiltschnig
 
code for quiz in my sql
code for quiz  in my sql code for quiz  in my sql
code for quiz in my sql JOYITAKUNDU1
 
The Ring programming language version 1.6 book - Part 46 of 189
The Ring programming language version 1.6 book - Part 46 of 189The Ring programming language version 1.6 book - Part 46 of 189
The Ring programming language version 1.6 book - Part 46 of 189Mahmoud Samir Fayed
 
dotSwift - From Problem to Solution
dotSwift - From Problem to SolutiondotSwift - From Problem to Solution
dotSwift - From Problem to Solutionsoroushkhanlou
 
Vb Project ขั้นเทพ
Vb Project ขั้นเทพVb Project ขั้นเทพ
Vb Project ขั้นเทพSinchai Lanon
 
ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~
ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~
ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~5 6
 
The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196Mahmoud Samir Fayed
 
The Ring programming language version 1.3 book - Part 34 of 88
The Ring programming language version 1.3 book - Part 34 of 88The Ring programming language version 1.3 book - Part 34 of 88
The Ring programming language version 1.3 book - Part 34 of 88Mahmoud Samir Fayed
 
Building android apps with kotlin
Building android apps with kotlinBuilding android apps with kotlin
Building android apps with kotlinShem Magnezi
 
DEF CON 27 - ALVARO MUNOZ / OLEKSANDR MIROSH - sso wars the token menace
DEF CON 27 - ALVARO MUNOZ / OLEKSANDR MIROSH - sso wars the token menaceDEF CON 27 - ALVARO MUNOZ / OLEKSANDR MIROSH - sso wars the token menace
DEF CON 27 - ALVARO MUNOZ / OLEKSANDR MIROSH - sso wars the token menaceFelipe Prado
 
MySQL flexible schema and JSON for Internet of Things
MySQL flexible schema and JSON for Internet of ThingsMySQL flexible schema and JSON for Internet of Things
MySQL flexible schema and JSON for Internet of ThingsAlexander Rubin
 
The Ring programming language version 1.4.1 book - Part 13 of 31
The Ring programming language version 1.4.1 book - Part 13 of 31The Ring programming language version 1.4.1 book - Part 13 of 31
The Ring programming language version 1.4.1 book - Part 13 of 31Mahmoud Samir Fayed
 

Was ist angesagt? (20)

Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
 
SISTEMA DE FACTURACION (Ejemplo desarrollado)
SISTEMA DE FACTURACION (Ejemplo desarrollado)SISTEMA DE FACTURACION (Ejemplo desarrollado)
SISTEMA DE FACTURACION (Ejemplo desarrollado)
 
Elm: give it a try
Elm: give it a tryElm: give it a try
Elm: give it a try
 
mobl presentation @ IHomer
mobl presentation @ IHomermobl presentation @ IHomer
mobl presentation @ IHomer
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at Stripe
 
The Ring programming language version 1.9 book - Part 53 of 210
The Ring programming language version 1.9 book - Part 53 of 210The Ring programming language version 1.9 book - Part 53 of 210
The Ring programming language version 1.9 book - Part 53 of 210
 
Programming IoT Gateways in JavaScript with macchina.io
Programming IoT Gateways in JavaScript with macchina.ioProgramming IoT Gateways in JavaScript with macchina.io
Programming IoT Gateways in JavaScript with macchina.io
 
Ds 2 cycle
Ds 2 cycleDs 2 cycle
Ds 2 cycle
 
code for quiz in my sql
code for quiz  in my sql code for quiz  in my sql
code for quiz in my sql
 
The Ring programming language version 1.6 book - Part 46 of 189
The Ring programming language version 1.6 book - Part 46 of 189The Ring programming language version 1.6 book - Part 46 of 189
The Ring programming language version 1.6 book - Part 46 of 189
 
dotSwift - From Problem to Solution
dotSwift - From Problem to SolutiondotSwift - From Problem to Solution
dotSwift - From Problem to Solution
 
Vb Project ขั้นเทพ
Vb Project ขั้นเทพVb Project ขั้นเทพ
Vb Project ขั้นเทพ
 
ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~
ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~
ChromeからMacBookのTouchIDでWebAuthenticationする ~Idance vol1~
 
The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196
 
The Ring programming language version 1.3 book - Part 34 of 88
The Ring programming language version 1.3 book - Part 34 of 88The Ring programming language version 1.3 book - Part 34 of 88
The Ring programming language version 1.3 book - Part 34 of 88
 
Building android apps with kotlin
Building android apps with kotlinBuilding android apps with kotlin
Building android apps with kotlin
 
DEF CON 27 - ALVARO MUNOZ / OLEKSANDR MIROSH - sso wars the token menace
DEF CON 27 - ALVARO MUNOZ / OLEKSANDR MIROSH - sso wars the token menaceDEF CON 27 - ALVARO MUNOZ / OLEKSANDR MIROSH - sso wars the token menace
DEF CON 27 - ALVARO MUNOZ / OLEKSANDR MIROSH - sso wars the token menace
 
Scala on Your Phone
Scala on Your PhoneScala on Your Phone
Scala on Your Phone
 
MySQL flexible schema and JSON for Internet of Things
MySQL flexible schema and JSON for Internet of ThingsMySQL flexible schema and JSON for Internet of Things
MySQL flexible schema and JSON for Internet of Things
 
The Ring programming language version 1.4.1 book - Part 13 of 31
The Ring programming language version 1.4.1 book - Part 13 of 31The Ring programming language version 1.4.1 book - Part 13 of 31
The Ring programming language version 1.4.1 book - Part 13 of 31
 

Andere mochten auch

Cnam azure 2014 web sites et integration continue
Cnam azure 2014  web sites et integration continueCnam azure 2014  web sites et integration continue
Cnam azure 2014 web sites et integration continueAymeric Weinbach
 
Group 2 - Evidence Exhibit Module Presentation
Group 2 - Evidence Exhibit Module PresentationGroup 2 - Evidence Exhibit Module Presentation
Group 2 - Evidence Exhibit Module PresentationStephanie Bolling
 
To Me Korea is....
To Me Korea is....To Me Korea is....
To Me Korea is....Charles Cave
 
Soyez le maître du PRA - MS Cloud Summit Paris 2017
Soyez le maître du PRA - MS Cloud Summit Paris 2017Soyez le maître du PRA - MS Cloud Summit Paris 2017
Soyez le maître du PRA - MS Cloud Summit Paris 2017Marius Zaharia
 
Presentazione matrictionary - www.graceevent.net
Presentazione matrictionary  - www.graceevent.netPresentazione matrictionary  - www.graceevent.net
Presentazione matrictionary - www.graceevent.netMariagrazia Tarantino
 
Session Objet Connecté gwab 2014 paris
Session Objet Connecté gwab 2014 parisSession Objet Connecté gwab 2014 paris
Session Objet Connecté gwab 2014 parisAymeric Weinbach
 
Cnam azure 2014 Intro et présentation générale de la plateforme
Cnam azure 2014   Intro et présentation générale de la plateformeCnam azure 2014   Intro et présentation générale de la plateforme
Cnam azure 2014 Intro et présentation générale de la plateformeAymeric Weinbach
 
The podcast: from hype to lost hope to red hot
The podcast: from hype to lost hope to red hot The podcast: from hype to lost hope to red hot
The podcast: from hype to lost hope to red hot NextMarket Insights
 
Meetup DevOps / WebOps Nîmes 20161020
Meetup DevOps / WebOps Nîmes 20161020Meetup DevOps / WebOps Nîmes 20161020
Meetup DevOps / WebOps Nîmes 20161020NimeOps
 
Organización territorial de España (GEO 2º Bach.)
Organización territorial de España (GEO 2º Bach.)Organización territorial de España (GEO 2º Bach.)
Organización territorial de España (GEO 2º Bach.)Txema Gs
 
Prison Gardens: Healthy Work for Today, Skills for Tomorrow
Prison Gardens: Healthy Work for Today, Skills for TomorrowPrison Gardens: Healthy Work for Today, Skills for Tomorrow
Prison Gardens: Healthy Work for Today, Skills for TomorrowCarolyn Scherf
 

Andere mochten auch (17)

Cnam azure 2014 web sites et integration continue
Cnam azure 2014  web sites et integration continueCnam azure 2014  web sites et integration continue
Cnam azure 2014 web sites et integration continue
 
Equity market
Equity marketEquity market
Equity market
 
Gwab 2014 Paris keynote
Gwab 2014 Paris keynoteGwab 2014 Paris keynote
Gwab 2014 Paris keynote
 
11111
1111111111
11111
 
Group 2 - Evidence Exhibit Module Presentation
Group 2 - Evidence Exhibit Module PresentationGroup 2 - Evidence Exhibit Module Presentation
Group 2 - Evidence Exhibit Module Presentation
 
To Me Korea is....
To Me Korea is....To Me Korea is....
To Me Korea is....
 
Soyez le maître du PRA - MS Cloud Summit Paris 2017
Soyez le maître du PRA - MS Cloud Summit Paris 2017Soyez le maître du PRA - MS Cloud Summit Paris 2017
Soyez le maître du PRA - MS Cloud Summit Paris 2017
 
Potencias y raíces
Potencias y raícesPotencias y raíces
Potencias y raíces
 
Cnam azure 2014 iaas
Cnam azure 2014   iaas Cnam azure 2014   iaas
Cnam azure 2014 iaas
 
Cnam azure 2014 storage
Cnam azure 2014   storageCnam azure 2014   storage
Cnam azure 2014 storage
 
Presentazione matrictionary - www.graceevent.net
Presentazione matrictionary  - www.graceevent.netPresentazione matrictionary  - www.graceevent.net
Presentazione matrictionary - www.graceevent.net
 
Session Objet Connecté gwab 2014 paris
Session Objet Connecté gwab 2014 parisSession Objet Connecté gwab 2014 paris
Session Objet Connecté gwab 2014 paris
 
Cnam azure 2014 Intro et présentation générale de la plateforme
Cnam azure 2014   Intro et présentation générale de la plateformeCnam azure 2014   Intro et présentation générale de la plateforme
Cnam azure 2014 Intro et présentation générale de la plateforme
 
The podcast: from hype to lost hope to red hot
The podcast: from hype to lost hope to red hot The podcast: from hype to lost hope to red hot
The podcast: from hype to lost hope to red hot
 
Meetup DevOps / WebOps Nîmes 20161020
Meetup DevOps / WebOps Nîmes 20161020Meetup DevOps / WebOps Nîmes 20161020
Meetup DevOps / WebOps Nîmes 20161020
 
Organización territorial de España (GEO 2º Bach.)
Organización territorial de España (GEO 2º Bach.)Organización territorial de España (GEO 2º Bach.)
Organización territorial de España (GEO 2º Bach.)
 
Prison Gardens: Healthy Work for Today, Skills for Tomorrow
Prison Gardens: Healthy Work for Today, Skills for TomorrowPrison Gardens: Healthy Work for Today, Skills for Tomorrow
Prison Gardens: Healthy Work for Today, Skills for Tomorrow
 

Ähnlich wie Cnam azure 2014 mobile services

Paris js extensions
Paris js extensionsParis js extensions
Paris js extensionserwanl
 
Micro app-framework - NodeLive Boston
Micro app-framework - NodeLive BostonMicro app-framework - NodeLive Boston
Micro app-framework - NodeLive BostonMichael Dawson
 
Automation in angular js
Automation in angular jsAutomation in angular js
Automation in angular jsMarcin Wosinek
 
MAF push notifications
MAF push notificationsMAF push notifications
MAF push notificationsLuc Bors
 
Enterprise workflow with Apps Script
Enterprise workflow with Apps ScriptEnterprise workflow with Apps Script
Enterprise workflow with Apps Scriptccherubino
 
Websockets talk at Rubyconf Uruguay 2010
Websockets talk at Rubyconf Uruguay 2010Websockets talk at Rubyconf Uruguay 2010
Websockets talk at Rubyconf Uruguay 2010Ismael Celis
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on AndroidSven Haiges
 
SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!Sébastien Levert
 
node.js and the AR.Drone: building a real-time dashboard using socket.io
node.js and the AR.Drone: building a real-time dashboard using socket.ionode.js and the AR.Drone: building a real-time dashboard using socket.io
node.js and the AR.Drone: building a real-time dashboard using socket.ioSteven Beeckman
 
Embracing the-power-of-refactor
Embracing the-power-of-refactorEmbracing the-power-of-refactor
Embracing the-power-of-refactorXiaojun REN
 
Arduino and the real time web
Arduino and the real time webArduino and the real time web
Arduino and the real time webAndrew Fisher
 
Mozilla とブラウザゲーム
Mozilla とブラウザゲームMozilla とブラウザゲーム
Mozilla とブラウザゲームNoritada Shimizu
 
Ajax for dummies, and not only.
Ajax for dummies, and not only.Ajax for dummies, and not only.
Ajax for dummies, and not only.Nerd Tzanetopoulos
 
NoSQL and JavaScript: a Love Story
NoSQL and JavaScript: a Love StoryNoSQL and JavaScript: a Love Story
NoSQL and JavaScript: a Love StoryAlexandre Morgaut
 
Programming Google apps with the G Suite APIs
Programming Google apps with the G Suite APIsProgramming Google apps with the G Suite APIs
Programming Google apps with the G Suite APIsDevFest DC
 
Power your apps with Gmail, Google Drive, Calendar, Sheets, Slides, Apps Scri...
Power your apps with Gmail, Google Drive, Calendar, Sheets, Slides, Apps Scri...Power your apps with Gmail, Google Drive, Calendar, Sheets, Slides, Apps Scri...
Power your apps with Gmail, Google Drive, Calendar, Sheets, Slides, Apps Scri...wesley chun
 
Bare-knuckle web development
Bare-knuckle web developmentBare-knuckle web development
Bare-knuckle web developmentJohannes Brodwall
 

Ähnlich wie Cnam azure 2014 mobile services (20)

Paris js extensions
Paris js extensionsParis js extensions
Paris js extensions
 
Micro app-framework - NodeLive Boston
Micro app-framework - NodeLive BostonMicro app-framework - NodeLive Boston
Micro app-framework - NodeLive Boston
 
Micro app-framework
Micro app-frameworkMicro app-framework
Micro app-framework
 
Automation in angular js
Automation in angular jsAutomation in angular js
Automation in angular js
 
MAF push notifications
MAF push notificationsMAF push notifications
MAF push notifications
 
Enterprise workflow with Apps Script
Enterprise workflow with Apps ScriptEnterprise workflow with Apps Script
Enterprise workflow with Apps Script
 
Websockets talk at Rubyconf Uruguay 2010
Websockets talk at Rubyconf Uruguay 2010Websockets talk at Rubyconf Uruguay 2010
Websockets talk at Rubyconf Uruguay 2010
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
 
mobl
moblmobl
mobl
 
SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!
 
node.js and the AR.Drone: building a real-time dashboard using socket.io
node.js and the AR.Drone: building a real-time dashboard using socket.ionode.js and the AR.Drone: building a real-time dashboard using socket.io
node.js and the AR.Drone: building a real-time dashboard using socket.io
 
Embracing the-power-of-refactor
Embracing the-power-of-refactorEmbracing the-power-of-refactor
Embracing the-power-of-refactor
 
Arduino and the real time web
Arduino and the real time webArduino and the real time web
Arduino and the real time web
 
Mozilla とブラウザゲーム
Mozilla とブラウザゲームMozilla とブラウザゲーム
Mozilla とブラウザゲーム
 
Anti patterns
Anti patternsAnti patterns
Anti patterns
 
Ajax for dummies, and not only.
Ajax for dummies, and not only.Ajax for dummies, and not only.
Ajax for dummies, and not only.
 
NoSQL and JavaScript: a Love Story
NoSQL and JavaScript: a Love StoryNoSQL and JavaScript: a Love Story
NoSQL and JavaScript: a Love Story
 
Programming Google apps with the G Suite APIs
Programming Google apps with the G Suite APIsProgramming Google apps with the G Suite APIs
Programming Google apps with the G Suite APIs
 
Power your apps with Gmail, Google Drive, Calendar, Sheets, Slides, Apps Scri...
Power your apps with Gmail, Google Drive, Calendar, Sheets, Slides, Apps Scri...Power your apps with Gmail, Google Drive, Calendar, Sheets, Slides, Apps Scri...
Power your apps with Gmail, Google Drive, Calendar, Sheets, Slides, Apps Scri...
 
Bare-knuckle web development
Bare-knuckle web developmentBare-knuckle web development
Bare-knuckle web development
 

Mehr von Aymeric Weinbach

Gab 2017 iot azure aymeric weinbach
Gab 2017 iot  azure aymeric weinbachGab 2017 iot  azure aymeric weinbach
Gab 2017 iot azure aymeric weinbachAymeric Weinbach
 
Cnam cours azure ze cloud intro et présentation generale 2016
Cnam cours azure ze cloud intro et présentation  generale 2016Cnam cours azure ze cloud intro et présentation  generale 2016
Cnam cours azure ze cloud intro et présentation generale 2016Aymeric Weinbach
 
Cnam azure ze cloud resource manager
Cnam azure ze cloud  resource managerCnam azure ze cloud  resource manager
Cnam azure ze cloud resource managerAymeric Weinbach
 
Microsoft azure boot camp Keynote
Microsoft azure boot camp Keynote Microsoft azure boot camp Keynote
Microsoft azure boot camp Keynote Aymeric Weinbach
 
Gab paris 2015 automatisation
Gab paris 2015   automatisationGab paris 2015   automatisation
Gab paris 2015 automatisationAymeric Weinbach
 
Gab 2015 aymeric weinbach azure iot
Gab   2015 aymeric weinbach azure iot Gab   2015 aymeric weinbach azure iot
Gab 2015 aymeric weinbach azure iot Aymeric Weinbach
 
Concevoir ses premiers objets connectés avec azure
Concevoir ses premiers objets connectés avec azureConcevoir ses premiers objets connectés avec azure
Concevoir ses premiers objets connectés avec azureAymeric Weinbach
 
Cnam cours azure web sites
Cnam cours azure web sitesCnam cours azure web sites
Cnam cours azure web sitesAymeric Weinbach
 
Cnam cours azure zecloud mobile services
Cnam cours azure zecloud mobile servicesCnam cours azure zecloud mobile services
Cnam cours azure zecloud mobile servicesAymeric Weinbach
 
Cnam cours azure intro et présentation generale
Cnam cours azure intro et présentation generaleCnam cours azure intro et présentation generale
Cnam cours azure intro et présentation generaleAymeric Weinbach
 
Cnam cours azure cloud services
Cnam cours azure  cloud servicesCnam cours azure  cloud services
Cnam cours azure cloud servicesAymeric Weinbach
 
Windows azure gwab - mobile services
Windows azure   gwab - mobile servicesWindows azure   gwab - mobile services
Windows azure gwab - mobile servicesAymeric Weinbach
 
Gérer facilement les identités dans le cloud
Gérer facilement les identités dans le cloudGérer facilement les identités dans le cloud
Gérer facilement les identités dans le cloudAymeric Weinbach
 
Backup Recovery Hybride avec Windows Azure Backup au Gwab 2014 Paris
Backup Recovery Hybride avec Windows Azure Backup au Gwab 2014 ParisBackup Recovery Hybride avec Windows Azure Backup au Gwab 2014 Paris
Backup Recovery Hybride avec Windows Azure Backup au Gwab 2014 ParisAymeric Weinbach
 
Introduction gwab 2014 paris
Introduction gwab 2014 parisIntroduction gwab 2014 paris
Introduction gwab 2014 parisAymeric Weinbach
 
la session Patterns azure cloud au Gwab 2014
la session Patterns azure cloud au Gwab 2014la session Patterns azure cloud au Gwab 2014
la session Patterns azure cloud au Gwab 2014Aymeric Weinbach
 

Mehr von Aymeric Weinbach (20)

Serverless everywhere
Serverless everywhereServerless everywhere
Serverless everywhere
 
Gaib19 azure + ia = art
Gaib19   azure + ia = artGaib19   azure + ia = art
Gaib19 azure + ia = art
 
Gab 2017 iot azure aymeric weinbach
Gab 2017 iot  azure aymeric weinbachGab 2017 iot  azure aymeric weinbach
Gab 2017 iot azure aymeric weinbach
 
Cnam cours azure ze cloud intro et présentation generale 2016
Cnam cours azure ze cloud intro et présentation  generale 2016Cnam cours azure ze cloud intro et présentation  generale 2016
Cnam cours azure ze cloud intro et présentation generale 2016
 
Cnam azure ze cloud resource manager
Cnam azure ze cloud  resource managerCnam azure ze cloud  resource manager
Cnam azure ze cloud resource manager
 
Microsoft azure boot camp Keynote
Microsoft azure boot camp Keynote Microsoft azure boot camp Keynote
Microsoft azure boot camp Keynote
 
Gab paris 2015 automatisation
Gab paris 2015   automatisationGab paris 2015   automatisation
Gab paris 2015 automatisation
 
Gab 2015 aymeric weinbach azure iot
Gab   2015 aymeric weinbach azure iot Gab   2015 aymeric weinbach azure iot
Gab 2015 aymeric weinbach azure iot
 
Concevoir ses premiers objets connectés avec azure
Concevoir ses premiers objets connectés avec azureConcevoir ses premiers objets connectés avec azure
Concevoir ses premiers objets connectés avec azure
 
Cnam cours azure web sites
Cnam cours azure web sitesCnam cours azure web sites
Cnam cours azure web sites
 
Cnam cours azure zecloud mobile services
Cnam cours azure zecloud mobile servicesCnam cours azure zecloud mobile services
Cnam cours azure zecloud mobile services
 
Cnam cours azure intro et présentation generale
Cnam cours azure intro et présentation generaleCnam cours azure intro et présentation generale
Cnam cours azure intro et présentation generale
 
Cnam cours azure iaas
Cnam cours azure iaasCnam cours azure iaas
Cnam cours azure iaas
 
Cnam cours azure cloud services
Cnam cours azure  cloud servicesCnam cours azure  cloud services
Cnam cours azure cloud services
 
Cnam azure 2015 storage
Cnam azure 2015  storageCnam azure 2015  storage
Cnam azure 2015 storage
 
Windows azure gwab - mobile services
Windows azure   gwab - mobile servicesWindows azure   gwab - mobile services
Windows azure gwab - mobile services
 
Gérer facilement les identités dans le cloud
Gérer facilement les identités dans le cloudGérer facilement les identités dans le cloud
Gérer facilement les identités dans le cloud
 
Backup Recovery Hybride avec Windows Azure Backup au Gwab 2014 Paris
Backup Recovery Hybride avec Windows Azure Backup au Gwab 2014 ParisBackup Recovery Hybride avec Windows Azure Backup au Gwab 2014 Paris
Backup Recovery Hybride avec Windows Azure Backup au Gwab 2014 Paris
 
Introduction gwab 2014 paris
Introduction gwab 2014 parisIntroduction gwab 2014 paris
Introduction gwab 2014 paris
 
la session Patterns azure cloud au Gwab 2014
la session Patterns azure cloud au Gwab 2014la session Patterns azure cloud au Gwab 2014
la session Patterns azure cloud au Gwab 2014
 

Kürzlich hochgeladen

QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsYoss Cohen
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
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
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
A Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxA Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxAna-Maria Mihalceanu
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Microservices, Docker deploy and Microservices source code in C#
Microservices, Docker deploy and Microservices source code in C#Microservices, Docker deploy and Microservices source code in C#
Microservices, Docker deploy and Microservices source code in C#Karmanjay Verma
 
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)Mark Simos
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
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
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integrationmarketing932765
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...itnewsafrica
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesManik S Magar
 

Kürzlich hochgeladen (20)

QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platforms
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
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
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
A Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxA Glance At The Java Performance Toolbox
A Glance At The Java Performance Toolbox
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Microservices, Docker deploy and Microservices source code in C#
Microservices, Docker deploy and Microservices source code in C#Microservices, Docker deploy and Microservices source code in C#
Microservices, Docker deploy and Microservices source code in C#
 
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
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
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
 

Cnam azure 2014 mobile services

  • 4. You don’t need a different Mobile Service for each platform!
  • 9. Windows Store Single Platform Push Notifications push.wns.sendToastText04(item.channel, {text1: text}, … ); Windows Phone push.mpns.sendFlipTile(item.channel, {title: text}, …); iOS push.apns.send(item.token, { alert: text, payload: inAppMessage: Details }}, …); Android push.gcm.send(item.registrationId, item.text, …); {
  • 10.
  • 11. Multi-Platform Push Notifications function sendNotifications() { var deviceInfoTable = tables.getTable('DeviceInfo'); deviceInfoTable.where({ userId : user.userId }).read({ success: function(deviceInfos){ deviceInfos.forEach(function(deviceInfo){ if (deviceInfo.uuid != request.parameters.uuid) { if (deviceInfo.pushToken != null && deviceInfo.pushToken != 'SimulatorToken') { if (deviceInfo.platform == 'iOS') { push.apns.send(deviceInfo.pushToken, { alert: "New something created" } , { //success / error block}); } else if (deviceInfo.platform == 'Android') { push.gcm.send(deviceInfo.pushToken, "New something created", { success / error block}); } } } }); } }); }
  • 12. Don’t forget to check the response on error (or getFeedback for APNS) Also, check out Delivering Push Notifications to Millions of Devices – Friday @12pm
  • 14. Create a table Use it’s endpoint Don’t call request.Execute
  • 18. Talking to Azure Storage
  • 19. It’s doable It’s not perfect Scripts and the Azure module
  • 20. Reading Tables var azure = require('azure'); function read(query, user, request) { var accountName = 'accountname'; var accountKey = 'Accountkey------------nKHDsW2/0Jzg=='; var host = accountName + '.table.core.windows.net'; var tableService = azure.createTableService(accountName, accountKey, host); tableService.queryTables(function (error, tables) { if (error) { request.respond(500, error); } else { request.respond(200, tables); } }); }
  • 21. var azure = require('azure'); Reading Table Rows function read(query, user, request) { var accountName = 'accountname'; var accountKey = 'Accountkey------------nKHDsW2/0Jzg=='; var host = accountName + '.table.core.windows.net'; var tableService = azure.createTableService(accountName, accountKey, host); var tq = azure.TableQuery .select() .from(request.parameters.table); tableService.queryEntities(tq, function (error, rows) { if (error) { request.respond(500, error); } else { request.respond(200, rows) } }); }
  • 22. var azure = require('azure'); function insert(item, user, request) { Creating Containers var accountName = 'accountname'; var accountKey = 'Accountkey------------nKHDsW2/0Jzg=='; var host = accountName + '.blob.core.windows.net'; var blobService = azure.createBlobService(accountName, accountKey, host); if (request.parameters.isPublic == 1) { blobService.createContainerIfNotExists(item.containerName ,{publicAccessLevel : 'blob'} , function (error) { if (!error) { request.respond(200, item); } else { /* error */ request.respond(500);} }); } else { blobService.createContainerIfNotExists(item.containerName, function (error) { if (!error) { request.respond(200, item); } else { /*error */ request.respond(500); } }); } }
  • 23. Reading and “Creating” Blobs var azure = require('azure'), qs = require('querystring'); function insert(item, user, request) { var accountName = 'accountname'; var accountKey = 'Accountkey------------nKHDsW2/0Jzg=='; var host = accountName + '.blob.core.windows.net'; var blobService = azure.createBlobService(accountName, accountKey, host); var sharedAccessPolicy = { AccessPolicy: { Permissions: 'rw', //Read and Write permissions Expiry: minutesFromNow(5) } }; var sasUrl = blobService.generateSharedAccessSignature(request.parameters.containerName, request.parameters.blobName, sharedAccessPolicy); var sasQueryString = { 'sasUrl' : sasUrl.baseUrl + sasUrl.path + '?' + qs.stringify(sasUrl.queryString) }; request.respond(200, sasQueryString); } function minutesFromNow(minutes) { var date = new Date() date.setMinutes(date.getMinutes() + minutes); return date; }
  • 27. JSON Value T-SQL Type Numeric values (integer, decimal, floating point) Float Boolean Bit DateTime DateTimeOffset(3) String Nvarchar(max)
  • 30.
  • 31. //var crypto = require('crypto'); //item.tempId = new Buffer(crypto.randomBytes(16)).toString('hex'); Sending an Email function sendEmail(item) { var sendgrid = new SendGrid('myaccount@azure.com', 'mypassword'); var email = { to : item.email, from : 'from-me@chrisrisner.com', subject : 'Welcome to MyApp', text: 'Thanks for installing My App! Click this link to verify:nn' + 'http://myapp.azurewebsites.net/activate.html?id=' + item.id + '&tid=' + item.tempId, createDate : new Date() }; sendgrid.send({ to: item.email, from: email.from, subject: email.subject, text: email.text }, function(success, message) { // If the email failed to send, log it as an error so we can investigate if (!success) { console.error(message); } else { saveSentEmail(email); } }); }
  • 36. Service Filters and DelegatingHandlers
  • 38. Sending Version Info with Each Request - (void)handleRequest:(NSURLRequest *)request next:(MSFilterNextBlock)next response:(MSFilterResponseBlock)response { MSFilterResponseBlock wrappedResponse = ^(NSHTTPURLResponse *innerResponse, NSData *data, NSError *error) { response(innerResponse, data, error); }; // add additional versioning information to the querystring for versioning purposes NSString *append = [NSString stringWithFormat:@"build=%@&version=%@", self.build, self.version]; NSURL *url = nil; NSRange range = [request.URL.absoluteString rangeOfString:@"?"]; if (range.length > 0) { url = [NSURL URLWithString:[NSString stringWithFormat:@"%@&%@&p=iOS", request.URL.absoluteString, append]]; } else { url = [NSURL URLWithString:[NSString stringWithFormat:@"%@?%@&p=iOS", request.URL.absoluteString, append]]; } NSMutableURLRequest *newRequest = [request mutableCopy]; newRequest.URL = url; next(newRequest, wrappedResponse); }
  • 39. DelegatingHandlers are Service Filters public static MobileServiceClient MobileService = new MobileServiceClient( "https://<your subdomain>.azure-mobile.net/", "<your app key>", new VersionHandler() ); using System; using System.Net.Http; using System.Threading.Tasks; namespace WindowsStore { public class VersionHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { request.RequestUri = new Uri(request.RequestUri.AbsoluteUri.ToString() + "?version=v2"); return base.SendAsync(request, cancellationToken); } } }
  • 41. Checking the Version in Scripts function insert(item, user, request) { if (request.parameters.build < 2.0) { item.description = 'Not entered'; } request.execute({ success : function() { if (request.parameters.build < 2.0) { delete item.description; } request.respond(); } }); }
  • 42. For more on versioning, check out Going Live and Beyond with Windows Azure Mobile Services Friday @ 10:30 am
  • 44. v1 is dead v1.1 is hard
  • 45. function generateOAuthSignature(method, url, data){ var index = url.indexOf('?'); if (index > 0) url = url.substring(0, url.indexOf('?')); var signingToken = encodeURIComponent('Your Consumer Secret') + "&" + encodeURIComponent('Your Access Token Secret'); var keys = []; for (var d in data){ if (d != 'oauth_signature') { console.log('data: ' , d); keys.push(d); } } keys.sort(); var output = "GET&" + encodeURIComponent(url) + "&"; var params = ""; keys.forEach(function(k){ params += "&" + encodeURIComponent(k) + "=" + encodeURIComponent(data[k]); }); params = encodeURIComponent(params.substring(1)); return hashString(signingToken, output+params, "base64"); } function hashString(key, str, encoding){ var hmac = crypto.createHmac("sha1", key); hmac.update(str); return hmac.digest(encoding); } function generateNonce() { var code = ""; for (var i = 0; i < 20; i++) { code += Math.floor(Math.random() * 9).toString(); } return code; } Part 1: The Helpers
  • 46. var crypto = require('crypto'); var querystring = require('querystring'); function read(query, user, request) { var result = { id: query.id, identities: user.getIdentities(), userName: '' }; var identities = user.getIdentities(); var userId = user.userId; var twitterId = userId.substring(userId.indexOf(':') + 1); //API 1.0 //url = 'https://api.twitter.com/1/users/show/' + twitterId + '.json'; //API 1.1 var url = 'https://api.twitter.com/1.1/users/show.json?user_id=' + twitterId; var key = 'This is your consumer key'; var nonce = generateNonce(); var sigmethod = 'HMAC-SHA1'; var version = '1.0'; var twitterAccessToken = identities.twitter.accessToken; var oauth_token = 'The Access Token'; var seconds = new Date() / 1000; seconds = Math.round(seconds); var requestType = 'GET'; var oauthData = { oauth_consumer_key: key, oauth_nonce: nonce, oauth_signature:null, oauth_signature_method: sigmethod, oauth_timestamp: seconds, oauth_token: oauth_token, oauth_version: version }; var sigData = {}; for (var k in oauthData){ sigData[k] = oauthData[k]; } sigData['user_id'] = twitterId; Part 2: The Work (part 1)
  • 47. var sig = generateOAuthSignature('GET', url, sigData); oauthData.oauth_signature = sig; var oauthHeader = ""; for (k in oauthData){ oauthHeader += ", " + encodeURIComponent(k) + "="" + encodeURIComponent(oauthData[k]) + """; } oauthHeader = oauthHeader.substring(1); var authHeader = 'OAuth' + oauthHeader; //Generate callback for response from Twitter API var requestCallback = function (err, resp, body) { if (err || resp.statusCode !== 200) { console.error('Error sending data to the provider: ', err); request.respond(statusCodes.INTERNAL_SERVER_ERROR, body); } else { try { var userData = JSON.parse(body); if (userData.name != null) result.UserName = userData.name; else result.UserName = "can't get username"; request.respond(200, [result]); } catch (ex) { console.error('Error parsing response from the provider API: ', ex); request.respond(statusCodes.INTERNAL_SERVER_ERROR, ex); } } } //Create the request and execute it var req = require('request'); var reqOptions = { uri: url, headers: { Accept: "application/json" } }; if (authHeader != null) reqOptions.headers['Authorization'] = authHeader; req(reqOptions, requestCallback); } Part 2.2: The Work
  • 49. The Easy Way exports.post = function(request, response) { var twitter = require(‘ctwitter.js’); twitter.init(’consumer key',’consumer secret'); twitter.tweet(request.body.tweettext, request.user, request); } Get the script here: http://bit.ly/14b73Gg
  • 51. Enable on dashboard Creates Git repo Changes push from client
  • 52.
  • 54. require(‘jsfile.js'); *Need a config change on update (for now)
  • 55. Auth Part 1: Custom
  • 56. Pass creds in Validate Hash your salt Create a JWT
  • 57. Part 1: The Helpers
  • 58. Part 2: The Work
  • 60. …or just use Auth0 http://aka.ms/authZeroZumo Check out Who’s that User? – Friday @ 2pm
  • 61. Auth Part 2: Identity Caching
  • 63. Getting and Setting Credentials
  • 64. Auth Part 3: Expired Tokens
  • 74. Remember API call #s when considering client side one-to-many
  • 80. On-Prem Solutions in Windows Azure Data Synchronization SQL Data Sync Application-Layer Connectivity & Messaging Service Bus Secure Point-to-Site Network Connectivity Windows Azure Virtual Network Secure Site-to-Site Network Connectivity Windows Azure Virtual Network
  • 81.
  • 82. Windows Azure Point-to-Site VPNs <subnet 1> <subnet 2> <subnet 3> DNS Server On-premises VPN Gateway Route-based VPN Your datacenter Individual computers behind corporate firewall Virtual Network
  • 83. Site-to-Site Connectivity • • On-ramp for migrating services to the cloud • Windows Azure Extend your premises to the cloud securely Use your on-prem resources in Azure (monitoring, AD, …) On-premises <subnet 2> <subnet 3> DNS Server VPN Gateway Hardware VPN or Windows RRAS Your datacenter <subnet 1> Virtual Network