Od pewnego czasu mam ochotę napisać jakiś projekt, który zajmie może tydzień może 2, ale nie dłużej. Chodzi o to, że cały czas mam mało czasu (adaptacja strychu na mieszkanie + 2 dzieciaków) więc wszystkie większe rzeczy za jakie się zabierałem kończyły w poczekalni i często już z niej nie wychodziły. Zresztą wszystkie moje projekty, które uważam za skończony były małe.
Chciałbym Wam przedstawić pomysł projektu, który będę implementować w ciągu najbliższych kilku dni - liczę, że napisanie tego wpisu pozwoli mi zdobyć więcej motywacji i projekt zostanie ukończony. Sam pomysł powstał już lekko 2 lata temu bo własnie wtedy zacząłem budować ponownie swoje drzewo genealogiczne. Znaczy robiłem je również bardzo dawno temu, ale wtedy używałem serwisu MyHeritage, a jeśli chodzi o dane w tym serwisie to często są błędne bo wiele osób nie przywiązuje uwagi do tego co tam jest dodawane. Potem trafiłem na projekt WikiTree, który reklamuje się jako takie darmowe Geni. Czyli zamiast dłubać sobie drzewka indywidualnie to dużo ludzi (w Polsce akurat jest mała społeczność) edytuje wspólnie coś na kształt Wikipedii, gdzie są jako strony dodane konkretne osoby. Jest to o tyle wygodne, że odkryłem całkiem sporą część rodziny gdy okazało się, że jeden z moich przodków był już wprowadzony. Serwis ma jednak poważną wadę w mojej opinii. Mimo, że reklamuje się jako darmowy to dostęp do danych jest nieco utrudniony. Gdybym chciał wygenerować sobie różne rzeczy to musiałbym się w większości opierać na parsowaniu danych, a główna baza danych jest nieudostępniana w łatwy sposób gdyż zawiera też sporo danych o aktualnie żyjących osobach, które jednak powinny zostać niejawne. Stworzenie kopii danych, które się wprowadziło nie jest zbyt przyjemne, a co za tym idzie trochę się obawiam czy moja praca kiedyś nie zostanie skasowana.
Zanim przejdę do samego opisu mojego pomysłu i pewnych założeń projektu to muszę dodać, że jestem pasjonatem systemu kontroli wersji GIT. Używam go niemalże od momentu powstania, a jeszcze 10 lat temu w gicie trzymałem wszystkie notatki na studiach i sprawozdania. Było to bardzo pomocne. Zresztą jeśli planujecie pisać pracę magisterską albo coś w tym stylu to również polecam, o ile nie będzie w pliku binarnym ;-). Z ciekawych projektów, które pod spodem używają gita mogę wymienić np. gopass. Menażer haseł, który pozwala nawet na współdzielenie pewnych haseł ze współpracownikami - posiada dużo wtyczek do np. popularnych przeglądarek - wszystko ładnie zaszyfrowane na repozytorium git.
Projekt
Już po tym przydługim wstępie pewnie możecie rozczytać co mi chodzi po głowie od tak długiego czasu. Po pierwsze dane projektu powinny być przechowywane w rozproszony sposób. Niektórzy wolą tworzyć swoje drzewa genealogiczne na komputerze i nie dzielą się nimi na zewnątrz, a są osoby, które chętnie się nimi podzielą. Dane niejawne muszą być w odpowiedni sposób zaszyfrowane, aby osoba, która posiada publiczne repozytorium ze swoimi przodkami, była w stanie ukryć pewne dane. Ponieważ mimo, że baza jest zdecentralizowana to dobrze aby repozytoria mogły korzystać ze swoich danych. Oznacza to tyle, że może istnieć repozytorium na Github z danymi, które nazywa się "Królowie Polski" i każdy może użyć jego danych. Fajnie by było gdyby eksport pewnych danych do "publicznych" repozytoriów był ułatwiony czyli program pod spodem może stworzyć odpowiedniego PR.
Podsumujmy sobie pewne wymagania jakie aplikacja powinna spełniać:
- każda osoba to osobny plik - po pierwsze takie coś ograniczy liczbę konfliktów, a także pozwoli lepiej współpracować z GIT
- nasze drzewo może składać się z nieograniczonej liczby repozytoriów - możemy sobie sklonować drzewo kolegi albo jakieś publicznie dostępne i używać go tak jakby było fragmentem naszego
- każda zmiana w drzewie taka jak np. dodanie nowych danych powinna na końcu prac tworzyć odpowiedni commit, który można wysłać na zdalne repozytorium
- dane niejawne powinny być zaszyfrowane, ale równocześnie powinna być możliwość współdzielenia kluczy, które te dane rozszyfrują (np. kilka osób z rodziny tworzy wspólne drzewo)
- wszystkie dane w plikach mimo, że są edytowane przez CLI to powinny być łatwe do zrozumienia (potrzebne przy np. pull requestach)
Do napisania projektu użyję TypeScript, który pod spodem będzie używać GIT oraz GPG. Na początek muszę ustalić dokładny format nazywania plików i strukturę danych takiego drzewa. Jeśli chodzi o samo przechowywanie danych osób to użyję plików YAML. Pozwoli to na dość łatwe rozszerzanie funkcjonalności w przyszłości.
Przyszłość
Oczywiście na początku będzie to aplikacja wyłącznie konsolowa, ale gdy już CLI zostanie skończone to chciałbym zacząć zabawę nad wersją graficzną. Mam jeszcze kilka pomysłów jak projekt mógłby się rozwijać w przyszłości, ale nie chcę wszystkich zdradzać za wcześnie.
Podzielcie się Waszymi opiniami :-)
Jakie jest Wasze doświadczenie z drzewami genealogicznymi? Tworzyliście może kiedyś takie? Używaliście do tego jakichś programów lub serwisów?