Как стать автором
Обновить
1
0

Пользователь

Отправить сообщение

Маршрутизация по DNS на OpenWrt

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

Написать данную статью меня побудили следующие обстоятельства:

Обновление ОС на своём роутере до OpenWrt 23.05, сломавшее мой предыдущий setup, где я делал роутинг по GeoIP.

Многочисленные вопросы знакомых и в дискуссиях в постах на Хабре.

Статья на Хабре, по которой я стал делать и понял, что так делать не надо.

Читать далее
Всего голосов 11: ↑11 и ↓0+11
Комментарии41

«Внешние» сортировки: что это, зачем это и как это реализовать?

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

Статья про внешние сортировки слиянием. Что это вообще такое, зачем это нужно и как это реализовать? На все эти вопросы я постарался ответить в данной статье, а также привёл примеры кода, написанного на C# 11.

Читать далее
Всего голосов 4: ↑3 и ↓1+4
Комментарии10

Тиннитус (шум в ушах) для айтишников, геймеров, и не только

Время на прочтение16 мин
Количество просмотров69K

ВНИМАНИЕ! Если у вас нет шума в ушах (тиннитуса) и/или нейросенсорной тугоухости, но есть особенности психики в части психосоматики или подобного – покиньте данный пост не читая.

Самые важные победы в мире – победы над собой

Всем привет. Меня зовут Паша Герасимов, мне 38, я – инженер в ИТ, геймер, и у меня диагноз НСТ (нейросенсорная тугоухость), а также субъективный шум в ухе (тиннитус) и гидропс правого лабиринта. По ощущениям, это комбо – шум/гул/свист в ухе, снижение слуха, чувство заложенности за перепонкой, и гиперакузия (повышенная чувствительность к некоторым звукам). Для тех, кто не в теме – представьте, что у вас ухо заложено ваткой, а внутри уха – звук неработающего канала ТВ (как видео пример, или mp3). И так – регулярно, месяцами, без возможности исправления.  

До 37 лет я практически не болел и не ходил по поликлиникам, это повлияло на всю историю с тиннитусом, поэтому для многих очевидные вещи, я понял на своей шкуре. 

Читать далее
Всего голосов 80: ↑78 и ↓2+91
Комментарии155

Поговорим об оптимизирующих компиляторах. Сказ первый: SSA-форма

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

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

Коротко обо мне. Меня зовут Макс, и так получилось, что я вот уже 10 лет, почти с самого начала своей карьеры, занимаюсь оптимизирующими компиляторами. Я начинал в Intel, потом перешёл в Azul Systems, год провёл в Cadence и вернулся обратно, всё это время занимаясь компиляторными оптимизациями для Java, C++ и нейросетевых моделей. На момент написания статьи у меня чуть за 900 патчей в LLVM, большинство из них посвящено цикловым оптимизациям.

За это время я провёл десятки собеседований на позиции как интернов, так и инженеров сеньорного уровня, и довольно часто люди, приходя на эти собеседования, многих вещей не знают или знают поверхностно. И я подумал: а мог бы я написать такой цикл статей, чтобы человек, прочитав их, узнал бы всю ту базу, которая, на мой собственный взгляд, необходимо начинающему компиляторному инженеру? Очень бы хотелось, чтобы новичку в этой области можно бы было дать один (относительно небольшой по объёму) набор текстов, чтобы он получил оттуда всё необходимое для старта. Это не перевод, текст оригинальный, поэтому в нём могут быть ошибки и неточности, которые я буду рад исправить, если вы мне их укажете.

Итак, поехали.

Погрузиться
Всего голосов 93: ↑91 и ↓2+117
Комментарии58

Реализация двустороннего A* на двух потоках

Уровень сложностиСложный
Время на прочтение10 мин
Количество просмотров5.1K

На Хабре можно найти немало статей, посвящённых оптимизациям поиска кратчайшего пути на графе. Я расскажу ещё про еще один подход. Речь пойдёт о распараллеливании алгоритма A* и исполнении его на двух потоках, а также о сложностях, с которыми я столкнулся при реализации, и их преодолении.

Читать далее
Всего голосов 56: ↑56 и ↓0+56
Комментарии35

Топ-10 докладов на С# конференциях 2019-2022 года

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

Небольшая подборка интересных докладов с конференций для C# и .NET разработчиков за последние несколько лет.

Читать далее
Всего голосов 11: ↑9 и ↓2+7
Комментарии4

День Победы. Мой Бессмертный полк

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров34K
День Победы!

Сегодня для меня это единственный настоящий праздник, настоящий всенародный праздник.
В этом году по понятным причинам не будет на улицах шествий Бессмертного полка, он будет проходить в других форматах. Один из таких форматов это рассказ об участниках Великой отечественной войны на страницах социальных сетей.
Поскольку мы находимся на Хабре, то я взял на себя смелость вспомнить о своих учителях непосредственных участников той войны, и кто привел меня на стезю программирования.
Читать дальше →
Всего голосов 387: ↑222 и ↓165+109
Комментарии39

C# как замена VBA в Excel

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров14K
Я довольно много пишу на C#, и это мне нравится. Время от времени мне хочется, чтобы можно было использовать C# внутри других приложений.

Думаю, одним из таких приложений, в которых хорошо приживётся C#, был бы Excel, этим языком можно было бы заменить VBA. Язык VBA уже немного отстаёт от времени, а Microsoft не планирует его апгрейдить. Вместо него — компания предлагает среду-песочницу для JavaScript под названием Office Scripts.

Я понимаю привлекательность JavaScript для веб-версии Excel, но не в качестве хорошей замены VBA.

Так как этим не собирается заниматься Microsoft, я решил, что могу попробовать сам. В конце концов, если Microsoft так увлечена JavaScript, маловероятно, что она выдавит меня с обширного рынка использования C# в Excel.

Итак, вот что я создал:

QueryStorm IDE, выполняющая запрос LINQ для таблицы Excel

«Это что, IDE языка C#, выполняющая запросы LINQ для таблиц Excel?» Именно. Всё так и есть.

Я назвал это QueryStorm. Моя работа над этим проектом началась ещё в 2014 году. Изначально у него имелась только поддержка SQL, и с тех пор я продолжал над ним работать, постепенно добавляя поддержку скриптинга на C#, пользовательских функций C#/Excel, поддержку NuGet, отладчик и даже магазин приложений!
Читать дальше →
Всего голосов 67: ↑66 и ↓1+86
Комментарии22

AsyncCollections: история одного велосипеда

Время на прочтение15 мин
Количество просмотров17K
С давних времён я был большим поклонником System.Collections.Concurrent и BlockingCollection в особенности. Сколько раз это чудо инженерной мысли выручало в самых разнообразнейших ситуациях — не счесть.

С чуть менее давних времён в обиход прочно вошли async/await. Казалось бы, жизнь прекрасна, но есть одно «но»: асинхронный код миксовать с блокирующим кодом как-то не очень-то хочется. А BlockingCollection, как несложно догадаться (хотя бы из названия), в ряде случаев поток блокирует.
Что же делать?
Всего голосов 27: ↑26 и ↓1+25
Комментарии18

ThreadPool.Intro

Время на прочтение6 мин
Количество просмотров6K

Тема тредпула, скажем так, complex and hard. У меня в жизни было два «осознания», когда я гордо говорил себе — вот теперь-то я точно понял, как устроен и как работает тредпул в дотнете! Впрочем, после второго раза я неоднократно осознавал, как же я ошибался.

Читать далее
Всего голосов 10: ↑10 и ↓0+10
Комментарии4

Интересные сюрпризы ConcurrentDictionary (+разбор задачи с DotNext 2017 Moscow)

Время на прочтение5 мин
Количество просмотров27K

Привет всем, кто пишет код для .NET, особенно многопоточный. Редко встретишь потокобезопасный код без потокобезопасных коллекций, а значит, нужно уметь ими пользоваться. Я расскажу о самой популярной из них — ConcurrentDictionary. В ней спрятано на удивление много интересных сюрпризов: как приятных, так и не очень.


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


Читать дальше →
Всего голосов 31: ↑30 и ↓1+29
Комментарии3

ArrayPool<T>: подводные камни

Время на прочтение12 мин
Количество просмотров16K


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


Для уменьшения аллокаций в современном .NET предусмотрены Span/Memory<T>, stackalloc с поддержкой Span, структуры и другие средства. Но если без объекта в куче не обойтись, например, если объект слишком большой для стека, или используется в асинхронном коде — этот объект можно переиспользовать. И для самых крупных объектов — массивов, в .NET встроены несколько реализаций ArrayPool<T>.


В этой статье я расскажу о внутреннем устройстве реализаций ArrayPool<T> в .NET, о подводных камнях, которые могут сделать пулинг неэффективным, о concurrent-структурах данных, а также о пулинге объектов, отличных от массивов.

Читать дальше →
Всего голосов 58: ↑58 и ↓0+58
Комментарии3

Инструментарий для анализа и отладки .NET приложений

Время на прочтение6 мин
Количество просмотров22K

Заглянуть «под капот» кода или посмотреть на внутреннее устройство CLR можно с помощью множества инструментов. Этот пост родился из твита, и я должен поблагодарить всех, кто помог составить список подходящих инструментов. Если я пропустил какие-то из них, напишите в комментариях.


Во-первых, я должен упомянуть, что хороший отладчик уже присутствует в Visual Studio и VSCode. Также существует множество хороших (коммерческих) профилировщиков .NET и инструментов мониторинга приложений, на которые стоит взглянуть. Например, недавно я попробовал поработать с Codetrack и был впечатлён его возможностями.


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


Всего голосов 50: ↑50 и ↓0+50
Комментарии9

Как увеличилась производительность LINQ в .NET 7?

Время на прочтение6 мин
Количество просмотров5.7K

В новой версии .NET улучшилась производительность методов Min, Max, Average и Sum для массивов и списков. Как вы думаете, во сколько раз увеличилась скорость их выполнения? В 2 раза, в 5? Нет, они стали гораздо быстрее. Посмотрим, как этого удалось достичь.

Читать далее
Всего голосов 10: ↑9 и ↓1+13
Комментарии1

IT's Tinkoff .NET Meetup в Томске и Нижнем Новгороде

Время на прочтение3 мин
Количество просмотров4K

Всем привет! Недавно мы провели два офлайн-митапа по .NET. Разработчики выступили с семью докладами — от рассказа о реальной стоимости операций под капотом платформы .NET до разбора межсервисных интеграций. Митапы прошли в Томске и Нижнем Новгороде — городах, где работают Центры разработки Тинькофф. 

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

Читать далее
Всего голосов 15: ↑15 и ↓0+15
Комментарии0

Введение в алгоритм A*

Время на прочтение10 мин
Количество просмотров181K
При разработке игр нам часто нужно находить пути из одной точки в другую. Мы не просто стремимся найти кратчайшее расстояние, нам также нужно учесть и длительность движения. Передвигайте звёздочку (начальную точку) и крестик (конечную точку), чтобы увидеть кратчайший путь. [Прим. пер.: в статьях этого автора всегда много интерактивных вставок, рекомендую сходить в оригинал статьи.]


Для поиска этого пути можно использовать алгоритм поиска по графу, который применим, если карта представляет собой граф. A* часто используется в качестве алгоритма поиска по графу. Поиск в ширину — это простейший из алгоритмов поиска по графу, поэтому давайте начнём с него и постепенно перейдём к A*.
Всего голосов 70: ↑69 и ↓1+68
Комментарии20

Реализация алгоритма A*

Время на прочтение30 мин
Количество просмотров80K


Эта статья является продолжением моего введения в алгоритм A*. В ней я показал, как реализуются поиск в ширину, алгоритм Дейкстры, жадный поиск по наилучшему первому совпадению и A*. Я стремился как можно больше упростить объяснение.

Поиск по графам — это семейство схожих алгоритмов. Существует множество вариаций алгоритов и их реализаций. Относитесь к коду этой статьи как к отправной точке, а не окончательной версии алгоритма, подходящей ко всем ситуациям.
Читать дальше →
Всего голосов 29: ↑28 и ↓1+27
Комментарии4

Unmanaged C++ library в .NET. Полная интеграция

Время на прочтение13 мин
Количество просмотров15K
В статье рассмотрена полная интеграция C++ библиотеки в managed окружение с использованием Platform Invoke. Под полной интеграцией подразумевается возможность наследования классов библиотеки, реализации её интерфейсов (интерфейсы будут представлены в managed коде как абстрактные классы). Экземпляры наследников можно будет «передавать» в unmanaged окружение.
Читать дальше →
Всего голосов 17: ↑16 и ↓1+15
Комментарии14

Сортировки в C#: OrderBy.OrderBy или OrderBy.ThenBy? Разбираемся, что эффективнее и почему

Время на прочтение15 мин
Количество просмотров12K

Предположим, есть задача: нужно отсортировать коллекцию по нескольким ключам. В C# это можно сделать с помощью вызовов OrderBy().OrderBy() или OrderBy().ThenBy(). Но в чём разница между этими вызовами? Чтобы ответить на этот вопрос, придётся покопаться в исходниках.


0991_OrderBy_ThenBy_ru/image1.png


Статья состоит из трёх основных разделов:


  • Предыстория. Для тех, кто любит затравки. История о том, откуда вообще возникла идея провести исследование и изучить, в чём разница между OrderBy().OrderBy() и OrderBy().ThenBy().
  • Сравнение эффективности. Изучаем отличия типов сортировок с точки зрения производительности и потребления памяти.
  • Отличия в поведении. Погружаемся в исходники .NET и разбираемся, из-за чего возникают отличия в эффективности работы рассматриваемых способов сортировки.
Читать дальше →
Всего голосов 21: ↑20 и ↓1+24
Комментарии12

Source Generators в действии

Время на прочтение38 мин
Количество просмотров15K

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


Ранее Андрей Дятлов TessenR выступил на конференции DotNext с докладом «Source Generators в действии». А теперь, пока мы готовим следующий DotNext, сделали для Хабра текстовую расшифровку его доклада.



Что вообще такое эти Source Generators? Как их использовать? Как предоставить пользователю вашего генератора необходимую гибкость конфигурации и понятные сообщения о возникающих проблемах? Как разобраться, когда что-то пошло не так?


Ответы на все эти и другие вопросы — в тексте.

Читать дальше →
Всего голосов 25: ↑25 и ↓0+25
Комментарии7

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность