Что выведет на экран этот код?
Anonymous Quiz
15%
False, False
14%
False, True
30%
True, True
34%
True, False
6%
Better Database Design 💡
Чтобы повысить безопасность и упростить управление доступом, используйте логическую изоляцию с помощью схем.
Пример: создаём отдельную схему и выделяем для неё пользователя, у которого доступ только к своей области данных.
⚡ Идея проста:
Создавайте отдельного пользователя для каждой схемы и используйте разные connection string в приложении. Это уменьшает риски и делает архитектуру чище.
Чтобы повысить безопасность и упростить управление доступом, используйте логическую изоляцию с помощью схем.
Пример: создаём отдельную схему и выделяем для неё пользователя, у которого доступ только к своей области данных.
CREATE SCHEMA Orders;
CREATE SCHEMA Shipping;
-- Orders module can only access its schema
CREATE USER OrdersUser WITH DEFAULT_SCHEMA = Orders;
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::Orders TO OrdersUser;
-- Shipping module can only access its schema
CREATE USER ShippingUser WITH DEFAULT_SCHEMA = Shipping;
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::Shipping TO ShippingUser;
⚡ Идея проста:
Создавайте отдельного пользователя для каждой схемы и используйте разные connection string в приложении. Это уменьшает риски и делает архитектуру чище.
🛡️ Запуск программ с защитой PPL
CreateProcessAsPPL — инструмент для запуска приложений с включенной защитой PPL. Позволяет выбирать уровень защиты для повышения безопасности выполнения программ.
🚀 Основные моменты:
- Поддержка нескольких уровней защиты PPL.
- Удобный интерфейс командной строки.
- Полезен для разработчиков и исследователей безопасности.
📌 GitHub: https://github.com/2x7EQ13/CreateProcessAsPPL
#csharp
CreateProcessAsPPL — инструмент для запуска приложений с включенной защитой PPL. Позволяет выбирать уровень защиты для повышения безопасности выполнения программ.
🚀 Основные моменты:
- Поддержка нескольких уровней защиты PPL.
- Удобный интерфейс командной строки.
- Полезен для разработчиков и исследователей безопасности.
📌 GitHub: https://github.com/2x7EQ13/CreateProcessAsPPL
#csharp
🔍 ZeroTrace: Утечка данных из браузеров и мониторинг клиентов
ZeroTrace — это мощный инструмент для сбора и анализа данных с удалённых клиентских машин. Он поддерживает извлечение паролей, куки и историю браузера, обеспечивая безопасность и эффективность работы.
🚀 Основные моменты:
- Извлечение паролей и куки из Chrome и других браузеров
- Реальное время мониторинга клиентов с анализом соединений
- Безопасная передача данных с шифрованием
- Поддержка различных операционных систем и браузеров
📌 GitHub: https://github.com/luis22d/ZeroTrace-Stealer-13-2026
#csharp
ZeroTrace — это мощный инструмент для сбора и анализа данных с удалённых клиентских машин. Он поддерживает извлечение паролей, куки и историю браузера, обеспечивая безопасность и эффективность работы.
🚀 Основные моменты:
- Извлечение паролей и куки из Chrome и других браузеров
- Реальное время мониторинга клиентов с анализом соединений
- Безопасная передача данных с шифрованием
- Поддержка различных операционных систем и браузеров
📌 GitHub: https://github.com/luis22d/ZeroTrace-Stealer-13-2026
#csharp
Что выведет на экран этот код?
Anonymous Quiz
23%
False False
15%
False True
36%
True True
8%
True False
17%
❌ Exceptions ≠ Errors
Многие разработчики путают эти понятия и проектируют приложения неправильно. Давайте разберём:
Что такое исключение (exception)?
Это ситуация, из которой приложение не может восстановиться.
Пример: критическая ошибка базы данных, повреждённый файл конфигурации.
Что такое ошибка (error)?
Это ожидаемое состояние сбоя или невыполненное предусловие.
Пример: пользователь ввёл неверный пароль, файл не найден, запрос не прошёл валидацию.
👉 Использовать исключения вместо ошибок = анти-паттерн. Так появляется flow control через исключения, который делает код непредсказуемым и запутанным.
Как правильно:
- Ошибки представляем явно в коде (например, через
- Исключения оставляем для действительно неожиданных и фатальных ситуаций.
Бонус: Явные ошибки делают намерения кода прозрачными и облегчают поддержку.
📖 Подробнее: https://milanjovanovic.tech/blog/functional-error-handling-in-dotnet-with-the-result-pattern
#dotnet #cleanCode #architecture
Многие разработчики путают эти понятия и проектируют приложения неправильно. Давайте разберём:
Что такое исключение (exception)?
Это ситуация, из которой приложение не может восстановиться.
Пример: критическая ошибка базы данных, повреждённый файл конфигурации.
Что такое ошибка (error)?
Это ожидаемое состояние сбоя или невыполненное предусловие.
Пример: пользователь ввёл неверный пароль, файл не найден, запрос не прошёл валидацию.
👉 Использовать исключения вместо ошибок = анти-паттерн. Так появляется flow control через исключения, который делает код непредсказуемым и запутанным.
Как правильно:
- Ошибки представляем явно в коде (например, через
Result, Option, Either паттерны). - Исключения оставляем для действительно неожиданных и фатальных ситуаций.
Бонус: Явные ошибки делают намерения кода прозрачными и облегчают поддержку.
📖 Подробнее: https://milanjovanovic.tech/blog/functional-error-handling-in-dotnet-with-the-result-pattern
#dotnet #cleanCode #architecture
В .NET 8 и выше есть библиотеки от Microsoft и обновлённый API Polly — популярной библиотеки для повышения надёжности и обработки сбоев.
С Polly можно легко настроить стратегии:
- повтор запросов (Retry)
- резервные сценарии (Fallback)
- ограничение времени (Timeout)
- контроль частоты (Rate-limiting)
- автоматическое отключение при сбоях (Circuit breaker)
Эти механизмы помогают облачным приложениям оставаться живыми даже в условиях ошибок и перегрузок.
Подробный разбор тут
Please open Telegram to view this post
VIEW IN TELEGRAM
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🧪 Как правильно строить unit-тестирование в проектах с Clean Architecture
Милан Йованович делится опытом: многие проекты терпят неудачу из-за слабого тестирования.
Когда кодовая база растёт, каждое изменение становится рискованным, а уверенность команды в релизах падает.
В Clean Architecture тестируемость — одна из ключевых идей. Unit-тесты позволяют убедиться, что use cases работают так, как задумано требованиями.
📌 Подход Милана к unit-тестированию:
- использовать NSubstitute для моков зависимостей
- проверять все happy paths
- покрывать все failure paths
- обязательно тестировать обработку исключений
Такой набор тестов помогает сохранить надёжность логики и уверенность в изменениях.
✍️ Подробный разбор с пошаговым объяснением можно прочитать в его статье
Милан Йованович делится опытом: многие проекты терпят неудачу из-за слабого тестирования.
Когда кодовая база растёт, каждое изменение становится рискованным, а уверенность команды в релизах падает.
В Clean Architecture тестируемость — одна из ключевых идей. Unit-тесты позволяют убедиться, что use cases работают так, как задумано требованиями.
📌 Подход Милана к unit-тестированию:
- использовать NSubstitute для моков зависимостей
- проверять все happy paths
- покрывать все failure paths
- обязательно тестировать обработку исключений
Такой набор тестов помогает сохранить надёжность логики и уверенность в изменениях.
✍️ Подробный разбор с пошаговым объяснением можно прочитать в его статье
🛠️ Инструмент для дампа памяти защищённых процессов
WSASS использует старую программу WerfaultSecure.exe для создания дампов памяти процессов, защищённых PPL, таких как LSASS.EXE. Выходные данные сохраняются в формате MINIDUMP, с автоматической заменой заголовка на PNG для удобства.
🚀 Основные моменты:
- Дамп защищённых процессов с помощью WerfaultSecure.exe
- Выход в формате Windows MINIDUMP
- Автоматическая замена заголовка файла
- Полезен для анализа безопасности
📌 GitHub: https://github.com/TwoSevenOneT/WSASS
#csharp
WSASS использует старую программу WerfaultSecure.exe для создания дампов памяти процессов, защищённых PPL, таких как LSASS.EXE. Выходные данные сохраняются в формате MINIDUMP, с автоматической заменой заголовка на PNG для удобства.
🚀 Основные моменты:
- Дамп защищённых процессов с помощью WerfaultSecure.exe
- Выход в формате Windows MINIDUMP
- Автоматическая замена заголовка файла
- Полезен для анализа безопасности
📌 GitHub: https://github.com/TwoSevenOneT/WSASS
#csharp
GitHub
GitHub - TwoSevenOneT/WSASS: This is the tool to dump the LSASS process on modern Windows 11
This is the tool to dump the LSASS process on modern Windows 11 - TwoSevenOneT/WSASS
В какой строке возникнет ПЕРВАЯ ошибка
Anonymous Quiz
40%
1
29%
2
11%
3
2%
4
18%
ошибки не возникнет
🪄 magictools — curated-подборка инструментов и ресурсов для разработки игр
Если ты занимаешься геймдевом — этот репозиторий настоящий клад для поиска подходящих инструментов! Вот что внутри:
- Графика: от placeholders до редакторов и генераторов персонажей
- Spritesheets и анимация: инструменты для упаковки и обработки
- Фреймворки и движки: 2D/3D, физика, GUI, звук, освещение, генерация ландшафта и кастомные пайплайны
- Аудио и музыка: коллекции звуков и редакторы
- Книги, видео, подкасты, журналы и блоги: образовательное и вдохновляющее содержание
- Game Jam сообщества, исходники игр, управление проектами — всё в одном месте!
- Плюс разделы по AI, обучению, инструментам общего развития и прочему ценному
Этот список постоянно растёт и обновляется — отличное решение, чтобы не запутаться в инструментариуме.
https://github.com/ellisonleao/magictools
#GameDev #Ресурсы #Инструменты
Если ты занимаешься геймдевом — этот репозиторий настоящий клад для поиска подходящих инструментов! Вот что внутри:
- Графика: от placeholders до редакторов и генераторов персонажей
- Spritesheets и анимация: инструменты для упаковки и обработки
- Фреймворки и движки: 2D/3D, физика, GUI, звук, освещение, генерация ландшафта и кастомные пайплайны
- Аудио и музыка: коллекции звуков и редакторы
- Книги, видео, подкасты, журналы и блоги: образовательное и вдохновляющее содержание
- Game Jam сообщества, исходники игр, управление проектами — всё в одном месте!
- Плюс разделы по AI, обучению, инструментам общего развития и прочему ценному
Этот список постоянно растёт и обновляется — отличное решение, чтобы не запутаться в инструментариуме.
https://github.com/ellisonleao/magictools
#GameDev #Ресурсы #Инструменты
🧭 Зачем нужен service discovery?
Проблема микросервисов проста: как сервисам надёжно находить и вызывать друг друга? Жёстко прописанные IP и порты ломаются при любом масштабировании, перезапуске, автосборке или миграции.
Что делает service discovery
- Даёт логические имена вместо физических адресов (users-api, billing, auth).
- Динамически находит живые инстансы и балансирует запросы.
- Упрощает масштабирование, blue/green-деплой и отказоустойчивость.
Как это работает (базовый поток)
1) Сервис регистрируется в реестре (name → адреса, порты, метаданные, health).
2) Клиент запрашивает реестр и получает актуальный адрес.
3) Клиент шлёт запрос по полученному адресу (часто с ретраями и timeouts).
Паттерны
- Client-side discovery: клиент сам спрашивает реестр (Consul, Eureka).
- Server-side discovery: маршрутизация через прокси/ингресс (Envoy, API-шлюз).
- K8s-вариант: встроенный DNS/Services дают стабильные имена.
Что выбрать
- Consul/Eureka — когда вы не в Kubernetes или хотите гибкий реестр и health-чеки.
- K8s Services — когда всё крутится в Kubernetes.
- Envoy/Traefik/API-шлюз — если нужен серверный роутинг, канареечные релизы, mTLS.
Как внедрить в .NET (пример с Consul)
- Поднимите Consul-агент (dev/cluster), включите health-чеки (HTTP/TCP/TTL).
- Регистрируйте сервис на старте приложения: имя, адрес, порт, теги, check.
- Разрешайте адреса через:
- Consul API (client-side discovery в коде .NET),
- или DNS-запросы вида
- или через sidecar/Envoy, чтобы вынести логику сетевого стека из приложения.
- Добавьте политики устойчивости (Polly): retries, circuit breaker, timeouts.
- Пропишите deregistration при остановке, чтобы не висели «мертвые» инстансы.
- Логи/метрики: мониторьте failing-чеки, латентность и распределение трафика.
✨ Пример в .NET:
Итог
Service discovery — это «телефонная книга» вашего продакшена. Без него микросервисы быстро превращаются в хрупкий клубок адресов и ручных костылей. В .NET связка Consul + health-чеки + политики устойчивости даёт простой и надёжный старт.
Для пошагового гайда по .NET и Consul ищите разбор Milan Jovanovic «Service discovery in microservices with .NET and Consul».
Проблема микросервисов проста: как сервисам надёжно находить и вызывать друг друга? Жёстко прописанные IP и порты ломаются при любом масштабировании, перезапуске, автосборке или миграции.
Что делает service discovery
- Даёт логические имена вместо физических адресов (users-api, billing, auth).
- Динамически находит живые инстансы и балансирует запросы.
- Упрощает масштабирование, blue/green-деплой и отказоустойчивость.
Как это работает (базовый поток)
1) Сервис регистрируется в реестре (name → адреса, порты, метаданные, health).
2) Клиент запрашивает реестр и получает актуальный адрес.
3) Клиент шлёт запрос по полученному адресу (часто с ретраями и timeouts).
Паттерны
- Client-side discovery: клиент сам спрашивает реестр (Consul, Eureka).
- Server-side discovery: маршрутизация через прокси/ингресс (Envoy, API-шлюз).
- K8s-вариант: встроенный DNS/Services дают стабильные имена.
Что выбрать
- Consul/Eureka — когда вы не в Kubernetes или хотите гибкий реестр и health-чеки.
- K8s Services — когда всё крутится в Kubernetes.
- Envoy/Traefik/API-шлюз — если нужен серверный роутинг, канареечные релизы, mTLS.
Как внедрить в .NET (пример с Consul)
- Поднимите Consul-агент (dev/cluster), включите health-чеки (HTTP/TCP/TTL).
- Регистрируйте сервис на старте приложения: имя, адрес, порт, теги, check.
- Разрешайте адреса через:
- Consul API (client-side discovery в коде .NET),
- или DNS-запросы вида
service-name.service.consul (удобно для простых клиентов),- или через sidecar/Envoy, чтобы вынести логику сетевого стека из приложения.
- Добавьте политики устойчивости (Polly): retries, circuit breaker, timeouts.
- Пропишите deregistration при остановке, чтобы не висели «мертвые» инстансы.
- Логи/метрики: мониторьте failing-чеки, латентность и распределение трафика.
✨ Пример в .NET:
builder.Services
.AddHttpClient<ReportingServiceClient>(client =>
{
client.BaseAddress = new Uri("https://reporting-service");
})
.AddServiceDiscovery()
.AddRoundRobinLoadBalancer();
Итог
Service discovery — это «телефонная книга» вашего продакшена. Без него микросервисы быстро превращаются в хрупкий клубок адресов и ручных костылей. В .NET связка Consul + health-чеки + политики устойчивости даёт простой и надёжный старт.
Для пошагового гайда по .NET и Consul ищите разбор Milan Jovanovic «Service discovery in microservices with .NET and Consul».
⚙️ Создание фоновых задач в .NET с Quartz
Если тебе нужно планировать фоновые задачи в .NET — попробуй Quartz.
Всё просто: реализуешь интерфейс, регистрируешь задачу — и Quartz берёт на себя расписание и выполнение.
✨ Что делает Quartz удобным:
- Глубокая интеграция с Dependency Injection — можно внедрять сервисы, логеры и репозитории;
- Scoped-область задач — безопасно использовать
- Умный планировщик: без ручных таймеров и бесконечных циклов.
После Quartz уже не хочется возвращаться к ручным решениям.
📘 Подробный гайд по продвинутой работе с Quartz в .NET
Если тебе нужно планировать фоновые задачи в .NET — попробуй Quartz.
Всё просто: реализуешь интерфейс, регистрируешь задачу — и Quartz берёт на себя расписание и выполнение.
✨ Что делает Quartz удобным:
- Глубокая интеграция с Dependency Injection — можно внедрять сервисы, логеры и репозитории;
- Scoped-область задач — безопасно использовать
DbContext без проблем с жизненным циклом; - Умный планировщик: без ручных таймеров и бесконечных циклов.
После Quartz уже не хочется возвращаться к ручным решениям.
📘 Подробный гайд по продвинутой работе с Quartz в .NET
Что выведет на экран этот код?
Anonymous Quiz
27%
A42
16%
A6
10%
G
23%
71
22%
Код не скомпилируется
4%
А ты правильно называешь свои DTO? 🤔
DTO (Data Transfer Object) — это объект передачи данных.
Проще говоря, это класс или структура, которая используется, чтобы передавать данные между слоями приложения или между сервером и клиентом (например, в API).
Когда ты создаёшь Web API, твои эндпоинты принимают и отдают данные.
Обычно такие модели называют с суффиксом DTO (Data Transfer Object).
Но вот в чём проблема 👇
❌ DTO часто смешивают входные и выходные данные в одном классе.
❌ Со временем такие классы разрастаются и становятся неразберихой.
👉 Лучше использовать суффиксы Request и Response:
• CreateUserRequest — для входных данных
• UserResponse — для выходных
Почему это лучше:
✅ Понятнее — сразу видно, для чего модель.
✅ Масштабируемо — изменения в Response не ломают Request.
✅ Удобнее сопровождать — не нужно гадать, что делает UserDto.
📌 Совет: какую бы схему ты ни выбрал — будь последовательным и используй её во всём проекте.
А ты используешь Request/Response или по-старинке DTO? 👇
DTO (Data Transfer Object) — это объект передачи данных.
Проще говоря, это класс или структура, которая используется, чтобы передавать данные между слоями приложения или между сервером и клиентом (например, в API).
Когда ты создаёшь Web API, твои эндпоинты принимают и отдают данные.
Обычно такие модели называют с суффиксом DTO (Data Transfer Object).
Но вот в чём проблема 👇
❌ DTO часто смешивают входные и выходные данные в одном классе.
❌ Со временем такие классы разрастаются и становятся неразберихой.
👉 Лучше использовать суффиксы Request и Response:
• CreateUserRequest — для входных данных
• UserResponse — для выходных
Почему это лучше:
✅ Понятнее — сразу видно, для чего модель.
✅ Масштабируемо — изменения в Response не ломают Request.
✅ Удобнее сопровождать — не нужно гадать, что делает UserDto.
📌 Совет: какую бы схему ты ни выбрал — будь последовательным и используй её во всём проекте.
А ты используешь Request/Response или по-старинке DTO? 👇