أرشيف 17 عاماً بسبع صيغ في مدونة نصية واحدة قابلة للاستعلام
كل منصة ستصدّر لك بياناتك. لن تعطيك أي منها البيانات بشكل يمكنك استخدامه فعلاً، واثنتان منها ستتلفانها في الطريق دون أن تخبراك.
مشروع شخصي · Python وSQLite · 2026
السياق
قواعد نقل البيانات تتيح لك طلب نسخة من بياناتك من أي منصة تقريباً. ما يصلك سبع إجابات مختلفة عن السؤال نفسه: مجلد من الملفات النصية العادية، وعدة أنواع من JSON بمخططات غير متوافقة، وأرشيف بريد بصيغة صُممت في الثمانينيات. لكل منها تعريفه الخاص للطابع الزمني، وللمحادثة، وللمشارك.
أردت أن أستعلم في أرشيفي كشيء واحد بدل سبعة. البيانات كلها بياناتي، ولا تغادر جهازي، والمخرجات تبقى خاصة. لذلك الجزء المثير في هذا المشروع، والجزء الوحيد الموصوف هنا، هو خط معالجة البيانات (pipeline).
ما الذي بنيته
- محلل (parser) لكل صيغة مصدر، وكلها توحّد البيانات في مخطط رسائل واحد: صادرات محادثات بنص عادي، ولهجتان مختلفتان من JSON لمنصتين، وأرشيفات بريد mbox، وأرشيف منصة تواصل اجتماعي ببنية خاصة أخرى.
- نحو 40 برنامجاً صغيراً بلغة Python بدل برنامج واحد كبير، كل منها يجيب عن سؤال واحد ويمكن إعادة تشغيله وحده، فلا يفرض خطأ في تحليل واحد إعادة إدخال البيانات كلها.
- تقسيم للتخزين حسب نمط الوصول: JSON مفصول بأسطر (newline-delimited JSON) للمدونات النصية (corpora) التي تُقرأ تدفقاً وتُصفّى، وقاعدة بيانات SQLite لأرشيف البريد، حيث جعلت فهرسة المرفقات وعمليات الربط (joins) الاستعلامات هي التكلفة الأكبر.
- ربط العلاقات عبر المنصات، وهذا هو الجزء الصعب فعلاً: الشخص نفسه يظهر باسم عرض هنا، وبرقم هاتف هناك، وبعنوان بريد إلكتروني في مكان ثالث، دون أي مفتاح مشترك في أي مكان.
- دليل تشغيل (runbook) مكتوب لشخص غريب: ترتيب إدخال البيانات، وما يستهلكه كل سكربت وما ينتجه، والمزالق، وما العمل عند وصول صادرات جديدة. كتبته لأنني عانيت من خط معالجة كان توثيقه الوحيد هو الشخص الذي كتبه.
موحّدة في مدونة نصية واحدة قابلة للاستعلام، ومعها أكثر من 3,500 مرفق بريد مفهرس وقابل للبحث.
الخلل الذي يستحق التدوين
إحدى المنصات تقدم محتوى بترميز UTF-8 وتصفه بأنه Latin-1. حلّل الملف كما يصف نفسه، فتنجو كل الحروف اللاتينية: يبدو الاستيراد ناجحاً، وأعداد الرسائل صحيحة، ولا يظهر أي خطأ. وكل حرف عربي يُستبدل بصمت برموز مشوهة (mojibake).
نحو نصف أرشيفي بالعربية. لو مر هذا دون انتباه، لتلف نصف المدونة بهدوء بينما يُبلغ النظام عن إدخال سليم، ولحُسب كل تحليل لاحق على النصف الناجي دون أن يقول ذلك. الإصلاح ثلاثة أسطر. أما العثور عليه فتطلب ألا أثق بتشغيل يبدو ناجحاً. وهذا نمط الفشل نفسه الذي صرت أبني له بوابات تحقق في كل مشروع.
تدقيق استنتاجاتي
بعد اكتمال المدونة، صار من السهل استخراج نتائج تبدو واثقة منها. لذلك أجريت عن قصد مراجعة ثانية مهمتها الوحيدة مهاجمة الأولى: الطعن في المنهج، وتسمية ما لا تدعمه البيانات، والفصل بين ما قيس وما استُنتج. أجبرتني هذه المراجعة على سحب استنتاج كنت متعلقاً به إلى حد ما.
مجموعة بيانات كبيرة بما يكفي لتكون مثيرة للاهتمام كبيرة بما يكفي لتؤكد أي شيء تقريباً تدخل وأنت مقتنع به. النسخة الوحيدة التي أثق بها أن أبني المراجعة المضادة كمُخرَج مستقل من مخرجات المشروع، ولا أعتمد على صرامتي في اللحظة.
أين ينفع هذا
دمج بيانات فوضوية من مصادر متعددة في مخزن واحد قابل للاستخدام جزء كبير من عمل العمليات والتحليلات الحقيقي: أنظمة تختلف على المعرّفات، وصادرات فيها غرائب غير موثقة، وخطر دائم من ترحيل يبدو ناجحاً بينما يُسقط فئة من السجلات لم يصادف أن فحصها أحد. نفذت ذلك الآن من أوله إلى آخره، بما في ذلك الجزء الذي كان فيه الترميز خاطئاً ولم يشتكِ شيء.