خطة جيدة لهذا المساء، بدل 200 خيار
خريطة مجانية لما يجري في باريس هذا المساء، مرتّبة حسب الثقافة والفئة، صُمّمت لتساعد على الاختيار لا لتُغرق بالخيارات.
الحاجة
بعد أسبوع مزدحم، يرغب الناس في الخروج، لكن تصفّح مئات الفعاليات مُرهق. وكثرة الخيارات تنتهي غالبًا بالبقاء في المنزل.
الفكرة
المشكلة ليست قلة الخيارات بل كثرتها. لذلك ينطلق التطبيق من سؤال واحد بسيط: ماذا يمكنني أن أفعل هذا المساء بالقرب مني؟ بدل أن يُفتح على قائمة طويلة.
ما الذي بنيته
- موقع يُفتح مباشرة على فعاليات هذا المساء فوق خريطة، ومصمّم للهاتف أولًا.
- أداة جمع تلقائية تجمع الفعاليات من البيانات المفتوحة لبلدية باريس ومن المعاهد الثقافية الأجنبية في باريس (FICEP) ومن تدفقات عامة أخرى، وتُحدّث كل مصدر وفق إيقاعه الخاص.
- تصفّح حسب ثقافة المنشأ وحسب الفئة، لتتبع ما يناسب مزاجك.
- شبكات أمان: إذا تعطّل أحد المصادر، تبقى آخر البيانات السليمة معروضة، وتُظهر صفحة الحالة «أداء متراجع» بدل أن تتوقف.
النتيجة
- 27,623فعالية في قاعدة البيانات (قيست في 6 أكتوبر 2026)
- 0فعالية بلا موقع على الخريطة
- 4مصادر بيانات مفتوحة وتدفقات أماكن تُدمج تلقائيًا (قيست في 6 أكتوبر 2026)
متاحة على eventmap.hamdy-tabsissi.com منذ 23 أغسطس 2026. كل فعالية في قاعدة البيانات موضوعة على الخريطة، والبيانات تتحدّث من تلقاء نفسها.
بالصور
ما الذي تعلّمته
اختبر البيانات قبل تصميم المنتج: أظهر فحص سريع للمصدر صفر فعاليات في نانتير وأربع عشرة في مونتروي، فحصرتُ النطاق في باريس بدل صيانة أدوات جمع هشّة. والأعطال الصامتة أكثر كلفة من التوقف: تواريخ قورنت كنصوص كانت تُخفي فعاليات بصمت، إلى أن كشفتها الاختبارات.
التفاصيل التقنية التقنيات والبنية والقرارات، للقرّاء التقنيين
التقنيات المستخدمة
- Python (FastAPI, asyncio)
- SQLite
- Leaflet + OpenStreetMap
- nginx
- systemd
- Ubuntu 22.04
البنية في لمحة
- هاتف الزائر أو متصفحه
- nginx — وكيل عكسي، وترويسات أمان
- تطبيق FastAPI يعمل بـ uvicorn — خدمة systemd مقيّدة بـ 127.0.0.1، مع حصص للمعالج والذاكرة
- SQLite — الفعاليات، والمصادر، وإزالة التكرار
- جمع تلقائي كل 6 ساعات → البيانات المفتوحة لبلدية باريس + FICEP (OpenAgenda)
كيف يعمل
- استيعاب غير متزامن (asyncio) لعدة تدفقات مفتوحة — منها Que faire à Paris (بلدية باريس، ترخيص ODbL) وFICEP وOpenAgenda (.ics) — في SQLite، مع إزالة التكرار. قائمة المصادر العاملة متاحة في /health.
- تحديث مصدرًا بمصدر يتحمّل الأعطال: المصدر المتعطّل لا يمحو البيانات الموجودة أبدًا، ويعرض /health حالة كل مصدر وينتقل إلى «degraded».
- تقليص النطاق من نانتير–باريس–مونتروي إلى باريس بعد تدقيق 13 موقعًا في الضواحي لم يقدّم أيٌّ منها تدفقًا صالحًا (لا .ics ولا JSON-LD Event). وتبقى البنية متعددة المصادر جاهزة.
- خدمة معزولة: مستخدم نظام مخصّص بلا صدفة أوامر، وحصص معالج وذاكرة عبر systemd، وتطبيق مقيّد بـ 127.0.0.1 خلف nginx.
- خلل اكتُشف أثناء الاختبار: تواريخ قورنت كسلاسل نصية، فاستُبعدت فعاليات بصمت في بيئة الإنتاج؛ صُحّح ووُثّق.
المشكلات وحلولها
- من 24 سبتمبر إلى 5 أكتوبر 2026، تعذّر على الخادم الوصول إلى تدفق بيانات بلدية باريس (خطأ DNS): واصل EventMap تقديم آخر البيانات السليمة، وكان /health يُبلغ عن حالة «degraded» مع تسمية المصدر. وعند عودة التدفق، كان قيدٌ في قاعدة البيانات (نسخة مكررة تشير إلى سجل قيد الحذف) يُفشل كل تحديث بصمت، بينما يعرض /health حالة «ok» خطأً. أعدتُ إنتاج المشكلة محليًا وأصلحتها وغطّيتها باختبارين وأعدتُ النشر في اليوم نفسه: تم تحديث 16,160 فعالية.
ما لا يزال ناقصًا
- باريس فقط
- تعتمد على جودة تدفقات البيانات العامة المفتوحة