5 окт. 2008 г.

Цветной вывод в bash

Иногда для собственных скриптов бывает удобно сделать цветной вывод текста - для выделения важных моментов и удобства чтения. Средствами bash сделать это можно несколькими путями, я выбрал для себя наиболее удобный и элегантный.

Цветной вывод
Мне часто бывает нужно выделять определенные строки цветом, так что я просто создал файл /etc/colors следующего содержания:

#!/bin/sh
c_std=""
c_h_std=""
c_pink=""
c_h_pink=""
c_red=""
c_h_red=""
c_cayan=""
c_h_cayan=""
c_yellow=""
c_green=""
c_h_green=""
c_blue=""
c_h_blue=""

В нем задаются переменные, хранящие в себе соответствующие своим названиям цвета. Так, например, "c_std" - стандартный цвет текста в терминале; "c_h_std" - он же, но более "жирное" начертание, и т.д.

Этот файл можно использовать в скриптах для цветного вывода. Например:
#!/bin/bash
. /etc/colors

echo "${c_green}Это зеленый цвет${c_std}"


Цветное приглашение bash
Здесь в принципе идея та же, только у меня цвета прописаны в самом bashrc - так уж повелось. Приведу часть своего basrc, отвечающую за приглашение, там все и так довольно очевидно:
bash_prompt() {
local NONE="\[\033[0m\]" # unsets color to term's fg color

# regular colors
local K="\[\033[0;30m\]" # black
local R="\[\033[0;31m\]" # red
local G="\[\033[0;32m\]" # green
local Y="\[\033[0;33m\]" # yellow
local B="\[\033[0;34m\]" # blue
local M="\[\033[0;35m\]" # magenta
local C="\[\033[0;36m\]" # cyan
local W="\[\033[0;37m\]" # white

# emphasized (bolded) colors
local EMK="\[\033[1;30m\]"
local EMR="\[\033[1;31m\]"
local EMG="\[\033[1;32m\]"
local EMY="\[\033[1;33m\]"
local EMB="\[\033[1;34m\]"
local EMM="\[\033[1;35m\]"
local EMC="\[\033[1;36m\]"
local EMW="\[\033[1;37m\]"

# background colors
local BGK="\[\033[40m\]"
local BGR="\[\033[41m\]"
local BGG="\[\033[42m\]"
local BGY="\[\033[43m\]"
local BGB="\[\033[44m\]"
local BGM="\[\033[45m\]"
local BGC="\[\033[46m\]"
local BGW="\[\033[47m\]"

case $TERM in
xterm*|rxvt*)
if [ `echo $SSH_CLIENT | wc -c` -gt 1 ]; then SSH_FLAG=1; fi
if [ `/usr/bin/whoami` = "root" ]; then ROOT_FLAG=1; fi
if ([ "$SSH_FLAG" = 1 ] && [ "$ROOT_FLAG" = 1 ]); then
local TITLEBAR='\[\033]0;[SSH] \u@\h\007\]'
PS1="$TITLEBAR${R}[!] ${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
elif [ "$SSH_FLAG" = 1 ]; then
local TITLEBAR='\[\033]0;[SSH] \u@\h\007\]'
PS1="$TITLEBAR${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
elif [ "$ROOT_FLAG" = 1 ]; then
local TITLEBAR='\[\033]0;\u@\h\007\]'
PS1="$TITLEBAR${R}[!] ${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
else
local TITLEBAR='\[\033]0;\u@\h\007\]'
PS1="$TITLEBAR${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
fi
;;
*)
if [ `/usr/bin/whoami` = "root" ]; then ROOT_FLAG=1; fi
if [ "$ROOT_FLAG" = 1 ]; then
PS1="$TITLEBAR${R}[!] ${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
else
PS1="$TITLEBAR${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
fi
;;
esac
}

bash_prompt

Внимательный читатель заметит, что также присутствует проверка на то, является ли текущая сессия сессией ssh и/или рутовой сессией. Соответственно устанавливаются флаги SSH_FLAG и ROOT_FLAG и определенным образом меняется приглашение. Пример:


Полный текст очерка

22 сент. 2008 г.

Transmission

Торрент-клиент transmission, начиная с 1.3Х очень часто сегфолтится по непонятным причинам. В баг-трекере вроде бы это описано, но багфиксов пока нет. Сегфолтится не только у меня, а у очень многих. Тем, у кого это происходит, советую откатиться до 1.22. Это максимальная версия, на которой клиент работает стабильно и исходники которой доступны на официальном сайте.


Полный текст очерка

9 сент. 2008 г.

Ненависть!

jabberd - примитивная xml'щина, ejabberd - маразматическое чудовище, openfire - энтерпрайзное тормозилово.

ejabberd, конкретно, вообще хороший пример created by robots for robots. Я уже начинаю потихоньку ненавидеть s-выражения. А диагностика неполадок - вообще песня:


RPC failed on the node ejabberd@localhost: {'EXIT',
{badarg,
[{erlang,
port_control,
[stringprep_port,
1,
"misfortune"]},
{stringprep,control,2},
{jlib,nameprep,1},
{ejabberd_auth,
auth_modules,
1},
{ejabberd_auth,
is_user_exists,
2},
{ejabberd_auth,
try_register,
3},
{ejabberd_ctl,process,1},
{rpc,
'-handle_call/3-fun-0-',
5}]}}


Полный текст очерка

5 авг. 2008 г.

Победа

Попытался скопировать в pcmanfm из рутового окна в пользовательское (картинка под катом):



Полный текст очерка

3 авг. 2008 г.

Оптимизация файловой системы XFS

Каждый более-менее опытный пользователь линукса, наверное, хотя бы слышал про данную файловую систему. А многие, включая и меня, используют ее повседневно. Рассматривать достоинства и недостатки XFS я не стану, а вместо этого напишу о поддержании ФС в оптимальном состоянии. А конкретно: о дефрагментации.

Есть очень хорошая статья на эту тему здесь. Я частично переведу некоторые моменты.

Немного теории
Архитектура XFS такова, что содержимое файла в ней располагается в так называемом "пространстве переменной длины" (extent). Данные пространства представляют собой смежные регионы, расположенные в файловой системе. То есть, при копировании файла на ФС он обычно занимает один extent. Однако, если позже содержимое файла меняется, то возможна ситуация, что пространство, находящееся после файла, уже занято другими данными. В этом случае содержимое файла может быть помещено в два разных extent'а, физически находящиеся на удаленных друг от друга местах диска. Конечно, какой-либо процесс/программа по-прежнему без проблем может обращаться к файлу, однако скорость работы снижается при обращении к разным удаленным друг от друга секторам диска.
В зависимости от аспектов использования ФС, файлы на ней могут довольно значительно фрагментироваться.

Программа xfs_bmap: просмотр информации о расположении файла
С помощью программы xfs_bmap можно увидеть карту extent'ов, в которых хранится конкретный файл.

[alsvartr@bust ~]$ xfs_bmap -v /media/storage/VL5.9-Light-B2.iso
/media/storage/VL5.9-Light-B2.iso:
EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL
0: [0..416991]: 392994088..393411079 10 (26702088..27119079) 416992
1: [416992..532679]: 392631640..392747327 10 (26339640..26455327) 115688
2: [532680..641599]: 64962272..65071191 1 (28333072..28441991) 108920
3: [641600..712959]: 63823592..63894951 1 (27194392..27265751) 71360

Опция -v (verbose) выводит дополнительную информацию.
Как видно, файл VL5.9-Light-B2.iso фрагментирован: хранится в четырех разных extent'ах. Можно попробовать его дефрагментировать.

xfs_fsr: дефрагментация XFS
Данная программа предназначена для реорганизации XFS. Достаточно указать ей нужный файл:
[alsvartr@bust ~]$ xfs_fsr /media/storage/VL5.9-Light-B2.iso

Дефрагментация длится некоторое время в зависимости от объема файла. Можно теперь снова проверить карту extent'ов:
[alsvartr@bust ~]$ xfs_bmap -v /media/storage/VL5.9-Light-B2.iso
/media/storage/VL5.9-Light-B2.iso:
EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL
0: [0..712959]: 394944045..395411741 10 (26702088..27119079) 712960

Теперь файл занимает один extent.

Для того, чтобы дефрагментировать всю файловую систему целиком, достаточно указать в качестве параметра к программе устройство ФС, вместо файла:
[alsvartr@bust ~]$ xfs_fsr /dev/sdb1
/media/storage start inode=0

Полезными опциями также могут быть -v (выводит информацию о файле, обрабатывающемся в данный момент) и -t (время работы программы).
Про последнюю опцию стоит сказать отдельно. Она ограничивает время работы программы указанным значением в секундах. То есть запуск xfs_fsr -t 7200 /dev/sdb1 ограничит время работы двумя часами. После истечения указанного времени xfs_fsr сохранит текущее состояние работы в файл /var/tmp/.fsrlast, чтобы продолжить с этого же места в следующий раз, когда будет указана опция -t. С помощью этой опции можно, например, автоматически выполнять дефрагментацию регулярно небольшими интервалами по cron'у.
Нужно отметить, что механизм работы xfs_fsr состоит в том, что при обработке каждого отдельного файла его содержимое копируется в отдельный extent и метаданные ФС меняются так, что новый файл заменяет старый. Поэтому для дефрагментации необходимо иметь достаточно свободного места - столько, чтобы поместилась копия любого файла на диске.
После выполнения xfs_fsr полезно взглянуть на текущий процент фрагментации ФС.

Статус фрагментации при помощи xfs_db
Программа xfs_db может быть использована для просмотра информации о фрагментации файлов:
[alsvartr@bust ~]$ xfs_db -r /dev/sdb1
xfs_db> frag
actual 101181, ideal 95800, fragmentation factor 5.32%
xfs_db> quit

Опция -r (readonly) нужна для проверки ФС, которая в данный момент примонтирована и используется.

Для получения более подробной информации о конкретных программах стоит обратиться к соответствующим руководствам man.

P.S. Для некоторых операций могут потребоваться права root.

Дополнительные материалы:
Wikipedia: File system fragmentation
Wikipedia: Extent (file systems)


Полный текст очерка

11 июл. 2008 г.

Nokia Morph concept

нанотехнологии, ага :) Вообще, ролик очень приятный.


Полный текст очерка

14 апр. 2008 г.

Элегантный десктоп

Гном и Кде - замечательные среды, однако я не могу без боли смотреть на количество зачастую совершенно мне ненужного хлама, который они за собой тянут. Нет, можно, конечно, и Гном довести до состояния Адама с лавровым листом, но это неблагодарная трата времени. Легче и быстрее использовать аналоги.

Про установку и настройку флюксбокса/опенбокса/айсвма написаны горы статей, да и описывать там особо нечего - всё есть в документациях. Я хочу лишь написать про свой любимый прикладной софт. Он, как правило, занимает минимум места и работает в разы быстрее своих Больших Братьев.

Терминал
> Большие Братья: gnome-terminal, konsole, urxvt.
Всем понятно, что любой графический линукс начинается с эмулятора терминала. Я не нашел ничего быстрее, удобнее и красивее xfce4-terminal.



Практически полный аналог gnome-terminal, но субъективно быстрее. Умеет всё, что полагается - табы, фиктивную прозрачность и т.д.

Работа с файлами
1. Файловый менджер
> Большие Братья: nautilus, krusader, dolphin, thunar.
Больше всего меня раздражает в Наутилусе его скорость. Он медленный. А по сравнению с pcmanfm - он просто и без преувеличений тормоз.



Замечательной особенностью этого менеджера являются табы - это такая удобная штука, что любой наутилус со своим функционалом просто курит. Pcmanfm в общем и целом похож на Thunar, но шустрее. Холодный старт происходит вообще за пару секунд (это с учетом того, что у меня слабая машина).

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

2. ГУЙ к архиваторам
> Большие Братья: File-roller, KArchiver.
Мне не всегда удобно использовать CLI-утилиты для работы с архивами, поэтому я достаточно долго искал достойный графический интерфейс. Моё расположение заслужил Xarchiver, который входит в проект Xfce. Быстрый и удобный. Поддерживает 7-zip, arj, bzip2, gzip, rar, lha, deb, rpm, tar и zip.



Текстовый редактор
> Большие Братья: GEdit, Kate.
Тут всё просто и понятно. Хотите с табами - придется ставить одного из двух вышеперечисленных товарищей. Хотите скорости - leafpad или mousepad, они практически идентичны. Мой выбор - leafpad.



По скорости холодного старта он рвет gedit только в путь.
А для кодинга небольших скриптов я использую medit.



Интернет
1. БитТоррент клиент
> Большие Братья: Azureus, Deluge, KTorrent.
Ничего быстрее и вразумительнее transmission (из графики) вы не найдете.



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

2. РСС-ридер
> Большие Братья: Liferea, Syndigator, Straw.
Я использую плагин к Файрфоксу - Feed Sidebar.



Мне легче запустить бразуер и нажать одну кнопку, чем запускать еще и сторонний ридер. Имеет минимум функций, но в этом и ценность - ничего сверх этого мне не нужно.

Мультимедиа
1. Просмотрщик изображений
> Большие Братья: GQView, gThumb, Mirage.
Всё вышеприведенные программы довольно тормозны. Особенно по сравнению с gPicView. Быстрее него просто нет. Умеет он минимум - просмотр, зум, поворот и т.п. и всё.



Если вам нужно нечто большее - попробуйте Mirage.

2. Аудио-плеер
> Большие Братья: Amarok, Exaile, Audacious, XMMS.
Раньше я скептически относился к плеерам, составляющим музыкальные базы, полагая, что я и сам знаю, что и где у меня лежит. Да и тормозов боялся (Exaile у меня составлял базу всю ночь пока я его не прервал). Однако, сочетание mpd + sonata оставит далеко позади ЛЮБОЙ winamp-like.



Получение обложек и текстов из интернета, встроенная поддержка last.fm, поиск по своей базе - всё это есть и всё это быстро. База из 100+ гигабайт музыки составляется за 5 минут.

В заключении отмечу пару маленьких CLI, без которых я не представляю десктопа. audio-convert - это маленький скрипт на баше, умеющий перекодировать аудио форматов wma, mp3, flac, waw, etc. Использует Zenity для графики и чрезвычайно удобен. Calc - консольный калькулятор.

Сonclusio
Все вышеописанные программы в сочетании с легким WM/DE дадут такой прирост производительности, что разработчики Gnome и KDE должны сгореть от стыда.


Полный текст очерка