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

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

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

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

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

نوع المحتوى


التصنيفات

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

التصنيفات

  • مقالات برمجة عامة
  • مقالات برمجة متقدمة
  • 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

ابحث في

ابحث عن


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

  • بداية

    نهاية


آخر تحديث

  • بداية

    نهاية


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

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

  • بداية

    نهاية


المجموعة


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

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

  1. يُعَدّ التدوين على المنصات الإلكترونية أحد أكثر الأمور شيوعًا واستعمالًا، حيث يشمل مختلف المجالات، كما يتوفر على عدّة منصات منها منصة ووردبريس التي تتيح الكثير من المزايا للمستخدم، وفيما يلي شرح توضيحي لعملية التدوين السليمة على منصة ووردبريس. ما هي المدونة يُستخدم مصطلح مدوّنة (blog) اختصارًا للمدونة الإلكترونية (weblog)، والذي يصف مواقع الإنترنت التي تتضمن منشورات مُرتبة زمنيًا. حيث تتميز المدونات بقدرتها على تسهيل التفاعل مع زوارها عبر نظام التعليقات، كما تحتوي عادةً على روابط خارجية تُشير إلى مقالات في مواقع أخرى تُعرَض في قائمة جانبية بترتيب زمنيّ معكوس. وتُغطي المدونات نطاقًا عريضًا من الاهتمامات تتراوح من المواضيع الشخصية إلى السياسية وقد تستهدف المدوَّنة التركيز على موضوع ضيّق أو التبحّر في مجال واسع يتضمّن العديد من المواضيع. تُركز معظم المدوّنات على مجال معيّن، مثل: تصميم مواقع الإنترنت، أو التوضيب المنزلي، أو الأحداث الرياضية، أو تقنيّات الهواتف الجوالة؛ في حين يكون البعض منها أقل انتقائية، بحيث تعرض روابط إلى مُختلف المصادر الخارجية؛ أمّا بعضها الآخر، فيكون أقرب إلى المفكّرات الشخصية التي تعرض حياة الكاتب اليومية وأفكاره. تميل المدوّنات عمومًا إلى امتلاك عناصر متشابهة بينها تتلخص في النقاط التالية: مساحة رئيسيّة للمحتوى تتضمّن منشورات مُرتبة زمنيًا من الأحدث إلى الأقدم، وعادةً ما تُرتب المقالات ضمن تصنيفات أو أرشيف للمنشورات الأقدم. وجود طريقة تسمح لزوار المدوّنة بترك تعليقات على المقالات. قائمة من الروابط الخارجيّة التي تُشير إلى مواقع أخرى مرتبطة. إحدى ملّفات أو خدمات التلقيم الإخباري، مثل: RSS، أو Atom، أو RDF. وقد تتضمن بعض المدوّنات مزايا إضافية. يمكنك مشاهدة مقطع الفيديو هذا لرؤية شرح مُبسّط عن ماهِيَّة المدونات والهدف منها. من هو المدون المدوِّن هو الشخص الذي يمتلك أو يُدير مدوّنة أو يُشرف عليها. بمعنى آخر هو من ينشر المقالات والمعلومات المستجِدّة وآخر الأخبار والدراسات واستقصاءات الرأي وغيرها من أشكال المحتوى، والتي تُعرف إجمالًا بمنشورات المدوَّنة. محتوى المدونة يُعَدّ المحتوى أساس كلّ موقع إنترنت. فعلى سبيل المثال، تعرض مواقع البيع بالتجزئة أصنافًا من المنتجات، أمّا مواقع الجامعات فتعرض معلومات عن حرمها الجامعي ومنهجها الدراسي وكُلياتها، في حين تعرض المواقع الإخبارية آخر الأحداث والقصص، وفي حالة المدونات الشخصية فقد ترى مقالات عن ملاحظات الكاتب أو مراجعاته. وبدون وجود محتوى محدّث باستمرار على موقع الإنترنت، فلن يتواجد سبب لزيارته لأكثر من مرّة. بالنسبة إلى المدوّنات، فالمحتوى يتكوّن من المقالات التي يُحررها الكاتب أو كتَّاب المدوّنة، إذ تمتلك بعضها أكثر من كاتب، حيث يستخدم كُتَّاب المدوّنات في العادة واجهة ويب مبنيّة ضمن نظام المدوّنة لتحرير مقالاتهم، كما تتيح بعض أنظمة التدوين تلك إمكانيّة استخدام برنامج منفصل يسمح للكُتّاب بتحرير المقالات حتى في ظروف انقطاع الاتصال بشبكة الإنترنت ثم رفع ذلك المحتوى إلى المدوَّنة لاحقًا. التعليقات ألا ترغب في جعل موقعك على الإنترنت مُتفاعلًا؟ ألن تُفضل تمكُّن قرّاء موقعك من ترك تعليقات أو نصائح أو انطباعات عن الموقع أو مقالة معيّنة؟ يمكنك فعل ذلك عند استخدام المدونات، إذ تُعد القدرة على استخدام التعليقات إحدى أفضل المزايا التي تقدّمها. تمتلك معظم المدوّنات طريقةً ما تتيح للزوار ترك تعليقاتهم، كما تمتلك طريقةً تسمح لكتَّاب المدوّنات الأخرى بترك تعليقاتهم بدون زيارة المدوّنة فعليًا عبر استخدام ميزة التعقيبات والتنبيهات، حيث يمكنهم إعلام المدوّنين الأخرين عند الاستشهاد بمقالة من مدوَّنة أخرى في منشوراتهم، ويهدف ذلك إلى إبقاء التواصل الرقمي يسيرًا بين مختلف المواقع ومستخدميها. الفرق بين المدونة وأنظمة إدارة المحتوى تُسمى البرامج التي تتيح إمكانية إدارة موقعك بأنظمة إدارة المحتوى أو CMS، وتُعَدّ بعض برامج التدوين نوعًا مُخصصًا من تلك الأنظمة، إذ تتيح لمستخدميها جميع المزايا اللازمة لإنشاء وإدارة مدوّنتهم ويمكنها جعل عمليّة النشر على الإنترنت بنفس سهولة كتابة مقالة، مع منحها عنوانًا وترتيبها ضمن تصنيف أو أكثر؛ في حين تُقدّم بعض برامج إدارة المحتوى مزايا إضافية متطوّرة، كما توفِّر أدوات التدوين الأساسية واجهةً تُسهّل العمل عليها، وتتولّى توفير الدعم اللوجستي الذي تحتاجه لعرض المحتوى علنًا، ما يعني قدرتك على التركيز أكثر على ما تريد كتابته عبر ترك أداة التدوين تتولّى أمر إدارة موقعك. يُعَدّ ووردبريس أحد أدوات التدوين المتقدّمة التي توفّر مجموعةً غنيّةً من المزايا، إذ يُتيح لك تحديد سلوك موقعك وكيفيّة عرض المحتوى عليه من خلال الخيارات الموجودة في لوحة التحكم، كما يُسهّل ووردبريس من مهمّة إنشاء المقالات ونشرها على الإنترنت مباشرةً بضغطة زرّ، ويبذل ووردبريس جهودًا كبيرةً لجعل مدونتك ونصوصها تظهر منسَّقةَ وأنيقة، كما يحرص على إبقاء صفحات الويب الذي يولِّدها مطابقةً للمعايير القياسية. إذا بدأت بالتدوين للتو فننصحك بقراءة دليل استخدام ووردبريس الذي يحوي معلومات عن كيفية إعداد ووردبريس بسرعة وكفاءة، بالإضافة إلى تفاصيل عن كيفية أداء المهام الأساسية في ووردبريس، مثل: إنشاء مقال، أو تحرير منشور موجود مسبقًا. ما يجب على المدونين معرفته بالإضافة إلى فهم كيفية عمل برنامج التدوين الذي تستخدمه، ستحتاج أيضًا إلى معرفة بعض المصطلحات والمفاهيم المتعلقة بالتدوين. الأرشيف تقدم المدوّنات طريقةَ جيدة لتعقّب المقالات ضمن الموقع، إذ تتيح معظمها إمكانية أرشفة المحتوى بناءً على تاريخ النشر، حيث تعرض الواجهة الأمامية لمعظم المدونات تقويمًا يحتوي على روابط لصفحات أرشيف يوميّة، كما يمكن بناء صفحات الأرشيف على تصنيفات تضمّ مقالات مرتبطة بموضوع معيّن عِوضًا عن تاريخ نشرها، وهناك المزيد مما يمكن للأرشيف تقديمه، إذ يمكنك على سبيل المثال أرشفة مقالاتك وفقًا لاسم الكاتب أو الوسوم المستخدمة أو غيرها، وتُعد قدرة المدونات على ترتيب وعرض المحتوى مُنسّقًا مصدر شعبيّتها كأداة نشر. الملقمات الإخبارية الملقمات الإخبارية هي ميزة لبرامج معيّنة تسمح لقرّائها بالوصول إلى المحتوى الجديد لمواقع الإنترنت تلقائيًا ثم إرسال إشعارات عن ذلك المحتوى إلى موقع إنترنت آخر، حيث تُوفِّر هذه الميزة طريقةً سهلةً للمستخدمين للبقاء مطّلعين على آخر وأهم الأخبار المنشورة على مصادر متنوعة، وتتضمّن بعض الملقمات الإخبارية ملخّصات RSS، أو Atom، أو ملفّات RDF. الخلاصات تُعد الملقمات الإخبارية (feed) أسلوب نشر آلي يُحدّث دوريًا، وتستخدِم معظم المدوّنات إحدى تلك الملقمات الإخبارية، مثل: RSS، أو Atom، أو RDF. كما توجد أدوات تُدعى برامج قراءة الملخّصات مُهمتها هي تفقُّد المدوّنات المُحدّدة بحثًا عن المحتوى الجديد ووقت نشره، حيث تعرض تلك البرامج عناوين المقالات الجديدة وروابط تُؤدّي إلى صفحتها مع مُقتطف لذلك المقال أو المقال كاملًا، ويحتوي كلّ مُلقم على عناصر تُحدّث بمرور الوقت، وعندما يتفقد برنامج قراءة الملخَّصات إحدى الملقمات فهذا يعني بحثه عن العناصر الجديدة، إذ تُرصد تلك العناصر الجديدة وتُنزل تلقائيًا لقراءتها، لذا فلن تحتاج إلى الزيارة المتواصلة لتلك المدوّنات التي تثير اهتمامك، بل كلّ ما عليك فعله هو إضافة روابط الملقمات الإخبارية الخاصة بها وسيُعلمك برنامج قراءة الملخّصات عندما تنشر إحدى تلك المدوَّنات مقالًا جديدًا، وتجدر الإشارة إلى توفير معظم المدوّنات لهذه الملقمات الإخبارية حتى تُسهّل على قُرائها تصفّح المحتوى الذي تنشره. إدارة التعليقات تُعَدّ التعليقات إحدى أهم مميزات أدوات التدوين، إذ تتيح هذه الميزة التفاعلية لمستخدميها إمكانيّة التعليق على مقالات المدوّنة، أو الإشارة إلى مقالاتك والتعليق عليها والتوصية بها، أو ما يُسمى الآن بالتعقيبات والتنبيهات. سنشرح كيفية إدارة التعليقات وكيفية التعامل مع التعليقات المزعجة أو الغير مرغوب فيها على مدوّنتك خلال النقاط التالية. التعقيبات طُوِّرت التعقيبات (TrackBacks) من قِبل فريق SixApart والذين طوّروا أيضًا برمجية MovableType، حيث نشر ذلك الفريق مقدمةً جيدةً عن التعقيبات على مدوّنته نقتبس منها النص التالي: لتسهيل ذلك الإقتباس تخيّل السيناريو التالي: يكتب الشخص الأول شيئًا ما على مدوّنته. يرغب الشخص الثاني في التعليق على مدونة الأول لكنه يُريد رؤية قُرّاءه لما يرغب في قوله مع تمكّنهم من التعليق على مدوّنته الخاصة. ينشر الشخص الثاني مقالًا على مدوّنته ويُرسل تعقيبًا إلى مدوّنة الشخص الأول. يستقبل الشخص الأول ذلك التعقيب ويعرضه في شكل تعليق على المقال الأصلي، بحيث يحتوي هذا التعليق على رابط يُشير إلى مقال الشخص الثاني. تتلخص هذه الفكرة في تقديم المزيد من الأشخاص إلى هذه المحادثة بين الطرفين، إذ يمكن لكلا زوّار المدوّنتين تتبّع الروابط إلى مقال الطرف الآخر، كما تضمن هذه الطريقة درجةً معيّنة من أصالة المحتوى، حيث تنتمي تلك التعقيبات إلى مدوّنة شخص آخر. لكن مع لأسف لا توجد طريقة للتحقق من التعقيبات الواردة إلى المدوَّنة، كما يوجد احتمال في أن تكون مُزيفة. تُرسل معظم التعقيبات جزءًا صغيرًا من المحتوى (يُسمى بالمُقتطف) إلى الشخص الأول يحتوي على ما يريد الشخص الثاني قوله، ويهدف هذا النص إلى العمل مثل تشويق، لجعل الشخص الأول وزوّاره يرون بعض ما يرغب الشخص الثاني في قوله، ويُشجعهم للنقر على الرابط والتوجّه إلى موقع الشخص الثاني لقراءة بقية النص وربما التعليق عليه أيضًا. تُنشر عادةً روابط الشخص الثاني في مدوّنة الشخص الأول ضمن التعليقات، بمعنى قدرة الشخص الأول على تغيير محتوى التعقيب قبل نشره على موقعه، مما يُثير شكوكًا عن أصالته. التنبيهات صُممت التنبيهات (PingBacks) لعلاج بعض المشاكل التي واجهها المستخدمون عند استخدام التعقيبات، فهذا هو السبب الذي جعل توثيق التنبيهات الرسمي يبدو مشابهًا لوصف التعقيبات. على سبيل المثال، كتب علي مقالًا مثيرًا للاهتمام على مدونته ثم قرأه أحمد وعلّق عليه برابط يعود إلى مقال علي الأصلي، لكن عند استخدام التنبيهات سيُرسل برنامج تدوين أحمد إشعارًا إلى برنامج علي يُعلمه بتحصل مقاله على روابط تُشير إليه، مما يُتيح لبرنامج تدوين علي تضمين هذه المعلومة في موقعه. من الأسهل التفكير في التنبيهات على أنها تعليقات عن بُعد كما يشرحها المثال التالي: يكتب الشخص الأول شيئًا ما على مدوّنته. ينشر الشخص الثاني مقالًا على مدوّنته يتضمّن رابطًا يُشير إلى مدوّنة الشخص الأول. هذا بافتراض تفعيل كليهما لميزة التنبيهات على مدوّنتهما. تستقبل مدوّنة الشخص الأول التنبيه ثم تتوجّه تلقائيًا إلى مدوّنة الشخص الثاني للتحقق من مصدر ذلك الرابط. تُعرض التنبيهات عادةً على مدوّنة الشخص الأول في رابط عادي يُشير إلى مقال الشخص الثاني، ويوجد اعتقاد شائع بعدم إرسال تلك الروابط لأي محتوى كما تفعل التعقيبات، لكن ذلك الاعتقاد خاطئ، فإذا حصلت على روابط تتبّع فسترى مُقتطفًا من تلك المدوّنة في قسم تعديل التعليقات بلوحة التحكم في مدونتك، لكن المشكلة هي سماح القليل فقط من القوالب بعرض مُقتطفات التنبيهات، فعلى سبيل المثال، قوالب ووردبريس الافتراضية لا تعرض هذه المقتطفات. في الحقيقة يوجد اختلاف رئيسي بين التعقيبات والتنبيهات، فكلٌّ منهما يستخدم تقنيات اتصال مختلفة تمامًا (XML-RPC وHTTP POST)، ويمتلك هذا الاختلاف أهميةً خاصة بسبب جذب ميزة التعقيبات للكثير من التعليقات المزعجة، بينما يقدّم التحقق التلقائي الخاص بالتنبيهات حدًا أدنى من الموثوقية ممّا يُصعب من مهمة تزييفها. يشعر البعض بأنّ التعقيبات أكثر جدوى بفضل كونها تعرض بعض المحتوى من مدوَّنة الشخص الثاني لزوار مدوّنة الأول مما يمنحهم فكرةً عمّا يُريد الشخص الثاني قوله وما إذا أرادوا قراءة المزيد منه، أمّا البعض الآخر فيشعر بامتلاك التنبيهات للأفضلية، بفضل إنشائها لاتصال آمن بين المقالات. استخدام التنبيهات والتعقيبات عادةً ما تُنتقد التعليقات على المدونات بسبب افتقارها لوزنها الخاص، إذ يمكن لأي شخص كتابة أي شيء تحت أي اسم من اختيارهم، كما لا توجد أي عملية تَحقُّق للتأكد من الهوية التي يدّعونها، وبالمقابل تحاول كلٌّ من التعقيبات والتنبيهات توفير درجة ما من التوثيق عند التعليق على المدوّنات. لتفعيل ميزة التعقيبات والتنبيهات توجّه إلى قسم المناقشة في إعدادات لوحة التحكم وحدّد العناصر التالية، والمتواجدة أسفل قسم الإعدادات الافتراضية للمقالة: محاولة تنبيه المدوَّنات المشار إليها في المقالة. السماح بإشعارات الربط من المدوّنات الأخرى (التنبيهات "PingBacks" والتعقيبات "TrackBacks") في المقالات الجديدة. ويجدر بنا التنبيه إلى أنّ تحديد أحد تلك الخيارات دون الآخر يُعَدّ غير لائق بحق المدوّنات الأخرى. ستظهر التنبيهات والتعقيبات من المدوّنات الأخرى على لوحة التحكم الخاصة بمدونتك على هيئة تعليقات عند تفعيلك للخيارات أعلاه، لكنها ستظهر على صفحات مدوّنتك وفقًا لتصميم القالب المُستخدم، حيث ستُرسل التنبيهات تلقائيًا عند نشرك لمقال جديد ولن تحتاج إلى فعل أي شيء بخصوصها، بينما لإرسال التعقيبات فستحتاج إلى إيجاد رابط التعقيب الخاص بالصفحة التي ستُشير إليها، وإذا لم تستطع العثور عليه فحاول التحقُّق من كون ذلك الموقع يدعم ميزة التنبيهات، فإذا كان الأمر كذلك فلا يجدر بك إرسال تعقيبات بل استعِض عنها بالتنبيهات. انسخ رابط التعقيب إلى الحقل الخاص بإرسال التعقيبات والموجود على صفحة أضف مقالًا جديدًا، وإذا لم تعثر على هذا الحقل فتوجّه إلى تبويب خيارات الشاشة وحدِّد خيار إرسال التعقيبات. لاحظ عدم إرسال هذا الخيار لأي تعقيبات بعد تحديده فهو يعرض الحقل الخاص به فقط، وعند نشرِك لمقال ما فستُرسَل التعقيبات إلى العناوين التي أدرجتها في الحقل المُخصص لها والذي سيعرض أيضًا حالة التعقيبات والتنبيهات على شاشة تحرير المقال. إذا كان هناك شخص يريد إرسال تعقيب عوضًا عن التنبيه إلى مدوّنة ووردبريس الخاصة بك بسبب عدم دعم برنامج التدوين الذي يستخدمه لميزة التنبيهات، فعنوان التعقيب الذي يحتاج إلى إدراجه في الحقل المخصَّص بشاشة تحرير المقال سيكون نفسه رابط مقالك الدائم مع إضافة لاحقة (trackback/) إلى نهاية الرابط؛ أمّا إذا كان برنامج التدوين الذي يستخدمه يدعم ميزة التنبيهات فلن يحتاج لفعل أي شيء إذ تُجرى هذه العملية تلقائيًا. إدارة التعليقات إدارة التعليقات هي ميزة تسمح لمُلّاك مواقع الإنترنت والكُتّاب بمراقبة التعليقات والتحكم بها على مختلف المقالات المنشورة، حيث يمكنها المساعدة في التعامل مع التعليقات المزعجة، فباستخدام هذه الميزة يمكنك إدارة التعليقات وحذف التعليقات غير المرغوب بها والموافقة على بعضها مع إجراء عمليات أخرى عليها. التعليقات المزعجة يُقصد بالتعليقات المزعجة (Spam) التعليقات عديمة الجدوى (أو التعقيبات أو التنبيهات) على مقال في مدوّنة ما، حيث في العادة لا تهتم تلك التعليقات بموضوع المقال ولا تُضيف أيّ قيمة إليه وقد تحتوي تلك التعليقات المزعجة على رابط أو أكثر تُشير إلى موقع آخر، إذ يستخدم بعض الأشخاص التعليقات المزعجة كوسيلة لتحسين ترتيب اسم نطاق موقعهم على صفحات نتائج البحث بهدف بيعها لاحقًا بسعر أعلى، أو بهدف تحسين ترتيب موقع ما على صفحات نتائج البحث، ويتميز مستخدمو التعليقات المزعجة بالمثابرة كون هذه الأنشطة تتضمّن مصدر أموال حقيقي، كما لا يتوقف الأمر عند كتابة تعليقات مزعجة بكثافة، بل قد يستخدمون أدوات أتْمتَة لتسريع نشرهم للتعليقات على موقع إنترنت أو أكثر، مما يُربك العديد من المدوَّنين خاصةً المبتدئين منهم. توجد بعض الحلول لتفادي مشكلة التعليقات المزعجة، كما يتضمّن ووردبريس بعض الأدوات لمكافحتها والتي تتطلّب القليل من الجهد لإدارتها، وبفضل ذلك لم تَعُدْ مشكلة التعليقات المزعجة سببًا لهجر التدوين على الإنترنت. تنسيق الروابط الدائمة الروابط الدائمة (Permalinks) هي عناوين ثابتة تُشير إلى مقالات مدونتك أو تصنيفاتك أو غيرها من صفحات الأرشفة، وهذا الرابط الدائم هو ما سيستخدمه المدوّنون الأخرون عند الإشارة إلى مقالك أو عند مشاركتك لرابط مقالك عبر البريد الإلكتروني أو وسائل التواصل الإجتماعية، فبسبب وجود احتمال للإشارة إلى مقالك من قِبل الآخرين يجب ألّا يتغيّر ذلك الرابط، ولذلك سُميت تلك العناوين بالروابط الدائمة. الفكرة من الروابط الدائمة هي بقاؤها مكشوفة باستمرار للزوار الذين ينقرون عليها، ولذا يجدر بك إنشاؤها لتظهر بصورة ملائمة عوضًا عن الظهور مثل نص من الرموز والكلمات غير المترابطة، فأفضل الروابط الدائمة هي تلك القابلة للتعديل من على شريط العنوان في متصفّحك للانتقال إلى صفحة معيّنة في المدوّنة. على سبيل المثال، يظهر الرابط الدائم الافتراضي لمقال ما في مدوّنة ووردبريس على هذا النحو: /index.php?p=423 كيف يُفترض بالمستخدم معرفة ما تمثله "p"؟ ومن أين أتى الرقم "423"؟ بالمقارنة مع المثال السابق، فهذا هو ما نقصده عندما نتحدّث عن الروابط الدائمة المُنسّقة والتي يمكنها الإشارة لنفس المقال في المقال السابق بمجرّد إعداد بِنيَة الروابط الدائمة: /archives/2003/05/23/my-cheese-sandwich/ وهنا يمكنك بسهولة معرفة أن هذا الرابط يتضمّن تاريخ نشر المقال وعنوانه فقط بالنظر إليه، كما يمكنك أيضًا توقُّع أن تعديل الرابط إلى /archives/2003/05/ سيؤدّي إلى قائمة المقالات المنشورة في شهر مايو من عام 2003. أليس ذلك عمليًا؟ راجع صفحة الروابط الدائمة للحصول على مزيد من المعلومات عن أنماط الروابط الدائمة في ووردبريس. التدوين عبر البريد الإلكتروني تُقدم بعض أدوات التدوين إمكانية إرسال المقالات إلى مدوّنتك عبر البريد الإلكتروني دون الحاجة إلى استخدام واجهة أداة التدوين تلك، ويقدم ووردبريس تلك الميزة أيضًا كما يسمح لك بإرسال محتوى مقالاتك عبر البريد الإلكتروني إلى صندوق بريد محدّد مُسبقًا لتسهيل نشره لاحقًا. الاسم اللطيف إذا كنت تستخدم ميزة الروابط الدائمة فاسم المقال اللطيف (Post Slugs) هو عنوان ذلك المقال المُدرج ضمن الرابط الدائم، وقد تُبسّط أداة التدوين ذلك العنوان أو تختصره إلى بما يتناسب والاستخدام في صورة رابط، فقد تختصر أداة التدوين على سبيل المثال عنوان مقال مثل "I’ll Make A Wish" إلى "ill-make-a-wish"؛ أمّا ووردبريس فهو يُتيح تغيير هذا العنوان المُختصر إلى آخر مثل "make-a-wish"، والذي يبدو مناسبًا أكثر للاستخدام مثل رابط دائم. المقتطف المُقتطفات (Excerpts) هي ملخّصات مختصرة لمقالات مدوّنتك وتمتلك أدوات التدوين طرقًا متعدّدة للتعامل مع هذه المقتطفات. فعلى سبيل المثال، في حالة استخدامك لووردبريس يمكنك كتابة المقتطف وتلخيص المقال بنفسك، أو ببساطة يمكنك توليده تلقائيًا عبر استخدام الفقرات الأولى من المقال أو يمكنك عرض نص من المقال إلى نقطة محدّدة من اختيارك. الإضافات الإضافات هي برمجيات صغيرة تُضيف بعض المزايا إلى مدونتك، وعادةً ما تهدف تلك المزايا إلى تعزيز ما هو موجود مُسبقًا أو إضافة مزايا جديدة إلى موقعك. يوفّر ووردبريس طرقًا سهلة لإضافة تلك البرمجيّات، إذ توجد صفحة مخصّصة للإضافات يمكنك استخدامها للبحث وتثبيت وتفعيل الإضافات من على لوحة التحكم في موقعك. بعض النصائح وأساسيات التدوين يمكن لعملية إنشاء مدوّنة جديدة أن تصبح صعبة، مما يردع الكثير من الأشخاص، وقد يحصل البعض على بداية جيدة ثم يُحبط لاحقًا بسبب قلّة التفاعل مع مدوّنته، لكن إذا كنت ترغب في البروز من بين ملايين المدوّنين وتصبح ضمن مئات آلاف المدوّنات القليلة والتى تحصل على زوّار حقيقين فقد تساعدك النصائح التالية في إتقان التدوّين: دوِّن بانتظام لكن لا تنشر أي مقال إذا لم تمتلك ما يستحق الحديث عنه. التزم بمجال ومواضيع معيّنة عند الكتابة. لا تضع روابط من شاكلة "اشترك" أو "قيّمني" على سائر أرجاء صفحتك الرئيسية حتى تحصل على جمهور مُعجب بمدوّنتك بما يكفي لتجاهل تلك الروابط. استخدام قالبًا بسيطًا وأنيقًا لمدوّنتك بقدر الإمكان. استمتع بالتدوين وعلِّق على مدوّنات الآخرين إذ سيُشجعهم ذلك على مُعاملتك بالمثل. استمتع مجدّدًا بتجربتك في التدوين وتذكر أنّ لا وجود لقواعد تحدّد ما يجب عليك نشره على مدوَّنتك. ترجمة -وبتصرف- للمقال Introduction to Blogging من موقع WordPress.org اقرأ أيضًا كيف تستعين بمصادر خارجية في تدوينك المستقل مع ضمان النزاهة كيف تستغل مدونتك للحصول على المزيد من أعمال الكتابة كمستقل تطوير ووردبريس للمبتدئين تطوير ووردبريس للمبتدئين: برمجة إضافة – الأساسيات والخصائص
  2. سنتناول في هذا الدرس من سلسلة تعلّم برمجة تطبيقات أندرويد باستخدام Xamarin.Forms الجزء الثاني من تطبيق قارئ الخلاصات الخاص بموقع أكاديميّة حسوب. لقد بنينا في الجزء الأوّل تطبيق أساسي أسميناه BasicFeedReader وكانت وظيفته تنحصر في عرض خلاصات قسم مقالات البرمجة. سنطوّر هذه الفكرة من خلال إنشاء تطبيق جديد يعمل على إتاحة الإمكانية للمستخدم بأن يستعرض الخلاصات المتاحة من جميع أقسام الموقع. سيكون ذلك من خلال إضافة صفحة جديدة لعرض أقسام الموقع على شكل مجموعات. لنبدأ فورًا في بناء هذا التطبيق التي سيحتوي على بعض من المكوّنات المتطابقة مع سلفه. بناء تطبيق قارئ الخلاصات المحسّن أنشئ مشروعًا جديدًا من النوع Blank App (Xamarin.Forms Portable) وسمّه EnhancedFeedReader ثم أبق فقط على المشروعين EnhancedFeedReader (Portable) و EnhancedFeedReader.Droid كما وسبق أن فعلنا في هذا الدرس. رغم الشبه الكبير بين هذا التطبيق وسلفه إلًّا أنّني آثرت إعادة إدراج الشيفرة البرمجيّة للأجزاء المتشابهة، وذلك لكي يكون هذا التطبيق متكاملًا قائمًا بحد ذاته. أضف المجلّدين التاليين إلى المشروع EnhancedFeedReader (Portable) (عن طريق النقر بزر الفأرة الأيمن ثم اختيار Add ثم New Folder): Pages و Entities. الأصناف ضمن المجلّد Entities أضف الأصناف التالي إلى المجلّد Entities: FeedItem و Section و GroupSection. بالنسبة للصنف FeedItem فلقد تحدثنا عنه في الجزء الأوّل، وإليك الشيفرة البرمجيّة الخاصّة به: namespace EnhancedFeedReader.Entities { public class FeedItem { public string Link { get; set; } public string Title { get; set; } public string Description { get; set; } public override string ToString() { return Title; } } } الصنف Section هو صنف جديد تمامًا وهو يمثّل قسم من أقسام المحتوى الخاصّة بموقع أكاديميّة حسّوب. الشيفرة البرمجيّة للملف Section.cs هي: using System; using System.Collections.ObjectModel; using System.Linq; using System.Threading.Tasks; using System.Xml.Linq; namespace EnhancedFeedReader.Entities { public class Section { public string Name { get; set; } public string ResourceUrl { get; set; } public async Task<ObservableCollection<FeedItem>> GetFeedItems() { return await Task.Factory.StartNew(() => { XDocument doc = XDocument.Load(ResourceUrl); var feeds = from newsItem in doc.Descendants("item") select new FeedItem { Title = newsItem.Element("title").Value, Description = newsItem.Element("description").Value, Link = newsItem.Element("link").Value }; return new ObservableCollection<FeedItem>(feeds); }); } public override string ToString() { return Name; } } } يحتوي هذا الصنف على خاصيّتين: الاسم Name وعنوان المصدر ResourceUrl الذي سيتم جلب الخلاصات منه. يوجد أيضًا التابع GetFeedItems الذي سيجلب الخلاصات التابعة للقسم الحالي. هذا التابع هو البديل للتابع LoadFeeds الذي كان موجودًا في الصنف SectionFeedsPage وهو يقوم بنفس وظيفته مع ميزة استخدام البرمجة غير المتزامنة. وأخيرًا التابع ToString للحصول على تمثيل نصّي لكائن من النوع Section. أمّا بالنسبة للصنف GroupSection فهو يمثّل تصنيف لمجموعة من الأقسام. في الحقيقة يعمل موقع أكاديميّة حسوب على تقسيم الخلاصات ضمن مجموعات كل منها يحتوي على قسمين. انظر إلى الشيفرة الخاصّ بهذا الصنف: using System.Collections.ObjectModel; namespace EnhancedFeedReader.Entities { public class GroupSection : ObservableCollection<Section> { public string Name { get; set; } } } لاحظ كم هي بسيطة هذه الشيفرة. يحتوي هذا الصنف على خاصيّة واحدة هي خاصيّة الاسم Name له. مع الانتباه إلى أنّه يرث من الصنف العمومي ObservableCollection<Section>. وهذا إشارة إلى أنّه يمثّل مجموعة من الأقسام Section. سنرى سبب عمليّة الوراثة هذه بعد قليل. الواجهات ضمن المجلّد Pages يوجد لدينا ضمن هذا المجلّد ثلاث واجهات تتبع لثلاثة أصناف. صنفان منهما قديمان وهما: SectionFeedsPage و FeedDetailsPage وهما يمثّلان على الترتيب: الواجهة المسؤولة عن عرض خلاصات قسم محدّد من الأقسام المتوفّرة، ومحتوى الخلاصة التي اختارها المستخدم من الواجهة السابقة. أمّا الصنف الثالث فهو SectionsPage وهو يمثّل الواجهة الرئيسيّة الخاصة بعرض جميع الأقسام المتوفّرة ضمن موقع الأكاديميّة. انتقل إلى ملف الرماز SectionFeedsPage.xaml واحرص على أن تكون محتوياته على الشكل التالي: <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="EnhancedFeedReader.Pages.SectionFeedsPage"> <StackLayout> <ListView x:Name="lsvFeeds" ItemTapped="lsvFeeds_ItemTapped"/> </StackLayout> </ContentPage> ثم انتقل إلى ملف الشيفرة الموافق له وهو SectionFeedsPage.xaml.cs واحرص على أن تكون محتوياته على الشكل التالي: using EnhancedFeedReader.Entities; using Xamarin.Forms; namespace EnhancedFeedReader.Pages { public partial class SectionFeedsPage : ContentPage { public SectionFeedsPage(Section section) { InitializeComponent(); Title = section.Name; PopulateFeedsListView(section); } private async void PopulateFeedsListView(Section section) { lsvFeeds.ItemsSource = await section.GetFeedItems(); } private async void lsvFeeds_ItemTapped(object sender, ItemTappedEventArgs e) { FeedItem selectedFeed = (FeedItem)e.Item; FeedDetailsPage feedDetailsPage = new FeedDetailsPage(selectedFeed); await Navigation.PushAsync(feedDetailsPage); } } } الجديد في هذا الصنف هو التابع PopulateFeedsListView الذي يُمرّر إليه وسيط واحد من النوع Section حيث يتم الحصول على خلاصاته ومن ثمّ إسنادها إلى القائمة lsvFeeds لعرضها. لاحظ كيف يتمّ ذلك باستخدام البرمجة غير المتزامنة. انتقل بعد ذلك إلى ملف الرماز FeedDetailsPage.xaml واحرص على أن تكون محتوياته على الشكل التالي: <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="EnhancedFeedReader.Pages.FeedDetailsPage"> <StackLayout Orientation="Vertical"> <WebView x:Name="wvDescription" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"/> </StackLayout> </ContentPage> ثم انتقل إلى ملف الشيفرة البرمجيّة الموافق له وهو FeedDetailsPage.xaml.cs: using Xamarin.Forms; using EnhancedFeedReader.Entities; namespace EnhancedFeedReader.Pages { public partial class FeedDetailsPage : ContentPage { public FeedDetailsPage(FeedItem feedItem) { InitializeComponent(); this.Title = feedItem.Title; var descriptionHtmlSource = new HtmlWebViewSource(); descriptionHtmlSource.Html = @"<html dir='rtl'><body>" + feedItem.Description + "</body></html>"; wvDescription.Source = descriptionHtmlSource; } } } لم يطرأ في الحقيقة أيّ تعديل على هذا الصنف. انتقل أخيرًا إلى ملف الرماز SectionsPage.xaml الذي يمثّل واجهة العرض الأساسيّة، التي ستعرض جميع أقسام الخلاصات المتاحة في الأكاديميّة واحرص على أن تكون محتوياته كما يلي: <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="EnhancedFeedReader.Pages.SectionsPage"> <ListView x:Name="lsvSections" ItemTapped="lsvSections_ItemTapped" IsGroupingEnabled="True" GroupDisplayBinding="{Binding Name}" /> </ContentPage> واضح أنّ محتوياته بسيطة، فهي لا تتعدى عنصر القائمة الذي أسميته lsvSections. الأمر الملفت للنظر هنا هو وجود الخاصيتين IsGroupingEnabled و GroupDisplayBinding لعنصر القائمة. أسندنا القيمة True للخاصيّة IsGroupingEnabled وذلك للإشارة إلى وجوب أن تدعم هذه القائمة ميزة التجميع Grouping. أمّا الخاصيّة GroupDisplayBinding فقد أسندت لها القيمة {Binding Name} للإشارة إلى أنّني أرغب بأن يتم ربطها مع قيمة الخاصيّة Name للكائن GroupSection فهي تُحدّد النص المراد إظهاره كعنوان لكل مجموعة. لكي تتوضّح الأمور بشكل أفضل انظر إلى الواجهة في حالة العمل: انتقل الآن إلى ملف الشيفرة البرمجيّة الموافق وهو SectionsPage.xaml.cs لكي نتعرّف على طريقة الاستفادة من هذه الميزة، واحرص على أن تكون محتوياته على الشكل التالي: using System.Collections.Generic; using System.Collections.ObjectModel; using Xamarin.Forms; using EnhancedFeedReader.Entities; namespace EnhancedFeedReader.Pages { public partial class SectionsPage : ContentPage { public SectionsPage() { InitializeComponent(); Title = "قارئ خلاصات أكاديمية حسوب"; LoadGroupSections(); } private void LoadGroupSections() { int spacePos = 0; string tmp; GroupSection gs = null; Dictionary<string, string[]> groupSectionDic = new Dictionary<string, string[]>() { { "خلاصات ريادة الأعمال",new string[] { "https://academy.hsoub.com/entrepreneurship/?rss=1", "https://academy.hsoub.com/questions/rss/entrepreneurship-5.xml" } }, { "خلاصات العمل الحر",new string[] { "https://academy.hsoub.com/freelance/?rss=1", "https://academy.hsoub.com/questions/rss/freelance-8.xml" } }, { "خلاصات التسويق والمبيعات", new string[] { "https://academy.hsoub.com/marketing/?rss=1", "https://academy.hsoub.com/questions/rss/marketing-7.xml" } }, { "خلاصات البرمجة", new string[] { "https://academy.hsoub.com/programming/?rss=1", "https://academy.hsoub.com/questions/rss/programming-3.xml" } }, { "خلاصات التصميم", new string[] { "https://academy.hsoub.com/design/?rss=1", "https://academy.hsoub.com/questions/rss/design-4.xml" } }, { "خلاصات DevOps",new string[] { "https://academy.hsoub.com/devops/?rss=1", "https://academy.hsoub.com/questions/rss/devops-6.xml" } }, { "خلاصات البرامج والتطبيقات",new string[] { "https://academy.hsoub.com/apps/?rss=1", "https://academy.hsoub.com/questions/rss/apps-9.xml" } }, { "خلاصات الشهادات المتخصصة",new string[] { "https://academy.hsoub.com/certificates/?rss=1", "https://academy.hsoub.com/questions/rss/certificates-10.xml" } } }; ObservableCollection<GroupSection> groupSections = new ObservableCollection<GroupSection>(); foreach (var grp in groupSectionDic) { gs = new GroupSection() { Name = grp.Key }; spacePos = grp.Key.IndexOf(" "); tmp = grp.Key.Substring(spacePos + 1); gs.Add( new Section { Name = "مقالات " + tmp , ResourceUrl = grp.Value[0] } ); gs.Add( new Section { Name = "أسئلة " + tmp, ResourceUrl = grp.Value[1] } ); groupSections.Add(gs); } lsvSections.ItemsSource = groupSections; } private async void lsvSections_ItemTapped(object sender, ItemTappedEventArgs e) { Section selectedSection = (Section)e.Item; SectionFeedsPage sectionFeedsPage = new SectionFeedsPage(selectedSection); await Navigation.PushAsync(sectionFeedsPage); } } } هناك الكثير من المتعة في الشيفرة السابقة! تتمحور معظم الشيفرة حول التابع LoadGroupSections ويُستَخدم لتجهيز الأقسام المختلفة لمصادر الخلاصات في الأكاديمية ووضعها ضمن مجموعات منفصلة ضمن عنصر القائمة lsvSections. هذه الأقسام (كعناوين) موجودة في وضع عدم اتصال وقد نسختها يدويًا من موقع الأكاديميّة، وهي ضمن المتغير groupSectionDic الذي صرحنا عنه من نوع القاموس Dictionary ملف التطبيق App.cs انتقل إلى ملف التطبيق App.cs واحرص على أن تكون بانية الصنف App على الشكل التالي: public App() { // The root page of your application MainPage = new NavigationPage(new SectionsPage()); } احرص على استخدام فضاء الاسم Pages لكي تستطيع الوصول إلى الصفحة SectionsPage كما يلي: using EnhancedFeedReader.Pages; ستضع السطر السابق أوّل الملف App.cs كما هو معلوم. نفّذ البرنامج وتنقّل في أقسامه المختلفة. الخلاصة تناولنا في هذا الدرس الجزء الثاني من تطبيق قارئ الخلاصات الخاص بموقع أكاديميّة حسّوب. لقد أجرينا تحسينات مهمّة على هذا التطبيق من خلال السماح للمستخدم بتصفّح الخلاصات من جميع أقسام الموقع. حيث استخدمنا ميزة التجميع grouping لعنصر القائمة ListView وذلك لتجميع العناوين التابعة لنفس القسم معًا. نكون بذلك قد انتهينا من هذا التطبيق.
  3. التدوين الصوتي هو طريقةٌ رائعةٌ لمشاركة المعلومات وبناء المجتمعات التي تتشارك بالاهتمامات، وهذا الدرس يمثِّل دليلًا لكيفية البدء بالتدوين الصوتي. السبب الرئيسي وراء قدرتي على إعطاء نصائح بالتدوين الصوتي هو أنني أدوِّن صوتيًا لما يقارب ثلاث سنوات. مدونتي الصوتية باسم Sysadministrivia تتضمن كلامًا عن إدارة الأنظمة. ما هو التدوين الصوتي؟ انتشر التدوين الصوتي انتشارًا كبيرًا في مختلف المجالات وأصبح شائعًا جدًا، إذ ينشر بعض الأشخاص تدوينات صوتية لمختلف جوانب حياتهم مثل جلسات الألعاب الإلكترونية التي يلعبونها. يعمل التدوين الصوتي بتسجيلك للصوت (أو الفيديو لأن البرمجيات قد تطورت حديثًا)، واستخدام صيغة بيانات قياسية لتنبيه المستمعين أنَّك نشرت التدوينة الصوتية podcast مباشرةً. صيغة RSS (المسؤولة عن إذاعة خبر نشر التدوينة) ومواصفة XML معينة (وهي صيغة البيانات القياسية) تجعل إنشاء هذه التنبيهات التلقائية أمرًا ممكنًا. كيف أستطيع البدء بالتدوين الصوتي؟ كل ما يلزمك هو حاسوب ونظام تشغيل. فمن البدهي أنَّك تحتاج إلى حاسوب، ولا يهم ما هو نظام تشغيلك، لكنني أنصحك باستخدام لينكس أو نظام من عائلة BSD. برمجيات تسجيل وتحرير الصوت يمكنك استخدام برمجيات متعددة المنصات (أي تعمل على أكثر من نظام تشغيل) لتسجيل الصوت مثل Audacity أو إذا كنتَ تفضِّل تحكمًا أكثر فانظر إلى Ardour. تحتوي صفحة hosts في موقع Sysadministrivia على قائمة بمواصفات العتاد التي نستعملها في التدوين (بما في ذلك الميكروفون والسماعات الرأسية والمعدات الأخرى)؛ لا أنصحك بشراء عتاد معيّن إذ هنالك مختلف أنواع الميكروفونات لتسجيل الكلام. سنحتاج إلى ميكروفون على شكل قلب (cardioid أو supercardioid) إذا كنت ستتحدث بالقرب من الميكروفون ، أو استخدام ميكروفون أحادي الاتجاه (omnidirectional) إذا أردتَ تسجيل ما يدور في غرفة مليئة بالأشخاص باستعمال ميكروفون وحيد، واحرص على أن تكون تلك الميكروفونات ذات مكثّف (condenser) لأنها أفضل لتسجيل الحديث، وسماعات الرأس ضرورية إذا كنت ستدون مع شخص آخر ليس في غرفتك نفسها. لمزيدٍ من المعلومات حول ذلك فأنصحك بقراءة قسم «Uploading» في التدوينة How to run your own podcast. استضافة الموقع ستحتاج إلى استضافة لتضع فيها الملفات الصوتية وملف XML الذي سيذيع خبر نشر التدوينات الجديدة، وموقع إلكتروني (ليس من الضروري امتلاك موقع، لكنني أنصحك بذلك بشدة). يمكنك بشكلٍ بديل أن ترفع الملفات الصوتية (أو الفيديو) إلى خدمة مثل YouTube أو SoundCloud واستخدام ميزة الاشتراك فيها لنشر خبر صدور صدور تدوينة جديدة؛ لكن دون استخدام RSS (أو XML) فهذا يعني أنَّ تدويناتك ليست تدوينات صوتية (podcast) تقنيًا، لأن هذه المواقع تطلب من مستخدميك أن يسجلوا حسابًا فيها، والتدوينات الصوتية يجب أن تسمح للمستمعين أن يبقوا مجهولين تمامًا. صيغة الملفات حسنًا، التدوينات الصوتية ليست «حرة» تمامًا، لاستخدام صيغة MPEG-1/2 Audio Layer III المعروفة باسمها المختصر MP3. هذه الصيغة محمية ببراءة اختراع ولا تتوافق مع مبادئ البرمجيات الحرة؛ لكن يمكن استخدام صيغة بديلة عنها وهي OGG لكنها ستجعل نشرك لها محدودًا، إلا أنَّ بإمكانك توفير تدوينة صوتية podcast و oggcast، وصيغة ملفات XML لهما متشابهة جدًا (لكن مع بعض الاختلافات التي يمكن تعلمها بسهولة). ملفات «التغذية» أفصل عادةً بين مختلف ملفات التغذية (feed files، التي تكون بصيغة XML)، لمختلف الخدمات مثل iTunes و Google Play والتدوينات الصوتية التقليدية (podcasts) و oggcasts. لاحظ أنَّ متصفح Firefox سيحاول تفسير (أو عرض) هذه الملفات باستخدام عميل RSS المضمّن فيه، ولعرض ملفات XML الفعلية فاستخدام الأمر curl أو wget مع الروابط السابقة، أو اعرض مصدر الصفحة في متصفحك. الطريقة السابقة تسمح لي باستخدام وسوم XML خاصة بكل خدمة، وللمزيد من التفاصيل التقنية راجع التدوينة How to run your own podcast. الموقع الإلكتروني أستخدمُ نظام إدارة محتوى باسم Textpattern مع بعض التعديلات، لكن الكثير من المدونين الصوتيين يستعملون ووردبريس مع إضافة PowerPress. كيف أوسِّع من جمهوري؟ الترويج Syndication أسهل طريقة لجلب مستمعين إلى تدويناتك الصوتية هي خدمات الترويج، فيوفر موقع DistroWatch ترويجًا لبعض تدوينات oggcast الصوتية. وأشهر الخدمات للترويج هي iTunes (لمزيدٍ من المعلومات راجع صفحة iTunes Connect Resources and Help page) و Google Play (زر صفحة Podcasts in Google Play Music page)، ويمكن أن تساعدك مواقع وخدمات الترويج الأصغر في زيادة متابعيك، لكن iTunes و Google Play هي أشهرها لسهولة الوصول إليها من مستخدمي iOS و أندرويد. وسائل التواصل الاجتماعي لا تنسَ التواصل المباشر على مواقع التواصل الاجتماعي، فيمكن أن تستعمل تويتر كطريقة أخرى لنشر تدويناتك الصوتية الحديثة، وسيسمح لك بالتواصل مباشرةً مع جمهورك. أمور متفرقة هنالك تقنيات أخرى لإشهار تدويناتك مثل بيع البضائع أو استضافة ضيوف في حلقاتك، والمشاركة في الأحداث المحلية والمنظمات الخيرية، لكن هذه التقنيات ستكون فعالة أكثر بعد أن يكون عندك جمهور. كيف أستفيد ماديًا من التدوين الصوتي؟ عليك أن تبدأ مشوارك في التدوين الصوتي لرغبتك في إنتاج ومشاركة محتوى مع فئة من الناس الذين يتشاركون الاهتمامات، فالإجابة باختصار هي: لن تتمكن من الاستفادة ماديًا (أو ربما تتمكن من ذلك إن كنتَ محظوظًا). لكن التدوين الصوتي في أغلبية الأوقات يكون نابعًا من رغبتك بمشاركة ما تعرفه مع الآخرين (كما في البرمجيات الحرة). ترجمة –وبتصرّف– للمقال A quick-start guide to podcasting لصاحبه Brent Saner
  4. سنتناول في هذا الدرس من سلسلة تعلّم برمجة تطبيقات أندرويد باستخدام Xamarin.Forms تطبيقًا عمليًا آخرًا وهو تطبيق قارئ الخلاصات من موقع أكاديمية حسوب. تندرج مثل هذه التطبيقات تحت النوع rss feed reader ولها مزايا كثيرة ومتنوّعة. سيكون تطبيقنا بسيطًا وعمليًّا ويوضّح مبدأ العمل كما جرت العادة. سننفّذ التطبيق على مرحلتين: المرحلة الأولى سيكون تطبيق لعرض الخلاصات الموجودة ضمن أحد أقسام الموقع، مع إمكانية اختيار أيّ خلاصة وعرض تفاصيل حولها، وهذا هو محتوى هذا الدرس. أمّا المرحلة الثانية فستكون تحسين للتطبيق المنجز في هذا الدرس حيث سنضيف إمكانيّة قراءة الخلاصات من جميع أقسام الموقع مع إضافة بعض التحسينات على أسلوب العرض بشكل عام، وسيكون ذلك في درس منفصل. ماهي الخلاصات؟ خلاصات موقع تكون عادةً عبارة عن مستند XML يحتوي على بيانات تمثّل آخر الأخبار التي يوفّرها الموقع. لا تمتلك جميع المواقع خلاصات بالطبع، ولكنّ من الجيّد دومًا أن يوفّر الموقع مثل هذه الخلاصات في حال كان يمتلك محتوىً متجدّدًا كما هو الحال في موقع أكاديميّة حسوب. بما أنّ الخلاصة تكون ضمن ملف XML فمن البديهي أن تكون البيانات منسّقة بتنسيق XML، أي على شكل عقد آباء وأبناء. انظر مثلًا إلى جزء من خلاصات قسم مقالات البرمجة في أكاديميّة حسوب كما ظهرت لي عند كتابة هذا المقال: لاحظ أنّني أستعرض هذه الخلاصات عن طريق متصفّح Chrome عن طريق الرابط: https://academy.hsoub.com/programming/?rss=1 وهو الرابط الذي توفّره الأكاديميّة للحصول على خلاصات مقالات البرمجة. من الواضح أنّ هذا الأسلوب غير عملي في الحصول على آخر الخلاصات، لذلك يلجأ المستخدمون عادةً إلى تطبيقات متنوّعة لعرض هذه الخلاصات بشكل مريح ومقروء. تطبيق قارئ الخلاصات سنبني في هذا الدرس تطبيق قارئ خلاصات وظيفته قراءة الخلاصات الموجودة في قسم مقالات البرمجة في موقع أكاديميّة حسّوب. وسنعمل في الدرس التالي على تحسين هذا التطبيق بإتاحة الإمكانيّة لتصفّح الخلاصات من جميع الأقسام. أنشئ مشروعًا جديدًا من النوع Blank App (Xamarin.Forms Portable) وسمّه BasicFeedReader ثم أبق فقط على المشروعين BasicFeedReader (Portable) و BasicFeedReader.Droid كما وسبق أن فعلنا في هذا الدرس. الصنف FeedItem من نافذة مستكشف الحل Solution Explorer انقر بزر الفأرة الأيمن على المشروع BasicFeedReader واختر من القائمة التي ستظهر الخيار Add ثم من القائمة الفرعية الخيار New Folder لإضافة مجلّد جديد. سمّ هذا المجلّد بالاسم Entities، وبعد أن يظهر في نافذة الحل Solution Explore انقر عليه بزر الفأرة الأيمن واختر الخيار Add ومن القائمة الفرعية اختر Class. ستظهر نافذة تسمح لك بتعيين اسم لهذا الصنف. اختر الاسم FeedItem له. هذا الصنف هو حجر البناء الأساسي لهذا البرنامج. احرص على جعل محتويات الملف FeedItem.cs كما يلي: namespace BasicFeedReader.Entities { public class FeedItem { public string Link { get; set; } public string Title { get; set; } public string Description { get; set; } public override string ToString() { return Title; } } } الخصائص Link و Title و Description في هذا الصنف تقابل العناصر link و title و description في مستند XML. أمّا التابع ToString فهو للحصول على تمثيل نصّي لأي كائن من النوع FeedItem. الواجهات أضف مجلّدًا جديدًا للمشروع BasicFeedReader كما فعلنا قبل قليل، وسمّه Pages. ثم أضف إليه صفحتي محتوى تعتمدان رماز XAML بحيث يكون اسم الصفحة الأولى هو FeedDetailsPage وهي الواجهة الرئيسيّة، واسم الصفحة الثانية SectionFeedsPage وهي واجهة التفاصيل. الصفحة SectionFeedsPage هي الواجهة التي ستعرض خلاصات قسم مقالات البرمجة في أكاديمّية حسوب. أمّا الواجهة FeedDetailsPage فهي لعرض الخلاصة التي يتم اختيارها من الواجهة SectionFeedsPage. الواجهة SectionFeedsPage انتقل إلى الملف SectionFeedsPage.xaml واحرص على أن تكون محتوياته على الشكل التالي: <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="BasicFeedReader.Pages.SectionFeedsPage"> <StackLayout> <ListView x:Name="lsvFeeds" ItemTapped="lsvFeeds_ItemTapped"/> </StackLayout> </ContentPage> لاحظ كم هو بسيط هذا الرماز، فهو لا يحتوي سوى عنصر قائمة lsvFeeds لعرض خلاصات قسم مقالات البرمجة، حيث سنربط الحدث ItemTapped الخاص بها بالمعالج lsvFeeds_ItemTapped. انتقل الآن إلى ملف الشيفرة البرمجيّة الموافق SectionFeedsPage.xaml.cs واحرص على أن تكون محتوياته على الشكل التالي: using BasicFeedReader.Entities; using System.Linq; using System.Xml.Linq; using Xamarin.Forms; namespace BasicFeedReader.Pages { public partial class SectionFeedsPage : ContentPage { public SectionFeedsPage() { InitializeComponent(); LoadFeeds("https://academy.hsoub.com/programming/?rss=1"); Title = "مقالات البرمجة"; } private async void lsvFeeds_ItemTapped(object sender, ItemTappedEventArgs e) { FeedItem selectedFeed = (FeedItem)e.Item; FeedDetailsPage feedDetailsPage = new FeedDetailsPage(selectedFeed); await Navigation.PushAsync(feedDetailsPage); } private void LoadFeeds(string resource) { XDocument doc = XDocument.Load(resource); var feeds = from newsItem in doc.Descendants("item") select new FeedItem { Title = newsItem.Element("title").Value, Description = newsItem.Element("description").Value, Link = newsItem.Element("link").Value }; lsvFeeds.ItemsSource = feeds; } } } عند يتم إنشاء كائن من هذه الصفحة لعرضها للمستخدم، يتم تنفيذ بانيتها. حيث يعمل التطبيق على استدعاء التابع LoadFeeds والذي يتطلّب وسيطًا واحدًا من النوع string ويمثّل عنوان المصدر المزوّد للخلاصات. في الحقيقة ما فعلناه هنا هو أمر غير جيّد من الناحية العمليّة، فلا ينبغي وضع مثل هذا الاستدعاء هنا في البانية، سيما وأنّ التابع LoadFeeds لا يستخدم تقنية البرمجة غير المتزامنة، مما سيسبب جمودًا مزعجًا في التطبيق عند أوّل تشغيله. سنحل هذه المشكلة لاحقًا في الجزء الثاني. انظر الآن إلى تعريف التابع LoadFeeds من الشيفرة السابقة. ستلاحظ أنّه يستخدم تقنيّة ممتازة يوفرها إطار العمل .NET من خلال الصنف XDocument الذي يمثّل مستند XML بشكل كائني، حيث يعمل السطر الأوّل من هذا التابع على إنشاء كائن جديد من الصنف XDocument من خلال تحميل مستند XML مباشرةً من الانترنت عن طريق التابع الساكن Load. بعد ذلك يتم إعراب مستند XML المحمّل من الإنترنت بسرعة وفعاليّة عاليتين. حيث تحتاج إلى عدد قليل من الأسطر البرمجيّة على شكل استعلام LINQ to XML لكي تقوم بالمطلوب. لقد اطلعنا على تقنيّة شبيهة في درس سابق حيث استخدمنا LINQ to Objects. يمكنك معرفة المزيد حول هذا الموضوع بقراءة هذا المقال. بعد استخلاص المعلومات من مستند XML المُحمّل، وإنشاء كائن من النوع FeedItem لكل خلاصة موجودة في هذا المستند، يتم إسناد المجموعة المنشأة من هذه الكائنات إلى الخاصيّة ItemsSource من القائمة lsvFeeds ليتم عرضها للمستخدم. أمّا بالنسبة لمعالج الحدث lsvFeeds_ItemTapped من الشيفرة السابقة. فوظيفته بسيطة، وهي تنحصر في الحصول على كائن FeedsItem الموجود ضمن العنصر الذي تمّ نقره (لمسه) ضمن القائمة lsvFeeds ومن ثمّ الانتقال إلى الصفحة FeedDetailsPage لعرض محتوى هذه الخلاصة. الواجهة FeedDetailsPage انتقل إلى الملف FeedDetailsPage.xaml واحرص على أن تكون محتوياته على الشكل التالي: <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="BasicFeedReader.Pages.FeedDetailsPage"> <StackLayout Orientation="Vertical"> <WebView x:Name="wvDescription" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"/> </StackLayout> </ContentPage> لاحظ مرّة أخرى كم هو بسيط هذا الرماز. حيث يقتصر على استخدام عنصر واحد، هو العنصر WebView ويُستخدم لعرض محتوى مستند HTML. وسبب استخدامي لهذا العنصر، هو أنّ الخلاصات التي ترد من موقع أكاديميّة حسّوب تحتوي على المحتوى كاملًا وهو منسّق بتنسيق HTML. وهذا أمر لا تجده في كثير من مزوّدات خدمة الخلاصات. لذلك فوجدت أنّ أفضل طريقة هو عرض هذا المحتوى مباشرةً ضمن عنصر WebView. انتقل الآن إلى ملف الشيفرة البرمجيّة الموافق FeedDetailsPage.xaml.cs واحرص على أن يكون كما في الشكل التالي: using Xamarin.Forms; using BasicFeedReader.Entities; namespace BasicFeedReader.Pages { public partial class FeedDetailsPage : ContentPage { public FeedDetailsPage(FeedItem feedItem) { InitializeComponent(); this.Title = feedItem.Title; var descriptionHtmlSource = new HtmlWebViewSource(); descriptionHtmlSource.Html = @"<html dir='rtl'><body>" + feedItem.Description + "</body></html>"; wvDescription.Source = descriptionHtmlSource; } } } كل الشيفرة البرمجيّة موجودة ضمن البانية التي تتطلّب وسيطًا واحدًا من النوع FeedItem الذي يحتوي على بيانات الخلاصة المراد عرض تفاصيلها. نعمل على وضع عنوان هذه الصفحة ليكون مطابقًا لعنوان الخلاصة، ثمّ ننشئ كائنًا من النوع HtmlWebViewSource نسنده ضمن المتغيّر descriptionHtmlSource الذي سيمثّل الكائن المحتوى للعنصر wvDescription (عنصر WebView الذي صرّحنا ضمن ملف الرماز). لاحظ كيف أسندنا للخاصيّة Html لهذا المتغيّر محتوى الخاصيّة Description لكائن الخلاصة، وهو كما أشرنا قبل قليل عبارة عن مستند HTML ينقصه فقط الوسمين و اللذان أضفناهما يدويًّا. ثمّ نُسند المتغيّر descriptionHtmlSource بدوره إلى الخاصيّة Source للعنصر wvDescription مما يؤدّي إلى ظهور مستند HTML كما هو مخطّط له. ملف التطبيق App.cs انتقل إلى ملف التطبيق App.cs واحرص على أن تكون بانية الصنف App على الشكل التالي: public App() { // The root page of your application MainPage = MainPage = new NavigationPage(new SectionFeedsPage()); } احرص على استخدام فضاء الاسم Pages لكي تستطيع الوصول إلى الصفحة SectionFeedsPage كما يلي: using BasicFeedReader.Pages; ستضع السطر السابق أوّل الملف App.cs كما هو معلوم. نفّذ البرنامج، ستحصل على شكل شبيه بما يلي: وهي الواجهة التي تحتوي على الخلاصات الموجودة ضمن قسم مقالات البرمجة. جرّب اختيار أحد هذه الخلاصات لتحصل على شكل شبيه بما يلي: لاحظ كيف تظهر الخلاصة كما لو أنّه يتم عرضها ضمن متصفّح الويب العادي. جرّب سحب الصفحة إلى الأسفل ليؤكّد ذلك هذه الملاحظة. الخلاصة تناولنا في هذا الدرس الجزء الأوّل من تطبيق قارئ الخلاصات الخاص بموقع أكاديميّة حسّوب. حيث نفّذنا بعض المهام الأساسيّة، والتي سنبني عليها في الجزء الثاني الذي سيتناول تطبيقًا محسّنًا لهذا التطبيق. حيث سنعمل على دعم عرض جميع الأقسام المتاحة في الأكاديميّة وليس قسم مقالات البرمجة فحسب.
  5. أفضل طريقة للتعلق ببرنامج ما وتعلّم العمل عليه هو الانغماس في مشروع على هذا البرنامج. هذا الدرس يغطي الخطوات البسيطة لتصميم رمز أيقونة RSS مع مختلف التقنيات اليدوية التي ستساعد المبتدئين على تطوير مهاراتهم للعمل على هذا البرنامج مستقبلًا. إن برنامج أدوبي إليستريتور هو برنامج تصميم رسومات فكتور، لذلك لا يهم حجم الأيقونة التي سنصمّمها لأننا نستطيع تكبيرها وتصغيرها بدون التأثير على دقّة الرسم. على عكس فوتوشوب حيث أن جميع الخطوط والأشكال ذات هيكل هش وكذلك الألوان وذلك لأنها مصنوعة من الحسابات الرياضية النقطيّة بدلًا من الاعتماد على تصميم البيكسل الأساسي. افتح برنامج إليستريتور وأنشئ ملفًّا جديدًا. انقر مُطوّلًا على أداة المستطيل لتظهر قائمة أدوات الأشكال واختر أداة المستطيل مستدير الزوايا Rounded Rectangle. ارسم الشكل على لوح الرسم مع الضغط على مفتاح Shift وذلك لرسم مربع ويمكنك الضغط على مفاتيح الأسهم على لوحة المفاتيح لزيادة أو تخفيف استدارة الزوايا للمربع. هناك اختلاف آخر بين إليستريتور وفوتوشوب في أسفل شريط الأدوات حيث أن مربعي الألوان في فوتوشوب يدلّان على لوني المقدمة والخلفية بينما في إليستريتور المربعان يمثّلان لون العنصر والثاني لون الحدود. قم بإزالة لون الحدود ثم اضغط على مربع لون العنصر واذهب إلى لوحة التدرجات اللونية وأضف تدرجًا لونيًّا من البرتقالي الداكن إلى البرتقالي الفاتح عموديًّا عبر الشكل. حدّد الشكل المرسوم ثم اذهب إلى القائمة: Object > Path > Offset Path أدخل القيمة 1mm- في الخيارات. انقر على زاوية الشكل الجديد ودوّره بزاوية 180 درجة لتصبح جهة التدرج اللوني معكوسة. اختر أداة الدائرة وارسم دائرة في مكان ما على لوح الرسم. أزِل لون العنصر الداخلي وأبقِ على لون الحدود الأسود ثم اجعل سماكة هذه الحدود 16pt من لوحة الحدود. استخدم أداة التحديد المباشر Direct Selection Tool (السهم ذو الرأس الأبيض) وحدّد النقطتين السفلية واليسرى من الدائرة. انقر على مفتاح Delete في لوحة المفاتيح لمسح هاتين النقطتين ويبقى من الدائرة فقط ربع دائرة. انسخ هذا الربع بالاختصار CMD+C ثم ألصقه في المقدمة بالاختصار CMD+F. صغّر حجم النسخة الجديدة مع الضغط على مفتاح Shift للمحافظة على نسبة الأبعاد. عدّل حجم حدود الشكل الأصغر ليكون 16pt كما الشكل الأصلي. اضغط على الاختصار CMD+R لإظهار المسطرة ثم اسحب زوجين من الأدلّة لتحاذي أطراف أرباع الدائرة. استخدم التقاطع بين الأدلة كأساس لرسم دائرة صغيرة بحيث ننتهي من تصميم رمز RSS. حدّد ربعي الدائرة وذلك لتحويلهما من مجرد حدود إلى أشكال جامدة عبر الذهاب إلى القائمة: Object > Expand واختيار خيار الحدود Stroke فقط. حدّد أشكال الرمز الثلاثة ثم أضِف تدرّجًا لونيًّا من الرمادي إلى الأبيض عموديًّا وأضِف حدودًا لهذه الأشكال بلون رمادي وبقيمة 1pt. اضغط على الاختصار CMD-G لجمع هذه الأشكال الثلاثة في مجموعة واحدة، ثم عدّل الحجم بشكل مناسب لوضعها ضمن المربع البرتقالي. حدّد المربع البرتقالي الداخلي ثم اضغط CMD+C لنسخه وألصقه في المقدمة عبر CMD+F ثم لوّنه باللون الأبيض. ملاحظة أخرى حول الاختلاف بين فوتوشوب وإليستريتور هو أن في إليستريتور يمكن وضع عدد كبير من العناصر في طبقة واحدة مرتبة فوق بعضها البعض ويمكن التحكم بكل عنصر على حدة إذا ما أردنا بينما لا يمكن القيام بذلك في فوتوشوب. ارسم شكلًا بيضويًّا كبيرًا مسطّحًا يغطي الجزء العلوي من المربع. حدّد هذا الشكل مع المربع الأبيض الذي رسمناه للتو واختر Intersect من لوحة Pathfinder. خفّف التعتيم Opacity للشكل الجديد الناتج عن العملية السابقة إلى نحو 15% ليبدو كلمعان أعلى شكل المربع. أنهِ هذا التصميم عبر رسم دائرين صغيرتين متفاوتتين بالحجم في زاوية المربع لتبدو مثل انعكاس إضاءة. استخدم نسبة التعتيم 15% مجدّدًا للحصول على مظهر متناسب. ها قد حصلنا على رمز فكتور RSS بسيط وأنيق في عدد من الخطوات البسيطة ولكنها تغطي مجموعة مهمة من أدوات إليستريتور الهامة. ترجمة -وبتصرّف- للمقال: Beginner Illustrator Tutorial – Create a Vector RSS Icon لصاحبه: Chris Spooner.
×
×
  • أضف...