Андрей
а нужен ли он для сайтика на 8 page?
Гемора меньше в любом случае.
Андрей
Хоть 1 страница.
Anonymous
Гемора меньше в любом случае.
ну вот в vue там вроде MVVM фрейм, а что такое реахт вообще не понятно, там то же можно MVVM?
Anonymous
Нет, смысла нет.
а какой там паттерн проектирования?
Anonymous
а какой там паттерн проектирования?
one-way data propagation. А уже на базе него и context, и flux/redux
Anonymous
все равно не понимаю ничего, надо что то прочесть наверное
Artem Kasapchuk
one-way ) Да просто иммутабельный объект в котором хранится весь стейт приложения и чистые фукнции доступа
Artem Kasapchuk
товарищи вы как заклинания читаете)
p
привет, подскажите, как лучше в папку с билдом после вебпака ssl сертификат добавлять? плагин какой-то для копирования подключать или другой подход есть?
Anonymous
one-way ) Да просто иммутабельный объект в котором хранится весь стейт приложения и чистые фукнции доступа
Не обязательно. MobX как бы мутабеленый подход практикует) еще react это TFRP то бишь функциональное реактивное программирование
Artem Kasapchuk
старый добрый паттерн Наблюдатель в более красивой обертки)
Artem Kasapchuk
я с Mobx не сталкивался, но мутабельный стейт хорош, когда он огромен, в противном случае с иммутабельным проще
Anonymous
кто то может подсказать про PREHEADER в письме? текст в нем идет на push, но он игнорирует пробелы в конце и сразу сует туда текст не находящийся в div для PREHEADER
Anonymous
типо такого вот говна и нужно чтобы кроме него ничего не было в пушах
Illia
\n пробовал?
Богдан
я с Mobx не сталкивался, но мутабельный стейт хорош, когда он огромен, в противном случае с иммутабельным проще
В mobx мутабельности столько же сколько и в redux-е. Просто из-за того что в редаксе один стор а в mobx-е сторов много, то может показаться что там все мутабельно. Но на самом деле то что выглядит мутабельным, например user.firstName = "..." является установкой нового значения целого стора - user.firstNameStore.set("...") точно так же как и в redux происходит установка нового значения которое вернули редюсеры после диспатча
Anonymous
В mobx мутабельности столько же сколько и в redux-е. Просто из-за того что в редаксе один стор а в mobx-е сторов много, то может показаться что там все мутабельно. Но на самом деле то что выглядит мутабельным, например user.firstName = "..." является установкой нового значения целого стора - user.firstNameStore.set("...") точно так же как и в redux происходит установка нового значения которое вернули редюсеры после диспатча
Советую почитать эту статью: https://hackernoon.com/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254 MobX использует граф состояний и вычисляет конечный финальный стейт только при необходимости (лениво) еще и мемиизируя его. Пока это не произошло ты именно мутируешь это дерево или скорее derivation stack.
Anonymous
@xbgnx можешь узнать у Roman Sharkov как там статья пишеться, ну про скорую кончину DOM-а и всерешающего васма и грядущей mais la révolution?)
Богдан
Советую почитать эту статью: https://hackernoon.com/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254 MobX использует граф состояний и вычисляет конечный финальный стейт только при необходимости (лениво) еще и мемиизируя его. Пока это не произошло ты именно мутируешь это дерево или скорее derivation stack.
в той статье описан видимо старый и не самый эффективный алгоритм Counting the number of ready / stale messages will ensure that, for example, computed value ‘4’ will only re-evaluate after computed value ‘3’ has become stable., сейчас mobx использует более эффективный способ вызова подписчиков, советую почитать эту статью https://habrahabr.ru/post/349022 А насчет мутаций то там происходит мутирование не дерева а значений сторов - то есть например стор const AppStore = {firstName: observable("vasya"), lastName: observable("pupkin")} аналогичен двум redux-сторам const AppStore = {firstName: createStore(...), lastName.createStore(...)} и когда в mobx мы как будто мутируем user.firstName = "..." то декоратор вызовет сеттер а тот сделает user.firstName.set(...) и этот мини-стор firstName установит новое значение стора точно так же как в варианте с редаксом установится новое значение firstName стора которое вернут редюсеры после вызова user.firstName.dispatch(...). То есть вся разница в том что в redux-е используется один стор и необходимость возвращать иммутебельное значение стора вынуждает пересоздавать вложенные объекты то в mobx несмотря на точно такую же необходимость возврата иммутабельного значения стора (потому что иначе он не поймет нужно ли вызывать подписчиков) но благодаря возможности создавать отдельный стор на каждую ячейку и поле в объекте не нужны такие манипуляции с пересозданием объектов в редюсерах и mapStateToProps потому что можно просто создать отдельный стор на каждое поле в глубоком объекте состояния и компоненты будут подписываться на каждое такое поле независимо от других полей
Anonymous
Нет, это ты пиаришь свою библиотеку bgnx/xmob на хабре, а на медиуме как раз объяснение как работает mobX от самих разработчиков, на эту статью даже FAQ официальной документации ссылается Не вводи людей в заблуждение!
Богдан
Нет, это ты пиаришь свою библиотеку bgnx/xmob на хабре, а на медиуме как раз объяснение как работает mobX от самих разработчиков, на эту статью даже FAQ официальной документации ссылается Не вводи людей в заблуждение!
ха, я не пиарю я просто написал мини-версию чтобы объяснить алгоритм который используется в mobx. Ок если верить официальным источникам то может тогда верить и этому докладу от автора https://www.youtube.com/watch?v=TfxfRkNCnmk ? В том докладе как и на медиуме автор очень упрощенно объяснил алгоритм чтобы не перезагружать читателя деталями. Я выше привел цитату из статьи Counting the number of ready / stale messages will ensure that, for example, computed value ‘4’ will only re-evaluate after computed value ‘3’ has become stable.Этот алгоритм будет допускать лишние перерасчеты в то время как в mobx в исходниках используется более усовершенствованный алгоритм который я и объяснил в статье на хабре
Konstantin
https://i.gyazo.com/b7f98fe42146f41fd98d8d459190e4bf.png
Konstantin
рисую два multiple-селекта
Konstantin
почему-то всегда выбран первый элемент
Konstantin
не могу победить
Konstantin
дико что в 21 веке есть такие проблемы)
Anonymous
Ты в своей библиотеке как раз таки используешь давно себя изжитый метод dirty-check, который например использовался в Angular 1.x, но в моследствии даже они от него отказались. MobX работает не так!
Anonymous
в той статье описан видимо старый и не самый эффективный алгоритм Counting the number of ready / stale messages will ensure that, for example, computed value ‘4’ will only re-evaluate after computed value ‘3’ has become stable., сейчас mobx использует более эффективный способ вызова подписчиков, советую почитать эту статью https://habrahabr.ru/post/349022 А насчет мутаций то там происходит мутирование не дерева а значений сторов - то есть например стор const AppStore = {firstName: observable("vasya"), lastName: observable("pupkin")} аналогичен двум redux-сторам const AppStore = {firstName: createStore(...), lastName.createStore(...)} и когда в mobx мы как будто мутируем user.firstName = "..." то декоратор вызовет сеттер а тот сделает user.firstName.set(...) и этот мини-стор firstName установит новое значение стора точно так же как в варианте с редаксом установится новое значение firstName стора которое вернут редюсеры после вызова user.firstName.dispatch(...). То есть вся разница в том что в redux-е используется один стор и необходимость возвращать иммутебельное значение стора вынуждает пересоздавать вложенные объекты то в mobx несмотря на точно такую же необходимость возврата иммутабельного значения стора (потому что иначе он не поймет нужно ли вызывать подписчиков) но благодаря возможности создавать отдельный стор на каждую ячейку и поле в объекте не нужны такие манипуляции с пересозданием объектов в редюсерах и mapStateToProps потому что можно просто создать отдельный стор на каждое поле в глубоком объекте состояния и компоненты будут подписываться на каждое такое поле независимо от других полей
Круто! То что надо! Как раз хочу напистаь свой стейт менеджер
Богдан
Ты в своей библиотеке как раз таки используешь давно себя изжитый метод dirty-check, который например использовался в Angular 1.x, но в моследствии даже они от него отказались. MobX работает не так!
дык, так автор с том своем докладе его и привел со словами "how mobx solve glitch problem is " говоря о том что типа mobx так и работает https://www.youtube.com/watch?v=TfxfRkNCnmk . И в статье есть цитата Counting the number of ready / stale messages что по сути тот же dirty-clean метод. Я же в статье привожу этот и еще один алгоритм основанный на топологической глубине как примеры а потом объясняю более усовершенствованный алгоритм который используется в mobx и моей мини-версии xmob
Богдан
Ты в своей библиотеке как раз таки используешь давно себя изжитый метод dirty-check, который например использовался в Angular 1.x, но в моследствии даже они от него отказались. MobX работает не так!
немного не так - тот алгоритм dirty-check который используется в ангуляре вообще совсем другой подход еще хуже чем тот алгоритм который автор привел в докладе который кстати тоже называется "dirty", но только не "-check" а "-clean"
Anonymous
еще раз повторю mobX использует структурное или обычное (shallow) сравнение, а не dirty check https://github.com/mobxjs/mobx/blob/a867e87788a3aeb5d03a0a99f8379c13edd6be25/src/api/computed.ts#L75
Богдан
еще раз повторю mobX использует структурное или обычное (shallow) сравнение, а не dirty check https://github.com/mobxjs/mobx/blob/a867e87788a3aeb5d03a0a99f8379c13edd6be25/src/api/computed.ts#L75
структурное сравнение это совсем другое - я говорил про алгоритм вызова подписчиков после того как изменилось значение ячейки (когда нельзя просто в цикле вызвать подписчиков после того как проверили value !== newValue или !shallowCompare(value, newValue) )
Anonymous
Так, я смотрю повторяется наш недавний спор о Canvas-е и Skia. Помнишь чем все закончилось? Я если честно не вижу смысла с тобой спорить, как то надоело уже. Просто не вводи людей в заблуждение
Богдан
Так, я смотрю повторяется наш недавний спор о Canvas-е и Skia. Помнишь чем все закончилось? Я если честно не вижу смысла с тобой спорить, как то надоело уже. Просто не вводи людей в заблуждение
зачем съезжать - есть вопросы или аргументы - приводи. Никто не может знать все на свете. Вдруг я тоже ошибаюсь. Я пока пытаюсь объяснить что есть разные независимые части библиотеки - одна часть просто сравнит новое значение с текущим и как она будет делать неважно - либо строгое сравнение value !== newValue либо стуктурное shallowCompare(value, newValue) или вообще глубокое deepEqual(value, newValue) - неважно важно что после того как это сравнение произойдет нужно будет либо вызвать подписчиков (если несовпало) либо ничего не делать. А вот дальше уже есть вторая часть и сравнение этих самых алгоритмов вызова подписчиков. Первый вариант можно прямо в цикле вызвать this.subscribers.forEach(sub=>sub()) но очевидно что будут лишние перерасчеты для ромбовидных зависимостей. Дальше автор mobx-а в докладе приводит алгоритм dirty-clean который прежде чем вызвать подписчиков рекурсивно пометит их как diry а потом как clean и вызовет их в порядке сброса dirty до нуля и таким образом можно избежать лишних перерасчетов но не всех. Дальше есть еще как вриант алгоритм вызова подписчиков отсортировав их по глубине что будет эффективней но все равно будут лишние перерасчеты в некоторых ситуациях ну и есть последний правильный алгоритм который избежит всех лишних перерасчетов
Дима
зачем съезжать - есть вопросы или аргументы - приводи. Никто не может знать все на свете. Вдруг я тоже ошибаюсь. Я пока пытаюсь объяснить что есть разные независимые части библиотеки - одна часть просто сравнит новое значение с текущим и как она будет делать неважно - либо строгое сравнение value !== newValue либо стуктурное shallowCompare(value, newValue) или вообще глубокое deepEqual(value, newValue) - неважно важно что после того как это сравнение произойдет нужно будет либо вызвать подписчиков (если несовпало) либо ничего не делать. А вот дальше уже есть вторая часть и сравнение этих самых алгоритмов вызова подписчиков. Первый вариант можно прямо в цикле вызвать this.subscribers.forEach(sub=>sub()) но очевидно что будут лишние перерасчеты для ромбовидных зависимостей. Дальше автор mobx-а в докладе приводит алгоритм dirty-clean который прежде чем вызвать подписчиков рекурсивно пометит их как diry а потом как clean и вызовет их в порядке сброса dirty до нуля и таким образом можно избежать лишних перерасчетов но не всех. Дальше есть еще как вриант алгоритм вызова подписчиков отсортировав их по глубине что будет эффективней но все равно будут лишние перерасчеты в некоторых ситуациях ну и есть последний правильный алгоритм который избежит всех лишних перерасчетов
tl dr 🙂 как ты пишеш такую простыню?
Дима
зачем съезжать - есть вопросы или аргументы - приводи. Никто не может знать все на свете. Вдруг я тоже ошибаюсь. Я пока пытаюсь объяснить что есть разные независимые части библиотеки - одна часть просто сравнит новое значение с текущим и как она будет делать неважно - либо строгое сравнение value !== newValue либо стуктурное shallowCompare(value, newValue) или вообще глубокое deepEqual(value, newValue) - неважно важно что после того как это сравнение произойдет нужно будет либо вызвать подписчиков (если несовпало) либо ничего не делать. А вот дальше уже есть вторая часть и сравнение этих самых алгоритмов вызова подписчиков. Первый вариант можно прямо в цикле вызвать this.subscribers.forEach(sub=>sub()) но очевидно что будут лишние перерасчеты для ромбовидных зависимостей. Дальше автор mobx-а в докладе приводит алгоритм dirty-clean который прежде чем вызвать подписчиков рекурсивно пометит их как diry а потом как clean и вызовет их в порядке сброса dirty до нуля и таким образом можно избежать лишних перерасчетов но не всех. Дальше есть еще как вриант алгоритм вызова подписчиков отсортировав их по глубине что будет эффективней но все равно будут лишние перерасчеты в некоторых ситуациях ну и есть последний правильный алгоритм который избежит всех лишних перерасчетов
Не уверен, что такие эпитеты как "правильный" здесь стоит применять)
Дима
Ты не читал пейпер что я скидывал недавно?
Богдан
tl dr 🙂 как ты пишеш такую простыню?
😊 я просто не трачу время на запятые)
Дима
Лайфхак!
Богдан
Не уверен, что такие эпитеты как "правильный" здесь стоит применять)
правильный в том смысле что нет багов с лишним перерасчетом) ну ок, пусть будет не "правильный" а оптимальный или эффективный
Богдан
Ты не читал пейпер что я скидывал недавно?
он слишком академический я его так и не понял)
Дима
Нельзя полагаться на то, что мемоизация всего подряд будет эффективнее чем редкие тяжёлые пересчеты
Дима
Так как помимо O есть так же и понятия об отношениях объектов с gc
Дима
Zipper в общем случае — это курсор навигатор, в котором понятия перемещения по дереву являются первоочередными
Дима
Для него не существует прошлого состояния вообще
Дима
https://www.cs.tufts.edu/~nr/pubs/zipcfg.pdf
Дима
An Applicative Control-Flow Graph Based on Huet’s Zipper
Дима
При чтении держать в голове, что спустя 12 лет идеи изложенные здесь можно запускать в жс непосредственно) Подвёл только слегка устаревший диалект окамла
Дима
Там главное не пытаться понять то, что не понимается) Это нормально, что часть текста в пейперах не усваивается никак
Дима
В середине текста изложение идеи о том, к каким проблемам ведёт "ооп" подход к рассчёту обсерваблов и почему они выбрали аппликатив
Дима
То есть авторы то конечно пишут про компиляторы, но на данном уровне абстракции это вообще не важно)
Дима
Ближе к концу пейпера схематично описывают концепцию зиппера, бегающего по графу зависимостей не трогая стек
Дима
Ну точнее как схематично — я скомпилировал их код через баклскрипт в жс и благодаря чему осознал одну довольно клёвую штуку)
Дима
tl;tr: вместо того чтобы определять статус обновления всей ветви графа, достаточно тупо выделить левый, правый, верхний и нижний узел)
Богдан
tl;tr: вместо того чтобы определять статус обновления всей ветви графа, достаточно тупо выделить левый, правый, верхний и нижний узел)
интересно, осталось только понять суть алгоритма, или хотя бы на примере какую проблему он решает. Я так понял это больше применение алгоритма похожего на mobx для эффективной реализации иммутабельности? Или он относится именно к вычислениям и поддержанию дерева мемоизированных функций как в mobx?
Дима
да
Anonymous
Вот еще одна статья от тех же авторов, только 2010го года: https://www.cs.tufts.edu/~nr/pubs/hoopl10.pdf
Дима
Да да да)
Дима
И уже на хаскеле)
Дима
Я за время с этого диалога довольно много таких структур уже нашёл
Дима
Пока рациональнее всего выглядит идея замутить что-нибудь на Mealy machine
Дима
Это, как оказалось, огромное направление в computer sience
Дима
Более того, тут вообще оказывается рядом с мобиксом и редаксом в паре шагов нерешённые проблемы математики)
Zak
Всем даров) помогите нубу плез
Zak
Перечитал и не понял твоего сообщения
Дима
Всем даров) помогите нубу плез
https://t.me/joinchat/Be4rsT3Uyr1TjmSlrRc77g
Zak
Спасибо)
Anonymous
Пока рациональнее всего выглядит идея замутить что-нибудь на Mealy machine
Советую тогда глянуть вот это: https://github.com/krasimir/stent
Дима
Видел уже конечно)
Дима
У меня немного странная идея, но я убеждён, что описывать стейт как объект с полями нерационально