вторник, 18 марта 2014 г.

Rsync - синхронизация данных между устройствами

~/scripts/sync.html

Если вы пользуетесь более, чем одним компьютером, то, скорее всего, вам приходилось сталкиваться с тем, что данные, с которыми вы работаете, должны быть на всех компьютерах, при чём изменения, внесённые на одном компьютере, должны быть актуальны и на других. Для этих целей можно использовать флешку, и работать с ней напрямую, или пользоваться облачным сервисом для оптимизации, наподобие Dropbox или Яндекс-диск. При использовании флешки необходимо резервное копирование данных, так как флешка - устройство ненадёжное, да и можно просто её потерять. Использование облачных сервисов требует постоянного подключения к интернету, что может оказаться не всегда возможным. Предлагаю способ прямой (возможна косвенная) синхронизации между компьютерами с использованием rsync, которую использую я сам.

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

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

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

Файл sync

 1 #!/bin/bash
 2 host="vladimir-laptop"
 3 if [ "$PARAMS" = "" ]
 4 then
 5     PARAMS="-aHvuzn --progress --delete-after"
 6 fi
 7 if [[ $1 == "-h" ]]
 8 then
 9     echo "Синхронизация файлов между компом и ноутбуком"
10     echo "Все каталоги и файлы читаются из файла synclist.txt"
11     exit
12 fi
13 if [ -z $2 ]
14 then
15     path=$host::vladimir
16 else
17     path=$(echo "$2" | sed 's/\/*$//')
18 fi
19 if [[ $1 == "to" ]]
20 then
21     sourcepath=$HOME
22     destpath=$path
23 else
24     if [[ $1 == "from" ]]
25     then
26         sourcepath=$path
27         destpath=$HOME
28     else
29         echo "unknown option: $1"
30         exit 1
31     fi
32 fi
33 echo
34 echo "Start syncronization..."
35 echo "rsync $PARAMS --files-from=synclist.txt -r $sourcepath $destpath"
36 rsync $PARAMS --files-from=synclist.txt -r "$sourcepath" "$destpath" || exit 1

Скрипт используется с двумя параметрами командной строки. Первый параметр - "to" или "from", зависит от направления синхронизации, второй параметр - это адрес устройства, если он не задан, по умолчанию в моём случае используется vladimir-laptop::vladimir, следует заменить на свой случай, т.е. задать переменную host и дальнейший путь синхронизации.

В этом примере путь указан через два двоеточие, это означает, что будет использоваться протокол rsync. Если использовать одно двоеточие, то будет использоваться ssh, если просто указать путь к папке, то, соответственно, будет прямая синхронизация внутри одного устройства (например, при синхронизации посредством флешки).

Для текущего компьютера путь по умолчанию задаётся $HOME, т.е. домашняя директория пользователя, запускающего скрипт.

Также для управления скриптом используется переменная окружения PARAMS, которая, если не задать её в оболочке, принимает значение по умолчанию, заданное в скрипте. Опишу подробно параметры:

  • -a - сохранять атрибуты файла: время изменения/создания, владельца, группу и прочее;
  • -v - печатать в стандартный вывод о производимых операциях;
  • -z - использовать сжатие;
  • -H - создавать на приёмнике жёсткие ссылки, как на источнике;
  • -u - заменять файлы только если на источнике они новее, чем на приёмнике;
  • -n - не производить реальных действий, только имитировать;
  • --delete-after - удалять файлы, которых не существует на источнике, при чём только после того, как будут скопированы и обновлены существующие файлы.

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

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

Файл realsync

1 #!/bin/bash
2 export PARAMS="-avuHz --progress --delete"
3 ./sync $@

Он просто задаёт параметры синхронизации:

  • --progress - показывать прогресс копирования отдельных файлов (удобно, если файлы имеют большой размер и требуется время для их копирования);
  • --delete - удалить файлы, которых не существует на источнике (просто удаляет в процессе синхронизации, а не в конце её).

Таким образом процесс синхронизации выполняется вызовом сначала ./sync, потом ./realsync. Можно из первого скрипта удалить параметр -n, но тогда можно случайно удалить нужные данные.

Помимо этого скрипт использует файл synclist.txt, содержащий пути к синхронизируемым файлам и папкам относительно домашнего каталога. Должен находится в каталоге, из которого вызывается скрипт. Например, мой файл выглядит так:

scripts/
Документы/
Projects/
vladimir.kdb
.local/share/gtg/
.local/share/gnote/
vimwiki/

Настройка rsync

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

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

Для синхронизации через протокол rsync, т.е. как в приведённом примере, нужно настроить демон rsync, для этого нужно в файл /etc/rsyncd.conf вписать что-то вроде:

[name]
    path = /home/user
    comment = Rsync syncronization
    hosts allow = 10.42.0.0/16

Здесь name - произвольное имя, оно будет использоваться после двойного двоеточия, comment - вообще произвольный коментарий, hosts allow - адреса, с которых разрешён доступ, можно опустить, тогда доступ будет разрешён с любого адреса.

Далее следует перезапустить демон:

#service rsyncd restart

Подробнее можно прочитать в man rsyncd.conf и man rsync.

пятница, 14 марта 2014 г.

Ведение заметок в Linux

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

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

Gnote/Tomboy

Эти две программы я рассматриваю одновременно, т.к. их возможности почти полностью совпадают, отличие лишь в том, что Gnote написан на Си с использованием библиотеки Gtk+, а Tomboy написан на C# и работает под управлением Mono.

Обе утилиты просты в использовании, достаточно кликнуть "Добавить заметку", скопировать или набрать текст, сохранение происходит автоматически. Поддерживается форматирование текста, первая строка заметки - это заголовок. Можно ссылаться на другие заметки, используя заголовки, таким образом, можно создать целую систему. Поддерживается также добавление тегов, при помощи которых происходит разделение на блокноты. При сохранении заметки программа сама создаёт уникальное имя файла, и вам не приходится придумывать название для файла, а ссылки всегда остаются уникальными не смотря на изменение названия, при этом происходит автоматическое переименование всех ссылок на данную заметку. Обе программки интегрируются в среду Gnome, можно настроить глобальную горячую клавишу на быстрое добавление.

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

Плюсы:

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

Минусы:

  • Нельзя вставлять картинки, таблицы.

Программы свободные и присутствуют практически в любом современном дистрибутиве Linux.

Набор текстовых/markdown/html/odt и прочих файлов

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

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

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

Рассмотрим несколько форматов по отдельности кроме текстового, т.к. там всё и так понятно.

Markdown

Это расширенный способ хранения текстовых файлов. Формат файла при этом остаётся текстовым, но редакторы, поддерживающие этот формат, отображают текст отформатированным соответствующим образом, т.е. заголовки, списки, ссылки и даже, в некоторых случаях, таблицы и рисунки. Формат легко конвертируются во множество других при помощи утилиты pandoc. Данный формат комбинирует в себе достоинства текстовых файлов и более сложных, типа html или odt.

Достоинства:

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

Недостатки:

  • Картинки вставляются в виде ссылок, поэтому нужно позаботиться о доступности файла с изображением, сама картинка в текстовом файле, по понятным причинам, не отображается.
  • Мало редакторов, поддерживающих этот формат (имеется в виду отображение форматирования), например, vim или emacs.

Кстати, эту статью я набирал в vim с использованием markdown с последующей конвертацией в html.

HTML

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

Достоинства:

  • Поддерживаются очень широкие возможности по форматированию текста.
  • Можно быстро сохранять информацию из браузера.
  • Возможна конвертация из других форматов, текстовые процессоры вроде Libre Office Writer, поддерживают экспорт в html.
  • Поддержка ссылок, в том числе на текст внутри документа.
  • Возможность вставки изображений.
  • Возможность вставлять произвольный контент, даже видео (хотя здесь уже возникают некоторые трудности).

Недостатки:

  • При простом сохранении из браузера сохраняется много лишней информации.
  • Полнотекстовый поиск возможен только при помощи стороннего программного обеспечения (хотя вроде есть способ самими средствами html, т.к., например, справка по языку Perl распространяется именно в виде html, и там присутствует полнотекстовый поиск).
  • Сложности с редактированием, хотя, если привыкнуть и подобрать подходящее ПО для этого, то всё довольно тривиально.

ODT и прочее

Достоинства:

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

Недостатки:

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

VimWiki

Если вы любитель vim или хардкорный пользователь линукс, то этот вариант может вам подойти. Это уже не просто какой-то формат файла, это целая система, очень гибкая, настраиваемая, вы сами вольны в выборе структуры данных. Используя vimwiki, вы будете думать только о структурировании информации, а не файлов, в которых она хранится. Формат самих файлов подобен markdown, но значительно отличается по синтаксису, при этом переход по внутренним ссылкам возможен внутри текстового редактора. Также имеется множество встроенных функций по форматированию, например, легко создаются текстовые таблицы, списки, имеется поддержка TO-DO списков и многое другое. В общем, система предназначена именно для хранения и упорядочивания информации любого рода.

VimWiki - это плагин для vim, который легко устанавливается, и его можно взять здесь, также там можно посмотреть подробную информацию о плагине.

Преимущества:

  • Простой текстовый формат.
  • Широкие возможности по структурированию информации.
  • Встроенная команда для полнотекстового поиска по шаблону.
  • Поддержка ссылок и форматирования текста.
  • Поддержка таблиц и средства для их редактирования.
  • Поддержка TO-DO списков.
  • Поддержка рисунков.
  • Встроенные возможности конвертации в набор html-страниц.

Недостатки:

  • Сложность вставки информации, т.к. форматирование в любом случае теряется.
  • Требуется подготовка для того, чтоб использование было простым и комфортным.
  • Рисунки, разумеется, в vim не отображаются, а только после конвертации в html, при этом нужно следить за доступностью самого изображения (лучше сохранить в каталог с html-файлами).

Лично я остановился на использовании этого способа хранения информации и даже написал конвертер из Gnote/Tomboy.

Evernote

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

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

PS

Я попытался рассмотреть здесь лишь те способы, которые сам использовал, и на себе ощутил достоинства и недостатки каждого из них. Можно также рассмотреть вариант с каким-нибудь wiki-движком под Apache, который может использоваться локально через браузер, но это уже слишком сложная система для простого хранения заметок.

В достоинства я включал такой пункт, как "Простой текстовый формат", возможно, кто-то спросит: "В чём же состоит достоинство?" Это моё личное мнение, может кто-то разделит его со мной, кто-то нет. Дело в том, что с текстовыми файлами вы можете делать всё, что вздумается, например, можно использовать вместе с системой хранения заметок систему управления версиями, с помощью которой вы сможете отслеживать сделанные изменения, что затруднено при использовании сложных форматов. Также содержание текстового файла можно менять любым редактором, и не требуется специализированное программное обеспечение.

среда, 12 марта 2014 г.

Конвертация заметок из Gnote/Tomboy в vimwiki

С первых дней знакомства с Linux и Gnome я использовал для ведения заметок Tomboy, тогда это было на Ubuntu. В дальнейшем я перешёл на аналог - Gnote. Наделал кучу заметок, копировал полезные данные из интернета, чтоб не забыть. Накопилось более сотни заметок, и тут я нашёл более удобный для меня инструмент - vimwiki, это плагин для vim для хранения различной информации с перекрёстными ссылками, что-то вроде персональной базы знаний. Vimwiki поддерживает больше возможностей по ведению заметок, например, можно добавлять изображения или работать со списками, форматирование текста похоже на markdown.
Встал вопрос - как перенести все накопленные заметки из Gnote в формат vimwiki?
Недолго думая написал скрипт на Perl, который преобразует файлы *.note из каталога ~/.local/share/gnote/, раскладывает их по папкам в соответствии с названием блокнотов и создаёт файлы-содержания со ссылками на заметки.
Скрипт можно взять здесь:  https://github.com/dvhex/gnote_to_vimwiki

вторник, 11 марта 2014 г.

Запуск Minecraft 1.7.2 с модами в линукс

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

Запуск без модов

В ранних версиях (до 1.6.2, если я не ошибаюсь), можно было просто запустить jar-файл, который находился в папке bin внутри каталога .minecraft, указав папку с библиотеками под конкретную архитектуру (native). В более новых версиях лаунчер загружает библиотеки, находящиеся в папке libraries. Для их загрузки в скрипте нужно указать папки с классами при помощи ключа -cp, в java папкой считается также zip-архив, которым и является jar-файл. Поэтому нужно перечислить в параметре ключа -cp все загружаемые jar-файлы, можно сделать это при помощи вызова find. Также нужно задать класс, который будет являться точкой входа при запуске (параметр командной строки без ключа). Полностью скрипт запуска у меня выглядит так:

#!/bin/sh
echo -n 'nick [player]: ' && read username
if [ -z $username ]
then
    username="player"
fi
ver=1.7.2
CLASSPATH=`find libraries -name \*.jar |tr '\n' ':'`
CLASSPATH="${CLASSPATH}versions/$ver/$ver.jar"
java -Xmx1G \
  -cp $CLASSPATH \
  -Djava.library.path=versions/$ver/$ver-natives \
  net.minecraft.client.main.Main \
  --username $username \
  --version $ver \
  --accessToken 0

Сначала он просит ввести ник, если ничего не введено, то по умолчанию используется ник "player". Далее указывается версия для поиска, после производится поиск всех подгружаемых jar-файлов при помощи find и замены переносов строк на двоеточия, также к списку прибавляется сам jar-файл игры. Последней командой запускается java-машина со сделующими агрументами:

  • -Xmx1G - выделять не более 1 гигабайта оперативный памяти процессу;
  • -cp - как уже говорилось, список jar-файлов, разделённых через двоеточие;
  • -Djava.library.path - папка с нативными библиотеками (для конкретной аппаратной реализации);
  • net.minecraft.client.main.Main - класс для запуска игры (точка входа);
  • --username, --version - думаю, и так понятно;
  • --accessToken - для запуска также необходим и этот параметр.

Запуск с модами, не требующими Forge

Для запуска модов, не требующих Forge, достаточно закинуть файл мода в папку libraries и поменять расширение на jar, тогда не требуется заменять классы в архиве с игрой, но придётся удалить папку META-INF. Кстати, также можно было и делать в старых версиях, просто нужно в списке папок с классами первыми указывать моды.

Запуск с модами, требующими Forge

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

По сути в нашем скрипте практически ничего менять не нужно, нужно изменить только точку входа: net.minecraft.launchwrapper.Launch, а также добавить ещё один параметр командной строки. В итоге получаем следующий скрипт:

#!/bin/sh
echo -n 'nick [player]: ' && read username
if [ -z $username ]
then
    username="player"
fi
ver=1.7.2-Forge10.12.0.1024
CLASSPATH=`find libraries -name \*.jar |tr '\n' ':'`
CLASSPATH="${CLASSPATH}versions/$ver/$ver.jar"
java -Xmx1G \
  -cp $CLASSPATH \
  -Djava.library.path=versions/$ver/$ver-natives \
  net.minecraft.launchwrapper.Launch \
  --username $username \
  --version $ver \
  --accessToken 0 \
  --tweakClass cpw.mods.fml.common.launcher.FMLTweaker

Где 1.7.2-Forge10.12.0.1024 - папка, которая была создана в папке versions после установки Forge (зависит от версии).

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

Важно!

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