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

جميل بيلوني

الأعضاء
  • المساهمات

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

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    15

كل منشورات العضو جميل بيلوني

  1. أهلًا @سرمد خالد استعملنا الترجمة «مغلف» ترجمة للمصطلح الأجنبي closure لأنه الفعل غلَّف أقرب ما يصف معنى العملية. إن لاحظة من المثال، تجد أن الدالة wrapValue هي دالة مغلفة للدالة السهمية التي تعيدها وليست دالة مرفقة، ففعل الإرفاق يعني المصاحبة والمصادقة وهو خلاف ما نريد، نريد معنى يصف الإحاطة وليس المصاحبة والإحاطة هي أن يحيط شيء شيئًا ما ويحتويه وهو برأيي أدق وصف يمكن أن نصف فيه المصطلح. أرجو أن تكون الصورة قد اتضحت وأخبرني إن كان لدي أي استفسار أو شيء غامض بعد : )
  2. أهلًا واثق، شكرًا على الملاحظة، جرى تصحيح الاسم. نشكرك جزيل الشكر،
  3. أجل عزيزي، ننصحك بمتابعة السلسلة من البداية وذلك بالضغط على وسم «جافاسكربت في المتصفح» أو بمتابعة قسم المقالات الذي يتحدث عن الأحداث Events والذي يبدأ بمقال «مدخل إلى أحداث المتصفح وكيفية التعامل معها عبر جافاسكربت».
  4. وعليكم السلام، أهلًا @عبدالله غازي يمكنك قراءة سلسلة تطوير الويب بشقيه الواجهات الأمامية والخلفية بالضغط على الوسم full_stack_101 بجانب اسم المقال والذي يعرض لك كل مقالات هذه السلسلة، والمقالات الناتجة مرتبة تصاعديًا أي أول مقال هو آخر مقال منشور (مرتبة وفق تاريخ نشرها)، ويمكنك البدء من آخر مقال لقراءة السلسلة بالترتيب. السلسلة هذه تبدأ بشرح كيفية تطوير الواجهات الأمامية بريآكت أولًا ثم تشرح تطوير واجهات الويب الخلفية عبر Node.js بدءًا من مقال «مدخل إلى Node.js وExpress» وما بعده (تجد المقالات مرتبة ضمن صفحة الوسم full_stack_101). تحياتي،
  5. أهلًا @عبدالله محمد24 يتحدث المقال عن أنواع الاستضافات ويمكن أخذ الفكرة العامة وبعدها البحث عن أفضل شركة تناسب النوع الذي اخترته لاستضافة موقعك. نشرنا منذ وقت قصير مقال آخر يتحدث عن الاستضافات تجده بالرابط التالي: اطلع أيضًا على المقال التالي ففيه مراجعة غير متحيزة لأنواع الاستضافات وأفضل شركات الاستضافات نهاية 2019: أرجو أن تجد ضالتك فيها. بالتوفيق!
  6. هنالك قسم كامل في الأكاديمية حول puppet يمكنك الإطلاع عليه: https://academy.hsoub.com/devops/deployment/puppet قد تفيدك أيضًا هذه المقالة. بالتوفيق،
  7. وعليكم السلام ورحمة الله، أهلًا محمد أجل لا مشكلة، وذلك بما يتوافق مع رخصة المقال. شكرًا لك،
  8. شكرًا جزيلًا لك، جرى التصحيح. أشجعك على هذا الاهتمام والحرص على التبليغ عن الأخطاء، فلا تكمل المقالات إلا بقرَّائها.
  9. صدقت، جرى التصحيح. كان المثال مكتوبًا بتلك الصورة في المقال الأصلي، ربما لم ينتبه الكاتب لهذا الخطأ وسأحاول تبليغه لتصحيحه في المقال الأصلي أيضًا. شكرًا جزيلًا لك لانتباهك لهذه التفاصيل. @Mhamad
  10. PostgreSQL – تُعرَف أيضا بـ Postgres – هي نظام مفتوح المصدر لإدارة قواعد البيانات. تُستخدم لتخزين البيانات مهما كان حجمها، وتتميز بكفائتها وأدائها العالي وغناها بالميزات والوظائف. تُعد PostgreSQL أفضل أنظمة قواعد البيانات مفتوحة المصدر وأكثرها شعبية على مستوى العالم. هل تريد أن تتعلم PostgreSQL ولكن لا تعرف من أين تبدأ؟ لقد جئت إلى المكان الصحيح. هذا المرجع هو دليلك الشامل إلى تعلم PostgreSQL، إذ يستعرض عددًا كبيرا من الدروس العربية الممتازة التي ستتعلم فيها أساسيات PostgreSQL، علاوة على الكثير من الدروس التطبيقية المتقدمة. تاريخ PostgreSQL ظهرت PostgreSQL سنة 1982، وكانت نتيجة لمشروع Ingres في جامعة كاليفورنيا. ثمّ قرر قائد فريق العمل في مشروع Ingres إنشاء نسخة تجارية منها، وبدأ مشروع post-Ingres (أي ما بعد Ingres)، لهذا هناك من يسميها Postgres. انكبّ العاملون في مشروع post-Ingres على تطويرها وإضافة الكثير من المزايا المهمة إليها. وقد خرج الإصدار الأول منها سنة 1989، ثم توالت الإصدارات وتزايدت شعبيتها وعدد مستخدميها باطراد. عرفت سنة 1994 حدثا مهما لمستخدمي Postgres، وهو أنّها أصبحت تُوزَّع وفق رخصة MIT الحرة والمجانية، وهذا أدى إلى إقبال المزيد من المطورين للمساهمة في تطوير Postgres والتعديل عليها بحرِّية. أعيدت تسمية Postgres سنة 1996 ليصبح PostgreSQL للدلالة على دعمها للغة الاستعلامات البنيوية SQL. فيما تُستخدَم PostgreSQL؟ تُستخدم PostgreSQL في العديد من المجالات، سواء في القطاع الأكاديمي أو التجاري. يبين المبيان التالي أكبر عشر مجالات تُستخدم فيها PostgreSQL: مصدر الصورة يوضح المبيان تنوع استخدامات PostgreSQL في مختلف القطاعات، خصوصا في مجالي البرمجيات وتقنيات المعلومات، علاوة على القطاعات الصحية والمالية والتعليم والتسويق. وهذا ناتج عن طبيعة PostgreSQL، فهي مفتوحة المصدر، ما يجعلها مرنة وقابلة للتطوير والتوسيع والتخصيص. إضافة إلى ذلك فهي آمنة وموثوقة تضاهي أنظمة قواعد البيانات المدفوعة، ما يجعلها مثالية للشركات والمشاريع في مختلف المجالات. يُقدّر عدد الشركات التي تستخدم PostgreSQL بحوالي 48500 شركة [1]. ومن أشهر هذه الشركات Apple وDebian و Sun Microsystem و Skype وغيرها. لماذا PostgreSQL؟ توفر PostgreSQL العديد من الميزات المهمة والمفيدة التي تجعلها خيارًا مثاليا للمطورين وأصحاب المشاريع. وهذه بعضها: مفتوحة المصدر ومجانية: هذا يعنى أنّه يمكنك استخدامها بدون أيّ تكاليف أو رسوم، كما يمكنك التعديل عليها بحرّية. قابلة للتخصيص: أحد مزايا البرامج مفتوحة المصدر أنّها تعطيك حرية كبيرة وتحكمًا عميقًا في البرامج. و PostgreSQL ليست استثناء، إذ تتمتع بمرونة كبيرة، فهي تتيح مثلًا تعريف أنواع بيانات جديدة وتعريف دوال مُخصّصة. كما أنّها متكاملة مع العديد من لغات البرمجة الأخرى. تعدد أنواع البيانات: تدعم PostgreSQL الكثير من أنواع البيانات، سواء العددية أو النصية أو المنطقية. علاوة على البيانات المركبة، مثل المصفوفات والمجالات والتواريخ والبيانات الهندسية و تنسيقات الملفات، بما فيها JSON و XML و CSV. التوافق مع مواصفات SQL: تتوافق PostgreSQL مع معظم مواصفات SQL، إلا أنّها لا تلتزم بها حرفيا، فمطورو PostgreSQL يخالفون أحيانا مواصفات SQL إن كانت تتعارض مع الميزات التقليدية التي تتيحها PostgreSQL، أو إن وجدوا حلولًا أفضل. دعم جميع اللغات: تدعم PostgreSQL جميع اللغات العالمية، بما فيها اللغة العربية. متعدد المنصات: PostgreSQL متعددة المنصات، ويمكن أن تستخدمها على جميع أنظمة التشغيل المشهورة، بما فيها نظام ويندوز ويونيكس وماك و Solaris و BSD. البحث والتنقيب: تدعم PostgreSQL تشكيلة كبيرة من التعابير النمطية (regex)، ما يجعلها مثالية للبحث والتنقيب في البيانات وتحليلها. الشعبية: PostgreSQL هي أكثر قواعد البيانات مفتوحة المصدر شعبية على صعيد العالم، والثانية من بين جميع أنظمة قواعد البيانات كما يشير آخر استطلاع لموقع stackoverflow: أكثر قواعد البيانات شعبية على صعيد العالم. محبوبة من المطورين: في الاستطلاع نفسه، حلت PostgreSQL في المرتبة الثانية في قائمة أحب أنظمة قواعد البيانات إلى المطورين. أكثر قواعد البيانات المحبوبة دعم أطر العمل: تدعم PostgreSQL أكثر من 80 إطار عمل، لذا لن تضطر على الأرجح لتعلم إطار عمل جديد، فمهما كان إطار العمل الذي تعمل به، فعلى الغالب أنّها تدعمه. التزامن: نظام PostgreSQL متزامن، إذ أنّه يمنح لكل عملية نسخة أو عينة من قاعدة البيانات، وهذا يتيح القيام بعدة عمليات على قاعدة البيانات دون أن تتداخل فيما بينها. هل تريد أن تتعلم PostgreSQL بسرعة وسهولة لاستخدامها في تطبيقاتك وبرامجك؟ سوف نستعرض فيما بقي من هذا الدليل مجموعة متنوعة من المقالات والدروس العربية المتكاملة التي تجمع بين الجانبين النظري والعملي. @media screen and (min-width: 650px) { .response_image { width: 33%; display: inline-block; vertical-align: top; margin-top: 0px; } .response_descrip { width: 64%; display: inline-block; margin-right: 10px; vertical-align: top; margin-top: 0px; } } سلسلة "دليل postgreSQL العملي" لا يخفى على أحد أنّ هناك ضعفا في المكتبة العربية في كل المجالات العلمية والتقنية. خصوصا في مجال البرمجة والتطوير، فهي مجالات متغيرة باستمرار، فسنة واحدة في مجال البرمجة كمثل عشر سنوات في المجالات الأخرى، ففي كل عام تظهر تقنيات وإصدارات جديدة. لأجل هذا أطلقت أكاديمية حسوب مشروعًا طموحا لتوفير العديد من المواد التعليمية الممتازة في مختلف المجالات التقنية، سواء مقالات أو دروسًا أو كتبًا. من ثمار هذا المشروع إعداد أحد أفضل المواد التعليمية العملية المتاحة لتعليم PostgreSQL، المبني على سلسلة مقالات Postgres Guide. يأخذ هذا الدليل بيدك في أمثلة عملية ومتنوعة تغطي أساسيات SQL وأساسيات إدارة قواعد بيانات PostgreSQL، وتمر على مزايا مهمة في PostgreSQL تزيد من فاعلية الاستعلامات ووضوح عبارتها، ويصل هذا الدليل إلى مواضيع متقدمة في إدارة قواعد البيانات كالنسخ الاحتياطي وتتبع استخدام الذاكرة، وبذلك يتميز بأنه مناسب للمبتدئ والمتوسط ويضع قدمك على سكة المستوى المتقدم في قواعد بيانات PostgreSQL. فما يميزه عن غيره، فهو أننا اتبعنا في بداية العمل على هذا الدليل قاعدة باريتو 80/20، حيث حرصنا على تغطية 20% من مواضيع Postgres التي تُستخدَم في 80% من الحالات في الواقع والمجال العملي، إذ حاولنا الابتعاد عن التفاصيل غير العملية أو قليلة الاستخدام، أي أن هذا الدليل لا يتطرق إلى شرح أو استخدام الأدوات المتقدمة والتي قد يندر استخدام بعضها (مذكورة في هذا القسم من التوثيق) ولا يتطرق أيضًا إلى كيفية تطوير Postgres بكتابة شيفرات برمجية خاصة (مذكورة في هذا القسم من التوثيق)، فلم نرد تعليمك شيئًا لن تستخدمه إلا في حالات قليلة (تكون قد نسيتها إلى حين استعمالها 😉 ). وفقًا لذلك، حاولنا جاهدين أن يكون هذا الدليل دليلًا عمليًا ومرجعًا سريعًا للمبرمج، يتعرف فيه على الجزء الأكثر أهمية مما قد يجهله عن قواعد بيانات Postgres ويختبر فيه في ذات الوقت معرفته بالمزايا المتنوعة لقواعد البيانات تلك. باختصار، صُمم ليكون رحلة ممتعة فعالة مليئة بالأمثلة المفيدة الواضحة في قواعد بيانات Postgres. يغطي هذا الدليل ما يلي: لمحة عن الأسس النظرية لقواعد البيانات تغطية فعالة لأساسيات استخدام لغة SQL عمليًّا تغطية شاملة لما تتميز به Postgres عن SQL الصرفة (أي لغة قواعد البيانات العامة) أساسيات إدارة قواعد بيانات Postgres (إدارة الذاكرة، الأداء، النسخ الاحتياطي وغيرها) أهم التعليمات اللازم معرفتها في صَدَفة psql (واجهة سطر الأوامر الخاصة بPostgres) في حال أردت أولًا التعمق في SQL، فننصحك بالبدء بسلسلة «المرجع المتقدم إلى لغة SQL» أولًا فمعلوم أن لغة SQL هي اللغة الأم لقواعد بيانات SQL (ومنها Postgres)، فلن تجد هذا الدليل يتعمق كثيرًا في تعليمات SQL لأننا شرحناها بالتفصيل مسبقًا في تلك السلسلة. ننصحك بعد الانتهاء من هذا الدليل الانتقال إلى كتاب «بوستجريسكل كتاب الوصفات» إن أردت التوسع أكثر في PostgreSQL، فتلك خارطة الطريق التي ننصحك بها لتعلم لغة SQL وقواعد بيانات PostgreSQL من الأساسيات وحتى الاحتراف. سوف نستعرض سلسلة مقالات هذا الدليل، وإن كنت تريد تحميله جملة واحدة على هيئة كتب رقمي، فيمكنك ذلك من هنا. 1. نظرة عامة على Postgres وتاريخها تستعرض هذه المقالة مجموعة من المعارف التاريخية عن Postgres، وعن قواعد البيانات عموما منذ بداية ظهورها وحتى يومنا هذا. مع استعراض بعض مميزات Postgres وخصائصها ونماذج عملها. 2. تثبيت Postgres والتعرف على أساسيات إدارتها لقواعد البيانات يقدم هذا المقال دليلًا شاملًا لأهم جوانب قواعد بيانات Postgres بدءًا من تنزيل التطبيقات اللازمة لإدارة قواعد البيانات وتثبيتها، وانتهاءً ببعض الجوانب المتقدمة في معالجة الجداول مرورًا بمعظم العمليات الأساسية لمعالجة البيانات ضمن قاعدة البيانات. 3. أساسيات استخدام صَدَفة psql صدفة psql هي برنامج الواجهة التفاعلية للاتصال بـ Postgres، سوف نستعرض في هذه المقالة بعض أهم الأوامر المٌستخدمة في صدفة psql لاستعراض قواعد البيانات والجداول والمستخدمين وخصائصهم وتحرير الاستعلامات في محرر النصوص وغيرها. 4. استخدام أساسيات SQL في Postgres تشرح هذه المقالة كيفية إنشاء وتعديل وحذف الجداول، كما تشرح كيفية إدخال البيانات فيها ثم الاستعلام عنها مع ترشيحها والاستفادة من العديد من الأوامر للحصول على المخرجات المطلوبة، وتتطرق إلى عمليات التجميع وتعرض بالأمثلة الواضحة طرق ربط الجداول للحصول على النتائج من مصادر متعددة. 5. مزايا متقدمة في Postgres تستعرض هذه المقالة العرض View وتعابير الجداول الشائعة CTE التي تساهم في تحسين طريقة كتابة الاستعلامات، وذلك بجعلها أقصر وأسهل قراءةً، وتبين كيفية استخدام دوال النوافذ Window Functions التي تسمح بإجراء عمليات تجميعية على مجموعة جزئية من الأسطر، وتتطرق إلى الفهارس وأهميتها في تسريع البحث ضمن البيانات. 6. أنواع بيانات خاصة في قواعد بيانات Postgres تتحدث هذه المقالة عن عدة أنواع بيانات تتميز بها Postgres، وهي المصفوفات Arrays والنوع Hstore والنوع JSONB، كما تتطرق إلى الأنواع التعدادية ENUM لتحديد قيم مخصصة في أعمدة الجداول. 7. إدارة النسخ الاحتياطي في قواعد بيانات Postgres تتحدث هذه المقالة عن كيفية أخذ نسخة احتياطية من قاعدة البيانات، ثم استعادتها. كما تشرح الأمر ‎\copy‎ وكيفية استخدامه لتحديد نمط البيانات في النسخة الاحتياطية. 8. أساسيات إدارة الذاكرة في قواعد بيانات Postgres تشرح هذه المقالة كيفية تتبع استخدام الذاكرة في قاعدة البيانات، لمعرفة الحجم الذي تستهلكه الفهارس والجداول عمومًا، مما يساعد في إدارة ذاكرة التخزين لقاعدة البيانات ككل. 9. كيفية إدارة الأداء في قواعد بيانات Postgres تشرح هذه المقالة طريقة تتبع أداء الاستعلامات في Postgres، وذلك لمعرفة الزمن المتوقع والحقيقي للاستعلام. ثمّ تبين كيفية عمل قيود على استخدام الفهارس، وتتطرق إلى موضوع ذاكرة التخزين المؤقتة Cache في Postgres. 10. أوامر متقدمة في صدفة psql تستعرض هذه المقالة أوامر الاتصال بقاعدة البيانات واستعراض الفهارس وتنسيق المخرجات، وكيفية استخدام الأوامر الشرطية وكيفية تنفيذ أوامر نظام التشغيل من داخل صدفة psql وغيرها من الأوامر المتقدمة. دروس تطبيقية هذه بعض الدروس والمقالات التطبيقية لترسيخ فهمك لنظام PostgreSQL وتعلم المهارات الضرورية في قواعد البيانات، مثل التكامل مع التطبيقات الأخرى، والجوانب الأمنية والحماية من الهجمات المؤتمتة والبحث والتنقيب وغيرها. 1. فيديو - تثبيت وإعداد قاعدة بيانات PostgreSQL يشرح هذا الفيديو التعليمي طريقة تثبيت وإعداد خادم PostgreSQL على نظام أوبنتو 18.04. ثمّ يتطرق إلى كيفية إعداد كلمة مرور للمستخدم root؛ وإنشاء قاعدة بيانات جديدة ومستخدم جديد لديه صلاحيات كاملة. 2. كيف تثبت PostgreSQL وتستخدمه على Ubuntu 14.04 يشرح هذا المقال كيفية تثبيت Postgres على Ubuntu 14.04 وبعض الأمور الأساسية الأخرى، مثل مفهوم الأدوار وكيفية إنشاء قاعدة بيانات جديدة وإنشاء جداول البيانات وإضافة التسجيلات والاستعلام عنها وحذفها. 3. كيفية استخدام PostgreSQL مع تطبيق Django على خادم يعمل بأوبنتو 16.04 يستعرض هذا الدرس كيفية تثبيت وتهيئة PostgreSQL لاستخدامها مع تطبيقات Django، وكذلك تثبيت الحزم اللازمة وإنشاء اعتماديات قاعدة البيانات، مع توضيح كيفية بدء مشروع Django جديد وتجهيزه وإعداده. 4. كيفية استخدام PostgreSQL مع تطبيق Django على خادم يعمل بدوبيان 8 ستتعلم في هذا الدليل كيفية تثبيت وتهيئة PostgreSQL لاستخدامها مع تطبيقات Django على خادم يعمل بدوبيان 8، وسنثبّت الحزم اللازمة وننشئ اعتماديات قاعدة البيانات للتطبيق، ثم نبدأ مشروع Django جديد ونجهّزه ليستخدم هذه اﻹعدادات. 5. كيفيّة حماية PostgreSQL من الهجمات المُؤتمتة (Automated Attacks) سنلقي في هذا الدّرس نظرة على كيفيّة تقليل خطر الوصول غير المُصرّح في حال تفعيل الاتّصالات البعيدة (remote connections). هذا ضروري لصد الهجمات المُؤتمتة التي تُصمَّمُ للبحث عن الأخطاء الشّائعة بغية النفاد منها واستغلالها. 6. كيف تستخدم تقنية بحث النصوص الكاملة Full-Text Search في PostgreSQL على خادم أوبنتو 16.04 ستتعلم في هذا المقال تقنية بحث النصوص الكاملة، وهي مفيدة في تقوية نتائج البحث في مواقع مثل المتاجر الرقمية ومحركات البحث والجرائد وغيرها. ستتعلم كذلك كيف تبحث في قاعدة البيانات باستخدام FTS واختيار أفضل النتائج فقط. 7. شرح التكرار في نظام قواعد البيانات PostgreSQL على توزيعة أوبنتو ستتعلم في هذا الدليل كيفية إعداد تكرار من نوع (رئيسي-Master/ثانوي-Slave)، وهي عملية مزامنة بين قاعدتي بيانات من خلال النسخ من قاعدة بيانات على خادم (رئيسي) إلى قاعدة بيانات أخرى في خادم آخر (ثانوي). سوف ننفذ هذه العملية على خادم يعمل بتوزيعة أوبنتو 16.04. 8. كيف تنقل مجلد البيانات في PostgreSQL إلى مسار مختلف في خادم أوبنتو 16.04 ستتعلم في هذا الدليل كيفية نقل مجلد البيانات في نظام PostgreSQL إلى مكان جديد في حال كنت تريد إضافة مساحة جديدة أو ترغب في تحسين الأداء، أو الاستفادة من مزايا التخزين الأخرى التي توفرها أنظمة مصفوفات الأقراص المستقلة RAID، أو عُقد التخزين الشبكية “Network Block Storages”، أو غيرها من الأجهزة وأنظمة التخزين. خاتمة تُضاف مزيد من المقالات والدروس في الأكاديمية حول PostgreSQL وقواعد البيانات ولغات البرمجة وغيرها باستمرار، لذلك تابع مستجدات الأكاديمية، وإن وجدت مشكلة فيمكنك أن تسأل عنها في قسم الأسئلة والأجوبة الخاص بالأكاديمية. لا تنس كذلك الاشتراك في قناة حسوب على اليوتيوب ومشاهدة عشرات الفيديوهات التعليمية في كل المجالات التقنية. إن كنت مهتما بتعلم لغات برمجة أخرى، فيمكنك زيارة قسم البرمجة في الأكاديمية، أيضًا لا تنس زيارة موسوعة حسوب التي تضم توثيقات الكثير من لغات البرمجة. وفّقك الله تعالى.
  11. أهلًا @عادل المالكي، بالنسبة لكلمة تصريف، فقد اخترناها ترجمةً للمصطلح الأجنبي compilation، ومصرِّف compiler، وبحسب قاموس صخر: والتصريف هو التبديل والتحويل، وبلغة البرمجة، هو التبديل والتحويل من لغة البرمجة عالية المستوى إلى لغة الآلة منخفضة المستوى وهذا ما يفعله المصرِّف تمامًا. بالنسبة لكلمة مفسَّرة ومفسِّر فهي الترجمة المقابلة للمصطلح الأجنبي interpreter المختلف عن سابقه بالطريقة والأسلوب والمتشابهة معه بالنتيجة أي تحويل لغة البرمجة عالية المستوى إلى لغة الآلة. وبحسب قاموس صخر أيضًا، فالتفسير هو كشف المعاني والتأويل وهو ما يفعله المفسر من تأويل للشيفرة وشرحها للآلة لكي تنفذها. لقد حاولنا اختيار الترجمة بدقة وأرجو أن نكون قد وُفقنا في ذلك. أشكرك،
  12. أهلًا @Mhamad شكرًا جزيلًا على التنبيه، جرى تصحيح الخطأ. نشكر اهتمامك وتنبيهك لنا بالخطأ ونشجعك على مبادرتك : )
  13. SQL أو لغة الاستعلامات البنيوية (Structured Query Language) هي لغة برمجة متخصصة تُستخدَم لمعالجة وإدارة قواعد البيانات. وتُنطق سي كويل (See-Quel). تعد اللغة القياسية لأنظمة إدارة قواعد البيانات (RDBMS)، وتُستخدم تعليمات وأوامر SQL لإجراء عمليات مباشرة على البيانات، مثل: تحديث البيانات إدراج سجلات جديدة في قاعدة البيانات حذف السجلات استخلاص البيانات والتنقيب عنها إنشاء جداول لتخزين البيانات إنجاز مهام إدارية على قاعدة البيانات، مثل تأمين قاعدة البيانات وإنشاء النسخ الاحتياطية وإدارة المستخدمين. تاريخ SQL طوّرت شركة IBM لغة SQL في بداية السبعينات بإسهام من بويس رايموند (Raymond Boyce) ودونالد شامبرلين (Donald Chamberlin)، وكانت تُسمى آنذاك SEQUEL. كان الهدف من تطويرها هو إدارة ومعالجة نظام R، وهو نظام شبه علائقي لمعالجة قواعد البيانات (quasi-relational database management system). سنة 1986، اعتمدت كل من المنظمة الأمريكية للمقاييس (ANSI) والمنظمة الدولية للمقاييس (ISO) لغة SQL كمقياس مرجعي، وقد تعاقبت بعد ذلك 9 إصدارات جديدة من المعيار، سنوات: 1989 و 1992 و 1996 و 1999 و 2003 و 2006 و 2008 و 2011 و 2016. ما هي أنظمة معالجة قواعد البيانات العلائقية RDBMS؟ أنظمة معالجة قواعد البيانات العلائقية (Relational Database Management System) هي برامج تُستخدَم لمعالجة وإدارة قواعد البيانات العلائقية (Relational Database)، وهي قواعد تخزِّن البيانات وفق بنية مهيكلة في جداول تتألف من صفوف وأعمدة لتسهيل الوصول إلى القيم المخزنة. لكل جدول مفتاح فريد يميز كل صف من الجدول. وتُسمى "علائقية" (relational) لأنّ القيم المُخزّنة في الجداول متعلقة ببعضها بعضًا. تجري أنظمة قواعد البيانات العديد من المهام، مثل: تأمين البيانات إنشاء النسخ الاحتياطية إدارة ومعالجة كميات ضخمة من البيانات تصدير البيانات أو استيرادها العمل على عدة جداول تزامنيا هناك العديد من أنظمة معالجة قواعد البيانات، من أشهرها: Oracle و MySQL و Microsoft SQL Server و DB2. ورغم أنّ أكثرها تستخدم SQL، إلا أنّ لكل منها بعض الإضافات والصياغات الخاصة بها التي لا تُستخدم في الأنظمة الأخرى، بيْد أنّها تدعم جميعا الأوامر الأساسية للغة (SELECT و UPDATE و DELETE و INSERT و WHERE). لماذا عليك تعلم SQL‎‎؟ إن كنت تتساءل عما إذا كانت SQL تستحق أن تتعلمها، فالنقاط التالية ستوضح لك بعض مزايا هذه اللغة: سهولة التعلم: لغة SQL سهلة موازنة مع بقية لغات البرمجة، ذلك أنّها مخصصة لغرض واحد، وهو معالجة البيانات معالجة البيانات الكبيرة: نحن نعيش في عصر الثورة الرقمية، ومن نتائج ذلك أنّ البيانات أصبحت متاحة بكميات ضخمة. ففي كل يوم تُنتج عدة تيرابايت من البيانات. بالطبع، يمكنك استخدام جداول البيانات العادية، مثل EXCEL وجداول جوجل، ولكنها مخصّصة لمعالجة كمية صغيرة أو متوسطة من البيانات. وهنا يأتي دور SQL، لأنها مصممة لمعالجة كميات ضخمة من البيانات بأداء وكفاءة عالية. تطوير الويب: SQL هي إحدى المهارات الضرورية لكل مبرمجي الواجهة الخلفية للخادم، لأنها تُستخدم لمعالجة واسترجاع البيانات المُخزّنة في الخادم، بما فيها بيانات المستخدمين. السرعة: لا تفعل SQL إلا شيئا واحدا فقط، وهو معالجة البيانات وإدارتها، وهي ممتازة فيما تفعله. فهي مُحسَّنة للدخول إلى البيانات بسرعة فائقة، ما يجعلها مثالية لتطبيقات الوقت الحقيقي. فرص العمل: هناك طلب كبير على مبرمجي SQL في القطاع الخاص، ويُتوقع أن يزداد هذا الطلب في السنوات القادمة، خصوصا في العالم العربي الذي يعرف ازدهارا سريعا للاقتصاد الرقمي في السنوات الأخيرة. الشهرة: في استطلاع stackoverflow لسنة 2019، حلت SQL في المرتبة الثالثة في قائمة أكثر تقنيات البرمجة استخداما من قبل المبرمجين على مستوى العالم. بعد جافاسكربت و HTML و CSS. إذ يستخدمها أكثر من نصف المبرمجين. هذا أمر طبيعي، لأنّ SQL هي إحدى أركان تقنيات الويب، ولا يمكن تطوير أي موقع ويب أو تطبيق بدون معرفة ولو بسيطة بها. مفتوحة المصدر: SQL مفتوحة المصدر، كما أنّ لديها مجتمعا كبيرا، إن اعترضتك مشكلة أثناء تعلم SQL، فيمكن أن تطرح سؤالك على stackoverflow أو في قسم الأسئلة في أكاديمية حسوب. المصدر كيف أتعلم SQL؟ قد تسأل: كيف أتعلم SQL؟ شبكة الإنترنت غنية بالكتب والمراجع والمقالات عن SQL باللغة الإنجليزية، للأسف، من الصعب أن تجد محتوى عربيا عالي الجودة لتعلم SQL، أو أيّ مجال تقني آخر. لمعالجة هذا الأمر وإثراء المكتبة العربية، أطلقت حسوب مشروعا لترجمة بعض أفضل الكتب التقنية في مجال البرمجة. ونظرا لأهمية SQL للمبرمجين، وحتى لغير المبرمجين من العاملين في القطاعات التقنية، كالصناعة والمحاسبة والصيرفة وتحليل البيانات، أو للمهتمين بقواعد البيانات عموما، قررنا ترجمة أحد أفضل الكتب الإنجليزية عن SQL، وهو كتاب SQL Notes For Professionals. لقد نشرنا سلسلة تضمّ كافة فصول الكتاب، وهي معروضة في القسم التالي. يمكنك أيضًا تنزيل الكتاب جملة واحدة على هيئة كتاب إلكتروني اطلقنا عليه، ملاحظات للعاملين بلغة SQL. @media screen and (min-width: 650px) { .response_image { width: 33%; display: inline-block; vertical-align: top; margin-top: 0px; } .response_descrip { width: 64%; display: inline-block; margin-right: 10px; vertical-align: top; margin-top: 0px; } } سلسلة "SQL للمحترفين" تغطي هذه السلسلة -المبنية على كتاب «ملاحظات للعاملين بلغة SQL»- كافَّة المفاهيم الأساسية للغة SQL، مثل العمليات الأولية، كإدراج البيانات وحذفها واستخلاصها وتحديثها، وأنواع البيانات، وتصميم الجداول وتنفيذ الاستعلامات، إضافة إلى مفاهيم متقدمة، مثل المعارض والدوال، وإدارة المستخدمين، وكيفية تأمين الشيفرة وغيرها من المواضيع. كما أنّها غنية بالأمثلة التطبيقية التي تشرح كل هذه المواضيع لترسيخ فهمها. هذه السلسلة ليست مثل غيرها من السلاسل والشروحات التي تشرح لغة SQL من البداية شرحًا مُبسَّطًا ومتسلسلًا وإنَّما تعتمد على مبدأ خير الكلام ما قل ودل في الشرح وترك الشيفرة تشرح نفسها بنفسها، فتحوي على كم كبير من الشيفرات بالموازنة مع الشرح. وُجِّهت هذه السلسلة لمن لديه معرفة بسيطة بلغة SQL، لذا يفضَّل أن تمتلك معرفة بلغة SQL لتستفيد أكبر استفادة منها وتقرأ الشيفرات وتفهمها وتتعلَّم منها. في هذه الحالة، ستساهم هذه السلسلة في رفع مستواك في لغة SQL وستُملِّكك مهارات متقدمة في استعمال لغة SQL بالإضافة إلى بعض الخدع والالتفافات المتقدمة أيضًا. قد تسأل نفسك، هل ينفع أن اقرأ السلسلة دون معرفة مسبقة بلغة SQL؟ سأقول، نعم، ولكن يجب أن تتحلى بالصبر في قراءة الشيفرة وتحليلها وفهمها والبحث عن أي موضوع لم تفهمه والسؤال عن شرح لأي شيفرة غامضة، إذ لن تجد كلامًا وشرحًا كبيرًا للمواضع التي تتحدث عنه السلسلة، كما أن تسلسل المواضيع فيها لا تراعي عدم امتلاك القارئ معرفة بلغة SQL، إذ رُتِّبت ترتيبًا عشوائيًا في العمل الأصلي. بذكر ترتيب عناوين ومواضيع السلسلة، حاولت ترتيب عناوينها بأنسب شكل لتكون متدرِّجة في الصعوبة وحاولت جمع المواضيع المتشابهة في فصل واحد رغم تشرذمها وتفرقها في العمل الأصلي فلا تشبه النسخة العربية المترجمة النسخة الأجنبية مطلقًا، إذ حاولت أن تكون أفضل منها وأرجو أن نكون قد حققنا ذلك. فإن كنت على معرفة بأحد المواضيع، فلا تتخطاها بل اقرأها، فقد تمر معك إشارة لموضوع متقدم أو ملاحظة مهمة لم تكن تعرفها (تذكر أنَّ اسم الكتاب العربي ملاحظات متقدمة للعاملية بلغة SQL ;-) ). يمكنك أيضًا أن تقرأ السلسلة من أي قسم تريد فهي من الأساس غير مُرتَّبة ترتيبًا متدرجًا ومتسلسلًا كما أشرت إلى ذلك، رغم محاولتي في ترتيبها لك أنسب ترتيب من البداية للنهاية؛ أرجو لك قراءة ممتعة! 1. مدخل إلى SQL هذه المقالة هي مدخل عام إلى لغة الاستعلامات SQL، وفيها توطئة لبعض المفاهيم الأساسية لهذه اللغة، مثل المعرّفات و أنواع البيانات، كالأعداد والحروف والقيم المالية، إضافة إلى مجموعة من الأمثلة العملية على بعض الجداول وقواعد البيانات. 2. جلب الاستعلامات عبر SELECT في SQL تستعرض هذه المقالة كيفية استخدَام العبارة SELECT في استعلامات SQL لاختيار واستخلاص النتائج من قاعدة البيانات، تشمل هذه الفقرة العديد من تقنيات الاختيار، مثل حرف البدل والاختيار وفق كُنى الأعمدة، وتحديد عدد السجلات المُختارة والاختيار الشرطي، والاختيار باستخدام الدوال التجميعية، واختيار صفوف من عدة جداول. 3. التجميع والترتيب في SQL تتحدث هذه المقالة عن كيفية استخدام العبارتين GROUP BY و ORDER BY لتجميع نتائج الاستعلامات في SQL وترتيبها. إضافة إلى التقنيات المُستخدمة لتصنيف النتائج وفق شروط معينة، وعدّ الصفوف في الجدول، والتنقيب عن البيانات أو ترتيبها بحسب عدة أعمدة. 4. تنفيذ تعليمات شرطية عبر CASE في SQL تستعرض هذه المقالة العبارة CASE، والتي تُستخدم لكتابة الشيفرات الشرطية (if-then)، وعد الصفوف التي تحقق شرطا معينا، إضافة إلى كيفية استخدام CASE لتحديث البيانات، أو ترتيبها تصاعديا أو تنازليا. 5. البحث والتنقيب والترشيح في SQL تستعرض هذه المقالة بعض معاملات SQL المتخصصة في البحث والتنقيب وترشيح النتائج، مثل المعامل LIKE، الذي يبحث عن التطابقات مع نمط نصي معين، و WHERE و HAVING، اللتان تُستخدمان لترشيح النتائج وفق شروط معينة، إضافة إلى بعض تقنيات التحكم في النتائج المُعادة، واستعراض بعض البيانات الوصفية المتعلقة بالاستعلامات. 6. الدمج بين الجداول في SQL سنستعرض في هذه المقالة كيفية استخدام العبارة JOIN، وأنواعها، وكيفية إجراء الدمج العودي والدمج في الاستعلامات الفرعية، وذلك كله من أجل إجراء عملية الدمج بين الجداول والحصول على النتائج المرجوة. 7. تحديث الجداول في SQL تستعرض هذه المقالة كيفية استخدام العبارات UPDATE و CREATE لتحديث وإنشاء قواعد البيانات والجداول، إضافة إلى كيفية إنشاء دوال جديدة. 8. معالجة الأخطاء والتعديل على قواعد البيانات في SQL تستعرض هذه المقالة كيفية معالجة الأخطاء باستخدام العبارة TRY / CATCH، وكيفية حساب الاتحاد (UNION) وبعض العمليات الأخرى التي تمكّن من تعديل قواعد البيانات، وإدراج بيانات جديدة في الجداول 9. حذف الجداول وقواعد البيانات في SQL تتحدّث هذه المقالة عن كيفية حذف الجداول وقواعد البيانات (DROP و DELETE)، واقتطاع الجداول (TRUNCATE TABLE)، وكيفية استخدام الحذف المتفشي أو المتسلسل (Cascading Delete) في SQL. 10. مواضيع متقدمة في SQL تستعرض هذه المقالة عددًا من المواضيع المتقدمة في SQL، مثل إدارة صلاحيات المستخدمين، واستخدام ملفات XML في الاستعلامات، والمفاتيح الرئيسية وأرقام الصفوف، إضافة إلى مفهوم الفهارس، وكيفية إنشائها أو حذفها وتعطيلها. 11. دوال التعامل مع البيانات في SQL تستعرض هذه المقالة بعض أنواع الدوال، مثل الدوال التجميعية (Aggregate Functions) التي تُطبَّق على الصفوف، والدوال التحليلية (Analytic Functions) والدوال العددية ودوال النافذة (window function). 12. دوال التعامل مع النصوص في SQL تستعرض هذه المقالة مفهوم الدوال النصية String Functions، وهي دوال تُنفَّذ على قيم نصية، وتعيد إمّا قيمًا عددية أو قيمًا نصية. مثلًا، يمكن استخدام الدوال النصية لدمج البيانات، أو استخراج أجزاء من السلاسل النصية، أو موازنة السلاسل النصية أو تحويلها من الأحرف الكبيرة إلى الصغيرة، أو العكس. 13. التعبيرات الجدولية الشائعة Common Table Expressions تستعرض هذه المقالة مفهوم التعبيرات الجدولية (Common Table Expressions) في SQL، والتي يمكن استخدامها مع الاستعلامات المؤقتة والعوديّة لتوليد سلاسل القيم وتسلق الأشجار (trees). 14. مواضيع متفرقة في SQL تستعرض هذه المقالة مجموعة من المواضيع الإضافية في SQL، مثل المعارض (Views)، وكيفية كتابة التعليقات، وكيفية التعامل مع المفاتيح الخارجية (Foreign Keys) وإنشاء تسلسلات العناصر. 15. الاستعلامات الفرعية والإجراءات في SQL تستعرض هذه المقالة بعض المواضيع المتقدمة عن تنفيذ الشيفرات في SQL، مثل الاستعلامات الفرعية (Subqueries)، وكتل التنفيذ، والإجراءات المُخزّنة، والزنادات (triggers)، وكيفية إنشاء المُعامَلات (transactions) وتنفيذها. 16. تصميم الجداول وترتيب تنفيذ الاستعلامات ومعلومات المخطط في SQL تستعرض هذه المقالة عددا من مواضيع SQL المتفرقة، مثل كيفية تصميم جداول قواعد البيانات، واستخدام المرادفات، وكيفية استخلاص المعلومات المتعلقة بقاعدة البيانات عبر معلومات المخطط، والترتيب الذي تُنفّذ وفقه عبارات واستعلامات SQL التي من المفيد تعلمها والإلمام بها. 17. تنظيم وتأمين شيفرات SQL تتحدث هذه المقالة عن أفضل الممارسات المُتعارف عليها بين المبرمجين، والتي تساعد على كتابة شيفرات SQL نظيفة وعالية المقروئية، وكذلك تأمين الشيفرات عبر التحوّط من أحد أشهر أنواع هجمات SQL، وهو حقن شيفرات SQL ‏(SQL Injection)‏‏. دروس ومقالات إضافية هذه بعض المقالات الإضافية التي يمكن أن تساعدك على ترسيخ فهمك لبعض مفاهيم SQL وقواعد البيانات. مقدمة عن قواعد البيانات هذا هو المقال الأول من سلسلة دروس عن لغة الاستعلام البنائية Structured Query language، ويشرح مفهوم قواعد البيانات، وأنظمة إدارة قواعد البيانات، والجداول، وخصائص قواعد البيانات العلاقية. أساسيّات لغة SQL يعطي هذا المقال لمحة عامة عن لغة الاستعلامات SQL، وعن دورها وعلاقتها بقاعدة البيانات، مع شرح أساسيات وصياغة قواعد البيانات والجداول. البيانات في SQL: أنواعها والقيود عليها يتطرق هذا المقال لأحد المفاهيم الأساسية في قواعد البيانات وفي لغة الاستعلامات SQL، وهو مفهوم القيود، إذ يعرض هذا المفهوم مع أمثلة عملية لتوضيحه. إضافة إلى عرض مفصَّل لمختلف أنواع البيانات المُستخدمة في قواعد البيانات. التعامل مع البيانات (الإدخال، الحذف والتعديل) في SQL يشرح هذا المقال موضوع لغة التعامل مع البيانات Data Manipulation Language، سوف تملك في نهاية هذا المقال المعرفة اللازمة لإضافة سجلات بيانات إلى الجداول، وتعديلها، وحذفها باستخدام عبارات SQL الأساسية، مثل: UPDATE وINSERT وDELETE. الاستعلام عن البيانات في SQL هذا المقال تتمة للمقال السابق، ستتعلم فيه إحدى أشهر عبارات لغة الاستعلام البنائية، وهي Select، يتكلم المقال عن كيفية صياغة هذه العبارة، وأشكالها، وكيفية ترشيح البيانات واختيار الأعمدة. الفهارس Indexes في SQL يتناول هذا المقال موضوع الفهارس Indexes في SQL، وما تمثله في قاعدة البيانات، وما هي الفائدة منها، وكيفية استخدامها في شيفرات SQL. العلاقات بين الجداول في SQL SQL مُتخصَّصة أساسًا في قواعد البيانات العلائقية، لهذا فإنّ فهم موضوع العلاقات بين الجداول ضروري لكل مبرمج يريد احتراف هذه اللغة واستنفاذ إمكانياتها. ستتعلم في هذا المقال مفهوم العلاقات بين جداول قاعدة البيانات، وأنواع هذه العلاقات، وكيف تُمثَّل وتطبق بين الجداول. تعلم لغة الاستعلام SQL بالأمثلة العملية أفضل طريقة لتعلم أيّ لغة برمجة هي بتطبيق المعارف على أمثلة عملية. يشرح هذا الدرس المُصوّر أساسيات لغة الاستعلامات SQL عبر أمثلة عملية، وذلك باستخدام لوحة التحكم phpMyAdmin. خاتمة تُضاف مزيد من المقالات والدروس إلى الأكاديمية حول SQL‎ وقواعد البيانات باستمرار، لذلك تابع مستجدات أكاديمية حسوب. وإن أشكل عليك شيء فيمكنك أن تسأل عنه في قسم الأسئلة والأجوبة الخاص بالأكاديمية. يمكنك أيضا الاشتراك في قناة حسوب على اليوتوب، هذه القناة تحتوي دروسًا قصيرةً عن العديد من مواضيع البرمجة. تابع أيضًا قسم الكتب والملفات للاطلاع على أحد الكتب التي ننشرها. إن كنت مهتما بتعلم لغات برمجة أخرى، فيمكنك زيارة قسم البرمجة في الأكاديمية، أيضًا لا تنس زيارة موسوعة حسوب، التي تضم توثيقات الكثير من لغات البرمجة، بما في ذلك توثيق SQL. وفّقك الله تعالى.
  14. أنواع القيمة (Value types) ببساطة، تَحوِّي أنواع القيمة (value types) القِيمَة الفِعلِية. تُشتَقّ جميع أنواع القيمة -والتي تَتضَمَن غالبية اﻷصناف المبنية مُسبَقًا (built-in types)- مِن الصنف System.ValueType. ونظرًا لكَوْن هذا الصنف غيْر قابِل للتوريث بشكل مباشر، تُستخَدَم الكلمة المفتاحية صنف (Struct keyword) لإنشاء نوع قيمة مُخصّص (custom value types) كالمثال بالأسفل. عند إنشّاء نسخة (instance) جديدة من نوع القيمة، تُستَخَدَم ذاكِرة المَكْدَس (Stack Memory) لتخزينها، والتي تَتسِع بما يتوافق مع حجم النوع المُصرّح عنه. على سبيل المثال، يُخصَّص لكل نوع عَدَدِيّ int مِساحة 32 بت بِـذاكِرة المَكْدَس. ويُلْغَى تَخصّيص هذه المساحة عند خروج النُسخة من النِطاق (scope). مِن المُهم أن تُدرِك أنه عند إِسْناد متغير من نوع القيمة لآخر، تُنسَخ قيمته لا مَرجِعه للمُتغير الآخر، مما يَعّني أنه قد أصبح لدينا نسختين مُنفَصلتين، لا يؤثر تغيير قيمة احِدَاهُما على قيمة النسخة الآخرى. struct PersonAsValueType { public string Name; } class Program { static void Main() { PersonAsValueType personA; personA.Name = "Bob"; var personB = personA; personA.Name = "Linda"; // ‫يُشير المُتغيّران إلى مواضع مختلفة بالذاكرة Console.WriteLine(object.ReferenceEquals(personA, personB)); // 'False' Console.WriteLine(personA.Name); // Outputs 'Linda' Console.WriteLine(personB.Name); // Outputs 'Bob' } } أنواع مرجعية (Reference types) تتكون الأنواع المَرجعِية (reference types) من قيمة (value) مُخزَّنة بمَكان ما بالذاكرة ومَرجِع (reference) يُشير إلى هذا المكان. يُمكِن القول أنها تَعمَل بصورة مشابهة للمُؤشِرات (pointers) بلغتي C/C++‎. تُعدّ جميع الأصناف (Classes) -حتى الساكن منها (static class)- من النوع المَرجعِي. يُوضح المثال باﻷسفل استخدام صنف (class) لإنشاء متغير من النوع المَرجِعي وإِسْناده لآخر. تُخزَّن جميع الأنواع المَرجعِية بقسم الكَوْمَة في الذاكرة (Memory Heap). فعِند إنشاء كائن جديد، تُخصَّص مِساحة من ذاكرة الكَوْمَة له ويُعَاد مَرجِع (reference) يُشير إلى مَوقِع تِلك المساحة. يَتولى كانِس المهملات (garbage collector) مُهِمّة إدارة ذاكرة الكَوْمَة، ولا يُسمَح لك بالتَدخُل أو التحكم بها بنفسك. بالإضافة إلى مساحة الذاكِرة المُخصَصة للكائن ذاته، تُخصّص مساحة أخرى إضافية لتخزين كلًا من المَرجِع ومعلومات إضافية تحتاجها بيئة التنفيذ المشتركة (CLR) بإطار عمل ‎.NET بصورة مؤقتة. أحد أهم ما يُفرِّق بين نوعي القيمة والمَرجِع هو أنه عند إِسْناد متغير من نوع مَرجِعي لآخر، يُنسَخ المَرجِع إلى المُتغير الآخر لا القيمة التي يُشير إليها، مما يَعّني أنه قد اَصبح لدينا مَرجِعين يُشيران إلى نفس الكائن. بالتالي، سَيُؤثر أيّ تغيير في القِيم الفِعلية لهذا الكائن على قيمة كلا المَرجِعين. class PersonAsReferenceType { public string Name; } class Program { static void Main() { PersonAsReferenceType personA; personA = new PersonAsReferenceType { Name = "Bob" }; var personB = personA; personA.Name = "Linda"; // ‫يُشير كلًا من المُتغيّران إلى نفس موضع الذاكرة Console.WriteLine(object.ReferenceEquals(personA, personB)); // 'True' Console.WriteLine(personA.Name); // 'Linda' Console.WriteLine(personB.Name); // 'Linda' } } الأنواع المخصصة (Custom Types) بالإضافة إلى اﻷصناف المبنية مُسبَقًا (built-in types)، يُمكن إنشاء أصناف مُخصّصة (Custom). الصنف Struct تَرِث الأصناف (structs) -المُعرَّفة باستخدام الكلمة المفتاحية Struct- النوع System.ValueType تلقائيًا، ولذلك تُعدّ من أنواع القيمة (value types)-كما ذَكرنا مُسبَقًا-، كما تُخزَّن بذاكِرة المَكْدَس (stack). على سبيل المثال: Struct MyStruct { public int x; public int y; } تُمرَّر المُتَغيّرات من نوع القيمة كمُعامِلات للدوال تمريرًا قيميًا (pass by value)، أي تُنسَخ قيمة المُتَغيّر وتُسْنَد لمُعامِل الدالة، وبالتالي إذا غَيرَّت الدالة قيمة المُعامِل فإن هذا التَغيير لا يَنعكِس على قيمة المُتَغيّر الأصلي خارج الدالة؛ لأنه مُجرد نُسخة. في الشيفرة التالية، تَستقبِل الدالة AddNumbers مُعامِلين x و y من النوع int وهو نوع قيمة. على الرغم من أن الدالة تُزيد قيمة المُعامِل x بمقدار 5، فإن قيمة المُتَغيّر a تظل كما هي؛ لأن المُعامِل x هو، بالواقع، مُجرد نسخة من قيمة المُتَغيّر a وليس المُتَغيّر ذاته. int a = 5; int b = 6; AddNumbers(a,b); public AddNumbers(int x, int y) { int z = x + y; // قيمة المتغير‫ z تساوي 11 x = x + 5; // ‫غُيرت قيمة x إلى القيمة 10 z = x + y; // قيمة المتغير‫ z تساوي 16 } الصنف class تَرِث الأصناف (classes) -المُعرَّفة باستخدام الكلمة المفتاحية Class- النوع System.Object تلقائيًا، ولذلك تُعدّ من الأنواع المَرجِعية (reference types)، كما تُخزَّن بقسم الكَوْمَة في الذاكرة (heap). على سبيل المثال: public Class MyClass { public int a; public int b; } تُمرَّر المُتَغيّرات من نوع المَرجِع كمُعامِلات للدوال تمريرًا مَرجعيًا (pass by reference)، أي يُنسَخ مَرجِع المُتَغيّر ويُسند لمُعامِل الدالة. لمّا كانت الدالة تَملِك مُعاملًا يَحمِل مَرجِعًا يُشير إلى الكائن الأصلي ذاته، فإنها إذا غَيرَّت قيمة المُعامِل فإن هذا التَغيير سيَنعكِس على قيمة المُتَغيّر الأصلي خارج الدالة. في الشيفرة التالية، نَستخدِم نفس المثال السابق لكن ضُمِنِّت المُتَغيّرات من النوع int بداخل صنف class، بحيث تَستقبِل الدالة مُعامِلًا من ذلك الصنف. الآن، عندما تُغيّر الدالة قيمة المُتَغيّر sample.a، فإن قيمة المُتَغيّر instanceOfMyClass.a ستَتَغيَّر تلقائيًا؛ لأن مُعامِل الدالة، في الواقع، يَحمِل مَرجِعًا يُشير إلى نفس ذات الكائن المُمرَّر لها، وليس مُجرد نسخة منه. MyClass instanceOfMyClass = new MyClass(); instanceOfMyClass.a = 5; instanceOfMyClass.b = 6; AddNumbers(instanceOfMyClass); public AddNumbers(MyClass sample) { int z = sample.a + sample.b; // قيمة المتغير‫ z تساوي 11 sample.a = sample.a + 5; // ‫غُيرت قيمة a إلى القيمة 10 z = sample.a + sample.b; // قيمة المتغير‫ z تساوي 16 } ترجمة -وبتصرف- للفصلين Custom Types و Stack and Heap من كتاب ‎.NET Framework Notes for Professionals
  15. يعد التحريك باستخدام مكتبة React Native من المواضيع الأساسية المطروحة في أقسام الدراسة أو ورشات العمل، ربما لكون عدد من المطورين يجدون تحديًا في استخدامها. في الوقت الذي تركّز فيه الكثير من المدونات والمصادر في الويب على جوانب الأداء عند استخدام React Native، لا يخوض إلا عدد قليل منها في الأساسيات. سنعرض في هذه المقالة لأساسيّات تطبيق التحريكات باستخدام مكتبة React Native. أولًا سنلقي نظرة على خلفية المكتبة وتاريخها. بداية التحريكات في React Native وتطوّرها عند تشغيل برنامج عابر للمنصّات مكتوب بلغة جافاسكريبت تحتاج مكوّنات React Native على هاتفك إلى تبادل المعلومات بواسطة عنصر يسمّى الجسر (Bridge). التبادل عبر هذا العنصر غير متزامن (Asynchronous)، وهو ما يجعل التطبيقات المبنية على إطار العمل React Native تصبح بطيئة لأن الطلبات غير المتزامنة المارّة على الجسر تسدّ المسار أمام شفرة جافاسكريبت التي تتفاعل مع أجزاء إطار العمل. للحصول على أداء عال يجب أن تصيّر (Render) التحريكات على خيط (Thread) واجهة المستخدم الأصلي في نظام التشغيل، وبما أن البيانات تحتاج للسَّلسَلة (Serialization) عبر الجسر فإن ذلك يؤدّي غالبًا إلى منع خيط جافاسكريبت، ممّا يتسبّب في نقص عدد الإطارات (Frame) على الشاشة. بقي هذا المشكل حاضرًا منذ 2015 حين كانت التحريكات تمثّل واحدة من العقبات الكبرى أمام إطار العمل React Native. لحسن الحظ، تحسّنت الحالة منذ ذلك الوقت بفضل الدعم الكبير من أعضاء مجتمع المطورين، إذ أصبح من الشائع الآن إنجاز 60 إطارًا في الثانية الواحدة (Frame per second, FPS) في عمليات التحريك ضمن React Native. سهّلت واجهات تطبيقات برمجيّة تصريحيّة (Declarative API) مثل Animated عمليّة تنفيذ التحريكات التفاعلية. استخدام واجهة التطبيقات البرمجية Animated لتحسين الأداء يواجه المطورون حتى الآن العديد من القضايا المتعلقة بالأداء خاصة عندما يعملون على رسومات متحركة معقّدة. كما ذكرنا سابقًا، تتسبب الاختناقات في الأداء التي تحدث عند تنفيذ الرسوم في React Native، بأعباء عمل كبيرة على خيوط جافاسكربت (JavaScript threads)، مما يقلّل من معدل إظهار الإطارات، وبالتالي يتسبّب في البطء عند استخدام البرنامج، وللتغلب على هذه المشكلة نحتاج إلى الحفاظ على معدل 60 إطارًا في الثانية الواحدة. إن أفضل حل للحفاظ على معدّل الإطارات بالثانية هو استخدام Animated API لأنها تحسّن الزمن المطلوب للسَّلسَلة وعكسها (Serialization/Deserialization). تعمل Animated API عبر استخدام واجهة تطبيقات تصريحية لوصف التحريكات. الفكرة التي تقوم عليها هي التصريح بالتحريك كاملًا مرةً واحدة مقدّمًا لكي تُمكِن سَلسَلة التصريح في جافاسكريبت وإرسالها إلى الجسر. ينفّذ مشغّلٌ (Driver) التحريكاتِ إطارًا بعد الآخر. تنفيد التحريكات ضمن React Native توجد طرق عدة لتطبيق التحريك في React Native. في ما يلي الطرق التي أجد أن لديها فائدة أكبر. القيم المتحرّكة Animated values يتربّع تحريك القيم على قائمتي بوصفه لبنة أساسيّة للتحريكات في تطبيقات React. تشير هذه القيم عمومًا إلى قيم حقيقة تُحوَّل إلى أعداد حقيقية عند تمريرها مع مكوّن مُحرَّك. فلننظر إلى المثال التالي. Animated.timing(this.valueToAnimate, { toValue: 42; duration: 1000; }).start() نلاحظ في المثال السابق أننا أسندنا القيمة 42 إلى value.ToAnimate والتي ستنفّذ بعد 1000 ميلي ثانية. كما يمكن التصريح عن قيم خاصيات التحريك الأخرى مثل الشفافية opacity أو الموضع position. في ما يلي مثال تطبيقي على الشفافية بقيم متحرّكة. <Animated.View style={{ opacity: myAnimatedOpacity }} /> مشغلات التحريك: Animated.timing و Animated.event و Animated.decay انظر إلى المشغّلات على أنها عُقد في مخطّط بياني (Graph) تغيّر قيمةً متحرّكة مع كل إطار. على سبيل المثال، ستزداد القيمة المسندة إلى Animated.timing، بينما ستنقص القيمة المسندة إلى Animated.decay في كل إطار. لنلق نظرة على المثال التالي: Animated.decay(this.valueToAnimate, { velocity: 2.0, deceleration: 0.9 }).start(); في هذا المثال، ستنفَّذ الرسوم المتحركة انطلاقًا من سرعة محددة بالقيمة 2.0، ثم تتناقص تدريجيًا خلال الوقت المحدَّد. أصبحت هذه الطريقة شائعة في التطبيقات العابرة للمنصّات مع بداية ظهور التوثيقات عن التصميم المسطّح (Material design). تبدو التحريكات بمظهر جيّد، وتوجد طرق عدّة لجعل التجربة لا تنسى. يمكن كذلك استخدام Animated.event لتشغيل قيمة عند تمرير المستخدم: <ScrollView onScroll={Animated.event( [{nativeEvent: {contentOffset: {y: this.state.scrollY}}}] )} > </ScrollView> في المثال السابق يُعيد Animated.event دالّة تعدّل قيمة الخاصيّة nativeEvent.content.offset.y في المكوّن scrollView لتأخد قيمة scrollY الحالية. عمومًا، يمكن استخدام مشغلّات التحريك مع القيم المتحركة أو مع مشغّلات أخرى. ملحوظة جانبية: انتبه إلى أنه عندما يحدّث المشغّل كل إطار فإن القيمة الجديدة تحدّث مباشرةً قيمة الخاصيّة View، وبالتالي يجب أن تكون حذرًا عند التصريح بالمتغيّرات وتنتبه إلى نطاقها أثناء استخدامها. توابع التحويل Transform methods تتيح لك توابع التحويل تحويل قيمة متحرّكة إلى قيمة متحرّكة جديدة. يمكنك استخدام توابع مثل Animated.add()‎ وAnimated.multiply()‎ وAnimated.interpolate()‎ لتنفيذ عمليّات تحويل بين القيم. يمكنك تنفيذ عمليّة تحويل على أي عقدة في المخطّط البياني قيد التحريك كالتالي: newAnimated.Value(55).interpolate(.....) // Transformation operation using Animated.interpolate() method تحريك الخاصيّات الخاصيّات المتحرّكة هي عقد خاصّة تربط بين القيم المتحرّكة وخاصيّة في مكوّن. تُولَّد تلك الخاصيّات عند تصيير الخاصيّة Animated.view وإسناد خاصيّات لها. فلننظر إلى الشفرة التالية: Var opacity = new Animated.Value(0.7); <Animated.View style={{ opacity }} /> أضفنا خاصيّة متحرّكة تُحوِّل القيمة 0.7 إلى خاصية. في حال حدّث التابع تلك القيمة، سينعكس التغيير على خاصية View. تعمل التوابع الموصوفة أعلاه أساسًا بالتزامن مع الكائنات المتحرّكة (Animated objects) في React، كما أن توابع التحويل تؤدّي دورًا أساسيًّا في عمل تلك الكائنات. يغيّر مشغّل التحريك (Animated.Timing أو Animated.Event أو Animated.Decay) قيم التحريك في كل إطار ثم تُمرر النتيجة عبر أي تابع من توابع التحويل لتُخزَّن بصيغة خاصية عرض (الشفافية Opacity أو قيمة التحويل). يسلم مفسّر جافاسكريبت النتيجة إلى Native React حيث تُحدَّث الواجهة من خلال استدعاء التابع setNativeProps. في الأخير تُمرَّر الخاصيّة إلى iOS أو Android حيث يتسلم المكوّن UIView أو Android.View التحديثات. تنفيذ الرسوم المتحركة باستخدام Animated API و Native Driver تشرف مشغلات جافاسكريبت منذ ظهور Animated API على عملية تنفيذ التحريك، ولكن هذه الطريقة سببت تباطؤًا في عملية التحريك بسبب قلة عدد الإطارات المعروضة في الثانية ويعود السبب في ذلك أن العمل كله يتم في الخيط (Thread) الخاص بجافاسكريبت. لتجاوز هذه المشكلة أضيفت مشغلات خاصة بإطار العمل React Native وبالتالي أصبحت قادرة على تنفيذ عملية التحريك كاملةً، إطارًا بعد الآخر، ضمن React Native. عند استخدام المشغل الخاصة بإطار العمل React native مع Animated API فإن ذلك يسمح بتحديث العرض مباشرة دون الحاجة إلى إعادة حساب القيم مرة أخرى في جافاسكربت. لاستخدام المشغّل الخاص بإطار العمل React يجب تعيين القيمة true إلى الخاصيّة useNativeDriver أثناء ضبط التحريكات. useNativeDriver: true استخدام PanResponder للتعامل مع لمس الشاشة في React Native يمكن لواجهة التطبيقات Animated API تنفيذ غالبية الأعمال الروتينية عند عمل التحريكات في React Native، إلّا أنها محدودة في التعامل مع لمس الشاشة للتفاعل مع التحريكات، فهي غير قادرة على التجاوب مع الحركات التي تحدث خارج المكوّن ScrollView. رغم أنه يمكن تنفيذ أشياء كثيرة عن طريق مكوّن ScrollView بسيط، إلّا أن التطبيقات على الأجهزة الجوّالة تبقى ناقصة بدون لمس الشاشة التي يستعملها المستخدم للتفاعل مع التحريكات عن طريق التمرير أو التدوير على سبيل المثال. يمكن التعامل مع حركات اللمس في React Native بسلاسة باستخدام PanResponder مع Animated API. يدمج PanResponder لمسات عدّة في حركة خاصّة، ويجعل لمسة واحدة تتجاوب مع لمسات إضافية لكي تعمل حركات اليد بسلاسة. افتراضيًّا، يتمثّل PanResponder في مقبض InteractionManager يمنع الأحداث العاملة على خيط جافاسكريبت من تعطيل حركات اللمس. تحسين زمن التشغيل لانتقالات التصفح البطيئة عادةً يحتاج أي تحريك يستدعي الانتقال من شاشة إلى أخرى في React Native إلى استخدام مكوّنات التصفّح. تُستخدَم مكوّنات التصفّح مثل React Navigation عادةً للانتقالات أثناء التصفح. تحدث الانتقالات أثناء التصفّح في React Native عادةً في خيوط جافاسكريبت، ممّا قد يتسبّب في انتقالات بطيئة في الأجهزة الرخيصة أو ذات الذاكرة المحدودة (أجهزة أندرويد أساسًا إذ أن الأجهزة العاملة بنظام iOS تتعامل مع الأمر بفاعلية أكبر). تحدث انتقالات التصفح البطيئة عادة عندما يحاول React Native تصيير شاشة جديدة في حين أنه ما زالت تُنفَّذ تحريكات في الخلفية. لتفادي حالات مثل تلك المذكورة أعلاه، يسمح مدير التفاعلات (InteractionManager) بجدولة الأنشطة التي تأخذ وقتًا في التنفيذ بجدولتها بعد تنفيذ تحريك أو تفاعل في خيط جافاسكريبت. تحريك التخطيطات Layouts تعمل واجهة التطبيقات البرمجية LayoutAnimation على تحريك الشاشة تلقائيًّا إلى الوضعية الموالية عندما يحدث التخطيط (Layout) الموالي. تُنفَّذ واجهة التطبيقات تلك ضمن خيط واجهة المستخدم (UI Thread) وهو ما يجعلها ذات أداء عال. تُطبَّق التحريكات المعدَّة عن طريق LayoutAnimation، فور استدعائها، على كل المكوّنات؛ بخلاف واجهة Animated التي يمكنك عن طريقها التحكّم في القيم المخصوصة بتحريكها. يمكن لواجهة LayoutAnimation تحريك كل شيء في التصيير القادم، لذا يجب استدعاؤها قبل استدعاء setState. يضمن إعداد تحريك للتخطيط قبل استدعاء setState تحريكات سلسة في خيط Native ويحول دون تأثر التحريكات بتنفيذ شفرة برمجية عند إطلاق دور setState أخرى (وهو ما يتسبّب - في الظروف العادية - في تهديد تحريكات تطبيقك). توجد طريقة أخرى لاستخدام LayoutAnimation وتتمثّل في استدعائها داخل التابع WillReceiveProps. استدع بكل بساطة التابع LayoutAnimation.configureNext مع تمرير الوسائط المناسبة لإعداد التحريك، كما هو موضَّح أدناه: LayoutAnimation.configureNext(animationConfiguration, callbackCompletionMethod); this.setState({ stateToChange: newStateValue }); لا تدعم واجهة LayoutAnimation سوى خاصيّتين هما الشفافية (Opacity) وقابلية التكيّف (Scalability). تتعرّف الواجهة على العروض (Views) باستخدام مفاتيحها الفريدة وحساب وضعيّتها المتوقّعة. علاوة على ذلك، تحرّك تغيّرات الإطارات ما دام العرض يحتفظ بالمفتاح نفسه بين تغيّر الحالات. تعمل التحريكات المطبَّقة بواسطة LayoutAnimation ضمن الخيط الأصلي لواجهة المستخدم في نظام التشغيل، وهو أمر جيّد من ناحية الأداء، إلّا أنه يمثّل تحديًّا إذا دعت الحاجة لتحريك كل الخاصيّات بين حالات الإطارات. خاتمة لا يدخل هذا المقال في تفاصيل التحريكات في React Native ويكتفي بأمور سطحية، إلّا أن هناك قاعدة أساسية عند التعامل مع إطار العمل React Native وهي استخدام واجهة التطبيقات البرمجية Animated API ما دام ذلك ممكنا. بالنسبة لحركات اللمس، استخدم PanResponder بجانب Animated API. يمكن التغلّب على الكثير من المشاكل التي تواجهها بالاستفادة من مشغّل Native driver إلى جانب واجهة Animated. إنْ استمرّت مشاكل الأداء رغم ذلك فالزم LayoutAnimation. ترجمة - وبتصرّف - للمقال Getting started with React Native animations لصاحبه Rakshit Soral.
  16. يُغرَق عملاءك بمئات الرسائل كل يوم، في حين لم تصل معدلات الإزعاج من قبل ما وصلت إليه اليوم. رغم ذلك، استطاعت بضعة شركات، بطريقة أو بأخرى، التميز في صندوق البريد الوارد. اعتمد بعضها على البيانات لمراقبة سلوك المستهلكين وإرسال رسائل محفّزة بناءً على ذلك. ويستثمر آخرون في الإشهار التقليدي. بينما لا يزال البعض الآخر يصنع علامته التجارية مستخدمًا الكتابة الإعلانية. ليست هناك طريقة صحيحة ولكن هناك الكثير من الطرق الخاطئة. بغض النظر عن طريقتك – حيث يمكن للطرق الثلاث أن تُجدي نفعًا في أي مجال - هناك خط رفيع بين رسائل البريد الإلكتروني التي تحسّن تجربة العملاء والأخرى التي تضرّ بها. لنأخد Zazzle على سبيل المثال. منذ بضعة أشهر، كتبنا عن رسالتهم الممتازة لتأكيد الشحن. بدأت التجربة بداية صحيحة ولكن سرعان ما تطورت إلى سلسلة لا نهائية من الكوبونات والعروض الحصرية. (إن كنت لا تعلم، Zazzle هي منصة تمكنك من تخصيص القمصان والأكواب والقبعات وأي شيء آخر، كما أنها منصة تتيح للمصنعيّن والفنانين بيع منتجاتهم، وتستخدم الروبوتات لتصوير جميع منتجاتها). لقد تلقيت -يقول الكاتب- 243 رسالة إلكترونية خلال 251 يومًا منذ عملية الشراء الأولى و الوحيدة التي قمت بها. كانت لي تجربة رائعة مع موقعهم ولكن الآن، أنا غارق في العروض لكل شيء بدءًا من الوسائد و انتهاءً بحافظات الهواتف الذكية. رسائل بريدهم الإلكتروني تبدو رائعة ونصوصها ذكية، ولكن أثرها العام مؤذ. فلقد حوّلت Zazzle علامتها التجارية إلى سلعة. كيف يمكن لـ Zazzle تحسين إستراتيجية بريدها الإلكتروني؟ من السهل على من هو خارج الشركة تقديم نصيحة عامة مثل "إرسال بريد إلكتروني أقل". قدم Chris Hexton، و هو الرئيس التنفيذي لشركة Vero، وجهة نظر مثيرة للاهتمام، إد قال "إن كان هذا يحقق أرباحًا بالنسبة لشركة Zazzle، فهل يتوجب عليهم إرسال بريد إلكتروني أقل؟ وإن كان العامل الرئيسي لنموذج أعمالهم هو هذه الصفقات اليومية، إذًا ربما يمكن لهذه الإستراتيجية أن تكون فعّالة. ربما هي بالفعل أفضل أساليبهم". والحقيقة هي أنها أدّت عملها على نحو جيد. بلغ صافي أرباح الشركة 250 مليون دولار في سنة 2015، بزيادة 25% عن 2014. "كرهنا لنموذج أعمال لا يعني بالضرورة قدرتنا على أن نُجبِر بإتباع استراتيجية معينة" هذا ما ذكرني به Chris Hexton. وأكدّ تقرير لموقع قناة CNBC الإلكتروني أن شركة Zazzle "تقوم بعمل مجنون بحسب معيار وادي السيليكون والذي هو: جني الأرباح". لا يمكن لأي شركة تجارة إلكترونية – ربما باستثناء شركة Amazon - أن تتخلى عن الأرباح أثناء قيامها ببناء منصة أو جمهور أو علامة تجارية. مهما كانت طريقة Zazzle فمن الواضح أنها تعمل. ومع ذلك، فإن رسائل "النشر المكثّف أملًا في النتائج" اليومية ليست دائمًا أفضل طريقة لجذب العملاء. نحن نحب شركة Zazzle وفي الواقع نحن من عشاق الشركات الساعية للربح. لذا سنطرح هذا السؤال: كيف يمكن لشركة Zazzle إرسال بريد إلكتروني أقل وكسب المزيد من المال؟ إليك بعض الأفكار. استزد من معلومات العملاء واستخدمها بدأت بالبحث في حسابي على موقع الشركة، فوجدت أنني قادر على إكمال ملفي التعريفي. هذه المعلومات هي المفتاح لتحسين التسويق. ولكن لم يُطلب مني أبدًا إكمالها. اشتريت -يقول كاتب المقال- أول مرة من Zazzle لأنني أردت قميصًا ذا تصميم مخصص. شُحن وكنت عميلًا سعيدا. ولكن بعد بضعة أيام من شحن الطلبية، بدأت موجة رسائل البريد الإلكتروني. وبدأت على الفور (ولا شعوريًا) بتجاهل رسائلهم التسويقية. إنه لمن الذكاء الاستفادة من زخم عملية الشراء الأولى. لكن بدلًا من إخبار عملائها الجدد عن العرض الجديد، ماذا لو عرضت شركة Zazzle خصمًا بقيمة 5$ على عملية الشراء التالية مقابل الحصول على ملف تعريفي مكتمل؟ هذا من شأنه أن يتيح لهم الوصول إلى جنس العميل، والموقع، والعمر، وصفحاته الاجتماعية وغيرها. يمكن لبيانات كهذه أن تتيح فرصة لتحسين البريد الإلكتروني. تستخدم الكثير من شركات البرمجيات عند الطلب، مثل تويتر، زخم الاشتراك لجمع البيانات الديموغرافية الأساسية. ويمكن لشركات التجارة الإلكترونية مثل Zazzle استلهام هذه الأفكار منها. يمكن أن تقوم Zazzle بتخصيص رسائل البريد الإلكتروني استنادًا إلى سمات المستخدم. سيقدر العملاء في بوسطن مثلًا هذا القميص. هذا ليس تسويقًا إلكترونيًا يخاطب الأفراد بشكل شخصيّ ولكنها خطوة في الاتجاه الصحيح. العروض الشخصية أكثر إقناعًا من الخصومات الحصرية وتخفيضات نهاية الأسبوع. وكلما زادت معرفة Zazzle بعملائها، كلما كان تسويقها أكثر تركيزا. تخيل كم سيكون لطيفًا مفاجأة العملاء برسائل البريد الإلكتروني ذات الصلة بدلًا من إرهاقهم بالعروض. أتمتة رسائل المتابعة على أساس السلوك تُعد رسائل البريد الإلكتروني للتذكير والاستبقاء أساسًا لمعظم الحملات البريدية لشركات البرمجيات عند الطلب، ومع عدم وجود إيرادات عدة للاشتراك، تحتاج شركات التجارة الإلكترونية لقضاء المزيد من الوقت في التفكير في كيفية الاحتفاظ بالعملاء. هناك ثلاثة أنواع مختلفة من عدم النشاط: مبدئي، وجزئي ،وتامّ. تبدأ العلاقة بحدث مثل الشراء أو الاشتراك بالبريد الإلكتروني، ويجب أن يتلقى العملاء أنواعًا مختلفة من رسائل البريد الإلكتروني استنادًا إلى المدة التي كانوا فيها غير متفاعلين. في كل الأحوال، تعمل رسائل البريد الإلكتروني المعتمدة على السلوك جيّدًا لأن الحملات يمكن أن تبدأ أو تتوقف اعتمادًا على نشاط العملاء (أو عدمه). إليك أمثلة لكل منها. عدم النشاط المبدئي يقوم العميل بإجراء عملية شراء ولكن لا يستعرض أي منتجات إضافية خلال أسبوعين. اسعَ لإحراز مكسب صغير بطلبك منهم متابعتك على Pinterest، أو كتابة مراجعة للمنتج، أو التحقق من المنتجات ذات الصلة أو رؤية المنتجات الموجودة على المدونة. تعد Airbnb بمثابة مثال جيد فهي تسرد قوائم شائعة للعملاء غير المتفاعلين. إذا أظهر العملاء اهتمامًا بقائمة، يرسل الموقع رسالة بريدية محدّدة للمتابعة. كل شيء هنا مؤتمت. تولد الرسائل الإلكترونية المنسقة نشاطًا يمكن استخدامه لإرسال رسائل أكثر استهدافا. عدم النشاط الجزئي مع مرور الوقت دون تكرار للشراء، تنزع رسائل البريد الإلكتروني لتشمل إلحاحًا أكبر و خصوماتٍ أكثر. هذه أول طريقة للقيام بذلك. ولكن مع مزيد من البيانات، يصبح من السهل إرسال رسائل البريد الإلكتروني المستهدفة. خذ ProFlowers على سبيل المثال. آخذين في الحسبان أن معظم العملاء يشترون الهدايا، فهم يرسلون هذه التذكيرات المفيدة. لم أكن قد استخدمت ProFlowers لمدة سنة ولكن عند استلام هذا البريد الإلكتروني، قمت بعملية شراء أخرى. وهذا ما يسمى برسالة "تجديد الموارد" وهي واحدة من أكثر الطرق غير المستخدمة في تسويق التجارة الإلكترونية. تعد تحديثات المنتجات طريقة أخرى لإشراك العملاء غير النشطين جزئيا. إذا حدث شيء جديد أو مثير منذ آخر زيارة للعميل إلى موقعك، فأعلمه به عبر البريد الإلكتروني. عدم النشاط الكامل مع مرور الأشهر، يحين وقت تقديم عرض أخير و قول الوداع. يمكنك القيام ببريد "المحاولة اليائسة" لتقديم عرض مقنع حقا. لكن تذكر أن بريد "المحاولة اليائسة" لا يبرز إلّا إذا كنت قد خفضت من وتيرة رسائلك التسويقية، وإلا فستكون مجرد رسالة أخرى و ستضيع في المعمعة. استخدم المحتوى، لا المنتجات، لزيادة التفاعل لدى Evernote مشكلة. برامجها عبارة عن صفحة بيضاء يمكن استخدامها لكثير من الأشياء، ولكن كل عميل جديد يبدأ في نفس المكان: المربّع الأول. لدى Zazzle مشكلة مماثلة. لأنه يمكن للعملاء تخصيص المنتجات، والاحتمالات لا حصر لها. يمكن للمحتوى في هذه الحالة أن يوفّر الإلهام. يستخدم Evernote دراسات الحالة وتحديثات المنتج لشرح كيفية استخدام برامجها. تقوم Zazzle بفعل أمر مشابه على مدوّنتها على لوحات Pinterest، لكنّ هذا مخبأ في ذيل رسائل بريدها الإلكتروني. الهدف هو بيع المنتجات، وليس زيادة مشاهدات الصفحة. ولكن من الصعب أن تبيع لنفس العملاء كل يوم. يمكن للمحتوى التعمّق في الأحداث الموسمية، وتسليط الضوء على ما يفعله العملاء الآخرون وتوفير الإلهام البصري للديكور المنزلي والهدايا. تبدأ Evernote بالمحتوى ولكن تبيّن كيف يمكن للمنتج مساعدة المستخدمين على تحقيق أهدافهم. يوفر Spartan تمرينات يومية في قائمته البريدية. بدلًا من بيع المغامرة في السباقات في كل وقت، فإنها تشجع اللياقة البدنية، ثم تغري المستخدمين المشاركين بالانضمام للسباقات وغيرها من الأحداث. يمكن لتنويع المحتوى ضمن سيل رسائل Zazzle الإلكترونية أن يكسر رتابة رسائل المبيعات الكثيفة وأن يُشرك العملاء بطريقة جديدة. كما يدعم المحتوى المشاركة على مواقع التواصل الاجتماعي واكتشافها. وبالنسبة لشركات التجارة الإلكترونية، فهذا جزء من إستراتيجية التسويق المتوازن. ترجمة -وبتصرّف- للمقال You Don’t Have to Send So Many Emails لصاحبه JIMMY DALY.
  17. شكرًا لك، حدّثنا المقال وكانت معلوماته قديمة كما أشرت.
  18. ربما تفرح إذا رأيت إحصاءات الزيارات لموقعك الذي تعبت في تصميمه ليحوّل الزوار إلى عملاء، لكنّك تلاحظ أنّ أولئك الزوار لا يتحولون إلى عملاء لسبب ما. اكتشف الأسباب الكامنة وراء ذلك عبر هذا الدليل. تعدّ استمارة التواصل جزءًا مهمًا من رحلة الزوار داخل موقعك. حتى لو أقنعت الزوار بشراء المنتج الذي تبيعه فقد تأتي الاستمارة لتدمّر تجربتهم في الموقع إن كانت تحتوي على خطوات كثيرة ومحيّرة أو أزرار لا تعمل، أو إنْ كانت غير منظّمة، بل إن مكان تلك الاستمارة في الموقع قد يدمّر تجربة الاستخدام. سأشرح لك في هذا المقال ست قواعد لتصميم استمارة تواصل تشجع زوارك على التحوّل إلى عملاء، إذ توجد قواعد تكاد تكون ثابتة لضمان عمل الاستمارة على نحو سليم؛ فقد أظهرت دراسة لتتبع عين المستخدم من جوجل في 2014 أن اتّباع خطوط التصميم الأساسية يحسّن كثيرًا من تجربة الاستخدام، وللحديث بدقة أكبر، فإن 78% من المستخدمين أكملوا الاستمارة وأرسلوها من أول محاولة حين تلتزم تلك الاستمارة بالقواعد أدناه، بينما أكمل 42% منهم فقط الاستمارة لمّا لم تطبق بعضٌ من تلك القواعد. 1. المحاذاة يهتم الناس بطول الاستمارة التي يملؤونها، وبسبب هذا يلجأ المصممون إلى خيارات سيئة. مثلًا، قد ترى أن استمارة كالتي بالأسفل من موقع BrainTraffic طويلة نوعًا ما، وتحاول إصلاح مشكلة الطول هذه بجعل حقول الإجابة بجانب الأسئلة وليس أسفلها. إلّا أنّ خبراء تجربة المستخدم سيعترضون على هذا الحلّ، إذْ أنه يعرقل قراءة الاستمارة بسلاسة، وكذلك الأمر إنْ أردت أن تجعل الحقول بجانب بعضها أفقيا. عمومًا، ستحدث مشاكل في تجربة الاستخدام إن خالفت المنهج الرأسي في ترتيب حقول الاستمارة، فقد نُشرت سلسلة من القواعد العامة بشأن تصميم استمارات الويب سُمِّيَت "واجهات مستخدم بسيطة لكن مهمة في الويب: 20 قاعدة لتصميم استمارات ويب يمكن استخدامها"، وقد اعتمدت جوجل تلك القواعد في 2014 واختبرتها مع دراسة تتبع العين التي ذكرناها. وقد استنتجوا أن الاستمارات التي تمت محاذاتها إلى اليسار - في اللغة الإنجليزية - ووضعت حقولها فوق بعض بشكل رأسي كانت نتائجها أفضل من حيث تجربة الاستخدام. إليك الآن ما يجب أن تفعله كي تطبق قاعدة المحاذاة على استماراتك: اجعل كل الحقول وكذلك أزرار الإجراءات محاذية لليسار في حالة اللغة الإنجليزية، ولليمين في حالة العربية. لا تجعل الحقول التي تتعلق بجزء معين بجانب بعضها أفقيًا، يمكنك أن ترتّب الاستمارة على نحو منطقي من حيث ترتيب الموضوعات والأجزاء التي فيها، لكن كل سؤال أو حقل يجب أن يكون رأسيا. يجب أن تُعرَض الأسئلة متعدّدة الاختيارات (أقل من 6 خيارات) في قائمة رأسية من النقاط، وليس في قائمة منسدلة. وهو ما يحسّن تجربة الاستخدام، ويساعدك على ملء الهوة بين تجربة الاستخدام في الأجهزة المكتبية والأجهزة المحمولة، خاصة إن كنت تنوي تحديث مواقعك لتوافق دليل جوجل للتصميم من أجل الأجهزة المحمولة أولا. 2. أدرج كل الحقول التي لها علاقة قد تظن أن الاستمارة كلما كانت أقصر كانت أفضل، أليس كذلك؟ في الواقع ليس دائمًا، فالمهم أن تقدم للمستخدمين كل الحقول المطلوبة. قال مايكل أجارد، المسؤول عن تحسين معدلات التحويل في Unbounce، في كلمة له في 2015 أنه وفريقه أرادوا أن يعرفوا ما الذي سيحدث لو قصّروا استمارة التواصل التالية: فكما ترى، أزالوا ما اعتقدوا أنها حقول غير ضرورية من أجل تسريع عملية ملء الاستمارة، لكن بنهاية الاختبار اكتشفوا هبوطًا مقداره 14% في معدلات التحويل حين استخدموا القائمة القصيرة. ثم إنهم درسوا أي الحقول تفاعل معها المستخدمون في الاستمارة، عبر ترتيب الحقول في الاستمارة وإعادة صياغة النصوص الإرشادية والأسئلة في هذه الحقول لتكون أوضح، ثم أعادوا الاختبار ليجدوا 19% زيادة في التحويل. لكن هذه الطريقة قد لا تنجح دائمًا، فقد وجدت Expedia مثلًا أن حقلًا في استمارة التواصل بعنوان "الشركة" كان يحيّر المستخدمين رغم أنه لم يكن إجباريًا، إذ لم يفهم المستخدمون المراد منه ومن ثمّ كتبوا فيه معلومات خاطئة أدت إلى رفض عمليات الشراء التي قاموا بها، وقد أزالت Expedia هذا الحقل فزادت أرباحها 12 مليون دولار في العام التالي. أقترح عليك أن تبدأ بالحقول الأساسية أثناء تصميم استمارة التواصل، كما فعلت QuickBooks في الصورة التالية: وإن وجدت أن معدلات التحويل لا تتماشى مع التوقعات فارجع إلى الإحصاءات وانظر إن كانت تستطيع تحديد أي الحقول تمنع المستخدمين من إكمال الاستمارة. 3. تبسيط المُدخَلات يجب أن تكون الاستمارة جاهزة لتيسير إدخال البيانات بغض النظر إن كان مستخدموك يتفاعلون مع استمارتك باستخدام حاسوب مكتبي أو جهاز محمول، أو ما إن كانوا يحتاجون إلى تقنيات مساعِدة لملء هذه الاستمارة أم لا. إليك أمور يجب أن تعيها. الترتيب الآلي لمستخدمي الأجهزة المكتبية ومن يحتاجون أدوات مساعدة (قابلية الوصول)، تأكد من تفعيل الترتيب المنطقي للحقول، بحيث تنقل الاستمارة التركيز آليًا إلى الخطوة التالية. أقنعة الإدخال بدلًا من إجبار المستخدمين على تخمين الصيغة المناسبة لبعض الحقول، يمكنك أن تهيئها بنفسك لتحتوى على أقنعة إدخال (Input masks) تضع البيانات في صيغ جاهزة آليًا أثناء إدخال المستخدم للبيانات. وهذا النمط من التهيئة الآلية سيقود إلى نقرات أقل ومعدل إكمال أسرع للاستمارات، خاصة إن كان حقلًا مثل رقم الهاتف أو رقم بطاقة الائتمان مقسّمًا إلى حقول متعددة. أنواع الإدخال ستساعد أنواع الإدخال في html المستخدمين على أن يروا الخيارات المناسبة في لوحة المفاتيح أثناء كتابتهم على الهواتف، مما يوفر عليهم عناء كتابة كل شيء من الصفر (مثل com. للبريد). لاحظ كيف تتغير لوحة المفاتيح من استمارة التواصل في Elluminati بناءً على كل حقل. الإكمال الآلي لجوجل فعّل الإكمال الآلي من ملحق Address Autocomplete من جوجل بدلًا من كتابة شفرة مخصصة لكل حقل كي تهيئها وفق المعيار الذي تحتاجه، فهذا سيوفر عليك عناء التعامل مع الأخطاء النحوية والإملائية إضافة إلى العناوين التي لم تكتب بصورة صحيحة، كما ستريح زوارك من كتابة أغلب هذه المعلومات بأنفسهم. المنطق الظرفي (Conditional Logic) إن كنت قلقًا من طول استمارتك، خاصة إن كنت تستهدف عدة شرائح من المستخدمين، فيمكنك استخدام المنطق الظرفي لتقصيرها، فلن يظهر للمستخدم الجزء التالي في الاستمارة إلا إذا نقر على الخيار الخاص بحالته هو أو احتياجه، فتظهر له حينها الحقول المرتبطة بهذا الخيار، انظر الصورة التالية للتوضيح. توفّر أغلب ملحقات إنشاء الاستمارات، مثل Forminator، امتدادات لهذا الغرض. شريط التقدّم Progress Bar يشجّع هذا الشريط المستخدم على إتمام عملية التسجيل إذ يريه مكانه من نهاية الاستمارة بالتحديد. 4. أرشد المستخدم إلى تصحيح الخطأ بوضوح أدرك أني أبدو وكأني أجرك إلى تبني البساطة في استمارتك منذ أول المقال، وأن القاعدة التي نحن بصددها تخالف هذا الاتجاه، لكني أريدك أن تعطيها سمعك وعقلك لأهميتها الشديدة، وسأشرح لك الآن ما أقصد. لنقل إن لديك استمارة تواصل سهلة وبسيطة، وملأها المستخدم بناء على ما تقترحه عناوين الحقول ثم ضغط على زر الإرسال فخرجت له تلك الرسالة الحمراء المزعجة التي تقول له لقد أخطأت!عد مرة أخرى وأصلح المدخلات الخاطئة ثم أعد الإرسال. ولعلك قابلت مثل تلك الحالة بنفسك وتعرف كمّ الضيق الذي يصيبك حينها، خاصة حين تمحو بعض البيانات بعد رسالة الخطأ رغم أنك أدخلتها بالفعل. وهكذا، بدلًا من ترك المستخدم يخمّن ما الذي يجب إصلاحه وكيف، تقدّم أنت خطوة وفصّل كل شيء بوضوح أثناء إدخال المستخدم للبيانات كما يلي: زوّد استمارتك بخاصية التركيز الآلي للحقول (Field Focus)، خاصة على الهواتف، كي يعرف المستخدم مكانه بالتحديد أثناء ملء الاستمارة. اكتب أي شروط لصياغة النصوص داخل كل حقل إن لم تستخدم أقنعة الإدخال. بيّن بوضوح أي حقل يمكن تجاوزه (غير إلزامي)، واستخدم الكلمة في ذلك بوضوح عوضًا عن الاكتفاء بالنجمة الصغيرة. امنح المستخدم القدرة على إظهار أو إخفاء حقل كلمة السر أثناء إدخاله. أظهر رسالة خطأ بمجرد حدوثه، ولا تنتظر حتى نهاية إدخال المستخدم للبيانات وانتقاله إلى ما بعده كي تظهرها له. توضح هذه الاستمارة من Hubspot الطريقة الصحيحة لمعالجة أخطاء المستخدم في استمارة التسجيل. تابَعتْ جوجل في دراستها عن تتبع عين المستخدم مع نفس المستخدمين الذين أجروا الاختبار، ووجدوا أنهم اشتكوا من غياب الصياغة المناسبة في الحقول، فتقترح جوجل الآن أن تضع إرشادات واضحة في الاستمارة، ورسائل خطأ واضحة، ويجب أن تحدد الحقول التي بها أخطاء، وتلوّن نص الرسالة وتبرزه ولا تكتفي برسالة بخط أحمر فقط. 5. تجنب النصوص الإرشادية داخل الحقول تبدو النصوص الإرشادية التي تستخدم داخل الحقول كالتالي: لا تزال هذه الاستمارة من شركة Target تحتوي مشاكل بالنسبة لمن يحتاجون لأدوات مساعدة في القراءة (قابلية الوصول)، رغم إصلاح مشاكل متعلّقة بالنصوص الإرشادية. أرأيت كيف وضعَت شركة Target النصوص الإرشادية داخل الحقول في الصورة السابقة؟ تختفي هذه النصوص حين ينقر المستخدم داخل الحقل، وتعالج Target هذه المشكلة بأنْ تنقل النص الإرشادي إلى أعلى إطار الحقل (انظر مثلًا email address في الصورة). وبرغم هذا فإن خبراء تجربة الاستخدام، مثل مجموعة Norman، يقولون إن هذا الأسلوب سيء في تصميم تجربة استخدام للاستمارات، وإليك أسبابًا تبيّن المشاكل التي قد تطرأ من اتّباع ذلك الأسلوب: بالنسبة للمستخدمين الذين يعملون على مهام أخرى أثناء إدخال البيانات أو يفقدون تركيزهم بسهولة أو ينتقلون بسرعة إلى الحقول التالية، فإن هذا الأسلوب يمثل مشكلة لهم، إذ يضطرون إلى العودة للخطوة السابقة في كل مرة من أجل رؤية ما كان مكتوبًا في الحقل قبل أن ينتقلوا إليه. النصوص الإرشادية التي تختفي تمنع المستخدم من العودة للتأكد إن كان قد أدخل بيانات صحيحة أم لا، لأنه لن يرى ما كان مكتوبًا للإيضاح إذ اختفى بعد إدخال البيانات. النص المكتوب بلون رمادي خفيف لا يُقرأ بسهولة. قد يخطئ المستخدم ويترك الحقول التي بها نصوص إرشادية فارغة ظنًا منه أنه أدخل البيانات فيها بالفعل، فيتركها ويرسل الاستمارة فتظهر له رسائل خطأ. بعض برامج قراءة الشاشة لا تستطيع قراءة النص الإرشادي المكتوب داخل حقول الاستمارة. ينجذب المستخدم - وفقًا لمجموعة نورمان التي ذكرتها قبل قليل - إلى الحقول الفارغة أكثر من تلك التي تحتوي نصوصًا إرشادية، وقد تخشى أن تطول استمارتك بسبب وضع اللصائق والإرشادات، لكن اعلم أن تجربة الاستخدام ستتحسن كثيرا. 6. انتبه إلى تصميم الأزرار احرص دائمًا على محاذاة زر الإجراء الرئيسي مع باقي حقول الاستمارة حتى لو لم يبدُ ذلك منطقيًا، فإن كان لديك مثلًا زر "التالي" و"رجوع" فيجب أن يكون زر التالي محاذيًا لبداية حقول الاستمارة (أقصى اليمين في حالة اللغة العربية، والعكس في حالة اللغة الإنجليزية)، إذ أنه المكان الذي سينظر فيه المستخدم افتراضيًا حين يصل إلى تلك الخطوة. تجنب أيضًا استخدام أزرار مثل "إعادة تعيين – مسح – إلغاء"، ذلك أن المستخدم ينقر على أول زر يراه دون تفكير ظنًا منه أنه زر الإرسال، ولو حدث ذلك ومُحيَت جميع البيانات التي أدخلها من قبل فقد يترك موقعك كلية دون أن يسجل فيه أو يشترك. وقد وُجد في اختبار أ/ب أسفله من Unbounce، أن النسخة التي بها نص يعرض القيمة التي سيحصل عليها المستخدم من تسجيله كانت أكثر نجاحًا أكثر في معدلات التحويل من النسخة الأولى بنسبة 31%. أخيرًا، استخدم علامات التوثيق متى كان ذلك مناسبًا، ولديك مثال على ذلك في الرسالة التي تقول إنك لا تحتاج إلى التسجيل ببطاقة ائتمان في الاستمارة أدناه من CoSchdual، إذ أنها تشجع المستخدم على التسجيل. لكن احذر أن تستخدم علامات التوثيق في غير محلها حتى لا يظن المستخدم أن عليه تقديم بيانات حساسة في حين أنك قد لا تطلب ذلك منه، كما هو موضح في الاختبار التالي: بينما تظن أن شعار TRUSTe قد يزيد من معدل التسجيل والتحويل، إلا أن النسخة على اليمين حصلت على معدل يزيد ب 13% في معدل إكمال الاستمارة، إذ اعتقد المستخدمون في النسخة اليسرى أنهم قد يضطروا إلى إدخال بيانات خاصة أو دفع أموال عبر ذلك الموقع. خاتمة لا أقول في هذا المقال أن استمارات التواصل على قالب واحد يمكن استخدامه لكل الحالات في السوق، فكل موقع، وكذلك الشركة التي يتبع لها الموقع، لديه أهداف مختلفة، ومن ثم فإن استمارات التواصل فيه يجب أن تخدم تلك الأهداف خاصة. لتنفيذ الخطوات التي ذكرناها في هذا المقال تحتاج إلى أحد أمرين، إما أن تستخدم ملحقًا جاهزًا يعينك على إنشاء استمارة مخصصة، أو أن تصمم استماراتك الخاصة، و تذكّر، أياً كان ما تختاره، أنّ المستخدم لا يخشى -ضرورة - الاستمارة الطويلة، وأن الأمر يتعلق بتجربته مع الاستمارة أكثر من طولها. ترجمة - وبتصرف - للمقال 6 Unbreakable Rules for Building the Perfect Contact Form لصاحبته Suzanne Scacca.
  19. كتاب «البرمجة بلغة بايثون» والسبب في ترشيحه: - حداثة المعلومات التي فيه وعدم إعطاء الإصدار 2 من بايثون الذي توقف دعمه الكثير من الأهمية - تكامله مع توثيق بايثون باللغة العربية في موسوعة حسوب، فإن احتاج القارئ إلى معرفة تفاصيل أوسع عن صنف أو أي قسم من اللغة، فالرابط موجودة لينقله إلى الجزء المطلوب من توثيق بايثون باللغة العربية أيضًا.\ - ترتيب الفصول يناسب المبتدئين المقبلين على تعلم البرمجة والتقدم في المستوى تدريجيًا حتى يتطرق إلى مفاهيم متقدمة مثل الوراثة والتعددية الشكلية Polymorphism بأسلوب بسيط - الاعتماد على الأمثلة العملية الغزيرة في الشرح
  20. القواعد الأساسية لا تضع إلا مكوِّن React واحدًا فقط في كل ملف. مع ذلك، يُسمح بوضع أكثر من مكوّن من الدوال عديمة الحالة (Stateless functions) في ملف واحد. استعن بقاعدة react/no-multi-comp في ESLint. استخدم دائمًا أسلوب الصياغة JSX. لا تستخدم التابع React.createElement إلا إذا كنت تهيئ التطبيق من ملف لا يستخدم صياغة JSX. Class مقابل React.createClass مقابل stateless استخدم class extends React.Component بدلًا من React.createClass إذا كانت لديك حالة أو مراجع (Refs) داخلية أو هما معًا. // سيّئ const Listing = React.createClass({ // ... render() { return <div>{this.state.hello}</div>; } }); // جيّد class Listing extends React.Component { // ... render() { return <div>{this.state.hello}</div>; } } أما إذا لم تكن لديك حالة داخلية أو مرجعية، فمن الأفضل استخدام الدوال العادية (وليس الدوال السهمية) بدلًا من استخدام الأصناف. // سيّئ class Listing extends React.Component { render() { return <div>{this.props.hello}</div>; } } // سيّئ (يُنصَح بعدم الاعتماد على استنباط اسم الدالة) const Listing = ({ hello }) => ( <div>{hello}</div> ); // جيّد function Listing({ hello }) { return <div>{hello}</div>; } الخلائط (Mixins) تجنب استخدام الخلائط. لماذا؟ لأنها تنطوي على اعتمادات (Dependencies) ضمنية، كما قد تتسبب في اشتباك الأسماء، وترفع درجة التعقيد. يمكن استبدال الخلائط في معظم الحالات بطرق أفضل عبر المكوّنات (Components)، أو المكوّنات ذات المستوى العالي (Higher-order components) أو الوحدات المساعدة. التسمية الامتدادات: استخدم الامتداد jsx. لمكوّنات React . اسم الملف: استخدم أسلوب التسمية PascalCase لأسماء الملفات. على سبيل المثال، ReservationCard.jsx. تسمية المراجع: استخدم أسلوب التسمية PascalCase لمكوّنات React وأسلوب camelCase لنسخ الكائنات (Instances). // سيّئ import reservationCard from './ReservationCard'; // جيّد import ReservationCard from './ReservationCard'; // سيّئ const ReservationItem = <ReservationCard />; // جيّد const reservationItem = <ReservationCard />; تسمية المكوّنات: استخدم اسم الملف كاسم للمكوّن. على سبيل المثال، ReservationCard.jsx ينبغي أن يكون اسم مرجعها ReservationCard. بالنسبة للمكوّنات الجذرية للمجلد (Root components)، استخدم index.jsx لاسم للملف واستخدم اسم المجلد لاسم المكوّن: // سيّئ import Footer from './Footer/Footer'; // سيّئ import Footer from './Footer/index'; // جيّد import Footer from './Footer'; تسمية المكوّنات ذات المستوى العالي (Higher-order Componen): استخدم مزيجًا من اسم المكوّن ذي المستوى العالي واسم المكوِّن المُمرَّر ليكون قيمة الخاصيّة displayName في المكوّن المُولَّد.على سبيل المثال، إذا مُرّر للمكوّن ذي المستوى العالي ()withFoo المكوّن Bar فإن الناتج ستكون قيمة الخاصيّة displayName لديه هي withFoo(Bar). لماذا ا؟ يمكن استخدام الخاصيّةdisplayName في أدوات المطوّرين أو في رسائل الخطأ، وعندما تعكس قيمتها تلك العلاقة بوضوح، فسيساعد ذلك على فهم ما يحدث. // سيّئ export default function withFoo(WrappedComponent) { return function WithFoo(props) { return <WrappedComponent {...props} foo />; } } // جيّد export default function withFoo(WrappedComponent) { function WithFoo(props) { return <WrappedComponent {...props} foo />; } const wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || 'Component'; WithFoo.displayName = `withFoo(${wrappedComponentName})`; return WithFoo; } تسمية الخاصيّات (Props) : تجنب استعمال أسماء مكوّنات DOM لأغراض مختلفة. لماذا؟ يتوقع المطوّرون أنّ خاصيّات مثل style وclassName تعني أشياء محددة. تغيير الواجهة البرمجية هذه في جزء من تطبيقك يجعل الشفرة البرمجية أقل قابلية للقراءة والصيانة، ويمكن أن يتسبب في أعطاب. // سيّئ <MyComponent style="fancy" /> // جيّد <MyComponent className="fancy" /> // جيّد <MyComponent variant="fancy" /> التصريح Declaration لا تستخدم displayName لتسمية المكوّنات. بدلًا من ذلك، سمّ المكوّنات بمراجعها. // سيّئ export default React.createClass({ displayName: 'ReservationCard', // stuff goes here }); // جيّد export default class ReservationCard extends React.Component { } المحاذاة Alignment اتبع الأساليب التالية للمحاذاة في صياغة JSX. استعن بقاعدتيْ react/jsx-closing-bracket-location وreact/jsx-closing-tag-location في ESLint. // سيّئ <Foo superLongParam="bar" anotherSuperLongParam="baz" /> // جيّد <Foo superLongParam="bar" anotherSuperLongParam="baz" /> // if props fit in one line then keep it on the same line <Foo bar="bar" /> // children get indented normally <Foo superLongParam="bar" anotherSuperLongParam="baz" > <Quux /> </Foo> الاقتباس Quotes استخدم دائمًا علامات الاقتباس المزدوجة (") لخاصيّات JSX، وعلامات الاقتباس المفردة (') لبقية عناصر جافاسكريبت. استعن بقاعدة jsx-quotes في ESLint. لماذا؟ تستخدم خاصيّات HTML عادةً علامات الاقتباس المزدوجة بدلًا من المفردة، لذا فخاصيّات JSX تتبع هذا الاصطلاح. // سيّئ <Foo bar='bar' /> // جيّد <Foo bar="bar" /> // سيّئ <Foo style={{ left: "20px" }} /> // جيّد <Foo style={{ left: '20px' }} /> إدراج المسافات Spacing أضف دائمًا مسافةً واحدةً في الوسوم المنغلقة على ذاتها (Self-closing tags). استعن بالقاعدتين no-multi-spaces وreact/jsx-tag-spacing. // سيّئ <Foo/> // سيّئ جدًّا <Foo /> // سيّئ <Foo /> // جيّد <Foo /> لا تحش أقواس JSX المعقوصة بمسافات. استعن بالقاعدة react/jsx-curly-spacing. // سيّئ <Foo bar={ baz } /> // جيّد <Foo bar={baz} /> الخاصيات Props استخدم دائمًا أسلوب التسمية camelCase لتسمية الخاصيّات. // سيّئ <Foo UserName="hello" phone_number={12345678} /> // جيّد <Foo userName="hello" phoneNumber={12345678} /> احذف قيمة الخاصيّة عندما تكون قيمتها تساوي true على نحو صريح. استعن بالقاعدة react/jsx-boolean-value. // سيّئ <Foo hidden={true} /> // جيّد <Foo hidden /> // جيّد <Foo hidden /> أضف دومًا الخاصيّة alt في وسوم الصور(<img>). إذا كانت الصورة تقديمية (Presentational)، فيمكن للخاصيّة alt أن تكون نصًّا فارغًا وإلّا فيجب أن يحتوي الوسم <img> على الخاصيّة ‎role="presentation". // سيّئ <img src="hello.jpg" /> // جيّد <img src="hello.jpg" alt="Me waving hello" /> // جيّد <img src="hello.jpg" alt="" /> // جيّد <img src="hello.jpg" role="presentation" /> لا تستخدم كلمات مثل "image" أو "photo " أو "picture" أو "صورة" في خاصيّات alt الخاصة بوسوم <img>. استعن بالقاعدة jsx-a11y/img-redundant-alt. لماذا؟ تعلم برامج قراءة الشاشة أن <img> تعني صورة، لذلك لا توجد حاجة لإدراج هذه المعلومة في النص البديل (alt text). // سيّئ <img src="hello.jpg" alt="صورة مني وأنا أشير بيدي للترحيب" /> // جيّد <img src="hello.jpg" alt="أشير بيدي للترحيب" /> لا تستخدم إلّا أدوار ARIA الصالحة وغير المجردة. استعن بالقاعدة jsx-a11y/aria-role. // سيّئ، ليس من أدوار ARIA <div role="datepicker" /> // سيّئ، دور ARIA مجرّد <div role="range" /> // جيّد <div role="button" /> لا تستخدم الخاصيّة accesskey على العناصر. استعن بالقاعدة jsx-a11y/no-access-key. لماذا؟ تعقّد التناقضات بين اختصارات لوحة المفاتيح وأوامر لوحة المفاتيح التي يستعملها مَن يستخدمون برامج قراءة الشاشة ولوحة المفاتيح، تعقّد قابلية الوصول (Accessibility). // سيّئ <div accessKey="h" /> // جيّد <div /> تجنب استخدام فهرس مصفوفة (Array index) ليكون خاصيّة key. استخدم معرّفًا فريدًا بدلًا من ذلك. (لماذا؟). // سيّئ {todos.map((todo, index) => <Todo {...todo} key={index} /> )} // جيّد {todos.map(todo => ( <Todo {...todo} key={todo.id} /> ))} عرّف دائمًا قيمًا افتراضيّة (defaultProps) للخاصيّات غير المطلوبة. لماذا؟ تعدّ القيم الافتراضيّة وسيلة للتوثيق، وتوفيرها سيجنّب قارئ الشفرة البرمجية كثيرًا من التخمينات. علاوةً على ذلك، قد يعني تعيين القيم الافتراضية أنك تستطيع الاستغناء عن التحقق في نوع البيانات أحيانا. // سيّئ function SFC({ foo, bar, children }) { return <div>{foo}{bar}{children}</div>; } SFC.propTypes = { foo: PropTypes.number.isRequired, bar: PropTypes.string, children: PropTypes.node, }; // جيّد function SFC({ foo, bar, children }) { return <div>{foo}{bar}{children}</div>; } SFC.propTypes = { foo: PropTypes.number.isRequired, bar: PropTypes.string, children: PropTypes.node, }; SFC.defaultProps = { bar: '', children: null, }; لا تُسرف في استخدام الخاصيّات الممدَّدة (Spread props). لماذا؟ لكي تتجنب قدر الإمكان تمرير الخاصيّات التي لا داعي لها إلى المكوّنات. بالنسبة للإصدار React v15.6.1 والإصدارت الأقدم، ستتجنب كذلك تمرير سمات HTML غير صالحة إلى نموذج DOM. استثناءات: المكوّنات ذات المستوى العالي التي تغلّف الخاصيّات وترفع الخاصيّة propTypes إلى أعلى النطاق (Hoist): function HOC(WrappedComponent) { return class Proxy extends React.Component { Proxy.propTypes = { text: PropTypes.string, isLoading: PropTypes.bool }; render() { return <WrappedComponent {...this.props} /> } } } تمديد الكائنات بخاصيّات معروفة وواضحة يمكن أن يكون مفيدًا خصوصًا عند اختبار مكوّنات React بالتركيب forEach في Mocha. export default function Foo { const props = { text: '', isPublished: false } return (<div {...props} />); } ملحوظة: حاول تصفية الخاصيّات التي لا داعي لها، واستخدم prop-types-exact لمساعدتك على تجنب العلل. // جيّد render() { const { irrelevantProp, ...relevantProps } = this.props; return <WrappedComponent {...relevantProps} /> } // سيّئ render() { const { irrelevantProp, ...relevantProps } = this.props; return <WrappedComponent {...this.props} /> } المرجعيّات Refs استخدم دائمًا رد نداء (Callback) للمراجع (Refs). استعن بالقاعدة react/no-string-refs. // سيّئ <Foo ref="myRef" /> // جيّد <Foo ref={(ref) => { this.myRef = ref; }} /> الأقواس ضع وسوم JSX بين أقواس إذا امتدت على أكثر من سطر واحد. استعن بالقاعدة react/jsx-wrap-multilines. // سيّئ render() { return <MyComponent variant="long body" foo="bar"> <MyChild /> </MyComponent>; } // جيّد render() { return ( <MyComponent variant="long body" foo="bar"> <MyChild /> </MyComponent> ); } // جيّد، بالنسبة لسطر واحد render() { const body = <div>hello</div>; return <MyComponent>{body}</MyComponent>; } الوسوم Tags استخدم دائمًا الإغلاق الذاتي (Self-close) للوسوم التي لا أبناء لها. استعن بالقاعدة react/self-closing-comp. // سيّئ <Foo variant="stuff"></Foo> // جيّد <Foo variant="stuff" /> اجعل إغلاق الوسوم في سطر جديد إذا كان للمكوّن خاصيّات متعددة الأسطر. استعن بالقاعدة react/jsx-closing-bracket-location. // سيّئ <Foo bar="bar" baz="baz" /> // جيّد <Foo bar="bar" baz="baz" /> التوابع Methods استخدم الدوال السهمية في المتغيرات المحلية. function ItemList(props) { return ( <ul> {props.items.map((item, index) => ( <Item key={item.key} onClick={() => doSomethingWith(item.name, index)} /> ))} </ul> ); } اربط معالجات الأحداث الخاصّة بتابع التصيير (Render methode) داخل المنشئ. استعن بالقاعدة react/jsx-no-bind. لماذا؟ استدعاء bind في مسار التصيير (Render path) يُنشئ دالة جديدة لكل تابع تصيير. // سيّئ class extends React.Component { onClickDiv() { // do stuff } render() { return <div onClick={this.onClickDiv.bind(this)} />; } } // جيّد class extends React.Component { constructor(props) { super(props); this.onClickDiv = this.onClickDiv.bind(this); } onClickDiv() { // do stuff } render() { return <div onClick={this.onClickDiv} />; } } لا تستخدم الشرطة السفلية (_) في بداية أسماء التوابع الداخلية لمكوّنات React . لماذا؟ تُستخدَم الشرطات السفلية في بداية أسماء المتغيّرات في لغات أخرى للدلالة على الخصوصية. ولكن، خلافًا لتلك اللغات، لا يوجد دعم أصيل للخصوصية في جافاسكريبت، فكل شيء فيها عام. إضافة شرطة سفلية في بداية أسماء الخاصيات، بغض النظرعن نواياك، لا يجعلها خاصة، ويجب أن تُعامَل كل الخاصيات (مسبوقة بالشرطة السفلية أو لا) على أنها عامة. انظر إلى النقاش حول 1024# وenter link description here للتعمّق. // سيّئ React.createClass({ _onClickSubmit() { // do stuff }, // other stuff }); // جيّد class extends React.Component { onClickSubmit() { // do stuff } // other stuff } تأكد من إرجاع قيمة في توابع التصيير. استعن بالقاعدة react/require-render-return. // سيّئ render() { (<div />); } // جيّد render() { return (<div />); } الترتيب Ordering الترتيب عند تمديد الصنف React.Component لإنشاء مكوّن React جديد (class extends React.Component): التوابع الثابتة (static) الاختيارية، constructor getChildContext componentWillMount componentDidMount componentWillReceiveProps shouldComponentUpdate componentWillUpdate componentDidUpdate componentWillUnmount معالجات الأحداث والنقر مثل ‎onClickSubmit‎()‎ أو ‎onChangeDescription‎()‎ توابع الوصول الخاصة بـ render مثل getSelectReason()‎ أو getFooterContent()‎ توابع render الاختيارية مثل renderNavigation()‎ أو renderProfilePicture()‎. render. كيفية تعريف propTypes وdefaultProps وcontextTypes import React from 'react'; import PropTypes from 'prop-types'; const propTypes = { id: PropTypes.number.isRequired, url: PropTypes.string.isRequired, text: PropTypes.string, }; const defaultProps = { text: 'Hello World', }; class Link extends React.Component { static methodsAreOk() { return true; } render() { return <a href={this.props.url} data-id={this.props.id}>{this.props.text}</a>; } } Link.propTypes = propTypes; Link.defaultProps = defaultProps; export default Link; • الترتيب الخاص بـ React.createClass. استعن بالقاعدة react/sort-comp. displayName propTypes contextTypes childContextTypes mixins statics defaultProps getDefaultProps getInitialState getChildContext componentWillMount componentDidMount componentWillReceiveProps shouldComponentUpdate componentWillUpdate componentDidUpdate componentWillUnmount معالجات الأحداث والنقر مثل ‎onClickSubmit‎()‎ أو ‎onChangeDescription‎()‎ توابع الوصول الخاصة بـ render مثل getSelectReason()‎ أو getFooterContent()‎ توابع render الاختيارية مثل renderNavigation()‎ أو renderProfilePicture()‎. render لا تستخدم isMounted. استعن بالقاعدة react/no-is-mounted لماذا؟ استخدام isMounted غير مجدٍ (Anti-pattern)، وهو غير متوفر عند استخدام أصناف ES6، كما أنه سيُلغى رسميًّا قريبا. ترجمة - وبتصرّف - للمقال Airbnb React/JSX Style Guide.
  21. يعد ووردبريس رائعًا لإنجاز أمور معيَّنة، مبالغًا فيه بالنسبة لأمور وغير ملائم لأخرى. إذا كنت مطور ويب أو مالك موقع فالسؤال الجيد الذي يجب أن تطرحه على نفسك هو "متى يجب عليّ استخدام ووردبريس؟" . يعد ووردبريس، بوصفه (في أذهاننا) أعظم نظام لإدارة المحتوى في العالم،لإنجاز أمور معيَّنة، مبالغًا فيه بالنسبة لأمور وغير ملائم لأخرى. إنْ لم تعرف كنه كل واحد من تلك الأمور فيمكن أن ينتهي بك المطاف في وضع حرج. بمعنى آخر أنت أمام قرار لاتخاذه، والقرارات تعني شيئًا واحدًا: المخطّطات التدفقية (Flowcharts). يقوم مُخطّطنا التدفقيّ "متى نستخدم ووردبريس" بتحليل تجربتنا، بوصفنا متخصصين في ووردبريس ومطوري مواقع ويب من التصميم إلى الإطلاق والصيانة، لوصف أي نوع من المشاريع يتعين أن يستخدم ووردبريس وأيها يتعين عليه ألا يستخدمه، وما البدائل التي يمكن البحث عنها إذا لم يكن ووردبريس مناسبا. المصطلحات من خلال "ووردبريس" هنا، أقصد تثبيت ووردبريس من WordPress.org. يتوفّر برنامج ووردبريس الأساسي للتنزيل المجاني من WordPress.org؛ يمكنك بعد ذلك استخدام هذا البرنامج لإعداد موقع، وللقيام بذلك ستحتاج: استضافة، الحصول على اسم النطاق، شخص ماهر في ووردبريس لإنشاء الموقع. يمكن أن يقصد بكلمة "ووردبريس" أيضًا موقع WordPress.com الذي يتولى بدلًا منك الخطوات الثلاث المذكورة أعلاه، ولكن مع فقدان كثير من الحرية (في التصميم، اسم نطاق يتبع قواعد معيّنة، وما إلى ذلك). يوجد شبه إلى حد كبيربين WordPress.com وSquarespace وغيرها من منصات التدوين، لذا جمعناها معا. السؤال الحقيقي الذي نجيب عليه هنا هو إذن: "متى يجب علي استخدام WordPress.org؟". المخطط التدفقي إليك المخطط التدفقي لتجد الإجابة على سؤال: هل يجب أن أستعمل ووردبريس أم لا؟: الأمر بسيط، أليس كذلك؟ واصل القراءة إذا كانت لديك أسئلة أو تريد معرفة سبب استنتاجاتنا. متى لا تستخدم ووردبريس لبناء تطبيقات الويب المعقدة سرعان ما يصبح ووردبريس، رغم بعض الأدوات الجاهزة، عائقًا في التطبيقات المبنية على أنواع بيانات فريدة وشديدة الترابط. في ووردبريس يكون كل شيء تقريبًا "منشور". تعدّ "الصفحات" (Pages) و"المنشورات" (Posts، اسم مشوّش) أكثر "أنواع المنشورات" شيوعا. حتى إن الوسائط الإعلامية مثل الصورتُخزَّن فعليًا كـ "منشور" لا يحتوي على أي شيء سوى رابط الوسائط الإعلامية. إلى جانب أنواع المنشورات المُعرَّفة مسبقًا، والمذكورة أعلاه، يمكنك تعريف أنواع منشورات مخصصة جديدة بخاصياتها الخاصة: "الموظفين"، و"المنتجات"، و"الشهادات"، و"قوائم العقارات" وكل مايخطر ببالك. يمكن لكل نوع من المنشورات أن يحوي بيانات وصفية (Metadata) خاصة به ("الاسم" أو "الراتب" لمنشور من النوع "موظف"، "السعر" أو "الوزن" لمنشور من النوع "منتج"، وسر على ذلك النحو)، إلّا أنها في الواقع تُخزَّن وتُعرَض - في كل من قاعدة بيانات ولوحة تحكم ووردبريس - كأي منشور مدوَّنة تقليدي آخر. تجعل الطريقة المذكورة أعلاه ووردبريس خيارًا هشًّا لإنشاء تطبيقات الويب المعقَّدة. بالنظر إلى معظم تطبيقات الويب من وجهة نظر ووردبريس يظهر أنها ليست سوى أنواع منشورات مخصّصة. وبالنظر إلى عدسة الوردبريس فإن معظم تطبيقات الويب ليست سوى أنواع منشورات مخصصة. مثال دعنا نفكر في خدمة حجز عبر الإنترنت للأسفار مثل موقع TripAdvisor (المفضل لدي). ينبغي أن تخزن الخدمة: الرحلات الجوية وأسعارها، ومعلومات شركة النقل، ومعلومات الطائرات، والتوفر حسب التاريخ وحوالي ستين معلومة أخرى. الفنادق وأسعارها، والمواقع، وأوصاف الفنادق، والتوفر حسب التاريخ، وحوالي ستين معلومة أخرى. تأجير السيارات وأسعاره، والمواقع، وأوصاف السيارات، والتوفر حسب التاريخ، وحوالي ستين معلومة أخرى. … وحوالي ستين معلومة أخرى. هل نريد حقًا أن تكون كل وكالة لتأجير السيارات في بورتلاند مع أسطولها من السيارات المتاحة للتأجير، هل نريد أن تكون "منشورًا" من نوع المنشورات المخصّص "وكالة سيارات"، مكدَّسًا مع آلاف البيانات الوصفية وتُخزَّن بالطريقة نفسها التي يخزن بها ووردبريس منشورات المدونة؟ لا، لا نريد ذلك. رغم بعض الأدوات الجاهزة المفيدة (مثل سهولة إدارة المستخدمين، وإمكانية استخدام السمات والملحقات) إلّا أنّ ووردبريس سرعان ما يصبح عائقًا في التطبيقات المبنية على أنواع بيانات فريدة وشديدة الترابط. رأينا! هذا نقاش كبير وهناك الكثير من وجهات النظر حوله ولكن الأصوات التي أجدها أكثر عقلانية تعترف بأنه يجب عليك تغيير طبيعة ووردبريس بما يكفي (أو لنقل "العبث به" إذا كنت تفضّل هذا الوصف) لاستخدامه منصة مجهّزة لتطوير التطبيقات. أود أن أحاجج بأنه في معظم الحالات التي أنشئت فيها حقًّا تطبيقات ووردبريس ناجحة ومعدّة للتوسع، لم يكن الأمر يستحق كل ذلك العناء. لبناء تطبيقات الجوال المعقدة ربما يكون AppPresser هو الحل الأكثر شهرة لإنشاء تطبيقات أصيلة باستخدام ووردبريس. يقوم البرنامج بأمر مذهل وهو تحويل موقع ووردبريس إلى تطبيقات أصيلة لنظامي iOS وأندرويد. مرة أخرى قد يكون ذلك مفيدًا للحلول البسيطة مثل الترويج لموقعك البسيط للتجارة الإلكترونية من خلال متجر التطبيقات على iOS. لكن، إنْ كنت تريد بناء خليفة تطبيق الطيور الغاضبة (Angry Birds)، أو حتى عداد خطوات رياضتك اليومية، فإن البنية الحالية لووردبريس بالإضافة إلى صعوبة ترجمة موقع ووردبريس إلى لغة وبيئة تطبيق فمن المرجح أن يعد الأمر عناءً خالصا. من أجل بناء الأشياء البسيطة جدًا إذا كان هدفك بسيطًا جدًّا، فالزم بنية تحتية في منتهى البساطة. إذا لم تكن من مطوري ووردبريس فستجد أنّ تثبيت موقع WordPress.org مخصّص أكثر صعوبة وتكلفة من إعداد مدونة WordPress.com، أو موقع Squarespace، أو Tumblr، وما إلى ذلك. لذا إذا كان لديك هدف بسيط جدًّا - مثل التدوينات القصيرة ذات الوسائط المختلطة غير المنتظمة - فربما يمكنك استخدام تلك البنى التحتية البسيطة. لدى Tumblr، وإنستاغرام وما شابهها ميزات تواصل اجتماعي جاهزة للاستخدام لا تتوفر عليها مواقع WordPress.org. لا يعد WordPress.org أسهل طريقة لإعداد صفحات الهبوط لاختبار الأفكار الأولية (إلّا إذا كنت مطور ووردبريس)، على الرغم من أنه يعدّ أسهل طريقة لإعداد مواقع اختبار بسيطة وجذابة. متى تستخدم ووردبريس؟ بالنسبة للمواقع التقليدية (التي ليست تطبيقات) فرأينا أن ووردبريس هو الحل المناسب في غالبية الحالات. هل يعني ما سبق أن ووردبريس غير مناسب لمعظم الحالات؟ حسنًا، من الصحيح أن المربعات ذات اللون الأزرق الغامق الأنيق أكثر بكثير في المخطّط التدفقي من تلك التي تظهر باللون الأخضر. صحيح أيضًا أن معظم ما تقوم به على الإنترنت لا يستحق موقع ويب على استضافة مستقلة. إذا كان هدفك هو مجرد نشر صور للهواية فلم لا تستخدم Tumblr أو إنستاغرام؟ ولكن بالنسبة للمواقع التقليدية فإننا نؤكد أن ووردبريس يعدّ الحل الصحيح في معظم الأوقات. دعونا ننظر مرة أخرى إلى المخطّط التدفقي: هل صُمّم موقعك أساسًا لعرض المعلومات؟ معظم مواقع الويب هي كذلك: من قائمة طعام المطعم وساعات افتتاحه، إلى إستراتيجية شركة وشهادات عملائها، إلى أحدث مقالات على مجلة. هل تحتاج إلى موقع ويب مرن وقابل للتوسع، موقع ينمو معك؟ تلك هي حال معظم أصحاب المواقع التقليدية. يريد أصحاب المواقع أن يكونوا قادرين على تحديد عناصر التصميم بدقة، وأن يعملوا باسم نطاق مختلف عن name.service.com، وأن يرقّوا استضافتهم حسب رغبتهم. ويوما ما قد يرغبون في تبديل نظام التعليقات الخاص بهم، أو إضافة متجر إلكتروني، أو تضمين رقعة شطرنج على الموقع… والقائمة تطول. يمثّل الأشخاص الذين أجابوا بنعم على هذين السؤالين معظم من يحتاجون، في المقام الأول، إلى مواقع ويب. هم أشخاص يريدون مشاركة أمر يهتمون به، ويودون السيطرة الكاملة على المشروع وفي الوقت نفسه المرونة لتطويره بسهولة. ينطبق هذا الأمر على أي شخص، من مخبز الحي إلى وكالة ناسا، ويتعين في هذه الحالة استخدام ووردبريس. أيضا التجارة الإلكترونية أضيف ملاحظة أخيرة وهي أنّ حلول ووردبريس الأفضل للتجارة الإلكترونية (ملحق Easy Digital Downloads للمتاجر التي تبيع المنتجات الرقمية حصرًا، وملحق ووكومرس لأي نوع آخر من المنتجات) تعدّ جيدة بما فيه الكفاية لتكون الخيار المبدئي لأي متجر بمبيعات تقل عن مليون دولار سنويا. لماذا تعيين هذا الحد الأعلى؟ ليس المقصود أن يكون صارما (لا يوجد سبب وجيه يمنع ملحق WooCommerce من مساعدتك في بيع اليخوت، خاصة إذا كان لديك بضع عشرات فقط للبيع). استخدمت للتو "المبيعات" مجازًا للدلالة على التوسع، والحجم* والتعقيد. مع نمو تلك العناصر ستبدأ في النظر إلى بنية ووردبريس على أنها عائق أمامك. تخيل لو أن كل منتج من منتجات أمازون - يبيعه العشرات من البائعين، عليه مئات المراجعات، ولديه معلومات بالغة التعقيد للتوصيل حول العالم، ولديه معاينات صور وغيرها - تخيّل أنه عبارة عن منشور ووردبريس مثقل بالبيانات الوصفية ينتمي لنوع مخصص من المنشورات اسمه "منتج" ضمن بيئة ووردبريس/ووكومرس الأكبر في العالم. هذا سيجعل الأمور سيئة. التواضع أود توضيح شيئين إلى جانب المخطّط التدفقي: هذا رأيي. أود أن أسمع آراء أخرى! أنا متأكد بما يكفي لأرى أن معظم ما سبق صحيح، حسب استيعابي لمتى يمكنني استخدام ووردبريس في مشاريع الويب. للتعرّف على وجهات نظر أخرى من أشخاص متميّزين بمعرفتهم بالموضوع أنصح بمراجعة ما يلي: هذا المنشور على Stack Exchange . هذه المقالة المنحازة ضد ووردبريس كمنصة لتطوير التطبيقات. هذه المقالة التي تدافع عن ووردبريس يوصفه منصة لتطوير التطبيقات. عرض الشرائح الذي يقدّم رؤية دقيقة عن ووردبريس يوصفه منصة لتطوير التطبيقات. إذا كان لديك رأي بما عرضناه أعلاه فيمكنك كتابته في التعليقات. شكرا للقراءة تعد المخطّطات التدفقية طريقة رائعة لتبسيط الأمور، ولاختزالها أيضا. نأمل على الرغم من ذلك أن تكون مخطّطاتنا قد أتاحت لك فهمًا جيدًا عن متى تستخدام ووردبريس ومتى تفكر في البحث عن بديل. متى تستخدم ووردبريس ومتى تتجنبه؟ نودّ أن نسمع أفكارك وأسئلتك في التعليقات أدناه! ترجمة - وبتصرّف - للمقال When to Use WordPress: The Flowchart لصاحبه.
  22. أهلًا @Ibtissem Fellah لا يشكل أي فرق، فيمكنك استعمال أي بيئة تطوير تدعم كتابة شيفرات بايثون وتنفيذها، وتبدو pycharm ممتازة لهذا الغرض. نرجو لك قراءة ممتعة ومليئة بالفائدة!
  23. أحد أسوأ الأمور في موسم الأنفلونزا حتمية إصابتك بالمرض. فقد يأتي زملاء العمل وهم يعانون من رشح في الأنف. أو ربما تستقل الحافلة إلى مكان عمل مشترك، فيسعل ركاب آخرون ويلمسون نفس المَسند الذي تمسك به. أو ربما كنت تعمل من منزلك "الآمن" إلا أنه من المحتمل أن ينقل لك أطفالك جراثيم خطيرة تعرضوا لها في المدرسة. بغض النظر عن المكان الذي تذهب إليه أو من تكون محاطًا بهم فقد تشعر في بعض الأحيان أنه لا يوجد مكان آمن. ولكن هذا ما يحدث عندما تعمل وتعيش بالقرب من الآخرين. إذا كان شخص واحد مصابًا فانتشار المرض مسألة وقت فقط. الأمر نفسه ينطبق على التعرض لمخاطر الثغرات العابرة للمواقع (Cross-Site). من البديهي أن الأمن يشكل مصدر قلق كبير لكل من له علاقة بموقع ويب، سواء كان صاحب الموقع أو الشخص الذي يتسوق عليه أو المطور الذي قام بإنشائه. لذا، يبدو أن هناك خطرًا عند كل منعطف. لكن لنفترض أنك قررت اتخاذ القرار الاقتصادي والفعال بوضع عدة مواقع على شبكة واحدة (سواء كان ذلك من خلال استخدام ووردبريس مُتعدّد المواقع أو تشغيلها ببساطة من حساب الاستضافة نفسه). قد تؤدي ثغرة أمنية واحدة في واحد فقط من تلك المواقع إلى تعريض الشبكة بالكامل للخطر. يعد مقال أفضل ممارسات الأمان في ووردبريس جيدًا للبدء به، و لكنه قد لا يكون كافيا. إذا كنت تدير شبكة من مواقع ووردبريس جميعها من مكان واحد فهذا المنشور يناسبك. سأغطي بإيجاز المخاوف التي تتعلّق بالثغرات العابرة للمواقع Cross-Site، ثم أعرض قائمة مرجعية خاصة من النصائح لاستخدامها عند تشغيل شبكة من المواقع. من ينبغي أن يكون قلقًا بشأن مخاطر الثغرات العابرة للمواقع في ووردبريس؟ دعنا نواجه الأمر: يحتاج القراصنة هذه الأيام للمزيد من الإبداع في كيفية اختراق مواقع الويب. قد يكون الووردبريس هدفًا سهلاً بسبب شعبيته، ولكنه ليس منصة سهلة الاختراق إذا كان الأشخاص الذين يبنون ويديرون مواقع الويب يمتثلون لأفضل ممارسات الأمان. بالطبع يبدأ ذلك الالتزام بالتذبذب قليلاً مع تزايد عدد مواقع الويب على شبكتك. في ما يلي طرق يمكن بها تجميع مواقعك على الويب مما يعرضها عن غير قصد لمخاطر الثغرات العابرة للمواقع. ووردبريس مُتعدّد المواقع على الرغم من أن شبكة ووردبريس متعددة المواقع تعدّ ميزة رائعة لمطوري الويب الذين يرغبون في إدارة شبكة من المواقع بكل سهولة من خلال تثبيت واحد ووردبريس مرة واحدة فقط، إلّا أنها تعني أيضًا أن تفاحة فاسدة واحدة يمكن أن تفسد المجموعة بالكامل بسهولة. جوهر المسألة هو أنّ كل هذه الموارد المشتركة من ملفات، وملحقات، وبيانات الدخول، المخزَّنة في المكان نفسه تزيد من خطر أنّ أذية موقع ويب واحد يمكن أن تؤدّي إلى إصابة مواقع الشبكة كلها. حساب استضافة متعدد النطاقات ينطبق الأمر نفسه على مواقع الويب التي تشترك في حساب استضافة (ليس بالضرورة تلك الموجودة على استضافة مشتركة، بل فقط تلك المواقع التي تشترك في حساب واحد). كل ما يتطلبه الأمر هو موقع ويب واحد غير مؤمَّن على نحو سليم (من خلال ملحق سيئ أو كلمة مرور ضعيفة)، ويمكن بعد ذلك للمخترقين إحداث الفوضى في شبكة كاملة من المواقع. يوجد عدد من الأطراف التي من المحتمل أن تتأثر: الوكالات التي تريد إدارة جميع مواقع عملائها من حساب استضافة واحد، المطورين الذين يريدون أن يفعلوا الشيء نفسه، المطورين الذين يستخدمون حساب الاستضافة الخاص بهم لاختبار مواقع الويب وإعدادها، الشركات التي لديها عدد من مواقع الويب تحت مظلة علامتها التجارية الرئيسية وتريد الاحتفاظ بها جميعًا معا. إعادة بيع الاستضافة قد يجد مطورو الويب أن بيع الاستضافات، إما بدوام كامل أو تكملةً لعملهم اليومي، طريقة مربحة لكسب أموال إضافية باستخدام ووردبريس، وهو ما يعني أنك إذا لم تقم بتهيئة نظام الاستضافة الخاص بك بدقة فيمكنك أن تعرّض جميع مواقع عملائك للخطر. لا يمكنني التأكيد على الأمر بما فيه الكفاية: كل ما تتطلبه إصابة شبكة مواقع وتدميرها بالكامل هو إصابة موقع واحد منها. تخيل أثر ذلك، إنْ حدث، على عملك. أكدت للعملاء أنك ستهتم بمواقعهم على الويب، وتعتقد بصدق أن كل شيء سيكون على ما يرام. لكنّك تركت موقعًا مرحليًا غير مؤذٍ دون مراقبة، أو كنت تثق في أن عملاء الاستضافة سيؤمّنون مواقعهم الفردية على نحو صحيح … وحدث خطأ ما. إذن مالعمل الآن؟ حسنًا، أنت بحاجة إلى عدم الانتظار حتى "الآن.. ماذا نفعل؟". تحتاج إلى اتخاذ إجراء حاليًا لتأمين شبكة مواقع ووردبريس الخاصة بك على نحو صحيح من مخاطر الثغرات العابرة للمواقع. القائمة المرجعية: 8 أشياء تحتاج إلى القيام بها للتصدي للأضرار الناتجة عن الثغرات العابرة للمواقع من البديهي أنّ هذه القائمة ليست معدّة لتحل محل القائمة المرجعية لتأمين ووردبريس التي تعتمدها سلفا. تسري نصائح تلك القائمة سواء كنت تدير موقع ووردبريس واحدًا أو شبكة كاملة. ومع ذلك ينبغي أن تُضاف العناصر التالية إلى تلك القائمة المرجعيةإنْ كنت تنوي إدارة شبكة من المواقع. 1- فحص كل موقع الهدف من وراء جمع مواقع مختلفة في حساب استضافة مشترك واحد، أو إعداد ووردبريس مُتعدّد المواقع هو أن تتمكّن من إدارة المواقع في وقت واحد بصورة أكثر ملاءمة وفعالية. ومع ذلك، تبقى تلك المواقع ملكيات فريدة يجب التعامل معها على ذلك الأساس. لذا، بدلاً من افتراض أن إجراءات الأمان المستخدمة من قبل مزود الاستضافة، استخدم ملحقًا لفحص الأمان على كل موقع من مواقع ووردبريس الخاصة بك. يقوم ملحق Defender لأمن ووردبريس، بطبيعة الحال، بعمل رائع في فحص موقعك بانتظام، وفرض ممارسات أمنية صارمة، وتوثيق جميع الأنشطة، لذلك أقترح البدء به. 2- إضافة جدران نارية منفصلة تعلم أنك عندما تسجّل لدى مزوّد استضافة موثوق فإنه عادةً يروّج لوجود جدار ناري لحماية خوادمهم ومنع المخترقين. مع ذلك، إذا كنت تدير مواقع ووردبريس خاصة بك من حساب الاستضافة نفسه، فهذا يعني أن شبكتك مؤمنة من خلال جدار ناري واحد فقط، ولا يوجد حاجز منفصل يقف بين كل واحد من مواقعك مع البقية. بما أنّ سبب تأثير الثغرات العابرة للمواقع هو عدم وجود حواجز بين تلك المواقع، فمن المهم إضافة جدار ناري إلى كل موقع ويب. يؤّدي Cloudflare هذه المهمة بنجاح. يأتي جدار Cloudflare الناري لتطبيقات الويب مزودًا بقواعد مضمنة، ومن بينها قواعد تتصدّى للتهديدات والثغرات الخاصة بووردبريس. بمجرد تمكين جدار Cloudflare الناري لتطبيقات الويب فستطمئن لعلمك أن موقعك محمي من أحدث التهديدات. 3- استخدام ملحق موثوق لتعدّد مواقع ووردبريس إذا كانت الثغرة الأمنية في شبكة مواقعك ناتجة عن استخدام نظام ووردبريس مُتعدّد المواقع، فأفضل ما يمكنك فعله هو استخدام ملحق موثوق لهذا الغرض، مثل WP Ultimo. بهذه الطريقة تتيقّن أنْ تتحكّم أكثر في ما يفعله عملاؤك مع مواقعهم على الويب، وفي الوقت نفسه تتأكد أيضًا أن الملحق الذي تستخدمه غير خطر وآمن. 4- حجب السخام على شبكة مواقع ووردبريس بالطبع، لا تنسَ التعليقات غير المرغوب فيها، فهي أحد أهم الأسباب التي تجعل الكثير من المدونات والمواقع تقرر إيقاف التعليقات تماما. عندما تشغّل شبكة كبيرة من المواقع - خاصةً إذا كانت سيطرتك على محتوى المدونة أو التعليقات التي تظهر عليها ضئيلة أو معدومة - فأنت بحاجة إلى الملحق Akismet لكي يحمي مواقعك من السخام وحُقَن المحتوى الضارة الأخرى. 5 - تنظيف النطاقات القديمة كلما زادت شبكة مواقعك كلما أصبح من الأسهل فقدان أثر تلك المواقع. لهذا السبب يجب عليك تحديد موعد دوري - من الأفضل أن يكون كل مرة في الشهر أو في الأسبوع - لمراجعة حسابك على الاستضافة متعدّدة النطاقات، أو شبكة مواقع ووردبريس. يجب التخلص من أي نطاقات قديمة أو غير مستخدمة، ينطبق الأمر نفسه على مواقع الاختبار والتحضير. بمجرد إتاحة موقع ووردبريس العموم تصبح هذه المواقع غير ذات فائدة، إذا واجهت أي مواقع لم يتم تحديثها منذ عام فاستفسر من مالك الموقع لمعرفة ما إذا كان لا يزال بحاجة إلى الاستضافة. من خلال الحفاظ على خادمك خاليًّا من النطاقات القديمة فستقلّل من احتمال أن يصادفها القراصنة ويستفيدوا من البيئة الممهدة المثالية المتمثّلة في الأنشطة غير الخاضعة للرقابة، وبرنامج ووردبريس وملحقاته غير المحدثة، وما إلى ذلك. 6- الحفاظ على الإضافات والسمات محدثة إنْ كنت تمضي وقتًا طويلًا في مستودع ملحقات ووردبريس فستتعرّف على هذه الرسالة. إذا كنت تجمع مواقع ويب في بيئة ووردبريس متعدّدة المواقع أو في حساب الاستضافة نفسه، فنرجو أن تكون لديك مجموعة الملحقات والسمات الموثوقة نفسها على جميع مواقعك. على الرغم من أن بيئة ووردبريس متعدّدة المواقع تبسط عملية الحفاظ على الملحقات والسمات "المشتركة" محدَّثة عبر جميع المواقع، إلّا أن ذلك لا يقلّل من أهميّة المراجعة المنتظمة لكل تكامل مع خدمات طرف ثالث. قد لا تعرف أبدًا متى يقرر مطوّر إيقاف دعم خدمة، أو متى توضع إشارة تحذير على ملحق في مستودع ووردبريس، أو متى تظهر ثغرة أمنية جديدة في أحد هذه البرامج. مع ذلك، تجد أحيانًا عناءً كبيرًا في المواكبة المستمرة لجميع تحديثات ووردبريس، وكذلك الملحقات والسمات التي لا تعد ولا تحصى؛ وهو ما يجعل من ملحق أو برنامج يحدّث تلقائيًا الملحقات والسمات أمرًا مفيدًا للغاية. يتمتع أعضاء WPMU DEV، على سبيل المثال، بميزة التحديثات التلقائية التي تشغّل التحديثات وتأخذ نسخًا احتياطية تلقائيّا. 7- تهيئة الخادم بطريقة صحيحة سواء تعلّق الأمر بيئة ووردبريس متعدّدة المواقع أو حساب استضافة مشترك فإن الحفاظ على أمان المواقع يتطلّب إدارة إعدادات الشبكة بذكاء. في ما يلي نصائح بسيطة لمساعدتك في القيام بذلك: إنشاء حسابات منفصلة لمنصات مواقع الويب: إذا قمت بإنشاء مواقع ويب باستخدام منصات أخرى غير ووردبريس، فيجب أن تكون لديك حسابات منفصلة لمواقع ووردبريس، ومواقع دروبال، ومواقع جوملا وغيرها. تجنب خلط الحابل بالنابل في وظائف المضيف: نعني بذلك نوعية الاستضافة. لذا، إذا كنت تعمل في بيع استضافة مواقع الويب فقد تزود العملاء أيضًا باستضافة البريد الإلكتروني. لا تخلط بين تلك الوظائف، وأبق كلّ واحدة منها منفصلة عن الأخرى. افصل بين مواقع الويب التجريبية ومواقع الويب المتاحة للعموم: على الرغم من أنك قد تميل لوضع مواقع ما زالت في مراحل التطوير والاختبار على نفس الحساب مع تلك المتاحة للعموم، إلّا أنه من الأفضل ألّا تفعل ذلك. سيكون الفصل بينها أكثر أمانًا، خاصة إذا لم تكن جيدًا في استحضار حذف مواقع أو التحضير بعد الانتهاء منها. والأفضل من ذلك أن تفصل بين الأدوات التي تستخدمها للاختبار وتلك التي تستخدمها للتحضير، حتى تتمكن من تجنب هذه المشكلة تماما. 8- استخدام مضيف موثوق في نهاية المطاف يعتمد أمان مواقع الويب الخاصة بك على مدى تأمين كل واحد على حدة. مع ذلك إذا لم تبدأ بمضيف موثوق يوفر لك خوادم آمنة ومُعدة بطريقة صحيحة فربما تواجه مشاكل على المدى الطويل. يشيع ذلك في الحالات التي لا تتبع أفضل الممارسات لتأمين كل موقع، والحفاظ على المستخدمين محجوزين في مواقعهم الخاصة. بالطبع إذا استمررت في القلق بشأن إصابة المواقع في شبكتك فيمكنك دائمًا استضافة كل موقع على حدة باستخدام طريقة أكثر أمانًا وعزلًا، مثل الخادم الافتراضي الخاص أو استضافة خادم مخصص. على الرغم من أن تلك الطرق تلغي الحاجة لإنشاء شبكة متعددة المواقع فإنها تجنبك احتمالية الإصابة بالثغرات العابرة للمواقع. في الختام كل ما يتطلبه الأمر تفاحة واحدة فاسدة لتدمير الباقي. أحيانًا يكون من الصعب رؤية تلك التفاحة الفاسدة عندما يكون لديك الكثير من التفاح لمراقبته، لهذا السبب تجب حماية كل موقع في شبكتك. إذا كان موقع ما لا يهمك بما يكفي للاهتمام بحمايته فيجب ألا يكون ضمن بيئة ووردبريس مُتعدّدة المواقع، أو يتشارك مساحة على حساب الاستضافة مع مواقعك الأخرى. الأمر بسيط. عليك الالتزام بالنصائح المذكورة أعلاه وستكون قادرًا على تشديد أمان شبكتك بدرجة تكفي لكي لا تقلق بعد الآن بشأن الثغرات العابرة للمواقع. ترجمة -وبتصرف- للمقال The Dangers of Cross-Site Contamination and How to Prevent It لصاحبته Suzanne Scacca
×
×
  • أضف...