
Vasily
27.06.2018
12:35:01
Так, походу, надо мтпрото телеграма менять

Andrew
27.06.2018
12:35:35
Не в проксях дело
Там у телеги самой какие то траблы

Vasily
27.06.2018
12:36:27
Да, действительно

Google

Vasily
27.06.2018
12:54:20
Такс, у меня есть вопросы по акке
Допустим, есть пользовательская сессия
С некоторым состоянием
КОторое я не хочу хранить в базу

Ayrat
27.06.2018
12:55:00
сделай под неё актора! (это ответ на любой вопрос в акке)

Vasily
27.06.2018
12:55:09
Вопрос
Как мне правильно написать актора, который будет этот стейт хранить
В памяти

Ayrat
27.06.2018
12:55:57
Как обычный класс :D
класс у тебя ж висит в памяти, просто полей туда добавь и всё

Vasily
27.06.2018
12:56:17
Так

Ayrat
27.06.2018
12:56:23
А, F# Chat
вспомнил

Google

Ayrat
27.06.2018
12:56:28
:D

Vasily
27.06.2018
12:56:35
КОгда я делаю actorOf, что происходит?
Если актор уже создан, вернется ссылка на него или создастся новый?

Ayrat
27.06.2018
12:57:06
ща пример скину
ты актору имя задаёшь, по имени (который адрес) он может только один такой быть

Vasily
27.06.2018
12:57:43
Один инстанс?

Ayrat
27.06.2018
12:57:53
по одному ActorPath один актор
но тебе ничего не мешает создавать их так
superactor-1
superactor-2
...

Vasily
27.06.2018
13:00:02
Ну мне и нужен один инстанс, в общем-то

Ayrat
27.06.2018
13:01:47
Ок. если вопрос про то как добавить полей в актора F#, то банально замыканиями накидай let'оф перед рекурсивной функцией
ну обычно короче

Vasily
27.06.2018
13:02:12
А в loop можно стейт передавать,да?

Ayrat
27.06.2018
13:02:30
ну конечно, ты ж его сам объявляешь.
https://github.com/Szer/Akka.FSharp.ActorMonitoring/blob/5675b2a154f3f9bed6ae56cb1b3582dbe5137b1b/src/Akka.FSharp.ActorMonitoring/BaseActor.fs#L22
это совсем уж функциональненько будет - стейты в лупе прокидывать. Можно как хочешь делать в общем

Vasily
27.06.2018
13:04:01
Ну мне важен именно вопрос сохранения стейта внутри сессии
Мда, кто ж так пакеты пишет, подсовываешь Json 11 версии, пишет, что хочет 9-ю О_О

Andrew
27.06.2018
14:24:17
Можно каким либо образом кастить DU типы?
Мб какие то хаки есть

Evgeniy
27.06.2018
14:26:28

Google

Friedrich
27.06.2018
14:27:58

Andrew
27.06.2018
14:30:45
Что ты хочешь сделать?
Ну смотри, у меня есть
and BlockStatement = VariablesScope * Statement list
И есть
and Statement =
|...
| BlockStatement of BlockStatement
Есть парсер для BlockStatement
let blockStatement =
pipe2 (symbol OPENCURLY >>. localDeclarations) (statements .>> symbol CLOSECURLY)
(fun a b -> Ast.BlockStatement (a, b))
Но он возвращает Statement а не BlockStatement
Потом из-за того что там Statement на выходе, у меня в AST вместо BlockStatement используется Statement, например
and FunctionDeclaration = Identifier * Parameters * TypeSpec * Statement
Все бы ничего, но у меня есть функция когда я семантический анализ делаю, которая должна принимать именно BlockStatement, а я не могу этот Statement привести к BlockStatement

евроневидимка
27.06.2018
14:32:21

Andrew
27.06.2018
14:32:46
(match blockStatement with Ast.BlockStatement x -> x)
Очень костыльно, но теперь не ругается

евроневидимка
27.06.2018
14:34:56
в функцию б вынес

Andrew
27.06.2018
14:36:00
Просто показал не окончательный вариант)

евроневидимка
27.06.2018
14:36:48
в функции можно заюзать function
короче получится

Andrew
27.06.2018
14:36:54
+
Так и сделал

Pavel
27.06.2018
17:00:09

Ayrat
27.06.2018
17:40:10

евроневидимка
28.06.2018
02:26:10
Так и сделал
Кстати, я недавно охуел и сразу же забыл, что можно сразу писать
let block (BlockStatement(x)) = x
Вспомнил только щас

Pavel
28.06.2018
02:40:32
в теории можно, на практике нет

евроневидимка
28.06.2018
02:56:48
Ну если где-то потом поймать MatchFailureException, то можно, но проще так вообще не делать

Friedrich
28.06.2018
03:35:17
Зачем его ловить? Юзай этот синтакс в случаях, когда известно наверняка, что всё сматчится.
Я вот так, например, использую в сочетании с однокейсовыми DU: https://github.com/ForNeVeR/nightwatch/blob/2641e1c32a437ece0c12ad047fb2ac3da55651a3/Nightwatch.Core/FileSystem.fs#L13

евроневидимка
28.06.2018
03:42:34

Friedrich
28.06.2018
03:42:51

Google

евроневидимка
28.06.2018
03:43:22
А, ну да

Friedrich
28.06.2018
03:43:29
Чтобы мне в Path не передали какие-нибудь левые строки.

евроневидимка
28.06.2018
03:44:00

Friedrich
28.06.2018
03:44:05
Как?

евроневидимка
28.06.2018
03:44:05
Обернуть только придется

Friedrich
28.06.2018
03:44:15
Ну, если оборачиваешь — значит, думаешь!

евроневидимка
28.06.2018
03:44:24
Правая строка

Evgeniy
28.06.2018
04:32:03
https://fsharpforfunandprofit.com/posts/designing-with-types-single-case-dus/
Какие еще есть варианты? Классы и хак с тегами для единиц измерений?

Vasily
28.06.2018
06:53:37
Интерфейсы

Roman
28.06.2018
07:57:22

Ayrat
28.06.2018
07:58:09
Молодец он) и @gsomix молодец

Vasily
28.06.2018
08:14:14
Чет не могу понять, как в f# akka правильно стейт актора вернуть
Пишут, что ask это фуфуфу

Ayrat
28.06.2018
08:14:46
Вернуть стейт? Это как? Зачем? Стейт инкапсулирован внутрях

Vasily
28.06.2018
08:15:08
Или всякие репозитории лучше делать традиционно?

Ayrat
28.06.2018
08:15:20
Ща, 5 мин до работы дойду, расскажу и пример покажу

Vasily
28.06.2018
08:15:22
Типа доступа к бд этц

Ayrat
28.06.2018
08:19:52
Почему ask это фуфуфу -
Есть причина перформанса. Аск создаёт виртуального актора который будет дожидаться ответа от опрошенного. Если на моей тачиле получается прогонять 4кк месаг в секунду (ин процесс) через tell, то асками в 10 раз меньше.
но это не самое главное
самое главное что при использовании ask ты должен ожидать того что ответа ты не получишь

Google

Vasily
28.06.2018
08:20:43
Ну это понятно


Ayrat
28.06.2018
08:20:51
аск по умолчанию висит вечно, т.е. актор застопит обработку сообщений. Можно класть таймаут вторым аргументом и ловить ексепшн (акка делает так), можно в конфиге глобальном нгастроить таймаут дефолтный на все аски
как делать следует
точнее начну с другого) асками пользуются те кто не отошёл от процедурного програмирования в модели акторов. Т.е. вызвал процедуру (кинул аск актору), дождался возврата процедуры (ответа актора), работаем дальше.
Это нифига не реактивно, стопит обработку мейлбокса, добавляет проблем
Message-driven системы работают не так.
У акторов как известно есть 3 супер способности:
1) они могут создать конечное кол-во детей
2) они могут отправить конечное кол-во сообщений другим акторам
3) (важное) они могут поменять своё поведение перед обработкой следующего сообщения
вот про последнюю особенность надо подробнее.
Чтобы реализовать вопрос ответ я пользовался стейтами. Например у меня тяжёлая работа с БД в сотню потоков, на каждый поток по актору, каждый такой актор находится в состоянии Busy, Idle. В Busy он все принятые сообщения кладёт в стеш, по окончанию Busy вываливает стеш в мейлбокс, продолжает работу. Так же он знает ActorRef куда надо заслать результат
есть акторы которые дожидаются ответа от такого актора, но делают они это тоже реактивно, т.е. сигнализируют другим о своём состоянии ожидания а не тупо вешают себя в ожидании ask. Ответ приходит им в мейлбокс в виде типизированного месаджа SqlResponse например, который они умеют обрабатывать в состоянии ожидания ответа.
Могу пример на C# показать


Vasily
28.06.2018
08:27:25
Ну смотри, у меня есть актор, через который я лезу в базу
У него есть метод List
Как мне правильно результат List вернуть и куда?

Ayrat
28.06.2018
08:28:10
Нене, у актора не бывает методов, у него есть реакции на входящие сообщения

Vasily
28.06.2018
08:28:23
Да, я неверно выразился
Он принимает сообщение List

Ayrat
28.06.2018
08:28:44
Не, метод ты сделать можешь, но лучше сразу мыслить в message-driven стиле, станет проще
Смотри. Тебе приходит List<'a>, ты его обрабатываешь и возвращаешь Sender List<'b> например
сендер может реагировать на сообщения вида List как-то своим образом

Vasily
28.06.2018
08:30:13
Пока выглядит так, что у меня сверху должен быть актор, который действительно принимает списки

Ayrat
28.06.2018
08:30:19
но лучше такие примитивные типы не пересылать, типизируй месаджи

Vasily
28.06.2018
08:30:35
Да это понятно

Ayrat
28.06.2018
08:30:47
А можешь задачу вкратце?

Vasily
28.06.2018
08:31:06
Ну вкратце клиент платежного терминала
Есть список услуг для оплаты