Fork me on GitHub
#clojure-russia
<
2016-11-16
>
be903:11:13

это любовь за деньги 😄

be903:11:28

Подскажите простейший способ реализации такого. Мне нужно сходить на два сайта (параллельно), из тела ответа что-то вытащить и собрать из двух один результат. Если какой-то из сайтов обломался (таймаут / HTTP ошибка), то вернуть частичный результат. Если оба обломались, вернуть, например, nil.

potapenko04:11:28

@be9 clj-http? клиентом стучись, чего сложного то? или какой друю либу с http клиентом. паралель тем же pmap

be904:11:09

пока придумал деливерить в 2 promise

potapenko04:11:35

ну токда пофигу как

potapenko04:11:57

я асинком люблю делать такое. а паралельность обеспечить дело второе.

potapenko04:11:29

тело парсить - хтмл?

be904:11:15

да с парсингом проблем нет. в простейшем случае regexp хватает

be904:11:32

вопрос был про православный параллелизм 🙂

be904:11:58

а в асинке как, два канала?

rmuslimov04:11:24

@be9 а в чем подвох? Берешь httpkit client делаешь два реквеста (он async) потом каждый из deref (берешь ответы) и делаешь regex

rmuslimov04:11:33

можно 3

rmuslimov04:11:44

можно 4 или 5 реквестов параллельно

be904:11:39

да, спасибо

potapenko04:11:49

ну например два go блока 🙂

potapenko04:11:02

ждем два <!

potapenko04:11:13

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

potapenko04:11:45

но проще в это задаче через future и pmap

rmuslimov05:11:03

@potapenko так мой вариант разве не легче?

potapenko05:11:21

да легче, коенчно. просто вопрос бы про async

rmuslimov05:11:50

так он мне кажется async и есть

potapenko05:11:56

не люблю калбэки всякие просто

rmuslimov05:11:57

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

rmuslimov05:11:12

да вроде нет коллбеков

potapenko05:11:20

а… ну тогда вообще прекрасно

potapenko05:11:10

ну да defef ведь

potapenko05:11:44

Красивая она кложа до упомоморачения, Так красива, что стал ненавидить все другое 🙂 Скалу, например. Налетело коршунов-макетологов-толкателей. Впаривают эту скалу, а прекрасная кложа стоит грустная в сторонке 🙂

rmuslimov05:11:29

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

rmuslimov05:11:49

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

rmuslimov05:11:01

а там баги и пошло поехало

rmuslimov05:11:11

приходится переписывать полностью

rmuslimov05:11:13

со временем

rmuslimov05:11:18

но видимо это нормально

potapenko05:11:43

ну переписывать это почти всегда необходимость

potapenko05:11:03

раза так три 🙂

potapenko05:11:23

я вот тоже недавно коод свой прошерстил старый

potapenko05:11:27

ужас ужас

potapenko05:11:59

классно что на емаксе/cider еще быстренько красиво отформатировал, моя был довольна. отпустило.

potapenko05:11:18

но что у меня было в голове, когда я это писал - не понятно. новичок, да. Еще лисп синтаксис пугает народ. Дот нотация стала стандартом. А тут другое.

rmuslimov05:11:03

угу, меня тоже затрахали (изв. за выражение) что мол сложно. Там вообще нет синтаксиса

rmuslimov05:11:31

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

rmuslimov05:11:53

нет синтаксиса - 20 мин научиться читать код

potapenko05:11:14

да, это тупо дизайн. в лиспе чистый AST. а там рюшечки. Дот нотация все равно в s-expreшены превратит компилятор.

be906:11:52

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

be906:11:00

все языки с фигурными скобочками (C/C++, Java, Scala) в основе своей похожи, и если хоть один знаешь, то научиться на другом гораздо проще

be906:11:39

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

be906:11:01

я в Clojure долго въезжал, имея 20+ лет опыта в императивщине

andre07:11:21

я вот так скажу, 69% of all developers tell us they are at least partly self-taught

andre07:11:32

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

artemyarulin07:11:34

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

be908:11:25

@andre не очень понятно, что ты этим хочешь сказать

be908:11:49

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

turtle08:11:03

В Яндексе гит. Чувак из маркета говорит. ) И вообще там у них везде гит.

turtle08:11:16

Оффтоп, но уже второй раз про SVN вижу.

turtle08:11:27

Там такие гуру гита на новый функционал по 4 ветки делают.

rmuslimov09:11:20

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

rmuslimov09:11:46

конечно синтаксис и опыт программирования разные вещи

be909:11:26

Я никого не пытаюсь подловить, а выражаю своё мнение: сложность, про которую говорят люди, в Clojure и в лиспах существует, просто она не в синтаксисе. И learning curve совсем другой. На той же скале можно писать как на удобной жабе, а потом потихоньку переходить к неизменяемым структурам данных и прочей функциональщине. с clojure так не выйдет.

seryh10:11:27

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

seryh10:11:29

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

alexander_mihailov10:11:59

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

be911:11:02

да, кстати, в самой жабе так не наворотишь. а вот скала и свежие стандарты C++ прямо дают в руки возможности «удивить» коллег

be911:11:27

насчёт джаваскрипта. у нас в конторе народ стал потихоньку с него на typescript и go мигрировать

be911:11:08

ну ой. первые три варианта — это надо всё переписать полностью, от слова совсем

andre11:11:09

а на typescript и go ?

seryh11:11:23

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

andre11:11:27

может оно и к лучшему что нужно переписать?

be911:11:40

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

andre11:11:59

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

be911:11:26

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

be911:11:03

и если TS = JS + типы (классы мы и так не используем), то Elm и CLJS — это совсем другая опера.

be911:11:05

поэтому функциональщина у нас делается через http://ramdajs.com/, а не через Elm 🙂

seryh11:11:08

а как же мега фичи Elm и CLJS? в виде более простого кода и интерактивной разработки? раздуплиться в необычный синтаксис на сегодня будет проще чем в какой нибуть react+redux+babel+webpack+lodash+можно бесконечно продолжать

savelichalex11:11:11

так говоришь как будто не надо изучать lein+figwheel+reagent+re-frame+можно бесконечно продолжать

be911:11:40

у нас бэкенд в основном

be911:11:01

стартап начался с ноды, так и пошло...

be911:11:00

кстати, а уже появилось что-то лучше re-frame? 🙂

seryh11:11:11

@savelichalex я сужу по опыту ) опыта с js - 6 лет, с clojure - меньше года. раздуплиться в lein+figwheel+reagent+re-frame оказалось проще чем react+redux+babel+webpack+lodash

andre11:11:12

re-frame 0.8.0 🙂

andre11:11:17

тут даже дело в том что ты можешь войти в мир кложи не вдупляя как оно все вработает первое время, но будет работать надежно. само по себе 🙂

andre11:11:25

по умолчанию

be911:11:12

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

andre12:11:21

а захотеть войти, достаточно увидеть счастливое лицо человека использующего figwheel и devcards

seryh12:11:48

пока не расскажешь что происходит видят только это - https://pbs.twimg.com/media/CukkQOkWgAA5C8G.jpg

ponimas12:11:56

несбалансированы скобочки, кстати

savelichalex12:11:21

@seryh ну дык и я по опыту) по моему одинаково, всегда что то учить приходится

andmed12:11:03

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

andmed12:11:39

еще частенько вижу, что решение плюсистов короче и алгоритмичнее, что ли чем у колег-жавистов

be912:11:43

@andmed «с него» — я имел в виду JS

be912:11:26

в плюсах больше по делу, да. до Abstract Factory руки не доходят

andmed12:11:59

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

seryh12:11:01

@savelichalex я не осилил в то что в случае react. нужно с ворохом пакетов индивидуально раздупляться. я так и не понял как мне просто собрать реактивное SPA из всего этого. в то время как на cljs я сразу в доках увидел простое lein new re-frame <project-name> +re-com

be912:11:12

@seryh тут поддерживаю. сам я во фронте понимаю слабо, и re-frame — это практически единственная возможность что-то сделать, не умерев на полпути. одно SPA уже так написал 🙂

seryh12:11:50

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

be912:11:31

а это зачем, кстати?

seryh12:11:49

для сборщиков. babel там и веб пак

be912:11:59

ну в смысле винда зачем

seryh12:11:27

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

be912:11:00

дак они как бы и под мак существуют

seryh12:11:24

я из новосиба ) тут работодатели не такие нажористые

be912:11:12

ах. я, кстати, тоже ✌️

be912:11:54

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

be912:11:49

там все их 100500 прог и вроде не очень дорого

andre12:11:21

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

andre12:11:31

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

be912:11:33

кстати, насчёт фронта. а CSS чем собираешь?

be912:11:55

без ноды, бинарным?

seryh12:11:57

плагин к gulp

be912:11:07

так-так. т.е. нода всё-таки есть для gulp 😄

seryh12:11:27

канеш. мигрировать на cljs пока у меня в мечтах

be912:11:19

я спрашиваю как раз в контексте cljs. ладно, JS весь переваривается closure компайлером. а CSS?

andre12:11:55

и css 🙂

be912:11:08

только не надо про garden

andre12:11:12

почему?

be912:11:14

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

be912:11:25

а что у garden?

andre12:11:46

я тоже программист, и с цсс вообще не хочу дружить, спасибо re-com, но вот мой друг верстальщик, сказал что он не хочет мой garden пришлось прикрутить stylus , установить npm не забыть запустить его чтобы он следил за изменениями и перекомпилил

andre12:11:56

но я честно не вижу что есть такое в sylus чего нет в garden

be912:11:30

господи, stylus. ещё какую-то оболочку для цсс придумали...

be912:11:35

интересно, Нолен тоже garden пользует?

andmed12:11:55

про сложность/необычность fp: пару месяцев занимался другим, и мозги заржавели... например, как переложить алгоритм токенизации строки без пробелов, в слова. алгоритм выглядит так: посимвольно прибавляем, если находим в словаре, то если токенизируем остаток (рекурсия) то кладем в словарь и возвращаем true. если не находим возвращаем false. просто, но этот алгоритм требует стейта. как его переложить, чтобы красиво и без стейта

be913:11:51

reduce + рекурсия

andmed13:11:53

вроде даже без reduce можно... передавать/возвращать стэк с токенами, или пустой, если не токенезиреутся в конце. счас попробую...

andmed13:11:02

про learning curve: следующие вопросы будут, как досрочно выйти из for цикла и #почемутаквсесложно, дада

lowl4tency13:11:35

Пацаны, а глупый вопрос

be913:11:54

из for никак 🙂 используй уж тогда loop, в котором можно этим управлять

lowl4tency13:11:25

А есть какой-то синатксис для

(defn func [{:keys [all]}] <body>)

lowl4tency13:11:38

Чтобы мне не расписывать все ключи

be913:11:40

loop + recur , и императивный алгоритм легко реализуется 😄

be913:11:16

@lowl4tency а как бы это могло работать вообще?

lowl4tency13:11:30

ну я вот спрашиваю есть такое или нет 🙂

be913:11:59

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

lowl4tency13:11:08

да засада

lowl4tency13:11:14

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

be913:11:42

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

lowl4tency13:11:51

ну хотя я смотрю, мне вроде все и не надо

lowl4tency13:11:02

но я на всякий случай спросил вдруг я зря расписываю

be913:11:10

не, это только если макрос руками

be913:11:59

вот например, если ты все параметры будешь звать одинаково: p-foo, p-bar, p-blah и т.д. и напишешь макрос, который их все заменит на (:foo m) и т.д., то оно вполне себе будет работать

lowl4tency13:11:14

не, за это меня потом четвертуют

artemyarulin14:11:48

мне обычно всегда хватало

[{:keys [a b] :as all}]
  (println a)
  (println b)
  (println (keys all))

lowl4tency14:11:18

ух ты про :as не знал

andmed14:11:05

@be9 потом надо сообразить как

(for [e (reductions str s)]    e)
переделать на loop.. я это к тому что алгоритмические книги написаны с расчетом на встроенный функционал, отсутствие которого в кложе решает. и испытуемый закономерно идет дальше писать на понятном языке да еще плечами пожимает ✍️

andmed14:11:19

кнута не хватает

be914:11:20

ну а что кнут. у него там всё на MIX, звиняйте, господа функциональщики (или MMIX теперь)

lowl4tency14:11:14

Парни, а кто у нас админ группы в вк?

be914:11:48

кстати, из серии "не знал". вот я недавно наткнулся на прекраснейший clojure.test/are.

be914:11:26

позволяет писать тесты вот так:

(deftest parse-number-test
  (are [s n]
    (= (parse-number s) n)
    "123" 123M
    "123.45" 123.45M
    "$123" 123M
    "1 123.45" 1123.45M
    "-123" -123M
    "- 1 000 999.88" -1000999.88M))

be914:11:09

а раньше я уныло писал (is (= (f чё-то) то-то))

be914:11:52

@lowl4tency а что за группа в ВК?

lowl4tency14:11:58

10 декабря в Минске пройдёт конференция, посвященная функциональным языкам программирования – F(by). В этом году мы сосредоточимся на Scala, Clojure, а также функциональном подходе в Kotlin, реактивных программах в ClojueScript, PureScript, JavaScript, TypeScript. Среди спикеров – авторы фреймворков и активные контрибьюторы в технологии. Программа и билеты – на . #funcby

andmed14:11:38

а до этого, 3го в Мск fp конфа. Обещается @nicola , повод выпить в общем

be914:11:17

группа че-то не очень живая

lowl4tency14:11:24

Она чото совсем мертвая

lowl4tency14:11:47

Это, если кто хочет на минскую конфу, мне обещали билет

be914:11:53

а в FB нет? 🙂

andmed14:11:21

т.е. конфе в минске покруче будет?

be914:11:30

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

andmed14:11:19

180 byn это сколько...

lowl4tency14:11:13

180 Belarusian Ruble equals 91.88 US Dollar

andre14:11:49

5 956.60 российский рубль

lowl4tency15:11:07

Билет на f(by) уходит к @andmed

rustam.gilaztdinov15:11:17

А ни у кого больше билетов не завалялось? 👀 Тоже хочу поехать)

lowl4tency16:11:25

Внезапно

lowl4tency16:11:32

батсов будет на fby

lowl4tency17:11:21

rustam.gilaztdinov я буду иметь тебя в виду если появится

misha18:11:57

в кложе (и наверняка в других лиспах), общий синтаксис всякой джавы/жс (которого немного больше, но он нерасширяемый), заменяется супер простыми для понимания s-выражениями + сигнатурой ~топ50 самых распространенных функций/макросов. получается, что в сумме учить сильно больше, чем "первый элемент в скобочках - функция, остальные - аргументы" приходится, особенно, когда не знаешь, какие макросы/функции - самые частоупотребляемые, а какие - чисто библиотечный прикол какой-то

misha18:11:40

показать хотя бы новичку, который let еще не особо привык глазами парсить, супер простой rum компонент из доков:

(rum/defc label < rum/static [n text]
  [:.label (repeat n text)])

misha18:11:16

что за <? что вообще происходит?

misha18:11:40

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

misha18:11:12

totally worth it kappa

artemyarulin18:11:35

>что за <? что вообще происходит?

artemyarulin18:11:59

говнокодить на жс всеж далеко не уйдешь, а вот с макросам в лиспах можно такое натворить огого!

artemyarulin18:11:30

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

misha18:11:25

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

artemyarulin18:11:23

тру, но по началу я помню было тяжело, это счас уже кложура.кор на подкорке

misha18:11:10

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

misha18:11:53

ага, переходил бы я с питона - было бы проще, а то 4 года джавы мозги разжижили совершенно

artemyarulin18:11:58

о да - тяжелее всего было императивщину убрать из головы, я после 5 лет с C# пришел тож

misha18:11:58

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

misha18:11:32

как только идея начала подчеркивать и автодополнять джаву - harold

seryh18:11:13

для emacs есть такая визуализация кривой обучения: http://farm4.staticflickr.com/3109/3251176498_c3485a55fb.jpg для кложы тоже подходит )

andmed19:11:59

говорите об импереративщине так, как будто это плохо

andmed19:11:20

стандартные алгоритмы под нее заточены вроде как

andmed19:11:32

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

andmed19:11:40

разве что она на подкорке

artemyarulin19:11:26

ну а что хорошего когда 95% функций (точнее методов класса чтоб было еще хуже) возвращают void мутируя все что вокруг

artemyarulin19:11:51

когда будут проблемы с перформансом вот тогда их и решать, а с ФП очень хорошо растет maintainability

andmed19:11:45

про ынтырпрайз, который через геттер получает объект чтобы его мутировать, я не говорю. но кмк мне проще реализовать ту же рекурсию, в том смысле что не нужно заботиться о протаскивании данных дополнительно, если стейт управляется функцией. и так вроде алгоритмы написаны. или почему нужно дополнительно ломать голову как реализовать break если в алгоритме передо мно (о чудо!) этот break есть, лучше на другое время тратить

andmed19:11:51

я не против кложи есличо)

misha19:11:08

transient и поехали

artemyarulin19:11:11

да неа, тут я соглашусь - стандартные алгоритмы на кложуре (и вообще ФП языках) делать боль ибо были придуманы для императивных языков

artemyarulin19:11:42

но опять же - спуститься то вниз не сложно, что на ЖС, что на жаву если надо

misha19:11:08

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

andmed20:11:22

ну да, сильно нишевой язык. с чего и оттолкнулись. алгоритмы? работа с железом? сложный api? кложа не для этого ну и ладно. @misha я просто щаз задачки решаю и вдруг осознал, что кложу применить могу только через боль (с учетом того, что я в ней небольшой спец да). а стандартные алгоритмы это фсе: от натаскивания в универе, до собеседования на работе. собственно вопрос был, откуда им кложуристам взяться

misha20:11:54

фсе: от натаскивания в универе, до собеседования на работе
kappa

andmed20:11:32

"... и структуры данных".

misha20:11:05

сколько ты кастомных структур данных написал?

andmed20:11:30

а на работе, потом пойди убеди всех перейти в прекрасный мир мап-редьюс...

andmed20:11:40

@misha не переходи на личности))

misha20:11:11

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

misha20:11:05

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

misha20:11:21

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

misha20:11:44

из этих 10 лет, "алгоритмы на собеседовании" заняли часа 3

artemyarulin20:11:46

вот вот, 95% ты реализуешь бизнес логику и UI натягиваешь, тут круче кложуры нет. Но кстати я счас по собеседованиям хожу дак задачи все всегда на JS пишу ибо чтоб 1) Не пугать народ 2) Императивно быстрее сделать. Правильно со всякими рекурсиями и immutable data structures у меня хз скок может времени уйти

artemyarulin20:11:41

(что опять же говорит о том как собеседования далеки от того что ты реально будешь делать на работе, эх…)

andmed20:11:03

эт да...

artemyarulin20:11:48

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

andre20:11:42

в финке нет ничего по кложе совсем?

andre20:11:00

северные народы предпочитают java/javascript

andre20:11:31

я тут просто смотрел в Таллине вакансии , у них строго java/javascript никаких отклонений

andmed20:11:37

@andre шутишь. на сентябрьской конференции в Тампере было почти научно доказано, что Финка - всемирный центр кложестроения

misha20:11:45

есть, просто 2-3 чувака могут сами затащить громадный проект kappa

andre20:11:01

обратная сторона )

andre20:11:19

для нас, нужно меньше разрабов на проект )