Обновить
256K+

C# *

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

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

redb.Route — уходим от MassTransit, идём к Apache Camel: Kafka, Scatter‑Gather и транзакции

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

Серия: redb ecosystem / redb.Route deep-dive

Очередная статья из цикла про redb.Route — наш Apache Camel под .NET. Если вы только подключились, вот предыдущие на Хабре:

redb.Route — Apache Camel для .NET, который мы написали потому что выхода другого не было — с чего всё началось;

redb.Route изнутри: четыре in‑memory канала и Exchange, который их связывает;

redb.Route 3.0.1 — плоская навигация по DSL, рефакторинг CRTP и тихий null;

Apache Camel под .NET, разбор по косточкам: HTTP‑коннектор без ASP.NET MVC + паттерн Content‑Based Router — предыдущая «EIP + коннектор».

Сегодня заходим с Kafka‑коннектора — разбираем его по косточкам, как делали с HTTP, — а потом сажаем на него два EIP‑паттерна: Scatter‑Gather и Aggregator. И главное — разбираем то, о чём в туториалах молчат: как это живёт под транзакциями. Заодно вышел 3.2.0.

Читать далее

Новости

Как стримить данные в ASP.NET и как их принять

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

Недавно мне попалась отличная статья про IAsyncEnumerable и стриминг данных. В ней у автора упал прод, который пытался выдать 500 000 записей разом и упал на вызове ToListAsync() с OOM при 8 ГБ RAM. Далее в статье описывается, как все это стримить с помощью IAsyncEnumerable с примерами кода. В целом после прочтения статьи может сложиться впечатление, что все свои ToListAsync() срочно нужно убрать и заменить на стриминг.

Но со времен появления стримингового апи в .NET мне всегда было интересно, не только то как отдавать стримы, но и как это все получать на клиенте?

Читать далее

Теплые и влажные Плитки для документов на C#: не проводник

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

Не “проводник”, а визуальное пространство документов, что-то ближе к COSMOS (от Waves)-подходу, где файлы живут плитками, имеют вес, цвет, превью, теги, статус и историю.

Всем привет. :?*(*%:%=)

Ниже разбор, как мы шли от красивых, но тяжёлых плиток к более живому и быстрому интерфейсу на C#
И давайте сразу разберемся с плитками (Тут только о плитках)

Читать далее

Анатомия SQLite-провайдера: уходим от EF Core — типизированное хранилище для десктопа, мобайла и Blazor WASM

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

Серия: redb ecosystem (инженерный разбор после анонса 3.2.1)

Когда вышел SQLite-провайдер 3.2.1, анонс был на пару абзацев: «тот же LINQ, одна строка в DI». Эта статья — противоположность анонса. Здесь не «что вышло», а как оно устроено и где у нас потекло. Конкретно: как движок запросов redb переехал в нативное C-расширение там, где у базы нет хранимок; как мы храним DateTimeOffset в базе, у которой нет типа «дата»; и три бага из этого релиза, разобранные с фильтр-JSON, сгенерированным SQL и фиксом.

Это длинно и с кодом. Если хочется коротко — читайте анонс по ссылке выше. Если интересно, что под капотом «одной строки в DI», — устраивайтесь.

Читать далее

Что лучше — C++ или C#?

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

Самым фатальным недостатком C++ является то, что он скоро умрёт. То, что C++ скоро умрёт — это истина, проверенная временем. 30 лет назад все говорили, что C++ скоро умрёт, потому что появилась Java. 20 лет назад ему пророчили скорую смерть, потому что к Джаве присоединился C#. 10 лет назад C++ должен был умереть, потому что появился Rust. 3 года назад его снова принялись хоронить, когда АНБ выпустило спорную рекомендацию «переходить на memory-safe языки» везде, где это возможно, и я думаю, что ещё через 30 лет тоже все будут говорить, что C++ скоро умрёт.

Откуда столько пессимизма? Считается, что C++ неудобен в использовании, и из-за неочевидных правил языка на нём слишком легко написать опасный и забагованный код. В этой статье я сравню C++ и C# в тех аспектах, которые определяют простоту и удобство использования — насколько легко и приятно писать на этих языках, и какой из них вызывает наименьшее количество боли.

Я не собираюсь ничего набрасывать на вентилятор или разводить холивар, а просто хочу объективно и беспристрастно ответить, наконец, на вечный вопрос: что же всё-таки лучше — C++ или C#?

Объективное и беспристрастное сравнение

Web3-мессенджер размером в 3.5 Мб: инди-разработка с нулевым бюджетом

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

ПРЕКРАСНОЕ ДАЛЕКО

Мир цифровых технологий постоянно удивляет. Сначала появились супер процессоры с тактовой частотой аж 8 мегагерц (КР1810ВМ86М — до 8 МГц), затем память (К565РУ7 - Клон Intel 41256), удивляющая своими гигантскими объемами в 256 килобай при наборе из 8 штук. Казалось, мир сошел сума и достиг поистине фантастических возможностей. Но это было в далекие 90-е.

Вспоминаю как спустя пару лет впервые запустил установку своей Windows 95 ставя будильник на два часа позже, чтобы не пропустить фееричный запуск окончания установки на моем первом DX386 с 40 мегагерцами в турборежиме. Чуть позже написал своё первое приложение на Turbo Basic, размер которого составлял всего пару десятков килобайт. Славные были времена, ведь мне тогда было около 20-ти лет.

ВСЕ ВЫШЕ И ВЫШЕ

Время шло. Технологический прорыв казалось никак не мог затихнуть. Процессоры, память, интернет, все стремительно развивалось и уже никто не думал об ограничениях. Появились первые мессенджеры. ICQ со своим уникальным "ку-ку" звучал во всех офисах. Помню даже на некоторых фирмах штрафовали своих сотрудников за использовании мессенджера на рабочем компьютере. Появились первые программы по автоматизации финансовой деятельности предприятий. 1С-ку кажется уже знают все. Встроенный язык программирования, да ещё и с русским диалектом. Вау, вот времена наступили. Всё крутиться, сверкает и манит в магазин компьютерной техники прикупить очередную видюху с двумя или даже тремя куллерами. Эх, где же вы мои любимые Trident TVGA или Cirrus Logic с одним мегабайтов видеопамяти?

Читать далее

«Охота на лис» в XXI веке: забытый радиоспорт в новом техно стиле

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

"О спорт, ты — мир!" — это замечательная фраза основателя современных Олимпийских игр Пьера де Кубертена.

И с этим трудно не согласиться, ведь спорт, не только укрепляет здоровье но и объединяет людей. В этой статье я хочу рассказать, как я объединил некогда популярный вид состязаний "Охота на лис" с современными технологиями, ведь его основные принципы лежали в плоскости геолокации и радионаблюдения. Рожденный ещё в далекие 50-е, этот вид спорта неумолимо двигался по планете привлекая все больше и больше своих поклонников.

Несмотря на своё название, никакой реальной охоты здесь не было. Участники состязаний занимались поиском скрытых источников сигнала радио-маячки работающие в коротковолновом диапазоне частот, используя специальные приёмники-пеленгаторы. Сегодня "Охота на лис" по-прежнему существует, однако ее популярность заметно снизилась. Одной из причин является остутствие финансирования и низкая осведомленность среди молодежи.

Мне захотелось возобновить погасший интерес к этому увлекательному виду спорта и перенести идею классической радиопеленгации в современный мир технологичных приложений. Так появился проект виртуальной "Охоты на лис" под названием "Foxbusters", построенный на использовании технологий геолокации.

Читать далее

File-based apps в .NET 10

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

Для небольших скриптов на C# долгое время приходилось создавать полноценный проект даже ради нескольких строк кода. В.NET 10 появилась поддержка file‑based apps — теперь приложение можно запускать и публиковать прямо из одного.cs‑файла. Разбираемся, как это работает и где новый подход действительно полезен.

Читать далее

Все тесты зелёные, платежи зависли: 5 граблей интеграции без песочницы

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

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

Читать далее

В 2 раза ускорил компиляцию Unity на том же железе

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

Творите в Unity на Windows и страдаете от долгих компиляций? Инструкция как без вложений и разгона сократить время билда в 2 раза.

Читать далее

Аллокации, которых нет в коде: охота на скрытый боксинг в .NET 10

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

Вы написали struct ради zero-allocation, прошли code review — а в проде Gen0-коллекции всё равно идут косяком. Самая дорогая аллокация та, которой нет в исходниках: компилятор молча упаковывает ваш value-тип в кучу там, где вы этого не просили.

Разбираю, где скрытый боксинг живёт и на .NET 10 (интерфейс на struct, foreach по IEnumerable, ValueType.Equals, params object[], замыкания), а где рантайм его уже вырезал — и почему слепо чинить HasFlag по гайдам 2015 года вредно. Два прод-кейса, шпаргалка-таблица, бенчмарк на BenchmarkDotNet и охота на box через DOTNET_JitDisasm и dotnet-gcdump.

Читать далее

Apache Camel под .NET, разбор по косточкам: HTTP-коннектор без ASP.NET MVC + паттерн Content-Based Router

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

Серия: redb ecosystem / redb.Route deep-dive

В redb.Route — нашем ESB в стиле Apache Camel под .NET — маршрут всегда читается одинаково: From(источник) → [процессоры] → To(приёмник). Сегодня берём один простой паттерн интеграции и один коннектор и разбираем оба до самого дна.

Читать далее

Динамические шаблоны пути в интеграциях: как передавать пользовательские данные в URL через DATAREON Platform

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

Привет, Хабр!

С вами снова Илья Вязников, инженер сопровождения СОФРОС. Продолжаю делится практическими приёмами и полезными настройками платформы.

При интеграции с REST API часто возникает ситуация, когда идентификатор объекта нужно передавать не в теле запроса и не в query-параметрах, а непосредственно в URL. 

Такой подход используется во многих CRM, ECM-системах, банковских и государственных API.

Сегодня, разберём, как реализовать подобную интеграцию в DATAREON Platform с помощью шаблона пути и параметров обработчика. 

Читать далее

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

Две базы: одна пишет, другая читает. CQRS без культа и с последствиями

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

Одна база пишет, другая читает: как CQRS, Kafka и Outbox ускоряют запросы, но приносят lag, дубли и eventual consistency

Читать далее

MAX Light — легкая версия клиента MAX для ПК Windows

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

Многие не хотят пользоваться официальной версией Макса для ПК. Немудрено, он требователен к ресурсам, некоторые даже говорят, что «эта тварь жрёт ресурсов больше, чем 1С». Он постоянно обновляется с полной переустановкой, а на момент написания статьи полный пакет официального Макса весит 308 мб. Наконец, он следит за пользователем.

Написал облегчённый клиент — пользуйтесь. Ссылка в статье.

Читать далее

Generic Repository<T> обещал три вещи — не сдержал ни одной и забрал доменную модель

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

Сколько раз вы реально меняли базу под приложением? Generic Repository – первое, что тащат в проект, и последнее, в чём сомневаются, – держат ровно ради этого. У меня за карьеру смена базы случилась дважды, и оба раза репозиторий полетел в корзину вместе со всем слоем. Это лишь первое из трёх обещаний, которое он не сдержал, а по дороге тихо забрал доменную модель. Как именно – на реальном кейсе с Mongo, и чем мы его заменили.

Читать далее

О, сколько нам открытий чудных готовит COM STA-дедлок

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

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

На просторах мне не удалось обнаружить каких-либо упоминаний об этой проблеме, вскользь лишь исследователь Joe Duffy писал об этом в своем блоге. Еще косвенно было упоминание вот на этой google-борде. Отсутствие упоминаний об этом явлении должно говорить о околонулевой ценности исследования, но статья сама себя не напишет.

Речь пойдет об очень необычной причине дедлока GUI-потока в оконных приложениях .NET – WinForms и WPF. Когда такое приложение виснет намертво, разработчик ищет причину там, где привык: в собственных локах, в гонке между своими потоками, в неудачном lock или забытом .Wait(). Он перетряхивает свой код - и нередко не находит ничего криминального. Потому что причина лежит не этажом ниже, чем он смотрит, и даже не в подвале: в механизме, который он не писал, не видит и с которым, как ему кажется, вообще не работает.

Если вы работаете с WinForms/WPF, то вы наверняка знаете, что весь GUI-стек построен на однопоточной модели COM -  Single-threaded apartments: буфер обмена, drag-drop, общие диалоги, shell-интеграция, OLE - всё это STA-компоненты.

У WinForms сгенерированная точка входа Main имеет явный атрибут [STAThread] (видно прямо в шаблоне), у WPF точка входа генерируется автоматически и тоже имеет атрибут [STAThread].

Читать далее

RMS: упрощаем сотрудникам жизнь в поиске Internet-ID

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

Привет! Я — Саша Басун, инженер направления пользовательских ИТ-сервисов в «Петрович-Тех». Сегодня я пришёл к вам с историей о том, как вывод значения ключа из реестра Windows может упростить обработку заявок в отделе технической поддержки.

Если коротко: помощь со стороны нашей техподдержки нередко начиналась с мема «Давайте поможем Даше найти Internet-ID на рабочем столе». Тут нет-нет, да все стадии от гнева до принятия пройти придётся. В итоге после заявки, которая пришла уже мне, родилось маленькое, но изящное решение на C#. 

Читать далее

Нейрогенератор игровых миров. Часть 2: «оно» ожило

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

Два года назад я пытался сделать генератор RPG-игр на GPT-4 и Stable Diffusion: пользователь пишет промпт, а на выходе получает не чат с бесконечной импровизацией, а готовую консистентную игру с миром, персонажами и геймплеем. Тогда технологии едва справлялись даже с ASCII-картами и простыми ассетами.

Сейчас мы вернулись к идее уже с финансированием, новым пайплайном и моделями, которые позволяют генерировать локации, NPC, тайлы, сюжетные ветки, озвучку, музыку и боёвку. В этой части расскажу, как мы прошли путь от неудачного open-world прототипа к пошаговой 2.5D narrative RPG, сколько это стоит и почему «сгенерировать игру» оказалось сложнее, чем просто попросить нейросеть придумать мир.

Читать далее

Как я написал BGP-сервер и не сошёл с ума

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

BGPLite — open-source BGP route-server на C# и .NET 10. Он принимает BGP-сессии, динамически загружает префиксы через RIPE Stat и управляется через HTTP API. В статье разберём архитектуру проекта и реализацию собственного BGP-сервера с нуля.

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