memory heap
343 subscribers
2.31K photos
471 videos
52 files
2.93K links
science ∩ art = wonder

all memory blocks here are allocated by @a_v_p

GitHub: https://github.com/artyom-poptsov
Mastodon: https://fosstodon.org/@avp

https://memory-heap.org/~avp/
Download Telegram
Улучшил алгоритм форматирования таблиц в Guile-DSV — теперь при вписывании таблицы в указанное количество символов по ширине, ширина столбцов таблицы сглаживается, чтобы место распределялось более равномерно.

UPD: Конечно же указание формата -F rfc4180 здесь избыточно и неправильно, т.к. файл /etc/passwd в Unix-формате, с двоеточияи в качестве разделителей. Но Guile-DSV автоматически может определить разделитель в большинстве случаев, поэтому принудительное указание неправильного формата не повлияло на интерпретацию файла.

#dev #projects #guile #dsv
Выпустил релиз Guile-DSV 0.6.0.

Анонс:
https://mail.gnu.org/archive/html/guile-user/2023-05/msg00015.html

В утилите dsv через опцию --width (-w) теперь можно задавать желаемую ширину таблицы. Guile-DSV попытается уместить таблицу в указанную ширину, при этом содержимое ячеек будет разбиваться на несколько строк, если это необходимо. Если ширина таблицы выставлена в auto, используется ширина экрана в качестве максимальной ширины (если таблица уже, чем ширина экрана, она не будет "растягиваться" по ширине, а "обтекать" элементы в ней.)

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

Если же заданная ширина таблицы меньше минимальной ширины для вывода её столбцов, будет выдана ошибка.

#dev #projects #guile #dsv
Guile-DSV 0.6.0 теперь в GNU Guix:
https://git.savannah.gnu.org/cgit/guix.git/commit/?id=43510204c631e59b9a5a38e09caeea94d7a94de2

Поставить/обновить можно командой:
guix install guile-dsv


#dev #projects #guile #dsv #guix
1
This media is not supported in your browser
VIEW IN TELEGRAM
В QMake, если вы хотите установить сгенерированные в процессе сборки файлы вместе с теми, которые были изначально, следует добавить опцию no_check_exist в CONFIG для нужной цели.

Допустим, если файл config.scm генерируется у вас из config.scm.in, тогда ваш *.pro-файл надо будет изменить таким образом:

my_sources.files = main.scm config.scm
my_sources.CONFIG += no_check_exist


Если данную настройку не указать, то при установке сгенерированный файл будет просто проигнорирован, вы потратите кучу времени на поиск ошибки.

#qt #qmake #dev
1
Выпустил релиз Guile-PNG 0.7.0 — библиотеки для работы с форматом PNG (RFC 2083) для GNU Guile, реализованной на чистом Scheme:
https://github.com/artyom-poptsov/guile-png/releases/tag/v0.7.0

В новой версии:
- Реализован авто-подбор фильтров для сохранения строк изображения, индивидуально для каждой строки — согласно эвристике, которая предложена в стандарте RFC 2083. Данная эвристика позволяет улучшить сжатие изображения и следовательно уменьшить его размер.
- Исправлена опечатка в модуле (png core chunk bkgd) — слово "greyscale" заменено на "grayscale".
- Обновлена документация.

UPD: Анонс в списке рассылки Guile Users:
https://mail.gnu.org/archive/html/guile-user/2023-07/msg00017.html

#projects #guile #png #scheme #dev
1
Выпустил релиз Guile-SMC 0.6.1, компилятора конечных автоматов для GNU Guile:
https://github.com/artyom-poptsov/guile-smc/releases/tag/v0.6.1

В новой версии:

- Добавлена возможность установки глобального источника событий для ДКА в разделе legend внутри PlantUML-файла. Например:
legend
event-source: next-char
endlegend

- Команда smc context теперь позволяет установить подтип генерируемого контекста. Если раньше можно было выбрать только из двух вариантов — oop и functional, то сейчас можно использовать такие варианты, как:
oop
oop/generic
oop/port
oop/char
oop/u8
functional
functional/generic
functional/char
functional/u8
Подобная мера позволила сократить объём генерируемого кода для контекста (не берутся те части контекста из Guile-SMC, которые не используются), и кроме того, это позволило решить проблему с дублированием процедур при использовании функционального (functional) контекста, где каждый вариант предоставлял свою копию процедур, но все основные процедуры имели одинаковые имена.

- Исправлена ошибка в процедуре fsm-run!, из-за которой при завершении работы ДКА возвращалась не последнаяя версия контекста, а предыдущая — это приводило к ошибкам работы функциональных вариантов контекста, где контекст не изменялся, а создавался новый на основе предыдущего. В этой ситуации если в конце работы ДКА происходило какое-то заключительное действие с контекстом (например, обновление через действие по выходу из состояния), то данные изменения не были видны. В случае использования ООП-контекста такой проблемы не возникало, так как ООП-контекст использует мутабельные структуры.

- Исправлены ошибки в сериализации/десериализации состояний в модуле (smc core state) — теперь exit-action корректно сохраняется при преобразовании состояния в список, а при обратном преобразовании списка в состояние восстанавливается.

- Обновлена документация.

#dev #projects #guile #smc #fsm
1
Тесты тестятся.

#dev
6
memory heap
Переписываю детерминированные конечные автоматы (ДКА) парсеров в проекте Guile-DSV с написанного вручную кода на Guile-SMC. По ходу дела дорабатываю описание ДКА в формате PlantUML, т.к. именно из этого описания теперь будет герерироваться программный код…
Сравнение скорости обработки текстовых данных через Guile-DSV.

В первом случае (верхняя синяя линия на графике) тест проходил на оригинальной версии Guile-DSV с рукописным ДКА, а во втором случае (оранжевая нижняя линяя на графике) — с ДКА, сгенерированным через Guile-SMC. Отладочный лог выключен. Используется реальное время работы программы, в секундах.

Размер тестового текстового файла:
$ wc datasets/covid.csv 
53591 54463 3985948 datasets/covid.csv
$ du -h datasets/covid.csv
3,9M datasets/covid.csv

Скрипт сбора статистики:
https://gist.github.com/artyom-poptsov/d53c10875e85cb735dd34e5a0f428bbe

#dev #guile #dsv
1
memory heap
Сравнение скорости обработки текстовых данных через Guile-DSV. В первом случае (верхняя синяя линия на графике) тест проходил на оригинальной версии Guile-DSV с рукописным ДКА, а во втором случае (оранжевая нижняя линяя на графике) — с ДКА, сгенерированным…
Исправил ошибки в профилировщике детерминированных конечных автоматов из поставки Guile-SMC, исправления пойдут в следующий релиз.

Использование профилировщика на примере Guile-DSV:
$ dsv --log-driver file --log-opt=file=smc.log -F rfc4180 --to unix datasets/covid.csv > test.csv
$ smc profile smc.log
Total transitions: 1661324
Total time: 84173181 us
Stats:
read_quote: 30647003 us (36.4095 %)
read_quoted_field: 27615130 us (32.8075 %)
read_field_first_char: 23677038 us (28.1290 %)
add_row: 2233946 us (2.6540 %)
add_final_row: 35 us (.0000 %)
read_first_field_first_char: 29 us (.0000 %)


Кусок файла smc.log:
$ head smc.log
2023-08-10 21:19:05.522313 (DEBUG): [*] -> [read_first_field_first_char]
2023-08-10 21:19:05.522342 (DEBUG): [read_first_field_first_char] -> [read_quoted_field]
2023-08-10 21:19:05.522377 (DEBUG): [read_quoted_field] -> [read_quote]
2023-08-10 21:19:05.522427 (DEBUG): [read_quote] -> [read_field_first_char]
2023-08-10 21:19:05.522448 (DEBUG): [read_field_first_char] -> [read_quoted_field]
2023-08-10 21:19:05.522483 (DEBUG): [read_quoted_field] -> [read_quote]
2023-08-10 21:19:05.522508 (DEBUG): [read_quote] -> [read_field_first_char]
2023-08-10 21:19:05.522527 (DEBUG): [read_field_first_char] -> [read_quoted_field]
2023-08-10 21:19:05.522556 (DEBUG): [read_quoted_field] -> [read_quote]
2023-08-10 21:19:05.522585 (DEBUG): [read_quote] -> [read_field_first_char]


#dev #projects #guile #dsv #smc
1
Выпустил релиз Guile-SMC 0.6.2:
https://github.com/artyom-poptsov/guile-smc/releases/tag/v0.6.2

Ключевые изменения:

- Исправлена ошибка с процедурой pre-action в модуле (smc context functional char): Теперь процедура во всех случаях возвращает контекст.

- Исправлена ошибка высчитывания отметок времени в модуле (smc trace-context). Теперь значение отметок времени всегда получается положительным, как и должно. При этом, если всё же обнаруживается уход времени в отрицательные значения, бросается ошибка.

- Исправлен рассчёт времени в модуле (smc cli command-profile) профайлера. Теперь профайлер Guile-SMC даёт правильные значения суммарного времени работы ДКА и времени для каждого отдельно взятого состояния.

- В модуль (smc context oop generic) добавлен недостающий модуль (smc core log). Его отсутствие приводило бы к ошибками при попытке использования (smc context oop generic).

- Теперь Guile-SMC позволяет задавать pre-action и post-action для ДКА прямо в PlantUML описании. Эти процедуры выполняются перед всеми остальными проверками для каждого состояния, и могут например использоваться для обновления счётчиков в контексте. Пример задания этих процедур в PlantUML файле описания ДКА:
legend
pre-action: custom-pre-action
post-action: custom-post-action
endlegend

- Для класса <fsm> в модуле (smc fsm) теперь добавлены процедуры для задания pre-action (fsm-pre-action-set!) и post-action (fsm-post-action-set!). Также из модуля экспортированы процедуры fsm-pre-action и fsm-post-action для получения текущих значений pre-action и post-action соответственно.

- В модуле (smc core log) теперь регистрируется логгер по-умолчанию, под именем "guile-smc". Также добавлена процедура smc-log-default-logger.

- Обновлена документация.

Новый релиз обратно совместим с версиями 0.6.0 и 0.6.1.

#dev #projects #guile #smc
1
memory heap
Сравнение скорости обработки текстовых данных через Guile-DSV. В первом случае (верхняя синяя линия на графике) тест проходил на оригинальной версии Guile-DSV с рукописным ДКА, а во втором случае (оранжевая нижняя линяя на графике) — с ДКА, сгенерированным…
Провёл ещё один замер производительности Guile-DSV с новым ДКА, сделанным на базе Guile-SMC, используя датасет "Feed Grains: Yearbook Tables" на почти полмиллиона строк (498929 строк, если быть точным.)

Время на графиках в секундах.

Новая версия парсера работает быстрее старого на этом примере примерно в 15 раз.

Конечно, сорость обработки данных ещё зависит от самих данных и их формата. Например, парсер Unix-формата DSV работает быстрее, поскольку там нюансов меньше, и следовательно сам ДКА для Unix-формата проще.

#dev #projects #guile #dsv
1
Выпустил релиз Guile-DSV 0.7.0:
https://github.com/artyom-poptsov/guile-dsv/releases/tag/v0.7.0

Анонс в списке рассылки guile-user:
https://mail.gnu.org/archive/html/guile-user/2023-08/msg00050.html

Ключевые изменения:

- Guile-DSV теперь использует Guile State Machine Compiler (Guile-SMC) для генерации кода парсеров формата Unix и RFC 4180 из PlantUML описания во время сборки. Это изменение позволило сократить количество кода на Scheme, и сделать описание парсера более читаемое и краткое. Кроме того, новая версия парсеров работает от 3 до 15 раз быстрее старой версии (замеры: 1, 2).

- Процедуры dsv->scm и dsv-string->scm теперь поддерживают дополнительные именованные параметры: #:debug-mode? (включить/выключить режим отладки), #:log-driver (установить драйвер логирования; по-умолчанию используется "syslog"), #:log-opt (установить параметры драйвера логирования — см. документацию для детального описания.)

- Утилита dsv теперь также поддерживает опции --log-driver и --log-opt — см. dsv --help для справки.

#dev #projects #guile #dsv
2
memory heap
Похоже, нашёл баг в Guile-ZLib: https://notabug.org/guile-zlib/guile-zlib/issues/4 И уже сделал патч: https://notabug.org/guile-zlib/guile-zlib/pulls/5 #guile #patches
Ночью не спалось, придумал (не без подсказок Людовика Кортеса, конечно) и реализовал вроде бы хорошую эвристику для решения проблемы выделения памяти под распаковываемые данные в Guile-Zlib:
https://notabug.org/guile-zlib/guile-zlib/issues/4#issuecomment-40615

Собственно, коммит, который делает всё хорошо (я надеюсь):
https://notabug.org/a_v_p/guile-zlib/commit/9a32cef04aeb84c3b6fc60b78174399b10591a02

#dev #bugfix
👾2
Впервые воспользовался git send-email для отправки патчей:
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=69635

До этого обычно создавал патчи через git format-patch, и затем отправлял их, прикрепляя к письму через Emacs Gnus.

Вчера был на Guix Patch Review Session, как раз спрашивал про настройку и использование git send-email. Пользователь Romain Garbage показал свой workflow по работе с патчами, ответил на вопросы. Респект и уважуха человеку, хотя наверное он вряд ли это сообщение здесь прочитает. :-)

Хорошая инструкция по настройке:
https://git-send-email.io/

Подробная инструкция, как "подружить" git send-email с Gmail:
https://stackoverflow.com/a/68238913

Установка необходимых пакетов в GNU Guix:
guix install perl-authen-sasl perl-mime-base64 perl-mime-tools perl-net-smtp-ssl  git:send-email git perl-io-socket-ssl


После всей настройки отправить последний коммит с текущей ветви в виде патча в список рассылки guix-patches@gnu.org можно так:
git send-email --to=guix-patches@gnu.org -1 --base=HEAD~1


Потратил примерно 2 часа на то, чтобы понять, почему у меня git send-email вываливается с ошибкой:
Command unknown: 'AUTH' at /gnu/store/kjbpvqmq723z2n07qm8wkc3jjv9wpfmi-git-2.41.0-send-email/libexec/git-core/.git-send-email-real line 1724


Оказалось, что в ~/.gitconfig в разделе [sendemail] написал smtpSncryption вместо smtpEncryption.

Ещё в очередной раз убедился, что мне нужно больше говорить с людьми по-английски, чтобы прокачать разговорный навык. Читаю, пишу и на слух воспринимаю английский достаточно свободно, а вот для real time общения нужно разговорно-мыслительные мускулы прокачивать.

#guix_patches #dev #guix
🔥4
#lisp #guile #dev

Artyom Bologov, "Guile Optimization Gotchas: There Is No Free Beer, Only Cheap":
https://aartaka.me/guile-optimization-gotchas

Интересная статья про работу с профилировщиком GNU Guile и оптимизации.
🔥4
Похоже, что удалось выявить и исправить ошибку в утилите btop, которая приводила к SEGFAULT:
https://github.com/aristocratos/btop/pull/958

Жду review патча от авторов утилиты.

#dev #patches
3
#dev #guile_ssh

Работаю над допиливанием изменений в Guile-SSH перед следующем релизом. Добавил в GitHub CI задачу сборки с libssh 0.8.3 для тестирования изменений.

Благодаря GNU Guix это сделать достаточно просто. [1, 2]

Выявил проблему в обратной совместимости, исправил. Таким образом, Guile-SSH сейчас должен поддерживать libssh 0.8.3+, 0.9, 0.10 и 0.11. Учитывая, что libssh 0.8 был выпущен в 2018-м, считаю достаточно неплохим результатом.

В libssh 0.7.4 и более старых был выявлен CVE-2016-0739, поэтому смысла поддерживать такое старое ископаемое не вижу (хотя пока теоретически Guile-SSH может с ними собраться, но я даже это не проверяю теперь.) Думаю, что поддержку версий libssh старше 0.8.3 стоит вообще выкинуть, так будет честнее.
🔥4👀1