Популярная запись исчезла из кеша. Сто запросов одновременно увидели промах и пошли за ней в базу. Кеш есть, а нагрузка всё равно прилетела залпом — это cache stampede.
HybridCache умеет объединять конкурентные обращения за одним ключом: один вызов получает данные, остальные ждут его результат.
var product = await cache.GetOrCreateAsync(
$"product:{id}",
async token => await repository.LoadAsync(id, token),
cancellationToken: cancellationToken);
Для регистрации нужен пакет Microsoft.Extensions.Caching.Hybrid и вызов
builder.Services.AddHybridCache();. Без Redis тоже работают локальный кеш и защита от такого залпа.Объединение запросов действует внутри одного экземпляра HybridCache. Два сервера могут одновременно обратиться к базе, даже если используют общий Redis. Это полезная защита локального кеша, но не распределённая блокировка на весь кластер.
📍 Навигация: Вакансии • Задачи • Собесы
#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
Forwarded from Типичный программист
Общая папка для работы Claude Code и Codex
Луи-Франсуа Бушар собрал заметки, инструкции-скиллы, скрипты и итоги встреч в Obsidian. Его связка устроена так:
Папка хранит исходные материалы и решения
↓
Индекс указывает, где искать данные для задачи
↓
Claude Code планирует работу
↓
Codex выполняет задачи по его вызову
В описании этого рабочего процесса Бушар объясняет, зачем даёт агенту сведения для конкретной задачи. Начать предлагает с общей папки, короткого индекса и одного повторно используемого скилла.
#ии #инструменты
Луи-Франсуа Бушар собрал заметки, инструкции-скиллы, скрипты и итоги встреч в Obsidian. Его связка устроена так:
Папка хранит исходные материалы и решения
↓
Индекс указывает, где искать данные для задачи
↓
Claude Code планирует работу
↓
Codex выполняет задачи по его вызову
В описании этого рабочего процесса Бушар объясняет, зачем даёт агенту сведения для конкретной задачи. Начать предлагает с общей папки, короткого индекса и одного повторно используемого скилла.
#ии #инструменты
Forwarded from Типичный программист
Типичный программист
Общая папка для работы Claude Code и Codex Луи-Франсуа Бушар собрал заметки, инструкции-скиллы, скрипты и итоги встреч в Obsidian. Его связка устроена так: Папка хранит исходные материалы и решения ↓ Индекс указывает, где искать данные для задачи ↓ Claude…
Приходится ли вам копипастить данные и какие именно, когда переходите из одной нейросети в другую?
Anonymous Poll
18%
Код
28%
Описание задачи
14%
Документацию
17%
Результаты работы
20%
Настройки и контекст: историю чатов, промпты, скиллы
50%
Ничего, использую один инструмент
Вручную перекладывать двадцать свойств в DTO скучно. Но и разбираться, что библиотека сделает с ними во время выполнения, хочется не всегда. Mapperly предлагает другой вариант: сгенерировать обычный C#-код при сборке.
using Riok.Mapperly.Abstractions;
[Mapper]
public partial class UserMapper
{
public partial UserDto ToDto(User source);
}
Сигнатуру пишете вы, реализацию добавляет source generator. Её можно посмотреть и проверить: какие свойства перенеслись, как обрабатывается null и где выполняется преобразование.
Маппинг не требует reflection во время выполнения. А диагностика сборки может предупредить о свойстве, которое не удалось сопоставить.
При этом генератор не знает бизнес-смысл данных. Если имя поля поменялось или преобразование требует правила, это нужно описать явно. Автоматизировать присваивания можно; проверку контракта DTO всё равно стоит оставить себе.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9👾3
Forwarded from Типичный программист
🧑💻 Какие навыки помогают вам в разработке в 2026 году?
Что вы чаще используете в работе? В каких задачах помогает ИИ, а где проще справиться самостоятельно?
Мы решили собрать портрет современного разработчика — и приглашаем вас поделиться своим опытом. Расскажите, какие навыки вам пригодились и как вы используете ИИ. Если обходите его стороной, нам тоже интересно узнать почему.
Опрос анонимный и займёт около 5 минут. Результаты опубликуем в общем большом исследовании.
👉 Пройти опрос
Что вы чаще используете в работе? В каких задачах помогает ИИ, а где проще справиться самостоятельно?
Мы решили собрать портрет современного разработчика — и приглашаем вас поделиться своим опытом. Расскажите, какие навыки вам пригодились и как вы используете ИИ. Если обходите его стороной, нам тоже интересно узнать почему.
Опрос анонимный и займёт около 5 минут. Результаты опубликуем в общем большом исследовании.
👉 Пройти опрос
❤1
Если передать в Task.WhenAll тысячу задач обращения к API, он дождётся их завершения. Но ограничивать число одновременных запросов за вас не будет.
Когда нужно обрабатывать коллекцию с заданным параллелизмом, пригодится Parallel.ForEachAsync:
await Parallel.ForEachAsync(
ids,
new ParallelOptions
{
MaxDegreeOfParallelism = 8,
CancellationToken = cancellationToken
},
async (id, token) =>
{
await LoadAsync(id, token);
});
Здесь одновременно выполняются не более восьми обработчиков. Токен отмены передаётся внутрь каждой итерации. Поддерживается и источник IAsyncEnumerable.
Это ограничение конкурентности, а не rate limit. Если API разрешает фиксированное число запросов за минуту, нужен отдельный механизм ограничения частоты. И не делите один DbContext между параллельными итерациями: каждый обработчик должен работать с подходящим ему контекстом.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2🥰1
Нужно регулярно обновлять данные в фоне, но не хочется запускать второй обход поверх первого? С PeriodicTimer можно построить один последовательный async-цикл.
using var timer = new PeriodicTimer(
TimeSpan.FromSeconds(10));
while (await timer.WaitForNextTickAsync(stoppingToken))
{
await RefreshAsync(stoppingToken);
}
Пока RefreshAsync не закончится, следующая итерация этого цикла не начнётся. Но это не то же самое, что «десять секунд отдыха после каждой работы».
Таймер объединяет несколько тиков, пришедших между ожиданиями, в один. Если обновление заняло 25 секунд, не появится очередь из всех пропущенных запусков. Следующее ожидание может завершиться сразу.
У таймера должен быть один потребитель. Отмена ожидания через токен приводит к OperationCanceledException — её нужно учитывать при остановке фонового сервиса.
📍 Навигация: Вакансии • Задачи • Собесы
#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Что будет после трёх секунд ожидания?
Task request = LoadAsync();
await request.WaitAsync(
TimeSpan.FromSeconds(3));
❤️ — LoadAsync автоматически остановится
👍 — ожидание завершится по таймауту, операция может продолжиться
🔥 — заблокируется текущий поток
Ответ:
Не стоит считать таймаут гарантией, что работа больше не выполняется. Для HTTP-запроса, записи в файл или внешнего задания это разные обещания: «я больше не жду» и «операция действительно остановлена».
📍 Навигация: Вакансии • Задачи • Собесы
#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2
Производитель добавляет задания быстрее, чем обработчик успевает их выполнять. Неограниченная очередь продолжает расти — пока запас памяти не заканчивается.
Для передачи работы между частями .NET-приложения можно использовать ограниченный Channel:
var queue = Channel.CreateBounded<string>(
new BoundedChannelOptions(100)
{
FullMode = BoundedChannelFullMode.Wait
});
await queue.Writer.WriteAsync(job, cancellationToken);
Когда в очереди сто элементов, WriteAsync ждёт свободного места. TryWrite в той же ситуации сразу вернёт false. Так появляется backpressure: производитель видит, что потребитель не успевает.
Задания должен читать параллельно работающий потребитель. Если сначала заполнить очередь, а читать начать только после всех записей, код может застрять на заполнении.
Channel помогает координировать работу внутри процесса. Он не сохраняет задания после перезапуска и не заменяет надёжный внешний брокер сообщений.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👾1
Переменная объявлена через базовый класс. Значит ли это, что каждый вызов метода обязательно пройдёт через таблицу виртуальных методов?
Animal animal = new Dog();
animal.Speak();
Если JIT видит конкретный тип объекта, он может вызвать метод Dog напрямую, а затем встроить его тело в вызывающий код. Это открывает дорогу другим оптимизациям: вычислению констант и удалению ненужных веток.
Для менее очевидных случаев есть динамический PGO. Среда собирает сведения о реальных типах и может создать быстрый путь для наиболее частого варианта. Проверка типа остаётся: если вместо Dog придёт Cat, выполнится корректный запасной путь.
В разборе .NET 11 Стивен Тауб показывает новые оптимизации этих сценариев. Это повод измерить горячие участки на новой среде, а не переписать все интерфейсы ради скорости.
Сравнивать стоит Release-сборки через BenchmarkDotNet. Выигрыш отдельного микробенчмарка не равен ускорению всего приложения. .NET 11 пока находится на стадии RC.
#il_люминатор
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤🔥2🥰1
До 31 октября в Proglib Academy можно выбрать два курса и заплатить только за один.
Например, можно совместить:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
Вместе курсы стоят 108 000 ₽, но по акции оба обойдутся в 59 000 ₽. Экономия — 49 000 ₽
Интересуют Python и ИИ или алгоритмы и архитектура? Можно выбрать любые два курса из каталога.
Please open Telegram to view this post
VIEW IN TELEGRAM
Новая версия зависимости появилась час назад. Хотите дать ей немного времени, прежде чем автоматическое обновление принесёт её в проект?
В .NET 11 RC2 минимальный возраст версии можно задать через CLI:
dotnet nuget add source https://api.nuget.org/v3/index.json --name public --min-publish-age-hours 24 --configfile nuget.config
Команда записывает настройку minPublishAgeHours для источника в nuget.config. При выборе версии команды dotnet package add и dotnet package update учитывают этот срок.
Для уже добавленного источника:
dotnet nuget update source public --min-publish-age-hours 48 --configfile nuget.config
Пакет не становится безопасным автоматически через сутки. Настройка лишь даёт время обнаружить проблемы со свежим выпуском.
Не стоит считать её универсальным запретом на установку любой явно закреплённой свежей зависимости. А при восстановлении зависимостей с плавающими версиями отсутствие подходящей версии приводит к NU1020 — конфликт становится видимым.
#sharp_view
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
core/release-notes/11.0/preview/rc2/nuget.md at main · dotnet/core
.NET news, announcements, release notes, and more! - dotnet/core
❤2
Меняете шрифт контейнера, затем отступы дочерних элементов — и интерфейс несколько раз пересчитывает разметку. Чем сложнее дерево, тем заметнее лишняя работа.
В .NET 11 RC2 для такого обновления можно использовать область приостановки:
using System.Windows.Forms;
using (container.SuspendPainting(
LayoutSuspendTraversal.TargetAndDescendants))
{
container.Font = newFont;
foreach (Control child in container.Controls)
{
child.Margin = new Padding(8);
}
}
Область приостанавливает перерисовку контейнера и перерасчёт разметки для него и потомков. При выходе из using всё возобновляется, даже если внутри возникло исключение.
Вызов SuspendPainting() без аргументов приостанавливает только перерисовку целевого элемента. Перерасчёт разметки он не останавливает.
TargetAndDescendants относится к обходу дерева для приостановки разметки: это не отдельная блокировка рисования каждого потомка.
Открывайте область до изменения свойств, которые запускают перерасчёт, и выполняйте обновление в UI-потоке. Код рассчитан на .NET 11, пока это RC.
#sharp_view
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
core/release-notes/11.0/preview/rc2/winforms.md at main · dotnet/core
.NET news, announcements, release notes, and more! - dotnet/core
👍3❤1😁1
Обычного списка сообщений мало, когда агент вызывает инструменты, ждёт подтверждения и меняет данные приложения. Пользователю нужно видеть, что происходит прямо сейчас.
Microsoft представила экспериментальный пакет Microsoft.AspNetCore.Components.AI. Начать можно с готового компонента:
<ChatPage Agent="_agent"
Placeholder="Что нужно сделать?" />
В основе — UIAgent, который работает с IChatClient и превращает поток обновлений ответа в наблюдаемые блоки содержимого. Компоненты могут отображать текст, вызовы инструментов и запросы подтверждения по мере их поступления.
Есть и более низкоуровневые части: MessageList, MessageInput и BlockRenderer. Из них можно собрать собственный интерфейс вместо готовой страницы.
Пакет экспериментальный; инструкция в статье использует .NET 11 RC1 и предварительную версию пакета. Разрешения на вызов инструментов, серверные проверки и обработку файлов или аудио приложение организует само.
Это заготовки интерфейса и состояния. Подключение красивого чата само по себе не даёт агенту безопасного доступа к вашим данным.
#async_news
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.
Например, можно совместить два направления по работе с ИИ:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.
Акция действует до 31 октября включительно
Please open Telegram to view this post
VIEW IN TELEGRAM
Лямбда использует значение из окружающей области:
let sumWithOffset k xs =
List.fold
(fun total value -> total + value + k)
0
xs
Такие захваты могут требовать создания замыкания. В FSharp.Core из .NET 11 RC2 больше функций обхода List и Array умеют встраивать переданные лямбды, убирая часть этих выделений памяти.
В измерениях автора изменений для отдельных вызовов List.fold, List.exists, Array.fold и Array.fold2 с захватывающими лямбдами расход снизился с 24 байт до нуля по сравнению с FSharp.Core 9.0.100.
Это не обещание, что теперь любой fold или произвольная обработка коллекции ничего не выделяет. Влияют форма вызова, возможность встраивания и работа внутри самой функции.
Практический вывод: перед ручной заменой функционального кода на цикл проверьте горячий участок на новой версии. Часть расходов уже может убрать компилятор и библиотека.
.NET 11 пока в RC; измерения лучше повторить на своём сценарии.
#il_люминатор
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
core/release-notes/11.0/preview/rc2/fsharp.md at main · dotnet/core
.NET news, announcements, release notes, and more! - dotnet/core
👍1
Пробуете .NET 11 и написали свой форматтер ошибок валидации? При переходе с предыдущих preview на RC2 стоит проверить этот участок.
Интерфейс IValidationMessageFormatter, появившийся в предварительных версиях .NET 11, удалён. Для собственных атрибутов валидации теперь предлагается переопределять метод базового ValidationAttribute:
FormatMessage(string format, string name)
Через него можно передать в локализованное сообщение дополнительные аргументы, специфичные для атрибута. Начиная с RC2, этот метод использует и механизм Microsoft.Extensions.Validation.
Прежде всего тем, кто уже экспериментирует с preview .NET 11 и расширял форматирование сообщений. Если у вас стабильный проект на .NET 10, удалённый preview-интерфейс мог вообще не попасть в код.
При обновлении проверьте сборку собственных атрибутов и тесты точного текста ошибок. Проходящая проверка данных ещё не гарантирует, что пользователь увидит сообщение с нужными подстановками.
Это изменение RC2, а не отдельный стабильный релиз ASP.NET Core.
#sharp_view
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
core/release-notes/11.0/preview/rc2/aspnetcore.md at main · dotnet/core
.NET news, announcements, release notes, and more! - dotnet/core
❤2
Microsoft выпустила внеплановое обновление .NET, которое закрывает переполнение буфера при распаковке Brotli. Ошибка позволяет читать или повреждать память процесса при обработке специально подготовленных данных.
Проверьте приложения, которые используют
BrotliStream, распаковку входящих запросов ASP.NET Core или автоматическую распаковку ответов HttpClient.Исправления вышли в .NET 8.0.33, 9.0.22, 10.0.14 и 11 RC3. Установленные среды выполнения можно посмотреть командой:
dotnet --list-runtimes
Дальше обновите приложение с учётом способа развёртывания: для framework-dependent установите новый runtime и перезапустите процесс, для self-contained пересоберите и опубликуйте приложение. Контейнеры пересоберите на обновлённых образах .NET.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что можно освоить?
⏬ ИИ для разработчиков — применение ИИ на разных этапах разработки: от работы с кодом до тестирования, ревью и организации рабочего процесса.⏬ Разработка ИИ-агентов — создание собственных агентов с памятью, интеграциями и доступом к внешним инструментам.
Научитесь не просто работать с нейросетями, а создавать решения, которые помогают автоматизировать реальные задачи
Можно выбрать эту пару или сочетать любые другие курсы из каталога — под свои интересы и цели.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Microsoft представила dotnetup — менеджер SDK и сред выполнения .NET. Он хранит установки в папке пользователя, поддерживает несколько версий и учитывает закреплённый в проекте SDK через
global.json.После установки инструмента доступны три основные команды:
dotnetup init
dotnetup list
dotnetup update
Первая настраивает окружение и устанавливает актуальный стабильный SDK. Вторая показывает установленные компоненты. Третья обновляет версии в отслеживаемых каналах; точно закреплённые версии остаются на месте.
Инструмент пригодится, если вы ведёте несколько проектов с разными версиями .NET или регулярно проверяете предварительные сборки. Сейчас dotnetup доступен в public preview. Начать удобно с локального окружения macOS или Linux.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤🔥1