أسئلة وأجوبة
في هذه المحاضرة الأخيرة، أجبنا على الأسئلة التي قدّمها الطلاب:
- أي توصيات لتعلّم مواضيع أنظمة التشغيل (Operating Systems) مثل العمليات، الذاكرة الافتراضية، المقاطعات، إدارة الذاكرة، وما إلى ذلك؟
- ما بعض الأدوات التي تضعونها في الأولوية لتعلمها أولًا؟
- متى أستخدم بايثون بدلًا من سكربتات Bash أو لغةٍ أخرى؟
- ما الفرق بين
source script.shو./script.sh؟ - أين تُخزَّن الحزم والأدوات المختلفة وكيف يعمل الإسناد إليها؟ وما هو
/binأو/libأصلًا؟ - هل أجري
apt-get installلحزمة python-whatever، أمpip installللحزمة التي أريدها؟ - ما أسهل وأفضل أدوات القياس (profiling) لتحسين أداء الكود؟
- ما إضافات المتصفح التي تستخدمونها؟
- ما الأدوات الأخرى المفيدة لمعالجة البيانات؟
- ما الفرق بين Docker والآلة الافتراضية (Virtual Machine)؟
- ما مزايا وعيوب كل نظام تشغيل، وكيف نختار بينها (مثلًا اختيار أفضل توزيعة لينكس لأغراضنا)؟
- Vim أم Emacs؟
- أي نصائح أو حيل لتطبيقات تعلّم الآلة (Machine Learning)؟
- أي نصائح إضافية عن Vim؟
- ما هو التحقق بخطوتين (2FA) ولماذا يجب أن أستخدمه؟
- أي تعليقات على الاختلافات بين متصفحات الويب؟
أي توصيات لتعلّم مواضيع أنظمة التشغيل مثل العمليات والذاكرة الافتراضية والمقاطعات وإدارة الذاكرة وغيرها
أولًا، من غير الواضح ما إذا كنت تحتاج فعلًا إلى إلمامٍ كبيرٍ بكل هذه المواضيع لأنها مواضيع منخفضة المستوى جدًا. ستصبح مهمةً عندما تبدأ بكتابة كودٍ أكثر انخفاضًا في المستوى مثل تنفيذ نواةٍ أو تعديلها. بخلاف ذلك، لن تكون معظم المواضيع ذات صلةٍ، باستثناء العمليات (processes) والإشارات (signals) التي غُطّيت بإيجازٍ في محاضرات أخرى.
بعض الموارد الجيدة لتعلّم هذا الموضوع:
- صف MIT 6.828 - صف على مستوى الدراسات العليا حول هندسة أنظمة التشغيل. مواد الصف متاحةٌ للعموم.
- Modern Operating Systems (الطبعة الرابعة) - بقلم أندرو إس. تانينباوم، وهو نظرةٌ عامةٌ جيدةٌ على الكثير من المفاهيم المذكورة.
- The Design and Implementation of the FreeBSD Operating System - مصدرٌ جيدٌ حول نظام التشغيل FreeBSD (لاحظ أن هذا ليس لينكس).
- أدلةٌ أخرى مثل كتابة نظام تشغيل بلغة Rust حيث ينفّذ الناس نواةً خطوةً بخطوة بلغاتٍ مختلفة، غالبًا للأغراض التعليمية.
ما بعض الأدوات التي تضعونها في الأولوية لتعلمها أولًا؟
بعض المواضيع التي تستحق الأولوية:
- تعلّم كيفية استخدام لوحة المفاتيح أكثر والماوس أقل. يمكن أن يكون ذلك عبر اختصارات لوحة المفاتيح، أو تغيير الواجهات، وما إلى ذلك.
- إتقان محرر النصوص. كمبرمج، تقضي معظم وقتك في تحرير الملفات، لذا فإن إتقان هذه المهارة يؤتي ثماره حقًا.
- تعلّم كيفية أتمتة و/أو تبسيط المهام المتكررة في سير عملك لأن توفير الوقت سيكون هائلًا...
- تعلّم أدوات التحكم في الإصدارات (version control) مثل Git وكيفية استخدامها مع GitHub للتعاون في مشاريع البرمجيات الحديثة.
متى أستخدم بايثون بدلًا من سكربتات Bash أو لغةٍ أخرى؟
بشكلٍ عام، تكون سكربتات bash مفيدةً للسكربتات القصيرة والبسيطة التي تُستخدم لمرةٍ واحدةٍ عندما تريد فقط تنفيذ سلسلةٍ محددةٍ من الأوامر. لدى bash مجموعةٌ من الغرائب التي تجعل العمل به صعبًا بالنسبة للبرامج أو السكربتات الأكبر:
- من السهل إتقان bash لحالة استخدامٍ بسيطة، لكنه قد يكون صعبًا جدًا لجميع المدخلات المحتملة. على سبيل المثال، أدت المسافات في وسائط السكربتات إلى أخطاءٍ لا تُحصى في سكربتات bash.
- لا يلائم bash إعادة استخدام الكود، لذا قد يكون من الصعب إعادة استخدام مكونات برامج سابقة كتبتها. وبشكلٍ أعم، لا يوجد مفهوم للمكتبات البرمجية (software libraries) في bash.
- يعتمد bash على الكثير من السلاسل السحرية (magic strings) مثل
$?أو$@للإشارة إلى قيمٍ محددة، بينما تشير إليها اللغات الأخرى بشكلٍ صريح، مثلexitCodeأوsys.argsعلى التوالي.
لذلك، بالنسبة للسكربتات الأكبر و/أو الأكثر تعقيدًا، نوصي باستخدام لغات سكربتاتٍ أكثر نضجًا مثل بايثون أو روبي. ستجد على الإنترنت مكتباتٍ لا تُحصى كتبها الآخرون بالفعل لحل المشكلات الشائعة بهذه اللغات. إذا وجدت مكتبةً تنفّذ الوظيفة المحددة التي تهتم بها بلغةٍ ما، فعادةً يكون أفضل شيءٍ هو استخدام تلك اللغة فقط.
ما الفرق بين source script.sh و./script.sh؟
في كلتا الحالتين، سيُقرأ ملف script.sh ويُنفَّذ في جلسة bash، والفرق يكمن في الجلسة التي تنفّذ الأوامر.
بالنسبة لـsource، تُنفَّذ الأوامر في جلستك الحالية من bash، وبالتالي فإن أي تغييراتٍ تُجرى على البيئة الحالية، مثل تغيير الأدلة أو تعريف الدوال، ستبقى ساريةً في الجلسة الحالية بمجرد انتهاء أمر source من التنفيذ.
أما عند تشغيل السكربت بشكلٍ مستقلٍ مثل ./script.sh، فستشغّل جلستك الحالية من bash نسخةً جديدةً من bash ستنفّذ الأوامر الموجودة في script.sh.
وبالتالي، إذا غيّر script.sh الدليل الحالي، فإن نسخة bash الجديدة ستغيّر الدليل، لكن بمجرد خروجها وإعادة التحكم إلى جلسة bash الأم، ستبقى الجلسة الأم في مكانها.
وبالمثل، إذا عرّف script.sh دالةً تريد الوصول إليها في الطرفية، فستحتاج إلى source لكي تُعرَّف في جلستك الحالية من bash. وإلا، إذا شغّلته، فستكون عملية bash الجديدة هي التي تعالج تعريف الدالة بدلًا من مُعالج الأوامر الحالي.
أين تُخزَّن الحزم والأدوات المختلفة وكيف يعمل الإسناد إليها؟ وما هو /bin أو /lib أصلًا؟
بخصوص البرامج التي تنفّذها في الطرفية، فهي جميعًا موجودةٌ في الأدلة المدرجة في متغير البيئة PATH لديك، ويمكنك استخدام أمر which (أو أمر type) للتحقق من أين يعثر مُعالج الأوامر لديك على برنامجٍ معيّن.
بشكلٍ عام، هناك بعض الأعراف حول مكان وجود أنواعٍ محددةٍ من الملفات. إليك بعض ما تحدثنا عنه، وراجع معيار التسلسل الهرمي لنظام الملفات للحصول على قائمةٍ أشمل.
/bin- ملفات الأوامر الثنائية الأساسية/sbin- الملفات الثنائية الأساسية للنظام، وعادةً تُشغَّل بواسطة root/dev- ملفات الأجهزة، وهي ملفات خاصة غالبًا ما تكون واجهاتٍ لأجهزةٍ مادية/etc- ملفات الإعدادات على مستوى النظام الخاصة بالجهاز/home- الدلائل الرئيسية للمستخدمين في النظام/lib- المكتبات الشائعة لبرامج النظام/opt- برامج التطبيقات الاختيارية/sys- يحتوي على معلومات وإعدادات النظام (غُطّي في المحاضرة الأولى)/tmp- الملفات المؤقتة (وكذلك/var/tmp). تُحذف عادةً بين عمليات الإقلاع./usr/- بيانات المستخدم للقراءة فقط/usr/bin- ملفات الأوامر الثنائية غير الأساسية/usr/sbin- الملفات الثنائية غير الأساسية للنظام، وعادةً تُشغَّل بواسطة root/usr/local/bin- ملفات ثنائية للبرامج المترجمة من قبل المستخدم
/var- ملفات متغيرة مثل السجلات أو التخزين المؤقت
هل أجري apt-get install لحزمة python-whatever، أم pip install للحزمة التي أريدها؟
لا توجد إجابةٌ واحدةٌ شاملةٌ لهذا السؤال. إنه مرتبطٌ بالسؤال الأعم حول ما إذا كان يجب عليك استخدام مدير حزم نظامك أو مدير حزم خاصًا باللغة لتثبيت البرامج. بعض الأمور التي يجب أخذها في الاعتبار:
- ستكون الحزم الشائعة متاحةً عبر كليهما، لكن الحزم الأقل شهرةً أو الأحدث قد لا تكون متاحةً في مدير حزم نظامك. في هذه الحالة، يكون استخدام الأداة الخاصة باللغة هو الخيار الأفضل.
- وبالمثل، عادةً ما تحتوي مديرو الحزم الخاصة باللغة على إصداراتٍ أحدث من الحزم مقارنةً بمديري حزم النظام.
- عند استخدام مدير حزم نظامك، تُثبَّت المكتبات على مستوى النظام. وهذا يعني أنه إذا كنت بحاجة إلى إصداراتٍ مختلفةٍ من مكتبةٍ لأغراض التطوير، فقد لا يكفي مدير حزم النظام. لهذا السيناريو، توفر معظم لغات البرمجة شكلاً من أشكال البيئة المعزولة أو الافتراضية بحيث يمكنك تثبيت إصداراتٍ مختلفةٍ من المكتبات دون الدخول في تعارضات. بالنسبة لبايثون، هناك virtualenv، وبالنسبة لروبي، هناك RVM.
- اعتمادًا على نظام التشغيل وهندسة الأجهزة، قد تأتي بعض هذه الحزم بملفاتٍ ثنائيةٍ أو قد تحتاج إلى أن تُترجم. على سبيل المثال، في أجهزة ARM مثل Raspberry Pi، قد يكون استخدام مدير حزم النظام أفضل من المدير الخاص باللغة إذا كانت الأولى تأتي في شكل ملفاتٍ ثنائيةٍ والثانية تحتاج إلى أن تُترجم. هذا يعتمد بشدةٍ على إعدادك المحدد.
يجب أن تحاول استخدام حلٍّ واحدٍ أو الآخر وليس كليهما، لأن ذلك قد يؤدي إلى تعارضاتٍ يصعب تصفيتها. توصيتنا هي استخدام مدير الحزم الخاص باللغة كلما أمكن، واستخدام البيئات المعزولة (مثل virtualenv في بايثون) لتجنب تلويث البيئة العامة.
ما أسهل وأفضل أدوات القياس لتحسين أداء الكود؟
أسهل أداةٍ مفيدةٍ جدًا لأغراض القياس هي توقيت الطباعة. تحسب يدويًا الوقت المستغرق بين الأجزاء المختلفة من كودك. وبتكرار ذلك باستمرار، يمكنك فعليًا إجراء بحثٍ ثنائيٍّ على كودك والعثور على المقطع الذي استغرق أطول وقت.
بالنسبة للأدوات الأكثر تقدمًا، يتيح لك Callgrind من Valgrind تشغيل برنامجك وقياس المدة التي يستغرقها كل شيءٌ وجميع مكدسات الاستدعاءات، أي أي دالةٍ استدعت أي دالةٍ أخرى. ثم يُنتج نسخةً مشروحةً من الكود المصدري لبرنامجك مع الوقت المستغرق لكل سطر. مع ذلك، فهو يبطئ برنامجك بدرجةٍ من الحجم (بمعامل عشرة تقريبًا) ولا يدعم الخيوط. في الحالات الأخرى، يمكن لأداة perf وغيرها من أدوات القياس بالعينات الخاصة باللغة إخراج بياناتٍ مفيدةٍ بسرعةٍ كبيرة. رسوم اللهب (flame graphs) هي أداة تصوّرٍ جيدةٌ لمخرجات أدوات القياس بالعينات المذكورة. يجب عليك أيضًا محاولة استخدام أدواتٍ محددةٍ للغة البرمجة أو المهمة التي تعمل عليها. على سبيل المثال، لتطوير الويب، تحتوي أدوات المطورين المدمجة في Chrome وFirefox على أدوات قياسٍ رائعة.
أحيانًا يكون الجزء البطيء من كودك بسبب انتظار نظامك لحدثٍ ما مثل قراءةٍ من القرص أو حزمةٍ من الشبكة. في تلك الحالات، يجدر التحقق من أن حسابات التقدير التقريبية (back-of-the-envelope) للسرعة النظرية من حيث قدرات الأجهزة لا تنحرف عن القراءات الفعلية. كما توجد أدواتٌ متخصصةٌ لتحليل أوقات الانتظار في استدعاءات النظام. تتضمن هذه الأدوات أشياءً مثل eBPF التي تؤدي تتبّعًا للنواة لبرامج المستخدم. على وجه الخصوص، يجدر الاطلاع على bpftrace إذا كنت بحاجة إلى هذا النوع من القياس منخفض المستوى.
ما إضافات المتصفح التي تستخدمونها؟
بعض إضافاتنا المفضلة، المرتبطة في الغالب بالأمان وسهولة الاستخدام:
- uBlock Origin - حاجبٌ واسع النطاق لا يوقف الإعلانات فحسب، بل جميع أنواع الاتصالات الخارجية التي قد يحاول الصفحة القيام بها. وهذا يشمل أيضًا السكربتات المضمّنة وأنواع تحميل الموارد الأخرى. إذا كنت مستعدًا لقضاء بعض الوقت في الإعداد لجعل الأمور تعمل، انتقل إلى الوضع المتوسط أو حتى الوضع الصارم. ستجعل تلك الأوضاع بعض المواقع لا تعمل حتى تعبث بالإعدادات بما يكفي، لكنها ستحسّن أيضًا أمانك عبر الإنترنت بشكلٍ كبير. وإلا، فإن الوضع السهل هو بالفعل إعداد افتراضيٌّ جيدٌ يحجب معظم الإعلانات والتتبّع. يمكنك أيضًا تحديد قواعدك الخاصة حول كائنات الموقع التي تريد حجبها.
- Stylus - فرعٌ من Stylish (لا تستخدم Stylish، فقد ثبت أنه يسرق سجل تصفح المستخدمين)، يتيح لك تحميل أوراق أنماط CSS مخصصةٍ للمواقع. باستخدام Stylus يمكنك بسهولةٍ تخصيص وتعديل مظهر المواقع. قد يكون ذلك إزالة شريط جانبي، أو تغيير لون الخلفية أو حتى حجم النص أو اختيار الخط. هذا رائعٌ لجعل المواقع التي تزورها كثيرًا أكثر قابليةً للقراءة. علاوةً على ذلك، يمكن لـStylus العثور على أنماطٍ كتبها مستخدمون آخرون ونُشرت في userstyles.org. فمعظم المواقع الشائعة تحتوي على واحدةٍ أو أكثر من أوراق أنماط الثيم الداكن على سبيل المثال.
- التقاط شاشة الصفحة الكاملة - مدمج في Firefox وامتداد Chrome. يتيح لك التقاط صورةٍ لموقعٍ ويبٍ كامل، وغالبًا ما يكون أفضل بكثيرٍ من الطباعة لأغراض المرجعية.
- حاويات الحسابات المتعددة - يتيح لك فصل ملفات تعريف الارتباط إلى "حاويات"، مما يسمح لك بتصفح الويب بهوياتٍ مختلفةٍ و/أو ضمان عدم قدرة المواقع على مشاركة المعلومات فيما بينها.
- تكامل مدير كلمات المرور - لدى معظم مديري كلمات المرور امتدادات متصفح تجعل إدخال بيانات اعتمادك في المواقع أكثر ملاءمةً وأمانًا. مقارنةً بمجرد نسخ ولصق اسم المستخدم وكلمة المرور، ستتحقق هذه الأدوات أولًا من أن نطاق الموقع يطابق النطاق المدرج للمدخل، مما يمنع هجمات التصيّد التي تنتحل شخصية المواقع الشهيرة لسرقة بيانات الاعتماد.
- Vimium - امتداد متصفحٍ يوفر تنقلًا وتحكمًا قائمين على لوحة المفاتيح في الويب بروح محرر Vim.
ما الأدوات الأخرى المفيدة لمعالجة البيانات؟
بعض أدوات معالجة البيانات التي لم يتح لنا الوقت لتغطيتها أثناء محاضرة معالجة البيانات تشمل jq أو pup، وهما محلّلان متخصصان لبيانات JSON وHTML على التوالي. لغة برمجة Perl هي أداة جيدةٌ أخرى لخطوط أنابيب معالجة البيانات الأكثر تقدمًا. خدعةٌ أخرى هي أمر column -t الذي يمكن استخدامه لتحويل النص المتباعد بالمسافات (وليس بالضرورة محاذى) إلى نصٍ محاذى بالأعمدة بشكلٍ صحيح.
بشكلٍ عام، هناك أداتان أكثر غير تقليديتين لمعالجة البيانات وهما vim وPython. بالنسبة لبعض التحويلات المعقدة متعددة الأسطر، يمكن أن تكون وحدات الماكرو (macros) في vim أداةً لا تُقدَّر بثمن. يمكنك تسجيل سلسلةٍ من الإجراءات وتكرارها عدد المرات الذي تريده، على سبيل المثال في ملاحظات محاضرة المحررين (وفي فيديو العام الماضي) يوجد مثالٌ على تحويل ملفٍ بتنسيق XML إلى JSON باستخدام وحدات ماكرو vim فقط.
بالنسبة للبيانات الجدولية، المقدَّمة غالبًا في ملفات CSV، تعد مكتبة pandas في بايثون أداةً رائعةً. ليس فقط لأنها تجعل من السهل جدًا تعريف عملياتٍ معقدةٍ مثل group by أو join أو عوامل التصفية؛ بل تجعل أيضًا رسم الخصائص المختلفة لبياناتك سهلاً للغاية. كما أنها تدعم التصدير إلى العديد من تنسيقات الجداول بما في ذلك XLS وHTML أو LaTeX. بدلًا من ذلك، تتمتع لغة البرمجة R (لغةٌ سيئة من منظورٍ ما) بالكثير من الوظائف لحساب الإحصاءات على البيانات ويمكن أن تكون مفيدةً جدًا كخطوةٍ أخيرةٍ في خط الأنابيب لديك. ggplot2 مكتبة رسمٍ رائعةٌ في R.
ما الفرق بين Docker والآلة الافتراضية؟
يعتمد Docker على مفهومٍ أعم يُسمى الحاويات (containers). الفرق الرئيسي بين الحاويات والأجهزة الافتراضية هو أن الأجهزة الافتراضية تنفّذ مكدس نظام تشغيلٍ كاملًا، بما في ذلك النواة، حتى لو كانت النواة هي نفسها نواة الجهاز المضيف. بخلاف الأجهزة الافتراضية، تتجنب الحاويات تشغيل نسخةٍ أخرى من النواة وتشارك النواة مع المضيف بدلًا من ذلك. في لينكس، يُحقَّق ذلك عبر آليةٍ تُسمى LXC، وهي تستخدم سلسلةً من آليات العزل لتشغيل برنامجٍ يعتقد أنه يعمل على عتاده الخاص لكنه في الواقع يشارك العتاد والنواة مع المضيف. وبالتالي، تتمتع الحاويات بحملٍ إضافيٍّ أقل من الآلة الافتراضية الكاملة. على الجانب الآخر، تمتلك الحاويات عزلًا أضعف ولا تعمل إلا إذا كان المضيف يشغّل نفس النواة. على سبيل المثال، إذا شغّلت Docker على macOS، فسيحتاج Docker إلى تشغيل آلةٍ افتراضيةٍ لينكسيةٍ للحصول على نواة لينكس أولية، وبالتالي يظل الحمل الإضافي كبيرًا. أخيرًا، Docker هو تنفيذٌ محددٌ للحاويات وهو مصممٌ لنشر البرمجيات. وبسبب هذا، فإن له بعض الخصائص الغريبة: على سبيل المثال، لن تستمر حاويات Docker في أي شكلٍ من أشكال التخزين بين عمليات إعادة الإقلاع افتراضيًا.
ما مزايا وعيوب كل نظام تشغيل، وكيف نختار بينها (مثلًا اختيار أفضل توزيعة لينكس لأغراضنا)؟
بخصوص توزيعات لينكس، على الرغم من وجود الكثير والكثير من التوزيعات، فإن معظمها سيتصرف بشكلٍ متطابقٍ إلى حدٍّ كبيرٍ لمعظم حالات الاستخدام. يمكن تعلّم معظم ميزات ووظائف لينكس وUNIX الداخلية في أي توزيعة. الفرق الأساسي بين التوزيعات هو كيفية تعاملها مع تحديثات الحزم. بعض التوزيعات، مثل Arch Linux، تستخدم سياسة تحديثٍ دوريٍّ (rolling update) حيث تكون الأشياء في الطليعة لكن الأشياء قد تنكسر بين الحين والآخر. من ناحيةٍ أخرى، تكون بعض التوزيعات مثل Debian أو CentOS أو إصدارات Ubuntu LTS أكثر تحفظًا بكثيرٍ في إصدار التحديثات في مستودعاتها، لذا تكون الأشياء عادةً أكثر استقرارًا على حساب التضحية بالميزات الأحدث. توصيتنا لتجربةٍ سهلةٍ ومستقرةٍ مع كلٍّ من أجهزة سطح المكتب والخوادم هي استخدام Debian أو Ubuntu.
نظام التشغيل Mac OS هو نقطة وسطٌ جيدةٌ بين Windows وLinux يتمتع بواجهةٍ مصقولةٍ بشكلٍ جميل. مع ذلك، فإن Mac OS مبنيٌّ على BSD وليس على لينكس، لذا فإن بعض أجزاء النظام والأوامر مختلفة. بديلٌ آخر يستحق الاطلاع عليه هو FreeBSD. حتى لو لم تعمل بعض البرامج على FreeBSD، فإن نظام BSD البيئي أقل تجزئةً بكثيرٍ وأفضل توثيقًا من لينكس. نُثبّط استخدام Windows لأي شيءٍ سوى تطوير تطبيقات Windows أو إذا كانت هناك ميزةٌ حاسمةٌ تحتاجها، مثل دعمٍ جيدٍ لبرامج تشغيل الألعاب.
بالنسبة لأنظمة الإقلاع المزدوج (dual boot)، نعتقد أن التنفيذ الأكثر فعاليةً هو bootcamp من macOS وأن أي تركيبةٍ أخرى يمكن أن تكون إشكاليةً على المدى الطويل، خاصةً إذا جمعتها مع ميزاتٍ أخرى مثل تشفير القرص.
Vim أم Emacs؟
نستخدم نحن الثلاثة vim كمحررٍ أساسيٍّ لنا، لكن Emacs هو أيضًا بديلٌ جيدٌ، ويجدر تجربة كليهما لمعرفة أيهما يناسبك أكثر. لا يتبع Emacs التحرير النمطي (modal editing) الخاص بـvim، لكن يمكن تفعيل ذلك عبر إضافات Emacs مثل Evil أو Doom Emacs. ميزة استخدام Emacs هي أنه يمكن تنفيذ الإضافات بلغة Lisp، وهي لغة سكربتاتٍ أفضل من vimscript، لغة السكربتات الافتراضية في Vim.
أي نصائح أو حيل لتطبيقات تعلّم الآلة؟
يمكن تطبيق بعض الدروس والخلاصات من هذا الصف مباشرةً على تطبيقات تعلّم الآلة (ML). كما هو الحال مع العديد من التخصصات العلمية، غالبًا ما تُجري في تعلّم الآلة سلسلةً من التجارب وتريد التحقق مما نجح وما لم ينجح. يمكنك استخدام أدوات سطر الأوامر للبحث بسهولةٍ وسرعةٍ في هذه التجارب وتجميع النتائج بطريقةٍ منطقية. قد يعني ذلك تحديد كل التجارب في إطارٍ زمنيٍّ معيّنٍ أو تلك التي تستخدم مجموعة بياناتٍ محددة. باستخدام ملف JSON بسيطٍ لتسجيل جميع المعاملات ذات الصلة بالتجارب، يمكن أن يكون ذلك بسيطًا بشكلٍ لا يُصدَّق مع الأدوات التي غطّيناها في هذا الصف. أخيرًا، إذا كنت لا تعمل مع نوعٍ ما من المجموعات (clusters) حيث تقدّم مهام GPU، فينبغي أن تبحث في كيفية أتمتة هذه العملية لأنها يمكن أن تكون مهمةً مستهلكةً للوقت إلى حدٍّ كبيرٍ كما أنها تستنزف طاقتك الذهنية.
أي نصائح إضافية عن Vim؟
بعض النصائح الإضافية:
- الإضافات - خذ وقتك واستكشف مشهد الإضافات. هناك الكثير من الإضافات الرائعة التي تعالج بعض أوجه القصور في vim أو تضيف وظائف جديدة تتكامل جيدًا مع سير عمل vim الحالي. لهذا، فإن الموارد الجيدة هي VimAwesome وملفات dotfiles للمبرمجين الآخرين.
- العلامات (Marks) - في vim، يمكنك تعيين علامةٍ بكتابة
m<X>لحرفٍ معيّنٍX. يمكنك بعد ذلك العودة إلى تلك العلامة بكتابة'<X>. يتيح لك هذا التنقل بسرعةٍ إلى مواقع محددةٍ داخل ملفٍ أو حتى عبر ملفات. - التنقل - ينقلك
Ctrl+OوCtrl+Iإلى الخلف وإلى الأمام على التوالي عبر المواقع التي زرتها مؤخرًا. - شجرة التراجع (Undo Tree) - لدى Vim آليةً رائعةً إلى حدٍّ ما لتتبّع التغييرات. بخلاف المحررين الآخرين، يخزّن vim شجرةً من التغييرات بحيث حتى لو تراجعت ثم أجريت تغييرًا مختلفًا، يمكنك العودة إلى الحالة الأصلية عبر التنقل في شجرة التراجع. تكشف بعض الإضافات مثل gundo.vim وundotree هذه الشجرة بطريقةٍ رسومية.
- التراجع بالوقت - سيتيح لك أمرا
:earlierو:laterالتنقل في الملفات باستخدام مراجع زمنيةٍ بدلًا من تغييرٍ واحدٍ في كل مرة. - التراجع المستمر هو ميزةٌ مدمجةٌ رائعةٌ في vim وهي معطلةٌ افتراضيًا. إنها تحافظ على سجل التراجع بين استدعاءات vim. بتعيين
undofileوundodirفي ملف.vimrcالخاص بك، سيخزّن vim سجلًا للتغييرات لكل ملف. - مفتاح القائد (Leader Key) - مفتاح القائد هو مفتاحٌ خاصٌّ يُترك غالبًا للمستخدم لتهيئته للأوامر المخصصة. النمط المعتاد هو الضغط على هذا المفتاح وتحريره (غالبًا مفتاح المسافة) ثم مفتاحٍ آخرٍ لتنفيذ أمرٍ معيّن. غالبًا، ستستخدم الإضافات هذا المفتاح لإضافة وظائفها الخاصة، على سبيل المثال يستخدم إضافة UndoTree
<Leader> Uلفتح شجرة التراجع. - كائنات النص المتقدمة - يمكن أيضًا دمج كائنات النص مثل عمليات البحث مع أوامر vim. على سبيل المثال، ستحذف
d/<pattern>حتى التطابق التالي لهذا النمط، أو سيتغيرcgnإلى التكرار التالي لآخر سلسلةٍ تم البحث عنها.
ما هو التحقق بخطوتين ولماذا يجب أن أستخدمه؟
يضيف التحقق بخطوتين (Two Factor Authentication - 2FA) طبقة حمايةٍ إضافيةً لحساباتك فوق كلمات المرور. لتسجيل الدخول، لا يجب أن تعرف كلمة مرورٍ فحسب، بل يجب أن "تُثبت" بطريقةٍ ما أن لديك إمكانية الوصول إلى جهازٍ ماديٍّ ما. في أبسط الحالات، يمكن تحقيق ذلك عبر استلام رسالة SMS على هاتفك، على الرغم من وجود مشكلاتٍ معروفة مع التحقق بخطوتين عبر SMS. البديل الأفضل الذي نؤيده هو استخدام حلٍّ U2F مثل YubiKey.
أي تعليقات على الاختلافات بين متصفحات الويب؟
المشهد الحالي للمتصفحات اعتبارًا من عام 2020 هو أن معظمها يشبه Chrome لأنها تستخدم نفس المحرك (Blink). هذا يعني أن Microsoft Edge، الذي يعتمد أيضًا على Blink، وSafari، الذي يعتمد على WebKit (محركٌ مشابهٌ لـBlink)، مجرد نسخٍ أسوأ من Chrome. Chrome متصفحٌ جيدٌ بشكلٍ معقولٍ من حيث الأداء وسهولة الاستخدام. إذا أردت بديلًا، فإن Firefox هو توصيتنا. إنه قابلٌ للمقارنة مع Chrome في كل شيءٍ تقريبًا ويتفوق لأسباب الخصوصية. متصفحٌ آخر يُسمى Flow ليس جاهزًا للمستخدمين بعد، لكنه ينفّذ محرك عرضٍ جديدًا يعد بأن يكون أسرع من المحركات الحالية.