SlideShare a Scribd company logo
1 of 20
Download to read offline
Erlang и n2o
web-разработка без
JavaScript
DevelCamp 2014
Татауров Евгений, Noda
Erlang
• Функциональный
• Динамически типизирован
• Лямбды
• Pattern matching
lists:map(fun(X) -> X*2 end, [4,8,15,16,23,42]).
double([H|T]) -> [2*H|double(T)];
double([]) -> [].
Erlang
• Процессы-акторы
• Message passing
• Распределенность из коробки
Erlang
• Let it crash
• OTP
• Supervision tree
n2o
• Cowboy (HTTP & WebSockets)
• Генерация HTML и обработчиков
• Scala Lift
• deferred javascript
n2o Elements
#panel{id=Panel, body=#button{id=myButton, body=
<<"OK">>, postback={ok, <<"INFO">>}}}
n2o Elements
#panel{id=Panel, body=#button{id=myButton, body=
<<"OK">>, postback={ok, <<"INFO">>}}}
<div id="myPanel"><button id="myButton"
type="button">OK</button></div>
n2o Elements
#panel{id=Panel, body=#button{id=myButton, body=
<<"OK">>, postback={ok, <<"INFO">>}}}
<div id="myPanel"><button id="myButton"
type="button">OK</button></div>
document.getElementById('myButton').addEventListener(
'click',function (event){
ws.send(enc(tuple(atom('pickle'),bin('myButton'),bin('
g2gCaAVkAAJldmQABWluZGV4aAJkAAJva20AAAAESU5GT2sACG15Qn
V0dG9uZAAFZXZlbnRoA2IAAAWFYgAKp5tiAACpXA=='),
[tuple(tuple(utf8_toByteArray('myButton'),
bin('detail')), event.detail)])));
}
)
Мини-приложение
+
|
+--------------+-+ |
+----------------+ | web_app | instagram_app
+-+--------------+ | | |
WS | index | | | |
+----+ | | | | Instagram
| | | | |
+----+ | | | |
| | | | |
+--------> +---+ | +---------------------+ HTTP POST
| +^ +-+ +--------------+-+ | | |
+----------------+ +----------------+ | | | <----------+
|| +++--------------+ | | | | |
|-------| loop | | | | | <----------+
+-------+> | | | | | |
| | | | | | <---------+
| | | | | | |
| <+-----------+ |
| +-----------+ |
| +-+ | | |
+----------------+ | | |
| +---------------------+
|
index.erl
main() ->
#dtl{file="index", bindings=[{body, body()}]}.
body() ->
[#panel{id=butPanel, body=[
#button{id=catsButton, class= <<"btn">>,
body= <<"show #cats”>>,
postback={tag,<<"cats">>}}
]},
#panel{id=updater}].
index.erl
event({tag, Tag}) ->
wf:update(butPanel,
#h1{body= << <<"#">>/binary, Tag/binary>>}),
{ok, _Pid} = wf:async(Tag,
fun() -> loop(updater, Tag) end),
manager:subscribe(Tag),
wf:reg(Tag).
index.erl
loop(Elem, Tag) ->
receive
{gproc_ps_event, {tag, Tag}, Text} ->
insert_image(Elem, Text),
wf:flush(Tag);
timer:sleep(500),
loop(Elem, Tag)
end.
insert_image(Elem, Img) ->
wf:insert_top(Elem,
#panel{body=#panel{body=[
#link{href=maps:get(<<"link">>, Img),
body=#image{src=maps:get(<<"url">>,
maps:get(<<"low_resolution">>,
maps:get(<<"images">>, Img))),
}}]}}).
Демо
Вариант на Python
• asyncio (aiohttp + websockets)
• акторы, общение через очередь
• код на JavaScript
@asyncio.coroutine
def handler(websocket, _path):
new_image_receiver = ProcessQueue()
SubscriptionManager.subscribe(TAG, new_image_receiver)
while True:
message = yield from new_image_receiver.receive()
if not websocket.open:
SubscriptionManager.unsubscribe(TAG, new_image_receiver)
break
yield from websocket.send(json.dumps(message))
var socket = new WebSocket("ws://127.0.0.1:8765");
socket.onmessage = function (event) {
var msg = JSON.parse(event.data);
var img = document.createElement('img');
img.src = msg.images.low_resolution.url;
var pics = document.getElementById('pics');
pics.insertBefore(img, pics.firstChild);
}
Производительность
Req/sec Latency
n2o 12450 21
aiohttp 530 117
tornado 1500 580
nginx 17600 49
wrk -t4 -c1000 -d30s http://127.0.0.1:8080
Выводы
• n2o быстр, как в плане работы, так и в плане
разработки
• Можно не писать HTML и JavaScript
• Гибкость. Толстый клиент и REST endpoint, либо
умный сервер и простой клиент.
• Все плюсы Erlang
Выводы
• Свой DSL
• Нет нормальной документации API (но есть
Nitrogen API)
• Сыроват, меняется, нет тестов.
Ресурсы
• http://synrc.com/apps/n2o/doc/web
• http://nitrogenproject.com
• Learn You Some Erlang for Great Good!
• Programming Erlang
• Erlang плагин для IDEA http://ignatov.github.io/intellij-
erlang/
• https://github.com/etataurov/instastream

More Related Content

What's hot

Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonPython Meetup
 
Монады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвМонады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвЮрий Сыровецкий
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6Dmitry Soshnikov
 
Перевод базы Caché из 8 бит в Unicode
Перевод базы Caché из 8 бит в UnicodeПеревод базы Caché из 8 бит в Unicode
Перевод базы Caché из 8 бит в UnicodeInterSystems
 
User Defined Materials in LS-DYNA
User Defined Materials in LS-DYNAUser Defined Materials in LS-DYNA
User Defined Materials in LS-DYNAYury Novozhilov
 
Алексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelАлексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelOleg Poludnenko
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)Alex Filatov
 
Александр Щепановский «Почему каждому языку нужен свой _»
Александр Щепановский «Почему каждому языку нужен свой _»Александр Щепановский «Почему каждому языку нужен свой _»
Александр Щепановский «Почему каждому языку нужен свой _»DevDay
 
JS утиліти WordPress на практиці
JS утиліти WordPress на практиціJS утиліти WordPress на практиці
JS утиліти WordPress на практиціShtrih Sruleg
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс СерверPVasili
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...JetBrains Russia
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and ClojureVasil Remeniuk
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 

What's hot (20)

Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
South migration
South migrationSouth migration
South migration
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 
Монады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвМонады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон Холомьёв
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 
Перевод базы Caché из 8 бит в Unicode
Перевод базы Caché из 8 бит в UnicodeПеревод базы Caché из 8 бит в Unicode
Перевод базы Caché из 8 бит в Unicode
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
User Defined Materials in LS-DYNA
User Defined Materials in LS-DYNAUser Defined Materials in LS-DYNA
User Defined Materials in LS-DYNA
 
Алексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelАлексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать Laravel
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Функциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядковФункциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядков
 
Александр Щепановский «Почему каждому языку нужен свой _»
Александр Щепановский «Почему каждому языку нужен свой _»Александр Щепановский «Почему каждому языку нужен свой _»
Александр Щепановский «Почему каждому языку нужен свой _»
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
 
JS утиліти WordPress на практиці
JS утиліти WordPress на практиціJS утиліти WordPress на практиці
JS утиліти WordPress на практиці
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 

Similar to Erlang и n2o. Web-разработка без JavaScript

Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Oleksii Okhrymenko
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
GAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камниGAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камниYehor Nazarkin
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS developmentIvan Trifonov
 
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в TarantoolИнструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в TarantoolTimur Safin
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4Technopark
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentationIvan Filimonov
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)Roman Brovko
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationSAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationNikolay Samokhvalov
 
jQuery: быстрая разработка веб-интерфейсов на JavaScript
jQuery: быстрая разработка веб-интерфейсов на JavaScriptjQuery: быстрая разработка веб-интерфейсов на JavaScript
jQuery: быстрая разработка веб-интерфейсов на JavaScriptConstantin Kichinsky
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 

Similar to Erlang и n2o. Web-разработка без JavaScript (20)

Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
GAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камниGAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камни
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
 
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в TarantoolИнструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Avito / SPA Meetup 2
Avito / SPA Meetup 2Avito / SPA Meetup 2
Avito / SPA Meetup 2
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentation
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)
 
лекция 3
лекция 3лекция 3
лекция 3
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationSAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentation
 
jQuery: быстрая разработка веб-интерфейсов на JavaScript
jQuery: быстрая разработка веб-интерфейсов на JavaScriptjQuery: быстрая разработка веб-интерфейсов на JavaScript
jQuery: быстрая разработка веб-интерфейсов на JavaScript
 
Algo 00
Algo 00Algo 00
Algo 00
 
Agile Instrumentation
Agile InstrumentationAgile Instrumentation
Agile Instrumentation
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
OpenACC short review
OpenACC short reviewOpenACC short review
OpenACC short review
 

Erlang и n2o. Web-разработка без JavaScript