Комментарии 40
Касательно bencode: наверное в него очень просто записывать, но расковырять назначение полей в таком файле без подробной документации будет сложно. Пока что был вариант сделать экспорт в zip-архив: медиа-файлы лежат как есть, данные экспортируются в виде JSON/XML.
Я, как пользователь MyHeritage, предпочитаю работать с самодостаточной копией программы (имею в виду не online). С 8-ой версии, они перешли от ZIP'ованного текстового формата к SQLite базе.
У вас PG был выбран по причине бОльшей функциональности? Почему не SQLite? Или эти зависимости нужны только для серверной стороны? Этот момент немного непонятен. Обычный пользователь, врядли, поставит себе указанные зависимости.
Согласен, что установка требует больше усилий, чем хотелось бы (хотя у меня скачать два инсталлятора и прощелкать next-next-next занимает не более 5 минут). Насколько я понимаю, с данной проблемой помог бы docker, но мне пока не доводилось с ним работать. Если кто-то из читателей сможет помочь — буду признателен.
Плюс использования OAuth в том, что весь геморрой с авторизацией (двухфакторка, смена пароля, восстановление и т.д.) ложатся на Facebook. Если отказаться от этой зависимости — придется все это реализовывать самостоятельно и требовать настроенный email-сервер для отправки писем. По сравнению с этим настроить приложение все-таки гораздо проще.
Но, для меня, иметь локальную базу у себя, а не где-то на сервере, гораздо важнее. Потому что, если сервис прекратит работу, то все данные будут утеряны. Так, я терял доступ к Bitbucket, по причине блокировок IP Amazon серверов (сейчас уже всё нормально, но осадок остался), прекращение работы QIP — у меня там была почта. Я минимизировал последствия этого тем, что имел копии данных локально (и, конечно, не в одном экземпляре). Ну, и проблемы у самого хостера никто не отменял.
Да, у online решений с одной стороны есть несомненные плюсы, но есть и минусы в плане того, что данных у пользователя, фактически, нет — только доступ к ним.
Например, вы создаете собственную виртуалку в облаке и ставите на нее весь необходимый софт, включая базу и веб-сервер. Вы не зависите ни от каких провайдеров услуг, кроме собственно Amazon/Digital Ocean/Azure, а шанс их внезапного выхода из бизнеса без сохранения ваших данных я считаю принебрежимо малым. Даже если ваш IP попадет в черный список, вы можете хотя бы зайти на сервер с помощью прокси и сохранить все ваши данные.
Если это вам кажется недостаточно безопасным режимом — Bonsai можно развернуть на собственном «железном» сервере, который стоит у вас в квартире. Тогда вы вообще не будете зависеть ни от чего, кроме электричества и интернета.
В обоих случаях делать бэкапы крайне важно, но эта задача остается лично на вас. Я для себя сделал просто периодическую задачу, которая каждый день делает dump базы и кладет его на два запасных диска.
Мне не составляет проблем поставить весь этот софт, но для простых пользователей, которые умеют, разве что, работать с браузером, этот вариант может не понравиться. Как минимум, PostgreSQL может не стартовать «из коробки». Сколько не пробовал, всегда приходилось лезть в конфиги и вносить правки (вероятно, мне просто везло на такое и у других всё сразу работало). Пробовал с разными Linux дистрибутивами. Под Windows не пробовал, возможно, там всё работает.
Это, что касалось концепции продукта. Что касается самого продукта, то он представляет интерес. Мне, как раз, интересна возможность online доступа тоже. Он сейчас работает только под Windows? Можно ли скомпилить для работы в Linux средах? В последних VS, вроде, было что-то такое, хотя, могу ошибаться.
- Администратор: полный доступ.
- Читатель: может просматривать все страницы, но не редактировать их. Есть мысль о том, чтобы все-таки разрешить читателю редактировать страницу про самого себя.
- Гость: по умолчанию не видит ничего. Может подать заявку на регистрацию, которую должен проверить админ. Тогда гость сам становится читателем или админом.
Насчет установки: как вы понимаете, сервер нужно настроить только один раз для семьи. Все остальные читатели и редакторы могут заходить через браузер как на любой другой сайт, и им не придется думать о базе данных, эластике и прочей ерунде. Я постараюсь облегчить первоначальную настройку с помощью докер-образа, но превратить этот процесс в однокнопочный все равно не получится: как минимум владелец должен будет настроить процесс бэкапа так, как ему удобно.
Насчет операционных систем: все компоненты Bonsai (рантайм, фреймворк, зависимости) являются кроссплатформенными. Я использую Windows и пока не проверял, но запустить его на Linux должно быть вполне возможно — в лучшем случае просто сразу заработает, в худшем придется поправить пару строк.
Виртуалки локально — это совсем несложно. И очень полезно для веб-проекта (и для любого, требующего сложного процесса установки и настройки). Я сам долго откладывал в своём проекте, потом жалел о том, что столько откладывал. Один раз разберитесь с установкой OS (может быть даже разных). Попробуйте конвертирование разных форматов виртуалок (VMware, Virtual Box) — люди любят разные фломастеры.
Docker образ будет?
Встраивать ничего не придется. Разверните соответсвующие контейнеры (elastic, pgsql) рядом с контейнером своего приложения. https://docs.docker.com/compose/ вам в помощь.
Из тех, что я смотрел, самыми приятными в использовании показались Gramps (бесплатный)
Мне не понравился. По юзабилити и дизайну далек от коммерческих приложений (по крайней мере от MyHeritage). Может как-нибудь сделают что-нибудь получше на Авалонии :)
Я просмотрел множество вариантов. Самый эстетически приятный был на сайте MyHeritage
Мне тоже больше всего понравилась визуализация там.
Данные хранятся в базе в виде направленного графа и, в теории, его должно быть несложно визуализировать. На практике же именно с отображением дерева возникло больше всего сложностей.
А еще есть экзотический вариант визуализации с помощью интерфейса к Git. Писал о таком осенью Генеалогическое древо внутри Git.
Задумайтесь на минуту: веб в нынешнем его виде существует едва ли двадцать лет, а семейная история подразумевает хранение веками.
Если пофантазировать, то деревья будут все больше и больше объединяться, т.к. количество заинтересованных и качество сервисов будут расти. Возможно, крупнейшие социальные сервисы (vk, facebook) внедрят функциональность по генеалогическим деревьям и лучше продумают вопросы смертности (сейчас большой потребности нет).
Первоочередные задачи — ускорить отображение дерева, разрешить загрузку документов в виде PDF и добавить тонкую настройку прав доступа.
Думаю логичным решением является доступ по email. Хотя может действтительно нужно что-то еще более тонкое, чтобы часть дерева или часть инфы можно было шарить всем, а часть — определенному кругу лиц.
Но сама идея — объединять генеалогические деревья-«бонсайчики» при рождении ребёнка — по-моему, замечательная. Автор должен оценить. Можно через экспорт-импорт слияние реализовать. Ну и просто перекрёстным связям уделить больше внимания. Есть бездетные браки, есть крёстные-крестники. Наконец, просто друзья-подруги — на семейных фото иные встречаются чаще многих кровных членов семьи. Если есть возможность завести внешний IP (или пользоваться сервисом для динамического IP), то можно делать ссылки даже с одной домашней виртуалки на другую.
Фича хороша и для популяризации проекта. Она может редко используемая, но такая понятная, хорошо иллюстрируемая. Умильно-сентиментальная. Цепляюще-запоминаемая.
select ts_lexize('russian_stem','Иванова'), ts_lexize('russian_stem','Иванов'), ts_lexize('russian_stem','Иван');
ts_lexize | ts_lexize | ts_lexize
-----------+-----------+-----------
{иванов} | {иван} | {ива}
(1 row)
Понятно, что ничего хорошего не получится. Если поставить hunspell_ru_ru, то ситуация лучше
select ts_lexize('russian_hunspell','Иванова'), ts_lexize('russian_hunspell','Иванов'), ts_lexize('russian_hunspell','Иван');
ts_lexize | ts_lexize | ts_lexize
-----------+-----------+-----------
(null) | {иван} | {иван}
(1 row)
russian_aot_hunspell выдает побогаче
select ts_lexize('russian_aot_hunspell','Иванова'), ts_lexize('russian_aot_hunspell','Иванов'), ts_lexize('russian_aot_hunspell','Иван');
ts_lexize | ts_lexize | ts_lexize
----------------------------------+-----------+-----------
{иванов,иваново,ивановец,иванов} | {иванов} | {иван}
(1 row)
Можно в конце-концов сделать словарь синонимов и вбить туда исключения, я рекомендую использовать dict_xsyn для гибкости.
Короче говоря, можно все настроить с постгресом. У меня в ЖЖ есть несколько постов на тему FTS . Прошлой осенью я делал доклад в Лиссабоне на PGConf.eu, там тоже можно посмотреть на предмет словарей. Если что непонятно, обращайтесь. Меньше зависимостей, проще система.
.NET Core 2.1+
Я думаю, реализация на тёплом ламповом PHP + MySQL была бы более востребована массами, поскольку такой хостинг проще найти по доступной цене.
.NET в облаке — это, конечно, современно, но обывателю ввязываться в это ради генеалогического дерева нецелесообразно.
Ну, и с технической точки зрения организация всего генеалогического зоопарка в виде P2P выглядела бы революционно…
В любом случае ещё один бесплатный генеалогический веб-движок — это отлично :)
Что же до простого обывателя — ему достаточно будет запустить docker-образ и не придется думать о том, на чем написан движок. Хостинг для виртуалок в 2019 году очень широко распространен и стоит вполне доступно.
Давно хочу прикрутить подобный график как в ELK для webtrees. Можно по-подробнее в чем там проблема с временем рендера? Как поможет перенос логики на бэк?
Перенос логики на бэк позволит позволит потратить эти 5 секунд один раз после сохранения страницы, а потом показывать ее моментально из закешированных данных, вместо того чтобы заново пересчитывать их каждый раз при открытии страницы.
А вот насчёт будущего не проекта даже, а по поводу данного конкретного файла данных скажу так. Будучи реалистом я думаю, что через 50 лет кто-то опубликует ментаграмму на хапле-хапле:
«Надо же, мой дед носил хипстерские шмотки еще до того, как это стало мейнстримом». Первым делом я сохранил в мемокристалл данные (представляете, там не было ни одного голографического снимка! а некоторые побились и выглядели чёрно-белыми) и решил: «Хочешь сделать что-то хорошо — сделай это сам!»
Все совпадения случайны :)
На мой взгляд, сервис подобного рода должен быть «гибридным», т.е. уметь работать и с локальной базой, и с удаленной для многопользовательского доступа. Например на PouchDB.
digraph G {
splines=ortho
n1 [label="Иванов Иван Иванович", shape=rect, width=3, fixedsize=true]
n2 [label="Иванова Анна Николаевна", shape=rect, width=3, fixedsize=true]
n3 [label="Иванов Михаил Иванович", shape=rect, width=3, fixedsize=true]
n4 [label="Иванов Константин Иванович", shape=rect, width=3, fixedsize=true]
n5 [label="Иванов Алексей Иванович", shape=rect, width=3, fixedsize=true]
x1 [label="", fixedwidth=true, width=0.01, height=0.01]
{n1 n2} -> x1 [arrowhead=none]
x1 -> {n3 n4 n5} [arrowhead=none]
}
Первая крупная проблема — из коробки выглядит неприятно:
Вторая проблема: для получения хорошего внешнего вида приходится подбирать параметры руками, т.е. если из некоторых произвольных данных получилось сделать красивый граф, то добавление одного лишнего элемента может его полностью разломать. Другие мелкие проблемы — viz.js больше по размеру, кастомизировать внешний вид плашек сложнее.
В итоге ELK.js оказался гораздо проще и для данной задачи вполне устраивает.
Вот корректный граф:
digraph G {
splines=ortho
node[shape=rect]
edge[arrowhead=none]
{
rank=same
n1 [label="Иванов Иван Иванович"]
n1n2 [label="", shape = point]
n2 [label="Иванова Анна Николаевна"]
n1->n1n2->n2
}
n3n4n5 [label="", shape = point]
{
rank=same
n3 [label="Иванов Михаил Иванович"]
n4 [label="Иванов Константин Иванович"]
n5 [label="Иванов Алексей Иванович"]
}
n3n4n5->{n3 n4 n5}
n1n2->n3n4n5
}
Да, при splines=ortho «из коробки» стрелки из родителей выглядят некрасиво/неодинаково, не знаю с чем это связано, при других значениях spline всё выглядит более однородно. Хак в данном случае — направить рёбра n1->n1n2->n2 вместо n1->n1n2<-n2
Bonsai: фамильный вики-движок