1.83K subscribers
3.24K photos
127 videos
15 files
3.52K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Forwarded from Dr. Friedrich von Never
Сегодня мне приснилось, как я дебажу кота. Он почему-то завис на инициализации, и мне пришлось разбираться, в чём проблема. Оказалось — дедлок где-то в конфигурации DI-контейнера. Зачем в коте был DI-контейнер — блин, не знаю. Но кот был на сишарпе написан!
Блог*
#prog #quotes Очередной пример того, что программирование необратимо калечит ум
Я понял, что я слишком программист, когда слегка завис на пункте в контекстном меню Яндекс.Браузера "Копировать адрес ссылки"
#prog #article

И, раз уж пошло такое дело, #blogrecommendation, у автора талант находить интересные вещи.
Forwarded from Generative Anton
Очень забавная история про ботнет Cereals, который ломал NAS и NVR D-Link.

Сейчас он уже почти прекратил своё существование, но интересна основная цель этого ботнета. Он не занимался DDOS'ом, кражей пользовательских данных или чем-то ещё. Он просто и методично скачивал аниме на dedicated-сервера.

— Какова моя цель, создатель? Украсть ключи от ядерного оружия? Взломать банковские счета или крипто-биржи?
— Нууууу, как тебе сказать...
— Почему ты считаешь, что Go популярен только из-за пиара Google?
— Ну даже не знаю
Как совершенно верно заметил @optozorax, на канале 100π подписчиков. Тоже в каком-то смысле круглое число
#prog #rust

Хозяйке на заметку

Если вы когда-нибудь писали на Rust какую-нибудь рекурсивную структуру, то у вас там наверняка было поле вроде Option<Box<Self>> или Option<Rc<Self>>. Для обхода подобной структуры требуется получить ссылку из поля такого типа. В принципе, можно писать что-то вроде

if let Some(relative) = &self.relative {
// здесь можно работать с relative как с &Self благодаря deref coercion
}

, но если по каким-то причинам требуется Option<&Self>, то это уже не сработает из-за несовпадения типов. Приведение типов в подобной ситуации выглядит как field.as_ref().map(<_>::deref), или того хуже, field.as_ref().map(|x| &**x). Как я недавно с некоторым удивлением для себя обнаружил, это достаточно распространённый паттерн, чтобы для него были отдельные методы: Option::as_deref и Option::as_deref_mut. Что они делают — очевидно по типам:
fn as_deref(&self) -> Option<&<T as Deref>::Target>;
fn as_deref_mut(&mut self) -> Option<&mut <T as Deref>::Target>;

Есть резон не использовать эти методы? Если у вас стоит задача поддерживать старые версии rustc, то да, есть: эти методы были добавлены в Rust 1.40.0 (видимо, по этой причине я раньше про них и не знал). Конечно, ничто не мешает написать extension trait для добавления этих методов, только имейте в виду: если одно и то же выражение может быть как вызовом собственного метода типа, так и вызовом метода трейта, то предпочтение всегда отдаётся собственному методу типа.
#prog #c #cpp #article

Так как регулярно возникает странное мнение, что UB — это не страшно, вот статья с примером, как UB может привести к вызову никогда не вызываемой функции. Old but gold, как говорится.

https://kristerw.blogspot.com/2017/09/why-undefined-behavior-may-call-never.html
Forwarded from codingteam@cjr
Minoru
о! Кстати! В продолжение дискуссии про макру python!, встраивающую Python в Rust: это же фактически реализация принципа «язык под задачу». Просто выбираешь, что тебе удобнее написать на Rust, а что на Python…