Этот пост в каком-то смысле продолжение поста про простейший 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.
- Подключаемся к Raspberry по ssh.
- Устанавливаем vlc:
sudo-apt-get update vlc
- Подключаем драйвер Video4Linux:
sudo modprobe bcm2835-v4l2
- Запускаем видеопоток:
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
- На компьютере запускаем vlc, открываем меню Media->Open Network Stream, указываем там в качестве источника:
http://IP.адрес.Raspberry.Pi:12345
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 можно следующим образом.
К счастью, кодировка UTF-8 воспринимается всеми, поэтому ее легко можно использовать вместо любой другой. А переконвертировать теги для всех mp3 файлов в папке в Ubuntu можно следующим образом.
- Устанавливаем пакет python-mutagen:
sudo apt-get install python-mutagen
- Определяем, в какой кодировке записаны нечитаемые теги:
- вот так можно получить список возможных кодировок:
iconv --list
- копируем нечитаемую строчку в декодер и смотрим, что он скажет,
- или смотрим на диаграмму.
- Проверяем, правильно ли мы определили кодировку:
- выполняем команду:
mid3iconv -p -d -e <source-encoding> input.mp3
- если в консоли появляются читаемые теги - переходим к следующему шагу, если нет - значит, исходная кодировка выбрана неправильно.
- Конвертируем все файлы с расширением .mp3 в папке (и рекурсивно во внутренних папках) из заданной кодировки в UTF-8:
find . -name "*mp3" -print0 | xargs -0 mid3iconv -e <source-encoding> -d
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, используя при этом более простые, более легковесные и более быстрые структуры данных.
Все, что находится в стандартной библиотеке С++, находится там по какой-то причине, но это не всегда очевидно, по какой именно. Стандарт - это не руководство, в нем не проводится разделения между базовыми компонентами, которые используются постоянно, и теми компонентами, которые были добавлены в стандарт для редких и специфичных случаев.
Один из примеров - это ассоциативный контейнер std::set (и родственные ему map, multiset, multimap). Иногда использование set действительно имеет смысл, но не так часто, как вы могли бы подумать. Стандартная библиотека предоставляет и другие инструменты, позволяющие хранить данные и совершать выборку данных, и часто можно достичь тех же целей, что достигаются при использовании set, используя при этом более простые, более легковесные и более быстрые структуры данных.
Blogger: настройка блока "Поделиться" от Яндекс
Встроенные в Blogger кнопки "поделиться" не очень удобны: там представлен довольно ограниченный набор соц. сетей, да и сложно заставить их находиться там, где нужно (мне в итоге это не удалось в полной степени). К счастью, Яндекс предлагает свой настраиваемый блок "Поделиться". Проблемы начинаются, если хочется разместить кнопки не только на странице поста, но и на главной под каждым постом в списке, причем так, чтобы при нажатии на кнопку использовалась ссылка именно на пост, а не на страницу, на которой эта кнопка размещена. Для этого нужно использовать дополнительные настройки блока (полный список найтроек можно найти в документации).
Подписаться на:
Сообщения
(
Atom
)