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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
🌳 LSM-дерево в C#

LSM-дерево (Log-Structured Merge Tree) – одна из самых мощных структур для баз данных, кэширования и key-value хранилищ.

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

Как работает LSM-дерево

1️⃣ Запись идёт в память (MemTable) – все операции сначала попадают в быстрое RAM-хранилище.

2️⃣ Данные записываются в WAL (Write-Ahead Log) – чтобы не потерять их при сбое.

3️⃣ Сброс в SSTables (Sorted String Tables) – периодически MemTable записывается на диск.

4️⃣ Компактификация – старые файлы объединяются, а удалённые ключи стираются.

Пример реализации в C#:
class LSMTree
{
private SortedDictionary<string, string> memTable = new();
private const string WAL_FILE = "wal.log";

public LSMTree()
{
LoadFromWAL();
}

public void Put(string key, string value)
{
memTable[key] = value;
File.AppendAllText(WAL_FILE, $"{key}:{value}\n");
}

public string Get(string key)
{
return memTable.TryGetValue(key, out var value) ? value : "Not found";
}

private void LoadFromWAL()
{
if (File.Exists(WAL_FILE))
{
foreach (var line in File.ReadAllLines(WAL_FILE))
{
var parts = line.Split(':');
if (parts.Length == 2)
memTable[parts[0]] = parts[1];
}
}
}
}


Где используется

• NoSQL базы данных: LevelDB, RocksDB, Cassandra

• Поисковые системы: Elasticsearch, Apache Lucene

• Хранилища для логов и кэшей

Преимущества LSM-дерева

• Быстрая запись – все изменения сначала пишутся в память

• Эффективное хранение – используется сжатие и компактификация

• Масштабируемость – отлично работает при больших объёмах данных

Но есть нюансы

• Медленный поиск — требуется слияние уровней

• Утилизация ресурсов — периодическая компактификация требует CPU

🔗 Как вы храните данные в своих проектах? Делитесь в комментариях! ⬇️

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
🚨 Ошибка GroupBy в Entity Framework 9

Ошибка возникает, когда после GroupBy выполняется сортировка: OrderBy, ThenBy и другие. В EF9 обработка таких запросов изменилась, из-за чего неожиданно ломаются стандартные сценарии группировки.

Пример проблемного кода:
var result = dbContext.Orders
.GroupBy(o => o.CustomerId)
.OrderBy(g => g.Key)
.Select(g => new { CustomerId = g.Key, TotalOrders = g.Count() })
.ToList();

Такой код работал в предыдущих версиях EF, но теперь выбрасывает исключение.

Как исправить

Можно принудительно выполнить запрос перед сортировкой, чтобы GroupBy обрабатывался в памяти:
var result = dbContext.Orders
.GroupBy(o => o.CustomerId)
.Select(g => new { CustomerId = g.Key, TotalOrders = g.Count() })
.ToList() // Выполняем в памяти
.OrderBy(g => g.CustomerId) // Теперь сортируем
.ToList();


Ошибка, вероятнее всего, будет исправлена в Entity Framework 10.

➡️ Суть проблемы в оригинале

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚21👍52🔥2
👨‍💻 Microsoft анонсировала Chroma DB C# SDK

Теперь разработчики на C# и .NET могут легко интегрировать Chroma DB в свои AI-приложения — Microsoft анонсировала официальный SDK для работы с векторными базами данных.

Что такое Chroma DB

Chroma — это векторная база данных, предназначенная для поиска по эмбеддингам.

Она используется в приложениях с искусственным интеллектом, аналитикой данных и RAG-моделями (Retrieval Augmented Generation).

Как это использовать в C#

1. Добавляем Chroma в проект:
dotnet add package ChromaDB.Client


2. Подключаем Chroma в C#-коде:
using ChromaDB.Client;

var configOptions = new ChromaConfigurationOptions(uri: "https://localhost:8000/api/v1/");
using var httpClient = new HttpClient();
var client = new ChromaClient(configOptions, httpClient);


3. Создаём коллекцию и добавляем данные:
var collection = await client.GetOrCreateCollection("movies");
var collectionClient = new ChromaCollectionClient(collection, configOptions, httpClient);


Chroma DB C# SDK — ещё один шаг к тому, чтобы .NET-разработчики легко создавали мощные AI-приложения.

➡️ Подробнее в блоге разработчиков

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍135👾5
🐳🔍 Как найти утечки памяти в контейнере с .NET

Инструмент dotMemory от JetBrains помогает диагностировать и анализировать потребление памяти в .NET-приложениях, даже если они работают в контейнерах.

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

1️⃣ Запускаем приложение в контейнере

2️⃣ Подключаемся через dotMemory

dotMemory позволяет собирать дампы памяти прямо из работающего контейнера. Например, с помощью dotMemory CLT:
dotmemory start --save-to=memory_dump.dmp


3️⃣ Ищем утечки

Используем dotMemory, чтобы определить:
• Удерживаемые объекты .

• Долгоживущие объекты, которые не очищаются сборщиком мусора.

• Утечки, связанные с событиями и подписками.

💬 Боролись с утечками памяти в контейнерах? Какие инструменты использовали? Делитесь в комментариях ⬇️

➡️ Подробности в статье

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🌚2👾2
🌐 Avalonia UI — универсальный UI-фреймворк

Avalonia UI — это открытый фреймворк для создания настольных, мобильных и встраиваемых (IoT) приложений.

Он поддерживает Windows, macOS, Linux, iOS, Android и даже WebAssembly.

Почему Avalonia UI

Совместимость с XAML – привычный синтаксис WPF, но с дополнительными возможностями, которые делают разработку удобнее.

Native AOT — компиляция в нативный код делает приложения лёгкими, быстрыми и не требующими .NET Runtime.

Малый размер приложений — без тяжёлых зависимостей, в отличие от Electron.

Открытый исходный код — сообщество активно развивает фреймворк, исправляет ошибки и добавляет новые функции без привязки к корпорациям.

Гибкость в разработке — легко интегрируется с различными архитектурными паттернами (MVVM, ReactiveUI) и сторонними библиотеками.

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

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

➡️ Документация по фреймворку

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍263👾3
⚙️ Паттерн Saga в микросервисах

Saga — это паттерн управления распределёнными транзакциями, который помогает сохранить целостность данных без монолитных блокировок и традиционных ACID-ограничений.

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

Два подхода к реализации

1️⃣ Оркестрация

• Управляется централизованным координатором.

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

• Минус: если оркестратор падает, всё останавливается.

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

2️⃣ Хореография

• Нет центрального контроллера, сервисы реагируют на события друг друга.

• Нет узкого места в виде оркестратора.

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

•Плюс: масштабируемость, нет единой точки отказа.

Оркестрация проще в управлении, но менее гибкая. Хореография масштабируется лучше, но сложнее в отладке.

➡️ Подробнее про паттерн в источнике

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥3👾21
🛡 Поздравляем героев C#-программирования:

▪️ LINQ — спецназовец по зачистке коллекций. Девиз: «Зачем писать 20 строк, когда можно всё сделать в одну нечитаемую?»

▪️ async/await — командир отряда асинхронных операций. Спас целое поколение программистов от callback-ада.

▪️ garbage collector — главный санитар полка. Прибирается за всеми, но всегда в самый неподходящий момент.

Под чьей защитой ваш код выживает в продакшене? Докладывайте в комментариях 👇
22🔥11😁6🌚6
Документация PostgreSQL — лучший источник знаний о СУБД. Но она отличается огромным объемом: не каждый разработчик осилит 3024 страницы формата А4.

Опытный бэкендер составил список самых важных сведений, которые ему самому хотелось бы знать перед началом работы с PostgreSQL. Эта подборка сэкономит вам несколько недель изучения документации, и скорее всего, пригодится для работы с другими СУБД.

👉 Список самого важного
👍10🌚1
👉 Интенсив «Архитектуры и шаблоны проектирования» для middle и senior-разработчиков

Проверьте свои знания, ответив на 8 вопросов – https://proglib.io/w/08af6203

🧐 Кому подойдет?
Разработчикам, которые знают любой объектно-ориентированный язык программирования и хотят углубиться в архитектурные паттерны.

🎮 Как проходит обучение?
В течение всего интенсива вы будете создавать игру «Звездные войны» и применять ключевые архитектурные паттерны. В процессе изучите:
– Как строить гибкую архитектуру, которая не замедляет разработку
– Как применять IoC-контейнеры и писать модульные тесты
– Как использовать SOLID за пределами ООП
– Как внедрять CI/CD и снижать технический долг

👉 Подробная программа обучения

А по промокоду MIDDLE до 28 февраля вы получите дополнительную скидку на обучение
Please open Telegram to view this post
VIEW IN TELEGRAM
👾1
🚃 Фоновые задачи с Quartz.NET

Quartz — это открытая библиотека для планирования задач в .NET приложениях. Она позволяет разработчикам выполнять фоновые задачи в определенное время или с заданными интервалами.

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

Вот так выглядит регистрация задачи с запуском каждые 10 секунд:
var jobKey = new JobKey("MyBackgroundJob");

builder.Services.AddQuartz(q =>
{
q.AddJob<MyBackgroundJob>(opts => opts.WithIdentity(jobKey));

q.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity("MyBackgroundJob-trigger")
.WithSimpleSchedule(schedule => schedule
.WithIntervalInSeconds(10)
.RepeatForever()));
});


Пример cron-выражения — каждый день в 3 утра:
q.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity("DailyTrigger")
.WithCronSchedule("0 0 3 * * ?"));


➡️ Подробности на сайте инструмента

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22👾2
🎙Месяц на тесты

В обновлении .NET MAUI Community Toolkit от 17 января появилось офлайн-распознавание речи – теперь можно преобразовывать голос в текст без интернета на Android 33+ и iOS 13+.

Также разработчики исправили работу StatusBar на iOS, улучшили CameraView, MediaElement и Maps.

💭 Если вы уже тестировали новые фичи, как впечатления? Делитесь в комментариях👇

🖇 Почитать про релиз

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🌳 Бинарное дерево поиска (BST)

BST — это бинарное дерево, где:

• Значение в левой ветви меньше значения в узле.

• Значение в правой ветви больше значения в узле.

Такое свойство обеспечивает эффективный поиск, вставку и удаление — в среднем за O(log n).

Пример реализации:
class Node
{
public int Value;
public Node Left;
public Node Right;

public Node(int value)
{
Value = value;
Left = Right = null;
}

// Вставка нового значения в дерево
public void Insert(int value)
{
if (value < Value)
{
if (Left == null)
Left = new Node(value);
else
Left.Insert(value);
}
else if (value > Value)
{
if (Right == null)
Right = new Node(value);
else
Right.Insert(value);
}
}

// Поиск значения в дереве
public Node Search(int value)
{
if (value == Value)
return this;
if (value < Value && Left != null)
return Left.Search(value);
if (value > Value && Right != null)
return Right.Search(value);
return null;
}

// Обход дерева в порядке (LNR - InOrder)
public void InOrderTraversal()
{
if (Left != null)
Left.InOrderTraversal();

Console.Write(Value + " ");

if (Right != null)
Right.InOrderTraversal();
}
}


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

1️⃣ Вставка:

• Если значение меньше текущего узла, идём в левое поддерево.

• Если больше — в правое.

• Если узел пуст, создаём новый.

2️⃣ Поиск:

• Сравниваем искомое значение с текущим.

• Меньше — идём влево, больше — вправо, равное — нашли.

3️⃣ Обход:

• In-order обход (LNR) обходит узлы в отсортированном порядке.

💬 А вы уже реализовали BST? Делитесь опытом и вопросами в комментариях!

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👏21🔥1
🛠 Используем IOptions с record

В .NET 9 теперь можно использовать record-тип вместо классов для IOptions<T>.

В отличие от классов, record в IOptions<T> в .NET сравнивается по значению. Он неизменяем, что защищает настройки от случайных изменений, а его лаконичный синтаксис делает код более чистым и поддерживаемым.

Теперь можно определять конфигурационные записи, загружать их из appsettings.json и внедрять в сервисы через IOptions<T>. Кроме того, IOptionsSnapshot<T> и IOptionsMonitor<T> позволяют динамически обновлять настройки без перезапуска приложения.

➡️ Подробности и примеры

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15😢1
📸 Создание сканера штрих-кодов в .NET MAUI для Windows Desktop

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

Что потребовалось для разработки

.NET MAUI — кроссплатформенный фреймворк для разработки UI-приложений.

Dynamsoft Barcode Reader — SDK для распознавания штрих-кодов.

Windows Media API — работа с камерой и захват изображений.

SkiaSharp — библиотека для графического отображения результатов.

Как работает

1. Получение изображения с камеры с помощью Windows Media API.

2.Обработка кадра и передача его в Dynamsoft Barcode Reader.

3. Распознавание штрих-кода и отображение результата.

4. Вывод данных с графическим выделением кода через SkiaSharp.

➡️ Посмотреть реализацию

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12😁3
🚀 Когда стоит отказаться от DI через конструктор

Внедрение зависимостей через конструктор — стандартная практика, но не всегда лучшая. Разберём, когда не стоит её использовать.

🔹 Singleton со Scoped/Transient зависимостями — может вызвать утечки памяти. Решение: фабрики или внедрение через методы.

🔹 Слишком длинные конструкторы — усложняют поддержку. Решение: рефакторинг или внедрение через свойства.

🔹 Динамические зависимости — на этапе компиляции неизвестны. Решение: сервис-локаторы или фабрики.

💡 DI через конструктор хорош, но не универсален. Выбирайте подход в зависимости от контекста

➡️ Подробнее про решение проблем

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
😁12👍5🤔2
Совет на 2025-й — будьте осторожнее с выбором работы.

IT-рынок штормит: массовые сокращения, заморозка найма, снижение зарплат. В такое время особенно важно отличать стоящие офферы от проходных.

Знакомо? Открываешь вакансию, а там: «Ищем middle-разработчика с опытом 10 лет, знанием 15 языков и готовностью работать за печеньки. Офис в Челябинске, релокация за ваш счет» 🤦‍♂️

Чтобы не тратить время на сотни сомнительных предложений, подпишитесь на IT Job Hub. Там мы отфильтровываем весь мусор и публикуем только избранные вакансии в стабильных компаниях:

— Зарплаты на уровне рынка, а не на уровне голодного студента
— Никаких «мы молодая и дружная семья» — только адекватные условия
— Проверенные работодатели, а не стартапы из сомнительных сфер

Вакансии удобно разбиты по тегам: #python #java #go #data #devops и по другим направлениям. Без воды и лишнего спама — только проверенные вакансии в знакомых компаниях.

Подписывайтесь, если не хотите упустить работу мечты → @proglib_jobs
🥱8👍1😁1
🛠 Техника для решения задач

Бэктрекинг (Backtracking) — это алгоритмическая техника поиска, которая перебирает возможные решения рекурсивно, откатываясь назад, если текущий путь не ведёт к успеху.

Как работает бэктрекинг

1. Выбираем следующий шаг – пробуем одно из возможных решений.

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

3. Продолжаем поиск – если решение найдено, фиксируем его и ищем другие варианты.

Пример кода — поиск всех перестановок строки
class Program
{
static void Permute(char[] arr, int l, int r)
{
if (l == r)
{
Console.WriteLine(new string(arr));
}
else
{
for (int i = l; i <= r; i++)
{
(arr[l], arr[i]) = (arr[i], arr[l]); // Обмен символами
Permute(arr, l + 1, r);
(arr[l], arr[i]) = (arr[i], arr[l]); // Откат назад
}
}
}

static void Main()
{
string str = "ABC";
Permute(str.ToCharArray(), 0, str.Length - 1);
}
}


Где используется

• Генерация перестановок и комбинаций – подбор паролей, составление расписаний.

• Задача N ферзей – расстановка фигур без угрозы друг другу.

• Поиск пути в лабиринте – навигация в сложных структурах.

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

🤔 Использовали ли вы бэктрекинг в реальных проектах? Делитесь опытом в комментариях! 👇

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍4🔥2
🆚 Разница API и SDK

Если вы когда-либо работали с интеграциями, то наверняка сталкивались с терминами API и SDK. Но что они означают и когда использовать каждый из них.

📌 API (Application Programming Interface) — это набор методов для взаимодействия с внешними сервисами и приложениями.

📌 SDK (Software Development Kit) — это полный набор инструментов, включающий API, документацию, библиотеки и утилиты для разработки.

➡️ Подробнее в видео

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71
📊 Почему увольнять программистов ради ИИ — путь к провалу

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

➡️ Что внутри статьи

▪️ Почему новые поколения программистов рискуют потерять ключевые навыки.

▪️ Как компании, заменившие инженеров ИИ, столкнутся с серьезными проблемами.

▪️ Почему опытные разработчики станут супердорогими и востребованными.

▪️ К чему приведет полная ставка на искусственный интеллект в IT.

🔵 Подтяните свои знания о машинном обучении вместе с нашим курсом «Базовые модели ML и приложения»

🔗 Читайте статью
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13👾1