@dottedmag так хероку чем не вариант?
Хероку на бесплатном тарифе дает 500 часов работы приложения (точнее, на все приложения с одного аккаунта) в месяц. Можно подтвердить кредиткой (не пробовал) и получить 1000. И если приложение (оформленное как вэб, а не как службу или как-то там еще) полчаса не дергать, то херока сама его завершает, для экономии этих самых часов.
@rmuslimov А я не знал, что там джава.
Попробую, спасибо.
@ivana незаконно - структуры в кложе не могут быть циклическими
можно делать хак с рефами... но тогда юзай лучше atom/ref, но не var
@anjensan спасибо, я уже сделал через резолв символов, чтобы было труЪ-иммутабельно
через резолв символов - а эт как ?
типо {:ref #'x} ?
типа так
(defn get-type [type-field]
(let [type (:type type-field)]
(if (string? type) @(resolve (symbol type)) type)))
получаю тип-ссылку либо напрямую, либо по строке (для циклических ссылок)
o-O
а нифага это все если не секрет ?
в чем макгический смысл поля :type
чем вот такое например не угодило?
зы: уж лучше делать как советовали выше - declare + #'x ссылки нежели юзать resolve... не делай resolve лучше
это для всяких реплов.. дебага и всего такого
https://www.youtube.com/watch?v=Pa2OMjxkZ-c записал небольшую демку RN , CursiveIDE
круто! но имхо музычку стоило бы поменять/убрать 🙂
@anjensan это моя попытка сделать циклический граф. Хорошо, я поменяю свои резолвы на символы, просто с символами не догадался что их надо тоже декларить, но выше подсказали.
@ivana а зачем тебе вообще циклический граф? он реально нужен? может тут проблема глубже
я уверен что нужен. хотя могу ошибаться. смотри - у меня есть sql таблицы: юзер, и связанные с ним комменты. В Графкуэле некто набирает запрос: подать юзера Иванова, все его комменты, у каждого коммента автора, у каждого автора все его комменты... и так раз 10 по вложенности 🙂 Пример искусственный, но думаю ты понимаешь о чем я. Мне надо пройтись по этому запросу и некоей своей структуре, которая поможет выбрать данные. ВОт эта моя структура и должна в таком случае быь циклическим графом - Юзер содержит комменты, а коммент содержит Юзера-автора.
Но сейчас у меня все отлично работает и на 10 уровнях вложенности
нет. структуре не обязательно быть циклическим графом
ну понятно, что любая задача может быть решена как угодно - но мне проще было придумать так
ну блин. ты же даже отдаешь данные не в виде цилк графа
но я строю все 10 уровней из своего одного. я не знаю сколько уровней запросит юзер.
это же бред, держать у себя 15 уровней про запас, но не циклических
ну можно замьютить )
в этом подходе то как раз у меня сложностей и сомнений нет, только была засада после Хаскеля понять как в Кложе подобные вещи делаются. Теперь понял. (Или снова выдашь значок наркомана? 😉 )
а кто мешает это хранить не как {:user "user1" :comments [{...}, {...}]}, а скажем так {:users {"User1" {... :comments [1 2 3]}, ... :commets {1 {...}, 2 {...}, ...}}
т.е. отдельно хранишь список юзеров, отдельно комментарии.. для ссылки на комментарий или просто его айди
или, например, что-то вроде {:ref-type :comment :id <comment-id>}
так в sql так и хранится. но мне надо запрос красивый к sql составить по тексту графкуэля.
чтобы знать какие таблицы и поля запрашивать, как джойнить и вэрить и т.п. вот эти соответствия в моем графе и лежат. и для данного запроса этот мой граф состоимт всего из 2 нод, взаимно ссылающихся
так что в этом графе ?
зы: не стоит отдавать 10 уровне вложенности. ни в коем случае
простейшая математика из младших классов... у тебя 10 юзеров... у каждого 10 комментариев... итогда 100 комментариев... у каждого комментария один автор... у каждого автора 10 комментариев... у тебя 1000 комментариев... у каждого один автор, у каждого автора 10 комментарев... у тебя 10000 комментариев
короче такие деревья (построенные из циклических графов) обладают нев*ной такой избыточностью. и это прямой путь убить своей сервер переполнением памяти всяким таким
даже в твоем примере (юзер с айди 1, 5 циклов user -> comments) у тебя будет на последнем n ^ 5 комментов на последнем уровне
если юзер болтливый и сделает 500 комментов - это 31250000000000 записией...
в этом графе 2 типа - a и b из примера выше. что отдавать юзеру - дело 10-е. можно и при линейном запросе спросить таблицу из 100500 записей. дело не в иерархичности и цикличности. если надо зарубить отдачу терабайт с сервера, пусть это делается другими методами. хоть и в моем модуле. но лучше будет возможность циклических запросов, и зарубать большие данные отдельно, чем я буду краснеть, что не могу выдать тривиальщину - юзера, его комменты и список лайкеров его комментов.
ну будешь краснеть
когда твой код вернет респонс с 100499 записями, и выдаст ошибку при 100500
так что такое a и b ? это... инфа о таблицах {:name "TableName" :ref <something-strange?} ?
это большие мапы, в которых сказано откуда брать какие данные из базы, и какие подчиненные простые поля и сложные типы можно запрашивать.
отлично. а где ты эти мапы хранишь? кажду в отдельной переменной ?
точнее в отдельной var ячейке ?
да, в глобальном пространстве имен. но некритично, могу собрать их в список или мап
в отдельном неймспейсе конечно
@ivana ясненько. тогда признаю, что цилк-ссылки норм и я был не прав 😞
@anjensan а я то и думаю, неужели даже здесь, в части в которой я уверен, я опять что-то не догоняю 🙂 но вроде все встало на свои места.
у меня эти ссылки не всегда циклические конечно же. но просто надо было придумать, как сделать, если они вдруг случатся такими. может на проде на базе заказчика их и не будет.
Как отключить лог-спам? При старте сервера пишет
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
а потом начинается полный ужас - терминал загаживается сотнями сообщений в секунду и становится неюзабельным. Несколько часов гуглю, пробую разные варианты, и не могу добиться результата. Я уже готов плохое делать разработчикам логеров.@ivana а какой у тебя логгер? обычно нужно настроить какой log4j или logback, там указываешь каким пакетам “молчать” а каким “говорить” 🙂
https://logging.apache.org/log4j/2.x/manual/configuration.html https://logback.qos.ch
не знаю какой - какой либы притащили с собой. я пробовал настраивать и создавать конфигурационные файлы разные, не помогало. сейчас я тупо удаляю все зависимости из проекта, в которых вижу слово log. если после этого перестанет работать, буду восстанавливать и тихо ненавидеть разработчиков такого удобного софта
удаление тоже не помогает - я их из структуры проекта удаляю, а в дереве депенденс трее ленингена логеры остаются
зависимости не помогут - это джава зависимости
собери проект через тот же Luminus, http://www.luminusweb.net/docs сгенери проект заново, добавь свои зависимости. Перенеси исходники. Толковый набор либ. а потом поправь логгинг http://www.luminusweb.net/docs/logging.md clojure - это сначала джава, оттуда и идут всякие логгинги и log4j
Подсказали волшебное слово :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 какая хреновая это зараза - библиотеки логинга!