Пока выходные, есть время обозреть ReTerminal.
Ембед на удаленке требует не только ноутбук, но и некоторое железо. Ходить в лабу постоянно лениво, да и надоел зоопарк девайсов, поэтому я приобрел себе ReTerminal от Seeed Studio, и весьма им надо сказать доволен.
Итак, за 200 евро вы получаете:
- Raspberry Pi 4 с 5" тач-экраном (720p)
- Офигенского качества корпус, как для такого девайса, с четырьма кнопками на фронте (по-умолчанию A-S-D-F, легко мапить), плюс SLEEP (совершенно дебильный выбор, так как на малине нет понятия слипа и мапить это можно нормально только через танцы с libinput)
- Совершенно отстойный софт с ужасно тормозящим UI - сносить иксы первым делом
- Самое главное - GPIO выведено наружу, для чего собственно мне и нужен постоянно этот девайс - нет проблем как дергать-слушать пины, так и подключать I2C-периферию
- Некоторые другие свистелки (встроенный акселерометр, RTC, датчик освещения, криптопроцессор, управляемые LED-индикаторы), которыми я не пользуюсь.
- Вполне влазит в карман, прикручивается на штатив
- LTS, обещают производить до 2030 года
- Питается от обычного USB
- Есть еще 10"-версия с немного другой периферией - её не щупал
Мои основные задачи - работа с GPIO. При этом на тач выводится weston + интерфейс на егуях, который может что-то отображать и иметь кнопки контрола. Хардварные кнопки маплю тоже на контрол чего-нибудь полезного, в зависимости от задачи. В целом, работать стало быстро и приятно.
К нему же можно докупить за 120 евро расширение под названием E10-1, тут ощущения двойственные:
- Девайс становится довольно большим, в карман уже не влезет, но в небольшую сумку еще можно кинуть. На штативах, впрочем, стоит без проблем
- Требует питание 12V - главный отстой конструкции
- Можно всунуть две 18650 - слегка компенсирует предыдущий пункт и делает девайс автономным, в принципе Pi4 на двух батареях может работать довольно долго. Второй отстой - невозможно посмотреть уровень заряда, контроллер пропиетарный и нет возможности снять даже текущий вольтаж
- Позволяет поставить M2, но только SATA, по сути там USB-мост. Хреново, но лучше чем встроенное eMMC
- Есть разъемы для 4/5G, LoRA, но сами модули нужно покупать отдельно
- Есть RS232 (DP9) и CAN - эти в комплекте и работают. За CAN спасибо, хороший, socketcan его видит.
Вывод после трех месяцев пользования. ReTerminal - однозначно мастхев, E10-1 - 50/50.
Ссылки не даю, в гугле никого надеюсь не забанили.
Ембед на удаленке требует не только ноутбук, но и некоторое железо. Ходить в лабу постоянно лениво, да и надоел зоопарк девайсов, поэтому я приобрел себе ReTerminal от Seeed Studio, и весьма им надо сказать доволен.
Итак, за 200 евро вы получаете:
- Raspberry Pi 4 с 5" тач-экраном (720p)
- Офигенского качества корпус, как для такого девайса, с четырьма кнопками на фронте (по-умолчанию A-S-D-F, легко мапить), плюс SLEEP (совершенно дебильный выбор, так как на малине нет понятия слипа и мапить это можно нормально только через танцы с libinput)
- Совершенно отстойный софт с ужасно тормозящим UI - сносить иксы первым делом
- Самое главное - GPIO выведено наружу, для чего собственно мне и нужен постоянно этот девайс - нет проблем как дергать-слушать пины, так и подключать I2C-периферию
- Некоторые другие свистелки (встроенный акселерометр, RTC, датчик освещения, криптопроцессор, управляемые LED-индикаторы), которыми я не пользуюсь.
- Вполне влазит в карман, прикручивается на штатив
- LTS, обещают производить до 2030 года
- Питается от обычного USB
- Есть еще 10"-версия с немного другой периферией - её не щупал
Мои основные задачи - работа с GPIO. При этом на тач выводится weston + интерфейс на егуях, который может что-то отображать и иметь кнопки контрола. Хардварные кнопки маплю тоже на контрол чего-нибудь полезного, в зависимости от задачи. В целом, работать стало быстро и приятно.
К нему же можно докупить за 120 евро расширение под названием E10-1, тут ощущения двойственные:
- Девайс становится довольно большим, в карман уже не влезет, но в небольшую сумку еще можно кинуть. На штативах, впрочем, стоит без проблем
- Требует питание 12V - главный отстой конструкции
- Можно всунуть две 18650 - слегка компенсирует предыдущий пункт и делает девайс автономным, в принципе Pi4 на двух батареях может работать довольно долго. Второй отстой - невозможно посмотреть уровень заряда, контроллер пропиетарный и нет возможности снять даже текущий вольтаж
- Позволяет поставить M2, но только SATA, по сути там USB-мост. Хреново, но лучше чем встроенное eMMC
- Есть разъемы для 4/5G, LoRA, но сами модули нужно покупать отдельно
- Есть RS232 (DP9) и CAN - эти в комплекте и работают. За CAN спасибо, хороший, socketcan его видит.
Вывод после трех месяцев пользования. ReTerminal - однозначно мастхев, E10-1 - 50/50.
Ссылки не даю, в гугле никого надеюсь не забанили.
👍14🔥4
if let Some(a) = maybe_a && let Some(b) = maybe_b && c > 0 {}
Let-chains стабилизировали, ура. Ждите в новом релизе. Early returns можно будет делать меньше.
🔥38👍10💩1
С платформы мониторинга сотрудников WorkComposer утекли 21 миллион скриншотов, где может быть код, пароли и всякое другое NDA. Галерщики в панике.
https://cybernews.com/security/employee-monitoring-app-leaks-millions-screenshots/
https://cybernews.com/security/employee-monitoring-app-leaks-millions-screenshots/
😁59🔥22👍10
Некоторые особенности WSL, которые как оказалось не знают некоторые коллеги.
- Виндовые диски wsl подключает через plan9. Он достаточно быстрый, чтобы копировать файлы туда-сюда, но очень медленный в плане открытия папок. Соответственно, открывать всякие жс-проекты с node_modules с виндовых дисков - не дай бог. Растовские тоже можно, но неприятно, target dir тоже немаленький. Выносите CARGO_TARGET_DIR в таком случае куда-то в другое место
- wsl весьма отлично открывает виндовые проги, но нужно обязательно дать полное имя с расширением (pwsh.exe). Графические запустятся на текущем десктопе винды, текстовые - прямо в текущем терминале. Соответственно wsl+tmux+pwsh.exe - легко и доступно. Терминал весьма хорош
- Виндовые проги, собранные до определенного WinSDK не могут взять как параметр файл с wsl по его абсолютному пути, но легко открывают по относительному. "Современные" поддерживают оба, например notepad.exe ~/.bashrc
- USB-устройства в wsl пробросить можно через usbipd, этот же способ рекомендует сама M$. К сожалению, только USB2
- После проброса устройств внезапно замечаете, что в wsl нет kernel modules от слова вообще. Решается пересборкой ядра, брать желательно форк от M$.
- В /sys/class/power_supply монтируется виртуальная батарейка (если вы на ноуте или с упсом), которая дублирует основную и прекрасно распознается линуксовым софтом.
- В wsl, как правило не ставят докер - Docker desktop имеет плагин под wsl и линуксовая команда docker начинает видеть десктопный, как родной. В том числе docker engine доступен через "unix socket". Про Docker desktop - отдельная тема, написан он через жопу. Но в целом работает.
- В "wsl" довольно своеобразный wayland compositor, который может валить некоторый софт, но Х-сервер вполне вменяемый. unset WAYLAND_DISPLAY спасает ситуацию. Кто виноват, софт или майкрософт - вопрос дискуссионный.
- Виндовые диски wsl подключает через plan9. Он достаточно быстрый, чтобы копировать файлы туда-сюда, но очень медленный в плане открытия папок. Соответственно, открывать всякие жс-проекты с node_modules с виндовых дисков - не дай бог. Растовские тоже можно, но неприятно, target dir тоже немаленький. Выносите CARGO_TARGET_DIR в таком случае куда-то в другое место
- wsl весьма отлично открывает виндовые проги, но нужно обязательно дать полное имя с расширением (pwsh.exe). Графические запустятся на текущем десктопе винды, текстовые - прямо в текущем терминале. Соответственно wsl+tmux+pwsh.exe - легко и доступно. Терминал весьма хорош
- Виндовые проги, собранные до определенного WinSDK не могут взять как параметр файл с wsl по его абсолютному пути, но легко открывают по относительному. "Современные" поддерживают оба, например notepad.exe ~/.bashrc
- USB-устройства в wsl пробросить можно через usbipd, этот же способ рекомендует сама M$. К сожалению, только USB2
- После проброса устройств внезапно замечаете, что в wsl нет kernel modules от слова вообще. Решается пересборкой ядра, брать желательно форк от M$.
- В /sys/class/power_supply монтируется виртуальная батарейка (если вы на ноуте или с упсом), которая дублирует основную и прекрасно распознается линуксовым софтом.
- В wsl, как правило не ставят докер - Docker desktop имеет плагин под wsl и линуксовая команда docker начинает видеть десктопный, как родной. В том числе docker engine доступен через "unix socket". Про Docker desktop - отдельная тема, написан он через жопу. Но в целом работает.
- В "wsl" довольно своеобразный wayland compositor, который может валить некоторый софт, но Х-сервер вполне вменяемый. unset WAYLAND_DISPLAY спасает ситуацию. Кто виноват, софт или майкрософт - вопрос дискуссионный.
👍25🔥9😁2💩1
Только меня бесят форматы даты в современных тулзах?
- когда был залит этот коммит?
- ну когда. 2 days 4 hours ago!
- когда было это сообщение в логе?
- что не понятно? 1 month ago (примерно)!
Понабирали веб-макак из соцсетей по объявлениям.
- когда был залит этот коммит?
- ну когда. 2 days 4 hours ago!
- когда было это сообщение в логе?
- что не понятно? 1 month ago (примерно)!
Понабирали веб-макак из соцсетей по объявлениям.
👍66😁51🔥12
А вы пользуетесь passkey? Напрягает что его очень аргессивно пиарят, многие чуть ли не как дефолтную авторизацию.
Вообще удивительно как люди десятилетиями ныли, что онлайн пассворд-менеджеры - зло, при этом легко отдают ключиот задницы корпорациям.
Вообще удивительно как люди десятилетиями ныли, что онлайн пассворд-менеджеры - зло, при этом легко отдают ключи
👍23
Предполагаю что вторая жизнь CLI в последние 10-15 лет связана не только с CI/CD и автоматизацией процессов, но и с развитием мессенджеров .
Куда проще дать человеку не в теме скопировать в терминал пару команд, чем объяснять куда нажать мышкой и что там выбрать и что опять нажать.
Куда проще дать человеку не в теме скопировать в терминал пару команд, чем объяснять куда нажать мышкой и что там выбрать и что опять нажать.
👍37🔥5😁2💩1
Срачи в комментариях к предыдущему посту напомнили мне что я забыл порекомендовать NAPS2 - пожалуй самую удобную программу для сканирования документов (с классических сканеров а не этим вашим телефоном). Благодаря ей я стал ненавидеть сканировать бумагу чуть меньше, чем до знакомства.
Есть под все платформы, опенсорц, имеется как удобный CLI, так и удобный гуй. Каких вам реформ еще не хватает?
Есть под все платформы, опенсорц, имеется как удобный CLI, так и удобный гуй. Каких вам реформ еще не хватает?
👍18
Новый крейт для Rust в рамках проекта RoboPLC. Изначально хотели сделать ladder logic. Типа стандартно, понятно и привычно. Но есть проблема: что-то большое программировать - ад. Клиенты сразу заявили, что ladder logic пишите сами. Зато смотреть будут с удовольствием.
С текстовыми ЯП проблема другая - оно работает, но чёрный ящик. Визуально состояние логики не посмотреть и не показать, если только специально постараться.
Остановились на компромиссе - процесинг логики монадами-комбинаторами, но есть нюанс. Если запись включена - все состояние будет записываться, после чего снапшот можно посмотреть в интерфейсе или вставить в свой. В последний момент вставили ещё OR на два элемента, по просьбе товарищей.
Так родился Logic Line. Уже стабильно, можно пользоваться. В RoboPLC последней версии или отдельно.
https://github.com/roboplc/logicline
С текстовыми ЯП проблема другая - оно работает, но чёрный ящик. Визуально состояние логики не посмотреть и не показать, если только специально постараться.
Остановились на компромиссе - процесинг логики монадами-комбинаторами, но есть нюанс. Если запись включена - все состояние будет записываться, после чего снапшот можно посмотреть в интерфейсе или вставить в свой. В последний момент вставили ещё OR на два элемента, по просьбе товарищей.
Так родился Logic Line. Уже стабильно, можно пользоваться. В RoboPLC последней версии или отдельно.
https://github.com/roboplc/logicline
👍10🔥7
ChatGPT проиграл в шахматы ретро-консоли 1977 года, у которой всего 128 байт оперативной памяти. Старая Atari оказалась умнее нейронки даже на сложности для новичков. Чат-бот путал фигуры, забывал расстановку и жаловался на непонятную форму фигур.
😁61👍6🔥3👎2
К предыдущей новости, консоль называлась Atari 2600. Характеристики: одноядерный 8-bit cpu на 1.19Mhz (MOS 6507, 56 инструкций), 128 байт (не килобайт) памяти. Сам код игр находился в ROM-картриджах, как и на уже более "современных" приставках.
Кроме успехов в шахматах, благодаря именно этой модели мир познакомился с Pacman.
Кроме успехов в шахматах, благодаря именно этой модели мир познакомился с Pacman.
🔥20👍6😁1
Борьба с лайфтаймами головного мозга. Когда авторы крейтов в своем API разрешают загнать borrowed и только исключительно borrowed, а у вас начинаются большие проблемы (привет sqlx в первую очередь). Disclaimer: делать только в самом крайнем случае.
Если функция создает value динамически (например через внешнее API), при попытке загнать его в такой крейт-API, получаем ошибку "returns a value referencing data owned by the current function". Растовский borrow-checker не умеет сам разбираться с подобным и вернуть оба значения мы не можем. Тем более API получает указатель на стек, а стек заканчивается вместе с функцией. Решение в любом системном ЯП - загнать данные в кучу.
Итак, у вас есть некоторое крейт-API, которое внутри выглядит так:
И вот это с ним конечно работать не будет
Тут нам поможет Box::leak, который позволяет "забыть" данные в куче, или по растовской семантике сделать их static:
Если ваша программа вызывает метод "create" предсказуемое количество раз - на этом можно остановиться. Но если процесс динамический, придётся самим дропнуть память на куче, когда данные уже не нужны. Для этого создадим враппер-структуру и будем возвращать данные в ней:
Не забываем освободить память на куче в дестракторе.
Авторам же таких API предлагаю открыть для себя COW.
Если функция создает value динамически (например через внешнее API), при попытке загнать его в такой крейт-API, получаем ошибку "returns a value referencing data owned by the current function". Растовский borrow-checker не умеет сам разбираться с подобным и вернуть оба значения мы не можем. Тем более API получает указатель на стек, а стек заканчивается вместе с функцией. Решение в любом системном ЯП - загнать данные в кучу.
Итак, у вас есть некоторое крейт-API, которое внутри выглядит так:
mod shitapi {
pub struct Shit<'a> {
greeting: &'a str,
}
impl<'a> Shit<'a> {
pub fn new(greeting: &'a str) -> Self {
Self { greeting }
}
}
}
И вот это с ним конечно работать не будет
fn create(name: &str) -> shitapi::Shit<'_> {
let greeting = format!("hello {name}");
shitapi::Shit::new(&greeting)
}
Тут нам поможет Box::leak, который позволяет "забыть" данные в куче, или по растовской семантике сделать их static:
fn create(name: &str) -> shitapi::Shit<'static> {
let greeting: &'static str = Box::leak(Box::new(format!("hello {name}")));
shitapi::Shit::new(&greeting)
}
Если ваша программа вызывает метод "create" предсказуемое количество раз - на этом можно остановиться. Но если процесс динамический, придётся самим дропнуть память на куче, когда данные уже не нужны. Для этого создадим враппер-структуру и будем возвращать данные в ней:
struct ShitWrapper {
shit: shitapi::Shit<'static>,
source_s: &'static str,
}
fn create(name: &str) -> ShitWrapper {
let greeting: &'static str = Box::leak(Box::new(format!("hello {name}")));
ShitWrapper {
shit: shitapi::Shit::new(&greeting),
source_s: greeting,
}
}
Не забываем освободить память на куче в дестракторе.
impl Drop for ShitWrapper {
fn drop(&mut self) {
let _ = unsafe { Box::from_raw(self.source_s as *const str as *mut str) };
}
}
Авторам же таких API предлагаю открыть для себя COW.
👍26💩13😁4
This media is not supported in your browser
VIEW IN TELEGRAM
Это я, сижу жду когда ИИ меня наконец заменит на работе
😁82👍10🔥3