Показаны сообщения с ярлыком useful tools. Показать все сообщения
Показаны сообщения с ярлыком useful tools. Показать все сообщения

пятница, 25 марта 2011 г.

Стрелки в Pylab

Pylab представляет собой очень мощную библиотеку для графопостроения. При проведении расчётов и анализа данных в Python, при помощи pylab не представляет труда вывести результат на график. Однако просто графики зачастую не являются информативными для неподготовленного читателя. В этом случае, помогают подсказки, сделанные на графиках, в частности, стрелки с указаниями. Кроме того, стрелки являются незаменимыми при построении графиков с несколькими y-осями. В этом случае весьма желательно указывать с помощью стрелок к какой оси относится тот или иной график.

Pylab.arrow

Казалось бы, при всей мощи, от pylab следовало бы ожидать удобной возможности нанесения такого рода деталей на графики. Но, надо признать, что здесь всё не очень очевидно. К примеру, имеется функция pylab.arrow, принимающая начальные координаты (x,y) и (dx,dy). Казалось бы, нет ничего проще.

import pylab as pl
import numpy as np
pl.figure(figsize=(4,4))
pl.title('pylab.arrow, square ratio')
z = np.arange(10)
pl.plot(z,z,'ro')
pl.arrow(2,2,3,4, head_width=0.5, head_length=1)
pl.show()

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

x = np.arange(0.1, 1000, 0.1)
y = np.log(x)

pl.figure(figsize=(6,4))
pl.title('pylab.arrow, different axis scale')
pl.plot(x, y, 'b-')
pl.arrow(400,2,200,3, head_width=0.5, head_length=1)
pl.arrow(200,2,300,4, head_width=0.5, head_length=100)
pl.ylim(ymin = 0)
pl.show()

Мало того, что форма стрелки искажённая, так ещё и надо вручную задавать размеры наконечника head_length и head_width под каждый масштаб.

Pylab.annotate

Однако оказалось, что есть более приличный способ отрисовки стрелок, pl.annotate. На самом деле основное предназначение pl.annotate состоит в том, чтобы отмечать стрелками заданные точки, и одновременно указывать подписи. Например, таким образом:

Для этого был использован следующий код:

pl.figure(figsize=(6,4))
pl.plot(x, y, 'b-')
pl.title('pylab.annotate example')
pl.annotate('Label', xy = (500, np.log(500)), xytext=(300,1),\
                arrowprops=dict(facecolor='red', width=0.5,\
                                    headwidth=10, shrink=0.05),\
                ha='center', va='baseline', fontsize='large')

В качестве аргументов передаются

  • строка с надписью
  • координаты точки, куда указывает стрелка
  • координаты надписи
  • свойства стрелки в ввиде словаря
  • остальные свойства, касающиеся свойств текста

Все свойства текста описаны в мануале по pylab.annotate, посмотреть который можно в интерактивном режиме питона. Например:

$ ipython
> import pylab as pl
> help(pl.annotate)

Что касается свойств стрелки, то их можно посмотреть так:

$ ipython
> import matplotlib
> help(matplotlib.lines.Line2D)

Из основных характеристик стрелок, на которые следует обратить внимание, отмечу следующие:

  • facecolor — цвет наконечника
  • width — толщина линии в пунктах
  • headwidth — ширина наконечника в пунктах
  • frac — доля длины, которую занимает наконечник
  • shrink — отступ, от заданной точки xy до конца наконечника (чтобы наконечник не втыкался точно в заданную точку, а оставил некоторое пространство). Измеряется в долях длины.

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

  • ha (horizontalalignment) — способ выравнивания по горизонтали ('center', 'right', 'left')
  • va (verticalalignment) — соответственно, по вертикали ('center', 'top', 'bottom', 'baseline')
  • rotation — поворот текста (угол в градусах, 'vertical', 'horizontal')
  • fontsize — размер шрифта (можно указать в пунктах, а можно и словами 'small', 'medium', 'large', 'x-large', 'xx-large')

Как видно, при использовании pylab.annotate форма стрелки получилась адекватной. А если вместо надписи оставить пустую строку, то просто получится стрелка от xytext до xy (при условии, что shrink = 0)

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

def my_arrow(label, xy_from, xy_to, color='blue', shrink=0.05, width=0.5, headwidth=10):
    pl.annotate(label, xy = xy_to, xytext=xy_from,\
                    arrowprops=dict(facecolor=color, width=width,\
                                        shrink=shrink, frac=0.1),\
                    ha='center', va='baseline', fontsize='large')

Теперь нет ничего проще, нарисовать стрелку:

pl.figure(figsize=(6,4))
pl.title('pylab.annotate')
pl.plot(x, y, 'b-')
my_arrow('Label', (100,1), (600, 5))
my_arrow('', (300,1), (800, 5))
# красные точки для понимания каким образом позиционируется текст
pl.plot([100,600],[1,5], 'ro')
pl.ylim(ymin = 0)

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

Стоит заметить, что этим вид стрелок не ограничивается. Можно также рисовать стрелки с рюшечками, стоит только в arrowprops упомянуть про arrowstyle.

pl.figure(figsize=(6,4))
pl.title('Fancy arrow')
pl.plot(x, y, 'b-')
pl.annotate('Fancy arrow', xy = (500, np.log(500)), xytext=(300,1),\
                arrowprops=dict(facecolor='red',arrowstyle='fancy',\
                           connectionstyle='angle3, angleA=0, angleB=90'),\
                fontsize='x-large')
pl.ylim(ymin = 0)

Для более детального ознакомления следует посмотреть в примеры mpl_examples/pylab_examples/annotation_demo2.py


Читать далее…

понедельник, 29 марта 2010 г.

Автодополнение в интерактивном Gnuplot с помощью rlwrap

В очень удобной программе построения графиков Gnuplot не работает автодополнение. По крайней мере, в сборке Debian Lenny.

> gnuplot --version
gnuplot 4.2 patchlevel 2

Очень непросто набивать полные названия файлов в интерактивном режиме без дополнения по TAB. Конечно, их можно копировать из вывода !ls с помощью мыши, но это весьма неудобно. Судя по всему, причина лежит в том, что gnuplot собран без поддержки readline.

Поскольку из сорцов пересобирать gnuplot не хотелось, надо было найти альтернативный путь. Оказалось, что существует такая замечательная программа rlwrap, которая позволяет связать readline с программами, в которой нет поддержки readline. Таким образом, программы, в которых не реализованы функции автодополнения, истории команд и т.п., начинают обладать таким функционалом.

Устанавливается эта прога в Debian стандартно:

> sudo aptitude install rlwrap

Запуск осуществляется, как следует из мана, таким образом:

> rlwrap [options] command

В нашем случае command есть gnuplot.

Если взглянуть на man-страницу, то следует обратить внимание на опцию -a, —always-readline. Что она делает более или менее ясно из её названия. Значит, будет использоваться readline независимо от настроек command. Для обеспечения автодополнения имён файлов есть опция -c, —complete-filenames.

Таким образом, запустив gnuplot следующим образом:

> rlwrap -a -c gnuplot
получим gnuplot с автодополнением.

Чтобы каждый раз не писать такую команду, имеет смысл сделать алиас, например, записав в файл ~/.bash_aliases:

alias gnuplot='rlwrap -a -c gnuplot'

Также rlwrap позволяет менять размер истории (см. опцию -s, —histsize), исключать из истории дубликаты (см. опцию -D, —history-no-dupes).

Описанное решение нашёл здесь, за что автору большое спасибо!


Читать далее…

вторник, 1 сентября 2009 г.

Wcd и CDargs. Удобные бродилки по файловой системе.

Известно, что для навигации по директориям файловой системы в Linux используется команда cd:

$ cd Directory/

Если же директория запрятана далеко, то неизбежно придётся набирать команду:

$ cd /path/to/deeply/hidden/directory/subdirectory/destination

Чтобы добраться до destination даже с учётом дополнения по TAB, придётся потрудиться.

Как это сделать проще?

Здесь мы рассмотрим три способа ускорения навигации в консоли по файловой системе.

Алиасы

Во-первых, для часто посещаемых директорий можно создать алиасы. Например, пропишем в ~/.bashrc (если используем оболочку bash):

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Теперь в файле ~/.bash_aliases будем записывать алиасы:

alias destination='cd /path/to/deeply/hidden/directory/subdirectory/destination'

После обновления оболочки (source ~/.bashrc или простого перезапуска терминала) для того, чтобы пройти по предыдущему пути, в командной строке будет достаточно набрать

$ destination
Более того, будет работать автодополнение (если оно установлено, конечно).

К преимуществам можно отнести простоту и удобство в виде автодополнения. Недостаток же состоит в том, что кроме как перейти в назначенную директорию, мы будем не в состоянии.

Например, пусть в директории destination есть поддиректория subdirectory. Перейти в неё за одно действие описанным способом нельзя. Команда destination/subdirectory не сработает, алиасы bash этого не понимают. Алиасы в zsh поумнее, возможно, они с этим справятся, но я не специалист в этом вопросе.

Программа WCD

WCD (Wherever Change Directory) позволяет быстро менять директории. Программа кэширует дерево каталогов, после чего для перехода в destination из любой точки файловой системы достаточно скомандовать.

$ wcd destination

Здесь не будет работать автодополнение (по крайней мере у меня не работает. Если кто завёл - отзовитесь :) Зато будут функционировать wildcards * и ?. Более того, можно использовать неполное имя директории. Например, сработают варианты:

$ wcd dest
$ wcd *tion
$ wcd dest??ation

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

a /usr/share/doc/texlive-latex-extra-doc/latex/datenumber
b /usr/share/doc/texlive-latex-extra-doc/latex/datetime
c /usr/share/icons/gnome/16x16/stock/data
d /usr/share/icons/gnome/24x24/stock/data
e /usr/share/icons/gnome/48x48/stock/data
f /usr/share/icons/hicolor/128x128/stock/data
g /usr/share/icons/hicolor/16x16/stock/data
h /usr/share/icons/hicolor/192x192/stock/data
i /usr/share/icons/hicolor/22x22/stock/data
j /usr/share/icons/hicolor/24x24/stock/data
k /usr/share/icons/hicolor/32x32/stock/data
l /usr/share/icons/hicolor/36x36/stock/data
m /usr/share/icons/hicolor/48x48/stock/data
n /usr/share/icons/hicolor/64x64/stock/data
o /usr/share/icons/hicolor/72x72/stock/data
p /usr/share/icons/hicolor/96x96/stock/data
q /usr/share/icons/hicolor/scalable/stock/data
r /usr/share/texmf-texlive/tex/latex/dateiliste
s /usr/share/texmf-texlive/tex/latex/datenumber
t /usr/share/texmf-texlive/tex/latex/datetime
u /usr/share/texmf-texlive/tex/latex/ucs/data
v /var/spool/openoffice/uno_packages/cache/registry/com.sun.star.comp.deploym

Wild match for 137 directories.       w=up x=down ?=help  Page 7/7
Please choose one (<Enter> to abort):

С применением wcd есть возможность заходить в поддиректории назначения, но здесь уже не будет работать автодополнение. То есть либо придётся по памяти набивать поддиректорию, используя wildcard, либо, в случае малой вложенности директорий, в качестве поддиректории сразу вколотить *

$ wcd destination/*
Установка WCD

В Debian пакет есть в репозиториях, поэтому просто:

$ sudo aptitude install wcd

После этого копируем бинарник программы куда-нибудь в $PATH (проверить можно по echo $PATH). В моём случае это ~/bin.

$ cp /usr/lib/wcd/wcd.exec ~/bin

Дальше всё по мануалу (man wcd). Лезем в ~/.bashrc (или какая там у вас оболочка?) и добавляем:

# WCD function
function wcd
{
   $HOME/bin/wcd.exeс $*

   . $HOME/bin/wcd.go
}
(Для csh будет alias wcd "$HOME/bin/wcd.exe \!* ; source $HOME/bin/wcd.go")

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

$ wcd -s
$ wcd -A /media
Можно объединить
$ wcd -s -A /media/

Теперь можно пользоваться программой. У wcd много дополнительных возможностей, например графический интерфейс, который строит дерево каталогов:

$ wcd -ga
        |         |       |        |- 700
        |         |       |        |- mm4b -+- 550_105min
        |         |       |        |        |- 550_30min
        |         |       |        |        |- 625
        |         |       |        |        `- 725
        |         |       |        `- old_MM4_PeaksCorrection -+- 350
        |         |       |                                    |- 400
        |         |       |                                    |- 450
        |         |       |                                    |- 500
        |         |       |                                    |- 550
        |         |       |                                    |- 600
        |         |       |                                    |- 625
        |         |       |                                    |-<650>

        |         |       |                                    |- 675
        |         |       |                                    `- 700
        |         |       `- results
        |         |- old_perovskites -+- Membrane -+- air -+- dat
        |         |                   |            |       `- raw
        |         |                   |            |- graphs -+- Air
        |         |                   |            |          `- Vacuum
        |         |                   |            |- photo -+- 280307
        |         |                   |            |         `- 290307
        |         |                   |            |- synchrotron -+- correct
        |         |                   |            |               `- uxd
        |         |                   |            `- vacuum --- Vac_dat
Однако для меня достаточно лишь быстрого хождения по директориям.

Программа CDargs

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

$ cv bookmark
/path/to/buried/directory/with/bookmark
То есть, скомандовав перейти в bookmark из любой директории, мы прошли разом весь путь.

Какое же отличие от простых алиасов? Во-первых, есть возможность заходить в поддиректории, более того, с использованием автодополнения.

$ cv Music [TAB]
Music/Audiobooks/   Music/Foreign/      Music/Sounds/
Music/Classic/      Music/Fun/          Music/Soundtrack/
Music/Collections/  Music/Russian/
$ cv Music/Classic/ [TAB]
Music/Classic/Classic\ in\ rock/     Music/Classic/\М\у\с\о\р\г\с\к\и\й/
Music/Classic/PlanetClassic/         Music/Classic/\П\у\ч\ч\и\н\и/
Music/Classic/\В\и\в\а\л\ь\д\и/      Music/Classic/\Р\а\х\м\а\н\и\н\о\в/
Music/Classic/\Д\в\о\р\ж\а\к/        Music/Classic/\Р\о\с\с\и\н\и/
Music/Classic/\М\о\ц\а\р\т/          Music/Classic/\Ч\а\й\к\о\в\с\к\и\й/

Во-вторых, есть возможность быстрого копирования файлов в точку ФС, куда указывает закладка.

$ cpb foo bookmark/subdirectory
Но тут, к сожалению, не работает дополнение по табу :(

В третьих есть псевдогуи, на ncurses.

Установка CDargs

В Debian Lenny, опять же, программа есть. Поэтому

$ sudo aptitude install cdargs

После этого можно запустить cdargs и почитать справку, нажав ?. Можно добавить закладки через GUI, а можно просто отредактировать файл ~/.cdargs:

cac /home/maxim/Documents/conferences/cac
Documents /home/maxim/Documents
Music /home/maxim/Music
Video /home/maxim/Video
devel /home/maxim/devel
python-dev /home/maxim/devel/python
Incomplete /home/maxim/p2p/Incomplete
p2p /home/maxim/p2p
data /media/data/

Для bash в ~/.bashrc пишем:

# CDargs function
if [ -e /usr/share/doc/cdargs/examples/cdargs-bash.sh ]; then

  . /usr/share/doc/cdargs/examples/cdargs-bash.sh
fi
function cv () {
    cdargs "$1" && cd "‘cat "$HOME/.cdargsresult"‘" ;
}

Теперь, после перезапуска оболочки бегаем по файловой системе со скоростью спринтера.

Резюме

Второй и третий методы более совершенны, нежели первый. У каждого есть свои плюсы и минусы, поэтому лично я использую оба, тем более, что с cdargs я познакомился совсем недавно.

Несомненно, программы wcd и cdargs существенно облегчат жизнь обитателям консоли. Напоследок хотелось бы отметить, что с cdargs я познакомился благодаря обзору на Debian Package of the Day.


Читать далее…

пятница, 21 августа 2009 г.

Включение и отключение flashplayer в Conkeror и не только

Проблема

Есть в природе flash-анимация, которая проигрывается flash-плейером. Иногда даже она может быть полезной, например, если очень хочется глянуть в интернете на http://youtube.com какой-нибудь ролик. Но вот когда она мелькает перед глазами, демонстрируя бездарную рекламу, появляется желание от неё избавиться, не только из-за навязчивости но и из-за прожорливости флеша в смысле процессорных ресурсов.

Поэтому хочется иметь по умолчанию флеш в отключенном состоянии, а включать только при необходимости. В популярных браузерах есть возможность включать и отключать это зло кликами мыши. К сожалению, в менее популярном браузере Conkeror такой опции пока нет (по крайней мере для версии Debian-0.9~git090223-1), а очень хотелось бы. Здесь я напишу каким образом я решил поставленную задачу. Решение не самое идеальное, поэтому при наличии интересных мыслей по этому поводу, добро пожаловать в комментарии!

Дано

На борту Debian Lenny (stable, на момент написания заметки),

$ uname -r
2.6.26-2-686

Flash поставлен проприетарный, flashplugin-nonfree, (другой на моей технике просто не шевелится) по официальной инструкции.

Предлагаемый подход и реализация

Поскольку для работы плейера пользователю необходимо иметь права для чтения библиотеки libflashplayer.so, запрет на чтение приведёт к тому, что неугодная анимация работать не будет. Файл libflashplayer.so лежит в моём случае в директории /usr/lib/flashplugin-nonfree:

$ ls /usr/lib/flashplugin-nonfree
итого 9916
-rw-r--r-- 1 root root 10131640 Фев  3  2009 libflashplayer.so
-rw-r--r-- 1 root root     2933 Июл 27  2007 pubkey.asc

Как видно, владелец - root, а группа и все остальные имеют право на чтение. Этого-то права мы и собираемся лишить, но не здесь, и чуть позже. Для начала скопируем файл libflashplayer.so в директорию ~/.mozilla/plugins

$ cp /usr/lib/flashplugin-nonfree/libflashplayer.so ~/.mozilla/plugins

Почему туда? Именно там Conkeror ишет плагины в первую очередь. На вики-странице говорится о том, что кроме того плагины могут лежать в ~/.conkeror/plugins, но у меня, почему-то это не работает.

Теперь лишим нас всех прав для чтения этого файла:

$ chmod a-r ~/.mozilla/plugins/libflashplayer.so

В результате, после перезагрузки страницы, содержащей флэш, мы насладимся его отсутствием. Вернуть его обратно можно, дав права на чтение:

$ chmod a+r ~/.mozilla/plugins/libflashplayer.so

Поскольку, для такой процедуры не очень здорово всегда писать в терминале подобную команду, имеет смысл забиндить эти действия на какие-нибудь комбинации клавиш. Я, например, для этого пользуюсь xbindkeys, и добавил в ~/.xbindkeysrc следующие строки (но можно использовать способы заданий комбинация клавиш для вашего оконного менеджера или для другой программы "забиндивания"):

"chmod a-r ~/.mozilla/plugins/libflashplayer.so"
Mod4 + bracketright
"chmod a+r ~/.mozilla/plugins/libflashplayer.so"
Mod4 + bracketleft
Таким образом, при нажатии Win + [ флэш включается, а при Win+] прибивается (не забываем предварительно перезапустить xbindkeys).

В принципе, всё работает, казалось бы, добились того, чего хотели. Всё бы ничего, но вот если вы залезете на тот же http://youtube.com, включив флэш, то выключение таким образом уже не отобразится на поведение флэша на других страницах, потому что программа flashplayer уже запущена и работает, а все изменения на неё не влияют. Чтобы изменения вступили в силу, надо просто закрыть страничку youtube. Хотя это и не всегда у меня наблюдалось.

Если честно, эту особенность обнаружил только когда писал пост и перепроверял всё на собственной шкуре. На других сайтах как-то не замечал такого - обычно после перезапуска страницы перезапускался и флэш. Стало быть, изменив права доступа, после перезапуска страницы я добивался того, чего хотел.

Резюме

Итак, пока для Conkeror пока не прикрутили переключалку флеша, я сгородил свою :) Разумеется, она должна работать не только для Conkeror, но и, судя по всему, для Firefox (полагаю, что тогда надо запретить пользователям читать общий файл /usr/lib/flashplugin-nonfree/libflashplayer.so, для чего нужны права рута, что для машины с одним пользователем приемлемо), хотя в этом и нет особой нужды, потому что там есть свои резалки флэша.

Поскольку решение неидеальное, был бы очень рад услышать пожелания/предложения.


Читать далее…

среда, 1 июля 2009 г.

Работаем с лёгкостью с архивами в консоли. Утилита atool.

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

$ tar xzvf archive.tar.gz
$ tar czvf new_archive.tar.gz directory_to_pack
$ tar xjvf archive.tar.bz2
$ tar cjvf new_archive.tar.bz2 directory_to_pack
Как видно, ключи в случае gzip и bzip2 используются разные, а ещё в природе есть (если не вспоминать про более редкие arj, arc, p7zip, ace) zip и rar, которые распаковываются с помощью unzip и unrar.

В случае архивов rar и zip есть весьма большая проблема, состоящая в том, что в этих архивах, как правило, файлы лежат не в какой-нибудь директории, а просто так, "в корне". Это чревато тем, что распаковывая какой-нибудь из таких архивов (если вы не озаботились создать под содержимое архива новую поддиректорию), имеется неплохой шанс загадить текущую директорию множеством файлов из него, хотя вы ожидали, что будет создана новая поддиректория, где и будет всё собрано.

В принципе, не такая уж и проблема, всё запомнить, но было бы, разумеется, куда более здорово, если бы существовала универсальная программа архиватор/разархиватор для всех нужных форматов. И такая программа есть! Это atool, набор скриптов, позволяющий свести к минимуму нагрузку на мозг :)

Для распаковки архива достаточно скомандовать:

$ aunpack archive.tar.gz
Вместо gz может быть bzip, bzip2, zip, 7zip, rar, arj и прочее (смотрите мануал). Замечательно, что все архивы при таком использовании будут распакованы в отдельную поддиректорию, даже если все файлы в архиве лежат в корне, а не в отдельном каталоге (в этом случае будет создана поддиректория с названием, соответствующим названию архива)! Таким образом, текущую директорию вы, независимо от того, что за архив вы поковыряли, не загадите, а что более важно, не перезапишете случайно старые файлы.

Чтобы распаковать содержимое архива в какую-то заданную директорию служит ключ -X или —extract-to:

$ atool archive.rar -X path_to_extract
В данном случае путь path_to_extract уже должен существовать.

Запаковать файлы file1, file2 и директорию dir в zip-архив можно не менее простой командой:

$ apack new_archive.zip file1 file2 dir
Использование wildcards * , ? и прочих регулярных выражений очень облегчает работу.

Для того чтобы запаковать директории dir1, dir2, dir3 в архивы dir?.tar.bz2 достаточно выполнить:

$ apack -e -F tar.bz2 dir*

-e выполняет команду для каждого архива, указанного в регулярном выражении dir*, а -F tar.bz2 указывает на формат архива. Формат можно указывать как в виде расширения, так и в виде tar+bz2.

Для просмотра содержимого архива служит als:

$ als archive.tar.bz2
а посмотреть содержимое файла readme в архиве можно так:
$ acat dwm-4.7.tar.bz2 dwm-4.7/readme | less

Резюме

Если вы предпочитаете работать в консоли, то программа atool окажется очень полезной для работы с архивами, она избавит от необходимости запоминать ключи для разных программ-упаковщиков и позволит освободить мозговые ресурсы для более полезных занятий. А использование регулярных выражений даёт возможность выполнять большой обьём работы, по меркам графических программ, с помощью коротких команд.

Сам я познакомился с atool благодаря этой заметке.


Читать далее…

среда, 6 мая 2009 г.

Синхронизация файлов с использованием Unison-gtk

Для чего нужна синхронизация?

У меня есть компьютер на работе, дома, а также есть ноутбук, который тоже порой необходим. Хорошо, если работать надо только находясь на работе, в рабочее время. Но зачастую это не так. Как быть, если вы исправили на работе кучу файлов и хотите с ними продолжить возиться ещё и дома? Каким образом перенести их домой с наименьшими затратами? Можно, конечно, скопировать их на сменный носитель отдельно, но если их много и разбросанных по разным директориям, то этот вариант едва ли осуществим, ведь порой копировать весь большой каталог, в котором заведомо лежат все изменённые файлы, весьма напряжно (с этим ещё можно смириться в крайнем случае). Более того, есть риск удалить с флешки что-либо, что вы могли не перенести на рабочий компьютер (а вот с этим гораздо сложнее!). На помощь приходит синхронизация файлов. Проведя синхронизацию двух директорий, вы получите заведомо одинаковые файлы в обеих директориях. Старые заменятся на новые, те, которые вы удалили, будут удалены и в новой директории. Таким образом, вы избавитесь от необходимости вручную отслеживать что и где вы поменяли, чтобы потом безболезненно перенести результаты своей работы домой.

Unison - программа для синхронизации файлов и директорий

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

Для пользователей KDE, вероятно подойдёт возможность синхронизации в файловом менеджере krusader. О такой возможности можно почитать на официальном сайте.

А для тех, у кого KDE нет я могу посоветовать Unison. Выдержки с официальной страницы:

  • Программа работает как на машинах с Unix-подобными операционными системами, так и с Windows, более того позволяет работать между платформами, производя синхронизацию между машинами с разными осями.
  • В отличие от простого зеркалирования Unison может работать с обновлениями на обоих, так сказать, «концах». Возможные конфликты будут подсвечены.

Допустим, на рабочем компьютере есть директория Dir, в которой содержатся файлы b, c, d. А на флешке директория Dir_flash содержит файлы b, c, e. Отличие заключается в том, что в Dir есть d, но нет e, а в Dir_flash есть e, но нет d. После синхронизации обе директории будут иметь b, c, d, e, что и требовалось.

  • Unison работает между любой парой компьютеров, подключённых к интернету. Трансферы малых обновлений больших файлов оптимизированы благодаря использованию сжатого протокола, аналогичного rsync.

Судя по всему, то, что надо. Более того, программа имеет графический интерфейс gtk, что даёт возможность совсем не напрягаться с настройкой и работой.

Установка Unison в Debian

В Debian имеется две версии программы: с графическим интерфейсом (unison-gtk) и без него (unison). Установим Unison с GUI:

sudo aptitude install unison-gtk

Запускаем. Будет предложено создать профиль, потому что до этого ещё профилей не было. Необходимо указать две директории, в которых нужно произвести синхронизацию (Обращаю внимание, что флешка должна быть примонтирована). Если вдруг вы создали не тот профиль, что хотелось, то удалить его, находясь в графическом режиме не удастся. Профили лежат в директории ~/.unison и имеют формат:

$ cat ~/.unison/devel.prf
root = /home/maxim/devel
root = /media/usb/devel
То есть можно просто переименовать файл профиля и поменять пути простым редактированием файла.

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

Если вы синхронизируете директории впервые, то появится следующее окно, в котором просто сообщается о том, что синхронизация производится впервые. Жмите «OK».

В случае возникновения конфликтов, можно разрешить их вручную, нажав кнопки «Right to Left» или «Left to Right», в зависимости от того, в какую сторону хотите разрешить конфликт. Если файлы текстовые, то посмотреть их различие можно, нажав на кнопку «Diff». Копирование файлов запускается после нажатия кнопки «Go».

Очень полезной особенностью является возможность игнорировать определённые директории или файлы. Для этого надо выбрать в меню «Ignore» соответствующий пункт:

  • «Permanently ignore this path» для того, чтобы всегда пропускать этот путь при сканировании
  • «Permanently ignore files with this extension», чтобы пропускать файлы с данным расширением

При этом в профиле это отображается строкой:

ignore = Path {/your/path/to/ignore}
ignore = Name {,.}*{.tmp}

Вторая строка для того, чтобы пропускать файлы с расширением tmp

Советую посмотреть возможные опции в подменю «Actions», там есть весьма полезные опции типа разрешения конфликтов в пользу определенной директории или в пользу более новых файлов. Думаю, разобраться что пункты этого меню означают весьма легко, английский ведь мы знаем :).

Подводные камни

Без подводных камней здесь тоже не обошлось.

Права доступа

Как известно, в файловых системах Unix используются права доступа для хозяина, для группы и других пользователей. На флешке, обладающей файловой системой fat32 из-за необходимости обмениваться данными с виндовыми компьютерами, такой возможности нет. Поэтому если вы попытаетесь записать с помощью Unison на флешку файлы с правами, отличающимися от 644, то получите, скорее всего сообщение о невозможности синхронизации.

Замечу, что у меня флешка монтируется через /etc/fstab таким образом:
/dev/sda1 /media/usb auto rw,user,noauto,showexec 0 0
я использую параметр showexec, чтобы файлы не были исполняемыми, таким образом, все файлы у меня на флешке имеют права 644.

Конечно в данном случае можно привести все файлы к требуемому виду с помощью утилиты find:

find . -type f -exec chmod 644 \{} \;
Но это не выход.

Другое решение состоит в том, чтобы добавить в профиль строку

perms = 0

После этого права доступа будут игнорироваться.

Не удалите случайно свои файлы!

Если вы не подмонтирете флешку, то при попытке просканировать на ней директорию получите предупреждение:

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

Я проэкспериментировал, нажав «OK», а затем «Go». Программа удалила директорию целиком. При повторной синхронизации с уже подмонтированной флешкой, все вернулось обратно, что радует, но лучше не рисковать с этим.

Резюме

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


Читать далее…