#prog #rust #article
The borrowchecker is what I like the least about Rust
Не со всем согласен, но большинство аргументов здравые.
The borrowchecker is what I like the least about Rust
Не со всем согласен, но большинство аргументов здравые.
In this post, I want to make two arguments:
1. That the borrowchecker causes serious ergonomic problems for Rust.
2. That the role of the borrowchecker in Rust's safety is overstated.
Perversely, because Rust's lifetime riddles are challenging, they are sort of fun. I believe that partly explains why so many people don't seem to mind them. Instead of thinking about how to write my code to solve the scientific problems I'm being paid to solve, I have to think about how to write it to please the borrowchecker. The latter is usually more tractable, limited in scope, have clearer requirements and is more 'puzzle-like'. In that sense, Rust enables escapism: When writing Rust, you get to solve lots of 'problems' - not real problems, mind you, but fun problems.
👍10🤡5👎1😐1
Технологический Болт Генона
Достижение выполнения кода при контроле над текстом комментария в Python-скрипте https://www.opennet.ru/opennews/art.shtml?num=63669 Участники могли отправить сетевой запрос к Python-скрипту, который создавал новый Python-скрипт cо случайными именем, добавлял…
#prog #itsec #python
В конце мне не нравится, что автор поёт дифирамбы ИИ. Ну и ещё у него есть функция
Это явно можно написать одновременно эффективнее и проще для восприятия:
В конце мне не нравится, что автор поёт дифирамбы ИИ. Ну и ещё у него есть функция
ascii_safe
, которая написана просто ужасно:def ascii_safe(x: int) -> bool:
"""True if all four bytes have high bit clear."""
return all(((x >> (8 * i)) & 0x80) == 0 for i in range(4))
Это явно можно написать одновременно эффективнее и проще для восприятия:
def ascii_safe(x: int) -> bool
return x & 0x80808080 == 0
💯13🤡5
Блог*
#prog #article #amazingopensource Jujutsu (jj) — система контроля версий, которая концептуально проще git и при этом мощнее. Неплохой (но местами устаревший) обзор Jujutsu — jj init — сделал Chris Krycho. Также есть пока что неполный туториал от Стива Клабника…
#prog
Чел делится впечатлениями от jj.
t.me/paniccode/45
Чел делится впечатлениями от jj.
jj крута
Посидел я наjj
где-то месяц, и... это офигенно.
Т.е. у меня по большей части не обычный "гит воркфлоу", где делаешь фичу, мержишь, делаешь новую, а эдакий стейт "тещу 20 фичей какая заработает"
И jj для этого идеален
t.me/paniccode/45
👍7🤡6💯3❤2🔥1
#prog #abnormalprogramming #db #article
Making Postgres 42,000x slower because I am unemployed
(thanks @nosingularity)
Making Postgres 42,000x slower because I am unemployed
<...> I decided someone needed to try to create a Postgres configuration optimized to process queries as slowly as possible. Why? I am not sure, <...>
I can’t make this too easy. This is a Postgres tuning challenge, not a throttle-your-CPU-to-one-megahertz-and-delete-indexes challenge, so all changes must be on parameters in postgresql.conf. Additionally, the database will still need to have the capability to process at least one transaction within a reasonable amount of time—it would be too simple just to grind Postgres to a halt.
(thanks @nosingularity)
🌚7
#prog #rust #rustreleasenotes
Вышла версия Rust 1.89.0! Как всегда, тут только избранные части, остальное — в детальных заметках о релизе.
▪️Стабилизировали вывод const generics в выражениях!
К сожалению, использовать
▪️Док-тесты теперь запускаются при кросс-компиляции.
▪️Атрибуты вида
▪️После фиксов для согласования с существующими компиляторами C/C++ теперь можно использовать
▪️Как я уже писал, продление времени жизни временных значений теперь работает и с кортежными конструкторами (кортежных структур и кортежных вариантов
▪️Стабилизированы интринсики (и связанные с ними target feature [1], [2]) из наборов инструкций AVX512, SHA512, SM3 и SM4 для x86-64.
▪️Макро-фрагмент в декларативных макросах без указанного типа теперь является ошибкой компиляции на всех edition.
▪️Результат вычисления format_args! теперь можно сохранять в переменных!🎉
▪️
▪️
▪️К слову о локах, для
▪️
Вышла версия Rust 1.89.0! Как всегда, тут только избранные части, остальное — в детальных заметках о релизе.
▪️Стабилизировали вывод const generics в выражениях!
pub fn all_false<const LEN: usize>() -> [bool; LEN] {
[false; _]
}
К сожалению, использовать
_
для const generics в сигнатурах всё ещё нельзя.▪️Док-тесты теперь запускаются при кросс-компиляции.
▪️Атрибуты вида
#![doc(test(attr(..)))]
(которые добавляют #[attr(..)] ко всем док-тестам в модуле) теперь можно использовать везде, включая корень крейта.▪️После фиксов для согласования с существующими компиляторами C/C++ теперь можно использовать
i128
и u128
в extern "C"
определениях, интероп корректно работает и, как следствие, improper_ctypes_definitions
более не триггерится.▪️Как я уже писал, продление времени жизни временных значений теперь работает и с кортежными конструкторами (кортежных структур и кортежных вариантов
enum
-ов).▪️Стабилизированы интринсики (и связанные с ними target feature [1], [2]) из наборов инструкций AVX512, SHA512, SM3 и SM4 для x86-64.
▪️Макро-фрагмент в декларативных макросах без указанного типа теперь является ошибкой компиляции на всех edition.
▪️Результат вычисления format_args! теперь можно сохранять в переменных!
▪️
std::array::IntoIter
теперь реализовывает Default. Значение по умолчанию при этом является итератором, который ничего не возвращает. Полезно, когда нужно предоставить итерацию по опциональному массиву и при этом не хочется прокидывать Option
в возвращаемое значение.▪️
LazyCell
и LazyLock
теперь реализуют DerefMut. Одной причиной использовать once_cell
меньше.▪️К слову о локах, для
File
теперь есть пачка методов ({, try_}lock{, _shared}
и unlock
) для работы с платформо-специфичными способами блокировки файлов. Напоминаю, что на Linux эти функции требуют кооперации: коду нужно явно указывать на то, что он обращает внимание на блокировки, а по умолчанию они ничего для сторонних процессов не делают.▪️
NonNull
можно безопасно создать из ссылки, поскольку ссылки в Rust обязаны не быть null. Для этого есть реализация From<&T> for NonNull<T>
. К сожалению, этот способ конвертации не очень очевиден, и на практике многие писали код с NonNull::new_unchecked
, в котором ссылка приводилась к сырому указателю по месту вызова. Видимо, чтобы сделать безопасный способ конвертации более видимым и очевидным в исходниках, к NonNull
добавили конструктор from_ref (и from_mut для конвертации из &mut T
). Также этому типу добавили методы для работы с provenance (expose_provenance, with_exposed_provenance, without_provenance), которые аналогичны таковым для сырых указателей, но принимают/возвращают NonZero<usize>
вместо usize
.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3❤2
#prog #rust #article
Can Rust prevent logic errors?
TL;DR: да, потому что в Rust есть для этого средства, которые отсутствуют в подавляющем большинстве мейнстримных ЯП. Автор, впрочем, сравнивает в основном с Ruby.
Предотвращаемые ошибки показаны с примерами на других ЯП.
Can Rust prevent logic errors?
TL;DR: да, потому что в Rust есть для этого средства, которые отсутствуют в подавляющем большинстве мейнстримных ЯП. Автор, впрочем, сравнивает в основном с Ruby.
Предотвращаемые ошибки показаны с примерами на других ЯП.
❤🔥3
Yet another senior pomidor (by @gmelikov)
Интересный кейс подъехал: есть полезный сисколл copy_file_range, и если файловая система позволила принять через него запрос на копирование байтов больше, чем помещается в 32-битное число, то всё остальное будет забито нулями. Если бы я хотел написать кликбейтный…
#prog #c
А баг произошёл из-за того, что возвращаемое значение типа long сохранили в переменную типа int. И это, кстати, вполне себе ошибка, которую современные компиляторы легко ловят.
Позорище (и авторам glibc, и дилетантам Керниганну и Ритчи)
А баг произошёл из-за того, что возвращаемое значение типа long сохранили в переменную типа int. И это, кстати, вполне себе ошибка, которую современные компиляторы легко ловят.
Позорище (и авторам glibc, и дилетантам Керниганну и Ритчи)
👍14👎3🤡3🌚2😁1🤔1🖕1
#prog #rust #article
Fully Automated Releases for Rust Projects
Статья с очень конкретными инструкциями
Fully Automated Releases for Rust Projects
Статья с очень конкретными инструкциями
🔥4
#prog #rust #suckassstory
std::process::exit is not thread-safe in combination with C code calling exit
Древний дизайн из времён, когда многопоточности не существовало, вновь наносит удар! И да, проблемы те же, что и с
std::process::exit is not thread-safe in combination with C code calling exit
Древний дизайн из времён, когда многопоточности не существовало, вновь наносит удар! И да, проблемы те же, что и с
env::{set_var, remove_var}
.😁4
#prog #article
Fixing the Next 10,000 Aliasing Bugs
Относительно старая (март 2023 года) статья, которую стоило бы опубликовать куда раньше.
Статья, которая сначала демонстрирует, к каким багам может приводить алиасинг, а затем пошагово вводит отслеживание алиасинга в систему типов и в итоге приходит к... Rust.
Главный аргумент статьи — почему отслеживание алиасинга в принципе может быть полезно — говорит о связи между алиасингом и инвариантами:
Fixing the Next 10,000 Aliasing Bugs
Относительно старая (март 2023 года) статья, которую стоило бы опубликовать куда раньше.
Статья, которая сначала демонстрирует, к каким багам может приводить алиасинг, а затем пошагово вводит отслеживание алиасинга в систему типов и в итоге приходит к... Rust.
Главный аргумент статьи — почему отслеживание алиасинга в принципе может быть полезно — говорит о связи между алиасингом и инвариантами:
What do all three of these bugs have in common? In every case, an invariant was violated thanks to multiple aliased references to the same value.
Invariants are essential to large scale programming, because it is impossible to hold the entire state of a system in your head at once. <...>
However, code inevitably needs to temporarily violate an invariant while performing updates. The problem comes when there are multiple references to the relevant data, and another reference observes this temporarily violated invariant.
👍4🌚3😁2🔥1
#prog #gamedev #article
Bevy's Fifth Birthday
Да, уже пять лет существует. И да, скоро наконец-то будет редактор, по всей видимости.
Bevy's Fifth Birthday
Да, уже пять лет существует. И да, скоро наконец-то будет редактор, по всей видимости.
bevy.org
Bevy's Fifth Birthday
Bevy is a refreshingly simple data-driven game engine built in Rust. It is free and open-source forever!
❤2
#prog #article
Лежало в закладках с аж 2023 года, при том, что давно прочитал.
A fork() in the road (pdf)
Один из главных аргументов — само существование fork() постоянно сказывается и на дизайне OS, и на дизайне программ, причём не в лучшую сторону.
Лежало в закладках с аж 2023 года, при том, что давно прочитал.
A fork() in the road (pdf)
The received wisdom suggests that Unix’s unusual combination offork()
andexec()
for process creation was an inspired design. In this paper, we argue that fork was a clever hack for machines and programs of the 1970s that has long outlived its usefulness and is now a liability. We catalog the ways in which fork is a terrible abstraction for the modern programmer to use, describe how it compromises OS implementations, and propose alternatives.
As the designers and implementers of operating systems, we should acknowledge that fork’s continued existence as a first-class OS primitive holds back systems research, and deprecate it. As educators, we should teach fork as a historical artifact, and not the first process creation mechanism students encounter.
Один из главных аргументов — само существование fork() постоянно сказывается и на дизайне OS, и на дизайне программ, причём не в лучшую сторону.
👍11🔥1
Блог*
we argue that fork was a clever hack for machines and programs of the 1970s that has long outlived its usefulness and is now a liability.
Telegram
Блог*
#prog
lists.busybox.net/pipermail/busybox/2010-December/074114.html
О том, откуда растут ноги у деления на (s)bin и usr/(s)bin в Unix. Спойлер: это артефакт системы хранения первой машины, на которой производилась разработка.
lists.busybox.net/pipermail/busybox/2010-December/074114.html
О том, откуда растут ноги у деления на (s)bin и usr/(s)bin в Unix. Спойлер: это артефакт системы хранения первой машины, на которой производилась разработка.
😁3
Технологический Болт Генона
Уязвимости в tar-fs и 7-Zip, позволяющие записать файлы за пределы базового каталога https://www.opennet.ru/opennews/art.shtml?num=63740 В NPM-пакете tar-fs выявлена уязвимость (CVE-2025-48387), позволяющая при распаковке специально оформленного tar-архива…
Telegram
Блог*
#prog
Dot Dot Considered Harmful, или почему в Fuchsia нет .. в составе путей.
TL;DR: проще контролировать доступ к файловой системе.
(thanks @alurm)
Dot Dot Considered Harmful, или почему в Fuchsia нет .. в составе путей.
TL;DR: проще контролировать доступ к файловой системе.
(thanks @alurm)
👍7🤡2
😁8👎1