Предыдущая тема.
Систематизация личной базы знаний по программированию в Zim
Но эта личная база знаний находится на десктопе. Встал вопрос, как синхронизироваться хотя бы с ноутбуком, чтобы можно было работать где угодно.
Сразу отбрасываю чужие сервисы, то есть те, которые мне не принадлежат.
1.
Dropbox.
2.
GitHub.
Я им не доверял до санкций против России, а теперь уж точно не стоит ими пользоваться. Значит надо запустить свой сервис.
Мне известны разные программы, но я бы выделил три из них.
1.
Rsync. Односторонняя синхронизация без версионирования.
2.
Syncthing. Многосторонняя синхронизация без версионирования.
3.
Git. Многосторонняя синхронизация с версионированием.
Мне нравится
Rsync, он срабатывает правильно, главное не ошибиться в параметрах запуска. Можно пользоваться графическим интерфейсом
Grsync. Но односторонняя синхронизация не всегда является хорошей идеей.
Можно использовать
Syncthing, но результат не поддаётся чёткому контролю, а версионирования нет. Постоянно работают какие-то процессы, грузят систему. Хотя есть многосторонняя синхронизация, но лично для меня это программа непредсказуема. Я не могу гарантировать правильную работу, может вылезти какая-то нестыковка в синхронизации.
И наконец
Git. С одной стороны версионирование это хорошо, ничего не потеряется. А с другой оно по умолчанию хранит версии возможно уже ненужных файлов. Опять же с большими файлами и архивами оно работает не так чтобы быстро.
Но если подумать, то именно Git является инструментом программиста наиболее подходящим для хранения личной базы в Zim. Потому что Zim в качестве страниц использует текстовые файлы *.txt. У Zim нет привычки создавать пустые папки в которых нет файлов, которые Git естественно не будет добавлять.
Но самая большая проблема Git это множество ненужных команд. Чтобы синхронизироваться, надо использовать команды pull, add, commit, push. В commit ещё и выдумывать название. А я бы хотел синхронизацию, которая от меня ничего не требует.
И я подумал, может быть использовать в названии коммита
первичный ключ. Походил по интернету, и там первый совет использовать временной штамп. Потом я ещё обнаружил, что кто-то даёт коммиту одно и тоже имя, например, "sync".
Ещё я нашёл программу
git-auto-sync по запросу "автосинхронизация с git". Я её даже установил, но дальше мне лень стало разбираться, и я воспользовался советом создать батник, то есть файл формата
DOS Batch.
В результате поиска по интернету и склеивания чужого кода со своими задумками у меня получилось два файла.
Этот скрипт запускает два раза другой скрипт 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. Результатом окончания синхронизации служит автоматическое закрытие окошка командной оболочки, я это вижу по значку на панели задач, даже если оно свёрнуто.
А это сам скрипт ручной синхронизации. Потому я могу на всякий случай синхронизироваться в любое время не открывая 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/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 года выпуска. И не смотря на низкую производительность "железа" пока что всё работает.