
Ievgenii
03.11.2017
06:04:02
Ну это, мне кажется, перебор
Сделай тогда из своего json-а строку и все

Just
03.11.2017
06:07:58
тогда нельзя будет вложения проверять, типа возникло событие с тегом {"region": "ru"} и подписка вида {"key": {"region": "ru"}}, простая проверка на вхождение покажет, что подписка подходит, а на самом деле нет. поэтому надо сериализовать в такой массив ["key!string.region.ru"].
еще пример
{"b":"1","c":["1","2","3"]} =>
["b!string.1", "c!array.1", "c!array.2", "c!array.3"]

Ievgenii
03.11.2017
06:14:12
Вы лучше задумайтесь, нужно ли вам вложение

Google

Ievgenii
03.11.2017
06:14:27
Плоскими тегами будет проще
Да и быстрее

Just
03.11.2017
06:14:58
поздно задумываться, уже почти готово. ну и никто не запрещает пользоваться плоскими, вложеность лишь доп. возможность

Ievgenii
03.11.2017
06:15:28
По перфоменсу ударит
У вас и так логика не тривиальная...

Just
03.11.2017
06:17:02
будем оптимизировать по мере необходимости. это вы еще не видели других возможностей) есть еще забавные идеи

Ievgenii
03.11.2017
06:18:05
Оно то понятно. Я прежде всего на работе задаю вопрос: на сколько часто мы будем использовать подобный функционал?
Если логика сложная - оно будет и дольше работать и сложнее поддерживать

Just
03.11.2017
06:18:54
здраво, конечно, но вложеность нам пригодится, как минимум для работы с телеграмом

Ievgenii
03.11.2017
06:19:03
Иногда проще отказаться от чего-то подобного в пользу производительности и простоты.

Just
03.11.2017
06:20:08
я сам предлагал обычные обьекты использовать, а потом стандартную сериализацию, но в итоге понял, что нужно все таки кастомную делать. это производительнее будет для вложености

Ievgenii
03.11.2017
06:20:11
Вы эту вложенность сами, предварительно, можете разворачивать

Just
03.11.2017
06:20:36
ну собственно сериализатор и разворачивает ее в плоский массив строк

Google

Just
03.11.2017
06:21:09
сериализовать нужно только один раз при подписки или инвоке события
по разу на метод в общем

Ievgenii
03.11.2017
06:21:56
Инвок может быть весьма часто
А потом ещё поиск нужных подписчиков
А как передается событие с тегами?

Just
03.11.2017
06:23:17
насчет поиска тоже есть идея, как не делать перебор, а искать по словарю. и для этого тоже нужно сериализовать, как раз

Ievgenii
03.11.2017
06:23:43
По факту это просто событие, в параметр которого передается или this или что-то подобное
У вас передается 2 параметра?

Just
03.11.2017
06:24:06
при инвоке?

Ievgenii
03.11.2017
06:24:11
Да

Just
03.11.2017
06:26:03
массив tags, словарь data передается

Ievgenii
03.11.2017
06:26:04
Лично я вижу только перебор какого-то списка и подписчиков и сравнение его тегов с событийными

Just
03.11.2017
06:26:18
ну и указывается, что action=invoke

Ievgenii
03.11.2017
06:26:19
Что за словарь?

Just
03.11.2017
06:26:38
просто словарь с любыми дополнительными данными

Ievgenii
03.11.2017
06:27:09
void*
?

Just
03.11.2017
06:27:43
ну как, любой джейсон может быть

Google

Ievgenii
03.11.2017
06:28:53
А вы завязываетесь на Джейсон?

Just
03.11.2017
06:29:06
вообще это опенсорс штука, но пока рано показывать кому-то

Ievgenii
03.11.2017
06:29:23
А если я хочу бросить событие и передать туда объект класса Test

Just
03.11.2017
06:29:23
да, привыкли с ним работать
тут надо указать, что обмен по вебсокетам происходит основной, еще есть задумка по http дублировать некоторые методы
сейчас есть клиент на js, еще на питоне будет

Ievgenii
03.11.2017
06:30:29
Аааа
Я думал это в контексте одного приложения

Just
03.11.2017
06:31:28
клиент на D, как раз в планах нету, что странно) надо добавить

Ievgenii
03.11.2017
06:31:32
Ну, интересно.
В сторону Рабита не смотрели?
Или это и была конечная цель - написать нечто подобное?)

Just
03.11.2017
06:32:29
смотрели, но хочется, что-то маленькое, простое и быстрое

Ievgenii
03.11.2017
06:32:55
А чем он велик?

Just
03.11.2017
06:32:56
что бы в итоге один бинарник, запустил его и сервис готов

Ievgenii
03.11.2017
06:33:07
Подняли образ из докера и все работает
Не понравилось - грохнули...
Иными словами - набор этих тегов и есть имя события.
Верно?

Just
03.11.2017
06:34:32
лично я с ним не работал, а тому кто этот проект затеял не очень он понравилось. а вообще интересно же что-то такое соорудить, что бы попрактиковаться

Google

Just
03.11.2017
06:34:36
да

Ievgenii
03.11.2017
06:35:43
Была у меня подобная затея)
Но не с такой сложной логикой
Тут вы, конечно, не хило замахнулись!
Что ещё планируется?
Из функционала

Just
03.11.2017
06:37:11
да изначально логика простая планировалась, она и сейчас не особо сложная, если работу с тегами не учитывать, хотя это и изюминка может, не знаю есть ли такое у других
метод request, это тот же invoke, но клиент желает получить ответ от подписчика. в свою очередь подписчик, если решит ответить, то шлет метод chat, который позволяет им потом общаться, пока кто-то не пошлет последний chat с параметром finish

Ievgenii
03.11.2017
07:05:51
Мне нравится, как это реализовано в рабите:
Ты просто создаёшь дополнительную очередь, а в сообщении указываешь имя этой очереди, в которую нужно залить ответ

Admin
ERROR: S client not available

Ievgenii
03.11.2017
07:06:42
Вот и все...
Просто и гениально

Just
03.11.2017
07:08:01
это конечно да, но не зря же там документация огромная, это только базовая штука

Ievgenii
03.11.2017
08:10:55
Я о том, почему бы вам также не сделать?

Just
03.11.2017
11:33:25
как в D сделать thread safe очередь, что бы с разных потоков с ней работать? достаточно так?
DList!string queue;
// add
queue.insertFront(data);
// pop
auto data=queue.back();
queue.removeBack();

Ned Ogl
03.11.2017
11:41:26
То есть в секцию .tdata

Just
03.11.2017
11:42:15
попробую сейчас

Google

Ned Ogl
03.11.2017
11:42:28
Бред, она же динамически у тебя собирается, да?

Just
03.11.2017
11:43:44
честно говоря не знаю, но вообще такой make
dmd -c $(SOURCES) -odtmp $(D_FLAGS)
dmd tmp/*.o -of${TARGET} $(LIBS)

Ned Ogl
03.11.2017
11:45:20
Нет, я не про сборку проекта
Я про то, как ты дополняешь очередь элементами

Just
03.11.2017
11:45:47
а, ну да, конечно
я вообще пытался вот так сделать как-то
synchronized class SocksQueue {
private DList!string _queue;
public void f(string data){
_queue.insertFront(data);
}
}
но ошибку выдает
Error: template std.container.dlist.DList!string.DList.insertFront cannot deduce function from argument types !()(string) shared, candidates are:

Pavel
03.11.2017
11:53:08
Я думаю что ты делаешь вполне правильно, так и надо.

Just
03.11.2017
11:53:29

Pavel
03.11.2017
11:53:43
Я про концептуальность
Делаешь synchronized класс очереди, и тогда каждый тред заходит в метод pop() эксклюзивно, никаких гонок не будет.
Ну а то что ошибка там выскакивает - да надо просто ее порешать )

Just
03.11.2017
11:55:18
понял, значит надо технические моменты порешать
вообще можно просто в скоупе очередь определить
synchronized {
DList!string _queue;
}
но хотелось ввиде класа это сделать, что бы методы определить для работы с очередью, а не напрямую работать. еще посмотрю

Pavel
03.11.2017
12:03:06
Лучше класс, ведь иначе у тебя работа с этой очередью будет неатомарной
Получить последний элемент и удалить элемент из очереди это две операции насколько я понимаю

Just
03.11.2017
12:04:58
none of the overloads of 'removeBack' are callable using a shared object
т.е. методы dlist'а не хотят работать с шаред объектами

Ievgenii
03.11.2017
12:35:11
А зачем именно Длист?
Чего не простой массив?

Just
03.11.2017
12:36:34
удаление быстрое

Pavel
03.11.2017
12:37:15
Кстати можно попробовать из std.container массив использовать

Just
03.11.2017
12:41:53

Pavel
03.11.2017
12:42:25
хм