بدون رفع, 100% محلي، بدون حساب

مقال

مقارنة مقاطع الكود دون رفعها

في كل مرة تلصق فيها ملفين في أداة مقارنة عبر الإنترنت، يغادر ذلك الكود جهازك. ملفات الإعدادات واستعلامات قواعد البيانات ومفاتيح API المدفونة في مقتطف .env: كلها تنتقل إلى خادم لا تتحكم فيه. يغطي هذا المقال كيفية عمل خوارزميات المقارنة، وماذا تعني خيارات الدقة عملياً، ولماذا تبقى المقارنة محلية أمراً مهماً.

ما الذي تحسبه أداة المقارنة

تأخذ أداة المقارنة نصَّين وتجد المجموعة الأدنى من التغييرات التي تحوّل أحدهما إلى الآخر. الفكرة الأساسية هي أطول تسلسل مشترك، أو LCS: أطول تسلسل من الأسطر (أو الرموز) يظهر في النصين بنفس الترتيب، حتى وإن لم يكن متجاوراً. كل ما ليس في ذلك التسلسل المشترك هو إما إضافة في النسخة الجديدة أو حذف من النسخة القديمة. الخوارزمية الكلاسيكية لهذا تعود إلى Myers (1986)، التي تجد أقصر نص تعديل في وقت O((N+M)D)، حيث N وM هما طولا النصين وD هو عدد التعديلات. في الممارسة العملية، تضيف معظم الأدوات خطوة معالجة مسبقة لتجاهل الأسطر المشتركة البادئة والأسطر المشتركة الختامية، مما يُختزل المشكلة إلى المنطقة المتغيرة. النتيجة هي رقعة: تسلسل من الكتل، يصف كل منها كتلة متصلة من أسطر السياق والحذف والإضافة. هذا هو التنسيق الذي تستخدمه أداة diff في Unix وGit ومعظم أدوات مراجعة الكود.

مخطط يُظهر مدخلَي نص محاذيَين بأطول تسلسل مشترك بينهما، مع توصيل الأسطر المتطابقة وتمييز الأسطر المختلفة كإضافات أو حذف

دقة السطر والكلمة والحرف

تحدد دقة المقارنة ما يُعدّ وحدة للمقارنة. المقارنة القائمة على السطر هي الافتراضية في معظم الأدوات: يُعامل كل سطر كرمز واحد. هذا سريع وينتج مخرجات سهلة القراءة في السياق، لكنه يضع علامة على السطر بأكمله كمتغيّر حتى لو اختلفت كلمة واحدة فقط في ذلك السطر. تُقسّم المقارنة على مستوى الكلمة كل سطر إلى كلمات قبل تشغيل LCS. يعطي هذا صورة أدق عما تغيّر داخل السطر، مما يفيد في النثر وقيم الإعدادات أو JSON. تذهب المقارنة على مستوى الحرف أبعد ويمكنها تمييز حرف واحد متغيّر داخل معرّف طويل. تضيف معالجة المسافات ضجيجاً. سطر ينتهي بـ CRLF ونفس السطر ينتهي بـ LF سيظهران كمختلفين في مقارنة البايتات الصارمة. تقدّم معظم الأدوات خياراً لتطبيع أوضاع نهاية الأسطر قبل المقارنة. وبالمثل، يمكن للمسافات الختامية والمسافة-مقابل-التبويب وأسطر الفراغ أن تنتج مخرجات مقارنة زائفة. تفعيل تطبيع المسافات هو عادةً الافتراضي الصحيح عند مقارنة كود من محررات أو أنظمة تشغيل مختلفة.

خطر الخصوصية في أدوات المقارنة عبر الإنترنت

أدوات المقارنة ولصق النص عبر الإنترنت مريحة: افتح رابطاً، الصق مقتطفين، احصل على مخرجات ملوّنة. المشكلة أن النص الذي تلصقه يُرسل إلى خادم طرف ثالث. اعتماداً على الخدمة، قد يُسجَّل ذلك النص أو يُفهرس أو يُخزَّن إلى أجل غير مسمى أو يُشارك مع مزودي التحليلات. هذا يهم أكثر حين يحتوي الكود على مادة حساسة. بيانات اعتماد مُشفَّرة في الكود، وأسماء مضيفين داخلية، ومنطق أعمال خاص، وبيانات شخصية تحديد الهوية: كلها قد تنتهي في لصقة. حتى بدون أسرار صريحة، يمكن لبنية الكود الداخلي أن تكشف عن قرارات معمارية تفضل إبقاءها خاصة. الخطر ليس افتراضياً. وجد باحثو الأمن مراراً بيانات اعتماد ورموزاً داخلية في لصقات عامة. بعض الخدمات تحتفظ باللصقات حتى بعد أن يحذفها المستخدم، لأن نسخاً موجودة في ذاكرة التخزين المؤقت أو النسخ الاحتياطية. لا توجد طريقة للتحقق مما تفعله خدمة بعيدة بالنص بعد وصوله. التخفيف الموثوق الوحيد هو إبقاء المقارنة محلية، مما يعني تشغيلها في أداة لا ترسل النص أبداً عبر الشبكة.

لقطة شاشة للوحة شبكة المتصفح تُظهر صفر طلبات صادرة بينما يُقارَن مقطعا كود في أداة text-diff

الاستخدامات العملية للمقارنة المحلية

المقارنة ليست فقط لمراجعة الكود. بعض الحالات الشائعة التي تفيد فيها المقارنة المحلية: مراجعة التعديلات على مستند أو ملف إعدادات قبل الإيداع. مقارنة نسختين من Dockerfile أو إعدادات Nginx أو مانيفست Kubernetes لفهم ما تغيّر بالضبط بين النشرات. فحص انجراف الإعدادات بين البيئات. إذا كان من المفترض أن تكون إعدادات الإنتاج والتجهيز متطابقة باستثناء أسماء المضيفين والأسرار، تُظهر المقارنة على الفور أي انحراف غير مقصود. مقارنة استجابات API أثناء تصحيح الأخطاء. لصق حمولتَي JSON من واجهة REST أو GraphQL وتشغيل مقارنة على مستوى الكلمة يحدد الحقول المضافة والقيم المتغيرة والمفاتيح المحذوفة دون قراءة مئات الأسطر يدوياً. مراجعة الكود المُولَّد بواسطة نموذج لغوي مقابل خط الأساس. حين يعيد نموذج كتابة دالة، تُظهر مقارنة على مستوى السطر أي منطق تغيّر وأيه بقي كما هو، أسرع من قراءة النسختين باستقلالية. في كل هذه الحالات، يمكن أن يكون النص المعني حساساً، وإبقاؤه بعيداً عن خادم بعيد هو الاختيار المباشر.

إجراؤها في المتصفح دون رفع

تشغّل أداة text-diff على هذا الموقع حساب المقارنة بالكامل في متصفحك باستخدام JavaScript. تلصق نصين في اللوحتين وتظهر المقارنة فوراً، سطراً بسطر، حتى 3000 سطر لكل جانب. لا يُرسل شيء إلى خادم. النص لا يغادر جهازك أبداً. يستخدم التطبيق خوارزمية قائمة على LCS تعمل على الأسطر: كل سطر رمز واحد، وتحدد الأداة ما إذا كان دون تغيير أو مُضافاً أو محذوفاً بإيجاد أطول تتابع مشترك بين النسختين. تُعرَض الأسطر غير المتغيرة دون تمييز، والأسطر المُضافة باللون الأخضر، والأسطر المحذوفة باللون الأحمر، إلى جانب عدّاد جارٍ للإضافات والحذوفات. لا يوجد وضع على مستوى الكلمة أو الحرف ولا مفتاح لتطبيع المسافات اليوم، لذا فإن سطراً يختلف فقط في مسافات بيضاء زائدة أو نمط نهاية السطر يظل يظهر كمتغيّر. لأن الحساب يعمل من جانب العميل، يعمل في وضع غير متصل. لا يوجد حساب، ولا سجل، ولا احتجاز. يمكنك مقارنة ملف إعدادات محلي بقالب، ومراجعة رقعة قبل تطبيقها، أو فحص استجابتَي API دون أن يصل أي من ذلك النص إلى طرف ثالث.

الأدوات المذكورة في هذا المقال

الأسئلة الشائعة

هل المقارنة القائمة على السطر أفضل أم الكلمة للكود؟

لمعظم مهام مراجعة الكود، المقارنة القائمة على السطر هي المعيار والأسهل قراءة، لأن الكود منظم بالأسطر. يمكن أن تساعد المقارنة القائمة على الكلمة حين تكون الأسطر طويلة وتغيّر جزء صغير منها فقط، كما في قيمة JSON أحادية السطر، لكن هذه الأداة تقارن على مستوى السطر فقط؛ في هذه الحالة، استخدم السطر المميَّز كمؤشر وتفحّص بعينك الفارق الأصغر داخله.

لماذا تُشكّل أدوات المقارنة عبر الإنترنت خطر خصوصية حتى لو استخدمت HTTPS؟

يحمي HTTPS النص أثناء النقل من التنصت، لكنه لا يحميه بعد وصوله إلى الخادم. يملك مشغّل الخدمة وصولاً كاملاً للمحتوى الملصوق ويمكنه تسجيله أو تخزينه أو مشاركته. TLS يتعلق بأمان النقل، لا بما يفعله المستلم بالبيانات.

هل تخزّن أداة text-diff أي سجل للمقارنات السابقة؟

لا. الأداة لا تملك خلفية ولا تُجري أي طلبات شبكية. بمجرد إغلاق علامة التبويب أو إعادة تحميلها، يختفي النص. لا يوجد حساب، ولا سجل محفوظ، ولا تسجيل من جانب الخادم.