Data::Dumper и текст в UTF-8

Если вы работаете со сложными структурами данных (массивы хешей, хеши массивов и т.п.), наверняка вы используете для отладки модуль Data::Dumper. Все бы хорошо, но этот модуль категорически не хочет работать с символами в кодировке UTF-8, его вывод выглядит примерно так:

'country' => "\x{420}\x{43e}\x{441}\x{441}\x{438}\x{44f}",
'city' => "\x{41c}\x{43e}\x{441}\x{43a}\x{432}\x{430}",
'airport' => "\x{414}\x{43e}\x{43c}\x{43e}\x{434}\x{435}\x{434}\x{43e}\x{432}\x{43e}",
'code' => 'DME'

Чтобы сделать вывод функции Dumper читаемым, надо просто добавить в программу вот такой кусочек кода:

$Data::Dumper::Useqq = 1;

{ no warnings 'redefine';
sub Data::Dumper::qquote {
my $s = shift;
return "'$s'";
}
}

Тогда вывод будет выглядеть совсем по другому:

'country' => 'Россия',          
'city' => 'Москва',
'terminal' => '',
'airport' => 'Домодедово',
'code' => 'DME'

Как наложить субтитры на видео

ОС: Opensuse 11.2
Софт: mplayer, mencoder (freeware)

Mplayer сам по себе достаточно умный, чтобы добавлять субтитры из внешнего файла к готовому видео. К примеру, есть у меня файл Madagascar – Escape 2 Africa.avi, и к нему идет текстовый файл с субтитрами – Madagascar – Escape 2 Africa.srt с расписанием, на какой секунде какой текст показывать. При запуске mplayer автоматом цепляет файл с субтитрами и все прекрасно работает.

Но сложности начинаются, если файл с субтитрами переименовать – тогда они не будут видны. Чтобы избежать таких неприятностей, всегда можно перекодировать фильм с добавлением субтитров с помощью mencoder:

mencoder -oac copy -ovc lavc -lavcopts keyint=25:vcodec=mpeg4:vbitrate=679:vpass=1 -sub “Madagascar – Escape 2 Africa.srt” -o “Madagascar – Escape 2 Africa.with.subtitles.avi” “Madagascar – Escape 2 Africa.avi”

Кстати, mencoder еще и умеет вырезать кусочки видео из общего фильма. Чтобы вырезать 74 секунды видео с 1000-й секунды воспроизведения, надо просто указать эти параметры:

mencoder -oac copy -ovc lavc -lavcopts keyint=25:vcodec=mpeg4:vbitrate=679:vpass=1 -ss 970 -endpos 74 -sub “Madagascar – Escape 2 Africa.srt” -o “Madagascar – Escape 2 Africa.en.with.subtitles.avi” “Madagascar – Escape 2 Africa.avi”

Вот такой ролик у меня получился (смотреть всем, а особенно тем, кто тренируется воспринимать английскую речь на слух). Встроить ролик в страницу не получилось, потому что Youtube ограничил показ этого ролика для ряда стран (Россия в этот список не попала)

Похожие посты:
Как пережать 3gp в avi, Как скачать видео с сайта, Как сделать видеоклип из фотографий

Update: Youtube заблокировал показ этого ролика. Интересное кино….

Эффект черного ящика

Многие программисты на Perl частенько используют модуль XML::Simple для обработки файлов. Казалось бы, что может быть проще, чем распарсить файл:

use XML::Simple;
my $xs = XML::Simple->new();
my $ref = $xs->XMLin(‘test.xml’);

Однако даже такой простой кусок кода в разных системах реагировал по-разному на один и тот же исходный файл. Если в исходном файле XML встречались символы в кодировке utf8, скрипт мог свалиться на этапе разбора файла.

Выяснилось, что модуль XML::Simple сам по себе не занимается разбором XML, и парсинг происходит с помощью других доступных модулей. Если в системе установлен XML::SAX, то именно он будет использоваться по умолчанию, в противном случае для разбора будет применяться XML::Parser.

С XML::SAX тоже не все просто, он для разбора использует либо XML::SAX::PurePerl (что медленно и не всегда корректно работает), либо XML::SAX::Expat или XML::SAX::ExpatXS (если они установлены).

Так вот, чтобы XML::Simple смог корректно разобрать XML файл со строками в кодировке UTF-8, надо установить XML::SAX::Expat или XML::SAX::ExpatXS. Это совершенно не очевидно, и об этом можно забыть при переносе скриптов с сервера на сервер.

Как сделать видеоклип из фотографий

Дано: несколько фоток и подходящая музыка.
Требуется: сделать из них простенький клип.
Софт: mencoder (freeware)

Чтобы нормально все выглядело, нам надо знать продолжительность музыкального трека в секундах и количество фотографий. В моем случае трек был на 132 секунды, и у меня было 14 фоток. Получается, чтобы равномерно их показать, смена кадров должна происходить один раз в 9,43 секунды (132 / 14). Соответственно, FPS (Frames Per Second) для ролика составит (14 / 132) = 0,106

Ну и получить клип можно одной командой:

mencoder mf://*.jpg -mf fps=0.106 -ovc lavc -lavcopts vcodec=mpeg4 -audiofile theme.mp3 -oac mp3lame -lameopts abr:br=160 -srate 44100 -ofps 25 -o output.avi

Мне, как и любому программисту, лениво руками считать количество файлов и продолжительность музыкального трека. Поэтому я cваял простенький скрипт на Perl, который и делает за меня эту грязную работу:

#!/usr/bin/perl -w
use MP3::Info;
my $mask = "*.jpg";
my @pics = glob($mask);
my @sounds = glob("*.mp3");
my $a = get_mp3info($sounds[0]);
my $seconds = $a->{'SECS'};
my $pics_number = $#pics + 1;
my $FPS = $pics_number / $seconds;
my $cmd = "mencoder mf://".$mask." -mf fps=".$FPS." -ovc lavc -lavcopts vcodec=mpeg4 -audiofile ".$sounds[0]." -oac mp3lame -lameopts abr:br=160 -srate 44100 -ofps 25 -o output.avi";
my $res = system($cmd);

И вот что у меня получилось:

Копирайты: фотки мои, музыка The Dead Rocks, One Million Dollar Theme.

Еще по теме: Как пережать 3gp в avi, Как скачать видео с сайта, Мои путешествия – избранное

Настройка Триколор Интернет в OpenSuSe 11.2

До конца 2010 года все абоненты Триколор ТВ подключенные по тарифному плану Оптимум могут бесплатно пользоваться ихним же интернетом. Сразу скажу, что у меня уже есть безлимитный и довольно шустрый интернет через ADSL модем. И все же я решил повозиться и настроить дополнительно еще и спутниковый интернет, используя проводное соединение в качестве исходящего канала.

Используемое оборудование: DVB Карта Prof Revolution 7301 S2 и ADSL модем D-Link 500T в режиме роутера. Операционная система OpenSuSe 11.2.

1: Регистрация оборудования в личном кабинете. Вносим MAC-адрес DVB-карты, получаем IP адрес, логин и пароль.

Каждую цифру полученного IP адреса переводим в шестнадцатеричный вид, и получаем новый MAC-адрес устройства вида МАС 00:02:XX:XX:XX:XX (подробности здесь). Он будет нужен для создания VPN соединения.

2. Создаем VPN соединение любым способом. Кто-то делает через Yast (настройка DSL), кто-то делает через kvpnc; я же сделал через pptp-command, создал новый CHAP secret, создал новый pptp-туннель и не трогал маршрутизацию. Добился того, чтобы при запуске pptp-command start создавалось соединение (через устройство ppp0), и убивалось по команде pptp-command stop.

3. Настраиваем прием данных со спутника, используя IP сервера 81.177.31.194, и логин с паролем из личного кабинета. Создаем файл /etc/tricolor.conf с одной единственной строчкой:

Trikolor:11766:h:0:27500:1000:1000:0

В /etc/resolv.conf указываем любые публичные DNS-сервера:

nameserver 8.8.4.4 
nameserver 4.2.2.2
nameserver 8.8.8.8

Выкладываю свой скрипт, который у меня лежит в /etc/init.d/tricolor.sh :

#!/bin/bash                                                                  

PATH=/usr/sbin:/usr/bin:/sbin:/bin
NAME=`basename $0`

# https://cabinet.stv.su/index.php?m=info
IP="192.168.100.1" #Сюда прописываем ваш IP-адрес, (адрес левый, роли не играет)
MAC="00:02:XX:XX:XX:XX" #сюда пишем MAC-адрес сконвертированный из IP адреса данного триколором
PID="0x3e8" #здесь должен быть ваш PID (можно и в dec) 0x3e8h=1000d

# https://cabinet.stv.su/index.php?m=conf

CHANNELS_CONF="/etc/tricolor.conf"

# http://forum.stv.su/viewtopic.php?t=1173
case "$1" in
start)
echo "starting $NAME..."
#Теперь отключим rp_filter, фильтрующий пакеты которые не могут уйти через тот же интерфейс что и пришли
/sbin/sysctl -w net.ipv4.conf.all.rp_filter="0"
/sbin/sysctl -w net.ipv4.conf.default.rp_filter="0"
#сие так замудренно всвязи с проблемамаи на ядре 2.6.24 и выше
/usr/sbin/pptp-command start
dvbnet -p $PID
szap -l 10750 -c $CHANNELS_CONF -n 1 > /dev/null &
ifconfig dvb0_0 hw ether $MAC
ifconfig dvb0_0 $IP
route add -net 0.0.0.0 dev ppp0
;;
stop)
/usr/sbin/pptp-command stop
echo "stoping $NAME..."
ifconfig dvb0_0 down
dvbnet -d 0
killall szap #ну раз замудрили при старте, мудрим и при остановке - иначе никак =(
/etc/init.d/network restart
;;
restart)
$0 stop
$0 start
;;
*)
echo "usage: $NAME start|stop|restart"
exit 3
;;
esac

exit 0

Для карт S2 есть принципиальный момент, MAC адрес должен назначаться до назначения IP, иначе скрипт будет ругаться на невозможность назначить айпишник устройству. Последняя строчка в секции start заворачивает весь исходящий трафик на VPN.

Далее от рута даем команду /etc/init.d/tricolor.sh start и все заработало.

Как видно из скрипта, при поднятии VPN запросы на сервера DNS и будут отправляться через ADSL-модем (через устройство ppp0), весь входящий трафик пойдет через спутниковую DVB карту. Проверить это можно, если запустить ifconfig:

# ifconfig
dvb0_0 Link encap:Ethernet HWaddr 00:02:XX:XX:XX:XX
inet addr:192.168.100.1 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST RUNNING NOARP MULTICAST MTU:4096 Metric:1
RX packets:455 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:168998 (165.0 Kb) TX bytes:0 (0.0 b)
Base address:0x3e8

eth1 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:106749 errors:0 dropped:0 overruns:0 frame:0
TX packets:127707 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:40869070 (38.9 Mb) TX bytes:25464396 (24.2 Mb)
Interrupt:19 Base address:0x8000

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:50 errors:0 dropped:0 overruns:0 frame:0
TX packets:50 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3340 (3.2 Kb) TX bytes:3340 (3.2 Kb)

ppp0 Link encap:Point-to-Point Protocol
inet addr: XX.XX.XX.XX P-t-P:10.1.1.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:996 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:485 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:80 (80.0 b) TX bytes:58760 (57.3 Kb)

Таблица маршрутизации у меня выглядит так:

# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
81.177.31.194 192.168.1.1 255.255.255.255 UGH 0 0 0 eth1
10.1.1.1 * 255.255.255.255 UH 0 0 0 ppp0
192.168.100.0 * 255.255.255.0 U 0 0 0 dvb0_0
192.168.1.0 * 255.255.255.0 U 0 0 0 eth1
link-local * 255.255.0.0 U 0 0 0 eth1
loopback * 255.0.0.0 U 0 0 0 lo
default * 0.0.0.0 U 0 0 0 ppp0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth1

Все замечательно работает. Правда, скорость скачивания через tricolor internet раз в 10 меньше скорости скачивания через ADSL модем, но зато у меня появился дополнительный айпишник из триколоровской сети.

Выбираем видеокарту

ATI Radeon HD 5570, отличная видеокарты

Так получилось, что моя видеокарта ATI Radeon X1650 сдохла, проработав почти 3 года. К ней особых претензий не было, и я таки решил выбрать себе видюху того же производителя на замену убитой. Одним из основных требований к карте у меня была возможность просмотра HDTV в формате h.264, ну и невысокая цена. Мой выбор пал на карточку ATI Radeon HD 5570, стоит она примерно $85 и втыкается в тот же слот PCI Express, что использовался ныне покойной видюхой.

Карта тупо втыкается в маму, ставятся драйвера от производителя ATI — и вуаля, все работает. Xorg 7.4 достаточно умный, чтобы определить новое железо и нормально его использовать без изменения каких-либо конфигурационных файлов.

Решил я погонять игрушки протестировать производительность новой видеокарты в условиях максимальных нагрузок. Перепробовал много 3D вещей, доступных под линуксом – Quake3, TileRacer, Supertuxcart, Etracer и т.п. – все работает без нареканий.

Эти карты очень свежие, на рынке появились в феврале 2010 года. Убежден, что подлянки с прекращением выпуска драйверов для новых версий Xorg для этой карты ожидать в ближайшее время не стоит.

gedit: необходимый инструмент разработки

gedit logo

Любому программисту нужен удобный текстовый редактор, желательно настраиваемый под себя и с кучей функций. Раньше я пользовался в основном Kate, когда сидел под KDE; но сейчас времена изменились, и я открыл для себя gedit в GNOME.

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

Однако, я привык к другим горячим клавишам в других редакторах. В gedit отсутствует возможность их переназначить, но как оказалось, их можно поменять средствами GNOME. Например, плагин Отступ строк (Text Ident) по умолчанию работает на комбинациях клавиш Ctrl+T и Ctrl+Shift+T; но если для смены раскладки клавиатуры используется Ctrl+Shift, то вторая комбинация клавиш просто не будет работать. Поменять их можно, если залезть в настройки гнома (Центр управления -> Внешний вид, закладка Интерфейс, поставить галку Редактируемые ускорители меню или “Interface” -> “Editable menu shortcut keys” для англоязычной версии).

Включение режима редактирования горячих клавиш в gnome

После включения этой опции можно навести курсор мыши на интересующий пункт меню и нажать желаемые комбинации клавиш – все поменяется.

Еще одна неочевидная вещь, некоторые параметры gedit можно поменять только редактированием параметров gnome. Например, по умолчанию gedit в меню Файл будет показывать последние 4 открытых файла, что маловато. Если же запустить gconf-editor и отредактировать параметр gedit2->ui->recents, то можно задать их столько, сколько надо:

Включение режима редактирования горячих клавиш в gnome

ИМХО это один из самых удобных редакторов для разработчика

Переезд серверов в другой датацентр

Dell Power Edge 6850

Так получилось, что наши сервера должны были переехать в другой датацентр в течение суток. Занятие получилось очень геморройное, поскольку меняется вся конфигурация сети — IP-адреса, шлюзы по умолчанию, даже маска сети. Так вот появилась задача, настроить сеть так, чтобы в старом ДЦ могли выключить сервера, привезти в новый ДЦ, там тупо включить – «и чтоб все заработало». У всех серверов статические айпишники, так что вариант с получением адресов с сервера DHCP здесь не пройдет.

Задача решается, если известна новая конфигурация сети. Есть старый добрый способ сделать несколько IP адресов на сетевой карте, с помощью алиасов. В CentOS можно прописать свой default gateway для каждого алиаса.

Пример старой конфигурации:

$ cat /etc/sysconfig/networking/devices/ifcfg-eth0

# Intel Corporation 82541GI Gigabit Ethernet Controller
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
HWADDR=00:11:22:22:44:55
NETMASK=255.255.255.0
IPADDR=1.2.3.4
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
PEERDNS=yes
GATEWAY=1.2.3.254
DNS1=4.2.2.2
DNS2=8.8.8.8

Создаем новый алиас для этой же сетевой карты с параметрами сети нового ДЦ:

$ cat /etc/sysconfig/networking/devices/ifcfg-eth0:1

# Intel Corporation 82541GI Gigabit Ethernet Controller
DEVICE=eth0:1
BOOTPROTO=none
BROADCAST=5.6.7.255
IPADDR=5.6.7.8
NETMASK=255.255.255.0
NETWORK=5.6.7.0
TYPE=Ethernet
PEERDNS=yes
GATEWAY=5.6.7.254
DNS1=4.2.2.2
DNS2=8.8.8.8

Вуаля. Сервер можно выключать и перевозить.

CentOS и свежий MySQL

Официальный логотип Mysql

Начиная с версии 5.1 в MySQL поддерживается партиционирование таблиц, а это как раз то, что мне надо. Решил я проапгрейдить свой сервер, но оказалось, что в стандартных репозиториях CentOS mysql довольно старый.

Проблема решается подключением репозитория remi.

Для 32-битной версии:
wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm

Для 64-битной версии:
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-3.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm

Далее следует отредактировать /etc/yum.repos.d/remi.repo, установить enabled = 1, и запустить:

yum upgrade mysql-server

ATI Radeon X1650 и OpenSuSe 11.2 – засада

ATI Radeon x1650 series

Смеркалось. Наступили черные времена для владельцев старых карт ATI. Собственно, не такая уж и новость, однако, компания ATI прекращает выпуск новых драйверов для следующих видеокарт начиная с Catalyst 9.4 :

  • ATI Radeon 9500 Series
  • ATI Radeon 9550 Series
  • ATI Radeon 9600 Series
  • ATI Radeon 9700Series
  • ATI Radeon 9800 Series
  • ATI Radeon X300 Series
  • ATI Radeon X550 Series
  • ATI Radeon X600 Series
  • ATI Radeon X700 Series
  • ATI Radeon X800 Series
  • ATIRadeon X850 Series
  • ATI Radeon X1050 Series
  • ATI Radeon X1200 Series
  • ATIRadeon X1250 Series
  • ATI Radeon X1300 Series
  • ATI Radeon X1400 Series
  • ATIRadeon X1550 Series
  • ATI Radeon X1600 Series
  • ATI Radeon X1650 Series
  • ATIRadeon X1800 Series
  • ATI Radeon X1900 Series
  • ATI Radeon Xpress Series
  • ATI Radeon X2100 Series
  • Для тех, кто пользуется OpenSuSe, это означает, что последняя версия операционки, которая будет корректно работать с этими устройствами – это OpenSuSe 11.1 Начиная с OpenSuSe 11.2 даже и не пытайтесь ставить ATI-шные драйвера, т.к. с версией 11.2 идет XOrg 7.4, несовместимый с родными драйверами. Если хотите жить дальше с этими видюхами, пользуйтесь старой операционкой со всеми вытекающими последствиями (старый софт, невозможность совершать видеозвонки в Pidgin и т.п.); хотите OpenSuSe 11.2 – тогда придется использовать неродной драйвер Radeonhd, который пока довольно криво поддерживает 3D во многих из этих карт, в том числе и в моей. Новость неприятная, но такова жизнь, на официальном форуме OpenSuSe народ тоже возмущается

    Что-то после всего этого мне жутко разонравились видеокарты ATI, может пора переходить на NVida?