Обновить
256K+

C# *

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

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

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

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

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

Мир цифровых технологий постоянно удивляет. Сначала появились супер процессоры с тактовой частотой аж 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 мин
Охват и читатели12K

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

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

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

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

Читать далее

File-based apps в .NET 10

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

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

Читать далее

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

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

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

Читать далее

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

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

Творите в 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.5K

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

Читать далее

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

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

Многие не хотят пользоваться официальной версией Макса для ПК. Немудрено, он требователен к ресурсам, некоторые даже говорят, что «эта тварь жрёт ресурсов больше, чем 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-сервера с нуля.

Читать далее

Интеграция ИИ уровня предприятия: встраивание LLM в бизнес-процессы крупных компаний — redb.Route.Llm 3.1.1

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

redb экосистема

В предыдущей статье я анонсировал redb.Route.Llm как 24-й транспорт redb.Route — мы делали LLM ещё одним endpoint'ом наравне с Kafka, RabbitMQ и HTTP, чтобы выкинуть отдельную «AI-инфраструктуру», стоящую рядом с интеграционной. Заодно я повесил в конец статьи «честный skip-list» — список того, что в 3.1.0 ещё не доделано: streaming, ToolCacheStore, KnowledgeStore, BatchStore, EvalRunStore, sliding-window память, sandbox-инструменты.

Из этого skip-list'а делано больше, чем я планировал. Но не это главное. Главное — что в процессе доделывания обнаружилась настоящая ценность всей затеи: LLM-транспорт оказался не очередным чат-фреймворком, а недостающим звеном в ESB, после которого «бизнес-агент в проде» перестаёт быть отдельным проектом. Эта статья — про то, как чат-демо превращается в enterprise-агентскую платформу, не переписываясь и не превращаясь в «AI-монолит сбоку».

Всё, что ниже — реальный код из репозитория, не псевдокод. Ссылки на демо-маршруты в конце.

Читать далее

Инкрементальный парсер на c#

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

Создаю собственный DSL на C#: рассказываю о том, как инкрементальный парсер. И наконец-то будет использовать одно из преимуществ рослиновской модели синтаксиса.

Читать далее

Быстрый поиск причин сбоев в логах с помощью EventId в .NET Core на примере актов для единого реестра интернет-рекламы

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

Привет, Хабр! На связи Андрей Алексеенко, техлид оператора рекламных данных (ОРД) «МедиаСкаут». В предыдущем посте мы начали рассказывать о том, как своевременно передаем информацию в единый реестр интернет-рекламы (ЕРИР) — показали настройку гарантированной доставки данных внешним сервисам. Сегодня предлагаю пойти дальше и обсудить, что мы сделали, чтобы вовремя находить, локализовать и устранять проблему, если по какой-то причине (а их множество, и потому разбирать нет смысла) доставка все же не случилась.

Речь о наблюдаемости за системой, которая держится на трех принципах: логирование, трассировка, метрики. В материале разберем механизм контекста структурированного логирования и посмотрим на примерах, как использовать EventId в .NET Core для классификации событий в логах, чтобы быстро понимать, где и что сломалось. Итак, поехали!

Читать дальше

Механизм создания многосегментных компонентов WPF на примере 7 и 16 сегментов

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

В данной статье разбирается, как реализовать пользовательский многосегментный WPF компонент. Это может содействовать в изучении внутреннего устройства C#, .NET и самой платформы WPF. Разработанное решение дает множество гибких настроек, использовать латинские символы, цифры, кириллицу и работать через MVVM для привязки свойств зависимостей.

Читать далее

Kafka в проде: как встроенное сжатие спасло кластер, когда retention не успевал чистить диск

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

Привет, Хабр! Меня зовут Павел, я ведущий разработчик. В этой статье расскажу про Kafka, consumer groups, lag, offset commit и встроенное сжатие сообщений. Не в формате “что такое Kafka за 15 минут”, а через обычную продовую историю, где кластер начал есть диск быстрее, чем политики очистки успевали его освобождать.

Снаружи проблема выглядела банально: Kafka живет, producer’ы пишут, consumer’ы читают, retention настроен. Внутри было веселее: в пиковую нагрузку место на брокерах улетало так бодро, будто у него был отдельный KPI на исчезновение. Retention вроде бы должен был чистить старые данные, но он не маг. Если входящий поток крупных сообщений быстрее, чем Kafka успевает освобождать сегменты, диск все равно закончится. А когда диск заканчивается у Kafka, настроение портится не только у Kafka.

В итоге мы пришли к встроенному сжатию Kafka на producer’ах. Без ручного zip payload, без “давайте завернем JSON в архив и пусть каждый consumer теперь разбирается сам”. Просто включили compression на уровне Kafka-клиента. В нашем случае объем сообщений на хранении уменьшился примерно в 5 раз. Это не отменило необходимость следить за retention, lag и consumer groups, но дало кластеру перестать жить в режиме “еще один пик, и пишем посмертную”.

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