المحتوى عن 'أتمتة'.



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

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

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

نوع المُحتوى


التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

أسئلة وأجوبة

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

التصنيفات

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

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

  1. مُراجعة وتحسين إعدادات خدمة الدّعم الفنّي فرصةٌ نادرة لتنظيم عمليّات الدّعم الفنّي وتخليص الفريق من العادات والعناصر غير المرغوبة التي تتراكم كما يتراكم الغبار في منفذ شحن الموبايل. إنّ هدفك الرّئيسي هو تقديم الدّعم المستمر طوال الوقت، لكن إذا توقّفت عند هذه المرحلة، فقد تضيّع فرصة تحسين مستوى الخدمة التي تقدّمها. والخطوة الأولى في تحسين تطبيق الدّعم الفنّي هي وضع بعض الأهداف، سواء كنت قد اخترت للتّو تطبيق دعمٍ فنّي جديد، أو إذا قرّرت أنّ الوقت قد حان لمُراجعة الإعدادات الحاليّة مرّةً أخرى. كيف تخطّط إعدادات الدّعم الفنّي 1. قلّل الاحتكاكات friction بالنّسبة للعملاء لا يجب أن يكون العملاء خبراء في آلية عمل تطبيق الدّعم الفنّي التي تستخدمه ليحصلوا على الدّعم. كلّما كانت تجربة وصولهم إلى إجراء محادثةٍ مع شخصٍ آخر أقرب، كلّما كان ذلك أفضل. وقد ينطوي ذلك على إعادة كتابة الرّسائل الإلكترونيّة والقوالب الافتراضيّة لتستخدم نبرتك، وإزالة أرقام التّذاكر وهويّة العميل إذا لم تكن بحاجةٍ إليها، وتبسيط أيّ شكلٍ من أشكال الدّعم أو نقاط الدّخول للسّؤال فقط عمّا يساعد حقًّا في حلّ مشاكل العملاء. 2. قلّل الاحتكاكات بالنّسبة لفريق الدّعم الفنّي إنّ كلّ مهمّةٍ زائدة، ونقرةٍ إضافيّة، وعمليّةٍ جديدة تضيفها إلى دور فريق الدّعم الفنّي تستغرق وقتًا يضيع من مساعدة العملاء بشكلٍ فعّال. قم بترتيب خدمة الدّعم الفنّي بحيث يتمّ الحفاظ على أكبر قدرٍ ممكن من الوقت والطّاقة لمساعدة العملاء. 3. قلّل من تكرار العمل يستهدف التّحسين أيّ شيءٍ تجد أنّك تعمله أنت أو فريقك مرارًا وتكرارًا. هل يمكنك أتمتة شيءٍ من آلية معالجة التّذاكر؟ هل يمكنك إضافة خطط إضافيّة لسير العمل أو ردود مكتوبة مسبقًا لمعالجة المشاكل الشّائعة؟ 4. لخّص تقاريرك يجب أن تكون لديك فكرةٌ واضحة عمّا تريد قياسه، ومن هذه النّقطة يمكنك العمل على المعلومات التي يجب عليك الحصول عليها في محادثات الدّعم الفنّي. وبوجود هذه المتطلّبات، يمكنك إعداد خدمة الدّعم الفنّي لتجمع المعلومات بأكبر قدرٍ ممكن من الانتظام والبساطة. 5. تخلّص من العناصر غير المرغوب فيها تتجمع لدى فريق الدّعم الفنّي جميع أنواع العناصر التي لم تعد هناك حاجة لها حين يكون الفريق منشغلًا. هل هنالك خطط سير العمل أو مرشحات لم تعد تستخدمها، أو ردود محفوظة قديمة أو غير دقيقة، أو حسابات لأشخاص لم يعودوا ضمن الفريق؟ يحدّ التخلّص من جميع هذه العناصر من إمكانيّة إرسال إجابةٍ خاطئة عن طريق الخطأ، ويوفّر الوقت والجّهد من خلال إظهار الخيارات والمعلومات التي يجب أن يستخدمها أفراد فريقك. القائمة المرجعيّة لإعدادات خدمة الدّعم الفنّي الدّعم الوارد راجع نماذج/صفحات طلبات الدّعم: تحقّق من الوضوح، والإيجاز والدقّة، واحرص على أنه يتم إرسال الطلبات من خلالها بشكلٍ صحيح. تحقّق من البريد الوارد: تأكّد من أنّك لا تفقد أيّ رسائل إلكترونيّة بوصولها إلى مرشحات الرّسائل المزعجة أو العناوين القديمة. راجع الإضافات integrations: قم بفحص الإضافات التي تحتاجها وإزالة الإضافات التي لم تعد تستخدمها ابحث في ملفّات المساعدة والتوثيق: يمكن أن تجد روابط إلى "اتّصل بفريق الدّعم لدينا" والتي تحتاج إلى تحديث أو تعديل لتتناسب مع إعدادات الدّعم التي تمّ تبسيطها مؤخّرًا. إدارة المحادثة أنشئ مجلّدات أو مرشحات: قم بتحديد من يجب أن يرى أيّ تذاكر، وقم بإنشاء هذه المجلّدات المرئيّة فقط. قم بتصنيفها بوضوح لئلّا يضيع فريقك الوقت في بحثا عن المُجلدات الأنسب أنشئ قوانين وخطط سير العمل: قم بأتمتة المهمّات المتكرّرة وخفّف عبء العمل عن فريق الدّعم الفنّي. راجع قوانينك الموجودة: هل هي فعّالة، وهل لا تزال مفيدة؟ قم بدمج وتصفية التّصنيفات والوسوم: عادةً ما تتضاعف الوسوم بسرعة، وغالبًا ما يكون لديك نسخ مكرّرة قريبة من بعضها يمكن دمجها مع بعضها وأخرى قديمة يمكنك إزالتها. أنقص عددها لتصل إلى الوسوم التي تحتاجها للأتمتة وكتابة التّقارير فقط. الرّسائل الصّادرة قم بتحديث قوالب البريد الإلكتروني: تحقّق من اللّغة التي تستخدمها في نبرتك ولهجتك، وقم بمراجعة الوسوم، وتحقّق من دقّة الرّوابط المتضمَّنة. لا تنس التّحقّق من التواقيع footer التي يستخدمها فريق الدّعم الفنّي في رسائلهم. حدّث ردودك المحفوظة: هل الرّدود التي تستخدمها حديثة ودقيقة؟ وهل تتوافق مع أفضل الممارسات الحاليّة لديك؟ وهل هي مصنّفة من أجل الوصول إليها بشكلٍ سهل؟ قم بتوثيق استخدامك خذ بعض الوقت الإضافي لتوثيق قراراتك بعد أن تنتهي من التّنظيف، فوجود وثائق أو ملفّات فيديو كمرجعٍ قصير أمرٌ مفيدٌ حين تقوم بتجديد فريقك الحالي وفي المرّة القادمة التي توظّف فيها أحدًا. وتتضمّن مجالات محاولة التّوثيق ما يلي ما هي التّصنيفات والوسوم التي يجب استخدامها ومتى كيف وأين تحيل المحادثات إلى أشخاص آخرين تحديد المحادثات ومعايير استخدام وإدارة الرّدود التي تمّ حفظها. إنّ مشاركة هذا التوثيق مع الفريق بأكمله يجعل الجّميع أكثر كفاءةً ويحدّ من إمكانيّات انهيار النّظام الذي نظّمته مؤخّرًا تحت كاهل الوسوم التي يتمّ استخدامها بشكلٍ خاطئ وخطط سير العمل المنهارة. عندما تكتمل الإعدادات ويعتاد فريقك على السّرعة، قم بإجراء بعض الاختبارات النّهائيّة لتتأكّد من أنّ كلّ شيءٍ يعمل كما هو متوقَّع. اختبار الإعدادات الجّديدة قم بإعداد حساب بريد إلكتروني مجّاني وأرسل أسئلة اختبار إلى فريق الدّعم الفنّي ليجيبوا عليها باستخدام الإعدادات الجّديدة. وابدأ باختبار ما يلي خطط سير العمل والأتمتات المحفَّزة triggered automation: قم بإنشاء نماذج للأسئلة التي يجب أن تستجيب لها القواعد التي سطّرتها لتتأكّد من أنّها تعمل كما هو متوقَّع. مجموعة من الأسئلة النّموذجيّة: يساعد استخدام أسئلةٍ واقعيّة في ضمان أن تكون لديك أكثر الوسوم والتّصنيفات استخدامًا مُعَدّة مسبقًا. مختلف أنواع العملاء: إذا كنت تقسّم الاستفسارات الواردة بناءً على الفئة التي ينتمي إليها العميل، قم بإنشاء نماذج لكلّ فئةٍ لتتمكّن من تأكيد ظهورها للأشخاص المناسبين. اطلب من أحد الزّملاء أن يقوم بقراءة التوثيق الدّاخلي internal documentation ويستخدمها لمعالجة بعض المحادثات الواردة للتّأكّد من أنّ التوثيق دقيق وكافٍ. وأخيرًا، قم بالرّد على الرّسائل الإلكترونيّة الواردة وراجع تجربة العملاء. هل تمّ تسليم الرّسائل الإلكترونيّة بشكلٍ صحيح، وهل تحتوي على التّفاصيل الصّحيحة؟ إنّ عمليّة تحسين خدمة الدّعم الفنّي لا تنتهي أبدًا، لكنّ التّغيير في أدوات الدّعم الفنّي فرصةٌ للحدّ من الإجراءات، والتّخلّص من بعض البيانات، ويتيح للفريق قضاء وقتٍ أقلّ في العبث بأدواتهم ووقتٍ أكثر في مساعدة العملاء. بعد أن تقوم بتحسين إعدادات الدّعم الفنّي، ضاعف تركيزك على إنشاء خدمة دعمٍ فنّي أكثر سلاسةً للعملاء من خلال تصميم صفحاتٍ أفضل للتّواصل. ترجمة -وبتصرّف- للمقال Optimizing Your Help Desk Setup لصاحبه Mathew Patterson حقوق الصورة البارزة محفوظة لـ Freepik
  2. هل أنت مدرك للخطوات التي يتخذها العميل حتى يوظفك؟ وما الذي يجمع بينكما في النهاية؟ ربما تهدر الكثير من الوقت في فعل وتوضيح نفس الأشياء مرارًا وتكرارًا لكل عميل محتمل. أعلم أنني كنت أقوم بذلك، فقد عملت مع العملاء منذ زمن طويل (حوالي 100,044 سنة انترنيتية)، لذا قررت منذ بضعة أشهر تغيير هذا الوضع وجعل أكثر من نصف عملية جلب العملاء المهتمين لتوظيفي لتنفيذ مشاريع تصميم ويب تتم بشكل آلي. أحبّ إجراء التّجارب. حيث أنني لم أرضَ أبدًا على آلية عمل أي شيء، وأحاول دومًا تغيير الأمور لمعرفة إذا كان هناك شيء ما آخر يعمل بشكل أفضل. لكن على الرغم من ذلك لم أغيّر أي شيء في عملية تأهيل العملاء منذ بدء عملي الحر. وهكذا كانت تتم العملية عادةً: يجد العميل اسمي ورابط موقعي في أسفل الموقع الذي يزوره. ينقر العميل على كلمة "تصميم" في موقعي ويشاهد معرض أعمالي. في حال أُعجب العميل بعملي فإنه يتواصل معي -أحيانًا يرسل رسالة إلكترونية قصيرة وغامضة وأحيانًا يرسل مقالة من 10 صفحات تشرح كل شيء بالتفصيل بدءً من كيف ولماذا بدأ بمشروعه التجاري انتهاءً بالحديث عن حيواناته الأليفة. أرد على رسالته عندما أجد الوقت لذلك وأطلب منه تعبئة مخطط المشروع (وهو عبارة عن وثيقة على Google Doc قمت بإنشائها خصيصًا لهذا الغرض). يراسلني العميل مجددًا بعد تعبئة المخطط ليعلمني بذلك. أراسله من جديد لاقتراح موعد محادثة على السكايب (التاريخ والوقت). ويتكرر الأمر عدة مرات لنتفق في النهاية على موعد يناسبنا سويةً. نتحدث عن المشروع على سكايب حوالي 30-40 دقيقة. ثم اكتب تقرير العمل الذي يفصلّ ثلاثة أشياء: السعر، المخرجات النهائية للعمل (ما الذي سأسلّمه له) والتوقيت. يوقع العميل عليه ويرسل لي دفعة أولى لتحديد تاريخ البدء. أرسل له قائمة بالمهام التي تحتاج إلى الإنجاز قبل أن نبدأ. نبدأ العمل على المشروع. تحتاج كل خطوة من هذه الخطوات الـ 12 إلى القليل من العمل، وبعد كتابتها كان من الواضح أنه من الممكن جعل أول 7 خطوات تتم بشكل آلي، مما يجب أن يوفر الكثير من الوقت ويعطي العميل المحتمل المعلومات التي يحتاجها بسرعة لمعرفة فيما إذا كنت ملائمًا لمشروعه. التأهيل Onboarding، تعريف موجز التأهيل Onboarding هو مصطلح مستعمل في الموارد البشرية للموظفين الجدد، واستخدم فيما بعد من قبل مستسرعي النمو Growth Hackers ومطوري التطبيقات للإشارة إلى تبني وتوجيه الزبون الجديد. تنقسم هذه العملية غالبًا إلى ثلاثة أجزاء: التجهيز، الاستيعاب، والتسريع. التجهيز هو إعطاء الأشخاص الجدد الأدوات لاستخدام ما سجلوا من أجله. لذا عندما تسجل في الانستغرام تعلّمك الشاشات القليلة الأولى كيف تستخدم التطبيق -هذه هي عملية التأهيل الخاصة بهم. وقد وثق Samuel Hulick ذلك: الاستيعاب هو مساعدة المستخدم الجدد على الشعور بأنه ينتمي إلى مجموعة الأشخاص المخلصين لذلك الشخص، الشركة أو التطبيق. وقد فعلت شركة Zappos ذلك من خلال إجراء حلقة تدريبية للموظفين الجدد عن قيم الشركة، حيث لا تعلمهم الشركة ما تقوم به فقط وإنما بما تشعر بأنه مهم أيضًا، إضافة إلى منحهم خيار في نهاية الدورة لأخذ 2000$ نقدًا ومغادرة الشركة. وكما يبدو فإن 1% فقط يغادرون. التسريع هو جعل الشخص الجديد ينضم بسرعة إلى المجتمع الحالي. وأنا أقوم بذلك في قائمتي البريدية من خلال إرسال رسالة ترحيب مخصصة جدًا. لقد استهلكت الكثير من الوقت على هذه العملية وصياغة ما يحدث عندما يشترك شخص ما في قائمتي البريدية، وصياغة رسالة الترحيب، والتي تؤتي ثمارها بشكل كبير جدًا بما يتعلق بتفاعل وبقاء المشتركين. تبدو كل تلك الأشياء في الأعلى نظرية أو حتى مُبهمة بعض الشيء، لكن في جوهرها تحاول جعل الشخص الجديد يشعر بأنه موضع ترحيب، وإعطائه الأدوات التي يحتاجها ليصل إلى ما يريد والتأكد من أنه في المكان الصحيح. إن جعل عملية التأهيل تتم بشكل آلي سيوفر الكثير من الوقت في حال تنفيذها بشكل صحيح. إضافة إلى كونها تقوي التواصل والالتزام من جانب المستخدم. عملية التأهيل الجديدة الخاصة بي هنا تجد الكيفية التي صممت بها عملية التأهيل الخاصة بي لجعلها تتم بشكل آلي ومفيد قدر الإمكان: يجد العميل اسمي ورابط موقعي في أسفل الموقع الذي يزوره. ينقر العميل على كلمة "تصميم" في موقعي ويشاهد معرض أعمالي. في حال أُعجِب العميل بعملي فإنه يُدخل اسمه وبريده الإلكتروني ويتلقى رسالة تحتوي على ملف "البدء" بصيغة PDF، ويتم إضافة معلومات العميل إلى قائمة MailChimp البريدية (مجانية) التي لا ترسل رسائل اعتيادية وإنما ترسل ملف "البدء" بشكل آلي وتُتابع فيما إذا نقر عليه العميل أو لم ينقر. يوضح ملف البدء بشكل مفصلّ أسعاري، آلية عملي، نوعية المشاريع التي أنفذها (ونوعية المشاريع التي لا أنفذها)، كما يجيب على جميع الأسلة الشائعة التي يسألها العملاء عادةً عبر البريد الإلكتروني أو الهاتف. ويتضمن الكثير من توصيات العملاء. يوجد في نهاية ملف البدء رابط لتعبئة مخطط المشروع. مخطط المشروع هو نموذج مستضاف على موقع typeform.com (مجاني) لا يحتاج إلى إعادة توليده لكل شخص جديد، ويتم تخزين إجابات العميل وإعلامي برسالة إلكترونية عند الانتهاء. عند الانتهاء من تعبئة النموذج، تظهر الشاشة الأخيرة التي تحتوي على رابط لتحديد موعد مكالمة سكايب. يوجد نموج حجز مكالمة سكايب في نظام يدعى youcanbook.me (مجاني) والذي يقوم بالمزامنة مع Google Calendar (بالتالي يُظهر فقط أوقات الفراغ في أيام محددة)، وبعد أن يختار وقت فارغ بالنسبة لي نقوم بتبادل رسائل البريد الإلكتروني للتأكيد على الموعد والتذكير. وتتم بقية الخطوات بشكل مشابه للعملية السابقة، حيث يتم إجراء المكالمة وفي حال الاتفاق أكتب تقرير العمل وأحصل على الدفعة المسبقة وأبدأ العمل. ما وجدته في الأشهر القليلة الأولى من تنفيذ الأمور على هذا النحو أن تخوفي من تأجيل العملاء المُحتملين للعمل معي بسبب عدم التواصل معي بشكل فعلي منذ البداية لم يكن في مكانه. حيث سألت كل شخص أتمَّ العملية "هل استمتعت بهذه العملية؟ وهل كان كل شيء على ما يرام على الرغم من أننا لم نتواصل بشكل شخصي حتى المكالمة؟" وكان الجميع سعيدين تمامًا ﻷن العملية كانت سريعة وأجابت على أسئلتهم، وشعروا بالراحة حقًا. ومن أصل ستة أشخاص قاموا بالعملية الجديدة، وظّفني 5 أشخاص لتنفيذ مشاريعهم أما الشخص السادس لم ينتبه إلى أنني غير متاح للعمل لمدة أربع أشهر ولا يستطيع الانتظار كل هذا الوقت. بالنسبة لهؤلاء الأشخاص الستة، فقد وفّرت ساعات من الوقت ﻷنه لم يكن علي الرد على أسئلة أجبت عليها مئات المرات من قبل أو الدخول في حفلة تبادل الرسائل الإلكترونية لتحديد موعد مكالمة السكايب. إن عملية استيعاب الناس بشكل آلي تسمح لهم بالحصول على المعلومات التي يحتاجونها عن عملي التجاري في الوقت الذي يناسبهم. وأنا أقوم بهذه العملية من خلال الإجابة على كل الأسئلة الشائعة التي سبق وأن طُرحت عليّ عن طريق "ملف البدء" المفيد (والمصمم بشكل جيد). وأسرّع العملية عن طريق استخدام أدوات مجانية تسمح للعميل بالانتقال من مرحلة الاطلاع إلى إجراء مكالمة تأكيد المبيع خلال دقائق قليلة (والتي لا تتطلب أي عمل يدوي من طرفي). ترجمة وبتصرف للمقال User onboarding: not just for HR and growth hackers لصاحبه Paul jarvis.
  3. يهدف المسوّقون في عصر التّسويق باستخدام البريد الإلكتروني إلى تقديم ما يريده المشتركون بالضّبط. وتمهّد التكنولوجيا الطّريق لذلك، حيث تسمح أتمتة البريد الإلكتروني وتخصيصه للمسوّقين بإنشاء حملات ملفتة للانتباه تجذب المشتركين. لقد أصبحت الدّورات التعليمية عبر البريد الإلكتروني تلاقي رواجًا، وخاصّةً بالنّسبة للشّركات التي تقدّم خدماتها لشركات أخرى (B2B) التي يجب عليها تثقيف متابعيها حتى تتمكّن من بيع منتجاتها لهم. وفي هذه الدّورات، يقوم المشتركون بالتّسجيل ليستلموا رسائل بريديّة يوميّة، أو أسبوعيّة، أو شهريّة تهدف إلى تثقيفهم حول موضوعٍ ما. وهي أشبه بسلسلة تدوينات مصمّمة بشكلٍ خاص وتصل مباشرةً إلى صندوق بريدهم الإلكتروني. تشجّع الدّورات عبر البريد الإلكتروني على التّفاعل، كما أنّها تساعد في التعرّف جيدًا على علامتك التّجاريّة. كيف يمكنك كمسوّق أن تستخدم الدّورات التعليمية عبر البريد الإلكتروني؟ سوف نستعرض خمسة أشياء عليك معرفتها عند إنشاء سلسلة آليّة من الدّروس عبر البريد الإلكتروني. ما هو مبدأ عمل سلاسل دروس البريد الإلكتروني الآلية؟ تعتمد سلسلة البريد الإلكتروني الآليّة على الأتمتة، حيث يقوم المشترك بالتّسجيل في الدّورة، ومن ثمّ يتلقّى رسائل إلكترونية بشكلٍ منتظم. ويمكنك بهذه الطّريقة أن توصل المحتوى إلى المشتركين وتزوّدهم بالمعرفة. يمكن أن تعمل الدّورات عبر البريد الإلكتروني بمعزل عن الجّهود الأخرى التي تُبذًل في مجال التّسويق بالبريد الإلكتروني، وأن تكون موجّهة إلى حدٍ كبير إلى مجموعاتٍ معيّنة. تستطيع مثلًا إنشاء دورة عبر البريد الإلكتروني للعملاء الجدد لمساعدتهم على التّفاعل مع الخدمات التي تقدّمها. كما يمكنك إنشاء دورة للعملاء المحتملين تقدّم فيها لمحة جديدة عن المجال الذي تنشط فيه مما يجعل شركتك تظهر بمظهر الرّائد في هذا المجال. تقدّم شركة Campaign Monitor دورة مؤتمتة عبر البريد الإلكتروني، حول التّسويق بالبريد الإلكتروني، وهي تتضمّن 9 دروس لمساعدة المسوّقين على تعلّم كيفية إرسال حملة تسويق عبر البريد الإلكتروني تحقّق النّتائج المطلوبة. يستلم المشترك بعد قيامه بالتّسجيل رسائل بريديّة تعلّمه مجموعة متنوّعة من التّكتيكات، وتصل الرّسائل وفقًا لتوقيت محدّد. الدّرس الأوّل: أفكار لعناوين رائعة للرّسائل الدّرس الثّاني: نصائح وحيل للكتابة الدّرس الثّالث: مواقع مجّانيّة للحصول على صور مذهلة لللحملات التّسويقيّة البريد الإلكتروني الدّرس الرّابع: كيفيّة استخدام لوح جوجل التّحليلي Google Analytics Dashboard في التّسويق بالبريد الإلكتروني الدّرس الخامس: كيف نحصل على زيادة بنسبة 127% في النّقرات على روابط الرّسائل click-throughs من خلال إعادة تصميم قوالب البريد الإلكتروني الدّرس السّادس: كيف استخدَم موقع ConversionLab البريد الإلكتروني لتحويل الزوّار الضّائعين إلى إيرادات بقيمة $120,000 الدّرس السّابع: كيف يستخدم BuzzFeed التّسويق بالبريد الإلكتروني لدفع عجلة النّمو الهائل الدّرس الثّامن: كيفيّة دمج تطبيقات الأعمال مع أداة التّسويق عبر البريد الإلكتروني الدّرس التّاسع: كيفيّة اختيار برنامج التّسويق بالبريد الإلكتروني المناسب لنشاطك التّجاري. 1. اختر موضوعا يثير اهتمام متابعيك تهدف الدّورة عبر البريد الإلكتروني إلى تعليم المتابعين شيئًا لا يعرفونه من قبل، لكنّهم مهتمّون بتعلّمه، ويجب عليك أن تفكّر مليًّا عند اختيار الموضوع. يمكنك أوّلًا أن تبحث عن المُحتوى الذي سبق وأن عرف رواجًا جيّدًا على مدوّنتك، أو إجراء بعض الأبحاث حول الكلمات المفتاحيّة الأكثر استخدامًا من طرف مُتابعيك، أو التحدّث مع العملاء بشأن أبرز الصّعوبات التي يواجهونها. تعيد معظم الشّركات استخدام محتوى موجود في مدوناتها أو قواعد المعرفة لديها في دورات البريد الإلكتروني. قام موقع Close.io، وهو نظام إدارة العلاقات مع العملاء CRM موجّه لفرق المبيعات الصّغيرة، بإنشاء دورة عبر البريد الإلكتروني حول مبيعات الشّركات النّاشئة، وخاصّة أنّ فريق العمل في الموقع يعرف تمامًا أهميّة ذلك بالنّسبة للمتابعين. وتكوّنت الدّورة من 13 رسالة بريد إلكتروني، كما تجاوز معدّل فتح معظمها 55%. لدى موقع Buffer عدد من الدّورات عبر البريد الإلكتروني، وتتضمّن ( كيف تصبح خبيرًا على وسائل التّواصل الاجتماعي)، وهي دورة مدّتها 10 أيّام وتساعد المسوّقين على معرفة المزيد عن وسائل التّواصل الاجتماعي. تعلمك هذه الدّورة متى وكيف تنشر على الشّبكات الاجتماعية، وأنواع التّقارير التي يجب أن تريها لمديرك. إنّ تركيز موقع Buffer على هذا الموضوع أمرٌ جيّد، خاصّةً وأنّ منتَجهم عبارة عن برنامج لجدولة المنشورات على وسائل التّواصل الاجتماعي. 2. قم بالترويج للدورة عبر البريد الإلكتروني كما لو أنها منتج يُعَدّ إنشاء دورة عبر البريد الإلكتروني بدايةً جيّدة، وخاصّةً إذا كنت تملك المحتوى بالفعل. ولكن إذا أردت النّجاح، فعليك التّرويج للدّورة التّعليمية كما لو أنّها كانت منتَجًا مستقلًا بذاته. ممّا يعني أنّه عليك تصميم وبناء صفحة هبوط landing page مقنعة، دراسة جدوى تخصيص ميزانية للتّرويج على وسائل التّواصل الاجتماعي، وإضافة دعوة إلى الإجراء في نهاية منشورات المدوّنة لتشجيع القرّاء على التّسجيل. تروّج شركة Campaign Monitor لدورة تعليمية لهامن خلال دعوة إلى الإجراء Call to action في نهاية المنشورات المرتبطة بالموضوع في المدوّنة، وتوصل تلك الدّعوة إلى صفحة هبوط يمكن للنّاس التّسجيل من خلالها. وتبدو الدّعوة إلى الإجراء على الشّكل التالي: أمّا صفحة الهبوط فتبدو على الشّكل التّالي: قد تستمر الدّورة عبر البريد الإلكتروني في جني الفوائد بعد إنشائها بوقتٍ طويل، أي كما هو الحال بالنّسبة للمنتَج. فبعد أن تقوم بإعداد الدّورة عبر البريد الإلكتروني، يمكنك استخدامها لتثقيف العملاء لفترة طويلة. 3. استخدم أسلوب تحرير يجعل الرسائل ممتعة ومفيدة عند إنشاء دورة تعليمية عبر البريد الإلكتروني، يجب أن تحرص على أن تكون قراءة الرّسائل تلك ممتعة. وننصح باستخدام مجموعة المبادئ التّالية للقيام بذلك، بالإضافة إلى قضاء ما يكفي من الوقت في صياغة الدّروس. يمكنك تجربة ما يلي في الكتابة: استخدم صيغة مشكلة- نقاش-حل: اعرض المُشكل الذي تُعالجه، ناقش تأثير المُشكل على النشاطات التّجارية الخاصّة بالقرّاء، ومن ثم قدّم حلّا للمُشكلة. قم بإجراء التّجارب باختبارات A/B. استخدم اسم شخص حقيقي في خانة المُرسل (كأن تُرسل الرّسائل باسم مؤسس الشّركة أو المسؤول عن التّسويق فيه). 4. لا تثقل كاهل المشتركين بالإكثار من المحتوى يهتمّ المشتركون الذين يقومون بالتّسجيل في دورة عبر البريد الإلكتروني بالحصول على المعلومات، لذا لا تثقل كاهلهم بالإكثار من المحتوى. عليك أن تحترم المشتركين وتعطيهم ما يريدونه. ممّا يعني أنّه عليك جعل الرّسائل البريديّة التي ترسلها قصيرة. كما أنّه يجب عليك أن توضّح عدد الرّسائل التي سيتلقّونها منذ البداية. تُعلِم شركة Campaign Monitor المشتركين أن دورة البريد الإلكتروني لديها تتكوّن من 9 أجزاء منذ البداية لكي يعرفوا ما الذي عليهم أن يتوقّعوه. 5. أخبر المشتركين بالخطوة التالية حين تنتهي الدورة يهدف إنشاء الدّورات عبر البريد الإلكتروني إلى تقديم الفائدة للمشتركين. إذا كنت تريد أن تؤدّي دورتك إلى تحويلات، مهما كان تعريفك لتلك التّحويلات، فعليك توجيه المشتركين إلى الخطوة التّالية. يمكن أن تشجّعهم على التّواصل مع فريق المبيعات لديك، أو التّسجيل في دورة أخرى، أو مشاركة الدّورة على وسائل التّواصل الاجتماعي، أو قراءة صفحة الهبوط حول الخدمات التي تقدّمها. لا تتركهم معلَّقين، ونهاية الدّورة فرصةٌ رائعة لإعادة جذب المشتركين. في نهاية الدّورة عبر البريد الإلكتروني، يقدّم موقع Campaign Monitor للمشتركين فرصة التّسجيل للحصول على حساب مجّاني. الخلاصة يمكن أن تثقّف متابعيك من خلال سلسلة رسائل البريد الإلكتروني الآليّة، ليقوموا باتّخاذ قرارات واعية. وتُظهِر الدّورة التّعليمية عبر البريد الإلكتروني أنّ لك تأثيرًا في هذا المجال، ومن خلالها يتعرّف المشتركون أكثر على علامتك التّجاريّة. ومن المرجّح أن يختارك طلّابك عندما يحين وقت الشّراء. ترجمة -وبتصرّف- للمقال 5 Things to Know When Creating an Automated Email Series لصاحبه AARON BEASHEL.
  4. يعتبر Ansible حلًا مناسبًا لأتمتة الأعمال التقنية البسيطة، فإن وجدت نفسك تقوم بتثبيت ووردبريس بشكل متكرر ومُمل، فقد يوفّر عليك Ansible الكثير من الوقت، وباستخدام بعض الأسطر بلغة YAML (وهي لغة توصيف واضحة ومباشرة) سنقوم بأتمتة عملية تثبيت ووردبريس على خادوم يعمل بنظام تشغيل Ubuntu 14.04، وفق الخطوات بصورة أوتوماتيكية. سنستخدم خادومين: أحدهما الخادوم الباني ويتم تشغيل Ansible عليه، والآخر الذي سنقوم بتثبيت ووردبريس عليه باستخدام Ansible. المتطلبات الأولية قبل المتابعة في المقال، سنحتاج للأمور التالية: خادوم يعمل بنظام تشغيل Ubuntu 14.04. سنقوم بتثبيت Ansible على هذا الخادوم (ونشير إليه في المقال بـ الخادوم الباني). سنقوم بتسجيل الدخول إلى هذا الخادوم وجميع الأوامر والملفّات المذكورة في المقال على هذا الخادوم، خادوم آخر يعمل بنظام تشغيل Ubuntu 14.04. سنقوم بتثبيت ووردبريس عليه باستخدام Ansible (وسنشير إليه في المقال بـ خادوم ووردبريس)، حساب مستخدم عادي -على كِلا الخادومين- لا يملك صلاحيات مدير نظام، لكنّه يملك صلاحية تنفيذ الأمر sudo، إضافة مفتاح SSH الخاص بالمستخدم -الذي أنشأناه على الخادوم الباني- إلى المفاتيح المصادقة authorized_keys للمستخدم الذي أنشأناه على خادوم ووردبريس، وينبغي تنفيذ هذه العملية على الخادوم الباني ورفع المفاتيح إلى خادوم ووردبريس. تنفيذ أوامر sudo بدون تأكيد باستخدام كلمة مرور إنّ من الأسرع -ولكن أقل أمانًا- تنفيذ أوامر sudo على خادوم ووردبريس بدون الحاجة لإدخال كلمة مرور تأكيد في كل مرّة. لإعطاء المستخدم على خادوم ووردبريس هذه الإمكانية، سنقوم بتعديل ملف sudoers باستخدام الأمر visudo على سطر الأوامر: $ visudo ومن ثم سنضيف السطر التالي في نهاية الملف: sammy ALL=(ALL) NOPASSWD: ALL ملاحظة: لا تنس استبدال اسم المستخدم (sammy في هذه الحالة) باسم المستخدم الموجود لديك، وتأكد من وضع السطر في نهاية الملف حتى لا يتم تجاوزه بالصلاحيات الافتراضية الموجودة في الملف. نصيحة: قم دومًا باستخدام الأمر visudo عند تعديل ملف sudoers، لأن الأمر سيقوم بالتحقق من التعديلات قبل حفظ الملف ويحميك بالتالي من ارتكاب أخطاء في الملف قد تؤدي إلى منعك من الدخول. حالما تنتهي من تنفيذ العملية السابقة سيغدو بإمكانك تنفيذ الأمر التالي على خادوم ووردبريس بدون إدخال كلمة مرور لتأكيده: $ sudo echo "Hello" وفي بقية المقال، تستطيع تنفيذ الأمر ansible-playbook بدون المُعامل K- كي تتجنب الحاجة لإدخال كلمة المرور للتأكيد بشكل يدوي: $ ansible-playbook playbook.yml -i hosts -u sammy الخطوة الأولى: تثبيت Ansible سنقوم الآن بتثبيت Ansible على الخادوم الباني، ونبدأ بتسجيل الدخول عبر SSH إلى الخادوم وتنفيذ الأمر التالي: $ sudo apt-get install ansible -y وتستطيع التأكد من تثبيت Ansible بتنفيذ الأمر: $ ansible --version حيث ينبغي أن يكون الخرج مشابهًا (وليس بالضرورة مطابقًا) لما يلي: ansible 1.5.4 الخطوة الثانية: إعداد بنية الملفات الآن وبعد أن انتهينا من تثبيت Ansible، دعونا نقوم بإعداد بنية الملفات من أجل Ansible playbook. سنقوم بإنشاء مجلّد على النحو التالي: $ cd ~ $ mkdir wordpress-ansible && cd wordpress-ansible سنقوم الآن بإنشاء ملفّين: الأول يدعى playbook.yml (حيث سنقوم بكتابة الأوامر الخاصة بتثبيت ووردبريس فيه) والثاني يدعى hosts (وهذا يُخبر Ansible عن الخواديم التي سيتم تنفيذ الأوامر عليها): $ touch playbook.yml $ touch hosts إنّ من الأفضل فصل الأوامر بحسب الأدوار، ومن الممكن اعتبار الأدوار كأجزاء من الممكن إعادة استخدامها، وسنقوم في هذا المشروع بإنشاء 4 أدوار: server php mysql wordpress سنقوم بإنشاء مجلد الأدوار في الجذر الرئيسي للمجلد الذي أنشأناه سابقًا wordpress-ansible/~ بتنفيذ الأمر التالي: $ mkdir roles && cd roles والآن سنقوم بتجهيز الأدوار باستخدام أداة من أدوات Ansible تدعى ansible-galaxy، حيث سنقوم من أجل كل دور بتنفيذ الأمر ansible-galaxy init كالتالي: $ ansible-galaxy init server $ ansible-galaxy init php $ ansible-galaxy init mysql $ ansible-galaxy init wordpress ستلاحظ بأن هذا الأمر سيقوم بإنشاء هيكل ملفات متكامل لكل دور من الأدوار، وهذه الخطوة هي إحدى الأمور التي ينصح بها في توثيق Ansible. ما يهمّنا غالبًا هو التعامل مع محتوى ملف tasks/main.yml لكل دور. عند الوصول إلى هذه المرحلة سيكون لدينا الهيكل التالي: [.] |_ playbook.yml |_ hosts |_ [roles] |_ [server] |_ ... |_ [php] |_ ... |_ [mysql] |_ ... |_ [wordpress] |_ ... الخطوة الثالثة: إنشاء الـ Playbook سنقوم الآن بكتابة الأوامر التي ستقوم بتثبيت ووردبريس على خادوم ووردبريس. ملف المخزون hosts يُخبر هذا الملف Ansible بالخواديم التي نرغب بتثبيت ووردبريس عليها، ومن الممكن تنفيذ الأوامر للخواديم أو مجموعة الخواديم المعرّفة في ملف المخزون hosts. سنقوم بتحرير ملف hosts باستخدام محرر nano أو أي محرر آخر تفضّله وكتابة التالي: [wordpress] wordpress_server_ip ملاحظة: من الممكن وضع أي عدد نرغب به من العناوين الرقمية IPs تحت مجموعة [wordpress]. سيؤدي هذا إلى تنفيذ الأوامر على جميع الخواديم المذكورة على افتراض أننا نملك صلاحية استخدام هذه الخواديم. سيمكّننا هذا من تثبيت ووردبريس على أي عدد من الخواديم دفعة واحدة. ملف Playbook يمكن اعتبار هذا الملف كتعريف لتطبيق ووردبريس الذي سنقوم بتثبيته. سيحتوي الملف على جميع الأدوار التي قمنا بإنشائها بغرض تجهيز تطبيق مفيد (ووردبريس في حالتنا). سنقوم بداية بتحرير الملف باستخدام محرر nano أو أي محرر آخر ترغب به: $ nano ~/wordpress-ansible/playbook.yml ومن ثم سنضيف المحتويات التالية إلى الملف، والتي ستُخبر Ansible أية أدوار سيتم تنفيذها على أية خواديم (سيتم تنفيذ الأدوار المذكورة في حالتنا على مجموعة العناوين الرقمية المدرجة في مجموعة wordpress المسجّلة في ملف hosts الذي أنشأناه سابقًا): - hosts: wordpress roles: - server - php - mysql - wordpress والآن لنعد إلى الجذر الرئيسي: $ cd ~/wordpress-ansible/ سنتأكد الآن من أنه من الممكن إجراء اتصال ما بين الخادوم الباني وخادوم ووردبريس من خلال تنفيذ ملف playbook الذي لن يقوم بأي شيء سوى التحقق من الاتصال: $ ansible-playbook playbook.yml -i hosts -u sammy -K ستُطالب بإدخال كلمة المرور لتأكيد الأمر، ولا تنس أن تقوم باستبدال اسم المستخدم بالموجود لديك. سيظهر لنا خرج يشبه التالي عند تنفيذ الأمر: ansible-playbook playbook.yml -i hosts -u sammy -K PLAY [wordpress] ************************************************************** GATHERING FACTS *************************************************************** ok: [188.166.68.134] PLAY RECAP ******************************************************************** 188.166.68.134 : ok=1 changed=0 unreachable=0 failed=0 والذي سيؤكد لنا بأن الاتصال قد تم بنجاح، دون أن يتم تنفيذ أي تعديلات لأننا لم نقم بتحديد أي أوامر لتنفيذها حتى الآن. إن فشل تنفيذ الأمر فتأكّد من أن باستطاعتك تسجيل الدخول إلى خادوم ووردبريس من الخادوم الباني باستخدام مفتاح SSH الذي قمت بنسخه في البداية. الخطوة الثالثة: إنشاء الأدوار دور Server سنقوم بداية بتعريف الأوامر التي سيتم تنفيذها على الخادوم ولهذا الغرض سنقوم بتحرير أوامر دور server. ستقوم الأوامر التي سنصرّح عنها بتثبيت جميع البرمجيات التي سنحتاجها على السيرفر الهدف. نبدأ بتنفيذ الأمر التالي: $ nano roles/server/tasks/main.yml قم بإضافة المحتويات التالية وتأكد من وجود سطر واحد فقط يحتوي على --- (حيث يوجد هذا السطر سلفًا بشكل افتراضي): --- - name: Update apt cache apt: update_cache=yes cache_valid_time=3600 sudo: yes - name: Install required software apt: name={{ item }} state=present sudo: yes with_items: - apache2 - mysql-server - php5-mysql - php5 - libapache2-mod-php5 - php5-mcrypt - python-mysqldb سيقوم المحتوى السابق بما يلي: تحديث خبء apt-cache (تنفيذ الأمر apt-get update)، تثبيت Apache ،MySQL ،PHP وبرمجيات أخرى مرتبطة باستخدام apt-get install. وإن كنت مهتمًّا بمعرفة تفاصيل ما نقوم بتثبيته، فيمكنك الاطلاع على هذا المقال حول تثبيت LAMP على Ubuntu 14.04 بشكل يدوي. سنقوم الآن بتنفيذ ansible-playbook مرة أخرى على النحو التالي: $ ansible-playbook playbook.yml -i hosts -u sammy -K ويفترض هذه المرة أن يكون الخرج بما يشبه التالي: ansible-playbook playbook.yml -i hosts -u sammy -K PLAY [wordpress] ************************************************************** GATHERING FACTS *************************************************************** ok: [188.166.68.134] TASK: [server | Update apt cache] ********************************************* ok: [188.166.68.134] TASK: [server | Install required software] ************************************ changed: [188.166.68.134] => (item=apache2,mysql-server,php5-mysql,php5,libapache2-mod-php5,php5-mcrypt,python-mysqldb) PLAY RECAP ******************************************************************** 188.166.68.134 : ok=3 changed=1 unreachable=0 failed=0 وبعد التنفيذ، ينبغي أن تكون قادرًا على استعراض الصفحة الافتراضية لـ Apache عبر فتح العنوان http://wordpress_server_ip في المتصفح. ملاحظة: إن توقّف تنفيذ الأمر بشكل نهائي عند سطر [TASK: [server | Update apt cache فمن المحتمل أن يكون هناك نقص في الصلاحيات المطلوبة على الخادوم الهدف، لذا تأكّد من أن الوصول باستخدام sudo تم إعداده بشكل صحيح على خادوم ووردبريس. دور PHP سنقوم الآن بتجهيز الأوامر التي تستهدف PHP، ولهذا الغرض سنقوم بتحرير الملف الخاص بهذا الدور: $ nano roles/php/tasks/main.yml ومن ثم سنضيف المحتوى التالي (تأكّد من وجود سطر واحد فقط يحتوي على --- في بداية الملف): --- - name: Install php extensions apt: name={{ item }} state=present sudo: yes with_items: - php5-gd - libssh2-php سيقوم المحتوى السابق بتثبيت الملحقات extensions الضرورية لـ PHP وهي: php5-gd و libssh2-php. دور MySQL سنقوم الآن بإعداد قاعدة بيانات MySQL لموقع ووردبريس، وذلك في دور mysql. سنحتاج من أجل القيام بذلك إلى بعض المتغيّرات، والتي من الممكن تخزينها في ملف المتغيرات الافتراضية defaults/main.yml: $ nano roles/mysql/defaults/main.yml سنضيف في الملف اسم قاعدة البيانات، اسم المستخدم الخاص بالقاعدة، كلمة المرور الخاصة بالمستخدم وبنفس الترتيب، ولا تنس أن تستخدم كلمة مرور معقّدة لأغراض أمنية: --- wp_mysql_db: wordpress wp_mysql_user: wordpress wp_mysql_password: wp_db_password والآن نستخدم nano لتحرير ملف المهام: $ nano roles/mysql/tasks/main.yml ونضيف المحتوى التالي: --- - name: Create mysql database mysql_db: name={{ wp_mysql_db }} state=present - name: Create mysql user mysql_user: name={{ wp_mysql_user }} password={{ wp_mysql_password }} priv=*.*:ALL يقوم المحتوى السابق بـ: إنشاء قاعدة بيانات MySQL، إنشاء مستخدم MySQL، إعطاء المستخدم صلاحية الوصول إلى قاعدة البيانات. وكما ترى فسيتم استخدام قيم المتغيرات بشكل تلقائي من ملف defaults/main.yml عند تنفيذ الأوامر. ملاحظة: توفّر أدوات Ansible أداة ansible-vault والتي تسمح بتخزين كلمات المرور بصورة مشفّرة حتى لا تكون قابلة للقراءة في الملف، ولكن الحديث عن هذا خارج إطار حديثنا الآن. دور WordPress والآن نأتي للحظة التي كنا ننتظرها.. تثبيت ووردبريس. نبدأ بتحرير ملف المهام كالمعتاد: $ nano roles/wordpress/tasks/main.yml وسنقوم بنسخ المحتوى التالي إليه: --- - name: Download WordPress get_url: url=https://wordpress.org/latest.tar.gz dest=/tmp/wordpress.tar.gz validate_certs=no sudo: yes سيقوم المحتوى السابق بتحميل ووردبريس إلى مجلد tmp/ (ويمكن للحذرين أن ينتبهوا إلى أننا قمنا بتعطيل التحقق من الشهادة الأمنية، لأنه سيمنع عملية التحميل). بعد اكتمال التحميل سنقوم بفك ضغط الملف إلى var/www/، وهو المسار الذي يستخدمه Apache لتخزين محتوى الويب، وبالتالي سنضيف الجزء التالي لمحتوى الملف أيضًا: - name: Extract WordPress unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no sudo: yes وبعد أن يتم فك ضغط الملفات، سنقوم بتحديث مسار الجذر الافتراضي DocumentRoot في ملف إعدادات Apache كي يشير إلى موقع ووردبريس: - name: Update default Apache site sudo: yes lineinfile: dest=/etc/apache2/sites-enabled/000-default.conf regexp="(.)+DocumentRoot /var/www/html" line="DocumentRoot /var/www/wordpress" notify: - restart apache sudo: yes لاحظ أننا استخدمنا الكتلة notify، والتي نحتاجها عند الرغبة بإعادة تشغيل خدمات بعد أن يتم تنفيذ مهمّة بنجاح، ولا يتم تنفيذ معالجات notify إلا عندما يحصل تغيير على حالة المهمّة. سنقوم بإضافة المعالج الخاص بنا لإعادة تشغيل Apache باستخدام restart apache ويتم ذلك في الملف roles/wordpress/handlers/main.yml: $ nano roles/wordpress/handlers/main.yml نضيف المحتوى التالي: --- - name: restart apache service: name=apache2 state=restarted sudo: yes ويتم تنفيذ هذه المهمّة عندما تتغير حالة المهمّة التي تحتوي على الكتلة notify: restart apache، مما يؤدي إلى إعادة تشغيل الخدمة. إعداد ووردبريس بالعودة إلى roles/wordpress/tasks/main.yml، سنقوم الآن بتجهيز إعدادات موقع ووردبريس، فنقوم أولًا بنسخ ملف الإعدادات config الافتراضي: - name: Copy sample config file command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php sudo: yes ومن ثم نقوم بتغيير بعض الثوابت في الملف لتتطابق مع معلومات الاتصال بقاعدة البيانات: - name: Update WordPress config file lineinfile: dest=/var/www/wordpress/wp-config.php regexp="{{ item.regexp }}" line="{{ item.line }}" with_items: - {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"} - {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"} - {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"} sudo: yes حيث ستقوم المهمّة بجلب معلومات الاتصال بالقاعدة من ملف المتغيّرات الافتراضية الذي قمنا بتحريره سابقًا. بعد الانتهاء من الخطوات السابقة بنجاح، سيكون قد أصبح لدينا ملفّين لدور wordpress، وفيما يلي النسخة الكاملة لمحتوى الملفّين.. ملف roles/wordpress/tasks/main.yml: --- - name: Download WordPress get_url: url=https://wordpress.org/latest.tar.gz dest=/tmp/wordpress.tar.gz validate_certs=no - name: Extract WordPress unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no sudo: yes - name: Update default Apache site sudo: yes lineinfile: dest=/etc/apache2/sites-enabled/000-default.conf regexp="(.)+DocumentRoot /var/www/html" line="DocumentRoot /var/www/wordpress" notify: - restart apache - name: Copy sample config file command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php sudo: yes - name: Update WordPress config file lineinfile: dest=/var/www/wordpress/wp-config.php regexp="{{ item.regexp }}" line="{{ item.line }}" with_items: - {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"} - {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"} - {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"} sudo: yes ملف roles/wordpress/handlers/main.yml: --- - name: restart apache service: name=apache2 state=restarted sudo: yes ونكون قد انتهينا. لنقم الآن بتشغيل ansible-playbook لآخر مرة لإعداد موقع ووردبريس: $ ansible-playbook playbook.yml -i hosts -u sammy -K وبعد تنفيذ الأمر ينبغي أن نكون قادرين على تصفّح الموقع عبر طلب عنوانه http://your_server_ip في المتصفح ويمكن الآن متابعة إعداد موقع ووردبريس بشكل يدوي عند هذه المرحلة. الخلاصة تهانينا! ستتمكن الآن من تثبيت مواقع ووردبريس على أي عدد من الخواديم التي تعمل بنظام تشغيل Ubuntu باستخدام أمر واحد: $ ansible-playbook playbook.yml -i hosts -u sammy -K وكل ما تحتاج للقيام به هو إضافة العنوان الرقمي IP إلى قائمة الخواديم المستهدفة في ملف hosts والتأكّد من أن الصلاحيات قد تم إعدادها مسبقًا على الخادوم الهدف. تناولنا في المقال بصورة سريعة كيفية استخدام Ansible لتثبيت مواقع ووردبريس بشكل اوتوماتيكي، وقد تكون مهتمًّا ببعض التحسينات الإضافية الممكنة: تعلّم كيفية استضافة أدوارك الخاصة في الـ Ansible Galaxy. أتمتة عملية الإعداد النهائية لموقع ووردبريس حتى لا يكون هناك حاجة للقيام بأي إعداد يدوي للموقع المطلوب إطلاقًا. ترجمة -وبتصرّف- للمقال How To Automate Installing WordPress on Ubuntu 14.04 Using Ansible لصاحبه Christo Crampton.
  5. هل سبق لك وأن اتّصلت بإحدى الشّركات الكبيرة ( كمزوّد خدمة الإنترنت الخاص بك، أحد شركات بطاقات الائتمان، أو paypal) لتطلب المساعدة في حلّ مشكلةٍ ما ؟ في البداية تسمع صوتًا لطيفًا آليًّا يخبرك أنّك عميلُ الشركة العزيز الذي يهمّهم رضاه. ثم يسألك ذلك الصّوت عن المشكلة التي تواجهها, فتقول مثلًا "أواجه مشكلة في الاتصال بالإنترنت". فيرد عليك "عذرًا. 'وجه شكل الإنترنت' خيار خير صحيح". تضغط على الرقم 0 لعدّة مرّات، ثمّ تجرّب الضغط على (*) لعدّة مرّات لكنّ الصوت الآليّ الوَدود يخبرك مجددًا أنّها خياراتٌ غير صالحة. تقول الآن بصوتٍ مرهق "أرغب في الحديث إلى الدعم الفني". فيرد عليك الصوتُ الآلي "'راغب الحدث الفني' خيار غير صحيح". تفكّر في ترك التعامل مع هذه الشركة، لكنّك تخشى أن تتعرّض لتجربةٍ أسوأ من هذه مع شركةٍ أخرى فتتراجع عن هذا القرار. وبعد أن تفقد الأمل، تقوم بالبحث حلٍ لمشكلتك في جوجل، أو تطلب المساعدة على أحد مواقع التواصل الاجتماعي. هذا النوع من التجارب هو ما يخطر ببال روّاد الأعمال عندما يفكّرون في أَتمتَة (automate) شيءٍ من أعمالهم/مهامّهم: التواصل مع العملاء بطريقةٍ آليّةٌ مصطنعةٌ لا تُرضيهم أو تساعدهم. لكن المثال الذي ذُكر أعلاه مثالٌ على القيام بالأتمتَة (automation) بطريقةٍ خاطئةٍ بالكامل (إلا إذا كان هدفُك هو إغاظة العميل وخسارة رضاه، في هذه الحالة أقترح عليك أن تحاكي هذا المثال بالضّبط). في الواقع، أقوم بأتمتة معظم مهام مشاريعي التّجارية. ليس لديّ خيارٌ آخر، فأنا أُدير أعمالي كمستقل، إضافة إلى 4 كورسات، مدوّنتين صوتيّتين، بعض قوائم البريد الإلكتروني وأكثر- في الوقت نفسه، بنفسي وبدون مساعدةٍ من أحد. لكن على عكس المثال السّابق، أؤتمت أعمالي بشكل لا يسبب إزعاجًا لأي من زبائني. عندما تسجّل في القائمة البريديّة على سبيل المثال، سيتم الترحيب بك برسالةٍ تعبّر لك عن امتناني في قالبٍ جاهز فيه اسمُك. ستعرفُ أنّني لم أكتب هذه الرسالة خصيصًا لك أنت، لكنك لن تنزعج أيضًا من ذلك – كما أتمنى- لأنني قمتُ بأتمتَة تلك الرسالة. وفقًا للدراسات فإنّ 75% من الناس يتوقّعون تلقّي رسالةً ترحيبية عندما يشتركون في نشرةٍ (newsletter) عبر البريد الإلكتروني. ومن وجهة نظر تسويقيّة، تزيد الرسائل الترحيبية العائدات بنسبة 320% أكثر من الرسائل الدعائيّة الأخرى. يقوم أغلب النّاس بأتمتة رسائل الترحيب بمشتركي قوائمهم البريدية الجدد دونَ أي يعوا أنهم في طور عمليّة الأتمتة بالفعل. إذا قمت بأتمتة تلك الرسائل الترحيبيّة بشكلٍ صحيحٍ يتّسق مع هويّتك وهويّة شركتك وبطريقةٍ تُرضي العميل، فسيعود ذلك عليك وعلى نشاطك التّجاري بعائدٍ إيجابي. تعمل الأتمتة بصفتها امتدادًا لهويّتك وهويّة شركتك. ولذلك، فإنها يجب أن تكون بطريقتك الخاصّة وبنبرتك المميّزة، وليس كما تقوم به بعض الشّركات الكبيرة: " عميلُنا العزيز، من فضلك انتظر لمئتين دقيقة حتى تتلقّى ردًا جاهزًا مقَولبًا وغير مفيد". يمكنك أيضًا -بجانب الرسائل الترحيبية- أن تقوم بأتمتة رسائل ذات محتوى مسلٍّ كقصصٍ ممتعة أو شيء من هذا القبيل. قمت بأتمتة معظم مهام عملية تهيئة المستخدمين الجدد للعملاء الجدد في موقعي الخاص بتصميم مواقع الويب. وقد وفّر ذلك عليّ ساعاتٍ من العمل أسبوعيًّا ولم يؤثّر سلبًا -ولو بنسبةٍ بسيطة- على نسبة العملاء المُحتملين الذين قاموا بتوظيفي. باستخدام أدواتٍ مثل Zapier، تستطيع أن تقوم بالأتمتة بذكاءٍ وسهولة، ومن دون الحاجة لكتابة أي سطر برمجي. أستخدمُ Zapier مثلًا لإرسال رسالة أوتوماتيكيًّا كلما فشلت عملية الدّفع مُقابل أحد الكورسات التي أبيعها. هذا يحدث لعدّة مرّات في الأسبوع، لكنّني إن لم أفعل شيئًا حيال فشل تلك التحويلات، سأقوم بخسارة الكثير من أرباحي. ولذلك بدلًا من عدم فعل شيء حيال فشل الحوالات البنكيّة وتمنّي أن يحاول العميل الدفع مرّةً أخرى، أستخدمُ Zapier لأرسل له رسالةً مفادُها أنّه لم يكن الخطأ خطأه، مع بعض التعليمات التي تشرح كيفية الدفع باستخدام وسائل أخرى. تُرسل الرسالة في غضون ثواني من فشل التحويل. تُرسَل من عنوان بريدي الإلكتروني وتُكتب بنفس الطريقة التي أكتب بها الرسائل الشخصية (بدون أحرف كبيرة، بأسلوبي، وبتوقيعي الاعتيادي). ليس عليهم أن يتواصلوا معي مباشرةً لطلب المساعدة، وليس عليهم أن ينتظروني حتى أستيقظ (إذا كانوا يحاولون الدّفع الساعة الثالثة بعد منتصف الليل). يتم التواصل معهم على الفور برسالةٍ لطيفة مع بعض الخطوات البسيطة لحل المشكلة. ربّما تتفاجأ عندما تعلم أنّ هذه الرّسالة لها معدّل نجاح يبلغ 96%. أستخدمُ أيضًا قائمتي البريديّة لأتمتة كل ما يتعلّق بالكورسات التي أقدّمها. قيامي بذلك يسمح لي بإدارة عدد من الكورسات المختلفة مع العديد من الطّلاب في الوقت نفسه. أقدّم خيار فترة التجربة المجّانيّة في معظم كورساتي. فإذا كنت مهتمًا، يمكنك الحصول على بعض الدروس المجّانية عن طريق تسجيل بريدك الإلكتروني. أبدأ عن طريق الأتمتة بواسطة MailChimp في إرسال الرسائل أو الدروس مباشرةً - فينال العميل ما سجّل للحصول عليه على الفور وأرسله له المزيد من العيّنات المجّانيّة والمعلومات بشكلٍ يومي. أستخدم MailChimp أيضًا لاستثناء الطلّاب الذين قاموا بالتسجيل في الكورس والدّفع من الرسائل المؤتمتة التي تحتوي دروسًا مجّانية. مما يعني أنه إذا اشتريت الكورس في فترة التجربة المجّانية (التي تُرسل فيها رسائل مؤتمَتة) سوف تتوقف عن تلقّي تلك الرسائل على الفور. لقد قمتٓ للتوّ بشراء محتوى الكورس على كل حال، لذلك لست بحاجةٍ لتكدّس صندوق بريدك الإلكتروني بالرسائل التي تقدّم لك المحتوى المجّاني. ثم أقوم بإضافة العملاء الذين قاموا بشراء محتوى الكورس لقائمة بريدية أخرى (قائمة ما بعد الشراء). وهذا له عدّة فوائد: أن أريهم كيفية استعمال أدوات الكورس. أن أعلّمهم كيفية الوصول لكل المميزات والدروس التي يحتويها. أن أخبرهم عن كيفية الوصول لأقصى استفادة من محتويات الكورس عدد المشتركين في دوراتي 4000 طالب نٓشِط تقريبًا، وتأتيني رسالةٌ واحدةٌ فقط أسبوعيًا لطلب الدعم/المساعدة، وذلك لأنني أقوم بأتمتَة رسائل البريد الإلكتروني التي تشرح هذه الأمور. معظم الرسائل المؤتمتة التي أرسلها للعملاء بعد الشّراء تحتوي على آلية للتغذية الراجعة ، وذلك لأعرف ما هو رأي العملاء بالكورس الذي اشتروه، للتأكد من أنهم يستفيدون من الكورس بشكلٍ كامل ولأرى ما هي العوائد الإيجابيّة التي حصلوا عليها منه ( وهذه طريقةٌ رائعةٌ للحصول على شهادات التوصية testimonials وقصص النجاح ). يمكنك أيضًا أن تقوم بأتمتة ما يتعلّق بالتغذية الراجعة Feedback بشكلٍ مستقل باستخدام أدوات مثل Typeform لطرح الأسئلة وجمع الإجابات. الإمكانيّات والفوائد التي يمكنك الحصول عليها من أتمتة قائمتك البريدية والشؤون الأخرى في شركتك كثيرةٌ جدًا. وإذا استعملتَ الأتمتة بطريقةٍ صحيحة، فسيسعدُ عملاؤك لعنايتك بهم وباهتمامك الذي يحمل صٓبغةً شخصيّة، حتى وإن كان ذلك بطريقةٍ مؤتمتة. لا تنهج نَهج الشركات الكبيرة -التي تفشل غابًا في العناية بعملائها- في الأتمتة. يمكنك أن تستعمل الأتمتة لتكون امتدادًا لأسلوبك الشخصي المتفرّد ولكي تفيد وتساعد العملاء الذين يريدون ويحتاجون أن يتواصلوا معك ( حتى إن أرادوا ذلك في الساعة الثالثة صباحًا). ترجمة -وبتصرف- للمقال Make automation great again لصاحبه PAUL JARVIS. حقوق الصورة البارزة: Designed by Freepik.
  6. تمّ تصميم أنظمة إدارة الإعدادات لتجعل التحكّم بعدد كبير من الخواديم أمرًا سهلًا لمديري الأنظمة وفرق العمليّات، فهي تسمح لنا بالتحكّم بالعديد من الأنظمة المختلفة بطريقة مؤتمتة من موقع مركزي واحد. وبينما تتوافر العديد من أنظمة إدارة الإعدادات الشائعة من أجل أنظمة Linux، مثل Chef وPuppet، فهي غالبًا معقدة أكثر من حاجة الناس، تُشكّل Ansible بديلًا رائعًا لهذه الخيارات لأنّها تحتوي على عقبات أقل بكثير عند البدء معها. سنناقش في هذا الدّرس كيفيّة تثبيت Ansible على خادوم Ubuntu وسنمر على بعض الأساسيات حول كيفيّة استخدام هذه البرمجيّة. كيف تعمل Ansible؟تعمل Ansible عن طريق إعداد أجهزة العملاء من خلال حاسوب يمتلك مكوّنات Ansible مثبّتة ومُعدّة عليه. تتواصل عبر قنوات SSH الاعتياديّة من أجل استعادة المعلومات من الأجهزة عن بُعد remote، إصدار الأوامر، ونسخ الملفّات، ولهذا السبب لا يتطلّب نظام Ansible تثبيت أي برمجيّات إضافيّة على حواسيب العملاء. هذه هي إحدى الطرق التي تُبسِّط فيها Ansible إدارة الخواديم، فيُمكِن إحضار أي خادوم يمتلك منفذ SSH مُعرَّض تحت مظلّة إعدادات Ansible بغض النظر عن الطور الذي يتواجد فيه ضمن دورة حياته. أي حاسوب نستطيع إدارته عبر SSH نستطيع أيضًا إدارته عبر Ansible. تتخذ Ansible نهج الوحدات modules ممّا يجعل من السهل تمديدها كي تستخدم وظائف من النظام الأساسي للتعامل مع حالات محدّدة، يُمكِن كتابة الوحدات باستخدام أيّة لغة وهي تتخاطب بواسطة JSON المعياريّة. إنّ ملفّات الإعدادات مكتوبة بشكل رئيسي بصيغة تسلسل البيانات YAML نظرًا لطبيعتها التعبيرية وتشابهها مع لغات الرقم markup الشائعة، تتمكن Ansible من التفاعل مع العملاء إمّا من خلال أداة سطر الأوامر أو عبر scripts للإعدادات تُدعى Playbooks. تثبيت Ansible على Ubuntuللبدء باستكشاف Ansible كوسيلة لإدارة خواديمنا المختلفة نحتاج إلى تثبيت برمجيّة Ansible على جهاز واحد على الأقل، سنستخدم خادوم Ubuntu من أجل هذا القسم. إنّ أفضل طريقة للحصول على Ansible في Ubuntu هي إضافة PPA المشروع (أرشيف الحِزَم الشخصية personal package archive) إلى نظامنا. للقيام بذلك على نحو فعال نحتاج لتثبيت الحزمة python-software-properties والتي ستعطينا القدرة على العمل مع PPA بسهولة: sudo apt-get update sudo apt-get install python-software-propertiesبعد أن يتم تثبيت الحزمة نستطيع إضافة Ansible PPA بكتابة الأمر التالي: sudo add-apt-repository ppa:rquillo/ansible نضغط ENTER لقبول إضافة الـ PPA. نحتاج بعدها لتحديث دليل حِزَم نظامنا بحيث يكون على دراية بالحِزَم المتوفرة في PPA، نستطيع بعدها تثبيت برمجيّة Ansible: sudo apt-get update sudo apt-get install ansible نمتلك الآن كافّة البرمجيّات المطلوبة لإدارة خواديمنا من خلال Ansible. إعداد مفاتيح SSHتتخاطب Ansible بالدرجة الأولى كما أشرنا سابقًا مع حواسيب العملاء عبر SSH، وعلى الرغم من أنّها تمتلك القدرة على التعامل مع استيثاق SSH authentication مُعتمِد على كلمة السر فتساعد مفاتيح SSH على إبقاء الأمور أبسط. بإمكاننا إعداد مفاتيح SSH بطريقتين مختلفتين اعتمادًا على إذا ما كنّا نمتلك مسبقًا المفتاح الذي نريد استخدامه. 1- إنشاء زوج مفاتيح SSH جديدإن لم تكن تمتلك مسبقًا زوج مفاتيح SSH ترغب في استخدامه من أجل إدارة Ansible فبإمكانك إنشاء واحد الآن على خادوم Ansible. سنقوم بإنشاء زوج مفاتيح SSH على خادوم Ansible من أجل استيثاقه مع المضيفين الذين يديرهم. نقوم بإنشاء زوج مفاتيح RSA key-pair بكتابة ما يلي عن طريق المستخدم الذي نتحكّم بـ Ansible من خلاله: ssh-keygen سيتم سؤالنا عن تحديد موقع الملف لزوج المفاتيح التي تم إنشاؤها، عبارة سر passphrase، وتأكيد عبارة السّر، نضغط Enter في جميع هذه المراحل لقبول القيم الافتراضيّة. ستكون المفاتيح الجديدة متاحة في دليل ~/.ssh الخاص بالمستخدم، يُدعى المفتاح العام (والذي يمكننا مشاركته) بـ id_rsa.pub، يُدعى المفتاح الخاص (والذي نبقيه بأمان) بـ id_rsa. نستطيع إضافتها إلى لوحة تحكّم DigitalOcean على سبيل المثال (إن كنت على Digital Ocean) للسماح لنا بتضمين مفتاح SSH الخاص بنا في الخواديم الجديدة التي أنشأناها، سيسمح هذا لخادوم Ansible بالدخول إلى الخواديم الجديدة عبر SSH فورًا بدون الحاجة لأي استيثاق آخر. لفعل هذا نضغط على الرابط “SSH Keys” الموجود في قائمة التصفح على اليسار، نضغط في الشاشة الجديدة على زر “Add SSH Key” الموجود في الزاوية العلوية اليمنى: ندخل الاسم الذي نريد ربطه مع هذا المفتاح في الحقل العلوي، ونكتب على خادوم Ansible ما يلي للحصول على محتويات مفتاحنا العام: cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0 السلسلة النصية التي تعود لنا هي التي نحتاج لصقها في الحقل الثاني في لوحة تحكّم DigitalOcean: نضغط على “Create SSH Key” لإضافة مفتاحنا إلى لوحة التحكم، نستطيع الآن تضمين مفتاح SSH العام إلى الخواديم الجديدة التي نضيفها مما يسمح لنا بالتواصل مع خادوم Ansible، نحتاج فقط إلى اختيار المفتاح في القسم “Add optional SSH Keys” من عملية إنشاء خادوم جديد: 2- نقل زوج مفاتيح SSH موجود إلى Ansibleإن كنت تمتلك مسبقًا زوج مفاتيح SSH تريد استخدامه من أجل الاستيثاق مع خواديمك فبإمكانك نقل الإعتمادات credentials إلى خادوم Ansible الجديد بدلًا من إنشاء زوج جديد، يمتلك هذا ميّزة بأن يجعلها تعمل تلقائيًّا مع أي خواديم قمت بإعدادها مسبقًا لتستخدم هذا المفتاح. وعلى الحاسوب الآخر حيث قمنا بإعداد استيثاق مفتاح SSH من أجل الخواديم نحصل على المفتاح العام بكتابة ما يلي: cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0نحتاج على خادوم Ansible إلى إنشاء دليل مخفي لتخزين المفاتيح، نقوم بتسميته .ssh كي يعلم برنامج SSH أين يجده: mkdir ~/.ssh نقوم بقفل النفاذ إلى هذا الدليل لكي نتمكن نحن فقط من دخوله أو الكتابة إليه: chmod 700 ~/.ssh ننتقل الآن إلى الدليل ونفتح ملفًّا يُدعى id_rsa.pub باستخدام محرّر النصوص: cd ~/.ssh nano id_rsa.pubنلصق خَرْج مفتاحنا العام من حاسوبنا الرئيسي إلى هذا الملف: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0 نقوم بحفظ وإغلاق الملف، ونتحقّق من امتلاكه للأذونات الصحيحة بكتابة: chmod 644 id_rsa.pub الآن وبالعودة إلى حاسوبنا المحلّي المضبوط من أجل نفاذ مفاتيح SSH نكتب: cat ~/.ssh/id_rsa -----BEGIN RSA PRIVATE KEY----- MIIEpgIBAAKCAQEA85hoLKo0hbjgW42QdbIKriqad08vhYKqC684ym25PVRjh+pD N+2gIcl8Zk0H3uvZYWIv1gmsfpq1zsmPSIkG1H2eI7HzxPQ0qMx4ZpxogVgO6XnQ kyfzYX9OnZoQCSGxMVt7g4IWz2820gOSIZ9cdBeRV7UjA6Bbco3MFMCcXNs/5JPU ynBUpfKqn+CGAWBO3PhCmmEQY4wz+AEJosI0z7oqbJrm/AtDhhdHUzGrSGtJaJOq . . . . . . cqsqOEzXAoGBAPMJJ8RrKUBuSjVNkzebst9sBgNadmaoQUoMHUDr8KpCZhWAoHB7 1VKmq7VSphQSruI31qy2M88Uue1knC/nQr1bE1DITZgezETSsDqsAMBo8bqDN6TT qVJgG+TS9BRC+IowuzMVV5mzrfJjkrb+GG+xWSXrTLZMbeeTf+D0SfVo -----END RSA PRIVATE KEY----- سيكون الخَرْج طويلًا جدًّا. نعود الآن إلى خادوم Ansible، نحتاج إلى إنشاء ملف جديد في الدليل ~/.ssh: nano id_rsa نقوم بداخله بلصق نتائج الأمر السابق على حاسوبنا المحلّي: -----BEGIN RSA PRIVATE KEY----- MIIEpgIBAAKCAQEA85hoLKo0hbjgW42QdbIKriqad08vhYKqC684ym25PVRjh+pD N+2gIcl8Zk0H3uvZYWIv1gmsfpq1zsmPSIkG1H2eI7HzxPQ0qMx4ZpxogVgO6XnQ kyfzYX9OnZoQCSGxMVt7g4IWz2820gOSIZ9cdBeRV7UjA6Bbco3MFMCcXNs/5JPU ynBUpfKqn+CGAWBO3PhCmmEQY4wz+AEJosI0z7oqbJrm/AtDhhdHUzGrSGtJaJOq . . . . . . cqsqOEzXAoGBAPMJJ8RrKUBuSjVNkzebst9sBgNadmaoQUoMHUDr8KpCZhWAoHB7 1VKmq7VSphQSruI31qy2M88Uue1knC/nQr1bE1DITZgezETSsDqsAMBo8bqDN6TT qVJgG+TS9BRC+IowuzMVV5mzrfJjkrb+GG+xWSXrTLZMbeeTf+D0SfVo -----END RSA PRIVATE KEY----- نتأكّد من تضمين أسطر التحديد الموجودة في البداية والنهاية، فهي مطلوبة لكي يكون ملف المفتاح صالحًا، نحفظ الملف ونغلقه. نحتاج لتغيير الأذونات لإبقاء هذا الملف بأمان: chmod 600 id_rsa ستكون Ansible عند هذه النقطة قادرة على استخدام مفاتيح SSH هذه من أجل التواصل مع أي خادوم يمتلك المفتاح مُضمَّنًا عليه. إعداد مضيفي Ansibleتقوم Ansible بتتبّع جميع الخواديم التي يعلم عنها عن طريق ملف المضيفين “hosts”، نحتاج إلى إعداد هذا الملف أوّلًا قبل أن نتمكّن من بدء التواصل مع حواسيبنا الأخرى. نفتح الملف مع صلاحيّات جذريّة root كما يلي: sudo nano /etc/ansible/hosts سنرى ملفًّا يمتلك الكثير من أمثلة الإعدادات، وسيعمل أيّ منها لدينا فعليًّا، لذلك من أجل البدء نقوم بتعليق كافّة أسطر هذا الملف بإضافة “#” قبل كل سطر. سنبقي هذه الأمثلة في هذا الملف لتساعدنا في الإعداد إن أردنا تنفيذ حالات أكثر تعقيدًا في المستقبل. بعد أن يتم تعليق كافّة الأسطر نستطيع البدء بإضافة المضيفين الفعليين لدينا. يكون ملف المضيفين مرنًا إلى حدٍّ ما ويمكن إعداده بعدّة طرق مختلفة، تبدو الصياغة التي سنستخدمها كما يلي: [group_name] alias ansible_ssh_host=server_ip_address إنّ group_name هو وسم تنظيمي يسمح لنا بالإشارة لأي من الخواديم المدرجة بكلمة واحدة، الكنية هي مجرّد اسم للإشارة إلى ذلك الخادوم. لذا نتخيل في حالتنا أننا نمتلك ثلاثة خواديم نريد إعدادها مع Ansible، تكون هذه الخواديم قابلة للوصول من خلال خادوم Ansible بكتابة: ssh root@server_ip_address لن يتم سؤالنا عن كلمة سر إن أعددنا هذا بشكل صحيح، سنفترض أنّ عناوين IP لخواديمنا هي 192.0.2.1، 192.0.2.2، و192.0.2.3، سنقوم بإعداد هذا بحيث نستطيع الإشارة إليها بشكل مفرد كـ host1، host2، وhost3، أو كمجموعة باسم servers. هذه هي الكتلة التي ينبغي إضافتها إلى ملف المضيفين من أجل تحقيق هذا: [servers] host1 ansible_ssh_host=192.0.2.1 host2 ansible_ssh_host=192.0.2.2 host3 ansible_ssh_host=192.0.2.3 يمكن للمضيفين أن يكونوا ضمن مجموعات متعدّدة، وتستطيع المجموعات إعداد مُعامِلات parameters من أجل كل أعضائها، فلنجرّب هذا الآن. إن حاولنا مع إعداداتنا الحاليّة الاتصال بأي من المضيفين عن طريق Ansible فسيفشل الأمر (بافتراض أنّك لا تعمل عن طريق المستخدم الجذري root)، يحدث هذا لأنّه تم تضمين مفاتيح SSH من أجل المستخدم الجذري على الأنظمة البعيدة وستحاول Ansible الاتصال بشكل افتراضي بواسطة المستخدم الحالي، ستعطينا محاولة الاتصال هذا الخطأ: host1 | FAILED => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue نستخدم على خادوم Ansible مستخدمًا يُدعى demo، ستحاول Ansible الاتصال إلى كل مضيف باستخدام ssh demo@server، لن يعمل هذا إن كان المستخدم demo غير موجود على النظام البعيد. نستطيع إنشاء ملف يُخبِر جميع الخواديم في المجموعة servers بالاتصال عن طريق المستخدم الجذري root. لفعل هذا نقوم بإنشاء دليل في بنية إعدادات Ansible يُدعى group_vars، ونستطيع ضمن هذا المجلّد إنشاء ملفّات مُنسّقة عن طريق YAML لكل مجموعة نريد إعدادها: sudo mkdir /etc/ansible/group_vars sudo nano /etc/ansible/group_vars/serversبإمكاننا وضع إعداداتنا هنا، تبدأ ملفّات YAML بـ “—” لذا تأكّد ألّا تنسى ذلك الجزء: --- ansible_ssh_user: rootنحفظ الملف ونغلقه عند الانتهاء. إن أردنا تحديد تفاصيل الإعدادات لكل خادوم بغض النظر عن مجموعته المرتبط بها فبإمكاننا وضع هذه التفاصيل في ملف في المسار /etc/ansible/group_vars/all، يمكن إعداد المضيفين بشكل مفرد بواسطة إنشاء ملفّات في دليل في المسار /etc/ansible/host_vars. استخدام أوامر Ansible بسيطةالآن بعد أن قمنا بإعداد المضيفين وضبطنا تفاصيل الإعدادات بشكلٍ كافٍ للسماح لنا بالاتصال بنجاح إلى مضيفينا، فبإمكاننا تجربة الأمر الأول لنا. نقوم بعمل ping لكل الخواديم التي أعددناها عن طريق كتابة: ansible -m ping allhost1 | success >> { "changed": false, "ping": "pong" } host3 | success >> { "changed": false, "ping": "pong" } host2 | success >> { "changed": false, "ping": "pong" } وهو اختبار بسيط للتأكّد من امتلاك Ansible لاتصال مع كافّة مضيفيه. تعني “all” كافّة المضيفين، وكان بإمكاننا بسهولة تحديد مجموعة كما يلي: ansible -m ping serversنستطيع أيضًا تحديد مضيف بشكل فردي: ansible -m ping host1بإمكاننا تحديد عدّة مضيفين بفصلهم بواسطة نقطتين: ansible -m ping host1:host2المقطع -m ping من الأمر هو تعليمة لـ Ansible كي تستخدم الوحدة “ping”، وهي بشكل مبسّط عبارة عن أوامر نستطيع تنفيذها على مضيفينا عن بُعد، تعمل الوحدة “ping” بعدّة طرق مثل أداة ping العاديّة في Linux، ولكن تقوم بدلًا من ذلك بالتحقّق من أجل اتصال Ansible. لا تأخذ الوحدة ping فعليًّا أيّة مُعطيات arguments، ولكن بإمكاننا تجربة أمر آخر لنرى كيفيّة عمل ذلك، نقوم بتمرير المعطيات إلى script بكتابة –a. تسمح لنا وحدة الصدفة “shell” بإرسال أمر طرفيّة terminal إلى المضيف البعيد واستعادة النتائج، على سبيل المثال لإيجاد استخدام الذاكرة على جهاز مضيفنا host1 نستطيع استخدام: ansible -m shell -a 'free -m' host1 host1 | success | rc=0 >> total used free shared buffers cached Mem: 3954 227 3726 0 14 93 -/+ buffers/cache: 119 3834 Swap: 0 0 0 الخاتمةينبغي أن تمتلك الآن خادوم Ansible مضبوطًا للتواصل مع الخواديم التي ترغب بالتحكم بها، تحقّقنا قدرة Ansible على التواصل مع كل مضيف واستخدمنا الأمر ansible لتنفيذ مهام بسيطة عن بُعد. وعلى الرغم من أنّ هذا مفيد لنا، لم نقم بتغطية أقوى ميّزة في Ansible في هذا الدّرس وهي الـ Playbooks، لقد قمنا بإعداد أساس رائع من أجل العمل مع خواديمنا من خلال Ansible، ولكن الجزء الأكبر سيتم الحديث عنه في درس لاحق عند تغطية كيفيّة استخدام الـ Playbooks لأتمتة الإعدادات لحواسيبنا عن بُعد. ترجمة -وبتصرّف- لـ How to Install and Configure Ansible on an Ubuntu 12.04 VPS لصاحبه Justin Ellingwood.
  7. Ajenti هي لوحة تحكّم عبر الويب حرّة ومفتوحة المصدر يمكن استخدامها لتنفيذ مجموعة كبيرة ومتنوعة من مهام إدارة الخوادم، علاوةً على إمكانية تغطيتها لمجموعة أخرى من المهام عبر تركيب إضافات add-ons كإضافة Ajenti V والتي تسمح بإدارة عدّة مواقع من خلال لوحة تحكم واحدة. المتطلباتفي هذا الدرس ستحتاج إلى: عنوان نطاق domain مُسجّل ومربوط مع خادوم مُثبّت عليه لوحة التحكم Ajenti مع الإضافة Ajenti V (خلال الدرس سأستخدم النطاق example.com للتوضيح).لوحة التحكم Ajenti مُثبتة ومضبوطة بشكل صحيح مع الإضافة Ajenti V، يمكنك قراءة هذا الدرس لتثبيت Ajenti خطوة بخطوة.ضبط عنوان النطاقيُفترض هنا أنك تستطيع الوصول إلى لوحة تحكّم Ajenti الخاصّة بك عبر المسار https://panel.your_domain_name:8000، وقبل البدء بإعداد موقعك على الرابط http://your_domain_name وضبط عناوين البريد لنطاقك ينبغي علينا القيام ببعض تعديلات DNS الضرورية أولًا. حيث يتوجب علينا إضافة سجّلين (records) للتأكد من أن موقعك وعناوين البريد ستعمل كما ينبغي. إن كنت على DigitalOcean مثلا فاذهب إلى الرابط https://cloud.digitalocean.com/domains واضغط على زر View الأزرق (يبدو على شكل عدسة مُكبّرة) لعنوان النطاق الذي قمت بضبطته أثناء إعداد لوحة تحكم Ajenti وAjenti V. انقر على زر Add Record الأزرق ثم اختر MX، في مربع Enter Hostname النصيّ أدخل @ وأدخل الرقم 10 في مربع Enter Priority النصيّ، ثم اضغط على الزرق الأزرق Create MX Record. إذا كنتَ ستضبط عنوان النطاق الذي تستضيف عليه لوحة التحكم Ajenti فأنتَ بحاجة إلى إضافة سجل نصيّ TXT record. إن كان اسم نطاق على مزود خدمة آخر، فعليك الرجوع إلى أدلة المساعدة الخاصة بواجهة المزود لإضافة سجلّي MX و TXT بنفس الطريقة السابقة. على سبيل المثال إذا كان رابط دخول لوحة التحكم لديك يتمّ عبر المسار panel.example.com عليك حينها إضافة هذا السجل، أما لو كانت اللوحة تتبع لنطاق آخر (مثلا panel.otherdomain.com) فلستَ بحاجةٍ إلى شيء إذًا. لإضافة السجل النصيّ TXT record اضغط مجددًا على الزر الأزرق Add Record واختر TXT. في المربع النصيّ Enter Name أدخل @، وفي مربع Enter Text ألصق: v=spf1 a ip4:your_server_ip ~all (استبدل IP برقم الـIP الخاص بخادومك). اضغط أخيرًا على Create TXT Record. الآن يفترض أن تبدو إعدادات DNS الخاصة بنطاقك كهذه، انتبه أنّ عنوان نطاق سيكون بدلًا النطاق المُستخدم هنا jonaharagon.me. أما ملف المنطقة zone file فسيبدو على النحو التالي: $ORIGIN example.com. $TTL 1800 example.com. IN SOA ns1.digitalocean.com.hostmaster.example.com. 1434177047 10800 3600 604800 1800 example.com. 1800 IN NS ns1.digitalocean.com. example.com. 1800 IN NSns2.digitalocean.com. example.com. 1800 IN NS ns3.digitalocean.com. example.com. 1800 IN A 111.111.111.111 example.com. 1800 IN MX 10example.com. example.com. 1800 IN TXT v=spf1 a ip4:111.111.111.111 ~all panel.example.com. 1800 IN A 111.111.111.111 إنشاء مجلد الموقعفي متصفح الويب لديك انتقل إلى https://panel.example.com وسجّل دخولك إلى Ajenti، من الشريط الجانبي، أسفل قسم Web اختر Websites. عند الدخول الأول قد تظهر لك رسالة بأنّ الميزة غير مُفعّلة بعد، اضغط على Enable لتفعيلها والسماح لـ Ajenti V القيام بعدد من عمليات الضبط اللازمة. الآن من قسم New Website لدينا مربع نصيّ بعنوان Name يمكنك فيه كتابة أي معرّف لموقعك. اضغط على الزر Create، وستلاحظ أن موقعك الجديد قد أدرج أسفل قسم Websites في أعلى الصفحة. اضغط على Manage لإدارته. من أسفل قسم Website Files غيّر srv/new-website/ إلى أي مجلد آخر، على سبيل المثال srv/example.com/ اضغط على الزر Set ثم Create Directory. تذكّر الدليل الذي ستحدّده هنا حيث سنرفع إليه الملفات بعد قليل. ومن أسفل علامة التبويب General ألغ التحديد عن خيار Maintenance mode ثم انقر Apply changes أسفل الصفحة. الآن من علامة التبويب Domains أعلى الصفحة اضغط الزر Add واكتب عنوان النطاق الخاص بك في الحقل النصيّ الظاهر ثم انقر على Apply Changes. إنشاء/رفع ملفات الموقعالآن لدينا مجلّد خاص لملفات الموقع، ويتوجب علينا إنشاء أو رفع بعض الملفات إليه. في الشريط الجانبي وأسفل القسم Tools اختر File Manager، انقر على اسم المجلد الذي أنشأته منذ قليل للدخول إليه مثل srv/example.com/ والذي سيكون فارغًا بطبيعة الحال. هنا يمكنك رفع الملفات والمجلدات التي تريد تزويد موقعك بها. لهذا الدرس التعليمي سوف نُنشئ صفحة "!Hello world" بسيطة للموقع. اضغط على الزر New File أعلى الصفحة ليظهر أمامك ملفٌ جديد باسم new file ضمن المجلد. في نهاية السطر الخاص بالملف اضغط على زر القائمة: في حقل Name غيّر القيمة new file إلى index.html ثم اضغط على Save. افتح نفس القائمة مجددًا واختر Edit لفتح الملف ضمن المحرّر النصيّ Notepad. النصّ التالي هو مثال بسيط للتأكد فقط من أنّ كل شيء يعمل كما ينبغي، وبالتأكيد يمكنك كتابة المحتوى الذي ترغب به: <!DOCTYPE html> <html> <head> <title>This website is working!</title> </head> <body> <h1>Hello, world!</h1> <p>If you can read this correctly, your website is functional!</p> </body> </html>اضغط على Save أعلى المُحرّر، لحفظ التعديلات المُدخلة. أعد الخطوة السابقة لكتابة ملفات أخرى للموقع إن رغبت، أو استخدم مدير الملفات لرفع ملفات كنتَ قد كتبتها بالفعل على جهازك. عُد إلى File Manager ثم توجّه إلى أسفل الصفحة لتجد زرًا باسم Choose File، يمكنك من هنا رفع الملفات إلى موقعك عبر مربع اختيار بسيط. تصفّح موقعكفي متصفح الويب انتقل إلى عنوان موقعك مثل http://example.com، وحالما ترى صفحة "!Hello World" التي قمنا بإنشائها قبل قليل فهذا يعني بأن كلّ شيء يعمل كما يجب. إلى هنا نكون قد أنهينا شرح كيفية إنشاء موقع باستخدام لوحة التحكّم Ajent، سنتحدث الآن عن إنشاء عناوين بريد باستخدام نطاقك الخاص. إنشاء عناوين البريدمن لوحة تحكّم Ajenti الخاصّة بك وأسفل القسم Web انقر على Mail ثم اضغط Enable إذا طلب منك. أسفل New Mailbox يتوجب عليك ملئ عدّة خانات. أدخل في المربع النصيّ Address مُعرّف عنوان البريد الذي يَسبق عادةً الإشارة @، فإذا أدخلت sammy على سبيل المثال فسيكون عنوان البريد كاملًا sammy@example.com، هناك أيضًا قائمة منسدلة لاختيار عنوان النطاق الذي سيُسجّل البريد من خلاله فيما لو كنتَ تدير عدّة مواقع باستخدام Agenti V. أبق خانة Custom domain فارغة، وبعد ذلك انقر على + Mailbox. كما ترى فإن عنوان البريد الجديد سيظهر أسفل القسم Mailboxes ضمن الصفحة. انقر عليه ثم اختر Change password لإدخال كلمة مرور جديدة لصندوقك. اضغط على ENTER ثم Apply Changes أسفل الصفحة. الآن انتقل إلى علامة التبويب Advanced من أعلى الصفحة ومن قسم TLS حدّد صندوق التفعيل بجوارها ثم انقر على Generate new certificate بعد الانتهاء اضغط Apply changes أسفل الصفحة. تزيد هذه الخطوة من آمان اتصالك بصندوق البريد وتحسّن من توافقه مع عملاء البريد الإلكتروني. لاستقبال البريد الخاص بك يمكنك الاتصال عبر أحد عملاء سطح المكتب أو الأجهزة الذكية (مثل Outlook, Thunderbird, K-9 Mail الخ) أو يمكنك تركيب RainLoop كتطبيق وِب للوصول إلى صناديق البريد الخاصة بموقعك من خلال المتصفح عبر Ajenti. إليك أخيرًا معلومات الاتصال بصندوق البريد الخاص بك لتزويدها للعميل الذي ترغب باستخدامه: Username: user@example.com Password: your_mailbox_password IMAP Server: panel.example.com IMAP Port: 143 IMAP Encryption: STARTTLS (Accept all certificates) SMTP Server: panel.example.com SMTP Port: 25 SMTP Encryption: None الخاتمةيُفترض أنك قد نجحت الآن بإنشاء موقع ويب خاص بنطاقك بالإضافة إلى صندوق بريد من خلال لوحة التحكم Ajenti والتي تُمكّنك من إدارتهما بكلّ سهولة في الوقت عينه. ترجمة -وبتصرف- للمقال: Creating a Website and an Email Account on Ajenti V لصاحبه: Jonah Aragon.
  8. عند كتابة نص أو مقال ما، فأنت في الأغلب ستضيف له بعض الصور، أو الفيديو أو رسومات لتوضح المحتوى بشكل أكبر. والأغلب أنك ستضيف لكل منه نصا تقوم فيه بشرح مفهوم الصورة، وقد ترغب بترقيم الصور حتى لا يضيع القارئ، وهذا ما سنقوم به عبر استخدام عنصر <figure> مع المُرقمات (counters). عنصر figureإن عنصر <figure> صُمم ليستخدم جنبا إلى جنب مع <figcaption> لاحتواء الصور وما شابه. هذا هو شرح <figure> في وصف لغة HTML الرسمي: هكذا نقوم بإضافة figure : <figure> <img src="path/to/your/image.jpg" alt="" /> <figcaption>Here is the legend for your image<figcaption> </figure>هناك بعض الملاحظات بشأن العنصر: عنصر <figcaption> اختياري. تستطيع استخدام عنصر <figcaption> واحد فقط داخل عنصر <figure>.تستطيع إدراج أيّ عدد تشاء من العناصر داخل <figure>. إذا كنت ستدرج صورة فتستطيع ترك alt فارغة إذا كنت ستدرج <figcaption> حتى لا تقوم برامج قراءة الشاشة بقراءة نفس المحتوى مرّتين.للمزيد من المعلومات حول <figure> ألق نظرة على هذه المصادر: HTML5Doctor Mozilla Developer Network W3C Specificationأمثلة:إذا أردت أن تظهر شيفرة برمجية ما، فتستطيع استخدامه بهذه الطريقة: <figure> <code>body { background: white; }</code> <figcaption>Some illustrated code with figure<figcaption> </figure>بدل إدراج صورك بهذه الطريقة: <img src="cute-kitty.jpg" alt="This is a cute kitty!" />تستطيع إدراجها بهذه الطريقة: <figure> <img src="cute-kitty.jpg" alt="" /> <figcaption>This is a cute kitty!<figcaption> <figure>دعم المتصفحاتعنصر <figure> يعتبر من أحد عناصر HTML5 الجديدة، ولذا فهو ليس مدعوما من قبل المتصفحات القديمة (IE 8) ولكن لا أحد يهتم صراحة. ولكن إن كنت مُهتمًا بدعم المُتصفّحات القديمة فتستطيع استخدام html5shiv ليظهر الوسم بشكل عادي. المُرقّمات في CSSأحد أكثر خصائص CSS ديناميكة وأقلها شهرة هي CSS Counter فهي تسمح لك بترقيم العناصر ديناميكيا عبر CSS فحسب، بدون الاستعانة بأيّ شيء آخر. استخدام المرقمات يكون عبر خاصيتين وقيمة وهما: counter-reset والتي تستخدم لتهيئة أو إعادة تهيئة مرقم أو أكثر. counter-increment والتي تستخدم لزيادة قيمة مرقم أو أكثر. ()counter وهي قيمة تستخدمها مع before:: أو after:: والتي تقبل اسم المرقم كقيمة من أجل أن تظهر القيمة.الأمر بسيط. كل ما تقوم به هو تهيئة عدّاد ما بالاسم الذي تريده، ثم تحدد لمجموعة عناصر ما أن تقوم بزيادة تلك القيمة كلنا ظهر أحدها. ويمكن إظهار هذه القيمة عبر CSS باستخدام before:: و after::. مثال بسيط للعداد: /* 1. نقوم بتهيئة المرقم (أو العداد) */ body { counter-reset: thisSuperCoolCounter; } /* 2. نحدد أنه في كل مرة يظهر فيها هذا العنصر نرفع قيمة المرقم */ .myAwesomeElement { counter-increment: thisSuperCoolCounter; } /* 3. نقوم بإظهار قيمة العداد قبل العنصر */ .myAwesomeElement:before { content: counter(thisSuperCoolCounter); }مثال بسيطحسنا نعود للموضوع الأساسي الذي يدور حوله الدرس، نريد ترقيم صورنا حتى تظهر قبلها Fig. 2 – … Fig. 1 – … وهكذا. .article { counter-reset: figures; } .figure { counter-increment: figures; } .figure figcaption:before { content: 'Fig. ' counter(figures) ' - '; }إعداد كل شيءالأساسياتبعد أن فهمنا كيف نستخدم عنصر <figure> وكيف تعمل المرقمات في CSS حان الوقت لاستخدامها في ترقيم الصور. نقوم بإعداد وسم <figure> ببعض الأمور البسيطة: .figure { padding: 0.9em; border: 3px solid #f5bca8; background: #fff; margin: 0 auto 1em; }ثم نريد أن نحاذي الصور في وسط عنصر <figure> ونمنعهم من الخروج عن حجم الحاوي لذا نضيف التالي: .figure img { margin: 0 auto; display: block; max-width: 100%; } الآن بالنسبة لوصف الصّورة (caption) وسنجعلها تبرز أكثر بتوسيطها وجعل الخط بارزًا. فقط تذكر أنّ الهدف من الوصف أن يضيف شرحًا بسيطا، وأن إزالته لن تشكل مشكلة في الفهم فلا داعي لأن تضيف فقرة هناك. .figure figcaption { font-weight: 700; font-size: 0.8em; padding: .5em; text-align: center; color: #fff; background: #f5bca8; }الترقيمحان الوقت لإضافة الترقيم للصور، وإضافته سهلة كما رأينا سابقا. .article { counter-reset: figures; } .figure figcaption { counter-increment: figures; } .figure figcaption:before { content: 'Fig. ' counter(figures) ' - '; }الإضافات البسيطةنريد أن نضيف طريقة سهل لجعل الصور تتمركز على يمين المحتوى أو على يساره، وسنقوم بذلك عبر إضافة التالي: .figure-left { float: left; margin: 0 1em .5em 0; width: -webkit-min-content; width: -moz-min-content; width: min-content; } .figure-right { float: right; margin: 0 0 .5em 1em; width: -webkit-min-content; width: -moz-min-content; width: min-content; }إنّ min-content هي قيمة صحيحة لكل من الخواص التالية min-height min-width max-height max-widthheight width. في حالتنا، نريد من figure أن يكون بأصغر قدر ممكن، أو بالأحرى نريد من عرضه أن يكون هو نفس عرض الصورة التي هي بداخله. لأن figure هو عنصر بحجم كامل (block) فسوف يتمد عرضه إلى كامل الحاوي (100%). نستطيع استخدام float: left أو display: inline-block لجعل عرضه يقل إلى أكبر عنصر داخله، ولكن ماذا سيحدث لو كان الوصف أكبر من حجم الصورة، فستحدث مشكلة. نستطيع أن نحدد عرض العنصر يدويًّا، ولكن الأمر غير منطقي وغير ديناميكي، لهذا استخدمنا قيمة min-content، فهي بكل بساطة تخبر عنصر figure أن يقلل من حجمه إلى حجم الصورة مثال: See the Pen pJLXde by Hsoub Academy (@HsoubAcademy) on CodePen. الخاصية مدعومة من قبل فيرفكس باستخدام -moz- و chrome باستخدام -webkit-. المتصفحات التي لا تدعم الخاصية ستتصرف كما هو متوقع منها، لن يتم تعيين أيّ عرض وسيكون عرضه هو عرض أكبر عنصر داخله. ملاحظة: يوجد قيم أخرى وهي max-content و fit-content و available. اطلع على التوثيق للمزيد من المعلومات. وأخيرًا وليس آخرا، نريد أن نغير أو نحذف العرض الأقصى الذي حددناه للصور التي ستميل لليمين أو لليسار، فإذا أردت أن تأخذ الصور حجمها الطبيعي فاستخدم max-width: none وإذا أردت عرضا أقصى فاستخدم التالي: .figure-right img, .figure-left img { max-width: 300px; /* عدل على حسب حاجتك */ }توافق الشاشات الصغيرةلنتأكد من العناصر التي نحاذيها لا تتصرف بغرابة في شاشات الهواتف الصغيرة سنقوم ببعض التعديلات حتى تأخذ العناصر كامل العرض وتتوسط الصفحة أفقيا: @media (max-width: 767px) { .figure-left, .figure-right { float: none; margin: 0 0 1em 0; width: 100%; } .figure img { max-width: 100%; } }الاستخداماستخدام ما قدمناه شيء بسيط، إما أن تستخدم صورا تستغل كامل المساحة عبر استخدام figure. أو تريد أن تحاذي الصور لليمين أو لليسار فتستخدم كل من figure. وfigure-left. أو figure-right. <figure class='figure'> <img src="path/to/your/image.jpg" alt="" /> <figcaption>Here is the legend for your image<figcaption> </figure> <figure class='figure figure-left'> <img src="path/to/your/image.jpg" alt="" /> <figcaption>Here is the legend for your image<figcaption> </figure> <figure class='figure figure-right'> <img src="path/to/your/image.jpg" alt="" /> <figcaption>Here is the legend for your image<figcaption> </figure>خاتمةهذا كان كل شيء، كل ما تبقى هو أن تطبقها في موقعك، جرب إلقاء نظرة على المثال لترى مثالا عمليا. ترجمة وبتصرّف للمقال: Automatic Figure Numbering with CSS Counters لصاحبه: Hugo Giraudel. جميع حقوق المقال محفوظة لموقع codrops.
  9. ما هو Cron؟Cron هي أداة جدولة تسمح لك بتخصيص المهام ليتمّ تشغيلها في أوقاتٍ مضبوطة بشكل مُسبق، حيث يمكن أن تُستخدم لأتمتة أي شيء تقريبًا على نظام التشغيل الخاص بك لا سيما تلك المهام التي يجب أن تُشغّل على فترات منتظمة. تُعتبر Cron أداةً أساسيّة لمديري الأنظمة إذ تبرع في المهام الروتينيّة التي ينبغي تنفيذها كلّ ساعة/يوم بالمقدار الذي تبرع فيه تجاه المهام التي يجب القيام بها مرةً أو مرتين في العام. نناقش في هذا الدرس كيفيّة استخدام Cron من خلال سطر الأوامر، وفهم ملف الضبط الخاص بها، إضافةً إلى حديثنا عن Anacron، وهي الأداة التي يمكن استخدامها لضمان تشغيل المهام حتى عندما يتم إيقاف تشغيل الخادوم لبعض الوقت. سوف نستخدم في درسنا هذا توزيعة Ubuntu 14.04، ويمكنك بالتأكيد تطبيق الشرح هنا على أي توزيعة غنو لينكس أخرى. كيف تعمل Cron؟تبدأ Cron مع إقلاع النظام وتعمل في الخلفية مع باقي خدمات Daemon، وهذا يعني أنها تعمل دون تدخّل من قبل المستخدم مُترقبةً أحداثًا معينة لتشغيل المهام المضبوطة. بالنسبة لـ Cron فإن هذه الأحداث هي مواقيت محدّدة من الزمن، حيث يعمل Cron في الخلفية ويتحقّق كلّ دقيقة فيما إذا كان من المقرّر تشغيل أمر ما هذه الدقيقة، وذلك تبعًا لملف الضبط الخاص به، وفي حال الإيجاب يُنفّذ Cron الأوامر المُحددّة له بشكل مسبق لهذه اللحظة، ومن ثم يعود للعمل ضمن الخلفية مترقبًا الدقائق القادمة، أما في حال النفي فإنه سينتظر لستين ثانية قبل أن يعاود تحقّقه. ونظرًا لأسلوبه في الجدولة والفحص دقيقةً بدقيقة؛ فإنه يعتبر قابلًا للضبط بشكل مرن للغاية، وحالما تُثبّت Cron على توزيعة غنو لينكس لديك فإنه سيضُبط لتشغيل مجموعة متنوعة من المهام. كيفيّة قراءة Crontabيُقرّر Cron ما هي الأوامر التي سيتم تشغيلها وفي أي توقيت من خلال قراءة مجموعة من الملفات التي يُعرف كلّ منها باسم "crontab"، يمكنك على سبيل المثال مشاهدة ملف "crontab" المطبّق على مستوى النظام system-wide بالنظر إلى محتويات الملف "etc/crontab/": less /etc/crontabSHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts –report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.monthly )يُمثّل الخرج السابق ملف crontab الخاص بالنظام والذي لا ينبغي تعديل محتوياته في معظم الحالات، لذا يجدر بك دومًا كتابة ملف crontab خاص بك، إضافةً إلى أن الملف الخاص بالنظام معُرض للاستبدال عند تحديث النظام مما يعرّض تعديلات للضياع. بكل الأحوال يحتوي الملف السابق على بضعة أجزاء مُهمّة والتي نحتاج إلى فهمها. يُحدِّد أول سطرين الصدفة shell التي ستُنفذ الأوامر المدرجة، والمسار الذي توجد به هذه الأوامر. بينما يُحدّد ما تبقى من الملف الأوامر المجدولة مع مواقيتها، حيث كل سطر في هذه القائمة يمثّل سِجلًا أو صفًا في جدول، بينما تشير مسافات "tab" إلى أعمدة هذا الجدول، وتُمثّل كل خلية بأعمدة مفصولة بمسافات أو علامات تبويب tabs. أما سطر التعليقات (والذي يبدأ بإشارة #) فيشرح ما يمثّله كل عمود من الأعمدة.جدولة الساعات والدقائق باستخدام Cronيُخصّص العمود الأول لدقائق الساعة التي يفترض أن يُنفذ بها الأمر ويأخذ قيمة ضمن (0-59)، بينما يُحدّد العمود الثاني قيمة "ساعة من اليوم" ضمن (0-23)، وتعني علامة النجمة (*) "كل قيمة ممكنة" وتستخدم كعلامة شاملة. من خلال الجمع بين هذين العمودين نحصل على التوقيت الزمني للأمر. على سبيل المثال يحتوي السطر الثاني في الجدول على الرقم 25 ضمن عمود الدقائق و 6 لعمود الساعات: 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) وهذا يعني أن السطر الثاني سيُشغّل في الساعة 6:25 صباحًا. وبالمثل يُشغِّل السطر الأول الأمر الخاص به في الدقيقة 17 من كل ساعة: 17 * * * * root cd / && run-parts --report /etc/cron.hourly لذا سيتم تشغيله في الساعات 1:17am ،2:17am ،3:17am ...الخ جدولة الأيام باستخدام Cronتُحدّد كلًا من العمود الثالث، الرابع، والخامس؛ الأيام التي يجب أن تُشغِّل الأوامر، حيث يُحدِّد العمود الثالث قيمة "يوم من الشهر" ضمن المجال (1-31) (لا تنسَ أن الشهور مختلفة بعدّد أيامها؛ لذا كن حذرًا)، ويحدّد العمود الرابع أيّ الشهور التي ستُنفّذ فيها الأوامر ويأخذ قيمة من (1-12)، بينما يُحدّد العمود الخامس أي يومٍ من أيام الأسبوع التي يجب أن تنفّذ فيها الأوامر ويأخذ قيمة من (0-7). حيث يمكنك الجدولة باستخدام واحدة "الأسبوع" عوضًا عن "الشهر". إذا لم تتطابق خانتا "اليوم من الأسبوع" و "اليوم من الشهر" فإن الأمرّ سينفّذ إذا تحقّق أيٍ منهما. كما يمكن تحديد أيام الأسبوع والأشهر باستخدام الأحرف الثلاثة الأولى من أسمائها. إضافةً للنجمة يمكن استخدام الشرطة (-) لتحديد نطاق ما، واستخدام الفاصلة (,) لتحديد قيم متعدّدة. كما يمكننا تحديد "فاصل زمني" بإتباع قيمة ما مع إشارة "/"، فعلى سبيل المثال لتنفيذ الأمر كل ساعة يمكننا استخدام "*/2" في عمود الساعات. إذا نظرنا إلى ملف crontab سنلاحظ أن السجل الثالث يُشغّل كل أحد الساعة 6:47 صباحا: 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) أما السجل الرابع فهو يعمل أوّل كل شهر في الساعة 6:52 صباحًا: 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )استخدام اختصارات الوقت للجدولةيمكننا استبدال الأعمدة الخمسة الأولى من كل سجل بـ "مُسمى مختصر" إذا لم يكن لديك طلبًا مُعقّدًا، صيغة الاختصار تبدأ بإشارة "@" ويتلوها مُسمى الفترة. فعلى سبيل المثال يمكننا جدولة أمر بحيث يُنفّد كل أسبوع بتحديد "weekly@" بدلًا من إنشاء سجل بخمسة أعمدة، الخيارات الأخرى هي: "yearly" ،"@monthly" ،"@daily@" و "hourly@" إضافةً لذلك لدينا الاختصار "reboot@" والذي يعمل فقط عند تشغيل النظام وبدء تشغيل cron، ولهذا يُسمى بـ "reboot@" وليس "cron-restart"أو شيئًا من هذا القبيل. ضع في اعتبارك دومًا أن هذه الاختصارات لا توفّر إمكانيات تخصيص الأعمدة الخمسة، وبدلًا من ذلك فإنها تضبط الأوامر بحيث تعمل عند أول لحظة ممكنة تتطابق مع الاختصار. فعلى سبيل المثال يُشغّل الاختصار "monthly@" الأمر في منتصف الليل من أوّل الشهر، ما يعني أن جميع الأوامر المضبوطة على هذا الاختصار ستعمل في وقتٍ واحد، حيث لا إمكانية لترتيب هذه الأوامر كما مع أسلوب الأعمدة الخمسة في الضبط. تخصيص الأوامر والمستخدمين مع Cronيشمل العمود السادس والموجود فقط في ملف crontab الخاص بالنظام على اسم المستخدم الذي سيُنفّد الأمر من خلاله. بينما يُحدّد العمود الأخير الأوامر المطلوب تشغيلها، يمكن للأمر أن يحتوي على علامة النسبة المئوية (%) والتي تعني أن كل ما هو بعدها يتم تمريره إلى الأمر كدخل قياسي. ليعمل ملف crontab بشكل صحيح يجب إنهاء كل سجل مع محرف سطر جديد، هذه ليست مشكلة بالنسبة لمعظم السجلات، لكن تأكد من وجود سطر فارغ بعد آخر مُدخل ضمن الملف، وإلا فإنه لن يعمل كما يجب. استخدام ميزة “run-parts” والأدلةلو تمعّنا في الأوامر المكتوبة ضمن ملف crontab السابق والخاص بالنظام، فسنشاهد إشارة إلى ما يسمى "anacron" (المزيد عن ذلك لاحقًا)، إضافةً لـ "run-parts". يتيح لنا الأمر "run-parts" ببساطة تشغيل كل أمر قابل للتنفيذ ضمن مجلّد محدّد، ويستخدم هذا الأسلوب على نحو واسع مع cron لأنه يتيح لنا تشغيل سكربتات scripts عديدة في توقيتٍ واحد عن طريق وضعها في مكانٍ واحد، وهو ما يسمح لأن يبقى ملف crontab مرتبًا وبسيطًا، ويسمح لنا بجدولة المزيد من المهام عن طريق وضعها (أو إنشاء اختصار لها) كسكربتات في الدليل المناسب بدلًا من تعديل ملف crontab. عادةً ما تُخصّص معظم التوزيعات مجلد لكل فترة بحيث يتم وضع السكربتات بها ليتم تشغيلها في تلك الفترة، فعلى سبيل المثال تخصص توزيعة Ubuntu المجلدات التالية: cron.daily ،cron.hourly cron.monthly وcron.weekly. إنشاء ملفات Crontabs للمستخدمينبعد استعراضنا لأساسيات التعامل مع Cron يمكنك الآن البدء بجدولة المهام الخاصة بك عن طريق استخدام الأمر "crontab". لاحظ أن ملف "crontab" الخاص بك لن يحتوى عمود "المستخدم"، لأنه سيتم تشغيل الأوامر المضمّنة به من خلال امتيازات المستخدم الخاصّة بك. لمعرفة الـ crontab الحالي، اكتب: crontab -l غالبًا فلن يكون هناك ملف مسبق إلا إذا كنت قد أنشأت واحدًا بشكل يدويّ، وفي هذه الحالة فمن الأفضل أخذ نسخة احتياطية من الملف الحالي قبل البدء بالتحرير بحيث يمكنك التراجع عن أي تغييرات قد تقوم بها. لأخذ نسخة احتياطية إلى مجلد المنزل باسم "cron.bak"، نفّذ الأمر: crontab -l > ~/cron.back للبدء بتحرير ملف crontab اكتب: crontab -eno crontab for demouser - using an empty one Select an editor. To change later, run ‘select-editor’. 1. /bin/nanoاستخدام Anacron مع Cronواحدة من أكبر نقاط ضعف Cron افتراضها أن خادومك أو جهاز الحاسوب الخاص بك يعمل طوال الوقت 24/7، حيث يُلغى تنفيذ كل مهمة مجدولة في وقتٍ يكون فيه حاسوبك مطفئًا. يعتبر ذلك مشكلة خطيرة مع الأنظمة التي لا يمكن ضمان تشغيلها طوال الوقت، وكحلّ لهذه المشكلة تم تطوير أداة Anacron المبنية على anachronistic لضمان تنفيذ الأوامر طوال الوقت. يستخدم Anacron المُعاملات غير المُفصّلة في خيارات Cron، وهذا يعني أن Anacron تكمل عمل Cron وليست بديلًا عنه. أسلوب عمل Anacron يعتمد على إنشاء ملفات بأختام زمنية time-stamped عند تنفيذ أمر ما مجدول من خلال Cron، فإذا كان الأمر قد جُدول للتنفيذ بشكل يومي إلا أنه قد تم إيقاف تشغيل الحاسوب في الوقت الذي يفترض أن يُنفّذ به الأمر، فعندما يعمل anacron في المرة التالية سيرى أنه قد مضى أكثر من 24 ساعة على آخر تنفيذ للجدول اليومي وهذا ما يعني فوات موعده، فيقوم بتنفيذ الأوامر المجدولة. تملك الأداة anacron جدولًا للمواعيد مثل Cron يدعى "anacrontab" ويخزّن في دليل "etc/" كذلك. لنلقي نظرة كيف يبدو: less /etc/anacrontab# /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # These replace cron’s entries 1 5 cron.daily nice run-parts –report /etc/cron.daily 7 10 cron.weekly nice run-parts –report /etc/cron.weekly @monthly 15 cron.monthly nice run-parts –report /etc/cron.monthlyبالعموم فإن بنية الملف شبيهة بملفات crontab السابقة مع عدد أعمدة أقل، وبعض الملاحظات الجديرة بالانتباه. يُحدّد العمود الأول عدد المرات التي يجب تنفيذ الأمر بها تبعًا للأيام، فالقيمة "1" تعني أنّه جيب تشغيل الأمر يوميًا، بينما تشغّل القيمة "3" الأمر كل ثلاثة أيام. يُحدّد العمود الثاني التأخير الزمني قبل تنفيذ الأوامر، حيث لا يعمل Anacron في الخلفية daemon بل يتم تشغيله بشكل صريح لمرة واحدة، وهذا يسمح بتنظيم العمل، فلا تُنفّذ جميع الأوامر دفعةً واحدة. على سبيل المثال يُشغّل السطر الأوّل كل يوم بعد خمس دقائق من استدعاء anacron: 1 5 cron.daily nice run-parts --report /etc/cron.daily بينما يُشغّل السطر التالي أسبوعيًا (كل سبعة أيام) بعد عشرة دقائق من استدعاء anacron: 7 10 cron.weekly nice run-parts --report /etc/cron.weekly يحتوي العمود الثالث على الاسم الذي سيعرّف مهمة السطر في رسائل anacron وفي سجلات النظام، بينما يحتوي العمود الرابع على الأوامر الفعليّة التي سيجري تشغيلها. يمكنك أن ترى أنه قد تم تعيين anacron لتشغيل بعض السكربتات التي تُنفّذ أيضًا من قبل Cron، ولدرء التعارض تلجئ التوزيعات عادةً إلى إعطاء أولوية لإحدى الأداتين على الأخرى بحيث تعمل واحدة منهما فقط على تنفيذ الأمر المجدول. في توزيعة Ubuntu مثلًا يختبر ملف "/etc/crontab/" إذا كانت anacron مُثبّتة على النظام، بحيث يُشغّل السكربتات النصيّة في أدلة cron فقط في حال لم يتم العثور على anacron. بعض التوزيعات تتبع أسلوب آخر بجعل cron يُحدّث الأختام الزمنية ل anacron في كل مرّة يتم فيها تنفيذ مهمة مجدولة مما يمنع anacron عن تنفيذ نفس الأمر عند استدعاءه. خاتمةتعتبر أداتي cron و anacron من أفضل أدوات أتمتة تنفيذ المهام الروتينية، لذا من المهم استيعاب كيفية الاستفادة من نقاط القوّة في كلّ منهما وتجنب نقاط ضعفهما مما يعطيك أقصى قدر من الفائدة والفعالية. ورغم أنه قد يبدو أمر إعدادهم للمرة الأولى مربكًا بعض الشيء، إلا أن ذلك سيوفّر عليك الكثير من الوقت على المدى الطويل في تكرار العمليات مرّةً بعد أخرى دون أن تحتاج غالبًا لتعديلات تذكر على ملفات الإعداد لاحقًا.