Bonsai: Familien-Wiki-Engine

    Lyrische Einführung


    Eines Abends, als ich den Wandschrank aufräumte, stieß ich auf einen großen Karton. Sie überlebte zwei Züge und öffnete sich so viele Jahre nicht, dass ich völlig vergaß, was in ihr gespeichert war. Es stellte sich heraus, dass es Fotos gab - in Alben, in Briefumschlägen eines Fotostudios, und manche waren einfach so.

    Viele Fotos wurden vor mehr als siebzig Jahren aufgenommen. Einer war ein Großvater - in seinen Studentenjahren, noch jung und stattlich, in absolut lambrigen Gläsern. „Wow, mein Großvater trug Hipster-Klamotten, bevor er zum Mainstream wurde“, dachte ich und lächelte unachtsam. Ich habe ihn sofort erkannt, aber dann sind Fotos von Leuten weitergegangen, an die ich mich an nichts erinnere. In den Gesichtszügen können Sie die Beziehung vage erraten - das ist alles.



    Als ich fünfzehn war, zeigte meine Großmutter wiederholt diese Karten und erzählte von denen, die auf ihnen abgebildet sind. Leider verstehen Sie den Wert solcher Geschichten nur, wenn es niemanden gibt, der sie erzählen kann. Zu dieser Zeit war es für mich zum zehnten Mal absolut uninteressant, ein paar moosige Geschichten aus den Vorkriegsjahren zu hören. Ich habe sie abgewischt und losgelassen. Jetzt, nachdem ich völlig begriffen hatte, dass ein Teil der Familiengeschichte unwiederbringlich verloren ging, versuchte ich zu systematisieren und zu erhalten, was übrig blieb.

    Die ideale Lösung zum Speichern von Familiendaten schien mir ein Hybrid aus einer Wiki-Engine und einem Fotoalbum zu sein. Es gab keine vorgefertigten Lösungen, also musste ich meine eigenen schreiben. Er heißt Bonsaiund ist Open Source unter MIT-Lizenz. Als nächstes wird die Geschichte beschrieben, wie es funktioniert und wie man es benutzt, sowie seine Entwicklungsgeschichte und ein kleines Drama .



    Noch ein Fahrrad


    Heute gibt es eine Vielzahl von Tools, mit denen Sie Stammbäume erstellen und Informationen über Verwandte erstellen können. Sie werden üblicherweise in zwei große Kategorien unterteilt - Onlinedienste und Desktopanwendungen.

    Im Falle einer Desktop-Anwendung wird die Datenbank normalerweise als Datei auf der Festplatte gespeichert. Sie öffnen die App und füllen sie im Einzelbenutzermodus auf. Bei Bedarf können Daten zur Sicherung oder zur Übertragung in ein anderes System (z. B. im GEDCOM- Format ) exportiert werden . Von denen, die ich sah, schienen Gramps (kostenlos) und der einheimische Lebensbaum (erfordert einen einmaligen Kauf) am meisten zu verwenden .

    Die Gegenseite des Spektrums sind Webservices. Sie speichern Ihre Daten auf Remote-Servern und berechnen für die regelmäßige Nutzung. Da es sich hierbei um ein kommerzielles Produkt mit einer zentralen Basis und einer guten Monetarisierung handelt, bieten die Dienste eines solchen Plans die Möglichkeit, beispielsweise nach DNA-Tests oder Archivaufzeichnungen nach verlorenen Angehörigen zu suchen.

    Die Vor- und Nachteile beider Optionen liegen auf der Hand. Im ersten Fall speichern Sie die Datenbank lokal und steuern den Zugriff darauf sowie die Erstellung von Sicherungen. Wenn es sich bei der Anwendung um Open Source handelt, können Sie mit großem Bedarf sogar zusätzliche Funktionen hinzufügen. Das Arbeiten mit einer solchen Datenbank oder das Anzeigen von Daten von einem anderen Gerät ist jedoch schwierig. Im zweiten Fall gibt es dagegen Zugriff von jedem Gerät aus, aber Sie geben Ihre Daten an Dritte weiter und hoffen auf deren Ehrlichkeit. In der Geschichte meiner Familie gibt es keine kompromittierenden Beweise oder schrecklichen Geheimnisse. Ich halte diese Informationen jedoch für rein persönlich und grundsätzlich möchte ich nicht, dass jemand anderes sie speichert oder analysiert.

    Wenn wir die Mängel beider Ansätze berücksichtigen, können wir eine Liste von Anforderungen für die "ideale" Engine formulieren:

    1. Webanwendung, die auf einem eigenen Server gehostet wird
    2. Erstellen Sie Artikel über Personen, Haustiere, Orte, Ereignisse usw. wie ein Wiki
    3. Mediendateien herunterladen
    4. Markieren Sie Personen auf dem Foto und Video
    5. Automatischer Stammbaumaufbau
    6. Kalender mit allen wichtigen Terminen
    7. Werkzeuge zum gemeinsamen Editieren und Schattieren

    Um fair zu sein, habe ich mehrere Projekte mit einer selbst gehosteten Implementierung gefunden, die sich jedoch in einem beklagenswerten Zustand befanden: Die Erscheinung erstarrte um die Mitte von zweitausend, es gab keine vollständige Funktionalität und ich wollte nicht in ältere Skripts in PHP einsteigen. Außerdem war das bisherige Haustierprojekt abgeschlossen und es bestand der Wunsch, etwas Neues anzunehmen.

    Die goldene Regel sagt: Willst du es gut machen? Mach es selbst!

    Die verwendeten Technologien wurden nach drei Kriterien ausgewählt: Meine Erfahrung mit ihnen, Beliebtheit und Offenheit. Hier ist das Ergebnis:

    • Laufzeit : .NET Core 2.1
    • Backend : ASP.NET Core MVC
    • Datenbank : PostgreSQL
    • Frontend-Logik : teilweise Vue, teilweise jQuery.
    • Frontend-Styles : Bootstrap + Sass

    In sekundären Rollen - Elasticsearch für die Volltextsuche und ffmpeg, um Screenshots vom Video zu erhalten.

    Datenschema


    Die Hauptobjekte in der Bonsai-Datenbank sind die Seite und die Mediendatei . Sie sind durch eine Viele-zu-Viele-Beziehung durch die Marken verbunden . Eine Marke kann einen Titel ohne Link haben - zum Beispiel, wenn Sie jemanden in einem Foto markieren müssen, aber auf einer vollständigen Seite keine Informationen darüber enthalten sind.



    Neben Freiformtext können auf der Seite Fakten angezeigt werden.die in spezielle Felder im Admin-Panel eingegeben werden. Fakten werden zur Berechnung zusätzlicher Daten verwendet: Wenn Sie beispielsweise das Geburtsdatum einer Person angeben, wird dies im Kalender markiert und das aktuelle Alter wird auf ihrer Seite angezeigt (oder die Lebenserwartung, wenn auch das Todesdatum angegeben ist). Sie können den korrekten Namen der Beziehung nach Geschlecht bestimmen ( "Oder" Mutter "anstelle der allgemeinen" Eltern ") und so weiter. Die Fakten werden als JSON-Dokument in der Datenbank gespeichert.

    Es stehen fünf Arten von Seiten zur Auswahl: Person, Haustier, Ereignis, Ort und andere. Die Liste der verfügbaren Fakten hängt von der Art der Seite ab: Beispielsweise ist „Bildung“ nur für eine Person relevant, „Geburtsdatum“ für eine Person und ein Tier und „Adresse“ nur für einen Ort.

    Seiten verbunden durch Beziehung: "Elternteil", "Ehepartner", "Freund", "Eigentümer", "Bewohner" und viele andere. Einige Beziehungen können zeitlich begrenzt sein (Ehepartner, Eigentümer, Einwohner), andere gelten als dauerhaft.

    Beim Speichern einer Seite oder Beziehung wird das resultierende Modell auf Konsistenz geprüft. Zum Beispiel müssen sich die Jahre der Ehepartner überschneiden , eine Person kann nicht mehr als einen leiblichen Elternteil haben und Sie können auch nicht Ihr eigener Vater werden. Gleichgeschlechtliche Ehe ist jedoch zulässig.

    Durch Bearbeiten einer Seite, Mediendatei oder Beziehung werden die Änderungen in der Basis gespeichert . Auf diese Weise können Sie den Änderungsverlauf speichern und ggf. zurücksetzen.

    Beziehung


    Beziehung ist eines der ältesten Konzepte in der Gesellschaft. Bereits in der Proto-Indo-Europäischen Sprache gab es viele Namen, die in leicht modifizierter Form in die modernen Sprachen der verschiedensten Gruppen übergingen: Das Wort „Mutter“ wird von Russisch, Englisch und Chinesisch verstanden.

    Es gibt viele Beziehungsoptionen, aber drei davon sind grundlegend: Elternteil , Kind und Ehepartner. Damit können Sie aus einer Familie einen gerichteten Graphen erstellen, bei dem diese Beziehungen Kanten sind und Personen Knoten sind. Jede andere Beziehung kann in einer solchen Spalte ausgedrückt werden, die den Pfad zwischen den Teilnehmern und ihr Geschlecht kennt: Um beispielsweise den Großvater einer Person zu bestimmen, müssen Sie zuerst seinen Elternteil (mit beliebigem Geschlecht) und dann den Elternteil dieses Elternteils (männlich) usw. suchen.

    Im Admin-Bonsai können Sie die Beziehung dieser drei Basistypen eingeben. Für jede Beziehung wird automatisch das Gegenteil erstellt - der Elternteil des Kindes, der Ehepartner des Ehepartners, der Besitzer des Haustieres. Alle zusätzlichen Beziehungen werden von der Engine berechnet und in der Seitenleiste der Seite angezeigt:



    Zum Berechnen von Beziehungen wird eine elementare Umgehung des Diagramms verwendet, und die Beziehungsnamen werden als spezielles DSL angegeben:

    public static RelationDefinition[] ParentRelations =
    {
    	new RelationDefinition("Parent:m", "Отец"),
    	new RelationDefinition("Parent:f", "Мать"),
    	new RelationDefinition("Parent Child:m", "Брат", "Братья"),
    	new RelationDefinition("Parent Child:f", "Сестра", "Сестры"),
    	new RelationDefinition("Parent Parent:m", "Дедушка", "Дедушки"),
    	new RelationDefinition("Parent Parent:f", "Бабушка", "Бабушки")
    };
    

    Sogar direkte Verwandte einer Person können viele sein . Bonsai unterteilt Verbindungen in folgende Gruppen:

    1. Die engste Verwandtschaft ist die Familie, in der die Person aufgewachsen ist: Mutter und Vater, Großeltern, Geschwister. Wenn Sie die Grafik betrachten, ist dies der Weg 1-2 Schritte nach oben und 1 seitwärts.
    2. Eigene Familie : eine Gruppe für jeden Ehepartner und Kinder von ihm. Dies gilt auch für Angehörige des Ehepartners - Schwiegermutter, Schwager und dergleichen.
    3. Andere : weiter entfernte Verwandte (Enkelkinder, Onkel-Tante) und Nichtverwandte (Freunde, Kollegen).

    Manchmal reicht eine Möglichkeit, die Gruppenzugehörigkeit zu bestimmen, nicht aus. Die Daten sind möglicherweise unvollständig, müssen aber dennoch so genau wie möglich angezeigt werden. Betrachten wir folgendes Diagramm:



    Wie wir sehen, gibt es für Alexander zwei Frauen (Vera und Galina) und einen Sohn (Boris), aber wir wissen nicht, welche der Frauen die Mutter des Kindes ist - vielleicht ist es eine dritte Frau, aber sie ist es noch nicht hinzugefügt Für solche Fälle können mehrere Pfade angegeben werden, die vorhanden sein müssen oder nicht, und sie sind mit Zeichen gekennzeichnet +und -dementsprechend:

    new RelationDefinition("Spouse Child+Child", "Сын|Дочь|Ребенок", "Дети")
    new RelationDefinition("Spouse Child-Child:m", "Пасынок")
    new RelationDefinition("Spouse Child-Child:f", "Падчерица")
    

    Stammbaum


    Jede anständige genealogische Engine sollte in der Lage sein, einen Familienstammbaum aufzubauen. Dies ist die visuelleste Art, allgemeine Informationen über Personen und deren Angehörige anzuzeigen. Die Daten werden als gerichteter Graph in der Datenbank gespeichert und sollten theoretisch leicht zu visualisieren sein. In der Praxis sind gerade bei der Darstellung des Baumes die größten Schwierigkeiten aufgetreten.

    Hier einige Beispiele, wie Stammbäume aussehen könnten:



    Pedigree Targaryen. Sehr kompakt, da es von Hand gefertigt wird. Es wird extrem schwierig sein, einen solchen Baum automatisch aus beliebigen Daten zu generieren.



    Griechische Götter Die grafische Darstellung wird aus der speziellen Abschriften-Syntax generiert .in dem Sie noch alle Blöcke manuell anordnen und die Verknüpfungen zwischen ihnen zeichnen müssen. Ein bisschen wie ASCII-Kunst.



    Darstellung eines Baumes in Form eines Halbkreisdiagramms. Wird automatisch generiert, berücksichtigt jedoch nur direkte Vorfahren.

    Ich habe viele Möglichkeiten durchgesehen. Das ästhetisch ansprechendste war auf der Site MyHeritage: Das



    Zeichnen eines solchen Baums kann in drei bedingte Schritte unterteilt werden: Abrufen von Daten aus der Datenbank, Platzieren von Blöcken / Verbindungslinien und direktes Anzeigen auf der Seite. Wenn beim ersten und dritten Schritt alles trivial war, stolperte ich beim zweiten.

    Der Versuch, in Eile eine selbst gemachte Entscheidung zu skizzieren, endete in einem völligen Fiasko. Die korrekte Platzierung der Elemente der Graphen - ist so komplexer Bereich , dass ihre Dissertationsschrift , undFertigbauteile sind wie eine Wohnung in Moskau. Okay, das meiste Schreiben wird nicht funktionieren, aber es gibt sicherlich anständige freie Lösungen?

    Am meisten habe ich meine Hoffnungen auf die D3.js-Bibliothek gesetzt . Vielleicht ist dies das erste, woran Sie denken müssen, wenn Sie eine Grafik oder ein Diagramm auf einer Webseite zeichnen müssen. Leider war unter mehr als dreihundert (!) Beispielen im Wiki dem Baum mit MyHeritage nichts mehr oder weniger ähnlich.

    Der nächste Schritt bestand darin, in die Bibliotheken einzutauchen, die sich nicht mit dem Zeichnen beschäftigen, nämlich der Berechnung der optimalen Anordnung der Elemente im Graphen. Die meisten bieten ein sogenanntes Force-Layout.. Dies ist ein sehr einfacher Ansatz, der auf physikalischen Formeln basiert: Die Knoten des Graphen werden durch elastische Körper und die Verbindungslinien durch Federn dargestellt. Es ist leicht an der charakteristischen Animation zu erkennen - der Graph scheint sich unterwegs zu "begradigen", und dies ist kein zusätzliches Merkmal, sondern die unvermeidliche Folge der Simulationseigenschaft des Algorithmus. Der Force-Layout-Ansatz eignet sich für die Visualisierung von Daten ohne klare Hierarchie (z. B. Verknüpfungen mit sozialen Netzwerken). Der Familienstammbaum in dieser Form wirkt jedoch defekt.

    Eine andere in Betracht gezogene Option ist die Graphviz- Bibliothek . Das Ergebnis ihrer Arbeit ist leicht an den charakteristischen Pfeilen zu erkennen. Die spezielle Sprache DOT wird zur Beschreibung der Grafik verwendet.. Testbeispiele sehen sogar mehr oder weniger aus, aber bei realen Daten treten Probleme auf: Die Pfeile „brechen zusammen“ und verbinden sich mit fremden Winkeln, der Graph breitet sich aus und dies kann nicht abgestimmt und umgangen werden.

    Da ich selbst keine passende Lösung fand, entschied ich mich, sie als Freelancer zu bestellen, und hier begann DRAMA .

    Die Bestellung wurde am Morgen des 22. Oktober aufgegeben und innerhalb einer Stunde gingen mehrere Antworten ein. Einer der Befragten wurde Vladislav genannt. Er sandte ein Beispiel für eine ähnliche Lösung und versprach, die Aufgabe an einem Tag zu erledigen .. Eine solche Rate schien mir misstrauisch zu sein, aber ich hoffte auf seine Erfahrung und für mich selbst gab ich dem Mann einen Fehler von einer Woche. In den ersten Tagen stellte Vladislav weitere Fragen, die ihn nie mit einem tiefen Eintauchen in das Projekt und einem aufmerksamen Umgang mit Details überraschen, und dann verschwand er. Er wachte am 1. November auf, entschuldigte sich für das erzwungene Verschwinden aus familiären Gründen und schickte einen Link mit einer Betaversion, die dem gewünschten sehr ähnlich sah, wenn nicht der Knoten in den Verbindungslinien in der Mitte wäre:



    Das Verschwinden des Darstellers ist immer ein Weckruf, aber alles kann passieren, alles passiert, weil er etwas getan hat. Lass ihn weiter! Ich schickte eine Vorauszahlung und wartete auf Verbesserungen. Ein paar Tage später schrieb Vladislav, dass er das Problem nicht lösen könne, und verschwand dann wieder - diesmal für drei Wochen. Während dieser Zeit tat er nichts und lehnte es ab, die Vorauszahlung zurückzuzahlen, weil "die Aufgabe tatsächlich von einem dummen ehemaligen Freund erledigt wurde, der ihn im Stich ließ und das Geld nicht gab." Nach ein paar klärenden Fragen hörte der Pseudo-Delegator auf, otmazyvatsya zu versuchen, und hörte einfach auf. Jetzt leben wir - von Zeit zu Zeit erinnere ich ihn an die Schuld, und er sendet einen Screenshot aus dem Bankantrag - sie sagen: "Es gibt kein Geld, aber sobald - so sofort." Ich wünsche Vladislav geschäftlichen Erfolg und werde schneller reich!

    Ich habe ein Kind geworfen - minus Karma!

    Geld zu verlieren war nicht so ärgerlich, aber es verging ein ganzer Monat, und die Aufgabe kam nicht zustande, und jetzt gab es keinen Ort, an dem man auf Hilfe warten konnte. Zunächst war ich wütend auf mich: Ich habe den Weg des geringsten Widerstandes genommen, die goldene Regel gebrochen - und das ist das Ergebnis. Nachdem ich mich mit aufrichtigem Ärger erfüllt hatte, setzte ich mich wieder hin, um die Bibliotheken für das Zeichnen von Graphen zu studieren. - plötzlich genau das gefunden, was Sie brauchen.

    Die Bibliothek wurde Eclipse Layout Kernel genannt , abgekürzt als ELK. Wie Sie sich vorstellen können, wird dies zur Anzeige von Diagrammen in der Eclipse-IDE verwendet, es kann jedoch auch offline verwendet werden. Im Allgemeinen ist es in Java geschrieben, aber es gibt eine Version, die in JS übersetzt wurde. Ja, ihr Code ist schrecklichund wiegt eineinhalb Megabytes, aber diese Mängel können dahingestellt werden, dass es einfach funktioniert und genau das tut und genau so, wie es sollte. Die Schnittstelle ist elementar: Knoten, Kanten und Einstellungen werden an die Eingabe übertragen, und an der Ausgabe erhalten wir Koordinaten. Sie können auf beliebige Weise einen Baum darauf zeichnen: Ich habe SVG zum Verbinden von Linien und Divs mit absoluter Positionierung für Blöcke ausgewählt.

    Die Integration der Bibliothek und die Auswahl der optimalen Einstellungen dauerte zwei Nächte. Dies ist natürlich nicht "ein Tag", wie mein glückloser und arroganter Freiberufler versprochen hat, sondern eher nahe. Als Ergebnis konnte Bonsai einen Baum in etwa folgender Form anzeigen:



    Jetzt bleibt nur noch die Bearbeitungszeit. ELK verwendet einen iterativen Algorithmus: Sie können sich der optimalen Platzierung nähern, indem Sie mehr Zeit investieren. Bei einem Baum mit 20 bis 30 Elementen benötigt ein gutes Ergebnis etwa 5 Sekunden. Aus diesem Grund wird die Baumseite jedes Mal für lange Zeit geöffnet, und dies beginnt schnell zu ärgern. Bei der nächsten Version wird die Berechnung in das Backend übertragen, sodass sie einmal durchgeführt werden kann, wenn die Seite geändert und eingelöst wird.

    Volltextsuche


    Ein System zum Speichern von Textinformationen wäre ohne eine bequeme Volltextsuche unbrauchbar. Da Bonsai die PostgreSQL-Datenbank verwendet, habe ich mich zunächst für ein Angebot entschieden. Eine weitere Enttäuschung: tsvectorUmgang mit gewöhnlichen Wörtern, aber die Suche nach dem Wichtigsten - den Namen und Nachnamen - lehnt völlig ab:

    SELECT
       to_tsvector('Проверки') @@ to_tsquery('Проверка'),            -- true
       to_tsvector('Иванов') @@ to_tsquery('Иван'),                  -- false
       to_tsvector('Иванова') @@ to_tsquery('Иван'),                 -- false
       to_tsvector('Иванова') @@ to_tsquery('Иванов'),               -- false
       to_tsvector('Иванов Иван Иванович') @@ to_tsquery('Иванова')  -- false
    

    Trigrams gaben auch nichts Gutes. Daher blieb ich bei einer eher erwarteten Option stehen: ElasticSearch + Russian Morphology . Es erwies sich als sehr unpraktisch, von .NET aus mit ihm zu arbeiten, aber er ist mit der Suche nach dem vollständigen Namen auf einer soliden Top-Fünf fertig.

    Bewusste Unvollkommenheit


    Bei der Arbeit an einem Projekt kam es regelmäßig zu Situationen, in denen der Perfektionist die gewählte Lösung in Rage brachte. Der Themenbereich ist eher nicht standardmässig und die allgemein anerkannten "Regeln des guten Tones" funktionieren nicht immer.

    Was passiert zum Beispiel, wenn wir eine Seite öffnen?

    1. Der Text der Seite wird von Markdown zu HTML zusammengestellt. Wenn der Text Links zu anderen Seiten und Mediendateien enthält, müssen Sie zur Datenbank gehen, um weitere Informationen zu erhalten.
    2. Fakten werden von JSON deserialisiert, in dem sie in der Datenbank im Ansichtsmodell gespeichert werden.
    3. Verwandtschaftsbeziehungen sind festgelegt. Dazu müssen Sie von der langjährigen Basis aus den gesamten Link-Graphen ermitteln und darin Knoten finden, indem Sie eine zuvor bekannte Pfadliste verwenden.

    Auf den ersten Blick scheint es sich hier um eine äußerst schwierige Operation zu handeln, in Wirklichkeit ist dies jedoch nicht der Fall, da relativ wenige Daten vorliegen. Wie viele Verwandte können Sie sich merken und aufnehmen wollen? Versuchen Sie, sie aus Gründen des Interesses zu zählen, und Sie werden feststellen, dass es sehr schwierig sein wird, mindestens hundert Punkte zu erzielen. Und wie viele Menschen möchten den Zugang gewähren? Sogar eine astronomisch große Zahl für eine Familie - tausend Menschen! - Nach den Maßstäben moderner Datenbanken bleibt das lächerlich.

    Natürlich wird das kompilierte Ansichtsmodell der Seite immer noch zwischengespeichert, wenn es zum ersten Mal geöffnet und für nachfolgende Ansichten wiederverwendet wird - vor allem, weil es sehr einfach zu implementieren war. Die Regel der Ungültigmachung des Caches bei Änderungen im Admin-Panel wird ebenfalls so einfach wie möglich gehalten: Wenn wir nur den Text und einige lokale ändern, werden Änderungen vorgenommenFakten (Liste der Sprachen, Blutgruppe, Haarfarbe usw.), dann reicht es aus, diese bestimmte Seite zurückzusetzen. Bei jeder anderen Änderung - dem Namen der Seite, dem Geburtsdatum oder dem Geschlecht, dem Hinzufügen oder Ändern einer Verbindung - wird der Cache vollständig zurückgesetzt . Ja, dies ist nicht die intelligenteste Art zu reinigen. Ja, sicherlich könnte man einen komplexen Algorithmus schreiben, der nur das Notwendigste fallen lässt - aber für dieses Projekt würde dies die Kosten nicht rechtfertigen.

    Das Projekt unterstützt keine Lokalisierung und Änderung des Erscheinungsbildes, die Autorisierung funktioniert in OAuth unter Facebook \ Google und das Admin-Panel wird auf normalen Formularen und nicht auf einem SPA-Framework auf die neueste Art und Weise erstellt. All dies könnte implementiert oder verbessert werden, aber es würde kein Problem lösen, und daher würde Zeit verschwendet.

    Ich freue mich auf die Zukunft


    Ein weiterer Grund, warum es nicht sinnvoll ist, in die Komplexität der Engine-Vorrichtung zu investieren, ist eine flüchtige Implementierung im Vergleich zu den gespeicherten Daten. Bedenken Sie eine Minute: Das Web in seiner jetzigen Form existiert seit fast zwanzig Jahren, und die Familiengeschichte impliziert die Lagerung seit Jahrhunderten . Bisher hat noch niemand dieses Problem gelöst, nur weil die Informationstechnologiebranche viel kleiner ist. Was kann man machen?

    Die Engine muss regelmäßig von Grund auf neu geschrieben werden - so wie die Mönche im Laufe von Jahrtausenden fleißig Texte aus alten Büchern in neue kopierten. Der einzige Unterschied besteht darin, dass das Buch bei richtiger Behandlung und der Anwendung über hundert Jahre liegen kann - auf die Kraft von 15-20 Jahren. Ich hoffe, dass ich es in zwanzig Jahren immer noch alleine schaffen kann, aber in weiteren zwanzig Jahren werde ich dies meinen Kindern oder Enkelkindern antun müssen. Ich möchte ihnen eine einfache, verständliche und dokumentierte Quelle hinterlassen.

    In den ersten Phasen des Designs wollte ich einige SQL-ähnliche Sprache in die Engine einbetten, mit der man Antworten auf spezifische Fragen erhalten konnte: „Wie viel Prozent meiner Vorfahren mit blauen Augen“, „Als Ivan das erste Auto gekauft hat“ und so weiter. Diese Idee musste aufgegeben werden, da an Stelle des üblichen Textes alle Informationen in eine Art formalisierter Form gebracht werden müssten, und nur die Beschreibung dieses Typs würde Jahre dauern. Auf der anderen Seite gewinnt das Verständnis natürlicher Sprache jetzt an Bedeutung. Es würde mich nicht wundern, wenn Siri in ein oder zwei Jahrzehnten gebeten werden könnte, den Text für Sie zu lesen, den Links zu folgen und schließlich einen Eindruck von den Fakten zu vermitteln. Jungs, schieben!

    Wie versuche ich es?


    Leider kann ich keine Verknüpfung zur fertigen Demo herstellen: Es gibt keinen Server, der den Habraeffekt aushalten könnte. Es gibt jedoch mehrere visuelle Screenshots (Bilder sind anklickbar). Wenn Ihnen Bonsai nützlich erschien und Sie es selbst ausführen möchten, können Sie den Quellcode von GitHub herunterladen: https://github.com/impworks/bonsai Detaillierte Installationsanweisungen finden Sie in der Readme-Datei. Sie werden das brauchen:









    1. .NET Core 2.1 und höher
    2. PostgreSQL 10+
    3. ElasticSearch 5.x und Russisches Morphologie-Plugin
    4. Facebook- oder Google-App zur Autorisierung von OAuth

    Nach dem ersten Start werden mehrere Testseiten und Fotos in der Datenbank erstellt. Für die Produktion ist dieses Verhalten nicht notwendig und wird durch das Flag in den Einstellungen deaktiviert.

    Erst vor einem Monat habe ich meine eigene Instanz gestartet und angefangen, sie zu testen und echte Daten abzurufen. Es gibt einige grobe Stellen, aber ansonsten bin ich mit dem Ergebnis vollkommen zufrieden. Nun wird das Projekt schrittweise weiterentwickelt und abgeschlossen. Die Hauptaufgabe besteht darin, die Anzeige des Baums zu beschleunigen, das Herunterladen von Dokumenten als PDF zu ermöglichen und die Zugriffsrechte zu verfeinern. Es wäre gut, die Benutzerfreundlichkeit des Administrators an einigen Stellen zu verbessern oder die automatische Erkennung von Gesichtern auf dem Foto vorzunehmen - dies ist jedoch nicht genau .

    Jetzt auch beliebt: