memory heap
345 subscribers
2.32K photos
472 videos
52 files
2.95K 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 #scheme #lisp #dsv #csv

Добавил в утилиту dsv, которая идёт в составе Guile-DSV, поддержку указания формата для точек соединения "рамок" таблицы при печати.

Пример исходных данных:
$ cat data.csv 
root,x,0,0,root,/root,/bin/bash
daemon,x,1,1,daemon,/usr/sbin,/usr/sbin/nologin
bin,x,2,2,bin,/bin,/usr/sbin/nologin
sys,x,3,3,sys,/dev,/usr/sbin/nologin


Пример вывода от утилиты dsv в формате таблицы:
$ dsv -b "v=|,h=-,j=+" data.csv
root | x | 0 | 0 | root | /root | /bin/bash |
-------------+--------+--------+--------+-------------+----------------+------------------------+
daemon | x | 1 | 1 | daemon | /usr/sbin | /usr/sbin/nologin |
-------------+--------+--------+--------+-------------+----------------+------------------------+
bin | x | 2 | 2 | bin | /bin | /usr/sbin/nologin |
-------------+--------+--------+--------+-------------+----------------+------------------------+
sys | x | 3 | 3 | sys | /dev | /usr/sbin/nologin |
-------------+--------+--------+--------+-------------+----------------+------------------------+
Выпустил релиз Guile-DSV 0.4.1 с новыми возможностями отрисовки таблиц на основе DSV-данных в консоли:
https://lists.gnu.org/archive/html/guile-user/2021-12/msg00007.html

Репозиторий:
https://github.com/artyom-poptsov/guile-dsv

#dev #guile #scheme #dsv
Внезапно ещё один релиз Guile-DSV 0.5.0 с поддержкой вывода таблиц в формат Emacs org-mode и возможностью использовать первую строку входных данных, как заголовок таблицы.

https://lists.gnu.org/archive/html/guile-user/2021-12/msg00009.html

#dev #guile #scheme #dsv
Выпустил релиз Guile-DSV 0.5.1 с возможностью вывода данных в формате DSV/CSV в формат таблиц Markdown, и также возможностью применять произвольный код на Scheme на каждую ячейку таблицы, и фильтровать строки/столбцы табличных данных.

#guile #scheme #projects #dsv
Guile-DSV теперь позволяет задать тень для вывода таблицы в стиле псевдографики:
$ echo -e "a,b,c\na1,b1,c1\na2,b2,c2\n" | dsv -H -b graphic-with-shadow
┏━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┓
┃ a ┃ b ┃ c ┃░░
┡━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━┩░░
│ a1 │ b1 │ c1 │░░
├─────────┼─────────┼─────────┤░░
│ a2 │ b2 │ c2 │░░
└─────────┴─────────┴─────────┘░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

Спецификатор тени задаётся достаточно просто. Вот часть пресета graphic-with-shadow:
...
(shadow . "░")
(shadow-offset . "2,1") ; x,y
...

Для тени можно выставить смещение по осям X и Y.

#projects #guile #scheme #lisp #dsv
Выпустил релиз Guile-DSV 0.5.2:
https://mail.gnu.org/archive/html/guile-user/2023-04/msg00012.html

Основные изменения:

0. Исправлен баг с обработкой пустых полей в конце строки, при использовании формата RFC 4180. Если раньше таблица
  a,b
c,
давала результат '(("a" "b") ("c")), то теперь результат будет '(("a" "b") ("c" "")).

1. Утилита dsv теперь обрабатывает опцию --table-presets-path, которая позволяет задать путь к каталоку с пресетами таблиц. Этот же параметр теперь можно задать переменной окружения GUILE_DSV_TABLE_PRESETS_PATH.

2. Теперь для таблиц можно задавать "тень" (как видно на скриншоте.) Для теней можно задавать символ отрисовки и смещение по двум осям в формате x;y.

3. Таблицы теперь позволяют задавать стили для отображения границ таблиц, для текста внутри, для заголовков и для тени.

4. Параметры пресетов могут быть перезаписаны. Например:
$ dsv -b "graphic-with-shadow,bs=107;100,ts=107;100" /etc/passwd

5. Обновлена справочная документация.

#dev #projects #guile #dsv #lisp
Теперь Guile-DSV умеет форматировать таблицы так, чтобы они умещались в указанную ширину; содержимое ячеек делится на строки при необходимости. Ширина таблицы задаётся опцией --width (-w.)

Новая функция будет в следующем релизе, пока на свой страх и риск можете пробовать собрать Guile-DSV с ветви master.

В GNU Guix после клонирования репозитория можно установить Git-версию из guix.scm, находящегося в корне репозитория:
$ guix package -f guix.scm


#dev #projects #guile #dsv #csv #lisp
2
Улучшил алгоритм форматирования таблиц в 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
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
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
Добавил возможность нумеровать столбцы и строки таблицы в Guile-DSV. Будет в следующем релизе.

#projects #guile #dsv #parser
5
Выпустил релиз Guile-DSV 0.7.1:
https://github.com/artyom-poptsov/guile-dsv/releases/tag/v0.7.1

В новом релизе реализована возможность добавлять нумерацию строкам и столбцам таблицы.

Анонс в рассылке Guile-User:
https://mail.gnu.org/archive/html/guile-user/2023-10/msg00082.html

#guile #projects #dsv #parser
1
Обнаружил недавно проблему в Guile-DSV, что библиотека не проверяет консистентность длины строк табличных данных. Это не обязательно является проблемой в случае чтения данных, однако при обработке таблиц (например, при форматированном выводе на экран) это приводило к трудно осмысляемым ошибкам вроде:

$ echo -e "a,b,c\nd,e\n" | ./pre-inst-env ./utils/dsv
Backtrace:
In ice-9/boot-9.scm:
1752:10 7 (with-exception-handler _ _ #:unwind? _ # _)
In unknown file:
6 (apply-smob/0 #<thunk 7f1b3a516300>)
In ice-9/boot-9.scm:
724:2 5 (call-with-prompt _ _ #<procedure default-prompt-handle…>)
In ice-9/eval.scm:
619:8 4 (_ #(#(#<directory (guile-user) 7f1b3a519c80>)))
In utils/dsv:
272:8 3 (main _)
In dsv/table.scm:
460:21 2 (format-table (("a" "b" "c") ("d" "e")) () #:width _ # _ …)
347:27 1 (table-wrap (("a" "b" "c") ("d" "e")) _ #:width _ # _ # _)
241:23 0 (table-wrap-row _ _)

dsv/table.scm:241:23: In procedure table-wrap-row:
In procedure car: Wrong type argument in position 1 (expecting pair): ()


Сейчас я исправил эту недоработку и добавил для процедуры dsv->scm опцию #:validate?, которая по-умолчанию выставлена в #f (false). Если же выставить её в #t (true), то тогда ошибка будет более понятной. Вот пример на тех же тестовых данных:

$ echo -e "a,b,c\nd,e\n" | ./pre-inst-env ./utils/dsv
Backtrace:
In ice-9/boot-9.scm:
1752:10 9 (with-exception-handler _ _ #:unwind? _ # _)
In unknown file:
8 (apply-smob/0 #<thunk 7f1f270af300>)
In ice-9/boot-9.scm:
724:2 7 (call-with-prompt _ _ #<procedure default-prompt-handle…>)
In ice-9/eval.scm:
619:8 6 (_ #(#(#<directory (guile-user) 7f1f270b2c80>)))
In utils/dsv:
272:8 5 (main _)
In dsv/cli/common.scm:
144:38 4 (print-file #<input: file 0> unix "" _ #:numbering? _ # …)
In dsv/unix.scm:
81:19 3 (dsv->scm _ #:debug-mode? _ #:delimiter _ #:validate? _ …)
In smc/fsm.scm:
469:37 2 (_ #<fsm current-state: add_row statistics: 11/5 7f1f1…> …)
426:22 1 (_ #<fsm current-state: add_row statistics: 11/5 7f1f1…> …)
In dsv/fsm/dsv-context.scm:
100:2 0 (throw-row-length-error _ _ _ _)

dsv/fsm/dsv-context.scm:100:2: In procedure throw-row-length-error:
Inconsistent row length on line 10: expected 3, got 2 #<input: file 0> 10 0 ("d" "e") #<char-context 7f1f1d41a8c0>


По ходу дела выяснилось также, что парсер RFC 4180 похоже неправильно парсит некоторые сложные поля, где внутри поля содержится знак-разделитель. Это ещё требует дополнительного исследования.

И ещё выяснилось, что в Guile-SMC оказывается неправильно считаются строки в контексте functional/char.

#guile #dsv #smc #projects
1