20080131

Плагин для GIMP Exposure Blend вместо HDR

Не секрет, что у цифровых камер довольно ограниченный динамический диапазон, то есть разница между самым яркими и самыми тёмными градациями в кадре. Говоря цифрами, динамический диапазон закатного пейзажа вполне может достигать 20 ступеней (соотношение яркостей 220), а большинство любительских камер обладают динамическим диапазоном максимум 8 ступеней. Это значит, что на фотоснимке такого пейзажа солнце и небо будут выбеленны, а детали в тенях неразличимо чёрными.

Чтобы обойти это ограничение в последнее время часто применяется техника известная как High dynamic range imaging (HDR). Идея её состоит в том, что берутся несколько кадров одной и той же сцены с разным уровнем экспозиции. Затем по совокупности кадров вычисляется сколько света должно было падать на каждый пиксель изображения. Эта информация позволяет построить новое изображение, как если бы динамический диапазон камеры был сколь угодно широк. При этом информация о тёмных градациях изображения берётся в основном со светлых кадров, а информация о светлых градациях — с тёмных. Полученные изображения часто очень красивы и приближены к нашему естественному восприятию сцен с высоким контрастом.

В GNU/Linux есть много программ, которые позволяют обрабатывать изображения, используя технику HDR. В частности, надо упомянуть Cinepaint (HDR in Cinepaint tutorial) и Qtpfsgui (Руководство по Qtpfsgui (на английском)). Qtpfsgui, пожалуй, обладает на сегодняшний день наиболее удобным интерфейсом. А для съёмки HDR необходимо иметь камеру с поддержкой автовилки экспозиции ну и штатив.

Однако надо учитывать, что большинство любительских камер могут делать в режиме автовилки максимум 3 кадра, и шаг экспозиции между ними обычно ограничен ±2 EV, а то и всего ±1 EV (как в моей камере). Это позволяет расширить динамический диапазон соответственно на 4 или лишь 2 ступени. Хорошо, но не очень много.

В этом случае часто может быть проще и быстрее использовать плагин Exposure Blend plugin для GIMP (сайт, похоже, часто не работает, но в Debian этот плагин можно найти в пакете gimp-plugin-registry). Результат работы этого плагина не является настоящим HDR. Вместо этого с помощью масок берутся тёмные детали с яркого снимка, а светлые детали с тёмного, и объединияются в одном изображении за счёт наложения слоёв. Однако результат бывает довольно хорош. И даже честный HDR по трём кадрам с любительской камеры и шагом экспозиции ±1 EV не даст результата лучше.

В GIMPе плагин запускается из меню Расш. / Photo / Exposure Blend. Нужно указать ему три файла (нормальный, тёмный, светлый). Большинство настроек хороши по-умолчанию. В результате будет создано изображение с тремя слоями (нормальный внизу, над ним слой с тёмными деталями и слой со светлыми деталями). При желании можно поиграться с прозрачностью слоёв.

Конечно, если камера поддерживает большой шаг автовилки — это хорошо. При съёмке лучше задавать максимально возможный. Результаты будут лучше. К сожалению мой фотоаппарат умеет делать максимум ±1EV, а этого не достаточно.

Поэтому для этого примера я избрал немного иной подход. Я снял одно изображение в формате RAW (12 бит на цветовой канал), а затем обработал его в UFRaw, сделав три изображения: одно нормальное и два с коррекцией экспозиции ±2EV.

Вот что получилось (ссылки ведут на более крупные изображения, лежащие на imageshack.us, желающим могу выложить RAW или полноразмерные версии):

нормальная экспозиция + -2EV + +2EV = композитное изображение


Сравните обычный кадр с композитным изображением, полученным с помощью Exposure Blend (внизу):

вверху обычный кадр, внизу композитное изображение


В изображении, созданном Exposure Blend, детали более отчётливы, чем в исходном изображении. И в тенях (фон, шары, поверхность), и в светлых областях (воск свечи). И это сделано компактной камерой и всего несколькими кликами мыши!

Я специально не исправлял гамму и не трогал цветовых кривых. Одно из ключевых преимущества использования Exposure Blend перед использованием HDR — это сохранение естественной цветопередачи. В случае HDR задача преобразования композитного изображения с расширенным динамическим диапазоном к обычному цветовом пространству совсем не тривиальная (попробуйте повторить результат в Qtpfsgui!). При использовании Exposure Blend никакой необходимости подгонять и настраивать особенности цветопередачи нет. Изображения всегда выглядят натурально.

Можете взглянуть также на некоторые другие изображения, полученные с помощью Exposure Blend (ссылки на Flickr):

Exposure Blend example 3 Exposure Blend example 4 Exposure Blend example 5 Exposure Blend example 6 Exposure Blend example 2
и другие фото с тэгом exposureblend

P.S. Эту заметку я написал также по-английски: Try Exposure Blend plugin for GIMP to fake HDR.

P.P.S. Как отметил в комментариях nagos, в будущих версиях пакета enblend появится также утилита enfuse, позволяющая совмещать кадры с разной экспозицией (в том числе более 3); в данный момент она доступна в версии enblend для разработчиков. Можете посмотреть также заметку про создание HDR в qtpfsgui, написанную nagos.

Визуализация геоданных средствами GMT

В блоге «Записки океанолога» появилась интересная заметка, доступно рассказывающая как отрисовывать географические карты и отображать на них данные с помощью пакета программ GMT.

Конечно же, GMT есть в Debian (пакет gmt). А карты по качеству изображения получаются, примерно такие:


Читайте также:
☙ другую статью в «Записках океанолога», про визуализацию течений на карте при помощи PyNGL
описание работы с GMT на конкретном примере Михаила Кондратьева

20080123

Как я перемещал /home

Вчера наводил порядок на своём ноутбуке, разгребал место. В начале, с помощью gparted ужал раздел с Windows и удалил скрытый заводской раздел (3 с гаком гигабайта, куда Acer, видимо, положил образ для восстановления)... Так что, если Windows у меня теперь слетит — то навсегда :) Сделал новый раздел, чтобы переместить туда /home. И переместил. Потому что на одном разделе с системой моему /home стало тесно.

Как пользоваться gparted и форматировать разделы — рассказывать не буду (запускается из меню «Система / Администрирование / Partition Editor»), а вот как перемещал /home на отдельный раздел диска — расскажу. Следовал инструкциям из статьи «Partitioning in action: Moving /home» на IBM developerWorks.

0. Выхожу из сессии иксов, переключаюсь в текстовую консоль (Ctrl+Alt+F1), вхожу как root.

1. Монтирую вручную новый раздел:
# mkdir /mnt/newhome
# mount /dev/новыйраздел /mnt/newhome

(понятно, что вместо /dev/новыйраздел надо подставить название нужного раздела, например, /dev/hda1, как в моём случае)

2. Перехожу в однопользовательский режим, чтобы быть уверенным, что никакие программы в /home не пишут:
# init 1

3. Перехожу к домашним каталогам и копирую их все с сохранением всех свойств и ссылок (ключ -a):
# cd /home
# cp -ax * /mnt/newhome

синкаюсь и размонтирую:
# sync
# umount /mnt/newhome


4. Убираю в сторонку старый /home и подключаю новый (он должен быть точно такой же). На всякий случай, старое содержимое сохранится в /oldhome:
# cd /
# mv /home /oldhome
# mkdir /home
# mount /dev/новыйраздел /home


5. Выхожу из однопользовательского режима (CTRL-D или # init 2 в Debian). После запуска системы редактирую /etc/fstab, добавляя строчку, чтобы монтировать /dev/новыйраздел в /home при загрузке.

Спустя 24 часа полёт нормальный, доставать резервную копию не надо :) Если всё в порядке, то копию домашнего каталога в /oldhome можно удалить.

20080118

Поисковые шаблоны в Aptitude

В этом посте я расскажу о том, как искать пакеты программ Debian с помощью aptitude. В Ubuntu, понятно, всё делается точно так же.

Обычно, чтобы найти нужный пакет, достаточно написать что-нибудь вроде

$ aptitude search шаблон

и получить список пакетов, в названии которых встречается «шаблон». Например:

$ aptitude search doom
v doom-engine -
p doom-package - Installer for Doom data files
v doom-wad -
v doom-wad-editor
...


Однако в некоторых случаях, такого поиска недостаточно. Представим, например, что пользователь ищет программы для обработки изображений с помощью техники HDR (расширенного динамического диапазона). Он набирает

$ aptitude search HDR

и получает

p chdrv - Chinese terminal for the Linux console
p chdrvfont - Kuo Chiao 16x16 font for CHDRV Chinese con


Явно это не то, что его интересовало. Вот именно здесь пригодятся более «продвинутые» возможности поиска в aptitude. А именно «поисковые шаблоны». Полное описание шаблонов доступно в документации к aptitude. Здесь я расскажу только о некоторых из них.

Итак, каждый шаблон — это некое условие поиска. По умолчанию, если указать сразу несколько шаблонов, то будет выдан список пакетов, соответствующих всем указанным условиям (логическое И). Если шаблоны разделить знаком «|», то будут найдены пакеты, соответствующие хотя бы одному из условий (логическое ИЛИ). Если перед шаблоном (условием) поставить восклицательный знак, то будут найдены пакеты, для которых это условие не выполняется (логическое отрицание). Несколько шаблонов (условий) можно группировать с помощью скобок.

Шаблоны обычно начинаются со знака тильда «~». За ней следует символ, указывающий тип шаблона. Затем может идти дополнительный текст, зависящий от шаблона. Такой синтаксис шаблонов должен быть знаком пользователям почтовой программы mutt.

Итак, самые полезные, на мой взгляд, шаблоны:

~nимя — в имени встречается текст «имя» (можно использовать регулярные выражения, например, ~n^lib отбирает только имена начинающиеся с lib)
~dтекст — в описании пакета встречается «текст» (очень полезно, если название программы неизвестно, но известно, что она должна делать)
~i — отбирает только уже установленные пакеты
~N — отбирает только новые пакеты (которых раньше не было в репозитории)
~U — отбирает пакеты, которые можно обновить
~Dтребование — отбирает пакеты, которые зависят от «требования» (можно использовать регулярные выражения)
~Rзависимый — отбирает пакеты, которые необходимы для «зависимого» (можно использовать регулярные выражения)

Вернёмся к нашему примеру. Поскольку поиск по именам пакетов ничего полезного не дал, можно поискать по описаниям:

$ aptitude search ~dHDR

даёт 27 строк результатов. Уже лучше, но среди них — явно лишние. Можно ограничить выборку только теми пакетами, в описании которых говорится и про HDR, и про изображения (images):

$ aptitude search ~dHDR~dimage
i exrtools - A collection of utilities for manipulating
p libopenexr-dev - development files for the OpenEXR image li
c libopenexr2c2a - runtime files for the OpenEXR image librar
i libopenexr2ldbl - runtime files for the OpenEXR image librar
p libpfs-1.2-0 - C++ library to read and write pfs files
p libpfs-dev - C++ library to read and write pfs files (d
p octave-pfstools - octave bindings for pfstools
i openexr - viewer and docs for the OpenEXR image form
p pfstools - command line HDR manipulation programs
p pfstools-dbg - command line HDR manipulation programs (de
i qtpfsgui - graphical user interface providing a workf


Это именно то, что надо. В данном примере я соединил два поисковых шаблона вместе (логическое И).

А вот пример отрицания условия:

$ aptitude search '!~i~naptitude'
p aptitude-dbg - Debug symbols for the aptitude package man
v aptitude-doc -
p aptitude-doc-cs - Czech manual for aptitude, a terminal-base
p aptitude-doc-fi - Finnish manual for aptitude, a terminal-ba
p aptitude-doc-fr - French manual for aptitude, a terminal-bas
p aptitude-doc-ja - Japanese manual for aptitude, a terminal-b


Здесь я искал такие пакеты, в названии которых встречается «aptitude» (~naptitude), но в системе они у меня не установлены (!~i). Поисковые шаблоны были взяты в кавычки, чтобы избежать интерпретации восклицательного знака оболочкой bash.

А вот пример комбинации логического ИЛИ и логического И. Я смотрю, какие у меня установлены пакеты, такие что в названии встречается firefox или iceweasel (обратите внимание на группировку шаблонов с помощью скобок):

$ aptitude search '~i(~nfirefox|~niceweasel)'
i iceweasel - lightweight web browser based on Mozilla
i iceweasel-gnome-support - Support for Gnome in Iceweasel
i iceweasel-l10n-ru - Russian language package for Iceweasel


Поскольку firefox у меня не стоит, то найдены только пакеты iceweasel.

Конечно, использовать поисковые шаблоны можно не только из коммандной строки. Работают они и во встроенном поиске aptitude в полноэкранном режиме.

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

По теме: Как пометить пакеты в Aptitude, чтобы потом удалить.

20080116

Как сделать копию удалённого репозитория Subversion

Резервная копия репозитория Subversion, находящегося на локальной машине, делается обычно так:
$ svnadmin dump /путь/к/репозиторию > мой-дамп

Всё просто, достаточно иметь прямой доступ к каталогу с репозиторием.

Увы, для удалённых репозиториев, управляемых кем-то другим (например, на code.google.com), такой фокус не проходит. А как-то беспокойно на душе, когда нет своей копии... Зато проходят фокусы с созданием локального «зеркала» (копии) удалённого репозитория, с которым потом можно делать всё, что угодно.

Фокусов здесь можно сделать целых два.

Фокус первый

Содержимое удалённого SVN-репозитория можно легко перенести в локальный SVK-репозиторий. SVK — это система управления версиями, использующая хранилище SVN. То есть, фактически, всего лишь надстройка над Subversion.

Итак, чтобы фокус получился, для начала удаляем локальный SVK-репозиторий (если в нём ничего ценного нет, конечно):
$ rm -rf ~/.svk


Далее:
$ svk ls URL-удалённого-SVN-репозитория

(утвердительно отвечаем на все вопросы, svk создаёт локальный репозиторий с копией изменений из удалённого SVN-репозитория)

Теперь осталось сделать резервную копию:
$ svnadmin dump -r2:HEAD ~/.svk/local > мой-дамп

(создаём dump всех изменений, игнорируя первые две ревизии SVK-репозитория, к нашим делам отношения не имеющие)

Узнал я про такой фокус здесь.

Фокус второй

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

Тут на помощь может прийти другой инструмент: svnsync, появившийся в Subversion начиная с версии 1.4. svnsync предназначаен для одностороннего зеркалирования репозиториев SVN (то есть для создания репозиториев-клонов, предназначенных только для чтения).

Для начала создадим новый репозиторий, куда будем всё копировать. Это описано в документации Subversion:
$ svnadmin create /путь/к/новому/локальному/репозиторию

Не используйте в качестве зеркала уже существующие репозитории! svnsync может полностью перезаписать их содержимое.

После этого обозначим переменными MASTERSVN и COPYSVN адреса исходного репозитория и нового локального:
$ MASTERSVN=URL-удалённого-SVN-репозитория
$ COPYSVN=file:///путь/к/новому/локальному/репозиторию


После этого делаем пустой «хук» в локальном репозитории-зеркале:
$ cd /путь/к/новому/локальному/репозиторию
$ echo "#!/bin/sh" > hooks/pre-revprop-change
$ chmod 755 hooks/pre-revprop-change


Далее инициализируем репозиторий-зеркало:
$ svnsync init ${COPYSVN} ${MASTERSVN}

при этом будут установлены ряд свойств репозитория-зеркала, в нём же будет сохранён адрес удалённого репозитория.

Чтобы начать передачу данных (синхронизовать репозиторий-зеркало с удалённым), следует выполнить такую команду:
$ svnsync --non-interactive sync ${COPYSVN}


В некоторых случаях (например, если предыдущая синхронизация оборвалась аварийно), svnsync может жаловаться на то, что не может заблокировать репозиторий-зеркало. В этих случаях помогает такая команда:
$ svn propdel svn:sync-lock --revprop -r 0  ${COPYSVN}


Поскольку я обычно синхронизую репозитории автоматически, по crontab, то в скрипте для синхронизации репозиториев пишу так:
if [ $(svn proplist --revprop -r 0 ${COPYSVN} | \
grep sync-lock | wc -l) -ne 0 ] ; then
sleep 15
svn propdel svn:sync-lock --revprop -r 0 ${COPYSVN}
fi


Этому фокусу я научился по статьям using svnsync и svnsync: mirror your svn repository. Пока доволен.

P.S. Недавно в блогах на runix.org проскакивало, в блоге Strannick-а, как копировать гиперссылки, используя два буфера обмена. Правой кнопкой мыши по ссылке и копировать адрес ссылки (в буфер GNOME), а потом выделение текста ссылки мышью (помещается в буфер X Window). Чтобы вставить: Shift-Ins (Ctrl-V) для адреса, щелчок средней мыши для текста ссылки. Мне понравилось! Если потренироваться — довольно удобно.

20080115

Цветные поверхности в gnuplot в режиме pm3d

Задача: визуализация двумерных данных, то есть некой зависимости вида
z=f(x,y). Всем понятный пример такой функции: карта высот некоторого района, высота является функцией координат.

Распространены следующие способы отобразить графически значения такой функции:
1) рисовать изолинии значений функции, вдоль которых значение функции не меняется;
2) раскрашивать плоскость {x,y} цветами, зависящими от значения функции (чем выше, тем желтее на физических картах);
3) рисовать проекцию воображаемой поверхности, с таким рельефом, как если бы значения функции в каждой точке были высотой этой точки;
4) комбинировать способы 1–3.

В этом посте я расскажу, как можно рисовать раскрашенную «поверхность» значений функции в gnuplot. О том, как рисовать на графике изолинии, я написал отдельную заметку. Для начального ознакомления с gnuplot я рекомендую прочитать статью Строим научные графики с помощью GNUplot Михаила Конника.

В качестве примера я буду строить график следующей аналитически заданной функции:
z=(cos(5*acos(y/sqrt(x*x+y*y)))/(1+(x*x+y*y))**0.25),

хотя ровно то же самое можно делать и с данными из файла.

Надо сказать, что возможность раскрашивать поверхности появилась в gnuplot сравнительно недавно, начиная с версии 4.0. Раньше можно было нарисовать поверхность только с помощью линий.

Чтобы нарисовать поверхность линиями, надо выполнить в gnuplot следующую комманду:

splot (cos(5*acos(y/sqrt(x*x+y*y)))/(1+(x*x+y*y))**0.25) w l

где w l — это сокращение от with lines. Эта и все последующие команды набираются внутри интерпретатора gnuplot. Результат выглядит примерно так:
gnuplot splot with lines

Перед построением этого графика я задал точку зрения (set view 45,45 и степень детализации (set isosamples 50). В современных версиях gnuplot, при использовании интерактивных терминалов (x11,wxt) точку зрения можно менять поворачивая изображение при нажатой кнопке мыши.

А вот, что получается, если использовать режим построения графиков pm3d. Команда:

splot (cos(5*acos(y/sqrt(x*x+y*y)))/(1+(x*x+y*y))**0.25) w pm3d

(w pm3d можно писать полностью как with pm3d). Получаемый результат:
gnuplot splot with pm3d

Многие такие графики в цветном варианте выглядят гораздо понятнее. Цветовая палитра — это линейка цветов, крайние цвета соответствуют максимальному и минимальному значению функции. Промежуточные — промежуточным. Палитру, конечно, можно сменить (набираем в gnuplot help palette и читаем справку).

Стоит отметить палитру из градаций серого:

set palette gray

после чего повторное построение графика даёт:


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

Я, например, являюсь большим поклонником палитры 30-31-32, которая включается так:

set palette rgbformulae 30,31,32

Это значит, что красный канал определяется формулой №30, зелёный формулой №31 и синий формулой №32, а результат выглядит так:

Прелесть этой палитры в том, что даже если её напечатать в градациях серого, градации яркости останутся заметны. Это удобно, если принтер нецветной. Полагаю, что и у людей с нарушениями цветового зрения проблем с такой палитрой тоже будет меньше.

Кому мало встроенных формул для составления палитры — могут загружать палитры из файла. И конечно, RGB — не единственная цветовая модель, которую можно использовать при задании палитры. Доступны также следующие цветовые модели: HSV, CMY, YIQ, XYZ.

Любая палитра может быть инвертирована (перевёрнута), если добавить слово negative после описания палитры в команде set palette. При этом максимум и минимум на палитре меняются местами.

Ну а если рисовать «трёхмерные» поверхности не нужно, а хочется просто взглянуть на раскрашенную область определения функции «сверху»? Ничего проще!

set view map
splot (cos(5*acos(y/sqrt(x*x+y*y)))/(1+(x*x+y*y))**0.25) w pm3d


Получаем вот такую «цветовую карту» нашей функции:

(здесь я использовал палитру 34-35-36).

По умолчанию, палитра растягивается, чтобы охватить весь диапазон данных. Если нужно указать диапазон палитры (цветовой шкалы) явно, можно использовать команду:

set cbrange [минимум:максимум]

Смотрите также:

☙ справку по режиму pm3d в gnuplot (набрать help pm3d)
галерею возможностей режима pm3d
галерею возможностей режима pm3d (сокрытие поверхностей)
Как построить график с изолиниями в gnuplot, gri и pylab
Сравнение программ для построения графиков

20080114

Как сделать картинку с текстом

Чтобы сделать картинку, на которой написан некий текст, не нужно даже графического редактора. Достаточно ImageMagick. Это может пригодится, например, чтобы не вывешивать e-mail в виде простого текста в веб…

Делается это так:
$ convert -density 96 -background yellow -fill black -pointsize 24 -font Bookman-Demi label:'http://советы.блогспот.ком' sovety.png


После чего можно любоваться на новый файл sovety.png:

советы.блогспот.ком


Параметр -density задаёт предполагаемое разрешение устройства просмотра (в точках на дюйм), -background определяет цвет фона (цвета можно задавать в HTML-формате, например, #aa0000), -fill цвет букв, -pointsize размер шрифта, -font собственно используемый шрифт, а label:что-нибудь задаёт сам текст.

Список доступных шрифтов и их названия можно посмотреть так:
$ convert -list Type

или так (в новых версиях ImageMagick):
$ convert -list Font


Всякие другие возможности создания картинок с текстом смотрите также в этом списке примеров. А как на картинке отобразить формулу, я уже писал.

20080111

Как в убунту установить разные обои

Недавно заглянул в статистику Google Analytics, и с удивлением обнаружил, что в мой блог заходит довольно много народа по поисковому запросу «как в убунту установить разные обои».

Ну раз уж народ так этим интересуется, то открою тайну :) Пользователям Ubuntu, а также всем пользователям рабочего стола типа GNOME, для того, чтобы сменить обои рабочего стола надо:

1. Щёлкнуть правой кнопкой мыши по рабочему столу
2. Выбрать «Изменить фон рабочего стола»
3. Выбрать фон из списка, или ператащить мышкой в открывшееся окно любой файл с картинкой (выбрать в меню «Переход / Домашняя папка», чтобы открыть обозреватель файлов)
4. Выбрать нужный способ наклеивания обоев (увеличивать, уменьшать, с полями или без, замостить черепицей или положить по центру...) — на этом этапе удобно взглянуть на результат переключившись на секунду на соседний пустой рабочий стол
5. «Закрыть» диалог

У меня в Debian testing, после недавнего апгрейда, диалог выбора фона рабочего стола выглядит вот так:


Довольно интересные результаты можно получить выбирая полупрозрачные обои и градиент (цвета можно выбрать в том же диалоге выбора обоев). Полупрозрачные обои есть в пакете gnome-backgrounds в Debian.

А для тех, кому этого мало, есть ещё и программка gbackground, позволяющая переодически менять обои. Другая подобная программка для переодической смены обоев называется drapes. Я эти программы не пробовал, но в репозиториях они лежат.

P.S. Вызывать диалог изменения фона рабочего стола можно также через меню «Система / Параметры / Внешний вид», и выбрав там вкладку «Фон».

Использование screen на удалённых машинах

Есть такая штука: screen. Программа создавалась, чтобы запускать несколько терминальных сессий внутри одного терминала. Надобность в такой возможности резко снизилась в связи с широким распространением эмуляторов терминала с поддержкой вкладок (вроде Gnome Terminal). Впрочем, до сих пор может быть полезна на удалённых машинах.

Однако есть у screen и другое полезное свойство: возможность отсоединять виртуальные сеансы от физического терминала и подсоединять к другому. Это, в частности, позволяет запускать долгоиграющие процессы на удалённых машинах, без необходимости быть постоянно на них залогиненным.

Способ использования такой:

1. зайти на удалённую машину (по ssh)
2. запустить там screen
3. запустить некий долгий процесс внутри сессии screen
4. отсоединить сессию screen, нажав CTRL-A и затем d (вообще, все внутренние команды screen начинаются с CTRL-A, например, CTRL-A + ? покажет краткую справку)
5. выйти из удалённой системы (всё запущенное внутри screen продолжит работать)
6. уйти обедать, лечь спать, уехать в отпуск, заняться другими делами
7. когда захочется, войти повторно на удалённую машину, и подсоединиться к уже запущенной сессии screen, набрав screen -r.

Таким же образом можно запускать screen и на локальной машине. Это позволит, например, уменьшить количество одновременно открытых терминалов, а также позволит спокойно перезапускать иксы, не опасаясь за то, что какой-то работающий в фоне процесс может прерваться.

Дополнение: Как заметил в комментариях Ivan A-R, на одной машине можно открыть несколько разных сессий screen:
ssh ...
screen -S wget
[Ctrl-A d]
screen -S backup
[Ctrl-A d]
exit

ssh ...
screen -r backup
[Ctrl-A d]
screen -r wget

20080109

С Новым годом!

С большим опозданием, но поздравляю всех моих читателей с наступившим-таки Новым годом!

В прошлом месяце (да, наверное, так будет и в этом), регулярно писать не получалось, по причинам как личным, так и по рабочим. Поэтому сейчас пулемётной очередью выстреливаю то, что накопилось за это время в моём настольном вики-блокноте, но руки не доходили перенести в блог:

Неправильные номера изображений в LaTeX
Эффективная конвертация растра в EPS или PDF
Установка дополнительных пакетов LaTeX в Debian
Поворот страницы в LaTeX
LaTeX: Как уместить текст на страницу
Просмотр вложений *.doc в виде простого текста
Как пересобрать deb-пакет

Вообще то, что записи гораздо оперативнее появляются в моей оффлайновой вики, чем в этом блоге, а также то, что там их проще писать, группировать и искать по темам, наводит меня на мысль о том, что и материалы этого блога, и новые надо перенести в некую нехитрую вики, доступную мне в любой момент для редактирования, вроде того, как это сделано у iar.spb.ru. Возможно, в новом году я этим займусь.

В ближайших планах написать о том, как сшивать панорамы с помощью autopanosift, hugin и enblend, как легко и приятно делать псевдо-HDR с помощью плагина к GIMP Exposure Blend, как мне понравилась программка dvdrip (и сразу кончилось место на дисках), как я впервые попробовал программу вёрстки Scribus (и остался доволен), на что способен режим pm3d в gnuplot, написать о кое-каком вычислительном софте, выпустить новую версию сравнения всяких графикостроителей, да ещё упомянуть всякие мелочи... Дел по горло :)

Счастливого Нового года!

Как пересобрать deb-пакет

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

К счастью, пересобрать (изменённый) пакет достаточно просто. Последовательность действий:

0. Убедиться, что в /etc/apt/sources.list есть подходящая запись deb-src; добавить, если нет. Добавляется примерно такая строчка:
deb-src http://ftp.ru.debian.org/debian/ testing main contrib non-free

в ней можно менять адрес зеркала, ветку (например, stable или unstable вместо testing) и разделы репозитория.

После этого надо сделать aptitude update. Перейти в каталог, в котором собираетесь собирать исходники.

1. Получить исходники пакета: apt-get source -t unstable названиепакета. Здесь надо учитывать, что иногда из одного пакета с исходниками собирается несколько бинарных. Указывать название пакета с исходниками. Параметр -t unstable указывает, что взять нужно исходники версии из unstable.

2. Скачать всё, что необходимо для сборки: apt-get build-dep название пакета

3. Перейти в каталог названиепакета-версия/

4. Поправить, что хочется, в исходниках. Отредактировать файл debian/changelog (см. документацию, как описывать изменения). Описывать изменения и менять номер версии пакета нужно, чтобы потом самому отличать свои пакеты от дистрибутивных.

Дополненине: Для редактирования debian/changelog можно воспользоваться dch. Например, dch -l myname создаст в changelog запись для новой версии пакета, добавив myname к номеру версии Debian.

5. Пересобрать пакет: fakeroot dpkg-buildpackage -us -uc

Дополнение:: Savagex в комментария заметил, что тот же результат можно получить с помощью dpkg-buildpackage -rfakeroot.

На каталог выше должны появиться новые бинарные пакеты, готовые к установке.

Возможно, это не совсем идеологически верное описание и что-то важное я упустил (я не Debian-гуру). Кто знает лучше — пусть поправит. Однако такой способ вполне годится для личного использования.

Дополнение: анонимный читатель указал, что для пересборки пакета можно также воспользоваться программой pbuilder, которая позволяет производить сборку в «чистом окружении» и не засорять систему зависимостями для сборки (см. этап получения build-dep). Соответственно, рекомендую две ссылки по теме: Как я собираю/бэкпорчу deb пакеты (GQ's blog) и о сборке пакетов Debian в русской Debian wiki.

Просмотр вложений *.doc в виде простого текста

Не знаю кому как, а мне приходится получать пустые письма, к которым приложен файл DOC, PDF или, чего доброго, PPT, с двумя абзацами текста. Запускать OpenOffice всякий раз только для того, чтобы взглянуть про что письмо или скопипастить оттуда два слова — долго и неудобно.

Пользуюсь я почтовиком Claws Mail. К нему прилагается скриптик textviewer.pl, готовый работать универсальным просмотрщиком (точнее вызывать подходящий конвертер что-нибудь—в—просто-текст и показывать содержимое файла в стандартный вывод). Так, файлы Word он обрабатывает antiword-ом, файлы RTF — unrtf-ом, файлы PowerPoint — ppthtml (не всегда удачно), PDF — pdftotext, OpenOffice — ooo2txt (а вот этого у меня нет). Получается быстро и удобно.

Соответственно в настройках Claws Mail в качестве универсального просмотрщика нужно указать textviewer.pl -v '%s'.

Однако я думаю, такой скриптик может быть полезен и пользователям других почтовых клиентов. В Debian его можно найти внутри пакета claws-mail-tools или взять прямо из CVS репозитория. Сами конвертеры «хитрый формат в plain text» в Debian находятся в пакетах antiword, unrtf, ppthtml, xpdf-utils.

Дополнение: Вначале обрадовался. Узнал, что в Debian просматривать файлы OpenOffice.org без установки можно с помощью o3read (o3read, o3totxt). Потом огорчился. Ни один из моих файлов *.odt прочитать с помощью o3read не вышло.

LaTeX: Как уместить текст на страницу

Иногда необходимо, чтобы определённый текст вместился строго на одну страницу, а одна или две строчки не влезают... И текст трогать (убирать из него лишнее) уже нельзя.

В этом случае, чтобы «увеличить» нужную страницу, на помощь придёт команда \enlargethispage.

Например, команда \enlargethispage{2\baselineskip} позволит текущей странице стать длиннее (выше) на две строчки. Вариант команды «со звёздочкой», \enlargethispage*{длина}, попытается сжать страницу насколько это возможно.

После использования \enlargethispage, страницу надо завершать явным указанием её конца, для этого служит команда \pagebreak.

Можно также воспользоваться пакетом chngpage, позволяющим менять параметры макета страницы для отдельных фрагментов текста (например, сузить или расширить поля для отдельной страницы).

Его, как и команду \enlargethispage, следует использовать осмотрительно: следить, чтобы полученный документ выглядел аккуратно. В идеале использование этих приёмов должно оставаться незаметным.

Поворот страницы в LaTeX

В этом посте я расскажу, как изменить ориентацию отдельной страницы в LaTeX с сохранением ориентации номеров. Это может быть нужно, например, если надо разместить широкую иллюстрацию или таблицу в документе с портретной ориентацией страниц.

Поможет в этом пакет lscape и окружение landscape им предоставляемое:

% в преамбуле
\usepackage{lscape}
...
% в тексте
\begin{landscape}
...
% часть текста, которая должна быть повёрнута (напечатана как на горизонтально-ориентированной странице)
...
\end{landscape}
Примечание: если используется драйвер pdftex, а не dvips, то в преамбуле документа нужно писать \usepackage[pdftex]{lscape}. Спасибо Дмитрию за комментарий. Хочу, однако, заметить, что у меня в pdfLaTeX из TeXLive работает и без этой опции.

Установка дополнительных пакетов LaTeX в Debian

Многие пакеты LaTeX доступны непосредственно из репозитория Debian, в частности в пакетах texlive-latex-recommended и texlive-latex-extra. Однако бывает, что нужно воспользоваться каким-то пакетом, который в дистрибутив не включен (но есть на CTAN).

Инструкции по ручной установке таких пакетов можно найти в руководстве Debian-specific information about TeX packages.

Если кратко, то установка дополнительных пакетов вручную состоит всего из двух шагов:
1. поместить файлы пакета туда, где (La)TeX ожидает их найти,
2. зарегистрировать новые файлы.

(La)TeX ожидает найти новые пакеты внутри каталога TEXMFLOCAL, который обычно находится /usr/local/share/texmf.

Для пакетов LaTeX там нужно создать подкаталог tex/latex/имя пакета (или использовать tex/latex/misc) и поместить туда файлы пакета; документацию надо положить в doc/latex/имя пакета. Если пакет распространяется в виде пары файлов *.dtx и *.ins, то, чтобы создать файлы пакета, нужно обработать latex .ins-файл, а чтобы создать файлы документации — .dtx-файл. После этого файлы *.dtx и *.ins больше не нужны. Ну и, конечно, нужно читать, что написано в файле README идущем вместе с пакетом.

После того, как файлы пакета разложены куда надо, зарегистрировать их легко. Запустите команду mktexlsr (известную также как texhash). Она пересоздаст файлы ls-R для всех каталогов TeX, в которых у пользователя есть права на запись.

Можно также устанавливать пакеты в пользовательское дерево TeX (TEXMFHOME), которое обычно находится в $HOME/texmf. Об особенностях установки пакетов в домашний каталог, а также об особенности установки шрифтов вручную, можно прочитать всё в том же руководстве.

Эффективная конвертация растра в EPS или PDF

Чтобы использовать растровое изображение в документе LaTeX есть два пути: пользоваться PDFLaTeX, позволяющим включать изображения форматов PNG и JPEG непосредственно, или конвертировать растровые изображения в EPS, а потом работать с ними как обычно. Необходимость конвертировать растр в EPS возникает и при желании использовать другие средства вёрстки и векторные графические редакторы.

К сожалению, обычный способ конвертации с помощью ImageMagick (convert) или распространённых графических редакторов даёт EPS файлы довольно большого размера. Есть программы, которые делают эту работу лучше.

Одна из них — sam2p — есть в репозиториях Debian, и полученные с помощью её EPS файлы действительно довольно маленькие.

Для конвертации в EPS команда будет выглядеть примерно так:
$ sam2p image.png EPS: image.eps


Соответственно для конвертации в PDF:
$ sam2p image.png PDF: image.pdf


Среди полезных опций программы sam2p есть выбор версии PostScript, разрешения получаемого файла (в dpi) и алгоритма сжатия (LZW, ZIP, RLE, FAX, DCT, JPEG).

Вот, к примеру, результат конвертирования скриншота программы Google Earth с помощью sam2p и с помощью ImageMagick:
$ ls -rSsk1 google-earth-screenshot*
1756 google-earth-screenshot.png
3016 google-earth-screenshot-(sam2p).eps
4304 google-earth-screenshot-(convert).eps

EPS, конечно, получился больше, чем PNG (кто бы удивилялся). Интереснее сравнить полученные EPS между собой. В данном случае разница в 1,5 раза. Может показаться, что это не существенно, но если таких изображений много, то накопится прилично. А если изображения попроще, чем спутниковые фотоснимки, разница более заметна.

Например, вот такая картинка в формате PNG:


И вот такие результаты конвертации в EPS:
$ ls -rSs1k pooh-pooh*
84 pooh-pooh.png
156 pooh-pooh-(sam2p).eps
872 pooh-pooh-(convert).eps

Разница между convert и sam2p в 5,5 раз, в пользу последнего!

Есть ещё на CTAN пакет bmeps, который, по слухам, тоже неплохо справляется с задачей конвертации растра в EPS — но его я пока не пробовал.

Ссылки по теме:
страница sam2p
страница bmeps

P.S. Я написал эту заметку также по-английски: Effective conversion from raster to EPS.

Неправильные номера изображений в LaTeX

Наблюдение: иногда можно обнаружить, что хотя внутри окружения figure есть команда \label{fig:oops}, а в тексте есть команда \ref{fig:oops}, ссылающаяся на это же изображение, в получаемом документе номера под картинкой и в ссылке на неё могут не совпадать.

И это не ошибка в LaTeX! Просто команда \label должна идти всегда после команды \caption. Всегда. Как я понимаю, это связано с тем, что увеличение счетчика изображений происходит где-то внутри внутри команды \caption, и если \label идёт первой, то с меткой связывается неправильный или неопределённый номер.

Внеклассное чтение: figure numbers wrong in LaTeX