Кто не был на моем выступлении на Cyber Scotland Week 2025 про диоды, можно посмотреть запись.
https://www.youtube.com/watch?v=f3OybO1UQzk
https://www.youtube.com/watch?v=f3OybO1UQzk
YouTube
Data Diodes for isolated and classified networks in critical infrastructure
Uni-directional networks, fieldbus-to-SCADA dataflow, data diodes in EVA ICS DCS. Bohemia Automation @ Cyber Scotland Week 2025
👍13🔥7
В свежий clippy затянули линт "precedence", который рекомендует ставить скобки для операторов сдвига, потому что они имеют более низкий приоритет.
Это - фактически калька с -Wparentheses из C++11. Причем я совершенно точно помню, что 25 лет назад меня в универе какой-то препод-надмозг учил, что шифты имеют приоритет выше арифметики, но придя в прод я быстро переучился.
Тем не менее, ситуация оказалась хуже. Например ChatGPT где-то вычитал, что в Rust и С приоритет операторов разный и уверенно сообщает этот факт. Хотя ответ 32 будет в обоих случаях.
Why is this bad?
Not everyone knows the precedence of those operators by heart, so expressions like these may trip others trying to reason about the code.
Example
1 << 2 + 3 equals 32, while (1 << 2) + 3 equals 7
Это - фактически калька с -Wparentheses из C++11. Причем я совершенно точно помню, что 25 лет назад меня в универе какой-то препод-надмозг учил, что шифты имеют приоритет выше арифметики, но придя в прод я быстро переучился.
Тем не менее, ситуация оказалась хуже. Например ChatGPT где-то вычитал, что в Rust и С приоритет операторов разный и уверенно сообщает этот факт. Хотя ответ 32 будет в обоих случаях.
👍20🔥10
Google представил в своем аппсторе Debian terminal app - полноценный Debian в телефоне, который работает через Android Virtualization Framework (пока работает только на новых пикселях).
Запустив два таких приложения, вы сможете собрать на своём телефоне кластер Kubernetes, например. А с тремя приложениями уже вынести СУБД на отдельный виртуальный хост. Не благодарите, всё для вашего удобства.
Запустив два таких приложения, вы сможете собрать на своём телефоне кластер Kubernetes, например. А с тремя приложениями уже вынести СУБД на отдельный виртуальный хост. Не благодарите, всё для вашего удобства.
😁54🔥8👍7💩1
А вот этот тренд выпиливания S3 sleep в современных ноутбуках, это специально диверсия или просто специалистов уже не осталось поддерживать несколько режимов?
Не могу сказать, что оно сильно напрягает, но во-первых да, есть модели ноутов, которые в S0 в принципе ходят плохо, по причине того что банально не успевают охладиться даже на low voltage. Во-вторых, просто не люблю, когда что-то имеет право разбудить комп, кроме моей команды, тем более если это что-то программное.
Не могу сказать, что оно сильно напрягает, но во-первых да, есть модели ноутов, которые в S0 в принципе ходят плохо, по причине того что банально не успевают охладиться даже на low voltage. Во-вторых, просто не люблю, когда что-то имеет право разбудить комп, кроме моей команды, тем более если это что-то программное.
👍21
Минимальный пример в расте, как отстрелить себе яйца получить проблемы на пустом месте, меняя иммутабельное.
Был у нас в проде код, написанный рукожопами, с тяжелым наследием от крестовиков, который выглядел примерно вот так:
Собственно простая задача - буфер используется много где, а нам нужно срочно затереть два последних байта. Мы обкладываемся проверкой длины и оффсетов и всё замечательно, в корку не падает, 0day не плодит. Беда только, что не работает. Причем в дебаг работает, в релиз - не работает.
Мораль в том, что компилятор видит что в блок зашла иммутабельная переменная, и в праве считать, что она такой и вышла. В результате внутренних оптимизаций, он имеет право ее копировать из предыдущего варианта, кешировать и вообще брать эти данные откуда угодно, лишь бы работало быстро.
Если прод горит и нет вариантов, то есть конечно некоторые способы объяснить компилятору, что кешировать ничего не надо - загнать блок в black box, кастануть часть слайса в атомики или %ваш вариант%. Но лучше всего, конечно, найти автора кода ибить его ногами попросить переписать без лишних unsafe.
Был у нас в проде код,
fn x(bytes: &[u8]) {
unsafe {
let ptr = bytes.as_ptr().add(8) as *mut u8;
std::ptr::write_bytes(ptr, 0, 2);
}
}
fn main() {
let v = (0..10).collect::<Vec<u8>>();
x(&v);
dbg!(v);
}
Собственно простая задача - буфер используется много где, а нам нужно срочно затереть два последних байта. Мы обкладываемся проверкой длины и оффсетов и всё замечательно, в корку не падает, 0day не плодит. Беда только, что не работает. Причем в дебаг работает, в релиз - не работает.
Мораль в том, что компилятор видит что в блок зашла иммутабельная переменная, и в праве считать, что она такой и вышла. В результате внутренних оптимизаций, он имеет право ее копировать из предыдущего варианта, кешировать и вообще брать эти данные откуда угодно, лишь бы работало быстро.
Если прод горит и нет вариантов, то есть конечно некоторые способы объяснить компилятору, что кешировать ничего не надо - загнать блок в black box, кастануть часть слайса в атомики или %ваш вариант%. Но лучше всего, конечно, найти автора кода и
👍42🔥9😁5
HR-корпорация ManPower, выпустила отчет о том как будет выглядеть рынок труда в ближайшие годы: миллениалы в руководстве и AI в их подчинении. Потом поменяются.
Что делать с зумерами, пока непонятно.
Что делать с зумерами, пока непонятно.
😁45💩4👍2🔥2
Убедился, что я совершенно против использования веб-интерфейсов для HMI. Раньше я был против тач-скринов, но это уже как-то прошли: производители наконец нашли компромисс и вернули панели с парой-тройкой кнопок, на которые можно забиндить то, что неудобно жать на экране, а на экране зато удобно жать всякие зумы и прокрутки. Кроме того, тачскрины перестали лагать и ембед с условной 4й малиной внутри работает вполне неплохо. Поэтому моя ненависть сосредоточилась на веб-интерфейсах.
TLDR: если вас будут оперировать роботом-хирургом с веб-интерфейсом - лучше убегайте
SCADA - да. Это совсем другое дело, я двумя руками за веб-скады по простым причинам
- оператор может находиться далеко от сервера, а зачем изобретать безопасность если на любой системе есть HTTPS
- оператор обычно сидит на винде в домене с кучей полиси и поставить новый .exe - каждый раз целые танцы с бубном
- оператором может быть главный инженер предприятия, который, с утра откушав кофею, хочет со своего планшета посмотреть всё ли в порядке на производстве
- SCADA - чисто клиент-серверная архитектура, по функционалу недалеко ушедшая от корпоративного веб-сайта
HMI - это не SCADA и требования тут совсем другие
- оператор обычно сидит очень близко, либо по выделенному VPN-каналу
- устройство и пульт управления - это не клиент-сервер, а единое целое
- пульт управления - обычно какой-то ембед, куда всунули условную 4ю малину, а теперь пытаются впихуть невпихуемое и запустить на ней этот HMI с кучей реактов и редаксов, который разрабатывали веб-девелоперы на топовых i7
- кроме скорости работы, браузер - это закрытая система с кучей ограничений стека, который ломают от версии к версии. если ляжет SCADA - предприятие остановится. если ляжет пульт - оно тоже остановится, но перед этим кого-то может намотать на вал
TLDR: если вас будут оперировать роботом-хирургом с веб-интерфейсом - лучше убегайте
SCADA - да. Это совсем другое дело, я двумя руками за веб-скады по простым причинам
- оператор может находиться далеко от сервера, а зачем изобретать безопасность если на любой системе есть HTTPS
- оператор обычно сидит на винде в домене с кучей полиси и поставить новый .exe - каждый раз целые танцы с бубном
- оператором может быть главный инженер предприятия, который, с утра откушав кофею, хочет со своего планшета посмотреть всё ли в порядке на производстве
- SCADA - чисто клиент-серверная архитектура, по функционалу недалеко ушедшая от корпоративного веб-сайта
HMI - это не SCADA и требования тут совсем другие
- оператор обычно сидит очень близко, либо по выделенному VPN-каналу
- устройство и пульт управления - это не клиент-сервер, а единое целое
- пульт управления - обычно какой-то ембед, куда всунули условную 4ю малину, а теперь пытаются впихуть невпихуемое и запустить на ней этот HMI с кучей реактов и редаксов, который разрабатывали веб-девелоперы на топовых i7
- кроме скорости работы, браузер - это закрытая система с кучей ограничений стека, который ломают от версии к версии. если ляжет SCADA - предприятие остановится. если ляжет пульт - оно тоже остановится, но перед этим кого-то может намотать на вал
👍28😁4💩1
Жизнь без дискретки в ноуте. Я обещал взять ноут без карты и таки это сделал, хотя случайно. Оказалось, такая жизнь прекрасна. Нет больше печки, которая заставляла постоянно гудеть кулеры и жрала батарейку.
Из минусов, хотя игры на 13м поколении интеля стали идти намного лучше, чем шли на 11+nvidia t1200, некоторые специфические проги типа webots, которые сильно завязаны на математику GPU, стали выдавать меньше FPS. К счастью, это совсем не моя сфера и запускаю такое раз в год.
Интересный момент - проблема тротлинга GPU на батарее. А именно - при загрузке CPU картинка дико начинает тормозить, даже буквы в терминале. На thinkpad, по крайней мере, это решается тем, что в биосе выставляется high performance profile для батареи. Потом грузится ОС, которая может легко менять частоты процессора, а вот настойки видеокарты ей недоступны. Не смотря на некоторые заявленные опции в родных тулзах интеля.
Из минусов, хотя игры на 13м поколении интеля стали идти намного лучше, чем шли на 11+nvidia t1200, некоторые специфические проги типа webots, которые сильно завязаны на математику GPU, стали выдавать меньше FPS. К счастью, это совсем не моя сфера и запускаю такое раз в год.
Интересный момент - проблема тротлинга GPU на батарее. А именно - при загрузке CPU картинка дико начинает тормозить, даже буквы в терминале. На thinkpad, по крайней мере, это решается тем, что в биосе выставляется high performance profile для батареи. Потом грузится ОС, которая может легко менять частоты процессора, а вот настойки видеокарты ей недоступны. Не смотря на некоторые заявленные опции в родных тулзах интеля.
👍14🔥4
Можно ли реально использовать Rust+Linux в mission-critical системах?
Можно, например сейчас на RoboPLC мы пишем BMS (которая Battery) с прицелом сразу на контейнеры в 1 MWh.
Естественно, это вряд-ли просто так пройдет сертификацию, да и я не очень хочу делать потенциальную бомбу, поэтому каждый embed с Linux по архитектуре дополнительно мониторится.
Мониторятся такие системы в принципе не сложно. Процесс или отдельные треды посылают на watchdog heartbeat-сигнал - rising/falling edges, чередующиеся через определенный интервал времени. Это исключает вариант, когда исходная система "зависает" в определенном положении, а, например GPIO, показывает единицу - мониторинг не дождется смены сигнала и тут же отправит весь модуль в FAULT.
Вообще по heartbeats можно написать отдельную статью, есть например варианты для особо параноидальных, когда edges рисуют определенные фигуры (Signature-Based) или вотчдог требует повторить случайную "морзянку" (Challenge-Response), но в принципе если вы используете 1-0 и мониторите сигнал на "аритмию" (Windowed Pulse Monitoring) - этого хватает в 99.9999% случаев. Бонусом получаете мониторинг циклов реального времени и немедленный FAULT, если на исходной системе сбился realtime-цикл. Если проект совсем взрывоопасный, как в нашем случае - ставятся два вотчдога, которые мониторят друг друга, или вторым выступает исходная система.
Библу я выложил - heartbeat-watchdog, это официально войдет в следующий RoboPLC отдельным крейтом. Пока есть транспорт сигнала по UDP и по GPIO-пинам. Вопрос с nostd открытый - есть предложение от некоторых коллег мониторить STM-ками - это и дешевле и слегка надежнее, но пока не пришли к окончательному консенсусу. Будет - допишу скоро, не будет - чуть попозже, при случае.
Можно, например сейчас на RoboPLC мы пишем BMS (которая Battery) с прицелом сразу на контейнеры в 1 MWh.
Естественно, это вряд-ли просто так пройдет сертификацию, да и я не очень хочу делать потенциальную бомбу, поэтому каждый embed с Linux по архитектуре дополнительно мониторится.
Мониторятся такие системы в принципе не сложно. Процесс или отдельные треды посылают на watchdog heartbeat-сигнал - rising/falling edges, чередующиеся через определенный интервал времени. Это исключает вариант, когда исходная система "зависает" в определенном положении, а, например GPIO, показывает единицу - мониторинг не дождется смены сигнала и тут же отправит весь модуль в FAULT.
Вообще по heartbeats можно написать отдельную статью, есть например варианты для особо параноидальных, когда edges рисуют определенные фигуры (Signature-Based) или вотчдог требует повторить случайную "морзянку" (Challenge-Response), но в принципе если вы используете 1-0 и мониторите сигнал на "аритмию" (Windowed Pulse Monitoring) - этого хватает в 99.9999% случаев. Бонусом получаете мониторинг циклов реального времени и немедленный FAULT, если на исходной системе сбился realtime-цикл. Если проект совсем взрывоопасный, как в нашем случае - ставятся два вотчдога, которые мониторят друг друга, или вторым выступает исходная система.
Библу я выложил - heartbeat-watchdog, это официально войдет в следующий RoboPLC отдельным крейтом. Пока есть транспорт сигнала по UDP и по GPIO-пинам. Вопрос с nostd открытый - есть предложение от некоторых коллег мониторить STM-ками - это и дешевле и слегка надежнее, но пока не пришли к окончательному консенсусу. Будет - допишу скоро, не будет - чуть попозже, при случае.
👍25🔥14💩1
Практическая схемотехника - вам нужно переключать сигнал на слаботочке между потребителями. В моем случае - это модули с одинаковым CAN ID, который производитель решил запретить менять. Есть варианты:
- поставить много CAN-адаптеров на контроллер - дорого и технически ограничено
- поставить релейки. относительно дорого, ненадежно и переключаться для рилтайма не то
- собрать вместо релеек схему на паре транзисторов и диодов - профит
Задача вполне типичная, поэтому для этого конечно же есть ИС (точнее такие штуки называются транзисторные массивы). Например ULN2803 позволяет выполнять задачу сразу на 8 каналов. При стоимости оптом в один доллар.
- поставить много CAN-адаптеров на контроллер - дорого и технически ограничено
- поставить релейки. относительно дорого, ненадежно и переключаться для рилтайма не то
- собрать вместо релеек схему на паре транзисторов и диодов - профит
Задача вполне типичная, поэтому для этого конечно же есть ИС (точнее такие штуки называются транзисторные массивы). Например ULN2803 позволяет выполнять задачу сразу на 8 каналов. При стоимости оптом в один доллар.
🔥12👍5
Кто ещё мучается с modern standby на писюках - есть простое решение. Внезапно на практике, если сказать системе ложить сеть, потребление в S0 сразу приближается к S3. Собственно маки примерно это же и делают.
На линухе это решается соотв. before suspend в systemd, в шиндовс - парой параметров в group policy (ложить сеть на батарее и на питании).
Не поверил бы, что это напишу, но получается что S3 в 2025 году действительно не нужен.
На линухе это решается соотв. before suspend в systemd, в шиндовс - парой параметров в group policy (ложить сеть на батарее и на питании).
Не поверил бы, что это напишу, но получается что S3 в 2025 году действительно не нужен.
😁14👍7🔥3💩2👎1
Недавно один фанат имперской системы дал мне лучшее объяснение шкалы Фаренгейта. Изначально Фаренгейт хотел привязать ноль к температуре смеси воды, льда и хлорида аммония, а 100, по слухам - к нормальной температуре тела. Но почему Фаренгейт так зашёл имперцам?
У имперцев все приблизительно. Да, есть точный перевод, например фута в сантиметры, но первоначальная задумка что футы есть (почти) у всех и измерить расстояние можно примерно, зато не имея подручных средств.
Теперь про температуру. Диапазон 0-100 можно взять как 0-100%, -18С - 0% тепло (холодно), +38С - 100% тепло. Комфортная температура для людей-любителей холода и любителей тепла же сходится примерно на 50F=10C. Все что выше/ниже диапазона - для жизни уже не сильно подходит и человека не касается.
Сейчас на улице как раз весна и на 50% тепло. Уже можно ходить без шапки, с чем и поздравляю.
У имперцев все приблизительно. Да, есть точный перевод, например фута в сантиметры, но первоначальная задумка что футы есть (почти) у всех и измерить расстояние можно примерно, зато не имея подручных средств.
Теперь про температуру. Диапазон 0-100 можно взять как 0-100%, -18С - 0% тепло (холодно), +38С - 100% тепло. Комфортная температура для людей-любителей холода и любителей тепла же сходится примерно на 50F=10C. Все что выше/ниже диапазона - для жизни уже не сильно подходит и человека не касается.
Сейчас на улице как раз весна и на 50% тепло. Уже можно ходить без шапки, с чем и поздравляю.
👍22🔥9😁7👎6💩2
Когда диджитализация вышла из под контроля.
Украинское Минцифры сообщает, что в стране насчитывается около 350 государственных цифровых реестров, точную цифру оно само не знает.
Поэтому в этом году будет создан новый реестр - "Реестр Реестров". Нет, первое апреля еще не сегодня.
Украинское Минцифры сообщает, что в стране насчитывается около 350 государственных цифровых реестров, точную цифру оно само не знает.
Поэтому в этом году будет создан новый реестр - "Реестр Реестров". Нет, первое апреля еще не сегодня.
😁57🔥3👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Всегда мечтал так пройти Марио
🔥27👍13😁13
Спустя три года после выпуска, дошли руки и обновили наш embedded-браузер EvaPanel.
Браузер построен поверх wry и заточен, в первую очередь, под киоски с тач-скринами, а благодаря маленькому memory footprint работает примерно на всём. Из особенностей - фильтр урлов "куда можно" и опциональное полное удаленное управление.
В апдейте, собственно из главного, был поднят wry до последнего, выкинуты остатки webkit2gtk (предыдущие версии сидели частично прямо на нем) а также добавлен и проверен функционал работы под винду (на линуксе wry бегает через webkit, на винде - через edge webview, который теперь chromium). Плюс добавлена и проверена работа в wayland без X.
Причина внезапной поддержки винды - то что уже недавно описывал, клиентам надоело поведение "больших" браузеров при открытии всяких веб-скад и HMI.
На слайде - работает на моем любимом "карманном" reterminal, кстати просто незаменимая железка для ембед-разработчика. Про нее могу написать как-нибудь отдельно.
Браузер построен поверх wry и заточен, в первую очередь, под киоски с тач-скринами, а благодаря маленькому memory footprint работает примерно на всём. Из особенностей - фильтр урлов "куда можно" и опциональное полное удаленное управление.
В апдейте, собственно из главного, был поднят wry до последнего, выкинуты остатки webkit2gtk (предыдущие версии сидели частично прямо на нем) а также добавлен и проверен функционал работы под винду (на линуксе wry бегает через webkit, на винде - через edge webview, который теперь chromium). Плюс добавлена и проверена работа в wayland без X.
Причина внезапной поддержки винды - то что уже недавно описывал, клиентам надоело поведение "больших" браузеров при открытии всяких веб-скад и HMI.
На слайде - работает на моем любимом "карманном" reterminal, кстати просто незаменимая железка для ембед-разработчика. Про нее могу написать как-нибудь отдельно.
🔥24👍7