لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 08/25/22 في كل الموقع
-
تحيه طيبه للجميع لدي صفحة PHP أقوم من خلالها بتحديث بيانات MySQL table المشكلة ان المستخدم لديه حقول مختلفة ولو قام المستخدم بترك حقل بدون التعديل عليه سوف يتم ارسال بيانات فارغة الى هذا الملف ثم يتم وضع NULL في جدول البيانات احتاج الى معرفة كيفية التحقق من خلال ملف PHP قبل عمل UPDATE اذا كان الحقل لديه بيانات يتم التحديث اما الحقول الفارغة يتم عمل SKIP او تخطي لها حتى لا تتغير البيانات الحالية في قاعدة البيانات. الملف كالتالي: <?php require_once 'con.php'; $id =$_POST['id']; $name =$_POST['name']; $ExtraData = $_POST['ExtraData']; $IDColors = $_POST['IDColors']; $sql="UPDATE TableUser SET name=?,ExtraData=?,IDColors=? WHERE id=?"; $stmt = $con->prepare($sql); $stmt->bind_param("ssss",$name,$ExtraData,$IDColors,$id); $stmt->execute(); $result = $stmt->get_result(); $exeQuery = mysqli_query($con, $sql) ; if($exeQuery){ echo (json_encode(array('code' =>1, 'message' => 'Modifier avec succee'))); }else {echo(json_encode(array('code' =>2, 'message' => 'Modification Non Terminer'))); } ?> الحقول أعلاه على سبيل المثال قد يقوم المستخدم بإضافة بيانات فقط في حقل الاسم ويترك الباقي فارغة احتاج ان اجعل الكود يقوم بعملية تخطي للحقول الفارغة حتى لا يتم تغير البيانات في قاعدة البيانات شكرا للجميع1 نقطة
-
انا مش فاهم react router ومش عارف استخدمه في الموقع ودي هي ملفات الموقع1 نقطة
-
1 نقطة
-
السلام عليكم, أحس دائما أن المواقع التي اصممها تتأخر بعض الشيء في التحميل, فهل من نصائح بخصوص إستخدام المكتبات و assets و أفضل صيغة للصور يجب إستخدامها لتحميل أسرع للموقع ؟ شكرا لكم1 نقطة
-
عندما يعيد التابع prepare قيمة منطقية bool فهذا يعني إما خطأ في الاتصال بقاعدة البيانات أو خطأ في الاستعلام نفسه، حاول إضافة السطر التالي في بداية الملف : mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); والآن بدلًا من إعادة قيمة منطقية عند حدوث خطأ، سيتم رمي الخطأ وفيه رسالة توضح المشكلة، حاول تنفيذ العملية مجددًا وعاين رسالة الخطأ التي ستظهر والتي ستحدد لك المشكلة1 نقطة
-
يوجد خطأ في نص الاستعلام يجب وجود فراغ قبل اسم الجدول عدل النص ليصبح كالتالي وحاول مجددًا: $sql = "UPDATE Table User SET {$fields} WHERE id=?"; ^1 نقطة
-
السلام عليكم. لنفترض أني قمت بإنشاء صفحة ويب كاملة تحتوي على index.html و style.css و script.js. في نفس الوقت قمت بإنجاز ملف آخر لنفترض contact. هذا الملف هو أيضا يحتوي على contact.html contact.css contact.js. سؤالي كيف يمكن ربط هذا الملف contact بindex.html. شكرا.1 نقطة
-
نحن نقوم بربط صفحات HTML مع بعضها ولا نقوم بربط الملفات ، فمثلاً في حال كان ملف contact.html كان يتضمن فيه contact.css contact.js فلا مشكلة بربطه باستخدام الوسم a بهذا الشكل لنفرض أن index.html داخل مجلد باسم website ونريد أن نربط الصفحة في صفحة contact.html الموجودة داخل مجلد contact والمجلدين موجودين في نفس الملف نقوم بالتالي <a href="../contact/contact.html">Contact</a> نستخدم .. لرجوع للخلف ، أي الخروج من مجلد website ثم نقوم بكتابة المسار اسم المجلد واسم صفحة HTML .1 نقطة
-
واجهتني مشكله لم اعرف كيف احلها، وهي كيف يمكن تمرير قيم عبر الرابط لحلب محتوى الصفحه مثلا لو لدي صفحة user وبناء على القيمه التي نمررها للصفحه هذه تقوم بارجاع معلومات المستخدم المرر اسمه او عنوان الاي دي خاصته. لقد عملت بعض الحلول ولكنها كانت فيها عيوب وهي عند اعادة تحميل الصفحه تضيع القيمه الممره ويخدث خطاء1 نقطة
-
لا ليس صعباً لاحظ انك تستطيع تمريره في الوظيفة pushState في الخانة الثالثة : history.pushState({ page: 1 }, `page 1`, "?page=1"); ولتمرير الكويري السابقة تستطيع فعل ذلك بالطريقة التالية : history.pushState({ page: 1 }, `page 1`, "?lan1=JavaScript&lan2=HTML"); ويمكنك الوصول لهذه البيانات كالتالي : function getPage(pageNumber, setHistory) { clearPages(); if (pageNumber === 1) { // وضعنا الشرط التالي كي لا يحدث التغير في السجل إلا عندما نستخدم الرابط //إختيارية "?page=1" القيمة if (setHistory) history.pushState( { page: 1 }, `page 1`, "?lan1=JavaScript&lan2=HTML" ); const params = new Proxy( new URLSearchParams(window.location.search), { get: (searchParams, prop) => searchParams.get(prop), } ); console.log(params.lan1); // JavaScript console.log(params.lan2); // HTML // نبني الصفحة بعد احضار البيانات // وذلك من اجل تمرير البيانات لها في حال كانت تعمد عليها page1(); } else { page2(); // وضعنا الشرط التالي كي لا يحدث التغير في السجل إلا عندما نستخدم الرابط //إختيارية "?page=2" القيمة if (setHistory) history.pushState({ page: 2 }, `page 2`, "?page=2"); } }1 نقطة
-
يمكنك بناء نص استعلام تحديث البيانات ديناميكيًا، حيث تتحقق من كل حقل إذا طابق الشروط التي تريدها تضيف له تعليمة تحديث، ويمكنك تمرير الحقول المقبولة ضمن مصفوفة كمعامل أول للتابع execute حتى يتم إدراجها ضمن نص الاستعلام كالتالي: <?php $id =$_POST['id']; $name =$_POST['name']; $ExtraData = $_POST['ExtraData']; $IDColors = $_POST['IDColors']; $validated = []; if($name !== null) $validated['name'] = $name; if($ExtraData !== null) $validated['ExtraData'] = $ExtraData; if($IDColors !== null) $validated['IDColors'] = $IDColors; $fields = implode(',', array_map(fn($field) => $field.'=?', array_keys($validated))); $sql = "UPDATE TableUser SET {$fields} WHERE id=?"; $stmt = $con->prepare($sql); $values = array_values($validated); $values[] = $id $stmt->execute($values);1 نقطة
-
1 نقطة
-
إن كنت تشعر أنك بلغت حدود النجاح في الكتابة المستقلة، وتبحث عن تحدٍ جديد يستفز خبراتك ويطور مهاراتك أكثر؛ فيُنصح بأن تدخل مجال الكتابة بالظل، أو كما يسمى بالإنكليزية Ghostwriting. ماذا يعني أن تكون كاتب ظل؟ كاتب ظل أو كاتب شبح هو شخص يُدفع له مقابل كتابة كتب أو خطابات أو أية نصوص أخرى تُنسب في النهاية إلى شخص آخر، ورغم أن هناك نسبةً كبيرةً من الكُتاب الذين يرون أن كتابة الظل ليست مهنةً جذابةً للعمل بها خصوصًا أنك تبذل كل جهدك وموهبتك على عمل ما، ليوضع في النهاية اسم شخص آخر عليه؛ إلا أنها تُعَد تحديًا ممتعًا لشحذ مهاراتك، والعمل مع عملاء رائعين، والحصول على عوائد مادية جيدة، لذا سنتحدث في هذا المقال عن الكاتبة نيكيتا روس وما كسبته من العمل في هذا المجال، ولك الحرية في النهاية في تجربة هذا المجال أو عدم تجربته. لقد كان أول سؤال سمعته الأستاذة نيكيتا عندما قالت لأحدهم إنها تعمل على مشروع جديد في مجال الكتابة بالظل هو: "ألا يزعجك أن ينسب عملك إلى شخص آخر؟". إذا عملت على جزء كبير من مشروع، ثم نُشِر باسم شخص آخر، أليس هذا مشابهًا لمشاريعنا المدرسية أو الجامعية عندما كنا طلابًا، وكان المدرس يضعنا مع طالب كسول لا يقدم شيئًا، لكنه في النهاية يحصل على نفس الدرجة التي حصلنا عليها؟ الجواب هنا هو: لا، ليس الأمر كذلك. تعترف نيكيتا أنها شعرت بنفس هذا الشعور في بدايات عملها، لكن عندما تعمقت أكثر، اكتشفت أن هذا المجال يمكن أن يكون مجزيًا مهنيًا وماليًا، لذا دعنا نَرَ إن كان بإمكان ما حصل لها أن يغيّر رأيك ويقنعك أن تصبح كاتب ظل. بداية عمل نيكيتا في مجال الكتابة بالظل بعد أن انتهت نيكيتا من مساق تعليمي في أساسيات الكتابة، أصبحت قادرةً على ترجمة شغفها بالكتابة إلى مهنة تدر عليها عوائد ماديةً. فقد كانت الكتابة الإبداعية دائمًا إحدى نقاط قوتها، ورغم أنها ليست مخضرمةً بها، إلا أنها كانت بحاجة إلى تأمين دخل مادي يعينها على صعوبات الحياة وتأمين احتياجات عائلتها. بعد أن علمت إحدى صديقاتها أنها بدأت العمل في مجال الكتابة المستقلة، طلبت منها أن تساعدها في تحويل حدث صادم في حياتها إلى نص مكتوب، على سبيل التنفيس الانفعالي. فكان رد نيكيتا: "هل تقصدين الكتابة بالظل؟"، قالت: "نعم، هذا ما أقصده تمامًا"، ففكرت نيكيتا أن الأمر لن يضرها بشيء، بل على العكس ستضيف شيئًا جديدًا إلى خبرتها. اكتشفت نيكيتا لاحقًا أنه كان أفضل قرار اتخذته في حياتها، ومنذ ذلك الوقت توالت الفرص والمشاريع وشقَّت طريقها في مجال الكتابة بالظل. العملاء الذين يطلبون خدمات الكتابة بالظل تتعدد فوائد الكتابة بالظل لعملائك، إذ يمتلك كثير من رواد الأعمال والمديرين التنفيذيين والمبتكرين الناجحين أفكارًا رائعةً يرغبون في مشاركتها مع العالم، لكن في نفس الوقت هم منشغلون في إدارة أعمالهم التي تمنعهم من التفرغ للكتابة، لذلك يطلبون خدمات كاتب بالظل، والذي يمكن أن يكرس كامل وقته وتركيزه على المهمة المطلوبة، كما أن التعاقد مع كاتب ظل لنقل أفكارهم وتحويلها إلى مادة جذابة، يزيد من نفوذهم وخبراتهم المزعومة أمام الناس. قد تقابل عملاءً بارعين في التحدث، إلا أنهم يفتقرون إلى القدرة على نقل أفكارهم إلى الورق، فعندما يتحدثون، تراهم يأسرون جمهورهم، لكن التعبير يخذلهم عند محاولتهم تدوين أفكارهم، لذلك تكمن وظيفة كاتب الظل في استخدام معرفته لترجمة صوت عميله إلى كلمات مكتوبة، دون المساس بالذوق الفريد للعميل. كما تقدم هذه الوظيفة الكثير من الخبرات والتجارب، فقد يكون عميلك خبيرًا في مجال التصوير الفوتوغرافي مثلًا، مما يمنحك فرصة الاطلاع على هذا المجال الرائع، إذ يتمثل جوهر التصوير الفوتوغرافي في تعليم القراء كيفية استخدام الضوء الطبيعي في خدمتهم أثناء عملية التقاط الصور، وستكون مهمتك هي التأكد من أن الكلمات التي تكتبها -بالنيابة عن عميلك- حسنة الصياغة، وتعبر تمامًا عما يقصده. أهمية وظيفة كاتب ظل في بداية، دعنا ننسَ فكرة أن الفضل يُنسَب إلى شخص آخر، ونركز في كيف يمكن للعمل في هذا المجال أن يطور حياتك المهنية. 1. من غير المحتمل أن فكرة العميل كانت ستخطر لك ضع في حسبانك هذا الأمر: إن طلب منك أحد العملاء كتابة كتاب حول موضوع ليس لديك أي خبرة سابقة عنه، فهل ستنزعج لأنك لم تفكر في الأمر قبله؟ بالطبع لا. أي سيعرض العملاء عليك أن تأخذ خبراتهم ويدفعون لك أجرًا شهريًا طوال مدة المشروع، فهل ستتمنى عوضًا عن ذلك لو كنت تعمل لحسابك، وتقضي ساعات طويلةً في إجراء أبحاث عن فكرة الكتاب دون تلقي أي أجر مقابل ذلك؟ كما أنه هناك احتمال -وإن كان ضئيلًا- أن تفشل وتعجز عن إكمال المشروع، وأن يضيع كل مجهودك في البحث دون أي مقابل، لذا فكما ترى الأمر، كله يتعلق بمنظورك للأمور. 2. لست مسؤولا عن التسويق بمجرد إرسال النسخة النهائية للعميل، لن تكون مسؤولًا عن تسويقها أو نشرها على وسائل التواصل الاجتماعي، لذا ستوفر عليك جهود البيع والتسويق التي تستغرق وقتًا طويلًا. 3. ستتعلم أشياء جديدة ومثيرة للاهتمام يمكن أن تطبقها في حياتك الشخصية وعملك يمكن لمجال الكتابة بالظل أن يأخذك إلى خارج حدود إمكاناتك ويوسع معارفك، لذا إن كنت متعطشًا للمعرفة -ويجب أن تكون كذلك-، فستكون الكتابة بالظل مجزيةً على المستوى الشخصي، بالإضافة إلى أنها مجزية على المدى الطويل من الناحية المادية، إذ يمكن للدروس التي تتعلمها أن تفيدك كثيرًا في مشاريعك المستقبلية. 4. عدم الكشف عن هويتك سيفيدك على الصعيد المادي ستتقاضى أجرًا أعلى مقابل عدم الكشف عن هويتك، فطالما أن الفضل لن يُنسَب لك وسيُطلَب منك التكتم على المشروع، فمن الطبيعي أن تطلب أجرًا أعلى مقابل ذلك. التسويق لنفسك لتعمل كاتب ظل قد تتساءل قائلًا: "كيف سأتقدم للشواغر التي تطلب كاتب ظل إن لم أتمكن من إثبات أي من أعمالي؟"، وفيما يلي عدة خيارات تساعدك: اسأل عميلك عن ما إذا كان بإمكانك رفع عينة مما كتبته له: من الطبيعي ألا يوافق عملاؤك على ذلك، لكن قد يوافق العديد منهم على استخدامك جزءًا أو مقطعًا من العمل ليكون عينةً تعرضها أمام عملائك المحتملين، وبالطبع لن تتمكن من نشر ذلك الجزء على الإنترنت على أنه عملك، لكن يمكنك استخدامه عندما يطلب منك عميل محتمل عينات عن أعمالك السابقة، بينما قد يرفض بعض العملاء استخدام أعمالهم في أي نشاط كان، فالأمر بالنهاية يعود لهم. شهادات العملاء: تُعَد أكثر ما سيساعدك في الحصول على مشاريع مستقبلية، لذا اطلب شهاداتهم، وضعها في ملفك الشخصي، كما يُنصَح بتضمين ذلك في شروط عقد العمل معهم، فقد يكون الحصول على شهادة من عميل راضٍ أكثر فعاليةً من عينة مكتوبة. استخدم عيناتك الأخرى: إذا كان لديك عمل منشور باسمك، فاستخدمه، لأنه إذا كان العميل المحتمل يحاول تقييم مهاراتك في الكتابة، فسيكون ذلك كافيًا إلى جانب شهادات العملاء. اعرض عينات مجانيةً: قدِّم عينةً مجانيةً لعملائك، مع إخبارهم أنك ستستخدمها بوصفها نموذجًا لأعمالك عند الترويج لعملاء جدد. كيفية العثور على وظائف كاتب ظل والآن بعد أن عرفت كيفية التسويق لنفسك، فأين يمكنك أن تجد عملًا في هذا المجال؟ يمكنك ذلك من خلال التالي: منصات العمل المستقل: تكتسب وظائف كتاب الظل شعبيةً أكبر يومًا بعد يوم، لذا يمكنك غالبًا العثور على شواغر في هذا المجال في منصات العمل المستقل عبر الإنترنت، مثل منصتَي مستقل وخمسات، كما يمكنك التواصل مع إعلانات وظائف الكُتاب التقليدية وعرض الفكرة عليهم، فقد يكون ذلك شيئًا لم يخطر لهم سابقًا، وبذلك ستمنح نفسك ميزةً تنافسيةً. العملاء الحاليين: اسأل عملاءك الحاليين عما إذا كانوا مهتمين بخدمات الكتابة بالظل التي تقدمها، واشرح الفوائد التي ستعود عليهم، وقدمها في عرضك الحالي. الإعلانات التقليدية: تواصل مع الشركات في منطقتك وقدم خدماتك، واشرح لهم أهمية الكتابة بالظل في تعزيز أعمالهم. توسيع دائرة علاقاتك: احضر المناسبات والأحداث المحلية، واعقد جلسات إعلاميةً في المقاهي، ورغم أن عملك يتمحور حول عدم الكشف عن هويتك، إلا أنه يجب أن تجعل اسمك معروفًا قدر الإمكان. الدخول إلى مجال الكتابة بالظل هل أنت مستعد لاتخاذ الخطوات الأولى لتصبح كاتبًا بالظل؟ إذا كنت راغبًا في ذلك، فابدأ في التدرب على إجراء مقابلة مع أصدقائك وعائلتك لتتعلم أساسيات الحرفة، وحاول تحديد العبارات الشائعة وتحويلها إلى كلمات مكتوبة، وامنح نفسك بعض الوقت للبحث والتعلم وتنمية مهاراتك. ضع في حسبانك أن الأمر أشبه بأي مهارة تريد تعلمها، إذ سيتطلب الأمر منك وقتًا وممارسةً، لذا حافظ على تركيزك وابقَ مثابرًا، وستصبح مهنة أحلامك حقيقةً على أرض الواقع. ترجمة -وبتصرّف- للمقال How to Become a Successful Ghostwriter لصاحبته GINA HORKEY. اقرأ أيضًا دليلك الشامل لتكون الكاتب المستقل الناجح طرائق لبناء معرض أعمال لعملك المستقل بأرخص ما يمكن كيفية ابتكار أفكار للمقالات على مدونتك1 نقطة
-
يمكن إختيار رقم عشوائي من خلال التابع random الموجود في الكائن Math: Math.random(); // 0.3777513264733918 في كل مرة يتم إستدعاء هذا التابع سوف يتم توليد رقم عشوائي بين 0 و 1، ويمكننا أن نحصل على أي رقم عشوائي بين 0 و 5 على سبيل المثال من خلال ضرب الرقم الناتج في 5، مثال: Math.random() * 5; // 2.9096869293887995 أما للحصول على عنصر من مصفوفة معينة علينا ضرب ناتج التابع random في طول المصفوفة ثم تحويل الرقم الناتج إلى رقم صحيح integer من خلال التابع floor const arr = ['one', 'two', 'three'] const index = Math.floor(Math.random() * arr.length); // 2 const result = arr[index]; // three يمكن قراءة المزيد عن الكائن Math من خلال موسوعة حسوب من هنا1 نقطة
-
جزاك الله خير اخي الحبيب كنت اريد الرجوع للسؤال والاجابة عليه كانت المشكلة اني اسمي الملف function.php وهو يجب ان اسميه functions.php الحمد لله بهذه الاضافة حلت المشكلة1 نقطة
-
بعد تحميلك للشهادة كملف pdf يوجد فيها رابط يمكن النقر عليه وسوف يفتح رابط الشهادة من الانترنت عبر عنوان ويب خاص باكاديمية حسوب، وهذا يؤكد على تخرج الطالب و أن الشهادة صحيحة. اقتراح وجود QR Code هو شيء جميل، ربما تأخذه الإدارة في الحسبان. يمكنك التواصل مع مركز المساعدة في أمر طباعة و شحن الشهادة. إن الشهادة مهما كان مصدرها، جامعية أو من معهد خاص أو أكاديمية مهمة جداً كإثبات ان الشخص قد مر بمرحلة دراسية معينة، ولكن لن تقوم بإثبات مهاراتك الفعليه غير خبرتك و مهاراتك في حل المشكلات و تقديم برامج جيدة و مناسبة للعملاء، فالتدرب المستنر و الدراسة هو الطريق السليم للنجاح والحصول على عمل. خذ مثال، هل جميع الأطباء أو المهندسين المدنيين حققوا نفس النجاح؟ ام الأمهر منهم قد تفوق.1 نقطة
-
حتى تحصل على شهادة أكاديمية حسوب، عليك الإلمام ب 4 مسارات ضمن الدور التي تشتريها، ومن ثم تقديم امتحان و يتوجب عليك النجاح به للحصول غلى الشهادة. و إن الشهادة تتوفر على شكل رابط انترنت مرفوع على استضافة تابع لشركة حسوب قابلة للتحقق الكترونيا بمجرد دخول الرابط و ستكون باسمك الكامل. و سوف يضاف لحسابك في مستقل شارة تؤكد أنك خريج أكاديمية حسوب. الاعتراف بالشهادة هو موضوع تؤكد عليه مهاراتك (حتى الشهادة الجامعية لاتدل على شيء إن لم يكون صاحبها بارع في مجاله و ملم به)، حيث أن معظم شركات البرمجة لها مقابلات توظيف للتأكد من مهارات المبرمجون، شهادة الأكاديمية سوف تفيدك في التقديم على وظائف، بجانب اهتمامك بمعرض أعمالك و نشرهم ليستطيع العملاء مشاهدتها و اختبارها و من ثم توظيفك على المشاريع. يمكنك تصفح الأسئلة الشائعة و فيها رابط يصف الامتحان و باقي التفاصيل من هنا بالتوفيق1 نقطة
-
إذا كنت مهتما بتعلم البرمجة، فعلى الأرجح أنك رأيت هذا الاقتباس من قبل: في الحقيقة لا أبالغ إن قلت أن البرمجة أصبحت من أهم المهارات في عصرنا الحالي، وذلك لأنها دخلت في جميع مجالات حياتنا سواءً كنا ندرك ذلك أم لا فانطلاقًا من الهواتف المحمولة ومرورًا بالمنازل والشاشات الذكية وانتهاءً بالسيارات ذاتية القيادة. كل شيء من حولنا لم نكن لنراه بهذا الشكل لولا البرمجة، فأنا على سبيل المثال أكتب وأعدل هذا الموضوع من خلال برنامج بُرمج عبر لغة برمجة وأنت تقرأه على الإنترنت باستخدام برنامج (المتصفح) وربما رأيته على مواقع التواصل الاجتماعي وكُلها برامج أيضًا. ومما لا شك فيه أن تعلم البرمجة أصبح ضرورة مُلحة في هذا العصر بل إن تعلمك لها سيزيد من فرصك بشكل كبير في الحصول على عمل. ولقد تحدثنا في مقالٍ سابق عن كيفية تعلم البرمجة والدخول إلى هذا المجال من أوسع أبوابه (إن كنت حديث عهدٍ في البرمجة أو تخطط للبدء بها، فننصحك بقراءته قبل إكمال هذا المقال) وسوف نتحدث في هذا المقال عن أكثر المهارات صعوبةً في احتراف البرمجة ألا وهي «حل المشاكل». حل المشكلات وارتباطها بالبرمجة لطالما وقفنا حائرين أمام مشكلةٍ ما ونسأل أنفسنا ماهي الطريقة الصحيحة للخروج من هذا المأزق؟ هل ستكون طريقة الحلّ التي أتبعها مشابهة للطريقة التي يتبعها المبرمجين المحترفين؟ كيف أستطيع أن أفكر مثلما يفكر المبرمجين المحترفين؟ في البداية وقبل الخوض في التفاصيل دعنا نُعرف البرمجة بحد ذاتها ولنذهب للمقال السابق ونلقي نظرة سريعة عليها: نلاحظ أن التعريف السابق صحيح ولكنه مُقْتضَب ولا يقدم لنا المعنى الكامل والدقيق للبرمجة لذا لابدّ لنا من تعريفٍ أكثر دقة وموضوعية يساعدنا في فهم هذا المقال. يعرف موقع HackerRank في تقريره عن مهارات المطورين بعام 2018: نستنتج مما سبق أن البرمجة تعتمد اعتمادًا أساسيًا على التفكير المنطقي والرياضي والقدرة على حلّ المشاكل وإن لغات البرمجة ما هي إلا وسيلة للتخاطب مع الحاسوب. إذن الأمر كله يتعلق بتطوير قدرتك في حلّ المشاكل وجعل هذه العملية سهلة وسلسة بنفس الوقت لذا فاسمح لي بأن آخذك معي برحلة صغيرة في هذا المقال نتعرف فيها على أهمية حلّ المشاكل وضرورتها في مشوارك البرمجي. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن لماذا حلّ المشاكل مهم؟ تأتي أهمية حل المشاكل من كونها من أكثر المهارات المطلوبة عالميًا فوفقًا لتقرير أصدره موقع HackerRank جاء فيه: احتلت مهارة حلّ المشاكلالمرتبة الأولى بنسبة 94.9% لأكثر مهارة مطلوبة لأصحاب الشركات سواء الصغيرة منها أو الكبيرة. وعلى الصعيد العملي، إن عملية بناء أي شيء من الصفر سواء أكانت آلة معينة أو أي مُنتج جديد ستواجه الكثير من المشاكل في البداية، فعلى سبيل المثال بناء خدمات أمازون السحابية (AWS)، والّتي جاءت حلًا لمشكلة النفقات العالية للبنية التحتية لتجارتها الإلكترونية بالإضافة إلى الوقت الطويل الّتي تحتاجه في عملية البناء والذي شكل تحدي كبير في إمكانية توسع الشركة، إلى أن جاء آندي جاسي كبير مستشاري جيف بيزوس في ذلك الوقت والذي استطاع إيجاد حلّ لهذه المشكلة ولم يتوقف عند ذلك الحد وإنما أختار تحويل هذا الحلّ إلى خط أعمال جديد تحت أسم خدمات أمازون السحابية والّتي بلغت عائداتها السنوية لعام 2018 قيمة تناهز 25 مليار دولار. نجد من التجربة السابقة أنه حصلت مشكلة فأُوجِد لها حلًا وأثناء خلق حل للمشكلة ظهرت الكثير من المشاكل الأخرى لتقع في سلسلة من المشاكل لا تنتهي. وبعد حلّ جميع المشاكل سيصبح المنتج جاهزًا للعمل، أي أن دورة حياة أي منتج سواءً أكان برمجيًا أو ماديًا ستحتوي على المشاكل، وبناءً على ذلك تكون مهارة حل المشاكل اللَبِنَة الأساسية في بناء مشوارك البرمجي، والّتي يجب علينا الإهتمام بها عند الإقدام على تعلّم البرمجة. تكون طريقة تعاملنا مع المشاكل غير منظمة وعشوائية في أغلب الأحيان، فمعظمُ المبرمجين الجُدد يَبْدَؤُونَ بحلّ أي مشكلة تُواجهُهُم بالطريقة التالية: جرّب أي حلّ للمشكلة. إذا لم ينجح الحلّ الأول حاول أن تجرّب أي حلّ آخر. إذا لم يفلح الحلّ كرر الخطوة الثانية إلى أن تصل إلى الحلّ. لا يحصل هذا الأمر مع المبرمجين فقط، وإنما يحصل مع أي شخص يواجه مشكلة ولا يستعن على حلها بالتحليل والتفكير المنطقي. في الحقيقة، قد يحالفك الحظ أحيانًا ويتم حلّ المشكلة ولكن كن حذرًا! فهذه هي الطريقة الأسوأ لحلّ المشكلات بل وإنها ستهدر وقتك بشكل كبير لذا من الأفضل استخدام طريقة منظمة توصلنا للحلّ، واسمح لي بأن أشاركك طريقة شاملة توصلك إلى حلّ أي مشكلة قد تواجهك. بناء خطة حلّ شاملة إن خطة الحلّ الشاملة هي مجموعة من الخطوات الَّتي تتبعها لحلّ أي مشكلة تواجهك، حيث تكون هذه الخطة عامة وتخصص بحسب المشكلة، وهي ليست تعليمات ثابتة وإنما مبادئ ننطلق منها جميعًا، وكلٌ منا يطبقها بأسلوبه الخاص، وفي نهاية المطاف إذا انطلقنا جميعًا من نفس المبادئ، فسنصل حكمًا على نفس جودة الحلّ أيضًا. إن هذه الخطة مؤلفة من عدة أجزاء ويناقش كلّ جزء فيها جانبًا معينًا من المشكلة إلى أن نصل للحلّ، وهي على الشكل التالي: 1. فهم المشكلة إن فهمنا للمشكلة المطروحة هي الخطوة الأكثر صعوبة في طريقنا لحلّها، بل إن أكثر المشاكل تأتي صعوبتها من عدم تمكننا من فهم عميق لها. ولكن متى تعلم بأنك استطعت فهم المشكلة؟ إذا كنت قادرًا على شرحها بكلمات واضحة وسهلة بحيث يستطيع أي شخص فهمها عندها تكون بالفعل قد فهمت المشكلة. هل تذكر عندما كنت عالقًا في مشكلة وبدأت بشرحها فوجدت أخطاء منطقية كثيرة لم تكن قد انتبهت لها من قبل؟ أغلب المبرمجين قد مروا بهذه الحالة من قبل، لذلك من الأفضل دومًا أن تكتب المشكلة الَّتي تواجهك باستخدام مخططات الحالة (State diagram وهي نوع من المخططات الَّتي تستخدم لتوصيف سلوك نظام ما) أو بأن تخبر شخص آخر عن المشكلة سواءً أكان زميل لك في الشركة أو عضو في الفريق أو أي شخص أخر. شاع بين المبرمجين استخدام البطة المطاطية في شرح أجزاء المشكلة لها لفهمها وإيجاد حل لها. يعد أسلوب البطة المطاطية في تنقيح الأخطاء من أكثر الأساليب سهولة وبساطة، إذ يضع المبرمج بطةً بجوار حاسوبه، وعند مواجهته لأي مشكلة يشرع في شرح الشيفرة البرمجية للبطة وما هي النتيجة المرتقبة من الشيفرة وموازنتها مع النتيجة الحالية وغالبًا ما يجد الخطأ أثناء شرحه. وخلاصة لهذه الخطوة أنقل إليك مقولة ألبرت أينشتاين: 2. تحليل المشكلة إن تقسيم المشكلة يلعب دورًا مهمًا في طريقك لإيجاد الحلّ، لذا حاول أن تقسّمها إلى أجزاء صغيرة ثمّ حُلّ كلَّ جزء منها على حدة ويُنصح في البداية بحلّ أسهل جزء منها ومن ثمّ الأصعب فالأصعب وهكذا إلى أن يتمّ حلّ جميع أجزائها، وبعدها إجمع هذه الأجزاء مع بعضها للحصول على الحلّ النهائي للمشكلة الأصلية (الكبيرة). منذ فترة كنا بصدد برمجة إضافة لمتصفح غوغل كروم بهدف تسهيل مهمة لموقع ما، فقررنا تجربة هذه الطريقة وبدأنا بتقسّيم المهمة على أجزاء ثم عملنا على حلّ كل جزء منها، وبعدها جمعنا هذه الأجزاء مع بعضها بعضًا لبناء الإضافة، وبالفعل كان العمل بهذه الطريقة سهلًا جدًا ومريحًا كما لم نعهده من قبل. في بعض الأحيان عندما تواجه شيفرات برمجية كتبها مبرمجون لا يتبعون مبادئ SOLID (وهي مجموعة من العادات والمبادئ الَّتي يتبعها المبرمجون للحصول على شيفرة برمجية قابلة للصيانة وسهلة التعديل والتكيف مع متطلبات المشروع المتغيرة)، وغالبًا ما تكون شيفرات أولئك المبرمجين غيرمفهمومة ومتشابكة ويطلق عليها اسم Spaghetti code (تكون هذه الشيفرات ذات بنية معقدة ومتشابكة وصعبة القراءة وغير مرتبة أي تكون مثل المعكرونة ملتوية ومتشابكة) ولنفرض أنه طُلبَ منك تعديل هذه الشيفرة أو إضافة وظائف جديدة إليها،عندها حتمًا ستواجه العديد من المشاكل في عملية تقسيم المشكلة ومعرفة أي جزء من الشيفرة البرمجية المُسبب للخطأ لذا كان الحصول على شيفرات برمجية مرنة وقابلة للتعديل هي الأرضية المشتركة بين العديد من تقنيات تبسيط الشيفرات البرمجية مثل مبادئ SOLID أو مبدأ MVC والذي ينص على تقسيم الوحدات من حيث طبيعة مهمتها إلى ثلاثة أقسام (Model-View-Controller) والبرمجة كائنية التوجه OOP (Object-Oriented Programming)، إذ أن جميعهم يهدفون إلى فصل الأكواد إلى أقسام ليسهل تطويرها وتنقيحها وصيانتها. 3. إعداد خطة للحل بعد أن فهمت وحللت المشكلة، يأتي دور وضع الخطة المناسبة للحلّ بحيث تغطي كافة الجوانب والتفاصيل للمشكلة، ولا تشرع في الحلّ من دون خطة (على أمل أن تجد الحلّ بطريقة ما) لأن المفتاح الرئيسي للوصول للحلّ هي الخطة الواضحة والمنظمة والتي تضمن وصولنا للحلّ النهائي. أعط لنفسك وقتًا لتحلّيل المشكلة وربط المعلومات المدخلة إلى البرنامج ونوعها والمعلومات الَّتي ستظهر كخرج للبرنامج وفهم سياقها وللحصول على خطة جيدة يجب عليك الإجابة على السؤال التالي: إذا أُعطي للبرنامج الدخل س، ما هي الخطوات اللازمة للحصول على الخرج ع؟ إن إجابتك على هذا السؤال سوف يحدد ماهي الخطوات اللازمة لحلّ المشكلة ومن ثَمَّ تقوم بترتيبها في خطة واضحة ومنظمة من أجل الحصول على الخرج الذي تريده. 4. مواجهة حالة السكتة البرمجية ماذا لو فرضنا أنك لم تستطع حلّ أي جزء من المشكلة، ولا حتى الأجزاء السهلة منها (وهذا قد يحدث في بعض الأحيان)، إن كثير من المبرمجين يقعون في هذه الحالة فلا يستطيعون أن يُحرزوا أي تقدم يذكر في تطوير الشيفرة البرمجية وهذا أشبه ما يمكن بالسكتة الدماغية (حيث لا يستطيع المريض القيام بأي حركة)، في الحقيقة إن هذه الحالة طبيعية جدًا ومعظمنا قد تعرض لها في بداية مشواره والاختلاف الوحيد هو أن المبرمج المحترف لديه فضول أكثر حول المشكلة ومعرفة سبب حدوثها بدلًا من أن يكون منزعجًا أو غاضبًا منها. وفي هذه الحالة هنالك حلّين يمكنك تجربتهما للخروج من هذا المأزق: 1-4. تنقيح الأخطاء (Debug) ليس المقصود هنا الأخطاء الكتابية في صياغة اللغة (Syntax errors) مثل نسيان فاصلة منقوطة أو أي خطأ في استخدام المتغيرات أو الدوال أو ما شابه ذلك من أخطاء والَّتي تقوم باكتشافها أي بيئة تطوير متكاملة (IDE وهي عبارة عن محرر شيفرة برمجية مدمج مع نظام ذكي لإكمال الكود ومصحح أخطاء). وبالطبع ليست أيضًا الأخطاء الّتي تظهر أثناء التنفيذ (Runtime Errors) والّتي تكون عادة نتيجة لفشلٍ في فتح ملف ما أو محاولة القسمة على صفر أو مثل هذه الأخطاء، وإنما المقصود هنا هو أخطاء المنطق البرمجي (Logic errors) الّتي ينفِّذ فيها البرنامج أمرًا غير الَّذي بُرمج من أجله، لذا من الأفضل أن تحاول أن تفحص الشيفرة البرمجية سطرًا سطرًا لعلك تجد هذا الخطأ، أوإذا كنت تعمل على لغاتٍ مثل (C++, C) والّتي تدعم استخدام المُنقِّح Debugger (الذي يراقب عمل البرنامج ويتحكم في تنفيذه بطريقة تستطيع فيها إيقاف تنفيذ البرنامج أو حتى تغييره في أي موضع من الشيفرة وذلك من خلال مجموعة من الأدوات الّتي يقدمها المُنقِّح، مثل: GNU Debugger) فيمكنك استخدامه لإيجاد الخطأ ومن ثَمّ إصلاحه. ملاحظة : من المنهجيات البرمجية الجيدة هي كتابة تعليقات توضيحية قبل كلّ دالة (Function) أو صنف (Class) برمجي وخُصوصًا تلك الأجزاء المعقدة منها لأن ذلك سوف يساعدك كثيرًا في عملية مراجعة الشيفرة البرمجية وتنقيحها. 2-4. مراجعة وتقييم الحلّ في كثير من الأحيان عند مواجهتنا للمشاكل وخصوصًا للكبيرة منها قد نضيع في التفاصيل الصغيرة للمشكلة الَّتي نواجهها وننسى المشكلة الرئيسية ولذلك من الأفضل دومًا أن نسأل أنفسنا هل هذه هي الطريقة الأفضل للحلّ؟ هل هنالك حلًّا عموميًا أفضل من الموجود؟ هل الشيفرة البرمجية أمثلية؟ هل الحلّ يخرق معايير الجودة المطلوبة؟ ارجع خطوة إلى الوراء وحاول أن تراها من منظور مختلف، وحتمًا ستلاحظ العديد من المشاكل التي غفلت عنها أثناء انشغالك بالتفاصيل الصغيرة. ملاحظة : هنالك طريقة أخرى يتبعها بعض المبرمجين لإعادة تقييم الحلّ وهي حذف الشيفرة البرمجية الخاطئة بالكامل وإعادة كتابتها من جديد فكثير ما يأخذ ذلك وقتًا أقل من تتبع المشكلة ذاتها وحلها. 5. البحث عن حلول عبر الإنترنت إن أغلب المشاريع البرمجية تكون متشابهة بكثيرٍ من الوظائف والخصائص، ونادرًا ما نرى مشروع ذو أفكارٍ جديدة بالكامل لذا فإن أي مشكلة برمجية تواجهها قد واجهها عدد كبير من المبرمجين من قبلك وأوجدوا لها حلولًا وشاركوها مع غيرهم، وكل ما عليك فعله هو أن تتعلم كيف تبحث عن المشكلة. وبالطبع صديقنا stackoverflow والذي يعد من أشهر منصات مشاركة الحلول البرمجية الّذي يقدم لك الحلّ الَّذي أجمع عليه أغلب، المبرمجين، ويوجد العديد من المنصات الأخرى المشابهة مثل AskUbuntu وهو النسخة العربية من موقع stackoverflow والكثير غيرهم، وحتى لو أنك قد حللت المشكلة أنصحك بتصفح الحلول الموجودة لأنك سوف تتعلم طرقًا أُخرى لحلّها قد تكون أسهل وأفضل بكثير من الحلّ الَّذي وصلت اليه. إلى الآن نكون قد ناقشنا الخطوة الأولى من الطريقة الشاملة لحلّ المشاكل والآن لننتقل إلى الخطوة الثانية. التدرب على هذه الخطة إن أي مهارة جديدة تحتاج إلى تدريبٍ مُمنهجٍ ومستمرٍ حتى تتقنها. لذا لا بدّ لك من وضع خطة واضحة للتدريب وتخصيص زمن محدد وثابت تقضيه في صقل تلك المهارة.يمكنك البدء مثلًا بتخصيص ساعة للتدريب يوميًا لمدة شهر كامل، وبعدها توازن نفسك مع ما كنت عليه في السابق من سرعةٍ في تحديد المشكلة وجودةٍ الحل المطروح والوقت الإجمالي لحل المشكلة وبكل تأكيد ستلاحظ تحسنًا واضحًا في أدائك. وقد تساءل نفسك كيف يمكنني التدرب على حلّ المشاكل؟ في الحقيقة هنالك طريقة مفيدة جدًا أنصحك بها لتكوين قاعدة صلبة تنطلق منها، وهي على الشكل التالي. 1. التدرب على المسائل البرمجية تعد المسابقات البرمجية سواءً على مستوى الجامعة أو على مستوى القطر أو حتى على مستوى العالم مثل مسابقة ACM ICPC من أفضل الفرص للتدريب في مجال البرمجة وصقل هذه المهارة بل وتعتبر دفعة كبيرة لك في رحلتك كمبرمج ولمستقبلك المهني أيضًا، إذ تبادر العديد من الشركات العالمية لِضمّ أولئك المنافسين المتميزين إليها بعد أن أثبتوا بالفعل أنهم النخبة في مجالهم. فإن كنت تخطط للانضمام إلى هذه المسابقة فلا تتردد وبادر بالتحضير لها من الآن. ويقدم لنا الكاتب Steven Halim في كتابه Competitive Programming بعض الفوائد الَّتي نجنيها من التدرب على حلّ المشاكل البرمجية في المسابقات. السرعة في كتابة الشيفرة البرمجية كتابة الشيفرة البرمجية بسرعة في المسابقات يوفر لك الكثير من الوقت للتفكير في بقية المشاكل واختبارها لذلك نرى أغلب المبرمجين يتدربون على سرعة الكتابة على لوحة المفاتيح لينصب تركيزهم على حلّ المشكلة فقط، ولذلك من المنطقي أن تفضل الشركات الموظفين الَّذين سَبق إن شاركوا في المسابقات البرمجية لمعرفتها بسرعة إنتاجيتهم وقدرتهم على تطوير وإيصال منتج برمجي بسرعة عالية بِالْمُوازنة مع أقرانهم ممن لم يشاركوا في المسابقات. العصف الذهني وحصر الخوارزميات الممكنة لا بدّ من تحسين قدرتك على تحديد نوع المسألة بسرعة وأن تمتلك المعرفة الكافية بالخوارزميات لتتمكن من تطبيقها مباشرة على المسألة المطروحة، لذلك ينبغي على المبرمج الَّذي ينوي الانضمام إلى المسابقة أن يتمكن من جميع الخوارزميات الشائعة في المسائل البرمجية. العمل الجماعي وروح الفريق تعتمد المسابقة البرمجية على ترتيب الفرق بحسب عدد المسائل الَّتي أجابوا عليها، والوقت الَّذي استهلكوه لحلّ كُلَ مشكلة، وعدد الحلول الخاطئة الَّتي أُرسلت للحكم. وانطلاقًا من ذلك تكون فوائد العمل كفريق واحد متعددة منها إمكانية توزيع المسائل على كلّ عضو في الفريق بحيث يزداد العدد الكلي للمسائل المحلولة بتوزيعها بين بعضهم بعضًا، ومناقشة حلّ كلّ مسألة وبذلك ينقص عدد الحلول الخاطئة الَّتي قد تُرسل للحكم، وحُكمًا سينقص الوقت المستغرق لحلّ المسائل. وعلى الصعيد العملي أيضًا نجد أن طبيعة عمل المبرمجين سواءً في الشركات الصغيرة أو الكبيرة، يُطلب منهم العمل كفريق واحد، فعلى سبيل المثال منذ فترة طَلَبَ مني أحد العملاء بناء موقع ويب، وكنت عندها قد أنتهيت من بناء فريقي البرمجي. وبالفعل بدأنا العمل على الموقع و قسّمنا العمل على أجزاء فعكف كلُّ واحد منا على تطوير جزئه الخاص من الموقع، إذ استلمتُ جزء الواجهات الخلفية، وقام أحد أعضاء الفريق باستلام الواجهات الأمامية، والآخَر استلم بناء تطبيق للهواتف الّتي تعمل بنظام أندرويد وفي نهاية الأسبوع جمعنا كل الأجزاء مع بعضها بعضًا وأنهينا المشروع بوقتٍ قياسي لم نكن لنستطيع بلوغهُ لو أننا لم نعمل كفريقٍ واحد، ولذا فإن انضمامك إلى المسابقة البرمجية يجعلك تتدرب على العمل ضمن فريق قبل أن تواجهها في سوق العمل في حال أردت العمل مع أي شركة مستقبلًا. المرونة العصبية إن تدريبك المستمر على المسائل البرمجية سيؤدي إلى زيادة منطقة الحصين (المنطقة المسؤولة عن الذاكرة والتوجيهات) في الدماغ وهذا ما أثبتته الباحثة اليانور ماجواير من كلية لندن الجامعية عندما أجرت دراسة على سائقي الأجرة في مدينة لندن فقاموا بإجراء فحص بالرنين المغناطيسي الوظيفي fMRI لأدمغة السائقين الذين قضوا قرابة عامين من التدريب في سبيل تعلم كيفية التنقل في منعطفات المدينة وذلك من أجل الحصول على رخصة القيادة ومقارنتها بصور لأدمغة رجال أصحاء من نفس العمر ولا يعملون كسائقي أجرة فتبين أن منطقة الحصين أصبحت أكبر لدى السائقين، كما لاحظوا أنه كلما أمضى سائق الأجرة فترة أطول في التدريب، زاد حجم الحصين، وذلك استجابة إلى الخبرة الّتي يكتسبها السائق. والآن تخيل معي ما سيحدث في حال تدربك على حل المشاكل لمدة عام أو أكثر، سيصبح حلّك للمشاكل البرمجية عادة سهلة ومسلية خلاف ما كانت عليه من صعوبة وتعقيد. يوجد العديد من المواقع الَّتي تقدم المسائل البرمجية مثل HackerRank أو موقع TopCoder والكثير غيرهم. 2. التدرب باستخدام الألعاب نعم أنت لم تخطئ القراءة إنها الألعاب! تعد الألعاب أداة قوية جدًا لتنمية المهارات العقلية والقدرات الدماغية على التفكير والتذكر وربط المعلومات ببعضها بعضًا، حيث أن غالبية الألعاب تحتاج لتجميع المعلومات وتنظيمها بحيث تستطيع الاستفادة منها وجعلها مفتاحًا للحلّ، بل إن الركيزة الأساسية الَّتي تشترك بها كافة الألعاب هي حلّ المشاكل! بالتأكيد نحن لا نقصد هنا ألعاب الفيديو فقط وإنما ألعاب الذكاء أيضًا مثل : لعبة الشطرنج، والألغاز الرياضية، ولعبة سودوكو، ولعبة Go، والكثير من الألعاب الَّتي تندرج تحت هذا السياق تعد ألعاب مفيدة. فعند محاولتك حلّ الألغاز في Saw أنت فعليًا تقوم بحلّ المشاكل (ولكن بإطار مختلف). وتساعدنا أيضًا في انشاء سيناريوهات للحلّ وهذه المهارة مفيدة في عالم البرمجة في حال تعثرت في أسلوب حلّ معين فتغير سيناريو الحلّ وتبدأ من جديد. في الحقيقة إن الشيء المشترك بين جميع الناس الناجحين هي اكتسابهم لعادات يومية لحلّ المشاكل الصغيرة على سبيل المثال بيتر تيل (أحد مؤسسي شركة باي بال والمصنف كرابع أغنى شخص على مستوى العالم لعام 2014 بميزانية تفوق $2.2 بليون دولار) صرح بشكل رسمي أنه يلعب الشطرنج يوميًا بل وشارك في بطولات الشطرنج مرات عديدة، وإيلون ماسك (رائد الأعمال والرئيس التنفيذي لعدة شركات مثل: سبيس إكس لتصنيع مركبات الفضاء وتسلا لصناعة السيارات الكهربائية وغيرها)أكد بأنه يلعب ألعاب الفيديو والكثير غيرهم كرسوا جزءًا من وقتهم اليومي لتنمية مهارة حلّ المشاكل. ولكن يجب أن تكون حذرًا في إدارة وقت اللعب ويُفضل أن تختار الأوقات المناسبة للعب ووضع مدة زمنية مخصصة لها، وذلك لأن الهدف ليس إضاعة الوقت والتسلية فقط وإنما التدرب على حل المشاكل ولكي لا ينتهِ بك المطاف إلى قضاء اليوم بأكمله على الألعاب. الخلاصة اعتقد أنك قد كونت فكرة جيدة عن أهمية حلّ المشاكل وضرورتها في مشوارك البرمجي وكيفية بناء خطة حلّ شاملة انطلاقًا من فهم المشكلة وتحليلها ومرورًا بإعداد خطة مخصصة لكلّ مشكلة وتقسيم المشكلة إلى أجزاء ليسهل حلّها ومواجهة حالة السكتة البرمجية وكيفية التغلب عليها من خلال تنقيح الأخطاء أو مراجعة وتقييم الحلّ، وأهمية البحث عن حلول على الإنترنت لنفس المشكلة وانتهاءً بالأسلوب الصحيح للتدرب على حل المشاكل وما هي أفضل الوسائل لتحقيق ذلك سواءً بالانضمام إلى المسابقات البرمجية أو بالتدرب بإستخدام الألعاب. وختامًا، لا تتوقع أن تصبح مبرمجًا محترفًا في غضون أسبوعٍ أو شهر واحد فهذا ضرب من الخيال بل ستحتاج لحلّ الكثير من المشاكل لبناء قاعدة معرفية صلبة تمكنك من مواجهة أي مشكلة مهما كانت صعوبتها وعندها بالتأكيد سوف تستحق لقب مبرمج محترف. اقرأ أيضًا تعلم لغة PHP تعلم لغة بايثون1 نقطة
-
Let’s Encrypt هي سلطة شهادات مفتوحة ومؤتمتة تستعمل بروتوكول ACME (Automatic Certificate Management Environment) لتوفير شهادات TLS/SSL مجانية لأي عميل يحقق الشروط المطلوبة، وتلك الشهادات يمكن أن تستعمل لتشفير الاتصالات بين خادوم الويب وزوار موقعك. هنالك الكثير من العملاء المتاحة لبروتوكول ACME المكتوبة بمختلف لغات البرمجة، مع قدرة على الدمج مع أدوات الإدارة والخدمات والخواديم الشهيرة. أشهر عميل ACME باسم Certbot يُطوَّر حاليًا من Electronic Frontier Foundation. ويمكن لعميل Certbot ضبط تشفير TLS/SSL في خودايم أباتشي و Nginx إضافةً إلى التحقق من ملكية النطاق والحصول على الشهادات. سيشرح هذا الدرس سلطات الشهادات باختصار وكيف تعمل خدمة Let’s Encrypt، ثم سنتحدث عن بعض عملاء ACME. ما هي سلطة الشهادات؟ سلطات الشهادات (certificate authorities اختصارًا CAs) هي الجهات التي توقِّع شهادات TLS/SSL رقميًا لضمان وكفالة موثوقيتها. إذ تملك المتصفحات وأنظمة التشغيل قائمةً بسلطات الشهادات الموثوقة التي يمكن استعمالها للتحقق من شهادات أحد المواقع. حتى وقتٍ قريب، كانت أغلبية سلطات الشهادات خاضعة لشركات تجارية والتي تتقاضى أموالًا للحصول على خدمات توقيع الشهادات، لكن أتت خدمة Let’s Encrypt وجعلت هذه العملية مجانية للمستخدمين عبر أتمتة العملية كليًّا، وبالاعتماد على نظام الرعاية والمساهمات المالية لتمويل البنية التحتية اللازمة لتشغيل مثل هذه الخدمة. لمزيدٍ من المعلومات حول الشهادات والأنواع المختلفة من سلطات الشهادات، فاقرأ مقالة A Comparison of Let’s Encrypt, Commercial and Private Certificate Authorities, and Self-Signed SSL Certificates. كيف تعمل خدمة Let’s Encrypt بروتوكول ACME يُعرِّف كيفية تواصل العملاء مع الخواديم لطلب الشهادات والتحقق من ملكية النطاقات وتنزيل الشهادات، وهذا البروتوكول في صدد تحويله إلى معيار IETF رسمي. توفِّر خدمة Let’s Encrypt شهادات لنطاقات موثوقة، وهذا يعني أنَّها ستتحقق أنَّ الشهادة تأتي من شخصٍ يتحكم فعليًا بالنطاق، وذلك عبر إرسال العميل لرمز فريد (unique token) ثم إجراء طلبية ويب أو DNS للحصول على مفتاح مأخوذ من ذاك الرمز. على سبيل المثال، لو كنا سنجري تحقق عبر HTTP، فسيحسب العميل المفتاح من الرمز الفريد (unique token) ورمز الحساب (account token)، ثم يضع الناتج في ملف مُخدَّم من خادوم الويب، ثم يمكن لخواديم Let’s Encrypt أن تنزِّل الملف الموجود في المسار http://example.com/.well-known/acme-challenge/token فإذا كان المفتاح صحيحًا، فهذا يعني أن العميل قادرٌ على التحكم بالموارد الموجودة في النطاق example.com وبالتالي سيوقِّع الخادوم الشهادة ويتيحها للعميل. يُعرِّف بروتوكول ACME عدِّة طرائق للتحقق أنَّ العميل يملك النطاق، فاختبار HTTPS شبيه باختبار HTTP، لكن بدلًا من استخدام ملف نصي فسيوفِّر العميل شهادة موقعة ذاتيًا وفيها مفتاح التحقق. أما التحقق عبر DNS فيتم عبر وضع المفتاح في سجل DNS TXT. عميل Certbot Certbot هو أشهر عميل Let’s Encrypt، وهو متوافر في أغلبية توزيعات لينكس ويتضمن القدرة على الضبط التلقائي لخادومَي أباتشي و Nginx. يمكنك الحصول على الشهادة وتحديث ضبط أباتشي بتنفيذ الأمر الآتي بعد تثبيت عميل Certbot: sudo certbot --apache -d www.example.com سيسألك Certbot بعض الأسئلة ثم يجري عملية التحقق وينزِّل الشهادات ويُحدِّث ضبط أباتشي ويعيد تحميل الخادوم، ويمكنك بعد ذلك أن تنتقل إلى https://www.example.com في متصفح الويب الخاص بك وستشاهد القفل الأخضر مشيرًا إلى أنَّ الشهادة صحيحة والاتصال مشفّر. ولأن شهادات Let’s Encrypt صالحة لتسعين يومًا فقط، فمن المهم ضبط عملية تجديد مؤتمة. الأمر الآتي سيُجدِّد كل الشهادات الموجودة على الحاسوب: sudo certbot renew ضع الأمر السابق في جدول cron وشغِّله يوميًا، وستُجدَّد الشهادات تلقائيًا قبل ثلاثين يومًا من انتهاء صلاحيتها، وإذا أُنشِئَت الشهادة بادئ الأمر مع أحد الخيارين --apache أو --nginx فسيعيد Certbot تحميل الخادوم بعد نجاح عملية التجديد. إذا أردتَ معرفة المزيد من المعلومات حول جداول cron فأحيلك إلى درس كيف نستخدم المهام المجدولة باستخدامCron في أنظمة لينكس ويونكس. عملاء آخرين لأن بروتوكول ACME مفتوح وموثّق جيدًا، فقد طوِّرَ الكثير من العملاء البديلين، وهنالك قائمة بعملاء ACME في موقع Let’s Encrypt، وأغلبية العملاء لا يملكون ميزة ضبط خادوم الويب تلقائيًا التي يملكها Certbot لكن هنالك ميزات أخرى لها قد تجذبك: - هنالك عميل مكتوب بكل لغات البرمجة تقريبًا، بما في ذلك سكربتات الصدفة (shell scripts) ولغة Go و Node.js، وقد تستفيد من ذلك إن كنتَ تُنشِئ شهادات في بيئة مغلقة لا يمكن تضمين بايثون فيها ولا بقية اعتماديات Certbot. - بعض العملاء يمكن أن يعملوا دون امتيازات الجذر، فمن المستحسن تقليل كمية الشيفرات التي تعمل بامتيازات الجذر إلى أقل قدر ممكن. - الكثير من العملاء يمكنها أتمتة عملية التحقق عبر DNS عبر استخدام الواجهة البرمجية المناسبة لموفِّر خدمة DNS لإنشاء سجلات TXT تلقائيًا، والتحقق عبر DNS يسمح بتوليد شهادات لحالات الاستخدام الغريبة مثل تشفير خواديم الويب التي لا يمكن للعموم الوصول إليها. - بعض العملاء يمكن أن يندمج مع خودايم الويب أو الخواديم الوسيطة (proxy) العكسية، أو موزّعات الحِمل (load balancers) مما يسهِّل عملية الضبط والتشغيل. بعض أشهر تلك العملاء: - lego المكتوب بلغة Go، والذي يُثبَّت عبر ملفٍ ثنائيٍ وحيد، والذي يدعم عدد من مزودي خدمة DNS لتسهيل التحقق عبر DNS. - acme.sh وهو سكربت صدفة بسيط يمكن أن يعمل دون امتيازات الجذر، ويستطيع أن يتواصل مع أكثر من 30 مزودًا لخدمة DNS. - Caddy وهو خادوم ويب كامل مكتوب بلغة Go والذي يملك دعمًا مدمجًا فيه لخدمة Let’s Encrypt. يتوافر الكثير من العملاء، وأصبحت العديد من الخدمات والخواديم تؤتمت عملية إعداد TLS/SSL بدعم خدمة Let’s Encrypt فيها. الخلاصة لقد شرحنا أساسيات عمل خدمة Let’s Encrypt، وناقشنا أشهر العملاء المتوافرين، وإذا أردتَ معرفة كيفية إعداد هذه الخدمة مع بقية البرمجيات فأنصحك بالاطلاع على درس تنصيب شهادة SSL مجانية عبر خدمة Let’s encrypt على خادوم لينكس. ترجمة –وبتصرّف– للمقال An Introduction to Let’s Encrypt لصاحبه Brian Boucheron1 نقطة
-
تمهيد OwnCloud هو خادوم مشاركة ملفات الذي يسمح لك بتخزين المحتوى الخاص بك مثل المستندات والصور في مكانٍ مركزي بشكلٍ يشبه خدمة Dropbox. الاختلاف بينهما هو أنَّ ownCloud هو برمجية حرة ومفتوحة المصدر، مما يسمح لأي شخص باستخدامه وتفحّص شيفرته، وهذا يعني أيضًا تحكمك بأمان وحماية بياناتك المهمة تمامًا مما يجنِّبُك استخدام خدمات استضافة من طرفٍ آخر. سنُثبِّت ونضبط في هذا الدرس نسخة من ownCloud على خادوم أوبنتو 16.04. المتطلبات المسبقة ستحتاج إلى ما يلي لإكمال الخطوات المذكورة في هذا الدرس: الوصول إلى مستخدم بامتيازات الجذر على خادومك: يُمكنك اتباع هذا الدّرس لإنشاء مستخدم يملك وصولًا إلى امتيازات الجذر عبر الأمر sudo. خدمات LAMP: يتطلب ownCloud وجود خادوم ويب وقاعدة بيانات ومُفسِّر PHP لكي يعمل بشكلٍ صحيح؛ إذا أعددتَ خدمات LAMP (أي Linux و Apache و MySQL و PHP) فستُحقِّق هذا الشرط. يشرح لك هذا الدرس كيفية تثبيت وضبط تلك الخدمات. شهادة SSL: طريقة ضبط الشهادة تختلف فيما إذا كنتَ تملك اسم نطاق (domain name) ليشير إلى خادومك أم لا. إذا كان لديك اسم نطاق فأسهل طريقة لتأمين موقعك هي استخدام «Let’s Encrypt» والذي يوفِّر لك شهادات مجانية وموثوقة، راجع درس تنصيب شهادة SSL مجانية عبر خدمة Let’s encrypt على خادوم لينكس لمزيدٍ من المعلومات. إذا لم يكن لديك نطاق، وكنت تتبع هذا الدرس لتجربة ownCloud أو لاستخدامه استخدامًا شخصيًا، فيمكنك إنشاء شهادة موقّعة ذاتيًا؛ والتي ستوفِّر نفس نوع التشفير، لكن دون التحقق من هوية النطاق. اتبع درس كيفية إنشاء شهادات SSL موقعة ذاتيًا لمزيدٍ من المعلومات. الخطوة الأولى: تثبيت ownCloud لا تتوافر حزمة ownCloud في مستودعات أوبنتو الافتراضية، لكن برمجية ownCloud توفِّر مستودعًا خاصًا لتوزيعة أوبنتو. علينا أولًا تنزيل مفتاح الإصدارة (release key) باستخدام الأمر curl ثم استيراد ذاك المفتاح باستخدام الأمر apt-key: curl https://download.owncloud.org/download/repositories/stable/Ubuntu_16.04/Release.key | sudo apt-key add - ... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1358 100 1358 0 0 2057 0 --:--:-- --:--:-- --:--:-- 2057 OK يحتوي الملف Release.key على مفتاح PGP عمومي الذي يمكن للأداة apt استخدامه للتأكّد أنَّ الحزم التي سننزلّها لبرمجية ownCloud هي حزمٌ موثوقة. إضافةً إلى استيراد المفتاح، يجب علينا إنشاء ملف باسم owncloud.list فيه عنوان مستودع ownCloud في مجلد sources.list.d التابع للأداة apt: echo 'deb http://download.owncloud.org/download/repositories/stable/Ubuntu_16.04/ /' | sudo tee /etc/apt/sources.list.d/owncloud.list نفِّذ الأمر apt-get update بعد إضافة المستودع الجديد لكي نُعلِمَ apt بالتغيير الذي أحدثناه: sudo apt-get update أخيرًا، نستطيع تثبيت ownCloud باستخدام الأمر apt-get install: sudo apt-get install owncloud ونتيجةً لتثبيت ownCloud سيُضاف ملفُ ضبطٍ جديدٍ إلى مجلد ضبط أباتشي (Apache)؛ استخدم الأمر systemctl لإعادة تشغيل أباتشي لكي يقرأ ملف الضبط: sudo systemctl restart apache2 بعد تثبيت خادوم ownCloud، حان الوقت لضبط قاعدة البيانات للاستخدام. الخطوة الثانية: ضبط قاعدة بيانات MySQL علينا بادئ الأمر أن نُسجِّل دخولنا إلى MySQL بحسابٍ له امتيازاتٌ إدارية: mysql -u root -p أدخِل كلمة المرور التي ضبطتها للمستخدم root التابع لقاعدة بيانات MySQL عندما ثبّتَها. يجب إنشاء قاعدة بيانات منفصلة لخادوم ownCloud لتخزين البيانات الإدارية، وصحيحٌ أنَّ تستطيع تسمية قاعدة البيانات بأيِّ اسمٍ تشاء، لكنني فضَّلتُ استخدام owncloud لتبسيط الأمور. نفِّذ الأمر الآتي في سطر أوامر MySQL: CREATE DATABASE owncloud; ملاحظة: يجب أن تنتهي جميع أوامر وتعابير MySQL بفاصلة منقوطة ;، تأكّد أنَّك لم تنسها إن واجهت أيّة مشاكل عند تنفيذ الأوامر المذكورة هنا. أنشِئ بعد ذلك مستخدمًا جديدًا في MySQL للتعامل مع قاعدة البيانات الجديدة. إنشاء قواعد بيانات ذات غرضٍ وحيد وإنشاء مستخدمين مخصصين لإدارتها هو أمرٌ حسنٌ من ناحية سهولة الإدارة والأمان. وكما عند تسمية قاعدة البيانات، اختر ما تشاء اسمًا للمستخدم، إلا أنَّنا اخترنا الاسم owncloud في هذا الدرس. نفِّذ الأمر الآتي في سطر أوامر MySQL: GRANT ALL ON owncloud.* to 'owncloud'@'localhost' IDENTIFIED BY 'set_database_password'; تنويه: ضع كلمة مرورك في الأمر السابق بدلًا من set_database_password. بعد السماح للمستخدم الجديد بالوصول إلى قاعدة البيانات، فحدِّث امتيازات الوصول لكي تضمن أنَّ النسخة الحالية التي تعمل من MySQL تعرف عن التعديلات الأخيرة التي أجريتَها: FLUSH PRIVILEGES; لقد انتهى ضبطنا لقاعدة MySQL، وبالتالي يمكننا الخروج من جلسة MySQL بكتابة: exit بعد تثبيت ownCloud وضبط قاعدة بياناته، فنحن الآن جاهزون لضبط خادوم ownCloud نفسه. الخطوة الثالثة: ضبط ownCloud للوصول إلى واجهة الويب التابعة لبرمجية ownCloud فافتح متصفح الويب واذهب إلى الرابط الآتي: https://server_domain_or_IP/owncloud إذا استخدمتَ شهادةً موقعةً ذاتيًا، فسترى تحذيرًا لأنَّ الشهادة غير موقعة من سلطة يثق بها متصفحك. لا تقلق، هذا طبيعيٌ جدًا، إذا كنتَ مهتمًا بالتشفير وليس بالتحقق من صحة الشهادة، فاضغط على الزر أو الرابط الملائم للمتابعة إلى صفحة إدارة ownCloud. ستبدو الصفحة شبيهةً بما يلي: أنشِئ الآن حساب مدير باختيار اسم مستخدم (لا يجدر بك استخدام اسم مثل «admin» لأسبابٍ أمنية) وكلمة مرور. قبل الضغط على زر «Finish setup» فاضغط على رابط «Storage & database»: اترك خيار «Data folder» كما هو واضغط على زر «MySQL/MariaDB» في قسم «Configure the database»، أدخِل معلومات قاعدة البيانات والتي ضبطتها في الخطوة السابقة. ما يلي هو مثالٌ يُطابِق معلومات قاعدة البيانات التي أدخلناها منذ قليل: اضغط على زر «Finish setup» للتسجيل في ownCloud. ستظر نافذة بعنوان «A safe home for all your data»: اضغط على إشارة × في الزاوية العليا اليمنى من النافذة لكي تصل إلى الواجهة الرئيسية: يمكنك من تلك الواجهة إنشاء أو رفع الملفات إلى منصة التخزين السحابي الخاصة بك! الخلاصة يملك ownCloud أغلبية ميزات خدمات التخزين السحابي، حيث يمكن مشاركة المحتوى بين المستخدمين أو عبر روابط URL عامة. ميزة استخدام ownCloud هي تخزين البيانات بأمان في مكانٍ تتحكم فيه أنت. استكشف الواجهة وتثبّت بعض الإضافات عبر متجر ownCloud لمزيدٍ من الميزات. ترجمة -وبتصرّف- للمقال How To Install and Configure ownCloud on Ubuntu 16.04 لصاحبه Michael Lenardson1 نقطة
-
يُعتمَد على الأنظمة الوهمية في مختلف البيئات والحالات؛ فلو كنت مطوِّرًا فتوفر لك الأنظمة الوهمية بيئة مُحتوَية حيث تستطيع أن تجري أي نوع من أنواع التطوير دون القلق من تخريب بيئة العمل الرئيسية عندك. وإذا كنت مديرًا للأنظمة، فتستطيع استخدام الأنظمة الوهمية لتعزل خدماتك عزلًا سهلًا وتنقلهم بناءً على الحاجة. تقنية الأنظمة الوهمية الافتراضية المدعومة في أوبنتو هي KVM، تتطلب KVM ملحقات لدعم الأنظمة الوهمية في عتاد Intel و AMD؛ وتقنية Xen مدعومة أيضًا في أوبنتو؛ حيث يمكن أن تستفيد Xen من تلك الملحقات عند توفرها، لكن يمكن تشغيلها على عتاد دون إضافات الأنظمة الوهمية؛ خيار شائع أخر هو Qemu للعتاد بدون ملحقات الأنظمة الوهمية (virtualization extensions). libvirt تُستخدَم المكتبة libvirt للتعامل مع مختلف تقنيات الأنظمة الوهمية؛ وقبل البدء مع libvirt، من الأفضل التحقق أنّ عتادك يدعم الملحقات الضرورية لعمل KVM، وذلك بإدخال الأمر الآتي في الطرفية: kvm-ok ستظهر رسالة تعلِمك إن كان معالجك يدعم أو لا يدعم الملحقات العتادية للأنظمة الوهمية. ملاحظة: يكون من الضروري في أغلب الحواسيب التي تدعم معالجاتها الأنظمة الوهمية أن يفعَّل خيارٌ في BIOS لتمكينها. التواصل الشبكي الوهمي هنالك عدِّة طرق للسماح لنظام وهمي بالوصول إلى الشبكة الخارجية؛ خيار ضبط التواصل الشبكي الوهمي الافتراضي هو «usermode»، الذي يستخدم بروتوكول SLIRP ويمرِّر التراسل الشبكي عبر NAT عبر بطاقة المضيف إلى الشبكة الخارجية. لتمكين وصول المضيفين الخارجيين إلى الخدمات مباشرةً على الأنظمة الوهمية، فيجب استخدام ضبط «bridge»؛ هذا يسمح للبطاقات الشبكية الوهمية بالاتصال إلى الشبكة الخارجية عبر البطاقة العتادية، مما يجعلها تبدو كأنها حواسيب عادية لبقية الشبكة. التثبيت أدخِل ما يلي في الطرفية لتثبيت الحزم اللازمة: sudo apt-get install kvm libvirt-bin يجب إضافة المستخدم الذي سيدير الآلات الوهمية إلى مجموعة libvirtd بعد تثبيت libvirt-bin؛ وبهذا تعطي المستخدم وصولًا إلى خيارات الشبكة المتقدمة؛ وذلك بإدخال الأمر الآتي: sudo adduser $USER libvirtd ملاحظة: إذا كان المستخدم الذي أضفته هو المستخدم الحالي، فيجب عليك تسجيل الخروج ثم الدخول مرةً أخرى لكي تأخذ عضوية المجموعة الجديدة مفعولها. أنت الآن جاهز لتثبيت نظام تشغيل «ضيف» (Guest)؛ طريقة تثبيت نظام التشغيل على الآلات الوهمية هي نفس طريقة تثبيته مباشرةً على العتاد؛ أي أنك إما أن تحتاج إلى أتمتة التثبيت، أو إلى لوحة مفاتيح وشاشة موصولين إلى الآلة الفيزيائية. في حالة الآلات الوهمية، تكون الواجهة الرسومية (GUI) مماثلة لاستخدام لوحة مفاتيح وفأرة فيزيائية؛ فبدلًا من تثبيت واجهة رسومية، يمكن استخدام التطبيق virt-viewer للاتصال إلى الآلة الوهمية باستخدام VNC، راجع القسم «عارض الآلات الوهمية» لمزيدٍ من التفاصيل. هنالك عدِّة طرق لأتمتة تثبيت أوبنتو، إذ يمكن ذلك باستخدام preseed أو kickstart على سبيل المثال. راجع دليل تثبيت أوبنتو للتفاصيل. طريقة أخرى لتثبيت أوبنتو على آلة افتراضية هي استخدام ubuntu-vm-builder، يسمح ubuntu-vm-builder بإعداد متقدم للأقسام، وتنفيذ سكربتات بعد التثبيت ...إلخ. للتفاصيل، راجع القسم «الصور السحابية وأداة uvtools». يمكن ضبط Libvirt مع Xen، راجع صفحة مجتمع أوبنتو المُشار إليها في المصادر. virt-install virt-install هو جزء من حزمة virtinst، أدخِل الأمر الآتي لتثبيتها: sudo apt-get install virtinst هنالك عدِّة خيارات متوفرة عند استخدام virt-install: sudo virt-install -n web_devel -r 256 \ --disk path=/var/lib/libvirt/images/web_devel.img,bus=virtio,size=4 -c \ ubuntu-14.04-server-i386.iso --network network=default,model=virtio \ --graphics vnc,listen=0.0.0.0 --noautoconsole -v الخيار -n web_devel: اسم الآلة الوهمية، سيكون web_devel في هذا المثال. الخيار -r 256: تحديد مقدار الذاكرة التي ستستخدمها الآلة الوهمية مقدرًا بالميغابايت. الخيار --disk path=/var/lib/libvirt/images/web_devel.img,size=4: الإشارة إلى مسار القرص الوهمي الذي يمكن أن يكون ملفًا أو قسمًا أو حجمًا وهميًا؛ في هذا المثال هنالك ملف باسم web_devel.img في مجلد /var/lib/libvirt/images/ بحجم 4 غيغابايت، وسيستخدم virtio كناقل للقرص (disk bus). الخيار :-c ubuntu-14.04-server-i386.iso الملف الذي سيُستخدَم كقرص CD-ROM وهمي، يمكن أن يكون الملف إما ملف ISO أو مسار إلى جهاز قرص CD-ROM في المضيف. الخيار --network: يوفر معلومات حول البطاقة الشبكية للآلة الوهمية؛ يُستخدَم هنا default، وضُبِط موديل البطاقة إلى virtio. الخيار --graphics vnc,listen=0.0.0.0: تصدير طرفية الضيف باستخدام VNC على جميع البطاقات الشبكية للمضيف؛ إذ عمومًا لا يكون للخادوم واجهة رسومية، لذلك فيمكن لحاسوب آخر على الشبكة المحلية ذي واجهةٍ رسومية أن يتصل عبر VNC لإكمال التثبيت. الخيار --noautoconsole: يؤدي إلى عدم الاتصال تلقائيًا إلى طرفية الآلة الوهمية. الخيار -v: إنشاء ضيف وهمي كامل. بعد تشغيل virt-install يمكنك الاتصال إلى طرفية الآلة الوهمية إما محليًا باستخدام GUI أو باستخدام الأداة virt-viewer. virt-clone يمكن استخدام virt-clone لنسخ آلة وهمية إلى آلة أخرى؛ على سبيل المثال: sudo virt-clone -o web_devel -n database_devel -f /path/to/database_devel.img \ --connect=qemu:///system -o: الآلة الوهمية الأصلية. -n: اسم الآلة الوهمية الجديدة. -f: المسار إلى الملف، أو القسم، أو الحجم المنطقي الذي سيُستخدَم من الآلة الوهمية الجديدة. --connect: تحديد «المشرف» (hypervisor) الذي سيُتصَّل به. يمكن أيضًا استخدام الخيار -d أو --debug لاستكشاف الأخطاء مع virt-clone. ملاحظة: استبدل web_devel و database_devel بأسماء ملائمة للآلات الوهمية. إدارة الآلة الوهمية virsh هنالك عدِّة أدوات متوفرة لإدارة الآلات الوهمية و libvirt؛ يمكن أن تُستخدَم الأداة virsh من سطر الأوامر؛ هذه بعض الأمثلة: لعرض قائمة بالآلات الوهمية التي تعمل: virsh -c qemu:///system list لبدء تشغيل آلة وهمية: virsh -c qemu:///system start web_devel وبشكلٍ مشابه، لتشغيل آلة وهمية عند الإقلاع: virsh -c qemu:///system autostart web_devel أعد إقلاع آلة وهمية باستخدام الأمر: virsh -c qemu:///system reboot web_devel يمكن حفظ «حالة» (state) الآلة الوهمية إلى ملف لتُستعاد لاحقًا؛ ما يلي سوف يحفظ حالة الآلة الوهمية إلى ملف مسمى وفقًا لتاريخ اليوم: virsh -c qemu:///system save web_devel web_devel-022708.state ستتوقف الآلة الوهمية عن العمل بعد حفظ حالتها. يمكن استعادة الآلة الوهمية باستخدام: virsh -c qemu:///system restore web_devel-022708.state نفِّذ الأمر لإيقاف تشغيل آلة وهمية: virsh -c qemu:///system shutdown web_devel يمكن وصل جهاز CD-ROM إلى آلة وهمية بالأمر: virsh -c qemu:///system attach-disk web_devel /dev/cdrom /media/cdrom ملاحظة: استبدل في الأمثلة السابقة web_devel مع اسم الآلة الوهمية الملائم، و web_devel-022708.state باسم ملف أكثر وصفًا. مدير الآلات الوهمية تحتوي حزمة virt-manager على أداة رسومية لإدارة الآلات الوهمية المحلية والبعيدة؛ أدخِل الأمر الآتي لتثبيتها: sudo apt-get install virt-manager لما كانت الأداة virt-manager تتطلب واجهة رسومية (GUI) فمن المستحسن أن تُثبَّت على محطة عمل أو جهاز للاختبارات بدلًا من خادوم إنتاجي؛ أدخِل الأمر الآتي للاتصال بخدمة libvirt محلية: virt-manager -c qemu:///system تستطيع الاتصال بخدمة libvirt في مضيف آخر بإدخال ما يلي في الطرفية: virt-manager -c qemu+ssh://virtnode1.mydomain.com/system ملاحظة: يفترض المثال السابق أن إمكانية الاتصال عبر SSH بين نظام الإدارة و virtnode1.mydomain.com قد ضُبِطَت مسبقًا، وتستخدم مفاتيح SSH للاستيثاق؛ هنالك حاجة لمفاتيح SSH لأن المكتبة libvirt تُرسِل محث كلمة المرور إلى عملية أخرى. للتفاصيل عن ضبط SSH، راجع درس خادوم OpenSSH. عارض الآلات الوهمية يسمح التطبيق virt-viewer لك بالاتصال إلى طرفية الآلة الوهمية لكن virt-viewer يتطلب واجهة رسومية (GUI) للتعامل مع الآلة الوهمية، أدخِل الأمر الآتي من الطرفية لتثبيت virt-viewer: sudo apt-get install virt-viewer بعد تثبيت وتشغيل آلة وهمية، يمكنك الاتصال إلى طرفيتها بالأمر: virt-viewer -c qemu:///system web_devel وكما في virt-manager، يمكن اتصال virt-viewer إلى مضيف بعيد باستخدام SSH مع استيثاق باستخدام مفتاح: virt-viewer -c qemu+ssh://virtnode1.mydomain.com/system web_devel تأكد من استبدال web_devel باسم الآلة الوهمية الملائم. إذا ضبطت استخدام بطاقة شبكية جسرية (bridged network interface)، فيمكنك ضبط وصول SSH إلى الآلة الوهمية؛ راجع درس خادوم OpenSSH لمزيدٍ من المعلومات. مصادر راجع صفحة KVM الرئيسية للمزيد من التفاصيل. للمزيد من المعلومات حول libvirt، انظر إلى صفحة libvirt الرئيسية. موقع «Virtual Machine Manager» فيه المزيد من المعلومات حول تطوير virt-manager. ادخل إلى قناة #ubuntu-virt على خادوم freenode لمناقشة تقنيات الأنظمة الوهمية في أوبنتو. مصدر آخر جيد هو صفحة ويكي أوبنتو «KVM». للمزيد من المعلومات حول Xen، بما فيها استخدام Xen مع libvirt؛ رجاءً راجع صفحة ويكي أوبنتو «Xen». ترجمة -وبتصرف- للمقال Ubuntu Server Guide: libvirt.1 نقطة
-
واحدة من أكبر المشاكل مع البريد الإلكتروني اليوم هي مشكلة البريد غير المرغوب فيه (Unsolicited Bulk Email أو اختصارًا UBE) المعروف أيضًا بالبريد العشوائي (SPAM)؛ قد تحتوي هذه الرسائل أيضًا على فيروسات أو أشكالٍ أخرى من البرمجيات الخبيثة؛ ووفقًا لبعض التقارير، تشغل هذه الرسائل حيزًا كبيرًا من البريد الإلكتروني المُرسَل عبر الإنترنت. سيشرح هذا القسم طريقة دمج Amavisd-new، و Spamassassin، و ClamAV مع عميل نقل البريد Postfix؛ يمكن أيضًا التحقق من البريد عبر تمريره خلال مرشحات خارجية؛ هذه المرشحات يمكنها في بعض الأحيان تحديد إذا ما كانت الرسالةُ عشوائيةً دون الحاجة إلى معالجتها ببرمجيات تستهلك الموارد؛ أشهر هذه المرشحات هي opendkim و python-policyd-spf. Amavisd-new هو برنامج مُغلِّف (wrapper) يستطيع استدعاء أي عدد من برامج ترشيح المحتوى لاستكشاف الرسائل العشوائية، وللتصدي للفيروسات ...إلخ. يستخدم Spamassassin آلياتٍ عدِّة لترشيح البريد اعتمادًا على محتوى الرسالة. ClamAV هو مضاد فيروسات مفتوح المصدر. يوفر opendkim ما يسمىMilter (أي Sendmail Mail Filter) إلى المعيار القياسي DKIM (أي DomainKeys Identified Mail). يُفعِّل python-policyd-spf تحقق SPF (اختصار للعبارة Sender Policy Framework) مع Postfix. هذه هي آلية جمع القطع السابقة: تُقبَل رسالة البريد الإلكتروني من Postfix. تُمرَّر الرسالة إلى أي مرشحات خارجية مثل opendkim و python-policyd-spf في هذه الحالة. ثم يُعالِج Amavisd-new الرسالة. ثم يُستخدَم ClamAV لفحص الرسالة؛ إذا حوت الرسالة على فيروس، فسيرفضها Postfix. ستُحلَّل الرسائل «النظيفة» من Spamassassin للتحقق إذا كانت الرسالة هي رسالة عشوائية؛ ثم يضيف Spamassassin أسطر X-Header ليسمح للبرمجية Amavisd-new بإكمال معالجة الرسالة. على سبيل المثال، إذا كان «رصيد العشوائية» لرسالة ما أكبر من خمسين بالمئة، فيمكن أن تُزال الرسالة تلقائيًا من الطابور (queue) حتى دون إعلام المتلقي؛ طريقة أخرى للتعامل مع هذه الرسائل هي إيصالهم لعميل مستخدم البريد (MUA) والسماح للمستخدم بأن يتعامل مع الرسالة بما يراه مناسبًا. التثبيت راجع درس Postfix لمعلوماتٍ تفصيلية عن تثبيت Postfix. أدخل الأمرين الآتيين في سطر الأوامر لتثبيت بقية البرمجيات: sudo apt-get install amavisd-new spamassassin clamav-daemon sudo apt-get install opendkim postfix-policyd-spf-python هنالك بعض الحزم الأخرى التي يمكن أن تُدمَج مع Spamassassin لاكتشاف أفضل للرسائل العشوائية: sudo apt-get install pyzor razor بالإضافة إلى برمجيات الترشيح الرئيسية، سنحتاج إلى أدوات الضغط لنعالج بعض مرفقات البريد: sudo apt-get install arj cabextract cpio lha nomarch pax rar unrar unzip zip ملاحظة: إذا لم يُعثَر على بعض الحزم السابقة، فتأكد من تفعيل مستودع multiverse في ملف /etc/apt/sources.list. إذا أجريتَ تعديلاتٍ على ذاك الملف، فتأكد من تحديث فهرس الحزم بتنفيذ الأمر sudo apt-get update قبل محاولة التثبيت مرةً أخرى. الضبط علينا الآن ضبط كل شيء مع بعضه بعضًا لترشيح البريد. ClamAV السلوك الافتراضي لبرمجية ClamAV تناسب احتياجاتنا؛ للمزيد من خيارات الضبط الخاصة ببرمجية ClamAV، راجع ملفات الضبط في /etc/clamav. أضف المستخدم clamav إلى المجموعة amavis لكي يملك Amavisd-new الوصول الملائم لتفحص الملفات: sudo adduser clamav amavis sudo adduser amavis clamav Spamassassin يعثر Spamassassin تلقائيًا على المكونات الإضافية ويستخدمها إن توفرت؛ هذا يعني أنه لا حاجة لضبط pyzor و razor. عدِّل ملف الضبط /etc/default/spamassassin لتفعيل عفريت Spamassassin، عدِّل قيمة ENABLED=0 إلى: ENABLED=1 ثم ابدأ تشغيل العفريت: sudo service spamassassin start Amavisd-new أولًا، فعِّل استكشاف الرسائل العشوائية ومضاد الفيروسات في Amavisd-new بتعديل الملف /etc/amavis/conf.d/15-content_filter_mode: use strict; # You can modify this file to re-enable SPAM checking through spamassassin # and to re-enable antivirus checking. # # Default antivirus checking mode # Uncomment the two lines below to enable it # @bypass_virus_checks_maps = ( \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re); # # Default SPAM checking mode # Uncomment the two lines below to enable it # @bypass_spam_checks_maps = ( \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re); 1; # insure a defined return قد تكون إعادة معالجة الرسائل العشوائية فكرةً سيئةً لأن العنوان المُعاد مزيفٌ غالبًا؛ ربما ترغب بتعديل الملف /etc/amavis/conf.d/20-debian_defaults لتضبط $final_spam_destiny إلى D_DISCARD بدلًا من D_BOUNCE، كما يلي: $final_spam_destiny = D_DISCARD; وربما ترغب بتعديل قيمة الخيارات الآتية لتعليم (flag) المزيد من الرسائل كرسائل عشوائية: $sa_tag_level_deflt = -999; # add spam info headers if at, or above that level $sa_tag2_level_deflt = 6.0; # add 'spam detected' headers at that level $sa_kill_level_deflt = 21.0; # triggers spam evasive actions $sa_dsn_cutoff_level = 4; # spam level beyond which a DSN is not sent إذا كان اسم المضيف للخادوم (hostname) مختلفًا عن سجل MX للنطاق، فربما تحتاج إلى أن تضبط الخيار $myhostname يدويًا؛ وإذا كان الخادوم يستلم البريد لأكثر من نطاق، فيجب تخصيص الخيار @local_domains_acl أيضًا، وذلك بتعديل الملف /etc/amavis/conf.d/50-user: $myhostname = 'mail.example.com'; @local_domains_acl = ( "example.com", "example.org" ); إذا أردت تغطية أكثر من نطاق، فعليك استخدام ما يلي في /etc/amavis/conf.d/50-user: @local_domains_acl = qw(.); يجب إعادة تشغيل Amavisd-new بعد الضبط: sudo service amavis restart DKIM Whitelist يمكن ضبط Amavisd-new ليضيف عناوين من نطاقات معينة مع مفاتيح نطاق (Domain Keys) صالحة إلى القائمة البيضاء (Whitelist)؛ هنالك بعض النطاقات المضبوطة مسبقًا في /etc/amavis/conf.d/40-policy_banks: هذه بعض الأمثلة لضبط القائمة البيضاء لنطاق: التعليمة 'example.com' => 'WHITELIST',: ستضيف أي عنوان من النطاق "example.com" إلى القائمة البيضاء. التعليمة '.example.com' => 'WHITELIST',: ستضيف أي عنوان من أي نطاق فرعي للنطاق "example.com" ويملك توقيع صالح (valid signature) إلى القائمة البيضاء. التعليمة '.example.com/@example.com' => 'WHITELIST',: إضافة أي عنوان من النطاقات الفرعية للنطاق "example.com" الذي يستخدم توقيع النطاق الأب "example.com". التعليمة './@example.com' => 'WHITELIST',: يضيف العناوين من توقيع صالح من "example.com" هذا يستخدم عادةً لمجوعات النقاش التي توقَّع رسائلها. يمكن أن يملك نطاقٌ واحد أكثر من ضبط للقائمة البيضاء؛ عليك إعادة تشغيل amavisd-new بعد تعديل الملف: sudo service amavis restart ملاحظة: في هذا السياق؛ عندما يُضاف النطاق إلى القائمة البيضاء، فإن الرسالة لن تحصل على أي فحص من الفيروسات أو الرسائل العشوائية؛ ربما يكون أو لا يكون هذا هو السلوك الذي ترغبه لهذا النطاق. Postfix أدخل ما يلي في مِحَث الطرفية لدمج Postfix: sudo postconf -e 'content_filter = smtp-amavis:[127.0.0.1]:10024' ثم عدِّل الملف /etc/postfix/master.cf وأضف الأسطر الآتية إلى نهاية الملف: smtp-amavis unix - - - - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes -o max_use=20 127.0.0.1:10025 inet n - - - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_delay_reject=no -o smtpd_client_restrictions=permit_mynetworks,reject -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o smtpd_data_restrictions=reject_unauth_pipelining -o smtpd_end_of_data_restrictions= -o mynetworks=127.0.0.0/8 -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001 -o smtpd_hard_error_limit=1000 -o smtpd_client_connection_count_limit=0 -o smtpd_client_connection_rate_limit=0 -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters أيضًا أضف السطرين الآتيين مباشرةً بعد خدمة النقل «pickup»: -o content_filter= -o receive_override_options=no_header_body_checks هذا سيمنع الرسائل المُولَّدة للتبليغ عن الرسائل العشوائية من تصنيفها كرسائل عشوائية؛ أعد الآن تشغيل Postfix: sudo service postfix restart يجب الآن أن يكون ترشيح المحتوى والعثور على الفيروسات مُفعَّلًا. الاختبار أولًا، اختبر أن Amavisd-new SMTP يستمع: telnet localhost 10024 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 [127.0.0.1] ESMTP amavisd-new service ready ^] وفي ترويسة (header) الرسائل التي تُمرَّر عبر مُرشِّح المحتوى، يجب أن تُشاهِد: X-Spam-Level: X-Virus-Scanned: Debian amavisd-new at example.com X-Spam-Status: No, hits=-2.3 tagged_above=-1000.0 required=5.0 tests=AWL, BAYES_00 X-Spam-Level: ملاحظة: قد تختلف النتائج المعروضة عمَّا سيظهر عندك، لكن من المهم وجود القيدين X-Virus-Scanned و X-Spam-Status. استكشاف الأخطاء أفضل طريقة لمعرفة سبب حدوث مشكلة ما هي مراجعة ملفات السجل. لتعليماتٍ عن التسجيل في Postfix راجع الدرس الخاص به. يستخدم Amavisd-new البرمجية Syslog لإرسال الرسائل إلى /var/log/mail.log؛ يمكن زيادة مقدار التفاصيل بإضافة الخيار $log_level إلى ملف /etc/amavis/conf.d/50-user، وضبط القيمة من 1 إلى 5: $log_level = 2; ملاحظة: عند زيادة درجة الإسهاب لسجل Amavisd-new، فسيزداد ناتج سجل Spamassassin أيضًا. يمكن زيادة مستوى التسجيل لبرمجية ClamAV بتعديل الملف /etc/clamav/clamd.conf وضبط الخيار الآتي: LogVerbose true افتراضيًا، سيُرسِل ClamAV رسائل السجل إلى /var/log/clamav/clamav.log. ملاحظة: بعد تغيير إعدادات التسجيل للبرمجيات، تذكر أن تعيد تشغيل الخدمة لكي تأخذ الإعدادات الجديدة مفعولها؛ أيضًا تذكر أن تعيد القيمة الافتراضية بعد أن تحل المشكلة. مصادر للمزيد من المصادر حول ترشيح البريد، راجع الوصلات الآتية: توثيق Amavisd-new. توثيق ClamAV وويكي ClamAV. ويكي Spamassassin. صفحة Pyzor الرئيسية. صفحة Razor الرئيسية. DKIM.org Postfix Amavis New أيضًا، تستطيع أن تسأل أسئلتك في قناة #ubuntu-sever على خادوم freenode. ترجمة -وبتصرف- للمقال Ubuntu Server Guide: Mail Filtering.1 نقطة
-
Mailman هو برمجية مفتوحة المصدر لإدارة نقاشات البريد الإلكتروني وقوائم الأخبار الإلكترونية؛ وتعتمد العديد من قوائم البريد المفتوحة المصدر (بما فيها قوائم بريد أوبنتو) على Mailman كبرمجية قوائم البريد؛ حيث أنها قوية وسهلة التثبيت والإدارة. التثبيت يوفر Mailman واجهة ويب للمدراء والمستخدمين؛ مستخدمًا خادوم بريد خارجي لإرسال واستقبال الرسائل؛ حيث يعمل عملًا ممتازًا مع خواديم البريد الآتية: Postfix Exim Sendmail Qmail سنتعلم طريقة تثبيت وضبط Mailman مع خادوم ويب أباتشي ومع أحد خادومَي البريد Postfix أو Exim؛ إذا أردت استخدام Mailman مع خادوم بريد مختلف، فرجاءً عُد إلى قسم المصادر لمزيدٍ من المعلومات. ملاحظة: تحتاج إلى خادوم بريد وحيد فقط، و Postfix هو عميل نقل البريد الافتراضي في أوبنتو. Apache2 لتثبيت apache2، راجع درس إعداد خادوم أباتشي لمزيدٍ من التفاصيل. Postfix راجع درس Postfix لتعليمات عن تثبيت وضبط Postfix. Exim4 لتثبيت Exim4، راجع الدرس الذي شرحنا ذلك فيه. تُخزَّن ملفات الضبط في مجلد /etc/exim4بعد تثبيت exim4؛ وتكون ملفات ضبط exim4 مقسمة إلى عدة ملفات مختلفة افتراضيًا في أوبنتو؛ يمكنك تغيير هذا السلوك بتعديل قيمة المتغير الآتي في ملف /etc/exim4 /update-exim4.conf: dc_use_split_config='true' Mailman نفِّذ الأمر الآتي في الطرفية لتثبيت Mailman: sudo apt-get install mailman تنسخ هذه الحزمة ملفات التثبيت إلى مجلد /var/lib/mailman، وتثبت سكربتات CGI في /usr/lib/cgi-bin/mailman؛ وستُنشِئ مستخدم لينُكس المسمى list، وكذلك تُنشِئ المجموعة list؛ ستُملَك عملية mailman لهذا المستخدم. الضبط يفترض هذا القسم أنك ثبتت mailman و apache2 و postfix أو exim4 بنجاح؛ كل ما بقي عليك هو ضبطهم. Apache2 مثالٌ عن ملف ضبط أباتشي يأتي مع Mailman وهو موجود في /etc/mailman/apache.conf، ولكي يستخدم أباتشي ملف الضبط هذا، فيجب أن يُنسَخ إلى /etc/apache2/sites-available: sudo cp /etc/mailman/apache.conf /etc/apache2/sites-available/mailman.conf هذا سيُنشِئ مضيفًا وهميًا في أباتشي لموقع إدارة Mailman؛ فعِّل الآن الضبط الجديد وأعد تشغيل أباتشي: sudo a2ensite mailman.conf sudo service apache2 restart يستخدم Mailman أباتشي ليشغِّل سكربتات CGI؛ تكون سكربتات CGI مثبتةً في /usr/lib/cgi-bin/mailman، هذا يعني أن وصلة mailman ستكون http://hostname/cgi-bin/mailman؛ يمكنك إجراء تعديلات إلى ملف /etc/apache2/sites-available/mailman.conf لتعديل هذا السلوك. Postfix سنربط النطاق lists.example.com مع القائمة البريدية للدمج مع Postfix؛ رجاءً استبدل lists.example.com بالنطاق الذي تختاره. يمكنك استخدام الأمر postconf لإضافة الضبط الضروري إلى ملف /etc/postfix/main.cf: sudo postconf -e 'relay_domains = lists.example.com' sudo postconf -e 'transport_maps = hash:/etc/postfix/transport' sudo postconf -e 'mailman_destination_recipient_limit = 1' انظر أيضًا في /etc/postfix/master.cf للتحقق من أن لديك «الناقل» (transporter) الآتي: mailman unix - n n - - pipe flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user} هذا سيستدعي السكربت postfix-to-mailman.py عندما يُسلَّم بريدٌ ما إلى القائمة. اربط بين النطاق lists.example.com إلى ناقل Mailman باستخدام خريطة الربط (transport map)، وعدِّل الملف /etc/postfix/transport: lists.example.com mailman: عليك الآن جعل Postfix يبني خريطة الربط بإدخال الأمر الآتي في الطرفية: sudo postmap -v /etc/postfix/transport ثم أعد تشغيل Postfix لتفعيل الضبط الجديد: sudo service postfix restart Exim4 تستطيع تشغيل خادوم Exim بإدخال الأمر الآتي في الطرفية بعد تثبيت Exim4: sudo service exim4 start ولجعل mailman يعمل مع Exim4، فيجب عليك أن تضبط Exim4؛ وكما ذُكِرَ سابقًا، يستخدم Exim4 افتراضيًا عدِّة ملفات ضبط للأنواع المختلفة؛ لمزيد من التفاصيل، ارجع إلى موقع ويب Exim. يجب عليك إضافة ملف ضبط جديد يحتوي على أنواع الضبط الآتية لتشغيل mailman: Main (الرئيسي). Transport (النقل). Router (الموجه). يُنشِئ Exim ملف ضبط رئيسي بترتيب كل ملفات الضبط الصغيرة هذه؛ ولذلك ترتيب هذه الملفات أمرٌ ضروريٌ جدًا. الرئيسي جميع ملفات الضبط التي تنتمي إلى النوع الرئيسي (Main) يجب أن تُخزَّن في مجلد /etc/exim4/conf.d/main/، يمكنك إضافة المحتويات الآتية في ملف جديد مُسمى 04_exim4-config_mailman: # start # Home dir for your Mailman installation -- aka Mailman's prefix # directory. # On Ubuntu this should be "/var/lib/mailman" # This is normally the same as ~mailman MM_HOME=/var/lib/mailman # # User and group for Mailman, should match your --with-mail-gid # switch to Mailman's configure script. Value is normally "mailman" MM_UID=list MM_GID=list # # Domains that your lists are in - colon separated list # you may wish to add these into local_domains as well domainlist mm_domains=hostname.com # # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= # # These values are derived from the ones above and should not need # editing unless you have munged your mailman installation # # The path of the Mailman mail wrapper script MM_WRAP=MM_HOME/mail/mailman # # The path of the list config file (used as a required file when # verifying list addresses) MM_LISTCHK=MM_HOME/lists/${lc::$local_part}/config.pck # end النقل جميع الملفات التي تنتمي إلى نوع النقل (transport) يجب أن تُخزَّن في مجلد /etc/exim4/conf.d/transport/؛ تستطيع إضافة المحتويات الآتية إلى ملف جديد باسم 40_exim4-config_mailman: mailman_transport: driver = pipe command = MM_WRAP \ '${if def:local_part_suffix \ {${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} \ {post}}' \ $local_part current_directory = MM_HOME home_directory = MM_HOME user = MM_UID group = MM_GID الموجه جميع الملفات التي تنتمي إلى نوع الموجه (router) يجب أن تُخزَّن في مجلد /etc/exim4/conf.d/router/؛ تستطيع إضافة المحتويات الآتية إلى ملف جديد باسم 101_exim4-config_mailman: mailman_router: driver = accept require_files = MM_HOME/lists/$local_part/config.pck local_part_suffix_optional local_part_suffix = -bounces : -bounces+* : \ -confirm+* : -join : -leave : \ -owner : -request : -admin transport = mailman_transport تحذير: ترتيب ملفات الضبط «الرئيسي» و«النقل» غير مهم، لكن ترتيب ملفات ضبط التوجيه مهم؛ حيث يجب أن يظهر هذا الملف قبل ملف 200_exim4-config_primary؛ هذان الملفان يحتويان على نفس نوع المعلومات، وتكون الأولوية للذي يأتي أولًا. Mailman بعد تثبيت mailman، تستطيع تشغيله بالأمر الآتي: sudo service mailman start عليك الآن إنشاء قائمة بريدية افتراضية؛ وذلك بتنفيذ ما يلي: sudo /usr/sbin/newlist mailman Enter the email address of the person running the list: bhuvan at ubuntu.com Initial mailman password: To finish creating your mailing list, you must edit your /etc/aliases (or equivalent) file by adding the following lines, and possibly running the `newaliases' program: ## mailman mailing list mailman: "|/var/lib/mailman/mail/mailman post mailman" mailman-admin: "|/var/lib/mailman/mail/mailman admin mailman" mailman-bounces: "|/var/lib/mailman/mail/mailman bounces mailman" mailman-confirm: "|/var/lib/mailman/mail/mailman confirm mailman" mailman-join: "|/var/lib/mailman/mail/mailman join mailman" mailman-leave: "|/var/lib/mailman/mail/mailman leave mailman" mailman-owner: "|/var/lib/mailman/mail/mailman owner mailman" mailman-request: "|/var/lib/mailman/mail/mailman request mailman" mailman-subscribe: "|/var/lib/mailman/mail/mailman subscribe mailman" mailman-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe mailman" Hit enter to notify mailman owner... # لقد ضبطنا إما Postfix أو Exim4 للتعرف على كل البريد من mailman؛ لذلك ليس ضروريًا إنشاء أيّة قيود جديدة في /etc/aliases؛ إذا أجريت أيّة تعديلات إلى ملفات الضبط، فرجاءً تأكد أنك أعدت تشغيل هذه الخدمات قبل الإكمال إلى القسم الآتي. ملاحظة: لا يَستخدِم Exim4 الأسماء البديلة في الأعلى لتمرير البريد إلى Mailman، حيث أنه يستخدم طريقة «الاكتشاف»؛ لتجاهل الأسماء البديلة (aliases) عند إنشاء القائمة، فأضف السطر MTA=None إلى ملف ضبط Mailman، الذي هو /etc/mailman/mm_cfg.py. الإدارة لنفرض أن لديك تثبيتًا افتراضيًا وأنَّك أبقيت على سكربتات CGI في المجلد /usr/lib/cgi-bin/mailman/. يوفر Mailman أداة ويب للإدارة؛ وجِّه متصفحك إلى العنوان الآتي للوصول إليها: http://hostname/cgi-bin/mailman/admin ستظهر القائمة البريدية الافتراضية على الشاشة وهي mailman؛ إذا ضغطت على اسم القائمة البريدية، فستُسأل عن كلمة المرور للاستيثاق؛ إذا أدخلت كلمة مرور صحيحة، فستكون قادرًا على تغيير الإعدادات الإدارة للقائمة البريدية؛ يمكنك إنشاء قائمة بريدية جديدة باستخدام الأداة السطرية /usr/sbin/newlist؛ أو بشكل بديل يمكنك إنشاؤها عبر واجهة الويب. المستخدمون يوفر Mailman واجهة ويب للمستخدمين، وجِّه متصفحك نحو العنوان الآتي للوصول لتلك الصفحة: http://hostname/cgi-bin/mailman/listinfo ستظهر القائمة البريدية الافتراضية mailman على الشاشة؛ وإذا ضغطت على اسم القائمة البريدية، فسيظهر نموذج للاشتراك فيها؛ يمكنك إدخال بريدك الإلكتروني واسمك (اختياري) وكلمة المرور للاشتراك؛ سيُرسَل بريد للدعوة إلى بريدك الإلكتروني، ويمكنك اتباع التعليمات في البريد للاشتراك. مصادر دليل تثبيت GNU Mainman. HOWTO – Using Exim 4 and Mailman 2.1 together. راجع أيضًا صفحة ويكي أوبنتو «Mailman».1 نقطة
-
Dovecot هو عميل تسليم البريد، مكتوبٌ مع اعتبار الحماية من الأولويات؛ ويدعم صيغتي صندوق البريد الرئيسيتين: mbox أو Maildir؛ يشرح هذا القسم كيفية ضبطه كخادوم imap أو pop3. التثبيت نفِّذ الأمر الآتي في الطرفية لتثبيت dovecot: sudo apt-get install dovecot-imapd dovecot-pop3d الضبط عدِّل الملف /etc/dovecot/dovecot.confلضبط dovecot، يمكنك اختيار البروتوكول الذي تريد استخدامه، حيث يمكن أن يكون pop3 أو pop3s (أي pop3 الآمن)، أو imap، أو imaps (أي imap الآمن)؛ شرح عن هذه البروتوكولات خارج عن نطاق هذا الدرس، للمزيد من المعلومات راجع مقالات ويكيبيديا عنهم: POP3 ،IMAP. بروتوكولَي IMAPS و POP3S أكثر أمانًا من بروتوكولَي IMAP و POP3 لأنهما يستخدمان تشفير SSL للاتصال؛ بعد أن تختار البروتوكول، فعليك تعديل السطر الآتي في الملف /etc/dovecot/dovecot.conf: protocols = pop3 pop3s imap imaps ثم اختر صندوق البريد الذي تريد استخدامه، حيث يدعم Dovecot الصيغتين maildir و mbox؛ هاتان هما أشهر صيغتين مستعملتين للبريد؛ يملك كلاهما مزايا خاصةً به، ومشروحةً في موقع Dovecot. بعد أن تختار نوع صندوق البريد، عدِّل الملف /etc/dovecot/conf.d/10-mail.confوغيِّر السطر الآتي: mail_location = maildir:~/Maildir # (for maildir) أو mail_location = mbox:~/mail:INBOX=/var/spool/mail/%u # (for mbox) ملاحظة: يجب عليك ضبط عميل نقل البريد (MTA) لنقل البريد الوارد إلى هذا النوع من صندوق البريد إذا كان مختلفًا عمَّا ضبطته. بعد الانتهاء من ضبط dovecot، يجب عليك إعادة تشغيل عفريت dovecot لتجرِّب عمل الخادوم: sudo service dovecot restart إذا فعَّلت imap، أو pop3؛ فيجب عليك أيضًا تجربة تسجيل الدخول باستخدام الأوامر telnet localhost pop3 أو telnet localhost imap2؛ لترى إن شاهدت شيئًا شبيهًا بما يلي، فستعلم أن التثبيت والإعداد قد نجحا: user@localbox:~$ telnet localhost pop3 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. +OK Dovecot ready. ضبط Dovecot SSL لضبط Dovecot ليستخدم SSL، تستطيع أن تحرِّر الملف /etc/dovecot/conf.d/10-ssl.conf وتُعدِّل الأسطر الآتية: ssl = yes ssl_cert = </etc/ssl/certs/dovecot.pem ssl_key = </etc/ssl/private/dovecot.pem يمكنك الحصول على شهادة SSL من سلطة إصدار الشهادات أو إنشاء شهادة SSL موقعة ذاتيًا؛ الخيار الأخير هو خيار جيد للبريد الإلكتروني، ﻷن عملاء SMTP نادرًا ما يشتكون حول الشهادات الموقعة ذاتيًا؛ رجاءً عُد إلى درس الشهادات لمزيدٍ من المعلومات حول إنشاء شهادة SSL موقعة ذاتيًا؛ يجب عليك الحصول على ملف مفتاح وملف الشهادة بعد إنشائك للشهادة؛ رجاءً انسخهما إلى المكان المُشار إليه في ملف الضبط /etc/dovecot/conf.d/10-ssl.conf. ضبط الجدار الناري لخادوم البريد الإلكتروني عليك ضبط الجدار الناري للسماح للاتصالات على المنافذ الضرورية للوصول إلى خادوم البريد من حاسوبٍ آخر، وهي: IMAP – 143 IMAPs – 993 POP3 – 110 POP3s – 995 مصادر راجع موقع Dovecot لمزيدٍ من المعلومات. أيضًا صفحة ويكي أوبنتو «Dovecot» فيها تفاصيلٌ إضافية. ترجمة -وبتصرف- للمقال Ubuntu Server Guide: DOvecot Server.1 نقطة
-
تشترك العديد من الأنظمة في عملية الحصول على بريد إلكتروني من شخصٍ لآخر عبر الشبكة أو الإنترنت التي تعمل مع بعضها بعضًا؛ ويجب أن يُضبَط كل واحد من هذه الأنظمة ضبطًا صحيحًا لكي تتم العملية بنجاح؛ يستخدم المُرسِل «عميل مستخدم البريد» (Mail User Agent اختصارًا MUA) أو عميل بريد إلكتروني، لإرسال رسالة عبر واحد أو أكثر من «عملاء نقل البريد» (Mail Transfer Agents اختصارًا MTA)، سيسلم آخرهم البريد إلى «عميل إيصال البريد» (Mail Delivery Agent اختصارًا MDA) لإيصال البريد إلى صندوق بريد المستلم، الذي بدوره يحصل عليه عميل البريد الإلكتروني للمستلم عادةً باستخدام خادوم POP3 أو IMAP. Postfixإن Postfix هو عميل نقل البريد (MTA) الافتراضي في أوبنتو؛ الذي يُوصَف بأنه سريع وسهل الإدارة، وآمن ومتوافق مع عميل نقل البريد sendmail؛ يشرح هذا القسم طريقة تثبيت وضبط Postfix، ويشرح أيضًا كيفية إعداد خادوم SMTP باستخدام اتصال آمن (لإرسال رسائل البريد الإلكتروني بأمان). ملاحظة: لن نتطرّق إلى «Postfix Virtual Domains» للمزيد من المعلومات حول النطاقات الوهمية وغيرها من إعدادات الضبط المتقدمة، فراجع قسم «مصادر» في نهاية هذا القسم. التثبيتنفِّذ الأمر الآتي في الطرفية لتثبيت postfix: sudo apt-get install postfixستُسأل بعض الأسئلة أثناء عملية التثبيت، وسيُشرَح الضبط بتفاصيل أكبر في المرحلة القادمة. الضبط الأساسينفِّذ الأمر الآتي في الطرفية لضبط postfix: sudo dpkg-reconfigure postfixستظهر واجهة مستخدم، اختر منها القيم الآتية على كل شاشة: Internet Sitemail.example.comstevemail.example.com, localhost.localdomail, localhostNo127.0.0.1/8 8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/240+allملاحظة: استبدل mail.example.com بالنطاق الذي سيقبل استلام البريد عليه، و 192.168.0.0/24 بالشبكة التي عندك ومجالها؛ و steve باسم ملائم للمستخدم. الآن هو وقتٌ ملائمٌ لتحديد صيغة صندوق البريد التي تنوي استخدامها؛ افتراضيًا Postfix يستخدم mbox لصيغة صندوق البريد؛ وبدلًا من تعديل ملف الضبط مباشرةً، يمكنك استخدام الأمر postconf لضبط كل معاملات postfix؛ ستُخزَّن معاملات الضبط في ملف /etc/postfix/main.cf؛ وإذا أردت إعادة ضبط معامل معيَّن، يمكنك إما أن تنفذ الأمر أو تعدل الملف يدويًا؛ فلضبط صيغة صندوق البريد إلى Maildir: sudo postconf -e 'home_mailbox = Maildir/'ملاحظة: هذا سيضع البريد الجديد في مجلد /home/username/Maildir، لذلك تريد ضبط عميل تسليم البريد (MDA) لاستخدام نفس المسار. استيثاق SMTPيسمح SMTP-AUTH للعميل بالتعريف عن نفسه باستخدام آلية استيثاق (SASL)، يجب استخدام أمن طبقة النقل (TLS) لتشفير عملية الاستيثاق؛ سيسمح خادوم SMTP للعميل بأن ينقل البريد بعد الاستيثاق. لضبط Postfix مع SMTP-AUTH باستخدام SASL (Dovecot SASL): sudo postconf -e 'smtpd_sasl_type = dovecot' sudo postconf -e 'smtpd_sasl_path = private/auth-client' sudo postconf -e 'smtpd_sasl_local_domain =' sudo postconf -e 'smtpd_sasl_security_options = noanonymous' sudo postconf -e 'broken_sasl_auth_clients = yes' sudo postconf -e 'smtpd_sasl_auth_enable = yes' sudo postconf -e 'smtpd_recipient_restrictions = \ permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination'ملاحظة: الضبط smtpd_sasl_path هو مسار نسبي إلى مجلد طلبيات Postfix. ثم ولِّد أو احصل على شهادة TLS رقمية، راجع درس الشهادات للتفاصيل؛ هذا المثال يستخدم أيضًا سلطة شهادات (Certificate Authority أو CA)، للمزيد من المعلومات حول ذلك، انظر إلى قسم «سلطة الشهادات» في نفس الدرس. ملاحظة: عملاء مستخدمي البريد (MUA) التي تتصل إلى خادوم البريد عبر TLS يجب أن تتعرف على الشهادة المستخدمة في TLS؛ يمكن فعل ذلك إما باستخدام شهادة من سلطة شهادات تجارية، أو استخدام شهادة موقعة ذاتيًا، وعلى المستخدمين أن يُثبِّتوا أو يقبلوا الشهادة يدويًا، شهادات TLS من عميل نقل بريد إلى عميل نقل بريد آخر لا يُتحقَّق منها إلا بعد موافقة مسبقة من المنظمات المتأثرة؛ لا يوجد سبب لعدم استخدام شهادة موقعة ذاتيًا عند استعمال TLS من MTA إلى MTA، ما لم تتطلب السياسات المحلية ذلك؛ راجع قسم «إنشاء شهادة موقعة ذاتيا» لمزيدٍ من المعلومات في درس الشهادات. بعد أن تحصل على الشهادة، اضبط Postfix لتوفير تشفير TLS للبريد المُرسَل والمُستلَم: sudo postconf -e 'smtp_tls_security_level = may' sudo postconf -e 'smtpd_tls_security_level = may' sudo postconf -e 'smtp_tls_note_starttls_offer = yes' sudo postconf -e 'smtpd_tls_key_file = /etc/ssl/private/server.key' sudo postconf -e 'smtpd_tls_cert_file = /etc/ssl/certs/server.crt' sudo postconf -e 'smtpd_tls_loglevel = 1' sudo postconf -e 'smtpd_tls_received_header = yes' sudo postconf -e 'myhostname = mail.example.com'إذا كنت تستخدم سلطة الشهادات الخاصة بك لتوقيع الشهادة، فأدخِل: sudo postconf -e 'smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem'ملاحظة: بعد تنفيذ كل الأوامر السابقة، فيكون Postfix قد ضُبِطَ ليستخدم SMTP-AUTH وشهادة موقعة ذاتيًا أُنشِئت لاتصال TLS مشفر. # See /usr/share/postfix/main.cf.dist for a commented, more complete # version smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h myhostname = server1.example.com alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = server1.example.com, localhost.example.com, localhost relayhost = mynetworks = 127.0.0.0/8 mailbox_command = procmail -a "$EXTENSION" mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all smtpd_sasl_local_domain = smtpd_sasl_auth_enable = yes smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject _unauth_destination smtpd_tls_auth_only = no smtp_tls_security_level = may smtpd_tls_security_level = may smtp_tls_note_starttls_offer = yes smtpd_tls_key_file = /etc/ssl/private/smtpd.key smtpd_tls_cert_file = /etc/ssl/certs/smtpd.crt smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem smtpd_tls_loglevel = 1 smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s tls_random_source = dev:/dev/urandomبعد إكمال الضبط الابتدائي لخدمة postfix؛ فنفذ الأمر الآتي لإعادة تشغيل العفريت: sudo service postfix restartيدعم Postfix استخدام SMTP-AUTH كما هو معرَّف في RFC2554؛ الذي هو مبني على SASL؛ لكنه يبقى ضروريًا إعداد استيثاق SASL قبل استخدام SMTP-AUTH. ضبط SASLيدعم Postfix نسختين من SASL هما Cyrus SASL و Dovecot SASL؛ لتفعيل Dovecot SASL، فيجب تثبيت حزمة dovecot-common، وذلك بإدخال الأمر الآتي من الطرفية: sudo apt-get install dovecot-commonيجب عليك تعديل ملف الضبط /etc/dovecot/conf.d/10-master.conf؛ مغيِّرًا ما يلي: service auth { # auth_socket_path points to this userdb socket by default. It's typically # used by dovecot-lda, doveadm, possibly imap process, etc. Its default # permissions make it readable only by root, but you may need to relax these # permissions. Users that have access to this socket are able to get a list # of all usernames and get results of everyone's userdb lookups. unix_listener auth-userdb { #mode = 0600 #user = #group = } # Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix }ولكي نسمح لعملاء Outlook باستخدام SMTP-AUTH، فعدِّل السطر الآتي في قسم authentication mechanisms في ملف /etc/dovecot/conf.d/10-auth.conf: auth_mechanisms = plainإلى ما يلي: auth_mechanisms = plain loginبعد أن ضَبَطَتَ Dovecot، فأعد تشغيله بالأمر: sudo service dovecot restartMail-Stack Deliveryخيار آخر لضبط Postfix لاستعمال SMTP-AUTH هو استخدام الحزمة mail-stack-delivery (كانت تُحزَّم مسبقًا باسم dovecot-postfix)؛ هذه الحزمة ستُثبِّت Dovecot وتضبط Postfix ليستخدمها لاستيثاق SASL وعميل تسليم البريد (MDA)؛ تضبط هذه الحزمة Dovecot أيضًا للخدمات IMAP و IMAPS و POP3 و POP3S. ملاحظة: ربما تريد أو لا تريد تشغيل IMAP، أو IMAPS، أو POP3، أو POP3S على خادوم البريد عندك؛ على سبيل المثال، إذا كنت تضبط خادومك ليكون بوابةً للبريد، أو مُرَشِّحًا للرسائل العشوائية (Spam) أو الفيروسات ...إلخ. فإذا كانت هذه هي الحالة عندك، فمن الأسهل استخدام الأوامر السابقة لضبط Postfix لاستخدام SMTP-AUTH. لتثبيت الحزمة، أدخِل ما يلي في الطرفية: sudo apt-get install mail-stack-deliveryيجب أن تحصل الآن على خادوم بريد يعمل تمامًا؛ لكن هنالك بعض الخيارات التي تريد ضبطها لمزيدٍ من التخصيص؛ على سبيل المثال، تستخدم الحزمة السابقة شهادة ومفتاح من حزمة ssl-cert، وفي بيئة إنتاجية يجب أن تستخدم شهادة ومفتاح مولَّد للمضيف. عدِّل الخيارات الآتية في ملف /etc/postfix/main.cf بعد أن تخصص الشهادة والمفتاح للمضيف: smtpd_tls_cert_file = /etc/ssl/certs/ssl-mail.pem smtpd_tls_key_file = /etc/ssl/private/ssl-mail.keyثم أعد تشغيل Postfix: sudo service postfix restartالاختباراكتمل الآن ضبط SMTP-AUTH؛ حان الآن الوقت لاختبار الإعدادات. للتأكد إذا كان SMTP-AUTH و TLS يعملان عملًا صحيحًا، فنفِّذ الأمر الآتي: telnet mail.example.com 25بعد أن تُنشِئ اتصالًا لخادوم البريد postfix، اكتب ما يلي: ehlo mail.example.comإذا رأيت الأسطر الآتية بين غيرها، فإن كل شيء يعمل على ما يرام؛ اكتب quit للخروج. 250-STARTTLS 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN 250 8BITMIMEاستكشاف الأخطاء وإصلاحهاسنقدم في هذا القسم بعض الطرق الشائعة لتحديد السبب إذا حدثت مشكلة ما. الخروج من chrootستُثبَّت الحزمة postfix في أوبنتو افتراضيًا في بيئة «chroot» لأسبابٍ أمنية؛ يمكن أن يزيد هذا من تعقيد إصلاح المشاكل. لتعطيل عمل chroot، حدد السطر الآتي في ملف /etc/postfix/master.cf: smtp inet n - - - - smtpdوعدِّله كما يلي: smtp inet n - n - - smtpdتحتاج إلى إعادة تشغيل Postfix لاستخدام الضبط الجديد، وذلك بإدخال الأمر الآتي في الطرفية: sudo service postfix restartSmtpsإذا احتجت إلى smtps، فعدِّل الملف /etc/postfix/master.cf وأزل التعليق عن السطر الآتي: smtps inet n - - - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATINGملفات السجليُرسِل Postfix جميع رسائل السجل إلى ملف /var/log/mail.log، لكن يمكن أن تضيع رسائل الخطأ والتحذير في السجل العادي، لذلك فإنها تُسجَّل أيضًا إلى /var/log/mail.err و /var/log/mail.warn على التوالي وبالترتيب. لمراقبة الرسائل الداخلة إلى السجل في الوقت الحقيقي، فاستخدم الأمر tail مع الخيار -f كما يلي: tail -f /var/log/mail.errيمكن زيادة كمية التفاصيل التي ستُسجَّل؛ هذه بعض خيارات الضبط لزيادة مستوى التسجيل لبعض «المناطق» المذكورة أعلاه. لزيادة نشاط تسجيل TLS، فاضبط الخيار smtpd_tls_loglevel إلى قيمة من 1 إلى 4: sudo postconf -e 'smtpd_tls_loglevel = 4'إذا كانت لديك مشكلة في إرسال أو استقبل البريد من نطاق معين، فيمكنك إضافة ذاك النطاق إلى معامل debug_peer_list: sudo postconf -e 'debug_peer_list = problem.domain'يمكنك زيادة درجة الإسهاب لأي عملية تابعة لعفريت Postfix بتعديل الملف /etc/postfix/master.cf وبإضافة الخيار -v بعد القيد، على سبيل المثال، عدِّل القيد smtp كما يلي: smtp unix - - - - - smtp -vملاحظة: من الضروري ملاحظة أنه بعد إنشاء تعديل من تعديلات التسجيل المذكورة آنفًا، فيجب أن يعاد تحميل عملية Postfix لكي تُدرِك الضبط الجديد: sudo service postfix reloadلزيادة مقدار المعلومات المسجلة عند استكشاف مشاكل SASL، يمكنك ضبط الخيارات الآتية في ملف /etc/dovecot/conf.d/10-logging.conf: auth_debug=yes auth_debug_passwords=yesملاحظة: مثل Postfix، إذا عدَّلت ضبط Dovecot فيجب إعادة تحميل العملية: sudo service dovecot reloadملاحظة: يمكن أن تزيد بعض الخيارات من مقدار المعلومات المُرسَلة إلى السجل زيادةً كبيرةً؛ تذكر أن تُعيد مستوى التسجيل إلى الحالة الطبيعية بعد أن تحلّ المشكلة؛ ثم أعد تحميل العفريت الملائم كي يأخذ الضبط الجديد مفعوله. مصادريمكن أن تكون مهمة إدارة خادوم Postfix مهمةً معقدةً جدًا؛ وستحتاج في مرحلةٍ ما إلى الاستعانة بمجتمع أوبنتو للحصول على المساعدة. مكان رائع للسؤال عن مساعدة في Postfix والاشتراك في مجتمع أوبنتو هو قناة #ubuntu-server على خادوم freenode؛ يمكنك أيضًا نشر موضوع في أحد المنتديات.لمعلومات معمقّة عن Postfix، فينصح مطورو أوبنتو بكتاب «The Book of Postfix».موقع Postfix فيه توثيق رائع لمختلف خيارات الضبط المتوفرة.راجع أيضًا صفحة ويكي أوبنتو «Postfix» للمزيد من المعلومات.ترجمة -وبتصرف- للمقال Ubuntu Server Guide: Postfix. حقوق الصورة البارزة: Designed by Freepik.1 نقطة