Fork me on GitHub
#clojure-russia
<
2017-07-19
>
mike_ananev08:07:10

@dragoncube прикольно звучит постановка вопроса по-русски: "кто-нибудь Аркадия щупал?"

dragoncube08:07:34

Аркадиа - это она

misha08:07:05

it's a trap©

misha08:07:04

@artemyarulin я тут нотацию норм откопал вчера, курю: https://en.wikipedia.org/wiki/UML_state_machine http://www.uml-diagrams.org/state-machine-diagrams.html а то всякие Mealy и Moore стейт машины для электрических цепей с софтварой не справляются совсем

artemyarulin08:07:23

ты не обижайся но у меня вот эта картинка всплыла в памяти: http://cs8.pikabu.ru/post_img/2016/09/14/9/1473863411143474837.jpg

misha08:07:22

я денег никому не должен, могу и порефакторить kappa

artemyarulin08:07:54

Респект, но просто кажется что ты прям очень глубоко капаешь 🙂

misha08:07:38

ну я плеер с минимумом админ-контролов написал на одном-стейте™, и это жесть

misha08:07:07

кроме того, что там куча промежуточных флажков под ногами путается, из-за которых в тупые компоненты ифочки попротекали, на самом деле хрен пойми что в каком порядке кого вызывает/порождает

misha08:07:39

не говоря уже об и/о видео, звука и фетча новых видео и звука.

misha08:07:59

а апликейшен, блин, пара контролов и видосик.

misha08:07:58

так что я решил копнуть поглубже

artemyarulin08:07:52

думаешь state machine проще это сделает?

misha08:07:22

я курю нотацию, там уже проблема на компоненты разложена. что бы понимать, из каких деталей солюшен собирать

artemyarulin08:07:46

т.е. если ты диаграмму напишешь потом на основе кода то будет лечге разобраться, но код то темже сложным останется. Или ты что-то поменять в коде хочешь на основе нотаций?

misha08:07:05

если понимать компоненты, можно придумать как это наглядненько всё на 1 страницу edn'ом вывалить

misha08:07:50

мне кажется, что в итоге без визуального программирования не обойтись в том или ином виде

misha09:07:00

это может быть edn+macros, это может быть вебстраничка, которая генерит плейсхолдеры какие-то.

misha09:07:56

думаю сначала попробовать табличку организовать, по которой валидация будет просто проходить, вида "чувак, ты :guard/foo-bar забыл заимплементить"

artemyarulin09:07:13

Я тоже в свое время эксперементировал с диаграммами для бека https://github.com/artemyarulin/iokov/raw/master/error-flow-untyped.png идея вроде ничо, но в итоге сдался - если логика сложная то диаграмма будет не сильно проще

artemyarulin09:07:54

ааа, если не просто диаграмма то ня

misha09:07:03

ведь по большому счету, каждая страница/форма юая - маленький бекэнд, с тз проектирования

misha09:07:09

пусть даже не юай, а 20 корасинк каналов на бэкэнде. тоже ведь посмотреть со стороны на все сразу хочется

misha09:07:05

ну или табличкой описать всё сразу, а потом нагенерить или дописать(скорее всего) имплементацию, полноту которой можно таблицей отвалидировать

misha09:07:29

https://github.com/samroberton/bureaucracy на харель стейт чартах основана, что тоже слабее, чем для общего случая софтвари нужно

misha09:07:16

Now we can manually poke at the login state machine like this:

(bcy/event login-machine @db nil nil ::submit nil)
;=> {:app-db {}, :state-db {:state :logging-in}}
eew

razum2um09:07:38

язык для thread-safe говорили они… https://dev.clojure.org/jira/browse/CLJ-1528 troll 5 лет и 1.8 версия до фикса

misha09:07:12

(bcy/event nil nil nil nil nil :dude nil nil :come-on/man nil nil nil :plz nil nil nil : nil true)

misha09:07:04

@razum2um получается, что вот это вот тоже с рейс кондишеном?:

(reset! db (bcy/event login-machine @db nil ::update :username "sam"))

razum2um09:07:58

нет, рейс если commute+доступ наружу

misha09:07:20

ресет же как и свап функция будет ретраиться, если там очередь апдейтов атому собралась

misha09:07:16

понятно, что то для рефы, меня атомы больше интересуют : )

misha09:07:24

а то внезапный приступ паранойи

misha09:07:47

в https://clojure.org/about/state#_concurrency ни слова об атомах внезапно

razum2um09:07:19

@misha кстати да, но почти, если swap+@db то точно плохо, а тут сценарий такой - взяли @db, другой тред его обновил, сделали bcy/event и затерли результат другого треда. если устраивает, то норм

misha09:07:29

чуваки подсказывают брать (compare-and-set! atom oldval newval)

razum2um09:07:00

но вообще лучше конечно swap и функция, которая принимает db раз уж от него зависит

misha09:07:53

ну понятно, что применение такому найти можно. Просто поймал себя на мысли, что даже не задумываюсь в таких случая, о том, что там юзкейсы разные есть, а воспринимаю уже как leaf node, без ифочки

razum2um09:07:56

кстати про CAS, я тут с месяц пописал на эликсире, там get_and_update_in возвращает {старое-то-что-было-на-входе-CAS, новое-состояние} состояние а тут чтобы сделать очередь без джавы, надо извращаться https://stackoverflow.com/questions/43599473/get-the-state-of-an-atom-and-reset-it-atomically?

ssesutchenkov09:07:33

@misha если еще не видел - рисовалка в UML нотацию: http://plantuml.com/state-diagram

misha09:07:57

@ssesutchenkov оно жпеги выплевывает?

ssesutchenkov09:07:02

@misha png - точно, жипеги, svg - вроде тоже могет

misha09:07:03

надо интерактивное жеж. чтобы ты его ворочал, а оно тебе код базовый выплевывало, с дифами где чего поменялось и тд. кароче интерпрайз сразу

misha09:07:04

@ssesutchenkov имею ввиду "картинку", да. хотя может можно заморочиться, и на свг нацепить всяких драг-дропов. но думаю, что с нуля полехше получится

misha09:07:38

на реакте и с блекджеком

misha09:07:55

инвестиций поднять, смузишную свою в офисе сделать, парикмахерскую там же открыть, наклеек на лаптоп нарисовать, конференцию забацать... 😄

ssesutchenkov09:07:09

ну это тулза в одну сторону, я ее использую как плагин к idea - что-то накидал, посмотрел картинку, подумал, поменял. В обратную сторону - от диаграмм к кодогенерации - это действительно комбайны типа Sparx Architect, продуктов Rational / IBM и тыды

misha09:07:13

оно ж там наверное ацкую джаву или си++ генерит, а у нас edn, всё чистенько. не охота в интерпрайз ооп интеграции руки окунать. хочется всего лишь пару квадратиков со стрелочками между ними, и чтоб оно вектор векторов кивордов в файлик выплюнуло

ssesutchenkov09:07:37

мне удобно что исходник диаграммы в тексте и лежит в гите как часть проекта - там и дифы гитовые. "Оно" - да, на нескольких проектах наблюдал, как пробовали прикрутить эти комбайны, но всегда получалось что код отдельно, "картиночки" - отдельно. Иногда по исходникам C# / жавы реверсили диаграмки, ужасались и больше так не делали )))

misha10:07:25

@ssesutchenkov вообще, спасибо за ссылку. только я еще до имплементаций не добрался. хочу раздуплиться из чего проблема состоит, чтобы можно было оценивать адекватность и оверинженерность либ/плагинов/инструментов

misha10:07:46

дока по ссылке отличная, кстати

ssesutchenkov10:07:03

там есть гайд по всей разметке http://plantuml.com/PlantUML_Language_Reference_Guide.pdf

misha10:07:45

You can change the color of individual arrows using the following notation:
нужно Ричу денег дать за edn kappa

misha10:07:54

2. State Guidelines
 * State Names Should be Simple but Descriptive

malch11:07:14

Смотри deref-swap! и queue

misha11:07:22

не понял, зачем deref-swap! нужен, если есть просто свап

misha12:07:58

а, оно возвращает старое значение. а когда такое нужно вообще?

misha12:07:59

подсказывают

(def queue (atom clojure.lang.PersistentQueue/EMPTY))

(defn push! [x]
  (swap! queue conj x))

(defn pull! []
  (-> queue (deref-swap! pop) peek))