SlideShare a Scribd company logo
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, …);

{
Cnam azure 2014   mobile services
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
Cnam azure 2014   mobile services
//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
Cnam azure 2014   mobile services
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
Cnam azure 2014   mobile services
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

More Related Content

What's hot

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
 
Elm: give it a try
Elm: give it a tryElm: give it a try
Elm: give it a try
Eugene Zharkov
 
mobl presentation @ IHomer
mobl presentation @ IHomermobl presentation @ IHomer
mobl presentation @ IHomer
zefhemel
 
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
MongoDB
 
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
Mahmoud 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.io
Günter Obiltschnig
 
Ds 2 cycle
Ds 2 cycleDs 2 cycle
Ds 2 cycle
Chaitanya Kn
 
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 189
Mahmoud Samir Fayed
 
dotSwift - From Problem to Solution
dotSwift - From Problem to SolutiondotSwift - From Problem to Solution
dotSwift - From Problem to Solution
soroushkhanlou
 
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 196
Mahmoud 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 88
Mahmoud Samir Fayed
 
Building android apps with kotlin
Building android apps with kotlinBuilding android apps with kotlin
Building android apps with kotlin
Shem 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 menace
Felipe Prado
 
Scala on Your Phone
Scala on Your PhoneScala on Your Phone
Scala on Your Phone
Michael Galpin
 
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
Alexander 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 31
Mahmoud Samir Fayed
 

What's hot (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
 

Viewers also liked

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
Aymeric Weinbach
 
Equity market
Equity marketEquity market
Equity market
TheEquicom Advisory
 
Gwab 2014 Paris keynote
Gwab 2014 Paris keynoteGwab 2014 Paris keynote
Gwab 2014 Paris keynote
Aymeric Weinbach
 
11111
1111111111
Group 2 - Evidence Exhibit Module Presentation
Group 2 - Evidence Exhibit Module PresentationGroup 2 - Evidence Exhibit Module Presentation
Group 2 - Evidence Exhibit Module Presentation
Stephanie 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 2017
Marius Zaharia
 
Potencias y raíces
Potencias y raícesPotencias y raíces
Potencias y raíces
Iván Gallego González
 
Cnam azure 2014 iaas
Cnam azure 2014   iaas Cnam azure 2014   iaas
Cnam azure 2014 iaas
Aymeric Weinbach
 
Cnam azure 2014 storage
Cnam azure 2014   storageCnam azure 2014   storage
Cnam azure 2014 storage
Aymeric Weinbach
 
Presentazione matrictionary - www.graceevent.net
Presentazione matrictionary  - www.graceevent.netPresentazione matrictionary  - www.graceevent.net
Presentazione matrictionary - www.graceevent.net
Mariagrazia Tarantino
 
Session Objet Connecté gwab 2014 paris
Session Objet Connecté gwab 2014 parisSession Objet Connecté gwab 2014 paris
Session Objet Connecté gwab 2014 paris
Aymeric 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 plateforme
Aymeric 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 20161020
NimeOps
 
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 Tomorrow
Carolyn Scherf
 

Viewers also liked (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
 

Similar to Cnam azure 2014 mobile services

Paris js extensions
Paris js extensionsParis js extensions
Paris js extensions
erwanl
 
Micro app-framework - NodeLive Boston
Micro app-framework - NodeLive BostonMicro app-framework - NodeLive Boston
Micro app-framework - NodeLive Boston
Michael Dawson
 
Micro app-framework
Micro app-frameworkMicro app-framework
Micro app-framework
Michael Dawson
 
Automation in angular js
Automation in angular jsAutomation in angular js
Automation in angular js
Marcin Wosinek
 
MAF push notifications
MAF push notificationsMAF push notifications
MAF push notifications
Luc Bors
 
Enterprise workflow with Apps Script
Enterprise workflow with Apps ScriptEnterprise workflow with Apps Script
Enterprise workflow with Apps Script
ccherubino
 
Websockets talk at Rubyconf Uruguay 2010
Websockets talk at Rubyconf Uruguay 2010Websockets talk at Rubyconf Uruguay 2010
Websockets talk at Rubyconf Uruguay 2010
Ismael Celis
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
Sven Haiges
 
mobl
moblmobl
mobl
zefhemel
 
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.io
Steven Beeckman
 
Embracing the-power-of-refactor
Embracing the-power-of-refactorEmbracing the-power-of-refactor
Embracing the-power-of-refactor
Xiaojun REN
 
Arduino and the real time web
Arduino and the real time webArduino and the real time web
Arduino and the real time web
Andrew Fisher
 
Mozilla とブラウザゲーム
Mozilla とブラウザゲームMozilla とブラウザゲーム
Mozilla とブラウザゲーム
Noritada Shimizu
 
Anti patterns
Anti patternsAnti patterns
Anti patterns
Alex Tumanoff
 
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 Story
Alexandre 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 APIs
DevFest 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 development
Johannes Brodwall
 

Similar to 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
 

More from Aymeric Weinbach

Serverless everywhere
Serverless everywhereServerless everywhere
Serverless everywhere
Aymeric Weinbach
 
Gaib19 azure + ia = art
Gaib19   azure + ia = artGaib19   azure + ia = art
Gaib19 azure + ia = art
Aymeric Weinbach
 
Gab 2017 iot azure aymeric weinbach
Gab 2017 iot  azure aymeric weinbachGab 2017 iot  azure aymeric weinbach
Gab 2017 iot azure aymeric weinbach
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
Aymeric Weinbach
 
Cnam azure ze cloud resource manager
Cnam azure ze cloud  resource managerCnam azure ze cloud  resource manager
Cnam azure ze cloud resource manager
Aymeric 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 automatisation
Aymeric 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 azure
Aymeric Weinbach
 
Cnam cours azure web sites
Cnam cours azure web sitesCnam cours azure web sites
Cnam cours azure web sites
Aymeric Weinbach
 
Cnam cours azure zecloud mobile services
Cnam cours azure zecloud mobile servicesCnam cours azure zecloud mobile services
Cnam cours azure zecloud mobile services
Aymeric 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 generale
Aymeric Weinbach
 
Cnam cours azure iaas
Cnam cours azure iaasCnam cours azure iaas
Cnam cours azure iaas
Aymeric Weinbach
 
Cnam cours azure cloud services
Cnam cours azure  cloud servicesCnam cours azure  cloud services
Cnam cours azure cloud services
Aymeric Weinbach
 
Cnam azure 2015 storage
Cnam azure 2015  storageCnam azure 2015  storage
Cnam azure 2015 storage
Aymeric Weinbach
 
Windows azure gwab - mobile services
Windows azure   gwab - mobile servicesWindows azure   gwab - mobile services
Windows azure gwab - mobile services
Aymeric 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 cloud
Aymeric 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 Paris
Aymeric Weinbach
 
Introduction gwab 2014 paris
Introduction gwab 2014 parisIntroduction gwab 2014 paris
Introduction gwab 2014 paris
Aymeric 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 2014
Aymeric Weinbach
 

More from 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
 

Recently uploaded

Recent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS InfrastructureRecent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS Infrastructure
KAMAL CHOUDHARY
 
Girls Call Churchgate 9910780858 Provide Best And Top Girl Service And No1 in...
Girls Call Churchgate 9910780858 Provide Best And Top Girl Service And No1 in...Girls Call Churchgate 9910780858 Provide Best And Top Girl Service And No1 in...
Girls Call Churchgate 9910780858 Provide Best And Top Girl Service And No1 in...
maigasapphire
 
Introduction-to-the-IAM-Platform-Implementation-Plan.pptx
Introduction-to-the-IAM-Platform-Implementation-Plan.pptxIntroduction-to-the-IAM-Platform-Implementation-Plan.pptx
Introduction-to-the-IAM-Platform-Implementation-Plan.pptx
313mohammedarshad
 
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdfWhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
ArgaBisma
 
Choose our Linux Web Hosting for a seamless and successful online presence
Choose our Linux Web Hosting for a seamless and successful online presenceChoose our Linux Web Hosting for a seamless and successful online presence
Choose our Linux Web Hosting for a seamless and successful online presence
rajancomputerfbd
 
Tirana Tech Meetup - Agentic RAG with Milvus, Llama3 and Ollama
Tirana Tech Meetup - Agentic RAG with Milvus, Llama3 and OllamaTirana Tech Meetup - Agentic RAG with Milvus, Llama3 and Ollama
Tirana Tech Meetup - Agentic RAG with Milvus, Llama3 and Ollama
Zilliz
 
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdfBT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
Neo4j
 
leewayhertz.com-AI agents for healthcare Applications benefits and implementa...
leewayhertz.com-AI agents for healthcare Applications benefits and implementa...leewayhertz.com-AI agents for healthcare Applications benefits and implementa...
leewayhertz.com-AI agents for healthcare Applications benefits and implementa...
alexjohnson7307
 
Best Practices for Effectively Running dbt in Airflow.pdf
Best Practices for Effectively Running dbt in Airflow.pdfBest Practices for Effectively Running dbt in Airflow.pdf
Best Practices for Effectively Running dbt in Airflow.pdf
Tatiana Al-Chueyr
 
IPLOOK Remote-Sensing Satellite Solution
IPLOOK Remote-Sensing Satellite SolutionIPLOOK Remote-Sensing Satellite Solution
IPLOOK Remote-Sensing Satellite Solution
IPLOOK Networks
 
The Rise of AI in Cybersecurity How Machine Learning Will Shape Threat Detect...
The Rise of AI in Cybersecurity How Machine Learning Will Shape Threat Detect...The Rise of AI in Cybersecurity How Machine Learning Will Shape Threat Detect...
The Rise of AI in Cybersecurity How Machine Learning Will Shape Threat Detect...
digitalxplive
 
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - MydbopsScaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Mydbops
 
High Profile Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class ...
High Profile Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class ...High Profile Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class ...
High Profile Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class ...
aslasdfmkhan4750
 
"Mastering Graphic Design: Essential Tips and Tricks for Beginners and Profes...
"Mastering Graphic Design: Essential Tips and Tricks for Beginners and Profes..."Mastering Graphic Design: Essential Tips and Tricks for Beginners and Profes...
"Mastering Graphic Design: Essential Tips and Tricks for Beginners and Profes...
Anant Gupta
 
Calgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptxCalgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptx
ishalveerrandhawa1
 
Acumatica vs. Sage Intacct vs. NetSuite _ NOW CFO.pdf
Acumatica vs. Sage Intacct vs. NetSuite _ NOW CFO.pdfAcumatica vs. Sage Intacct vs. NetSuite _ NOW CFO.pdf
Acumatica vs. Sage Intacct vs. NetSuite _ NOW CFO.pdf
BrainSell Technologies
 
find out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challengesfind out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challenges
huseindihon
 
Girls call Kolkata 👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery
Girls call Kolkata 👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery Girls call Kolkata 👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery
Girls call Kolkata 👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery
sunilverma7884
 
Implementations of Fused Deposition Modeling in real world
Implementations of Fused Deposition Modeling  in real worldImplementations of Fused Deposition Modeling  in real world
Implementations of Fused Deposition Modeling in real world
Emerging Tech
 
Salesforce AI & Einstein Copilot Workshop
Salesforce AI & Einstein Copilot WorkshopSalesforce AI & Einstein Copilot Workshop
Salesforce AI & Einstein Copilot Workshop
CEPTES Software Inc
 

Recently uploaded (20)

Recent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS InfrastructureRecent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS Infrastructure
 
Girls Call Churchgate 9910780858 Provide Best And Top Girl Service And No1 in...
Girls Call Churchgate 9910780858 Provide Best And Top Girl Service And No1 in...Girls Call Churchgate 9910780858 Provide Best And Top Girl Service And No1 in...
Girls Call Churchgate 9910780858 Provide Best And Top Girl Service And No1 in...
 
Introduction-to-the-IAM-Platform-Implementation-Plan.pptx
Introduction-to-the-IAM-Platform-Implementation-Plan.pptxIntroduction-to-the-IAM-Platform-Implementation-Plan.pptx
Introduction-to-the-IAM-Platform-Implementation-Plan.pptx
 
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdfWhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
 
Choose our Linux Web Hosting for a seamless and successful online presence
Choose our Linux Web Hosting for a seamless and successful online presenceChoose our Linux Web Hosting for a seamless and successful online presence
Choose our Linux Web Hosting for a seamless and successful online presence
 
Tirana Tech Meetup - Agentic RAG with Milvus, Llama3 and Ollama
Tirana Tech Meetup - Agentic RAG with Milvus, Llama3 and OllamaTirana Tech Meetup - Agentic RAG with Milvus, Llama3 and Ollama
Tirana Tech Meetup - Agentic RAG with Milvus, Llama3 and Ollama
 
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdfBT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
 
leewayhertz.com-AI agents for healthcare Applications benefits and implementa...
leewayhertz.com-AI agents for healthcare Applications benefits and implementa...leewayhertz.com-AI agents for healthcare Applications benefits and implementa...
leewayhertz.com-AI agents for healthcare Applications benefits and implementa...
 
Best Practices for Effectively Running dbt in Airflow.pdf
Best Practices for Effectively Running dbt in Airflow.pdfBest Practices for Effectively Running dbt in Airflow.pdf
Best Practices for Effectively Running dbt in Airflow.pdf
 
IPLOOK Remote-Sensing Satellite Solution
IPLOOK Remote-Sensing Satellite SolutionIPLOOK Remote-Sensing Satellite Solution
IPLOOK Remote-Sensing Satellite Solution
 
The Rise of AI in Cybersecurity How Machine Learning Will Shape Threat Detect...
The Rise of AI in Cybersecurity How Machine Learning Will Shape Threat Detect...The Rise of AI in Cybersecurity How Machine Learning Will Shape Threat Detect...
The Rise of AI in Cybersecurity How Machine Learning Will Shape Threat Detect...
 
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - MydbopsScaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
 
High Profile Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class ...
High Profile Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class ...High Profile Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class ...
High Profile Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class ...
 
"Mastering Graphic Design: Essential Tips and Tricks for Beginners and Profes...
"Mastering Graphic Design: Essential Tips and Tricks for Beginners and Profes..."Mastering Graphic Design: Essential Tips and Tricks for Beginners and Profes...
"Mastering Graphic Design: Essential Tips and Tricks for Beginners and Profes...
 
Calgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptxCalgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptx
 
Acumatica vs. Sage Intacct vs. NetSuite _ NOW CFO.pdf
Acumatica vs. Sage Intacct vs. NetSuite _ NOW CFO.pdfAcumatica vs. Sage Intacct vs. NetSuite _ NOW CFO.pdf
Acumatica vs. Sage Intacct vs. NetSuite _ NOW CFO.pdf
 
find out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challengesfind out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challenges
 
Girls call Kolkata 👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery
Girls call Kolkata 👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery Girls call Kolkata 👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery
Girls call Kolkata 👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery
 
Implementations of Fused Deposition Modeling in real world
Implementations of Fused Deposition Modeling  in real worldImplementations of Fused Deposition Modeling  in real world
Implementations of Fused Deposition Modeling in real world
 
Salesforce AI & Einstein Copilot Workshop
Salesforce AI & Einstein Copilot WorkshopSalesforce AI & Einstein Copilot Workshop
Salesforce AI & Einstein Copilot Workshop
 

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, …); {
  • 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)
  • 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
  • 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
  • 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