
Nikita
13.12.2016
14:18:32
Начну с них, потом, наверно курс возьму на корусере, спасибо)

Nikolay
13.12.2016
14:24:30
кто-нибудь писал кастомный GraphStage[SourceShape[]], который бы постоянно забирал элементы из какого-то хранилища?
как по-нормальному сделать выборку элементов, чтобы добавлять элементы в внутренний буфер по необходимости, но не когда он пустой становится?

KrivdaTheTriewe
13.12.2016
14:27:36
https://www.infoq.com/presentations/etl-streams

Google

Dmitry
13.12.2016
14:29:07
Николай: вроде бы никак. Делаешь вторым элементом после источника стандартный буфер. Он сосёт из источника, пока буфер не наполнится. Если буфер пустой, сообщение сразу идёт дальше

Nikolay
13.12.2016
14:37:17
https://scalafiddle.io/sf/QqgYVZs/1
вот такой вариант сейчас, но мне не нравится что getElementsBatch будет делаться только когда буфер пустой, и consumer хочет больше элементов. значит он будет ждать пока мы не вытащим элементы из базы
когда я пытаюсь сделать так, чтобы элементы запрашивались по мере того, как буфер худеет, получается дикая лапша

Mikhail
13.12.2016
14:43:29
сделай тредик)

Nikolay
13.12.2016
14:43:45
м?

Mikhail
13.12.2016
14:43:52
thread

Nikolay
13.12.2016
14:45:19
иии?

Mikhail
13.12.2016
14:49:31
вобщем. в твоем варианте что конкретно тебе не нравится? ты можешь там вместо isEmpty проверять size < N и у тебя и так уже есть тредик(за счет асинка). просто помечай, что уже есть запрос и не запускай параллельно еще один гет-батч
ну и деливер соответственно не всегда требуется
ты просто можешь это сделать через обертку и спрятать бойлер плейт
тогда аут-хендлере у тебя все станет няшно и феншуйно

Nikolay
13.12.2016
14:51:38
> просто помечай, что уже есть запрос и не запускай параллельно еще один гет-батч
да, я примерно так и делал, это я и назвал дикой лапшой

Google

Nikolay
13.12.2016
15:05:08
https://scalafiddle.io/sf/QqgYVZs/4
не знаю, так вот можно…
так получается нет необходимости отслеживать, есть ли запрос в процессе сейчас

Anatoliy
13.12.2016
15:12:54

Nikolay
13.12.2016
15:25:26
просто я думал что в стримах такие вещи очень просто делаются, а теперь я так не думаю

Юрий
13.12.2016
16:39:27
так пушка же как раз это и делает? или нет?
Ты немного неправильно рассуждаешь. Тебе не обязательно прописывать мета информацию в классах. Это одна из фич пушки. Веб сокеты - просто транспорт. У тебя по этому транспорту туда сюда что-то ходит. Так как ты контролируешь и сервер и клиент, то они оба знают, в каком случае какой тип куда придет или уйдет. Например, ты спросил сервер - эй, дай мне юзера, и например, передал айди запроса. Потом ждёшь и слушаешь сокет. Пришел ответ с твоим айди - значит там юзер. Все, ты можешь сделать read[User]


Anatoliy
13.12.2016
16:40:58
Ты немного неправильно рассуждаешь. Тебе не обязательно прописывать мета информацию в классах. Это одна из фич пушки. Веб сокеты - просто транспорт. У тебя по этому транспорту туда сюда что-то ходит. Так как ты контролируешь и сервер и клиент, то они оба знают, в каком случае какой тип куда придет или уйдет. Например, ты спросил сервер - эй, дай мне юзера, и например, передал айди запроса. Потом ждёшь и слушаешь сокет. Пришел ответ с твоим айди - значит там юзер. Все, ты можешь сделать read[User]
естественно, но в любом случае там всё надо перепроверять, ведь клиент в этот момент(юзверь) может сам сделать что-то что сгенерирует событие которое будет отправлено на сервер, а значит раньше может прийти не User, а например Message

Юрий
13.12.2016
16:42:37
Передавай requestId, так точно не ошибешься
Сервер ответит чем-то с другим айди - ну значит это что-то другое

Diemust
13.12.2016
16:43:52
кто-нибудь пробовал в другом модуле в тестах запустить play приложение другого модуля (интеграционный тест), это можно сделать как-то просто? =)

Юрий
13.12.2016
16:44:36

Andrey
13.12.2016
16:46:20

Diemust
13.12.2016
16:47:06
Юрий подскажи название, что-то я видимо слеп

Юрий
13.12.2016
16:49:06

Andrey
13.12.2016
16:49:22

Юрий
13.12.2016
16:51:22

Andrey
13.12.2016
16:52:27
Именно это и означает. Любое сообщение без запроса с клиента

Юрий
13.12.2016
16:54:19
Тут скала вообще никак не повлияет. Вот пишешь ты клиента на js. Слушаешь сокет. Пришел непонятный меседж. Что делать будешь?

Nikolay
13.12.2016
16:56:04
вы про сервер и клиент на scala?

Google

Andrey
13.12.2016
16:56:07
Сам язык не повлияет, а нормальная библиотека сериализации еще как повлияет.
Например в upickle, можно определить type сообщения. И не надо строить абстракцию с костылями для определения типа.
upickle работает и на клиенте и на сервере

Юрий
13.12.2016
16:58:56
Не понял, о каких костылях речь?

Andrey
13.12.2016
17:00:08

Юрий
13.12.2016
17:01:34
Это не костыль, это нормальное решение. Как upickle решит проблему двух однотипных ответов? Вот сделал ты два раза подряд getUser. Что делать?

Andrey
13.12.2016
17:02:09

Nikolay
13.12.2016
17:02:21
в случае запрос-ответ - ориентироваться на requestId нормально. если сервер пушит данные на клиент - понятное дело что нужна метаинформация

Юрий
13.12.2016
17:02:38
Лол, это все проблемы одного слоя - слоя доступа к серверу

Andrey
13.12.2016
17:03:00
Что делать? а тут вариантов миллион. Все зависит от требований.
И это не может решать библиотека сериализации

Юрий
13.12.2016
17:03:54
Ну то есть пришли к тому, что upickle таки не решает проблему в общем случае

Andrey
13.12.2016
17:06:21
Сериализация сообщения != слой доступа к серверу

Andrey
13.12.2016
17:07:17
Это разные проблемы и решать их надо по разному
К слову, умение библиотеки сериализации самостоятельно определять тип сообщения. Не противоричит наличию requestID в слое доступа

Юрий
13.12.2016
17:08:01
Я вообще отвечал на вопрос выше, подходит ли пушка для случая, когда сервер пушит сообщения. Мой ответ - да подходит.

Andrey
13.12.2016
17:08:48
Вот. Подходит, но с неудобствами в виде неумения самой пушки понять, какое сообщение ей надо десериализовать. юпикл это умеет

Юрий
13.12.2016
17:09:04

Andrey
13.12.2016
17:11:48

Юрий
13.12.2016
17:13:11
Ну потому что просто типа не достаточно для работы с сокетом, а вопрос про это был

Google

Andrey
13.12.2016
17:14:04
Понятно, но это частный случай конечно

Юрий
13.12.2016
17:14:29
Ну без этого не обойтись для полноценной работы

web.num
13.12.2016
17:31:18
Всем привет, подскажите метод который находит подстроку в строке пожалуйста!

Aleksei
13.12.2016
17:33:58
в смысле находит?
индекс вхождения или просто типа есть или нет?

web.num
13.12.2016
17:41:39
есть или нет
как много методов в StringOps...

Nikita
13.12.2016
17:43:30
string1.contains(string2)

web.num
13.12.2016
17:45:07

Admin
ERROR: S client not available

Aleksei
13.12.2016
17:46:57
утром фримонады, вечером контэйнс =)

Alex
13.12.2016
17:47:27
Вечерний контэйнс)

Kirill
13.12.2016
17:48:22
Это же хорошо, что тут есть как entry-level, так и задроты

Anatoliy
13.12.2016
17:48:35

Nikolay
13.12.2016
17:55:47
Ну, я бы так и сделал

Pp
13.12.2016
18:11:26
http://paste.debian.net/902043/
почему такое может не работать?
http://doc.akka.io/docs/akka/2.4.11/scala/testing.html#Using_Multiple_Probe_Actors
вроде сделал все как в примерах в документации

web.num
13.12.2016
18:39:21
какая красота пополнять динамический массив : mArray.+= моиДействия;
Прям ваще ненарадуюсь....
Слышал о манадах, говорят буду в восторге от них ?

Google

Timothy
13.12.2016
18:42:14
>.+=
нет, только fold иначе забанят

web.num
13.12.2016
18:43:21
? ну вот....

Alex
13.12.2016
18:46:33
можно без точки

web.num
13.12.2016
18:47:24
выше сказали только fold ?

Nikolay
13.12.2016
18:48:14

web.num
13.12.2016
18:48:33
да

Nikolay
13.12.2016
18:49:08
все, зобаним точно

web.num
13.12.2016
18:50:13
ой да лдно вам.... я еще в дошколятах в scala.....

Nikolay
13.12.2016
18:50:57

web.num
13.12.2016
18:51:40
окЪ

Anatoliy
13.12.2016
18:53:40
смотри в глаза. var используешь?
это можно сделать без var?
protected[this] var users: HashSet[ActorRef] = HashSet.empty[ActorRef]
...
override def receive: Receive = LoggingReceive {
case Create(id, out, rh) =>
val child: ActorRef = injectedChild(childFactory(out, rh), s"userActor-$id")
users = users + child
sender() ! child

Nikolay
13.12.2016
18:54:05

Anatoliy
13.12.2016
18:54:16

Kirill
13.12.2016
18:54:16

Nikolay
13.12.2016
18:54:26
Можно через context.become
Почитай в доке

Nikolay
13.12.2016
18:54:52
как?
я не знаю конкретно про твой пример, но в куче языков нету var вообще

Anatoliy
13.12.2016
18:55:00

Nikolay
13.12.2016
18:55:04
и все можно сделать без него, в scala и подавно

Kirill
13.12.2016
18:55:34

Nikolay
13.12.2016
18:56:57