Rust Backend | YeaHub – Telegram
Rust Backend | YeaHub
315 subscribers
95 photos
18 videos
244 links
Теория, подготовка к интервью и курсы для Rust разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
#Собес #chown #owner #group
🤔 Как изменить владельца файла в Bash?

💬 Кратко:

Чтобы изменить владельца файла, используйте:
chown user file.txt

Для смены владельца и группы:
chown user:group file.txt


📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
🦀 Десериализация в Rust 🦀

Тоже производительная, как и все остальное в Rust. Все потому, что она zero-copy.

Рассмотрим подробнее 🤨

При работе с большими JSON или бинарными данными традиционная десериализация создаёт копии строк и байтов. Это естественно расходует память. 💀
Система владения в Rust позволяет использовать мощную оптимизацию: zero-copy десериализацию.

Проблема:
// Обычная десериализация - создаёт owned String
#[derive(Deserialize)]
struct User {
name: String, // Выделяет новую память
email: String, // Ещё одна аллокация
}

// При парсинге JSON каждая строка копируется в кучу
let json = r#"{"name": "Иван", "email": "ivan@example.com"}"#;
let user: User = serde_json::from_str(json)?;
// Данные скопированы из json в user.name и user.email


Решение:
// Zero-copy с заимствованными данными
#[derive(Deserialize)]
struct User<'a> {
#[serde(borrow)]
name: &'a str, // Без аллокации!
#[serde(borrow)]
email: &'a str,
}

// Теперь данные НЕ копируются
let json = r#"{"name": "Иван", "email": "ivan@example.com"}"#;
let user: User = serde_json::from_str(json)?;
// user.name и user.email просто ссылаются на части json!


Преимущества очевидны 💡:

Производительность: Устраняем аллокации для строковых/байтовых полей
Эффективность памяти: Ссылаемся на оригинальный буфер вместо копирования
Низкие задержки: Критично для высоконагруженных сервисов

⚠️ Но всегда стоит помнить!
Заимствованные данные должны жить дольше вашей структуры. Десериализованный объект не может пережить исходный буфер.

В сочетании с simd-json или похожими библиотеками можно достичь времени парсинга на уровне микросекунд.

Был ли у вас опыт с zero-copy в Rust? 🍷

🚀 Пост Guru Rust: @PaulEdd
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍3
#Собес #useradd #user #linux
🤔 Как добавить пользователя в Linux с помощью Bash?

💬 Кратко:

Чтобы добавить нового пользователя, используйте:
useradd newuser

Затем задайте пароль:
passwd newuser


📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#Собес #git_status
🤔 Что делает команда git status?

💬 Кратко:

Команда git status показывает текущее состояние репозитория. Она отображает информацию о файлах, которые были изменены, добавлены в индекс или остаются незамеченными. Это помогает понять, какие шаги нужно выполнить дальше.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#course #степик #sql
📚 Тренажер по SQL

Вам дается теория, примеры выполнения запросов, а дальше вы решаете разные задачи по теме (пример структуры на скрине)

Перейти к материалу

👉 База вопросов 👉 Новости
#Собес #cp #copy #file
🤔 Как скопировать файлы в Bash?

💬 Кратко:

Чтобы скопировать файл, используйте команду cp:
cp source_file destination_file

Для копирования папки используйте -r:
cp -r source_directory destination_directory


📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
🦀 СТАТИЧЕСКИЙ vs. ДИНАМИЧЕСКИЙ полиморфмизм 🦀

На собесах про это часто любят спрашивать. Давайте разберемся, в чем же разница между двумя этими понятиями.

В Rust есть два способа работать с трейтами - и они кардинально отличаются под капотом. 🤑

Статический полиморфизм (с использованием дженериков)

trait Animal {
fn speak(&self);
}

struct Dog;
struct Cat;

impl Animal for Dog {
fn speak(&self) { println!("Гав!"); }
}

impl Animal for Cat {
fn speak(&self) { println!("Мяу!"); }
}

// Статический полиморфизм
fn make_speak<T: Animal>(animal: &T) {
animal.speak();
}


Компилятор под капотом генерирует отдельную функцию для каждого типа. Это называется мономорфизацией.

// Компилятор создаёт две версии:
fn make_speak_Dog(animal: &Dog) { ... }
fn make_speak_Cat(animal: &Cat) { ... }


Динамический полиморфизм (с использованием трейт-объектов)

// Динамический полиморфизм
fn make_speak_dyn(animal: &dyn Animal) {
animal.speak();
}

// Можно хранить разные типы в одной коллекции!
let animals: Vec<Box<dyn Animal>> = vec![
Box::new(Dog),
Box::new(Cat),
];

for animal in &animals {
animal.speak();
}


Здесь компилятор создаёт одну функцию, а нужный метод ищется в рантайме через vtable (таблицу виртуальных методов).


Когда что использовать? 🤨

Статический полиморфизм:
- Максимальная производительность. Никаких накладных расходов в рантайме
- Компилятор знает конкретный тип
- Но: раздувает бинарник (код дублируется для каждого типа)

Динамический полиморфизм:
- Больше гибкость. Можно хранить разные типы в одной коллекции
- Меньше размер бинарника
- Но: косвенный вызов через vtable (небольшой оверхед)
- Но: нельзя использовать с не-object-safe трейтами

Что чаще используете - дженерики или трейт-объекты?

🚀 Пост Guru Rust: @PaulEdd
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3🔥1
#Собес #memory_management #custom #allocators
🤔 Опиши сложные техники управления памятью в Rust, такие как пользовательские аллокаторы и внутренние указатели. Когда их необходимо использовать?

💬 Кратко:

Rust предоставляет автоматическое управление памятью, но для сложных задач можно использовать пользовательские аллокаторы (custom allocators) для оптимизации выделения памяти или внутренние указатели (interior pointers) для работы с небезопасной памятью. Пользовательские аллокаторы позволяют контролировать процесс выделения и освобождения памяти, что важно в высокопроизводительных или встроенных системах. Внутренние указатели используются для взаимодействия с внешними библиотеками или создания специализированных структур данных, но их использование требует осторожности.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
👍1
#Собес #merge #fast_forward #three_way
🤔 Что является результатом git merge?

💬 Кратко:

git merge объединяет две ветки: если изменения не пересекаются, создаёт fast‑forward (перемещает указатель ветки). При наличии расхождений — создаёт новый «merge‑коммит», объединяющий родительские ветки, сохраняя обе истории. Он позволяет сохранить информацию об объединении и точки ветвления.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#repository #начинающие #продвинутые #rustbooks
📚 ImplFerris/LearnRust

Репозиторий с подборкой ресурсов для изучения Rust на разных уровнях — от новичка до продвинутого. Включает ссылки на книги (например, «The Rust Programming Language»), курсы, интерактивные туториалы (Rust By Example), видеоуроки и материалы по специфическим темам, таким как веб-разработка с Axum и embedded-программирование.

Перейти к материалу

👉 База вопросов 👉 Новости
👍2
#Собес #perfoemance #object #dymamic
🤔 Каковы последствия для производительности при использовании объектов трейтов и динамической диспетчеризации в Rust?

💬 Кратко:

Использование объектов трейтов и динамической диспетчеризации приводит к дополнительным накладным расходам, так как они требуют индирекции через указатели и динамический вызов функций, что замедляет выполнение по сравнению с статическими типами.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
1
#Собес #memory_management #custom #allocators
🤔 Опиши сложные техники управления памятью в Rust, такие как пользовательские аллокаторы и внутренние указатели. Когда их необходимо использовать?

💬 Кратко:

Rust предоставляет автоматическое управление памятью, но для сложных задач можно использовать пользовательские аллокаторы (custom allocators) для оптимизации выделения памяти или внутренние указатели (interior pointers) для работы с небезопасной памятью. Пользовательские аллокаторы позволяют контролировать процесс выделения и освобождения памяти, что важно в высокопроизводительных или встроенных системах. Внутренние указатели используются для взаимодействия с внешними библиотеками или создания специализированных структур данных, но их использование требует осторожности.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#Собес #docker #entrypoint #caching
🤔 Какие типовые проблемы возникают при работе с Docker?

💬 Кратко:

Типичные проблемы — большие образы, утечки ресурсов, ошибки в Dockerfile, проблемы с кэшированием, конфликт портов, неправильная работа томов и зависимость от окружения. Также нередко возникают сложности с безопасностью.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#repository #kubernetes #clusterops #containermanagement
📚 Kubernetes

Основной репозиторий системы оркестрации контейнеров Kubernetes. Здесь можно изучить архитектуру, API, механизмы управления кластерами и принципы работы с контейнерами в распределённой среде. Полезен для понимания низкоуровневых механизмов Kubernetes, разбора паттернов развёртывания и настройки высокодоступных систем.

Перейти к материалу

👉 База вопросов 👉 Новости
#Собес #generics #associated_items #trait
🤔 Что такое расширенные обобщения с использованием ассоциированных элементов и where-ограничений, и как их применять для создания мощных абстракций?

💬 Кратко:

Расширенные обобщения позволяют создавать гибкие структуры и функции, которые работают с различными типами. Ассоциированные элементы обеспечивают дополнительные возможности для типов, реализующих трейт, а where-ограничения упрощают добавление условий для типов. Это усиливает контроль и безопасность в коде.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
🦀 ПРОФИЛИРОВАНИЕ 🦀

Как найти, что тормозит в программе? 🧐

Интуиция нас часто обманывает. Кажется, что тормозит сложный алгоритм - а на деле проблема в лишних аллокациях или клонировании строк в цикле. Без конкретных измерений оптимизация превращается в лотерею: переписываешь код, который и так работал нормально, а реальное узкое место не трогаешь.

Профилирование позволяет посмотреть, какие участки кода тормозят или где в программе утечки памяти 🫥


Какие подходы существуют 🤑

1. Семплирование - профилировщик периодически «фотографирует» стек вызовов. Если функция часто попадает в выборку, значит в ней тратится много времени.
Этот подход почти не замедляет программу.

2. Второй подход. В код вставляются метки, в которых замеряется точное время входа-выхода. Распространено, потому что легко сделать с помощью логов.

3. Микробенчмарки. Изолированный замер конкретной функции. Можно использовать, к примеру, для сравнения двух реализаций.

4. Профилирование памяти. Где и сколько аллокаций. В Rust утечки редки, но лишние аллокации тормозят.


Инструменты профилирования

- perf + flamegraph - sampling-профилирование на Linux. Рисует наглядную картину: чем шире блок, тем больше времени в функции.

cargo install flamegraph
cargo flamegraph --bin myapp
# открываешь flamegraph.noscript в браузере


- criterion - микробенчмарки со статистикой. Сравниваешь две реализации и видишь, какая быстрее:

use criterion::{black_box, criterion_group, criterion_main, Criterion};

fn fibonacci(n: u64) -> u64 {
match n {
0 | 1 => n,
_ => fibonacci(n - 1) + fibonacci(n - 2),
}
}

fn bench(c: &mut Criterion) {
c.bench_function("fib 20", |b| {
b.iter(|| fibonacci(black_box(20)))
});
}

criterion_group!(benches, bench);
criterion_main!(benches);


- tracing + tracy - для асинхронного кода. Показывает таймлайн: что выполнялось, что ждало, где блокировки.

- heaptrack / dhat - профилирование памяти. Находит, где программа просит память чаще всего.


Порядок действий 🤔

1. Убедись, что проблема есть - может, код уже достаточно быстрый
2. Собери профиль на реалистичных данных
3. Найди самое узкое место
4. Оптимизируй только его
5. Измерь снова
6. Повтори

Оптимизировать то, что занимает 2% времени - пустая трата сил.

Какие инструменты используете вы? Был случай, когда профилирование показало что-то неожиданное?🚬

🚀 Пост Guru Rust: @PaulEdd
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2🔥2
#Собес #error_handling #result #custom_errors
🤔 Опиши, как реализовать продвинутые паттерны обработки ошибок в Rust, такие как комбинация Result с пользовательскими типами ошибок и цепочка операторов ? для лаконичной обработки ошибок

💬 Кратко:

Пользовательские типы ошибок (enum) позволяют точно описывать различные сценарии ошибок, а комбинация Result с ? обеспечивает компактную и читаемую обработку ошибок. Это помогает передавать ошибки через стек вызовов и обрабатывать их на верхнем уровне.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
1
#Собес #git
🤔 Что такое распределённая система контроля версий?

💬 Кратко:

Распределённая система контроля версий (например, Git) сохраняет полную копию репозитория у каждого участника проекта. Это делает работу более надёжной, позволяет работать оффлайн и обеспечивает лёгкое слияние изменений.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#tool #профиль
📚 Awesome GitHub Profile: ваш профессиональный бренд в цифровом мире

Это уникальный инструмент для персонализации вашего GitHub-профиля, который поможет вам создать впечатляющее портфолио и выделиться среди других разработчиков.

Перейти к материалу

👉 База вопросов 👉 Новости
#Собес #unwrap #expect #panic
🤔 В чём разница между .unwrap() и .expect() в Rust?

💬 Кратко:

Метод .unwrap() вызывает панику, если значение отсутствует, отображая стандартное сообщение об ошибке. Метод .expect() делает то же самое, но позволяет указать собственное сообщение об ошибке.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал