Обновить
64K+

C# *

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

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

WS‑Trust поверх OAuth: третий транспорт OpenID‑сервера, для контура, который живёт на SOAP

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

redb.Identity получил WS-Trust фасад: Issue, Validate, Cancel, Renew на тех же маршрутах ядра. Тот же JWT, тот же реестр клиентов, WSDL для генератора.

Когда мы делали gRPC-фасад, тезис был такой: логика redb.Identity живёт в ядре за адресами direct-vm://identity-*, а транспорт это тонкий переводчик поверх них. Второй фасад тезис подтвердил. Но два транспорта, оба современные, оба построенные примерно на одних представлениях о мире, проверяют утверждение мягко. По-настоящему проверяет третий, устроенный принципиально иначе.

Теперь он есть. Рядом с HTTP и gRPC встал WS-Trust: IssueValidateCancelRenew по SOAP, на те же маршруты ядра, с тем же издателем и тем же хранилищем токенов. Токен, выданный по SOAP, принимается по HTTP и получает там тот же вердикт.

Читать далее

Новости

redb.Route 4.0: тест-кит, шаблоны payload, форматы данных, REST DSL и ядро без Newtonsoft

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

Восемь новых пакетов и REST DSL вокруг прежних 56 глаголов маршрута; из ядра ушёл Newtonsoft.Json. Что ломает мажор и как мигрировать за десять минут.

Готовится четвёртая версия redb.Route, интеграционного движка для .NET в духе Apache Camel. В 3.x была закрыта ширина по паттернам: 56 глаголов DSL, тридцать с лишним коннекторов, свой язык выражений, скомпилированный в IL (в 4.0 он качественно переработан, об этом ниже). 4.0 закрывает то, что вокруг паттернов: как протестировать маршрут без брокеров, как собрать тело сообщения, как читать CSV и Avro, как выставить REST-фасад, как кэшировать ответ сервиса. Восемь новых пакетов, REST DSL внутри HTTP-коннектора, переработанный язык выражений и ядро, которое стало легче, а не тяжелее. За год это первый мажор такого масштаба: не смена номера под несколько ломающих правок, а качественное расширение функционала, и ломающих изменений в нём как раз немного.

Читать далее

redb 4.0: ленивые ссылки, уникальные ключи и обновление базы без DBA

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

Анонс четвёртой версии redb.Core: ссылки грузятся по обращению, уникальность на любом поле, схема обновляется сама. Бесплатно, три СУБД, Free и Pro одинаково.

Готовится redb.Core 4.0. За год это первый мажор такого масштаба: не смена номера, а качественное расширение функционала. Он про три вещи, которые чаще всего просили: ленивая загрузка ссылок между объектами, уникальные ключи на любом поле и обновление схемы базы без ручных действий администратора. Всё вместе, на трёх СУБД сразу и без разделения на «в Free так, в Pro иначе».

Коротко, что изменится для приложения.

Читать далее

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

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

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

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

Обычно эту плоскость собирают заново: Prometheus, Grafana, самописный health-контроллер, скрипт деплоя, чат-бот для рестартов. Времени уходит столько же, сколько на сам распил.

redb.Tsak предлагает другой обмен: плоскость эксплуатации живёт в рантайме, и она одна и та же независимо от того, запущен у вас один воркер или девять. Кластер, дашборд, REST API, CLI, пробы, метрики и трассировка не зависят от выбранной топологии. Вы решаете, как нарезать процессы, а не как их потом обслуживать.

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

Читать далее

JSON умеет считать сам себя — удобно, как в Excel, но без вранья с типами

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

JSON, который считает сам себя. Ставишь = в ячейку — и она становится формулой. На диске при этом остаётся обычный JSON, который откроет кто угодно.

Читать далее

Создаём DSL на C#: LSP и поддержка в Visual Studio

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

В шестой части цикла про создание DSL на C# добавляем Akbura полноценную поддержку IDE.

Разберём Language Server Protocol, синхронизацию документов, immutable snapshots, MSBuild и semantic tokens. Затем посмотрим, почему для Visual Studio я выбрал нативную интеграцию через MEF и Visual Studio SDK, какие проекты помогли разобраться в Editor API и какие полезные возможности Roslyn неожиданно оказались internal.

В конце немного про публикацию расширений в Visual Studio Marketplace и приключения с Azure.

Читать далее

SOAP в .NET без WCF: WS-Security, MTOM и ?wsdl как шаг маршрута

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

SOAP никуда не делся. Продаёте авиабилеты, значит ходите в Amadeus, Sabre и Travelport по SOAP. Интегрируетесь с банком, госпорталом, страховым бэкендом, биллингом оператора или почти любым корпоративным продуктом, купленным до 2015-го: там контракт это WSDL, а на проводе <soap:Envelope>. Подписи WS-Security, вложения MTOM, SOAP 1.1 рядом с 1.2, soap:Fault при ошибке: этот мир жив, он приносит деньги и не переезжает на REST по вашей вежливой просьбе.

В .NET вызывать его стало неудобно. WCF как полноценный фреймворк ушёл. CoreWCF есть, но во всех опубликованных версиях висит незакрытая крипто-уязвимость, так что затащить его значит поменять одну проблему на другую. dotnet-svcutil генерит клиент из WSDL на этапе сборки, но это кодогенерация, приклеенная сбоку, а не шаг интеграции. А хостинг SOAP-эндпоинта, WS-Security руками или проводка MTOM обычно заканчиваются кучей конфигурации System.ServiceModel, которую никто не хочет держать.

redb.Route.Soap идёт другим путём. SOAP становится обычным шагом пайплайна в вашем же .NET-процессе. Вызвал сервис, получил типизированный ответ. Поднял эндпоинт, отдал тело маршруту, вернул ответ. Всё in-box: HttpClient, общий Kestrel-хост и System.Security.Cryptography.Xml для WS-Security. Ни WCF, ни рантайма System.ServiceModel, ни уязвимой зависимости, ни отдельного шлюза. Разберём, как это используется и почему нативный коннектор внутри ESB бьёт codegen-клиента или отдельную коробку.

Читать далее

Включение HotSpot Android по триггеру BT

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

Есть у меня довольно простой автомобильный сценарий. Я сажусь в машину, телефон автоматически соединяется по Bluetooth с магнитолой, а самой магнитоле для навигации, пробок и прочих радостей нужен интернет через Wi‑Fi. Каждый раз доставать телефон, открывать шторку и вручную включать точку доступа мне в какой-то момент окончательно надоело.

Казалось бы, задача на пять минут: поймали подключение нужного Bluetooth-устройства и вызвали системную функцию включения hotspot. Но с недавних пор эту лавочку в Android прикрыли. Обычному стороннему приложению прямого доступа к управлению tethering уже не дают, даже если пользователь сам этого хочет.

В итоге получилось небольшое приложение BlueSpot на C#/.NET, которое делает ровно одну вещь: при подключении к выбранному Bluetooth-устройству включает системную Wi‑Fi-точку и присылает уведомление. Root не требуется, но без небольшого легального извращения в виде Shizuku не обошлось.

Читать далее

Разработка и регистрация плагина под Revit: как АГР подтолкнул BIM‑инженеров на разработку

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

Меня зовут Дарья Беляева, я — Tech Lead и архитектор решений на стыке BIM, CDE и Revit API. Мы с коллегой, Андреем Прохоровым, за два месяца с нуля сделали AGR.Checker — плагин для Revit, который проверяет ЦИМ на соответствие требованиям IDS перед сдачей в составе АГР. В этой статье — конкретные инженерные решения, которые легли в основу плагина, и то, с чем мы разобрались при регистрации прав на программу в Роспатенте.

Читать далее

Ленивый LINQ: разбираем yield и ленивые вычисления по кирпичикам. Часть 2

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

В первой части мы успешно вскрыли чёрный ящик LINQ: написали Where вручную, разобрались, как компилятор превращает yield return в конечные автоматы, и посмотрели на методы с частичной буферизацией. Но LINQ был бы не собой, если бы на этом всё закончилось.

Во второй части переходим к «тяжёлой артиллерии» — OrderByGroupBy и Join. Эти методы вынуждены нарушить главный завет ленивых вычислений: они материализуют данные в памяти, прежде чем отдать хоть один элемент. Но как именно?

После этой статьи LINQ перестанет быть чёрным ящиком: вы будете точно понимать, сколько памяти съест каждая цепочка методов и в каком порядке следует вызывать эту цепочку.

Читать далее

У OpenID-сервера появился второй транспорт: gRPC рядом с HTTP, на тех же маршрутах

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

redb.Identity получил gRPC-фасад: те же маршруты ядра, тот же реестр клиентов, один токен на оба транспорта. Что внутри, как включить, что померить.

Про redb.Identity мы не раз говорили, что он транспортно-агностичен: вся логика живёт в ядре за адресами direct-vm://identity-*, а HTTP это всего лишь фасад поверх них. Звучало убедительно, но проверить это утверждение было нечем. Фасад был ровно один, и «агностичность» оставалась обещанием архитектуры, а не наблюдаемым фактом.

Теперь фасадов два. Рядом с HTTP встал gRPC: те же маршруты ядра, тот же издатель, тот же реестр клиентов, то же хранилище токенов. Один и тот же токен принимается обоими транспортами и получает от них одинаковый вердикт. Про это и статья: что именно появилось, как это включить, и почему оно особенно уместно там, где gRPC уже стал ...

Читать далее

Бенчмаркая сортировку строк: подстава с дефолтным компаратором — ×5

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

Сортировка строк без компаратора работает не так, как кажется, и заметно дольше.

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

Читать далее

Проблема N+1 запроса: виноват не ORM, а ваш код

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

У меня есть несколько статей, в которых я рассказываю о различных особенностях работы коллекций в .NET, например эта и эта. Мы с вами разбирали, как лучше искать в коллекциях, спорили о преимуществах Any и Count в борьбе за тысячные доли секунды. Но все усилия, затраченные на эти микрооптимизации, могут пойти крахом из-за одного неудачного запроса в базу или другой сервис.

На этот раз я предлагаю рассмотреть проблему N+1 запроса.

Читать далее

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

UnixGPUForge, или Как я решил написать свой демон для работы с видеокартами для Linux

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

Всем привет! Сегодня я расскажу вам свой путь к написанию демона для работы с видеокартами (пока только с Nvidia).

Для начала немного предысториио себе, для меня линукс не новинка, но и не та ОС, с которой я долго взаимодействовал. Я разработчик с коммерческим стажем в финтехе, и с линуксом знаком был ранее только как с очень практичной ОС для серверов. И вот однажды я стал полноценным «линуксоидом», решив перейти к более практичной для кастомизации и гибкой настройки ОС. Выбрал я дистрибутив на основе Арча, а именно CachyOS, как и многие (наверное) я люблю при наличии свободного времени поиграть в игры.

Читать далее

redb.Route: Control Bus для .NET-маршрутов: останавливать, перезапускать и реагировать на события в рантайме

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

Управляйте маршрутами в рантайме сообщением: start, stop, suspend, restart, плюс консюмер, превращающий события жизненного цикла маршрута в сообщения.

Работающая интеграция это не статичная штука. Деплою нужно слить очередь и остановить маршрут, прежде чем новая сборка перехватит управление. Нижестоящий сервис падает, и маршрут, который его долбит, должен отступить, а не громоздить ретраи. Оператору нужно приостановить одну ветку потока, не перезапуская весь процесс. Что-то ломается в три ночи, и дашборд дежурного должен загореться сам, а не потому что кто-то тейлил логи.

Apache Camel решил операционную половину этого давно, паттерном Control Bus: маршрутами управляют, отправляя сообщение на специальный эндпоинт, ровно так же, как двигают любое другое сообщение. redb.Route приносит этот паттерн в .NET, с набором команд Camel, и добавляет то, чего у Camel нет: консюмер, превращающий события жизненного цикла маршрута обратно в сообщения, которые можно роутить.

То есть направлений тут два...

Читать далее

Папка как интеграция: файловый обмен в .NET без cron, FileSystemWatcher и самописных костылей

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

Опрос каталога, ожидание дописи файла, идемпотентность и атомарная запись через temp+rename: файловый обмен как обычный шаг маршрута.

Спросите у любого интегратора, через что реально ходят деньги, и он назовёт файлы. Банк кладёт выписку в каталог на шаре. 1С выгружает заказы в XML по расписанию. Партнёр по EDI шлёт .edi на FTP. Биллинг ночью роняет CDR-файлы на пару гигабайт. Розничная сеть присылает остатки в CSV, потому что так было в 2009-м и никто не собирается это менять. Файловый обмен не «легаси, которое скоро уйдёт», это работающий транспорт, у которого есть ровно одно свойство: он выглядит проще, чем есть.

Проще он выглядит потому, что первая ....

Читать далее

Практическое применение линейной реализации асинхронных операций на примере WPF приложения

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

В этой статье я покажу, как использовать IAsyncEnumerable в WPF‑приложении для асинхронных операций. Код полностью рабочий, его можно скопировать и запустить.
Для команд используется библиотека Prism (NuGet: Prism.WPF). Если у вас нет Prism, команды можно реализовать вручную, но в примере используется стандартный подход из Prism.

Предположим нам нужно выполнить поиск устройств по протоколу Modbus RTU или любую другую операцию с результатами.

Часто первым решением становится использовать асинхронную операцию или поток в совокупности с событиями для проброса данных. Но тогда нам необходимо будет управлять подписками на события, пробрасывать данные из внешнего потока в основной UI через Dispatcher.Invoke.

В начале пути я, как и многие, использовал асинхронные операции с событиями, методами‑обработчиками и Dispatcher.Invoke для проброса данных в основной поток. Но если данных много и\или они часто меняются, это создает дополнительные сложности. Так же куча событий, делает код более запутанным и менее масштабируемым.

Начиная с C# 8, появилась возможность использовать IAsyncEnumerable, позволяющие реализовать код профессионального уровня с линейной сигнатурой и преимуществами такими как:

Читать полностью

ZeroTier без native: managed ZtSharp и VL1-only ZtLite для ESP32

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

Доброго времени суток.

Интерпретатор ESPB временно пока отложил, интерес к нему оказался скромным. Но подошел к глобальной задаче с другой стороны и на этот раз все крутится вокруг Zerotier. Давно обратил внимание на данную платформу, когда то ковырял libzt - sockets поверх сети Zerotier. Это удобно для приложений, которые находятся вне единой локальной сети и должны общаться сквозь NAT. Думаю, многие хотели бы использовать микроконтроллеры (например, ESP32) для IoT-задач, не заморачиваясь со способами доставки информации на сервер и не завися от того, спрятан ли этот сервер за NAT.

Из этой идеи выросли три связанных проекта:

Читать далее

Бенчмаркая LINQ: подстава с OrderBy — одно условие и полная сортировка

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

Одни вызовы после OrderBy проходят набор один раз, другие приводят к полной сортировке. По коду разницы не видно.

Давайте проверим счётчиком обращений к компаратору — на четырёх машинах и четырёх рантаймах.

Читать далее

Как случайно создать облачный кроссплатформенный сервис для Excel

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

Я работаю в офисе (вспоминается песня "Ленинграда") и моим основным рабочим инструментом уже очень долгое время является Excel. Рискую показаться предвзятым, но на мой взгляд Excel - это лучший продукт Microsoft. И вообще электронные таблицы, как класс приложений, - это абсолютно гениальное изобретение человечества. Наверное многие считают из злом, но давайте пройдемся по фактам:

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