Обновить
80.52

.NET *

Хаб со знаниями про .NET

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

Облачный абордаж: как Space Pirates остается в инфраструктуре, растворяясь в трафике легитимных облачных сервисов

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

APT-группировка Space Pirates и облачные C2-каналы: LuckyStrike Agent с C2 на базе Yandex Cloud и новый бэкдор PhantomCloud, использующий OneDrive и Dropbox для скрытого управления — обо всём этом мы поговорим в этой статье.

Читать далее

Новости

Dynamic в C#: когда использовать

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

В 2010 году в C# 4.0 появилось ключевое слово dynamic. Тогда казалось, что это очень круто — наконец‑то можно обойти строгую типизацию там, где она откровенно мешает. Прошло пятнадцать лет, и эйфория давно улеглась. Теперь dynamic воспринимается скорее как специализированный инструмент с узкой областью применения.

Читать далее

Раскрываем мощь Zlib и немного Brotli в .NET

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

В .NET Core 2.1 Microsoft добавила поддержку Brotli-компрессии, предоставив разработчикам привычный контракт на базе Stream.

Идея проста: вы оборачиваете поток с несжатыми или сжатыми данными в BrotliStream и читаете или пишете данные, как обычно.

Читать далее

Как я писал систему, которая упростит поиск квартиры мечты

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

Покупка квартиры — достаточно сложное и дорогое дело. Хочется выбрать лучшее из того, что есть на рынке и не прогадать по цене. С такими мыслями наша семья начинала поиски квартиры на вторичном рынке в Санкт Петербурге в начале 2023 года.

Объявления в России принято искать на многочисленных площадках с недвижимостью: Циан, Авито, Дом Клик и так далее У каждой свои механики и множество объектов недвижимости. Я пытался просмотреть все, которые подходили по параметрам «станция метро», «время до метро», «максимальная цена», «минимальная площадь». Но вскоре понял, что это занимает слишком много времени ежедневно.

Читать о приключении на 20 минут

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

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

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

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

Разобрать Bulkhead

Использование ИИ в поиске Гостендеров

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

В этой статье я расскажу как я использовал новейшие возможности ИИ MSSQL 2025 для поиска гостендеров. Текущую рабочую версию я выложил на https://artemtender.ru

Не секрет, что сейчас тяжелые времена для программистов, тем более если тебе за 40, 80% резюме даже не доходит до рекрутеров. Я попробовал поискать работу на гостендерах. Не смотря на то, что общее мнение в том, что большая часть предложений там не рентабельна, с помощью вайбкодинга можно было бы вытянуть проект в плюс.

Оказалось что на zakupki.gos.ru найти что-то не реально. Там нет нормального фильтра, нужно вручную просматривать сотни позиций, и то позиция может выглядеть просто как "Разработка и поставка ПО". Дальше нужно скачивать документацию вручную и читать. Первая мысль - нужно скармливать Chat GPT и спрашивать подходит ли заказ лично мне. С этим он справляется неплохо, но нужно в начале эту позицию найти, а с этим он уже не справится.

Решение следующее - необходимо зарегистрироваться в системе госзакупок и получить токен на получение данных. Для поиска позиций я использую косинусную сходимость. Тут очень пригодился новый тип Vector в MSSQL. В базе он выглядит так: [Vector] vec NULL. Этот тип уже поддерживается новейшим EF Core. Все названия закупок индексируются помощью модели ai-forever/ru-en-RoSBERTa методом проб и ошибок я выбрал ее. Подскажите в комментариях, может быть есть что то и лучше. Микросервис на пайтоне получает batch запрос на индексацию и через RabbitMQ возвращает в микросервис обработки БД на .NET Core. В профиле пользователь создает товары и услуги которые так же индексируются через поле Vector. Поиск и сравнение идет уже средствами самого MSSQL и в результате все работает довольно быстро. Скан нескольких сотен тысяч позиций происходит в реальном времени. Единственно, сама индексация не столь быстрая, поэтому я вынес в профиль. Кроме того, по моему это просто удобно - ведь твои услуги меняются не так часто и их проще выбрать из списка. В моем веб-приложении https://artemtener.ru это выглядит так:

Читать далее

Автоматизируем HR-процессы в Додо. Часть 1

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

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

Узнали мы это, когда разрабатывали свою HR Platform. Как мы это делали и какие проблемы решали в процессе — я расскажу в своих статьях. Начнём с путешествия в 2018 год, когда мы даже не могли точно сказать, сколько человек работает в управляющей компании Додо. Вперёд в прошлое!

Вернуться в 2018

Ваш кэш в .NET не защищён от cache stampede

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

У вас есть запрос к базе данных или к платному API, и вы кэшируете результат? Для кэша используете ConcurrentDictionary или MemoryCache?

У кэша, построенного на этих классах, есть одна неприятная проблема: отсутствие защиты от давки кэша (cache stampede). При определённой нагрузке кэш будет многократно выполнять один и тот же запрос из-за отсутствия координации между потоками и репликами. В этой статье я наглядно покажу, как давка кэша влияет на C# приложение и что с этим делать.

Читать далее

Await своими руками в C#

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

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

Многим кажется, что await работает только с Task и ValueTask, но на самом деле язык позволяет сделать любой объект ожидаемым — нужно лишь реализовать определённый паттерн.

Итак, зачем нужен свой await? Бывают случаи, когда вам хочется написать асинхронный метод, но результат приходит не из готового Task или таймера. Например, ждёте какое-то событие, изменение файла, считывание из сокета, или просто хотите встроить задержку без запуска Task. Когда вы пишете await expr, компилятор в глубине понимает так: берётся результат expr.GetAwaiter(), затем вызывается awaiter.IsCompleted. Если false, он подписывается на awaiter.OnCompleted, когда завершится, и потом берёт awaiter.GetResult().

Читать далее

ReadyToRun и Crossgen2: AOT-компиляция в .NET

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

Привет!

Разберём ReadyToRun (R2R) — технологию предкомпиляции в .NET. Многие включают её, надеясь на супер ускорение, а потом удивляются результатам. Посмотрим, как это работает на самом деле и где реально помогает.

ReadyToRun — это AOT-компиляция для .NET. Обычно приложение поставляется в IL-коде, который JIT превращает в машинный код во время выполнения. R2R компилирует код заранее при публикации проекта — в итоговых DLL лежит и IL, и готовые машинные инструкции. При запуске CLR просто берёт нативный код без пауз на компиляцию.

Как это работает

Гайд: Как прострелить ноги unsafe кодом в C#

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

ДИСКЛЕЙМЕР: Это статья является ручным переводом оригинальной статьи с небольшими пояснениями. Поводом для перевода стало слишком частое использование unsafe кода в других статьях о C# на русском языке в том числе тут на хабре.

Читать далее

Оптимизация памяти в C# (и немного в Unity): эффективные методы и стратегии

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

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

Язык программирования C#, несмотря на то, что обеспечивает автоматическое управление памятью с помощью механизма сборки мусора (GC), требует от разработчиков специальных знаний и навыков для оптимизации работы с памятью.

Читать далее

Оптимизация загрузки CPU в C# (и немного в Unity): ключевые подходы и стратегии на примерах

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

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

Читать далее

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

Умершие языки программирования (Fortran, Ada, Cobol) И почему на западе они до сих пор живы

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

Существуют языки, которые все считают мертвыми, но есть ньюанс. В СНГ на Бейсике вакансий больше чем на Руби, а вакансий у Паскальщиков не сильно меньше чем у шарпистов.

Все не так просто, поэтому давайте разбираться.

Читать далее

I'm on the stairs to hell

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

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

Читать далее

Логирование с Serilog: как повысить отказоустойчивость и скорость

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

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

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

Читать далее

Подводные камни миграции с SharePoint 2013 на SharePoint 2019

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

С каждым годом пользователей SharePoint 2013 становится все меньше в связи с появлением новых версий. Но многие компании не торопятся переходить на новые версии SharePoint из-за сложности перехода и больших накладных расходов.

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

Для прода инфраструктура должна быть более сложная. Каждая организация сама определяет ее в зависимости от планируемого объема данных и дальнейшего развития. Если организация достаточно большая, как в нашем случае, тогда явно напрашивается архитектура из сервера переднего плана, нескольких WFE-серверов, серверов баз данных (контентных и кастомных), серверов для служб поиска, распределенного кэша и других. Сервера должны быть современные с большим объемом памяти, процессорами последних поколений и т.д.

Сразу в прод ставить неправильно, поэтому нужны тестовые стенды. Для них такая мощная инфраструктура не нужна, хотя по возможности можно и такую организовать.

Итак, были созданы тестовые стенды с усеченными контентными базами (без их усечения пришлось бы выделять гораздо большие ресурсы, с чем сейчас сложности). Скрипт усечения заключался в подмене больших файлов на шаблоны меньшего размера. Так как прямой переход с SharePoint 2013 на SharePoint 2019 невозможен, нужен был стенд и для SharePoint 2016. В качестве стендов для SharePoint 2013 прекрасно подошли машины разработчиков, которые уже работали до этого.

Инфраструктура была создана, доменные имена присвоены, можно приступать к самому интересному.

Читать далее

Эффективное применение NuGet

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

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

Читать далее

.NET C# и RabbitMQ Streams: превратить кролика в Kafka легко, нужно всего лишь…

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

Работа с очередями сообщений — важная часть современных систем обработки данных. В нашей команде мы используем брокер сообщений RabbitMQ, но нам пришлось столкнуться с проблемами при обработке большого объема данных. В поисках решений я начал изучать различные способы оптимизации, и таким образом познакомился с RabbitMQ Streams – плагином, добавляющим log-based потоки, работающие по аналогии с Kafka

Я потратил некоторые время, вникая в принципы работы RabbitMQ Streams с .NET и хочу представить вам краткий обзор, который призван упростить погружение в эту систему

Читать далее

Запуск WPF-приложений в Docker: Экспериментальный подход с Wine

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

Запуск WPF на Linux долгое время казался невозможным. Но благодаря связке Docker и Wine теперь это реальность. Рассказываю о своем практическом опыте, как заставить эксклюзивную технологию Microsoft работать вне Windows.

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

Вклад авторов