shadow-utils vs. pwdutils

Существуют два пакета утилит: shadow-utils и pwdutils (применяется в SUSE). Служат они для одной цели — редактирования групп и пользователей, но при этом значения набора параметров отличаются. Среди шестерки утилит user{add,mod,del} и group{add,mod,del}, к счастью, наблюдается некоторая систематика.

В shadow-utils следующие параметры имеют всегда одинаковое значение (в pwdutils отсутствуют, если явно не указано обратное):
КлючЗначение
-Dизменяет значения по умолчанию
-Kkey=value для значений по умолчанию
-Rзапускать в chroot
-Zпользователь SELinux

При этом ключи pwdutils другое (в shadow-utils отсутствуют, если явно не указано обратное):
КлючЗначение
-DDN для LDAP
-Pпуть к /etc/passwd и /etc/shadow

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

С проблемами первой условной группы можно было бы бороться используя явные длинные названия. Это делает скрипт более длинным, но и более явным. Однако, для -e длинные варианты отличаются: --expiredate и --expire.

useradd

КлючShadowPwd
-Mне создавать /homeнет
-Nне создавать группу пользователюнет
-Uсоздать пользователю одноименную группумаска umask для домашней директории
-bбазовый каталог, вместо /homeнет
-lне добавлять в lastlogнет

usermod

КлючShadowPwd
-Aнетдобавить в группу (аналог -a -G)
-Rзапускать в chrootудалить из группы
-a(вместе с -G) добавить в группунедокументированный

groupadd

КлючShadowPwd
-fне ругаться, если группа уже естьнедокументированный

groupmod

КлючShadowPwd
-Aнетдобавить пользователя в группу
-Rзапускать в chrootудалить пользователя из группы
-nпереименоватьнедокументированный

Трансляция видео

Трансляция видео потока делается следующим образом. Понадобятся ffserver и ffmpeg. Первый для непосредственно формирования и отдачи потока, второй для получения видео и аудио из нужных источников.

У ffserver есть документация: http://ffmpeg.org/ffserver.html, что хорошо. Понадобится только понять как настроить ffserver.conf и потом его скормить на запуске. Пример с описанием есть например тут: http://ffmpeg.org/sample.html. Внутри есть два основных понятия: feed — это то чем кормит сервер запущенный ffmpeg и stream — это собственно поток, который отдается через HTTP (порт тоже задается в конфигурационном файле) в нужном формате. Ну и есть такой псевдо-фид как status, который показывает HTML-страницу со статусом сервера: количество соединений, статус фида и потоков.

Настраивать потоки можно как хочется, но соразмерно с возможностями кодеков и аппаратуры. Кстати, вместо AudioCodec mp3 надо писать AudioCodec libmp3lame, но авторы об этом почему-то умолчали. И видео через theora тоже не умеет по какой-то причине. При этом все сообщения об ошибках обычно настолько туманны, что понять в чем дело не помогают ни чем.

После чего ffserver запускается, ему скармливается нужный конфигурационный файл, и начинается второй акт этой пьесы. Вообще говоря, выглядит просто: надо запустить ffmpeg, подав ему на вход собственно аудио и/или видео, а выход отправив по адресу вашего фида (например http://localhost:8090/feed1.ffm). Но при промахе с параметрами чрезвычайно бесполезные сообщения об ошибках не помогут понять в чем дело.

Дальнейшее зависит от конкретного оборудования. У меня была веб-камера со встроенным микрофоном. Микрофон работает как usb-аудио карта, видео через — video4linux2:
ffmpeg -f alsa -i hw:1 -f video4linux2 -s 320x240 -r 15 -i /dev/video0 http://localhost:8090/feed1.ffm
Где -f alsa -i hw:1 — alsa на устройстве номер "1" (системная звуковая карта стало быть — "hw:0"), -f video4linux2 -s 320x240 -r 15 -i /dev/video0 — формат и количество кадров в секунду должны быть согласованы с настройками потока из ffserver иначе ничего не выйдет. Кроме того, параметры -s и -r нужно писать до -i, а не после.

После того, как ffmpeg успешно запустился и начал показывать статусную строку типа
frame= 7209 fps= 15 q=3.5 size=   35632kB time=480.47 bitrate= 607.5kbits/s
можно открывать, смотреть и слушать поток по тому адресу, который заказан в ffserver.conf.



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, но и еще постарался объяснить зачем все это надо и как этим пользоваться.

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