Rust
Open in Telegram
2 230
Subscribers
+324 hours
+37 days
+230 days
Posts Archive
2 230
👣 Веб-приложения десятилетиями ассоциируются с JavaScript. Но сегодня у веба появляется альтернатива: Rust — быстрее, надёжнее и с предсказуемой моделью памяти. Это меняет подход к фронтенду и архитектуре веб-приложений.
🗓 3 февраля в 20:00 МСК приглашаем на открытый урок в преддверии старта курса «Rust Developer. Professional». На вебинаре покажем, как создавать веб-приложения на Rust: рассмотрим фреймворк Dioxus и альтернативы, разберём многокомпонентные SPA, рендер HTML и работу с HTTP-запросами.
❗️ Урок будет полезен Rust-разработчикам, которые хотят выйти за рамки серверного кода, и веб-разработчикам на JavaScript, ищущим более производительные и безопасные решения.
📣 Участие бесплатное, регистрация обязательна: https://vk.cc/cTXBj0
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
2 230
🤠 Трюк Индианы Джонса:
std::mem::take
Типичная ситуация: у вас есть &mut self, и вы хотите забрать поле (например, String или Vec), что-то с ним сделать, и, возможно, вернуть обратно или сохранить измененную версию.
Компилятор бьет по рукам: нельзя просто так переместить (move) значение из-за мутабельной ссылки. Новички часто делают .clone(), чтобы успокоить borrow checker. Но это лишняя аллокация!
Решение: std::mem::take.
Оно забирает значение из ссылки, оставляя на его месте Default::default().
struct Buffer {
data: Vec<u8>,
}
impl Buffer {
fn process(&mut self) {
// Мы "выкрадываем" вектор.
// В self.data теперь пустой Vec (без аллокаций).
let raw_data = std::mem::take(&mut self.data);
// Тяжелая обработка в другом потоке/функции,
// требующая владения (ownership)
let processed = heavy_transform(raw_data);
// Возвращаем результат
self.data = processed;
}
}
Это работает для всего, что реализует Default (Option, String, Vec). Для типов без Default есть std::mem::replace.
Это zero-cost, семантически верно и намного быстрее клонирования.
#rust #std #optimization #tips
👉 @rust_lib2 230
🐮 Cow: Ленивое клонирование
Все знают: лишний
clone() - это грех. Но иногда нам нужно вернуть строку, которая может быть изменена, а может и нет.
Допустим, мы чистим инпут от спецсимволов.
1. Если спецсимволов нет - зачем аллоцировать новую строку? Можно вернуть ссылку на исходную.
2. Если есть - придется создать новую String.
Здесь на сцену выходит std::borrow::Cow (Clone on Write).
use std::borrow::Cow;
fn sanitize(input: &str) -> Cow<str> {
if input.contains('!') {
// Аллокация происходит только тут
Cow::Owned(input.replace('!', "?"))
} else {
// Тут мы просто возвращаем ссылку. Zero allocation.
Cow::Borrowed(input)
}
}
Это мощнейший инструмент для хот-пасов (hot paths), где 90% данных не требуют изменений. Не ленитесь использовать Cow там, где можно избежать лишних аллокаций.
#rust #performance #std
👉 @rust_lib2 230
🛠 Cargo Expand: Загляни под капот макросам
Признайтесь, у вас бывало такое: навесили
#[derive(Serialize)] или сложный макрос из sqlx, получили странную ошибку компиляции и сидите в ступоре?
Макросы это круто, но это черный ящик. Чтобы превратить его в прозрачный, поставьте cargo-expand.
cargo install cargo-expand
Запускаем:
cargo expand
И видите весь тот ужас (или красоту), который генерируется до того, как код попадет к компилятору. Это маст-хэв тулза при отладке async трейтов (привет, async-trait крейт) и понимании того, как работает "магия" фреймворков типа Actix или Rocket.
P.S. Только не пугайтесь, когда увидите, во что разворачивается println!.
#rust #tools #cargo #macro
👉 @rust_lib2 230
👻 Сила пустоты: Zero-Sized Types (ZST)
Мы часто говорим про "zero-cost abstractions", но редко задумываемся, как это выглядит в памяти. ZST - это типы, которые занимают 0 байт. Компилятор знает о них, но в рантайме они исчезают.
Зачем это нужно, кроме экономии памяти? Для управления состоянием на уровне типов.
Представьте, что у вас есть стейт-машина. Вместо того чтобы хранить
enum State и делать проверки в рантайме:
struct Socket<State> {
inner: FileDesc,
_marker: PhantomData<State>, // 0 байт
}
// ZST-маркеры
struct Connected;
struct Disconnected;
impl Socket<Disconnected> {
fn connect(self) -> Socket<Connected> {
// Логика подключения...
// Трансформация типа без оверхеда в памяти
unsafe { std::mem::transmute(self) }
}
}
impl Socket<Connected> {
fn send(&self, data: &[u8]) { ... }
}
В чем профит?
1. Вы физически не можете вызвать метод send у Disconnected сокета. Код просто не скомпилируется.
2. В скомпилированном бинарнике нет никаких флагов состояния, if state == connected и прочего мусора. Метод просто вызывается.
Используйте систему типов, чтобы делать некорректные состояния невыразимыми (Make invalid states unrepresentable).
#rust #advanced #architecture #zst
👉 @rust_lib2 230
🦀 Error Handling: Библиотеки против Приложений
Часто вижу в код-ревью кашу из способов обработки ошибок. Давайте раз и навсегда зафиксируем базу, чтобы ваш код был идиоматичным.
Есть два лагеря, и вам нужно быть в обоих, но в разное время:
1. Вы пишите Библиотеку?
Используйте
thiserror.
Почему: Вашим пользователям важно матчить ошибки. Им нужно знать, что именно пошло не так (NetworkError, ParseError), чтобы программно на это отреагировать. Вы не должны навязывать им тяжелые трейты.
#[derive(thiserror::Error, Debug)]
pub enum MyLibError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Invalid header")]
InvalidHeader,
}
2. Вы пишите Приложение (CLI, Backend)?
Используйте anyhow.
Почему: Вам чаще всего плевать на тип ошибки в глубине стека, вам важно прокинуть её наверх (main), залоггировать контекст и упасть (или отдать 500-ку).
use anyhow::{Context, Result};
fn main() -> Result<()> {
let config = std::fs::read_to_string("config.toml")
.context("Не удалось прочитать конфиг")?;
Ok(())
}
Итог: В библиотеках даем структуру (thiserror), в приложениях собираем контекст (anyhow). Не смешивайте.
#rust #tips #error_handling
👉 @rust_lib2 230
Добро пожаловать на «Полный курс Rust»!
(2024) (Eng ver.)
Этот обширный курс разработан, чтобы превратить вас из новичка в опытного программиста Rust, охватывая все основные темы, необходимые для создания надежного и эффективного программного обеспечения.
В этом курсе вы начнете структурированный процесс обучения, который включает:
Chapter 0 Introduction to Rust 00:00
Chapter 0 Install Rust 08:05
Chapter 0 Write first Rust program 09:26
Chapter 0 Cargo package manager 12:36
Chapter 1 Primitive Data Types 15:53
Chapter 2 Compound Data Types 25:12
Chapter 3 Functions 46:40
Chapter 4 Ownership 01:06:27
Chapter 5 Borrowing, and References 01:15:22
Chapter 6 Variables and Mutability 01:27:16
Chapter 7 Constants 01:31:05
Chapter 8 Shadowing 01:38:00
Chapter 9 Comments 01:46:49
Chapter 10 Introduction to Control Flow 01:49:33
Chapter 11 Looping Mechanisms 01:58:29
Chapter 12 Defining Structs 02:09:25
Chapter 13 Introduction to Enums 02:21:13
Chapter 14 Error Handling Techniques 02:33:07
Chapter 15 Collection Types 02:41:25
источник
👉 @rust_lib
2 230
OpenVMM — это проект Microsoft с открытым исходным кодом, который представляет собой модульный кросс-платформенный монитор виртуальных машин (VMM), написанный на языке Rust.
1. Ядро OpenHCL: В настоящее время OpenVMM является основным компонентом проекта OpenHCL (Open Hardware Compatibility Layer). Это так называемый «паравизор» (paravisor) — слой совместимости, который работает внутри контекста виртуальной машины, а не на хосте.
2. Зачем это нужно: Он используется в облаке Microsoft Azure для конфиденциальных вычислений. OpenVMM позволяет запускать обычные, немодифицированные операционные системы (Windows, Linux) в защищенных средах (например, на базе технологий Intel TDX или AMD SEV-SNP), эмулируя устройства и обеспечивая безопасность.
3. Безопасность и язык Rust: Проект написан на Rust для обеспечения безопасности памяти (memory safety), что критически важно для программного обеспечения уровня гипервизора во избежание уязвимостей.
4. Кросс-платформенность: Поддерживает архитектуры x86-64 и AArch64 (ARM64) и может работать поверх различных гипервизоров (Hyper-V, KVM, macOS Hypervisor.framework).
По сути, это низкоуровневый системный инструмент, который позволяет Microsoft предоставлять современные функции безопасности и аппаратного ускорения в облаке Azure, сохраняя совместимость со старыми или стандартными образами операционных систем.
https://github.com/microsoft/openvmm
👉 @rust_lib
2 230
Ghostport
Высокопроизводительный инструмент для подмены портов, написанный на Rust. Сбивайте с толку порт-сканеры с помощью динамической эмуляции сервисов на всех портах. Поддерживает настраиваемые сигнатуры, эффективную асинхронную обработку и простое перенаправление трафика.
Особенности
- Динамическая эмуляция портов: отвечает на порт-сканирование набором правдоподобных сигнатур сервисов.
- Настраиваемые сигнатуры: легко добавлять или изменять сигнатуры сервисов через простой текстовый файл.
- Высокая производительность: построен на Rust и Tokio для эффективной асинхронной обработки соединений.
- Гибкое логирование: режимы debug, verbose и quiet для разных сценариев использования.
- Простота использования: простой интерфейс командной строки с разумными настройками по умолчанию.
https://github.com/vxfemboy/ghostport
👉 @rust_lib
2 230
Пишем калькулятор на Rust с GUI
Зачем еще один калькулятор? Да не зачем, просто как тестовый проект для рассмотрения GUI-библиотеки.
Изначально я хотел попробовать такие крейты, как GPUI, Floem и Xilem, но первая, кажется, пока работает только под MacOS и Linux, вторая не позволяет установить иконку окну и кушает оперативы побольше Webview в Tauri, а до третьей я так и не добрался, узнав об Slint.
Об Slint есть всего несколько новостных постов на Хабре, поэтому, возможно, вам будет интересно посмотреть, что это такое.
https://habr.com/ru/articles/804655/
👉 @rust_lib
2 230
Pico Pico - Embedded Programming with Rust
В этой книге используется Raspberry Pi Pico 2 (на базе чипа RP2350), программируемый на Rust.
Рассмотрены разнообразные проекты - например, затухание светодиода, управление сервоприводом, измерение расстояния ультразвуковым датчиком, отображение изображения Ferris на OLED-дисплее, работа с RFID-ридером, проигрывание мелодий на зуммере, автоматическое включение светодиода при отсутствии света в комнате, измерение температуры и многое другое.
https://pico.implrust.com/index.html
👉 @rust_lib
2 230
📕Создание приложения Movie Watchlist Manager на Angular: от компонентов до управления состоянием - разработчикам JavaScript/TypeScript, Junior/Middle разработчикам, желающим освоить Angular, Frontend-разработчикам на других фреймворках (React, Vue)
На открытом уроке 19 ноября в 20:00 мск мы погрузимся в созданию приложения по отслеживанию просмотренных фильмов/сериалов с использованием сигнальных сторов в Angular:
📗 На вебинаре разберем:
1. Создание компонентов и подключение API для поиска и добавления фильмов.
2. Организация архитектуры проекта и лучшие практики.
📘 В результате на практике изучите и освоите базовые концепции Angular (компоненты, сервисы, DI), работу с формами, API и реактивными потоками, использование store для управления состоянием приложения и лучшие методы построения современного SPA-приложения на Angular.
👉 Регистрация на урок и подробности о курсе Angular Developer: https://vk.cc/cRpDSs
Все участники открытого урока получат скидку на курс "Angular Developer"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
2 230
«Ускорение компилятора Rust без изменения его исходного кода»
…Да, я знаю, что заголовок выглядит как кликбейт. Но на самом деле он не так уж далёк от истины 🙂
В этом году я начал вносить вклад в rustc в рамках #wg-compiler-performance — рабочей группы, которая сосредоточена на том, чтобы сделать компилятор Rust максимально быстрым. В этом посте описаны некоторые вещи, над которыми я и несколько других разработчиков rustc работали последние несколько месяцев, чтобы приблизиться к этой цели.
Что, возможно, немного необычно — большая часть моих усилий была направлена не на улучшение исходного кода самого rustc, а на улучшение способа, которым мы компилируем/собираем rustc, чтобы обеспечить максимальную эффективность.
https://kobzol.github.io/rust/rustc/2022/10/27/speeding-rustc-without-changing-its-code.html
👉 @rust_lib
2 230
Пишем простой калькулятор используя фреймворк eframe (egui)
Всем здравствуйте. Ниже будет приведен пример написания PWA приложения готового для использования как в браузере, так и на компьютере с ОС Windows. Использовать будем язык программирования Rust и фреймворк eframe (egui). Готовое приложение будет доступно как исполняемый файл для ОС Windows, и как файл Webassembly. В процессе работы мы будем использовать GitHub Action для отслеживания корректности написания нашего кода и сборки исполняемых файлов программы, а также для развертывания (версию программы с использованием Webassembly) как страницы в интернете (GitHub Pages).
https://habr.com/ru/articles/722438/
👉 @rust_lib
2 230
📕От нуля до пиццы за 60 минут: Angular Reactive Forms в бою - разработчикам JavaScript/TypeScript, Junior/Middle разработчикам, желающим освоить Angular, Frontend-разработчикам на других фреймворках (React, Vue)
На открытом уроке 13 ноября в 20:00 мск мы погрузимся в создание интерактивного конструктора пиццы с использованием Angular Reactive Forms и сигналов.
📗 На вебинаре:
1. Понимание архитектуры компонентов и Template syntax: директивы, биндинги, pipes
2. Погружение в Event handling и реактивность
📘 В результате на практике изучите и освоите создание и настройка форм через FormBuilder, работу с FormGroup и FormControl, валидацию данных и обработку ошибок.
👉 Регистрация на урок и подробности о курсе Angular Developer: https://vk.cc/cRfph8
Все участники открытого урока получат скидку на курс "Angular Developer"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
2 230
Rust Lang Уроки
Начало работы с языком программирования Rust & Visual Studio Code. Debugging & unit tests
Переменные и типы данных в Rust
Арифметические операции и операции сравнения. Язык Rust
Логические операции и конструкция if...else. Язык Rust
Почему Rust? ❤️ Конструкция match
Функции. Язык Rust
Структуры. Язык Rust. Анджелина и Бред вместе ❤️ благодаря структурам
Tuples | кортежи. Структуры-tuples. Язык Rust
Массивы. Язык программирования Rust.
Циклы loop | while | for. Язык Rust.
источник
👉 @rust_lib
2 230
Времена жизни и управление памятью в Rust
Borrow checker, lifetimes и владение — три кита, на которых держится безопасность Rust. На открытом вебинаре курса OTUS Rust Developer. Professional Илья Богданов объяснит, как работает управление памятью под капотом и почему Rust предотвращает целые классы ошибок ещё на этапе компиляции.
📌 19 ноября, 20:00
Времена жизни и управление памятью в Rust
— move, borrow и copy: как устроена система владения
— lifetimes и зачем нужны апострофы в коде
— borrow checker без страха и боли
— как проектировать API с правильными lifetime’ами
Вебинар бесплатный и будет полезен как начинающим, так и опытным разработчикам на Rust, а также программистам на C/C++, которые хотят понять, как создавать безопасный и эффективный код без сборщика мусора.
👉 Зарегистрироваться: https://vk.cc/cRbPfo
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
2 230
⚡️ Screenpipe — это инструмент на Rust, который записывает экран и автоматически анализирует собранные данные с помощью моделей Ollama.
Он может извлекать информацию из любых источников на компьютере — текста, аудио и видео — и передавать её в LLM для обработки.
Особый акцент сделан на безопасности и приватности: все данные сохраняются локально в базе SQLite, без отправки во внешние сервисы.
https://github.com/mediar-ai/screenpipe
👉 @rust_lib
2 230
RustedLessPass — это автономный менеджер паролей, написанный на Rust и работающий на Rust / Wasm.
https://github.com/RustedLessPass/RustedLessPass
👉 @rust_lib
2 230
Пишем веб-сервер на Rust
Асинхронность, безопасность и высокая производительность — ключевые принципы Rust, которые делают его идеальным для сетевых приложений. На открытом вебинаре курса OTUS Rust Developer. Professional Сергей Потамошнев покажет, как создать веб-сервер с нуля — без фреймворков, но с глубоким пониманием процессов под капотом.
📌 11 ноября, 18:00
Пишем веб-сервер на Rust
— основы async/await и работа с event loop
— парсинг HTTP-запросов и формирование ответов
— многопоточность и безопасность через систему владения
— создание веб-сервера для статических файлов и API
Вебинар бесплатный и будет полезен бэкенд-разработчикам, энтузиастам Rust и всем, кто хочет понять, как устроены современные высоконагруженные системы.
👉 Зарегистрироваться: https://vk.cc/cR0CV6
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
