الهدف من وراء ثواب هو عمل مشروع موسوعي عام يحتوي كل نتاج الأمة الفكري في شجرة وصف للمحتويات (بنيوية وليس ظاهرية)
الكتب تقسم فيها إلى أبواب وفصول وفصول فرعية … ونص
والمعاجم إلى معرِّف واحد والأحاديث إلى سند ومتن
والسند إلى راوي وعلاقة (الراوي فلان العلاقة حدثني مثلا) وهكذا
فائدة التقسيم البنيوي للبيانات يتيح لنا مثلا إمكانية البحث في السند دون المتن أو إمكانية توليد شجرة الأسانيد تلقائيا
ثواب 2 صممت لتكون عارض لملفات الشاملة والتوافقية كانت هدف أي بطريقة bug for bug compatibility لأن أي تعديل في هيئة الشاملة تعني أن تنتظر فترة أطول حتى يتم استيراد الملف
الخطوة التالية هي استيراد الكتب بالكامل في صيغة مختلفة تماما تكون تمثيل هرمي فريد له مكافئ xml لمحتوى الكتاب وبنيته لا لشكل الكتاب ومظهره.
لكن في هذه الحالة يجب أن يقدم موقع أعجوبة كل الكتب بصيغة جاهزة دون استيراد
الجدول والصف والحقل … مصطلحات تعود على ملف قاعدة البيانات وقد وقع اختيارنا على sqlite
العقدة والجد والوالد و الأشقاء … مصطلحات عن بنية الشجرة tree data structure
الراقمة هي وسم يطبق على العقدة (يمكن تطبيق أكثر من راقمة على نفس العقدة ويمكن تطبيق الراقمة الواحدة على أكثر من عقدة)
أن يكون للتمثل مكافئ ب xml وإن لم نستخدم xml فعليا وأن يكون كتابة برنامج التحويل إلى xml بدهيا trivial
يتيح البرنامج وسم النص براقمات مخصصة يحددها المحرر تبعا لما يراه مناسبا لجوهر المحتوى دون التفكير بطريقة عرضه حيث يتم تقسيم الكتاب إلى أبواب وفصول وفي كتب الحديث يكون الحديث هو الوحدة الجوهرية وفي كتب التفسير تكون مجموعة الآيات التي تفسر معا هي الوحدة الجوهرية بغض النظر عن الصفحات
الترتيب مهم في شجرة المحتوى لأن الفصل الثاني يجب أن لا يظهر بعد الفصل الرابع وإن تم إضافته بعد الفصل الرابع
بما أن ثواب 3 ستكون مكتبة مستقلة يجب أن يكون من السهل عمل كتب خصيصا لها
برامج التحرير تحتاج لإضافة أو حشر insert بيانات في الوسط وهذا يعني أن أسطر الجدول لن تكون مرتبة عند التحرير في حين البرامج تحتاجها مرتبة.
الشكل المرفق شجرة محتويات عقدها عن الألوان فيها رقم الصف في قاعدة البيانات وعنوان العقدة.
1 - باب الألوان الحارة
3 - فصل الأحمر
4 - فصل الأصفر
2 - باب الألوان الباردة
5 - فصل الأزرق
6 - فصل البنفسجي
المطلوب الأول: هو أن يتم استخراج جدول المحتويات مرتب بترتيب العمق أولا دون الاعتماد على أرقام الصفوف وأن يكون ذلك بإستعلام واحد
المطلوب الثاني: حشر اللون البرتقالي بين الأحمر والأصفر
1 - باب الألوان الحارة
3 - فصل الأحمر
7 - فصل البرتقالي
4 - فصل الأصفر
2 - باب الألوان الباردة
5 - فصل الأزرق
6 - فصل البنفسجي
المطلوب الثالث: حشر تمهيد قبل الباب الأول
8 - تمهيد
1 - باب الألوان الحارة
3 - فصل الأحمر
7 - فصل البرتقالي
4 - فصل الأصفر
2 - باب الألوان الباردة
5 - فصل الأزرق
6 - فصل البنفسجي
المطلوب الرابع: تحويل التمهيد إلى باب به فصلان الإهداء والمقدمة
8 - هذا الكتاب
9 - إهداء
10 - مقدمة المؤلف
1 - باب الألوان الحارة
…
المطلوب الخامس: حشر باب الألوان المحايدة قبل الباب الأول
المطلوب السادس: تحويل باب الألوان الحارة والباردة إلى أبناء لباب ألوان الطيف
المطلوب السابع: نقل الأبيض إلى الألوان الحارة والأسود للباردة والتراجع عن ذلك
المطلوب الثامن: دمج الألوان الحارة والباردة لتكون فصولا في باب ألوان الطيف طبعا مع حذف الفصلين ثم إضافة بقية ألوان الطيف ثم التراجع عن كل هذا
من صحيح البخاري
حَدَّثَنَا يَعْقُوبُ بْنُ إِبْرَاهِيمَ قَالَ حَدَّثَنَا ابْنُ عُلَيَّةَ عَنْ عَبْدِ الْعَزِيزِ بْنِ صُهَيْبٍ عَنْ أَنَسٍ عَنْ النَّبِيِّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ ح و حَدَّثَنَا آدَمُ قَالَ حَدَّثَنَا شُعْبَةُ عَنْ قَتَادَةَ عَنْ أَنَسٍ قَالَ قَالَ النَّبِيُّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ لَا يُؤْمِنُ أَحَدُكُمْ حَتَّى أَكُونَ أَحَبَّ إِلَيْهِ مِنْ وَالِدِهِ وَوَلَدِهِ وَالنَّاسِ أَجْمَعِينَ
في الحديث سلسلتان بعد أنس
حَدَّثَنَا مُحَمَّدُ بْنُ عُبَيْدِ بْنِ مَيْمُونٍ حَدَّثَنَا عِيسَى بْنُ يُونُسَ عَنْ عُبَيْدِ اللَّهِ عَنْ نَافِعٍ عَنْ ابْنِ عُمَرَ رَضِيَ اللَّهُ عَنْهُمَا رَخَّصَ النَّبِيُّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ ح حَدَّثَنَا يَحْيَى بْنُ مُوسَى حَدَّثَنَا مُحَمَّدُ بْنُ بَكْرٍ أَخْبَرَنَا ابْنُ جُرَيْجٍ أَخْبَرَنِي عُبَيْدُ اللَّهِ عَنْ نَافِعٍ عَنْ ابْنِ عُمَرَ رَضِيَ اللَّهُ عَنْهُمَا أَنَّ النَّبِيَّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ أَذِنَ ح و حَدَّثَنَا مُحَمَّدُ بْنُ عَبْدِ اللَّهِ بْنِ نُمَيْرٍ حَدَّثَنَا أَبِي حَدَّثَنَا عُبَيْدُ اللَّهِ قَالَ حَدَّثَنِي نَافِعٌ عَنْ ابْنِ عُمَرَ رَضِيَ اللَّهُ عَنْهُمَا أَنَّ الْعَبَّاسَ رَضِيَ اللَّهُ عَنْهُ اسْتَأْذَنَ النَّبِيَّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ لِيَبِيتَ بِمَكَّةَ لَيَالِيَ مِنًى مِنْ أَجْلِ سِقَايَتِهِ فَأَذِنَ لَهُ تَابَعَهُ أَبُو أُسَامَةَ وَعُقْبَةُ بْنُ خَالِدٍ وَأَبُو ضَمْرَةَ
النبي صلى الله عليه وسلم
ابن عمر رضي الله عنه
نافع
عبيد الله بن عمر
عيسى بن يونس: لفظ (رَخَّصَ النَّبِيُّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ…)
ابن جريج لفظ (أَنَّ النَّبِيَّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ أَذِنَ …)
“أبي” أي أبو محمد بن عبد الله بن نمير: لفظ (أَنَّ الْعَبَّاسَ رَضِيَ اللَّهُ عَنْهُ اسْتَأْذَنَ …)
أبو أسامة
عقبة بن خالد
أبو ضمرة
ملاحظات:
روى هذا الحديث عن عبيد الله ستة من الرواة
الحديث أتى بثلاثة ألفاظ
انفرد راويي بلفظين مختلفين، واتفق أربعة على لفظ الذي ذكره البخاري بتمامه بينما لم يتم اللفظين السابقين
إسناد البخاري إلى ابن جريج ومنه إلى النبي صلى الله عليه وسلم نازل (أي رجال السند أكثر) فبين البخاري وبين النبي صلى الله عليه وسلم في هذا الإسناد ستة من الرواة، وبينما في بقية الأسانيد خمسة.
لم يذكر البخاري رحمه الله إسناده منه إلى ثلاثة من الرواة، وإنما اكتفى بقوله أن هؤلاء الثلاثة (أبو أسامة وعقبة وأبو ضمرة) تابعوا عبد الله بن نمير.
ح تعني تحويل السند أي أن هذا فرع آخر من شجرة السند وهي تشبه قوع العوام ..إلخ حيث يذكر ذاك الجزء من السند ثم جزء من قول النبي صلى الله عليه وسلم
من الضروري جدا إدخال صيغة التحمل عند تكوين شجرة الأسانيد (حدثنا تختلف عن سألت وتختلف عن “عن”)
إن تم تمثيل الشجرة في الكتاب فإن الحصول على نص الكتاب يكون أصحب
تاليا محاولة تسطيح الشجرة إلى سلاسل مع المحافظة على نفس النص الظاهر في الكتاب
<sanad>
<branch>
<theCompiler/>
<tahamul id="###">حدثنا</tahamul>
<rawi id=XYZ>مُحَمَّدُ بْنُ عُبَيْدِ بْنِ مَيْمُونٍ</rawi>
<tahamul id="###">حدثنا</tahamul>
<rawi id=XYZ>عِيسَى بْنُ يُونُسَ عَنْ عُبَيْدِ اللَّهِ</rawi>
<tahamul id="###">عن</tahamul>
<rawi id=XYZ>عُبَيْدِ اللَّهِ عَنْ نَافِعٍ</rawi>
<tahamul id="###">عن</tahamul>
<rawi id=XYZ>ابْنِ عُمَرَ رَضِيَ اللَّهُ عَنْهُمَا</rawi>
<tahamul id="###"/>
<prophetMuhammad/>
<phrasing>رَخَّصَ النَّبِيُّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ</phrasing>
<shift/> <!-- rendered as ح //-->
</branch>
<branch>
<theCompiler/>
<tahamul id="###">حدثنا</tahamul>
<rawi id=XYZ>يَحْيَى بْنُ مُوسَى</rawi>
<tahamul id="###">حدثنا</tahamul>
<rawi id=XYZ>مُحَمَّدُ بْنُ بَكْرٍ</rawi>
<tahamul id="###">أخبرنا</tahamul>
<rawi id=XYZ>ابْنُ جُرَيْجٍ</rawi>
<tahamul id="###">أَخْبَرَنِي</tahamul>
<rawi id=XYZ>عُبَيْدُ اللَّهِ عَنْ نَافِعٍ</rawi>
<tahamul id="###">عن</tahamul>
<rawi id=XYZ>ابْنِ عُمَرَ رَضِيَ اللَّهُ عَنْهُمَا</rawi>
<tahamul id="###"/>
<prophetMuhammad/>
<phrasing>أَنَّ النَّبِيَّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ أَذِنَ</phrasing>
<shift/> <!-- rendered as ح //-->
</branch>
<branch>
<theCompiler/>
<tahamul id="###">وحدثنا</tahamul>
<anchor id="anchorID"><rawi id=XYZ>مُحَمَّدُ بْنُ عَبْدِ اللَّهِ بْنِ نُمَيْرٍ</rawi></anchor>
<tahamul id="###">حدثنا</tahamul>
<rawi id=XYZ>أَبِي</rawi>
<tahamul id="###">حدثنا</tahamul>
<rawi id=XYZ>عُبَيْدُ اللَّهِ</rawi>
<tahamul id="###">قال حدثني</tahamul>
<rawi id=XYZ>نَافِعٌ</rawi>
<tahamul id="###">عن</tahamul>
<rawi id=XYZ>ابْنِ عُمَرَ رَضِيَ اللَّهُ عَنْهُمَا</rawi>
<tahamul id="###"/>
<prophetMuhammad/>
<phrasing>أَنَّ الْعَبَّاسَ رَضِيَ اللَّهُ عَنْهُ اسْتَأْذَنَ النَّبِيَّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ لِيَبِيتَ بِمَكَّةَ لَيَالِيَ مِنًى مِنْ أَجْلِ سِقَايَتِهِ فَأَذِنَ لَهُ</phrasing>
</branch>
تَابَعَهُ
<branch continuedAtAnchor="anchorID">
<theCompiler/>
<tahamul id="###"/>
<rawi id=XYZ>أَبُو أُسَامَةَ</rawi>
<tahamul id="###"/>
<!-- ..etc. ommited by compiler //-->
</branch>
<branch continuedAtAnchor="anchorID">
<theCompiler/>
<!-- some portion is ommited here //-->
<tahamul id="###"/>
<rawi id=XYZ>أَبُو أُسَامَةَ</rawi>
<tahamul id="###"/>
<!-- continue same as achorID //-->
</branch>
<branch continuedAtAnchor="anchorID">
<theCompiler/>
<!-- some portion is ommited here //-->
<tahamul id="###"/>
<rawi id=XYZ>وَعُقْبَةُ بْنُ خَالِدٍ</rawi>
<tahamul id="###"/>
<!-- continue same as achorID //-->
</branch>
<branch continuedAtAnchor="anchorID">
<theCompiler/>
<!-- some portion is ommited here //-->
<tahamul id="###"/>
<rawi id=XYZ>وَأَبُو ضَمْرَةَ</rawi>
<tahamul id="###"/>
<!-- continue same as achorID //-->
</branch>
</sanad>
حَدَّثَنَا مُسَدَّدٌ قَالَ حَدَّثَنَا إِسْمَاعِيلُ بْنُ إِبْرَاهِيمَ أَخْبَرَنَا أَبُو حَيَّانَ التَّيْمِيُّ عَنْ أَبِي زُرْعَةَ عَنْ أَبِي هُرَيْرَةَ قَالَ
كَانَ النَّبِيُّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ بَارِزًا يَوْمًا لِلنَّاسِ فَأَتَاهُ جِبْرِيلُ فَقَالَ مَا الْإِيمَانُ قَالَ الْإِيمَانُ أَنْ تُؤْمِنَ بِاللَّهِ وَمَلَائِكَتِهِ وَكُتُبِهِ وَبِلِقَائِهِ وَرُسُلِهِ وَتُؤْمِنَ بِالْبَعْثِ قَالَ مَا الْإِسْلَامُ قَالَ الْإِسْلَامُ أَنْ تَعْبُدَ اللَّهَ وَلَا تُشْرِكَ بِهِ شَيْئًا وَتُقِيمَ الصَّلَاةَ وَتُؤَدِّيَ الزَّكَاةَ الْمَفْرُوضَةَ وَتَصُومَ رَمَضَانَ قَالَ مَا الْإِحْسَانُ قَالَ أَنْ تَعْبُدَ اللَّهَ كَأَنَّكَ تَرَاهُ فَإِنْ لَمْ تَكُنْ تَرَاهُ فَإِنَّهُ يَرَاكَ قَالَ مَتَى السَّاعَةُ قَالَ مَا الْمَسْئُولُ عَنْهَا بِأَعْلَمَ مِنْ السَّائِلِ وَسَأُخْبِرُكَ عَنْ أَشْرَاطِهَا إِذَا وَلَدَتْ الْأَمَةُ رَبَّهَا وَإِذَا تَطَاوَلَ رُعَاةُ الْإِبِلِ الْبُهْمُ فِي الْبُنْيَانِ فِي خَمْسٍ لَا يَعْلَمُهُنَّ إِلَّا اللَّهُ ثُمَّ تَلَا النَّبِيُّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ
{ إِنَّ اللَّهَ عِنْدَهُ عِلْمُ السَّاعَةِ }
الْآيَةَ ثُمَّ أَدْبَرَ فَقَالَ رُدُّوهُ فَلَمْ يَرَوْا شَيْئًا فَقَالَ هَذَا جِبْرِيلُ جَاءَ يُعَلِّمُ النَّاسَ دِينَهُمْ
قَالَ أَبُو عَبْد اللَّهِ جَعَلَ ذَلِك كُلَّهُ مِنْ الْإِيمَانِ
من صحيح مسلم
حَدَّثَنَا يَحْيَى بْنُ يَحْيَى التَّمِيمِيُّ أَخْبَرَنَا أَبُو الْأَحْوَصِ ح و حَدَّثَنَا أَبُو بَكْرِ بْنُ أَبِي شَيْبَةَ حَدَّثَنَا أَبُو الْأَحْوَصِ عَنْ أَبِي إِسْحَقَ عَنْ مُوسَى بْنِ طَلْحَةَ عَنْ أَبِي أَيُّوبَ قَالَ جَاءَ رَجُلٌ إِلَى النَّبِيِّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ فَقَالَ دُلَّنِي عَلَى عَمَلٍ أَعْمَلُهُ يُدْنِينِي مِنْ الْجَنَّةِ وَيُبَاعِدُنِي مِنْ النَّارِ قَالَ تَعْبُدُ اللَّهَ لَا تُشْرِكُ بِهِ شَيْئًا وَتُقِيمُ الصَّلَاةَ وَتُؤْتِي الزَّكَاةَ وَتَصِلُ ذَا رَحِمِكَ فَلَمَّا أَدْبَرَ قَالَ رَسُولُ اللَّهِ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ إِنْ تَمَسَّكَ بِمَا أُمِرَ بِهِ دَخَلَ الْجَنَّةَ وَفِي رِوَايَةِ ابْنِ أَبِي شَيْبَةَ إِنْ تَمَسَّكَ بِهِ
في هذا المثال البسيط لاحظ وضع ح لتمثيل سلسلتي سند تتصلان عند أَبُو الْأَحْوَصِ
أي أن الرواية التي وصلت إلى الإمام مسلم كانت
مثال آخر من صحيح مسلم
حَدَّثَنِي أَبُو خَيْثَمَةَ زُهَيْرُ بْنُ حَرْبٍ حَدَّثَنَا وَكِيعٌ عَنْ كَهْمَسٍ عَنْ عَبْدِ اللَّهِ بْنِ بُرَيْدَةَ عَنْ يَحْيَى بْنِ يَعْمَرَ ح و حَدَّثَنَا عُبَيْدُ اللَّهِ بْنُ مُعَاذٍ الْعَنْبَرِيُّ وَهَذَا حَدِيثُهُ حَدَّثَنَا أَبِي حَدَّثَنَا كَهْمَسٌ عَنْ ابْنِ بُرَيْدَةَ عَنْ يَحْيَى بْنِ يَعْمَرَ قَالَ كَانَ أَوَّلَ مَنْ قَالَ فِي الْقَدَرِ بِالْبَصْرَةِ مَعْبَدٌ الْجُهَنِيُّ فَانْطَلَقْتُ أَنَا وَحُمَيْدُ بْنُ عَبْدِ الرَّحْمَنِ الْحِمْيَرِيُّ حَاجَّيْنِ أَوْ مُعْتَمِرَيْنِ فَقُلْنَا لَوْ لَقِينَا أَحَدًا مِنْ أَصْحَابِ رَسُولِ اللَّهِ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ فَسَأَلْنَاهُ عَمَّا يَقُولُ هَؤُلَاءِ فِي الْقَدَرِ فَوُفِّقَ لَنَا عَبْدُ اللَّهِ بْنُ عُمَرَ بْنِ الْخَطَّابِ دَاخِلًا الْمَسْجِدَ فَاكْتَنَفْتُهُ أَنَا وَصَاحِبِي أَحَدُنَا عَنْ يَمِينِهِ وَالْآخَرُ عَنْ شِمَالِهِ فَظَنَنْتُ أَنَّ صَاحِبِي سَيَكِلُ الْكَلَامَ إِلَيَّ فَقُلْتُ أَبَا عَبْدِ الرَّحْمَنِ إِنَّهُ قَدْ ظَهَرَ قِبَلَنَا نَاسٌ يَقْرَءُونَ الْقُرْآنَ وَيَتَقَفَّرُونَ الْعِلْمَ وَذَكَرَ مِنْ شَأْنِهِمْ وَأَنَّهُمْ يَزْعُمُونَ أَنْ لَا قَدَرَ وَأَنَّ الْأَمْرَ أُنُفٌ قَالَ فَإِذَا لَقِيتَ أُولَئِكَ فَأَخْبِرْهُمْ أَنِّي بَرِيءٌ مِنْهُمْ وَأَنَّهُمْ بُرَآءُ مِنِّي وَالَّذِي يَحْلِفُ بِهِ عَبْدُ اللَّهِ بْنُ عُمَرَ لَوْ أَنَّ لِأَحَدِهِمْ مِثْلَ أُحُدٍ ذَهَبًا فَأَنْفَقَهُ مَا قَبِلَ اللَّهُ مِنْهُ حَتَّى يُؤْمِنَ بِالْقَدَرِ
ثُمَّ قَالَ حَدَّثَنِي أَبِي عُمَرُ بْنُ الْخَطَّابِ قَالَ بَيْنَمَا نَحْنُ عِنْدَ رَسُولِ اللَّهِ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ ذَاتَ يَوْمٍ إِذْ طَلَعَ عَلَيْنَا رَجُلٌ شَدِيدُ بَيَاضِ الثِّيَابِ شَدِيدُ سَوَادِ الشَّعَرِ لَا يُرَى عَلَيْهِ أَثَرُ السَّفَرِ وَلَا يَعْرِفُهُ مِنَّا أَحَدٌ حَتَّى جَلَسَ إِلَى النَّبِيِّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ فَأَسْنَدَ رُكْبَتَيْهِ إِلَى رُكْبَتَيْهِ وَوَضَعَ كَفَّيْهِ عَلَى فَخِذَيْهِ وَقَالَ يَا مُحَمَّدُ أَخْبِرْنِي عَنْ الْإِسْلَامِ فَقَالَ رَسُولُ اللَّهِ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ الْإِسْلَامُ أَنْ تَشْهَدَ أَنْ لَا إِلَهَ إِلَّا اللَّهُ وَأَنَّ مُحَمَّدًا رَسُولُ اللَّهِ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ وَتُقِيمَ الصَّلَاةَ وَتُؤْتِيَ الزَّكَاةَ وَتَصُومَ رَمَضَانَ وَتَحُجَّ الْبَيْتَ إِنْ اسْتَطَعْتَ إِلَيْهِ سَبِيلًا قَالَ صَدَقْتَ قَالَ فَعَجِبْنَا لَهُ يَسْأَلُهُ وَيُصَدِّقُهُ قَالَ فَأَخْبِرْنِي عَنْ الْإِيمَانِ قَالَ أَنْ تُؤْمِنَ بِاللَّهِ وَمَلَائِكَتِهِ وَكُتُبِهِ وَرُسُلِهِ وَالْيَوْمِ الْآخِرِ وَتُؤْمِنَ بِالْقَدَرِ خَيْرِهِ وَشَرِّهِ قَالَ صَدَقْتَ قَالَ فَأَخْبِرْنِي عَنْ الْإِحْسَانِ قَالَ أَنْ تَعْبُدَ اللَّهَ كَأَنَّكَ تَرَاهُ فَإِنْ لَمْ تَكُنْ تَرَاهُ فَإِنَّهُ يَرَاكَ قَالَ فَأَخْبِرْنِي عَنْ السَّاعَةِ قَالَ مَا الْمَسْئُولُ عَنْهَا بِأَعْلَمَ مِنْ السَّائِلِ قَالَ فَأَخْبِرْنِي عَنْ أَمَارَتِهَا قَالَ أَنْ تَلِدَ الْأَمَةُ رَبَّتَهَا وَأَنْ تَرَى الْحُفَاةَ الْعُرَاةَ الْعَالَةَ رِعَاءَ الشَّاءِ يَتَطَاوَلُونَ فِي الْبُنْيَانِ قَالَ ثُمَّ انْطَلَقَ فَلَبِثْتُ مَلِيًّا ثُمَّ قَالَ لِي يَا عُمَرُ أَتَدْرِي مَنْ السَّائِلُ قُلْتُ اللَّهُ وَرَسُولُهُ أَعْلَمُ قَالَ فَإِنَّهُ جِبْرِيلُ أَتَاكُمْ يُعَلِّمُكُمْ دِينَكُمْ
حَدَّثَنِي مُحَمَّدُ بْنُ عُبَيْدٍ الْغُبَرِيُّ وَأَبُو كَامِلٍ الْجَحْدَرِيُّ وَأَحْمَدُ بْنُ عَبْدَةَ قَالُوا حَدَّثَنَا حَمَّادُ بْنُ زَيْدٍ عَنْ مَطَرٍ الْوَرَّاقِ عَنْ عَبْدِ اللَّهِ بْنِ بُرَيْدَةَ عَنْ يَحْيَى بْنِ يَعْمَرَ قَالَ لَمَّا تَكَلَّمَ مَعْبَدٌ بِمَا تَكَلَّمَ بِهِ فِي شَأْنِ الْقَدَرِ أَنْكَرْنَا ذَلِكَ قَالَ فَحَجَجْتُ أَنَا وَحُمَيْدُ بْنُ عَبْدِ الرَّحْمَنِ الْحِمْيَرِيُّ حَجَّةً وَسَاقُوا الْحَدِيثَ بِمَعْنَى حَدِيثِ كَهْمَسٍ وَإِسْنَادِهِ وَفِيهِ بَعْضُ زِيَادَةٍ وَنُقْصَانُ أَحْرُفٍ و حَدَّثَنِي مُحَمَّدُ بْنُ حَاتِمٍ حَدَّثَنَا يَحْيَى بْنُ سَعِيدٍ الْقَطَّانُ حَدَّثَنَا عُثْمَانُ بْنُ غِيَاثٍ حَدَّثَنَا عَبْدُ اللَّهِ بْنُ بُرَيْدَةَ عَنْ يَحْيَى بْنِ يَعْمَرَ وَحُمَيْدِ بْنِ عَبْدِ الرَّحْمَنِ قَالَا لَقِينَا عَبْدَ اللَّهِ بْنَ عُمَرَ فَذَكَرْنَا الْقَدَرَ وَمَا يَقُولُونَ فِيهِ فَاقْتَصَّ الْحَدِيثَ كَنَحْوِ حَدِيثِهِمْ عَنْ عُمَرَ رَضِيَ اللَّهُ عَنْهُ عَنْ النَّبِيِّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ وَفِيهِ شَيْءٌ مِنْ زِيَادَةٍ وَقَدْ نَقَصَ مِنْهُ شَيْئًا و حَدَّثَنِي حَجَّاجُ بْنُ الشَّاعِرِ حَدَّثَنَا يُونُسُ بْنُ مُحَمَّدٍ حَدَّثَنَا الْمُعْتَمِرُ عَنْ أَبِيهِ عَنْ يَحْيَى بْنِ يَعْمَرَ عَنْ ابْنِ عُمَرَ عَنْ عُمَرَ عَنْ النَّبِيِّ صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ بِنَحْوِ حَدِيثِهِمْ
جاء في مقدمة ابن الصلاح
حديث:من كذب علي متعمدا فليتبوأ مقعده من النار ” نراه مثالا لذلك، فإنه نقله من الصحابة رضى الله عنهم العدد الجم، وهو في الصحيحين مروي عن جماعة منهم ذكر أبو بكر البزار الحافظ الجليل في مسنده: أنه رواه عن رسول الله صلى الله عليه وسلم نحو من أربعين رجلا من الصحابة. وذكر بعض الحفاظ أنه رواه عنه صلى الله عليه وسلم اثنان وستون نفساً من الصحابة، وفيهم العشرة المشهود لهم بالجنة.
وهذا لأنه متواتر لذا يصل لكل هذا لكن هذه الطرق لا تجتمع في كتاب واحد أو في مكان واحد من الكتاب.
وعزو الحديث أو الأثر إلى من ذكره تدوينا بالإسناد يسمى تخريجا (أي العزو إلى المصادر الأصلي التي تروي الأحاديث بالإسناد)، فيصح أن يقال أخرجه البخاري، لأنه يذكر الحديث بالإسناد، لكن لا يصح أن يقال أخرجه الألباني في كتاب كذا وكذا لأنه لا يرويه بإسناده (أي إسناد الألباني) إلى النبي صلى الله عليه وسلم أو من روي عنه الأثر.
وقد ذكر السيوطي أسماء الصحابة الذي رووا هذا الحديث، قال رحمه الله (والخاص بهذا المتن رواية بضعة وسبعين صحابيا العشرة المشهود لهم بالجنة أسامة قا أنس بن مالك خ م أوس بن أوس طب البراء بن عازب طب بريدة عد جابر بن حابس مع جابر بن عبد الله م حذيفة بن أسد طب حذيفة بن اليمان طب خالد بن عرطفة حم رافع بن خديج طب زيد بن ارقم حم زيد بن ثابت خل السائب بن يزيد طب سعد بن المدحاس خل سفينة عد سليمان بن خالد الخزاعي قط سلمان الفارسي قط سلمة بن الأكوع خ صهيب بن سنان طب عبد الله بن أبي أوفى قا عبد الله بن زغب بع ابن الزبير قط ابن عباس طب ابن عمر حم بن عمرو خ ابن مسعود ت ن عتبة بن غزوان طب العرس بن عميرة طب عفان بن حبيب ك عقبة بن عامر حم عمار بن ياسر طب عمران بن حصين بن عمرو بن حريث طب عمرو بن عبسة طب عمرو بن عوف طب عمرو بن مزة الجهني طب قيس بن سعد بن عبادة حم كعب ابن قطبة خل معاذ بن جبل طب معاوية بن حيدة خل معاوية بن أبي سفيان حم المغيرة بن شعبة نع المنفع التيمي خل نبيط بن شريط طب واثلة بن الأسقع عد يزيد بن أسد قط يعلى بن مرة مي أبو أسامة طب أبو الحمراء طب أبو ذر قط أبو رمثة قط ابو سعيد الخدري حم أبو قتادة أبو قرصافة عد أبو كبشة الأنماري خل أبو موسى الأشعري طب أبو موسى الغافقي حم أبو ميمون الكردي طب أبو هريرة والدأبي العشراء الدارمي خل والدأبي مالك الأشجعي بز عائشة قط أم أيمن قط)
ورموز التخريج هذه يعرفها أصحاب الصنعة وهي أسماء الكتب
حم في مسنده لأحمد وطب للطبراني وقط للدارقطني وعد لابن عدي في الكامل وبز لمسند البزار وقا لابن قانع في معجمه وخل للحافظ يوسف بن خليل في كتابه الذي جمع فيه طرق هذا الحديث ونع لأبي نعيم ومي لمسند الدارمي وك لمستدرك الحاكم وت للترمذي ون للنسائي وخ م للبخاري ومسلم)
مع ملاحظة ما يلي:
تمييز نص الآيات مع ملاحظة أنه أحيانا تكتب آيات كاملة وأحيانا يكتب جزء منها كأن يقول “فقرأ {وما قدروا الله حق قدره} الآية” أو “فقرأ من قوله تعالى {حم تنزيل من الرحمن الرحيم} إلى {فقل انذرتكم صاعقة مثل صاعقة عاد وثمود}”
تمييز قول رسول الله صلى الله عليه وسلم عن قول من يحاوره
نأخذ أي من كتب الحديث مثل صحيح البخاري ثم نفترض أن نصف حجم الكتاب سند ونصفه متن ونفترض أن المتن كلام غير مرقوم
ونجمع أطوال أسماء الرواة في 3 صفحات من الأول ومثلها من الوسط ومثلها من آخر الكتاب ونكرر ذلك مع الصلة بين الرواة ثم نحسب النسبة بين هذه وتلك كأن نقول أن 60% من النص كان للرواة و40% كان للصلة بينهما ونحسب متوسط عدد الرواة.
ومن معرفة كل ذلك نستطيع توقع طريقة توزيع هرمية الكتاب على صفوف قاعدة البيانات ومنها نستطيع تقييم النموذج عبر بيانات وهمية مكررة للمتوسط.
يتبع لاحقا جمع تلك البيانات ومقارنتها في كل نموذج.
واختبار حجم وعبئ وسرعة كل نموذج
اختيار مجموعة من الكتب واستيرادها للنوذج المختار وتقييم النموذج
ثلاث جدول واحد nodesTable يمثل شجرة العقد ويحتوي
| nodeID | parentNodeID | siblingOrder | contents |
وآخر يحتوي قائمة بكل الراقمات tagsTable المخصصة
| tagID | tagType | tagName | comment |
وثالث nodeTags يربط كل عقدة بعدد من الراقمات
وقد لا نحتاج لحقل param
عملية استخراج الشجرة المرقومة بالكامل تتم بعملية left join
SELECT * FROM nodesTable LEFT OUTER JOIN nodeTags ON nodesTable.nodeID = nodeTags.nodeID;
استخراج جدول المحتويات (غير مرتب حتى هذه الخطوة) يكون
SELECT * FROM nodesTable LEFT OUTER JOIN nodeTags ON nodesTable.nodeID = nodeTags.nodeID WHERE nodeTags.tagID=0;
حيث أن القيمة صفر لمعرف الراقمة تعني أنها تعرف مدخلة في جدول المحتويات.
يمكن استخراج جذر كل عقد السند
SELECT * FROM nodesTable LEFT OUTER JOIN nodeTags ON nodesTable.nodeID = nodeTags.nodeID LEFT OUTER JOIN tagsTable on nodeTags.tagId=tagsTable.tagId WHERE tagsTable.tagName="Sanad";
القيام بالمزيد من العمليات يحتاج إلى استخدام حقل nodePath
يجوز أن يكون في البرنامج راقمات معرفة مسبقا (مثل مدخلة جدول المحتويات كالباب والفصل) وأخرى من تخصيص المحرر. يتم تمييز المعرفة مسبقا من معرفها غير الموجب
الوصول للمطلوب بأقل عدد من الإستعلامات بل يفضل أن يكون 1
التمثيل بجدول واحد أفضل من عدة جداول لأنه يوفر الوقت الذي تحتاجه عمليا الربط joining
قد يرغب محرر المحتوى برقم جزء من النص مما يعني تقسيم النص إلى ثلاثة عقد شقيقة ما قبل الجزء المحدد والجزء المراد رقمه وما بعده يمكن تلافي هذا عبر إضافة range إلى nodeTags لكن لكل حسنات وسيئات
يمكن إضافة حقل nodeType إلى nodesTable من أجل توفير بعض الراقمات
يمكن افتراض أن جدول المحتويات بالكامل موجود في الرام أي أن يتم تحميله عند فتح الكتاب
يمكن افتراض أن الوحدة الجوهرية (وهي أصغر وحدة يمكن أن يهتم المستخدم بعرضها دفعة واحدة) وكل ما هو داخلها موجود بالكامل داخل الذاكرة رام عند عرض تلك الوحدة
تكوين جدول المحتويات في الواجهة يحتاج للعناوين بترتيب العمق أولا depth-first لذا يجب أن يكون تركيب البيانات يسمح بذلك وهذا لا يعني عدم امكانية استخراج البيانات بأي ترتيب آخر مثل breadth-first
الترتيب في المكان in place sorting مكلف جدا
القوامة على مدخلة من عدد صحيح تحتوي رقم الترتيب تعني تحديث كل الجدول وهذا أيضا مكلف
القوامة على الترتيب المحلي (ترتيب الأشقاء ضمن نفس العمق) غير مكلف
الترتيب عبر مدخلة من نوع float غير مكلف لكن يجب الانتباه لل precision
كذلك يمكن الترتيب عبر مدخلة من نوع integer تبدأ بقفزة كبيرة مثلا 256 فإن كان أول مدخلة هي 0 والثانية هي 256 واحتجنا إلى واحدة في الوسط تكون 128 ويصبح حجم القفزة هو 128 بينهما فقط (ولن نحتاج إعادة الترقيم الشاملة إلا عند الوصول لحجم قفزة = 1)
يمكن فصل tagParam إلى strParam و intParam وعمل index على الأخير لأنه غالبا ما يكون عبارة عن معرفات.
يمكن تحديد سلوك الراقمة عبر tagType عبر bit field
| سلوك الراقمة عند العرض |
| 2 بت | معناها |
| 0 | 0 | راقمة تعرف عنصر غير مرئي كتعريف نقطة مرساة |
| 1 | 0 | الراقمة تعرف لبنة منفصلة block وقد تكون طافية |
| 0 | 1 | الراقمة تعرف عنصر سطري inline مندمج دون مسافات |
| 1 | 1 | الراقمة تعرف عنصر سطري inline معزول كأن يكون محاطا بمسافات |
| مصدر بياناتها |
| 2 بت | معناها |
| 0 | 0 | قيمة نصية |
| 1 | 0 | قيمة عددية صحيحة |
| 0 | 1 | جدول الوسائط داخل نفس قاعدة البيانات |
| 1 | 1 | ملف عبر URL كأن يكون ملف محلي أو عبر الشبكة |
يمكن إدراج حقل nodePath على شكل سلسلة نصية. ولتحسين سبل الوصول نقسهما إلى 20 حقل L1 L2 … L20 ونعمل فهرسة عليها
وهذا يجعلها محدودة حتى العمق 20. وبهذه الطريقة إن كنا نريد أن نستخرج سلسلة السند كلها المتعلقة بحديث ما نحتاج وكان جذر هذه السلسلة عند العقدة الفلانية نأخذ قيمة L1 L2 حتى آخر واحدة ليست null ونستعلم عنها
استخراج جدول المحتويات مرتب بطريقة depth first يكون
SELECT * FROM nodesTable LEFT OUTER JOIN nodeTags ON nodesTable.nodeID = nodeTags.nodeID WHERE nodeTags.tagID=0 ORDER by L1,L2,L3...;
ولا يوجد طريقة مباشر للترتيب بطريقة breadth-first لكن هذا كما قلنا غير ضروري.
محدودية العمق حتى 20 يجعلنا نضطر لتمثيل شجرة الرواة على شكل مجموعة من السلاسل كل راوي فيها يكون في عقدة شقيقة على نفس العمق لمن روى عنه وعنه وعنه …إلخ وليس شجرة وهو تمثيل مكافئ لكنه يزيد التعقيد على البرنامج ال front end في إعادة تكوين الشجرة.
في هذا النموذج نلغي nodePath بالمطلق ونضيف حقل جديد باسم level ليمثل عمق المسار
ونجعل الحقل siblingOrder عبارة عن nodeOrder
أي ترتيب العقدة الكامل بطريقة depth first
وأفضل الخيارات أن يكون حقلا من نوع Float
حيث نستطيع حشر المزيد من العقد عبر الوسط الحسابي دون الحاجة للمرور عليها مجددا.
وفي هذا النموذج لا يكون أمامنا أي حد للعمق لذا نمثل الروى على شكل شجرة فعليا.
هذا النموذج يحقق لنا محددات التصميم لكن لا يمكننا أن نعرف فيه مسار العقدة لصف ما باستعلام واحد لكن أوجه استخدام البرنامج لا تتطلب معرفة المسار إلا ضمن الوحدة الجوهرية التي تكون محملة كلها في الذاكرة بعد الحصول على نتيجة استعلام ما وهذا أمر يسير.
سرد العقد صفا صفا بترتيب العمق أولا depth first يكون عبر
SELECT * FROM nodesTable LEFT OUTER JOIN nodeTags ON nodesTable.nodeID = nodeTags.nodeID WHERE nodeTags.tagID=0 ORDER BY nodesTable.nodeOrder
أما طريقة breadth-first فتكون عبر
SELECT * FROM nodesTable LEFT OUTER JOIN nodeTags ON nodesTable.nodeID = nodeTags.nodeID WHERE nodeTags.tagID=0 ORDER BY nodesTable.level,nodesTable.nodeOrder
وبهذه الطريقة إن كنا نريد أن نستخرج شجرة السند كلها المتعلقة بحديث ما (وهنا لا نحدد الحديث بمسارع بل نبحث عن قيم X و Y التي يقع سند الحديث فيها)
SELECT * FROM nodesTable LEFT OUTER JOIN nodeTags ON nodesTable.nodeID = nodeTags.nodeID WHERE nodesTable.nodeOrder>X AND nodesTable.nodeOrder<Y ORDER BY nodesTable.nodeOrder
هذه نقاط ستم حذفها
البيانات داخل الوحدة الجوهرية تكون مرقومة marked up مثلا إن كان أصغر وحدة جوهرية في كتاب صحيح البخاري هو الحديث يمكن التمييز بين السند والمتن بل والرواة داخل المتن والعلاقة بينهم برقم النص
طريقة رقم النص لم تحدد بعد لكن يجوز أن تكون طريقة ثنائية binary format بشرط
أن تكون متعددة المنصات cross-platform أي تعمل على لينكس وويندز وغيرها
أن يكون لها مكافئ xml
أن يكون لها رابط على جافا وسي (وبالتالي بايثون)
أن تكون صيغة مدمجة compact أي لا تحتل حيز
أن تكون تكون سريعة وخفيفة
كذلك يجوز أن تكون طريقة الرقم عبر الصفوف في قاعدة بيانات sqlite
دراسة وضع المحتويات غير النصية (ملفات الوسائط والصور …) في جدول منفصل أو في صفوف من نوع خاص وعمل إحالها لها مقابل تنضيدها داخل النص عبر binary serialization for xml وأثر كل منهما في عمل diff أو في عملية caching أو streaming لها
الشاملة 3 وبالتالي ثواب 2 تستعمل عدة جداول منفصلة وما يزيد الامر سوءا أن الشاملة لم تلزم بعض الحقول بأن تكون فريدة.
سيكون هناك نماذج كل صف فيها هو وحدة جوهرية والبيانات داخلها تكون مرقومة بواسطة xml أو ما يؤدي الغرض منها
الطريقة الاخرى أن نستخدم الجدول في رقم النص بالكامل حيث لا تكون الوحدة الجوهرية في صف مستقل بل تكون كل راقمة tag للنص في صف ولا تحتوي صفوف الجدول أي راقمات.
أول ما خطر ببالي إلزام معرف لكل صف في الجدول بأن يكون فريدا وأن تنقل بعض المعلومات منه إلى جدول toc ولأنه فريد فإن عملية الربط joining ستكون سريعة
'book':"id INTEGER PRIMARY KEY, xml TEXT",
'toc': "id INTEGER PRIMARY KEY, title TEXT, level INTEGER"
عند التصدير لأي هيئة يتم زراعة كود xml بالطريقة التالية
<book>
<section id="$id" title="$title">
$xml
</section>
<section id="$id" title="$title">
$xml
<section id="$id" title="$title">
$xml
</section>
...
</section>
...
</book>
ويتم الاختيار بين زرع كود xml
داخل الفصل السابق أم تاليا له تبعا لقيمة level
فإن كانت نفس القيمة كانت تليها وإن كانت أكبر منها بواحد كانت داخلها
اقترح علي أخي المهندس كفاح أن يتم توحيد كل البيانات ما أمكن في جدول واحد حيث أن عملية الفهرسة للجدول تجعل زمن الوصول للبيانات ثابت O(1) إذا تم بطلب واحد 1) لكن الطرق الاخرى تحتاج عمليات join وعمل أكثر من query
لذا قمت بعمل محددات التصميم أعلاه التي يجب أن تؤخذ بعين الاعتبار عند وضع النموذج
وهذا مثال على النموذج
| معرف الصف nodeId | المسار nodePath | مستوى العمق level | معرف الصف للوالد parentId | العنوان title | البيانات data |
| 0 | 0 | 0 | 0 | عنوان الكتاب | الصف الأول خاص فهو جد للصفوف وهو يحتوي بيانات metadata الخاصة بالكتاب |
| 1 | 0-1 | 1 | 0 | باب الألوان الحارة | محتوايته |
| 2 | 0-2 | 1 | 0 | باب الألوان الباردة | محتوايته |
| 3 | 0-1-3 | 2 | 1 | فصل الأحمر | محتوايته |
| 4 | 0-1-4 | 2 | 1 | فصل الأصفر | محتوايته |
| 5 | 0-2-5 | 2 | 1 | فصل الأزرق | محتوايته |
| 6 | 0-2-6 | 2 | 1 | فصل البنفسجي | محتوايته |
من السهل ملاحظة كيف أن هذا النموذج يحقق لنا محددات التصميم
لتسريع عملية الوصول وتوفير الوقت لا نقوم بحفظ المسار nodePath على شكل نص بل على شكل عدة حقول l1 l2 l3 … l20
وهذا الرقم أكثر من كافي.
إن كنا نكتب كتابا بحتاج وضع علامة ما مثلا رقم الصفحة الورقية أو ربط صفحة بمعرف شرحها في كتاب آخر أو إن كانت الصفحة تفسيرا لآية …إلخ. كل هذا يمكن أن يكون عبر نص مرقوم داخل البيانات لكن إن كان البحث عنها مفيدا يمكن تخصيص حقل لها كأن يكون هناك حقل باسم nodeType يحدد هل الصف الحالي صف محتويات أم أنه يحتوي علامة …إلخ.
فإذا أردنا كل ما في “باب الألوان الباردة” نطلب l1=2 وإن كنا نريد كل ما تحت “فصل البنفسجي” نطلب l1=2 and l2=6
عمليات التعديل مثل إضافة “فصل البرتقالي” تجعل الصفوف غير منتظمة ولحل هذا يمكن استخدام واحد من بين:
يمكن إضافة حقل مفهرس جديد اسمه sortOrder من نوع FLOAT يوضع فيه الوسط الحسابي لقيمتيه في الصفين اللذان سيحشر بينهما. هذا التريب هو التريب وفق depth first. وحيث أنه حقل مفهرس لن يكون هناك ترتيب.
إضافة حقل مفهرس من نوع integer يحدد الترتيب داخل العمق الوحد فقط (عملية الحشر تحتاج ترتيب العناصر في ذاك العمق فقط)
أن يكون الرقم المكتوب في آخر المسار lN حيث N هي level ليس رقم الصف بل ترتيب الصف بين أشقائه.
في هذا النموذج نعتمد على الترتيب عبر sortOrder وليس nodePath
| nodeId | sortOrder | level | parentId | title | data |
| 0 | 1.0 | 0 | 0 | عنوان الكتاب | الصف الأول خاص فهو جد للصفوف وهو يحتوي بيانات metadata الخاصة بالكتاب |
| 1 | 2.0 | 1 | 0 | باب الألوان الحارة | محتوايته |
| 2 | 5.0 | 1 | 0 | باب الألوان الباردة | محتوايته |
| 3 | 3.0 | 2 | 1 | فصل الأحمر | محتوايته |
| 4 | 4.0 | 2 | 1 | فصل الأصفر | محتوايته |
| 5 | 6.0 | 2 | 1 | فصل الأزرق | محتوايته |
| 6 | 7.0 | 2 | 1 | فصل البنفسجي | محتوايته |
هذا النموذج يحقق لنا محددات التصميم لكن لا يمكننا أن نعرف فيه مسار العقدة لصف ما باستعلام واحد لكن أوجه استخدام البرنامج لا تتطلب معرفة المسار.
سرد العقد صفا صفا بترتيب العمق أولا depth first يكون عبر
ORDER BY sortOrder
أما طريقة breadth-first فتكون عبر
ORDER BY level,sortOrder
| nodeId | sortOrder | level | parentId | nodeType | strValue | intValue |
وهذا النموذج مثل الذي قبله لكن فيه لا تكون الوحدة الجوهرية (مثلا الحديث الواحد) في صف مستقل
بل تكون كل راقمة tag هي التي في صف مستقل فلا نحتاج لوضع أو استعمال binary serialization for xml
أي أننا سنستخدم sqlite كبديل عنها.
أما قيم nodeType فهي
العقدة الحالية هي الجد للوحدة الجوهرية وهي يجب أن تظهر في جدول المحتويات (في مثالنا ذاك يعني أن الحديث هو فروع هذه العقدة) وتكون StrValue هي العنوان الذي يظهر في جدول المحتويات
بيانات العقدة الحالية تعرف خاصية id لوالدها parent وذاك كي تستخدم في عمل إحالة له
بيانات العقدة الحالية معرف الآيات في كتب التفسير (السورة - الآية - عدد الآيات عبر عمل bit field وتوضع في intValue من أجل الفهرسة والترتيب)
بيانات العقدة الحالية رقم الصفحة في النسخة المطبوعة (يمكن استعمال أكثر من واحدة حيث يوضع في strValue معرف نصي للطبعة التي أخذ رقم الصفحة منها مثلا الطبعة الثانية من دار كذا - طبعا نكتفي بمعرف ويربط بالنص الكامل في مكان آخر)
…
دمج وسيط داخلي (صورة أو صوت …)
دمج وسيط خارجي
إحالة ulink
علاقة شرح ل (معرف uri للكتاب المشروح ورقم معرف الإحالة)
فقرة جديدة (هل نحتاج لها حيث لنا استخدام “سطر فارغ” داخل النص)
اقتباس على السطر
اقتباس في لبنة
كود على السطر
كود في لبنة
نص غير مرقوم يرث راقمة والده
حاشية أو تعليق (للمحقق مثلا) الرقم هنا هو معرف مجموعة الحواشي ويشير لصاحب الحاشية إن كان هناك أكثر من حاشية
متن الحديث
سند الحديث
سلسلة رواية
راو في سلسلة الرواية (الرقم هو المعرف والنص هو الاسم حرفيا كما في الكتاب)
رابط بين راويين (حدثني أو أخبرني … مع معرفها والمعرف 0 يعني أخرى)
الراقمات يجب أن توضح وظيفة النص الذي ترقمه لا مظهره مثلا لا نقول هذا ثغين وهذا مائل … بل نقول هذا مصطلح وهذا تعريفه …إلخ.
الراقمات المعرفة يجب أن ترث أحد الصفات التالية.
سطرية inline
لبِنات block
مثلا “السند” و “المتن” راقمات سطرية في الحديث الذي هو لبنة.
البرامج التي تعرض النص المرقوم تحاول تمثيل الجزء المرقوم عبر في شجرة هرمية لسمات الراقمات مثلا إن لم يكن هناك مظهل معرف للسند فإنه سيظهر كنص عادي داخل الفقرة.
أما الفائدة الكبرى من الراقمات فهي من أجل البحث إذ يفترض في محرك البحث أن يفهم النص المرقوم ويسهل البحث فيه كأن تبحث في السند دون المتن.
كذلك يفيد في عمل خلاصات وترقيم تلقائي للنص المرقوم كأن يتم توليد جدول بكل الأمثلة المحلولة في الباب من كتاب فيزياء مثلا.
دراسة طرق بديلة ل xml ما يهما بشكل أساسي هو عملية Serialization لعدة أسباب منها
ملاحظات على كل منها
حزم ASN1 متوفرة في مستودعات فيدورا وأوبنتو
لا يوجد أي حزمة متعلقة ب hessian لا في فيدورا ولا في أوبنتو
حزم protobuf متوفرة في فيدورا وأوبنتو
كتب للاطلاع
ومن الاخيرة أقتبس
فأولها: صحيح أخرجه البخاري ومسلم جميعأ.
الثاني: صحيح انفرد به البخاري، أي عن مسلم.
الثالث: صحيح انفرد به مسلم، أي عن البخاري.
الرابع: صحيح على شرطهما، لم يخرجاه.
الخامس: صحيح على شرط البخاري، لم يخرجه.
السادس: صحيح على شرط مسلم، لم يخرجه.
السابع: صحيح عند غيرها، وليس على شرط واحد منها.
نقاش
هل ستكون ثواب3 مجرد عارض ملفات مثل سابقتها أم سيتوفر دعم لقواعد البيانات و لو كانت خاصة بثواب نفسه.
يرجى تزويدنا بالمكتبة أولاً بأول، ويفضل تطويرها باستخدام cvs أو svn حتى يتسنى للجميع المشاركة في التطوير.
بما أنني لست مبرمجا، فالكلام السابق صعب علي :)
أحب أن أنبه إلى نقطة أراها مهمة :
بما أن ثواب3 ستكون إن شاء الله الانطلاقة الحقيقية للموسوعة، أرى وضع الأساس البرمجي لإمكانية الربط بين الكتب وطبعا العرض بناء على الربط.
فمثلا الشاملة نجحت في الربط بين التفاسير، وهذا أظنه سيكون أيضا موجودا في ثواب 3
أريدكم أن تضعوا أيضا الأساس البرمجي للربط بين الأحاديث والسند. وأوضح الحاجة هنا حتى تتضح لكم الفكرة، والعمل عليها.
فأبتدئ بالكتب الستة لأنها أكثر كتب السنة قد خدمت.
فالأحاديث في الكتب السنة يحتوي على السند ، والذين هم الرواة.
وقد قام عبد الغني المقدسي المتوفى سنة 600 بترجمة جميع الرواة الذين وورد ذكرهم في الكتب الستة. في كتاب سماه الكمال في أسماء الرجال
قام الحافظ المزي رحمه الله المتوفي سنة 742 بتهذيب هذا الكتاب وسماه تهذيب الكمال ، وأضاف فوائد واستدرك مافات على المقدسي.
جاء ابن حجر وهذب التهذيب ، وسماه تهذيب التهذيب وأصبح حجمه ثلث سابقه.
ثم اختصره ابن حجر في تقريب التهذيب، واقتصر على اسم الراوي ونسبه واقتصر على كلمة واحدة في توثيقه أو تجريحه، …
الحاجة ، هنا في ربط اسم كل رواي بترجمته في الكتب السابقة. لأن الكتب السابقة لا يغني كتاب عن كتاب. والمتخصص يحتاج للقراءة في كلها.
وهنا أمر آخر ، وهو أن الراوي كثيرا ما يرد مبهما في السند، فيأتي مثلا هكذا ، عن مسروق عن عبد الله. أو فلان عن محمد.
فيحتاج إلى تبيين المبهم ، والكتاب الذي يبن هذا هو كتاب تحفة الأشراف للمزي . حيث كتب رحمه الله موسوعة بأسانيد الكتب السنة، فيذكر الرواي والراوي عنه وكذا من روى عنه إلى آخر السند، وثم يذكر الأحاديث التي وردت بنفس الأسناد في الكتب الستة.
فهنا تظهر حاجة ربط الأسانيد في الكتب الستة بموضع وروده في تحفة الأشراف،
فإذا تم الربط، سيصل القارئ إلى مراده بسرعة، فيضغط على الإسناد، لينقله إلى التحفة، ومن هناك يضغط على الرواي لينقله إلى الكمال أو تهذيب الكمال أو تهذيب التهذيب، أو التقريب حسب اختياره.
وايضا إذا تم الربط فإن البرنامج يستطيع أن يخرج النتائج، فمثلا عند الإشارة على اسم الراوي في السند، يخبره البرنامج برأي ابن حجر في هذا الراوي، طبعا البرنامج يأخذه من التقريب. وهكذا.
طبعا أنا لا أقصد هنا أن تدخلوا هذه الكتب في البرنامج، وإنما وضع الإمكانية البرمجية، بحيث يستطيع طلبة العلم إدخالها بسهولة.
الكمال في أسماء الرجال، مفقود وغير مطبوع، ويقال أن هناك من عثر على نسخ خطية منه
أفكار جميلة جدا
وهي إن شاء الله في الحسبان
فضلا وضح لي ما يلي
هل جميع حالات الراوي المبهم في الكتب الستة وردت يقينا في كتاب تحفة الأشراف للمزي أقصد إن كان الراوي المبهم هو زيد فهل هناك حالة (واحدة أو أكثر) يذكر فيها الكتاب أن هذا الزيد يحتمل أن يكون زيد الفلاني أم زيد العلاني دون أن يستطيع أن يحدد أيهما يقينا
وإن كان كذلك هل هناك حالات لا يستطيع أن يحدد فيقول هو زيد الفلاني أو العلاني أو لعله زيد آخر (دون أن يعينه).
وبماذا تختلف هذه الحالة الأخيرة عن الحديث المعضل الذي سقط منه راوي أو راويين.
بسيطة نجعل الربط يكون ديناميا بحيث يمكن الإضافة عند توفره
جميع رواة الكتب الستة تم ذكرهم يقينا في كتاب تحفة الأشراف، فهذا الكتاب مثل الفهرس للأحاديث عن طريق الأسانيد. يعني يذكر أولا اسم الصحابي ، وثم الراوي عنه سواء كان صحابيا أو تابيعا، وثم راوي عنه ، حتى نهاية السند، وبعد ذلك يذكر الأحاديث التي وردت بهذا الإسناد في الكتب الستة، وطبعا ينبه إن كان هناك اختلاف في التحمل وغير ذلك .
“هل جميع حالات الراوي المبهم في الكتب الستة وردت يقينا في كتاب تحفة الأشراف للمزي أقصد إن كان الراوي المبهم هو زيد فهل هناك حالة (واحدة أو أكثر) يذكر فيها الكتاب أن هذا الزيد يحتمل أن يكون زيد الفلاني أم زيد العلاني دون أن يستطيع أن يحدد أيهما يقينا”
لا يوجد في الكتب الستة، (لأكون أدق : لم يمر علي، وحتى لو وجد فقليل جدا أشبعها العلماء بحثا في شروح الأحاديث أو في كتب التراجم)
وللفائدة : الأصل في معرفة المبهم والمتشابه (أكثر من شخص يشترك في الاسم واسم الأب فيشتبه على القارئ) القواعد التي وضعها العلماء، فمثلا إذا قال مسروق : عن عبد الله مبهما ، فهو عبد الله ابن مسعود، وإذا قال نافع : عن عبد الله مبهما فهو عبد الله ابن عمر، وإذا قال البخاري محمد وكان من طبقة شيوخه فهو محمد الذهلي، وهكذا.
لكن الإشكال فيه أن هذا لا يعرفه إلا المتخصص ، وأنعم الله على أمة الإسلام بأن عثر بعض الإخوة مخطوطة كتاب المزي (تحفة الأشراف) وحققه وطبعه فحصل بذلك خير وبركة، فأصبح غير المتخصص يصل إلى معرفة الرواي بهذا الكتاب.
وللفائدة أيضا : هناك كتب متخصصة ألفت فقط لبيان المبهم والمتشابه، لكن جلها مفقود، وأسأل الله أن يقيظ لأمة الإسلام من يقوم بالبحث عنها وإخراجها للناس.
الحديث المعضل ضعيف لانقطاع الإسناد وسقوط الرواة من السند. لكن الحدث الذي فيه رجل مبهم أو المتشابه، حديث متصل وقد يكون من أصح الأحاديث، لكن القارئ لا يعرف الراوي للإبهام ، وحتى يستطيع الحكم على الحديث لابد أن يعرف الرواي ودرجته وعلى هذا فقد يكون الحديث صحيحا أو ضعيفا حسب ثقة الراوي.
عفوا تذكرت ، فعلا لا يوجد في الكتب الستة من لا يعرف بسبب الإبهام.
فقد سألت الشيخ محمد علي آدم قبل مدة عن برنامج حرف في الحديث (موسوعة الكتب التسعة) فهذا البرنامج يعطيك اسم الراوي إذا أشرت إليه (طبعا جميع الرواة حتى المبهم) فسألت الشيخ عن البرناج هل هو دقيق في تحديد الراوي المبهم، فقال لي : نعم وعملهم متقن جدا (أي شركة حرف) وقال لم يخطؤا في تحديد الراوي إلا في موضع واحد نبهت عليه في شرح سنن النسائي، وسبب عدم خطئهم هو اعتمادهم على تحفة الأشراف.
وعلى فكرة ، شرح النسائي للشيخ محمد علي آدم الأثيوبي يقع في أربعين جزء طبع في عشرين مجلدا
شكرا على المعلومات القيمة
رغم انى لم أجرب ثواب 2 حتى الآن بسبب بعدى عن جهازى وبالتالى لا أدرى الإختلاف الآخر الذى حدث غير أنها تفتح كتب الشاملة بسهولة الآن
ولكنى سأذكر الأشياء التى فى المكتبة الشاملة و لم تكن موجودة فى ثواب 1 وكنت أود أن أراها :-
1- ميزة البحث عن الراوى: فى المكتبة الشاملة تؤشر على الراوى بالفأرة ثم تضغط على زر فى الأعلى ليبين حالة الراوى من الجرح والتعديل .
2- ميزة البحث فى عدة كتب مجتمعة.
هذا ما أود أن أراه فى ثواب الإصدارة القادمة حين أعود إن شاء الله
وفقكم الله
هذه الامور لم تكن ضمن الأهداف عند تصميم ثواب 1 أو 2
نعمل على ذلك إن شاء الله
في ثواب 3
سؤال لأخي حسن نور ولغيره من طلبة العلم
يقول ابن الصلاح
فهل هناك كتاب جمع كل هذه الطرق الأربعين أو الستين أو الكثير منها ؟ إن كان نعم فإني أريد إحالة على ذاك الكتاب
عفوا
أنا أرسلت رسالة، فإن لم تصل، أخبرني، فإنني لم أنتبه لهذا إلا الآن بعد إرسال الرد على الرسالة التي وصلتني على البريد.
وصلت أخي شكرا لك
السلام عليكم، ما الداعي للراقمة: <theCompiler/>
في مثالنا هي تعني بخاري
السلام عليكم،
نعم اخي كلمة compiler تعني المصنف عندما يقول البخاري حدثنا فلان أي حدث فلانٌ الإمام البخاري
السلام عليكم،
http://en.wikipedia.org/wiki/GEDCOM
هذا يعني اننا سنعيد كتابة الكتب بصيغة ثواب 3 في ملفات XML وهل ثواب 3 مقتصر على كتب الحديث؟ هل تم الانتهاء من صيغة الملفات اماذا ؟
ثواب 3 ليس xml بل يكافئها في القوة فقط (ال xml للتوضيح)
وليس مقتصر على كتب الحديث لكني سألت عن أي الكتب أكثر تشابكا فيما بينها وأكثر حاجة للعناية والتعقيد
تقريبا لدينا صيغة تعمل الآن لكنها ستختلف قليلا عن النهائية
… هل الصيغة الموجودة موثقه ؟ اب هل استطيع استخدامها لتصدير كتب بهذه الصيغة …
ماذا عن الكتب الفقه التي تحتوي على أدلة من القرآن و الحديث … هل هناك لاحقة تعتني بهم ؟
و منذ زمن وانا احب ان اشارك في المشاريع … فقد قمت بالتسجيل بهذا الموقع … ياليت القى نصيبي من العمل …
السلام عليكم انا مبرمج بايثون اريد المساعدة في المشروع
شكرا لكم. كود ثواب 3 موجود على البوتقة
http://git.ojuba.org/
أي اقتراحات نستقبلها على بريدنا thawab على ojuba.org