Библиотека шарписта | C#, F#, .NET, ASP.NET
23K subscribers
2.22K photos
32 videos
85 files
4.37K links
Все самое полезное для C#-разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
🧑‍💻 Тестирование API без выдумок

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

Подготовили для вас промпт, чтобы данные не нужно было придумывать самостоятельно:
You are a highly skilled C# Developer and Tester, specializing in creating robust and reliable REST APIs. Your expertise lies in generating diverse and comprehensive test data to thoroughly stress test APIs, uncovering potential vulnerabilities and ensuring optimal performance under heavy load. Your goal is to create a C# program that generates a wide range of test data, specifically focusing on boundary conditions and error scenarios, to effectively stress test a given REST API.

Here is the format you will use to reason through the problem and come up with a fantastic recommendation:

---

## REST API Endpoint Description
$api_endpoint_description (Include the HTTP method, expected request body format, and expected response format)

## Data Types and Constraints
$data_types_and_constraints (Specify the data types of each field in the request body and any constraints, such as minimum/maximum values, allowed characters, or specific formats)

## Boundary Condition Test Data
$boundary_condition_test_data (Generate test data that pushes the limits of the defined constraints. Include examples of minimum values, maximum values, values just outside the allowed range, and edge cases.)

### Example Boundary Condition Test Data Entry
```json
{
"field1": "boundary_value_1",
"field2": "boundary_value_2",
...
}
```

## Error Condition Test Data
$error_condition_test_data (Generate test data that intentionally violates the defined constraints. Include examples of invalid data types, missing required fields, incorrect formats, and malicious input.)

### Example Error Condition Test Data Entry
```json
{
"field1": "invalid_value_1",
"field2": "missing_field",
...
}
```

## C# Code for Test Data Generation
$csharp_code (Provide the C# code that generates the boundary and error condition test data. The code should be well-commented and easy to understand.)

## Explanation of the C# Code
$csharp_code_explanation (Explain the logic behind the C# code, highlighting how it generates the different types of test data and how it can be easily adapted to different REST APIs.)

## Considerations for Stress Testing
$stress_testing_considerations (Discuss important considerations for stress testing the REST API, such as the number of concurrent requests, the duration of the test, and the metrics to monitor.)


🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62🔥2
🛠 Чек-лист по настройке и ведению репозитория .NET-проекта

Составили для вас чек-лист для организации репозитория .NET-проекта. Получился мини-гайд, который можно скинуть джуну.

Проверьте URL репозитория

• Убедитесь, что имя аккаунта, название репозитория и основная ветка (main или master) соответствуют соглашениям команды.

• Проверьте, нет ли опечаток или лишних символов в пути.

Добавьте файл LICENSE

• Поместите в корень проекта файл с лицензией (MIT, Apache, GPL и т. д.).

• Проверьте, что текст лицензии актуален и соответствует требованиям компании.

Настройте .gitignore

• Используйте готовые шаблоны для .NET (VisualStudio, Rider): исключите bin/, obj/, настройки IDE, файлы сборки.

• При необходимости добавьте игнорацию пользовательских секретов и сертификатов.
bin/
obj/
*.user
*.suo


Создайте файл .gitattributes

Задайте нормализацию переводов строк:
* text=auto
*.ps1 text eol=crlf


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

Подробный README.md

• Опишите назначение проекта, его архитектуру и ключевые зависимости.

• Дайте инструкции по установке, настройке и запуску (команды CLI, порты, переменные окружения).

• Приведите пример запуска основных сценариев.

Проект тестов

• Создайте отдельный тестовый проект (.Tests) и убедитесь, что все тесты проходят при команде dotnet test.

• Добавьте в README badge с процентом покрытия (например, через Coveralls или Azure Pipelines).

CI/CD через GitHub Actions

• Разместите workflow в .github/workflows/ci.yml: сборка, тесты, анализ кода.

• Опционально — настройте деплой на тестовый или продакшен-стенд.
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-dotnet@v1
with: { dotnet-version: '7.0.x' }
- run: dotnet build --no-restore
- run: dotnet test --no-build --verbosity normal


Файлы CODE_OF_CONDUCT.md и CONTRIBUTING.md

• CODE_OF_CONDUCT.md определяет правила поведения участников.

CONTRIBUTING.md описывает, как создавать issue, форкать проект и оформлять PR.

Метки и темы

• Настройте лейблы для Issue/PR: bug, enhancement, help wanted, good first issue.

• Добавьте в репозиторий релевантные темы (например, csharp, dotnet-core, webapi).

Badge-значки в README

• Статус сборки (Build Passing/Failing).

• Процент покрытия тестами.

• Поддерживаемые версии .NET.

Сколько «галочек» из списка содержит ваш проект?

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
😁98👍4🔥1
👀 Эффективный доступ к данным в .NET

В рамках трансляции On .NET Live ведущие разобрали, как через чёткие интерфейсы Repository и паттерн Specification вынести всю логику запросов из бизнес-слоя, чтобы не забирать в память лишние данные и легко мокировать код для тестов.

Также обсудили компромиссы generic-репозиториев и показали, как Unit of Work возвращает настоящую транзакционность, вызывая SaveChanges() один раз в конце.

➡️ Смотреть запись трансляции

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3🥱3😁1
⚡️ Быстро и без облака

Теперь разработчики могут генерировать альтернативный текст для изображений прямо в своем приложении.

Вместо того чтобы отправлять запросы в облачные сервисы, можно использовать локально размещенные модели, например Ollama.

Для этого достаточно запустить простой скрипт на C#, который анализирует изображение и генерирует для него текстовое описание.

➡️ Узнать как это сделать

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😁2
🚀 Анализ изменений с git log

Команда git log позволяет понять, как эволюционировал код — просмотреть последовательность коммитов и метаданные.

Просмотр истории:
git log


История коммитов построчно:
git log --oneline


Граф веток + метки (ветки, теги) для всех веток:
git log --graph --decorate --all


Показать diff последних двух коммитов:
git log -p -2


Коммиты за последние 2 недели от указанного автора:
git log --since="2 weeks ago" --author="ProgLib"


Настраиваемый формат: короткий хеш, дата, сообщение, автор:
git log --pretty=format:"%h %ad | %s%d [%an]" --date=short


💬 Вы смотрите историю log'ом или используете сторонние инструменты?

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰72❤‍🔥1
⚡️ Асинхронная обработка в C#

Асинхронные потоки IAsyncEnumerable позволяют эффективно обрабатывать последовательности данных, поступающих с задержками. В целом это положительно влияет на пользовательский опыт и скорость работы приложения

1. Базовый синтаксис:
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

static async IAsyncEnumerable<int> GenerateSequenceAsync(int count, [EnumeratorCancellation] CancellationToken token = default)
{
for (int i = 0; i < count; i++)
{
// Симулируем асинхронную задержку
await Task.Delay(100, token);
yield return i;
}
}

static async Task ConsumeAsync()
{
await foreach (var item in GenerateSequenceAsync(5))
{
Console.WriteLine($"Получено значение: {item}");
}
}


• Ключевое слово async перед IAsyncEnumerable<T>.

yield return внутри асинхронного метода.

await foreach для потребления.

2. Обработка отмены и ошибок:
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1));
try
{
await foreach (var item in GenerateSequenceAsync(10, cts.Token).WithCancellation(cts.Token))
{
Console.WriteLine(item);
}
}
catch (OperationCanceledException)
{
Console.WriteLine("Операция была отменена.");
}


• Передаём CancellationToken через атрибут [EnumeratorCancellation].

• Используем метод расширения .WithCancellation(token) для явной поддержки отмены в await foreach.

3. Советы по применению

• Всегда учитывайте семантику отмены: пробрасывайте CancellationToken до источника потока.

• Избегайте долгих синхронных операций внутри цикла генерации — это сведёт на нет преимущества асинхронности.

• При больших объёмах данных комбинируйте с буферизацией через Channel<T> для сглаживания пиковой нагрузки.

💬 Нужны более продвинутые сценарии по использованию асинхронности? Пишите свои хотелки в комментариях, а мы их обязательно исполним 👇

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍104🔥1😁1
✏️ Промпт для пет-проектов

Мы составили для вас промпт, который поможет выбрать идею для вашего следующего пет-проекта. Никаких долгих раздумий, используете промпт и к разработке.

Промпт:
You are a fun-loving and creative C# developer, brimming with enthusiasm for coding and always eager to explore new and exciting projects. Your goal is to brainstorm a list of engaging and manageable pet-project ideas that leverage your C# skills. These projects should be fun to build, relatively self-contained, and offer opportunities for learning and experimentation. Finally, you will choose the most appealing project and outline the initial steps for getting started.


Это отличный способ не только генерировать идеи, но и подойти к созданию чего-то нового нестандартным способом.

Занимаетесь пет проектами? Поставьте 👍, если да и 👾, если нет.

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21👾103😁2🌚1
⚙️ Быстро потестить строку кода

Иногда нам нужно на примере узнать как отработает LINQ запрос, к примеру.

Можно пойти старым путём и создать отдельный файл в проекте с названием «Test123», но Rider предлагает иной вариант.

Если Rider у вас настроен под хоткеи от Intellij, то достаточно одновременно нажать:
Ctrl + Alt + Shift + Insert


И IDE создаст вам временный файл, который не будет добавлен в контекст проекта.

Просто, быстро и без боли.

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤔52🔥2
📁 Файл с инструкциями вместо тысячи запросов

Представьте: один файлик — и все последующие автодополнения подстраиваются под ваш корпоративный стандарт.

В блоге .NET показали, как создать такой файл и навсегда забыть о рутине при работе с GitHub Copilot.

Создаёте в корне репозитория папку .github/ и внутри неё — copilot-instructions.md.
В шапке указываете, к каким файлам применить правила, а дальше описываете свои стандарты

➡️ Dev блог Microsoft

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🌚31
⚙️ Параллельная асинхронная обработка

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

🛠 Дождаться всех задачTask.WhenAll

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

1. Запускаем задачи параллельно:
var loadUsers   = LoadUsersAsync();   // загрузка списка пользователей
var loadOrders = LoadOrdersAsync(); // загрузка списка заказов
var loadCatalog = LoadCatalogAsync(); // загрузка каталога товаров


2. Ждём завершения всех
await Task.WhenAll(loadUsers, loadOrders, loadCatalog);


3. Получаем результаты
var users   = await loadUsers;   // List<User>
var orders = await loadOrders; // List<Order>
var catalog = await loadCatalog; // List<Product>
Console.WriteLine($"Пользователей: {users.Count}, заказов: {orders.Count}, позиций: {catalog.Count}");


Для задач с возвращаемым значением WhenAll вернёт массив результатов в том же порядке.

Если нужно ограничить количество одновременных операций — обёрните запуск через SemaphoreSlim.

Передавайте CancellationToken во все методы, чтобы можно было прервать все сразу.

🛠 Дождаться первой завершившейся задачиTask.WhenAny

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

1. Запускаем конкурирующие задачи
var t1 = GetFromCacheAsync(userId, ct);
var t2 = GetFromDatabaseAsync(userId, ct);
var t3 = GetFromApiAsync(userId, ct);


2. Ждём первую завершившуюся
Task<Task<User?>> first = Task.WhenAny(t1, t2, t3);
Task<User?> winner = await first;


3. Получаем и обрабатываем результат

User? user = await winner;  
if (user != null)
Console.WriteLine($"Данные получены от {GetSourceName(winner)}");
else
Console.WriteLine("Пустой ответ от первого источника");


Передавайте единый CancellationToken через CancellationTokenSource, чтобы отменять все задачи разом.

Назначайте разумный таймаут через Task.WhenAny с Task.Delay, чтобы не ждать вечно:
var timeoutTask = Task.Delay(TimeSpan.FromSeconds(5), ct);
var winner = await Task.WhenAny(t1, t2, t3, timeoutTask);
if (winner == timeoutTask) throw new TimeoutException();


Для большого числа конкурирующих операций рассматривайте использование Channel или Dataflow вместо запуска сотен Task.

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16😁21👾1
⚙️ Утилиты для асинхронного программирования

AsyncEx — библиотека, которая облегчает работу с асинхронными операциями, предоставляя готовые решения для синхронизации, ожидания и контроля выполнения задач.

Что есть под капотом

• AsyncLock — это асинхронный мьютекс, который позволяет синхронизировать доступ к ресурсу без блокировки потока.

В отличие от стандартных синхронных мьютексов, AsyncLock работает асинхронно, что предотвращает блокировку потоков в многозадачных приложениях.

• AsyncSemaphore — это асинхронная версия семафора, которая ограничивает количество одновременно выполняющихся задач.

• AsyncLazy — это асинхронная версия Lazy<T>. Она позволяет отложить выполнение ресурсоёмких операций до тех пор, пока они действительно не потребуются, при этом поддерживает асинхронный контекст.

• AsyncConditionVariable— это механизм синхронизации, позволяющий ожидать и уведомлять асинхронные задачи о состоянии ресурса.

• AsyncEvent — это асинхронная версия событий в C#, которая позволяет обрабатывать подписчиков и уведомления асинхронно.

• TaskHelper — утилита для работы с задачами, которая упрощает код для ожидания и обработки результатов асинхронных операций.

Как начать использовать

1. Просто установите библиотеку через NuGet:
Install-Package Nito.AsyncEx


➡️ Глянуть репозиторий либы

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍143🔥2😁2
👀 Запускаем Python из C#

Бу, испугались? А мы да. Нашли видео, в котором запускается Python из C# кода, а в коде на Python запускаются либы, написанные на Си.

Звучит пугающе и выглядит не менее устрашающе.

➡️ Смотреть видео

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
😁16🌚5👍2
👨‍💻 Мгновенная валидация кода

В стремительном темпе разработки важно улавливать ошибки сразу же после правки.

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

Команда дня:
dotnet watch test --filter "Category=Unit"


Эта команда активирует «наблюдение» за исходниками проекта и при каждом изменении автоматически запускает только те тесты, которые помечены категорией Unit.

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

Если вы хотите параллельно следить и за интеграционными тестами, достаточно изменить фильтр:
dotnet watch test --filter "Category=Integration"


Ещё и интегрировать со скриптами и конвейерами проще простого.

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍41🥱1
🛠 Кастомная обработка событий

NEsper — это библиотека для .NET, предназначенная для сложной обработки событий.

Она позволяет анализировать потоки данных в реальном времени с минимальной задержкой, используя принципы, похожие на SQL, но для событий.

Основные возможности:

• Обрабатывайте события по мере их поступления, выявляйте аномалии или интересные паттерны без задержки.

• Язык для описания правил обработки событий, чем-то похож на SQL, что делает его удобным для разработчиков.

• Поддерживает распределённые системы и интегрируется с Кафкой и RabbitMQ.

Пример использования:
using EsperTech.NEsper;
using EsperTech.NEsper.Client;
using EsperTech.NEsper.Config;

var config = new Configuration();
config.AddEventType("MyEvent", typeof(MyEvent));

var epService = EPServiceProviderManager.GetDefaultProvider(config);
var epStatement = epService.EPAdministrator.CreateEPL("select * from MyEvent where value > 100");

epStatement.Events += (sender, e) =>
{
foreach (var ev in e.NewEvents)
{
Console.WriteLine($"Detected event: {ev.Get("value")}");
}
};


В этом примере создаётся обработчик событий, который срабатывает, когда значение события превышает 100.

Такой шустрый инструмент пригодится в финансах, мониторинге и для обнаружения аномалий.

➡️ Обработать все события

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3
👩‍💻 Управляем несколькими ветками одновременно

Git worktrees — это возможность использовать несколько рабочих деревьев (worktrees) для одного репозитория.

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

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

1. Вы создаете новый worktree для выбранной ветки. В результате появляется отдельный каталог, где будет находиться эта ветка:
git worktree add ../my-feature-branch my-feature-branch


2. После создания worktree вы можете работать с веткой, не вмешиваясь в другие ветки. Это удобно, когда нужно параллельно тестировать изменения или делать ревью PR, не мешая текущей работе.

Когда работа с веткой завершена, можно её удалить:
git worktree remove ../my-feature-branch


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

Если вам нужно протестировать PR, вы можете создать отдельный worktree для его ветки:
git worktree add ../pr-branch pr-branch
cd ../pr-branch


Применяйте и властвуйте над ветками гита.

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔81
✏️ Промпт для создания абстракции

Мы подготовили для вас полезный промпт, который поможет создать абстракцию для любой задачи.

Используйте его, чтобы сделать ваш код более гибким, расширяемым и удобным для поддержки.

Промпт:
Опиши, как создать абстракцию для задачи "[вставьте краткое описание задачи]" с использованием методик объектно-ориентированного проектирования. В ответе подробно изложи основные этапы проектирования абстракции, включая выявление ключевых классов и их ответственности, применение принципов SOLID и паттернов проектирования. Добавь пример кода на С# или диаграмму классов UML, иллюстрирующую предложенную абстракцию.


Хороший способ улучшить архитектуру вашего кода и овладеть лучшими практиками ООП.

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤩2🌚1👾1
🧑‍💻 Как отменить асинхронную операцию с помощью CancellationToken

Одной из ключевых особенностей асинхронного программирования в C# является возможность отменить долгие или зависшие операции, используя CancellationToken.

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

Для создания токена отмены используется объект типа CancellationTokenSource, который предоставляет токен для отмены, а также метод Cancel(), который сигнализирует об отмене.

Пример отмены с помощью токена. Вызываем функцию и передаём в неё токен:
using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
// Создаем объект CancellationTokenSource
var cancellationTokenSource = new CancellationTokenSource();

// Получаем токен отмены
var cancellationToken = cancellationTokenSource.Token;

// Запускаем асинхронную задачу
var task = LongRunningOperation(cancellationToken);

// Через 3 секунды отменяем операцию
await Task.Delay(3000);
cancellationTokenSource.Cancel();

try
{
// Ожидаем завершения операции
await task;
}
catch (OperationCanceledException)
{
Console.WriteLine("Операция была отменена.");
}
}
}


Сама функция:
// Асинхронная операция, которая может быть отменена
static async Task LongRunningOperation(CancellationToken cancellationToken)
{
Console.WriteLine("Операция началась.");

for (int i = 0; i < 10; i++)
{
// Проверка на отмену операции
if (cancellationToken.IsCancellationRequested)
{
Console.WriteLine("Операция отменена.");
throw new OperationCanceledException();
}

// Имитация работы
Console.WriteLine($"Шаг {i + 1}...");
await Task.Delay(1000); // Задержка в 1 секунду
}

Console.WriteLine("Операция завершена.");
}
}


При отмене операции метод выбрасывает исключение OperationCanceledException, которое можно ловить и обрабатывать соответствующим образом.

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍98😁3🥱1
💻 Удалённая разработка в Rider

Не всегда нужно хранить код у себя на пк. Хранение и выполнение кода на удалённых хостах и контейнерах давно стало реальностью.

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

Подключение к серверу через SSH

Настроить SSH-подключение в Rider — проще, чем вы думаете. Всё, что нужно — это пару кликов в настройках IDE.

1. Откройте File → Settings → Tools → Deployment.

2. Выберите Add Remote Server и в качестве типа соединения выберите SSH.

3. Введите IP-адрес удалённого сервера, пользовательские данные и путь к приватному ключу (или пароль).

4. Нажмите Test Connection и, если всё в порядке, готово — подключение установлено!

🧑‍💻 Работа с проектами на удалённом сервере

Когда подключение установлено, вы получаете доступ к файловой системе удалённого сервера. Это значит, что вы можете:

• Перемещать файлы между локальной машиной и сервером

• Редактировать код, компилировать и запускать его на сервере.

• Открывать логи, работать с конфигурационными файлами и запускать процессы прямо из Rider.

Один из самых полезных инструментов при удалённой разработке — это отладка через SSH.

Вы можете подключиться к процессу, который работает на удалённом сервере, и отлаживать код, как если бы он выполнялся локально.

Чтобы начать удалённую отладку:

1. Запустите приложение на удалённом сервере

2. Выберите Run → Edit Configurations и создайте конфигурацию для Remote Debugging.

3. Подключитесь к удалённому процессу через SSH и начинайте отладку прямо из Rider.

Если вы ещё не настроили SSH в Rider, самое время попробовать.

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍7
⚡️ Следим за свежестью NuGet-пакетов

Многие проекты на .NET годами живут со старыми версиями зависимостей. Это не видно на глаз, но может привести к уязвимостям или проблемам с производительностью.

Чтобы избавиться от этого нужно установить:
dotnet tool install --global dotnet-outdated-tool


И запустить:
dotnet outdated


Дополнительно можно использовать флаги:
--include-transitive: показывает даже вложенные зависимости
--upgrade: автоматически обновляет зависимости
--fail-on-updates: делает ошибку в CI, если есть устаревшие


Запускайте хотя бы раз в неделю и спина не будет болеть ваш проект будет всегда свежий.

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍4😁4🥱2
👨‍💻 Чек-лист здорового разработчика

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

Отключитесь от рабочих задач

• Убедитесь, что все рабочие приложения и уведомления выключены.

• Уведомите коллег и руководителей о том, что вы в отпуске или берете перерыв.

• Установите автоответчик.

Создайте четкие границы для работы и отдыха

• Установите в календаре блоки времени для отдыха, чтобы не случайно «передвинуть» их.

• Избегайте переноса рабочих задач в личное время.

Заботьтесь о теле

• Уделите внимание физической активности: прогулки на свежем воздухе, легкие тренировки или йога.

• Спите не менее 7-8 часов в сутки, соблюдая режим.

• Пройдите профилактические осмотры у врача.

Снимите умственное напряжение

• Прекратите думать о рабочих задачах и проектах.

• Проводите время с людьми, которые вам нравятся и с которыми вы можете расслабиться.

• Начните новое хобби или займитесь творчеством: рисование, кулинария, музыка.

Правильное питание и здоровье

• Старайтесь питаться сбалансированно и включать больше свежих продуктов.

• Уделите внимание питьевому режиму — пейте больше воды и избегайте чрезмерного употребления кофе.

• Избегайте тяжелых и жирных продуктов, особенно перед сном.

Баланс между отдыхом и продуктивностью

• Найдите баланс между активностями и отдыхом. Не перегружайте себя мероприятиями.

• Помните, что отдых должен приносить удовольствие, а не ощущение усталости или перегрузки.

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
6