#prog #rust #rustreleasenotes
Вышла версия Rust 1.93.0! Как обычно, тут только избранное, остальное только в детальных заметках о релизе.
(да, я выкладываю анонс с опозданием больше недели, и что ты мне сделаешь?)
В этот раз большинство изменений связаны со стандартной библиотекой.
▪️Немного печальное изменение: даже с установлением
▪️Компилятор теперь выдаёт предупреждение на #[repr(C)]-перечисления, у которых значения дискриминантов не умещаются в сишный int. Смешно, но до C23 у сишных
▪️Компилятор теперь выдаёт предупреждение на попытку вызвать метод на const-значении, который эксплуатирует внутреннюю изменяемость. Так как константы инлайнятся по месту использования, эти изменения не будут видны. Обычно это является следствием ошибки — использования
▪️Метод
▪️Стабилизированы API:
🔸assume_init_drop, assume_init_ref и assume_init_mut на
🔸
🔸
🔸методы для непроверяемых (и потому потенциально дающих UB) битовых сдвигов в обе стороны на примитивных числах, а на знаковых — ещё и unchecked_neg
🔸методы для перевода ссылок на слайсы в (опциональные, разумеется) ссылки на массивы и сырых указателей на слайсы в сырые указатели на массивы, включая мутабельные варианты
🔸pop_front_if и pop_back_if на
🔸std::fmt::from_fn для ad-hoc форматирования через переданную функцию. Позволяет избежать создания одноразовых типов, нужных только для форматирования
▪️Cargo теперь прокидывает значение конфигурации debug_assertions в билд-скрипты.
▪️Команда
▪️
Вышла версия Rust 1.93.0! Как обычно, тут только избранное, остальное только в детальных заметках о релизе.
(да, я выкладываю анонс с опозданием больше недели, и что ты мне сделаешь?)
В этот раз большинство изменений связаны со стандартной библиотекой.
▪️Немного печальное изменение: даже с установлением
#[global_allocator] std всё ещё может вызывать System аллокатор. По крайней мере, на core это не распространяется.▪️Компилятор теперь выдаёт предупреждение на #[repr(C)]-перечисления, у которых значения дискриминантов не умещаются в сишный int. Смешно, но до C23 у сишных
enum нельзя было указать численный тип и нельзя было использовать значения больше int для дискриминантов.▪️Компилятор теперь выдаёт предупреждение на попытку вызвать метод на const-значении, который эксплуатирует внутреннюю изменяемость. Так как константы инлайнятся по месту использования, эти изменения не будут видны. Обычно это является следствием ошибки — использования
const вместо static (и я, кстати, такую ошибку уже делал).▪️Метод
append на BTreeSet и BTreeMap теперь сохраняет ключ из исходной коллекции, если ключи считаются равными через ==. До этого перезаписывались и ключ, и значение.▪️Стабилизированы API:
🔸assume_init_drop, assume_init_ref и assume_init_mut на
MaybeUninit<T>🔸
write_{copy, clone}_of_slice на [MaybeUninit<T>]🔸
into_raw_parts на String и на Vec. Странно, что только сейчас, потому что обратные from_raw_parts методы были стабилизированы ещё в версии 1.0.🔸методы для непроверяемых (и потому потенциально дающих UB) битовых сдвигов в обе стороны на примитивных числах, а на знаковых — ещё и unchecked_neg
🔸методы для перевода ссылок на слайсы в (опциональные, разумеется) ссылки на массивы и сырых указателей на слайсы в сырые указатели на массивы, включая мутабельные варианты
🔸pop_front_if и pop_back_if на
VecDeque🔸std::fmt::from_fn для ad-hoc форматирования через переданную функцию. Позволяет избежать создания одноразовых типов, нужных только для форматирования
▪️Cargo теперь прокидывает значение конфигурации debug_assertions в билд-скрипты.
▪️Команда
cargo tree теперь позволяет использовать для форматирования записей в дереве длинные имена для элементов шаблонов. Например, следующие два вызова эквивалентны:cargo tree --format='{p} {f}'cargo tree --format='{package} {features}'▪️
cargo clean теперь может удалять артефакты компиляции из всего workspace-а целиком.👍7😁1
Forwarded from Немного туп(л,) (Пашечка)
#achievement unlocked: Чихнув прокусить язык до крови.
🥴14😱7👍2🎉2
Forwarded from Kedr to Earth | Земля, я Кедр (✅ Yuri Ammosov)
Коллеги! Прошу коллективный разум совета по дальнейшему prompt injection.
😁23😍4
#prog #suckassstory
So much for "plain text" API
Source
(thanks @itpgchannel)
So much for "plain text" API
PSA: Did you know that it’s unsafe to put code diffs into your commit messages?
Like https://github.com/i3/i3/pull/6564 for example
Such diffs will be applied by patch(1) (also git-am(1)) as part of the code change!
This is how a sleep(1) made it into i3 4.25-2 in Debian unstable
Source
(thanks @itpgchannel)
😁11🌚3
Какой симпатичный... Павел
( @PaRat07 , накрасила @gothic_nerd )
Начать новую рубрику про папищеков? #прекрасныепапищеки, во
🥰33🤮26💩12🤡9❤🔥7😍6👎4🥴2
Forwarded from Технологический Болт Генона
Discord: с марта все аккаунты в мире автоматически сделают «детскими», пока пользователи не подтвердят возраст
https://habr.com/ru/news/994528/
С начала марта 2026 года все аккаунты пользователей в мире автоматически сделают «детскими», пока их пользователи не подтвердят свой возраст. Без подтверждения нельзя заходить на сервера 18+, а если пользователь уже состоит в таких серверах, доступ к ним заблокируют. Личные сообщения для незнакомых пользователей также будут закрыты. Подтвердить свой возраст можно только паспортом и видеосканом лица, причём других способов получения доступа к информации 18+ не будет.
Без подтверждения возраста на платформе также нельзя будет смотреть большинство контента — он будет скрыт цензурой.
Что будет закрыто/ограничено на Discord для «детских» аккаунтов:
- фильтрация чувствительного контента: графические или «взрослые» материалы по умолчанию размываются, пока пользователь не подтвердит, что он взрослый;
- ограниченный доступ к возрастным чатам/сервером — доступ к серверам/командам, помеченным как для взрослых, возможен только после подтверждения возраста;
- личные сообщения в отдельный запрос‑ящик — сообщения от людей, которых вы не знаете, по умолчанию идут не в основной чат, а в отдельную папку;
- предупреждения при запросах дружбы — если кто‑то, кто вам не знаком, отправляет запрос, вы получите предупреждение;
- ограничения на «Stage» каналы — говорить в комнатах Stage могут пользователи, которые подтвердили, что они взрослые.
Оригинал
Discord Launches Teen-by-Default Settings Globally
https://discord.com/press-releases/discord-launches-teen-by-default-settings-globally
База паспортов и лиц точно никуда не утечёт.
https://habr.com/ru/news/994528/
С начала марта 2026 года все аккаунты пользователей в мире автоматически сделают «детскими», пока их пользователи не подтвердят свой возраст. Без подтверждения нельзя заходить на сервера 18+, а если пользователь уже состоит в таких серверах, доступ к ним заблокируют. Личные сообщения для незнакомых пользователей также будут закрыты. Подтвердить свой возраст можно только паспортом и видеосканом лица, причём других способов получения доступа к информации 18+ не будет.
Без подтверждения возраста на платформе также нельзя будет смотреть большинство контента — он будет скрыт цензурой.
Что будет закрыто/ограничено на Discord для «детских» аккаунтов:
- фильтрация чувствительного контента: графические или «взрослые» материалы по умолчанию размываются, пока пользователь не подтвердит, что он взрослый;
- ограниченный доступ к возрастным чатам/сервером — доступ к серверам/командам, помеченным как для взрослых, возможен только после подтверждения возраста;
- личные сообщения в отдельный запрос‑ящик — сообщения от людей, которых вы не знаете, по умолчанию идут не в основной чат, а в отдельную папку;
- предупреждения при запросах дружбы — если кто‑то, кто вам не знаком, отправляет запрос, вы получите предупреждение;
- ограничения на «Stage» каналы — говорить в комнатах Stage могут пользователи, которые подтвердили, что они взрослые.
Оригинал
Discord Launches Teen-by-Default Settings Globally
https://discord.com/press-releases/discord-launches-teen-by-default-settings-globally
База паспортов и лиц точно никуда не утечёт.
🤬23🤡6🤔4👍1
#prog #моё
У метода Iterator::all — который возвращает, удовлетворяют ли все элементы в итераторе переданному предикату — есть вот такая строчка в документации:
Более того, аналогичное утверждение есть и в документации метода allMatch на Java Stream API, и в документации встроенной функции all в Python, и в документации IEnumerable.All в C#. Некоторые странные люди утверждают, что
Я здесь для того, чтобы сказать, что эти люди неправы.
Условный
как
Или, иными словами и в синтаксисе Rust, если
Это свойство должно работать для любых последовательностей, включая пустые. С другой стороны, любую последовательность можно представить, как конкатенацию этой же последовательности с пустой. Или, в синтаксисе Rust, с поправкой на типы
Аналогичные соображения показывают, почему
У метода Iterator::all — который возвращает, удовлетворяют ли все элементы в итераторе переданному предикату — есть вот такая строчка в документации:
An empty iterator returns true.
Более того, аналогичное утверждение есть и в документации метода allMatch на Java Stream API, и в документации встроенной функции all в Python, и в документации IEnumerable.All в C#. Некоторые странные люди утверждают, что
all на пустой последовательности должен возвращать false — дескать, нет значений — не возможности определить значения.Я здесь для того, чтобы сказать, что эти люди неправы.
Условный
all(seq, pred), где seq — это последовательность a1, a2, ..., an, вычисляет значение pred(a1)∧ pred(a2) ∧ ... ∧ pred(an) (∧ — символ коньюкции, который в ЯП часто называют &&). Коньюкция — операция коммутативная и ассоциативная, поэтому если последовательность s является конкатенацией последовательностей a = a1, a2, ..., an и b = b1, b2, ..., bn, то мы можем переставить скобки и посчитатьall(s, pred) = pred(a1) ∧ ... pred(an) ∧ pred(b1) ∧ ... ∧ pred(bn)как
(pred(a1) ∧ ... pred(an)) ∧ (pred(b1) ∧ ... ∧ pred(bn)) = all(a, pred) ∧ all(b, pred)Или, иными словами и в синтаксисе Rust, если
x и y — итераторы, то логично ожидать, что x.chain(y).all(p) вернёт тот же результат, что и x.all(p) && y.all(p).Это свойство должно работать для любых последовательностей, включая пустые. С другой стороны, любую последовательность можно представить, как конкатенацию этой же последовательности с пустой. Или, в синтаксисе Rust, с поправкой на типы
x и x.chain(iter::empty()) ведут себя одинаково. Подставив это в свойство выше, мы получаем, что x.all(p) && iter::empty().all(p), x.chain(iter::empty()).all(p) и x.all(p) должны возвращать один и тот же результат. Для произвольного итератора x это возможно только в том случае, если iter::empty().all(p) возвращает значений, нейтральное для коньюкции, то есть true. Иными словами, Iterator::all должен возвращать true на пустом итераторе, ч. и т. д.Аналогичные соображения показывают, почему
Iterator::any должен возвращать false.💯26🤝10❤🔥3🤡2