Выпустил релиз Guile-ICS 0.4.0:
https://github.com/artyom-poptsov/guile-ics/releases/tag/v0.4.0
Анонс в списке рассылки GNU Guile:
https://lists.gnu.org/archive/html/guile-user/2022-10/msg00075.html
Основные изменения:
- Добавлена базовая поддержка формата vCard (RFC 6350), используемого для передачи контактных данных.
- Улучшена утилита командной строки
С помощью
Например, пусть у вас в файле
То из него можно получить легко контактные карточки через
Отправил также патч с обновлением Guile-ICS в GNU Guix:
https://mail.gnu.org/archive/html/guix-patches/2022-10/msg01846.html
#projects #guile #rfc5545 #rfc6350 #parser
https://github.com/artyom-poptsov/guile-ics/releases/tag/v0.4.0
Анонс в списке рассылки GNU Guile:
https://lists.gnu.org/archive/html/guile-user/2022-10/msg00075.html
Основные изменения:
- Добавлена базовая поддержка формата vCard (RFC 6350), используемого для передачи контактных данных.
- Улучшена утилита командной строки
ics: теперь она лучше структуирована и поддерживает команды print, describe и convert.С помощью
ics convert теперь можно делать преобразование данных DSV (Delimiter-Separated Values) в iCalendar/vCard.Например, пусть у вас в файле
data.csv есть следующие данные:ORG,TITLE,FN,EMAILКак можно видеть, первая строка таблицы содержит названия параметров карточки пользователя, тогда как каждая строка описывает по сути одну такую карточку.
Example Organisation,Programmer,Eva Luator,[email protected]
Example Organisation,Programmer,Random J. Hacker,[email protected]
То из него можно получить легко контактные карточки через
ics convert:$ ics convert data.csvЕсли вывод
BEGIN:VCARD
EMAIL:[email protected]
FN:Eva Luator
TITLE:Programmer
ORG:Example Organisation
END:VCARD
BEGIN:VCARD
EMAIL:[email protected]
FN:Random J. Hacker
TITLE:Programmer
ORG:Example Organisation
END:VCARD
ics convert перенаправить в файл, то получится файл с контактными данными. Потом этот файл можно загрузить в почтовый клиент, или приложение контактов в мобильном устройстве, и таким образом сделать массовую загрузку контактов (реальная задача, которая меня и сподвигла на реализацию этой возможности.)Отправил также патч с обновлением Guile-ICS в GNU Guix:
https://mail.gnu.org/archive/html/guix-patches/2022-10/msg01846.html
#projects #guile #rfc5545 #rfc6350 #parser
GitHub
Release v0.4.0 · artyom-poptsov/guile-ics
Version 0.4.0
👍1
В левой части скриншота — исходное изображение в формате PNG (RFC 2083) размером 2x2 пикселей с простым чёрно-белым рисунком. В правой части скриншота — результат преобразования изображения (инверсия цветов) через Guile-PNG. На фоне — выполненная команда преобразования.
Исходнй код программы:
Открыта новая технология: PNG.
\o/
#projects #guile #png #lisp
Исходнй код программы:
#!/usr/bin/guile \
-L modules -e main -s
!#
(use-modules (png)
(png image)
(png filter))
(define (main args)
(let* ((png-image (png->scm (current-input-port)))
(new-image (png-image-filter-invert-colors png-image)))
(png-image->png new-image (current-output-port))))
Открыта новая технология: PNG.
\o/
#projects #guile #png #lisp
👍1
memory heap
Измеряю качество обработки изображений в самописной библиотеке PNG с помощью шакалов. 9 шакалов из 9, я считаю. #projects #guile #png #parser #lisp
Сверхточный шакал измерения, используемый для оценки качества обработки изображений.
Краткая (пока что) статья про настройку подключения к сети Yggdrasil на сайте хакерспейса CADR:
https://cadrspace.ru/w/index.php?title=Yggdrasil
#yggdrasil #network #mesh
https://cadrspace.ru/w/index.php?title=Yggdrasil
#yggdrasil #network #mesh
memory heap
HELLO HUMAN. #projects #guile #png #parser #lisp
PNG формат подразумевает прогон исходных данных изображения перед компрессией через фильтры, чтобы эту самую компрессию сделать более эффективной. RFC 2083 описывает 5 типов фильтров (от 0 до 4).
Также PNG оперирует таким понятием, как "линии сканирования" (scanlines). Изображение делится на эти линии сканирования, каждая из которых описывает одну строку растрового изображения. При этом, после декомпрессии данных изображения каждая линия на 1 байт длинее, чем фактический размер данных одной строки изображения, т.к. в начале линии сканирования находится байт, содержащий тип фильтра, применённого к данной строке.
Чтобы получить непосредственно изображение "для человеков", надо после декомпрессии ещё прогнать каждую строку через соответствующий фильтр (который выбирается на основе номера фильтра в первом байте каждой строки) с обратным действием, чтобы декодировать данные. При этом, байт с типом фильтра должен быть удалён.
Иными словами, если у вас цветное изображение 10х10 пикселей, при этом каждый пиксель кодируется тремя байтами (RGB-формат, 8 бит на цвет), то длина строки сканирования вместе с начальным байтом фильтра будет
Тогда как конечное изображение после обратного применения фильтра будет иметь размер строки:
Типы фильтров для каждой строки изображения выбираются кодировщиком PNG исходя из соображений эффективности сжатия (стандарт RFC 2083 про это говорит отдельно.) То есть, в рамках одного изображения к разныем строкам могут применяться разные фильтры.
На данном этапе у меня возникают ошибки именно из-за того, что я неправильно работаю с этими фильтрами.
#png #format
Также PNG оперирует таким понятием, как "линии сканирования" (scanlines). Изображение делится на эти линии сканирования, каждая из которых описывает одну строку растрового изображения. При этом, после декомпрессии данных изображения каждая линия на 1 байт длинее, чем фактический размер данных одной строки изображения, т.к. в начале линии сканирования находится байт, содержащий тип фильтра, применённого к данной строке.
Чтобы получить непосредственно изображение "для человеков", надо после декомпрессии ещё прогнать каждую строку через соответствующий фильтр (который выбирается на основе номера фильтра в первом байте каждой строки) с обратным действием, чтобы декодировать данные. При этом, байт с типом фильтра должен быть удалён.
Иными словами, если у вас цветное изображение 10х10 пикселей, при этом каждый пиксель кодируется тремя байтами (RGB-формат, 8 бит на цвет), то длина строки сканирования вместе с начальным байтом фильтра будет
10 писелей * 3 байта на пиксель + 1 байт типа фильтра = 31 байт
Тогда как конечное изображение после обратного применения фильтра будет иметь размер строки:
10 писелей * 3 байта на пиксель = 30 байт
Типы фильтров для каждой строки изображения выбираются кодировщиком PNG исходя из соображений эффективности сжатия (стандарт RFC 2083 про это говорит отдельно.) То есть, в рамках одного изображения к разныем строкам могут применяться разные фильтры.
На данном этапе у меня возникают ошибки именно из-за того, что я неправильно работаю с этими фильтрами.
#png #format
👍2🔥1