Вчера вспомнил внезапно про Master of Orion (1993), решил сыграть партейку, в результате воевал до утра. Вот был же баланс нормальный в играх, и был интерес.
Кстати права на MOO прямо с первого выкупила внезапно Wargaming. А как вы играете в DOS-игры?
Кстати права на MOO прямо с первого выкупила внезапно Wargaming. А как вы играете в DOS-игры?
Anonymous Poll
28%
Dosbox
3%
Комп с DOS на bare-metal
3%
VMWare/VirtualBox/etc.
4%
Веб-эмулятор
62%
Дед, таблетки...
Ехал сегодня на убере, водила рассказал, что Трамп опять разрешит писать критические приложения на C++
Лайфхаки. В Университете Токио не хотели, чтоб научные материалы читали китайские студенты и препады, поэтому накидали на сайте надписи "tiananmen square" со style="display: none"
После чего сайт университета автоматически был надежно забанен в Китае и японцам не пришлось конфигурить собственные фаерволы.
После чего сайт университета автоматически был надежно забанен в Китае и японцам не пришлось конфигурить собственные фаерволы.
В 1976 году доктор Байер из Kodak запатентовал новый фильтр для цифровых камер, принцип которого заключался в том, что за красный и синий цвета отвечает по одному сенсору, а за зелёный - два. Исходное изображение, соответственно, кодируется как RGGB, BGGR или в другой комбинации, в которой зелёный получает в 2 раза больше бит, чем остальные.
Смысл в том, что человек - существо, привыкшее жить на деревьях (кто не верит в эволюцию - все равно в саду Эдема), и наш глаз различает намного больше оттенков зелёного, чем любого другого цвета.
В результате изобретения Байера, цвета на цифровой фотографии резко стали куда более "живыми" и естественными. Сегодня фильтр Байера или десятки его производных вариантов, используются как в профессиональных камерах, так и в обычных мобильных телефонах. Один из секретов "крутой" камеры iPhone 10 лет назад - как раз фильтр "Quad Bayer" разработки Sony, начиная с 6й модели. Впрочем, конкуренты тоже быстро это выяснили и внедрили похожее в своих матрицах. Samsung, например, "сидят" на Nonacell SFA, с тем же принципом - 9 синих, 9 красных и 18 зелёных сенсоров на группу из 3*3 пикселей.
Смысл в том, что человек - существо, привыкшее жить на деревьях (кто не верит в эволюцию - все равно в саду Эдема), и наш глаз различает намного больше оттенков зелёного, чем любого другого цвета.
В результате изобретения Байера, цвета на цифровой фотографии резко стали куда более "живыми" и естественными. Сегодня фильтр Байера или десятки его производных вариантов, используются как в профессиональных камерах, так и в обычных мобильных телефонах. Один из секретов "крутой" камеры iPhone 10 лет назад - как раз фильтр "Quad Bayer" разработки Sony, начиная с 6й модели. Впрочем, конкуренты тоже быстро это выяснили и внедрили похожее в своих матрицах. Samsung, например, "сидят" на Nonacell SFA, с тем же принципом - 9 синих, 9 красных и 18 зелёных сенсоров на группу из 3*3 пикселей.
Немного о веб-плагинах.
Представьте что у вас есть React-CSR-приложение и вы хотите разрешить юзерам писать под него плагины.
Первое, что необходимо знать - как работают импорты модулей. Проще всего, когда сторонний модуль собран как umd - он поддерживает import в рантайме без приседаний, сам становится как window.ModuleName и зависимости ищет там же.
React и некоторые другие фреймворки требуют, чтобы в приложении работала только одна копия. Да и вам, скорее всего, захочется, чтобы плагин взаимодействовал с вашим API через некоторый глобальный контекст модулей. Поэтому никакие рантайм-версии реактов не подгружаем, а делаем руками
для каждого интересующего нас модуля.
Второй этап - научиться собирать плагин-модулинезаметно для санитаров. Дело в том, что современные бандлеры - слишком умные и пытаются запаковать всё что можно, не смотря на объявленные externals, причем логику часто не понимает сам производитель.
Для начала, советую взять webpack - он самый предсказуемый. vite, например, начиная с 5й версии, срал на externals и пытается вам насильно запаковать React во всех случаях, кроме "jsx": "preserve" в tsconfig.json. Имеются и другие нюансы, например umd default export у webpack - window.ModuleName.default, а у vite - window.ModuleName. Такие ситуации должен уметь разруливать уже ваш загрузчик.
Современные веб-плагины -ебля увлекательная занятие интересное. Неудивительно, что нормально они реализованы в полторы приложениях, а CSR все вообще стараются избегать. Тем не менее, стабильная реализация оказывается возможна.
Представьте что у вас есть React-CSR-приложение и вы хотите разрешить юзерам писать под него плагины.
Первое, что необходимо знать - как работают импорты модулей. Проще всего, когда сторонний модуль собран как umd - он поддерживает import в рантайме без приседаний, сам становится как window.ModuleName и зависимости ищет там же.
React и некоторые другие фреймворки требуют, чтобы в приложении работала только одна копия. Да и вам, скорее всего, захочется, чтобы плагин взаимодействовал с вашим API через некоторый глобальный контекст модулей. Поэтому никакие рантайм-версии реактов не подгружаем, а делаем руками
import * as React from "react";
window.React = React;
для каждого интересующего нас модуля.
Второй этап - научиться собирать плагин-модули
Для начала, советую взять webpack - он самый предсказуемый. vite, например, начиная с 5й версии, срал на externals и пытается вам насильно запаковать React во всех случаях, кроме "jsx": "preserve" в tsconfig.json. Имеются и другие нюансы, например umd default export у webpack - window.ModuleName.default, а у vite - window.ModuleName. Такие ситуации должен уметь разруливать уже ваш загрузчик.
Современные веб-плагины -
CVE-2024-49071 - Windows Defender индексирует файлы в папках юзеров. После чего любой юзер имеет доступ к базе дефендера.
Я говорил, Шиндовс очень сложная система. Все против тебя.
Я говорил, Шиндовс очень сложная система. Все против тебя.
У V4L был фатальный недостаток, ну вы понимаете. Поэтому энтузиасты собрались и создали стильную, модную и молодежную libcamera.
libcamera призвана полностью заменить V4L, но к счастью она еще это не сделала. Тем не менее, поддержка многих современных камер работает только в ней. Если вы решили всунуть в проект либкамеру, готовьтесь к следующему:
- libcamera -написана через жопу динамически развивающийся проект. Поэтому вам, скорее всего, придётся собирать её с нуля.
- у libcamera есть mainstream-ветка а также форки от производителей железа, которые не согласны с разработкой mainstream, поэтому есть шанс, что вам нужен будет именно форк
- выберете вы форк или mainstream, есть большой шанс, что без патчей оно всё равно не соберется
- билд-система libcamera построена на meson, причем на свежих версиях, так что вам придётся тянуть везде питон
- раст-крейты под libcamera по качеству не уступают самой библиотеке
libcamera призвана полностью заменить V4L, но к счастью она еще это не сделала. Тем не менее, поддержка многих современных камер работает только в ней. Если вы решили всунуть в проект либкамеру, готовьтесь к следующему:
- libcamera -
- у libcamera есть mainstream-ветка а также форки от производителей железа, которые не согласны с разработкой mainstream, поэтому есть шанс, что вам нужен будет именно форк
- выберете вы форк или mainstream, есть большой шанс, что без патчей оно всё равно не соберется
- билд-система libcamera построена на meson, причем на свежих версиях, так что вам придётся тянуть везде питон
- раст-крейты под libcamera по качеству не уступают самой библиотеке
По работе часто встречаю железки с SNMP. К сожалению, в Rust с ними вменяемо работает только один крейт, собственно snmp, но автор забил на него 7 лет назад окончательно. Я же годами бегал вокруг-около и дописывал внутренние патчи и внешние микромодули.
Внезапно попалась железка, опрос которой нужно перетащить с питона на раст, которая поддерживает только SNMPv1, а в крейте, опять же внезапно, оказалось поддержки первой версии нету (хотя очень удивительно, v1 отличается от v2 по сути только тем, что в v2 добавили 64-битные counters, а в v1 их нет). В оригинальном крейте валялся PR, чуть менее старый чем сам крейт, где автор зачем-то вместе с v1 притащил tokio.
В общем, поскольку в Европах выходные, а я не пью, решил наконец этот крейт форкнуть. Из чего появился мой красивый и современный snmp2.
Из основого, что изменилось:
- собственно поддержка SNMPv1
- немного поменялось PDU API и теперь им можно прекрасно обрабатывать любые TRAPs (добавил пример)
- MIBs (под фичей, требует libnetsnmp)
- привел более-менее весь код к современному виду
- главное - смигрировал велосипедный Object Identificator на Oid из крейта asn, который давно стандарт во всей растовской X.690-экосистеме
- добавил async (под фичей)
Оно работает и даже хорошо. Будем в январе наконец запиливать туда и SNMPv3.
p.s. Пользуясь случаем, всех с наступающими и наступившими.
Внезапно попалась железка, опрос которой нужно перетащить с питона на раст, которая поддерживает только SNMPv1, а в крейте, опять же внезапно, оказалось поддержки первой версии нету (хотя очень удивительно, v1 отличается от v2 по сути только тем, что в v2 добавили 64-битные counters, а в v1 их нет). В оригинальном крейте валялся PR, чуть менее старый чем сам крейт, где автор зачем-то вместе с v1 притащил tokio.
В общем, поскольку в Европах выходные, а я не пью, решил наконец этот крейт форкнуть. Из чего появился мой красивый и современный snmp2.
Из основого, что изменилось:
- собственно поддержка SNMPv1
- немного поменялось PDU API и теперь им можно прекрасно обрабатывать любые TRAPs (добавил пример)
- MIBs (под фичей, требует libnetsnmp)
- привел более-менее весь код к современному виду
- главное - смигрировал велосипедный Object Identificator на Oid из крейта asn, который давно стандарт во всей растовской X.690-экосистеме
- добавил async (под фичей)
Оно работает и даже хорошо. Будем в январе наконец запиливать туда и SNMPv3.
p.s. Пользуясь случаем, всех с наступающими и наступившими.
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 тоже.
Мечтал я собрать своих одноклассников на телефонную конференцию и задать им вопрос: "кому дать конфету?" Они бы закричали: "Мне!" А я бы ответил им в этот конференц-телефон: "рука в говне!"
Папа мой, инженер-схемотехник, узнав о моей мечте, уже тогда засомневался в светлом будущем прорывных технологий. Так что, в принципе, тому что сейчас творится, например в соцсетях, я абсолютно не удивляюсь.
Мечтал я собрать своих одноклассников на телефонную конференцию и задать им вопрос: "кому дать конфету?" Они бы закричали: "Мне!" А я бы ответил им в этот конференц-телефон: "рука в говне!"
Папа мой, инженер-схемотехник, узнав о моей мечте, уже тогда засомневался в светлом будущем прорывных технологий. Так что, в принципе, тому что сейчас творится, например в соцсетях, я абсолютно не удивляюсь.