Обновить
128K+

C# *

Объектно-ориентированный язык программирования

103,36
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Я превратил Slack в интерактивную консоль для работающего .NET-приложения

Время на прочтение5 мин
Охват и читатели6.3K

Автор объясняет, как он использовал скрипты Roslyn и режим сокетов Slack для проверки и отладки запущенного приложения и взаимодействия с ним. 

Читать далее

Новости

Бенчмаркая регресс LINQ: обещали −19%, на четырёх машинах намерил +31%

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели10K

Уважаемые читатели, в этой статье я хочу рассказать о проверке обещанного регресса LINQ в .NET 10 — и представить свои выводы.

В dotnet/runtime с лета висит issue #117717: после перехода на .NET 10 метод с First(предикат) просел к девятке — у автора issue на Intel 13-го поколения до 19%, у Энди Эйерса из JIT-команды на Zen 4 порядка 10%. Причину команда назвала сама: связка PGO и инлайнинга, делегат предиката перестал инлайниться.

Решение тоже озвучили: в десятке чинить не будем — сломаем другое, переносим в .NET 11. Был частичный фикс (PR #117816), после которого issue переоткрыли как #119425. Десятка при этом LTS, и в комментах закономерный вопрос: обновляться на десятку или ждать одиннадцатую.

Читать далее

Бенчмаркая Sum: ускорил циклом — замедлил в ×4,7

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели10K

Уважаемые читатели, в этой статье я хочу рассказать о том, что происходит внутри values.Sum() в современном .NET — там нашлись векторные инструкции, контроль переполнения и список процессоров, которым рантайм намеренно ограничивает ширину вектора, — и представить свои выводы.

В прошлых статьях серии самописные циклы уже проигрывали BCL в поиске по строке, JIT сам выкидывал проверки границ, а foreach прятал аллокации. Тут случай интереснее: values.Sum() — это LINQ, который при оптимизации первым делом меняют на цикл.

Читать далее

Новое в Pure.DI: union types, генерация интерфейсов и DI без аллокаций

Уровень сложностиСредний
Время на прочтение17 мин
Охват и читатели8.2K

Pure.DI — это генератор кода для внедрения зависимостей (Dependency Injection), который работает на этапе компиляции. Pure.DI развивает идею «чистого DI»: вместо контейнера и рефлексии вы получаете обычный C#‑код, который создаёт композиции объектов. В этой статье — новые возможности из релизов 2.3.5–2.5.1: от union types в роли DI‑контрактов до сценариев внедрения зависимостей без лишних аллокаций.

Читать далее

redb.Route — коннектор Amazon SQS + SNS, at-least-once и Publish-Subscribe через SNS→SQS. Уходим от MassTransit

Уровень сложностиСложный
Время на прочтение14 мин
Охват и читатели10K

series redb ecosystem

Про Kafka и RabbitMQ в этой серии уже было. Теперь — Amazon SQS, и вместе с ним в одном пакете SNS: два транспорта, потому что в мире AWS они ходят парой. Коннектор redb.Route.Sqs — поверх нативного AWS SDK for .NET v4 (AWSSDK.SQSAWSSDK.SimpleNotificationService), но писать вам придётся не «клиент», а маршруты, где вся очередь задаётся одной строкой-URI:

Читать далее

Бенчмаркая поиск по строке: самописные циклы проигрывают от ×14 до ×154

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели13K

Уважаемые читатели, в этой статье я хочу рассказать про поиск по строке и представить свои выводы. Началось с оптимизации: сравнил поиск символа циклом со string.IndexOf — и получил разницу в разы. Заодно выяснилось, что серверный Xeon с AVX-512 в этой задаче медленнее игрового десктопа с AVX2. Ниже разбор обоих фактов с дизасмом и замерами.

Будет четыре истории, и в каждой — вопрос, на который я искал ответ:

Читать далее

Как я превратил Real‑ESRGAN и FFmpeg в потоковый Windows‑апскейлер без гигантских временных папок

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели7.5K

Апскейлинг одного изображения через Real-ESRGAN обычно не вызывает особых проблем: выбираем модель, запускаем обработку и получаем результат. Но при работе с видео и большими наборами файлов быстро появляются дополнительные задачи: декодирование и сборка видео, очередь рендера, выбор видеокарты, обработка ошибок, восстановление прерванных заданий, зависимости вроде FFmpeg и понятный интерфейс для всего этого.

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

Так появился UltraFrame AI — бесплатное приложение с открытым исходным кодом для пакетного апскейлинга видео и изображений с помощью Real-ESRGAN.

Читать далее

redb.Identity: OAuth 2.1 / OpenID сервер на .NET, где протокол отделён от транспорта, по шине или вообще без сети

Уровень сложностиСложный
Время на прочтение59 мин
Охват и читатели8.7K

Есть три привычных способа сделать OAuth/OIDC в .NET, и каждый чем-то неудобен.

Первый — ASP.NET-привязанные решения (Duende IdentityServer, ASP.NET Identity, сэмплы OpenIddict). Мощно, но каждый эндпоинт — это HTTP-middleware. Захотелось дёрнуть token из воркера или из консьюмера шины? Поднимай HTTP-листенер и ходи через loopback. Хочешь протестировать конвейер выдачи токена в изоляции? Готовь WebApplicationFactory.

Второй — готовые IAM-платформы (Keycloak, Auth0, Okta). Богато по фичам, но это отдельный сервис со своим рантаймом, своей админкой, своей базой, своей моделью конфигурации и своим деплоем. Мультиарендно — да, встраиваемо — нет.

Третий — написать своё. И в третий раз за десятилетие переизобрести Code+PKCE, ротацию refresh-токенов, хранение согласий, отзыв сессий, защиту от replay в MFA, ротацию JWKS, шаринг ключей между репликами и backchannel-logout по RFC 8417.

Читать далее

Бенчмаркая проверки границ: фикс, который шёл 8  лет, и проверка, которая жива до сих пор

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели8.2K

Уважаемые читатели, в этой статье я хочу рассказать о проверках границ массива и представить свои выводы. Каждое обращение arr[i] обязано проверить индекс, иначе IndexOutOfRangeException — а JIT старается эти проверки убирать, когда может доказать, что выход за границы невозможен. Я взял несколько обычных циклов и посмотрел в машинный код на .net 8, 9, 10 и 11 одновременно. Результат разложился по версиям так, как я не ожидал.

Будет три истории:

Читать далее

Инди-геймдев как образ жизни: честный разговор о цене мечты

Уровень сложностиПростой
Время на прочтение18 мин
Охват и читатели14K

Казалось бы, уже столько всего сказано и написано про то, как быть разработчиком инди-игры в современное время. Только я написал 3 статьи на подобные темы. Что можно ещё сказать на данную тему?

Однако мне пришло в голову, что все мои статьи касались большей частью технического аспекта создания инди-игр и особо не затрагивали внутреннюю кухню инди-разработчиков. Ту самую часть, которая состоит из сомнений, выгорания, неопределённости и кучи нетехнических проблем.

Именно об этой «внутренней кухне» я и хочу рассказать в данной статье.

Читать далее

redb.Route — коннектор RabbitMQ: RPC, конкурирующие консьюмеры и dead-letter. Уходим от MassTransit

Уровень сложностиСложный
Время на прочтение15 мин
Охват и читатели9K

Про Kafka в этой серии уже было. Теперь — RabbitMQ, и с упором на то, как им пользоваться. Коннектор redb.Route.RabbitMQ — поверх официального RabbitMQ.Client 7.x, но писать вам придётся не «клиент», а маршруты, где весь брокер задаётся одной строкой-URI:

Читать далее

Создаём DSL на C#: Добавляем семантику

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели6.9K

Создаю собственный DSL на C#: рассказываю о том, как я добавляю семантическую модель. Рассказываю архитектуру семантической модели.

Читать далее

Coachlight.Avalonia: почему в desktop-разработке до сих пор нет нормального онбординга — и как я решил это исправить

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели6.7K

Я оказался в этой ситуации на реальном проекте — desktop-приложении на Avalonia. Нужно было объяснить пользователю пять экранов, три из которых со скрытыми боковыми панелями и элементами, зависящими от режима. Я написал онбординг прямо внутри приложения. А потом понял, что написал ровно ту вещь, которой в экосистеме Avalonia не хватает в принципе — и вынес её в отдельную библиотеку.

Читать далее

Ближайшие события

Бенчмаркая foreach и энумераторы: аллокации, которые прятались 10 лет

Уровень сложностиПростой
Время на прочтение17 мин
Охват и читатели15K

Уважаемые читатели, в этой статье я хочу рассказать о скрытых аллокациях в обычном foreach и представить свои выводы. Тесты сделаны на .net 8, .net 9 и .net 10 одновременно, чтобы было видно, как одна и та же строчка кода ведет себя на разных рантаймах.

Все тесты сделаны с использованием BenchmarkDotNet, полный код представлен на гите, так что каждый может проверить результаты и сделать свои выводы.

Будет три истории, и все три про foreach:

Читать далее

Навайбкодил десктоп-клиент для «Яндекс Книг» на WinUI 3

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели12K

Периодически хочется почитать книги с ноутбука, особенно в дороге. Но у «Яндекс Книг» есть только мобильные приложения и сайт, а отдельного клиента для Windows нет. Через браузер читать можно, пока есть нормальный интернет, однако в поезде или за городом этот план иногда заканчивается одновременно с мобильной сетью.

Можно было скачать книгу где-нибудь ещё, поставить обычную EPUB-читалку и не усложнять себе жизнь. Но библиотека и подписка у меня уже находились в одном сервисе. Поэтому я выбрал более логичный для программиста вариант: решил самостоятельно написать неофициальный десктоп-клиент.

Читать далее

Овцеводческая CRM, Узбекистан и .NET 10: семь инженерных историй с граблями

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели11K

Мы делаем QoyHunter — учётную систему для овцеводческих хозяйств Узбекистана, с витриной животных, доставкой и блогом на соседних поддоменах. С точки зрения бизнес-логики ничего экзотического: CRM как CRM. Экзотика начинается там, где эта CRM встречается с реальностью рынка.

А реальность такая: основной канал пользователей — Telegram, а не браузер; основной язык — не всегда русский (узбекский обязателен, английский — по явному выбору); часовой пояс один (Ташкент, UTC+5, без перехода на летнее время — тоже давало баги, но об этом ниже); а разработка идёт на Windows-ноутбуках без сервера БД под рукой. Из этих фактов вытекает добрая половина решений в статье. Стек: бэкенд на ASP.NET Core (.NET 10), фронт на React + Vite, админка на react-admin, всё за nginx в docker compose.

Читать далее

Метод, которого не существовало: как я собрал локальный RAG для CAD API

Уровень сложностиПростой
Время на прочтение22 мин
Охват и читатели8.7K

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

Читать далее

redb 3.3.0: решение уровня энтерпрайз на .NET — своя БД, свой Apache Camel и рантайм с дашбордом (и всё это бесплатно)

Уровень сложностиСложный
Время на прочтение16 мин
Охват и читатели9.2K

Когда говорят «энтерпрайз-стек на .NET», обычно имеют в виду зоопарк: база от одного вендора, шина от другого, ORM с миграциями, отдельный оркестратор, ещё что-нибудь для наблюдаемости — и клей между всем этим, который пишешь сам и потом сам же чинишь по ночам.

Мы пошли другим путём и последние полгода собираем это как одну согласованную экосистему: типизированное хранилище redb поверх Postgres/MSSQL/SQLite, интеграционный движок redb.Route (наш ответ Apache Camel под .NET) и рантайм redb.Tsak с дашбордом, hot-reload и кластером. Три слоя, один код, один стиль.

Сегодня вышла версия 3.3.0 — синхронный бамп всей экосистемы. Это не «добавили пару фич»: это релиз, в котором мы починили то, что молча не работало под нагрузкой (и это, пожалуй, главное), добавили два новых транспорта, довели до конца RAG-петлю для LLM и сделали конкурентность на любом источнике. Ниже — по делу, с кодом.

И сразу главное: с версии 3.3.0 все Pro-решения бесплатны. Никаких лицензий, никаких ключей, никакой регистрации — просто ставишь пакет и юзаешь. Change tracking, bulk, продвинутый кэш, аналитика, кластер Tsak с координатором и failover — всё включено из коробки, в разработке и в проде одинаково. dotnet add package redb.Postgres.Pro — и оно работает. Никакого пейволла, никакого лицензионного сервера, ничего активировать не надо.

Читать далее

CraftHub: научил свой JSON-редактор работать с папкой проекта — и перестал открывать файлы по одному

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели9.1K

Знаете это чувство, когда правишь JSON и ищешь, где же ты забыл запятую? Я устал и сделал редактор, где JSON — это таблица. А теперь он ещё и открывает папку проекта целиком: дерево файлов, Ctrl+S прямо в файл, drag & drop. Как в VS Code, только заточено под данные.

Читать далее

In-memory база врёт: 5 расхождений с продовой БД

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели10K

Тест на List.AsQueryable() зелёный, а на проде всплывают LINQ-трансляция, null, collation, unique index и два воркера, забравшие один платёж. Разбираю, где in-memory тесты помогают, а где начинают врать.

Читать далее
1
23 ...