تطبيق ويب للعثور على مقياس تصنيف بين شيئين عشوائيين. هل سبق لك أن أردت تقييم شيء ما على مقياس ديفيد هاسيلهوف لبرج إيفل؟ حسنا الآن يمكنك ذلك.
لقد قمت أنا وديف باجوريك بإعداد هذا من أجل هاكاثون TerribleHack Winter 2015. لقد كتبت الواجهة الخلفية، وكتب ديف الواجهة الأمامية. قمت لاحقًا بإعادة كتابة الواجهة الخلفية في Nim ثم D لجعلها أكثر نظافة وأسهل في النشر بالإضافة إلى تعلم لغات جديدة.
جربه على http://ratewith.science!
يستخدم "التقييم مع العلم" البحث عن الرسم البياني للمسار الأقصر على الرسم البياني لرابط ويكيبيديا للعثور على الروابط بين الأشياء المختلفة. إنه يستخدم تنسيقًا فعالاً لرسم بياني للارتباط الثنائي تم إنشاؤه بواسطة مشروع wikicrush الخاص بي حتى أتمكن من احتواء الرسم البياني بالكامل في حوالي 500 ميجابايت من الذاكرة وإجراء عمليات بحث أولية سريعة جدًا عليه.
كما أنه يستخدم ميزة wikicrush للتعليق على المسارات ثنائية الاتجاه. عندما ترتبط مقالة بمقالة أخرى وترتبط تلك المقالة بها مرة أخرى، فهذا يدل على وجود علاقة أقوى من الارتباط أحادي الاتجاه. يحاول التطبيق أولاً العثور على مسار باستخدام الروابط ثنائية الاتجاه فقط ثم يلجأ إلى الروابط أحادية الاتجاه إذا لم يتمكن من ذلك. تعمل المسارات ثنائية الاتجاه عمومًا بشكل أفضل لأنها لا تتضمن اتصالات ضعيفة مثل "يقع المقر الرئيسي لويكيبيديا في منطقة خليج سان فرانسيسكو".
يرسل Dave's JS نقطتي النهاية الخلفيتين عبر AJAX وتعطي الواجهة الخلفية الخاصة بي قائمة بالمقالات التي تشكل مسارًا أو خطأ في حالة نادرة لا يمكن العثور على مسار.
الواجهة الأمامية مكتوبة بلغة HTML وJS ثابتة مع رسوم متحركة وخصائص CSS3 لمزيد من التصميم الرائع. الواجهة الخلفية مكتوبة حاليًا بلغة Rust، في إعادة كتابتها الرابعة. في السابق كنت قد كتبتها بلغة D وNim وRust (عندما كنت أتعلم لأول مرة) من أجل المتعة. ومع ذلك، استمرت قاعدة التعليمات البرمجية D في التعطل وكان من الصعب نشرها على VPS الخاص بي، لذلك قمت بإعادة كتابتها في Rust حتى أتمكن من الحفاظ على تشغيلها بسهولة أكبر.
أولاً، تقوم الواجهة الخلفية بترجمة الصفحات المحددة إلى شيء قابل للاستخدام مع الرسم البياني الثنائي باستخدام ملف wikicrush xindex.db
sqlite. تقوم الواجهة الخلفية بعد ذلك بإجراء بحث العرض أولاً على مخزن مؤقت في الذاكرة لملف wikicrush indexbi.bin
. يحاول أولاً BFS من خلال الروابط ثنائية الاتجاه فقط لأن هذه تؤدي إلى مسارات أفضل ولكن إذا فشل ذلك فإنه يحاول البحث في اتجاه واحد. ثم يستخدم قاعدة بيانات Sqlite لترجمة إزاحات المسار التي استعادها إلى أسماء المقالات ويعيدها إلى الواجهة الأمامية بتنسيق JSON.
تمت إعادة الكتابة الأولى في Nim بواسطة Tristan كوسيلة لتعلم اللغة وجعل الأمر برمته أقل اختراقًا من إصدار Rust القديم. استخدمت الواجهة الخلفية Nim إطار عمل الويب Jester لخدمة الواجهة الأمامية لـ Dave بالإضافة إلى الاستجابة لاستدعاءات واجهة برمجة التطبيقات (API) للعثور على المسار.
تستخدم الواجهة الخلفية ملف Rust الثنائي المترجم من مشروع Ratews_backend للعثور على المسار.
ولسوء الحظ، فإن الرابط بينهما عبارة عن اختراق كامل ناتج عن حقيقة أن Rust هي جودة ألفا، ولا أعرف حقًا كيفية استخدامها، وكان هاكاثونًا ليوم واحد فقط. بعد الاصطدام بالحائط، لم يتمكن Iron من التعامل بأمان مع بيانات الرسم البياني العام واتصال Sqlite بين الطلبات لأن نوع اتصال Sqlite لم يكن آمنًا للخيوط وكان Iron متعدد الخيوط. كان بإمكاني حل هذه المشكلة من خلال سلاسل المحادثات المتعددة وتمرير الرسائل بشكل مناسب، لكنني لم أكن أعرف كيفية القيام بذلك في Rust وكان الوقت ينفد.
كان الحل هو جعل ثنائي Rust يتفاعل عبر stdin وstdout عبر تنسيق نصي بسيط. ثم كتبت تطبيق Sinatra بسيطًا في Ruby والذي خدم الواجهة الأمامية لـ Dave وطلبات واجهة برمجة التطبيقات المكوكية لعملية الصدأ عبر أنابيب IO والعودة إلى الواجهة الأمامية عبر JSON.
Hackathon ليس المكان الذي تذهب إليه للعثور على كود نظيف... كما أن جميع المسارات عبارة عن مسارات مطلقة مشفرة بشكل ثابت لمشاريع المكونات المختلفة على نظام ملفات أجهزة الكمبيوتر المحمولة الخاصة بي...
ونظرًا لاستخدامي لهذا كتجربة في تجربة لغات تجريبية جديدة، فإن نشر هذا ليس بهذه السهولة. لكن ثق بي أن الأمر أسهل مع الإصدار D الجديد من إصدارات Nim أو Rust. خطوات:
ratewithscience
الاستنساخ مع العلمdata
wikicrush في دليل ratewithscience
. من الناحية الفنية، فهو يحتاج فقط إلى xindex.db
و indexbi.bin
dub run
لتجميع الخادم وبدء تشغيله، أو قم بتشغيل dub build
لإنشاء ملف ثنائي تم إصدار هذا الرمز بموجب ترخيص MIT.