Node.js and C++ #foss-sea.org.ua
-
Upload
eugene-khvedchenya -
Category
Education
-
view
347 -
download
2
description
Transcript of Node.js and C++ #foss-sea.org.ua
Дополненная Реальностьв ОблакеNODE.JS И С++ ПОД ОДНОЙ КРЫШЕЙ
Хведченя ЕвгенийComputer Vision Talks
Дополненная реальность
Дополненная реальность (англ. augmented reality, AR), — термин, относящийся ко всем проектам, направленным на дополнение реальности любыми виртуальными элементами.
Дополненная реальность сегодня
Возможности ограничены мощностью устройства
Высокое энергопотребление
30FPS – это минимум
Обилие и фрагментация платформ
Разнообразие языков программирования
Дополненная реальность в облаке
Работает везде
Потребляет меньше энергии
С++ для алгоритмов
Производительность и масштабируемость
Легкий обмен данными между устройствами
cloudcv.io
Так появился CloudCV – Cloud Computer Vision Platform
Цель – Algorithms as a Service
cloudcv.io
Так появился CloudCV – Cloud Computer Vision Platform
Инфраструктура для алгоритмов в облаке: Дополненная реальность
3Д реконструкция
Анализ видео (подсчет людей, выявление дефектов)
Распознавание объектов и лиц
Node.js & C++
Альтернативы Node.js & C++
SWIG & JAVA
RoR & C++
Boost.Python
Почему C++ и Node.js
С++ Node.js
• Производительность
• Библиотеки
• Опыт разработки
• Простая обработка
запросов
• Поддержка С++
• Легковесный
• Он прикольный
Node.js и C++ такие разные
Компиляция vs Интерпретация
Строгая типизация vs Слабая типизация
Makefile vs nothing
И это работает!
Взаимодействие Node.js и С++
Node.js построен на базе движка V8
V8 написан на С++
Можно грабить корованы писать свои модули
?????
PROFIT!
Минимальный модуль
#include <node.h>#include <v8.h>
using namespace v8;
Handle<Value> Method(const Arguments& args) { HandleScope scope; return scope.Close(String::New("world"));}
void init(Handle<Object> exports) { exports->Set(String::NewSymbol("hello"), FunctionTemplate::New(Method)->GetFunction());}
NODE_MODULE(hello, init)
Что тут неправильно?
#include <node.h>#include <v8.h>
using namespace v8;
Handle<Value> Method(const Arguments& args) { HandleScope scope; return scope.Close(String::New("world"));}
void init(Handle<Object> exports) { exports->Set(String::NewSymbol("hello"), FunctionTemplate::New(Method)->GetFunction());}
NODE_MODULE(hello, init)
Неблокирующие вычисления в С++
Node.js работает асинхронно
Блокирующие задачи - в отдельном потоке
Код С++ также должен следовать парадигме
Как правильно
1. Вызов функции С++ из JavaScript
2. Создание рабочего потока (libuv)
3. WorkerFn – чистый С++ код (без V8)
4. Возврат результата через callback
Запуск обработчика
Handle<Value> Async(const Arguments& args) {
HandleScope scope;
Local<Function> callback = Local<Function>::Cast(args[0]);
Task* task = new Task();
task->request.data = task;
task->callback = Persistent<Function>::New(callback);
uv_queue_work(uv_default_loop(), &task->request,
AsyncWork, AsyncAfter);
return Undefined();
}
Передача данных между потоками
struct Task {
uv_work_t request;
Persistent<Function> callback;
// Custom data
int32_t theAnswer;
};
Передача данных между потоками
struct Task {
uv_work_t request;
Persistent<Function> callback;
// Custom data
int32_t theAnswer;
};
// Хранит внутреннее состояние задачи
Передача данных между потоками
struct Task {
uv_work_t request;
Persistent<Function> callback;
// Custom data
int32_t theAnswer;
};
// JavaScript функция, которая будет вызвана по выполнению работы
// Хранит внутреннее состояние задачи
Асинхронный обработчик
void AsyncWork(uv_work_t* req) {
// No HandleScope!
Task* task= static_cast< Task *>(req->data);
sleep(1000); // Do something useful task->theAnswer = 42;
}
Получение результата
void AsyncAfter(uv_work_t* req) {
HandleScope scope;
Task* task = static_cast< Task *>(req->data);
task->callback->Call(…); // Call Task->callback with results.
task->callback.Dispose(); // Clean-up memory:
delete baton;
}
Использование в JS
var cppModule = require(‘hello’);
cppModule.hello(“some input”, function(result) {
// result.theAnswer = 40});
О чем следует помнить
AsyncWork – блокирующая функция
Внутри AsyncWork запрещен доступ к V8
Task хранит аргументы и результат
Используйте TryCatch при обращениях к V8
Использование TryCatch
// Trying to call JavaScript callback:
TryCatch try_catch;
callback->Call(Context::GetCurrent()->Global(),
1, /* Number of arguments of callback */
res /* Array of arguments */);
if (try_catch.HasCaught()) {
node::FatalException(try_catch);
}
Демонстрация
Дополненная реальность в браузере
Используется только браузер и веб-камера
Вся «магия» происходит на сервере
Потоковая обработка в реальном времени
Захват кадра(JavaScript)
Отправка кадра
(node.js)
Обработка(С++)
Отправка ответа
(node.js)
Визуализация
http://cloudcv.io
Посмотреть код https://github.com/BloodAxe/CloudCV https://github.com/BloodAxe/CloudCVBackend
Попробовать дома
А давайте поговорим?
Спасибо за внимание!
[email protected] @cvtalks computer-vision-talks.com cloudcv.io