SlideShare a Scribd company logo
Дмитрий Миндра, Lohika

      WEB В РЕАЛЬНОМ ВРЕМЕНИ С
      WINDOWS AZURE И NODE.JS
http://www.slideshare.net/dmytromindra   @dmytromindra #msugodua
Вы замечательные !




                     @dmytromindra #msugodua
Для кого этот доклад?
Вам нравится
JavaScript

Вы хотите чего-то
нового!

Вам нравится Web



                    @dmytromindra #msugodua
Мустафин Дмитрий
RnD Team Lead

Microsoft
Technologies Lab
Member




                   @dmytromindra #msugodua
Нечто




        Великолепное ПО

                    @dmytromindra #msugodua
Посторонись, пресловутый PHP! Долой Java!
Старичок Perl, тебе так вообще давно пора на пенсию.
И как же вы уже достали, попсовые Ruby и Python!

(c) xakep




            http://www.xakep.ru/post/53583/   @dmytromindra #msugodua
Мы
Ждем
Перемен !




            @dmytromindra #msugodua
@dmytromindra #msugodua
&

Node.js



                 23 июня 2011
          @dmytromindra #msugodua
HELLO WORLD
var http = require('http');

http.createServer(function (req, res) {
     res.writeHead(200, {'Content-Type': 'text/plain'});
     res.end('Hello Worldn');
}).listen(1337, "127.0.0.1");

console.log('Server running at http://127.0.0.1:1337/');

                                         @dmytromindra #msugodua
ПОЧЕМУ NODE.JS?
Цель Node.JS -      Event Driven
обеспечение
                    Все асинхронно
простого способа
создания            Работает на Google V8
масштабируемых      Официально поддерживается
сетевых программ.   компанией Microsoft
                    Хорошо параллелится (при работе
                    с вводом/выводом)




                                     @dmytromindra #msugodua
АСИНХРОННОСТЬ
Пока выполняется
операция, которую
надо
ждать, Node.JS
занимается
полезным делом.




                    @dmytromindra #msugodua
СЛАБЫЕ СТОРОНЫ
У Node.JS есть      Плохо справляется с
слабые стороны, о   тяжелыми вычислительными
которых надо        задачами
помнить.
                    Использует только одно ядро
                    процессора (есть утилита
                    Cluster)



                                @dmytromindra #msugodua
Спагетти код
 var fs = require('fs')
   , path = require('path')
   , file1 = "file1.txt“
   , file2 = "file2.txt";

 // Check if file1 exists, write to file2,
 // then display new file2 contents.
 path.exists(file1, function (exists) {
    if (!exists) throw new Error("No file!");
    fs.readFile(file1, function (err, data) {
        if (err) throw err; fs.writeFile(file2, data, function (err) {
           if (err) throw err; fs.readFile(file2, function (err, data) {
               if (err) throw err; console.log(data.toString());
               ...
           });
        });
    });
 });

                                                                           @dmytromindra #msugodua
ХОРОШИЙ ИНСТРУМЕНТ
Для подходящей
задачи.

Важно уметь
отличить
подходящую
задачу от
неподходящей.


                 @dmytromindra #msugodua
Есть ли у нас план?
1.   Привет Node!
2.   Web Проект
3.   SPA
4.   Windows Azure
5.   Socket.IO




                      @dmytromindra #msugodua
Пора делать

ПЕРВЫЕ ШАГИ




              @dmytromindra #msugodua
Node Package Manager
           Управляет установкой
           модулей, например

           npm install azure

           npm install –g express




                     @dmytromindra #msugodua
Разработка первого

WEB ПРИЛОЖЕНИЯ




                     @dmytromindra #msugodua
Что в меню ?
JavaScript везде. И   Express    (сервер)
на сервере, и на      Jade       (сервер)
клиенте. Некоторые    Mustache   (сервер , клиент)
библиотеки            Sammy.js   (клиент)
используются          jQuery     (клиент)
одновременно и на
сервере и на
клиенте.



                                 @dmytromindra #msugodua
ПРОСТОЕ WEB ПРИЛОЖЕНИЕ
          Постараемся построить простое
          веб приложение при помощи
          Express, Jade и пары заготовок.




                         @dmytromindra #msugodua
SPA* – приложение-страница
             Приложение, состоящее из одной
             веб страницы и обилия скриптов.

             Асинхронно общается с сервером.
             Не перегружается.




             *http://en.wikipedia.org/wiki/Single_Page_Application




                                         @dmytromindra #msugodua
Интеграция с

WINDOWS AZURE




               @dmytromindra #msugodua
ПРИСТУПАЕМ К РАБОТЕ
Мы кратко расскажем как:
 создать новое Windows Azure Node.js приложение
  используя инструменты Windows PowerShell
 запустить Node приложение локально, используя
  Windows Azure compute emulator
 опубликовать ваше приложение а Windows Azure

Дополнительная информация:
https://www.windowsazure.com/en-us/develop/nodejs/tutorials/getting-started/
https://www.windowsazure.com/en-us/develop/nodejs/tutorials/web-app-with-storage/

                                                                 @dmytromindra #msugodua
ЕСЛИ КОРОТКО, ТО
Выполните команду
npm install azure

В файле «c:nodetasklistWebRole1Web.cloud.config» замените
тестовые данные на данные вашей учетной записи Azure.

Вы найдете много полезной информации в файле:
«C:nodetasklistWebRole1node_modulesazureREADME.md»

Создайте новую переменную в вашем JavaScript файле:
var azure = require('azure');

Все готово! Поехали !
                                                @dmytromindra #msugodua
СЕРВИС ТАБЛИЦ
Создаем сервис:
var tableService = azure.createTableService();

Назначаем имя таблице:
var myTableName = “MyTable”;

Создаем таблицу:
tableService.createTableIfNotExists(myTableName, OnCreatedFu
nc);

Где OnCreatedFunc является функцией, ��оторая выполнится после
создания таблицы (Callback)
function OnCreatedFunc(errorObject, createdBoolFlag) {…}
Больше информации по адресу:
http://www.windowsazure.com/en-us/develop/nodejs/how-to-guides/table-services/


                                                                            @dmytromindra #msugodua
ДОБАВЛЯЕМ ЗАПИСЬ В ТАБЛИЦУ
Таблица Azure является контейнером для любого объекта. “PK” является
комбинацией Partition и Row ключей.

Объявляем объект:
var myObj = {
  PartitionKey: “MyPartition“, RowKey: “myRowKey“,
  myProp1: “Dima+", myProp2: “Luba=“, myProp3: “Misha”};

Добавляем объект в таблицу:
tableService.insertEntity(
       myTableName, myObj, OnMyObjInserted);

Где функция OnMyObjInserted является callback-ом
function OnMyObjInserted(error, serverEntity) {…}

                                               @dmytromindra #msugodua
ОБНОВЛЯЕМ ЗАПИСЬ
Объявляем объект с обновленными данными:
var myObjUpd = { PartitionKey:
“MyPartition“, RowKey: “myRowKey", myProp1:
“Dima+", myProp2: “Luba=”, myProp3: “Misha and
Margo" };

Обновляем существующую сущность:
tableService.updateEntity(
myTableName, myObjUpd, OnMyObjUpdated);
Функция OnMyObjUpdated – это, как всегда, callback:
function OnMyObjUpdated(error, serverEntity) {…}

Подводный камень: вы должны заполнить все поля своего
объекта, либо воспользоваться объектом ServerEntity и изменить
только необходимые поля!
                                          @dmytromindra #msugodua
ЗАПРАШИВАЕМ ЗАПИСЬ
Одиночный объект:
tableService.queryEntity(myTableName, myPartition, myRowK
ey, OnEntityQueried);

callback:
function OnEntityQueried(error, serverEntity) {…}

Набор объектов:
var query = azure.TableQuery.select().from(myTableName)
               .where(“PartitionKey eq ?”, “MyPartition”);
tableService.queryEntities(query, OnEntitiesQueried);

сallback:
function OnEntitiesQueried(error, serverEntities) {…}

                                       @dmytromindra #msugodua
КАК НАСЧЕТ BLOB?
Все работает точно так же, как и в таблицах:
    var azure = require('azure');
    var blobService = azure.createBlobService();
    blobService.createContainerIfNotExists(…);
    blobService.createBlockBlobFromStream(…);
    blobService.listBlobs(…);
    blobService.getBlobToStream(…);
    blobService.deleteBlob(…);

Подробнее
http://www.windowsazure.com/en-us/develop/nodejs/how-to-guides/blob-storage/



                                                                @dmytromindra #msugodua
WEB в реальном времени
SOCKET.IO




               @dmytromindra #msugodua
WebSockets
                                     Постоянное подключение к
                                     серверу.
                                     Часть стандарта HTML5
                                     Предназначен для
                                     построения Real-Time
                                     приложений.



http://tools.ietf.org/html/rfc6455               @dmytromindra #msugodua
Что такое SOCKET.IO?
Больше, чем просто    Виды транспорта:
WebSockets.           WebSocket
Имеет                 Flash Socket
альтернативные виды
транспорта.
                      AJAX long-polling
                      AJAX multipart streaming
Поставляется с
клиентской            IFrame
библиотектой.         JSONP polling


                                   @dmytromindra #msugodua
Время действовать
Напишем              В нашем случае этим
приложение, работа   приложением будет обмен
ющее в реальном      мгновенными сообщениями.
времени.




                                @dmytromindra #msugodua
Подводим итоги

В ЗАКЛЮЧЕНИЕ




                 @dmytromindra #msugodua
Мои аргументы:
 1. JavaScript невероятно популярен. На рынке много
    программистов.

 2. JavaScript будет единым языком и на сервере и
    на клиенте. Никакого дублирования кода.

 3. Асинхронная событийная модель.




                                     @dmytromindra #msugodua
Внеклассное чтение
Как убедить босса?
http://nodeguide.com/convincing_the_boss.html


Выбор правильного стиля
http://stackoverflow.com/questions/5495984/coding-style-guide-for-node-js-apps



Что такое Node?
http://stackoverflow.com/questions/1884724/what-is-node-js



                                                             @dmytromindra #msugodua
Это стоит попробовать!

СПАСИБО !
Dmytro.Mindra@gmail.com

                          @dmytromindra #msugodua

More Related Content

Windows Azure and node js

  • 1. Дмитрий Миндра, Lohika WEB В РЕАЛЬНОМ ВРЕМЕНИ С WINDOWS AZURE И NODE.JS http://www.slideshare.net/dmytromindra @dmytromindra #msugodua
  • 2. Вы замечательные ! @dmytromindra #msugodua
  • 3. Для кого этот доклад? Вам нравится JavaScript Вы хотите чего-то нового! Вам нравится Web @dmytromindra #msugodua
  • 4. Мустафин Дмитрий RnD Team Lead Microsoft Technologies Lab Member @dmytromindra #msugodua
  • 5. Нечто Великолепное ПО @dmytromindra #msugodua
  • 6. Посторонись, пресловутый PHP! Долой Java! Старичок Perl, тебе так вообще да��но пора на пенсию. И как же вы уже достали, попсовые Ruby и Python! (c) xakep http://www.xakep.ru/post/53583/ @dmytromindra #msugodua
  • 7. Мы Ждем Перемен ! @dmytromindra #msugodua
  • 9. & Node.js 23 июня 2011 @dmytromindra #msugodua
  • 10. HELLO WORLD var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello Worldn'); }).listen(1337, "127.0.0.1"); console.log('Server running at http://127.0.0.1:1337/'); @dmytromindra #msugodua
  • 11. ПОЧЕМУ NODE.JS? Цель Node.JS - Event Driven обеспечение Все асинхронно простого способа создания Работает на Google V8 масштабируемых Официально поддерживается сетевых программ. компанией Microsoft Хорошо параллелится (при работе с вводом/выводом) @dmytromindra #msugodua
  • 12. АСИНХРОННОСТЬ Пока выполняется операция, которую надо ждать, Node.JS занимается полезным делом. @dmytromindra #msugodua
  • 13. СЛАБЫЕ СТОРОНЫ У Node.JS есть Плохо справляется с слабые стороны, о тяжелыми вычислительными которых надо задачами помнить. Использует только одно ядро процессора (есть утилита Cluster) @dmytromindra #msugodua
  • 14. Спагетти код var fs = require('fs') , path = require('path') , file1 = "file1.txt“ , file2 = "file2.txt"; // Check if file1 exists, write to file2, // then display new file2 contents. path.exists(file1, function (exists) { if (!exists) throw new Error("No file!"); fs.readFile(file1, function (err, data) { if (err) throw err; fs.writeFile(file2, data, function (err) { if (err) throw err; fs.readFile(file2, function (err, data) { if (err) throw err; console.log(data.toString()); ... }); }); }); }); @dmytromindra #msugodua
  • 15. ХОРОШИЙ ИНСТРУМЕНТ Для подходящей задачи. Важно уметь отличить подходящую задачу от неподходящей. @dmytromindra #msugodua
  • 16. Есть ли у нас план? 1. Привет Node! 2. Web Проект 3. SPA 4. Windows Azure 5. Socket.IO @dmytromindra #msugodua
  • 18. Node Package Manager Управляет установкой модулей, например npm install azure npm install –g express @dmytromindra #msugodua
  • 20. Что в меню ? JavaScript везде. И Express (сервер) на сервере, и на Jade (сервер) клиенте. Некоторые Mustache (сервер , клиент) библиотеки Sammy.js (клиент) используются jQuery (клиент) одновременно и на сервере и на клиенте. @dmytromindra #msugodua
  • 21. ПРОСТОЕ WEB ПРИЛОЖЕНИЕ Постараемся построить простое веб приложение при помощи Express, Jade и пары заготовок. @dmytromindra #msugodua
  • 22. SPA* – приложение-страница Приложение, состоящее из одной веб страницы и обилия скриптов. Асинхронно общается с сервером. Не перегружается. *http://en.wikipedia.org/wiki/Single_Page_Application @dmytromindra #msugodua
  • 23. Интеграция с WINDOWS AZURE @dmytromindra #msugodua
  • 24. ПРИСТУПАЕМ К РАБОТЕ Мы кратко расскажем как:  создать новое Windows Azure Node.js приложение используя инструменты Windows PowerShell  запустить Node приложение локально, используя Windows Azure compute emulator  опубликовать ваше приложение а Windows Azure Дополнительная информация: https://www.windowsazure.com/en-us/develop/nodejs/tutorials/getting-started/ https://www.windowsazure.com/en-us/develop/nodejs/tutorials/web-app-with-storage/ @dmytromindra #msugodua
  • 25. ЕСЛИ КОРОТКО, ТО Выполните команду npm install azure В файле «c:nodetasklistWebRole1Web.cloud.config» замените тестовые данные на данные вашей учетной записи Azure. Вы найдете много полезной информации в файле: «C:nodetasklistWebRole1node_modulesazureREADME.md» Создайте новую переменную в вашем JavaScript файле: var azure = require('azure'); Все готово! Поехали ! @dmytromindra #msugodua
  • 26. СЕРВИС ТАБЛИЦ Создаем сервис: var tableService = azure.createTableService(); Назначаем имя таблице: var myTableName = “MyTable”; Создаем таблицу: tableService.createTableIfNotExists(myTableName, OnCreatedFu nc); Где OnCreatedFunc является функцией, которая выполнится после создания таблицы (Callback) function OnCreatedFunc(errorObject, createdBoolFlag) {…} Больше информации по адресу: http://www.windowsazure.com/en-us/develop/nodejs/how-to-guides/table-services/ @dmytromindra #msugodua
  • 27. ДОБАВЛЯЕМ ЗАПИСЬ В ТАБЛИЦУ Таблица Azure является контейнером для любого объекта. “PK” является комбинацией Partition и Row ключей. Объявляем объект: var myObj = { PartitionKey: “MyPartition“, RowKey: “myRowKey“, myProp1: “Dima+", myProp2: “Luba=“, myProp3: “Misha”}; Добавляем объект в таблицу: tableService.insertEntity( myTableName, myObj, OnMyObjInserted); Где функция OnMyObjInserted является callback-ом function OnMyObjInserted(error, serverEntity) {…} @dmytromindra #msugodua
  • 28. ОБНОВЛЯЕМ ЗАПИСЬ Объявляем объект с обновленными данными: var myObjUpd = { PartitionKey: “MyPartition“, RowKey: “myRowKey", myProp1: “Dima+", myProp2: “Luba=”, myProp3: “Misha and Margo" }; Обновляем существующую сущность: tableService.updateEntity( myTableName, myObjUpd, OnMyObjUpdated); Функция OnMyObjUpdated – это, как всегда, callback: function OnMyObjUpdated(error, serverEntity) {…} Подводный камень: вы должны заполнить все поля своего объекта, либо воспользоваться объектом ServerEntity и изменить только необходимые поля! @dmytromindra #msugodua
  • 29. ЗАПРАШИВАЕМ ЗАПИСЬ Одиночный объект: tableService.queryEntity(myTableName, myPartition, myRowK ey, OnEntityQueried); callback: function OnEntityQueried(error, serverEntity) {…} Набор объектов: var query = azure.TableQuery.select().from(myTableName) .where(“PartitionKey eq ?”, “MyPartition”); tableService.queryEntities(query, OnEntitiesQueried); сallback: function OnEntitiesQueried(error, serverEntities) {…} @dmytromindra #msugodua
  • 30. КАК НАСЧЕТ BLOB? Все работает точно так же, как и в таблицах: var azure = require('azure'); var blobService = azure.createBlobService(); blobService.createContainerIfNotExists(…); blobService.createBlockBlobFromStream(…); blobService.listBlobs(…); blobService.getBlobToStream(…); blobService.deleteBlob(…); Подробнее http://www.windowsazure.com/en-us/develop/nodejs/how-to-guides/blob-storage/ @dmytromindra #msugodua
  • 31. WEB в реальном времени SOCKET.IO @dmytromindra #msugodua
  • 32. WebSockets Постоянное подключение к серверу. Часть стандарта HTML5 Предназначен для построения Real-Time приложений. http://tools.ietf.org/html/rfc6455 @dmytromindra #msugodua
  • 33. Что такое SOCKET.IO? Больше, чем просто Виды транспорта: WebSockets. WebSocket Имеет Flash Socket альтернативные виды транспорта. AJAX long-polling AJAX multipart streaming Поставляется с клиентской IFrame библиотектой. JSONP polling @dmytromindra #msugodua
  • 34. Время действовать Напишем В нашем случае этим приложение, работа приложением будет обмен ющее в реальном мгновенными сообщениями. времени. @dmytromindra #msugodua
  • 36. Мои аргументы: 1. JavaScript невероятно популярен. На рынке много программистов. 2. JavaScript будет единым языком и на сервере и на клиенте. Никакого дублирования кода. 3. Асинхронная событийная модель. @dmytromindra #msugodua
  • 37. Внеклассное чтение Как убедить босса? http://nodeguide.com/convincing_the_boss.html Выбор правильного стиля http://stackoverflow.com/questions/5495984/coding-style-guide-for-node-js-apps Что такое Node? http://stackoverflow.com/questions/1884724/what-is-node-js @dmytromindra #msugodua
  • 38. Это стоит попробовать! СПАСИБО ! Dmytro.Mindra@gmail.com @dmytromindra #msugodua