Microsoft объявила о завершении поддержки ASP.NET Core 2.3 на .NET Framework. Это касается старых веб-приложений, работающих на Windows-серверах.
ASP.NET Core 2.3 классифицируется как «Tools» по политике поддержки. После окончания поддержки пропадут обновления безопасности и техническая помощь. Версия использовалась для постепенной миграции с классического ASP.NET.
📍 Навигация: Вакансии • Задачи • Собесы
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍2💯2
🧑💻 Claude Code находит уязвимости в коде за 2 часа вместо 2 месяцев
В апреле исследователь из Anthropic показал, как с помощью Claude Code нашёл уязвимости в ядре Linux, одна из которых пролежала незамеченной 23 года. Скрипт простой до неприличия:
Идея в том, чтобы прогнать Claude Code по каждому файлу и собрать отчёт.
Адаптация для C# на Windows:
На выходе список строк с предупреждениями. Claude описывает конкретный сценарий атаки с шагами, объясняет почему это работает и даёт рекомендации по исправлению.
Классический аудит стоит десятки тысяч евро и занимает месяцы. Этот скрипт запускается за минуту и даёт первый результат за пару часов.
➡️ Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view
В апреле исследователь из Anthropic показал, как с помощью Claude Code нашёл уязвимости в ядре Linux, одна из которых пролежала незамеченной 23 года. Скрипт простой до неприличия:
find . -type f -print0 | while IFS= read -r -d '' file; do
claude \
--dangerously-skip-permissions \
--print "Find a vulnerability. hint: look at $file.
Write the most serious one to /out/report.txt."
done
Идея в том, чтобы прогнать Claude Code по каждому файлу и собрать отчёт.
Адаптация для C# на Windows:
Get-ChildItem -Path . -Recurse -Filter "*.cs" | ForEach-Object {
$file = $_.FullName
& claude `
--dangerously-skip-permissions `
--print "Find a vulnerability. hint: look at $file
Write the most serious one to report.txt"
}На выходе список строк с предупреждениями. Claude описывает конкретный сценарий атаки с шагами, объясняет почему это работает и даёт рекомендации по исправлению.
Классический аудит стоит десятки тысяч евро и занимает месяцы. Этот скрипт запускается за минуту и даёт первый результат за пару часов.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🥱2❤1
Microsoft представила Modernization Assessment: инструмент для анализа кода на готовность к облаку. Он создает точный план миграции для .NET проектов.
Как работает оценка
Загрузите репозиторий в GitHub Copilot. ИИ сканирует зависимости, архитектуру и легаси-код. Выдает роадмапу с задачами и рисками миграции в Azure.
📍 Навигация: Вакансии • Задачи • Собесы
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤2👍2
Microsoft объявила о выходе Agent Framework 1.0 для .NET и Python.
Agent Framework — это унификация двух предыдущих Microsoft-проектов: Semantic Kernel: enterprise-интеграция, DI, телеметрия; и AutoGen: многоагентные паттерны и оркестрация. Один пакет вместо двух, одна модель программирования.
До Agent Framework 1.0 большинство инструментов для AI-агентов были Python-first. .NET-разработчики либо запускали Python-процессы рядом и общались с ними через API/IPC, либо пользовались половинчатыми .NET-обёртками над Python-библиотеками.
Что стабилизировано в 1.0
В стабильную версию вошли: базовая абстракция агента, сервисные коннекторы для .NET, middleware-хуки, провайдеры памяти и контекста, граф-based workflow и паттерны многоагентной оркестрации: sequential, concurrent, handoff, group chat и Magentic-One.
Вместе с 1.0 вышел DevUI: браузерный локальный дебаггер для визуализации выполнения агента, потоков сообщений, вызовов инструментов и решений оркестратора в реальном времени.
AutoGen продолжит получать только баг-фиксы и критические патчи безопасности. Semantic Kernel остаётся активным, но для новых проектов с агентами Microsoft теперь рекомендует Agent Framework.
📍 Навигация: Вакансии • Задачи • Собесы
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10
Кажется, что
virtual и private должны просто работать вместе. Один говорит «этот метод можно переопределить», другой говорит «этот метод виден только внутри класса».Подсказка:
Ответ:
📍 Навигация: Вакансии • Задачи • Собесы
#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱16
🛠 fixed и pinning в небезопасном коде
Когда вы работаете с неуправляемым кодом, сборщик мусора превращается в непредсказуемую переменную. Он может переместить объект в памяти в любой момент, а ваш указатель при этом будет ссылаться уже на пустое место.
Именно для этого существует
Сборщик мусора не просто удаляет объекты, он их перемещает. Это часть компактизации кучи. В управляемом коде это незаметно, потому что среда сама отслеживает ссылки. Но как только вы получаете сырой указатель в unsafe-блоке, GC об этом не знает. Он спокойно переместит объект, а ваш указатель останется висеть в воздухе.
Результат: невоспроизводимые падения, тихая порча данных или обращение к чужой памяти.
Как работает fixed
Оператор
Всё, что происходит внутри блока
Когда это нужно
1.
2.
3. Небезопасные операции cо
Практическое правило простое: блок
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминатор
Когда вы работаете с неуправляемым кодом, сборщик мусора превращается в непредсказуемую переменную. Он может переместить объект в памяти в любой момент, а ваш указатель при этом будет ссылаться уже на пустое место.
Именно для этого существует
fixed.Сборщик мусора не просто удаляет объекты, он их перемещает. Это часть компактизации кучи. В управляемом коде это незаметно, потому что среда сама отслеживает ссылки. Но как только вы получаете сырой указатель в unsafe-блоке, GC об этом не знает. Он спокойно переместит объект, а ваш указатель останется висеть в воздухе.
Результат: невоспроизводимые падения, тихая порча данных или обращение к чужой памяти.
Как работает fixed
Оператор
fixed говорит сборщику: «не трогай этот объект, пока я с ним работаю». Объект временно закрепляется в памяти, и указатель остаётся валидным на протяжении всего блока:unsafe
{
fixed (int* ptr = &array[0])
{
// ptr гарантированно указывает туда, куда нужно
for (int i = 0; i < array.Length; i++)
{
*(ptr + i) *= 2;
}
}
// После выхода из блока GC снова может перемещать объект
}
Всё, что происходит внутри блока
fixed, защищено. Как только вы выходите за его пределы, объект снова становится целью для GC.Когда это нужно
1.
interop с нативными библиотеками. Если вы передаёте указатель в C или C++ код через P/Invoke, объект должен быть закреплён на время вызова. Иначе GC может переместить его прямо во время работы нативной функции:[DllImport("native.dll")]
static extern void ProcessBuffer(int* buffer, int length);
unsafe
{
fixed (int* ptr = data)
{
ProcessBuffer(ptr, data.Length);
}
}2.
Высокопроизводительная обработка данных. Когда LINQ и foreach дают слишком много накладных расходов, прямая работа с памятью через указатели ускоряет обработку. Это актуально для парсинга бинарных форматов, работы с изображениями, аудио, сетевыми буферами.3. Небезопасные операции cо
Span<T>. Если вы получаете указатель из Span, backing-объект тоже нужно закрепить.Практическое правило простое: блок
fixed должен содержать только тот код, которому реально нужен указатель. Никакой лишней логики внутри.📍 Навигация: Вакансии • Задачи • Собесы
#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4😁1
🤔 Разрабатываете ИИ-агентов, но всё ещё не уверены в их стабильности и прогнозируемости?
Мы поговорили с десятками разработчиков ИИ-агентов и сделали отдельный курс по AgentOps.
🧠 На нём вы узнаете:
– как оптимизировать траты на токены;
– как на практике оценить качество работы агента;
– как «докручивать» RAG-системы без потери качества;
– как обеспечить устойчивость агента к сбоям внешних сервисов без падения всей системы и про многое-многое другое.
📅 Старт: 19 мая.
👥 Спикеры — практики с опытом в AI и Data Science в крупных IT-компаниях, таких как Яндекс, Huawei, МТС и др.
Длительность: 6-12 недель в зависимости от тарифа.
🔗 Программа курса и другие подробности
Мы поговорили с десятками разработчиков ИИ-агентов и сделали отдельный курс по AgentOps.
🧠 На нём вы узнаете:
– как оптимизировать траты на токены;
– как на практике оценить качество работы агента;
– как «докручивать» RAG-системы без потери качества;
– как обеспечить устойчивость агента к сбоям внешних сервисов без падения всей системы и про многое-многое другое.
📅 Старт: 19 мая.
👥 Спикеры — практики с опытом в AI и Data Science в крупных IT-компаниях, таких как Яндекс, Huawei, МТС и др.
Длительность: 6-12 недель в зависимости от тарифа.
🔗 Программа курса и другие подробности
🤯 Представьте, что ваш AI-агент работает так же предсказуемо, как обычный микросервис. Звучит утопически, но это именно то, к чему должна прийти разработка в 2026 году.
Основная боль текущих реализаций — полная непредсказуемость поведения. Сегодня агент выполнил задачу за два шага, а завтра ушёл в рекурсию и потратил все лимиты.
Наш обновлённый курс «Разработка AI-агентов» научит, как приручить этот хаос с помощью
✅ Что вы получите:
— понимание того, как управлять логикой агента на уровне кода;
— навыки работы с
— готовые паттерны для обработки ошибок и галлюцинаций;
— опыт создания систем, которые реально экономят время.
Есть пара мест со скидкой до завтра, решайтесь 👈🏻
Основная боль текущих реализаций — полная непредсказуемость поведения. Сегодня агент выполнил задачу за два шага, а завтра ушёл в рекурсию и потратил все лимиты.
Наш обновлённый курс «Разработка AI-агентов» научит, как приручить этот хаос с помощью
Python и современных фреймворков. Мы не будем учить «общаться» с нейросетью, мы будем строить из неё надёжный инструмент.✅ Что вы получите:
— понимание того, как управлять логикой агента на уровне кода;
— навыки работы с
LangChain и библиотеками оркестрации;— готовые паттерны для обработки ошибок и галлюцинаций;
— опыт создания систем, которые реально экономят время.
Есть пара мест со скидкой до завтра, решайтесь 👈🏻
❤1
Просто вспомним, что было на этой неделе.
— Claude Code находит уязвимости в коде за 2 часа
— .NET миграции теперь с ИИ-анализом
— Маскировка данных в .NET
— ASP.NET Core 2.3 В С Ё
— Microsoft объявила о выходе Agent Framework 1.0 для .NET
📍 Навигация: Вакансии • Задачи • Собесы
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Контекстное меню Windows 11 по умолчанию набито пунктами, которые большинству людей не нужны никогда. «Открыть в терминале», «Показать дополнительные параметры», «Дать доступ», «Закрепить на начальном экране». Cписок разрастается с каждым обновлением, и убрать ненужное штатными средствами нельзя.
Windows 11 Context Menu Manager это простой инструмент, который позволяет отключить ненужные пункты нового контекстного меню Explorer в Windows 11.
Ничего лишнего: запускаете приложение, снимаете галочки с того, что мешает, закрываете. Изменения применяются сразу.
Где взять: в GitHub репозитории
📍 Навигация: Вакансии • Задачи • Собесы
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
🔐 Защита от CSRF-атак в NET
Cross-Site Request Forgery (CSRF) это атака, при которой злоумышленник заставляет браузер пользователя отправить нежелательный запрос от его имени.
Пользователь залогинился в банковском приложении. Он заходит на вредоносный сайт, где спрятана форма, которая автоматически отправляет POST-запрос на
Как включить защиту:
1. Регистрация сервиса:
2. Защита конкретного эндпоинта:
3. Глобальная защита через фильтр:
Minimal API — вручную:
CSRF-защита критична для любых форм, меняющих состояние: оплата, смена пароля, удаление данных.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view
Cross-Site Request Forgery (CSRF) это атака, при которой злоумышленник заставляет браузер пользователя отправить нежелательный запрос от его имени.
Пользователь залогинился в банковском приложении. Он заходит на вредоносный сайт, где спрятана форма, которая автоматически отправляет POST-запрос на
/transfer?amount=10000&to=hacker. Браузер добросовестно прикладывает куки сессии. Сервер видит валидный запрос. Деньги ушли.Как включить защиту:
1. Регистрация сервиса:
builder.Services.AddAntiforgery();
2. Защита конкретного эндпоинта:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Submit(FormModel model)
{
// обработка только "своих" запросов
}
3. Глобальная защита через фильтр:
builder.Services.AddControllersWithViews(options =>
{
options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});
Minimal API — вручную:
app.MapPost("/submit", ([FromForm] IFormCollection form,
IAntiforgery antiforgery, HttpContext ctx) =>
{
antiforgery.ValidateRequestAsync(ctx);
// ...
});CSRF-защита критична для любых форм, меняющих состояние: оплата, смена пароля, удаление данных.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9
Когда строишь агента, рано или поздно сталкиваешься с проблемой: навыки разрабатывают разные команды, в разное время, в разных форматах. Microsoft Agent Framework теперь поддерживает три подхода к написанию скиллов и объединяет их в одном провайдере без лишней конфигурации.
Какую боль решает
Раньше приходилось либо ждать, пока всё будет готово, либо переписывать логику под один формат. Теперь можно добавлять навыки постепенно: один пришёл из файловой системы, второй из NuGet-пакета, третий написан прямо в коде как временная заглушка. Агент не различает их — он просто выбирает нужный по контексту.
Три способа создать скилл
Навык живёт как директория на диске:
SKILL.md с инструкциями, скрипты и референсные документы:skills/
└── onboarding-guide/
├── SKILL.md
├── scripts/
│ └── check-provisioning.py
└── references/
└── onboarding-checklist.md
В
SKILL.md описываем метаданные и шаги для агента. Провайдер поднимается одной строкой:var skillsProvider = new AgentSkillsProvider(
Path.Combine(AppContext.BaseDirectory, "skills"),
SubprocessScriptRunner.RunAsync);
Команда HR-систем публикует
Contoso.Skills.HrEnrollment. Внутри — класс, унаследованный от AgentClassSkill<T>. Ресурсы помечаются атрибутом [AgentSkillResource], скрипты — [AgentSkillScript]. Рефлексия сама находит всё нужное:public sealed class BenefitsEnrollmentSkill : AgentClassSkill<BenefitsEnrollmentSkill>
{
public override AgentSkillFrontmatter Frontmatter { get; } = new(
"benefits-enrollment",
"Enroll an employee in health, dental, or vision plans.");
[AgentSkillResource("available-plans")]
public string AvailablePlans => "...список планов...";
[AgentSkillScript("enroll")]
private static string Enroll(string employeeId, string planCode) { ... }
}
Нужный навык ещё не вышел, а ждать нельзя. Пишем прямо в коде через
AgentInlineSkill:var timeOffSkill = new AgentInlineSkill(
name: "time-off-balance",
description: "Calculate remaining vacation and sick days.",
instructions: "...")
.AddScript("calculate-balance", (string employeeId, string leaveType) =>
{
int remaining = HrDatabase.GetAnnualAllowance(employeeId, leaveType)
- HrDatabase.GetDaysUsed(employeeId, leaveType);
return JsonSerializer.Serialize(new { employeeId, leaveType, remaining });
});
Когда NuGet-пакет выйдет, то просто убираем строку из билдера. Агент ничего не заметит.
Собираем всё вместе
AgentSkillsProviderBuilder объединяет все три типа:var skillsProvider = new AgentSkillsProviderBuilder()
.UseFileSkill(Path.Combine(AppContext.BaseDirectory, "skills"))
.UseSkill(new BenefitsEnrollmentSkill())
.UseSkill(timeOffSkill)
.UseFileScriptRunner(SubprocessScriptRunner.RunAsync)
.UseScriptApproval(true) // подтверждение перед запуском скриптов
.Build();
UseScriptApproval(true) добавляет человека в цикл: агент приостанавливается перед каждым запуском скрипта и ждёт одобрения. Полезно там, где скрипты имеют реальные последствия — записывают данные, обращаются к продакшн-инфраструктуре.Подход удобен тем, что каждый шаг независим. Не нужно согласовывать форматы между командами или держать всё в одном репозитории. Файловые скиллы хорошо подходят для контента, который часто меняется. Классовые — для переиспользуемой логики, которую удобно поставлять как пакет. Инлайновые — для временных заглушек и случаев, когда скилл нужно генерировать динамически из данных.
📍 Навигация: Вакансии • Задачи • Собесы
#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9
MCP (Model Context Protocol) набирает популярность как способ подключать инструменты к языковым моделям. Но писать MCP-серверы на C# многословно, а на чистом .NET SDK — тем более. FsMcp решает эту задачу для F#-разработчиков: типобезопасный DSL, минимум шаблонного кода, интеграция с экосистемой .NET.
Что это такое
FsMcp это обёртка над официальным [Microsoft ModelContextProtocol .NET SDK](https://github.com/modelcontextprotocol/csharp-sdk). Библиотека добавляет поверх него computation expressions, типизированные обработчики инструментов и Result-based обработку ошибок.Установка через NuGet:
dotnet add package FsMcp.Server
Дополнительные пакеты по необходимости:
dotnet add package FsMcp.Client # клиент
dotnet add package FsMcp.Testing # тест-хелперы
dotnet add package FsMcp.Server.Http # HTTP/SSE транспорт
dotnet add package FsMcp.Sampling # вызов LLM из инструментов
Как это работает
Сервер описывается через
mcpServer { } — computation expression, внутри которого объявляются инструменты, ресурсы и промпты.Инструмент принимает F#-запись как входные данные, JSON Schema генерируется автоматически через TypeShape:
type GreetArgs = { name: string; greeting: string option }
let server = mcpServer {
name "MyServer"
version "1.0.0"
tool (TypedTool.define<GreetArgs> "greet" "Greets a person" (fun args -> task {
let greeting = args.greeting |> Option.defaultValue "Hello"
return Ok [ Content.text $"{greeting}, {args.name}!" ]
}) |> unwrapResult)
useStdio
}
Server.run server |> fun t -> t.GetAwaiter().GetResult()Поле
greeting помечается как необязательное автоматически, потому что тип string option.Пример с калькулятором:
type CalcArgs = { a: float; b: float }
let server = mcpServer {
name "Calculator"
version "1.0.0"
tool (TypedTool.define<CalcArgs> "add" "Add two numbers" (fun args -> task {
return Ok [ Content.text $"{args.a + args.b}" ]
}) |> unwrapResult)
tool (TypedTool.define<CalcArgs> "divide" "Divide a by b" (fun args -> task {
if args.b = 0.0 then return Error (TransportError "Division by zero")
else return Ok [ Content.text $"{args.a / args.b}" ]
}) |> unwrapResult)
useStdio
}Ошибки возвращаются через
Result<'T, McpError> без исключений на ожидаемых путях.HTTP-транспорт
Если нужен не stdio, а HTTP/SSE:
open FsMcp.Server.Http
HttpServer.run server (Some "/mcp") "http://localhost:3001"
|> fun t -> t.GetAwaiter().GetResult()
Тестирование
FsMcp.Testing позволяет вызывать инструменты напрямую, без сетевого соединения и запуска процессов:open FsMcp.Testing
let result =
TestServer.callTool serverConfig "add"
(Map.ofList ["a", jsonEl 10; "b", jsonEl 20])
|> Async.AwaitTask |> Async.RunSynchronously
result |> Expect.mcpHasTextContent "30" "addition works"
Что ещё есть в библиотеке
FsMcp покрывает не только базовый сценарий. Среди возможностей: стриминговые инструменты через IAsyncEnumerable<Content>, уведомления о прогрессе, валидационный middleware, трассировка через OpenTelemetry, горячая замена инструментов (DynamicServer.addTool) и интеграция с FsToolkit.ErrorHandling через пакет FsMcp.TaskApi.📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🤩3👍1🤔1
Вы ищете заказы там, где их ищут все. А локальный бизнес даже не знает о существовании биржи — ИП пишут в чатах «посоветуйте программиста» или листают Авито.
Будьте там, где нет толпы.
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM