clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
2017-09-25T04:40:12.000130Z

@dottedmag так хероку чем не вариант?

2017-09-25T06:09:30.000160Z

Хероку на бесплатном тарифе дает 500 часов работы приложения (точнее, на все приложения с одного аккаунта) в месяц. Можно подтвердить кредиткой (не пробовал) и получить 1000. И если приложение (оформленное как вэб, а не как службу или как-то там еще) полчаса не дергать, то херока сама его завершает, для экономии этих самых часов.

dottedmag 2017-09-25T07:30:56.000204Z

@rmuslimov А я не знал, что там джава.

dottedmag 2017-09-25T07:30:59.000122Z

Попробую, спасибо.

anjensan 2017-09-25T09:03:14.000376Z

@ivana незаконно - структуры в кложе не могут быть циклическими

anjensan 2017-09-25T09:03:41.000238Z

можно делать хак с рефами... но тогда юзай лучше atom/ref, но не var

2017-09-25T09:54:58.000141Z

@anjensan спасибо, я уже сделал через резолв символов, чтобы было труЪ-иммутабельно

anjensan 2017-09-25T09:55:28.000143Z

через резолв символов - а эт как ?

anjensan 2017-09-25T09:56:08.000199Z

типо {:ref #'x} ?

2017-09-25T09:57:25.000247Z

типа так

(defn get-type [type-field]
  (let [type (:type type-field)]
    (if (string? type) @(resolve (symbol type)) type)))

2017-09-25T09:58:20.000235Z

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

anjensan 2017-09-25T10:01:44.000438Z

o-O

anjensan 2017-09-25T10:02:47.000246Z

а нифага это все если не секрет ?

anjensan 2017-09-25T10:02:58.000375Z

в чем макгический смысл поля :type

anjensan 2017-09-25T10:03:08.000307Z

https://clojuredocs.org/clojure.core/type

anjensan 2017-09-25T10:03:16.000148Z

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

anjensan 2017-09-25T10:05:03.000085Z

зы: уж лучше делать как советовали выше - declare + #'x ссылки нежели юзать resolve... не делай resolve лучше

anjensan 2017-09-25T10:05:29.000030Z

это для всяких реплов.. дебага и всего такого

andre 2017-09-25T10:36:49.000059Z

https://www.youtube.com/watch?v=Pa2OMjxkZ-c записал небольшую демку RN , CursiveIDE

anjensan 2017-09-25T10:44:25.000122Z

круто! но имхо музычку стоило бы поменять/убрать 🙂

2017-09-25T10:48:01.000213Z

@anjensan это моя попытка сделать циклический граф. Хорошо, я поменяю свои резолвы на символы, просто с символами не догадался что их надо тоже декларить, но выше подсказали.

anjensan 2017-09-25T10:48:47.000035Z

@ivana а зачем тебе вообще циклический граф? он реально нужен? может тут проблема глубже

2017-09-25T10:53:06.000349Z

я уверен что нужен. хотя могу ошибаться. смотри - у меня есть sql таблицы: юзер, и связанные с ним комменты. В Графкуэле некто набирает запрос: подать юзера Иванова, все его комменты, у каждого коммента автора, у каждого автора все его комменты... и так раз 10 по вложенности 🙂 Пример искусственный, но думаю ты понимаешь о чем я. Мне надо пройтись по этому запросу и некоей своей структуре, которая поможет выбрать данные. ВОт эта моя структура и должна в таком случае быь циклическим графом - Юзер содержит комменты, а коммент содержит Юзера-автора.

2017-09-25T10:53:28.000315Z

Но сейчас у меня все отлично работает и на 10 уровнях вложенности

anjensan 2017-09-25T10:53:45.000011Z

нет. структуре не обязательно быть циклическим графом

2017-09-25T10:54:18.000359Z

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

anjensan 2017-09-25T10:54:44.000265Z

ну блин. ты же даже отдаешь данные не в виде цилк графа

2017-09-25T10:55:30.000062Z

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

2017-09-25T10:56:04.000327Z

это же бред, держать у себя 15 уровней про запас, но не циклических

andre 2017-09-25T10:57:18.000172Z

ну можно замьютить )

2017-09-25T10:58:39.000009Z

в этом подходе то как раз у меня сложностей и сомнений нет, только была засада после Хаскеля понять как в Кложе подобные вещи делаются. Теперь понял. (Или снова выдашь значок наркомана? 😉 )

anjensan 2017-09-25T11:21:17.000241Z

а кто мешает это хранить не как {:user "user1" :comments [{...}, {...}]}, а скажем так {:users {"User1" {... :comments [1 2 3]}, ... :commets {1 {...}, 2 {...}, ...}}

anjensan 2017-09-25T11:21:34.000140Z

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

anjensan 2017-09-25T11:21:57.000335Z

или, например, что-то вроде {:ref-type :comment :id <comment-id>}

2017-09-25T11:22:33.000236Z

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

2017-09-25T11:24:12.000236Z

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

anjensan 2017-09-25T11:48:57.000287Z

так что в этом графе ?

anjensan 2017-09-25T11:49:43.000358Z

зы: не стоит отдавать 10 уровне вложенности. ни в коем случае

anjensan 2017-09-25T11:50:54.000088Z

простейшая математика из младших классов... у тебя 10 юзеров... у каждого 10 комментариев... итогда 100 комментариев... у каждого комментария один автор... у каждого автора 10 комментариев... у тебя 1000 комментариев... у каждого один автор, у каждого автора 10 комментарев... у тебя 10000 комментариев

anjensan 2017-09-25T11:52:27.000105Z

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

anjensan 2017-09-25T11:53:45.000289Z

даже в твоем примере (юзер с айди 1, 5 циклов user -> comments) у тебя будет на последнем n ^ 5 комментов на последнем уровне

anjensan 2017-09-25T11:54:21.000077Z

если юзер болтливый и сделает 500 комментов - это 31250000000000 записией...

2017-09-25T12:03:43.000183Z

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

anjensan 2017-09-25T12:06:48.000206Z

ну будешь краснеть

anjensan 2017-09-25T12:07:04.000234Z

когда твой код вернет респонс с 100499 записями, и выдаст ошибку при 100500

anjensan 2017-09-25T12:10:41.000229Z

так что такое a и b ? это... инфа о таблицах {:name "TableName" :ref <something-strange?} ?

2017-09-25T12:13:48.000232Z

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

anjensan 2017-09-25T12:14:36.000022Z

отлично. а где ты эти мапы хранишь? кажду в отдельной переменной ?

anjensan 2017-09-25T12:14:52.000244Z

точнее в отдельной var ячейке ?

2017-09-25T12:15:06.000027Z

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

2017-09-25T12:15:26.000099Z

в отдельном неймспейсе конечно

anjensan 2017-09-25T13:12:16.000118Z

@ivana ясненько. тогда признаю, что цилк-ссылки норм и я был не прав 😞

2017-09-25T13:15:34.000157Z

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

2017-09-25T13:16:57.000261Z

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

2017-09-25T19:13:14.000298Z

Как отключить лог-спам? При старте сервера пишет

19:16:05.803 [main] DEBUG org.eclipse.jetty.util.log - Logging to Logger[org.eclipse.jetty.util.log] via org.eclipse.jetty.util.log.Slf4jLog
19:16:05.811 [main] INFO  org.eclipse.jetty.util.log - Logging initialized @1449ms
а потом начинается полный ужас - терминал загаживается сотнями сообщений в секунду и становится неюзабельным. Несколько часов гуглю, пробую разные варианты, и не могу добиться результата. Я уже готов плохое делать разработчикам логеров.

potapenko 2017-09-25T19:19:44.000406Z

@ivana а какой у тебя логгер? обычно нужно настроить какой log4j или logback, там указываешь каким пакетам “молчать” а каким “говорить” 🙂

2017-09-25T19:28:32.000124Z

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

2017-09-25T19:30:25.000072Z

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

potapenko 2017-09-25T20:53:38.000369Z

зависимости не помогут - это джава зависимости

potapenko 2017-09-25T20:56:10.000199Z

собери проект через тот же Luminus, http://www.luminusweb.net/docs сгенери проект заново, добавь свои зависимости. Перенеси исходники. Толковый набор либ. а потом поправь логгинг http://www.luminusweb.net/docs/logging.md clojure - это сначала джава, оттуда и идут всякие логгинги и log4j

2017-09-25T21:01:03.000155Z

Подсказали волшебное слово :exclusions, методом тыка вырезал из нужной либы зависимости на логи, оно все не хотело работать, но оставил эту slf4j и эксклюдил пару логбаков - и вот он, йаааазззь!

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See <http://www.slf4j.org/codes.html#StaticLoggerBinder> for further details.
и вроде остальное все нормально работает, детально не проверял, но навскидку да. PS какая хреновая это зараза - библиотеки логинга!