اذهب إلى المحتوى

عبدالهادي الديوري

الأعضاء
  • المساهمات

    368
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    22

كل منشورات العضو عبدالهادي الديوري

  1. إن الحصول على الأفكار بحد ذاته يُعتبر إنجازا لك، فالكثير من الكتّاب المُستقلين يعانون من نقص في الأفكار لكتابة مقالات جديدة، ونقص الإلهام عند الكاتب يأتي من عدم ممارسته للكتابة والقراءة بشكل يومي أو شبه يومي. أمّا تنظيم الأفكار أثناء لحظات الإلهام والعصف الذهني فيُكتسب بالطرق التاليّة: - تدوين الفكرة في لحظة وصولها إلى خاطرك مهما بدت سخيفة فالنقد يأتي فيما بعد. - نقد الأفكار المجمّعة وتنقيحها وترتيبها حسب الأهميّة وحسب إمكانيه الكتابة عنها وهل تحتاج لبحث مسبق أم لا. - التركيز على الأفكار المنقّحة ووضع خطّة لتحويلها لمقالات بتقسيم كل فكرة إلى أجزاء صغيرة لتسهل عليك كتابة المقال. - جمع الأفكار في مجموعات مرتبطة مع بعضها سواء من ناحية الجوهر أو الشكل.
  2. يحصل الإنسان على الخبرة في مجال معيّن بعد عدّة مراحل أولها التّعلم، ثم بعد ذلك تطبيق المعلومات التي تعلّمها. لذلك التّعلم وحده لا يكفي إن لم تُصاحبه الممارسة. ولزيادة خبرتك في أي مجال كان، يجب عليك التركيز على ممارسته بشكل مكثّف.يُفضّل أن تكون الممارسة يوميا أو بشكل شبه يوميّ، حاول أن تتحدّى نفسك وأن تضع أهدافا على كل من المدى البعيد والمدى القصير. فمثلا إذا كان مجالك البرمجة، يُمكنك وضع هدف برمجة شيء معيّن، وعليك كتابة الشيفرة يوميّا وسيساعدك ذلك على صقل مهاراتك، كما ستساعدك الممارسة اليوميّة على نقل مشروعك إلى مستوى متقدّم بعد انقضاء كلّ يوم. أمّا إذا كان المجال هو الكتابة، فالكتابة اليومية تُساعد على تطوير مهاراتك الكتابيّة، وتجلب لك الإلهام والأفكار الجديدة، لذلك حاول ألّا ينقضي يوم إلّا وأنت كاتب ولو بضع كلمات على ورقة بيضاء، وحتى إن لم يكن موضوع الكتابة رائعا، المهمّ أن تكتب، كما يُمكنك وضع تحدي كتابة عدد معيّن من الكلمات يوميّا. والشيء نفسه ينطبق على المُصمّمين فالتّصميم يوميّا سيُحسّن مهارتك بالتأكيد. وقس على ذلك باقي المجالات. المهم أن تستمر في الممارسة حتى ولو بقدر بسيط يوميّاً.
  3. إن الحصول على تقييم 5 نجوم ليس بالأمر الصعب كما تظن، فالتقييم العام على موقع مستقل يعتمد على 4 عوامل: الاحترافية أنصحك أن تقدّم عملا احترافياً بمعنى الكلمة، يجب أن تكون راضيّا عمّا تُقدّمه للعميل، وعليك إنجازه للعميل كأنّك تُنجزه لنفسك، فمثلا إن كان العمل عبارة عن مشروع برمجي، فحاول أن تُقدّم برنامجا خاليّا من الأخطاء البرمجيّة مُشبعا بالتعليقات التّي تشرح مبدأ عمل كلّ سطر. التواصل عليك أن تتواصل بشكل إيجابي مع العميل وتجنّب اللغة الجارحة أو المزاح الزائد واللهو في غير مكانه. جودة العمل جودة المنتج النهائي هي العميل الرئيسي الذي يُحدّدُ تقييم العمل، فاحرص على تقديم منتج نهائي خالٍ من الشوائب واسأل صاحب المشروع عن مدى رضاه بالعمل المُنجز. الخبرة خبرتك الجيّدة في موضوع المشروع تجعلك أيضاً على مستوى عالٍ من الاحترافيّة. إلى جانب العوامل الماضيّة، الخبرة تُحدّد مدى إمكانية أن يتعامل معك صاحبُ المشروع مُستقبلاً. إذا أخذت هذه النقاط بعين الاعتبار فلا تقلق، فما دمت تقوم بعملك بشكل جيد وتتواصل مع العميل بحرفيّة فأنت في مأمن من التقييمات السيّئة، وستحصلُ على شهادة جيّدة من صاحب المشروع.
  4. من الصعب أن تجد مثل هذا النوع من العملاء، لذلك فأنت محق في رغبتك في إبقاء التّعامل معه، لديّ بعض النصائح لك:- حاول إخباره بالأمر بصيغة كهذه:" لقد سررت بالتّعامل معك في هذا المشروع وسأكون سعيدا جدّا بالعمل معك مُجدّدا، فلا تتردّد أبداً في التواصل معي إذا كنت ترغب بإنجاز مشروع آخر"- تواصل معه بين الحين والآخر، بإرسال مقال وجدته يتحدّث حول مجال المشروع الذي قمت بإنجازه له، أو أرسل له هديّة ما، وحتى السؤال عن أحواله وأحوال العمل، بهذا ستجعله يتذكرك وسيرجع إليك إذا احتاج إلى إنجاز مشروع جديد، فقط لا تجعل المدّة قصيرة بين كل رسالة وأخرى وإلّا ستُعتبر مزعجا بشكل غير مقبول، وقد يغيّر العميل رأيه فيك.
  5. لا شك أن التخصّص في أحد هذه المجالات سيساعدك كثيرا، لكنّك لست ملزما على احترافه لتُقدّم مقالات عنه، فمثلا إذا كنت تملك بعض الخبرة في لغة البرمجة بايثون وسبق لك أن عملت على مشروع صغير بها، فكلّ ما عليك القيّام به هو اختيّار موضوع المقال (استخدام الدوال مثالا) وثمّ دراسة هذا الموضوع بشكل جيد قبل أن تبدأ في الكتابة، يُمكنك أن تقرأ عنه في الكتب المتاحة لديك، أو أن تستعين بلغتك الأجنبيّة (سواء كانت اللغة الانجليزية أو الفرنسيّة أو غيرهما) لكي تفهم جيّدا موضوعك الذي تريد أن تكتب عنه. حاول أن تكتب المقال لنفسك أولاً، ليكون بمثابة تذكير لك في حالة نسيت ذلك الموضوع وهذا الأمر سيُساعدك على تقديم مقالات ذات جودة عاليّة. والخلاصة أنّك لا تحتاج للتعمق في المجال لتكتب عنه بل ما تحتاجه هو دراسة للموضوع الذي ستكتبُ عنه.
  6. عادة ما يقع المُستقل في مثل هذا المأزق إذا لم يتوقف لبضع دقائق للتفكير في المدة المتوقعة لإنهاء المشروع قبل وضع عرض للعمل عليه، بما أنّك لا تزال تملك بعض الوقت حاول استثماره لإنهاء المهام الجوهريّة والغاية الأهميّة، عليك أن تُخبر صاحب المشروع بكل شيء ولا تحاول أبدا الاحتيّال والالتفاف حول الحقيقة واستعمل لغة واضحة وكلمة طيّبة. إذا كانت الأسباب خارج إرادتك، فعليك أن تخبره بكل شيء مع تجنب لغة توحي بأنك ضحية للتأثير على المشاعر، وفي الغالب سيتفهّم صاحب المشروع الأمر بدون الحاجة للشرح المعمق، أما إذا كان عنيدا فحاول اقتراح خدمة إضافيّة مجانا أو تخفيض الثمن قليلا.
  7. حاول دراسة المشروع جيّدا قبل أن تضع عرضك، أدرُسه من ناحيّة التعقيد وعدد الساعات التي يُمكن أن يُنجز فيها حسب خبرتك بالموضوع وقارن ذلك بعدد السّاعات التي تستطيع أن تعمل فيها يوميّا وحاول أن تضيف دائما بضعة أيام للمدة الكليّة احتياطاً. وإياك أن تقترح وقتا لإنجاز العمل أقل من باقي المستقلّين فقط في سبيل الحصول على العمل. إذا لم تكن متأكدا من أن المُدّة ستكون كافيّة فقد تحصل على تقييم سيء في حال لم تستطع الوفاء بوعدك وقد تفقد العديد من العملاء المُحتملين بسبب ذلك.
  8. تنفيق النقل (أي نقله) عبر نفق SSH آمن (SSH Tunnel)، هو طريقة ممتازة للعمل حول إعدادات جدار ناري تقييدي خاص بـ SSH. ويُعتبر أيضا طريقة رائعة لتشفير أو فك تشفير نقل الشّبكة (network traffic). ضبط تنفيق محلي إلى خادوميُمكن استخدام اتّصالات SSH لتنفيق النقل (أي نقل البيانات عبر أنفاق) من المنافذ على المُضيف المحلي إلى منافذ أخرى على مُضيف بعيد. أوّلاً، يُؤسَّس اتّصال SSH مع المُضيف البعيد. أمّا على الخادوم البعيد، يتم إنشاء اتّصال إلى عنوان شبكة خارجيّة (أو داخليّة) مُقدّم من المُستخدم، والنّقل إلى هذا الموقع يُنفّق (أي يستخدم نفقا) إلى الحاسوب المحلي على منفذ مُحدّد. هذا الأمر يُستخدم عادة للتنفيق نحو بيئة شبكية أقل تقييدا لتجاوز جدار ناري (الأمر أشبه بـآلية عمل VPN)، أي أن هناك طرفا ثالثا (كالبروكسي أو خادوم في منتصف الطريق يمر عليه نقل الشبكة Network traffic). ويُستعمل أيضا بشكل شائع للوصول إلى واجهة ويب من نوع 'مُضيف محلي فقط' من مكان بعيد. لإنشاء نفق محلي نحو الخادوم البعيد، ستحتاج إلى استخدام مُعامل L- عند الاتّصال ويجب عليك توفير 3 معلومات إضافية: المنفذ المحلي الذي ترغب في الوصول إلى الاتّصال المُنفّق منه.المُضيف الذي ترغب في أن يتصل به المُضيف البعيد.المنفذ الذي تريد أن يتصل منه المُضيف البعيد. وهي مُعطاة بالترتيب أعلاه (مُفرّقة بنقطتين بين كل منها) كقيم للمعامل L-. وسنستخدم أيضا المُعامل f- الذي يُحيل SSH للعمل في الخلفيّة قبل التشغيل، وكذلك المُعامل N-، الذي لا يفتح شلّا أو يُنفذ برنامجا على الجهة البعيدة. على سبيل المثال، للاتّصال بـ example.com على المنفذ رقم 80 على المُضيف البعيد، متيحا الاتّصال على جهازك المحلي عبر المنفذ رقم 8888، يُمكنك أن تكتب الآتي: ssh -f -N -L 8888:example.com:80 username@remote_host إذا قمت بالدّخول إلى 127.0.0.1:8888 على مُتصفّحك المحلي، ستحصل على محتوي example.com من المنفذ رقم 80. تركيب جملة أعمّ يُمكن أن يكون كالتّالي: ssh -L your_port:site_or_IP_to_access:site_port username@host بما أنّ الاتّصال يتم في الخلفّية يجب عليك إيجاد رقم PID لقتله (إغلاقه)، يُمكنك فعلُ ذلك بالبحث عن المنفذ الذي وضّفته: ps aux | grep 8888 1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -L 8888:example.com:80 username@remote_host 1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888 يُمكنك بعدها قتلُ العمليّة باستهداف رقم PID، وهو الرقم على العمود الثّاني الذّي يُوافق أمر SSH : kill 5965 هناك خيّار آخر وهو بدء الاتّصال بدون المُعامل f-. الأمر الذي سيُبقي الاتّصال في الواجهة، مانعاً استخدام نافذة الطّرفية كامل مدّة الإحالة. والإفادة هنا هي إمكانية إيقاف النّفق بالضّغط على "CTRL-C”. ضبط تنفيق بعيد إلى خادوميُمكن استعمال اتّصالات SSH لتنفيق النّقل من منافذ على المُضيف المحليّ إلى منافذ على المُضيف البعيد. الاتّصال يُخلق نحو مُضيف بعيد على النفق البعيد، خلال إنشاء النّفق يُحدّد رقم منفذ بعيد. هذا المنفذ على المُضيف البعيد سيُنفّق نحو مُضيف ومنفذ مربوطين من الجهاز المحليّ. هذا سيُخوّل الحاسوب البعيد للوصول إلى مُضيف عبر جهازك المحليّ. يُمكنُ لهذا أن يكونَ مُفيداً إذا احتجتَ للسّماح بالوصول إلى شبكة داخليّة مُغلقة نحو اتّصالات خارجيّة. إذا كان الجدار النّاري يسمح بالاتّصالات خارج الشّبكة فإنّ هذا سيُخولُ لك الاتّصال إلى جهاز بعيد ونفق نقل من ذلك الجهاز نحو مكان على الشبكة الدّاخليّة. لإنشاء نفق بعيد نحو خادومك البعيد، ستحتاج إلى تمرير المعامل R- عند الاتّصال ويجب عليك توفير 3 معلومات إضافيّة: رقم المنفذ الذي يُمكن للمُضيف البعيد أن يصل إلى الاتّصال المُنفّق منه.المُضيف الذي ترغب في أن يتّصل به جهازك المحلي.المنفذ الذي ترغب في أن يتّصل منه جهازك المحليّ. وهي مُعطاة بالترتيب أعلاه (مُفرّقة بنقطتين بين كل منها) كقيم للمعامل R-. وسنستخدم أيضا المُعامل f- الذي يُحيل SSH للعمل في الخلفيّة قبل التشغيل، وكذلك المُعامل N-، الذي لا يفتح شلّا (shell) أو يُنفذ برنامجا على الجهة البعيدة. على سبيل المثال، للاتّصال ب example.com على المنفذ رقم 80 على المُضيف المحليّ، متيحا الاتّصال على الجهاز البعيد عبر المنفذ رقم 8888، يُمكنك أن تكتب الآتي: ssh -f -N -R 8888:example.com:80 username@remote_host إذا قمت بالدّخول إلى 127.0.0.1:8888 على مُتصفّح الخادوم، ستحصل على محتوي example.com من المنفذ رقم 80. تركيب جملة أعمّ يُمكن أن يكون كالتّالي: ssh -R your_port:site_or_IP_to_access:site_port username@host بما أنّ الاتّصال يتم في الخلفّية يجب عليك إيجاد رقم PID لقتله (إغلاقه)، يُمكنك فعلُ ذلك بالبحث عن المنفذ الذي وضّفته: ps aux | grep 8888 1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -L 8888:example.com:80 username@remote_host 1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888 يُمكنك بعدها قتلُ العمليّة باستهداف رقم PID، وهو الرقم على العمود الثّاني الذّي يُوافق أمر SSH : kill 5965 هناك خيّار آخر وهو بدء الاتّصال بدون المُعامل f-. الأمر الذي سيُبقي الاتّصال في الواجهة، مانعاً استخدام نافذة الطّرفية كامل مدّة الإحالة. والإفادة هنا هي إمكانية إيقاف النّفق بالضّغط على "CTRL-C”. ضبط تنفيق ديناميكي نحو خادوم بعيديُمكن استعمال اتّصالات SSH لتنفيق النّقل من منافذ على المُضيف المحليّ إلى منافذ على المُضيف البعيد. النّفق الديناميكي مُماثل للنّفق المحليّ من حيث أنّه يُخول الجهاز المحلي للاتّصال بموارد أخرى عبر مُضيف بعيد. يقوم النّفق الديناميكي بهذا ببساطة عبر تحديد منفذ محلي واحد. التطبيقات التي ترغب في أن تستغلّ الفرصة للتنفيق من هذا المنفذ يجب أن تكون قادرة على التواصل باستخدام بروتوكول SOCKS ليُعاد توجيه الحزم بنجاح على الجانب الآخر من النّفق. النّقلُ المُمَرّر نحو المنفذ المحلي سيُرسَلُ إلى المُضيف البعيد. من هناك سيُترجم بروتوكول SOCKS لإنشاء اتّصالٍ نحو النهاية المرغوبة. هذا الضّبط يسمح لتطبيق من نوع SOCKS-capable بالاتّصال بأي عدد من الأماكن عبر خادوم بعيد بدون أنفاق ساكنة مُتعدد لإنشاء الاتّصال. سنُمرّر المُعامل D- مع رقم المنفذ المحلي الذي نرغب أن نصل إلى النّفق منه. وسنستخدم أيضا المُعامل f- الذي يُحيل SSH للعمل في الخلفيّة قبل التشغيل، وكذلك المُعامل N-، الذي لا يفتح شلّا أو يُنفذ برنامجا على الجهة البعيدة. على سبيل المثال، لإنشاء اتّصال مع نفق على المنفذ "7777” سنكتب الأمر: ssh -f -N -D 7777 username@remote_host يُمكنك الآن أن تبدأ توجيه تطبيق SOCKS-aware (كمُتصفح الويب)، نحو المنفذ الذي اخترته سيرسل التّطبيق معلوماته إلى المقبس المربوط مع المنفذ. طريقة توجيه النّقل نحو منفذ SOCKS تختلف حسب التّطبيق، في فايرفوكس Firefox على سبيل المثال الموقع العام هو: Preferences > Advanced > Settings > Manual proxy configurations أما في Chrome فتستطيع تشغيل التطبيق مع تحديد مُعامل –proxy-server= . سترغب في استخدام واجهة المُضيف المحلي (localhost interface ) ورقم المنفذ الذي أحَلْتَه. بما أنّ الاتّصال يتم في الخلفّية يجب عليك إيجاد رقم PID لقتله (إغلاقه)، يُمكنك فعلُ ذلك بالبحث عن المنفذ الذي وضّفته: ps aux | grep 8888 1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -D 7777 username@remote_host 1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888 يُمكنك بعدها قتلُ العمليّة باستهداف رقم PID، وهو الرقم على العمود الثّاني الذّي يُوافق أمر SSH : kill 5965 هناك خيّار آخر وهو بدء الاتّصال بدون المُعامل f-. الأمر الذي سيُبقي الاتّصال في الواجهة، مانعاً استخدام نافذة الطّرفية كامل مدّة الإحالة. والإفادة هنا هي إمكانية إيقاف النّفق بالضّغط على "CTRL-C”. استعمال شيفرات الإلغاء للتحكم بالاتّصالاتحتى عند إنشاء جلسة SSH، يُمكن التحكم في الاتّصال من داخل الطرفيّة. يُمكن القيام بهذا مع شيء اسمه "شيفرات الإلغاء (SSH escape codes)” والتي تُخوّل لنا التّفاعل مع تطبيق SSH المحلي من داخل الجلسة. إجبار إلغاء الاتّصال من جهة العميل (كيف تخرج من جلسة مُتجمّدة لا تقبل الإجابة)تعتبر إمكانيّة التحكم في جوانب مُعيّنة من الجلسة بالدّاخل من أهم مُميّزات OpenSSH التي غالبا ما لا يُلاحظها الكثيرون. يُمكن تشغيل هذه الأوامر بتقديمها برمز التحكم "~" داخل جلسة SSH. ستُفسّرُ أوامر التحكم فقط إذا كانت أول شيء مكتوب بعد سطر جديد، لذلك اضغط دائما على ENTER مرّة أو مرّتين كإجراء احتياطي. من أكثر الإمكانيات التي يُتيحها التحكم قوة هي إمكانية إلغاء الاتّصال من جهة العميل. اتّصالات SSH عادة ما تُغلق من طرف الخادوم، لكنّ هذا يُمكن أن يكون مُشكلة إذا كانت هناك مشاكل في الخادوم أو إذا قُطع الاتّصال. يُمكن أن تُغلق الاتصال بشكل نظيف من جهة العميل. لإغلاق اتّصال من العميل، استخدم رمز التحكم "~”، مع إضافة نقطة "." . إذا كانت هناك مشاكل في الاتّصال في الغالب ستجد نفسك مع جلسة طرفيّة مُتجمّدة. اكتب الأمر ولو لم تشعر بأنك تكتب شيئا: [ENTER] ~. يجب على الاتّصال أن يُغلق فورا، وسيرجعك إلى جلسة الشل المحليّة. وضع جلسة SSH في الخلفيّةتعتبر إمكانيّة التحكم في جوانب مُعيّنة من الجلسة بالدّاخل من أهم مُميّزات OpenSSH التي غالبا ما لا يُلاحظها الكثيرون. يُمكن تشغيل هذه الأوامر بتقديمها برمز التحكم "~" داخل جلسة SSH. ستُفسّرُ أوامر التحكم فقط إذا كانت أول شيء مكتوب بعد سطر جديد، لذلك اضغط دائما على ENTER مرّة أو مرّتين كإجراء احتياطي. يُعطينا التحكم إمكانية وضع جلسة SSH لتعمل في الخلفيّة. وللقيّام بذلك سنحتاج إلى كتابة رمز التحكم "~" وننفّذ بعده اختصار لوحة المفاتيح (CTRL-Z) لوضع العمليّة في الخلفيّة : [ENTER] ~[CTRL-Z] ما قمنا به سينقل الاتّصال ليعمل في الخلفيّة، وسيرجعنا إلى جلسة الشل المحليّة. للرجوع إلى جلسة SSH يُمكنك استعمال آليّة التّحكم. يُمكنك إعادة تفعيل آخر عمليّة محالة إلى الخلفية بكتابة: fg إذا كنت تملك أكثر من عمليّة في الخلفيّة، يُمكنك رؤية العمليّات المتاحة بكتابة: jobs [1]+ Stopped ssh username@some_host [2] Stopped ssh username@another_host يُمكنك بعد ذلك جلب أي عمليّة إلى الأمام باستعمال الدليل في العمود الأول مع رمز % : fg %2تعديل إعدادات إحالة منفذ على اتّصال SSH موجودتعتبر إمكانيّة التحكم في جوانب مُعيّنة من الجلسة بالدّاخل من أهم مُميّزات OpenSSH التي غالبا ما لا يُلاحظها الكثيرون. يُمكن تشغيل هذه الأوامر بتقديمها برمز التحكم "~" داخل جلسة SSH. ستُفسّرُ أوامر التحكم فقط إذا كانت أول شيء مكتوب بعد سطر جديد، لذلك اضغط دائما على ENTER مرّة أو مرّتين كإجراء احتياطي. هذه الميّزة تسمح لنا بالتعديل على إعدادات إحالة المنفذ بعد أن يؤسّس بالفعل اتّصال مُسبق، ويُخوّل لك إنشاء أو هدم قواعد إحالة منفذ في الوقت الفعلي. هذه القدرات جزء من واجهة سطر أوامر SSH، ويُمكن الوصول إليها خلال الجلسة باستخدام رمز التّحكم (~) و"C" : [ENTER] ~C ssh> سوف تُمنَح موجه أوامر خاص بSSH، موجه الأوامر هذا يتيح مجموعة محدودة جدّا من الأوامر، يمكنك كتابة h- من الموجه لرؤية الخيّارات المتاحة. إذا كانت المُخرجات خاليّة، سيجب عليك زيادة إسهاب (verbosity) مخرجات SSH باستخدام v~ عدّة مرّات: [ENTER] ~v ~v ~v ~C -hCommands: -L[bind_address:]port:host:hostport Request local forward -R[bind_address:]port:host:hostport Request remote forward -D[bind_address:]port Request dynamic forward -KL[bind_address:]port Cancel local forward -KR[bind_address:]port Cancel remote forward -KD[bind_address:]port Cancel dynamic forwardوكما ترى، يُمكنك بسهولة تنفيذ أي من الخيارات باستخدام الخيّار المناسب (اُنظر قسم الإحالة لمزيد من المعلومات). يُمكنك أيضا هدم نفق مع الأمر K- قبل رمز نوع الإحالة. على سبيل المثال، لإغلاق إحالة محليّة (L-)، يمكنك أن تستعمل الأمر KL-. وستحتاج إلى توفير رقم المنفذ. لضبط إحالة منفذ محلي، يمكنك استعمال: [ENTER] ~C -L 8888:127.0.0.1:80 يستطيع المنفذ 8888 على جهازك المحلي الآن التواصل مع خادوم الويب على المُضيف الذي تتصلُ به. عندما تنتهي، يُمكنك أن تهدم الإحالة بكتابة: [ENTER] ~C -KL 8888خاتمةالتعليمات أعلاه يجب أن تغطي مُعظم ما يحتاجه المستخدمون عن SSH. إذا كان لديك أي نصائح أخرى أو إذا رغبت في نشر الإعدادات والطّرق المُفضّلة لديك، خذ راحتك ولا تتردد في استخدام التعليقات أدناه. ترجمة -مع شيءٍ من التصرّف- للقسم الثالث والأخير من مقال: SSH Essentials: Working with SSH Servers, Clients, and Keys. حقوق الصورة البارزة: Designed by Freepik.
  9. هذا القسم سيُغطّي بعضاً من أساسيّات الاتّصال بخادوم مع SSH، وهو تكملة لسلسلة "مدخل إلى ssh"، بعد أن تكلمنا في الدرس الأول منها عن العملاء والمفاتيح. الاتصال بخادوم عن بعدللاتّصال بخادوم عن بعد وفتح جلسة طرفية هناك، يمكنك استعمال أمر ssh. أبسط طريقة تفترض أنّ اسم المُستخدم الخاصّ بك هو نفسه اسم المُستخدم على الخادوم، إذا كان هذا صحيحاً، يُمكنك الاتّصال باستخدام: ssh remote_host إذا كان اسم المُستخدم مختلفاً على الخادوم، ستحتاج إلى تمرير اسم مستخدم الخادوم كالتالي: ssh username@remote_host في المرة الأولى التّي تتصل بمُضيف جديد، سترى رسالة تبدو كالتّالي: The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe. Are you sure you want to continue connecting (yes/no)? yesاكتب yes لإكمال الاتّصال بالمُضيف. إذا كنت تستخدم فحص لكلمة المرور، سيُطلب منك إدخالها هنا. إذا كنت تستخدم مفاتيح SSH، سيُطلب منك إدخال كلمة المُرور لمفتاحك الخاصّ إذا كنت قد عيّنتها من قبل، إذا كان الأمر غير ذلك فستدخل آلياً إلى الخادوم. تشغيل أمر واحد على الخادوم البعيدلتشغيل أمر واحد على الخادوم عن بعد عوضا عن فتح جلسة طرفية، يُمكنك إضافة الأمر بعد معلومات الاتّصال: ssh username@remotehost الأمرالمُراد_تشغيله هذا الأمر سيقوم بالاتصال بالخادوم، ثم يستثيق باستخدام المعلومات وينفّذ الأمر الذي حدّدته. وسيُغلق الاتّصال مُباشرة بعد ذلك. الدخول إلى خادوم من منفذ آخريقوم عفريت SSH (بالانجليزية: ssh daemon وهو برنامج يعمل في الخلف بشكل دائم على النظام) بالدّخول إلى الخادوم من المنفذ رقم 22 تلقائيّاً. عميل SSH الخاص بك سيفترض أن هذه هي الحالة عند مُحاولة الاتّصال. إذا كان خادوم SSH يستمع من منفذ غير معياريّ (سيُشرح الأمر لاحقا في قسم آخر)، سيجب عليك تحديد رقم المنفذ الجديد عند محاولة الدّخول. يُمكنك فعل هذا بتحديد رقم المنفذ مع خيّار p-: ssh -p رقم_المنفذ username@remote_host لتجنّب فعل هذا في كلّ مرة تدخلُ إلى الخادوم، يُمكنك إنشاء أو تعديل ملفّ إعدادات في مُجلّد ssh./~ داخل مُجلّد المنزل في جهازك المحليّ. عدّل أو أنشئ الملفّ بكتابة: nano ~/.ssh/config يُمكنك هنا تحديد إعدادات خيارات المُضيف. لتحديد منفذ جديد، استخدم نموذجاً كالتّالي: Host remote_alias HostName remote_host Port port_num هذا سيُمكّنك من الدّخول إلى الخادوم بدون تحديد رقم المنفذ كلّ مرة من سطر الأوامر. إضافة مفاتيح SSH إلى عميل SSH لتجنب كتابة كلمة المرورإذا كنت تمتلك جملة مرور على المفتاح الخاص، سيُطلب منك كتابتها في كلّ مرة تحاول الاتّصال بالمُضيف. لتجنّب الأمر، يُمكنك تشغيل عميل SSH. وهو أداة صغيرة تُخزّن مفتاحك الخاص بعد كتابة كلمة المرور للمرّة الأولى. وستكون مُتاحة طوال مدة جلسة الطّرفيّة، وستخوّل لك الاتصال بدون إعادة كتابة كلمة المرور في المستقبل. هذا الأمر مهم أيضا إذا كنت تريد إحالة معلومات SSH الخاصّة بك (مُبيّنٌ أدناه). لتشغيل عميل SSH، اكتب في جلسة طرفيّة جهازك المحلي: eval $(ssh-agent)هذا الأمر سيُشغّل عميل SSH في الخلفيّة. الآن عليك أن تُضيف مفتاحك الخاصّ إلى العميل لكي يتمكن من إدارتها: ssh-add Enter passphrase for /home/demo/.ssh/id_rsa: Identity added: /home/demo/.ssh/id_rsa (/home/demo/.ssh/id_rsa) سيتوجب عليك كتابة كلمة المرور (في حال عيّنتها). بعدئذٍ ملف الهوية الخاص بك سيُضاف إلى العميل متيحا لك استخدام مفتاحك بدون إعادة إدخال كلمة المرور مُجدّداً. إحالة معلومات SSH الخاصة بك لاستخدامها على خادومإذا كنت ترغب في أن تكون قادراً على الاتّصال بدون كلمة مرور من خادوم إلى آخر، سيتوجب عليك إحالة معلومات SSH الخاصّة بك. ما يخوّلك للاتّصال بخادوم آخر من الخادوم الذي تتّصل به، باستخدام المعلومات على جهازك المحلي. للبدء يجب عليك أن تمتلك عميل SSH مُشغلا ومضافٌ إليه مفتاح SSH الخاص بك (انظر أعلاه). بعد الانتهاء من هذا، ستحتاج إلى الاتّصال بالخادوم الأول باستعمال خيّار A-. هذا الأمر يحيل معلوماتك إلى الخادوم للجلسة الحالية: ssh -A username@remote_host من الآن يُمكنك الاتصال بمُضيف جديد مُخوّل له الوصول من مفتاح SSH وسوف تدخل كما لو أن مفتاحك الخاص موجود على الخادوم. إعدادات جهة الخادوم Server-Sideهذا القسم يحتوي على بعض من أشهر خيارات إعدادات جهة الخادوم التي يمكن لها تشكيل طريقة استجابة الخادوم وأي من أنواع الاتّصال المسموح بها. تعطيل فحص كلمة مرورإذا كنت قد ضبطت مفاتيح SSH واختبرتها وتعاملت بها بشكل جيّد، يعتبر تعطيل الفحص بكلمة المرور فكرة جيّدة، هذا سيمنع أي مُستخدم من الاتصال باستخدام SSH مع كلمة مرور. لفعل هذا، اتصل بخادومك وافتح ملفّ etc/ssh/sshd_config/ بصلاحيّات الجذر: sudo nano /etc/ssh/sshd_config ابحث داخل الملفّ عن PasswordAuthentication إذا كانت تعليقا أزل رمز التعليق واجعلها no لتعطيل الدخول بكلمة المرور: PasswordAuthentication no بعد أن تقوم بالتغيير، احفظ وأغلق الملف. يجب عليك إعادة تشغيل خدمة SSH لتطبيق التغييرات. على أبنتو/دبيان: sudo service ssh restart على فيدورا / CentOS: sudo service sshd restart الآن جميع الحسابات على النظام ستمنع من الدّخول باستخدام كلمة مرور. تغيير منفذ عفريت SSH (بالانجليزية: ssh daemon)ينصح بعض الإداريين بتغيير منفذ SSH الافتراضي، يمكن لهذا أن يعين في تقليل عدد محاولات الاتّصال إلى خادومك من قبل البرمجيات الخبيثة. لتغيير المنفذ، سيتوجب عليك الدخول إلى الخادوم الخاص بك. ثم افتح ملفّ sshd_config على الخادوم بصلاحيات الجذر: sudo nano /etc/ssh/sshd_config عندما تدخل، يمكنك تغيير المنفذ الذي يشتغل منه SSH بإيجاد مواصفة Port 22 وتغييرها إلى رقم المنفذ الذي تريد استخدامه. مثلاً لتغيير المنفذ إلى 4444، ضع هذا في ملفّك: Port 4444 احفظ وأغلق الملفّ عندما تنتهي. يجب عليك إعادة تشغيل SSH لتطبيق التغييرات: على أبنتو/دبيان: sudo service ssh restart على فيدورا/سنت أو إس: sudo service sshd restart بعد إعادة التّشغيل ستحتاج إلى إلى الفحص بتحديد رقم المنفذ (شُرح سابقاً) تحديد المستخدمين الذين يمكن لهم الاتّصال عبر SSHيُمكنك اتّخاذ خذ بعض الإجراءات لتحديد المُستخدمين الذين يمكنهم الاتّصال عبر SSH، ويمكن ذلك عبر تعديل ملفّ إعدادات SSH. افتح هذا الملف على الخادوم بصلاحيات الجذر: sudo nano /etc/ssh/sshd_config الطريقة الأولى لتحديد المستخدمين الذين يمكن لهم الاتّصال هي عبر خاصّية AllowUsers . ابحث عن AllowUsers في الملفّ. إذا لم يكن السّطر موجودا فأنشئه في أي مكان. أدرج بعدها اسماء المستخدمين المرغوب في السّماح لهم بالاتّصال عبر SSH: AllowUsers user1 user2 احفظ وأغلق الملفّ. أعد تشغيل SSH لتطبيق التغييرات. على أبنتو/دبيان: sudo service ssh restart على فيدورا/سنت أو إس: sudo service sshd restart إذا كنت مرتاحا مع إدارة المجموعات أكثر، يُمكنك استعمال AllowGroups . في حال كنت ترغب في ذلك أضف المجموعة التي سيُسمح لها بالاتصال (سوف ننشئ هذه المجموعة وسنضيف إليها الأعضاء بعد قليل): AllowGroups sshmembers احفظ وأغلق الملفّ. يُمكنك الآن إنشاء مجموعة (بدون مجلد منزل) توافق المجموعة التّي حدّدتها بكتابة: sudo groupadd -r sshmembersتأكّد من أنّك أضفت حساب المستخدم الذي تريد إلى هذه المجموعة. يُمكن القيام بالأمر كالتالي: sudo usermod -a -G sshmembers user1 sudo usermod -a -G sshmembers user2 أعد تشغيل SSH لتطبيق التّغييرات. على أبنتو/دبيان: sudo service ssh restart على فيدورا/سنت أو إس: sudo service sshd restart تعطيل ولوج الجذر rootيعد تعطيل ولوج الجذر عبر SSH منصوحا به بعد أن تضبط حساب مستخدم بميزة sudo. لفعل ذلك، افتح على الخادوم ملف إعدادات SSH باستخدام الجذر أو مع sudo . sudo nano /etc/ssh/sshd_configابحث عن PermitRootLogin إذا كانت تعليقا أزل رمز التعليق واجعلها no: PermitRootLogin noاحفظ الملف وأغلق الملف وأعد تشغيل SSH لتطبيق التّغييرات. على أبنتو/دبيان: sudo service ssh restart على فيدورا/سنت أو إس: sudo service sshd restart إتاحة وصول الجذر لأوامر معينةهناك بعض الحالات التي قد ترغب فيها بتعطيل وصول الجذر عامّة، والسّماح لبرمجيّات معيّنة للوصول إليه لتعمل بشكل صحيح، ويُمكنك أن تأخذ النّسخ الاحتياطي كمثال. يُمكن القيّام بهذه العملية عبر ملف authorized_keys الخاصّ بمستخدم الجذر، الذي يحتوي على المفاتيح المُخوّلِ لها استخدام الحساب. أضف المفتاح الذي ترغب في استعماله من جهازك المحلي (يُنصح بإنشاء مفتاح جديد لكل عملية تلقائيّة ) إلى ملفّ authorized_keys الخاصّ بمستخدم الجذر على الخادوم. سنشرح مع أمر ssh-copy-id هنا، لكنك تستطيع أي طريقة أخرى للنسخ المفاتيح (ستُشرح في قسم آخر): ssh-copy-id root@remote_host ادخل الآن إلى الخادوم البعيد، سنحتاج إلى ضبط الدّخول على ملفّ authorized_keys لذلك افتحه باستخدام الجذر أو مع sudo. sudo nano /root/.ssh/authorized_keys في بداية سطر المفتاح الذي نسخته، أضف =command لكي تُعرّف الأمر الذي يصلح له المفتاح. يجب أن يتضمن مسار الملف القابل للتنفيذ مع أي معامل: command="/path/to/command arg1 arg2" ssh-rsa احفظ وأغلق الملفّ عندما تنتهي. افتح ملفّ sshd_config باستخدام الجذر أو مع sudo: sudo nano /etc/ssh/sshd_config ابحث عن PermitRootLogin وغيّر القيمة إلى forced-commands-only.هذه العمليّة ستسمح للمفاتيح باستخدام الجذر فقط عند تحديد أمر للمفتاح: PermitRootLogin forced-commands-onlyاحفظ الملف وأغلق الملف وأعد تشغيل SSH لتطبيق التّغييرات. على أبنتو/دبيان: sudo service ssh restart على فيدورا/سنت أو إس: sudo service sshd restart إحالة تطبيق X لعرضه للعميليُمكن ضبط SSH لإحالة تطبيقات X وعرضها على الجهاز المحلي تلقائيّاً. لينجح الأمر يجب على العميل امتلاك مدير نوافذ X مضبوط ومتاح. لاتاحة هذه الوظيفة ادخل إلى الخادوم البعيد وعدّل ملفّ sshd_config باستخدام حساب الجذر أو مع sudo: sudo nano /etc/ssh/sshd_config ابحث عن X11Forwarding إذا كانت تعليقا أزل رمز التعليق ومرّر القيمة yes: X11Forwarding yes احفظ الملف وأغلق الملف وأعد تشغيل SSH لتطبيق التّغييرات. على أبنتو/دبيان: sudo service ssh restart على فيدورا/سنت أو إس: sudo service sshd restart للاتّصال بالخادوم وإحالة عرض تطبيق ما، يجب عليك تمرير مُعامل X- من جهة العميل عند الاتصال: ssh -X username@remote_host التطبيقات الرسوميّة المفتوحة على الخادوم في الجلسة الحاليّة يجبُ أن تُعرض على الجهاز المحلي. يُمكن أن يكون الأداء بطيئا قليلاً، لكنّه جيد ومجدي في بعض الحالات. خيارات إعدادات جهة العميلفي هذا القسم، سنركّز على بعض التعديلات التي يُمكنك القيّام بها على جهة العميل من الاتّصال. تحديد خصائص معلومات الاتّصال بالخادوميُمكنك تحديد إعدادات على جهازك المحلي لبعض أو لجميع الخوادم التي تتصل بها. ويُمكن تخزينُ هذه الإعدادات على ملفّ ssh/config./~ والذي يُمكن قراءته من طرف عميل SSH في كل مرة يُستدعى فيها. أنشئ أو افتح الملفّ بمحرّر نصوص على جهازك المحليّ: nano ~/.ssh/config يُمكنك تحديد الإعدادات التي ترغب فيها بداخل هذا الملف بتقديم كل منها مع كلمة Host متبوعة بكنية (alias). وتحت السّطر يُمكنك تحديد أي من التّعليمات الموجودة على صفحة man ssh_config بشرط أن تكون بمسافة بادئة: man ssh_config كمثال عن الإعدادات: Host testhost HostName example.com Port 4444 User demo يُمكنك بعد ذلك الاتّصال ب example.com على المنفذ 4444 باستخدام اسم المُستخدم “demo” بكتابة: ssh testhostيُمكنك أيضاً استخدام حروف البدل (wildcards) لموافقة أكثر من مُضيف. تذكّر أن الموافقات اللاحقة يُمكنها الكتابة فوق السّابقة، لذلك يجب عليك أن تضع الموافقات العامّة في الأعلى. على سبيل المثال، يمكنك أن تعطل إحالة X بشكل افتراضي لجميع الاتصالات، بوضع التالي في ملفّك: Host * ForwardX11 no Host testhost HostName example.com ForwardX11 yes Port 4444 User demo احفظ وأغلق الملفّ عندما تنتهي. إبقاء الاتّصالات حيّة لتجنّب نفاذ الوقت (Timeout)إذا وجدت نفسك خارج جلسة SSH قبل أن تكون جاهزا لذلك، من المُحتمل أنّ وقت الاتّصال ينفذ. يُمكنك ضبط العميل لإرسال حزمة إلى الخادوم بين الحين والآخر لتجنّب هذه المسألة: يُمكنك ضبط هذا على جهازك المحليّ لكل اتّصال بتعديل ملفّ ssh/config./~. افتح الآن: nano ~/.ssh/config إذا لم تملك سطرا يوافق جميع المضيفين أعلى الملفّ فقم بإضافته. ثم أضف ServerAliveInterval بقيمة "120” لإرسال حزمة إلى الخادوم كلّ دقيقتين. هذا كافٍ لإبلاغ الخادوم بعدم إغلاق الاتّصال: Host * ServerAliveInterval 120 احفظ وأغلق الملفّ عندما تنتهي. تعطيل التحقق من المضيففي الحالة الافتراضية، كلّما اتّصلتَ بخادومٍ جديد، ستُعرضُ لك بصمة مفتاح: SSH. The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe. Are you sure you want to continue connecting (yes/no)? yes هذا الأمر مضبوط لكي تتأكد من الفحص المُضيف الذي تُحاول الاتّصال به وتجنب إمكانية أن يتنكر مستخدم خبيث في هيئة المُضيف البعيد. قد ترغب في تعطيل هذه الميزة في بعض الحالات. ملاحظة: هذا الأمر يمكن أن يكون خطيرا جدّا أمنيا، لذلك تأكد من أنك تعرف ما تفعله إذا قُمت بضبط النظام هكذا. للقيّام بالأمر، افتح ملفّ ssh/config./~ على جهازك المحليّ: nano ~/.ssh/config إذا لم تملك سطرا يوافق جميع المضيفين أعلى الملفّ فقم بإضافته. ثم أضف StrictHostKeyChecking بقيمة no لإضافة مضيفين جدد تلقائيّا إلى ملفّ known_hosts، وأضف UserKnownHostsFile بقيمة /dev/null/ لعدم التحذير على مُضيف جديد أو مُضيف معدّل: Host StrictHostKeyChecking no UserKnownHostsFile /dev/nullيُمكنك تشغيل التحقق لكل حالة على حدة بعكس هذه الخيّارات لمضيفين آخرين. القيمة الافتراضية ل StrictHostKeyChecking هي "ask”: Host testhost HostName example.com StrictHostKeyChecking ask UserKnownHostsFile /home/demo/.ssh/known_hostsمضاعفة SSH خلال اتصال TCP واحدهناك بعض الحالات التي يُمكن أن يأخذ فيها إنشاء اتّصال TCP وقتا أطول من المعتاد. إذا كنت تقوم باتّصالات متعدّدة إلى نفس الجهاز، يُمكنك استغلال ميّزة المُضاعفة. مُضاعفة SSH تقوم بإعادة استخدام نفس اتّصال TCP لجلسات SSH مُتعدّدة. وبهذا يتجنّب بعض العمل الضروري لإنشاء جلسة جديدة الشيء الذي يسرع الأمر، الحد من عدد الاتّصالات قد يكون مُجديّا أيضا لأسباب أخرى. لإعداد المُضاعفة، يُمكنك إعداد الاتّصالات، أو يُمكنك ضبط العميل لاستعمال المُضاعفة عندما تكون متاحة. سنشرح الخيار الثاني هنا. لإعداد المُضاعفة، عدّل ملف إعدادات عميل SSH على الحاسوب المحلي: nano ~/.ssh/config إذا لم تملك سطرا يوافق جميع المضيفين أعلى الملفّ فقم بإضافته الآن (مثل Host *). سنضبط القيم ControlMaster , ControlPath و ControlPersist لإنشاء إعدادات المُضاعفة. يجب أن يكون ControlMaster بقيمة auto لتخويل المُضاعفة تلقائيّا عندما تكون متاحة. ControlPath سيكون مسار تحكم المقبس. الجلسة الأولى ستنشئ هذا المقبس وستكون الجلسات اللاحقة قادرة على إيجاده لأنه موسوم من طرف المُستخدم، المُضيف والمنفذ. ضبط خيّار ControlPersist مع القيمة 1 ستُخوّلُ اتّصال الرئيس الأولي( initial master) ليعمل في الخلفية. 1 تعني أن اتّصال TCP يجب أن ينتهي بعد ثانية واحدة من إغلاق آخر جلسة SSH: Host * ControlMaster auto ControlPath ~/.ssh/multiplex/%r@%h:%p ControlPersist 1احفظ وأغلق الملفّ عندما تنتهي. نحتاج الآن لإنشاء المجلّد الذي حدّدناه في مسار التحكم: mkdir ~/.ssh/multiplexأي جلسة تُنشئ الآن مع نفس الجهاز ستُحاول استعمال المقبس الموجود واتّصال TCP. عندما تكون آخر جلسة موجودة، سيُهدمُ الاتّصال بعد ثانيّة واحدة. إذا كنت تريد تجنب إعدادات المُضاعفة لسبب ما مؤقتا، يُمكنك فعلُ ذلك بتمرير مُعامل S- مع قيمة none: ssh -S none username@remote_host تحدثنا في هذا الدرس عن كيفية إنشاء إتصال بخادوم بعيد بشكل آمن وبخيارات متعددة سواءً من جهة الخادوم أو من جهة العميل (المستخدم)، سنتحدث في المقال القادم إن شاء الله عن أنفاق ssh، ماهيتها، وكيفية إعدادها. ترجمة -مع شيءٍ من التصرّف- للقسم الثاني من مقال: SSH Essentials: Working with SSH Servers, Clients, and Keys. حقوق الصورة البارزة: Designed by Freepik.
  10. بايثون (Python) لغة ممتازة لبرمجة الويب نظرا لمرونتها وأدائها العالي. أطُرُ الويب يمكن أن تجعل برمجة تطبيقات الويب أبسط بكثير لأنها توصل العديد من المكونات الضرورية مع بعضها للحصول على تطبيق قوي. في حين تهدف بعض أطر الويب إلى توفير كل شيء يمكن أن يرغب به المستخدم لتطوير تطبيق ما، هناك أطر أخرى تحاول البقاء بعيدا والاهتمام بالأهم، Bottle إطار للغة بايثون يندرج ضمن النوع الثاني. إنه بالفعل خفيف ومصغر، لكنه يجعل تطوير التطبيقات سهلا وسريعا. في هذا المقال، سنعرض طريقة ضبط واستعمال إطار العمل المصغّر Bottle لإنشاء تطبيقات ويب بسيطة وباستعمال لغة Python. كيفية تثبيت Bottleتثبيت Pythonإطار Bottle مبني على لغة Python وهي مثبتة مسبقا على أنظمة لينكس وOS X، أما بالنسبة لنظام Windows فيمكن تنصيب Python 2 عبر تحميلها من موقعها الرسمي. الجدير بالذّكر أن هذا الدّرس خاصّ بالإصدار الثاني من بايثون (Python 2.x). تثبيت وتفعيل بيئة وهميةسنثبت حزمة virtualenv لعزل مشروع بايثون الخاص بنا من بيئة بايثون الخاصة بالنظام. يمكننا فعل هذا بسهولة عبر تنصيب أداة إدارة الحزم الخاصة ببايثون واسمها pip. لتنصيب pip على Ubuntu يكفي تنصيب virtualenv مباشرة، فهي إحدى اعتمادياته: sudo apt-get update sudo apt-get install python-virtualenv بالنسبة لأنظمة OS X و Windows يمكن تنصيبه بتنصيب pip ثم تنصيب virtualenv عبرها: أو احفظ هذا الملف على جهازك، ثم نفذ الأمر التالي على نافذة الأوامر بالنسبة لـ Windows أو Terminal بالنسبة لـِ Mac OS X، في كلا النظامين، ستحتاج أن تنفذ الأمر التالي بصلاحيات المدير: python get-pip.pyبرنامج virtualenv عبارة عن بيئة وهمية لبايثون لتنصيب مكتبات بايثون في معزل عن بيئة بايثون الحقيقية على النظام، هذا مهم جدا لعزم اعتماديات مشروع الويب الخاص بك وما يحتاجه من حزم عن الحزم العامة المنصبة على كافة النظام، تحتوي بيئة مشاريع بايثون الخاصة بنا على حزمنا فقط، لكي لا تؤثر على نظام التشغيل ككل. سننشئ مجلد المشاريع projects في مجلد Home أو ماشابه، ثم نقوم بإنشاء بيئة وهمية في هذا المجلد، بالنسبة لـ Windows يمكن تنفيذ هذه الأوامر باستخدام طرفية PowerShell: mkdir ~/projects cd ~/projects virtualenv --no-site-packages venv هذا سينشئ مجلدا باسم venv داخل مجلد المشاريع. لقد تُبِّتت بعض أدوات بايثون داخل هذا المجلد وأنشِئَت بنية مجلد لتثبيت أدوات إضافية. يجب علينا تفعيل البيئة الوهمية قبل بداية العمل على مشروعنا : source venv/bin/activateالأمر المُخرَج سيتغير لعكس حقيقة أننا نقوم بعمليات داخل بيئة وهمية الآن. وسيكون كالتالي: (venv)user@Hostname:~/projects$إذا أردت الخروج من البيئة الوهمية، يمكنك في أي وقت كتابة الأمر التالي : deactivateملاحظة: لا تخرج من البيئة الوهمية حاليا. تثبيت Bottleأداة pip تُمكنك من تثبيت حزم بايثون بسهولة من دليل حزم بايثون Python package index، وهو مستودع مُفهرس لمكتبات بايثون. إذا أردنا البحث عن حزم بايثون المتعلقة بـِ Bottle، يمكن تنفيذ: pip search bottleسنبدأ بتثبيت حزمة Bottle فقط: pip install bottleبعد إنتهاء العملية، سنتمكن من استخدام إطار Bottle داخل تطبيقاتنا. إنشاء أول تطبيق باستخدام Bottleكمعظم الأطر، Bottle يطبق نسخة من النمط البرمجي MVC .MVC اختصار لـِ Model, view, controller نموذج،عرض،هيكل؛ وهو أمر للفصل بين عوامل مختلفة بين واجهة المستخدم والمنطق البرمجي. النموذج model تمثيل لمجموعة من البيانات وهو مسؤول عن تخزين، استعلام، وتحديث البيانات.العرض view مسؤول عن كيفية تقديم المعلومة للمستخدم. ويُستخدم لتشكيل وضبط عرض البيانات.الهيكل controller هو مركز العمليات الرئيسي للتطبيق، والذي يقرر كيفية الإجابة لطلبات المستخدم.تطبيقات bottle يمكنها أن تكون بسيطة للغاية. في شكلها البسيط يمكنها تنفيذ جميع المكونات في ملف واحد. سنقوم بإنشاء تطبيق "مرحبا بالعالم" لعرض كيفية العمل. باستعمال محررك المفضل (في هذه الحالة سنستعمل محرر سطر الأوامر nano، بالنسبة لنظام Windows يمكنك استعمال محرر مرئي)، أنشئ تطبيق بايثون باسم hello.py: nano hello.pyفي هذا الملف، سنقوم أولا باستدعاء بعض الوظائف من حزمة Bottle. الأمر الذي سيمكننا من استخدام أدوات الإطار داخل تطبيقنا: from bottle import route, runهذا السطر يخبر برنامجنا بأننا نحتاج إلى استيراد المسار route وتشغيل النماذج modules من حزمة Bottle. نموذج run الذي قمنا باستيراده يمكن أن يُستعمل لتشغيل التطبيق في خادوم التطوير، الشيء الذي يعتبر جيداً لرؤية نتائج برنامجك بسرعة. نموذج route مسؤول عن إخبار التطبيق بالتعامل مع أي من طلباتURL باستخدام أي من دوال بايثون.تطبيقات Bottle تنفّذ التوجيه routing باستدعاء دالّة بايثون واحدة لكلّ طلب من طلبات URL. وتقوم بعد ذلك بإرجاع نتائج الدالة للمُستخدم. نستطيع إضافة توجيه سيُوافق رابط URL /hello from bottle import route, run @route('/hello')هذا التوجيه سيوافق رابط URL /hello عندما يتمّ طلب هذا المسار على الخادوم. ستُنفّذ الدّالة التّابعة مباشرة: # -*- coding: utf-8 -*- from bottle import route, run @route('/hello') def hello(): return u"<h1>مرحباً بالعالم</h1>"ملاحظات: السطر # -*- coding: utf-8 -*- مسؤولٌ عن دعم اليونيكود وبالتالي اللغة العربية، فهو يخبر مفسر بايثون أن هذا الملف به أحرف unicode غير الأحرف الانجليزية.حرف u (اختصارًا لـ unicode) قبل النص العربي مهم أيضا لإخبار بايثون أن هذه السلسلة النصية بالضبط تحتوي على أحرف يونيكود وبالتالي يعامل السلسلة النصية بطريقة خاصة.هذه الدّالة بسيطة جدّاً، لكنّها كافية لإكمال المتطلّب الوحيد لدالّة توجيه: تقوم بإرجاع قيمة يُمكن عرضها على المتصفّح. في هذه الحالة، القيمة عبارة عن نص HTML. يمكننا حذف وسم h1 وستُعرض نفس القيمة بشكل غير منسّق. أخيراً، نحتاج إلى تشغيل تطبيقنا باستعمال خادوم التّطوير development server: # -*- coding: utf-8 -*- from bottle import route, run @route('/hello') def hello(): return u"<h1>مرحباً بالعالم</h1>" run(host='0.0.0.0', port=8080)هذا السطر سيُشغل الخادوم. بتمرير المعامل 'host='0.0.0.0 الأمر سيقوم بإرجاع المحتوى لأي حاسوب، وليس فقط الحاسوب المحليّ. هذا مهم بما أن تطبيقنا مستضاف عن بعد. معامل port يقوم بتحديد المنفذ الذي سنستخدمه. يُمكننا تشغيل التطبيق بتنفيذ الأمر: python hello.pyيمكنك زيارة التطبيق بمتصفح الويب عن طريق الذهاب إلى عنوان IP الخاصّ بك (إن كنت تعمل على خادوم) أو localhost إن كنت تعمل محليا، متبوعاً برقم المنفذ الذي قمنا باختياره (8080)، متبوعا بالتوجيه الذي أنشأناه (hello/): http://localhost:8080/helloسيظهر لك التالي: يُمكن إيقاف الخادوم في أي وقت بالضغط على CTRL-C في نافذة الطرفيّة أو سطر الأوامر. تطبيق مبدأ MVCلقد نفّذنا الآن تطبيقنا الأول. لقد كان بسيطاً بالتأكيد، ولكنّه لا ينفّذ مبادئ MVC، أو لا يقوم بشيء مثير للاهتمام. لنحاول جعله تطبيقاً أكثر تعقيداً هذه المرّة. إنشاء النموذجلنبدأ بنموذجنا، هذا هو الجزء الخاص بالتّعامل مع تخزين البيانات في برنامجنا. يمكن لـ Bottle بسهولة استخدام مجموعة من الواجهات الخلفية backends للبيانات باستعمال الإضافات. سنستخدم ملف SQLite لقاعدة بيانات التطبيق. هذه قاعدة بيانات بسيطة للغاية مُصمّمة للعمليّات الخفيفة التي يُمكن أن يقوم بها برنامجنا. ثبّت أولا SQLite، على Ubuntu يمكن ذلك عبر الأمر التالي: sudo apt-get install sqliteبالنسبة لـ Windows و OS X يمكن تثبيتها من على موقعها الرسمي. نحتاج كذلك إلى تحميل وتثبيت إضافة Bottle التي تُخوّلنا لاستعمال قواعد البيانات هذه: pip install bottle-sqliteالآن نحن نمتلك المكوّنات الأساسية، نستطيع أن ننشئ قاعدة بيانات بسيطة لتخزين بياناتنا فيها. سنقوم بإنشاء ملفّ بايثون لتوليد قاعدة بيانات SQLite مع بعض البيانات بداخلها عندما ننفّذ الملفّ. يُمكننا فعل الأمر على مترجم بايثون، لكنّ هذه الطريقة تجعل الأمر أسهل للتكرار. سننشئ ملفا باسم picnic_data.py. nano picnic_data.pyهنا نقوم باستيراد حزمة SQLite. بعد ذلك، يمكننا تنفيذ أمر يُنشئ جدولا ويدخل بيانات فيه. وفي الأخير، ننّفذ التغييرات: # -*- coding: utf-8 -*- import sqlite3 db = sqlite3.connect('picnic.db') db.execute("CREATE TABLE picnic (id INTEGER PRIMARY KEY, item CHAR(100) NOT NULL, quant INTEGER NOT NULL)") db.execute("INSERT INTO picnic (item,quant) VALUES ('خبز' , 4')") db.execute("INSERT INTO picnic (item,quant) VALUES ('جبن', 2)") db.execute("INSERT INTO picnic (item,quant) VALUES ('عنب', 30)") db.execute("INSERT INTO picnic (item,quant) VALUES ('كعك', 1)") db.execute("INSERT INTO picnic (item,quant) VALUES ('مشروبات', 4)") db.commit()احفظ الملفّ وأغلقه يُمكننا تنفيذ الملفّ، الشيء الذي سينشئ ملفّ قاعدة بيانات باسم نزهة.db داخل المُجلّد: python picnic_data.py نموذج تطبيقنا الآن مكتمل. يمكننا الآن استنتاج أن النموذج يملي على التطبيق كيفية تعامل جزء التحكم مع البيانات. إنشاء هيكل التّطبيقبعد أن أنشأنا قاعدة بيانات التّطبيق، يمكننا البدء في تطوير تطبيقنا الرئيسي. هذه العمليّة ستكون وظيفة الهيكل بشكل أساسي. وسيكون الملفّ الأكثر شبها بتطبيقنا الأول. أنشئ ملفّا باسم picnic.py لحفظ تطبيقنا الرئيسي: nano picnic.pyداخل هذا الملفّ، نحتاج إلى استيراد بعض الأشياء من حزمة Bottle، تماما كما سبق. نحتاج إلى بعض النّماذج الإضافية التي لم يسبق لنا أن استخدمناها. إضافة إلى ذلك، نحتاج إلى استيراد وظيفة SQLite: # -*- coding: utf-8 -*- import sqlite3 from bottle import route, run, templateتالياً، سنقوم بتعريف توجيه يوافق مسار URL على الشكل التالي picnic/: # -*- coding: utf-8 -*- import sqlite3 from bottle import route, run, template @route('/picnic')سنضيف دالّة للاتصال بقاعدة البيانات، لتحضر البيانات من الجدول، والاتصال مع العرض View لتقديم الصفحة. وفي الأخير، ستُرجع المخرج إلى المُستخدم. # -*- coding: utf-8 -*- import sqlite3 from bottle import route, run, template @route('/picnic') def show_picnic(): db = sqlite3.connect('picnic.db') c = db.cursor() c.execute("SELECT item,quant FROM picnic") data = c.fetchall() c.close() output = template('bring_to_picnic', rows=data) return outputبعد ذلك سنضيف أمر run لكي نقوم بتشغيل التطبيق: # -*- coding: utf-8 -*- import sqlite3 from bottle import route, run, template @route('/picnic') def show_picnic(): db = sqlite3.connect('picnic.db') c = db.cursor() c.execute("SELECT item,quant FROM picnic") data = c.fetchall() c.close() output = template('bring_to_picnic', rows=data) return output run(host='0.0.0.0', port=8080)احفظ وأغلق الملفّ. نقوم بالاتصال مع قاعدة البيانات باستعمال: db = sqlite3.connect('picnic.db')نقوم باستعلام قاعدة البيانات وجلب جميع القيم بالأسطر الأربعة الموالية. السطر الذي نقوم فيه بالإتصال إلى "العرض" لتشكيل البيانات هو: output = template('bring_to_picnic', rows=data)السطر يقوم بالاتصال بقالب (عرض) باسم bringtopicnic.tpl لتشكيل البيانات وتقديمها. حيث يقوم بتمرير المتغير data لمتغير القالب rows. سنقوم بإنشاء ملفّ القالب هذا في المرحلة التالية. إنشاء العرضالآن نحن نمتلك كلّا من النموذج والهيكل، الشيء الوحيد المتبقّي هو إنشاء العرض. يُمكن القيام بهذا بسهولة بالاستعانة بمحرك القوالب المُدمج مع Bottle. سيبحث التطبيق عن قالب موافق للاسم الذي عرّفناه في الدّالة السابقة، الملفّ يجب أن ينتهي ب .tpl يُمكن للملفّ أن يكون إمّا في مجلّد المشروع، أو داخل مجلّد باسم "view”. أنشئ ملفّا باسم يوافق الاسم الذي عرّفناه في دالّة القالب: nano bring_to_picnic.tplفي هذا الملفّ، يُمكننا دمج HTML والبرمجة معاً. سيكون ملفّنا بسيطا جدّاً. سنقوم باستعمال حلقة تكرار لإنشاء جدول يقوم بعرض بيانات النّموذج: <html dir="rtl" style="font:droid arabic naskh"> <body> <h1>أشياء لإحضارها إلى النّزهة</h1> <table> <tr><th>المكوّن</th><th>الكميّة</th></tr> %for row in rows: <tr> %for col in row: <td>{{col}}</td> %end </tr> %end </table> </body> </html>هذه الأسطر ستقوم بتقديم صفحتنا بصيغة HTML. لغة القالب التي رأينها هي ببساطة لغة بايثون. متغيّر row الذي قمنا بتمريره إلى القالب مُتاح للاستخدام عند تصميم المُخرجات. يُمكننا كتابة أسطر بايثون بتقديم علامة "%". يُمكننا الوصول إلى المُتغيّرات بداخل HTML باستخدام "{{var}}". احفظ الملفّ وأغلقه. مشاهدة النتائجتطبيقنا مكتملٌ الآن ويمكننا تشغيل الملفّ الرئيسي: python picnic.pyيمكننا رؤية النتائج بزيارة عنوان IP متبوعا برقم المنفذ، متبوعاً بالتوجيه picnic/ http://localhost:8080/picnic ختاماًإلى هذه النقطة، يجب أن تكون قادراً على رؤية كيف يُمكنك بناء تطبيقات معقّدة باستخدام الإطار المُصغر والبسيط Bottle. رغم أنّ أمثلتنا بسيطة، إلا أنّك الآن تستطيع بسهولة أن تطوّر تطبيقات إلى القيام بوظائف متقدّمة. نظام إضافات Bottle يعدّ أيضاً أصلاً مهمّاً. الإضافات مُشارَكةُ بنشاط في المجتمع وإضافة وظائف أكثر تعقيداً لتطبيقك يُمكن أن يُنفّذ بسهولة باستخدام الإضافات. هناك طريقة سهلة للبحث عن الإضافات وهي عن طريق استعمال الأمر: pip search bottleهذا سيُعطيك فكرة عن بعض الإضافات الأكثر شعبية. ترجمة -وبتصرّف- للمقال: How To Use the Bottle Micro Framework to Develop Python Web Apps.
  11. SSH عبارة عن بروتوكول آمن يُستخدم كوسيلة أساسيّة للاتصال بخوادم لينكس عن بُعد. SSH تُقدّمُ واجهة نصّية بحيثُ تعطيك الصّلاحيّة لكتابة أي أوامر وتنفيذها مباشرة على الخادوم. بعد الاتصال، جميع الأوامر التي تكتبها على الطرفيّة محليّاً تُرسل إلى الخادوم عن بعد وتُنفّذ هناك. في هذا الدّليل السّريع، سنُغطّي بعضاً من أكثر وسائل الاتّصال بSSH شيوعاً لتحقيق أهدافك. هذا المقال يُمكن أن يُستعمل كمرجع سريعٍ كلّما احتجت إلى معرفة كيفية الاتصال بخادومك أوضبطه بطرق مختلفة. نظرة عامة على SSH أشهر وسيلة للاتّصال بخادوم لينكس عن بعد هي استعمال SSH .SSH اختصار ل Secure Shell أو شل آمن، حيث تُوفّر وسيلة آمنة لتنفيذ الأوامر، إضافة تعديلات وضبط الخدمات عن بُعد. عندما تتّصل عبر SSH، تقوم بتسجيل الدّخول باستخدام حساب موجود على الخادوم. كيف يعمل SSH عندما تتّصل عبر SSH، ستدخلُ إلى جلسة شل (shell session)، وهي واجهة نصّيّة تُمكّنك من التّفاعل مع خادومك. أثناء الجلسة جميع الأوامر التي تُنفّذها في الطرفيّة محليّاً تُرسل عبر نفق SSH أو SSH tunnel مُشفّر وتُنفّذ على الخادوم. اتصال SSH يُنفّذ باستخدام نموذج خادوم خاص بالعميل. هذا يعني أن إنشاء اتصال SSH يتطلّب تشغيل برمجيّة تسمى عفريت SSH على الخادوم. تستمع هذه البرمجيّة للاتصالات على منفذ شبكة معيّن، طلبات تسجيل الدّخول والاستيثاق authentication من هوية صاحب الاتصال وتقوم بتقديم البيئة المناسبة إذا قام المستخدم بتوفير المعلومات الصّحيحة. يجب على المُستخدم أن يمتلك على جهازه برمجية تسمى عميل SSH أو SSH client، البرمجية تعرف كيف تتواصل باستخدام بروتوكول SSH ويُمكن أن تُمنَح معلومات عن المُضيف البعيد (الخادوم) للاتّصال به،عن طريق اسم المستخدم ومعلومات يجب تمريرها للاتّصال بنجاح. يمكن للعميل أيضاً أن يحدّد تفاصيل معيّنة عن نوع الاتّصال المرغوب فيه. كيف يقوم SSH بتسجيل دخول المستخدمين العميل يصادق إمّا باستخدام كلمات المُرور ( أقلّ أماناً وغير منصوح بها) أو عن طريق مفاتيح SSH، التي تعتبر آمنة جدّاً. كلمات المرور تُشفَّرُ وتعتبر سهلة الفهم بالنّسبة للمُستخدمين الجُدد. لكنّ المُخترقين يستعملون برمجيّات خبيثة يُمكن لها أن تُكرّر محاولات الدّخول إلى حواسيب من يستخدمون كلمات المرور، ما قد يُؤدي إلى اختلال أمني. لهذا السّبب ننصح دائما بالاعتماد على استيثاق SSH المبدئي لمُعظم الإجراءات. مفاتيح SSH هي مجموعة من المفاتيح المُشفّرة يُمكن استعمالها للاستيثاق. كلّ مجموعة تحتوي على مفتاح عام وخاص. يُمكن نشر المفتاح العام بشكل حرّ، أما المفتاح الخاص فيجب الاحتفاظ به ولا يجب أن يُكشف لأحد. للاستيثاق باستخدام مفاتيح SSH، يجب على المستخدم أن يمتلك زوج مفتاح SSH على جهازه المحلي. وعلى الخادم البعيد المفتاح العام يجب أن ينسخ إلى ملفّ بداخل مجلّد منزل المُستخدم على ssh/authorized_keys./~ . هذا الملفّ يحتوي على قائمة من المفاتيح العامّة - واحد في كلّ سطر- مُخوّلٌ لها بالدّخول إلى الحساب. عندما يتّصل عميل بالمُضيف Host راغباً باستخدام استيثاق مفتاح SSH، سيُعلم الخادومَ عن أي مفتاح عام يستخدم. يتحقّق الخادوم بعد ذلك من ملفّ المفاتيح المُخوّل لها authorized_keys باحثاً عن المفتاح العام المُستخدم. ثم يولّد سلسلة نصّية عشوائيا ويُشفّر باستخدام المفتاح العام، هذا النّص المُشفّر يُمكن فك تشفيره فقط باستعمال المفتاح الخاصّ المُقترن. سيُرسل الخادوم هذه الرّسالة المُشفرة إلى العميل لاختبار إذا ما كان فعلا يمتلك المفتاح الخاصّ المُرتبط. عند استلام الرّسالة، سيقوم العميل بفك التّشفير باستخدام المفتاح الخاص ويجمع السّلسلة نصّية العشوائية مع هوية جلسة سابقة (session ID) . ويولّد بعد ذلك مزيج MD5 الخاص بالقيمة وينقلها مجدّدا إلى الخادوم. الخادوم يمتلك سابقا الرّسالة الأصليّة وهوية الجلسة، لذلك يُمكنه أن يُقارن مزيج MD5 المولّد من القيّم ويُحدّد بأن العميل يجب أن يمتلك المفتاح الخاص. الآن بما أنّك تعلم كيف يعمل SSH، يُمكننا البدء في الحديث عن بعض الأمثلة للتعرّف على الطّرق المُختلفة للعمل مع SSH. توليد مفاتيح SSH والعمل معها هذا القسم سيغطي كيف تولّد مفاتيح SSH على جهاز عميل ونشر المفتاح العام إلى الخوادم حيث يجب أن تُستخدم. هذا قسم جيّد للبدء به إذا لم يسبق لك أن ولّدت مفاتيح، ويجب عليك البدء به إذا أردت تأمين خادومك نظراً لزيادة الأمان التي تتيحه لنا في الاتصّالات المُستقبليّة. توليد زوج مفاتيح SSH توليد زوج مفاتيح SSH عام وخاص على جهازك المحلي هو أول خطوة نحو استيثاق مع خادوم عن بعد بدون كلمة مرور. إلا إذا كنت تملك سببا جيدا لعدم فعل ذلك، يجب عليك دائما الاتصال باستخدام مفاتيح SSH. يمكن استخدام مجموعة من خوارزميّات التشفير لتوليد مفاتيح SSH، مثل RSA، DSA، ECDSA. مفاتيح RSA مُفضلة بشكل عام وهي نوعية المفاتيح الافتراضية. لتوليد زوج مفاتيح RSA على جهازك المحلي، أكتب: $ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/demo/.ssh/id_rsa): هذا المحث (prompt) يتيح لك اختيار مكان لتخزين مفتاح RSA الخاص. اضغط Enter للخيار الافتراضي، الذي سيُخزنها في مجلّد .ssh المخفي قي مجلد المنزل. ترك المسار الافتراضي سيتيح لعميل SSH إيجاد المفاتيح آلياً. Enter passphrase (empty for no passphrase): Enter same passphrase again: المحث التالي يتيح لك إدخال جملة مرور بطول اعتباطي لتأمين مفتاحك الخاص. افتراضياً يجب عليك إدخال جملة المرور هذه في كل مرّة تستعمل المفتاح الخاص، كإجراء أمني إضافي. يُمكنك أن تضغط Enter لترك الحقل فارغا إذا لم ترغب في إنشاء كلمة مرور. تذكّر فقط أن هذا سيخوّل أي شخص يملك قابلية التحكم بمفتاح SSH الخاص للدخول إلى الخادوم الخاص بك. إذا اخترت وضع كلمة مرور لن يظهر شيء على الشاشة أثناء الكتابة، وهذا من أجل الاحتياط الأمني. Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here The key's randomart image is: +--[ RSA 2048]----+ | | | | | | | + | | o S . | | o . * + | | o + = O . | | + = = + | | ....Eo+ | +-----------------+ هذه العملية ولّدت زوج مفاتيح SSH من نوع RSA، وملفّات تحت المجلد المخفي .ssh في مجلد المنزل وهذه الملفّات هي: ssh/id_rsa./~: المفتاح الخاص. لا تنشر هذا الملفّ! ssh/id_rsa.pub./~: المفتاح العام المُرتبط. هذا الملفّ يمكن مشاركته بحرية. توليد زوج مفاتيح مع رقم أكبر من البتات Bits مفاتيح SSH تكون افتراضياً 2048 بت. هذا يعتبر جيّداً بشكل عام أمنياً، لكنّك تستطيع تحديد عدد أكبر لمزيد من الأمان. لفعل ذلك ضَمِّن معامل -b مع عدد البتات الذي تريد. معظم الخوادم تدعم 4096 بت على الأقل. المفاتيح الأطول يُمكن ألّا تُقبل لأغراض الحماية من DDOS: ssh-keygen -b 4096 إذا سبق لك أن أنشئت مفتاحاً، سيُطلب منك إذا ما كنت ترغب في الكتابة فوق المفتاح السّابق: Overwrite (y/n)? إذا اخترت نعم (y)، فإن المفتاح الجديد سيكتب فوق المفتاح السّابق ولن تستطيع استعمال المفتاح القديم بعدها للدّخول إلى الخادوم، لذلك كن حذرا أثناء تغيير المفتاح. حذف وتغيير جملة المرور على المفتاح الخاص إذا سبق لك وأن عيّنت جملة مرور للمفتاح الخاص ورغبت في تغييرها فالأمر بسيط، ويمكنك أن تقوم به بسهولة. ملاحظة: لتغيير أو حذف جملة المُرور، يجب عليك معرفة جملة المرور الأصليّة. إذا فقدت جملة المرور إلى المفتاح،فللأسف لا يوجد طريقة لإرجاعها وسيتوجّب عليك توليد زوج مفاتيح جديد. لتغيير أو حذف جملة المرور، فقط أكتب: ssh-keygen -p Enter file in which the key is (/root/.ssh/id_rsa): يُمكنك أن تُحدد مسار المفتاح الذي تحاول تعديله أو اضغط Enter لقبول القيمة الافتراضيّة: Enter old passphrase: أكتب جملة المرور القديمة المراد تغييرها. بعد ذلك ستُسأل لإدخال جملة مرور جديدة: Enter new passphrase (empty for no passphrase): Enter same passphrase again: هنا أكتب جملة المرور الجديدة أو اضغط Enter لحذفها. عرض بصمة مفتاح SSH ينشر كل زوج مفاتيح بصمة مُشفّرة يُمكن استعمالها لتعريف المفاتيح بشكل فريد. يُمكن أن يكون هذا جيّدا في كثير من الحالات. لإيجاد بصمة مفتاح SSH، اكتب: ssh-keygen -l Enter file in which the key is (/root/.ssh/id_rsa): إذا كان هذا هو مسار المفتاح الصحيح اضغط ENTER ، أو اكتب المسار الخاص إذا كان المسار مختلفاً، ستُرجع سلسلة نصيّة تحتوي على سعة المفتاح من البتات، البصمة، والحساب والمُضيف الذي أنشئت له، والخوارزمية المُستخدمة: 4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e demo@test (RSA) نسخ مفتاح SSH العام إلى الخادوم مع SSH-Copy-ID لنسخ مفتاحك العام إلى الخادوم، بغرض الاستيثاق بدون كلمة مرور، سنتخذ بعض الإجراءات. إذا كنت حالياً تمتلك وصولا إلىSSH عن طريق كلمة مرور مضبوطاً على الخادوم، وتمتلك أداة ssh-copy-id مثبّتة، فهذه العمليّة بسيطة. أداة ssh-copy-id تأتي مضمّنة على حزم OpenSSH في كثير من توزيعات لينكس، لذلك فمن المُحتمل أن تكون لديك افتراضيا. إذا كنت تملك هذا الخيّار، يُمكنك بسهولة نقل مفتاحك العام باستعمال: ssh-copy-id username@remote_host سيُطلب منك إدخال كلمة مرور المُستخدم على الجهاز البعيد: The authenticity of host ‘111.111.11.111 (111.111.11.111)’ can’t be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed – if you are prompted now it is to install the new keys demo@111.111.11.111’s password: بعد كتابة كلمة المرور، مُحتوى مفتاح ssh/id_rsa.pub./~ سوف يُلحق إلى آخر ملف ssh/authorized_keys./~ الخاصّ بحساب المُستخدم: Number of key(s) added: 1 Now try logging into the machine, with: "ssh ‘demo@111.111.11.111’" and check to make sure that only the key(s) you wanted were added. يُمكنك الآن الدّخول إلى الحساب بدون كلمة مرور: ssh username@remote_host نسخ مفتاح SSH العام إلى خادوم بدون SSH-Copy-ID إذا لم تكن تملك أداة ssh-copy-id، لكنك لا زلت تملك وصولا إلى الخادوم البعيد بكلمة مرور، يُمكنك نسخ محتويات المفتاح العام بطريقة مختلفة. يُمكنك إرجاع مُحتويات المفتاح وتمريرها إلى أمر SSH، في الجهة البعيدة يُمكنك التأكد إذا ما كان مجلّد ssh./~ موجوداً، وبعد ذلك ألحق المحتوى المُمَرّر إلى ملفّ ssh/authorized_keys./~: cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" سيُطلب منك كتابة كلمة المرور للحساب البعيد: The authenticity of host ‘111.111.11.111 (111.111.11.111)’ can’t be established. ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe. Are you sure you want to continue connecting (yes/no)? yes demo@111.111.11.111’s password: بعد إدخال كلمة المرور، سيُنسخ مفتاحك، متيحاً لك الاتصال بدون كلمة مرور: ssh username@remote_IP_host نسخ مفتاح SSH العام إلى خادوم يدويا إذا لم تكن تملك وصولا عن طريق كلمة مرور، ستحتاج لإضافة مفتاحك العام إلى الخادوم البعيد يدويّاً. على جهازك المحليّ، يُمكنك إيجاد محتويات ملفّ مفتاحك العام بكتابة: cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test يُمكنك نسخ هذه القيمة، ولصقها يدويّاً في المكان المناسب على الخادوم البعيد. يجب عليك أن تتّصل بالخادوم بوسيلة مختلفة. على الخادوم البعيد، أنشئ مجلّد ssh./~ إذا لم يكن موجوداً من قبل: mkdir -p ~/.ssh بعد ذلك، يُمكنك إنشاء أو إلحاق ملفّ ssh/authorized_keys./~ بكتابة: echo سلسلة_المفتاح_العام >> ~/.ssh/authorized_keys يجب عليك الآن أن تتمكّن من الدّخول إلى الخادوم بدون كلمة مرور عبر أمر ssh: ssh username@remote_IP_host ترجمة -مع شيءٍ من التصرّف- للقسم الأول من مقال: SSH Essentials: Working with SSH Servers, Clients, and Keys.
  12. نعم يوجد أمر df ويُمكنك استخدامه كالتالي: df -h مرّرنا -h لكي تكون المُخرجات سهلة القراءة لاحظ أن Avail تعني المساحة المتبقّية Size : تعني المساحة الكليّة Used: المساحة المُستخدمة يُمكنك كذلك تمرير /dev/sdaX لتحديد القرص: df -h /dev/sda7وكذلك يُمكنك أن تُمرّر مسار القرص: df -h /home
  13. بما أن العديد من الدروس المتعلقة بـِ Java وUbuntu تفترض وجود Java مُثبتة مُسبقا على النظام، فإن هذا المقال سيرشدك إلى تعلم تثبيت وإدارة إصدارات مختلفة من Java حتى يتسنى لك البدء في العمل، تتبع الدروس والمضي قدما. تثبيت JRE/JDK الإفتراضيهذا هو الخيار الأكثر سهولة والمنصوح به. هذه العملية ستثبت OpenJDK 6 على أبنتو 12.04 وسابقاتها وحتى على 12.10+ فسيُثبّتُ هذا OpenJDK 7 تثبيت جافا مع apt-get سهل للغاية. أولا، حدث مستودع الحزم: sudo apt-get updateثم، تأكد من أن جافا ليست مثبتة على الجهاز: java -versionإذا كانت مخرجات الأمر: "The program java can be found in the following packages"فهذا يعني أن جافا لم تُثبت بعد، لذلك طبق الأمر التالي: sudo apt-get install default-jreهذا الأمر سيثبتُ (Java Runtime Enviroment (JRE، إذا كنت تريد (Java Development Kit (JDK عوضا عن ذلك، والتي تكون ضرورية لترجمة (compile) تطبيقات Java (مثلا Apache Ant, Apache Maven, Eclipse و IntelliJ IDEA ) طبق الأمر التالي: sudo apt-get install default-jdkهذا كل ما تحتاجه من خطوات لتثبيت Java. جميع الخطوات القادمة اختيارية ويجب تطبيقها فقط عند الحاجة. تثبيت OpenJDK 7 (اختياري)لتثبيت OpenJDK 7 ، طبق الأمر التالي: sudo apt-get install openjdk-7-jreهذا الأمر يثَبّتُ (Java Runtime Environment (JRE. إن كنت ترغب بتثبيت (Java Development Kit (JDK عوضا عن ذلك فنفذ الأمر التالي: sudo apt-get install openjdk-7-jdkتثبيت Oracle JDK (اختياري)Oracle JDK هو JDK الرسمي؛ لكنه لم يعد مقدما من Oracle بشكل افتراضي لـ Ubuntu، لكن لا يزال بإمكانك تثبيته باستخدام apt-get. لتثبيت أي نسخة أولا نفذ الأوامر التالية: sudo apt-get install python-software-properties sudo add-apt-repository ppa:webupd8team/java sudo apt-get updateبعد ذلك، حسب النسخة المراد تثبيتها، نفذ أحد الأوامر التالية حسب النسخة المراد تثبيتها: Oracle JDK 6هذه نسخة قديمة لكنها لا زالت تُستعمَل في كثير من التطبيقات والأدوات، لذلك نذكرها هنا من باب العلم بالشيء: sudo apt-get install oracle-java6-installerOracle JDK 7sudo apt-get install oracle-java7-installerOracle JDK 8هذه آخر نسخة مستقرة لحد كتابة هذا الدرس. تم الإعلان عن الإطلاق بشكل عام في مارس 2014. هذا الرابط الخارجي عن Java 8 يمكن أن يساعدك لفهم الأمور بشكل جيد. sudo apt-get install oracle-java8-installerملاحظة: إذا حدث وأعطاك الأمر بعد مُدّة خطأً كالتالي (شخصيا، واجهتني المُشكلة، أظنّ أن السبب راجع إلى كوني أعيش في المغرب مع سرعة شبكة بطيئة): download failed Oracle JDK 8 is NOT installed. /usr/bin/dpkg returned an error code (1)لقد بحثت عن حلّ للمُشكلة ولكنّني لم أجد سوى حلّ بدائي وهو أن تعيد أمر التثبيت كلّما أعطاك هذا الخطأ (ستحتاج إلى تكرار الأمر 4 أو 5 مرّات لإكمال التحميل والتّثبيت بنجاح): sudo apt-get install oracle-java8-installerحيث ستكون المُخرجات كالتالي: 2 not fully installed or removed.هذا يعني أنّ الأمر الذي أدخلته سيستكمل التحميل ولن يحتاج إلى إعادته من جديد. إدارة Javaإذا كان لديك العديد من نسخ جافا المثبتة في الخادوم، يمكن اختيار النسخة الافتراضية، للقيام بذلك طبق الأمر التالي: sudo update-alternatives --config javaالمخرجات عادة ستكون كهذا إذا كنت تملك تثبتيتين (إذا كان لديك أكثر من ذلك، بالطبع ستكون المخرجات أكثر): There are 2 choices for the alternative java (providing /usr/bin/java). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/lib/jvm/java-7-oracle/jre/bin/java 1062 auto mode 1 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 manual mode 2 /usr/lib/jvm/java-7-oracle/jre/bin/java 1062 manual mode Press enter to keep the current choice[*], or type selection number: يمكنك الآن اختيار الرقم لاستخدامه كخيار افتراضي. هذه العملية يمكن فعلها كذلك بالنسبة لمترجم جافا (javarc): sudo update-alternatives --config javacستظهر نفس شاشة الاختيار السابقة ويجب استعمالها بنفس الطريقة. هذا الأمر يمكن تنفيذه لجميع الأوامر التي تملك تثبيتات مختلفة. في جافا، مثلاً: keytool ، javadoc و jarsigner ضبط متغير بيئة “JAVA_HOME” لضبط متغير بيئة JAVA_HOME ، والذي تحتاجه بعض البرامج، أولا عليك إيجاد مسار تثبيت جافا الخاص بك: sudo update-alternatives --config javaوالمخرجات تكون كالتالي: There are 2 choices for the alternative java (providing /usr/bin/java). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/lib/jvm/java-7-oracle/jre/bin/java 1062 auto mode 1 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 manual mode 2 /usr/lib/jvm/java-7-oracle/jre/bin/java 1062 manual mode Press enter to keep the current choice[*], or type selection number:مسار التثبيت هو كل من: /usr/lib/jvm/java-7-oracle /usr/lib/jvm/java-6-openjdk-amd64 /usr/lib/jvm/java-7-oracleأنسخ المسار من تثبيتك الذي تريده ثم عدل الملف etc/environment/: sudo nano /etc/environmentفي هذا الملف أضف السطر التالي (مغيرا مسار_التثبيت إلى ما نسخته): JAVA_HOME="مسار_التثبيت"هذا كاف لضبط متغير البيئة. الآن أعد تحميل هذا الملف: source /etc/environmentجرب الآن تطبيق الأمر: echo $JAVA_HOMEإذا كان المخرج مسارك، فمتغير البيئة قد ضُبط بنجاح. إذا لم يكن الأمر كذلك، المرجو التأكد من أنك اتبعت جميع الخطوات بشكل صحيح. ترجمة -وبتصرّف- للمقال: How To Install Java on Ubuntu with Apt-Get.
  14. محرّرُ Vim يتمتّع بشهرة واسعة، بفضل هذه الشهرة أصبح يُعدّ من أوائل المحرّرات التي يُمكن للمستخدم أن يُخصّصها ويُضيف عليها كل ما من شأنه أن يجعل التّحرير مُريحاً وسهلاً سواء شكلاً أو أداءً. لقد تحدّثنا سابقاً عن الشّكل والمظهر، وقد حان الوقتُ للغوص في أعماق الإضافات التي تجعل التحرير لعبة في كثير من الأحيان بل هناك بعض الإضافات التي ستندم على أنّك لم تعرفها في كلّ هذه السنين منذ بداية استخدامك للحاسب، مُعظم الإضافات تتّبع فلسفة 'اجعلها أسرع وأبسط' وهذا يعني أنّك ستجدُ ضالّتك في هذا الدّرس إذا كنت تبحث عن تحسين أدائك وزيادة إنتاجيّتك إذ ستتعلّم كيف تديرُ الإضافات من تثبيت وتحديث إلى طرق حذفها. صحيح أن المُحرّر ممتازٌ جدّا في ما يتعلق بزيادة الإنتاجية حتى بدون أي إضافات (كما رأينا في الدّرسين السّابقين)، لكنّك بالإضافات قادرٌ على أخذ المُحرّر إلى المستوى المُتقدّم بشكل جدّ ملاحظ. ماهي إضافات vim بالضبط؟لا أظنّ أنّك قد تسألُ هذا السؤال، فنحن محاطون بالإضافات في كلّ مكان من إضافات المتصفّح إلى تطبيقات الهواتف الذكيّة، لكن في حال سألت هذا السّؤال جديّا، ففكّر في الإضافة على أنها أداة مساعدة تؤدّي عملا معيّنا أو تساعدُ في القيام بأمر ما، الشيء الذي يُسهّل ويُسرع عملية الإنتاج، وقد أعطيتك إضافات المتصفّح كمثال، و هذا بالضبط ما تفعله إضافات vim، أي تسريع عملية الإنتاج (الكتابة). الإضافات الخاصّة بالمحرّر يُمكن أن تكون عامّة أو مُخصّصة للغة برمجة ما، لبيئة ما أو إطار عمل معيّن. معظم الإضافات مُطوّرة من مُبرمجين مُستقلّين عن مُطوري المُحرّر، وكذلك تستطيع أنت أن تُبرمج إضافة خاصّة بك سواء بلغة Vimscript أو بلغتك إذا كنت تجيد لغات مثل روبي، بايثون، Lua. مع ملاحظة أن الإضافات التي لم تُبرمج بلغة Vimscript عادة ما تكون بلغة بايثون. تثبيت الإضافاتأولا عليك أن تعرف بأن الإضافات ليست إلا ملفّات برمجيّة وتنصيبها لمُحرّر Vim أمر في غاية السهولة، ويُمكن ذلك بعدّة طُرق سواء بأداة pathogen الّتي تسهّل إدارة ملفّات الإضافات البرمجيّة حيثُ تقوم بتنظيم الملفّات والإضافات لأجل تَيْسِيرِ تحديثها وحذفها. كذلك يُمكن فعل نفس الأمر باستخدام أداة Vundle التي استُلهمت من مشروع Bundler الخاص بإدارة جواهر روبي Rubygems. مع Vundle يمكنك ضبط إعدادات الإضافات في ملف vimrc، يُمكنك تثبيت، تحديث، البحث، وحذفُ الإضافات. هناك العديد من الأدوات الأخرى التي تؤدّي نفس الغرض، لكن pathogen و Vundle هما الأكثر استخداماً، وسأريك كيف تستخدمهما معاً ويمكنك اختيار أي واحدة منهما، لكنّي سأعتمد فقط على Vundle في الدروس القادمة التي سأتناول فيها استعمال الإضافات المُختلفة. 1. تثبيت الإضافات باستعمال أداة pathogenأداة pathogen تعتمد مبدأ البساطة المطلقة، إذ لا تتوفر على الكثير من المهام والتعقيدات وتُمكّنك من تثبيت الإضافات بنقلها إلى مجلد: .vim/bundle/pluginحيثُ plugin هو ملف الإضافة التي تُريد تثبيتها. لتثبيت الأداة حمّل ملفّ pathogen.vim ثمّ أنقله إلى مجلّد : ~/.vim/autoloadلديك أيضا خيار التثبيت عبر سطر الأوامر (تحتاج إلى أداة curl): تثبيت أداة curl على Gnu/Linuxعلى Debian وما بُني عليها: $ sudo apt-get install curlعلى Fedora: $ sudo yum install curlتثبيت أداة curl على Windows: حمّل curl، بعد فكّ الضغط عن الملفّ انقل الملف المسمّى curl.exe إلى مجلّد %windir% للوصول إلى المجلّد افتح قائمة ابدأ ثمّ تشغيل (Run) ثمّ ألصق %windir% واضغط Enter. بعد الحصول على curl لأنظمة جنو/لينكس الخطوة التالية هي تطبيق الأمر التالي من الطّرفيّة (Terminal): $ mkdir -p ~/.vim/autoload ~/.vim/bundle && \ curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vimأما إذا كنت من مستعملي Windows فطبّق الأمر التالي في برنامج Cmd: > mkdir -p ~\vimfiles\autoload ~\vimfiles\bundle && \ curl -LSso ~\vimfiles\autoload\pathogen.vim https://tpo.pe/pathogen.vimبعد نقل الملفّات وانتهاء العمليّة تحتاج إلى إضافة الأسطر التالية إلى ملفّ vimrc: execute pathogen#infect() syntax on filetype plugin indent onالآن أنت قادرٌ على تثبيت أي إضافة تريد (المثال التالي يقوم بتثبيت إضافة NERDTree على توزيعات Gnu/Linux و Mac) $ cd ~/.vim/bundle && git clone https://github.com/scrooloose/nerdtree.git أمّا إذا كنت تستعمل cmd في Windows، فهاك الأمر: > cd ~\vimfiles\bundle && git clone https://github.com/scrooloose/nerdtree.gitأداة Gitمعظم الإضافات مستضافة على GitHub لذلك فأداة git ضرورية للتحميل وهي متوفرة لمستخدمي جنو/لينكس على المستودعات الرّسمية ويمكنك تثبيتها تماماً كما تبّثنا أداة curl: لـ Debian وما بُني عليها: $ sudo apt-get install gitلـ Fedora: $ sudo yum install gitلمستخدمي وندوز حمل git هذا إذا أردت تثبيت الإضافات من الطرفيّة، أمّا إذا أردت أن تقوم بالأمر بشكل يدوي فهناك دائما طريقة أخرى: أولاً عليك تحميل الملفّات مضغوطة: https://github.com/scrooloose/nerdtree/archive/master.zipحيثُ scrooloose وnerdtree تتغيّر حسب اسم الإضافة واسم المستخدم الخاص بمُطوّرها على Github. فك ضغط الملفّ ثمّ انقل ما بداخله إلى مجلّد bundle. 2. تثبيت الإضافات باستعمال أداة Vundleأداة vundle شبيهة بأداة pathogen وتؤدّي نفس الغرض تقريباً، لكن أداة Vundle تستطيع فعل كثير من الأشياء التي لا تستطيع pathogen فعلها، مثلا في Vundle يُمكنك البحث عن الإضافات ، حيث تعرض لك الأداة جميع الإضافات الموافقة لما أدخلته وتعطيك إمكانية التنقّل بين نتائج البحث واختيار الإضافة المراد تثبيتها وبضغطة زر تُثبّتُ الإضافة، يُمكنك اعتبار الأداة بمثابة مدير حزم مثل apt-get في توزيعة أبنتو وyum في توزيعة فيدورا. أداة Vundle تمكنّك من : ضبط إعدادات الإضافات من ملفّ vimrc مباشرة.تثبيت الإضافات.تحديث الإضافات المثبتة.البحث عن الإضافات المتوفّرة.حذف الإضافات.القيام بكلّ ما سبق باستعمال سطر أوامر بسيط وسهل.تثبيت أداة Vundleلتثبيت الأداة عليك أن تتوفر على أداة git (أنظر فصل أداة Git أعلاه)، وعليك أيضاً أن تتوفر على أداة Curl، حيثُ تُستخدم للبحث من طرف Vundle. على Gnu/Linux أو ماك، طبّق الأمر التالي على الطّرفية: $ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vimبعد تطبيق الأمر أعلاه، أضف هذه الأسطُر إلى ملفّ vimrc: set nocompatible filetype off set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() Plugin 'gmarik/Vundle.vim' Plugin 'user/plugin.vim' Plugin 'L9' filetype plugin indent on call vundle#end()التثبيت على نظام Windows، طبّق الأمر التالي في سطر الأوامر Cmd: cd %USERPROFILE% && git clone https://github.com/gmarik/Vundle.vim.git vimfiles/bundle/Vundle.vim && gvim _vimrcثمّ أضف الأسطر التالية إلى ملفّ vimrc: set nocompatible filetype off set rtp+=~/vimfiles/bundle/Vundle.vim/ let path='~/vimfiles/bundle' call vundle#begin(path) Plugin 'gmarik/Vundle.vim' Plugin 'user/plugin.vim' Plugin 'L9' filetype plugin indent on call vundle#end()مع مراعاة أن الأسطر باللون المُختلف غير ضروريّة وهي تعني: Plugin 'user/plugin.vim': تثبيت إضافة من github مُباشرة حيث user هو اسم مستخدم المُطوّر و plugin.vim اسم الإضافة.Plugin 'L9': تثبيت إضافة في حال توفّرها على Vimscripts.ملاحظة: بعد إضافة أي سطر لتثبيت إضافة ما عليك حفظ الملفّ والخروج من vim ثمّ تطبيق الأمر: :PluginInstallوسيبدأ Vundle بتثبيت الإضافات واحدة تلو الأخرى. الآن لتثبيت أي إضافة باستخدام Vundle يمكنك الاختيار بين الطّرق التالية: تثبيتُ إضافةالتثبيت من ملفّ vimrc.لقد رأينا هذه الطّريقة من قبل، فقط إضافة أحد الأسطر السّابقة أعلاه لملفّ vimrc ثمّ الخروج من Vim وفتحه مجدّدا ثمّ تنفيذ الأمر PluginInstall كفيل بالأمر. التثبيت من المُحرّر مباشرة:Vundle يُوفّر لنا عدة أوامر جاهزة لاستخدامها داخل المُحرّر ومن بين هذه الأوامر أمر PluginInstall، ويُمكنك استعماله في المُحرّر على النّحو التالي: :PluginInstall pluginحيثُ plugin هو اسم الإضافة، ويمكن أن يكون على شكل user/plugin في حال كانت الإضافة مستضافة على GitHub. الأمر سيفتح تقسيما جديدا للشاشة وسيبدأ بعملية التثبيت مباشرة الوقت المُستغرق يعتمد على حجم الإضافات التي تُحاولُ تثبيتها وعلى سرعة الأنترنت لديك. عند الانتهاء يُمكنك إغلاق التقسم باستخدام: :qأو :bdeleteالبحث عن إضافةعرض جميع الإضافات التي يُمكن لـ vundle تثبيتها إذا كنت فضولياً فمن الجيّد أن تطّلع على كميّة الإضافات الموجودة لمحرّر vim وأسمائها، لفعل ذلك نفّذ الأمر التالي على المُحرّر: :PluginSearch! إلى حين كتابة هذا الدّرس هناك أكثر من 4000 إضافة يستطيع Vundle تثبيتها، الإضافات يُمكن أن تكون عامة ومفيدة لجميع المُبرمجين، للغة معيّنة، لبيئة ما أو حتى لإطار عمل معيّن. تحديثُ إضافةبعد تثبيت إضافة ما أنت جاهز للعمل بها واستغلالها لتحسين أداء المُحرّر، لكن بعد مدة معيّنة سيضيف المطوّر بعض التحسينات لإضافته، وكلّنا ذاك الذي يرغبُ في الجديد المحسّن، لذلك أداة Vundle تُوفّرُ لنا أمر PluginUpdate لتحديث الإضافات. لتحديث جميع الإضافات: :PluginUpdateلتحديث إضافة معيّنة: :PluginUpdate pluginلتحديث أكثر من إضافة يُمكنك فصلُ أسمائها بمسافة: :PluginUpdate plugin1 plugin2يمكنكَ استخدام أمر PluginInstall مع إضافة علامة تعجّب(!) لتحديث جميع الإضافات (ليس ضروريا، مُجرّد أضف لمعلوماتك): :PluginInstall!وهو أمرٌ يخبرُ Vundle بالقيام بعمليّة إعادة تثبيت، ما يجلبُ أحدث الإصدارات. حذف إضافةقد تشعرُ أنّ الإضافة التي قُمت بتثبيتها مؤخّراً ليست مفيدة بالمرّة أو أنها تُسبب مشاكل للمحرّر، لا مشكلة يمكنك التخلّص منها باستخدام Vundle. لحذف إضافة عليك أولاً أن تعرض الإضافات المُثبّتة، لقيام بذلك طبّق الأمر: :PluginListبعد تطبيق الأمر سيظهر قسم في الشاشة يحوي جميع الإضافات المُثبّتة تصفح باستخدام أسهم لوحة المفاتيح واختر الإضافة التي تُريد حذفها ثمّ اضغط على زرّ D. ستظهر علامة – بجانب اسم الإضافة، هذا يعني أنّ الإضافة حُذفت ويمكنكَ الخروج، إذا أردت التراجع يمكنك ذلك باستخدام أمر التثبيت ما دام اسم الإضافة في ملف vimrc أو يُمكنك حذف اسمها في الملفّ إذا أردت تأكيد عدم رغبتك في رؤية وجه تلك الإضافة مُجدّدا. حذفُ مجموعة من الإضافات دُفعة واحدةيُمكنك حذف مجموعة من الإضافات بإزالتها من ملفّ vimrc ثم تنفيذ الأمر التالي: :PluginCleanسيقوم Vundle بإظهار رسالة تأكيد أكتب y ثمّ Enter للتأكيد، الأمر سيقوم بحذف جميع الإضافات التي لا توجد في ملفّ vimrc. حذفُ جميع الإضافات دُفعة واحدة (احذر!)إذا كنت تُريد أن تعود إلى زمن vim الخالص بدون أي إضافة، يُمكنك حذف جميع الإضافات بإزالتها من ملفّ vimrc ثم تنفيذ الأمر التالي: :PluginCleanسيقوم Vundle بإظهار رسالة تأكيد أكتب y ثمّ Enter للتأكيد، الأمر سيقوم بحذف جميع الإضافات التي لا توجد في ملفّvimrc أي جميعها في حالتنا. خاتمةتعرّفنا في هذا الدّرس على كيفيّة إدارة الإضافات ولم يبق لنا إلا شرح أهم الإضافات التي من شأنها أن تزيد من إنتاجيتك، وتُحسّن بها أداءك. الدرس القادم سيكون عن الإضافات التي يحتاج إليها كل مبرمج بغضّ النظر عن اللغة التي يتعامل بها مع برامجه وتطبيقاته.
  15. لقد تعرّفنا معا في الدرس السابق على أساسيّات التّعامل مع النّصوص والملفّات في محرر vim حيثُ شرحتُ أوامر متعلّقة بالتّعديل والحذف كالقصّ واللّصق والحذف، وتعرّفنا على مبادئ الانتقال بين الكلمات، الأسطر، التّبويبات وتقسيمات الشّاشة؛ والآن حان وقت المزيد من الأوامر -المتقدمة نسبيّا- التي ستساعدك على التعرف على المحرر بشكل أعمق. معلومات الملفإذا قمت بفتح ملف ما وتريد معلومات عنه فكل ما عليك فعله هو الضغط على Ctrl+g أو تنفيذ الأمر: :fبعد تنفيذ الأمر ستلاحظ في أسفل الملف ستلاحظ المعلومات التالية: اسم الملفعدد أسطر الملفإحداثيات ومكان المؤشّر في الملف التّعامل مع الفقرات1. الأزرار a, o, s | A, O, S للانتقال إلى نمط الكتابةالزر a سيقوم بالانتقال إلى وضع الكتابة بعد موضع المؤشّر مباشرة. للانتقال إلى وضع الكتابة بعد جملة كاملة أو فقرة معيّنة (بـأكملها): Aالزر o (كما ذكرنا سابقا) ينتقل بك إلى نمط الكتابة في سطر جديد (تحت المؤشّر)، أما إذا كنت ترغب بالدّخول إلى نمط الكتابة في سطر جديد فوق المؤشّر فاستعمل: Oالزّرّ s سيقوم بحذف الحرف الذي يوجد فيه المؤشر وينتقل بك مباشر ة إلى وضع الكتابة، أي أن الزر s له دور التعديل. إذا أردت تعديل جملة كاملة أو فقرة معيّنة (بـأكملها): S2. الزرّان r و R للانتقال إلى وضع الاستبداليوجد وضع (نمط) آخر في vim ألا وهو وضع الاستبدال (Replace) يمكنك أن تحزر فائدته من اسمه فقط، ويمكنك أيضا ملاحظة أن الزرّان المسؤولان عن الولوج إليه هما أول حرف من كلمة Replace. النّمط بكل بساطة يُخوّلكَ لاستبدال ما تشاء سواء حرفا واحدا في كل مرّة أو مجموعة في آن واحد. بحيث : الزر r لاستبدال حرف واحد فقط.الزر R لاستبدال عدة حروف في آن واحد.3. المزيد عن الانتقال بين الجمل والفقراتلقد ذكرنا سابقا (الدرس السابق) أساسيّات التّنقل في ملفّ معيّن، سنغطّي المزيد في هذه الفقرة. الانتقال إلى الفقرة التالية، استعمل { . تريد عكس الأمر؟ Ctrl+o سيفي بالأمر. تحريك المؤشر بين الجمل:للانتقال بين الجمل ببساطة استعمل كلا من ( و ) حيث ) للانتقال إلى الجملة التالية و ( للرجوع إلى الجملة السابقة. استعمل الأرقام إذا كنت ترغب بالقفز وتجاوز الجمل، مثلا 3) للانتقال إلى الجملة الثالثة بعد المؤشر (يمكنك تغيير الرقم 3 بما تشاء). للانتقال إلى حرف معيّن:fxحيث x هو المكان الذي نرغب بوضع مؤشر الفأرة عليه. يمكنك استعمال الأرقام أيضا، مثلاً: 3fxفي هذا المثال نُخبِرُ vim بأن ينتقل إلى حرف x الثّالث (يعني تجاوز أوّل حرفين x وانتقل إلى الثّالث). 4. تعليم منطقة معيّنة في ملفكتخيل أنك كتبت كمّا كبيرا من الشيفرة في ملفّك، وأثناء كتابتك في لحظة معينة تذكّرت أنك تحتاج إلى إضافة شيء ما بالأعلى، لنقل بداية الملف، ستقول الأمر سهل كل ما عليّ فعله هو الضغط على gg للانتقال إلى الأعلى ثم أضيف ما أشاء، نعم الأمر يبدو جيّداً، لكن ماذا لو أردت العودة إلى المكان الأول الذي كنت فيه قبل الانتقال إلى الأعلى؟ هنا يأتي دور التعليم أي وضع علامة في مكان ما لتمييزه بزر معين. لاستخدام التعليم قم بالضغط على m (اختصارًا لـِ mark) ثم الزر الذي تريد التعليم به. بالمثال يتضح المقال: إذا كان مؤشر الفأرة مثلا في منطقة ما في وسط الملف (على حرف معيّن بالضبط) وتريد تعليمه بزر a : maالآن انتقل إلى أي مكان ترغبه في الملف وكلما أردت العودة إلى السطر المعلّم بزر a ستضغط على a'، أما إذا كنت ترغب في العودة إلى موضع المؤشّر بالتّحديد فاضغط على a`. يمكنك استعمال أي حرف من ( a-z A-Z ) بشرط أن يكون حرفاً واحداً فقط أي أنّك تملكُ ما مجموعه 52 زرا لتعليم مختلف مناطق الملف. 5. استعمال الأرقام لتكرار العمليّاتإلى الآن، تعرّفنا على استعمالات عديدة للأرقام لكن أهم ما يجب عليك معرفته بخصوص الأرقام هو أنك تستطيع أن تستعملها لتكرّر عملية ما بعدد لا نهائي من المرّات. مثلا لنقل أنّ لدينا جملة في ملفنا، ننسخ الجملة باستعمال yy (اُنظر الدرس الأول) ولكنّنا لا نريد لصقها مرة واحدة فقط بل العديد من المرات (أي تكرارها في الملف n مرّة). للقيام بذلك طبّق الأمر التالي: npبحيث n هو عدد المرات التي ترغب بلصق الجملة في الملف (بعد مؤشر الفأرة مباشرة). أقرب مثال أستحضره حاليا هو القوائم في لغة HTML، لنقل أنّك تحتاج إلى إضافة 10 قوائم في الملف. هل تعتقد أن كتابتها بشكل يدوي سيفي بالغرض؟ (إن كان جوابك نعم فاستعدّ للتضحية بحصة لا بأس بها من وقتك الثمين). بالطبع الجواب هو لا. لذلك كل ما عليك فعله هو كتابة السطر الأول: <li> Item in The List </li>ثم انسخ السطر باستعمال yy ثم ألصقه 10 مرّات باستعمال: 10p طبّقت الأمر 1000000p وحصلت على مليون سطر (نواة لينكس؟) وملف بحجم 28Mb ولا زال vim يستجيب في أجزاء من الثانية، لا تغيير في السرعة حتى عند الحفظ (لا أظن أن أي بيئة تطوير قادرة على فعل نفس الشّّيء خلال جزء من الثانية، وهذا سبب قويّ لاستخدام المحرر، أليس كذلك؟). ملاحظة: هذا مجرد مثال والتطبيقات تكاد تكون لا نهائية لذلك الدّور عليك لتستكشف تطبيقات الطريقة وهذا الأمر متروك لخيالك ومدى رغبتك في التّعلّم . 6. التّراجع وإلغاء التراجعلقد تحدّثتُ أيضاً عن أساسيّات هذه الخاصية في الدرس السابق (u للتراجع عن تعديل ما و Ctrl+r لإلغائِه)، وقد حان الوقت الآن لبعض العمليّات المتقدّمة. تراجع عن جميع التعديلات التي قمت بها قبل x دقائق من الآن: :earlier 2mهذا الأمر يقوم بالتراجع عن جميع التعديلات التي قُمت بها منذ دقيقتين، وبالطبع يمكنك استخدام الثواني كوحدة زمنية. :earlier 25sولعكس العمليّة استعمل later: :later 3mهذه الأوامر مفيدة إذا كنت تقوم بتعديلات عديدة في وقت قصير ولكنّك عادة لا تتذكّر الأوقات بالتّحديد، الرجوع بحسب عدد التّعديلات طريقة أفضل(نعم خاصيّة أخرى). للتّراجع بحسب عدد التّعديلات: :undo 5الأمر أعلاه يقوم بإلغاء آخر خمس تعديلات. عرض قائمة التراجعات: :undolistمحرك البحث في vimvim يمتلكُ محركَ بحث مدهش وقوي يمكنك إعداده وتخصيصه كيفما تشاء، حيث يمكنك إخبار المحرّر بأنك تُريد أن يتجاهل حالة الأحرف (مثلا a وA كلاهما سيوافقان نتائج البحث)، ويمكنك أيضا إعداده لعرض النتائج بشكل فوري (يعني أن يقوم بالبحث بمجرد المباشرة بالكتابة). إخبار المُحرّر بأننا نريد بحثا فوريا: :set incsearchتجاهل حالة الأحرف: :set ignorecaseمثلا إذا قمت بالبحث عن “hello” : /helloستكون النتائج متوافقة مع كل من : Hello , hello , HELLO هذه الإعدادات لن تُسجّل إذا أغلقت المحرّر، وقد ذكرت في الدّرس السّابق أنك تستطيع إضافة أسطر إلى ملف vimrc. لكي تُسجّلَ الإعدادات بشكل افتراضي، حيث يكون كل شيء معدّا مسبقاً فور فتح المحرّر، يمكنك فعل ذلك الآن إذا كنت ترغب في ذلك. فقط افتح الملف (ملف vimrc) وألصق الأسطر التالية في الأسفل: set incsearch set ignorecaseملاحظة: للتنقّل بين عمليات البحث استعمل كلا من n و N. النّصوص داخل الأقواس، علامات التّنصيص والمعقوفاتvim يُوفّر مساعدةً قيّمةً للمبرمجين، حيث يحتوي على كمّ كبيرٍ من الأوامِر التي تُساعدهم على التعامل مع كتلِ التّعليمات البرمجية (code blocks)، إذ يمكّنكَ المحرّر من تعديل، حذف و نسخ كل ما يوجد بداخل الرموز مثل : {} , “ “ , () , `` , <> أو حتى تضمينها كذلك. التعديل1. تعديل ما بداخل الرمزين {}:يمكنك تعديل ما بداخل الرمزين { و } ببساطة وذلك باستعمال الأمر التالي: ci{ أو ci}ملاحظة: يجب على المؤشّر أن يكون إما على أحد الرمزين أو داخلهما (الملاحظة تنطبق على جميع الأوامر أسفله). 2. تعديل ما بداخل الرمزين <>:يمكن ذلك بنفس الطريقة: ci< أو ci>بنفس الطريقة يمكن تعديل ما بداخل الأقواس (): ci( أو ci)3. تعديل ما بداخل علامات التنصيص " أو ' أو ` :ci'أو ci” أو ci`4. تعديل ما بداخل وسوم HTML:يمكن أيضاً تعديل ما بداخل وسوم HTML بالأمر التالي: citالحذفالحذف يكون بنفس طريقة التعديل، فقط استبدِل c ب d، مثلا لحذف ما بداخل الرمزين {}: di{ أو di}أما لحذف ما بداخل وسوم HTML: ditالنسخالنسخ كذلك يتّبع نفس المنطق فقط استعمل y عوضا عن c و d مثلا لنسخ ما بداخل الأقواس (): yi( أو yi)في جميع الأوامر السّابقة تعلّمنا كيف ننسخ ما بالداخل فقط، فماذا لو أردنا تعديل، حذف أو نسخ العلامة أيضا؟ لفعل ذلك فقط استبدل i بـِ a، إليك مثالاً على ذلك: لنقل أنّنا نملك ملفّا يحتوي على الآتي: if (x == 0)إذا طبّقنا الأمر(المؤشّر على أحد القوسين أو بداخلهما): di)سيقوم المحرر بحذف "x == 0". أمّا لو طبّقنا الأمر: da)فسيقوم المحرّر بحذف "(x == 0)". وقِسْ على ذلك بقيّة الأوامر(التّعديل والنّسخ). المسافة البادئة للنّصوص (text indent)المسافة البادئة للأسطر تعدّ من أهمّ ما يجبُ على المبرمج الاهتمام به، إذ أن الشيفرة النّقيّة تعتبر أساساً لتحديد مدى مهارة المُبرمج، وليتمكّن الآخرون من فهم ما كتبه خاصّة إذا كان يعملُ في مشروع مفتوح المصدر. مثال على استعمال المسافات البادئة: if ... // ... else // ... endفي المثال أعلاه كتبنا جملة شرطية بدون أي مسافات بادئة. if ... // ... else // ... endأما في هذا المثال فقد قمنا بوضع مسافات بادئة لمزيد من التنسيق ولك أن تلاحظ الفرق.كما أن هناك لغات تُجبرُك على التّنسيق باستخدام المسافات البادئة (مثل Python) وإلا فلن يعمل البرنامج. في vim هناك العديد من الخيارات للتحكّم بالمسافات البادئة، أولا عليك تفعيل خيار "المسافات البادئة الذكيّ" (Smart indent)، ومن المفضّل أن تضعه في ملفّ vimrc: :set smartindentضبط عرض المسافة البادئةأقصدُ بعرض المسافة البادئة، المسافة التي ستكون بين بداية السطر والكتابة (اُنظر المثال): هذا نص بمسافة بادئة تساوي 0 هذا نص بمسافة بادئة تساوي 1 هذا نص بمسافة بادئة تساوي 4 هذا نص بمسافة بادئة تساوي 10لِضبط المسافة البادئة في vim طبّق الأمر التالي: :set shiftwidth=xحيث x عرض المسافة البادئة، من المُفضّل أن يكون 4 فقط. :set shiftwidth=4لوضع مسافة بادئة لسطرٍ ما استخدم: >ولإلغاء المسافة البادئة: <لوضع مسافة بادئة لمجموعة من الأسطُر: vjjj>حيث v للولوج إلى الوضع المرئي وj للانتقال للأسفل. لوضع مسافة بادئة لما بداخل المعقوفات ({})، إذا كان لديك جملة شرطيّة مثلا في لغة جافاسكريبت: function foo(){ //... //... //... //... }قد ترغب في وضع مسافة بادئة لجميع الأسطر التي تتواجد داخل علامتي { ... } للقيام بذلك ضع المؤشّر على إحدى العلامتين وقم بالضغط على: >i}النتيجة ستكون كالتالي: function foo(){ //... //... //... //... }أمّا إذا أردت أن تنسّق الملف بكاملهِ في آن واحد فالأمر التالي سيُعطيكَ ما تريده: gg=Gحيثُ gg لتحريك المؤشّر إلى أعلى الملفّ و = لإضافة المسافة البادئة وG للانتقال إلى آخر الملفّ. تخصيص مظهر vimمحرّرvim يعتمِد مبدأ البساطة، لكن هذا لا يجعله غير قابل على تخصيص مظهره، بل تستطيع أن تجعل المحرّر فخماً وذا تصميمٍ مُبتكرٍ خاصّة مع الكمّ الكبير من السمات المتاحة له، إذ أن هناك مبرمجون من مختلف أنحاء العالم ينشُرونَ سماتٍ للمُحرّر، وسنكشف بعضاً منها في هذه الفقرة. 1. تنصيب السّماتتنصيب السّمات على محرّر vim سهلٌ جدّاً، ولكنّه يختلف من نِظام تشغيل إلى آخر. لمستخدمي Gnu/Linux أو Mac OSقُم بتحميل المِلفّات (ملفّ واحد في غالب الأحيان) ثمّ اُنقل الملفّات بامتداد vim (مثلا color.vim) إلى المسار التالي : ~/.vim/colors/ملاحظة: علامةُ ~ اختصار يُمثّل مُجلّد المنزل الخاصّ بك. إذا لم يكن مُجلّد colors داخل مجلّد vim. ( المجلّد مخفيّ افتراضياً في متصفّح الملفّات لإظهاره اضغط Ctrl+h) موجوداً فقم بإنشائه. أو طبّق الأمر التالي في الطرفية (Terminal): mkdir ~/.vim/colorsلمستخدمي Windowsهذا هو مسار مُجلّد vim. : %userprofile%\vimfilesكل ما عليك فعله هو الذهاب إلى قائمة" ابدأ" (start) ثمّ " تشغيل" (run) بعد ذلك ألصق الأمر التالي: %userprofile%ثمّ قم بإنشاء مجلد vimfiles، وبعد ذلك أنشئ مجلّداً باسم colors هذا هو المجلّد الذي سنقوم بنقل ملفات السمات داخله. 2. تفعيل السّمات والتبديل بينهاالآن أنت جاهز لتفعيل السمات التي قمت بتحميلها (لا تقلق أنت لم تحمّل شيئا بعد)، بعد إكمال عمليّة نقل الملفّات المناسبة (ذات امتداد vim) إلى مجلد .vim/colorsأو %userprofile%\vimfiles\colorsيمكنك مباشرة فتح vim وتجربة السّمة التي ثبّتها بالأمر: :colorscheme themeسيتغيّر المظهر لكنّ الأمر لن يُحفَظ لحفظه ولإبقاء المظهر في كل مرة تفتح ملفّا في vim عليك إضافة السطر التالي في vimrc. : colorscheme themeبالطبع مع تغيير theme إلى اسم السّمة. 3. السّمات الافتراضيّةلنتحدّث الآن عن سمات المحرّر، في vim هناك سمات افتراضية موجودة أصلاً ولا تحتاج إلى تحميل يمكنك معاينتها وانظُر أأعجبتكَ أم تريد شيئا أفضل: سمة desert سمة blue سمة darkblue سمة delek سمة elflord سمة morning سمة pablo سمة slate هناك المزيد والمزيد من السّمات التي يُوفّرها لك المحرّر يمكنك تصفحها عبر الأمر: :colorscheme <tab>تحميل السّماتإن لم يُعجبك أي مظهر من مظاهر المحرّر الموجودة أعلاه، لا تقلق لا يزال هناك أمل، سأسرد لك بعضا من السّمات الموجودة خارج المحرّر وعليك تحميلها إذا أردت تفعيلها. وكما قلت سابقا لتفعيل أيّ سمة يكفي أن تنقل الملفّ بامتداد vim إلى مجلّد colors ثم نفّذ الأمر: :colorscheme themeحيثُ theme هو اسم الملف، مثلا إذا كان اسم الملفّ color.vim فيكفي أن تغيّر theme إلى color، ولإبقاء السّمة، أضف السّطر إلى ملفّ vimrc.. سمة Guardianهذه أحد السمات التي يمكن تحميلها مثلا، ثم تنصيبها بالطريقة التي قمنا بشرحها أعلاه: سمة Github هذه سمةٌ أخرى يُمكن تحميلها شبيهة بسمة موقع Github. سمة Vividchalk لتحميل السمة. سمة Candy تحميل السّمة ختامالقد تعرّفنا في هذا الدرس على قدراتِ vim المتقدّمة في التّحرير والتّعامل مع مختلف أنواع النّصوص والجمل، وأيضاً على طرق لتخصيص المحرّر، ولكنّه يحوي أكثر من هذا كلّه خاصّة أنّه مليء بالمفاجآت، والإضافات التي تستطيع أن تجعله أكثر من مجرّد محرّر!
  16. الأدوات التي تُساعد المُبرمج في عمله كثيرة ومتعددّة، وهي التي تكون سببا إما في زيّادة أو تقليص إنتاجيته وسرعة عمله، لذلك فمن المهم اختيّار الأدوات بعناية، والمحرر أهم هذه الأدوات، إذ به تنجز معظم عملك البرمجي ولا يمكن لأيّ مبرمج العيش بدون محرّر. في هذا المقال سنطّلع معا على محرّر Vim الذي يعتبر من أشهر المحررات والذي يستخدمه عدد كبير من المبرمجين من مختلف أنحاء العالم في تعاملهم مع لغات البرمجة المختلفة؛ قد تصدمك حقيقة أن vim أُطلق منذ أكثر من 23 عاما، ولكنه لم يَشِخ بعد، فمُجتمَعُهُ لا زال يكبر يوما بعد يوم، ومعظم المبرمجين المعروفين يستخدمونه ويعتمدون عليه في تحرير شِفراتهم. تَعَلُّمُ كيفية التّعامُلِ مع محرّر نصوص؟ نعم لا حرج في ذلك، في الحقيقة عندما تستعمل شيئا ما لساعات طِوال لا بد أن تتعلّم كيف تكون أسرع في إنجاز العمل، ولذلك فإن تعلّم محرّر vim يستحق منك أن تعطيه شيئا من وقتك! ففي النهاية النّتائج هي المهمّة وما تريد أن تصل إليه هو التّعامل مع الملفات البرمجية بشكل أسرع وأكثر إنتاجية. لماذا vim ؟ معظم الذين يجربون هذا المحرر لأول مرة سرعان ما ينعتونه ب “محرّر من العصر الحجري” خاصة بواجهته التي قد تبدو للوهلة الأولى “سيّئة”، والكثير ممّن لا يعرفونه جيّدا يقولون أنه لا يستحق أن يسمى محرّرا إمّا لصعوبة أوامره أو لأسباب أخرى عادة ما تكون مبنية على قلّة المعرفة، فالأوامر ليست صعبة وتستحقّ منك تعلّمها بكلّ تأكيد. لقد وقعتُ في هذا الفخ لكنّني سرعان ما سحبت كلامي بعد أن علمت أنّه من المحرّرات الأكثر استعمالا من طرف المبرمجين، مُدراء الخواديم، بل ويستخدمه عدد لا بأس به من الكتّاب (بالّلغة الإنجليزيّة) للتّدوين في مدوناتهم أو كتابة مقالات وغير ذلك، ولا أظنّني أملك مخزونا كافيّا من الكلمات لوصفه فهو في النّهاية المحرّر الغامض الذي ستتعلّم المزيد عنه كل يوم. معظم الذين يقولون أن المحرّر سيّء لم يجرّبوه في الأساس أو أنّهم لم يدرسوه بشكل جدي، الشّيء الذي ستتفاداه أنت بعد قراءتك لهذا الدّرس. وإليك بعضا من الأسباب التي قد تدفعك إلى تعلّمه 1. لأنّه ممتع أهمّ الأساب التي قد تدفعك لتعلّم vim هو المتعة التي ترافقك أثناء كتابة شيفراتك البرمجية وتعديلها، عند تعَوّدِكَ على إستعمال المحرر ستصل إلى مرحلة يكون فيها التحرير كلعبة بين يديك. 2. لأن الكثير من المبرمجين يستعملونه محرر vim ليس مجرد محررًا بسيطًا، بل هو محرر ذو قدرات عالية وخير دليل على ذلك هو العدد الكبير من المبرمجين الذين يستعملونه، إذ في أحد الإحصائيات فإن أكثر من نصف مبرمجي لغة Ruby وهي لغة كائنية OOP يستعملون vim وحوالي الثلث من مبرمجي Python أيضا يستعملون Vim. الإحصائيتان شملتا عددا من مبرمجي لغتي Ruby وPython فقط وهما لغتان رغم شهرتها إلا أنهما تبقيان أقل شهرة من لغات كـ ++C ، C وJavascript وغيرهم، فما بالك بعدد المستخدمين من المبرمجين باللغات الأخرى. 3. لأنّه قابل للتّخصيص يمكنك تخصيص vim إلى درجة كبيرة حيث يمكنك تغيير الأوامر أو إضافة أخرى جديدة بالإضافة إلى كمية الإضافات الهائلة المتاحة له والتي تجعله قادرا على تنفيذ مهام ووظائف جديدة تُبرمج هذه الإضافات بلغة خاصة تسمى فيمسكريبت vimscript كما يدعم برمجة الإضافات بلغات أخرى مثل (python ; ruby ; tcl ; lua ..) الخلاصة هنا أن محرر Vim يتمتع بالشهرة والكفاءة وقابلية الإستخدام التي ستدفعك إلى تجربته وتعلّم التّعامل معه ففي النهاية إتقان مهارة جديدة أمر يصقل خبرات المبرمج. تنصيب المحرر لتنصيبه على توزيعات جنو/لينكس المبنية على الدبيان (Ubuntu ،Linux Mint ،Elementary OS...)، طبّق هذا الأمر في الطرفية Terminal: $ sudo apt-get install vim لتنصيبه على توزيعة فيدورا، طبق هذا الأمر في الطرفية Terminal: $ sudo yum install vim لتنصيبه على Windows، يمكنك تحميل Gvim، ولتنصيبه على Mac فإن Vim يأتي مثبتا مُسبقا على أنظمة الماك، لذلك كل ما عليك فعله هو كتابة vim في الطرفية Terminal لتشغيله. أهم الأوامر قبل فتح ملفّ يمكنك فتح أي ملف تريده من الطّرفية Terminal بكتابة: vim file.txt غيّر file.txt إلى الملف الذي ترغب في فتحه إن لم يكن موجودا فسيُنشئ vim ملفا بذلك الإسم. ملاحظة: إذا كنت على لينكس أو Mac فتأكّد من أنك على المجلد الصحيح بإستخدام أمر pwd ويمكنك إستخدام أمر ls لعرض الملفات المتاحة كما تستطيع التنقل بين المجلدات بإستخدام: cd directory مع تغيير directory إلى إسم المجلّد وللرّجوع إستخدم: cd .. وللرّجوع إلى مجلّد المنزل قم بإدخال أمر cd فقط أول ما ستقوم به عند فتح vim هو الضغط على زر وهو الذي سيمكنك من الدخول إلى نمط الكتابة ويمكنك كتابة ماتشاء في الملف. [ i] للدخول إلى نمط الكتابة إضغط على. [o] للدخول إلى نمط الكتابة في سطر جديد. [Esc] للخروج من نمط الكتابة إلى نمط الأوامر. [v] للدخول إلى النمط المرئي ومنه يمكنك تحديد نص أو مجموعة كلمات. أنماط (أوضاع) Vim نمط الكتابة Insert mode نمط الكتابة يمَكّنكَ من كتابة وتعديل ما تشاء. وهو النمط الأساسي (الجزء الذي لا يحتاج إلى تعلّمه). النمط المرئي Visual mode في النمط المرئي يمكنك تحديد النصوص والكلمات بإستعمال طُرق الإنتقال (التي سنذكرها لاحقا)، وتطبيق الأوامر عليها سواء حذفها أو نسخها أو تعديلها... نمط الأوامر Command mode نمط الأوامر هو النّمط الذي يخوّل لك إعطاء الأوامر للمحرر, سواء كان حذف كلمة أو حذف جملة أو تغيير شيء ما أو أي شيء من هذا القبيل وهو النمط الإفتراضي. أوامر Vim فتح ملف بإسمه (إذا كان موجودا في نفس المجلد): :e file.txt إذا كان في مجلد آخر: :e directory/file.txt إذا أردت تصفح الملفات الموجودة وإختيّار ملف: :e . للحفظ تحت إسم آخر: :w إسم_الملف حفظ الملف: :w الحفظ والمغادرة: :wq المغادرة بدون حفظ: :q! إستعمال أوامر النظام داخل vim يمكنك إستعمال أوامر النظام في vim كالتالي: :! cmnd مثلا لنقل أنك تعمل على صفحة Html وتريد عرضها بمتصفح فايرفوكس، كل ما عليك فعله هو: :! firefox index.html يمكنك الإنتقال بين الأحرف باستخدام الأسهم على لوحة المفاتيح أو يمكنك استعمال الأحرف: k أعلى j أسفل h يسار l يمين تستطيع القفز من مكان إلى آخر بإضافة عدد الأحرف أو الأسطر المراد تجاوزها قبل كل سهم، مثلا إذا أردت الإنتقال 20 حرفا إلى اليمين: 20l الإنتقال 35 سطرا إلى الأسفل: 35j الإنتقال إلى بداية الملف: gg الإنتقال إلى نهاية الملف: G الإنتقال إلى بداية السطر: 0 الإنتقال إلى نهاية السطر: $ الإنتقال إلى سطر معين (السطر 15 في هذا المثال): 15gg للتراجع عن تعديل: u للتراجع عن التراجع: Ctrl + r نسخ سطر: yy حذف سطر: dd نسخ، حذف عدد من الأسطر (4 في هذا المثال): 4dd 4yy حذف كلمة (ضع المؤشر على أول الكلمة): dw yw للنسخ للقص يمكنك إستبدال d و y بـِ x للصق الجزء المنسوخ أو المقصوص: p لتحديد جزء من النّص: أدخل إلى النمط المرئي بإستعمال Ctrl + v ثم إنتقل بإستخدام الأحرف hjkl أو الأسهم لتحديد ما تريد. التعامل مع النص المحدد: للتعامل مع النص المحدد يمكنك ببساطة إستعمال الأحرف y للنسخ و d للحذف و x للقص. وللبحث عن نص ما: /Search_query إستبدل Search_query بما تبحث عنه. التعامل مع عدة ملفات في آن واحد: يمكنك تقسيم الشاشة إلى ما تشاء من الأجزاء والتعامل مع الملفات - الأمر أشبه بالنوافذ المبوبة tabs (الموجودة كذلك في vim). لتقسيم الشاشة أفقيا : :sp عموديا : :vs للتّنقل بين أقسام الشاشة : Ctrl + ww أو: Ctrl + w + الأسهم التّبويبات Tabs لفتح عدّة ملفات كل ملف في تبويبة يمكنك تنفيذ الأمر التالي (في الطّرفيّة Terminal): $ vim -p file1 file2 file3 إنشاء نافذة جديدة: :tabnew إغلاقها: :tabc الإنتقال إلى التّبويبة التالية: :tabn (n إختصارا ل next) الإنتقال إلى التّبويبة السابقة: :tabp (p إختصار ل previous) يمكن إستعمال الأرقام فمثلا للقفز إلى التّبويبة الثالثة: :tabn3 الذهاب إلى التّبويبة الأخيرة: :tabl الرجوع إلى التّبويبة الأولى: :tabr لعرض التّبويبات: :tabs التّعامل مع التّبويبات هكذا أمر متعب أليس كذلك ؟ كل ما عليك فعله هو إنشاء إختصارات لها وهذا سكريبت جاهز يقوم بالأمر: فقط أضف الأسطر إلى ملف vimrc. الموجود في مجلّد المنزل HOME$ (ربما قد لا يكون موجودا، عليك إنشاءه إن لم يكن موجودا): map <C-t><up> :tabr<cr> map <C-t><down> :tabl<cr> map <C-t><left> :tabp<cr> map <C-t><right> :tabn<cr> ملاحظة: بما أن الملف يبدأ بنقطة فهو مخفي، إذا حاولت رؤيته من متصفح ملفات فعليك أن تظهر الملفات المخفية (Ctrl+h). ملاحظة لمستخدمي Windows، للحصول على ملف vimrc عليك القيام بالتالي: افتح قائمة ابدأ (start) ثمّ "تشغيل" (run) بعد ذلك ألصق الأمر التالي: %userprofile% ثمّ قم بإنشاء ملفّ باسم: _vimrc الإختصارات الآن هي كالتالي : Ctrl + t + الأسهم الأعلى والأسفل للتنقل بين التبويبة الأولى والأخيرة على التوالي، وأما الأسهم يمين ،يسار فهي للتنقل بين التبويبات بشكل عادي (التالية ، السابقة). بعض الأسطر التي قد تَوَدُّ إضافتها لملف vimrc. set encoding=utf-8 set number set hlsearch set hlsearch لتضليل النص الذي تبحث عنه set number لإضافة الأرقام في الجانب ملاحظة: يمكنك إظهار الترقيم فقط بكتابة: :set number وهذه صورة للمحرر بعد إضافة setnumber إلى ملف vimrc: خاتمة vim يمتلك العديد من الأوامر والمميزات، العديد منها بحيث لا يستطيع مقال واحد شرحها، لذلك فهذا المقال مجرد مدخل إلى عالم محرر Vim و أنصحك بقراءة المزيد عنه إذا كنت مهتما، سنتعرف في الجزء الثاني من أساسيات Vim عن معلومات إضافية عن هذا المحرر وكيفية تطويعه لمتطلباتك اليومية.
  17. ببساطة أبنتو وفيدورا توزيعتان من توزيعات جنو/لينكس والإختلاف الأساسي بينهما هي أن الأولى مبنية على توزيعة دبيان والثانية مبنية على توزيعة ريدهات ؛ وتختلفان في مدير الحزم فأبنتو يستخدم apt-get لتثبيت البرامج و فيدورا تستخدم yum ؛ وهناك إختلافات أخرى . وأنصحك بشدة كمبتدئ البداية مع أبنتو لعدة أسباب أهمها : - توفر الدعم وسهولة إيجاد حل لأي مشكلة قد تواجهك - معظم الدروس على الويب عادة ما تعطيك أمرا لتنفذه على الطرفية terminal لتنصيب برنامج على حاسوبك ومعظم الدروس لا تهتم بمستخدمي فيدورا لإفتراضهم بأن مستخدمي فيدورا يعلمون كيف يبحثون عن طريقة التنصيب على أجهزتهم - فيدورا ليست للمبتدئين إذ عادة ما ستواجهك يعض المشاكل المتعلقة بتنصيب البرامج إذا لم تكن على علم بشيء بسيط من طرق التعامل مع الطرفية أما إذا كانت لك خلفية في التعامل مع بعض من توزيعات جنو/لينكس ففيدورا تساعدك على : - فهم أكثر للنظام وكيفية التعامل مع الطرفية ومدير الحزم - فهم أكثر لتوزيعات لينكس والإختلافات بين كل توزيعة وشقيقتها وهذا الغرض من سؤالك - بناء مهارة البحث وإستعمال العم جوجل وكذا تعلم القليل من الإنجليزية (هذه المهارة ستأتيك بشكل تدريجي عند مواجهتك لكل مشكلة) لكنّي لا أنصحك أبدا بإستعمال فيدورا إلا في حالة كانت لك خلفية في التعامل مع الدروس المتوفرة على الأنترنت بصبر وحذر وإلا فقد تدمر جهازك أثناء لعبك بصلاحيات المدير في اللينكس (المدير أو الجذر root يمكنه تدمير كل شيء بأمر واحد فقط على الطرفية ) الخلاصة هي أن تبدأ بأبنتو حتى تتمكن من أساسيات إستعمال الطرفية ملاحظة : الطرفية هي أداة لكتابة الأوامر للجهاز ، يمكنك أن تتفاداها في بدايتك مع جنو/لينكس ففي أبنتو يوجد متجر للتطبيقات يمكنك من خلاله تثبيت ما تشاء من برامج يغنيك عن إستعمال الطرفية أو كتابة الأوامر للجهاز .
×
×
  • أضف...