SlideShare ist ein Scribd-Unternehmen logo
1 von 98
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

Node js presentation
Node js presentationNode js presentation
Node js presentation
martincabrera
 
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
Tom Croucher
 
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
Subhajit Sahu
 
Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}
.toster
 

Was ist angesagt? (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
 

Ähnlich wie Guide to Node.js: Basic to Advanced

Parse cloud code
Parse cloud codeParse cloud code
Parse cloud code
維佋 唐
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshare
tomcopeland
 

Ähnlich wie 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
 

Mehr von Espeo Software

Mehr von 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
 

Kürzlich hochgeladen

TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
mohitmore19
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
masabamasaba
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
shinachiaurasa2
 

Kürzlich hochgeladen (20)

Generic or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisions
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
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-...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
SHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationSHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions Presentation
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 

Guide to Node.js: Basic to Advanced