Fork me on GitHub
#clojure-russia
<
2017-04-12
>
dragoncube01:04:46

кто нибудь встречал тулы которые визуализируют зависимости между namespaces которые поддерживают CLJS?

povloid06:04:58

у нас для Питерских ментов тоже весь проект на кложе, на бэкэнде clojure + erlang на фронте clojurescript. По факту один основной разработчик, и один на подхвате, пару модулей писал на питоне для оборудования, он же админ из стека Фронт (clojurescript,om, кложурные обертки над картой и d3js..., и прочие либы) -- transit -- Бэк (clojure, korma, compojure, ring, hiccup... и прочие либы) + erlang Система занимается мониторингом и учетом дорожных комплексов фото и видеофиксации а также учетом и планированием рабочего времени сотрудников..

kuzmin_m09:04:42

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

ul09:04:56

Слайд FP Idioms, кстати, хорошо демонстрирует, какая именно у меня претензия к re-frame и redux (disclaimer: re-frame и redux всё-таки хороши по сравнению со многими другими вещами, я писал на обоих большие продукты и в целом был почти счастлив; я веду речь скорее о том, что их основная идея несколько недостаточна, чтобы только на ней строить масштабируемое приложение было по настоящему приятно). Так вот, проблема в том, что когда @kishanov говорит, что "каждый компонент, которому нужен свой state - хранит его в базе по своему уникальному пути", то это никакого почти отношения к плюшкам ФП и Unidirectional Flow не имеет, а только добавляет оверхед на вайринг. Потому что страдает composability и transient state — в redux-like архитектуре нельзя использовать компонент с подобным стейтом, который был написан был для использования в одном экземпляре, дважды, его нужно превратить в такой компонент, добавив везде поддержку айди. Изменения небольшие, простые, но неизбежные и в ряде мест, и это не единственное такое нарушение фреймворком FP принципов. То, что @kishanov и команда переписывали приложение 5 раз для того, чтобы научиться его готовить на рейфрейме я в принципе не могу списать на то, что они затупили и что-то не поняли в рейфреме. Просто рефрейм неизбезжно привёл к моментам натягивания совы на глобус, которые они придумали как разрулить оставаясь верными выбранной идеологии. Что, в общем-то, тоже хорошо, но хорошо именно ставкой команды на консистентность, а не мощью самого рефрейма. Тем не менее, я за прагматичное расширение архитектуры в ряде случаев, и сейчас я пытаюсь понять, что в этом ключе можно сделать с redux-like.

artemyarulin10:04:30

>который был написан был для использования в одном экземпляре дак может так просто не делаеть? Теги: нормализация данных, ом-некст, witheve, там все это есть 🙂

misha10:04:48

@artemyarulin подробнее, пжлста, о том, какое оно имеет отношение к обзацу выше (например нормализация)

savelichalex10:04:49

@ul прочитал и ниче не понял, пример можно?)

artemyarulin10:04:49

ну нормализация данных, замето глубоко вложенных

(def state {:customer  {:id 1 :name "John" :company {:id 2 :name "Pepsi"}}})
;; юзать нормализованные данные
(def state 
  {:customers/by-id {1 {:name "John" :company-id 1}}}
   :company/by-id {1 {:name "Pepsi"}}}})

artemyarulin10:04:09

тоже самое для UI компонентов

misha10:04:40

лучше б написал, как именно “тоже самое”

artemyarulin10:04:53

раньше у тебя было например {:state {:menu {:items ["a" "b" "c"]}}} и соответсвенно UI компонент который по этому стейту рендерится. Проблема что он может быть один, это плохо, я не смогу переиспользовать этот компонент еще раз

artemyarulin10:04:00

ибо он как singleton

ul10:04:28

@savelichalex есть у тебя компонент, который гифку грузит случайную и показывает её. он подписан на какой-то subscription, чтобы знать откуда грузить и диспатчит какой-то handler, когда на нём кнопочку нажали новую гифку получить. для того, чтобы таких два компонента на странице размечтить, надо добавить поддержу айди компонента в подписки и хэндлеры

artemyarulin10:04:48

ну вот да ^^

misha10:04:11

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

ul10:04:16

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

ul10:04:30

и ты хочешь быть DRY )))

artemyarulin10:04:34

неа, без ID никак, нормализации без ID не получится

artemyarulin10:04:52

ну либо локальный стейт конечно

artemyarulin10:04:22

но нам же всем нравится когда только одна mutable переменная, да? 🙂

misha10:04:44

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

artemyarulin10:04:32

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

artemyarulin10:04:50

а он уже сам красиво все складывает по нужным местам

ul10:04:56

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

ul10:04:18

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

artemyarulin10:04:39

как это? Ты ж данные нормализуешь и все эти user/by-id дак окей, а вот menu/by-id уже вдруг неправославно?

misha10:04:08

кстати, только что осенило, раскритикуйте: нормализовать датаскриптовые/датомиковы данные нужно не как {int e}, а как {{:db/id int} e}

ul10:04:19

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

savelichalex10:04:23

@ul никогда не думал что это может быть проблемой 😳

ul10:04:43

анонимные функции мы же любим за то, что они анонимные

ul10:04:10

это проблема не шоу-стоппер, но, строго говоря, это проблема

artemyarulin10:04:13

ну я слегка кажется понимаю о чем ты, ибо генерить uuid это конечно не айс да. Но ты видел альтернативу этому?

misha10:04:33

ох я надебажился аритиэрорров в анонимных функциях в мапе/фильтре при переходе с cljs на clj на этой неделе

artemyarulin10:04:49

а чо оно разное чтоле?

misha10:04:32

#(foo) против (fn [_] foo)

savelichalex10:04:28

так вот че я в репле ошибки ловлю а в cljs нет такого 😆

ul10:04:10

да просто передавал тансформер в мап какой попало

ul10:04:18

а clj ждёт определённую арность

artemyarulin10:04:24

вы там рядом сидите чтоле?:)

ul10:04:52

нет 😃

artemyarulin10:04:58

дак @ul ты нашел решение этой проблемы? Что ом, что witheve они как раз id юзают

ul10:04:24

вот я в гамаке сейчас на эту тему как раз 😃

ul10:04:10

я добавлял в re-frame возможноть указать кастомный app-db для компонента

misha10:04:20

@artemyarulin ты как-то сейчас преподнёс ом и ив - как замены рефрейму, в которых нет этой проблемы, а там решение такое же, может слегка только автоматизированное

ul10:04:30

но это тоже свои проблемы принесло

ul10:04:40

хотя некоторые вещи стали элегантнее выглядеть

artemyarulin10:04:51

а я хз - я рефрейм не видел даж никогда 😄

misha10:04:00

+1 лол

ul10:04:02

когда ты линзу на исходный app-db передаёшь в поддерево

artemyarulin10:04:11

“… но осуждаю!“(с)

ul10:04:28

и подписки с хэндлерами через линзу отрабатывают

artemyarulin10:04:56

во, линзы пошли, вызываю хаскелистов в этот тред!)

ul10:04:30

ваши омовские курсоры это тоже линзы

ul10:04:49

так что не зови пока нечистую силу

artemyarulin10:04:58

дак новый ом с них слез

ul10:04:59

или чистую?

misha10:04:01

:чеснок:

misha10:04:11

кстати, elements of clojure Теллмана - $$$

ul10:04:26

кстати, да

ul10:04:41

стоит каждого потраченного доллара

ul10:04:44

на мой вкус 😃

ul10:04:32

только не дописал её ещё =(

fmnoise12:04:17

стоящая книженция? чет не вижу оглавления

ul13:04:01

@fmnoise https://leanpub.com/elementsofclojure/read_sample здесь перечислены главы

ul13:04:26

книга с размышлениями о том, как философские принципы применить в кложурной практике ))))

ul13:04:08

по первой бесплатной главе, в целом, понятно как написана и о чём книга

fmnoise14:04:00

да, первая глава очень ок

fmnoise14:04:08

спасибо

kishanov15:04:26

@ul хорошо расписал. мы переписывали с практичной целью: если делать инвестицию во фреймворк, надо несколько раз переписать, чтобы понять разные компромиссы. Совсем без фреймворка сложнее: основная польза от него, что он документирован и есть community, самопил будут понимать 1.5 человека

kishanov15:04:00

мы решили, что re-frame - “good enough”, в каких-то местах придется закусить удела и жить с его ограничениями

kishanov15:04:18

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

just.sultanov17:04:03

Привет! А что посоветуете, если требуется работать с разными часовыми поясами? В java обычно joda time юзал, а на фронте momentjs.

povloid17:04:19

java.util.Data

just.sultanov17:04:31

а на фронте cljs-time? 🙂

povloid17:04:41

да, скорее всего его.

just.sultanov17:04:03

@povloid Спасибо! Тоже на эти две библиотеки присматривался.

povloid17:04:39

да я вообще java.util.Data и js/Date юзаю. Просто я понял что вы к joda привыкши

povloid17:04:14

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

andfadeev19:04:20

в java имхо лучше java 8 time api юзать, зачем лишняя зависимость

rmuslimov20:04:10

Коллеги, а подскажите или покидайте ссылки, как деплоить jar по-правильному. Есть два окружения staging/prod, есть комбинация использующаяся для python в виде: jenkins + ansible. Насколько я вижу это следующим образом: - По каждому коммиту в репу запускаем jenkins, собираем jar и кладем его на s3 - Конфигурируем playbook для деплоя staging чтобы он качал самый свежий jar с s3 и поднимал его - Конфигурируем playbook для прода чтобы он имел фиксированный номер jar на s3 для деплоя Из минусов только то, что в момент деплоя прода надо ходить на s3 и выбирать последнюю версию для того, чтобы прописать в playbook. Наверное схема деплоя одна что для clojure/ что для остальных jvm, верен ли мой подход? спасибо

artemyarulin20:04:52

а у вас там везде ansible? Ну т.е. ты надеюсь его поднимаешь не только для деплоя?

artemyarulin20:04:09

да норм, тока разве что мне больше нравится юзать теги в гите, типо app-name#1.0.5 ибо удобно смотреть прям в гитхабе или где еще что апдейт прода будет включать - просто diff между 2 тегами Ну и бонусом если есть теги в гите то можно настроить 2 билда в женкинсе чтоб одни на любой комит в дев енвайронмент постил, а другой тока на тег app-name* например в прод

artemyarulin20:04:58

ну а вааще брось дев - будь мужиком! feature-branch > pull request > review accepted > put it to prod. Если фича большая скрой за feature flag. Мы так уже недельку работаем, никто не умер ня 🙂

dottedmag21:04:02

@rmuslimov Можно выкинуть ансибл и воткнуть доскер. Нефиг разводить мутабельную инфраструктуру. Только shrink-wrapped containers, только хардкор!

dottedmag21:04:07

Т.е. я не правила для CFEngine писал, а сам код CFEngine.

rmuslimov21:04:35

> Мы так уже недельку работаем, никто не умер ня Достойный срок 🙂

dottedmag21:04:22

Если трафика, как у гугла, то неделька - это нормально.

rmuslimov21:04:56

> Можно выкинуть ансибл и воткнуть доскер Так докер это про контайнеры, а ансибл это orchestration tool.

rmuslimov21:04:10

или поправьте меня если я неправильно понял

dottedmag21:04:18

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

rmuslimov21:04:47

> ну а вааще брось дев - будь мужиком! feature-branch > pull request > review accepted > put it to prod у нас тут фабрикатор прижился, github c PR как-т не идет

dottedmag21:04:18

@rmuslimov ansible оркестрирует не на том уровне. Нужно оркестрировать на уровне "сделай мне 100500 машин по шаблончику и свяжи их вот так", а ансибл всё копается внутри одного бокса.

rmuslimov21:04:40

ну как это как настроить

dottedmag21:04:08

И вообще, что это за фигня, зачем опять DSL? CFEngine сделал это зря, Puppet сделал это зря, один Chef наполовину понял, что DSL не нужен, но Chef тоже копается внутри контейнеров.

rmuslimov21:04:26

т.е. тут вот связка terraform + ansible поднимают инстансы и деплоят туда аппс

dottedmag21:04:43

В Salt вообще шиза - DSL типа-не сделали, то всё-таки сделали. В Yaml, лол.

dottedmag21:04:02

@rmuslimov Так а зачем ansible, если есть terraform?

rmuslimov21:04:13

я не очень с этим разобрался, насколько я понял могучая конфигурация aws живет в TF

rmuslimov21:04:41

а дальше applications на развернутые инстансы с помощью ansible

dottedmag21:04:42

А то, что внутри инстансов - в Ansible.

dottedmag21:04:49

Вот, не нужно.

rmuslimov21:04:55

но там app per instance

dottedmag21:04:13

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

rmuslimov21:04:30

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

dottedmag21:04:03

Вопрос как раз про это. Staging'овому terraform нужно давать один конфиг, с одним тэгом, а production'овому - другой, с другим тэгом.

rmuslimov21:04:40

а собирать в одном месте?

dottedmag21:04:40

Тогда staging будет раскладывать то, что только кто из-под CI вылезло, а production - то, во что уже потыкали ручками.

dottedmag21:04:06

Ну так машинку CI собирает, складывает в реестр доскера того же.

dottedmag21:04:22

А staging это или release определяет конфиг-файл, которой этой машинке терраформ подсовывает.

rmuslimov21:04:39

ну это тоже что и изначально я предложил

rmuslimov21:04:52

только твое приложение сразу идти к TF

rmuslimov21:04:03

ок, я почитаю спасибо

rmuslimov21:04:39

@artemyarulin > да норм, тока разве что мне больше нравится юзать теги в гите, типо app-name#1.0.5 ибо удобно смотреть прям в гитхабе или где еще что апдейт прода будет включать - просто diff между 2 тегами Ну и бонусом если есть теги в гите то можно настроить 2 билда в женкинсе чтоб одни на любой комит в дев енвайронмент постил, а другой тока на тег app-name* например в прод прикольно, спсс Слышал и видел компании которые каждый день в прод. У нас просто enterprise и так не получается делать

dottedmag21:04:39

В одной компании была штука, что кнопочка в CI деплоила стэйджинг или прод, и ставила тэг в гите "текущий стейджинг/прод". Удобно.

dottedmag21:04:01

Наборот тоже можно, слушать изменения в тэгах и деплоить.