• В двух словах: Лучшие практики Async/Await в .NET

    • Translation
    В преддверии старта курса «Разработчик C#» подготовили перевод интересного материала.




    Async/Await — Введение


    Языковая конструкция Async/Await существует со времен C# версии 5.0 (2012) и быстро стала одним из столпов современного программирования на .NET — любой уважающий себя C# разработчик, должен использовать ее для повышения производительности приложений, общей отзывчивости и разборчивости кода.

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

    Ну что ж, давайте углубимся в тему.
    Читать дальше →
  • Разбор квалификации чемпионата по программированию среди бэкенд-разработчиков

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


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



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


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

      Читать дальше →
      • +33
      • 24.7k
      • 7
    • Оптимизация производительности .NET (C#) приложений

        image

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

          Провайдеры Российской Федерации, в большинстве своем, применяют системы глубокого анализа трафика (DPI, Deep Packet Inspection) для блокировки сайтов, внесенных в реестр запрещенных. Не существует единого стандарта на DPI, есть большое количество реализации от разных поставщиков DPI-решений, отличающихся по типу подключения и типу работы.

          Существует два распространенных типа подключения DPI: пассивный и активный.

          Пассивный DPI

          Пассивный DPI — DPI, подключенный в провайдерскую сеть параллельно (не в разрез) либо через пассивный оптический сплиттер, либо с использованием зеркалирования исходящего от пользователей трафика. Такое подключение не замедляет скорость работы сети провайдера в случае недостаточной производительности DPI, из-за чего применяется у крупных провайдеров. DPI с таким типом подключения технически может только выявлять попытку запроса запрещенного контента, но не пресекать ее. Чтобы обойти это ограничение и заблокировать доступ на запрещенный сайт, DPI отправляет пользователю, запрашивающему заблокированный URL, специально сформированный HTTP-пакет с перенаправлением на страницу-заглушку провайдера, словно такой ответ прислал сам запрашиваемый ресурс (подделывается IP-адрес отправителя и TCP sequence). Из-за того, что DPI физически расположен ближе к пользователю, чем запрашиваемый сайт, подделанный ответ доходит до устройства пользователя быстрее, чем настоящий ответ от сайта.
          Читать дальше →
        • OpenSSL, ssl_ciphers и nginx: прокачиваем на 100%

          • Tutorial


          Много где написано о том, как получить 100% и A+ по тесту от Qualys. При всём при том практически везде директивы ssl_ciphers и подобные даются как эдакие магические строки, которые нужно просто вставить, и надеяться, что автор не подводит вас под монастырь. Эта статья призвана исправить это недоразумение. По прочтению этой статьи директива ssl_ciphers потеряет для вас всякую магию, а ECDHE и AES будут как друзья да братья.


          Также вы узнаете почему 100% по тестам — не всегда хорошо в реальности.

          Читать дальше →
        • Магия SSH

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

            Оглавление:

            1) Local TCP forwarding
            2) Remote TCP forwarding
            3) TCP forwarding chain через несколько узлов
            4) TCP forwarding ssh-соединения
            5) SSH VPN Tunnel
            6) Коротко о беспарольном доступе
            7) Спасибо (ссылки)
            Читать дальше →
          • Лекции Технотрека. Администрирование Linux


              Представляем вашему вниманию очередную порцию лекций Технотрека. В рамках курса будут рассмотрены основы системного администрирования интернет-сервисов, обеспечения их отказоустойчивости, производительности и безопасности, а также особенности устройства ОС Linux, наиболее широко применяемой в подобных проектах. В качестве примера будут использоваться дистрибутивы семейства RHEL 7 (CentOS 7), веб-сервер nginx, СУБД MySQL, системы резервного копирования bacula, системы мониторинга Zabbix, системы виртуализации oVirt, балансировщика нагрузки на базе ipvs+keepalived. Курс ведёт Сергей Клочков, системный администратор в компании Variti.

              Читать дальше →
              • +59
              • 90.7k
              • 9
            • [Конспект админа] Домены, адреса и Windows: смешивать, но не взбалтывать


                В очередном «конспекте админа» остановимся на еще одной фундаментальной вещи – механизме разрешения имен в IP-сетях. Кстати, знаете почему в доменной сети nslookup на все запросы может отвечать одним адресом? И это при том, что сайты исправно открываются. Если задумались – добро пожаловать под кат.

                Освежим базу
              • Интересные вопросы на знание C# и механизмов .NET

                  Предлагаю Вам ряд вопросов по C# и .NET в целом, которые могут пригодиться для проведения собеседования или просто помогут лучше понять, как работает платформа .NET. Здесь не будет обычных вопросов о том, чем отличаются ссылочные типы от значимых и тп. Я постарался выбрать самые интересные, над которыми стоит задуматься.
                  Читать дальше →
                • Расширение, изменение и создание элементов управления на платформе UWP. Часть 1



                    В 2006 году вместе с .NET 3.0 разработчикам были предоставлены программные платформы WPF и Silverlight. На протяжении следующих десяти лет Microsoft выпускала новые версии своей операционной системы и соответствующие им платформы. И вот, в 2016 году вместе с Windows 10 была выпущена Universal Windows Platform.

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

                    Эти задачи обусловлены тем, что на любой платформе разработчик располагает ограниченным набором элементов управления необходимых для разработки приложений. Его инструментарий составляют элементы из поставки Microsoft (в случае с UWP — Windows Universal Platform SDK) и от сторонних поставщиков или разработчиков. Даже все вместе они не могут покрыть всех требований, которые появляются при разработке приложений. Имеющиеся элементы управления могут не устраивать по ряду причин: внешний вид, поведение или функционирование. К сожалению, по сей день нет единого источника информации, который подробно и доступно освещал бы решения данных задач. Все, что остается разработчикам на протяжении длительного времени — собирать информацию в интернете крупица за крупицей.

                    Целью данной серии из трех статей является систематизация способов изменения, расширения и создания новых элементов управления.
                    Читать дальше →
                  • Заглянем внутрь GPU-чипа от Apple собственной разработки, используемого в iPhone

                    • Translation


                    Для самых первых моделей продуктов Apple, iPhone и iPad, компания лицензировала и использовала для вывода графики чип PowerVR GPU от Imagination Technologies. Apple даже приобрела около 10% компании Imagination и является её крупнейшим клиентом, принося около 30% дохода. И так же, как Apple начинала с использования по лицензии ARM CPU, а теперь пользуется собственными разработками, она, судя по всему, перешла от использования PowerVR к разработке собственного GPU. Впервые он появился в процессоре A8, использующемся в iPhone 6, а его потомки находятся в A9 и A10 Fusion, используемых в iPhone 6S и 7.

                    Современный GPU, такой, какие находятся внутри iPhone и iPad, обладают тремя основными компонентами, от которых требуется слаженная работа для демонстрации картинки. Первый – железо, обеспечивающее графику с фиксированными функциями, отвечающее за обработку команд API, растеризацию треугольников и растровый вывод. Второй – шейдерное ядро, сердце GPU, выполняющее программные шейдеры (вертексы, геометрия, пиксели и вычисление шейдеров). Последний – программный; графический драйвер, работающий на CPU и объединяющий все функции, управляющий работой GPU. Драйвер преобразовывает графические приложения, написанные на Metal или OpenGL ES API в набор команд для железа с фиксированными функциями и в программируемые шейдеры, работающие в шейдерных ядрах. Один из важнейших компонентов драйвера – компилятор, создающий машинный код для работы на шейдерных ядрах.
                    Читать дальше →
                  • Установка Rust на Windows

                    • Translation
                    Вы можете установить Rust, просто скачав инсталлятор и дважды кликнув по нему. Хотя разработчикам, имеющим дело с более сложными инструментами, или тем, кому нужно собирать "небезопасные" (unsafe) C/C++ библиотеки из исходников, предстоит сделать немного больше. Тем не менее, если проявить немного упорства, разобраться в этом вполне реально.

                    Во время всего этого процесса следите за тем, что вы устанавливаете правильную версию библиотек: в данный момент для MSVC доступна только 64-битная версия Rust. Вы будете то и дело получать странные ошибки, если попробуете использовать 32-битные библиотеки. Поверьте мне.

                    Повторюсь: если вам нужен компилятор Rust, идите на официальный сайт и жмите "Install". Если же вы планируете работать с нативными C/C++ библиотеками, читайте дальше!
                    Читать дальше →
                    • +8
                    • 17.4k
                    • 7
                  • Open-source реализации отечественных криптоГОСТов

                      На выходных решил поискать open-source реализации отечественных криптографических стандартов. Прежде всего интересовали новые: хэш-функция Стрибог (ГОСТ Р 34.11-2012), Кузнечик (ГОСТ Р 34.12-2015) и ЭЦП (ГОСТ Р 34.10-2012 или 2001 (без 512-бит) ). Старый ГОСТ 28147-89 специально не искал, поскольку найти его реализацию никаких проблем нет уже давно.
                      Итак, давайте посмотрим, что же получилось. Сразу предупреждаю, что корректность реализаций не проверял.
                      Читать дальше →
                    • Ограничение доступа в интернет для приложений в Linux

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

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

                        Шаг 1. Создаём группу-маркер и добавляем себя в неё


                        Создаём группу (В нашем случае группа будет называться noinet):
                        sudo groupadd noinet

                        Добавляем в неё текущего пользователя:
                        sudo gpasswd -a `id -un` noinet
                        Читать дальше →
                      • Прокачка debian/ubuntu сервера для маленьких

                        Всем привет. Недавно появилась необходимость поднятие VPS на debian 7 за скромные деньги.
                        О плясках с бубенчиком я бы хотел описать тут в подробностях.
                        Всё в этом посте было собрано на просторах интернета, доработано, разжевано и скинуто в одну статью.


                        Выбор пал на https://account.nt-vps.ru/register/ из-за низких цен и неплохой стабильности за эти деньги(правда 2 дня были серьезные проблемы с сетью). Был взят VPS за 5 рублей в сутки(или за 150р в месяц) с небольшими конфигурациями ОЗУ 128mb и 10Гб на диске.

                        В автоматическом режиме был установлен Debian 7.0 x86-64 Wheezy и VPS была готова к работе.
                        64 битная сиcтема была выбрана лишь для моих личных нужд, а вам же советую, на этом VPS, ставить x86.

                        Далее
                      • PowerShell Remoting — настройка и удаленное управление

                        • Tutorial
                        Здесь минимум теории, в основном практическая часть. Описывается как настроить WinRM, как изменить профиль сетевого адаптера, дается скрипт по добавлению в TrustedHosts с фильтрацией, объясняется зачем нужны доверенные хосты, и рассматриваются поверхностно удаленные подключения так чтобы можно было сесть и сразу админить удаленные машины.

                        Наиболее простой путь сконфигурировать удаленное управление это выполнить Enable-PSRemoting в оболочке powershell с правами администратора. При этом произойдет следущее:
                        • запустится служба WinRM (если запущена перезапустится)
                        • служба WinRM перейдет в состояние — автоматический запуск при старте
                        • будет создан прослушиватель WinRM для HTTP трафика на порту 5985 для всех локальных IP адресов
                        • будет создано правило файрвола для прослушивателя WinRM. Внимание, этот пункт завершится с ошибкой если любая из сетевых карточек имеет тип сети «публичная», т.к. открывать порт на такой карточке не хорошо. Если у вас при конфигурировании вышла такая ошибка измените профиль это сетевушки командлетом Set-NetConnectionProfile и после этого запустите Enable-PSRemoting снова. Если вам нужна сетевая карточка с профилем «Публичная сеть» запустите Enable-PSRemoting с параметром -SkipNetworkProfileCheck в этом случае будут созданы правила файрвола только из локальной сети.

                        Читать дальше →
                      • Скрипт для тех, кому лень разбираться в Linux

                        Сфер применения Linux может быть очень много. Особенно, когда арендовать VPS стало можно от $1 в месяц. Кроме стандартного использования под хостинг сайтов, его используют в качестве сервера для игр (CS:GO, Terraria, Minecraft), в качестве Proxy-сервера и VPN-сервера. Под майнинг криптовалют. Под резервное хранилище бэкапов. Под домашнюю торренто-качалку. А также для тестирования, разработки и просто различных экспериментов. Именно доступность VPS на базе Linux с огромным спектром возможного его применения привела к популяризации Linux. Но желающих использовать Linux значительно больше, чем людей, которые умеют его использовать. И часто именно слабые познания администрирования Linux останавливают людей от его использования. Ну или просто усложняют таким людям жизнь — им приходится часами ковыряться в мануалах, форумах и «статьях для новичков».

                        Да мне и самому надоело лазить по специализированным форумам, каждый раз, когда приходится сделать шаг влево или шаг вправо относительно того, что я уже научился делать. Именно поэтому, со временем, все типовые вещи я свёл в один скрипт с дружелюбным интерфейсом, который умеет делать всё сам. Начиналась всё с малого. Скрипт просто автоматизировал установку нужного мне софта. Но за полгода он превратился уже в весьма серьёзную утилиту весом более 100 Кб, в которой около 2,5 тысяч строк кода. Скрипт ранее нигде не выкладывался. Использовался только в личных целях мной и несколькими моими товарищами. Пришло время им поделиться с публикой. Уверен, многим людям он способен сэкономить кучу времени.

                        Чтобы понять, что он умеет, проще всего глянуть на заглавный скриншот:


                        Далее подробнее опишу, что и как он делает.
                        Читать дальше →
                      • Повышаем безопасность закрытых ssh-ключей

                        • Translation
                        Вы когда-нибудь интересовались механизмом работы ssh-ключей? Или тем, насколько безопасно они хранятся?

                        Я использую ssh каждый день много раз — когда запускаю git fetch или git push, когда развертываю код или логинюсь на сервере. Не так давно я осознал, что для меня ssh стал магией, которой я привык пользоваться без понимация принципов ее работы. Мне это не сильно понравилось — я люблю разбираться в инструментах, которые использую. Поэтому я провел небольшое исследование и делюсь с вами результатами.

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

                        Итак, если вам доводилось прибегать к аутентификации по ключу, то у вас, скорее всего, есть файл ~/.ssh/id_rsa или ~/.ssh/id_dsa в домашнем каталоге. Это закрытый (он же приватный) RSA/DSA ключ, а ~/.ssh/id_rsa.pub или ~/.ssh/id_dsa.pub — открытый (он же публичный) ключ. На сервере, на котором вы хотите залогиниться, должна быть копия открытого ключа в ~/.ssh/authorized_keys. Когда вы пытаетесь залогиниться, ssh-клиент подтвержает, что у вас есть закрытый ключ, используя цифровую подпись; сервер проверяет, что подпись действительна и в ~/.ssh/authorized_keys есть открытый ключ, и вы получаете доступ.

                        Что же хранится внутри закрытого ключа?

                        Читать дальше →
                      • Установка любого программного обеспечения средствами WSUS

                        • Tutorial
                        В своей предыдущей статье про создание msi-пакетов я описал способ как запаковать любое приложение в msi. MSI-пакеты я использовал для развертывания приложений через GPO, но к сожалению данный метод меня крайне разочаровал по нескольким причинам: установка только при загрузке компьютера, т.е. пользователю приходится дожидаться окончания установки, а иногда требуется побыстрее начать работу. Из этого вытекает, что некоторые не дожидаются и грубо перезагружают компьютер, результатом чего является недоустановленное ПО. Мне все это надоело и я вспомнил, что где-то читал про установку сторонних обновлений через WSUS. Действительно, способ относительно не новый и осуществляется с помощью Local Update Publisher, про установку которого есть достаточно полная статья. Особенностью данного метода развертывания ПО помимо всех преимуществ WSUS является возможность установки из exe и нет необходимости перепаковки в msi. И если с публикацией msi все понятно, то я хочу рассказать про установку через exe, в которой есть особенности.
                        Читать дальше →
                        • +7
                        • 85.2k
                        • 6
                      • Памятка пользователям ssh

                          abstract: В статье описаны продвинутые функций OpenSSH, которые позволяют сильно упростить жизнь системным администраторам и программистам, которые не боятся шелла. В отличие от большинства руководств, которые кроме ключей и -L/D/R опций ничего не описывают, я попытался собрать все интересные фичи и удобства, которые с собой несёт ssh.

                          Предупреждение: пост очень объёмный, но для удобства использования я решил не резать его на части.

                          Оглавление:
                          • управление ключами
                          • копирование файлов через ssh
                          • Проброс потоков ввода/вывода
                          • Монтирование удалённой FS через ssh
                          • Удалённое исполнение кода
                          • Алиасы и опции для подключений в .ssh/config
                          • Опции по-умолчанию
                          • Проброс X-сервера
                          • ssh в качестве socks-proxy
                          • Проброс портов — прямой и обратный
                          • Реверс-сокс-прокси
                          • туннелирование L2/L3 трафика
                          • Проброс агента авторизации
                          • Туннелирование ssh через ssh сквозь недоверенный сервер (с большой вероятностью вы этого не знаете)
                          Читать дальше →