متوفر أيضًا بلغات أخرى: English · Español · Português · Français
مشكلة النرويج في YAML
لماذا تنتهي country: NO إلى false، وأي القيم الأخرى تفعل الشيء نفسه، وكيف تفحص ملفًا كاملًا دفعةً واحدة.
ما مشكلة النرويج؟
اكتب country: NO في ملف YAML، وسيعيد لك كثيرٌ من المحلّلات القيمة المنطقية false بدل النص «NO». فرمز النرويج في معيار البلدان هو إحدى صيغ false في YAML 1.1، ومعه خمس عشرة كلمة عادية أخرى، ولا شيء في الملف يشير إلى ذلك: تصل القيمة منطقيةً ويتعطل شيء ما بعد ذلك بكثير.
ويحدث هذا لأن هناك مواصفتين لـYAML مستعملتين يوميًا. فـYAML 1.1، الصادرة سنة 2005، تقبل اثنتين وعشرين صيغة للقيمة المنطقية: y وY وyes وYes وYES وn وN وno وNo وNO وtrue وTrue وTRUE وfalse وFalse وFALSE وon وOn وON وoff وOff وOFF. أما YAML 1.2 فقلّصتها إلى ست — true وTrue وTRUE وfalse وFalse وFALSE — فصارت الست عشرة الباقية نصًّا عاديًا. والنسختان منفَّذتان على نطاق واسع، فالملف الواحد يعني حقًّا شيئين.
والقيم المنطقية هي الحالة الشهيرة لا الوحيدة. ففي YAML 1.1 تكون قيمة مثل 12:30 عددًا بأساس ستين فتصير 750؛ والصفر في المقدمة يعني الثماني، فتصير 0755 هي 493؛ والشرطات السفلية فواصل أرقام، فتصير 1_000 ألفًا. أما في YAML 1.2 فالثلاثة نصوص أو أعداد عشرية عادية. وهذه الصفحة تفحص الملف بحثًا عن هذه الأسرة كلها دفعةً واحدة.
كيف تستعمله
- الصق ملف YAML. ملفًا كاملًا أو المقطع الذي يقلقك. ولا يُرفع شيء؛ فالفحص يجري داخل الصفحة.
- اقرأ الجدول. كل قيمة بسيطة يعتمد معناها على النسخة، ومعها ما تفعله YAML 1.1 وما تفعله 1.2 وأي قاعدة هي المسؤولة.
- وضع بين علامتي اقتباس ما تشير إليه. القيمة المقتبسة نصٌّ في كل نسخة وكل محلّل؛ ووضع الاقتباس هو العلاج كله، ويفرغ الجدول كلما فعلت.
أي محلّل أستعمل في الحقيقة؟
هذا هو السؤال الذي تدور عليه مشكلة النرويج فعلًا، وجوابه نادرًا ما يُرى من الخارج. فـPyYAML — وهي بفارقٍ كبير أكثر مكتبات YAML استعمالًا في بايثون، ومن ثم ما يقوم عليه كثيرٌ من أدوات البنية التحتية — تنفّذ YAML 1.1، فتقرأ NO على أنها false إلى اليوم. وفي جافاسكربت يحلّ js-yaml مخطط YAML 1.2 الأساسي، فيعطيك الملف نفسه نصًّا. أما مكتبات Go وRuby وJava فتختلف بحسب النسخة وبحسب المخطط الذي ضُبطت عليه.
والنتيجة العملية أن الملف قد يجتاز كل الاختبارات على جهاز ويتغير معناه على آخر، بلا خطأ واحد في أي موضع. فإعدادٌ كُتب وتُحقق منه في سلسلة أدوات جافاسكربت ثم قرأته خدمة بايثون هو بالضبط شكل هذا العطب؛ ورموز البلدان، والمفاتيح المكتوبة on وoff، والأوقات المكتوبة 12:30 شائعة بما يكفي للوقوع فيه.
ولهذا أيضًا يكون العلاج هو وضع الاقتباس لا اختيار طرف. فأنت لا تتحكم في المحلّل الذي سيقرأ ملفك لاحقًا، والنص المقتبس يعني الشيء نفسه عندهم جميعًا.
حدود معلنة
تقرأ هذه الصفحة القيم سطرًا سطرًا بدل أن تحلّل YAML تحليلًا حقيقيًا، وهي ضيّقة في ذلك عن قصد: لا تنظر إلا في أسطر المفتاح والقيمة وعناصر القوائم البسيطة، وتتخطى كل ما هو مقتبس أصلًا، وتتخطى بكامله أي قيمة كتلية تبدأ بشرطة رأسية أو بعلامة أكبر مع جسمها المزاح كله. وهذه الأخيرة مهمة: فبرنامج صدفة داخل قيمة كتلية قد يحوي أسطرًا تشبه YAML تمامًا، والإشارة إليها إنذار كاذب لا اكتشاف.
ولهذا الضيق ثمن. فالمجموعات المكتوبة في سطر واحد، والملفات متعددة المستندات، والمراسي ومفاتيح الدمج لا تُحلَّل، فقيمة مختبئة في واحدة منها لن تظهر. والماسح يؤثر الصمت على قول الخطأ.
وقواعد YAML 1.1 هنا منقولة عن صفحات الأنواع في yaml.org نفسه، وهي التي تنشر تعابير التحليل، والنقل مُتحقَّق منه على تلك الصفحات لا مأخوذ على عِلّاته. وأجوبة 1.2 مقيسة على js-yaml، وهي المكتبة التي يستعملها هذا الموقع في صفحات أخرى. ولا يجعل شيء من ذلك هذه الصفحة بديلًا عن تشغيل محلّلك الحقيقي على ملفك الحقيقي.
وأخيرًا، ظهور قيمة في القائمة لا يعني أن إعدادك معطوب. فإن كان كل ما يقرأ الملف على YAML 1.2 فـNO نصٌّ أصلًا ولا مشكلة. والجدول يقول أين يعتمد الملف على هذا الافتراض، لا أن الافتراض خاطئ الآن.
لماذا هي مجانية؟
الفحص بضع مئات من الأسطر من مطابقة الأنماط تجري في متصفحك. ولا خادم في الأمر، فلا شيء يُحاسَب عليه ولا حساب يُنشأ؛ وهذا مهم هنا، لأن ملف الإعدادات كثيرًا ما يذكر مضيفات داخلية وسِلالًا وخدمات.
ولا يُرفع شيء ولا يُحفظ شيء. أعد تحميل الصفحة تجدها قد نسيت الملف.