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

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

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Истерический смех
😁17😐6🎉21😢1
#ml

ASR = Automatic Speech Recognition
Forwarded from Generative Anton
Там в общем в области профессионального интереса случилась штука, о которой не могу молчать. В OpenAI зарелизили Whisper — это ASR моделька, которую обучили на 680к часов (это много) и по различным тестам она достигла и в робастности и в качестве уровня человека.

Самое важное — она полностью открытая, опенсорсная и под MIT-лицензией. Такие вот дела.

По метрикам (самое важное, чем измеряется качество ASR — WER) на длинных записях там все тоже очень на уровне коммерческих сервисах, а местами и лучше.
👍9🤯2
google is as helpful as ever
😁24👍5🎉2
Блог*
...С другой стороны, зачем ограничиваться именно u32? Наш код вполне может работать с другими типами! Давайте это исправим: macro_rules! make_literal { (($n:expr) : $ty:ty) => {{ // то же, что и было, но заменяем u32 на $ty STR: &str =…
#prog #rust #моё

Тем временем вышла версия Rust 1.64.0. Релиз я разберу подробнее чуть позже, а пока отмечу, что благодаря стабилизации core::slice::from_raw_parts я наконец-то могу переписать свой макрос, который я не трогал два года, так, чтобы он работал на стабильной версии и при этом гарантированно работал без UB. Не то чтобы он не работал раньше, но раньше он полагался на конкретный порядок указателя и длины в представлении ссылки на слайс, который, вообще говоря, мог меняться от версии к версии.

Также я воспользовался шансом и задействовал алиасы примитивных типов из core, что позволит макросу работать и в том маловероятном случае, если кто-то перекроет имя примитивного типа usize.
🎉5🌚4🔥1
#prog #rust #rustreleasenotes

Вышла версия Rust 1.64.0! Как всегда, отсылаю за подробностями к RELEASES.md, а тут рассказываю лишь об избранных вещах.

▪️Одновременно стабилизировали трейт IntoFuture и немного поменяли семантику .await. Так же, как цикл for принимает не итераторы, а всё, что может быть сконвертировано в итератор при помощи IntoIterator::into_iter, так и .await теперь можно использовать на всём, что может конвертироваться в футуру через вызов IntoFuture::into_future.

▪️В придачу к изменению выше стабилизировали std::future::poll_fn и std::task::ready!.

▪️Список типов, которые могут быть полями объединений, пополнили мутабельные ссылки и кортежи разрешённых типов.

▪️Добавили линт unused_tuple_struct_fields, который делает понятно что. Но с оговорками: по умолчанию не включён (но планируют поднять до уровня warn в будущих релизах) и не предупреждает о неиспользуемых полях типа ().

▪️Как я уже писал, типы для интеропа с C (по типу c_int) переехали наконец в core в модуль ffi, как и Cstr, а CString переехал в alloc::ffi.

▪️Крейты в составе workspace теперь могут описывать общие зависимости на уровне самого workspace, чтобы не повторять их.

▪️У команд cargo теперь можно указывать несколько флагов --target, чтобы скомпилировать под несколько целевых платформ сразу

▪️Ошибки в const-контексте теперь снабжаются сообщением в несовместимости с будущими версиями rustc

▪️transmute_copy теперь паникует, если целевой тип меньше исходного.

▪️Стабилизировали ещё пачку API. В основном — проверяемая арифметика для NonZero*-типов, но также impl std::fmt::Write for OsString и slice::from_raw_parts в const-контексте (!!!).
👍4🔥2
Эх, Вафель опередил
🤣4👏1
Если я перестал хвалить Rust — я или умер, или попал в военкомат (что, в принципе, одно и то же)
😢33😁7🤔3
События последних дней таки догнали мою психику. Разрыдался.

И, кажется, у меня нервный тик.
😢374😁2
Forwarded from я что-то �� и всё ����
👍34
Блог*
Сделаем слайс по частям и превратим: const DECOMPOSED: ([u8; 20], usize) = to_ascii(42); const STR: &str = unsafe { std::mem::transmute(RawSlice { ptr: &DECOMPOSED.0 as *const _, // &[u8] неявно приводится к *const [u8], …
#prog #rust #моё

"Вижу цель — не вижу препятствий", или о превратностях туннельного зрения.

Даже после точного подсчёта размера буфера to_ascii возвращает пару из буфера и размера записанной части. Но зачем? Буфер уже в точности того размера, который нужен — LEN! Значит, можно просто возвращать Array и не считать len, тем самым упростив код.

Переписал гист.
👍1
Блог*
#prog #rust #моё "Вижу цель — не вижу препятствий", или о превратностях туннельного зрения. Даже после точного подсчёта размера буфера to_ascii возвращает пару из буфера и размера записанной части. Но зачем? Буфер уже в точности того размера, который нужен…
#prog #rust

То есть, согласно miri,

let s_rt: &[u8] = unsafe {
std::slice::from_raw_parts(
std::convert::identity([0]).as_ptr(),
1,
)
};

— это не ок, потому что тут создаётся висячая ссылка. Логично, значение, возвращаемое identity, дохнет после вызова функции.

Но: также согласно miri, тот же самый код, но в const-контексте,

const S_CONST: &[u8] = unsafe {
std::slice::from_raw_parts(
std::convert::identity([0]).as_ptr(),
1,
)
};

— это ок, тут никаких висящих ссылок нет. Потому что, тут, видимо, значение, возвращаемое константной identity, вызвано на константном значении и потому само является константным и может быть использовано для static promotion? Даже не смотря на отсутствие на identity атрибута #[rustc_promotable], поскольку возвращаемое значение не является непосредственно promotable значением и вычисляется внутри инициализатора константы?

И при этом, согласно всё тому же miri, если убрать identity:

let s_rt: &[u8] = unsafe {
std::slice::from_raw_parts([0].as_ptr(), 1)
};

, то всё ок и никаких висячих ссылок нету? Потому что [0] промоутится? А, нет, потому что это &[u8], но не &'static [u8], если поменять тип s_rt, тогда miri жалуется.

Короче, я тут так лихо отредактировал, что умудрился написать код, который вроде ок в const-контексте, но при этом вызывает UB в рантайме. Ещё раз поправил гист, теперь вроде висячих ссылок нету.
👏2
Если растаману отрубить голову, он ещё пять минут будет говорить о преимуществах borrow checker-а
👍22😁4🌚31
Блог*
#prog #rust #моё "Вижу цель — не вижу препятствий", или о превратностях туннельного зрения. Даже после точного подсчёта размера буфера to_ascii возвращает пару из буфера и размера записанной части. Но зачем? Буфер уже в точности того размера, который нужен…
Более того, зная наперёд количество цифр, мы можем заполнять массив с конца, чтобы строка получилась сразу в правильном порядке, а не оборачивать его в конце!

Ещё раз обновил гист.
🔥1😁1