factcircuit
FactCircuit는 불변 출처와 단계별 검증, 제한된 검색, 재현 가능한 평가를 제공하는 감사 가능한 주장·증거 검증 루프입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기مسح السايت — أداة ميدانية لتحليل موقع الرصافة القديمة (بين جسر الشهداء وجسر الأحرار)
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
أداة ميدانية لتحليل الموقع بين جسر الشهداء وجسر الأحرار (بغداد): توثيق المباني والدرابين والمسارات بالـ GPS والصور، مع طبقة مباني الحفاظ.README 전문 보기 ↗
أداة ميدانية لتحليل الموقع بين جسر الشهداء وجسر الأحرار (بغداد): توثيق المباني والدرابين والمسارات بالـ GPS والصور، مع طبقة مباني الحفاظ.
index.html, app.js, app.css — التطبيق (Leaflet + Geoman + Turf + JSZip، بدون build)data/heritage.geojson, data/buildings.geojson — كل مبنى بحدوده من رسم المخطط (138 مبنى حفاظ + 868 مبنى، الحوش فراغ داخلي)data/streets.geojson — شبكة الشوارع والدرابين: مساحة الشارع + محاور بالعرض والنوع والاسم (من OSM)tools/vectorize_plan.py — يولّد الطبقات أعلاه من data/plan.webp، والإسقاط الجغرافي من tools/fit.json (معايرة على بصمات المباني والصورة الجوية). نتيجة الفحص: tools/check_vectorize.pngdata/cad_*.geojson, data/context_buildings.geojson — من ملف CADMapper (DXF): مباني المحيط بارتفاعاتها، حواف الشوارع، النهر، الكنتور. التحويل tools/dxf_to_geojson.py (كتبه gpt-6-astra عبر Codex)، والإسقاط tools/cad_georef.json (مطابقة 91% مع مباني OSM)، والدمج tools/attach_cad.py. ارتفاع 3.0 م بملف CADMapper قيمة افتراضية = غير معروف.data/plan.webp + plan_corners.json — المخطط الأصلي كطبقة فوق الصورة الجويةdata/landmarks.geojson — معالم من OpenStreetMap (ODbL)البيانات الميدانية تنحفظ على جهاز كل شخص (IndexedDB) وتتزامن تلقائياً مع سحابة الفريق. ملفات ZIP للتصدير الاحتياطي ونقل البيانات عند الحاجة، وليست مطلوبة حتى تظهر الصور على جهاز ثانٍ.
ترتيب توليد البيانات: vectorize_plan.py ← dxf_to_geojson.py ← attach_cad.py ← enrich_buildings.py ← heritage_points.py ← pack_data.py ← build_places.py tools/places_osm.json tools/places_kb.json tools/places_extra.json (يطلّع ملفات data/*.json المضغوطة اللي يقراها الموقع). بعد أي تغيير بالبيانات أو الكود ارفع الرقم VERSION بـ sw.js و DATA_VERSION بـ app.js و ?v= بـ index.html.
الأداء والكاش: Service Worker يخزّن الموقع والبيانات والمكتبات (يفتح فوراً ويشتغل بدون نت، ويتحدّث بالخلفية)، وصور القمر الصناعي تنخزن لحد 4000 مربع.
تفاصيل المباني والأماكن: enrich_buildings.py يعطي كل مبنى: الاسم/الصنف من OSM إن وجد، الشارع اللي يطل عليه وعرضه، أقرب معلم، رقم البلوك، المحيط. data/places.json = 122 مكان (مواقع OSM) + وصف تاريخي وعلاقة بالسايت من tools/places_kb.json (كتبه gpt-6-astra، مع تصحيحات موثّقة بحقل corrections) + 7 محاور ربط ومثلث المتنبي. أوصاف الأماكن غير مدققة بالكامل — راجعوها قبل التقرير.
الوضعين:
data/heritage_points.json، نقطة لكل مجموعة مباني حفاظ ملتصقة، بدون حدود) + اللي يرسمه ويصوّره الفريق. حدود المبنى ترسم بالموقع من بطاقة النقطة («ارسم حدود المبنى») وتنحفظ كمضلع رصد مرتبط بالنقطة.الصور: تنحفظ بالتلفون نفسه (IndexedDB)، وترتفع تلقائياً إلى Google Drive بجودة أصلية أو مضغوطة حسب اختيار الراصد. المعاينات المصغّرة تنتقل أولاً حتى تظهر الصور بسرعة على بقية الأجهزة. واجهة الموقع ملفات ثابتة على GitHub Pages؛ «المزيد» يبين عدد الصور، المساحة، وحالة المزامنة.
مواقع الفريق (👥): كل واحد يختار يشارك موقعه. المواقع تنتقل عبر خوادم MQTT عامة مجانية (shiftr.io على 443، test.mosquitto.org، EMQX، HiveMQ — يتصل بالكل سوا حتى إذا شبكة سدّت منفذ يشتغل غيره) ومشفّرة من التلفون للتلفون (AES-GCM بمفتاح مشتق من كود السايت الثابت، PBKDF2). ماكو كروبات ولا أكواد ولا روابط انضمام: كل واحد يفتح الموقع يكون ويه الفريق ويشوف صور السايت كلها ويضيف ويحذف. سكربت Google يحمل نسخة احتياطية من المواقع (بالذاكرة المؤقتة، بدون قفل) إذا وكعت الخوادم العامة. الخادم ما يشوف غير topic مشفّر ونص مشفّر. لمن توقف المشاركة ينمسح موقعك من الخوادم، ولو انقطع التلفون فجأة الفريق يشوف «انقطع». المشاركة تشتغل والتطبيق مفتوح بس (قيود المتصفح).
المزامنة السحابية (☁️ Google Drive): cloud/Code.gs سكربت Google Apps Script ينحط بحساب Google مالك (مجاني) وينشر كـ Web app. الصور تنرفع لمجلد «مسح السايت» بـ Drive (كل مبنى بمجلد) والسجلات لجدول Google Sheets، وكل تلفون يسحب شغل الباقين (الأحدث يغلب، والحذف ينتقل). السكربت مفتوح للموقع (OPEN_ACCESS)، والتطبيق يستعمل سحابة السايت بس (TEAM_CLOUD_URL). الصور ما تنقرا إلا عبر السكربت. السعة = مساحة Drive حساب صاحب السكربت. الصور تنضغط قبل الرفع (WebP 1600px ≈ 0.2–0.4 MB بدل 3–5 MB).
المزامنة التلقائية: كل حفظ أو استيراد (ZIP/GeoJSON) يتزامن بنفسه، بدون زر. كل مزامنة تبدي بالأشياء الصغيرة: حذف الصور ← الصور المصغّرة ← السجلات ← سحب شغل الباقين، وبعدها ترفع الصور الأصلية وحدة وحدة. أثناء رفع الأصليات يتكرر الدفع والسحب كل دقيقة (وفوراً إذا انحفظ شي جديد)، فالفريق يشوف الشغل والمعاينات قبل ما يخلص رفع الأصليات. الصورة اللي يفشل رفعها تنعاد بعد 2، 4، 8… لحد 60 دقيقة وما تنترك أبداً، والحالة ما تكتب «✓ متزامن» إذا بقت صورة أو صورة مصغّرة أو سجل ما ارتفع. الشغل اللي انحفظ قبل أول مزامنة مع هالسحابة (نسخة قديمة من التطبيق بدون سحابة، أو استيراد) ينضاف للطابور مرة وحدة لكل سحابة وكل مسح (epoch): إذا الجهاز ما سحب من السحابة أبداً ينضاف كل سجل عليه مع الحذوفات، وإلا بس السجلات اللي بيها صور انحفظت على هذا الجهاز (فسجلات الفريق المنزّلة ما تنرفع من جديد). الطابور ما يغيّر حذف معلّق، والسجل يرتفع بتاريخ تعديله الأصلي، فإذا بالسحابة نسخة أحدث تبقى هي وتكسب الصور بس. الاستيراد ما يرجّع صورة أو عنصر محذوف.
الاختبارات: node --test tests/sync.test.js — يشغّل app.js الحقيقي بـ Node مع قاعدة بيانات بالذاكرة وسكربت سحابة وهمي بنفس قواعد cloud/Code.gs (بدون نت ولا مكتبات).
اختبار الحمل: 7 أشخاص يمشون سوا بالدرابين 150 ثانية → وصل 100% من المواقع، التأخير ≈ 0.1 ث؛ و20 شخص → 100% ونفس التأخير. 50 تلفون سوا على السكربت الحقيقي (2026-10-17): كل واحد يرسل موقعه كل ~12 ث عبر Google ويزامن كل دقيقة، 25 منهم يرفعون صورة 2–3 MB وسجل بنفس الوقت، و10 زوّار جدد يسحبون كل شي → 1192 طلب، صفر أخطاء، 25/25 صورة، 50/50 موقع؛ الموقع p95 1.8 ث، الصورة المصغّرة p50 2.6 ث، رفع الصورة ≈ 20 ث.
حتى يتحمل 50 شخص: المزامنة تقرا بس الصفوف اللي تغيّرت (عمود وقت المزامنة أولاً)، وأول مزامنة لتلفون جديد تجي بدون صور مصغّرة وتنسحب المصغّرات بدفعات 50 (thumbs، مخزّنة بالذاكرة المؤقتة للسكربت). القفل يغطي كتابة الصفوف بس (حذف الملفات بعد القفل، والمصغّرات والمواقع بدون قفل). أي خطأ مؤقت (قفل، ضغط على Google — رسائله بلغة صاحب السكربت) يرجع busy: true وما ينحسب على الصورة، والتلفون يعيد بعد تأخير عشوائي حتى ما يعيدون كلهم بنفس الثانية. معرّفات المجلدات تنقرا عبر الذاكرة المؤقتة (حصة Properties اليومية).