Fork me on GitHub
#clojure-russia
<
2017-09-25
>
rmuslimov04:09:12

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

ivana06:09:30

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

dottedmag07:09:56

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

dottedmag07:09:59

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

anjensan09:09:14

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

anjensan09:09:41

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

ivana09:09:58

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

anjensan09:09:28

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

anjensan09:09:08

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

ivana09:09:25

типа так

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

ivana09:09:20

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

anjensan10:09:47

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

anjensan10:09:58

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

anjensan10:09:16

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

anjensan10:09:03

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

anjensan10:09:29

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

andre10:09:49

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

anjensan10:09:25

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

andre10:09:18

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

ivana10:09:01

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

anjensan10:09:47

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

ivana10:09:06

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

ivana10:09:28

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

anjensan10:09:45

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

ivana10:09:18

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

anjensan10:09:44

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

ivana10:09:30

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

ivana10:09:04

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

ivana10:09:39

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

anjensan11:09:17

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

anjensan11:09:34

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

anjensan11:09:57

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

ivana11:09:33

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

ivana11:09:12

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

anjensan11:09:57

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

anjensan11:09:43

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

anjensan11:09:54

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

anjensan11:09:27

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

anjensan11:09:45

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

anjensan11:09:21

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

ivana12:09:43

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

anjensan12:09:48

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

anjensan12:09:04

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

anjensan12:09:41

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

ivana12:09:48

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

anjensan12:09:36

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

anjensan12:09:52

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

ivana12:09:06

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

ivana12:09:26

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

anjensan13:09:16

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

ivana13:09:34

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

ivana13:09:57

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

ivana19:09:14

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

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
а потом начинается полный ужас - терминал загаживается сотнями сообщений в секунду и становится неюзабельным. Несколько часов гуглю, пробую разные варианты, и не могу добиться результата. Я уже готов плохое делать разработчикам логеров.

potapenko19:09:44

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

ivana19:09:32

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

ivana19:09:25

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

potapenko20:09:38

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

potapenko20:09:10

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

ivana21:09:03

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

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