Здравствуйте, velkin, Вы писали:
V>
V>Предыдущая тема.
V>Систематизация личной базы знаний по программированию в Zim
V>Но эта личная база знаний находится на десктопе. Встал вопрос, как синхронизироваться хотя бы с ноутбуком, чтобы можно было работать где угодно.
V>Сразу отбрасываю чужие сервисы, то есть те, которые мне не принадлежат.
V>1. Dropbox.
V>2. GitHub.
V>Я им не доверял до санкций против России, а теперь уж точно не стоит ими пользоваться. Значит надо запустить свой сервис.
V>
V>Мне известны разные программы, но я бы выделил три из них.
V>1. Rsync. Односторонняя синхронизация без версионирования.
V>2. Syncthing. Многосторонняя синхронизация без версионирования.
V>3. Git. Многосторонняя синхронизация с версионированием.
V>
V>Мне нравится Rsync, он срабатывает правильно, главное не ошибиться в параметрах запуска. Можно пользоваться графическим интерфейсом Grsync. Но односторонняя синхронизация не всегда является хорошей идеей.
V>
V>Можно использовать Syncthing, но результат не поддаётся чёткому контролю, а версионирования нет. Постоянно работают какие-то процессы, грузят систему. Хотя есть многосторонняя синхронизация, но лично для меня это программа непредсказуема. Я не могу гарантировать правильную работу, может вылезти какая-то нестыковка в синхронизации.
V>
V>И наконец Git. С одной стороны версионирование это хорошо, ничего не потеряется. А с другой оно по умолчанию хранит версии возможно уже ненужных файлов. Опять же с большими файлами и архивами оно работает не так чтобы быстро.
V>Но если подумать, то именно Git является инструментом программиста наиболее подходящим для хранения личной базы в Zim. Потому что Zim в качестве страниц использует текстовые файлы *.txt. У Zim нет привычки создавать пустые папки в которых нет файлов, которые Git естественно не будет добавлять.
V>Но самая большая проблема Git это множество ненужных команд. Чтобы синхронизироваться, надо использовать команды pull, add, commit, push. В commit ещё и выдумывать название. А я бы хотел синхронизацию, которая от меня ничего не требует.
V>И я подумал, может быть использовать в названии коммита первичный ключ. Походил по интернету, и там первый совет использовать временной штамп. Потом я ещё обнаружил, что кто-то даёт коммиту одно и тоже имя, например, "sync".
V>Ещё я нашёл программу git-auto-sync по запросу "автосинхронизация с git". Я её даже установил, но дальше мне лень стало разбираться, и я воспользовался советом создать батник, то есть файл формата DOS Batch.
V>
V>В результате поиска по интернету и склеивания чужого кода со своими задумками у меня получилось два файла.
V>
V>Этот скрипт запускает два раза другой скрипт zim_sync.bat для синхронизации с git на сервере. А между ними запускает zim.exe, в котором можно работать.
V>V>@echo off
V>cls
V>:: ZIM SYNC
V>echo -------------------------------- ZIM SYNC START --------------------------------
V>echo starting...
V>call "D:\git\zim_sync.bat"
V>:: ZIM RUN
V>echo ----------------------------------- ZIM RUN ------------------------------------
V>set zimexe=C:\Program Files\Zim Desktop Wiki\zim.exe
V>echo zimexe: "%zimexe%"
V>call "%zimexe%" --gui --standalone
V>:: ZIM SYNC
V>echo ------------------------------- ZIM SYNC FINISH --------------------------------
V>echo finishing...
V>call "D:\git\zim_sync.bat
V>
V>Минус только в том, что zim.exe сам по себе не закрывается как все остальные программы, когда выбираешь Файл > Выход или нажимаешь справа вверху на крестик окна. Потому приходится дополнительно открывать "Диспетчер задач", на вкладке "Подробности" нахожу zim.exe и из контекстного меню запускаю "Снять задачу". Тогда скрипт продолжает работать дальше.
V>Почему так происходит я не знаю. Я уже даже добавлял команду --standalone, а к ней ещё и --gui, которая идёт по умолчанию, но нет всё равно не работает. А так я вижу, что в папке.
V>V>%USERPROFILE%\AppData\Roaming\zim\cache\zim\notebook-D_git_zim
V>
V>Что-то может происходить с файлом index.db. В общем я эту проблему пока не решил и нажимаю "Снять задачу" zim.exe после выхода из Zim. Результатом окончания синхронизации служит автоматическое закрытие окошка командной оболочки, я это вижу по значку на панели задач, даже если оно свёрнуто.
V>
V>А это сам скрипт ручной синхронизации. Потому я могу на всякий случай синхронизироваться в любое время не открывая Zim.
V>Скрипт создаёт временной штамп вида "%YYYY%-%MM%-%DD% %HH%:%Min%:%Sec%" и если были изменения, то происходит получение данных из репозитория, коммит всех изменений с именем временного штампа и отправка изменений на сервер. Предполагается, что мне не понадобится ручное слияние, если я не буду менять данные на разных компьютерах одновременно. А предыдущий скрипт гарантирует, что изменения будут сохранены на сервере до перехода к другому компьютеру.
V>V>@echo off
V>:: get timestamp
V>echo -------------------------------- GET TIMESTAMP ---------------------------------
V>for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
V>set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
V>set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
V>set "timestamp=%YYYY%-%MM%-%DD% %HH%:%Min%:%Sec%"
V>echo timestamp: "%timestamp%"
V>:: set directory
V>echo ------------------------------- CHANGE DIRECTORY -------------------------------
V>set gitdir=d:/git/zim
V>echo gitdir: "%gitdir%"
V>cd /D "%gitdir%"
V>:: git pull
V>echo ----------------------------------- GIT PULL -----------------------------------
V>call git pull origin master
V>:: git commit
V>echo ---------------------------------- GIT COMMIT ----------------------------------
V>call git add --all
V>call git commit -m "%timestamp%"
V>:: git push
V>echo ----------------------------------- GIT PUSH -----------------------------------
V>call git push origin master
V>
V>
V>И для них я сделал два ярлыка Windows на рабочем столе.
V>Синхронизация личной базы знаний.lnk
V>V>D:\git\zim_sync.bat
V>
V>Личная база знаний.lnk
V>V>D:\git\zim_start.bat
V>
V>Image: zim_sync_01.png
V>
V>На сервере для репозитория я использую папку "/git/zim/", где "/" корневой каталог. В папке "git/" лежат все папки с инициализированными репозиториями git. И "zim/" это сама папка с личной базой знаний, в терминологии Zim это блокнот.
V>Для доступа к серверу в Windows можно использовать PuTTY, для примера скачать отсюда.
V>Для сервера на Debian, git и ssh устанавливаются из репозитория из под рута.
V>V>su
V>apt install git ssh
V>
V>Но это по памяти, я сейчас не поручусь, что так и было.
V>А ключи генерируются из под пользователя, то есть не из под рута.
V>V>ssh-keygen -t RSA
V>
V>Рекомендуемый алгоритм другой, но мне сойдёт и так.
V>В папке ~/.ssh пользователя получатся файлы.
V>V>id_rsa
V>id_rsa.pub
V>
V>1. Нужно переименовать на сервере id_rsa.pub в authorized_keys. Обычно ключи добавляют в authorized_keys, но у меня даже этого файла не было.
V>2. Переместить файл id_rsa на клиентские машины. В Windows это папка "%USERPROFILE%\.ssh".
V>И тогда git команды push и pull не будут требовать пароля и скрипты будут проходить сами по себе до конца.
V>
V>1. Открываем Git Bash, который появится после установки Git в Windows.
V>2. И набираем не забыв сменить user на имя учётной записи пользователя сервера и xx.xx.xx.xx на ip-адрес сервера.
V>V>cd d:/git/zim
V>git init
V>git remote add origin ssh://user@xx.xx.xx.xx:22/git/zim/
V>
V>Путь удалённого репозитория можно посмотреть так.
V>V>git remote -v
V>
V>Выведет, что-то типа такого, где user это имя учётной записи на сервере, а xx.xx.xx.xx это ip-адрес сервера.
V>V>origin ssh://user@xx.xx.xx.xx:22/git/zim/ (fetch)
V>origin ssh://user@xx.xx.xx.xx:22/git/zim/ (push)
V>
V>У меня на маршрутизаторе порт 22 из интернета проброшен на порт сервера 22 в локальной сети. Естественно для подключения к интернету используется статический ip.
V>
V>1. Заходим на сервер через Putty от пользователя, не от рута.
V>1. Набираем.
V>V>cd /git
V>mkdir zim
V>cd ./zim
V>git init --bare
V>
V>И всё, потом можно на клиенте в Git Bash набрать.
V>V>git add --all
V>git commit -m "начало"
V>git push origin master
V>
V>Или просто запустить скрипты опубликованные выше, тем более всё затевалось ради них.
V>
V>А вот и список коммитов, который у меня со временем получился.
V>V>git log --pretty=oneline
V>5a838971721e91ae941f332f061890bc30e28b87 (HEAD -> master) 2023-10-03 20:04:44
V>68c4ab05243e5a0d7cbd0ccf62f49a3069a85066 2023-10-03 16:15:24
V>8f19cbef73e901de1e2aea80e1d7258674c0adbc 2023-10-03 14:49:04
V>d4474382e35f580dbdabcfc18ec77b683455a33b 2023-10-03 04:25:42
V>890e39fb7132b3d716714140effc665dee0414fe 2023-10-03 03:54:26
V>fb30e2cc0878527b824e30f148971fd1bd7a7556 2023-10-03 00:50:24
V>56c03f8cd58ff25dcaee55459ed2d73dffffd5e8 начало
V>
V>
V>Вы можете оценить идею и реализацию описанные в статье. А так же рассказать, что используете сами. Я испробовал этот самодельный способ. Походил пару часов со старым нетбуком 2011 года выпуска. И не смотря на низкую производительность "железа" пока что всё работает.
Не бойтесь совершенства. Вам его не достичь. © Сальвадор Дали