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. В общем, как там у Поупа:

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