Mercurial

Минимальная инфраструктура для работы с распределенной системой контроля версий Mercurial настраивается следующим образом.

Во-первых, нужно где-то разместить репозитории. Поскольку никаких других рекомендаций не поступало, по аналогии с cvs и svn будем класть все в /srv/hg/repos. Во-вторых, нужно обеспечить теперь доступ разным пользователям, которые счастливо существуют на компьютере и что-то там делают. Основная инструкция тут: http://mercurial.selenic.com/wiki/MultipleCommitters. Краткая инструкция: по аналогии с cvs и svn, создаем системную группу hg, системного пользователя hg, добавляем всех пользователей в группу hg.

Схема создания нового репозитория выглядит следующим образом:
cd repos/
mkdir test
chown -R hg:hg test
cd test/
hg init
chown -R hg:hg .hg
chmod -R g+w .hg
chmod g+s .hg .hg/store .hg/store/data

Mercurial >1.0 сам, о чудо, разбирается с правами доступа и делает так, чтобы все кому надо могли туда писать. Вообще говоря, данный подход (пулить всем вместе в один репозиторий) полностью противоречит идеологии hg.

В-третьих, никак не обойтись без веб-интерфейса. В /usr/share/doc/packages/mercurial живет пример под названием hgweb.cgi. Кладем его в /srv/hg/bin/hgweb.fcgi и меняем примерно следующим образом (чтобы через FastCGI работал):
#!/usr/bin/python

config = "/srv/hg/config"

from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb, wsgicgi
from flup.server import fcgi
application = hgweb(config)
fcgi.WSGIServer(application).run()

Конфигурация для lighttpd (обычно кладется куда-нибудь в /etc/lighttpd/vhosts.d/hgweb.conf):
fastcgi.server += (
        "/hg" => ((
                        "bin-path" => "/srv/hg/bin/hgweb.fcgi",
                        "socket" => socket_dir + "/hgweb.sock",
                        "max-procs" => 1,
                        "check-local" => "disable",
                        "fix-root-scriptname" => "enable",
        ))
)

Что писать в /srv/hg/config подсказывают в hg help hgweb:
[paths]
/ = /srv/hg/repos/*
/home/user = /home/user/hg/**

Последняя строчка для того, чтобы пользователям было не обидно, там они хранят свои личные репозитории. Вот только . Поля "Description" и "Contact" настраиваются в .hg/hgrc персонально для каждого репозитория. Кроме того, теперь через http возможно анонимное клонирование.
В openSUSE перерабатывают страницу software.opensuse.org и придумали полезную вещь, встраиваемый в веб-страницы виджет с информацией о пакетах; инструкция здесь.

Выглядит примерно так:

postifx в SuSEconfig


В openSUSE 12.1 postfix был откручен(750685) от SuSEconfig, поэтому запускать тот самый волшебный скрипт теперь надо так:
MD5DIR=/var/adm/SuSEconfig/md5 /usr/sbin/SuSEconfig.postfix

Все остальное работает как раньше: /etc/sysconfig/postfix, /etc/sysconfig/mail остаются в силе. Базы алиасов пересобираются сами при rcpostfix restart.



Режим EPP для Winbond W83627D

Попался компьютер (с Intel Atom), в котором, не смотря на все установки в BIOS, LPT-порт не попадал в EPP-моду. Симптоматика стандартная — EPP-timeout не сбрасывается. Оказалось, что контроллер W83627D, несмотря на все установки BIOS, оставался в ECP-моде, либо сбрасывался туда по какой-то причине.

Данный контроллер имеет служебный режим и его можно переключать в нужную моду прямо на ходу. Ничего не взломав, не сломав и не испортив, в интернете можно даже найти его полное описание, где все нужные команды содержатся. Кроме того, полезной подсказкой является кусок исходников ядра Linux, а именно parport_pc.c.

Запуск enable_epp добавляется например в udev.

Книги по C++

За последний месяц уже два человека спросили какие книжки читать чтобы изучить C++.

Обращение к незнакомцу.
Если вы владеете C++ в совершенстве, данный пост может глубоко задеть ваши религиозные или иные чувства. Мне бы этого очень не хотелось, поэтому чтобы избежать этого — не стоит продолжать чтение. Спасибо за внимание.


Во-первых, новый стандарт (C++11) выпустили, а книжек по новому стандарту пока еще мало написали. Но в этом поможет краткий справочник на странице Страуструпа.

Во-вторых, есть такой двухтомник:
  • Брюс Эккель — Философия С++. Введение в стандартный С++
  • Брюс Эккель, Чарльз Эллисон — Философия С++. Практическое программирование
Кстати, в оригинале называется более красиво — "Thinking in C++". После прочтения, по-идее, должно сформироваться «приятное внутреннее ощущение понимания».

В-третьих, конечно же есть:
  • Бьерн Страуструп — Язык программирования С++
  • Николай Джосьютис — C++. Стандартная библиотека
Первая книга в представлении не нуждается (кто такой Страуструп можно посмотреть в википедии), вторая — очень толковый справочник по стандартной библиотеке, повествующий что и как с ней можно сделать.

В-четвертых:
  • Андрей Александреску — Современное проектирование на С++
У человека, который прочитал предыдущие четыре позиции, почти наверняка вызовет бурные эмоции.

В-пятых:
  • Дэвид Вандевурд, Николай Джосьютис — Шаблоны C++. Справочник разработчика
  • Герб Саттер — Решение сложных задач на С++
  • Герб Саттер — Новые сложные задачи на C++
  • Герб Саттер, Андрей Александреску — Стандарты программирования на С++
  • Эрих Гамма, Ричард Хельм, Ральф Джонсон и Джон Влисседс — Приемы объектно-ориентированного проектирования

Обновление, в-шестых:
  • Стивен Прата - Язык программирования C++. Лекции и упражнения, 6-е издание
  • — перевод оригинального названия "C++ Primer Plus" весьма спорен. Вы где видели конспект лекций на 1200 страниц печатного текста? Тем не менее, в новом издании автор не только рассказал о почти всех нововведениях C++11, но и еще постарался объяснить зачем все это надо и как этим пользоваться.

Все книжки есть (или были) в магазинах или в библиотеке.

ESO Midas 11SEP1.2

Отправил собираться новую версию.

Заодно осилил source service для build service. Первый приз получает сервис под названием download_files (надо в файл _service в проекте воткнуть вот это):
<services>
  <service name="download_files">
  <param name="recompress">yes</param>
  </service>
</services>

Он не просто прочитает spec-файл и попытается скачать все файлы для которых там есть полный url в строчке Source, он к тому-же (это же чудо!) перепакует их сам в нужный формат и сам разберется что скачивать. Например, допустим, Source0 указан вот так: ftp://ftp.eso.org/pub/midaspub/11SEP/sources/%{version}.tar.bz2, при этом на самом сервере нет архива tar.bz2, там есть только tar.gz. Так вот, умный сервис скачает такой архив, который там физически есть, и перепакует его в такой, который нужен.

Документации (как и во всем opensuse) нет, поэтому предлагается смотреть в /usr/lib/obs/service и там можно прочитать в исходниках какие сервисы есть, какие у них параметры и что делают.

p.s. Вообще, считаю, следующий гениальный шаг будет когда build service научится сам автоматически отслеживать хранилища типа PyPi, CPAN, etc и автоматом собирать новые пакеты и пересобирать обновленные. Закоммитил ты свой модуль новый питонный в PyPi, а он через 15 минут уже есть для opensuse в виде пакета. Красота.

PAM и ssh-agent

Захотелось, чтобы можно было входить в систему, используя пароль от ssh-ключа, и при этом чтобы ssh-agent запускался и больше пароль никогда не спрашивал. Все это можно сделать используя модуль pam_ssh для PAM (Pluggable Authentication Modules for Linux).

Настроить его очень просто: надо воткнуть в auth
auth    sufficient      pam_ssh.so
а в session, соответственно
session sufficient      pam_ssh.so

В PAM модули работают как и везде: динамически загружается .so-файл, и запускаются у него функции с наперед известными именами, куда передаются разные параметры, с которыми модуль знает что делать. Первая строчка, таким образом, ответственна за проверку пароля к ssh-ключу, вторая строчка — запуск правильного процесса ssh-agent.

Запуская ssh-agent, pam_ssh.so делает в ~/.ssh файл с именем в духе agent-$HOSTNAME и содержанием вида:
SSH_AUTH_SOCK=/tmp/ssh-qjtjCQkp2852/agent.2852; export SSH_AUTH_SOCK;
SSH_AGENT_PID=2853; export SSH_AGENT_PID;
echo Agent pid 2853;

Вообще говоря, после этого можно в .profile или .bashrc просто выполнить этот файл как кусок скрипта. После этого нужные переменные среды окружения будут иметь нужные значения и ssh правильно подцепит свой агент. Однако, в PAM предусмотрен модуль pam_env ответственный за установку переменных среды окружения. Автоматом почему-то ничего не заработало, но заработало после добавления в /etc/security/pam_env.conf строчек:
SSH_AUTH_SOCK DEFAULT="" OVERRIDE=@{SSH_AUTH_SOCK}
SSH_AGENT_PID DEFAULT="" OVERRIDE=@{SSH_AGENT_PID}