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
    

Как починить поврежденные MP3 файлы

Столкнулся с проблемой, что часть файлов из моей mp3 коллекции не проигрывается некоторыми проигрывателями в Ubuntu (единственные проигрыватели, которые проиграли все - Vlc, и Audacity). В итоге нашел бесплатную программу MP3 Diags (есть и под Windows и под Linux), которая автоматически чинит довольно много проблем в mp3 файле. Я просто прогнал максимальный набор тестов и это решило все мои проблемы. Следует отметить, что MP3 Diags по умолчанию может заменять существующие файлы на исправленные. Так же автор упоминает несколько отчетов о крэшах, которые ему присылали, то есть перед тем, как чинить всю свою коллекцию mp3 файлов лучше сначала сделать резервную копию. Почитать подробнее о программе (включая довольно подробную документацию) можно здесь.

Почему не следует использовать std::set (и что стоит использовать вместо)

Этот пост является переводом статьи Мэтта Остерна: Why you shouldn't use set (and what you should use instead).
Все, что находится в стандартной библиотеке С++, находится там по какой-то причине, но это не всегда очевидно, по какой именно. Стандарт - это не руководство, в нем не проводится разделения между базовыми компонентами, которые используются постоянно, и теми компонентами, которые были добавлены в стандарт для редких и специфичных случаев.
Один из примеров - это ассоциативный контейнер std::set (и родственные ему map, multiset, multimap). Иногда использование set действительно имеет смысл, но не так часто, как вы могли бы подумать. Стандартная библиотека предоставляет и другие инструменты, позволяющие хранить данные и совершать выборку данных, и часто можно достичь тех же целей, что достигаются при использовании set, используя при этом более простые, более легковесные и более быстрые структуры данных.

Blogger: настройка блока "Поделиться" от Яндекс

Встроенные в Blogger кнопки "поделиться" не очень удобны: там представлен довольно ограниченный набор соц. сетей, да и сложно заставить их находиться там, где нужно (мне в итоге это не удалось в полной степени). К счастью, Яндекс предлагает свой настраиваемый блок "Поделиться". Проблемы начинаются, если хочется разместить кнопки не только на странице поста, но и на главной под каждым постом в списке, причем так, чтобы при нажатии на кнопку использовалась ссылка именно на пост, а не на страницу, на которой эта кнопка размещена. Для этого нужно использовать дополнительные настройки блока (полный список найтроек можно найти в документации).