Telegram Web Link
В шиндовс интересно ведут себя активные бинарники, которые перезаписал. Если в линуксе вам обычно ответят "file is busy", шиндовс позволяет файл перезаписать, а оригинальный оставляет работать, но кидает в корзину со страшным именем.

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

В любом расследовании главное не выйти на самого себя.
when you don't know physics, the world is full of magic
Заметил, что винда отлично спасает от выгорания.

Лишний раз комп включать не хочется.
ChatGPT отупел окончательно.

Есть такой давний крейт axum-server-dual-protocol - умеет слушать сразу и http и https и если надо, редиректить первое на второе. Удобно, если у вас все равно нестандартный порт у приложения.

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

Я уже серьёзно подумываю отменить подписку. Игрушка стала бесполезной. Кто там говорил, как ИИ убьёт всех программеров - подождите ещё лет 50.
Иногда, не имея overload функций, названия в foreign API в Расте получаются довольно забавные.

Как тебе такое, Java?
Когда долго играл в Rust, иногда вылазит боком
Некоторые наблюдения современного шиндовса 11

- в WSL2 совершенно кривой wayland, если работаете с гуем, лучше его вырубите. WAYLAND_DISPLAY="" спасает ситуацию

- кто-то совершенно упоротый упростил CPU profiles до примитива, теперь шиндовс по каким-то своим правилам, в зависимости от железа, решает с какой частотой должны работать ядра (ну или вы через API). но если хотите обычный нормальный Processor performance boost mode control в Power options, то его можно и включить:

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\54533251-82be-4824-96c1-47b60b740d00\be337238-0d82-4146-a960-4f3749d470c7" -Name "Attributes" -Value 2


Недокументированные возможности и страшные ключи. Как я от этого отвык. Шиндовс - система не для простого юзера.
жиза
В Rust есть такая функция std::env::current_exe(), которая возвращает вам имя текущего исполняемого файла. Например "/bin/my". Но если файл был удален или заменен другим, значение будет "/bin/my (deleted)".

Почему? Rust тут ни при чем. Хотя частично и при чем - один из способов выяснения полного пути к текущему файлу - это определить его абсолютный путь из args[0] при запуске, либо приклеить к нему текущую папку вручную. Но поскольку в Rust рантайм минимальный - он резолвит путь файла программы в момент запроса, используя ссылку /proc/self/exe.

Которая и меняется "волшебным" образом с "/my/file" на "/my/file (deleted)", как только инода исполняемого файла помечается как удаленная (тоесть cp -f и mv тоже считаются). Почему так? В ядре любят этот суффикс исторически, чуть позже он перекочевал без изменений в пути cgroups. Считается, что это более безопасно, ядро ОС каким-то образом хочет передать вам информацию об изменении, но много вариантов у него нет.

"Фичу" следует учитывать если вы делаете продукт, который например апдейтит сам себя. Заодно она помогает от и мамкиных хакеров, у которых самообновляющиеся руткиты начинают глючить в самый неподходящий момент.

p.s. В случае если каким-то непонятным образом в системе уже есть файл "/bin/my (deleted)" поведение линка в procfs станет непредсказуемым - указывать он будет якобы на существующий, но при open по ссылке там будет находиться ваш удаленный бинарник. Вот такие чудеса.
MS Copilot не умеет распознавать лица исторических личностей. Он бы может и мог, но при заливке фото другой ИИ находит и замазывает лицо, поэтому первому остаётся только догадываться.

Война ИИ в прямом эфире.
жиза
Ученые: квантовые компьютеры перевернут мир!
Айтишники:

https://80.lv/articles/doom-can-now-run-on-quantum-computers/
use std::os::unix::net::UnixDatagram;

fn main() {
let sock = UnixDatagram::bind("./sock").unwrap();
let addr = sock.local_addr().unwrap();

sock.connect_addr(&addr).unwrap();
sock.send(b"test").unwrap();
sock.recv(&mut [0; 4]).unwrap();
}


I expected to see this happen: no crash of the operating system

Instead, this happened: macOS 15.0.1 crashed


https://github.com/rust-lang/rust/issues/131374

Ставьте шиндовс!
Некоторые опции и фичи git, которыми я пользуюсь и про которые почему-то мало знают:

rerere.enabled = true - если вы один раз решили мерж-конфликты, а потом что-то пошло не так и вы отменили мерж, при повторе операции гит порешает известное сам.

pull.rebase = true - ненавижу merge при pull. эта опция говорит гиту перенести ваши новые коммиты выше тех, что приехали и история остается красивой.

ну и конечно git push --force-with-lease - если уже делаете force push, это не даст вам затереть изменения коллег.
В современном эмбеде HDMI out встретишь чаще, чем uart на консоль, поэтому такие штуки must have. Эмулирует монитор, на другой стороне видно как обычный usb video device, так что картинку смотреть можно чем угодно.

Конкретные модели не даю, так как не реклама. От 15$ примерно все работают нормально.
Embed-клава с тачпадом к вчерашнему "монитору". Из минусов - свисток легко потерять, я бы предпочёл wired. Но вариантов, которые влазят в карман, не так много.

(это на говноклава для мобил с блютусами, а нормальное usb)
Как-то мимо меня вышла в этом году Operation Galuga (да, лично от легендарной Konami). По сути римейк классической контры NES, но с более расширенным функционалом. И на фоне валят оригинальные треки в современных ремиксах.

Дидам играть всем, взять валокардин, чтоб не сильно ностальгировать о лихих 90х, когда еще всё мог.

Еще выпустите римейк Hard Corps и можно помирать.
"but it works on my computer!"
При использовании асинхронного кода, необходимо всегда помнить про синхронную нагрузку и запускать такие задачи в отдельных потоках, чтобы не блокировать async runtime. Особенно это важно при разработке real-time приложений, где блокировка рантайма уже на пару миллисекунд может сломать всю вашу low-latency конструкцию.

Кроме традиционных синхронных задач (шифрование, сериализация, компрессия и т.д.) часто забывается, что malloc - тоже очень неприятная штука. Например, 10 мегабайт на вектор может выделяться до пары миллисекунд на приличном процессоре уровня AMD 5950X, ембед же уровня Cortex A-72 может на таком застрять и на 10ms. В случае невозможности использования re-use буфера (например он уже пошел отправляться клиентам, а мы читаем следующий), аллокацию памяти необходимо выносить в синхронные задачи.

В последней BUS/RT мы добавили брокеру опцию direct_alloc_limit, позволяющую вынести аллокации выше лимита (это делается, когда sender прислал большой блок данных) на отдельный вспомогательный аллокатор. Который, в зависимости от структуры проекта, может просто создавать векторы в spawn_blocking, либо общаться с отдельным, отвечающим за это потоком, который находится на отдельной группе CPU. Также, аллокатор может вообще запретить выделение блока, руководствуясь собственной логикой относительно идентификатора клиента, либо общей.

Таким образом, в нашем IPC-брокере появилась крутая возможность безопасно совмещать low-latency (<100us) клиентов с high-load, читающими гигабайты из баз. В одной системе и без ущерба друг для друга.
2025/07/01 06:16:44
Back to Top
HTML Embed Code: