SlideShare uma empresa Scribd logo
1 de 98
Baixar para ler offline
Node.js
Workshops
npm init
it creates basic package.json file
name: heroes
name: heroes
version: 1.0.0
name: heroes
version: 1.0.0
description: heroes app
name: heroes
version: 1.0.0
description: heroes app
entry point: index.js
name: heroes
version: 1.0.0
description: heroes app
entry point: index.js
test command: [ENTER]
name: heroes
version: 1.0.0
description: heroes app
entry point: index.js
test command: [ENTER]
git repository: [ENTER]
name: heroes
version: 1.0.0
description: heroes app
entry point: index.js
test command: [ENTER]
git repository: [ENTER]
keywords: [ENTER]
name: heroes
version: 1.0.0
description: heroes app
entry point: index.js
test command: [ENTER]
git repository: [ENTER]
keywords: [ENTER]
license: [ENTER]
Is it ok?: [ENTER]
Let's install our first module!
npm install express --save
{
"name": "node-workshop",
"version": "1.0.0",
"description": "heroes app",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "ssuperczynski <ss@espeo.eu> (espeo.eu)",
"license": "ISC",
"dependencies": {
"express": "^4.13.4"
}
}
Our module has been successfully installed
In package.json we pointed index.js
This is our inital script
So! Let's create it
touch index.js
So! Let's create it
touch index.js
Open index.js
var express = require('express');
var app = express();
Open index.js
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('viewing single offer');
});
Open index.js
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('viewing single offer');
});
app.listen(3003);
Open browser and go to:
localhost:3003
Open browser and go to:
localhost:3003
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('viewing single offer');
});
app.listen(3004, function () {
console.log("server started at 3004 port");
});
But we don't know if
server works or not
Much better
but hey, I like colors
 npm install terminal-colors --save
but hey, I like colors
Oh yea!
Let's refactor index.js
var express = require('express');
var app = express();
app.get('/', getOffer);
function getOffer(req, res) {
res.send('viewing single offer');
}
app.listen(3004, function () {
console.log("server started at 3004 port");
});
index.js
Let's refactor index.js further 
function getOffer(req, res) {
res.send('viewing single offer');
}
module.exports = getOffer;
controller/OfferController.js
Let's refactor index.js further 
var express = require('express');
var app = express();
var getOffer = require('./controllers/OfferController');
app.get('/', getOffer);
app.listen(3004);
index.js
Nice!
Looks like we have basic node.js structure
Nice!
Looks like we have basic node.js structure
Let's interact with
some database
npm install pg pg-hstore --save
But wait, let's not install
Postgres locally
Let's use Docker!
Let's use Docker!
docker-machine start default
eval $(docker-machine env default)
docker-machine start default
eval $(docker-machine env default)
vi docker-compose.yml
docker-machine start default
eval $(docker-machine env default)
version: '2'
services:
postgres:
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: mypassword
vi docker-compose.yml
docker-machine start default
eval $(docker-machine env default)
version: '2'
services:
postgres:
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: mypassword
vi docker-compose.yml
docker-compose build
docker-compose up
You know what?
We have postgres!!
For postgress we
need some config
So, let's use 
sequelize-cli to
configure it
Creating our model using
npm install sequelize --save
npm install sequelize-cli --save
node_modules/sequelize-cli/bin/sequelize init
Creating basic schema
node_modules/sequelize-cli/bin/sequelize model:create
--name Offer
--attributes "content:string, title:string"
Update database
node_modules/sequelize-cli/bin/sequelize db:migrate
Let's add more methods to
OfferController.js 
function getOffer(req, res) {
models.Offer.findAll()
.then((offers) => { res.send(offers); })
.catch(() => {res.send('Error')});
}
module.exports = getOffer;
controller/OfferController.js
But what does
models.Offer.findAll()
mean?
But what does
models.Offer.findAll()
var sequelize = new Sequelize('postgres://user:pass@example.com:5
var Offer = sequelize.define('Offer', {
title: {type: sequelize.STRING, allowNull: false},
content: {type: sequelize.STRING, allowNull: false}
}, {});
export default Offer;
models/offer.js
mean?
But what does
models.Offer.findAll()
mean?
function createOffer(req, res) {
models.Offer.create({
content: req.body.content,
title: req.body.title
})
.then((offer) => { res.send(offer); })
.catch(() => {res.send('Error')});
}
module.exports = getOffer;
controller/OfferController.js
Add new method to index.js 
var express = require('express');
var app = express();
var indexAction = require('./controllers/OfferController');
app.get('/', getOffer);
app.post('/', createOffer);
app.listen(3004);
index.js
Add new method to index.js 
function createOffer(req, res) {
Offer.create({
content: req.body.content,
title: req.body.title
})
.then((offer) => { res.send(offer); })
.catch((err) => {res.send(err)});
}
controller/OfferController.js
And send something using
Postman
We should get
Alright.
But come back to index.js
What does 
 
require('babel-core/register');
mean?
It means
we can use ES6
instead of ES5
import express from 'express';
import OffersController from './OffersController';
import UsersController from './UsersController';
let router = express.Router();
router.use('/offers', OffersController);
router.use('/users', UsersController);
module.exports = router;
index.js
import express from 'express';
var express = require('express');
export default router;
module.exports = router;
Offer.create({
content: req.body.content,
title: req.body.title
})
.then(offer => res.send(offer))
.catch(err => res.send(err));
Offer.create({
content: req.body.content,
title: req.body.title
})
.then(function(offer) { res.send(offer); })
.catch(function(err) { res.send(err)});
.then((user) => {
return user.get({token: token});
}
.then(user => user.get({token}))
Let's create some
authentication
npm install passport passport-http-bearer
passport-local bcrypt-nodejs --save
Create User model
node_modules/sequelize-cli/bin/sequelize model:create
--name User
--attributes "email:string, password:string, token:string"
Create Middleware
mkdir middleware
cd middleware
touch passport.js
Register passport strategy
 
import passport from 'passport';
import local from 'passport-local';
passport.use('local', new local.Strategy(options, callback));
export default passport;
import bcrypt from 'bcrypt-nodejs';
import Promise from 'Bluebird';
instanceMethods: {
comparePassword: function (hash) {
var userPassword = this.password;
var user = this;
return new Promise((resolve, reject) => {
Promise.promisify(bcrypt.compare)(hash, userPassword)
.then((result) => {
resolve([result, user]);
}, (err) => {
reject(err);
});
});
}
},
Update User model
hooks: {
beforeCreate: (user, options, cb) => {
Promise.promisify(bcrypt.genSalt)(10)
.then((salt) => {
return Promise.promisify(bcrypt.hash)(user.password, salt,
})
.then((hash) => {
user.password = hash;
cb(null, options);
});
}
}
Update User model
/// ....
 
 
import { User } from '../models';
import Promise from 'bluebird';
var options = {
usernameField: 'email',
passwordField: 'password'
};
var onLogIn = (email, password, done) => {
User.findOne({where: {email}})
.then(user =>
user ?
user.comparePassword(password) : Promise.reject(new Promise.Cancellation
)
.spread((isMatch, user) =>
isMatch ?
done(null, user) : Promise.reject(new Promise.CancellationError('Wrong e
)
.catch(Promise.CancellationError, info => done(null, false, info))
.catch(err => done(err));
};
 
Add callback to strategy
 
//controllers/UsersController.js
import express from 'express';
import {User} from '../models';
import passport from 'passport';
let router = express.Router({mergeParams: true});
router.post('/signUp', signUp);
router.post('/logIn', logIn);
export default router;
Create login and register endpoints
function signUp(req, res) {
User.create({
email: req.body.email,
password: req.body.password
}).then(user => res.send({email: user.email }))
.catch(err => res.send(err));
}
function logIn(req, res, next) {
passport.authenticate('local', (err, user, info) => {
if (err) {
return res.send(err);
}
if (!user) {
return res.send(info.toString());
}
return res.send({user});
})(req, res, next);
}
Add child router to main router
// controllers/index.js
import UsersController from './UsersController';
router.use('/users', UsersController);
import passport from './middleware/passport';
app.use(passport.initialize());
Register passport as a middleware:
app.js
Bearer token
strategy
Add token helper
// helpers/token.js
import crypto from 'crypto';
import Promise from 'bluebird';
export default function generate() {
return new Promise((resolve, reject) => {
Promise.promisify(crypto.randomBytes)(48).then((buff) => {
resolve(buff.toString('hex'));
}).catch(err => reject(err));
});
}
Modify local-login strategy
User.findOne({where: {email}})
.then((user) => {
return user ? user.comparePassword(password) : Promise.reject(new Promise
}
)
.spread((isMatch, user) =>
isMatch ?
generateToken()
.then(token => user.update({token}))
.then(() => done(null, user.token))
: Promise.reject(new Promise.CancellationError('Wrong email or password')
)
.catch(Promise.CancellationError, info => done(null, false, info))
.catch(err => done(err));
Modify UsersController
function logIn(req, res, next) {
passport.authenticate('local', (err, token, info) => {
if (err) {
return res.send(err);
}
if (!token) {
return res.send(info.toString());
}
return res.send({token});
})(req, res, next);
}
 
 
// middleware/passport.js
import generateToken from '../helpers/token';
import token from 'passport-http-bearer';
passport.use('token', new token.Strategy((token, done) => {
User.findOne({where: {token}})
.then(user => user ? done(null, user, {scope: 'all'}) : done(n
.catch(err => done(err));
}));
export var tokenAuthentication = passport.authenticate('token', {session: f
Add token strategy
 
function singleOffer(req, res) {
Offer.findById(req.params.id)
.then(offer => res.send(offer))
.catch(err => res.send(err));
}
function RespondToOffer(req, res) {
OfferResponse.create({
OfferId: req.body.id,
email: req.body.email,
content: req.body.content
})
.then(response => res.send(response))
.catch(err => res.send(err));
}
router.get('/:id', singleOffer);
router.post('/respond', RespondToOffer);
Add new Offer endpoints
//controllers/OffersController.js
import {tokenAuthentication} from '../middleware/passport';
router.post('/respond', tokenAuthentication, RespondToOffer);
Restrict access to some route
// controllers/UsersController.js
function logOut(req, res) {
User.findOne({ where: {token: req.user.token}})
.then((user) => {
return user.update({token: null});
})
.then(() => {
res.send('Logged out.');
})
.catch(err => res.send(err));
}
router.delete('/logOut', tokenAuthentication, logOut);
Add log out endpoint
Testing
deps
npm install --save-dev
supertest expect.js mocha
package.json
"scripts": {
"start": "node bin/index.js",
"build": "gulp",
"test": "npm run test-integration",
"test-integration": "NODE_ENV=test mocha --compilers js:babel-c
},
test folder
mkdir integrationTest
cd integrationTest
touch offers.js
integrationTest/offers.js
 
var request = require('supertest');
var expect = require('expect.js');
var app = require('../bin/index');
var Bluebird = require('bluebird');
var models = require('../models');
describe('offerController', function () {
beforeEach(function () {
return Bluebird.all([
models.Offer.destroy({truncate: true}),
models.OfferResponse.destroy({truncate: true}),
models.User.destroy({truncate: true})
]);
});
it('should have /all endpoint and return with 200', function (don
request(app).get('/offers').expect(200, done);
});
});
it('should login and respond to the offer', function (done) {
var token = '';
var newUser = { email: 'julian@espeo.pl', password: 'test' };
models.User.create(newUser).then(() => {
request(app).post('/users/logIn')
.type('form')
.send(newUser)
.expect(200, (err, result) => {
token = result.body.token;
createSomeOffer();
});
});
function createSomeOffer() {
return request(app).post('/offers/')
.type('form')
.send({content: 'you have to code in XML', title: 'some programmer'})
.expect(200, respondToOffer);
}
...
function respondToOffer(err, result) {
if (err) done(err);
request(app).post('/offers/respond')
.set('Authorization', 'Bearer ' + token)
.type('form')
.send({id: result.body.id, email: 'julian@espeo.pl', content: 'i want thi
.expect(200, onResponseCreate);
}
function onResponseCreate() {
request(app).get('/offers').expect(200, function (err, result) {
if (err) done(err);
expect(result.body[0].OfferResponses[0].email).to.be('julian@espeo.pl');
expect(result.body[0].OfferResponses[0].content).to.be('i want this job')
done();
});
}
});
Frontend
git checkout newerstuff frontend gulpfile.js
Serving static files
import path from 'path';
app
.use(bodyParser.urlencoded({extended: true}))
.use(bodyParser.json())
.use(passport.initialize())
.use('/', router)
.use('/static', express.static('static'));
Serve index.html
// controllers/index.js
router.get('/', (req, res) => res.sendFile(path.join(__d
Add some logging stuff
npm install --save morgan
winston
Log requests
 
 
import morgan from 'morgan';
import fs from 'fs';
var accessLogStream = fs.createWriteStream(__dirname + '/acc
app
.use(morgan('dev', {stream: accessLogStream}))
.use(morgan('dev'))
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798

Mais conteúdo relacionado

Mais procurados

Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기JeongHun Byeon
 
Nodejs Explained with Examples
Nodejs Explained with ExamplesNodejs Explained with Examples
Nodejs Explained with ExamplesGabriele Lana
 
Node js presentation
Node js presentationNode js presentation
Node js presentationmartincabrera
 
node.js: Javascript's in your backend
node.js: Javascript's in your backendnode.js: Javascript's in your backend
node.js: Javascript's in your backendDavid Padbury
 
All aboard the NodeJS Express
All aboard the NodeJS ExpressAll aboard the NodeJS Express
All aboard the NodeJS ExpressDavid Boyer
 
"Swoole: double troubles in c", Alexandr Vronskiy
"Swoole: double troubles in c", Alexandr Vronskiy"Swoole: double troubles in c", Alexandr Vronskiy
"Swoole: double troubles in c", Alexandr VronskiyFwdays
 
Angular 1 + es6
Angular 1 + es6Angular 1 + es6
Angular 1 + es6장현 한
 
introduction to node.js
introduction to node.jsintroduction to node.js
introduction to node.jsorkaplan
 
Test-Driven Puppet Development - PuppetConf 2014
Test-Driven Puppet Development - PuppetConf 2014Test-Driven Puppet Development - PuppetConf 2014
Test-Driven Puppet Development - PuppetConf 2014Puppet
 
A million connections and beyond - Node.js at scale
A million connections and beyond - Node.js at scaleA million connections and beyond - Node.js at scale
A million connections and beyond - Node.js at scaleTom Croucher
 
Infrastructure as code - Python Saati #36
Infrastructure as code - Python Saati #36Infrastructure as code - Python Saati #36
Infrastructure as code - Python Saati #36Halil Kaya
 
Future Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETFuture Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETGianluca Carucci
 
Hopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to anotherHopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to anotherMichele Orselli
 
CUDA by Example : CUDA C on Multiple GPUs : Notes
CUDA by Example : CUDA C on Multiple GPUs : NotesCUDA by Example : CUDA C on Multiple GPUs : Notes
CUDA by Example : CUDA C on Multiple GPUs : NotesSubhajit Sahu
 
Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}.toster
 
The State of JavaScript (2015)
The State of JavaScript (2015)The State of JavaScript (2015)
The State of JavaScript (2015)Domenic Denicola
 
Node.js - async for the rest of us.
Node.js - async for the rest of us.Node.js - async for the rest of us.
Node.js - async for the rest of us.Mike Brevoort
 
Non-blocking I/O, Event loops and node.js
Non-blocking I/O, Event loops and node.jsNon-blocking I/O, Event loops and node.js
Non-blocking I/O, Event loops and node.jsMarcus Frödin
 

Mais procurados (20)

Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기
 
Nodejs Explained with Examples
Nodejs Explained with ExamplesNodejs Explained with Examples
Nodejs Explained with Examples
 
Node js presentation
Node js presentationNode js presentation
Node js presentation
 
Node.js - A Quick Tour
Node.js - A Quick TourNode.js - A Quick Tour
Node.js - A Quick Tour
 
node.js: Javascript's in your backend
node.js: Javascript's in your backendnode.js: Javascript's in your backend
node.js: Javascript's in your backend
 
All aboard the NodeJS Express
All aboard the NodeJS ExpressAll aboard the NodeJS Express
All aboard the NodeJS Express
 
Express node js
Express node jsExpress node js
Express node js
 
"Swoole: double troubles in c", Alexandr Vronskiy
"Swoole: double troubles in c", Alexandr Vronskiy"Swoole: double troubles in c", Alexandr Vronskiy
"Swoole: double troubles in c", Alexandr Vronskiy
 
Angular 1 + es6
Angular 1 + es6Angular 1 + es6
Angular 1 + es6
 
introduction to node.js
introduction to node.jsintroduction to node.js
introduction to node.js
 
Test-Driven Puppet Development - PuppetConf 2014
Test-Driven Puppet Development - PuppetConf 2014Test-Driven Puppet Development - PuppetConf 2014
Test-Driven Puppet Development - PuppetConf 2014
 
A million connections and beyond - Node.js at scale
A million connections and beyond - Node.js at scaleA million connections and beyond - Node.js at scale
A million connections and beyond - Node.js at scale
 
Infrastructure as code - Python Saati #36
Infrastructure as code - Python Saati #36Infrastructure as code - Python Saati #36
Infrastructure as code - Python Saati #36
 
Future Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETFuture Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NET
 
Hopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to anotherHopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to another
 
CUDA by Example : CUDA C on Multiple GPUs : Notes
CUDA by Example : CUDA C on Multiple GPUs : NotesCUDA by Example : CUDA C on Multiple GPUs : Notes
CUDA by Example : CUDA C on Multiple GPUs : Notes
 
Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}
 
The State of JavaScript (2015)
The State of JavaScript (2015)The State of JavaScript (2015)
The State of JavaScript (2015)
 
Node.js - async for the rest of us.
Node.js - async for the rest of us.Node.js - async for the rest of us.
Node.js - async for the rest of us.
 
Non-blocking I/O, Event loops and node.js
Non-blocking I/O, Event loops and node.jsNon-blocking I/O, Event loops and node.js
Non-blocking I/O, Event loops and node.js
 

Semelhante a Guide to Node.js: Basic to Advanced

Everything as a Code / Александр Тарасов (Одноклассники)
Everything as a Code / Александр Тарасов (Одноклассники)Everything as a Code / Александр Тарасов (Одноклассники)
Everything as a Code / Александр Тарасов (Одноклассники)Ontico
 
Automating Front-End Workflow
Automating Front-End WorkflowAutomating Front-End Workflow
Automating Front-End WorkflowDimitris Tsironis
 
Get Grulping with JavaScript Task Runners (Matt Gifford)
Get Grulping with JavaScript Task Runners (Matt Gifford)Get Grulping with JavaScript Task Runners (Matt Gifford)
Get Grulping with JavaScript Task Runners (Matt Gifford)Future Insights
 
Infrastructure = code - 1 year later
Infrastructure = code - 1 year laterInfrastructure = code - 1 year later
Infrastructure = code - 1 year laterChristian Ortner
 
Parse cloud code
Parse cloud codeParse cloud code
Parse cloud code維佋 唐
 
DevOps Workflow: A Tutorial on Linux Containers
DevOps Workflow: A Tutorial on Linux ContainersDevOps Workflow: A Tutorial on Linux Containers
DevOps Workflow: A Tutorial on Linux Containersinside-BigData.com
 
How to Write Node.js Module
How to Write Node.js ModuleHow to Write Node.js Module
How to Write Node.js ModuleFred Chien
 
Continous Delivery to Kubernetes using Helm
Continous Delivery to Kubernetes using HelmContinous Delivery to Kubernetes using Helm
Continous Delivery to Kubernetes using HelmBitnami
 
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleStein Inge Morisbak
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slidesharetomcopeland
 
Heroku pop-behind-the-sense
Heroku pop-behind-the-senseHeroku pop-behind-the-sense
Heroku pop-behind-the-senseBen Lin
 
Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013Cosimo Streppone
 
20160905 - BrisJS - nightwatch testing
20160905 - BrisJS - nightwatch testing20160905 - BrisJS - nightwatch testing
20160905 - BrisJS - nightwatch testingVladimir Roudakov
 
Bare Metal to OpenStack with Razor and Chef
Bare Metal to OpenStack with Razor and ChefBare Metal to OpenStack with Razor and Chef
Bare Metal to OpenStack with Razor and ChefMatt Ray
 
Jeroen Vloothuis Bend Kss To Your Will
Jeroen Vloothuis   Bend Kss To Your WillJeroen Vloothuis   Bend Kss To Your Will
Jeroen Vloothuis Bend Kss To Your WillVincenzo Barone
 
Practical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppPractical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppSmartLogic
 
How to create your own hack environment
How to create your own hack environmentHow to create your own hack environment
How to create your own hack environmentSumedt Jitpukdebodin
 
Crafting Beautiful CLI Applications in Ruby
Crafting Beautiful CLI Applications in RubyCrafting Beautiful CLI Applications in Ruby
Crafting Beautiful CLI Applications in RubyNikhil Mungel
 
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOpsОмские ИТ-субботники
 

Semelhante a Guide to Node.js: Basic to Advanced (20)

Everything as a Code / Александр Тарасов (Одноклассники)
Everything as a Code / Александр Тарасов (Одноклассники)Everything as a Code / Александр Тарасов (Одноклассники)
Everything as a Code / Александр Тарасов (Одноклассники)
 
Everything as a code
Everything as a codeEverything as a code
Everything as a code
 
Automating Front-End Workflow
Automating Front-End WorkflowAutomating Front-End Workflow
Automating Front-End Workflow
 
Get Grulping with JavaScript Task Runners (Matt Gifford)
Get Grulping with JavaScript Task Runners (Matt Gifford)Get Grulping with JavaScript Task Runners (Matt Gifford)
Get Grulping with JavaScript Task Runners (Matt Gifford)
 
Infrastructure = code - 1 year later
Infrastructure = code - 1 year laterInfrastructure = code - 1 year later
Infrastructure = code - 1 year later
 
Parse cloud code
Parse cloud codeParse cloud code
Parse cloud code
 
DevOps Workflow: A Tutorial on Linux Containers
DevOps Workflow: A Tutorial on Linux ContainersDevOps Workflow: A Tutorial on Linux Containers
DevOps Workflow: A Tutorial on Linux Containers
 
How to Write Node.js Module
How to Write Node.js ModuleHow to Write Node.js Module
How to Write Node.js Module
 
Continous Delivery to Kubernetes using Helm
Continous Delivery to Kubernetes using HelmContinous Delivery to Kubernetes using Helm
Continous Delivery to Kubernetes using Helm
 
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with Ansible
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshare
 
Heroku pop-behind-the-sense
Heroku pop-behind-the-senseHeroku pop-behind-the-sense
Heroku pop-behind-the-sense
 
Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013
 
20160905 - BrisJS - nightwatch testing
20160905 - BrisJS - nightwatch testing20160905 - BrisJS - nightwatch testing
20160905 - BrisJS - nightwatch testing
 
Bare Metal to OpenStack with Razor and Chef
Bare Metal to OpenStack with Razor and ChefBare Metal to OpenStack with Razor and Chef
Bare Metal to OpenStack with Razor and Chef
 
Jeroen Vloothuis Bend Kss To Your Will
Jeroen Vloothuis   Bend Kss To Your WillJeroen Vloothuis   Bend Kss To Your Will
Jeroen Vloothuis Bend Kss To Your Will
 
Practical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppPractical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails App
 
How to create your own hack environment
How to create your own hack environmentHow to create your own hack environment
How to create your own hack environment
 
Crafting Beautiful CLI Applications in Ruby
Crafting Beautiful CLI Applications in RubyCrafting Beautiful CLI Applications in Ruby
Crafting Beautiful CLI Applications in Ruby
 
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
 

Mais de Espeo Software

Distributed, immutable, secure...
Distributed, immutable, secure...Distributed, immutable, secure...
Distributed, immutable, secure...Espeo Software
 
Initial Coin Offerings – legal requirements and types of tokens
Initial Coin Offerings – legal requirements and types of tokensInitial Coin Offerings – legal requirements and types of tokens
Initial Coin Offerings – legal requirements and types of tokensEspeo Software
 
Trustless off chain computing on the blockchain
Trustless off chain computing on the blockchainTrustless off chain computing on the blockchain
Trustless off chain computing on the blockchainEspeo Software
 
How to sell your business idea to your customers & investors
How to sell your business idea to your customers & investorsHow to sell your business idea to your customers & investors
How to sell your business idea to your customers & investorsEspeo Software
 
How to build a coin and start an ICO
How to build a coin and start an ICOHow to build a coin and start an ICO
How to build a coin and start an ICOEspeo Software
 
How to scale your tech startup for the win
How to scale your tech startup for the winHow to scale your tech startup for the win
How to scale your tech startup for the winEspeo Software
 
Before You Start Outsourcing Software Development [Checklist]
Before You Start Outsourcing Software Development [Checklist]Before You Start Outsourcing Software Development [Checklist]
Before You Start Outsourcing Software Development [Checklist]Espeo Software
 
What Should a Good Code Review Check?
What Should a Good Code Review Check?What Should a Good Code Review Check?
What Should a Good Code Review Check?Espeo Software
 
Espeo's looking for a DevOps Engineer!
Espeo's looking for a DevOps Engineer!Espeo's looking for a DevOps Engineer!
Espeo's looking for a DevOps Engineer!Espeo Software
 
Software Team Efficiency: Velocity
Software Team Efficiency: VelocitySoftware Team Efficiency: Velocity
Software Team Efficiency: VelocityEspeo Software
 
Introduction to Scrum: A How-To Guide
Introduction to Scrum: A How-To GuideIntroduction to Scrum: A How-To Guide
Introduction to Scrum: A How-To GuideEspeo Software
 
To Hire or Not to Hire: In-house vs. Offshore Development
To Hire or Not to Hire: In-house vs. Offshore DevelopmentTo Hire or Not to Hire: In-house vs. Offshore Development
To Hire or Not to Hire: In-house vs. Offshore DevelopmentEspeo Software
 
Web Application Performance for Business Success
Web Application Performance for Business SuccessWeb Application Performance for Business Success
Web Application Performance for Business SuccessEspeo Software
 
Big Data Ecosystem - 1000 Simulated Drones
Big Data Ecosystem - 1000 Simulated DronesBig Data Ecosystem - 1000 Simulated Drones
Big Data Ecosystem - 1000 Simulated DronesEspeo Software
 
Docker: From Zero to Hero
Docker: From Zero to HeroDocker: From Zero to Hero
Docker: From Zero to HeroEspeo Software
 
Azure Machine Learning
Azure Machine LearningAzure Machine Learning
Azure Machine LearningEspeo Software
 
Report: Wearables in Healthcare
Report: Wearables in HealthcareReport: Wearables in Healthcare
Report: Wearables in HealthcareEspeo Software
 
Industrial Internet Solutions for Manufacturing & Logistics
Industrial Internet Solutions for Manufacturing & LogisticsIndustrial Internet Solutions for Manufacturing & Logistics
Industrial Internet Solutions for Manufacturing & LogisticsEspeo Software
 
Big Data - Why is it important for business?
Big Data - Why is it important for business?Big Data - Why is it important for business?
Big Data - Why is it important for business?Espeo Software
 
A Future for Digital Health Wearables
A Future for Digital Health WearablesA Future for Digital Health Wearables
A Future for Digital Health WearablesEspeo Software
 

Mais de Espeo Software (20)

Distributed, immutable, secure...
Distributed, immutable, secure...Distributed, immutable, secure...
Distributed, immutable, secure...
 
Initial Coin Offerings – legal requirements and types of tokens
Initial Coin Offerings – legal requirements and types of tokensInitial Coin Offerings – legal requirements and types of tokens
Initial Coin Offerings – legal requirements and types of tokens
 
Trustless off chain computing on the blockchain
Trustless off chain computing on the blockchainTrustless off chain computing on the blockchain
Trustless off chain computing on the blockchain
 
How to sell your business idea to your customers & investors
How to sell your business idea to your customers & investorsHow to sell your business idea to your customers & investors
How to sell your business idea to your customers & investors
 
How to build a coin and start an ICO
How to build a coin and start an ICOHow to build a coin and start an ICO
How to build a coin and start an ICO
 
How to scale your tech startup for the win
How to scale your tech startup for the winHow to scale your tech startup for the win
How to scale your tech startup for the win
 
Before You Start Outsourcing Software Development [Checklist]
Before You Start Outsourcing Software Development [Checklist]Before You Start Outsourcing Software Development [Checklist]
Before You Start Outsourcing Software Development [Checklist]
 
What Should a Good Code Review Check?
What Should a Good Code Review Check?What Should a Good Code Review Check?
What Should a Good Code Review Check?
 
Espeo's looking for a DevOps Engineer!
Espeo's looking for a DevOps Engineer!Espeo's looking for a DevOps Engineer!
Espeo's looking for a DevOps Engineer!
 
Software Team Efficiency: Velocity
Software Team Efficiency: VelocitySoftware Team Efficiency: Velocity
Software Team Efficiency: Velocity
 
Introduction to Scrum: A How-To Guide
Introduction to Scrum: A How-To GuideIntroduction to Scrum: A How-To Guide
Introduction to Scrum: A How-To Guide
 
To Hire or Not to Hire: In-house vs. Offshore Development
To Hire or Not to Hire: In-house vs. Offshore DevelopmentTo Hire or Not to Hire: In-house vs. Offshore Development
To Hire or Not to Hire: In-house vs. Offshore Development
 
Web Application Performance for Business Success
Web Application Performance for Business SuccessWeb Application Performance for Business Success
Web Application Performance for Business Success
 
Big Data Ecosystem - 1000 Simulated Drones
Big Data Ecosystem - 1000 Simulated DronesBig Data Ecosystem - 1000 Simulated Drones
Big Data Ecosystem - 1000 Simulated Drones
 
Docker: From Zero to Hero
Docker: From Zero to HeroDocker: From Zero to Hero
Docker: From Zero to Hero
 
Azure Machine Learning
Azure Machine LearningAzure Machine Learning
Azure Machine Learning
 
Report: Wearables in Healthcare
Report: Wearables in HealthcareReport: Wearables in Healthcare
Report: Wearables in Healthcare
 
Industrial Internet Solutions for Manufacturing & Logistics
Industrial Internet Solutions for Manufacturing & LogisticsIndustrial Internet Solutions for Manufacturing & Logistics
Industrial Internet Solutions for Manufacturing & Logistics
 
Big Data - Why is it important for business?
Big Data - Why is it important for business?Big Data - Why is it important for business?
Big Data - Why is it important for business?
 
A Future for Digital Health Wearables
A Future for Digital Health WearablesA Future for Digital Health Wearables
A Future for Digital Health Wearables
 

Último

The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
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
 
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
 
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
 
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
 
Clustering techniques data mining book ....
Clustering techniques data mining book ....Clustering techniques data mining book ....
Clustering techniques data mining book ....ShaimaaMohamedGalal
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
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
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
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
 
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
 
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
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 

Último (20)

Exploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the ProcessExploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the Process
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
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
 
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-...
 
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 ...
 
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 ☂️
 
Clustering techniques data mining book ....
Clustering techniques data mining book ....Clustering techniques data mining book ....
Clustering techniques data mining book ....
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
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
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
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
 
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
 
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
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 

Guide to Node.js: Basic to Advanced