• Моё разочарование в софте

    • Translation

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


    Я занимаюсь программированием уже 15 лет. Но в последнее время при разработке не принято думать об эффективности, простоте и совершенстве: вплоть до того, что мне становится грустно за свою карьеру и за IT-отрасль в целом.

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

    Только в программном обеспечении считается нормальным, если программа работает на уровне 1% или даже 0,01% от возможной производительности. Ни у кого вроде нет возражений.
    Читать дальше →
  • Как создать процедуральный арт менее чем за 100 строк кода

    • Translation


    Generative art (генеративное или процедуральное искусство) может отпугнуть, если вы никогда с ним раньше не сталкивались. Если коротко, то это концепция искусства, которое буквально создает само себя и не требует хардкорных знаний программирования для первого раза. Поэтому я решил немного разбавить нашу ленту, погнали.
    Читать дальше →
  • Пульт дистанционного управления из смартфона

      В двух предыдущих статьях я рассказал об использовании смартфона для управления игрушечным автомобилем, как непосредственно голосом, так и с использованием другого смартфона по блютус. Но управление было примитивным — отдавалась команда, автомобиль выполнял команду, останавливался и ждал следующей команды. Это было связано с большой скоростью движения автомобиля для комнатных условий (приблизительно 1,2 м/с), а так же с продолжительным временем отдания команды и невозможностью оперативно вмешиваться в движение, используя меню. Даже штатный пульт ДУ не давал возможности управления. В новой версии ДУ с графическим интерфейсом я решил применить ШИМ для регулировки скорости и имитировать управление рулем.



      На картинке показана машинка, которой управляет смартфон, и ниже смартфон с работающей программой дистанционного управления по блютус.
      Читать дальше →
    • Как я стандартную библиотеку C++11 писал или почему boost такой страшный. Глава 4.2

        Продолжаем приключения.

        Краткое содержание предыдущих частей


        Из-за ограничений на возможность использовать компиляторы C++ 11 и от безальтернативности boost'у возникло желание написать свою реализацию стандартной библиотеки C++ 11 поверх поставляемой с компилятором библиотеки C++ 98 / C++ 03.

        Были реализованы static_assert, noexcept, countof, а так же, после рассмотрения всех нестандартных дефайнов и особенностей компиляторов, появилась информация о функциональности, которая поддерживается текущим компилятором. Включена своя реализация nullptr, которая подбирается на этапе компиляции.

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

        Ссылка на GitHub с результатом на сегодня для нетерпеливых и нечитателей:

        Коммиты и конструктивная критика приветствуются

        Продолжение погружения в мир «шаблонной магии» C++.
        Читать дальше →
      • Обзор градиентных методов в задачах математической оптимизации

        Предисловие


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



        Читать дальше →
      • Как не пропустить ни одного сообщения

        • Translation
        Обработка событий — одна из самых распространенных задач в области бессерверных технологий. Сегодня расскажем о том, как создать надежный обработчик сообщений, который сведет к нулю их потерю. Кстати, примеры написаны на C# с использованием библиотеки Polly, но показанные подходы будут работать с любыми языками (если не указано обратное).

        Читать дальше →
      • ReactiveValidation: валидация данных в WPF

        Здравствуй, Хабр!

        Мне хотелось бы рассказать об Open Source библиотеке для WPF — ReactiveValidation, в процессе написания которой я пытался ориентироваться на FluentValidation и Reactive UI. Её задача — это валидация формы каждый раз, когда пользователь изменил данные внутри неё.


        Пример работы с библиотекой. Хорошая новость — шаблон можно использовать свой

        Основные фичи библиотеки:

        • Правила создаются через fluent-интерфейс
        • Полный внутренний контроль над изменением свойств
        • Поддержка локализации (в том числе «на лету»)
        • Отображение сообщений в GUI
        Читать дальше →
        • +15
        • 6.5k
        • 4
      • Используем Apple Pay и карту Тройка в качестве пропуска на работу

          Используем Apple Pay, Android Pay, Mastercard Paypass, Visa PayWave и карту Тройка в качестве пропуска на работу

          TL;DR В статье описывается процесс создания системы контроля доступа (СКУД), в которой в качестве идентификатора могут использоваться карты Тройка, любые бесконтактные банковские карты EMV, а также телефоны с Apple Pay и Android Pay. Управление системой происходит через Telegram-бота.

          Основные задачи системы


          • Избавиться от лишних карт — в качестве идентификатора используется то, что уже есть у пользователя: транспортная карта, телефон или банковская карта. Какой идентификатор использовать — каждый выбирает сам. Система работает со всеми типами идентификаторов одновременно.
          • Избавиться от бюро пропусков и сложных программ управления — нам надоело выдавать и забирать карты у пользователей, держать отдельные компьютеры для управления пропусками, изучать переусложненные программы.
          • Управление через Telegram — заведение и удаления пользователей происходит удаленно и не требует компьютера.
          Читать дальше →
        • REST API Best Practices

          Привет, Хабр! Представляю вашему вниманию перевод статьи "REST API Best Practices" автора Krishna Srinivasan.

          REST становится общим подходом для представления сервисов окружающему миру. Причина его популярности заключается в его простоте, легкости использования, доступе через HTTP и другие. Существует неправильное представление о том, что все данные, доступные через сеть, считаются REST, но это не так. В этой статье я собираюсь объяснить вам некоторые best practices, которые вы должны всегда помнить при реализации собственного REST приложения. Я бы хотел услышать ваш опыт в REST приложениях, поэтому если вы знаете best practies, которые не упомянуты в этой статье, пожалуйста, поделитесь с нами в комментариях.

          Disclamer: все best practies основаны на моем личном опыте. Если вы имеете другое мнение, не стесняйтесь отправлять его мне на email, и мы обсудим его.

          Здесь представлен список best practices, которые будут обсуждаться в этой статье:

          1. Конечные точки в URL – имя существительное, не глагол
          2. Множественное число
          3. Документация
          4. Версия вашего приложения
          5. Пагинация
          6. Использование SSL
          7. HTTP методы
          8. Эффективное использование кодов ответов HTTP
          Читать далее
        • Своя змейка, или пишем первый проект. Часть 0

          Предисловие


          Привет Хабр! Меня зовут Евгений «Nage», и я начал заниматься программированием около года назад, в свободное от работы время. Просмотрев множество различных туториалов по программированию задаешься вопросом «а что же делать дальше?», ведь в основном все рассказывают про самые основы и дальше как правило не заходят. Вот после продолжительного времени за просмотром разных роликов про одно и тоже я решил что стоит двигаться дальше, и браться за первый проект. И так, сейчас мы разберем как можно написать игру «Змейка» в консоли со своими начальными знаниями.

          Глава 1. Итак, с чего начнем?


          Для начала нам ничего лишнего не понадобится, только блокнот (или ваш любимый редактор), и компилятор C#, он присутствует по умолчанию в Windows, находится он в С:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe. Можно использовать компилятор последней версии который поставляется с visual studio, он находится Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\csc.exe.

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

          @echo off
          :Start
          set /p name= Enter program name: 
          echo.
          С:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe "%name%.cs"
          echo.
          goto Start

          "@echo off" отключает отображение команд в консоли. С помощью команды goto получаем бесконечный цикл. Задаем переменную name, а с модификатором /p в переменную записывается значение введенное пользователем в консоль. «echo.» просто оставляет пустую строчку в консоли. Далее вызываем компилятор и передаем ему файл нашего кода, который он скомпилирует.

          Таким способом мы можем скомпилировать только один файл, поэтому мы будем писать все классы в одном документе (я не разобрался еще как компилировать несколько файлов в один .exe через консоль, да и это не тема нашей статьи, может кто нибудь расскажет в комментариях).
          Читать дальше →
        • Можно ли использовать С++ вместо Си для небольших проектов в микроконтроллерах

            Существует мнение, что использование С++ при разработке программного обеспечения для микроконтроллеров это как стрельба из пушки по воробьям. Мол код получается большого размера и неповоротливый, а мы привыкли бороться за каждый бит в ОЗУ или ПЗУ. И программное обеспечение для микроконтроллера может быть написано обязательно на Си. Действительно, ведь язык Си был задуман как альтернатива ассемблеру, код должен был быть такой же компактный и быстрый, а читаемость и удобство разработки позволять легко писать довольно большие программы. Но ведь когда-то и разработчики на ассемблере говорили тоже самое про Си, с тех пор утекло много воды и программистов, использующих только ассемблер, можно по пальцам пересчитать. Конечно, ассемблер еще играет важную роль в разработке кода для быстрых параллельных вычислений, написании ОСРВ, но это скорее исключение из правил. Так же как когда-то Си пробивал себе дорогу в качестве стандарта для встроенного ПО, так и язык С++ уже вполне может заменить Си в этой области. С++ стандарта С++14 и современные компиляторы имеют достаточно средств для того чтобы создавать компактный код и не уступать по эффективности коду, созданному на Си, а благодаря нововведениям быть понятнее и надежнее. Ниже приведен код поиска наименьшего числа в массиве из 5 целых чисел на двух языках Си и С++ на компиляторе IAR for ARM 8.20 с отключенной оптимизацией.
            Читать дальше →
          • Создание языка программирования с использованием LLVM. Часть 8: Компиляция в объектный код

            • Translation
            • Tutorial
            Оглавление:
            Часть 1: Введение и лексический анализ
            Часть 2: Реализация парсера и AST
            Часть 3: Генерация кода LLVM IR
            Часть 4: Добавление JIT и поддержки оптимизатора
            Часть 5: Расширение языка: Поток управления
            Часть 6: Расширение языка: Операторы, определяемые пользователем
            Часть 7: Расширение языка: Изменяемые переменные
            Часть 8: Компиляция в объектный код
            Часть 9: Добавляем отладочную информацию
            Часть 10: Заключение и другие вкусности LLVM



            8.1. Введение


            Добро пожаловать в главу 8 руководства “Создание языка программирования с использованием LLVM”. Эта глава описывает, как компилировать программы на нашем языке в объектные файлы.
            Читать дальше →
          • Пишем расширения для PHP 7 на C++

            Мне приходилось писать расширения для того, чтобы воспользоваться функциями C++ библиотек в коде PHP. Ещё, одно тяжёлое расширение портировал с 5й версии на 7ю.

            Если загуглить документацию на тему написания расширений для PHP, то, в основном, это будут тексты до 2014 года, актуальные для версии 5. Сам сайт php.net предоставляет обрывчатые и устаревшие сведения, а то, что удаётся найти в их wiki, опять про 5ю версию. Максимум, что удалось найти на офф сайте, это скудный ман по миграции уже написанных расширений.

            В итоге, единственным более или менее понятным маном по написанию расширений для меня оказался исходный код PHP, которым я и руководствовался при написании и миграции расширений.
            Читать дальше →
            • +40
            • 17.1k
            • 7
          • Защищаем сайт с помощью ZIP-бомб

            • Translation

            Старые методы по-прежнему работают


            [Обновление] Теперь я в каком-то списке спецслужб, потому что написал статью про некий вид «бомбы», так?

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

            Когда я в возрасте 13 лет впервые захостил свою маленькую Linux-коробочку с доступом по SSH, я смотрел логи и каждый день видел IP-адреса (в основном, из Китая и России), которые пытались подключиться к моей сладенькой маленькой коробочке (которая на самом деле была старым ноутом ThinkPad T21 со сломанным дисплеем, жужжавшим под кроватью). Я сообщал эти IP их провайдерам.

            На самом деле если у вас Linux-сервер с открытым SSH, то можете сами посмотреть, сколько попыток подключений происходит ежедневно:

            grep 'authentication failures' /var/log/auth.log
            Читать дальше →
          • Ускоряем std::shared_mutex в 10 раз

              В этой статье мы детально разберем атомарные операции и барьеры памяти C++11 и генерируемые ими ассемблерные инструкции на процессорах x86_64.

              Далее мы покажем как ускорить работу contfree_safe_ptr<std::map> до уровня сложных и оптимизированных lock-free структур данных аналогичных по функциональности std::map<>, например: SkipListMap и BronsonAVLTreeMap из библиотеки libCDS (Concurrent Data Structures library): github.com/khizmax/libcds

              И такую многопоточную производительность мы сможем получить для любого вашего изначально потоко-небезопасного класса T используемого как contfree_safe_ptr<T>. Нас интересуют оптимизации повышающие производительность на ~1000%, поэтому мы не будем уделять внимание слабым и сомнительным оптимизациям.
              Читать дальше →
            • Видеозаписи лучших докладов DotNext 2016 Moscow: Перфоманс, CLR и функциональное программирование на .NET

                Если у вас еще нет планов на выходные – у меня есть предложение: посмотрите доклады с DotNext 2016 Moscow, вчера мы выложили их в общий доступ.

                Вообще, мой любимый формат поста про конференции – обзор лучших докладов. Жаль, делать его получается только один раз на конференцию… В любом случае, сегодня у нас есть о чем поговорить: мы открыли доступ к видеозаписям лучших докладов конференции DotNext 2016 Moscow и близимся к завершению программы DotNext 2017 Piter (Питер, 19-20 мая), о которой тоже скажу пару слов.



                Все видео под катом.
                Читать дальше →
                • +29
                • 12.6k
                • 1
              • Project Centennial: мост из Win32 и .NET к Windows Store и UWP

                  Пару конференций назад мы объявили о том, что мы планируем строить разнообразные мосты для упрощения задач разработчиков по переносу в Windows Store приложения для разных платформ, включая Windows. У каждого из объявленных тогда мостов сложилась своя судьба, а один из самых ожидаемых — Project Centennial или Desktop Bridge — не так давно стал доступен всем разработчикам, упрощая перенос Win32/.NET приложений в Windows Store, о котором и пойдёт речь внутри.

                  Если вы хотите пообщаться на эту тему со мной лично, приходите 20 марта на практическое мероприятие.


                  Читать дальше →
                • Web PUSH Notifications быстро и просто

                  • Tutorial

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


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


                  Web PUSH Notifications


                  Я думаю, вы уже знаете что такое push-уведомления, но я всё же напишу коротко о главном.


                  Пользователь, заходя на сайт, вытягивает (pull) с него данные. Это удобно и безопасно, но с развитием интернет ресурсов, появилась необходимость оперативно доставлять информацию пользователям не дожидаясь пока те сами сделают запрос. Так и появилась технология принудительной доставки (push) данных с сервера клиенту.

                  Читать дальше →
                • Как Discord хранит миллиарды сообщений

                  • Translation


                  Discord продолжает расти быстрее, чем мы ожидали, как и пользовательский контент. Чем больше пользователей — тем больше сообщений в чате. В июле мы объявили о 40 млн сообщений в день, в декабре объявили о 100 млн, а в середине января преодолели 120 млн. Мы сразу решили хранить историю чатов вечно, так что пользователи могут вернуться в любой момент и получить доступ к своим данным с любого устройства. Это много данных, поток и объём которых нарастает, и все они должны быть доступными. Как мы это делаем? Cassandra!
                  Читать дальше →