• Пополняем шпаргалки по C++: неявно-генерируемые перемещающий конструктор и оператор присваивания

    • Tutorial
    Когда не так часто, как хотелось бы, приходится работать с языком, некоторые аспекты забываются. А некоторые никогда и не откладываются в голове. Поэтому, когда возникают вопросы, приходится отвлекаться и лезть в документацию.

    Чтобы сэкономить время в последующем, а также, чтобы лучше понять в ходе обучения, крайне помогает вести конспекты и делать наглядные шпаргалки. Шпаргалку можно повесить рядом на стену. Хороши шпаргалки в виде блок-схем, по которым можно легко, по шагам, получить нужный результат (например выбрать правильный контейнер).

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

    Читать дальше →
  • Неопределённое поведение и теорема Ферма

      В соответствии со стандартами C и C++, если выполнение программы приводит к переполнению знаковой целой переменной, или к любому из сотен других «неопределённых действий» (undefined behaviour, UB), то результат выполнения программы может быть любым: она может запостить на Твиттер непристойности, может отформатировать вам диск…
      Увы, в действительности «пасхальные яйца», которые бы заставляли программу в случае UB делать что-то из ряда вон выходящее, не встречались со времён GCC 1.17 — та запускала nethack, когда встречала в коде программы неизвестные #pragma. Обычно же результат UB намного скучнее: компилятор просто оптимизирует код для тех случаев, когда UB не происходит, не придавая ни малейшего значения тому, что этот код будет делать в случае UB — ведь стандарт разрешает сделать в этом случае что угодно!
      В качестве иллюстрации того, как изобилие UB в стандарте позволяет компилятору выполнять неочевидные оптимизации, Реймонд Чен приводит такой пример кода:

      int table[4];
      bool exists_in_table(int v)
      {
          for (int i = 0; i <= 4; i++) {
              if (table[i] == v) return true;
          }
          return false;
      }
      

      В условии цикла мы ошиблись на единицу, поставив <= вместо <. В итоге exists_in_table() либо должна вернуть true на одной из первых четырёх итераций, либо она прочтёт table[4], что является UB, и в этом случае exists_in_table() может сделать всё что угодно — в том числе, вернуть true! В полном соответствии со стандартом, компилятор может соптимизировать код exists_in_table() до
      int table[4];
      bool exists_in_table(int v)
      {
          return true;
      }
      

      Такие оптимизации иногда застают программистов врасплох.
      Читать дальше →
    • Шпаргалка по HTTP-библиотекам для С++

      • Tutorial
      К сожалению, в стандартной библиотеке языка С++ нет никаких средств для работы с протоколом HTTP. Возможно, в будущем появятся, но на данный момент каждый раз при необходимости дёрнуть какой-нибудь REST-сервис, пропарсить веб-страничку, написать простенького бота или краулера приходится задаваться вопросами «А какую же библиотеку взять, так чтобы побыстрее и попроще?». Иногда проект уже использует какой-то фреймворк (а иногда даже несколько) и тогда приходится вспоминать «А как же сделать HTTP-запрос имеющимися средствами?». Чтобы не путаться я решил написать для себя шпаргалку с примерами HTTP-запросов на С++ с применением разных библиотек. А самое удобное место для хранения подобных шпаргалок — Хабр: и сам не потеряешь, и другим может пригодиться.

      Будут рассмотрены:
      • WinInet
      • WinHttp
      • Casablanca
      • Qt
      • POCO
      • wxWidgets
      • Boost.Asio
      • libcurl
      • neon
      • .NET (С++/CLI)
      • IXMLHTTPRequest
      • HappyHttp
      • cpp-netlib


      Читать дальше →
    • Сайт на с++ (CppCMS). Часть 1

      Здравствуй уважаемый %username%.
      Сегодня я хотел бы поделиться с тобой личным опытом в создании Web сайта на CppCMS (библиотека-шаблонизатор на с++). Можно назвать это «помощью начинающему программисту на CppCMS».

      Зачем писать сайт на с++


      Доводы за и против такого решения могут быть весьма разнообразны и, что бы не спровоцировать войну «языковых школ», я проведу аналогию с автомобилями: «Я купил этот. Нравится. Езжу. Продавать не хочу!».
      Из дополнительных аргументов будет то, что данный язык является профильным для моего рабочего места.
      Читать дальше →
    • Работа с регистрами внешних устройств в языке C, часть 2

      • Tutorial
      Наступила полночь и Шехрезада продолжила позволенные речи

      Для начала замечание к предыдущей статье — я там позволили себе неуважительно высказаться по поводу ASSERT — поясню свою позицию. Мне не очень нравится. что проверка в ASSERT проводится только на этапе исполнения, проверка на этапе компиляции эффективнее. Мне в личку сообщили о существовании конструкции, позволяющей сделать необходимые проверки именно на этапе компиляции (я проверил — действительно работает), думаю, что пост на эту тему скоро появится в песочнице.
      Итак, мы продолжаем…
      Как было сказано выше, регистры внешних устройств характеризуются расположением в адресном пространстве (тут мы уже определились) и составом управляющих элементов. Дело в том что многие управляющие элементы недостаточно велики для того, чтобы занять целое слово конкретного МК и, чтобы сэкономить адресное пространство, несколько управляющих элементов могут быть упакованы в один регистр. Такое решение позволяет также в определенных условиях несколько увеличить скорость работы программ, взаимодействующих с данным внешним устройством, потому и встречается весьма часто. В то же время данное решение вызывает определенные проблемы в отношении языка программирования, о которых мы и поговорим.
      Читать дальше →
    • Никто не умеет обрабатывать ошибки

        Из одной книги в другую, из статьи в статью кочует мнение о том, что выражение

        try {
           //do something
        }
        catch(Exception ex) {
        }
        

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

        В процессе работы над хеш-таблицей возник обычный вопрос: какую из известных хеш-функций использовать. Образцов таких функций в сети множество, есть и «любимчики», использовавшиеся ранее и показавшие неплохой результат, в основном оценивавшийся «на глаз» — длины цепочек в хеш-таблице на боевых данных «примерно равны», значит, все работает так, как нужно; отдельные выбросы… ну что ж, ну выбросы, бывает.
        Читать дальше →
      • Опыт применения ЕСПД

        Введение


        Основная задача этого текста — рассказать, что такое Единая система программной документации (ЕСПД) и как эти стандарты применять на практике. Начну с рассказа о том, какие бывают стандарты, и закончу опытом применения каждого из ЕСПДшных стандартов в отдельности.
        Читать дальше →
      • Как правильно лгать с помощью статистики


          Существуют три вида лжи: ложь, наглая ложь и статистика (источник)

          Есть такой замечательный жанр — "вредные советы", в котором детям дают советы, а дети, как известно, всё делают наоборот и получается всё как раз правильно. Может быть и со всем остальным так получится?

          Статистика, инфографика, big data, анализ данных и data science — этим сейчас кто только не занят. Все знают как правильно всем этим заниматься, осталось только кому-то написать как НЕ нужно этого делать. В данной статье мы именно этим и займемся.


          Hazen Robert "Curve fitting". 1978, Science.

          Структура статьи:
          1. Введение
          2. Предвзятая выборка (Sampling bias)
          3. Правильно выбираем среднее (Well-chosen average)
          4. И еще 10 неудачных экспериментов, про которые мы не написали
          5. Играем со шкалой
          6. Выбираем 100%
          7. Скрываем нужные числа
          8. Визуальная метафора
          9. Пример качественной визуализации
          10. Заключение и дальнейшее чтение

          Читать дальше →
        • Миниатюрный HD-видеотранслятор на виртурилке: тесты в сетях 3G и 4G



            После первых статей о виртурилке к нам пришло много вопросов вида «а можно ли сделать такую штуку, которую цепляешь на человека/велосипед/мотоцикл/машину или на самолетик/коптер/лодку/машинку и она транслирует видео в интернет?»

            Ну вот мы и решили сделать такое устройство, тем более что недавно нам удалось наконец осилить работу с HD-видео. Мы также разработали простенький корпус для устройства (файлы stl для печати на 3D-принтере прилагаются).
            Читать дальше →