любимое слово — свобода.

20090706

пересборка erlang R13B01 в debian lenny

в репозиториях debian lenny лежит erlang версии R12B3.
в testing-е (в данный момент) — R13B.
и лишь в unstable (в данный момент) — последняя версия с erlang.org — R13B01.

чтобы собрать пакеты для lenny, потребуются три файла со страницы http://packages.debian.org/sid/erlang:
$ cd /usr/src/
$ wget http://ftp.de.debian.org/debian/pool/main/e/erlang/erlang_13.b.1-dfsg-3.dsc \
http://ftp.de.debian.org/debian/pool/main/e/erlang/erlang_13.b.1-dfsg.orig.tar.gz \
http://ftp.de.debian.org/debian/pool/main/e/erlang/erlang_13.b.1-dfsg-3.diff.gz
/usr/src — это общепринятое место для сборки. чтобы рядовой пользователь мог писать в этот каталог, он должен входить в группу src (по крайней мере в debian это так).
имена актуальных на момент прочтения файлов имеет смысл брать непосредственно с вышеуказанной страницы.

для начала должны быть установлены по крайней мере пакеты build-essential и devscripts.
какие ещё пакеты понадобятся для сборки erlang-а, проще всего узнать методом «научного тыка».
итак, распаковываем исходники с одновременным наложением debian-овских патчей:
$ dpkg-source -x erlang_13.b.1-dfsg-2.dsc
$ cd erlang-13.b.1-dfsg
$ dch -i
у вас открылся редактор с уже загруженным файлом ./debian/changelog. и сразу же в нём добавился шаблон для новой записи. я привёл её первые строки к примерно такому виду:
erlang (1:13.b.1-dfsg-2.1-backport) stable; urgency=low

  * Non-maintainer upload.
  * backport to lenny
т.е., добавил в имя пакета слово «-backport» (не обязательно, но полезно), заменил «testing» на «stable» и вписал соответствующий комментарий.
после сохранения файла всё готово для сборки:
$ dpkg-buildpackage -sa
если каких-то пакетов не хватает, именно сейчас вы об этом и узнаете (улыбка).

после завершения сборки (процесс длительный) в каталоге /usr/src вы обнаружите собранные пакеты. установить их можно, как обычно, программой dpkg:
$ sudo dpkg -i пакет1 пакет2 …

p.s. ежели кто из читателей знает более короткое/правильное решение — you are welcome.

p.p.s. до встречи через 100000 секунд.

♺ man dpkg-source dch dpkg-buildpackage
http://wiki.debian.org/DebianRussian/DebinstPackages

20090705

select * from таблица;

это, ясное дело, sql.
а как оно будет звучать в случае mnesia (естественно, на erlang-е)? а примерно так:
mnesia:dirty_match_object(mnesia:table_info(таблица,wild_pattern)).

ввиду того, что eshell «больно вумный», и выдаст на такой запрос из большой таблицы всего несколько строк, лучше просматривать порционно, записей, например, по десять::
lists:sublist(mnesia:dirty_match_object(mnesia:table_info(таблица,wild_pattern)),1,10).
lists:sublist(mnesia:dirty_match_object(mnesia:table_info(Table,wild_pattern)),11,10).
и т.д.

краткая расшифровка:
mnesia:table_info(Table,wild_pattern).
возвращает шаблон для получения записей для заданной таблицы Table. фактически — это запись (кортеж), в которой первым элементом идёт название самой таблицы, остальные элементы — анонимные переменные '_' в нужном количестве.
mnesia:dirty_match_object(шаблон)
это, собственно, и есть поиск по шаблону. а так как полученный с помощью table_info шаблон содержит только анонимные переменные, то, в переводе на sql это означает, что условие where мы не задали (или задали where true (улыбка)), и в результате получим _все_ строки таблицы.
почему dirty? а это чтобы с транзакциями не заморачиваться. зачем, спрашивается, нужна транзакция при выборке данных?

p.s. ежели кто из читателей знает более короткое/элегантное решение — you are welcome.

p.p.s. до встречи через 100000 секунд.

♺ man -erl mnesia lists

20090704

show tables;

это sql. а как узнать список таблиц mnesia (естественно, на erlang-е)?

вариант 1.
mnesia:info().
заметный недостаток: выводится ещё много (в данный момент ненужной) информации.

вариант 2.
mnesia:system_info(tables).
недостаток: если таблиц много, список обрезается.чтобы список был полным, можно добавить немножко «обвязки»:
lists:foreach(fun(X)->io:fwrite("~s~n",[X])end,mnesia:system_info(tables)).
краткая расшифровка:
lists:foreach(функция,список).
применение функции к каждому элементу списка.
io:fwrite(шаблон,данные).
вывод данных согласно шаблону.

p.s. ежели кто из читателей знает более короткое/элегантное решение — you are welcome.

p.p.s. до встречи через 100000 секунд.

♺ man -erl mnesia lists io

20090703

подключение к ejabberd. часть 2.

в предыдущем посте из серии 100000 речь шла о подключении к локальному узлу ejabberd@машина.
для того, чтобы удалённо подключиться к erlang-узлу с таким именем, нужно чтобы имя «машина» разрезолвилось в нужный ip-адрес. проще всего — добавить строку
ip-адрес машина
в файл /etc/hosts.

проверяем резолвинг:
$ host машинамашина has address такой-то

подключаемся:
$ erl -sname новый_узел -setcookie <cookie> -remsh ejabberd@машина
пояснения смотрите в предыдущем посте

p.s. ежели кто из читателей знает более лучшее/универсальное решение — you are welcome.

p.p.s. до встречи через 100000 секунд.

♺ man hosts host hostname

20090702

подключение к ejabberd.

для начала нужно узнать erlang-cookie, используемый узлом (node) ejabberd. сам узел по умолчанию так и называется: «ejabberd@машина».
где находится cookie? скорее всего — в домашнем каталоге пользователя, от имени которого запущен ejabberd. а запущен он, скорее всего, от имени пользователя ejabberd. смотрим выдачу
$ ps aux|grep ejabberd
первым полем и будет имя пользователя, от имени которого запущен процесс (тавтология в компьютерных науках, увы, практически неодолима).
узнать домашний каталог пользователя проще всего так:
getent passwd пользователь
предпоследнее поле (поля разделены двоеточием) и будет искомым каталогом. в нём должен лежать файл «.erlang.cookie». на содержимое этого файла я в дальнейшем буду ссылаться так: <cookie>

теперь собственно подключение.
на той же машине, где крутится ejabberd, подключиться к нему можно так:
$ erl -sname новый_узел -setcookie <cookie> -remsh ejabberd@$(hostname -s)
что такое «новый_узел»? просто какое-нибудь уникальное имя. например, «n0».
что такое «$(hostname -s)»? подстановка (средствами bash-а) результата выполнения команды «hostname -s», которая возвращает короткое имя машины. чаще всего узел, на котором работает ejabberd, называется именно по короткому имени. уточнить можно по выводу ps (см. выше): если среди аргументов присутствует -sname — используется короткое имя машины, если -name — полное (возвращаемое командой hostname без опции -s).
небольшое отступление. допустим, полное имя машины — «машина.domain.org». короткое имя — «машина». так вот ejabberd, скорее всего, запущен на узле «ejabberd@машина». и обращаться к нему следует именно так. а узел «ejabberd@машниа.domain.org» — это уже будет совершенно другой узел.
вот, собственно, и всё подключение.

p.s. ежели кто из читателей знает более лучшее/универсальное решение — you are welcome.

p.p.s. до встречи через 100000 секунд.

♺ man erl ejabberd hostname getent ps grep bash

20090701

серия 100000

ровно в 1246500000 секунд от начала эпохи unix в этом блоге появится первый пост из несуществующей пока серии 100000.
почему 100000? потому что планирую в дальнейшем раз в сто тысяч секунд публиковать очередной пост из этой серии.
формат этих постов будет выдерживаться в духе «простое решение маленького вопроса».
так как в данный момент в ареале моих интересов расплодились всякие erlang-и с mnesia-ми, именно о них речь поначалу и пойдёт.

p.s. получить текущее время в секундах с начала эпохи unix:
$ date +%s
получить время в человеческом формате из секунд с начала эпохи unix:
$ date -d @секунды
например, время выхода первого поста из серии 100000:
$ date -d @1246500000

♺ man date

20090612

коррупция, головотяпство и разгильдяйство в одной коробке

1. набор спо для школ рассылают вместе с набором проприетарщины.
2. два ключевых установочных диска сделаны незагражающимися.

подробнее:
в блоге у Алксниса
в блоге у Новодворского