YeaHub Tech
412 subscribers
343 photos
15 videos
2 files
450 links
Новые технологии, советы и обучающие материалы

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

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

Для связи: @ruslan_kuyanets
Download Telegram
#React

🔖 Почему ваш WebSocket переподключается при каждом рендеринге?

Вы создали WebSocket, но соединение постоянно разрывается и переподключается. Проблема: React создаёт новый экземпляр сервиса при каждом рендеринге. Без useCallback сервис теряет стабильную ссылку, что приводит к переподключениям и утечкам памяти.

// Плохо - сервис пересоздаётся при каждом рендеринге
function ChatComponent() {
const ws = new WebSocket('ws://server');
const sendMessage = (msg) => {
ws.send(msg); // Новый WebSocket при каждом рендере
};
return <button onClick={() => sendMessage('Hi')}>Send</button>;
}

// Хорошо - стабильная ссылка на сервис
function ChatComponent() {
const wsRef = React.useRef(new WebSocket('ws://server'));
const sendMessage = React.useCallback((msg) => {
wsRef.current.send(msg); // Один и тот же WebSocket всегда
}, []);
return <button onClick={() => sendMessage('Hi')}>Send</button>;
}


📎 Основные проблемы:

🔸 WebSocket переподключается, теряя состояние соединения
🔸 Память утекает: старые соединения не закрываются
🔸 Event listeners создают дубликаты
🔸 Производительность падает из-за пересоздания ресурсов

Когда компонент рендерится без useCallback, каждый раз создаётся новая функция. Для долгоживущих сервисов (WebSocket, Worker) это критично — вы разрываете всё, что было до этого, вместо переиспользования.

Ключевой момент: useRef гарантирует, что сервис существует на весь цикл компонента, а useCallback — что ссылка на функцию не меняется. Идеальное сочетание для постоянных ресурсов.

✅ Используйте useCallback + useRef для:
- WebSocket и долгоживущих соединений
- Web Workers, которые должны жить долго
- Сервисов, хранящих внутреннее состояние
- Optimization обработчиков событий

❌ Избегайте:
- Создания нового сервиса без ref
- Забывать cleanup в useEffect
- Использования useCallback без причины
- Передачи ref как пропс дочерним компонентам

Стабильная ссылка на сервис — это гарантия корректной работы!

Остальные продвинутые техники React - читай в статье ⬇️


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
#JavaScript

🔖 Почему ваш JavaScript-бандлер весит как три полнометражных фильма?

Вы загрузили приложение, добавили ещё библиотек, и вот уже бандлер весит 500KB вместо 100KB. Пользователи ждут загрузки 5 секунд вместо 1 секунды. Приложение работает, но медленно. Каждый килобайт JS — это время парсинга, выполнения, разборки браузером. На мобильнике это значит батарея сливается, страница зависает, пользователи уходят к конкурентам.

// Плохо - импортируете всё, используете мало
import _ from 'lodash'; // 70KB, нужна одна функция
import * as echarts from 'echarts'; // 1MB для одного графика
import UILibrary from 'heavy-ui-kit'; // 200KB со всеми компонентами

// Хорошо - импортируйте только нужное
import { debounce } from 'lodash-es'; // Tree-shaking, 2KB
import { BarChart } from 'lightweight-charts'; // 50KB, минимум
import { Button, Input } from '@headlessui/react'; // Tree-shaking, 10KB


Основные проблемы раздутого бандлера:

🔸 Дольше загружается на мобильных сетях (LTE, 3G)
🔸 Браузер парсит и выполняет больше кода — замораживает UI
🔸 На слабых устройствах всё работает медленнее, батарея быстрее сливается
🔸 Поисковики штрафуют за низкую производительность, рейтинг падает

Раздутый бандлер — это не просто цифра на диске. Это деньги компании (CDN трафик), разочарование пользователя (медленная загрузка), потерянные конверсии (люди ушли, не дождались).

✅ Как уменьшить бандлер:

1. Аудит зависимостей — используйте webpack-bundle-analyzer, посмотрите что там. Может быть, импортируете тяжелую библиотеку для одной функции?

2. Code splitting — разделите на чанки, загружайте по требованию. React.lazy(), динамический импорт для маршрутов.

3. Tree-shaking — удаляйте неиспользуемый код. ES модули помогают бандлеру определить, что не нужно.

4. Минификация — Terser, Gzip/Brotli. Просто сжимайте код, функциональность не меняется.

5. Server-side rendering — переложите вычисления на сервер вместо клиента. Меньше JS в браузере = быстрее загружается.

❌ Избегайте:

- Импорта целых библиотек для одной функции
- Неиспользуемого кода (закомментированные куски месячной давности)
- Отключенного tree-shaking в production сборке
- Только клиентского рендеринга для статического контента

Каждый килобайт имеет значение. Производительность = пользовательский опыт = конверсии.


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#C++

🔖 Почему memset с целыми числами дает странные результаты?

memset — это функция для заполнения памяти значениями побайтно. Многие думают, что memset(arr, 1, size) заполнит целые числа единицами. На самом деле это создаст странные значения, потому что memset работает с байтами, а не с типами. Вот почему нужно понимать, как она реально работает.

// Плохо - пытаетесь установить целым числам значение 1
int numbers[5];
std::memset(numbers, 1, sizeof(numbers));
std::cout << numbers[0]; // Странный результат: 16843009

// Хорошо - используйте memset только для 0 и -1
int numbers[5];
std::memset(numbers, 0, sizeof(numbers)); // Все нули
// ИЛИ
std::memset(numbers, -1, sizeof(numbers)); // Все биты = 1


🔸 Основные проблемы с memset:

🔸 memset работает побайтно, не зная о типе данных
🔸 С целыми числами только 0 и -1 работают правильно, остальное — мусор
🔸 С не-POD типами (std::string, классы) приводит к краху
🔸 Лишняя единица в size параметре — выход за границы памяти

memset принимает три параметра: указатель, значение (преобразуется в byte), размер в байтах. Проблема: для int это 4 байта. Если вы хотите установить int = 1, нужно 4 раза записать байт 1, что даст 0x01010101 = 16843009, а не 1.

🔸 Практический пример:

char str[50];
std::memset(str, '*', sizeof(str)); // Работает: заполнит звездами
str[sizeof(str) - 1] = '\0';

int matrix[3][3];
std::memset(matrix, 0, sizeof(matrix)); // Работает: матрица нулей
std::memset(matrix, -1, sizeof(matrix)); // Работает: все биты = 1

// Буфер для обработки изображений
unsigned char pixels[100][100];
std::memset(pixels, 0, sizeof(pixels)); // Чёрный (0)
std::memset(pixels, 255, sizeof(pixels)); // Белый (255)

// Очистка игрового состояния
struct GameState {
int score;
int lives;
bool gameOver;
} state;
std::memset(&state, 0, sizeof(GameState)); // Работает для POD
state.lives = 3; // Затем переустанавливаете нужные значения


✅ Используйте memset для:
- Обнуления массивов и буферов (0)
- Установки всех битов в 1 (-1)
- Работы с char массивами
- Инициализации POD типов (Plain Old Data)

❌ Не делайте:
- memset с целыми числами кроме 0 и -1
- memset с std::string и классами (краш!)
- memset на не-POD структурах с конструкторами
- Ошибки в параметре size (выход за границы)

Правило: memset = только для побайтных операций. Для сложных типов используйте std::fill или конструкторы.


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#Programming

🔖 Почему ваша библиотека никто не использует, хотя она работает?

Вы написали библиотеку, которая решает проблему, но она сложная в использовании и никто не хочет её применять. Проблема не в функциональности, а в проектировании. Хорошая библиотека предоставляет точки расширения, не навязывает свой контекст и остаётся простой. Плохая — заставляет пользователя прыгать через обручи.

// Плохо - функция навязывает свой контекст, нет гибкости
void sort(int& container) {
// Компаратор зафиксирован, нельзя поменять
// Способ свопинга элементов фиксирован
}

// Хорошо - точки расширения встроены в интерфейс
template <class R, class C = DefaultCompare, class S = DefaultSwap>
void sort(R&& range, C compare = C(), S swap = S()) {
// Пользователь может передать свой компаратор
// Пользователь может передать свой своп
// По умолчанию работает стандартно
}


📎 Основные проблемы плохих библиотек:

🔸 Отсутствие точек расширения — невозможно кастомизировать
🔸 Сложная архитектура — нужно понимать всю библиотеку, чтобы использовать часть
🔸 Конкретные типы вместо обобщений — работает только для одного случая
🔸 Навязанный контекст — вынуждает пользователя следовать вашему стилю

Хорошая библиотека предполагает точку зрения пользователя, а не разработчика. Она не предполагает, что пользователь сделает. Вместо этого она предоставляет инструменты и ступеньки, позволяя каждому использовать её по-своему.

Три столпа проектирования:

// 1. МОДУЛЬНОСТЬ - компоненты независимы
// Контейнеры отделены от алгоритмов, но работают вместе
std::vector<int> v = {3, 1, 2};
std::sort(v.begin(), v.end()); // Работает с любым контейнером

// 2. МНОГОРАЗОВОСТЬ - работает для многих типов
template <class T>
class Maybe {
T value; // Работает с любым типом T
};

// 3. РАСШИРЯЕМОСТЬ - встроены точки для кастомизации
std::sort(v.begin(), v.end(), [](int a, int b) {
return a > b; // Пользовательский компаратор
});


✅ Проектируйте библиотеку так, чтобы:

- Компоненты были независимы и использовались отдельно
- Работала с разными типами, не только одним конкретным
- Предоставляла точки расширения (callback, custom comparator, plugin)
- Была легка в понимании — минимум контекста для начала использования

❌ Не делайте:

- Сложные архитектуры, когда вся библиотека зависит друг от друга
- Конкретные типы (int, string) вместо шаблонов и обобщений
- Фиксированное поведение без возможности кастомизации
- Навязывание дизайн-решений пользователям

Пример хорошей библиотеки — C++ STL: контейнеры работают с алгоритмами, всё обобщено через шаблоны, есть кастомные компараторы и аллокаторы. Пример плохой — фреймворк, где всё зависит от всего.

Полезная библиотека думает о том, кто её будет использовать, и делает это легко.


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#Go

🔖 Почему Go-разработчик пишет код, который Java-девелопер считает "странным"?

Вы Java-разработчик, начали писать на Go и всё кажется странным: нет try-catch, нет наследования, строчные буквы для приватности, можно вызвать метод у nil. Go — это не Java, это другая парадигма. Явность вместо магии, композиция вместо наследования, ошибки как значения вместо исключений.

// Плохо (по Go стандартам) - Java способ обработки ошибок
try {
String raw = Files.readString(Path.of("cfg.json"));
Config cfg = mapper.readValue(raw, Config.class);
return cfg;
} catch (IOException ex) {
throw new IllegalStateException("cannot init config", ex);
}

// Хорошо (Go способ) - явная проверка каждой ошибки
raw, err := os.ReadFile("cfg.json")
if err != nil {
return nil, fmt.Errorf("read cfg: %w", err)
}
var cfg Config
if err := json.Unmarshal(raw, &cfg); err != nil {
return nil, fmt.Errorf("parse cfg: %w", err)
}
return &cfg, nil


📎 Основные различия Go от Java:

🔸 Нет исключений (try-catch), ошибки — это значения (if err != nil)
🔸 Приватность через заглавность букв (Public vs private), не через модификаторы
🔸 Нет наследования, только композиция и интерфейсы
🔸 Интерфейсы неявные — не нужно писать implements

Go философия: явность над неявностью, простота над магией. Кода больше, но всё понятно. Нет аннотаций, нет DI фреймворков, нет магических прокси и рефлексии за кулисами. Вы видите, что происходит.

Два ключевых отличия:

// 1. ЯВНАЯ ОБРАБОТКА ОШИБОК - видите каждый шаг
tx, err := db.BeginTx(ctx, nil)
if err != nil {
return fmt.Errorf("begin tx: %w", err)
}
defer tx.Rollback()

// 2. ПРИВАТНОСТЬ ЧЕРЕЗ БУКВУ - заглавная = public, строчная = private
type PaymentGateway interface { // Public
Charge(ctx context.Context) error
}
func (s *stripe) charge(ctx context.Context) error { // private method
// ...
}


✅ Go хорош для:
- Микросервисов и бекенда (явность, производительность)
- Когда нужна скорость разработки и чистота кода
- Когда нет необходимости в сложных абстракциях на старте
- Когда важна читаемость и простота отладки

❌ Привыкайте к:
- Повторению проверок ошибок (if err != nil много раз)
- Коротким названиям переменных (ctx, err, db, u, p)
- Отсутствию try-catch блоков (это норма)
- Приватности через буквы, а не ключевые слова
- Явным транзакциям и управлению ресурсами

Go требует переучивания мышления. Java — "дайте мне абстракции и автоматику". Go — "вот инструменты, делайте сами, но явно". Один раз адаптируетесь — полюбите за простоту и понятность.


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🔖 CSS Grid: Вёрстка без DIV'ов

CSS Grid — один контейнер делится на строки и столбцы в CSS. Все элементы располагаются как на шахматной доске.

📎Суть

Вместо кучи DIV'ов для раскладки:

.page {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: 80px 1fr 50px;
grid-template-areas:
'sidebar header'
'sidebar main'
'sidebar footer';
}

.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }


Вот так! Рисуешь структуру в CSS, как картинку.

🔸 Главные юниты

fr — "fraction", волшебный юнит Grid'а:
/* 1/4 и 3/4 пространства, автоматически пересчитывается */
grid-template-columns: 1fr 3fr;


repeat() — копирование столбцов:
/* 7 столбцов одинаковой ширины (календарь) */
grid-template-columns: repeat(7, 1fr);


Элементы занимают несколько ячеек

.child {
grid-column: 1 / 4; /* от столбца 1 до 4 */
grid-row: 1 / 3; /* от строки 1 до 3 */
}


✅ Когда использовать

🔸 Двумерные раскладки (строки + столбцы)
🔸 Сетки (карточки, галереи)
🔸 Страницы (header/sidebar/main/footer)

❌ Для навигации по одной оси → Flexbox проще


Главное ⬇️

Чистый HTML, вся вёрстка в CSS!
Интерактивный гайд по ссылке ниже


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🔖 Davia: Документация к коду за одну команду

Ненавидишь писать документацию? Davia её генерирует автоматически с диаграммами!

💡 Как это работает

1️⃣ Установи Davia
2️⃣ Запусти команду в папке проекта
3️⃣ Готово! Полная документация со структурой кода и визуальными диаграммами

davia generate


📎 Что получишь

✅ Чистая документация всего проекта
✅ Визуальные диаграммы архитектуры
✅ Структурированное описание модулей
✅ Легко просматривать и редактировать

🔸Для кого это полезно

- Онбординг новичков — они разберут проект за часы, а не за дни
- Возврат к старому коду — забыл, как работает? Есть документация!
- Крупные проекты — видишь всю архитектуру визуально
- Open source — пользователи быстрее разберутся
- Code review — проще объяснять изменения

🔸Пример

Вместо этого:
TODO: написать документацию...


Теперь это:
Автоматическая документация с диаграммами модулей, 
зависимостей, API и структуры проекта ✨


Почему это важно ⬇️

Документация часто отстаёт от кода. Davia генерирует её из самого кода, поэтому она всегда актуальна!

Забирай на GitHub и пошли документировать проекты!


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔖 Java: Одна буква может отправить тебя на год в будущее!

Знаешь ли ты разницу между 'Y' и 'y' в паттерне даты Java?

🔸Проблема

Код:
Date date = new Date("2024/12/31");
var formatter = new SimpleDateFormat("dd-MM-YYYY");
System.out.println(formatter.format(date));


Результат:
31-12-2025  ← Уехали на год вперёд! 


А если использовать правильный:
var formatter = new SimpleDateFormat("dd-MM-yyyy");
// 31-12-2024 ✅



🔸 В чём разница?

`y` (lowercase) = обычный год → 2024, 2025

`Y` (UPPERCASE) = неделя-года (ISO 8601) → может быть на год больше/меньше!

🔸 Почему так?

Y использует ISO-8601 стандарт: первая неделя года — та, где четверг в январе.

31 декабря 2024 входит в первую неделю 2025, поэтому Y выдаёт 2025!

1 января 2027 входит в последнюю неделю 2026, поэтому Y выдаёт 2026!

🔸 Реальные баги

❌ Bouncy Castle — нашли несколько мест с 'Y', исправили на 'y'
❌ OpenGrok — то же самое


💡 Правило

🔸 Никогда не используй `Y` в паттерне даты, если не знаешь что это!
🔸 Используй `y` для обычного года



📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤯2❤1
#article #тренажер
📚 Тренажеры для тестировщика. Где взять практику?

Возвращаемся к нашему любимому вопросу — много теории, мало практики. Где тренироваться тестированию самоучке или человеку, которому не хватает практических заданий на курсах?

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

👉 База вопросов 👉 Новости
❤1
#HTML #CSS #UX #frontend #лайфхак

🔖 HTML лайфхак: Правильная клавиатура на мобильнике

Когда пользователь вводит дату рождения на мобильном — какая клавиатура должна появиться? Цифровая! Но разработчики часто делают так:

<!-- ❌ Неправильно -->
<input type="tel" placeholder="Дата рождения">


Почему type="tel"? Потому что раньше других способов не было. Костыль! 🤦

🔸 Правильный способ

Используй атрибут `inputmode="numeric"`:

<!-- ✅ Правильно -->
<label for="bd">Дата рождения</label>
<input type="text" id="bd" inputmode="numeric">


Что получится

🔸 С type="tel": появляются символы # и * (не нужны для даты)
🔸 С inputmode="numeric": только цифры 0-9 (идеально!)

Другие значения inputmode

<!-- Email -->
<input inputmode="email" placeholder="почта@example.com">

<!-- Телефон -->
<input inputmode="tel" placeholder="+7 9XX XXX XXXX">

<!-- URL -->
<input inputmode="url" placeholder="https://example.com">

<!-- Поиск -->
<input inputmode="search" placeholder="Поиск...">

<!-- Десятичное число -->
<input inputmode="decimal" placeholder="12.99">


🔸 Почему это важно

✅ Юзер видит нужную клавиатуру сразу
✅ Меньше ошибок при вводе
✅ Быстрее заполняет форму
✅ Работает на iOS и Android

🔸 Бонус: выключи автокапитализацию

Для полей "Почта или телефон":

<input type="text" autocapitalize="off" inputmode="numeric">


Буквы остаются строчными. Удобнее вводить почту!
Другие лайфхаки смотри по ссылке ⬇️


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
#Собес #oop #slots #memory_optimization
🤔 Что такое __slots__

💬 Кратко:

__slots__ — это специальный атрибут класса, который ограничивает набор атрибутов, которые можно присваивать экземплярам этого класса. Он помогает экономить память, исключая создание словаря для хранения атрибутов объектов.

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

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
❤1
#алгоритмы #git #diff #программирование #CS

🔖 Знаешь ли ты, почему diff выглядят по-разному в разных инструментах?

Оказывается, это не баг, а фишка алгоритмов!

🔸Проблема

Есть две версии кода. Нужно показать разницу. Логично, что должен быть один правильный diff, верно?

❌ Неправильно! Существует множество "правильных" diff'ов.

Пример:

 a
+b
-c
d


Столь же правильно:

 a
-c
+b
d


Они идентичны, но выглядят совсем по-разному!

💡 Алгоритм Майерса

Большинство инструментов используют алгоритм Майерса. Он находит один из минимальных diff'ов (но не обязательно самый читаемый).

Сложность: O(ND) в обычных случаях, но может деградировать до O(N²) в наихудшем!

🔸 Почему они отличаются

1️⃣ Разная реализация — даже один алгоритм может дать разные результаты
2️⃣ Эвристики — добавляют быстродействие, но жертвуют качеством
3️⃣ Постобработка — переставляют строки, чтобы улучшить читаемость


🔸 Три режима

Есть компромисс между скоростью и качеством:

🔸 Fast — максимум скорости, минимум качества
🔸 Default — баланс (используется везде)
🔸 Minimal — идеальный diff, но медленнее

💡 Главное открытие

Читаемость diff определяется не только алгоритмом, но и его реализацией + постобработкой

Поэтому в GitHub качество выше, чем в простом diff утилите. Они используют лучшую реализацию с постобработкой (indent heuristic).
Подробнее по ссылке ниже ⬇️


📎 Статья

🎙 Новости

📝 База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🧑‍💻 5 вопросов с собесов Frontend разработчиков

1. Как можно синхронизировать работу между главным потоком и воркерами?
Синхронизация между главным потоком и Web Workers осуществляется через механизм сообщений, используя методы postMessage и обработчики onmessage. Главный поток отправляет сообщения в worker, а worker может отвечать тем же способом. Однако синхронизация не является мгновенной, поэтому важно учитывать, что сообщения передаются асинхронно.

2. В чем отличие между microtask queue и task queue?
В JavaScript есть две очереди для обработки асинхронных задач: microtask queue и task queue. Microtask queue содержит задачи, такие как Promise и MutationObserver, которые выполняются после завершения текущего стека выполнения, но перед выполнением задач из task queue. В отличие от этого, task queue содержит задачи, связанные с событиями и таймерами, которые обрабатываются только после выполнения всех микротасков.

3. Как реализовать "ленивые" вычисления (lazy evaluation) в JavaScript?
Ленивые вычисления в JavaScript означают, что результат вычисления будет возвращен только по мере необходимости, а не сразу. Это может улучшить производительность, особенно если результаты не всегда нужны. Ленивые вычисления можно реализовать с помощью функций, возвращающих другие функции или используя генераторы, которые позволяют приостанавливать и возобновлять выполнение.

4. Как работает Web Workers? В чем их преимущества и ограничения?
Web Workers — это скрипты, которые выполняются в фоновом режиме, отделенные от основного потока выполнения. Это позволяет выполнять тяжелые вычисления без блокировки пользовательского интерфейса, что улучшает отзывчивость приложений. Однако Web Workers имеют ограничения, такие как отсутствие доступа к DOM и использование только безопасного контекста.

5. Как использовать MessageChannel для обмена сообщениями между потоками?
MessageChannel — это API в JavaScript, который позволяет создавать канал для обмена сообщениями между потоками, такими как главный поток и Web Workers. Он состоит из двух объектов: port1 и port2, которые можно использовать для отправки и получения сообщений. Этот механизм обеспечивает двустороннюю связь и помогает синхронизировать действия между потоками.

#workers #postmessage #browsr #microtask #mutationobserver #promise #lazy #optimization #функция #worker #browser
🔥2
#repository #swift #frameworks
📚 iOS Awesome

Кураторский список экосистемы iOS, включающий проекты на Objective-C и Swift. Содержит разделы по фреймворкам, инструментам, библиотекам и ресурсам для обучения. Подходит для изучения лучших практик и поиска готовых решений.

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

👉 База вопросов 👉 Новости
#book #blender
📚 Изучаем Blender. Практическое руководство по созданию анимированных 3D-персонажей - Оливер Вильяр

Blender - это не просто программа, а целый мир 3D-графики, и книги по геймдеву часто рекомендуют начинать именно с неё. Оливер Вильяр создал подробное руководство, где шаг за шагом раскрывается процесс создания анимированных персонажей. В книге подробно разбираются интерфейс Blender, основы моделирования, анимация объектов и персонажей, а также оптимизация рабочих процессов.

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

👉 База вопросов 👉 Новости
#Собес #docker #image_optimization
🤔 Какие методы уменьшения объема Docker-образа ты знаешь?

💬 Кратко:

Основные методы: использование многоступенчатой сборки (multi-stage build), выбор минимального базового образа (например, alpine), объединение команд RUN в одну для уменьшения слоёв, использование файла .dockerignore и удаление кэша пакетного менеджера в том же слое, где он использовался.

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

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
👍1
Forwarded from YeaHub
[Версия 1.3.0] - Обновление платформы

Мы продолжаем развивать YeaHub, чтобы сделать обучение ещё удобнее, эффективнее и интереснее. В этом обновлении — важные и давно ожидаемые улучшения 👇

🔹 Навыки и ключевые слова из вакансий HH
Мы запустили сервис, который помогает прокачать резюме с помощью популярных навыков и ключевых слов, встречающихся в вакансиях. Это поможет вам выше ранжироваться в поиске среди кандидатов и увеличит конверсию откликов.
https://yeahub.ru/hh-analytics?page=1&mode=skills&specialization=11

🔹 Исправления и улучшения
Мы учли вашу обратную связь: исправили баги, улучшили интерфейс и сделали работу с платформой ещё комфортнее 🧠

🔥 Скоро
1. Сервис Лайвкодинга с реальными задачами с собеседований

👉 Обучайтесь, общайтесь, растите вместе с https://yeahub.ru

#release #news #update #yeahub
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🔥1
🧑‍💻 Вопросы с собесов для Node.js Разработчика

1. Зачем может быть нужен Middleware в Nest.js
Middleware в Nest.js — это функции, которые выполняются перед обработчиками маршрутов (controller's handlers). Они имеют доступ к объектам запроса и ответа, а также к следующей функции в цепочке middleware. Они используются для таких задач, как логирование, сжатие данных, парсинг cookies, проверка CORS и аутентификация.

#nestjs #middleware
❤1🔥1
#channel #опытные #начинающие
📚 Golovach Courses

GolovachCourses - это небольшой образовательный проект, на котором можно найти сотни видео, посвящённых разным аспектам языка Java. Основатель канала, к слову, ведёт курс "Scala for Java Developers" на проекте Udemy.com. По заявлению самого автора, разнообразие видео удовлетворит как опытных разработчиков, так и новичков, желающих освоить язык с нуля.

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

👉 База вопросов 👉 Новости
❤1
#book #swift
📚 Swift подробно. Чейрд Инт Вейн

Эта книга предназначена для более менее опытных специалистов. В частности, автор рассказывает о том, как разрабатывать ПО для платформ Apple, таких как iOS и Mac, а также на сервере с Linux. Это тоже практическое руководство, с большим количеством примеров, участками кода, задачами для самостоятельного решения.

Книга помогает читателю освоить такие методы, как обобщение, обработка ошибок, протокольно-ориентированное программирование и современные шаблоны Swift. Кроме того, автор щедро делится собственным опытом, включая важные и трудно выявляемые методики, которые он освоил на протяжении работы со Swift.

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

👉 База вопросов 👉 Новости
#Собес #cdn #svg #optimization
🤔 Какие способы оптимизации изображений на веб-странице вы знаете?

💬 Кратко:

Оптимизация изображений включает несколько методов: сжатие изображений (использование форматов WebP, JPEG или PNG), загрузка изображений только по мере необходимости (ленивая загрузка), выбор адаптивных изображений с разными размерами для разных устройств, использование CDN для быстрой доставки и добавление атрибута alt для повышения доступности.

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

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