Igor
uwp закапывают же
а что вместо?
Ayrat
О, клин код закапывают на хабре https://habr.com/ru/post/508876/
Ayrat
наконец-то
Ayrat
Я её начал читать (давно, до фшарпа), но у меня случилась передозировка ООП и я подумал, что или я тупой, или все вокруг, которые эту книгу боготворили
Ayrat
Тогда я ещё не очень понимал как всё работает, поэтому своё мнение о книге оставил при себе.
Igor
О, клин код закапывают на хабре https://habr.com/ru/post/508876/
не знаю как эту (она хоть тоненькая) - а вот code complete давно в печку пора
Ayrat
а то мы так и не избавимся от AbstractFactoryGatewayManagerProvider
Igor
недавно (ну как, год назад) - купил новую редакцию чистого-кода в желтом переплете так и не начал читать) - чет вообще не тянет
Shub
Я её начал читать (давно, до фшарпа), но у меня случилась передозировка ООП и я подумал, что или я тупой, или все вокруг, которые эту книгу боготворили
нет, просто на хабре обитает особенно тупая публика, даже по меркам рунета. сейчас на хабре модно быть мамкиным бунтарем и нон-конформистом. полистай комменты, посмотри, чем они там восхищаются.
Igor
https://i.gyazo.com/15d6e8d30c749d55db0c504a3d76494f.png ну пздец, первым коментом такую макулатуру советовать (ну моооооооожет быть в 2008 году еще было ок)
Viacheslav
ух, бля
Igor
ух, бля
https://memepedia.ru/wp-content/uploads/2018/10/obezyana-mem.jpg в тоже самое время все любители f#
Vasily
Это профессионалы
Vasily
Если кому интересно, во что преобразовался мой вчерашний pr : https://github.com/fsprojects/Fabulous/pull/771
Viacheslav
как там было? "Зато писать на F# сможет НЕпрограммист, а математик, физик, химик или иной инженер."
Андрей
ух, бля
ну откуда им знать...
Denis
мне кажется пора делать "F# lives matter" или типо того
Denis
долой объективацию функциональных языков
Denis
скинем с себя оковы долбоебизма ярых фп-шников и ярых ооп-шников
Ayrat
я даже повкуривал 5 минут
Ilya
Сперва бы доказать, что фшарп функциональный. А для этого определить, какой язык является функциональным.
Igor
скинем с себя оковы долбоебизма ярых фп-шников и ярых ооп-шников
объединимся с кложиристами единым фронтом за прагматичное фп
Ayrat
Если кому интересно, во что преобразовался мой вчерашний pr : https://github.com/fsprojects/Fabulous/pull/771
можешь пояснить как это работает? /// Here we put an inbox into the "waiting" state and wait for render finishes Debug.WriteLine "View invoked" async{ inbox.Post (Blocked true) program.syncAction (fun()->updateView msg) () inbox.Post (Blocked false) } |> Async.Start return! loop (isRendering,state,false) Это код обработчика инбокса. Здесь мы асинхронно кладём сами себе Blocked true, Blocked false (при этом у нас в мейлбоксе может быть очередь сообщений и эти Blocked будут в очереди предположим сотые) А потом возвращаем isRendering = false, хотя вроде syncAction уже начался (асинхронно)
Ayrat
isRendering параметр в loop поменяется на true только когда мы обработаем первый месадж Blocked (хотя рендеринг уже идёт)
Ayrat
короче, я нихуя не понял.
Vasily
Идея какая - копить стейт, пока идёт обработка предыдущего
Vasily
Как только обработал предыдущий, смотрится, есть ли новые данные, и пинаются на обработку
Vasily
Условно, если рендер долгий
Vasily
Он будет происходить реже
Vasily
Независимо от числа апдейтов
Vasily
Я и хотел, чтобы ты глянул
Vasily
Мейлбокс неблокирующийся естественно
Ayrat
Как только обработал предыдущий, смотрится, есть ли новые данные, и пинаются на обработку
допустим. Но тут другое очередь mailbox: Render ---> Render isRendering: false async render process: stopped обрабатываем первый месадж Render, асинхронно стартуем рендер процесс, кладём Blocked true месадж в мейлбокс, нам ещё насовали Render в инбокс mailbox: Render --> BlockedTrue --> Render --> Render isRendering: false async render process: started!!! обрабатываем второй рендер. isRendering всё ещё false, стартуем ещё один ебучий рендер процесс, кладём ещё Blocked True месадж в мейлбокс, нам ещё насовали mailbox: BlockedTrue --> Render --> Render --> BlockedTrue --> Render --> Render isRendering: false async render process: started!!! async render process 2: started!!!
Vasily
Ну рендеры очень быстро отстреливают
Vasily
Которые блокированные
Ayrat
Ну рендеры очень быстро отстреливают
приведённый выше сценарий реальный
Ayrat
и всё зависит от шедулера тред пула
Vasily
Но над синхронизацией надо подумать
Ayrat
ну тут проблема в том что мы стартуем асинхронно рендер процесс, но мейлбокс об этом узнает из месаджа, который придёт недетерминированно
Vasily
Можно, конечно , сделать ещё один мейлбокм
Ayrat
надо просто мутабельную переменную сделать
Ayrat
вместо аргумента loop функции
Vasily
Мутабельная из асинка
Vasily
Ну хз
Vasily
Блок можно из асинка наружу вынести просто
Vasily
Который самый первый
Vasily
Хотя там тоже проскочит
Vasily
Тяжко всё
Ayrat
ну я бы впендюрил мутабельную переменную. Если ты боишься за захват кложуры, то передавай её явно byref
Vasily
Переменная порешает,да
Vasily
Если я цикл апдейта пропустил, нестрашно
Vasily
Хотя задачка, млин
Ayrat
то есть у тебя loop будет такой let mutable isRendering = false let rec loop(isRendering: byref<bool>, ...) return! loop(&isRendering, ...)
Ayrat
в теле лупа мутируем, да
Ayrat
никаких кложур, всё чисто.
Vasily
Да, блокировку сделаю мутаблом
Ayrat
да, тогда ты сразу будешь получать инфу о процессе рендеринга, не будет двойного старта рендер процесса и можно избавиться от месаджей Blocked
Vasily
От блока низя, наверное
Ayrat
ну у тебя блок теперь переменной выражается
Vasily
Я ж там запускаю дорендер
Vasily
На новый стейт
Ayrat
ну это можно по окончанию процесса рендера проверять колбеком каким
Ayrat
но да, может через очередь лучше
Vasily
Через очередь как-то спокойнее
Vasily
Блок делать через переменную, анблок событием дублировать
Vasily
По идее так будет правильнее
Ayrat
ну да
Vasily
Спасибо, этот момент и смущал в имплементации
Vasily
Приятно, когда можно с умными людьми посоветоваться
Vladislav
ныряем в темные глубины
Yaroslav
Подскажите, пожалуйста, как синхронизовать 2 ConcurrentDictionary У меня есть что-то типо сессии, одна сессия на одну группу, в ней хранятся обработчик команд для сессии и айдишники пользователей находящихся в сессии Есть менеджер сессий, его задача - отдавать сессию по айдишнику пользователя (один ConcurrentDictionary с ключом айдишника пользователя, где значение ссылка на сессию), и отдавать сессию по айдишнику группы (второй ConcurrentDictionary с ключом айдишника группы, где значение ссылка на сессию) Можно как-то обойтись без lock-а, и чего это будет стоить?
Aleksandr
ух, бля
Я как-то читал подобный код. Врагу не пожелаешь
Aleksandr
Все методы класса: void -> void
Aleksandr
Неявное программирование
Aleksandr
Не говоря уже о невозможности параллелизма на уровне методов
Viacheslav
Все методы класса: void -> void
Вот я себе нечто подобное и представил, да