
Vitalii
06.12.2017
20:17:47

Quantum Harmonizer
06.12.2017
20:19:50

Vitalii
06.12.2017
20:20:20

Google

Andrew
06.12.2017
20:31:39
для QT есть обёртки для, например, питона.
говорят не так уж и больно писать
Последний раз, когда я смотрел на PyQt, у него всё было очень плохо с кроссплатформенным деплойментом с учётом того, что не у всех, собственно, пайтон есть. Я не очень, конечно, пытался, может, это и решаемо, мне сама змея не по душе.

Sergey
06.12.2017
20:31:56

Quantum Harmonizer
06.12.2017
20:32:38

Sergey
06.12.2017
20:32:59
сложнее для понимания

Andrew
06.12.2017
20:36:14
А мне акторы понравились. Я вот сейчас на плюсах пописываю по работе -- и это грустно, когда std::future даже в композицию не умеет, а thread pool надобно писать самому поверх Boost::Asio. Вроде как и корутины где-то там на горизонте маячат, да пока они появятся и обростут библиотеками, Kotlin / Native уже несколько мажорных релизов пройти усеет.

Igor
06.12.2017
20:37:20
чет rx как-то проще)
Ну так сложность пишут один раз в выносят в библиотеки (небось к релизу 1.0 комьюнити все уже напишет)
Реализацию внутри RX куда сложнее.

Quantum Harmonizer
06.12.2017
20:41:03
Есть ли аналог BehaviorSubject — канал с текущим значением?
Это ж можно было бы неплохой MVVM сделать на основе каналов вместо пропертей.

Sergey
06.12.2017
20:42:36

Roman
06.12.2017
20:45:05
Ну вот мой debounce. Акторы и AtomicBoolean-ы мне кажутся здесь лишними: https://gist.github.com/elizarov/69ff0cf47d9ffe013bc6c1aeaf5af552

Quantum Harmonizer
06.12.2017
20:47:16

Roman
07.12.2017
06:27:22
Ну вот мой debounce. Акторы и AtomicBoolean-ы мне кажутся здесь лишними: https://gist.github.com/elizarov/69ff0cf47d9ffe013bc6c1aeaf5af552
Обе предложенные выерсии (как и моя вторая) являются по сути фильтрами, то есть отсекают все сообщения, если они приходят за заданный интервал времени. Такая операция конечно простая, но не очень полезная, ведь как обычно используют debounce: берем сообщение от пользователя и отправляем скажем на сервер, причем последнее сообщение должно быть самым важным. А фильтры его отбросят. В этом то главная проблема. Кроме того предложенные реализации не котроллируют выполнение созданной задачи. Ведь если появляются более свежие данные, то предидущая задача уже не имеет смысла и ее надо бы отменить.

Google

Roman
07.12.2017
07:50:22
А при чем тут debounce? Зачем какая то временная задержка? Надо просто при получении нового задания отменять старое.

Sergey
07.12.2017
07:58:09
который по интервалу берет самое последнее значение

Руслан
07.12.2017
08:37:09
http://reactivex.io/documentation/operators/debounce.html
Debounce тоже берет последнее
Да, сделаю чтобы брало именно последнее

Roman
07.12.2017
08:46:09
тебе наверное нужен sample?
Эта операция с двумя входными потоками и одним выходным. Из нее можно сделать debounce, да, но все же это не совсем то.

Roman
07.12.2017
08:50:24
Хотя тоже не фонтан. Она пока спит до следующего интервала, то ничего не принимает (посылающая сторона ждет)... А наверное должна принимать и выкидывать. Хз. Я вообще не понимаю зачем это кому-нибудь нужно, и поэтому не понимаю какое правильное должно быть поведение

Roman
07.12.2017
08:57:39
Ну паттерн использования ровно такой же, как и в rx. Там эта операция довольно популяраня.

Руслан
07.12.2017
08:59:03
@leukinrs тебе нужно поверх канала, или generic использование?

Roman
07.12.2017
09:00:56
Что значит generic?. Вот такой интерфейс, как предложил @relizarov довльно универсален. Думаю на нем остановиться. Через него можно уже заимплементить и контроль над Job.

Руслан
07.12.2017
09:01:45
ну на самом деле ты же можешь дебаунсить случайную функцию, как я предложил. дебаунсить канал это частный случай

Roman
07.12.2017
09:02:48
И для какого use-case она там используется? Мне, в своей жизни, приходилось только один раз подобное делать, чтобы ограничить частоту обновления UI, когда сервер очень часто посылал обновления (но потом мы пофиксили сервер). А обратную сторону всегда был шаблон такой, что если пользователь инициирует новое действие, то старое отменяется и посылается новое.

Руслан
07.12.2017
09:03:13
Ну в JS очень частный паттерн делать debounce ввода пользователя

balolam
07.12.2017
09:03:18

Roman
07.12.2017
09:03:40
+

Roman
07.12.2017
09:04:27
Ага. С задержкой. Этот момент я тоже упустил. В моем коде сейчас задержки нет. Первая шлется сразу.

balolam
07.12.2017
09:04:54

Google

Phil
07.12.2017
09:05:26
Скорее последняя за 300 ms

Roman
07.12.2017
09:05:29
В Rx, созласно нарисованной marble диаграмме в методе debounce, первая с задержкой уходит

Roman
07.12.2017
09:05:32
Вот с первой не всегда верно. Иногда должна, иногда нет. Там вроде есть опции.

Roman
07.12.2017
09:07:17
Это какое-то шаманство. А зачем это надо? Чтобы очень активные пользователи не положили сервак? Просто в моем мире между клиентом и сервером всегда был back-pressure, поэтому если клиенты пытаются положить сервер, то часта запросов от них автоматом уменьшается из-за backpressure и не надо никаких временных интервалов "ручками" вводить.

Руслан
07.12.2017
09:10:05
Это чтобы на UI ввод в формочку реактивно обновлял что-то, но при этом не мельтешило. Например.

balolam
07.12.2017
09:10:20
Если рассматривать данный кейс)

Руслан
07.12.2017
09:12:48
Кейсов много просто

balolam
07.12.2017
09:14:37

Roman
07.12.2017
09:14:46
Вот диаграма именно того, что я пытаюсь добиться
http://reactivex.io/documentation/operators/images/throttleFirst.png

Руслан
07.12.2017
09:15:13
ну так это ровно мой "debounce"

balolam
07.12.2017
09:15:22

Руслан
07.12.2017
09:15:28
как и debounce Ромы
Мы брали первый, и отбрасывали новые

Roman
07.12.2017
09:16:05
Последний должен сохраниться.

Руслан
07.12.2017
09:16:25
по диаграме сохраняется первый

Roman
07.12.2017
09:16:45
Ну там просто не нарисован этот случай.

Руслан
07.12.2017
09:16:56
:) ну вот так только не так

Roman
07.12.2017
09:17:25
Вот если розовый убрать, то синий должен прийти.

Google

Руслан
07.12.2017
09:17:26
Значит ты именно debounce хочешь
вот тут сохраняется последний

Roman
07.12.2017
09:18:17
У debounce есть задержка на первом. В принципе такое поведение тоже допустимо, но не всегда.

Admin
ERROR: S client not available

Руслан
07.12.2017
09:19:01
т.е. ты хочешь первый элемент в стриме пустить без задержки, а все последующие пустить через debounce

Sergey
07.12.2017
09:19:08
throttleFirst совсем другую логику имеет же

Roman
07.12.2017
09:19:45
Например представь случай, пользователь тыкает кнопку, мы начинаем ждать 300мс перед отправкой запроса, а потом ждем еще 300мс, в сумме 600, хотя могли получить за 300

Руслан
07.12.2017
09:19:53
даже на rx это будет типо три стрима. один входной, один для первого и один для всех остальных

Sergey
07.12.2017
09:19:59
у debounce всегда должен пройти интервал времени между 2я ивентами
с throttleFirst/Last у тебя 2 сообщения могут пройти с разницей меньше чем интервал
с throttle ты жмаканул кнопку и уйдет запрос только в конце интервала. если интервал 5 секунд то тебе эти 5 секунд выйдут задержкой

Matvey
07.12.2017
09:28:04
Привет !

Sergey8827
07.12.2017
09:40:59
Не знаю кому как, но Rx на котлине это такая дичь.
На джаве я спокойно пишу себе выражения
- студия все адекватно подсвечивает, генерирует и все збс
Но на котлине, что не напишу все красным - очень бесит.
Даже простое что то типа флатМап и ни в какую.
Начинаю гуглить пример нет.
единственный выход писать на яве и конвертировать в Котлин.
Но на кой хрен мне котлин если теперь я только в 2 раза больше времени трачу
Очень жаль это признавать
Но писал правду
Понимаете нагуглить на котлине rx просто онреал
Кто столкнулся?

snpefk
07.12.2017
09:43:12
Часть проблем для меня решил rxKotlin (https://github.com/ReactiveX/RxKotlin)

Sergey8827
07.12.2017
09:43:47

Google

Igor
07.12.2017
09:48:12

Aleksandr
07.12.2017
09:49:39
а под котлин что нужно свой rx подключать?

Sergey8827
07.12.2017
09:49:55

Aleksandr
07.12.2017
09:49:55
нельзя джавовским разве?
в чем профит?

Anton
07.12.2017
09:50:06
чегооо

Sergey8827
07.12.2017
09:50:11

Igor
07.12.2017
09:50:46

Aliaksei
07.12.2017
09:51:01
Может просто rx не нужен? )

Igor
07.12.2017
09:51:35
Ну и это конечно ?

Sasha
07.12.2017
09:52:30
Котлин рх этож набор экстеншенов, не?

snpefk
07.12.2017
10:03:51
Не нужно, обычного rxjava хватает в 99.999% случаем
Not really. По крайней мере для того 0.001% случаев, когда нужно заюзать zipWith(). В связке с дефолтной Java приходилось писать так, ибо type inference не справляется:
val obs1: Observable<Type1> = ...
val obs2: Observable<Type2> = ...
obs1.zipWith(obs2, BiFunction { t1: Type1, t2: Type2 -> Pair(t1, t2) })
С rxKotlin можно написать так:
obs1.zipWith(obs2, { t1, t2 -> Pair(t1, t2)})
Первый вариант, конечно, рабочий, но второй вариант выглядит лаконичней. Выглядит ли он настолько лаконичней, чтобы в проект тащить еще одну либу каждый решает сам для себя.
Хотя, оба варианта не очень, ибо все равно не получается написать:
obs1.zipWith(obs2, ::Pair)


Sergey8827
07.12.2017
10:07:15
Тогда подскажите такое
У меня летят ответы с разных сокетов, обернутые в Observable
как лучше скомбинировать результаты - чтобы на финише сделать обшие вычисления над ними, (естетсвенно все летит из разных потоков)
при учете что некоторые будут по любому кидать ошибки
zip - не подходит - так как при ошибке одного обзервебла он не вызывается

Roman
07.12.2017
10:15:56