Сообщение Синхронизация личной базы знаний по программированию в Zim от 03.10.2023 22:09
Изменено 03.10.2023 22:45 velkin
Синхронизация личной базы знаний по программированию в Zim
Введение
Предыдущая тема.
Систематизация личной базы знаний по программированию в 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.pub1. Нужно переименовать на сервере 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 года выпуска. И не смотря на низкую производительность "железа" пока что всё работает.
Синхронизация личной базы знаний по программированию в Zim
Введение
Предыдущая тема.
Систематизация личной базы знаний по программированию в 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.pub1. Нужно переименовать на сервере 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 года выпуска. И не смотря на низкую производительность "железа" пока что всё работает.