Обновить
256K+

C# *

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

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

Как использовать Rust внутри приложений на .NET MAUI

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

Когда производительность начинает иметь значение

По производительности Rust находится в той же лиге, что и C++, но с заметно более дружелюбной моделью безопасности. Возможно, вы уже слышали о командах, которые постепенно переходят на Rust, заменяя существующий код. А если вам уже приходилось бороться с лагами от GC или пытаться сделать плавную анимацию, отсутствие сборщика мусора начинает выглядеть особенно заманчиво.

Но можно ли сделать так, чтобы использовать Rust внутри приложения .NET для Android, iOS, MacCatalyst и Windows было действительно удобно?

Читать далее

Новости

CraftHub — или как я устал редактировать JSON вручную и написал редактор

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

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

Огромное количество времени у него уходило не на саму разработку, а на редактирование JSON-файлов. Конфиги предметов, параметры врагов, таблицы балансировки, локализации — всё это JSON. И всё это нужно было либо править руками в текстовом редакторе, рискуя сломать структуру одной лишней запятой, либо писать очередной одноразовый скрипт-конвертер, который через неделю уже никто не помнит где лежит.

Читать далее

StaticECS — Bitmap Entity Component System

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

За десятилетия существования ECS сложились два фундаментальных способа хранить компоненты: архетипы (Unity DOTS, Flecs, Bevy) и sparse sets (EnTT, LeoECS). Каждый из них несёт структурные ограничения, которые не устраняются оптимизацией реализации — они вытекают из самой модели данных.

StaticEcs — третья модель. Она основана на инвертированном иерархическом битовом индексе: не сущности хранят маски своих компонентов, а компоненты хранят битовые карты сущностей. Фильтрация запроса — это побитовое AND, обрабатывающее 64 сущности за одну инструкцию CPU. Добавление или удаление компонента меняет один бит и не перемещает никаких данных.

В статье разбираю, как устроена эта архитектура, чем она отличается от архетипов и sparse sets, и что даёт на практике.

Читать далее

Распознавание лиц с потока камеры в .NET MAUI

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

Сегодняшние приложения для мобильных и настольных устройств умеют распознавать на изображениях почти что угодно, - от QR-кодов до количества калорий в еде на на фото. На платформах, которые поддерживает .NET MAUI, для этого можно использовать разные варианты, как локальные ML-движки вроде TensorFlow Lite, нативные SDK для конкретной платформы, типа ARKit на iOS, так и разные Vision API. Далее все зависит уже от реализации в приложении.

И вот, когда речь идет пойдет о распознавании изображений от камеры, наш вариант - пакет DrawnUi.Maui.Camera. В предыдущей статье я показывал, как использовать SkiaCamera для анализа аудио с AI в реальном времени, а сегодня займемся видео: разберем на примере распознавания лиц.

Читать далее

Почему Proptech — одна из самых сложных ИТ-индустрий (и почему это круто)

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

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

Когда говорят про ИТ в строительстве, многие представляют довольно скромную картину: техподдержку, корпоративный сайт и пару интеграций с ERP. На практике всё давно выглядит иначе. Современный девелопер - это десятки цифровых продуктов: BIM-модели зданий, системы управления строительством, аналитические платформы, CRM, мобильные приложения жителей и даже собственные ИИ-платформы.

Меня зовут Саша. Я занимаюсь развитием операционной модели ИТ-департамента девелопера Sminex. Кстати, пару лет назад я уже писал на Хабре статью про работу системного аналитика 1С в девелопменте. Тогда речь шла о более узком срезе - роли специалиста внутри одного класса корпоративных систем и о том, как эти системы помогают бизнесу.

С тех пор моя роль внутри ИТ изменилась, и теперь я больше фокусируюсь на работе всей цифровой экосистемы компании. Поэтому хочу поговорить не про одну систему и одну роль, а про то, как вообще устроен PropTech на уровне всей ИТ-инфраструктуры девелопера.

Телепорт в ИТ Sminex

Проектирование иерархии моделей данных в многослойном приложении

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

При проектировании многослойной архитектуры приложения одной из главных задач является формирование набора моделей данных каждого слоя и определение порядка взаимодействия моделей данных между собой. Под взаимодействием понимаются потоки данных, передаваемые из одной модели данных в другую. В общем случае взаимодействие между моделями данных двунаправленное.

Рассмотрим модель данных application model, которая потребуется в дальнейшем изложении и которая используется в паттерне CQRS.

Реализация архитектурного паттерна CQRS, используемого в приложении для функционала application logic, представляет собой набор классов наследников базовых классов QueryHandler / CommandHandler и набор классов данных, которые являются наследниками базовых классов Query / Command. Классы наследники Query / Command представляют собой модель данных application logic. Такую модель данных логично назвать application model.

Используя application model и другие известные модели данных слоёв приложения можно построить полную схему моделей данных многослойной архитектуры приложения.

Читать далее

От слов к числам: как математически отличить Middle от Senior

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

Привет, Хабр! В своей первой статье про анализ вакансий C#/.Net разработчиков на рынке я выделила очень интересное замечание, которое определило тему сегодняшней статьи – «не количество навыков делает из мидла синьора, а образ его мышления». Построить граф связности компетенций для синьора это конечно хорошо, но к сожалению, на практике применить его достаточно сложно.

Сделав упор на навыки в своем исследовании, я получила зашумленный датасет, не поддающийся адекватной кластеризации. Так что пришло время попытаться пересмотреть подход к использованию полученных данных и попытаться вычленить из них тот качественный скачок, который отделит мидла от синьора.

Читать далее

Labeled break and continue в C# 15 — разбор плохого примера и поиск реального кейса

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

Всем привет. В последнее время в одной профессиональной соцсети я все чаще стал натыкаться на посты, связанные с dotnet C# тематикой. К сожалению, эти посты в большинстве своем не содержат полезной информации. Скорее всего они создаются для охвата аудитории с целью привлечения трафика на сторонние платформы по продаже курсов для разработчиков. По-моему, этот способ называется "воронка продаж" (поправьте, если я ошибаюсь). Как правило, эти посты затрагивают какую-то не очень сложную тему и содержат примеры кода. Недавно мне попался очередной пост, в котором автор пытался показать пример использования новой фичи labeled break and continue. Это новая фича, которую добавили в C# 15 (dotnet 11). На момент написания она была принята в Working Set, но финального релиза ещё не было. Ниже код, похожий на оригинал из поста. Он разделен на 2 секции: "как делали раньше" и "как сделать используя новый подход":

Стандартный способ:

Читать разбор

Выделение регистров процессора при помощи генетического алгоритма

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

Эксперимент, который многое объясняет

Оригинал этого поста также вошёл в число документов по проектированию платформы .NET: lsra-heuristic-tuning.

Читать далее

Discriminated Unions: Что не так с реализациями объединений в C#?

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

В жизни каждого программиста рано или поздно наступает момент, когда хочется вернуть из функции «либо то, либо это». Правильным языком это называется Discriminated Union (далее DU). Его суть проста: тип должен представлять одно значение из нескольких возможных (поэтому реализации называют «OneOf», т.е «один из»).

Казалось бы, что это довольно станадртная ситуация и нечего тут бухтеть, но именно c# кажется особенным в этом плане по сравнению с другими языками. Давайте разберёмся как устроены DU в других языках программирования.

Одним из самых простых примеров без «но» является Си. Действительно, язык просто содержит ключевое слово union, которое позволяет на один участок памяти наложить типы. эта возможность просто комбинируется с enum или int тегом, чтобы различать, что мы записали. Проблема заключается в том, что по большей части никто ничего не гарантирует: программист сам обязан проверять каждый из вариантов и следить, чтобы случайно не создать невалидное состояние.

Читать далее

Обучение LLM с нуля на c# и экспорт в GGUF. OpenCL против CUDA

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

Напишем с нуля на c# маленькую модель размером 422 Кб, сохраним в GGUF и запустим в LM Studio.

А в этом нам поможет всего один единственный компонент: ILGPU, позволяющий обучать модель на OpenCL. А точнее - на встройке AMD.

Ну а если у вас есть видеокарта NVidia - компонент позволяет обучать модель с помощью CUDA.

Читать далее

Как стать инди-разработчиком в 40+ лет без опыта и образования

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

В этом посте я хочу поделиться своим мнением: может ли человек в 2026 году без специализированного образования и без какого-либо опыта в геймдеве стать инди-разработчиком.

Меня зовут Rok и в настоящее время я занимаюсь разработкой коллекционной карточной игры про танки в сеттинге Второй мировой войны — Tank General.

На данный момент мне 44 года. Я не являюсь профессиональным разработчиком и никогда раньше не имел отношения к геймдеву. По профессии я юрист и всю свою жизнь работал именно юристом. Разработчиком я решил стать полтора года назад.

Разрабатываемая мной игра уже имеет вполне рабочий билд. В нём реализованы около 200 карт техники и приказов, три играбельные нации, около 30 штабов со способностями, несколько PvE-режимов, а также сетевой режим, который является основным в моей игре.

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

Читать далее

Создание языка программирования дилетантом. Как это?

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

Идея создать собственный компилятор появилась у меня раньше идеи сделать собственный язык программирования. Помню, ковырялся в исходниках прошивки EV3 контроллера, чтобы сделать его эмуляцию, и в голову пришла идея -- почему бы не сделать что-то такое, но свое? Эмуляция так и не получилась адекватная, но идея написания компилятора или виртуальной машины из головы не уходила.

Читать далее

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

AI-субтитры и обработка видео в реальном времени на .NET MAUI

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

Как создать мобильное приложение c фото- и видео-камерой на C# с использованием элемента SkiaCamera: SKSL шейдеры, AI-субтитры и наложение графики во время записи.

Для захвата камеры в .NET MAUI есть хорошие варианты: CommunityToolkit.Maui.Camera, MediaPicker и платформенное API.

Для особого класса задач, где необходимо обрабатывать превью и кадры, идущие в запись, есть пакет DrawnUi.Maui.Camera.

Лучше всего заходит для :

– Наложения эффектов/обработки превью и отправки кадров в AI/ML
– Обработки снятых фотографий перед записью в галерею
– Обработки видео-кадров в реальном времени
– Обработки аудио в реальном времени

Читать далее

Идеальный Outline в Unity 6: Пишем эффект обводки под новый URP Render Graph

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

Если вы недавно обновились до Unity 6 (или URP 17+) и попытались перенести свои старые пост-эффекты, то наверняка столкнулись с красной консолью и предупреждениями об устаревших методах.

Старые туториалы по созданию эффекта обводки (Outline) через ScriptableRendererFeature больше не работают "из коробки". Unity полностью изменила архитектуру рендера, внедрив Render Graph. Старый добрый метод Execute канул в Лету, а fullscreenMesh заменили на Blitter.

В этой статье мы не просто перепишем классический эффект Outline под новые реалии Unity 6. Мы решим две главные проблемы подобных шейдеров, о которых часто умалчивают в гайдах.

Читать далее

CoreBus — универсальный Modbus терминал

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

CoreBus — кроссплатформенный терминал для работы с COM-портами и TCP-сокетами с поддержкой протоколов Modbus TCP / RTU / ASCII и много чего еще.

Приложение развивается уже довольно давно. Но была одна фича, которой не хватало, чтобы сделать CoreBus по-настоящему универсальным терминалом. Мне об этом писали еще с первых релизов. В личных сообщениях и в комментариях к статьям. Эта идея формулировалась по-разному, но суть была одна.

И поэтому хочу представить вам новый режим - "Modbus мониторинг"!

Читать далее

Процедурные текстуры на GPU: пишем генератор местности в Compute Shader

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

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

Однако генерация сложных ландшафтов на CPU может стать узким местом, особенно когда речь идет о streaming-мирах или динамическом разрушении окружения. На помощь приходит вычислительная мощь графического процессора. Используя Compute Shaders, мы можем перенести тяжелые математические расчеты на тысячи ядер видеокарты, получая готовую карту высот или же heightmap за доли миллисекунд. В этой статье мы разберем, как устроены процедурные текстуры, почему GPU идеален для этой задачи, и напишем собственный генератор местности с эрозией на HLSL.

Читать далее

Рефакторил-рефакторил, и почти всё переписал в итоге

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

Дали мне недавно задачу написать тесты для одной CLI-тулзы. Это мне уже привычно и понимание, зачем тулза нужна, есть. Я только не знал, что меня ждёт в коде. Программист, писавший её, сделал гигантскую работу — претензий нет (не обижайся, пожалуйста, если читаешь это, но это стоит отдельной статьи). Там суммарно, наверно, порядка 30к строк кода написано. Нюанс в том, что, видимо, он раньше не писал на C#,

Так что тут я соберу для вас примеры, как нельзя писать и как стоит.

Читать далее

Как я пытался сделать анимацию для игры с помощью ИИ — и чуть не навайбкодил нервный срыв

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

Привет, Хабр. Я — Андрей Макар-Уваров, Head of Frontend в Surf. Недавно решил проверить одну гипотезу: насколько далеко можно уехать на ИИ в разработке, если взять задачу, в которой ты абсолютный ноль.

Как стартовую точку выбрал микро-игру. Идея простая: рыжий кот с фонарём ходит по тёмному лабиринту, находит других животных и передаёт им свет. Например, можно оставить свет зайчику, чтобы он подсвечивал проход, или забрать его и усилить собственный фонарь. Должен был получиться небольшой атмосферный пазл про свет, тьму и управление ограниченным ресурсом. И вот что получилось.

Читать далее

3 архитектурные ошибки в C#, из-за которых проект становится неуправляемым

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

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

Эти антипаттерны не привязаны к языку программирования — они встречаются и в Java, и в Go, и в Python. Примеры покажу на C#/.NET, но суть та же для любого стека. Три конкретных случая из реальных проектов — и как их исправить.

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