SNMPv3 кстати оказался весьма интересным в плане технической реализации. Мы должны сформировать мессагу, но забить всередине 12 байт подписи нулями, потом подсчитать hmac и всунуть на место нулей первые 12 байт. Для раста кстати есть крейт который умеет SNMPv3 USM, но автор на свою экосистему тоже чего-то подзабил и до полноценного клиента-сервера не доделал.
Но лучше читать сам RFC, в оригинале оно еще прекраснее. Не смотря на то, что в 2002 году в принципе существовало немало готовых KDF, авторы решили изобрести новую. Правда, солить ключ engineID, которая не меняется.
Деды извращались.
Но лучше читать сам RFC, в оригинале оно еще прекраснее. Не смотря на то, что в 2002 году в принципе существовало немало готовых KDF, авторы решили изобрести новую. Правда, солить ключ engineID, которая не меняется.
Деды извращались.
Segment@tion fault
По работе часто встречаю железки с SNMP. К сожалению, в Rust с ними вменяемо работает только один крейт, собственно snmp, но автор забил на него 7 лет назад окончательно. Я же годами бегал вокруг-около и дописывал внутренние патчи и внешние микромодули. Внезапно…
SNMPv3 кстати готов. Признаюсь, было интересно. Особенно right-aligned буфера из оригинального крейта, которые позволяют собирать ASN.1 практически с zero-copy. Как выяснилось, для TLV и LV-лейаутов это идеально, если вы можете заранее знать, что войдет и пушать это в обратном порядке.
Кроме моего SNMP с v3 на Новый год выкатили и axum 0.8.
Много полезного, но опять поменяли некоторое API и нам с этим жить в 2025.
Много полезного, но опять поменяли некоторое API и нам с этим жить в 2025.
В современных процессорах, кроме операций над числами, есть операции над массивами (векторами). В современных Intel за это отвечает технология AVX, а в ARM есть NEON. Называется это SIMD - Single instruction/Multiple data, тоесть процессор всего за один такт может обработать (прибавить-отнять-умножить, их много) вместо одного числа, целый массив, который влазит в векторный регистр.
SIMD - очень крутая штука, например для мультимедии, где нужно на ходу увеличить-уменьшить громкость потока, изменить яркость картинки или наложить какой-то хитрый фильтр. Мультимедией, конечно, задачи не ограничиваются - тут уже зависит только от вашей фантазии.
Для использования SIMD не нужно писать на ассемблере. В Rust есть std::Simd, который пока unstable и доступен только в nightly, зато дает абстракцию над всеми процессорами. Или инструкции для конкретного процессора, которые stable, но доступны только под конкретную платформу. По опыту, Simd оверхеда не дает.
Векторные регистры относительно огромны - вы можете совать до 512 бит информации и процессить, например сразу 64 значения u8, 32 значения u16, 16 значений u32 или f32 и т.д. Например, поиск максимального значения в слайсе выглядит так:
Теоретически, если побить Vec<u8> на слайсы по 64 элемента, вы сможете найти максимальное значение в 64 раза быстрее. Но практически всё еще лучше - поскольку производители процессоров стараются максимально оптимизировать именно мультимедиа и подобные задачи, выигрыш будет исчисляться сотнями раз.
SIMD - очень крутая штука, например для мультимедии, где нужно на ходу увеличить-уменьшить громкость потока, изменить яркость картинки или наложить какой-то хитрый фильтр. Мультимедией, конечно, задачи не ограничиваются - тут уже зависит только от вашей фантазии.
Для использования SIMD не нужно писать на ассемблере. В Rust есть std::Simd, который пока unstable и доступен только в nightly, зато дает абстракцию над всеми процессорами. Или инструкции для конкретного процессора, которые stable, но доступны только под конкретную платформу. По опыту, Simd оверхеда не дает.
Векторные регистры относительно огромны - вы можете совать до 512 бит информации и процессить, например сразу 64 значения u8, 32 значения u16, 16 значений u32 или f32 и т.д. Например, поиск максимального значения в слайсе выглядит так:
use std::simd::num::SimdUint;
use std::simd::Simd;
let s: Simd<u8, 64> = Simd::from_slice(somedata);
let max = s.reduce_max();
Теоретически, если побить Vec<u8> на слайсы по 64 элемента, вы сможете найти максимальное значение в 64 раза быстрее. Но практически всё еще лучше - поскольку производители процессоров стараются максимально оптимизировать именно мультимедиа и подобные задачи, выигрыш будет исчисляться сотнями раз.
Вышел наш submap 0.3.1 с поддержкой регулярок в pub/sub саб-топиках. Это, напоминаю, базовый крейт для создания pub/sub моделей. Тоесть теперь можно написать вот такой ужас
и оно будет правильно работать. Медленно, особенно subscribe/unsubscribe, потому что нужно пройти все регулярки сабтопика, чтоб отписаться от нужной. Относительно быстро при publish, потому что регулярки компиленые.
Очень просили очень корпоративные клиенты. Но есть и хорошая новость - функционал опционален.
smap.subscribe("some/~subtopic[0-9]+/topic", &client);
assert_eq!(smap.get_subscribers("some/subtopic3/topic").len(), 1);
assert_eq!(smap.get_subscribers("some/subtopic333/topic").len(), 1);
assert_eq!(smap.get_subscribers("some/subtopicx/topic").len(), 0);
и оно будет правильно работать. Медленно, особенно subscribe/unsubscribe, потому что нужно пройти все регулярки сабтопика, чтоб отписаться от нужной. Относительно быстро при publish, потому что регулярки компиленые.
Очень просили очень корпоративные клиенты. Но есть и хорошая новость - функционал опционален.
Ferrocene кстати молодцы и активно развиваются. Их последний компилятор 24.11.0 базируется на Rust 1.81, идут с гэпом примерно чуть менее чем в 3 месяца от мейнстрима.
24.11 получил дополнительно IEC 62304. И теперь можно писать mission-critical софт для медицинских учреждений.
Если вы всю жизнь мечтали написать прошивку для аппарата МРТ на Rust - больше нет препятствий.
Полный набор ачивок выглядит сейчас так: ISO 26262 (TCL 3/ASIL D), IEC 61508 (T3), IEC 62304.
24.11 получил дополнительно IEC 62304. И теперь можно писать mission-critical софт для медицинских учреждений.
Если вы всю жизнь мечтали написать прошивку для аппарата МРТ на Rust - больше нет препятствий.
Полный набор ачивок выглядит сейчас так: ISO 26262 (TCL 3/ASIL D), IEC 61508 (T3), IEC 62304.
В детстве у меня была мечта иметь конференц-телефон. Телефоны были тогда только p2p и конференц-телефон был невиданной роскошью. Да и p2p тоже.
Мечтал я собрать своих одноклассников на телефонную конференцию и задать им вопрос: "кому дать конфету?" Они бы закричали: "Мне!" А я бы ответил им в этот конференц-телефон: "рука в говне!"
Папа мой, инженер-схемотехник, узнав о моей мечте, уже тогда засомневался в светлом будущем прорывных технологий. Так что, в принципе, тому что сейчас творится, например в соцсетях, я абсолютно не удивляюсь.
Мечтал я собрать своих одноклассников на телефонную конференцию и задать им вопрос: "кому дать конфету?" Они бы закричали: "Мне!" А я бы ответил им в этот конференц-телефон: "рука в говне!"
Папа мой, инженер-схемотехник, узнав о моей мечте, уже тогда засомневался в светлом будущем прорывных технологий. Так что, в принципе, тому что сейчас творится, например в соцсетях, я абсолютно не удивляюсь.
Как разработчик софта для ембеда, периодически дорываюсь до железа.
На этой неделе моей жертвой стал PWM-контроллер PCA9685, который должен был крутить несколько моторов SG90 и один SG5010.
Шаг первый. Настройка. PCA9685 имеет 4 адреса, на которых может слушать на I2C-шине. Как правило, производитель раздает адреса 40-43h или 70-73h. За то, какой адрес будет активен, отвечают первые 4 бита регистра MODE.
Подумав, что это будет интересно - записать в MODE 0, я так и сделал. В результате чип пропал с шины со всех адресов и даже не помахал на прощание.
Приуныв, но изучив мануал, я нашел решение - специально для таких дебилов производитель разрешает подать на питающую ногу 0.2V, после чего чип делает factory reset.
Чип на свою голову вернулся и даже один раз крутнул мотор. Но потом потащил плату, она ударилась задницей об ethernet-шилд малины, к которой всё это было подключено и весело задымилась.
После осмотра выяснилось, что к счастью сгорел только CJ2305 - МОП, отвечающий за защиту от переплюсовки. Дальше было некоторое время чудес - контроллер прекрасно крутил 2 мотора SG-90, но напрочь отказывался работать с SG5010.
Причина выяснилась только на следующий день - труп транзистора пропускал достаточно ампер, чтобы питать два SG90, но на один большой SG5010 его не хватало. После повторого осмотра платы, выяснилось что её производитель тоже предусмотрел средство для дебилов - специально возле дохлого МОП-а с платы выведено два контакта, которые ни с чем не контачат, зато на них удобно напаять жучок.
После чего всё наконец заработало. Пойду-ка я лучше код писать...
На этой неделе моей жертвой стал PWM-контроллер PCA9685, который должен был крутить несколько моторов SG90 и один SG5010.
Шаг первый. Настройка. PCA9685 имеет 4 адреса, на которых может слушать на I2C-шине. Как правило, производитель раздает адреса 40-43h или 70-73h. За то, какой адрес будет активен, отвечают первые 4 бита регистра MODE.
Подумав, что это будет интересно - записать в MODE 0, я так и сделал. В результате чип пропал с шины со всех адресов и даже не помахал на прощание.
Приуныв, но изучив мануал, я нашел решение - специально для таких дебилов производитель разрешает подать на питающую ногу 0.2V, после чего чип делает factory reset.
Чип на свою голову вернулся и даже один раз крутнул мотор. Но потом потащил плату, она ударилась задницей об ethernet-шилд малины, к которой всё это было подключено и весело задымилась.
После осмотра выяснилось, что к счастью сгорел только CJ2305 - МОП, отвечающий за защиту от переплюсовки. Дальше было некоторое время чудес - контроллер прекрасно крутил 2 мотора SG-90, но напрочь отказывался работать с SG5010.
Причина выяснилась только на следующий день - труп транзистора пропускал достаточно ампер, чтобы питать два SG90, но на один большой SG5010 его не хватало. После повторого осмотра платы, выяснилось что её производитель тоже предусмотрел средство для дебилов - специально возле дохлого МОП-а с платы выведено два контакта, которые ни с чем не контачат, зато на них удобно напаять жучок.
После чего всё наконец заработало. Пойду-ка я лучше код писать...
Внезапно перевел все наши продукты с jemalloc на mimalloc.
Битва аллокаторов - вечный холивар, расскажу свои соображения, а вы добавьте в комментариях.
- Причина, почему я вообще дернулся в смену аллокатора - клиенты начали ставить новый Raspbian, а там CONFIG_ARM64_16K_PAGES по-умолчанию включены. Jemalloc с 16кб-страницами по-умолчанию не работает и просто крешится на старте
- У jemalloc есть опция выбора максимального размера страницы, которую нужно постоянно включать при компиляции в environment variables. В случае, если размер страницы меньше, чем заданная, есть небольшая пенальти в работе. У mimalloc никаких опций нет, оно работает плюс-минус всегда одинаково
- Оба аллокатора я уже не раз гонял в работе, они используют похожие алгоритмы, но по-разному имплементированные. В результате, одни задачи могут быть быстрее на jemalloc, другие - на mimalloc, но в среднем всё будет одинаково и разницу не заметите. На моих задачах mimalloc всё же дает плюс в пару %
- У mimalloc есть "secure"-режим для параноидальных клиентов, который позволяет обходить известные методы атаки на кучу еще до того, как в системе нашли очередную дырку
- Бинарники с mimalloc примерно на 500kb легче
Битва аллокаторов - вечный холивар, расскажу свои соображения, а вы добавьте в комментариях.
- Причина, почему я вообще дернулся в смену аллокатора - клиенты начали ставить новый Raspbian, а там CONFIG_ARM64_16K_PAGES по-умолчанию включены. Jemalloc с 16кб-страницами по-умолчанию не работает и просто крешится на старте
- У jemalloc есть опция выбора максимального размера страницы, которую нужно постоянно включать при компиляции в environment variables. В случае, если размер страницы меньше, чем заданная, есть небольшая пенальти в работе. У mimalloc никаких опций нет, оно работает плюс-минус всегда одинаково
- Оба аллокатора я уже не раз гонял в работе, они используют похожие алгоритмы, но по-разному имплементированные. В результате, одни задачи могут быть быстрее на jemalloc, другие - на mimalloc, но в среднем всё будет одинаково и разницу не заметите. На моих задачах mimalloc всё же дает плюс в пару %
- У mimalloc есть "secure"-режим для параноидальных клиентов, который позволяет обходить известные методы атаки на кучу еще до того, как в системе нашли очередную дырку
- Бинарники с mimalloc примерно на 500kb легче
В связи с трендом на cyber security, в промышленность и энергетику начинают проникать решения, которые еще недавно даже у военных пылились в нафталине, где-то между перфокартами и 8" дискетами. Но теперь оно - тренд и знать желательно.
Диод данных (он же однонаправленная сеть) - сеть, в которой пакеты ходят только в одном направлении. Простейший диод можно собрать самому, например взяв оптическое подключение и отстрелив трансмиттеры.
Такая сеть ломает практически все протоколы, но зато ее саму невозможно поломать (в смысле - отправителя). По сути всё что проходит - только UDP (из коробки - например SNMP traps), остальное можно в это UDP инкапсулировать, например SMTP (без подтверждения доставки) и вообще любой push сообщений, или pub/sub, если нужно только pub с одной стороны, или только sub, но всегда на определенные топики, с другой. Когда мы регистрировали свой PSRT, в IANA нам намекали на плюсы такого функционала и хорошо что было время имплементировать. Впрочем, я тогда больше думал о сети, которая не может принимать данные в силу обрезанного embed-стека.
Модель Белла-Лападулы - модель мандатного управления доступом, еще простая, но уже более сложная, чем просто взять и обрезать-инкапсулировать готовые протоколы. Которая как раз реализуется с помощью диодов данных. К счастью, пока практических запросов не было, сетевики клиентов не могут понять и принять даже более простые диоды.
Диод данных (он же однонаправленная сеть) - сеть, в которой пакеты ходят только в одном направлении. Простейший диод можно собрать самому, например взяв оптическое подключение и отстрелив трансмиттеры.
Такая сеть ломает практически все протоколы, но зато ее саму невозможно поломать (в смысле - отправителя). По сути всё что проходит - только UDP (из коробки - например SNMP traps), остальное можно в это UDP инкапсулировать, например SMTP (без подтверждения доставки) и вообще любой push сообщений, или pub/sub, если нужно только pub с одной стороны, или только sub, но всегда на определенные топики, с другой. Когда мы регистрировали свой PSRT, в IANA нам намекали на плюсы такого функционала и хорошо что было время имплементировать. Впрочем, я тогда больше думал о сети, которая не может принимать данные в силу обрезанного embed-стека.
Модель Белла-Лападулы - модель мандатного управления доступом, еще простая, но уже более сложная, чем просто взять и обрезать-инкапсулировать готовые протоколы. Которая как раз реализуется с помощью диодов данных. К счастью, пока практических запросов не было, сетевики клиентов не могут понять и принять даже более простые диоды.
Media is too big
VIEW IN TELEGRAM
Быстрая демка веб-дашбордов в EVA ICS v4.
Главный успех, которого добились в конце прошлого года - расширения создаются одним вызовом npx и сразу рабочие. А не так, как у некоторых.
Всё это есть в комьюнити-версии, поставить и пользовать можно бесплатно.
Главный успех, которого добились в конце прошлого года - расширения создаются одним вызовом npx и сразу рабочие. А не так, как у некоторых.
Всё это есть в комьюнити-версии, поставить и пользовать можно бесплатно.
Пишут, на следующей неделе Трамп собирается подписать указ о переименовании main обратно в master.
Make GitHub great again.
Make GitHub great again.
Китайский ИИ DeepSeek за один день покорил Уолл-Стрит, потому что упорно отказывается программировать на С++, а значит имеет сознание
This media is not supported in your browser
VIEW IN TELEGRAM
Deep Seek отказывается отвечать на вопросы, связанные с площадью Тяньаньмэнь, но фильтр там писали набранные по объявлениям - как только в тексте встречается "Tiananmen Square", он тут же затирается и бот перестает отвечать.
Цензуру обойти очень просто - я попросил бота называть площадь "Pooh Square" и он тут же мне выдал всё, о чём думает.
Цензуру обойти очень просто - я попросил бота называть площадь "Pooh Square" и он тут же мне выдал всё, о чём думает.
В этом году на Cyber Scotland Week разберём подробнее диоды. Мой доклад в 15:00 по GMT 27 февраля. Заходите, поговорим куда оно все катится.
https://www.cyberscotland.com/event/data-diodes-for-isolated-and-classified-networks-in-critical-infrastructure/
https://www.cyberscotland.com/event/data-diodes-for-isolated-and-classified-networks-in-critical-infrastructure/
Cyber Scotland
Data Diodes for isolated and classified networks in critical infrastructure - Cyber Scotland
This session explores enhancing cybersecurity with EVA ICS in critical infrastructure by integrating data diodes to ensure secure, one-way data transfer in isolated and classified networks. Learn how this approach mitigates cyber threats, maintains regulatory…