Fork me on GitHub
#clojure-russia
<
2016-12-10
>
Kira Sotnikov07:12:27

так сикп был всю жизнь на лиспе

niquola08:12:47

Начинать наверно все равно с чего - так или иначе придется прикоснуться ко всему. Начать с хорошей экосистемы мне кажется хорошо. @goplon учи java, JavaScript и clojure одновременно ;)

artemyarulin08:12:46

оффтоп: https://meebleforp.com/blog/36/angular-2-is-terrible Чо там реально так все ужасно? Никто тут не юзал второй? Я первый ангуляр юзал года 3 наверно назад и было говно да, но вроде как же переписали

niquola09:12:20

У меня есть хорошие отзывы

niquola09:12:30

Первый позволяет быстро делать работающие мордочки минимальным количеством кода - как рельса для ui, легок в освоении в user space, сложен внутри. А вот распухшие приложения на редуксе с реактом это действительно гавно от жопоруких фронтендеров

niquola09:12:45

Реакт хорош только когда его упрятали в reagent или rum

niquola09:12:14

Т.е. только виртуальным домом

seryh10:12:37

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

niquola10:12:12

В чем ад выражается?

niquola10:12:39

Для меня ад - много лишнего неоправданного кода

niquola10:12:45

Заабузить можно любой инструмент, но в среднем на ангулярчике кода обычно в раза два-три меньше чем на реактике

niquola10:12:24

Реактивные атомы с reagent почти тоже самое что angular digest

seryh10:12:40

при стихийном развитии SPA и безудержной фантазии UI дизайнеров. приходится часто шарить различного рода данные из одного компонента в другой. в ангуляре у меня были с этим проблемы уже на довольно небольшом приложении. деталей уже не помню давно ангуляр в руках не держал.

seryh10:12:18

еще код UI библиотек довольно сложный. а его часто бывает нужно подхачить под себя

artemyarulin10:12:48

>А вот распухшие приложения на редуксе с реактом это действительно гавно @nicola А чо кста плохого? Я просто без single application state уже как-то слабо себе представляю разработку и думал что редукс для ЖСников это очень даже годно не?

niquola11:12:37

Многакодазачем?

niquola11:12:10

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

savelichalex11:12:35

@nicola а что ты конкретно понимаешь под lifecycle? я просто видимо не очень понимаю какой может быть у стэйта lifecycle

niquola12:12:59

Ну представь например админку и управление пользователями и например управление очередью рассылок. Зачем тебе пользователи когда ты на странице очередей и наоборот.

savelichalex12:12:08

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

niquola12:12:05

Все равно нужно с сервера подтягивать или синкать

savelichalex12:12:11

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

niquola12:12:44

Ну дак будешь в отдельной веточке хранить которая синкаетя по своим правилам - я и говорю это отдельный стэйт

savelichalex12:12:43

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

savelichalex12:12:38

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

savelichalex12:12:11

вообще в какой то степени те же subscriptions из re-frame это и есть запрос, как select в sql

a.espolov12:12:43

Зря вы так на ангуляр, вполне себе ок. Жаль нужно думать где данные хранить - про < 2 версии

a.espolov12:12:00

С redux проблемы не вижу за исключением множества файлов, но это ж жс

a.espolov12:12:14

Почему Вам не нравиться om?) Там всего то осталось прикрутить интерфейс к омовским компонентам для реализации не оптимистичных адептов + второй интерфейс для того чтобы транслировать ключи запросов ома в урлы, а параметры запросов ома в параметра реквеста

a.espolov12:12:37

Реализация первого уже есть в untangled

leov14:12:48

гм. а кто-нибудь может объяснить идею реактивных атомов в реагенте?

leov14:12:06

я могу понять ом (который om now) и курсоры - это вроде мне близко. есть один атом. мы на него подписываемся. в атоме огромное дерево. мы меняем часть дерева и смотрим на часть дерева в каждом компоненте по какому-то пути. это типа "курсор" или там "линза". если эта модель (дерево) не соответствует UI - ну не повезло. не работает.

leov14:12:24

а в чём таки идея реактивных атомов по сравнению с этим я чё-то так и не догоняю

leov14:12:34

ну и второй вопрос - я так понимаю ом.некстом никто не пользуется и на него все забили?

andre14:12:57

реактивный атом следит за дерефом

andre14:12:41

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

andre14:12:19

если результат изменится он передаст его реакту на отрисовку

artemyarulin14:12:27

дереф это чо?

andre14:12:49

deref или @

andre14:12:59

как в обычном атоме

artemyarulin14:12:11

>реагент будет следить за дерефом этого ратома и если произойдет дереф

andre14:12:18

правильно

artemyarulin14:12:26

не оч понял кто за кем следит

andre14:12:38

т.е. если я передам реагенту [:div @text]

andre14:12:49

реагент будет следить за дерефом text

artemyarulin14:12:24

дак дереф это же просто чтение значения? Если я в другом месте сделаю атому дереф то у меня ререндер произодйдет чтоль?

andre14:12:28

и если я сделаю swap! text , то реагент это отследит и перевыполнит [:div @text]

andre14:12:42

это особенность ratom

andre14:12:44

это его фишка

andre14:12:52

что можно следить когда ему делают deref

artemyarulin14:12:52

все жисть делал swap! text

artemyarulin14:12:12

а тьфу ты, там же свои атомы (ратомы точнее)

andre14:12:13

опечатался

andre14:12:52

да, фишка ratom именно в этом, в остальном он как обычный atom

artemyarulin14:12:25

дак все же - если я в другом месте сделаю (println “LOG:” @text) то у меня произойдет ре-рендер? Или именно тока изменения атома мониторятся а не дерефы все?

andre14:12:30

не знаю откуда я взял про дереф, по идее чтение не должно конечно вызывать ре-рендер

andre14:12:50

изменения наверное

artemyarulin15:12:17

А я могу как со всякими омами подписаться на часть ратома тока?

artemyarulin15:12:21

аля курсоры

artemyarulin15:12:14

сори что я тут а не ртфм, лень 🙂

andre15:12:50

можешь создавать ратом 🙂

andre15:12:16

т.е. ту часть на которую хочешь подписаться он обернет и вернет тебе ратом

artemyarulin15:12:23

аа, все я понял реагент, спасиб:)

andre15:12:56

т.е. у тебя есть app-db ратом, а ты хочешь :my-value из app-db, делаешь def rct (make-reaction (:my-value @app-db))

andre15:12:07

ну и rct это теперь ратом за которым ты можешь следить

andre15:12:10

ну или реагент 🙂

andre15:12:38

может следить

leov15:12:19

а в чём идейная разница по сравнению с омом классик? по сравнению с курсорами и линзами?

andre15:12:14

@artemyarulin может подскажет,  к счастью только реагент знаю

niquola15:12:28

Когда компонент рендерится реагент запоминает какие атомы или курсоры дерефились и подписывает этот компонент на изменения атомов - те как в ангуляре watch.

artemyarulin15:12:00

омг, дак реагент это ангуляр? troll

niquola15:12:01

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

niquola15:12:05

Во втором ангуляре вроде тоже подобие virtual dom. Ангуляроподобный vui тоже на vd переписали

niquola15:12:55

connect в reduxe тоде не далеко ушел

airnsk15:12:31

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

artemyarulin15:12:55

и кста как понимаю моднявый https://github.com/mobxjs/mobx это тоже пачка обезваблс (=атомов) которые сами дергают компоненты которые поменялись?

niquola15:12:46

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

airnsk15:12:09

и получим редукс реакт

niquola15:12:25

я об этом же

niquola15:12:40

только кода писать меньше

airnsk15:12:02

но тормозит больше

airnsk15:12:28

реакт то не на каждый чих рендерит )

niquola15:12:13

а тут хз - много тормозных реакт приложений, плюс говорю на virtual dom уже почти все пересели

niquola15:12:33

это единственное существенное на мой взгляд достижение react

airnsk15:12:19

когда директив становится много - в ангуларе сложно код читать, сложно компоненты связывать, да и директивы на ходу строить - тоже не самое приятное занятие - в реакте с этим проще.

niquola15:12:06

директивы говно в первом ангуляре - во втором нет отличия от react

niquola15:12:56

но свои директивы это обычно %10-20 или около того от кодобазы

airnsk15:12:19

нам первого ангуляра хватило ) переходим на реакт . реагент, конечно, лучше - но у нас разработчики с опаской на clojurescript смотрят

niquola15:12:02

ну наедитесь и с реактом - по мне так он шаг назад в декларативности ui 🙂

airnsk15:12:47

с реакта потом легче на clojurescript переходить )

artemyarulin15:12:24

кстати да - в мире cljs врапперов над ангуляркой нету вовсе

niquola15:12:26

я бы сразу на cljs - он скрывает плохие части

niquola15:12:45

@artemyarulin был один - загнулся

niquola15:12:50

rum & reagent - это то с чем можно есть react 🙂

niquola15:12:02

иначе это перловка недоваренная

leov15:12:47

мгм. спасибо за ответ, ща буду переваривать

airnsk15:12:02

сразу на cljs сложно переходить - разработчиков мало , менеджеры боятся )

leov15:12:18

пробую написать первый пример под настоящий датомик. ЧУВСТВУЮ СЕБЯ ЗНАТНЫМ ВЕЛОСИПЕДИСТОМ. просить советовать нормальную библиотеку утилит под него СТЕСНЯЮСЬ.

leov15:12:41

среди почтенных господ кто-нибудь использовал датомик в продуктиве или хотя бы в скромном проекте?

artemyarulin15:12:31

ну и кста ты спрашивал про ом-некст - он няшный, особенно если датомик на беке

leov15:12:32

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

artemyarulin15:12:53

если что угодно другое - ох, тяжко ом-некст юзать

leov15:12:19

он немаленький и к нему есть вопросы пока что в плане планировщика-оптимизатора и в плане удобства

leov15:12:06

и в плане планирования схемы. народ на канале как-то вяло отвечает на глупые вопросы, ну и вообще на вопросы)

niquola15:12:42

Спроси здесь

leov15:12:11

у меня часто дебильные вопросы, пока спрашиваю они сами отвечают. текущие пока такие: 1. (не уверен до конца) если rules туда подаются после обычных правил where - то как я буду указывать most selective clause первой?

leov15:12:56

2. (глупый) нет ли какого-нибудь q в котором скомбинирован ещё и map параметров - то есть можно будет ещё и преобразовывать параметры

leov15:12:13

3. какая библиотека самая хорошая в плане более удобного накатывания схемы? видел две, и годовой давности нашего человека лучше. https://github.com/Yuppiechef/datomic-schema

leov15:12:19

4. почему нет композитных ключей? почему на гитхабе есть заброшенная библиотека, в описании которой сказано "так оказывается сделать физически нельзя"? https://github.com/arohner/datomic-compound-index

leov15:12:35

5. как моделировать "процесс линукса" - "его энв переменные"? очевидно, что большой взрослый датомик имеет статическую схему, и использовать модель [1 :process/name "ls"] [1 :process.env-var/LOCALE ".."] [1 :process.env-var/HOME "/home/.."] это стрелять в ногу?

leov15:12:58

есть ли эффективные range queries для названий атрибутов? можно ли в этом случае скверить все ключи переменных какого-либо процесса?

leov15:12:52

6. правильно ли я понимаю что транзактить энтити в форме мапов = сначала пользоваться встроенной функцией ретракт-энтити а потом встроенной функцией адд-энтити?

leov15:12:38

7. (надо проверять) правильно ли я понимаю, что транзакшн-репорт не содержит утверждений [1 2 3 4 false] [1 2 3 4 true] (типа вычитания-добавления он автоматически взаимоуничтожает)?

goplon16:12:57

@nicola спасибо за советы, и всем кто отвечал, а на Java что можно делать? Андроид приложения? на JS вроде даже можно писать под все платформы. Почему-то к Java негатив из-за страшных отзывов пользователей, с другой стороны вроде Java на гитхабе на первом месте, потом JS

artemyarulin16:12:38

дак на беке жавы полно

artemyarulin16:12:22

десктоп клиенты тоже жавы много, хотя сами такие клиенты не так популярны. В общем если ты @goplon придешь в любой банк то там в 99% будет связка жабы и оракла 🙂

artemyarulin16:12:00

хотя мс еще живой, ладно 80% тада)

alexander_mihailov16:12:42

Ребята из Тинькова скалу тащат старательно.

artemyarulin16:12:23

ну я почти уверен что началось все с жавы и типа раз уж JVM то пошли попробуем скалу. Или вон как тут некоторые герои кложуру протащили в сбер

alexander_mihailov16:12:22

Естественно с жабы, но скала более распространена нежели ,например, котлин.

artemyarulin16:12:49

ну он то вообще новенький. Хотя я тут общался с парой прогрессивных андроид девов дак они грят что котлин взлетел. Жава 8 там нету, кложура мимо из-за стартап тайм, скала тоже из-за тяжелого рантайма и прочей магии

artemyarulin16:12:21

остается либо старая жава коя всех достала либо котлин

artemyarulin16:12:09

@leov а ты в канале #datomic спроси лучше

niquola16:12:51

@leov отличные вопросы! Теперь есть повод еще раз поковырять datomic

niquola16:12:55

5) получить entity, не?

niquola16:12:43

7) можно руками проверить

niquola16:12:29

6) это про update?

niquola16:12:24

4) зачем они тебе? Я так понимаю это следствие дизайна

niquola16:12:51

Можно наверно денормалайзить в составной аттрибут

niquola17:12:10

3) ну миграции написать не проблема, была generic library от создателя ring - можно ее наверное прикрутить. Хотя может и проблема индемпотентности добиться - надо попробовать

leov17:12:02

5) а по всей коллекции так уже не получится - придётся выгружать все энтити этой коллекции 6) да, в плане upsert или update.

niquola18:12:37

6) ты именно все хочешь переписать при update?

niquola18:12:00

Можно наверно достать entity, вычислить дифф и его в транзакцию

goplon18:12:01

Рылся в интернете нашел курсы JavaRush, Технопарк от Майлру и ComputerScience https://compscicenter.ru/syllabus/ последний почему то мне показался бодрее, т.к. фидбек вроде есть, что думаете? вроде тянет на хорошие курсы, а JS вроде проще на Мозилле выучить, кложур с sicp думаю зайдет - просто сейчас куча информации голова кругом, я помню раньше все было проще, в библиотеке иди или книжный, книг на пальцах сосчитать можно было, от корки до корки читаешь, практикуешь и все)

misha18:12:25

@nicola да всё датомик сам дифает

andmed18:12:06

@goplon энтерпрайз же. Люди из энтерпрайза рассказали бы как java незаменима. Но им некогда

sarman18:12:02

@leov я тоже в самом начале datomic, да и в кложуре недавно, без боевого опыта (в смысле толкового не скажу). Вот эта первая либа по миграциям - это не Conformity? http://yellerapp.com/posts/2015-03-09-datomic-migrations.html

niquola19:12:00

@misha а если cardinality/many как он себя ведет по умолчанию?

misha19:12:02

добавляет

niquola19:12:12

а если затереть надо?

misha19:12:18

кардиналити мени надо руками удалять

misha19:12:41

дубликаты он игнорит

misha19:12:44

руками = [:db/retract e attr v]

a.espolov20:12:30

Так это че получается у реагента, все-таки есть глобальный стейт?

artemyarulin20:12:13

зырьте как няшно https://gist.github.com/swannodette/4fc9ccc13f62c66456daf19c47692799

(defn foo [^js/React.Component c]
  (.render c))
магия-магия и файл с externs будет автоматически сгенерен

andre20:12:40

@a.espolov откуда получается? ну вообще да, re-frame для этого есть

andre20:12:56

а так реагент не предполагает, у него стейтфул компоненты

a.espolov22:12:06

@andre cпасибо что поправил, я правильно понимаю что большой апп тяжело без рефрейма будет собрать?