Использование умных указателей в C++

Этот пост - перевод статьи Герба Саттера: GotW #89 Solution: Smart Pointers.

Постановка проблемы

Простой вопрос

1. В каких случаях следует использовать shared_ptr а в каких - unique_ptr? Приведите как можно больше соображенией на эту тему.

Вопросы посложнее

2. Почему практически всегда следует использовать make_shared для создания объекта, которым будут впоследствии владеть shared_ptr? Объясните.

3. Почему практически всегда следует использовать make_unique для создания объекта, которым будет владеть unique_ptr? Объясните.

4. Что такое auto_ptr?

NodeJS: простейший Express сервер

Этот пост в каком-то смысле продолжение поста про простейший NodeJS сервер, принимающий JSON объекты. Помимо того, что сервер может принимать данные извне (в данном случае, с помощью POST-запроса и JSON), хорошо бы чтобы он умел выдавать пользователю web-страницу с имеющимися данными. В принципе, в случае с одной страницей можно было бы вручную дописать сервер из предыдущего поста, но я решил использовать фреймворк Express, который сэкномит время на написание кода, а в дальнейшем позволит легко масштабировать сервер. Более того, Express имеет встроенные средства для генерации HTML кода из шаблонов страниц (я буду использовать EJS), и много других вещей, которые тоже, вполне возможно, пригодятся в дальнейшем.

SparkFun ESP8266 Thing: подключение датчика движения

Стоит такая задача: подключить датчик движения к микроконтроллеру ESP8266, который будет в свою очередь как-нибудь реагировать на движение в поле видимости датчика (в моем примере он будет мигать светодиодом на плате). В качестве датчика движения я буду использовать вот такой PIR сенсор. Про свою ESP8266 The Thing от SparkFun я уже писал, например, здесь: настройка IDE и прошивка. Мне повезло, и мой PIR сенсор работает от 3,3 В, поэтому его можно запитать прямо от платы. Встречаются очень похожие сенсоры, где регулятор напряжения на входе принимает минимум 5 В. В таком случае можно пустить питание прямо на выход регулятора, минуя его (это описано, например, здесь или здесь), потому что сама плата питается от 3,3 В (ну или использовать отдельное питание для PIR сенсора).

SparkFun ESP8266 Thing: подключение к WiFi и выполнение POST-запроса с JSON

Привожу тут пример кода для SparkFun ESP8266 The Thing, который подключается к WiFi и выполняет POST-запрос к указанному серверу. (Про то, как подключить эту плату к компьютеру и прошить я писал здесь). В качестве сервера я использовал NodeJS сервер, который я описывал здесь (этим и объясняется содержание JSON в запросе). Собственно, плата подключается к WiFi и раз в 30 секунд через POST отправляет серверу вот такой JSON:
{
    "var1": "1",
    "var2": "0"
}

Raspberry Pi: как быстро проверить камеру без монитора

Если Raspberry Pi работает без монитора и к ней можно получить доступ только удаленно (пример подобной настройки я описал здесь), то чтобы проверить камеру надо запустить видеопоток в сеть. Можно сделать это с помощью vlc.

  1. Подключаемся к Raspberry по ssh.
  2. Устанавливаем vlc:
    sudo-apt-get update vlc
    
  3. Подключаем драйвер Video4Linux:
    sudo modprobe bcm2835-v4l2
  4. Запускаем видеопоток:
    cvlc v4l2:///dev/video0 --v4l2-width 1920 --v4l2-height 1080 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:12345}' :demux=h264
  5. На компьютере запускаем vlc, открываем меню Media->Open Network Stream, указываем там в качестве источника:
    http://IP.адрес.Raspberry.Pi:12345
    и нажимаем Play.



Ubuntu: первоначальная настройка Raspberry Pi без монитора

Самый простой способ запустить и настроить Raspberry Pi - подключить к ней монитор и клавиатуру, вставить SD карту на которую скопирован установщик NOOBS, и включить. Если же лишнего монитора нет, то можно по-прежнему установить самостоятельно установить Raspbian на SD карту, запустить с этой карты Raspberry Pi, подключиться по ssh (включен по умолчанию) и настроить удаленный рабочий стол. Для этого понадобится только компьютер с Ubuntu (просто потому, что у меня Ubuntu - для других дистрибутивов, Windows и OS X процесс не должен принципиально отличаться), сеть ( и возможность подключиться к ней с помощью Ethernet кабеля), чистая SD карта размером больше, чем образ Raspbian (Raspbian Jessie занимает 4 Гб) и сама Raspberry. Ниже приведена пошаговая инструкция, что надо сделать, чтобы все заработало.

Ubuntu: изменение кодировки id3v2 тегов для всех файлов в папке

Некоторые проигрыватели понимают только Unicode кодировки в id3 тегах. В итоге, если файл, созданный в Windows, содержит теги с кириллицей, то в проигрыватель может показать что-то такое: Ãðàæäàíñêàÿ îáîðîíà.
К счастью, кодировка UTF-8 воспринимается всеми, поэтому ее легко можно использовать вместо любой другой. А переконвертировать теги для всех mp3 файлов в папке в Ubuntu можно следующим образом.
  1. Устанавливаем пакет python-mutagen:
    sudo apt-get install python-mutagen
    
  2. Определяем, в какой кодировке записаны нечитаемые теги: 
    • вот так можно получить список возможных кодировок:
      iconv --list
      
    • копируем нечитаемую строчку в декодер и смотрим, что он скажет,
    • или смотрим на диаграмму.
  3. Проверяем, правильно ли мы определили кодировку: 
    • выполняем команду:
      mid3iconv -p -d -e <source-encoding> input.mp3
      
      где source-encoding - это полученная ранее кодировка, input.mp3 - mp3 файл с нечитаемыми тегами; флаг -p выставляется, чтобы команда не изменяла сам файл, но просто вывела в консоль конвертированные значения тегов;
    • если в консоли появляются читаемые теги - переходим к следующему шагу, если нет - значит, исходная кодировка выбрана неправильно.
  4. Конвертируем все файлы с расширением .mp3 в папке (и рекурсивно во внутренних папках) из заданной кодировки в UTF-8:
    find . -name "*mp3" -print0 | xargs -0 mid3iconv -e <source-encoding> -d 
    
    или для примера выше (файлы, записанные в Windows c кириллицей в тегах часто имеют кодировка CP1251):
    find . -name "*mp3" -print0 | xargs -0 mid3iconv -e CP1251 -d