Fork me on GitHub
#clojure-russia
<
2017-02-03
>
dottedmag05:02:29

@andmed Паттерны везде есть.

kgofhedgehogs06:02:53

(defn point-offset [{:keys [x y]} p] (update (update p :x + x) :y + y)))

(point-offset {:x 2 :y -2} {:x 0 :y 1 :some-key :some-value}) ; => {:y -1, :some-key :some-value, :x 2}

(defrecord Point [x y])
(point-offset {:x 2 :y -2} (Point. 0 1)) ; => #Point{:x 2, :y -1}
Нет ли способа сделать point-offset лучше? Или он и так хорош?

andmed06:02:51

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

andmed06:02:54

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

rmuslimov06:02:35

@kgofhedgehogs ужасен. point-offset == (partial merge-with +)

rmuslimov06:02:54

(merge-with + {:x 2 :y -2} {:x 0 :y 1 :r 3}) ;; => {:x 2, :y -1, :r 3}

andmed06:02:30

тут в одном месте пытали, как мол функционально выражается java bean в микросервисной архитектуре ну я ляпнул java bean ~ микросервис :thinking_face: ну это какой оверхед!

kgofhedgehogs06:02:50

@rmuslimov Вот за этим я сюда и написал. Какрй код не напишу, всё уже в стандартной либе есть. Спасибо

kgofhedgehogs06:02:51

@rmuslimov: а вот так обернуть если:

(defn point-offset [delta point] (merge-with + point delta)
Нормально выглядит? Есть способ проверить то, что у delta ключи только :x :y, а у point есть ключи :x :y?

rmuslimov06:02:18

ну как то нейминг у функции не тот мне кажется а я бы сделал как то так (def add-offset [point delta] (partial merge-with +))

rmuslimov06:02:28

проверить конечно можно а что потом с этим делать?

kgofhedgehogs06:02:51

Типа :pre , я об этом

rmuslimov06:02:14

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

rmuslimov06:02:40

чтобы и аргументы и результат функции был завалидирован

kgofhedgehogs06:02:48

Я не очень понимаю о чем ты

rmuslimov07:02:02

есть такая штука называется clojure.spec

rmuslimov07:02:20

оно позволяет валидировать все вокруг https://clojure.org/guides/spec

kgofhedgehogs07:02:03

А в pre: спек не пихают?

kgofhedgehogs07:02:08

А. Нет. Я не совсем сначала понял смысл

rmuslimov07:02:23

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

kgofhedgehogs07:02:08

Ты считаешь, что спек это проще, чем пре или в принципе считаешь проверку усложнением?

rmuslimov07:02:27

вот второе

kgofhedgehogs07:02:07

Но тогда функцию можно использовать не по назначению

rmuslimov07:02:21

если у тебя delta это тип ты можешь в объявлении функции его указать

kgofhedgehogs07:02:47

Я подумал тут. Дельту надо деструктурировать вот так: {dx :x dy :y}

kgofhedgehogs07:02:09

И мерджить именно с этим, чтобы случайно не смержить лишние данные из дельты

kgofhedgehogs07:02:39

А вот у точки в пре проверить наличие ключей :х и :у

kgofhedgehogs07:02:09

Сейчас я напишу

rmuslimov07:02:33

а что ты собираешься сделать если нет :x :y?

kgofhedgehogs07:02:39

Кинуть экзепшн

kgofhedgehogs07:02:42

(defn point-offset [{dx :x, dy: y} point] (merge-with + point {:x dx, :y dy}))

kgofhedgehogs07:02:22

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

rmuslimov07:02:52

> Кинуть экзепшн Я с питона переезжаю и часто думаю на эту тему https://adambard.com/blog/acceptable-error-handling-in-clojure/

rmuslimov07:02:01

питон прививает дикую страсть, а fp говорит “не надо так"

kgofhedgehogs07:02:39

Ну pre: -то тут не спроста

kgofhedgehogs07:02:03

Ассертить дают, знач надо ассертить, разве нет?

rmuslimov07:02:11

да, да для ассертов

rmuslimov07:02:34

но как то я не часто вижу :pre в чужом коде

artemyarulin07:02:39

>https://adambard.com/blog/acceptable-error-handling-in-clojure/ гуд статья, тока хочется добавить чтоб юзали ex-info/ex-message/ex-data для ошибок, а не строку

kgofhedgehogs07:02:59

@rmuslimov, ну вообще у меня учебный код, сейчас лучше я освою все возможности

kishanov08:02:04

в использовании спека в :pre имхо нет ничего зазорного, хотя светилы не одобряют

kishanov08:02:21

s/fdef конечно лучше, но миллер рекоммендовал его не использовать в продакшене, а только в тестах

kishanov08:02:47

(require '[clojure.spec.test :as stest])
(stest/instrument 'clojure.core/subs)
(subs "abc" 10)
;; ExceptionInfo Call to #'clojure.core/subs did not conform to spec:
;; val: {:s "abc", :start 10} fails at: [:args] 
;;   predicate: (fn [{:keys [s start end]}] (if end (<= start end (count s)) (<= start (count s))))
;; :clojure.spec/args  ("abc" 10)
;; :clojure.spec/failure  :instrument
;; :clojure.spec.test/caller  {:file "NO_SOURCE_FILE", :line 17, :var-scope user/eval21}

kishanov08:02:28

вот такие штуки-дрюки можно делать спеком, но производительность в runtime’е видимо будет не очень

kgofhedgehogs09:02:24

Вот так ок?

(defn point-offset 
  [{dx :x, dy :y} point] 
  {:pre [(every? point [:x :y])]} 
  (merge-with + point {:x dx, :y dy})]})

Roman Liutikov09:02:22

В Киевском офисе Attendify есть аж 8 вакансий Clojure dev, не удаленка 🙂 https://attendify.workable.com/jobs/301791

artemyarulin09:02:53

интерсно мобильную часть они на CLJS+RN делают или нативно?

kishanov10:02:57

джоб постинг ковбойский: “brave enough, curious, loads of evidence, have to understand everything"

kishanov10:02:43

походу это завуалированный призыв найти недавно окончившенго универ бойца, у которого уровень огня в глазах совместно с ЧСВ стремится к бесконечности

kishanov10:02:35

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

Roman Liutikov10:02:06

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

nwalkr11:02:40

а в Украину сейчас только с заграном из РФ пускают?

kronos_vano11:02:15

да даже с заграном не особо

kronos_vano11:02:27

нужны приглашения

hippo11:02:47

я б погреб где-нить джуном в каком-нить clojure проекте, но концентрация clojure предложений в РФ крайне мала

nwalkr11:02:23

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

nwalkr11:02:47

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

artemyarulin11:02:59

можно попробовать найти вакансии на бородатом лиспе 🙂

artemyarulin11:02:14

кста - в автокаде все еще пилят плагинчики на нем?

misha11:02:45

@roman01la а что вы аж ввосьмиром писать-то будете?

andmed11:02:49

@artemyarulin лично знаю чувака в германии, он писал в продакшн на CL (и perl, да...) сейчас перевел свою контору на кложу - говорит платформа решает..

misha11:02:35

8 кложа девов, которые могут - это типа конгитект целый

Roman Liutikov11:02:54

@misha нас уже 8, в целом инфрастуктура растет, новые проекты, как обычно

Roman Liutikov11:02:09

я в общем-то много не расскажу

misha11:02:15

т. е. хотите 16 в итоге?

misha11:02:49

это ж переписать интернет можно весь

Roman Liutikov11:02:11

это все девелоперы в Киеве походу 😄

hippo11:02:58

если не можешь найти работу по clojure - создавай рабочие места сам! 😄

misha11:02:13

@roman01la у меня еще на пару лет дел, я пока пас opieop

andmed11:02:16

@artemyarulin ...токо он не первый месяц людей себе ищет... LOL хотя не знаю почему...

misha11:02:40

@hippo тут наоборот: места есть, девов - нет )

Roman Liutikov11:02:28

в Киеве еще пишут транслятор с COBOL в Java на CL

Roman Liutikov11:02:36

вот там студентов набирают

hippo11:02:54

@roman01la у меня этим знакомый в Питере занимается, не одна ли галера? интересно)

andmed11:02:57

это и кобол и джава и лисп. профит!

Roman Liutikov11:02:39

@hippo хз, я не помню названия

artemyarulin11:02:13

да я сам пару месяцев назад видел контракт аж на год на CL, написал что я кложуру знаю и скобочки те-же самые, но мне даже не позвонили 😞

az12:02:37

Это лучше двух собеседований и отказа 😂

az12:02:29

Я вот не могу не смеяться при очередном предложении, знаю итог 😅

kgofhedgehogs15:02:56

Снова всем привет. Я вот правильно понял, что clojuresrcipt это именно для фронтэнда фича? Бэкенд на clojurescript это реально? А нормально?

andfadeev15:02:51

ну если бекенд под нодой запускать то можно и на cljs

andfadeev15:02:03

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

nwalkr15:02:27

но то, что касается фрнтенда, значительно более развито

kgofhedgehogs15:02:13

Я не очень понимаю, т.е. я могу писать на кложурскрипт и юзать фичи из, например, phantomjs??

nwalkr15:02:54

конкретизируй

kgofhedgehogs15:02:51

Поскольку, я не очень понимаю, то конкретизировать не могу. Давайте не пример, а ситуацию, которая меня побудила напишу: есть проект некоторой серверной структуры, которую изначально планировалось писать на node.js. Если написать его на clojurescript, я буду иметь тот же функционал при разработке, как если бы я писал сразу на node.js?

prepor15:02:29

все ровно так же как с жс

prepor15:02:36

у тебя есть прямой доступ к хост-платформе

prepor15:02:57

вызывай из cljs нодовские api сколько угодно

grach15:02:19

@kgofhedgehogs да, конечно. У cljs и js прекрасный интероп! )

grach15:02:56

То есть, node.js и весь её API тебе будет доступен в той же мере.

kgofhedgehogs15:02:08

Вот это то, что о чем я и спрашивал. Отлично! Спасибо

grach15:02:30

@kgofhedgehogs вот например здесь DataScript ( очень хорошая и нужная библиотека by @tonsky ) гоняют в Node. И всё хорошо 🙂 https://github.com/runexec/PossibleDB

grach16:02:14

@kgofhedgehogs вот здесь на русском языке это даже обсуждают http://devzen.ru/episode-0012/ и вообще очень интересный выпуск. Много про Clojure и про засовывание ClojureScript везде подряд.

grach16:02:45

вместе с автором того самого DataScript

kgofhedgehogs16:02:59

Хорошо. Теперь такой вопрос: насколько целесообразно предлагать использовать clojurescript для такого проекта: Надо написать мастер сервис и воркеров, которые будут подключены к нему. Воркеров можно запустить где угодно. Мастер сервис анализирует загруженность воркеров и раздает задания, которые он принял из своего юзер-интерфейса. Задание воркера это исполнить код соответствующий некоторому интерфейсу и вернуть результат. Воркер поддерживает некоторый набор языков программирования, т.е. имеет набор рантаймов в одном из которых будет исполнять полученное задание.

kgofhedgehogs16:02:02

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

az16:02:02

Я бы взял erlang troll

kgofhedgehogs16:02:03

Звучит чет, как ботнет на clojurescript, но это не так 🙂

kgofhedgehogs16:02:10

Отлично

kgofhedgehogs16:02:48

Ну а если серьезно? Вся эта система предполагает асинхронность или что там, не очень различаю понятия. Это не проще будет организовать на clojurescript?

kgofhedgehogs16:02:16

Если звучит непонятно что-то, то я могу перефразировать. Просто я очень хочу программировать эту систему на clojurescript, но хочу знать, не создам ли я себе лишние трудности? Не будет ли проще на node.js? От сервиса хочется максимум производительности и распределение нагрузки

az16:02:02

Я бы взял эрланг

kgofhedgehogs16:02:44

Ну выбор я предлагаю из clojurescript и node.

misha16:02:11

но если между js и cljs выбирать - cljs однозначно. вопрос только в сроках, с учетом того, что ты на нем неделю пишешь только

kgofhedgehogs16:02:27

До конца марта, я думаю

kgofhedgehogs16:02:49

А на ноде я тоже не много писал, она мне не нравится. Только по работе приходилось

kgofhedgehogs16:02:39

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

kgofhedgehogs16:02:44

Ну перезадам вопрос Асинхронные/многопоточные/мультипроцессорные сервисы на clojurescript это сложно? Или в силу того, что код фп, то всё легко и складно будет работать?

misha16:02:11

это легче, чем в жс

kgofhedgehogs16:02:55

Отлично

kgofhedgehogs16:02:17

Надеюсь, что смогу затащить этот проект на своем энтузиазме

prepor16:02:47

а node это типа из-за "асинхронности"?

kgofhedgehogs16:02:26

Ну и мой "тимлид" очень любит ноду

prepor16:02:02

jvm как бэ имеет мягко говоряе не менее mature подходы к асинхронному io

prepor16:02:26

не говоря уж про многопоточные системы )

kgofhedgehogs16:02:45

Я так схватился за clojurescript т.к. тимлид любит ноду и его будет проще подкупить языком компилируемым в js

prepor16:02:04

если смотреть на асинхронность уровнем выше, то у кложи тут core.async

prepor16:02:35

и есть он одинаково что на жвм, что на ноде

kgofhedgehogs16:02:49

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

prepor16:02:17

node исходя из данное описания никак из них вообще не вытекает и никакого бонуса оно не даст

prepor16:02:09

но если стоит условие использовать node, то конечно это лучше делать с clojurescript, а не vanila js )

prepor16:02:09

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

kgofhedgehogs16:02:31

Я узнаю у него почему он хочет писать на ноде, он даст аргументов

prepor16:02:37

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

kgofhedgehogs16:02:57

Отлично

kgofhedgehogs16:02:18

Проект, который я назвал, не звучит же сложно, да?

kgofhedgehogs16:02:10

> @az Я бы взял эрланг Можешь обосновать почему?

grach16:02:36

Мне тоже кажется, что Erlang бы справлялся здесь быстрее потребляя меньше ресурсов.

kgofhedgehogs16:02:48

Ну тут проблeмой является отсутствие такой же крутой интеграции с js как на cljs

kgofhedgehogs16:02:45

Отсутствие же? Или и у erlang есть какая-то фича по отношению к js?

misha16:02:07

зачем там js?

kgofhedgehogs16:02:39

>Ну мой "тимлид" очень любит ноду

seryh17:02:21

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

seryh17:02:17

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

kgofhedgehogs17:02:27

@seryh понятно, спасибо. Я как раз сейчас читал про erlang. И если снова ограничиться js и cljs, ты тоже считаешь что при выборе из них, для решения этой задачи лучше выбрать cljs?

prepor17:02:27

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

az17:02:59

Простите, я тут отвлекся.

az17:02:40

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

az17:02:22

Адрес процесса на удалённом хосте ничем не отличается от адреса локального процесса.

artemyarulin17:02:33

дак а скейл то какой? может речь о 2 запросах в час

az17:02:19

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

az17:02:44

Не удобно описывать плюсы языка с телефона

kgofhedgehogs17:02:15

Не. С каждым заданимем нужно опрашивать около 300 сервисов каждую минуту. Максимум 10 заданий

kgofhedgehogs17:02:37

Вообще не каждую минуту, а постоянно

kgofhedgehogs17:02:21

Т.е максимальная нагрузка это до 3000 запросов в очереди

az17:02:31

Ну так баш и крон trollface

kgofhedgehogs17:02:50

Ну хватит тут трольфейсы ставить. Не понимаю серьезно ты или нет

az17:02:00

Да на любом языке это решить можно. Так как ты сюда зашёл тебе суждено писать на кложуре.

kgofhedgehogs17:02:52

всё. Решено. Спасибо всем за отзыв

nwalkr17:02:56

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

az17:02:20

Тогда буду писать распределённые приложения на кложуре

az17:02:48

Под нодой

artemyarulin17:02:57

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

nwalkr17:02:07

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

artemyarulin17:02:28

я лично считаю что это идеальная задача для хаскеля, чтоб ошибок не было, опять же category theory подтянуть

nwalkr17:02:44

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

nwalkr17:02:24

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

kishanov18:02:07

ну тогда уж на purescript с erlang бэкэндом, а то хипстоты маловато

misha20:02:39

А пурскрипт - это 2 подворота штанин, или уже 3?

kishanov20:02:11

согласно интернетам в последнее время purescript надо люто любить

kishanov20:02:23

Недавно статейка пробегала - http://mutanatum.com/posts/2017-01-12-Browser-FP-Head-to-Head.html, там чувак в выводах настолько разошелся что в заключении аж фальцетом запел:

Where is PureScript going?
Everywhere. PureScript is becoming more and more general and getting closer to competing with Haskell directly (though Phil (the author or PureScript) seems to disagree). So long as there is demand for Haskell like languages on the backend, there is room for a competitor that is strict by default, and designed to be embedded into existing platforms. With lessons learned from Haskell, PureScript boasts an ideal type class hierarchy, extensible records, and a documenting Eff Monad. With backends in C++ and JavaScript as well as the JVM and Erlang, PureScript is an incredibly ambitious project

dragoncube21:02:25

интерестинг: With backends in C++ and JavaScript as well as the JVM and Erlang

misha21:02:46

был бы он лиспом...

misha21:02:46

import Flare
import Flare.Smolder
 
ui = greet <$> string "Name" "World"
  where
  greet name = h1 $ text $ "Hello, " <> name <> "!"
закружилась голова от спецсимволов, как перл почти

kishanov21:02:14

да пес с ним с лиспом, была бы сразу нормальная поддержка в IDE. А то понапридумывают своих супер-пупер языков, а вместо автокомплита, goto definition и встроенной интеграции проекта с build файлом получаешь МПХ типа этого https://plugins.jetbrains.com/idea/plugin/7653-purescript-plugin

kishanov21:02:53

вот помню микрософт о девелоперах заботился: выпустили они первыс C# - открываешь проект и жманаешь “tab” пока код сам не напишется, и доки под рукой, и собирается в одну кнопочку. А тут приходишь - итак синтаксис неизвестный и либа непонятная, так еще и эдитор не помогает продвигаться

misha21:02:50

дык код в голове в первую очередь пишется, а не в IDE

kishanov21:02:22

это у тебя голова умная потому что, моя так не умеет, мне нужна зона комфорта 🙂

misha21:02:12

каждые 45 минут отвлекайся на 5 минут жаву по-автокомплитить в соседнем окне kappa

kishanov21:02:42

в бутиковых программистских комьюнити модно нигилистично код писать и одним редактором хорошо владеть, все как PragProg прописал. Я тоже в это верил, пока не поддался соблазну сидеть и таб нажимать 🙂

misha21:02:48

ну автокомпличеные паравозики длинной в 2 монитора разжижают мозг, я так после 4 лет жавы года полотора восстанавливался

kishanov21:02:05

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

dragoncube22:02:34

Java форева

dragoncube22:02:49

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

dragoncube22:02:19

язык конечно тоже доставляет, но коллеги - главное зло