#dotnet #husky #devtools
🧙♂️ Husky.NET: Автоматизация проверок кода в .NET проектах
Хотите повысить качество кода и автоматизировать проверку коммитов? Тогда вам стоит узнать о Husky.NET!
Husky.NET позволяет легко добавлять pre-commit хуки в ваши .NET проекты. Это инструмент, который поможет вам:
- Автоматически запускать тесты перед каждым коммитом
- Проверять код на соответствие стандартам с помощью линтеров
- Избегать распространенных ошибок и поддерживать чистоту кода
🔗 Подробнее о Husky.NET читайте в статье: https://www.code4it.dev/blog/husky-dotnet-precommit-hooks/
Не упустите возможность сделать процесс разработки более эффективным и надежным! 🚀
💡 Канал | 💬 Чат
🧙♂️ Husky.NET: Автоматизация проверок кода в .NET проектах
Хотите повысить качество кода и автоматизировать проверку коммитов? Тогда вам стоит узнать о Husky.NET!
Husky.NET позволяет легко добавлять pre-commit хуки в ваши .NET проекты. Это инструмент, который поможет вам:
- Автоматически запускать тесты перед каждым коммитом
- Проверять код на соответствие стандартам с помощью линтеров
- Избегать распространенных ошибок и поддерживать чистоту кода
🔗 Подробнее о Husky.NET читайте в статье: https://www.code4it.dev/blog/husky-dotnet-precommit-hooks/
Не упустите возможность сделать процесс разработки более эффективным и надежным! 🚀
💡 Канал | 💬 Чат
Code4IT
Pre-commit hooks with Husky.NET - build, format, and test your .NET application before a Git commit
A Git commit represents the status of a system. Learn how to validate that your code builds, is well-formatted, and all the tests pass by adding a Git hook!
🤔1
#dotnet
🚀 UUID v7 в .NET 9: Прорыв в генерации уникальных идентификаторов
Steven Giesel в своей новой статье представляет UUID версии 7 для .NET 9. Основное преимущество UUID v7 - временной штамп, который делает его идеальным для баз данных, улучшая сортировку записей. Новый метод
🔗 Подробнее здесь: https://steven-giesel.com/blogPost/ea42a518-4d8b-4e08-8f73-e542bdd3b983
Разработчики оценят эту инновацию за её удобство и эффективность!
💡 Канал | 💬 Чат
🚀 UUID v7 в .NET 9: Прорыв в генерации уникальных идентификаторов
Steven Giesel в своей новой статье представляет UUID версии 7 для .NET 9. Основное преимущество UUID v7 - временной штамп, который делает его идеальным для баз данных, улучшая сортировку записей. Новый метод
Guid.CreateVersion7()
упрощает создание временных UUID.🔗 Подробнее здесь: https://steven-giesel.com/blogPost/ea42a518-4d8b-4e08-8f73-e542bdd3b983
Разработчики оценят эту инновацию за её удобство и эффективность!
💡 Канал | 💬 Чат
Steven-Giesel
UUID v7 in .NET 9
.NET natively knows UUID v4 aka Guid.NewGuid(). But with preview 7 we get Version 7 of UUID's natively.
#dev #dotnet #qa
📚 Selenium WebDriver Recipes in C#: Practical Testing Solutions for Selenium WebDriver (2024)
✍️ Автор: Courtney Zhan
📃 Страниц: 331
В этом издании вы найдете обновленные инструкции по настройке Visual Studio, новые рецепты и главы о Selenium DevTools и непрерывном тестировании. Узнайте, как использовать Selenium WebDriver для работы с выпадающими списками, навигацией, утверждениями, фреймворками, загрузкой файлов и всплывающими диалоговыми окнами.
Что внутри:
🔸 Отладка тестов и тестовых данных
🔸 Работа с удаленным сервером Selenium
🔸 Управление профилями браузеров и их настройка
🔸 Мониторинг тестов для улучшения пользовательского опыта (UX)
💡 Канал | 💬 Чат
📚 Selenium WebDriver Recipes in C#: Practical Testing Solutions for Selenium WebDriver (2024)
✍️ Автор: Courtney Zhan
📃 Страниц: 331
В этом издании вы найдете обновленные инструкции по настройке Visual Studio, новые рецепты и главы о Selenium DevTools и непрерывном тестировании. Узнайте, как использовать Selenium WebDriver для работы с выпадающими списками, навигацией, утверждениями, фреймворками, загрузкой файлов и всплывающими диалоговыми окнами.
Что внутри:
🔸 Отладка тестов и тестовых данных
🔸 Работа с удаленным сервером Selenium
🔸 Управление профилями браузеров и их настройка
🔸 Мониторинг тестов для улучшения пользовательского опыта (UX)
💡 Канал | 💬 Чат
👨💻1
#dotnet
🧙♂️ Новинка в C# - JsonUnmappedMemberHandling
Вам когда-нибудь приходилось сталкиваться с ситуацией, когда ваш JSON-десериализатор неожиданно ломается из-за дополнительных или неизвестных полей в данных?
🔥 Встречайте
🔥 Теперь вы можете управлять тем, как ваш JSON-десериализатор будет реагировать на неизвестные свойства в JSON-объектах. Вот несколько ключевых моментов:
✅ Skip - игнорирует неизвестные поля (поведение по умолчанию).
✅ Disallow - выбрасывает исключение, если обнаружены неизвестные поля.
Пример использования:
🔧 Зачем это нужно?
- Улучшает контроль над данными.
- Повышает стабильность и предсказуемость работы приложения.
- Облегчает отладку и тестирование.
📚 Ссылка на документацию Microsoft: https://learn.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonunmappedmemberhandling
💡 Канал | 💬 Чат
🧙♂️ Новинка в C# - JsonUnmappedMemberHandling
Вам когда-нибудь приходилось сталкиваться с ситуацией, когда ваш JSON-десериализатор неожиданно ломается из-за дополнительных или неизвестных полей в данных?
🔥 Встречайте
JsonUnmappedMemberHandling
- новое решение для обработки таких случаев в C#! 🔥 Теперь вы можете управлять тем, как ваш JSON-десериализатор будет реагировать на неизвестные свойства в JSON-объектах. Вот несколько ключевых моментов:
✅ Skip - игнорирует неизвестные поля (поведение по умолчанию).
✅ Disallow - выбрасывает исключение, если обнаружены неизвестные поля.
Пример использования:
[JsonUnmappedMemberHandling(JsonUnmappedMemberHandling.Disallow)]
public class MyClass
{
public int Id { get; set; }
public string Name { get; set; }
}
🔧 Зачем это нужно?
- Улучшает контроль над данными.
- Повышает стабильность и предсказуемость работы приложения.
- Облегчает отладку и тестирование.
📚 Ссылка на документацию Microsoft: https://learn.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonunmappedmemberhandling
💡 Канал | 💬 Чат
Docs
JsonUnmappedMemberHandling Enum (System.Text.Json.Serialization)
Determines how JsonSerializer handles JSON properties that cannot be mapped to a specific .NET member when deserializing object types.
#dotnet
🕵️♂️ OWASP Cheat Sheet: Хранение Паролей 🔐
Сегодня хочу поделиться с вами важной информацией из OWASP о правильном хранении паролей. 🚀 Это критически важная тема для всех разработчиков и ИТ-специалистов, которые заботятся о безопасности своих пользователей. 🛡
🔍 Что это такое?
Cheat Sheet от OWASP — это руководство для разработчиков по безопасному хранению паролей. Оно помогает избежать распространенных ошибок и защищает данные пользователей.
📋 Основные рекомендации:
🔹Хэширование паролей
Используйте проверенные алгоритмы хэширования, такие как bcrypt, PBKDF2 или Argon2. Они специально разработаны для безопасного хранения паролей.
🔹Соль (Salt)
Добавляйте уникальную соль для каждого пароля перед его хэшированием. Это защищает от атак по словарю и rainbow table.
🔹Перец (Pepper)
Используйте глобальный секретный ключ (перец) в дополнение к соли для дополнительной защиты.
🔹Перечислимость (Iterations)
Увеличивайте количество итераций алгоритма хэширования, чтобы замедлить попытки взлома.
🔹Безопасное хранение
Никогда не храните пароли в открытом виде и не используйте слабые методы шифрования.
Пример метода для хэширования пароля на C#
💡 Канал | 💬 Чат
Сегодня хочу поделиться с вами важной информацией из OWASP о правильном хранении паролей. 🚀 Это критически важная тема для всех разработчиков и ИТ-специалистов, которые заботятся о безопасности своих пользователей. 🛡
🔍 Что это такое?
Cheat Sheet от OWASP — это руководство для разработчиков по безопасному хранению паролей. Оно помогает избежать распространенных ошибок и защищает данные пользователей.
📋 Основные рекомендации:
🔹Хэширование паролей
Используйте проверенные алгоритмы хэширования, такие как bcrypt, PBKDF2 или Argon2. Они специально разработаны для безопасного хранения паролей.
🔹Соль (Salt)
Добавляйте уникальную соль для каждого пароля перед его хэшированием. Это защищает от атак по словарю и rainbow table.
🔹Перец (Pepper)
Используйте глобальный секретный ключ (перец) в дополнение к соли для дополнительной защиты.
🔹Перечислимость (Iterations)
Увеличивайте количество итераций алгоритма хэширования, чтобы замедлить попытки взлома.
🔹Безопасное хранение
Никогда не храните пароли в открытом виде и не используйте слабые методы шифрования.
Пример метода для хэширования пароля на C#
public class PasswordHasher
{
// Глобальный секретный ключ (перец)
private static readonly string pepper = "SuperSecretPepperKey";
// Метод для хэширования пароля с использованием PBKDF2
public static string HashPassword(string password)
{
// Генерация соли
var salt = new byte[16];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(salt);
}
// Объединение пароля с перцем
string passwordWithPepper = password + pepper;
// Хэширование пароля с использованием PBKDF2
byte[] hashed = KeyDerivation.Pbkdf2(
password: passwordWithPepper,
salt: salt,
prf: KeyDerivationPrf.HMACSHA256,
iterationCount: 10000,
numBytesRequested: 32);
// Один из примеров конкатенация соли и хэша для хранения
byte[] hashBytes = new byte[salt.Length + hashed.Length];
Buffer.BlockCopy(salt, 0, hashBytes, 0, salt.Length);
Buffer.BlockCopy(hashed, 0, hashBytes, salt.Length, hashed.Length);
// Возврат хэша в виде строки для хранения
return BitConverter.ToString(hashBytes);
}
}
💡 Канал | 💬 Чат
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
#dotnet
🧙🏻♂️ C#: Разница между
В C# есть два схожих метода для проверки наличия элементов в коллекции —
😐 В чем разница?
😮 Benchmark
😐
+ This method performs a linear search; therefore, this method is an
+ Использование цикла for позволяет напрямую обращаться к элементам списка по индексу, что может быть быстрее в некоторых случаях, чем использование методов расширения
- работает только с
- невозможно проверить, пуст ли список
🐈 Код
🏃♂️ Запуск
💡 Channel | ✏️ Chat
🧙🏻♂️ C#: Разница между
Any()
и Exists()
В C# есть два схожих метода для проверки наличия элементов в коллекции —
Any()
и Exists()
. Оба они могут использоваться для поиска элементов, но работают они немного по-разному. Предлагаю быстрый чек.Any()
— это метод расширения LINQ
, который проверяет, есть ли хотя бы один элемент, соответствующий условиюExists()
— это метод класса List<T>
, который также проверяет наличие элементаBenchmarkDotNet v0.14.0, macOS Sonoma 14.6.1 (23G93) [Darwin 23.6.0]
Apple M1 Max 2.40GHz, 1 CPU, 10 logical and 10 physical cores
.NET SDK 8.0.101
[Host] : .NET 8.0.1 (8.0.123.58001), X64 RyuJIT SSE4.2
DefaultJob : .NET 8.0.1 (8.0.123.58001), X64 RyuJIT SSE4.2
| Method | Mean | Allocated |
|------- |---------:|----------:|
| Any | 2.624 ms | 43 B |
| Exists | 1.136 ms | 12 B |
Exists()
- а что так можно было?какой ценой?+ This method performs a linear search; therefore, this method is an
O(n)
operation, where n is count+ Использование цикла for позволяет напрямую обращаться к элементам списка по индексу, что может быть быстрее в некоторых случаях, чем использование методов расширения
LINQ
- работает только с
List<T>
- невозможно проверить, пуст ли список
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Running;
BenchmarkRunner.Run<AnyVsExistsBenchmark>();
[HideColumns(Column.Error, Column.StdDev), MemoryDiagnoser]
public class AnyVsExistsBenchmark
{
private readonly List<int> _numbers = Enumerable.Range(1, 1000000).ToList();
[Benchmark]
public bool Any() => _numbers.Any(x => x > 26082024);
[Benchmark]
public bool Exists() => _numbers.Exists(x => x > 26082024);
}
dotnet run -c Release --project Benchmark
Please open Telegram to view this post
VIEW IN TELEGRAM
#dotnet
Ты еще не знаешь что такое😱
🧙♀️ Ускорь свою разработку на
🔥 Твоя путеводная звезда в мире ➡️ roadmap.sh
💡 Channel | ✏ Chat
Ты еще не знаешь что такое
ASP.NET Core
? ASP.NET Core
, просто воспользуйся этой дорожной картой и стань настоящим 🧙🏻♂️ разработки!ASP.NET Core
— дорожная карта Please open Telegram to view this post
VIEW IN TELEGRAM
✍1👍1
Branch Prediction: Как ваш процессор уже как 35 лет предсказывает будущее.
🧙🏻♂️ Современные процессоры уже давно получили свои экстрасенсорные способности. С помощью Branch Prediction они способны заглядывать в будущее и предугадывать, какой путь выполнится в вашем коде. Это как если бы ваш компьютер знал, что вам нужно сделать следующее, еще до того, как вы это сами осознаете!
Branch Prediction — это технология в процессорах, которая помогает предсказать, какой путь выберет программа, когда встречается условный переход (например, if или switch) и в условиях неопределённости. При выполнении условных инструкций (ветвлений) процессор должен решить, какой из возможных путей будет выбран, чтобы минимизировать задержки и улучшить производительность.
🙉 Почему это важно?
Когда процессор сталкивается с условным переходом, он должен решить, какой путь выполнить. Если процессор не знает, какой путь выбрать, он может просто сидеть и ждать, что замедляет работу. Branch Prediction помогает процессору заранее выбрать путь и продолжить выполнение инструкций, что значительно ускоряет работу.
🧐 Как это работает?
Процессор использует предыдущие результаты и алгоритмы, чтобы предсказать, какой путь будет выбран. На основе предсказания процессор начинает выполнять инструкции, даже прежде чем точно узнать, правильный ли путь выбран. Если предсказание оказывается неверным, процессор отменяет неверные инструкции и переходит к правильному пути. Это вызывает небольшую задержку, но обычно минимизирует ее.
👨🏻💻 Факт для IT
90% точность прогнозирования ветвлений выдают современные процессоры.
3 ns нужно процессору для обработки неверного предсказания ветвления и да это аппаратная и программная функция.
🔎 Проверим это всё кодом
Один и тот же метод, который обрабатывает каждый элемент массива одинаково. Возьмём: массив с рандомными числами, тот же но отсортированный массив, массив с только чётными числами и массив с чередующимися числами чёт/нечёт
👨💻 Код
😮 Benchmark
Остортированный массив становится в 6 раз быстрее чем массив с неотсортированными числами👨💻
🗿 Так что в следующий раз, когда ваш ноут/пк начнёт тупить, не переживайте — он просто пытается угадать, когда вы наконец закончите свою работу и перестанете его нагружать.
#computerscience #dotnet
💡 Channel | ✏ Chat
🧙🏻♂️ Современные процессоры уже давно получили свои экстрасенсорные способности. С помощью Branch Prediction они способны заглядывать в будущее и предугадывать, какой путь выполнится в вашем коде. Это как если бы ваш компьютер знал, что вам нужно сделать следующее, еще до того, как вы это сами осознаете!
Branch Prediction — это технология в процессорах, которая помогает предсказать, какой путь выберет программа, когда встречается условный переход (например, if или switch) и в условиях неопределённости. При выполнении условных инструкций (ветвлений) процессор должен решить, какой из возможных путей будет выбран, чтобы минимизировать задержки и улучшить производительность.
Когда процессор сталкивается с условным переходом, он должен решить, какой путь выполнить. Если процессор не знает, какой путь выбрать, он может просто сидеть и ждать, что замедляет работу. Branch Prediction помогает процессору заранее выбрать путь и продолжить выполнение инструкций, что значительно ускоряет работу.
Процессор использует предыдущие результаты и алгоритмы, чтобы предсказать, какой путь будет выбран. На основе предсказания процессор начинает выполнять инструкции, даже прежде чем точно узнать, правильный ли путь выбран. Если предсказание оказывается неверным, процессор отменяет неверные инструкции и переходит к правильному пути. Это вызывает небольшую задержку, но обычно минимизирует ее.
👨🏻💻 Факт для IT
90% точность прогнозирования ветвлений выдают современные процессоры.
3 ns нужно процессору для обработки неверного предсказания ветвления и да это аппаратная и программная функция.
Один и тот же метод, который обрабатывает каждый элемент массива одинаково. Возьмём: массив с рандомными числами, тот же но отсортированный массив, массив с только чётными числами и массив с чередующимися числами чёт/нечёт
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Running;
BenchmarkRunner.Run<BranchPrediction>();
[HideColumns(Column.Error, Column.StdDev), MemoryDiagnoser]
public class BranchPrediction
{
private const int N = 12_09_2024;
private int[] _unorderedArray = new int[N];
private int[] _ordered = new int[N];
private int[] _allAreOdd = new int[N];
private int[] _alternating = new int[N];
[GlobalSetup]
public void Setup()
{
_unorderedArray = Enumerable.Range(0, N).Select(_ => Random.Shared.Next()).ToArray();
_ordered = _unorderedArray.OrderBy(x => x % 2).ToArray();
_allAreOdd = Enumerable.Repeat(42, N).ToArray();
_alternating = Enumerable.Range(0, N).Select(i => i % 2 == 0 ? 42 : 777).ToArray();
}
[Benchmark]
public int Ordered() => GetEvensCount(_ordered);
[Benchmark]
public int Unordered() => GetEvensCount(_unorderedArray);
[Benchmark]
public int AllAreOdd() => GetEvensCount(_allAreOdd);
[Benchmark]
public int Alternating() => GetEvensCount(_alternating);
private static int GetEvensCount(int[] arr)
{
var evens = 0;
for (var i = 0; i < arr.Length; i++)
if (arr[i] % 2 == 0)
evens++;
return evens;
}
}
Остортированный массив становится в 6 раз быстрее чем массив с неотсортированными числами
| Method | Mean |
|------------ |----------:|
| Ordered | 7.897 ms |
| Unordered | 47.648 ms |
| AllAreOdd | 7.985 ms |
| Alternating | 9.585 ms |
#computerscience #dotnet
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
.NET Core позволяет решить задачи несколькими путями, например вопросы конфигурации проектов.
Вообщем разработчики .NET Core стремились создать гибкую платформу, которая может адаптироваться к любым нуждам и хотелкам. Поэтому конфигурацию можно настраивать через JSON, XML, даже INI файлы, переменные среды, командную строку, базы данных и если вам этого мало вы можете сами сделать свой провайдер. Но лучше посмотреть одно видео😎
#dotnet
📎 Ссылка: YouTube
💡 Channel | ✏ Chat
Вообщем разработчики .NET Core стремились создать гибкую платформу, которая может адаптироваться к любым нуждам и хотелкам. Поэтому конфигурацию можно настраивать через JSON, XML, даже INI файлы, переменные среды, командную строку, базы данных и если вам этого мало вы можете сами сделать свой провайдер. Но лучше посмотреть одно видео
#dotnet
📎 Ссылка: YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
Как стать .NET разработчиком в 2025 году?
Я открыл .NET Core Roadmap на 2025 год и такой: "Чего? Это вообще реально освоить?" - Реально!
Первое и важное
Учитесь через практику, не пытайтесь объять всё сразу. Шаг за шагом.
Всё начинается с основ
Алгоритмы, структуры данных, ООП. Без них всё остальное – это просто набор инструментов.
Дальше экосистема .NET
ASP .NET Core - это обязательно. Blazor/MAUI - хотя бы по верхам глянуть что это.
Задачки со звёздочкой и это облака
Azure/AWS/GCP, Docker, Kubernetes – это уже не опция, а стандарт. Научитесь автоматизировать деплой, масштабировать сервисы, работать с данными – от PostgreSQL до Redis.
И конечно soft skills
умение донести идею и работать в команде сегодня так же важно, как кодить.
Звучит как план?🧙🏻♂️
#dotnet
#обучение
💡 Channel | ✏ Chat
Я открыл .NET Core Roadmap на 2025 год и такой: "Чего? Это вообще реально освоить?" - Реально!
Первое и важное
Учитесь через практику, не пытайтесь объять всё сразу. Шаг за шагом.
Всё начинается с основ
Алгоритмы, структуры данных, ООП. Без них всё остальное – это просто набор инструментов.
Дальше экосистема .NET
ASP .NET Core - это обязательно. Blazor/MAUI - хотя бы по верхам глянуть что это.
Задачки со звёздочкой и это облака
Azure/AWS/GCP, Docker, Kubernetes – это уже не опция, а стандарт. Научитесь автоматизировать деплой, масштабировать сервисы, работать с данными – от PostgreSQL до Redis.
И конечно soft skills
умение донести идею и работать в команде сегодня так же важно, как кодить.
Звучит как план?🧙🏻♂️
#dotnet
#обучение
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🤓2😱1
Почему обновления .NET — это не опция, а необходимость
Недавно вышел релиз
🟥 Уязвимости могла привести к утечке данных или выполнению кода из-за неправильного управления памятью.
Казалось бы, мелочь, но для атакующего это окно возможностей, а для компаний — потенциальный риск утраты доверия пользователей, финансовые потери и ну ночи без сна 😅
Список исправленых серьёзных уязвимостей:
CVE-2025-21171 — уязвимость в десериализации JSON, позволяющая злоумышленнику выполнить произвольный код или нарушить целостность данных.
CVE-2025-21172 — проблема с некорректной проверкой входных данных, что открывает возможность для выполнения произвольного кода.
CVE-2025-21173 — ошибка в System.Data.SqlClient и Microsoft.Data.SqlClient, способная привести к утечке конфиденциальной информации.
CVE-2025-21176 — уязвимость в механизмах сериализации, где вредоносные объекты могут использоваться для выполнения произвольного кода.
Обновление доступно здесь: Microsoft .NET Updates
P.S.: Вообщем не стоит забивать и забывать про безопасность и безопасность это процесс, а НЕ одноразовое действие.
#dotnet
#security
💡 Channel | ✏ Chat
Недавно вышел релиз
.NET 9.0.1
с важным исправлением уязвимости безопасности.Казалось бы, мелочь, но для атакующего это окно возможностей, а для компаний — потенциальный риск утраты доверия пользователей, финансовые потери и ну ночи без сна 😅
Список исправленых серьёзных уязвимостей:
CVE-2025-21171 — уязвимость в десериализации JSON, позволяющая злоумышленнику выполнить произвольный код или нарушить целостность данных.
CVE-2025-21172 — проблема с некорректной проверкой входных данных, что открывает возможность для выполнения произвольного кода.
CVE-2025-21173 — ошибка в System.Data.SqlClient и Microsoft.Data.SqlClient, способная привести к утечке конфиденциальной информации.
CVE-2025-21176 — уязвимость в механизмах сериализации, где вредоносные объекты могут использоваться для выполнения произвольного кода.
Обновление доступно здесь: Microsoft .NET Updates
P.S.: Вообщем не стоит забивать и забывать про безопасность и безопасность это процесс, а НЕ одноразовое действие.
#dotnet
#security
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
История этой недели: Фантомный баг
Фантомный баг - это не ошибка, это боль. ЭТО может "поймать" кто угодно: саппорты, QA, да кто угодно.. да, но только разработчик чаще всего не ловит. И вот ты слышишь об этом баге на митингах, на звонках с ребятами, этот баг появляется и исчезает и ты не успеваешь даже понять, что это было, причём тут ты или он или они. Так вот, это прилюдие моей недели.
Пишет support: Нашли баг у клиента, он не критичный, но может повлиять на продажу продукта. По сути, он может появиться на демонстрации и сбить клиента с толку.
Ок думаю, задача будет на мне, начну делать, за одно и подождём может найдут кейс.
——
ПНД: Вижу багу, чекаю - не воспроизводится. Отправляю ответ: "it doesnot play on my side". Через пару минут прилетает видео с тем, как баг появился. Я в ответ — два видео, где бага нет. support проверяет и пишет: "Баг отсутствует!" думаю: Шах и мат вообщем(нет)
Проходит пару дней и баг снова прилетает. Проверяю, говорю: "Бага нет." Общаюсь с продактом, а он: "Да, баг был, я сам видел, но сейчас его нет". Тут я спросил "Подразумевается, что продолжаем?". Угадайте какой ответ👍
Проверяю логи, повторяю шаги - все работает как должно. Сижу спокойно, думаю, может все в порядке... и тут пишут: "Вот, смотри, баг поймали!" Я смотрю, пробую, баг не воспроизводится -_- Делаю те же шаги от лица customer, но всё работает Ок
На сладкое добавляем:мы используем платные библиотеки
Прошло где то часов 14 подряд.
Результаты: баг появляется один раз из десяти -_-
Я пытаюсь его поймать - баг исчезает. что-где-когда происходит в реальности
На самом деле я уже верю, что кто-то написал это в либе:
Обсфусцировал, а теперь, я пробую найти это место и пофиксить.
- Кто не осведомлён
Этот код "обсфусцирован", это когда код изменяют так, чтобы его было сложно понять. Это делается, чтобы защититься от копирования, скрыть код или затруднить поиск ошибок - по сути защита от копирования и для запутывания (это в платных либах обычная практика). Как правило, ошибки NullReferenceException случаются, когда пытаешься работать с объектом, который не существует (т.е. NULL). В данном случае, выбрасывать это исключение случайным образом с вероятностью ~5%.
#dotnet
#bug
💡 Channel | ✏ Chat
Фантомный баг - это не ошибка, это боль. ЭТО может "поймать" кто угодно: саппорты, QA, да кто угодно.. да, но только разработчик чаще всего не ловит. И вот ты слышишь об этом баге на митингах, на звонках с ребятами, этот баг появляется и исчезает и ты не успеваешь даже понять, что это было, причём тут ты или он или они. Так вот, это прилюдие моей недели.
Пишет support: Нашли баг у клиента, он не критичный, но может повлиять на продажу продукта. По сути, он может появиться на демонстрации и сбить клиента с толку.
Ок думаю, задача будет на мне, начну делать, за одно и подождём может найдут кейс.
——
ПНД: Вижу багу, чекаю - не воспроизводится. Отправляю ответ: "it doesnot play on my side". Через пару минут прилетает видео с тем, как баг появился. Я в ответ — два видео, где бага нет. support проверяет и пишет: "Баг отсутствует!" думаю: Шах и мат вообщем
Проходит пару дней и баг снова прилетает. Проверяю, говорю: "Бага нет." Общаюсь с продактом, а он: "Да, баг был, я сам видел, но сейчас его нет". Тут я спросил "Подразумевается, что продолжаем?". Угадайте какой ответ
Проверяю логи, повторяю шаги - все работает как должно. Сижу спокойно, думаю, может все в порядке... и тут пишут: "Вот, смотри, баг поймали!" Я смотрю, пробую, баг не воспроизводится -_- Делаю те же шаги от лица customer, но всё работает Ок
На сладкое добавляем:
Прошло где то часов 14 подряд.
Результаты: баг появляется один раз из десяти -_-
Я пытаюсь его поймать - баг исчезает. что-где-когда происходит в реальности
На самом деле я уже верю, что кто-то написал это в либе:
if (new Random().NextDouble() < 0.05)
throw new NullReferenceException("Object reference not set to an instance of an object.");
Обсфусцировал, а теперь, я пробую найти это место и пофиксить.
- Кто не осведомлён
#dotnet
#bug
Please open Telegram to view this post
VIEW IN TELEGRAM
Оптимизация, которая реально нужна
Тут наткнулся на отличное видео про оптимизацию работы с файлами и S3.
Если у вас в коде есть обработка больших файлов, то это прям мастхэв к просмотру и вдохновению
тут будет
-
-
-
- работа с
Вместо типичного «ну, GC пусть сам разберётся», тут идёт грамотный контроль аллокаций и потоков данных. Реальный пример того, где оптимизация не просто «чтоб быстрее», а потому что надо
Советую посмотреть и вдохновиться
Ссылка: YouTube
#dotnet
💡 Channel | ✏ Chat
Тут наткнулся на отличное видео про оптимизацию работы с файлами и S3.
Если у вас в коде есть обработка больших файлов, то это прям мастхэв к просмотру и вдохновению
тут будет
-
stackalloc
– чтобы не гонять GC лишний раз.-
ArrayPool
– арендуем массивы вместо создания новых.-
Stream
- работа с
S3
Вместо типичного «ну, GC пусть сам разберётся», тут идёт грамотный контроль аллокаций и потоков данных. Реальный пример того, где оптимизация не просто «чтоб быстрее», а потому что надо
Советую посмотреть и вдохновиться
Ссылка: YouTube
#dotnet
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Кирилл Бажайкин — Приемы экономии памяти в .NET
Подробнее о конференции DotNext: https://jrg.su/3WmFRE
— —
Скачать презентацию с сайта DotNext — https://jrg.su/lohpRy
Современные приложения иногда потребляют очень много памяти. И иногда они делают это, казалось бы, на пустом месте. Вот и в практике спикера…
— —
Скачать презентацию с сайта DotNext — https://jrg.su/lohpRy
Современные приложения иногда потребляют очень много памяти. И иногда они делают это, казалось бы, на пустом месте. Вот и в практике спикера…
👍5👨💻1
EF Core единым: как LINQ to DB спасает, когда EF уже не тянет
Есть отличное видео о
➡️ В чём EF Core не хорош?
Иногда страдает от медленной инициализации
Нет удобной поддержки bulk insert/update
Ограниченные возможности при сложных SQL-операциях
➡️ В чём linq2db хорош?
Так же не нужно создавать объект если хотите сделать просто update
просто SQL уровня UPDATE ... SET ... FROM ... WHERE ....
Вставка сотен тысяч строк в linq2db: PostgreSQL и метод COPY
Если у вас PostgreSQL и вы вставляете кучу строк — забудьте про AddRange и SaveChanges 🥹
Insert from select, merge и временные таблицы
LINQ to DB позволяет делать вещи, которые в EF либо невозможно, либо надо "танцевать с бубном"
Так же для MERGE можно использовать специальный DSL или выполнять кастомный SQL напрямую — и всё это в транзакции EF.
➡️ Что ещё интересного в linq2db?
- Использование разных isolation levels для тонкой настройки транзакций
- Обходить блокировки строк с помощью "skip locked"
- Почему EF тормозит из-за инициализации, а LINQ to DB — нет 🫠
- Как расширить LINQ to DB для PostgreSQL-специфичных фич (full-text search, @> и т.п.)
📝 Итого
У меня был опыт с linq2db, но довольно печальный. Во-первых небыло ещё chatgpt)) и практически нет документации. Тем не менее, если вы работаете с большими объемами данных, сложной бизнес-логикой и хотите контролировать SQL на выходе — присмотритесь к LINQ to DB. Это не просто "альтернатива", это — швейцарский нож для разработчика, уставшего от "магии" ORM.
Ссылка: YouTube
#EFCore
#LINQtoDB
#PostgreSQL
#dotnet
Есть отличное видео о
ORM
от Алексей Фадеев рассказал, как LINQ to DB (linq2db) может быть настоящим спасением, когда Entity Framework Core начинает тормозить — Привет от BULK операций и сложных условий обновления.Иногда страдает от медленной инициализации
Нет удобной поддержки bulk insert/update
Ограниченные возможности при сложных SQL-операциях
Так же не нужно создавать объект если хотите сделать просто update
просто SQL уровня UPDATE ... SET ... FROM ... WHERE ....
await db.Companies
.Where(c => c.Name == null)
.Set(c => c.Name, c => c.Director + "'s company")
.UpdateAsync();
Вставка сотен тысяч строк в linq2db: PostgreSQL и метод COPY
Если у вас PostgreSQL и вы вставляете кучу строк — забудьте про AddRange и SaveChanges 🥹
await db.BulkCopyAsync(new BulkCopyOptions
{
TableName = "Passengers",
KeepIdentity = true
}, passengersList);
Insert from select, merge и временные таблицы
LINQ to DB позволяет делать вещи, которые в EF либо невозможно, либо надо "танцевать с бубном"
Так же для MERGE можно использовать специальный DSL или выполнять кастомный SQL напрямую — и всё это в транзакции EF.
await db.Into(db.NewTable)
.Insert(
from o in db.OldTable
where o.IsActive
select new NewTable { Id = o.Id, Name = o.Name });
var sql = @"select * from tickets where departure_time > now()";
var result = await db.FromSql(sql).ToListAsync();
- Использование разных isolation levels для тонкой настройки транзакций
- Обходить блокировки строк с помощью "skip locked"
- Почему EF тормозит из-за инициализации, а LINQ to DB — нет 🫠
- Как расширить LINQ to DB для PostgreSQL-специфичных фич (full-text search, @> и т.п.)
У меня был опыт с linq2db, но довольно печальный. Во-первых небыло ещё chatgpt)) и практически нет документации. Тем не менее, если вы работаете с большими объемами данных, сложной бизнес-логикой и хотите контролировать SQL на выходе — присмотритесь к LINQ to DB. Это не просто "альтернатива", это — швейцарский нож для разработчика, уставшего от "магии" ORM.
Ссылка: YouTube
#EFCore
#LINQtoDB
#PostgreSQL
#dotnet
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5 2 1
This media is not supported in your browser
VIEW IN TELEGRAM
🪓 50 дней подряд решаю задачи на LeetCode
50-дневный стрик на LeetCode для меня было не просто. Это по сути значит, что я каждый день решал хотя бы одну задачу по алгоритмам и структурам данных. Иногда это было легко, иногда - совсем нет. Иногда — ночью, перед сном, иногда в 23:57 я пушил ответ. Но каждый день - стабильно.
➡️ Зачем это всё?
1. Набрать форму 😅.
Когда пишешь бэкенд или работаешь с продакшеном - алгоритмы быстро уходят из головы. Последний раз я решал задачи года полтора назад. И естественно ничего этого я уже и не помню). А они тренируют мышление, умение оптимизировать и видеть код на уровень глубже, не всегда конечно, но увеличивают кругозор и экспертизу.
2. Дисциплина.
Можно сранвить как спорт: это как быть в прайме своей формы или готовиться к соревнованиям, даже 20 минут в день дают мощный эффект, если делать стабильно.
3. Challenge самому себе.
Не ради рейтинга, ради алгоритмов. А ради внутреннего ощущения, что ты не стоишь на месте. И оттачиваешь своё ремесло🤓
4. Прокачка английского.
Понять что имеется ввиду тоже ещё тот челендж
Если давно хотел прокачаться в алгоритмах, начать легко: по одной задаче в день. Главное - регулярность, это сложно.
И да, даже если день жёсткий - можно найти10 40 минут и сделать хотя бы задачу.
Хотя бы одну задачу, Карл!
📝 Итого:
Делайте себе вызовы.
Пафосно:Пусть будет не LeetCode, а что-то своё. Но что-то, что будет каждый день приближать вас к цели.
➡️ Правило от меня: Не тратить на задачу больше 1 часа. Забить и отложить. Это помогло мне пару раз
#leetcode
#codingchallenge
#developer
#dotnet
💡 Channel | ✏ Chat
50-дневный стрик на LeetCode для меня было не просто. Это по сути значит, что я каждый день решал хотя бы одну задачу по алгоритмам и структурам данных. Иногда это было легко, иногда - совсем нет. Иногда — ночью, перед сном, иногда в 23:57 я пушил ответ. Но каждый день - стабильно.
1. Набрать форму 😅.
Когда пишешь бэкенд или работаешь с продакшеном - алгоритмы быстро уходят из головы. Последний раз я решал задачи года полтора назад. И естественно ничего этого я уже и не помню). А они тренируют мышление, умение оптимизировать и видеть код на уровень глубже, не всегда конечно, но увеличивают кругозор и экспертизу.
2. Дисциплина.
Можно сранвить как спорт: это как быть в прайме своей формы или готовиться к соревнованиям, даже 20 минут в день дают мощный эффект, если делать стабильно.
3. Challenge самому себе.
Не ради рейтинга, ради алгоритмов. А ради внутреннего ощущения, что ты не стоишь на месте. И оттачиваешь своё ремесло
4. Прокачка английского.
Понять что имеется ввиду тоже ещё тот челендж
Если давно хотел прокачаться в алгоритмах, начать легко: по одной задаче в день. Главное - регулярность, это сложно.
И да, даже если день жёсткий - можно найти
Хотя бы одну задачу, Карл!
Делайте себе вызовы.
Пафосно:
#leetcode
#codingchallenge
#developer
#dotnet
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6 2 1
This media is not supported in your browser
VIEW IN TELEGRAM
Моё наивное решение VS. нечеловеческого?
➡️ Есть задача
В массиве чисел каждый элемент - это голос за кандидата. Найдите кандидата, который получил больше половины голосов.
1. Моё решение Оказалось наивным =(
O(n) по времени, O(n) по памяти
➡️ Как работает
Мы храним количество вхождений каждого элемента в словаре.
Для каждого числа проверяем, не встречается ли оно больше половины массива.
Если встречается - сразу возвращаем его.
Да всё ок - я доволен и задача решена.
💡 НО Проблема:
Это решение работает за O(n) по времени, но требует O(n) памяти из-за использования словаря. Это неплохо, но есть более эффективные способы.
Естьнечеловеческое умное решение
2. Boyer-Moore Majority Vote Algorithm: O(n) по времени, O(1) по памяти
➡️ Как работает
Алгоритм выбирает кандидата и отслеживает его "счёт".
Если счёт равен нулю, мы меняем кандидата на текущий элемент.
Алгоритм работает за O(n) по времени, но не требует дополнительных структур данных и O(1) по памяти 🤓
#leetcode
#dotnet
#algorithm
💡 Channel | ✏ Chat
В массиве чисел каждый элемент - это голос за кандидата. Найдите кандидата, который получил больше половины голосов.
1. Моё решение Оказалось наивным =(
O(n) по времени, O(n) по памяти
public int MajorityElement(int[] nums)
{
var limit = nums.Length / 2;
var dict = new Dictionary<int, int>();
foreach (var number in nums)
if (dict.TryGetValue(number, out var count))
{
if (count + 1 > limit)
return number;
dict[number] = count + 1;
}
else
{
dict[number] = 1;
}
return dict[0];
}
Мы храним количество вхождений каждого элемента в словаре.
Для каждого числа проверяем, не встречается ли оно больше половины массива.
Если встречается - сразу возвращаем его.
Да всё ок - я доволен и задача решена.
💡 НО Проблема:
Это решение работает за O(n) по времени, но требует O(n) памяти из-за использования словаря. Это неплохо, но есть более эффективные способы.
Есть
2. Boyer-Moore Majority Vote Algorithm: O(n) по времени, O(1) по памяти
public int MajorityElement(int[] nums)
{
int candidate = 0, count = 0;
foreach (var num in nums)
{
if (count == 0)
candidate = num;
count += (num == candidate) ? 1 : -1;
}
return candidate;
}
Если счёт равен нулю, мы меняем кандидата на текущий элемент.
Алгоритм работает за O(n) по времени, но не требует дополнительных структур данных и O(1) по памяти 🤓
#leetcode
#dotnet
#algorithm
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2👨💻1
Минус одна нерешённая проблема
Вот одна из причин почему стоит учить C#
Пока философы спорят - разработчики пишут код. C# не стал спорить, а мы тут ещё 100 лет спорили, а тут всё же просто, ну 😅
#developer
#dotnet
💡 Channel | ✏ Chat
Вот одна из причин почему стоит учить C#
Пока философы спорят - разработчики пишут код. C# не стал спорить, а мы тут ещё 100 лет спорили, а тут всё же просто, ну 😅
#developer
#dotnet
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2 2👨💻1
Видео по C# которое я пересматривал несколько раз 🙉
Это видос - прям топ, особенно если интересно как работает lock под капотом и не только. Если ты пишешь на .NET и думаешь что
- Что делает
- Как там внутри
- Какие есть другие варианты кроме
- Почему простой
Если пишешь на .NET и хочешь реально понять, как работает многопоточность и что происходит под капотом - это видео must watch. Каждый раз, когда пересматриваю, ловлю себя на новых инсайтах и что-то подмечаю 🙉🫠, особенно если копаешь в high performance или ловишь баги которые из разряда "у меня всё норм"
Видос без воды, с демками, очень технический и очень понятный(не всегда) .
Реально кайф!!
📎 Ссылка: YouTube
#dotnet
#underthehood
#lock
💡 Channel | ✏ Chat
Это видос - прям топ, особенно если интересно как работает lock под капотом и не только. Если ты пишешь на .NET и думаешь что
lock
- это простая конструкция, типа "обернул и поехали" — ну, ты ошибаешься 😄- Что делает
lock(obj)
на самом деле- Как там внутри
Monitor.Enter
и вся эта магия работает- Какие есть другие варианты кроме
lock
(spinlock
, mutex
и тд)- Почему простой
lock
- это вообще не так уж и простоЕсли пишешь на .NET и хочешь реально понять, как работает многопоточность и что происходит под капотом - это видео must watch. Каждый раз, когда пересматриваю, ловлю себя на новых инсайтах и что-то подмечаю 🙉🫠, особенно если копаешь в high performance или ловишь баги которые из разряда "у меня всё норм"
Видос без воды, с демками, очень технический и очень понятный
Реально кайф!!
📎 Ссылка: YouTube
#dotnet
#underthehood
#lock
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Станислав Сидристый — lock(_sync): иллюзия идеального выбора
Подробнее о конференции DotNext: https://jrg.su/3WmFRE
— —
Ввиду того, что lock является конструкцией языка, которая лаконично и понятно создает секцию монопольного исполнения кода, это создает иллюзию единственно верного решения. Станислав рассмотрит алгоритм…
— —
Ввиду того, что lock является конструкцией языка, которая лаконично и понятно создает секцию монопольного исполнения кода, это создает иллюзию единственно верного решения. Станислав рассмотрит алгоритм…
👨💻2👍1
Считаешь себя молодым .NET разработчиком?
Напоминаю: Microsoft в этом году стукнуло 50 🙉
так то и .NET больше 20 😅
Так что, если ты начал писать на .NET после .NET Framework 4.0 ты буквально молодёжь 😅
📎 Ссылка:
https://www.microsoft.com/en-us/edge/microsoft-50th-anniversary
#microsoft
#dotnet
💡 Channel | ✏ Chat
Напоминаю: Microsoft в этом году стукнуло 50 🙉
так то и .NET больше 20 😅
Так что, если ты начал писать на .NET после .NET Framework 4.0 ты буквально молодёжь 😅
📎 Ссылка:
https://www.microsoft.com/en-us/edge/microsoft-50th-anniversary
#microsoft
#dotnet
Please open Telegram to view this post
VIEW IN TELEGRAM
.NET: Лучшие примеры про различные блокировки
https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AsyncGuidance.md#warning-deadlocks
#dotnet
💡 Channel | ✏ Chat
https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AsyncGuidance.md#warning-deadlocks
#dotnet
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
AspNetCoreDiagnosticScenarios/AsyncGuidance.md at master · davidfowl/AspNetCoreDiagnosticScenarios
This repository has examples of broken patterns in ASP.NET Core applications - davidfowl/AspNetCoreDiagnosticScenarios