This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2017-05-31
Channels
- # aleph (3)
- # aws (5)
- # beginners (65)
- # boot (17)
- # cljs-dev (112)
- # cljsrn (5)
- # clojure (146)
- # clojure-austin (3)
- # clojure-dusseldorf (3)
- # clojure-italy (18)
- # clojure-norway (13)
- # clojure-russia (84)
- # clojure-serbia (5)
- # clojure-spec (24)
- # clojure-uk (84)
- # clojurescript (204)
- # css (1)
- # cursive (21)
- # data-science (3)
- # datascript (21)
- # datomic (26)
- # emacs (5)
- # euroclojure (1)
- # hoplon (8)
- # jobs (7)
- # jobs-discuss (2)
- # keechma (35)
- # lumo (92)
- # mount (1)
- # nrepl (2)
- # numerical-computing (16)
- # off-topic (10)
- # om (58)
- # re-frame (13)
- # reagent (90)
- # remote-jobs (2)
- # ring-swagger (1)
- # spacemacs (9)
- # specter (6)
- # unrepl (17)
- # untangled (56)
- # yada (2)
@yogthos Поиграл с lumo. Взял простые примеры для Node.js с https://www.tutorialspoint.com/nodejs/nodejs_first_application.htm Поиграл с чтением локальных файлов и созданием примитивного web-сервера. Просто повторил приведенные примеры в синтаксисе ClojureScript. Все работает. Действительно, надо попробовать пописать скрипты на этом lumo вместо bash'a. Выглядит перспективно.
написал это с lumo для смеха https://gist.github.com/yogthos/d9d2324016f62d151c9843bdac3c0f23
и рекомендую http://documentup.com/shelljs/shelljs
это к стати тоже интересно https://github.com/eginez/calvin
уже вовсю используются async/await
async тоже не сахарный. нельзя внутри синхронной функции использовать await. получается всегда нужно заранее писать на async/await.
@nicola вчера упоминали про aot в системных сервисах на clojure. что имелось в виду под AOT? Наличие :gen-class в каждом файле и :aot :all в секции uberjar или что-то еще? я просто всегда пишу :aot :all и :gen-class на автомате. Для меня AOT именно это. Может быть есть что-то еще?
Да, вот хотел предложить темы для следующих выпусков если еще не было. :aot, :gen-class и прочие настройки для jvm.
Нет, сам clojurescrpit там хорошо работает, но если ты хочешь стороннюю библиотеку, например clj-http - придется приложить усилия и “простенький скрипт” уже не получится.
как-то хенгаут ушел в специфику формочек, и для тех кто хочет познакомится с ре-фрейм не очень познавательно будет. для большинства проектов хватает того что предлагает ре-фрейм, и это круто, его хватает. не надо ничего придумывать доделывать, ну можно если захочется всякие удобняшки, но в целом его плюсы такие, один раз ознакомился и понял и все. дальше оно все очень хорошо просто работает, буквально за минуты вы можете делать правки в чужом проекте, особенно если использовать re-frisk, т.к. структура проекта любого размера сразу вам хорошо понятна и вы быстро можете найти интересующий вас код, вы не увидите там ничего нового, в чем вам придется разбираться, весь стейт (мозг) в одном месте, ивенты (кровеносные сосуды) видны как распространяют дату по приложению. Так же упомянули что работает быстро, да, работает действительно быстро, есть дедупликация подписок, т.е. если вы работает с реагентом у вас все реакции всегда будут пересчитываться. в ре-фрейме сабскрибшены которые не активны ( т.е. нет замаунтеных вьюх которые подписаны на эти сабскрибшены) не будут пересчитываться, плюс дедупликация, одинаковые компутации не выполняются, только одна. Ивенты тоже решают две важных задачи, производительность. т.к. реализована finite-state-machine на goog.async.nextTick, и вся ваша логика разбита на маленькие чистые функции которые выполняются в каждом тике, плюс разбивая вашу логику на маленькие чистые функции очень легко находить ошибки в коде, с ре-фрейм я вообще забыл что такое дебажить код, две вещи которые могут произойти в рантайме это хиккап не валидный. и ошибка в ивенте, вот ошибку хорошо бы в re-frisk отловить, но пока re-frame не предлагает никакой реализации для этого, я разговаривал с Майком, в планах есть, т.е. если произойдет ошибка в ивенте этот ивент подсветится красным. RN приложение писать на re-frame просто сказка. Т.е. для большинства проектов ре-фрейм предлагает паттерн которого вам хватит, вам не придется чего -то придумать дописывать расширять итд. Ну разве что Make Views Great Again https://github.com/Day8/re-frame/issues/299
Мне наоборот понравилось что подняли важные темы и поговорили про то, чего нет в re-frame и про то как организовывать большие проекты. С re-frame “из коробки” любой сам в состоянии разобраться.
Хотел спросить, кто чем работает с sql'ом? А если точнее, то хотелось бы услышать плюсы и минусы korma и hugsql.
korma старая библиотека не обновлялась давно, по зависимостям могут быть конфликты. Я бы не стал ее больше брать только изза этого
Ловили недавно баг, не срабатывал жавоский булеан в кложе. Оказывается (= (Boolean. false) true)
. Конечно не стоит юзать Boolean.
но если это делает внешняя java библиотека то выбор у тебя не большой
@rmuslimov - korma нормальная либа. Пока не подводила. Да и развивать там особо уже нечего
@kronos_vano в “joy of clojure” этому факту целая страница посвящена
И что там рекомендуется?
Остерегаться чего? java библиотек которые это делают? К сожалению в нашем случае не получится 😞
nicola: Как вы делаете например pagination? Добавляете в каждый запрос limit и offset? Возникает проблема излишнего копипаста. Возможно есть какие-то приятные фичи у honeysql, которых нет у hugsql, чтобы делать подобные штуки удобнее?
Получается, что мне в одном месте нужно провалидировать значения этих параметров в кложе, потом добавить в .sql файл limit & offset, потом добавить в респонс Link header. Получается три места куда нужно что-то написать, чтобы появилась пагинация, это ещё не считая параметров эндпоинтов у компожуры. кажется, если бы sql генерировался из какой-нибудь структурки данных, все эти три места можно было сократить до одного вызова функции. Хотя код сейчас структурирован так, что всё равно хэдеры отдельно в респонс добавлять придётся. И в итоге и правда не так много профита получится, но тем не менее, два места (валидация и sql) сократится до одного.
небольшой оффтоп: а какой стэк вы на бэке используете? веб-сервер, component/mount, какую либу для роутинга и т.д.
Ты видимо спутал с yesql - https://github.com/jkk/honeysql
http-kit, sometimes mount-lite, https://github.com/niquola/clj-pg, https://github.com/niquola/route-map
I'm blind 😃 Да, спутал. Тогда всё встало на свои места.
Спасибо за инфу про стэк.
Ещё вопрос, а вы что-то типа swagger используете? или как документируете свои апишки?
@kronos_vano Ловить на стыке и конвертить 😞
dottedmag: Так и делаем. Но поймать это было непросто
>(= (Boolean. false) true) а можно объяснить для тупых почему так?
а в чем вопрос то?
user=> (= (Boolean. false) true)
false
т.е. в какой-то версии это тру, прально я понимаю?
очень странно там последние изменения были 7 лет назад
из разных потоков не сравнивали случайно? 🙂
ага, подозрительно чота
полез в исходники посмотреть, а там такооое 🙀
@artemyarulin Потому что любой джава-объект в булевом контексте тру
куски кода закоменнченые, всякие print’ы и ноль комментов
@dragoncube Так проблема-то в том, что (= (Boolean. false) false)
тоже false
.
@dragoncube Комментарии тут особенно не нужны, компилятор вполне себе понятный, если вчитаться.
user=> (= (Boolean. false) false)
true
@dottedmag ну может не нужны, но код выглядит КРАЙНЕ не аккуратно
user=> (= (Boolean. false) false)
true
user=> (= (Boolean. false) true)
false
user=> (= (Boolean. true) true)
true
user=> (= (Boolean. true) false)
false
все OK
@dragoncube А, не в сравнении! В булевом контексте.
ну так это другое дело
это то понятно почему
в этом контексте (Boolean. false) эквивалентно (Integer. 1)
ну или (Integer. 42)
аааа, а то нагнали паники понимаешь))
потому что (Boolean. false) это инстанс нового объекта который совсем не тот на который ссылается кожуриный компилятор когда упоминается false
а в жаве самой кста new Boolean(true) != true
?
public class Main {
public static void main(String [] args) {
System.out.println(System.identityHashCode(new Boolean(false)));
System.out.println(System.identityHashCode(false));
System.out.println(System.identityHashCode(Boolean.FALSE));
System.out.println(new Boolean(false) == Boolean.FALSE);
}
}
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)
1252169911
2101973421
2101973421
false
с true такая же история
а если в if контексте if (new Boolean(false))
то оно как себя ведет? Или компилятор потребует к bool привести?
в Java?
ага, а хотя пофег, я думаю редко кто оборачивает true|false в Boolean
ну бывает
потому как в коллекциях примитивные типы нельзя хранить
в твое примере сначала будет unboxing который приведет к примитиву false
и уже два примитива будут сравниваться
(true? (Boolean. false))
=> false
(true? (Boolean. true))
=> false
(true? (Boolean/TRUE))
=> true
(true? (Boolean/FALSE))
=> false
(true? (boolean (Boolean. true)))
=> true
это кстати показательный полный interop с Java 🙂 все точно также
nicola: Как вы делаете например pagination? Добавляете в каждый запрос limit и offset? Возникает проблема излишнего копипаста. Возможно есть какие-то приятные фичи у honeysql, которых нет у hugsql, чтобы делать подобные штуки удобнее?