شجرة العائلة داخل بوابة

يوم سعيد مبرمج! أتمنى لك مزيدًا من التعهدات الساطعة ، وطلبات السحب المدمجة ، وتقليل التعارضات في الدمج ، وأن تظل فروع حياتك مناسبة لأطول فترة ممكنة. كهدية مفاهيمية ، أقترح تنفيذ شجرة العائلة عن طريق نظام التحكم في إصدار Git. حسنا ... يبدو وكأنه خطة!



بالنسبة لأولئك الذين فهموا كل شيء على الفور ، أعطي روابط إلى الكود المصدري: GenealogyTreeInGit وأشجار العائلة: رؤساء الولايات المتحدة الأمريكية .


بالإضافة إلى ذلك ، قمت بتنفيذ رسم بياني اجتماعي بسيط. لا يعرض فقط درجة القرابة ، ولكن أيضًا حالة العلاقات بين الأحفاد ، والأحداث مثل الزفاف ، والطلاق ، والولادة ، وكذلك المساهمات في العلاقات.


بوابة


اسمح لي أن أذكرك بأن Git هو أحد أكثر أنظمة التحكم في الإصدارات شيوعًا. إنه فعال: يمكنك تنفيذ التغييرات وإنشاء (تسجيل الخروج) ودمج الفروع ، ومقارنة الإصدارات المختلفة من الملفات (فرق) ، وتحديد مؤلفي سلاسل معينة (إلقاء اللوم) ، والقيام بأشياء أخرى كثيرة.

لحسن الحظ أو للأسف ، يشبه Git الفائز الذي يعيد كتابة التاريخ: فهو يسمح لك بتغيير التواريخ والرسائل ومؤلفي الالتزامات. ولكن هذا يسمح لك بإضافة أفراد الأسرة ، كما لو كانوا مؤلفي الأحداث التي وقعت في تاريخ محدد.


بدأت صغيرة: كتبت العديد من الأوامر وفويلا ، جزء من الشجرة جاهز. غرامة. الآن سنقوم بذلك مع كل جيش الأقارب. سأكون سعيدًا بكتابة 200 سطر من الشفرة المربكة لهم ، و 10 آلاف سطر للرؤساء!


هل أضفتني بالفعل إلى قائمة البلهاء؟ ضرب قبالة. بالطبع ، قمت بأتمتة العملية وكتبت تطبيقًا لتحويل بيانات الأنساب إلى سلسلة من أوامر Git. هناك العديد من التنسيقات لمثل هذه البيانات ، لقد اخترت GEDCOM .


GEDCOM


GEDCOM هي مواصفات لتبادل بيانات الأنساب. هذا التنسيق قديم جدًا ، لكنه بسيط. تم وصف المواصفات جيدًا على الإنترنت. يتم دعمها بواسطة جميع برامج الأنساب تقريبًا ، لذلك هناك الكثير من الأمثلة عليها: الرؤساء الأمريكيون ، الأسرة الحاكمة ، شكسبير.

لقد نفذت كل هذه الفوضى في .NET Core - إنها مريحة وعبر الأنظمة الأساسية. لتحليل GEDCOM ومعالجته ، هناك العديد من مكتبات C # ، على سبيل المثال ، GeneGenie.Gedcom ، gedcomx-csharp . قررت أن أكتب مكتبتي الخاصة على أساس GedcomParser ، لأنها تحتوي على عيب فادح ... في الواقع ، لا: أردت فقط أن أفهم التنسيق بنفسي والتخلص من جميع التبعيات ، مما سيسمح ، إذا لزم الأمر ، بنقل المشروع بسهولة إلى لغات أخرى.


جيل القيادة


لقد حان الوقت لمعالجة البيانات المستخرجة بتنسيق مناسب وإنشاء أوامر Git لها. قررت فرز جميع الأحداث بترتيب زمني ، ثم إنشاء فروع ودمجها وارتكابها بترتيب تصاعدي للتواريخ. لسوء الحظ ، ليست كل الأحداث لها تواريخ ، لذلك لم يكن من السهل فرز جميع الأحداث بشكل صحيح. 2 ^ 2 ^ 3 أيام قادمة ، وأدركت أن هذا النهج لم يكن صحيحًا تمامًا ، لأن البحث في العمق الأول سيكون أسهل كثيرًا. ربما سأقوم بتصحيحه لاحقًا.


التهيئة


في هذه المرحلة ، قمنا فقط بتهيئة المستودع:


mkdir Family cd Family git init 

أحداث


في هذا الجزء من البرنامج النصي نقوم بمعالجة ونرتكب جميع الأحداث. للقيام بذلك ، تم استخدام الأوامر التالية:


  • git checkout --orphan branch_name
  • git merge @I1@ --allow-unrelated-histories --no-commit
  • git commit -m "msg" --date "" --author "name <email>" --allow-empty

الأمر الأول ، checkout ، ينشئ فرعًا لكل شخص. تتيح لك علامة --orphan إنشاء فروع يتيمة ، أي فروع بدون أولياء أمور. يتم إنشاء فرع اليتيم مرة واحدة - في المرة التالية التي تقوم فيها بتبديل الفروع باستخدام أمر checkout يتم حذف هذه المعلمة. في النهاية ، جميع الأطفال الذين ارتكبوا جرائم تقريبًا لهم آباء وأمهات ، باستثناء الأجداد البعيدين ، حيث أن الأجيال السابقة غير معروفة.


الأمر الثاني ، merge ، يوحد الوالدين ويخلق الطفل. نكتب "الميلاد" مع السنة المقابلة في رسالة الالتزام. كما نحدد الأعلام --allow-unrelated-histories و --no-commit بتمكين دمج الأيتام --allow-unrelated-histories التغييرات في وقت لاحق. يتم تبني بعض الأطفال ، لذلك نكتب "متبني" لهم. مضحك ، ولكن Git يسمح بالزواج الجماعي ، أي أنه من الممكن دمج أكثر من فرعين في وقت واحد. وليس للفروع جنس ، لذلك يمكنك أن تسميها "الوالد 1" و "الوالد 2". بالمناسبة ، من الممكن أيضًا إنشاء والدين عزاب.


أخيرًا ، الأمر الثالث ، commit ، ينشئ التزامًا جديدًا بالرسالة - -m ، التاريخ - التاريخ --date المؤلف. كما ذكرت بالفعل ، يتيح لك Git تغيير الرسالة والمؤلف وتاريخ الالتزام. علاوة على ذلك ، يتيح لك Git إنشاء تعهدات بدون ملفات ذات علامة --allow-empty ، وبدون رسائل تحمل علامة --allow-empty-message . يحتاج المؤلف أيضًا إلى تحديد بريد إلكتروني ، لكن Git يقبل رسالة فارغة - تحتاج فقط إلى كتابة <> . لسوء الحظ ، لا يحترم Git كبار السن: الحد الأدنى لتاريخ الالتزام هو 1 يناير 1970 ("بدء" وقت يونكس) - سيتم عرض التاريخ السابق بشكل غير صحيح. ومع ذلك ، يمكنك ببساطة ذكر التاريخ الحقيقي في الوصف. ومع ذلك ، فإن جيت تقبل التواريخ في المستقبل - انظر إلى إبني جيت. بالمناسبة ، من الممكن أيضًا إنشاء والدين عزاب.


الرسم البياني الاجتماعي


في الرسم البياني الاجتماعي ، يتم أيضًا تخزين الأحداث الأخرى إلى جانب الولادة: المعمودية ، وتغيير الإقامة ، والتخرج ، والزواج ، والطلاق ، والموت ، والجنازة. بعد الموت يذهب الفرع إلى السماء الرقمية ظهور الأحداث اللاحقة ، باستثناء الجنازات ، أمر مستحيل في الفرع. على الخادم ، يمكنك جعل هذا الفرع محميًا (لا تقلق: من الممكن "إبعاده" في المستقبل ، إذا لزم الأمر).


الحدث "زفاف" له أسلاف - زوجان. "الطلاق" له سلف واحد - "الزفاف" السابق. الأسرة والأبوة والأمومة عمل ، لذلك يمكننا أن نقول أنه بعد الزفاف يظهر أيضًا سليل جديد - "العلاقة" التي تنتهي بعد الطلاق (أو وفاة الزوج). يستأنف بعد الزفاف المقبل. بالإضافة إلى ذلك ، قد يشارك العديد من الأشخاص في علاقة (دمج عدة فروع).


الانتهاء


الكرز على الكعكة: نقوم بعمل مستودع نسخ احتياطي ونحمّل جميع المشاركين على GitHub أو GitLab أو أي خادم آخر يدعم Git. يمكننا دفع الفروع الواحدة تلو الأخرى ، لكن باستخدام الأمر السحري ، سنضغط عليهم جميعًا ، وهو أسرع وأبسط كثيرًا:


 git remote add origin https://gitlab.com/KvanTTT/Family.git git push origin --all -u 

لإنشاء شجرة عائلة مشتركة ، تحتاج إلى تمرير العلم --only-birth-events عند بدء تشغيل المولد. في هذه الحالة ، سيتم إنشاء التزام واحد لكل شخص (ولادة). خلاف ذلك ، شبكة اجتماعية سيتم إنشاء الرسم البياني الاجتماعي.


أمثلة


على سبيل المثال الصغير ، الذي يعمل على الأقل في كل مكان ، أنشأت شجرة عائلتي ، والمثال الكبير هو شجرة الرؤساء الأمريكيين (2145 شخصًا). وهي متوفرة في مستودعات Kochurkins و Presidents ، على التوالي. لإنشاء الشجرة الخاصة بي ، استخدمت خدمة geni.com ، والتي صدرت منها الشجرة إلى GEDCOM. يتوفر برنامج نصي تم إنشاؤه لإنشاء مستودع أنساب على Gist .



في GitHub (و GitLab أيضًا) ، يمكنك التنقل بين الأجداد والأحفاد. هذا مشابه لأنظمة الويكي للنسب Familypedia أو WeRelate . ومع ذلك ، فإن GitHub / GitLab أكثر تقدماً: يتم تنزيل الأشجار بسهولة منه (بمساعدة الأمر - --clone ). والأهم من ذلك ، يمكنك فتح الرسم البياني بأكمله مرة واحدة. (في برامج الأنساب الموجودة ، لسبب ما ، توجد صعوبات في فتح حتى الرسوم البيانية الصغيرة.) ويمكنك القيام بذلك باستخدام أدوات مختلفة (خدمة الويب ، Git Extesions ، Sourcetree ، GitKraken وغيرها). بالإضافة إلى ذلك ، يمكن استخدام هذه الخدمات مجانًا ، على عكس معظم خدمات الأنساب.


من الجدير بالذكر أنه في GitHub / GitLab ، يتوفر نوع من التحليلات: يمكنك معرفة من لديه أكثر يتبع حساب Instagram حياة حافلة بالأحداث. أو الأكثر شيوعًا: تعرض علامة تبويب Insights قائمة من الأشخاص بترتيب تناقص عدد مرات التعيين.



لسوء الحظ ، لا يعرض GitHub و GitLab الأشجار الكبيرة بشكل صحيح ، ولكن يتم تخزينهما بشكل صحيح - يمكنك فتح المستودع والتحقق منه. إليكم شجرة بلدي في واجهة الويب GitLab:



مشاكل


ليس واضحا كيف تكمل التاريخ من الجذور. في الوقت الحالي ، عليك إنشاء ذلك من البداية من ملف GEDCOM. ربما يمكن أن يتم ذلك بمساعدة rebase يمكنك أن تجرب التعليقات. سيكون من الأفضل أيضًا إعادة كتابة الكود لجعله "موجهًا نحو الالتزام" ، وليس "موجهًا للأحداث" ، لأنه يشبه Git: في الواقع ، فإن الفرع عبارة عن سلسلة من الالتزامات ، وليس كيانًا منفصلاً. لقد فكرت أيضًا في تطبيق العلامات والوحدات الفرعية ، لكن الآن لا أعرف كيفية القيام بذلك بشكل أفضل.


استنتاج


إذا قمت بتوسيع فكرة الأشجار العائلية إلى خدمات الويب للمطورين ، فبإمكانك استخدام مشكلات يمكنك إنشاء مهام عالمية وتوزيعها وفقًا لمعالم رئيسية : الطفولة والشباب والبلوغ والمسنين.


إلى جانب الأشجار العائلية ، يمكنك استخدام Git لتشفير أشجار الأنساب من لغات البرمجة (هذا هو أكثر العبقري غريب الأطوار) ، وأشجار بناء الجملة ، وأي هياكل شجرة. يمكن أن يكون Git مفيدًا لربات البيوت لبناء علاقات بين شخصيات المسلسلات البرازيلية :)


فائدة عملية: يساعد هذا الإحماء على فهم بنية Git وأوامره وتنسيق GEDCOM لوصف بيانات الأنساب بشكل أفضل.


تتوفر مصادر المقالة على GitHub - يرجى إرسال طلب السحب إذا وجدت أي خطأ أو تريد إضافة شيء ما. للتحويل إلى تنسيق habr.com ، استخدم مكتبة MarkConv .

Source: https://habr.com/ru/post/ar465959/


All Articles