Синхронизация личной базы знаний по программированию в Zim
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 03.10.23 22:09
Оценка: 8 (1)

Введение


Предыдущая тема.
Систематизация личной базы знаний по программированию в Zim

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

Сразу отбрасываю чужие сервисы, то есть те, которые мне не принадлежат.
1. Dropbox.
2. GitHub.

Я им не доверял до санкций против России, а теперь уж точно не стоит ими пользоваться. Значит надо запустить свой сервис.

Выбор программы для синхронизации


Мне известны разные программы, но я бы выделил три из них.
1. Rsync. Односторонняя синхронизация без версионирования.
2. Syncthing. Многосторонняя синхронизация без версионирования.
3. Git. Многосторонняя синхронизация с версионированием.

Rsync


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

Syncthing


Можно использовать Syncthing, но результат не поддаётся чёткому контролю, а версионирования нет. Постоянно работают какие-то процессы, грузят систему. Хотя есть многосторонняя синхронизация, но лично для меня это программа непредсказуема. Я не могу гарантировать правильную работу, может вылезти какая-то нестыковка в синхронизации.

Git


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

Но если подумать, то именно Git является инструментом программиста наиболее подходящим для хранения личной базы в Zim. Потому что Zim в качестве страниц использует текстовые файлы *.txt. У Zim нет привычки создавать пустые папки в которых нет файлов, которые Git естественно не будет добавлять.

Но самая большая проблема Git это множество ненужных команд. Чтобы синхронизироваться, надо использовать команды pull, add, commit, push. В commit ещё и выдумывать название. А я бы хотел синхронизацию, которая от меня ничего не требует.

И я подумал, может быть использовать в названии коммита первичный ключ. Походил по интернету, и там первый совет использовать временной штамп. Потом я ещё обнаружил, что кто-то даёт коммиту одно и тоже имя, например, "sync".

Ещё я нашёл программу git-auto-sync по запросу "автосинхронизация с git". Я её даже установил, но дальше мне лень стало разбираться, и я воспользовался советом создать батник, то есть файл формата DOS Batch.

Скрипты для синхронизации


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

D:\git\zim_start.bat


Этот скрипт запускает два раза другой скрипт zim_sync.bat для синхронизации с git на сервере. А между ними запускает zim.exe, в котором можно работать.
@echo off
cls
:: ZIM SYNC
echo -------------------------------- ZIM SYNC START --------------------------------
echo starting...
call "D:\git\zim_sync.bat"
:: ZIM RUN
echo ----------------------------------- ZIM RUN ------------------------------------
set zimexe=C:\Program Files\Zim Desktop Wiki\zim.exe
echo zimexe: "%zimexe%"
call "%zimexe%" --gui --standalone
:: ZIM SYNC
echo ------------------------------- ZIM SYNC FINISH --------------------------------
echo finishing...
call "D:\git\zim_sync.bat

Минус только в том, что zim.exe сам по себе не закрывается как все остальные программы, когда выбираешь Файл > Выход или нажимаешь справа вверху на крестик окна. Потому приходится дополнительно открывать "Диспетчер задач", на вкладке "Подробности" нахожу zim.exe и из контекстного меню запускаю "Снять задачу". Тогда скрипт продолжает работать дальше.

Почему так происходит я не знаю. Я уже даже добавлял команду --standalone, а к ней ещё и --gui, которая идёт по умолчанию, но нет всё равно не работает. А так я вижу, что в папке.
%USERPROFILE%\AppData\Roaming\zim\cache\zim\notebook-D_git_zim

Что-то может происходить с файлом index.db. В общем я эту проблему пока не решил и нажимаю "Снять задачу" zim.exe после выхода из Zim. Результатом окончания синхронизации служит автоматическое закрытие окошка командной оболочки, я это вижу по значку на панели задач, даже если оно свёрнуто.

D:\git\zim_sync.bat


А это сам скрипт ручной синхронизации. Потому я могу на всякий случай синхронизироваться в любое время не открывая Zim.

Скрипт создаёт временной штамп вида "%YYYY%-%MM%-%DD% %HH%:%Min%:%Sec%" и если были изменения, то происходит получение данных из репозитория, коммит всех изменений с именем временного штампа и отправка изменений на сервер. Предполагается, что мне не понадобится ручное слияние, если я не буду менять данные на разных компьютерах одновременно. А предыдущий скрипт гарантирует, что изменения будут сохранены на сервере до перехода к другому компьютеру.
@echo off
:: get timestamp
echo -------------------------------- GET TIMESTAMP ---------------------------------
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "timestamp=%YYYY%-%MM%-%DD% %HH%:%Min%:%Sec%"
echo timestamp: "%timestamp%"
:: set directory
echo ------------------------------- CHANGE DIRECTORY -------------------------------
set gitdir=d:/git/zim
echo gitdir: "%gitdir%"
cd /D "%gitdir%"
:: git pull
echo ----------------------------------- GIT PULL -----------------------------------
call git pull origin master
:: git commit
echo ---------------------------------- GIT COMMIT ----------------------------------
call git add --all
call git commit -m "%timestamp%"
:: git push
echo ----------------------------------- GIT PUSH -----------------------------------
call git push origin master

Ярлыки для синхронизации


И для них я сделал два ярлыка Windows на рабочем столе.

Синхронизация личной базы знаний.lnk
D:\git\zim_sync.bat

Личная база знаний.lnk
D:\git\zim_start.bat



Настройка Git


На сервере для репозитория я использую папку "/git/zim/", где "/" корневой каталог. В папке "git/" лежат все папки с инициализированными репозиториями git. И "zim/" это сама папка с личной базой знаний, в терминологии Zim это блокнот.

Установка программ на сервере


Для доступа к серверу в Windows можно использовать PuTTY, для примера скачать отсюда.

Для сервера на Debian, git и ssh устанавливаются из репозитория из под рута.
su
apt install git ssh

Но это по памяти, я сейчас не поручусь, что так и было.

Создание ключей на сервере


А ключи генерируются из под пользователя, то есть не из под рута.
ssh-keygen -t RSA

Рекомендуемый алгоритм другой, но мне сойдёт и так.

В папке ~/.ssh пользователя получатся файлы.
id_rsa
id_rsa.pub

1. Нужно переименовать на сервере id_rsa.pub в authorized_keys. Обычно ключи добавляют в authorized_keys, но у меня даже этого файла не было.
2. Переместить файл id_rsa на клиентские машины. В Windows это папка "%USERPROFILE%\.ssh".

И тогда git команды push и pull не будут требовать пароля и скрипты будут проходить сами по себе до конца.

Создание репозитория на клиенте


1. Открываем Git Bash, который появится после установки Git в Windows.
2. И набираем не забыв сменить user на имя учётной записи пользователя сервера и xx.xx.xx.xx на ip-адрес сервера.
cd d:/git/zim
git init
git remote add origin ssh://user@xx.xx.xx.xx:22/git/zim/

Путь удалённого репозитория можно посмотреть так.
git remote -v

Выведет, что-то типа такого, где user это имя учётной записи на сервере, а xx.xx.xx.xx это ip-адрес сервера.
origin  ssh://user@xx.xx.xx.xx:22/git/zim/ (fetch)
origin  ssh://user@xx.xx.xx.xx:22/git/zim/ (push)

У меня на маршрутизаторе порт 22 из интернета проброшен на порт сервера 22 в локальной сети. Естественно для подключения к интернету используется статический ip.

Создание репозитория на сервере


1. Заходим на сервер через Putty от пользователя, не от рута.
1. Набираем.
cd /git
mkdir zim
cd ./zim
git init --bare

И всё, потом можно на клиенте в Git Bash набрать.
git add --all
git commit -m "начало"
git push origin master

Или просто запустить скрипты опубликованные выше, тем более всё затевалось ради них.

Список коммитов


А вот и список коммитов, который у меня со временем получился.
git log --pretty=oneline
5a838971721e91ae941f332f061890bc30e28b87 (HEAD -> master) 2023-10-03 20:04:44
68c4ab05243e5a0d7cbd0ccf62f49a3069a85066 2023-10-03 16:15:24
8f19cbef73e901de1e2aea80e1d7258674c0adbc 2023-10-03 14:49:04
d4474382e35f580dbdabcfc18ec77b683455a33b 2023-10-03 04:25:42
890e39fb7132b3d716714140effc665dee0414fe 2023-10-03 03:54:26
fb30e2cc0878527b824e30f148971fd1bd7a7556 2023-10-03 00:50:24
56c03f8cd58ff25dcaee55459ed2d73dffffd5e8 начало

Итоги


Вы можете оценить идею и реализацию описанные в статье. А так же рассказать, что используете сами. Я испробовал этот самодельный способ. Походил пару часов со старым нетбуком 2011 года выпуска. И не смотря на низкую производительность "железа" пока что всё работает.
Отредактировано 04.10.2023 10:30 velkin . Предыдущая версия . Еще …
Отредактировано 03.10.2023 22:45 velkin . Предыдущая версия .
Отредактировано 03.10.2023 22:27 velkin . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.