С помощью генератора машин состояний 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
Guile-PNG позволяет читать изображения в формате PNG и разбирать их на части (чанки, "chunks"). Для некоторых чанков я уже написал разбор на осмысленные поля, остальные содержат в себе просто двоичные данные — которые тем не менее можно разобрать на что-то вменяемое, если посмотреть в стандарт PNG.
Интересно было попробовать, насколько хорошо Guile-SMC подходит для решения подобных сложных задач с разбором двоичного формата. Пришлось дорабатывать Guile-SMC по ходу дела.
Из основных новшеств Guile-SMC:
- Добавил возможность задавать входные и выходные действия для каждого состояния.
- Добавил возможность задавать источники событий как для ДКА в целом, так и для каждого отдельного состояния.
На данный момент архитектура системы получилось достаточно гибкая. Можно разбить большой ДКА на несколько более простых, построенных иерархическим способом — подобные ДКА называются по понятным причинам иерархическими (Hierarchical State Machines, HSM). HSM позволяет разбить крупную задачу на несколько более мелких, таким образом, снизив сложность решения в целом, что очень важно для практического применения автоматного программирования.
Конечной целью Guile-SMC я вижу упрощение написания различных парсеров и в целом программ, придерживающихся автоматного стиля. При этом, смысл не только в кодогенерации на основе формального описания, но и формальная проверка получившихся ДКА, а также (возможно) оптимизация — но это уже более сложная задача. На данный момент Guile-SMC например способен проверять ДКА на тупиковые и недостижимые состояния.
В целом, очень интересная фундаментальная задача.
#projects #guile #fsm
GitHub
GitHub - artyom-poptsov/guile-smc: GNU Guile State Machine Compiler
GNU Guile State Machine Compiler. Contribute to artyom-poptsov/guile-smc development by creating an account on GitHub.
Forwarded from ЗаТелеком 🌐
Не за телеком. Но важно.
Я ж сейчас спортсмен знатный. Бросил курить, не употребляю алкоголь и регулярно тренируюсь (да, я могу, например, пробежать 15 км за 100 минут - результат не олимпийский вообще, но год назад я так не мог и близко). Так вот, вчера вечером вышел на тренировку. И весь забег меня преследовал запах гари.
Сегодня написал товарищу из метеоцентра и спросил, что там у нас горит. И знаете, что он ответил? Он ответил: ЯКУТИЯ.
И теперь возьмите карту и измерьте расстояние от Якутии до Екатеринбурга. 3800 км. И гарью воняет даже у нас. Представьте теперь, какой там адъ творится. Это же, простите мой французский, ёбаный пиздец творится.
Товарищ потом ещё добавил про то, что будет хуже. Причем, так буднично объяснил про тренды и глобальное потепление климата.
В общем, я хочу вам сказать, что это всё не шуточки и ни разу не смешно. И на отрицающих факт глобального потепления (помните все эти обезьянние ужимки про Гретту Тумберг?) теперь смотрю несколько более агрессивно. Это вообще не хиханьки и никакие не заговоры. Все очень серьезно.
Подумайте над этим (писал мне лс не нужно).
Я ж сейчас спортсмен знатный. Бросил курить, не употребляю алкоголь и регулярно тренируюсь (да, я могу, например, пробежать 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
💳 На сборку нам необходимо собрать 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 через вызов
Это уже удалось вылечить путём вынесения любой деятельности после
Всё дело в том, что я использовал средства логирования 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.GitHub
GitHub - artyom-poptsov/guile-ssh: Guile-SSH is a library that provides access to the SSH protocol for GNU Guile programs.
Guile-SSH is a library that provides access to the SSH protocol for GNU Guile programs. - artyom-poptsov/guile-ssh
В корпусе будущего 3D-принтера в хакерспейсе CADR (https://cadrspace.ru)
На канале "Голый землекоп" ряд интересных постов про протезы со связью "мозг-компьютер":
- Подкаст с Нейтаном Коуплендом, который собственно управляет протезом: https://t.iss.one/kolm_zemlekop/517
- Видео выполнения разных заданий через протез — с обратной связью, и без: https://t.iss.one/kolm_zemlekop/518
- Рисунок, выполненный Нейтаном, используя протез: https://t.iss.one/kolm_zemlekop/521
- Ну и Нейтан в будущем хочет попробовать посоревноваться в игре "Пинг-понг" с обезьяной с установленным Нейралинком: https://t.iss.one/kolm_zemlekop/520
- Подкаст с Нейтаном Коуплендом, который собственно управляет протезом: https://t.iss.one/kolm_zemlekop/517
- Видео выполнения разных заданий через протез — с обратной связью, и без: https://t.iss.one/kolm_zemlekop/518
- Рисунок, выполненный Нейтаном, используя протез: https://t.iss.one/kolm_zemlekop/521
- Ну и Нейтан в будущем хочет попробовать посоревноваться в игре "Пинг-понг" с обезьяной с установленным Нейралинком: https://t.iss.one/kolm_zemlekop/520
Telegram
Голый землекоп
Даже если у вас сию минуту нет времени слушать этот выпуск подкаста "Голый Землекоп", просто посмотрите видео в следующем сообщении. И тем более посмотрите, если уже слушаете выпуск.
Мой собеседник, Нейтан Коупленд, три раза в неделю приезжает в лабораторию…
Мой собеседник, Нейтан Коупленд, три раза в неделю приезжает в лабораторию…
memory heap
На канале "Голый землекоп" ряд интересных постов про протезы со связью "мозг-компьютер": - Подкаст с Нейтаном Коуплендом, который собственно управляет протезом: https://t.iss.one/kolm_zemlekop/517 - Видео выполнения разных заданий через протез — с обратной связью…
YouTube
Touched by Science: Paralyzed Man Feels Again Through Mind-Controlled Robotic Arm
Imagine being in an accident that leaves you unable to feel any sensation in your arms and fingers. Now imagine regaining that sensation, a decade later, through a mind-controlled robotic arm that is directly connected to your brain.
That is what 28-year…
That is what 28-year…