Telegram Web Link
Узнал, что JWT уже не модно и правильные пацаны переходят на Paseto.

Вспомнилось, типичный разговор с клиентом:

- вы используете JWT и подобные токены?
- конечно, зачем нам хранить сессии в базе и дёргать её каждый раз?
- а вы как-то учитываете, сколько токенов выдал сервер?
- конечно, мы храним в базе все токены, по крайней мере пока они активны
- а вы можете сделать отзыв токена?
- конечно. мы храним в базе revocation list и проверяем каждый запрос
😁40👍3
Segment@tion fault
Ulefone Armor 11T довольно неплохо фоткает под водой. Правда через 15 минут подох экран, что было предсказуемо для китайца, но не ожидаемо. Вот такой IP68 с гарантией до 1.5 метра погружения. Caterpillar, я по ходу завтра же возвращаюсь в ваши ряды.
История закончилась печально. Сервис китайцев чинить предсказуемо отказался, а ритейлер предложил сделать независимую экспертизу. Но денег мне все равно не вернут, потому что внезапно эта модель вернулась in stock.

Поэтому я мог забрать аппарат, принести заключение своего эксперта (тащемта я могу быть им себе сам, у меня есть лицензия) и ритейлер обещал его принять без вопросов, но в награду мне могут выдать только такой же телефон.

Огорченный упущенной возможностью сделать полный refund через полтора года, я решил дальше не мучаться и по моей просьбе аппарат был ликвидирован экологическим путем.

К слову, купленный Caterpillar S53 прекрасно фотографирует в солёной воде, а в инструкции прямо написано - промойте пресной и живите счастливо. А ещё там есть офигенный настоящий фонарик на аппаратной кнопке. И я поэтому счастлив вдвойне. Хотя я вернулся в Прагу и с солёной водой тут плохо.
👍8
Почему я сторонник программирования PLC на Rust и подобных более "продвинутых" языках, рассмотрим пример с Modbus

Самый ужасный вариант: конструктор PLC разрешает вам мапить холдинг-регистры только на 16-bit unsiged int PLC-программы. В таком случае, если удаленное устройство содержит, например 32-bit float в котором хранится например температура, запакованный в IEEE754, вам придется вручную в каждой итерации этот float распаковывать руками. Не забудьте что в Modbus байты IEEE754 расположены в довольно непривычном порядке.

Тоже не лучший вариант: конструктор PLC умеет распаковывать IEEE754 из модбаса, но производитель для простоты записывает данные в 32-bit integer, который вам нужно поделить, например на 1000. В таком случае, IEEE754 вам не поможет и вам придется, опять же вручную, делить это в своей программе.

Более ужасный вариант, который я не раз встречал: пусть конструктор умеет распаковывать IEEE754, а для integer позволяет делать простую математику (делить-умножать-округлять). Но производитель датчика пошел наиболее хамским путем, допустим для простоты он меряет температуру от -N до +N. Производителю, у которого приходит на AIN, допустим от 0 до 3 вольт, не захотелось заморачиваться и он просто умножает вольтаж на некий множитель. А затем пишет в инструкции, что 32768 соответствует ноль, 32767- - минусовая температура, а 32769+ - плюсовая, потом поделить. Такая запись называется Offset Binary. Преобразовать Offset binary простым делением уже нельзя и вам опять придётся делать всё ручками каждый раз в своей PLC-программе.

Structured Text - штука примитивная и расширять ее можно только функциями. А вот, скажем, с Rust, всё уже гораздо веселее: конструктор PLC может предоставлять вам некий трейт "ModbusPayload", который имеет методы кодирования и декодирования типов в/из массива u16.

Что далем дальше? А всё просто - объявляем newtype(f32), объявляем, что наша переменная в контексте - newtype и один раз пишем в имплементации ModbusPayload энкодер и декодер. Из любого формата в любой. После чего, работаем в PLC-программах с этой переменной, как с обычным флоатом. Фокусируясь на логике автоматизации, а не на байтоебстве.
👍27👎1
Тут в комментах к предыдущему посту указывают, что температура в США в фаренгейтах.

В Канаде, говорят, всё еще хуже.
😁22🔥7👍4💩3
На ту же тему
😁31
Нерешенные проблемы человечества

- Гипотеза Коллатца
- Проблема Гольдбаха
- P = NP
- как передать impl sqlx::Executor в функцию и использовать там его дважды
😁15
Обновил наконец rmodbus

Что нового в v0.7:

- (давно просили) возможность задавать любой размер контекста (сервер) с помощью const generics
- убраны встроенные методы dump/restore, вместо этого добавлена поддержка serde и bincode

https://github.com/alttch/rmodbus/
https://crates.io/crates/rmodbus
👍12
Что такое Arduino PLC IDE (https://docs.arduino.cc/software/plc-ide)

Несколько месяцев назад Arduino выпустили новое IDE, которое является IEC61131-3 compliant и позовляет программировать борды без знания кода, на FBD, LD и прочих (хотя Structured Text тоже есть).

Кроме IEC61131, это - по сути первый продукт Arduino, который уже не является конструктором "сделай сам", а представляет собой контроллер "out-of-the-box", с поддержкой Modbus и CANOpen прямо от производителя, а не непонятных контрибуторов.

Лицензирование. PLC IDE стоит 16 EUR на одну конкретную плату, лицензия активируется на ней, а не на десктопном приложении.

Важно: PLC IDE не работает с любой Arduino, а только с их топовой платой Portenta Machine Control (https://store.arduino.cc/products/arduino-portenta-machine-control), которая имеет вполне хорошие характеристики (работает при -40, например).

Рекомендуется начинающим, которые еще не умеют в большие PLC, но уже сами ставят прод.

Ложка дегтя: пока PLC IDE только под шиндовс.
👍5
Если на Rust надо генерить код, то спасают проц-макросы. А если надо генерить много кода, целыми модулями?

Повозился пару дней, кандидатами были 1) генерить вручную в строках 2) генерить из tera templates 3) генерить через codegen (https://crates.io/crates/codegen)

codegen выиграл. На первый взгляд - ничего особенного, но начинаешь использовать и понимаешь - сделали удобно. Фокусировка на работу с блоками, которые можно вставлять друг в друга в любом порядке и иерархии. Есть набор базовых блоков, типа Function, Struct и т.д. Если чего-то не хватает - можно объявить вручную, например Block::new("loop") или Block::new("while a < 5").

Рекомендую.
👍20
Неделю назад компания Sysgo объявила, что адаптировала компилятор Rust для программирования под PikeOS.

PikeOS - ОСРВ, разрабатываемая с 2005 года, и имеющая сертификации ISO 26262 (автомобилестроение), DO-178C (авиация), EN 50128 / 50657 (железные дороги) и IEC 62304 (медицина).

Крабик становится всё взрослее и серьезнее. Мы в последнем сезоне, когда писать промышленную автоматизацию на Rust еще пионерские забавы. В следующие пару лет в нишу начнут заходить большие дяденьки, а потом у интеграторов начнут появляться рабочие места, как грибы. Если вы в Rust + embed = не бросайте это дело, скоро оно будет весьма прибыльным.

Пока что последний неприступный бастион - IEC 61508, требующий, чтобы ЯДРА mission-critical ОСРВ писались исключительно на сях. Но поборем и это.
👍18🔥6💩1
8 марта 1955 года MIT открыли первый в истории симпозиум по диджитализации армейских систем залпового огня и представили цифровой комплекс управления (director), который многие историки считают первой операционной системой.

Комплекс, в частности, впервые предоставил такой инструмент, как аллокатор оперативной памяти в пользовательских программах.

С праздником!
👍15
Всё хотел написать пост про карманные гаджеты, но не хватало времени. Теперь хватило и напишу.

За последнее десятилетие смартфоны убили ковровыми бомбардировками практически все гаджеты. Но, возможно вы будете удивлены, несколько групп еще уверенно держатся.

- Карманные фотоаппараты. Дешевые "мыльницы" рассматривать смысла нет - это ширпотреб, но каждый из китов рынка имеет топовую модель, которую не собирается списывать в утиль, впрочем камеры на смартфонах последнего поколения заставляют серьезно задуматься о будущем сектора, хоть я и большой фанат Ricoh GR. Чем берут - можно найти модель с APS-C (1.6x crop vs 3+ в телефонах), физически больший размер объектива (всё чаще спорно), нормальный байонет под фильтры, встроенная дырка 1/4 под штатив, спецсофт для процессинга из коробки, рычажки-кнопки. Ездят на своей фирмвари.

- Карманные аудиоплееры. Живее всех живых, сбежали в "аудиофильский" сектор - никто не будет ставить в смартфон топовые DAC, сантиметровые конденсаторы и разъемы под 3.5" jack. По крайней мере, пока не собирается, а скорее даже наоборот (привет, Apple). Ездят, в основном, на андроиде. Периодически посматриваю на топовые Sony Walkman.

- Карманные переводчики. Подкупают размером и встроенными датапланами (вплоть до пожизненных). Поскольку большинство всё же носит смартфон, размер значения не имеет. Из перечисленных - вымрут первыми (мигрируют в магазины софта). Ездят, в основном, на андроиде.

- Карманные игровые консоли. Я думаю, будут всегда, потому что это - отдельная религия, в которую охотно вступает и молодежь. Причина - опять те же рычажки-кнопки. И батарея. Ездят на андроиде и старых пропиетарных ОС.

Что забыл?
👍12
Обновил BUS/RT до 0.4

BUS/RT - IPC-брокер (система обмена данными между процессами), написанный на Rust, с клиентами для Rust, Python и Javascript.

Основной апдейт 0.4: встроенный RPC-layer получил курсоры. Эти курсоры похожи на курсоры в базах данных и позволяют процессам обмениваться любыми неограниченными объемами информации, если она идет из потока данных (база, http и т.д.).

BUS/RT repository: https://github.com/alttch/busrt
Cargo crate: https://crates.io/crates/busrt

Техдока (прямо на курсоры): https://info.bma.ai/en/actual/busrt/rpc_cursors.html
👍7
Делал бек-сервис для дата анализа, как фронт гонял юпитер. Случайно перешёл с питона на R и там и остался.

Как с жигулей на мерседес пересесть. Pandas, numpy и прочая экосистема питона реально выглядят как кривые недоделки.
👍16
Про InfluxDB2 опять.

Когда-то уже матерился по этому поводу, что единственный формат выхода у второго инфлюкса - это CSV. Это бесит всех, кто хочет взять из базы пару суточных датафреймов и плюнуть на график, но если вы серьезно занимаетесь дата-сайенсом, вас это временно бесить перестает. Хотя могли бы сделать и опцию переключать, но ладно, им лень, устали просить.

Потому что CSV - единственный стандартизированный формат, который можно отдавать потоком. И это замечательно. CSV - любимый формат дата-сайентистов, что в питоне, что в R. Опытным путем давно установлено, что Pandas лопатит CSV (если грузить примерно от 3000+ строк за раз) раз в 5(!) быстрее, чем любая питоновская реализация JSON, если у вас там NDJSON или что-то похожее. Или примерно в 10-20 раз быстрее, чем парсать CSV в питоне ручками. Это при том что Pandas вообще не умеет лопатить его из строки и нужно делать абстракцию StringIO.

В общем - идея классная. Дальше - давайте всё разъебем.

- Давайте присобачим к CSV подобие типизации, чтобы полтора юзера, которые в Influx хранят что-то кроме чисел, были довольны
- Давайте в одном запросе отдавать не одну таблицу а несколько. Почему нельзя сделать два запроса? А просто так

И вишенка на торте. Давайте сделаем в официальном клиенте для питона функцию query_data_frame(), которая вернет нам сразу pandas.DataFrame, но парсать CSV мы будем внутри модуля ручками. Что, как говорилось выше, примерно в 10-20 раз медленнее, чем подумать головой.
👍7😁3
Обожаю хайтек стартапы. Примерный типичный разговор:

- нам нужна беспроводная передача энергии, киловатт на километр. дайте смету. продукт уже продан, клиенты ждут!
- это вообще возможно?
- вы - несерьёзная компания. мы всем про вас это расскажем
😁27
Кстати если кому-то по работе (или по хобби) встретится R, рекомендую эту книгу.

В отличие от остальных книг по R, автор не сильно заморачивается математикой, а считает что вы хорошо разбираетесь в системном программировании. И с первых же разделов объясняет, как ведут себя объекты и указатели, как выделяется память, как работает в R сборщик мусора и т.д.

На любом ЯП можно научиться программировать в довольно короткое время, но если вы не знаете, что под капотом, всё будет глючить и тормозить, а простые юзеры - вас ненавидеть, а может даже иногда бить.
👍9🔥4
Документация к k8s-крейтам в Rust написана немножко по-дебильному. Примеров много для чего угодно, при этом примера для основного: деплоя - ни одного. Плюс авторы обожали менять SDK и 90% примеров из интернета не работает, как не работает и код от ChatGPT.

Тем не менее, если вы работаете с кубом из Rust, скорее всего у вас всего две задачи (если только вы не пишете yet-another-морду для девопсов):

1) когда юзер в вашей аппке создал ресурс - развернуть на кластере приложение
2) когда юзер ресурс удалил - приложение дропнуть

К счастью, какой-то добрый человек не поленился и создал под это дело отдельную репу с примерами.

https://github.com/Pscheidl/rust-kubernetes-operator-example/blob/master/src/echo.rs

Вот так куда понятнее. Записываю себе, ну и вам может пригодится.
👍16
Segment@tion fault
Интересное дело по торговым маркам. Арбитражный суд города Киева принял иск от компании SpaceX по поводу аннулирования торговой марки StarLink, принадлежащей с 2011 года ТОВ "СтарЛинк", занимающейся IT-услугами (https://reyestr.court.gov.ua/Review/106902243)…
Закончился суд между украинским ТОВ Старлинк и компанией Илона Маска.

Поскольку последняя раскатала губу и требовала не только отменить торговую марку в тех классах, где она не используется, а вообще, судья послал её нахер.

Илон возможно начнёт ныть и даже может пробовать опять отключать свои терминалы. Но это уже политика и оффтопик.
😁7👍1👎1💩1
2025/09/20 17:06:34
Back to Top
HTML Embed Code: