memory heap
368 subscribers
2.48K photos
504 videos
52 files
3.06K 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
Generative Art in Common Lisp:
https://github.com/inconvergent/weird

#art #lisp
🧃 🌲
🍵 🫖
This media is not supported in your browser
VIEW IN TELEGRAM
Запоминаем: Pregnant

r/#funnyvideos
r/ретранслятор
Запоминаем: Pregnant r/#funnyvideos
Просто опупенно, хочу весь альбом.
В Inkscape 1.0 добавили отличную штуку для функции трассировки растровых изображений — "Centerline tracing". Благодаря ей можно готовить задачи к резке на фрезере с ЧПУ таким образом, чтобы за один проход все лини резались.

В Ubuntu 20.04 для того, чтобы получить Inkscape 1.1, надо добавить PPA:

sudo add-apt-repository ppa:inkscape.dev/stable
sudo apt update
sudo apt install inkscape

В GNU Guix уже есть версия Inkscape 1.1.1. Можно поставить так:

guix install inkscape

#cnc #software
Выпустил релиз Guile-SSH 0.15.0:
https://lists.gnu.org/archive/html/guile-user/2022-01/msg00004.html

В предыдущей версии была ошибка с обновлением версии библиотеки libguile-ssh, не первый раз уже забываю эту версию обновить вместе с версией проекта. Для надёжности переместил строчку с версией библиотеки в самый верх configure.ac, чтобы на глаза всегда попадалась.

Официальная справка по обновлению версии библиотек, использующих libtool:
https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info

#dev #guile #ssh
Нашёл в @gnu_guix_ru:

"Nyxt is a keyboard-driven web browser designed for power users. Inspired by Emacs and Vim, it has familiar key-bindings (Emacs, vi, CUA), and is infinitely extensible in Lisp."

https://github.com/atlas-engineer/nyxt

Браузер на Common Lisp, между прочим!

Вспоминается другой похожий браузер под названием "Conkeror", которым я пользовался когда-то давно — правда, он основывается на технологиях Mozilla и написан на JavaScript, в основном.

#lisp #software
Добавил профилирование работы ДКА через анализ логов в Guile-SMC:
$ smc profile examples/parenthesis-check/out.log
Total transitions: 99
Total time: 20553 us
Stats:
read_state_transition_to: 4690 us (22.8191 %)
read_state_transition_guard: 2355 us (11.4582 %)
read_word: 1597 us (7.7702 %)
read_state_description: 1548 us (7.5317 %)
read: 1404 us (6.8311 %)
read_state_right_arrow: 1049 us (5.1039 %)
search_state_transition: 988 us (4.8071 %)
search_state_transition_to: 977 us (4.7536 %)
read_state_transition_action: 779 us (3.7902 %)
read_start_tag: 699 us (3.4010 %)
search_state_transition_guard: 639 us (3.1090 %)
search_state_transition_action: 223 us (1.0850 %)
search_state_action_arrow: 201 us (.9780 %)
read_state_action_arrow: 192 us (.9342 %)
read_end_tag: 164 us (.7979 %)
read_state: 163 us (.7931 %)


#dev #guile #lisp #smc
А вот и первые результаты использования профилировщика — нашёл узкое место в парсере PlantUML и оптимизировал его. Было (коммит fb26247):
$ /usr/bin/smc profile examples/parenthesis-check/out.log
Total transitions: 99
Total time: 20553 us
Stats:
read_state_transition_to: 4690 us (22.8191 %)
read_state_transition_guard: 2355 us (11.4582 %)
read_word: 1597 us (7.7702 %)
read_state_description: 1548 us (7.5317 %)
read: 1404 us (6.8311 %)
read_state_right_arrow: 1049 us (5.1039 %)
search_state_transition: 988 us (4.8071 %)
search_state_transition_to: 977 us (4.7536 %)
read_state_transition_action: 779 us (3.7902 %)
read_start_tag: 699 us (3.4010 %)
search_state_transition_guard: 639 us (3.1090 %)
search_state_transition_action: 223 us (1.0850 %)
search_state_action_arrow: 201 us (.9780 %)
read_state_action_arrow: 192 us (.9342 %)
read_end_tag: 164 us (.7979 %)
read_state: 163 us (.7931 %)


Стало (коммит dea3e6d):
$ /usr/bin/smc profile examples/parenthesis-check/out-3.log
Total transitions: 99
Total time: 14925 us
Stats:
read: 3158 us (21.1591 %)
read_state_transition_guard: 1663 us (11.1424 %)
read_state_transition_to: 1483 us (9.9363 %)
read_word: 1259 us (8.4355 %)
read_state_description: 1014 us (6.7940 %)
read_state_right_arrow: 839 us (5.6214 %)
search_state_transition_to: 670 us (4.4891 %)
search_state_transition: 638 us (4.2747 %)
read_state_transition_action: 536 us (3.5913 %)
read_start_tag: 535 us (3.5846 %)
search_state_transition_guard: 428 us (2.8677 %)
read_state: 178 us (1.1926 %)
search_state_transition_action: 139 us (.9313 %)
read_state_action_arrow: 139 us (.9313 %)
search_state_action_arrow: 132 us (.8844 %)
read_end_tag: 125 us (.8375 %)


Итого ускорение работы парсера на ~25% по моим прикидкам за счёт кэша резольвера процедур на базе хэш-таблицы.

#dev #guile #lisp #smc
В коммитах на master в Guile-SMC добавил standalone-режим для компилятора машин состояний, теперь все необходимые модули копируются в отдельный каталог.

$ tree
.
├── context.scm
├── fsm.puml
├── main.scm
└── README.org

0 directories, 5 files

Далее выполняем компиляцию в standalone-режиме:

$ cat fsm.puml | /usr/bin/smc compile -L . -U "((context))" -m "(custom-fsm)" \
-t guile-standalone --debug > custom-fsm.scm

Содержимое каталога теперь выглядит так:
$ tree
.
├── context.scm
├── custom-fsm
│ ├── context.scm
│ └── smc
│ ├── context
│ │ ├── char-context.scm
│ │ └── context.scm
│ ├── core
│ │ ├── common.scm
│ │ ├── log.scm
│ │ ├── stack.scm
│ │ ├── state.scm
│ │ └── transition.scm
│ └── fsm.scm
├── custom-fsm.scm
├── fsm.puml
├── main.scm
└── README.org

4 directories, 14 files

Обратите внимание, что появился каталог с именем модуля, в котором указано расположить целевой ДКА — "custom-fsm". В этот каталог были скопированы модули Guile-SMC, необходимые для работы целевого ДКА, плюс зависимости из списка дополнительных модулей (-U "((context))").

При копировании в модулях происходит замена зависимостей так, чтобы они все указывали на скопированные модули. Например, было:
$ head -4 context.scm
(define-module (context)
#:use-module (oop goops)
#:use-module (ice-9 textual-ports)
#:use-module (smc context char-context)

Стало:
$ head -4 custom-fsm/context.scm
(define-module (custom-fsm context)
#:use-module (oop goops)
#:use-module (ice-9 textual-ports)
#:use-module (custom-fsm smc context char-context)

Такой автомат можно запускать без наличия Guile-SMC в системе.

#guile #smc #dev #lisp #fsm
Пример профилирования ДКА в Guile-INI 0.3.0 через Guile-SMC профилировщик.

Тестовая программа:
$ cat test.scm 
#!/usr/bin/guile-3.0 \
-L modules -e main -s
!#

(use-modules (ice-9 pretty-print)
(oop goops)
(logging logger)
(smc core log)
(ini))

(define (main args)
(log-clear-handlers!)
(log-add-handler! (make <port-log/us>
#:port (open-output-file "ini.log")))
(let ((data (ini->scm (current-input-port) #:debug-mode? #t)))
(pretty-print data)
(scm->ini data)))

Запуск парсера с выводом лога в файл:
$ cat /etc/php/7.4/apache2/php.ini | ./test.scm

Лог:
$ wc ini.log 
3528 21168 280750 ini.log
$ head ini.log
2022-01-07 17:06:27.338353 (DEBUG): [*] -> [read]
2022-01-07 17:06:27.339380 (DEBUG): [read] -> [read_section_title]
2022-01-07 17:06:27.339982 (DEBUG): [read_section_title] -> [read_section_content]
2022-01-07 17:06:27.340274 (DEBUG): [read_section_content] -> [read_comment]
2022-01-07 17:06:27.340710 (DEBUG): [read_comment] -> [read_section_content]
2022-01-07 17:06:27.340888 (DEBUG): [read_section_content] -> [read_comment]
2022-01-07 17:06:27.341363 (DEBUG): [read_comment] -> [read_section_content]
2022-01-07 17:06:27.341504 (DEBUG): [read_section_content] -> [read_comment]
2022-01-07 17:06:27.341728 (DEBUG): [read_comment] -> [read_section_content]
2022-01-07 17:06:27.341860 (DEBUG): [read_section_content] -> [read_comment]

Собственно профилирование:
$ smc profile ini.log
Total transitions: 3528
Total time: 630510 us
Stats:
read_comment: 416994 us (66.1360 %)
read_section_content: 153088 us (24.2800 %)
read_section_property_value: 17230 us (2.7327 %)
read_section_property_key: 16376 us (2.5973 %)
trim_section_property_key: 14990 us (2.3774 %)
trim_section_property_value: 6673 us (1.0583 %)
read_section_title: 4132 us (.6553 %)
read: 1027 us (.1629 %)

#guile #smc #dev #lisp #fsm #profiling
Со студентами программированием музыки занимаемся.

(Болт на динамик положен для улучшения звучания.)