20080228

Строим графики: графический интерфейс для gnuplot

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



Поскольку программа с графическим интерфейсом, то проще показывать, чем рассказывать. Учебный видеоролик на флэше можно посмотреть здесь. Размер ролика 1,9 мегабайт.

P.S. Видеоролик я сделал с помощью wink. Попробовал первый раз. Оказалось, что это довольно удобная программа для записи screencast-ов в формате флэш. К сожалению, мне не удалось в ней сделать комментарии на русском языке, поэтому весь ролик прокомментировал по-английски. Прошу прощения за это маленькое неудобство.

Читайте также другие статьи по теме:
Как построить график с изолиниями в gnuplot, gri и pylab
Цветные поверхности в gnuplot в режиме pm3d
Построение одномерных графиков в gnuplot
Создание графиков в gnuplot: деления на осях
Строим научные графики с помощью gnuplot (вводная статья)
Создание простейшей карты в GMT
Сравнение программ для построения графиков

20080226

Как записать интернет-радиостанцию в файл

Я время от времени пользуюсь пакетом streamripper, чтобы сохранять вещание интернет-радиостанций в файл. Обычно я использую его примерно так:
$ streamripper http://адрес-mp3-потока-радиостанции -a radio.mp3 -M 50 -t
— сохранить всё в один файл radio.mp3 («-a radio.mp3», без этой опции каждый трек должен писаться в отдельный файл, но увы не все интернет-радиостанции разделяют треки и далеко не все вещают id3-тэги), писать максимум 50 мегабайт («-M 50»), а при разрыве соединения временные файлы не перезаписывать («-t») (предыдущие фрагменты тогда остаются в Название-станции/incomplete/).

Записываемый файл можно прямо на лету слушать mplayerом.

Применений этому множество:
  • можно сохранять радиопередачи по расписанию (crontab),
  • можно пропускать рекламу (благо, её длительность обычно фиксированна) и затянувшийся трёп,
  • можно повторно прослушать название понравившейся песни,
  • можно повторно прослушать саму песню,
  • можно пропускать неприятные песни,
  • можно спокойно поставить радио «на паузу»…
А вот и список разных российских радиостанций, доступных онлайн.

Дополнение: для streamripper есть несколько графических интерфейсов. Пользователи GNU/Linux могут воспользоваться StreamTuner, Tunapie или KRadioRipper. Вот так выглядит StreamTuner:

20080222

Каталог игр в Debian

И перед глядущими праздниками и выходными — несерьёзный пост. Недавно узнал про пакет goplay. Программка позволяет посмотреть, какие игры доступны в репозитории Debian, игры можно выбирать по жанру и по типу интерфейса. Сразу можно прочитать описание, сходить по ссылке на страницу игры... Я и не знал, что игр для Linux так много :)

Для некоторых игр сразу доступны скриншоты:



В общем, довольно занятная программка. Интерфейс немного сыроват, но терпим. Все описания правда только по-английски... Чтобы программа заработала, надо перед её запуском сделать с правами root-а:
ept-cache reindex

Ну а выбрав игру, устанавливать её можно как обычно.

Дополнение: найти нужный пакет по тэгам (не только игры!) можно используя вот эту веб-страницу.

Как добавить дату и время к каждой строчке стандартного вывода

Если же нужно именно добавить timestamp (дату и время) к каждой строке стандартного вывода некой программы, то это можно сделать, например, пропустив стандартный вывод через следущий пайп:
… | while read ; do echo `date` ${REPLY} ; done

Например,
~$ (echo раз\! ; sleep 1 ; echo два\! ; sleep 2 ; echo три\! ; sleep 3 ; echo четыре\!) | while read ; do echo `date +%H:%M:%S` ${REPLY} ; done
13:08:22 раз!
13:08:23 два!
13:08:25 три!
13:08:28 четыре!


Дополнение: Как заметил Алексей Свешников, проставление дат и времени с помощью перла должно работать быстрее:
… | perl -pe 'print "[", scalar(gmtime), "] ";'


P.S. magik, пишущий в блог «Записки океанолога», начал сегодня вести подкаст с обзорами русских блогов о Linux и *NIX (по материалам планеты русских блогов о *NIX — runix.org)

20080220

Настройка выхода на проектор с помощью режима TwinView для Nvidia GeForce 8400MG

Сегодня понадобилось настроить работу проектора на ноутбуке Acer Aspire 5520. Подсистема видео — Nvidia GeForce 8400MG. Надо было настроить Xorg так, чтобы одно и то же изображение выдавалось и на экран ноутбука, и на проектор.

Дополнение: в комментариях говорят, что можно всё было настроить с помощью графической утилиты nvidia-settings.

Дополнение: пользователям ноутбуков с видео Intel или ATI подключать ноутбук к проектору гораздо проще. Включить VGA-выход и задать на нём нужное разрешение можно командой xrandr.

Что наблюдалось: подключаю проектор, запускаю машину, при загрузке изображение на проектор выдаётся нормально, потом запускается KDM, изображение на проекторе пропадает, нажатие кнопки переключения видеовыхода ни к чему не приводит. При переключении в виртуальную консоль (Ctrl-Alt-F1) изображение на проекторе появляется, при переключении обратно в сеанс X (Ctrl-Alt-F7) — пропадает. Нажатие Fn+5 (переключение видеовыходов) ни к чему не приводило.

Я уже давно и старательно выбираю системы только со встроенным видео Intel, так что в этот раз пришлось погуглить. В результате, я только сегодня узнал, что у nVidia есть специальный режим TwinView для вывода на два монитора, и его-то и надо должным образом настроить. Использовался видеодрайвер nvidia.

Как поступать правильно, честно говоря, не знаю. Просто добавил в /etc/X11/xorg.conf в раздел Screen следующие строчки (ноутбук уже отдал хозяину, и пишу по памяти, повторно подглядывая в найденные в интернете советы и рецепты):
Option "TwinView" "1"
Option "TwinViewOrientation" "Clone"
Option "TwinViewXineramaInfoOrder" "DFP-0,CRT-0"
Option "MonitorLayout" "LFP,LFP+CRT"
Option "metamodes" "DFP: 1280x800 +0+0, CRT: NULL; DFP: 1024x768 +0+0, CRT: 1024x768 +0+0; DFP: 800x600 +0+0, CRT: 800x600 +0+0"
После этого стало возможно переключать метарежимы (комбинации режимов для ЖК-экрана и для внешнего VGA-выхода) по Ctrl-Alt-Fn-+/-. В данном случае режим 1280×800 показывается только на ЖК-экране, режимы 1024×768 и 800×600 показываются и на экране, и на внешнем проекторе. Как легко заметить, метарежимы отделяются друг от друга точкой с запятой, а режимы каждого из устройств вывода — запятыми. Изменение «+0+0» на что-нибудь вроде «+1280+0» позволяет настроить работу двух экранов рядом (если указано «+0+0» — изображения на экранах совпадают). Как я понял, порядок устройств, указанный в опции TwinViewXineramaInfoOrder влияет на то, на каком из двух экранов будет рисоваться приглашение KDM/GDM, панель KDE и прочее. Впрочем, поэкспериментировать особо времени не было.

Надо отметить, что у меня проектор был подключен сразу при запуске машины. Похоже, это имеет значение. В интернете встречаются советы добавить опцию «Option "ConnectedMonitor" "CRT,CRT"». Впрочем, у меня всё заработало без неё. Если этот ноутбук ещё раз попадёт мне в руки — может быть попробую.

К сожалению, я не знаю иного способа изменить виртуальное разрешение (разрешение рабочего стола), иначе, как поставив первым другое разрешение в списке режимов. В результате, во всех трёх метарежимах виртуальное разрешение остаётся одним и тем же, 1280×800. Так что решение половинчатое. Ничего лучше, чем запускать второй X-сервер специально для показа чего-либо на проекторе — в голову пока не пришло.

Если кому интересно: на ноутбуке стояла Mandriva 2007, работало всё, кроме проектора, вроде бы гладко, но ставил не я, поэтому не могу сказать, сколько там до этого требовалось плясок с бубном.

Ссылки по теме:

How to use linux laptop in presentations ★★★
Getting a projector to work under Ubuntu Linux with Nvidia drivers
Nvidia, TwinView and xorg.conf
Gentoo Wiki: Dual Monitors Howto
Как включить VGA-выход на проектор (используя xrandr)

20080219

Резервное копирование и шифрование архивов с помощью cpio (или tar) и gpg

Есть много программ для организации резервного копирования, простых и сложных. Однако часто достаточно самого простого: запаковать, зашифровать и положить на удалённую машину (записать на внешний диск, DVD и т.д). А это делается простыми (стандартными) инструментами — cpio и gpg — всего пара команд. Или tar и gpg — тоже пара команд.

Создание архива:
$ cd ~/work && \
find . -depth -print0 | \
cpio -0 -o | \
gpg -c -a > /mnt/remote/backup/work.cpio.gpg
find найдёт в текущем каталоге (~/work) все файлы и каталоги, cpio упакует их в единый архив, gpg спросит пароль и зашифрует симметричным алгоритмом.

Восстановление из резервной копии:
$ mkdir ~/work-restore && \
cd ~/work-restore && \
gpg -d /mnt/remote/backup/work.cpio.gpg | cpio -idv


Можно ещё и сжать bzip2, если между cpio и gpg вставить bzip2 -c. Создание архива:
$ find . -depth -print0 | cpio -0 -o | bzip2 -c | gpg -c -a > arhive.cpio.bz2.gpg
Восстановление из резервной копии:
$ gpg -d archive.cpio.bz2.gpg | bzcat -c | cpio -idv

Проще уже некуда. И при этом вся гибкость find к нашим услугам. А это значит, что гораздо проще заархивировать только нужные файлы, а не все подряд. Например, файлы изменённые за последние двое суток легко отбираются с помощью:
$ find . -ctime -2


P.S. Конечно, вместо cpio можно пользоваться и tar. Вот только использовать тогда find для выбора нужных файлов — затруднительно. Если нужно запаковать каталог целиком, то поступать можно так:
$ cd ~/work && \
tar cj . | gpg -c -a > /mnt/remote/backup/work.tar.bz2.gpg
а распаковать так:
$ mkdir ~/work-restore && \
cd ~/work-restore && \
gpg -d work.tar.bz2.gpg | tar jx
Дополнение:Как заметил в комментариях Alexey, упаковать найденные find файлы можно и используя tar. В этом случае используется опции tar -T (читать список файлов из файла) и --null (имена файлов разделены нулевым байтом). Поясняю на примере, создание зашифрованного архива:
$ find . условия поиска -print0 | tar c --null -T - | gpg -c -a > файл_с_архивом.tar.gpg
и распаковка:
$ gpg -d файл_с_архивом.tar.gpg | tar x

В общем, дело вкуса.

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

Синхронизация каталогов по SSH+rsync и по FTP
Как сделать копию удалённого репозитория Subversion

20080218

Кросспост RSS в ЖЖ (bash-скрипт)

Обновление: Более совершенный скрипт для кросспоста был написан мной на Haskell. Подробности здесь.


Захотелось мне наладить автоматическую публикацию ссылок на мои записи в ЖЖ…

Сразу же нашёл сервис rss2lj. Он, однако, в настоящий момент не работает. После этого стал искать, как сделать то же самое своими силами.

Нашёл, что есть два механизма автоматической публикации в ЖЖ. Первый — с использованием XMLRPC. Как это делается на PHP желющие могут увидеть в исходниках плагина к вордпресс lj_crosspost. Второй способ — использовать возможность emailpost в ЖЖ. В этом случае письма, отправленные на адрес вида пользователь@post.livejournal.com будут публиковаться как посты.

Я выбрал второй вариант, потому что письма можно слать из любого скрипта одной командой, а возиться с авторизацией через XMLRPC не хотелось. Правда, функция emailpost в ЖЖ не бесплатна, платить за неё надо либо чистым золотом, либо рекламой. Остановился на рекламе, включив в ЖЖ «улучшенный рекламой эккаунт» :)

После этого оставалось написать скрипт, который бы брал RSS и делал из него много писем. В действительности, такой скрипт уже есть. Можете взглянуть на rss2email, лежащий в репозиториях Debian. Впрочем, он скорее предназначен для чтения RSS через email, а я хотел лишь вытаскивать из RSS ссылки.

Вытащить нужные поля из RSS можно и xmlstarlet-ом:
curl -g http://feeds.feedburner.com/sovety?alt=rss -s | \
xmlstarlet sel -t -m "/rss/channel/item" \
-v "guid" -n -v "pubDate" -n \
-v "title" -n -v "link" -n
Оставалось только атоматически формировать из этих полей текст письма (awk-ом), отсылать всё это в ЖЖ (mutt-ом) и отмечать на память уже отосланные записи (чтобы не слать повторно). Получился вот такой скрипт.

Теперь анонсы моих постов можно прочитать и в ЖЖ: jetxee.livejournal.com.

Что не работает: ЖЖ приходит в ступор, получая письма, в Subject которых UTF-8. По идее Subject должен становиться заголовком поста, но выходит ерунда. ЖЖ должен особым образом обрабатывать в письме строки вида lj-tags: blabla, давая записям тэги, но у меня это тоже почему-то не срабатывает.

20080215

Как построить график с изолиниями в gnuplot, gri и pylab

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

Я покажу как это делается на примере сразу трёх свободных инструментов: gnuplot, gri и matplotlib (он же pylab). Именно этими тремя программами я пользуюсь чаще всего. В тексте буду давать ссылки на полный скрипт, используемый для построения графика, пояснять же буду самое основное. Все графики я буду строить в чёрнобелом варианте, сохраняя в формате EPS. Иллюстрации к этой статье получены последующей конвертацией EPS в PNG.

Итак, дано: файл с данными sampledata.txt, значения x, y, z в три колонки, массив 80×80 точек, каждый следующий «столбец» сетки (следующее значение x) отделён от предыдущего пустой строкой. Файлы такого формата использует gnuplot (для gri и для pylab потребуется преобразовать формат). Задача: построить график с изолиниями постоянного значения z.

Итак, способ первый,

строим график с изолиниями в gnuplot

Здесь всё просто. Отключаем построение поверхности, включаем построение изолиний, включаем «вид сверху», велим выбирать уровни автоматически:
unset surface
set contour
set view map
set cntrparam levels auto 10
Можно задать уровни изолиний и вручную:
set cntrparam levels discrete уровень1, уровень2, уровень3, …
Теперь команда
splot 'sampledata.txt' w l
будет строить график с изолиниями. И вот какой результат получается по-умолчанию в gnuplot:
график с изолиниями, построенный в gnuplot
(Запускал gnuplot так: $ gnuplot plotiso_gnulot.txt)


Способ второй,

строим график с изолиниями в gri

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

Небольшое препятствие состоит лишь в том, что необходимо преобразовать формат данных. Gri хочет, чтобы каждая строка данных отделялась была отдельной строкой в файле, а точки были разделены пробелами. Здесь я использую такую возможность gri, как чтение данных из юниксового «пайпа», и делаю все нужные преобразования на лету с помощью awk:
open "awk ' /[^s]/ { printf($3 \" \"); } /^\s*$/ { print ; }' sampledata.txt |"
read grid data 80 80 bycolumns
close
Построение же собственно изолиний уже совсем просто:
draw contour
Вот что получает в gri:
график с изолиниями, построенный в gri
(gri я запускал так: $ gri -b -output iso_gri.eps < plotiso_gri.txt)


Способ третий,

строим изолинии в matplotlib/pylab

matplotlib — это библиотека для python. Её можно использовать как интерактивно, запуская ipython -pylab, так и внутри обычного скрипта; синтаксис команд построения графиков приближен к синтаксису matlab, но при этом можно использовать на полную возможности Python. А возможности у matplotlib весьма приличные.

Изолинии строятся одной командой:
cset=contour(X,Y,Z)
Здесь X, Y, Z — должны быть двумерными массивами одной и той же размерности. Кроме того, в скрипте я отключил раскраску изолиний по умолчанию, чтобы нарисовать все изолинии чёрным цветом (параметр colors='black'). Другие варианты использования contour можно прочитать в help contour, если запустить ipython -pylab.
Ещё одна команда добавляет к изолиниям подписи:
clabel(cset,fmt="%1.1f",fontsize=9)
Сохранить результат в файл нужного формата тоже просто:
savefig('pylab.eps')
Остальные строчки в скрипте — это преобразование формата данных средствами Python.
Дополнение: в новых версиях SciPy этот скрипт можно значительно упростить, если воспользоваться функцией loadtxt(), загружающей данные из текстового файла. То, что нам надо.
Вот что получается в итоге:
график с изолиниями, построенный в matplotlib/pylab
(скрипт я запускал так: $ python plotiso_pylab.txt)

☙ ☙ ☙

Конечно, выбор конкретного инструмента — вопрос удобства (имеющегося формата данных, требований к тонкостям настройки графики, имеющегося времени, опыта использования). Я хотел показать, что выбирать есть из чего, и построить на графике изолинии с любой из трёх рассмотренных программ — дело двух–трёх строчек. Совершенствовать же результат и настраивать тонкости отображения можно долго. На мой взгляд, в случае построения изолиний, gri и matplotlib предоставляют больше возможностей.

Хочу также заметить, что этими тремя программами список инструментов пригодных для построения графиков с изолиниями не исчерпывается. Надо отметить ещё Tioga, plotmtv, GMT, Asymptote. Есть и пакеты, ориентированные на 3D-данные, но которые можно использовать и для 2D: OpenDX, VTK, MayaVi. Вроде бы можно построить изолинии и в R (приличных примеров я не видел). Судя по документации, есть такая возможность и в scilab (но примеров того, что получается — я тоже не видел). Octave, как я понимаю, предоставляет лишь альтернативный интерфейс для gnuplot. Возможно, эту статью я в будущем дополню ещё какими-то примерами. Если кто-то активно строит графики с изолиниями в чём-то другом — предлагаю поделиться ссылкой на подобные инструкции. Ссылки буду добавлять ниже.

См. также:

Сравнение 9 программ для построения графиков
Цветные поверхности в gnuplot в режиме pm3d

20080212

Подсветка синтаксиса в Vim на тёмном и светлом фоне терминала

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

К счастью, это легко поправимо. Если терминал тёмный, то в vim нужно сказать:
:set background=dark
Чтобы вернуть обратно —
:set background=light

Чтобы не говорить это виму каждый раз, можно добавить нужную строчку в ~/.vimrc.

Авторитетный источник: Vim tips: Tip#53.

P.S. Включить и выключить подсветку синтаксиса можно командами :syntax on и :syntax off соответственно.

20080211

Сохранение сессий в VIM

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

Чтобы сохранить сессию :mks файлсессии

Чтобы восстановить: $ vim -S файлсессии

Таким образом можно переключаться, например, с консольного vim на оконный gvim и обратно.

Дополнение: Как заметил в комментариях PhoeniX, можно включить автоматическое сохранение всех сессий, добавив в ~/.vimrc
autocmd VimLeavePre * silent mksession! ~/.vim/lastSession.vim

Можно включить и автоматическую загрузку последнее сохранённой сессии, добавив
autocmd VimEnter * silent source! ~/.vim/lastSession.vim

20080207

Как задавать произвольные Compose-последовательности

Я уже писал о том, как с помощью клавиши Compose набирать диакритику (символы с акцентами), типографские кавычки и другие символы уникода, отсутствующие в стандартной раскладке . Писал и о том, как я приспособил клавишу Compose, чтобы набирать ударения в словах (добавив специальную Compose-последовательность для символа ударения). Тогда же я ещё сокрушался, что среди стандартных Compose-последовательностей не хватает символа многоточия…

То, как я добавил новую Compose-последовательность (пересобрав метод ввода Latin-Plus) — было решением неудобным и негибким. Недавно же я узнал, как можно гораздо проще и быстрее задавать произвольные Compose-последовательности. Для этого, оказывается, достаточно отредактировать файл ~/.XCompose. Об этом и пойдёт речь.

1. Надо включить клавишу Compose (об этом я уже писал);
2. Маленькая хитрость. Вначале надо настроить систему так, чтобы библиотеки Qt и особенно GTK использовали метод ввода X Input Method (xim). Для этого в Debian можно установить im-switch, запустить im-switch -c и выбрать default-xim из списка. В других системах, видимо, надо присвоить переменным окружения GTK_IM_MODULE и QT_IM_MODULE значение xim (например, поместить GTK_IM_MODULE=xim в /etc/environment). Если этот шаг пропустить, все последующие настройки на GTK приложения распространяться не будут (они будут использовать свой метод ввода). С Qt приложениями, если честно, я не экспериментировал, но видимо и они могут иметь отдельную настройку;
3. После этого можно создать в домашнем каталоге файл ~/.XCompose. Первой его строчкой можно включить все стандартные комбинации клавиш:
include "/usr/share/X11/locale/en_US.UTF-8/Compose"

а затем можно и задать любые дополнительные последовательности (по образцу как в /usr/share/X11/locale/en_US.UTF-8/Compose). Например,
<Multi_key> <period> <space> : "…" U2026 # HORIZONTAL ELLIPSIS, многоточие
<Multi_key> <apostrophe> <apostrophe> : "́" U0301 # ударение

Всё, в запускаемых теперь приложениях должны работать новые комбинации. В частности, при нажатии Compose + точка + пробел будет набираться знак многоточия (который отличается от трёх точек), а если после буквы нажать Compose + два раза апостроф — над буквой появится знак ударения.

Таким образом можно вводить любые сиволы из уникодной таблицы (найти нужный символ поможет gnome-character-map). Достаточно вставить этот символ в кавычки после описания последовательности. Можно таким образом создавать целые клавиатурные макросы. В частности, я попробовал повесить <a href="" ></a> на сочетание Compose+a+h. Работает! Желающие могут взглянуть на мой файл ~/.XCompose (кодировка UTF-8). Я добавил туда ещё немного математики и греческие буквы.

Теперь можно прямо в e-mail писать: «∀ε>0 ∃δ>0 ∀x,|x-x₀|<δ : …» :)

Информацию я почерпнул из этих источников:
International text support on Linux
Compose key magic

Дополнение: в комментариях Shoorick дал ссылку на свой .XCompose, в котором есть дореволюционная буква «ѣ» и другая экзотичная кириллица, довольно удобные кавычки для русской раскладки, а также буквы для татарского, башкирского и казахского языков и набор разных стрелок (← → ↗ ↘ ⇐ ⇒ …): http://shoorick.ru/lj/txt/dotXCompose_as (стрелки, дореволюционные буквы и кавычки я заимствовал в свои настройки).

OpenID в Blogger, без делегации

Я уже рассказывал, как можно использовать блоги на blogspot в качестве OpenID. Описанный ранее способ полагался на делегацию OpenID запроса стороннему провайдеру OpenID (например, ЖЖ). Сегодня я дополнил эту заметку описанием другого способа, без делегации запроса. С недавних пор blogger.com стал сам OpenID-провайдером. И хотя возможность эта пока экспериментальная, вроде бы работает.

Итак, кому интересно, читайте про использование «родного» OpenID в Blogger.

20080205

Использование словарей Lingvo 11 в Linux

Предыстория


Какое-то время назад я купил Lingvo 11 «Шесть языков», ту версию, которая стоила около 2000 руб. Покупал в основном для того, чтобы использовать на наладоннике, потому что словари Multilex для наладонника продавались каждый язык отдельно, и нужный мне набор получался дороже, чем хотелось бы. Однако в Lingvo 11 входила и версия для Windows. Более того, мне пришлось её поставить, чтобы установить словари в наладонник, но с тех пор я так и не мог ей воспользоваться (потому что пользуюсь я каждодневно линуксом). А недавно стало обидно: такие деньги заплачены, а словари лежат… Тем более, что lingvo.yandex.ru доступен не всегда.

Посещение форума Lingvo показало, что АББИИ как не хотела, так и не хочет делать оболочку Lingvo ни для линукса, ни для маков… Можно сказать даже всячески препятствуют использованию своего продукта в не-Windows операционных системах и эмуляторах.

Оболочки же для словарей в линукс и на маке давно есть готовые (stardict, например, или его консольная версия sdcv, TranslateIt на маке). Достаточно было бы продавать словари в любом открытом формате, но ни продавать, ни лицензировать словари отдельно в АББИИ не хотят. И с сайта stardict.sourceforge.net коллекцию сконвертированных в формат stardict словарей заставили недавно убрать.

Закон РФ и юридическое творчество АББИИ


На мой взгляд в этом случае я, как обладатель экземпляра программы вправе изменить программу/базу данных так, чтобы она работала на моих технических средствах и взаимодействовала с использумым мною программами (ст. 1280 новой четвёртой главы ГК РФ).
ГК, глава 4:
Статья 1280. Свободное воспроизведение программ для ЭВМ и баз данных. Декомпилирование программ для ЭВМ

1. Лицо, правомерно владеющее экземпляром программы для ЭВМ или экземпляром базы данных (пользователь), вправе без разрешения автора или иного правообладателя и без выплаты дополнительного вознаграждения:

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

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


К слову сказать, в лицензионном соглашении АББИИ «заботливо» прописала вот что (это копи-паст из соглашения к 12-й версии Lingvo, но если мне память мне не изменяет, в 11-й было написано так же):
8.3. Вы обязуетесь не осуществлять самостоятельно и не разрешать третьим лицам осуществлять следующие действия.

8.3.1. Деассемблировать, декомпилировать (преобразовывать объектный код в исходный текст) ПО (включая программы, базы данных (в том числе словари) и другие компоненты ПО), за исключением случаев и только в объеме, явным образом разрешенном применимым законодательством. Если применимое законодательство разрешает подобные действия, любая информация, полученная таким способом, не должна раскрываться третьим лицам, если только такое раскрытие не предусмотрено применимым законодательством, и должна быть немедленно сообщена Компании ABBYY. Вся такая информация является конфиденциальной и принадлежит Компании ABBYY.


К счастью, законодательство РФ явно разрешает декомпиляцию объектного кода в исходный текст (пункт 3 вышеупомянутой статьи 1280 ГК), если это необходимо для обеспечения взаимодействия с декомпилируемой программой (формально, достаточным поводом для этого является написание на bash скрипта, который вызывает stardict, которому нужны словари).

Дело техники


Итак, когда мне потребовалось воспользоваться словарём, я почитал всякие советы и блоги в интернете (рекомендую заметку Перенос словарей Lingvo из ABBYY Lingvo в stardict (на jack.kiev.ua) и пост на форуме AlReader), и сделал так:

1. Скопировал бинарные словари в формате .lsd в отдельный каталог, туда же скопировал DslComp.exe и все DLL-ки из каталога с устанной Lingvo.
2. Поправил бинарный файл DslComp.exe (с помощью -b режима и xxd в vim), заменив по смещению 0004E8E1 байт 84 на байт 32. Эта замена включает в DslComp.exe недокументированную функцию декомпиляции словарей. Понятно, что то, какой байт и где заменять сильно зависит от версии Lingvo, и тот вариант, который описан у jack.kiev.ua у меня не подходит, а подошёл тот, который был указан на форуме alreader.com.
На форумах в интернете можно найти «патчи» для DslComp.exe из Lingvo версий с 9-й по 11-ю. Про 12-ю ничего не видел, но и специально не искал. Как я понял, пользователям версии 8.0 и более ранних этим извратом (декомпиляцией словарей) заниматься вообще не надо. Так что, если нужно Lingvo в Linux, то лучше покупать самую старую версию, какую только найдёте. Главное, не 12-ю.

3. После этого запустил wine DslComp.exe, и выбрал там конвертацию из .sdl в .dsl. Получилось. Полученный файл .dsl — это простой текстовый файл в кодировке UTF-16. Возможно, из него потребуется вырезать упоминания про файлы с произношением (мне не пришлось).
4. Затем я взял программку makedict с xdxf.sourceforge.net (Converter: many to many), собрал её. Конвертация словаря .dsl в формат stardict деляется с помощью неё так:
$ makedict -i dsl -o stardict Словарь.dsl

Словарь в формате stardict будет лежать отдельным подкаталогом. Его нужно переместить в /usr/share/stardict/dic/. Дополнение: или, как заметил SIR, в домашний каталог пользователя, ~/.stardict/dic/ (Спасибо!).

Вроде всё. Если всё работает, резервную копию словарей в Windows можно удалять.

Информация к размышлению


Эта заметка показывает весь «блеск» несвободного программного обеспечения. Условия его использования противоречат интересам пользователей, и удовольствие за такие деньги ниже среднего. Тонкости и нюансы несвободных лицензий тоже создают дополнительные неудобства, ограничения и риски. В случае Lingvo, технически, использовать словари в GNU/Linux вместе с stardict возможно, но это требует получасовой возни. На мой взгляд, такое использование законно, но при использовании в организации лучше, наверное, проконсультироваться с юристом, а не с моим блогом :) На практике могу лишь посоветовать не покупать последнюю версию Lingvo. А лучше купить уже бывшую в употреблении старую версию (чтобы не платить проприетарщикам). В идеале — восьмую или более ранюю (чтобы не заниматься декомпиляцией словарей). Благо, на том же молотке.ру такие предложения бывают.

Хочу также заметить, что конкурент АББИИ, компания MediaLingua, тем временем уже начала разработку многоязыковых словарей MultiLex для Linux. Это можно только приветствовать. Возможно, в скором времени покупать качественные словари можно будет у них, а про мелкомягких АББИИ с их Лингво забыть как про страшный сон. Дополнение: Увы, упоминание версии для Linux с сайта Мультилекса убрали, кишка тонка; убираю ссылку.

Дополнение: Читатели в комментариях дали вот эту ссылку, что нужно менять в dslcomp.exe в 12-й версии Lingvo (по-англ.)

vim как шестнадцатеричный (hex) редактор

Vim можно использовать и для редактирования двоичных файлов. Для этого служит опция -b. Однако прямое использование этой опции достаточно неудобно: вводить непечатаемые символы с клавиатуры — дело хитрое.

Поможет небольшое дополнение в ~/.vimrc. Пример того, что нужно добавить смотрите в :help hex.

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

hex dump in vim (using xxd as in :help hex)
При сохранении файла шестнадцатеричный дамп преобразуется обратно в двоичную форму.

20080204

Как задать поля страницы в LaTeX

Чтобы задать поля страницы в LaTeX, проще всего воспользоваться пакетом geometry. И прямо в параметрах пакета прописать нужные параметры:
% в преамбуле
\usepackage[left=2cm,right=2cm,
top=2cm,bottom=2cm,bindingoffset=0cm]{geometry}

Менять параметры отдельных страниц можно с помощью команд и окружений из пакета chngpage.

Дополнение: Здесь же укажу, как задать произвольный размер страницы:
% в преамбуле
\usepackage[papersize={13cm,8cm},и другие параметры]{geometry}