المحتوى عن 'اتصال'.



مزيد من الخيارات

  • ابحث بالكلمات المفتاحية

    أضف وسومًا وافصل بينها بفواصل ","
  • ابحث باسم الكاتب

نوع المُحتوى


التصنيفات

  • التخطيط وسير العمل
  • التمويل
  • فريق العمل
  • دراسة حالات
  • نصائح وإرشادات
  • التعامل مع العملاء
  • التعهيد الخارجي
  • التجارة الإلكترونية
  • الإدارة والقيادة
  • مقالات ريادة أعمال عامة

التصنيفات

  • PHP
    • Laravel
    • ووردبريس
  • جافاسكريبت
    • Node.js
    • jQuery
    • AngularJS
    • Cordova
  • HTML
    • HTML5
  • CSS
  • SQL
  • سي شارب #C
    • منصة Xamarin
  • بايثون
    • Flask
    • Django
  • لغة روبي
    • Sass
    • إطار عمل Bootstrap
    • إطار العمل Ruby on Rails
  • لغة Go
  • لغة جافا
  • لغة Kotlin
  • برمجة أندرويد
  • لغة Swift
  • لغة R
  • لغة TypeScript
  • سير العمل
    • Git
  • صناعة الألعاب
    • Unity3D
  • مقالات برمجة عامة

التصنيفات

  • تجربة المستخدم
  • الرسوميات
    • إنكسكيب
    • أدوبي إليستريتور
    • كوريل درو
  • التصميم الجرافيكي
    • أدوبي فوتوشوب
    • أدوبي إن ديزاين
    • جيمب
  • التصميم ثلاثي الأبعاد
    • 3Ds Max
    • Blender
  • نصائح وإرشادات
  • مقالات تصميم عامة

التصنيفات

  • خواديم
    • الويب HTTP
    • قواعد البيانات
    • البريد الإلكتروني
    • DNS
    • Samba
  • الحوسبة السّحابية
    • Docker
  • إدارة الإعدادات والنّشر
    • Chef
    • Puppet
    • Ansible
  • لينكس
  • FreeBSD
  • حماية
    • الجدران النارية
    • VPN
    • SSH
  • مقالات DevOps عامة

التصنيفات

  • التسويق بالأداء
    • أدوات تحليل الزوار
  • تهيئة محركات البحث SEO
  • الشبكات الاجتماعية
  • التسويق بالبريد الالكتروني
  • التسويق الضمني
  • التسويق بالرسائل النصية القصيرة
  • استسراع النمو
  • المبيعات
  • تجارب ونصائح

التصنيفات

  • إدارة مالية
  • الإنتاجية
  • تجارب
  • مشاريع جانبية
  • التعامل مع العملاء
  • الحفاظ على الصحة
  • التسويق الذاتي
  • مقالات عمل حر عامة

التصنيفات

  • الإنتاجية وسير العمل
    • مايكروسوفت أوفيس
    • ليبر أوفيس
    • جوجل درايف
    • شيربوينت
    • Evernote
    • Trello
  • تطبيقات الويب
    • ووردبريس
    • ماجنتو
  • أندرويد
  • iOS
  • macOS
  • ويندوز

التصنيفات

  • شهادات سيسكو
    • CCNA
  • شهادات مايكروسوفت
  • شهادات Amazon Web Services
  • شهادات ريدهات
    • RHCSA
  • شهادات CompTIA
  • مقالات عامة

أسئلة وأجوبة

  • الأقسام
    • أسئلة ريادة الأعمال
    • أسئلة العمل الحر
    • أسئلة التسويق والمبيعات
    • أسئلة البرمجة
    • أسئلة التصميم
    • أسئلة DevOps
    • أسئلة البرامج والتطبيقات
    • أسئلة الشهادات المتخصصة

التصنيفات

  • ريادة الأعمال
  • العمل الحر
  • التسويق والمبيعات
  • البرمجة
  • التصميم
  • DevOps

تمّ العثور على 5 نتائج

  1. سنبدأ في هذا الدرس من سلسلة تعلّم برمجة تطبيقات أندرويد باستخدام Xamarin.Forms ببناء تطبيق عملي بمعايير تقنيّة عالية. حيث سنستخدم المعارف التي حصلنا عليها من الدروس السابقة في بناء تطبيق جهات اتصال بسيط لكنّه يستخدم تقنيّات ومفاهيم متقدّمة نسبيًّا. سنتناول هذا التطبيق على ثلاثة أجزاء متتالية، إليك وصف مختصر لمحتوى كلّ منها: الجزء الأوّل: شرح الغاية من التطبيق، وتوضيح فكرة نموذج المستودع Repository في بناء التطبيقات، مع بناء الهيكل العام للتطبيق، وهذا هو محتوى هذا الدرس. الجزء الثاني: تجهيز النواحي الوظيفيّة للمستودع وجعله قابلًا للاستخدام. الجزء الثالث: تنفيذ واجهتي التطبيق الرئيسية والفرعيّة الخاصّة بعرض التفاصيل. وتنفيذ عمليّة التنقّل بين الواجهتين الغاية من التطبيق وكيف يعمل فكرة التطبيق بسيطة للغاية، تتلخّص بعرض جهات اتصال موجودة مسبقًا وإمكانية البحث ضمنها، مع إمكانيّة إضافة جهات اتصال جديدة وتحريرها وحذفها. يعتمد التطبيق على وجود واجهتين. الواجهة الأولى هي الواجهة الرئيسيّة وتحتوي على قسم خاص بالبحث حسب الاسم أو الكنية عن أيّ جهة اتصال موجودة مسبقًا، بالإضافة إلى قائمة لعرض جهات الاتصال الناتجة عن عمليّة البحث، وأخيرًا زر خاص بإضافة جهات اتصال جديدة. انظر الشكل التالي الذي ينتج عند ضغط زر البحث FIND عند عدم تحديد أي معيار للبحث: عندما يقوم المستخدم بنقر زر البحث FIND دون أن يحدّد أي معيار، سيقوم التطبيق بعرض جميع جهات الاتصال الموجودة لديه، والتي ستكون في هذه النسخة من البرنامج عبارة عن بيانات وهمية موجودة ضمن ذاكرة التطبيق. أمّا عند تحديد المستخدم للاسم أو الكنيّة فسيعمل التطبيق على البحث مستخدمًا منطق AND. أمّا الواجهة الثانية، فتظهر عندما يلمس المستخدم إحدى جهات الاتصال من القائمة السابقة، حيث تعرض هذه الواجهة بيانات تفصيليّة حول جهة الاتصال هذه: الاسم والكنية ورقم الهاتف وعنوان البريد الإلكتروني والهوايات. انظر إلى الشكل التالي: من الممكن تعديل أيّ من هذه البيانات ثم ينقر المستخدم زر الحفظ لحفظها، أو أن ينقر زر الرجوع إلى الواجهة السابقة الموجود في الأعلى بجانب أيقونة البرنامج في حال لم يرغب بتعديل البيانات. كما يمكن للمستخدم أن يحذف جهة الاتصال هذه بنقره على زر الحذف Delete كما يظهر من الشكل السابق. وهذه ببساطة فكرة التطبيق. نموذج المستودع Repository عندما تكبر التطبيقات وتتنوّع المهام المطلوبة منها تبرز الحاجة لوسيلة لتنظيم العمل داخل التطبيق. في الحقيقة توجد العديد من النماذج التي تدعمها Xamarin لهذه الغاية مثل نموذج MVVM الذي يستخدم بفعالية ضمن Xamarin لتنظيم وفصل الأجزاء المسؤولة عن الواجهات عن الأجزاء المسؤولة عن منطق العمل عن تلك المسؤولة عن التعامل مع مزودات البيانات البعيدة أو المحلية باختلاف أنواعها. من النماذج التي أفضلها شخصيًّا هو نموذج المستودع Repository الذي أستخدمه على نحو واسع في جميع أنواع التطبيقات التي أعمل عليها. فهو أسلوب جميل ومنطقي ويسمح بتطوير التطبيق بشكل سلس وسريع للعمل في مختلف أنواع البيئات، وهو متوافق للعمل مع نموذج MVVM. يسمح نموذج المستودع بعزل الشيفرة البرمجيّة المسؤولة عن التعامل مع البيانات عن منطق البرنامج business logic. وفي هذا الأمر عدة فوائد من أهمّها: تنظيم البرنامج، وجعله أكثر قابليّة للفهم والتطوير. إجراء تطوير على أسلوب التعامل مع البيانات دون إجراء أي تغيير في منطق عمل البرنامج. إمكانيّة إجراء تغيير جذري لنوع الخدمة التي نستخدمها لتخزين البيانات دون تغيير يُذكر في منطق العمل. سأخوض مباشرةً في كيفية اعتماد هذا النموذج في تطبيقنا هذا. حيث سنحتاج إلى استخدام واجهة واحدة Interface مع صنف واحد يُحقّقها. لتنعش ذاكرتك حول الواجهات انظر هذا الدرس. لنبدأ الآن في بناء هذا التطبيق وذلك في الفقرة التالية. بناء التطبيق ابدأ بإنشاء مشروع جديد من النوع Blank App (Xamarin.Forms Portable) وسمّه ContactsApp ثم أبق فقط على المشروعين ContactsApp (Portable) و ContactsApp.Droid كما وسبق أن فعلنا في هذا الدرس. من نافذة مستكشف الحل Solution Explorer انقر بزر الفأرة الأيمن على المشروع ContactsApp واختر من القائمة التي ستظهر الخيار Add ثم من القائمة الفرعية الخيار New Folder لإضافة مجلّد جديد. سمّ هذا المجلّد بالاسم Entities، وبعد أن يظهر في نافذة الحل Solution Explore انقر عليه بزر الفأرة الأيمن واختر الخيار Add ومن القائمة الفرعية اختر Class. ستظهر نافذة تسمح لك بتعيين اسم لهذا الصنف. اختر الاسم Contact له. هذا الصنف هو حجر البناء الأساسي لهذا البرنامج والذي يمثّل منطق العمل فيه. احرص على جعل محتويات الملف Contact.cs كما يلي: namespace ContactsApp.Entities { public class Contact { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Tel { get; set; } public string EMail { get; set; } public string Hobbies { get; set; } public override string ToString() { return string.Concat(FirstName, " ", LastName); } } } يحتوي الصنف Contact كما يظهر من الشكل السابق على البيانات الأساسيّة التي تحتاجها أيّة جهة اتصال، بالإضافة إلى خاصيّة الهوايات Hobbies التي قد تبدو غريبة قليلًا بالنسبة لجهة اتصال. انقر مرّة أخرى بزر الفأرة الأيمن على المشروع ContactsApp ثم اختر من القائمة التي ستظهر الخيار Add ثم من القائمة الفرعية الخيار New Folder لإضافة مجلّد جديد. سمّ هذا المجلّد بالاسم Abstract، وبعد أن يظهر في نافذة الحل Solution Explore انقر عليه بزر الفأرة الأيمن واختر الخيار Add ومن القائمة الفرعية اختر New Item. ستظهر نافذة تسمح لك بتعيين نوع العنصر المراد إضافته. اختر واجهة Interface وعيّن الاسم IContactsRepository لها. واحرص على أن تكون محتويات الملف IContactsRepository.cs كما يلي: using System.Threading.Tasks; using System.Collections.ObjectModel; using ContactsApp.Entities; namespace ContactsApp.Abstract { public interface IContactsRepository { Task<ObservableCollection<Contact>> GetContactsAsync(string firstName, string lastName); Task<bool> AddContactAsync(Contact contactToAdd); Task<bool> UpdateContactAsync(Contact contactToUpdate); Task<bool> DeleteContactAsync(Contact contactToDelete); } } تُستَخدَم الواجهات عمومًا عندما نرغب بتجريد Abstraction الأمور وجعلها عموميّةً وفي ذلك فائدة كبيرة في جعل الشيفرة البرمجيّة أكثر قابليّة للفهم ولإعادة الاستخدام. وهذا سبب إضافة هذه الواجهة إلى المجلّد Abstract. لا تحتوي الواجهات على أيّة شيفرة برمجيّة كما نعلم، فكل ما تحتويه هو عبارة عن تصاريح لتوابع يجب تحقيقها ضمن أيّ صنف يرغب بتحقيق هذه الواجهة. تحتوي هذه الواجهة باختصار على العمليّات الأساسيّة التي يحتاجها تطبيقنا لإنجاز المهام المنوطة به وهي: الحصول على جهات الاتصال حسب الاسم والكنية GetContactsAsync، وإضافة جهة اتصال جديدة AddContactAsync، وتحديث جهة اتصال موجودة مسبقًا UpdateContactAsync، وحذف جهة اتصال DeleteContactAsync. أمّا سبب وجود الكلمة Async في كلّ من هذه التوابع فهو للإشارة إلى أنّه يُفترض بها أن تستخدم تقنيّة البرمجة غير المتزامنة Asynchronous Programming التي تحدثنا عنها في هذا الدرس. المثير في الأمر أنّ هذه الواجهة لا تهتم بمكان وجود البيانات أو كيفيّة الحصول عليها والتعامل معها. إنّما تهتم فقط بما يحتاجه التطبيق وبشكل مجرّد. سنكرّر الآن نفس العمليّة لإضافة مجلّد جديد ضمن المشروع ContactsApp.cs واسمه Concrete وهو الذي سيحتوي على الصنف الذي سيحقّق الواجهة IContactsRepository السابقة. انقر بزر الفأرة الأيمن على هذا المجلّد واختر Add. ومن القائمة الفرعية اختر Class. سمّ هذا الصنف بالاسم MemoryContactsRepository واحرص على أن تكون محتوياته كما يلي: using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Collections.ObjectModel; using ContactsApp.Abstract; using ContactsApp.Entities; namespace ContactsApp.Concrete { public class MemoryContactsRepository : IContactsRepository { private ObservableCollection<Contact> contacts; public MemoryContactsRepository() { contacts = new ObservableCollection<Contact>() { new Contact() { Id=1, FirstName = "Ahmad", LastName="Saeed", Tel="123456", EMail="admin@example.com", Hobbies="Swimming" }, new Contact() { Id=2, FirstName = "Mahmood", LastName="Maktabi", Tel="852136", EMail="info@example.com", Hobbies="Reading" }, new Contact() { Id=3, FirstName = "Mazen", LastName="Najem", Tel="987456", EMail="it@example.com", Hobbies="Swimming" }, new Contact() { Id=4, FirstName = "Sawsan", LastName="Hilal", Tel="741258", EMail="sales@example.com", Hobbies="Writing, Reading" }, new Contact() { Id=5, FirstName = "Musab", LastName="Aga", Tel="357159", EMail="admin@example.com", Hobbies="Sport" } }; } public async Task<ObservableCollection<Contact>> GetContactsAsync(string firstName, string lastName) { throw new System.NotImplementedException(); } public async Task<bool> AddContactAsync(Contact contactToAdd) { throw new System.NotImplementedException(); } public async Task<bool> UpdateContactAsync(Contact contactToUpdate) { throw new System.NotImplementedException(); } public async Task<bool> DeleteContactAsync(Contact contactToDelete) { throw new System.NotImplementedException(); } } } الأمر الملفت للنظر هنا أنّ بيانات جهات الاتصال موجودة ضمن هذا الصنف بالفعل وتحديدًا ضمن بانيته. وهي مخزّنة ضمن المتغيّر contacts وهو معرّف على مستوى الصنف ومن النوع العمومي ObservableCollection الذي سنتحدّث عنه في الدرس التالي. يكفي الآن أن تعرف أنّه عبارة عن مجموعة عناصرها كائنات من النوع Contact وهي تُفيد في التطبيقات التي تُستخدَم فيها البرمجة غير المتزامنة. من غير الواقعي بكل تأكيد وجود البيانات مخزّنة في الصنف بهذه الطريقة، فالمفترض أن تكون ضمن قاعدة بيانات محليّة أو بعيدة أو حتى ضمن ملف عادي. في الواقع تبرز هنا قوّة نموذج المستودع Repository في عزل أسلوب الحصول على البيانات عن البرنامج الفعلي. من الواضح أيضًا أنّ التوابع الموجودة هنا تحتوي في الحقيقة على شيفرة برمجيّة تؤدّي إلى رمي الاستثناء NotImplementedException وذلك لتذكرينا بعدم جاهزيتها بعد. سيبدو مستكشف الحل في نهاية المطاف شبيهًا بالشكل التالي: الخلاصة هذا الدرس هو المقدّمة لتطبيق جهات الاتصال الذي سنتابع بناءه على مدى الدرسين التاليين. تناولنا في هذا الدرس فكرة التطبيق الأساسيّة، وتوضيح فكرة نموذج المستودع Repository من خلال بناء واجهة تمثّله بالإضافة إلى صنف يحقّقها. سيمكننا من خلال هذا الصنف (صنف المستودع) التعامل مع بيانات موجودة ضمن ذاكرة التطبيق فقط. ورغم كون هذا الأسلوب غير واقعي، إلَّا أنّه ضروري في تبسيط الأمور وجعلها أسهل للفهم. كما أنشأنا صنف يمثّل جهة الاتصال في التطبيق. ورأينا ماهية العلاقة بينه وبين صنف المستودع، من خلال الاستدعاءات إلى التوابع الموجودة ضمن الصنف الأخير. حقوق الصورة البارزة محفوظة لـ Freepik
  2. كثيرًا ما نحتاج إلى أخذ نسخة احتياطية من جهات الاتصال والتي تحوي أرقام الهواتف ومعلومات أخرى وذلك للحالات الطارئة كحدوث عطل ما في الهاتف ومسح جميع بياناته أو ضياع الهاتف أو حتى سرقة الهاتف. هناك عدة طرق لإنشاء نسخة احتياطية عن جهات الاتصال منها أن يتم حفظ هذه النسخة على بطاقة SIM أو على بطاقة ذاكرة خارجية ولكن هذه البطاقات معرّضة للتلف والضياع والسرقة أيضًا، لذلك فهي ليست الطريقة الأكثر مثالية لحفظ نسخة احتياطية من جهات الاتصال عليها. أفضل الطرق هي بحفظ هذه النسخة الاحتياطية على الإنترنت ولحسن الحظ يوفّر نظام الأندرويد هذه الميزة عبر وجود خاصية مزامنة جهات الاتصال هذه مع حسابك على جوجل ضمن صفحة بريدك الإلكتروني Gmail وبذلك يمكنك استعادة هذه النسخة في أي وقت طالما أن الاتصال بشبكة الإنترنت متوفر. إعداد الهاتف للمزامنة يجب أن يكون الهاتف معدًّا لتنفيذ ميزة المزامنة وذلك يتم عبر ربط نظام الأندرويد بحسابك على Google. فإذا كنت قد قمت بهذا مسبقًا فيمكنك تجاوز هذه الخطوة، وإلا فتابع معنا كيفية القيام بذلك. يجب عليك بمجرد حصولك على هاتف جديد يعمل بنظام الأندرويد أن تقوم بربطه مع حسابك على Google وذلك لأسباب كثيرة، قد يكون أهمّها هو الحاجة لمثل هذا الحساب للتّمكن من تحميل التطبيقات من متجر Google Play، إضافة إلى أمور أخرى مثل تمكين الهاتف من مزامنة جهات الاتصال أو الصور أو بيانات أخرى كما يمكنك إدارة هاتفك من خلال عملية الربط هذه كمسح البيانات عن بعد في حال تعرّضه للسرقة أو الضياع أو تثبيت أي تطبيق أو لعبة عليه من خلال الحاسوب مباشرة بدون العمل على الهاتف أو وصله بالحاسوب وغيرها الكثير من المزايا. لربط هاتفك بحسابك على Google قم بالخطوات التالية: ادخل إلى قائمة تطبيقات الهاتف من خلال النقر على أيقونة المربعات. انقر على أيقونة الضبط (الإعدادات). ابحث ضمن قوائم الضبط عن قائمة (الحسابات والنسخ الاحتياطي) ثم اختر خيار (حسابات). إذا وجدت بريدك على Gmail فقم بتخطي هذه العملية وانتقل مباشرة إلى خطوات المزامنة. وإلا فقم بالخطوة التالية. انزل إلى آخر القائمة واختر (إضافة حساب). اختر خيار google. ابدأ بتسجيل دخولك على حسابك في Gmail عبر إدخال بريدك الإلكتروني وكلمة المرور. ثم اضغط على (موافق) للموافقة على بنود الاستخدام وسياسة الخصوصية. أصبح هاتفك مُعدًّا وجاهزًا لعملية المزامنة الأن. مزامنة جهات الاتصال مع حساب Google بعد ربط هاتفك بحسابك على Gmail يمكنك مزامنة جهات الاتصال. اتبع ذات الخطوات الأولى في الفقرة السابقة والمرور عبر القوائم حتى تصل إلى حساب Google. انقر على بريدك الإلكتروني. ستظهر نافذة بكل البيانات التي نستطيع مزامنتها مع سحابة Google الخاصة بنا عبر الإنترنت. ومن أهمها مزامنة جهات الاتصال. ويمكنك النقر على خيار (المزامنة الآن) أسفل الشاشة لتبدأ عملية مزامنة جميع البيانات المطلوبة. دمج جهات الاتصال (مشكلة في مزامنة جهات الاتصال) في بعض الأحيان ستكتشف بأن العديد من جهات الاتصال غير منسوخ نسخة احتياطية على حسابك على Google ويمكن التأكّد من ذلك عبر طريقتين، إمّا عبر موقع Gmail حيث ندخل إلى صفحة البريد الإلكتروني. ثم نضغط على كلمة Gmail في أقصى الركن العلوي من صفحة الموقع لتظهر قائمة نختار منها Contacts (جهات الاتصال). الآن يمكنك تصفح جهات الاتصال الخاصة بك والتي تمت مزامنتها بالفعل. وهنا قد تكتشف عدم وجود بعض الأسماء في الموقع. أو تابع معي ذلك خطوة بخطوة. انقر على أيقونة قوائم الهاتف. ثم انقر على أيقونة جهات الاتصال. وعندما تقوم بتصفّح جهات الاتصال ستجد رمز g والذي هو علامة Google ما يدل على أن جهة الاتصال هذه تمت مزامنتها وهي منسوخة على حسابك على Google بالفعل. ولكن قد تكتشف عددًا من جهات الاتصال لا يوجد بجانبها رمز Google وهو ما يدل على عدم مزامنتها. قم بمزامنة جهات الاتصال بشكل فوري وعد مجدّدًا إلى هذه القائمة. قد تكتشف بأن بعض جهات الاتصال لن تقبل بالمزامنة ولن تقوم به. يوجد حل ممتاز لهذه المشكلة وهي بدمج الحسابات بحيث سنقوم بدمج هذه الأسماء مع حسابك على Gmail بشكل أكيد عبر الضغط على أيقونة قائمة خيارات جهات الاتصال في أسفل الشاشة. ثم اختر (دمج الحسابات). اختر خيار (الدمج مع Google). إذا ظهرت هذه الرسالة فانقر (موافق). لن يستغرق الأمر سوى ثانية لتظهر علامة g الخاصة بحساب Google بجانب جميع الأسماء. ولو ذهبت إلى موقع Gmail من جديد ونظرت إلى صفحة Contacts فسوف تجد جميع الأسماء وقد تم نسخها. يبقى أن نذكر أنه من الممكن الدخول إلى حساب Google وإضافته عبر الدخول إلى قائمة (جهات الاتصال) ثم الضغط على زر القائمة واختيار (حسابات) من القائمة حيث ستجد خيار إضافة حساب جديد أو يمكنك التعديل أو مزامنة الحسابات الموجودة مسبقًا. والآن في حال قمت بتهيئة الهاتف أو تم مسح بياناته لأي سبب كان يمكنك ربطه مع حسابك على Google ثم تفعيل خيار المزامنة أو دمج الحسابات لتستعيد جهات الاتصال بالكامل. الأمر ذاته ينطبق في حال اشتريت هاتفًا جديدًا فكل ما عليك القيام به هو ربط هذا الهاتف بحسابك على Google ثم مزامنة جهات الاتصال لتكون جهات الاتصال كلها على الهاتف الجديد بلمح البصر. ولكن عليك التنبه لأمر هام، عند استعادتك لجهات الاتصال القديمة عليك تحديد الاستعادة من حساب Google فقط فقد يكون هناك نسخة مختلفة محفوظة على بطاقة SIM أو بطاقة الذاكرة الخارجية وفي حال قمت باستعادة جميع هذه الأسماء معًا فإن الأسماء ستتكرر وسيتم حفظها جميعها بدون أي دمج للأسماء المُكررة وبهذا ستظهر العديد من الأسماء مُكررة عدّة مرات، وعندها ستضطر للجوء لعملية شاقة وبرامج مختلفة بغية دمج الأسماء المكررة أو حذف الأسماء المكررة المتطابقة. أو لعلّ الطريقة الأسهل في تلك الحالة هي بحذف جميع الأسماء واستعادة الأسماء الموجودة في حساب Google فقط.
  3. لا يوجد حافز أقوى من الاتصالات القوية مع الفريق، إن القُرب يخلق ويحافظ على الدافع للقيام بأفضل مما هو متوقع. من الممكن أن تكون الفرق التي تعمل عن بعد متماسكة، لكن بُعد المسافة بين أعضاء الفريق يتطلب منك تخطيطً أفضل وجهدًا مدروسًا، ولتحقيق ذلك عليك الاعتماد بشكل أكبر على التنظيم وبشكل أقل العفوية. ومن أفضل الطرق للقيام بالتحسينات هي الاستلهام من الشركات الأخرى، سواء كانت تعمل بفرق مُوزّعة أو غير ذلك. ونحن بالتأكيد تعلمنا الكثير بهذه الطريقة. ومع أخذ ذلك بعين الاعتبار، ستجد في هذا المقال نظرة على الكيفية التي جعلنا فيها من ترابط الفريق أولوية في Help Scout . جمعة فيكا كلمة فيكا Fika هي تقليد سويدي، وجمعة فيكا الخاصة بنا هي استراحة من 15 إلى 30 دقيقة للتحدث مع شخص تختاره بشكل عشوائي من فريق Help Scout. وليس من الضروري وجود القهوة والحلويات ولكن يستحسن ذلك. نعالج في جمعة فيكا حقيقة أننا نجتمع عادة مع الأشخاص الذين هم مثلنا، حيث يمضي الناس أوقاتهم عادةً مع أولئك الذين يعملون معهم في في نفس القسم، لذلك نجمع أعضاء الفريق في جمعة فيكا للتحدث سويةً عن أي شيء. وعلى الرغم من إمكانية النقاش في أي موضوع دون الحاجة إلى وجود أساس مسبق. إلا أنني أوصي بتحديد موضوع افتتاحي كل أسبوع لتسهيل المهمة وبدء المحادثة بسلاسة: عليك أن تسعى جاهدًا لإبقاء كل اتصالات الفريق سهلة ومريحة. ولتحقيق ذلك استخدمنا خدمة Slack + Appear.in. حيث يمكنك بدء محادثة فيديو مثل هذه بأمر سريع هو {appear {room name. حيث لا داعي إلى تسجيل دخول أو وجود اسم مستخدم، وتذكرّ أن الأشياء التي يسهل القيام بها يتم فعلًا تنفيذها. فيديو أسبوعي للأحداث الجديدة لقد اعتدنا على اطلاع الفريق بالأخبار الجديدة في اجتماعي أسبوعي نعقده صباح يوم الإثنين، لكن وجدنا أن هذا الأمر لم يعد يُجدي نفعًا بعد وصول فريقنا إلى حجم كبير نسبيًا. لذلك نحن حاليًا نرسل فيديو أسبوعي -مستلهم من Wistia – يغطي ماذا يحدث في عالم Help Scout : موظفون جدد، أخبار الشركة الكبيرة، أو الأخبار الشخصية الجديدة الهامة (كولادة طفل جديد، القيام برحلة سفر في جميع أرجاء البلاد، أو حتى إذا وجدت أخيرًا سترتك القديمة التي كنت تبحث عنها، ...الخ). ويرسل هذا الفيديو عبر البريد الإلكتروني كما ينشر في قناة خاصة بنا على Slack التي نشارك فيها المحتوى الطويل مع الفريق. لدى تحديثات الفيديو بعض الميزات الرئيسية: إنها قابلة للتّوسيع ولا تتطلب تواجد أعضاء الفريق في نفس الوقت، كما سيكون لديك الوقت الكافي لتخطيط ومراجعة ما تود مشاركته. إجراء اللقاءات الثنائية one-on-ones بشكل منتظم اللقاءات الثنائية one-on-ones هي اجتماع بين قائد الفريق وعضو في الفريق لمدة تتراوح عادةً بين 10 و20 دقيقة يتناقشان فيها عن الأمور التي تسير على ما يرام والأشياء التي تحتاج إلى تغيير. يُمكنك معرفة المزيد بقراءة هذا المقال: دليل مختصر لتحسين المحادثات الثنائية مع الموظفين في شركتك. قد تكون اللقاءات الثنائية one-on-ones مصدر إحراج في البداية، وبالرغم من التشديد على أهمية العمل بروح الفريق إلا أنّ الكثيرين يجدون صعوبةً في الالتزام بذلك، ومن هنا تبرز أهمية تلك اللقاءات التي كثيرًا ما يتم إهمالها، وعليك أن تتأكد من عدم حدوث ذلك. إن التحدث وجهًا لوجه مع أعضاء فريقك بشكل منتظم هو أمر مهم للغاية حتى لو كنت مرتاحًا لوضع الفريق الحالي ﻷنه كما أظهرت الأبحاث: "تنخفض الروح المعنوية بحدة لدى الموظفين في حوالي 85% من الشركات بعد الأشهر الستة الأولى من بدء العمل، وتستمر في التدهور لسنوات بعد ذلك." بيئة العمل العظيمة محفزة، وليس هناك من بديل عن اللقاءات الثنائية مع أعضاء الفريق، إنها تجعل المشاكل تظهر في وقت مبكر مما يساعد في التقاط الأفكار والآراء والمخاوف ومناقشتها. كما تمنحك الوقت للتواصل مع فريقك. رحلات الفريق الجماعية تساعد جمعة فيكا، تحديثات الفيديو الأسبوعية، واللقاءات الفردية مع أعضاء الفريق بالتأكيد على حدوث الترابط بين أعضاء الفريق، لكن لا يمكنها أن تكون بديلًا عن قضاء الوقت معًا بشكل شخصي. نحن نجتمع معًا مرتين في السنة في مكان مًا لمدة أسبوع، يكون فيها القليل من اجتماعات الفريق والكثير من المرح، مما يعطينا الفرصة لإمضاء الوقت سويةً كمجموعة ومعرفة المزيد عن بعضنا البعض. لقد التقينا في وقت سابق من هذا العام ولهونا كثيرًا وأفرطنا في الأكل أيضًا. ولكن عليك أن تعمل بحكمة، حيث قسمنا فترات الدعم الفني بحيث لا نهمل العملاء، كما خططنا لجلسات جماعية أصغر لاستعراض ومناقشة الأفكار. على الرغم من أن رحلات الفريق الجماعية ليست التزامًا صغيرًا، إلا أن بناء علاقات أوثق وأكثر تماسكًا بين أعضاء الفريق هو أمر بنّاء وهادف، وهذا لن يحدث بدون جمعهم سويةً في مكان واحد. اكتساب الخبرات مع مرور الوقت ستخضع الخدمات التي يقدمها موظفوك لتقييم العملاء ومقارنتها مع ما يقدّمه المنافسون، لذا لا مفرّ من القيام بالممارسات التي تضمن أن يقدم فريقك الأفضل على الإطلاق، ولا سبيل إلى هذا إلا بالمعرفة الدقيقة لتفاصيل بيئة عملك إلى جانب الاستفادة القصوى من تجاربك ومحاولاتك السابقة. ونحن لدينا بالتأكيد الكثير لنتعلمه عن هذا الأمر، وبما أن الفريق ينمو فنحن نعلم أن ما يصلح الآن ليس يصلح بالضّرورة دائمًا. لكننا سنكافح لبقاء فريقنا متماسكًا ولن نتوقف أبدًا عن تحسين أساليبنا ممارستنا بسبب الأهمية القصوى لهذا الأمر. ترجمة وبتصرف لمقال Keeping Your Remote Team Connected لصاحبته Becca Van Nederynen.
  4. يحظى أمر ping بشعبية كبيرة لدى مديري الشبكات وممتهني التقنية لما يقدمه من خدمات في سبيل فحص الاتصال بين مضيفين Host. يقدّم هذا المقال تفاصيل أكثر عن هذا الأمر شائع الاستخدام. ماهو أمر ping وكيف يعمل؟ يعمل أمر ping على فحص إمكانية الوصول إلى عنوان IP، مضيف أو خادوم انطلاقا من شبكتك. يكثُر استخدام الأمر للتدقيق في أخطاء الشبكة وتحديد مشاكلها. يقوم الأمر على مبدأ عمل سهل ولكنه مفيد؛ إذ يُرسِل حزم بيانات تحوي الرسالة PING إلى عنوان IP (أو المضيف) وينتظر الرد ثم يحسب الفترة الزمنية اللازمة لورود الجواب؛ يُشار لهذه المدّة بـRTT، وهي اختصار Round Trip Time أي زمن الذهاب والإياب؛ تُعرَف هذه المدة أيضا بزمن الوصول Latency. يعني هذا أن بإمكانك معرفة ما إذا كان يمكن الوصول إلى مضيف من شبكتك وسرعة تلقي الرد منه باستخدام ping. يشير العمل السريع لأمر ping (زمن وصول قصير) إلى أن الاتصال متجاوب أكثر وهي مسألة مهمة في تطبيقات مثل الألعاب على الشبكة. يُقاس زمن الوصول عادة بجزء على ألف من الثانية (ثانية = 1000ms)؛ أزمان وصول أعلى تعني وجود مشاكل في الشبكة. يتغيّر زمن الوصول حسب عوامل من بينها التوجيه Routing والموقع الجغرافي. ينتج عن تنفيذ أمر ping لتجربة الوصول إلى مضيف في نفس البلد زمن أدنى من مضيف في بلد بقارة أخرى نظرا للموقع الجغرافي والقفزات Hops التي يتضمنها التوجيه. تأتي أداة ping مثبتة مسبقا على جميع أنظمة التشغيل الحديثة تقريبا ويمكن تنفيذها من سطر الأوامر (الطرفية على الأنظمة الشبيهة بيونكس أو محثّ وندوز Windows prompt). ملحوظة: يمكن إعداد الخواديم أو المضيفات على حظر (عدم الرد) طلبات ping لأسباب أمنية. خيارات ping الأساسية معرفة إصدار ping يتيح الخيار V- معرفة إصدار ping المثبَّت في النظام: ping -V مثال على المخرجات: ping utility, iputils-s20121221 استخدام أمر ping المعطى الضروري الوحيد لأمر ping هو اسم المضيف أو عنوان IP المراد فحصُه. ping example.com اسم المضيف في المثال أعلاه هو example.com. في ما يلي مثال على مخرجات الأمر: PING example.com (93.184.216.34) 56(84) bytes of data. 64 bytes from example.com (93.184.216.34): icmp_seq=1 ttl=42 time=116 ms 64 bytes from example.com (93.184.216.34): icmp_seq=2 ttl=42 time=154 ms 64 bytes from example.com (93.184.216.34): icmp_seq=3 ttl=42 time=163 ms 64 bytes from example.com (93.184.216.34): icmp_seq=4 ttl=42 time=1028 ms 64 bytes from example.com (93.184.216.34): icmp_seq=5 ttl=42 time=768 ms 64 bytes from example.com (93.184.216.34): icmp_seq=6 ttl=42 time=128 ms ستحتاج لتوقيف تنفيذ الأمر بالضغط على الزرين CTRL و C وإلا فإن الأمر سيستمر في إرسال الحزم. ملحوظة: توجد اختلافات يسيرة في الأمر بين لينكس ووندوز، يتوقف تنفيذ الأمر في وندوز بعد إرسال أربع حزم مبدئيا. يظهر ملخّص بالإحصاءات بعد توقف الأمر: ^X^C --- example.com ping statistics --- 24 packets transmitted, 23 received, 4% packet loss, time 23041ms rtt min/avg/max/mdev = 114.323/307.465/1057.499/296.627 ms, pipe 2 يتضمن الملخّص: عدد الحزم المُرسَلة Transmitted عدد الحزم المستلمة Received نسبة فقدان الحزم Packet loss الحد الأدنى للمدة الزمنية لوصول الإجابة min. متوسط وصول الإجابة avg. الحد الأقصى للمدة الزمنية لوصول الإجابة max. تظهر في كل سطر مدة الإجابة وقيمة أخرى باسم ttl. تحدّد القيمة الأخيرة عمر الحزمة (Time To Live). إن انقضت هذه القيمة دون أن يتمكن ping من الاتصال بالوجهة فسيقرّر أنه لا يمكن الوصول إليها. لا يقتصر استخدام هذا المعطى على ping بل مجالات أخرى مثل بروتوكول HTTP و نظام أسماء النطاقات. لا يختلف فحص الاتصال بجهاز على الشبكة الداخلية عن فعل نفس الشيء بالنسبة لمضيف على الإنترنت. الأمر التالي مثلا يفحص الاتصال بجهاز على الشبكة الداخلية عبر عنوان IP الخاص به: ping 192.168.1.5 عدد مرات تنفيذ الأمر السلوك المبدئي لأمر ping إن استخدم بدون خيارات هو الاستمرار في إرسال الحزم إلى أن يتدخل أحد لإيقافه؛ إلا أنه توجد طريقة لتحديد عدد مرات إرسال الحزم. استخدم الخيار c- متبوعا بعدد على النحو التالي: ping -c 10 example.com تظهر المخرجات كالتالي: PING example.com (93.184.216.34) 56(84) bytes of data. 64 bytes from example.com (93.184.216.34): icmp_seq=1 ttl=43 time=129 ms 64 bytes from example.com (93.184.216.34): icmp_seq=2 ttl=43 time=127 ms 64 bytes from example.com (93.184.216.34): icmp_seq=3 ttl=43 time=126 ms 64 bytes from example.com (93.184.216.34): icmp_seq=4 ttl=43 time=125 ms 64 bytes from example.com (93.184.216.34): icmp_seq=5 ttl=43 time=284 ms 64 bytes from example.com (93.184.216.34): icmp_seq=6 ttl=43 time=132 ms 64 bytes from example.com (93.184.216.34): icmp_seq=7 ttl=43 time=131 ms 64 bytes from example.com (93.184.216.34): icmp_seq=8 ttl=43 time=130 ms 64 bytes from example.com (93.184.216.34): icmp_seq=9 ttl=43 time=178 ms 64 bytes from example.com (93.184.216.34): icmp_seq=10 ttl=43 time=128 ms --- example.com ping statistics --- 10 packets transmitted, 10 received, % packet loss, time 9011ms rtt min/avg/max/mdev = 125.003/149.335/284.433/47.508 ms ينفَّذ الأمر - كما يظهر - عشر مرات ثم يتوقف ويعطي إحصائيات. لفعل نفس الشيء على وندوز نضيف الخيار n- بدلا من c-: ping -n 10 example.com تعديل حجم حزمة البيانات يُرسِل أمر ping مبدئيا حزمة بحجم 64 بايت على لينكس، و32 بايت على وندوز. إن أردت تغيير الحجم المبدئي للحزمة على لينكس فيمكنك ذلك باستخدام الخيار s- : ping -s 100 -c 6 example.com النتيجة: PING example.com (93.184.216.34) 100(128) bytes of data. 108 bytes from example.com (93.184.216.34): icmp_seq=2 ttl=51 time=1113 ms 108 bytes from example.com (93.184.216.34): icmp_seq=3 ttl=51 time=253 ms 108 bytes from example.com (93.184.216.34): icmp_seq=4 ttl=51 time=263 ms 108 bytes from example.com (93.184.216.34): icmp_seq=5 ttl=51 time=253 ms 108 bytes from example.com (93.184.216.34): icmp_seq=6 ttl=51 time=1068 ms --- example.com ping statistics --- 6 packets transmitted, 5 received, 16% packet loss, time 4999ms rtt min/avg/max/mdev = 253.093/590.201/1113.044/408.995 ms, pipe 2 بالنسبة لوندوز فالخيار المستخدم هو l-: ping -l 100 -n 6 example.com زيادة المدة الزمنية أو تقليصها ينتظر أمر ping مبدئيا ثانية واحدة قبل إرسال الحزمة الموالية إلى الوِجهة. يمكِّن استخدام الخيار i- من زيادة هذا المجال أو تقليصه. يحدّد الأمر التالي 3 ثوان مجالا بين إرسال حزمتين: ping -i 3 example.com يمكننا بنفس الطريقة التسريع من إرسال الحزم بدل انتظار ثانية في كل مرة: ping -i 0.2 example.com إغراق الوجهة بحزم ping تُستخدم هذه الطريقة لاختبار أداء الشبكة. لا ينتظر أمر ping بين إرسال حزمتين إن استخدم الخيار f- بشرط تنفيذه بصلاحيات إدارية: sudo ping -f example.com ستلاحظ - حسب جودة الشبكة لديك - نقاطا تتحرك بسرعة. يطبع الأمر نقطة في الطرفية في كل مرة تُرسَل حزمة، وفي كل مرة يرد فيها جواب يُطبع رجوع إلى الخلف (تُحذَف نقطة) وهو ما يعطي فكرة عن عدد الحزم التي لم ترد عنها إجابات؛ وهو ما تمثله النقاط المتبقية. اضغط زرّي CTRL و C لإيقاف الأمر. عرض إحصاءات ping فقط يمكن باستخدام الخيار q- الإبقاء على إحصاءات الأمر فقط دون إظهار معلومات الحزم: ping -c 5 -q example.com النتيجة: PING example.com (93.184.216.34) 56(84) bytes of data. --- example.com ping statistics --- 5 packets transmitted, 4 received, 20% packet loss, time 6221ms rtt min/avg/max/mdev = 259.175/723.504/1219.311/460.540 ms, pipe 2 يظهر التقرير فقط في مخرجات الأمر أعلاه. تحديد مهلة لتنفيذ ping إذا أردت تحديد مهلة زمنية تظهر بانقضائها إحصاءات أمر ping فيمكنك ذلك بإضافة الخيار w-: ping -w 6 example.com يعيّن الخيار w-المدة الزمنية التي يقضيها الأمر في إرسال الحزم. حددنا في المثال أعلاه 6 ثوان سيتوقف بعدها تنفيذ الأمر وتظهر الإحصاءات. رسائل الخطأ في أمر ping تظهر عدة رسائل - حسب الحالة - في مخرجات ping، في ما يلي شرح مدلولاتها. Destination Host Unreachable تشير الرسالة Destination Host Unreachable (لا يمكن الوصول إلى المضيف الوِجهة) إلى أنه لا توجد طريق من الشبكة المحلية إلى المضيف الذي أرسلت إليه الحزم. يعني هذا عادة أنه يوجد خطأ في الاتصال. إن نفذت أمر ping دون أن تكون متصلا فستظهر هذه الرسالة. Request timed out تعني هذه الرسالة Request timed oud (انتهاء مهلة انتظار الرد) أن الأداة لم تحصُل على أجوبة على الحزم التي أرسلتها ضمن المهلة المحدّدة (1 ثانية مبدئيا). توجد عدّة أسباب ممكنة من أبرزها احتقان Congestion في الشبكة، حجب بعض الحزم في الجدار الناري firewall، مشكل في الموجِّه Router وغيرها. Unknown host / Ping Request Could Not Find Host تدلّ رسالة الخطأ Unknown host (مضيف غير معروف) أو شبيهتها Ping Request Could Not Find Host (لم يستطع طلب Ping العثور على مضيف) إلى خطأ في اسم المضيف؛ إما لكون اسم المضيف غير موجود أو أنه غير متاح لديك في الشبكة. عند تنفيذ الأمر التالي مثلا (لاحظ الخطأ في كتابة hsoubs): ping hsoubs.com تظهر الرسالة: ping: unknown host hsoubs.com خاتمة يختلف زمن الوصول باختلاف نوعية الشبكة وطريقة الاتصال (ألياف ضوئية، شبكة لا سلكية، … إلخ). إذا كانت الشبكة لديك جيدة فستكون نسبة الحزم المفقودة %0 وستحصُل على زمن وصول ببضعة أجزاء من الثانية. ترجمة -وبتصرّف- لمقال All About PING Command لصاحبه Mohammad Forhad Iftekher.
  5. هذا القسم سيُغطّي بعضاً من أساسيّات الاتّصال بخادوم مع 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.