20061123

Bluetooth: спаривание телефона и компьютера (bluez-passkey-gnome)

Я пользуюсь Nokia 6021 и USB-модулем Bluetooth для доступа в интернет через GPRS/EDGE, когда другого доступа нет. Некоторое время назад я описал подключение GPRS/EDGE в GNU/Linux в викиучебнике.
Дополнение: подключение GPRS «без коммандной строки» (используя KPPP) хорошо описал в своём блоге SIR.

Недавно после обновления системы я заметил, что соединение между компьютером и телефоном больше не устанавливается. При попытке спарить телефон и компьютер, на телефоне запрашивался пароль, и соединение благополучно разрывалось с сообщением, что PIN неверный, хотя везде где можно в /etc/bluetooth был указан тот же самый правильный PIN.

Похоже, что причина в изменении работы bluez-utils. Поскольку Bluetooth предназначен для использования пользователями, у которых может и не быть прав на изменение общесистемных настроек, ввод пароля должен осуществляться пользовательской программой. Согласно информации в /usr/share/doc/bluez-utils/README.Debian.gz в качестве такой программы рекомендуется bluez-passkey-gnome. Итак,

Рецепт сопряжения Bluetooth-телефона и Linux-компьютера



Шаг 1: установить bluez-passkey-gnome

Например, так:

# aptitude install bluez-passkey-gnome


После этого при запуске рабочего стола в системном лотке будет появляться значок Bluetooth. Это Bluetooth Manager. Чтобы не перезапускать сессию пользователя, первый раз его можно запустить как bt-applet (например, через комбинацию клавиш Alt+F2 в Gnome).

Шаг 2: поправить /etc/bluetooth/hcid.conf

Обычно этот шаг не потребуется. На всякий случай вот конфигурация моего hcid.conf:

options {
autoinit yes;
security user;
pairing multi;
}

device {
name "jx-%d"; # это имя, под которым комьютер будет виден на телефоне
class 0x3e0100;
iscan enable; pscan enable;
lm accept;
lp rswitch,hold,sniff,park;
}


Шаг 3: спарить устройства

Я обычно это делаю такой командой:
# echo ATZ > /dev/rfcomm0

но можно проделать то же самое уже и при нормальном установлении GPRS-соединения.

Когда на телефоне появиться запрос, ввести на нём пароль. После этого иконка Bluetooth в системном лотке начнёт мигать. Нажмите на нее, введите тот же пароль в появившемся диалоговом окне. Чтобы не повторять эту операцию каждый раз, в настройках Bluetooth на телефоне откройте список сопряжённых устройств и разрешите автоподключение без подтверждения для только что добавленного устройства.

Такой способ работает у меня с bluez-utils 3.7-1 и bluez-passkey-gnome 0.5-2.

20061121

Как сделать видео из серии картинок

Мне часто приходится делать видеофайл из последовательности изображений. Это очень просто делается с помощью mencoder (входящего в проект mplayer) или ffmpeg. Вначале о mencoder.

Вариант 1: делаем видео с mencoder


Предположим, имеется набор изображений одинакового разрешения в формате JPEG, и файлы с изображениями названы таким образом, что
$ ls -1 *.jpg
перечисляет будущие "кадры" в нужном порядке.

Собрать "кадры" в "фильм" можно так:
$ mencoder "mf://*.jpg" -vf scale=320:-11 -oac copy -ovc lavc -lavcopts vcodec=msmpeg4:vbitrate=2000 -ffourcc MP43 -o "output.avi"
Эта команда создаёт видео-файл output.avi, с шириной кадра 320 пикселей и сохранением пропорций кадра (-11). Видеопоток сжимается кодеком msmpeg4, это позволит просматривать ваш видеофайл пользователям Windows, у которых дополнительных кодеков не установлено, для этого же служит и ключ -ffourcc MP43. Без него Windows Media Player не догадается о своей способности воспроизвести файл. Величина битрейта (vbitrate=2000) влияет на качество видео: чем больше значение, тем меньше будут заметны артефакты сжатия, но и тем больше будет размер полученного файла.

Файлы полученные таким образом воспроизводятся, насколько мне известно, без проблем любым видео-проигрывателем и в Linux, и в Windows.

Вариант 2: делаем видео с ffmpeg


Можно тоже самое сделать и с помощью ffmpeg. Вначале можно единообразно переименовать все исходные файлы, чтобы имена были, например, frame0000.jpg:
$ i=0 ; for f in *.jpg ; do mv "$f" $(printf "frame%04d.jpg" $i) ; i=$((i+1)) ; done
Затем можно сделать собственно видео. Например, чтобы сделать видео в формате Flash (FLV):
$ ffmpeg -f image2 -r 2 -i frame%04d.jpg  -s 320x240 -y -an -r 24 out.flv
Здесь -r 2 указывает частоту кадров во входном потоке (две картики в секунду), -i frame%04d.jpg определяет шаблон для имён файлов с отдельными кадрами, -s 320x240 масштабирует кадры, -y говорит молча перезаписать файл с результатом, -an говорит не писать звук, -r 24 устанавливает частоту кадров в видеопотоке на выходе. Можно в середине указать ещё -sameq, чтобы сохранять качество картинки насколько это возможно.

Чтобы сделать видео в другом формате, меняем имя файла на выходе, например, возможны такие варианты:
$ ffmpeg -f image2 -r 2 -i frame%04d.jpg  -s 320x240 -y -an -r 24 -vcodec msmpeg4 -vtag MP43 out.avi
$ ffmpeg -f image2 -r 2 -i frame%04d.jpg -s 320x240 -y -an -r 24 -vcodec mpeg4 out.avi
$ ffmpeg -f image2 -r 2 -i frame%04d.jpg -s 320x240 -y -an -r 24 -vcodec libx264 out.avi


Пользователям Ubuntu для этого, вероятно, потребуется поставить пакеты с полноценным, неурезанным ffmpeg. На сегодня (2009-04) они называются libavcodec-unstripped-51 и libavcodec-unstripped-52.

20061117

Bash: Как обработать несколько файлов (уменьшить разрешение фото)

Допустим, у Вас есть некоторое количество фотографий, отснятых во время последней прогулки или поездки. Скорее всего, разрешение это фотографии в разрешении 3-6 мегапикселей. Это значит, что размер каждого файла с фотографией 1-2 мегабайта.

Этот размер чаще всего избыточен для простого выкладывания фотографии в сети или отправки по электронной почте. Обычно для просмотра на экране вполне годятся фотографии с разрешением 1 мегапиксель и менее.

Создать копии в низком разрешении из набора фотографий в высоком разрешении можно, конечно, вручную, загружая каждую фотографию в графический редактор, уменьшая и сохраняя под другим именем или в другом месте. Можно это сделать и без графического редактора, с помощью программы convert из пакета ImageMagick:

$ convert -quality 90 -resize 640x640 большое-фото.jpg уменьшенное-фото.jpg


Программа convert позволяет автоматизировать многие операции обработки графики. В данном случае она берёт файл (большое-фото.jpg), уменьшает до размера, не превышающего 640x640 (-resize 640x640), и сохраняет в формате JPEG с уровнем качества 90% (-quality 90) уменьшенное изображение в файле уменьшенное-фото.jpg.

А если файлов много? Просто и быстро это можно сделать сделать одной командой командной оболочки выполненной в каталоге с фотографиями:

$ mkdir lowres; for f in *.jpg ; do convert -quality 90 -resize 640x640 "$f" "lowres/${f%.jpg}-640.jpg" ; done


Что делает эта команда: создаёт подкаталог lowres в текущем каталоге (mkdir lowres); далее для всех файлов с разрешением .jpg (for f in *.jpg ; do ... ; done) вызывает программу конвертации (convert).

Программа ковертации сохраняет уменьшенные изображения в подкаталоге lowres под именем с окончанием -640.jpg. Так, если в исходном каталоге были изображения с именами мама.jpg, папа.jpg, я.jpg, то после выполнения указанной команды должен появиться подкаталог lowres/ с изображениями мама-640.jpg, папа-640.jpg, я-640.jpg. Изменённые имена файлов позволят не спутать их с исходными изображениями в высоком разрешении.

Набор команд между do и done повторяется несколько раз, для каждого файла подходящего по шаблону *.jpg. Имя обрабатываемого файла при этом хранится в "переменной" f. Запись $f позволяет получить это имя файла, а ${f%.jpg} отсекает (%) от имени файла окончание .jpg. Обратите внимание, что имена файлов берутся в двойные кавычки: "$f", "${f%.jpg}-640.jpg" -- это позволяет обрабатвать также имена файлов содержащие пробелы.

Конструкцию for f in шаблон ; do что сделать с каждым файлом ; done удобно использовать и для многих других целей. Например, для автоматического переименования или копирования файлов.

20061116

Как собирать программы из исходников

Много лет назад, когда я только начинал пользоваться линуксом, я часто сталкивался с тем, что какой-нибудь нужной или интересной мне программы в моём дистрибутиве не было, или была, но какой-нибудь не той версии.. И тогда надо было собирать её из исходников. Это занятие мне казалось страшным и сложным.

Сейчас такая ситуация случается гораздо реже, благо установка и обновление программ в Debian больше напоминает заказ в ресторане: хочу это, хочу то -- подождите -- готово! Однако умение собирать программы из исходников рано или поздно пригождается практически любому пользователю свободного программного обеспечения. И сложного в этом ничего нет.

Достаточно один раз в жизни услышать волшебное заклинание: "configure, make, make install". Дальше я объясню, что это значит.

Сборку программы можно сравнить с выпечкой пирога. Чаще всего, вначале надо взять все необходимые ингридиенты (исходники),
потом смешать их в нужном порядке (подготовить исходники к сборке, ./configure), а затем залить в форму и поставить в печь (запустить сборку, make). Спустя некоторое время из печи можно вынимать готовый к употреблению пирог (устанавливать готовую программу, make install).

Следует отметить, что в данном случае для выпечки необходима кухня и печь. Также и для сборки программы необходимы инструменты разработчика. Обычно это включает в себя как минимум компилятор и сопутствующие ему программы, как например утилита make. Это и есть "печь". Потребуется и место, где можно всем этим заняться -- командная строка (терминал) ("кухня"). Если у вас есть и кухня, и печь, то можете начинать готовить.

Итак, все свободные программы доступны в виде исходного кода. Это полуфабрикат программы. Из него легко можно собрать саму программу, а можно и использовать для создания какой-нибудь новой программы. По-английски исходный код называется source code.

Шаг 1: берём исходники

Необходимо скачать и распаковать архив с исходным кодом программы. Например, можно скачать программу hello-2.1.1. Обычно исходники следует брать с сайта разработчиков программы.

Распаковать архив можно так:
$ tar zxvf hello-2.1.1.tar.gz

(Не забывайте, что в большинстве случае нажатие клавиши Tab позволяет дополнить имя файла, введя лишь несколько первых символов). При этом содержимое архива будет распаковано в тот же каталог, в котором находится архив.

Перейдите в каталог с исходным кодом:
$ cd hello-2.1.1


Шаг 2: configure (месим тесто)

Прочитайте файлы INSTALL и README, если они есть в архиве исходного кода. В них может содержаться важная информация о том, как устанавливать и использовать программу.

В большинстве случае для подготовки исходников к сборке потребуется выполнить только одну команду:
hello-2.1.1$ ./configure


Она проверит наличие всех необходимых условий (библиотек и других программ) в Вашей системе, и приготовит исходный код к их использованию. Обратите внимание на символы "./" в начале команды. Они указывают, что необходимо выполнить команду configure из текущего каталога, то есть команду configure поставляемую вместе с исходным текстом программы, которую мы собираем.

На этом же этапе можно указать и куда именно надо ставить программу. Хотя в большинстве случаев рекомендуется ставить "самосборные" программы в каталог /usr/local, иногда это невозможно. Так, если у пользователя нет прав администратора, например на общественном компьютере, то установить программу можно только в свой домашний каталог. Чтобы установить программу в домашний каталог нужно указать дополнительный параметр команде configure:
hello-2.1.1$ ./configure --prefix=$HOME


Дополнение: на самом деле, я обычно устанавливаю программы с префиксом /usr/local/stow/название-программы, а после установки использую утилиту stow, чтобы поставить символические ссылки на файлы программы в системных каталогах. Использование утилиты stow позволяет мне потом легко удалить установленную программу, не связываясь при этом с более трудоёмкой сборкой пакетов.


Внимательно читайте что пишется на экране при подготовке исходников. Если всё нормально, то закончится она должна чем-нибудь вроде
config.status: creating Makefile
config.status: creating contrib/Makefile
config.status: creating doc/Makefile
config.status: creating intl/Makefile
...


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

Шаг 3: make (в печь!)

Если предыдущая стадия закончилась нормально, то теперь можно ставить наш полуфабрикат в печь. То есть запускать процесс сборки программы. Обычно он происходит автоматически и управляется командой make:
hello-2.1.1$ make


Для больших программ этот процесс может занимать довольно много времени. Однако наша программа-пример hello должна собраться быстро.

Если сборка закончилась сообщением вроде этого:
make: *** [all] Ошибка 2

то значит, что-то пошло не так, и сборка не получилась. Однако чаще всего сборка заканчивается без ошибок.

Шаг 4: make install (кушать подано!)

Собственно всё. Пирог можно подавать к столу, а собранную программу устанавливать в систему. Делается это так:
hello-2.1.1$ make install


Если на шаге подготовки исходников Вы выбрали вариант установки в домашний каталог (как я), то не забудьте добавить подкаталог ~/bin в переменную PATH:
$ export PATH=$HOME/bin:$PATH


Можете запускать собранную программу:
$ hello
Здравствуй, мир!


Она пишет на экран "Здравствуй, мир!". Всё ОК.

Надеюсь, что эти инструкции будут понятны даже совсем начинающим пользователям линукс. Мне в своё время не хватало таких инструкций :)

P.S. Хочу, однако, заметить, что сборка из исходников несёт с собой целый ряд неудобств. Первое и наиболее существенное из них -- удалять такую программу гораздо хлопотнее. В случае с hello это можно сделать с помощью команды
hello-2.1.1$ make uninstall

в каталоге с её исходным кодом, но не всегда этот каталог сохраняется в целостности, да и не все авторы программ должным образом готовят исходные тексты к make uninstall

Поэтому лучше пользоваться готовыми пакетами, поставляемые с Вашим дистрибутивом. Так, чтобы установить программу hello в Debian GNU/Linux достаточно всего одной команды:
# aptitude install hello

или
$ sudo aptitude install hello

Оправдание блога

За годы использования свободных программ мне не раз приходилось решать разные вопросы, связанные с их настройкой или наиболее эффективным использованием.

В какой-то момент я осознал, что некоторые "рецепты" полезно сохранять, и стал собирать их у себя на диске. Сделал что-нибудь, настроил, а всякие "ответы с форумов" и "HOWTO" -- в архив. Чтобы если придётся ещё раз, уже под рукой было. Оказалось удобно.

А потом подумал, что некоторые вещи могли бы быть полезны не только мне. Так что если не буду лениться, буду их сюда записывать. Авось и кому-то ещё пригодятся :)