These are chat archives for synrc/n2o

6th
Sep 2015
Namdak Tonpa
@5HT
Sep 06 2015 03:31
спасибо, пофиксал
сейчас волью http://5ht.co/n2o.htm в главу 6 про протоколы
если кто-то хочет что-то сказать говорите что добавить
Namdak Tonpa
@5HT
Sep 06 2015 04:31
написал главу специально по настройкам n2o
где собраны все опции sys.config
Andy
@m-2k
Sep 06 2015 04:36
Кул
говорите что еще?
Andy
@m-2k
Sep 06 2015 04:43
Все спят
Namdak Tonpa
@5HT
Sep 06 2015 04:43
кстати главу с настройками я бы в конец перенес
а ты че не спишь в воскресенье в 7 утра?
пишешь поиск? :-)
Andy
@m-2k
Sep 06 2015 05:29
я на работе :smile:
вчера написал
Ilya Gorskin
@Revent
Sep 06 2015 06:17
я тут на днях писал на go как же меня блевать тянуло, когда вместо простого паттерн матчинга приходилось городить костыли.
Andy
@m-2k
Sep 06 2015 06:23
Namdak Tonpa
@5HT
Sep 06 2015 10:27
что значит внезапно
Jan 18, 2013 Code formatting
последний коммит два года назад
Screen Shot 2015-09-06 at 1.28.08 PM.png
Namdak Tonpa
@5HT
Sep 06 2015 10:34
вот такое форматирование уйдет в книгу, больше я не могу ничего выцедить из этого ковбоевского апи
-module(n2o).
-description('N2O OTP Application Server').
-behaviour(supervisor).
-behaviour(application).
-export([start/2, stop/1, init/1]).

tables()   -> [ cookies, actions, globals, caching ].
opt()      -> [ set, named_table, { keypos, 1 }, public ].
start(_,_) -> supervisor:start_link({local,n2o},n2o,[]).
stop(_)    -> ok.
init([])   -> [ ets:new(T,opt()) || T <- tables() ],
              { ok, { { one_for_one, 5, 10 }, [] } }.
А вот supervisor и application в одном флаконе.
переименовал файлов немногожко:
├── endpoints
│   ├── cowboy
│   │   ├── n2o_cowboy.erl
│   │   ├── n2o_static.erl
│   │   └── n2o_stream.erl
│   ├── n2o_document.erl
│   └── n2o_proto.erl
Andy
@m-2k
Sep 06 2015 10:36
нормик
Namdak Tonpa
@5HT
Sep 06 2015 10:37
все фреймворк мейкеры счиают своей необходимостью написать синтаксический сахар вокруг ковбоя
но мы же такое делать не будем, мы не упоротые фреймворкописатели
поэтому я просто поубирал опции из ковбой хендлеров
и сделал непосредственные вызовы, чем сократил цепочку вызовов
-module(n2o_static).
-description('N2O Static Bridge to files in LING image, MAD bundle or OS').
Это статик эндпойнт который умеет LING, MAD и OS файлы
-module(n2o_stream).
-description('N2O Stream Bridge to WebSocket or XHR channels').
Это вебсокет хендлер где живет N2O протокол.
-module(n2o_cowboy).
-description('N2O Cowboy Server Bridge to HTTP Server Pages').
а это N2O Server Pages, решил ничего не придумывать и назвать как ASP, JSP и остальную поеботу. N2O Server Pages :-) бгг
Namdak Tonpa
@5HT
Sep 06 2015 10:42
может переименовать n2o_cowboy в n2o_pages ?
Andy
@m-2k
Sep 06 2015 10:46
скок те повторять? я не писал на asp
что такое pages
Namdak Tonpa
@5HT
Sep 06 2015 10:46
ну n2o_document
то как у тебя erlach написан, сервер пейджес :-) гг
а ты говоришь не писал
Andy
@m-2k
Sep 06 2015 10:47
ты n2o_document переименовал в n2o_cowboy а теперь хочешь в n2o_pages?
Namdak Tonpa
@5HT
Sep 06 2015 10:47
нет n2o_document остался — это хендлер
Andy
@m-2k
Sep 06 2015 10:47
так
Namdak Tonpa
@5HT
Sep 06 2015 10:48
n2o_proto — это тоже хендлер ковбоевский
Andy
@m-2k
Sep 06 2015 10:48
там ws?
Namdak Tonpa
@5HT
Sep 06 2015 10:48
а те три — то эндпойнты
n2o_proto — это ws
n2o_document — это http
Andy
@m-2k
Sep 06 2015 10:48
да понял
уже
Namdak Tonpa
@5HT
Sep 06 2015 10:49
ну тут два уровня типа
Andy
@m-2k
Sep 06 2015 10:49
переименуй, хули
а то ковбой и ковбой - нипатятна
Namdak Tonpa
@5HT
Sep 06 2015 10:49
один квбой
Andy
@m-2k
Sep 06 2015 10:50
папка ковбой
и мамка
Namdak Tonpa
@5HT
Sep 06 2015 10:51
я хочу чтобы у всех трёх эндпойнтов была одинаковая длина имени
а у pages на 1 символ меньше :-)
Andy
@m-2k
Sep 06 2015 10:51
это все хуйня
ты хотел переписать WS ковбоя
Namdak Tonpa
@5HT
Sep 06 2015 10:51
можно в n2o_server -> n2o_document типа серверные докуенты
я уже давно его переписал
Andy
@m-2k
Sep 06 2015 10:51
ого
Namdak Tonpa
@5HT
Sep 06 2015 10:51
там нехуй шо переписывать
я имел ввиду XHR
вебсокет ковбоя прямо в протоколы n2o_proto заходит там все отпидерашено уже несколько релизов
счас покажу
Namdak Tonpa
@5HT
Sep 06 2015 10:53
nop(R,S)                         -> {reply,<<>>,R,S}.
reply(M,R,S)                     -> {reply,M,R,S}.
push(_M,R,S,[],_Acc)             -> nop(R,S);
push(M,R,S,[H|T],Acc)            -> 
    case H:info(M,R,S) of
         {unknown,_,_,_}         -> push(M,R,S,T,Acc);
         {reply,Msg,Req,State}   -> reply(Msg,Req,State);
                    Ans          -> push(M,R,S,T,[Ans|Acc]) end.
Andy
@m-2k
Sep 06 2015 10:53
да, это пиздец
Namdak Tonpa
@5HT
Sep 06 2015 10:53
так n2o_stream — это ж поддержка XHR
там вебсокет только внизу
Andy
@m-2k
Sep 06 2015 10:54
да, уже почитал
Namdak Tonpa
@5HT
Sep 06 2015 10:54
websocket_init, websocket_handle, websocket_info, websocket_terminate
Andy
@m-2k
Sep 06 2015 10:54
push(M,R,S,T,[Ans|Acc])
не используется
аккумулятор
он проёбывается просто
Namdak Tonpa
@5HT
Sep 06 2015 10:55
Ans -> push(M,R,S,T,[Ans|Acc])
Andy
@m-2k
Sep 06 2015 10:55
да
push(_M,R,S,[],_Acc)  -> nop(R,S);
push(M,R,S,[H|T],Acc)
мы подрочили протоколы, собрали их стейт в акк и проебали лол
я хотел переписать, но тут не перепишешь
Namdak Tonpa
@5HT
Sep 06 2015 10:57
в Acc мы собираем только то что проебали, т.е. то на что протоколы не ответили или ответили хуй знает шо
ну такое тут играться можно до бесконечности
это метапротокол, поэтому тут вообще похуй как все написать :-)
это на самом деле катаморфизм по дереву протоколов
Andy
@m-2k
Sep 06 2015 10:59
а может 2 протокола обрабатывать?
одно сообщение
Namdak Tonpa
@5HT
Sep 06 2015 11:00
можно если напишешь так протокол
существующие протоколы если обрабатывают то терминируют
Andy
@m-2k
Sep 06 2015 11:00
ну да. и ансвер херится
приезжает тока последний
{reply,Msg,Req,State}   -> reply(Msg,Req,State);
Namdak Tonpa
@5HT
Sep 06 2015 11:01
ну вот это и есть терминация
а ну да там надо чуток изменить
хочешь чтобы я подрочил этот NOP REPLY PUSH топ левел протокол?
и сделал его еще лучше чем сейчас? :-)
Andy
@m-2k
Sep 06 2015 11:02
просто последним всегда n2o внутреннее что-то вызывается и затирает все твои кастомные результы
я уже не помню, задрачивал давно, ща не юзаю нигде и хуй бы положил
#transfer{} решило все мои проблемы
название канешн не оч, хуй проссышь вообще для чего оно
вспомнил, его надо делать лучше только для OTP-style eventing'а
когда возвращается {reply,#state{}}
но я ща прикинул и проще в стейт сохранять, код компактнее и в каждую функцию передавать это говно не надо и тысячи переменных St1 St2 St3...St21 хранить
Namdak Tonpa
@5HT
Sep 06 2015 11:06
так там я заложил возможность апдейтся #cx стейтов каждого проткола
это все уже есть
вот смотри
для n2o_nitrogen и n2o_rails протоколов в инициализации:
Andy
@m-2k
Sep 06 2015 11:06
я ща st{}=erlang:get(state) пишу )
вот оно:
wf:context(State,?MODULE,UserCx)
а вот реализация:
context(Cx,Proto,UserCx) ->
   Cx#cx{state=wf:setkey(Proto,1,Cx#cx.state,{Proto,UserCx})}.
Andy
@m-2k
Sep 06 2015 11:09
ну и NewCx тогда убери )
чот не въехал
это для чего
Namdak Tonpa
@5HT
Sep 06 2015 11:14
это чтобы хранить стейт каждого протокола отдельно в глобальном #cx стейте
Andy
@m-2k
Sep 06 2015 11:14
что за wf:setkey
что-то вроде проплистов?
Namdak Tonpa
@5HT
Sep 06 2015 11:15
именно
Andy
@m-2k
Sep 06 2015 11:16
то что хранить стейт протокола это и так ясно
но где такая же фишка для n2o_document
стейт должен не проебываться между отсылом динамики и передачей по ws
Namdak Tonpa
@5HT
Sep 06 2015 11:17
так в n2o_document нет никаких протоколов
он не проебывается, просто только actions от него берется
Andy
@m-2k
Sep 06 2015 11:18
а как писать и читать в UserCx
Namdak Tonpa
@5HT
Sep 06 2015 11:18
если хочешь можно в Transition процесс еще словарь процесса скидывать
Andy
@m-2k
Sep 06 2015 11:18
да, я ща так и делаю через action_transfer
Namdak Tonpa
@5HT
Sep 06 2015 11:18
ну и правильно у тебя сделано, это я так тебе и советовал
чтобы n2o_document не менять
Andy
@m-2k
Sep 06 2015 11:18
wf:wire(#transfer{state=[
                {route,Route} |[
                {state,State} |[
                {render_params,utils:params()} |[
                {render_state,utils:rst()} | TempIdList ]]]]}),
Namdak Tonpa
@5HT
Sep 06 2015 11:19
все правильно так и нада
Andy
@m-2k
Sep 06 2015 11:19
ну пох
Namdak Tonpa
@5HT
Sep 06 2015 11:19
просто счас начнется блядь
словарь процессов мало
давай еще что-то
Andy
@m-2k
Sep 06 2015 11:19
што
мало
а, лол
Namdak Tonpa
@5HT
Sep 06 2015 11:20
вот поэтому универсальный механизм передачи экшинов сделан
а дальше что хочешь через него передаешь
Andy
@m-2k
Sep 06 2015 11:20
как писать и читать в UserCx
давай примеры
Namdak Tonpa
@5HT
Sep 06 2015 11:20
писать в UserCtx могут только имплементаторы протоколов
Andy
@m-2k
Sep 06 2015 11:20
это за место моего стейта в процессе?
а я тогда тут каким боком. имплеентаторы блядь
Namdak Tonpa
@5HT
Sep 06 2015 11:22
вспомни зашквар c n2o_rails протоколом:
https://github.com/synrc/n2o/blob/master/src/protocols/n2o_rails.erl#L45
Andy
@m-2k
Sep 06 2015 11:22
я помню и чо
Namdak Tonpa
@5HT
Sep 06 2015 11:22
только тут надо так:
Controller:Action(Ev,proplists:get_value(?MODULE,State#cx.state))
Andy
@m-2k
Sep 06 2015 11:22
не понял прост зачем ты про cx начал, если я его юзать не могу
Namdak Tonpa
@5HT
Sep 06 2015 11:23
вот же пример тебе
как написать протокол в котором ты можешь юзать стейт явный
Andy
@m-2k
Sep 06 2015 11:24
мне его блядь написать надо? :smile:
протокол?
Namdak Tonpa
@5HT
Sep 06 2015 11:26
ну вот он почти написан же n2o_rails
Andy
@m-2k
Sep 06 2015 11:26
лол, не
там 30% макс
Namdak Tonpa
@5HT
Sep 06 2015 11:26
ну 30% не 0% :-)
Andy
@m-2k
Sep 06 2015 11:27
тем более я только что написал что это не юзабельно
Namdak Tonpa
@5HT
Sep 06 2015 11:27
мне это тоже не нравится поэтому я не дописал :-)
Andy
@m-2k
Sep 06 2015 11:27
тысячи переменных St и параметры в функциях
Namdak Tonpa
@5HT
Sep 06 2015 11:27
все равно на LING и BEAM процесс дикшинари мегаоптимизирован
быстрее чем шо угодно работает
Andy
@m-2k
Sep 06 2015 11:27
и возвращать надо минимум тупл - {Result,State}
Namdak Tonpa
@5HT
Sep 06 2015 11:28
надо убрать этото файл из n2o и из книги упоминание
Andy
@m-2k
Sep 06 2015 11:29
а как там с распределенным вебом у n2o?
Namdak Tonpa
@5HT
Sep 06 2015 11:29
просто я хотел это написать чтобы ЧикагоБосс троллить
Andy
@m-2k
Sep 06 2015 11:29
заебись потроллили
Namdak Tonpa
@5HT
Sep 06 2015 11:30
задача распределенного веба в N2O решается распределенным KVS
Andy
@m-2k
Sep 06 2015 11:30
а он не распределенный?
Namdak Tonpa
@5HT
Sep 06 2015 11:30
а зачем ему быть распределенным?
Andy
@m-2k
Sep 06 2015 11:30
а нах ты тогда это написал?
Namdak Tonpa
@5HT
Sep 06 2015 11:30
где написал?
Andy
@m-2k
Sep 06 2015 11:31
распределенным KVS
Namdak Tonpa
@5HT
Sep 06 2015 11:31
N2O не распределенный, KVS — распределенный
Andy
@m-2k
Sep 06 2015 11:31
на каждой ноде своя мнезия синхронизирующая с остальными?
Namdak Tonpa
@5HT
Sep 06 2015 11:31
можно и так настроить, так у меня работало
в voxoz
Andy
@m-2k
Sep 06 2015 11:32
и почему бы n2o не стать распеределенным
а ща как настроено
Namdak Tonpa
@5HT
Sep 06 2015 11:32
потому что это не задача фреймворка обеспечивать распределенность
а задача распределенной базы данных
только она может это курировать
Andy
@m-2k
Sep 06 2015 11:32
а как же мапредюс
и шардинг
Namdak Tonpa
@5HT
Sep 06 2015 11:33
юзай gproc распределенный и unsplit
Andy
@m-2k
Sep 06 2015 11:33
я примерно об этом и говорил
Namdak Tonpa
@5HT
Sep 06 2015 11:33
ну так это надо отдельный продукт писать если ты хочеш чтобы у synrc были свои распределнные ETS таблицы
такой продукт просто есть — это называется gproc + unsplit
Andy
@m-2k
Sep 06 2015 11:34
напиши как ща у тебя работает
Namdak Tonpa
@5HT
Sep 06 2015 11:34
задача распределенности не может быть у фреймворка который занимает 1K LOC
Andy
@m-2k
Sep 06 2015 11:34
и как настроено и как запускается
Namdak Tonpa
@5HT
Sep 06 2015 11:34
у меня приложения транзиентные
соседние ноды N2O ничего не знают и не должны нихуя синхронизировать ни с кем ничего
также они нихуя не хранят
другими словами — у меня рай :-)
Andy
@m-2k
Sep 06 2015 11:35
а по kvs
везде копии базы?
что значит не хранят
ты напиши про те что хранят
сук
Namdak Tonpa
@5HT
Sep 06 2015 11:38
про spawnproc/cr читай
Andy
@m-2k
Sep 06 2015 11:38
там больно сложный английский
Namdak Tonpa
@5HT
Sep 06 2015 11:38
ладно пойду поправлю книгу немного
осталась глава про протоколы
там еще много джаваскрипта надо написать чтобы в книге примеры выглядели красивые
Andy
@m-2k
Sep 06 2015 11:40
клади пикчи )
в bpg
беллар сука
Andy
@m-2k
Sep 06 2015 19:36
Снимок экрана 2015-09-06 в 22.35.26.png
200 MB в стейте одного процесса :smile:
Namdak Tonpa
@5HT
Sep 06 2015 19:36
мощно
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 21:29
Здравствуйте. Прежде всего спасибо авторам за крутой фреймворк и супербыстрые багфиксы, закрытие synrc/mad#41 меня прямо впечатлило. Однако же попытался создать проект текущим mad и снова не могу: пишет escript: exception error: undefined function web_app:main/1.
Andy
@m-2k
Sep 06 2015 21:30
./mad dep com pla rep
так запускаешь?
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 21:31
Нет! Так работает как раз, спасибо!
Запускал как в README написано
В смысле, делал бандл и его пытался запускать, как вот здесь предлагается: https://github.com/synrc/mad#beam-lightweight-unikernel-bundle
Andy
@m-2k
Sep 06 2015 21:39
так делай и запускай
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 21:39
Так не запускается же ж!
$ ./web_app
escript: exception error: undefined function web_app:main/1
  in function  escript:run/2 (escript.erl, line 752)
  in call from escript:start/1 (escript.erl, line 276)
  in call from init:start_it/1 
  in call from init:start_em/1
А через ../mad dep com pla rep запускается очень даже
Andy
@m-2k
Sep 06 2015 21:42
./mad dep com pla bun "review"
./review
web_app убрали на днях, перенесли application и supervisor в один файл
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 21:44
$ ./review 
escript: exception error: undefined function review:main/1
  in function  escript:run/2 (escript.erl, line 752)
  in call from escript:start/1 (escript.erl, line 276)
  in call from init:start_it/1 
  in call from init:start_em/1
Andy
@m-2k
Sep 06 2015 21:45
у тебя есть review:main/1 ? (apps/review/src/review.erl#L7)
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 21:47
В deps/n2o/samples/apps/review/src только.
$ cd apps/sample/src/
$ ls
index.erl  routes.erl  sample.app.src  sample.erl
Andy
@m-2k
Sep 06 2015 21:54
наркоман?
ну делай ./mad dep com pla bun "sample" && ./sample
ты понимаешь структуру вообще?
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 21:56
Нет, а где про неё читать?
Andy
@m-2k
Sep 06 2015 21:57
tumblr_inline_n4jv8eMagY1r8bl7z.png
тебе нужна только папка sample - это твоё приложение
внутри неё apps, deps, база и конфиги
apps - твои erlang applications
deps - erlang applications третьих лиц
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 21:58
Не-не, погоди. В такой степени я структуру понимаю
Andy
@m-2k
Sep 06 2015 21:59
ну тогда сходи по ссылкам выше на github, сравни со своим sample и пойми в чем у тебя косяк
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 22:00
Но это ты про дерево исходников n2o рассказываешь. А я пытаюсь завести проект, который создаёт mad
Ладно, видимо, чего-то глобально про логику работы mad не понял, пойду ещё доки покурю.
Andy
@m-2k
Sep 06 2015 22:01
ты по ссылкам ходил?
сравни со своим apps/sample/src/
запусти для начала голый пример а потом будешь задавать вопросы как свой сломаный код запустить
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 22:04
Ёпрст! Это не мой код! Это такой проект создаёт mad app sample!
Andy
@m-2k
Sep 06 2015 22:04
а блядь
ну делай ./mad dep com pla bun "sample" && ./sample
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 22:08
$ ./sample 
MAD Build Tool version a119fd
BNF: 
    invoke := mad params
    params := [] | run params 
       run := command [ options ]
   command := app | lib | deps | up | compile | release | bundle
              clean | start | stop | attach | repl
./sample rep работает
Andy
@m-2k
Sep 06 2015 22:12
ну так и чего не работает?
я тебе это написал 20 минут назад
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 22:13
Команды из README в репозитарии mad.
Узнать, что оно теперь так, я мог только почитав код или телепатически
Теперь понял, спасибо
Andy
@m-2k
Sep 06 2015 22:13
это специально. чтобы отсеивать ленивых :smile:
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 22:14
Ггг
Andy
@m-2k
Sep 06 2015 22:16
mad app "sample" без точки работает?
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 22:17
Нет, я качаю бинарник с гитхаба и кладу в каталог с приложеньками. А что, лучше ставить куда-то в $PATH?
Andy
@m-2k
Sep 06 2015 22:18
ну в папке с mad запусти, сгенерит сампл?
откуда ./mad dep com pla rep запускаешь
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 22:22
Я из каталога sample и запускаю mad. Ну, то есть, он у меня лежал уровнем выше и я писал ../mad, но сейчас скопировал в каталог с приложением — никакой разницы
Andy
@m-2k
Sep 06 2015 22:22
все понятно с тобой..
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 22:22
?
Andy
@m-2k
Sep 06 2015 22:23
сделал для тебя https://github.com/synrc/mad/pull/42/files
Yuriy Al. Shirokov
@yashrk
Sep 06 2015 22:27
Погоди, в каталоге sample-то mad откуда возьмётся? Тогда уж ../mad в 54 строчке
Ну и ./sample без аргументов по-прежнему не пускает приложение. Ладно, хрен с ним, запускать его я научился, спасибо, дальше разберусь. Не вижу смысла сейчас в это упираться.