This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2017-04-12
Channels
- # bangalore-clj (4)
- # beginners (77)
- # boot (71)
- # cider (10)
- # clara (1)
- # cljs-dev (52)
- # cljsjs (28)
- # cljsrn (1)
- # clojure (390)
- # clojure-dev (5)
- # clojure-india (1)
- # clojure-italy (5)
- # clojure-nl (24)
- # clojure-poland (4)
- # clojure-russia (123)
- # clojure-spec (71)
- # clojure-taiwan (2)
- # clojure-uk (8)
- # clojurescript (236)
- # core-matrix (6)
- # cursive (19)
- # datomic (16)
- # defnpodcast (2)
- # editors (1)
- # emacs (36)
- # garden (2)
- # hoplon (5)
- # jobs (1)
- # jobs-discuss (10)
- # juxt (47)
- # luminus (4)
- # lumo (6)
- # off-topic (207)
- # om (1)
- # onyx (20)
- # pedestal (40)
- # perun (2)
- # re-frame (8)
- # reagent (48)
- # ring (2)
- # ring-swagger (2)
- # specter (13)
- # unrepl (89)
- # vim (6)
кто нибудь встречал тулы которые визуализируют зависимости между namespaces которые поддерживают CLJS?
у нас для Питерских ментов тоже весь проект на кложе, на бэкэнде clojure + erlang на фронте clojurescript. По факту один основной разработчик, и один на подхвате, пару модулей писал на питоне для оборудования, он же админ из стека Фронт (clojurescript,om, кложурные обертки над картой и d3js..., и прочие либы) -- transit -- Бэк (clojure, korma, compojure, ring, hiccup... и прочие либы) + erlang Система занимается мониторингом и учетом дорожных комплексов фото и видеофиксации а также учетом и планированием рабочего времени сотрудников..
@ul спасибо 21 слайд похож и показывает что нужно, но в той презентации был другой стиль, если мне память не изменяет возможно это другая версия этого же доклада
Слайд FP Idioms, кстати, хорошо демонстрирует, какая именно у меня претензия к re-frame и redux (disclaimer: re-frame и redux всё-таки хороши по сравнению со многими другими вещами, я писал на обоих большие продукты и в целом был почти счастлив; я веду речь скорее о том, что их основная идея несколько недостаточна, чтобы только на ней строить масштабируемое приложение было по настоящему приятно). Так вот, проблема в том, что когда @kishanov говорит, что "каждый компонент, которому нужен свой state - хранит его в базе по своему уникальному пути", то это никакого почти отношения к плюшкам ФП и Unidirectional Flow не имеет, а только добавляет оверхед на вайринг. Потому что страдает composability и transient state — в redux-like архитектуре нельзя использовать компонент с подобным стейтом, который был написан был для использования в одном экземпляре, дважды, его нужно превратить в такой компонент, добавив везде поддержку айди. Изменения небольшие, простые, но неизбежные и в ряде мест, и это не единственное такое нарушение фреймворком FP принципов. То, что @kishanov и команда переписывали приложение 5 раз для того, чтобы научиться его готовить на рейфрейме я в принципе не могу списать на то, что они затупили и что-то не поняли в рейфреме. Просто рефрейм неизбезжно привёл к моментам натягивания совы на глобус, которые они придумали как разрулить оставаясь верными выбранной идеологии. Что, в общем-то, тоже хорошо, но хорошо именно ставкой команды на консистентность, а не мощью самого рефрейма. Тем не менее, я за прагматичное расширение архитектуры в ряде случаев, и сейчас я пытаюсь понять, что в этом ключе можно сделать с redux-like.
>который был написан был для использования в одном экземпляре дак может так просто не делаеть? Теги: нормализация данных, ом-некст, witheve, там все это есть 🙂
@artemyarulin подробнее, пжлста, о том, какое оно имеет отношение к обзацу выше (например нормализация)
@ul прочитал и ниче не понял, пример можно?)
ну нормализация данных, замето глубоко вложенных
(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"}}}})
тоже самое для UI компонентов
раньше у тебя было например {:state {:menu {:items ["a" "b" "c"]}}}
и соответсвенно UI компонент который по этому стейту рендерится. Проблема что он может быть один, это плохо, я не смогу переиспользовать этот компонент еще раз
ибо он как singleton
@savelichalex есть у тебя компонент, который гифку грузит случайную и показывает её. он подписан на какой-то subscription, чтобы знать откуда грузить и диспатчит какой-то handler, когда на нём кнопочку нажали новую гифку получить. для того, чтобы таких два компонента на странице размечтить, надо добавить поддержу айди компонента в подписки и хэндлеры
ну вот да ^^
так а как это развернуть, чтобы не пришлось на меню дописывать айди? превратить :menu в аргумент компоненту?
а ещё веселее, если у тебя есть модальное окно, которое должно показывать страницу такую же, как можно нарыть из меню, но в модале поверх другой страницы
неа, без ID никак, нормализации без ID не получится
ну либо локальный стейт конечно
но нам же всем нравится когда только одна mutable переменная, да? 🙂
а, ну как бы, если без айди никак - можно подхачить компонент, он и на рефрейме заработает. возможно ом тогда просто форсит об этом подумать еще до первой версии компонента?
ну он не то чтобы форсит, просто поддерживает нормализацию данных полу автоматически (просто указываешь что является id грубо говоря)
а он уже сам красиво все складывает по нужным местам
наличие айди как таковое сильно нарушает фп-шность, где анонимность значения играет большую роль, ты что-то можешь не именовать, но передавать в дата-флоу
как это? Ты ж данные нормализуешь и все эти user/by-id дак окей, а вот menu/by-id уже вдруг неправославно?
кстати, только что осенило, раскритикуйте: нормализовать датаскриптовые/датомиковы данные нужно не как {int e}, а как {{:db/id int} e}
потому что юзеры с такими айди у меня есть уже поименованные, а сотня менюшек, которые я хочу просто сгенерить, это просто значения
@ul никогда не думал что это может быть проблемой 😳
ну я слегка кажется понимаю о чем ты, ибо генерить uuid это конечно не айс да. Но ты видел альтернативу этому?
ох я надебажился аритиэрорров в анонимных функциях в мапе/фильтре при переходе с на на этой неделе
а чо оно разное чтоле?
так вот че я в репле ошибки ловлю а в cljs нет такого 😆
вы там рядом сидите чтоле?:)
дак @ul ты нашел решение этой проблемы? Что ом, что witheve они как раз id юзают
@artemyarulin ты как-то сейчас преподнёс ом и ив - как замены рефрейму, в которых нет этой проблемы, а там решение такое же, может слегка только автоматизированное
а я хз - я рефрейм не видел даж никогда 😄
“… но осуждаю!“(с)
во, линзы пошли, вызываю хаскелистов в этот тред!)
дак новый ом с них слез
pure!)
@fmnoise https://leanpub.com/elementsofclojure/read_sample здесь перечислены главы
@ul хорошо расписал. мы переписывали с практичной целью: если делать инвестицию во фреймворк, надо несколько раз переписать, чтобы понять разные компромиссы. Совсем без фреймворка сложнее: основная польза от него, что он документирован и есть community, самопил будут понимать 1.5 человека
мы решили, что re-frame - “good enough”, в каких-то местах придется закусить удела и жить с его ограничениями
главное с каждой такой набитой шишкой фреймворки не менять - а то получится как у жаваскриптеров - 100500 фреймворков и мало кто умеет хоть одним пользоваться, зато каждую новую версию приложения пробуют что-то новое 🙂
Привет! А что посоветуете, если требуется работать с разными часовыми поясами? В java обычно joda time юзал, а на фронте momentjs.
а на фронте cljs-time? 🙂
@povloid Спасибо! Тоже на эти две библиотеки присматривался.
в clojure есть обертка https://github.com/dm3/clojure.java-time
Коллеги, а подскажите или покидайте ссылки, как деплоить jar по-правильному. Есть два окружения staging/prod, есть комбинация использующаяся для python в виде: jenkins + ansible. Насколько я вижу это следующим образом: - По каждому коммиту в репу запускаем jenkins, собираем jar и кладем его на s3 - Конфигурируем playbook для деплоя staging чтобы он качал самый свежий jar с s3 и поднимал его - Конфигурируем playbook для прода чтобы он имел фиксированный номер jar на s3 для деплоя Из минусов только то, что в момент деплоя прода надо ходить на s3 и выбирать последнюю версию для того, чтобы прописать в playbook. Наверное схема деплоя одна что для clojure/ что для остальных jvm, верен ли мой подход? спасибо
а у вас там везде ansible? Ну т.е. ты надеюсь его поднимаешь не только для деплоя?
да норм, тока разве что мне больше нравится юзать теги в гите, типо app-name#1.0.5
ибо удобно смотреть прям в гитхабе или где еще что апдейт прода будет включать - просто diff между 2 тегами
Ну и бонусом если есть теги в гите то можно настроить 2 билда в женкинсе чтоб одни на любой комит в дев енвайронмент постил, а другой тока на тег app-name*
например в прод
ну а вааще брось дев - будь мужиком! feature-branch > pull request > review accepted > put it to prod. Если фича большая скрой за feature flag. Мы так уже недельку работаем, никто не умер ня 🙂
@rmuslimov Можно выкинуть ансибл и воткнуть доскер. Нефиг разводить мутабельную инфраструктуру. Только shrink-wrapped containers, только хардкор!
> Можно выкинуть ансибл и воткнуть доскер Так докер это про контайнеры, а ансибл это orchestration tool.
> ну а вааще брось дев - будь мужиком! feature-branch > pull request > review accepted > put it to prod у нас тут фабрикатор прижился, github c PR как-т не идет
@rmuslimov ansible оркестрирует не на том уровне. Нужно оркестрировать на уровне "сделай мне 100500 машин по шаблончику и свяжи их вот так", а ансибл всё копается внутри одного бокса.
И вообще, что это за фигня, зачем опять DSL? CFEngine сделал это зря, Puppet сделал это зря, один Chef наполовину понял, что DSL не нужен, но Chef тоже копается внутри контейнеров.
@rmuslimov Так а зачем ansible, если есть terraform?
я не очень с этим разобрался, насколько я понял могучая конфигурация aws живет в TF
Не нужно на инстансах копаться, их нужно один раз в доскер паковать, складировать в реестр, и из реестра доставать уже готовыми.
Вопрос как раз про это. Staging'овому terraform нужно давать один конфиг, с одним тэгом, а production'овому - другой, с другим тэгом.
Тогда staging будет раскладывать то, что только кто из-под CI вылезло, а production - то, во что уже потыкали ручками.
А staging это или release определяет конфиг-файл, которой этой машинке терраформ подсовывает.
@artemyarulin
> да норм, тока разве что мне больше нравится юзать теги в гите, типо app-name#1.0.5
ибо удобно смотреть прям в гитхабе или где еще что апдейт прода будет включать - просто diff между 2 тегами
Ну и бонусом если есть теги в гите то можно настроить 2 билда в женкинсе чтоб одни на любой комит в дев енвайронмент постил, а другой тока на тег app-name*
например в прод
прикольно, спсс
Слышал и видел компании которые каждый день в прод. У нас просто enterprise и так не получается делать