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

البحث في الموقع

المحتوى عن 'نشر'.

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

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

نوع المحتوى


التصنيفات

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

التصنيفات

  • مقالات برمجة عامة
  • مقالات برمجة متقدمة
  • PHP
    • Laravel
    • ووردبريس
  • جافاسكربت
    • لغة TypeScript
    • Node.js
    • React
    • Vue.js
    • Angular
    • jQuery
    • Cordova
  • HTML
  • CSS
    • Sass
    • إطار عمل Bootstrap
  • SQL
  • لغة C#‎
    • ‎.NET
    • منصة Xamarin
  • لغة C++‎
  • لغة C
  • بايثون
    • Flask
    • Django
  • لغة روبي
    • إطار العمل Ruby on Rails
  • لغة Go
  • لغة جافا
  • لغة Kotlin
  • لغة Rust
  • برمجة أندرويد
  • لغة R
  • الذكاء الاصطناعي
  • صناعة الألعاب
  • سير العمل
    • Git
  • الأنظمة والأنظمة المدمجة

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

  • الإنتاجية وسير العمل
    • مايكروسوفت أوفيس
    • ليبر أوفيس
    • جوجل درايف
    • شيربوينت
    • Evernote
    • Trello
  • تطبيقات الويب
    • ووردبريس
    • ماجنتو
    • بريستاشوب
    • أوبن كارت
    • دروبال
  • الترجمة بمساعدة الحاسوب
    • omegaT
    • memoQ
    • Trados
    • Memsource
  • برامج تخطيط موارد المؤسسات ERP
    • تطبيقات أودو odoo
  • أنظمة تشغيل الحواسيب والهواتف
    • ويندوز
    • لينكس
  • مقالات عامة

التصنيفات

  • آخر التحديثات

أسئلة وأجوبة

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

التصنيفات

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

ابحث في

ابحث عن


تاريخ الإنشاء

  • بداية

    نهاية


آخر تحديث

  • بداية

    نهاية


رشح النتائج حسب

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

  • بداية

    نهاية


المجموعة


النبذة الشخصية

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

  1. يعرّف هذا المقال منصَّة Kubernetes، نتناول فيه ثلاث نقاط مهمة، وهي: ما Kubernetes؟ كائنات Kubernetes Objects مرحبا Miniku ما Kubernetes؟ هذا الجزء عبارة عن نظرة عامة على Kubernetes، نتناول فيه ما يلي: نظرة على نشر التطبيقات قبل وجود Kubernetes. لماذا نحتاج Kubernetes وما الذي يمكنه فعله؟ الحالات التي لا ينفع فيها Kubernetes. Kubernetes هو منصة مفتوحة المصدر قابلة للنقل والتوسيع لإدارة أعباء العمل والخدمات الموجودة في حاويات، والتي تُسهِّل كلًا من الضبط التصريحي (Declarative) والأتمتة (Automation). تتوفّر منصة Kubernates على نظام بيئي غني وسريع النمو، كما أن دعم المنصة، وخدماتها، وأدواتها مُتاحة على نطاقٍ واسع. تنحدر كلمة Kubernetes من اليونانية، وتعني قائد الدّفة أو الطيار. جعلت غوغل مشروع Kubernetes مفتوح المصدر عام 2014. تستند Kubernetes على عقد ونصف من الخبرة التي تتمتع بها Google في تشغيل أعباء الإنتاج على نطاق واسع، جنبًا إلى جنب مع أفضل الأفكار والممارسات التي يقترحها المجتمع. نظرة على نشر التطبيقات قبل وجود Kubernetes دعنا نلق نظرة على الماضي لنفهم السبب الذي يجعل Kubernetes مفيدًا جدا. عصر النشر التقليدي في البداية، كانت المؤسسات تشغّل التطبيقات على خوادم فعلية (Physical Servers). لم تكن هناك طريقة لتعريف حدود على موارد التطبيقات في الخادم الفعلي، وقد تسبب ذلك في مشكلات تخصيص الموارد. على سبيل المثال، إذا شُغّلت تطبيقات متعددة على خادم فعلي، فقد تكون هناك حالات يستهلك فيها تطبيق واحد معظم الموارد، ونتيجة لذلك، يتراجع أداء التطبيقات الأخرى. قد يكون الحل لتلك المشكلة هو تشغيل كل تطبيق على خادم فعلي مختلف، إلّا ذلك لم يُحدِث فارقًا، إذ كانت الموارد غير مستغلة، وكان مكلفًا للمؤسسات استخدام الكثير من الخوادم الفعلية. عصر النشر الافتراضي قُدّمت الحوسبة الافتراضية (Virtualization) كحل يتيح لك تشغيل العديد من الأجهزة الافتراضية (Virtual machines، أو VM اختصارا) على وحدة المعالجة المركزية (CPU) لخادم فعلي واحد. تسمح المحاكاة الافتراضية بتقسيم التطبيقات بين الأجهزة الافتراضية وتوفِّر مستوى من الأمان إذ لا يمكن الوصول إلى معلومات أحد التطبيقات من خلال تطبيق آخر. تتيح المحاكاة الافتراضية استغلالًا أفضل للموارد في الخادم الفعلي وتتيح قابلية تطوير أفضل لأنه يمكن إضافة تطبيق أو تحديثه بسهولة، ويقلل من تكاليف العتاد (Hardware)، وأكثر من ذلك بكثير. يمكنك من خلال الحوسبة الافتراضية تقديم مجموعة من الموارد المادية على شكل مجموعة من الأجهزة الافتراضية القابلة للتدوير. كل آلة افتراضية عبارة عن آلة كاملة تقوم بتشغيل جميع المكونات، بما في ذلك نظام التشغيل الخاص بها، على الآلات الافتراضية. عصر النشر على الحاويات (Containers) تتشابه الحاويات مع الآلات الافتراضية، لكن لها خصائص عزل مريحة لمشاركة نظام التشغيل (OS) بين التطبيقات. لذلك، تعدّ الحاويات خفيفة. تحتوي الحاوية، على غرار الآلة الافتراضية ، على نظام ملفات (File System) خاص بها، ووحدة معالجة مركزية (CPU)، وذاكرة حية (Memory)، وفضاء معالجة (Process Space)، والمزيد. يمكن نقل الحاويات بين سحابات (Clouds) وتوزيعات نظم تشغيل مختلفة، نظرًا لكونها غير مقترنة بالبنية التحتية التي تعمل عليها. أصبحت "الحاويات" شائعة لأنها توفر فوائد إضافية، مثل: إنشاء ونشر تطبيقات مرنة (Agile Applications): سهولة وكفاءة إنشاء صور الحاويات مقارنة باستخدام صور الآلات الافتراضية. التطوير المستمر والتكامل والنشر (CD/CI): يُوفَّر بنية تحتية لبناء صور موثوقة ومتكررة للحاويات ونشرها مع إمكانية التراجع السريع والسهل (بسبب ثبات الصورة). فصل الاهتمامات بين التطوير وإدارة العمليات: إنشاء صور الحاويات عند إنشاء التطبيق أو أثناء إصداربدلاً من إنشائها عند نشر التطبيق، وبالتالي فصل التطبيقات عن البنية التحتية. سهولة الملاحظة: لا تقتصر الملاحظات على المعلومات والمقاييس على مستوى نظام التشغيل، بل تتعذّاه إلى سلامة التطبيق وإشارات أخرى. الاتساق البيئي عبر التطوير والاختبار والإنتاج: يعمل بنفس الطريقة على الحاسوب المحمول كما هو الحال في السحابة. قابلية التوزيع بغض النظر عن السحابة ونظام التشغيل: تعمل على أوبونتو، ردهات (RHEL)، CoreOS، لدى العميل أو على السحابات العامة الرئيسية، وفي أي مكان آخر. إدارة تتمحور حول التطبيقات: ترفع مستوى التجريد من تشغيل نظام تشغيل على آلات افتراضية إلى تشغيل تطبيق على نظام تشغيل باستخدام الموارد المنطقية. خدمات صغيرة (Micro services) موزعة، ومرنة، ومتحررة وذات اقتران محدود: تُقسَّم التطبيقات إلى قطع أصغرومستقلة يمكن نشرها وإدارتها ديناميكيًا، وليس مكدسًا (Stack) متجانسًا يعمل على آللة واحدة كبيرة أحادية الغرض. عزل الموارد: إمكانية التنبؤ بأداء التطبيقات. استغلال الموارد: كفاءة وكثافة عالية. لماذا تحتاج Kubernetes ومالذي يمكن أن يفعله تُعَد الحاويات طريقة جيدة لتجميع التطبيقات وتشغيلها. في بيئة الإنتاج، تحتاج إلى إدارة الحاويات التي تشغّل التطبيقات والتأكد من عدم وجود وقت تعطل. على سبيل المثال، في حالة تعطل الحاوية، يجب أن تبدأ حاوية أخرى. ألن يكون أسهل إذا كان النظام هو ما يتعامل مع هذا السلوك؟ هنا يأتي دور منصة Kubernates. يوفر لك Kubernetes إطار عمل لتشغيل أنظمة موزعة متكيّفة، ويعتني بتحجيم (Scaling) التطبيقات، وتجاوز إخفاقها (Failover)، ويوفر أنماطًا لنشرها، وأمور أخرى. على سبيل المثال، يمكن لمنصة Kubernetes إدارة نشر الكناري (ِCanary deployment)، وهو طريقة لنشر الإصدارات إلى مجموعة فرعية من المستخدمين أو الخوادم واختبارها أولًا ثم طرحها على بقية الخوادم، لنظامك بسهولة. يوفر لك Kubernetes ما يلي: اكتشاف الخدمات وموازنة الحِمل (Load balancing): يمكن لـ Kubernetes كشف حاوية باستخدام اسم نطاق أو باستخدام عنوان IP الخاص بها، كما يمكنه موازنة الحِمل إذا كانت حركة البيانات إلى الحاوية عالية، وتوزيع حركة البيانات عبرالشبكة لكي يكون النشر مستقرا. تنسيق التخزين (Storage orchestration): يسمح لك Kubernetes بتركيب نظام تخزين من اختيارك تلقائيًا، مثل المخازن المحلية، وموفري السحابة العامة والمزيد. أتمتة طرح الحاويات (Rollout) واستردادها (Rollback) : يمكنك وصف الحالة المرغوبة للحاويات التي تُنشَر باستخدام Kubernetes، ويمكنك تغيير الحالة الراهنة إلى الحالة المرغوبة بمعدل يُتحكّم فيه. على سبيل المثال، يمكنك إعداد Kubernetes لإنشاء حاويات جديدة للنشر آليًا، وإزالة الحاويات الموجودة وإسناد جميع مواردها في الحاوية الجديدة. التعبئة التلقائية للحاويات: تزوّد Kubernetes بمجموعة من العقد (الأجهزة) التي يمكن استخدامها لتشغيل المهام في حاويات، وتخبر المنصة بما تحتاجه كل حاوية من قدرة معالجة وذاكرة حية. يستطيع Kubernetes وضع الحاويات على العقد الخاصة بك لتحقيق أقصى استفادة من مواردك. التعالج الذاتي: يعيد Kubernetes تشغيل الحاويات التي أخفقت، ويستبدل الحاويات، ويوقف الحاويات التي لا تستجيب لمعايير التحقق التي يحددها المستخدم، ولا يعلن عن الحاويات للعملاء إلا إذا كانت جاهزة للخدمة. الإدارة السرية والتكوين: يتيح لك Kubernetes تخزين المعلومات الحساسة وإدارتها، مثل كلمات المرور ورموز OAuth ومفاتيح SSH. يمكنك نشر وتحديث هذه المعلومات الحساسة، وبناء التطبيق دون إعادة إنشاء صور الحاوية، وبدون الكشف عن الأسرار في تكوين المكدس (Stack) الخاص بك. الحالات التي لا ينفع فيها Kubernetes Kubernetes ليس نظامًا تقليديًّا وشاملًا لتقديم المنصات بصيغة خدمة (PaaS - Platform as a Service). نظرًا لأن Kubernetes يعمل على مستوى الحاوية بدلاً من مستوى الأجهزة، فإنه يوفر بعض الميزات القابلة للتطبيق عمومًا والشائع وجودها في المنصات المُقدّمة بصيغة خدمة، مثل النشر، والتحجيم، وموازنة الحِمل، والتسجيل، والمراقبة. ومع ذلك، فإن Kubernetes غير متجانس، وهذه الحلول الافتراضية اختيارية وقابلة للتوصيل بالمنصة. يوفر Kubernetes اللبنات الأساسية لبناء منصات للمطورين، ولكنه يحافظ على اختيار المستخدم والمرونة حيث يكون ذلك مهما. إنَّ Kubernetes: لا يحد من أنواع التطبيقات المدعومة. يهدف Kubernetes إلى دعم مجموعة متنوعة للغاية من أعباء العمل، بما في ذلك أعباء العمل عديمة الحالة (Stateless)، وذات الحالة (Stetful)، والتي تعالج البيانات. إذا كان يمكن تشغيل تطبيق في حاوية، فبالتأكيد سيعمل على نحو رائع على Kubernetes. لا ينشر الشفرة المصدرية ولا يبني تطبيقك. يُحدَّد سير عمل آليّات التكامل والتسليم والنشر المستمر (CI/CD) من خلال ثقافات المؤسسة وتفضيلاتها، بالإضافة إلى المتطلبات التقنية. لا يوفر خدمات على مستوى التطبيق، مثل البرامج الوسيطة (على سبيل المثال، قنوات الرسائل)، وأطر معالجة البيانات (Spark مثلًَا)، وقواعد البيانات (MySQL مثلًا)، وذاكرة التخزين المؤقت، وأنظمة التخزين العقدية (Ceph مثلًا) لا يقدّمها كخدمات مدمجة. يمكن تشغيل هذه المكونات على Kubernetes، مع الوصول إليها - أو عدمه - عن طريق التطبيقات التي تعمل على Kubernetes من خلال آليات محمولة، مثل Open Service Broker. لا يفرض حلول التسجيل أو المراقبة أو التنبيه. يوفر إرشادات إلى عمليات التكامل، وآليات جمع المقاييس وتصديرها. لا يوفر ولا يفرض لغة أو نظامًا للضبط (Jsonnet مثلا). يوفر واجهة تطبيقات برمجية تصريحية يمكن استهدافها من خلال أشكال عشوائية من المواصفات التصريحية. لا يوفر ولا يعتمد أي أنظمة ضبط أو صيانة أو إدارة أو معالجة ذاتية شاملة للأنظمة. بالإضافة إلى ذلك، Kubernetes ليس مجرد نظام تنسيق. في الواقع، يلغي Kubernetes الحاجة إلى التنسيق. التعريف الفني للتنسيق هو تنفيذ سير عمل محدد: أولاً قم بـ أ، ثم ب، ثم ج. على النقيض من ذلك، يشتمل Kubernetes على مجموعة من عمليات تحكم مستقلة قابلة للتوليف تدفع باستمرار الحالة الحالية نحو الحالة المطلوبة المقدمة. لا يهم كيف تنتقل من أ إلى ج. التحكم المركزي ليس مطلوبًا أيضًا. ينتج عن ذلك نظام أسهل استخدامًا، وأكثر قوة وصلابة وقابلية للتكيّف والتوسع. فهم كائنات Kubernetes يشرح هذا الجزء كيفية تمثيل الكائنات في واجهة برمجة تطبيقات Kubernetes ‏(Kubernetes API)، وكيف يمكنك التعبير عنها بتنسيق yaml. ونتناول به ما يلي: شرح كائنات Kubernetes. مواصفات الكائن وحالته وصف كائن Kubernetes الحقول المطلوبة شرح كائنات Kubernetes الكائنات (Kubernetes objects) هي كيانات مستديمة (Persistent) في نظام Kubernetes. تُستخدم هذه الكيانات لتمثيل حالة العنقود (Cluster) الخاصة بك. على وجه التحديد، يمكن للكائنات وصف: التطبيقات المُحتواة (Containerized) المشغَّلة الآن (وعلى أي عقدة Node). الموارد المتاحة لتلك التطبيقات. السياسات المتعلقة بكيفية تصرف هذه التطبيقات، مثل سياسات إعادة التشغيل، والتحديثات، والتسامح مع الأخطاء (Fualt tolerance). كائن Kubernetes هو "سجل نيات". بمجرد أن تُنشئ الكائن، سيعمل نظام Kubernetes باستمرار للتأكد من وجوده. من خلال إنشاء كائن، فأنت تخبر نظام Kubernetes عمليَّا بالكيفية التي تريد أن يبدو عليها عبء عمل العنقود. هذه هي الحالة المرغوبة (Desired state) للعنقود. للعمل مع كائنات Kubernetes، سواء لإنشائها أو تعديلها أو حذفها، ستحتاج إلى استخدام واجهة برمجة تطبيقات Kubernetes. عند استخدام واجهة سطر الأوامر، kubectl على سبيل المثال، تستدعي واجهة سطر الأوامر واجهةَ برمجة تطبيقات Kubernetes الضرورية. يمكنك أيضًا استخدام واجهة التطبيقات البرمجية مباشرة في برامجك الخاصة باستخدام إحدى المكتبات العميلة. مواصفات الكائن وحالته يحتوي كل كائن Kubernetes تقريبًا على حقلين مضمَّنيْن في الكائن يتحكمان في تكوينه، وهما مواصفات الكائن spec وحالتهstatus. بالنسبة للكائنات التي لها مواصفات (الحقل spec)، يجب عليك تعيين الحقل عند إنشاء الكائن، مع تقديم وصف للخصائص التي يجب توافرها في المورد: الحالة المرغوبة. يصف حقل status الحالة الراهنة للكائن. يتولّى Kubernetes ومكوّناته تبديل الحالة الراهنة للكائن وتحديثها. يدير مستوى التحكم (Controle plane) في Kubernetes باستمرار ونشاط، الحالة الفعلية لكل كائن لمطابقتها مع الحالة المرغوبة التي حدّدتها. على سبيل المثال: في Kubernetes ، النشر (Deployment) هو كائن يمكن أن يمثل تطبيقًا يعمل على عنقودك. عند إنشاء النشر، يمكنك تعيين مواصفات النشر spec لتحديد أنك تريد تشغيل ثلاث نسخ متماثلة من التطبيق. يقرأ نظام Kubernetes مواصفات النشر ويبدأ ثلاث نظائر من التطبيق المطلوب، مع تحديث الحالة لتتوافق مع المواصفات الخاصة بك. في حالة تعطّل واحدة من تلك النظائر (تغيير الحالة)، يستجيب نظام Kubernetes لوجود فرق بين المواصفات spec والحالة statusعن طريق إجراء تصحيح، في هذه الحالة، بدء نسخة بديلة من التطبيق. راجع اتفاقيّات واجهة برمجة تطبيقات Kubernetes ‏(Kubernetes API Conventions) لمزيد من المعلومات حول مواصفات الكائن وحالته والبيانات الوصفية. وصف كائن Kubernetes عندما تنشئ كائنًا في Kubernetes، يجب عليك تقديم مواصفات الكائن التي تصف حالته المرغوبة، بالإضافة إلى بعض المعلومات الأساسية حول الكائن (مثل الاسم). عند استخدام واجهة برمجة تطبيقات Kubernetes لإنشاء الكائن (إما مباشرة أو عبر kubectl)، يجب أن يتضمن طلب واجهة برمجة التطبيقات (API request) تلك المعلومات على أنها JSON في متن الطلب (Request body). في معظم الأحيان، تُقدَّم المعلومات إلى kubectl في ملف yaml. و يحوِّل kubectl المعلومات إلى JSON عند تقديم طلب واجهة برمجة التطبيقات. ها هو مثال لملف yaml. يعرض الحقول المطلوبة ومواصفات كائن نشر Kubernetes: الملف application/deployment.yaml apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 # tells deployment to run 2 pods matching the template template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 تتمثل إحدى طرق إنشاء النشر باستخدام ملف yaml.، مثل الملف أعلاه، في استخدام الأمر kubectl apply في واجهة سطر أوامر kubectl، وتمرير ملف yaml. كوسيط. إليك مثال: kubectl apply -f https://k8s.io/examples/application/deployment.yaml --record الناتج مشابه لهذا: deployment.apps/nginx-deployment created الحقول المطلوبة ستحتاج إلى تعيين قيم للحقول التالية في ملف yaml. لكائن Kubernetes الذي تريد إنشاءه: apiVersion: إصدار واجهة برمجة تطبيقات Kubernetes التي تستخدمها لإنشاء هذا الكائن. kind: نوع الكائن الذي تريد إنشاءه. metadata: البيانات الوصفية التي تساعد على تحديد الكائن على نحو فريد، بما في ذلك سلسلة محارف (String) الاسم (الحقل name)، والمعرّف الفريد (UID)، و فضاء أسماء (namespace) اختياري. spec: الحالة المرغوبة للكائن. تختلف الصيغة الدقيقة للمواصفات حسب كائنات Kubernetes، وتحتوي على حقول متداخلة خاصة بكل كائن. يمكن أن يساعدك مرجع واجهة برمجة تطبيقات Kubentes ‏(The Kubernetes API Reference) في العثور على صيغة المواصفات لجميع الكائنات التي يمكنك إنشاؤها باستخدام Kubernetes. على سبيل المثال، يمكن العثور على صيغة مواصفات الكائنات (الحقل spec) من نوع Pod على الرابط التالي. PodSpec v1 core، ويمكن العثور على صيغة المواصفات spec لكائن نشر (Deployment) هنا. مرحبا Minikube تشرح الفقرات التالية من الدرس كيفية تشغيل برنامج "مرحبا بالعالم!" بسيط في بيئة Node.js على منصة Kubernetes باستخدام Minikube و Katacoda الذي يوفر بيئة Kubernetes مجانية في المتصفح. ملحوظة: تصلح التعليمات المذكورة هنا في بيئات Kubernetes المثبَّتة محلّيا. سنتناول ما يلي: الأهداف المتطلبات إنشاء عنقود Minikube إنشاء كائن نشر إنشاء خدمة تمكين الإضافات تنظيف المخلفات الأهداف نشر برنامج "مرحبا بالعالم!" على MiniKube. تشغيل التطبيق. عرض سجلات التطبيق. المتطلبات يوفر هذا الدرس صورة حاوية أنشئت من الملفات التالية: الملف minikube/server.js var http = require('http'); var handleRequest = function(request, response) { console.log('Received request for URL: ' + request.url); response.writeHead(200); response.end('Hello World!'); }; var www = http.createServer(handleRequest); www.listen(8080); الملف minikube/Dockerfile FROM node:6.14.2 EXPOSE 8080 COPY server.js . CMD [ "node", "server.js" ] راجع توثيق Docker للمزيد من المعلومات عن أمر docker build. إنشاء عنقود Minikube اضغط على Launch Terminal. افتح لوحة معلومات Kubernetes في متصفح: minikube dashboard بالنسبة لمستخدمي بيئة Katacoda فقط: في الجزء العلوي من لوجة الطرفية، اضغط على علامة الجمع (+)، ثم اضغط على Select port to view on Host 1. بالنسبة لمستخدمي بيئة Katacoda فقط: اكتب 30000، ثم اضغط على Display Port. إنشاء كائن نشر (Deployment) كائنات Pod في Kubernetes عبارة عن حاوية واحدة أو مجموعة من الحاويات مرتبطة ببعضها البعض لأغراض الإدارة والتواصل. تحتوي كائنات Pod في هذا الدرس على حاوية واحدة فقط. يتحقق كائن النشر (Deployment) في Kubernetes من صحة Pod الخاص بك ويعيد تشغيل حاوية Pod إنْ توقفت عن العمل. عمليات النشر هي الطريقة الموصى بها لإدارة إنشاء وتحجيم مجموعات الحاويات المسمّاة Pods. استخدم الأمر create kubectl لإنشاء كائن نشر يدير Pod. يقوم Pod بتشغيل الحاوية بناءً على صورة Docker المتوفرة. kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node عرض كائن النشر: kubectl get deployments الناتج مشابه لما يلي: NAME READY UP-TO-DATE AVAILABLE AGE hello-node 1/1 1 1 1m عرض Pod: kubectl get pods الناتج مشابه لما يلي: NAME READY STATUS RESTARTS AGE hello-node-5f76cf6ccf-br9b5 1/1 Running 0 1m عرض أحداث العنقود (Cluster Events): kubectl get events عرض إعدادات kubectl: kubectl config view إنشاء خدمة لا يمكن الوصول إلى كائن Pod افتراضيَّا إلا من خلال عنوان IP الداخلي الخاص به ضمن عنقود Kubernetes. لإتاحة الوصول إلى حاوية hello-node من خارج شبكة Kubernetes الافتراضية، يجب عليك عرض كائن Pod بصيغة خدمة Kubernetes. استخدم الأمر kubectl expose لعرض كائن Pod للعموم: kubectl expose deployment hello-node --type=LoadBalancer --port=8080 يشير الخيار type=LoadBalancer-- إلى أنك تريد إتاحة الخدمة للوصول إليها من خارج العنقود. اعرض الخدمة التي أنشأتها للتو: kubectl get services الناتج مشابه لما يلي: NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-node LoadBalancer 10.108.144.78 <pending> 8080:30369/TCP 21s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23m بالنسبة لمزوّدي السحابة الذين يدعمون موازنة الحمل، فسيتوفّر عنوان IP خارجي للوصول إلى الخدمة. في بيئة Minikube، يتيح النوع LoadBalancer الوصول إلى الخدمة من خلال الأمر minikube service. نفّذ الأمر التالي: minikube service hello-node بالنسبة لمستخدمي بيئة Katacoda: اضغط على علامة الجمع (+)، ثم اضغط على Select port to view on Host 1. بالنسبة لمستخدمي بيئة Katacoda: لاحظ رقم المنفذ المكون من 5 أرقام المعروض مقابل 8080 في مُخرجات الخدمات (Services Output). يُولّد رقم المنفذ هذا عشوائيًّا ويمكن أن يكون مختلفًا بالنسبة لك. اكتب رقمك في مربع نص رقم المنفذ، ثم اضغط على Display Port. باستخدام المثال السابق ، يمكنك كتابة 30369 يؤدي ذلك إلى فتح نافذة متصفح تخدم تطبيقك وتظهر رسالة "Hello World". تمكين الإضافات يحتوي Minikube على مجموعة من الإضافات المدمجة، وهي موارد تضيف وظائف جديدة إلى Kubernetes. يمكن تمكين الإضافات وتعطيلها وفتحها في بيئة Kubernetes المحلية. أظهر قائمة بالإضافات المدعومة حاليّا: minikube addons list الناتج مشابه لما يلي: addon-manager: enabled dashboard: enabled default-storageclass: enabled efk: disabled freshpod: disabled gvisor: disabled helm-tiller: disabled ingress: disabled ingress-dns: disabled logviewer: disabled metrics-server: disabled nvidia-driver-installer: disabled nvidia-gpu-device-plugin: disabled registry: disabled registry-creds: disabled storage-provisioner: enabled storage-provisioner-gluster: disabled تمكين إضافة، على سبيل المثال، metrics-server: minikube addons enable metrics-server الناتج مشابه لما يلي: metrics-server was successfully enabled عرض Pod والخدمة التي أنشأتها للتو: kubectl get pod,svc -n kube-system الناتج مشابه لما يلي: NAME READY STATUS RESTARTS AGE pod/coredns-5644d7b6d9-mh9ll 1/1 Running 0 34m pod/coredns-5644d7b6d9-pqd2t 1/1 Running 0 34m pod/metrics-server-67fb648c5 1/1 Running 0 26s pod/etcd-minikube 1/1 Running 0 34m pod/influxdb-grafana-b29w8 2/2 Running 0 26s pod/kube-addon-manager-minikube 1/1 Running 0 34m pod/kube-apiserver-minikube 1/1 Running 0 34m pod/kube-controller-manager-minikube 1/1 Running 0 34m pod/kube-proxy-rnlps 1/1 Running 0 34m pod/kube-scheduler-minikube 1/1 Running 0 34m pod/storage-provisioner 1/1 Running 0 34m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/metrics-server ClusterIP 10.96.241.45 <none> 80/TCP 26s service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 34m service/monitoring-grafana NodePort 10.99.24.54 <none> 80:30002/TCP 26s service/monitoring-influxdb ClusterIP 10.111.169.94 <none> 8083/TCP,8086/TCP 26s تعطيل metrics-server: minikube addons disable metrics-server والناتج مشابه لما يلي: metrics-server was successfully disabled التخلّص من الموارد يمكنك الآن التخلص من الموارد التي أنشأتها في العنقود: kubectl delete service hello-node kubectl delete deployment hello-node يوجد خيار آخر يتمثّل في إيقاف آلة Minikube الافتراضية: minikube stop كما يمكن حذف Minikube: minikube delete ترجمة وبتصرُّف للمقالات التالية: What is Kubernetes Understanding Kubernetes Objects Hello Minikube
  2. ملاحظة: تم إطلاق نظام ووردبريس 5.0 مع محرّرٍ جديدٍ في ديسمبر 2018، تمت كتابة هذا المقال لتجربة التّعديل طويل الأمد في إصدارات ووردبريس السابقة، والتي يمكن استخدامها في ووردبريس 5.0 والنّسخ الأعلى عبر إضافات المحرّر الكلاسيكيّ. قد تكون مهتمًا في صفحة المحرر النصي الجديد. المقالات (Posts) هي الإدخالات التي تعرض في الصّفحة الرّئيسيّة أو في صفحة المدوّنة بترتيب زمني عكسيّ، ويوجد تحتها عادة حقول للتّعليقات وتُضَمَّن في موجز (RSS) الخاص بموقعك. لكتابة مقالة: سجل دخولك إلى شاشة إدارة ووردبريس (لوحة التحكّم). انقر على علامة التّبويب (المقالات posts). انقر على علامة التّبويب الفرعيّة (إضافة جديد Add New). ابدأ بملء الفراغات: أدخل عنوان مقالتك في الحقل العلويّ، ثمّ أدخل محتواها في صندوق تحرير المقالة الرئيسيّ الذي يقع تحته. يمكن تحديد التّصنيف وإضافة علامات والقيام بإجراء تحديدات أخرى من الأقسام الموجودة أسفل المقالة حسب الحاجة، (سنوضّح كلًّا من هذه الأقسام لاحقًا) انقر فوق (نشر Publish) عندما تصبح جاهزًا. خيارات الشاشة تتوافر حقول تحريرٍ إضافيّة عند القيام بتسجيل الدّخول للمرّة الأولى، تسمح منطقة خيارات الشاشة (Screen Options) باختيار حقول المقالات التي يتمّ عرضها أو إخفاؤها من منطقة التّحرير، ممّا يسمح بتقليل الفوضى وتخصيصها وفقًا للحاجة. توجد علامة التّبويب (خيارات الشاشة) أعلى الشّاشة، عند النّقر عليها ستظهر قائمة صناديق التّعديل المتاحة التي يمكن استخدامها. لعرض حقل المقال الذي نريده نحدّد صندوق الاختيار الخاصّ به، ولإخفائه نقوم بإلغاء تحديد صندوق الاختيار. لإغلاق علامة التّبويب ننقر فوق (خيارات الشّاشة) مرّة أخرى. تحفظ الخيارات عند القيام بتخصيص شاشة التحرير، ولن يكون هناك حاجةٌ لتحديدها أو إخفائها من جديدٍ عند تسجيل الدخول مرّة أخرى. وصف حقول المقالة الجديدة لوحة ووردبريس المتّقدّمة لكتابة المقالات (أعلى الصّفحة) صندوق العنوان يجب أن يحوي الصّندوق عنوان المقال، يمكن استخدام أيّ عبارة أو كلمات أو أحرف للعنوان (يجب عدم استخدام العنوان نفسه في أكثر من صفحة واحدة)، كما يمكن استخدام الفواصل (،) والفواصل العليا (’ ’) وعلامات الاقتباس (" ") وعلامات الوصل/الشرطات (- /) وغيرها من الرموز النموذجيّة الأخرى، مثلًا يمكن اختيار عنوان من الشكل "موقعي بشكله 'الجديد' - ألق نظرة عليه الآن" ثمّ سيقوم ووردبريس بتنظيفه لإنشاء اسم مقال قريب للمستخدم وله عنوان url صالح (وهو ما يسمّى أيضًا "الاسم المستعار") لإنشاء الرّابط الدّائم للمقال. الروابط الدائمة Permalink يرمز مصطلح (Permalink) إلى الرابط الدائم، والذي يعني أن عنوان المسار للمقال (post url) لا يكشف مُعرِّف المقال (post id) الذي من الممكن أن يتغيّر (على سبيل المثال عند الانتقال إلى نظام تدوين مختلف)، لكنّه يحتوي بدلاً من ذلك على اسم مقالة لطيف وسهل الاستخدام مأخوذ من عنوان المقال والذي يمكن أن يتغير أيضًا -على الرغم أنه لا ينصح بذلك- لكن يمكننا التحكّم به بشكل أكبر. يمكن تعديل اسم المقال (والذي يُشار إليه أيضًا بــ"الاسم المستعار") اعتمادًا على الإعدادات الخاصّة بالرّوابط الدائمة وذلك باستخدام الزّر (تعديل). (لتغيير الإعدادات نستخدم: لوحة التّحكم> الإعدادات> الرّوابط الدّائمة). يتم إنشاء الرّابط الدائم تلقائيًا استنادًا إلى عنوان المقال ويظهر أسفل حقل العنوان. تتم إزالة علامات التّرقيم كالفواصل وعلامات الاقتباس والفواصل العليا وأحرف العنوان غير الصّالحة، كما يتمّ استبدال المسافات بين الكلمات بشارطة (-). مثلًا إذا كان عنوان المقال الأجنبي "My Site - Here's Lookin" at You, Kid" فسيتم تنظيفه لإنشاء الاسم المستعار على الشّكل "my site-here's-lookin-at-you-kid". كما يمكن تغييره يدويًا أو اختصاره إلى my-site-lookin-at-you-kid". صندوق نسخ المحتوى Body Copy Box هو صندوق فارغ يُتيح للمستخدم إدخال الكتابة الخاصّة به وكذلك الرّوابط والصّور والرّوابط الخاصّة بالصّور وأيّ معلوماتٍ أخرى يرغب بعرضها على موقعه. يمكن استخدام المحرّر المرئيّ (WYSIWYG) أو عرض النّصّ (text view) لإنشاء المقالات. لمزيد من التّفاصيل حول طريقة عرض النّصّ يمكن مراجعة الفقرة أدناه "المحرّر النّصي مقابل المحرّر المرئي" صندوق النشر Publish Box يحوي أزرارًا تتحكّم في حالة المقال، تنقسم الحالات الرئيسية إلى مسوّدة draft ومنشور published، فالحالة "مسوّدة" تعني أن المقال لم ينشر بعد ولا يزال في حالة مسودة لمُنشئ المقالة، أما الحالة "منشور" فتعني أنه تمّ نشر المقال وأصبح موجودًا على الموقع مباشرة. زر المعاينة: يتيح استعراض المقال قبل النشر. زر حفظ المسودة: يسمح بحفظ المقالة كمسوّدة بدلاً من نشرها على الفور. يمكن العودة إلى المسوّدات لاحقًا من خلال زيارة (المقالات> تحرير) في شريط القوائم، ثم نحدّد المقال من القائمة. الحالة: إذا تم اختيار حالة نشر معينة (بالنقر فوق (تعديل edit) بجوار الحالة (مسودة draft) ثم النّقر فوق (نشر) أو (تحديث المقال)) فسيتمّ تطبيق هذه الحالة على المقال. على سبيل المثال، حتى نحفظ المقال في الحالة (انتظار المراجعة)، نختار(القائمة المنسدلة (نشر حالة Publish Status) ثم نختار (انتظار المراجعة Pending Review) ثمّ (حفظ كـمعلّق pending)). يمكن رؤية جميع المقالات منظمة حسب الحالة من خلال (لوحة التحكم > مقالات > تحرير). الظُهور: يحدد كيفيّة ظهور المقال للزوار. تصبح المقالات العامّة مرئيّة لجميع زوّار الموقع فور نشرها (بالنقر على (تعديل edit) بجوار (الظُهور visibility))، تظهر المشاركات المحميّة بكلمة مرور لجميع الزّوار، ولكن لن يظهر المحتوى إلّا للزّوار الذين يعرفون كلمة المرور، تتاح المقالات الخاصة لمنشئ المقال فقط (وكذلك للمحررين أو المشرفين الآخرين في الموقع). المراجعات: يمكن رؤية جميع التغييرات التي أُجريت على المقال بالنقر على (تصفح browse). الجدولة: يمكن القيام بجدولة مقال لينشر في وقتٍ أو تاريخٍ لاحق، بالنقر على (تحرير edit) بجوار (النّشر فورًا Publish immediately). كما يمكن تغيير تاريخ النشر إلى تاريخ قديم لإرجاع تاريخ المقال للماضي، تغيير الإعدادات إلى الوقت والتاريخ المطلوبين. يجب أيضاً النقر فوق الزر (نشر Publish) عندما يصبح المقال جاهزًا للنّشر في الوقت والتّاريخ المطلوبين. صندوق التنسيق Format Box يسمح باختيار تنسيق محدّدٍ للمقال. يتم التّعامل مع التّصميم والمظهر من خلال القوالب الفرديّة. صندوق التصنيفات Categories Box ويعني الموضوع العامّ للمقال. تمتلك المدوّنة عادةً من سبعة إلى عشر تصنيفات للمحتوى. يمكن للقراء استعراض تصنيفات محددة لمشاهدة جميع المقالات في الفئة، كما يمكن إدارة التّصنيفات الخاصّة بالمستخدم من خلال الانتقال إلى (لوحة التحكم > المقالات > التصنيفات). صندوق العلامات Tags Box هي التصنيفات الجزئيّة للمقال، وهو يشبه تضمين مداخل فهرسة الصّفحة. عندما ينقر المستخدم على إحدى العلامات يتمّ ربط المقالات التي تحمل العلامات نفسها، تفعّل العلامات مع الترميز الصحيح في قوالب لتظهر في المقال. يمكن إضافة علامات جديدة إلى المقال عن طريق كتابة العلامات في الصندوق ثمّ النقر على (إضافة add)، كما يمكن الّنقر على رابط (الاختيار من العلامات الأكثر استخدامًا Choose from the most-used tags) لرؤية العلامات المستخدمة من قبل الموقع. المقتطفات Excerpts المقتطف هو ملخّص أو إعلان موجز عن المقال، والتي قد يظهر على الصّفحة الأولى من الموقع وكذلك في التّصنيفات والمحفوظات والبحث في صفحات مقالات غير فرديّة. ملاحظة: لا يظهر المقتطف عادةّ بشكلٍ افتراضيٍّ في المقال، بل يظهر فقط عند القيام بتعديل ملفّ القالب من (المحتوى the_content) إلى (المقتطف the_excerpt) وذلك لعرض المختصر بدلًا من المحتوى الكامل للمقال. عند القيام بذلك يقوم ووردبريس تلقائيًّا باستخدام أول 55 كلمة من محتوى المقال أو المحتوى قبل الوسم السريع <‎!--more--‎>. عند اختيار حقل "المقتطف" عند تعديل المقال سيتمّ استخدامه بغضّ النّظر عن أيّ شيء. إرسال تعقيب Trackbacks وهي طريقة لإعلام أنظمة المدوّنات القديمة المربوطة بالمدونة. عند الربط مع مدونات ووردبريس أخرى سيتمّ إخبارها تلقائيًّا باستخدام التنبيهات pingbacks، لا حاجة للقيام بأيّ إجراءٍ آخر. يمكن إرسال تعقيب إلى المدوّنات التي لا تتعرّف على التّنبيهات عن طريق إدخال عنوان (أو عناوين) الموقع في هذا الصندوق، والفصل بينها بفراغات. يمكن مراجعة مقال (التّعقيبات والتّنبيهات) لمزيدٍ من المعلومات. الحقول المخصصة Custom Fields توفّر طريقةً لإضافة المعلومات إلى الموقع. بالتّزامن مع ترميزٍ إضافيٍّ في ملفّات القوالب أو الإضافات plugins، يمكن أن تقوم الحقول المخصّصة بتعديل طريقة عرض المقال. وتستخدم في المرتبة الأولى من قبل الإضافات، ولكن يمكن تحرير هذه المعلومات يدويًا في هذا القسم. المناقشة Discussion وهي خياراتٌ تتيح التّفاعل والتّنبيهات في المقال. يحوي هذا القسم صندوقي اختيارٍ هما: (السماح بالتعليق Allow Comments) على هذا المنشور، و(السماح بالتعقب والرّد عليه Allow trackbacks and pingbacks). لا يمكن لأي شخص نشر تعليقاتٍ على هذا المقال إذا لم يتم تحديد خيار (السماح بالتعليق)، وكذلك إذا لم يتم تحديد خيار السّماح بإجراء Ping (وهو أمر من أوامر أنظمة التّشغيل يستخدم لفحص اتّصال حاسوبٍ مع حاسوبٍ آخر أو طابعة أو أي جهاز آخر يستخدم بروتوكول TCP/IP) فلن يتمكن أي شخص من نشر تنبيهات pingbacks (وهي آليّة مستخدمة في المدوّنات لإعلام مقالات نظام المدونات الأخرى عن الاقتباس) أو تعقيبات trackbacks (وهي وسيلة يدوية مستخدمة في المدونات لإعلام مقالات نظام المدونات الأخرى عن الاقتباس على المقالة المحددة). كاتب المقال هي قائمة بجميع مؤلّفي المدوّنة ،نختار مؤلّف المقال منها. يظهر هذا القسم فقط عند وجود عدة مستخدمين لديهم حقوق التّأليف في المدوّنة، يمكن عرض قائمة المستخدمين بالانتقال إلى (لوحة التّحكم> المستخدمون). يمكن مراجعة مقال (المستخدمون والمؤلّفون) لمزيدٍ من المعلومات. لوحة ووردبريس المتقدمة لكتابة المقالات (أسفل الصفحة) ملاحظة: يمكن تعيين خيارات الكتابة الأساسية (مثل حجم صندوق النّشر وكيفيّة تحويل الوسوم وتفاصيل أخرى) بالانتقال إلى (لوحة التحكم> الإعدادات> الكتابة). العادات الأفضل للنشر يمكن قول أو إظهار أي شيء للعالم عن طريق موقع ووردبريس، هذه بعض النّصائح التي نحتاج إلى معرفتها للمساعدة في كتابة المقالات على ووردبريس: إمكانية الوصول بناءً على معايير الويب الخاصة بإمكانية الوصول، يجب التأكد من احتواء الرّوابط والصّور على الخاصيتين ALT و TITLE وذلك لمساعدة المستخدمين، مثل: <a title="WordPress.ORG" href="https://wordpress.org/">WordPress.ORG</a> استخدام الفقرات لا يحب الكثير منّا قراءة فقرة مستمرّة لا تتوقّف عند سطر فاصل. لتقسيم النص إلى فقرات يجب استخدام سطرين فارغين بين الفقرات، سيكتشف ووردبريس هذا تلقائيًا ويقوم بإدراج وسم الفقرة <p> في HTML ضمن الكتابة. استخدام العناوين عندما تكون المقالات طويلة يجب تقسيم المقاطع باستخدام العناوين والعناوين الصغيرة لتسليط الضوء على تغيير الموضوع، تحدّد العناوين في لغة HtML بواسطة وضع h1, h2, h3, h4 وهكذا استخدام HTML لا يتوجّب استخدام لغة HTML عند كتابة المقالات. سيقوم ووردبريس تلقائيًا بإضافتها إلى الموقع، ولكن يتوجّب استخدامها للتحكّم في عناصر مختلفة مثل الصّناديق والعناوين والمحتويات و العناصر الإضافية الأخرى. التدقيق الإملائي والتدقيق اللغوي توجد مكوّنات إضافيّة للتدقيق الإملائي إلا أنّها لا تتحقّق من كلّ شيء. يقوم بعض الكتّاب بكتابة مقالاتهم في محرر نصّيّ يحوي تدقيقًا إملائيًّا، ثم يقومون بفحص الإملاء وتدقيقه ثمّ نسخ النّصّ ولصقه في ووردبريس المحرر النصي مقابل المحرر المرئي يمكننا اختيار وضع المحرّر المرئيّ أو النصّيّ عند كتابة المقال، يتيح الوضع المرئيّ رؤية المقالات كما هي، بينما يعرض وضعُ النّص الشيفرة، ويستبدل بأزرار محرّر WYSIWYG الوسوم السريعة quicktags. يمكن تبسيط الوسوم السريعة على النحو التالي: b - تستخدم الوسم <strong></strong> هما لجعل النص ثخنيًا (النص ثخين). i - تستخدم الوسم <em></em> لجعل النص مائلًا (النص مائل). b-quote- التي تستخدم الوسم <blockquote></blockquote> لتمييزه على أنه إقتباس. del - تستخدم الوسم <del></del> لتحديد النّصّ الذي يُحذَف من المقال، والذي تعرضه معظم المتصفّحات على شكل خطّ وسط النّصّ. link - تستخدم الوسم <a href="http://example.com"></a> لإنشاء رابط للموقع http://example.com. ins - التي تستخدم الوسم <ins></ins> لتمييز النص المدخل في المقالة ، تعرضه معظم المتصفحات كنص مسطّر. ul - تستخدم الوسم <ul></ul> لإدراج قائمة غير مرتبّة، أو تقوم بتحديد النّصّ المحدّد بنفس الطريقة. تكون القائمة غير المرتبة عادةً قائمة بعناصر ذات تعداد نقطيٍّ. ol - تستخدم الوسم <ol></ol> لإدراج قائمةٍ مرتّبة، أو التفاف النص المحدد في نفسه. يتمّ ترقيم كل عنصرٍ في القائمة المرتّبة. li - تستخدم الوسم <li></li> لإدراج النص المحدد وجعله عنصرًا في قائمة، تستخدم بالاقتران مع علامتي ul أو ol. code - تستخدم الوسم <code></code> لاختيار تنسيق شيفرة/كود أي تضبط الخط عمومًا إلى خط من نوع monospace. more تستخدم وسم ووردبريس <--more--!>، وتقسم المقالة إلى قسمين (الإعلان التشويقي والمحتوى). اكتب بضع فقرات ثمّ أدخل هذا الوسم ثم اكتب باقي المقال، سترى في الصفحة الرئيسية لمدونتك الفقرات الأولى المكتوبة وبعدها الوسم more التي ستحوي رابطًا إلى تتمّة محتوى المقال. page - تستخدم وسم ووردبريس <‎!--next page--‎‎‎> وهي مشابهة للوسم more إلا أنه يمكن استخدامها عدة مرّات في المقال، ومع كلّ إدخال سيقطع المقال ويعاد ترقيمه في ذلك المكان. ثم ستنشأ ارتباطات تشعبية للأقسام المرقمة من المقال مع أحد وسمي القالب wp_link_pages()‎ أو link_pages()‎. lookup - يقوم بفتح صندوق حوار جافا سكريبت، للبحث عن كلمة في القاموس عن طريق الإنترنت في موقع answers.com، يمكن استخدام هذا الإجراء للتدقيق الإملائي للكلمات الفرديّة. Close Tags - يقوم بإغلاق أي وسوم HTML مازالت مفتوحة من -لكن يجب الانتباه عمومًا لوسوم الإغلاق، فووردبريس لا تعرف بالضبط ماذا تريده أنت، لذا يجب التّأكّد من أن الوسوم تتضمن ما تريده بالطّريقة الصّحيحة. ملاحظة عن سير العمل: عند استخدام أزرار علامات التبويب السريعة Quicktag التي تُدرج وسوم HTML، يمكن على سبيل المثال النقر فوق i لإدراج وسم الفتح، وكتابة النص المراد تضمينه، ثمّ النقر فوق (i/) أو (وسم الإغلاق close tag) لإدراج وسم الإغلاق. ومع ذلك يمكن التخلص من الحاجة إلى خطوة (الإغلاق) هذه عن طريق تغيير سير العمل قليلاً وذلك بكتابة النص كاملًا ثم تحديد الجزء المراد التأكيد عليه (الذي نريد جعله مائلًا مثلًا)، ثم انقر فوق i وسيتمّ وضع النّصّ المميّز داخل وسمي الفتح والإغلاق. ترغب في امتلاك موقع ووردبريس سريع وآمن؟ احصل على موقع ووردبريس احترافي بالاستعانة بأفضل خدمات الووردبريس على خمسات أنشئ موقع ووردبريس الآن ترجمة -وبتصرّف- للمقال Writing Posts من موقع wordpress.org
  3. يوفر هذا الدرس نظرة عامة على أساسيات نظام تنسيق العناقيد (Cluster orchestration) في Kubernetes. تحتوي كل وحدة على معلومات أساسية عن ميزات ومفاهيم Kubernetes الرئيسية، وتتضمن برنامجًا تعليميًا تفاعليًا عبر الإنترنت. تتيح لك هذه الدروس التفاعلية إدارة عنقود بسيط والتطبيقات العاملة على حاويّات فيه. باستخدام الدروس التفاعلية، يمكنك تعلم ما يلي: نشر تطبيق يعمل ضمن حاوية على عنقود. تحجيم النشر. تحديث التطبيق العامل ضمن حاوية بإصدار جديد من البرنامج. تنقيح التطبيقات العاملة ضمن حاويات. تستخدم البرامج التعليمية منصَّة Katacoda لتشغيل طرفية افتراضية في متصفح الويب يشغّل Minikube، وهو بيئة نشر Kubernetes محلية محدودة الحجم يمكن تشغيلها في أي مكان. لا داعي لتثبيت أي برنامج أو ضبط أي شيء؛ يعمل كل درس تفاعلي مباشرة من متصفح الويب. ما الذي يمكن أن يقدمه لك Kubernetes؟ مع خدمات الويب الحديثة، يتوقع المستخدمون أن تكون التطبيقات متاحة على مدار الساعة طوال أيام الأسبوع، ويتوقع المطورون نشر إصدارات جديدة من هذه التطبيقات عدة مرات في اليوم. يُساعد مفهوم "الحاويات" على تحزيم البرامج لخدمة هذه الأهداف، مما يتيح إصدار التطبيقات وتحديثها بطريقة سهلة وسريعة دون توقف. يساعدك Kubernetes على التأكد من تشغيل هذه التطبيقات الحاوية أينما ومتى تريد، ويساعد في العثور على الموارد والأدوات التي تحتاجها تلك الحاويّات للعمل. Kubernetes هي منصّة مفتوحة المصدر، جاهزة للإنتاج ومصممة بخبرة Google المتراكمة في تنسيق الحاويات، جنبًا إلى جنب مع أفضل الأفكار والممارسات التي يقترحها المجتمع. سننتقل الآن إلى التحدث عن وحدات Kubernetes الأساسية: إنشاء عنقود Kubernetes نشر التطبيق استكشاف التطبيق الإعلان عن التطبيق تحجيم التطبيق تحديث التطبيق 1. استخدام Minikube لإنشاء عنقود Kubernetes عناقيد Kubernetes تنسق Kubernetes عناقيد من الحواسيب عالية التوفّر المتصلة في ما بينها للعمل كوحدة منفردة. تسمح لك التجريدات (Abstractions) في Kubernetes بنشر تطبيقات تعمل ضمن حاويات على عنقود دون ربط الحاويّات بأجهزة مخصوصة. للاستفادة من هذا النموذج الجديد للنشر، يجب تحزيم التطبيقات بطريقة تفصلها عن المضيفات الفردية، أي أنه يجب وضعها في حاويات. التطبيقات العاملة ضمن حاويات أكثر مرونة وتوفّرًا مما كانت عليه في نماذج النشر السابقة، إذ كانت التطبيقات تثبّت مباشرة على أجهزة معينة بصيغة حزم مدمجة شديدة الارتباط بالمضيف. يؤتمت Kubernetes عمليات توزيع حاويّات التطبيقات وجدولتها على عنقود من المضيفات بطريقة أكثر كفاءة. Kubernetes هي منصة مفتوحة المصدر وجاهزة للإنتاج. يتكون عنقود Kubernetes من نوعين من الموارد: القبطان (The Master) الذي ينسق عمل العنقود. العُقَد (Nodes) وهي الموارد العاملة على تشغيل التطبيق. مخطط عنقود القبطان هو المسؤول عن إدارة الدفة. ينسّق القبطان جميع الأنشطة في العنقود، مثل جدولة التطبيقات، والحفاظ على الحالة المرغوبة، وتحجيم التطبيقات، وطرح تحديثات جديدة. العقدة هي آلة افتراضية (VM) أو حاسوب فيزيائي يُستخدم كآلة عاملة في عنقود Kubernetes. تحتوي كل عقدة على Kubelet، وهو وكيل لإدارة العقدة والتواصل مع القبطان. يجب أن تحتوي العقدة أيضًا على أدوات للتعامل مع عمليات الحاوية، مثل Docker أو rkt. يجب أن يحتوي عنقود Kubernetes الذي يتعامل مع حركة البيانات في بيئة إنتاج على ثلاث عقد على الأقل. عندما تنشر تطبيقات على Kubernetes، فأنت تطلب من القبطان تشغيل حاويات التطبيقات. يجدول القبطان الحاويات لتعمل على عقد العنقود. **تتواصل العُقَد مع القبطان باستخدام واجهة تطبيقات Kubernetes التي يبرزها القبطان. يمكن للمستخدمين النهائيين أيضًا استخدام واجهة تطبيقات Kubernetes مباشرةً للتفاعل مع العنقود. يمكن نشر عنقود Kubernetes على الأجهزة الفيزيائية أو الافتراضية على حد السواء. يمكنك بدء التطوير على Kubernetes باستخدام Minikube، وهو إصدار مخفّف من Kubernetes ينشئ آلة افتراضية على جهازك المحلي وينشر عنقودًا بسيطًا يحتوي على عقدة واحدة فقط. يتوفر Minikube لأنظمة لينكس و ماك وويندوز. توفّر طرفية Minikube عمليات التمهيد الأساسية للعمل مع العناقيد، بما في ذلك البدء (Start) والإيقاف (Stop) والحالة (Status) والحذف (Delete). توجد على هذه الصفحة طرفية جاهزة للاستخدام يُثبّت عليها Minikube مسبقا. 2. نشر تطبيق باستخدام kubectl عمليات النشر في Kubernetes يمكن نشر تطبيقات تعمل على حاويّات ضمن منصة Kubernetes بمجرّد توفر عنقود قيد التشغيل. لذا أنشئ إعدادات نشر (Deployment). يوجِّه كائن النشر Kubernetes إلى كيفية إنشاء نظائر (Instances) للتطبيق وتحديثها. يجدول قبطان Kubernetes، بعد إعداد كائن النشر، نظائر التطبيق للعمل على عقد العنقود. تراقب وحدة تحكم (Controller) باستمرار عمل النظائر بعد إنشائها. إنْ تعطلت عقدة مضيفة أو حذفت، فإن وحدة التحكم تستبدلها بعقدة أخرى من العنقود ليعمل عليها التطبيق، ممّا يوفّر آلية للإصلاح الذاتي لمعالجة إخفاق الآلة أو لصيانتها. في عالم ما قبل التنسيق، غالبًا ما كان تُشتخدَم سكربتات تثبيت لبدء التطبيقات، لكن لم توفر الحلول حينئذٍ لاستعادة عمل التطبيق عند إخفاق الآلة. من خلال إنشاء نظائر لتطبيقك والحفاظ على تشغيلها عبر العُقَد، توفر عمليات النشر في Kubernetes نهجًا مختلفًا جذريًا لإدارة التطبيقات. نشر تطبيقك الأول على Kubernetes يمكنك إنشاء عملية نشر وإدارتها باستخدام واجهة سطر أوامر Kubernetes ‏(Kubectl). يستخدم Kubectl واجهة برمجة تطبيقات Kubernetes للتفاعل مع العنقود. في هذا الجزء، ستتعلم أوامر Kubectl الأكثر شيوعًا اللازمة لإنشاء عمليات النشر التي تشغّل تطبيقاتك على عنقود Kubernetes. عندما تنشئ عملية نشر، ستحتاج إلى تحديد صورة حاوية التطبيق وعدد النظائر التي تريد تشغيلها. يمكنك تغيير هذه المعلومات لاحقًا عن طريق تحديث النشر. تناقش النقطتان 5 و 6 من هذا الدرس كيفية تحجيم عمليات النشر وتحديثها. بالنسبة إلى عملية النشر الأولى، ستستخدم تطبيق Node.js معبَّأ في حاوية Docker. (إذا لم تكن قد حاولت بالفعل إنشاء تطبيق Node.js ونشره باستخدام حاوية، فيمكنك القيام بذلك أولاً باتباع الإرشادات من مقال مدخل إلى Kubernetes. 3. استكشاف التطبيق: عرض العناقيد والعُقد الكائنات من نوع Pod عندما أنشأت عملية نشر في الجزء 2 أعلاه، أنشأ Kubernetes كائنًا من نوع Pod لاستضافة نظير من التطبيق. كائنات Pod هي تجريد Kubernetes لتمثيل مجموعة واحدة أو أكثر من حاويات التطبيقات (مثل Docker أو rkt)، إضافة إلى موارد مشتركة بين تلك الحاويات. تشمل تلك الموارد: التخزين المشترك، بصيغة تجزئات (Partitions). الشبكات، مثل عنوان IP فريد لكل عنقود. معلومات حول كيفية تشغيل كل حاوية، مثل إصدار صورة الحاوية أو منافذ معينة لاستخدامها. يصمّم كائن Pod "مضيفًا منطقيًّا" خاصًّا بالتطبيق، ويمكن أن يحتوي على حاويات تطبيق مختلفة مقترنة في ما بينها بإحكام نسبيًا. على سبيل المثال، قد يحتوي الكائن على حاوية تطبيق Node.js بالإضافة إلى حاوية أخرى تغذي البيانات التي سينشرها خادم الويب Node.js الذي يعمل في الحاوية الأولى. تشترك الحاويات الموجودة في كائن واحد عنوانَ IP وفضاء منافذ (Port Space)، كما أنها تشترك دائمًا العقدة والجدولة، وتعمل في سياق مشترك على العقدة نفسها. كائنات Pod هي أصغر وحدة على منصة Kubernetes. عندما تنشئ عملية نشر فإن هذا النشر ينشئ كائنات Pod مع حاويات بداخل الكائن (بدلًا من إنشاء حاويات مباشرة). يرتبط كل كائن Pod بالعقدة التي جُدولت عليها، وتظل هناك حتى الإنهاء (وفقًا لسياسة إعادة التشغيل) أو الحذف. في حالة إخفاق العقدة، تُجدول كائنات Pod متطابقة على العقد الأخرى المتاحة في العنقود. نظرة عامة على كائنات Pod عقد Kubernetes تُشَغَّل كائنات Pod دائمًا على عقدة. العقدة هي آلة عاملة في Kubernetes وقد تكون إما آلة افتراضية أو فيزيائية، حسب العنقود. يدير القبطان كل العُقد. يمكن أن تحتوي العُقدة على عدة كائنات Pod. يتولّى القبطان في Kubernetes جدولة كائنات Pod تلقائيًا على عقد العنقود. تأخذ الجدولة التلقائية من طرف القبطان في الاعتبار الموارد المتاحة لكل عقدة. تُشغِّل كل عقدة Kubernetes على الأقل: Kubelet، عملية مسؤولة عن التواصل بين القبطان و العُقدة؛ تُدير كائنات Pod والحاويات التي تعمل على الجهاز. بيئة تشغيل حاويات (مثل Docker وrkt) مسؤولة عن سحب صورة الحاوية من تقييد (Registry)، فك ضغط الحاوية، وتشغيل التطبيق. نظرة عامة على العقد استكشاف الأخطاء وإصلاحها باستخدام kubectl تحدّثنا في الجزء 2 أعلاه عن واجهة سطر الأوامر kubectl. سنستمر في الحديث عنه في هذا الجزء للحصول على معلومات حول التطبيقات المنشورة وبيئاتها. يمكن تنفيذ العمليات الأكثر شيوعًا باستخدام أوامر kubectl التالية: kubectl get - سرد الموارد. kubectl describe - عرض معلومات تفصيلية حول مورد. kubectl logs - طباعة السجلات من حاوية في كائن Pod. kubectl exec - تنفيذ أمر على حاوية في كائن Pod. يمكنك استخدام هذه الأوامر لمعرفة متى نُشرت التطبيقات، وما حالاتها الراهنة، وأين تعمل وما إعداداتها. الآن بعد أن عرفنا المزيد عن مكونات المجموعة لدينا وسطر الأوامر، دعنا نستكشف تطبيقنا. توجد على هذا الرابط بيئة تفاعلية لعرض العناقيد والعقد واستكشاف أوامر kubectl. 4. الإعلان عن التطبيق للعموم استخدام خدمة للإعلان عن التطبيق الخاص بك نظرة عامة على خدمات Kubernetes كائنات Pod في Kubernetes فانية. وهي في الواقع لها دورة حياة. عند توقّف عقدة عاملة تفقد كل كائنات Pod التي تعمل كانت تعمل على العقدة. قد تعيد وحدة التحكم ReplicaSet بعد ذلك العنقود ديناميكيًّا إلى الحالة المرغوبة من خلال إنشاء كائنات Pod جديدة للحفاظ على تشغيل التطبيق الخاص بك. مثال آخر، فلنفترض سندًا (Backend) لمعالجة الصور مع ثلاث حاويّات متماثلة. هذه النسخ المتماثلة قابلة للاستبدال؛ يجب ألا يهتم نظام الواجهة الأمامية بالنسخ المتماثلة للسند أو حتى في حالة فقد كائن Pod وإعادة إنشائه. ومع ذلك، فإن كل كائن Pod في عنقود Kubernetes له عنوان IP فريد، حتى الكائنات على العقدة نفسها. لذا يجب أن تكون هناك طريقة للتوفيق بين التغييرات تلقائيًا بين كائنات Pod حتى تستمر تطبيقاتك في العمل. الخدمة في Kubernetes عبارة عن تجريد يعرّف مجموعة منطقية من كائنات Pod وسياسة للوصول إليها. تتيح الخدمات اقترانًا فضفاضًا بين كائنات Pod المترابطة في ما بينها. تُعرّف الخدمة باستخدام YAML (وهي الوسيلة المفضّلة) أو JSON، مثل جميع كائنات Kubernetes. عادةً ما تُحدّذ مجموعة كائنات Pod التي تستهدفها الخدمة بواسطة كائن من النوع LabelSelector (انظر أدناه لمعرفة الحالات التي قد تدعوك لإنشاء خدمة بطريقة مغايرة). على الرغم من أن كل كائن Pod لديه عنوان IP فريد، إلّا أنّ تلك العناوين لا تُعرَض خارج العنقود بدون خدمة. تسمح الخدمات لتطبيقاتك بتلقي حركة المرور. يمكن الإعلان عن الخدمات بطرق مختلفة عن طريق تحديد النوع type في ServiceSpec: ClusterIP (قيمة افتراضية): يعرض الخدمة على عنوان IP داخلي في العنقود. يجعل هذا النوع الوصول للخدمة متاحًا فقط من داخل العنقود. NodePort: يعرض الخدمة على نفس المنفذ لكل عقدة محددة في العنقود باستخدام ترجمة عناوين الشبكة (NAT). يتيح الوصول إلى خدمة من خارج العنقود باستخدام عنوان IP العنقود ورقم المنفذ (<NodeIP>:<NodePort>). امتداد للطريقة السابقة (ClusterIP). LoadBalancer : ينشئ موازن حِمْل خارجي في السحابة الحالية (إذا كانت تدعم ذلك) ويعين عنوان IP ثابتًا خارجيًا للخدمة. امتداد للطريقة السابقة (NodePort). ExternalName: يُعلن عن الخدمة باستخدام اسم عشوائي (محدد بواسطة القيمة externalName في المواصفات spec) عن طريق إرجاع سجل CNAME يتضمّن الاسم. لا يُستخدَم أي وكيل (Proxy). يتطلب هذا النوع الإصدار v1.7 أو أعلى من حزمة kube-dns. يمكن العثور على مزيد من المعلومات حول الأنواع المختلفة من الخدمات في الدرس التالي، وأيضًا من خلال هذا المقال. بالإضافة إلى ذلك، يُرجى ملاحظة أن هناك حالات استخدام لا تتضمن فيها الخدمات تحديد حقل selector في المواصفات (spec). لن تنشئ الخدمة في تلك الحالة الكائن الطرفي (Endpoint object) المقابل، وهو ما يسمح للمستخدمين بالتعيين اليدوي للنقاط الطرفية للخدمة. توجد إمكانية أخرى لعدم وجود حقل selector وهي أنك تستخدم النوع ExternalName. الخدمات واللصائق (Labels) توجّه الخدمة البيانات عبر مجموعة من كائنات Pod. الخدمات هي طبقة تجريد تسمح بزوال كائنات Pod وتكرارها دون التأثير على عمل التطبيق في بيئة Kubernetes. تتولّى خدمات Kubernetes اكتشاف كائنات Pod المترابطة (مثل تطبيق يتكوّن من سند وواجهة أمامية) والتوجيه بينها. تتعرّف الخدمات على كائنات Pod المترابطة من خلال المحدّدات واللصائق (Selectors and Labels). المحدّدات هي دوال للتجميع تسمح بإجراء عمليات منطقية على كائنات Kubernetes، أمّا اللصائق فهي أزواج مفاتيح وقيم (Key/Value) مرفقة بالكائنات، ويمكن استخدامها بأي واحدة من الطرق التالية: تعيين كائنات للتطوير والاختبار والإنتاج، تضمين وسوم الإصدار، تصنيف كائن حسب الوسوم. يمكن إرفاق التسميات أو اللصائق (label) بالكائنات في وقت الإنشاء أو لاحقا. يمكن تعديلها في أي وقت. تجربة تفاعلية لعرض التطبيق للعموم باستخدام خدمات Kubernetes. 5. تحجيم التطبيق تشغيل نُسَخ متعددة للتطبيق رأينا أعلاه كيفية إنشاء عملية نشر (Deplyment)، ثم كيفية الإعلان عنها للعموم عبر خدمة. أنشأت عملية النشر كائن Pod واحدًا لتشغيل التطبيق. عندما تزداد حركة البيانات، سنحتاج إلى تحجيم (Scaling) التطبيق لمواكبة طلب المستخدم. يتحقّق التحجيم عن طريق تغيير عدد النظائر المنشورة. نظرة عامة على التحجيم سيضمن تحجيم النشر إنشاء كائنات Pod جديدة وجدولتها على العقد ذات الموارد المتاحة. سيؤدي التحجيم إلى زيادة عدد كائنات Pod إلى الحالة المرغوبة الجديدة. يدعم Kubernetes أيضًا التحجيم التلقائي Autoscaling لكائنات Pod، ولكنّ ذلك خارج نطاق هذا الدرس. التحجيم باتجاه الصفر ممكن أيضًا، وسيؤدي إلى إنهاء جميع كائنات Pod في عملية النشر المحددة. يتطلب تشغيل نسخ متعددة من تطبيق ما طريقة لتوزيع حركة البيانات عليها جميعا. تتضمّن الخدمات موازِن حِمل متكامل من شأنه أن يوزِّع البيانات المارة في الشبكة على جميع كائنات Pod الموجود ضمن نشر متاح للعموم. تراقب الخدماتُ كائنات Pod العاملة باستمرار باستخدام النقاط الطرفية لضمان إرسال البيانات إلى كائنات Pod المتاحة فقط. بمجرد أن يكون لديك نُسَخ متعددة للتطبيق قيد التشغيل، ستتمكن من دحرجة التحديثات دون توقف. سنغطي ذلك في الأجزاء التالية، وهو ما سنراه في الجزء اللاحق. يمكنك تجربة تحجيم التطبيق (بتوسيعه أو تقليصه) عبر هذه الطرفية التفاعلية. 6. تحديث التطبيق التحديث المتدحرج (Rolling update) يتوقع المستخدمون أن تكون التطبيقات متاحة طوال الوقت، ويُنتظر من المطورين أن ينشروا إصدارات جديدة منها عدة مرات في اليوم. في Kubernetes يتم ذلك عن طريق التحديثات المتدحرجة. تسمح التحديثات المتدحرجة بتحديث عمليات النشر دون توقف عن طريق التحديث التدريجي بإحلال كائنات Pod جديدة تدريجيًّا مكان الكائنات الحالية. تُجدول كائنات Pod الجديدة على العُقد التي لديها موارد متاحة. تحدّثنا في الجزء السابق عن تحجيم التطبيق لتشغيل نُسَخ متعددة. هذا الأمر مطلوب لإجراء التحديثات دون التأثير على توفر التطبيق. افتراضيًّا، الحد الأقصى لعدد كائنات Pod التي يمكن أن تكون غير متاحة ولعدد كائنات Pod الجديدة التي يمكن إنشاؤها أثناء التحديث، هو واحد. يمكن ضبط كل واحد من الخيارين إما بالأرقام أو بالنسب المئوية (من كائنات Pod). تؤصدر (Versioned) التحديثات في Kubernetes، ويمكن التراجع عن أي تحديث نشر إلى إصدار سابق (مستقر). نظرة عامة على التحديثات المتدحرجة على غرار تحجيم التطبيق، إذا كان النشر متاحًا للعموم، فإن الخدمة ستوازن حركة البيانات فقط بين كائنات Pod المتاحة أثناء التحديث. كائن Pod متاح هو نظير متوفّر لمستخدمي التطبيق. تسمح التحديثات المتدحرجة بالإجراءات التالية: نقل تطبيق من بيئة إلى أخرى (عبر تحديثات صورة الحاوية). التراجع إلى إصدارات سابقة. التكامل المستمر والتوصيل المستمر للتطبيقات بدون توقف. يمكن استخدام هذه النافذة التفاعلية لاختبار تحديث تطبيق إلى إصدار جديد والتراجع عن ذلك. ترجمة - وبتصرّف - لأجزاء kubernetes basics من توثيق Kubernetes.
  4. Microsoft Publisher هو أحد تطبيقات حزمة Office المكتبية. وكما هو واضح من اسم البرنامج، لقد وُجِد لمساعدتك على إنشاء جميع أنواع العناصر القابلة للطباعة والنشر، كالمنشورات الدعائية، الملصقات، بطاقات العمل، بطاقات الدعوة، الكتيبات، المطويات، وغيرها الكثير من المنشورات. ستبدو لك واجهة البرنامج مألوفة جدا حتى وإن لم تستخدم البرامج من قبل. إذ أنّه يحتوي على العديد من الخصائص المشابهة لبرامج ميكروسوفت أوفيس الأخرى، وخصوصا ميكروسوفت وورد. يمكنك إنشاء منشورات بسيطة، أو احترافية مخصصة باستخدام مجموعة من الأدوات البسيطة، أو بإمكانك استخدام القوالب الجاهزة والتعديل عليها. قد تتساءل، لماذا استخدم هذا البرنامج إذا كان بإمكاني استخدام الأدوات أو القوالب المشابهة في وورد؟ السبب هو أنّ برنامج Publisher يوفر مساحة عمل أكثر مرونة لإنشاء مستندات بأحجام وتخطيطات متنوعة. وكذلك يوفر مجموعة كبيرة من الأدوات للتحكم في تصميم الصور ومحاذاتها. أي أنّه يركز على تخطيط وتصميم الصفحة أكثر من تنسيق النصوص والفقرات. وكما ذكرنا، بإمكاننا إنشاء المنشورات وطباعتها بأجهزة الطباعة الاعتيادية. وكذلك بالإمكان تحويل المنشورات إلى ملفات بصيغ أخرى، كصيغة PDF أو بصيغة صور. أو استخدام HTML لأغراض النشر على صفحات الويب. سنتعلّم في هذا الجزء بعض أساسيات العمل على البرنامج، كإنشاء منشورات جديدة، تعديلها، التعامل مع الصور والأشكال، بالإضافة إلى حفظ المنشورات. إنشاء منشور Publication جديد عندما تقوم بفتح البرنامج ستجد قائمة من القوالب المميزة للاختيار من بينها. يمكنك اختيار القالب الفارغ Blank وبالاتجاه الأفقي أو العمودي لتصميم المنشور من الصفر. أو اختيار أحد القوالب من معرض القوالب، وبذلك توفر الكثير من الوقت. كما ستجد على الجانب المنشورات التي تم العمل عليها مؤخرا Recent. لديك خيار تثبيت أي منشور من قائمة Recent بالنقر على أيقونة الدبوس، وهذا الخيار مفيد إذا كان المنشور يتطلب التعديل والتحديث بصورة مستمرة كالتقاويم أو النشرات الإخبارية: كما يمكنك اختيار أحد القوالب من معرض القوالب المضمّنة Built-in. انقر على Built in واختر أحد التصنيفات المتوفرة: عند اختيار التصنيف ستُعرض مجموعة القوالب التي تندرج تحت هذا التصنيف. انقر على أحد المصغرات لعرض خصائصه على جانب النافذة، يمكنك من خلالها تخصيص مجموعة الألوان أو الخطوط. انقر على إنشاء Create لفتح القالب: بإمكانك أيضا البحث عن القوالب على الإنترنت. اكتب في حقل البحث نوع المنشورات التي تريد إنشاءها: انقر على مصغرات القوالب لمعاينتها بصورة أكبر، واستخدم الأسهم على الجوانب لتصفح بقية القوالب. عند اختيار القالب المناسب انقر على إنشاء Create لتنزيله وفتحه: تحرير المنشور على غرار برامج حزمة أوفيس الأخرى، تتكون واجهة البرنامج من عدد من التبويبات، وكل تبويب ينقسم إلى مجموعات. تحتوي المجموعة الواحدة على الأدوات والأوامر ذات الصلة. وإذا كنت قد عملت على وورد أو بوربوينت من قبل، ستجد معظم هذه الأوامر مألوفة. يحتوي تبويب الصفحة الرئيسية Home على الأوامر الخاصة بتنسيق النصوص المعتادة، كالحجم، اللون، نوع الخط، ...إلخ. كما يحتوي على أوامر أخرى خاصة بإدراج بعض العناصر ومحاذاتها: أما تبويب إدراج Insert فيحتوي على المزيد من العناصر التي يمكنك إدراجها والتي تساعدك على تصميم منشورك بسرعة وسهولة. يمكنك، مثلا، إدراج أجزاء جاهزة ومنسقة مسبقا كالعناوين، أو الاقتباسات من أمر أجزاء الصفحة Page Parts: أو تحسين منشورك بإضافة إطار مخصص حول الصور أو الأشكال من أمر الحدود والتشكيلات Borders & Accents: تتوفر لك المزيد من خيارات الإدراج الأخرى كإدراج تقويمات Calendars، إعلانات Advertisements، معلومات مهنية Business Information، ...إلخ. لنفترض، مثلا، أنّك قمت باختيار أحد القوالب الجاهزة كنقطة بداية، وتريد تخصيصه وتحريره حسب ما يناسبك. ستلاحظ أنّ أي قالب يتكون من مجموعة من العناصر، كالصور، الأشكال، مربعات النصوص، وغيرها. قد تكون هذه العناصر مستقلة أو مرتبطة ببعضها. عند تمرير الفأرة فوق محتويات القالب سيظهر إطار متقطع يدلّك على وجود عنصر، سواء كان صورة أو مربع نص أو غيره: اضغط على مفتاحي CTRL+A لتحديد كافة محتويات الصفحة، وبذلك تستدل إلى كافة العناصر الموجودة فيها: من الخصائص الشائعة والمفيدة هي الربط بين مربعات النصوص. بهذه الطريقة يمكنك إنشاء مربع نص في صفحة، وإكمال مربع النص في صفحة ثانية إذا كانت الصفحة الأولى لا تحتوي على مساحة كافية. على سبيل المثال، إذا رغبت في إضافة نصوص إضافية إلى مربع النص الموضح في الصورة أدناه، وكانت مساحة المربع الحالي لا تكفي لاحتواء كافة النصوص: يمكنك إكمال مربع النص أسفل الصورة بالنقر بزر الفأرة الأيمن على المربع واختيار إنشاء ارتباط مربع نص Create Text Box Link: سيتحول شكل المؤشر إلى شكل سطل، انقر فوق المنطقة التي تريد إكمال مربع النص فيها: بعد إدراج مربع النص الإضافي، قم بتغيير حجمه وموضعه، واستفد من خطوط الإرشاد guides لمحاذاته بشكل صحيح. ستلاحظ ظهور سهم أسود اللون على جانب المربع، استخدم هذا السهم للانتقال إلى مربع النص الآخر المرتبط به. عندما تقوم بإضافة نصوص أخرى إلى المربع الأول سيتم إدراج تكملتها في المربع الثاني الذي قمت بربطه: من العمليات الشائعة الأخرى عند تحرير القوالب هي تغيير صور القالب الافتراضية واختيار صور مخصصة. يمكنك استخدام منطقة المسودة (أو التسويد) Scratch Area (وهي المنطقة الرمادية المحيطة بالصفحة) لتحضير الصور التي تنوي استخدامها في المنشور فيها. حدد مجموعة الصور من المجلد المرغوب ثم اسحبها إلى منطقة المسودة: يمكنك تخزين مختلف العناصر في هذه المنطقة، كالأشكال أو مربعات النصوص ومن ثم سحبها وإدراجها في الصفحة لاحقا عند الحاجة. يمكنك تغيير الصور أيضا بالنقر بزر الفأرة الأيمن، تمرير المؤشر فوق تغيير الصورة Change Picture، ثم اختيار تغيير الصورة Change Picture: سيُفتح مربع يمكنك من خلاله اختيار صورة من ملف مخزون على جهازك أو تنزيل صورة من الإنترنت: عند تحديد أي صورة سيظهر تبويب تنسيق Format الذي يحتوي على العديد من الخيارات لتنسيق الصورة. كإعادة التلوين Recolor: أو تغيير نمط الصورة باختيار أحد النماذج من معرض أنماط الصورة Picture Styles: تلاعب بالخيارات الأخرى واستكشفها بنفسك حتى تصل إلى النتيجة المرغوبة. إدراج العناصر الجرافيكية في أغلب الأحيان، لا تخلو المنشورات من العناصر الجرافيكية، كالصور والأشكال، بالإضافة إلى النصوص. وكما ذكرنا سابقا يمكنك إدراج مختلف العناصر من تبويب إدراج Insert. بإمكانك إدراج صورة محفوظة على جهازك بالنقر على أمر الصور Pictures، واختيار الصورة المرغوبة من مجلد الحفظ: وكذلك تستطيع البحث عن صورة محددة على الإنترنت وإدراجها بالنقر على امر صور عبر الإنترنت Online Pictures: بإمكانك البحث على الإنترنت عن الصورة المرغوبة، أو على حسابك على OneDrive.وكذلك لديك خيار إدراج الصور من حساباتك على فيس بوك أو Flickr بعد ربط البرنامج بهذه الحسابات. من الأمور التي يجب أن تأخذها في الاعتبار عند تنزيل الصور من الإنترنت هي حقوق الصورة. إذ أنّ بعض الصور لها حقوق استخدام وليست لديك حرية استخدامها مجانا. من الأمور الأخرى الواجب مراعاتها هي الدقة. فالمنشور الذي تعمل عليه سيُوجّه على الأغلب للطباعة، وفي هذه الحالة يفضل جدا أن يكون بدقة عالية. تكون الصور بصورة عامة ذات دقة عالية إذا كان رقم DPI مساو لـ 96 فما فوق. لكن قد تتطلب طابعتك دقة 150-300 DPI. اكتب الكلمة المفتاحية للبحث في حقل البحث واضغط مفتاح Enter. حدد الصورة المرغوبة وانقر على إدراج Insert: بعد إدراج الصورة، أصبح بإمكانك تغيير حجمها وموضعها ضمن الصفحة. ويمكنك تغيير التفاف النص حول الصور أو خلالها من أمر Wrap Text في تبويب الصفحة الرئيسية Home (أو في تبويب Format السياقي). مرر الفأرة فوق طريقة الالتفاف لعرض معاينة مباشرة وانقر عليه بزر الفأرة الأيسر لتطبيقه: من الخيارات الأخرى المفيدة إدراج عنصر نائب للصورة Picture Placeholder والذي هو بمثابة حجز مكان للصورة التي ترغب في إدراجها لاحقا: من نفس التبويب ونفس المجموعة (Illustrations) تستطيع إدراج شكل من قائمة الأشكال القياسية، أو رسم شكل مخصص باستخدام أداة FreeForm: خيارات حفظ المنشورات إنّ حفظ العمل هو خطوة مهمة جدا في كل البرامج التي تعمل عليها. ومن حسن الحظ يوفر Microsoft Publisher إمكانية حفظ العمل تلقائيا بعد مرور فترة محددة من الزمن. لتخصيص هذا الخيار اذهب إلى تبويب: ملف File > خيارات Options من قسم حفظ Save، تأكد من تأشير خيار حفظ معلومات الاسترداد التلقائي كل... Save AutoRecover information every: الخيار الافتراضي هو حفظ المنشور كل 10 دقائق. لكن يمكنك تقليص هذه المدّة لتصبح دقيقة واحدة. وهذا الخيار مفيد جدا في حال حصل أي خلل وانطفأ جهازك، عندئذ يمكنك إكمال عملك من آخر معلومات تم حفظها. إذا كنت تعمل على المنشور لأول مرة ولم تقم بحفظه بعد، انقر على أيقونة الحفظ من شريط الوصول السريع: أو اذهب إلى تبويب: ملف File > حفظ Save ثم قم بتسمية الملف وحدد مجلد الحفظ: سيتم حفظ الملف بصيغة Pub. أما إن لم تكن هذه المرة الأولى لحفظ الملف فسيتم حفظ التغييرات التي أجريتها بعد آخر عملية حفظ عند النقر على أيقونة الحفظ. لحفظ المنشور بصيغ أخرى اذهب إلى تبويب: ملف File > تصدير Export من هذه النافذة يمكنك حفظ المنشور بصيغة Pub أقدم من الإصدار الحالي لتتوافق مع الإصدارات القديمة من البرنامج: أو حفظ المنشور بصيغة صورة PNG، JPEG، إلخ: إذا كنت ترغب في حفظ نسخة إلكترونية من المنشور (وليس لغرض الطباعة)، يمكنك حفظ بصيغة PDF أو XPS. انقر على Create PDF/XPS Document: من نافذة الحفظ يمكنك تسمية المستند، وتحديد نوعه (PDF أو XPS). وكذلك يمكنك الوصول إلى خيارات إضافية بالنقر على زر Options: من مربّع الحوار Publish Options يمكنك التحكم في جودة المنشور (الخيار الافتراضي هو الطباعة عالية الجودة High quality printing). فعند النقر على خيارات الجودة المتوفرة سيظهر تلميح يخبرك بالحالات التي تناسب هذه الجودة. مثلا عند اختيار الطباعة القياسية Standard سيتم إنشاء ملف بحجم مضغوط وملائم للنشر على الإنترنت. أما عند تحديد خيار High quality printing فسيتم إنشاء ملف بحجم كبير وملائم للطباعة المكتبة. وبالطبع كلما كانت الجودة عالية يزداد حجم الملف، والعكس بالعكس. وستتغير قيم DPI تبعا لتغيير خيار جودة المنشور. يمكنك أيضا تشفير الملف بواسطة كلمة سرية بتحديد الخيار Encrypt the document with a password. لإنشاء إصدار HTML من المنشور انقر على Publish HTML: في هذه الحالة لديك خياران، أما إنشاء صفحة ويب HTML وهذا يعني إنشاء ملف HTML يتضمن عناصر ذات مواضع ثابتة على الصفحة. أو إنشاء صفحة ويب أحادية الملف (Single File Web Page (MHTML وهذا يعني أنّ جميع الصور، الخطوط، والوسائط سيتم تضمينها في الصفحة وسينتج عنه ملف واحد في النهاية. حدد أحد الخيارين ثم انقر على Publish HTML.
  5. 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.
  6. ستغطّي هذه السّلسلة عمليّة نشر تطبيق PHP بسيط باستخدام Ansible، الهدف النّهائي سيكون الحصول على خادوم ويب جديد يُخدِّم تطبيق PHP بسيط بدون أي اتصال عبر SSH أو تشغيل يدوي للأوامر على الخادوم الهدف، سنغطي في هذا القسم من الدرس تثبيت Ansible وإعداد البيئة بشكل عام. سنستخدم إطار عمل Laravel كمثال عن تطبيق PHP ولكن يُمكِن تعديل هذه التعليمات بسهولة لتدعم أطر عمل وتطبيقات أخرى في حال كانت متواجدة لديك. المتطلبات الأساسيةسنستخدم Ansible لتثبيت وإعداد Nginx، PHP، وخدمات أخرى على خادوم Ubuntu 14.04 ، يعتمد هذا الدّرس على معرفتك الأساسية بـ Ansible لذا إن كنت جديدًا عليها فبإمكانك قراءة درس Ansible الأساسي أولًا. ستحتاج لمتابعة هذا الدّرس إلى: خادوم Ubuntu 14.04 بأي حجم والذي سنستخدمه لإعداد ونشر تطبيق PHP الخاص بنا عليه، ستتم الإشارة إلى عنوان IP هذا الجهاز بـ your_server_ip خلال هذا الدّرس.خادوم Ubuntu 14.04 والذي سنستخدمه من أجل Ansible، وهو الخادوم الذي سنبقى في وضعية تسجيل دخول عليه في كامل هذا الدّرس.إعداد مستخدم غير جذري مع صلاحيّات sudo لكل خادوم.مفاتيح SSH من أجل خادوم Ansible لتصريح تسجيل الدخول على خادوم نشر PHP، ويُمكِن إعدادها باتّباع هذه السلسلة وتطبيقها على خادوم Ansible الخاص بنا.الخطوة الأولى – تثبيت Ansibleيُمكِن إنجاز هذه الخطوة بسهولة عن طريق تثبيت PPA (أرشيف الحِزَم الشخصي Personal Package Archive) وتثبيت حزمة Ansible باستخدام apt. نُضيف أوّلًا PPA باستخدام الأمر apt-add-repository: sudo apt-add-repository ppa:ansible/ansibleوبعد انتهائه نقوم بتحديث ذاكرة التخزين المؤقّت cache لـ apt: sudo apt-get update نقوم بتثبيت Ansible أخيرًا: sudo apt-get install ansibleحالما يتم تثبيت Ansible نقوم بإنشاء دليل جديد للعمل بداخله وضبط الإعدادات الأساسيّة، تستخدم Ansible افتراضيًّا ملف مضيفين hosts موجود في المسار etc/ansible/hosts/، وهو يحتوي كافّة الخواديم التي يُديرها، وبينما يكون هذا الملف مناسبًا لبعض حالات الاستخدام فهو عام global، وهو ما لا نريده هنا. سنقوم من أجل هذا الدّرس بإنشاء ملف مضيفين محلّي local واستخدامه بدلًا من الملف السابق، نستطيع فعل هذا عن طريق إنشاء ملف إعدادات Ansible جديد بداخل دليل العمل لدينا، والذي بإمكاننا استخدامه لإخبار Ansible بأن تبحث عن ملف المضيفين داخل نفس الدليل. نُنشِئ مُجلّدًا جديدًا (سنستخدمه لبقيّة هذا الدّرس): mkdir ~/ansible-php ننتقل إلى داخل المُجلّد الجديد: cd ~/ansible-php/نُنشِئ ملفًّا جديدًا يُدعى ansible.cfg ونفتحه من أجل تحريره باستخدام nano أو أي مُحرِّر نصوص تفضله: nano ansible.cfgنضيف خيار الإعدادات hostfile مع القيمة hosts في المجموعة [defaults] عن طريق نسخ ما يلي إلى الملف ansible.cfg: ansible.cfg [defaults] hostfile = hostsنحفظ الملف ansible.cfg ونغلقه، نقوم بعدها بإنشاء الملف hosts والذي يحتوي على عنوان IP لخادوم PHP حيث سيتم نشر تطبيقنا. nano hostsننسخ ما يلي لإضافة قسم من أجل php مع وضع عنوان IP الخاص بخادومك بدلًا من your_server_ip ووضع اسم المستخدم غير الجذري الذي قمت بإنشائه في المتطلبات الأساسيّة على خادوم PHP بدلًا من sammy: hosts [php] your_server_ip ansible_ssh_user=sammy نحفظ ونغلق الملف hosts، فلنقم بإجراء تحقّق أبسط للتأكد من قدرة Ansible على الاتصال بالمضيف كما هو متوقّع عن طريق استدعاء الوحدة ping على المجموعة php الجديدة: ansible php -m pingربّما تحصل على تحقّق من استيثاق مُضيف SSH اعتمادًا على كونك قد سجلّت الدخول إلى هذا المُضيف من قبل، ينبغي أن تعود ping باستجابة ناجحة تبدو كما يلي: Output 111.111.111.111 | success >> { "changed": false, "ping": "pong" تمّ الآن تثبيت وإعداد Ansible بنجاح، نستطيع الانتقال إلى إعداد خادوم الويب لدينا. الخطوة الثانية – تثبيت الحزم المطلوبةسنقوم في هذه الخطوة بتثبيت بعض حِزَم النظام المطلوبة باستخدام Ansible و apt، سنثبت تحديدًا git، nginx، sqlite3، mcrypt، وبعض حِزَم php5-*. نحتاج قبل إضافة الوحدة apt لتثبيت الحِزَم التي نريدها إلى إنشاء playbook بسيط (وهو عبارة عن قواعد تُحدِّد إعدادات Ansible)، سنبني على هذا الـ playbook مع تقدّمنا في هذا الدّرس، نقوم بإنشاء playbook جديد يُدعى php.yml: nano php.yml نلصق الإعدادات التالية، يُحدِّد أول سطرين مجموعة المضيفين التي نرغب باستخدامها (php) وتتحقّق من أنّها تنفّذ الأوامر باستخدام sudo افتراضيًّا، تُضيف باقي الأسطر وحدة بالحِزَم التي نحتاجها، تستطيع تخصيصها من أجل تطبيقاتك الخاصّة أو استخدام الإعدادات التالية إن كنت تتبع مثال تطبيق Laravel: --- - hosts: php sudo: yes tasks: - name: install packages apt: name={{ item }} update_cache=yes state=latest with_items: - git - mcrypt - nginx - php5-cli - php5-curl - php5-fpm - php5-intl - php5-json - php5-mcrypt - php5-sqlite - sqlite3نحفظ الملف php.yml، ونقوم أخيرًا بتشغيل ansible-playbook لتثبيت الحِزَم على الخادوم، يجب ألّا ننسى استخدام الخيار --ask-sudo-pass إن كان يتطلّب مستخدم sudo على خادوم PHP كلمة سر: ansible-playbook php.yml --ask-sudo-passالخطوة الثالثة – تعديل ملفات إعدادات النظامسنقوم في هذا القسم بتعديل بعض ملفّات إعدادات النظام على خادوم PHP، أهم خيار إعدادات يُمكِن تغييره (بغض النظر عن ملفّات Nginx، والتي سيتم تغطيتها في خطوة لاحقة) هو الخيار cgi.fix_pathinfo في php5-fpm، لأنّ القيمة الافتراضيّة له تُشكِّل خطرًا أمنيًّا. سنوضّح أوّلًا جميع الأقسام التي سنضيفها إلى هذا الملف، ونضمّن بعدها كامل الملف php.yml من أجلك لكي تقوم بنسخه ولصقه. يُمكِن استخدام الوحدة lineinfile للتأكّد من أنّ قيمة الإعدادات ضمن الملف مطابقة تمامًا لما نتوقعه، يُمكِن عمل هذا باستخدام تعبير نمطي regular expression عام بحيث تتمكّن Ansible من فهم معظم الصيغ التي من المحتمل أن يكون فيها المُعامِل، سنحتاج أيضًا لإعادة تشغيل php5-fpm وnginx لضمان تطبيق التغييرات، لذا نحتاج إلى إضافة مُداوِلَين handlers اثنين أيضًا في قسم جديد للمداولات handlers، تكون المداولات مثاليّة لهذا لأنّه يتم إطلاقها فقط عند تغيير المهمّة، ويتم أيضًا تشغيلها في نهاية الـ playbook، لذا يُمكن لمهام متعدّدة استدعاء نفس المُداوِل وسيعمل فقط مرّة واحدة. يبدو القسم الذي يُنفِّذ ما سبق كما يلي: name: ensure php5-fpm cgi.fix_pathinfo=0 lineinfile: dest=/etc/php5/fpm/php.ini regexp='^(.*)cgi.fix_pathinfo=' line=cgi.fix_pathinfo=0 notify: - restart php5-fpm - restart nginx handlers: - name: restart php5-fpm service: name=php5-fpm state=restarted - name: restart nginx service: name=nginx state=restartedملاحظة: خطأ برمجي bug في إصدار Ansible 1.9.1 يوجد خطا برمجي في إصدار Ansible 1.9.1 يمنع php5-fpm من إعادة تشغيلها مع الوحدة service، وقد استخدمنا هذا في مُداولاتنا. وحتى يتم إصدار إصلاح له نستطيع الالتفاف على هذه المشكلة عن طريق تغيير المُداوِل restart php5-fpm من استخدام الأمر service إلى استخدام الأمر shell كما يلي: - name: restart php5-fpm shell: service php5-fpm restartسيتجاوز هذا المشكلة ويعيد تشغيل php5-fpm بشكل صحيح. نحتاج بعد ذلك أيضًا إلى التأكّد من تمكين الوحدة php5-mcrypt، يُمكن فعل هذا عن طريق تنفيذ script يُدعى php5enmod باستخدام صدفة المهام shell task والتحقّق من وجود الملف 20-mcrypt.ini في مكانه عند تمكينه، لاحظ أنّنا نخبر Ansible أنّ المهمّة تقوم بإنشاء ملف مُحدَّد، فإن كان هذا الملف موجودًا فلن يتم تشغيل المهمّة: name: enable php5 mcrypt module shell: php5enmod mcrypt args: creates: /etc/php5/cli/conf.d/20-mcrypt.iniنفتح الآن الملف php.yml لتحريره مرّة أخرى: nano php.ymlنضيف المهام والمداولات السابقة بحيث يتطابق الملف مع التالي: --- - hosts: php sudo: yes tasks: - name: install packages apt: name={{ item }} update_cache=yes state=latest with_items: - git - mcrypt - nginx - php5-cli - php5-curl - php5-fpm - php5-intl - php5-json - php5-mcrypt - php5-sqlite - sqlite3 - name: ensure php5-fpm cgi.fix_pathinfo=0 lineinfile: dest=/etc/php5/fpm/php.ini regexp='^(.*)cgi.fix_pathinfo=' line=cgi.fix_pathinfo=0 notify: - restart php5-fpm - restart nginx - name: enable php5 mcrypt module shell: php5enmod mcrypt args: creates: /etc/php5/cli/conf.d/20-mcrypt.ini handlers: - name: restart php5-fpm service: name=php5-fpm state=restarted - name: restart nginx service: name=nginx state=restarted نقوم أخيرًا بتشغيل playbook: ansible-playbook php.yml --ask-sudo-pass يمتلك الآن الخادوم كافّة الحِزَم المطلوبة مُثبّتة عليه ومجموعة الإعدادات الأساسيّة جاهزة للانطلاق. الخاتمةتحدثنا في القسم الأول من هذا الدّرس عن طريقة تثبيت Ansible وإعداد البيئة بشكل عام من أجل التحضير لعمليّة نشر تطبيق PHP بسيط باستخدام Ansible، وسنكمل في القسم الثاني الحصول على Laravel وإعداده وإعداد خادوم Nginx لتخديم تطبيق PHP. ترجمة -وبتصرّف- لـ How To Deploy a Basic PHP Application Using Ansible on Ubuntu 14.04 لصاحبه Stephen Rees-Carter.
  7. من الصعب العمل على وسائل التواصل الاجتماعي وخصوصا فيما يتعلّق ببناء قاعدة من الجماهير. لكنّ الصعب ليس مستحيلا، وبالتأكيد لا يعني أنّك لا تستطيع الاستمتاع بعملك (أو تحاول على الأقل) وتجعل هذه العملية سهلة قدر الإمكان. هنا يأتي دور تقويم النشر على الشبكات الاجتماعية (social media calendar). ربما لم تتوقّع أن يكون للتقويم ذلك التأثير الكبير، وبالفعل هو لا يحلّ كل شيء، لكنه بدون شك سيساعدك على معالجة الأمور المتعلّقة بالنشر والمشاركة بشكل أفضل ويخفف عنك بعض الإجهاد. سنقوم في هذا المقال بالتركيز على إنشاء تقويم وسائل التواصل الاجتماعي. وفيما يتعلّق بوسائل التواصل الاجتماعي يمكن أن يساعدك التقويم على عرض جميع المنشورات التي تخطط لنشرها في الأسابيع أو الأشهر المقبلة بشكل مرئي. وفوق كل ذلك، سيساعدك على صياغة منشوراتك مسبقا لكي تضمن دائما وجود منشورات جاهزة للمشاركة. إذا، كيف يمكنك أن تحقق كل ذلك؟ إعداد تقويم التواصل الاجتماعيالخطوة 1: التصنيفاتإن لم تكن قد قمت بذلك بالفعل عند إنشاء جدول المشاركة، من المفيد أن تُنشئ قائمة تشتمل على جميع أنواع المنشورات التي ترغب في مشاركتها بشكل منتظم، خصوصا إذا كنت تشارك العديد من الأنواع المختلفة من التحديثات. يمكن أن تتضمن المنشورات التي تشاركها الأنواع التالية مثلا: المنشورات النقاشيةمنشورات المدونةإعادة مشاركة المحتوى الممتعالاقتباساتالنصائحالصور/الفيديوهات؛ محتوى الوسائط المتعددةالمنشورات الترويجيةالإعلاناتالأحداثيمكنك أن تتوسع أو تحد من هذه الأنواع حسب نوع المحتوى الذي ترغب في نشره. الصورة أدناه توضح التصنيفات التي تعتمدها حسابات Hubspot في تقويم وسائل التواصل الاجتماعي الخاص بهم. الخطوة 2: نشر التصنيفاتبعد أن قمت بتحديد التصنيفات، حان الوقت لتقرر أيّ الأيام/الأوقات التي ترغب في نشرها فيها. على سبيل المثال، يمكن نشر مقالات المدونة في يومي الإثنين والأربعاء، والنصائح كل يوم جمعة. الخطوة 3: تجهيز التحديثاتهنا يكمن الجزء الأكثر متعة والأكثر فائدة لتقويم وسائل التواصل الاجتماعي. جهّز جميع المحتوى الذي ستنشره في الأسابيع/الأشهر المقبلة. أنصحك بكتابة أقصى قدر ممكن من التحديثات المستقبلية ولجميع التصنيفات. كما أنصحك أيضا بتجهيزها إما لكل يوم أو لكل الفئة، أيهما أكثر فعالية أو إلهاما بالنسبة لك. المثال التالي يوضّح ما يبدو عليه أحد التحديثات لحساب Buffer على تويتر: الخطوة 4: الأحداث/المناسبات الخاصةبالإضافة إلى المنشورات العادية، يمتلئ العام بالعديد من الأحداث أو المناسبات الخاصة، وسيكون من الرائع التخطيط لها مسبقا لكي تتأكّد من عدم تفويت هذه المناسبات وخلق الكثير من الإثارة والفرص المتعلّقة بها. أنصحك بكتابة المنشورات الخاصة بهذه المناسبات في أبكر وقت ممكن لكي تتمكن من تقليل احتمالية نسيانها أو تفويتها. من المناسبات التي قدر ترغب في تغطيتها هي: الأعياد، وخصوصا تلك المتعلّقة بمجال عملكإطلاق المنتجاتالإعلاناتاللقاءاتهناك بعض المواقع التي تعتبر من المصادر الرائعة التي يمكنك استخدامها للتحضير لأحداث ممتعة والاحتفال بها، مثل قسم Today in History لموقع History.net، وموقع Days of the Year. أنواع التقاويمهناك العديد من الطرق المختلفة يمكنك أن تنظم بها تقويمك للنشر على وسائل التواصل الاجتماعي اعتمادا على احتياجاتك وتفضيلاتك. طريقة العرض الشهريإنّ استخدام التقويم بطريقة العرض الشهري من الوسائل الرائعة لتتمكن من عرض المحتوى المجدول لنشره في الأسابيع القليلة المقبلة بشكل مرئي، بالإضافة إلى تسليط الضوء على بعض الأحداث الكبيرة القادمة والتي قد تحتاج إلى التركيز عليها. تصلح طريقة العرض الشهري للجداول المزدحمة أو الخفيفة. بالنسبة للجداول المزدحمة، أنصحك باستخدامها للتركيز على أكثر المنشورات أهمية لكيلا تصبح متراكمة جدا. يوضّح المثال أدناه تقويم النشر على وسائل التواصل الاجتماعي لحسابات Solo PR Pro بطريقة العرض الشهري: طريقة العرض الأسبوعي/اليومييُعرض من خلال طريقة العرض الأسبوعي الجزء الأكبر من عملك. وأفضل طريقة ليعمل تقويمك للنشر على وسائل التواصل الاجتماعي بشكل فعّال هي كتابة كل منشور لكل يوم في الأسبوع مسبقا (أو على الأقل كل منشور يُتاح لك الوقت لكتابته). وأنصحك بفعل ذلك في أبكر وقت ممكن. إذ ستُزاح عنك الكثير من الضغوط عندما تبدأ الأسبوع وقد خططت لكل شيء مسبقا. الصورة أدناه توضح مثالا على تقويم اجتماعي اسبوعي من LocalVox: ما الذي يجب تضمينه في كل تحديث؟إنّ تنسيق تقويمك هو ما يجعل عملك يسير بصورة جيّدة وفعّالة. فمن خلال وجود جميع المعلومات اللازمة محضّرة وجاهزة عند الحاجة إليها سيقلل من الوقت الذي تستغرقه في النشر. فيما يلي بعض المعلومات التي يمكنك إدراجها في التقويم: التاريخالوقتالنص الذي ستنشرهالرابطرابط الوسائط المتعددةعدّاد الحروف (خاص بتويتر)فإذا كانت جميع المنشورات التي قمت بتحضيرها تحتوي على كل هذه المعلومات، كل ما يتبقى لك فعله هو نسخها ولصقها جميعا. ما الذي يجب تعقبه/تقييمه؟بعد أن انتهيت من إعداد تقويمك وبدأت بالاعتياد على إيقاع النشر، ربّما ترغب بإضافة عنصر آخر إلى تقويمك، كوسيلة لتعقّب أداء منشوراتك لكي تتمكن من تحديث خطة النشر وفقا لذلك. Google Analyticsتحليلات جوجل هي من الأدوات الرائعة لتعقّب الشبكة الاجتماعية التي ترسل أغلب التدفق traffic، بالإضافة إلى المحتوى الأكثر شعبية والذي يولّد أغلب العملاء المحتملين. الصورة أدناه توضّح الشبكات الاجتماعية التي ترسل التدفق إلى مدونة Buffer حسب تحليلات جوجل. كما تلاحظ، فإنّ فيس بوك وتويتر هما المصدر لأغلب التدفّق إلى المدونة، وهي أيضا الشبكتان التي نركّز عليها بالدرجة الأكبر. Buffer for Business يوفرّ هذا التطبيق تحليلات رائعة لدراستها في حال كنت تستخدمه (التطبيق) لمشاركة منشوراتك على الشبكات الاجتماعية. فيما يلي بعض الرؤى insights التي استخرجناها مؤخرا لحسابنا على تويتر: قوالب تقاويم التواصل الاجتماعيتتوفر العديد من القوالب الجاهزة الرائعة لتقاويم التواصل الاجتماعي يمكنك استخدامها إن لم تكن ترغب في إنشاء تقويمك من الصفر، أو إن كنت ترغب في الحصول على بعض الإلهام. فيما يلي بعض القوالب التي يمكنك الاطلاع عليها واستخدامها: Hootsuite: من قوالب تقاويم التواصل الاجتماعي الرائعة، وهو جاهز للتنزيل والاستخدام. Hubspot: من القوالب القوية والمفصّلة. يوفّر خاصية عرض تحديثات كل شبكة اجتماعية في تبويب مختلف. قد يناسبك هذا القالب إذا كنت تحتاج إلى هذه الخاصية. Solo PR Pro: يوفّر ثلاثة أمثلة من التقاويم اعتمادا على احتياجاتك. قد يناسبك هذا الخيار إذا كنت بحاجة إلى بعض الإلهام (ملاحظة: الصورة أعلاه هي إحدى قوالب Solo PR Pro). LocalVox: من القوالب الأخرى الجيدة، والذي يوفر العرض الشهري لجميع شبكاتك الاجتماعية على صفحة واحدة. الأدوات اللازمة لإنشاء تقويم التواصل الاجتماعي بنفسكهناك مختلف الأدوات التي يمكن أن تساعدك في إنشاء وإدارة تقويمك للنشر على وسائل التواصل الاجتماعي. لنلقِ نظرة على بعضها. Excelربّما يكون اكسل من الأدوات الأكثر شعبية لإنشاء وإدارة تقاويم التواصل الاجتماعي، فهو متنوّع الخصائص ويمكن تشكيله بالشكل الأفضل الذي يناسبك. شخصيا، أفضل العمل بجداول بيانات جوجل، خصوصا لأنني أستطيع الوصول إليها من أي مكان ما دمت متصلة بالإنترنت، والتعاون في العمل عليها إذا لزم الأمر. Google calendarتقويم جوجل من الأدوات الرائعة أيضا، وخصوصا لأنّه يأتي بشكل تقويم من الأصل. وهو يتيح لك أيضا اختيار ألوان مختلفة لتمييز تقاويم مختلفة. تُعتبر هذه الأداة مفيدة على وجه الخصوص لجداول وسائل التواصل الاجتماعي الخفيفة غير المزدحمة في الغالب، لكنها قد لا تكون الأكثر عملية إذا كنت تملك حسابات متعددة يجب عليك العمل عليها، و/أو تملك العديد من المنشورات لمشاركتها. أنصحك باستخدام تقويم جوجل لتعقّب الأحداث الخاصة مثلا، كما ذكرت في فقرة العرض الشهري. من الأمور الرائعة في هذا التقويم أنّه يمكنك وضع إشعارات لتذكير نفسك بتحضير منشورات لتلك الأحداث أو مجرد للحصول على تنبيه بسيط باقتراب موعد الحدث. يوضّح المثال أدناه كيفية استخدام تقويم جوجل من Social Media Examiner: Trelloيُعتبر Trello من المنصات الرائعة التي تتيح لك تنظيم المهام (أو أي شيء آخر) على شكل تدفق عمل مرئي لكي تتمكن من مشاهدة مشاريعك وإدارتها في لمحة. نحن في Buffer نفضّل Trello بشكل كبير، ونستخدمه لإدارة الكثير من الأمور المختلفة، من ضمنها مدونتنا. توضّح الصورة أدناه ما تبدو عليه لوحة Trello الخاصة بمدونتنا الاجتماعية: من الأمور الأخرى الرائعة بخصوص Trello أنّه يتيح لك تمكين خاصيّة التقويم والتي توفّر طريقة العرض الشهري لمهامك (تلك المهام التي لها تاريخ انتهاء). Trello من المنصات المذهلة لإنشاء منشوراتك. فكل بطاقة Trello تتيح لك كتابة نصوص، إرفاق صور، إضافة وسوم لونية، إضافة تواريخ انتهاء، وغيرها الكثير. كما أنّه يصلح لعمل الفرق لأنّه يتيح إضافة أشخاص إلى البطاقات. الصور أدناه توضّح كيف نستخدم Trello في Buffer لتخطيط التقويم الخاص بمحتوى مدونتنا الاجتماعية: تقويم التواصل الاجتماعي من Bufferلقد قمنا مؤخرا في Buffer بإطلاق تقويم التواصل الاجتماعي الذي يساعدك على الإدارة الشاملة لجميع حساباتك على الشبكات الاجتماعي وبلمحة. فإذا كنت بالفعل تستخدم Buffer ومشتركا بأحد برامجنا المدفوعة (Awesome، Business، وEnterprise)، أصبح بإمكانك الآن الاستفادة منها في إدارة تقوم التواصل الاجتماعي كذلك. بإمكانك إما أن تنشئ جميع تحديثاتك مباشرة على تقويم التواصل الاجتماعي في Buffer، أو تحضير المنشورات في وقت مسبق وبشكل منفصل ثم إضافتها إلى التقويم لتصبح جاهزة للنشر. بهذه الطريقة لن تتمكن من الحصول على فكرة مرئية حول المنشورات التي ستنشر في الأسبوع المقبل فحسب، وإنما: ستكون قادرا على تحريك المنشورات في التقويم حسب الحاجة.ستكون جميع منشوراتك مجدولة بالفعل وجاهزة للنشر بصورة تلقائية حسب الوقت الذي قمت بتعيينه، مما يوفّر لك الكثير من الوقت.توضّح الصورة أدناه ما يبدو عليها تقويم التواصل الاجتماعي من Buffer لحسابنا على تويتر: عندما أجهّز التحديثات، أجد نفسي دائما أقوم بإضافة المنشورات مباشرة في Buffer والتخطيط للأسابيع القادمة باستخدام قوائم الانتظار queue وخصائص التقويم، وهذا الأمر كان مفيدا لي على وجه الخصوص عند جدولة منشورات العطل/الأعياد في وقت مسبق. ابحث عن الصور/الفيديوهات في وقت مسبقمن الجوانب التي تستغرق وقتا طويلا للمشاركة الاجتماعية، بالإضافة إلى تحضير التحديثات، هو البحث عن الصور، الصورة المتحركة GIF، أو الفيديوهات المثالية. من الطرق التي أجدها مفيدة في تحقيق ذلك هي: البحث عن/إنشاء عناصر الوسائط المتعددة اللازمة في وقت مسبق.حفظ هذه العناصر في مجلّد إن لم تكن مستعدا لنشرها، وعندما يحين وقت النشر، كما ما عليك فعله هو الذهاب إلى ذلك المجلد ورفع الملف الصحيح.خطوة اختيارية: قم بتسمية الملفات بأسماء دلالية محددة بما في ذلك التواريخ، فهذا سيساعدك في العثور على الملف الذي تبحث عنه بشكل أسرع، وخصوصا إذا كان الملف يحتوي على الكثير من الصور.خاتمةسيسرنا أن تشاركنا أفكارك ونصائحك حول إنشاء تقويم التواصل الاجتماعي وإدامة العمل عليه. ما هي أكثر الطرق الفعالة للقيام ذلك؟ وما هي الأمور التي ما زلت تواجه صعوبة في التعامل معها؟ ترجمة -وبتصرّف- للمقال The Ultimate Guide To Creating The Perfect Social Media Calendar لصاحبته: Sandrine Sahakians.
  8. مقدمة إنّ azk عبارة عن أداة خفيفة مفتوحة المصدر، تستطيع استخدامها لتنسيق بيئات التطبيقات. هل سبق أن كان لديك تطبيق يعمل على محطة العمل المحليّة الخاصة بك، ووجدت أنّ الإعدادات تختلف كليًا عندما تقوم بنشر التطبيق على مخدّم إنّتاج. تُقدّم هذه المقالة أداة تنسيق، تُدعى azk، والتي يتم استخدامها حاليًا من قبل هذه التطبيقات، وهي قابلة للاستخدام لأكثر من ذلك بكثير. عندما تقوم بنشر تطبيق جاهز للعمل مع azk، فإنّه يمكنك بسهولة إنّ تشغلّه محليًا أو في مخدّم إنّتاج. لا يجعل azk تشغيل التطبيق فقط سهلًا و سريعًا بل كل تبعياته أيضًا، بما فيها نظام التشغيل المطلوب، اللغات، أطر العمل، قواعد البيانات و التبعيات الأخرى (المهام الثقيلة، الطويلة، التكرارية، الأكثر عرضة للخطأ)، سواء كنت تعمل في بيئة محلية أو على مخدم. إنّ غرض هذه المقالة، هو إظهار كيف يعمل azk كأداة تنسيق، باستخدام تطبيق Rails بسيط يُدعى Stringer كمثال. يهتم azk بالعديد من التفاصيل خلف الكواليس، لجعل عملية التنسيق أسهل. لهذا، تحوي هذه المقالة على العديد من الخطوات الاختيارية، التي ليست بضرورية لإعداد التطبيق المثال، ولكنها تشرح آلية عمل azk. سوف نقوم بتشغيل التطبيق من شفرة المصدر على جهاز حاسوب محلي، ثم نشره على مخدّم، و من ثم سنقوم ببعض التغييرات المحليّة، وبعدها نقوم بنشر هذه التغييرات، و من ثم سنقوم بعميلة الإرجاع. بعد إتمام هذه المقالة، سوق تحصل على فكرة جيدة حول كيفية عمل azk كأداة تنسيق سير عملية التطوير والنشر الخاصة بك. كيف يعمل؟ بدايةً، يُنسق azk بيئة التطبيق على جهاز الحاسب المحلي الخاص بك. حالما يعمل التطبيق لديك محليًا، سيقوم azk أيضًا بتنسيق نشره إلى المخدّم Droplet الخاص بك. طالما يُشغل azk التطبيقات من شفرة المصدر، فإنّك تستطيع أن تعمل مع التطبيق محليًا (إذا كنت ترغب بذلك)، و من ثم تقوم بنشره أو استرجاعه مرة ثانية بدون أيّة خطوات إضافية خاصة. يعزل azk البيئات التي تستخدم الحاويات، ولهذا فمن الآمن تشغيل التطبيقات على جهاز الحاسب المحلي الخاص بك. يعمل azk مع كل من المشاريع الجديدة، تلك التي تبدأ منذ الصفر، أو مع الشيفرات الموجودة سابقًا. استخدام azk مع تطبيقات مخصّصة باستخدام القائمة الحالية من التطبيقات التي تم تشكيلها مسبقًا للعمل مع azk كأمثلة، و مع قليل من العمل الإضافي ستستطيع إعداد أي مشروع للعمل مع azk. للقيام بهذا أضف الملف Azkfile إلى مشروعك. Azkfile عبارة عن ملف رئيسي manifest، يحتوي العناصر الضرورية لتشغيل التطبيق، و يقوم بتلخيص علاقاتها فيما بينها (نظام التشغيل، اللغات، قواعد البيانات، … ). فوائد إضافة الملف Azkfile إلى مشروعك: استخدام azk لأتمته إعداد البيئة لمشروعك محليًا و عند النشر. يستطيع الأشخاص الأخرين، الذين يرغبون بنشر تطبيقك، القيام بهذا باستخدام azk. المتطلبات الأساسية للمتابعة مع هذه المقالة، فإنّك ستحتاج إلى جهاز حاسوب يقوم بتشغيل أية من أنظمة التشغيل التالية(64 - بت) للبيئة المحليّة الخاصة بك: Mac OS X 10.6 (Snow Leopard) أو أي إصدار لاحق. Ubuntu 12.04، 14.04 or 15.10 Fedora 21 or 22 أيضاً ستحتاج إلى إنّ تكون قادر على تشكيل git commits. يحتاج جهاز حاسوبك إلى تثبيت Git. إنّظر إلى هذه السلسلة لاستخدام Git من أجل التعليمات الخاصة لأنظمة التشغيل Linux، أو قم بزيارة صفحة تحميل Git. تأكّد من قيامك بتشغيل الأوامر المقترحة : git config --global user.email "you@example.com" git config --global user.name "Your Name" وذلك قبل القيام بقراءة المقالة، انظر الروابط السابقة للحصول على التفاصيل حول Git. لاحظ أنّه لا يوجد ضرورة للحصول على مخدّم فعّال Droplet في هذا الدرس. سيقوم azk بتشكيل واحد باستخدام واجهة التطبيق DigitalOcean’s API. يُكلف نشر مخدم Droplet المال، ومن أجل هذا الدرس ستقوم بنشر مخدم Droplet، يحوي افتراضيًا فقط واحد جيجابايت. مستخدمي Linux : تثبيت الـ Docker: إذا كنت تستخدم نظام تشغيل ( Linux Ubuntu أو Fedora)، ستحتاج لتثبيت الـ 1.8.1 Docker أو أي اصدار لاحق، وذلك لاستخدامه كبرمجية حاويّة. إنّ تشغيل سكريبت تثبيت Docker، هي إحدى طرق تثبيته. (بشكل عام، كُن متأكد من فهمك ماذا يفعل السكريبت، وذلك قبل القيام بتشغيله): $ wget -nv https://get.docker.com/ -O- -t 2 -T 10 | bash إذا كنت ترغب بتعلّم المزيد حول تثبيت Docker في نظام التشغيل Linux، تفحّص تعليمات التثبيت المتاحة في ملفات التوثيق الرسمية. مستخدمي Mac OS X : تثبيت الـ VirtualBox: ستحتاج إلى VirtualBox 4.3.6 أو أي اصدار لاحق، وذلك لاستخدامه كبرمجيّة حاويّة. لتثبيت VirtualBox، حمّل رزمة تثبيت Virtualbox المناسبة من صفحة التحميل الرسميّة. الخطوة الأولى: تثبيت azk محليًا سنقوم بتثبيت azk، باستخدام سكريبت تثبيت المشروع. تأكد من فهمك ماذا يفعل أي سكريبت، قبل تنفيذه في نظامك. إذا كان لديك للتو نسخة قديمة مثبتة من azk، فإنّك تستطيع استخدام سكريبت التثبيت لتحديث الـ azk. وإلا قُم بتفحص إرشادات تثبيت الحزم لنظم التشغيل المدعومة. تثبيت azk على Linux: إذا كنت تستخدم نظام التشغيل (Linux Ubuntu أوFedora)، قُم بتشغيل هذا الأمر في الوحدة الطرفية، وذلك لتثبيت azk باستخدام سكريبت المشروع. نحن ننصح بتدقيق أي سكريبت قبل تشغيله على نظامك: $ wget -nv http://azk.io/install.sh -O- -t 2 -T 10 | bash بعد إتمام التثبيت، قُم بتسجيل الخروج، ومن ثم تسجيل الدخول مرة أخرى، وذلك لجعل كل التعديلات فعّالة. يتجلى سبب تسجيل الخروج، في أنّه خلال عملية التثبيت، سيتم إضافة مستخدمك إلى مجموعة الـ docker. تُعد هذه الخطوة مطلوبة، وبذلك نستطيع استخدام الـ Docker بدون أن تكون المستخدم الأساسي (root). أي عليك الخروج من الجلسة الحالية، لتحصل على كل التعديلات المضافة. إذا كنت ترغب بتعلم المزيد حول مجموعة الـ Docker، فإنّك تستطيع تفحص التوثيق الرسمي لـ Docker. تثبيت azk على Mac OS X: قُم بتشغيل الأمر التالي في الوحدة الطرفية، وذلك لتثبيت azk باستخدام سكريبت المشروع. نحن ننصح بتدقيق أي سكريبت قبل تشغيله على نظامك: $ curl -sSL http://www.azk.io/install.sh | bash الخطوة الثانية: التحقق من تثبيت azk حالما يصبح تثبيت azk كامل، قُم بتشغيل الأمر الذي في الأسفل، وذلك للتحقق من نجاح عملية التثبيت: $ azk version يتحقق هذا الأمر من نسخة الـ azk المثبّتة. إذا أعاد هذا الأمر رقم النسخة (على سبيل المثال azk 0.17.0 أو أي إصدار لاحق)، فالوضع جيد و تستطيع الانتقال إلى الخطوة التالية. تهانينا لك على تثبيت azk في البيئة المحليّة الخاصة بك. إذا لم يكن الأمر كذلك، فاقرأ أدناه أحد أقسام تحرّي الأخطاء وإصلاحها للحصول على المساعدة. استكشاف الأخطاء وإصلاحها في عملية تثبيت azk في Linux: دعونا نتفحص نسخة الـ Docker المثبّتة، وذلك عن طريق تشغيل الأمر: $ docker version ستحتاج إلى الإصدار 1.8.1 أو أحدث. على كل حال، إذا حصلت على رسالة خطأ، فهذا يعني لم تحصل حتى الآن على تثبيت Docker، تتبع إرشادات التثبيت الخاصة بنظام التشغيل في ملفات توثيق Docker. بعد قيامك من التأكد من حصولك على النسخة المثبّتة المناسبة من Docker، قُم بتشغيل الأمر التالي كمستخدم sudo و ذلك للتأكد من أنّ مستخدمك في مجموعة docker: $ id -Gn إذا كانت قائمة المجموعات تتضمن docker، هذا يعني أنه تم إعداده بشكل صحيح. و إلا، إذا لم تحصل على الكلمة docker في قائمة المجموعات، قُم بتشغيل هذا الأمر لإضافة مستخدمك إلى المجموعة: $ sudo usermod -aG docker $USER ومن ثم قُم بتسجيل الخروج، و تسجل الدخول مرة أخرى. تحقق من الأمر id –Gn مرة أخرى للتأكد من أنّه يُعيد قائمة المجموعات مع كلمة docker بينهم. إذا كانت هذه الإرشادات غير كافية لجعل الـ Docker يعمل بالشكل المناسب (على سبيل المثال، لا تزال غير قادر على تشغيل أمر docker version بشكل صحيح)، يّرجى الرجوع إلى تعليمات تثبيت Docker. استكشاف الأخطاء وإصلاحها في عملية تثبيت azk في Mac OS X: تأكّد من تثبيت VirtualBox $ which VBoxManage إذا كان هذا يُعيد مسار ملف (مثل، usr/local/bin/VboxManage/)، فنستطيع المضي قُدمًا. و إلا، إذا كان يُعيد رسالة " not found "، هذا يعني ليس لديك تثبيت VirtualBox. في هذه الحالة، قُم بتحميل و تثبيت رزمة تثبيت VirtualBox من الموقع الرسمي لهم. الخطوة الثالثة (اختيارية): التعلّم حول التطبيق التجريبي Stringer لقد قُمنا باختيار Stringer كتطبيق تجريبي لهذه المقالة، وذلك لأنه تطبيق بسيط، وتم إعداده للعمل مع azk. وهو عبارة عن تطبيق Rails مع حالة استخدام محددة جيدًا: قارئ RSS أساسي. المزيد حول Stringer تُقدم بعض مواقع الأخبار أيضًا محتواها في صيغة تغذية RSS. هذه عبارة عن صيغة ملف XML قياسية، تُمكن الناشرين من نشر المعطيات بشكل اتوماتيكي. قارئ RSS هو عبارة عن برنامج مُستخدم للاشتراك، وتقديم محتوى الـ RSS. تُزيل عملية الاشتراك في تغذية RSS لموقع ما، حاجة المستخدمين للتفحص اليدوي للموقع للحصول على المحتوى الجديد. حيث يستطيع المستخدمين تشكيل قائمة بالتغذيات المُشترك فيها، وتخصيص محتواهم على قارئ RSS (عادةً على شكل قائمة مرتبة ترتيبًا زمنيًا) الخطوة الرابعة (اختيارية): إعداد تطبيق مُخصّص لاستخدام azk طالما أنّ التركيز الأساسي لهذه المقالة هو على إظهار كيفية عمل azk للتطبيقات، التي تملك للتو تفاصيل البيئة المنصوص عليها للعمل مع azk، فعلى المدى الطويل هذه الأداة، هي أكثر فائدة عندما يمكنك استخدامها لنشر أي تطبيق. لهذا، خُذ نظرة عن كيفية مقارنة هذه النسخة من Stringer مع النسخة الأساسية من Stringer في المستودع. تملك نسخة azk فقط إضافتين اثنتين إلى نسخة Stringer الأصلية: ملف Azkfile، الذي يزّود بمعلومات البيئة لـ azk زر azk لتشغيل المشروع Run Project يمكن تعلم المزيد حول جعل azk يعمل مع تطبيقات أخرى، وذلك عن طريق ملفات توثيق azk حول ملف Azkfile و زر تشغيل المشروع Run Project. تالياً، سوف نرى كيف يبدو التطبيق الصديق لـ azk في GitHub. الخطوة الخامسة (اختيارية): استخدام زر تشغيل المشروع لـ azk على GitHub إنّ جزء الممارسات الأفضل من azk من أجل مشاريع GitHub، هو التوضيح الجيد لكيفيّة عمل هذا المشروع مع azk. لهذا، بدلاً من إظهار فقط أمر الـ azk في وسط ملف readme للمشروع، فإنّ المشروع الذي يستخدم azk يستطيع استخدام زر تشغيل المشروع، وذلك للعزل البصري لأمر الـ azk. يستخدم Stringer هذا الزر. قُم بزيارة قسم التشغيل المحلي لنسخة azk المتشعبة من Stringer. أضغط زر تشغيل المشروع Run Project. في أول مرة تضغط فيها زر تشغيل المشروع، سوف ترى شرح بسيط عن ماذا يجري. عندما تصبح جاهزا للمضي قُدماً، انقر على الزر OK، DISMISS في أسفل الشرح. بعدها سيتم توجيهك إلى صفحة مع أمر azk لمشروع Stringer. $ azk start -o run-project/stringer يمكنك دائماً أنّ تنقر على إشارة ما هذا؟ على الزاوية العليا اليُمنى، وذلك لترى الشرح مرّة أخرى. في مركز الشاشة، يوجد صندوق أوامر مع ثلاث علامات تبويب: curl، wget، azk. طالما لدينا للتو مُثبت azk فتستطيع استخدام علامة التبويب azk. هذا هو الأمر، الذي سنستخدمه في الخطوة التالية للتشغيل الفعلي لـ Stringer. الخطوة السادسة: تشغيل Stringer محليًا في هذا القسم سنستخدم azk لتشغيل Stringer على محطّة العمل المحليّة. دعونا نتأكد أنّنا في المسار الرئيسي home على جهاز حاسوبنا المحلي (إذا قمت باستخدام مجلد تثبيت مختلف، تذكر فقط تغيير الأوامر إلى مسارك المختار): $ cd ~ أمضي قُدمًا، و قم بتشغيل الأمر التالي على حاسوبك المحلي، وذلك لتشغيل Stringer: $ azk start -o run-project/stringer طالما هذه هي أول مره تقوم بها بتشغيل azk، سيطلب منك قبول بنود الخدمة. و يجب أنّ تظهر رسالة كالتالية: ? ========================================================================= Thank you for using azk! Welcome! Before we start، we need to ask: do you accept our Terms of Use? http://docs.azk.io/en/terms-of-use ========================================================================= (Y/n) اضغط على Y إذا كنت موافق أو N إذا كنت غير موافق. و من ثم اضغط على ENTER لتأكيد جوابك. في حالة عدم موافقتك، فلن تتمكن من استخدام azk. و اخيراً، سيقوم azk أوتوماتيكيًا بتحميل الشفرة المصدر لـ Stringer، إضافة إلى أنّ الملف المسند Azkfile سيقوم بتشغيل هذا الشفرة في بيئة معزولة و آمنة في حاسوبك المحلي. ومن ثم سيتم سؤالك فيما إذا كنت ترغب ببداية تشغيل عميل الـ azk. ? The agent is not running، would you like to start it? (Y/n) العميل هو عبارة عن مُركب azk، الذي يقوم بإعداد Docker (على نظام التشغيل Linux )، أو بإعداد الآلة الافتراضيّة VirtualBox (على نظام التشغيل Mac OS X). اضغط ENTER للجواب “Yes” (الخيار الافتراضي). في أول مرة تُشغل فيها العميل، سيقوم azk بتشغيل إعداداته. يقوم الإعداد بالعديد من الأشياء وراء الكواليس، بما في ذلك توليد الملف /etc/resolver/dev.azk.io، الذي يحوي إعدادات نظام أسماء النطاقات DNS، لتصميم العناوين التي تنتهي باللاحقة dev.azk.io. يستخدم azk هذه اللاحقة عند تشغيل التطبيقات لاستخدام العناوين القابلة للقراءة بدلاً من الاستخدام اليدوي للعناوين من الشكل http://localhost:PORT_NUMBER . أيضاً هذا يقوم بتجنب تعارض أرقام المنافذ بين التطبيقات المختلفة. بشكل أساسي يقوم هذا بنفس الشيء عند تحرير ملفك /etc/hosts لإعادة توجيه اسم نطاق محليًا. إذا حصلت على رسالة من الشكل التالي: ? Enter the vm ip: (192.168.50.4) فإنّك تستطيع إدخال أي عنون IP محلي، ترغب بتشغيل التطبيق عليه. يجب أن تكون الحالة الافتراضية مناسبة لجميع الحالات. للموافقة على هذا، فقط اضغط ENTER. لإتمام إعدادات عميل الـ azk، سيتم سؤالك عن كلمة المرور الخاصة بالمستخدم sudo (لمستخدمي نظام التشغيل Mac OS X، هي عبارة عن كلمة مرور المُشرف admin). الآن سيبدأ azk بالعمل. سوف ترى أنّ azk يُحمّل العناصر المُسردة في الملف Azkfile (على صيغة صور Docker ). من الممكن أن يستغرق تحميل هذه الصور أول مرة عدة دقائق (حوالي 10 دقائق أو أقل). حالما يُكمل azk الإعداد، سيقوم مُتصفحك بشكل أتوماتيكي بتحميل شاشة البدء لـ Stringer على حاسوبك المحلي. كما تستطيع إنّ ترى، أنّه يستخدم اسم نطاق محلي DNS، و هذا التطبيق مرئي على http://stringer.dev.azk.io. و تستطيع الوصول إلى التطبيق بشكل يدوي عبر الذهاب إلى http://stringer.dev.azk.io . إذا كنت ترغب بإعداد كلمة المرور و بداية التشغيل باستخدام التطبيق، فإنّك تستطيع فعل ذلك. نحن نرغب فقط برؤية أنّ azk يستطيع تشغيل Stringer محلياً. والآن طالما لديك Stringer يعمل على الحاسوب المحلي، فتستطيع نشره من جهاز الحاسوب لديك إلى المخدّم Droplet. الخطوة السابعة: الحصول على الرمز DigitalOcean API Token قبل أن نتمكن من نشر Droplet من azk، فإنّنا نحتاج إلى رمز API token. يُعطي هذا الرمز الإذن لـ azk لنشر مخدّم جديد على حسابك. في أول مرّة تقوم بها بتشغيل azk من هذه البيئة باستخدام هذا الرمز، سيتم نشر واحد جيجابايت مخدّم جديد Ubuntu 14.04 Droplet . و ستستخدم عمليات النشر اللاحقة من نفس البيئة المحليّة، نفس المخدّم المفرد Droplet. اتّبع الإرشادات من قسم المراجع المرتبطة بالمقالة حول كيفية تشكيل رمز الوصول الشخصي. و يجب أن يمتلك الرمز المُشكّل تصاريح الكتابة القراءة. قُم بنسخ المحارف الأربعة و الستين بالترميز الست عشري لرمزك، بشكل مشابه للتالي: Example API Token A17d6a72566200ad1a8f4e090209fe1841d77d7c85223f769e8c5de47475a726 سوف ترى هذا الرمز النصيّ فقط مرة واحدة، لذلك قُم بنسخه إلى مكان آمن. (تذكّر، إذا تم اختراق هذا الرمز، فإنّه يمكن استخدامه للدخول إلى حسابك، لذلك حافظ عليه خاصًا). من أجل الإرشادات أسفلا، تذكر استبدال الرمز المثال بالرمز الحقيقي الخاص بك. اذهب إلى مجلد Stringer: $ cd ~/stringer احفظ رمز الوصول الشخصي في ملف ستدعوه env. للقيام بهذا، قُم بتشغيل أمر تشكيل ملف (لا تنسى استبدال الرمز): $ echo "DEPLOY_API_TOKEN=a17d6a72566200ad1a8f4e090209fe1841d77d7c85223f769e8c5de47475a726" >> .env يجب إنّ يبدو محتوى الملف env. بالشكل التالي: DEPLOY_API_TOKEN=a17d6a72566200ad1a8f4e090209fe1841d77d7c85223f769e8c5de47475a726 الخطوة الثامنة (اختيارية): التعلم حول مفاتيح SSH ليس عليك إنّ تقوم بأي شيء لإعداد مفتاح SSH من أجل azk، ولكن من المفيد معرفة الكيفية التي يستخدم فيها azk هذا المفتاح. يستخدم azk مفتاح SSH للوصول إلى المخدّم Droplet. إذا كان لديك للتو مفتاح SSH، فإنّ azk سيستخدمه. لرؤية فيما إذا كان لديك مفتاح SSH على جهاز الحاسوب لديك، شغّل: $ ls ~/.ssh/*.pub إذا قام بإرجاع رسالة “not found”، فهذا يعني إنّه ليس لديك أيّة مفاتيح SSH على جهاز الحاسوب. في هذه الحالة، سيولّد azk بشكل أتوماتيكي مفتاح SSH جديد، ليتم استخدامه حصريًا لنشر أي تطبيق جديد من جهاز الحاسوب لديك. سيقوم azk بتوليد مفتاحه في الذاكرة المحجوزة له، ولن يقوم بأيّة تعديلات على مسارك ~/.ssh. إذا كنت ترغب بتفحص المفتاح العام المولّد، يمكنك تشغيل الأمر التالي بعد نشر التطبيق الأول: $ azk deploy shell -c "cat /azk/deploy/.config/ssh/*.pub" الخطوة التاسعة: النشر مع azk بشكل افتراضي، سيولد azk مخدّم DigitalOcean Droplet واحد جيجابايت، يُشغّل النظام Ubuntu 14.04، وذلك من أجل نشر تطبيقك. إذا كنت ترغب بنشر Droplet بمواصفات مختلفة، فيمكنك تغيير الإعدادات في خصائص envs لنظام deploy في الملف Azkfile.js . من أجل الإرشادات الإضافية أشر إلى ملفات توثيق حول نشر azk . أولاً، اذهب إلى مسار Stringer ( أو إلى مسار تطبيقك): $ cd ~/stringer ومن ثم، ابدأ عملية النشر، فقط قُم بتشغيل: $ azk deploy إنّ الأمر azk deploy، هو الأمر الذي ستقوم بتشغيله معظم الأوقات، عندما تستخدم azk لتنسيق تطبيقك. من الممكن أن تستغرق أول عملية نشر فترة معينة (حوالي عشر دقائق)، حتى يقوم azk بكل العمل. بشكل مخصص، على azk القيام بما يلي: تحميل عناصر الدعم ( صورة Docker للنشر) تشكيل و إعداد الـ Droplet رفع شفرة المصدر للتطبيق إلى المخدّم Droplet تشغيل التطبيق بعدها ستستغرق كل عملية نشر جديده لهذا التطبيق من جهاز الحاسوب لديك مدة زمنية قليلة (حوالي 30 ثانية أو أقل)، هذا لان معظم الخطوات الطويلة جاهزة للتو. إذا كان مفتاحك SSH محمي بكلمة مرور، فسيكون مطلوباً وقت أكبر لعملية النشر. فقط قُم بكتابة كلمة المرور للمفتاح SSH، و أضغط زر ENTER في كل مرة تظهر رسالة كالتالية: Output Enter passphrase for ~/.ssh/id_rsa: سيظهر خرج الوحدة الطرفية بعض الإجراءات المُتخذة على النظام البعيد، تنتهي برسالة النشر الناجحة App successfully deployed at http://your_server_ip. قُم بزيارة الموقع http://your_server_ip لعرض التطبيق المُستضاف على الخادم الخاص بك. من الآن، يُمكنك تغيير شفرة التطبيق على جهاز الحاسوب الخاص بك، و يمكنك اختباره محلياً، و يمكنك نشر التغييرات على المخدّم Droplet بواسطة الأمر azk deploy. الخطوة العاشرة: تعديل Stringer لتوضيح سهولة استخدام azk لنشر تطبيق، للتخصيص، أو للتحكم في النسخة، دعونا نقوم بعدد من التغييرات على صفحة الاشتراك Stringer، و من ثم نقوم بإعادة نشر التطبيق. تأكد من كونك على مسار Stringer: $ cd ~/stringer دعونا نقوم بتعديل الملف app/views/first_run/password.erb، الذي هو عبارة عن الصفحة الحاوية على النص لصفحة الاشتراك الأولى. استخدم nano أو محرر النصوص المفضل لديك: $ nano ~/stringer/app/views/first_run/password.erb هنا نقوم بإضافة السطر الإضافي، الذي يقول "! It’s easy with azk ": app/views/first_run/password.erb <div class="setup" id="password-setup"> <h1><%= t('first_run.password.title') %> <span class="orange"> <%= t('first_run.password.anti_social') %></span>.</h1> <h2><%= t('first_run.password.subtitle') %></h2> <h2>It's easy with azk!</h2> <hr /> . . . </div> قُم بالحفظ و الخروج من محرر النصوص. إذا كنت تستخدم nano، اضغط CTRL+O للحفظ، و CTRL+X للخروج. طالما إنّ Stringer مُعد افتراضياً للعمل في وضع الانتاج، لذلك فإنّ إعادة تحديث صفحة المتصفح ليس بكافٍ لتشغيل التغييرات. بل قُم بإعادة تشغيل التطبيق من azk: $ azk restart stringer -o يجب على علامة التبويب الجديدة للمتصفح أن تفتح النسخة الجديدة من Stringer. أسفل النص الافتراضي مباشرةً “There is only one user: you”، يجب الآن أن يكتب “!It’s easy with azk”. الخطوة الحادية عشر: إعادة نشر Stringer الآن، دعونا نُودع (commit) التغييرات داخل نسخة نظام التحكم، من أجل أن نستطيع نشرها. $ git add app/views/first_run/password.erb $ git commit . سيظهر لك محرر نصوص (على الأرجح nano أو vim). أدخل رسالة إيداع commit، مثل It is easy with azk. سيتم استخدام هذه الرسالة commit لتسمية الإصدارات من تطبيقك داخل azk، لذلك اختر الرسالة التي من شأنها تحفيز ذاكرتك، إذا كنت بحاجة إلى الرجوع إليها في وقت لاحق. احفظ و أغلق رسالة الـ commit. إذا حصلت على الخطأ : fatal: empty ident name (for <sammy@azk.(none)>) not allowed عندها قُم بتشغيل أوامر الإعدادات المقترحة من أجل Git لإعداد عنوان إيميل و اسم (المزيد من التفاصيل في قسم المتطلبات الأساسية). لنشر تغييراتك و رفع تشغيل التطبيق على Droplet، قُم بتشغيل: $ azk deploy بعد الانتهاء من ذلك، قُم بالوصول إلى عنوان IP لـ Droplet من متصفحك (مثلاً http://your_server_ip) .عندها يجب أن ترى أيضاً هنا السطر الجديد !It’s easy with azk سيقوم هذا النشر الجديد بتشكيل نسخة جديدة من التطبيق على Droplet. إنّ كل نسخ التطبيق مخزنة، لذلك يمكنك العودة إلى نسخة سابقة ومن ثم إلى الأمام مرّة أخرى. الخطوة الثانية عشر: الرجوع إلى خطوة سابقة للحصول على كل النسخ المتاحة من تطبيقنا على Droplet، شغّل الأمر التالي محليًا: $ azk deploy versions يجب إنّ تكون النتيجة بقائمة من الشكل: Output ⇲ Retrieving deployed versions... ➜ v2 It is easy with azk v1 Merge branch 'master' of https://github.com/swanson/stringer لإرجاع التطبيق إلى نسخة أقدم، فقط قوم بتشغيل: $ azk deploy rollback v1 إنّ المعامل v1 عبارة عن رقم النسخة، الذي يظهر على خرج الأمر azk deploy versions. إذا قمت بتشغيل الأمر بدون هذا المعامل (مثلاً، . azk deploy rollback )، سيرجع عندها التطبيق إلى نسخة سابقة تماماً قبل النسخة الحالية. لتفحص إتمام عملية الرجوع، فقط قُم بتحديث علامة تبويب المتصفح، التي تظهر نسخة المخدم. الآن عليك إنّ ترى التطبيق بدون النص الذي قمنا بإدخاله، أي يجب أن ترى النسخة الأصليّة من التطبيق. وإذا كنت ترغب بالرجوع للأمام، يمكنك اختيار النسخة الأحدث: $ azk deploy rollback v2 أتت التسمية لهذه النسخ من رسائل الـ git commit في الخطوة السابقة. الخاتمة في هذا الدليل التعليمي، لقد استخدمنا تطبيق Rails بسيط، لتوضيح كيف يقوم azk بأتمتة مهام إعداد بيئة تطبيقنا. يجعل هذا من السهل نشر التطبيق نفسه في عدة بيئات. إذا أعجبت بعملية النشر من azk، خُذ بعين الاعتبار استخدامه لمشروعك الخاص، أو إضافة الملف Azkfile إلى fork مشروع أخر مفتوح المصدر. يدعم azk بالإضافة إلى عملية rollback و versions، غيرها من الأوامر الفرعيّة المساعدة، التي تسمح لنا بإنّجاز بعض الإجرائيات الإضافية (مثلاً، الوصول إلى Droplet’s shell عن طريق المفتاح SSH ). ترجمة -وبتصرّف- للمقال How To Deploy a Rails App with azk لصاحبه Felipe Arenales
  9. سنتحدث في هذا الدرس عن كيفيَّة تحضير المستند لطباعته ونشره على الويب أو إرساله عبر البريد, وسنتطرق أيضًا إلى إضافة جدول المحتويات ومراجعة المستند وتدقيقه والاستفادة من الإشارات المرجعيَّة. إدراج جدول محتويات يتضمَّن جدول المحتويات قائمةً بعناوين الفقرات بكافة مستوياتها مع أرقام الصفحات المتواجدة فيها، ويمكن الضغط على كل عنوان فيه للانتقال إلى الصفحة الموجود فيها مباشرةً وبسرعة. سندرج جدول محتويات لإحدى المقالات عبر إدراج ← جدول المحتويات وسنجد خيارين هما: بأرقام الصفحات وبروابط زرقاء. إدراج جدول محتويات بأرقام الصفحات شبيهٌ بجدول محتويات الكتب إذ يوضع بجانب كل عنوان رقم الصفحة الموجود فيها بالإضافة إلى قابليَّة الضغط على العنوان ورقم الصفحة للانتقال إليها مباشرةً. أمَّا جدول المحتويات بروابط زرقاء فهو يشبه جدول المحتويات في ويكيبيديا إذ لا توجد صفحات عند النشر في الويب ولكن تبقى قابليَّة الضغط على العنوان متاحة للانتقال إليه مباشرةً. عند وضع المؤشر على أحد العناوين في جدول المحتويات تظهر ثلاثة خيارات؛ الخيار الأول هو رابط ينقلنا عند الضغط عليه إلى صفحة العنوان، والخيار الثاني "تغيير" لتغيير الرابط في حال التعديل على العنوان الحالي وتبديله، والخيار الثالث هو "إزالة" لإزالة الرابط ويصبح بذلك غير قابل للضغط وكأنَّه مجرد نص عادي. يجب تحديث جدول المحتويات عند التعديل على العناوين أو إضافة أخرى جديدة بالضغط على تحديث . سنغير تنسيق جدول المحتويات باستعمال إضافة "Table of contetnts" التي أضفناها في درس سابق لترقيم العناوين بحسب مستوياتها حيث نختار تنسيق الترقيم "1.2.3" كما موضح بالصورة. الإشارات المرجعيَّة يتيح تطبيق مستندات جوجل ترك علامة مرجعيَّة في أي موقع من المستند للرجوع إليها لاحقًا واستئناف العمل من المكان الذي تركناه آخر مرَّة. إن كان عدد صفحات المستند كبيرًا وكنت تدقِّقه على سبيل المثال فيمكنك ترك إشارة مرجعيَّة في المكان الذي توقفت فيه للعودة إليه في المرة القادمة بسرعة. ندرج إشارة مرجعيَّة عبر إدراج ← إشارة. عند فتح المستند مرة أخرى استخدم الاختصار Ctrl + Alt + N للانتقال إلى الإشارة المرجعيَّة التالية والاختصار Ctrl + Alt + B للرجوع إلى الإشارة المرجعيَّة السابقة. لمعرفة المزيد من الاختصارات افتح نافذة الاختصارات عبر مساعدة ← اختصارات لوحة المفاتيح. يمكن إنشاء جدول في بداية المستند يحوي عباراتٍ نربطها مع إشارات مرجعيَّة لتسهيل التنقل بين صفحات المستند. نضيف جدولًا ونكتب المواقع التي نريد ربطها مع الإشارات المرجعيَّة التي أضفناها سابقًا ثمَّ نختار من شريط القوائم إدراج رابط ولكن عوضًا عن إدراج رابط نُدرج الإشارة المرجعيَّة التي نريد ربطها مع العبارة كما موضح بالصورة. ملاحظة: يمكن إنشاء جدول محتويات يدويًا وذلك بكتابة العناوين التي نريدها ثمَّ نربطها باختيار "العناوين" بدلًا من "إشارات مرجعيَّة" ونحدِّد العنوان المناسب. طباعة المستند وتنزيله إن أردنا طبع مستند نختار ملف ← طباعة أو نضغط على الاختصار Ctrl + P للانتقال إلى إعدادات الطباعة. نُزِيلُ الهوامش الإضافيَّة التي تحتوي على معلومات عن المستند مثل رابط المستند واسمه وتاريخ التعديل من القائمة اليسرى أو يدويًا ثمَّ نختار عدد الصفحات التي نريد طباعتها ونحدِّد الطابعة. توجد خيارات طبع إضافيَّة مثل نوع الورق والطباعة على وجه واحد أو وجهين وطباعة الصفحات الزوجيَّة أو الفرديَّة ...إلخ. تجدها بالضغط على الخيار "Print using system dialog" أو استعمال الاختصار Ctrl + Shift + P. الطابعة الافتراضيَّة هي "التصدير إلى ملف بصيغة PDF" لتنزيله إلى الحاسوب ثمَّ طباعته؛ إن كنت تملك طابعة موصولة إلى حاسوبك ومعرَّفة فتستطيع إضافتها إلى خدمة الطباعة من السحابة من جوجل للطباعة مباشرةً من تطبيق مستندات جوجل. خطوات إعداد الطابعة لاستخدام خدمة الطباعة من السحابة هي: وصِّل الطابعة بالحاسوب ثمَّ شغلها وعرفها. افتح متصفح chrome. تحقق من توافق طابعتك مع خدمة الطباعة من السحابة من جوجل عبر الخطوات التالية: انتقل إلى صفحة الطابعات المجهزة للطباعة من السحابة وابحث عن طابعتك. إذا وجدت عبارة "v2" بجوار اسم طابعتك فذلك يعني أنَّها مجهَّزة للطباعة من السحابة (الإصدار 2.0). أمَّا إذا لم تجد تلك العبارة فذلك يعني أنَّ طابعتك مجهَّزة للطباعة من السحابة (الإصدار 1.0). إن لم تكن طابعتك مُدرَجةً بالقائمة فذلك يعني عدم توافق طابعتك مع خدمة الطباعة من السحابة. وصِّل طابعتك بخدمة الطباعة من السحابة باتباع الخطوات التالية: اكتب chrome://devices ثمَّ اضغط على Enter. إذا كانت طابعتك غير متوافقة مع خدمة الطباعة من السحابة فاضغط على "إضافة طابعات" ضمن الطابعات التقليديَّة ثمَّ حدِّد الطابعة التي تريد مشاركتها واضغط على "إضافة الطابعات". إن كانت طابعتك مجهَّزةٌ للطباعة من السحابة ذات الإصدار 2.0 فابحث عنها ضمن الأجهزة الجديدة ثمَّ اضغط على "إدارة" بجوارها ثمَّ "تسجيل" واضغط على "تأكيد التسجيل" الذي يَظهر لك واتبع الخطوات اللاحقة لإضافتها. أمَّا إن كانت طابعتك ذات إصدار 1.0 فانتقل إلى موقع الشركة المصنِّعة لطابعتك من صفحة الطابعات المجهَّزة للطباعة والموجود في الجزء السفلي من اسم الشركة واتَّبع الخطوات. تأكَّد من توصيل طابعتك بشكل صحيح بالانتقال إلى google.com/cloudprint ثمَّ الضغط على "الطابعات". للمزيد من التفاصيل انتقل إلى صفحة المساعدة من جوجل. بعد تهيئة الطابعة للطباعة من السحابة، عد إلى خيارات الطباعة واضغط على "change" ثمَّ حدِّد طابعتك التي أضفتها للتو واطبع مباشرةً من مستندات جوجل. يمكن تنزيل المستند بصيغ عدَّة إلى حاسوبك وذلك يشبه خيار التصدير في التطبيقات المشابهة، ويمكنك بعد تنزيله على حاسوبك طباعته إن أردت. النشر يوفِّر تطبيق مستندات جوجل خيارات سريعة لنشر المستند أو إرفاقه عبر البريد الإلكتروني وإرساله إلى أحد الأشخاص وهي: النشر على الويب: هو إتاحة المستند على الويب ليتمكن أي شخص من البحث عنه ومشاهدته، ويمكنك نشر رابطه عبر مواقع التواصل الاجتماعي. عند تعيين الخيار "إعادة النشر تلقائيًّا عند إجراء التغييرات" يُحدَّث المستند المنشور على الويب خلال فترات زمنيَّة منتظمة لضمان نشره مع آخر التغييرات التي أُجريت عليه. إرسال رسالة إلكترونيَّة إلى المتعاونين: هو إرسال رسالة إلى الأشخاص المتعاونين الذين ساهموا في التعديل أو التعليق على المستند أي كل من شاركناهم المستند، وكتابة رسالة لهم مع إرفاق رابط المستند. الرسالة التي يستلمونها شبيهة بالرسالة التي تصلهم عند دعوتهم للمشاركة. إرسال بالبريد الإلكتروني كمرفق: هو إرفاق المستند وفق الصيغة التي تختارها مع رسالة إلى أحد الأشخاص عبر البريد الإلكتروني. الخاتمة تعرَّفنا في هذه المقالة على التشطيبات النهائيَّة التي نجريها على المستند وهي إدراج جدول المحتويات وطباعة المستند ونشره على الويب أو إرفاقه عبر البريد. إنَّ هذا التطبيق قيد التطوير وقد يضاف إليه بعض المزايا والأدوات في المستقبل.
  10. Ajenti هي لوحة تحكّم عبر الويب حرّة ومفتوحة المصدر يمكن استخدامها لتنفيذ مجموعة كبيرة ومتنوعة من مهام إدارة الخوادم، علاوةً على إمكانية تغطيتها لمجموعة أخرى من المهام عبر تركيب إضافات add-ons كإضافة Ajenti V والتي تسمح بإدارة عدّة مواقع من خلال لوحة تحكم واحدة. في هذا الدرس سوف نشرح تركيب مدوّنة ووردبريس WordPress على لوحة التحكم Ajenti مع الإضافة Ajenti V، حيث أفترض أنك قمت بتركيبهما في وقتٍ سابق. المتطلباتفي هذا الدرس ستحتاج إلى: عنوان نطاق domain مُسجّل ومربوط مع خادوم مُثبّت عليه لوحة التحكم Ajenti مع الإضافة Ajenti V (خلال الدرس سأستخدم النطاق example.com للتوضيح). لوحة التحكم Ajenti مُثبتة ومضبوطة بشكل صحيح مع الإضافة Ajenti V، يمكنك قراءة هذا الدرس لتثبيت Ajenti خطوة بخطوة.الخطوة الأولى: ضبط ووردبريسمن خلال متصفح الويب لديك انتقل إلى عنوان لوحة تحكم Ajenti الخاصة بك مثل https://panel.example.com وسجّل دخولك باستخدام حساب المدير admin الذي أنشأته أثناء تركيب Ajenti و Ajenti V. من الشريط الجانبي وتحت القسم 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 واكتب عنوان نطاقك مثل example.com ضمن المربع النصي الظاهر، ثم انقر على Apply Changes. انتقل إلى علامة التبويب Advanced، وأدخل النصّ التالي ضمن مربع Custom configuration:# This order might seem weird - this is attempted to match last if rules below fail. location / { try_files uriuri/ /index.php?$args; } # Add trailing slash to */wp-admin requests. rewrite /wp-adminscheme://hosturi/ permanent; # Directives to send expires headers and turn off 404 error logging. location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ { access_log off; log_not_found off; expires max; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac). # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban) location ~ /\. { deny all; } # Deny access to any files with a .php extension in the uploads directory # Works in sub-directory installs and also in multisite network # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban) location ~* /(?:uploads|files)/.*\.php$ { deny all; }انقر Apply changes. لننتقل الآن إلى لسان التبويب Content ومن القائمة المنسدلة اختر PHP FastCGI واضغط Create. انقر على القائمة Advanced أسفل new PHP entry، وأدخل المحتوى التالي ضمن Custom configuration. انتبه إلى أنه غير متطابق مع محتوى Custom configuration في الخطوة السابقة. try_files uri=404;fastcgisplitpathinfo(.+\.php)(/.+);انقر Apply Changes. انتقل إلى علامة التبويب MySQL أسفل قسم Databases، أدخل اسمًا لقاعدة البيانات، لهذا الدرس سأختار الاسم database_name وانقر على Create. الآن ومن أسفل قسم Users انقر على Create يمكنك الإبقاء على اسم المستخدم وكلمة المرور المولّدة تلقائيًا أو تغييرها إن شئتْ، ولهذا الدرس سأستخدم db_user و db_password على التوالي، عندما يكون كل شيء جاهزًا انقر على Apply Changes. احتفظ بالمعلومات التي أدخلتها جانبًا؛ اسم قاعدة البيانات، اسم المستخدم، وكلمة المرور، حيث ستحتاجها بعد قليل لإكمال إعداد ووردبريس. الخطوة الثانية: رفع الملفاتقبل أن تتمكّن من فك ضغط ملفات نظام ووردبريس أنت تحتاج لأداة فك الضغط zip أولًا. من الشريط الجانبي وأسفل قسم Tools اختر Terminal واضغط على New، انقر على الصندوق الأسود الذي سيظهر أمامك واطبع بداخله الأمر التالي: apt-get install zip unzip بعد انتهاء العملية انقر على X بجوار Terminal 0 أعلى الصفحة. عُد الآن مجددًا إلى قسم Websites واضغط على Manage بجوار موقعك، ثم اذهب إلى لسان التبويب General ضمن موقعك وأسفل القسم Automatic Downloader أدخل http://wordpress.org/latest.zip واضغط على Download and Unpack، حيث ستظهر نافذة طرفية وتتولى عملية تنزيل وفك ضغط حزمة ووردبريس، يمكنك الضغط على الزر X بجوار Terminal 0 في أعلى الصفحة بعد الانتهاء. عُد إلى القسم Tools في الشريط الجانبي وانقر على File Manager ثم توجّه إلى الدليل الذي أنشأته مسبقًا داخل المجلد /srv/ بالنقر على اسم المجلد، هناك يجب أن تُشاهد مجلد باسم wordpress والذي يتمّ إنشائه أثناء تنزيل وفك الضغط التلقائي للحزمة ووردبريس، ادخل إليه وحدد جميع الملفات والمجلدات التي بداخله كما يلي: الآن اختر العملية Cut من شريط الأدوات أعلى الشاشة: عُد إلى مجلدك داخل الدليل /srv/ مثل srv/example.com/ وألصق جميع الملفات والمجلدات بداخله مباشرةً. سيأخذ ذلك بضعة دقائق للانتهاء يمكنك بعدها حذف المجلد الفارغ wordpress. الآن جميع ملفات ووردبريس بداخل المجلد الجذر root لموقعك. الخطوة الثالثة: تركيب ووردبريسفي متصفح الإنترنت لديك انتقل إلى عنوان موقعك مثل http://example.com وستظهر أمامك صفحة ترحيبية من مُثبّت برنامج ووردبريس، اختر اللغة التي ترغب باستخدامها مع البرنامج واضغط على Continue ثم .. !Let’s go. في حقل اسم قاعدة البيانات غيّر القيمة الافتراضية wordpress إلى الاسم الذي اخترته سابقًا (database_name مثلًا هي القيمة التي اخترناها لهذا الدرس)، كذلك أدخل اسم المستخدم وكلمة المرور التي قمتَ بتحديدها. أبقِ قيمة Database host كما هي localhost. كما يمكنك ترك قيمة الخانة Table Prefix على حالها wp_ إلا أنه يُنصح بتغييرها لدواعٍ أمنيّة، مثلا يمكنك كتابة blog_ أو شيء من هذا القبيل، المهم أن لا يتجاوز طول الاسم خمسة محارف وأن ينتهي بالرمز _. الآن يمكنك النقر على زر Run the install لإكمال عملية التثبيت، وبعدها سيتبقى عليك تزويد البرنامج ببعض المعلومات عن موقعك (كالاسم، ومعلومات تسجيل الدخول). الخلاصةفي نهاية هذا الدرس يُفترض أن تكون قد تمكّنت من تثبيت برنامج ووردبريس بنجاح على لوحة تحكم Ajenti الخاصة بك. ترجمة -وبتصرف- للمقال Installing WordPress on Ajenti V لصاحبه Jonah Aragon.
  11. لقد تعرّفنا في الجزء الأول من هذا الدرس على Microsoft Publisher وعلى الوظائف التي يقوم بها والخصائص التي يوفرها. وتعلّمنا بعض أساسيات الاستخدام كإنشاء المنشورات الجديدة، تحريرها وحفظها. سنكمل الشرح في هذا الجزء وسنتعرف على كيفيّة تنظيم العمل على المنشور وتخصيص هوامشه ومن ثم تهيئته للطباعة. كيف تسهل عملك باستخدام منطقة التسويد Scratch Area وأوامر الترتيب Arrange لقد تطرقنا بلمحة بسيطة إلى منطقة التسويد في الجزء السابق، وذكرنا أنّها المنطقة الرمادية المحيطة بالصفحة والتي يمكن استخدامها لتحضير وخزن مختلف العناصر (الصور، الأشكال، النصوص) التي ننوي استخدامها لاحقا في المنشور. وهذي المنطقة هي نفسها لجميع الصفحات (أي لا تتغير محتوياتها بتغيّر الصفحة). لإدراج الصور من الجهاز داخل منطقة التسويد، قم بتحديد الصور في المجلد ثم اسحبها إلى هذه المنطقة. يمكنك إضافة عناصر أخرى، تعديلها، وتنسيقها وهي في هذه المنطقة. وعندما يحين وقت استخدامها قم بسحبها إلى الصفحة. كما يمكنك تبديل الصور بين منطقة التسويد والصفحة. حدد الصورة التي تريد إدراجها (بدلا من صورة أخرى موجودة في الصفحة) ثم انقر على المربع الأبيض الذي سيظهر في وسط الصورة واسحبها فوق الصورة الأخرى. عندما يظهر إطار ورديّ اللون قم بإفلات زر الفأرة: سيتم تغيير حجم الصورة الثانية ليناسب حجم الصورة الأصلية تلقائيًا، وستُنقل الصورة الأصلية إلى منطقة التسويد (كما تلاحظ في الصورة أعلاه). يمكنك تطبيق نفس العملية بالعكس (أي تبديل الصور من الورقة إلى منطقة التسويد). من الأدوات الأخرى المفيدة عند العمل على المنشورات هي التجميع Grouping. تسهل هذه الأداة العمل لأنّ المنشور يمكن أن يتكون من العديد من العناصر، وأحيانًا من الأفضل جمع عنصرين أو أكثر معًا لاختصار خطوات تنسيقها ونقلها من موضع إلى آخر. على سبيل المثال، سيكون من السهل تحريك الصورة الموضّحة أدناه مع تسميتها التوضيحية أو تحجيمها عندما تتعامل معها كعنصر واحد. انقر على الصورة لتحديدها، اضغط على مفتاح CTRL، ثم انقر على مربع النص لتحديده وبذلك سيتحدد العنصران معا. سيظهر تبويب تنسيق Format السياقي الخاص بأدوات الرسم Drawing Tools. من هذا التبويب انقر على تجميع Group: سيتحول مربعا التحديد إلى مربع واحد، وبذلك أصبح بإمكانك التعامل مع الصورة ومربع النص كعنصر واحد. وإذا قمت بتطبيق أي تنسيق، سيُطبّق على العنصرين معا. إذا رغبت لاحقا في تنسيق الصورة بشكل مستقل، يمكنك فك التجميع وتنسيقها، ثم إعادة التجميع. لفك التجميع حدد العنصر المجمّع، وانقر على أمر Ungoup من نفس التبويب: أمر آخر سيفيدك عند ترتيب العناصر المتراكبة هو الإحضار إلى الأمام Bring Forward أو الإرسال إلى الخلف Send Backward. على سبيل المثال، إذا رغبت في أن تكون الصورة الأخيرة المحددة أدناه هي الصورة الأمامية انقر على أمر إحضار إلى الأمام Bring Forward: لكن هذا الأمر سينقل الصورة مستوى واحد إلى الأمام (أي سيكون ترتيبها وسطي وليس أمامي في هذا المثال): لإحضارها في مقدمة جميع العناصر استخدم أمر إحضار إلى المقدمة Bring to Front بدلا من أمر Bring Forward: الشيء نفسه ينطبق على أمري الإرسال إلى الخلف Send Backward وإرسال إلى الخلفية Send to Back. الأول يقوم بتحريك العنصر مستوى واحد إلى الخلف، والثاني يقوم بتحريك العنصر إلى خلف جميع العناصر الموجودة خلفه. إعداد هوامش المنشور وخطوط الإرشاد تحتوي المنشورات بصورة عامة على هوامش Margins، وعند إعداد هذه الهوامش بصورة صحيحة ستتجنّب المشاكل التي قد تحصل عند طباعة المنشور. إذ تتطلب بعض أنواع الطابعات هوامش بأبعاد محددة لكي يُطبع المنشور بشكل صحيح. الهوامش هي المساحة الفارغة حول الورقة، ويمكن تغيير الهوامش بالذهاب إلى تبويب: تصميم الصفحة Page Design > هوامش Margins هناك ثلاثة أنواع من الهوامش القياسية، العريض Wide، المتوسط Moderate، والضيق Narrow. يمكنك اختيار أحد هذه الأنواع الثلاثة أو تعيين هوامش بأبعاد مخصصة Custom Margins: في مربع الحوار Layout Guides قم بإدخال أبعاد الهوامش المرغوبة في حقولها المخصصة، ويمكنك الاستدلال بمربع المعاينة لمعرفة كيف ستبدو الهوامش قبل أن تغلق مربع الحوار. بالرغم من أنّ الكثير من الطابعات التجارية تتيح إمكانية طباعة كافة محتويات الصفحة من الحافة إلى الحافة، إلّا أنّ هناك بعض الطابعات، وخصوصا المكتبية، لا توفر هذه الخاصية. لذلك من الأفضل إعداد هوامش الصفحة لكي تضمن طباعة المنشور بصورة صحيحة وعدم اقتطاع شيء من محتوياته مهما كان نوع الطابعة التي ستستخدمها. ولتتأكد من عدم خروج محتويات الصفحة عن الهوامش، استفد من خطوط إرشاد الهامش Guides وقم بمحاذاة العناصر داخله. لاحظ أنّه عندما تقوم بتحريك أي عنصر بالقرب من خط الهامش سيتغير لونه إلى أزرق غامق، وهو بذلك يخبرك أنّك قد وصلت إلى حد الهامش وأن أي حركة إضافية ستُخرج العنصر خارج الحد: بإمكانك إضافة خطوط إرشاد قياسية وبتخطيطات مختلفة من قائمة Guides في تبويب تصميم الصفحة Page Design: كما يمكنك إضافة خطوط إرشاد أفقية أو عمودية يدويا بتمرير المؤشر فوق حافة المسطرة إلى أن يتحول شكله إلى سهمين صغيرين، ثم السحب باتجاه الورقة إلى الموضع الذي تريد وضع خط الإرشاد فيه (استخدم المسطرة لضبط الأبعاد): هاتان الأداتان (المسطرة وخطوط الإرشاد) مفيدتان جدا في محاذاة العناصر وضبطها بصورة قياسية. إن لم تكن المسطرة وخطوط الإرشاد ظاهرة، اذهب إلى تبويب عرض View وتأكد من تأشير الخيارين Rulers و Guides: استخدام الصفحات الرئيسية Master Pages تشابه الصفحات الرئيسية القوالب، إلّا أنّ محتوياتها تكون غير قابلة للحذف أو التعديل. ومهما كان نوع وعدد العناصر المضافة إلى الصفحة الرئيسية، ستتكرر هذه العناصر عن إنشاء صفحة جديدة تندرج تحت تلك الصفحة الرئيسية. يُستفاد من الصفحات الرئيسية في توفير الوقت، إذ أنّك لن تضطر إلى إعادة إنشاء بعض العناصر التي تحتاج إلى تكرارها في كل صفحة، كالهوامش، أو أرقام الصفحات. كما أنّها وسيلة للحفاظ على تناسق مظهر المستند ككل كلما قمت بإضافة صفحات جديدة. يمكن أن يحتوي المنشور على صفحة رئيسية واحدة أو أكثر، وحسب الحاجة، وليتوضح لك المقصود من ذلك افتح قالبا فارغا واذهب إلى تبويب عرض View ثم انقر على الصفحة الرئيسية Master Page: ستلاحظ وجود صفحة رئيسية واحدة (A) بتخطيط بسيط جدا ولا تحتوي على أي عنصر (وذلك لأنّك قمت بفتح القالب الفارغ): قم بإغلاق القالب الفارغ وافتح قالبا آخر، وليكن Baby Photo Album مثلا: ستلاحظ أنّ هذا القالب يحتوي على عناصر مختلفة، مثل الأشكال، الإطارات، إلخ. لكن عندما تحاول تحديد أي من هذه العناصر (ما عدا العناصر النائبة للصور)، لتغيير حجمها أو تعديلها مثلا، لن تتمكن من ذلك. والسبب هو أنّها مضافة على الصفحة الرئيسية وليس على الصفحات العادية. بنفس الطريقة اذهب إلى تبويب: عرض View > الصفحة الرئيسية Master Page ستجد أنّ هذا القالب مكوّن من 6 صفحات رئيسية، ومن طريقة العرض هذه ستتمكن من تحديد العناصر وتعديلها: من الصفحة الرئيسية يمكنك إدراج مختلف العناصر وإجراء العديد من التنسيقات. وكما ذكرنا، كلّ ما يتم إضافته إليها لا يمكن التعديل عليه لاحقا من الصفحات العادية. لنفترض أنّك تريد إضافة شعار، أو علامة مائية، وتريد تكرارها على جميع الصفحات التي ستقوم بإضافتها لاحقا. اذهب إلى طريقة العرض الصفحة الرئيسية Master Page وقم بإدراج الصورة من تبويب إدراج ونسّقها حسب الرغبة. ثم أغلق الصفحة الرئيسية بالنقر على Close Master Page: بعد ذلك، عندما تقوم بإدراج صفحات جديدة لاحقا، سيتكرر كل ما قمت بإضافته في الصفحة الرئيسية: لإضافة صفحة رئيسية ثانية، اذهب إلى طريقة العرض Master Page وانقر على إضافة صفحة رئيسية Add Master Page: يمكنك مثلا إضافة رأس Heard كرقم الصفحة، التاريخ، أو عنوان مخصص: لإنشاء صفحة اعتيادية جديدة بنفس نمط الصفحة الرئيسية الجديدة (B في هذا المثال)، اذهب إلى تبويب: إدراج Insert > صفحة Page > إدراج صفحة Insert Page في مربع الحوار Insert Page، حدد عدد الصفحات التي تريد إدراجها وفيما إذا كانت قبل أو بعد الصفحة المحددة حاليا، ثم حدد الصفحة الرئيسية B (وهي الصفحة الرئيسية الثانية التي قمنا بإنشائها): استخدام مدقق التصميم Design Checker كما هو واضح من الاسم، مدقق التصميم هو أداة تُستخدم للبحث عن أية مشاكل محتملة في تصميم المنشور قبل أن تقوم بطباعته أو مشاركته مع الآخرين. لتشغيل مدقق التصميم اذهب إلى تبويب File ثم انقر على Run Design Checker: سيتم فحص المستند وتدقيق التصميم بشكل عام (وهو الخيار الافتراضي)، وستُعرض العناصر التي تحتوي على مشاكل إن وجدت: إذا كان منشورك موجهًا للطباعة، وهو الغالب، قم بتأشير خيار Run Final Publishing Checks. انقر على السهم بجانب كل عنصر يحتوي على مشكلة واختر أحد خيارات القائمة. يمكنك الانتقال إلى ذلك العنصر Go to this Item، تصحيحه Fix (إن وجد تصحيح تلقائي)، عدم تشغيل عملية التحقق هذه مجددا Never Run this Check Again، أو الحصول على تفسير لهذه المشكلة Explain (هذا الخيار سينقلك إلى نافذة المساعدة): يمكنك التحكم أكثر بخيارات المدقق بالنقر على Design Checker Options. يمكنك مثلا التحكم في الصفحات التي سيتم تدقيقها (كافة الصفحات All أو الصفحة الحالية فقط Current Page) من تبويب General: ومن تبويب Checks يمكنك تحديد عمليات التدقيق التي يجريها البرنامج، والتي يتم تنبيهك بها إن وجدت مشكلة (كافة عمليات التدقيق محددة بشكل افتراضي). إذا كانت هناك عملية تدقيق ترى أنّها غير ضرورية يمكنك إلغاء تأشيرها: بعد تصحيح جميع المشاكل يمكنك إغلاق المدقق بالنقر على Close Design Checker، وبذلك يُعتبر منشورك جاهزا للطباعة أو المشاركة. تهيئة المنشورات للطباعة بواسطة الطابعات التجارية في بعض الأحيان تحتاج إلى استخدام الطابعات التجارية لطباعة منشورك. قد يكون السبب هو أنّ طابعتك المكتبية لا تطبع المنشور بالحجم الذي تريده، أو أنّ كفاءتها في طباعة منشورات بجودة وكمية محددة غير جيّدة. في هذه الحالة يجب أن تقوم بتصدير منشورك بصيغة ملائمة قبل الذهاب إلى مكتب الطباعة. بعض المكاتب تفضّل طباعة المنشورات بصيغة PDF، والبعض الآخر تفضل صيغ الصور (مثل JPEG أو TIFF). لتهيئة المنشور للطباعة اذهب إلى تبويب: File > Export > Save for Commercial Printer يمكنك تصدير المنشور بصيغة PDF مباشرة كما وضّحنا في الجزء السابق من هذا الدرس، لكنّ خيار الحفظ لطابعة تجارية يتيح لك التحكم في خيارات إضافية. حيث يمكنك تحديد جودة الطباعة (الخيار Commercial Press هو الخيار الافتراضي، وهو الأعلى جودة). بالإضافة إلى ذلك يمكنك تصدير ملفي PDF وPub معا، ملف PDF فقط، أو ملف Pub فقط: بعد تحديد الخيارات المرغوبة انقر على زر Pack and Go Wizard، حدّد مجلد الحفظ ثم Next، وسيقوم البرنامج بتصدير الملف إلى المجلد المحدد (عند الانتهاء يمكنك طباعة تدقيق مركب Print Composite Proof أو عدم طباعته). يعتبر هذا الخيار (Save for Commercial Printer) ملائما إذا كان المنشور يحتوي على نصوص بالدرجة الأكبر. أما إذا كانت العناصر الجرافيكية هي الغالبة في تصميم المنشور فالخيار الملائم هو حفظ لطباعة الصور Save for Photo Printing. حدّد صيغة الصور، ثم انقر على Save Image Set: إن اخترت الخيار الأول ستجد في مجلد الحفظ مجلد مضغوط يحتوي على ملف Pub وآخر PDF (في حالة الخيار الافتراضي): وإن اخترت الخيار الثاني، ستجد في مجلد الحفظ عدد من الصور (حسب صفحات المنشور): وبهذا يكون درسنا حول أساسيات Publisher قد انتهى. تعليقاتكم واستفساراتكم مرحب بها.
  12. تمّ تصميم أنظمة إدارة الإعدادات لتجعل التحكّم بعدد كبير من الخواديم أمرًا سهلًا لمديري الأنظمة وفرق العمليّات، فهي تسمح لنا بالتحكّم بالعديد من الأنظمة المختلفة بطريقة مؤتمتة من موقع مركزي واحد. وبينما تتوافر العديد من أنظمة إدارة الإعدادات الشائعة من أجل أنظمة 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.
  13. هذا الدّرس هو جزء من سلسلة دروس حول نشر تطبيقات PHP باستخدام Ansible على Ubuntu، تحدّثنا في الأجزاء الأولى عن الخطوات الأساسيّة لنشر تطبيق، وفي بقيّة الأجزاء تكلمنا عن مواضيع أكثر تقدّمًا مثل قواعد البيانات، عفاريت الطابور queue daemons، وجدولة المهام (عبر cron). سنقوم في هذا الدّرس بالبناء على ما تعلمناه في الدروس السابقة عن طريق تحويل playbook في Ansible من دعمها لتطبيق واحد إلى دعمها لنشر تطبيقات PHP متعدّدة على خادوم أو عدّة خواديم. سنستخدم تطبيقات Lumen بسيطة كجزء أمثلتنا، ولكن يُمكِن تعديل هذه التعليمات بسهولة لتدعم أطر عمل وتطبيقات أخرى في حال كانت متواجدة لديك، من المفضّل أن تستخدم تطبيقات الأمثلة حتى تجد نفسك متآلفًا مع القيام بالتغييرات لِـ playbook. الخطوة الأولى – إضافة المزيد من التطبيقاتفي هذه الخطوة سنقوم بإعداد تطبيقين إضافيين في الـ playbook لدينا. الآن وقد أعدنا تصنيع الـ playbook سنستخدم متغيرات لتعريف التطبيقات، إنّ عملية إضافة تطبيقات جديدة لخادومنا هي عملية سهلة جدًّا، نقوم بإضافتها ببساطة إلى قائمة المتغيرات applications، وهنا تظهر قوة متغيرات Ansible. نفتح playbook من أجل تحريرها: nano php.yml نبحث في أعلى القسم vars عن الكتلة applications: Existing applications variable in php.yml applications: - name: laravel domain: laravel.example.com repository: https://github.com/do-community/do-ansible-adv-php.git branch: example نضيف تطبيقين اثنين: Updated applications variable in php.yml applications: - name: laravel domain: laravel.example.com repository: https://github.com/do-community/do-ansible-adv-php.git branch: example - name: one domain: one.example.com repository: https://github.com/do-community/do-ansible-php-example-one.git branch: master - name: two domain: two.example.com repository: https://github.com/do-community/do-ansible-php-example-two.git branch: master نحفظ الـ playbook ونقوم بتشغيلها: ansible-playbook php.yml --ask-sudo-pass قد تستغرق هذه الخطوة بعض الوقت بينما يقوم الـ composer بإعداد التطبيقات الجديدة، وعندما ينتهي سنلاحظ تغيير عدد من المهام، وإن دققنا أكثر سنلاحظ أنّه سيتم عرض كل عنصر ناتج عن الحلقة، يخبرنا الأول وهو تطبيقنا الأصل بعبارة ok أو skipped، بينما يخبرنا التطبيقان الجديدان بالحالة changed. والأهم من ذلك أنّه إذا زرنا النطاقات الثلاثة لمواقعنا التي أعددناها في متصفح الإنترنت فينبغي أن نلاحظ ثلاثة مواقع مختلفة. الأول يبدو مألوفًا لنا، أما الموقعان الآخران سيعرضان: http://one.example.com/ This is example app one! http://two.example.com/ This is example app two! وبذلك قمنا بنشر تطبيقي ويب جديدين عن طريق تحديث قائمة التطبيقات ببساطة. الخطوة الثانية – استخدام متغيرات المضيفين Host Variablesسنستخرج في هذه الخطوة متغيراتنا إلى متغيرات المضيفين. بالرجوع إلى الوراء نجد أنّ متغيرات الـ playbook جيدة، ولكن ماذا لو أردنا نشر تطبيقات مختلفة على خواديم مختلفة باستخدام نفس الـ playbook؟ نستطيع عمل تحقّق شرطي على كل مهمّة لإيجاد الخادوم الذي يقوم بتشغيل المهمة، أو نستطيع استخدام متغيرات المضيفين، وهي تمامًا كما تبدو عليه: متغيرات تُطبَّق على مضيف معيّن بدلًا من كافّة المضيفين عبر الـ playbook. يمكن تعريف متغيرات المضيف سطريًّا inline بداخل الملف hosts كما فعلنا مع المتغير ansible_ssh_user أو يمكن تعريفها في ملف مخصّص لكل مضيف داخل الدليل host_vars. في البداية نقوم بإنشاء دليل جديد إلى جانب الملف hosts والـ playbook، نقوم بتسمية الدليل بـ host_vars: mkdir host_vars نحتاج بعدها إلى إنشاء ملف من أجل المضيف، الاتفاقية التي تستخدمها Ansible هي من أجل أن يتوافق اسم الملف مع اسم المضيف في الملف hosts، لذلك على سبيل المثال إن كان يبدو الملف hosts لدينا كما يلي: Ansible hosts file your_first_server_ip ansible_ssh_user=sammy فينبغي أن نقوم بإنشاء ملف يُدعى host_vars/your_first_server_ip، فلنقم بإنشائه الآن: nano host_vars/your_first_server_ip تستخدم ملفّات المضيفين YAML من أجل تنسيقها تمامًا كما هو الحال مع الـ playbooks، ويعني هذا أنّنا نستطيع نسخ القائمة applications إلى ملف المضيفين الجديد لدينا بحيث يبدو كما يلي: New host_vars/your_first_server_ip file --- applications: - name: laravel domain: laravel.example.com repository: https://github.com/do-community/do-ansible-adv-php.git branch: example - name: one domain: one.example.com repository: https://github.com/do-community/do-ansible-php-example-one.git branch: master - name: two domain: two.example.com repository: https://github.com/do-community/do-ansible-php-example-two.git branch: master نقوم بحفظ ملف المضيفين الجديد ونفتح الـ playbook لتحريرها: nano php.yml نحدّث أعلى الملف لإزالة كامل القسم applications: Updated top of php.yml --- - hosts: php sudo: yes vars: wwwuser: www-data tasks: . . . نحفظ الـ playbook ونقوم بتشغيلها: ansible-playbook php.yml --ask-sudo-pass وعلى الرغم من أنّنا نقلنا متغيراتنا من الـ playbook إلى ملف المضيفين فيجب أن يبقى الخرج نفسه ولا يجب أن يتم تبليغنا عن تغييرات من قبل Ansible، وكما نرى يعمل host_vars بنفس الطريقة التي يعمل بها vars في الـ playbook، ولكنّه مُخصّص للمضيف. ستكون المتغيرات المُعرّفة في ملفّات host_vars قابلة للوصول عبر كامل الـ playbooks التي تدير الخادوم، وهو مفيد من أجل الخيارات والإعدادات الشائعة، ومع ذلك كن حذرًا من استخدام اسم شائع قد يعني أشياء مختلفة عبر الـ playbooks المختلفة. الخطوة الثالثة – نشر التطبيقات على خادوم آخرسنستخدم في هذه الخطوة ملفات المضيفين الجديدة وننشر تطبيقاتنا على خادوم آخر. نحتاج في البداية إلى تحديث ملف المضيفين hosts بمضيفنا الجديد، نفتحه من أجل تحريره: nano hosts ونقوم بإضافة المضيف الجديد: Ansible hosts file your_first_server_ip ansible_ssh_user=sammy your_second_server_ip ansible_ssh_user=sammy نحفظ الملف ونغلقه. نحتاج بعدها إلى إنشاء ملف مضيفين جديد، كما فعلنا مع أول ملف: nano host_vars/your_second_server_ip تستطيع انتقاء واحد أو أكثر من تطبيقات مثالنا وإضافتها إلى ملف المضيف لديك، فإذا أردت مثلًا نشر مثالنا الأصلي والمثال الثاني إلى خادوم جديد فيجب أن تستخدم: New host_vars/your_second_server_ip file --- applications: - name: laravel domain: laravel.example2.com repository: https://github.com/do-community/do-ansible-adv-php.git branch: example - name: two domain: two.example2.com repository: https://github.com/do-community/do-ansible-php-example-two.git branch: master نقوم بحفظ playbook. وأخيرًا نقوم بتشغيلها: ansible-playbook php.yml --ask-sudo-pass ستستغرق Ansible وقتًا ليتم تشغيلها لأنّها تقوم بإعداد كل شيء على خادومنا الثاني، وعندما تنتهي نفتح تطبيقاتنا التي اخترناها في المتصفح (استخدمنا في هذا المثال laravel.example2.com وtwo.example2.com) وللتأكد من أنّه تم إعدادها بشكل صحيح يجب أن نرى التطبيقات المحدّدة التي اخترناها من أجل ملف المضيفين، وينبغي ألّا تحدث أيّة تغييرات على خادومنا الأصلي. الخاتمةأخذنا في هذا الدرس playbook تطبيق وحيد تعمل بشكل كامل وقمنا بتحويلها لتدعم تطبيقات متعددة عبر عدّة خواديم، وبجمعها مع المواضيع التي تمت تغطيتها في الدروس السابقة يجب أن تمتلك كل ما تحتاجه لكتابة playbook كاملة لنشر تطبيقاتك، وكما هو الحال مع الدروس السابقة فلا زلنا لم نسجل الدخول بشكل مباشر باستخدام SSH. ومن المؤكد أنك لاحظت مدى بساطة إضافة المزيد من التطبيقات والمزيد من الخواديم بعد الانتهاء من تجهيز بنية الـ playbook، وهنا تكمن قوة Ansible وهو ما يجعلها مرنة جدًّا وسهلة الاستخدام. ترجمة -وبتصرّف- لـ How To Deploy Multiple PHP Applications using Ansible on Ubuntu 14.04 لصاحبه Stephen Rees-Carter.
  14. سنواصل في هذا الدّرس حديثنا حول نشر تطبيق PHP باستخدام Ansible. هذا الدّرس هو الجزء الثّاني للسلسلة، إذا لم تقرأ الجزء الأول فمن الأفضل أن تشرع به أوّلا، حيث نُعالج فيه تثبيت Ansible وإعداده. إذا لم تكن لديك أيّة خلفية مُسبقة حول Ansible فمن الأفضل أن تبدأ مع مقال كيفيّة تثبيت وإعداد Ansible على Ubuntu. سنتحدث في هذا القسم من الدّرس عن كيفية الحصول على إطار عمل Laravel وإعداده وإعداد خادوم Nginx لتخديم تطبيق PHP. سنستخدم إطار عمل Laravel كمثال عن تطبيق PHP ولكن يُمكِن تعديل هذه التعليمات بسهولة لتدعم أطر عمل وتطبيقات أخرى في حال كانت متواجدة لديك. المتطلبات الأساسيةيبدأ هذا الدّرس مباشرة من حيث انتهى الجزء الأول من هذه السلسلة، ونحتاج كافّة الملفّات والإعدادات التي تم الحصول عليها في ذلك الجزء، إن لم تقم بإكمال أول درس من هذه السلسلة فنرجو أن تفعل ذلك قبل متابعة هذا الدّرس. الخطوة الأولى – استنساخ مستودع Gitفي هذا القسم سنقوم باستنساخ clone مستودع إطار عمل Laravel إلى الخادوم الخاص بنا باستخدام Git، سنشرح مثل الخطوة الثالثة كافّة الأقسام التي سنقوم بإضافتها إلى الـ playbook، ونضمّن بعدها كامل ملف php.yml من أجلك لتقوم بنسخه ولصقه. وقبل أن نستنسخ مستودع Git الخاص بنا نحتاج إلى التأكّد من وجود الدليل var/www/، نستطيع فعل هذا عن طريق إنشاء مهمّة مع وحدة الملف: - name: create /var/www/ directory file: dest=/var/www/ state=directory owner=www-data group=www-data mode=0700 نحتاج كما أشرنا سابقًا إلى استخدام الوحدة Git لاستنساخ المستودع إلى الخادوم الخاص بنا، وهي عمليّة بسيطة لأنّ كل ما نحتاجه بشكل طبيعي من أجل الأمر git clone هو مستودع المصدر source repository، في هذه الحالة سنعرّف أيضًا الوجهة destination ونخبر Ansible بعدم تحديث المستودع في حال وجوده مسبقًا عن طريق تعيين update=no، وبما أنّنا نستخدم Laravel سنستعمل رابط مستودع git التالي: https://github.com/laravel/laravel.git نحتاج مع ذلك إلى تشغيل المهمّة عن طريق المستخدم www-data للتأكّد من أنّ الصلاحيّات صحيحة، ولعمل هذا نستطيع إخبار Ansible أن ينفّذ الأمر كمستخدم محدّد باستخدام sudo، ستبدو المهمّة النهائية كما يلي: - name: Clone git repository git: > dest=/var/www/laravel repo=https://github.com/laravel/laravel.git update=no sudo: yes sudo_user: www-data ملاحظة: من أجل المستودعات المعتمدة على SSH نستطيع إضافة accept_hostkey=yes لمنع التحقّق من المضيف على SSH من تعليق المهمّة. نفتح الملف php.yml لتحريره: nano php.yml نضيف المهام السابقة إلى الـ playbook، يجب أن يبدو الملف النهائي كما يلي: ... - name: enable php5 mcrypt module shell: php5enmod mcrypt args: creates: /etc/php5/cli/conf.d/20-mcrypt.ini - name: create /var/www/ directory file: dest=/var/www/ state=directory owner=www-data group=www-data mode=0700 - name: Clone git repository git: > dest=/var/www/laravel repo=https://github.com/laravel/laravel.git update=no sudo: yes sudo_user: www-data handlers: - name: restart php5-fpm service: name=php5-fpm state=restarted - name: restart nginx service: name=nginx state=restarted نحفظ الـ playbook ونغلقها، ثمّ نقوم بتشغيلها: ansible-playbook php.yml --ask-sudo-pass الخطوة الثانية – إنشاء تطبيق باستخدام Composerسنستخدم في هذه الخطوة Composer لتثبيت تطبيق PHP واعتمادياته dependencies. يمتلك Composer الأمر create-project الذي يقوم بتثبيت كافّة الاعتماديات المطلوبة ومن ثمّ يُشغِّل خطوات إنشاء المشروع المُعرَّفة في القسم post-create-project-cmd من الملف composer.json، وهي الطريق المفضّلة للتأكّد من إعداد التطبيق بشكل صحيح لاستخدامه لأول مرّة. نستطيع استخدام مهمّة Ansible التالية لتنزيل وتثبيت Composer بشكل عمومي كـ usr/local/bin/composer/، سيكون بعدها قابلًا للنفاذ من قبل أي شخص يستخدم الخادوم بما فيهم Ansible: - name: install composer shell: curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer args: creates: /usr/local/bin/composer ومع وجود Composer مُثبّتًا لدينا فهنالك وحدة لـ Composer يُمكننا استخدامها، في حالتنا نريد إخبار Composer عن مكان مشروعنا (باستخدام المُعامِل working_dir)، ونريد أيضًا تنفيذ الأمر create-project، نحتاج أيضًا لإضافة المُعامِل optimize_autoloader=no لأنّ هذا العَلَم غير مدعوم من قبل الأمر create-project، وكما في حالة الأمر git يجب علينا تنفيذ هذا عن طريق المستخدم www-data للتأكّد من صلاحيّة الأذونات permissions، وبوضع كل ذلك معًا نحصل على هذه المهمّة: - name: composer create-project composer: command=create-project working_dir=/var/www/laravel optimize_autoloader=no sudo: yes sudo_user: www-data ملاحظة: قد تستغرق المهمّة create-project قدرًا كبيرًا من الوقت على خادوم جديد، حيث يمتلك الـ Composer ذاكرة تخزين مؤقّت فارغة ويحتاج إلى تنزيل كل شيء من جديد. نفتح الآن الملف php.yml لتحريره: nano php.yml نضيف المهام السابقة في نهاية القسم tasks فوق handlers بحيث تتوافق نهاية الـ playbook مع التالي: ... - name: Clone git repository git: > dest=/var/www/laravel repo=https://github.com/laravel/laravel.git update=no sudo: yes sudo_user: www-data - name: install composer shell: curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer args: creates: /usr/local/bin/composer - name: composer create-project composer: command=create-project working_dir=/var/www/laravel optimize_autoloader=no sudo: yes sudo_user: www-data handlers: - name: restart php5-fpm service: name=php5-fpm state=restarted - name: restart nginx service: name=nginx state=restarted نقوم أخيرًا بتشغيل الـ playbook: ansible-playbook php.yml --ask-sudo-pass ما الذي سيحدث إن قمنا بتشغيل Ansible مرّة أخرى الآن؟ سيتم تشغيل composer create-project مرّة أخرى، وفي حالة Laravel يعني هذا APP_KEY جديد، لذا نريد بدلًا من ذلك تعيين المهمّة لتعمل فقط بعد استنساخ clone جديد، نستطيع ضمان أنّها تعمل فقط مرّة واحدة عن طريق تسجيل متغيّر يحتوي نتائج المهمّة git clone ومن ثمّ التحقّق من هذه النتائج داخل المهمّة composer create-project، إن تمّ تغيير المهمّة git clone فسيتم تنفيذ composer create-project، أمّا إن لم يحدث ذلك فسيتم تخطّيها. ملاحظة: يبدو أنّه يوجد خطأ برمجي في بعض إصدارات وحدة composer في Ansible، وربّما تعيد الخَرْج OK بدلًا من Changed، حيث تتجاهل أنّه تمّ تنفيذ scripts على الرغم من أنّه لم يتم تثبيت اعتماديات. نفتح الملف php.yml من أجل تحريره: nano php.yml نبحث عن المهمّة git clone، نضيف الخيار register لحفظ نتائج المهمّة إلى المتغير cloned كما يلي: - name: Clone git repository git: > dest=/var/www/laravel repo=https://github.com/laravel/laravel.git update=no sudo: yes sudo_user: www-data register: cloned </code>نبحث بعدها عن المهمّة composer create-project، نضيف الخيار when للتحقّق من المتغيّر cloned لنرى إن تغيّرت قيمته أم لا: - name: composer create-project composer: command=create-project working_dir=/var/www/laravel optimize_autoloader=no sudo: yes sudo_user: www-data when: cloned|changed نقوم بحفظ الـ playbook وتشغيلها: ansible-playbook php.yml --ask-sudo-pass سيوقف الـ Composer الآن تغيير APP_KEY في كل مرّة يتم تشغيله فيها. الخطوة الثالثة – تحديث متغيرات البيئةفي هذه الخطوة سنقوم بتحديث متغيّرات البيئة Environment Variables من أجل تطبيقنا. يأتي Laravel مع ملف env. بشكل افتراضي والذي يقوم بتعيين قيمة APP_ENV إلى local وقيمة APP_DEBUG إلى true، نحتاج إلى تبديل هذه القيم إلى production و false على الترتيب، يُمكِن فعل هذا ببساطة باستخدام الوحدة lineinfile مع المهام التالية: - name: set APP_DEBUG=false lineinfile: dest=/var/www/laravel/.env regexp='^APP_DEBUG=' line=APP_DEBUG=false - name: set APP_ENV=production lineinfile: dest=/var/www/laravel/.env regexp='^APP_ENV=' line=APP_ENV=production نفتح الملف php.yml لتحريره: nano php.yml نضيف هذه المهمّة إلى الـ playbook، يجب أن تبدو نهاية الملف متطابقة مع التالي: ... - name: composer create-project composer: command=create-project working_dir=/var/www/laravel optimize_autoloader=no sudo: yes sudo_user: www-data when: cloned|changed - name: set APP_DEBUG=false lineinfile: dest=/var/www/laravel/.env regexp='^APP_DEBUG=' line=APP_DEBUG=false - name: set APP_ENV=production lineinfile: dest=/var/www/laravel/.env regexp='^APP_ENV=' line=APP_ENV=production handlers: - name: restart php5-fpm service: name=php5-fpm state=restarted - name: restart nginx service: name=nginx state=restarted نقوم بحفظ الـ playbook وتشغيلها: ansible-playbook php.yml --ask-sudo-pass إنّ الوحدة lineinfile مفيدة جدًا من أجل التطويعات tweaks السريعة لأي ملف نصّي، وهي رائعة للتأكّد من تعيين متغيّرات بيئة كهذه بشكل صحيح. الخطوة الرابعة – إعداد Nginxسنقوم في هذا القسم بإعداد Nginx لتخديم تطبيق PHP. إن زرت الآن الخادوم الخاص بك في متصفّح الإنترنت (على سبيل المثال http://your_server_ip )، فسترى صفحة Nginx الافتراضيّة بدلاً من صفحة المشروع الجديد في Laravel، حدث هذا لأنّنا لا زلنا نحتاج إلى إعداد خادوم ويب Nginx لدينا لتخديم التطبيق من الدليل var/www/laravel/public/، لفعل هذا نحتاج لتحديث إعدادات Nginx الافتراضيّة بهذا الدليل وإضافة دعم من أجل php-fpm بحيث يستطيع التعامل مع PHP scripts. نقوم بإنشاء ملف جديد يُدعى nginx.conf: nano nginx.conf نحفظ كتلة الخادوم التالية بداخل هذا الملف، تستطيع متابعة الخطوة الرابعة من هذا الدّرس من أجل المزيد من التفاصيل حول إعدادات Nginx، تُحدِّد التعديلات التالية مكان دليل Laravel العام وتتحقّق من استخدام Nginx لاسم المضيف الذي عرّفناه في الملف hosts كـ server_name مع المتغيّر inventory_hostname. nginx.conf server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /var/www/laravel/public; index index.php index.html index.htm; server_name {{ inventory_hostname }}; location / { try_files $uri $uri/ =404; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/laravel/public; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } نحفظ الملف nginx.conf ونغلقه. بإمكاننا الآن استخدام وحدة القالب template module لدفع ملف الإعدادات الجديدة عبرها، تبدو وحدة template مشابهة جدًا للوحدة copy، ولكن يوجد فرق كبير بينهما، فالوحدة copy ستنسخ ملف أو عدّة ملفّات بدون القيام بأيّة تغييرات، بينما تنسخ الوحدة template ملفًّا واحدًا وتقوم بتحليل كافّة الملفّات الموجودة بداخله، ولأنّنا استخدمنا {{ inventory_hostname }} داخل ملف إعداداتنا سنستخدم الوحدة template بحيث يتم تحليلها بداخل عنوان IP الذي استخدمناه في الملف hosts، وبهذه الطريقة لا يتوجّب علينا كتابة شيفرة محدّدة لملفّات الإعدادات التي تستخدمها Ansible. ومع ذلك فكما هو معتاد عند كتابة المهام نحتاج إلى أن نأخذ بعين الاعتبار ما سيحدث على الخادوم، ولأنّنا نقوم بتغيير إعدادات Nginx نحتاج لإعادة تشغيل Nginx و php-fpm، يتم هذا باستخدام الخيار notify: - name: Configure nginx template: src=nginx.conf dest=/etc/nginx/sites-available/default notify: - restart php5-fpm - restart nginx نفتح ملف php.yml: nano php.yml نضيف مهمّة nginx هذه في نهاية قسم المهام، ينبغي أن يبدو الملف php.yml كما يلي: php.yml --- - hosts: php sudo: yes tasks: - name: install packages apt: name={{ item }} update_cache=yes state=latest with_items: - git - mcrypt - nginx - php5-cli - php5-curl - php5-fpm - php5-intl - php5-json - php5-mcrypt - php5-sqlite - sqlite3 - name: ensure php5-fpm cgi.fix_pathinfo=0 lineinfile: dest=/etc/php5/fpm/php.ini regexp='^(.*)cgi.fix_pathinfo=' line=cgi.fix_pathinfo=0 notify: - restart php5-fpm - restart nginx - name: enable php5 mcrypt module shell: php5enmod mcrypt args: creates: /etc/php5/cli/conf.d/20-mcrypt.ini - name: create /var/www/ directory file: dest=/var/www/ state=directory owner=www-data group=www-data mode=0700 - name: Clone git repository git: > dest=/var/www/laravel repo=https://github.com/laravel/laravel.git update=no sudo: yes sudo_user: www-data register: cloned - name: install composer shell: curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer args: creates: /usr/local/bin/composer - name: composer create-project composer: command=create-project working_dir=/var/www/laravel optimize_autoloader=no sudo: yes sudo_user: www-data when: cloned|changed - name: set APP_DEBUG=false lineinfile: dest=/var/www/laravel/.env regexp='^APP_DEBUG=' line=APP_DEBUG=false - name: set APP_ENV=production lineinfile: dest=/var/www/laravel/.env regexp='^APP_ENV=' line=APP_ENV=production - name: Configure nginx template: src=nginx.conf dest=/etc/nginx/sites-available/default notify: - restart php5-fpm - restart nginx handlers: - name: restart php5-fpm service: name=php5-fpm state=restarted - name: restart nginx service: name=nginx state=restarted نقوم بحفظ الـ playbook وتشغيلها مرّة أخرى: ansible-playbook php.yml --ask-sudo-pass حالما تكتمل نعود إلى متصفحنا ونقوم بتحديثه، ينبغي أن نرى الآن صفحة المشروع الجديد في Laravel. الخاتمةيُغطّي هذا الدرس نشر تطبيق PHP مع مستودع عام، وبينما يكون هذا مثاليًّا من أجل تعلّم كيفيّة عمل Ansible، فإنّك لن تعمل دائمًا على مشاريع مفتوحة المصدر بشكل كامل مع مستودعات مفتوحة، ويعني هذا أنّك ستحتاج إلى استيثاق git clone في الخطوة الثالثة مع مستودعك الخاص، يُمكِن فعل هذا بسهولة باستخدام مفاتيح SSH. على سبيل المثال بعدما تقوم بإنشاء وإعداد مفاتيح نشر SSH على مستودعك تستطيع استخدام Ansible لنسخها وإعدادها على خادومك قبل مهمّة git clone: - name: create /var/www/.<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>/ directory file: dest=/var/www/.<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>/ state=directory owner=www-data group=www-data mode=0700 - name: copy private <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> key copy: src=deploykey_rsa dest=/var/www/.<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>/id_rsa owner=www-data group=www-data mode=0600يجب أن يسمح هذا للخادوم بالاستيثاق بشكل صحيح ونشر تطبيقك. لقد قمنا للتو بنشر تطبيق PHP بسيط على خادوم ويب Nginx معتمد على Ubuntu باستخدام Composer لإدارة الاعتماديّات، وتمّ كل هذا بدون الحاجة للدخول مباشرة إلى الخادوم الخاصّ بنا وتنفيذ أي أمر بشكل يدوي. ترجمة -وبتصرّف- لـ How To Deploy a Basic PHP Application Using Ansible on Ubuntu 14.04 لصاحبه Stephen Rees-Carter.
  15. وصلتني مؤخّرًا رسالة من قارئ يسأل عن عدد التّدوينات التي يجب أن ينشرها على مُدوّنته ونوعيتها. وبحكم أن التّدوين يُعتبر وسيلة تسويقة ضرورية ارتأيت أن أُخصّص مقالّا للأمر. أكثر من 66% من المدونات لم يتم تحديثها لمدة تزيد عن الشهرين، فيما يتم هجران 60 إلى 80% من المدونات بعد الشهر الأول، من السهل أن تتحول المدونة من فكرة جيدة إلى أمر يسبب الارتباك والحيرة. المشكلة الرئيسية أن التدوين يحتاج إلى جهد وعمل أكثر مما يتوقعه الناس، وكتابة المحتوى عالي الجودة بشكل منتظم ولفترة طويلة هو تحدٍ كبير، والكثير من الأفراد والمنظمات يجدون صعوبة في الاستمرار. الكثير من المدونين يسعون بشدة من أجل إخراج تدويناتهم بشكل سليم، ويشعرون بضغوطات تجعلهم يحرصون على النشر بشكل منتظم، لكن وفي نفس الوقت فإنهم يرغبون بالمحافظة على جودة المحتوى الذي ينشرونه. هناك سؤال مهم طرحه أحد الأشخاص وهو يعكس نظرة الكثير من المدونين: أشعر بأن صاحب السؤال حريص على تخفيف الأعباء عن نفسه وأتفهم ذلك دون شك، ولكن هذا الأمر قد يقلل من فاعلية مدونته. لنقم بمناقشة سؤالين مهمين ذكرهما السائل. هل ما زلت بحاجة إلى النشر المتكرر والمنتظم؟السائل كان محقا عندما قال بأن الفكر السائد هو أن على المدون نشر تدوينات جديدة بشكل متكرر ومنتظم، ولكني اعتقد بأن الهدف من هذا الأمر أكثر من مجرد جذب القراء للعودة لمدونتك. كم التدوينات والانتظام في نشرها يعتمد بشكل كبير على السبب الرئيسي الذي يدفعك للتدوين، فإذا كنت تقوم بالتدوين فقط لأنك تجد متعة في هذا الأمر فإن نقطة النشر المتكرر والمنتظم لا أهمية لها، ولكن إن كنت تدون لأسباب تجارية أو لبناء سمعة جيدة لنفسك فإن لهذا الأمر أهمية كبرى دون شك. التدوين هو وسيلة فعّالة لتبقي علامتك التجارية في ذاكرة الآخرين بشكل دائم (سواء كانت علامة شخصية أو تجارية). كمثال على ذلك، لو كنت أنا أقوم بالنشر مرة كل عدة أشهر لكنت سأذهب من ذاكرتك في وقت قريب ولن أحظى بفرصة للحصول على دعوة منك للعمل على المشروع الإلكتروني الذي تنفذه، وفي المقابل إذا كنت تقوم بالنشر بشكل منتظم فإن المتابعين سيفتقدونك في حال غيابك. مثلا في كل مرة أتوقف فيها عن النشر مدة أسبوع أتلقى دائما رسائل بريدية من أشخاص يبينون افتقادهم لما أنشر، وهذا يدل على أن حتى غياب المنشور الواحد الذي تعتاد على نشره بشكل منتظم سيبقي العلامة الخاصة بك في ذاكرة المتابعين. بالطبع فإن النقطة التي ذكرها السائل بخصوص التغذيات RSS feeds صحيحة، حيث أنه ومع استخدام هذه التقنية أصبح الاهتمام أقل بمحاولة جذب الزوار للرجوع لموقعك، ولكن عليك الحذر من وضع الافتراضات. نعم، إذا كنت تبحث عن القراء المهووسين بما تنشر فإنك لن تكون بحاجة للنشر المنتظم والمستمر كما في الحالات الأخرى، ولكن إذا كنت تبحث عن العامة فإني لست متأكدا إذا كانت التغذيات وحدها تكفي. التغذيات لا زالت بعيدة عن الانتشار الكافي، والكثير من الأشخاص لا يعرفون كيفية الحصول على التنبيهات من خلالها. هناك مناقشات لا تحصى على شبكة الإنترنت بخصوص كم التدوينات المناسب، ولأكون صريحا فإنه لا يوجد جواب وحيد لهذا السؤال، فالأمر يعتمد على مجموعة من العوامل ومنها الجمهور المستهدف وموضوع المدونة وكذلك مدى شهرتها. بالنسبة لي فأنا أشجع الأكثرية على التدوين مرة واحدة أسبوعيا على الأقل، ولكن بالطبع إذا كانت لديك مدونة تتمتع بشهرة عالية فإن الرقم قد يكون تدوينتان أو ثلاث يوميا! في كل الأحوال فإن التدوين لا يعتمد على الكم فقط بل أيضا على جودة المحتوى، وهذا يقودنا إلى القسم الثاني من السؤال الذي طرحه الشخص المذكور بالأعلى. ما هو الأهم الجودة أم الكم؟هل التركيز ينبغي أن يكون على النشر المنتظم والمستمر أو الجودة العالية للمحتوى؟ شخصيا لست متأكدا إذا كان هذا هو السؤال الصحيح الذي ينبغي طرحه، واعتقد أن السؤال ينبغي أن يكون "كيف يمكن أن أعد شيئا ذو صلة بالجمهور الذي يتابعني؟". إذا كنت تستهدف الفئة الأكاديمية بكتاباتك فإن التركيز ينبغي أن يكون على الجودة، أما إذا كنت تكتب للأصدقاء والعائلة فإنهم على الأرجح يرغبون بقراءة منشوراتك الجديدة بشكل منتظم، ولكن بالنسبة للمدونين الذين يمتلكون جمهورا بين الفئتين المذكورتين فإن هناك طرقا للاستفادة من كلا العالمين، أي الكم والجودة. لو قمت بإعداد قائمة تحتوي على عدد من أنواع التدوينات التي يمكن أن تنشرها في مدونتك، ستجد أنه ينبغي التركيز على الجودة بالنسبة لبعض التدوينات، بينما البعض الأخر يمكن كتابته بشكل سهل وسريع وبالتالي يمكن نشره بشكل منتظم. في مدونتي هذه على سبيل المثال، بعض المنشورات تحتوي على الكثير من التفاصيل وهذا يحتاج إلى الكثير من الوقت لإنهائها، وهناك بعض المنشورات المتعلقة بطرح الآراء حول موضوع معين كما هو الحال في هذا المقال، وهذا النوع ينشر باستمرار أكثر من النوع الأول ولكنه أقل تفصيلا، وأخيرا هناك روابط تنشر لمصادر أخرى وهذه تحتاج ثوانٍ فقط لنشرها والتعليق عليها ولهذا فإن هذا النوع ينشر بشكل أكثر انتظاما. باستخدام هذه النماذج المتعددة للمنشورات ستضمن النشر المستمر بدون أن تفقد جودة المحتوى. الخلاصةهناك الكثير من الأمور التي يمكن قولها حول التدوين، وبالفعل فإن هناك كتب قد نشرت حول هذا الموضوع، ولكن للإجابة على السؤال الذي طرحه السائل فأنا اعتقد بشدة بأن النشر المستمر والمنتظم لا زال في غاية الأهمية، ولكن التحدي هو أن تنجز ذلك بدون المساس بالجودة بشكل كبير، وتقسيم التدوينات إلى نماذج متعددة سيساعدك في هذا الأمر ولكن باستطاعتك أيضا أن تحصل على مساعدة من آخرين للنشر معك. الجانب السلبي الوحيد حسب خبرتي بأن الكثير من الأشخاص الذين يعرضون المساعدة في النشر يفشلون في تقديمه بالشكل الجيد. ترجمة وبتصرف للمقال How much to blog? لصاحبه Paul Boag. حقوق الصورة البارزة: Designed by Freepik.
  16. أعمل ككاتب مُستقل على عدّة مواقع حاليًا، وأدوّن على مدوّنتي أيضًا. التدوين الحر في غاية الأهمية بالنسبة إلي لأنّه في المستقبل القريب سيكون مدخل رزقي الوحيد، باعتبار أنني سوف أستقيل من عملي مع نهاية هذا العام، فالعمل بالتدوين الحر مهم بالنسبة إلي حتى أستطيع أن أعيل نفسي. ولهذا أنا أحضّر للاعتماد على العمل ككتاب مُستقل بشكل كامل بداية من العام المقبل. وما يجعل هذا الأمر صعبًا الآن هو أنني أعمل حاليًا بوظيفة بدوام كامل. وبما أنني أبحث عن معلومات متعلقة بالعمل الحر منذ مدّة فلقد أصبحت لدي خبرة لا بأس بها في هذا المجال، وسأحاول أن أنقل ما تعلمته عن العمل الحر إليكم من خلال هذا المقال . 1. تعرّف دائمًا على أشخاص جدديجب عليك التعرف إلى أناس جدد دائمًا ولا تقلّل أبدًا من مكانة أحد فأنت لا تعرف من أين يمكن أن يأتي عميلك القادم. فكلما تواصلت مع عدد أكبر من الناس كلما زادت فرص حصولك على مشاريع عمل جديدة. 2. لا تصُب كامل اهتمامك على العائد المادّيلا تصب كل تركيزك على المال الذي ستجنيه من القيام بعملٍ ما. فربما يمنحك هذا العمل فوائد أكبر من ذلك الربح المؤقت (المال). فعلى سبيل المثال ربما قيامك بهذا العمل يجلب لك معارف قيّمة ويحسن فرص حصولك على عمل على المدى البعيد . بدلاً من ذلك يمكنك التركيز على الاستمتاع بقيامك بالوظيفة الموكلة إليك، حتّى وإن قمت بذلك بسعر أقل من السّعر الذي اعتدت عليه. تذكر دائمًا أنّه إذا كنت سوف تستقيل من عملك للبحث عن حرية أكبر، مرونة ورضا أكبر كعامل مُستقل فإنّك لن ترغب في القيام بعمل لا تستمتع به. يجب عليك وضع ذلك نصب عينيك دائمًا. 3. اختر من العمل ما يناسب قدراتكهذه النقطة هامة خاصة عندما تكون مبتدئًا وسمعتك لم تترسخ بعد. فأسوء شيء يُمكنك أن تفعله هو أن تخذل عميلاً ولا تقوم بالعمل على أكمل وجه. لا تستلم أبدًا عملًا إذا كُنت تشك في قدرتك على تنفيذه على أتم وجه وتسليمه في الوقت المحدد . 4. لا تترفّع عن الأعماللا تترفّع عن الأعمال التي تُعرض عليك، ولكن هذا لا يعني أن تقبل بأي عمل تجده أمامك، بل يجب عليك دراسة كل عمل منها بدقة قبل الشّروع في تنفيذه. وتذكر، الأمر لا يتعلق بالمال فقط فالبدايات المتواضعة يُمكن أن توصلك إلى نتائج عظيمة. 5. كن ديناميكيًالا تتردّد في تقديم اقتراحات دقيقة ولبقة للعميل الذي تعمل معه. فإذا لاحظت أن هناك ثغرة في استراتيجية التّسويق الخاصة به على سبيل المثال فلا تتردد في أن تقدم عرضًا لإصلاح هذه الثغرة له. حتّى تتميّز عن باقي المُستقلين فيجب أن تقترح وتقّدم عروضك ولا تكتفي بأن تجلس محل المتفرجين وتنتظر قدوم المشاريع إليك. 6. العملاء الحاليين الذين تعمل معهم لهم الأولوية دائمًاالاحتفاظ بالعملاء الذين تعمل بالفعل معهم أسهل بكثير من البحث عن عملاء جدد. فلا تضيّع أبدا فرصة العمل مع العميل الذي يدفع بشكل مُنتظم ويجعل العمل معه سهلًا. حتّى لو كنت تريد أن تكسب مالًا أكثر وبشكل أسرع، ووجدت مشروعًا قد يوفّر لك ذلك، فكّر مرّتين قبل أن تتسرّع وتتخلّى عن العملاء الحاليّين. 7. اصنع اسمًا لنفسك أولًا ثم فكر بالمال لاحقًافي بداية العمل كمدون حر يجب لا أن يكون المال هو أولويتك الوحيدة. بعض المستقلين يعتقدون أنه يجب أن تُحدّد تسعيرًا ساعيّا جيّدًا منذ البداية، ولكن في بعض الأحيان لن يكون لديك خيار سوى أن تُقدّم بعض التنازلات على المدى القصير فيما يتعلق بذلك. ولكن لا حاجة لأن تقلق حيال ذلك، لأن علاقاتك مع عُملائك ستتطوّر وسترتفع أسعارك معها. 8. تعرّف على مُستقلّين آخرينيمكنني القول من واقع تجربتي الشخصية أن المدونين المستقلين هم مجموعة ودودة من الناس. فلقد كنت محظوظًا بالتعامل مع بعض المدونين اللطفاء. من الضرورة عليك أن تعرف زملائك المدونين جيدًا وألا تفكر بهم على أنهم منافسين لك، فلو أسست بعض العلاقات الجيدة مع زملائك المستقلين ستكون بذلك تسدي نفسك معروفًا بالحصول على أصدقاء جدُد . 9. لا تقطع جسور التّواصل مع عملائكستكون هناك بعض الأيام التي ستقع فيها مشاكل مع العملاء. ولكن عليك أن تتصرف بحكمة ورويّة عند حدوث ذلك، فيجب عليك مقاومة الرغبة في الجدال العقيم مع العميل وتضيق الخناق عليه أو حتّى أن تكتب وتنشر عن سوء العلاقة التي بينكما. فلن تكون هناك أي فائدة إن فعلت ذلك. ربما تشعر مؤقتًا بالرضا ولكن خلف ذلك ستكون هناك نتائج سلبية لما فعلته على المدى البعيد. فالعميل الذي يبدو التعامل معه صعبًا اليوم يمكن أن يزكّيك لعميل رائع غدًا، وعليه حاول دائما أن تُبقي علاقاتك مع جميع عملائك صحّية ومهنيّة. الطّريق لا تزال طويلةتلك فقط هي نصائح أوّلية لمن يرغب في العمل كمدون/كاتب مُستقل، والتي توصّلت إليها خلال بحثي في الأسابيع الماضية، ولكنني أعلم أن مازال هناك كم كبير من الأشياء التي تساعد على أن تكون ناجحًا بعملك كمستقل. ماذا عنك ؟ هل لديك أفكار ونصائح ترغب في تشاركها معنا؟ ترجمة -وبتصرّف- للمقال Freelance Writing: 9 Tips for Getting Started لكاتبه Tom Ewer.
  17. لقد كنت أفكر كثيرًا مؤخرًا عن الوقت المناسب لبداية التسويق لشركة ناشئة. في شركتي الناشئة السابقة، كنا مترددين في محاولة استقطاب الإعلام مبكراً. حيث كنا دائماً نننتظر إلى أن يصبح منتجنا "جاهزًا" أعتقد أن هذا غالبًا تفكير شائع. كي أزيل بعض المخاوف من التسويق المبكر وأزكي المنافع. سأشارك بعضًا من انطباعاتي عن مرحلة التسويق المبكر بناءً على تجربتي مع شركتي الناشئة حاليًا: Buffer. لم نتردد في التسويق في مرحلة مبكرة؟مثل كل شيء، من السهل أن تفكر في أسباب عدم البدء في تسويق شركة ناشئة. 1- نعتقد أن المنتج غير جاهز للتسويقفي مرحلة مبكرة، تعرف حتماً أن أشياء مثل مسارات التسجيل signup funnel وعملية تهيئة المُستخدمين الجدد onboarding process يمكن لها أن تتطور كثيرًا. بناءً على هذه الحقيقة الطبيعية، مع انتشار اتجاه الشركة الناشئة اللينة lean startup على مجال واسع الآن فإننا جميعا يستحسن بنا أن ننشر منتجاتنا بأبكر ما يمكن. إذ أنه من الطبيعي أن تعتقد أن التسويق يجب أن يبدأ حين يكون المنتج جاهزًا، ولكني أعتقد أننا نعيق أنفسنا بالانتظار. 2- نعتقد أن هناك فرصة واحدة فقطأعتقد أنه من المنطقي جدًا أن تتخوف من امتلاك فرصة واحدة مع المستخدمين المستهدفين عند التخطيط لتسويق منتج. إذ أن فكرة تكوين أحد ما قراره النهائي بناءً على الانطباع الأولي فكرة يمكن تصديقها للغاية. وقد اكتشفنا أن هذا الأمر بعيد تمامًا عن الحقيقة. 3- نعتقد أن المستخدمين المستهدفين سينفدونلقد اكتشفت مع Buffer أنه أحيانًا عندما كنا نصل لمرحلة مستقرة في معدل التسجيل في الموقع، وبينما كان الحل الواقعي هو تجربة طرق جديدة لتسويق فكرتنا، أو محاولة الارتقاء بطرقنا الحالية لمستويات أعلى، كان الاسلوب الأسهل هو الاعتقاد أننا وصلنا لنقطة التشبع ولم يعد بمقدورنا الوصول إلى المزيد من الناس. نعرف الآن، كما ستكتشف لاحقًا بالأسفل، أننا لن نصل أبداً لنقطة لا نستطيع أن نحضر فيها المزيد من التسجيلات الجديدة. لم يجب علينا التسويق حتى لو كان الوقت مبكراً جداًأدركت مع مرور الوقت، أنّه حتى حين نطلق منتجاتنا مبكراً، يجب علينا أن نهدف إلى تسويق شركتنا الناشئة مبكرًا جدًا. أعتقد أن ما يبدو مبكرًا جدًا هو في الحقيقة وقت ممتاز لبداية التسويق. معظم الناس غالبًا يتأخرون كثيرًا عما يجب. 1- أفضل طريقة لتطوير المنتج هي استخدامهمات مولينوِج Matt Mullenweg، مؤسس Wordpress، عبر عن هذا بشكل أفضل مما كنت سأفعل مطلقًا: ما اكتشفناه مع Buffer هو أن معاملتنا للتسويق كوسيلة لتبادل النقاشات بدلًا من كونه قناة إذاعية، قد جعل التسويق أفضل طريقة لتقوية الإعلان بالإضافة إلى تطوير المنتج. أجرينا العديد من التجارب مع إعلاننا وكان هناك الكثير لتحسينه في المنتج، وقد أصبح التطور السريع أسهل بكثير إذ كان شريكي ليو يكتب عدة مقالات أسبوعيًا عن Buffer لمجموعة متنوعة من المدونات. 2- لا يسجل الناس دائمًا في المرة الأولى التي يسمعون بها عن منتجكعندما بدأنا ننجح في إبراز Buffer في عدد من المدونات، اكتشفنا من المحادثات في التعليقات أن العديد من الناس قد سمعوا بالفعل عن Buffer. وما حدث هو أنه بينما كان بعض الناس يسجلون في المرة الأولى التي يسمعون بها عن Buffer، انتظر الآخرون حتى يسمعوا عنها عدة مرات. أعتقد الآن أن عددًا كبيرًا من الناس لا يسجلون في الخدمات التي يسمعون بها لأول مرة. ولهذا السبب، يجب أن نعمل على بروز اسم منتتجنا مرارًا على نطاق واسع. إذ أن هناك نقطة تحول للناس يقررون فيها التجربة. يجب عليك العمل للوصول إليها. 3- لن ينفذ عدد المستخدمين المستهدفينأدركت مؤخرًا أننا لن نصل لنقطة لا نستطيع فيها جلب المزيد من التسجيلات الجديدة في Buffer. إذ أننا في الأساس أداة لمستخدمي Twitter، يمكنك أن تتخيل سرعة نمو سوق تويتر لتدرك أننا لن نواجه مشكلة التشبع. لمزيد من الوضوح، ألقٍ نظرة على هذا المخطط الذي يظهر إحصائيات تسجيلات Evernote منذ ستة أشهر مضت: منذ ستة أشهر كانت Evernote تسجل حوالي 2000 مستخدم جديد كل ساعة. وقد أعلنوا مؤخرًا أنهم زادوا من 6 مليون مستخدم مسجل في وقت هذا المخطط إلى أكثر من 10 مليون مستخدم مسجل اليوم. وأتوقع أن ايفرنوت قد تسجل حوالي 100.000 مستخدم جديد يوميًا. لكي تحصل على نمو كهذا يجب عليك العمل باستمرار على التسويق. أعتقد أنه عند بناء شركة ناشئة يجب التركيز على التسويق وتطوير المستخدم مثلما نركز على تطوير المنتج. هل بدأت بتسويق منتجك بعد؟ وإن لم تكن، فلم تؤخره؟ بانتظار تعليقاتكم على هذه المقالة. ترجمة -وبتصرّف- للمقال Why you should start marketing early لصاحبه جويل غاسكوين (مؤسّس خدمة Buffer).
  18. ربما سمعت من قبل عن رخص المشاع الإبداعي Creative Commons، التي بدأت تنتشر على استحياء في المحيط العربي التقني، وربما لاحظت التنويه Content licensed under CC BY-NC-SA 4.0 unless mentioned otherwise (المحتوى منشور تخت رخصة المشاع الإبداعي النسب-غير تجاري-المشاركة بالمثل 4.0 ما لم يذكر غير ذلك) في خاتمة موقع أكاديمية حسوب وتساءلت عن معناها وفائدتها. دعنا أولاً نتعرف عليه من خلال هذا الإنفوجرافيك المبسط على هذه الرّخصة. من الأفكار الشائعة حول فكرة رخص المشاع الإبداعي خصوصاً، والرخص الحرة عموماً، هي أن فوائدها تنحصر على الجانب الخيري أو الأخلاقي، أي فائدة المجتمع دون أي عائد على مصلحة الشخص أو المؤسسة. وهي فكرة سريعة الحكم على رخص المشاع الإبداعي، إذ لها فوائد كثيرة في التسويق للأعمال والأفكار وأمثلة ناجحة في مجتمع الإنترنت. هناك عدة جوانب للاستفادة من ترخيص العمل برخص المشاع الإبداعي، نذكر منها ما سيلي في هذا المقال. زيادة نطاق جمهوركمع السماح للجمهور بمشاركة أعمالك، تزيد فرص وصولها إلى نطاق أوسع وأعرض من المستخدمين والمتابعين، مع ضمان النسب إلى المؤلف الأصلي للعمل، وهو أنت، بالتالي يزيد من انتشار اسمك وتعريف الناس بأعمالك مما يدفعهم للبحث عن بقية الأعمال ومتابعتها والمطالبة بأعمال مماثلة بمقابل، وهكذا قد وفرت جزءاً كبيراً من الدعاية المجانية. ونقتبس هنا من كاتب الخيال العلمي كوري دكتورو، الذي تحدث عن تجربته الناجحة في ترخيص جميع النسخ الإلكترونية من كتبه برخصة المشاع الإبداعي في مقالته "Giving it away منحه"، أنه بالرغم من أن معظم الناس ممن حملوا الكتاب الإلكتروني لا ينتهي بهم الأمر بشراءه، إلا أنهم لم يكونوا ليشتروه في جميع الأحوال، بالتالي لم أخسر مبيعات، بل كسبت جمهوراً. هناك عدد من الناس يعتبرون الكتاب الإلكتروني بديلاً عن شراء الكتاب الورقي، وهم مبيعات ضائعة، وهناك عدد أكبر منهم يعتبره تشجيعاً لشراء النسخة الورقية منه. وهم مبيعات مكتسبة، طالما عدد المبيعات المكتسبة يفوق المبيعات الضائعة، فأنا في الصدارة! قد لا ينحصر توسيع الجمهور نتيجة لرخصة المشاع الإبداعي في نطاق اللغة المنشور بها العمل، بل يشمل أيضاً، إذا كانت الرخصة تسمح بالاشتقاق من العمل، إمكانية ترجمة عملك إلى لغات قد لا تستطيع توفيرها بالطرق العادية، إذ أن ترجمة الأعمال المحمية بحقوق الملكية تتضمن معاملات قانونياً أكثر تعقيداً وتكلفة وتستهلك وقتاً أكثر مما تتطلبه عملية الترجمة نفسها. ونأخذ هنا على سبيل المثال ما ذكره الكاتب سيموني أليبراندي صاحب كتاب "Creative Commons: A user guide" عن ترجمة كتابه إلى اللغة العربية كيف أن الترخيص الحر للكتاب، أتاح ترجمته وإتاحته لما يقرب من 250 مليون شخصاً إضافياً من قارئي اللغة العربية، بينما لو كان الكتاب مرخصاً برخصة مغلقة، لاحتاج الناشر العربي الاتصال بناشر الاتصال والتفاوض على حقوق الترجمة في عملية مرهقة وطويلة، وهو ما لم يكن ضرورياً هنا لحسن الحظ! تحسين ترتيب ظهور أعمالك في نتائج البحثمع شرط النسب الموجود حتى في أكثر رخص المشاع الإبداعي تحرراً، وهي رخصة النسب، يساهم كثرة الروابط إلى العمل الأصلي في تحسين ترتيب ظهور العمل في محركات البحث وزيادة فرص ظهوره بشكل عام. بالإضافة إلى أن محرك البحث الشهير جوجل، يوفر خيار البحث عن الصور والمقالات المرخصة برخص المشاع الإبداعي مع تحديد نوع الرخصة، مما يسهل من عملية الوصول إلى المحتوى بشكل أكبر وأسرع، ناهيك عن توفير موقع المشاع الإبداعي لمحرك بحث قوي (وجاري العمل حالياً من قبل مؤسسة المشاع الإبداعي على تحديثه إلى أداة أقوى، ويمكن متابعة عملية التطوير والمشاركة فيها أيضاً، هذه من مميزات الرخص الحرة الرائعة) للبحث عن مختلف أنواع الأعمال الإبداعية بصيغها المختلفة في شتى أنواع المواقع. منبع مجاني من الأفكار والاقتراحاتإذا كان عملك عبارة عن كود برمجي أو موقع أو تطبيق إلكتروني ما، فإتاحته برخصة المشاع الإبداعي، ومثيلاتها من الرخص، يوفر لك دعماً مجانياً من محبي التقنية وروادها للعثور على الثغرات والأخطاء الموجودة في الكود وتصحيحها، وحتى إضافة خواص جديدة تطور من العمل، وخمن ماذا؟ ترخيصك للعمل بشكل يسمح بالتعديل عليه دون الاستفادة منه تجارياً، لا يمنعك من الاستغلال التجاري له، أو التعديل عليه بالاستلهام من الأفكار والاقتراحات الجديدة، أو ما شابه، إذ أن حقوق العمل ممنوحة لك كلياً طالما هو ضمن ملكيتك، فقط هي مقيدة للآخرين حسب رخصة العمل. وطبعاً لنا في موقع Github الشهير أفضل مثال على مشاركة الأعمال بمختلف الرخص الحرة والمساهمة في تطويرها وتحسينها. وهناك نماذج ناجحة لمؤسسات وأشخاص رخصوا أعمالهم برخص المشاع الإبداعي، نذكر على سبيل المثال لا الحصر: Ted Talks: واحدة من أعمدة العالم التقني، بدأت محاضرات تيد كحلقات دراسية خاصة يحضرها القليلون. وبعد خمس سنين من نشر كل محاضرات تيد تحت رخص المشاع الإبداعي، أكثر من 200 مليون مشاهد تمتعوا بالتفكير الإبداعي لمتحدثي تيد. تقول جون كوهين، مديرة تنفيذية لإعلام تيد "هذا النمو المزدهر كان نتيجة مترتبة كلياً على التوزيع الحر والمفتوح، إذ أتاح ترخيص المشاع الإبداعي المشاركة بطرق أفضل مما كنا لنفعله بمفردنا." Global Voices أصوات عالمية: تفشل المؤسسات الإعلامية الكبري في توصيل معلومات متعمقة من قلب الحدث في الأحداث العالمية - في حين أن المدونين المحليين والصحفيين المواطنين غالباً ما يكونون أكثر صلة ودراية بالمجتمعات التي يكتبون عنها. أصوات عالمية GlobalVoices، مؤسسة غير ربحية أنشأتها الصحفية ريبيكا ماك كينّون، توفر منصة لحوالي 350 محررين وكتاب ومترجمين متطوعين من حول العالم لجمع الأنباء من قلب مجتمعاتهم في مكان واحد. هؤلاء الصحفيين المواطنين وفروا تغطية مفصلة مباشرة لجميع الأحداث بداية من زلزال هايتي إلى احتجاجات إيران. وكل المحتوى مرخص برخصة المشاع الإبداعي النسب BY، لذا يمكن ترجمة ونشر المعلومات بحرية لمن يريد أكثر من اللقطات السريعة في أخبار المساء. Pratham Books كتب برثام: كتب براثام، دار نشر صغيرة غير ربحية في الهند، مهمتها البسيطة الطموحة هي إتاحة كتاب لكل طفل. مدركة أن هذا الهدف الضخم الجريء يستحيل تحقيقه بمفردها، بدأت براثام بنشر كتبها ورسوماتها تحت رخص المشاع الإبداعي على فليكر Flicker وسكريبد Scribd في عام 2008. جوتام جون، مدير المشاريع الجديدة في كتب براثام، يقول "كدار نشر صغيرة، لا نمتلك القدرة لتخصيص رخص كل مرة يود طرف مهتم استخدام محتوانا بشكل مختلف. وما أتاحته لنا رخص المشاع الإبداعي هو التعاون مع شركاء مختلفين دون مرافقة المفاوضات القانونية والوقت والمال الذي تستهلكه لتتم." بدلاً من ذلك، ترسل كتب برثام للمستخدمين رابط إلى تحميل الكتاب وصفحة الترخيص ببساطة. Jonathan Worth جوناثان وورث: تعلق أعمال المصور البريطاني جوناثان وورث في متحف اللوحات القومي في لندن، يدرس التصوير في جامعة كوفنتري بالمملكة المتحدة، وقد صور الممثلين كولين فيرث، رايتشل هانتر، جود لو وهيث لدجر. وقد قضى وورث وقته، مثل معظم زملائه، في تطويق الإنترنت لحماية أعماله من السرقة. كان منزعجاً من كمية الوقت المهدر في ملاحقة انتهاكات ملكيته الفكرية. يقول وورث "هنا قابلت كاتب الخيال العلمي كوري دكتورو، الذي كان يمنح كتابه للجمهور، ويكسب منه المال في الوقت ذاته. صورته صورة فوتوجرافية وسألته عن الصفقة، فاقترح عليّ اجراء تجربة." وقد وافق وورث، فرخصوا الصورة برخصة المشاع الإبداعي النسب BY وشاركوا نسخ عالية الجودة منها على الإنترنت مجاناً، مع توفير نسخ موقعة بأسعار متنوعة ومستويات مختلفة من الحقوق الحصرية. قال وورث "وقد بيعت النسخ الأغلى أولاً، لم يكن أحد منهم قد سمع عني، ولكنهم كانوا يدفعون أسعاراً جيدة لمطبوعاتي." Open University الجامعة المفتوحة: تقبل الجامعة المفتوحة الطلبة من جميع الخلفيات، بغض النظر عن إنجازاتهم الأكاديمية أو ظروفهم الاجتماعية. وهي أول جامعة تعليم عن بعد ناجحة في العالم، وواحدة من أكبرهم، مع حوالي أكثر من ربع مليون طالب في ٤٠ دولة. في عام 2005، أخذت الجامعة المفتوحة خطوة إضافية في انفتاحها مع إنشائها لموقع جديد، OpenLearn التعلم المفتوح، مع منح الجمهور صلاحيات الوصول إلى مواد دوراتها التدريبية وإعادة استخدامها تحت رخص المشاع الحر. باختيارها لاستخدام رخص المشاع الإبداعي بدلاً من تطوير قوانينها الخاصة بخصوص الصلاحيات، وفرت الجامعة كثيراً من أتعاب المحاماة. يقول باتريك ماك أندرو "لقد خصصنا بداية 100.000 جنيه استرليني كأتعاب قانونية لكتابة رخصة صالحة لموقع التعلم المفتوح OpenLearn، لكن لم يصرف أي منها حين استخدمنا المشاع الإبداعي"، ساعد المشاع الإبداعي الجامعة أيضاً في توفير التكلفة عند تطوير مواد الدورات التدريبية والتعامل مع موزعي الطرف الثالث. " استخدامنا لرخصة معروفة ساعدنا بدعم الآخرين للانضمام. حيث كنا نوجه الناس إلى معلومات المشاع الإبداعي المستقلة بدلاً من الطلب منهم لاتخاذ رخصة مخصصة." منذ إطلاقه، حصد موقع التعلم المفتوح OpenLearn أكثر من 2 مليون زائراً، وتم تحميل مواد الدورات التدريبية أكثر من 20 مليون مرة على أي تيونز يو iTunes U، مما يجعلها أكثر جامعة تحميلاً في متجر أبل. يمكنك معرفة تفاصيل أكثر عن قصص النجاح السابقة وتصفح المزيد في كتاب The Power Of Open.
×
×
  • أضف...