
Dmitry
26.03.2018
21:06:51
ой, прошу прощения, я ничего не читал и увидел «Тесты не компилятся»
стригеррился
помог, надеюсь

$ergi0
26.03.2018
21:07:17
компилятся
Т.е. не компилятся. Иначе зачем этот файл?

Google

Dmitry
26.03.2018
21:07:58
Без этого файла так то вообще ничего не компилится

Dmitry
26.03.2018
21:08:12
у тебя приложение без mix.exs вообще не скомпилится, в тех строчках указано для какой среды какие папки компилить

Dmitry
26.03.2018
21:08:15
Попробуй убрать “lib” )

Dmitry
26.03.2018
21:09:00
ну кстати да, получается тесты не компилятся
компилится test/support

$ergi0
26.03.2018
21:09:20
Вот :)

Dmitry
26.03.2018
21:09:25
тесты .exs, просто запускаются таском

$ergi0
26.03.2018
21:10:00
В целом наверно пофиг, не главная проблема сейчас

Alex
26.03.2018
22:01:57
У них просто определенный формат
вот в этом и проблема. вместо того чтобы делать удобные композируемые примитивы, сделали монолит. причем, сделали как попало, вставив себе же палок в колеса(вспоминая про отсутствие вебсокетов в плаге).

Dmitry
26.03.2018
22:06:20
Следующий уровень - это феникс
Я готов поспорить с тобой на 100 баксов, что ты не сможешь сделать что-то между ними.
Так же как и вставить ws в плаг.

Google

Alex
26.03.2018
22:11:39
откуда берется "свой формат"? как к топику прицепить, например, SSE+HTTP POST клиент?

Dmitry
26.03.2018
22:16:00
Я не уверен, что правильно понял твой вопрос

Alex
26.03.2018
22:16:25
ну или вот:
broadcast! socket, "user:entered", %{user: msg["user"]}какое отношение pubsub топик имеет к сокету канала?..

Dmitry
26.03.2018
22:16:28
Но для server side events можно сделать отдельный сокет с кастомным протоколом

Alex
26.03.2018
22:17:04
я не совсем про то, что между ws и каналами нужно что-то вставлять
я скорее о том, что в абстракцию "канал" спрятано что-то кроме ws с не очень понятными мне целями
это код 2015ого года, сорри

Dmitry
26.03.2018
22:18:45
И только
Можно канал без сокета использовать
В пабсабе
Можно и сокет без канала

Alex
26.03.2018
22:30:48
ммм. а подцепить сокет к топику на лету?

Dmitry
26.03.2018
22:32:14
Ты имеешь ввиду канал?
Или фронтенд?

Alex
26.03.2018
22:36:03
давай с начала.
канал - это как amqp exchange.
сокет - примерно как консюмер одной или более amqp queue подцепленным к этому эксчейнджу + автоматический паблишер сообщений от клиента + описание транспортов до клиента.
про фронтенд мы не говорим, если какую-то коммутацию нельзя сделать на сервере и только на сервере - это черт знает что.

Dmitry
26.03.2018
22:37:26
Нельзя
Вернее говоря можно, но в рамках одного канала

Google

Dmitry
26.03.2018
22:39:02
Т.е. ты должен сделать такой канал, который предусмотрит что в какой то момент клиенту нужно будет отдавать что-то новенькое

Alex
26.03.2018
22:39:25
господи
вот опять мне хочется бить себя ушами по лицу и кричать.

Dmitry
26.03.2018
22:40:11
Не вижу в этом проблемы
Если бы была меньшая абстракция - пришлось бы делать то же самое
Потому что не было бы каналов
Сокет - это генсервер, который держит соединение с клиентом.
На каждую «подписку на канал» от клиента он делает новый генсервер - канал
У одного сокета может быть несколько каналов
Канал получает сообщения из двух мест - сокета и пабсаба
Для сокета - handle_in
Для пабсаба - handle_out

Alex
26.03.2018
22:43:03

Dmitry
26.03.2018
22:43:21
И отправляется в сокет либо пабсаб
Через push или broadcast соответственно
Все
В 5 сообщениях - вся логика вебсокетов в фениксе
Это просто роутер
Хочешь без него - пихай все сообщения в один канал *:*
И всю логику туда же

Google

Dmitry
26.03.2018
22:45:42
Тогда получится n2o
Или вебсокеты cowboy
А ещё, для развлечения, можно сделать 2 сокета с разным транспортом

Alex
26.03.2018
22:47:27

Dmitry
26.03.2018
22:47:44
Бизнес логику

Alex
26.03.2018
22:48:55
"канал - это как amqp exchange."
вот это было неправильно
эксчейндж спрятан

Dmitry
26.03.2018
22:49:16
Я не так силён в ampq
К сожалению
Да и exchange по-моему не в протоколе, а только в rabbit mq

Alex
26.03.2018
22:50:19
на самом деле, плохая аналогия, сова не натягивается на глобус

Dmitry
26.03.2018
22:50:19
Но вот как в фениксе - я тебе рассказал

Alex
26.03.2018
22:54:09
я в очередной раз не понимаю, какими вводными и кейсами руководствовались разработчики. хорошо, ладно.
именованые инстансы каналов переживающие на сколько-то сокет можно делать? ну то есть буфер для реконнекта

Dmitry
26.03.2018
22:55:23
Скорее всего хотели сделать изи чат
Получил сообщение от одного из клиентов - разослал всем
В принципе все остальные кейсы вообще не требуют роутинга и каналов как таковых
Но тогда можно просто взять cowboy

Alex
26.03.2018
23:09:51
Пока я делал вебинары, я ощутимо хлебнул дерьма с пабсабами и мне сложно принять, что такой набор примитивов является достаточным и вообще приносит пользу.
Это конечно bias, но всё же имеющий под собой какие-то основания.


Dmitry
26.03.2018
23:16:31
@TTaraskin Для REST-интерфейса разница не чувствуется между cowboy-ем и n2o никак. Не удивительно, абстракция в 100 строчек, которая при этом не кастомизируется и всё равно переписывать с нуля - оставляет впечатление её отсутствия. В плане вебсокетов, ничего не могу сказать, документация и примеры у n2o, что я нашёл настолько скудные, что я предполагаю ( предположение), что на cowboy-е написать websocket server и минимальный ws client с нуля у меня получилось быстрее, чем я смог бы разобраться в n2o. Или точнее выяснить, что оно возможно снова что-то не то делает и нужно снова велосипедить самому.
В данном случае Plug показывает верх кастомизации(это преувеличение конечно), потому что даже если бы не было у плага нужных плагов, легко можно было бы написать нужный plug и изменить поведение, как и в каком порядке обрабатыватся. В случае с n2o - rest - выкидываешь rest, пишешь поверх ковбоя. Ну и остаётся ощущение, что пишешь на ковбое, а не на фреймворке, который должен что-то упрощать.

Google

Dmitry
26.03.2018
23:40:09
Я до опыта c n2o меньше ценил то, как хорошо сделан plug.


Taras ?
27.03.2018
12:03:40
@TTaraskin Для REST-интерфейса разница не чувствуется между cowboy-ем и n2o никак. Не удивительно, абстракция в 100 строчек, которая при этом не кастомизируется и всё равно переписывать с нуля - оставляет впечатление её отсутствия. В плане вебсокетов, ничего не могу сказать, документация и примеры у n2o, что я нашёл настолько скудные, что я предполагаю ( предположение), что на cowboy-е написать websocket server и минимальный ws client с нуля у меня получилось быстрее, чем я смог бы разобраться в n2o. Или точнее выяснить, что оно возможно снова что-то не то делает и нужно снова велосипедить самому.
яхз что там может быть сложно с вебсокетами в n2o
есть html-страница (или основа, где есть только доктайп и маленький js который устанавливает вебсокет с сервером),
есть модуль, есть функция event(init) — она срабатывает когда вебсокет-соединение установилось — удобно актуальную часть страницы обновить или вообще отправить
и есть функции event({client,{your_huita}}) которые обрабатывают ваши запросы с клиента, дергаем клиент с сервера wf:wire("js_huita"), wf:wire(wf:f("js_huita('~s');",[Var]))
и дергаем сервер с клиента ws.send(enc(tuple( atom('client'), tuple( atom('your_huita') ) )))
( тут же — querySource('huita_id'), bin("huita"), number(777) )
я понимаю что Максим и его команда доку пишут только на инглише, и сам я жаловался что примеров не слишком много (ясен пень хотелось бы побольше, и еще я нитик и местами дурак), но блоть... с хера не зайти в чат разработчиков n2o, не спросить? вам ответят на ваш выбор — на инглише, русском или украинском, продложат 2-4 варианта решения вашей задачи ... я многое могу понять, одно понять не могу — почему люди люблят ныть\страдать и не спросят совета\помощи в кого-то более опытного? корона не отвалится же, люди...
В данном случае Plug показывает верх кастомизации(это преувеличение конечно), потому что даже если бы не было у плага нужных плагов, легко можно было бы написать нужный plug и изменить поведение, как и в каком порядке обрабатыватся. В случае с n2o - rest - выкидываешь rest, пишешь поверх ковбоя. Ну и остаётся ощущение, что пишешь на ковбое, а не на фреймворке, который должен что-то упрощать.
да, в n2o по умолчанию рест маленький, я тоже пилил на ковбое
с другой стороны — не рестом единым — для рест и голый ковбой ок
c n2o — прицепил epgsql, узял js-хеш-роутер, и можешь шаманить на одной страничке что-угодно, кучу табов с кастомными хеш-адресами, удобное обновление-подзагрузка по вебсокетами, ммм... думаю для трейдерского бота с графиками и тд — вообще милое дело
ну как и для игр ))


Максим
27.03.2018
12:31:26
Всем привет! А подскажите как лучше сделать. Надо один раз в день в заданное время отсылать определённое сообщение. В итоге у меня получается два варината: либо через send_after мутить, либо в крон поставить вызов простенького скриптика с get запросом в контроллер феникса. Как правильно?

Anatoliy Kovalchuk
27.03.2018
12:32:11
Мне GenServer + send_after нравится больше

Vladimir
27.03.2018
12:33:07
есть ещё такое: https://github.com/erlware/erlcron

Anatoliy Kovalchuk
27.03.2018
12:33:10
например так https://github.com/Kr00lIX/gen_worker

Максим
27.03.2018
12:34:21
вау

Vladimir
27.03.2018
14:17:44

Anatoliy Kovalchuk
27.03.2018
14:18:15
это учтено в gen_worker

Taras ?
27.03.2018
14:18:27

Vladimir
27.03.2018
14:23:28

Anatoliy Kovalchuk
27.03.2018
14:24:46
при запуске высчитывает сколько милисикунд нужно до ближайшего времени запуска

Vladimir
27.03.2018
14:28:44
Ага, допустим что выполнение задачи завершилось неудачей и даже привело к падению ноды. Нода рестартовала. По-хорошему нужно ещё раз повторить выполнение задачи, ведь предыдущее не завершилось успешно. Как быть?

Dmitry
27.03.2018
14:30:20
во внешние источники историю запусков писать, проверять что был вызов *Костылинг*

Anatoliy Kovalchuk
27.03.2018
14:30:45
не думаю что за этим должен следить сам механизм воркера

Evgeny
27.03.2018
14:30:45
Скажите, а пихать в структуры поля, которые не предусмотрены в defstruct это моветон или обычное дело?

Vladimir
27.03.2018
14:32:52