🔐 NuGet: Microsoft меняет сертификат подписи
С 23 сентября Microsoft использует новый сертификат для подписи NuGet-пакетов. Если у вас настроен allowlist доверенных сертификатов, сборки могут начать падать с NU3034.
Что сделать:
Старые сертификаты удалять не нужно — они нужны для уже опубликованных пакетов.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#async_news
С 23 сентября Microsoft использует новый сертификат для подписи NuGet-пакетов. Если у вас настроен allowlist доверенных сертификатов, сборки могут начать падать с NU3034.
Что сделать:
dotnet nuget trust author Microsoft \
9A1B131BEE0605433056A4EA3815478A8E177961A968C6C0027C1093D1FEB630 \
--algorithm SHA256
Старые сертификаты удалять не нужно — они нужны для уже опубликованных пакетов.
📍 Навигация: Вакансии • Задачи • Собесы
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3👾1
Когда приложение падает с необработанным исключением, стандартное поведение многих фреймворков — вывести стек вызовов прямо в ответ. Пользователь видит внутренние пути файлов, названия классов, фрагменты кода. Для злоумышленника это готовая карта уязвимостей.
Допустим, в ASP.NET приложении возникает необработанное исключение. Без явной настройки middleware фреймворк вернёт подробный ExceptionDetails с именем метода, строкой кода и трассировкой стека. Атакующий получает информацию о структуре проекта, версиях библиотек и логике работы приложения без каких-либо усилий.
Правильный подход это перехват всех необработанныъ исключений. Нужно логировать их внутри системы и возвращать пользователю только нейтральное сообщение.
В ASP.NET это делается через UseExceptionHandler:
app.UseExceptionHandler(errorApp =>
{
errorApp.Run(async context =>
{
var exceptionHandlerPathFeature =
context.Features.Get<IExceptionHandlerPathFeature>();
var logger = context.RequestServices
.GetRequiredService<ILogger<Program>>();
logger.LogError(exceptionHandlerPathFeature?.Error,
"Unhandled exception");
context.Response.StatusCode = 500;
await context.Response.WriteAsJsonAsync(new
{
message = "Something went wrong. Please try again later."
});
});
});
Middleware перехватывает исключение, передаёт его в ILogger — туда, где его увидит только команда разработки — и возвращает клиенту простой JSON с универсальным сообщением об ошибке. Никаких деталей реализации наружу не уходит.
ILogger пишет в вашу систему мониторинга — будь то Application Insights, Seq, Serilog или любой другой инструмент. Вы по-прежнему видите полный стек вызовов и можете разобраться в причине ошибки. Пользователь при этом получает понятное сообщение, а не технический мусор.
Это базовая практика защиты приложений. Она не требует сложной архитектуры, достаточно одного middleware, настроенного в точке входа приложения.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22
Логирование c интерполяцией строк один из самых распространённых источников лишних аллокаций в .NET-приложениях.
Особенность в том, что код выглядит абсолютно нормально и работает правильно — просто дорого.
logger.LogInformation($"User {userId} logged in at {time}");
logger.LogInformation(string.Format("User {0} logged in at {1}", userId, time));
Строка формируется до вызова метода. Если уровень логирования Information отключён, строка всё равно создаётся, занимает память и тут же выбрасывается сборщиком мусора.
logger.LogInformation("User {UserId} logged in at {Time}", userId, time);
Здесь строка — это шаблон. Аргументы передаются отдельно. Логгер сначала проверяет, активен ли уровень, и только потом форматирует сообщение. Если уровень выключен — аллокации нет вообще.
Бонус: структурное логирование позволяет индексировать поля в системах вроде Seq, Elasticsearch, Datadog — вы сможете искать по UserId как по полю, а не парсить текст.
// Генерирует оптимальный код на этапе компиляции:
[LoggerMessage(Level = LogLevel.Information, Message = "User {UserId} logged in at {Time}")]
partial void LogUserLogin(int userId, DateTime time);
Никаких аллокаций, никакого боксинга, максимальная производительность — и всё это без изменения читаемости кода.
📍 Навигация: Вакансии • Задачи • Собесы
#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍9❤3🤔1
Forwarded from Библиотека Go-разработчика | Golang
Перенос MiniJinja с Rust на Go силами Opus и Codex
Около десяти часов работы агента и примерно 45 минут активного участия автора. Так Армин Ронахер оценивает основной перенос MiniJinja с Rust на Go. MiniJinja собирает текст по шаблонам.
Он начал с Opus 4.5 внутри Pi, а оставшиеся исправления тестов передал GPT-5.2 Codex. Рабочая среда оставалась той же; Go-реализацию сверяли с сохранёнными результатами тестов Rust-версии.
По ходу работы агент отказался от проверок, в которых программа должна завершаться ошибкой: текст сообщений не совпадал дословно. Ронахер вмешался и сохранил эти тесты, изменив способ сравнения сообщений.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
Около десяти часов работы агента и примерно 45 минут активного участия автора. Так Армин Ронахер оценивает основной перенос MiniJinja с Rust на Go. MiniJinja собирает текст по шаблонам.
Он начал с Opus 4.5 внутри Pi, а оставшиеся исправления тестов передал GPT-5.2 Codex. Рабочая среда оставалась той же; Go-реализацию сверяли с сохранёнными результатами тестов Rust-версии.
По ходу работы агент отказался от проверок, в которых программа должна завершаться ошибкой: текст сообщений не совпадал дословно. Ронахер вмешался и сохранил эти тесты, изменив способ сравнения сообщений.
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Forwarded from Библиотека Go-разработчика | Golang
Поделитесь своим подходом к работе с нейросетями:
Anonymous Poll
62%
Пользуюсь только чем-то одним для всего подряд
16%
Под каждую задачу подбираю свой инструмент
11%
Сравниваю, что на один и тот же вопрос ответят разные модели
8%
Пока вообще не пользуюсь ИИ
3%
Другое (напишу в комментариях)
Forwarded from Библиотека программиста
Разбираете урок, слушаете интервью фоном или начинаете на телефоне, а продолжаете на большом экране?
Хотим узнать, что делает просмотр удобным для вас. Вспомните последнее видео — ролик, урок, фильм или серию сериала — и расскажите о своём опыте. Если детали не запомнились, можно так и ответить.
В результатах сможете сравнить свои привычки с ответами других участников. А разработчики и инженеры видеоплатформы расскажут, что происходит по ту сторону экрана, пока вы смотрите видео.
Please open Telegram to view this post
VIEW IN TELEGRAM
Открыли большой solution и ждёте, пока IDE разберётся со всеми проектами? В предварительной версии C# Dev Kit 11.0 Microsoft изменила порядок загрузки: активный файл получает подсказки и диагностику первым.
В замерах команды для Aspire с 407 проектами готовность активного файла сократилась с «до 84,1 секунды» до 0,47 секунды. Весь solution загрузился за 3 секунды вместо 84,1. Это результаты конкретного проекта, не обещание ускорить любой репозиторий в 180 раз.
— добавили кеш модели проектов для повторных открытий;
— объединили шесть managed-процессов в один сервер;
— собрали этот сервер через Native AOT.
Версия 11.0 пока доступна в pre-release. Если хотите проверить эффект на своём solution, переключитесь на предварительную версию расширения. Первое построение кеша и повторная загрузка — разные сценарии: измерять их стоит отдельно.
📍 Навигация: Вакансии • Задачи • Собесы
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
Популярная запись исчезла из кеша. Сто запросов одновременно увидели промах и пошли за ней в базу. Кеш есть, а нагрузка всё равно прилетела залпом — это 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
👍4🔥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%
Документацию
18%
Результаты работы
19%
Настройки и контекст: историю чатов, промпты, скиллы
50%
Ничего, использую один инструмент