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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
👍 На курсе по контролируемой разработке AI-агентов мы будем разбирать ровно то, о чём говорит Владислав в голосовом, но уже в формате системной практики.

📅 Старт курса — 20 апреля.

Если хотите разобраться, как строить управляемые агентные системы:
➡️ Присоединяйтесь.

P.S. С первого занятия будет практика: код и разбор реальных ошибок, а не только теория.
Please open Telegram to view this post
VIEW IN TELEGRAM
📝 Вытащить текст из PDF на C#

Иногда нужно просто достать текст из PDF — для скрипта, личного инструмента или быстрой автоматизации под себя. Руками копировать лень, особенно если файлов несколько. Вот способ сделать это на C# без лишних телодвижений.

Что использовать

Библиотека Free Spire.PDF для .NET. Устанавливается через NuGet одной командой и не требует ничего стороннего — ни ридеров, ни внешних утилит.
Install-Package FreeSpire.PDF


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

Базовый пример — одна страница:
PdfDocument doc = new PdfDocument();
doc.LoadFromFile("Sample.pdf");

PdfPageBase page = doc.Pages[1]; // вторая страница
PdfTextExtractor extractor = new PdfTextExtractor(page);
PdfTextExtractOptions options = new PdfTextExtractOptions { IsExtractAllText = true };

string text = extractor.ExtractText(options);
File.WriteAllText("output.txt", text);

doc.Close();


Весь документ сразу:
StringBuilder allText = new StringBuilder();
foreach (PdfPageBase page in doc.Pages)
{
var extractor = new PdfTextExtractor(page);
var options = new PdfTextExtractOptions { IsExtractAllText = true };
allText.AppendLine(extractor.ExtractText(options));
}
File.WriteAllText("output.txt", allText.ToString());


Что ещё умеет библиотека

Зашифрованные PDF открываются передачей пароля прямо в LoadFromFile. Если нужен текст только из конкретной области страницы — задаёшь прямоугольник через ExtractArea в точках (1 point = 1/72 дюйма).

Для таблиц есть отдельный PdfTableExtractor, который возвращает данные в виде массива. Сканы и нечитаемые PDF решаются через Spire.OCR в связке с основной библиотекой.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔43
👨‍💻 Noundry готова к бою

Noundry это набор инструментов и библиотек для .NET разработки. В состав входит Tuxedo, Tailbreeze, Assertive, Authnz, Engine, AI Gateway и другие компоненты.

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

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

➡️ Веб-сайт

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥3
🤔 Вопрос с собеса

Классика интервью:
Что такое readonly struct и чем он отличается от обычной структуры


На собесе часто ловят на вопросе «когда использовать». Многие говорят просто «для безопасности», но это неправильный ответ.

Правильный ответ, который ждут на собесе ждёт только вас в нашем канале с вопросами с собесов

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
📎 JsonSerializerOptions в каждом запросе это бомба замедленного действия

Вы оптимизировали базу данных. Ничего не изменилось. Оптимизировали сетевые вызовы. Всё ещё медленно.

Оказалось, приложение создаёт новый JsonSerializerOptions в каждом запросе. Это уничтожает встроенный кеш метаданных System.Text.Json и превращает JSON сериализацию в дорогую операцию, которая повторяется сотни раз в секунду под нагрузкой.

Почему это так дорого

JsonSerializerOptions это не просто настройки. Это место, где System.Text.Json хранит кэшированные метаданные о том, как сериализовать и десериализовать типы.

Каждый новый экземпляр JsonSerializerOptions начинает с пустого кеша. System.Text.Json должна заново анализировать тип, строить информацию о сериализации, кешировать её. Потом запрос закончился и всё выбросилось.
Следующий запрос приходит. Новый экземпляр. Пустой кеш снова. Всё сначала.

Microsoft так серьёзно относится к этому, что добавили анализатор CA1869, который явно предупреждает: не создавайте JsonSerializerOptions локально в горячих путях.

Ошибка выглядит безобидно:
string ToJson(object value)
{
var options = new JsonSerializerOptions(JsonSerializerDefaults.Web)
{
WriteIndented = false
};
return JsonSerializer.Serialize(value, options);
}


Под нагрузкой это выглядит как:

• CPU растёт без видимых причин
• Задержка становится нестабильной, p99 скачет
• Профилер показывает JSON сериализацию как горячую точку
• А вы не понимаете почему, если оптимизировали всё остальное

Создайте JsonSerializerOptions один раз при старте приложения и переиспользуйте везде:
public static class JsonDefaults
{
public static readonly JsonSerializerOptions Web = new(JsonSerializerDefaults.Web)
{
WriteIndented = false,
Converters = { new JsonStringEnumConverter() }
};
}

Используем кеш, никаких затрат
return JsonSerializer.Serialize(payload, JsonDefaults.Web);


Одна переменная, кеш остаётся тёплым, производительность стабильной.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍39🔥3
🔎 Microsoft Foundry: февраль 2026

В феврале Foundry получил существенный апдейт. Вышли Claude 4.6 от Anthropic и Grok 4.0 от xAI, Agent Framework достиг release candidate с серьезными изменениями, и все SDK переходят на единую REST архитектуру.

Новые модели

Claude Opus 4.6 и Claude Sonnet 4.6 теперь доступны в Foundry. Opus для сложного рассуждения, Sonnet примерно того же уровня, но дешевле. Оба поддерживают миллион токенов контекста и 128K токенов в ответе.

Grok 4.0 от xAI стал GA. Одновременно вышла Grok 4.1 Fast для классификации и маршрутизации без рассуждений: 0.20 долларов за миллион на вход.

GPT-Realtime-1.5 и GPT-Audio-1.5 улучшили следование инструкциям на 7% и точность транскрипции на 10%.

FLUX.2 Flex специально для UI дизайна с текстом.

Agent Framework: Release Candidate и HITL

Agent Framework вышел в 1.0.0rc1 с замороженным API. Общий выпуск уже рядом, но есть разрывающие изменения.

Главные перемены:

• Учетные данные теперь используют Azure Identity вместо токена
• Сессии вместо потока
• response.messages вместо response.text
create_version() вместо create()
• Предварительные операции в подкаталоге .beta

REST API v1 GA

Foundry REST API v1 теперь production-ready. Все основные эндпоинты заморожены: чаты, ответы, встраивания, файлы, тонкая настройка, модели, хранилища векторов.

Если ваш SDK еще в pre-release, можете запросить REST API напрямую.

SDK обновления

.NET 2.0.0-beta.1: ImageBasedHostedAgentDefinition объединили с HostedAgentDefinition.

Foundry Local и VS Code

Foundry Local теперь поддерживает большие мультимодальные модели полностью автономно без облака.

AI Toolkit for VS Code v0.30.0 добавил Tool Catalog для поиска инструментов, Agent Inspector для дебага с F5 breakpoints и переделанный Agent Builder.

В марте SDK будут общедоступны. Обновитесь к RC сейчас, если используете.

➡️ Блог разработчиков

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻 Кэширование в три слоя — спасение базы данных

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

Неправильный подход это кэшировать все и везде без логики. Правильный подход это иметь стратегию кэширования с разными слоями.

Первый слой: память приложения

MemoryCache в .NET работает очень быстро, потому что данные лежат в памяти одного процесса. Здесь кэшируются часто запрашиваемые данные с коротким временем жизни. Профили пользователей, настройки, статические справочники. TTL может быть 30 секунд или минута.

Второй слой: распределенный кэш

Redis или Memcached. Когда приложение запущено на нескольких контейнерах, они должны видеть одни и те же данные. Если один контейнер кэшировал профиль пользователя, остальные должны получить его без запроса в БД.

Третий слой: кэширование ответов

Некоторые API ответы не зависят от пользователя и могут быть закэшированы целиком. Если GET /api/countries возвращает список стран, это можно кэшировать на час, потому что страны не меняются часто.

На практике такая архитектура может снизить нагрузку на базу данных на 80 процентов. Просто потому, что большинство запросов идут в кэш, а не в БД.

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

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
💥 Открытый вебинар | ИИ-агенты в продакшене: от хайпа к деньгам

Агенты уже везде. Но мало кто признаётся, сколько денег сжёг на бесконечных циклах, галлюцинациях в RAG и отсутствии мониторинга.

Полина Полунина, руководитель AI-направления Альфа-Банка, расскажет честно:

▪️ Чем агент отличается от «просто GPT с промптом» и когда бизнесу достаточно обычного LLM
▪️ 3 реальных кейса из корпоративной среды: что взлетело, а что нет
▪️ Live-демо работающего агента
▪️ ТОП-5 граблей, на которые наступают команды при внедрении

⏱️ 10 марта в 19:00 (МСК)

🎁 Участники получат промокод на скидку на самый полный курс по ИИ-агентам

👉 Регистрируйся
1
🖥 Первый дайджест весны

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

Cake 6.0.0 вышел

Спам тимлидам, фейковые офферы и приукрашенное резюме

Merge conflict для календаря

NuGet стал удобнее

Noundry готова к бою

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
🛠 MCP C# SDK v1.0

Стабильная версия пакета разработчика принесла полезные фичи для интеграции ИИ в .NET.

OAuth теперь проще. Сервер может хранить метаданные тремя способами, пакет найдёт сам.

Инструменты теперь получают иконки. Настраивается через атрибут:
[McpServerTool(IconSource = "https://example.com/icon.svg")]
public static string GetWeather(string city) { }


Инструменты в запросах к модели

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

На клиенте объявляйте поддержку:
var mcpClient = await McpClient.CreateAsync(
new HttpClientTransport(new() { Endpoint = new Uri("http://localhost:6184") }),
clientOptions: new()
{
Capabilities = new ClientCapabilities
{
Sampling = new SamplingCapability { Tools = new SamplingToolsCapability {} }
}
});


На сервере просто передавайте инструменты в запрос:
Tool rollDieTool = new Tool()
{
Name = "roll_die",
Description = "Rolls a six-sided die and returns 1-6."
};


Долгоживущие запросы

Раньше при разрыве соединения нужно было пересоединяться. Теперь сервер отправляет пустое событие с ID и может закрыть соединение. Клиент переподключится через этот ID.

На сервере:
builder.Services.AddDistributedMemoryCache();
builder.Services.AddMcpServer()
.WithHttpTransport()
.WithDistributedCacheEventStreamStore()
.WithTools<MyTools>();


В обработчик вызовите:
await context.EnablePollingAsync(retryInterval: TimeSpan.FromSeconds(5));


Задачи для долгих операций

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

На сервере:
var taskStore = new InMemoryMcpTaskStore();
builder.Services.AddMcpServer(options => { options.TaskStore = taskStore; })
.WithHttpTransport();


Инструменты автоматически поддерживают задачи если возвращают Task:
[McpServerTool(TaskSupport = ToolTaskSupport.Required)]
public static async Task<string> ProcessData(int count, CancellationToken ct)
{
await Task.Delay(TimeSpan.FromSeconds(8), ct);
return $"Processed {count} records.";
}


На клиенте:
var result = await client.CallToolAsync(
new CallToolRequestParams
{
Name = "processDataset",
Task = new McpTaskMetadata { TimeToLive = TimeSpan.FromHours(2) }
});

var completedTask = await client.PollTaskUntilCompleteAsync(result.Task.TaskId);


Версия 1.0 это полноценная платформа для ИИ интеграции в .NET.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72
👨‍💻 Протокол против AI слопа в вебе

Есть потрясающий проект, который пытается решить одну из главных проблем современного интернета: как узнать, создан ли контент человеком или это просто сгенерированный AI?

Как работает доверие

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

Потом система ищет все сайты, которые эти люди одобрили. Это 1 хоп. Потом сайты, которые одобрили они. Это 2 хопа. И так далее.

Если видите сайт, который находится на расстоянии 1-2 хопа от человека, которому вы доверяете, то это реальный контент с высокой вероятностью.

Расстояние визуализируется цветом: зелёный (0-1 хоп), жёлтый (2), оранжевый (3+).

Вы публикуете на своём сайте JSON файл:

{
"version": "0.1.1",
"url": "https://example.com",
"vouches": [
{
"url": "https://trusted-person.com",
"vouched_at": "2026-01-15"
}
]
}


И в <head> добавляете:
<link rel="human-json">


Браузерное расширение видит эту ссылку и проверяет: есть ли у этого человека люди, которые его одобрили. Если есть, и они находятся на расстоянии 1-2 хопа от Вас, сайт получает зелёный индикатор.

Если Вы добавите human.json сейчас, Вы будете в первой волне. Это как было с SSL 15 лет назад.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5