SlideShare una empresa de Scribd logo
1 de 33
Descargar para leer sin conexión
Becoming a Polyglot
Simple API Engines in 5 Languages
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Introduction
Kirsten Hunter
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Kirsten Hunter
@synedra
http://www.princesspolymath.com
The Challenge
Siloed Communities
Poor Understanding of
Language Differences
Fear of the Unknown
Exclusivity
Kirsten Hunter
@synedra
http://www.princesspolymath.com
The Solution
• Simple API Project
• Mongo Backend
• Single Page Application Front End
• Identically functioning API Engines in 5
Languages
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Fortune Cookie
Server
Engines use data from
mongo db
Each engine presents
full API capability
* GET
* PUT
* POST
* DELETE
Github / Docker
synedra/polyglot
c9.io
python image
clone github repo
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Single Page Application
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Mongo Setup
load quoteid.jsonStartup mongo
/etc/init.d/mongodb start
{
"content": "Boredom: the
desire for desires.",
"index": 1998,
"author": "Leo Tolstoy"
},
mongoimport --collection quotes --file
quoteid.json --type json --jsonArray
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Schema
Modeling
RAML
OpenAPI
Kirsten Hunter
@synedra
http://www.princesspolymath.com
RAML	0.8	
title:	Fortune	Cookie	
version:	V1	
baseUri:	http://www.fortunecookieserver.com/api/v1	
/quotes:	
		displayName:	Quotes	
		get:	
				description:	Get	a	list	of	quotes	
				queryParameters:	
						random:	
								description:	Retrieve	a	random	quote	
								required:	false	
								default:	false	
								type:	boolean	
				responses:	
						200:	
								body:	
										application/json:	
												example:	|	
														[	
																{"content":"That	which	does	not	kill	us	makes	us	stronger.",	
																		"author":"Sun	Yi",	
																		"id":1	
																}	
														]
Kirsten Hunter
@synedra
http://www.princesspolymath.com
RAML	0.8	
title:	Fortune	Cookie	
version:	V1	
baseUri:	http://www.fortunecookieserver.com/api/v1	
/quotes:	
		displayName:	Quotes	
		get:	
				description:	Get	a	list	of	quotes	
				queryParameters:	
						random:	
								description:	Retrieve	a	random	quote	
								required:	false	
								default:	false	
								type:	boolean	
				responses:	
						200:	
								body:	
										application/json:	
												example:	|	
														[	
																{"content":"That	which	does	not	kill	us	makes	us	stronger.",	
																		"author":"Sun	Yi",	
																		"id":1	
																}	
														]
Kirsten Hunter
@synedra
http://www.princesspolymath.com
RAML	0.8	
title:	Fortune	Cookie	
version:	V1	
baseUri:	http://www.fortunecookieserver.com/api/v1	
/quotes:	
		displayName:	Quotes	
		get:	
				description:	Get	a	list	of	quotes	
				queryParameters:	
						random:	
								description:	Retrieve	a	random	quote	
								required:	false	
								default:	false	
								type:	boolean	
				responses:	
						200:	
								body:	
										application/json:	
												example:	|	
														[	
																{"content":"That	which	does	not	kill	us	makes	us	stronger.",	
																		"author":"Sun	Yi",	
																		"id":1	
																}	
														]
Kirsten Hunter
@synedra
http://www.princesspolymath.com
{	
				"swagger":	"2.0",	
				"info":	{	
								"title":	"Fortune	Cookie	API",	
								"description":	"Random	quote	of	the	day",	
								"version":	"1.0.0"	
				},	
				"host":	"api.fortunecookieserver.com",	
				"schemes":	[	
								"http"	
				],	
				"basePath":	"/v1",	
				"produces":	[	
								"application/json"	
				],	
				"paths":	{	
								"/quotes":	{	
												"get":	{	
																"summary":	"Quotes",	
																"description":	"This	is	a	quote	server.n",	
																"tags":	[	
																				"Quotes"	
																],	
																"responses":	{	
																				"200":	{	
																								"description":	"An	array	of	products",	
																								"schema":	{	
																												"type":	"array",	
																												"items":	{	
																																"$ref":	"#/definitions/Quote"	
																												}	
																								}	
																				},
Kirsten Hunter
@synedra
http://www.princesspolymath.com
{	
				"swagger":	"2.0",	
				"info":	{	
								"title":	"Fortune	Cookie	API",	
								"description":	"Random	quote	of	the	day",	
								"version":	"1.0.0"	
				},	
				"host":	"api.fortunecookieserver.com",	
				"schemes":	[	
								"http"	
				],	
				"basePath":	"/v1",	
				"produces":	[	
								"application/json"	
				],	
				"paths":	{	
								"/quotes":	{	
												"get":	{	
																"summary":	"Quotes",	
																"description":	"This	is	a	quote	server.n",	
																"tags":	[	
																				"Quotes"	
																],	
																"responses":	{	
																				"200":	{	
																								"description":	"An	array	of	products",	
																								"schema":	{	
																												"type":	"array",	
																												"items":	{	
																																"$ref":	"#/definitions/Quote"	
																												}	
																								}	
																				},
Kirsten Hunter
@synedra
http://www.princesspolymath.com
{	
				"swagger":	"2.0",	
				"info":	{	
								"title":	"Fortune	Cookie	API",	
								"description":	"Random	quote	of	the	day",	
								"version":	"1.0.0"	
				},	
				"host":	"api.fortunecookieserver.com",	
				"schemes":	[	
								"http"	
				],	
				"basePath":	"/v1",	
				"produces":	[	
								"application/json"	
				],	
				"paths":	{	
								"/quotes":	{	
												"get":	{	
																"summary":	"Quotes",	
																"description":	"This	is	a	quote	server.n",	
																"tags":	[	
																				"Quotes"	
																],	
																"responses":	{	
																				"200":	{	
																								"description":	"An	array	of	products",	
																								"schema":	{	
																												"type":	"array",	
																												"items":	{	
																																"$ref":	"#/definitions/Quote"	
																												}	
																								}	
																				},
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Quick Schema Editor Demo
Kirsten Hunter
@synedra
http://www.princesspolymath.com
PHP - Mongo Setup//	Routes	
$app->group('/api/quotes',	function	()	{	
				//	Setup	DB	connection	
				$mongo	=	new	MongoClient('mongodb://localhost:27017');	
				$mongo->connect();	
				$db	=	$mongo->test;	
				$quotes	=	$db->selectCollection('quotes');	
				$this->get('',	function	(Request	$request,	Response	$response,	array	$args)	use	($quotes)	{	
								$this->logger->info("Fetching	10	records…n");	
								$results	=	[];	
								foreach	($quotes->find([],	['_id'	=>	0])->sort(['index'	=>	-1])->limit(10)	as	$quote)	{	
												$results[]	=	$quote;	
								}	
								$response	
												->getBody()->write(json_encode($results,	JSON_PRETTY_PRINT));	
								$newResponse	=	$response->withHeader(	
												'Content-type',	
												'application/json;	charset=utf-8'	
								);	
								return	$newResponse;	
				});
Kirsten Hunter
@synedra
http://www.princesspolymath.com
PHP - Route//	Routes	
$app->group('/api/quotes',	function	()	{	
				//	Setup	DB	connection	
				$mongo	=	new	MongoClient('mongodb://localhost:27017');	
				$mongo->connect();	
				$db	=	$mongo->test;	
				$quotes	=	$db->selectCollection('quotes');	
				$this->get('',	function	(Request	$request,	Response	$response,	array	$args)	use	($quotes)	{	
								$this->logger->info("Fetching	10	records…n");	
								$results	=	[];	
								foreach	($quotes->find([],	['_id'	=>	0])->sort(['index'	=>	-1])->limit(10)	as	$quote)	{	
												$results[]	=	$quote;	
								}	
								$response	
												->getBody()->write(json_encode($results,	JSON_PRETTY_PRINT));	
								$newResponse	=	$response->withHeader(	
												'Content-type',	
												'application/json;	charset=utf-8'	
								);	
								return	$newResponse;	
				});
Kirsten Hunter
@synedra
http://www.princesspolymath.com
PHP - Static
$app->get('/', function(Request $request, Response
$response, $args) {
return $response->getBody()->write('Hello World from
PHP Slim');
});
$app->get('/demo', function(Request $request, Response
$response, $args) {
$content = file_get_contents('../static/index.html');
return $response->getBody()->write($content);
});
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Perl - Mongo Setupuse	Dancer;	
use	Dancer::Plugin::CRUD;	
use	MongoDB;	
my	$client	=	MongoDB->connect();	
my	$db	=	$client->get_database('test');	
my	$quotes	=	$db->get_collection('quotes');	
my	$json	=	JSON->new->allow_nonref;	
set	content_type	=>	'application/json';	
get	'/'	=>	sub{	
				return	{message	=>	"Hello	from	Perl	and	Dancer"};	
};	
set	public	=>	path(dirname(__FILE__),	'..',	'static');	
get	"/demo/?"	=>	sub	{	
				send_file	'/index.html'	
};	
get	'/api/quotes'	=>	sub	{	
				my	$response	=	$quotes->find()->sort({'index'	=>	-1})->limit(10);	
				my	@results	=	();	
				while(my	$quote	=	$response->next)	{	
																push	(@results,
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Perl - Static Files
use	Dancer;	
use	Dancer::Plugin::CRUD;	
use	MongoDB;	
my	$client	=	MongoDB->connect();	
my	$db	=	$client->get_database('test');	
my	$quotes	=	$db->get_collection('quotes');	
my	$json	=	JSON->new->allow_nonref;	
set	content_type	=>	'application/json';	
get	'/'	=>	sub{	
				return	{message	=>	"Hello	from	Perl	and	Dancer"};	
};	
set	public	=>	path(dirname(__FILE__),	'..',	'static');	
get	"/demo/?"	=>	sub	{	
				send_file	'/index.html'	
};	
get	'/api/quotes'	=>	sub	{	
				my	$response	=	$quotes->find()->sort({'index'	=>	-1})->limit(10);	
				my	@results	=	();	
				while(my	$quote	=	$response->next)	{	
																push	(@results,
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Perl - Routes
get	'/api/quotes'	=>	sub	{	
				my	$response	=	$quotes->find()->sort({'index'	=>	-1})->limit(10);	
				my	@results	=	();	
				while(my	$quote	=	$response->next)	{	
																push	(@results,	
																								{"content"	=>	$quote->{'content'},	
																									"index"			=>	$quote->{'index'},	
																									"author"		=>	$quote->{'author'}	
																									}	
																);	
								}		
								if	(!	scalar	(@results))	{	
												status	404;	
												return;	
								}	
								return	@results;	
};
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Python - Mongo Setup
app = Flask("test",static_folder='')
api = Api(app)
mongo = PyMongo(app)
parser = reqparse.RequestParser()
parser.add_argument('author')
parser.add_argument('content', required=True,
help="Content cannot be blank!")
APP_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(APP_ROOT, "..", "static")
class Quote(Resource):
def get(self, quote_id):
if quote_id == "random":
print "Random is random"
quotes = mongo.db.quotes.find().sort("index", -1).limit(1)
max_number = int(quotes[0]["index"])
rand_quote = randint(0, max_number)
quotes = mongo.db.quotes.find_one({"index": int(rand_quote)})
else:
quotes = mongo.db.quotes.find_one({"index": int(quote_id)})
resp = Response(dumps(quotes, default=default),
mimetype='application/json')
return resp
def delete(self, quote_id):
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Python - Static
APP_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(APP_ROOT, "..", "static")
class Quote(Resource):
def get(self, quote_id):
if quote_id == "random":
print "Random is random"
quotes = mongo.db.quotes.find().sort("index", -1).limit(1)
max_number = int(quotes[0]["index"])
rand_quote = randint(0, max_number)
quotes = mongo.db.quotes.find_one({"index": int(rand_quote)})
else:
quotes = mongo.db.quotes.find_one({"index": int(quote_id)})
resp = Response(dumps(quotes, default=default),
mimetype='application/json')
return resp
…
@app.route('/')
def hello_world():
return 'Hello from Flask!'
@app.route('/demo')
def serve_page():
return send_from_directory(STATIC_ROOT, "index.html")
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Python - Route
# shows a list of all quotes, and lets you POST to add new quotes
class QuoteList(Resource):
def get(self):
quotes = mongo.db.quotes.find().sort("index", -1).limit(10)
resp = Response(dumps(quotes, default=default),
mimetype='application/json')
return resp
def post(self):
args = parser.parse_args()
quotes = mongo.db.quotes.find().sort("index", -1).limit(1)
print quotes[0]
args["index"] = int(quotes[0]["index"]) + 1
print args
try:
mongo.db.quotes.insert(args)
except Error as ve:
abort(400, str(ve))
return 201
api.add_resource(QuoteList, '/api/quotes')
api.add_resource(Quote, '/api/quotes/<quote_id>')
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Ruby - Mongo Setup
class Quote
include Mongoid::Document
field :index
field :author
field :content
end
Mongoid.load!("mongoid.yml", :development)
set :port, 3000
set :bind, '0.0.0.0'
get '/demo*' do
content_type :html
File.read(File.join('../static', 'index.html'))
end
get '/' do
content_type :html
"Hello World from Sinatra"
end
before do
content_type 'application/json'
end
Kirsten Hunter
@synedra
http://www.princesspolymath.com
class Quote
include Mongoid::Document
field :index
field :author
field :content
end
Mongoid.load!("mongoid.yml", :development)
set :port, 3000
set :bind, '0.0.0.0'
get '/demo*' do
content_type :html
File.read(File.join('../static', 'index.html'))
end
get '/' do
content_type :html
"Hello World from Sinatra"
end
before do
content_type 'application/json'
end
Ruby - Static
Kirsten Hunter
@synedra
http://www.princesspolymath.com
before do
content_type 'application/json'
end
namespace "/api" do
# list all
get '/quotes' do
Quote.all.desc(:index).limit(10).to_json
end
get '/quotes/random' do
newnumber = Quote.count
random_num = rand(newnumber)
quote = Quote.find_by(index: random_num.to_i)
return status 404 if quote.nil?
quote.to_json
end
# view one
get '/quotes/:index' do
quote = Quote.find_by(index: params[:index].to_i)
return status 404 if quote.nil?
quote.to_json
end
Ruby - Route
Kirsten Hunter
@synedra
http://www.princesspolymath.com
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;
var quoteSchema = mongoose.Schema({
content: String,
author: String,
index: Number
});
var Quote = mongoose.model('Quote', quoteSchema)
Quote.count().exec(function(err, count){
quotecount = count;
});
var express = require('express');
var app = express();
var router = express.Router();
var path = require('path');
var bodyParser = require('body-parser');
app.use('/demo', express.static(path.join(__dirname, '..', 'static')));
app.use(bodyParser.json());
// index
Node - Mongo Setup
Kirsten Hunter
@synedra
http://www.princesspolymath.com
var express = require('express');
var app = express();
var router = express.Router();
var path = require('path');
var bodyParser = require('body-parser');
app.use('/demo', express.static(path.join(__dirname, '..', 'static')));
app.use(bodyParser.json());
// index
app.get('/', function(req, res) {
res.send('Hello world from express');
});
app.use('/api', router);
// REST API
router.route('/quotes/random')
.get(function(req, res, next) {
var random = Math.floor(Math.random() * quotecount);
Quote.findOne({"index":random},
function (err, result) {
if (err) {
console.log(err);
res.redirect('/quotes/random');
}
res.send(result);
Node - Express Static
Kirsten Hunter
@synedra
http://www.princesspolymath.com
var express = require('express');
var app = express();
var router = express.Router();
var path = require('path');
var bodyParser = require('body-parser');
app.use('/demo', express.static(path.join(__dirname, '..', 'static')));
app.use(bodyParser.json());
// index
app.get('/', function(req, res) {
res.send('Hello world from express');
});
app.use('/api', router);
// REST API
router.route('/quotes/random')
.get(function(req, res, next) {
var random = Math.floor(Math.random() * quotecount);
Quote.findOne({"index":random},
function (err, result) {
if (err) {
console.log(err);
res.redirect('/quotes/random');
}
res.send(result);
Node - Express Routes
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Node - Hapi Static
server.route({
method : 'GET', path : '/demo/{path*}', handler : {
directory : {
path : '../static',
listing : false,
index : true
}}})});
server.route([
{
method: 'GET',
path: '/',
handler: function(request, reply) {
reply('Hello world from hapi');
}}]);
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Node - Hapi Routes
server.route([
{
method: 'GET',
path: '/api/quotes/random',
handler: function(request, reply) {
var random = Math.floor(Math.random() * quotecount);
Quote.findOne({"index":random},
function (err, result) {
reply(result);
})
}
},
Kirsten Hunter
@synedra
http://www.princesspolymath.com
Questions?
http://www.princesspolymath.com
Kirsten Hunter
@synedra
http://www.princesspolymath.com

Más contenido relacionado

Destacado

Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleHugo Hamon
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2Hugo Hamon
 
Développeurs, cachez-moi ça ! (Paris Web 2011)
Développeurs, cachez-moi ça ! (Paris Web 2011)Développeurs, cachez-moi ça ! (Paris Web 2011)
Développeurs, cachez-moi ça ! (Paris Web 2011)Hugo Hamon
 
Designing for developers
Designing for developersDesigning for developers
Designing for developersKirsten Hunter
 
Symfony2 en pièces détachées
Symfony2 en pièces détachéesSymfony2 en pièces détachées
Symfony2 en pièces détachéesHugo Hamon
 
API 101 Workshop from APIStrat Conference
API 101 Workshop from APIStrat ConferenceAPI 101 Workshop from APIStrat Conference
API 101 Workshop from APIStrat ConferenceKirsten Hunter
 
Symfony2 - extending the console component
Symfony2 - extending the console componentSymfony2 - extending the console component
Symfony2 - extending the console componentHugo Hamon
 
Api intensive - What they Are
Api intensive - What they AreApi intensive - What they Are
Api intensive - What they AreKirsten Hunter
 
Quantifying your-fitness
Quantifying your-fitnessQuantifying your-fitness
Quantifying your-fitnessKirsten Hunter
 
Sean coates fifty things and tricks, confoo 2011
Sean coates fifty things and tricks, confoo 2011Sean coates fifty things and tricks, confoo 2011
Sean coates fifty things and tricks, confoo 2011Bachkoutou Toutou
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & RESTHugo Hamon
 
Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2Hugo Hamon
 
This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?
This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?
This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?Mark Heckler
 
Living on the Edge (Service): Bundling Microservices to Optimize Consumption ...
Living on the Edge (Service): Bundling Microservices to Optimize Consumption ...Living on the Edge (Service): Bundling Microservices to Optimize Consumption ...
Living on the Edge (Service): Bundling Microservices to Optimize Consumption ...Mark Heckler
 
Conquest for dummies: how to setup a pacs server
Conquest for dummies: how to setup a pacs serverConquest for dummies: how to setup a pacs server
Conquest for dummies: how to setup a pacs serverBogazici University
 

Destacado (20)

Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et Pimple
 
Liberating your data
Liberating your dataLiberating your data
Liberating your data
 
Facebook appsincloud
Facebook appsincloudFacebook appsincloud
Facebook appsincloud
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
 
Développeurs, cachez-moi ça ! (Paris Web 2011)
Développeurs, cachez-moi ça ! (Paris Web 2011)Développeurs, cachez-moi ça ! (Paris Web 2011)
Développeurs, cachez-moi ça ! (Paris Web 2011)
 
Liberating your data
Liberating your dataLiberating your data
Liberating your data
 
Api 101
Api 101Api 101
Api 101
 
Designing for developers
Designing for developersDesigning for developers
Designing for developers
 
Symfony2 en pièces détachées
Symfony2 en pièces détachéesSymfony2 en pièces détachées
Symfony2 en pièces détachées
 
API 101 Workshop from APIStrat Conference
API 101 Workshop from APIStrat ConferenceAPI 101 Workshop from APIStrat Conference
API 101 Workshop from APIStrat Conference
 
Symfony2 - extending the console component
Symfony2 - extending the console componentSymfony2 - extending the console component
Symfony2 - extending the console component
 
Api intensive - What they Are
Api intensive - What they AreApi intensive - What they Are
Api intensive - What they Are
 
Git store
Git storeGit store
Git store
 
Quantifying your-fitness
Quantifying your-fitnessQuantifying your-fitness
Quantifying your-fitness
 
Sean coates fifty things and tricks, confoo 2011
Sean coates fifty things and tricks, confoo 2011Sean coates fifty things and tricks, confoo 2011
Sean coates fifty things and tricks, confoo 2011
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
 
Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2
 
This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?
This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?
This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?
 
Living on the Edge (Service): Bundling Microservices to Optimize Consumption ...
Living on the Edge (Service): Bundling Microservices to Optimize Consumption ...Living on the Edge (Service): Bundling Microservices to Optimize Consumption ...
Living on the Edge (Service): Bundling Microservices to Optimize Consumption ...
 
Conquest for dummies: how to setup a pacs server
Conquest for dummies: how to setup a pacs serverConquest for dummies: how to setup a pacs server
Conquest for dummies: how to setup a pacs server
 

Similar a Polyglot copy

Panther loves Symfony apps
Panther loves Symfony appsPanther loves Symfony apps
Panther loves Symfony appsSimone D'Amico
 
Salesforce integration options
Salesforce integration optionsSalesforce integration options
Salesforce integration optionsTechforce Services
 
Develop Windows 8 & Windows Phone apps using crucial Google APIs
Develop Windows 8 & Windows Phone apps using crucial Google APIsDevelop Windows 8 & Windows Phone apps using crucial Google APIs
Develop Windows 8 & Windows Phone apps using crucial Google APIsIsham Mohamed Iqbal
 
Flutter Festival - GDSC IIIT Sonepat
Flutter Festival - GDSC IIIT Sonepat Flutter Festival - GDSC IIIT Sonepat
Flutter Festival - GDSC IIIT Sonepat GoogleDSCIIITSonepat
 
Pimp legacy PHP apps with Apigility - TrueNorthPHP 2014
Pimp legacy PHP apps with Apigility - TrueNorthPHP 2014Pimp legacy PHP apps with Apigility - TrueNorthPHP 2014
Pimp legacy PHP apps with Apigility - TrueNorthPHP 2014Michelangelo van Dam
 
Custom Component development Oracle's Intelligent Bot Platform
Custom Component development Oracle's Intelligent Bot PlatformCustom Component development Oracle's Intelligent Bot Platform
Custom Component development Oracle's Intelligent Bot PlatformLeon Smiers
 
Facebook F8 2016
Facebook F8 2016Facebook F8 2016
Facebook F8 2016Fate Chang
 
15-ways-to-optimize-spring-boot-for-the-cloud
15-ways-to-optimize-spring-boot-for-the-cloud15-ways-to-optimize-spring-boot-for-the-cloud
15-ways-to-optimize-spring-boot-for-the-cloudBilly Korando
 
Getting Started with Scripts #HeroConf London 2015
Getting Started with Scripts #HeroConf London 2015Getting Started with Scripts #HeroConf London 2015
Getting Started with Scripts #HeroConf London 2015Amy Bishop
 
Unleash your Symfony projects with eZ Platform
Unleash your Symfony projects with eZ PlatformUnleash your Symfony projects with eZ Platform
Unleash your Symfony projects with eZ PlatformSébastien Morel
 
Five Things You SHOULD Know About Postman
Five Things You SHOULD Know About PostmanFive Things You SHOULD Know About Postman
Five Things You SHOULD Know About PostmanPostman
 
Robot Framework : Lord of the Rings By Asheesh M
Robot Framework : Lord of the Rings By Asheesh MRobot Framework : Lord of the Rings By Asheesh M
Robot Framework : Lord of the Rings By Asheesh MAgile Testing Alliance
 
Build and Deploy a Python Web App to Amazon in 30 Mins
Build and Deploy a Python Web App to Amazon in 30 MinsBuild and Deploy a Python Web App to Amazon in 30 Mins
Build and Deploy a Python Web App to Amazon in 30 MinsJeff Hull
 
Accelerate Quality with Postman Advance
Accelerate Quality with Postman AdvanceAccelerate Quality with Postman Advance
Accelerate Quality with Postman AdvanceKnoldus Inc.
 
4 Ways to Speed Up Your Mobile App Dev Daily Grind
4 Ways to Speed Up Your Mobile App Dev Daily Grind4 Ways to Speed Up Your Mobile App Dev Daily Grind
4 Ways to Speed Up Your Mobile App Dev Daily GrindPerfecto by Perforce
 
15 ways-to-optimize-spring-boot-for-the-cloud
15 ways-to-optimize-spring-boot-for-the-cloud15 ways-to-optimize-spring-boot-for-the-cloud
15 ways-to-optimize-spring-boot-for-the-cloudPolyglotMeetups
 
Cross platform mobile apps using rhomobile and jquery mobile
Cross platform mobile apps using rhomobile and jquery mobileCross platform mobile apps using rhomobile and jquery mobile
Cross platform mobile apps using rhomobile and jquery mobileSPRITLE SOFTWARE PRIVATE LIMIT ED
 

Similar a Polyglot copy (20)

Panther loves Symfony apps
Panther loves Symfony appsPanther loves Symfony apps
Panther loves Symfony apps
 
Salesforce integration options
Salesforce integration optionsSalesforce integration options
Salesforce integration options
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Develop Windows 8 & Windows Phone apps using crucial Google APIs
Develop Windows 8 & Windows Phone apps using crucial Google APIsDevelop Windows 8 & Windows Phone apps using crucial Google APIs
Develop Windows 8 & Windows Phone apps using crucial Google APIs
 
Flutter Festival - GDSC IIIT Sonepat
Flutter Festival - GDSC IIIT Sonepat Flutter Festival - GDSC IIIT Sonepat
Flutter Festival - GDSC IIIT Sonepat
 
Introduction to python scrapping
Introduction to python scrappingIntroduction to python scrapping
Introduction to python scrapping
 
Pimp legacy PHP apps with Apigility - TrueNorthPHP 2014
Pimp legacy PHP apps with Apigility - TrueNorthPHP 2014Pimp legacy PHP apps with Apigility - TrueNorthPHP 2014
Pimp legacy PHP apps with Apigility - TrueNorthPHP 2014
 
Designing & Building Secure Web APIs
Designing & Building Secure Web APIsDesigning & Building Secure Web APIs
Designing & Building Secure Web APIs
 
Custom Component development Oracle's Intelligent Bot Platform
Custom Component development Oracle's Intelligent Bot PlatformCustom Component development Oracle's Intelligent Bot Platform
Custom Component development Oracle's Intelligent Bot Platform
 
Facebook F8 2016
Facebook F8 2016Facebook F8 2016
Facebook F8 2016
 
15-ways-to-optimize-spring-boot-for-the-cloud
15-ways-to-optimize-spring-boot-for-the-cloud15-ways-to-optimize-spring-boot-for-the-cloud
15-ways-to-optimize-spring-boot-for-the-cloud
 
Getting Started with Scripts #HeroConf London 2015
Getting Started with Scripts #HeroConf London 2015Getting Started with Scripts #HeroConf London 2015
Getting Started with Scripts #HeroConf London 2015
 
Unleash your Symfony projects with eZ Platform
Unleash your Symfony projects with eZ PlatformUnleash your Symfony projects with eZ Platform
Unleash your Symfony projects with eZ Platform
 
Five Things You SHOULD Know About Postman
Five Things You SHOULD Know About PostmanFive Things You SHOULD Know About Postman
Five Things You SHOULD Know About Postman
 
Robot Framework : Lord of the Rings By Asheesh M
Robot Framework : Lord of the Rings By Asheesh MRobot Framework : Lord of the Rings By Asheesh M
Robot Framework : Lord of the Rings By Asheesh M
 
Build and Deploy a Python Web App to Amazon in 30 Mins
Build and Deploy a Python Web App to Amazon in 30 MinsBuild and Deploy a Python Web App to Amazon in 30 Mins
Build and Deploy a Python Web App to Amazon in 30 Mins
 
Accelerate Quality with Postman Advance
Accelerate Quality with Postman AdvanceAccelerate Quality with Postman Advance
Accelerate Quality with Postman Advance
 
4 Ways to Speed Up Your Mobile App Dev Daily Grind
4 Ways to Speed Up Your Mobile App Dev Daily Grind4 Ways to Speed Up Your Mobile App Dev Daily Grind
4 Ways to Speed Up Your Mobile App Dev Daily Grind
 
15 ways-to-optimize-spring-boot-for-the-cloud
15 ways-to-optimize-spring-boot-for-the-cloud15 ways-to-optimize-spring-boot-for-the-cloud
15 ways-to-optimize-spring-boot-for-the-cloud
 
Cross platform mobile apps using rhomobile and jquery mobile
Cross platform mobile apps using rhomobile and jquery mobileCross platform mobile apps using rhomobile and jquery mobile
Cross platform mobile apps using rhomobile and jquery mobile
 

Más de Kirsten Hunter

Designing irresistible apis
Designing irresistible apisDesigning irresistible apis
Designing irresistible apisKirsten Hunter
 
Designing irresistible apis
Designing irresistible apisDesigning irresistible apis
Designing irresistible apisKirsten Hunter
 
Designing irresistible APIs
Designing irresistible APIsDesigning irresistible APIs
Designing irresistible APIsKirsten Hunter
 
API 101 - Understanding APIs.
API 101 - Understanding APIs.API 101 - Understanding APIs.
API 101 - Understanding APIs.Kirsten Hunter
 
Demystifying REST - SFRails meetup
Demystifying REST - SFRails meetupDemystifying REST - SFRails meetup
Demystifying REST - SFRails meetupKirsten Hunter
 
PHP Architect Virtual Cloud summit
PHP Architect Virtual Cloud summitPHP Architect Virtual Cloud summit
PHP Architect Virtual Cloud summitKirsten Hunter
 
Social Marketing with LinkedIn
Social Marketing with LinkedInSocial Marketing with LinkedIn
Social Marketing with LinkedInKirsten Hunter
 
Creating Professional Applications with the LinkedIn API
Creating Professional Applications with the LinkedIn APICreating Professional Applications with the LinkedIn API
Creating Professional Applications with the LinkedIn APIKirsten Hunter
 

Más de Kirsten Hunter (13)

Designing irresistible apis
Designing irresistible apisDesigning irresistible apis
Designing irresistible apis
 
Designing irresistible apis
Designing irresistible apisDesigning irresistible apis
Designing irresistible apis
 
Api 101
Api 101Api 101
Api 101
 
Designing irresistible APIs
Designing irresistible APIsDesigning irresistible APIs
Designing irresistible APIs
 
API 101 - Understanding APIs.
API 101 - Understanding APIs.API 101 - Understanding APIs.
API 101 - Understanding APIs.
 
Demystifying REST - SFRails meetup
Demystifying REST - SFRails meetupDemystifying REST - SFRails meetup
Demystifying REST - SFRails meetup
 
Rest schema design
Rest schema designRest schema design
Rest schema design
 
Successful developers
Successful developersSuccessful developers
Successful developers
 
Demystifying REST
Demystifying RESTDemystifying REST
Demystifying REST
 
PHP Architect Virtual Cloud summit
PHP Architect Virtual Cloud summitPHP Architect Virtual Cloud summit
PHP Architect Virtual Cloud summit
 
Social Marketing with LinkedIn
Social Marketing with LinkedInSocial Marketing with LinkedIn
Social Marketing with LinkedIn
 
LinkedIn Everywhere
LinkedIn EverywhereLinkedIn Everywhere
LinkedIn Everywhere
 
Creating Professional Applications with the LinkedIn API
Creating Professional Applications with the LinkedIn APICreating Professional Applications with the LinkedIn API
Creating Professional Applications with the LinkedIn API
 

Último

How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...OnePlan Solutions
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Steffen Staab
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerThousandEyes
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AIABDERRAOUF MEHENNI
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfCionsystems
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendArshad QA
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 

Último (20)

How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdf
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and Backend
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 

Polyglot copy