Clojurians
#clojure-russia
<
2016-03-08
>

This page is not created by, affiliated with, or supported by Slack Technologies, Inc.

mike145206:03:10

да там не двоичные деревья, надо было взять в кавычки.

fxposter14:03:09

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

mike145214:03:43

не знаю, может уже обсуждали, но я только что попробовал редактор Atom + плагины: proto-repl, lisp-paredit. По-моему очень достойная замена Cursive. Есть подсветка синтаксиса как clojure так и Java, полноценный repl, всякие хоткеи для работы со скобками и repl'ом

mike145214:03:53

поработаю недельку - напишу отзыв

oxgrouby14:03:19

На что только люди не идут чтобы emacs не юзать =\

mike145214:03:58

я пользовался emacs'ом до тех пор пока не начал людей обучать Clojure. И тут я задумался - и так с clojure мозги придется упарывать при переходе с PLOP, то emacs'ом в голову до изучения языка это будет слишком.

mike145214:03:52

emacs + clojure это для jedy

nicola14:03:24

Ребята, кто балуется devops, буду на agile days рассказывать немного про continuous delivery. Сделал небольшой опросник - http://goo.gl/forms/RG8ivsUY0G - всем участникам будет благодарность на слайде simple_smile Ответы - https://docs.google.com/spreadsheets/d/1E7Doww6lTA_eXx8RWWrpowI9o8cBRVt_tjN1H5c--yw/edit?usp=sharing

artemyarulin15:03:14

А это, Microsoft анонсировала поддержку Linux в SQL Server вендекапец обсуждать тут не будем да? simple_smile Хотя кложура нынче на всех платформах, разве что эмбедед тока нету...

mike145216:03:21

@nicola: survey прошел

mike145217:03:58

@artemyarulin: для меня было бы интересно сравнение ms sql vs postgresql в разрезах: 1. стоимость лицензий 2. стоимость сопровождения 3. функциональность 4. НФТ в виде кластеризации, мониторинга 5. реальный опыт эксплуатации и того и другого

oxgrouby17:03:39

> пока не начал людей обучать Clojure. А каким образом и зачем? Ну, всмысле соседей-отрудников, приходящих, просто курсы, онлайновые? или как?

rmuslimov17:03:50

Чат, а подскажите пож-та как такая задача правильно должна быть реализована. Допустим, у меня есть достаточно дорогая по памяти и cpu, задача которая выглядит примерно так: (-> input ;; do major changes consequentially do-thing-1 do-thing-2 do-thing-3 ;; finally apply-and-save!) Я бы хотел на веб-интерфейсе пользователя делать какой то апдейт, чтобы дать знать о текущем состоянии дел. То есть, сколько документов обработано, сколько еще нет, какие возникли ошибки, etc. Я бы собственно завел какой нибудь внешний atom, и туда бы все писал, но любая книжка говорит "pure functions", никаких сайд-эффектов. Собственно, как быть? как доставлять текущее состояние в виде репорта

delaguardo18:03:38

можно вместо atom скидывать в chan из core.async

rm18:03:54

не никаких сайдэффектов, а делать их так, чтобы было издалека видно

rm18:03:47

можно да, текущее действие писать в канал, а оттуда уже плеваться в клиент

delaguardo18:03:09

так еще и real-time апдейты можно сделать

delaguardo18:03:24

а сам канал как часть input

rmuslimov18:03:28

да, точно - скидывать в канал это хорошо

mike145218:03:00

@oxgrouby: чтобы начать писать прод на clojure

rm18:03:19

mike1452: а это же ты сбертех?

nicola18:03:45

@rmuslimov из канала да в веб сокет ;)

nicola18:03:47

Можно и прямо в сокет

abtv18:03:51

@dottedmag: именно она, я довольно долго не мог ее решить, пока не нагуглил что это за последовательность. А ты ее легко решил?

nicola18:03:27

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

nicola18:03:06

тащи по всем шагам ссылку на сокет (или замыкание - (report msg) - чтобы проще тестить было) и репорть в нее.

nicola18:03:42

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

rmuslimov18:03:28

ok спасибо

larhat18:03:08

скорее чистые функции лифтятся в монаду? %)

nicola18:03:52

@larhat: ну это уже для искушенных определение simple_smile

artemyarulin19:03:50

@mike1452: Нынче же модняво всякие key/value DB, кинул в монго да и все, скорее всего сохраниться 😄

artemyarulin19:03:36

Сегодня скинули интересную доку https://github.com/zalando/zalando-rules-of-play#autonomy , оттуда кусок:

A service:
1 should be as autonomous as possible.
2 should run in its own process and be independently deployable.
3 should start up and be resilient when its dependencies are not available.
4 should not share its data storage or code repository with any other service, so that changes do not affect other systems. should not share libraries with other services, unless those libraries are open-source. Shared internal dependencies lead to a large-scale complexity over time
5 should not provide a client library. The core API and its data model are expressed as REST and JSON.
вот 1-3 все ок, но 4 и 5 прям как-так-то. Как же code reuse? С ФП так круто что можно написав одну функцию и дергать ее радостно везде, а тут грят нафег - копи пастим/пишем заново. Ну и последнее тоже - почему клиента плохо? Это ж круто, мож кто прокоментить?

dottedmag19:03:47

@abtv: Я ещё не решал, но вроде бы несложно. Раз от нас хотят именно все возможные расстановки скобок, то проще, чем "в лоб", не получится. Решение "в лоб": если мы знаем все расстановки скобок длины <=N, то все расстановки скобок длины N+2 получаются так: "()<все длины N>", "(<все длины 2>)<все длины N-2>", "(<все длины 4>)<все длины N-4>", ..., "(<все длины N>)". Базис рекурсии - длина 0, естественно.

dottedmag19:03:36

Если памяти хватит :)

rmuslimov19:03:13

@artemyarulin: 5 - клиент не нужен, если реализован нормальный API, двумя руками за

artemyarulin19:03:51

ну 5 ладно, может еще избыточно. Но почему нельзя шарить либы между сервисами?

artemyarulin19:03:00

т.е. код по сути

lich19:03:12

Всем привет, у меня вопрос возможно глупый, но я не очень разбираюсь в java. Нужно реализовать что-то такое:

lich19:03:32

я делаю так

rmuslimov19:03:05

@artemyarulin: у нас в компании shared repos превратились в кромешный ад со временем, конечно может мы тут не умеем писать код - но в итоге адский сумрак наступил из за того, что каждая репа занимается примерно 10 паралелльными вещами, то есть издалека посмотреть вроде библиотека для работа с данными отелей например - а в итоге размазанная логика, потому что соседняя либа тоже что то с отелями делает

rmuslimov19:03:56

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

lich19:03:07

При этом repl ругается, что не может найти метод enclosingClassMethod в EnclosingClass$NestedClass

rmuslimov19:03:14

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

mike145219:03:52

@artemyarulin: лучше уж в elasticsearch - весьма мощная штук.

dottedmag19:03:47

Вообще, это хорошая идея про разделение только опенсорсных библиотек.

dottedmag19:03:10

Если код не специфичен для компании, значит его можно опенсорснуть и разделять между компонентами.

dottedmag19:03:23

А если специфичен, то каждый сервис занимается своим делом.

lich19:03:56

сорри, что так влез и одним сообщением не написал

dottedmag19:03:56

@lich: Твой doto -- это эквивалент EnclosingClass vec = new EnclosingClass.NestedClass(); vec.enclosingClassMethod(1); vec.nestedClassMethod(2);

dottedmag19:03:26

@lich: Попробуй -> вместо

dottedmag19:03:16

@mike1452: ES можно, если данные не жалко.

lich19:03:52

@dottedmag: что-то не сработало, ошибка та же

mike145219:03:57

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

lich19:03:52

@dottedmag: кстати (class vec) => EnclosingClass$NestedClass

mike145219:03:48

@artemyarulin: может тут несколько другой контекст? Возможно имеют ввиду, что либу надо вынести в самостоятельный артефакт, вне рамок проекта. Наверно рекомендуют избегать ситуаций, где в одном большом проекте есть куча независимых подпроектов. Каждый из этих подрпроектов "дописывает" под свои нужды те или иные классы у соседей. в итоге получается очень тесно связанный код.

mike145219:03:05

кложурианцы, зацените! каналы можно класть и передавать в каналы!

mike145219:03:08

(def c (chan))
(def c2 (chan))
(go
  (println "got value from c: " (<! c)))

(put! c2 c)

(def v (<!! c2))

(put! v "abcd")

artemyarulin19:03:01

@rmuslimov: >а в остальном всегда лучше иметь монорепо в компании вот я на эту тему как раз. Прелесть монорепо же что можно заимплементить логику для своей доменной области (или как оно там называется) и юзать везде. Нюанс если оно конечно с сайд эфектами, я мож http либу юзаю одну, другой проект другую, не пере-использовать да, но если все на чистых функциях - то почему их не шарить, не понимаю. @mike1452: Да вроде не, написано should not share libraries with other services, unless those libraries are open-source. Т.е. именно никакого code reuse врутреннего кода компании Я просто не могу понять почему

dottedmag20:03:20

@mike1452: Он стабилен, но ненадёжен -- чуть что и грохается.

dottedmag20:03:56

@mike1452: У нас, правда, нагрузка небольшая и данных немного -- 80 гиг в день новых данных, и только неделю храним. Поэтому железо не самое мощное под это. Может на хорошем железе и нормально работает.

rmuslimov20:03:08

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

rmuslimov20:03:52

большинство рецептов приготовления ES, это иметь под боком что то вроде kafka из которой легко собирать ES индексы

abtv20:03:49

@dottedmag: я думаю, что с таким подходом должно работать, хотя заранее никогда не скажешь наверняка хватит ли 15 секунд на это. Плюс у них есть иногда баги: у тебя на компе тесты проходят, а у них вылетает таймаут и приходится немного менять решение. А ты много времени потратил, решая эти задачи? Интересно сколько другие тратят времени на это)

lich20:03:44

ну что, чат, есть ли у вас идеи по моей истории?

leov20:03:56

всем привет! гм. а может, извиняюсь за просьбу, кто-нибудь помочь настроить figwheel с vim-fireplace?

leov20:03:40

я запустил свежесгенерённый проект https://github.com/plexus/chestnut

leov20:03:08

и он работает, и шикарно выпадает в репл cljs подключённый окну браузера - в отдельном терминале

leov20:03:51

а вот как его соединить с vim-fireplace через команду Piggieback это каждый раз задачка - я плохо понимаю, как устроен репл в джаваскрипт.. (

trybeee21:03:50

@lich: а java код можно посмотреть?

lich21:03:15

@trybeee: я хотел вот эту библиотеку вызвать http://deeplearning4j.org/word2vec#code

delaguardo21:03:47

@lich: кажется вот так (doto (EnclosingClass.) (EnclosingClass$NestedClass.) (.enclosingClassMethod 1) (.nestedClassMethod 2))

delaguardo21:03:59

Word2Vec vec = new Word2Vec.Builder()
                .minWordFrequency(5)
                .iterations(1)
                .layerSize(100)
                .seed(42)
                .windowSize(5)
                .iterate(iter)
                .tokenizerFactory(t)
.build();
=>
(doto (doto (Word2Vec$Builder.)
        (.minWordFrequency 5)
        (.iterations 1)
        ...
        (.tokenizerFactory t))
  (.build))

lich21:03:18

я разобрался, дело в том, что ошибка No matching method found передается не только когда нет такого метода, но и когда туда передается значение другого типа

leov21:03:35

я пофиксил свою проблему по первым двум ссылкам отсюда http://ofnir.net/categories/clojure.html