• Ленивая инициализация в C#

    • Tutorial
    Отложенная инициализация или «ленивая» инициализация — это способ доступа к объекту, скрывающий за собой механизм, позволяющий отложить создание этого объекта до момента первого обращения. Необходимость ленивой инициализации может возникнуть по разным причинам: начиная от желания снизить нагрузку при старте приложения и заканчивая оптимизацией редко используемого функционала. И действительно, не все функции приложения используются всегда и, тем более, сразу, потому создание объектов, реализующих их, вполне рационально отложить до лучших времён. Я хотел бы рассмотреть варианты ленивой инициализации, доступные в языке C#.
    Читать дальше →
  • Отлаживайте ваши приложения .NET Core в WSL 2 с Visual Studio

    • Translation
    Вы разработчик .NET Core, которому нравится работать в Windows и Visual Studio, но вам нужно протестировать свое приложение в Linux? Вы кросс-платформенный разработчик, которому нужен простой способ тестирования большего количества целевых сред? Вы уже открыли для себя преимущества WSL 2, но вам нужен способ интегрировать его во внутренний цикл? У меня есть для вас расширение! Расширение .NET Core Debugging с WSL 2 — Preview дает вам возможность запускать и отлаживать приложения .NET Core в WSL 2, не выходя из Visual Studio.

    Читать дальше →
  • ANYKS Spell-checker

    • Tutorial
    image

    Здравствуйте, это моя третья статья на хабре, ранее я писал статью о языковой модели ALM. Сейчас, я хочу познакомить вас с системой исправления опечаток ASC (реализованной на основе ALM).

    Да, систем исправления опечаток существует огромное количество, у всех есть свои сильные и слабые стороны, из открытых систем я могу выделить одну наиболее перспективную JamSpell, с ней и будем сравнивать. Есть ещё подобная система от DeepPavlov, про которую многие могут подумать, но я с ней так и не подружился.
    Читать дальше →
  • 10 песен про IT: от Столлмана до исходников


      Мне интересны и IT, и музыка, поэтому я всегда обращал внимание на их пересечение: песни айтишников. Порой это пародии на известные хиты с переделанным текстом, порой — полностью оригинальные сочинения. Одни из них примечательны автором (самый известный — Ричард Столлман), другие форматом (самый нестандартный — пение кода).


      Обычно такие песни несерьёзные, так что пятница — подходящий день для подборки из них. Но заодно это и повод разобраться: какими они вообще бывают и чем различаются?


      Я не рассматривал случаи, когда компьютерную тематику затрагивали известные музыканты, никогда не работавшие в IT. Здесь только хардкор — песни, написанные теми, кто и код писать умеет! Дополняйте в комментариях теми, которые запомнились вам.

      Читать дальше →
    • О локальном поиске замолвите слово

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

        Но у всех этих решений не было того, что мне нужно:

        • Централизованная установка
        • Поисковая выдача с учётом прав доступа
        • Поиск по содержимому документа
        • Морфология

        И я решил сделать своё.
        Читать дальше →
      • A* pathfinding на C#: двоичные кучи и борьба с аллокациями

        Сегодня мы разбираем один из популярнейших алгоритмов поиска пути. Работать будем с двумерным массивом целочисленных координат.

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

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

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

        Приступим!
        Читать дальше →
      • Психология удалёнки: как не слететь с катушек

          Удалёнка бьёт по мозгам. И это я вам говорю не как те, кто погрузился в неведомо прекрасное состояние в марте, а как человек, который уже пять лет не видел офисную жизнь, не пил сонным кофе из кофемашины и не встревал в беспечный разговор коллег от скуки рабочего дня. Мне уже приходилось слышать, что кому-то «ковидная» удалёнка надоела, кто-то хочет её навсегда, кто-то мечтает поделить рабочую неделю на офис и хоум-офис. Но 5-6 месяцев — короткий период, чтобы понять свой настоящий выбор (да не случится с нами такое ещё раз!). Удалённая работа меняет личность человека, причём вне зависимости от того, живёт он один, с родными или даже друзьями. Мы становимся другими. И это обязательно нужно обсудить.


          Упитанный, унылый, наедине с компом — примерно так и проходит удалёнка
          Читать дальше →
        • Почему я использую Matrix вместо Telegram

          • Tutorial
          Matrix — замечательный, но недооценённый децентрализованный протокол обмена сообщениями с прилагающимся к нему клиентом Element, который я считаю достойной и жизнеспособной альтернативой Telegram.

          Рассказываю, почему я использую Matrix вместо Telegram, как присоединиться к сети Matrix и настроить свой сервер.


          Читать дальше →
        • Использование контроллера Arduino для прерываний

          В данной стать я приведу пример использования arduino контроллера для вызова прерываний программы на C#.

          Стоит отметить, что в WindowsForms присутствует элемент Timer который включается и выполняет код через определенный промежуток времени.



          Я решил реализовать подобное используя микроконтроллер Arduino UNO.

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

          Я считаю, что данная статья будет интересна тем, кто занимается программированием микроконтроллеров, так как в ней приведен пример одного из вариантов использования микроконтроллеров.
          Читать дальше →
        • IOptions и его друзья

          Во время разработки часто возникает потребность для вынесения параметров в конфигурационные файлы. Да и вообще — хранить разные конфигурационный константы в коде является признаком дурного тона. Один из вариантов хранения настроек — использования конфигурационных файлов. .Net Core из коробки умеет работать с такими форматами как: json, ini, xml и другие. Так же есть возможность писать свои провайдеры конфигураций. (Кстати говоря за работу с конфигурациями отвечает сервис IConfiguration и IConfigurationProvider — для доступа к конфигурациям определенного формата и для написания своих провайдеров)


          image


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

          Читать дальше →
        • Премии, льготы и бонусы в IT: результаты исследования Хабр Карьеры



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

            О льготах и премиях сегодня как раз и поговорим. Мы провели опрос среди IT-специалистов, в котором выяснили, кому какие премии платят и за что, насколько айтишники в итоге удовлетворены этими премиями. 

            Из полученных ответов мы сделали наглядные диаграммы и хотим поделиться полученными инсайтами.
            Читать дальше →
          • OCR для PDF в среде .NET — как извлечь текст из недоступных для поиска PDF документов

            • Translation
            • Tutorial

            Извлечение текста — одна из популярных задач обработки PDF документов. Вам потребуется извлечь текст из PDF, чтобы:


            • проиндексировать документ для полнотекстового поиска
            • распарсить некоторые данные (например, названия и цены товаров в прайс-листе)
            • выделить, удалить или заменить некоторое слово или фразу

            Извлечь текст вручную можно так: откройте документ в любом PDF просмотрщике, выделите и скопируйте текст. В большинстве документов это сработает. Такие документы называются "доступные для поиска PDF" или "searchable PDF". Текст в них выводится с помощью специальных PDF операторов, а связанные объекты шрифтов содержат правильную информация о соответствии глифов значениям Unicode.


            Многие PDF библиотеки умеют извлекать текст из доступных для поиска PDF.


            Однако, часто встречаются и недоступные для поиска PDF ("non-searchable PDF") документы. В них текст обычно выводится как растровое изображение. Типичный пример — сканированный PDF документ. Также текст в недоступных для поиска PDF может выводиться векторными путями без использования шрифтов и специальных PDF операторов.


            Для извлечения текста из недоступных для поиска PDF выполняйте оптическое распознавание текста (OCR). Оптическое распознавание не гарантирует правильного извлечения текста в 100% случаев. Результат зависит от качества документа и алгоритма распознавания. Также OCR существенно медленней, чем извлечение текста из доступных для поиска PDF.


            Посмотрим, как выполнить оптическое распознавание и извлечь текст из PDF документов в программе для платформы .NET.

            Читать дальше →
          • За что bim-менеджер получает 100 тысяч и как им стать. Личный опыт



            Эта статья поможет двум типам людей:

            1. Тем, кто хочет поменять на работу, умеет писать простой код и знает о стройках и чертежах не по наслышке.
            2. Тем, кто учится на стройфаке и думает, куда стремится.

            Bim-менеджеры могут получать 100 000 ₽. При этом московские инженеры-проектировщики получают 69 000 ₽ — данные Trud.com за нынешний год.

            Я — Андрей Мехонцев. Со своей командой Altec Systems помогаю строительным компаниям внедрить BIM. До этого четыре года работал bim-менеджером в одной компании. Сейчас я расскажу на примере своей истории:

            1. За что платят bim-менеджеру
            2. Почему bim-менеджеры востребованы
            3. Как стать bim-менеджером
            4. Как попасть на работу
            Читать дальше →
          • Машинное обучение на C#: введение в ML.NET



              ML.NET претендует на звание самой мощной библиотеки для машинного обучения на платформе .NET. Так ли это на самом деле? На вопрос отвечает Джефф Просайз.

              Джефф Просайз — один из создателей компании Wintellect, коллега по цеху знаменитого Джеффри Рихтера, автор более девяти книг и множества статей по разработке приложений, сейчас работает с Azure и разрабатывает различные AI-решения.

              Под катом перевод и видео доклада Джеффа с конференции DotNext 2019 Moscow в оригинале.
              Читать дальше →
            • Реализации кэша в C# .NET

              • Translation
              Привет, Хабр! В преддверии старта курса «C# ASP.NET Core разработчик», подготовили перевод интересного материала о реализации кэша в C#. Приятного прочтения.




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

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

              Кэширование отлично подходит для данных, которые изменяются нечасто. Или, в идеале, не меняются никогда. Данные, которые изменяются постоянно, например, текущее время, не должны кэшироваться, иначе вы рискуете получить неправильные результаты.
              Читать дальше →
              • +18
              • 9.7k
              • 2
            • Single sign-on для SSH своими руками

              • Translation
              TL;DR В этот статье мы установим single sign-on для SSH от Google. За кулисами мы воспользуемся OpenID Connect (OICD), краткосрочными SSH сертификатами, несколькими хитростями конфигурации SSH, и опенсорсными пакетами step-ca и step от Smallstep. Мы настроим SSH Certificate Authority и воспользуемся им, чтобы загрузить в нашей системе нового пользователя и новый хост. Этот метод привносит много преимуществ помимо single sign-on, так как отпадает нужда в сборе, передаче и контроле файлов authorized_keys, хоть и требует больше подготовительной работы по сравнению с настройкой типичной пары открытого/секретного SSH ключей.

              Как не следует пользоваться SSH


              Еще в далеком 2004 году кто-то научил меня копипастить открытый ключ в файл authorized_keys. С тех пор я продолжал невинно копировать один и тот же старый публичный ключ на каждый сервер, с которым мне приходилось работать, и у меня постоянно не получалось сделать это с первого раза, потому что я забывал корректно настраивать chmod.
              Читать дальше →
              • +24
              • 7.6k
              • 4
            • Требования к ПО на пальцах

              Пост про основы разработки требований — без сложных схем, терминов и таблиц, зато с гифками.

              image

              Если коротко, то основные этапы разработки требований — это:

              1. Зачем нам что-то делать? (нужно больше золота)
              2. Что мы будем делать? (все как у людей, но дешевле)
              3. Как мы это сделаем? (с блокчейном и датасаентистами, естественно)
              4. Когда мы это сделаем? (вчера, а отрефакторим «потом»)

              А теперь подробнее.
              Читать дальше →
            • Docker API + Portainer API = profit

              • Tutorial
              Portainer+Container

              Всем доброго времени суток! В этой статье хотел бы кратко в режиме смузи осветить возможности Portainer API и применение в разворачивании проектов.

              Рассмотрим несколько задач:

              • Управление. Иметь возможность отображать работу всех контейнеров на определенном узле, управлять и отслеживать состояние, читать логи и контролировать ресурсы.
              • Разворачивание. Минимизировать участие пользователя и создать благоприятные условия для автоматизированного разворачивания на новом месте.
              • Интеграция с gitlab-ci. Упростить процесс разработки.

              Управление


              Обладая опытом работы с Docker, переход на docker-swarm привлек относительной простотой и скоростью освоения в сравнении с Kubernetes. Для одного менеджер узла (leader node) и нескольких worker-ов предстояло решить, как отобразить в одном окне статус запуска, количество работ, статистику использования памяти и health-чеки. В первую очередь необходимо готовое решение с графическим интерфейсом исходя из потребностей задачи.

              Можно найти много статей по сравниванию между собой GUI-интерфейсов для управления Docker-ом. Приведу несколько примеров: тут и тут. Необходимые требования для решения задачи были найдены в Portainer.
              Читать дальше →
            • Вотериус: Передача показаний воды на телефон по Wi-Fi (4 года от батареек)



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

              Мой путь оказался непростым и витиеватым. Но в результате получилось устройство, передающее показания воды по Wi-Fi на телефон. Простое и понятное в использовании и настройке хоть школьнику, хоть гуманитарию пенсионеру. А знакомым со словом «Ардуино» — ещё и несложное для изготовления. Девайс способен работать от батареек четыре года (дольше, чем длились отношения с вашей бывшей). Это ещё и первый открытый проект с такими характеристиками. Заводские аналоги я выписал, их мало, да и ладно с ними.

              Итак, у нас есть немного денег и большое, но честное желание упростить себе жизнь, не нарушая Уголовный Кодекс. И чтобы никаких этих ваших 220В, серверов и кучи кнопок! Показания смотрим на смартфоне в приложении Blynk или аналогичном сервисе.

              Теперь устройтесь в кресле поудобнее, съешьте ещё этих мягких французских булочек да выпейте чаю. Смотрите красивые фотографии и слушайте мой рассказ о том, что надо учитывать при создании автономных устройств. Но сначала краткое описание Вотериуса.
              Читать дальше →
            • Неудачная статья про ускорение рефлексии

                Сразу объясню название статьи. Изначально планировалось дать хороший, надежный совет по ускорению использования рефлекшена на простом, но реалистичном примере, однако в ходе бенчмаркинга выяснилось, что рефлексия работает не так медленно, как я думал, LINQ работает медленнее, чем снилось в кошмарах. А в итоге оказалось, что мной еще и была допущена ошибка в замерах… Подробности этой жизненной истории под катом и в комментариях. Так как пример достаточно бытовой и реализованный в принципе как обычно делается в энтерпрайзе, получилось достаточно интересная, как мне кажется, демонстрация жизни: влияния на скорость работы основного предмета статьи было не заметно из-за внешней логики: Moq, Autofac, EF Core и прочей «обвязки».
                Читать дальше →