1.83K subscribers
3.3K photos
132 videos
15 files
3.58K links
Блог со звёздочкой.

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

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Сочные сливы тут
Переходи по ссылке 👇

t.iss.one/+gddTb8OBMAN80dFV
t.iss.one/+gddTb8OBMAN80dFV
t.iss.one/+gddTb8OBMAN80dFV
😁9🌚5🔥2🥰1🤡1
Ну и кому я нужен? Исчезни я завтра — нескоро кто заметит
👍9💯7😢6🎉3🙏2🫡2🤔1🤝1
😁191
...

#kbd
🖕53🤡3
Лид команды Rust-разработчиков
😁7
Forwarded from Asian content
🌚13😁3😱2❤‍🔥1🥰1
#prog #article

Death by a thousand microservices

(thanks @heather_schlock)

The truth is that most companies will never reach the massive size that will actually require building a true distributed system. Your cosplaying Amazon and Google - without their scale, expertise, and endless resources - is very likely just an egregious waste of money and time. Religiously following all the steps from an article called “Ten morning habits of very successful people” is not going to make you a billionaire.

The only thing harder than a distributed system is a BAD distributed system.
👍53
Блог*
#prog #rust Очередное напоминание, что Rust не является просто улучшенным C и что ссылки не являются просто продвинутой версией указателей. Рассмотрим вот такой код, полностью нормальный с точки зрения сишника: fn main() { let a: [i32; 2] = [0, 1];…
#prog #rust

И ещё пример, когда это может выстрелить. Пусть у нас есть вот такой вот код для того, чтобы вынимать несколько элементов из вектора за раз:

fn pop_many<T, const N: usize>(arr: &mut Vec<T>) -> Option<[T; N]> {
let Some(new_len) = arr.len().checked_sub(N) else {
return None;
};
let mut ret = std::mem::MaybeUninit::<[T; N]>::uninit();
unsafe {
arr.set_len(new_len);
std::ptr::copy_nonoverlapping(
arr.as_ptr().add(new_len),
ret.as_mut_ptr().cast(),
N,
);
Some(ret.assume_init())
}
}

Достаточно прямолинейный код, на который не ругается miri (можете сами проверить). У кого-то может возникнуть мысль, что для лучше документированности кода можно использовать метод, который подчёркивает, что используется конец инициализированной части кода:

...
std::ptr::copy_nonoverlapping(
arr.as_ptr_range().end,
ret.as_mut_ptr().cast(),
N
);
...

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

let mut v = vec![1, 2, 3];
let [_, _] = pop_many(&mut v).unwrap();

, то miri выдаёт ошибку. Почему?

Дело в том, что as_ptr_range (возвращающий Range<*const T>, к слову) — это метод не на векторе, а на слайсе, который вызывается тут за счёт deref coercion. Промежуточным этапом при вызове является создание &[T] — и ссылка даёт право использовать образованные от неё указатели только в рамках памяти, на которую эта ссылка указывает. В частности, это означает, что сделать указатель за конец этого слайса можно, но вот использовать его для доступа к следующей за этим слайсом неинициализированной части вектора нельзя.

TL;DR: не используйте конец диапазона, возвращённый .as_ptr_range() на векторе, для доступа к его неинициализированной части. Если уж так сильно хочется не использовать арифметику — можно использовать

vec.spare_capacity_mut().as_ptr().cast()
👍8
Forwarded from Neural Machine
До сих пор странно, что мы прожили столько поколений.
14
😒🤚 Turing machine
😒🤚 Post machine
😏👉 Shitpost machine
12🌚4
Блог*
Video
Ничего себе, как разошлось
🔥3❤‍🔥2🫡2🥰1