Alexander
остальное все равно ты будешь делать middleware
Alexander
остальное (типа возможности асинхронного вывода, настройки часов и т.п.) либа может
Alexander
но похоже в этой либе нету дуракцих решений из di и katip и есть шанс сделать хороший логгер
Alexander
мне наверное ещё хотелось бы возможность иметь какой-то стейт между сообщениями для эффективности
Alexander
callstack не нужен
Dmitrii
Alexander
нужен стек тегов
Dmitrii
Dmitrii
нужен стек тегов
Это тоже не так сложно сделать, интерфейс вроде позволяет. Можно считать, что CallStack — это такой самый простой работающий из коробки автоматический стэк тегов.
Alexander
katip притащили в пакет слишком много:
1. можно добавлять много scribe (на самом деле всегда можно сделать 1 который делает много)
2. есть много лишнего, что логируется: environment, processid и т.д и тащится
3. не эффективное представление тегов
4. не конфигурируемый вывод сообщения, в итоге приходится scribe переписывать
di:
1. не конфигурируемая асинхронность
2. только monad-approach
Alexander
Alexander
стек тегов это возможность ко всем сообщениям в этом же стеке добавить какую-либо информацию, например, user id,
Alexander
и компонент
Alexander
для того, чтобы при сериализации сообщения можно было собрать структурированный json
Alexander
в katip это не стек, это просто большой Aeson.Value
Alexander
и на каждой записи в лог он сериализуется, (идеально было бы как-то переиспользовать работу) но я не знаю как
Alexander
в di это как и надо стек
Alexander
в одной прикольной закрытой сишной программе там dsl для управления стейт машинами логов
Alexander
но, к сожалению, у них патенты на это решение
Alexander
у вас в либе прикольно, что она не делает лишнего (судя по блогу)
Alexander
и делает то, что надо
Alexander
т.к. меня достало, что с катипом я начинаю переписывать куски
Alexander
400 строк переизобретения
Igor
Кто-то тут когда писал, что им удалось сериализовывать программу на Free Monads, тем самым обеспечивая факт, что программу можно будет запустить после инцидента, восстановив и десериализовав ее. Я правильно понял?
Igor
По-моему это был @graninas, если не ошибаюсь
Alexander
Это был я
Alexander
Программу перезапустить после инцидента - да. Можно прибить kill -9 раннер, запустить другой (потенциально на другой машине), и программа начнет работать с того же места.
Работало это так:
- У нас всегда был текст этого workflow в БД в виде PureScript-кода.
- Мы отправляли в БД результат каждого шага.
- Мы умели взять список результатов от шагов скрипта и прокрутить скрипт, не выполняя операции, до места, когда он сдох.
Alexander
Мы также могли считать, сколько шагов скрипт выполняется, и если нужно, его обрывать.
Igor
Alexander
Про буферизацию и персистентную очередь не понял
Мы сделали эти workflow для бизнес-сценариев, которые могут длиться оооочень долго. Хоть час, хоть день, хоть неделю.
Alexander
Типа, ты задал программе входные данные, и можешь в следующий раз задать те же данные, и программа пойдет тем же путем? Нет, наши workflow интерактивные, они общаются с внешним миром, в них есть развилки и все такое
Igor
Alexander
у нас так тоже было
Alexander
там был граф + куча воркеров работающих, и умеющих персиститься
Alexander
Да только ленивый не писал свои workflow ;)
Alexander
сишники такое любят, но они без free monad обходятся
Alexander
лучше бы мы без free monad обходились
Alexander
accidental complexity там огромный
Alexander
Ну мы еще могли подменять сценарии на ходу при некоторых условиях.
Alexander
может
Alexander
Я ж скрины где-то постил
Alexander
вообще тот кусок пыталсь сделать 3 человека, почему-то по разному
Alexander
я уже забил все переделывать и просто довел до разумной семантики то, что было
Alexander
но по хорошему надо было все выкинуть к чертям
NC
И переписать!
Alexander
да
NC
На колве итераций сходящейся к бесконечности, получилось бы обязательно найти нужный дизайн
Alexander
нужно было сделать апи к очереди и базе
Alexander
и дать писать скрипты на lua
Alexander
Ну, если там сугубо Haskell, то сложнее, конечно. Нас спасало то, что PureScript - это, на самом деле, JavaScript, только в обертке. Чтобы персистить сам текст программы и потом запускать его на node.js использовался простой, но все же трюк из мира JS
Alexander
и сказать заказчику, вам надо - вы и пишите
NC
> lua
/me triggered
Alexander
Алексей
Igor
Ну, если там сугубо Haskell, то сложнее, конечно. Нас спасало то, что PureScript - это, на самом деле, JavaScript, только в обертке. Чтобы персистить сам текст программы и потом запускать его на node.js использовался простой, но все же трюк из мира JS
Да, мне вот интересно насколько это применимо к другим рантаймам (более конкретно, JVM)
Alexander
Alexander
класть структурированные данные в namespace странно
Alexander
вообще namespace и environment по функциональности пересекаются там
Alexander
Алексей
Там очень просты данные. Типа какая подсистема
Alexander
в общем-то это tagged dsl
Alexander
в namespace - да подсистемы
Alexander
ещё мне нужно теги, типа user, workbook, session, transactionid
Alexander
Да, мне вот интересно насколько это применимо к другим рантаймам (более конкретно, JVM)
Для Clojure, думаю, проблем не будет, она динамическая. Для других языков можно, в принципе, хранить текст на исходном языке, а потом, наверное, его компилировать перед запуском. Или даже хранить байт-код
Alexander
чтобы можно было искать по логам в разных программах и разные срезы
NC
Для llvm бекендов нет проблем с байткодом
NC
Хаскелль через ghc api тоже можно в байткод прогнать
Alexander
> lua
/me triggered
нужен простой (для случайного программиста) встраиваемый, интерпретируемый язык, с возможностью динамического обновления
NC
Меня всегда останавливало, что непонятно какие вообще там оптимизации остаются
Alexander
для записи не очень больших скриптов
Alexander
есть что получше?
NC
есть ещё angel script, он поприятнее
Alexander
для людей которые знают питон и си
NC
есть наноси
Alexander