12/29/2008

brainfuck: X.org и HAL

После обновления X.org сервера до версии 1.5.3, и его перезапуска обнаружилось, что клавиатура и мышка напрочь отказываются работать. Причем зависания были такими, что систему привести в чувства можно было лишь при помощи Magic Sysrq клавиш.

Все оказалось очень просто, разработчики X.org'a решили отдать всю работу с устройствами ввода, на откуп подсистеме hal (Hardware Abstraction Layer).

Теперь для того, чтобы заработали иксы, нужно демону hal сказать, как управляться с устройствами. Для этого нужно создать файл /etc/hal/fdi/policy/10-x11-input.fdi
с вот таким вот содержанием:

<?;xml version="1.0" encoding="UTF-8"?>
<deviceinfo version="0.2">
<device>
<match key="info.capabilities" contains="input.mouse">
<merge key="input.x11_driver" type="string">evdev</merge>
</match>

<match key="info.capabilities" contains="input.keyboard">
<!--merge key="input.x11_driver" type="string">evdev</merge> -->
<merge key="input.xkb.model" type="string">evdev</merge>
<merge key="input.xkb.rules" type="string">xorg</merge>
<merge key="input.xkb.layout" type="string">us,ru</merge>
<merge key="input.xkb.variant" type="string">,winkeys</merge>
<merge key="input.xkb.options" type="strlist">grp:toggle,grp_led:scroll</merge>
</match>
</device>
</deviceinfo>



Все эелементы этого XML файда соттветствуют секциям InputDevice для мышки и клавиатуры из конфигурационного файла X.org. Следовательно, эти секции из конфиг файла иксов можно удалить.

По умолчанию иксы все равно пытаются получать информацию об устройствах ввода из своего конфиг файла, и тогда начинается просто кошмар. У меня в системе курсор начинает метаться по экрану, и клавиатура перестает работать.Чтобы это вылечить, нужно указать иксам получать устройства от hal. Делается это с помощью добавления в конфиг файл X11 (/etc/X11/xorg.conf) дополнительной секции:

Section "ServerFlags"
Option "AutoAddDevices" "False"
EndSection

Однако, у меня так и не получилось заставить иксы переключать раскладку клавиатуры, на русский, хотя правила для этого определены.

Вот костыль, который я применяю, для решения этой проблемы:
после рестарта иксов, установить правило для переключения раскладки через xkb:
setxkbmap -layout "us,ru(winkeys)" -option "grp:switch,grp:toggle,grp_led:scroll"
Ввиду того, что комп я перезагружаю очень и очень редко, то это мне это не очень сильно мешает.

И все таки, проблема так и остается не решенной. Если у кого-то получилось ее решить, отпишите пожалуйста.

P.S. Разработчикам, конечно видней, но вот зачем было переходить с использования удобного и понятного конфигурационного файла, на использования не очень внятного xml, мне совершенно непонятно. Ведь удобство пользователя должно цениться превыше всего,
а мучиться пол дня с этим HAL как то совсем не хочется.

12/26/2008

Удаленное редактирование файлов.

С помощью Emacs можно редактировать файлы не только на локальном компьютере, но и на удаленном компьютере. Вот краткий список поддерживаемых протоколов:
smb, rsh, ssh, fttp, sftp.

Для редактирования в конфиг емакса нужно добавить:
(require 'tramp)

В общем случае чтобы открыть файл или каталог на удаленной машине необходимо выполнить команду открытия файла:
C-x C-f

и в качестве пути прописать:
/method:username@remote_host:/remote/path

где, method - это тип протокола, может быть ssh, ftp, rsh

Например для того чтобы для отредактировать файл через ssh от имени пользователя root нужно написать путь так:

/ssh:root@192.168.0.2:/etc/X11/xorg.conf

Более подробно об удаленном редактировании файлов можно почитать на официальной страничке tramp'a.
http://www.gnu.org/software/tramp/

12/25/2008

Несколько полезных фишек в Emacs.

Обычно в исходном коде, вашем или чужом, частенько встречаются комментарии, типа:
// TODO: сделать это.
// FIXME: переписать этот кусочек кода.
Для того, чтобы emacs выделял такие ключевые слова в комментариях, необходимо ему указать это в конфиге:

(add-hook 'c-mode-common-hook
(lambda ()
(font-lock-add-keywords nil
'(("\\<\\(FIXME\\|TODO\\|BUG\\):" 1 font-lock-warning-face t)))))

Так же бывает очень удобно, когда текстовый редактор автоматически дополняет открывающую скобку закрывающей, и ставит курсор внутри скобок.
Чтобы заставить Emacs так делать, нужно добавить в конфиг файл следующие строки:

(defun insert-second-hook ()
(interactive)
(insert "()")
(goto-char (- (point) 1)))
(global-set-key (kbd "\(") 'insert-second-hook)

12/07/2008

Удобство отладки.

Не секрет, что очень много времени программист использует для отладки своих программ.
В Линукс, для отладки приложений пользовательского уровня используется интерактивный отладчик GDB. По умолчанию, GDB предполагает использование интерфейса командной строки, что для некоторых представляется очень и очень неудобным, и вообще...
И вообще такие люди говорят:" Вот бы нам такой отладчик. как в Visual Studio!".
На самом деле для GDB очень давно существует подобный интерфейс.
И, как вы уже наверное догадались, для этого нам понадобится "текстовый редактор" Emacs.
Итак начинаем отладку.
Запустим Emacs в каталоге с программой, которую собираетесь отлаживать. Так же было бы неплохо, чтобы в этом же каталоге лежали еще и исходные тексты.
Для активизации режима отладки, нужно в минибуфере набрать gdb.
На что вы получите примерно следующее приглашение:
Run gdb (like this): gdb --annotate=3 main.
В большинстве случаев этого достаточно.
Жмем Enter, и после этого опять же в минибуфере, активируем много-оконный режим:
M-x gdb-many-windows
после активации получится примерно следующее:

В центре исходник вашей программы.Слева вверху - консоль GDB. Справа, рядом с ней список отображающий значения регистров или переменных. Внизу слева - Стек. Справа - список точек останова программы.
Итак, поехали. Для запуска программы пожно либо написать в консоли gdb start, либо воспользоваться соответствуюим пунктом из меню GUD.
Точки останова можно ставить как с помощью консоли, так и с помощью мыши, просто кликнув на серой полоске (не знаю как она называется по научному) около понравившейся строки:
Все понятно и наглядно представлено. Более того, если устновить курсор на какую-нибудь переменную, и нажать на кнопку P на панели инструментов, то распечатается значение этой переменной. Точно таким же образом можно наблюдать за состоянием переменной, установив Watchpoint. С помощью той же панели инструментов можно побродить вверх и вниз по стеку. Можно с помощью удобных кнопочек осуществлять пошаговую отладку.
В общем весьма удобно и по функционалу ничем не хуже, чем Visual Studio.
З.Ы. Кому интересно, предлагайте, допишу что нибудь еще.

12/06/2008

Удобный просмотр мануалов.

Любой пользователь линукс знает, что без мануало эту систему использовать тяжеловато, а пользоваться командной строкой практически невозможно.
Чтобы посмотреть мануал (руководство) по какой-нибудь программе, необходимо использовать команду man.
Например команда man ls, отобразит всю необходимую информацию о команде ls.
Бывает так, что не всегда известно, по какой команде или какой функции нужен мануал, и часто приходится использовать поиск по коллекции документации:
команда man -k keyword будет искать keyword в текстах мануалов.
Но пост не об этом.=) Пост о среде редактирования Emacs.
Да, да Emacs'ом весьма удобно просматривать маны, для этого существует два режима:
собственно man-mode и woman
Наиболее удобным лично для меня является woman.
Если в исходном тексте программы у вас курсор установлен на какой либо функции, то
набрав M-x woman можно посмотреть ман по этой функции, причем если манов несколько, то Emacs предложит выбрать наиболее подходящий.
Руководства прекрасно отображаются как на русском, так и на английском языке.
Работает навигация не только по ссылкам, в разделе "Смотрите также", но и по любым подсвеченным словам, если для них имеется ман страницы.
Если вы не знаете какую конкретно страницу нужно посмотреть, можно воспользоваться авто дополнением. Нажатие клавиши TAB выведет полный список всех доступных страниц.
У меня все.
P.S. Вот так это все выглядит:

11/19/2008

Управленеи квотами

Немного информации:

1. Что такое квотирование?

Квотирование позволяет ограничить два аспекта использования диска: количество файлов, которыми владеет пользователь или группа пользователей; и количество блоков диска, которые может использовать пользователь или группа пользователей. Квотирование определяется, как для каждого пользователя, так и для каждой файловой системы. Если у вас несколько разделов, то квоты нужно определить для каждого раздела, в котором пользователь намеревается создавать файлы.

2. Программное обеспечение

В зависимости от дистрибутива, у вас может быть, а может и не быть установлено программное обеспечение для поддержки квотирования. В этом случае, вы можете загрузить исходные тексты отсюда:
ftp://ftp.funet.fi/pub/Linux/PEOPLE/Linus/subsystems/quota/all.tar.gz

3. Установка

Пересоберите ядро с поддержкой квот. А дальше все написано в мануалах.

А теперь главное:

Как быстро определить закончилась квота у пользователя или нет? правильно, командой quota или repquota! А как увеличить квоту? правильно, командой setquota! а как все это делать быстро? а вот это мы сейчас и рассмотрим


#!/bin/sh
echo "Программа проверки пользовательских квот"
echo "Введите имя пользователя"
read USR # прочитали имя пользователя
MAIL=$USR@local # написали почтовый адрес
TEXT="Обратите внимание на содержимое вашей папки" # текст письма
RESULT=`repquota -u -a |grep $USR` # смотрим какой размер квоты у пользователя
USED=`echo $RESULT | tr -s ' ' ':' | cut -d : -f 3` # смотрим сколько место у пользователя затрачено
QUOTA=`echo $RESULT | tr -s ' ' ':' | cut -d : -f 5` # вообще вся его квота
MINQUOTA=$((QUOTA*90/100)) # минимальный размер квоты = 90% от квоты
NQUOTA=$((QUOTA*110/100)) # новый размер квоты = старая +10%

if [ $USED -ge $MINQUOTA ]; # если затрачено 90% и более, то
then setquota -u $USR -a 0 $NQUOTA 0 0; # устанавливаем размер квоты в 110%
echo "Изменен размер квоты" | mail -v -r "root@local" -s $TEXT -S smtp=192.168.11.15 $MAIL # от правляем письмо с уведомлением
echo "Установлена квота размером: " $NQUOTA;
exit;
else # если использовано менее 90% то все ок!
echo "Использовано: " $USED;
echo "Всего: " $QUOTA;
exit;
fi

11/18/2008

Задачки на собеседованиях

Встречаются 2 человека :
- Привет!
- Привет!
- Как дела?
- Хорошо. Растут два сына, дошкольника.
- А сколько им лет?
- Произведение их возрастов равно числу голубей около этой скамейки.
- Этой информации мне не достаточно...
- Старший похож на мать.
- Вот теперь я знаю ответ на свой вопрос.
Вопрос: сколько лет сыновьям?
(Задача была на олимпиаде для пятиклассников в этом году).

11/16/2008

Читайте маны, господа.

Читая документацию к программе Google Earth наткнулся на очень интересную вещь. Оказывается, в этой программе есть АвиаСимулятор. Запускается он с помощью комбинации клавиш, Ctrl+Alt+a.
С помощью имитатора полета можно прилететь в любую точку на земном шаре.
В качестве устройства ввода поддерживается Мышка, клавиатура и джойстик.

11/12/2008

Украшаем Bash

Вдруг если кому то надоело стандартное приглашение bash, то можно его несколько приукрасить. Итак, читаем документацию по баш (кстати это очень удобно делать с помощью emacs'a), и открываем для себя переменную PS1, значение этой переменной, интерпретируется как основное приглашение командной строки.
Цвета символов терминала обозначаются с помощью следующих числовых кодов:
#Black 0;30 Dark Gray 1;30
#Blue 0;34 Light Blue 1;34
#Green 0;32 Light Green 1;32
#Cyan 0;36 Light Cyan 1;36
#Red 0;31 Light Red 1;31
#Purple 0;35 Light Purple 1;35
#Brown 0;33 Yellow 1;33
#Light Gray 0;37 White 1;37

На самом же деле в терминале они задаются с помощью хитрых escape -последовательностей. Для простоты можно обозначить цвета с помощью переменных:
RED="\[\033[0;31m\]"
YELLOW="\[\033[1;33m\]"
L_BLUE="\[\033[0;36m\]"
EMPTY="\[\033[0m\]"

Теперь настраиваем приглашение:

export PS1="$RED[$YELLOW\A$RED] $L_BLUE\u@\h:\w >$EMPTY "

По порядку слева на право:
export PS1 - экспортируем переменную, PS1, равную вот такой длинной строке.
$RED[ - устанавливаем цвет в красный, и печатаем открывающую скобку
$YELLOW\A - устанавливаем цвет в желтый, и выводим текущее время в HH:MM формате. Более полный список последовательностей можно посмотреть в секции PROMPTING в документации по bash.
$RED] устанавливаем цвет в красный, и печатаем закрывающую скобку
$L_BLUE\u@\h - устанавливаем цвет в голубой что ли ), и выводим имя пользователя@имя_хоста.
:\w>$EMPTY - затем выводим полный путь к текущему каталогу и символ ">", после которого сообщаем bash'у, что все остальные символы ни каким цветом раскрашивать не надо.
Вот собственно и все.
Более подробную информацию можно почерпнуть из манула.
А выглядит это примерно так:

Базовые настройки Emacs

При каждом запуске Emacs, в отдельном буфере (про буферы я расскажу позже), постоянно выскакивает надоедливая заставка.
Ее можно отключить, добавив в конфигурационный файл строчку:
(setq inhibit-startup-message t)

При наборе ошибочной команды, или при возникновении ошибочной ситуации Emacs постоянно (надоедливо) пищит. Его можно попросить визуально сообщать о возникновении ошибки:
(setq visible-bell t)

На моей системе (Gentoo Gnu/Linux), Emacs использует не очень красивый шрифт, следующая строчка будет радовать глаз пользователя, при условии что описанный шрифт установлен в вашей системе:
(set-default-font "Bitstream Vera Sans Mono-11")

Меня также очень напрягает писать код на белом фоне. Чтобы изменить цвет фона запишем:
(set-background-color "wheat3")

Для того, чтобы Emacs подсвечивал выделенные текст, между двумя метками (по умолчанию он этого не делает), необходимо ему сказать:
(setq transient-mark-mode 1)

Так же целесообразно было бы изменить и цвет выделения:
(set-face-background 'region "gray85")

Для себя, выставил размер запускаемого окна шириной в 81 символ и высотой в 50 символов:
(setq default-frame-alist (append (list
'(width . 80) ; Width set to 81 characters
'(height . 50)) ; Height set to 60 lines
default-frame-alist))

Также весьма удобно, чтобы Emcas показывал, в какой позиции в текущее время находится курсор:
(column-number-mode 1) ;; отображает номер столбца символа
(line-number-mode 1) ;; отображает номер строки

При отображении основного окна редактора, у меня не отображаются полоски прокрутки, строка меню, тулбар, и прочие ненужные элементы управление,
поэтому весьма удобно чтобы в заголовке отображался полный путь редактирования к файлу:
(setq frame-title-format "emacs - %f")

Несколько слов об Emacs

В своей повседневной работе для редактирования любых текстов, я использую среду Gnu/Emacs. (Произносится как Имакс)
Установка:
Я использую Emacs из cvs, потому что в нем по умолчанию используется Unicode, есть человеческая поддержка русского языка и нормально работает антиалиасинг для шрифтов.
Выгружаем Emacs из репозитория:
cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co emacs

далее

make bootstrap
./configure --with-x-toolkit --with-xft
make
make install
И после некоторого ожидания, запускаем emacs.

Перед началом использования я настоятельно рекомендую прочитать Emacs User Guide, т.к. там даны все ответы на вопросы, возникающие на первых порах использования редактора.

Настраивать среду можно или с помощью конфигурационного файла, который можно найти по адресу $HOME/.emacs, или же с помощью встроенного конфигуратора,
запустить который можно выбрав в меню Options->Customize Emacs.
Лично мне кажется что проще редактор настраивать через конфигурационный файл.
В нем содежатся инструкции, написанные на языке Lisp. Пугаться не стоит, так как все очень понятно и наглядно.

Для упрощения конфигурирования редактора, настройки можно вынести в отдельный файл. Например для настройки режима редактирования C++ настройик можно вынести в файл cpp_mode_conf.el,
затем просто подключить его в основном конфиге
написав:
(load /path/to/el_file/cpp_mode_conf.el)

Комментарии в конфиг файле начинаются с символов ;;
;; bla bla

Бытует мнение, что для работы в среде Emacs необходимо иметь навыки игры на пиано, чтобы уметь одной рукой нажимать сразу несколько клавиш.
Это не так. Вам достаточно иметь три руки =).

10/29/2008

расширеное добавление пользователя

Итак, собственно то, для чего меня сюда и позвали.
Специфика работы системного администратора предполагает,
что вам часто придется делать одну и ту же работу по несколько раз. Сейчас мы будем добавлять пользователя. Но не просто, а чтоб сразу ввести про него всю информацию, сделать его пользователем Samba и создание сетевых папок. Итак:

#!/bin/sh
echo "Введите группу и имя пользователя"
read GRP USR # Производим чтение пользовательского ввода в 2 переменные
useradd -g $GRP $USR && echo $USR:123456|chpasswd # Добавляем пользователя в группу и устанавливаем ему заданный пароль (123456)
chfn $USR # Изменяем служебную информацию. Обычно я пишу Фамилию Имя пользователя и отдел, в котором он работает
echo "Введите SMB пароль"
smbpasswd -a $USR # Добавляем пользователя SMB, здесь вам сразу предложится ввести пароль для него (можно усовершенствовать...)
smbpasswd -e $USR # Включаем пользователя
echo "Введите полный путь к папке exchange"
read EX_DIR # Считываем путь к папке
mkdir $EX_DIR # создаем
chown $USR $EX_DIR # присваиваем владельца
chmod 1707 $EX_DIR # меняем права
setfacl -R -d -m u:$USR:rwx $EX_DIR # устанавливаем ACL
echo "ВВедите полный путь к папке users"
read US_DIR # Считываем путь к папке
mkdir $US_DIR # создаем
chown $USR $US_DIR # присваиваем владельца
chmod 700 $US_DIR # меняем права
setfacl -R -d -m u:$USR:rwx $US_DIR # устанавливаем ACL
setquota -u $USR -a 0 200000 0 0 # устанавливаем квоту
echo "ok" # =)

ну вот, примерно так.

10/27/2008

Ускорение компиляции пакетов в Gentoo.

Как советует gentoo-wiki.org для ускорения компиляции софта в make.conf следует добавить такие строки:

CC="gcc-4.1.2"
CXX="g++-4.1.2"
MAKEOPTS="-j2"

первые две - для ускорения вызова GCC, хотя это наверное сомнительно, ведь скорее всего скрипт configure должен правлиьно определять настоящее имя компилятора.
Ну а последняя опция - для запуска компиляции в несколько потоков.
Вот собственно и все.
P.S. сегодян обновил portage до версии 2.2-rc12.
Полет нормальный ))

Так же для ускорения поиска пакетов по имени и информации рекомендую установить прогармму esearch.

10/26/2008

svn+ssh

Если вы вдруг работаете с сервером subversion через svn+ssh, и вам надоело постоянно вводить пароль, при коммитах, то самый простой способ - сделать авторизацию по ключам, rsa или dsa.
Для этого нужно выполнить следующее:
1. Генерируем rsa ключ (для генерации dsa ключа используйте ssh-keygen -t dsa).
ssh-keygen
2. Копируем сгенерированный ключ на сервер в домашний каталог:
scp ~/.ssh/id_rsa.pub user@host:~/.ssh/authorized_keys

Вот в принципе и все. Теперь вы можете спокойно пользоваться subversion без необходимости постоянно вводить пароль.

8/24/2008

Сага о MTU, iptables и провайдерах...

Есть значит у меня комптьютер, подключенный к интернету через USB модем. Понадобилось мне превратить мой компьютер в роутер, и дать доступ через NAT к интернету всей подсети, весящей на интерфейсе eth0 (192.168.0.0/24).
Как я всегда думал настройка NAT выполняется с помощью магической команды iptables:
/sbin/iptables -t nat -F POSTROUTING; /sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d ! 192.168.0.0/24 -j SNAT --to-source xxx.xxx.xxx.xxx
Однако, ж вопреки моим ожиданиям инет на клиенте так и не заработал, причем не работал он весьма странным образом. ping до сайтов ходил, имена сайтов резолвились, curl загружал страничики, но на этом все и заканчивалось.
Ни firefox, ни icq, ни links никто не мог ничего открыть. Такие симтомы в моей практике встречались впервые. Все говорило о том что tcp/ip работал как то не так.
Запустив wireshark я убедился что, действительно, в сети наблюдается куча неправильных tcp/ip пакетов. Вопрос был почему???
Оказалось, что при MTU установленном в значение, меньшее 1500, некоторые провайдеры болкируют фрагментированные ICMP пакеты, и с сетью начинает происходить что то странное и не понятное. Мой провайдер был именно из таких.
Лечится это все двумя способами:
1. увеличить MTU на интерфейсе, смотрящев в интернет.
или
2. необходимое правило для iptables:
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Решение было подсмотренно Здесь

1/31/2008

Корректное расположение таблицы при генерации pdf

Для того чтобы табличка разделялась на части, если она не помещается на лист, необходимо добавить в xsl схему следующий атрибут:

<xsl:attribute-set name="formal.object.properties">
<xsl:attribute name="keep-together.within-column">auto</xsl:attribute>
</xsl:attribute-set>

1/29/2008

Настройка fop для генерации pdf с русскими буквами.

Расскажу как настроить fop для того, чтобы он корректно генерировал pdf с
русскими буквами.
Продолбался недавно тут с ним весь день.
Итак, что нам потребуется:
fop ver. >=0.94 (берем отсюда),
можно брать бинарную версию, чтобы не заморачиваться с компиляцией.
ttf шрифты, скажем от windows.

1. Устанавливаем fop в удобный каталог. (к примеру в /opt/pkg/fop).
2. Копируем шрифты в какой нибудь каталог (у меня: /opt/pkg/fop/conf/fonts)
3. Далее генерируем font-maps для каждого шрифта.
Я дела следующим образом:
вот такой вот скрипт:

cmd="java -cp build/fop.jar:lib/batik-all-1.6.jar:lib/xalan-2.7.0.jar:lib/commons-io- 1.3.1.jar:lib/commons-logging-1.0.4.jar:lib/avalon-framework-4.2.0.jar:lib/xml-apis-
1.3.02.jar:lib/serializer-2.7.0.jar:lib/xercesImpl-2.7.1.jar
org.apache.fop.fonts.apps.TTFReader"
dir="conf/fonts"
ext=".xml"

for f in `ls -1 $dir`;
do

echo "processing file : $dir/$f"

fname=`echo $f | cut -d . -f1`

newf="$dir/$fname$ext"

${cmd} $dir/$f $newf

chmod 666 $newf
echo "writing to file $newf : success"

done


4. Далее правим файл конфигурации /opt/pkg/fop, где прописываем соответствующие шрифты:

к примеру для шрифта Arial:

<font metrics-url="/opt/pkg/fop/conf/fonts/arialbi.xml" kerning="yes" embed-url="/opt/pkg/fop/conf/fonts/arialbi.ttf">
<font-triplet name="Arial" style="italic" weight="bold"/>
</font>


Потом запускаем fop:
/opt/pkg/fop -xml foo.xml -xsl foo.xsl -pdf foo.pdf

Вот и все.