2. http://serenity.su
Немного о себе:
• Работаю в интернете более 12 лет
• Сейчас директор по технологиям в Serenity
• Активно эксперементирую с HTML5/JavaScript
• simonenko.su
• github.com/meritt
среда, 29 августа 12 г.
3. http://serenity.su
NODE.JS ЭТО ПЛАТФОРМА ДЛЯ СОЗДАНИЯ
ЛЕГКО МАСШТАБИРУЕМЫХ СЕТЕВЫХ
ПРИЛОЖЕНИЙ
3
среда, 29 августа 12 г.
4. http://serenity.su
НАЧАТЬ ЛЕГКО
• Работает везде: Windows, OS X, Linux
• Устанавливается как обычное приложение
• Для начала работы не нужен сервер
• Для работы подойдет любой текстовый редактор
• Достаточно знать 1 язык для сервера и клиента
http://nodejs.org/#download
среда, 29 августа 12 г.
5. http://serenity.su
ЧТО ТАКОЕ NODE.JS?
• Построен на JavaScript движке браузера
Google Chrome V8
5
среда, 29 августа 12 г.
6. http://serenity.su
ЧТО ТАКОЕ NODE.JS?
• Построен на JavaScript движке браузера
Google Chrome V8
• Event-driven, non-blocking I/O, streams
5
среда, 29 августа 12 г.
7. http://serenity.su
ЧТО ТАКОЕ NODE.JS?
• Построен на JavaScript движке браузера
Google Chrome V8
• Event-driven, non-blocking I/O, streams
• Реализация самых важных протоколов
(HTTP, DNS, TLS/SSL)
5
среда, 29 августа 12 г.
8. http://serenity.su
ЧТО ТАКОЕ NODE.JS?
• Построен на JavaScript движке браузера
Google Chrome V8
• Event-driven, non-blocking I/O, streams
• Реализация самых важных протоколов
(HTTP, DNS, TLS/SSL)
• Node Package Manager (npm) — уже более
9000 модулей
5
среда, 29 августа 12 г.
9. http://serenity.su
ПРИМЕР “HELLO WORLD”
var http = require('http');
var server = http.createServer(function(request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World');
});
server.listen(3000);
console.log('Server running at http://127.0.0.1:3000');
среда, 29 августа 12 г.
10. http://serenity.su
РЕЗУЛЬТАТ
$ node server.js
Server running at http://127.0.0.1:3000
7
среда, 29 августа 12 г.
11. http://serenity.su
СРАВНИМ NODE.JS И PHP
• Для сравнения возьмем сайты digitalconf.ru и htmlacademy.ru
• Оба сайта расположены на одинаковом выделенном хостинге
• $ ab -c 10 -n 1000 http://digitalconf.ru/
• Для node.js используем: nginx, nodejs, express
• Для php используем: apache, php, zend framework
8
среда, 29 августа 12 г.
12. http://serenity.su
РЕЗУЛЬТАТЫ
ab -c 10 -n 1000
digitalconf.ru 203
htmlacademy.ru 25
0 55 110 165 220
Requests per second
9
среда, 29 августа 12 г.
21. http://serenity.su
ПРИМЕР РАБОТЫ МОДУЛЕЙ
// hello.js
exports.world = function(text) {
return 'Hello ' + text + '!';
};
// server.js
var http = require('http');
var hello = require('./hello');
var server = http.createServer(function(request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end(hello.world('ITMO'));
});
server.listen(3000);
console.log('Server running at http://127.0.0.1:3000');
среда, 29 августа 12 г.
22. http://serenity.su
РЕЗУЛЬТАТ
$ node server.js
Server running at http://127.0.0.1:3000
19
среда, 29 августа 12 г.
24. http://serenity.su
МОДУЛИ О КОТОРЫХ СТОИТ ЗНАТЬ
• express — sinatra inspired web development framework
• mustache — logic-less {{mustache}} templates with JavaScript
• socket.io — real-time apps made cross-browser & easy with a WebSocket-like API
• request — simplified HTTP request client
• async — higher-order functions and common patterns for asynchronous code
среда, 29 августа 12 г.
25. http://serenity.su
КАК УСТАНОВИТЬ?
$ npm install express
express@2.5.9 ./node_modules/express
!"" qs@0.4.2
!"" mime@1.2.4
!"" mkdirp@0.3.0
#"" connect@1.8.7 (formidable@1.0.9)
среда, 29 августа 12 г.
26. http://serenity.su
ПРИМЕР “HELLO WORLD” НА EXPRESS
var express = require('express');
var server = express.createServer();
server.get('/', function(request, response) {
response.send('Hello Express World');
});
server.listen(3000);
console.log('Server running at http://127.0.0.1:3000');
среда, 29 августа 12 г.
27. http://serenity.su
РЕЗУЛЬТАТ
$ node server.js
Server running at http://127.0.0.1:3000
24
среда, 29 августа 12 г.
29. http://serenity.su
ПРИМЕР РАБОТЫ С ПАРАМЕТРАМИ
var express = require('express');
var server = express.createServer();
server.get('/', function(request, response) {
response.redirect('/alexey');
});
server.get('/:name', function(request, response) {
response.send('Hello ' + request.params.name + '!');
});
server.listen(3000);
console.log('Server running at http://127.0.0.1:3000');
среда, 29 августа 12 г.
30. http://serenity.su
РЕЗУЛЬТАТ
$ node server.js
Server running at http://127.0.0.1:3000
27
среда, 29 августа 12 г.
32. http://serenity.su
СОХРАНЕНИЕ ОКРУЖЕНИЯ
var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};
for (animal in animals) {
setTimeout(function() {
console.log(animal + ': ' + animals[animal]);
}, 100);
}
среда, 29 августа 12 г.
33. http://serenity.su
СОХРАНЕНИЕ ОКРУЖЕНИЯ
var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};
for (animal in animals) {
setTimeout(function() {
$ node example.js
console.log(animal + ': ' + animals[animal]);
}, 100); turtles: 17
} turtles: 17
turtles: 17
turtles: 17
среда, 29 августа 12 г.
34. http://serenity.su
СОХРАНЕНИЕ ОКРУЖЕНИЯ
var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};
bad way
for (animal in animals) {
setTimeout(function() {
$ node example.js
console.log(animal + ': ' + animals[animal]);
}, 100); turtles: 17
} turtles: 17
turtles: 17
turtles: 17
среда, 29 августа 12 г.
35. http://serenity.su
СОХРАНЕНИЕ ОКРУЖЕНИЯ
var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};
for (animal in animals) {
(function(animal) {
setTimeout(function() {
console.log(animal + ': ' + animals[animal]);
}, 100);
})(animal);
}
среда, 29 августа 12 г.
36. http://serenity.su
СОХРАНЕНИЕ ОКРУЖЕНИЯ
var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};
for (animal in animals) {
(function(animal) {
setTimeout(function() { $ node example.js
cats: 10
console.log(animal + ': ' + animals[animal]);
}, 100); dogs: 1
})(animal); frogs: 6
} turtles: 17
среда, 29 августа 12 г.
37. http://serenity.su
СОХРАНЕНИЕ ОКРУЖЕНИЯ
var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};
good way
for (animal in animals) {
(function(animal) {
setTimeout(function() { $ node example.js
cats: 10
console.log(animal + ': ' + animals[animal]);
}, 100); dogs: 1
})(animal); frogs: 6
} turtles: 17
среда, 29 августа 12 г.
38. http://serenity.su
БЛОКИРОВКИ
var fs = require('fs');
function content() {
var results = [];
var files = [1, 2, 3, 4, 5];
for (var i=0; i<files.length; i++) {
var file = files[i] + '.txt';
fs.readFile(file, 'utf-8', function(error, data) {
results.push('data for ' + file + ' file');
});
}
return results;
}
var results = content();
console.log(results);
среда, 29 августа 12 г.
39. http://serenity.su
БЛОКИРОВКИ
var fs = require('fs');
function content() {
var results = [];
var files = [1, 2, 3, 4, 5];
for (var i=0; i<files.length; i++) {
var file = files[i] + '.txt';
fs.readFile(file, 'utf-8', function(error, data) {
results.push('data for ' + file + ' file'); $ node example.js
});
} []
return results;
}
var results = content();
console.log(results);
среда, 29 августа 12 г.
40. http://serenity.su
БЛОКИРОВКИ
var fs = require('fs');
function content() {
var results = [];
var files = [1, 2, 3, 4, 5];
bad way
for (var i=0; i<files.length; i++) {
var file = files[i] + '.txt';
fs.readFile(file, 'utf-8', function(error, data) {
results.push('data for ' + file + ' file'); $ node example.js
});
} []
return results;
}
var results = content();
console.log(results);
среда, 29 августа 12 г.
41. http://serenity.su
БЛОКИРОВКИ
var fs = require('fs');
function content(callback) {
var results = [];
var files = [1, 2, 3, 4, 5];
for (var i=0; i<files.length; i++) {
var file = files[i] + '.txt';
(function(file) {
fs.readFile(file, 'utf-8', function(error, data) {
results.push('data for ' + file + ' file');
if (results.length == files.length) callback(results);
});
})(file);
}
}
content(function(results) {
console.log(results);
});
среда, 29 августа 12 г.
42. http://serenity.su
БЛОКИРОВКИ
var fs = require('fs');
function content(callback) {
var results = [];
var files = [1, 2, 3, 4, 5];
for (var i=0; i<files.length; i++) {
var file = files[i] + '.txt';
(function(file) {
$ node example.js
fs.readFile(file, 'utf-8', function(error, data) { [ 'data for 2.txt',
results.push('data for ' + file + ' file');
'data for 4.txt',
if (results.length == files.length) callback(results);
});
'data for 1.txt',
})(file); 'data for 5.txt',
}
} 'data for 3.txt' ]
content(function(results) {
console.log(results);
});
среда, 29 августа 12 г.
43. http://serenity.su
БЛОКИРОВКИ
var fs = require('fs');
function content(callback) {
var results = [];
var files = [1, 2, 3, 4, 5];
for (var i=0; i<files.length; i++) {
good way
var file = files[i] + '.txt';
(function(file) {
$ node example.js
fs.readFile(file, 'utf-8', function(error, data) { [ 'data for 2.txt',
results.push('data for ' + file + ' file');
'data for 4.txt',
if (results.length == files.length) callback(results);
});
'data for 1.txt',
})(file); 'data for 5.txt',
}
} 'data for 3.txt' ]
content(function(results) {
console.log(results);
});
среда, 29 августа 12 г.
44. http://serenity.su
СПАГЕТТИ-КОД
var fs = require('fs');
var results = ['start'];
fs.readFile('alpha.txt', 'utf-8', function(error, data) {
results.push('data for alpha.txt');
fs.readFile('beta.txt', 'utf-8', function(error, data) {
results.push('data for beta.txt');
fs.readFile('gamma.txt', 'utf-8', function(error, data) {
results.push('data for gamma.txt');
console.log(results);
});
});
});
среда, 29 августа 12 г.
45. http://serenity.su
СПАГЕТТИ-КОД
var fs = require('fs');
var results = ['start'];
fs.readFile('alpha.txt', 'utf-8', function(error, data) {
results.push('data for alpha.txt');
$ node example.js
fs.readFile('beta.txt', 'utf-8', function(error, data) {
results.push('data for beta.txt');
[ 'start',
'data for alpha.txt',
fs.readFile('gamma.txt', 'utf-8', function(error, data) {
results.push('data for gamma.txt'); 'data for beta.txt',
'data for gamma.txt' ]
console.log(results);
});
});
});
среда, 29 августа 12 г.
46. http://serenity.su
СПАГЕТТИ-КОД
var fs = require('fs');
var results = ['start'];
fs.readFile('alpha.txt', 'utf-8', function(error, data) {
bad way
results.push('data for alpha.txt');
$ node example.js
fs.readFile('beta.txt', 'utf-8', function(error, data) {
results.push('data for beta.txt');
[ 'start',
'data for alpha.txt',
fs.readFile('gamma.txt', 'utf-8', function(error, data) {
results.push('data for gamma.txt'); 'data for beta.txt',
'data for gamma.txt' ]
console.log(results);
});
});
});
среда, 29 августа 12 г.
47. http://serenity.su
СПАГЕТТИ-КОД
var fs = require('fs');
function alpha(results, callback) {
fs.readFile('alpha.txt', 'utf-8', function(error, data) {
results.push('data for alpha.txt');
beta(results, callback);
});
}
function beta(results, callback) {
fs.readFile('beta.txt', 'utf-8', function(error, data) {
results.push('data for beta.txt');
gamma(results, callback);
});
}
function gamma(results, callback) {
fs.readFile('gamma.txt', 'utf-8', function(error, data) {
results.push('data for gamma.txt');
callback(results);
});
}
alpha(['start'], function(results) {
console.log(results);
});
среда, 29 августа 12 г.
48. http://serenity.su
СПАГЕТТИ-КОД
var fs = require('fs');
function alpha(results, callback) {
fs.readFile('alpha.txt', 'utf-8', function(error, data) {
results.push('data for alpha.txt');
beta(results, callback);
});
}
function beta(results, callback) {
fs.readFile('beta.txt', 'utf-8', function(error, data) {
$ node example.js
results.push('data for beta.txt');
gamma(results, callback);
[ 'start',
}
});
'data for alpha.txt',
function gamma(results, callback) { 'data for beta.txt',
fs.readFile('gamma.txt', 'utf-8', function(error, data) {
results.push('data for gamma.txt'); 'data for gamma.txt' ]
callback(results);
});
}
alpha(['start'], function(results) {
console.log(results);
});
среда, 29 августа 12 г.
49. http://serenity.su
СПАГЕТТИ-КОД
var fs = require('fs');
function alpha(results, callback) {
fs.readFile('alpha.txt', 'utf-8', function(error, data) {
results.push('data for alpha.txt');
beta(results, callback);
});
}
good way
function beta(results, callback) {
fs.readFile('beta.txt', 'utf-8', function(error, data) {
results.push('data for beta.txt');
gamma(results, callback);
});
$ node example.js
[ 'start',
'data for alpha.txt',
}
function gamma(results, callback) { 'data for beta.txt',
fs.readFile('gamma.txt', 'utf-8', function(error, data) {
results.push('data for gamma.txt'); 'data for gamma.txt' ]
callback(results);
});
}
alpha(['start'], function(results) {
console.log(results);
});
среда, 29 августа 12 г.
50. http://serenity.su
ОРГАНИЗУЕМ TWITTER
КОНФЕРЕНЦИЮ?
подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
51. http://serenity.su
ЗАДАЧИ
• Получать сообщения из twitter как только они написаны
• Отображать сообщения из twitter в браузере моментально
• Работать без перезагрузки
• Держать большие нагрузки
подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
52. http://serenity.su
ЧТО ИСПОЛЬЗОВАТЬ?
WebSockets (HTML5) Twitter Streaming API
с помощью socket.io с помощью http streaming
подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
53. http://serenity.su
СХЕМА РАБОТЫ
Node.JS Twitter
WebSockets Streaming API
подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
54. http://serenity.su
ПОЛУЧАЕМ СООБЩЕНИЯ ИЗ TWITTER
var https = require('https');
var message = '';
var options = {
host: 'stream.twitter.com',
path: '/1/statuses/filter.json?track=iphone'
};
https.get(options, function(response) {
response.setEncoding('utf8');
response.on('data', function(chunk) {
message += chunk;
newline = message.indexOf("r");
if (newline !== -1) {
tweet = message.slice(0, newline);
}
message = message.slice(newline + 1);
});
});
среда, 29 августа 12 г.
55. http://serenity.su
ОТПРАВЛЯЕМ СООБЩЕНИЯ ЧЕРЕЗ
WEBSOCKETS
...
...
https.get(options, function(response) {
var clients = []; ...
var io = require('socket.io').listen(8080); tweet = message.slice(0, newline);
io.sockets.on('connection', function(socket) { clients.forEach(function(client) {
clients.push(socket); client.send(tweet);
}); });
... ...
});
среда, 29 августа 12 г.
56. http://serenity.su
ДЕМО
подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
57. http://serenity.su
Спасибо!
Алексей Симоненко
директор по технологиям
http://simonenko.su
alexey@simonenko.su
среда, 29 августа 12 г.
58. КОНТАКТЫ
на http://serenity.su
СЛЕДИТЕ ЗА НАМИ
vk.com/serenity_su twitter.com/serenity_su facebook.com/serenity.su
среда, 29 августа 12 г.