Wednesday, December 31, 2008

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

Ситуация самая простая: если есть коллекция музыки и видео в одном месте, то нет ничего глупее, чем таскать части коллекции за собой, как прицепившиеся колючки лопуха. Это кажется вполне очевидным, что удобнее to stream media files over a network, чем с грустью вспоминать, как последний альбом Eluveitie остался лежать дома, а на ступеньках парадного лед, который никто не желает убирать, а еще что Днепр зимой похож на Волгу, потому что проплыть по нему можно только на ледоколе. Вспоминать, что с неба сыпет белая дрянь, а по утрам, заканчивая завтрак, с особенной ненавистью поглядывать на последнюю страницу Коммерсанта, где напечатанная температура в Сиднее будит одновременно удрученность и поток проклятий на свой адрес.

Так вот. Чтобы не быть полевым хорьком, бегающим в зубах с flash дисками и dvd (навсегда и безнадежно устаревшей чепухой), нужно поднять RTP сервер для трансляции музыки и видео в то место, где ты находишься. Это, кажется, ясно решительно всем.

Проблемы начинаются, когда узнаешь, что divx/xvid файлы нужно перекодировать в нечто, поддающееся, говоря русским языком, seekable'льности по RTSP. Например, mpeg-4. Это касается фильмов; с музыкой проще, т.к. пустить по RTP mp3 файл можно достаточно легко и без всякой перекодировки, например, посредством live555MediaServer, который идет в качестве example в комплекте c liveMedia. В качестве домашнего задания читателю можно предложить упражнение по написанию простого web-каталога с генерацией списка коллекции в виде rtsp:// ссылок.

Какой RTP и RTSP сервер выбрать? Я провел очень плохой вечер копошась с ffmpeg и vlc, чтобы потом совершенно случайно узнать, что у меня vlc был собран без faac и faad2 и мой аккуратно сварганенный тестовый sample.mp4 (ffmpeg'ом и mp4creator'ом из mp3-файла) vlс игнорировал не потому что у него вредный характер, а потому что у кого-то кривые руки.

Впрочем, Darwin Streaming Server (DSS) есть давно в портах FreeLSD, и списком зависимостей, в отличие от ffmpeg и vlc, испугать не способен. Кроме того, многие клевещут, что с ним "все работает".

Ладно. Собираем порт, читаем pkg-message и хватаеся за сердце: Mozilla, Netscape4/7 and Opera etc... are not useful. DSS Administration Tool requires MSIE(4.5 and later) J-Script feature. Пробуем DSS Administration Tool из firefox и видим, что не все так страшно.

Когда я вижу конфигурационные файлы в xml (а /usr/local/etc/streaming/streamingserver.xml им в Darwin Streaming Server и является), то всегда вспоминаю теплые слова Торвальдса по поводу конфигурационных файлов Gnome:

In past discussions, I've seen people think that since I'm a "developer", I should use a text-editor to edit binary configuration files by hand (and anybody who calls XML "text" has drunk a bit too much of the cool-aid).

Не смотря на эту пакость с конфигурированием, DSS запускается без малейших проблем, а gmp4player и vcl счастливо запели мой sample.mp4.

После тяжелой 2-й Пунической войны, народ Рима, не успев вернуть солдат из легионов Спициона в Африке, по совету сената, тут же начал войну Македонскую. Точно так же, закончив с RTP сервером, я начал воевать с Windows Media Player.

Кому дорого свое время, наилучшим решением будет положить на WMP и пользовать для смотрения трансляций версию плеера vlc под Windows. Кому нужен лишний геморрой, будет запускать wireshark, смотреть как WMP посылает по RTSP метод DESCRIBE, читает красивый ответ от DSS с кодом 200, потом, полагая что вы совершенный идиот, попытается спросить ваш http-сервер о наличие sample.mp4 и после этого покажет окошко "с ошибкой", как всегда, дающее абсолютный нуль информации.

Гугление показывает, что WMP умеет streaming только для своих asf и wma, так что не поддавайтесь на рекламу "мы можем rtsp, мы можем mpeg-4". Mpeg-4 оно может только для локальных файлов. В году 2002-м родился enviviotv plugin для WMP, который якобы позволял играть mpeg-4 RTP поток из Darwin Streaming Server, о чем даже писали в Linux Journal. Сейчас от enviviotv на сайте envivio.com отстался только пресс-релиз, а plugin ушел куда-то глубоко под воду, исследовать темные глубины океана. Сегодня, какие-то веселые парни из Elecard Ltd предлагают Elecard AVC Streaming PlugIn for WMP всего за $40, так что если вдруг, то вы знаете что делать; я же скачал неясно какой свежести версию enviviotv.exe и теперь стал особенно восхищаться происходящим.

Во-первых, оно все равно не может распознать mp4 сэмпл'ы идущие в комплекте с Darwin Streaming Server, хотя играет мой sample.mp4 (поправка от 2009-01-03: распознает, если вместо rtsp://foo.bar говорить e-rtsp://foo.bar). Во-вторых, если не трогать настройки enviviotv, при попытке начать издавать звуки, скромный WMP вместе с Vista от радости мигает экраном и показывает вот такое окно:

20 KB

Мне оно очень нравится.

Лечится убиранием галочки с "Use DirectDraw overlays if available" в %SystemRoot%\System32\EnvivioTVSettings.cpl. Btw, EnvivioTVSettings.cpl пускать нужно с правами администратора. Пожалуйста, не спрашивайте меня, почему сделано так удобно, что настройки enviviotv бывают только system wide.

В-третьих, harm, который наносит enviviotv вашему WMP, выразится кроме всего прочего и в том, что при проигрывании локальных файлов mp4 вы получите задержку (буферизации?) как будто они вам передаются по RTP с таким сомнительным рвением, как в России поют гимн. Эй! Dude, который администрирует Linux в потасканном свитере. Да-да, вы. Я вас имею ввиду. Прекратите нам тут на весь зал выводить голосом про белую овечку и продукты Microsoft. Комментарии по этому поводу слушать сил никаких нету. Хотя, конечно, я согласен граждане, иногда, чувствуешь себя ежиком из анекдота.

Tuesday, November 4, 2008

Скверно сформулированный Спольски

Joel в своем о последнем опусе о StackOverflow так надулся от гордости, как петух после утреннего кукареканья, что умудрился из 3-х причин, по которым проект StackOverflow удался, проигнорировать самую главную из них.

3 фактора успеха, мне кажется, связаны были следующим образом:

(1) простота
 |
 |____(2) профессионализм

(3) игрушка

Пункт (1) в рассуждениях всеми нами любимого болтуна отсутствует. А он (пункт), к несчастью, главный. Даже если бы Jeff Artwood имел комманду из зеленых выпускников колледжа, шанс на провал был ничтожен, беря во внимание наличие пункта (3).

Именно удивительная техническая простота позволила игнорировать документацию и багтрекинг (на начальной стадии, сейчас то он у них появился). Если бы проект был навязан каким-то высокопоставленным идиотом из верхнего менеджмента (только потому, что тот хотел утереть нос старому ослу вице-президенту из отдела маркетинга), никакие мыльные намеки на going to take 6 to 8 weeks не выдержали бы на воздухе и 3-х секунд: был бы и жесткий график и контроль и бегающий с красными глазами и высунутым языком, как русская борзая за вальдшнепами, project manager.

Все это очень древние и миллион раз перекованные истины. Мы еще обязательно увидим клоны StackOverflow с рекламой в половину экрана горячих девушек, скучающих длинными зимними вечерами, где пытливые люди будут задавать вопросы как безопасно для здоровья украсть Windows Vista. Написаны клоны будут, разумеется, на омерзительном PHP, чтобы потом со сказочной скоростью расплодится во всю длину матушки России. О первых таких проектах напишут тысячи бесценных заметок в жиже и многие блоггеры страшно взволнуются.

Thursday, October 30, 2008

Ужасные новости

Какой шторм сейчас в fedora-devel-list. Страсти кипят, шипят, как масло на сковородке. Настоящая буря в стакане.

Висение иксов на tty1 вместо tty7 это, безусловно, крушение всех надежд. Падение Геллы в бурлящий пролив Босфора. Некоторым, правда, кажется, что обсуждение этого больше похоже на мужественную борьбу за тень осла, но таких несознательных людей мы слушать не будем.

Dax Kelson выступает перед пританами. Чело его взволновано, руки дрожат:

This specific Linux behavior is well documented in hundreds of thousand of publications ranging from college text books, HOWTOs, Linux books sold in retail stores, blogs, forums, guides, and training manuals. Making a change invalidates all that published knowledge.

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

Пользователь fedora:

(закрывая лицо руками)
Погиб я! О бесчестные, что поменяли tty7 на tty1!
Ради богов,
Примите плащ мой, я бегу.
(убегает, рыдая)

Saturday, October 11, 2008

Capturing output of Expect [send] command

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

Правильно сформулированный вопрос стоит так: я посылаю с [send] текст и желаю получить ответ не просто поймав его посредством [expect], но желаю иметь этот output в переменной для моей-не-скажу-для-чего прихоти.

Короткий ответ на такой вопрос будет такой: см. на переменную expect_out, которую заполняет [expect]. Это обычный Tcl array. Лучше всего понять, как он заполняется, это написать

flush stdout
parray expect_out

Где нибудь в конце вашего диалога со spawn'еной программой. Для окончательно ясности, напишем 2 скрипта: 1-й на sh, который будет программкой с которой будет работать 2-й скрипт, написанный на Expect.

% cat foobar.sh
#!/bin/sh

printf "Please enter your name: "
read name

[ -z "$name" ] && {
  echo "For what such secretiveness?"
  exit 1
}

echo -- Thank you, $name

Все что сделает наш второй Expect-скрипт, -- это избавит вас от утомительной работы по введению имени, которое потребует foobar.sh.

% cat foobar-expect.tcl
#!/bin/sh
# -*-tcl-*- \
# the next line restarts using expect \
exec expect "$0" "$@"

set cmd ./foobar.sh
set timeout 5
if {[catch {
  spawn -noecho $cmd
} r]} {
  puts stderr "$argv0 error: $r"
  exit 1
}

log_file -noappend temp-file
expect "Please enter your name: "
set name "Jeeves"
#set name ""
exp_send "$name\n"
expect {
  -re "Thank.* ${name}\r\n$" { puts "-- Yes, sir." }
  timeout {
      send_user "timeout because there was no prompt\n"
      exit 1
  }
}

flush stdout
parray expect_out

set status [wait $spawn_id]
if {[lindex $status 2] == 0} {
  exit [lindex $status 3]
}

Теперь запустим foobar-expect.tcl, чтобы окончательно разобраться с expect_out:

% ./foobar-expect.tcl
Please enter your name: Jeeves
-- Thank you, Jeeves
-- Yes, sir.
expect_out(0,string) = Thank you, Jeeves

expect_out(buffer)   = Jeeves
-- Thank you, Jeeves

expect_out(spawn_id) = exp4

$expect_out(0,string) содержит именно то, что мы поймали командой [expect] после [exp_send]. Чтобы посмотреть на полный диалог, загляните в появившийся файл temp-file, создаваемый командой [log_file].

Tuesday, October 7, 2008

Ужасы Firefox 3

Убил пол воскресенья на запоздалый переход с Bon Echo. В результате никто никуда не перешел, а моя кошка имела возможность весь день наблюдать, как я извергал проклятия на все что попадалось под руку, то есть на следующее:

  1. FreeBSD 7.0 с найсвежайшими портами, но несвежими установленными пакетами.
  2. Firefox 3.0.3 source code.
  3. Cairo 1.4.10.
  4. SQLite 3.6.3.

Нужно заметить, что Firefox я собираю всегда руками, а не ставлю из портов, традиция чего тянется еще с версии 1.0, когда для компилирования под FreeBSD требовалось терпение и выносливость, как у солдат армии Ксенофонтовского Кира. К чему, спрашивается, такой героизм и самопожертвования? Если быть честным, но всему виной давно потерявшее меру собственное занудство и маниакальное желании собрать Firefox как можно более легким. Но, не в этот раз.

gnash может заворачиваться в plugin для mozilla, но с условием, что он собран с gtk2. Firefox 2 у меня живет с gtk1, во-первых, потому что gtk1 быстрее 2-й версии, а во-вторых, потому что в нем отсутствует сглаживание шрифтов, которое я ненавижу каждой молекулой своих глаз. Понятно, что правильно воспитывая fontconfig сглаживание можно убирать, что я и делаю, чтобы радоваться emacs'у, собранному с gtk2, но это не мешает gtk1 оставаться good enough для Firefox. Раньше не мешало.

Стало быть, что мы делаем? Скачиваем Firefox 3.0.3 и чуточку редактируем спрятанный .mozconfig от Bon Echo? Ага, держите карман шире.

Выясняется, что тот nspr, что у меня уже установлен -- слегка outdated, nss -- тоже, Cairo им нужно версии 1.6, а sqlite, который оне полагают у меня есть, должен быть новее, чем самая самая последняя версия в портах FreeBSD. Ну, ради б-га, пускай берут все вышеперечисленное из своего tarball, раз оно там заботливо положено, да? Wishful thinking.

configure и последующий make идут так тихо и гладко, как капельки дождя по стеклу за окном. Вы делаете себе крепчайший кофе и вдыхаете свежий осенний воздух из открытой двери балкона, рассуждая, что октябрь и серенькое небо, несмотря на известные недостатки, обладают тем преимуществом, что дают возможность нажать на тормоз сумасшедшей машине жизни XXI века, чтобы безопасно выйти с нее и размять уставшие члены. Как там у Поупа:

Здесь листья лип оделись желтизной.
Давно ль они нам тень дарили в зной?
В тиши лесов хранит безмолвье птичий
Народ, презрев свой певческий обычай.
Утратив аромат, хоть слезы лей,
Поникли нежные цветы лилей.

Вы мечтательно потягиваетесь, кошка мирно посапывает на кресле рядом, капли дождя продолжают монотонно маршировать. Вы поворачиваетесь к xterm'у и обнаруживаете, что кое-кто на тормоз уже нажал, потому что make отвалилось с воплем ld о невозможности найти библиотеку sqlite, где-то после 5 минут компилирования.

Вы смотрите в чем дело и ничего не понимаете: sqlite оно уже собрало (тот что идет в комплекте с Firefox), путь для ld к библиотеке указан. Так какого же тогда дьявола? Вы лезете в порт FreeBSD чтобы посмотреть на возможные имеющиеся решения и видите патч который добавляет к опциям компиляции sqlite путь в CFLAGS, а для ld -- содержимое %%PTHREAD_LIBS%%. Не слишком обнадеживающе. Что там, кстати, у нас должно содержаться в %%PTHREAD_LIBS%%? Это лучше симулировать:

% cat Makefile.sample
PTHREAD_LIBS=-pthread
GECKO_PTHREAD_LIBS!=gcc -dumpspecs | grep -m 1 pthread | sed -e 's|^.*%{\!pg: %{pthread:|| ; s|}.*$$||'

foo:
       @echo '%%PTHREAD_LIBS%%' | \
                 sed -e 's|%%PTHREAD_LIBS%%|${PTHREAD_LIBS:C/-pthread/${GECKO_PTHREAD_LIBS}/}|'

% make -f Makefile.sample
-lpthread

Обратите внимание на элегантный способ получения из исходного коварного -pthread старого знакомого -lpthread. Клянусь Герой, чтение FreeBSD'шных портов доставить вам немало минут радости.

Короче говоря -- ничего такого полезного тот патч не приносит. Но мы его накладываем, говорим "авось", переконфигурируем Firefox, ждем минут 5 и опять наблюдает ругню ld.

Гм. Тут вам приходит на ум низкая мысль руками добавить в строчку компиляции -L/usr/local/lib, чтобы оно слилось в объятьях с системным sqlite. Хи-хи-хи, говорите вы голосом Юли Тимошенко, наблюдая за продолжением компиляции Firefox и потираете руки. Как бы не так.

Начинается какое-то совершенно неудобоваримые мямлянье от nss, прекратить которое у вас падает желание одновременно с понижением температуры кофе в чашке. На память приходят забытые образы сражений с Firefox 1.5.x, повторить которые вам хочется так же, как Киасакру подвергаться опасностям в преследовании ассирийцев, поэтому вы решаете поступить, как мидийский царь и возложить на кого-нибудь другого вытаскивание каштанов из огня, сиречь идете к порту FreeBSD, надеясь, что не капитальные изменение его вами удовлетворит ваше стремление и решат проблему с линкованием sqlite и дрянным поведением nss.

Тут оказывается, что несмотря на ваши ухищрения с минимизацией обновлений системы, гадкий порт настаивает, чтобы вы провели обновления cairo, потому что добродушные люди, писавшие bsd.gecko.mk добавили туда по умолчанию зависимость от системного cairo, когда вы хотите использовать тот, что идет в комплекте с Firefox. О боги, доживу ли я до этих дней, когда не нужно будет мне искать, как золото в руде, как жалкий, старый дуралей, блеск радости модификации, бурча всем атанде?

Косметически отделав порт, вы скептически говорите make и идете повторно делать кофе. Ища чем заняться и предвкушая gnash, вы думаете, что теперь сможете, наконец, снести никому не нужный gtk1. Приготовившись к самому худшему, вас озаряет почти что улыбкой окно xterm'а, где видно благополучное завершение компиляции. Как любит говорить один мой знакомый (по ничтожнейшим причинам вроде этой): жизнь налаживается.

Жаль, я так и не понял, как у Firefox с gtk2 одновременно указать шрифт Arial для всех диалогов и меню и LucidaTypewriter для URL bar. Стандартное в userChrome.css:

* {
       font-family: Arial !important;
       font-size: 9pt !important;
}
#urlbar {
       font-family: LucidaTypewriter !important;
       font-size: 9pt !important;
}

не помогает. Все равно в URL bar остается Arial.

Кто не знает, то теперь Firefox 3 игнорирует /usr/local/lib/browser_plugins, чтобы не упасть от plugins от прежних версий. Могли бы и снизойти, чтобы предупредить.

А еще Firefox 3 перестал поддерживать pkg-config. Очень удобно стало, например, собирать mplayerplug-in. Помните, что желала Берти Вустеру в детстве одна из его тетушек? Одеть на шею веревку с камнем и броситься в озеро. Именно это хочется посоветовать сделать тому, кто убедил девелоперов Firefox в бессмысленности pkg-config. В общем, как там у Поупа:

Струится ливень, и, полны печали,
поникли, птицы замолчали.
тем улыбка Делии одна
небу возвратить вольна,
природе прежнее обличье,
роз и пенье птичье.

Sunday, September 28, 2008

Прощай LiveJournal, желаю тебе провалиться в тартарары к чертовой матери

Начинаем новую жизнь. Впрочем, для ее рождения сначала нужно найти клиент blogger'a для emacs, иначе новорожденный погибнет от тоски.