memory heap
374 subscribers
2.56K photos
525 videos
52 files
3.16K 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
Ууъ! Понял, как программно во FreeCAD программно (через Python) удалить избыточные ограничения (constraints) — у объекта Sketch есть метод autoRemoveRedundants — если его вызвать, он делает как раз то, что нужно.

В итоге, программно удаление избыточных ограничений можно сделать так:
Gui.runCommand('Sketcher_SelectRedundantConstraints', 0)
for sketch in Gui.Selection.getSelection():
sketch.autoRemoveRedundants()
Под Android обновился K-9 Mail в F-Droid — интерфейс выглядит теперь более аккуратно.

K-9 Mail (Full-featured email client) - https://f-droid.org/packages/com.fsck.k9
https://www.youtube.com/watch?v=t705r8ICkRw

Примерно на 13:30 Илон Маск объясняет процесс из пяти шагов, которого он старается придерживаться в своих проектах:
1. Make your requirements less dumb — делайте ваши требования менее тупыми.
2. Try very hard to delete parts of the process — старайтесь изо всех сил удалить части процесса.
3. Simplify or optimize — упрощайте или оптимизируйте.
4. Accelerate — ускоряйтесь.
5. Automate — автоматизируйте.
Новое применение для Guile-SMC:
$ cat ~/Pictures/image.png | ./test.scm 
<15>Aug 7 16:35:32 guile-smc: [read_header] -> [read_chunk]
<15>Aug 7 16:35:32 guile-smc: [read_chunk] -> [handle_ihdr_chunk]
<15>Aug 7 16:35:32 guile-smc: [handle_ihdr_chunk] -> [read_chunk]
<15>Aug 7 16:35:32 guile-smc: [read_chunk] -> [handle_iccp_chunk]
<15>Aug 7 16:35:32 guile-smc: [handle_iccp_chunk] -> [read_chunk]
<15>Aug 7 16:35:32 guile-smc: [read_chunk] -> [handle_phys_chunk]
<15>Aug 7 16:35:32 guile-smc: [handle_phys_chunk] -> [read_chunk]
<15>Aug 7 16:35:32 guile-smc: [read_chunk] -> [handle_time_chunk]
<15>Aug 7 16:35:32 guile-smc: [handle_time_chunk] -> [read_chunk]
<15>Aug 7 16:35:32 guile-smc: [read_chunk] -> [handle_text_chunk]
<15>Aug 7 16:35:32 guile-smc: [handle_text_chunk] -> [read_chunk]
<15>Aug 7 16:35:32 guile-smc: [read_chunk] -> [handle_idat_chunk]
<15>Aug 7 16:35:32 guile-smc: [handle_idat_chunk] -> [read_chunk]
<15>Aug 7 16:35:32 guile-smc: [read_chunk] -> [handle_iend_chunk]
<15>Aug 7 16:35:32 guile-smc: [handle_iend_chunk] -> [*]
PNG chunks:
#<png-chunk #(73 72 68 82) IHDR: Image header 5625db224750>
#<png-chunk #(105 67 67 80) iCCP: Embedded ICC profile 5625db260cc0>
#<png-chunk #(112 72 89 115) pHYs: Physical pixel dimensions 5625db260240>
#<png-chunk #(116 73 77 69) tIME: Image last-modification time 5625db2767b0>
#<png-chunk #(116 69 88 116) tEXT: Textual data 5625db286d20>
#<png-chunk #(73 68 65 84) IDAT: Image data 5625db2862a0>
#<png-chunk #(73 69 78 68) IEND: Image trailer 5625db2e8810>
С помощью генератора машин состояний Guile-SMC сделал разбор формата Portable Network Graphics (PNG): https://github.com/artyom-poptsov/guile-png

Guile-PNG позволяет читать изображения в формате PNG и разбирать их на части (чанки, "chunks"). Для некоторых чанков я уже написал разбор на осмысленные поля, остальные содержат в себе просто двоичные данные — которые тем не менее можно разобрать на что-то вменяемое, если посмотреть в стандарт PNG.

Интересно было попробовать, насколько хорошо Guile-SMC подходит для решения подобных сложных задач с разбором двоичного формата. Пришлось дорабатывать Guile-SMC по ходу дела.

Из основных новшеств Guile-SMC:
- Добавил возможность задавать входные и выходные действия для каждого состояния.
- Добавил возможность задавать источники событий как для ДКА в целом, так и для каждого отдельного состояния.

На данный момент архитектура системы получилось достаточно гибкая. Можно разбить большой ДКА на несколько более простых, построенных иерархическим способом — подобные ДКА называются по понятным причинам иерархическими (Hierarchical State Machines, HSM). HSM позволяет разбить крупную задачу на несколько более мелких, таким образом, снизив сложность решения в целом, что очень важно для практического применения автоматного программирования.

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

В целом, очень интересная фундаментальная задача.

#projects #guile #fsm
Пример разбора PNG-изображения через Guile-PNG. На экран выводится информация о полученном изображении и его чанках.
Forwarded from ЗаТелеком 🌐
Не за телеком. Но важно.

Я ж сейчас спортсмен знатный. Бросил курить, не употребляю алкоголь и регулярно тренируюсь (да, я могу, например, пробежать 15 км за 100 минут - результат не олимпийский вообще, но год назад я так не мог и близко). Так вот, вчера вечером вышел на тренировку. И весь забег меня преследовал запах гари.

Сегодня написал товарищу из метеоцентра и спросил, что там у нас горит. И знаете, что он ответил? Он ответил: ЯКУТИЯ.

И теперь возьмите карту и измерьте расстояние от Якутии до Екатеринбурга. 3800 км. И гарью воняет даже у нас. Представьте теперь, какой там адъ творится. Это же, простите мой французский, ёбаный пиздец творится.

Товарищ потом ещё добавил про то, что будет хуже. Причем, так буднично объяснил про тренды и глобальное потепление климата.

В общем, я хочу вам сказать, что это всё не шуточки и ни разу не смешно. И на отрицающих факт глобального потепления (помните все эти обезьянние ужимки про Гретту Тумберг?) теперь смотрю несколько более агрессивно. Это вообще не хиханьки и никакие не заговоры. Все очень серьезно.

Подумайте над этим (писал мне лс не нужно).
Forwarded from CADR SPACE (Artyom "avp" Poptsov)
This media is not supported in your browser
VIEW IN TELEGRAM
🛠 В Нижегородском хакерспейсе CADR начинаем проект под кодовым названием "REPLICADR" по сборке нового 3D-принтера.

💳 На сборку нам необходимо собрать 20'000р. Принимаем донаты -- можете переводить деньги на нашу карту Ю.Мани, либо мне (@a_v_p) лично (если у вас есть мои данные для перевода), с пометкой "На кадропринтер".

Также принимаем донаты в виде компонентов/материалов и приветствуем помощь в сборке.

ℹ️ На данный момент характеристики принтера определены следующие:
- Область печати (ШхВхГ): 500х500х500 мм.
- Качество печати будет сравнимо с коммерческими 3D-принтерами.
- Классическая Декартова кинематика, аналогичная RepRap, но с улучшениями (например, Z и Y будет управляться двумя двигателями, дабы избежать перекоса стола и осей.)
- Стол с подогревом.
- Каркас из алюминиевых профилей.
- Закрытый корпус из фанеры 9мм.

🏗 Таблица со списком компонентов и прикидками по их стоимости доступна по ссылке.

Собрано: 5000/20'000
Удалось исправить некоторые "случайные" ошибки сегментации (segfault) в Guile-SSH — они оказались не такие уж случайные.

Всё дело в том, что я использовал средства логирования libssh, чтобы писать сообщения из мира Guile (Scheme) в общий libssh лог: Guile-объекты передавались, как обычные безликие указатели в процедуры логирования libssh, откуда уже, проходя по лаберинтам вызовов, попадали обратно в мир Guile, и передавались в предоставленный пользователем (или умолчальный) callback — Scheme-процедуру, которая обрабатывала сообщения.

Проблема в том, что при таком подходе в некоторых случаях эти несчастные Guile-объекты не добирались до конца лабиринта вызовов внутри libssh, и на свет выбрасывало только их жалкие останки, покусанные сборщиком мусора Guile. Как только процедура записи лога пыталась эти останки использовать, возникала ошибка сегментации — память-то уже освобождена.

Почему же так происходило? Потому, что сборщик мусора работает, если говорить по-простому, считая ссылки на объекты. Те объекты, на которые нет видимых ссылок из мира Guile (выбившиеся "из стаи") считаются брошенными и уничтожаются сборщиком мусора. Когда указатель на объект передаётся в виде указателя в процедуру логирования libssh, сборщик мусора этого не видит, и объекту наступает кирдык. Но не всегда — иногда он успевает выбраться "на свет" до того, как сборщик мусора что-то заподозрит.

Одим из "озарений" было то, что я могу вообще обойти процедуры логирования libssh, если логирование вызывается из Guile-SSH — я же уже знаю, какая процедура указана пользователем в качестве callback'а, и могу её вызвать сразу! И все параметры для процедуры логирования всегда будут иметь ссылки, видимые сборщиком мусора (по крайней мере, я могу это гарантировать средствами Guile.)

Таким образом была решена значительная часть проблем. Помучал тестами сделанные исправления, часть ошибок исчезла.

Другая часть ошибок состояла в том, что фреймворк SRFI-64, который я использую для написания тестов на Scheme, очень не любит тесты, которые порождают процессы (a-la через вызов fork) и пытаются что-то делать, без вызова одного из вариантов exec. Поскольку процесс раздываивается при fork, то получается две копии запущенного теста, и как бы я не пытался "успокоить" запускатор тестов, всё равно иногда вылазили странные ошибки тестов — вроде все тесты прошли тормально, но при этом результат считается провальным. А всё потому, что один процесс правильно рапортавал успешное завершение тестов, но параллельно шёл второй, полученный через fork, который мог выкинуть ошибку.

Это уже удалось вылечить путём вынесения любой деятельности после fork в отдельную программу на Scheme, запускаемую новым вызовом guile через execle.
Picasso.
Push сильней.