Fork me on GitHub
#clojure-russia
<
2016-05-01
>
abtv07:05:36

@shinych: да, митап в 21:00 по московскому времени, в понедельник

andmed10:05:20

@serioga: ок учту

serioga11:05:23

> Почему мапа пустая первые три вызова put-into-index ?? Почему на четвертом создается три мапы, а не апдейтится имеющаяся? ленивость?

artemyarulin11:05:23

оо нас стало триста! (гусары молчать! 😄 )

dottedmag12:05:25

Вот скажите, как это называется? Берёшь библиотеку и начинаешь фиксить и контрибутить. Берёшь тул, и начинаешь строчить багрепорты. "Not yet production-ready"?

dottedmag12:05:34

Это я попробовал CIDER :)

andmed12:05:52

@serioga: может быть и ленивость, но выглядит как магия. а то что в мапу не складывает?

maxp12:05:31

Кто-нибудь boot-clj использует?

dottedmag12:05:49

Да, слегка.

maxp12:05:18

Захотелось мне инкрементальный номер билда в jar запихивать

maxp12:05:41

и за одно gitэ

maxp12:05:51

хэш коммита

maxp12:05:19

такое странное никому в голову не приходило?

maxp12:05:51

Кстати, boot как-то сильно интересный lein'а выглядит

dottedmag13:05:46

ну так boot pom -v 1.2.3+git556d+build6666

dottedmag13:05:08

Или изнутри, в (task-options! pom {:version "whatever"})

maxp13:05:29

вопрос, как лучше инкрементить этот самый whatever

dottedmag13:05:41

Это вопрос, внешний к среде сборки.

dottedmag13:05:55

Т.е. обычное дело -- получать этот номер из CI

maxp13:05:57

ну как бы да,

maxp13:05:14

но build.boot вполне нормальная программа

maxp13:05:36

почему бы ее не попросить поинкрементить мне что-нибудь simple_smile

dottedmag13:05:04

Поинкременть как твоей душе угодно, конечно.

maxp13:05:07

mount/start/stop я уже туда вписал simple_smile

maxp13:05:51

а как-нибудь оттуда можно к гиту сходить, хэш коммита спросить?

maxp13:05:03

вроде промелькивал где-то там гит-интерфейс?

dottedmag13:05:21

Как мне кажется, номер сборки вне CI смысла не имеет (всё равно связывать между собой артефакты, логи, тесты etc).

dottedmag13:05:35

Взять любой Java-git-клиент, или просто запустить git describe

maxp13:05:04

да где-то вроде я видел прямо git вызовы в boot'е

maxp13:05:15

поищу...

dottedmag13:05:00

джыгит!

maxp13:05:02

у меня как такового CI нет, а номер билда иногда требуется

dottedmag13:05:38

Кстати, там и describe есть.

maxp13:05:50

во, однако это оно и есть

andmed14:05:09

@serioga: спасибо. это меня персистентность и сайд-эффекты все подводят 😞

andmed14:05:06

да, про персистентность. в этом моем юзкейсе (чтение построково из файла, постройка индекса) есть вообще бенефит от персистентности? асинхронности вроде нет, io однопоточный и только у источника (вначале), потом линия вычислений. персистентные структуры они для других случаев? или кложа каким-то образом параллелит и этот простой юзкейс under the hood?

bezrukov14:05:00

@andmed: для таких случаев питон в самый раз))

andmed14:05:49

@bezrukov: а как можно модифицировать задачу, чтобы воспользоваться бенефитами персистентности? я пока даже использование индекса рассматриваю через "протаскивание" структуры данных через функции поиска, все в одну линию вроде...

andmed14:05:25

ну т.е. фп вроде поощеряет такой стиль...

bezrukov14:05:19

А в чем проблема текущей реализации? памяти не хватает или долго считает?

andmed14:05:45

@bezrukov: пытаюсь понять выгоды персистентной структуры данных на моем примере. недостатки уже прочувствовал.

maxp14:05:58

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

andmed14:05:40

@bezrukov: скорость ограничена io ясно дело, специальных мер по ускорению не предпринимал, но если структура персистентная, ээто как-то учитывается (оптимизируется) кложей?

andmed14:05:08

@maxp: угу. а как пример, модифицировать задачу, чтобы бенефиты прочувствовать?

maxp14:05:27

а в чем задача, если на словах?

maxp14:05:52

ну и совсем не обязательно в каждой задаче должны быть бенефиты simple_smile

andmed14:05:48

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

andmed14:05:21

ну хорошо. а персистентная структура, которую я так бережно передаю из функции в функцию для чего тогда?

maxp14:05:28

что значит "для чего?" для того же для чего любые другие данные

bezrukov14:05:54

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

andmed14:05:19

@bezrukov: это ты дал определение

bezrukov14:05:23

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

maxp14:05:24

то есть хочется построить мапу слово - [вектор номеров строк]

andmed14:05:12

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

maxp14:05:29

не будет быстрее вообще

maxp14:05:37

иммутабельность она не про это

andmed14:05:03

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

maxp14:05:25

что значит "чтобы пригодилась"?

andmed14:05:52

@maxp ну это вот про "эффективность" вот...

maxp14:05:15

тут какое-то недопонимание видимо

maxp14:05:44

иммутабельность дает возможность писать в функциональном стиле

maxp14:05:57

и локализовывать изменения стейта

maxp15:05:09

явным образом

andmed15:05:41

#явсепонял

maxp15:05:59

она же позволяет избегать разного рода рейсы

maxp15:05:17

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

maxp15:05:42

даже если написано update-in

maxp15:05:57

то это все равно новый объект

dottedmag15:05:23

Иммутабельность полезна между кусочками кода, а не внутри.

dottedmag15:05:44

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

andmed15:05:08

@dottedmag: можешь привести пример на основе этого юзкейса? чтобы понять...

dottedmag15:05:17

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

dottedmag15:05:16

@andmed: Вот у тебя есть функция, принимающая вектор и выплёвывающая map. Иммутабельность хороша тем, что 1) твой вектор, который ты туда засунул, функция тебе гарантированно не изменит; 2) мапой ты можешь распоряжаться как хочешь и пихать куда хочешь, она никогда внезапно под твоими ногами не изменится.

dottedmag15:05:53

А внутри реализации алгоритма иммутабельность толком и не нужна, если он сам по себе именно цикл-распарсить-добавить

bezrukov15:05:42

@andmed: вот тут Николай рассказывал про кложуру. В начале и про персистентные структуры есть. https://www.youtube.com/watch?v=6nA1OozPcbI

andmed15:05:20

@dottedmag: ok но пока она не в атоме (а она здесь не в атоме) я ее и изменить никак не могу, кроме как напрямую в функции. что значит внезапно?

dottedmag15:05:41

@andmed: Представь себе Java или Javascript, где ты передаёшь массив в функцию.

dottedmag15:05:06

Где гарантии, что этот массив внезапно не станет короче или длиннее через 30 минут работы программы?

dottedmag15:05:28

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

dottedmag15:05:43

Собственно, это и есть иммутабельность.

dottedmag15:05:27

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

andmed15:05:11

а. то есть энфорсится обработка переменной. а я уж думал кложа как-то треды запускает параллельно при обработке reduce или еще что... я про это..

andmed15:05:54

слово "эффективность" тогда лишнее, не?

maxp15:05:17

а откуда взялось это вообще?

maxp15:05:38

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

andmed15:05:15

окок. пока выглядит как дело привычки...

dottedmag15:05:41

Да, было бы интересно посчитать затраты на отладку мутабельных объектов в любой компании, которая использует node.

dottedmag15:05:56

Просто тупо как человеко-часы * зарплата.

maxp15:05:30

тут дело такое, например, я но ноде писал тоже более-менее функциональненько

maxp15:05:38

и на питоне

andmed15:05:09

это ведь джавоскриптовская беда в первую очередь (?)

dottedmag15:05:26

Поэтому я и написал "компании". Проблемы начинаются, когда суёшь объект в функцию, которая, судя по описанию читает твои аргументы, а потом день отлаживаешь, из-за того, что она где-то внутри что-то меняет.

dottedmag15:05:57

@andmed: Это беда любого языка с мутабельными структурами данных по умолчанию.

dottedmag15:05:25

Final никак не поможет, если у тебя там getter даёт объект, который не final.

dottedmag15:05:38

Так же, как и C++-ный или C-ный const.

andmed15:05:48

ну в общем да, плюс вложенность

dottedmag15:05:09

И тогда начинаются заклинания типа "правила Дамблдора Деметера", которые тоже не помогают.

dottedmag15:05:21

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

andmed15:05:18

ага. просто я вот тут мучал...ся с передаче все "в линейку" и мысль сверлила: а для чего, собственно??simple_smile

andmed15:05:51

это на энтерпрайз заточенная фича прямо-таки

dottedmag15:05:09

Из работающих вариантов решения есть подход Haskell "напишем всё в сигнатуре" и есть подход Clojure "по умолчанию всё иммутабельное, мутабельные штуки за углом, дятел просто не додумается".

maxp15:05:18

еще иммутабельность сподвигет писать composable код

dottedmag15:05:36

@maxp: Слегка. Не хватает ещё ленивости-по-умолчанию.

dottedmag15:05:58

Точнее, не ленивости, а подстановочности. Но это уже опять в хаскелл.

serioga15:05:10

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

serioga15:05:36

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

andmed15:05:08

@serioga: в случае с кложевским скриптом разве не переделывать? если условно запускать в два потока (второй с середины файла)

andmed15:05:06

и будет две иммутабельные структуры?

serioga15:05:09

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

serioga15:05:00

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

az15:05:23

https://github.com/steshaw/plt выглядит полезно, оставлю здесь

serioga15:05:24

> если условно запускать в два потока (второй с середины файла) ну, это ты разделил чтение файла на независимые части допустим но пишешь-то ты в одно место?

andmed15:05:48

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

maxp15:05:45

в иммутабельную и не пишется

maxp15:05:57

на основе нее создается новая структура

serioga15:05:38

а старая забывается и чистится автоматически

maxp15:05:05

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

serioga15:05:09

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

serioga15:05:05

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

andmed15:05:15

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

maxp15:05:17

там это где? я структуры сlojure имел ввиду

maxp15:05:51

дело не в энтерпрайзе, а в способе построения кода

maxp15:05:30

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

maxp15:05:56

возможно ленивая, притом

maxp15:05:17

отдельные трансформации получаются простыми

andmed15:05:49

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

maxp15:05:17

тут просто иначе сложно сделать simple_smile

andmed15:05:34

так зачем этот кактус есть?

maxp15:05:20

так это не кактус, а удобный способ

maxp15:05:34

я так и до кложи писал на других языках

leov15:05:16

ааа спасииите, Figwheel ПЕРЕЗАПУСКАЕТ defonce ааа что со мной не так

leov15:05:48

(defonce whatever* (.log js/console "DEFONCE DOES NOT WORK!!!")) печатает всё время

leov15:05:52

как же таааак аааааа

serioga15:05:01

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

andmed15:05:34

@maxp: редкий сорт кактуса, да 😀

serioga15:05:34

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

maxp15:05:45

вот-вот

maxp15:05:53

ООП зло! я всегда говорил simple_smile

maxp15:05:52

и да, явное вынесение mutable state - это правильный путь

serioga16:05:12

а так и в кложе есть мутабельность

(let [a 1 
      a (inc a) 
      a (inc a)]
  a)
simple_smile

andmed16:05:39

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

maxp16:05:16

так надо пописать чего-нибудь попробовать

andmed16:05:45

@maxp: так я и начал. написал -- оказалась БД LOL

maxp16:05:11

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

andmed16:05:33

к слову, в восьмой жаве есть .parallelStream() вот там я понимаю почему переменная в стриме должна быть "effectively final" в кложе -- нет

andmed16:05:13

@dottedmag: и скобочек пожалуйста!

serioga17:05:14

в кложе не запятых, наш человек 😀

delaguardo19:05:48

они есть, просто опциональны <зануда-мод off>

dottedmag19:05:42

(авотврусскомониувынеопциональныприходитсяписатьипробелыприходитсяписатьтакаявотпечаль)