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

لوحة المتصدرين

  1. Ola Saleh

    Ola Saleh

    الأعضاء


    • نقاط

      41

    • المساهمات

      11


  2. حسام أحمد3

    حسام أحمد3

    الأعضاء


    • نقاط

      16

    • المساهمات

      1


  3. ابراهيم الخضور

    • نقاط

      13

    • المساهمات

      163


  4. محمد أيمن3

    محمد أيمن3

    الأعضاء


    • نقاط

      10

    • المساهمات

      0


المحتوى الأكثر حصولًا على سمعة جيدة

عرض المحتوى الحاصل على سمعة أكبر منذ 08/13/24 in مقالات البرمجة

  1. نحن نسمي أنفسنا "إنسان عاقل أو حكيم"، لأن ذكائنا أمر مهم جدًا بالنسبة لنا. لقد حاولنا منذ آلاف السنين أن نفهم كيف نفكر، أي كيف يمكن للعقل البشري أن يدرك ويُحلل ويفهم ويتنبأ ويتلاعب بعالم كبير ومعقد. يذهب الذكاء الصناعي إلى ماهو أبعد من ذلك؛ يحاول فهم الكيانات الذكية إلى جانب بناء كيانات ذكية أيضًا. الذكاء الاصطناعي هو أحد أحدث المجالات في العلوم والهندسة، وقد بدأ العمل به بجدية بعد الحرب العالمية الثانية بفترة وجيزة، لكنه لم يُبصر النور إلا مع بداية القرن الحادي والعشرين، حيث بدأ الإنترنت والبيانات بالانتشار إلى جانب تطور أجهزة الحواسيب. يتميز الذكاء الصناعي بأنه علم كبير وتعددي؛ يشارك فيه علماء الحاسوب والرياضيات والهندسة واللغة والفلسفة والمنطق. الذكاء الاصطناعي وثيق الصلة بأي مهمة فكرية؛ إنه مجال عالمي. ماهو الذكاء الاصطناعي لنتفق بدايةً أنّه لا فرق في قول "الذكاء الاصطناعي" أو "الذكاء الصناعي" بالعربية، فكلاهما يُشيران إلى شيء من صنع البشر وليس الطبيعة. مفهوم الذكاء الصناعي Artificial Intelligence -اختصارًا AI- هو مجال جديد ظهر تقريبًا عام 1950 على يد آلان تورينج (يُسميه البعض الأب الروحي للذكاء الصناعي) المقصود به باختصار هو جعل الآلة تفكر وتعمل مثل الإنسان. في البداية لاقى هذا المجال الكثير من الصعوبات لأن العلماء كانوا يحاولون محاكاة الذكاء والتفكير البشري، محاولين جعل الآلة تفكر وتعمل مثل الإنسان. بسبب هذا التفكير فشل العلماء في الوصول إلى تقدم حقيقي في هذا المجال، لأنه رغم كل التقدم الذي وصلت إليه العلوم لم يستطع العلماء تحديد الطريقة التي يفكر بها الإنسان. وصل العلماء لاحقًا إلى قناعة تفيد بأننا كبشر لا يهمنا كيف تعمل الآلة (أي لن نُقيد الآلة بطريقة التفكير البشري)؛ المهم أن نحصل على نفس النتيجة التي نحصل عليها من خلال الإنسان، فالإنسان يرى الصورة على أنها انعكاسات للضوء، والآلة ترى الصورة على أنها مصفوفة من البيكسلات والأصفار والواحدات. آنذاك بدأ الذكاء الصناعي بالتطور ودخل جميع مجالات حياتنا العملية سواءًا المجال العسكري والطبي والصناعي والتجاري وحتى التعليمي والترفيهي، فكانت دقة الأداء عالية جدًا، وفي بعض المجالات كانت نسبة الخطأ شبه معدومة، أي أن الآلة بدأت تحاكي التفكير البشري، حتى أنها أصبحت أفضل منه في كثير من المجالات، فالعلوم حاليًا هي علوم الذكاء الصناعي. إن كان الإنترنت هو ثورة السنوات الماضية، فالذكاء الصناعي هو ثورة الحاضر والمستقبل. تعريف الذكاء الاصطناعي الذكاء الصناعي هو مصطلح صاغه البروفيسور الفخري في جامعة ستانفورد جون مكارثي في عام 1955 لأول مرة ضمن ورشة عمل صيفية تسمى مشروع دارتموث الصيفي للبحوث حول الذكاء الاصطناعي على أنه: بالرغم من أن هناك اختلافات حول التعريف، إلا أن الجامعة الأشهر في الذكاء الصناعي "ستانفورد" تعتمده. من التعاريف الأخرى هو التعريف الذي صاغه أندرياس كابلان ومايكل هاينلين، وينص على أن الذكاء الصناعي هو: تُركز تعريفات الذكاء الاصطناعي الحديثة على أنّه مجال فرعي لعلوم الحاسب وكيف يمكن للآلات تقليد الذكاء البشري. يُقدم قاموس أكسفورد هذا التعريف: ما هو ذكاء الآلة ومتى نقول عن الآلة أنها ذكية؟ يُجيب عن هذا السؤال اختبار تورينج (نسبةً لآلان تورينج). إنها أشبه بلعبة بين ثلاث أطراف؛ اثنان من البشر (الأول لاعب والثاني حكم أو مراقب) والآلة المُراد اختبارها إن كانت ذكية (اللاعب الثاني). اللاعبين الثلاثة معزولين عن بعضهم البعض، ويكون التراسل بين الأطراف كتابيًا. يبدأ المراقب بطرح أسئلة على اللاعبين (الحاسب والشخص الآخر). ينجح الحاسوب في الاختبار (يكون ذكي) إذا لم يستطع المراقب التفريق بينه وبين الإنسان. عبقرية هذا المفهوم هي أنه ليست هناك حاجة لمعرفة ما إذا كانت الآلة تعرف شيئًا ما بالفعل أو أنها تُدرك ذاتها أو حتى إذا كانت إجاباتها صحيحة، وإنما يشير إلى قدرة تلك الآلة على معالجة كميات كبيرة من المعلومات وتفسير اللغة البشرية. الذكاء الاصطناعي وتعلم الآلة على الرغم من الخلط بين المصطلحين في بعض السياقات، إلا أن تعلم الآلة فرع من فروع الذكاء الصناعي العديدة. يشير الذكاء الصناعي إلى أي أسلوب يُعطي الآلة القدرة على محاكاة الذكاء البشري، بينما يشير التعلم الآلي إلى مجموعة التقنيات والخوارزميات التي تسمح للآلات بالتعلم من البيانات دون أن تُبرمج عليها صراحةً. ما أهمية الذكاء الاصطناعي؟ يُنظر إلى تقنيات الذكاء الصناعي على أنها أدوات وتقنيات تهدف لخدمة البشرية وتسهيل حياة الأفراد، فهي تهدف إلى جعل حياتنا أسهل، كما يمكن تطبيقه في جميع المجالات تقريبًا للحصول على كفاءة أعلى. فيُقدم الذكاء الصناعي العديد من الميزات والحلول التي تعود بالفائدة لأي مؤسسة حديثة تقريبًا، يتضمن ذلك: أتمتة العمليات: الذكاء الاصطناعي قادر على أتمتة المهام التي نُنجزها يدويًّا وبدقة وسرعة دون الشعور بأي إرهاق أو الاضطرار إلى أخذ فترات راحة مثلما يحتاج الموظف البشري (مثلًا مراقبة السيارات والإبلاغ عن المخالفات). تحليل البيانات الضخمة: كمية البيانات الموجودة حاليًّا على الإنترنت تفوق بكثير قدرة البشر على استيعابها وتفسيرها واتخاذ قرارات معقدة بناءً عليها. يمكن لخوارزميات الذكاء الصناعي معالجة تلك البيانات وتحليلها وفهمها، وبالتالي تمنح المؤسسات رؤى حول عملياتها ربما لم تكن على دراية بها من قبل. اتخاذ القرارات: يمكن لخوارزميات الذكاء الاصطناعي اتخاذ قرارات أكثر دقة من البشر في بعض الأحيان نظرًا لقدرتها على تحليل العلاقات المعقدة والمتعددة والاستفادة من البيانات الضخمة المنتشرة على الإنترنت. مجالات الذكاء الاصطناعي يعد الذكاء الاصطناعي مجالًا واسعًا للدراسة يتضمن العديد من النظريات والأساليب والتقنيات المختلفة، ومن أبرز مجالات الذكاء الاصطناعي مايلي: تعلم الآلة Machine learning: عرّف آرثر صموئيل تعلم الآلة بأنّه المجال الذي يعطي الحاسوب القدرة على التعلم من المشاكل التي يصادفها دون تعليمات واضحة تُعطى له، أي القدرة على معالجة مشاكل جديدة. الشبكات العصبية الاصطناعية Artificial Neural Networks: عبارة عن مجموعة من الخوارزميات المُصممة بطريقة مُستوحاة من الخلايا العصبية في الدماغ البشري، وهي مصممة للتعرف على الأنماط. التعلم العميق Deep Learning: يستخدم شبكات عصبية ضخمة مع العديد من طبقات وحدات المعالجة، حيث يستفيد من التطورات الحوسبية الكبيرة (المعالجات القوية مثلًا) وتقنيات التدريب المحسنة لتعلم الأنماط المعقدة بكميات كبيرة من البيانات. أتمتة العمليات الآلية Robotic Process Automation: يمكن أن يكون مصطلح أتمتة العمليات الآلية مربكًا بعض الشيء؛ لا تعني كلمة آلية أو روبوتية هنا الروبوتات المادية، وإنما الروبوتات التي تُمثل برامج (برامج آلية) تُنفِّذ بعض العمليات التقليدية المكررة، مثل وإدارة المعاملات وإرسال الفواتير وتقديم ردود نموذجية للعملاء (روبوتات الدردشة، لابد وأنك تعرفها). الروبوتات Robots: هو آلة يمكنها إنجاز المهام الموكلة إليها من خلال تنفيذ سلسلة معقدة من الإجراءات تلقائيًا. يمكن توجيه الروبوت بواسطة جهاز تحكم خارجي، أو قد يكون عنصر التحكم مضمنًا فيه. الأنظمة الخبيرة Expert systems: النظام الخبير هو محاولة جمع الخبرة البشرية المتعلقة بمجال محدد ضمن الحاسب لكي يحل محل الخبير، أو يمكننا القول أنّه برنامج مصمم لينفد مهاماً متعلقة بالخبرة البشرية، وهذا يتضمن التحليل والتشخيص واتخاذ القرارات والتنفيذ أيضًا. المنطق الترجيحي أو الضبابي Fuzzy Logic: المنطق الضبابي هو نهج للحوسبة يعتمد على "درجات الحقيقة degrees of truth" بدلاً من المنطق الثنائي "صح أو خطأ" المعتاد (1 أو 0) الذي يعتمد عليه الحاسب ويحاول حل المشكلات باستخدام طيف مفتوح وغير دقيق من البيانات والاستدلالات التي تجعل من الممكن الحصول على مجموعة من الاستنتاجات الدقيقة. لمزيد من التفاصيل المتعلقة بفروع أو مجالات الذكاء الصناعي، يمكنك قراءة مقالة مجالات الذكاء الاصطناعي. تعمل العديد من التقنيات على تمكين ودعم تطبيق الذكاء الاصطناعي منها: الرؤية الحاسوبية Computer vision تعتمد على خوارزميات التعلم العميق للتعرف على ما هو موجود في الصورة (أو الفيديو) وتحليلها وفهمها وتفسير مكوناتها. معالجة اللغة الطبيعية Natural language processing هي قدرة أجهزة الحاسب على تحليل وفهم وتوليد اللغة البشرية، بما في ذلك الكلام. تطور خوارزميات الذكاء الصناعي نقل هذا المجال من الظلام إلى النور. علم البيانات Data science: هو دراسة البيانات لاستخراج رؤى ذات مغزى تخدم الأعمال والمؤسسات. إنها مصطلح شامل للتقنيات الإحصائية وتقنيات التصميم وطرق التطوير. يُستخدم الذكاء الاصطناعي فيها بشكل متزايد للتعامل مع البيانات، وإزالة الإنسان من المهمة بأكملها للعمل بمفرده. إنترنت الأشياء Internet of things، هو ربط الأشياء (كرسي طاولة ثلاجة ..إلخ) مع بعضها البعض من خلال الإنترنت، وتمكينها من الاتصال مع بعضها البعض وتبادل المعلومات واتخاذ القرارات؛ أي باختصار "هو جعل الأشياء تتكلم وتتخذ القرارات من أجل خدمتنا". تعتبر وحدات المعالجة الرسومية Graphics processing unit مفتاحًا للذكاء الاصطناعي لأنها توفر القوة الحوسبية الكبيرة المطلوبة للمعالجة. يتطلب تدريب الشبكات العصبية بيانات كبيرة بالإضافة إلى قوة حوسبية. واجهات برمجة التطبيقات APIs عبارة عن حزم من التعليمات البرمجية التي تتيح إمكانية إضافة وظائف الذكاء الصناعي إلى المنتجات الحالية والبرامج. أنواع الذكاء الاصطناعي هناك عدة أنواع للذكاء الصناعي يمكن وضعها ضمن فئتين، الأولى تعتمد على القدرات والثانية تعتمد على الوظيفية. بالنسبة لفئة القدرات، تنقسم إلى: ذكاء اصطناعي ضعيف أو ذكاء اصطناعي ضيق: هو الذكاء الاصطناعي الذي يتخصص في مجال واحد (يستطيع تنفيذ مهمة واحدة فقط). ذكاء اصطناعي عام: حواسيب بمستوى ذكاء الإنسان في جميع المجالات. ذكاء اصطناعي خارق: هو ذكاء اصطناعي يفوق ذكاء وقدرة الإنسان. أما بالنسبة للفئة التي تعتمد على الوظيفة تنقسم إلى: الآلات التفاعلية Reactive machines: لا تتضمن أنظمة الذكاء الاصطناعي هذه ذاكرة، ويكون لها مهمة معينة. ذاكرة محدودة Limited memory: تتمتع أنظمة الذكاء الاصطناعي هذه بذاكرة، لذا يمكنها استخدام الخبرات السابقة في القرارات المستقبلية. نظرية العقل Theory of mind: يجب أن يفهم الذكاء الاصطناعي المشاعر البشرية والناس والمعتقدات وأن يكون قادرًا على التفاعل اجتماعيًا مثل البشر. الإدراك الذاتي Self-awareness: مستقبل الذكاء الاصطناعي. ستكون هذه الآلات فائقة الذكاء، وسيكون لها وعيها ومشاعرها وإدراكها الذاتي. تطبيقات الذكاء الاصطناعي تطبيقات الذكاء الاصطناعي لا حصر لها؛ يمكن تطبيق هذه التكنولوجيا على العديد من القطاعات والصناعات المختلفة. إليك أهم 10 تطبيقات للذكاء الاصطناعي: 1. الطب والرعاية الصحية أحدث الذكاء الصناعي تأثيرًا غير مسبوق في المجال الطبي، إذ أصبحت خوارزميات ونماذج التعلم الآلي قادرةً على تشخيص العديد من الأمراض والتنبؤ بها، مثل تحديد ما إذا كان مريض معين مصابًا بسرطان أو ورم خبيث أو حميد بناءً على الأعراض والسجلات الصحية والتاريخ أو التنبؤ بالإصابة بأمراض وأوبئة ..إلخ. 2. النقل أصبح إنتاج السيارات ذاتية القيادة التي تعتمد على الذكاء الصناعي -الشغل الشاغل للعديد من الشركات العالمية مثل شركة تسلا التي يرأسها إيلون ماسك. كما أنه يساعد في تقليل الازدحام والاختناقات المرورية. أما في النقل الجوي؛ فقد أصبحت الآلة تشارك في تخطيط المسارات جنبًا إلى جنب مع مخططات هبوط الطائرة والإقلاع. 3. التعليم يمكن للذكاء الاصطناعي أتمتة عملية تقييم الطلاب ووضع الدرجات، وبالتالي توفير الجهد والوقت على المدرسين. بالمناسبة، لقد كان مشروع التخرج الخاص بي هو نظام ذكي لمراقبة سلوك الطلاب خلال الدرس ورصد تعابير وجوههم لمعرفة الطالب الذي يشعر بالملل أو النائم والذي يُشارك باستمرار والذي يُثير الشغب ..إلخ، وتقديم تقرير عن كل طالب في نهاية الدرس. 4. الأعمال دُمجت خوارزميات التعلم الآلي مع أنظمة تحليل وإدارة علاقات العملاء CRM، لمعرفة كيفية خدمة العملاء بطريقة أفضل. كما دُمجت روبوتات الدردشة في مواقع الويب لتقديم خدمة فورية للعملاء. أصبحت أتمتة المناصب الوظيفية أيضًا نقطة نقاش بين الأكاديميين ومحللي تكنولوجيا المعلومات. 5. الأمن والحماية تستخدم المؤسسات التعلم الآلي في برامج إدارة المعلومات والأحداث SIEM والمجالات ذات الصلة لاكتشاف الحالات الشاذة وتحديد الأنشطة المشبوهة التي تشير إلى التهديدات. 6. المؤسسات المالية والمصرفية يلعب الذكاء الاصطناعي دورًا حيويًا في إدارة المعاملات المالية والتعامل مع العديد من الأنشطة البنكية الأخرى. من خلال نماذج التعلم الآلي يمكن التعامل مع العمليات اليومية للبنوك، مثل المعاملات والعمليات المالية وأموال سوق الأوراق المالية وإدارتها وما إلى ذلك بسهولة وكفاءة أكبر. كما تُستخدم في عمليات مكافحة غسيل الأموال وتحليل أنظمة الائتمان. 7. الألعاب والترفيه حقق الذكاء الصناعي تقدمًا كبيرًا في ألعاب الواقع الافتراضي والألعاب الحديثة، حيث يُستخدم لتوليد سلوكيات متجاوبة أو متكيفة أو ذكية لشخصيات اللاعبين تُحاكي الذكاء البشري. 8. الصناعة من خلال الذكاء الصناعي يمكننا توفير الوقت والمال عن طريق أتمتة العمليات والمهام الروتينية وتحسينها. زيادة الإنتاجية والكفاءات التشغيلية. اتخاذ قرارات أعمال أسرع بناءً على مخرجات التقنيات المعرفية. 9. الزراعة تساعد أنظمة الذكاء الاصطناعي في تحسين الجودة الشاملة للحصاد ودقته (تُعرق بالزراعة الدقيقة). يمكن للذكاء الصناعي أن يتنبأ بالوقت الذي يستغرقه محصول ما ليصبح ناضجًا وجاهزًا للقطف واكتشاف الأمراض في النباتات والآفات وسوء تغذية المزارع، وهذا ما يزيد من كفاءة الزراعة. 10. الفنون أصبح بإمكان الذكاء الاصطناعي إنتاج لوحات فائقة الجمال، كما أنّه دخل في مجال الموسيقى والغناء، حيث أصبح قادرًا على تأليف نوتات موسيقية وأغاني وإنتاج أنواع الأصوات المختلفة. الذكاء الاصطناعي والثورة الصناعية الرابعة 4IR لابد وأنك قد سمعت عن العصر الجديد من الصناعة والذي يُعرف بالثورة الصناعية الرابع "0.4 Industry". ترتكز الثورة الصناعية الرابعة على أتمتة العمليات إلى حد كبير جدًا واستخدام جداول زمنية أسرع للإنتاج ومستودعات ذكية (مخازن ذكية)، مما يسمح بإنتاج وتوزيع المنتجات بسرعة وفعالية أكبر، كما أنها ستتطلب قوة عاملة ذات مهارات عالية ومتعلمة وتتقن كيفية استخدام وتشغيل أحدث التقنيات. يأتي دور الذكاء الصناعي هنا في قدرته على إحداث هذه التغييرات بسرعة وسلاسة، ولاسيما من خلال الأنظمة الخبيرة والرؤية الحاسوبية والروبوتات وإنترنت الأشياء. ما هي مزايا وعيوب الذكاء الاصطناعي؟ تتطور تقنيات الذكاء الصناعي بسرعة كبيرة جدًا، ويرجع ذلك إلى أن الذكاء الاصطناعي يُمكنه معالجة كميات كبيرة من البيانات بسرعة، كما أنه يعطي تنبؤات أكثر دقة من الإنسان. إن الكميات الهائلة من البيانات يمكنها دفن قدرة العقل البشري على معالجتها وتحويلها إلى معلومات ذات معنى، إلا أن تقنيات الذكاء الاصطناعي يمكنها أخذ وتحويل تلك البيانات إلى معلومات مُفيدة وقابلة للتنفيذ بسرعة، لكن العيب الأساسي لاستخدام الذكاء الاصطناعي هو أنه من المكلف معالجة الكميات الكبيرة من البيانات التي تتطلبها برمجة الذكاء الاصطناعي. مزايا الذكاء الاصطناعي يجعل الآلات أكثر قوة وفائدة. يُقدم أساليب جديدة لحل المشاكل. أفضل من البشر في التعامل مع المعلومات. يُحسّن كفاءة العمل، إذ يقلل من المدة الزمنية لإنجاز مهمة مقارنة بالبشر. غالبًا ما يكون أكثر دقة من البشر. عيوب الذكاء الاصطناعي عدم القدرة على التعميم من مهمة إلى أخرى. أي يمكن للآلة أن تنفذ مهمة (أو عدة مهمات) محددة مُدربة عليها مسبقًا فقط، ولايمكنها أن تنفذ مهمة لم تُدرب عليها مُسبقًا. التكلفة (تكلفة تنفيذ تطبيقات الذكاء الاصطناعي مرتفعة للغاية). قلة الكفاءات (يتوفر عدد قليل من المبرمجين الأكفاء القادرين على تطوير برامج الذكاء الاصطناعي). يتطلب خبرة فنية عميقة. الروبوتات هي إحدى تطبيقات الذكاء الصناعي التي تحل محل الوظائف التي يشغلها البشر، وبالتالي قد تؤدي إلى تزايد البطالة. كيف يتم استخدام الذكاء الصناعي اليوم؟ يُستخدم الذكاء الاصطناعي بمستويات متفاوتة من التطور على نطاق واسع وعبر مجموعة من التطبيقات اليوم. لابد وأنك تستخدم اليوتيوب أو الفيسبوك، ولابد أنك لاحظت أنهم يقترحون لك مقاطع فيديو مُشابهة لما تُشاهده في العادة، هذه الاقتراحات هي من فعل "أنظمة التوصية" (أو أنظمة الاقتراح) التي تُراقب ما تبحث عنه في العادة لكي تقترح لك في المرات القادمة أشياء مُشابهة. من الأمثلة الأخرى برامج الدردشة التي تراها على مواقع الويب أو إن كنت من مستخدمي ويندوز فربما أنت تعرف المساعد الافتراضي الذكي آليكسا. يُستخدم الذكاء الاصطناعي أيضًا للتنبؤ بحالة الطقس والتنبؤات المالية (كأسعار الأسهم) ولتبسيط عمليات الإنتاج، كما يُستخدم في الألعاب والنقل والتسوق ومعالجة اللغة البشرية وغير ذلك الكثير. عمومًا، يمكن القول أن الذكاء الاصطناعي بدأ التشعب في جميع مفاصيل حياتنا اليومية وسيزداد استخدامه أكثر ويصبح البشر أكثر اعتمادًا عليه من قبل في السنوات القادمة. مستقبل الذكاء الاصطناعي في مؤتمر Web Summit في أواخر عام 2017، قدم الفيزيائي ستيفن هوكينغ رأيه حول مستقبل الذكاء الاصطناعي. كان يأمل في أن تتفوق التكنولوجيا على الذكاء البشري. قد يعني هذا على الأرجح أنه سيتم الشفاء من العديد من الأمراض الرهيبة وربما تكون هناك طرق للتعامل مع المشكلات البيئية، بما في ذلك تغير المناخ. لكن كان هناك جانب مظلم أيضًا. تحدث هوكينج عن إمكانية أن تكون التكنولوجيا "أسوأ حدث في تاريخ حضارتنا"، فربما تُحدث بعض المشاكل مثل البطالة الجماعية وحتى الروبوتات القاتلة! لهذا السبب، حث على طرق للتحكم في الذكاء الاصطناعي. أفكار هوكينغ ليست مجرد كلام على الهامش بالتأكيد، فقد أعرب رواد الأعمال البارزين في مجال التكنولوجيا مثل إيلون ماسك وبيل غيتس مرارًا وتكرارًا عن قلقهم العميق بشأن الذكاء الاصطناعي. على الجانب الآخر هنا الكثير من العلماء ورواد الأعمال المتفائلون. ماسايوشي سون، الرئيس التنفيذي لشركة SoftBank ومدير صندوق Vision هو واحد منهم. في مقابلة مع CNBC، أعلن أنه في غضون 30 عامًا، سيكون لدينا سيارات طائرة وسيعيش الناس لفترة أطول وسنكون قد عالجنا العديد من الأمراض. أشار أيضًا إلى أن التركيز الرئيسي لصندوقه ينصب على الذكاء الصناعي. بغض النظر عن كل ذلك، هناك شيء واحد مؤكد: سنرى في السنوات القادمة الكثير من الابتكارات والتطورات في الذكاء الصناعي، خصوصًا وأن هناك مبالغ ضخمة مستثمرة فيه. لنلقي الآن نظرةً على بعض المجالات التي من المحتمل أن يكون لها تأثير كبير على المجتمع: السيارات ذاتية القيادة: لقد كانت سمة مميزة للعديد من قصص الخيال العلمي لعقود عديدة! لكنها الآن أقرب إلى الواقع من الخيال -يمكننا ملاحظة مؤشرات ذلك من التطورات الأخيرة في سيارات تسلا من شركة تسلا موتورز التابعة لإيلون ماسك. السباق الاقتصادي بين الدول: توظيف الذكاء الاصطناعي في تسريع عجلة الاقتصاد والتصنيع بمختلف المجالات والتنافس على المرتبة الاقتصادية الأولى عالميًا. البطالة التكنولوجية: اكتسب هذا المفهوم شهرةً من الاقتصادي الشهير جون مينارد كينز خلال فترة "الكساد الكبير"، والذي يُشير إلى كيف يمكن أن تؤدي الابتكارات إلى فقدان الوظائف على المدى الطويل. عمومًا قد تكون هذه الرؤية غير دقيقة، فغالبًا ما تخلق الأشياء الجديدة أعمالًا جديدة للإنسان. تسليح الذكاء الاصطناعي: يُعد تسليح الذكاء الاصطناعي أو استخدام الذكاء الاصطناعي في مجال الصناعات الحربية والدفاعية أحد أكبر التهديدات التي تواجه المجتمع الدولي. اكتشاف الأدوية: تواجه شركات الأدوية العديد من المشاكل في التوصل إلى العلاجات لذا يجري الاعتماد على الذكاء الاصطناعي لتسريع العجلة وتخطي العقبات. إن تطوير الأدوية بالطريقة التقليدية غالبًا ما ينطوي على الكثير من التجربة والخطأ، مما قد يستغرق وقتًا طويلًا، إذن هل يمكن أن يكون هناك طريقة أفضل؟ يتطلع الباحثون إلى الذكاء الاصطناعي للحصول على المساعدة، وهناك العديد من الشركات الناشئة التي تحاول انتهاز هذه الفرصة للظهور. هناك العديد من المجالات الأخرى التي من المتوقع أن تتأثر مثل الأمور الحكومية والاجتماعية والتي لايسعنا ذكرها كلها الآن. اللغات والأدوات المستخدمة في الذكاء الصناعي هناك العديد من اللغات والأدوات المُساعدة في إنشاء نماذج الذكاء الاصطناعي، ومعظمها مفتوح المصدر. سنلقي الآن نظرةً على بعض اللغات والأدوات الأكثر شيوعًا للذكاء الاصطناعي: لغة بايثون Python هي لغة عالية المستوى مُفسَّرة ذات مجالٍ عام، وهي مرنةٌ وتحاول التعبير عن المفاهيم البرمجية بأقل قدر ممكن من الشيفرات. تدعم هذه اللغة البرمجة الكائنية والبرمجة الإجرائية، وفيها مكتبة قياسية كبيرة. تُعتبر لغة بايثون اللغة الأفضل للتعامل مع مهام الذكاء الصناعي، حيث تتميز بسهولة الاستخدام وسرعة التنفيذ، إضافةً إلى احتوائها على مكتبات هامة وأطر عمل لا غنى عنها، حيث أن أغلب أطر العمل تعمل عليها، وقد وفرت أكاديمية حسوب دورة متخصصة لتعلم الذكاء الاصطناعي وتعلم الآلة Machine Learning والتعلم العميق Deep Learning وغيرها من المفاهيم باستخدام لغة بايثون وباتباع بأسلوب عملي وشيق يركز على ممارسة ما تتعلمه من خلال مشاريع حقيقية تفيدك في سوق العمل. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن وتتضمن لغة بايثون العديد من المكتبات التي لا غنى عنها في مجال الذكاء الصناعي مثل: نمباي Numpy: تُعد مكتبة نمباي إحدى مكتبات لغة بايثون. تستخدم لتنفيذ عمليات الحوسبة العلمية والتعامل مع المصفوفات، وتهدف إلى توفير كائن مصفوفة سريع جدًا. باندا Panda: توفر هياكل بيانات وأدوات تحليل بيانات عالية الأداء وسريعة وسهلة الاستخدام لمعالجة البيانات الرقمية والسلاسل الزمنية. ماتبلوتليب Matplotlib: هي مكتبة شاملة لإنشاء رسوم بيانية ثابتة ومتحركة وتفاعلية في بايثون. سيبورن Seaborn: هي مكتبة رسوم بيانية مبنية على ماتبلوتليب. توفر واجهة عالية المستوى لرسم رسومات إحصائية جذابة وغنية بالمعلومات. أطر العمل Frameworks هناك عدد لا يحصى من أطر عمل الذكاء الاصطناعي، والتي توفر أنظمة شاملة لبناء النماذج وتدريبها ونشرها. إليك بعضًا من أهم هذه الأطر: تنسرفلو TensorFlow: هو إطار العمل الأكثر شعبية والمدعوم من شركة جوجل. بدأت الشركة في تطوير إطار العمل هذا في عام 2011، من خلال قسم دماغ جوجل Google Brain. كان الهدف هو إيجاد طريقة لإنشاء شبكات عصبية أسرع؛ لإتاحة إمكانية تضمين تكنولوجيا الذكاء الصناعي في التطبيقات. كيراس Keras: واحد من أطر العمل المهمة الأخرى، والذي ظهر لأول مرة في عام 2015 على يد الباحث فرانسوا كوليت (أحد باحثي جوجل). توفر كيراس واجهات برمجة تطبيقات متسقة وبسيطة، ويقلل من عدد إجراءات المستخدم المطلوبة لحالات الاستخدام الشائعة، ويوفر رسائل خطأ واضحة وقابلة للتنفيذ. كما أن لديها وثائق موسعة للمطورين. دُمجت كيراس مع تنسرفلو بدءًا من 2017. باي تورش PyTorch: في السنوات الأخيرة ظهر إطار عمل آخر يُدعى باي تورش مدعوم من قبل شركة ميتا Meta. إنها إطار عمل آخر مفتوح المصدر مستندة على تورش Torch. تتميز باي تورش عن أطر العمل الأخرى بكونها بايثونية أكثر (عندما تكتب النماذج باستخدامها تشعر وكأنك تكتب شيفرة بايثون عادية)، كما أن الباحثين يتجهون إلى استخدامها أكثر في الآونة الأخيرة. فرص العمل في تخصص الذكاء الاصطناعي مهندسو الذكاء الاصطناعي هم الأفراد الذين يقومون بتصميم وبناء واختبار وتحديث أنظمة وتقنيات الذكاء الاصطناعي التي يمكن أن تساعد المؤسسات على زيادة الكفاءة وخفض التكاليف وزيادة الأرباح واتخاذ قرارات أفضل. نظرًا للنمو الكبير والانتشار السريع للذكاء الاصطناعي، هناك حاجة إلى المهنيين المتخصصين في مجالاته المختلفة الآن أكثر من أي وقت مضى. الخبر السار هو أن هذا المجال مليء بالفرص الوظيفية المختلفة، مما يعني أنه يمكنك تولي أدوار ومسؤوليات مختلفة اعتمادًا على منصبك أو خبرتك أو اهتماماتك وبما أن الطلب مرتفع فالخبرة هي المقياس الوحيد ويمكن تخطي الشهادة الجامعية. تختلف رواتب مهندس الذكاء الاصطناعي بناءً على الخبرة والبلد، كما قد تختلف التعويضات من مؤسسة إلى أخرى. يمكنك البحث عن رواتب مهندس الذكاء الاصطناعي في موقع Glassdoor وملاحظة الفرق بسهولة. كما أن الراتب يختلف من تخصص لآخر، فراتب مهندس الذكاء الاصطناعي يختلف عن راتب المهندس الباحث في الذكاء الاصطناعي. وفقًا Glassdoor، فإن متوسط الراتب لمهندس الذكاء الاصطناعي في الولايات المتحدة هو 119297 دولارًا، ويمكن أن ينخفض الرقم إلى 78000 دولار أو يصل إلى 150 ألف دولار أو أكثر. أما في بلد عربي مثل الإمارات، فوفقًا للموقع المتخصص erieri، يبلغ متوسط الأجر لمهندس الذكاء الاصطناعي هو 337،135 درهمًا إماراتيًا في السنة، وهذه الأرقام إن دلت على شيء فإنها تدل على الأجر المرتفع للعامل في هذا المجال. كيفية تعلم الذكاء الاصطناعي ربما تطرح السؤال التالي كمبتدأ: كيف أتعلم الذكاء الصناعي؟ ومن أين أبدأ؟ يتطلب تعلم الذكاء الصناعي ما يلي: خلفية علمية بسيطة على الأقل (كلما زادت كان أفضل) في علم الجبر والجبر الخطي والإحصاء والاحتمالات والتحليل (لاسيما الاشتقاقات). خلفية برمجية جيدة، والقدرة على استخدام لغة بايثون (لا يجب أن تكون محترفًا لتبدأ، الاحتراف يأتي مع الممارسة والوقت). تعلم أُطر العمل الأساسية. هنا لن تحتاج إلى تعلم جميع أُطر ومكتبات الذكاء الصناعي؛ الأمر يعتمد على الفرع والمواضيع التي ترغب بالتخصص فيها. يمكنك أن تتعلم المجال إما بدخول أروقة الجامعة وهو الطريق الأطول الذي يأخذ عدة سنوات ولا توفر أغلب الجامعات تعلم مجال الذكاء الاصطناعي من البداية بل يكون ضمن برامج الماجستير والدراسات العليا، عدا عن التركيز على الجانب النظري والتقنيات القديمة، وقد فصلنا هذه النقطة في فقرة "طرق لتعلم البرمجة" من مقال كيف تتعلم البرمجة: نصائح وأدوات لرحلتك في عالم البرمجة. وفي أي حال يُنصح دومًا بالدورات البرمجية والمخيمات والكتب المتخصصة لتعلم المجال منها خصوصًا ما هو عملي ومطلوب في سوق العمل، وإحدى أفضل الدورات العربية التي تعلمك تخصص الذكاء الاصطناعي دورة تطوير التطبيقات باستخدام لغة Python الشاملة التي تبدأ من الصفر حيث تعلمك أساسيات البرمجة وحتى احترافها بلغة بايثون ثم تعلمك أساسيات الذكاء الاصطناعي وتعلم الآلة بإنشاء تطبيقات عملية تضيفها في معرض أعمالك، كما أن الدورة تضمن لك دخول سوق العمل بعد التخرج مباشرةً. إليك مصادر إضافية عربية لتعلم الذكاء الاصطناعي توفرها أكاديمية حسوب: تعلم الذكاء الاصطناعي: مقال شامل لتعلم الذكاء الصناعي موجه للمبتدئين. البرمجة بلغة بايثون: تعلم لغة بايثون تمهيدًا لكتابة تطبيقات ذكاء اصطناعي وتعلم آلة بها. مدخل إلى الذكاء الاصطناعي وتعلم الآلة: تعرف على أساسيات الذكاء الاصطناعي وتعلم الآلة. عشرة مشاريع عملية عن الذكاء الاصطناعي: طبق ما تعلمته على مشاريع ذكاء اصطناعي عملية بلغة بايثون. قسم الذكاء الاصطناعي: يحوي مقالات متنوعة عن كل ما يتعلق بمجال الذكاء الاصطناعي. أهم مصطلحات الذكاء الصناعي إليك قائمة مُختصرة بأهم المصطلحات والمفاهيم ذات الصلة بدراسة الذكاء الاصطناعي وتخصصاته: المصطلح الترجمة التعريف (Artificial intelligence (AI الذكاء الصناعي العلم الذي يحاول فهم الكيانات الذكية وبناء الآلات ذكية (Natural Language Processing (NLP معالجة اللغات الطبيعية العلم الذي يحاول فهم وتوليد ومعالجة اللغات البشرية (Computer vision (CV الرؤية الحاسوبية بناء تطبيقات ذكية قادرة على فهم محتوى الصور كما يفهمها الإنسان (Machine learning (ML تعلم الآلة قدرة الآلة على تقليد السلوك البشري الذكي من خلال بناء الخوارزميات التي "تتعلم" من البيانات (Reinforcement learning (RL التعليم المعزز أحد أنواع تعلم الآلة (Supervised learning (SL التعليم الخاضع للإشراف أحد أنواع تعلم الآلة (Semi-Supervised learning (SSL التعليم شبه الخاضع للإشراف أحد أنواع تعلم الآلة (UnSupervised learning (USL التعليم غير الخاضع للإشراف أحد أنواع تعلم الآلة (Deep Learning (DL التعلم العميق نوع من التعلم الآلي والذكاء الاصطناعي الذي يُقلد الطريقة التي يكتسب بها البشر أنواعًا معينة من المعرفة (Artificial neural networks (ANNs الشبكات العصبية الاصطناعية مجموعة مترابطة من عصبونات افتراضية تُنشئها برامج حاسوبية لتُشابه عمل العصبون البيولوجي (Robotic Process Automation (RPA أتمتة العمليات الآلية أحد أشكال تكنولوجيا أتمتة العمليات التجارية بناءً على روبوتات البرمجيات Expert systems الأنظمة الخبيرة برنامج مصمم لينفد مهاماً متعلقة بالخبرة البشرية Fuzzy Logic منطق ضبابي أو ترجيحي أو غيمي فرع من الذكاء الصناعي يُقدم حلولًا جديدًا ويرتكز على توسيع مفهوم المنطق الثنائي الكلاسيكي (Convolutional Neural Network (CNN شبكة عصبية التفافية نوع خاص من أنواع الشبكات العصبونية (Recurrent Neural Network (RNN شبكة عصبية تكرارية نوع خاص من أنواع الشبكات العصبونية (Long Short-Term Memory Network (LSTM الشبكات ذات الذّاكرة الطويلة قصيرة المدى نوع خاص من أنواع الشبكات العصبونية التكرارية RNNs Pre-trained Model نموذج مُدرّب مُسبقًا شبكة عصبية مُدربة مُسبقًا على مجموعة بيانات، ويمكن استخدامها وتكييفها على مهمة أخرى Model نموذج أداة أو خوارزمية تعتمد على مجموعة بيانات معينة يمكن من خلالها التوصل إلى قرار Transfer Learning نقل التعلم تخزين المعرفة المكتسبة أثناء حل مشكلة واحدة وتطبيقها على مشكلة مختلفة ذات صلة Optimization الاستمثال - التحسين اختيار العنصر أو القيمة الأمثل من بين مجموعة ممكنة من العناصر Structured Data البيانات المهيكلة البيانات المنظمة ضمن جداول Unstructured Data البيانات غير المهيكلة البيانات الغير منظمة، مثل الفيديو والصور والصوت Data augmentation تكثيف البيانات تقنية لتوليد بيانات جديدة من بيانات موجودة (مثل توليد صور جديدة من صورة معينة) Regression التوقع أحد تقنيات التعليم الخاضع للإشراف Clustering التجميع أحد تقنيات التعليم غير الخاضع للإشراف Classification التصنيف أحد تقنيات التعليم الخاضع للإشراف Logistic Regression الانحدار اللوجستي خوارزمية تعلم آلي للتصنيف Linear Regression الانحدار الخطي خوارزمية تعلم آلي للتنبؤ Neuron عصبون أحد عناصر الشبكات العصبونية Learning Rate مُعدّل التعلّم ‏ معلمة فائقة تُحدد مقدار التعلم في خوارزميات الذكاء الصناعي خاتمة كانت هذه المقالة بمثابة مدخل إلى الذكاء الاصطناعي؛ إنها تُجيبك عن العديد من الأسئلة المتعلقة بالذكاء الصناعي، مثل مفهومه وتعريفه وأهميته وتطبيقاته ومجالاته والتقنيات التي يدعمها وتخصصاته وأدواته والبدء في تعلمه …إلخ. وسنتحدث في المقالات القادمة عن العديد من الأمور الأخرى المتعلقة بالذكاء الصناعي ونتوسع بالنقاط التي ذكرناها في هذا المقال التي سيطول ذكرها والحديث عنها. يعدنا الذكاء الاصطناعي بأنه سيغير العالم، والخبر السار هو أن هناك العديد من الأشخاص الذين يركزون على جعل هذا حقيقةً واقعةً، ولا يتعلق الأمر بجني مبالغ طائلة أو الحصول على الشهرة؛ الهدف هو مساعدة البشرية وتغيير العالم إلى الأفضل. اقرأ أيضًا الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية الذكاء البشري مقابل الذكاء الاصطناعي أهمية الذكاء الاصطناعي تعلم لغة بايثون فوائد الذكاء الاصطناعي لغات برمجة الذكاء الاصطناعي
    5 نقاط
  2. علوم الحاسوب computer science (أو يطلق عليه علوم الكمبيوتر أو علوم الحاسبات بالعامية) هو روح العصر الحديث ويمثل مجال التقنية التي دخلت في كل مفاصل حياتنا، فهو يدخل في كل صغيرة وكبيرة من حولنا بدءًا من الهواتف المحمولة والحواسيب والآلات والمصانع وكل شيء بما لا يمكن حصره من المنتجات والخدمات حيث أسهم في نقلنا إلى مرحلة أعلى من الفعالية والجودة والفائدة. هذا المقال هو دليل شامل للتعرف على اختصاص علوم الحاسب وفوائده وتطبيقاته والمواد التي تدرس فيه والمجالات المتفرعة منه ثم سنناقش بعض الأسئلة المهمة المتعلقة بجدوى اختيار تخصص علوم الحاسوب ودراسته وما هي فرص العمل المتوفرة في مجال علوم الحاسوب وسنعرف أيضًا الفرق بين علم الحاسوب وهندسة الحاسوب وأخيرًا سنرشدك إلى كيفية البدء في دراسة اختصاص علوم الحاسب ذاتيًا وندلك على بداية الطريق لتنطلق إن أحببت المجال. هل أنت جاهز؟ لننطلق! فهرس المحتويات حرصًا على تنظيم المقالة ولتسهيل الوصول إلى القسم الذي تريده بسهولة، سنذكر هنا جدول المحتويات باختصار: ما هي علوم الحاسب؟ فوائد وتطبيقات علوم الحاسوب هل تعلم علوم الحاسوب مفيد؟ مواد علوم الحاسوب تخصصات علوم الحاسب كيف أختار التخصص المناسب لي من تخصصات علوم الحاسب؟ التوظيف وفرص العمل في مجال علوم الحاسوب ما الفرق بين علوم الحاسب وهندسة الحاسب؟ من أين أبدأ بتعلم علوم الحاسب؟ ما هي علوم الحاسب؟ تُعرَف علوم الحاسوب بأنها كل العلوم المتعلقة بالآلات الحسابية والمنطقية، حيث تعمل بدارات إلكترونية، وقد تكون علومًا نظريةً مثل نظرية المعلومات Information Theory أو تطبيقية مثل البرمجيات Software أو العتاد Hardware. والبرمجيات software هي الأنظمة غير الملموسة التي تُشغّل عتاد الحواسيب hardware وتقوم بمهام المستخدمين المطلوبة، بينما العتاد هو القطع الفيزيائية الملموسة التي تُكوّن النظام الحاسوبي مثل المعالِج والذاكرة العشوائية RAM والقرص الصلب …إلخ. وتتشعّب علوم الحاسوب وتترابط مع بعضها بعضًا، إذ لا يمكنك دراسة البرمجة دون دراسة الخوارزميات وهياكل البيانات، كما لا يمكنك دراسة علوم الذكاء الاصطناعي دون دراسة الجبر الخطّي والاحتمالات وعدد آخر من علوم الرياضيات. فوائد وتطبيقات علوم الحاسوب نَذكُر من فوائد وتطبيقات علم الحاسوب ما يلي: تعد شبكة الإنترنت واحدة من أفضل الاختراعات في التاريخ الإنساني، فهي شبكة حاسوبية تصل مناطق العالم ببعضها البعض. حواسيب سطح المكتب والحواسيب المحمولة التي نعمل عليها أو نرفّه خلالها عن أنفسنا …إلخ، جميعها قائمة على علوم الحاسوب وتخصصات الحاسب. الهواتف المحمولة وتطبيقات الهواتف الذكية التي نستعملها للتسوق أو طلب سيارة أجرةٍ أو طلب الطعام والدواء وغير ذلك فكلها تطبيقات حاسوبية. أجهزة إدارة المصانع والعمليات التصنيعية التي تُستعمل لتخطيط تصنيع المنتجات الغذائية وغير الغذائية، فهي مبنيّة بالأساس على برامج وخوارزميات ورياضيات حاسوبية، فلولاها لما تطورت أنظمة التصنيع التي لدينا إلى مرحلة تكفي احتياجات الجنس البشري. الأجهزة الطبية التي تُنقَذ بها حياة الناس في المستشفيات، وأجهزة الاستشعار والإدارة العسكرية، والأجهزة التي تساعد على إدارة الأسواق الاقتصاد والمال وغيرها، فكلها موجودة بفضل علوم الحاسوب. ولعلك تشاهد بعضًا من فوائد هذه العلوم بنفسك، فلا تحتاج من يخبرك عنها. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن هل تعلم علوم الحاسب مفيد؟ قد تفكر في نفسك الآن وتقول هل من المجدي لي أن أتخصص في مجال علم الحاسوب وأتعلمها سواء للدراسة والبحث الأكاديمي أو للعمل والوظيفة مستقبلًا؟ والجواب هو نعم، فالأمر مُجدٍ وأنصح به بشدة، إذ يحصل متخصصو علوم الحاسوب على رواتب أعلى من العديد من نظرائهم المهندسين غير العاملين في المجال، كما تزداد الرواتب بازدياد الخبرة ونُدرة المجال الذي يتخصص فيه المرء؛ فمثلًا لا يتساوى مُطوّر واجهات الاستخدام بمهندس يجيد الذكاء الاصطناعي وتعلم الآلة، وكذلك لا يتساوى مع مهندسي البرمجيات ومهندسي العتاد. وبغض النظر عن عامل الوظيفة والراتب والمال، يساعدك تعلم علوم الحاسوب على بناء مشاريع حقيقيةٍ يمكنك أن تستفيد منها أو تغيّر بها العالم، مثلًا انظر كيف غير مارك زوكيبربيرغ طريقة تواصل المليارات من البشر وكامل التاريخ الإنساني بسبب تطويره لموقع إنترنتٍ، وانظر كذلك كيف تتحكم العملات الرقمية وتغير الاقتصاد العالمي في وقتنا الحالي. ويؤهلك تعلم علوم الحاسب لإنشاء خدمات ومواقع وبرمجيات وأنظمة حسبما تحتاج، ومن ثَم تستفيد منها سواءٌ لنفسك أو تبيعها للآخرين إما على شكل وظيفةٍ، أو خبرةٍ كما في مجال العمل الحُرّ. ولا يعني هذا بالطبع أنك ستكون مالك شركة مايكروسوفت المستقبلي، وكذلك لن تكون مارك الذي سيغيّر العالم، إلا أنك ستمتلك نفس الخبرات والأدوات التي امتلكوها عندما فعلوا ذلك، أما الباقي فيعتمد عليك وعلى اجتهادك ومثابرتك. مواد علوم الحاسب سنتحدث في هذا القِسم عن مواد تخصص علوم الحاسب وتفريعاتها المختلفة، وأبرز المواد التي تُدرّسها معظم الجامعات حول العالم لطلابها الراغبين بتَعلّم هذا التخصص، ومعظم هذه المواد مُستوحاةٌ من الفهرس الأكاديمي لجامعة ستانفورد لعلوم الحاسبات، هذا بالإضافة لعددٍ من الجامعات الأخرى. 1. أساسيات الهندسة وهندسة البرمجيات تعد من أول المواد التي يدرسها الطلاب وتهدف للإجابة على أسئلة متنوعة مثل ما هو تعريف الهندسة وما هي عمليات الإدخال والإخراج وكيف تصمم منتجًا أو برنامجًا أو مشروعًا وما هي الخطوات العملية لتصميم وهندسة نظام ما وغيرها. والهدف الرئيسي من هذه المادة هو نقل وتوصيل معنى الهندسة للطلاب، وذلك بإدراكهم أن عملية إنشاء الأنظمة هي خليطٌ مُتقنٌ من التخطيط والترتيب، فهي ليست عمليةً عشوائيةً بسيطةً، وعادةً لا تحتوي هذه المادة على مشاريع برمجية حقيقية، وقد تشتمل على مشاريع بسيطة في بعض الجامعات. ويَتعلّم الطالب في هذه المادة عددًا من التقنيات والأدوات الشائعة لتوصيف الأنظمة وتصميماتها، مثل لغة النمذجة الموحدة Unified Modeling Language واختصارًا UML وآلات الحالة State Machines وغيرها من التقنيات. 2. الرياضيات الأساسية مادة الرياضيات مادةٌ أساسيةٌ لدى جميع طلاب الهندسة عمومًا؛ لذلك من الضروري أن يُدرك الطالب أساسيات الرياضيات مثل العمليات الحسابية والتفاضل والتكامل والجبر وحسابات الأشكال الهندسية وغير ذلك من العمليات الرياضية البسيطة. ولا تُعلّم هذه المادة في الجامعات بهدف الرياضيات ذاتها؛ فبمجرد انتهائك من المادة ستنسى غالبًا تلك المعادلات الرياضية، ولكن الهدف هو تعويد الطالب على استخدام العقل لحساب ما لم يقدِر على حسابه من قبل، فمواجهة القليل من الصعوبة في التَعلّم تُفتّح الذهن وتُعوّده على تحمّل الأكثر صعوبةً من هذه الرياضيات البسيطة مستقبلًا. 3. الرياضيات الخطية ستتعلم في الرياضيات الخطية أو الجبر الخطي أساس حلّ المعادلات الرياضية، مثل معادلات الدرجة الأولى والثانية والثالثة، وبعض الأساليب والقوانين الرياضية لحلها بسهولة. كما ستتعلم بعض الأمور عن المصفوفات وطريقة التعامل معها وإجراء بعض الحسابات لها وطريقة الاستفادة منها مثل المصفوفات أولية وثنائية وثلاثية الأبعاد. 4. التفاضل والتكامل هنا ستتعمق في التفاضل والتكامل بعد اطلاعك عليها بصورة مبسطة بالفعل في إحدى المواد الرياضية السابقة، وستتعرف عليهما بالتفصيل، وكيف تستخدمها لحل بعض المشكلات الحقيقية في العالم، كما ستعرف بعض قواعد التفاضل والتكامل. وقد تكون هذه المادة متقدمة على بعض الطلاب مثل أغلب مواد الرياضيات، وذلك لأن الطالب يتعلم فيها المعادلات والقواعد والقوانين دون أن يُعلّم من أين جاءت ولا كيف ولماذا سيتعلمها ولا أين سيستخدمها في حياته المستقبلية. 5. تصميم المنطق الرقمي ستتعلم في مادة تصميم المنطق الرقمي Digital Logic Design أهم أركان التفكير المنطقي، وكيفية تمثيل الحجج والنقاشات والمعضلات في العالم الحقيقي على شكل معادلات رياضية ومنطقية وكذلك قد تتعلّم بعض الأمور عن المجموعات Sets في الرياضيات وطريقة استخدامها لتمثيل معلومة أو بيانات معينة. كما ستتعلم تصميم البوابات المنطقية Logic Gates مثل and و or و nor و xor و not وغيرها، وكذلك ستفهم الطريقة العامة لعمل المعالجات داخل الحواسيب والأجهزة الإلكترونية. وهذه المادة واحدةٌ من بين أكثر المواد إفادةً ضمن علم الحاسوب لأن طريقة التفكير المنطقية هذه ستنقلك من إنسان عشوائي التفكير قد لا يفكر بمنطقية في معظم أمور حياته إلى إنسان يفهم الحياة بصورة منطقية كما تفهمها الآلات ويَسهُل عليه تحديد ما هو منطقي وما هو غير منطقيٍ من الحجج والمعلومات التي حوله، كما ستفهم كيفية تحويل الأفكار إلى أنظمة فيزيائية وبرمجية داخل الحواسيب بحيث تُستعمَل لإكمال تصميم الحواسيب وتُجري العمليات الحسابية المطلوبة. أي الغرض من هذه المادة أن ترى كيف يعمل الحاسوب وكيف يفهم الأوامر وينفذها حتى تعرف كيف ستتعامل معه وتبرمجه وتتخاطب معه بسهولة. وفقًا لما سبق، من الأفضل التركيز عليها كونها واحدةٌ من أهم المواد في المجال، وقد تُدرّس هذه المادة على عدة مواد منفصلة، لذلك قد تجد موادًا شبيهةً مثل التفكير المنطقي Critical Thinking والرياضيات المتقطعة Discrete Mathematics، فكلّ على حسب الجامعة والتخصص. 6. الاحتمالات مادة الرياضيات الأخيرة التي ستتعلّمها هي مادة الاحتمالات Probabilties أو نظرية الاحتمالات Probability Theory، وهي مادةٌ تهدف إلى تعليمك أهم مبادئ هذا العلم بالإضافة لأنواع الاحتمالات المُمكنة حسب الأحداث Events وطريقة ارتباطها ببعضها البعض ليُستفاد منها في الحياة الواقعية إما في اتخاذ قرارات المؤسسات أو إجراءات أصغر من ذلك سواءٌ على مستوى الأفراد أو الأجهزة الرقمية. والاحتمالات علم عميق تقوم عليه الكثير من الرياضيات الحديثة، كما يقوم عليه علم التعمية Cryptography المُستخدم في تأمين وتشفير الاتصالات والشبكات، وستستفيد من هذه المادة كثيرًا في المستقبل متى أتقنتها. 7. البرمجة من البداهة أن توجد مادة مختصة بتعلم البرمجة في تخصص علوم الحاسب أو التخصصات المرتبطة به، وذلك لأن البرمجة هي لبّ علوم الحاسب في النهاية، فجميع الأجهزة والأنظمة التي حولنا ما هي إلا برمجيات وخوارزميات مختلفة صنعت لتعمل بطريقة معيّنة. كانت لغة جافا Java أبرز لغة برمجةٍ تُعلّم في الجامعات قبل عقد من الزمن، بينما تميل الكفة الآن إلى بايثون Python أو جافاسكربت في بعض الأحيان، ولكن بايثون هي الأكثر استعمالًا واعتمادًا في الجامعات لما لها من تطبيقات لاحقة في جميع المجالات الأكاديمية الأخرى. وفي كل الأحوال ستتعلّم في هذه المادة المتغيرات والخوارزميات وحلقات التكرار والجمل الشرطية والبرمجة كائنية التوجه وغيرها من المبادئ البرمجية، وذلك بِغَض النظر عن لغة البرمجة التي ستتعلّمها. كما قد تُعلّم القليل من استخدام بيئة ماتلاب Matlab وهي بيئة برمجية ولغة برمجة تُستخدَم لإنشاء الحسابات الرياضية وبرمجة برمجيات معينة، لذلك فهي منصة ولغة برمجة في آنٍ واحدٍ، ويستعمل ماتلاب طلاب أقسام الهندسة الأخرى لمحاكاة وحساب المعادلات والنماذج الرياضية. 8. الخوارزميات وهياكل البيانات الخوارزميات Algorithms وهي الإجراءات المنطقية المتسلسلة لحلّ مشكلة ما، وسنتعلّم الخوارزميات وأفضل الطرق لتصميمها من أجل حل مختلف المشكلات التي قد تظهر لنا في المستقبل، حيث سنحتاج إلى معرفة متى نستعمل خوارزمية بعينها من أجل حل مشكلة ما، ومتى سنلجأ لخوارزمية أخرى نعرف أنها ستعطينا أداءً أفضل، بمعنى أننا سنغوص في الموازنة بين مختلف الخوارزميات وأدائها مثل السرعة والوقت ومساحة التخزين، ومتى يجب استعمال كلّ واحدةٍ منها كما سنطّلع على مختلف تشعيبات الخوارزميات المتوفرة. هياكل البيانات Data Structures وهي طريقة تخزين البيانات واستعمالها بغرض تحقيق أهدافٍ مختلفةٍ حسبما يريد المُطوّر؛ فهناك هياكل بياناتٍ أسهل وأوضح للفهم العام، وهناك هياكل بيانات أسرع في الأداء، وهناك هياكل بيانات غير سريعة في الأداء لكنها تستهلك حجمًا أقل في تخزين البيانات وبالتالي قد تفضل على غيرها في بعض الأحيان. وستتعلم كل هذه الأمور في هذه المادة، وربما تقسم هذه المادة إلى مادتين على حسب الجامعة والاختصاص الذي تدرسه، كما ستطلع على أنماط التصميم Design Patterns إذا كنت ستدرس هندسة البرمجيات؛ وهي الأنماط الشهيرة لتصميم البرمجيات بحيث لا تحتاج لإعادة اختراع العجلة مرة أخرى من أجل كل مشكلة تواجهها. 9. مبادئ أنظمة التشغيل أنظمة التشغيل هي البرمجيات الأساسية التي تُدير الأجهزة الحاسوبية والهواتف والأنظمة المدمجة وغيرها، حيث توزع الموارد على البرمجيات وتدير تشغيلها وعملها ومراقبتها للمستخدم، وأبرز أنظمة التشغيل على سطح المكتب هي ويندوز Windows وماك Mac ولينكس Linux، أم فيما يتعلق بأنظمة تشغيل الهواتف الذكية، فلدينا نظام أندرويد Android الذي يعمل على مختلف الأجهزة ونظام iOS الذي يعمل على أجهزة آبل Apple فقط. وستتعلم في هذه المادة أساسيات عمل أنظمة التشغيل المختلفة، بالإضافة لأبرز المبادئ التي تعمل بها أنظمة التشغيل الحالية مثل العمليات وأجهزة الإدخال والإخراج Input/Output وإدارة الذاكرة والوصول للمعالِج ونظام الوصول والصلاحيات وإدارة المستخدمين وغير ذلك. وستضع عليك معظم الجامعات واجبات منزلية بلغة سي C في هذه المادة، لذلك سيكون عليك تَعلّمها إن أردت اجتياز هذه المادة بنجاح. 10. مبادئ الشبكات الشبكات هي كذلك من أبرز سمات العصر الحديث فشبكات الاتصال الخلوية وشبكة الإنترنت والشبكات المنزلية كلها غيّرت شكل العالم الحديث وساهمت في فوائد جمة لا تعد ولا تحصى فبدون علم الشبكات، لن تتمكن من قراءة هذا المقال الآن. وستتعلم في هذه المادة أساسيات الشبكات وطريقة عملها، وستطّلع على بروتوكولات التواصل أشهرها بروتوكول TCP وبروتوكول UDP، كما ستطّلع على بعض المفاهيم والأجهزة الأخرى مثل الموجه Router والخوادم Servers وأجهزة العملاء Clients والنظير للنظير Peer to Peer وغير ذلك من مبادئ الشبكات البسيطة. وسيطلب منك غالبًا برمجة برنامج محادثة بسيط بأي لغة برمجةٍ تريدها وذلك باستخدام أحد بروتوكولات التواصل، وهو ما سيوضح مدى فهمك وتعلمك لهذا المساق. 11. معمارية الحاسوب إلى هنا سيكون طالب علم الحاسوب قد فهم بالفعل معظم الأساسيات التي سيحتاج إليها، ولكن مادة معمارية الحاسوب أو بنية الحاسوب Computer Architecture ستتعمق في تفاصيل دقيقة حول مكونات الحاسوب الفيزيائية وكيفية تواصلها مع بعضها بعضًا مثل طريقة تواصل الذاكرة العشوائية مع المعالِج وقرص التخزين وطريقة إرسال أو جلب المعلومات منهما. كما سيطّلع على مفهوم المسجلات Registers، وهي وحدات الذاكرة الصغيرة للمعالجات الحديثة، وكيف يستعملها لتسريع عمليات المعالجة بدلًا من جلب البيانات من الذاكرة، وسيفهم كيف ستتحول الخوارزميات والبرمجيات التي يكتبها إلى عمليات مجزأة يمكن للمعالجات حسابها في أقل من لحظة من الزمن بفضل البوابات المنطقية التي تعرّف عليها مسبقًا. أي أن هذه المادة ستغوص في تفاصيل عمل أجهزة الحواسيب وبنيتها الداخلية وطريقة تواصل مكوناتها مع بعضها بعضًا. زيادةً على المواد الأساسية التي ذكرناها آنفًا، هناك مواد ومجالات وتخصصات اختيارية يختار الطالب غالبًا ما يحلو له منها ليمارس المجال الذي يحبه، ولا يتخرج مهندسو الحاسوب وهم يتقنون كل هذه التخصصات، فعادةً ما يختارون واحدًا أو اثنين منها على الأكثر، ثم يدرسونه بصورةٍ أعمق من السابق، لذا سننتقل تاليًا إلى شرح تخصصات الحاسب التي يمكن لمهندس الحاسوب أو دارس تخصص علم الحاسوب أن يعمل ويتخصص فيها. تخصصات علوم الحاسب لا يكون هناك تخصصات واضحة في الجامعة أحيانًا، بل يمكن للطالب ببساطة أن يختار مجال أحد المواد التي درسها وأحبها ويتخصص فيها إلى حين إتمام السنوات الدراسية. سنعرض أهم تخصصات الحاسب والمجالات التي يمكن العمل فيها بعد التخرج: 1. البرمجة وهندسة البرمجيات هندسة البرمجيات وهي العلم المَعني بصناعة البرمجيات بطريقة احترافية، فهي لا تختص بالبرمجة فقط وإنما تشمل فروعًا وعمليات أكثر من ذلك بكثير. صحيحٌ أن تطوير تطبيقات سطح المكتب وتطوير تطبيقات الهواتف المحمولة هي المجالات البرمجية الأكثر شيوعًا، لكن هناك مجالات برمجية أخرى أكثر تعقيدًا مثل: برمجة أنظمة إدارة الخوادم Servers مثل Kubernetes ودوكر Docker وأشباهها من أدوات إدارة العمليات DevOps. برمجة أدوات الأنظمة المالية والاقتصادية التي تدير اقتصادات الدول والبنوك حول العالم. برمجة أنظمة الشركات العملاقة مثل شركات الطيران وشركات النفط وشركات الكهرباء …إلخ، فهذه أنظمةٌ حساسةٌ لا تحتمل الفشل وإن احتملته فهي بحاجة للاسترجاع والإدارة الفورية. الكثير من الشركات العملاقة كانت تعمل قبل عِدّة عقودٍ من الزمن على أنظمة مبرمجة بلغات برمجية قديمة عفا عليها الزمن الآن ولم يعد يُبرمَج بها، ولكن ما زالت هذه الشركات تعمل بتلك الأنظمة لعِدّة أسبابٍ لوجستيةٍ وهنا يعد نقل البرمجيات من لغة برمجة معينة إلى لغة برمجة أخرى هو مجال تخصصي كبير في علوم الحاسبات وقسم هندسة البرمجيات، فمثلًا تدفع شركة IBM رواتب عملاقة لمن يجيد نقل برمجياتٍ مكتوبةٍ بلغة COBOL إلى لغة C. ويقوم مهندسو البرمجيات بالتخطيط لعملية بناء البرمجيات اللازمة لهذه المجالات، كما يخططون للموارد التي ستلزمهم والمميزات التي سيسلمونها بالإضافة إلى نمط التصميم الذي سيستعملونه في مختلف مراحل تطوير البرنامج، ولذلك هي عملية معقدة واحترافية تحتاج إلى فريق متكامل من المبرمجين وليست مُجرّد برمجة بسيطة ينجزها فرد واحد. 2. هندسة الشبكات الشبكات ليست برامج التواصل بين المستخدمين فقط، فهناك شبكات أعقد من ذلك بكثير. ويمكنك التخصص في مجال الشبكات لتفهم طريقة عمل الشبكات البسيطة وحتى العملاقة مثل شبكة الإنترنت، والبنية التحتية لها وطريقة ربط الدول لتلك البنية التحتية، كما يمكنك التعرف على بعض أنماط الشبكات البديلة مثل النظير للنظير Peer to Peer وكيفية عمل تطبيقات مفيدة بها في الحياة الواقعية. وكذلك قد تتطرق إلى الشبكات المركبية Vehicular Networks وهي الشبكات المرتبطة بالسيارات والمركبات، أو شبكات الاتصال الخلوي وطريقة صنعها وعملها، وطريقة التعامل مع مختلف أجهزة المودم Modems. وبشكلٍ أبسط من ذلك، فيمكن أن تعمل مدير شبكات في المؤسسات والشركات الصغيرة والكبيرة وحتى مراكز إدارة الخوادم Data Centers، فلا تخلو الآن مؤسسة أو شركة من شبكة داخلية تربط أقسامها مع بعضها وهي آنذاك بحاجة إلى مدير شبكة بالتأكيد هذا أقل القليل. 3. الذكاء الاصطناعي وتعلم الآلة زاد الاهتمام بالذكاء الاصطناعي زيادة كبيرة في العقد الأخير، وهذا أمرٌ طبيعيٌ بسبب زيادة الحاجة إليه، بالإضافة إلى تَوفُّر الموارد الحاسوبية الكافية لتشغيل خوارزمياته المختلفة على أجهزة المستخدمين الشخصية، فدخل الذكاء الاصطناعي في كل شيء حولنا من إدارة إشارات المرور وتنظيم السير وتصنيف الصور في هواتفنا والتعرف على الأشخاص والوجوه والترجمة الآلية وإدارة المركبات والآلات وكشف الجرائم وعمليات التتبع وتحليل البيانات والكثير الكثير غيرها حتى بات تقريبًا عصب التقدم والتطور الذي نشهده حاليًا، وهو الأمر الذي يفسر سبب الطلب الكبير على المتخصصين في هذا المجال كما أشرنا. وهناك فرق بين الذكاء الاصطناعي Artificial Intelligence وتعلم الآلة Machine Learning؛ فالأول هو اسم المجال العام المَعني بكل ما يتعلق بإنشاء ذكاء يشابه ذكاء الإنسان باستعمال الآلات بينما الثاني مجال فرعي يتعلق بتدريب الآلات على مجموعة بيانات معينة بهدف الخروج منها بتصنيفات يمكن أن تساعد الآلة على اتخاذ قرار مطلوب منها. وستتعلم في هذا التخصص فروع تعلم الآلة الثلاثة الأشهر وهم، التعلم الموجه Supervised Learning والتعلم غير الموجه Unsupervised Learning بالإضافة إلى التعلم المعزز Reinforcement Learning، وللمزيد من المعلومات عن المجال، يمكنك الاطّلاع على كتاب مدخل إلى الذكاء الاصطناعي وتعلم الآلة. 4. الحوسبة البيولوجية الطبية لا تأتي الأجهزة الطبية الموجودة بالمستشفيات من العدم، بل يصنعها المهندسون ويساهم فيها المبرمجون، وهناك مجموعة من المواد الجامعية في تخصصات الحاسب التي تعلم الحوسبة البيولوجية الطبية الحيوية Biomedical Computing، وقد تكون تخصصًا كاملًا منفصلًا في بعض الجامعات باسم هندسة طبية حيوية biomedical engineering أو هندسة الأجهزة الطبية أو الهندسة الطبية. ويمكن أن تتخصص في هذا المجال لتتعلم أهم المتطلبات البرمجية في المجال الطبي أو البيولوجي، وكيفية تطوير برمجيات أو قطع عتاد تحل مشاكل أو تقدم استخدامات حقيقية تفيد مجال الطب والعلاج أي تقريبًا هو تخصص في مجال تصنيع الأجهزة المتعلقة في المجال الطبي من تصميم وبرمجة واختبار وتنفيذ …إلخ. ولا تستفيد المستشفيات فقط من هذا التخصص بل تستفيد كذلك مختبرات التحليل والمختبرات الحيوية والمستوصفات والعيادات الطبية وغيرها، فتحتاج جميعها إلى برمجيات صادرة عن المتخصصين في هذا المجال. 5. الرسوميات لا تُعَد الرسوميات Graphics مجالًا واحدًا فقط، فهو مجال تطوير عريض جدًا، حيث تنضوي تحته مجموعة من المجالات المتفرعة، نذكر من بينها: أنظمة التشغيل، فلها مكتبات برمجية معينة تساعدها على عَرْض الخطوط والصور والواجهات الرسومية وغير ذلك للمستخدمين، وهذا مجال ضخم، فهو ضروري لتمكين المبرمجين الآخرين من تطوير التطبيقات والألعاب لأنظمة التشغيل هذه، أي أن الرسوميات هنا هي جزء من نظام التشغيل. محركات الرسوميات Graphics Engines، وهي أنظمة برمجية عملاقة تهدف لتمكين المبرمجين من برمجة مختلف الرسوميات التي يريدونها لمختلف أنظمة التشغيل، فمثلًا يستخدم محرك Unity 3D أو Source2 أو غيرهما لبرمجة الألعاب التي تعمل على مختلف أنظمة التشغيل مثل ويندوز وماك ولينكس وأندرويد. البرامج المتخصصة في الرسم ثنائي وثلاثي الأبعاد، فتعد برمجة هذه البرمجيات مجال منفصل ويتطلب بعض الخبرات والمهارات، بينما تعلم استخدامها سيحولك إلى مصمم، وتدخل فيها برامج النمذجة modeling مثل برامج الرسم والتصميم الهندسي CAD المفيدة في الكثير من التخصصات الهندسية. برامج تحرير ومونتاج الفيديوهات مجال فرعي آخر مشهور. وتدخل الكثير من التخصصات تحت تخصص الرسوميات كما ترى، إلا أنها قد تختلف جذريًا فيما بينها، فتطوير برامج الرسم ثنائية الأبعاد لا يشبه تطوير المحركات الرسومية فعملية تطوير المحركات الرسومية واحدة من أصعب العمليات البرمجية وأكثرها تعقيدًا، لأنها تحاكي فيزياء الكون وتتطلّب فهمًا عميقًا للرياضيات. 6. تحليل البيانات وإدارة قواعد البيانات مجال تحليل البيانات (أو يرقى حتى إلى قسم منفصل باسم هندسة تحليل البيانات data analysis engineering) واحد من أكثر المجالات طلبًا حاليًا، لما له من استخدامات مفيدة وجلية في تحليل البيانات والمعطيات واستعمالها في اتخاذ القرارات المُهمَّة لدى المؤسسات والشركات، حتى إن بعض الفرق الرياضية لكرة القدم مثل ليفربول تعتمد على تحليل البيانات لوضع خططها الرياضية في كل مباراة، فتطبيقات هذا المجال واسعةٌ جدًا. كما ستتعلم في هذا المجال طريقة معالجة مجموعات ضخمة من البيانات، وطريقة تنظيفها من الأخطاء والمشاكل، وتحويلها إلى بياناتٍ يمكن معالجتها من الأنظمة الحاسوبية، وستتعلم طريقة استخراج أهم المعلومات والأسرار المخفية في البيانات الخام التي لديك بمختلف المكتبات واللغات البرمجية. حتى تتقن فن التعامل مع البيانات، فيجب أن تتقن التعامل مع أنظمة قواعد البيانات التي تخزَّن فيها البيانات، لذا يتخصص هذا المجال في مفهوم قواعد البيانات Databases وأنظمة إدارة قواعد البيانات database management systems تختصر إلى DBMS بتعمق كبير فهي مدخل إلى التعامل مع البيانات والتلاعب بها وتطويها والغوص فيها لاستخراج المعلومات. قد يتفرد هذا المجال في تخصص بمفرده في الدراسات العليا أو حتى في سوق العمل، فقد تطلب بعض الشركات متخصص لإدارة قواعد بياناتها وله المسمى الوظيفي "مدير قواعد بيانات" Database Administrator. وتشمل مشاريع تحليل البيانات عادة: جمْع البيانات من مصادرها. تنظيف وتهيئة البيانات للمعالجة وإزالة القيم الشاذة. إدخال البيانات في الأنظمة الحاسوبية المطلوبة لاستخراج النتائج والمعلومات الأولية منها، ومن أين يُبدَأ في البحث عن روابط مفيدة بين أجزائها. تحليل أعمق للبيانات إما عبر أنظمة أكثر تقدمًا أو عبر تَعلّم الآلة، وقد تُستعمل أنظمة التعرف على الأنماط Pattern Recognition كذلك. تهيئة النتائج السابقة للعرض والمشاركة عبر بعض الأدوات الشهيرة. عرض النتائج والتقارير مع المخططات والتوصيات. وتعد بايثون أكثر لغات البرمجة طلبًا في هذا المجال، بالإضافة لمكتباتها الشهيرة مثل Pandas وNumpy وJupyter Notebook وMatplotlib وغيرها، وكذلك تستعمل لغة R في هذا المجال، ولكنها ليست بنفس شيوع بايثون، أما بالنسبة لقواعد البيانات، فيجب أن تقن لغة SQL وتتقن بعدها أنظمة التعامل مع قواعد البيانات. ولتَتعلّم أساسيات بايثون بسهولة، بإمكانك الاطّلاع على كتاب البرمجة بلغة بايثون كما يمكنك الاطلاع على كتاب ملاحظات للعاملين بلغة SQL وكتاب الدليل العملي إلى قواعد بيانات PostgreSQL. 7. أنظمة التشغيل والأنظمة المدمجة تحتاج جميع الحواسيب والهواتف الذكية والأجهزة الإلكترونية عمومًا إلى نظام تشغيل Operating System لتعمل وفق رغبات المستخدم، وهذه الأنظمة هي الأخرى لا تأتي من العدم بل هناك متخصصون لبرمجتها وجعلها أفضل من غيرها والحفاظ عليها مع الزمن. تطوير أنظمة تشغيل سطح المكتب مثل ويندوز وماك ولينكس، أو أنظمة الهواتف الذكية مثل نظام أندرويد ونظام iOS وغيرهما، هي مجالات برمجية متقدمة تعتمد على خبرات ومهارات متعددة، كما يعتمد هذا على العتاد Hardware الذي ترغب ببناء نظام تشغيل له، وقد تُستخدَم أكثر من لغة برمجية في الوقت نفسه لتطوير نظام تشغيل بسيط، فتطوير أنظمة التشغيل عملية عملاقة ومكلفة وتحتاج الكثير من المهندسين، كما ينفق عليها ملايين الدولارات من الاستثمار المستمر على امتداد عدة سنوات للخروج بنتائج مرضية، ولهذا ربما تجد أن هناك ملايين البرمجيات الصغيرة حول العالم، بينما يوجد ثلاث أنظمة شهيرة لسطح المكتب ونظامان للهواتف الذكية فقط، ورغم أنه هناك بالفعل العشرات غيرها إلا أنها محدودة وضعيفة المزايا موازنة بتلك الأكثر استخدامًا والأكبر دعمًا حاليًا؛ وذلك لأن مطوريها لا يمتلكون نفس موارد وإمكانات مطوري الأنظمة الشائعة ذات الدعم الكبير. أما الأنظمة المدمجة Embedded Systems فهي الأنظمة التي تعمل مع موارد عتاد Hardware Resources محدودة للغاية، فهي تُنفّذ مهامًا محدودةً وصغيرةً مثل أنظمة الإشارات والاستشعار والأقفال الإلكترونية وألعاب الأطفال وحتى أنظمة إدارة السدود المائية وأنظمة الأجهزة العسكرية …إلخ، كما أن برمجتها مجالٌ منفصلٌ لوحده، ويوجد به الكثير من التفرعات كذلك وهو علم ضخم ذاع صيته هذه الأيام وأهم مجال تفرع عنه هو مجال إنترنت الأشياء Internet of Things تختصر إلى IoT وهي برمجة العتاد مع ربطه بالإنترنت مثل أنظمة مراقبة المباني وأقفالها وأنظمة البيوت الذكية وغيرها. أصبحت هنالك برامج واختصاصات دراسات عليا وحتى درجات جامعية تُدرِّس هذا المجال. 8. الأمان الرقمي الأمان الرقمي مجال كبير تنضوي تحته عدة أمور، مثل أنظمة التشغيل والبرمجيات العادية والشبكات والتعمية وغيرها، فكلها أمور مترابطة تحتاج لتأمين واستخدام أفضل للتقنيات وذلك للتأكد من عدم وصول الأشخاص غير المخوّلين لها. وبينما هناك مجالاتٌ متعلقةٌ بالأمان الرقمي الشخصي للمستخدمين، هناك مجالاتٌ متعلقةٌ بالأمان الرقمي الجنائي أو العسكري بين المجرمين وأجهزة الشرطة وبين الدول وبعضها البعض، كما أن هناك مجالاتٌ متعلقةٌ بالشبكات وإدارة الخوادم وغير ذلك الكثير، وكلها أمورٌ يمكن أن تتخصص بها إذا رغبت بذلك. ولمعلومات مفيدة حول الأمان الرقمي الشخصي والخصوصية، اطلع على كتاب دليل الأمان الرقمي. 9. الحوسبة العلمية تعتمد العديد من الصناعات التي تراها حولك اعتمادًا أساسيًا على علم الحاسوب لإتمام مهامها بنجاحٍ، فأغلب ما تراه حولك قد عولج في الحاسوب بدءًا من البناء الذي تقطنه والذي قد صمم واختُبر باستعمال برامج حاسوبية صممت البناء ونمذجته واختبرته على الزلازل ومختلف العوامل للتأكد منه ومن تصميمه وحتى قطع وقطع البلاستيك وأجزاءها قد صممت أيضًا باستعمال برامج حاسوبية عملاقة وهكذا، وكل هذه البرامج تعمل بخوارزميات ضخمة تحتاج للكثير من العمليات الرياضية التي تحل معادلات مختلفة، وهي بدورها تعتمد على خوارزميات محددة لتبسيطها وحسابها وهذا ما يدخل ضمن مجال الحوسبة العلمية Scientific computing. كما توجد مجالات كثيرة أخرى مثل هذه لا مجال لحصرها الآن ولكن نذكر منها مجال الحوسبة التطورية Evolutionary Computation وهي العلم الذي يأخذ نظرية التطور والحالات المعقدة المتطورة ويحولها إلى نظام قابل لحل الكثير من المشاكل في الحياة الواقعية، فيمكن استخدام هيكلة ومبادئ نظرية التطور لتطوير خوارزمية تساعدنا على معرفة عدد المطارات والمدارج التي علينا وضعها في كل مدينة. 10. الحوسبة السحابية توفر الآن الكثير من الشركات خدمات سحابية Cloud Services للمستخدمين وفكرة الحوسبة السحابية Cloud computing ببساطة إلغاء العمل على نظام تشغيل سطح المكتب لتخزين وتشغيل وإدارة الخدمات والبرامج التي تريدها والاعتماد كليًا على خدمات بعيدة موجودة على حواسيب وخوادم مركزية عملاقة تستفيد من الإنترنت للوصول إليها لفعل نفس الأمور السابقة. فمثلًا بدلًا من تشغيل خادم قاعدة البيانات الخاص بك يمكنك الاعتماد على أحد الحلول الجاهزة من أمازون Amazon أو ديجيتال أوشين Digital ocean، كما يمكنك استعمال فيجوال ستوديو من مايكروسوفت عبر الإنترنت لأداء مهامك البرمجية بدلًا من استخدام مُحرر النصوص البرمجي الخاص بك على نظامك. ويمكنك كذلك أن تستأجر خوادم فيزيائية Dedicated Servers ثم تُقسّمها إلى خوادم افتراضيةٍ Virtual Servers وتُوزّعها على مستخدمين آخرين حسب الموارد، ثم تُوّفر لهم خدمات جاهزة Software-as-a-Service واختصارًا SaaS، وهذا هو مبدأ شركات الاستضافة الحديثة والمجال السائد فكل ما تراه أصبح مخزنًا وموجودًا على سحابة وتصل إليه أو تستعمله عبر الإنترنت لذلك زاد الطلب على متخصصين في هذا المجال وتكون المسميات الوظيفية باسمه عادة مهندس حوسبة سحابية Cloud Computing Engineer. 11. تخصصات أخرى هناك مجالات ضمن علم الحاسوب تبتعد عن العلوم التطبيقية البرمجية، وتبحث في المبادئ النظرية لما تقدمه علوم الحاسب للتخصصات والمجالات الأخرى في الحياة. نظرية المعلومات Information Theory وتتحدث عن المبادئ النظرية لنقل المعلومات الرقمية ومحتواها، وإلى أي مدى يمكن ضغطها وبأي سرعاتٍ يمكن الوصول إليها. نظرية الإشارات Signal Theory وتتحدث عن الإشارات التي تُصدِرها الكائنات الحية وكيف يمكن تحديد العلاقات بينها وكيفية نمذجتها في الأنظمة الرقمية بهدف دراستها وتحليلها. نظرية الفوضى Chaos Theory ورغم أنها نظريةٌ رياضيةٌ لا تنضوي تحت علوم الحاسوب بصورةٍ مباشرةٍ، إلا أن لها تطبيقاتٌ واضحةٌ في عِدّة مجالاتٍ مثل حالة الطقس والمناخ والأنظمة المصممة لتوقّعها والتبليغ عنها، فهي تعتمد على علوم حاسوبية مثل التعمية والروبوتات وغيرها. علم التعمية Cryptography وهو واحدٌ من أكثر العلوم أهمية في علوم الحاسب لأن تطبيقاته هي التي تسمح بتشفير البيانات، ويعتمد على المبادئ الرياضية بشدةٍ، كما أنه شديد التعقيد، حيث تقوم عليه أنظمة الأمان الرقمية حول العالم بما في ذلك الأنظمة الاقتصادية. والكثير من هذه العلوم هي علوم نظرية تعتمد على مجالات متداخلة Interdisciplinary مع علوم الحاسبات، إلا أن علوم الحاسبات مركزية وأساسية فيها. كيف أختار التخصص المناسب لي من تخصصات علوم الحاسب؟ ليست كل التخصصات السابقة الذكر متوفرة في مجالات علوم الحاسب بالطبع، فهناك غيرها ولكن ذكرنا الأشيع والأشهر منها، ويبرز هنا سؤال وهو كيف يمكن لداخل جديد إلى هذه العلوم أن يختار التخصص المناسب له والذي يحبه؟ وتكمن الإجابة في معرفة المرء بنفسه وأين يحب أن يعمل فإذا كنت تحب الرياضيات فربما تناسبك العلوم النظرية، وإذا كنت تحب العمل مع الخوارزميات وتطوير الجديد منها لتسريع حل مشكلات الجنس البشري وابتكار حلول أفضل فربما قد يكون هذا اختصاصك، أو ربما ببساطة تحب تطوير البرمجيات والتطبيقات وحينها لن تحتاج شيئًا أكثر من المعارف الأساسية في علوم الحاسب ثم التخصص في تعلم البرمجة. لذا عليك أن تنظر في هذه المجالات المختلفة، ثم تسأل نفسك في أي منها يمكن أن تعمل دون أن تشعر بالملل بعد فترة؟ وستجد بضع مجالات قد تعجبك وستستبعد بعض المجالات الأخرى، فمثلًا أنا أستبعد أن أعمل في المجالات الرياضية أو مجالات التشفير، ببساطة لأنني لا أحب تعقيدها، وبعدها حاول أن تصرف بعض الساعات من وقتك في هذه المجالات التي تبقّت معك لتتعرّف عليها وترى أبرز المشاريع الموجودة فيها، وهل أحسست براحة وانشراح للنفس أثناء دراستها والعمل فيها، أم أنك تريد غيرها؟ الخلاصة، جرب التخصص والقراءة الدراسة في كل تخصص فترة من الزمن وبعدها إما أن تكمل أن تنتقل إلى تخصص آخر وهكذا تعرف الاختصاص الصحيح المناسب لك، وبعد فترة ستجد مجالات واضحة معينة لن تحب العمل في غيرها، وتلك هي المجالات التي يمكنك البدء بدراستها والتخصص بها بعد أن تنتهي من دراسة علوم الحاسوب الأساسية. التوظيف وفرص العمل في مجال علوم الحاسب تقل أهمية الشهادة الجامعية تدريجيًا في التوظيف عندما يتعلق الأمر بعلوم الحاسوب فشركات مثل جوجل بدأت تهتم بالخبرة وتعمل على نشر شهاداتها الخاصة والتي تبلغ مدتها 6 أشهر في حال عدم وجود الشهادة الجامعية، كما أن كثيرًا من الشركات الأخرى تشترط وجود الخبرة ومعرض الأعمال بدلًا من الشهادة الجامعية للمتقدِّم. وتبلغ مدة أغلب الشهادات الجامعية في معظم البلدان 4 سنوات، وهي مدةٌ طويلةُ جدًا يذهب معظمها بالانتظار والفراغ بين الحصص الدراسية الأسبوعية وتعلم علوم ومواد قد لا يكون لها أهمية كبيرة وقد تنساها بعد التخرج هذا لم نتحدث عن قلة المقاعد الدراسية الحكومية المجانية والمنافسة الشديدة عليها أو غلاء الجامعات الخاصة مما يزيد من العوامل التي تعيق أصلًا دخول الجامعة أو اختيار التخصص الذي ترغب دراسته في الجامعة فقد تضطر من أجل الدخول للجامعة والحصول على درجة جامعية أن تدرس تخصصًا لا تحبه ولا يناسبك أصلًا وهنا الحديث يطول، على أي حال، وبما أن علوم الحاسوب مجال مرتبط بالحواسيب التي بين أيدينا فقد لجأت نسبة لا بأس بها ممن يرغبون التخصص في المجال بتعلم المعلومات المطلوبة من مصادر خارجية لا علاقة لها بالجامعات الأكاديمية، دون الحاجة للدراسة الجامعية التقليدية ودخلوا سوق العمل فعليًا. ولا نريد محو أهمية الشهادات الجامعية، وذلك لأنها ما تزال تطلبها الحكومات والدول رسميًا للعمل في الوظائف الحكومية، كما لا تزال لها سمعة في الأوساط الاجتماعية على عكس من يتعلم تلك العلوم بمفرده، ولكن إذا كانت المعرفة والعمل ما يهمك فقط فحينها لا مشكلة من الخوض في المجال بعيدًا عن الدراسة الجامعية، وبذلك تكسب سنوات من عمرك بالإضافة إلى توفير الكثير من المال الذي كنت ستصرفه على الشهادة الجامعية. فمثلًا، يمكنك خلال فترة تترواح من ستة أشهر إلى سنة أن تتعلم أساسيات علوم الحاسوب وأن تبدأ العمل فيها مثلًا أن تتخصص في البرمجة وتطوير المواقع وتدخل سوق العمل وأغلب الدورات الحرة التي تعلم الاختصاص تكون مدتها ستة أشهر وحتى السنة وهي كافية لوضع قدمك على الطريق ودخول وكسب فرصة عمل. فمؤسسي أكبر الشركات التقنية في العصر الحديث، مثل مارك زوكيربيرغ مؤسس فيسبوك، وجاك دورسي مؤسس تويتر، وستيف جوبز مؤسس آبل لم يتخرجوا من الجامعات، وكذلك فهناك غيرهم الكثير من مدراء ورؤساء الشركات التقنية، ولهذا لن تكون الشهادة الجامعية عائقًا أمامك في حال أردت سلوك نفس المسار العصامي. وهنالك الكثير من المبرمجين الماهرين اليوم الذين لم يدخلوا إلى الجامعة أو درسوا اختصاصًا مختلفًا وهم يعملون في شركات كبيرة منها شركة IBM وهو لا يملك درجة في أي تخصص من تخصصات الحاسب وحتى أنه يساهم في كتابة بحث مع من درس في أروقة الجامعات. أضف إلى ذلك أنه يمكنك العمل كعامل مستقل على حسب الاختصاص الذي تجيده من اختصاصات علوم الحاسوب؛ فلو كنت مطور ويب محترف فيمكنك تطوير المواقع الإلكترونية للعملاء عبر مواقع العمل الحر مثل مستقل، ففي العمل الحر لن يسألك أحد بتاتًا عن شهادتك الجامعية وكل ما سيسألونك عنه هو خبراتك ونماذج لأعمالك السابقة نفذتها لا أكثر. أما عن فرص العمل المتوفرة في الشركات فهي تختلف باختلاف البلدان والشركات التي تريد العمل فيها، ولكنها تنضوي جميعًا تحت قسم التخصصات الذي تحدثنا فيه بصورة موسعة عن تخصصات علوم الحاسوب التي يمكن للمرء الاختصاص فيها، فمثلًا يمكنك العمل بتخصص مهندس برمجيات أو يتخصص في مجال الذكاء الاصطناعي أو مطور أنظمة تشغيل …إلخ على حسب المسميات الوظيفية المتوفرة في الشركات. انظر مثلًا إلى موقع بعيد، حيث تجد فيه طلبات توظيف من شركات مختلفة حول العالم العربي، وستجد أن معظم الوظائف لا تشترط أي نوع من أنواع الشهادات، بل تشترط معرض أعمال وخبرة سابقة فقط. وتكون رواتب المتخصصين في علوم الحاسوب متعلقة بعدة عوامل منها التخصص والخبرة والأعمال المنجزة وكذلك باختلاف الشركات والأماكن والدول، لكن يمكننا القول بصورة عامة أن رواتبهم أعلى من المهندسين الآخرين، ويمكنك البحث عن المواقع التي تَعرِض لك متوسط الرواتب التي يتلقاها الموظفون حسب المهنة في بلدك ثم البحث فيها عن التخصصات السابقة لرؤية مُعدّل الرواتب في بلدك. ما الفرق بين علوم الحاسب وهندسة الحاسب؟ على عكس الشائع فلا يوجد فرق جوهري بين علوم الحاسب computer science وهندسة الحاسب computer engineering وذلك لأن الجامعات الموجودة في دول مختلفة حول العالم تتعامل مع المصطلحين بطريقة مختلفة، فتجد في بعض الجامعات وفي بعض البلدان أن التخصصين مجرد اسمين مختلفين لنفس المواد الجامعية، فمثلًا الجامعة التي تخرجت منها كان تخصصي فيها هو هندسة وعلوم الحاسوب، أي أنني درست الاثنين معًا، ولم يكن هناك فرق في المواد التي درسناها مع الجامعات الأخرى. أما في بعض البلدان الأخرى مثل الولايات المتحدة هناك فرق حيث تكون علوم الحاسب علومًا أقرب للأقسام النظرية والفهم العام لمختلف المجالات والتخصصات، بينما تركز هندسة الحاسوب بالتحديد على علوم البرمجيات Software وعلوم العتاد Hardware والعلاقات والمشاريع التي يمكن تنفيذها بالدمج بينهما، أي أن هندسة الحاسوب تخصص هندسي تقليدي أقرب للعلوم العملية من تخصص علوم الحاسوب الأقرب للعلوم النظرية المفاهيمية. ويُعَد مصطلح علوم الحاسوب مصطلحًا جديدًا نسبيًا إذ كان التركيز قديمًا على هندسة البرمجيات Software Engineering وهندسة الحاسوب Computer Engineering وشاع المصطلح بعد 2010م وصار يشمل كل هذه العلوم وأكثر. من أين أبدأ بتعلم علوم الحاسوب؟ إن كنت تفكر بالدراسة الجامعية الأكاديمية، فهي من سيرشدك للبدء ويوفر لك المواد المتسلسلة في سنوات الدراسة ويؤمن لك كل شيء خلال رحلتك في دراسة علوم الحاسب وتخصصاته أما إن كنت ممن يريد دراسة مجال علوم الحاسوب ذاتيًا والتخصص فيه دون اللجوء إلى الجامعة، فأنت في المكان الصحيح الذي سيرشدك إلى بداية الطريق. من الأفضل لك أن تبحث عن بعض الدورات المتكاملة للبدء في تعلم علوم الحاسب بدلًا من الدروس المتفرقة، فمن الصعب على طالب جديد لا يعرف شيئًا في المجال أن يدخل فيه مباشرةً ويتعلم ما يحتاج إليه من دروس في كل مادة وتخصص من تلك المواد والتخصصات، بينما الدورات المتكاملة تكون مجهزة وكاملة وفق خطة معينة من متخصصين. عملت أكاديمية حسوب على توفير دورة متكاملة عن أساسيات علوم الحاسب هي دورة علوم الحاسوب وهي دورة شاملة مدتها عشرات الساعات حول علوم الحاسوب بدءًا من أبسط الأساسيات وصولًا إلى الخوارزميات وهياكل البيانات والبرمجة وقواعد البيانات وتطوير الويب وإدارة الخوادم، كما أنها تحت التوسيع والتحديث المستمر، ومن أبرز ميزاتها أن هناك من يتابع سَيْرَك ويجيب على أسئلتك على امتداد الدورة وليست فقط مجرد فيديوهات. ستكون مؤهلًا بعد الدورة من التخصص والغوص في إحدى مجالات علوم الحاسب التي تحبها وتريد تعلمها وقد وفرت الأكاديمية بعد دورة علوم الحاسب دورات أخرى إن أحببت الاختصاص في مجال البرمجة وتطوير البرمجيات لإكمال طريقك وستكون جاهزًا لدخول سوق العمل وبدء الكسب مما تعلمت خلال فترة قصيرة لا تتجاوز السنة بناءً على همتك وعزيمتك. وإذا وصلت إلى مرحلة أنت جاهزٌ فيها لتَعلّم البرمجة، فيمكنك قراءة الدليل الشامل لتعلم البرمجة باستخدام المصادر العربية ففيه أبرز المصادر العربية المتوفرة في الشبكة لتعلم البرمجة. كما يمكنك البحث في الشبكة عن سلاسل فيديوهات أو كتب لتُعلّمك تخصص علوم الحاسب بأي لغةٍ تجيدها، وجوجل مليءٌ بالنتائج عن ذلك كما أن أكاديمية حسوب تعمل جاهدًا على توفير مراجع عالية الجودة لتساعدك في ذلك، فتابع دومًا قسم المقالات البرمجية وقسم الكتب البرمجية. خاتمة وصلنا إلى نهاية هذا المقال بعد أن اطلعنا على أبرز علوم الحاسب وماهية التخصصات الموجودة فيه، ولا تنسَ أن هذا المقال مجرد مقدمة وسيكون عليك صَرْف العديد من الساعات لتتعلّم هذا المجال وتغوص فيه بصورة أعمق. وصحيح أن تعلم علوم الحاسوب قد يكون صعبًا في البداية للوافدين الجدد عليه، ولكن النتيجة مثمرةٌ جدًا حيث يمكنك استخدام أحد أبرز العلوم في العصر الحديث وأهمها لأي غرض أو هدف تريده، سواء كان ذاك الهدف شخصيًا أو ماديًا بهدف الكسب والرزق. إن كان لديك أي سؤال أو استفسار، فلا تتردد بطرحه في التعليقات ونسعد بمشاركتنا تجربتك، أرجو لك التوفيق والسداد! اقرأ أيضًا دليلك الشامل لتعلم البرمجة دليل شامل عن تحليل تعقيد الخوارزمية المرجع الشامل إلى تعلم لغة بايثون ما هي فوائد تعلم البرمجة؟ مدخل إلى الذكاء الاصطناعي وتعلم الآلة
    3 نقاط
  3. سنبدأ في هذا المقال من سلسلة برمجة الذكاء الاصطناعي في تعلم أساسيات لغة بايثون، وهي من أهم لغات البرمجة على الإطلاق المستخدمة في مجال الذكاء الاصطناعي، ولكنها ليست لذلك فقط؛ إذ تُستعمَل لغة بايثون في كثير من المجالات الأخرى مثل برمجة المواقع وبرامج سطح المكتب وأنظمة التشغيل وغيرها. قبل البدء في أساسيات لغة بايثون: ما هي لغة البرمجة بايثون؟ تعني بايثون في اللغة الإنجليزية نوعًا من الثعابين الكبيرة، لكنها لم تُسمى لذلك بل سُمِّيَت بهذا الاسم تيمنًا ببرنامج ترفيهي قدَّمته قناة BBC يحمل اسم Monty Python’s Flying Circus، وذلك بعد ما شاهده مخترع اللغة. وتُعَدّ بايثون لغةً برمجيةً عامةً، أي تستطيع استخدامها في مجالات عدة على عكس بعض اللغات الأخرى التي تتخصص في مجال ما دونًا عن الآخر، كما تُعَدّ لغةً بسيطةً ومتطورةً للغاية، بالإضافة إلى أنها تدعم البرمجة كائنية التوجه Object Oriented Programming أو OOP اختصارًا. صُنِعت بايثون بواسطة الهولندي جايدو فان روسم Guido van Rossum، وأُصدِرت في شهر 11 من عام 1994م بعدما عُمِل عليها في معهد الأبحاث القومي للرياضيات وعلوم الحاسوب في هولندا، في حين نُشر الإصدار الثاني من بايثون في عام 2000م؛ أما الإصدار الثالث، فقد نُشِر في عام 2008م وهو الإصدار المستخدم حاليًا من بايثون لأن الإصدار الثاني السابق قد توقف دعمه وتطويره. خصائص لغة بايثون تُعَدّ لغة بايثون لغةً مفتوحة المصدر تجد شيفرتها المصدرية على موقع GitHub، وبالتالي يستطيع أيّ مبرمج المشاركة في تطوير اللغة. وبحسب موقع جيت هاب GitHub، فقد شارك أكثر من 1200 شخص حول العالم في تطويرها، كما تُعرَف بايثون بسهولة تراكيب الجمل فيها Syntax التي تشبه تركيب اللغة الإنجليزية بنسبة كبيرة، وهي لغة مهمة جدًا للطلبة والباحثين والمهنيين على حد سواء في الكثير من النطاقات العلمية والعملية. وتتميز بايثون بالميزات التالية: لغة برمجة مفسرة Interpreted تدعم البرمجة الكائنية مناسبة للمبتدئين مدعومة بالكثير من المكتبات لغة مجانية ومفتوحة المصدر تستخدم في العديد من التخصصات لغة برمجة مفسرة Interpreted أي أنها تُنفَّذ مباشرةً مثل لغة PHP ولغة Perl، ولا تحتاج إلى تصريف كامل الشيفرة أولًا ثم تنفيذها مثل لغة C، فلا يتطلب الأمر تحويل الشيفرة الخاصة بك إلى شيفرة ثنائية تفهمها الآلة أولًا لتبدأ عملية التنفيذ، وهذا قد يميز شيفرات بايثون في سرعة تنفيذها أثناء البرمجة. وفي تلك النقطة بالتحديد قد يختلف بعض المبرمجين، فالبرغم من تصنيف بايثون أنها لغة مفسَّرة، إلا أنّ الشيفرة تُصرَّف compiled أولًا ليستطيع المُفسِّر فهمها قبل تنفيذها، لذلك قد تجد بعض النقاشات المتباينة حول بايثون لمحاولة تصنيفها تصنيفًا دقيقًا. يذهب بعض المبرمجين إلى القول بأنّ لغة بايثون لها طريقتها الخاصة في تلك النقطة، فالأمر معقَّد ولا نريد الخوض فيه. تدعم البرمجة الكائنية تدعم بايثون نمطًا يُدعى الكائنية في البرمجة Object-oriented programming (أو تدعى الشيئية أحيانًا)، وهو نمط شهير ومهم، إذ تُكتَب الشيفرة ويُتعامَل مع أجزاء التطبيق على أساس الكائنات Objects، وهو نمط غير مدعوم في بعض اللغات القديمة مثل لغة C، كما أنها تدعم البرمجة الوظيفية Functional والهيكلية Structured وغيرها. أساسيات لغة بايثون مناسبة للمبتدئين تُعَد بايثون مناسبةً جدًا للمبتدئين، حيث أنَّ صياغة الجمل فيها بسيطة للغاية، ولا يتطلب الأمر الدخول في تفاصيل كثيرة عند كتابتها؛ لذلك فهي سهلة التعلم والقراءة. مدعومة بالكثير من المكتبات يمكنك في بايثون إيجاد مكتبات بسيطة الاستخدام تستطيع بها برمجة تطبيقات معقدة جدًا، فهي لغة لديها أرشيف واسع من المكتبات في كافة المجالات تقريبًا. لغة مجانية ومفتوحة المصدر توجد بعض لغات البرمجة غير المجانية، أي أنك مُطالَب بدفع الأموال لشركة ما، كي تستطيع استخدام تلك اللغة، كما أنَه لا يمكنك ولا يمكن لأيّ شخص آخر إصلاح مشكلة ما في اللغة أو أن يطوِّر ميزةً أو خاصيةً جديدةً في اللغة، فالشيفرة المصدرية في تلك الحالة تقع تحت أيدي الشركة المصنعة فقط، وهي الوحيدة التي يحق لها تطوير اللغة أو إصلاح مشاكلها أو إصدار نسخ جديدة منها. أما في بايثون والعديد من اللغات المجانية المفتوحة المصدر، فالأمر مختلف إذ عمِل على على لغة بايثون أكثر من 1200 شخص حول العالم، فالشيفرة المصدرية للغة موجودة ومتاحة على موقع GitHub، ويمكن لأيّ شخص له الخبرة والمعرفة الكافية أن يطوِّر أو يعدِّل ميزةً ما، كما يستطيع مجتمع مبرمِجي بايثون على الإنترنت من المشاركة بآرائهم في تطوير اللغة، فالأمر بالجميع وللجميع، وهي لغة مجانية بالكامل تستطيع استخدامها في أيّ مشروع خيري أو تجاري، بدون أية مشاكل قانونية على الإطلاق. تستخدم في العديد من التخصصات لا يقتصر الأمر أبدًا على برمجة الذكاء الاصطناعي وتعلّم الآلة، ولا يقتصر على برمجة مواقع الويب أيضًا، إذ تُعَدّ بايثون من أكثر لغات البرمجة انتشارًا وتوغلًا في العديد من المجالات في حياتنا اليومية، وفي التخصصات العلمية والأبحاث ومعامل ومختبرات الجامعات حول العالم، لذلك بتعلُُّمك للغة بايثون فإنّ الأمر لا يقتصر على فرصة عمل في مجال الذكاء الاصطناعي فحسب، وإنما تستطيع استخدام معرفتك وخبرتك في بايثون في مجالات أخرى تفتح عليك أبواب دخل إضافية. تُشتهر بايثون أيضًا في استخدامها في برمجة المواقع وتطبيقات سطح المكتب وبرمجة برامج تجارية عبر بايثون مثل أودوو Odoo الذي يُعَدّ أشهرها وله متخصصين وشركات تجارية تعتمد كليةً على استخدامه. كما أنَّ لغة بايثون كما أوردنا تدخل في الكثير من مجالات البحث العلمي، فهي من أكثر اللغات التي تحتوي على مكتبات تهدف إلى خدمة مجالات البحث العلمي والرياضيات من الذكاء الاصطناعي حتى التغير المناخي وتُعَد دراسة لغة بايثون أمرًا أساسيًا بالنسبة لمبرمجي الذكاء الاصطناعي، لذلك سنبدأ الآن في دراسة أساسيات اللغة حتى نكون على قدر من المعرفة المطلوبة لنبدأ في دراسة وتطبيق الخوارزميات الأساسية في تعلُّم الآلة. لذلك فإن السهل البدء بتعلم أساسيات بايثون والبدء في عالم البرمجة بسهولة. تثبيت لغة بايثون أول ما نبدأ به في تعلم أساسيات لغة Python ولكي تستطيع العمل بلغة بايثون، يجب عليك أولًا تثبيت البرنامج الذي يفهم اللغة ثم ينفذها، وذلك لكي يستطيع حاسوبك التعرف على الأوامر التي تكتبها لتعمل عليه بصورة صحيحة، لذلك من الضروري أن تكون أول خطوة نقوم بها هي تثبيت لغة بايثون على حاسوبك. يختلف أمر تثبيت اللغة باختلاف نظام التشغيل، فإذا كان حاسوبك مثلًا يعمل على نظام لينكس Linux، فعلى الأرجح أنّ حاسوبك مثبَّت عليه بالفعل لغة بايثون، وللتأكد من ذلك يمكنك فتح الطرفية Terminal ثم كتابة الأمر الآتي: >> python --version أول الأمر التالي بالنسبة للإصدار الثالث: >> python3 --version إذا كانت بايثون مثبتةً بالفعل على حاسوبك، فسيظهر لك رقم الإصدار المثبَّت، والجدير بالذكر أنه يجب أن يكون الإصدار المثبت لديك هو الإصدار الثالث، وبالتالي يجب بدء رقم الإصدار بالرقم 3؛ أما إذا لم تكن اللغة مثبتةً على حاسوبك، فيمكنك ذلك عبر تنفيذ الأمر الآتي في الطرفية Terminal على لينكس. >> sudo apt-get install python3.6 أما إذا كنت مستخدِمًا لنظام التشغيل ماك macOS بمختلف إصداراته، فعلى الأغلب أيضًا أنّ لغة بايثون مثبتة بالفعل على حاسوبك، وتستطيع اختبار ذلك عبر الأمر السابق ذكره بخصوص نظام لينكس، فإذا لم تكن اللغة مثبتةً، فيمكنك ببساطة تثبيتها مثل أيّ برنامج أخر عن طريق الموقع الرسمي للغة /Python. بعد تثبيت اللغة بالطرق الموضحة أعلاه في نظامي لينكس وماكينتوش، فمن المحتمل ألا يعمل أمر التحقق من الإصدار وألا يكون جاهزًا للعمل بعد، إذ أنه قد لا يُتعرَّف على برنامج بايثون عندما تُنفِّذ الأمر التالي: >> python --version ولحل ذلك يجب تنفيذ الأمر التالي في الطرفية Terminal: >> export PYTHONPATH=/usr/local/bin/python3.6 مع تغيير كلمة python3.6 لأنها قد تختلف حسب الإصدار الذي ثبَّته؛ لذلك يجب التحقق من ذلك المسار على حاسوبك أولًا لترى أيّ الإصدارات يجب استدعاؤها في الأمر السابق. أما في حالة مستخدمي نظام الويندوز، فالأمر بسيط للغاية، إذ تستطيع تنزيل برنامج اللغة من الموقع الرسمي السالف ذكره، ثم تثبيته مثل أيّ برنامج آخر على حاسوبك دون تعقيدات قد لا يعمل كذلك أمر التحقق من إصدار اللغة بصورة تلقائية بعد التثبيت، ولحل ذلك ببساطة يمكنك فتح موجِّه الأوامر Command Prompt في ويندوز ثم تنفيذ الأمر الآتي: >> %path%;C:\Python مع الأخذ في الحسبان إمكانية تغيير النص C:\Python إذا كنت قد تثبَّت اللغة في مسار آخر على حاسوبك أثناء عملية التثبيت. استعمال بايثون مع خدمة Google Colab ضمن أساسيات لغة بايثون وبالرغم من سهولة عملية تثبيت بايثون على حاسوبك، فإنه ليس من الضروري فعلًا فعل تلك الخطوات السالف ذكرها، فقد أصدرت شركة جوجل مؤخرًا ما يُدعى Google Colaboratory عبر موقع الأبحاث الخاص بها \colab.research، وبالتالي تستطيع ببساطة استخدام تلك الخاصية بإنشاء ذلك النوع من الملفات على خدمة Google Drive الموجودة مجانيًا لأي عنوان بريد إلكتروني مُسجَّل على Gmail، بعدها يمكنك البدء في كتابة وتنفيذ شيفرة البايثون الخاصة بك عبر الإنترنت دون الحاجة إلى الدخول في الكثير من التعقيدات والمشاكل التقنية أثناء تعلمك، أو حتى أثناء عملك في برمجة الذكاء الاصطناعي. كما تحتوى تلك الخدمة تلقائيًا على معظم وأهم مكتبات بايثون المستخدَمة في مجال الذكاء الاصطناعي عامةً ومجال تعلّم الآلة خاصةً، فنجد مثلًا تلقائيًا في تلك الخدمة أنّ مكتبات متخصصة في الرياضيات مثل Numpy، ومكتبات متخصصة في رسم البيانات مثل Matplotlib ومكتبات متخصصة في خوارزميات تعلّم الآلة مثل Keras، ومكتبات متخصصة في التعلّم العميق والشبكات العصبية مثل Tensorflow …إلخ مثبتة ومتاحة للاستخدام مباشرةً. أُصدِرت الخدمة أساسًا للتسهيل على العاملين في مجال برمجة الذكاء الاصطناعي، وبالأخص تعلُّم الآلة ليستطيع المبرمج مشاركة الشيفرة المصدرية الخاصة به مع نتائج هذه الشيفرة والملاحظات مع شركائه في العمل أو أي شخص آخر، وهي خدمة سحابية بالكامل، أي أنها تعمل عبر الإنترنت ولا تحتاج إلى أي متطلبات أو إمكانيات في حاسوبك، فكل ما تحتاجه لاستخدام الخدمة هي وصلة الإنترنت وعنوان بريد إلكتروني من Gmail. أفضِّل شخصيًا استخدام تلك الخدمة أثناء التعلم لأنها بسيطة وسهلة، وتحتوي تلقائيًا على الكثير من مكتبات بايثون الخاصة بالذكاء الاصطناعي التي قد يكون تثبيت بعضها عملًا شاقًا إذا حدث خطأ ما أثناء التثبيت والسبب الآخر الذي يدفعني إلى التوصية باستخدام تلك الخدمة بشدة، هو عدم امتلاك بعض أجهزة الحاسوب للإمكانيات اللازمة لتشغيل نماذج تعلّم الآلة، إذ تحتاج بعض الخوارزميات إلى ذاكرة عشوائية RAM كبيرة ليُدرَّب النموذج تدريبًا صحيحًا، وذلك اعتمادًا على حجم البيانات المتدفقة إلى النموذج. ولمزيد من التفاصيل، ارجع إلى مقال دليل استخدام Google Colab. برنامجك الأول في لغة بايثون من أساسيات لغة بايثون أنك تستطيع البدء في كتابة برنامجك الأول بعدة من الطرق، أولها عبر كتابة الشيفرة مباشرةً في الطرفية Terminal في لينكس وماك وموجِّه الأوامر Command Prompt في ويندوز؛ وثانيها، كتابة البرنامج في ملف أو عدة ملفات منفصلة، ثم تشغيلها عبر البرامج السابق ذكرها؛ أما ثالثها فتكون عن طريق خدمة Google Colab التي ذكرناها سابقًا. أما كتابة الشيفرة مباشرة في الطرفية وموجه الأوامر، فالخطوات لذلك بسيطة، وكل ما عليك فعله بعد فتح أحد تلك البرامج حسب نظام التشغيل الخاص بحاسوبك هو تنفيذ الأمر الآتي: >> python أو الأمر التالي بالنسبة للإصدار 3 من بايثون: >> python3 تستطيع بعد ذلك كتابة أوامر بايثون مباشرةً وتنفيذها، كما يمكنك الخروج من هذه الشاشة بعد ذلك عبر كتابة الأمر الآتي: >> quit() وأما كتابة الشيفرة في ملف منفصل، فتستطيع إنشاء ملف جديد في أيّ مكان في حاسوبك وتسميته بأيّ اسم تريده، كما يفضَّل أن يكون الاسم معبِّرًا، فالتسمية البسيطة والمعبِّرة من الأمور المهمة. احفظ بعد ذلك الملف بصيغة py -وهي صيغة اختصارية لكلمة Python-، فإذا كان مثلًا اسم الملف Program، فستكون التسمية الكاملة للملف Program.py، ثم اذهب إلى المكان المخزن فيه الملف غبر الطرفية أو موجِّه الأوامر، وبعدها نفِّذ الأمر التالي: >> python Program.py والطريقة الثالثة، تستطيع ببساطة استخدام Google Colab من خدمة Google Drive ومن ثم إنشاء ملف جديد من نوع Google Colaboratory، ثم البدء في إضافة الفقرات، فيمكنك إضافة شيفرات بايثون في ذلك الملف بجانب نصوص عادية وبذلك تستطيع كتابة ملاحظات وتعليقات بين أسطر الشيفرات ويمكنك في الوقت نفسه تنفيذ الشيفرات ككل أو أجزاء محددة. سنبدأ بأمر الطباعة لكتابة أول برنامج بايثون خاص بك، فوظيفة أمر الطباعة في بايثون وفي كثير من اللغات الأخرى، هي طباعة نص على شاشة المستخدِم عند تشغيل البرنامج، وقد ذكرنا ذلك الأمر سابقًا عند الحديث عن الخوارزميات في البرمجة، فعند كتابة الأمر print والذي يعني اطبع بالإنجليزية، فيجب إلحاقه بقوسين، ومن ثم فتح علامات تنصيص بداخل القوسين تحتوى على الجملة التي نريد طباعتها. print ("Hello World") قد يُستخدَم الأمر print لطباعة النصوص على الشاشة أو لطباعة الأرقام، فالأمر سيان في حالة الطباعة، ولكن لا يجب إضافة علامات تنصيص في حالة طباعة الأعداد. print (3) >> 3 كما أنه من الممكن طباعة نتيجة عملية رياضية بسيطة مثل عمليات الجمع والطرح كما في الأمثلة الآتية: print (3+3) >> 6 print (6-4) >> 2 يمكن أيضًا طباعة عمليات الضرب والقسمة وباقي القسمة، إذ يمكنك عبر كتابة الشيفرة التالية طباعة حاصل ضرب عددين مثلًا: print (6*6) >> 36 والأمر بسيط كذلك لطباعة حاصل قسمة عددين: print (49/7) >> 7.0 أما حالة طباعة باقي القسمة، فسنستخدِم رمز النسبة المئوية %: print (50%7) >> 1 كما يمكنك طباعة أيّ عدد من النصوص باستخدام علامة الزائد + كما في المثال الآتي: print ("Hello " + "World!") >> Hello World! إذا أردنا تضمين قيمة عددية داخل نص، فيجب فيجب تحويل العدد إلى نص لأنّ الأعداد في بايثون وفي عدد من اللغات الأخرى عمومًا هي نوع من أنواع البيانات، لذلك يجب استخدام دالة str في هذه الحالة لتحويل العدد إلى نص لتستطيع لغة بايثون التعامل معها على أساس نص. print ("Hello "+str(2)+"nd "+"World!") >> Hello 2nd World! نستطيع الاستغناء عن دالة str إذا أدرجنا الأعداد داخل علامات التنصيص، إذ ستَعُدّ بايثون الأعداد داخل علامات التنصيص نصًا عاديًا، كما سنتعرف على الدوال بصورة أكبر في الصفحات القادمة. print ("Hello " + "2nd " + "World!") >> Hello 2nd World! المعرفات في بايثون تعد المعرِّفات Identifiers من أساسيات البايثون وهي الكلمات التي تستطيع من خلالها تعريف اسم متغير Variable أو ثابت Constant أو دالة Function أو صنف Class أو وحدة Module، ونختصر ذلك كله الآن بكلمة المعرِّفات فقط للدلالة على أيّ منهم، فتلك المتغيرات والثوابت والدوال والأصناف والوحدات، كلها مواضيع وسنتعرف عليها بالتفصيل في هذا الكتاب. تخضع تسمية المعرفات إلى قواعد محدَّدة لا يُمكن الخروج عنها في بايثون؛ لأنه عند الخروج عن إحدى القواعد سيطبع مفسر بايثون رسالة خطأ عند محاولتك تشغيل البرنامج، وتلك القواعد كما يلي: يجب أن تبدأ بحرف إنجليزي أو شَرطة سفلية Underscore _ ولا يُمكنها البدء برقم أبدًا. لا يمكنها احتواء رموز مثل % أو $ أو & …إلخ، ولكن يمكنها احتواء الأرقام. ألا تكون مطابقةً لأيّ كلمة من الكلمات المفتاحية في بايثون. الكلمات المفتاحية في بايثون هي كلمات تُستخدَم في أصل اللغة، بمعنى أنّ تلك الكلمات يقرؤها مفسر لغة بايثون لإجراء مهمة ما، فكلمة مثل print كما علمنا من قبل تؤدي مهمة طباعة نص أو عدد على الشاشة، لذلك لا نستطيع تعريف متغير أو ثابت أو دالة بهذا الاسم، وتكون جميع الكلمات المفتاحية في لغة بايثون كما يلي: table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } and exec not as finally or assert for Pass break from print class global raise continue if return def import try del in while elif is with else lambda yield except والجدير بالذكر أنّ جميع تلك الكلمات المفتاحية لا تحتوي على أي حرف كبير، وبما أنّ لغة بايثون لغة حساسة لحالة الأحرف، فمن تسمية أيّ معرِّف بتلك الكلمات في حالة تغيير حالة الأحرف، بمعنى أنه لا يُمكنك تسمية متغير باسم print، لكن يمكنك تسمية متغير باسم Print أو PRINT لأنه بالنسبة لبايثون، تكون الكلمات الثلاثة السابقة مختلفةً تمامًا عن بعضها، وبناءً على ذلك، فإذا أردت تسمية متغير أو دالة أو صنف في بايثون، فيجب عليك اتباع القواعد السابقة. كما أنّ هناك أيضًا في بايثون بعض التوصيات أثناء التسمية، وهي ليست قواعدًا يجب اتباعها بل هي أقرب إلى العُرف، ولكن من الأفضل اتباعها حتى تكون الشيفرة المصدرية في أفضل صورة ممكنة، وتلك التوصيات هي كما يلي: اسم الصنف من المفضل أن يبدأ بحرف كبير مثل Mouse وليس mouse. جميع المعرِّفات الأخرى مثل المتغيرات والدوال من الأفضل أن تبدأ بحرف صغير. إذا عرَّفت متغيرًا ما خاصًا، ولا تريد أن يُستخدَم في أيّ مكان آخر في البرنامج، فمن المفضل بدء اسم المتغير بشرطة سفلية واحدة أو شرطتين إذا كان المتغير خاصًا جدًا. السطور والمسافات لدى بايثون نوعًا فريدًا من القواعد عندما يتعلق الأمر بالأسطر والمسافات وتنظيم الشيفرة، إذ تستخدِم معظم لغات البرمجة الأخرى الأقواس المعقوصة { } لكتابة كتلة من الشيفرات، لكن الأمر في بايثون مختلف قليلًا، إذ تُنظَّم كتل الشيفرات باستخدام المسافات، وهي عادةً مسافة جدولة Tab، أو فراغين أو أربعة فراغات spaces، فنكتب كتلةً من الشيفرات لتُنفَّذ عند تحقق شرط معين بالشكل التالي: if something_happens: do_this() else: do_that() نقول للمفسر في المثال السابق الوهمي إذا حدث هذا الأمر، افعل هذا؛ وإذ لم يحدث، افعل ذاك، فالأمر بسيط للغاية، المهم دقق بالمسافات وكيف أن do_this تدخل ضمن الشرط if أما do_that فتدخل ضمن else. وبالمثل، عند كتابة كتلة من الشيفرة داخل أيّ قاعدة شرطية أو غيرها من القواعد، يجب عليك البدء في كتابة أسطر الشيفرة الخاصة بالكتلة بعد مسافة تفصل بينها وبين أول السطر، أو بمعنى أدق تفصل بينها وبين كتلة الشيفرة التي تسبقها، انظر مثلًا: count = 10 if count >= 10: if count <= 20: print ("Count is between 10 and 20") else: print ("Count is larger than 20") else: print ("Count is less than 10") وإليك المثال التالي لموازنة طريقة بايثون تلك مع اللغات الأخرى مثل لغة جافاسكربت: let count = 10; if (count <= 20) { if (count <= 20) { console.log("Count is between 10 and 20"); } else { console.log("Count is larger than 20"); } } else { console.log("Count is less than 10"); } تضمَّن كتل الشيفرة في هذا المثال بداخل القواعد الشرطية داخل أقواس معقوصة بغض النظر عن المسافة بين كل سطر وبدايته، المثال السابق يكافئ: let count = 10; if (count <= 20) { if (count <= 20) { console.log("Count is between 10 and 20"); } else { console.log("Count is larger than 20"); } } else { console.log("Count is less than 10"); } المثالان السابقان متطابقان تمامًا ويعملان بلا مشكلة؛ أما في بايثون، فتخضع الشيفرة إلى قاعدة مسافات الأسطر تلك، ولا يُمكن كسر تلك القاعدة، كما أنّ كافة مبرمجي بايثون يحبون قاعدة المسافات لأنها تُجبِر المبرمجين على كتابة شيفرة بسيطة ومنظمة وسهلة القراءة. ومن أساسيات البايثون وأهم القواعد الخاصة بالأسطر في بايثون، نجد قاعدة استكمال الأسطر، فإذا كنت تكتب سطرًا ما وكان هذا السطر طويلًا للغاية وتريد تقسيمه إلى سطرين، فستستطيع في بايثون تحقيق ذلك عبر استخدام الرمز \، فإذا كتبت سطرًا يجمع رقمَين مثلًا ثم يقسم أحدهما على الآخر، وكنت تريد تجزئة هذا السطر إلى سطرين مختلفين، فيمكنك فعل ذلك كما في المثال التالي: 30 + 6 / 6 >> 31.0 30 + 6 \ / 6 >> 31.0 كتبنا في السطر الأول عملية الجمع مع عملية القسمة في سطر واحد مباشرةً وأنتج ذلك العدد 31، أما في المثال الثاني كتبنا عملية الجمع في السطر الأول فقط، ثم ألحقنا عملية الجمع بالرمز \، واستكملنا السطر التالي العمليات بكتابة عملية القسمة مباشرةً، وأنتج ذلك في النهاية العدد نفسه، لكن توجد مع ذلك حالة خاصة لأيّ سطر في بايثون يحتوي على إحدى الأقواس بمختلف أنواعها، مثل [] أو {} أو ()، إذ يمكن كتابة تلك الأسطر على سطرين أو أكثر دون استخدام الرمز السابق ذكره، فالسطر التالي مثلًا يعمل بدون مشكلة حتى مع عدم استخدامنا للرمز. items = ['item_1', 'item_2', 'item_3', 'item_4', 'item_5', 'item_6'] علامات التنصيص توجد اختلافات بسيطة بين علامات التنصيص في لغة بايثون مثل أي لغة برمجة أخرى، إذ يمكنك في بايثون تضمين أيّ نص بين علامتَي تنصيص مُفرَدة ' أو علامتي تنصيص مزدوجة " أو علامتي تنصيص ثلاثية """ أو ''' لكن من أهم قواعد استخدام علامات التنصيص في بايثون هي إنهاء النص بعلامة التنصيص نفسها المُستخدَمة في البداية، فلا يُمكن استخدام علامة تنصيص مُفرَدة في بداية النص ثم استخدام علامة تنصيص مزدوجة في نهايته، وإنما يجب تطابق العلامة في البداية والنهاية للنص الواحد، وإليك أمثلةً على ذلك في أوامر الطباعة: print ("Hello World!") print ('Hello World!') print ("""Hello World!""") أما بالنسبة لعلامات التنصيص الثلاثية، فتُستخدَم في الغالب لامتلاكها ميزةً غير موجودة في العلامات المفرَدة والمزدوجة، إذ تُعَدّ قادرةً على معالجة النصوص التي تتكون من أكثر من سطر، في حين أنّ علامات التنصيص المُفردة والمزدوجة يجب احتوائها على نص مكوَّن من سطر واحد لا أكثر، فلا يمكنك مثلًا طباعة سطرين متتالين عبر علامات التنصيص المزدوجة، أي لا يمكنك تنفيذ المثال التالي في بايثون بصورة صحيحة: print ("Hello World!") لكن يمكنك تنفيذ ذلك الأمر عند استخدام علامات التنصيص الثلاثية كما يلي: print ("""Hello World!""") >> Hello World! التعليقات في أساسيات لغة بايثون ستحتاج في كثير من الأوقات أثناء كتابتك أو عملك على برنامج ما، إلى كتابة بعض الملاحظات على بعض الأسطر، فقد تكون تلك الملاحظات موجهةً لتذكيرك بكيفية عمل هذه الكتلة من الشيفرة، أو لتذكيرك بأمر ما تريد استكماله في هذه الأسطر في وقت لاحق، وتوفر بايثون مثلها مثل بقية لغات البرمجة إمكانية كتابة التعليقات عبر استعمال الرمز # والذي سيؤدي إلى تجاهل ما يليه حتى آخر السطر، انظر مثلًا الشيفرة التالية: # هذا تعليق print ("Hello, Python!") # تعليق آخر >> Hello, Python! كما ترى، فإنّ المثال السابق يعمل عملًا عاديًا وكأنه مكتوب بالشكل التالي دون تعليقات: print ("Hello, Python!") >> Hello, Python! فإذا كتبت أيّ سطر برمجي بعد رمز # فسيتجاهله مفسر بايثون تمامًا كما لو أنه غير موجود؛ وذلك لأن التعليقات هي في الأساس جمل من اللغة الطبيعية البشرية التي يستخدمها المبرمج للتعليق وكتابة الملاحظات بين تعليمات البرنامج. كما أنه في بايثون توجد طريقة أخرى لكتابة التعليقات في أسطر عدة، وذلك باستخدام علامات التنصيص الثلاثية، ومن مميزات هذه الطريقة أنها قد تُستخدم في توثيق الدوال وغير ذلك، كما أن هنالك أدوات تستخلص تلك التعليقات لتوليد توثيق لشيفرة البرنامج ووظائفه. """This is a multi line comment. It's wonderful how easy is Python language!""" print ("Hello World!") تُستخدَم التعليقات استخدامًا كبيرًا أثناء برمجة التطبيقات المعقَّدة، فغير أنها تُستخدَم للتعليق على الشيفرة، فإنها قد تكون مفيدةً بصورة كبيرة في تعطيل وتفعيل بعض الأسطر في الشيفرة أثناء عملك على حل مشكلة ما، مثل نسخ سطر ما ووضعه بداخل التعليق حتى يتجاهله البرنامج، ولكي أحتفظ بذلك السطر لاستخدامه لاحقًا. تعليمات متعددة في سطر واحد تنتهي التعليمة البرمجية في السطر في معظم لغات البرمجة مثل لغة PHP أو جافاسكربت JavaScript عن طريق كتابة رمز الفاصلة المنقوطة ; مما يسمح بكتابة أكثر من تعليمة برمجية في سطر واحد؛ أما في بايثون، فينتهي السطر عن طريق بداية سطر جديد، ولكن مع ذلك تدعم بايثون تلك الميزة أيضًا، إذ يمكنك إنهاء التعليمة البرمجية عبر الرمز ; وهو بالإنجليزية Semicolon، وهو أمر اختياري وليس إجباريًا كما في اللغات الأخرى، وبذلك تستطيع كتابة أكثر من تعليمة برمجية في سطر واحد مثل اللغات الأخرى. print ("Hello"); print("World") >> Hello >> World اقرأ أيضًا المقال السابق: البرمجة والخوارزميات والذكاء الاصطناعي المرجع الشامل إلى تعلم لغة بايثون النسخة العربية الكاملة من كتاب البرمجة بلغة بايثون
    3 نقاط
  4. "أريد تعلم البرمجة لكنني لا أعرف من أين أبدأ!" هذه هي أكثر عبارة تتردد على سمعي من حديثي العهد بالبرمجة، إذ يأتيني هذا السؤال مرارًا وتكرارًا؛ وفي كل مرة أحاول أن أجيب عنه في سياقه، أجد أنني أضيف معلومات جديدة على إجاباتي السابقة، لذا قررت كتابة هذا المقال بعنوان "تعلم البرمجة" لعله يفيد الراغبين في تعلم تطوير التطبيقات في بدء رحلتهم مع تعلم البرمجة من الصفر. جدول المحتويات حرصًا على تنظيم المقالة ولتسهيل الوصول إلى القسم الذي تريده بسهولة، سنذكر هنا جدول المحتويات باختصار: ما هي البرمجة؟ لماذا تتعلم البرمجة؟ ما عليك معرفته لتصبح مبرمجًا الأدوات اللازمة للبدء في تعلم البرمجة لماذا هناك العديد من لغات البرمجة؟ مفاهيم البرمجة مصادر تعلم البرمجة تطوير واجهات المستخدم تطوير الواجهات الخلفية تعلم تطوير تطبيقات الجوال تطوير الألعاب تطوير الأنظمة المدمجة تطوير تطبيقات سطح المكتب كيفية اختيار لغة البرمجة التي تناسبك نصائح لتعلم البرمجة ما هي البرمجة؟ البرمجة هي عملية تقسيم مهمة معينة يراد تنفيذها عبر الحاسوب إلى أجزاء صغيرة ومترابطة وقابلة للتنفيذ بأوامر بسيطة. بعد ذلك، تجري كتابة هذه الأوامر والتعليمات بإحدى لغات البرمجة، والتي هي وسيلة للتخاطب مع الحاسوب. إليك المثال العملي التالي الذي يشرح ماهية البرمجة: إن كنت تتوقع زيارة صديق لك اليوم، واتصل بك ليقول لك: "أنا واقف بجانب الحديقة ولا أعرف كيف أصل إلى منزلك". أنت عادةً تمر كل يوم من جانب الحديقة وتعرف الطريق بينها وبين منزلك شبرًا بشبر. برأيك هل ينفع إن قلت له: "منزلي معروف وقريب من الحديقة وأنا كل يوم أمر من جانبها"؟ لا، بالتأكيد. تحتاج إلى أن تقسِّم المشكلة إلى أجزاء تمثل خطوات بسيطة يستطيع صديقك فهمها وتنفيذها. مثلًا، أخبره أن ينفذ الأوامر التالية: "سر إلى الأمام عشرة أمتار" ثم "اتجه إلى اليمين" ثم "سر إلى نهاية الشارع" ثم "اتجه إلى اليسار". أخبره بعد ذلك: "عُدَّ الأبنية الموجودة على اليسار حتى تصل إلى البناء الرابع" ثم "اصعد إلى الطابق الثاني" ثم "اطرق على الباب الذي سيظهر أمامك". مبارك! بهذه الطريقة، تستطيع أن تدل صديقك على منزلك بدقة. البرمجة هي الشيء نفسه تمامًا. فهل ترى التعابير المكتوبة بين علامتي الاقتباس؟ إنها التعابير التي تكتب بإحدى لغات البرمجة والتي تخاطب الحاسوب بدلًا من صديقك السابق. لغات البرمجة هي مجموعة من المفردات والقواعد اللغوية التي تشكل لغةً وسيطةً للتخاطب مع الحاسوب وأمره بتنفيذ تعليمات وأشياء محدَّدة. فلا الحاسوب يفهم لغة البشر ولا البشر يفهمون لغة الحاسوب، لذا كان هنالك حاجة ملحة لوجود لغة وسيطة يفهمها كلاهما؛ نتيجةً لذلك، انبثق مفهوم لغة البرمجة. بعبارة أخرى، لو أردنا أن نقول للحاسوب "افعل كذا"، فسنحتاج إلى لغةٍ مشتركةٍ بيننا وبينه ليفهم ما نبتغيه، وهنا يأتي دور لغات البرمجة، إذ يمكنك أن تعدّ لغات البرمجة على أنها وسيط بين المبرمج والحاسوب. يهتم المبرمج بالتفكير في تسلسل الخطوات التي على الحاسوب القيام بها لإتمام العمل المطلوب منه (مثل حساب العمر اعتمادًا على تاريخ الولادة)، ثم كتابة هذه الخطوات بترتيب منطقي بإحدى لغات البرمجة. ربما لاحظتَ في الجملة السابقة أن جزءًا من مهمة المبرمج هو التفكير المنطقي، وهذا يجعلنا ننتقل إلى السؤال الشائع "هل أستطيع تعلم البرمجة وأصبح مبرمجًا؟" أو "هل أنا مؤهل لأصبح مبرمجًا؟". لماذا تتعلم البرمجة؟ يبدو أن تعلم البرمجة من الصفر ليس بالصعوبة التي توقعتها، لكنك تريد حافزًا يجعلك تتعلم البرمجة. تسمع كثيرًا أن البرمجة هي مجال المستقبل، وأن وظائف المبرمجين ستكتسح مجال التوظيف في السنوات القادمة؟ أستطيع أن أؤكد لك ذلك، كما أنَّ وظائف البرمجة هي من أعلى الوظائف دخلًا. فلو كنت تريد بدء مشوارك الاحترافي وتريد عملًا مستقرًا وذا دخلٍ ممتاز، فإن تعلم البرمجة والعمل بها هو أفضل خيارٍ أمامك. وظائف البرمجة مريحة عمومًا، فالعمل كله مكتبي أمام حاسوب في بيئة مريحة ومناسبة، وأغلبية الشركات تتبع نظام العمل 40 ساعة في الأسبوع (أي 5 أيام لمدة 8 ساعات يوميًا)، ولا تغفل عن قدرتك على العمل عن بعد من خلال الانترنت أو كمستقل في أوقات فراغك. تعلم البرمجة سيوسع أفق تفكيرك كثيرًا، خصوصًا أن تعاملك مع الحاسوب يتبع إلى التفكير المنطقي، وستجد أن البرمجة ستسهل لك القيام بأمور أخرى في الحاسوب. ما عليك معرفته لتصبح مبرمجًا يتردد الكثيرون في تعلم البرمجة متذرعين بأن مستواهم في الرياضيات ليس ممتازًا، وهذا ليس صحيحًا، فصحيحٌ أنَّ هنالك أمور تعترضك أثناء أداء عملك كمبرمج تتطلب خبرة في الرياضيات، إلا أنَّه قد تمر عليك فترات طويلة لا تحتاج فيها إلى مسائل رياضية. كل ما يلزمك للبدء في تعلم البرمجة هو الأساسيات التي يعرفها الجميع. إلى حين اعتراضك أية مسألة أو مشكلة تتطلب مهارة في الرياضيات، هنالك الكثير من المصادر والمراجع التي تستطيع الرجوع إليها آنذاك. بعبارة أخرى، أجِّل هذا الأمر قليلًا ولا تخف. الأهم من ذلك هو أن تكون قادرًا على التفكير بشكل منطقي. التفكير المنطقي التفكير المنطقي هو المهارة التي تجمع كافة المبرمجين تحت مظلة واحدة، وهي أساس كتابة الخوارزميات، إذ يجب أن تكون قادرًا على اكتساب هذه المهارة وتطويرها. الخوارزميات كلمة "الخوارزميات" هي الكلمة المرعبة التي ينفر منها البعض، فكل ما يتخيلونه عند ذكرها هو الرياضيات المعقدة والمعادلات الطويلة والرموز العجيبة، لكن الأمر بسيط جدًا؛ فالخوازرميات هي تطبيقٌ للتفكير المنطقي في خطوات متسلسلة واضحة تمامًا لحل مشكلة ما. لكي أوضِّح لك أن الخوارزميات ليست أمرًا معقدًا، سأخبرك بكيفية كتابة برنامج يسأل المستخدم عن سنة ميلاده، ثم يعيد عمره الحالي بالسنوات. الخطوة الأولى: إظهار رسالة نصية نطلب فيها من المستخدم إدخال تاريخ ميلاده. الخطوة الثانية: تخزين سنة الميلاد التي أدخلها المستخدم. الخطوة الثالثة: الحصول على السنة الحالية. الخطوة الرابعة: طرح مدخلات المستخدم من السنة الحالية. الخطوة الخامسة والأخيرة: إظهار الناتج. ما سبق هو خوارزمية بسيطة تتألف من خطوات متسلسلة، لكن إذا أمعنّا النظر فيها سنجد خللًا في حال أدخل المستخدم تاريخًا أكبر من التاريخ الحالي، أي لو أدخل 2050 مثلًا بدلًا من 1995. عندها سيصبح العمر المعاد من الخوارزمية سالبًا، ويمكننا أن نحل هذه الإشكالية منطقيًا بوضع شرط يمنع المستخدم من إدخال تاريخ أكبر من التاريخ الحالي. إطارات العمل كلمة أخرى شائعة جدًا في عالم البرمجة هي "إطارات العمل" frameworks، إطارات العمل هي مجموعة من الشيفرات البرمجية التي تسهل على المبرمج إنشاء التطبيقات، بتوفير وحدات جاهزة تقدم خدمات متنوعة مثل تسجيل المستخدمين، وإرسال البريد الإلكتروني، والتعامل مع قواعد البيانات. أي يمكنك أن تعدّها أدوات برمجية تساعدك في برمجة تطبيقك وتسهِّل لك فعل ذلك. الأدوات اللازمة للبدء في تعلم البرمجة تحتاج إلى حاسوبٍ بمواصفات جيدة (ليس من الضروري أن يكون من أفضل الحواسيب، وإنما أن يمتلك مقدارًا جيدًا من الذاكرة العشوائية). لا ننصح بمواصفات معينة أو نظام تشغيل معين، استعمل ما يحلو لك وما ترى نفسك معتادًا عليه (سواءً كان ويندوز أو لينكس أو ماك). ستحتاج أيضًا إلى اتصالٍ جيد بالإنترنت للوصول إلى المواد التعليمية، ولتنزيل البرمجيات والمكتبات اللازمة للتطوير. أما بخصوص أدوات التطوير، فستحتاج إلى برمجية لكتابة الشيفرات، وهنالك نوعان رئيسيان لها: المحررات النصية: مثل Visual Studio Code أو Atom أو Sublime Text أو Bracktes أو Notepad++‎. وهذه المحررات النصية تكون بسيطة في أغلبها، وتوفر ميزات أساسية مثل تلوين الشيفرات، وبعض ميزات الإكمال التلقائي، وتدعم أغلبيتها إضافات لزيادة وظائفها. وظيفة هذه المحررات النصية عمومًا هي تعديل الشيفرات بسهولة وسرعة. ننصحك بتجربة Visual Studio Code لشهرته حاليًا وكثرة إضافاته ودعمه الممتاز من شركة Microsoft. بيئات التطوير المدمجة: مثل Visual Studio و Eclipse و Android Studio و NetBeans و Apple Xcode وغيرها. وهذه البيئات توفر ميزات أكثر بكثير من المحررات النصية، مثل تشغيل الشيفرات وتنقيحها (debugging) وميزات التحكم بالإصدارات (version control) والاتصال بقواعد البيانات وخلاف ذلك. لماذا هناك العديد من لغات البرمجة؟ قد تتساءل، لماذا هناك العديد من لغات البرمجة؟ أليست هذه اللغات كلها تنفذ الهدف ذاته؟ لماذا لا يكون هنالك لغة موحدة بين المبرمجين والحاسوب؟ الحقيقة أنّه توجد لغة برمجة واحدة ولكن ليست إحدى اللغات التي تراها أمامك في الصورة. اللغة التي نشير إليها هي لغة الآلة التي يستطيع معالج الحاسوب قراءتها وفهمها. أتتساءل ما هي لغة الآلة وكيف تبدو؟ إليك مقطعًا منها: معلومٌ أنّ معالج الحاسوب لا يفهم شيئًا سوى الأصفار والواحدات، وهذه اللغة -أي لغة الآلة- هي تمثيل للأصفار والواحدات بطريقة تخبر الحاسوب بما يجب عليه فعله. الجدير بالذكر أن هذه اللغة عصية الفهم على البشر، وحتى إن استطعت كتابة شيفرة مثل الشيفرة الموضحة بالصورة (كما في السنوات الأولى من بداية اختراع الحاسوب)، لن يفهمها الآخرون ولن يستطيع أحد التعديل على الشيفرة وتطويرها لاحقًا باستثنائك. سعيًا لإيجاد لغة قريبة من لغة البشر، انقسمت لغات البرمجية إلى قسمين: لغات البرمجة منخفضة المستوى، ولغات البرمجة عالية المستوى وذلك تبعًا لمدى قربها من لغة الآلة أو لغة البشر على التوالي. أي أنّ لغات البرمجة منخفضة المستوى هي اللغات الأقرب للغة الآلة آنفة الذكر مثل لغة التجميع Assembly language، ولغات البرمجة عالية المستوى هي اللغات الأقرب للغة البشر مثل لغة بايثون وجافا. تنفيذ البرامج المكتوبة بلغات برمجة عالية المستوى يقودنا الحديث عن اللغات عالية المستوى واللغات منخفضة المستوى إلى الحديث عن كيفية تنفيذ المعالج للشيفرة المكتوبة بلغة عالية المستوى لا يفهمها المعالج (أليس هذا ما تفكر به الآن؟). عرفنا أن المعالج يفهم الأوامر والتعليمات المكتوبة بلغة منخفضة المستوى (لغة الآلة)، فمَثَلُ هذه العملية كمَثَلِ شخصٍ أجنبي تعلم اللغة العربية وبدأ التحدث مع ناطقٍ باللغة العربية، إذ يمكن لهما التواصل مباشرةً - ليخبر كل منها ما يريد من الآخر فعله - دون وسيط. أمَّا مَثَلُ كتابة برنامج بلغة عالية المستوى أقرب إلى لغة البشر والطلب من الحاسوب تنفيذه كمثل ناطق باللغة الهندية يريد التخاطب مع ناطق باللغة العربية دون أن يفقه أحدهما لغة الآخر. في هذه الحالة، لن يستطيع أحدهما فهم ما يتكلم به الآخر وستفشل عملية التواصل. قد تقول: لماذا لا يحضران مترجمًا يترجم ما يقوله كل منها للآخر؟ حسنًا، هذا ما يحصل تمامًا عندما يراد تنفيذ برنامج بلغة لا يفهمها معالج الحاسوب. في اللغات البشرية، هنالك نوع واحد من المترجمين يعرفه الجميع للترجمة من لغة إلى آخرى؛ أما في لغات البرمجة، هنالك نوعان من المترجمين بين اللغات هما: المفسر interpreter، والمترجم compiler. بناءً على ذلك، تنقسم لغات البرمجة إلى لغات مفسرة ولغات مترجمة. (من الآن وصاعدًا، كلما ذكرنا لغات البرمجة، فنحن نشير إلى لغات البرمجة عالية المستوى.) -المفسر (interpreter): وهو برنامج خاصٌ يفسِّر الشيفرة المصدرية لبرنامج مكتوب بلغة عالية المستوى سطرًا بسطر ويحولها إلى لغة منخفضة المستوى لينفذها الحاسوب مباشرةً. -المترجم (compiler): وهو برنامج خاصٌ يحوِّل الملفات المصدرية لبرنامج مكتوب بلغة عالية المستوى إلى ملف تنفيذي مكتوب بلغة الآلة دفعةً واحدةً، ثم يمكن تشغيل الملف التنفيذي على الحاسوب للقيام بالمهمة المطلوبة. لماذا يوجد الكثير من لغات البرمجة عالية المستوى؟ الآن وبعد أن عرفت الفرق بين لغة الآلة ولغة البشر، لربّما ما زلت تتساءل عن كثرة اللغات البرمجية عالية المستوى المتوافرة وعدم وجود لغة واحدة. نستطيع القول أنك خطوت خطوةً جيدةً للأمام إذ أصبحت الآن أكثر دقة. جواب سؤلك هو أنّ كل لغات البرمجة تُستخدم لتحويل فكرة منطقية إلى سلسلة أوامر يمكن للحاسوب أن ينفذها. فعلى سبيل المثال لا الحصر يمكنك استخدام أي من Ruby أو Java أو Python أو C#‎ أو Go أو JavaScript لبناء موقع ويب. لكن يمكنك أن تعدّ لغات البرمجة على أنها أدوات، وكل أداة تسهّل مهمة دونًا عن أخرى. فعلى سبيل المثال، السيارة والحافلة والدراجة والمحراث الزراعي كلها وسائط نقل، لكنها مختلفة الاستخدام؛ فلا يمكنك أن تذهب وعائلتك لقضاء إجازة صيفية مستخدمين المحراث الزراعي، كما لا يمكنك استخدام سيارة سباق في مدينة مكتظة ذات شوارع ضيقة للذهاب بها إلى العمل. مع أن آلية عمل هذه المركبات متشابهة. والأمر سيانٌ بالنسبة إلى البرمجة. خلاصة القول أنّ هنالك لغات برمجة متخصصة بإنشاء تطبيقات سطح المكتب، وأخرى متخصصة بإنشاء تطبيقات الجوال، وأخرى تستعمل خصيصًا لمواقع الويب، وأخرى لبرمجة العتاد، وهذا ما يحيلنا إلى الحديث عن مجالات البرمجة واللغات الأنسب لكلٍ منها. مفاهيم البرمجة "حسنًا، اقتنعتُ أن البرمجة مناسبة لي وليست صعبة كما كنتُ أتخيل، من أين أبدأ طريقي في تعلم البرمجة إذًا؟" قبل الإجابة عن السؤال السابق، سآخذ وقتي لأشرح لك بعض المفاهيم الخاصة بالبرمجة، ثم سنتحدث عن مجالات العمل فيها وما المسار الأفضل لتعلمك كلًا منها. أنت تعلم أن البرنامج هو سلسلة أوامر ينفذها الحاسوب لحل مشكلة ما، والبرنامج نفسه مكتوب بلغة يفهمها الحاسوب تسمى لغة الآلة. من الأمور الملحوظة التركيز كثيرًا على لغة البرمجة ذاتها أثناء بداية تعلم البرمجة. سأخبرك حقيقةً صادمةً: "لغة البرمجة التي تستعملها ليست بتلك الأهمية التي تتوقعها"، أنا لا أقول لك أن جميع لغات البرمجة متماثلة أو تُستعمل لنفس الاستعمالات، لكن لا تركِّز كثيرًا على تعلم كيفية الكتابة في لغة برمجة ما وتهمل المفاهيم البرمجية التي تقف وراءها. المتغيرات والثوابت عليك أن تتعرف على مفهوم المتغيرات variables المستعمل في جميع لغات البرمجة، والذي يعني إسناد قيمة ما إلى رمز أو كلمة وتخزين هذه القيمة في الذاكرة. فلو أردنا أن نخزن العبارة "Hello World" في متغير ما فنكتب شيئًا شبيهًا بما يلي: var variable_name = "Hello World"; أي أننا نسند الجزء الموجود على يمين إشارة المساواة إلى المتغير المذكور على يسار إشارة المساواة. يمكننا أن نستنتج من اسم "المتغيرات" أن قيمتها قابلة للتغيير خلال تنفيذ البرنامج، فيمكننا في مكانٍ ما من الملف المصدري أن نعيد تعريف المتغير السابق بكتابة: var variable_name = "New value"; أما الثوابت فهي تتشابه مع المتغيرات في كثيرٍ من النواحي، إلا أنك لا تستطيع إعادة تعريف قيمتها بعد تعريفها أول مرة. قد تستفيد من الثوابت عندما تكون متأكدًا تمامًا من عدم تغيير القيمة خلال فترة تنفيذ البرنامج. فلو أردنا تعريف ثابت اسمه pi يحتوي على القيمة 3.14 (والتي سنعرف أنها لن تتغير مطلقًا)، فيمكننا أن نكتب: const pi = 3.14; وإذا حاولتَ تغيير قيمة الثابت بعد تعريفه فستحصل على رسالة خطأ. الشروط تدعم جميع لغات البرمجة تعريف شروط تُنفَّذ في حالات معينة. ففي الخوازرمية السابقة التي شرحنا فيها حساب العمر، يمكننا أن نكتب الشرط بالعربية كما يلي: إذا كان (تاريخ الميلاد أكبر من التاريخ الحالي): نقول للمستخدم أن هنالك خطأ وإلا: سنحسب العمر بطرح تاريخ الميلاد من التاريخ الحالي وإذا أردنا كتابتها بإحدى لغات البرمجة فستبدو شبيهةً بما يلي: if ( user_birth > current_year ) { // ERROR! } else { age = current_year - user_birth; } لا تلقِ للأقواس بالًا، فهي جزء من لغة البرمجة، وقد تختلف من لغة لأخرى، وليست موضع اهتمامنا حاليًا. حلقات التكرار ماذا لو كانت لدينا قاعدة بيانات فيها أكثر من مستخدم ولكل مستخدم تاريخ ميلاد. لا تقل لي سنأخذ التواريخ يدويًا وندخلها إلى البرنامج! هذا مضيعةٌ للوقت، والصواب هو إنشاء حلقة تكرار تأخذ قيمة تاريخ الميلاد الخاص بكل مستخدم ثم تحسب عمره كما أسلفنا في القسم السابق. دعنا نعدل الخوارزمية البسيطة لنضيف تكرارًا فيها: ما أجمل البرمجة! تخيل لو كان عندك ألف مستخدم، وكان عليك حساب أعمارهم، يمكنك بضغطة زر أن تحسبها كلها. الدوال الدالة function هي مجموعة من التعليمات البرمجية التي تقبل مدخلات وتعيد القيمة المطلوبة. تكون الدوال عادةً قصيرةً وتقوم بمهمة وحيدة فقط. فمثلًا لو أردنا تعريف دالة باسم divide تقبل عددين، وتعيد ناتج قسمة العدد الكبير على الصغير، فيمكننا أن نكتب الخورزمية الآتية: مصادر تعلم البرمجة للمبتدئين أول ما سيتبادر إلى ذهنك بعد قرارك تعلم البرمجة هو من أين سأتعلم؟ هنا يأتي دور القسم التعليمي المتكامل في حسوب ليقدم للمبتدئ (والمحترف على حدٍ سواء) محتوى علمي مميز ومبسط. تزخر أكاديمية حسوب بالمحتوى المفيد عن تعلم البرمجة للمبتدئين وحتى الخبراء أي على كافة المستويات، ستجد فيها أقسامًا تشرح لغات البرمجة وتقنياتها كلها. ولدينا قسم للأسئلة البرمجية التي يمكنك أن تطرح فيه سؤالك وسيجيب عليه أحد أفراد مجتمع أكاديمية حسوب. أضف إلى ذلك أن الأكاديمية توفر قسمًا للدورات المتخصصة التي تبدأ معك من الصفر وحتى احتراف لغة البرمجة التي تريد تعلمها مع كادر من المدربين المختصين الذي يقدمون لك المساعدة ويجيبون عن جميع استفساراتك. وهنالك قناة للأكاديمية على يوتيوب ننشر فيها دوريًا دروسًا قصيرةً عن تساؤلات محددة ومفاهيم البرمجة وخلافه. لا تنسَ الاشتراك في قناة الأكاديمية لتصلك الفيديوهات الجديدة. ماذا لو أردتَ التعمق أكثر في لغة معيّنة؟ تأتي هنا موسوعة حسوب التي توفِّر توثيقًا عربيًا كاملًا وعالي الجودة، مدعّمًا بالأمثلة لمختلف لغات البرمجة وتقنيات تطوير الويب والجوال. ستكون الموسوعة مرجعًا تعود إليه في مسيرتك البرمجية، وتستعين بها لمعرفة التفاصيل الدقيقة عن لغات البرمجة. فأنت لست مضطرًا لحفظ كل شيء في لغة البرمجة، إذ حتى المبرمجون المختصون ذوو الخبرة يعودون إلى التوثيقات بين الفينة والأخرى أثناء عملهم. لننطلق الآن للتحدث عن مجالات البرمجة الأساسية وما اللغات والتقنيات المستعملة فيها. تطوير واجهات المستخدم يبدأ أغلبية المطورين مشوارهم من خلال تعلم تطوير واجهات المستخدم عند اتخاذ قرارهم لدخول مجال تطوير وبرمجة مواقع الويب، وذلك لسهولة اللغات المستعملة في هذا المجال. هدف هذا المجال هو تطوير صفحات الويب التي تعرض محتوى مختلف مواقع الويب، وهي الصفحات التي تراها عند زيارتك لموقع أكاديمية حسوب أو موسوعة حسوب أو مستقل أو أي موقع آخر. تتألف صفحة الويب من مجموعة من المكونات، وتُكتَب هذه المكونات باستخدام لغة HTML، وبعد كتابة البنية الهيكلية للصفحة سنأتي على تنسيقها باستخدام لغة CSS، وهي اللغة المستعملة لإضفاء شكل وهيئة على عناصر HTML. أي أن عناصر HTML تصف محتوى الصفحة (مثل الترويسات والقوائم والمحتوى الرئيسي والفقرات والروابط والصور والفيدوهات)، وقواعد CSS تُعرِّف كيف يجب أن تبدو هذه العناصر (سواءً من ناحية الألوان أو المساحات أو الخلفيات أو الخطوط أو خلاف ذلك). تأتي لغة JavaScript مكملةً لهما وتستعمل لإعطاء بعض عناصر الصفحة صفاتٍ تفاعلية، مثل شريط متحرك من الصور أو قوائم تظهر عند وقوع حدث معيّن …إلخ. هنالك تقنيات كثيرة تستعمل في تسهيل إنشاء الواجهات الأمامية وسنذكر بعضها: إطار Bootstrap لتسهيل تنسيق عناصر الصفحة. مكتبة jQuery لتسهيل التعامل مع عناصر الصفحة باستخدام JavaScript. مكتبة React JS: لتسهيل تطوير واجهات المستخدم بالاعتماد على مكونات قابلة لإعادة الاستخدام. لغة Sass لإنشاء ملفات CSS بسرعة وسلاسة. أدوات بناء مثل Webpack الذي يسهِّل تحويل الملفات المصدرية للتطبيق إلى النسخة النهائية التي ستعرَض للمستخدم. لتعلم تطوير واجهات المستخدم، ننصحك بالتسجيل في دورة تطوير واجهات المستخدم المقدمة من أكاديمية حسوب، والتي تحتوي على أكثر من 72 ساعة فيديو تتوزع على ثمانية مسارات تعليمية تشرح أمثلة عملية تطبيقية شرحًا مفصلًا. أثناء مشاهدتك للدورة، يمكنك أن تعود إلى موسوعة حسوب لتتعرف على توثيق لغات البرمجة المذكورة، وذلك للاطلاع على تفاصيل وأمثلة أكثر عن كل جزئية من الجزئيات المشروحة في دورة تطوير واجهات المستخدم. اللغات والتقنيات المستخدمة في تطوير واجهات المستخدم: HTML و CSS و JavaScript و Bootstrap و Sass و jQuery و Webpack. تطوير الواجهات الخلفية قد تتساءل: ماذا يعني تطوير الواجهات الخلفية (backend)؟ وما الفرق بينه وبين تطوير واجهات المستخدم (frontend)؟ الفرق بينهما هو أن الواجهات الخلفية هي البرمجيات التي تُنفَّذ على الخوادم وتجري عمليات عليها مثل التعامل مع قواعد البيانات والملفات والخدمات الخارجية، أما واجهات المستخدم فهي الصفحات التي تظهر على شاشة الزائر في متصفحه. سأطرح عليك الخيارات المتاحة أمامك للبدء في مجال تطوير الواجهات الخلفية، وجميع اللغات المذكورة هنا هي لغات ناجحة وقوية ولا يهم أي لغة تختار منها، المهم أن تتطلع على شيفرات بسيطة من كل لغة وتتخذ قرار تعلمها، واحذر من تضييع وقتك في التنقل بين لغات البرمجة والبحث عن أفضلها، فكلُ لغةٍ ممتازةٌ في مجالها. تعلم البرمجة باستخدام لغة PHP بعد تبيان الفرق بين واجهات المستخدم والواجهات الخلفية، يمكن القول بأن أشهر لغة لتطوير الواجهات الخلفية هي لغة PHP، وتتفوق على اللغات المنافسة لها أضعافًا مضاعفة. تعلم البرمجة بلغة PHP أمر سلس، فهي لغة سهلة التعلم وبسيطة الشكل، والمجتمع حولها كبير وتطويرها مستمر. هذه اللغة هي خيار استراتيجي لمن يريد الدخول إلى مجال تطوير الواجهات الخلفية. هنالك عدد من البرمجيات المكتوبة بلغة PHP مثل ووردبريس WordPress ودروبال Drupal وميدياويكي MediaWiki (التي تشغِّل ويكيبيديا وموسوعة حسوب) وغيرها الكثير؛ إضافةً إلى عددٍ كبير من إطارات العمل مثل Laravel و CodeIgniter و Symfony و CakePHP و Yii وغيرها، وهذا ما يدل على إمكانيات اللغة الكبيرة والمجتمع الكبير الذي يحيط بها. لتعلم تطوير الواجهات الخلفية باستخدام PHP، ننصحك بالتسجيل في دورة تطوير تطبيقات الويب باستخدام PHP المقدمة من أكاديمية حسوب، والتي تحتوي على 75 ساعة فيديو تتوزع على اثني عشر مسارًا تعليميًا تبدأ بأساسيات لغة البرمجة PHP للمبتدئين، مرورًا بشرح أمثلة عملية تطبيقية بالتفصيل، ووصولًا لتطوير التطبيقات باستخدام إطار العمل Laravel، وشرح تطوير ووردبريس. أثناء مشاهدتك للدورة، يمكنك أن تعود إلى موسوعة حسوب للاطلاع على توثيق لغة PHP وإطار العمل Laravel. اللغات والتقنيات المستخدمة في تطوير تطبيقات الويب باستخدام PHP هي: PHP و Laravel وقواعد البيانات (مثل MySQL و PostgreSQL وغيرها). تعلم البرمجة باستخدام لغة روبي - Ruby إذا كنتَ تبحث عن لغةٍ أنيقة وسهلة الاستعمال فستجد ضالتك في لغة روبي Ruby فهي من أجمل اللغات وأسلسها كتابةً، وهي لغة برمجة عامة يمكن استخدامها لتطوير مختلف أنواع التطبيقات ومن ضمنها تطوير تطبيقات الويب. ذاع صيت روبي في تطوير الويب بعد نشر إطار العمل Ruby on Rails (يشار إليه اختصارًا "ريلز"). هنالك إطارات عمل أخرى مثل سيناترا Sinatra لكن يبقى ريلز أشهرها. لتعلم تطوير الواجهات الخلفية باستخدام روبي، ننصحك بالتسجيل في دورة تطوير تطبيقات الويب باستخدام روبي المقدمة من أكاديمية حسوب، والتي تحتوي على 20 ساعة فيديو تتوزع على أربعة مسارات تعليمية تشرح أمثلة عملية تطبيقية شرحًا مفصلًا، وتشرح تطوير التطبيقات باستخدام إطار العمل ريلز. أثناء مشاهدتك للدورة، يمكنك أن تعود إلى موسوعة حسوب للاطلاع على توثيق لغة روبي وإطار العمل ريلز. اللغات والتقنيات المستخدمة في تطوير تطبيقات الويب باستخدام روبي: روبي و ريلز وقواعد البيانات (مثل MySQL و PostgreSQL وغيرها). تعلم البرمجة باستخدام لغة جافا سكربت - JavaScript نعم! تستعمل JavaScript في تطوير الواجهات الخلفية أيضًا. الفضل يعود لبيئة Node.js التي تسمح للمطورين باستخدام JavaScript لكتابة برمجيات تعمل من جهة الخادم وذلك لتوليد صفحات ويب ديناميكية قبل إرسالها إلى المتصفح، وتستطيع Node.js التعامل مع الملفات وقواعد البيانات ومختلف أنظمة الشبكات وخدمات أنظمة التشغيل. هل يوجد أجمل من استخدام نفس اللغة لبرمجة الواجهات الأمامية لمواقع الويب والواجهات الخلفية؟ وكل ذلك باستخدام لغة سهلة التعلم والاستعمال ومدعومة دعمًا ممتازًا من المجتمع. تعلم لغة JavaScript لتطوير الواجهات الخلفية من خلال التسجيل في دورة تطوير التطبيقات باستخدام JavaScript المقدمة من أكاديمية حسوب، والتي تحتوي على 69ساعة فيديو تتوزع على أحد عشرمسارًا تعليميًّا تشرح أمثلة عملية تطبيقية شرحًا مفصلًا، وتشرح تطوير الواجهة الخلفية باستخدام Node.js. أثناء مشاهدتك للدورة، يمكنك أن تعود إلى موسوعة حسوب للاطلاع على توثيق لغة JavaScript وبيئة العمل Node.js. اللغات والتقنيات المستخدمة في تطوير تطبيقات الويب باستخدام JavaScript: لغة JavaScript وبيئة Node.js وإطار العمل Express.js وقواعد البيانات (مثل MongoDB و MySQL و PostgreSQL وGraphQL وغيرها). تعلم البرمجة باستخدام لغة بايثون - Python لغة بايثون متعددة الاستعمالات، ويمكن عدّها على أنها أسهل لغة برمجة على الإطلاق، إذ تبدو شيفرتها البرمجية كأنها مقالة مكتوبة باللغة الإنكليزية. إذا أردتَ لغةً سهلةً ومدعومةً دعمًا ممتازًا ولها أطر عمل كثيرة فأنت تبحث عن لغة بايثون. الخيارات المتاحة أمامك هي إطار العمل جانغو (Django) وفلاسك (Flask) وغيرها، يمكنك تعلم لغة البرمجة بايثون لتطوير الواجهات الخلفية من خلال قراءة سلاسل المقالات عن تعلم بايثون في قسم البرمجة في أكاديمية حسوب، ثم الانتقال إلى تعلم إطار العمل جانغو أو فلاسك. يمكنك أن تعود إلى موسوعة حسوب للاطلاع على توثيق لغة بايثون. تعلم لغة بايثون لتطوير الواجهات الخلفية من خلال التسجيل في دورة تطوير التطبيقات باستخدام Python المقدمة من أكاديمية حسوب، والتي تحتوي على 69 ساعة فيديو تتوزع على عشرةمسارات تعليمية تشرح أساسيات لغة بايثون للمبتدئين، ثم تطبق عمليًا بأمثلة واقعية، وتشرح إطار العمل جانغو Django وفلاسك Flask. اللغات والتقنيات المستخدمة في تطوير تطبيقات الويب باستخدام بايثون: لغة بايثون وإطارات العمل المبنية عليها (مثل جانغو وفلاسك) وقواعد البيانات (مثل MySQL و PostgreSQL وغيرها). تعلم تطوير تطبيقات الجوال ازداد عدد تطبيقات الجوال لأنظمة أندرويد و iOS ازديادًا كبيرًا في الفترة الماضية، وأصبح لكل شركة أو خدمة تطبيق خاص بها يسهِّل على مستخدميها الوصول إلى الخدمات التي توفرها. النظامان الرئيسيان المسيطران على سوق الجوال حاليًا هما أندرويد ثم iOS. يمكن برمجة تطبيقات أندرويد بلغة Java أو Kotlin (أو غيرهما) وبرمجة تطبيقات iOS باستخدام Swift (وغيرها). ستكتشف أنَّ عليك تطوير تطبيقين منفصلين تمامًا، واحد لهواتف أندرويد وآخر لهواتف iOS، وذلك يسبب زيادةً في حجم العمل المطلوب وصعوبةً في إدارة التغييرات. بسبب ذلك، ظهر مفهوم "التطبيقات متعددة المنصات"، وهي تطبيقات تعمل على نظام أندرويد و iOS دون أي تعديلات، وذلك باستخدام تقنيات مشتركة وهي في الغالب تقنيات الويب. أي أصبح بإمكان مطوري الويب الاستفادة من معلوماتهم في تطوير تطبيقات الجوال باستخدام منصات مثل آيونيك Ionic. تسمح آيونيك Ionic للمبرمجين بالتعامل مع مختلف وظائف الجهاز باستخدام لغة JavaScript، مثل الوصول إلى الموقع الجغرافي، والتقاط صور بالكاميرا، والتعامل مع الملفات وخلاف ذلك. طوِّرت في الفترة الماضية تقنيات أخرى مبنية على JavaScript مثل React Native المبنية على مكتبة React.js والتي تسمح للمطورين بكتابة تطبيقات أصيلة باستخدام تقنيات الويب. تستطيع تعلم تطوير تطبيقات الجوال عبر Ionic وعبر React Native من خلال التسجيل في دورة تطوير التطبيقات باستخدام لغة JavaScript المقدمة من أكاديمية حسوب، والتي تحتوي على 69 ساعة فيديو تشرح أمثلة عملية تطبيقية شرحًا مفصلًا. وكالعادة يمكنك أثناء مشاهدتك للدورة أن تعود إلى موسوعة حسوب للاطلاع على التوثيقات اللازمة. اللغات والتقنيات المستخدمة في تطوير تطبيقات الجوال: Java و Swift و Kotlin و Ionic و React Native وغيرها. تطوير الألعاب تطوير الألعاب هو المجال الذي يحلم جميع مستخدمي الحاسوب بالدخول إليه. فالأغلبية تعرفوا على الحاسوب من خلال ألعاب الفيديو ومن ثم بدؤوا برحلة الاستكشاف عن البرمجة والتطوير. أغلب من يجيب عن تطوير الألعاب يقول "عليك بتعلم لغة C++‎" لكن دعني أفصِّل لك الأمر قليلًا. برمجة الألعاب تتطلب عملًا كثيرًا من فريق عمل كبير، مدعوم من شركة تجارية. من الصعب على مطوِّر وحيد أن ينشئ لعبة كاملة من الصفر دون فريق. تُطور أغلبية الألعاب باستخدام محرِّك ألعاب Game Engine والذي يسهِّل الأمر على المطورين ويتيح بيئة تطوير مناسبة للألعاب، ويتيح الميزات الأساسية لجميع الألعاب مثل التحكم بالكاميرا ونمذجة الشخصيات ثلاثية الأبعاد وتحريكها والأمور الفيزيائية الأخرى. هنالك عدد كبير من محركات تطوير الألعاب، ومن المرجح أنك شاهدت شعارها في الألعاب التي لعبتها من قبل، ومن أشهرها: Unreal Engine و Unity و Godot. يمكن التعامل مع هذه المحركات باستخدام عدِّة لغات، مثل C++‎ (وهي أشهرها)، وجافا (خصوصًا للألعاب على هواتف أندرويد) وحتى يمكن استخدام JavaScript في التعامل مع بعضها. تذكر أنّ الألعاب غير محدودة بتطبيقات سطح المكتب أو الهواتف، فهنالك ألعاب كثيرة تعمل على المتصفحات باستخدام تقنيات HTML5 و JavaScript. اللغات والتقنيات المستخدمة في تطوير الألعاب: C++‎ و Java و JavaScript ومحركات Unity و Unreal Engine و Godot. برمجة الذكاء الاصطناعي يُعد الذكاء الاصطناعي (AI) من المجالات الرائدة والمطلوبة بكثرة في سوق العمل اليوم، لاسيما بعد أن أصبحت تطبيقاته في متناول الجميع وبات يستخدم في العديد من المجالات فتعلمك لهذا المجال الرائد يعزز قدراتك كمبرمج ويساعد على تعزيز تطبيقاتك بقدرات الذكاء الاصطناعي القوية. يتفرع الذكاء الاصطناعي لعدة مجالات من أبرزها تعلم الآلة والتعلم العميق التي تُمكّن الحواسيب من التعلم من البيانات وتحسين أدائها بمرور الوقت دون الحاجة لبرمجة تقليدية. كي تتعلم برمجة الذكاء الاصطناعي تحتاج لامتلاك فهم جيد للبرمجة وتحليل البيانات ويمكنك استخدام لغات برمجة متعددة في هذا المجال أشهرها لغة البرمجة بايثون التي توفر الكثير من المكتبات والأطر المساعدة مثل تنسرفلو TensorFlow وكيراس Keras وبايتورش PyTorch وباندا Pandas. إذا كنت مهتمًا بتعلم هذا الاختصاص القوي فستوفر لك دورة الذكاء الاصطناعي من أكاديمية حسوب التي تحتوي على 58 ساعدة تدريبية ممتدة على ثمانية مسارات تدريبية شاملة كل ما تحتاج إليه للبدء بتطوير تطبيقات ذكاء اصطناعي قوية واكتساب مهارة في تحليل البيانات من الصفر ودون الحاجة لامتلاك معرفة مسبقة. اللغات والتقنيات المستخدمة في برمجة الذكاء الاصطناعي هي Python و MongoDB وPymongo و TensorFlow و Keras و Pandas والنماذج اللغوية الكبيرة LLMs المختلفة. تطوير الأنظمة المدمجة الأنظمة المدمجة هي أنظمة حاسوبية شبيهة بالحاسوب ولكنها لا تملك كل ميزات الحاسوب الذي تراه أمامك الآن. بعبارة أخرى، النظام المدمج هو حاسوب صغير مبرمج لأداء مهام محددة فقط ومدمج ضمن الجهاز أو البيئة المراد استخدامه فيها. أنت الآن محاط بالكثير من الأنظمة المدمجة الآن مثل جهاز مقياس مستوى المياه وجهاز التحكم بالتلفاز وجهاز إنذار الحريق وأجهزة المراقبة …إلخ. حتى إشارات المرور وتنظيم السير وألعاب الأطفال الآلية تصنَّف على أنها أنظمة مدمجة. هل سمعت أيضًا بمصطلح "إنترنت الأشياء"؟ إنترنت الأشياء هو نظام مدمج متصل بالإنترنت. نعم، بهذه البساطة! لابد الآن أن يتبادر إلى ذهنك الساعات والثلاجات والغسالات الذكية وطائرات الدرون وأنظمة المراقبة عن بعد وأنظمة البيوت الذكية، إذ كلها أمثلة على إنترنت الأشياء. كيفية برمجة الأنظمة المدمجة أشهر وأكثر لغة برمجة تستعمَل في برمجة الأنظمة المدمجة وإنترنت الأشياء هي لغة C (أي لغة سي) وكل اللغات المشتقة منها (مثل‎ لغة أردوينو C). تُستعمَل لغة C++‎ كثيرًا في هذا المجال، إذ تعدُّ لغة ذات مستوى أعلى من لغة C لدعمها للبرمجة كائنية التوجه. أضف إلى ذلك أنه بدأ حديثًا استعمال لغة بايثون في برمجة تطبيقات الأنظمة المدمجة مع أنها لم ترتبط تقليديًّا بهذا المجال سابقًا. صحيح أنَّ لغة بايثون ليست بقوة لغة C و C++‎ في هذا المجال إلا أنها تستمد ميزاتها وفعاليتها من المكتبات الهائلة المتوافرة فيها. بعيدًا عن C وبايثون، تستعمل في مجال الأنظمة المدمجة أيضًا لغات أخرى تنضوي ضمن "لغات توصيف العتاد" (Hardware Description Languages)؛ لغتي VHDL و Verilog هما من أشهر لغات توصيف العتاد المستعملة في هذا المجال. تُستعمَل مثل هذه اللغات في برمجة "مصفوفة البوابات المنطقية القابلة للبرمجة" (FPGA أي Field Programmable Gate Array). أخيرًا، قد تجد بعض المراجع تشرح برمجة الأنظمة المدمجة بلغة أخرى تدعى "لغة التجميع" (Assembly Language) التي تصنف من اللغات منخفضة المستوى. يتطلب تعلم البرمجة باستخدام هذه اللغة فهمًا واسعًا بمعمارية وحدة التحكم المركزية والمعالج بالمجمل لأنها أقرب لغة يفهمها الحاسوب. الانتقال إلى هذه اللغة قد يكون في مستويات متقدمة من تعلمك لبرمجة الأنظمة المدمجة وتطبيقات إنترنت الأشياء. من ميزات البرمجة بهذه اللغة هي التحكم الواسع بالعتاد والمعالج الذي لا توفره لغات أخرى. يقال أن هذه اللغة صعبة بعض الشيء ومعقدة، ولكن لا أرى ذلك! قد يكون سبب قول ذلك هو أن لغة التجميع هي لغة منخفضة المستوى وأقرب شيء إلى لغة الآلة ولا يستطيع من يلقي نظرة على شيفرة مكتوبة فيها فهمها مطلقًا إن لم يعرفها. تطوير تطبيقات سطح المكتب مجال تطوير تطبيقات سطح المكتب كالمحيط الواسع؛ إن لم تملك بوصلة وتعرف إلى أين تريد الاتجاه، ستضيع فيه حتمًا. هنالك الكثير من أنظمة التشغيل أشهرها - وأكثرها سيطرةً على السوق حاليًا - هي: نظام التشغيل ويندوز، ولينكس، وماك (macOS)، ويملك كل نظام تشغيل تطبيقات مكتبية خاصة به. لذلك، يجب عليك أولًا -قبل الدخول إلى سوق برمجة تطبيقات سطح المكتب- تحديد نظام التشغيل المستهدف. أي يجب الإجابة على السؤال التالي: هل يستهدف تطبيقك نظام تشغيل محدد، أم تريد لتطبيقك أن يعمل على عدة أنظمة تشغيل في آن واحد؟! بعد تحديد نظام التشغيل المستهدف، اطلع على اللغات المفضل استعمالها في ذلك النظام لبرمجة تطبيقاته؛ فعلى سبيل المثال، اللغات C و C++‎ و C#‎ و VB.NET هي الأكثر استعمالًا في برمجة تطبيقات نظام التشغيل ويندوز، واللغات C و C++‎ و Bash هي الأكثر استعمالًا في برمجة تطبيقات توزيعات نظام التشغيل لينكس. أمَّا نظام الشغيل ماك، فينفرد باستعمال لغة Objective-C. حسنًا، دعني أخبرك الحقيقة، كل لغة برمجة عامية الغرض يمكن استعمالها في برمجة التطبيقات، إذ أشهر اللغات التي تُدرَّس أكاديميًّا في هذا المجال هي لغة جافا (Java). لا يخفى على القارئ دخول لغة بايثون بقوة على هذا المجال نظرًا لامتلاكها الكثير من المكتبات الرائعة وسهولة صياغتها. دخلت مؤخرًا لغة جافاسكريبت على سوق برمجة تطبيقات سطح المكتب عبر إطار العمل Electron (إلكترون)، إذ توظف في هذا المجال تقنيات تطوير الويب (HTML و CSS و JavaScript …إلخ.). بدأ هذا الإطار ينتشر كالنار في الهشيم مما دفع شركات كبيرة لتطوير تطبيقات سطح المكتب الخاصة بها باستعمال هذا الإطار ومنها شركة Slack التي استعملت هذا الإطار لتطوير تطبيقها المكتبي. أعلم أنك الآن تشعر بالضياع من كثرة لغات البرمجة والتقنيات المستعملة في هذا المجال؛ معك حق، فقد أخبرتك بذلك منذ قليل. دخول هذا السوق يحتاج منك تحديد هدفك منه بالضبط. هل لديك فكرة تطبيق وتريد إنشاءه والربح منه؟ هل تريد العمل لدى شركة محددة؟ ما هي مواصفات التطبيق الذي تريد إنشاءه أو تريد العمل على تطويره؟ كل ذلك يلعب دورًا في تحديد لغة البرمجة الأنسب لك لتعلمها. في النهاية، إن تعلمت أساسيات البرمجة وأتقنت العمل على لغة برمجية محددة، سيسهل عليك الانتقال إلى لغة برمجة أخرى، إذ أغلب لغات البرمجة تشبه بعضها بعضًا من ناحية المفهوم والمضمون وتختلف بعض الشيء من ناحية الصياغة والشكل. لذلك، اطمئن من هذه الناحية. كيفية اختيار لغة البرمجة التي تناسبك يمكنك اختيار لغة البرمجة اعتمادًا على المجال الذي تحب العمل فيه، سألخص لك مسار التعلم لمختلف مجالات العمل: العمل كمطور ويب full-stack: يعني ذلك تعلم تطوير واجهات المستخدم أو الواجهات الأمامية، وتطوير الواجهات الخلفية. يمكن التخصص بمجال واحد من هذين المجالين فقط، إذ يُطلَب كثيرًا في سوق العمل مبرمجين متخصصين في واجهات المستخدم أو الواجهات الخلفية. العمل كمطور تطبيقات للهواتف المحمولة: يمكنك تعلم برمجة تطبيقات أندرويد أو iOS كلًا على حدة، أو استعمال تقنيات مثل كوردوفا لتطوير لكلا النظامين معًا. العمل كمطور تطبيقات سطح المكتب: يمكنك البدء بالتخصص في تطوير تطبيقات مكتبية لنظام تشغيل محدَّد (مثل نظام التشغيل ويندوز أو لينكس) عبر تعلم لغة البرمجة المستعملة في ذاك المجال (كما أشرنا إلى ذلك في قسم تطوير تطبيقات سطح المكتب)؛ خيار آخر هو تعلم اللغات والتقنيات التي تمكنك من تطوير تطبيقات عابرة للمنصات (تعمل على عدة أنظمة تشغيل) مثل استعمال إطار العمل Electron. العمل كمطور للأنظمة المدمجة والأنظمة الذكية: لغة C هي أساس هذا المجال، سواءً كنتَ تتعامل مع المتحكمات مباشرةً، أو تتعامل مع شريحة مثل أردوينو (والتي تمتلك لغةً مشتقةً من C). يساعدك هذا الفيديو على معرفة المعايير التي من خلالها ستتمكن من اختيار لغة البرمجة التي تتناسب مع تطلعاتك وأهدافك المستقبلية. نصائح لتعلم البرمجة مشوار تعلم البرمجة من الصفر طويل وشائق، ولكنه جميل ومسلٍ بذات الوقت، قد تصاب بالإحباط في بداية طريقك لكثرة الأمور التي عليك الإلمام بها، لذا جهزت إليك النصائح الآتية من تجربتي في البرمجة: حدد هدفك من تعلم لغة البرمجة وسوق العمل الذي تريد دخوله واجعله واقعيًا. بدون هدف، أبشرك بأنك ستتخلى عن فكرة تعلم البرمجة بعد حين. انتبه إلى أن يكون هدفك واقعيًا وقابلًا للقياس والتجزيء على مراحل. بدون ذلك، ستفشل من أول عقبة وتترك تعلم البرمجة. أعرف نفسك جيدًا ونقاط قوتك وضعفك. كلنا لديه نقاط قوة وضعف، ولكن المفلح من عمل على ترميم وتحسين نقاط ضعفه في المجال الذي يرغب بتعلمه. رشح دورة واحدة وكتابًا واحدًا وابدأ بقراءة الكتاب ومتابعة الدورة تدريجيًّا ثم انتقل بعد الانتهاء إلى دورة أخرى وكتاب آخر، إذ سيجنبك ذلك التشتت بين الدورات الكثيرة والكتب العديدة. الشيء الذي أفعله قبل بداية تعلم شيء جديد هو ترشيح قائمة من عدة كتب ودورات ثم ترتيب هذه الكتب والدورات بحسب جودتها ومدى بساطتها وتعقيدها. أرقم الكتب والدورات وأبدأ بالخيار الأول منها. أحدد الوقت التقريبي الذي يأخذه كل خيار لدراسته وأجدول الخيارات البقية على رزنامتي الخاصة. لا تأخذ العلم إلا ممن تثق بعلمه، فالكثير من المبتدئين يحاولون مساعدة غيرهم وقد يضعون معلومات مغلوطة دون قصد. طبق ما تعلمته مباشرة، وأنشئ أي شيء من كل أمر جديد تتعلمه حتى لو كان رسمة بسيطة أو شيفرة من عدة أسطر فقط. فرحة إنجاز شيء مما تعلمته تدفعك لتعلم المزيد والاستمرار في طلب العلم. نظم وقتك بورقة وقلم، حدد بداية كل أسبوع خطةً لسائره والتزم بتنفيذها. أخبر أصدقائك أن لديك التزامات وأمور مهمة عليك إنجازها. خصص وقتًا للاستراحة بالطبع ولا تنسَ نصيبك منها. في نهاية كل أسبوع، وازن مدى الإنجاز الذي حققته ومدى تطبيق الخطة التي وضعها وحاول أن تصل النسبة إلى 100%. أنصحك بقراءة ومتابعة استراتيجيات تنظيم الوقت ورفع الإنتاجية. تمرس على حل المشكلات وتحدى نفسك باستمرار وتابع المسابقات البرمجية واشترك بها إن استطعت، أنصحك بقراءة مقالة حل المشكلات وأهميتها في احتراف البرمجة بعد هذه المقالة. لا تنسَ أن تكافئ نفسك في كل مرة تنهي فيها كتابًا أو تكمل العمل على مشروع. لا تنسَ حظك من الاستراحة، لأن طريق البرمجة قد يكون له بداية ولكن النهاية بعيدة ومتعبة -مثله مثل أي مجال آخر-. في النهاية أرجو لك كل التوفيق في مشوارك البرمجي. وأرجو منك أن تشاركنا تجربتك في تعلم البرمجة، لعل غيرك يستفيد منها. اقرأ أيضًا كيف تتعلم البرمجة المدخل الشامل إلى تعلم علوم الحاسوب المرجع الشامل إلى تعلم لغة بايثون تعرف على أعلى تخصصات البرمجة أجرا تعلم لغة HTML قواعد البرمجة ما هي فوائد تعلم البرمجة؟ أسهل لغات البرمجة أهمية البرمجة
    3 نقاط
  5. لقد أحدثت النماذج اللغوية الكبيرة LLMs وأشهرها روبوت المحادثة ChatGPT الذي طورته شركة OpenAI ثورة في الكثير من المجالات وأثبتت قدرتها على توليد نصوص تشبه النصوص البشرية، كما سهلت أداء العديد من المهام في مختلف المجالات ومن أبرزها مجال تطوير البرمجيات، فقد وفرت للمطورين والمبرمجين واجهات برمجية APIs تساعدهم في إنشاء تطبيقات ذكاء اصطناعي بسهولة كبيرة. سنتعلم في مقال اليوم كيفية تطوير تطبيق بايثون قادر على فهم نصوص ملف PDF والإجابة على أي أسئلة نطرحها حول محتوى هذا الملف بالاستفادة من ميزات نماذج الذكاء الاصطناعي التي توفرها واجهة برمجة تطبيقات OpenAI API وإطار عمل LangChain، وهو إطار عمل للغة البرمجة بايثون يمكن دمجه في تطبيقاتك لتعزز إمكانيات النماذج اللغوية الكبيرة. نظرة عامة على التطبيق المطلوب ومتطلباته نريد تطوير تطبيق بايثون باسم "اسأل PDF" يتيح هذا التطبيق للمستخدم تحميل ملف PDF من جهاز الحاسوب الخاص به، ويسمح له بطرح أي سؤال، ويستخدم تقنيات معالجة اللغة الطبيعية NLP للبحث عن إجابة مناسبة على هذا السؤال بناءً على محتوى الملف ويعرض له الإجابة. يحتاج تنفيذ التطبيق إلى المتطلبات التالية: معرفة بأساسيات لغة بايثون وتثبيت بيئة بايثون على الحاسوب المحلي. تثبيت أداة pip لتثبيت وإدارة حزم البرمجيات المساندة لبايثون. إنشاء حساب على على منصة OpenAI والحصول على مفتاح الواجهة البرمجية OpenAI API key خاص بك. معرفة بأساسيات نماذج وأطر عمل الذكاء الاصطناعي واختيار النماذج المناسبة لعمل التطبيق. معرفة بطريقة معالجة النصوص باستخدام التضمينات الرقمية ومخازن المتجهات. ما أهمية التضمينات الرقمية في تطبيقات البحث كي نتمكن من إنجاز عملية البحث في ملف pdf نحتاج لإنشاء تضمينات رقمية "Embedding" لكل جزء من أجزاء الملف، فبما أننا سنبحث في ملفات تتضمن الكثير من النصوص، فسنحتاج للاعتماد على تقنية التضمين وهي تقنية تستخدم في معالجة اللغة الطبيعية NLP وتقوم بتمثيل النصوص بشكل أعداد عشرية لتساعدنا على اكتشاف المعنى الدلالي للكلمات والعبارات والجمل بسرعة وفعالية، وتحولها لتنسيق يسهل الوصول إليه والبحث فيه عن المعلومات بدقة وكفاءة، بعدها سنقسم الملف إلى أجزاء صغيرة chunks حجم كل منها مثلًا 1000 حرف، ونفهرس هذه الأجزاء في قاعدة بيانات أو مخزن متجهات vectors حتى نتمكن من استرجاعها بسهولة عندما نريد الإجابة على الأسئلة الموجودة فيه. بهذه الطريقة ستملك النصوص ذات المحتوى المتشابه لغويًا متجهات متشابهة وبهذا يمكن مقارنة المتجهات والعثور على النصوص المتشابهة بسهولة وسرعة، وعندما نريد الحصول على إجابة لسؤال معين فسوف ننشئ كذلك تضمين رقمي لنص السؤال، ثم نقارن تضمين السؤال مع جميع المتجهات التي خزناها في مخزن المتجهات، ونختار الأكثر تشابهًا بناءً على حسابات رياضية على المتجهات، ثم نمرر تضمين السؤال مع التضمينات الأكثر تشابهًا معه إلى روبوت المحادثة ليولّد لنا الإجابة المناسبة بناءً على هذه المعطيات. خطوات التطبيق العملي لننشئ تطبيق واجهة رسومية GUI بلغة بايثون باستخدام المكتبة المدمجة Tkinter يمكننا من خلالها تحميل ملف PDF الذي نريده ثم نبدأ بمعالجة محتواه واستخراج كافة النصوص منه، فبعد تحميل الملف المطلوب سنحول نصوصه إلى تضمينات كما شرحنا سابقًا، ثم سنبدأ بعملية طرح سؤال متعلق بمحتوى الملف. سنحول السؤال كذلك لتضمين أو تمثيل رقمي ونبحث عن كافة المحتوى المشابه له وسنرسل بعد ذلك للواجهة البرمجية ChatGPT API سلسلة تتضمن السؤال وكل المحتوى المرتبط به الذي وجدناه ضمن الملف كمدخلات، ثم سنولّد بناءً على ذلك الإجابة المناسبة بالاستفادة من إمكانيات النماذج اللغوية الكبيرة LLMs. وإليك خطوات القيام بذلك بالتفصيل: خطوة 1: الحصول على مفتاح API الخاص بك من OpenAI للحصول على مفتاح API الخاص بك من OpenAI عليك اتباع الخطوات التالية: انتقل إلى الصفحة الرسمية لمنصة openai وأنشئ حسابًا جديدًا إذا لم تكن قد أنشأته من قبل ثم سجل الدخول لحسابك. انقر على القسم اAP للدخول لحسابك في صفحة مطوري OpenAI. انقر على أيقونة ChatGPT أعلى يمين الصفحة واختر البند API Keys. انقر على Create new secret key لإنشاء مفتاح API الخاص بك. أدخل اسمًا اختياريًا لمفتاح API للرجوع إليه لاحقًا. هذا كل ما يلزم لإنشاء مفتاح API الخاص بك من OpenAI. سيبدأ المفتاح بـ sk-‎ انسخه واحفظه في مكان آمن واحرص على عدم مشاركته مع أحد أو كتابته في كود عام، فقد يقوم الآخرون باستخدام مفتاح API الخاص بك ويستهلكون رصيدك المتاح. ملاحظة: عليك الاشتراك بخطة مدفوعة للاستفادة من واجهة برمجة التطبيقات OpenAI API في تطبيقاتك، وسيكون المبلغ المقتطع بحسب الاستهلاك والنموذج المستخدم، فلكل نموذج تكلفة مختلفة وكلما زادت طلباتك أو عدد الرموز tokens المرسلة والمستقبلة من النموذج كلما زادت فاتورتك، لكن يمكنك في البداية الحصول على رصيد مجاني بقيمة ‎5 دولار‎‎‎ عند الاشتراك حديثًا في المنصة للتجربة. خطوة 2: إنشاء ملفات تطبيق بايثون اسأل PDF للقيام بهذه الخطوة يجب أن تكون بيئة بايثون مثبتة على جهازك، ولإنشاء مشروع بايثون جديد، افتح سطر الأوامر (أو الطرفية) في نظام التشغيل وانتقل للمسار المطلوب، وأنشئ مجلدًا جديدًا للمشروع وليكن باسم askpdf، ثم أنشئ ضمنه ملفين الأول ask_pdf.py لإضافة كود الواجهة الرسومية للتطبيق، والثاني ملف ‎.env لإضافة مفتاح الواجهة الرسومية OpenAI API Key اللازمة لعمل التطبيق من خلال كتابة التعليمات التالية تباعًا في سطر الأوامر: C:\Users\PC>d: D:\>md askpdf D:\>cd askpdf D:\askpdf>touch ask_pdf.py Touching ask_pdf.py D:\askpdf>touch .env Touching .env D:\askpdf> تثبيت المكتبات اللازمة لعمل التطبيق يحتاج التطبيق إلى تثبيت العديد من مكتبات ووحدات بايثون الخارجية باستخدام مدير الحزم pip وهي كالتالي: pip install python-dotenv PyPDF2 langchain langchain-openai langchain-community faiss-cpu إليك وصفًا موجزًا لكل مكتبة ولماذا استخدمناها في التطبيق: المكتبة python-dotenv لقراءة قيمة المفتاح الذي سأخزنه في الملف env. المكتبة PyPDF2 ضرورية للتعامل مع ملف PDF وقراءته محتوياته. إطار عمل LangChain ليسهل التعامل مع نموذج text-embedding-ada-002 لتقسيم النصوص، وإنشاء تضمينات وفهارس لها، كما أنه يدعم نموذج GPT-3.5 Turbo Instruct لتوليد إجابات على الأسئلة المطروحة. سنستدعي مكتبات langchain و langchain-openai و langchain-community من هذا الإطار وهي مكتبات مفيدة تتكامل مع نماذج OpenAI وتوسع إمكانياتها. وأخيرًا سنستخدم مكتبة Faiss وهي مكتبة بايثون يوفرها إطار LangChain تسرع عملية البحث عن التشابه في البيانات النصية دون الحاجة لاستهلاك الكثير من الموارد. كتابة الكود البرمجي للتطبيق الخطوة التالية هي إضافة الكود الخاص بالتطبيق، سأفتح الآن مجلد المشروع بمحرر الأكواد VSCode وأكتب بدايةً في ملف إعدادات التطبيق ‎.env قيمة مفتاح الواجهة البرمجية على النحو الآتي: OPENAI_API_KEY= Your_KEY وعليك بالطبع استبدال Your_KEY في الكود السابق بالقيمة الفعلية لمفتاحك ليعمل التطبيق بشكل صحيح. الآن سننتقل للملف الأساسي للتطبيق ask_pdf.py ونستورد بدايةً كافة المكتبات والوظائف اللازمة لعمل التطبيق. ويوضح التعليق ضمن الكود دور كل منها على النحو الآتي: import os from dotenv import load_dotenv # مكتبات إنشاء الواجهة الرسومية import tkinter as tk from tkinter import filedialog, scrolledtext, ttk from tkinter import font from PIL import Image, ImageTk # قراءة ومعالجة ملفات PDF from PyPDF2 import PdfReader # الواجهة البرمجية OpenAI from langchain_openai import OpenAI from langchain_community.vectorstores import FAISS from langchain_community.callbacks import get_openai_callback from langchain.text_splitter import CharacterTextSplitter from langchain.chains.question_answering import load_qa_chain from langchain_openai import OpenAIEmbeddings بعدها سننشئ الصنف الأساسي للتطبيق باسم askpdfgui ونعرّف بداخله التابع __init__ لإضافة وتهيئة عناصر الواجهة الرسومية Widgets للتطبيق، ستتضمن الواجهة عناصر متعددة مثل حاويات العناوين Labels وشريط تقدم Progressbar وزِرَّين Buttons الأول لتحميل ملف PDF من الجهاز لذاكرة التطبيق ومعالجته، والثاني للبحث عن إجابة السؤال الذي يكتبه المستخدم ولا يكون هذا الزر مُفعّلًًا إلا بعد اكتمال تحميل ومعالجة الملف. class askpdfgui: def __init__(self, root): self.root = root self.root.title("اسأل PDF") self.root.geometry("800x700") custom_font = font.Font(family="Verdana", size=24, weight="bold") self.label = tk.Label(root, text="? PDF اسأل", font=custom_font) self.label.pack(pady=10) # عرض تقدم حالة تحميل الملف self.progress_label = ttk.Label(root, text="", foreground="green") self.progress_label.pack(pady=5) self.progress_bar = ttk.Progressbar(root, orient="horizontal") self.progress_bar.pack(pady=5) script_dir = os.path.dirname(os.path.abspath(__file__)) image_path = os.path.join(script_dir, "robopdf.png") image = Image.open(image_path) tk_image = ImageTk.PhotoImage(image) self.image_label = tk.Label(root, image=tk_image) self.image_label.image = tk_image self.image_label.pack(pady=10) # إضافة زر تحميل الملف self.upload_button = tk.Button( root, text="حمل ملفك هنا", command=self.upload_pdf ) self.upload_button.pack(pady=10) # حقل نصي لكتابة السؤال self.question_entry = tk.Entry(root, width=60, justify="center") self.question_entry.pack(pady=10) # زر طرح السؤال وإلغاء تفعيله لحين اكتمال معالجة الملف self.ask_button = tk.Button( root, text="اطرح السؤال", command=self.ask_question, state=tk.DISABLED ) self.ask_button.pack(pady=10) # عرض نتيجة السؤال self.result_text = tk.Text(root, wrap=tk.WORD, width=60, height=10) self.result_text.configure(font=("TkDefaultFont", 12)) self.result_text.pack(pady=10, anchor=tk.CENTER) سيكون شكل التطبيق على النحو التالي: الآن وبعد أن انتيهنا من تصميم واجهة التطبيق وتهيئة خصائص عناصر واجهة المستخدم سنبرمج وظائفه، بداية نحقق كود الدالة upload_pdf التي ستمكن المستخدم من فتح نافذة لتحميل ملف PDF الخاص به لداخل التطبيق كما يلي: def upload_pdf(self): file_path = filedialog.askopenfilename(filetypes=[("PDF Files", "*.pdf")]) if file_path: self.process_pdf(file_path) بعد أن يختار المستخدم ملف PDF يستدعى التابع process_pdf الذي يأخذ كوسيط مسار هذا الملف لبدء عملية المعالجة ويستخرج النصوص منه باستخدام الدالة extract_text، ويقسمه إلى أجزاء أو مقاطع أو نصوص بطول 1000 حرف مع تداخل بقيمة 200 حرف بين الأجزاء كي لا يفقد السياق، بمعنى سيكون الجزء الأول من البداية إلى الحرف 1000 أما الجزء الثاني فسيبدأ من الحرف 801 لضمان استمرارية المعنى وعدم فقدان معلومات مهمة بين النصوص المتجاورة. هناك عدة تقنيات مختلفة متاحة لتنفيذ مهمة التضمين والفهرسة في تطبيقنا، وقد اعتمدنا في هذا هذا التطبيق على الصنف OpenAIEmbeddings من مكتبة langchain_openai ومررنا قيمة مفتاح الواجهة البرمجية openai_api_key لباني الصنف لأنه سيستخدم هنا النموذج Embading الذي توفره هذه الواجهة لتكوين التضمينات الرقمية وإنشاء المتجهات الخاصة بها بالاستعانة بمكتبة FAISS على النحو التالي: def process_pdf(self, file_path): self.progress_label.config(text="انتظر اكتمال تحميل ملف PDF...") self.progress_bar.start() self.root.update_idletasks() pdf_reader = PdfReader(file_path) text = "" for page in pdf_reader.pages: text += page.extract_text() # تقسيم نص الملف إلى أجزاء text_splitter = CharacterTextSplitter( separator="\n", chunk_size=1000, chunk_overlap=200, length_function=len ) chunks = text_splitter.split_text(text) # إنشاء تضمينات النصوص embeddings = OpenAIEmbeddings(api_key=openai_api_key) knowledge_base = FAISS.from_texts(chunks, embeddings) self.docs = knowledge_base.similarity_search("") بالنسبة للسطر الأخير في الكود: self.docs = knowledge_base.similarity_search("") سينفذ هذا السطر عملية بحث عن التشابه ويجد أقرب الجمل لسؤالك الذي ستطرحه باستخدام قاعدة بيانات المتجهات knowledge_base ويخزن النتيجة في متغير docs فهذا المتغير يخزن معلومات حول النصوص المتشابهة ودرجة التشابه بين النص أو السؤال الذي تبحث عنه والنص المخزن في قاعدة البيانات، لكن هنا لم نكتب السؤال بعد لذا نخزن نتائج البحث باعتبار السؤال فارغ، لاحقًا عندما ستتم عملية البحث الفعلية سيحدد النصوص المشابهة بشكل أفضل ويحسن عملية البحث. إليك مثالًا بسيطًا لبنية هذا المتغير، إذا كان السؤال الذي كتبه المستخدم هو "ما فائدة تعلم الذكاء الاصطناعي في تحسين مهارات التطوير" فسوف يحتوي المتغير عندها على قائمة من النصوص التي حصل عليها من الملف مع درجة التشابه مع السؤال المطروح على نحو مشابه للبنية التالية: self.docs = [ {"text": "تعلم لغات البرمجة يساعد في تطوير مهارات البرمجة", "similarity_score": 0.85}, {"text": "تعلم الذكاء الاصطناعي يحسن من تجربة المستخدم", "similarity_score": 0.92}, # ... وهكذا تأخذ هذه العملية بعض الوقت لقراءة الملف بالكامل ومعالجته بالاعتماد على حجم الملف وبعد اكتمال تحميل الملف وتحويله لتضمينات وفهرسته بالشكل المطلوب، سيُفعّل زر طرح السؤال إذ يمكن للمستخدم الآن كتابة أي سؤال في الحقل النصي question_entry للإجابة عليه بناءً على المحتوى الذي أنشأه البرنامج. self.progress_label.config(text="اكتملت عملية التحميل يمكنك طرح السؤال الآن") self.progress_bar.stop() self.progress_bar["value"] = 100 # تمكين زر طرح السؤال self.ask_button["state"] = tk.NORMAL الخطوة التالية والأخيرة هي تعريف التابع ask_question وهو أهم تابع في تطبيقنا وسنستدعيه بعد كتابة السؤال والنقر على زر طرح السؤال، ليبدأ بالبحث عن إجابة مناسبة على السؤال من محتوى المتغير doc ويرسل الطلب لواجهة OpenAI لتقديم إجابة مناسبة. def ask_question(self): user_question = self.question_entry.get() if user_question: llm = OpenAI(model="gpt-3.5-turbo-instruct", api_key=openai_api_key, temperature=0.0) chain = load_qa_chain(llm, chain_type="stuff") with get_openai_callback(): response = chain.run(input_documents=self.docs, question=user_question) print(response) # عرض الإجابة على السؤال self.result_text.tag_configure("center", justify="center") # مسح أي نص قديم إن وجد self.result_text.delete("1.0", tk.END) self.result_text.insert(tk.END, response, "center") كما هو موضح في الكود أعلاه سيحصل التابع على نص السؤال الذي أدخله المستخدم في الحقل النصي question_entry ثم يخزنه في المتغير user_question ويمرر مدخلات المستخدم إلى النموذج gpt-3.5-turbo-instruct لتوليد الإجابة، وهنا نحتاج كذلك لإدخال قيمة المفتاح openai_api_key لإنشاء اتصال مع واجهة برمجة تطبيقات OpenAI ولتخصيص أي وسطاء نحتاجها لتخصيص إجابة النموذج وأهم هذه الوسطاء temperature الذي يحدد درجة دقة السؤال. ويفضل في حالة تطبيقنا أن تبقى قيمته صفر للحصول على إجابات منطقية وحتمية تلتزم بمحتوى الملف، وعدم ترك النموذج يبدع ويؤلف إجابات لا صلة لها بالسياق وسنوضح المزيد عنه لاحقًا عن تجربة تنفيذ التطبيق. بعدها نستدعي الدالة load_qa_chain التي تنشئ سلسلةً نصيةً من نوع stuff لترسلها كمطالبة إلى الواجهة البرمجية OpenAI التي تفهم بدورها الطلب الذي أرسلناه وتعيد لنا الإجابة المناسبة response. ملاحظة: يحدد نوع السلسلة chain_type طريقة تمرير المستندات إلى النموذج اللغوي الكبير LLM وهنا مررنا القيمة ليكون stuff التي ترسل جميع المستندات في طلب واحد للواجهة البرمجية وهي تناسب حالة التعامل مع مستند واحد أو عدة مستندات صغيرة الحجم وتتضمن نفس طبيعة المحتوى، وهناك طرق أخرى هي Map-reduce تفيد في حال التعامل مع مستندات كبيرة هي تلخص كل مستند على حدا ثم تجمع التلخيصات في ملخص نهائي. أخيرًا نكتب كود تشغيل التطبيق كبرنامج رئيسي من خلال تحميل بيانات مفتاح OpenAI API من ملف ‎.‎env وفحص فيما إذا كان المفتاح قد تم تعيينه أم لا، والبدء بإنشاء واجهة المستخدم الرسومية وتشغيل التطبيق حتى يتم إغلاق النافذة. if __name__ == "__main__": load_dotenv() openai_api_key = os.getenv("OPENAI_API_KEY") if openai_api_key is None: print( "OpenAI API تأكد من تعيين قيمة مفتاح" ) else: root = tk.Tk() app = askpdfgui(root) root.mainloop() تجربة عمل التطبيق لننفذ الآن كود التطبيق ونختبر آلية عمله: انتقل لمسار وجود التطبيق واكتب الأمر python ask_pdf.py في سطر الأوامر أو الطرفية لتشغيله، ستظهر لك الواجهة الأولية ولتجربة التطبيق سأنقر على زر "حمل ملفك هنا" يمكن تحميل أي ملف pdf خاص بك في التطبيق، وفي حالتي سأختار ملف يتحدث عن لغات برمجة الذكاء الاصطناعي كما يلي: بعد اكتمال عملية التحميل سأطرح السؤال التالي: "ما هي لغات برمجة الذكاء الاصطناعي؟" وسأحصل على الإجابة كما هو موضح في الصورة التالية: كما يمكن طرح أي أسئلة أخرى حول الملف مثل اسم الكاتب أو تاريخ نشره وسيتمكن من الإجابة كما توضح الصورة أدناه: الآن لو طرحت سؤالًا لا علاقة له بمحتوى هذا الملف مثل "من اخترع المصباح الكهربائي" ستكون النتيجة كما يلي: تأثير الوسيط Temperature على دقة نتائج التطبيق يستخدم المعامل أو الوسيط temperature كما وضحت سابقًا للتحكم في دقة أو عشوائية النتائج التي تعيدها نماذج واجهة برمجة تطبيقات OpenAI وتتراوح قيمة هذا الوسيط بين 0 و 2، فعند ضبط درجة الدقة على قيم قريبة من الصفر ستحصل على نتائج واقعية وذات صلة بالطلب وحين تضبطه على قيم قريبة من 2 ستحصل على نتائج أكثر إبداعًا لكنها قد تكون غير دقيقة ولا صلة لها بالسؤال. لذا عليك تعديل قيمة هذا المعامل بما يتناسب مع طبيعة تطبيقك، وهل يحتاج للدقة كما في حال تطبيقنا الذي يبحث عن النتائج الموافقة للسؤال، أم يسمح فيه الإبداع والابتكار كتطبيقات تأليف القصص والروايات. سأجرب على سبيل المثال تغير درجة الحرارة في الكود السابق وجعلها مثلًا 1.5 وأحمّل الملف نفسه واطرح سؤال "من هو أديسون؟" مثلًا ستكون النتيجة غير منطقية كما يلي! أما عند إعادة ضبطه بالقيمة 0 فسيجيب التطبيق بأنه لا يملك معلومات عن أديسون وفق الملف الذي وفرته له. قيود على عدد الرموز Tokens في التطبيق يمكنك تجربة التطبيق على أي ملف pdf خاص بك، لكن تملك نماذج من OpenAI API حدًا أقصى لعدد الرموز Token Limits التي تمثل إجمالي طول المدخلات التي تستقبلها والنتائج التي تولدها وفي حالة النموذج gpt-3.5-turbo-instruct المستخدم في الكود فالعدد الأقصى هو 4096 رمزًا، وبالتالي قد تحصل على الخطأ التالي عند تحميل ملفات كبيرة وتجاوز إجمالي الرموز في دخل وخرج النموذج هذا العدد، ومن الإجراءات الممكنة لتجاوز هذه القيود، تحديد قيمة المعامل max_tokens للنموذج كي تحدد له طول الرد الذي سينتج وتمنعه من إنشاء محتوى طويل جدًا أو تقصير نص الطلب أو السؤال قدر المستطاع. كما تحدد بعض النماذج سرعة معالجة الرموز في الدقيقة الواحدة، فالحد الأقصى المسموح به للتضمينات في نموذج text-embedding-ada-002 هو 15000 رمز في الدقيقة، وبالتالي إذا استخدمت ملفات pdf كبيرة تتجاوز هذه الحدود فسوف تحصل على كذلك أخطاء في التنفيذ بسبب القيود التي تفرضها الواجهة البرمجية ولحلها عليك رفع خطة الاشتراك في الواجهة البرمجية. الخلاصة بهذا نكون قد وصلنا لنهاية مقالنا، الذي شرحنا فيه خطوات إنشاء تطبيق بايثون يستفيد من واجهة برمجة تطبيقات OpenAI لتحميل ملف PDF وطرح أسئلة حوله وتوليد إجابات عليها من محتوى الملف، وهناك بالطبع الكثير من الأفكار الأخرى التي يمكنك الاستفادة منها من النماذج اللغوية الكبيرة LLMs في تطوير تطبيقات متقدمة في مجال الذكاء الاصطناعي، أطلق العنان لإبداعك واستفد من قوة هذه النماذج وإمكانياتها الهائلة. اقرأ أيضًا تطوير تطبيق "وصفة" لاقتراح الوجبات باستخدام ChatGPT و DALL-E في PHP تطوير تطبيق "اختبرني" باستخدام ChatGPT ولغة جافاسكربت مع Node.js إعداد بيئة العمل للمشاريع مع بايثون اكتشاف دلالات الأخطاء في شيفرات لغة بايثون كود التطبيق ask_pdf.zip
    3 نقاط
  6. هل أنت مهتم بتعلم البرمجة والتطوير لكنك تتساءل ما هي مدة تعلم البرمجة؟ وكم أحتاج من الوقت لتعلم لغة برمجة معينة، وهل سأستغرق وقتًا طويلًا لتعلمها والعمل بها؟ وفي مقال اليوم نحاول أن نجيبك على كل هذه الأسئلة ونقدم بعض النصائح المفيدة التي تساعدك على التقدم بشكل أسرع. في الواقع قد تختلف الإجابة على هذا السؤال اعتمادًا على عدة عوامل مثل الوقت الذي يمكنك توفيره لدراسة البرمجة يوميًا ومدى استيعابك، وهل تبدأ من الصفر أم لديك بعض المعلومات المسبقة عن البرمجة، وما هو المجال أو التخصص الذي ترغب بتعلمه كم يستغرق تعلم البرمجة دعنا نتفق أنه ليس من السهل تحديد جواب دقيق لهذا السؤال، جرب مثلًا أن تكتب في محرك البحث جوجل "كم يستغرق تعلم البرمجة" ستفاجئ بالحصول على إجابات متفاوتة بشكل كبير على هذا السؤال قد تتراوح من ثلاثة أشهر إلى خمس سنوات! يعزى هذا التفاوت الكبير في الإجابات إلى وجود عوامل عديدة تلعب دورًا في تحديد مدة تعلم البرمجة، بعض هذه العوامل فردية وتختلف من شخص لآخر فهناك أشخاص يتعلمون المفاهيم الجديدة أسرع من غيرهم، وبعضهم لديه متسع من الوقت يمكن تخصيصه يوميًا في دراسة البرمجة أكثر من غيره، وبعضها الآخر عوامل تتعلق بطبيعة لغة البرمجة التي تنوي تعلمها أو التخصص البرمجي التي تود تعلمه وهل ترغب بالتعلم لدخول سوق العمل أم لمجرد اكتساب مهارات شخصية فكل هذه العوامل تؤثر على وتيرة تعلمك وزمن تحقيق أهدافك. سنناقش في الفقرات التالية بعض العوامل المهمة التي تؤثر على مدة تعلم البرمجة ونوضح كم يستغرق تعلم البرمجة بناء على كل حالة من الحالات لنساعدك على تحديد الوقت المطلوب بشكل تقريبي بحسب حالتك. العوامل التي تؤثر على مدة تعلم البرمجة الخبرة المسبقة صعوبة لغة البرمجة المستوى الذي تطمح للوصول إليه التخصص أو المجال البرمجي أسلوب التعلم جودة مصادر التعلم الخبرة المسبقة فإذا كنت تنوي تعلم البرمجة من الصفر ولم يكن لديك أي خلفية تقنية وليس لديك أدنى فكرة عن مبادئ التعامل مع الحاسوب ومفهوم الخوارزميات وأسس التفكير المنطقي وحل المشكلات وعن أي لغة برمجة سابقة فسيستغرق تعلم البرمجة وقتًا طويلاً منك نظرًا لوجود مجموعة واسعة من المفاهيم التي عليك تعلمها وقد يستغرق الأمر عدة أشهر حتى تتمكن من كتابة استيعاب أساسيات البرمجة وفهم مفردات لغة البرمجة التي تستخدمها وكتابة برنامج الأول بها بنفسك وتنفيذه بشكل صحيح. من الضروري أن لا تشعر بالإحباط في بدايات تعلم البرمجة وتأسيس نفسك بها فالبدايات دومًا هي الأصعب فإذا تخطيت هذه المرحلة فستتمكن من التقدم بتعلم البرمجة بوتيرة أسرع وسيسهل عليك الانتقال لتعلم أي لغة برمجة أخرى. صعوبة لغة البرمجة أحد العوامل المهمة في زمن تعلم البرمجة هو اللغة التي تختارها فهناك العديد من لغات البرمجة المختلفة مثل لغة بايثون Python. وجافا Java و C++ و PHP وغيرها الكثير وبعض هذه اللغات سهل التعلم وبعضها الآخر أكثر صعوبة ويستغرق مدة تعلم أطول فتعلم لغة برمجة سهلة نسبيًا يستغرق حوالي أربعة إلى ستة أشهر وستحتاج لوقت أكبر إذا كنت تتعلم لغة برمجة صعبة. لذا عندما تقرر تعلم البرمجة فمن الأفضل أن تبحث عن لغة لها منحنى تعلم "Learning Curve" سهل وغير حاد أو معقد، ومنحنى التعلم هو طريقة بيانية للتعبير عن صعوبة تعلم الشخص لموضوع خلال فترة زمنية معينة ويعبر عن سرعة التقدم والخبرات المكتسبة في هذا الموضوع مع مرور الوقت. على سبيل المثال تملك لغة بايثون Python منحنى تعليمي أسهل من لغة جافا Java بسبب تعتبر لغة تركيبتها التي تشبه إلى حد كبير اللغة الإنجليزية وقواعدها السهلة، لهذا السبب فإن مدة تعلم لغة البايثون ستكون أقصر من مدة تعلم لغة جافا وتقدر المدة الوسطية لتعلم أساسيات بايثون بخمس إلى عشر أسابيع في حين تصل مدة تعلم جافا من ستة أشهر إلى 18 شهرًا، ويمكنك مطالعة المزيد من المعلومات حول لغات البرمجة التي يفضل أن تبدأ بها تعلم البرمجة من خلال مقال أسهل لغات البرمجة. المستوى الذي تطمح للوصول إليه إذا كنت تقصد عند سؤالك ما المدة التي أحتاجها لتعلم البرمجة أن تتعلم أساسيات البرمجة وتتعرف على طريقة أسلوب كتابة الشيفرات والتعليمات وتعريف المتغيرات وأنواع البيانات، والحلقات والشروط والدوال البرمجية …إلخ. لمجرد اكتساب مهارة تنمي تفكيرك المنطقي والتحليلي وتوسع مداركك وتمكنك من كتابة برامج حاسوبية لحل مشكلات بسيطة أو أتمتة مهامك اليومية المتكررة فهذا الأمر لن يتطلب منك سوى ثلاثة إلى ستة أشهر فقط لتعلم البرمجة بأي لغة كانت. لكن هذه المدة لن تكون كافية لك لاحتراف البرمجة ودخول سوق العمل فهذا الأمر قد يتطلب منك حوالي سنة أو أكثر للعمل على بناء برامج معقدة وتطبيقات احترافية متكاملة تتعامل مع مشكلات فعلية وتنبي من خلالها معرض أعمال جيد يعزز فرصتك في الحصول على عمل مناسب وإذا كنت تحتاج علم لغة برمجة سهلة نسبيًا يستغرق حوالي أربعة إلى ستة أشهر. التخصص أو المجال البرمجي إن مجالات البرمجة كثيرة ومتنوعة مثل تطوير الويب وبرمجة المواقع وبرمجة الألعاب والذكاء الاصطناعي وعلوم البيانات والأمن السيبراني وغيرها الكثير وبتطلب كل تخصص برمجي مجموعة مهارات مختلفة عن الآخر فكلما زادت المهارات المطلوبة وزاد تعقيدها، كلما زاد الوقت الذي تحتاجه لتعلمها. على سبيل المثال، تبلغ مدة تعلم برمجة المواقع حوالي ستة أشهر إلى عام واحد، في حين يحتاج تعلم أساسيات الذكاء الاصطناعي مدة أطول قد تصل لسنة أو أكثر لأنه مجال أكثر تعقيدًا ويتطلب وجود أساس جيد في الرياضيات والإحصاء ويحتج بعض الوقت للتآلف مع مصطلحاته والتعرف على تخصصاته المختلفة وتعلم خوارزميات التعلم الآلي ولغات برمجة الذكاء الاصطناعي كما يحتاج للكثير من الممارسة لإتقانه. أسلوب تعلم البرمجة تختلف مدة تعلم البرمجة أيضًا بحسب الطريقة التي تختارها للتعلم، فإذا اخترت دارسة البرمجة عن طريق التعليم الأكاديمي والتسجيل في إحدى الجامعات فستستغرق وقتًا طويلًا لا يقل عن أربع أو خمس سنوات لأنك ستضطر على الالتزام بمنهج محدد. أما إذا اخترت التعلم الذاتي فستتمكن من توفير الكثير من الوقت وتقتصر اعلى لغات البرمجة والتقنيات التي تحتاج لتعلمها وبقدر ما تثابر وتبذل من جهد وتلتزم بخطة تعلم منظمة وساعات تعلم محددة يوميًا فستختصر من زمن تعلم البرمجة وتتمكن من دخول سوق العمل بسرعة أكبر. جودة مصادر التعلم إذا قررت تعلم البرمجة فستجد الكثير من مصادر التعلم المتنوعة من دروس ومقالات وكتب ومقاطع فيديو ودورات تدريبية وغيرها من المصادر التي تساعدك لكن هذه المصادر ليست على نفس المستوى من الجودة وقد يصعب عليك كمبتدئ تمييز الغث من السمين وتحديد الترتيب الصحيح لمواضيع التعلم والتركيز على تعلم ما يهمك. كما أن تعلمك من مصادر مشتتة وبطريقة عبثية فتارة تشاهد مقطع فيديو عن موضوع ما وتارة تقرأ مقالة عن موضوع آخر وتارة تبدأ بقراءة كتاب ثم تمل منه سريعًا سيزيد بلا شك من مدة تعلم البرمجة وتحقيق هدفك وتذكر أن المشتت لا يصل. فإذا كنت تتعلم البرمجة دون خطة منهجية واضحة وتريد اختصار وقت تعلم البرمجة فمن الأفضل أن تستثمر وقتك وجهدك وتسجل في دورة تدريبية المنهجية التي تقدم لك المعرفة التي تحتاجها بالتسلسل الصحيح وتوضح لك الأدوات والتقنيات التي تحتاجها وتقيم مهاراتك بشكل معياري وتساعدك على تنفيذ تطبيقات عملية تعزز ما تعلمته وتزيد فرصتك في الحصول على وظائف برمجة مناسبة لمهاراتك. ستجد في أكاديمية حسوب الكثير من الدورات التعليمية عالية الجودة بمختلف التخصصات توفر لك إمكانية التعلم من الصفر دون الحاجة لأي معرفة مسبقة وتساعدك على التعلم بطريقة منظمة وتقرن التعليم النظري بالتطبيق العملي والأهم أنها توفر لك مدربين خبراء يرشدونك ويدعمونك طوال رحلتك التعليمية ويساعدونك في الإجابة على أي تساؤل وحل أي مشكلة تواجهك ويسعدون بتقديم المشورة التي تحتاجها حتى تحترف البرمجة وتجد فرصة العمل المناسبة. هل فات الوقت على تعلّم البرمجة كثيرًا ما نسمع أسئلة من قبيل أنا مهتم بالبرمجة والتقنية وأرغب في تعلمها لأعمل في وظيفة أفضل وذات مردود مادي أعلى أو أرغب بتعلم البرمجة لمواكبة التطور التقني وتعزيز مهارات حل المشكلات لدي ولكن عمري (كذا سنة) فهل فات الوقت على تعلم البرمجة؟ دعني أخبرك بأنه مهما كان عمرك فإن الأوان لم يفت على تعلم البرمجة فالعمر لا يشكل أي عائق في التعلم سواء في ظل وفرة الموارد المتاحة لمساعدتك. وقد يستغرق تعلم البرمجة مدة أطول مع التقدم في السن لكنك قادر على تقليل هذه المدة في حال خصصت وقتًا أطول وأسست نفسك بشكل جيد بالاعتماد على مصادر عالية الجودة وامتلكت الإرادة والرغبة الحقيقية للتعلم فهذا كفيل بجعلك تتغلب على أي صعوبات أو عوائق تواجهها. نصائح لتقليل مدة تعلم البرمجة حدد هدفك من تعلم البرمجة والتخصص البرمجي المناسب لك، وضع خطة لتعلم التقنيات واللغات التي تفيدك في هذا التخصص. عزز مهارة حل المشكلات والتفكير المنطقي قبل البدء بالبرمجة فهي مهارات أساسية تقلل مدة تعلم البرمجة. ركز على تعلم لغة برمجة سهلة وتناسب المبتدئين فهذا يسهل عليك استيعاب المفاهيم البرمجية بوقت أقل ويسهل عليك الانتقال لتعلم أي لغة برمجة أخرى. لا تستسلم بسرعة، فتعلم أي شيء جديد سيكون صعبًا في البداية ويستغرق بعض الوقت لفهم الأساسيات ومع الوقت والخبرة تصبح الأمور أسهل. اعتمد على مصدر جيد لتعلم البرمجة ولا تشتت نفسك بكثرة المصادر. احرص على التطبيق العملي لما تتعلمه من مفاهيم فهذا يعزز مهاراتك ويساعدك على بناء معرض أعمال يثبت خبرتك. تعلم مع أصدقاء لديهم نفس اهتمامك وضع معهم هدفًا مشترك وخطة للتعلم وتعاون معهم في حل المشكلات وتعلم المفاهيم الجديدة فهذا يجعل التعلم أكثر متعة ويحفزك على المواصلة. الخلاصة نأمل أن يكون هذا المقال قد ساعدك في تحديد كم يستغرق تعلم البرمجة ومعرفة أهم العوامل التي تلعب دورًا في الإجابة على هذا السؤال بشكل تقريبي، وكما وضحنا في المقال لا يوجد جواب واحد يناسب الجميع على هذا السؤال لكن بإمكانك اختصار مدة تعلم البرمجة ودخول سوق العمل بسرعة بالمثابرة والجهد. وتذكر في الختام أن البرمجة تحتاج منك إلى الاستمرار في التعلم وتطوير نفسك حتى بعد الاحتراف ودخول سوق العمل، فالتقنيات تتغير وتتطور باستمرار ومن الضروري مواكبة هذه التغييرات وتطبيقها في عملك للحفاظ على مكانتك التنافسية وتلبية متطلبات سوق العمل المتجددة. اقرأ أيضًا دليل شامل لتعلم البرمجة قواعد البرمجة ببساطة للمبتدئين اكتشف ما هي البرمجة وما أهمية تعلمها برمجة الحاسوب للمبتدئين لماذا يجب أن تعلم طفلك البرمجة؟
    3 نقاط
  7. يتضمن مجال تطوير الويب قسمين أساسين هما تطوير الواجهة الأمامية front-end (فرونت إند) وتطوير الواجهة الخلفية back-end (باك إند) وهما من المجالات الرائدة اليوم فجميع النشاطات التجارية والأشخاص يسعون للتواجد على شبكة الإنترنت ويحتاجون لمطوري ويب لإنشاء مدونات أو مواقع أو تطبيقات أو متاجر إلكترونية خاصة بهم. سنخصص مقال اليوم للحديث عن تطوير الواجهة الأمامية ونوضح كافة المفاهيم المرتبطة وكافة الخطوات والتقنيات التي تحتاجها لتتعلم كي تصبح مطور واجهات محترف فإذا كنت مهتمًا بهذا المجال لكنك لا تملك أدنى فكرة عن كتابة الشيفرات البرمجية أو إنشاء صفحات الويب ولا تعرف من أين تبدأ أنصحك بأن تقرأ المقال للنهاية. ما هو تطوير الواجهة الأمامية Front End Web Development؟ قبل أن نشرح تطوير الواجهة الأمامية front-end تحتاج لأن تعرف مراحل بناء أي موقع إلكتروني، فإنشاء أي موقع أو تطبيق يبدأ بتحديد فكرته وتوثيقها، بعدها ترسل هذه الفكرة إلى مصمم الواجهات الأمامية الذي يرسم واجهات الموقع وصفحاته كلها بمختلف تفاصيلها وحالتها، حيث تُراجع هذه الواجهات ثم ترسل إلى مطور الواجهات لتكويدها وبرمجتها وهنا تقسم العملية إلى برمجة واجهات أمامية وخلفية وتبرمج كل واجهة وتتفاعل الواجهتان مع بعضهما للحصول على المواقع المتكامل. فمطور الواجهة الأمامية front end web developer أو ما يعرف بمطور واجهات المستخدم user interface developer هو المبرمج المسؤول عن إنشاء كافة الأجزاء المرئية التي يراها المستخدم ويتفاعل معها عند زيارة مواقع وتطبيقات الويب وبرمجة كافة الواجهات ومكوناتها من أزرار وقوائم ونصوص ورسومات وصور ونماذج وغيرها وتحديد كيف سيبدو كل جزء من موقع الويب وكيف سيتفاعل المستخدم معه. الفرق بين تطوير الواجهة الأمامية front-end وتطوير الواجهة الخلفية back-end والتطوير الكامل Fullstack من الضروري أن تفهم أبرز الفروقات بين تطوير الواجهة الأمامية وتطوير الواجهة الخلفية والتطوير الكامل والتي تعكس في واقع الأمر تخصصات تطوير الويب أو بمعنى آخر الدور الذي يساهم به مطور الويب عند بناء المواقع والتطبيقات والتقنيات التي يستخدمها لأداء عمله، كما أنها تعبر عن مكان تشغيل الشيفرات البرمجية لهذه المواقع والتطبيقات. بدايةً يجب أن تعرف أن عرض موقع الويب على جهازك يتم دومًا في لغة HTML وهي لغة توصيفية يستخدمها مطورو الويب لإنشاء وعرض الصفحات، هناك عدة تقنيات يمكنك إنشاء المواقع من خلالها لكن مهما كانت التقنية المستخدمة فإن عرض الموقع لديك في نهاية المطاف سيكون بلغة HTML. الآن يمكن أن تحدث عملية عرض ملفات المواقع مباشرة على جهازك كما في حال المواقع البسيطة ذات المحتوى الثابت فهي تخزن على خادم الويب بالأساس بشكل ملفات HTML وترسل لك هذه الملفات مباشرة عند طلبها وتعرض لك كما هي على متصفحك. من ناحية أخرى قد تتطلب عملية عرض المواقع بعض المعالجة المسبقة التي تحدث على جانب خادم الويب أو يسمى الخادم البعيد مثل مواقع الويب الديناميكية التي لا تعرض نفس المحتوى لجميع المستخدمين وتتغير بناء على إدخالات المستخدم، فعندما ترسل طلبًا لعرض صفحة ما من موقع ديناميكي يقوم الخادم بمعالجة طلبك هذا وبعد الانتهاء ويجلب لك البيانات المطلوبة والعرض الأخير على جهازك يكون بشيفرة HTML. كل ما يتعلق بأمور عرض الموقع من جانب متصفح الويب أو يسمى طرف العميل client side يندرج تحت مجال تطوير الواجهة الأمامية للموقع، وكل ما يتعلق بأمور معالجة الموقع من طرف خادم الويب من معالجة البيانات وتخزينها وحفظها وإجراء عمليات عليها وغيرها يندرج تحت مجال تطوير الوجهة الخلفية للموقع ولكل منهما تقنياته وأدواته، على سبيل المثال عندما تسجل في موقع يطلب تاريخ ميلادك، تراه يعرضها لك أحيانًا بشكل عمر أي عدد وليس تاريخ، هذه المعالجة تُرسل عادة من طرف الخادم. ليس لزامًا عليك كمطور ويب تعلم تطوير الواجهة الأمامية أو الخلفية معًا بل يمكنك التخصص في إحداهما فقط، فإذا كنت تحب تنفيذ الجوانب المرئية لواجهات المستخدم وجعلها تعمل وفق التصميم المقترح سيناسبك تطوير الواجهة الأمامية أكثر، وإذا كنت تفضل حل المشاكل المنطقية والتعامل مع قواعد البيانات وواجهات برمجة التطبيقات والخوادم والخدمات السحابية فإن تطوير الواجهة الخلفية يناسبك. أما إذا كنت متحمسًا للقيام بكل ما سبق وكانت لديك القدرة لتعلم كافة التقنيات والمهارات اللازمة لتطوير الواجهة الأمامية وتطوير الواجهة الخلفية والقيام بالأمرين معًا عندها سيطلق عليك اسم المطور الكامل fullstack developer وستفتح أمامك الكثير من الفرص المجزية. وإذا كنت مهتمًا بمعرفة مزيد من التفاصيل حول مجالات تطوير الويب أنصح بمطالعة مقال المدخل الشامل لتعلم تطوير الويب وبرمجة المواقع ومقال دليلك الشامل إلى تطوير الواجهة الخلفية Backend. أهمية تطوير الواجهة الأمامية في سوق العمل إذا كنت مهتمًا بتطوير الويب فدعني أخبرك أن تبدأ به دون تردد فهو واحد من أكثر مجالات العمل نموًا مقارنة بباقي الوظائف فبحسب استبيان عام 2022 لموقع ستاك أوفر فلو الشهير الذي يضم آلاف خبراء البرمجة حول العالم فإن 25.96% من المشاركين في الاستبيان وعددهم 61,302 متخصصون في تطوير الواجهة الأمامية front-end، ويحتل هذا المجال المرتبة الثالثة بين أنواع المطورين بعد تطوير الواجهة الخلفية back-end والتطوير الكامل full-stack وهذا إن دلَّ على شيء فإنما يدل على مدى أهمية هذا المجال والطلب المرتفع عليه. أضف إلى ذلك فإن رواتب مطوري الواجهة الأمامية مرتفعة ومجزية ورغم كونها تتفاوت وتختلف حسب نوع الشركة ومقرها والمهارات المطلوبة للوظيفة ومستوى الخبرة إلا أن اكتسابك لمهارات عالية واحترافك لتطوير الواجهة الأمامية سيضمن لك الحصول على رواتب مرتفعة جدًا فمعظم جهات العمل تبحث عن مطور واجهة أمامية موهوب يمكنه إنشاء مواقع بتصاميم فريدة وبتجربة محسنة من شأنها زيادة رضا العملاء وجعل المواقع تتفوق على منافسيها. الجدير بالذكر أن أصعب جزء في مجال تطوير الواجهة الأمامية هو أنه متجدد باستمرار لذا يحتاج المطور للاطلاع بصورة دائمة على أحدث التقنيات في تطوير الويب ليتمكن من الاحتفاظ بالصدارة في سوق العمل لكنه مجال مجزٍ ويستحق الجهد. ما هي مهام مطور الواجهة الأمامية؟ مطور الواجهات الأمامية هو المسؤول بشكل عام عن إنشاء أجزاء المواقع والتطبيقات التي تعمل من جانب العميل (أو المتصفح)، وهذه المهمة تتضمن القيام بالعديد من المهام والتي تشمل: كتابة شيفرات HTML و CSS وجافا سكريبت لتنفيذ تصميم الموقع التي تكون عادة بشكل صور مصممة من قبل مصمم الواجهات الأمامية المسؤول عن تصميم واجهة المستخدم وتجربة المستخدم UI / UX بواسطة برامج متخصصة مثل فيجما Figma أو Sketch أو فوتوشوب. التواصل مع مطور الواجهة الخلفية المسؤول عن تحقيق وظائف الموقع والتأكد من توافق الواجهة الأمامية مع الواجهة الخلفية للموقع. تحسين أداء موقع الويب والتأكد من سرعة تحميله وتوفر تجربة مستخدم سهلة ومحسنة. التأكد من أن الموقع متوافق مع كافة متصفحات الويب ويعمل بالشكل الصحيح ومعالجة أي مشاكل توافق إن وجدت. التأكد من كون الموقع متجاوب ومتكيف مع كافة أحجام الشاشات بما في ذلك شاشات الهواتف الجوالة والأجهزة اللوحية وأجهزة الحاسوب. أهم أدوات تطوير الواجهة الأمامية إذا قررت التخصص في تطوير الواجهات الأمامية للويب ستجد الكثير من الخيارات المتاحة، فاللغات الثلاث الأساسية لأي مطور واجهة أمامية هي HTML و CSS وجافا سكريبت كما يمكنه إلى جانب ذلك استخدام العديد من اللغات وأطر العمل والمكتبات الأخرى الكثيرة التي تسهل عمله في تطوير الواجهات وفي الفقرات التالية سنسلط الضوء على أبرز هذه الأدوات. أهم لغات برمجة الواجهة الأمامية HTML CSS جافا سكريبت JavaScript تايب سكريبت TypeScript لنتناول بتفصيل أكثر كل لغة من هذه اللغات ودورها في تطوير الواجهات الأمامية للمواقع والتطبيقات. لغة HTML لغة HTML هي اختصار لعبارة HyperText Markup Language أي لغة ترميز النص التشعبي وهي اللغة الأساسية لتطوير الواجهة الأمامية للمواقع والتطبيقات وهي لغة وصفية أو لغة ترميز تصف البنية العامة لصفحات الويب ومحتوياتها من نصوص وأزرار وصور وقوائم باستخدام الوسوم وهي علامات موضوعة ضمن قوسي زاوية <> تحدد نوع المحتوى أو هيكليته على سبيل المثال لإنشاء صفحة ويب تتضمن عنوان وصورة ونص نكتب كود HTML التالي: <!DOCTYPE html> <html dir="rtl"> <head> <title>عنوان الصفحة</title> </head> <body> <h1>عنوان الصفحة</h1> <img id="myImage" src="html.png"> <p> HTML هي اختصار لـHyperText Markup Language أي لغة ترميز النص التشعبي وهي الأساسية لتطوير الواجهة الأمامية للمواقع والتطبيقات </p> </body> </html> احفظ الكود أعلاه في ملف نصي باسم index.html وقم بعرضه في متصفح الويب، عندها ستظهر الصفحة بالشكل التالي: للمزيد من المعلومات أنصح بمطالعة مقال تعلم لغة HTML الذي يشرح لك كافة الأساسيات التي تحتاجها للعمل مع هذه اللغة والاطلاع على توثيق HTML الشامل على موسوعة حسوب. لغة CSS لغة CSS هي اختصار لـ Cascading Style Sheets وهي لغة تصميم تستخدم لتحديد تنسيق صفحة الويب واختيار الألوان والخطوط والخلفيات وما إلى ذلك كما أنها تستخدم في جعل مواقع الويب متجاوبة مع مختلف الشاشات من خلال كتابة شيفرات تغير تنسيق وتخطيط العناصر بحسب أبعاد الشاشة. تستخدم لغة CSS قواعد تنسيق تستهدف عناصر HTML التي نريد تصميمها على سبيل المثال سنكتب التعليمات التالية لتنسيق صفحة الويب التي أنشأناها باستخدام HTML نكتب شيفرات CSS التالية ضمن الوسم <head>: <style> body { font-family: 'Cairo', sans-serif; background-color: #f2f2f2; margin: 0; padding: 0; } h1 { font-size: 36px; color: #333; text-align: center; margin: 50px 0; } img { display: block; margin: 0 auto; max-width: 100%; height: auto; } p { font-size: 18px; color: #666; text-align: center; margin: 50px; line-height: 1.5; } </style> تظهر الصفحة بعد إضافة التنسيقات كما يلي: وللمزيد من المعلومات يمكنك مطالعة سلسلة دروس CSS على أكاديمية حسوب إلى جانب توثيق CSS الشامل على موسوعة حسوب. لغة جافا سكريبت JavaScript بعد أن تقوم بتخطيط عناصر الواجهة الأمامية باستخدام HTML وتنسقها باستخدام CSS قد تحتاج إلى إضافة بعض التفاعلات إلى صفحاتك وهنا يأتي دور لغة جافا سكريبت JavaScript التي تعد واحدة من أشهر لغات البرمجة وأكثرها استخدامًا فهي تمكنك من تطوير كل من الواجهة الأمامية والخلفية. قد يكون تعلم جافا سكريبت هو الخطوة الأصعب لك كمطور واجهة أمامية لا سيما إن لم تكن تملك خبرة سابقة في البرمجة لكن بمجرد تعلمها ستتمكن من نقل الموقع إلى مستوى جديد وإضافة التأثيرات الديناميكية لصفحاته والاستجابة لتفاعل المستخدمين مع عناصره بدلًا من جعله يعرض معلومات ثابتة فقط. على سبيل المثال يمكنك كتابة شيفرات جافا سكريبت لعرض قائمة منسدلة أو إظهار رسالة منبثقة عند النقر فوق زر ما على الصفحة، أو إرسال طلب للتحقق من اسم المستخدم وكلمة المرور بعد النقر فوق زر تسجيل الدخول أو أي شكل من أشكال التفاعل مع الصفحة من طرف العميل. لنفرض أنك تحتاج لتكبير حجم صور الموقع قليلًا عند مرور مؤشر الفأرة فوقها، لن تتمكن من هذا إذا لم تكن تعرف جافا سكريبت وتدمجها مع HTML و CSS بدايةً عليك إضافة أكواد CSS التالية بعد الأكواد التي كتبتها في الخطوة السابقة: .zoom { transition: transform .2s; /* Add any other styles you want */ } .zoom:hover { transform: scale(1.5); /* Change the scale value to adjust the level of zoom */ } وبعدها عليك أن تضيف أكواد جافا سكريبت التالية قبل الوسم </body> ضمن كود HTML: const image = document.getElementById("myImage"); image.addEventListener("mouseover", function() { image.classList.add("zoom"); }); image.addEventListener("mouseout", function() { image.classList.remove("zoom"); }); تستمع شفرة جافا سكريبت هذه إلى حدث مرور مؤشر الفأرة فوق الصورة وتضيف تنسيق التكبير zoom إليه عند وقوع هذا الحدث. كما أنها تستمع إلى حدث خروج مؤشر الفأرة من عنصر الصورة وتزيل تنسيق التكبير منه عند وقوع هذا الحدث، وعند عرض الصفحة في المتصفح نحصل على التأثير التالي: للمزيد من التفاصيل أنصح بمطالعة مقال تعلم جافا سكريبت من الصفر حتى الاحتراف، كما توفر موسوعة حسوب توثيق لغة جافا سكريبت باللغة العربية يمكنك من خلالها تعلم كافة ما يتعلق بهذه اللغة. لغة TypeScript تعد لغة TypeScript لغة برمجة مفتوحة المصدر طورتها مايكروسوفت عام 2012 لتوفر ميزات إضافية تساعد على تطوير تطبيقات جافا سكريبت فهي تجعل تعليمات جافا سكريبت مفهومة بشكل أكبر وتوفر إمكانية تحديد أنواع المتغيرات كي تقلل من أخطاء الكود، وقد تزايدت شعبيتها بشكل كبير في الآونة الأخيرة لما توفره من ميزات لتحسين جودة التطبيقات وتسريع عملية التطوير . يمكنك مطالعة المزيد من المعلومات حول هذه اللغة وإمكانياتها من خلال مجموعة دروس TypeScript المتوفرة على أكاديمية حسوب أهم أطر عمل تطوير الواجهة الأمامية ظهرت أطر العمل frameworks والمكتبات البرمجية لتسهيل عمل المطور وتسريع عمله، لذا ستحتاج لاستخدامها في سوق العمل بدلًا من كتابة كل شيء بيدك من الصفر، وأطر عمل الواجهات الأمامية كثيرة ومن أبرزها: بوتستراب Bootstrap رياكت React أنغولار Angular فيو Vue جي كويري jQuery دعنا نلقي نظرة على كل تقنية منها ونشرح بمزيد من التفصيل دورها وأهميتها في تطوير الواجهة الأمامية. بوتستراب Bootstrap بوتستراب هو إطار ويب مجاني مفتوح المصدر مخصص للواجهة الأمامية فهو يستخدم لتصميم مواقع وتطبيقات ويب متجاوبة مع كافة أحجام الشاشات وذات مظهر احترافي بسرعة وسهولة فهو يحتوي على قوالب تصميم ومكونات جاهزة مكتوبة بلغة HTML ولغة CSS كما يوفر بالإضافة لذلك ملحقات تصميم مكتوبة بلغة جافا سكريبت. للاطلاع على المزيد من المعلومات يمكنك متابعة المقالات الدروس حول إطار عمل بوتستراب على أكاديمية حسوب إضافة لتوثيق بوتستراب الشامل على موسوعة حسوب. رياكت React رياكت React هي مكتبة جافا سكريبت مفتوحة المصدر طورتها شركة فيسبوك عام 2013 وهي تعد اليوم واحدة من أشهر مكتبات تطوير الواجهة الأمامية التي يمكنك من خلالها إنشاء مكونات قابلة لإعادة الاستخدام وتطوير واجهات مستخدم متجاوبة بسرعة وسهولة. يمكنك مطالعة المزيد حول هذه المكتبة وتعلم طريقة بناء واجهات المواقع والتطبيقات باستخدامها من خلال الدروس والمقالات الاحترافية حول React على أكاديمية حسوب وأيضًا توثيق React على موسوعة حسوب. أنغولار Angular أنغولار Angular هو إطار عمل مفتوح المصدر يعتمد على لغة TypeScript أطلقته شركة جوجل وهو يتميز بقدرته على تطوير تطبيقات ويب متطورة وضخمة وإدارتها بسهولة كبيرة فهو يوفر الكثير من الميزات التي تساعد مطوري الواجهة الأمامية مثل إدارة حالة التطبيق والتحقق من الصحة. كما يمكنك مطالعة المزيد من الدروس والمقالات الاحترافية حول Angular على أكاديمية حسوب لتتعرف على طريقة استخدامها في تطوير مواقع ويب احترافية. فيو Vue فيو Vue هو إطار عمل جافا سكريبت مفتوح المصدر طوره Evan You المبرمج في جوجل عام 2014 لتطوير واجهات المستخدم وتطبيقات الصفحة الواحدة وهو اليوم واحد من أكثر أطر عمل الواجهة الأمامية شيوعًا واستخدامًا. ما يميز إطار فيو Vue أنه مرن وخفيف الوزن وسهل الاستخدام فقد أزال كل المكونات الإضافية والمفاهيم غير الضرورية التي تأتي مع أطر عمل الواجهة الأمامية الأخرى مثل أنغولار Angular ورياكت React. وللمزيد من التفاصيل أنصح بمطالعة مقال مقارنة بين أطر الواجهات الأمامية: Angular و React و Vue لمعرفة الإطار الأنسب لمتطلباتك، كما أنصح بمتابعة الدروس والمقالات حول Vue التي توفرها أكاديمية حسوب بشكل دوري لتعلم المزيد حول استخدامات هذا الإطار. جي كويري jQuery جي كويري jQuery هي مكتبة مبنية بالاعتماد على لغة جافا سكريبت وهي توفر لمطوري الواجهة الأمامية الكثير من القوة والمرونة وتتضمن الكثير من الميزات التي تجعل كتابة شيفرات جافا سكريبت أبسط وأكثر اختصارًا. لمعرفة المزيد حول طريقة استخدام مكتبة jQuery عند تطوير مواقع الويب أنصح بمطالعات مجموعة المقالات والدروس حول jQuery المتوفرة على أكاديمية حسوب، كما أنصح بمطالعة توثيق jQuery على موسوعة حسوب. تقنيات وأدوات مهمة لتطوير الواجهة الأمامية إضافة لما سبق، يحتاج أي مطور واجهة أمامية لقائمة طويلة من المعارف والمهارات والأدوات الإضافية التي تعزز أداءه وتساعده في تطوير واجهات المستخدم وتكويدها بسرعة واحترافية، وإليك قائمة بأبرز هذه الأدوات نذكر: شجرة DOM والتعامل معها. معرفة أساسية بالشبكات وشبكة الإنترنت وأشهر برتوكولات التواصل مثل HTTP. لمحة عن قواعد التصميم وأساسيات تصميم واجهات المستخدم وتجربة المستخدم UX/UI. التصميم المتجاوب responsive design مع كافة أحجام الشاشات. التوافق مع المتصفحات Cross-browser. واجهة برمجة التطبيقات API. لمحة عن Node.js وأنظمة إدارة الحزم تحديدًا npm. نظام التحكم في الإصدارات git. شجرة DOM من الضروري أن يعرف أي مطور واجهة أمامية مهارات التعامل مع نموذج كائن المستند Document Object Model أو اختصارًا DOM أو شجرة DOM ومعالجته عبر لغة جافا سكريبت، و DOM هو مجموعة من المواصفات التي تمثل مستند الويب بشكل كائن وتعد أحد الطرق الأساسية في بناء مواقع تفاعلية حيث أنها تنشئ واجهة برمجة تطبيقات API تسمح للغات البرمجة مثل جافا سكريبت بالوصول لكافة عناصر صفحات الويب ومعالجتها والتحكم بها. ستساعدك معالجة DOM في تحديث بيانات الصفحة أو تغيير تخطيطها دون إعادة الحاجة لإعادة تحميلها على سبيل المثال يمكنك من خلال DOM إضافة عناصر HTML للصفحة أو إزالتها أو تعديل تنسيقات CSS لها عند وقوع حدث ما أو عند إعادة تحميل صفحة الويب. معرفة أساسية بالشبكات يحتاج مطور الواجهة الأمامية لامتلاك معلومات أساسية حول طريقة عمل الويب والشبكات الحاسوبية وشبكة الإنترنت ومفهوم العميل والخادم وكيفية التفاعل بينهما وبروتوكولات الاتصال عبر الويب مثل HTTP و HTTPS و SSL ومفهوم خدمة اسم المجال DNS فهذه المعرفة تمكنه من عرض واستدعاء المحتوى من الشبكة والاتصال مع الخادم بشكل آمن وتوفير تجربة مستخدم أفضل. للاطلاع على مزيد من المعلومات يمكنك مطالعة سلسلة المقالات والدروس حول الشبكات على أكاديمية حسوب. قواعد التصميم وأساسيات UX/UI ذكرنا سابقًا أن مطور الواجهة الأمامية قد يكون مسؤولًا عن تصميم موقع ويب من الصفر أو قد يكون مسؤولًا عن تحويل التصاميم الجاهزة إلى شيفرات برمجية، لكن في كلتا الحالتين أجد أنه من الضروري لأي مطور واجهة أمامية أن يعرف أفضل النصائح والقواعد لتصميم واجهة المستخدم والمبادئ والقواعد الأساسية في تصميم تجربة المستخدم UX وتصميم واجهة المستخدم UI فهذا من شأنه أن يساعده على فهم الواجهات وكيفية تفاعل المستخدمين معها بشكل أفضل وكيفية إنشاء واجهات أكثر جاذبية وسهولة في الاستخدام وبالتالي سيتمكن من كتابة شيفرات الواجهة الأمامية بشكل أفضل ويضمن أنها مطابق للقواعد التصميمة الصحيحة. التصميم المتجاوب مع كافة أحجام الشاشات التصميم المتجاوب Responsive Design هو تصميم يقوم بتغيير حجم عناصر صفحات الموقع أو إخفائها أو تصغيرها أو تكبيرها ليضمن ظهورها بطريقة واضحة وسهلة الاستخدام مهما كان نوع الجهاز المستخدم لعرضها. يحتاج مطور الواجهة الأمامية لمعرفة أساسيات تصميم الويب المتجاوب Responsive Web Design وطرق كتابة استعلامات الوسائط Media Queries في CSS بشكل صحيح كي يضمن ظهور المواقع بكفاءة على جميع أنواع وأحجام الأجهزة التي يستعملهما المستخدمون سواء الحواسيب ذات الشاشات الكبيرة أو الهواتف المحمولة ذات الشاشات الصغيرة. التوافق مع المتصفحات Cross-browser أحد المهارات الضرورية التي يجب على مطور الواجهة الأمامية تعلمها هو التأكد من أن الواجهات التي يبرمجها متوافقة مع مختلف المتصفحات وتظهر بشكل سليم ومتسق على المتصفحات الشهيرة مثل كروم وفايرفوكس وسفاري وEdge وOpera ويتعلم كيف يجري اختبارات التوافق مع المتصفحات cross-browser testing ويعالج أي مشكلات تواجهه في التوافق. يمكنك الاستعانة ببعض الأدوات والتقنيات المساعدة في اختبار توافق المتصفح Cross-browser مثل Markup Validation Service و CrossBrowserTesting و LambdaTest …إلخ. لكن تجدر الإشارة بأن أطر عمل الواجهات الأمامية مثل رياكت React وأنجولار Angular يمكنها أن تقوم بهذه المهمة عنك ولن تجعلك تكترث لها، يكفي أن تحدد لها أي نوع متصفح تريد أن نستهدف وهي تتولى الأمر لأنها تعالج دومًا الشيفرة التي تكتبها. استدعاء واجهة برمجة التطبيقات واجهات برمجة التطبيقات API هي صلة الوصل بين تطبيقات الواجهة الأمامية وبين النظم والوجهات الخلفية وبالرغم من أنك لا تحتاج كمطور واجهة أمامية لمعرفة كيفية كتابة واجهات برمجة التطبيقات لكونها مهمة مطور الواجهة الخلفية لكنك تحتاج لمعرفة طريقة الاتصال بهذه الواجهات وجلب البيانات منها وعرضها بشكل مناسب ومعرفة التقنيات المرتبطة بها مثل RESTful ومفهوم JSON. باختصار، يجري التواصل بين الواجهة الأمامية والواجهة الخلفية عبر واجهة برمجة التطبيقات وعادة ما ترسل البيانات من الواجهة الخلفية إلى الواجهة الأمامية بصيغة JSON لذا من الضروري معرفة هذه الصيغة، ويمكنك الرجوع إلى مقال تعلم JSON. تعلم Node.js وأنظمة إدارة الحزم يحتاج مطور الواجهة الأمامية إلى تعلم أحد أدوات إدارة الحزم Package Manager التي تجعل عملية تطوير الواجهة الأمامية أسرع وأسهل، فأدوات إدارة الحزم هي برمجيات تسمح لك بتثبيت الحزم المطلوبة للتطوير وإعدادها وتحديثها وإدارة تبعياتها وضمان عدم تعارضها بشكل تلقائي بدلًا من القيام بذلك بشكل يدوي ومن أشهرها npm و Yarn. وعادة يستعمل مطور الواجهات الأمامية مكتبة Node.js التي تأتي مع نظام إدارة الحزم الشهير npm والذي سيستعمله في تنزيل حزم المشروع وإدارتها ومكتبة Node.js هي أول أداة سيثبتها المطور على جهازه فبدونها لن يعمل مع لغة جافاسكريبت على الإطلاق، لذا يجب أن يتعرف عليها وعلى مدير الحزم npm. وقد شرحنا في مقال أساسيات إدارة الحزم في تطوير الويب من طرف العميل كل ما يتعلق باستخدام مدير الحزم وكيفية استخدامه في إدارة مشاريع الواجهة الأمامية. نظام التحكم في الإصدارات git يساعد نظام التحكم في الإصدار وأشهرها Git مطور الواجهة الأمامية على تتبع التغييرات التي يجريها على المواقع ويمكنه من العودة إلى إصدار كود سابق بكل سهولة إذا حدث خطأ ما في الكود كما يفيده في حال العمل على نفس المشروع مع فريق تطوير. تتوفر في أكاديمية حسوب مجموعة غنية ومنوعة من المقالات والدروس حول Git التي تساعدك في تعلم كافة المهارات اللازمة للتعامل مع نظام التحكم بالإصدارات Git. كانت هذه التقنيات جزءًا يسيرًا من التقنيات والأدوات التي على مطور الواجهة الأمامية معرفتها، وفي الفقرة التالية سنوضح المزيد من هذه التقنيات ونضع لك خارطة طريق منظمة تساعدك في تعلم تعلم تطوير الواجهة الأمامية. خارطة طريق تعلم تطوير الواجهة الأمامية إليك خارطة طريق لتعلم مجال تطوير الواجهات الأمامية والذي يعرض بوضوح طريق مطور الواجهات الأمامية بالكامل بدءًا من المرحلة المبتدئة وحتى المتقدمة وأغلب تلك المواضيع تجد عنها في أكاديمية حسوب وموسوعة حسوب: أهم مصادر تعلم تطوير الواجهة الأمامية إذا كنت مبتدئًا ولا تملك أي خبرة مسبقة وتبحث عن أقصر طريقة لتعلم تطوير الواجهة الأمامية أنصحك بالاطلاع على دروة تطوير واجهات المستخدم التي توفرها أكاديمية حسوب فهي دورة شاملة ومنظمة تزيد على 60 ساعة فيديو تدريبية ومن مسارات متعددة تبدأ معك من أساسيات تطوير واجهات المستخدم التي تشرح لك كل المفاهيم واللغات الأساسية وأطر ومكتبات العمل وتنتهي بك ببناء مشاريع عملية متقدمة ترسخ كل هذه الأساسيات وتساعدك في بناء معرض أعمالك. لن تكون وحدك خلال هذه الدورة بل سيكون معك فريق من المدربين لمساعدتك وإجابتك على أي تساؤل أو مشكلة تواجهك في رحلة التعلم، وفي نهاية الدورة ستحصل على شهادة معتمدة من أكاديمية حسوب تعزز سيرتك الذاتية. إضافة إلى ذلك توفر أكاديمية حسوب الكثير من مصادر التعلم المجانية باللغة العربية من دروس ومقالات وسلاسل تعلمية حول تطوير الويب تتعلم من خلالها كافة تقنيات ولغات برمجة الواجهات الأمامية وأطر العمل الشهيرة التي أوردناها في سياق المقال. وإن كنت تفضل الدراسة من الكتب بسبب شموليتها وتسلسلها في الشرح فإن الأكاديمية توفر لك مجموعة من الكتب القيمة التي تهم أي مطور واجهة أمامية من بينها: كتاب فهم أعمق لتقنيات HTML5 كتاب ملاحظات للعاملين في CSS كتاب البرمجة بلغة جافا سكريبت كتاب تصميم تجربة المستخدم سلسلة تطوير الويب وأخيرًا إذا كنت ترغب بمعرفة المزيد من المعلومات حول الواجهات الأمامية وأهم تقنيات برمجتها ومسار تعلمها أنصحك بمشاهدة هذا الفيديو. الخلاصة بهذا تكون وصلت إلى نهاية هذه المقالة الشاملة التي تناولنا فيها كل ما يتعلق بأساسيات تطوير الواجهة الأمامية front-end أو ما يعرف بتطوير واجهة المستخدم وتعرفنا على أهم اللغات وأطر العمل والأدوات التي تحتاجها كمطور واجهة أمامية لتنجز الجزء المرئي من الموقع الذي يتفاعل المستخدمون من خلاله مع التطبيقات والمواقع، كما شرحنا في ختامة أهم خطوات تعلم تطوير الواجهة الأمامية ومصادر تعلمها باللغة العربية. وفي حال كان لديك أي سؤال يتعلق بتطوير الويب وتحديدًا تطوير الواجهات الأمامية للويب فلا تتردد في كتابته في قسم التعليقات أسفل المقال، أو طرحه في قسم الأسئلة والأجوبة في أكاديمية حسوب ليجيبك عليه مبرمجون خبراء. اقرأ أيضًا المدخل الشامل لتعلم تطوير الويب وبرمجة المواقع برمجة مواقع الويب: دليلك المختصر ما الفرق بين تصميم المواقع الإلكترونية وتطوير المواقع الإلكترونية؟ عالم الويب ومعاييره ما هي صفحات الويب؟
    2 نقاط
  8. نعيش اليوم في عصر يتصف بتفجر غير مسبوق في كمية البيانات، فكل الأجهزة التي نتعامل معها في حياتنا اليومية سواء هواتفنا الجوالة أو مواقع التجارة الإلكترونية التي نتسوق منها أو شبكات التواصل الاجتماعي التي نتصفحها بشكل يومي وحتى أجهزة الاستشعار الموجودة في أجهزة إنترنت الأشياء التي باتت منتشرة في كل مكان حولنا…إلخ. كلها تتعقبنا وتسجل بياناتنا والإجراءات التي نقوم بها والخيارات التي نتخذها ولك أن تتخيل كمية البيانات المهولة التي تولد عن كل هذا طوال الوقت! هذه البيانات الضخمة في شكلها الأولي لا تعني أي شيء في الواقع لذا كان لا بد من تحليلها واستخراج المعلومات المفيدة منها وهنا يأتي دور علم البيانات الحديث الذي يعالج كل جزء من البيانات التي يتم إنشاؤها اليوم لتطوير وتيرة الأعمال واتخاذ القرارات الصائبة والموثوقة التي تعتمد على هذه المعلومات. سنركز في مقال اليوم على أحد التخصصات المهمة في هذا العلم وهو تحليل البيانات Data analysis وهو التخصص الذي يهتم باستخلاص معلومات ذات قيمة من هذه البيانات الخام ونوضح أهميته في عالم الأعمال اليوم ونكتشف أهم الأدوات والتقنيات والمهارات التي تحتاجها لتصبح محلل بيانات محترف، كما سنكتشف أهم الفروقات بين علم البيانات وتحليل البيانات وهندسة البيانات ونسرد بعض الأمثلة الواقعية على شركات تستخدم تحليل البيانات لتحسين أعمالها بأسلوب بسيط وسهل الفهم بعيدًا عن المصطلحات المعقدة. ما هو تحليل البيانات Data Analysis؟ علم تحليل البيانات Data analysis هو تنظيف وتحويل ونمذجة البيانات حتى تحويلها أخيرًا إلى معلومات مفيدة تساعد في اتخاذ قرارات أو توضيح رؤى، حيث يهدف إلى تحويل البيانات إلى معلومات والفرق بين البيانات والمعلومات هو أن الأولى عبارة أن أجزاء بيانات متناثرة تفتقد المعنى مثل عدد 25 أو اسم أحمد بينما الأخيرة هي بيانات لها معنى مثل أن العدد 25 هو عمر أحمد فأصبح له معنى، هذا على مستوى عدد فكيف لو كان لدينا آلاف أو ملايين البيانات والأعداد المماثلة، تخيل! يقوم محللو البيانات باستخراج البيانات الأولية وتنظيمها ثم تحليلها وتحويلها من أرقام غير مفهومة إلى معلومات مفسرة وواضحة وبعد الانتهاء من تفسير البيانات تصاغ النتائج التي تم التوصل إليها بشكل اقتراحات أو توصيات حول الخطوات التالية التي يجب اتخاذها في العمل وتتقاطع هذه المهام مع مهام مهندسي البيانات. يمكنك التفكير في مجال تحليل البيانات كشكل من أشكال ذكاء الأعمال أو ما يعرف استخبارات الأعمال Business intelligence واختصارًا BI، وهو علم يستخدم لحل مشاكل وتحديات معينة داخل المؤسسات والشركات، وتكمن أهميته وقوته في العثور على مجموعات وأنماط البيانات التي يمكنها أن تخبرنا بشيء مفيد وملائم حول مشكلة أو أمر معين من العمل يخص العملاء أو الموظفين أو المنتجات أو المخزون …إلخ. ولا يساعد هذا العلم على فهم السلوك الماضي فحسب بل يمكّننا من التنبؤ بالاتجاهات والسلوكيات المستقبلية وبهذا تكون أي قرارات تتخذ مدروسة بناءً على ما تخبرنا به البيانات وليست مجرد قرارات تعتمد على التخمين والحدس. الفرق بين علم البيانات Data Science وتحليل البيانات Data Analysis لا بد أن نعرف قبل الغوص في الفرق بين علم البيانات وتحليل البيانات أنّ كلا العلمين يتعامل مع البيانات الضخمة لكن لكل منهما نهجه الخاص. وعمومًا يشكل علم البيانات مظلة تضم تحتها علم تحليل البيانات وتستفيد من إمكاناته لكنه يغطي مجالًا أوسع في التعامل مع البيانات. يركز علم البيانات على إيجاد ترابط منطقي بين كم هائل من البيانات، بينما يركز تحليل البيانات على إيجاد ميزات الرؤى المستخلصة من تلك البيانات. بكلمات أخرى: علم البيانات هو فرع من علم البيانات يُعنى بالإجابة عن أسئلة محددة يطرحها علم البيانات وكيفية إنجاز أو تطبيق هذه الإجابات. يقتضي الفرق بين علم البيانات وتحليلها اختلافًا في الطرق المستخدمة في العمل، إذ يستخدم عالم البيانات الرياضيات والإحصاء وخوارزميات الذكاء الاصطناعي وتعلم الآلة لتصحيح وتنظيف ومعالجة وتفسير البيانات الخام لاستخلاص الرؤى منها وإنجاز نماذج أولية توضح الترابط بين البيانات المدروسة. أما محلل البيانات فهو من يتفحص مجموعات البيانات ليجد مدلولها ويخلص بنتائج ملموسة، إذ يجمع محلل البيانات كميات كبيرة من البيانات المهيكلة ثم ينظمها ويحللها ليتعرف على الأنماط التي يبحث عنها، ثم يحاول بعد ذلك تصوير هذه الأنماط بعرضها على شكل مخططات ورسومات وغير ذلك من الأشكال التي تسهل الفهم والتفاعل مع النتائج. باختصار ينقّب علم البيانات في البيانات الخام بحثًا عن رؤى وأفكار منها، بينما يُستخدم تحليل البيانات في نقل هذه الرؤى والأفكار التي قد تبدو معقدة إلى لغة أبسط يفهمها التقنيون وغير التقنيين في المؤسسة التي طلبت الدراسة ويطورون أنظمة لأتمتة وتحسين الأداء العام للعمل مع البيانات. وقد أفردنا لعلم البيانات مقالًا مفصلًا بعنوان علم البيانات Data science: الدليل الشامل يمكنك الرجوع إليه للاستزادة حول تخصص علم البيانات. أهمية تحليل البيانات في شركات الأعمال تبرز أهمية تحليل البيانات في المقام الأول بسبب الكمية الضخمة من البيانات التي تجمع في مختلف المنظمات ومؤسسات العمل فعلى سبيل المثال تقوم شركات البيع بالتجزئة اليوم بجمع وتخزين كميات هائلة من البيانات وتتعقب أي منتجات أو خدمات قمت بتصفحها وشرائها وتسجل كافة الصفحات التي قمت بزيارتها على مواقعها الإلكترونية وتتعقب القنوات التي اشتريت منها وتتعرف على عاداتك في الإنفاق وتجمع كل شاردة وواردة عنك! هذه البيانات التي تجمع بكميات مهولة هي واحدة من أهم أصول الشركات التجارية وأكثرها استراتيجية في عالم الأعمال لكن هل تساءلت لماذا تتنافس الشركات فيما بينها لجمع كل هذه المعلومات؟ لأن التنقيب في هذه البيانات وتحليلها وفهمها يساعدها على استخراج كنوز منها وهذه الكنوز هي معلومات قيمة تساعد أصحاب العمل على اتخاذ أفضل القرارات وتطوير الأداء بشكل مضمون. فالحصول على البيانات وجمعها لا يكفي وحده وهو ليس الغاية في الواقع فماذا يفعل صاحب العمل بكميات مهولة من البيانات المختلفة في بنيتها والتي قد تكون في كثير من الأحيان مكررة أو ربما ناقصة أو غير دقيقة، صاحب العمل يريد في النهاية الخلاصة أو بكلام آخر يريد القصة التي ترويها هذه البيانات والمستنتجة من كل هذا الزخم كي يبني عليها قرارًا صائبًا بشأن الميزانية أو الأسعار أو الموارد وفي نهاية المطاف يسعى في المقام الأول لزيادة أرباحه النهائية وهنا يبرز دور علم البيانات وتحليل البيانات. فشركات البيع على سبيل المثال قادرة الاستفادة من تحليل هذه البيانات في معرفة العادات الشرائية لعملائها وتوصيتهم بأنسب المشتريات وتحديد التحسينات الأنسب في أسعارها وتتبع مخزونها وكشف عمليات الاحتيال ومقارنة مستوى المبيعات وغير ذلك الكثير. وكي تتمكن الشركات من ذلك يجب أن تتمكن من صياغة البيانات وتمثيلها بشكل تقارير مناسبة توضح لصناع القرار في مجال الأعمال المغزى منها وتمكنهم على فهم دلالاتها واتخاذ إجراءات موثوقة وسريعة بالاعتماد عليها وإحداث تغيير إيجابي داخل الشركات لذا تلجأ إلى تحليل البيانات الذي يفسر لأصحاب العمل كل ما تحاول البيانات إخبارهم به. مهام محلل البيانات يلعب محلل البيانات دورًا حيويًا ومهمًا في الشركات والمنظمات ويساعدها على فهم البيانات الضخمة المتوفرة لديها ويتعاون مع باقي أعضاء فريق البيانات للمساعدة في استخراج عن أي معلومات مفيدة وقيمة. كما يقوم محلل البيانات بجمع وتحليل البيانات لحل مشكلة معينة ويكون مسؤولًا عن تحويل البيانات الأولية إلى رؤى ذات مغزى ويستخدم البيانات والأفكار التي توفرها عملية تحليل البيانات لحل مشاكل محددة أو الإجابة على أسئلة محددة. وإليك قائمة بأهم المهام التي يقوم بها محلل البيانات: جمع البيانات الأولية معالجة البيانات ضمان أمن وخصوصية البيانات نمذجة البيانات فهم وتفسير البيانات عرض البيانات نستعرض في الفقرات التالية المزيد من التفاصيل حول كل مهمة من هذه المهام. 1. جمع البيانات الأولية الخطوة الأولى هي جمع البيانات الخام ويمكن أن يقوم محلل البيانات بهذه المهمة ويجمع المعلومات المطلوبة فالبيانات التي سيحللها قد تكون موجودة في مصادر مختلفة، فهي إما أن تكون موجودة في قواعد بيانات الشركة مبعثرة هنا وقد يحتاج لجمعها من خلال إجراء استطلاعات الرأي أو من خلال تتبع بيانات زوار موقع الشركة على الويب، أو من خلال الاستعانة ببيانات الشركات المنافسة حيث يمكن للشركات تبادل البيانات فيما بينها لتحقيق مصالح مشتركة. 2. معالجة البيانات بعد جمع البيانات يجب على محلل البيانات البدء بتنظيف وإعداد هذه البيانات الأولية لأنها في الغالب تحتوي على نسخ مكررة أو قيم خاطئة أو غير دقيقة أو مفقودة للحصول على بيانات سليمة وموثوقة ومفهومة وذات جودة عالية وقد يحتاج إلى تحويل البيانات من هيكل إلى آخر أو من نوع إلى آخر حتى يصبح من الممكن التعامل معها بإحدى لغات البرمجة أو تخزينها في قواعد البيانات كي تكون تفسيرات هذه البيانات دقيقة فإذا لم تكن البيانات التي نبني نحللها نظيفة وصحيحة لن تكون التحليلات والنتائج التي تحصل عليها دقيقة. أحيانًا وفي الشركات أو المشاريع المتوسطة إلى الكبيرة يتولى هذه المهمة مهندس البيانات الذي يركز على هذه المهمة نظرًا لكبر المشروع أو ضخامة البيانات بينما يركز محلل البيانات على عملية التحليل بعيدًا عن عملية الجمع والمعالجة والتجهيز الذي يكون دوره تاليًا. 3. ضمان أمن وخصوصية البيانات قد يحتاج محلل البيانات لإخفاء هوية البيانات الحساسة والشخصية أو حذفها بالكامل لمنع الآخرين من الاطلاع عليها عندما لا تكون هناك حاجة لها للحصول على النتيجة التي يريدها، وأيضًا قد يتولى مهندس البيانات هذه المهمة وتأتي البيانات مشفرة ومحمية إلى محلل البيانات ليقوم بالخطوات التالية. 4. نمذجة البيانات الخطوة التالية هي تحليل وتحديد نقاط البيانات المختلفة التي تم جمعها وإنشاءها بواسطة محللي البيانات واختيار أنواع البيانات المراد تخزينها وجمعها وإنشاء علاقات بينها وتحديد كيفية ترابط مجموعات البيانات مع بعضها البعض وكيفية عرض هذه البيانات وتساعد النمذجة الصحيحة للبيانات على تسريع وتيرة فهمها وإعداد التقارير الخاصة بها. 5. فهم وتفسير البيانات بعد نمذجة البيانات تأتي الخطوة التالية وهي تفسير هذه البيانات من خلال تحديد الأنماط أو الاتجاهات في البيانات التي يمكنها أن توفر معلومات مفيدة تُستخلص منها إجابات على أسئلة توضح سلوكيات أو تفسر أسباب لمشكلات تخص العمل كما تُبنى عليها قرارات وغيرها. 6. عرض البيانات الخطوة الأخيرة والضرورية التي يتوجب على محلل البيانات القيام بها هي عرض وتقديم البيانات بشكل يضفي عليها الحيوية فالمعلومات التي حصلت عليها يجب أن تصاغ على هيئة مخططات ورسوم بيانية وتقارير مكتوبة بألوان متناسقة وخطوط مفهومة ثم تقدم لأصحاب العمل المهتمين لمساعدتهم على فهم ما تعنيه هذه البيانات وتمكينهم من اتخاذ قرارات دقيقة وحيوية بشأنها. هل تحتاج إلى تطوير أعمال شركتك وتحسين فرصها؟ وظّف محلل بيانات محترف من مستقل لتحليل بياناتك وتقديم رؤى استراتيجية تعزز أداء نشاطك التجاري أضف مشروعك الآن مجالات تحليل البيانات نظرًا للتطور التقني الحاصل في عصرنا الراهن فقد أصبح جمع البيانات وفرزها وتحليلها أمرًا ضروريًا لأي مجال من مجالات الحياة وبات من الضروري توظيف محللي البيانات في كافة قطاعات العمل، وفيما يلي نستعرض بعض المجالات والتخصصات التي يمكن لمحللي البيانات العمل فيها. محلل الأعمال محلل الأعمال هو المسؤول عن تحليل ومعالجة البيانات التي تساعد الشركات والمؤسسات على تفسير وتوثيق العمليات التجارية والمنتجات والخدمات والبرامج ويتمثل دوره الأساسي في زيادة كفاءة الأعمال. محلل تسويق محلل التسويق أو محلل أبحاث السوق هو الشخص المسؤول عن جمع وتحليل بيانات المنافسين والعملاء فهو يدرس المنافسين ويبحث عن تفضيلات العملاء وظروف العمل واتجاهات السوق وأي معلومات أخرى تساعد في جهود التسويق للشركة مثل تحديد المبيعات المحتملة لمنتج أو خدمة ما أو تحديد المنتجات التي يفضلها الناس وتقدير تكلفتها وتحديد الفئات التي ستشتريها ويسعى بشكل أساسي لزيادة الإيرادات وتحسين الحملات التسويقية. محلل العمليات محلل العمليات أو محلل أبحاث العمليات هو المسؤول عن تحليل وتقييم البيانات بهدف تحسين العمليات التجارية وحل المشكلات الداخلية وضمان سير عمليات الشركة بسهولة وسلاسة وإنشاء نماذج التسعير والتسويق، فهو من يحدد الحملات التسويقية التي ستجلب عملاء جدد ويجد الطرق الأنسب لخفض التكاليف دون المساس بجودة المنتج أو الخدمة التي تقدمها الشركة. محلل نظم تقنية المعلومات يعرف محلل نظم تقنية المعلومات أيضًا باسم محلل النظم وهو متخصص تقني لديه معرفة واسعة بأنظمة التشغيل والبرامج والأنظمة الأساسية ومهمته الأساسية تحليل وتصميم وتنفيذ نظم المعلومات والعمل على مشاكل العمل باستخدام التقنيات والأدوات التي يحترفها. المحلل المالي المحلل المالي Financial Analyst هو شخص مسؤول عن جمع البيانات وتنظيم المعلومات وتحليل البيانات المالية السابقة للعملاء والشركات بهدف تقديم المشورة الأفضل حول كيفية إنفاق الأموال لتعظيم الأرباح وتقييم نتائج السندات والأسهم والاستثمارات الأخرى. محلل كميات محلل الكميات أو المحلل الكمي quantitative analyst هو شخص متخصص في حل المشكلات المالية وإدارة المخاطر باستخدام الأساليب الرياضية والإحصائية فهو يطور وينفذ نماذج متقدمة تساعد المؤسسات والشركات التي تعمل في مجال الاستثمار وتداول الأوراق المالية مثل شركات التأمين وشركات المحاسبة وشركات البرمجيات المالية على اتخاذ القرارات المناسبة وتحديد فرص الاستثمار والتسعير المناسبة وإدارة المخاطر. محلل ذكاء الأعمال محلل ذكاء الأعمال business intelligence يحلل تقارير أبحاث السوق التي تسلط الضوء على أنماط السوق والاتجاهات التي قد يكون لها تأثير على عمليات الشركة وأهدافها المستقبلية ويعرض النتائج على الجمهور المناسب. محلل استراتيجي محلل استراتيجيات الشركة هو المختص في حل مشاكل العمل فهو يعتمد على تحليل البيانات التي تمكنه من توفير نتائج مفيدة تساعد الشركات على اتخاذ قرارات أفضل ومعالجة التحديات التي تواجهها وتحديد فرص النمو الجديدة للشركة وتطوير الخطط التي تحدد أفضل الطرق والاستراتيجيات لتحقيق الأهداف. محلل طبي يهتم المحلل الطبي أو محلل الرعاية الصحية بجمع وتنظيم وتحليل وتفسير البيانات الطبية مثل بيانات المرضى والعلاجات والمنتجات الطبية لتحسين العمليات التجارية للمستشفيات والمرافق الطبية وتطوير أدائها. محلل الأمني فحص المحلل الأمني البيانات لفحص أي تهديدات محتملة وتحديد ما إذا كان هناك هجوم قد وقع أو على وشك الوقوع. قد يستخدمون أيضًا معرفتهم الإحصائية والرياضية لتطوير طرق جديدة لجمع البيانات حول تهديدات محددة أو هجمات محتملة. مدير تحليل البيانات يوجه مدير تحليل البيانات فريق محللي البيانات في مقر العمل وينسق العمل بينهم ويشرف على عمليات تحويل البيانات الأولية إلى رؤى تجارية يمكن استخدامها لاتخاذ القرارات ويساعد في التوصية بحلول لإنجاز العمل والبحث عن طرق فعالة لجمع البيانات وإنشاء وتطوير النماذج الإحصائية المعقدة واستخدام الخوارزميات والاستراتيجيات الفعالة لتحليل البيانات. مسؤول قاعدة البيانات يراقب مسؤول قاعدة البيانات قاعدة البيانات ويهتم بسلامة بياناتها وسلامة الأجهزة التي توجد عليها وهو يشارك في معالجة البيانات وتحويلها والتحقق من صحتها وتنظيفها لتلبية احتياجات العمل والمتطلبات كما يهتم بأمن هذه البيانات ومنح الوصول لها واستخدامها وفق احتياجات ومتطلبات العمل فقط وتقييد وصول المستخدمين غير المصرح بهم إليها. ارتقِ بأعمالك وابدأ التحول الرقمي انقل نشاطك التجاري إلى الإنترنت وطور أنظمة رقمية شاملة لتنمية أعمالك مع خدمات الخبراء على خمسات ابدأ التحول الرقمي الآن أنواع تحليل البيانات يقسم تحليل البيانات إلى خمس مكونات أو أنواع وهي كالتالي: التحليل الوصفي Descriptive التحليل التشخيصي Diagnostic التحليل التنبؤي Predictive التحليل التقديري Prescriptive التحليل الإدراكي أو المعرفي Cognitive وكلما كان محلل البيانات أكثر خبرة كلما كان قادرًا على تحديد النوع الصحيح من التحليلات بما يتناسب واحتياجات العمل كي يضمن تحقيق أقصى استفادة من البيانات التي تمتلكها المؤسسة وبالتالي تحقيق أفضل النتائج من هذا التحليل. دعنا نتعرف بالتفصيل على طريقة إجراء كل نوع من هذه التحليلات وأهميتها في مكان العمل. 1. التحليل الوصفي Descriptive Analytic التحليل الوصفي هو نوع التحليل الأبسط والأكثر استخدامًا فهو يمكن محلل البيانات من تحليل البيانات المتوفرة باستخدام أدوات تحليل مثل Google Analytics التي تمكنه من فهم ما جرى في مؤسسته أو شركته، فالتحليل الوصفي يوفر لمحلل البيانات الإدراك المتأخر لما يجري في العمل. على سبيل المثال إذا كنت محلل بيانات وحصل انخفاض مفاجئ في مبيعات موقع التجارة الإلكترونية الخاص بشركتك في شهر ما لن تقف مكتوف الأيدي لتنتظر هل ستتحسن المبيعات في الشهر التالي بل عليك استخدام التحليلات الوصفية لتحليل بيانات كافة الأشخاص الذين زاروا الموقع في هذا الشهر لمعرفة سبب ما حدث وهل هو ناتج عن انخفاض في عدد زيارات الموقع أو خطأ في أحد الصفحات أو مرتبط بموسم محدد وتعثر على إجابة لكافة التساؤلات حياله ووصف النتائج التي حصلت عليها لأصحاب العمل. يمكن أن تستعين في إجراء هذه المهمة بأدوات التحليل مثل جوجل أناليتكس Google Analytics وتستسخدم مؤشرات قياس الأداء الرئيسية KPIs التي تمكنك من تتبع الأداء ومعرفة مدى نجاح وفشل الأهداف الرئيسية. فالتحليلات الوصفية باختصار تساعد في معرفة ما حدث في السابق مثل انخفاض المبيعات أو زيادة الإيرادات أو نقص الموارد وتلخص مجموعات البيانات الكبيرة وتصف النتائج التي تم التوصل لها لأصحاب العمل وتستفيد منها في معرفة أسباب النجاح أو الفشل السابق وإنشاء تقارير بها. هذا النوع من التحليل على أهميته يعطي المحلل نظرة ثاقبة فقط حول ما إذا كان كل شيء في العمل يسير على ما يرام أم لا، لكنه في الواقع لا يفسر السبب الجذري لوقوعها لذا تعمد الشركات عادة على الدمج بين هذا النوع من التحليل وأنواع التحليلات الأخرى للحصول على رؤية أفضل. 2. التحليل التشخيصي Predictive Analytic التحليلات التشخيصية هي الشكل الثاني لتحليل البيانات وهي تساعد أصحاب الأعمال في الإجابة عن السبب الأساسي في وقوع حدث ما أو العوامل التي تؤثر على سير العمل، فعندما يعرف محلل البيانات ما يحدث بالفعل في عمله باستخدام التحليلات الوصفية لكنه يريد أن يعرف الأسباب والعوامل التي تسببت بحدوثها بشكل جذري يأتي دور التحليل التشخيصي للإجابة عن أسئلة حول سبب وقوع الأحداث. على سبيل المثال كي يشخص محلل الأعمال إن كانت زيادة الأسعار الأخيرة على أسعار منتجات الشركة لها علاقة بانخفاض المبيعات يمكنه استخدام التحليل التشخيصي باستخدام برنامج إحصائي مثل Microsoft Excel أو يستخدم خوارزمية معينة تمكنه من تحليل بيانات المنتجات والعملاء وفحصها ومقارنتها للعثور على الإجابة الدقيقة. هناك العديد من المفاهيم الإحصائية التي يجب على محلل البيانات فهمها قبل أن يتمكن من إجراء التحليلات التشخيصية وأهمها اختبار الفرضيات والفرق بين الارتباط والسببية وتحليل الانحدار التشخيصي. تكمل تقنيات التحليلات التشخيصية التحليلات الوصفية الأساسية حيث يساعد دمج التحليلات التشخيصية والوصفية الشركات في العثور على العلاقات بين الأسباب والنتائج وفحص مؤشرات الأداء لاكتشاف سبب التحسن أو التراجع بدقة. بشكل عام تحدث هذه العملية في ثلاث خطوات: تحديد الشذوذ في البيانات فقد تكون هذه الحالات الشاذة تغييرات غير متوقعة فيمقياس أو سوق معين. جمع البيانات المتعلقة بهذه الحالات الشاذة. استخدم التقنيات الإحصائية لاكتشاف العلاقات والاتجاهات التي تشرح هذه الحالات الشاذة. 3. التحليل التنبؤي Predictive Analytic يساعد التنبؤ بالمستقبل أصحاب الأعمال على توقع اتجاهات السوق وسلوكيات العملاء وكشف حالات الاحتيال قبل وقوعها وتحليل المنافسين لتحسين وبناء استراتيجيات حديثة لتحسين نتائج الأعمال. يعتمد التحليل التنبؤي على النتائج التي تم الحصول عليها من التحليل الوصفي والتشخيصي ويستخدم للعثور على إجابات حول الأمور التي من المحتمل أن تحدث في المستقبل بناءً على النتائج والأنماط السابقة. على سبيل المثال يمكن استخدام التحليل التنبؤي في الشركات والبنوك لتحليل التركيبة السكانية للعملاء وسجلات الدفع السابقة والمنتجات التي اشتروها وأي سلوكيات سلبية حديثة وقعت من قبلهم لتوقع العملاء الذين سيتأخرون في دفع المستحقات والفواتير المترتبة عليهم ولن يسددوها في الوقت المحدد مما يمكنهم من إدارة التدفقات المالية بشكل أفضل واتخاذ خطوات للتخفيف من حدوث هذه المشكلة مثل تقديم خيارات دفع أخرى أو إرسال رسائل تذكير إلى العملاء الذين تم التنبؤ بأنهم سيتأخرون في تسديد المستحقات وتحديد أفضل تاريخ ووقت لإرسال هذه الرسائل وأفضل طريقة للاتصال بهم مثل البريد إلكتروني أو المكالمة الهاتفية أو الرسائل النصية …إلخ. كما تستخدم النماذج التنبؤية بشكل كبير في مجال الرعاية الصحية وتحلل مجموعة من البيانات المتغيرة حول المرضى مثل العمر أو العلاجات السابقة أو تاريخ المرض ومعدل الكوليسترول والوزن للتنبؤ بما إذا كان الشخص عرضة للإصابة بأمراض معينة كالسكري أو النوبات القلبية أم هشاشة العظام أم لا. يعتمد إجراء التحليل التنبؤي على الخوارزميات الإحصائية المتنوعة وعلى تقنيات التعلم الإحصائي وخوارزميات التعلم الآلي مثل الشبكات العصبية وأشجار القرار والانحدار …إلخ. التي تساعد محلل البيانات على تقديم توصيات وتوفير إجابات للأسئلة المتعلقة بما قد يحدث في المستقبل ولكونها تحليلات تعتمد على التخمينات والاحتمالات فهي تعطي نتائج تقديرية قد لا تكون صحيحة ودقيقة بنسبة مئة بالمئة. 4. التحليل التقديري Prescriptive Analytic التحليل التقديري هو الخطوة التالية التي تأتي بعد إجراء التحليل التنبؤي وهو يساعد الشركات على امتلاك رؤية ثاقبة عما يجب عليهم القيام به لحل مشاكل العمل بناءً على العوامل المشتقة من البيانات. فأثناء تحليل البيانات الضخمة لا تكون التنبؤات التي حصلنا عليها من المدخلات دقيقة كما ذكرنا وبالتالي لا يمكننا التيقن من السبب الحقيقي في حدوث مشكلات معينة وهنا يأتي دور التحليلات التقديرية. فعندما يحصل محلل البيانات على النتائج من التحليلات الوصفية والتشخيصية والتنبؤية ويعرف ما حدث ولماذا حدث ويتوقع ما قد يحدث في المستقبل يمكنه أن يستخدم التحليل التقديري لمساعدته في تحديد أفضل مسار للعمل وما الإجراءات التي يجب الإبقاء عليها وما الإجراءات التي يجب التخلي عنها لزيادة نتائج ومخرجات الأعمال. تعتمد تقنيات التحليلات التقديرية على تعلم الآلة لكونها قادرة على تحليل كميات كبيرة من البيانات بسرعة وكفاءة أكبر واختبار مجموعة كبيرة من الشروط والعثور على أنماط محددة في مجموعات البيانات الكبيرة وتقديم التوصيات بناء عليها. على سبيل المثال تستخدم خرائط جوجل التحليل التقديري لمساعدتك على اختيار وتقدير أفضل طريق عليك اتباعه للوصول لوجهتك من خلال الاعتماد على جميع البيانات ذات الصلة مثل المسافة والسرعة وحركة المرور إضافة للمعلومات السابقة المسجلة عن الأشخاص الذي سلكوا هذه الوجهة من قبل. ومن الأمثلة الأخرى على هذا النوع من التحليل توقع توصيات المحتوى المناسب لك على منصات التواصل الاجتماعي من خلال تحليل سجلات سلوكك والمحتوى الذي تشاهده وتتفاعل معه سواء على هذه المنصات نفسها أو على أنظمة أخرى وتمرير سلوكياتك السابقة لخوارزمية محددة تحلل هذه البيانات وتقدر بناء على ذلك نوع المحتوى الذي تهتم به وتقترحه لك. 5. التحليل المعرفي Cognitive Analytic هذا النوع من التحليل هو الأكثر تقدمًا ولا زال في بداياته وهو مستوحى من الطريقة التي يعالج فيها دماغنا البشري البيانات أي أنه يحلل البيانات بذكاء يشبه ذكاء الإنسان فهو يستخلص النتائج ويكتسب الخبرة من التعلم ويطور نفسه مع الزمن، ويساعدك على معرفة ما قد يحدث إذا تغيرت الظروف وتحديد أفضل الطرق للتعامل معها وهو أمر لا تستطيع التحليلات البسيطة القيام به. يعتمد هذا النوع من التحليل مجموعة من التقنيات الذكية مثل الذكاء الاصطناعي وخوارزميات التعلم الآلي ونماذج التعلم العميق والمزيد لمعالجة المعلومات واستخلاص النتائج من البيانات والأنماط الموجودة ويتوقع أن تصبح تطبيقاته واستخداماته أكثر فعالية بمرور الوقت من خلال تعلمه وتفاعلاته المستمرة مع البيانات ومع البشر. وباستخدام هذا النوع من التحليل ستتمكن من معالجة اللغة الطبيعية مباشرة مثل سجلات محادثة مركز الاتصال ومراجعات المنتجات فهو لا يفهم الكلمات في هذه النصوص فقط بل يفهم السياق الكامل لما يتم كتابته أو نطقه! على سبيل المثال تعد كل من Cortana من مايكروسوفت، و Siri من أبل، و Watson من IBM وآخرها ChatGPT من OpenAI روبوتات محادثة تستخدم التحليل المعرفي لتتفاعل معك بلغتك الطبيعية وتوفر لك المعلومات والرؤى التي تريدها. يمكن أن تستفيد الشركات من هذا التحليل للنظر في أنماط المشتريات من السنوات السابقة وتحديد المنتجات التي قد تكون شائعة العام المقبل وفهم سبب شعبية ورواج منتج معين وما إذا كانت شعبيته ستبقى في السنوات المقبلة مما يساعدها على تحديد فيما إذا كانت ستواصل تخزين كميات كبيرة من هذا المنتج الرائج أم لا كما يمكن للمؤسسات الطبية استخدام التحليل المعرفي لإعطاء أفضل العلاجات الممكنة للمرضى. هذه كانت نبذة عن أهم أنواع التحليلات التي يمكنك الاعتماد كمحلل بيانات عليها واختيار الأنسب من بينها لتعزيز مسار العمل والحصول على أي إجابات يحتاج صاحب العمل لمعرفتها لتعزيز تواجده في السوق أو زيادة أرباحه أو التخلص من مشاكل العمل الحالية أو المستقبلية …إلخ. دعنا نلخص هذه التحليلات كما يلي: إجراء التحليلات الوصفية لإدراك ما حدث بعد وقوعه. إجراء التحليلات التشخيصية إذا طلب منك معرفة لماذا حدث هذا الأمر. إجراء التحليلات التنبؤية إذا طلب منك أن تكون بعيد نظر وتعرف ماذا يمكن أن يحدث في المستقبل. إجراء التحليلات التقديرية لتكسب أصحاب العمل بصيرة ثاقبة يعرفون من خلالها ما الذي يجب عليهم فعله بعد ذلك؟ إجراء التحليلات المعرفية للحصول على رؤية صحيحة وصائبة لما يجب أن يتم. أهم أدوات وتقنيات تحليل البيانات في السابق كان تحليل البيانات أمرًا صعبًا ومرهقًا بسبب عدم توفر التقنيات المساعدة فكانت البيانات تجمع يدويًا بطريقة مرهقة، لكن يمكن اليوم لمحلل البيانات الاستعانة بالكثير من أدوات تحليل وتمثيل البيانات المتوفرة لمساعدته على أداء عمله بسرعة وسهولة وفيما يلي نذكر أهم 10 أدوات في تحليل البيانات: برنامج مايكروسوفت إكسل Microsoft Excel برنامج Microsoft Power BI برنامج التحليل الإحصائي SAS إطار عمل أباتشي سبارك Apache Spark لغة بايثون Python لغة البرمجة R لغة الاستعلام الهيكلية SQL تطبيق Jupyter Notebook منصة KNIME برنامج Tableau دعنا نشرح كل أداة من هذه الأدوات وكيف يمكن لمحلل البيانات الاستفادة منه في عمله. برنامج مايكروسوفت إكسل Microsoft Excel يمكننا برنامج جدولة البيانات مايكروسوفت إكسل من إجراء الحسابات على البيانات وفرزها وتجميعها ومعالجتها والبحث فيها وعرضها بشكل رسوم بيانية وإنشاء النماذج وإعداد التقارير، لكن المشكلة في برنامج إكسل أنه ضعيف في التعامل مع البيانات الضخمة. برنامج Microsoft Power BI مايكروسوفت باور بي آي Microsoft Power BI هو برنامج احترافي لتحليل بيانات الأعمال وهو برنامج تجاري مدفوع لكنه يوفر نسخة مجانية بمواصفات محدودة وقد بدأ كمكوِّن إضافي لبرنامج Excel ثم أعيد تطويره عام 2010 وصدر كبرنامج مستقل. يوفر هذا البرنامج مجموعة أدوات متكاملة لتحليل بيانات الأعمال وهو برنامج احترافي يسمح للمستخدمين بإنشاء تقارير مرئية تفاعلية ولوحات معلومات وهو يتكامل مع برنامج إكسل و SQL Server وخدمات جوجل السحابية ويوفر العديد من الميزات الأخرى المفيدة لمحللي البيانات. برنامج SAS برنامج SAS هو أداة تحليل إحصائي تستخدم لتحليل معلومات وبيانات المؤسسات التجارية الكبيرة تم تطويره لتحديد سمات العملاء وإعداد التقارير واستخراج البيانات وإجراء التحليلات التنبؤية ويملك وحدات برمجية لاستخدامات متقدمة مثل مكافحة غسيل الأموال وتحليل لإنترنت الأشياء لكنه منتج مدفوع وسعره مرتفع نوعًا ما. أباتشي سبارك Apache Spark أباتشي سبارك هو إطار عمل برمجي سريع وديناميكي وسهل الاستخدام لمعالجة البيانات وهو يحتوي مكتبة غنية لخوارزميات التعلم الآلي ويستخدم عادة من قبل محللي البيانات وعلماء البيانات لمعالجة البيانات الضخمة وغير المهيكلة وإجراء مهام التحليل الثقيلة حسابيًا من خلال توزيعها على عدة حواسيب. دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن لغة البرمجة بايثون Python توفر لغة البرمجة بايثون لمحلل البيانات آلاف المكتبات المجانية التي تساعده على استخراج البيانات وتحليلها وإعداد التقارير عنها مثل مكتبات NumPy و pandas التي تبسط إجراء العمليات الحسابية ومكتبات Beautiful Soup و Scrapy لاستخراج البيانات من الويب ومكتبة Matplotlib لتمثيل البيانات رسوميًا وإعداد التقارير حولها. لغة البرمجة R لغة R هي لغة برمجة مفتوحة المصدر تستخدم في التحليل الإحصائي واستخراج البيانات وتوفر الكثير من الحزم المساعدة لمحللي البيانات بشكل مشابه لبايثون، ورغم أن كتابة التعليمات في لغة R أكثر تعقيدًا من لغة بايثون إلا أنها لغة مصممة خصيصًا للتعامل مع المهام الإحصائية وتمثيل البيانات المتقدم. لغة الاستعلام الهيكلية SQL تعد لغة SQL أحد التقنيات الأساسية لتحليل البيانات وإعداد التقارير وهي لغة شائعة وسهلة التعلم ومرنة بشكل كبير ما يجعلها اللغة المفضلة لمحللي البيانات لفلترة البيانات والاستعلام عنها وإعداد التقارير …إلخ. Jupyter Notebook تطبيق Jupyter Notebook هو تطبيق ويب مفتوح المصدر يسمح لمحللي البيانات بإنشاء مستندات تفاعلية تتضمن نصوص وأكواد ومعادلات رياضية ورسوم بيانية تشبه إلى حد ما مستندات وورد لكنها أكثر تفاعلية ومصممة خصيصًا لتحليل البيانات وهو متكامل مع أدوات تحليل البيانات الضخمة مثل Apache Spark. برنامج KNIME KNIME هي منصة مفتوحة المصدر وقائمة على السحابة تملك واجهة رسومية GUI سهلة الاستخدام تستخدم في مهام تحليل البيانات والتنقيب عن البيانات والتعلم الآلي تم تطويرها عام 2004 لصناعة المستحضرات الصيدلانية إلا أن قوتها في تجميع البيانات من العديد من المصادر في نظام واحد دفعت محللي البيانات إلى استخدامها في العديد من المجالات مثل تحليل العملاء وذكاء الأعمال والتعلم الآلي. وهي شائعة لدى الشركات الصغيرة ذات الميزانيات المحدودة. برنامج Tableau برنامج Tableau هو برنامج تجاري عملاق لتحليل البيانات وذكاء الأعمال يمكنه التعامل مع كميات كبيرة من البيانات ومعالجتها وإنشاء حسابات معقدة عليها، ويوفر استعلامات SQL لفلترة البيانات ويمكنك من كتابة استعلاماتك الخاصة وهو سهل الاستخدام ويملك واجهة رسومية GUI تعتمد تقنية السحب والإفلات. كانت هذه قائمة بأشهر أدوات والتقنيات المستخدمة. وتذكّر لا توجد أداة واحدة تفعل كل شيء! عليك كمحلل استخدام الأدوات التي تلبي حاجة عملك بأفضل صورة. مصادر تعلم تحليل البيانات ستجد في أكاديمية حسوب العديد من الدروس والمقالات التي تفيدك في تخصص تحليل البيانات ومن أبرز هذه المصادر دروس تعلم برنامج اكسل المشروحة بطريقة منظمة ومبسطة تساعدك على تعلمه بسرعة وسهولة. وإذا كنت مهتمًا بتعلم لغة بايثون التي تعد من أهم لغات البرمجة المستخدمة في تحليل البيانات فقد وفرت لك أكاديمية حسوب قسم دروس ومقالات متنوعة حول لغة بايثون وهي تُحدَّث باستمرار لذا كن على اطلاع دائم عليها لتتعلم كل جديد وإن كنت تفضل التعلم من الكتب المنهجية يمكنك تنزيل كتاب البرمجة بلغة باثيون من أكاديمية حسوب وللمزيد من المصادر أنصحك بزيارة موسوعة حسوب الشاملة التي تضم توثيقات الكثير من لغات البرمجة، بما في ذلك توثيق لغة بايثون. ومن المصادر المميزة التي تسهل عليك طريق الاحتراف دورة تطوير التطبيقات باستخدام لغة Python التي توفرها أكاديمية حسوب والتي تفرد فيهًا مسارًا كاملًا يشرح بشكل واضح ومبسط أساسيات تحليل البيانات ويعرفك على أهم أدوات ومكتبات بايثون وآليات تطبيقها لإجراء عمليات التحليل الإحصائي والوصفي والتصوير البياني وتنظيف وفهم البيانات وغيرها ذلك الكثير من المعلومات التي تؤهلك لبدء العمل كمحلل بيانات في أي شركة أو منظمة أيًا كان مجال عملها. كما توفر دورة الذكاء الاصطناعي التي تساعدك في احتراف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة وتطوير تطبيقات ذكية تقوم بتحليل البيانات Data Analysis وتمثيلها مرئيًا، وتطبيقات تعلم الآلة Machine Learning والتعلم العميق Deep Learning وغيرها من التطبيقات المنوعة التي تساعدك على احتراف هذا المجال. وأنصحك كذلك بتعلم البرمجة بلغة R التحليلية باللغة العربية وأسلوب منهجي ومنظم وبشرح مبسط من خلال الاطلاع على مجموعة المقالات والدروس حول لغة R التي توفرها أكاديمية حسوب. وتوفر لك أكاديمية حسوب سلسلة دروس ومقالات عن لغة SQL،كما توفر كتابًا تعليميًا متكاملاً بعنوان ملاحظات للعاملين بلغة SQL 1.0.0 يتضمن مجموعة من الملاحظات والأمثلة العملية عن مختلف مواضيع لغة SQL من الأساسيات حتى الاحتراف. الخلاصة تعرفنا في مقال اليوم على مفهوم تحليل البيانات واستكشفنا معًا المهام المختلفة لمحلل البيانات وكيف يتعامل مع جميع البيانات التي يتم إنشاؤها كل يوم والمتاحة في مكان عمله، من بيانات المعاملات في قاعدة بيانات تقليدية وبيانات القياس المختلفة والبيانات التي يتم جمعها من وسائل التواصل الاجتماعي وكيف يستخرج منها المعرفة التي تطور سير العمل وتحسنه للأفضل. هل لديك اهتمام بتحليل البيانات؟ إذا كانت الإجابة نعم فقد حان الوقت لتبدأ من الآن رحلتك في احتراف هذا التخصص الواعد الذي يزدهر الطلب عليه بشكل كبير في سوق العمل.
    2 نقاط
  9. إنَّ التطبيق العملي أمر ضروري لإتقان أي مجال تقني ولا سيما مجال الذكاء الاصطناعي، فإذا كنت مهتمًا بالعمل في هذا التخصص وبدأت تعلمه بالفعل لكنك لاتزال مبتدئًا ولا تعرف ماهي مشاريع الذكاء الاصطناعي التي يمكنك تنفيذها لتطبيق معلوماتك النظرية وتوظيفها في مشاريع عملية تحسن خبراتك وتعزز معرض أعمالك فهذا المقال لك، إذ نقترح لك فيه مجموعة من المشاريع العملية متفاوتة الصعوبة في مجالات الذكاء الاصطناعي المختلفة لتساعدك على تحسين مستواك وصقل مهاراتك. مشاريع ذكاء اصطناعي في مجال تعلم الآلة يعد تعلم الآلة Machine Learning (ML) من أهم المجالات الفرعية لتخصص الذكاء الاصطناعي Artificial Intelligence (AI) فهو مجالٌ يسمح للأجهزة الحاسوبية بالتعلم من البيانات وحل المشكلات واتخاذ القرارات دون الحاجة إلى البرمجة الصريحة لكل جزء من أجزاء المشروع، ويهتم مهندسو تعلم الآلة بتطوير خوارزميات حاسوبية تتطور ذاتيًا باستخدام البيانات. لمجال تعلم الآلة استخدامات وتطبيقات عديدة، من بينها أنظمة التوصية المدمجة في منصات عديدة، كالمتاجر الإلكترونية التي تقترح عليك سلعًا تلائمك، ومنصات الفيديو التي تقترح عليك مقاطع جديدة بناءً على تاريخ مشاهداتك، ومواقع التواصل الاجتماعي التي تُظهِرُ لك منشوراتٍ تبعًا لإعجاباتك وتعليقاتك السابقة. ومن أهم مشاريع الذكاء الاصطناعي المقترحة لمهندسي تعلم الآلة: مشروع تصنيف صور بالذكاء الاصطناعي. مشروع توقع أسعار العقارات بالذكاء الاصطناعي. مشروع كشف الاحتيال المالي بالذكاء الاصطناعي. لنشرح المزيد عن كل مشروع من هذه المشاريع وآلية تنفيذه. 1. مشروع ذكاء اصطناعي لتصنيف صور مستوى الصعوبة: سهل. يعد نموذج تصنيف الصور باستخدام خوارزميات تعلم الآلة من مشاريع الذكاء الاصطناعي السهلة المناسبة للمبتدئين، إذ تقوم فكرة المشروع على بناء نموذج ذكاء اصطناعي يستطيع التمييز بين صورٍ مختلفة لأنواعٍ متعددةٍ من أشياء محددة، مثل: نموذج يميز بين صور الأنواع المختلفة من الحيوانات، ويكون هذا بمنح النموذج قاعدة بيانات بها عدد كبير من الصور المرتبة لكل نوع من الأنواع التي نريد أن يميز النموذج بينها مع نص يوضح ماهية كل نوع ومواصفاته، كأن نمنح النموذج صورًا لكلابٍ وقططٍ مع التوضيح النَّصي أنَّ هذه كلاب وقطط، ويتدرب النموذج على هذه البيانات محاولًا اكتشاف أنماط وسمات كل نوع، ففي مثالنا يحاول النموذج اكتشاف صفات الكلب والقطة، ثم يكون قادرًا على التعرف عليهما من صور أخرى لم يتدرب عليها قبلًا. نمر خلال عملية تطوير نموذج تصنيف صور على خطوات متعددة، وهي: جمع البيانات: يمكنك جمع الصور التي سيتدرب عليها النموذج بنفسك، كما يمكنك العثور على مجموعة بيانات Dataset جاهزة عبر الإنترنت، مثل مجموعات بيانات CIFAR-10. معالجة البيانات: إذا جمعت البيانات التي سيتدرب النموذج عليها بنفسك فعليك معالجتها وتصنيفها ووضع صور الكلاب تحت تصنيف واحد وتوضح أنَّ هذه صور كلاب، وتضع صور القطط تحت تصنيف واحد وتوضح أنها صور قطط، أمَّا إذا حمَّلت مجموعة بيانات جاهزة من الإنترنت فيمكنك الانتقال للخطوة التالية مباشرةً. بناء النموذج: يشير بناء النموذج إلى عملية إنشاء الشبكة العصبية Neural Network التي ستتدرب على البيانات وتتمكن من تصنيف الصور بعد التدريب، وغالبًا ما تستخدم في هذه المرحلة أطر عمل جاهزة لتسهيل وتسريع عملية التطوير مثل تينسرفلو TensorFlow. تدريب النموذج: تمنح النموذج مجموعة البيانات الجاهزة ليبدأ النموذج في محاولة استكشاف الأنماط بين الصور، ويسعى لفهم سبب وضع كل صورة ضمن تصنيفها، فيبدأ بفحص صور القطط ويحاول فهم السمات المميزة لكل قطة حتى يتمكن من التعرف على صور القطط خارج مجموعة البيانات التي تدرَّب عليها. اختبار النموذج: هنا يحين موعد اختبار مدى نجاح المشروع، فتسأل النموذج عن صور لكلابٍ وقططٍ أو أيٍّ كان ما درَّبتَ نموذجكَ عليه، على أن تكون هذه الصور خارج مجموعة البيانات التي تدرَّب عليها النموذج، فإن أجاب بدقة فقد نجح المشروع، وإن أخطأ فتأكد من دقة تصنيفك للبيانات أولًا، فإن كانت مصنفة وموصوفة بدقة فامنحه مزيدًا من البيانات للتدرب عليها ثم أعد اختباره. 2. مشروع توقع أسعار العقارات مستوى الصعوبة: متوسط. يعد نموذج توقع أسعار العقارات من أفكار مشاريع الذكاء الاصطناعي المفيدة متوسطة الصعوبة، ويساعدك نموذج توقع أسعار العقارات على تحديد السعر المناسب للعقار بناءً على معطيات عديدة، بدءًا من موقع العقار، مرورًا بمساحته وعدد الغرف فيه، وصولًا إلى رفاهيات العقار، مثل وجود فناء خلفي ومسبح. لا تختلف خطوات تنفيذ مشروع نموذج توقع أسعار العقارات كثيرًا عن خطوات تنفيذ مشروع نموذج تصنيف الصور، وكذا سائر مشاريع الذكاء الاصطناعي في مجال تعلم الآلة، فكلُّ مشاريع تعلم الآلة تتفق في خطوات جمع البيانات ومعالجتها وبناء النموذج وتدريبه واختباره، ولكن تختلف المشاريع فيما بينها في أحجام البيانات ومدى تعقيدها، ووظائف النموذج ومدى تعقيد خوارزمياته وطريقة تعامله مع البيانات وتعلمه منها. يمكنك في مرحلة جمع البيانات لهذا المشروع الاستعانة بمجموعات البيانات التي توفرها المواقع الرسمية للحكومات حول الإسكان، أو البحث في مواقع العقارات لجمع البيانات المُرادة، ثم معالجة بياناتك وتنظيفها، فإذا كانت هنالك بعض المعلومات المفقودة كمساحة عقار أو ما شابه فيمكنك ملؤها بمتوسط المساحات أو أن تحذف هذه القطعة من البيانات. ينصح في مرحلة بناء النموذج استخدام خوارزميات الانحدار الخطي Linear Regression فهي قادرة على اكتشاف العلاقات بين البيانات المختلفة كالعلاقة بين مساحة العقار وموقعه وسعره، كما يمكنك الاستعانة بمكتبات التحليل التنبؤي للبيانات مثل مكتبة ساي كيت ليرن Scikit-Learn المكتوبة بلغة بايثون. بعد ذلك عليك أن تمرر مجموعة البيانات التي جمعتها للنموذج كي يتدرب عليها ويستكشف الأنماط المختلفة بين البيانات، ويفهم لماذا كان العقار باهظ الثمن في منطقة ما وكان زهيدًا في منطقة أخرى، ويتعلم العلاقة بين المساحة وسعر العقار وغيرها من البيانات ذات الصلة، ويمكنك أخيرًا اختبار مشروعك مع عقارات بمعطياتٍ غير تلك الموجودة في مجموعة البيانات التي تدرب عليها مسبقًا. 3. مشروع كشف الاحتيال المالي مستوى الصعوبة: متقدم. تقع نماذج الكشف على الاحتيال ضمن أهم مشاريع الذكاء الاصطناعي، ولا سيما تلك المتعلقة بالاحتيال المالي، حيث تساعد هذه النماذج على كشف العمليات الاحتيالية في المعاملات المالية بناءً على معطيات عديدة، منها مثلًا التاريخ الإنفاقي للعميل، فإن أُجريَت عملية مالية مفاجئة بمبلغ أعلى بكثيرٍ من متوسط إنفاق العميل تُصنَّف العملية احتيالًا، وكذلك إذا تتابعت العديد من العمليات دون فروق زمنية واسعة تصنفها نماذج الكشف عن الاحتيال كعملياتٍ احتيالية. تكمن صعوبة تطوير مشروع ذكاء اصطناعي للكشف عن الاحتيال في صعوبة جمع ومعالجة البيانات التي سيتدرب عليها النموذج، حيث تحتاج لإنشاء مجموعة بيانات تحتوي على عدة تواريخ إنفاقية مع تفاصيل عن عملائها، وإضافة مجموعة من العمليات إلى مجموعة البيانات هذه ثم تصنيفها كعملياتٍ آمنة وعملياتٍ احتيالية، ثم ومعالجة البيانات والتأكد من اكتمال الخانات وعدم فراغ أيٍّ منها. يمكنك استخدام عدة خوازرميات في تطوير نموذج الكشف عن الاحتيال، مثل خوارزمية الانحدار اللوجستي Logistic Regression التي تستطيع توقع احتماليات الاحتيال في العمليات المالية بناءً على المدخلات، كما يمكنك استخدام خوارزمية الغابة العشوائية Random Forest التي تستطيع اكتشاف العمليات المشبوهة والاحتيالية عن الطبيعية بدقة كبيرة، ويوجد خورازميات أخرى تفيد في هذا المجال مثل خوارزمية تعزيز التدرج Gradient Boosting. بعد كتابة خوارزميات النموذج عليك تزويده بالبيانات ليتدرب عليها ويكتشف العمليات الاحتيالية من بين تاريخ العمليات لكل بطاقة أو حساب موجود في مجموعة البيانات، وما إن ينتهي من التدرب على البيانات يمكنك حينئذٍ اختباره على معاملات مالية جديدة. مشاريع ذكاء اصطناعي في مجال معالجة اللغات الطبيعية يعد مجال معالجة اللغات الطبيعية Natural Language Processing (NLP)‎ واحدًا من المجالات الفرعية الحيوية في الذكاء الاصطناعي، وهو يختص بتمكين الآلات والحواسيب من فهم اللغات البشرية، كالعربية والإنجليزية وغيرها، سواءً كانت اللغة مدخلة نصيًا أو صوتيًا وله تطبيقات عديدة منتشرة، بدءًا من روبوتات الدردشة وأشهرها شات جي بي تي ChatGPT وجوجل جيميني Google Gemini، مرورًا بالمساعدين الصوتيين مثل مساعد جوجل Google Assistant وأليكسا Alexa وسيري Siri، وصولًا إلى أدوات الترجمة بمساعدة الحاسوب وأهمها ترجمة جوجل Google Translation. تتعدد مشاريع الذكاء الاصطناعي المقترحة لمهندسي معالجة اللغات الطبيعية، ومنها: مشروع روبوت دردشة لخدمة العملاء باستخدام الذكاء الاصطناعي. مشروع ذكاء اصطناعي لتحليل مشاعر جمهور مواقع التواصل الاجتماعي. مشروع ذكاء اصطناعي للترجمة الآلية. لنوضح المزيد حول كل مشروع من هذه المشاريع وآلية تنفيذه ومستوى صعوبته. 1. مشروع روبوت دردشة لخدمة العملاء بالذكاء الاصطناعي مستوى الصعوبة: سهل. يعد روبوت الدردشة لخدمة العملاء مشروع ذكاء اصطناعي للمبتدئين، ويتمحور بشكلٍ أساسيٍّ حول بناء روبوت دردشة يفهم استفسارات العملاء ويجيب عليها تلقائيًا بإجاباتٍ واضحةٍ كافيةٍ صحيحةٍ، ويعتمد روبوت الدردشة لخدمة العملاء على خوارزميات معالجة اللغات الطبيعية في المقام الأول، ثم على خوارزميات تعلُّم الآلة في المقام الثاني. نبدأ بناء روبوت دردشة خدمة العملاء بتطوير كل جزء منه على حدة، بدءًا من أساس روبوت الدردشة والذي يمكنك بناؤه مستخدمًا إحدى منصات تطوير روبوتات الدردشة عبر واجهة أمامية بسيطة، مثل Chatfuel، أو أن تكتب شيفرات روبوت الدردشة بنفسك مستعينًا بمكتبات وأطر عمل مساعدة مثل مكتبة NLTK بلغة باثيون ثم نطور بعد ذلك نظام التعرف على النوايا Intent Recognition في روبوت الدردشة، والذي يحاول معرفة المغزى وراء الأمر المُدخل من العميل، كتحديد ما إن كان عميل متجر إلكتروني يتساءل عن سياسات الاسترجاع أو تتبع طلبه أو غيرها. نشرع بعد ذلك في تطوير نظام استخراج الكيانات المُسمَّاة (named entity extraction)، والذي يعمل على استخراج التفاصيل المهمة من رسالة العميل، مثل رقم المنتج واسمه أو رقم الطلب وغيرها، وبعد ذلك نبني منهجية تدفق المحادثة التي تساعد روبوت الدردشة على إدارة المحادثة بكفاءة وكتابة ردود مناسبة لاستفسارات العميل ومساعدته على حل مشكلاته، وأخيرًا نجمع كل هذه الأجزاء ونُضمِّنها ليتكون روبوت الدردشة، ثم نبدأ في اختبار كفاءته في إدارة المحادثات. 2. مشروع ذكاء اصطناعي لتحليل مشاعر جمهور مواقع التواصل الاجتماعي مستوى الصعوبة: متوسط. يعمل نموذج تحليل مشاعر جمهور مواقع التواصل الاجتماعي على تحليل المنشورات والتغريدات، ومحاولة تحديد المشاعر العاطفية خلف الكلمات المكتوبة، فيصنف المنشورات بين منشورات إيجابيةٍ ومنشوراتٍ سلبيةٍ وأخرى طبيعية أو عادية، ويساعد هذا النوع من النماذجِ الأعمالَ على تخصيص حملاتهم التسويقية تبعًا للفئة المستهدفة، ويساعدهم كذلك على إطلاق حملات تسويقية ذات كفاءة، وذلك بتحليل أحجام ضخمة من المحتوى المكتوب من هذه الفئة المستهدفة. نبدأ في العمل على تطوير نموذج تحليل مشاعر منشورات مواقع التواصل الاجتماعي بجمع البيانات، فالبيانات في حالتنا هي منشورات التواصل الاجتماعي، ولأنَّ هذا النوع من البيانات غالبًا ما يكون فوضويًا وغير مهيكل فنحتاج جهدًا كبيرًا في معالجة بيانات هذا المشروع، فيمكننا تطوير برنامج يعيد الجملة إلى تكوينها الأصلي، فيزيل الرموز ويحول الحروف الكبيرة إلى صغيرة، ثم يختصر الجملة ما أمكن. بعد ذلك نبدأ في اختيار منهجية معالجة اللغة الطبيعية المناسبة، ولتكن النهج القائم على المعجم Lexicon-Based Approach، والذي يُقسِّم الجملة إلى كلماتٍ ويُحدِّد ماهية كل كلمة على حدة ما إذا كانت كلمة إيجابية أم سلبية أم عادية، فكلما زادت الكلمات الإيجابية في المنشورات صنَّفها ضمن المنشورات الإيجابية، وكذلك كلما زادت الكلمات السلبية في المنشورات صنَّفها ضمن المنشورات السلبية. وأخيرًا بعد تجهيز البيانات وتحديد المنهجية نبدأ في تطوير النموذج، ونعطيه البيانات ليتدرب عليه، ثم نختبره على محتوى ليس ضمن مجموعة البيانات وننظر هل سيصنفه بشكلٍ صحيحٍ أم يخطئ في التصنيف. ولمزيدٍ من التفاصيل حول مشروع نموذج تحليل المشاعر ننصحك بمطالعة مقال تحليل المشاعر في النصوص العربية باستخدام التعلم العميق. 3. مشروع ذكاء اصطناعي للترجمة الآلية مستوى الصعوبة: متقدم يعد المترجم الآلي متعدد اللغات من أهم مشاريع الذكاء الاصطناعي، وتتمحور فكرته حول تمكين المستخدم من الترجمة بين لغة وأخرى، مع دعم لغات عديدة ومتنوعة، وذلك مع تحري الدقة في الترجمة والمقارنة بين الترجمات المختلفة للكلمة الواحدة واستخدام الترجمة الأنسب لها، وأخيرًا تكوين جملة واضحة مفهومة سليمة. الخطوة الأولى من عملية تطوير مترجم آلي متعدد اللغات هي جمع البيانات وتنظيفها ومعالجتها، وتحتاج في هذا المشروع بالذات للبحث عن مجموعة بيانات جاهزة تحتوي على الكلمات بمرادفاتها في اللغات المختلفة مع أمثلة للكلمة في سياقات حديثية عديدة بكل لغة، ثم تعالج هذه البيانات بالبحث فيها عن الترجمات الناقصة أو المفقودة، ثم تترجمها بنفسك. بعد ذلك تختار منهجية الترجمة ونقترح عليك منهجية الترجمة الآلية العصبية Neural Machine Translation (NMT) لدقة عالية في الترجمة، ومن بعد ذلك تكتب خوارزميات النموذج التي ستتدرب على البيانات، ثم تمنح مجموعة البيانات للنموذج ليتدرب عليها، وتجدر الإشارة لأنَّ هذا المشروع هو من مشاريع الذكاء الاصطناعي التي تتطلب الكثير من الموارد الحاسوبية وقدرات معالجة قوية قادرة على التدرب على البيانات الضخمة. ثم ما إذا انتهى النموذج من التدرب على البيانات يمكنك اختبار دقته في الترجمة بين اللغات المختلفة. مشاريع ذكاء اصطناعي في مجال الرؤية الحاسوبية يعد مجال الرؤية الحاسوبية Computer Vision أحد المجالات الحيوية من مجال الذكاء الاصطناعي ويمكن تنفيذ العديد من مشاريع الذكاء الاصطناعي التي تستفيد من قدرة الآلات على تفسير الصور ومقاطع الفيديو وسائر المرئيات والتعرف على محتوياتها مثل تطبيقات التعرف على الوجوه والتعرف على الأشياء وتتبع الحركة، كما تدخل فيه تطبيقات أعقد من ذلك، مثل أنظمة السيارات ذاتية القيادة، وأنظمة الروبوتات، وغيرها. ومن مشاريع الذكاء الاصطناعي المهمة لمهندسي الرؤية الحاسوبية: مشروع التعرف على الوجوه بالذكاء الاصطناعي. مشروع ذكاء اصطناعي لتتبع الأشياء المرئية. مشروع سيارة ذاتية القيادة. وإليك شرحًا أوفى عن كل مشروع من هذه المشاريع وطريقة تنفيذه. 1. نظام التعرف على الوجوه بالذكاء الاصطناعي مستوى الصعوبة: سهل. يعد نظام التعرف على الوجوه مشروع ذكاء اصطناعي للمبتدئين، وتدور فكرة المشروع حول تطوير برنامج يمكنه تحديد الوجوه في الصور والتعرف على أصحابها، وذلك باستخدام تقنيات تعلم الآلة وتقنيات الرؤية الحاسوبية. في أولى الخطوات وهي خطوة جمع البيانات نجد صور المشاهير خيارًا جيدًا لتدريب النموذج عليها، إذ تتوفر صورٌ لهم من زوايا مختلفة عبر الإنترنت، فيمكنك تحميل مجموعة من الصور لكل شخص وتصنيفها داخل مجموعة البيانات حيث تكون جميع صور الشخص تحت تصنيفٍ باسمه، ثم بعد ذلك تبني النموذج باستخدام المكتبات وأطر العمل الجاهزة، مثل مكتبة face_recognition في لغة بايثون. ثم تسمح للنموذج بالتدرب على البيانات والتعرف على الوجوه وتحديد أصحاب هذه الوجوه، ثم إذا ما انتهى من التدرب على مجموعة البيانات يمكنك اختباره على صورٍ غير الموجودة في مجموعة البيانات لنفس الأشخاص الذين كانوا فيها. طالع المزيد عن أنظمة التعرف على الوجوه بقراء مقال إعداد شبكة عصبية صنعية وتدريبها للتعرف على الوجوه. 2. مشروع ذكاء اصطناعي لتتبع الأشياء المرئية مستوى الصعوبة: متوسط. يشير نظام تتبع الأشياء المرئية إلى نظام برمجي يستخدم الذكاء الاصطناعي للتعرف على الأشياء المختلفة في مقاطع الفيديو وتتبعها، كالتعرف على السيارات وتتبعها في أنظمة الرادارات، والتعرف على الأجساد البشرية وتتبعها في أنظمة كاميرات المراقبة. نبدأ تطوير النموذج بجمع مقاطع للأشياء المرئية التي تود تتبعها، مثل مقاطع متعددة لسياراتٍ تجري على طريقٍ سريع، مع إضافة مربعات حول الأشياء المراد تتبعها في مقاطع الفيديو، ثم تطور نموذجك بإحدى المنهجيتين YOLO أو SSD، ثم تمنح النموذج مجموعة البيانات ليتدرب عليها ويحاول التعرف على الأشياء الموجودة في مقطع الفيديو وتتبع الشيء المطلوب منه تتبعه، ثم تختبر النموذج. 3. مشروع سيارة ذاتية القيادة مستوى الصعوبة: متقدم. يعد بناء نظام لسيارة ذاتية القيادة أمرًا صعبًا، نظرًا لتعقيد هذه الأنظمة وكثرة وظائفها وخواصها، ولكنه مشروعٌ تتعلم منه الكثير، وتتضمن أنظمة السيارات ذاتية القيادة أنظمة تتبع للأشياء، كما تتضمن أنظمة لرسم الخرائط وتحديد الطرق. تمر خلال مشروع تطوير نظام سيارة ذاتية القيادة بمراحلٍ ثلاث: الإدراك: تعمل في هذه المرحلة على بناء النظام الإدراكي للسيارة، والذي يساعدها على رسم الخرائط ثلاثية الأبعاد للمكان المحيط، ويساعدها على التقاط صور للطريق ومعرفة الأشياء أمامها، وكذلك يتضمن النظام الإدراكي نظامًا لتحديد السرعة والمسافة، ويعمل أيضًا على معرفة معلومات عامة عن الموقع المحيط باستخدام نظام تحديد الموقع العالمي GPS. تخطيط المسار: تبني لنظام السيارة ذاتية القيادة في هذه المرحلة نظامًا داخليًا لرسم الخرائط عالية الجودة، ونظامًا لتحديد أفضل المسارات وأسرعهم للسير فيه مع النظر للظروف الحالية من أجواءٍ وغيرها، كما نُعلِّم النظام كيفية تجنُّب الحواجز من بشرٍ وسياراتٍ أخرى وغيرها من الحواجز. اتخاذ القرارات: نجعل النظام قادرًا على السير في المسار الذي خططه قبلًا، ونزده بنظام توقعٍ لحركات المركبات المجاورة، ونحرص في هذه المرحلة على تطوير منطق اتخاذ القرارات التي تؤدي إلى سلامة وأمان الراكب والسيارة. مشاريع ذكاء اصطناعي في مجال برمجة الروبوتات تشير برمجة الروبوتات Robotics Programming إلى عملية استخدام إحدى لغات برمجة الروبوتات لتطوير النظام الذي يستطيع به جسد الروبوت أن يبدأ في تنفيذ مهامه، وتساعد برمجة الروبوتات الروبوت على أن يدرك بيئته، ويضع خططًا، ويتخذ قراراتٍ، وينفذ مهامًا، فمثلًا عند تطوير روبوت للتنقل الأرضي نحتاج إلى تزويد نظامه بخوارزميات الرؤية الحاسوبية التي تسمح له بالإدراك والتعرف على الأشياء من حوله، كما نحتاج إلى جعل النظام قادرًا على رسم خرائط، ويحتاج أيضًا إلى خوارزميات لتخطيط مسارٍ والسير فيه، وخوارزميات للتحكم في محركاته وأجزائه الفيزيائية، وغيرها. ومن أهم مشاريع برمجة الروبوتات: مشروع تحريك ذراع روبوت في مسار محدد. مشروع مساعدة روبوت على تجنب العقبات. مشروع روبوت يتفاعل مع البيئة ويتعلم ويتطور باستقلالية. وإليك المزيد حول كل مشروع من هذه المشاريع الذكية. 1.مشروع لتحريك ذراع الروبوت في مسار محدد مستوى الصعوبة: سهل يهتم هذا المشروع بتطوير خوارزمية لذراع الروبوت تجعله قادرًا على التحرك في مسار محدد مسبقًا لحمل شيء من مكان إلى آخر، ونرى تطبيقات هذا المشروع بكثرة في المصانع المعتمدة كليًا أو جزئيًا على الآلات في تصنيع منتجاتها، إذ تتواجد فيها أذرع روبوتات تنقل المنتجات وتدخلها وتخرجها من آلات التصنيع، ثم تغلفها وتجعلها جاهزة للبيع. تحتاج أولًا في هذا المشروع إلى ذراع روبوت لتطور الخوارزمية له وتختبرها عليه، فما إن حصلت عليه فابدأ بفحصه وتعرف على مواصفاته وعدد مفاصله والنطاق الحركي لكل مفصل، وتعرف على سائر المستعشرات المدمجة فيه، ثم ابدأ بتحديد المسار المناسب للذراع بناءً على هذه المواصفات، وبعد ذلك ابدأ في تحويل هذا المسار إلى شيفرات برمجية تساعد الذراع على التحرك حركةً بحركة، وحدد سرعة تنفيذ كل حركة في المسار، ثم ثبت النظام على ذراع الروبوت واختبر مدى دقته في التحرك من مكان إلى آخر. 2. مشروع مساعدة روبوت على تجنب العقبات مستوى الصعوبة: متوسط يهدف مشروع تطوير نظام يساعد الروبوت على تجنب العقبات إلى تمكين الروبوت من التحرك الحر في بيئة مع تجاوز العقبات المختلفة وعدم الاصطدام بها. يعتمد هذا المشروع على كتابة خوارزميات لمستشعرات الروبوت، ونمر فيه بثلاث خطوات، أمَّا الأولى فهي تحصيل المستشعرات وبرمجتها بحيث يعرف الروبوت من خلالها ما حوله من مرئيات وماديات، ويتعرف على العقبات المحتملة في طريقه، وأمَّا الخطوة الثانية فهي تحديد الخوارزمية المناسبة للنظام حسب حجم الروبوت والهدف منه وسرعته، وتختار بين الخوارزميات الثلاث: خوارزمية متابعة الحائط Wall-Following أو خوارزمية الميادين المحتملة Potential Fields أو خوارزميات الأخطاء Bug Algorithms، وهذه الخوارزميات مسؤولة عن رسم مسار الروبوت وتجنب العقبات أثناء السير في المسار، وأمَّا الخطوة الثالثة والأخيرة هي اختبار النظام على روبوت حقيقي ومراقبة مدى كفاءته في تجاوز العقبات. 3. مشروع روبوت يتفاعل مع البيئة ويتعلم ويتطور باستقلالية مستوى الصعوبة: متقدم يعد نظام روبوت يتفاعل مع البيئة ويتعلم ويتطور باستقلالية واحدًا من أهم وأصعب مشاريع الذكاء الاصطناعي وبرمجة الروبوتات، وكما يتضح من اسم المشروع فإنَّ الهدف منه هو تطوير نظام روبوت يدرك البيئة المحيطة به ويفهم ماهية الأشياء من حوله، ويستطيع أن يتعامل مع المهام المختلفة في مجال محدد ويعالجها، ويتمكن كذلك من التعلم المستمر عن المجال الخاص به والتطور وزيادة القدرة على تنفيذ المهام المتنوعة. تحتاج أولًا إلى جسد روبوت لتنفيذ هذا المشروع، فإذا ما حصلت عليه فابدأ بتطوير المهام الأساسية للروبوت، بدءًا من التعرف على الأشياء والتقاطها، مرورًا بتخطيط المسارات، وصولًا إلى تخطي العقبات، وغيرها من المهام الأساسية للروبوت، وبعد ذلك طوِّر النظام الحركي للروبوت وطوِّر كذلك النظام الإدراكي له، والذي يساعده على معرفة الأشياء في البيئة حوله والتفاعل معها. ابدأ بعد ذلك في تطوير خوارزميات تعلم الآلة الخاصة بالروبوت، ونقترح عليك تطويرها بنهج التعلم المعزز Rainforcement Learning، وزوِّد الروبوت بمجموعات ضخمة من البيانات التي تضم معلومات عن المجال التي تود من الروبوت فهمه بعمق وإتقانه، وغالبًا ما تأخذ هذه المرحلة من تطوير الروبوت الوقت الأطول، ولكنها ضرورية لتمكين الروبوت من فهم المجال المختار جيدًا وتعلمه دون الحاجة إلى إشراف بشري، فإذا ما أنهيتها فأعطِ الروبوت مهامًا في هذا المجال لاختباره وتحديد مدى دقته ومدى نجاح المشروع. تنفيذ مشاريع الذكاء الاصطناعي بلغة البايثون إذا كنت تتساءل ما هي أفضل لغة برمجة لتنفيذ مشاريع الذكاء الاصطناعي فإننا ننصحك باعتماد لغة بايثون فهي تعد لغة رائدة في مجال الذكاء الاصطناعي وتسهل عليك تنفيذ مشاريعك لما تتضمنه من مكتبات وأطر عمل ذكاء اصطناعي قوية من أبرزها: تنسرفلو (TensorFlow) بايتورش (PyTorch) كيراس (Keras) نومباي (NumPy) سايباي (SciPy) سكيت-ليرن (Scikit-learn) بلوتلي (Plotly) ماتبلوتليب (Matplotlib) وإن أردتَّ التعرف على مزيد من مشاريع الذكاء الاصطناعي غير المذكورة في هذا المقال بلغة بايثون فيمكنك الاطلاع على كتب الذكاء الاصطناعي المتنوعة التي توفرها أكاديمية حسوب مجانًا، وأهمها كتاب عشرة مشاريع عملية عن الذكاء الاصطناعي. وإن كنت مهتمًا بالتأسيس السليم في مجال الذكاء الاصطناعي والتعلم على يد خبراءٍ في المجال، مع التطبيق العملي المستمر على كل مصطلح من مصطلحات الذكاء الاصطناعي ننصحك بمطالعة دورة أكاديمية حسوب في الذكاء الاصطناعي، والتي تُحدَّث دوريًا بالمصطلحات والمفاهيم الجديدة في مجال الذكاء الاصطناعي وتساعدك على تنفيذ العديد من مشاريع الذكاء الاصطناعي العملية المفيدة والتي توائم متطلبات سوق العمل. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن اقرأ أيضًا دليلك الشامل لتعلم الذكاء الاصطناعي تطبيقات الذكاء الاصطناعي اسأل مهندس الذكاء الاصطناعي: أسئلة شائعة حول الذكاء الاصطناعي تطوير تطبيق 'اختبرني' باستخدام ChatGPT ولغة جافاسكربت مع Node.js بناء تطبيق بايثون يجيب على أسئلة ملف PDF باستخدام الذكاء الاصطناعي أهم مصطلحات الذكاء الاصطناعي للمبتدئين
    2 نقاط
  10. يمر أغلب مهندسي الذكاء الاصطناعي و تعلم الآلة أثناء تعلمهم للعديد من الخوارزميات الأساسية والتقليدية في تعلم الآلة بمكتبة ساي كيت ليرن Scikit Learn التي توفر هذه الخوارزميات وتوثيقًا جيدًا لها، في هذه المقالة سوف نستكشف هذه المكتبة القوية واستخداماتها ومميزاتها، وما الخوارزميات التي يوفرها، ونستعرض بعض الأمثلة العملية على حالات الاستخدام. ما هي مكتبة ساي كيت ليرن Scikit Learn تعد ساي كيت ليرن Scikit Learn أحد أشهر مكتبات أو أطر عمل لغة بايثون وأكثرها استعمالًا خاصة في مجالات علوم البيانات وتعلم الآلة، فهي توفر مجموعة من خوارزميات الذكاء الاصطناعي المبنية بكفاءة، وتتيح لنا استخدامها بسلاسة حيث تمتلك جميع خوارزميات التعلم المبنية بها طريقة شبه موحدة للتعامل معها، فاستخدام خوارزمية أخرى لنفس الغرض يتطلب ببساطة تغيير سطر واحد من الكود، وتوفر هذه المكتبة إمكانيات كبيرة عند بناء النماذج ومعالجة البيانات وتجهيزها، وحفظ النماذج في صيغة يمكن إعادة استخدامها لاحقًا. مميزات مكتبة ساي كيت ليرن Scikit Learn تسهل مكتبة ساي كيت ليرن Scikit Learn تطوير نماذج تعلم الآلة على المبتدئين والراغبين باختبار الأمور بسرعة، وتوفر لهم العديد من المميزات التي سنسردها ونتعرف عليها مثل: التوثيق الجيد: تتميز المكتبة بوجود توثيق مفصل وأمثلة استخدام كثيرة تساعدنا في البدء بتطوير واستخدام الخوارزميات المختلفة ومعرفة المعاملات التي يمكن ضبطها لتغير أداء النموذج وطريقة تدريبها القيم الافتراضية لمعاملات التحكم : لا داعي للقلق إن كنا نتعلم خوارزمية جديدة ونرغب في تجربتها دون الدخول في جميع التفاصيل وتأثيرات ضبط قيم معاملات التحكم أوالمعاملات الفائقة hyperparameters حيث تضبط المكتبة أغلب العوامل بقيم افتراضية مناسبة لأغلب الاستخدامات، لذا يمكننا التركيز على العوامل الأهم وفهمها بشكل أفضل أدوات للمفاضلة بين النماذج: مع تنوع الخوارزميات المبنية في المكتبة التي يمكنها القيام بنفس المهمة بطرق مختلفة يكون من الصعب على المبتدئ تقرير أي الخوارزميات هو الأفضل للمهمة التي يحاول إنجازها، لذلك توفر لنا المكتبة أدوات للمقارنة بين الخوارزميات المختلفة وعوامل التحكم المختلفة بسلاسة مكتبة غنية بالخوارزميات والأدوات: توفر المكتبة أغلب خوارزميات تعلم الآلة التقليدية، مما يغنينا عن عناء بناء هذه الخوارزميات من الصفر، إذ تتوفر عشرات الخوارزميات التي يمكن تطبيقها من خلال سطور معدودة من الكود، فيمكننا التركيز على تحسين معالجة البيانات وتحسين جودتها واختيار النموذج الأنسب للمشكلة التي لدينا التوافق مع المكتبات الأخرى: تعمل المكتبة بشكل سلس مع المكتبات الأخرى مثل باندا Pandas و نمباي NumPy التي توفر هياكل بيانات وعمليات تسهل اكتشاف أنماط البيانات وتحليلها ومعالجتها لتصبح جاهزة للنموذج الذي نحتاج لتدريبه معالجة البيانات باستخدام ساي كيت ليرن توفر ساي كيت ليرن Scikit Learn العديد من الأدوات الجيدة لمعالجة البيانات وتجهيزها لتدريب النماذج عليها، وكما نعرف تٌعد البيانات وجودتها العامل الأهم في تحسين دقة توقعات النماذج المستخدمة، لذلك هنالك بعض الخطوات التي نحتاج للقيام بها لمعالجة البيانات فمثلًا إذا كانت هناك قيم غير رقمية فنحن بحاجة لتحويلها إلى أرقام فنماذج تعلم الآلة هي نماذج رياضية ولن نستطيع القيام بعمليات حسابية على النصوص أو الصور بشكلها الأصلي. أمثلة على معالجة البيانات الترميز Encoding: هو عملية تبديل بعض البيانات بأرقام يسهل إجراء عمليات رياضية عليها، مع إمكانية إرجاعها لأصلها، يمكن ترميز البيانات في مكتبة Scikit Learn باستخدام الكود التالي: from sklearn.preprocessing import LabelEncoder # ترميز البيانات الوصفية city = ["القاهرة", "الرياض", "دمشق", "القاهرة"] # نعرف المٌرمز الذي يعوض عن اسمٍ برقم يعبر عنه encoder = LabelEncoder() # تقوم هذه الدالة بتجهيز المٌرمز # حيث سيمكننا أن نستخدمه أكثر من مرة بعد هذه الخطوة لترميز البيانات المدخلة له بناءً على أول بيانات أعطت له encoder.fit(city) # الآن يمكننا استخدامه على أي بيانات أخرى لترميزها city_encoded = encoder.transform(city) print(city_encoded) # Output: [1 0 2 1] print(encoder.transform(["الرياض"])) # Output: [0] # عكس الترميز print(encoder.inverse_transform(city_encoded)) # Output: ['القاهرة' 'الرياض' 'دمشق' 'القاهرة'] print(encoder.inverse_transform([2, 1, 0, 0, 1])) # Output: ['دمشق' 'القاهرة' 'الرياض' 'الرياض' 'القاهرة'](city_encoded) التعامل مع القيم المفقودة : قد تتضمن البيانات بعض القيم المفقودة ويمكن التعامل معها في مكتبة Scikit Learn بسهولة من خلال حذف الصفوف التي تحتوي قيمًا مفقودة إن كانت قليلة للغاية، أو التعويض عنها باستخدام المعلومات الإحصائية كالمتوسط الحسابي للقيم، أو بناء نموذج لتوقعها بحسب القيم الموجودة بالفعل. خوارزميات تعلم الآلة في مكتبة Scikit Learn تتضمن مكتبة Scikit Learn العديد من خوارزميات تعلم الآلة التي تساعدنا على تنفيذ مهام متنوعة، وفيما يلي نبذة عن أهم هذه الخوارزميات: أولًا: خوارزميات التعلم الخاضع للإشراف التعلم الخاضع للإشراف Supervised Learning هو نوع من التعلم الآلي يصف المهام التي تكون فيها البيانات المراد توقعها معلوم مخرجاتها الممكنة مسبقًا وتوجد بيانات تحتوي على ملاحظات سابقة تتضمن الوسوم Labels المراد تعليم النموذج توقعها، وسنوضح تاليًا أبرز الخوازرميات التي تندرج تحت هذه النوع. خوارزميات توقع الانحدار Regression توقع الانحدار هو نوع من المهام التي يمكننا القيام بها باستخدام خوارزميات مضمنة في ساي كيت ليرن Scikit Learn، يتوقع هذا النوع من الخوارزميات الحصول على أمثلة سابقة يتعلم منها العلاقة بين المدخلات المعطاة والوسم المراد توقعه، والذي يكون قيمة عددية مستمرة continuous مثل توقع درجة الحرارة أو توقع أسعار المنازل. أمثلة على خوارزميات توقع الانحدار: توقع الانحدار الخطي Linear Regression توقع الانحدار بالدوال متعددة الحدود Polynomial Regression خوزارزميات التصنيف Classification يصنف البشر كل شيء حولهم من الحيوانات والجمادات إلى أنواع الأفلام والروايات، وتتوفر خوارزميات تستطيع محاكاة البشر وتتعلم تصنيف الأشياء المختلفة بإعطاء نماذج وملاحظات سابقة لتصنيفات قام بها البشر من قبل حتي تستطيع الآلة تعلم التصنيف، يمكن الاستفادة من التصنيف في أتمتة العديد من المهام المرجو فيها تصنيف عدد ضخم من العناصر في وقت قليل بالتالي توفير الوقت وزيادة الكفاءة، عملية التصنيف تخرج لنا قيمًا منفصلة discrete. من الأمثلة على استخدام هذه الخوارزميات توقع حالة الطقس هل هو مشمس أم غائم أم ماطر أم حار ...إلخ. وتصنيف الصور، وتوقع تقييمات الأفلام. أمثلة على خوارزميات التصنيف الانحدار اللوجستي Logistic Regression مٌصنّف الجار الأقرب Nearest Neighbors Classification شجرة القرار Decision Tree خوارزميات تجميع النماذج Models Ensemble تتيح لنا ساي كيت ليرن Scikit Learn القدرة على دمج أكثر من نموذج تعلم آلة ليشكلوا نموذجًا أقوى، يمكن تشبيه الأمر بلجنة أو فريق من الأصدقاء كل منهم خبير في مجال معين وعند جمع خبرتهم معًا يغطون على نقاط الضعف الخاصة بهم. يمكن تجميع النماذج باستخدام التصويت Voting حيث نجري تدريب لعدد من النماذج ثم نأخذ بتوقع الأغلبية في حالة كون المشكلة تصنيفية، أما أن كانت المشكلة توقع انحدار يمكن أن تأخذ متوسط التوقعات، لنلاحظ الكود التالي: from sklearn.ensemble import VotingClassifier # التصنيف اللوجيستي model1 = LogisticRegression() # شجرة القرارات model2 = tree.DecisionTreeClassifier() # مٌصنف أقرب الجيران model3 = KNeighborsClassifier(n_neighbors=3) # تجميع لتوقعات النماذج باستخدام التصويت model = VotingClassifier(estimators=[('lr', model1), ('dt', model2), ('knn', model3)], voting='hard') # تدريب النموذج # لاحظ أن مدخلات هذه الدالة هي الخواص المطلوب من النموذج تعلم الأنماط بها # بالإضافة إلى الوسم المٌراد توقعه # تمثل هذه المدخلات التجارب المٌراد للنموذج التعلم منها # يمكنك أن تستخدم هذه الدالة في تدريب أي نموذج في ساي كيت ليرن model.fit(X_train, y_train) # استخدام النموذج في التوقع # البيانات المدخلة للنموذج لم يرها من قبل # ولكنها تحتوي نفس الخواص والأعمدة التي تم تدريب النموذج عليها # نرغب في تدريب النموذج على التعميم لبيانات لم يرها من قبل y_pred = model.predict(X_test) جمعنا في الكود أعلاه عدد من النماذج الضعيفة ومحدودة المعرفة حيث يتدرب كل نموذج على جزء من البيانات، وجمعنا معرفتهم معًا للخروج بتوقع واحد مثال على هذا النوع هو خوارزمية الغابة العشوائية Random Forest وهي تجميع لنماذج من شجرة القرارات Decision Tree البسيطة. تقلل هذه الطريقة من فرص حفظ النموذج للبيانات وتمنحه مرونة أكثر لتعلم الأنماط الحقيقية التي تمكنه من توقع الإجابات الصحيحة عند تعرضه لبيانات جديدة عند تشغيل النموذج. خوارزميات التعلم غير الخاضع للإشراف التعلم غير الخاضع للإشراف Unsupervised Learning هو نوع من تعلم الآلة تكون فيه البيانات غير موسومة، ومهمة النموذج تعلم الأنماط بين البيانات ليكتشف الفروقات بينها، مثلًا إن كانت المدخلات صور فتكون المهمة معرفة أي الصور يمكن اعتبارها تابعة لنفس الشيء دون إعطاء وسم للبيانات في عملية التدريب، ما يعرفه النموذج هو الخواص المُراد للنموذج التعلم منها فقط للتميز بين الصور بناء عليها، وسنوضح تاليًا أبرز الخوازرميات التي تندرج تحت هذه النوع. خوزارميات العنقدة أو التصنيف العنقودي Clustering لا نوفر للنموذج في هذه الحالة التصنيفات والوسوم المتوقع انتماء البيانات لها على غرار التصنيف العادي، ففي العنقدة Clustering على النموذج أن يكتشف هذا بنفسه من خلال تعلم الأنماط الموجودة بالبيانات للتمييز بينها. تستخدم خوزارميات العنقدة في أنظمة التوصية Recommendation systems لتقديم اقتراحات شخصية للمستخدمين تناسب اهتماماتهم، أو فصل عناصر الصورة Image segmentation من خلال تحديد البكسلات التي تنتمي لنفس العنصر Object في الصورة بالتالي تفريقها عن باقي العناصر. أمثلة على خوارزميات العنقدة: العنقدة حول عدد من نقاط التمركز k-means العنقدة الهرمية Hierarchical clustering خوارزميات اختزال البيانات نحتاج لاختزال البيانات Data Reduction في كثير من الحالات بسبب محدودية القدرة الحاسوبية وعدم تأثير كل هذه البيانات بشكل ملحوظ على أداء النموذج، ونجري اختزال البيانات عادة من خلال تقليل أبعادها بدمج بعض الأعمدة أو الخواص بدون خسارة المعلومات الهامة قدر الإمكان، فمثلًا يمكننا تقليل أبعاد الصورة مع الاحتفاظ بملامحها ودقتها قدر الإمكان، أو تقليل عدد الأعمدة من 100 إلى 10 مع احتفاظ الأعمدة العشرة بأغلبية المعلومات التي تؤثر على التوقعات. من أمثلة خوارزميات اختزال البيانات خوارزمية تحليل العنصر الأساسي Principal Component Analysis التي تمكننا من اختزال عدد الأعمدة أو الأبعاد بالبيانات مع الاحتفاظ بأكبر قدر ممكن من المعلومات. # تساعدنا هذه المكتبة على صنع هياكل بيانات مصفوفة # والقيام بالعديد من العمليات الحسابية import numpy as np # هذه الخوارزمية التي سنستخدمها لاختزال البيانات from sklearn.decomposition import PCA # في البداية لنصنع بيانات عشوائية لنقوم بالتجربة # يضمن لنا هذا السطر ثبات القيم العشوائية عند إعادة تشغيل هذا الكود np.random.seed(0) # نعرف مصفوفة عشوائية التوليد، تتكون من 10 صفوف و100 عمود X = np.random.rand(10, 100) # لنعرف الخوارزمية التي استوردناها pca = PCA(n_components=10) # نضع هنا عدد الأعمدة التي نرغب أن تصبح البيانات عليها # لنقم بتشغيل الخوارزمية على البيانات التي معنا x_pca = pca.fit_transform(X) # هذا السطر يقوم بتدريب الخوارزمية على اختزال البيانات وفي نفس الوقت يقوم باختزال البيانات المدخلة # لنرى النتائج print("حجم البيانات قبل الاختزال", X.shape) print("حجم البيانات بعد الاختزال", x_pca.shape) ''' المـــــــــخــرجـــــــــــــات ------------------------------------- حجم البيانات قبل الاختزال (10, 100) حجم البيانات بعد الاختزال (10, 10) ''' خوارزميات كشف الشذوذ كشف الشذوذ Anomaly Detection هو عملية ملاحظة الغير مألوف والخارج عن الأغلبية في البيانات. يستخدم في حالات عددية مثل اكتشاف المعاملات الاحتيالية في البنوك، واكتشاف الأنماط غير المعتادة في تدفق الشبكات مما قد يساعد على منع هجمات إغراق الشبكة بالطلبات، واكتشاف المنتجات المعيبة في خطوط الإنتاج واكتشاف الأنماط غير المعتادة للمؤشرات الحيوية لجسم الإنسان التي تستخدمها تطبيقات الساعات الذكية التي تجمع هذه المؤشرات. من الخوارزميات التي تطبق كشف الشذوذ خوارزمية غابة العزل Isolation Forest، وفيما يلي مثال على طريقة استخدامها: # استيراد نموذج كشف كشف الشذوذ from sklearn.ensemble import IsolationForest # سنستخدمها لتوليد بعض البيانات import numpy as np # نولد البيانات لتجربة النموذج X = np.array([[10, 10], [12, 12], [8, 8], [9, 9], [200, 200]]) # يمكنك ملاحظة أن النقطة الأخيرة شاذة عن باقي النقاط # لنقم بتعريف وتدريب النموذج clf = IsolationForest(contamination=0.2) # %يفترض هذا المعامل أن نسبة شذوذ 20 # لاحظ أن التدريب يتم بدون استخدام وسوم حيث أن هذا النموذج غير خاضع للإشراف clf.fit(X) # في حالة اكتشاف شذوذ سيتم وسمه بسالب واحد لتميزه predictions = clf.predict(X) print(predictions) # Output: [ 1 1 1 1 -1] خوارزميات التعلم الخاضع لإشراف جزئي يستخدم التعلم الخاضع لإشراف جزئي Semi-supervised Learning بيانات تتكون من خليط من البيانات الموسومة Labeled data والبيانات غير الموسومة Unlabeled data أثناء التدريب، يمكن أن يصبح هذا الأسلوب مفيدًا للغاية عندما يكون من الصعب الحصول على بيانات موسومة كافية أو يحتاج الحصول عليها إلى وقت ومجهود ضخم. يستخدم عادة في ترشيح المحتوى في أنظمة التوصية فبعض البيانات قد تكون متوفرة بشكل صريح مثل تقييمات المستخدم للمنتجات والتي يمكن الاستدلال بها لاقتراح المزيد من العناصر، ولكن يمكن أيضًا الاستفادة من المعلومات غير الموسومة والمعروفة ضمنية من خلال تفاعلات المستخدم. كما يستخدم في تدريب نماذج التعلم على الصور ومقاطع الفيديو حيث يمكن وسم بعض الصور أو العناصر فيها بشكل بشري لكن لا يمكن حصر جميع العناصر المختلفة التي قد تكون بداخل صورة ووسمها لذا سنستفيد من دمج الجزء الموسوم من البيانات مع الجزء غير الموسوم في توفير كمية أكبر من البيانات لتدريب نماذج أكثر دقة، وسنوضح تاليًا أبرز الخوازرميات التي تندرج تحت هذه النوع. خوراززميات التعلم الذاتي Self Training يمكننا استخدام التعلم الذاتي Self Training في ساي كيت ليرن Scikit Learn لتحويل أي نموذج تصنيف تقليدي إلى نموذج يمكنه التدريب على البيانات الموسومة وغير الموسومة معًا، شريطة أن يكون النموذج قادرًا على توقع التصنيفات كاحتمالات، ونحتاج لاستخدام نموذج يسمى SelfTrainingClassifier لتحويل النماذج العادية لنماذج خاضعة لإشراف جزئي، لاحظ الكود التالي: from sklearn.tree import DecisionTreeClassifier from sklearn.semi_supervised import SelfTrainingClassifier # نعرف أي مصنف ليكون نموذج الأساس base_classifier = DecisionTreeClassifier() # نقوم بإحاطة نموذج الأساس ليصبح قادرًا على التعلم الذاتي self_training_model = SelfTrainingClassifier(base_classifier) # نقوم بتدريب النموذج مثل أي نموذج تقليدي self_training_model.fit(X_train, y_train) ملاحظة: عند تجهيزنا لبيانات التدريب نحتاج لوسم البيانات غير الموسومة بقيمة 1- حيث أننا لا نستطيع أن نمرر البيانات خلال النموذج وهي غير موسومة. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن اختيار النموذج المناسب قد يبدو اختيار النموذج المناسب في مكتبة ساي كيت ليرن معقدًا، إذ يمكن استخدام أكثر من خوارزمية لحل نفس المشكلة. ولكل خوارزمية معاملات تحكم مختلفة، لذلك يجب علينا استخدام أدوات تساعدنا في مقارنة النماذج وقياس أدائها. فيما يلي بعض المعايير الرئيسية التي يمكن استخدامها: الدقة Accuracy: عدد التوقعات الصحيحة التي توقعها النموذج مقسومًا على إجمالي البيانات. كلما كانت النسبة أعلى، كان النموذج أفضل خطأ المتوسط التربيعي Mean Squared Error: الفرق بين القيمة الفعلية التي نريد التنبؤ بها والقيمة التي توقعها النموذج، ثم تربيع هذا الفرق. وهو يساعد في تحديد مدى دقة التوقعات بحث مصفوفة المعاملات GridSearch: يستخدم لاختبار عدد من المعاملات أو إعدادات النماذج المختلفة دفعة واحدة والعثور على أفضل مجموعة معاملات تحقق أفضل أداء. تستهلك هذه الطريقة وقتًا وموارد حاسوبية كبيرة خاصة إذا كانت المعاملات كثيرة جدًا مقارنة بين ساي كيت ليرن Scikit Learn و تنسورفلو TensorFlow يكمن الفرق الرئيسي بين تنسورفلو TensorFlow وبين ساي كيت ليرن Scikit Learn في تخصص الاستخدام، حيث أن ساي كيت ليرن مكتبة متخصصة بخوارزميات تعلم الآلة التقليدية Traditional Machine Learning بينما تنسورفلو TensorFlow إطار عمل شامل لتطوير وتشغيل نماذج التعلم العميق Deep Learning المبنية على الشبكات العصبية الاصطناعية. وعلى الرغم من إمكانية تدريب شبكات عصبية اصطناعية باستخدام ساي كيت ليرن فهي ليست محسنة لأجل هذا الغرض، إذ لا تستطيع المكتبة الاستفادة من وحدات المعالجة الرسومية GPUs التي تستطيع تسريع تدريب النماذج العميقة بشكل أفضل من وحدات المعالجة المركزية CPUs، بينما لا يقف دعم تنسورفلو TensorFlow عند استخدام GPU واحد، حيث يمكن توزيع التدريب على عدة أجهزة على التوازي وهو شيء صعب التحقيق باستخدام ساي كيت ليرن. الخلاصة تعرفنا في هذه المقالة على مكتبة الذكاء الاصطناعي الشهيرة ساي كيت ليرن Scikit Learn وأبرز مميزاتها ووضحنا بعض التطبيقات الواسعة لخوارزميات التعلم المبنية بها، وكذلك تعرفنا على الفرق بينها وبين إطار العمل تنسورفلو TensorFlow.ننصح بتعلم استخدام هذه المكتبة وتجربتها في بناء وتطبيق نماذج تعلم آلة مخصصة، فهي توفر أدوات قوية ومرنة تمكنكم من تنفيذ حلول مبتكرة في مختلف مجالات الذكاء الاصطناعي. اقرأ أيضًا الذكاء الاصطناعي: دليلك الشامل بناء مصنف بالاعتماد على طرق تعلم الآلة بلغة البايثون باستخدام مكتبة Scikit-Learn العمل مع ملفات CSV وبيانات JSON باستخدام لغة بايثون استخدام التدريب الموزع ومكتبة Accelerate لتسريع تدريب نماذج الذكاء الاصطناعي
    2 نقاط
  11. نشرح في مقال اليوم الخطوات الأساسية لدمج نماذج الذكاء الاصطناعي التي توفرها شركة OpenAI في تطبيق جانغو Django، ففي الآونة الأخيرة ازادت شعبية نماذج OpenAI أو ما يعرف بنماذج GPT OpenAI بشكل كبير بفضل قدرتها على توليد محتوى نصي عالي الجودة في مختلف المجالات سواء كتابة رسائل البريد الإلكتروني والقصص، أو الإجابة على استفسارات العملاء، أو ترجمة المحتوى من لغة لأخرى. تُستخدم نماذج جي بي تي GPT models من قبل المستخدمين من خلال روبوت الدردشة تشات جي بي تي ChatGPT، وهو نظام محادثة ذكي أطلقته OpenAI، لكن يمكن للمطورين الاستفادة من هذه النماذج في تطوير تطبيقاتهم الخاصة باستعمال واجهة برمجة التطبيقات API التي وفرتها OpenAI لتوفير مرونة أكبر في التعامل مع هذه النماذج. وسنوضح في الفقرات التالية خطوات إنشاء تطبيق جانغو يستخدم هذه الواجهة البرمجية، وبالتحديد الواجهة البرمجية لنموذج إكمال المحادثة ChatCompletion API من أجل توليد قصة قصيرة ونتعرف على طريقة تخصص معاملات النموذج المختلفة، وتنسيق ردوده واستجاباته. متطلبات العمل كي نتمكن من إكمال هذه المقالة، سوف تحتاج الآتي: إطار جانغو Django مثبت على بيئة افتراضية env ضمن حاسوبنا إنشاء حساب على منصة OpenAI توليد مفتاح الواجهة البرمجية OpenAI API key من لوحة تحكم الحساب في منصة OpenAI تثبيت حزمة OpenAI Package الخاصة بلغة بايثون ضمن البيئة الافتراضية كما سنشرح في الخطوة التالية تثبيت مكتبة OpenAI في جانغو لنفترض أننا ثبَّتنا جانغو في البيئة افتراضية ضمن مجلد باسم django-apps. علينا التأكد من تفعيل البيئة الافتراضية وظهور اسمها داخل قوسين() في سطر الأوامر Terminal. إذا لم تكن البيئة الافتراضية مفعّلة فيمكننا تفعيلها يدويًا بالانتقال للمجلد django-apps في سطر الأوامر وكتابة الأمر التالي: hasoub-academy@ubuntu:$ .env/bin/activate بمجرد تفعيل البيئة الافتراضية، نشغل الأمر التالي لتنزيل حزمة OpenAI Package الخاصة بلغة بايثون: (env)hasoub-academy@ubuntu:$ pip install openai نحن الآن جاهزون للبدء بتطوير تطبيق جانغو الخاص بنا كما سنوضح في الخطوات التالية. إرسال الطلبات للواجهة البرمجية OpenAI API نحتاج بداية لإضافة مفتاح الواجهة البرمجية OpenAI API key لتطبيقنا كي نتمكن من إرسال الطلبات للواجهة البرمجية ChatCompletion API. واختبار الرد الذي نحصل عليه منها. لنكتب الأمر التالي لتشغيل بايثون داخل البيئة الافتراضية: (env)hasoub-academy@ubuntu:$ python نستورد بعدها المكتبة OpenAI ونعرًف العميل client المخصص للتفاعل مع الواجهة البرمجية كما يلي: import openai client = OpenAI(api_key="your-api-key") ملاحظة: نحتاج لاستبدالyour-api-key بمفتاح الواجهة البرمجية الخاص بنا وهو شبيه للتالي sk-abdfhghlisciodfop. بعدها نرسل طلب للواجهة البرمجية ChatCompletion API باستخدم الدالة chat.completions.create: response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content": "عد من 1 إلى 10"} ] ) حددنا في الكود السابق النموذج الذي نحتاج لاستخدامه في تطبيقنا ليكون gpt-3.5-turbo، وأضفنا كائن رسالة واحد يحتوي على الدور مستخدم user، ومرّرنا مُوجّه prompt بسيط سنرسل لاختبار الواجهة البرمجية وهو في حالتنا طلب العد من واحد إلى عشرة. ملاحظة1: عند التفاعل مع نموذج GPT سنتعامل مع ثلاثة أدوار رئيسية وهي: دور المستخدم user الذي يطرح الأسئلة أو يطلب المساعدة من النموذج، ودور النظام system الذي يتضمن القواعد والتعليمات التي توجّه للنموذج، ودور المساعد assistance الذي يمثل نموذج الذكاء الاصطناعي نفسه والذي سنستخدمة للإجابة على أسئلة المستخدم أو تنفيذ الأوامر التي يطلبها منه. ملاحظة2: من المهم دائمًا الرجوع إلى التوثيق الرسمي لمنصة OpenAI للحصول على تعليمات دقيقة وشاملة حول كيفية استخدام نماذج GPT في تطبيقاتك، فهذه النماذج تتعدل وتتغير مع مرور الوقت. لنطبع الآن الرد المستلم من الواجهة البرمجية API والذي يتضمن عرض الأعداد من واحد إلى عشرة على شكل قائمة من خلال الأمر التالي: print(response.choices[0].message.content) سنحصل على النتيجة التالية: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 بهذا نكون قد نجحنا بإرسال طلب بسيط إلى الواجهة البرمجية، واستلمنا منها الرد، وتأكدنا أن كل شيء يسير على ما يرام. نحن جاهزون الآن لاستخدام الواجهة البرمجية لإرسال مُوجّه prompt أكثر صعوبة ونطلب من النموذج كتابة محتوى قصة قصيرة. ضبط معاملات النموذج Parameters بعد أن نجنا في إرسال طلب API بسيط إلى الواجهة البرمجية لإكمال المحادثة ChatCompletion API، لنتعرف على طريقة ضبط معاملات النموذج للتحكم بسلوك هذا النموذج. فهنالك العديد من المعاملات المتاحة للتحكم في النص المولد، سنوضح ثلاثة منها. 1. درجة الحرارة Temperature يتحكم هذا المعامل في مدى عشوائية الردود المولَّدة من قبل النموذج، ويأخذ قيمة بين الصفر والواحد، فكلما ارتفعت قيمته سنحصل على تنوع وإبداع في الردود والعكس صحيح. response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "اذكر خمس كلمات"}], temperature=0.1 ) print(response.choices[0].message.content) المخرجــــات 1. تفاح 2. سيارة 3. كتاب 4. شمس 5. شجرة لنجرب منحه قيمة قريبة من الصفر مثل 0.1 ونرى كيف ستولد الكلمات: response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "اذكر خمس كلمات"}], temperature=0.1 ) print(response.choices[0].message.content) المخرجــــات 1. تفاح 2. فيل 3. ضوء الشمس 4. مغامرة 5. سكون نلاحظ بالتجربة أننا عندما نطلب من النموذج أن يذكر خمس كلمات عدة مرات عند ضبط البرامتر بالقيمة 0.1 فسوف نحصل على نفس الكلمات في كل مرة، أما عندما نضبط قيمته إلى 0.8 ونجرب الطلب عدة مرات فسنلاحظ تغيّر النتائج التي نحصل عليها كل مرة: response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "اذكر خمس كلمات باللغة العربية"}], temperature=0.8 ) print(response.choices[0].message.content) المخرجــــات 1. تفاح 2. ضوء الشمس 3. سعادة 4. صداقة 5. تقنية 2. العدد الأقصى للوحدات النصية Max Token يسمح لنا هذا المعامل بتحديد طول النص المولد، فعند ضبطع بقيمة معينة سيضمن لنا أن الردود لن تتجاوز الرقم الذي حددناه في الوحدات النصية tokens، على سبيل المثال عندما نضبط قيمة max-token إلى 10: response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "اذكر خمس كلمات"}], max_tokens=10 ) print(response.choices[0].message.content) سنحصل على النتائج التالية: المخرجــــات 1. تفاحة 2. سيارة وعندما نضبط قيمة max-token إلى 20: response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "اذكر خمس كلمات"}], max_tokens=20 ) print(response.choices[0].message.content) سنحصل على النتائج التالية: المخرجــــات 1. تفاح 2. سيارة 3. موسيقى 4. محيط 5. صداقة 3. التدفق Stream يحدد هذا المعامل هل نريد أن تتدفق الردود على دفعات streams أو تعود لنا دفعة واحدة، فعند ضبطه بالقيمة True، سنستلم الرد بشكل متدفق، أي على دفعات خلال عملية توليدها. هذا يفيدنا في المحادثات الطويلة وفي تطبيقات الزمن الحقيقي التفاعلية. response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "اذكر خمس كلمات"}], stream=True ) collected_messages = [] for chunk in response: chunk_message = chunk.choices[0].delta.content if chunk_message is not None: collected_messages.append(chunk_message) print(collected_messages) المخرجــــات ['', 'قطة', '\n', 'كتاب', '\n', 'حاسوب', '\n', 'شمس', '\n', 'ماء'] سيحتفظ المتغير chunk_message بكل جزء من الرسالة المتدفقة بشكل مؤقت أثناء استلامها من الواجهة البرمجية، بعد ذلك، ستضاف هذه الأجزاء إلى القائمة collected_messages التي تُجمع فيها كل الرسائل. يجب علينا التأكد من أن الجزء المتدفق ليس None، لأن هذه القيمة تدل على انتهاء تدفق الردود وتستخدم كشرط للخروج من الحلقة التكرارية. صياغة مُوجِّه نظام System Prompt مخصص في هذه الخطوة، سنستخدم كل ما تعلمناه من مفاهيم أساسية لكتابة مُوجِّه نظام مخصص system prompt وتوفير السياق الذي يحتاجه نموذج GPT لفهم المطلوب منه ضمن تطبيق جانغو، وسنحدد القواعد التي يجب أن يتبعها النموذج لتوليد المحتوى. ننشئ بداية وحدة بايثون تحتوي على دالة تتولى المهمة المطلوبة. لذا ننشئ ملفًا جديدًا باسم story_generator.py داخل مجلد مشروع جانغو بكتابة الأمر التالي: (env)hasoub-academy@ubuntu:$ touch ~/my_blog_app/blog/blogsite/story_generator.py ثم نضيف مفتاح الواجهة البرمجية OpenAI API key إلى متغيرات البيئة environmental variables، فلا نضيفها في ملف بايثون مباشرة لحماية المفتاح: (env)hasoub-academy@ubuntu:$ export OPENAI_KEY="your-api-key" نفتح الآن الملف story_generator.py وننشئ بداخله عميل OpenAI client ونعرف دالة باسم generate_story وظيفتها توليد محتوى قصة بناءً على مجموعة من الكلمات التي يحددها المستخدم: import os from openai import OpenAI client = OpenAI(api_key=os.environ["OPENAI_KEY"]) def generate_story(words): # استدعاء واجهة برمجة التطبيقات من OpenAI لتوليد القصة response = get_short_story(words) # تنسيق الاستجابة وإرجاعها return format_response(response) لتنظيم الكود البرمجي، سنستدعي ضمن هذه الدالة البرمجية دالة منفصلة باسم get_short_story تطلب توليد القصة من الواجهة البرمجية OpenAI API، ودالة أخرى باسم format_response تنسِّق الرد المستلم من الواجهة البرمجية. لنركز الآن على دالة توليد القصة get_short_story حيث سنضيف الكود الخاص بها في نهاية الملف story_generator.py كما يلي: def get_short_story(words): # إنشاء موجه النظام system_prompt = f"""أنت مولد قصص قصيرة. اكتب قصة قصيرة باستخدام الكلمات التالية: {words}. لا تتجاوز فقرة واحدة.""" # الاتصال بواجهة برمجة التطبيقات response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{ "role": "user", "content": system_prompt }], temperature=0.8, max_tokens=1000 ) # إرجاع استجابة الواجهة البرمجية return response كما نلاحظ فقد ضبطنا هنا مُوجِّه النظام system prompt كي يخبر النموذج ما هو، وما هي المهمة التي عليه تأديتها، وحددنا في الموجّه حجم القصة المطلوبة، ثم مررنا هذا الموجّه للواجهة البرمجية ChatCompletion API. أخيرًا نكتب كود دالة التنسيق format_response في نهاية الملف story_generator.py: def format_response(response): # استخرج القصة المولدة من الاستجابة story = response.choices[0].message.content # إزالة أي نص أو تنسيقات غير مرغوبة story = story.strip() # إرجاع القصة المنسقة return story لاختبار هذه الدوال سنستدعي الدالة generate_story ونمرر لها مجموعة كلمات كمعاملات، ثم نطبع الرد الذي تعيده لنا من خلال إضافة سطر الكود التالي للملف: print(generate_story("قطة، كتاب، حاسوب شمس، ماء")) لنحفظ الملف ونغلقه، ونشغًله من داخل سطر الأوامر كما يلي: (env) sammy@ubuntu:$ python ~/my_blog_app/blog/blogsite/story_generator.py يجب أن نحصل على قصة تشابه القصة التالية: في زاوية مريحة من غرفة مشمسة، كانت هناك قطة ذات فرو ناعم تُدعى "مشمش"، تتمدد بكسل بجانب رف كتب شاهق. بين صفوف الكتب، كان حاسوب فضولي يهمس بهدوء. بينما كانت أشعة الشمس تتسلل عبر النافذة، مُلَقيةً ضوءًا دافئًا، لاحظت "مشمش" بقعة ماء صغيرة على الرف. مدفوعةً بالفضول، دفعت القطة الكتاب الأقرب إلى البقعة، ليُفتح الكتاب ويكشف عن مكان مخفي يحتوي على عقد ماسي متلألئ. مع اكتشاف السر، بدأت "مشمش" مغامرة غير متوقعة، حيث امتزجت أشعة الشمس، والماء، وقوة المعرفة لتنسج قصة مثيرة من الغموض والاكتشاف. بعد أن تأكدنا من عمل الدالة generate_story وتوليد القصة بشكل صحيح، لنغير طريقة تنفيذ الكود وبدلاً من طباعة القصة مباشرة في سطر الأوامر، سنستدعي الدالة من خلال عرض جانغو Django view لعرض القصة على واجهة المستخدم. print(generate_story("قطة، كتاب، حاسوب شمس، ماء")) يمكن تجربة تعديل مُوجّه النظام system prompt بما يناسبنا لتوليد محتوى أفضل. سنلاحظ بالتجربة أن بإمكاننا دائمًا تحسين النتائج بما يتناسب مع احتياجاتنا. لننتقل إلى الخطوة التالية، حيث سندمج الوحدة التي عرفناها في ملف story_generator.py مع مشروع جانغو الخاص بنا. دمج وحدة بايثون مع جانغو في الواجهة الخلفية لدمج وحدة story_generator مع مشروع جانغو في الواجهة الخلفية، علينا تنفيذ عدة خطوات بسيطة، سنبدأ أولاً بإنشاء عرض view جديد في جانغو لاستقبال الكلمات من المستخدم، ثم سنستخدم الدالة generate_story لتوليد القصة بناءً على تلك الكلمات، وفي النهاية سنعرض النتيجة للمستخدم عبر المتصفح. نفتح ملف views.py داخل مجلد مشروع جانغو، ونستورد الوحدات والحزم البرمجية اللازمة، ثم نضيف دالة عرض view باسم generate_story_from_words ونكتب ضمنها ما يلي: from django.http import JsonResponse from .story_generator import generate_story def generate_story_from_words(request): words = request.GET.get('words') # استخراج الكلمات المتوقعة من الطلب story = generate_story(words) # استدعاء دالة generate_story باستخدام الكلمات المستخرجة return JsonResponse({'story': story}) # إرجاع القصة في استجابة JSON بعدها نحتاج لربط الدالة بمسار URL في مشروع جانغو لتمكين المستخدمين من الوصول إليها عبر المتصفح. لنفتح الملف urls.py ونضيف نمط الرابط URL pattern للدالة generate_story_from_words كما يلي: urlpatterns = [ # أنماط URL الأخرى... path('generate-story/', views.generate_story_from_words, name='generate-story'), ] الآن يمكننا إرسال الطلبات من خلال نقطة الوصول التالية/generate-story/ باستخدام المتصفح، وإرسال طلب من النوع GET لها وتمرير الكلمات المتوقعة كمعاملات للطلب، نفتح سطر الأوامر ونكتب الأمر curl بالشكل التالي: (env)hasoub-academy@ubuntu:$ curl "http://your_domain/generate-story/?words=قطة,كتاب,حاسوب,شمس,ماء" علينا استبدال http://your_domain بالعنوان الفعلي الذي يستضيف مشروعنا. تمثّل الكلمات الممررة عبر هذا الرابط مثل كتاب، وماء، وحاسوب ما هي الكلمات التي نريد استخدامها لتوليد محتوى القصة. يمكن بالطبع تغيير هذه الكلمات واستخدام كلمات أخرى حسب الحاجة. بعد تشغيل أمر curl يجب أن نرى ردًا من الخادم يحتوي على القصة المولدة استنادًا إلى الكلمات التي قدمناها. (env)hasoub-academy@ubuntu:$ curl "http://your_domain/generate-story/?words="قطة,كتاب,حاسوب,شمس,ماء" وسنحصل على مخرجات قريبة للتالي: { "story": "كان يا مكان، في كوخ صغير مريح يقع وسط غابة كثيفة، قطة فضولية تُدعى 'مشمش' تجلس بجانب النافذة، تستمتع بأشعة الشمس الدافئة. بينما كانت 'مشمش' تحرك ذيلها بكسل، لفت نظرها كتاب مغبر ملقى على رف قريب. بدافع الفضول، قفزت بعناية إلى الرف، مما أدى إلى سقوط مجموعة من الكتب، فتح أحدها ليكشف عن مكان مخفي. داخل هذا المكان، اكتشفت 'مشمش' حاسوبًا قديمًا، بدأ شاشته يومض عندما لمست زر الطاقة. مفتونةً بالشاشة المتوهجة، انطلقت 'مشمش' في عالم من المناظر الافتراضية، حيث تجولت بحرية، تطارد الأسماك الرقمية وتوقف للإعجاب بشلالات رائعة. ضائعة في هذه المغامرة الجديدة، اكتشفت 'مشمش' عجائب العوالم الملموسة والافتراضية معًا، مدركةً أن الاستكشاف الحقيقي لا يعرف حدودًا." } الخلاصة إلى هنا نكون قد وصلنا لنهاية هذا المقال الذي وضحنا فيه الخطوات الأساسية التي نحتاجها لدمج OpenAI modes داخل تطبيق جانغو Django باستخدام الواجهة البرمجية OpenAI API، وتعلمنا طريقة إرسال الطلبات للواجهة البرمجية ChatCompletion API والتحكم بسلوك النموذج عن طريق ضبط معاملاته المختلفة. لتحسين هذا المشروع وزيادة ميزاته، يمكننا استكشاف المزيد من مميزات الواجهة البرمجية OpenAI API وتجريب مُوجِّهات نظام system prompt مختلفة، وقيم معاملات متنوعة حتى نحصل على قصة مميزة وإبداعية. ترجمة-وبتصرٌّف-للمقال How to Integrate OpenAI GPT Models in Your Django Project اقرأ أيضًا إنشاء تطبيق جانغو وتوصيله بقاعدة بيانات مدخل إلى إطار عمل الويب جانغو Django دليلك لربط واجهة OpenAI API مع Node.js استخدام وكلاء مكتبة المحولات Transformers Agents في الذكاء الاصطناعي التوليدي
    2 نقاط
  12. يعد إطار عمل لارافيل Laravel واحدًا من أهم أطر عمل PHP وأكثرها شهرة وقوة، فقد تمكن لارافيل من إثبات جدارته واحتلال مواقع متصدرة بين نظم تطوير تطبيقات الويب لما يتمتع به من ميزات أبرزها توفير الكثير من الوظائف البرمجية الجاهزة التي تجعل تطوير الويب أسهل وأسرع، واهتمامه الخاص بأمن مواقع الويب وحمايتها من الثغرات الأمنية. فإذا كنت تتساءل ما هو لارافيل Laravel وما فوائد استخدامه، وترغب في التعرف على أبرز مميزاته وعيوبه، واكتشاف أفضل المصادر العربية التي تمكنك من تعلم لارافيل واستخدامه في إنشاء مواقع وتطبيقات ويب بميزات متقدمة فهذا المقال لك. ما هو لارافيل Laravel لارافيل Laravel هو إطار عمل مفتوح المصدر مبني على لغة PHP يستخدم لتطوير تطبيقات الويب، طوره تايلور أوتويل Taylor Otwell عام 2011 ليمكّن المطورين من إنشاء تطبيقات ويب متكاملة الميزات بسهولة وسرعة من خلال توفير أكثر المهام والوظائف الشائعة التي يحتاجونها في مشاريع الويب. وإطار العمل Framework هو باختصار بيئة توفر مجموعة من الوظائف والأدوات الجاهزة المكتوبة مسبقًا والتي يستخدمها المبرمجون والمطورون لتسهل عليه عملهم في التطوير وتمكنهم من أداء المطلوب باستخدام أقل قدر من التعليمات البرمجية، وللمزيد من المعلومات أنصح بالاطلاع على مقال تعرف على مفهوم إطار العمل Framework وأهميته في البرمجة لقد عزز إطار العمل لارافيل من قوة لغة PHP وساهم في استمراريتها وديمومتها، حيث أنه وفر للمبرمجين طريقة أكثر كفاءة في التعامل معها وبسّط كتابة تعليماتها المعقدة نوعًا ما وجعل تطوير تطبيقات الويب باستخدامها أسرع وأسهل. إصدارات لارافيل Laravel قبل إصدار لارافيل 9 كان فريق لارافيل يوفر إصدارًا رئيسيًا كل ستة أشهر بمعدل نسختين رئيسيتين سنويًا لتخفيف أعباء الصيانة، لكن تقرر بعد ذلك توفير الإصدارات الجديدة بشكل سنوي. يتطور لارافيل Laravel بسرعة فائقة مع مرور الوقت ويضيف تحسينات وميزات ووظائف جديدة تواكب اتجاهات السوق المتغيرة باستمرار أو يغير بعض الوظائف أو يلغيها لذلك من الضروري معرفة الإصدار الذي تستخدمه في تطوير مشاريعك. وإليك قائمة بأهم إصدارات لارافيل laravel وتاريخ صدورها: أطلق الإصدار الأول لارافيل 1.0 في 9 يونيو/حزيران 2011 توالت بعدها الإصدارات لغاية لارافيل 8 الذي تم إطلاقه في 8 سبتمبر/أيلول 2020 وهو الإصدار العشرين من Laravel ولم تعد كافة هذه الإصدارات تتلقى تحديثات أمنية لذا يفضل أن تتم ترقية التطبيقات المبنية بأحدها لإصدار أحدث لمنع الثغرات الأمنية والوصول إلى الميزات الجديدة. صدر لارافيل 9 بتاريخ 8 فبراير 2022 ويتطلب هذا الإصدار نسخة PHP 8.0 كحد أدنى. صدر لارافيل 10 بتاريخ 7 فبراير 2023 وتضمن العديد من الميزات الجديدة التي تعزز أداء تطبيقات الويب وأمانها ووظائفها ويتطلب هذا الإصدار نسخة 8.1 من لغة PHP كحد أدنى. ومن المتوقع أن يصدر لارافيل 11 في الربع الأول من عام 2024، وللمزيد من التفاصيل يمكنك مطالعة الصفحة التالية لكافة إصدارات لارافيل، والجدير بالذكر أن لارافيل قد أثبت كفاءته لأكثر من عقد من الزمن وتمكن من فرض نفسه كأحد أكثر أطر PHP شيوعًا وتفضيلًا من قبل مطوري الويب بفضل طريقة تنظيمه الأنيقة وميزاته القوية. أهمية إطار لارافيل في سوق العمل يعد لارافيل أحد أشهر أطر عمل PHP وأكثرها استخدامًا ويملك مجتمعًا كبيرًا من المطورين الذين يوفرون الكثير من المكتبات والحزم الجاهزة والمتاحة للاستخدام بسهولة. كما يعد لارافيل أحد المهارات المطلوبة بشدة في سوق العمل، ويبحث الكثير من أرباب العمل عن مطورين محترفين في استخدام إطار العمل لارافيل لتطوير تطبيقاتهم ومواقعهم الإلكترونية ولا عجب في ذلك فهو واحد من أسرع أطر عمل PHP نموًا وأكثرها غنىً بالميزات. وتستخدم العديد من المواقع الكبرى لارافيل في تطوير تطبيقاتها الخاصة،فبحسب موقع builtwith الذي يحدد التقنيات المستخدمة في إنشاء المواقع هناك 1,175,772 موقع ويب مبني باستخدام إطار عمل Laravel ولك أن تتخيل مدى شعبيته. كما يلبي لارافيل كافة متطلبات العمل لكونه يعتمد على لغة PHP العريقة التي تعد واحدة من أقوى لغات البرمجة من جانب الخادم والتي تستخدم في تطوير ملايين المواقع الإلكترونية من بينها مواقع شهيرة مثل فيسبوك وويكيبيديا. فإذا كنت مهتمًا بمجال تطوير الويب فتعلم إطار عمل لارافيل Laravel يوفر لك الكثير من الفرص المميزة في مجال تطوير تطبيقات الويب ويمكنك من إنشاء كافة أنواع التطبيقات والمواقع الإلكترونية سواء المواقع البسيطة للشركات الناشئة منها أو المواقع المتقدمة كمواقع التجارة الإلكترونية بسرعة واحترافية. ويتنافس إطار عمل لارافيل مع أطر عمل تطوير الويب الأخرى في سوق العمل مثل جانغو Django المبني باستخدام لغة البرمجة بايثون Python والتي تعتبر أسرع من لغة PHP وأكثر شعبية منها، وإطار عمل إكسبريس Express المبني باستخدام لغة جافا سكريبت أحد أكثر لغات البرمجة شهرة واستخدامًا بين أوساط المطورين، وإطار عمل ريلز Rails المبني باستخدام لغة البرمجة روبي Ruby المحببة للمبتدئين، تقدم معظم أطر العمل ميزات متشابهة وكي تتمكن من اختيار إطار العمل الأنسب لك عليك أن تأخذ عدة أمور بعين الاعتبار مثل لغة البرمجة التي تفضل تعلمها وطبيعة المشاريع التي تعمل عليها، ولمزيد من التفاصيل حول أشهر أطر عمل تطوير الويب أنصح بمطالعة مقال مقارنة بين Django و Laravel و Rails. مميزات لارافيل Laravel لاشك أن لارافيل Laravel ليس إطار العمل الوحيد المتاح اليوم بل هو واحد من بين عشرات أطر عمل تطوير الويب، وقد تتساءل لماذا أستخدم لارافيل دونًا عن غيره؟ وما الذي يميزه عن غيره من أطر عمل تطوير الويب؟ في الواقع نجد تحيز من قبل المبرمجين لاختيار لارافيل دون غيره نظرًا لما يتمتع به من ميزات، وإليك قائمة بأهم 10 مميزات لإطار لارافيل: سهولة التعلم والاستخدام. تسريع وقت التطوير. التوثيق الجيد. غني بالميزات وقابل للتوسيع. يهتم بأمان التطبيقات. يحسن أداء التطبيقات. يدعم تعدد اللغات. يسهل تصحيح أخطاء التطبيقات وصيانتها. يوفر نظام لتهجير البيانات Migration. يوفر نظام التوجيه Routing. لنناقش كل خاصية من هذه الخواص بمزيد من التفصيل ونكتشف أهميتها في تطوير الويب. 1. سهولة التعلم والاستخدام يتميز لارافيل بكود سهل التعلم والاستخدام، لكنه بالطبع يشترط امتلاك معرفة مسبقة بأساسيات PHP ومبادئ البرمجة كائنية التوجه OOP إلى جانب وجود معرفة جيدة حول HTML وأحد أنظمة إدارة قواعد البيانات مثل MySQL أو PostgreSQL بعدها سيكون تعلم لارافيل أمرًا في غاية البساطة. 2. تسريع وقت التطوير يتضمن لارافيل Laravel العديد من الوظائف التي تسهل على المطور تنفيذ المهام الشائعة مثل عمليات المصادقة authentication، والتوجيه routing، وتهجير قواعد البيانات migrating، والتخزين المؤقت cach، فكل هذه الوظائف مضمنة ومدمجة في نظام لارافيل وجاهزة لتستخدمها بكل سهولة. كما يتضمن واجهة سطر أوامر مدمجة تسمى آرتيزان Artisan توفر مجموعة من الأوامر المفيدة في بناء تطبيقات الويب، وبالجمع بين أوامر آرتيزان والوظائف المضمنة تصبح عملية تطوير تطبيقات الويب أسرع بكثير. 3. التوثيق الجيد يحتوي لارافيل Laravel على توثيق مميز عبر الإنترنت يساعد المطورين والمبرمجين في تعلم كل ما يحتاجونه والعثور على إجابات لكافة تساؤلاتهم حول التعامل مع هذا الإطار، كما تتوفر معلومات هائلة متاحة من مجتمع مطوري لارافيل. المشكلة الوحيدة التي توجد في هذه المصادر هو أنها متاحة باللغة الإنجليزية وشرحها جامد إلى حد ما، وفي فقرة تعلم لارافيل سأطلعك على مصادر عربية جيدة تساعدك في تعلم لارافيل. 4. غني بالميزات وقابل للتوسيع يعد لارافيل نظامًا قويًا وغنيًا بالكثير من الميزات المضمنة ويوفر مجموعة متنوعة من المكتبات المضمنة التي تساعدك على بناء تطبيقات متقدمة تعالج ملايين الطلبات بفضل دعمه للتخزين المؤقت السريع والتخزين الموزع، كما يوفر لارافيل منصات سحابية خفية الخوادم Serverless مثل Laravel Forge و Vapor تمكنك من نشر التطبيقات وتشغيلها دون الحاجة إلى إدارة الخوادم وهي منصات قابلة للتوسيع التلقائي بكل سهولة. أضف إلى ذلك يوفر مطوروا لارافيل الكثير من الحزم الخارجية لأي وظيفة أو ميزة تحتاجها، على سبيل المثال يمكنك باستخدام مكتبة Socialite تضمين ميزة تسجيل الدخول إلى موقعك باستخدام حسابات شبكات التواصل الاجتماعي على فيسبوك أو تويتر أو لينكدإن أو جيتهب أو جوجل بكل سهولة. 5. يهتم بأمان التطبيقات يمكنك لارافيل من تطوير مواقع وتطبيقات آمنة بفضل العديد من ميزات الأمان المدمجة مثل نظام المصادقة أو الاستيثاق المدمج authentication system ونظام المصادقة authorization والتحقق من صحة البيانات data validation وتشفير البيانات والتحقق من البريد الإلكتروني وإعادة تعيين كلمة المرور، كما يسهل عليك تكوين ميزات الأمان المتقدمة التي تحمي تطبيقاتك من الاختراق وتضمن أمان بيانات عملائك. 6. يحسن أداء التطبيقات يوفر لارافيل عدة طرق لتحسين سرعة التطبيقات وتحسين أدائها مثل دعم التخزين المؤقت لموقعك الإلكتروني على الخادم، كما أنه يسهل تنفيذ تقنيات أخرى لتحسين السرعة مثل تقليل استخدام الذاكرة وفهرسة قاعدة البيانات. فإذا كانت سرعة الموقع أولوية لديك فإن لارافيل خيارك الأنسب. 7. يدعم تعدد اللغات فمن خلال ميزة التوطين localization يمكنك لارافيل من إنشاء تطبيقات متعددة اللغات واسترداد السلاسل النصية بلغات مختلفة، وهو يدعم عدة لغات من بينها اللغة العربية. 8. يسهل تصحيح أخطاء التطبيقات وصيانتها يحتوي لارافيل على ميزات تختبر كل جزء من موقع الويب الخاص بك للبحث عن أي أخطاء ويعرض لك رسائل واضحة ومفصلة تبين كافة الأخطاء التي تحدث في موقعك ويسهل عليك تصحيحها، كما أنه يسهل صيانة التطبيقات بفضل ميزات الكود النظيف واعتماد مبادئ البرمجة كائنية التوجه OOP ومعمارية MVC التي تنظم الكود وتمكن أي مطور من متابعة العمل على مشروع سابق وتطويره وإضافة الميزات المطلوبة له. 9.يوفر نظام تهجير البيانات Migration يوفر لارافيل ميزة تهجير البيانات Migration التي توفر آليات لإنشاء وتعديل جداول قاعدة البيانات كما يوفر آلية شبيهة بنظام التحكم في الإصدارات لقاعدة البيانات الخاصة بك تتعقب كيفية تعديل قاعدة البيانات مع الوقت وتسمح لكافة أعضاء فريق التطوير بتعديل قاعدة بيانات المشروع ومشاركته فيما بينهم وتسهل حذف قاعدة البيانات وإعادة إنشائها عند الضرورة. وللمزيد من التفاصيل حول هذه الميزة يمكنك مطالعة مقال تهجير قواعد البيانات في لارافيل 5 10. يوفر نظام التوجيه Routing يوفر لارافيل نظام توجيه Routing قوي لمعالجة وإدارة مسارات تطبيق الويب ويُمكِّنك من الانتقال من مكان لآخر في تطبيقك وتبادل المعلومات بينها بسهولة، كما يمكّنك من استخدام أسماء بسيطة ترتبط بأجزاء مختلفة من تطبيقك بدلاً من الأسماء الطويلة والمربكة، ستجد كافة المسارات الخاصة بالتطبيق في الملف web.php ضمن المجلد routes لمشروعك وللمزيد من التفاصيل يمكنك الاطلاع على توثيق التوجيه Routing في لارافيل. عيوب لارافيل Laravel لا تخلو أي تقنية مهما كانت متقدمة من بعض العيوب ومن بينها لارافيل، فهو يملك بعض جوانب النقص وإليك قائمة بأبرز عيوب لارافيل: يعتبر إطار عمل لارافيل بطيئًا نسبيًا عند مقارنته ببعض أطر تطوير الويب الأخرى. رغم كونه آمنًا بشكل كبير إلا أنه لا يزال مهددًا باستهدافه بالثغرات الأمنية بسبب اعتماده على PHP التي وسمت بكثرة الثغرات الأمنية فيها تحديدًا في الإصدارات القديمة منها. تكلفته عالية فالمواقع المطورة بإطار لارافيل قد تكون أغلى نسبيًا من المواقع المطورة بغيرها من تقنيات الويب كأنظمة إدارة المحتوى أو أطر العمل الأخرى وهذا رغم كونه عامل قوة لك كمطور لكنه قد يجعل بعض العملاء يفضلون الخيارات الأرخص. وجود تحديثات متكررة قد يجعلك تواجه صعوبات في تعلم الجديد في كل إصدار وتعديل شيفرة تطبيقاتك المطورة بإصدارات قديمة لذا يجب أن تكون لديك رغبة مستمرة في التعلم كي تتلاءم مع كل إصدار جديد. كانت هذه قائمة بأبرز عيوب أو سلبيات لارافيل Laravel، وبموازنة السلبيات والإيجابيات يمكن أن تقرر فيما إذا كان إطار لارافيل سيلبي احتياجاتك أم لا. تنظيم الكود في لارافيل Laravel يتميز إطار لارافيل Laravel بكود منظم وسهل الصيانة يحافظ على تنظيم مشاريعك البرمجة من خلال استخدامه معمارية MVC وهي اختصار لثلاث كلمات هي: النموذج Model الذي يعني بيانات التطبيق فهو يتفاعل مباشرة مع قاعدة البيانات الخاصة بك ويسترد المعلومات منها. العرض View الذي يعني واجهة التطبيق فهو يعرض الصفحات التي يتفاعل معها المستخدم مباشرة. المتحكم Controller وهو صلة الوصل بين العرض والنموذج فهو يستقبل طلبات المستخدمين ويسترد البيانات المطلوبة من النموذج ويعالجها ويرسلها إلى صفحات العرض. وباستخدام هذا الأسلوب التنظيمي يستطيع لارافيل فصل كود التطبيق إلى ثلاث مجموعات لكل منها وظيفة محددة وهي الواجهة الخلفية والواجهة الأمامية ووحدة التحكم للربط بين الواجهتين وهذه الميزة تجعل من لارافيل أفضل إطار عمل PHP لتطبيقات الويب. بالإضافة إلى ذلك يستخدم لارافيل المسارات routes لتعيين عناوين URL الخاصة بإجراءات متحكم معين، فعندما يقوم المستخدم بإدخال عنوان URL خاص بالتطبيق يعين المسار المرتبط بهذا العنوان عنوان URL للمتحكم المسؤول عن استرداد البيانات المطلوبة من قاعدة البيانات أو النموذج ويمررها إلى صفحات العرض النهائية. كيف أتعلم لارافيل Laravel؟ بعد أن تعرفنا على إطار عمل لارافيل وأهم مميزاته واستخداماته، سنوضح لك في هذه الفقرة طريقة تعلم لارافيل وأهم الخطوات التي عليك اتباعها كي تحترفه. قبل أن تبدأ بتعلم لارافيل يجب أن تكون على دراية بأساسيات تطوير الويب والمفاهيم الأساسية في HTML و CSS. يجب أن تتعلم أساسيات البرمجة بلغة PHP وتتمكن من كتابة برامج PHP بسيطة وتعرف كذلك مبادئ البرمجة كائنية التوجه OOP. تعلم المكونات الأساسية لإطار عمل لارافيل ومعمارية MVC ومفاهيم النماذج وصفحات العرض والمتحكمات من خلال مصادر التعلم التي تفضلها سواء كانت مواقع الإنترنت أو الكتب أو الدورات التعليمية واحرص على تحديد خطة للتعلم والتزم بها كي تحقق أهدافك. طور مشاريع تطبق فيها ما تعلمته، فالتطبيق العملي طريقة رائعة لتعلم المفاهيم التي تعلمتها، ابدأ بمشروع بسيط ثم انتقل إلى مشاريع أكثر تقدمًا فهذا يساعدك على إنشاء معرض أعمال يعزز مسيرتك المهنية. لا تتوقف عن التعلم واطلع على كل جديد في مجال تطوير الويب عمومًا وإطار لارافيل على وجه الخصوص، فالتقنيات تتطور بسرعة والتعلم المستمر يساعدك على التكيف مع أي تطور جديد والبقاء في الصدارة. مصادر تعلم لارافيل Laravel إذا كنت تبحث عن مصدر عربي موثوق لتعلم لارافيل من الصفر للاحتراف بشهادة معتمدة تعزز فرصتك في سوق العمل ستجد في أكاديمية حسوب دورة تطوير تطبيقات الويب باستخدام لغة PHP وهي دورة تدريبية عالية الجودة تضم مسارات متعددة ولا تتطلب منك أي معرفة مسبقة وتعلمك كل ما يخص لغة PHP وإطار عملها لارافيل وتدمج بين الشرح النظري والتطبيق العملي، فمن خلالها ستتعلم تطوير العديد من تطبيقات الويب المتكاملة وتبني من خلالها معرض أعمال قوي، كما ستتمكن من خلال هذه الدورة من التواصل مع مدربين أكفاء وطرح أي سؤال أو مشكلة تواجهك عند تطبيق مشروعك البرمجي. كما ستجد في أكاديمية حسوب الكثير من مصادر التعلم المجانية مثل المقالات والدروس المتنوعة حول PHP وحول إطار عمل لارافيل Laravel، وبالإضافة لكل ما سبق فقد ترجمت موسوعة حسوب توثيق لارافيل الأجنبي إلى اللغة العربية ويمكنك من خلاله أن تتعرف على كل ما يخص هذا الإطار بتسلسل منظم وواضح. تنصيب لارافيل Laravel كي تتمكن من التعامل مع مشاريع لارافيل في حاسوبك المحلي عليك اتباع مجموعة من الخطوات وهي كالتالي: أول خطوة قبل البدء بتثبيت لارافيل Laravel على جهازك المحلي هي تحويل حاسوبك إلى خادم ويب محلي كي يتمكن من تشغيل PHP و نظام إدارة قواعد البيانات مثل MySQL أو PostgreSQL، يمكنك القيام بذلك باستخدام XAMPP المتوافق مع كافة أنظمة التشغيل. عليك كذلك تثبيت أي محرر أكواد أو بيئة تطوير متكاملة IDE ترغب بها لتحرير أكواد مشروعك مثل PhpStorm أو Visual Studio Code أو أي محرر آخر تتآلف معه. بعدها عليك تثبيت مدير الحزم كومبوزر Composer لتحميل إطار لارافيل من خلاله، وهو ضروري لتحديد المكتبات التي يحتاجها مشروعك بكل سهولة وإدارتها بالنيابة عنك. وللمزيد يمكنك مطالعة مقال ما هو Composer ولماذا يجب على كل مطور PHP استخدامه. الآن يمكنك تثبيت لارافيل على جهازك، وأبسط طريقة لتحميل لارافيل هي تشغيل محرر الأوامر في نظامك والانتقال للمسار الذي تريد إنشاء مشروع لارافيل الخاص بك فيه ثم كتابة الأمر التالي، هنا أنشأنا مشروع لارافيل باسم example-app composer create-project laravel/laravel example-app لتشغيل المشروع انتقل إلى مجلد مشروعك وهو في حالتنا D:\example-app ونفذ الأمر التالي: D:\cd example-app D:\example-app>php artisan serve هذا الأمر سيشغل تطبيق لارافيل على خادم تطوير PHP وينتج عن تنفيذه عرض رابط المشروع بالشكل التالي http://127.0.0.1:8000، كل ما عليك هو نسخ هذا الرابط ولصقه في المستعرض لتظهر لك الصفحة الرئيسية لموقع لارافيل الخاص بك كما هو موضح في الصورة التالية. ولإيقاف تشغيل خادم التطوير من خلال سطر الأوامر اضغط على مفتاحي Ctrl+C في لوحة المفاتيح. ولمزيد من المعلومات حول تثبيت لارافيل يمكنك مطالعة مقال تثبيت وإعداد لارافيل Laravel على دوكر كومبوز Docker Compose ومقال تثبيت Laravel 5 وإعداده على Windows وUbuntu. أخيرًا أنصحك أن تفتح مشروع في محرر الشيفرات الذي اخترته وتتعرف على بنية المجلدات في Laravel وتفهم دورها في المشروع ومساهمتها في نموذج MVC المستخدم في إطار العمل لارافيل. هذا كل شيء! أنت جاهز الآن لتبدأ رحلتك في اكتشاف لارافيل والبدء بتعلمه. الخلاصة اكتشفنا في مقال اليوم ما هو إطار عمل لارافيل Laravel وأهميته في سوق العمل، وتعرفنا على أهم المميزات التي يقدمها في مجال تطوير مواقع وتطبيقات الويب، كما تعرفنا على كيفية تنصيب لارافيل وبدء التعامل معه وأهم مصادر تعلمه. وسواء كنت مطورًا مبتدئًا أو خبيرًا في برمجة تطبيقات الويب فإن لارافيل Laravel خيار مناسب لك تمامًا فهو يوفر لك بيئة تطوير سهلة وقوية ويقدم لك الكثير من الميزات والوظائف المبرمجة مسبقًا التي تمكنك من بناء تطبيقات ويب احترافية وعالية الجودة بسرعة وسهولة. لا تتردد وابدأ من اليوم بتعلم لارافيل وإن اعترضك أي سؤال حوله شاركنا إياه في قسم التعليقات أسفل المقال. اقرأ أيضًا دليل مطوّري PHP للبدء في بناء تطبيقات Laravel - الجزء الأوّل دليل مطوّري PHP للبدء في بناء تطبيقات Laravel - الجزء الثاني رفع الملفّات وإدارتها في تطبيقات Laravel تجريد إعداد قواعد البيانات في لارافيل باستعمال عملية التهجير Migration والبذر Seeder لارافيل للمبتدئين-الجزء الأول: البدء في إنشاء مدونة بسيطة
    2 نقاط
  13. يمكن أن تخدع صيغة بايثون البسيطة وسهلة التعلم مطوري لغة بايثون Python وخاصة الجدد منهم، مما يؤدي إلى تفويت بعض التفاصيل الدقيقة والتقليل من قوة اللغة، لذا سنقدّم في هذا المقال قائمة بأكثر 10 أخطاء شيوعًا، والتي تكون دقيقة ويصعب اكتشافها ويمكن أن تخدع حتى مطور بايثون الأكثر تقدمًا. مقدمة إلى بايثون تُعَد بايثون لغة برمجة مُفسَّرة Interpreted وكائنية التوجّه Object-oriented وعالية المستوى ولها دلالات Semantics ديناميكية، وتجعل هياكلُ البيانات المُضمَّنة عالية المستوى، والتحقق الديناميكي من الأنواع، والربط الديناميكي من لغة بايثون جذابة للغاية لتطوير التطبيقات بسرعة، بالإضافة إلى استخدامها بوصفها لغة برمجة لكتابة السكربتات أو لغة لاصقة Glue Language لوصل المكونات أو الخدمات الموجودة مسبقًا مع بعضها البعض. كما تدعم لغة بايثون الوحدات والحزم، وبالتالي تشجع التقسيم إلى وحدات Modularity وإعادة استخدام الشيفرة البرمجية. ملاحظة: هذا المقال مخصَّص للمبرمجين المحترفين في بايثون، وليس موجَّهًا للمطورين الجدد الذين قد يكونون أقل دراية بأخطاء بايثون الشائعة. الخطأ 1: استخدام التعابير بوصفها قيمًا افتراضية لوسطاء الدوال بطريقة خاطئة تسمح لغة بايثون بتحديد وسيط الدالة بأنه اختياري من خلال توفير قيمة افتراضية له، ولكن قد تؤدي هذه الميزة إلى بعض الارتباك عندما تكون القيمة الافتراضية متغيرة بالرغم من أن هذه ميزة رائعة لهذه اللغة. إليك تعريف دالة بايثون التالي مثلًا: >>> def foo(bar=[]): # يُعد الوسيط‫ bar اختياريًا وقيمته الافتراضية هي [] عند عدم تحديدها ... bar.append("baz") # ولكن يمكن أن يسبّب هذا السطر مشكلة كما سنرى لاحقًا‫... ... return bar من الأخطاء الشائعة أن نعتقد أن الوسيط الاختياري مضبوط على التعبير الافتراضي المحدَّد في كل مرة تُستدعَى فيها الدالة دون توفير قيمة لهذا الوسيط الاختياري، فمثلًا قد نتوقع في الشيفرة البرمجية السابقة أن استدعاء الدالة foo()‎ بصورة متكررة (أي بدون تحديد الوسيط bar) سيؤدي دائمًا إلى إعادة القيمة 'baz'، بما أننا اعتقدنا أن الوسيط bar مضبوط على القيمة [] (أي قائمة فارغة جديدة) في كل مرة نستدعي فيها الدالة foo()‎ (بدون تحديد الوسيط bar)، ولكن لنلقِ نظرة على ما يحدث فعليًا: >>> foo() ["baz"] >>> foo() ["baz", "baz"] >>> foo() ["baz", "baz", "baz"] لاحظ استمرار إلحاق القيمة الافتراضية "baz" إلى القائمة الموجودة مسبقًا في كل مرة نستدعي فيها الدالة foo()‎ بدلًا من إنشاء قائمة جديدة في كل مرة، إذ تُقيَّم القيمة الافتراضية لوسيط الدالة مرة واحدة فقط في وقت تعريف الدالة، وبالتالي يُهيَّأ الوسيط bar على قيمته الافتراضية (أي قائمة فارغة) عند تعريف الدالة foo()‎ لأول مرة فقط، ولكن ستستمر بعد ذلك استدعاءات الدالة foo()‎ (بدون تحديد الوسيط bar) في استخدام القائمة نفسها التي هيّأنا بها الوسيط bar في الأصل. الحل الشائع لهذه المشكلة هو ما يلي: >>> def foo(bar=None): ... if bar is None: # ‫أو if not bar:‎‫ ... bar = [] ... bar.append("baz") ... return bar ... >>> foo() ["baz"] >>> foo() ["baz"] >>> foo() ["baz"] الخطأ 2: استخدام متغيرات الصنف Class استخدامًا خاطئًا ليكن لدينا المثال التالي: >>> class A(object): ... x = 1 ... >>> class B(A): ... pass ... >>> class C(A): ... pass ... >>> print A.x, B.x, C.x 1 1 1 وبالتالي سيكون لدينا أيضًا ما يلي كما هو متوقع: >>> B.x = 2 >>> print A.x, B.x, C.x 1 2 1 ولكن سيكون لدينا ما يلي: >>> A.x = 3 >>> print A.x, B.x, C.x 3 2 3 لاحظ تغيير قيمة C.x بالرغم من أننا غيرنا قيمة A.x فقط، حيث تُعامَل متغيرات الصنف داخليًا على أنها قواميس في لغة بايثون وتتبع ما يشار إليه غالبًا باسم ترتيب تحليل التوابع أو ترتيب استبيان التوابع Method Resolution Order -أو MRO اختصارًا وهو الآلية التي تستخدمها لغات البرمجة ومن ضمنها بايثون لتحديد ترتيب البحث عن التوابع في التسلسل الهرمي hierarchy الخاص بالكائنات في حالة استخدام الوراثة المتعددة، أي أنه يحدد المسار الذي سيتبعه البرنامج عند محاولة استدعاء دالة معينة موجودة في أكثر من صنف أو الوراثة من عدة أصناف. لذلك سنبحث عن السمة Attribute التي هي x في أصنافها الأساسية (أي الصنف A فقط في المثال السابق بالرغم من أن لغة بايثون تدعم الوراثة المتعددة) بما أننا لم نعثر على هذه السمة في الصنف C. يمكن القول أيضًا أن الصنف C ليس لديه الخاصية x الخاصة به والمستقلة عن الصنف A، وبالتالي لا يُعَد المرجع إلى C.x هو المرجع نفسه إلى A.x، ويؤدي ذلك إلى حدوث مشكلة في بايثون إن لم نتعامل معها بطريقة صحيحة. الخطأ 3: تحديد المعاملات لكتلة الاستثناء Exception بطريقة خاطئة لنفترض أن لدينا الشيفرة البرمجية التالية: >>> try: ... l = ["a", "b"] ... int(l[2]) ... except ValueError, IndexError: # لالتقاط الاستثناءَين ... pass ... Traceback (most recent call last): File "<stdin>", line 3, in <module> IndexError: list index out of range المشكلة في المثال السابق هي أن تعليمة except لا تأخذ قائمة الاستثناءات المُحدَّدة بهذه الطريقة، حيث تستخدم بايثون الصيغة except Exception, e لربط الاستثناء بالمعامل الثاني الاختياري المُحدَّد (هو e في هذه الحالة)، وبالتالي يمكن إتاحته لمزيد من الفحص. لم تلتقط التعليمة except الاستثناء IndexError، بل يُربَط الاستثناء بمعاملٍ اسمه IndexError، وتُعَد مثل هذه الأخطاء شائعة في شيفرة بايثون البرمجية. الطريقة الصحيحة لالتقاط الاستثناءات المتعددة في التعليمة except هي تحديد المعامل الأول بوصفه مجموعة Tuple تحتوي على جميع الاستثناءات المُلتقَطة. يمكن تحقيق أقصى قدر من قابلية النقل من خلال استخدام الكلمة المفتاحية as لأن هذه الصيغة تدعمها Python 2 و Python 3: >>> try: ... l = ["a", "b"] ... int(l[2]) ... except (ValueError, IndexError) as e: ... pass ... >>> الخطأ 4: سوء فهم قواعد نطاق Scope بايثون يعتمد تحليل Resolution نطاق بايثون على قاعدة LEGB، وهي اختصار للكلمات محلي ‎Local وشامل ‎Enclosing وعام ‎Global ومُضمَّن ‎Built-in. توجد بعض التفاصيل الدقيقة للطريقة التي تعمل بها هذه القاعدة في بايثون، مما يقودنا إلى مشكلة برمجة بايثون الشائعة الأكثر تقدمًا التالية، فليكن لدينا ما يلي مثلًا: >>> x = 10 >>> def foo(): ... x += 1 ... print x ... >>> foo() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in foo UnboundLocalError: local variable 'x' referenced before assignment يحدث الخطأ السابق لأنه إذا أسندتَ قيمة إلى متغير في نطاقٍ ما، فستَعُد لغة بايثون هذا المتغير متغيرًا محليًا لذلك النطاق تلقائيًا وتظلّل أيّ متغير يحمل الاسم نفسه في أيّ نطاق خارجي. يتفاجأ الكثير من المبرمجين بالحصول على الخطأ UnboundLocalError في الشيفرة البرمجية التي عملت بنجاح سابقًا عند تعديلها من خلال إضافة تعليمة إسناد في مكانٍ ما من جسم الدالة، فمن الشائع أن يؤدي ذلك إلى أن يخطئ المطورون عند استخدام القوائم خاصةً كما في المثال التالي: >>> lst = [1, 2, 3] >>> def foo1(): ... lst.append(5) # تعمل هذه التعليمة بنجاح ... >>> foo1() >>> lst [1, 2, 3, 5] >>> lst = [1, 2, 3] >>> def foo2(): ... lst += [5] # ولكن تعطي هذه التعليمة خطأً ... >>> foo2() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in foo UnboundLocalError: local variable 'lst' referenced before assignment لاحظ أن الدالة foo1 تعمل بنجاح بينما تعطي الدالة foo2 خطأ، والسبب في ذلك هو مماثل لمشكلة المثال السابق ولكنه أكثر دقة، حيث لا تسند الدالة foo1 قيمة إلى المتغير lst على عكس الدالة foo2، فالتعليمة lst += [5]‎ هي مجرد اختصار للتعليمة lst = lst + [5]‎ التي تمثّل محاولة إسناد قيمة إلى المتغير lst، وبالتالي تفترض لغة بايثون أن هذا المتغير موجود في النطاق المحلي، ولكن تعتمد القيمة التي نريد إسنادها إلى المتغير lst على المتغير lst نفسه الذي يُفترَض وجوده في النطاق المحلي ولم نعرّفه بعد. الخطأ 5: تعديل القائمة أثناء المرور عليها يجب أن تكون مشكلة الشيفرة البرمجية التالية واضحة إلى حدٍ ما: >>> odd = lambda x : bool(x % 2) >>> numbers = [n for n in range(10)] >>> for i in range(len(numbers)): ... if odd(numbers[i]): ... del numbers[i] # تصرف سيء: حذف عنصر من القائمة أثناء المرور عليها ... Traceback (most recent call last): File "<stdin>", line 2, in <module> IndexError: list index out of range يُعَد حذف عنصر من قائمة أو مصفوفة أثناء المرور عليها مشكلةً معروفةً جيدًا في بايثون لمطوري البرمجيات أصحاب الخبرة، ولكن بالرغم من أن المثال السابق قد يكون واضحًا إلى حدٍ ما، إلّا أنه يمكن أن يرتكب حتى المطورون المتقدمون عن غير قصد هذا الخطأ في الشيفرة البرمجية الأكثر تعقيدًا. لحسن الحظ، تتضمن لغة بايثون عددًا من نماذج البرمجة الأنيقة التي يمكن أن تؤدي إلى شيفرة برمجية مبسطة ومنظَّمة بصورة كبيرة عند استخدامها استخدامًا صحيحًا، ممّا يقلل من احتمالية وجود خطأ الحذف غير المقصود لعنصر القائمة أثناء المرور عليها في هذه الشيفرة البرمجية الأبسط. أحد هذه النماذج هو نموذج استيعاب القوائم List Comprehensions الذي يُعَد مفيدًا خاصةً لتجنب هذه المشكلة كما هو موضّح في التطبيق البديل التالي للشيفرة البرمجية السابقة والذي يعمل بطريقة مثالية: >>> odd = lambda x : bool(x % 2) >>> numbers = [n for n in range(10)] >>> numbers[:] = [n for n in numbers if not odd(n)] # الحل هنا >>> numbers [0, 2, 4, 6, 8] الخطأ 6: عدم وضوح كيفية ربط Bind بايثون للمتغيرات في المنغلقات Closures ليكن لدينا المثال التالي: >>> def create_multipliers(): ... return [lambda x : i * x for i in range(5)] >>> for multiplier in create_multipliers(): ... print multiplier(2) ... قد نتوقع الخرج التالي للشيفرة البرمجية السابقة: 0 2 4 6 8 لكننا سنحصل على ما يلي: 8 8 8 8 8 يحدث ذلك بسبب سلوك الربط المتأخر Late Binding لبايثون الذي يبحث عن قيم المتغيرات المُستخدَمة في المنغلقات Closures في وقت استدعاء الدالة الداخلية، لذلك إذا استدعينا أيًا من الدوال المُعادة في المثال السابق، فسيُجرَى البحث عن قيمة المتغير i في النطاق المحيط في وقت استدعائها، حيث ستكون الحلقة قد اكتملت عندها، لذلك أُسنِدت القيمة 4 إلى المتغير i فعليًا. ويكون حل هذه المشكلة الشائعة في بايثون كما يلي: >>> def create_multipliers(): ... return [lambda x, i=i : i * x for i in range(5)] ... >>> for multiplier in create_multipliers(): ... print multiplier(2) ... 0 2 4 6 8 استفدنا من الوسطاء الافتراضية لإنشاء دوال مجهولة لتحقيق السلوك المطلوب. قد يَعُد البعض هذه الطريقة مناسبة، وقد يَعدها البعض رائعة، وقد يكرهها البعض الآخر، ولكن من المهم أن تفهمها إذا كنت مطور بايثون. الخطأ 7: إنشاء اعتماديات Dependencies الوحدات الدائرية لنفترض أن لدينا الملفان a.py و b.py، حيث يستورد كلّ منهما الآخر كما يلي: في الملف a.py: import b def f(): return b.x print f() وفي الملف b.py: import a x = 1 def g(): print a.f() أولًا، لنحاول استيراد الوحدة a.py كما يلي: >>> import a 1 لاحظ أن عملية الاستيراد نجحت، وقد يكون ذلك مفاجأة لك، فلدينا استيراد دائري هنا والذي يُفترَض أن يمثل مشكلة، أليس كذلك؟ ولكن لا يمثّل مجرد وجود استيراد دائري في حد ذاته مشكلة في بايثون، فلغة بايثون ذكية بما يكفي لعدم محاولة إعادة استيراد وحدة إذا كانت مستوردةً فعليًا، ولكنك قد تواجه مشكلات اعتمادًا على النقطة التي تحاول فيها كل وحدة الوصول إلى الدوال أو المتغيرات المُعرَّفة في الوحدة الأخرى. لم يكن هناك مشكلة في استيراد الوحدة b.py لأنها لا تتطلب تعريف أيّ شيء من الوحدة a.py في وقت استيرادها عندما استوردنا الوحدة a.py في المثال السابق، فالإشارة الوحيدة إلى الوحدة a في الملف b.py هو استدعاء الدالة a.f()‎، ولكن هذا الاستدعاء موجود في الدالة g()‎ ولا يوجد شيء في الملفين a.py أو b.py يستدعي الدالة g()‎، لذا لا يوجد شيء يدعو للقلق. ولكن إذا حاولنا استيراد الوحدة b.py دون استيراد الوحدة a.py مسبقًا كما يلي: >>> import b Traceback (most recent call last): File "<stdin>", line 1, in <module> File "b.py", line 1, in <module> import a File "a.py", line 6, in <module> print f() File "a.py", line 4, in f return b.x AttributeError: 'module' object has no attribute 'x' فستظهر مشكلة تتمثّل في أن الوحدة b.py تحاول استيراد الوحدة a.py عند عملية استيراد الوحدة b.py، وتستدعي الوحدة a.py بدورها الدالة f()‎ التي تحاول الوصول إلى المتغير b.x الذي لم نعرّفه بعد، وبالتالي سيظهر الاستثناء AttributeError. توجد حلول مختلفة لهذا الخطأ، وسيكون أحد هذه الحلول على الأقل بسيطًا، فمثلًا عدّل الوحدة b.py لتستورد الوحدة a.py ضمن الدالة g()‎: x = 1 def g(): import a # ستُقيَّم هذه التعليمة عند استدعاء الدالة‫ g()‎ فقط print a.f() وإذا استوردناه هذه الوحدة، فسيكون كل شيء على ما يرام كما يلي: >>> import b >>> b.g() 1 # يُطبَع لأول مرة بسبب استدعاء الوحدة‫ 'a' للتعليمة 'print f()‎' في النهاية 1 # يُطبَع مرة ثانية، حيث يمثّل استدعاء الدالة‫ 'g' الخطأ 8: تعارض الأسماء مع وحدات مكتبة بايثون المعيارية تتميز لغة بايثون بوفرة وحدات المكتبات التي تأتي معها، ولكن قد يؤدي ذلك إلى الوقوع في تعارض في الأسماء بين اسم إحدى الوحدات الخاصة بك ووحدة أخرى تحمل الاسم نفسه في المكتبة المعيارية التي تأتي مع لغة بايثون إن لم تكن حذرًا، فمثلًا قد يكون لديك وحدة بالاسم email.py في شيفرتك البرمجية، والتي قد تتعارض مع وحدة المكتبة المعيارية التي تحمل الاسم نفسه. يمكن أن يؤدي ذلك إلى مشكلات خطيرة مثل استيراد مكتبة أخرى، والتي تحاول بدورها استيراد إصدارٍ من وحدة خاصة بمكتبة بايثون المعيارية، ولكن إذا كان لديك وحدة تحمل الاسم نفسه، فستستورد الحزمة الأخرى الإصدار الخاص بك عن طريق الخطأ بدلًا من الإصدار الموجود في مكتبة بايثون المعيارية، مما يؤدي إلى حدوث أخطاء، لذا يجب توخي الحذر لتجنب استخدام الأسماء نفسها الخاصة بوحدات مكتبة بايثون المعيارية. من الأسهل بالنسبة لك تغيير اسم الوحدة ضمن الحزمة الخاصة بك بدلًا من تقديم اقتراح تحسين بايثون Python Enhancement Proposal -أو PEP اختصارًا- لطلب تغيير الاسم ومحاولة الحصول على الموافقة على ذلك. الخطأ 9: الفشل في معالجة الاختلافات بين الإصدارين Python 2 و Python 3 ليكن لدينا الملف foo.py التالي مثلًا: import sys def bar(i): if i == 1: raise KeyError(1) if i == 2: raise ValueError(2) def bad(): e = None try: bar(int(sys.argv[1])) except KeyError as e: print('key error') except ValueError as e: print('value error') print(e) bad() يعمل ما يلي بنجاح في Python 2: $ python foo.py 1 key error 1 $ python foo.py 2 value error 2 ولكنه يعطي خطأً في Python 3 كما يلي: $ python3 foo.py 1 key error Traceback (most recent call last): File "foo.py", line 19, in <module> bad() File "foo.py", line 17, in bad print(e) UnboundLocalError: local variable 'e' referenced before assignment المشكلة هي أنه لا يمكن الوصول إلى كائن الاستثناء خارج نطاق كتلة التعليمة except في Python 3، وإلّا فيجب الاحتفاظ بدورة مرجعية مع إطار المكدس في الذاكرة حتى تشغيل كانس المهملات Garbage Collector وإزالة المراجع من الذاكرة. إحدى الطرق لتجنب هذه المشكلة هي الاحتفاظ بمرجع إلى كائن الاستثناء خارج نطاق كتلة التعليمة except بحيث يبقى قابلًا للوصول. إليك فيما يلي نسخة من المثال السابق الذي يستخدم هذه التقنية، وبالتالي ستنتج شيفرة برمجية متوافقة مع Python 2 و Python 3: import sys def bar(i): if i == 1: raise KeyError(1) if i == 2: raise ValueError(2) def good(): exception = None try: bar(int(sys.argv[1])) except KeyError as e: exception = e print('key error') except ValueError as e: exception = e print('value error') print(exception) good() لنشغّل هذه الشيفرة البرمجية على الإصدار Py3k: $ python3 foo.py 1 key error 1 $ python3 foo.py 2 value error 2 اطّلع على مقال كيفية ترحيل شيفرة بايثون 2 إلى بايثون 3 لمزيد من المعلومات. الخطأ 10: استخدام التابع del بطريقة خاطئة لنفترض أن لدينا ما يلي في ملفٍ اسمه mod.py: import foo class Bar(object): ... def __del__(self): foo.cleanup(self.myhandle) ثم حاولنا استيراده من الملف another_mod.py كما يلي: import mod mybar = mod.Bar() فسنحصل على الاستثناء AttributeError، والسبب هو ضبط جميع متغيرات الوحدة العامة على القيمة None عند إيقاف تشغيل المفسّر Interpreter، لذلك ضُبِط الاسم foo على القيمة None عند استدعاء التابع __del__ في المثال السابق. الحل لهذه المشكلة هو استخدام الدالة atexit.register()‎ بدلًا من ذلك، وبالتالي ستُشغَّل معالجاتك المسجَّلة قبل إيقاف تشغيل المفسِّر عندما ينتهي برنامجك من التنفيذ (أي عند الخروج منه بطريقة طبيعية). إذًا لنصلِح شيفرة mod.py البرمجية السابقة كما يلي: import foo import atexit def cleanup(handle): foo.cleanup(handle) class Bar(object): def __init__(self): ... atexit.register(cleanup, self.myhandle) يوفّر هذا المثال طريقة نظيفة وموثوقة لاستدعاء أيّ دالة تنظيف مطلوبة عند إنهاء البرنامج العادي، ومن الواضح أن الأمر متروك للدالة foo.cleanup لتحديد ما يجب فعله بالكائن المرتبط بالاسم self.myhandle. مخاطر بايثون يمكن تجنبها من خلال معرفة الفروق الأساسية تُعَد بايثون لغة قوية ومرنة وتحتوي على العديد من الآليات والنماذج التي يمكن أن تحسّن الإنتاجية بصورة كبيرة، ولكن يمكن أن يكون الفهم أو التقدير المحدود لقدراتها في بعض الأحيان عائقًا أكثر من كونه فائدة كما هو الحال مع أيّ أداة أو لغة برمجية، حيث يعتقد الشخص في أن يعلم ما يكفي، ولكنه يشكّل خطرًا. سيساعد التعرف على الفروق الأساسية في لغة بايثون -مثل مشاكل البرمجة المتقدمة التي ذكرناها في هذا المقال- على تحسين استخدام اللغة مع تجنب بعض الأخطاء في بايثون. ترجمة -وبتصرُّف- للمقال The 10 Most Common Python Code Mistakes لصاحبه Martin Chikilian. اقرأ أيضًا مصطلحات شائعة مثيرة للالتباس في بايثون تنقيح أخطاء Debugging شيفرتك البرمجية باستخدام لغة بايثون كيف تستخدم منقح بايثون فهم العمليات المنطقية في بايثون 3 أشهر 10 مشكلات تواجه مبرمجي لغة جافا سكريبت JavaScript
    2 نقاط
  14. قبل عقد من الزمن، كان مفهوم الذكاء الاصطناعي (AI) مقتصرًا على كونه تصنيفًا فرعيًّا لأفلام الخيال العلمي الذي تسيطر فيه الآلات وأنظمة الذكاء الاصطناعي المتطورة على البشر ويُنظر إليه على أنه مجرد خيال مستقبلي وليس شيئًا واقعًا يمكن التعامل معه في الحياة اليومية. أما اليوم فقد تطور الذكاء الاصطناعي وصار متاحًا للجميع، فلو سألت أي شخص اليوم ما هو الذكاء الاصطناعي فسيجيبك بأنه علم متطور يوفر العديد من التقنيات الذكية التي تتيح للآلات القيام بمهام عديدة تحتاج إلى ذكاء بشري، ويوفر أدوات عديدة تساعد البشر في إنجاز أعمالهم اليومية بأسلوب يحاكي ذكاءهم مثل التعرف على الصور، أو ترجمة المحتوى، أو تشخيص الأمراض، أو قيادة السيارات …إلخ. تطور الذكاء الاصطناعي من مساعد بسيط لمنافس للإنسان اقتصر الذكاء الاصطناعي في بداياته على بعض التطبيقات التي بدت بعيدة جدًا عن منافسة ذكاء الإنسان، مثل مساعدته في إكمال الجمل بالكلمات المتوقعة، أو توفير نماذج يمكنها لعب بعض الألعاب والتغلب على البشر فيها مثل نموذج آلفا جو AlphaGo الذي تغلب على بطل العالم لي سيدول (Lee Sedol) في لعبة جو GO عام 2016، وآلفا جو AlphaGo هو برنامج حاسوبي طُوّرته شركة DeepMind البريطانية المتخصصة في الذكاء الاصطناعي وهدفه الأساسي لعب لعبة جو المعروفة بتعقيدها واحتوائها على عدد كبير جدًا من الاحتمالات. حين تمكن حاسوب من التفوق على الإنسان في لعبة جو المعقدة للغاية التي تتضمن عدد احتمالات يفوق عدد ذرات الكون المرئي، عُدَّ هذا الأمر إنجازًا تقنيًا هائلًا وطرح الكثير من الأسئلة حول ماهية الذكاء الاصطناعي، وإلى أي مدى سيتطور الذكاء الاصطناعي؟ وهل من الممكن أن تتفوق علينا هذه التقنية التي طورناها بأيدينا؟ لقد تمكن الذكاء الاصطناعي من انتزاع الانتصار أربع مراتٍ من أصل خمس من بطل العالم الأفضل على الإطلاق في هذه اللعبة، وهذا شكل هزيمة صادمة إذ كيف لنابغةٍ في أحد المجالات أن يُهزم مرات عديدة من قبل آلة؟ لكن هل كان آلفا جو AlphaGo حقاً برنامجًا ذكياً أم مجرد برنامج حاسوبي قادر على حساب عدد كبير من الاحتمالات والتعمق فى شجرة من النقلات التى ضمنت انتصاره بسهولة؟ في النقلة ال 37 قام آلفا جو AlphaGo بلعب نقلة رابحة فرصة اختيارها 1 من 10000 وتخالف كل مبادئ البشر وطريقة تفكيرهم، وهذه الحركة التي قد لا يفكر بها أي بشري استطاعت تغيير موازين اللعبة. مصدر الصورة ما هو الذكاء الاصطناعي قبل أن نستعرض ما هو الذكاء الاصطناعي (Artificial Intelligence) من الجيد أن نعرف بداية ما هو الذكاء الطبيعي (Natural Intelligence) أو الذكاء البشري (Human Intelligence) الذي يعبر عن قدرة ذهنية ناتجة من القدرة على التعلم من التجارب، والتأقلم في المواقف الجديدة، والقدرة على استيعاب المفاهيم المجردة، وتسخير المعرفة للتفاعل مع البيئة. وتحاول أنظمة الذكاء الاصطناعي محاكاة تعريف الذكاء البشري لتتمكن من التأقلم و التعامل مع مشكلات جديدة بشكلٍ إبداعي دون برمجة حل مسبق لها في هذه الأنظمة، فَالقدرة على التعميم واستخدام ما تعلمه من مواقف سابقة لتطبيقه على مواقف جديدة ومهامٍ جديدة لم يسبق للآلة التعامل معها يجعلها تستحق وسمها بالذكاء وإن كان اصطناعيًا. يمكننا الآن أن نصل إلى تعريف الذكاء الاصطناعي بعد أن فهمنا ما الذي نحتاجه لوصف الآلة أنها ذكية. فالذكاء الاصطناعي هو تقنية متطورة تُمكِّن الحواسيب والآلات من محاكاة الذكاء البشري في القدرة على الفهم والإدراك، وربط الأسباب ببعضها البعض، والتعلم والتفاعل مع بيئتها بشكل متكيف مع التغيرات لحل المشاكل بشكلٍ إبداعي. يمكننا أن نستخلص مما سبق عدة مفاهيم ينبغي أن تتصف بها أو تملكها الأنظمة الحاسوبية حتى توصف أنها أنظمة ذكية: القدرة على التعلم. القدرة على الإبداع. القدرة على التطور و تعميم التعلم. القدرة على الإدراك. القدرة على الفهم. القدرة على ربط الأسباب. نبذة عن تاريخ تطور الذكاء الاصطناعي في عام 1950، بدأ وضع معايير لتحديد ما هو الذكاء الاصطناعي من خلال اختبار تورينغ Turing test الذي يهدف إلى تحديد إذا كانت الآلة حقاً تتمتع بالذكاء وهو اختبار قائم على قدرة الآلة الذكية أن تجري محادثةً بشكل طبيعي فيظن المختبر أنه يتحدث مع إنسان وليس آلة، لكن لم يستطع آلان تورينغ Alan turing تطبيق مفهومه في ذلك الوقت، فقد كانت القوة الحاسوبية والتخزينية في ذلك الوقت محدودة للغاية وباهظة التكاليف. في عام 1956 عُقد مؤتمر دارتموث الأول للبحث في الذكاء الاصطناعي (Dartmouth Summer Research Project on Artificial Intelligence) الذي ظهر فيه مصطلح الذكاء الاصطناعي بشكل علمي لأول مرة وعُدّ هذا المؤتمر الحدث التأسيسي الذي أطلق تخصص الذكاء الاصطناعي كمجال علمي قائم بذاته. وشهد الذكاء الاصطناعي فترة ازدهار بين عامي 1957 و عام 1974 نظرًا لتطور القدرات الحاسوبية والتخزينة وإتاحتها بشكل أكبر للعامة، وكانت هذه فترة التوقعات المتفائلة بشأن إمكانات الذكاء الاصطناعي، لكن النتائج لم تقابل التوقعات مما أدى إلى فترة ركود في تطور الذكاء الاصطناعي. في الثمانينيات عاد هذا المجال مجدداً للظهور نظرًا للتطور الملحوظ الذي حدث في خوارزميات تعلم الآلة، وبداية ظهور مفهوم التعلم العميق (Deep learning) الذي اقترح تنفيذ مهام الذكاء الاصطناعي بشكل مشابه للطريقة التي يعمل بها الدماغ البشري، لكن لم يدم هذا التطور لفترة طويلة فمازالت القدرات الحاسوبية وكمية البيانات المتوافرة لا تواكب الآمال المرجوة. لاحقًا في فترة التسعينات والألفية الجديدة عاد الذكاء الاصطناعي للساحة، وتحققت الكثير من التطورات والقفزات العلمية في الذكاء الاصطناعي في تلك الفترة، وسبب هذا التطور المتسارع هو التطور الهائل الحاصل في القدرات الحاسوبية والتخزينية التي مكّنت من الاستفادة من خوارزميات الذكاء الاصطناعي المتاحة لأقصى درجة ممكنة. وفي العصر الحالي أصبح الذكاء الاصطناعي من أكثر المجالات البحثية نمواً، وشهد سوق الذكاء الاصطناعي تطورًا متسارع الوتيرة، وأصبح من أكثر التقنيات طلبًا، فقدر حجم سوق تقنيات الذكاء الاصطناعي عام 2024 بحسب ستاتيستا statista بحوالي 200 مليار دولار، ومن المتوقع نمو هذا المجال والطلب عليه في السنوات القادمة ليصل إلى ما يقارب 800 مليار دولار بحلول عام 2030. يُبرز هذا التطور المستمر مدى أهمية الذكاء الاصطناعي وزيادة الاعتماد عليه في مختلف جوانب حياتنا اليومية، ويؤكد على دوره الحيوي في رسم ملامح المستقبل، وتغيير طريقة تنفيذ أعمالنا اليومية وتفاعلنا مع العالم. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن ما هي تصنيفات الذكاء الاصطناعي بعد أن تعرفنا على ماهية الذكاء الاصطناعي وتطوره وما المتوقع من الأنظمة الذكية أن تتسم به، لنتعرف على تصنيف الذكاء الاصطناعي وأنواعه. إذ تصنف الأنظمة الذكية بناءً على تطور قدراتها أو الوظيفة التى تحتاج القيام بها إلى عدة تصنيفات كما توضح الصورة التالية: تصنيفات الذكاء الاصطناعي حسب القوة تتفاوت قدرات الأنظمة الذكية فبعضها يتعامل مع مهام بسيطة وتكرارية لتوفير وقت الإنسان، والبعض الآخر مصمم ليتفاعل مع البشر ويقوم بطيف واسع من المهام لمساعدة الإنسان على اتخاذ القرارات، إذ يصنف الذكاء الاصطناعي بناء على قدرته على محاكاة ذكاء البشر إلى: الذكاء الاصطناعي الضعيف Weak AI الذكاء الاصطناعي القوي Strong AI لنكتشف ما هو الذكاء الاصطناعي الضعيف والقوي وما الفرق بينهما. الذكاء الاصطناعي الضعيف Weak AI الذكاء الاصطناعي الضعيف (Weak AI) المعروف أيضًا بالذكاء الاصطناعي الضيّق (Narrow AI) هو النوع الذي نتعامل معه حاليًا فهو مصمم لأداء مهام محددة أو مجموعة من المهام المرتبطة بها، لكن دون امتلاك وعي أو فهم لها، فهو محدود في نطاقه وقدراته ولا يمكنه امتلاك الإدراك أو التكيف والتفكير بشكل مستقل خارج نطاق المهام التي صمم للتعامل معها. تخيل أن لديك بوت محادثةٍ ذكي دربته كيف يتحدث مع العملاء ويجيب على أسئلتهم المتكررة، سيكون هذا البوت قادراً على فهم اللغة والصيغ المختلفة لطرح السؤال والتعامل مع أسئلة مثل "ما هي ساعات الدوام لديكم؟" أو "هل يمكنني القدوم في الساعة العاشرة لشراء هذا المنتج ؟" وإدراك أنها أسئلة عن أوقات العمل لهذا النشاط التجاري بالتالي الرد على السؤالين رغم اختلاف صياغتهما بنفس الإجابة التي توضح أوقات العمل. لكنه لن يتمكن من الدخول في نقاشات مفتوحة حول النشاط التجاري أو حول مواضيع عامة لا تخص هذا النشاط. الذكاء الاصطناعي القوي Strong AI بالمقابل يتميز الذكاء الاصطناعي القوي (Strong AI) أو ما يعرف أيضاً بالذكاء الاصطناعي العام Artificial general intelligence (AGI)‎ بتطوره وقدرته على القيام بالعديد من المهام المتنوعة بكفاءة تعادل البشر وتحاكي طريقتهم في التعامل مع أي مهمة معرفية. لم تصل البشرية بعد إلى مستوى التعامل مع الذكاء الاصطناعي القوي (Strong AI) الذي يحاكي جميع القدرات البشرية الذهنية. ورغم التقدم الكبير في ماهية الذكاء الاصطناعي وتطور خوارزمياته ونماذجه التي تمكنت من الوصول إلى قدراتٍ مقاربة للبشر وربما تفوقت عليها في بعض المجالات المحددة، إلا أن هذه الأنظمة لا تزال تفتقر إلى الفهم والوعي العامين اللذين يميزان عقلنا البشري. تصنيفات الذكاء الاصطناعي حسب الوظيفة تصنف الأنظمة الذكية حسب الوظيفة ودرجة التعقيد إلى أربعة مستويات، وتتطور تدريجيًا من الأنظمة البسيطة إلى أنظمة أكثر تعقيدًا وأقرب إلى الذكاء البشري وهي كالتالي: الآلات التفاعلية Reactive machines الأنظمة محدودة الذاكرة Limited memory أنظمة نظرية العقل Theory of mind أنظمة الوعي الذاتي Self-awareness لنوضح كل مستوى من هذه المستويات والوظائف التي يمكن القيام بها في كل منها. الآلات التفاعلية Reactive machines هي أنظمة ذكية لا تحتاج لامتلاك ذاكرةٍ للقيام بحل المشكلة التي تواجها، على سبيل المثال عند تصميم نظام ذكي يلعب الشطرنج، سيتحتاج هذا النظام للتعامل مع الموقف المعطى له فقط، وقد يكون هذا الموقف من منتصف المباراة ولكنه يستطيع تقييم الرقعة وقوة تمركز القطع واختيار نقلة تعظم من المكاسب أو تختار موقع استراتيجي بناءً على الموقف الحالي فقط . الأنظمة محدودة الذاكرة Limited memory هي الأنظمة الذكية التي تحتاج إلى تخزين البيانات بشكل مؤقت لاستخدامها في اتخاذ القرارات، فمثلًا عند تصميم نظام ذكي قادر على قيادة السيارات ذاتياً فأنت بحاجة لجمع بياناتٍ عن الطريق واللافتات المرورية والإشارات والسيارات الأخرى القريبة منك ليقوم النظام بالتحكم بالسيارة اعتماداً على البيانات الحالية والموقف الحالي، لن يكون النظام بحاجة للاحتفاظ بمعلومات عن السيارات التي ليست فى نطاق رويته أو سلكت طرقاً أخرى، فهذه الأنظمة تجمع البيانات بشكل مستمر لاتخاذ القرارات بشكلٍ فوري ولا تحتفظ سوى بما يلزم للتعامل مع الموقف الحالي. أنظمة نظرية العقل Theory of mind هي الأنظمة الذكية المتطورة التي تحتاج إلى فهم الأفكار والمشاعر والتفاعل الإجتماعي للقيام بوظيفتها، يمكن اعتبار روبوت المحادثة الذكي ChatGPT نظاماً قادرًا على فهم السياق من النص المرسل له ومعرفة المشاعر وراء تلك الكلمات بدرجة لا بأس بها، فهو قادر على استنتاج الأنماط المرتبطة بمشاعر معينة، لكنه لازال آلة غير قادرةٍ على التعاطف أو الشعور بتلك المشاعر. أنظمة الوعي الذاتي Self-awareness هي أنظمة ذكاء اصطناعي تحتاج إلى فهم المشاعر وتكوين وعي ذاتي للقيام بوظيفتها واتخاذ قرارات بناءً على هذا الوعي وتبريرها، في الوقت الحالي لا توجد أنظمة ذكاء اصطناعي تمتلك وعيًا ذاتيًا حقيقيًا كالبشر، ولكن هناك أبحاث تجري في هذا المجال، فهناك ورقة بحثية نشرت هذا العام بعنوان التعلم من خلال الشرح الذاتي Learning by Self-Explaining اقترحت طريقة تُمكّن أنظمة المحادثات الذكية من تبرير إجابتها بل وحتى انتقادها في سبيل تحسين الردود التي تنتجها. تخصصات الذكاء الاصطناعي لقد تطورت مجالات الذكاء الاصطناعي وتشعبت فروعه وتخصصصاته ولعل أبرزها: 1. تعلم الآلة Machine Learning هو تخصصٌ فرعي من الذكاء الاصطناعي يعني قدرة الآلات على التعلم من خلال البيانات دون برمجتها بشكلٍ مباشر للقيام بمهمة معينة، ويتضمن تعلم الآلة تطوير خوارزميات يمكنها تحليل البيانات واستكشاف الأنماط الموجودة فيها لتكوين معرفة يمكن تعميمها على مهامٍ أخرى. تصنف مهام تعلم الآلة حسب البيانات المستخدمة في التعلم، فإن كانت البيانات المتاحة لديك موسومة Labeled تصبح مهمة التعلم مشرف عليها بشكلٍ آلي وتسمى التعلم مع إشراف Supervised learning حيث يتم استخدام الوسم الموجود في البيانات المستخدمة لتدريب النموذج في تقيم مخرجاته، وأما إن لم تكن البيانات المتاحة للتعلم موسومة تصبح مهمة التعلم دون إشراف Unsupervised learning حيث يحاول النموذج تعلم الأنماط الموجودة في البيانات وتجميع المتشابه منها فيما يعرف بالمجموعات أو العناقيد Clusters. لنفترض أن لديك مجموعة من صور القطط والكلاب وترغب في بناء نموذج تعلم آلة قادر على التفريق بين القطط والكلاب، فوسم البيانات سيكون له تأثير في تحديد نوع خوارزميات التعلم المستخدمة في هذه المهمة، إن استخدمت صورًا موسمة للقطط والكلاب بحيث تكون كل صورة مرفقٌ معها تصنيفها في عملية التدريب فصور القطط ستحمل الوسم قط، بينما صور الكلاب ستحمل الوسم كلب، بالتالي تكون عملية التعلم هنا بإشراف بإستخدام هذه الوسوم، فعندما يقوم النموذج بتوقع الصورة على أنها قط يقارنها بوسمِها الحقيقي لتقييم صحة إجابات النموذج وتحسينها. على النقيض إن قمت فقط بإعطاء النموذج التعلمي البيانات بدون تحديد وَسْم، فَسيتعلم الأنماط المشتركة للقطط ويتعلم أنها مجموعة أو عنقود Cluster منفصل وبالمثل للكلاب فَالمهمة هنا هو معرفة الأنماط المشتركة لكل مجموعة وعددها. 2. التعلم العميق Deep Learning هو تخصص فرعي من تعلم الآلة يتميز باستخدامه الشبكات العصبية الاصطناعية (ANN)‎ التي تحاكي طريقة عمل الدماغ البشري في معالجة البيانات، وتتميز خوارزميات التعلم العميق بقدرتها على الاستفادة من البيانات الضخمة لتحسين جودة نماذج تعلم الآلة، ويرجع هذا لقوة الشبكات العصبية الاصطناعية على تعلم أنماط أكثر تعقيداً من خوارزميات التعلم الآلي التقليدية، بحيث تصل خوارزميات التعلم التقليدية غير المعتمدة على الشبكات العصبية الاصطناعية إلى مرحلة ركود لا تستطيع فيها تعلم أي شيءٍ جديد من البيانات وتواكب تعقيد المشكلة التي أمامها، فالأمر هنا لا يتعلق بجودة البيانات إنما بقدرة الخوارزمية على تعلم الأنماط المعقدة الموجودة في البيانات الضخمة. يقارن الرسم أعلاه بين أداء خوارزميات التعلم التقليدية وخوارزميات التعلم العميق في عدة نقاط عندما يتوفر لديك مقدار قليل من البيانات عليك استخدام التعلم الآلي التقليدي، لأن خوارزميات التعلم العميق تحتاج لحجم بيانات أكبر لتعطى نفس الدقة و الأداء. تصل خوارزميات التعلم التقليدي إلى مرحلة ركود في التعلم أو تطور تطفيف بالرغم من استخدام حجم بيانات أكبر ولا تتمكن من مواكبة تعقيد المشكلة. تتفوق خوارزميات التعلم العميق عندما توفر لها حجمًا هائلًا من البيانات، فكلما استخدمت بياناتٍ أكثر فيها كلما تمكنت من تحقيق أداءٍ أفضل. 3. التعلم المعزز بالتجربة Reinforcement learning هو نوع من مهام تعلم الآلة قائم على التعلم بالتجربة والتفاعل مع البيئة المحيطة، تتفاعل الأنظمة الذكية المدربة بهذه الطريقة مع بيئتها بشكل عشوائي في البداية وبناءً على هذا التفاعل تتوقع الآلة الحصول على مكافأة أو عقوبة، إذ نكافئ النظام على سلوكه اتجاهاً معيناً يضمن له أداءاً أفضل، ونعاقبه على القرارات التي لا ينجز فيها المهمة الموكلة إليه بشكل صحيح. ينتشر استخدام هذا النوع من التعلم الآلي في مجال الروبوتات Robotics وفي ألعاب الذكاء الاصطناعي والواقع الافتراضي وفي أنظمة المحاكاة حيث توجد بيئة يمكن للنظام التفاعل معها. 4. الرؤية الحاسوبية Computer Vision هي أحد المجالات الرئيسية في الذكاء الاصطناعي، حيث تهدف لتعزيز الآلات والأنظمة الحاسوبية بالقدرة على التعامل مع المحتوى البصري مثل الصور ومقاطع الفيديو، ويستخدم هذا المجال تعلم الآلة والتعلم العميق بشكلٍ خاص لتحليل البيانات البصرية الضخمة وتعلم الأنماط المرئية من أجل تمييز هذا النوع من المحتوى وفهمه، وتطبيقات الرؤية الحاسوبية كثيرة للغاية ولعل أبرزها أنظمة تحديد الوجوه والتعرف عليها، وأنظمة تحليل الأشعة الطبية وتشخيص الأمراض. وتعد الشبكات العصبية الالتفافية Convolution Neural Networks أو اختصارًا CNN أحد الأسباب التي ساهمت في تطور هذا المجال فهي تتميز بقدرتها الآلية على استخراج الأنماط الهامة وتعلم أي الأنماط البصرية تحتاج إلى التركيز عليها حتى تمتلك القدرة على التفريق بين الصور، وقبل اختراع هذا النوع من الشبكات العصبية كان على المطورين استخراج المعلومات البصرية والأنماط من الصور بشكل شبه يدوي. 5. معالجة اللغات الطبيعية معالجة اللغات الطبيعية Natural Language Processing‎‎ أو ‎اختصارًا NLP هي أحد التطبيقات الشائعة للذكاء الاصطناعي، وهي مجال حيوي أيضًا ويعتمد على تعلم الآلة والتعلم العميق لبناء فهم جيد للغات الطبيعية والقدرة على التعامل معها. من التطبيقات الشائعة لمعالجة اللغات الطبيعية أنظمة المحادثة الذكية مثل ChatGPT ونماذج التعلم اللغوية الضخمة Large Language Models أو اختصارًا LLMs التي تّدرّبُ مسبقاً على بيانات ضخمة لتمتلك فهماً مبدئياً للغة يُمكَّنها من القيام بمهام لغوية متعددة، نذكر منها تلخيص الفقرات الطويلة والإجابة على الأسئلة والترجمة الآلية وتحليل المشاعر في النصوص، والعديد من التطبيقات الأخرى. الذكاء الاصطناعي التوليدي Generative Artificial Intelligence يتميز الذكاء الاصطناعي التوليدي Generative AI بقدراته الإبداعية وقدرته على إنتاج وإبتكار نصوص جديدة ووسائط أخرى مختلفة كالصور والأصوات ومقاطع الفيديو بناءً على الأنماط التي تعلمها من كميات كبيرة من البيانات. وهو يختلف عن أنظمة الذكاء الاصطناعي التقليدية التي تعتمد على التصنيف أو التنبؤ بناءً على البيانات المدخلة. ذاع صيت الذكاء الاصطناعي التوليدي اليوم لما يتميز به من قدرات فريدة في توليد محتوى إبداعي يشبه المحتوى المولد من قبل البشر، وأصبح له تطبيقات عديدة ككتابة المحتوى التسويقي، وتأليف القصص، وتصميم الصور، وكتابة الشيفرات البرمجية، وغيرها من المهمام التي سرعت إنتاجية البشر. تحديات تطور الذكاء الاصطناعي وحلول مقترحة لنختم المقال بتسليط الضوء على بعض التحديات والتساؤلات المرتبطة بالذكاء الاصطناعي وآفاقه المستقبلية. تهديد الذكاء الاصطناعي للوظائف البشرية لدى الكثير من الأشخاص تخوف من تطورالذكاء الاصطناعي وتساؤلات حول قدرته على استبدال الوظائف البشرية، بكل تأكيد سيغير الذكاء الاصطناعي الطريقة التي تعمل بها الكثير من الوظائف في الوقت الحالي، ليس بشكلٍ مدمر ولكن بشكل مساعدٍ للبشر، فبينما من المرجح اختفاء بعض الوظائف أو تأثرها فممن المؤكد أن الذكاء الاصطناعي سيوفر فرص عملٍ أخرى، شأنه شان العديد من الثورات الصناعية والتقنية على مر التاريخ. الاحتيال والتزوير باستخدام الذكاء الاصطناعي من التحديات الخطيرة التي تواجه الذكاء الاصطناعي استخدامه في عمليات الاحتيال أو التزوير، فيمكن بكل سهولة استخدام تقنية التزييف العميق Deep fake من أجل انتحال شخصية أحد الأشخاص، يمكن مكافحة هذه الجرائم بعدة طرق منها استخدام الذكاء الاصطناعي نفيه لاكتشاف التزييف و تشريع قوانين تضمن حماية الأفراد من الاحتيال. تحيّز الذكاء الاصطناعي قد تعاني بعض أنظمة الذكاء الاصطناعي من التحيز المقصود أو غير المقصود، على سبيل المثال عند بناء أنظمة التعرف على الوجوه وتدريبها على بيانات لصور وجوه بشرية بيضاء البشرة فقط، فلن تكون قادرة على العمل بكفاءة للتعرف على وجوه مختلفة الملامح والألوان، ولمنع تحيز الذكاء الاصطناعي ينبغي الاهتمام بتطويره وتحسين جودة البيانات التي يعتمد عليها للتدريب وجمع بيانات كافية تعبر عن كل الفئات المستهدفة. احتكار تقنيات الذكاء الاصطناعي هناك مخاوف من سيطرة بعض الدول على تقنيات الذكاء الاصطناعي مما سيؤدي إلى تحيز مقصود، فمعظم الأشخاص تستخدم إجابات الذكاء الاصطناعي كأنها شيء مُسلَّم به، لكن الكثير من ردود الذكاء الاصطناعي ليست صحيحة بشكل كامل وأحياناً تكون خاطئة، ولتحسين جودة الإجابات ودقتها يجب دعم الإجابات بمصادر خارجية تؤكد صحة المعلومات، واعتماد تقنية تسمى توليد الإجابات المعززة بالحقائق Retrieval-augmented generation أو (RAG)‎ اختصارًا. الخلاصة تعرفنا في هذا المقال ما هو الذكاء الاصطناعي واستعرضنا مراحل تطوره حتى وصل لهذه القوة والانتشار، وناقشنا أهم تصنيفات الذكاء الاصطناعي وتخصصاته، وختمنا المقال بالحديث عن بعض التحديات والمخاوف المرتبطة بتطور الذكاء الاصطناعي في المستقل وتأثير الاعتماد المتزايد عليه في تنفيذ أعمالنا ومهامنا البشرية. نرجو أن يكون هذا المقال قد قدم لك إجابات شاملة حول ماهية الذكاء الاصطناعي ووضح له أهم المفاهيم والتخصصات المرتبطة به. وإذا كان لديك أي أسئلة أو استفسارات حول ما ورد في المقال، فلا تتردد في كتابتها في قسم التعليقات أسفل المقال. اقرأ أيضًا أساسيات الذكاء الاصطناعي: دليل المبتدئين تعلم الذكاء الاصطناعي: دليل شامل تعرف على أفضل دورات الذكاء الاصطناعي تعرف على أهم مشاريع الذكاء الاصطناعي برمجة الذكاء الاصطناعي: بناء مستقبل الآلات الذكية
    2 نقاط
  15. نلقي نظرة في هذا المقال على الصياغة اﻷساسية لكائن جافا سكريبت كما نستذكر بعض الميزات التي ناقشناها سابقًا لنشدد على حقيقة أن العديد من الميزات التي اطلعنا عليها وتعاملنا معها في لغة جافا سكريبت هي في الواقع كائنات، ابتداءً من المميزات البنيوية للغة مثل المصفوفات إلى الواجهات البرمجية للمتصفحات APIs المبنية على أساس جافا سكريبت. وبإمكانك أيضًا بناء كائنات خاصة بك لتغليف مجموعة من الدوال والمتغيرات ضمن حزمة أكثر فعالية تعمل كحاوية بيانات. ولا بد أن تتفهم طبيعة جافا سكريبت القائمة على الكائنات إن أردت التعمق أكثر في تعلم هذه اللغة، لهذا نزوّدك ضمن هذا المقال والمقالات التالية بمعلومات مهمة عن الكائنات البرمجية وصياغتها بشيء من التفصيل ثم ننتقل إلى شرح طريقة بناء كائنات خاصة بك. ننصحك قبل أن تبدأ العمل معنا في هذه السلسلة أن تطلع على: أساسيات HTML أساسيات عمل CSS أساسيات جافا سكريبت أساسيات الكائنات الكائن object هو مجموعة مترابطة من البيانات أو الوظائف، فهو يتألف عادة من من عدة متغيرات ودوال (تُدعى المتغيرات ضمن الكائن خاصيات properties والدوال methods). وحتى نستوعب مفهوم الكائنات سنعمل على المثال التالي. أنشئ أولًا نسخة من الملف oojs.html على حاسوبك. ويتضمن هذا الملف العنصر <script> الذي سنكتب ضمنه الشيفرة. سنستخدم هذه الصفحة كأساس لاستكشاف الصياغة اﻷساسية للكائن في جافا سكريبت. وعليك أن تفتح طرفية جافا سكريبت الخاصة بأدوات مطوري ويب وتجعلها جاهزة لكتابة التعليمات. وكما هو الحال في الكثير من اﻷشياء في جافا سكريبت، يبدأ إنشاء الكائن بتعريف وتهيئة بعض المتغيرات. لهذا جرّب إدخال السطر التالي تحت السطر الموجود أصلًا في ملف التمرين ثم احفظ التغييرات وأعد تحميل الصفحة: const person = {}; افتح اﻵن طرفية جافا سكريبت ثم اكتب person ضمنها ثم اضغط المفتاح Enter. من المفترض أن تحصل على نتيجة مشابهة للتالي: [object Object] Object { } { } تهانينا! لقد أنشأت للتو كائنًا في جافا سكريبت. لقد أنجز العمل بالفعل، لكن الكائن فارغ كما تلاحظ ولا يمكن أن يفيدنا كثيرًا. لهذا سنعدّل الكائن ضمن شيفرة جافا سكريبت في ملف التمرين كالتالي: const person = { name: ["Bob", "Smith"], age: 32, bio: function () { console.log(`${this.name[0]} ${this.name[1]} is ${this.age} years old.`); }, introduceSelf: function () { console.log(`Hi! I'm ${this.name[0]}.`); }, }; جرّب إدخال بعض التعليمات كما يلي في طرفية جافا سكريبت وذلك بعد حفظ التغييرات وإعادة تحميل الصفحة: person.name; person.name[0]; person.age; person.bio(); // "Bob Smith is 32 years old." person.introduceSelf(); // "Hi! I'm Bob." يضم الكائن بعض البيانات اﻵن كما يحتوي على بعض الوظائف التي يمكن الوصول إليها من خلال صياغة بسيطة واضحة. ما الذي يحدث فعلًا في مثالنا؟ لقد أنشأنا كائنًا مكوّنًا من عدة أعضاء members لكل منها اسم ( مثال name و age) وقيمًا مثل ['Bob, 'Smiths] و 32. يفصل بين كل زوج (اسم/قيمة) فاصلة ,، وبين كل اسم وقيمة نجد نقطتين متعامدتين :. وتتبع صياغة الكائن الشكل التالي دائمًا: const objectName = { member1Name: member1Value, member2Name: member2Value, member3Name: member3Value, }; قد تكون قيمة أعضاء الكائن أي شيء، وفي مثالنا السابق ضم الكائن person أعدادًا ومصفوفة ودالتين. إن أول عضوين كما رأينا يضمان بيانات عن الكائن ويُشار إليهما كخاصيات properties، كما يُشار إلى الدالتين اللتان تسمحان للكائن بتنفيذ بعض العمليات على البيانات بالتوابع أو الدوال التابعة للكائن methods. وعندما يكون عضو الكائن دالة، باﻹمكان استخدام صياغة أبسط من bio:function، ويكفي أن نكتب ()bio كالتالي: const person = { name: ["Bob", "Smith"], age: 32, bio() { console.log(`${this.name[0]} ${this.name[1]} is ${this.age} years old.`); }, introduceSelf() { console.log(`Hi! I'm ${this.name[0]}.`); }, }; وسنستخدم من اﻵن وصاعدًا الصيغة المختصرة في تعريف الدوال. ندعو الكائنات التي تُبنى كما شرحنا سابقًا بالكائنات الحرفية literal object لأننا كتبنا حرفيًا كل أعضائها عند إنشائها. وهي كائنات مختلفة عن تلك التي تُنسخ عن اﻷصناف، والتي سنلقي عليها نظرة لاحقًا. من الشائع أيضًا إنشاء الكائنات كنسخ عن الكائنات الحرفية، وخاصة عندما نريد نقل سلسلة من البيانات المهيكلة المترابطة مثل إرسال طلب إلى خادم لوضع البيانات ضمن قاعدة بيانات. فإرسال كائن واحد أكثر فعالية من إرسال البيانات بشكل مستقل ومن اﻷسهل التعامل معها موازنة بالتعامل مع مصفوفة عندما تريد تحديد كل عنصر باسمه بشكل مستقل. طريقة النقطة Dot notation للوصول إلى أعضاء الكائن لقد وصلنا في مثالنا السابق إلى خاصيات وتوابع الكائن باستخدام العامل . ويسمى هذا الأسلوبالتدوين النقطي أو الاستدعاء النقطي dot notation. حيث يسلك اسم الكائن person سلوك فضاء الأسماء namespace. ولا بد من كتاب اسم الكائن أولًا للوصول إلى أي عضو من أعضاءه ومن ثم تكتب النقطة ومن ثم العضو الذي تريد الوصول إليه، وقد يكون العضو عنصرًا أو مصفوفة أو استدعاء أحد توابع الكائن. person.age; person.bio(); الكائنات والخاصيات على شكل كائنات يمكن للخاصية بحد ذاتها أن تكون كائنًا، جرّب مثلًا أن تغيّر العضو name من الشكل التالي: const person = { name: ["Bob", "Smith"], }; ليصبح بالشكل: const person = { name: { first: "Bob", last: "Smith", }, // … }; وللوصول إلى هذه العناصر لا بد من ربطها بالكائن الرئيسي بكتابة نقطة أخرى. جرّب كتابة الشيفرة التالية في طرفية جافا سكريبت: person.name.first; person.name.last; فإن فعلت ذلك، عليك العودة إلى الشيفرة وتغيير كل شيفرة من الشكل: name[0]; name[1]; إلى name.first; name.last; وإلا لن تعمل التوابع. استخدام طريقة اﻷقواس في الوصول إلى أعضاء الكائن باﻹمكان الوصول إلى أعضاء الكائن باستخدام طريقة اﻷقواس المربعة Bracket notation فبدلًا من استخدام النقطة كما في المثال التالي: person.age; person.name.first; يمكننا استخدام الأقواس كما في الكود التالي: person["age"]; person["name"]["first"]; يبدو اﻷمر مشابهًا للوصول إلى عناصر مصفوفة، هو من ناحية المبدأ اﻷمر ذاته، فبدلًا من الوصول باستخدام دليل المصفوفة index، تستخدم الاسم المرتبط بقيمة العنصر. لهذا السبب تًدعى الكائنات أحيانًا مصفوفات ترابطية associative arrays، فهي ترتبط بالقيم النصية بنفس الطريقة التي ترتبط فيها المصفوفة بدليلها. يُفضّل استخدام طريقة النقطة على طريقة اﻷقواس عمومًا لأنها أكثر وضوحًا وأسهل قراءة. لكن ستجد بعض الحالات التي تستخدم فيها اﻷقواس المربعة مثل إسناد قيمة خاصية على شكل كائن إلى متغيّر، فلن تستطيع في هذه الحالة استخدام النقطة للوصول إلى القيمة، لكن باﻹمكان استخدام الأقواس المربعة. في المثال التالي، يمكن للدالة أن تستخدم الطريقة person[propertyName] للوصول إلى القيمة المخزنة في الخاصية proertyName: const person = { name: ["Bob", "Smith"], age: 32, }; function logProperty(propertyName) { console.log(person[propertyName]); } logProperty("name"); // ["Bob", "Smith"] logProperty("age"); // 32 ضبط قيم أعضاء الكائن كل ما تعلمناه حتى اللحظة هو الحصول على قيمة أعضاء الكائن object members، لكن باﻹمكان أيضًا ضبط قيمة هذه الأعضاء بالتصريح عن العضو الذي تريد ضبطه (باستخدام طريقة النقطة أو اﻷقواس المربعة) كالتالي: person.age = 45; person["name"]["last"] = "Cratchit"; جرّب إدخال التعليمتين التاليتين ضمن طرفية جافا سكريبت، ولاحظ كيف تغيرت القيمة: person.age; person["name"]["last"]; لا يقتصر ضبط قيم أعضاء الكائن على تغيير القيمة الموجودة للخاصيات أو التوابع، بل يمكنك إنشاء عناصر جديدة كليًا. جرّب اﻵن ما يلي في الطرفية: person["eyes"] = "hazel"; person.farewell = function () { console.log("Bye everybody!"); }; اختبر اﻵن العناصر الجديدة: person["eyes"]; person.farewell(); // "Bye everybody!" من إيجابيات استخدام طريقة اﻷقواس المربعة أنه باﻹمكان استخدامها في ضبط قيمة اﻷعضاء ديناميكيًا إضافة إلى تغيير أسماء الأعضاء أيضًا. لنفترض أننا نريد منح المستخدم القدرة على تخزين أنواع مخصصة من القيم في بيانات اﻷشخاص وذلك بكتابة اسم العضو وقيمته ضمن مربعي إدخال نصي منفصلين. باﻹمكان إنجاز اﻷمر كالتالي: const myDataName = nameInput.value; const myDataValue = nameValue.value; نضيف بعدها هذا العضو الجديد إلى الكائن person كالتالي: person[myDataName] = myDataValue; ولاختبار اﻷمر، جرّب إضافة الأسطر التالية إلى شيفرتك، أسفل قوس إغلاق الكائنن person: const myDataName = "height"; const myDataValue = "1.75m"; person[myDataName] = myDataValue; جرّب حفظ التغييرات وإعادة تحميل الصفحة ثم إدخال التالي ضمن مربع اﻹدخال النصي: person.height; إن إضافة خاصية إلى الكائن باستخدام اﻷسلوب السابق لن يكون ممكنًا باستخدام طريقة النقطة والتي تقبل فقط الاسم الحرفي للعضو ولا تقبل قيمة متغير يشير إلى الاسم. لماذا استخدمت الكلمة المحجوزة this لربما قد لاحظت شيئًا غريبًا في أسلوبنا في الشيفرة السابقة، ألق نظرة اﻵن على هذا المثال: introduceSelf() { console.log(`Hi! I'm ${this.name[0]}.`); } لربما تتساءل ماذا فعلت الكلمة this؟ تشير هذه الكلمة المحجوزة إلى الكائن الحالي الذي كُتبت الشيفرة ضمنه، فهي في مثالنا تكافئ الكائن person. لماذا إذًا لا نستخدم person وحسب؟ في الواقع، لا فائدة من استخدام الكلمة this كثيرًا في حال أنشأت كائن حرفي وحيد، لكن إن أنشأت أكثر من كائن حرفي، يساعدك ذلك في استخدام نفس تعريف التابع لكل كائن أنشأته. لنوضح ذلك من خلال المثال التالي: const person1 = { name: "Chris", introduceSelf() { console.log(`Hi! I'm ${this.name}.`); }, }; const person2 = { name: "Deepti", introduceSelf() { console.log(`Hi! I'm ${this.name}.`); }, }; في هذه الحالة، ينتج عن تنفيذ التعليمة ()person1.introduceSelf الخرج التالي "Hi! I'm Chris."، بينما ينتج عن تطبيق نفس التابع على كائن آخر ()person2.introduceSelf من نفس النوع خرج آخر مناسب للكائن "Hi! I'm Deepti". وعلى الرغم من أن الشيفرة نفسها في الحالتين، لكن أهميتها لن تظهر عند كتابة كائنات حرفية يدويًا، بل عندما تبدأ باستخدام الدوال البانية constructors ﻹنشاء أكثر من كائن من تعريف واحد له وهذا ما نناقشه تاليًا. مقدمة إلى الدوال البانية Constructors لا بأس باستخدام الكائنات الحرفية عندما تريد استخدام كائن واحد، لكن إن كان عليك إنشاء أكثر من عنصر سيغدو استخدام العناصر الحرفية غير ملائم. إذ علينا كتابة نفس الشيفرة لكل كائن على حدى، وإن كان علينا تغيير بعض الخاصيات كإضافة الخاصية height، لا بد من تذكرّ تغيير كل الكائنات التي أنشأتها. من الأفضل استخدام شكل أو نموذج للكائن يضم كافة التوابع والخاصيات اللازمة، ومن ثم إنشاء العدد الذي يلزمنا من هذا الكائن وفق هذا الشكل بتعديل قيم الخواص المختلفة. إليك نسخة أولى من الشكل الذي نتحدث عنه وهو على شكل دالة: function createPerson(name) { const obj = {}; obj.name = name; obj.introduceSelf = function () { console.log(`Hi! I'm ${this.name}.`); }; return obj; } تُنشئ الدالة وتعيد كائنًا جديدًا في كل مرة نستدعيها، ويضم هذا الكائن عضوين هما: الخاصية: name. التابع: ()introduceSelf. تأخذ الدالة ()createPersonمعاملًا وحيدًا هو name لضبط قيمة الخاصية name، لكن تبقى قيمة التابع ()introduceSelf نفسها لجميع الكائنات التي تنشأها الدالة. ويُعد هذا اﻷسلوب من أكثر الطرق شيوعًا في إنشاء الكائنات. بإمكانك اﻵن إنشاء العدد الذي تريده من الكائنات، بإعادة استخدام الدالة: const salva = createPerson("Salva"); salva.name; salva.introduceSelf(); // "Hi! I'm Salva." const frankie = createPerson("Frankie"); frankie.name; frankie.introduceSelf(); // "Hi! I'm Frankie." ستعمل الشيفرة السابقة جيدًا لكنها طويلة بعض الشيء. إذ أنشأنا كائنًا فارغًا ثم هيأناه وأعدناه، لكن الطريقة اﻷفضل تقضي باستخدام دالة بانية، وهي دالة نستدعيها باستخدام الكلمة المحجوزة new. وعندما نستدعي دالة بانية فإنها: تنشئ كائنًا جديدًا. تربط this بالكائن الجديد، وستتمكن عندها من اﻹشارة إلى الكائن الجديد من خلالها ضمن شيفرة الدالة البانية. تعيد الكائن الجديد. تبدأ أسماء الدوال البانية عادة بحرف كبير وتسمى باسم نوع الكائن الذي تنشؤه، لهذا سنعيد كتابة مثالنا ليصبح بالشكل التالي: function Person(name) { this.name = name; this.introduceSelf = function () { console.log(`Hi! I'm ${this.name}.`); }; } ولكي نستدعي الدالة ()Person كدالة بانية نستخدم الكلمة new: const salva = new Person("Salva"); salva.name; salva.introduceSelf(); // "Hi! I'm Salva." const frankie = new Person("Frankie"); frankie.name; frankie.introduceSelf(); // "Hi! I'm Frankie." لقد استخدمت الكائنات كثيرًا فيما مضى لربما تساءلت أثناء العمل على الأمثلة السابقة بأن استخدام النقطة كان مألوفًا، والسبب أنك استخدمتها طوال فترة تعلم جافا سكريبت عبر سلسلة مقالتنا. فكل مرة عملنا فيها مع مثال يستخدم واجهة المتصفح البرمجية أو كائنات جافا سكريبت، استخدمنا فيها الكائنات لأنها ميزات بنيت باستخدام الطريقة نفسها التي بنينا فيها الكائنات المخصصة في مثالنا اﻷخير، لكنها بالطبع أكثر تعقيدًا. فعندما تستخدم التابع النص كما في المثال التالي: myString.split(","); فأنت تستخدم التوابع التي يوفرّها الكائن String. وفي كل مرة تنشئ فيها سلسلة نصية في شيفرتك، سيتولد هذا النص تلقائيًا كنسخة عن الكائن String، ويشترك معه بالعدبد من الخاصيات والتوابع. وعندما تحاول الوصول إلى كائن المستند باستخدام شيفرة كالتالي: const myDiv = document.createElement("div"); const myVideo = document.querySelector("video"); فأنت تستخدم في الواقع التوابع التي يقدّمها الكائن أو الواجهة البرمجية Document، وعند كل تحميل لصفحة الويب تُنشئ نسخة جديدة عن هذا الكائن تُدعى document تمثّل هيكلية الصفحة بأكملها ومحتواها وغير ذلك من الميزات مثل عناوين URL. أي باختصار، سيمتلك الكائن الذي أنشأته عدة توابع وخاصيات يشترك فيها مع الكائن الأساسي Document. وهذا الأمر مشابه للكثير من الكائنات والواجهات البرمجية المضمنة في لغة جافا سكريبت مثل المصفوفات Array والمكتبة Math. لاحظ أن الكائنات والواجهات البرمجية الأصلية أو المدمجة في جافا سكريبت لا تنشأ من تلقاء نفسها بل عليك إنشاؤها بنفسك في كل مرة تحتاجها، مثل الواجهة البرمجية للتنبيهات Notifications API التي تسمح للمتصفحات الحديثة بإطلاق تنبيهات، حيث تتطلب هذه الواجهة منك أن تنشئ نسخة جديدة باستخدام الدالة البانية لكل تنبيه تريد إطلاقه. جرّب إدخال السطر التالي إلى طرفية جافا سكريبت: const myNotification = new Notification("Hello!"); الخلاصة لقد أنهينا هذه المقال التي يمهّد لاستخدام الكائنات في جافا سكريبت، ولا بد أنك امتلكت بقراءته فكرة عن عمل الكائنات، بما في ذلك إنشاء كائنات بسيطة. ومن المهم إدراك أهمية الكائنات كبنى لتخزين البيانات والوظائف المترابطة. فلو حاولت تتبع جميع الخاصيات والتوابع في الكائن person الذي بنيناه في مثالنا شكل متغيرات ودوال منفصلة ستجد أنها طريقة غير مجدية ومحبطة، وستزيد مخاطر التضارب بين المتغيرات والدوال التي تمتلك نفس اﻷسماء. إذ تساعد الكائنات في حفظ المعلومات ضمن حاويات خاصة بها لتقليل مثل هذه المخاطر. ترجمة -وبتصرف- للمقال JavaScript object basics اقرأ أيضًا المقال السابق: مدخل إلى اﻷحداث في جافاسكريبت مدخل إلى جافاسكريبت كائنية التوجه (Object-Oriented JavaScript) لغة البرمجة بالكائنات Object-Oriented Programming برمجة الكائنات Objects في جافاسكريبت مختصر البرمجة كائنية التوجه OOP وتطبيقها في بايثون
    2 نقاط
  16. نعرفك في مقال اليوم ما هي لغة الآلة أو لغة الأصفار والوحدات والتي تقع في أدنى مستويات لغات البرمجة، وتستخدم للتخاطب والتفاعل المباشر مع أجهزة الحواسيب، ونكتشف معًا ما هي مميزات لغة الآلة، وما الفرق بين لغة الآلة ولغة التجميع، ونستعرض أمثلة على لغة الآلة واستخداماتها، وطريقة تنفيذ تعليماتها من قبل الحواسيب المختلفة. مستويات لغات البرمجة قبل أن نتعرف ما هي لغة الآلة لنوضح ما هي لغة البرمجة؟ وما هي المستويات التي مرت بها لغات البرمجة خلال تطورها قبل أن تتطور وتنبثق منها العديد من الأنواع والتسميات. إن لغة البرمجة هي الأسلوب الذي يعتمده البشر للتخاطب مع الحواسيب وغيرها من الأجهزة القابلة للبرمجة وطلب تنفيذ الأوامر منها، وهي تكتب أو تصاغ على شكل سلسلة من الأوامر المتتالية، وتحفظ على هيئة برامج حاسوبية أو تطبيقات ثم تمرر حاسوب لتنفيذها والحصول على النتائج المطلوبة. وقد مرت لغات البرمجة خلال تطويرها بعدة مراحل أو مستويات ومن أبرزها: لغات منخفضة المستوى Low-Level Languages لغة الآلة Machine Language لغة التجميع Assembly Language لغات متوسطة المستوى Mid-Level Languages لغات عالية المستوى High-Level Languages لنتعرف على مميزات وسمات كل لغة من هذه اللغات. لغات منخفضة المستوى Low-Level Languages كانت لغات الجيل الأول للحواسيب لغات منخفضة المستوى مكونة من مجموعة من التعليمات التي تدخل إلى الحاسوب في شكل قابل للتنفيذ مباشرة بواسطة معالج الحاسوب حيث كانت التعليمات البرمجية مكونة من أرقام مكتوبة بالنظام الثنائي binary system وهو نظام أساسه العدد 2، أو النظام الست عشري hexadecimal وهو نظام أساسه العدد 16وكان من الممكن تنفيذ هذه البرامج مباشرة. على سبيل المثال تسلسل الأرقام التالي ليس سوى مثال على جزء من كود برمجي مكتوب بلغة الآلة لبرنامج حاسوبي يجمع عددين: 11101100, 11011010, 10100001, 11011101, 01011111, 10111110, 11101110, 00101101, 11010111, 11101100, 11011011, 11101110, 11101110, 11011101, 00001010, 10101011, 11101110, 11101110, 11001110, 10111010, 10101010, 10101101, 11101010, 11101111, 00011010, 11010010, 11101110, 00011010, 10101011, 11101110, 11101110, 10101110, 11101010, 11101011, 11101010, 00001000, 00001010, 11101110, 11001010 إن تعليمات البرنامج السابق مكتوبة بالنظام الثنائي Binary System، وفي حال استخدامنا النظام الست عشري hexadecimal لكتابة التعليمات سيكون البرنامج على النحو التالي: 0xEC, 0xDA, 0xA1, 0xDD, 0x5F, 0xBE, 0xEE, 0x2D, 0xD7, 0xEC, 0xDB, 0xEE, 0xEE, 0xDD, 0x0A, 0xAB, 0xEE, 0xEE, 0xCE, 0xBA, 0xAA, 0xAD, 0xEA, 0xEF, 0x1A, 0xD2, 0xEE, 0x1A, 0xAB, 0xEE, 0xEE, 0xAE, 0xEA, 0xEB, 0xEA, 0x08, 0x0A, 0xEE, 0xCA وكما تلاحظ فقد كانت كتابة وقراءة لغة الآلة صعبة ومعقدة للغاية، لهذا السبب ظهرت لغات الجيل الثاني أو ما يعرف بلغات التجميع assembly languages وهي عبارة عن لغات ذات مستوى منخفض أيضًا لكن كودها البرمجي أسهل في الفهم نوعًا ما، فقد ابتكر علماء الحاسوب لغة التجميع لتكون بمثابة لغة وسيطة أسهل في الفهم والقراءة، وهي تتضمن مجموعة محدودة من التعليمات الخاصة بالتعامل المباشر مع العتاد الصلب والتجهيزات الإلكترونية القابلة للبرمجة، وهي تختلف بحسب ببنية كل معالج فكل جيل من المعالجات له لغة التجميع الخاصة به. على سبيل المثال، يوضح الكود التالي برنامجًا مكتوبًا بلغة التجميع لجمع عددين وهو مخصص للعمل على معالج Intel x86 ويجمع العددين 5 و 7 assembly section .data num1 dd 5 num2 dd 7 result dd 0 section .text global _start _start: mov eax, [num1] add eax, [num2] mov [result], eax ; Exit the program mov eax, 1 ; System call number for exit xor ebx, ebx ; Exit status 0 int 0x80 ; Make system call إذا قرأت الكود السابق فستنتج أن أول قسم منه Section .data يعرَف العددين num1 و num2 وهي المدخلات المطلوب جمعهما، كما يعرف متغير result لحفظ نتيجة الجمع، أما القسم _start فهو يشير لبداية البرنامج. وبعدها تبدأ التعليمات الفعلية حيث تنقل التعليمة mov eax, [num1] القيمة المخزنة في num1 إلى المُسجَّل eax وتنقل التعليمة add eax, [num2] القيمة المخزنة في عنوان num2 إلى هذا المُسجَّل، وبعدها تُنقَل قيمة المُسجَّل إلى المتغير result الذي يخزن نتيجة الجمع النهائية، وتستخدم التعليمات الثلاثة الأخيرة للخروج من البرنامج وإنهاء تنفيذه. كما تلاحظ هذه اللغة مفهومة أكثر من لغة الآلة المليئة بالأصفار والوحدات لكنها لا تزال صعبة ومربكة، وتحتاج من المبرمج لأن يهتم بتفصيل دقيقة مثل تحديد المسجلات التي سيتم استخدامها ونقل البيانات إليها أو منها أثناء تنفيذ البرنامج، كما أنها لا تصلح لتطوير البرامج والخوارزميات المتقدمة وستنتج قدرًا كبيرًا من الكود لتنفيذ كل عمليلة. لغات متوسطة المستوى Mid-Level Languages بعد لغة التجميع، طورت لغات برمجة أخرى مثل بيزك BASIC وفورتران FORTRAN وباسكال Pascal وسي C و C++‎ سميت بلغات البرمجة متوسطة المستوى، وهي لغات تقع في مكان وسطي بين لغات البرمجة منخفضة المستوى ولغات البرمجة ذات عالية المستوى مثل بايثون Python أو جافا Java، وهي تتيح للمبرمجين التحكم في التفاصيل الدقيقة للعتاد، وتوفر في نفس الوقت مستوى أعلى من المرونة في التعامل. على سبيل المثال لجمع عددين بلغة البرمجة C سيكون الكود بالشكل التالي: #include <stdio.h> int main() { // تعريف المتغيرات int num1 = 5; int num2 = 7; int result; // جمع الأرقام result = num1 + num2; // طباعة النتيجة printf("النتيجة هي: %d\n", result); return 0; } لغات عالية المستوى High-Level Languages أخيرًا ظهرت لغات الجيل الثالث أو لغات البرمجة عالية المستوى مثل بايثون Python وروبي Ruby وجافا سكريبت JavaScript لتبسيط البرمجة على المطورين والمبرمجين، فهذه اللغات تعد من أسهل لغات البرمجة وتكتب تعليماتها بمفردات قريبة من مفردات اللغة الانجليزية المحكية، وهي سهلة القراءة والفهم من قبل البشر، ولا تضطرنا للتعامل مع التفاصيل الدقيقة المتعلقة بالعتاد. لكن هذه اللغات تحتاج إلى ترجمتها أو تفسيرها ليفهمها معالج الحاسوب ثم يتمكن من تنفيذها بالشكل الصحيح. وهذه اللغات ليست مرتبطة بنوع جهاز معين حيث يمكن تحويل أوامرها إلى تعليمات مختلفة بلغة الآلة حسب كل جهاز كي يتمكن من تفسيرها وتنفيذها. على سبيل المثال يحقق الكود التالي بلغة بايثون نفس وظيفة الكود السابق لجمع عددين، ويمكنك أن تلاحظ بساطة وسهولة اللغة ومدى قربها من كلامنا المحكي مقارنة بالأكواد السابقة: # تعريف المتغيرات num1 = 5 num2 = 7 # جمع الأرقام result = num1 + num2 # طباعة النتيجة print("النتيجة هي:", result) ما هي لغة الآلة وكيف تعمل لغة الآلة أو لغة الأصفار والواحدات هي لغة برمجة تتكون من أوامر وتعليمات مكتوبة بطريقة يستطيع الحاسوب فهمها ومعالجتها، فالحاسوب يفهم في الواقع فقط الأصفار والواحدات حيث أن الرقم 1 يعني وجود تيار أو جهد كهربائي، والرقم 0 يعني عدم وجود تيار أو جهد كهربائي. وفي بدايات ظهور الحواسيب كانت هذه الأرقام تحول إلى أوامر، ومن ثم تنفذ مباشرة بواسطة وحدة المعالجة المركزية CPU. ويكون كل أمر عبارة عن رمز رقمي أو سلسلة من الرموز الرقمية الممثلة بالنظام الثنائي أو الست عشري كما شرحنا سابقًا، وتجدر الإشارة الأن هذه الرموز الرقمية خاصة بكل جهاز حيث تطور لكل بنية معالجات لغة آلة خاصة به. وقد كانت الطريقة الوحيدة لإدخال هذه التعليمات إلى الحواسيب في بدايات ظهورها هي من خلال البطاقات المثقبة فإجهزة الحواسيب الأولى لم تكن أجهزة قادرة بعد على تخزين البيانات في ملفات لذا إذا أردت كتابة برنامج بلغة الآلة وإدخاله للحاسوب فإن الطريقة الوحيدة هي استخدام هذه البطاقات المثقبة. تحتوي كل بطاقة على ثقوب تُعبر عن تعليمات محددة للكمبيوتر حول المهام التي نريد تنفيذها، فإذا كان الثقب موجودًا سيمثل القيمة 1، وإذا لم يكن هناك ثقب يمثل القيمة 0، وكان لهذه البطاقات أشكال عديدة لكن أشهرها كان البطاقة المكونة من 80 عمودًا التي طورتها شركة IBM في عام 1928 كما هو موضح في الصورة التالية. مصدر الصورة تخيل أنك ستحتاج إلى بطاقة واحدة مشابهة من أجل كتابة كل سطر من التعليمات البرمجية! لذا كانت كتابة برنامج كامل باستخدام هذه البطاقات أمرًا في غاية الصعوبة ويتطلب مجموعة هائلة من البطاقات، وكانت هذه البطاقات تمرر إلى الحاسوب بشكل تسلسلي إلى جهاز مخصص يسمى قارئ البطاقات ليقوم بقراءة تعليماتها عمودًا عمودًا ويحول تسلسل الثقوب إلى معلومات رقمية، ثم يحملها في ذاكرة الحاسوب، وبعد اكتمال قراءة وتحميل كل البطاقات في الذاكرة ينفذ تعليماتها البرمجية ثم يخرج النتائج على شكل بطاقات مثقبة أيضًا. ولك أن تتخيل كم كان المبرمجون الأوائل يبذلون جهدًا في عملية البرمجة والتواصل مع الحاسوب، وقد استمر العمل بهذه الآلية ظهرت الأقراص المغناطيسية والأجهزة الطرفية peripherals لتخزين وإدخال البيانات وظهرت أجهزة الحواسيب الشخصية التي ألغت استخدام البطاقات المثقوبة ووجعلتها جزءًا من تاريخ لغات البرمجة. مميزات لغة الآلة بالرغم من أن لغة الآلة صعبة ومعقدة على البشر، إلا أنها تتمتع بمجموعة من المميزات والخصائص من أهما: تستخدام لغة الآلة الأرقام الثنائية 0 1 التي يفهمهما الحاسوب وينفذها مباشرة دون الحاجة إلى مترجم لتفسيرها. تسمح لغة الآلة للمبرمجين بالتحكم في عتاد الحاسوب مثل المعالج والذاكرة بشكل مباشر. تتميز لغة الآلة بالسرعة والكفاءة مقارنة مع اللغات عالية المستوى. تصلح لغات المستوى المنخفض لتطوير برامج النظام الأساسية للحواسيب. عيوب لغة الآلة من أبرز العيوب التي تعاني منها لغة الآلة ما يلي: من الصعب كتابة البرامج والخوارزميات المعقدة وتنفيذها باستخدام لغة الآلة. تتطلب كتابة الكثير من أسطر التعليمات البرمجية لبرنامج بسيط يتطلب تعديل البرامج الكثير من الوقت والجهد من الصعب تحديد وتصحيح الأخطاء البرمجية للبرامج المكتوبة بلغة الآلة تكون لغة الآلة خاصة بالأجهزة أي أنها تعتمد على نوع أو عائلة معالج الجهاز الذي ستعمل عليه لذا تختلف من جهاز لآخر الخلاصة تعرفنا في مقال اليوم على لغة الآلة التي تقع في أدنى مستويات لغات البرمجة والتي يفهمها الحاسوب بشكل مباشر وينفذها بواسطة وحدة المعالجة المركزية CPU، وتعرفنا على طريقة التعامل معها وأبرز مميزاتها وعيوبها. واليوم لم تعد لغة الآلة أو لغات المستوى المنخفض تستخدم من قبل المبرمجين إلا في مجالات وتطبيقات محدودة للغاية تحتاج للتعامل مع عتاد الحاسوب مباشرة، فقد أصبحت لغات البرمجة عالية المستوى أسهل بكثير ولكن تذكر أن جميع لغات البرمجة تحول في نهاية المطاف إلى برامج بلغة الآلة كي تنفذ من قبل الحاسوب. اقرأ أيضًا مستويات لغات البرمجة دليلك إلى أنواع لغات البرمجة قواعد البرمجة ببساطة للمبتدئين تعلم أساسيات البرمجة
    2 نقاط
  17. تمثل لغات البرمجة عالية المستوى نسبة تزيد عن ثمانين بالمائة من أشهر خمسين لغة برمجة في المجتمع التقني، ما يجعلنا نتساءل: ما هي لغات البرمجة عالية المستوى؟ ولماذا تعد مشهورة إلى هذا الحد؟ وما أشهر استخدامات هذا النوع من لغات البرمجة؟ تعريف لغات البرمجة عالية المستوى تتعدد مستويات لغات البرمجة، فمن لغات البرمجة لغات منخفضة المستوى تساعد المطور على التخاطب المباشر مع عتاد الحاسوب، ما يجعلها مميزة في إدارة موارد الحاسوب، ويوجد كذلك لغات برمجة عالية المستوى، وتعد أكثر تجريدًا عن عتاد الحاسوب وتجعل تركيز المطور ينصبُّ على خواص التطبيق ومميزاته، وهي أسهل من اللغات منخفضة المستوى وأقرب منها إلى اللغات البشرية. تعد لغات البرمجة عالية المستوى نوعًا من لغات البرمجة يسمح للمطور بتطوير برمجيات مجردة عن عتاد الحاسوب، بمعنى أنَّ المطور لا يحتاج إلى وصف طريقة تعامل الأجزاء المختلفة من البرنامج مع المكونات الداخلية للحاسوب مثل: المعالج والذاكرة المؤقتة والذاكرة الدائمة، وتهدف لغات البرمجة عالية المستوى إلى تسهيل عملية تطوير البرمجيات وزيادة إنتاجية المطور، وكذلك تقريب بنية لغات البرمجة إلى بنية اللغات البشرية حتى تسهُل قراءة الشيفرات وكتابتها. أنواع لغات البرمجة عالية المستوى يجب ترجمة كل برنامج مكتوب بلغة برمجة عالية المستوى إلى لغة الآلة قبل تنفيذه، وتنقسم لغات البرمجة عالية المستوى إلى نوعين رئيسيين تبعًا لطريقة ترجمة الشيفرات، وهما: لغات برمجة مترجمة Compiled Programming Languages: يعد المترجم برنامجًا حاسوبيًا يعمل كوسيط بين برنامجك الرقمي والآلة، ويعمل على ترجمة شيفرات البرنامج كاملة إلى لغة الآلة ثم تنفيذها دفعةً واحدة، ويتميز هذا النوع من لغات البرمجة بالسرعة والكفاءة، ومن أشهر أمثلته لغة سي بلس بلس C++‎ وراست Rust وجو Go. لغات برمجة مفسرة Interpreted Programming Languages: يتشابه المفسر مع المترجم في وساطته بين البرنامج والآلة ولكنه يختلف في طريقة الترجمة، إذ يقرأ المفسر الشيفرات واحدة تلو الأخرى ويترجمها إلى لغة الحاسوب وينفذ كل شيفرة مباشرة بعد ترجمتها، ويتميز هذا النوع بالسهولة والمرونة، ومن لغاته بايثون Python وجافا سكريبت JavaScript وبي إتش بي PHP. تُستخدم لغات البرمجة عالية المستوى في كل مجال برمجي تقريبًا، فهي تُستخدم في المجالات الكلاسيكية، مثل: تطوير الويب وتطبيقات الهاتف وتطبيقات سطح المكتب، وكذلك تُستخدم في المجالات الحديثة، مثل: الذكاء الاصطناعي وتحليل البيانات، كما تدخل في مجالات الأمن السيبراني ومجالات سلسلة الكتل Blockchain والعملات الرقمية وسائر المجالات التقنية الأخرى، ومن أشهر لغات البرمجة عالية المستوى لغة بايثون وجافا و PHP و R و كوتلن وجو و C وC#‎. الفرق بين لغات البرمجة عالية المستوى ولغات البرمجة منخفضة المستوى تعد لغات البرمجة منخفضة المستوى نوعًا من اللغات البرمجة يوفر تواصلًا مباشرًا مع عتاد الحاسوب، وتشبه بنيتها بنية لغة الآلة، ومن أبرز الفروق بينها وبين اللغات عالية المستوى نذكر التالي: تتميز لغات البرمجة عالية المستوى بسهولة قراءة وكتابة الشيفرات ما يجعل تطوير البرمجيات سهلًا وسريعًا، وكذلك تسهُل عمليتا الاختبار ومعالجة الأخطاء مما يساعد على حفظ أمان البرنامج، بينما تتميز اللغات منخفضة المستوى بالوصول المباشر لعتاد الجهاز واستهلاك موراده بالطريقة الأمثل. تُستخدم لغات البرمجة عالية المستوى في جميع المجالات البرمجية تقريبًا،مثل برمجة تطبيقات الويب والجوال وتطبيقات الذكاء الاصطناعي وتحليل البيانات، أما لغات البرمجة منخفضة المستوى فتُستخدم اليوم في مجالات محدودة تحتاج للتعامل مع عتاد الحاسوب مباشرة، مثل: تطوير أنظمة التشغيل وتطوير الأنظمة المدمجة. أنواع لغات البرمجة عالية المستوى تعد النماذج البرمجية منهجيات لكتابة الشيفرات وحل المشكلات البرمجية وتختلف أهداف كل نموذج برمجي عن الآخر، وقد تدعم لغة البرمجة الواحدة أكثر من نموذج برمجي، وتتعدد أنواع لغات البرمجة عالية المستوى تبعًا للنماذج البرمجية، منها: لغات البرمجة كائنية التوجه Object-Oriented Programming Languages لغات البرمجة الوظيفية Functional Programming Languages لغات البرمجة الإجرائية Procedural Programming Languages لغات البرمجة المنطقية Logical Programming Languages لنشرح بمزيد من التفصيل مميزات كل نوع من هذه الأنواع وأشهر لغات البرمجة التي تندرج ضمنه. لغات البرمجة كائنية التوجه Object-Oriented Programming Languages يعد نموذج البرمجة كائنية التوجه أشهر نموذج برمجي في المجتمع التقني؛ ذلك لتقسيمه البرنامج كاملًا إلى مجموعات صغيرة من الشيفرات القابلة لإعادة الاستخدام في مواضع أخرى، ما يساعد على تقليل إجمالي عدد الشيفرات النهائي للبرنامج وبالتالي تحسين أدائه، وكذلك يساعد على تنظيم الشيفرات وتسهيل عملية اختبار البرنامج ومعالجة أخطائه مما يرفع من أمان البرنامج. يقوم نموذج البرمجة كائنية التوجه على مفهوم الأصناف Classes التي تحتوي على كائنات Objects، والكائنات هي بيانات البرنامج التي تمتلك واصفات Attributes وطرق أو توابع Methods، والواصفات هي المتغيرات Variables التي تتضمن نوع بيانات الكائن وحجمها وتفاصيلها، وأما الطرق فهي الدوال البرمجية التي تحقق الوظائف Functions التي تقوم بها الكائنات. ويمكننا تشبيه الصنف في نموذج البرمجة كائنية التوجه بنموذج تصنيع لسيارة، فالواصفات في هذا المثال هي مواصفات السيارة بدءًا من لونها مرورًا بسرعتها وصولًا إلى سعرها، أما التوابع فهي أفعال السيارة، مثل: التشغيل وزيادة السرعة وتغيير الاتجاه، أما الكائنات فهي السيارات النهائية الناتجة عن هذا الصنف. class Car: # These are the attributes of the object: color = 'Red' speed = "180KM\H" price = "5500 USD" # These are the methods of the object: def turn_on(self): return 'Car is turned on' def increase_speed(self): return 'Speed is increased' def change_direction(self): return 'Direction is changed' the_car = Car() # This is the object print(the_car.color) # Output: Red print(the_car.turn_on()) # Output: Car is turned on تدعم لغاتُ برمجةٍ عديدة نموذجَ البرمجة كائنية التوجه، ولعل أشهرهم بايثون وجافا وسي بلس بلس C++‎ وجافا سكريبت وروبي وبي إتش بي PHP وكوتلن. وتُستخدم لغات البرمجة كائنية التوجه في مجالات عديدة، منها: تطوير تطبيقات الويب وتطوير تطبيقات الهاتف. لغات البرمجة الوظيفية Functional Programming Languages تعتمد لغات البرمجة الوظيفية على بناء البرنامج كاملًا من مجموعة من الوظائف البرمجية Functions، ويعد نموذج البرمجة الوظيفية مبنيًا على مصطلح الوظائف النقية Pure Functions، وهو نوع من الوظائف تعتمد نتائجه اعتمادًا كليًّا على البيانات الداخلة له، ولا تحتاج الوظيفة إلى تعديل البيانات الداخلة أو تعيين متغيرات للتمكُّن من إصدار النتائج. def pure_function(a, b): return a + b print(pure_function(2, 3)) # Output: 5 def impure_function(a, b): new_a = a + 3 new_b = b + 4 new_data = a + b return new_data print(impure_function(2, 3)) # Output: 19 تتميز لغات البرمجة الوظيفية بقابلية إعادة استخدام الشيفرات وسهولة الاختبار وحل المشكلات، وتُستخدم لغات البرمجة الوظيفية بكثرة في المجالات المعتمدة على تحليل أحجام ضخمة من البيانات، مثل: معالجة البيانات والذكاء الاصطناعي والحوسبة العلمية والحوسبة الرياضية ومزامنة الأنظمة، ومن أشهر لغات البرمجة الوظيفية هاسكل وسكالا وإرلانج وليسب، كما تدعم بايثون هذا النموذج البرمجي. لغات البرمجة الإجرائية Procedural Programming Languages تعد البرمجة الإجرائية نموذجًا برمجيًا سهلًا يساعد على كتابة البرنامج على هيئة خطوات برمجية منطقية متسلسلة، ويساعد نموذج البرمجة الإجرائية على تنظيم شيفرات البرنامج بطريقة وجعلها سهلة القراءة ومنطقية التسلسل، وتُستخدم لغات البرمجة الإجرائية عادةً لكتابة الخوارزميات والعمليات الحسابية ولكتابة برمجيات التشغيل الآلي أو الأتمتة Automation، كما تُستخدم أحيانًا لتطوير أنظمة التشغيل، وتدعم هذا المجال لغاتٌ مثل لغة ++C‎ وجافا وباسكال. def greet_user(): name = input("Enter your name: ") # Procedure 1: Asking the user about his name # Procedure 2: Storing the name of the user in a variable print(f"Hello {name}!") # Procedure 3: Constructing the greeting message greet_user() # Procedure 4: Displaying the greeting message for the user لغات البرمجة المنطقية Logical Programming Languages تعتمد البرمجة المنطقية على المنطق الرسمي Formal Logic، وهو نظام لتحليل وتقييم النتائج المحتملة بناءً على حقائق Facts وقواعد Rules، ثم استخراج النتيجة السليمة والمنطقية للتساؤلات Queries، وتعد لغة برولوج Prolog أشهر لغة برمجة منطقية، ويشيع استخدام لغات البرمجة المنطقية في مجالات الذكاء الاصطناعي والتعلُّم الآلي ومعالجة اللغة الطبيعية. likes(Mohammed, Apples). % This is a fact that Mohammed likes apples likes(Ahmed, Grapes). likes(Mahmoud, Pizza). % This is a rule that people who share the same food preferences are good friends good_friends(Person1, Person2) :- likes(Person1, Food) likes(Person2, Food) مميزات لغات البرمجة عالية المستوى التجريد Abstraction: تعد اللغات عالية المستوى مجردة عن عتاد الحاسوب، أي إن المطور يعمل على تطوير البرنامج ليناسب نظام التشغيل، ويحاول مراعاة مكونات الحاسوب لكن دون حاجة إلى توصيف طريقة تعامل البرنامج مع العتاد، مما يوفر كثيرًا من الوقت والجهد ويجعل عملية التطوير أسهل ويزيد من كفاءة التطبيقات وخواصها. الأمان: تضم معظم لغات البرمجة عالية المستوى مكتباتٍ وأدواتٍ تساعد على اختبار شيفرات البرنامج واستخراج ثغراتها ثم سد هذه الثغرات، ما يساهم في تقليل احتمالية اختراق التطبيق وتعسير الوصول إلى بيانات المستخدمين. التوافقية Portability: تدعم غالبية اللغات عالية المستوى تعدد المنصات، والتي تعني قدرة البرنامج على العمل على أنظمة تشغيل مختلفة، كأن يعمل برنامج سطح المكتب على ويندوز ولينكس وMacOS، كما تتوافق لغات البرمجة عالية المستوى مع مواصفات العتاد المختلفة للحواسيب أيضًا. تعدد الاستخدامات: تُستخدم لغات البرمجة عالية المستوى في مجالات لا حصر لها، بدءًا من تطوير التطبيقات للمنصات المختلفة، مرورًا بتطوير الألعاب، وصولًا إلى تطوير برمجيات الذكاء الاصطناعي وتحليل البيانات وغيرها. سهولة الاستخدام: يسهل تعلم لغات البرمجة عالية المستوى، وذلك لتشابه الكثير من شيفراتها باللغة الإنجليزية، وكذلك يسهل العمل بها لقلة عدد الشيفرات المطلوبة لتطوير البرمجيات. أمثلة على لغات البرمجة عالية المستوى تنتشر لغات البرمجة عالية المستوى وتكثر، ومن أشهرها: بايثون Python سي بلس بلس C++‎ جافا Java جافا سكريبت JavaScript بي إتش بي PHP سويفت Swift لنستعرض ماهية كل لغة ونماذجها البرمجية المدعومة وحالات استخدامها. لغة بايثون Python تعد بايثون إحدى لغات البرمجة العصرية التي يزداد رواجها في الأوساط البرمجية، وهي لغة عالية المستوى مفسرة، تدعم البرمجة كائنية التوجه والبرمجة الوظيفية والبرمجة الإجرائية، وتعد لغة عامة الاستخدامات، إذ تُستخدم في مجالات عديدة ومختلفة، مثل: الذكاء الاصطناعي وتحليل البيانات وتطوير الويب وتطوير تطبيقات سطح المكتب وغيرها. لغة C++‎ تقع لغة C++‎ ضمن أشهر لغات البرمجة عالية المستوى المترجمة، وتدعم البرمجة كائنية التوجه والبرمجة الإجرائية كليًا، وتدعم بعض خواص البرمجة الوظيفية، وتتعدد استخدامات لغة C++‎‎‎، ومن أشهر استخداماتها تطوير أنظمة التشغيل وتطوير الألعاب وتطوير تطبيقات السحابة وإنترنت الأشياء. لغة جافا Java تعد جافا لغة برمجة عالية المستوى كائنية التوجه تدعم التنفيذ كلغة مترجمة وكلغة مفسرة أيضًا، وتشتهر كثيرًا في مجال تطوير تطبيقات الهاتف ولا سيما الموجهة منها إلى نظام تشغيل أندرويد، كما يشيع استخدامها في مجال تطوير الألعاب. لغة جافا سكريبت JavaScript تتعدد النماذج البرمجية للغة جافا سكريبت، فهي تدعم البرمجة الإجرائية والبرمجة الوظيفية، وكذلك تعد داعمة لنموذج البرمجة كائنية التوجه، وتعد لغة مفسرة، وتبرز جافا سكريبت بشدة في مجال تطوير الواجهات الأمامية لتطبيقات الويب. لغة PHP تعد لغة PHP واحدة من لغات البرمجة المفسرة الكلاسيكية التي لا تزال مستخدمة إلى يومنا هذا، وهي داعمةٌ للبرمجة كائنية التوجه والبرمجة الإجرائية، وتُستخدم في تطوير جهة الخادم Server-Side في تطبيقات الويب. لغة سويفت Swift تحظى لغة سويفت بشعبية واسعة رغم حداثتها وظهورها متأخرًا في الأوساط البرمجية، وهي لغة مترجمة وتتلاءم بشدة مع نموذج البرمجة كائنية التوجه، وكذلك تدعم بعض النماذج البرمجية الأخرى مثل البرمجة الوظيفية، وتُستخدم سويفت لتطوير تطبيقات الجوال الموجهة إلى نظام تشغيل iOS. الخلاصة تعرفنا في مقال اليوم على أهمية لغات البرمجة عالية المستوى وأبرز أنواعها وتطبيقاتها، ويمكن القول أنه لا يمكن الاستغناء عن لغات البرمجة عالية المستوى في عصرنا الحالي، بل يسعى خبراء المطورين لتحديثها وتعديلها تارةً بتارةٍ حتى تكون أسهل وأقرب إلى اللغات البشرية، ولكي تصبح أكفأ وأسرع وأكثر أمانًا، وتُوائِم التغيرات السريعة في عالم التقنية، فاحرص على حجز وظيفتك في المستقبل بتعلُّم إحدى لغات البرمجة عالية المستوى من دورات أكاديمية حسوب المميزة. اقرأ أيضًا ما هي مدة تعلم البرمجة اكتشف ما هي البرمجة وما أهمية تعلمها دليلك الشامل إلى لغات البرمجة لغات برمجة الذكاء الاصطناعي دليلك إلى لغات برمجة الألعاب
    2 نقاط
  18. مما لاشك فيه أن دراسة البرمجة وتعلمها أمر في غاية الأهمية في عصرنا الحالي فمن خلالها ستتمكن من فهم أجهزة الحاسوب والتقنيات المختلفة والتعامل معها بكفاءة، كما ستضمن الحصول على فرصة عمل جيدة ومربحة. فإذا كنت مهتمًا بالبرمجة وتتساءل كيف أدرس البرمجة وأحترفها خلال فترة وجيزة، وتود التعرف على طرق دراسة البرمجة المختلفة وأبرز مميزات وتحديات كل طريقة من هذه الطرق أنصحك بقراءة هذا المقال للنهاية. أهمية دراسة البرمجة قبل التعرف على طرق البرمجة، دعنا نستعرض أهمية دراسة البرمجة حيث توفر دراسة برمجة الحاسب العديد من المميزات والفوائد ومن بينها: تجعلك دراسة البرمجة شخصًا مثقفًا تقنيًا وقادرًا على التعامل مع الحاسوب والتفاعل معه وإخباره بما يجب عليه فعله لحل العديد من المشكلات التي تواجهك. توفر لك دراسة البرمجة وظائف ذات أجور مرتفعة وتعد تخصصات البرمجة ومجالات عملها المختلفة واحدة من أعلى الوظائف أجرًا وتضمن لك الاستقلالية المالية. تعد البرمجة واحدة من أكثر المهن المطلوبة والواعدة في المستقبل وهي مهارة مطلوبة في مختلف مجالات العمل المختلفة وليس فقط التخصصات التقنية فمعظم الأعمال في الوقت الحالي تعتمد على التقنية واستخدام الحواسيب. إمكانية العمل من أي مكان وبأي وقت في الليل أو النهار، كما يمكنك العمل كموظف بدوام كامل أو كمستقل والتعامل مع عملاء من أي مكان في العالم، كل ما ستحتاجه هو جهاز حاسوب متصل بالإنترنت ولن يكون هناك أي حدود تمنعك من تحقيق أهدافك المهنية. تجعلك دراسة البرمجة شخصًا أكثر ذكاء، وتعزز مهارات التفكير المنطقي لديك، وتكسبك منظورًا جديدًا للتعامل مع أي مشكلات تواجهك في الحياة أو العمل فالبرمجة في النهاية ليست سوى مهارة حل المشكلات ومن منا لا يحتاج لهذه المهارة! يمكنك من خلال دراسة البرمجة تحويل أي فكرة مميزة تخطر ببالك سواء فكرة تطبيق جوال أو فكرة موقع أو لعبة إلكترونية لمنتج فعلي يستفيد منه الآخرون. طرق دراسة البرمجة إذا كنت مهتمًا بالبرمجة وتتساءل عن كيفية دراسة البرمجة بكفاءة ولا تعرف من أين تبدأ نظرًا لوجود العديد من طرق دراسة البرمجة والكثير من لغات البرمجة التي يمكنك البدء بتعلمها فسوف نساعدك من خلال الفقرات التالية في اختيار الطريقة واللغة المناسبة لك. حيث يمكنك اختيار الدراسة الذاتية للبرمجة والاستفادة من الكثير من مصادر التعلم المجانية أو المدفوعة المتوفرة عبر الإنترنت من دروس ومنتديات وكتب شاملة ومقاطع فيديو ودورات تدريبية ومعسكرات برمجية،فهذه هي الطريقة التي تتقدم بها بسرعة لتصبح خبيرًا في البرمجة، والتي تساعدك على دراسة أي لغات من لغات البرمجة أو التقنيات المطلوبة لكتابة أكواد البرمجة بمرونة وفعالية وفي أقصر وقت ممكن. كما يمكنك اختيار الدراسة الجامعية لتعلم البرمجة، وفي هذه الحالة سيكون عليك الانتساب لإحدى الجامعات العامة أو الخاصة التي توفر كلية موجهة لتعليم هندسة البرمجيات أو علوم الحاسوب أو برمجة الحاسوب أو أي تخصص مشابه وتتعلم خلال سنوات الدراسة التي تمتد على عدة سنوات مجموعة متنوعة من لغات البرمجة ومبادئ وهندسة البرمجيات وقواعد البيانات ومعمارية الحاسوب والرياضيات والفيزياء وغيرها من المواد العديدة الأخرى التي قد لا تحتاجها في سوق العمل. سنسلط الضوء في الفقرات التالية مميزات وعوائق كل طريقة من هذه الطرق، ونترك لك موازنة الإيجابيات والسلبيات من كي تتمكن من معرفة طريقة دراسة البرمجة المناسبة لك. الدراسة الذاتية للبرمجة إذا اخترت الدراسة الذاتية في البرمجة فهذا يعني أنك مسؤول عن البحث بنفسك على مصادر التعلم المختلفة التي ستتعلم منها عبر الإنترنت وستجد خلال بحثك الكثير من المصادر بأشكال متنوعة من دروس ومقالات عبر الإنترنت وكتب ومقاطع فيديو ودورات تدريبية ومشاريع جاهزة يمكنك دراستها وفهم البرمجة من خلالها ولك كامل حرية اختيار المصادر التي تناسبك للتعلم منها فلكل منا طريقة يفضلها على غيرها. التحدي الأساسي الذي سيواجهك عندما تقرر الدراسة الذاتية للبرمجة هو أنك تحتاج لامتلاك قدر كبيرة من التنظيم والانضباط الشخصي والتحفيز الذاتي وتحديد هدف التعلم الخاص بك ووضع خطة مناسبة لتحقيق هذا الهدف وتقرر عدد الساعات التي ستقضيها يوميًا في التعلم وهذا وتقرر بنفسك مدى تقدمك وهذا قد لا يكون سهلًا. مميزات دراسة البرمجة بصورة ذاتية توفر دراسة البرمجة بصورة ذاتية العديد من المميزات من أبرزها: المرونة في تحديد أوقات الدراسة ووتيرة التعلم بحسب ظروفك واستيعابك وقدراتك الشخصية. اختيار لغات البرمجة والتقنيات التي تريد تعلمها بحسب ميولك واهتمامك أو حسب متطلبات سوق العمل. حرية في اختيار مصادر وتقنيات التعلم التي تناسبك والتي تشعر بأنها توصل لك المعلومات بطريقة تحبها. الدراسة من مصادر حديثة من فالتقنيات ولغات البرمجة تتطور بوتيرة سريعة ومن الضروري تكون على اطلاع دائم على أحدث المستجدات. إمكانية الدراسة عن بعد والعمل لاحقًا من منزلك أو أي مكان يناسبك ضمن أوقات مرنة تناسب ظروفك. وأخيرًا من أبرز الفوائد التي ستجنيها عند دراسة البرمجة بشكل ذاتي هو التركيز على المعرفة العملية وبناء المشاريع التي تفيدك في سياق تخصصك البرمجي وتجاهل المواد النظرية المملة أو التقنيات التي لا تحتاج لاستخدامها مما يوفر عليك الكثير من الوقت والجهد. تحديات دراسة البرمجة بصورة ذاتية عندما تقرر دراسة البرمجة بصورة ذاتية العديد ستواجه العديد من العقبات وأبرزها: التشتت وعدم القدرة على الدراسة من مصدر أو منهج تعليمي منظم قد تفشل في تحديد المعلومات أو المفاهيم الضرورية وترتيب تعلمها الصحيح. التسويف وعدم القدرة على الالتزام و ضبط دراسة البرمجة بنفسك والحفاظ على وتيرة منتظمة في التعلم. فقدان الشغف والرغبة في مواصلة الدراسة فبدون وجود معلم يوجهك وزملاء يشاركونك التعلم قد لا يشجعك على المتابعة فقدان التوجيه المباشر والإجابة على أسئلتك وتوضيح ما يصعب عليك فهمه وحل المشكلات التي تواجهها قد يجعلك تحبط سريعًا وتتخلى عن دراسة البرمجة. إذا كنت تواجه هذه التحديات بالفعل فمن الأفضل في هذه الحالة أن تتبع دورة منظمة من أجل دراسة برمجة الحاسوب، تساعدك دورات أكاديمية حسوب المنهجية على تنظيم دراستك والالتزام بمنهج منظم ومحتوى تعلمي مرتب ومعد بشكل مدروس يسهل عليك دراسة البرمجة بشكل منهجي من المفاهيم الأساسية إلى المفاهيم الأكثر تعقيدًا وبناء المشاريع البرمجية إلى جانب المتابعة مع مدربين أكفاء ومتعاونين يجيبونك على أي تساؤل أو مشكلة تواجهك والنقاش حول الأمور التي تستصعبها. الدراسة الجامعية لتعلم البرمجة الخيار الثاني لدراسة البرمجة هو الدراسة الأكاديمية في إحدى الجامعات المتخصصة في علوم الحاسوب أو هندسة البرمجيات أو المعلوماتية وفي هذه الحالة ستحتاج للدارسة لفترة طويلة نسبيًا لا تقل عن أربع إلى خمس سنوات لنيل البكالوريوس والحصول على شهادة معتمدة في تخصص البرمجة. ستضطر خلال سنوات الدراسة الطويلة إلى دراسة العديد من المواد النظرية كالرياضيات والإدارة إلى جانب دراسة البرمجة واللغات المختلفة كما أن التعلم سيكون أكاديميًا ونظريًا وغير محدث أكثر من كونه تطبيقيًا ويركز على المشاريع العملية المطلوبة في سوق العمل الأمر الذي يضطرك إلى الاعتماد على نفسك لترميم هذا النقص وتعلم التقنيات التي يحتاجها سوق العمل والتطبيق العملي لتعزيز خبرتك بنفسك فهذا في الواقع ما يبحث عنه أرباب العمل اليوم في سيرتك الذاتية أكثر من الاهتمام بالشهادات التي تحملها. مميزات الدراسة الجامعية لتعلم البرمجة توفر لك الدراسة الجامعية لتعلم البرمجة عدة مميزات من أبرزها ما يلي: الحصول على شهادة جامعية معتمدة تعزز فرصتك في الحصول على عمل. بيئة اجتماعية وتفاعلية تساعدك على دراسة البرمجة مع زملاء لهم نفس الاهتمامات. مناهج دراسية منظمة ومتسلسلة منطقيًا من الأساسيات للأمور المتقدم. الالتزام بجدول زمني صارم لدراسة المواد المطلوبة لا يمكن تخطيه. توفر مكتبات جامعية توفر مصادر وكتب برمجة منهجية وقيّمة تساعدك على الدراسة. تحديات الدراسة الجامعية لتعلم البرمجة من أبرز تحديات وصعوبات الدراسة الجامعية للبرمجة نذكر: الدراسة مكثفة ومليئة بالمواد النظرية المملة والمناهج غير المحدثة التي قد لا تواكب التطور التقني أولًا بأول وستشعر بفجوة بين ما تعلمته في الجامعة وما يتطلبه سوق العمل, مدة دراسة البرمجة طويلة وتستغرق أربع إلى خمس سنوات وقد تمتد لفترة أطول إن لم تتمكن من اجتياز إحدى السنوات. الدراسة الجامعية مكلفة مقارنة بالتعلم الذاتي لاسيما عند الدراسة في جامعة خاصة. إذا اخترت الدراسة الجامعية للبرمجة فسوف تقيم باعتماد أساليب تقليدية قديمة تختبر حفظ المفاهيم النظرية أكثر من تقيم المهارات الإبداعية والتفكير المنطقي الأساسي لدراسة البرمجة. فرص محدودة فقد لا تحظى بالقبول في الجامعة التي تفضلها وتضطر للدراسة في جامعة أخرى بعيدة عن مكان إقامتك أو دراسة مجال آخر. نصائح لتنجح في دراسة برمجة الحاسب حدد هدفك وسبب رغبتك في دراسة البرمجة والتخصص البرمجي الذي تميل له والمشاريع التي تطمح لتطويرها فإذا لم يكن لديك هدف تسعى لتحقيقه فسوف تتشتت وتشعر بالإحباط سريعًا. قبل أن تبدأ في دراسة البرمجة، من الضروري أن تبدأ بتعلم علوم الحاسوب إلى جانب تعلم الخوارزميات فهي خطوة أساسية تسرع دراسة البرمجة وتساعدك على التعامل مع الحاسوب وكتابة برامج حاسوبية لحل المشكلات بكفاءة. حدد لغات البرمجة والتقنيات التي تريد البدء بتعلمها بناء على الهدف الذي حددته في الخطوة الأولى وإذا كنت محتارًا في أي لغة يمكنك البدء بها يمكنك التفكير بلغات توصيفية سهلة مثل HTML و CSS أو البدء بإحدى لغات البرمجة السهلة على المبتدئين مثل لغة بايثون Python أو جافا سكريبت JavaScript أو روبي Ruby. تعلم البرمجة أمر يستغرق وقتًا وجهدًا ويتطلب منك تقبل فكرة التعلم بصورة مستمرة، لذا فمن الضروري أن تتحلى بالصبر وتملك نفسًا طويلًا ولا تهمل دراسة أساسيات البرمجة وتتأكد من فهمها بشكل صحيح قبل أن تنتقل لتعلم أمور متقدمة وتبدأ بتطوير مشاريع برمجية فعلية كي لا تحبط وتفشل في تحقيق هدفك. احرص على الجمع بين التعليم النظري والتطبيق العملي، وتأكد أنك مهما قرأت من دروس وأكواد فلن تحقق النتائج المرجوة من دراسة البرمجة إذا لم تقم بتطوير برامج وتطبيقات حقيقية. اختر مصادر تعلم جيدة وحديثة توصل لك المعلومات بطريقة مفهومة وسلسلة وبالترتيب الصحيح، ستجد في أكاديمية حسوب العديد من مصادر التعلم المفيدة من دروس ومقالات مجانية وكتب شاملة وتوثيقات برمجية تساعدك على دراسة البرمجة عن بعد كما ستجد مجموعة متنوعة من الدورات التدريبية المدفوعة التي تساعدك على تعلم البرمجة بطريقة منهجية وتلقي التوجيه اللازم خلال التعلم. وفي الختام أدعوك لمشاهدة هذا الفيديو المفيد للتعرف على أهم خطوات دراسة البرمجة ولغات البرمجة المتنوعة التي يمكنك تعلمها الخلاصة نرجو أن يكون هذا المقال قد أجابك على سؤال كيف يمكن البدء في تعلم البرمجة وساعدك في تحديد طريقة دراسة البرمجة الأنسب لك، وفي الختام يمكن أن نخلص لأن الدراسة الذاتية للبرمجة هي الخيار الأفضل إذا كنت تحب التعلم بشكل مستقل وتشعر بالرغبة في اكتشاف الأمور بنفسك وتملك التنظيم والانضباط الذاتي، في حين تعد الدراسة الجامعية لتعلم البرمجة غي الخيار الأفضل إذا كنت تفضل التعلم الموجه والمنظم وتحتاج لأن تتعلم في بيئة اجتماعية وتتفاعل مع زملاء آخرين خلال الدراسة. وتذكر أنه مهما كان الطريق الذي اخترته فلن تنجح في دراسة البرمجة إلا تحليت بالصبر والمثابرة، والتزمت بالتطبيق العملي واكتسب مهارة تصحيح الأخطاء البرمجية بنفسك وحرصت على تطوير نفسك بصورة مستمرة لتبقى في الصدارة. حظًا موفقًا! اقرأ أيضًا كل ما تود معرفته حول تعلم البرمجة ما هي فوائد تعلم البرمجة؟ تعرف على تخصص هندسة البرمجيات مدخل إلى تطوير البرمجيات Software Development الدليل الشامل لتعلم البرمجة
    2 نقاط
  19. نسلط الضوء في مقال اليوم على مستقبل البرمجة أحد أكثر المجالات تغيرًا وتجددًا، فالتقنيات والتخصصات البرمجية المختلفة تتطور بوتيرة هائلة وسريعة جدًا ما يحتم على أي مبرمج أو مطور أن يواكب هذه التغييرات ويكون على دراية بأهم الاتجاهات التي يتوقع أن تشهدها البرمجة في السنوات القادمة وتأثيرها على سوق العمل والوظائف المستقبلية. الذكاء الاصطناعي ومستقبل البرمجة لعل أول تساؤل يخطر ببال أي مبرمج بشأن مستقبل البرمجة هل ستحل الروبوتات والذكاء الاصطناعي محل المبرمجين في المستقبل، والجواب هو أن الذكاء الاصطناعي سوف يساعد المبرمجين بدلًا من استبدالهم كما أن تقنيات الذكاء الاصطناعي ستتطور بشكل أكبر ويساعد البشر على القيام بمهامهم المختلفة والحصول على النتائج التي يريدونها حول أي موضوع بشكل أفضل وأسرع. وكما تعرف فقد بدأ الذكاء الصناعي بالفعل في الآونة الأخيرة يؤثر بشكل مباشر على مختلف جوانب حياتنا، ويتوقع أن يزداد تأثيره في المستقبل أكثر وأكثر نتيجة لتطوير البنية التحتية التي يعتمد عليها وتطوير معيار اتصال الواي فاي wifi7 فائقة السرعة والتي تصل لغاية 36 جيجا بت في الثانية بعرض نطاق ترددي يصل إلى 320 ميجاهرتز وانتشار شبكات اتصالات الجوال من الجيل الخامس 5G والبدء بشبكات الجيل السادس 6g التي ستكون أسرع 1000 مرة من شبكة 5G. سيحسن هذا التطور في البنية التحتية من سرعة نقل البيانات ويقلل زمن وصولها ويعطي المبرمجين المتخصصين في الذكاء الاصطناعي وتعلم الآلة القدرة على تحليل ومعالجة هذه البيانات بكفاءة عالية، كما سيزيد من قدرتهم على تطوير حلول إنترنت الأشياء IoT عالية الكفاءة وتطوير تطبيقات متقدمة لم تكن متاحة مع الشبكات السابقة، وسيزيد الطلب أيضًا على برمجة أجهزة ذكية قادرة على اتخاذ القرارات مثل السيارات ذاتية القيادة وروبوتات المحادثة والمساعدين الافتراضيين والروبوتات الصناعية التي ستعمل جنبًا إلى جنب معنا نحن البشر أو ربما تؤدي مهامنا وتستغني عن وجودنا بالكامل لكن في مهن وتخصصات محدودة. كما سيلعب الذكاء الصناعي وتعلم الآلة دورًا أساسيًا في مستقبل البرمجة وكتابة الكود وسيزداد التوجه إلى الإصدار الثاني من البرمجيات Software 2.0 وهي البرمجيات التي تستخدم خوارزميات تعلم الآلة ML والشبكات العصبية لتؤدي عملها دون تدخل بشري ولا بد أنك سمعت أو استخدمت بوت المحادثة الذكي ChatGPT من Open AI وأداة OpenAI Codex الأكثر تخصصًا والتي تساعدك على إنتاج الأكواد البرمجية وتدعم العديد من لغات البرمجة فهما مثالان على برمجيات تعتمد على الذكاء الاصطناعي والتي من شأنها مساعدة المطورين والمبرمجين في تحسين عملهم وزيادة إنتاجيتهم ليركزوا على الأمور الأكثر أهمية في عملية التطوير. فإذا كنت مهتمًا بهذا المجال من الضروري أن تحرص على تعلم لغات البرمجة الخاصة بالذكاء الاصطناعي وتعلم الآلة ولعل أهمها لغة البرمجة بايثون Python التي توفر الكثير من أطر العمل والمكتبات القوية في مجال الذكاء الاصطناعي مثل مكتبة SciKit-Learn و TensorFlow و PyTorch و Keras. ولمطالعة المزيد من المعلومات حول خارطة طريق تعلم الذكاء الاصطناعي ومعرفة أدواته وتقنياته المختلفة أنصح بقراءة مقال تعلم الذكاء الاصطناعي ومقال تعلم الآلة Machine Learning. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن مستقبل إنترنت الأشياء إنترنت الأشياء IoT هو التقنية التي تجعل الأجهزة من حولنا ذكية وتتفاعل مع بعضها البعض وترسل البيانات عبر شبكة الإنترنت وتحللها وهو بلا شك أحد الجوانب التي ستؤثر على مستقبل البرمجة بشكل كبير، ومن المتوقع أن يزداد تأثيره في السنوات القادمة ليطبق بشكل أكبر في أتمتة منازلنا والتحكم بمختلف الأجهزة التي نستخدمها في حياتنا اليومية كأجهزة الإنذار وأنظمة التدفئة وأنظمة الإضاءة الذكية وأنظمة التحكم بالأبواب والستائر ويمكننا من التحكم بها من خلال التطبيقات المثبتة على هواتفنا الذكية، ولن يقتصر تطبيق إنترنت الأشياء على منازلنا فحسب بل سيستخدم بصورة أكبر في مختلف المجالات الصناعية كصناعة السيارات ومجال الرعاية الصحية وغيرها. ربما ستزيد هذه التقنيات من اعتمادية الناس العادية على الأجهزة لكنها ستفرض على معشر المبرمجين بذل جهد أكبر في تعلم تقنيات تطوير تطبيقات الأجهزة المضمنة وتطبيقات الأجهزة قابلة للارتداء والاطلاع على أحدث التغييرات التي ستطرأ على تطوير تطبيقات الجوال وتطبيقات الويب، إلى جانب اكتساب مهارات كافية في علوم البيانات لجعل هذه التطبيقات قادرة على التعامل مع كمية ضخمة من البيانات Big data فأجهزة إنترنت الأشياء ستولد لنا كميات هائلة من البيانات وهذه البيانات الضخمة تحتاج إلى تحليلها ومعالجتها واتخاذ قرارات صائبة منها. كما يحتاج المبرمجون المهتمون بهذا المجال إلى التركيز بشكل أكبر على أمان التطبيقات والمواقع التي يطورونها، ويتعلموا بشكل جيد طريقة التعامل مع بروتوكولات الاتصال وأجهزة الاستشعار والمنصات السحابية المناسبة حسب نوع التطبيق المطلوب، ويتقنوا اللغات والبروتوكولات الخاصة بإنترنت الأشياء مثل MQTT و CoAP و Zigbee. مستقبل البرمجة وعلم البيانات علم البيانات Data Science هو مجال حديث يجمع بين الإحصاء والرياضيات وعلوم الحاسوب ويهتم بدراسة البيانات ويعتمد عليها في اتخاذ القرارات من خلال الاستعانة بخوارزميات الذكاء الاصطناعي وتعلم الآلة، ويتوقع أن يزداد الطلب عليه بشكل أكبر في المستقبل نتيجة التضخم الهائل في حجم البيانات الذي نشهده، كما يتوقع أن يكون علم البيانات أحد أكثر المجالات المطلوبة في المستقبل لأن كافة المؤسسات والمنظمات وقطاعات العمل بدأت في الاعتماد عليه لاتخاذ قراراتها المختلفة مثل كشف عمليات الاحتيال والتوصية بالمنتجات المناسبة للعملاء وستحتاج للاعتماد عليه بشكل أكبر مستقبلًا. فإذا كنت مهتمًا بمجال علم البيانات أنصحك بأن تبدأ من الآن بتعلم التقنيات ولغات البرمجة الشهيرة في هذا المجال مثل لغة بايثون python ولغة R ونظم إدارة قواعد البيانات وبرامج التحليلات الإحصائية والتمثيل الرسومي للبيانات مثل Tableau و Power BI ومنصات البيانات الضخمة وتفهم أطر البيانات الضخمة مثل Spark و Hadoop لضمان مهنة لها دور واعد في مستقبل البرمجة. لمطالعة مزيد من المعلومات حول علم البيانات وتخصصاته وكيفية تعلمه أنصح بمطالعة مقال علم البيانات Data science: الدليل الشامل ومقال الدليل الشامل إلى تحليل البيانات Data Analysis. مستقبل تقنية البلوكتشين Blockchain أحدثت تقنية البلوكتشين Blockchain ثورة في طريقة التعامل الرقمي مع البيانات وهي تقنية تعتمد على تخزين المعاملات في قاعدة بيانات عملاقة مشفرة وآمنة لا مركزية وغير قابلة للتعديل تسمى دفتر الأستاذ الموزع distributed ledger وقد اكتسبت هذه التقنية شهرتها من العملات المشفرة المبنية عليها. ففي هذه التقنية تتم المعاملات على قاعدة البيانات بترتيب تسلسلي وتكون المعاملات لامركزية أي أنها تعمل على حواسيب موزعة في جميع أنحاء العالم وتتم مباشرة بين المستخدمين دون تدخل طرف ثالث وتكون مؤمنة بشكل كبير، على سبيل المثال عندما يبيع شخصان السلع لبعضهما البعض باستخدام عملة بيتكوين Bitcoin فلن يحتاجوا إلى المرور عبر وسيط مثل بيبال لإتمام هذه المعاملة. تتطور تقنية بلوكتشين بشكل متسارع ويتوقع أن تشهد المزيد من الاستخدامات في المستقبل في عدة مجالات فإلى جانب تحويل العملات المشفرة عبر الأجهزة سيعتمد عليها في إنشاء عقود ذكية مخصصة قادرة على التعامل مع المعاملات المعقدة والتحقق من المعاملات متعددة الخطوات وتسريع معالجة البيانات ونقلها بأمان، وبدأت تعتمد في العديد من القطاعات والمجالات مثل عمليات التصويت للانتخابات وحفظ المعاملات المالية وسندات الملكية. يتوقع أن تؤثر هذه التقنية على مستقبل البرمجة وتزيد الطلب على مطوري البلوكتشين بمختلف تخصصاتهم سواء المطورين الأساسيين blockchain core أو مطوري تطبيقات blockchain أو مطوري التطبيقات اللامركزية DApps ومطوري العقود الذكية باستخدام لغات مخصصة مثل solidity، فإذا كنت ترغب في تعلم مجال رائد في مستقبل البرمجة يمكنك البدء بتعلم تقنيات تطوير البلوكتشين والتعرف على منصاتها وبروتوكولاتها المختلفة. الحوسبة الكمومية Quantum Computing ستحل الحوسبة الكمومية التي تستخدم البتات الكمومية quantum bits أو ما يعرف بالكيوبتات qubits محل بالحوسبة الكلاسيكية التي تستخدم البتات bits أو نظام الأرقام الثنائية binary digits لتمثيل البيانات وتنفيذ العمليات، وستلعب دورًا فعالًا في مستقبل البرمجة من خلال زيادة سرعة معالجة كميات هائلة من البيانات وتسهيل حل المشكلات المعقدة التي استعصى على البشرية حلها. لا تزال الحوسبة الكمومية في بدايتها ويقتصر استخدام الحواسيب الكمومية اليوم على المجالات البحثية ولازالت تواجه حتى اليوم بعض التحديات التقنية والعملية التي يعمل الخبراء على حلها، وحين تستقر سيبدأ استخدامها في تطبيقات فعلية مختلفة ويتوقع أن تطور العديد من تخصصات البرمجة وأبرزها الأمن السيبراني وتحليل البيانات وتطور مجال الرعاية الطبية وتساعد في اكتشاف الأدوية وتحسن من الاقتصاد. تستخدم الحوسبة الكمومية أسلوبًا مختلفًا في البرمجة وتحتاج لتطوير خوارزميات جديدة لذا يحتاج المبرمجون المهتمون بهذا المجال إلى تعلم لغات برمجة وأطر عمل جديدة مصممة للعمل على الحواسيب الكمومية مثل Q#‎ و Cirq و Qiskit، كما يمكنهم استخدام لغات برمجة تقليدية مثل بايثون لكن مع الاستعانة بمكتبات خاصة مصممة للعمل مع الأنظمة الكمومية مثل QuTip وسيحتاجون كذلك لفهم أساسيات الجبر الخطي وميكانيك الكم للتعامل مع هذه التقنية الرائدة. مستقبل البرمجة دون كود No-Code ستبقى البرمجة التقليدية التي تعتمد على كتابة الشيفرات البرمجية أو ما يعرف بالتطوير عالي الكود High-code development موجودة في مستقبل البرمجة بالتأكيد، لكن يتوقع أن يزداد الاعتماد كذلك على منصات التطوير بدون كود No-code development أو التطوير منخفض الكود Low-code development الذي يسمح لأي شخص غير مختص بالتقنية بتطوير البرامج والتطبيقات والمنتجات الخاصة به وأتمتة أعماله بنفسها. تتميز البرمجة منخفضة الكود بشكل أساسي بتوفير واجهات رسومية سهلة الاستخدام تعتمد السحب والإفلات ولا تحتاج لكتابة الشيفرات والتعليمات باستخدام إحدى لغات البرمجة المعقدة، ويمكن أن تعتمد أيضًا على أنظمة تصميم ومكونات مسبقة الصنع يمكن لأي شخص استخدامها مباشرة وإنشاء تطبيقاته بسرعة وسهولة. قد تتساءل هل هذا يعني أن الاعتماد على المبرمجين والمطورين المتخصصين سوف ينخفض في المستقبل؟ والجواب هو بالنفي فالحلول بدون كود مهما كانت مرنة وسهلة الاستخدام فلن تتمكن من الاستغناء عن دور المبرمجين بالكامل وستصلح للأنظمة البرمجية البسيطة نسبيًا وستبقى كتابة الأكواد مطلوبة لتطوير الأنظمة البرمجية الاحترافية والتحكم بهذه المنصات نفسها فهذه المنصات تعمل وراء الكواليس بواسطة الشيفرات البرمجية وستظل بحاجة لمبرمجين يطورونها ويقومون بصيانتها، كما يمكن أن تكون هذه المنصات بذات الوقت أداة مساعدة يمكن للمبرمجين دمجها مع أساليب البرمجة التقليدية لتحسن إنتاجيتهم وتسريع وتيرة عملهم. مستقبل تطبيقات الويب التقدمية PWA يتوقع أن تسيطر تطبيقات الويب التقدمية PWAs وهي اختصار لعبارة Progressive Web Applications على مستقبل برمجة تطبيقات الويب ويزداد الاعتماد عليها من قبل الشركات والمؤسسات المختلفة، فهذه التطبيقات وفرت أسلوبًا جديدًا لتطوير تطبيقات الأجهزة المحمولة ومكنت المبرمجين من تطوير تطبيقات ويب تتصرف مثل التطبيقات الأصيلة native applications وتعمل بكفاءة على كافة أنواع أنظمة التشغيل وتتوافق مع كافة الأجهزة وأحجام الشاشات سواء الحواسب المكتبية أو الأجهزة المحمولة ويتم الوصول لها من خلال مستعرض الويب وهي لا تتطلب من المستخدم تثبيت أي شيء لاستخدامها كما يمكنها العمل دون الحاجة للاتصال بالإنترنت. تستخدم تطبيقات الويب التقدمية تقنيات تطوير الويب الأساسية HTML و CSS وجافاسكريبت إلى جانب أدوات وأطر العمل المخصصة مثل Angular و React و Vue.js، فإذا مهتمًا بمجال برمجة وتطوير التطبيقات أنصحك بالبدء بتعلم تطوير PWAs واكتساب المهارات اللازمة في هذا المجال لضمان مهنة مطلوبة في سوق العمل في السنوات القادمة. لمطالعة مزيد من التفاصيل حول تطبيقات الويب التقدمية والتعرف على أهم مميزاتها يمكنك مطالعة مقال مدخل إلى تطبيقات الويب التقدمية PWA أهمية البرمجة في المستقبل لاشك أن مستقبل البرمجة واعد ومشرق في عصرنا الرقمي متسارع الخطى فالطلب على المطورين والمبرمجين يزداد بشكل كبير في الشركات التقنية المتخصصة، كما أن البرمجة قد تصبح مطلبًا أساسيًا للتوظيف في العديد من مجالات العمل الأخرى مثل الاقتصاد والصناعة ومؤسسات الرعاية الصحية إلى جانب زيادة الاعتماد عليها في مجالات الحياة اليومية. فالبرمجة لغة المستقبل وعلى الجميع تعلمها ولكن لنتذكر دومًا أن عالم البرمجة في تغير مستمر ومن الضروري لأي مهتم بالبرمجة أن يواكب التطورات الحاصلة فيها ويركز على تعلم الاتجاهات الحديثة التي يتوقع أن يزداد الطلب عليها إذا أراد أن يضمن البقاء في الصدارة في سوق العمل المستقبلي. إذا كنت مهتمًا بتعلم البرمجة واحترافها يمكنك البدء بأحد التخصصات البرمجية التي شرحناها سابقًا والتي يتوقع أن تشهد ازدهارًا وطلبًا مرتقعًا في مستقبل البرمجة، وتذكر أن مهنة البرمجة بلا شك بجميع مجالاتها وتخصصاتها الأخرى ستبقى واحدة من أكثر المهن التي تنبئ بمستقبل واعد، فإذا كنت مهتمًا بتعلم البرمجة وتقنياتها لا تتردد وابدأ من اليوم بتحديد المجال الذي يوافق ميولك وضع خطة لتعلمه مع الاهتمام إلى جانب ذلك بتنمية مهاراتك الناعمة مثل مهارات التواصل الفعال وحل المشكلات والقدرة على التعلم وتطوير الذات لأن هذه المهارات ستصبح أكثر أهمية في المستقبل وستمكنك من إثبات وجودك والتميز في سوق العمل. وإذا كنت مهتمًا بمعرفة مزيد من التفاصيل حول مستقبل البرمجة أنصحك بمشاهدة هذا الفيديو: الخلاصة حاولنا في مقال اليوم أن نستشرف مستقبل البرمجة ونعرفك على أهم التخصصات البرمجية التي يتوقع أن تشهد وجودًا قويًا في السنوات القليلة القادمة ومن أبرزها الذكاء الاصطناعي، والتعلم الآلي، والتعلم العميق، وإنترنت الأشياء، وعلم البيانات، وتقنيات البلوكتشين، والبرمجة بدون كود أو منخفضة الكود، وناقشنا أهمية تخصص البرمجة والمستقبل الواعد لدراسة هندسة البرمجيات وزيادة الطلب على المبرمجين والمطورين في سوق العمل المستقبلي. اقرأ أيضًا تعرف على أعلى تخصصات البرمجة أجرًا البرمجة والخوارزميات والذكاء الاصطناعي تطوير تطبيق وصفة لاقتراح الوجبات باستخدام ChatGPT و DALL-E في PHP برمجة الذكاء الاصطناعي
    2 نقاط
  20. سنتعرف في مقال اليوم على مفهوم صفحات الويب وكيف تعمل ونتعرف على أهم مكوناتها ونميز بين أنواع صفحات الويب الثابتة والديناميكية، وأخيرًا نوضح أهم الخطوات والتقنيات التي عليك تعلمها لتصمم وتبرمج هذه الصفحات. تعريف صفحة الويب Web Page قد تتساءل، ما هي صفحة الويب؟ سأجيبك، هي مستند مكون من سلسلة من التعليمات البرمجية المكتوبة بإحدى لغات الويب ويتم عرضها داخل تطبيق مخصص يسمى متصفح الويب Web Browser. تستخدم صفحات الويب بشكل أساسي لعرض المعلومات بأشكال مختلفة من نصوص ورسومات وصور ومقاطع الفيديو وروابط لصفحات ويب أخرى وإتاحتها عبر شبكة الإنترنت وتشكل مجموعة صفحات الويب المتعددة المرتبطة مع بعضها البعض موقع ويب يمكن لصفحات الويب أن تكتب بأنواع مختلفة من لغات البرمجة مثل HTML و CSS وجافا سكريبت و PHP وغيرها من اللغات والتقنيات وفق ما تقتضي الحاجة، لكن تعد لغة HTML التقنية الأساسية لبناء صفحة الويب، فصفحات الويب بتنسيق HTML هي المعيار للمحتوى الذي يعرضه متصفح الإنترنت. وتجدر الإشارة إلى أن HTML ليست لغة برمجة بالمعنى المتعارف، بل لغة توصيفية markup language تعتمد على رموز خاصة تسمى الوسوم Tags، هذه الوسوم مسؤولة عن وصف بنية صفحات الويب وطريقة عرض محتوياتها وإظهارها بالبنية التي نريدها، كعرضها بشكل فقرات أو جداول أو تعدادات نقطية …إلخ. تتميز لغة التوصيف HTML بكونها مفهومة ومعبرة فكل ما تقوم به هو وصف أسلوب عرض المحتوى للمتصفح وطريقة تخطيط صفحة الويب، على سبيل المثال لإدراج عنوان رئيسي وفقرة في صفحة الويب نكتب اكتب العنوان بين علامتي <h1> و <h1/> ولكتابة فقرة نصية اكتبها بين علامتي <p> و <p/> بالشكل التالي: <h1> هذا هو عنوان الفقرة</h1> <p> هذا هو محتوى الفقرة</p> قم بكتابة الكود السابق في أي محرر نصوص مثل المفكرة واحفظه بالامتداد ‎.html أو ‍‎.htm وسمه بأي اسم تختاره ليكن example.html، ستلاحظ أن أيقونة الملف قد تحولت إلى صفحة ويب وعند فتحها تعرض في المتصفح الافتراضي لديك وتظهر بشكل مشابه للصورة التالية: لاحظ أن النص (هذا هو عنوان الفقرة) ظهر كعنوان غامق لأننا غلفناه بعلامات خاصة بالعنوان، بينما ظهر النص (هذا هو محتوى الفقرة) كنص عادي لأننا وضعناه بين علامتين تدلان على كونه فقرة نصية. تحتاج هذه الصفحة للكثير بالطبع من أكواد HTML الإضافية كي تبدو صفحة ويب متكاملة الأركان، كما تحتاج لإضافة تنسيقات مختلفة من خطوط وألوان وتخطيطات لجعل مظهرها أكثر احترافية وهو ما تقوم به لغة CSS التي تتكامل مع لغة HTML حيث تضاف شيفرات CSS بعدة طرق إلى صفحة الويب، فهي إما أن تكتب في ملف ‎.html نفسه، أو تضاف في ملف نصي مستقل بالامتداد css. بأي اسم تختاره وليكن styles.css ثم تربط مع ملف ‎.html من خلال كتابة الكود التالي: <link rel="stylesheet" type="text/css" href="styles.css" /> <h1> هذا هو عنوان الفقرة</h1> <p> هذا هو محتوى الفقرة</p> لسنا بصدد شرح أكواد CSS في هذا المقال لكننا سنكتب بعض التنسيقات البسيطة لصفحتنا لتفهم الفكرة التي تعمل من خلالها صفحات الويب، على سبيل المثال لجعل العنوان الذي أضفناه بالصفحة باللون الأحمر والفقرة باللون الأزرق تكتب في ملف التنسيقات الأكواد التالية: h1 { color: red; } p { color: blue; } بعدها عند عرض الصفحة ستظهر لنا بالشكل المنسق التالي: للمزيد حول تصميم صفحات الويب وكتابة أكواد CSS يمكنك مطالعة مقال HTML و CSS للمبتدئين: كيف تصمم أول صفحة ويب لك ومقال أساسيات CSS، كما يمكنك تعلم المزيد حول ربط أكواد مع ملف ‎.html من خلال مقالة كيفية بناء موقع باستخدام CSS. ما هو متصفح الويب؟ ذكرنا في الفقرات السابقة كلمة متصفح عدة مرات وذكرنا أنه برنامج يستخدم لفتح صفحات الويب وعرضها، ولعلك تتساءل ما هو دور المتصفح في صفحات الويب التي هي بالأساس مستندات نصية تكتب ضمن محررات نصوص أو محررات أكواد برمجية؟ وإليك الجواب: كي تتمكن من فتح صفحات الويب على جهازك تحتاج لوجود برنامج متصفح الويب وهو عبارة عن تطبيق يمكنك من الوصول إلى المعلومات المضمنة في صفحات الويب وعرضها بالشكل الصحيح، فهو بمثابة حاوية تعرض كافة محتويات الصفحة. هناك الكثير من متصفحات الويب وأشهر خمس متصفحات هي: جوجل كروم Chrome فايرفوكس Firefox مايكروسوفت إيدج Microsoft Edge أوبرا Opera سفاري Safari كي تتمكن متصفحات الويب من عرض صفحات الويب فهي تستخدم محرك عرض Rendering Engine أو ما يسمى بمحرك التخطيط Layout Engine مهمته أخذ كافة معلومات المحتوى والتصميم الواردة في التعليمات البرمجية التي كتبت بها هذه الصفحة وتفسيرها وعرضها بالشكل النهائي لك. يستخدم كل متصفح محرك عرض مختلف عن الآخر، على سبيل المثال يستخدم فايرفوكس محركًا يسمى Gecko ويستخدم كل من كروم وأوبرا محرك باسم Blink كما أن بعض المتصفحات قد تستخدم تقنيات خاصة بها غير متوفرة في متصفحات أخرى، ما يهمك في هذا الأمر أن تفهم سبب وجود الاختلافات عند طريقة عرض صفحات الويب من متصفح لآخر، أو سبب عدم عمل بعض الميزات في متصفح بينما تعمل بشكل مثالي في متصفح آخر، ولهذا السبب يحرص مصممو المواقع على معالجة المشاكل الشائعة للتوافق مع المتصفحات في HTML و CSS. كيف أفتح صفحات الويب؟ يملك كل موقع ويب اسم نطاق Domain name مميز خاص به لا يستخدمه أي موقع آخر ويجب حجزه من خلال دفع رسوم شهرية أو سنوية لشركات تسجيل أسماء المجالات على سبيل المثال اسم المجال الرئيسي لشركة حسوب هو hsoub.com وهذا المجال هو جزء من عنوان الموقع الكامل URL وهو https://www.hsoub.com/‎. حيث تمتلك كل صفحة ويب عنوان URL فريد يميزها ويحدد موقعها الدقيق على شبكة الإنترنت فمن أجل فتح صفحة الويب وعرض محتواها كل ما عليك هو فتح المتصفح المثبت على جهازك وكتابة عنوان URL الخاص بها في شريط عنوان المتصفح عندها سيطلب المتصفح أو ما يعرف بالعميل Client جلب محتويات هذه الصفحة من خادم الويب البعيد Server ويعرضها لك. على سبيل المثال للوصول للصفحة الرئيسية لأكاديمية حسوب كل ما عليك هو إدخال العنوان https://academy.hsoub.com/‎‏‏‏ في شريط عنوان المتصفح، وللوصول إلى الصفحة الخاصة بدروس البرمجة في الأكاديمية يمكنك كتابة العنوان https://academy.hsoub.com/programming/‎ أما إذا كنت لا تعرف العنوان الخاص بصفحة أو موقع ما يمكنك البحث عن اسمه بأحد محركات البحث والوصول له من خلال نتائج البحث وهذه الطريقة هي الأمر الشائع لدى المستخدمين بدلًا من حفظ العناوين الخاصة بكل صفحة. محرك البحث Search Engine هو نوع خاص من مواقع الويب يتم الوصول لها من خلال متصفح الويب ليساعدك في العثور على مواقع وصفحات الويب وأشهرها على الإطلاق محرك بحث جوجل الذي يتميز بدقة نتائجه، ومؤخرًا برز اسم محرك بحث Bing من شركة مايكروسوفت الذي يعمل بتقنيات الذكاء الاصطناعي. ما الفرق بين موقع الويب وصفحة الويب؟ يتكون موقع الويب عادة من عدة صفحات ويب مرتبطة ببعضها البعض بطرق مختلفة والتي تشترك في اسم مجال أو عنوان فريد خاص بها. يمكن تشبيه صفحة الويب بصفحة من كتاب والموقع بالكتاب نفسه الذي يجمع في طياته كل هذه الصفحات تحت عنوان واحد مشترك ويكون لكل صفحة منها عنوانها الخاص الذي يميزها. ينظم موقع الويب على شكل صفحات مرتبطة مع بعضها البعض بروابط تشعبية وأهم هذه الصفحات هي الصفحة الرئيسية وهي الصفحة الأولى التي يراها المستخدم عند دخوله إلى موقع الويب وهي تعطيك نظرةً شاملةً عن محتوى الموقع ومنها تنتقل عبر صفحات الموقع الفرعية الأخرى، ويجب أن يحرص مصمم الموقع على جعل التنقل في صفحات الموقع واضحًا وسهل الاستخدام كي لا يشتت زوار الموقع. ما هي عناصر صفحة الويب؟ تختلف العناصر أو الأقسام التي تحتويها صفحات الويب وطريقة توزيع المحتوى ضمن هذه الأقسام بحسب الهدف من هذه الصفحة وطبيعة المحتوى الذي تتضمنه لكن يمكن القول أن معظم صفحات الويب تتضمن العناصر التالية: ترويسة الصفحة: وهي تتضمن عادة اسم الموقع أو شعار الموقع وشريط التنقل بين صفحات الموقع وصندوق للبحث في محتوى الموقع، وقد تتضمن بعض الإشعارات أو العروض المميزة أو الصور المميزة التي تريد لفت نظر المستخدمين لها. الشريط الجانبي للصفحة: وهو قسم اختياري في الصفحة يعرض المعلومات التي لا تكون جزءًا من المحتوى الرئيسي للصفحة. وقد يتضمن إعلانات أو عبارات دعوة لاتخاذ إجراء CTA أو روابط لأجزاء أخرى من موقع الويب وقد يتضمن رابط الرجوع إلى أعلى الصفحة لا سيما في الصفحات ذات المحتوى المكثف. المحتوى الأساسي للصفحة: وهو يتضمن عادة عنوان صفحة الويب ومحتوى منوع من فقرات وصور وروابط لصفحات أخرى حسب الحاجة. تذييل الصفحة: هو القسم الذي يعرف المستخدم أنه وصل إلى نهاية صفحة الويب ويجب أن يتضمن التذييل أي معلومات مهمة عن الموقع وعبارة حقوق النشر وقد يتضمن بعض الروابط لصفحات هامة مثل صفحة سياسة الخصوصية ومعلومات الاتصال وروابط للشبكات الاجتماعية. أنواع صفحات الويب ستجد في شبكة الانترنت نوعين من صفحات الويب منها ما هو بمحتوى ثابت لا يتغير مثل صفحات السيرة الذاتية أو معارض الأعمال وأخرى بمحتوى ديناميكي متجدد مثل الصفحات الإخبارية وصفحات المدونات وصفحات وسائل التواصل الاجتماعي، وإليك الفرق بين هذين النوعين. صفحات الويب الثابتة Static Web Pages هي صفحات تمتلك محتوى ثابت مخصص للقراءة فقط ويظهر لكافة المستخدمين بنفس الشكل، وهذه الصفحات تكتب عادة بلغة HTML حيث يتوجب عليك إنشاء ملف بالامتداد ‎.html لكل صفحة جديدة تضيفها للموقع. ويمكن أن تتضمن الصفحات الثابتة موارد أخرى مثل تنسيقات CSS للتحكم في مظهرها وأكواد بلغة جافا سكريبت JavaScript لإضافة تأثيرات تفاعلية إليها إلى جانب ملفات الوسائط مثل الصور والأصوات ومقاطع الفيديو وغيرها من الوسائط التي تعرض على صفحات الويب. كي تغير محتوى صفحات الويب الثابتة تحتاج لأن تصل إلى ملفات الشيفرات البرمجية لهذه الصفحة وتقوم بتعديل ما تريد بنفسك وتجدر الإشارة لأن جميع مواقع وصفحات الويب كانت ثابتة في بدايات ظهور الويب. واليوم لا تزال الصفحات الثابتة مستخدمة لعرض أي محتوى يكتب لمرة واحدة ولا يحتاج لتخصيص أو تحديث بشكل متكرر مثل مواقع السيرة الذاتية ومعارض الأعمال وصفحات الهبوط والصفحات التعريفية للشركات. لكن ماذا لو كانت المواقع ذات محتوى متغير بشكل متكرر أو يحتاج لأن يخصص حسب المستخدم أو يتفاعل معه؟ عندها تحتاج لأن تصمم صفحات ويب ديناميكية. صفحات الويب الديناميكية Dynamic Web Page هي صفحات يتم تغيير محتواها باستمرار بالاعتماد على مدخلات المستخدم وتفاعله مع الصفحة وغيرها من العوامل ومن الأمثلة عليها تطبيقات الويب التفاعلية ووسائل التواصل الاجتماعي ومواقع التجارة الإلكترونية وما شابه، ويمكن لهذه الصفحات عرض تقديم معلومات مختلفة للزوار المختلفين، على سبيل المثال موقع التواصل الاجتماعي فيسبوك هو موقع ديناميكي لأن محتوى صفحة فيسبوك التي تظهر لي مختلف عن محتوى الصفحة التي تظهر لك، كما أنك في كل مرة تزور فيها صفحتك تجد فيها معلومات مختلفة عن المرة السابقة. تصمم صفحات الويب الديناميكية باستخدام لغات برمجة تعمل على الخادم مثل PHP أو بايثون أو روبي ..إلخ، إضافة للغات HTML و CSS وجافا سكريبت وغالبًا ما تحتوي على عناصر ديناميكية تتفاعل مع مدخلات المستخدم وتستخرج المعلومات المطلوبة المخزنة في الخادم لإنشاء صفحة الويب النهائية التي يشاهدها المستخدم في متصفحه. ولمطالعة مزيد من المعلومات حول الطريقة التي تعمل بها صفحات الويب الدينامكية أنصح بمطالعة مقال نظرة على تفاعلات الخادم مع العميل في موقع ويب ديناميكي. تعلم برمجة وتصميم صفحات الويب قد تكون مهتمًا بمعرفة الطريقة التي تبرمج بها صفحات الويب وتتساءل كيف يمكنني تعلم برمجة وتصميم صفحات الويب وإدارتها بسرعة واحترافية وما هي اللغات والأدوات الواجب تعلمها. إليك أهم الخطوات التي يمكنك اتباعها لتعلم برمجة صفحات الويب: تعلم كيف يعمل الويب تعلم الأدوات والتقنيات اللازمة لتطوير صفحات الويب تعلم تصميم المواقع الإلكترونية اختر مصادر تعلم موثوقة ومنظمة لا تتوقف عن التعلم لنتعرف كل خطوة من هذه الخطوات بمزيد من التفصيل: 1. تعلم كيف يعمل الويب في هذه المرحلة عليك تعلم مجموعة من المفاهيم الأساسية مثل: كيف يعمل الويب Web. كيف تعمل مواقع الويب. ما هي مكونات الويب الرئيسية. ما هو مفهوم بروتوكولات الويب مثل HTTP و TCP/IP و وكيفية تخزين وتنظيم الصفحات والملفات المختلفة لمواقع الويب على الخادم المتصل بالإنترنت وعرضها على المتصفح أو العميل. أنواع الخوادم وكيفية إدارتها ومفهوم استضافات الويب وأنواعها. 2. تعلم الأدوات والتقنيات اللازمة لتطوير صفحات الويب في المرحلة التالية من المهم أن تتعرف على أهم الأدوات المستخدمة في بناء مواقع ويب، وتحدد التقنيات التي تريد استخدامها وكي لا تشعر بالتشتت فقد وفرنا في مقال المدخل الشامل لتعلم تطوير الويب وبرمجة المواقع معلومات شاملة تعرفك على كافة الجوانب المتعلقة بتطوير صفحات الويب والتقنيات ولغات البرمجة التي يمكنك تعلمها لتصبح مطور مواقع محترف، بعد أن تتضح لك الصورة الكاملة حدد بدقة ما هي اللغات والأدوات التي تريد استخدامها لبناء مواقع الويب وضع خطة زمنية لتعلمها. 3. تعلم تصميم المواقع الإلكترونية إذا كنت ترغب في التخصص في تصميم واجهات مواقع وتطبيقات الويب فعليك في هذه الحالة تعلم أساسيات تصميم المواقع الإلكترونية والتعرف على أفضل النصائح لتصميم واجهة المستخدم لتصمم مواقع وصفحات ويب احترافية، وتنظم بنية موقعك بأفضل طريقة ممكنة، وتختار أفضل أنواع الخطوط والألوان التي عليك استخدامها بما يتناسب وهوية الموقع والفئة المستهدفة وتحسين تجربة المستخدم. 4. اعتمد مصادر تعلم موثوقة اختر مصادر التعلم التي تفضلها سواء دروس عبر الإنترنت أو كتب أو معسكرات أو قنوات يويتوب أو دورات تدريبية، لكن تشتت نفسك بكثرتها واحرص على اختيار مصادر منظمة ومتكاملة، ولا تكتفِ بمجرد القراءة أو المشاهدة بل طبق كل ما تتعلمه وصمم مواقع تجريبية وقم بنشرها على الإنترنت لأن التطبيق العملي أفضل وأسرع طريقة للتعلم وهو يساعدك على بناء معرض أعمالك والعثور على وظيفة بشكل أسرع. ستجد في أكاديمية حسوب الكثير من الدورات التدريبية المتخصصة في تطوير مواقع الويب مثل: دورة تطوير واجهات المستخدم التي تعرفك على كل ما يخص تطوير الواجهات الأمامية لمواقع الويب وبناء عدة مواقع ويب ثابتة تعزز معرض أعمالك وتساعدك في العثور على وظيفة ملائمة. دورة تطوير التطبيقات باستخدام لغة Python التي ستتعلم فيها أساسيات لغة البرمجة بايثون وتبني من خلالها مواقع مختلفة مطلوبة في سوق العمل. دورة تطوير التطبيقات باستخدام لغة JavaScript التي ستتقن من خلالها لغة البرمجة الأكثر شهرة وانتشارًا جافا سكريبت وتتعلم تطوير العديد من أنواع التطبيقات المختلفة من خلالها. دورة تطوير تطبيقات الويب باستخدام لغة PHP التي ستتعلم من خلالها تطوير مواقع انترنت احترافية باستخدام العديد من الأدوات والتقنيات. تتكون كل دورة من هذه الدورات من مسارات غنية بالمعلومات لا تطلب منك أي معرفة مسبقة وتنتهي بتطوير العديد من مواقع الويب الاحترافية في عدة مجالات وتوفر تحديثات مستمرة ومدربين محترفين يوفرون لك إرشادات وإجابات على كافة تساؤلاتك طيلة فترة التعلم. كما ستجد الكثير من الدورس والمقالات المجانية حول تصميم صفحات الويب وتعلمك تطوير الويب من الصفر للاحترف، ليس هذا فحسب فإن كنت ممن يفضل الدراسة من الكتب لما توفره من معلومات شاملة ومنظمة ومتدرجة، ستجد في قسم الكتب في أكاديمية حسوب الكثير من الكتب الشاملة عن لغات برمجة صفحات الويب وتصميم واجهات المواقع الإلكترونية المتاحة للتحميل بالمجان. 5. لا تتوقف عن التعلم الاستمرارية في التعلم أساسية في أي مجال تقني وفي مجال تطوير الويب على وجه الخصوص لكونه مجالًا متجددًا بصورة مستمرة ويوفر الكثير من التقنيات والأدوات التي تسهل عمل المطورين وتحسن من طريقة برمجة صفحات الويب، لذا كن على اطلاع على كل جديد في هذا المجال واستفد من في الارتقاء بمستوى عملك. الخلاصة تعرفنا في مقال اليوم على مفهوم صفحات الويب ومكوناتها وأنواعها المختلفة وطريقة عملها، وأهم الخطوات التي يمكنك اتباعها لتتعلم برمجة وتصميم صفحات الويب ووفرنا مجموعة من المصادر العربية الموثوقة التي تساعدك في رحلة التعلم. اقرأ أيضًا تعلم تطوير الويب كيف يعمل الويب Web؟ عالم الويب ومعاييره كيفية التعامل مع الويب مراحل بناء مواقع الإنترنت من الصفر
    2 نقاط
  21. مصطلح إطار العمل أو الفريم وورك Framework يعد أحد المصطلحات الفنية والبرمجية التي تربك المبتدئين على وجه الخصوص في بداية مشوار تعلم البرمجة والتي لا يستطيع فهم دلالتها ولا إدراك مدى أهميتها بشكل جيد. وكثيرًا ما يتساءل المبرمج المبتدئ عن معنى إطار العمل Framework وعن مزايا ومحدويات استخدام أطر العمل Frameworks في عمله البرمجي وعملية البرمجة عمومًا، وهل يتوجب عليه تعلم إطار عمل للغة برمجة محددة، أم أن تعلمه للغة البرمجة نفسها يكفيه في سوق العمل، وهل تعلم إطار العمل صعب ويستغرق وقتًا، ومالفرق بين إطار العمل والمكتبة، وغيرها من الأسئلة من هذا القبيل. فإذا كنت مهتمًا بعرفة الإجابة على كل هذه التساؤلات فتابع قراءة هذا المقال للنهاية. ما هو إطار العمل Framework؟ إطار العمل Framework في البرمجة هو ببساطة آلية يتم من خلالها إعداد وتجهيز كافة الوظائف الضرورية والشائعة التي تستخدم بكثرة عند تطوير التطبيقات والأنظمة وإتاحتها للمبرمج ليستخدمها ويستفيد منها في عمله دون أن يحتاج لإعادة كتابة هذه الوظائف بنفسه من الصفر وبهذا نستنتج أن استخدام إطار العمل يختصر الكثير من الوقت ويجعل العمل البرمجي أكثر كفاءة. لتفهم الأمر بصورة أفضل تخيل أنك تحتاج لكتابة سيرتك الذاتية، سيكون أمامك خياران إما أن تفتح مستندًا فارغًا وتبدأ بكتابة كل شيء وتنسيقه بنفسك من الصفر، أو تعتمد على قالب جاهز للسيرة الذاتية يكون مقسمًا ومنسقًا وكل ما عليك هو ملء البيانات الضرورية الخاصة بك فقط دون أن تشغل بالك بالكثير من التفاصيل الأخرى سيكون الخيار الثاني أفضل وأسرع بالتأكيد. يساعدك إطار العمل في مشروعك البرمجي بطريقة مشابهة فهو يعمل كقالب أو هيكل أساسي عليك الالتزام به لإنشاء التطبيقات الخاصة بك، ويوفر لك مجموعة من الأدوات أو المكونات أو الحلول البرمجية الجاهزة لبناء تطبيقات مخصصة بطريقة آمنة وسريعة ومنظمة. ستجد الكثير من أطر عمل لكل لغات البرمجة الشائعة مثل جافاسكريبت وبايثون و PHP وجافا، ومن أجل استخدام أي إطار منها عليك بداية تعلم كيفية تطوير المشاريع في كل إطار منها والاستفادة من التسهيلات الكثيرة التي توفرها لك هذه الأطر. أنشئ موقع إلكتروني لأعمالك بدون خبرة برمجية صمم موقع احترافي لأعمالك بالسحب والإفلات مع أكثر من 70 قالب جاهز وقابل للتخصيص ليناسب هويتك التجارية جرب سنديان الآن ما الفرق بين إطار العمل والمكتبة؟ كثيرًا ما يتم الخلط بين مفهوم إطار العمل Framework ومفهوم مشابه له في البرمجة وهو المكتبة Library ورغم التشابه بينهما في طريقة العمل واستخدامهما بالتبادل في بعض الأحيان، إلا أن مفهوم المكتبة أبسط وأكثر محدودية فالمكتبة تركز على توفير وظيفة محددة في حين يوفر إطار العمل مجموعة متكاملة من الميزات التي تمكنك من برمجة تطبيقات في مجال محدد. تُعرَّف المكتبة بأنها عبارة عن مجموعة من التعليمات البرمجية المختبرة القابلة لإعادة الاستخدام والتي تنفذ وظيفة معينة وتحل مشكلة محددة، في حين ينفذ إطار العمل حزمة وظائف متكاملة أو يوفر مخططًا عامًا لبناء التطبيقات في حين لا توفر المكتبات هذه الميزة كما تحدد أطر العمل قواعد وإرشادات كتابة التعليمات البرمجية الخاصة بك وتنظم الملفات والمجلدات الخاصة بمشاريعك، ويمكن أن تتضمن مجموعة من المكتبات وتستخدمها لتنفذ مهام معينة. على سبيل المثال من بين المكتبات الشائعة نذكر مكتبة ريآكت React وهي مكتبة برمجية مبنية بلغة جافاسكربت ومتخصصة في بناء واجهات المستخدم ومكتبة jQuery التي تختصر العديد من الأكواد والتعليمات البرمجية المكررة في جافا سكريبت لتسهيل عملية البرمجة، ومن بين أطر العمل الشائعة نذكر أنجولار Angular وفيو Vue.js وهما إطارا عمل بلغة جافا سكريبت مختصان في تصميم واجهات مواقع الويب. ما الفرق بين إطار العمل ولغة البرمجة؟ يمكن للمطور أن يستخدم لغة البرمجة ويكتب كافة التعليمات البرمجية اللازمة لبناء التطبيقات من الصفر كما يمكنه إن شاء الاستعانة بإطار عمل Framework مخصص لتطوير برامجه وتطبيقاته. ورغم أن استخدام إطار العمل يفيد المطورين ويسرع وتيرة عملهم، إلا أنه يحد من حريتهم في كتابة التعليمات البرمجية ويقيد إمكانيات التطوير ويمكنهم من بناء تطبيقات لأغراض محددة فقط، في حين أن استخدام لغة برمجة يمكنهم من تطوير ما يشاؤون من تطبيقات متنوعة، حتى إطار العمل نفسه تم بناؤه في النهاية بإحدى لغات البرمجة. باختصار لغة البرمجة هي الأساس ومن خلال تعلمها يمكنك بناء ما تشاء من تطبيقات، أما إطار العمل فهو مصمم لنوع محدد من التطبيقات مثل تطبيقات الويب أو تطبيقات الجوال أو تطبيقات علم البيانات أو الذكاء الاصطناعي وإنترنت الأشياء …إلخ ويفضل أن تتعلم استخدامه بعد أن تتعلم البرمجة وتتمكن من أساسياتها. أهمية إطار العمل في البرمجة تبرز أهمية إطار العمل framework بشكل أساسي في كونه يتيح لك إعادة استخدام التعليمات البرمجية بدلًا من إعادة كتابتها من جديد، وفيما يلي جملة من الفوائد التي يمكن أن يوفرها استخدام إطار العمل: يساعد على توفير كود أكثر أمانًا لكونه يتضمن شيفرات تتحقق من المصادقات والصلاحيات وتحمي تطبيقك من الاختراق وتعالج الكثير من الثغرات الأمنية الشائعة مثل CSRF و XSS و SQL Injection. تركيز الجهود على كتابة التعليمات البرمجية الخاصة بالمشروع فقط بدلًا من برمجة وظائف متكررة وشائعة الاستخدام. توحد أنماط وقواعد كتابة التعليمات البرمجية وتوفر مخططًا عامًّا يمكن لكافة الفرق البرمجية فهمه بسهولة. يساعد في تطوير مشروعك وإضافة ميزات جديدة له بسهولة دون الحاجة للتعديل على الكود الأساسي لإطار العمل. يغني عن إعادة اختراع العجلة ويوفر لك الوقت والتكلفة اللازمين لتطوير المشاريع والتطبيقات. يساعد في كتابة كود نظيف وغير مكرر. يسهل عملية اختبار الكود وتصحيح الأخطاء البرمجية. يقلل بالعموم من كمية الأخطاء البرمجية لأنك ستكتب كود أقل وبالتالي ستنتج لديك أخطاء برمجية أقل. محدوديات إطار العمل لا شكَّ أن استخدام إطار العمل يفيدك كمطور ويساعدك على تسريع وتحسين العمل البرمجي، إلا أن الاعتماد على أطر العمل وحدها يفرض عليك بعض القيود وإليك أبرزها: يوفر وظائف محددة ويختص في بناء تطبيقات في مجالات معينة فقط. الاعتماد عليها قد يعيق المبرمج من فهم لغات البرمجة بشكل متعمق وواضح. بعض أطر العمل معقدة ويستغرق تعلمها وفهمها بشكل جيد وتطوير التطبيقات باستخدامها الكثير من الوقت. نحتاج إلى اختيار إطار العمل المناسب للتطبيق فاختيار الإطار غير الملائم قد يؤثر سلبًا على أداء تطبيقاتك وتجربة المستخدمين. تصدر لها تحديثات جديدة بشكل دوري، لذا سيتوجب عليك البقاء على اطلاع دائم على كل جديد ومعرفة كل الميزات الجديدة المضافة للإطار والمميزات التي تم الاستغناء عنها في كل إصدار. توقف تحديث إطار العمل أو تغيره ينعكس على سير عملية تطوير التطبيق المبرمج فيه وأمانه مثلما حصل مع إطار العمل AngularJS عندما قررت غوغل التوقف عن تطويره وإطلاق نسخة عنه مختلفة تمامًا. صفات إطار العمل الجيد تتوافر عشرات أطر العمل في المجالات البرمجية المختلفة الأمر الذي يشعرك بالحيرة في تحديد الإطار الأفضل لمشروعك ويجعلك تتساءل كيف أختار إطار العمل المناسب؟ بالعموم يتصف إطار العمل الجيد بثلاث صفات أساسية وهي: التوثيق الجيد توفير الوظائف المطلوبة لعملك الشهرة والدعم المجتمعي لنوضح بمزيد من التفصيل كل صفة من هذه الصفات وأهميتها في اختيار إطار العمل الأفضل. التوثيق الجيد اختر إطار عمل موثقًا بشكل جيدًا كي تتمكن من العودة إليه عندما تحتاج لمعرفة المزيد من المعلومات حول استخدام ميزة معينة أو حل مشكلة تواجهك في استخدامه، فالتوثيق الجيد يوفر عليك الكثير من الوقت والجهد. توفير الوظائف المطلوبة لعملك ضع في اعتبارك أن لكل إطار عمل حدود معينة لذا من الضروري أن تبحث بشكل جيد في ميزات الإطار الذي تريد اعتماده وتتأكد من أنه يلبي متطلبات مشروعك ويحقق لك كافة الوظائف والميزات التي تحتاج لتحقيقها بالشكل الأنسب، وبنفس الوقت لا تختر إطار عمل شديد التعقيد أو مكتظًا بالميزات التي قد لا تحتاجها على الإطلاق! الشهرة والدعم المجتمعي لاشك أن شهرة إطار العمل ووجود مجتمع داعم له يدل على قوته والطلب الكبير عليه في سوق العمل، لذا احرص على استخدام إطار عمل معروف وله قاعدة مستخدمين نشطة ويفضل بعض المبرمجين الاعتماد على أطر عمل حرة ومفتوحة المصدر وغير مقيدة أو مدعومة من شركات معينة لتخوفهم من انعكاس أي طارئ يحصل لها أو تغير في سياستها على إطار العمل. ولذلك السبب ترى البعض يميل إلى استخدام إطار العمل Vue.js الذي انبثق من أروقة المجتمع الحر بدلًا من إطار العمل Angular الذي ولد بين أروقة شركة غوغل مثلًا، ولكن هنالك طرف مقابل يشير إلى تنظيم وقوة وسرعة تطوير أطر العمل التي تقف خلفهم الشركات نظرًا لدعمهم السخي طويل الآجل عادةً خصوصًا إن وقفت شركات تقنية كبيرة خلفهم والحديث يطول في هذه النقطة وهي خارج موضوع المقال فقط أحببت الإشارة إليها نظرًا لأهميتها في أي نقاش يدور حول المفاضلة بينها. أنواع أطر العمل frameworks في البرمجة هناك عدة أنواع من أطر العمل حيث يختص كل إطار بمجال استخدام معين، وفيما بعض أهم أنواع أطر العمل حسب التطبيقات أو الوظائف التي يؤديها: 1. أطر عمل تطوير الويب Web development frameworks تستخدم هذه الأطر في تطوير تطبيقات الويب ومن أشهرها إطار عمل أنجولار Angular وفيو جي إس Vue.js وهي أطر عمل جافا سكريبت شائعة تستخدم لتطوير الواجهات الأمامية للويب، وإطاري عمل إكسبرس Express و NestJS وهي أطر عمل Node.js لتطوير الواجهات الخلفية للويب، وإطاري عمل جانغو Django وفلاسك Flask وهي أطر عمل مفتوحة المصدر مكتوب بلغة بايثون مخصصة لتطوير الواجهات الخلفية للويب، وإطار عمل Ruby on Rails الذي يوفر لك كل ما تحتاجه لإنشاء تطبيق ويب بسهولة وسرعة وأمان وإطار عمل لارافيل Laravel المبني بالاعتماد على لغة PHP. 2. أطر عمل تطوير الجوال Mobile development frameworks من أشهرها في تطوير تطبيقات الجوال نذكر إطار عمل React Native مفتوح المصدر مكتوب بلغة جافا سكريبت طورته فيسبوك لتطوير تطبيقات جوال متوافقة مع كافة الأنظمة الأساسية، وإطار أيونيك Ionic الذي يستخدم تقنيات الويب HTML و CSS وجافا سكريبت من أجل تطوير تطبيقات الجوال وهو يتكامل مع أطر تطوير الواجهات الأمامية مثل Angular و Vue، وإطار عمل فلاتر Flutter وهو إطار عمل مفتوح المصدر للغة دارت Dart من جوجل لتطوير تطبيقات الجوال وهو يدعم أنظمة iOS و Android ويحتوي على عناصر واجهة مستخدم قابلة للتخصيص بالكامل، وإطار عمل أباتشي كوردوفا Apache Cordova الذي يمكنك من تطوير تطبيقات هجينة للهاتف الجوال. 3. أطر عمل علم البيانات Data science frameworks تعرف هذه الأطر كذلك بأطر التعلم الآلي Machine Learning Frameworks وهي تساعد علماء البيانات على إنشاء نماذج تعلم آلي وتصميمها بشكل أسرع وأسهل واستخراج المعلومات المفيدة من مجموعات البيانات بالاستفادة من تقنيات البرمجة والذكاء الاصطناعي والتعلم الآلي. وهناك العديد من أطر عمل علم البيانات ومن ضمنها scikit-Learn و XGBoost و TensorFlow و PyTorch. 4. أطر إدارة المحتوى Content management frameworks تعرف أيضًا باسم نظم إدارة المحتوى Content Management Systems أو اختصارًا CMS هي برمجيات توفر مكونات قابلة لإعادة الاستخدام لإنشاء وإدارة محتوى الويب وعرضه ضمن مدونات أو مواقع إلكترونية أو تطبيقات جوال وهي توفر ميزات أخرى مثل سهولة الاستخدام وتحسين محركات البحث والأمان. ومن أشهر هذه النظم نذكر نظام ووردبريس WordPress الشهير المستخدم في إنشاء ما يقارب من نصف المواقع الإلكتروني ودروبال Drupal الذي يعد نظام مثالي لتطوير المواقع التي تحتوي على الكثير من المحتوى وهو يتطلب معرفة تقنية أكثر من بقية نظم إدارة المحتوى. 5. أطر عمل أتمتة الاختبار Test Automation frameworks يستخدم مطورو البرمجيات أطر عمل الأتمتة من أجل إنشاء حالات اختبار التطبيقات والتأكد من سير عملها بكفاءة وتوفر لهم أدوات وتوصيات للتحقق من جودة البرمجيات واتباع معايير الترميز المناسبة. من أشهر أطر الاختبار نذكر سيلينيوم Selenium وهو إطار مفتوح المصدر لأتمتة اختبار تطبيقات الويب، وCypress المبني بجافا سكريبت والمخصص لاختبار الواجهة الأمامية لتطبيقات الويب، و Playwright للاختبار الشامل لتطبيقات الويب. هل يمكن البدء باستخدام إطار العمل دون تعلم لغة البرمجة؟ لاشك أن إطار العمل يوفر لك كمطور أداة قيمة لتطوير البرامج التطبيقات المختلفة، لكن السؤال الذي يطرح نفسه هل يغني تعلم أطر العمل واستخدامها في بناء التطبيقات العملية عن تعلم لغات البرمجة وفهمها بشكل متعمق؟ في الواقع حتى لو لم تكن ترغب في تطوير التطبيقات بإحدى لغات البرمجة وتميل للاستفادة من ميزات أحد أطر العمل فلا غنى لك عن تعلم لغة البرمجة وفهم أساسياتها إلى جانب إطار العمل فكلما فهمت لغة البرمجة بشكل أفضل سيسهل عليك فهم أطر العمل. كما أن تعلّم البرمجة يوسع أفق عملك ويمكنك من بناء العديد من التطبيقات في مختلف المجالات، أما إطار العمل فهو مصمم كما ذكرنا سابقًا لغرض واحد فقط وبالتالي سيقيدك بنوع محدد من التطبيقات. ويمكن باختصار أن نلخص الإجابة على هذا السؤال بجملة واحدة: يمكنك استخدام أطر العمل، لكن قبل ذلك تعلم أساسيات لغة البرمجة واتقنها ثم استفد من ميزات إطار العمل الخاص بتلك اللغة كما يحلو لك. الخلاصة تعرفنا اليوم على مفهوم إطار العمل Framework ودوره المهم في توفير الوظائف القياسية وتحديد الخطوط العريضة التي تنظم المشاريع البرمجية وتوفر وقت وجهد المطورين والمبرمجين، واكشتفنا أهم الفروقات بين أطر العمل وبين أدوات تطوير البرامج الأخرى مثل المكتبات ولغات البرمجة، وتعلمنا طريقة اختيار أفضل إطار عمل يناسب متطلباتنا وعددنا أهم صفات إطار العمل الجيد، وأخيرًا استعرضنا قائمة بأهم أطر العمل المستخدمة في مجالات مختلفة كتطبيقات الويب وتطبيقات الجوال وغيرها من المجالات. هل تستخدم في عملك أحد أطر العمل التي وردت في سياق المقال أو أطر عمل أخرى؟ ما هو هذا الإطار وفي أي مجال تستخدمه؟ هل هناك أي مشاكل تواجهها في التعامل مع هذا الإطار أم أنك راضٍ عن أدائه. شاركنا تجربتك في التعليقات أسفل المقال. اقرأ أيضًا تعلم أساسيات البرمجة قواعد البرمجة ببساطة للمبتدئين أسهل لغات البرمجة مهندس البرمجيات من هو وما هي مهامه تعرف على تخصص هندسة البرمجيات
    2 نقاط
  22. ربما تقرأ أو تشاهد يوميًا تقارير عن توقع في انخفاض أو ارتفاع مؤشرات أسواق المال أو تغيرات متوقعة في أسعار شراء بعض المنتجات على أساس شهري أو سنوي، أو حتى نجاح أو إخفاق لقاح لأحد الأمراض في مرحلة التجربة السريرية؛ فما مصدر هذه المعلومات؟ لا تُعد هذه الظواهر ظواهر علمية طبيعية أي لا تنتنج عن قوانين ثابتة يمكن تطبيقها في كل زمان ومكان، بل تأتي في معظم الأحيان نتيجة تطبيق طرق استدلالية أو تحليلية أو إحصائية على كم مترابط أو غير مترابط من البيانات المتوفرة عن هذه الظاهرة أو تلك، وتكون نتيجتها مجموعة محددة من المعلومات التي توصِّف هذه الظاهرة بلغة واضحة يمكن البناء عليها لاحقًا لاتخاذ قرار أو توثيق حادثة. يطلق على العلم القائم خلف هذه الطرق الاستدلالية والتحليلية والإحصائية اسم علم البيانات Data science أو العلم القائم على البيانات Data-driven science ويُعدّ حاليًا من أكثر العلوم التي تدفع عجلة التقدم التقني في مجالات تعلم الآلة والبحث عبر الإنترنت والتعرف الآلي على الصوت والصور والنقل والصحة واستكشاف المخاطر وغيرها الكثير. وأصبح هذا المجال أحد أهم المجالات في العالم الرقمي ولا عجب في ذلك فهو العلم الذي يهتم باستخراج القيمة الكامنة في البيانات التي تعد اليوم أهم أصول الشركات حتى أنها أصبحت تسمى النفط الجديد أو الذهب الجديد. وستكتشف في مقال اليوم كل خبايا هذا العلم وتتعرف على فوائده وأهم أدواته وتقنياته وحتى التعرف على سوق العمل فيه ومصادر تعلمه. ما هو علم البيانات Data Science؟ يُعد علم البيانات حقلًا لتطبيق المهارات التحليلية والوسائل العلمية لاستخلاص معلومات ذات قيمة وأهمية انطلاقًا من بيانات خام raw data أو بيانات مهيكلة أو غير مهيكلة وذلك لاتخاذ القرارات أو وضع خطط استراتيجية في مجال عمل معين أو تحليل الأنظمة أو بناء تصورات مسبقة عن سلوكها. تزداد أهمية علم البيانات يومًا بعد يوم، إذ تساعد الإضاءات التي يقدمها علم البيانات على زيادة كفاءة العمل وتحديد فرص عمل جديدة وزيادة فعالية النشاطات التجارية، وتضيف ميزات تنافسية قوية للأعمال التي تعتمد على علم البيانات موازنة بغيرها وفي مختلف المجالات والأصعدة. يتألف علم البيانات من ثلاث تخصصات أو مجالات متقاطعة مع بعضها البعض وهي كالتالي: علم البيانات هندسة البيانات تحليل البيانات قد تتداخل المهام في كل مجال من هذه المجالات، إلا أن المسؤوليات الأساسية لكل منها تختلف في مكان العمل وفيما يلي نوضح أهم الفروقات بين كل تخصص منها. علم البيانات علم البيانات هو المجال الذي يهتم بتطبيق تقنيات التحليلات المتقدمة والمبادئ العلمية لاستخراج معلومات قيمة من البيانات بهدف اتخاذ القرارات التجارية الأفضل والتخطيط الاستراتيجي . يعمل في مجال علم البيانات أشخاص ذوو كفاءة عالية يملكون معرفة أساسية في تخصص تحليل البيانات وهندسة البيانات فهم يتشابهون في عملهم مع مهندسي البيانات إلا أنهم أصحاب اليد العليا في جميع الأنشطة المتعلقة بالبيانات فعندما يتعلق الأمر باتخاذ القرارات المتعلقة بالأعمال يتمتع عالم البيانات بكفاءة أعلى وهو الذي يتخذ القرار النهائي بشأن العمل. يجب أن يمتلك المتخصص في هذا المجال مهارات تحليلية وبرمجية متقدمة تمكنه من حل مشكلات العمل بشكل كامل بالاعتماد على البيانات واستخراج المعلومات القيِّمة والمفيدة منها لتطوير الأعمال مستخدمًا برمجيات متقدمة من خلال الاعتماد على أفضل المنظومات والخوارزميات لحل المسائل المتعلقة بتنظيم البيانات واستخلاص المعلومات منها. يمكن أن نختصر ماهية علم البيانات بالنقاط التالية: طرح الأسئلة الصحيحة عن المسألة المدروسة وتحليل البيانات الخام. نمذجة البيانات باستخدام خوارزميات متنوعة ومتقدمة وعالية الكفاءة. تصوير البيانات لفهمها من منظور أوضح. فهم البيانات المتاحة لاتخاذ قرارات أفضل أو الوصول إلى نتيجة نهائية. باختصار علم البيانات هو العلم المسؤول عن استخراج معلومات مفيدة من بيانات مبعثرة ولا قيمة لها بشكلها الخام بعد تنظيفها وتصحيح أخطائها وإزالة القيم المكررة منها ومعالجة القيم المفقودة منها وهي تشبه عملية استخراج شيء مفيد من النفايات. علم هندسة البيانات Data Engineering هندسة البيانات هي العمود الفقري لعلم البيانات وتتضمن عملية تصميم وبناء أنظمة تسمح للأشخاص بالتنقيب عن البيانات الأولية وجمعها وتنظيفها من مصادر وتنسيقات متعددة وتخزينها واستعادتها ونقلها تمهيدًا لتحليلها واستخراج معلومات مفيدة منها. كما تهتم هندسة البيانات بالبيانات الوصفية التي تُعد بيانات تصف بيانات أخرى. وتأتي أهمية هندسة البيانات من ضرورة تهيئة البيانات التي جرى جمعها حتى تُخزن ويسهل استعادتها عند الطلب فلا معنى لأي تحليل أو تفسير للبيانات ما لم تجري أرشفة النتائج وتخزينها في منظومة معلوماتية يسهل التعامل معها لاتخاذ القرار. تتضمن هندسة البيانات المهام التالية: استخراج البيانات من مصادر مختلفة Data extraction معالجة البيانات Data processing وتحويل البيانات Data transformation والتي تتضمن تنظيف البيانات data cleaning ومعالجة القيم الفارغة وفصل القيم المجمَّعة وإزالة القيم الخطأ أو تحويلها إلى قيم صحيحة موحدة ومتناسقة. تحميل البيانات Data load وتخزين البيانات الناتجة في المصدر النهائي وعادة تكون قاعدة بيانات مخصصة للتحليل Database analysis تنفيذ العمليات الثلاث ETL التي تعني استخراج Extract وتحويل Transfer وتحميل Load والتي تعني مجتمعة عملية تنقل البيانات من قاعدة بيانات واحدة، أو قواعد بيانات متعددة، أو مصادر أخرى إلى مستودع موحد عادة ما يكون مستودع بيانات. فنظرًا لكون تحليل البيانات أمرًا صعبًا لأن البيانات تجمع بواسطة تقنيات مختلفة ويتم تخزينها بهياكل وتنسيقات مختلفة لكن الأدوات المستخدمة لتحليل البيانات تتطلب أن تكون كافة مجموعات البيانات مخزنة بنفس الهيكلية! وهنا يأتي دور هندسة البيانات في توحيد مجموعات البيانات وإنشاء البنية التحتية التي تزود أعضاء فريق البيانات ببيانات عالية الجودة ليعملوا عليها ويفهموها ويعثروا من خلالها على إجابات لأسئلتهم، وهم مسؤولون كذلك عن تصميم وصيانة هذه البنية التحتية. على سبيل المثال يمكن أن تجمع الشركات العديد من البيانات حول عملائها ومن مصادر متنوعة مثل معلومات حول الفواتير من برنامج مخصص لإدارة المبيعات ومعلومات عن الشحن من برنامج إدارة شركات الشحن والخدمات اللوجستية ومعلومات عن دعم العملاء من برنامج دعم العملاء ومراقبة مواقع التواصل الاجتماعي للحصول على المحتوى الذي يهتم به العملاء ويتفاعلون معه ومعلوماتهم الديموغرافية وأوقات نشاطهم …إلخ. توفر هذه البيانات الكثير من المعطيات للعميل لكن الحصول عليها من مصادر مختلفة وبتنسيقات متنوعة يجعل فهمها والحصول على الإجابات التي نريدها منها أمرًا صعبًا للغاية ويستهلك الكثير من الوقت والجهد لذا لا يمكننا أن نُعوِّل على إدراكنا البشري في هذا الأمر. لهذا السبب يقوم مهندسو البيانات بإعداد هذه البيانات وتنسيقها وتنظيمها وتخزينها في مستودعات بيانات مناسبة مصممة لمعالجة الاستعلامات بسرعة تضمن الأداء المناسب، وبعدها يقدمون هذه البيانات إلى مستهلكي البيانات النهائية مثل محللي البيانات الذين لن يتمكنوا من الوصول إلى البيانات وتحليلها واستخلاص النتائج والقرارات الصائبة منها بدون البنية التحتية التي ينشؤها لهم مهندسو البيانات. عمومًا، كان هذا تعريفًا مختصرًا بتخصص هندسة البيانات، وقد توسعنا بالحديث عنه في مقال منفصل بعنوان الدليل الشامل إلى هندسة البيانات Data Engineering فارجع إليه للاستزادة. علم تحليل البيانات Data analysis تحليل البيانات هو المجال المسؤول عن معالجة البيانات لاستخراج أو استخلاص معلومات مفيدة من شأنها أن تساعد الشركات والمنظمات في حل مشكلة ما أو الكشف عن فرصة ما لتطوير العمل وعرض هذه المعلومات والنتائج التي تم الحصول عليها بأفضل طريقة لصانعي القرار في العمل حتى يتمكنوا من اتخاذ قرارات من شأنها تطوير العمل نحو الأفضل. على سبيل المثال قد يطلب من محلل البيانات تقسيم العملاء بناءً على سلوك الشراء لديهم لتحديد العملاء الذين يجب أن يتم استهدافهم في الحملات التسويقية وإرسال العروض الأنسب المخصصة لكل منهم بناءً على سلوكه الشرائي أو يطلب منه تحديد التكلفة الأفضل للمنتجات للحفاظ على القوة الشرائية كي لا تنخفض عن مستويات السنوات السابقة. ومن أهم المهام التي يعنى بها تحليل البيانات ما يلي: جمع البيانات الخام من مصادر متعددة وتنظيمها. التأكد من جودة البيانات وتنظيفها وتحويلها عند الضرورة. نمذجة البيانات في تنسيقات محددة. التمثيل الرسومي للبيانات أو تصوير البيانات Data visualization ويقصد به عرض البيانات بطريقة مرئية كي يتمكن المتابع من فهم المحتوى الذي تقدمه ويستوعب الرؤى التي استخلصت من هذه البيانات. إيجاد إجابات وحلول لأي مشكلات أو استفسارات في مجال العمل من خلال تحليل البيانات ذات الصلة. الاستفادة من الإحصائيات الوصفية في تلخيص ووصف خصائص مجموعة البيانات. للقيام بهذه المهام يحتاج المختص في تحليل البيانات لامتلاك مجموعة من المهارات الفنية وأهمها الإلمام الجيد بلغة الاستعلام الهيكلية SQL لاستخراج البيانات التي يحتاجها من قواعد البيانات العلاقية المختلفة وإتقان البرامج المخصصة مثل MS Excel و MS Access و Microsoft Power BI التي تساعد في تحليل هذه البيانات وإنشاء نماذج منها وإجراء العمليات الحسابية والإحصائية المختلفة عليها. كما يحتاج بالطبع لامتلاك معرفة جيدة بالإحصاء والتحليل الرياضي لإضافة المهارات في التنظيم والتخطيط والاهتمام بأدق التفاصيل كي يتمكن من إدارة ومعالجة طلبات العمل بكفاءة، كما تعد مهارات التواصل مفيدة جدًا أيضًا لمحللي البيانات لأنهم بحاجة إلى التعبير عن نتائجهم وتفسيرها بوضوح لأرباب العمل. كان هذا تعريفًا مختصر بمجال تحليل البيانات، وقد توسعنا بالحديث عنه في مقال منفصل بعنوان الدليل الشامل لتحليل البيانات Data Analysis فارجع إليه للاستزادة. الفرق بين علم البيانات والذكاء الاصطناعي يُعرّف الذكاء الاصطناعي Artificial Intelligence واختصارًا AI بأنه وسيلة لتزويد الآلات بسلوك يحاكي السلوك البشري كي تقارب تفكيرهم وتتصرف مثلهم وبالتالي فإن الجانب الأساسي من تقنية الذكاء الاصطناعي مرتبط بتعلم الآلة وتعلم الآلة المعمّق. يلخص الجدول التالي الفرق بين علم البيانات والذكاء الاصطناعي من نواحي عدة كي نستطيع إدراك أوجه الشبه والاختلاف: وجه الموازنة علم البيانات الذكاء الاصطناعي الأساسيات علم البيانات هو دورة عمليات مفصلة تتضمن التحضير الأولي للبيانات وتحليلها ثم تصويرها واتخاذ القرار الذكاء الاصطناعي هو إنجاز نموذج قادر على التوقع بهدف التنبؤ بأحداث مستقبلية. الأهداف التعرف على الأنماط المطلوب إيجادها ضمن البيانات الخام للمشروع قيد الدراسة أتمتة العمليات ووضع بيانات التصرف الذاتي ضمن الوحدة البرمجية المدروسة. نوع البيانات التي يعمل عليها يعمل علم البيانات على أنواع مختلفة من البيانات مثل البيانات الخام والبيانات المهيكلة وغير المهيكلة. يستخدم الذكاء الاصطناعي أنواع معيارية من البيانات على شكل متجهات vectors وأنواع مدمجة أخرى من البيانات التقنيات المستخدمة يستخدم التقنيات الرياضية والإحصائية وخوارزميات تعلم الآلة وأدوات تحليل البيانات وتصويرها. يستخدم بشكل أساسي خوارزميات تعلم الآلة وتعلم الآلة المعمّق. المعرفة المكتسبة تُستخدم المعرفة التي يوفرها علم البيانات في إيجاد الأنماط والسلوكيات في البيانات. تصب المعرفة التي يوفرها الذكاء الاصطناعي في تزويد الوحدات البرمجية بشكل من أشكال التصرف الذاتي. أمثلة عن الأدوات المستخدمة ++R, Python, MATLAB,C Tensor flow, sci-kit-learn, Kaffee متى يُستخدم يُستخدم علم البيانات عندما تقتضي الضرورة استخدام حسابات رياضية سريعة أو تحليل بيانات استطلاعي أو تحليل توقعي predective analysis. لا بد في هذه الحالات من تحديد الأنماط والسلوكيات من خلال البيانات المتاحة ويتطلب ذلك معرفة بالإحصاء الرياضي. يُستخدم الذكاء الاصطناعي عندما تقتضي الضرورة التخلص من عمل ضروري متكرر. لا بد في هذه الحالات من تقييم مخاطر الانتقال إلى الذكاء الاصطناعي وسرعة اتخاذ القرار ودقة في التنفيذ بعيدًا عن المشاعر البشرية والانحياز. أمثلة عن الاستخدام تحسين العمليات واكتشاف سلوكيات العملاء والتحليل المالي وغيرها الكثير. الروبوتات وبرمجيات المحادثة الآلية والألعاب عبر الإنترنت وأنظمة المساعدة الصوتية. هنالك مسارات أخرى بدأت تتبلور تعكس التأثير الكبير لعلم البيانات على الذكاء الاصطناعي مع تزايد الاندفاع نحو ما يُعرف بالذكاء الاصطناعي القابل للتوضيح explainable AI والذي يقدم معلومات تساعد المستخدمين على فهم كيفية عمل نماذج تعلم الآلة ومقدار الثقة التي ينبغي أن يولوها لنتائج عمل هذه الوحدات عند اتخاذ القرارات. بالإضافة إلى دور علم البيانات في صياغة مبادئ تصميم الذكاء الاصطناعي المسؤول responsible AI principles للتأكد من عدالة جميع التقنيات المستخدمة وضمان عدم تحيزها وشفافيتها. مكونات علم البيانات ينبثق علم البيانات من مجموعة من المكوّنات أو العلوم ولا بد من استعراضها حتى تتوضح أبعاد هذا العلم: الإحصاء Statistics الرياضيات Mathematics البرمجة وعلوم الحاسوب Programming and Computer Science أساسيات الرياضيات لتتعلم علم البيانات لا بد من إتقان المفاهيم الأساسية في الرياضيات التي تعد الجزء الأكثر حيوية في مجال علوم البيانات، فهي الفضاء الذي تُدرس ضمنه الكميات والبنى والعلاقات ذات الصلة بالظاهرة المدروسة. إذ يُعد علم الرياضيات اللغة التي توصِّف الظواهر العلمية وتوفر الأدوات الضمنية التي يستخدمها علم البيانات مثل عمليات الاستقراء والتحليل والإحصاء والتفاضل والتكامل وغيرها. الإحصاء الرياضي يُعد الإحصاء الرياضي Statistics من أهم مكوّنات علم البيانات لأنه الوسيلة الأنسب لجمع وتحليل البيانات العددية مهما كانت كميتها كبيرة واستخلاص الأفكار منها. يتعامل هذا العلم مع مجموعات منفصلة من البيانات أو مجموعات مستمرة منها محاولًا تطبيق وسائل رياضية لدراسة ميل هذه البيانات للتقارب أو التباعد والمنحى الذي تأخذه في هذا السلوك ثم تضع أطرًا لتعريف وتصنيف هذه الوسائل. فمن منا لم يسمع في مرحلة ما من تحصيله الدراسي كلمة متوسط حسابي أو انحراف معياري أو منوال مثلًا، فهذه المصطلحات ما هي إلّا مقاييس لابتعاد قيم مجموعة من البيانات عن قيمها الوسطى. البرمجة وعلوم الحاسوب يأتي الحمل الأكبر في علم البيانات على البرمجة وتخصص علوم الحاسوب كي تتمكن من كتابة وتنقيح وتعديل الشيفرات التي تجمع وتحلل وتهيكل البيانات، حيث يجب على من يريد التخصص في علم البيانات تعلم إحدى لغات البرمجة والمكتبات البرمجية التي تدعم الوظائف الإحصائية والرياضية وبرمجيات التحليل وإيجاد علاقات الترابط وغيرها، إضافة لقواعد البيانات المسؤولة بشكل أساسي عن تخزين البيانات وتنظيمها واسترجاعها. كما يعد تعلم الآلة Machine learning أحد التقنيات المتقدمة التي تلعب في الآونة الأخيرة دورًا حيويًا في علم البيانات فمن خلاله يمكننا من الحصول على تنبؤات وقرارات أفضل دون الحاجة للتدخل البشري مما يساعد علماء البيانات في أداء مهامهم والحصول على حلول لمشكلات العمل بطريقة أسرع وأكثر ذكاء مقارنة بالاعتماد على التقنيات الإحصائية التقليدية. وإذا كنت مهتمًا بتعلم أسس علوم الحاسوب والتخصص في مجال علوم البيانات واكتساب خبرة عملية فيه بأسرع الطرق يمكنك مطالعة مقال أساسيات علوم الحاسوب فهو بمثابة دليل شامل يعرفك على اختصاص علوم الحاسب وأهم فوائده وتطبيقاته. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن أهمية علم البيانات لم تكن البيانات المتوفرة حول مختلف المجالات خلال العقد الأول من هذه الألفية وما قبلها -وخاصة بشكلها الرقمي- ذات أحجام كبيرة جدًا، وكان من السهل تخزينها في هياكل مخصصة مثل الجداول الإلكترونية وقواعد البيانات العلاقيّة ومن ثم التعامل معها من خلال أدوات مختلفة بكل سهولة ويسر. فقد جمعت البيانات ما قبل الحقبة الرقمية بأساليب يدوية مرهقة بالاعتماد على الأشخاص والأوراق والجداول ولم تكن بيانات شاملة، بل كانت تقتصر على ما هو ضروري للجهة التي تحتاج هذه البيانات سواء أكانت حكومية أو سواها. مع التحول إلى الرقمنة، أصبحت عملية الحصول على البيانات وتصنيفها أسهل وأيسر وظهرت أنواع جديدة من قواعد البيانات التي تسهل التعامل مع هذه البيانات، لكن كما أشرنا بقيت ضمن حدود السيطرة. لكن الكم الهائل جدًا من البيانات التي تنتج يوميًا عن كل فرد قد وصلت وفق بعض الأبحاث إلى 1.7 ميغا بايت في الثانية عام 2020 وقد تصل إلى أضعاف هذا الرقم في لحظة كتابة هذه الأسطر. فانطلاقًا من البيانات البسيطة التي يسجلها الجوال عن مستخدميه، وبيانات التصفح واستخدام الحاسوب، وبيانات نشاطك على مختلف مواقع التواصل الاجتماعي وعمليات التسجيل والشراء أو أي نشاط على مختلف المواقع قد تُسجل وتؤرشف لغايات خاصة بمشغلي تلك المواقع فتأمل عندها الكميات الكبيرة من البيانات التي ستظهر حتى حركة مؤشر الفأرة على شاشة متصفح مسجلة وتستعملها المواقع عبر أدوات تعقب وتحليل مختلفة مثل تتبع الأقسام التي زرتها والروابط والمنتجات التي أبديت اهتمامُا بها وذلك لتحليل سلوكك وبالتالي تقديم تجربة أفضل لك. ولا ننسى تطور البرامج السحابية التي مكنت المؤسسات من تتبع أحجام ضخمة من بيانات الأعمال في الوقت الفعلي وتوفر مليارات من أجهزة إنترنت الأشياء IoT حول العالم التي تجمع كل لحظة كمًا ضخمًا من البيانات عن كل تحركاتنا، لذا يتوقع أن يكون هناك 175 زيتابايت من البيانات في عالم البيانات العالمي بحلول عام 2025 وللعلم فإن زيتابايت يساوي 1000 بايت للأس 7 وبعبارة أخرى فإن زيتابايت واحد يحتوي على 21 صفرًا ولهذا السبب نحن نعيش بالفعل حقبة انفجار البيانات الضخمة Big Data Explosion ونحتاج لطريقة تمكننا من معالجة هذا الكم الجنوني من البيانات! إن معالجة هذا الكم الهائل من البيانات هي مهمة صعبة جدًا على أي مؤسسة أو جهة، لهذا ظهرت الحاجة الماسة إلى أدوات وتقنيات فعالة لمعالجة وتحليل تلك البيانات وأشخاص مؤهلين قادرين على التعامل معها وبدأ علم البيانات بالتبلور ليكون مزيجًا من عدة علوم تتكامل لإنجاز ما يلي: تجميع البيانات الخام وإعدادها للمعالجة أو التحليل النوعي. تحويل هذه الكميات الكبيرة من البيانات الخام وغير المهيكلة إلى معلومات ذات قيمة. تقديم البيانات وعرضها بصريًا لتوضيح الاستراتيجيات أو القرارات المبنية على نتائج تحليل تلك البيانات. استخلاص الأفكار والرؤى من البيانات المحللة باستخدام تقنيات الذكاء الاصطناعي وخوارزميات تعلم الآلة. وضع استراتيجيات تطوير للأعمال انطلاقًا من نتائج التحليل والدراسة. وضع توقعات صحيحة أو قريبة من الصحة في مختلف المجالات مثل استطلاعات الرأي والانتخابات وحجوزات السفر واستكشاف حالات الغش والدراسات العلمية والاجتماعية وغيرها. لم يكن علم البيانات منذ عقد مضى ولا حتى العاملين في هذا المجال منتشرًا في سوق العمل، لكن الشعبية الكبيرة حاليًا لهذه الفئة من الخبراء تعكس طريقة تفكير الأعمال بالبيانات الضخمة. فلا يمكن بعد الآن تجاهل الكميات الهائلة من البيانات الخام التي أضحت بالنسبة للكثير من الشركات بمثابة منجم ذهب افتراضي طالما أن هناك خبراء متحمسين وطموحين ودقيقي الملاحظة قادرين على التنقيب فيها ورؤية ما لا يراه غيرهم. مجالات علم البيانات يلعب علم البيانات اليوم دورًا فعالًا في جميع جوانب الحياة التجارية والطبية والحكومية …إلخ، ويجد المختصون في المجالات المختلفة كل يوم تطبيقًا جديدًا لعلم البيانات بما يعزز العمل الذي يشرفون عليه ويحقق مكاسب على جميع الأصعدة، لكننا سنقف تاليًا على أبرز المجالات التي شاع استخدام علم البيانات فيها. التعرف على الصور وتمييز الكلام عندما تحمّل صورة على فيسبوك ثم ترى اقتراحات للإشارة إلى أصدقائك في الصورة، فإن ما يجري فعلًا أن موقع فيسبوك قد استخدم خوارزمية تمييز الصور تلقائيًا وقد تعرف على الأشخاص في هذه الصورة. إن هذه الخوارزمية هي جزء من علم البيانات. وكذلك الأمر عندما تقول "Ok Google" ليستجيب هاتفك الذكي ويستعد للأوامر الصوتية، فإن علم البيانات هو السبب في ظهور خوارزمية التعرف على الكلام التي استخدمها التطبيق توًا. محركات البحث عبر الإنترنت هل لاحظت كيف تقترح لك محركات البحث الشهيرة مثل جوجل وياهو وبينج ما هو قريب من نتيجة بحثك؟ هل لاحظت السرعة في عرض النتائج والتحسن المستمر في دقة نتيجة البحث؟ يعود الفضل في ذلك إلى علم البيانات وخوارزمياته التي تجعل تجربة البحث عبر الانترنت أكثر سرعة وفعالية ورضًى للمستخدم. العلوم الطبيعية تُستنبط معظم المعايير العلمية المتعلقة بالظواهر الطبيعية من كم البيانات الهائل الناتج عن مراقبة هذه الظواهر على مدى طويل من الزمن كالمناخ والبيئة والفضاء، إذ ترسل المسابر ملايين البايتات يوميًا إلى مراكز الأبحاث لتحليلها واستقراء النتائج وبالطبع لن يكون من السهل فهم هذه البيانات والربط بينها دون استخدام خوارزميات علم البيانات وطرائقه. عالم الألعاب سواء الألعاب الرياضية الحقيقية كدراسة وتحليل حركات لاعبي كرة القدم وحتى منصات الألعاب الرقمية في تعزيز تجربة اللاعبين. تعتمد الشركات التي ترعى هذه المواضيع على تحليل نتائج البيانات المأخوذة من كم هائل من المباريات ومن تجارب مئات الآلاف الذين يمارسون ألعاب الفيديو عبر الإنترنت. لقد حسَّن استخدام علم البيانات وتقنياته أداء الكثير من شركات الألعاب. النقل إن الهدف الرئيسي لاستخدام علم البيانات في عالم النقل هو الوصول إلى المركبات ذاتية القيادة التي يسعى مصمموها إلى تقليل الخطأ البشري إلى أدنى مستوى وتقليل عدد الحوادث المرورية وضبط معدلات التلوث بعوادم الوقود. إضافة إلى ذلك، يساعد علم البيانات في تحليل حركة المرور واكتشاف الازدحامات والاختناقات المرورية وإرسال إشعارات للسائقين لسلوك طريق آخر مثلًا لوجود ازدحام في الطريق الذي يسير عليه وتحليل الحوادث المرورية واتخاذ القرارات. الرعاية الصحية لعلم البيانات دور بارز في مجال الرعاية الصحية لما يؤمنه من مساهمة في تشخيص الحالات الطبية وتخطيط العلاج والبحث الطبي ويوفر نتائج حاسمة وتوقعات تقترب نسبة الخطأ فيها من الصفر وخاصة في مجالات الكشف عن الأورام وابتكار الأدوية وتحليل الصور الطبية. أنظمة التوصية بالمنتجات تعتمد معظم الشركات مثل غوغل وأمازون ونيتفليكس على علم البيانات الذي يقدم تكنولوجيا مفيدة جدًا في تحسين تجربة مستخدمي هذه الشركات من خلال التوصية بمنتجات هذه الشركات لمستخدميها من معرفة ميولهم وسلوكياتهم أو ما يعرف بالتزكية المخصصة. فعندما تبحث عن شيء ما ثم تجد اقتراحات لأشياء مشابهة لاحقًا فهي نتيجة تطبيق خوارزميات علم البيانات. اكتشاف المخاطر تواجه الشركات المالية مخاطر تتعلق بقضايا التزوير وخسارة رأس المال، لكن بوجود علم البيانات ستقل هذه الأخطار إلى مستويات منخفضة. إذ تستفيد شركات المال من علماء البيانات في دراسة البيانات المالية للاستثمارات المطروحة وإدارة المخاطر المالية واكتشاف المعاملات الاحتيالية وتقييم مخاطر الخسارة أو الإفلاس مما يرفع ثقة العملاء بأداء هذه الشركات، كما يساعد علم البيانات أنظمة تقنية المعلومات في منع الهجمات الإلكترونية ومنع التهديدات الأمنية المختلفة. ومن مجالات هذا العلم الأخرى مساعدة الشركات التجارية على إنشاء حملات تسويقية أقوى وإعلانات مستهدفة أكثر دقة لزيادة المبيعات والأرباح، ومنع حدوث أعطال المعدات في الأماكن الصناعية، ويبرز استخدام علم البيانات المجال الأكاديمية لمراقبة أداء الطلاب وتحسينه للأفضل وغير ذلك الكثير مما لا يتسع المقال لذكره. وقلما تجد اليوم مجالًا لا يساهم علم البيانات الحديث في تحسينه وتطويره نحو الأفضل. دورة حياة مشروع علم البيانات تمر دورة علم البيانات بالمراحل التالية: الاستكشاف إعداد البيانات تخطيط النماذج بناء النماذج التحضير للعمل إيصال النتائج الاستكشاف وهي أولى مراحل هذه الدورة وتبدأ بطرح الأسئلة الصحيحة عن الظاهرة المدروسة. فلا بد قبل أن تبدأ أي مشروع متعلق بعلم البيانات أن تحدد المتطلبات الاساسية لهذا المشروع وأولوياته وميزانيته. لا بد في هذه المرحلة من تحديد كل متطلبات المشروع كعدد العاملين فيه والتقنيات المستخدمة والزمن اللازم لإنجازه والبيانات التي سيجري العمل عليها والغاية منها، وبالتالي سنتمكن من وضع إطار أولي لحل المشكلة التي كانت سببًا في إطلاق المشروع. إعداد البيانات نحتاج في هذه المرحلة إلى إنجاز المهام التالية: تصحيح البيانات وتنظيفها Data cleaning اختزال البيانات وتقليل حجمها Data Reduction تكامل البيانات Data integration نقل البيانات Data transformation بعد إنجاز هذه المراحل الأربعة تصبح البيانات جاهزة لعمليات أخرى. التخطيط لبناء النماذج نحتاج في هذه المرحلة إلى تحديد النماذج المختلفة والتقنيات اللازمة لإيجاد العلاقات والروابط بين متغيرات الدخل. وتجري عادة عملية تحليل بيانات استطلاعي Exploratory data analytics -تختصر إلى EDA- باستخدام الدوال والصيغ الإحصائية ثم أدوات تصوير البيانات لفهم الروابط بين المتغيرات ومن ثم فهم ما ترشدنا إليه تلك البيانات. من أكثر الأدوات شيوعًا في إنجاز هذه المرحلة نجد: SQL Analysis Services R SAS Python بناء النماذج تبدأ في هذه المرحلة عملية بناء النماذج. إذ يجري خلال هذه المرحلة إنشاء مجموعات من البيانات لأغراض التمرين والاختبار لتساعد في تطبيق تقنيات مثل التجميع والتصنيف والربط على البيانات المتوفرة لوضع نماذج عن سلوكها. إليك بعض أدوات بناء النماذج الأكثر شيوعا: SAS Enterprise Miner: عبارة عن إضافة تتكامل مع قواعد بيانات أو جداول (مثل إكسيل) لبناء نماذج تحليلية تعطي توقعات عن البيانات الموجودة وفقًا لمسار التحليل الذي تتبعه. WEKA: وهي مجموعة من خوارزميات لغة الآلة كتبت بلغة جافا للتعامل مع مهام التنقيب عن البيانات. SPSS Modeler: برنامج من شركة IBM لتنفيذ مهام التنقيب عن البيانات وتمثيلها بيانيًا وفهمها واتخاذ القرارات بناء عليها. MATLAB: بيئة عمل رياضية وبرمجية متكاملة لمختلف الأغراض الحسابية والتحليلية وتصوير البيانات وبناء خوارزميات تعلم الآلة وتطبيقها. تحضير المشروع للعمل تُسلم في هذه المرحلة معظم التقارير النهائية عن المشروع إلى جانب الشيفرة والمستندات التقنية. تقدم هذه المرحلة نظرة شاملة عن أداء المشروع على صعيد محدود قبل أن يجري نشر نتائجه كاملةً. إيصال النتائج النهائية يتحقق فريق العمل في هذه المرحلة من أن الهدف الذي وضع للمشروع في مرحلة الاستكشاف قد أنجز أم لا، ثم تُسلم بعد ذلك المعلومات التي تمكن الفريق من حيازتها عن طريق النماذج التي بنيت ومن ثم إيصال النتائج النهائية إلى فريق الأعمال الذي طلب الشروع بالعمل. التخصص في مجال علم البيانات رأينا سابقًا كيف ظهرت الحاجة الملحة لعلم البيانات كتخصص قائم ومستقل بذاته للتنقيب عن المعرفة بين أكوام البيانات الخام ويُعتقد وفقًا لعدة استطلاعات رأي بأنّ هذا التخصص سيكون الأكثر طلبًا في السوق خلال هذا العقد. وبما أن الطلب شديد على هذا المجال فهناك نقص كبير في اليد العاملة فيه عربيًا وعالميًا، لذا أمامك فرصة سانحة لممارسته دون الحاجة لوجود شهادة أكاديمية متخصصة فيه إذ التركيز حاليًا على الخبرة نظرًا لنقص اليد العاملة فيه. أي كل ما تحتاجه هو الخبرة الأساسية في البرمجة والإحصاء الرياضي ورغبة في تعلم هذا المجال وتحصيل كل ما يكسبك الخبرة العملية فيه من دورات ومخيمات تدريبية تؤهلك لدخول سوق العمل والحصول على فرصة مميزة لدى الكثير من الشركات والمنظمات التي ستتهافت على تدريبك وتوظيفك لديها. لهذا السبب لا بد من الاطلاع على التخصصات التي يمكنك العمل بها في حال رغبت في التخصص في مجال علوم البيانات. الوظائف التي يتضمنها علم البيانات حتى تختار التخصص الذي تراه مناسبًا لخبراتك وميولك، سنفرد هذه الفقرة للتفصيل في مجموعة من أهم الوظائف والأدوار الوظيفية المرتبطة بالبيانات والمتطلبات الأساسية لكل وظيفة: عالم بيانات Data scientist محلل بيانات Data analyst مهندس بيانات Data engineer معماري بيانات Data architect مطوّر تصوير بيانات Data Visualization Developer خبير في تعلم الآلة Machine Learning expert لنكتشف المزيد حول كل دور من هذه الأدوار وأهم التقنيات والمهام المنوطة به. محلل البيانات هو شخص خبير ينقّب في أكوام البيانات الخام باحثًا عن نماذج وأنماط علاقات تربط بينها. يعمل بعد ذلك على عرض نتائج ما توصل له بما يساعد على اتخاذ قرار أو حل مشكلة. ما المهارات التي يجب أن يتقنها محلل البيانات؟ معرفة جيدة في الرياضيات. معرفة جيدة في التنقيب ضمن البيانات Data mining. معرفة أساسيات علم الإحصاء Statistic. أن يكون مطلعًا على بعض لغات البرمجة والأدوات البرمجية المستخدمة في علم البيانات مثل: Python MATLAB SQL Hive R JS SAS SPSS وغيرها مهندس بيانات وهو الشخص الذي يعمل مع كميات كبيرة من البيانات ويكون مسؤلًا عن بناء وصيانة بنى مناسبة لهذه البيانات وفقًا لمشروع علم البيانات الذي يعمل عليه. يعمل مهندس البيانات أيضًا على تصميم العمليات التي تتحكم بمجموعات البيانات وتُستخدم في نمذجة هذه المجموعات أو التنقيب فيها أو حيازة معلومات منها أو التحقق من سلامتها. ما المهارات التي يجب أن يتقنها مهندس البيانات؟ معرفة معمقة بتقنيات برمجية مثل: SQL MongoDB Cassandra HBase Apache Spark Hive MapReduce معرفة جيدة بلغات برمجة مثل Python, C/C++, Java, Perl. معماري بيانات وهو الشخص الذي يتصور ويصمم الأسلوب الذي تُنجز وفقه البنية التحتية المسؤولة عن تخزين وإدارة البيانات لأغراض التحليل سواء على صعيد العتاد الصلب أو الصعيد البرمجي. ما المهارات التي يجب أن يتقنها معماري البيانات؟ معرفة معمقة بقواعد تطوير البرمجيات والأنظمة. معرفة معمقة بالمعماريات المستخدمة في إنجاز قواعد البيانات. عالم بيانات عالم البيانات هو شخص خبير يعمل على تجميع وتحليل واستخلاص النتائج من كميات كبيرة من البيانات الخام أو المهيكلة أو غير المهيكلة. يجمع عمل عالم البيانات بين علوم الحواسب وخاصة برمجتها وعلم الإحصاء والرياضيات. يعمل عالم البيانات على تحليل ومعالجة ونمذجة البيانات ثم يفسر النتائج التي حصل عليها كي يُنشئ خطة عمل مناسبة للشركة أو المنظمة أو الجهة التي يعمل لديها. يُسخّر علماء البيانات قدراتهم ومهاراتهم في مختلف المجالات سواء التقنية منها أو الاجتماعية للبحث عن تفاصيل قد لا يراها ولا يفهمها سواهم في كم البيانات الهائل الذي يعملون عليه، إذ يتضمن عملهم عادة إيجاد ترابط منطقي بين بيانات غير مهيكلة أو خام تنتج عن مصادر مختلفة كالأجهزة الذكية وردود الأفعال على مواقع التواصل الاجتماعي ومحتوى رسائل البريد الإلكتروني وغيرها من المصادر التي يصعب ملاءمتها من قواعد البيانات المهيكلة. ما المهارات التي يجب أن يتقنها عالم البيانات؟ فهم معمق لعلم الإحصاء. معرفة جيدة في الرياضيات. مهارة في إحدى لغات البرمجة التالية أو أكثر Python R SAS SQL Hive Pig Apache spark MATLAB قدرة جيدة على تصوير البيانات Visualization. مهارات تواصل جيدة. دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن مطور تصوير بيانات وهو شخص يعمل إلى جانب عالم البيانات لتمثيل البيانات بصريًا وتقديم عروض ومخططات تفصّل نتائج تحليل هذه البيانات بطريقة مرئية سهلة الفهم لإيصالها إلى من يستخدمها. ما المهارات التي يجب أن يتقنها مطور تصوير بيانات؟ مهارة في إحدى لغات البرمجة التالية أو أكثر: Python R SAS SQL Hive Pig Apache spark MATLAB قدرة تحليلية ممتازة. قدرة كبيرة على إيجاد الطرق الأمثل في تصوير البيانات. خبير في تعلم الآلة هو الشخص الذي يعمل مع مختلف خوارزميات تعلم الآلة التي تُستخدم في علم البيانات مثل خوارزميات الارتجاع أو الإنحدار Regression والتجميع clustering والتصنيف classification وشجرة القرار decision tree والغابة العشوائية random forest وغيرها. ما المهارات التي يجب أن يتقنها خبير تعلم الآلة؟ خبرة في أحد لغات البرمجة التالية أو أكثر: Python ++C R Java Hadoop فهم جيد للخوارزميات الكثيرة المستخدمة في علم البيانات وتعلم الآلة. مهارة تحليلية في حل المشاكل. معرفة جيدة في علمي الاحتمالات والإحصاء. مصادر تعلم علم البيانات هل أنت متحمس للتخصص في مجال علم البيانات وتعلمه بشكل ذاتي وبأقصر الطرق بعيدًا عن أروقة الجامعات ومناهجها المكثفة -بسنواتها الطويلة التي تمتد لأربع أو خمسة سنوات- لكنك لا تعرف من أين تبدأ؟ سنسلط في القسم الضوء على مصادر تعلم تخصص علم البيانات العربية لدخول سوق العمل، فكما أشرنا حاليًا السوق شره على المتخصصين ويركز على الخبرة والمشاريع العملية المنجزة ولا يتطلب شهادات جامعية حصرية. نفترض أنك أنهيت مراحل جيدة من التعليم الدراسي أو قد أنهيت المرحلة الثانوية أو تخصصت في أحد التخصصات الهندسية وبذلك تكون قد حصَّلت معرفة جيدة بأساسيات الرياضيات والإحصاء وحتى مواضيع متقدمة مثل التفاضل والتكامل (إن كنت قد اخترت التخصص العملي وليس الأدبي) وبذلك تكون قد قطعت شوطًا في تعلم هذا العمل، وعمومًا الأساسيات تكفي للبدء ويمكن لاحقًا التعمق في أي موضوع تحتاج إليه. بعدها يمكنك البدء بتعلم أساسيات علوم الحاسوب ولغات البرمجة المخصصة المستخدمة في علم البيانات وأهمها لغة بايثون و لغة R ولغة SQL فهي من أكثر اللغات المطلوبة والمخصصة للاستخدام مع البيانات. تؤمّن هذه اللغات قدرات وظيفية كبيرة في التواصل مع قواعد البيانات واستخلاص البيانات الخام وتحليلها وتنظيمها واستخلاص الرؤى وفقا للظاهرة المدروسة ومن ثم التقييم وإتخاذ القرار، وكل ذلك من خلال مجموعة واسعة من الخوارزميات التي توفرها هذه اللغات ضمنًا أو من خلال مكتبات متوافقة معها. من أهم المصادر العربية المتكاملة التي ننصحك بها كي تتعلم هذه التقنيات: كتاب ملاحظات للعاملين بلغة SQL 1.0.0 كتاب البرمجة بلغة بايثون الذي يشرح أساسيات لغة بايثون سلسلة تعلم لغة R التي تطلعك على كافة الأساسيات والمواضيع النظرية التي تحتاجها في هذه اللغات. سلسلة مقالات think stats التي توفر لك مجموعة مميزة من المقالات والدروس المتخصصة في تعليم الاحتمالات والإحصائيات لمبرمجي بايثون بأسلوب مبسط وسهل الفهم. وإذا كنت تفضل التعلم بإشراف مختصين يجيبونك على أي سؤال يخطر ببالك ويقرن التعليم النظري بالتطبيق العملي فأنصحك بالاطلاع على دورة أساسيات علوم الحاسب التي توفرها أكاديمية حسوب فهي كفيلة بأن تكسبك كافة الأسس التي تحتاجها لتعلم أسس البرمجة وقواعد البيانات، وكذلك دورة تطوير التطبيقات بلغة بايثون والتي تمكنك من تطوير طيف واسع من التطبيقات في مجالات منوعة من بينها تطبيقات عملية في تحليل البيانات تساعدك في التعرف على أبرز مكتبات بايثون المتخصصة في التعامل مع علم البيانات. إضافة إلى لغات البرمجة التي ذكرناها ستجد الكثير من المنصات والأدوات التي تدعم بشكل مباشر العمل مع البيانات الضخمة وتقدم مختلف الأدوات المساعدة في التحليل والتنظيم واتخاذ القرار والتي يمكنك تعلمها ومن أبرزها SAS و Spark و Hadoop و Azure و AWS. خاتمة ألقينا الضوء في هذا المقال على علم البيانات الذي يُتوقع أن يكون من أكثر الأعمال طلبًا خلال هذا العقد من الألفية نظرًا للحاجة الماسة للعمل ضمن كميات هائلة من البيانات الخام وضرورة الاستفادة منها في تطوير الأعمال على مختلف الأصعدة. كما تحدثنا عن المكونات والتخصصات التي يضمها ومجالات استخدامه وتطبيقه، كما تحدثنا عن دورة الحياة التي يمر بها أي مشروع يعتمد على علم البيانات. ومنعًا لتضارب الأفكار وضياع التسميات، فقد تحدثنا عن الفرق بين علم البيانات وتحليلها وكذلك الفرق بين علم البيانات والذكاء الاصطناعي. وهكذا نكون قد أحطنا بشكل مفصل أساسيات علم البيانات وتخصصاته ومجالاته المختلفة لمن يرغب فعليًا في امتهانه أو احتراف أحد اختصاصاته، ووضحنا المتطلبات الضرورية التي يحتاجها المتعلم حتى يبدأ رحلته في هذا المجال المهم والشيق والمجزي ماديًا والذي ينبئ بمستقبل واعد.
    2 نقاط
  23. لا يختلف اثنان على أهمية تعلم أساسيات البرمجة، فالبرمجة هي مهنة الحاضر والمستقبل، وهي تعتبر أحد المهارات الأساسية في عصرنا الذي بات يعتمد على التقانة في جميع جوانبه، فضلًا عن أن البرمجة قد أصبحت مادة أساسية في المناهج الدراسية في العديد من الدول بدءًا من المراحل الابتدائية. إذا اتخذت قررًا بتعلم أساسيات البرمجة من الصفر للاحتراف فهذا بلا شك قرار صائب، فالبرمجة توفر لك الكثير من فرص العمل، وتوسع مداركك، وتعزز تفكيرك النقدي، كما أنها تكسبك القدرة على حل المشكلات التي تواجهك بكفاءة أكبر، والأمر الجيد أن البرمجة تتميز عن غيرها من المجالات بكونها متاحة للجميع، ويمكنك تعلمها بشكل ذاتي بعيدًا عن أروقة الجامعات الطويلة. نشرح في مقال اليوم أساسيات البرمجة، ونستعرض أهم الأدوات التي تحتاجها كمبرمج، ونبين مفاهيم البرمجة الأساسية التي تشترك فيها معظم لغات البرمجة، وأهم المبادئ التي يمكنك اتباعها لتبرمج كالمحترفين. ما هي البرمجة؟ البرمجة باختصار هي إعطاء التعليمات لجهاز الحاسوب لينفذها باستخدام إحدى لغات البرمجة، ويتلقى الحاسوب هذه التعليمات ويترجمها ويفهمها وينفذها، ويُطلق على تسلسل التعليمات المكتوبة باستخدام لغة برمجة والتي تنجز مهمة محددة اسم برنامج. فنحن البشر نتواصل فيما بيننا بلغاتنا الطبيعية كالعربية أو الإنجليزية، أما الحاسوب فيحتاج لاستخدام لغة برمجة خاصة للتواصل معه، وعالم لغات البرمجة شامل ومنوع فهناك المئات من لغات البرمجة حاليًا، ونشير إلى أن لغة البرمجة هي لغة وسيطة بيننا وبين الحاسوب فحتى الحاسوب لا يفهم لغة البرمجة التي نكتبها بل تُحول كل لغة نكتبها إلى لغة يفهمها الحاسوب عبر أداة تحويل وتدعى اللغة التي يفهمها الحاسوب بلغة الآلة Machine Language التي تتكون من أصفار وواحدات. قبل أن تتعلم أساسيات البرمجة: حدد وجهتك قد تكون حددت لغة البرمجة التي تريد تعلمها وتبحث عن تعلم أساسيات هذه اللغة لذا وصلت إلى هنا، أو لم تحددها بعد، ولكن عمومًا تشترك كل لغات البرمجة بأساسيات واحدة إن تعلمتها سيسهل عليك التعامل مع أي لغة برمجة. قرار تعلم أساسيات البرمجة يشبه قرار الذهاب في إجازة، فأنت لن تذهب في إجازة دون أن تحدد الوجهة التي تريد الذهاب لها، وبناء على وجهتك تحدد مسارك الذي ستسلكه وتجهز مستلزماتك. وبالتالي السؤال الذي يجب أن تطرحه قبل أن تقرر تعلم أي لغة برمجة هو ما هو هدفي النهائي من تعلم البرمجة؟ وبناء على إجابتك تحدد مسار التعلم الصحيح واللغات والأدوات التي عليك تعلمها. ركز في البداية على لغة رئيسية واحدة تتعلم بها أساسيات البرمجة، ثم سيسهل عليك تعلم لغات أخرى حسب الضرورة، حيث الأساسيات والمفاهيم واحدة ولن تختلف من لغة إلى أخرى بل ما يختلف هو طريقة كتابة كل لغة والميزات التي توفرها للمبرمج، وبعبارة أخرى، الخطوة الصعبة هي الخطوة الأولى وهي خطوة تعلم أساسيات البرمجة. وتذكر أن تعلم البرمجة يحتاج لبعض الصبر والجهد، لا سيما عند تعلم إحدى لغات البرمجة لأول مرة كما أشرنا ويحتاج إلى تطبيق أيضًا لأن التعلم النظري شيء والتطبيق شيء آخر ففيه ستواجه الكثير من المشكلات وستتعلم بها حلها وتفاديها تدريجيًا حتى تكون مبرمجًا محترفًا. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن أهمية تعلم أساسيات البرمجة تعلم أساسيات البرمجة للمبتدئين يشبه إلى حد كبير تعلم قيادة السيارة، فعندما تجلس خلف مقود السيارة لأول مرة لن تكون قادرًا على القيادة بسلاسة على الفور، بالطبع! تذكَّر كيف تبدأ آنذاك باستكشاف أجزاء السيارة كالفرامل ودواسة البنزين وناقل الحركة، ثم التعرف على المفاهيم والمصطلحات الأساسية المرتبطة بالقيادة، وتلقي الكثير من التعليمات والملاحظات النظرية حول آلية القيادة أكثر من التركيز على القيادة بحد ذاتها. وبعدها تبدأ عملية التدريب على تنفيذ أوامر بسيطة مثل تشغيل السيارة وتحريكها رويدًا رويدًا في مكان مفتوح إلى أن تزداد التعليمات تعقيدًا وتصبح قادرًا على التحكم بالسيارة وقيادتها في كافة الظروف والطرق. بنفس الطريقة ستتعلم البرمجة، حيث عليك أن تتعلم بداية أساسيات البرمجة النظرية، ثم تكتب برامج باستخدام تعليمات بسيطة، ثم تتعلم كيف تكتب التعليمات بطريقة أكثر احترافية، ومع الممارسة والتطبيق ستتمكن من احتراف البرمجة وتطوير برامج متقدمة. وقد شرح مقال كيف تتعلم البرمجة: نصائح وأدوات لرحلتك في عالم البرمجة رحلة تعلم البرمجة بالتفصيل وقدم نصائح مهمة وأجاب على أسئلة شائعة حول تعلم البرمجة فارجع إليه للاستزدادة في هذا الموضوع. احصل على موقع إلكتروني مخصص لأعمالك أبهر زوارك بموقع احترافي ومميز بالاستعانة بأفضل خدمات تطوير وتحسين المواقع على خمسات أنشئ موقعك الآن أدوات مهمة لتعلم أساسيات البرمجة بعد أن تحدد اللغة التي ستتعلمها، تحتاج كخطوة أولى إلى إعداد بيئة التطوير لديك حتى تتمكن من كتابة شيفرة برمجية وتنفيذها كي تتواصل مع الحاسوب بتلك اللغة، والأدوات اللازمة لتعلم أساسيات البرمجة في البداية هي أداتين يحتاج إليهما كل مبرمج: محرر الشيفرة البرمجية أداة تحويل الشيفرة وتنفيذها محرر الشيفرة البرمجية تعتمد معظم لغات البرمجة على أوامر نصية، لذا ستحتاج إلى محرر أكواد لكتابتها، ومحرر الكود هو برنامج لتحرير النصوص مصمم خصيصًا لكتابة وتحرير الشيفرة المصدرية للبرامج، وتتميز بعض المحررات بأنها تتضمن ميزات تسهل كتابة الكود كتمييز الكلمات حسب بناء الجملة، ووضع مسافة بادئة لأسطر التعليمات البرمجية بشكل صحيح. ومن الأمثلة على محررات أكواد Notepad++‎ لنظام تشغيل ويندوز و gedit أو kate لنظام التشغيل لينكس. ملاحظة: بعض لغات البرمجة الموجهة للمبتدئين تعتمد على واجهات رسومية ولا تحتاج لمحررات نصية مثل لغة سكراتش والتي تدعى أحيانًا لغات برمجة رسومية، وللمزيد يمكنك الرجوع إلى مقال البرمجة باستخدام سكراتش. أداة تحويل الشيفرة وتنفيذها نكتب الكود المصدري عادة بلغة برمجة لا يفهمها جهاز الحاسوب مباشرة كما أشرنا، لذا يجب تثبيت برنامجًا يُحوِّل الشيفرة المصدرية للغة البرمجة بأكملها إلى لغة آلة Machine Code يفهمها الحاسوب ثم ينفذها، ويختلف هذا المُحول من لغة برمجة إلى أخرى ويُسمى إما مُصرِّف Compiler أو مُفسِّر Interpreter وبعض اللغات تحتاج إلى تصريف وآخر إلى تفسير وبعضها يحتاج إلى كلا العمليتين لتحويلها إلى لغة الآلة ثم تنفيذها. لتفهم الفرق بين المُصرِّف والمُفسِّر تخيل أن لديك وصفة مكتوبة باللغة التركية وأنت لا تعرف التركية وتريد أن تحضّرها. في هذه الحالة يمكن أن تطلب من أحدهم أن يترجم لك الوصفة بالكامل للغة العربية ويعطيها لك لتعدها متى ما أردت مستعينًا بهذه النسخة المترجمة Compiled، أو يمكنك أن تكلمه في كل مرة تريد فيها أن تحضر هذه الوصفة وتطلب منه أن يقرأها ويفسرها لك خطوة بخطوة Interpreted. بيئة التطوير المتكاملة IDE يمكنك أن تحصل على المحرر وأداة التحويل والتنفيذ على حدة وتثبتهما على جهازك، أو يمكنك بشكل بديل أن تعتمد على بيئة تطوير متكاملة IDE وهي اختصار العبارة Integrated Development Environment تتضمن كافة الأدوات اللازمة للتعامل مع لغة البرمجة. أمثلة على بيئات تطوير متكاملة: Microsoft Visual Studio NetBeans IntelliJ IDEA يمكنك في بيئة التطوير المتكاملة كتابة التعليمات البرمجية وتعديلها وتصحيحها وتحويلها ثم تنفيذها بسرعة وسهولة كل ذلك من مكان واحد، إذ توفر لك كافة الأدوات اللازمة لتكتب وتنفذ برامج بلغة معينة، كما توفر ميزات تساعدك في تطوير البرامج مثل تصحيح الأخطاء البرمجية، والإكمال التلقائي للتعليمات، وللتعرف أكثر على بيئة التطوير المتكاملة، يمكنك الرجوع إلى مقال مدخل إلى بيئة التطوير المتكاملة IDE. ملاحظة: يمكنك الاعتماد على مترجمات أو بيئات عمل برمجية متوفرة على الإنترنت، حيث توفر العديد من المنصات إمكانية كتابة وتنفيذ البرامج على متصفح الويب بدلًا من تثبيت وإعداد البرامج على الحاسوب المحلي. أساسيات البرمجة للمبتدئين تتنوع لغات البرمجة وتعدد استخداماتها إلا أنها تشترك في مجموعة من الأساسيات والمفاهيم، وتعلم هذه المفاهيم يمكّنك من التآلف من أي لغة برمجة، وإنجاز البرامج باستخدامها بمرونة أكبر، وأهم هذه الأساسيات: المتغيرات Variables الثوابت Constants أنواع البيانات Data types الكلمات المفتاحية Keywords التعليقات Comments بنى التحكم Control Structures الدوال Functions هياكل البيانات Data structure التكرار Iteration التعاود Recursion الكائنات Objects والأصناف Classes الوحدات Modules والمكتبات Libraries نشرح في الفقرات التالية كلًا من هذه الأساسيات البرمجية بمزيد من التفصيل، ونرفق بعض الأمثلة التوضيحية بلغات برمجة مختلفة. المتغيرات تستخدم المتغيرات Variables في البرمجة بشكل مشابه لاستخدامها في الرياضيات، فهي تخزن قيم البيانات من نوع محدد، ويمكن للمتغير احتواء قيمة واحدة في المرة الواحدة، فمتى ما وضعت فيه قيمة جديدة فإن القيمة السابقة المخزنة فيه سوف تحذف تلقائيًا. يمكن تشبيه المتغير بصندوق مفتوح في ذاكرة الحاسوب له اسم وعنوان خاص به، حيث يمكن إدخال القيم وإخراجها من هذا الصندوق حسب الطلب. وتسمى عملية وضع قيمة في المتغير بشكل مباشر الإدخال Input أو الإسناد Assignment أو أحيانًا الضبط Set، كما تسمى عملية الحصول على هذه القيمة وعرضها الإخراج Output أو الجلب Get. وتجدر الإشارة لأن بعض أنواع المتغيرات تكون محدودة الوصول، بمعنى أنها لا تسمح لك بالوصول المباشر لها سواء لتخزين البيانات ضمنها أو الحصول على القيم المخزنة فيها إلا عبر وسيط ويُسمى هذا الوسيط باسم ضابط setter وجالب getter على التوالي، والغرض من هذه العملية حماية المتغيرات من تعديلات غير مرغوبة كما سنوضح لاحقًا في فقرة الكائنات والأصناف التي أكثر ما تُستخدم فيها. لتعريف متغير في لغة البرمجة C++‎ عليك ذكر اسم المتغير ونوع البيانات التي تريد تخزينها في هذا المتغير وإسناد قيمة أولية فيه، على سبيل المثال لتعريف متغير باسم a لتخزين العدد الصحيح 10 بداخله نكتب ما يلي: int a = 10; كما يمكنك تعريف المتغير دون إسناد القيمة له في البداية وإسنادها لاحقًا بالشكل التالي: int a; a = 10; في حين لا تملك لغة بايثون أمرًا محددًا لتعريف المتغيرات، كل ما عليك هو كتابة اسم المتغير واستخدام علامة مساواة متبوعة بقيمة المتغير، وسوف تكتشف اللغة تلقائيًا نوع المتغير وحجم الذاكرة المناسب له كما يلي: a = 10 الثوابت تشير الثوابت Constants إلى قيمة أو كمية ثابتة لا نحتاج لأن نغيرها أو نعدلها أبدًا أثناء تنفيذ البرنامج، مثل سرعة الضوء، وعدد الدقائق في الساعة، والعدد Pi الذي يمثل نسبة محيط الدائرة إلى قطرها، وتسارع الجاذبية الأرضية، ومعدل نجاح الطالب وما إلى ذلك. فالثوابت البرمجية بمثابة صندوق تغلقه بإحكام بعد وضع قيمة فيه ولا يسمح لك بتغييرها في كود البرنامج، فبعد تحديد قيمة الثابت يسمح لك فقط بالوصول إلى قيمته، بخلاف المتغير الذي يمكنك الوصول إلى قيمته وإعادة تعيينها وتعديلها حسب حاجتك. لتعريف الثوابت في لغة C++‎ نستخدم الكلمة المفتاحية const ثم نكتب نوع البيانات واسم الثابت وقيمته كما يلي: const float PI = 3.14; const float GRAVITY = 9.8; const float SUCC_RATE = 0.5; في حين لا تميز بعض اللغات مثل لغة بايثون بين تعريف الثوابت والمتغيرات، حيث يمكنك تعريف الثوابت والتعامل معها كما تعرّف أي متغير، وتلتزم أنت بعدم تغيير قيمتها في سياق البرنامج، كما يمكنك التصريح الثوابت في ملف مختلف واستيرادها في برنامجك لتمييزها عن المتغيرات. PI = 3.14 GRAVITY = 9.8 ملاحظة: يشيع في أوساط المبرمجين تسمية الثوابت بحروف أجنبية كبيرة لتمييزها عن المتغيرات كما فعلنا في الأمثلة السابقة. أنواع البيانات أنواع البيانات Data types في لغات البرمجة هي عملية تحديد نوع وحجم القيمة التي يمكن أن تخزن في المتغير والتي يترتب عليها تحديد العمليات التي يمكن تطبيقها على هذه المتغير من طرف لغة البرمجة مثلًا السماح بتطبيق عملية الجمع والطرح على نوع الأعداد والسماح بعملية البحث والاستبدال على النصوص وهكذا. توفر لغات البرمجة العديد من أنواع البيانات مثل: الأعداد التي تنقسم إلى أعداد صحيحة integer numbers وأعداد عشرية floating point numbers، والمحارف Characters، والسلاسل النصية Strings، والقيم المنطقية Boolean …إلخ. على سبيل المثال في لغة البرمجة C++"‎" إذا كنت تحتاج في برنامجك إلى تخزين العمر، ستحتاج لمتغير من نوع بيانات عدد صحيح، ويمكنك تعريف هذا المتغير أو التصريح عنه باستعمال الكلمة المفتاحية int كما يلي: int age; فعندما استخدمنا الكلمة int هنا أخبرنا مترجم اللغة أن هذا المتغير مخصص لتخزين أعداد صحيحة فقط، ليحجز الحجم المناسب له في ذاكرة الحاسوب وينتظر منا إدخال قيم صحيحة فيه فقط، فإذا جربت تخزين نص أو عدد عشري فيه فستحصل على خطأ من أداة التحويل أثناء تحويل البرنامج إلى لغة الآلة وهذا ينطبق على الأمثلة الآتية أيضًا. وإذا احتجت لمتغير مخصص لتخزين قيمة عشرية مثل متوسط درجات الطالب، أو مساحة دائرة استخدم نوع البيانات float لهذا المتغير كما يلي: float avg; ولتعريف متغير مخصص لتخزين محارف مفردة يمكنك أن تستخدم نوع البيانات char كما يلي: char x; x = 'A'; أما لتخزين السلاسل النصية المكونة من عدة محارف فاستخدم نوع البيانات string كما يلي: string str = "This is a C++ string"; ولتخزين القيم المنطقية التي يمكنها أن تحتوي القيمة صواب true أو خطأ false والتي تفيد في اختبار الشروط، استخدم نوع البيانات bool كما يلي: bool con1 = false; bool con1 = true; إن التعامل مع أنواع البيانات أبسط في لغات أخرى مثل لغة بايثون، فأنت لا تحتاج لتحديد نوع بيانات للمتغير قبل استخدامه، لكون اللغة قادرة على استنباط وتعيين نوع بيانات المتغير تلقائيًا بمجرد أن تسند له قيمة ما، فبحسب نوع القيمة التي تسندها تحدد اللغة نوع البيانات المناسب له. إليك بعض الأمثلة على تعريف متغيرات من أنواع بيانات مختلفة في بايثون: v1 = "This is a Python string" #string v2 = 10 #int v3 = 10.33 #float v4 = True #bool لمزيد من المعلومات حول أنواع البيانات في لغات البرمجة، اطلع على مقال دليلك الشامل إلى أنواع البيانات. الكلمات المفتاحية تتضمن أي لغة برمجة مجموعة من الكلمات المفتاحية Keywords أو الكلمات المحجوزة Reserved Words، وهذه الكلمات لها معنى خاص ولا يمكن للمبرمج استخدامها لتعريف المتغيرات مثلًا. ولعلك انتبهت إلى قولنا كلمة مفتاحية على const وعلى int في الأمثلة السابقة في لغة C++‎ التي كانت كلمات محجوزة مخصصة لتعريف الثوابت البرمجية وأنواع البيانات، كما تعد الكلمتان True و False محجوزتين في بايثون لتمثيل القيمتين المنطقيتين صواب وخطأ على التوالي وقس على ذلك في أي لغة برمجة. وعليك أن تطلع على الكلمات المفتاحية ودلالة كل كلمة وطريقة استخدامها في اللغة التي تريد تعلمها ويكون عادة عددها محدود وبسيطة وقد تتكون من كلمة إنجليزية واضحة أو اختصار لها مثل الاختصار const لكلمة constants ثابت والاختصار init لكلمة integer عدد صحيح ومعرفة مما يتشكل الاختصار يُسهل عليك حفظ الكلمة خصوصًا وبما أن عددها محدود وبسيطة فلا تخف إن كانت لغتك الإنجليزية ضعيفة. التعليقات تعد التعليقات Comments من أساسيات البرمجة، والتعليقات هي عبارة عن نصوص وصفية تضاف للكود البرمجي لتسهيل فهمه وقراءته ويمكن أن تكون بأي لغة مثل اللغة العربية، وهي لا تنفذ في البرنامج حيث أن مترجم اللغة يتجاهلها ويعتبرها فراغات، لكنها مفيدة للمبرمج نفسه ليتذكر ما كتبه عند العودة للبرنامج لاحقًا، كما أنها تساعد أي شخص يقرأ الكود الذي كتبه المبرمج في فهم سير عمل البرنامج والهدف من كتابة تعليمات معينة فيه. تستخدم لغات البرمجة المختلفة أساليب مختلفة لكتابة التعليقات تنحصر عادة بالرموز الثلاثة # أو // أو /* */، على سبيل المثال في لغة C++‎ يمكنك كتابة التعليقات على سطر واحد بعد الرمز // وكتابة التعليقات متعددة الأسطر بين الرمزين /* */ كما يلي: /* هذا تعليق مكون من عدة أسطر */ //هذا تعليق مكون من سطر واحد أما في لغة بايثون فيمكنك كتابة التعليق أحادي السطر بعد الرمز # وكتابة التعليقات متعددة الأسطر بعد علامتي اقتباس أو ثلاث علامات اقتباس مفردة كما يلي: ''' هذا تعليق مكون من عدة أسطر ''' #هذا تعليق مكون من سطر واحد بنى التحكم تنفذ البرامج عادة بشكل متتابع من بداية الشيفرة إلى نهايتها تعليمة تلو الأخرى، لكن قد تحتاج في بعض الحالات لتغيير مسار التنفيذ وتجاوز بعض التعليمات أو تكرارها، وهنا يأتي دور بنى التحكم Control Structures التي تعتبر من أساسيات البرمجة لكونها تفيد المبرمجين في تحديد الاتجاه أو المسار الذي يجب الانتقال له بناء على عوامل معينة. بالعودة إلى مثال تعلم القيادة الذي ذكرناه بداية، تخيل أنك تسير في طريقك نحو مقر عملك، وصادفت إشارة حمراء أو اعترضتك سيارة إسعاف، ألن تحتاج عندها للتوقف لحين عودة الإشارة إلى اللون الأخضر أو التنحي لجانب الطريق لحين مرور الإسعاف ثم تتابع طريقك المعتاد. بنفس الطريقة تعمل بنى التحكم في الكود البرمجي، فهي تسمح للمبرمج بالتحكم في تدفق تنفيذ البرامج وفق حالات معينة، ومن أهم بنى التحكم البنى الشرطية if statement والبنى التكرارية loop statement. البنى الشرطية أما البنى الشرطية فتمكنك من اختبار شروط محددة قبل تنفيذ الكود البرمجي وتقوم بتنفيذه فقط عند تحقق هذه الشروط، مثلًا إذا كان لديك تعليمات برمجية تتضمن عملية قسمة، يمكنك اشتراط عدم تنفيذ هذه التعليمات عند محاولة القسمة على صفر. على سبيل المثال يقوم البرنامج التالي بلغة C++‎ بقسمة عددين عشريين ويختبر شرط القسمة على صفر: #include <iostream> using namespace std; int main() { float num1, num2, result; num1=18; num2=0; if (num2 == 0) { cout << "خطأ رياضي أنت تحاول القسمة على صفر"<<endl; } else { result=num1/num2; cout << "The result is "<< result << endl; } return 0; } تختبر التعليمة الشرطية if في الكود أعلاه إن كان المقسوم عليه num2 مساويًا للصفر (الذي يمكن أن يأتي من مواضع مختلفة مثل الطلب من المستخدم تزويدنا بقيمته)، وفي هذه الحالة تعرض العبارة "خطأ رياضي أنت تحاول القسمة على صفر" ولا تنفذ عملية القسمة num1/num2. الكود التالي كود مكافئ للكود السابق لكنه مكتوب بلغة بايثون: num1 = 18 num2 = 3 if num2 == 0: print("خطأ رياضي أنت تحاول القسمة على صفر") else: result = num1/num2 print(result) الأمثلة أعلاه كانت لشروط بسيطة، وستجد في لغات البرمجة أنواعًا عديدة من التعليمات الشرطية مثل if-else التي تمكنك من اختبار الشرط وعكسه، وتعليمة if المتداخلة التي تتضمن شرطًا فرعيًا داخل شرط رئيسي، وتعليمة switch التي تختبر شروط معتمدة على قيمة واحدة. كما ستتمكن من اختبار شروط مركبة من خلال المعاملات المنطقية مثل and و or و not. البنى التكرارية وأما البنى التكرارية أو حلقات التكرار فتمكنك من تكرار تنفيذ تعليمات معينة لعدد محدد أو مشروط من المرات، وتوفر على المبرمجين الكثير من الوقت في كتابة الكود. ستجد في أي لغة برمجة أنواعًا مختلفة من الحلقات مثل حلقات for التي تستخدم عندما تعرف عدد المرات التي تريد فيها تكرار التعليمات قبل التوقف، وحلقات while أو repeat التي تتشابه مع حلقات for لكنها تكرر مجموعة من التعليمات بعدد غير محدد من المرات يعتمد على استيفاء شرط معين. على سبيل المثال، إذا طلب منك أن تكتب برنامج لعرض ناتج ضرب العدد 5 بالأعداد من 1 إلى 10 فلا حاجة لأن تضرب العدد 5 في العدد 1 ثم في العدد 2 وهكذا وصولًا للعدد 10، يمكنك ببساطة كتابة حلقة تكرارية for كما في المثالين التاليين: حلقة for بلغة C++‎: int num=5; for (int i = 1; i < 11 ;i++) cout << num <<"X" << i << "="<< num*i << "\n"; حلقة for بلغة بايثون: num = 5 for i in range(1, 10): print(num, 'x', i, '=', num*i) الدوال الدوال Functions هي أجزاء مستقلة من الكود البرمجي لها اسم خاص بها وتشبه المصنع في عملها فتأخذ ممن يستخدمها دخلًا (إن وُجد) ثم تجري عمليات معالجة وتعيد إليه الناتج، ويدعى ما يُمرَّر إليها باسم المعاملات Parameters. تُكتب الدالة أو تعرّف مرة واحدة وتصبح بعدها قابلة لإعادة الاستخدام، حيث يمكن للمبرمج استدعاء أو مناداة الدالة في أي موضع في البرنامج مع تمرير قيم بيانات لها أو بدون، على سبيل المثال في حال أردت كتابة كود برمجي يعرض ناتج الضرب لعدد ما في الأعداد من 1 إلى 10 يمكنك تحويل الكود إلى دالة باسم displayMul وسيطها هو العدد المراد ضربه كما يلي: #include <iostream> using namespace std; // تعريف دالة لحساب نانج ضرب أي عدد في الأعداد من واحد لعشرة void displayMul(int num){ for (int i = 1; i < 11 ;i++) cout << num <<"X" << i << "="<< num*i << "\n"; } //استدعاء الدالة في البرنامج الرئيسي int main() { int num1 = 5; displayMul(num1); int num2 = 9; displayMul(num2); return 0; } عرفنا الدالة displayMul في المثال السابق بلغة C++‎ بكتابة نوع البيانات الذي تعيده الدالة وهو void أي لا شيء لأن الدالة تطبع القيمة ولا تعيد شيئًا، ثم اسمها ثم المعاملات الخاصة بها بين قوسين ()، ثم كتبنا التعليمات التي تقوم بها بين قوسين { }، ولاحظ أن الدالة لا تعيد شيئًا فلا يُشترط أن تأخذ أو تعيد شيئًا بل المهم أن تُنفِّذ عمليةً ما منوطة بها عند استدعائها. إليك أيضًا تعريف الدالة displayMul السابقة نفسها ولكن بلغة بايثون: def displayMul(num): for i in range(1, 10): print(num, 'x', i, '=', num*i) num = 5 displayMul(num) displayMul(9) ملاحظة: لا يمكنك استدعاء أو مناداة دالة في برنامجك إذا لم تقم بتعريفها أولًا، لأنك تحاول استخدام شيء غير موجود، لكن بعض الدوال تكون مضمنة ومعرفة مسبقًا في اللغة Built-in functions، ويمكنك استخدام هذه الدوال فورًا دون الحاجة لتعريفها بنفسك، على سبيل المثال الدالة "getline()‎"هي دالة جاهزة معرفة في لغة C++‎ تستخدم لإدخال السلاسل النصية من لوحة المفاتيح، والدالة print()‎ هي دالة جاهزة في لغة بايثون تستخدم لطباعة قيم المتغيرات على الشاشة. هياكل البيانات هياكل البيانات Data Structures هي بنى برمجية مصممة لتضم مجموعة من البيانات أو المتغيرات، وقد تكون هياكل أولية كالأعداد الصحيحة والأعداد العشرية والمحارف كما شرحنا في أنواع البيانات، أو هياكل مركبة يمكن تشبيهها بمجموعة صناديق متلاصقة في ذاكرة الحاسوب باستطاعتها تخزين عناصر أو متغيرات متعددة من نفس نوع البيانات ويمكن لبعض هياكل البيانات أن تتضمن مزيجًا من أنواع بيانات مختلفة. فالمصفوفة Array، والقاموس Dictionary والكائن Object وغيرها أحد أنواع هياكل البيانات الشهيرة، على سبيل المثال يمكنك استخدام المصفوفات عندما تحتاج إلى تخزين مجموعة مكونة من عدة قيم لها نفس النوع في متغير واحد بدلًا من تخزين كل قيمة في متغير منفصل، ويمكنك بعدها تحديد أي عنصر من العناصر الموجودة في المصفوفة والوصول له من خلال موقعه أو فهرسه داخل هذه المصفوفة، وإليك مثال على تعريف مصفوفة لتخزين 5 أعداد صحيحة: في لغة C++‎: int marks[5] = {50,99,78,66,59}; في لغة بايثون: marks=[50,99,78,66,59] ملاحظة: قد تختلف أسماء هياكل البيانات من لغة برمجة إلى أخرى ففي لغة بايثون لا يُطلق عليها اسم مصفوفة array كما في لغة C++‎ بل اسم قائمة list حيث تختلف التسميات والمعنى واحد. هنالك العديد من هياكل البيانات التي لا يتسع المقال الحالي لذكرها، لذا ارجع إلى مقال هياكل البيانات لمزيد من التفاصيل. التكرار يعتبر مفهوم التكرار Iteration أحد أهم مفاهيم أساسيات البرمجة، وستحتاج له لاسيما عند التعامل مع هياكل بيانات مركبة في شيفراتك البرمجية مثل المصفوفات، فالتكرار يعني المرور على كل عنصر من عناصر البيانات المركبة على حدة وعلى التوالي لتنفيذ عملية أو مهام محددة عليه، وستجد أن التكرار صفة أيضًا تُسمى iterable تُطلق على أي متغير أو نوع بيانات يمكن المرور عليه وستراها غالبًا في التوثيقات. يمكنك تنفيذ التكرار في لغات البرمجة بطرق مختلفة، لكنه يعتمد بشكل أساسي على استخدام الحلقات التكرارية بأنواعها المختلفة، كما توفر بعض اللغات مكررات Iterators وهي عبارة عن دوال أو عمليات مخصصة تمكنك من المرور على جميع عناصر هياكل البيانات بطريقة منهجية وسهلة. على سبيل المثال للمرور عبر عناصر المصفوفة marks التي عرفناها في الفقرة السابقة وطباعتها في لغة C++‎ يمكن أن نكتب حلقة for مع استخدام متغير i يمثل تعدادًا نستخدمه كفهرس للوصول إلى كل عنصر من عناصر المصفوفة كما يلي: #include <iostream> using namespace std; int main () { int marks[5] = {50,99,78,66,59}; cout << "The marks are:"; for (int i = 0; i < 5; ++i) { cout << marks[i] << " "; } } أما في لغة بايثون يمكنك المرور عبر عناصر المصفوفة وطباعتها كما يلي: marks=[50,99,78,66,59] for m in marks: print(m) التعاود يعتبر التعاود Recursion أحد المفاهيم البرمجية الأساسية، وهو يعتمد على تقسيم المشكلات البرمجية إلى مشكلات أصغر يمكن حلها بسهولة، ويرتبط هذا المفهوم بالدوال البرمجية، حيث أن الدالة التي تكرر استدعاء نفسها حتى تصل لحالة حدية أو أساسية Base case تجعلها تتوقف عن عملية استدعاء نفسها وتعيد نتيجة معروفة عند هذه القيمة تعرف باسم الدالة التعاودية Recursive Function، وإذا لم تكن هناك حالة حدية تصل لها الدالة فهذا يعني أن الدالة ستكرر استدعاء نفسها إلى مالا نهاية. هذا الأسلوب البرمجي يصلح لحل المسائل التي تملك نمطًا هرميًا والتي يمكن حلها بسهولة عن طريق تحويلها لمسائل فرعية مشابهة أصغر. لكن في حال كان بإمكانك حل مسألة معينة عن طريق الحلقات التكرارية بسهولة فلا توجد ضرورة لاستخدام أسلوب التعاود في هذه الحالة، ولا تقلق إن لم تفهم شيئًا فقد أضفنا مثالًا مع مخطط يوضح لك المفهوم تاليًا. على سبيل المثال مسألة حساب عاملي أو مضروب عدد ما "n!‎" هي أشهر مسألة تعاودية بطبيعتها، فكما تعرف مضروب العدد 0 هو قيمة معروفة تساوي 1، وبالتالي يمكن اعتبار n=0 هو الحالة الحدية التي يمكن من خلالها حل مسألة المضروب لأي عدد بناء على القاعدة التالية: n! = n * (n - 1) عندما تبلغ قيمة العدد n=0 فسوف يعيد القيمة 1 للدالة وينتهي الاستدعاء المتكرر أو التعاودي لها. إليك مثال على إيجاد مضروب أو عاملي العدد n: بلغة C++‎: #include <iostream> using namespace std; int factorial(int n) { if (n < 0) { return 0; } else if (n == 0) { return 1; } else { return factorial(n - 1) * n; } } // استدعاء الدالة في البرنامج الرئيسي int main() { cout<< factorial(4); } بلغة بايثون: def factorial(n): if n < 0: return 0 elif n == 1: return 1 else: return n * factorial(n-1) print (factorial(4)) المخطط التالي يوضح طريقة استدعاء الدالة التعاودية وإعادتها للقيمة عند وصولها للحالة الحدية لا تقلق مرة أخرى إن لم تفهمه فهو من المفاهيم المعقدة والمرعبة للمبرمجين المبتدئين، وستفهمه تدريجيًا ولا يمكن أن يتضح بالكامل إلا إن طبقته وحتى رسمته على ورقة أو مخطط كما المخطط السابق. الكائنات والأصناف تعتبر الكائنات Objects والأصناف Classes أحد أساسيات البرمجة كائنية التوجه "OOP" حيث أن الكائنات تعتبر وحدات تتضمن مجموعة من المتغيرات ومجموعة الدوال البرمجية. والصنف Class هو بمثابة نموذج أو مخطط عام لتمثيل الكائنات، يمكن تعريفه واستخدامه لاشتقاق العديد من الأمثلة أو الحالات المختلفة من هذه الكائنات، ولهذا السبب يسمى الكائن نسخة من الصنف "instance". لنأخذ مثالًا من الواقع، يمكنك تعريف صنف يسمى Car لتمثيل السيارة، سيكون لهذه السيارة خصائص مختلفة تميزها كاللون والنوع والطراز وسنة التصنيع والسعر …إلخ. كما سيكون لها أفعال أو سلوكيات تقوم بها كفعل التشغيل وزيادة السرعة وتغيير الاتجاه والتوقف …إلخ. لذا نعرف صنفًا خاصًا يمثل السيارة ونشتق منه نسخ لسيارات مختلفة. برمجيًا يعرف الصنف بداخله متغيرات ودوال، وتحدد المتغيرات الخاصة بالصنف مميزات هذا الصنف بينما تحدد دوال الصنف "class functions" ما الذي يمكن للكائنات القيام به كما يحوي الصنف على دوال خاصة منها دالة تُدعى الدالة البانية "constructor" التي تُستدعى تلقائيًا عند إنشاء واستنساخ كائن من الصنف المُعرَّف ويمكن عبرها تمرير قيم تضبط الكائن الجديد الناتج مثلًا تضبط متغيراته وإليك مثال لتوضيح ذلك. على سبيل المثال، يمكن تعريف صنف يمثل هيكل دائرة، سنعرف لهذا الصنف متغير خاص به أو خاصية تمثل قيمة نصف قطر الدائرة، ودالة بناء تضبط قيمة نصف القطر أثناء إنشاء كل دائرة، ودالة لحساب مساحة الدائرة، ودالة أخرى لحساب محيط الدائرة يمكن استدعاءهما بعد إنشاء كل كائن من الصنف دائرة. المثال التالي يعرف صنف يمثل دائرة بلغة البرمجة C++‎ ويشتق نسختين أو كائنين مختلفين من هذا الصنف لكل كائن نصف قطر مختلف: #include<iostream> using namespace std; class Circle { const float PI = 3.14; // data members float radius; public: // contractor Circle(float radius) { this->radius = radius; } // member function float Area() { return radius*radius*PI; } float Perimeter() { return 2*radius*PI; } }; int main() { Circle circle1(3); cout << circle1.Area() << endl; cout << circle1.Perimeter() << endl; Circle circle2(4); cout << circle2.Area() << endl; cout << circle2.Perimeter() << endl; return 0; } والمثال المكافئ التالي بلغة بايثون يعرف صنف دائرة ويشتق كائنين منه: #تعريف صنف يمثل دائرة class Circle(): def __init__(self, radius): self.radius = radius def get_area(self): return (self.radius ** 2) * pi def get_perimeter(self): return self.radius * 2 * pi # إنشاء كائنات من الصنف Circle pi = 3.14 circle1 = Circle(3) print(circle1.get_area()) print(circle1.get_perimeter()) circle2 = Circle(4) print(circle2.get_area()) print(circle2.get_perimeter()) لا تقلق إن لم تفهم شيئًا مما سبق فمهوم الأصناف والكائنات مفهوم دسم معقد على المبتدئين، ولكن حاول إعادة قراءة الفقرة وتطبيق الأمثلة أو يمكنك تخطيه ببساطة فالمهم أنك تعرفت على المفهوم، أما إن أردت المزيد من التفاصيل، فارجع إلى مقال البرمجة كائنية التوجه من سلسلة تعلم البرمجة. الوحدات والمكتبات لعلك لاحظت عبارات تبدأ بالكلمة using أو include أو import في الأمثلة البرمجية السابقة وتساءلت عن أهمية وجودها! هذه العبارات ليست سوى أمثلة على استخدام وحدات ومكتبات جاهزة مختلفة في لغات البرمجة. تعتبر الوحدات Modules والمكتبات Libraries أحد مفاهيم أساسيات البرمجة التي من الضروري أن تعيها جيدًا، والهدف الأساسي من وجودها تسهيل كتابة التعليمات البرمجية وتمكين المبرمج من إعادة استخدامها دون الحاجة إلى كتابة التعليمات البرمجية الخاصة بها في الكود من جديد. فالمكتبات والوحدات توفر على المبرمجين إعادة اختراع العجلة وتمكنهم من التركيز على حل المشكلة بسهولة ومرونة أكبر. توفر كل لغة برمجة العديد من المكتبات التي تضم مجموعة من الدوال والأصناف والوحدات التي يمكنك استخدامها مرارًا وتكرارًا في التعليمات البرمجية الخاصة بك لأداء مجموعة من الوظائف المفيدة دون الحاجة لإنشائها من البداية، كما يمكنك تعريف الوحدات الخاصة بك. هناك العديد من الوحدات المضمنة في لغة بايثون مثلًا والتي يمكنك استيرادها بكتابة التعليمة import ولنضرب مثلًا باستيراد الوحدة math للاستفادة من الدوال الرياضية التي توفرها بالشكل التالي: import math print (math.sqrt(25)) print (math.pi) print (math.degrees(2)) print (math.radians(90)) print (math.sin(2)) print (math.cos(0.5)) إلى هنا نكون قد انتهينا من شرح أساسيات البرمجة للمبتدئين والتي تناولنا فيها أهم المفاهيم التي ستتعرف عليها بالتفصيل في أي لغة برمجية تنوي تعلمها قبل أن تتمكن من تطوير برامجك وتطبيقاتك بهذه اللغة. ونختم مقالنا بأهم النصائح والتوصيات التي تساعدك على تعلم هذه الأساسيات. 10 نصائح لتعلم أساسيات البرمجة إليك مجموعة نصائح سريعة تساعدك في رحلة تعلم البرمجة: حدد هدفك من تعلم البرمجة، ثم تعلم ما يلزمك من تقنيات لتحققه. لا تشتت نفسك بكثرة اللغات والتنقل بينها وركز على المفاهيم وطبقها بلغة واحدة بإتقان وتركيز. ضع خطة للتعلم والتزم بها دون تسويف. لا تضيع وقتك في البحث عن أفضل المصادر التعليمية والتنقل بينها بل اختر واحدًا فقط والتزم به للنهاية. طور مهارات البحث الفعال فهذا سيوفر عليك وقتًا كبيرًا ويساعدك في إيجاد حلول لمشاكلك البرمجية. رافق المجدين ومن يشاركونك الهدف والاهتمام نفسه فإن الصاحب ساحب كما يُقال. لا تتوقف عن التعلم وطور نفسك باستمرار. تحلَّ بالصبر والأناة فإن العلم بالتعلّم والحلم بالتحلّم. تقبل الفشل والخطأ فالفشل هو وسيلة للنجاح. طبق ثم طبق ثم طبق ما تتعلمه. الخلاصة تطرقنا في مقال اليوم لشرح أساسيات البرمجة للمبتدئين وتعرفنا على أهم المفاهيم البرمجية التي ستصادفك عند تعلم أي لغة من لغات البرمجة وذكرنا في الختام أهم الأسس والنصائح التي تساعد أي مبرمج لتعلم أساسيات البرمجة من الصفر حتى الاحتراف. قد لا تتمكن من هضم جميع المفاهيم مرة واحدة خصوصًا إن كنت مبتدئًا، لذا ارجع للمقال مرة ومرتين حتى تتأكد من استيعابك لتلك المفاهيم وضعه ضمن قائمتك المفضلة وطبق الأمثلة بلغة البرمجة التي تتعلمها أو تريد تعلمها. وإذا كان لديك أي تساؤلات حول أي شيء مر معك في المقال أو كنت قد بدأت فعلا بتعلم إحدى لغات البرمجة ولديك نصائح مفيدة تود أن توجهها للمبتدئين في تعلم البرمجة، نرحب بأن تشاركنا بها في التعليقات أسفل المقال. اقرأ أيضًا أسهل لغات البرمجة البرمجة كائنية التوجه دليلك الشامل إلى: برمجة التطبيقات فوائد تعلم البرمجة
    2 نقاط
  24. لكل مهنة قواعد تنظمها وتضمن إنجاز الأعمال فيها بأفضل صورة ممكنة، ومهنة البرمجة ليست استثناء! حيث تعد قواعد البرمجة من الأمور التي ينبغي على أي مبرمج تعلمها، والحرص على اتباعها عند تطوير البرامج والتطبيقات المختلفة. نضعك في مقال اليوم على بداية الطريق، ونعرفك على أهم قواعد البرمجة، ونوضح لك أهمية استخدامها وكيف يمكنك تحقيقها، وبالتدريب والممارسة ستتمكن من اتباعها عندما تطور برامجك وتطبيقاتك. ما هي قواعد البرمجة؟ قواعد البرمجة هي مجموعة من التوصيات والإرشادات التي ينبغي للمبرمجين اتباعها والالتزام بها عند استخدام أي لغة من لغات البرمجة للحصول على كود برمجي عالي الجودة وسهل الصيانة. يضمن لك تطبيق قواعد البرمجة إنتاج برامج مفهومة وواضحة وسهلة القراءة والتعديل، وهو أمر مهم لأي مبرمج لاسيما عندما يعمل ضمن فريق عمل ويتشارك مع عدة مبرمجين أو مطورين على تطوير نفس المشروع. لاشك أن تطبيق قواعد البرمجة ليس بالأمر السهل ولن يتحقق بسرعة، فتطبيق القواعد يأتي في مرحلة لاحقة، فبعد أن تتمكن من أساسيات البرمجة، وتتدرب على طريقة التفكير البرمجي، وحل المشكلات، عليك أن تتقدم خطوة للأمام وتتعلم كيف تحسن من برامجك من خلال تطبيق القواعد البرمجية عليها. سنعرض الآن عددًا من أهم قواعد البرمجة فكن جاهزًا! أهم قواعد البرمجة إليك أهم ثمان قواعد أساسية ينبغي عليك اتباعها لتبرمج كالمحترفين: اتبع القواعد العرفية للغة التي تبرمج بها وثق الكود الذي تكتبه حافظ على البساطة KISS لا تكرر نفسك DRY ادمج الأجزاء الصغيرة لإنجاز الأعمال الكبيرة لا تبرمج ما لا تحتاجه افصل الأكواد في أجزاء مستقلة اكتب أكوادًا نظيفة نشرح في الفقرات التالية كل قاعدة من قواعد البرمجة هذه بمزيد من التفصيل ونوضح أهميتها وكيفية تطبيقها عند تطوير البرامج والتطبيقات. اتبع القواعد العرفية للغة التي تبرمج بها لكل لغة من لغات البرمجة قواعد كتابة خاصة بها تعرف باسم صياغة، واتباع هذه القواعد عند كتابة الكود البرمجي ليس خيارًا للمبرمج، لأن الكود البرمجي لن يعمل بشكل صحيح إذا لم يكن مكتوبًا وفق هذه القواعد. فليس المقصود هنا صياغة اللغة وقواعدها، ولكن ما أقصده هو مراعاة اصطلاحات اللغة المتعارف عليها أو ما يسمى في أوساط المبرمجين باسم "العرف" Conventions، فلكل لغة قواعد اصطلاحية متعارف عليها بين مبرمجي تلك اللغة، مثل ضرورة كتابة كل تعليمة على سطر جديد، ومراعاة قواعد التباعد، وأماكن وضع الأقواس مثل () و {} ضمن البرنامج، ووضع المسافات البادئة في كل سطر، وقواعد تسمية المتغيرات والدوال والأصناف …إلخ. هذه الأمور تتغير من لغة إلى لغة وليس لها معيار موحد، لذا عليك التعرف على اصطلاحات اللغة التي تبرمج بها وتحرص على اتباعها، فإن انتقلنا مثلًا إلى لغة جافاسكربت، فيعرض مقال نمط كتابة شيفرة جافاسكربت هذا الموضوع بالتفصيل ويتحدث عن العرف المتبع بين مبرمجي لغة جافاسكربت كما يشير أخيرًا في فقرة "شروحات لأنماط كتابة الشيفرة" أشهر المعايير والأعراف العالمية للغة جافاسكربت منها أسلوب Google وأسلوب Airbnb والأسلوب المعياري الرسمي وغيرها، فلا حاجة لكل فريق أي يخترع عرفًا ومعيارًا يسير عليه بل يقتدي بعرف شهير شائع منظم موجود مسبقًا. أضرب مثلًا عن أسلوب Airbnb في تعريف المتغيرات في لغة جافاسكربت بالشكل التالي: // سيء const items = getItems(), goSportsTeam = true; // جيد const items = getItems(); const goSportsTeam = true; لاحظ أن تعريف متغير واحد في كل سطر هو الأسلوب المتبع ويجب تجنب تعريف عدة متغيرات في سطر واحد رغم أنه لا فرق في التنفيذ بينهما. أتريد مثلًا آخر؟ خذ هذا المثال أيضًا من أسلوب PEP8 في لغة بايثون: # Line Break with Binary Operator # سيء income = (gross_wages + taxable_interest - student_loan_interest) # جيد income = (gross_wages + taxable_interest - student_loan_interest) # Imports # سيء import sys, os # جيد import os import sys قد تجد أن الاختلاف بسيط أحيانًا بين العُرف الجيد المتبع وبين الأسلوب السيء في كتابة الشيفرة وهذا صحيح، ولكن تذكر أن الشيفرة لا تُكتب مرة واحدة فقط ولن يعمل عليها شخص واحد فقط، بل ستُعدل مرارًا وتكرارًا ويمر عليها عشرات المبرمجين فإن اتبع كل مبرمج أسلوبه الخاص فُقد التنظيم وسادت العشوائية وأصبحت الشيفرة عرضة للخطأ عند تعديلها. وتذكر دومًا أن العُرف هذا يضعه مبرمجون أصحاب خبرة بعشرات السنوات يحاولون به نقل خبرتهم أفضل طريقة لكتابة شيفرة متسقة سهلة القراءة والتعديل وأقل عرضة للأخطاء. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن وثق الكود الذي تكتبه هذه القاعدة على بساطتها مفيدة للغاية، فمن الضروري أن تعتاد على كتابة تعليقات توضيحية في الأكواد التي تكتبها لتوثيق عملك، وتشرح ما الذي تقوم به، وتوضح وظائف الدوال والأصناف والمكتبات المختلفة. التعليقات أمر مهم لكل مبرمج، فهي من جهة تساعده على فهم ما كتبه عند العودة له لاحقًا لأن المبرمج سينسى الكثير مما كتبته ولماذا كتبته بعد مرور فترة من الزمن، كما أن التعليقات تفيد أي مبرمج آخر يقرأ الكود في فهمه بسرعة في حال احتاج إلى تطويره أو التعديل عليه. ومن الضروري أن تتعلم أفضل ممارسات كتابة التعليقات على الكود الخاص بك، وتعرف متى وأين يتوجب عليك كتابة التعليقات ومتى لا يلزمك ذلك. اكتب التعليقات عندما تحتاج لوصف أي ميزة غير واضحة في التعليمات البرمجية، وفي أي موضع ترى أنه يتطلب المزيد من الشرح والتوضيح للآخرين، أما عندما يكون الهدف من الكود واضحًا ومفهومًا فيمكنك الاستغناء عن كتابتها. باختصار التعليقات تساعد المبرمجين على فهم المشكلات التي كنت تحاول حلها في تعليماتك البرمجية دون الحاجة لبذل كثير من الجهد لفهم واستنباط ما كتبته ولكن الأفضل من كتابة التعليقات أن تكتب شيفرة مفهومة بدون تعليقات وهذه هي القاعدة دومًا. حافظ على البساطة KISS قاعدة KISS هي اختصار لعبارة "Keep It Simple, Sweetie" التي تعني أبقها بسيطة يا عزيزي! أو أبقِ أكوادك بسيطة ومباشرة، وهذه القاعدة تطبق عند تصميم كافة الأنظمة البرمجية فقد تبين أن هذه الأنظمة تعمل بشكل أفضل إذا كانت بسيطة وخالية من التعقيد. فإذا كنت تستطيع أن تحل مشكلة ما بعشرة أسطر من الكود البرمجي لا داعي لأن تكتب خمسين سطرًا لحلها، وإذا كنت تحتاج لبرمجة نموذج ما يحتوي 10 حقول، فلا تضع فيه 20 حقلًا من البيانات التي لن تقدم أي فائدة في سير عمل برنامجك. الخلاصة، إذا كنت تطور أحد البرامج وكنت تستطيع تجنب التعقيد في كتابة الكود، فتجنبه قدر الإمكان، واحرص على إبقاء الأكواد البرمجية التي تكتبها فيه بسيطة، وتلبي المتطلبات قدر المستطاع. لا تكرر نفسك DRY من قواعد البرمجة الهامة قاعدة DRY وهي اختصار للعبارة "Don't Repeat Yourself" التي تعني لا تكرر نفسك، والتي تؤكد على المبرمج أن لا يكرر كتابة نفس الكود البرمجي مرارًا وتكرارًا، وينبغي عليه عند وجود هذه الحالة أن يتخلص من هذا التكرار بطريقة ما. لا مشكلة من تكرار نفس الكود مرة واحدة، ولكن عندما تستخدم نفس الكود عدة مرات في مواضع مختلفة من برنامجك فعليك أن تفكر في تعديله، وتجد طريقة ذكية لكتابة الكود مرة واحدة وإعادة استخدامه كلما احتجت له لتكون مطبقًا لهذه القاعدة. من المنهجيات البرمجية التي تساعدك على تقليل الكود البرمجي المكرر وجعل برامجك سهلة القراءة والصيانة هي استخدام الحلقات التكرارية التي تجنبك تكرار نفس التعليمات البرمجية وتجعل الكود البرمجي أقصر، وأيضًا استخدام الدوال والإجراءات البرمجية، وتعريف المكتبات والوحدات البرمجية التي تغلف شيفراتك البرمجية وتمكنك من إعادة استعمالها كلما أردت. ستدرك أهمية هذه القاعدة البرمجية إذا احتجت لإجراء تعديل ما في هذا الكود البرمجي المكرر، أو اكتشفت فيه خطأً ما وأردت تصحيحه، عندها سيتوجب عليك إجراء التعديلات في جميع الأماكن التي قمت فيها بإدراج هذا الكود وسيكون الأمر مرهقًا وغالبًا ستنسى ما قد كتبته حقًا، و قد لا تعدله أنت بل يعدله مبرمج آخر قد لا يفطن للتكرار مما يولد أخطاء مستقبلية. وبالتالي عندما تطور برنامجًا لحل مشكلة ما، وتجد أنك تقوم بالكثير من عمليات النسخ واللصق لنفس الكود لاستخدامه في أكثر من موضع، فابحث عن طريقة أخرى لكتابة هذا الكود، وفكر كيف يمكن أن تتجنب تكرار نفسك. ادمج الأجزاء الصغيرة لإنجاز أعمال أكبر يعتبر الدمج Composition من قواعد البرمجة المهمة، وهو يعني تجزئة المسائل البرمجية إلى مجموعة عناصر أصغر، كل جزء يقوم بمهمة محددة وواضحة، بعدها يتم دمج هذه الأجزاء لتشكيل جزء أكبر وأكثر تعقيدًا ينجز العمل بأكمله. يمكنك على سبيل المثال تطبيق هذه القاعدة إذا كنت مطور واجهة أمامية وتريد تطوير واجهة تطبيق ما وكتابة الكود البرمجي اللازم لتحقيق تصميم معين، حيث يمكنك تحويل كل عنصر من عناصر التصميم إلى مكون مستقل له الكود الخاص به، ثم تجمع هذه المكونات مع بعضها في النهاية لتحصل على التصميم الكامل. كما يتم تطبيق هذا المبدأ بشكل واضح في البرمجة كائنية التوجه OOP، من خلال تعريف صنف Class مستقل لكل جزء أو سلوك محدد من نظامك البرمجي، وجعل هذه الأصناف تتعاون مع بعضها لتنجز العمل المطلوب. باتباع هذه القاعدة ستوفر على نفسك كتابة أكواد ضخمة ومعقدة وصعبة الفهم. وتركز على برمجة كل مكون ليقوم بشيء واحد فقط، وإذا احتجت لتعديل جزء ما في برامجك فستعدل فقط الأجزاء التي طرأ عليها التعديل بكل سلاسة. فإذا كانت لديك شيفرة برمجية ضخمة لمكون ما في أحد برامجك تنجز عدة أمور مختلفة في نفس الوقت، فكر إن كان بالإمكان تقسيمها لأجزاء منفصلة أكثر تحديدًا. لا تبرمج ما لا تحتاجه من أهم قواعد البرمجة التي عليك اتباعها قاعدة YAGNI وهي اختصار للعبارة "You Aren't Gonna Need It" التي تعني أنت لن تحتاجها! لذا لا تقم ببرمجتها. فلا ينبغي عليك أن تكتب في برامجك أي أكواد لإنجاز مهام أو وظائف معينة تحل من خلالها مشكلة غير موجودة بالأساس، أو تضيف ميزة لا تحتاجها الآن لكنك تتوقع أنك ستحتاجها في مرحلة لاحقة. فإذا طلب منك على سبيل المثال كتابة كود برمجي يتحقق من صحة البريد الإلكتروني وكلمة المرور عند تسجيل دخول المستخدمين، فلا داعي لأن تتحقق أيضًا من صحة اسم المستخدم ورقم هاتفه لأنك قد لا تحتاج لهذا أبدًا. باختصار، كي تطبق هذه القاعدة ركز فقط على كتابة القدر المطلوب من الكود البرمجي الذي يحقق متطلباتك الحالية بالضبط بلا زيادة ولا نقصان، ولا داعي لأن تستشرف المستقبل. افصل الأكواد في أجزاء مستقلة يطلق على هذه القاعدة اسم فصل الاهتمامات "Separation of Interests" وهي من قواعد البرمجة الضرورية، وتؤكد على أهمية تصميم البرنامج ضمن وحدات أو أجزاء فريدة معزولة عن بعضها البعض. يعتبر أسلوب نموذج وعرض ومتحكم MVC من أوضح الأمثلة على تطبيق هذه القاعدة، ففي هذا النموذج يتم تنظيم كود البرامج ضمن ثلاثة أجزاء هي: النموذج Model الذي يتفاعل مع البيانات ويجلبها من قاعدة البيانات، والعرض View الذي يمثل الواجهة المرئية التي يتفاعل معها المستخدم بشكل مباشر، والمتحكم Controller الذي يمثل الوسيط بين العرض والنموذج ويربط بينهما. فالمتحكم يتلقى طلبات المستخدم من العرض أو واجهة المستخدم، ويعالجها، ثم يتصل بالنموذج ويطلب منه جلب ما يريده المستخدم من قاعدة البيانات، ثم يعيد النتيجة مرة أخرى إلى العرض ويظهرها على واجهة المستخدم. عند كتابة برامجك بهذا الأسلوب لن يحتاج الكود البرمجي الذي يتعامل مع قاعدة البيانات إلى معرفة تفاصبل عمل كود عرض البيانات، فكود العرض يحصل على المدخلات من المستخدم، وكود المتحكم يعالج هذه البيانات، وبهذا يكون كل جزء من الكود مستقلًا تمامًا. إن اتباع هذه القاعدة في البرمجة يمكنك من الحصول على كود برمجي سهل التطوير والصيانة، فإذا احتجت على سبيل المثال إلى إعادة كتابة كود العرض، فيمكنك القيام بذلك أن يتأثر أي شيء في كود حفظ ومعالجة البيانات. هذا الأسلوب يستخدم في العديد لغات البرمجة وأطر العمل، فمن لغات البرمجة التي تستخدم نموذج MVC لغة C++‎ و‎C# ‎ و Java و Ruby …إلخ. ومن أطر العمل التي تستخدم نموذج MVC إطار العمل أنجولر Angular وجانغو Django وفلاسك Flask ولارافيل Laravel …إلخ.‏‏‏‏‏ اكتب أكوادًا نظيفة تعد قاعدة كتابة الأكواد البرمجية النظيفة والمفهومة وسهلة الصيانة مهارة ضرورية على كل مبرمج إتقانها، ويشير مصطلح الكود النظيف Clean Code ببساطة إلى الكود سهل القراءة والفهم من قبل المبرمجين الآخرين، وعادةً عندما تتبع كافة قواعد البرمجة التي وردت أعلاه ستحصل بالنتيجة على كود نظيف بصورة تلقائية. احرص كذلك على تنظيف أكوادك من كافة التعليمات لن تستخدم عند تنفيذ البرنامج، واحذف المتغيرات التي صرحت عنها لكنك لم تستخدمها، والدوال البرمجية التي عرفتها لكنها لم تنادها على الإطلاق، والأصناف التي لم تشتق منها أي كائنات برمجية، وكذلك الأكواد التي كتبتها ثم حولتها إلى تعليقات ضمن الكود لإبطال عملها …إلخ. فهذه كلها أكواد ميّتة وأنت لا تريد أن تجعل برنامجك مقبرة! وكي تعرف بسهولة إن كان الكود الذي تكتبه نظيفًا، اعرضه على مبرمج آخر لم يسبق له أن اطلع عليه واطلب منه تعديل أمر ما فيه، فإذا تمكن المبرمج من فهم الغرض من التعليمات البرمجية الخاصة بك، وعدلها وأضاف أكواده الخاصة عليها بسهولة ومرونة، فهذا يعني أن كتبت بالفعل كودًا نظيفًا. وتذكر أن كتابة الكود النظيف ليس مهارة يمكن اكتسابها بين عشيّة وضحاها بل هو ميزة يتم تطويرها بالممارسة والتدرب على تطبيق كافة هذه القواعد كلما قمت بكتابة كود برمجي ما حتى تكتسب الخبرة المطلوبة. ملخص لأهم قواعد البرمجة التي ينبغي للمبرمج اتباعها نعرض ما يلي ملخص قواعد البرمجة التي ذكرناها ليسهل عليك تذكرها وحفظها: احرص على كتابة كود سهل القراءة والفهم مع إضافة التعليقات التوضيحية إن لزم فهي ضرورية لتوثيق وتسهيل فهم الكود وصيانته عند العودة له لاحقًا. اكتب أكوادًا بسيطة ومباشرة والمقصود هنا أن تصمم برامجك ببساطة، وتحذف أي ميزة لا تحتاجها، فالأنظمة البرمجية تعمل بشكل أفضل وتكون أسهل في الصيانة كلما كانت أبسط. افصل الأكواد في أجزاء معزولة بحيث يكون كل جزء مسؤولًا على إنجاز مهمة محددة. لا تكرر نفسك ولا تنسخ وتلصق نفس الكود في أكثر من موضع، بل اكتبه مرة وأعد استخدامه كلما دعت الحاجة. لا تضف ما لن تحتاجه كي لا تهدر وقتك ومالك على أشياء لمجرد أنك تتوقع أنك ستحتاجها لاحقًا، فقد لا تحتاجها أبدًا. اكتب كودًا نظيفًا غير مكرر أو معقد، وهو ما ستحصل عليه إذا اتبعت كل القواعد السابقة. ماذا سيحصل لو لم أتبع قواعد البرمجة؟ عندما تبدأ تعلم البرمجة ستكون سعيدًا عندما يعمل أي برنامج بالشكل الصحيح، وقد لا تعير اهتمامًا لمدى أهمية اتباع قواعد البرمجة، لكن يجب أن تضع في الحسبان أنك إذا لم تعتد على اتباع القواعد الصحيحة في كتابة أكوادك البرمجية، فإن هذا سينعكس سلبًا على أداء برامجك على المدى البعيد. في تلك الحالة قد تحصل على كود سيء وفوضوي وغير مفهوم، وصحيح أن برنامجك يعمل، لكنه سيكون مكتظَا بالأكواد البرمجية المكررة، أو الوظائف غير المستخدمة، أو المتغيرات التي لا فائدة من وجودها، وبرنامج كهذا قد يتعطل أو يفشل بعد أول تعديل أو تطوير مطلوب. فتعلم هذه القواعد وتطبيقها من شأنه أن يحسِّن من خبرتك ويطور أسلوب كتابة شيفراتك البرمجية، وأغلب أصحاب الأعمال سيطلعون على عينة من كود كتبته سابقًا وسيفضلون مبرمجًا محترفًا يتبع هذه القواعد عمن لا يتبعها. وتذكر أن البرمجة لا تقتصر على كتابة تعليمات برمجية تعمل فحسب، بل هي كتابة تعليمات برمجية فعالة ذات جودة عالية ويمكن صيانتها وتعديلها بكل مرونة سواء من قبلك أو من قبل أي مبرمج آخر، لذا احرص على اتباع هذه القواعد البرمجية والتدرب على تطبيقها قدر المستطاع لأنها سبيلك لتكون مبرمجًا ناجحًا ومتميزًا. ماذا بعد تعلم قواعد البرمجة؟ بعد أن تتقن أساسيات البرمجة وتتعلم تطبيق قواعد البرمجة قد تتساءل: كيف يمكنني المضي قدمًا وتطوير مهاراتي البرمجية بصورة أكبر؟ سؤال جيد، سأجيبك! من الأمور التي ينبغي عليك تعلمها في رحلتك لاحتراف البرمجة مهارات إعادة التصميم لمشاريعك الحالية، والتعرف على مفهوم أنماط التصميم وتطبيقها لحل المشكلات التقنية التي تواجهك مستقبلًا. يشير مفهوم إعادة التصميم "Refactoring" إلى الخطوات التي ينبغي للمبرمج اتباعها لتعديل الشيفرات البرمجية وإعادة هيكلتها وتحسينها والعثور على أي أخطاء أو ثغرات كامنة فيها، مع المحافظة على وظائفها الأساسية. أما أنماط التصميم "Design Patterns"، فهي عبارة عن نماذج يضعها المطورون لحل المشكلات المتكررة والمتشابهة، وستكتسب من خلال تعلمها القدرة على إعادة استخدام نفس الأنماط في كل مرة تظهر فيها نفس المشكلة، ويمكنك اعتبارها بمثابة فكرة مجردة توضح طريقة حل المشكلة وتسهل عليك تحقيقها برمجيًا. الخلاصة تعرفنا في مقال اليوم على أهم قواعد البرمجة التي على المبرمج اتباعها، فلا ينبغي أن تتعلم أساسيات البرمجة فقط، بل عليك أن تتقدم خطوة للأمام وتحرص على اتباع أفضل الممارسات البرمجية عند كتابة الكود كي يكون المنتج الرقمي الذي تنشؤه أكثر كفاءة وموثوقية واحترافية. وتذكر أنه يمكن للجميع كتابة كود برمجي يفهمه الحاسوب لكن القليلين فقط يمكنهم كتابة كود جيد يفهمه الإنسان أيضًا، ومن خلال حرصك على اتباع قواعد البرمجة التي شرحناها تضمن أن تكون من هذه الفئة القليلة من المبرمجين المحترفين، كل ما تحتاجه هو التدريب الجيد على كتابة الأكواد والبرامج بصورة محسنة تراعي هذه القواعد بأفضل طريقة. اقرأ أيضًا تعلم تطوير الويب دليلك الشامل إلى لغات البرمجة أسهل لغات البرمجة ما هي فوائد تعلم البرمجة؟
    2 نقاط
  25. سنتحدث في هذا المقال عن مفهوم العلاقات بين جداول قاعدة البيانات، وما أنواع هذه العلاقات وكيف تتمثل وما هو أثرها على العمل. ما هي العلاقات بين الجداول عند إنشاء جداول في قاعدة البيانات، فإن الظاهر لنا أننا نقوم ببناء جداول منفصلة وغير مترابطة، ولكننا في الواقع العملي نحتاج لربط هذه الكيانات المنفصلة بحيث تُبنَى علاقات تحكم البيانات الموجودة في هذه الجداول، وتحكم طريقة التعامل مع هذه البيانات. تنشَأ العلاقة بين جدوليْن عندما يُربط عمودان فيهما مع بعضهما عن طريق وجود قيود مطبقة على العمودين، بحيث يكون قيد المفتاح الرئيسي على عمود في الجدول “الأب” وقيد المفتاح الأجنبي على العمود في الجدول “الابن”، وعادة يكون اسم العمودين واحدًا في كلا الجدولين. مثلا، لحفظ عناوين الأشخاص نستطيع إنشاء جدول باسم Address ونربطه بجدول الأشخاص Persons بعلاقة تحكم البيانات الموجودة في الجدولين، بحيث يكون لكل شخص في الجدول Persons عنوان واحد مرتبط به في الجدول Address. يُربَط الجدولان عن طريق عمود باسم Person_Id في كلا الجدولين. مثال آخر، لو أردنا أن نتابع عملية استعارة الكتب في مكتبة، فإننا سننشئ جدولًا باسم Borrowed_Books (كُتُب مُعارة) ونربطها بالجدول Persons عن طريق العمود Person_Id. يستطيع الشخص الواحد - في هذا النوع من الربط - أن يستعير أكثر من كتاب. في هذا المثال، لو أننا حفظنا بيانات الأشخاص والكتب المستعارة في جدول واحد، ستظهر لنا مشكلة تكرار البيانات Data Redundancy لأننا سنكرّر بيانات الشخص لكل كتاب يستعيره. ماذا نستفيد من بناء العلاقات بين الجداول؟ التخلص من مشكلة تكرار البيانات عن طريق فصلها وحفظها في أكثر من جدول، فمشكلة تكرار البيانات هي عدو مستخدمي قواعد البيانات ومسؤوليها، لأنها تتسبب بزيادة حجم قاعدة البيانات بقدر كبير وبسرعة، وترفع السرعات المطلوبة لتنفيذ الاستعلامات، وتجعل من موضوع صيانة قاعدة البيانات كابوسا مقلقا. الحفاظ على دقة وسلامة البيانات في قاعدة البيانات، فمع وجود العلاقات بين الجداول، سوف تضمن مثلا عدم وجود كتاب مُعار ليس له شخص استعاره، أو عنوان وهمي ليس له صاحب، وقس على ذلك العديد من الأمثلة. استخراج البيانات من أكثر من جدول بكفاءة وسرعة عن طريق بناء جمل ربط استعلامية تطلب المعلومات من أعمدة مختلفة في جداول مختلفة، وإخراج النتيجة بطريقة مفيدة ومرتبة. أنواع العلاقات توجد أربعة أنواع من العلاقات بين الجداول كالتالي: علاقة واحد إلى واحد (One-to-One). علاقة واحد إلى كثير أو علاقة كثير إلى واحد (One-to-Many / Many-to-One). علاقة كثير إلى كثير (Many-to-Many). علاقة المرجعية الذاتية (Self Referencing). علاقة واحد إلى واحد لنفترض أن الجدول Persons لديه البنية والبيانات التالية: Person_ID First_Name Last_Name Age Address 101 Ibrahim Mohammed 31 12 Main St, Doha 102 Mohammed Khaled 25 Gaza, Middle Center نستطيع أن نضع بيانات العنوان في جدول منفصل ونسميه Address وتكون بنية الجدوليْن كالتالي. الجدول Persons: Person_ID First_Name Last_Name Age Address_Id 101 Ibrahim Mohammed 31 1 102 Mohammed Khaled 25 2 الجدول Address: Address_ID Address 1 12 Main St, Doha 2 Gaza, Middle Center لاحظ أنه أصبح لدينا عمود بنفس الاسم Address_Id في كلا الجدولين. لبناء العلاقة بين الجدولين، طبّقنا قيد المفتاح الأجنبي على العمود Address_Id في الجدول Persons بحيث يأخذ قيمه من العمود Address_Id في الجدول Address والمطبق عليه قيد المفتاح الرئيسي. أصبحت لدينا الآن علاقة بين الجدولين، وفي حال كان كل عنوان في الجدول Address يقترن فقط بشخص واحد في الجدول Persons فعندها نسمي هذه العلاقة واحدًا إلى واحد. يجب التنويه إلى أن هذا النوع من العلاقات غير مستخدم كثيرا، فالجدول الأول الذي يحتوي العنوان وبيانات الشخص يفي بالغرض في أغلب الأحيان. نستطيع تمثيل العلاقة بالشكل التالي: لاحظ أن وجود العلاقة اختياري، فمن الممكن أن يكون لدينا سجل في الجدول Persons دون عنوان له في الجدول Address وهذا مرتبط بعدم تطبيق قيد القيمة غير الفارغة على العمود Address_Id. في حال طُبِّق قيد غير القيمة غير الفارغة على العمود، فهنا تصبح العلاقة واجبة بين الجدولين، ولا يمكن أن نُنْشئ سجلًّا في الجدول Persons إلا بإدخال قيمة موجودة للعمود Address_Id وهو في مثالنا هذا غير منقطي نوعا ما. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن علاقة واحد إلى كثير أو علاقة كثير إلى واحد هذا النوع من العلاقات هو الشائع بين أنواع العلاقات بين الجداول في قاعدة البيانات، لوجود تطبيقات كثيرة عليه، فمثلا: الطالب (واحد) يستطيع أن يدرس أكثر من مساق (كثير). الطبيب يعالج ويتابع حالة مريض واحد أو أكثر. طلبية الشراء تحتوي على أكثر من عنصر. الشخص يستعير أكثر من كتاب. وقس على ذلك العديد من الأمثلة. لنفترض وجود جدول للزبناء Customers بالهيكلية التالية: Customer_ID Customer_Name 1 Ibrahim Mohammed 2 Mohammed Ahmed نستطيع ربط جدول الزبناء السابق بجدولٍ للطلبيات Orders بعلاقة واحد إلى كثير، لتعبر العلاقة عن الطلبيات التي قام بها العملاء وقيمة كل طلبية وتاريخها. يمكن أن تكون هيكلية الجدول Orders كالتالي: Order_ID Customer_ID Order_Date Order_Value 997 101 1/5/2017 100 998 102 21/4/2016 150 999 101 21/4/2015 1500 تسمح هذه العلاقة للعميل بأن يطلُب طلبيةً أو أكثر، ويمكن ألا تكون له أية طلبية. ولكنّ كل طلبية في الجدول Orders ستكون تابعة لعميل واحد. ونستطيع تمثيل هذه العلاقة بالشكل التالي: علاقة كثير إلى كثير في علاقة كثير إلى واحد، تكون العلاقة مبنية على أن يكون أحد أطرافها “واحدًا”، مثل طالب واحد، عميل واحد، طلبية واحدة، وفي الطرف الثاني “كثير”. نحتاج أحيانا أن يكون طرفا العلاقة كثيرين. فمثلا، قد تكون لدينا طلبية تحتوي أكثر من عنصر، ونفس العنصر يكون متواجدًا في أكثر من طلبية. في هذه الحالة نحتاج لوجود جدول إضافي لبناء العلاقة، فمثلا تكون هيكلية جدول Orders كالتالي: Order_ID Customer_ID Order_Date Order_Value 997 101 1/5/2017 100 998 102 21/4/2016 150 999 101 21/4/2015 1500 وهيكلية جدول Items كالتالي: Item_Id Item_Name Item_Description 201 Hard Disk 1 1 Tera SSD Hard 202 Mouse Microsoft Optical Mouse 203 LCD 42 42” LCD نستطيع بناء علاقة كثير إلى كثير بين الجدولين السابقين بإضافة جدول ثالث يحلّ مكان الرابط وغرضه الوحيد هو بناء هذا النوع من العلاقات. نطلق عليه مثلا الاسم Orders_Items، ويكون بالهيكلية التالية: Order_Id Item_Id 997 201 997 202 999 201 999 202 999 203 998 203 يمثّل الشكل التالي علاقة كثير إلى كثير كما تظهر في الجدول Orders_Items: علاقة المرجعية الذاتية يُبنى هذا النوع من العلاقات عندما نريد أن نبني علاقة بين جدول ونفس الجدول، وأوضح مثال على هذا النوع من العلاقات هو جدول الموظفين الذي يحتوي على عمود رقم الموظف المسؤول، حيث يمكن ربط كل موظف بموظف آخر (مدير أو مسؤول) من نفس الجدول. فمثلا، لو كان لدينا جدول باسم Employees خاص بحفظ بيانات الموظفين، ستكون هيكليته على النحو التالي لتطبيق علاقة مرجعية ذاتية عليه: Employee_ID Employee_Name Manager_Id 100 Ibrahim Elbouhissi 101 Khaled Saber 100 102 Yasmeen Hadi 100 103 Duaa Yousef 101 104 Sami Saber بعلاقة المرجعية الذاتية، من الممكن أن يكون للموظف مسؤولًا أو لا يكون، ومن الممكن أن يكون الموظف مسؤولا عن موظف أو أكثر، ويمكن تمثيل العلاقة بالشكل التالي.
    2 نقاط
  26. يتناول هذا المقال، الأول من سلسلة دروس عن لغة الاستعلام البنائية Structured Query language التي تعرف بالاختصار المشهور SQL، مفهوم قواعد البيانات، وماذا نقصد بأنظمة إدارة قواعد البيانات، وما هو الجدول، وما هي خصائص قواعد البيانات العلاقية. ما هي قاعدة البيانات؟ بطريقة بسيطة مجرّدة من مفاهيم التقنية، قاعدة البيانات هي مكان لحفظ بيانات معينة على نحو مستمر بهدف الرجوع إليها وقت الحاجة، فدفتر أرقام الهواتف الذي كنا نستعمله في الماضي يُعدّ قاعدة بيانات؛ والكم الهائل من الفواتير المحاسبية الورقية المحفوظة في خزانات الأقسام المالية في الشركات قديماً، أيضاً هو قاعدة بيانات. وقِس على ذلك العديد من الأمثلة الواقعية والملموسة. نستنبطُ من هذا التعريف البسيط وجود خاصية هامة لقاعدة البيانات، ألا وهي “الاستمرارية” أو “الدوام” في حفظ البيانات. في الجانب التقني والبرمجي، فإن قاعدة البيانات Database هي عبارة عن مستودع تُحفظ البيانات فيه داخل جهاز الحاسوب أو الخادوم، ويتمتع هذا المستودع بخاصية الاستمرارية في حفظ البيانات. ونعني بخاصية الاستمرارية هنا أنه في حال إطفاء جهاز الحاسوب أو إعادة تشغيله أو انقطاع التواصل معه، فإن قاعدة البيانات وما تحتويه من بيانات تبقى موجودة ومحفوظة دون أي خلل. أنظمة إدارة قواعد البيانات العلاقية تُسمى البرمجيات التي تنشئ وتدير قواعد البيانات بأنظمة إدارة قواعد البيانات (Databases Management Systems) وتكتب بالاختصار DBMS. ما هي أنواع أنظمة إدارة قواعد البيانات؟ تختلف وتتعدد تسميات أنواع أنظمة إدارة البيانات، وهذا الاختلاف نابع بالدرجة الأولى من تقدم الزمن وما صاحبه من تقدم في العلوم والتقنيات، ومن ثم بالدرجة الثانية، ينبع الاختلاف من التقنيات والخصائص المتعددة لهذه الأنظمة وما تقدمه من خدمات. تنقسم أنواع أنظمة قواعد البيانات إلى ثلاثة أنواع رئيسية. نظام قاعدة البيانات الملف والواحد Flat File Database: يعدّ هذا النوع من الأنظمة قديما ومن النادر أن تجد أحدا يعمل عليه إلى الآن، وهو ببساطة قاعدة بيانات من ملف واحد كبير يحتوي على كل البيانات، وهو يشبه جدول واحد به كل البيانات. نظام إدارة قاعدة البيانات غير العلاقية Non-Relational DBMS :ظهر هذا النوع من أنظمة قواعد البيانات في ظل عصر تضخم البيانات وزيادة حجمها، وخاصة مع انتشار ما يسمى بالمواقع الاجتماعية وتطبيقات الجوال وصفحات الوب الحديثة، فهذا النوع من الأنظمة يسمح بحفظ بيانات غير مرتبة وفق بنية معينة Unstructured Data، وليس من الشرط أن تترابط هذه البيانات Not relational، كما يطلق عليها No-SQL Databases. نظام إدارة قاعدة البيانات العلاقية Relational DBMS: وهو النوع الأشهر والأكثر استخداما منذ بداية ظهوره والذي سنعتمده في هذه السلسلة لشرح SQL، حيث تُجمَّع في هذا النوع من الأنظمة البيانات التي لها علاقة ببعضها البعض في مكان واحد يسمى الجدول، مع وجود الإمكانية لربط الجداول مع بعضها البعض بعلاقات ترابط. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن ما هو الجدول؟ يُعدّ الجدول العنصر الأساسي في قواعد البيانات العلاقية، وعليه تعتمد أغلب مكونات قاعدة البيانات من مشاهد Views ودوال Functions وحِزم Packages وغيرها من العناصر الأخرى. يتكون الجدول من أعمدة Columns وصفوف Rows، حيث تمثل الأعمدة ما يسمى بالخصائص Features، والصفوف عبارة عن القيم التي تأخذها الأعمدة وتسمى بالسجلات Records. يوضح الشكل التالي مثالا لجدول يحتوي على بيانات تواريخ ميلاد وأسماء طلاب في مدرسة، وفي المثال نوضح مكونات الجدول في قاعدة البيانات. خصائص قواعد البيانات العلاقية ومميزاتها ظلت قواعد البيانات العلاقية مسيطرة منذ بدايات ظهور النموذج الأساسي لها عام 1970 على يد عالم الحاسوب Frank Codd أثناء عمله لصالح شركة IBM، ولم تكن هذه الأفضلية التي يتمتع بها نظام قواعد البيانات العلاقية تأتي من فراغ، بل من الخصائص التي تتمتع بها. البساطة تُرتَّب البيانات في أنظمة قواعد البيانات العلاقية وتُحفَظ بطريقة بعيدة عن التعقيد، حيث يعدّ الجدول الذي تُحفظ فيه البيانات مفهوما لأغلب المستخدمين وخاصة الذين مارسوا أعمالا في مجال البيانات المجدولة أو مراجعة السجلات. سهولة الاستعلام عن البيانات بعد عمليات الإضافة على قاعدة البيانات، وعند الحاجة للرجوع لها، فإن نظام قواعد البيانات العلائقية يوفر آلية سهلة للاستعلام عن هذه البيانات واستردادها، وذلك عن طريق لغة SQL، بالإضافة إلى وجود الإمكانية للمستخدم أن يستعلم عن البيانات من أكثر من جدول في نفس الوقت باستخدام جمل الربط Joins. كما أن خاصية ترشيح Filtering البيانات وتحديد شروط خاصة لظهور سجلات معينة هو أمر متاح بكل سهولة. سلامة البيانات تعدّ هذه الخاصية أساسية في أي نظام قواعد بيانات بغض النظر عن نوعه. ونعني بهذه الخاصية أن تتوفر جميع القدرات والإمكانات في نظام قواعد البيانات لضمان دقة وصحة المعلومات الموجودة فيه. ويندرج تحت هذه الخاصية ما يسمى بقيود التكامل Integrity constraints والتي هي عبارة عن مجموعة من القيود التي يجب الالتزام بها عند التعامل مع البيانات في الجدول، وسنتكلم عنها في مقال متقدم. المرونة تتمتع قواعد البيانات العلاقية بطبيعتها بالمرونة والقابلية للتطوير، مما يجعلها قابلة للتكيف مع طلبات التغيير والزيادة في كم البيانات. وهذا يعني مثلا أنك تستطيع التغيير على هيكلية جدول معين دون التأثير على البيانات الموجودة فيه أو على قاعدة البيانات ككل، كما أنك – مثلا - لن تحتاج إلى وقف قاعدة البيانات وإعادة تشغيلها مرة أخرى لتنفيذ بعض لتغييرات عليها. ما هي البرمجيات التي تقدم قواعد البيانات العلاقية؟ تَتَعدد الشركات والبرمجيات التي تُقدم أنظمة إدارة قواعد البيانات، وكل منها له سوقه ومجاله الذي يشتهر به. نُقدم لكم في الفقرات القادمة بعضًا من أشهر أنظمة إدارة قواعد البيانات العلاقية. قواعد بيانات MySQL أحد أشهر أنظمة قواعد البيانات العلاقية مفتوحة المصدر. تستطيع إنشاء العديد من قواعد البيانات بداخلها، وتستطيع الوصول لها عبر الوِب. تَعمل MySQL على هيئة خِدمة Service تُتيح لأكثر من مستخدم الوصول إلى أكثر من قاعدة بيانات، وتشتهر بين معشر مبرمجي تطبيقات الوِب لارتباطها الشائع مع لغة البرمجة PHP، ويمكن تنصيبها على أكثر من نظام تشغيل مثل وندوز أو لينكس أو ماك. تعدّ MySQL الخيار المفضل للشركات الناشئة أو المتوسطة وذلك لسهولة التعامل معها وانخفاض تكاليف تشغيلها مقارنة بخيارات أخرى. قواعد بيانات أوراكل Oracle تعدّ شركة أوراكل عملاق الشركات البرمجية التي تقدم أنظمة إدارة قواعد البيانات العلاقية، وتأتي قاعدة البيانات أوراكل بأكثر من إصدار (حسب البيئة والغرض) تبدأ من الإصدار الشخصي والخفيف، وتنتهي بالإصدار المتقدم Enterprise. تتميز قواعد بيانات أوراكل بكم كبير من الإمكانات التي تسهل عليك حل العديد من المشاكل والعقبات في التطبيقات التي تديرها وتنشئها، مع وجود دعم فني قوي عبر مجتمع أوراكل، لذلك فهي تعتبر الخيار الإستراتيجي (البعيد المدى) للعديد من الشركات الكبيرة والجامعات والحكومات. قواعد بيانات مايكروسوفت Microsoft SQL Server من قواعد البيانات الشهيرة، والذي تأتي أيضا بأكثر من إصدار، لتلبي احتياجات المستخدمين المختلفة وبيئات عملهم، ولكي تتعامل مع البيانات في هذا النوع تحتاج لاستخدام النسخة الخاصة من SQL والمسماة T-SQL اختصارا ل Transact SQL والتي هي عبارة عن نسخة SQL مضاف عليه ادوال خاصة وتعديلات على طريقة حذف وتعديل السجلات. قواعد بيانات PostgreSQL قواعد بينات PostgreSQL من قواعد البيانات العلاقية المفضلة لدى بعض مطوري تطبيقات الوِب وتطبيقات سطح المكتب، وهو نظام إدارة قواعد بيانات مفتوح المصدر. توجد الكثير من الشركات الكبيرة والعاملة في مجال نطاقات إنترنت تعتمد على هذا النوع من قواعد البيانات.
    2 نقاط
  27. إن كنت مطور ويب أو أحد المهتمين بتطوير الأنظمة المعلوماتية المختلفة في بيئة الويب، فإنك تعلم حجم التنوع الكبير للغات البرمجة المستخدمة في تطوير مواقع الويب وخدماته، ولربما كنت أحد مطوري هذه الخدمات وترغب بأن تكون خدماتك سريعة الانتشار وسهلة الاستخدام من قبل التطبيقات المختلفة ، وكما تعلم فإن كثرة لغات البرمجة المستخدمة في تطوير خدمات الويب تجعل من الصعب التواصل والتكامل بين هذه التطبيقات. إن المصطلح REST وهو اختصار لـ Representational state transfer يعبر عن المعمارية المستخدمة في تطوير خدمات الويب، التي تهدف إلى وضع معايير تضبط إدارة موارد الأنظمة resources وتحدد كيفية عنونتها ونقلها عبر بروتوكل HTTP إلى طيف واسع من التطبيقات المختلفة بغض النظر عن لغات البرمجة التي طورت بها تلك التطبيقات، وتعد معمارية REST أكثر معماريات تصميم الويب هيمنة خلال السنوات الماضية وذلك لسهولة استخدامها والتعامل معها. بعد التعرف على RESTful ستكون قادر على الانطلاق لتصميم الخدمة الخاصة بك دون القلق بشأن من سيستخدم الخدمة الخاصة بك.
    2 نقاط
  28. حققت برامج التعلم العميق والذكاء الاصطناعي نموًا متزايدًا في الآونة الأخيرة، إذ تشير الإحصاءات إلى أن القيمة السوقية لهذه التقنيات الحديثة قد تصل إلى 930 مليون دولار بحلول العام 2025م، كما ارتفع عدد الأعمال والوظائف التي تتطلب فهم مهارات الذكاء الاصطناعي بنسبة 450 % منذ تسع سنوات مضت. فما هو التعلم العميق Deep Leaning؟ وما هي تطبيقاته الأكثر استخدامًا في العالم؟ إليك قائمة محتويات المقال: مفهوم التعلم العميق كيف يعمل التعلم العميق؟ الفرق بين تعلم الآلة والتعلم العميق تطبيقات التعلم العميق الرعاية الصحية التعلم العميق في التسويق الإلكتروني البحث الصوتي والمرئي والدردشة الآلية التعلم العميق في التعليم عالم الترفيه تقصى الحقائق وكشف الأخبار المزيفة السيارات ذاتية القيادة الأرصاد والمناخ تحديات التعلم العميق الجودة الضعيفة للبيانات خداع التعلم العميق عدم فهم السياق جيدًا ضغوط على المؤسسات قرصنة التعلم العميق مفهوم التعلم العميق التعلم العميق Deep Learning هو فئة فرعية من تعلم الآلة Machine Learning الذي يعتمد على الشبكات العصبية الاصطناعية إلى جانب التعلم التمثيلي. لذلك، فإنه عبارة عن تقنية حاسوبية تحاكي العقل البشري من خلال تصميم خوارزميات مستوحاة من بنية القشرة الدماغية ووظيفتها حتى يمكنها تقليد جميع قدرات الدماغ مثل فهم اللغة الطبيعية والأصوات ومحتوى الصور والقدرة على تنفيذ العديد من الأوامر والتعليمات كما يفعل الإنسان. ويعد التعلم العميق من العلامات الفارقة المميزة في العصر الحديث، فقد نجح العلماء في إنشاء شبكات البرسبترون العصبونية Perceptron القائمة على فكرة وظائف الشبكات العصبية Neural network، فهو يتضمن بناء شبكات عصبية قادرة على معالجة البيانات المعقدة بدرجة أكثر شمولًا وتركيزًا من تقنيات الذكاء الاصطناعي الأخرى. كيف يعمل التعلم العميق؟ استطاع العلماء دراسة العقل البشري وكيفية عمل الأدمغة التي تحتوي على مليارات الخلايا العصبية المتشابكة معًا، وذلك بهدف إنشاء نموذج محاكاة من هذه الخلايا العصبية القادرة على تصفية المعلومات وتصنيفها ومعالجتها كما يحدث في دماغ الإنسان، ومن هنا جاءت فكرة إنشاء خوارزميات التعلم العميق. ويطلق عليه التعلم العميق لأنه يستخدم الشبكة العصبية الاصطناعية العميقة. وهذه الشبكة الاصطناعية تحتوي على خلايا عصبية تضم مجموعة من الطبقات المتصلة والمتراكمة فوق بعضها بعضًا، التي تبدأ بطبقة الإدخال المستوحاة من حواس الإنسان وتستقبل إشارات البيانات والمعلومات وتنتهي بطبقة الإخراج التي تظهر النتيجة النهائية للمعلومات، وبين هاتين الطبقتين توجد طبقات مخفية تكون مسؤولة عن تحليل البيانات للوصول إلى الاستنتاجات قبل استخراجها على هيئة معلومات مفيدة. وكل طبقة في الشبكات العصبية العميقة Deep Neural Networks تكون مسؤولة عن التقاط أنماط معينة من البيانات أو معلومات محددة ومعالجتها باستخدام خوارزميات التعلم العميق. ويطلق على الخلية العصبية في هذه الشبكة اسم (عصبون) وكل خلية لها وزن يحدد أهمية كل عنصر على حدة، إضافة إلى إمكانية تعديل الأوزان أكثر من مرة لضمان الحصول على نتائج دقيقة في نهاية المطاف. وبذلك يمكن لخاصية التعلم العميق معالجة كمية هائلة من البيانات. وتعد الشبكات العصبية التلافيفية Convolutional Neural Network التي تعرف اختصارًا CNN، من أبرز الشبكات العصبية العميقة المستخدمة في التعلم العميق، فإنها تشتمل على طبقات متعددة ذات بنية استثنائية بهدف معالجة بيانات غير منظمة غالبًا مثل الصور للتنبؤ بما فيها وقراءتها ومعرفة الميزات الفريدة بها. ما الفرق بين تعلم الآلة والتعلم العميق؟ يظن الكثيرون من غير المتخصصين أن التعلم العميق وتعلم الآلة والذكاء الاصطناعي مفاهيم مترادفة وتُستخدم لتنفيذ الوظائف التقنية ذاتها، لكن الحقيقة عكس ذلك، لأن تعلم الآلة Machine Learning أحد فروع الذكاء الاصطناعي Artificial Intelligence، وأعم وأشمل من التعلم العميق Deep learning. ببساطة، يركز تعلم الآلة عمومًا على جعل الأجهزة الحاسوبية لديها القدرة على أداء المهام دون الحاجة إلى برمجة واضحة استنادًا إلى خوارزميات أكثر بساطة كتلك التي تعتمد على التوقع الخطي أو شجرة القرارات، أما التعلم العميق يستوجب إنشاء خوارزميات أكثر تعقيدًا وذات مستويات مختلفة مثل الشبكات العصبية الاصطناعية ANNs والشبكات العصبية التلافيفية CNN. كما أن خوارزميات التعلم الآلي يمكن تغذيتها ببيانات منظمة من أجل تحليلها والوصول إلى استنتاجات مفهومة، أما التعلم العميق يحتاج إلى بيانات غير منظمة وأنماط معقدة مثل النصوص المكتوبة والصور ومقاطع الفيديو والأصوات واللغات. كذلك، يتطلب التعلم العميق تدخلًا بشريًا أقل من تعلم الآلة، لكنه يحتاج إلى قوة حاسوبية وطاقة كبير للغاية من أجل المشكلات الأكثر تعقيدًا ومعالجة البيانات الضخمة باستخدام أجهزة وتقنيات معينة، على عكس تعلم الآلة الذي يتطلب كمية أقل من البيانات وقوة حاسوبية أقل أيضًا. تطبيقات التعلم العميق لا يقتصر استخدام تقنيات التعلم العميق على فهم الصور ومقاطع الفيديو فحسب، إنما يُستخدم على نطاق واسع في مجالات وقطاعات مختلفة، ونرى العديد من التطبيقات في حياتنا الراهنة خاصة مع تزايد حجم البيانات وبعدما أصبحت التكنولوجيا ميسورة التكلفة، فنلاحظ مثلًا أن النظام الأساسي في شبكة التواصل الاجتماعي "فيسبوك" لديه القدرة على معرفة أصدقائك وقراءة صورهم وتمييزها، وفيما يلي أهم تطبيقات التعلم العميق: الرعاية الصحية مع تطور الذكاء الاصطناعي، دخلت خوارزميات التعلم العميق في مجالات الطب والرعاية الصحية، ومكنت هذا القطاع من توفير القدرة على تحليل البيانات وفحصها بسرعة استثنائية، إضافة إلى دعم رعاية المرضى مع تقليل التكاليف وتحسين الكفاءات وتشخيص الأمراض. على سبيل المثال، تُستخدم أداة Aidoc في دعم الأطباء خاصة أنها تعتمد على خوارزميات تسرع تشخيص المريض وعلاجه مثل اكتشاف أماكن النزيف داخل الجمجمة والانسداد الرئوي، وغير ذلك. وبفضل خوارزميات التعلم العميق، نجح فريق بجامعة كاليفورنيا في عام 2016م، بتطوير تقنية تصور الخلايا في عينات الدم بسرعة كبيرة دون أن تؤثر سلبًا على هذه الخلايا والاستفادة منها في التحليلات المستقبلية الأخرى. كما تُستخدم الشبكات العصبية التلافيفية CNN في معرفة نتائج التصوير بالرنين المغناطيسي والأشعة السينية. وتوصلت دراسة -نُشرت نتائجها في المجلة العلمية Annals of Oncology- إلى أن خوارزميات الشبكات CNN قادرة على تحليل صور الأمراض الجلدية التي تحدد الإصابة بسرطان الجلد بدقة أكبر من الأطباء البشريين بنسبة 10%. لذلك أكد الفريق البحثي أن هذه الشبكات الاصطناعية تُعد أداة مناسبة للكشف عن سرطان الجلد. لا تقتصر تطبيقات التعلم العميق في القطاع الطبي على ذلك، بل شملت الدخول في عالم الطب الدقيق واكتشاف وتصنيع الأدوية والتنبؤ بالوفيات في المستشفيات. على سبيل المثال، طور فريق من جوجل بالتعاون مع جامعات أمريكية تقنية تعتمد على خوارزمية التعلم العميق ومعالجة اللغة الطبيعية التي حللت ما يزيد عن 46 مليار نقطة بيانات في 216 ألف سجل صحي إلكتروني عبر مستشفيين. وساعدت هذه التقنية في التنبؤ بطول فترة إقامة المرضى واحتمالات الوفاة بينهم. التعلم العميق في التسويق الإلكتروني أصبح التعلم العميق جزءًا لا يتجزأ من التسويق الإلكتروني، إذ سخرت قنوات التسويق الرقمي مثل فيسبوك قدرات التعلم العميق لتقديم أفضل تجربة للمتسوقين والمعلنين، وذلك من خلال استخدام تحليلات النص العميق Deep Text الذي يعالج اللغة بالذكاء الاصطناعي ويفهمها مثل البشر، إضافة إلى تصفية "موجز الأخبار" الخاص بالمستخدمين واكتشاف المحتوى الجديد وفهم النصوص المرغوب فيها وتجنب غيرها. وتشير الإحصائيات إلى أن أكثر من 51% من المسوقين يستثمرون تقنيات الذكاء الاصطناعي والتعلم العميق في حملات التسويق الإلكتروني للحصول على رؤى مستنيرة حول جمهورهم المستهدف في العام 2019، وفقا لما نقلته شبكة "businessinsider". بينما يرى 52% من جهات التسويق أن الذكاء الاصطناعي مهم لنجاح حملاتهم التسويقية ويؤكد 41% منهم أن تسريع نمو الإيرادات كان نتاجًا عن استخدام هذه الخوارزميات ويتوقع 80% منهم أتمتة أكثر من ربع مهامهم التسويقية خلال السنوات الخمسة المقبلة. يوجد العديد من المسوقين الذين يستخدمون تقنيات تعلم الآلة والتعلم العميق في تقديم محتوى مخصص وتحليل الفيديو والوصول إلى جمهور أكثر استهدافًا وفقًا لتفضيلاتهم أو سلوكياتهم والتفاعل معهم بفاعلية والتنبؤ برغبات العملاء والاستفادة من البيانات لأداء عروض أسعار في الوقت الفعلي. على سبيل المثال وليس الحصر، تهتم منصة "Google Cloud Video Intelligence" بإنشاء تحليلات لمقاطع الفيديو وتتيح إعداد ملخصات آلية لمستخدميها. البحث الصوتي والمرئي والدردشة الآلية هناك العديد من الشركات التي تستخدم خاصية التعلم العميق في منتجاتها الرقمية، فنجد تطبيق المساعد الصوتي Apple Siri الذي ترجم الصوت البشري إلى أوامر حاسوبية تسمح لمالكي أجهزة آيفون الحصول على المعلومات بناءً على أسئلتهم، كما أن أداة البحث الصوتي التي تستخدم خوارزميات جوجل Google Voice Search تتيح البحث بالصوت بدلًا من النصوص المكتوبة. فهي أدوات قائمة على فهم الأوامر الصوتية التي يطلبها المستخدمين. وهناك برامج سخرت التعلم العميق في البحث المرئي للجوال، مثل تطبيق "CamFind" الذي يتيح لمستخدميه التقاط صورة ما واستخدامها في إجراء عمليات البحث بدلًا من كتابة النصوص. إضافة إلى روبوتات الدردشة الآلية المستخدمة في حل مشكلات العملاء والتواصل معهم دون تدخل بشري، وهذه الروبوتات فعالة في التسويق عبر مواقع التواصل الاجتماعي والتفاعل مع العملاء وتقديم استجابات فورية لهم. التعلم العميق في التعليم يُستخدم تعلم الآلة والتعلم العميق في التعليم لمنح الطلاب تجربة تعليمية فردية وتحليل أدائهم وتعديل طرق التدريس والمناهج الدراسية استنادًا إلى البيانات التي يتم معالجتها في أثناء تجارب الطلاب، ويساعد على زيادة كفاءة المعلمين من خلال فهم إمكانات الطلاب وتقديم محتوى تعليمي ممتع يشجع المتعلمين على التعلم والمشاركة. كما يسهم في إجراء التحليلات المتقدمة والتنبؤية المتعلقة بالعملية التعليمية. ومِنْ ثَمَّ، اتخاذ القرارات والإجراءات الصحيحة الأكثر عقلانية. توجد أمثلة عديدة لاستخدام التعلم العميق والتعلم الآلي في التعليم، مثل أداة "Quizlet" التي تتيح للمتعلمين تصميم الاختبارات والبطاقات التعليمية والرسوم البيانات وتضم ما يزيد عن 50 مليون مستخدم نشط. أما منصة "SchooLinks" فإنها تمكّن الطلاب من تصميم السير الذاتية ومعرفة الدورات التدريبية التي ينبغي الحصول عليها، وغيرها من الخدمات التي تتطلب استخدام خوارزميات التعلم الآلي. وغيرها من التطبيقات والأدوات التي تستعين بخوارزميات التعلم العميق والهادفة إلى جذب الطلاب وزيادة مشاركتهم وتنوع طرق التدريس. عالم الترفيه تُستخدم تطبيقات التعلم العميق والذكاء الاصطناعي في عالم الترفيه من أجل تقديم تجربة ممتعة للعملاء، فهناك شركات عالمية عديدة مثل يوتيوب وأمازون ونتفلكس تستغل خوارزميات الذكاء الاصطناعي في عرض الأفلام والأغاني ومقاطع الفيديو المختلفة بناءً على رغبات وسلوكيات وخيارات العميل التي نفذها سابقًا. كما يمكن الاستعانة بتقنيات التعلم العميق في تحويل أصوات الممثلين إلى ترجمات نصية تلقائية أو إدراج الأصوات في الأفلام السينمائية الصامتة. وقد استخدمت بعض شركات الترفيه هذه الخوارزميات لإنشاء نمذجة التنبؤ في الوقت الفعلي اعتمادًا على الاتجاهات الحالية للعملاء التي تُجمع من مصادر البيانات، وذلك يساعد الشركات على التفاعل مع عملائهم بشكل فوري، وتوقع سلوكياتهم المستقبلية والتعرف على الأفلام ومقاطع الفيديو التي تستهلكها شرائح صغيرة من الجمهور في الوقت الحالي ومن المتوقع شهرتها مستقبلًا، فضلًا عن إمكانية إنتاج الموسيقى باستخدام نماذج قائمة على خوارزميات التعلم العميق. تقصي الحقائق وكشف الأخبار المزيفة لجأت غرف الأخبار وصالات التحرير إلى تقنيات الذكاء الاصطناعي والتعلم العميق للتحقق من المعلومات المضللة وتقصي الحقائق، فقد طور باحثون من جامعة Waterloo الكندية نظام يستخدم خوارزميات الذكاء الاصطناعي للتعلم العميق لتقييم المقالات الإخبارية تلقائيًا بهدف تحديد المعلومات المضللة. وهناك منصات عديدة لتقصي الحقائق مثل Snopes و FactCheck.org، و PolitiFact تسخر الذكاء الاصطناعي في هذه المهمة. وتعد تقنية التحليل الرقمي "InVID" من أبرز الأدوات التي تستخدم خوارزميات التعلم العميق والذكاء الاصطناعي في الكشف عن الأخبار المزيفة والمعلومات المضللة، فهي تتضمن أكثر من 15 أداة لتقصي الحقائق، فمثلًا تسمح بتجزئة الفيديو إلى صور ثابتة لإجراء بحث عكسي عليها عبر محركات البحث العملاقة مثل Google و Yandex و Baidu، إضافة إلى استخراج البيانات الوصفية للفيديوهات وتحليلها والتعرف على ما إذا كانت الصور معدلة أم أصلية، وما إلى ذلك. السيارات ذاتية القيادة واحدة من تطبيقات التعلم العميق التي أدهشت العالم، هي السيارات ذاتية القيادة التي تعتمد على الشبكات العصبية الاصطناعية في القيادة وتحديد إشارات المرور واكتشاف الأشياء التي ينبغي تجنبها في أثناء القيادة دون أي تدخل بشري، إضافة إلى التعرف على وقت ضبط السرعة وتوجيهها بطريقة آمنة في الطرقات. ففي عام 1989م، استخدمت أول سيارة ذاتية القيادة التي عرفت باسم ALVINN الشبكات العصبية لاكتشاف خطوط الممرات وتقسيم البيئة وإمكانية القيادة، وكانت النتيجة جيدة إلا أنها محدودة لعدم توافر البيانات وضعف المعالجة. والآن، أضحت هذه التجربة أفضل مما كانت عليه في الماضي، فقد استحوذت خوارزميات التعلم العميق على النواحي الفرعية للقيادة الذاتية، لا سيما في ظل توفر البيانات الضخمة والمعالجات القوية. وتعتمد القيادة الذاتية على أجهزة الاستشعار المختلفة مثل الكاميرات أو GPS لجلب البيانات من البيئة المحيطة بالسيارة ومعالجتها باستخدام خوارزميات التعلم العميق من أجل اتخاذ القرارات المناسبة والجيدة وذات الصلة بالبيئة، وهذا يتطلب توافر فحص وفهم أربعة مكونات أساسية في هذه السيارات تتمثل في التصور والإدراك perception ومعرفة الخريطة والموقع المبدئي Localization والتنبؤ بالأشياء المحيطة Prediction وصناعة القرار Decision Making. الأرصاد والمناخ ساعدت تقنيات التعلم العميق على تحليل بيانات الأرصاد الجوية والأبحاث البيولوجية والتنبؤات المناخية ومعرفة أحوال الطقس مثل احتمالات سقوط الأمطار أو وقوع الزلازل واندلاع البراكين، مما يسهم في اتخاذ الاحتياطات والإجراءات اللازمة التي تحمي الناس من مخاطر هذه الكوارث الطبيعية. على سبيل المثال، ابتكر فريق بحثي في جامعة واترلو الكندية تقنية تعتمد على خوارزميات التعلم العميق للكشف عن نقاط التحول في التغير المناخي والعمل كنظام إنذار مبكر. وإذا كنت ترغب في تطبيق هذه الخوارزميات في مشروعك أو خدماتك التقنية وتحتاج إلى بعض المساعدة، فإنه يمكنك الاستعانة بخدمات التعلم العميق التي توفرها منصة خمسات -أكبر سوق عربي لبيع وشراء الخدمات المصغرة- وتضم لفيف من الخبراء العرب والمحترفين في مجال الذكاء الاصطناعي والتعلم العميق ولديهم القدرة على تقديم الدعم لك على أكمل وجه. تحديات التعلم العميق على الرغم من الطفرة الهائلة التي أحدثتها خوارزميات التعلم العميق في مختلف القطاعات، فهو ليس حلًا سحريًا لمعالجة جميع المشكلات، لأن هناك تحديات صعبة تواجه هذه التقنيات الحديثة وتمنعها من منافسة العقل البشري. فعلى سبيل المثال، تستلزم عملية التعرف على صورة ما معالجة ملايين البيانات لتحديدها. الجودة الضعيفة للبيانات تتطلب تقنيات التعلم العميق استخدام بيانات عالية الجودة لاستخراج نتائج جيدة ودقيقة، أما البيانات الرديئة التي تحتوي على أخطاء كثيرة وقيم متطرفة وبيانات فوضوية، فلن تعمل خوارزميات التعلم العميق بصورة صحيحة. لذلك، يعكف الكثير من علماء البيانات على تنظيف البيانات وتنقيتها في أغلب أوقاتهم من خلال تجاهل القيم المتطرفة أو إصلاحها وملء البيانات المفقودة يدويًا. خداع التعلم العميق يظن البعض أن خوارزميات التعلم العميق لا يمكن خداعها، وهذا اعتقاد خاطئ تمامًا، لأنه من السهل نسبيًا استخدام الاحتيال مع هذه التقنيات. فقد أجرى باحثون في معهد ماساتشوستس للتكنولوجيا MIT في عام 2017م، دراسة حول إمكانية خداع مصنف الصور InceptionV3 التابع لجوجل، وبعد التلاعب المتعمد في صورة سلحفاة ثلاثية الأبعاد، صنفتها الشبكة العصبية الاصطناعية على أنها بندقية وليست سلحفاة، وفي تجربة أخرى حدث خلط بين طائرة الهليكوبتر والبندقية. عدم فهم السياق جيدا تحتاج خوارزميات التعلم العميق إلى بيانات كافية لتعمل بطريقة صحيحة، فهي جيدة في ربط المدخلات مع المخرجات، لكنها لا تفهم سياق البيانات التي تتعامل معها بدقة في كثير من الأحيان. فكلمة "عميق" في مصطلح التعلم العميق تركز على بنية الخوارزميات وعدد الطبقات المخفية أكثر من مستوى فهمها لما تعالجه من بيانات. وتتطلب الشبكة العصبية الاصطناعية التدريب والتأقلم حتى تفهم السياق إذا حدثت أي تغيرات في البيانات. ضغوط على المؤسسات توصلت دراسة استقصائية أجريت في عام 2017 إلى أن 80% من المؤسسات تستثمر في الذكاء الاصطناعي رغم توقعها بوجود عوائق صعبة أمامها. وهذه النتيجة تشير إلى احتمالية وجود ضغط متزايد على الشركات ومطوريها للتركيز على تقنيات التعلم العميق وحلول الذكاء الاصطناعي لزيادة الإنتاجية والوصول إلى استنتاجات مستنيرة واتخاذ قرارات صائبة تدفع هذه الشركات للأمام. قرصنة التعلم العميق هناك تخوفات من أن تصبح الشبكات العصبية عرضة للقرصنة والهجمات الإلكترونية، على سبيل المثال، من المحتمل استغلال خوارزميات التعلم العميق في السيارات ذاتية القيادة لتغيير سلوكها بطريقة مؤذية، وهذا ما فعله باحثون في تجربة نُشرت نتائجها في دورية Nature، فقد تعمدوا تضليل الشبكات العصبونية بالسيارة ذاتية القيادة من خلال وضع ملصقات معينة على كلمة "توقف" إلا أن النظام أخطأ في قراءتها واعتبرها "الحد الأقصى للسرعة 45". أخيرًا، هل يمكن القول بأن تجارب التعلم العميق محكوم عليها بالفشل؟ بالتأكيد لا، لأن تقنيات التعلم العميق تعمل بكفاءة عالية إذا ما توفرت البيانات الكافية وعالية الجودة، كما يكرس علماء البيانات والمطورون جهودهم من أجل التغلب على هذه التحديات وتحسين نماذج التعلم العميق وتطويرها وسط تخوفات من تهديد التعلم العميق النسيج الاجتماعي والاقتصادي من خلال دفع البشر إلى البطالة أو غير ذلك. المراجع والمصادر What is Deep Learning and How Does It Works [Explained] The Best Introduction to Deep Learning - A Step by Step Guide Top 10 Deep Learning Applications Used Across Industries Deep Learning Tutorial for Beginners: Neural Network Basics Difference Between Deep Learning and Machine Learning Vs AI Are There Really as Many Neurons in the Human Brain as Stars in the Milky Way? How Many Neurons Are in the Brain? ما هو التعلم العميق؟ Deep Learning vs. Machine Learning — What’s the Difference? Difference Between Machine Learning and Deep Learning Deep learning vs. machine learning – What’s the difference? The Amazing Ways Google Uses Deep Learning AI How is Machine Learning enhancing the Future of Education? Artificial intelligence may be set to reveal climate-change tipping points AI in Marketing: How brands can improve personalization, enhance ad targeting, and make their marketing teams more agile The 2021 State of Marketing AI Report MACHINE LEARNING IN EDUCATION: EXPLANATION, BENEFITS, CASE What Is Deep Learning and How Will It Change Healthcare? DEEP LEARNING IN HEALTHCARE – HOW IT’S CHANGING THE GAME Top Use Cases for AI in Media and Entertainment Deep learning won’t detect fake news, but it will give fact-checkers a boost Taking a Stance on Fake News: Towards Automatic Disinformation Assessment via Deep Bidirectional Transformer Language Models for Stance Detection Deep Learning in Self-Driving Cars Self-Driving Cars With Convolutional Neural Networks (CNN) 5 Challenges of Machine Learning! 5 Key Deep Learning/AI Challenges in 2018 The limits and challenges of deep learning Turtle or rifle? Google AI tricked by MIT students مشكلةٌ عويصة تواجه تقنيات التعلم العميق The Complete Beginner’s Guide to Deep Learning: Artificial Neural Networks كيف يمكن للذكاء الاصطناعي أن يشكل مستقبل تسويق المحتوى اقرأ أيضًا الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها تعلم الآلة: التحديات الرئيسية وكيفية التوسع في المجال تعلم الذكاء الاصطناعي
    2 نقاط
  29. المُزخرفات من أعظم مميزات لغة بايثون، إذ تساعدك على بناء برنامجك باحترافية أكثر موفرة طريقة بسيطة لإضافة خاصيات جديدة للدالة. وهي ببساطة دوال تستطيع أن تعدل على دوال أخرى. تذكير ببعض المفاهيم الأساسية إذا لم تكن تعرف شيئا عن الدوال في لغة بايثون فيجب عليك العودة للدرس السابق الدوال في بايثون قبل أن تكمل قراءة هذا الدرس. تُعتبر الدوال في لغة بايثون كائنات من نوع الفئة الأولى أو First class objects. ما يعني أنّنا نستطيع القيام بالعديد من العمليات، وهي كالتالي: يُمكنك تعريف دالة داخل دالة أخرى يُمكنك أن تستدعي دالة داخل أخرى يُمكنك أن تقوم بتمرير دالة كمُعامل لدالة أخرى يُمكنك أن تُسند دالة لمُتغير يُمكنك إرجاع دالة داخل دالة أخرى بما أنّ المُزخرفات مُجرّد دوال فعلينا أن نبدأ من الأساس، لاحظ الدالة التالية: def say_hello(): print 'Hello!' عند استدعاء الدالة ستُطبع القيمة Hello على الشاشة، هذا ليس بالأمر المُعقد، الآن ماذا لو أردنا أن نعدل الدالة في جزء آخر من البرنامج لكي تطبع أشياء أخرى وتؤدي أغراضا أخرى قبل استدعاء الدالة أو بعد ذلك؟ يُمكن أن نعدّل الدالة مُباشرة، لكن هذا الأمر سيغير من طريقة سير البرنامج، إذ نريد أن نعدل الدالة في منطقة واحدة فقط من البرنامج وليس في كامل البرنامج، هذه المسألة تُحل بالمُزخرفات، وكما يدل اسمها فهي دوال تُزيّن وتُزخرف الدالة الأصلية، أي تُضيف عليها مهاما أخرى. سننشئ لهذه الدالة الآن مُزخرفا Decorator يقوم بطباعة Before قبل تنفيذ الدالة و After بعد تنفيذ الدالة، وذلك دون تعديل الدالة مُباشرة. انظر المثال التالي: def decorator(function): def function_decorator(): print 'Before' function() print 'After' return function_decorator الشيفرة أعلاه عبارة عن دالة تقبل دالة أخرى (الدالة التي نرغب بزَخرَفَتِها أو تزيينها) كمُعامل وبعدها نقوم بإنشاء دالة داخل هذه الدالة لطباعة القيمة Before ثم استدعاء الدالة الأصلية (المُعامل) بعدها طباعة After وأخيرا إرجاع الدالة الجديدة (وهي نُسخة مزخرفة من الدالة الأصلية). بعدها يُمكننا أن نستخدم هذا المُزخرف لزخرفة أي دالة مهما كانت، انظر المثال التالي: # -*- coding: utf-8 -*- def decorator(function): # إنشاء الدالة المسؤولة عن الزخرفة def function_decorator(): # إنشاء الدالة التي ستكون نسخة مزخرفة من الدالة المُمرّرة في كمُعامل print 'Before' # طباعة جملة قبل تنفيذ الدالة function() # استدعاء الدالة print 'After' return function_decorator # إرجاع الدالة مُزَخْرَفَةً def say_hello(): # إنشاء دالة عادية print 'Hello!' say_hello = decorator(say_hello) # زخرفة الدالة say_hello() # استدعاء النُسخة المُزخرفة من الدالة توفر لنا لغة بايثون طريقة أكثر مرونة لزخرفة الدوال، وهي بوضع اسم المُزخرف مسبوقا بالحرف @ قبل تعريف الدالة. أي أنّ السّطر التالي: def say_hello(): print 'Hello!' say_hello = decorator(say_hello) # زخرفة الدالة يُمكن أن يكون كالتالي: @decorator def say_hello(): # إنشاء دالة عادية print 'Hello!' وبالتالي سنتمكن من زخرفة أي دالة نرغب بزخرفتها كالتالي: @decorator def say_hello(): print 'Hello!' @decorator def say_hi(): print 'Hi!' @decorator def say_name(): print 'Abdelhadi!' say_hello() say_hi() say_name() عند تنفيذ الشيفرة أعلاه ستكون المخرجات كالتالي: Before Hello! After Before Hi! After Before Abdelhadi! After مُلاحظة: إذا كانت للدالة معاملات فما عليك إلا استخدام args* التي سبق وتحدثنا عنها في الدرس السابق. # -*- coding: utf-8 -*- def decorator(function): # إنشاء الدالة المسؤولة عن الزخرفة def function_decorator(*args): # إنشاء الدالة التي ستكون نسخة مزخرفة من الدالة المُمرّرة كمُعامل print 'Before' # طباعة جملة قبل تنفيذ الدالة function(*args) # استدعاء الدالة print 'After' return function_decorator # إرجاع الدالة مُزَخْرَفَةً لاحظ الدالتين function_decorator و function. أمثلة على المزخرفات في لغة بايثون إذا فهمت مبدأ المزخرفات فستستطيع أن تتعامل مع الدوال بمرونة عالية، وإليك بعض الأمثلة لاستخدام المُزخرفات لتأدية بعض المهام البسيطة: حساب مدة تنفيذ دالة إذا فهمت جيدا مبدأ المُزخرفات فستلاحظ بأنّك تستطيع تنفيذ مهام قبل تنفيذ الدالة ومهام بعد تنفيذها، ومما سبق نستنتج بأنّنا نستطيع أن نقوم بحفظ الوقت الحالي في مُتغير ثم تنفيذ الدالة وبعدها نقوم بحساب الفرق بين الوقت السابق والوقت الحالي، ما سيُرجع المُدة المُستغرقة لتنفيذ الدالة. البرنامج التالي مثال على مُزخرف لحساب مُدة دالة تطبع الجملة !Hello World مليون مرّة. # -*- coding: utf-8 -*- import time # جلب مكتبة الوقت لاستعمال دوال الوقت def function_time(function): def function_decorator(*args): start_time = time.time() # الحصول على وقت البداية function(*args) end_time = time.time() # الحصول على الوقت بعد نهاية التنفيذ # طباعة اسم الدالة والفرق بين وقت البداية ووقت النهاية print '%s function took %0.3f s' % (function.func_name, (end_time - start_time)) return function_decorator # إرجاع الدالة مُزَخْرَفَةً # زخرفة الدالة المسؤولة عن الطباعة مليون مرة @function_time def print_million_times(): for i in range(0, 1000000): print 'Hello World! 1,000,000 times!' print_million_times() البرنامج أعلاه سيطبع الجملة مليون مرة ثم يعرض الوقت المُستغرق لإنجاز العملية. الجملة الأخيرة ستكون شيئا كالتّالي: print_million_times function took 69.584 s ملاحظات: نستعمل التابع func_name للحصول على اسم الدالة المُمررة كمعامل، ويكون على شكل سلسلة نصية. نستعمل الجملة time.time للحصول على الوقت بالثواني، عدد الثواني الذي تنتجه الجملة هو عدد الثواني الذي مرّ منذ سنة 1970. يُمكنك استعمال هذا المُزخرف مع أي دالة تريد فقط اكتب اسم المُزخرف مسبوقا بالحرف @ ثم عرف الدالة بعده، وستحصل على الوقت المُستغرق لتنفيذ الدالة. حساب عدد مرات استدعاء دالة يُمكننا أن نستخدم المُزخرفات للحصول على عدد المرات التي استدعيت فيها دالة ما في برنامج مُعيّن، بحيث يحمل متغير قيمة العدد صفر، وفي كل مرة تستدعى فيها الدالة، فإن المُتغير يحمل القيمة مع زيادة بالعدد واحد، انظر المثال التالي. # -*- coding: utf-8 -*- # متغير العد n = 0 # المُزخرف def call_times(function): def decorated(): function() # استدعاء الدالة global n # جعل مُتغير العدّ عالميا n += 1 # زيادة قيمة المُتغير print 'Function was called', n, 'times' # طباعة قيمة المُتغير return decorated @call_times # زخرفة الدالة def func(): # إنشاء الدالة print 'Hello!' # استدعاء الدالة func() func() func() func() مُخرجات البرنامج أعلاه ستكون كالتالي: Hello! Function was called 1 times Hello! Function was called 2 times Hello! Function was called 3 times Hello! Function was called 4 times يُمكنك إصلاح الجمل من الناحية اللغوية بإضافة بعض العبارات الشرطية للبرنامج. إنشاء مزخرف لتنفيذ دالة عند تحقق شرط معين فقط يُمكنك أن تستعمل دالة تسجيل الدخول التي قُمنا بإنشائها كمُزخرف للدوال التي تحتاج لأن يكون المُستخدم مُسجلا دخوله. مثلا لنقل بأنّنا نريد أن نعرض على المُستخدم عدة خيارات بعضها يحتاج إلى تسجيل دخول المُستخدم وبعضها لا. الخيارات كالتّالي: تسجيل مُستخدم جديد (تسجيل الدخول غير مطلوب) طباعة جملة عشر مرات ( تسجيل الدخول غير مطلوب) الحصول على الوقت الحالي ( تسجيل الدخول غير مطلوب) طباعة اسم المُستخدم (تسجيل الدخول مطلوب) رؤية معلومات الحساب (تسجيل الدخول مطلوب) تعديل كلمة المرور (تسجيل الدخول مطلوب) مبدأ عمل البرنامج سيكون كالتالي: إنشاء الدوال المسؤولة عن الخيارات عرض الخيارات على المُستخدم زخرفة الدوال التي تطلب تسجيل المُستخدم بمُزخرف تسجيل الدخول المُزخرف سيتحقق من أنّ المُستخدم قد سجل دخوله، إذا كان الأمر كذلك، تنفّذ الدالة وإذا لم يتحقق الشرط فلا تنفذ. لنقل بأنّ اسم مُزخرف التحقق من تسجيل الدخول هو is_user_logged_in، ستكون الدوال التي تطلب تسجيل الدخول مُزَخْرَفَةً كالتالي: @if_user_logged_in def account_info(): print 'Username:', username, 'Password:', password تمارين تمرين 1 أنشئ دالة للجمع بين عددين، وبعدها أنشئ مُزخرفا يقوم بمُضاعفة النتيجة. تمرين 2 أنشئ دالة للحصول على قيم من المُستخدم وقم بزخرفة لطباعة جملة ترحيب قبل استدعاء الدالة وجملة توديع بعد استدعاءها. تمرين 3 أكمل البرنامج الخاص بالمثال الثالث (إنشاء مُزخرف لتنفيذ دالة عند تحقق شرط مُعين فقط). تفاصيل التمرين موجودة بالمثال.
    2 نقاط
  30. Django هو إطار عمل مجّاني ومفتوح المصدر، مكتوب بلغة Python، وتتبع المشاريع فيه بنية Model-View-Template (عادة ما تختصر إلى MVT). يؤكّد Django على قابلية إعادة الاستخدام Reusability للمكونات وكذلك على التطوير السريع، بالإضافة إلى مبدأ عدم التكرار. تستخدم لغة Python في جميع مفاصل إطار العمل هذا، كالإعدادات ونماذج قواعد البيانات وغيرها. ومن أشهر المواقع التي تستخدم Django هي: Pinterest ،Instagram ،Mozilla ،The Washington Times ،Disqus ،National Geographic وغيرها الكثير. طوّر Django سنة 2003 على يدي المبرمجين Adrian Holovaty و Simon Willson اللذين يعملان في صحيفة Lawrence Journal World، وذلك عندما انتقلا إلى لغة Python لبناء التطبيقات. ثم أطلق Django سنة 2005 تحت رخصة BSD، وقد سمّي بهذا الاسم تيمنًا بعازف الغيتار Django Reinhardt. بنية MVT تنقسم بنية المشاريع في Django إلى ثلاثة أقسام مرتبطة ببعضها البعض، ولكنّها مختلفة عن أطر العمل الأخرى التي تتبع بنية (MVC - Model, View, Controller) مثل Laravel في PHP وغيرها، حيث تتكون المشاريع في Django من النموذج Model والعرض View والقالب Template. يتولى قسم النموذج معالجة البيانات والتعامل معها واسترجاعها، ويدعم Django العديد من قواعد البيانات، مثل: SQlite ،MySQL، و PostgreSQL. أما العرض فعبارة عن مجموعة من دوال Python التي تستجيب لعنوان URL معين، ووظيفة العرض هي تحديد البيانات والمعلومات التي يجب عرضها. أما القالب فهو عبارة عن ملف بصيغة HTML يتم من خلاله تحديد الطريقة التي ستظهر بها المعلومات التي يعرضها قسم العرض. أين المتحكم Controller إذًا؟ المتحكم هنا هو إطار العمل نفسه، أي الآلية التي يتم من خلالها إرسال الطلب إلى العرض المناسب بالاعتماد على عنوان URL محدّد. تثبيت Django إطار العمل Django هو إحدى الحزم الخاصة بلغة البرمجة بايثون، وتوفّر هذه اللغة مدير حزم خاصّ يدعى pip يتم من خلاله تثبيت وتحديث وإزالة الحزم بسهولة ويسر؛ لذا ستكون الخطوة الأولى في تثبيت Django هي التأكد من وجود مدير الحزم pip وتثبيته إن لم يكن متوفّرًا. تنصيب pip لتنصيب إطار العمل Django ستحتاج إلى مدير الحزم الخاصّ بـ Python وهو pip، ولحسن الحظّ فإن pip متوفّر في نسخة Python 2.7.9 وما بعدها، وفي نسخة Python 3.4 وما بعدها. في حال عدم توفّر pip في نسخة Python المنصّبة لديك يمكنك تنصيبه باتباع الخطوات التالية: حمّل الملفّ get-pip.py. توجه في سطر الأوامر إلى المكان الذي حملت فيه الملف السابق، ثم اكتب التعليمة التالية: python get-pip.py استخدام سطر الأوامر لنجرب الآن استخدام مدير الحزم في بايثون لتنصيب Django، توجّه الآن إلى سطر الأوامر ثم اكتب الأمر: pip install django==1.9 هل ظهرت لك رسالة خطأ؟ ما المشكلة، ألم نقم بتنصيب pip قبل قليل؟ هذا صحيح، ولكننا لم نخبر سطر الأوامر بأن يوجّه أي تعليمة تبدأ بكلمة pip إلى مدير حزم بايثون، وللقيام بذلك اتبع الخطوات التالية: في أوبنتو: يجب تنصيب حزمة python3-pip إن كنت تستخدم الإصدار الثالث من بايثون أو python-pip للإصدار الثاني من بايثون، لتتمكن من استخدام pip في سطر الأوامر في أبونتو، وللقيام بذلك اكتب الأمر التالي في سطر الأوامر: sudo apt-get install python3-pip أدخل كلمة المرور الخاصة بك، وستبدأ عملية التثبيت، وبعد الانتهاء يمكنك تنصيب أي حزمة خاصة بلغة بايثون عن طريق سطر الأوامر مباشرة. في نظام Windows: أما في نظام Windows فيجب إضافة السطر التالي: C:\Python34\scripts; إلى مسار النظام System path، وللقيام بذلك اتبع الخطوات التالية: انقر بزر الفأرة الأيمن على أيقونة Computer واختر Properties من القائمة المنسدلة: انقر على أيقونة Advance system settings، وفي مربع الحوار المنبثق اضغط على أيقونة Environment Variables. انقر نقراً مزدوجًا على متغير النظام Path في الجزء السفلي من مربع الحوار المنبثق. أضف السطر السابق إلى نهاية السلسلة النصّية، بعد الفاصلة المنقوطة (;) (إن لم تكن هناك فاصلة منقوطة في نهاية السطر فقم بإضافتها). اضغط Ok ثم أغلق بقية النوافذ بالضغط على Ok. يمكنك الآن استخدام pip من سطر الأوامر مباشرة. البيئة الافتراضية Virtual Environment قبل البدء بتنصيب Django سنعمل على تنصيب أداة مفيدة جدًّا من شأنها المساعدة على ترتيب البيئة البرمجية على حاسوبك. يمكن تجاوز هذه الخطوة، ولكن ينصح بها بشدّة. تعمل البيئة الافتراضية على عزل مشاريع Python أو Django الخاصّة بك عن بعضها البعض، وهذا يعني أن إجراء التعديلات على موقع إلكتروني معيّن لن تؤثّر على المشاريع الأخرى التي تعمل عليها. ستحتوي البيئة الافتراضية على الملفات التنفيذية الخاصة بـ Python بالإضافة إلى نسخة من مكتبة pip يمكنك استخدامها في تنصيب حزم Python المختلفة. سننشئ مجلدًا سيحتوي على البيئة الافتراضية التي سوف ننشئها بعد قليل. mkdir mysite cd mysite يتطلب إنشاء البيئة الافتراضية تنصيب حزمة virtualenv وسنستعين بـ pip للقيام بذلك: pip install virtualenv لاستخدام virtualenv من سطر الأوامر مباشرة في أوبنتو يجب تنصيب الحزمة virtualenv، وللقيام بذلك اكتب الأمر التالي في سطر الأوامر: sudo apt-get install virtualenv بعد اكتمال عملية التنصيب يمكنك إنشاء البيئة الافتراضية بالشكل التالي: virtualenv myvenv ستنشئ هذه الشيفرة بيئة افتراضية وهي عبارة عن مجموعة من المجلدات. لتفعيل البيئة الافتراضية الجديدة في نظام Windows استخدم الشيفرة التالية: myvenv\Scripts\activate أما في نظامي Linux و OS X فاستخدم: source myvenv/bin/activate ملاحظة: قد لا تحصل على النتيجة المرجوّة من الشيفرة السابقة، لذا يمكنك استخدام هذه الشيفرة: . myvenv/bin/activate سيتغيّر سطر الأوامر وذلك بإضافة كلمة (myvenv) إلى بداية السطر، وهذا يعني أن الأمور تسير على ما يرام. ولإغلاق البيئة الافتراضية يمكنك استخدام التعليمة التالية: deactivate تنصيب Django بعد اكتمال الخطوتين السابقتين يمكننا الآن تنصيب Django وذلك بتنفيذ الأمر التالي (انتبه إلى وجود علامتي مساواة لا علامة واحدة): pip install django==1.9 بعد اكتمال عملية التنصيب، وللتأكد من أن الأمور تجري على ما يرام، اكتب الأمر التالي في سطر الأوامر: python3 -c "import django; print(django.get_version())" إن حصلت على رقم النسخة (1.9 في حالتنا هذه) التي قمت بتنصيبها، فقد أصبحت جاهزًا لإنشاء مشروعك الأول على Django. إنشاء المشروع الأول مشروعنا الأول سيكون عبارة عن تطبيق استطلاع بسيط، يتألف من جزئين: موقع عام يتيح مشاهدة الاستطلاعات والتصويت عليها. لوحة تحكم تتيح لنا إضافة وحذف وتعديل الاستطلاعات. هذا المشروع سيكون مبنيًا على الإصدار 1.9 من Django والإصدار 3.4 من Python. في حال كنت تستخدم الإصدار 2.7 من Python فيتوجب عليك حينها إضافة بعض التعديلات على الشيفرة التي تكتبها، وسنشير إلى ذلك في محلّه. انتقل إلى سطر الأوامر وتوجه من خلاله إلى المجلد الذي ترغب استخدامه لإنشاء المشروع، وبإمكانك استخدام أي مجلد تحت أي تسمية وفي أي موقع في القرص الصلب، فلا مشكلة لدى Django في ذلك. لإنشاء المشروع نفّذ الأمر التّالي في سطر الأوامر (انتبه إلى النقطة في نهاية السطر): django-admin startproject mysite . سيعمل هذا الأمر على إنشاء مجلد باسم mysite داخل مجلد المشروع. انتبه كذلك إلى كتابة النقطة في نهاية السطر، فهي توجّه الشيفرة إلى تنصيب Django في المجلد الحالي. البنية الأولية للمشروع يحتوي مجلد mysite الذي أنشأته التعليمة السابقة، على مجموعة الملفات التالية: manage.py /mysite __init__.py settings.py urls.py wsgi.py manage.py، يُوصف هذا الملف بالسكين السويسري، وهو الأداة التي سنستعين بها للقيام بالكثير من الأشياء في إدارة الموقع، وفي تهجير قواعد البيانات وتشغيل الخادوم الخاص بـ Django، وغير ذلك الكثير. المجلد mysite هو حزمة بايثون الخاصة بمشروعنا، وسنستخدم هذا الاسم عندما نرغب في استيراد أي شيء داخله. (مثال mysite.urls). mysite/__init__.py ملف فارغ، ووجوده يعني أن هذا المجلّد هو حزمة من حزم بايثون. mysite/settings.py ملف الإعدادات الخاصة بمشروعنا. mysite/urls.py يحتوي على عناوين URL الخاصة بموقعنا، وهو أشبه ما يكون بجدول المحتويات الخاص بالموقع. mysite/wsgi.py نقطة الولوج إلى الخواديم المتوافقة مع WSGI. تشغيل الخادوم توجه في سطر الأوامر إلى المجلد الذي يحوي الملف manage.py ثم اكتب الأمر التالي: python manage.py runserver وستظهر العبارات التالية في سطر الأوامر: Performing system checks... System check identified no issues (0 silenced). You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them. February 01, 2016 - 15:50:53 Django version 1.9, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. ملاحظة: لا تستخدم هذا الخادوم في المشاريع الإنتاجية على الإطلاق، فالهدف من هذا الخادوم هو استخدامه لأغراض التطوير فقط. أدخل العنوان التالي في متصفح الإنترنت: http://127.0.0.1:8000 ستظهر الصفحة التالية لتشير إلى نجاحنا في إنشاء أول مشروع في Django.
    2 نقاط
  31. يُعتبر مبدأ المسؤوليّة الواحدة Single Responsibility Principle (أو اختصارًا SRP) المبدأ الأوّل من مبادئ التصميم SOLID، وهو مفيد بصورة خاصّة في التصميم كائنيّ التوجّه object-oriented design. يعتمد هذا المبدأ على تجزئة مكوّنات النظام البرمجي بحيث يكون لكلّ جزء منه مهمّة (مسؤوليّة) واحدة ووحيدة. ينص هذا المبدأ على ما يلي: لا يظهر من النص السابق أي إشارة مباشرة إلى المسؤوليّة الواحدة. لتوضيح الربط بين المسؤولية الواحدة وبين نص المبدأ السابق، لننظر إلى المثال التالي الذي يحوي صنفًا مكتوبًا بلغة ++C ويُستخدم للاتصال بخادوم قواعد بيانات MySQL. اسم هذا الصنف MySQL أيضًا، ويمتلك واجهة لتأسيس الاتصال مع خادوم MySQL وإغلاقه، وإرسال استعلامات SQL إلى الخادوم واستقبال ومعالجة النتائج: class MySQL { public: bool connect(); void disconnect(); bool executeQuery(std::string queryString); MySQLResult* getQueryResult(); }; من الواضح أنّ لهذا الصنف مهمّتان أساسيّتان، الأولى هي إدارة عملية الاتصال مع خادوم MySQL (فتح وإغلاق الاتصال) والثانية هي التواصل مع الخادوم في إجراء الاستعلامات واستقبال النتائج (تنفيذ استعلامات SQL). لو افترضنا الآن حدوث السيناريو التالي: أصبح خادوم MySQL يقبل الاتصالات المشفّرة فقط. حدثت بعض التغييرات ضمن الخادوم بحيث أنّه بدأ بالاستجابة بشكل مختلف لبعض الاستعلامات. سيؤدي ذلك بالطبع إلى حدوث تغييرين ضمن صنف MySQL السابق، أو بمعنى آخر، سيكون هناك سببان لتغيير الصنف MySQL. ويُعدّ هذا خرقًا لمبدأ المسؤولية الواحدة كما هو واضح. يُعتبر وضع أكثر من مهمّة قابلة للتغيير (من أجل سبب ما) لأحد الأصناف خطأً تصميميًّا. قد لا تبدو تلك مشكلةً في الوقت الحالي، ولكن أيّ نظام برمجي يتغيّر ويتطوّر. فما يبدو حلًّا مقبولًا في الوقت الحاضر، قد يُفضي إلى نتائج سيّئة في المستقبل. يمكن استخدام الحل التالي لمشكلتنا السابقة: class MySQLConnection { public: bool open(); /* former connect() */ void close(); /* former disconnect() */ }; class MySQLQuery { MySQLConnection* session; public: bool execute(std::string queryString); MySQLResult* getResult(); }; يبدو مبدأ المسؤوليّة الواحدة بسيطًا، ولكنّه في الحقيقة صعب التطبيق. والسبب في ذلك، هو أنّ وضع المسؤوليّات المتعدّدة لصنف ما معًا، هو أمر بديهي ومألوف بالنسبة إلينا، أمّا عملية الفصل والتجزئة إلى أصناف أصغر لكلٍّ منها مسؤوليّة واحدة، فقد لا تبدو جذّابةً أوّل الأمر. بالنسبة لي، عندما عدت وراجعت بعض تصميمات الأصناف القديمة لديّ، قلّما وجدت صنفًا من الممكن جعله يراعي هذا المبدأ. ولكن عندما أمعنت النظر والتفكير وجدت أنّ الفصل في المهام سيقلّل من تعقيد التصميم، وسيجعل الشيفرة أيسر للقراءة والفهم. بالمقابل، فإنّ تطبيق هذا المبدأ بشكل صارم، ليس فكرةً جيّدة. فعلى المرء أن يكون حكيمًا في تحديد متى يمكن تطبيق هذا المبدأ، وخصوصًا عندما يجد أنّ الملف الخاص بأحد أصنافه بات يحتوي على أكثر من 500 سطر من الشيفرة البرمجيّة! ترجمة -وبتصرّف- للمقال Single Responsibility Principle لصاحبه Radek Pazder.
    2 نقاط
  32. سيُطلَب منك بلا شك خلال عملية التطوير تشغيل بعض الأوامر في الطرفية Terminal أو على سطر الأوامر Command Line، لذلك سنقدّم من خلال هذا المقال مقدمة عن الطرفية، والأوامر الأساسية التي ستحتاج إلى إدخالها، وكيفية ربط الأوامر مع بعضها بعضًا، وإضافة أدوات واجهة سطر الأوامر Command Line Interface -أو CLI اختصارًا- الخاصة بك. المتطلبات الأساسية: الإلمام بأساسيات لغات HTML وCSS وجافاسكربت. الهدف: فهم سطر الأوامر أو الطرفية، والأوامر الأساسية التي يجب تعلمها، وكيفية تثبيت أدوات سطر أوامر جديدة. الطرفية Terminal الطرفية هي واجهة نصية تُستخدَم لتنفيذ البرامج النصية. إذا شغّلتَ أدوات تطوير الويب، فهناك فرصة كبيرة لفتح سطر الأوامر وتشغيل بعض الأوامر لاستخدام الأدوات التي اخترتها، إذ سيُشار إلى هذه الأدوات باسم أو أدوات واجهة سطر الأوامر Command Line Interface أو أدوات CLI اختصارًا. يمكن استخدام عدد كبير من الأدوات عن طريق كتابة الأوامر في سطر الأوامر، ويكون العديد منها مثبتًا مسبقًا على نظامك، ويمكن تثبيت أدوات أخرى من سجلات الحزم التي تشبه متاجر التطبيقات، ولكن تُستخدَم غالبًا للأدوات والبرامج المستندة إلى سطر الأوامر. يفتقر سطر الأوامر إلى تجربة المستخدم، بل إن التجربة الأولى مع سطر الأوامر غالبًا ما تكون متعبة وصعبة الاستخدام نسبيًا، إذ يحتوي على شاشة فارغة ومؤشر وامض مع قليل من المساعدة الواضحة المتاحة بشأن ما يجب تطبيقه، لكننا نعدك أن استخدامه سيصبح أسهل مع قليل من التوجيه والممارسة، وسنُساعدك في هذا المقال للبدء في هذه البيئة. نشأت الطرفية في الخمسينات والستينات من القرن الماضي، ولكن شكلها الأصلي لا يشبه ما نستخدمه اليوم. بقيت الطرفية منذ ذلك الحين ميزة ثابتة في جميع أنظمة التشغيل من أجهزة سطح المكتب إلى خوادم السحابة إلى الحواسيب الصغيرة مثل Raspberry PI Zero وحتى الهواتف المحمولة. توفر الطرفية وصولًا مباشرًا إلى نظام ملفات الحاسوب الأساسي والميزات منخفضة المستوى، وبالتالي تُعَد مفيدة لأداء المهام المعقدة بسرعة. كما أنها مفيدة في عملية الأتمتة مثل كتابة أمر لتحديث أسماء مئات الملفات فوريًا كتعديل اسم الملف "ch01-xxxx.png" إلى "ch02-xxxx.png"، فإذا حدّثتَ أسماء الملفات باستخدام تطبيق Finder أو Explorer GUI، فسيستغرق الأمر وقتًا طويلًا. يمكنك من خلال الشكل الآتي رؤية بعض الأشكال المختلفة للبرامج المتوفرة التي يمكن أن تنقلك إلى الطرفية، وتظهَر موجِّهات الأوامر المتوفرة في ويندوز مثل برامج Cmd و Powershell التي يمكن تشغيلها من قائمة ابدأ عن طريق كتابة اسم البرنامج. كما يوضّح الشكل التالي تطبيق طرفية نظام ماك macOS: كيفية الوصول إلى الطرفية يستخدم العديد من المطورين حاليًا أدوات تستند إلى يونيكس مثل الطرفية والأدوات التي يمكنك الوصول إليها من خلالها، إذ تدعم العديد من الأدوات الموجودة على الويب الأنظمة التي تستند إلى يونيكس، ولكن لا داعي للقلق، فهي متوفرة في معظم الأنظمة. سنوضّح فيما يلي كيفية الوصول إلى الطرفية على النظام الذي تريده. لينكس أو يونيكس: تحتوي أنظمة لينكس أو يونيكس طرفية متاحة افتراضيًا مدرجَة ضمن تطبيقاتك. نظام ماك macOS: يحتوي نظامًا يسمى داروين Darwin يقع أسفل واجهة المستخدم الرسومية ويشبه نظام يونيكس، ويوفر الطرفية والوصول إلى الأدوات ذات المستوى المنخفض. الطرفية متاحة على نظام ماك من خلال المسار Applications/Utilities/Terminal. ويندوز: لم يكن استخدام الطرفية أو سطر الأوامر على ويندوز بسيطًا أو سهلًا كما هو الحال في أنظمة التشغيل الأخرى، ولكن الأمور تتحسن مع مرور الوقت. لطالما امتلك ويندوز برنامجًا شبيهًا بالطرفية يسمى Cmd أو موجه الأوامر، ولكنه ليس متكافئًا مع أوامر يونيكس، بل يكافئ موجه ويندوز دوز Windows DOS ذي النمط القديم. توجد برامج أفضل لتوفير طرفية على ويندوز مثل PowerShell وGitbash الذي يكون جزءًا من مجموعة أدوات git for Windows. لكن أفضل خيار لنظام ويندوز حاليًا هو نظام ويندوز الفرعي لنظام لينكس Windows Subsystem for Linux -أو WSL اختصارًا، وهو طبقة توافق لتشغيل أنظمة تشغيل لينكس مباشرة من داخل الإصدار رقم 10 من ويندوز، مما يتيح لك تشغيل طرفية حقيقية مباشرة على ويندوز دون الحاجة إلى آلة افتراضية، ويمكن تثبيت نظام WSL مباشرة من متجر ويندوز مجانًا. نوصي بشدة بتثبيت نظام WSL، ويمكنك التمسك باستخدام موجّه الأوامر الافتراضي cmd إذ ستعمل أدوات متعددة بطريقة صحيحة، ولكنك ستجد الأمور أسهل إذا كان لديك تكافؤ أفضل مع أدوات يونيكس. هناك فرق بين الطرفية وسطر الأوامر، فالطرفية تقنيًا هي برنامج يبدأ ويتصل بالصدفة Shell التي تُعَد بيئة جلستك إذ يمكنك تخصيص أشياء مثل الموجه والاختصارات، بينما سطر الأوامر هو السطر الحرفي الذي تكتب فيه الأوامر ويومض المؤشر. إذا استخدمت أدواتٍ مثل Visual Studio Code، فهناك مجموعة كبيرة من الامتدادات التي يمكن استخدامها كوكيل Proxy لاستخدام أوامر الطرفية دون الحاجة إلى استخدامها مباشرة، وبالرغم من وجود الكثير من الأدوات المتاحة في سطر الأوامر. لكنك لن تجد امتدادًا لمحرر الشيفرات لكل ما تريده، لذلك سيتعين عليك اكتساب خبرة في استخدام الطرفية في النهاية. أوامر المدمجة الأساسية في الطرفية إليك بعض الأشياء التي يمكن لسطر الأوامر تطبيقها، بالإضافة إلى أسماء الأدوات ذات الصلة بكل حالة: انقل نظام ملفات حاسوبك إلى جانب مهام المستوى الأساسي مثل الإنشاء والنسخ وإعادة التسمية والحذف: التنقل بين المجلدات باستخدام الأمر cd. إنشاء مجلد باستخدام الأمر mkdir. إنشاء ملفات وتعدّيل بياناتها الوصفية باستخدام الأمر touch. نسخ الملفات باستخدام الأمر cp. نقل الملفات باستخدام الأمرmv. حذف الملفات أو المجلدات باستخدام الأمر rm. تنزيل الملفات الموجودة في عناوين URL محدَّدة باستخدام الأمر curl. البحث عن أجزاء نصية ضمن مجموعات نصية أكبر باستخدام الأمر grep. عرض محتويات ملف بمقدار صفحة تلو الأخرى باستخدام الأمر less وcat. معالجة وتحويل مجاري النصوص مثل تغيير جميع وسوم <div> في ملف HTML إلى <article> باستخدام الأوامر awk وtr وsed. التنقل في سطر الأوامر ستحتاج حتمًا إلى الانتقال إلى مسار معين عندما تزور سطر الأوامر. تشغّل جميع أنظمة التشغيل برنامجها الطرفي في المسار الموجود فيه سطر الأوامر، وغالبًا سترغبُ بالانتقال إلى لمسار مختلف. يتيح لك الأمر cd تغيير الدليل Change Directory، وليس هذا الأمر برنامجًا وإنما مبني مسبقًا، إذ لا يمكنك حذفه عن طريق الخطأ. لا داعي للقلق كثيرًا بشأن ما إذا كان الأمر مبنيًا مسبقًا أم لا، ولكن ضع في بالك أن الأوامر المبنية مسبقًا تظهر في جميع الأنظمة القائمة على نظام يونيكس. يمكنك تغيير المسار من خلال كتابة الأمر cd في الطرفية متبوعًا بالمجلد الذي تريد الانتقال إليه. يمكنك استخدام الأمر cd Desktop بافتراض وجود المجلد ضمن المسار الرئيسي كما يلي: اكتب الأمر التالي في طرفية نظامك: cd Desktop إذا أردتَ الرجوع إلى المسار السابق، فيمكنك استخدام نقطتين كما يلي: cd.. هناك اختصار في الطرفية مفيد جدًا وهو استخدام مفتاح tab لإكمال الأسماء تلقائيًا التي تعرف أنها موجودة بدلًا من كتابة اسم المجلد بالكامل فمثلًا كتابة الأمر cd D ثم الضغط على مفتاح tab، سيكمل سطر الأوامر كتابة اسم المجلد Desktop نيابةً عنك، بشرط وجوده في المجلد الحالي. إذا كان المجلد الذي تريد الانتقال إليه متداخلًا، فيجب أن تعرف المسار للوصول إليه، إذ يصبح ذلك أسهل عندما تصبح أكثر دراية بمعمارية نظام ملفاتك، ولكن إن لم تكن متأكدًا من المسار، فيمكنك اكتشافه باستخدام الأمر ls، ومن خلال النقر في نافذة المستكشف Explorer أو Finder لمعرفة مكان المجلد بناءً على مكان وجودك حاليًا. إذا أردت الانتقال مثلًا إلى مجلد يسمى src يقع ضمن مجلد اسمه project موجود على سطح المكتب Desktop، فيمكنك كتابة هذه الأوامر الثلاثة للوصول إلى هناك من مجلدك الرئيسي كما يلي: cd Desktop cd project cd src ولكن يمكنك كتابة أمر واحد مع العناصر المختلفة في المسار مفصول بينها بشرطة مائلة للأمام، تمامًا كما تفعل عند تحديد مسارات للصور أو الأصول الأخرى في شيفرة CSS أو HTML أو جافاسكربت: cd Desktop/project/src لاحظ أن تضمين شرطة مائلة في المسار يجعله مسارًا مطلقًا مثل ‎/Users/your-user-name/Desktop، إذ يؤدي حذف الشرطة المائلة في المقدمة كما فعلنا سابقًا إلى جعل المسار مسارًا نسبيًا متعلقًا بمجلد العمل الحالي، وهذا هو بالضبط ما تراه مع عناوين URL في متصفح الويب، إذ تعني الشرطة المائلة في البداية جذر موقع الويب، بينما يعني حذف الشرطة المائلة أن عنوان URL متعلق بصفحتي الحالية. يستخدم نظام ويندوز الشرطة المائلة للخلف بدلًا من الشرطة المائلة للأمام مثل الأمر التالي: cd Desktop\project\src سرد محتويات مجلد الأمر ls مبني مسبقًا في نظام التشغيل يونيكس وهو اختصار للكلمة الأجنبية List، ووظيفته سرد محتويات المجلد الذي تتواجد فيه حاليًا. لاحظ أن هذا الأمر لن ينجح إذا استخدمتَ موجّه أوامر ويندوز الافتراضي cmd، فالأمر المكافئ له هو dir. شغّل الأمر التالي في الطرفية: ls يمنحك الأمر ls قائمة بالملفات والمجلدات الموجودة في مجلد العمل الحالي، ولكنها معلومات أساسية، وستحصل فقط على اسم كل عنصر موجود دون معرفة نوعه. يمكن أن يمنحك تغيير بسيط في استخدام هذا الأمر كثيرًا من المعلومات. خيارات الأوامر تحتوي معظم أوامر الطرفية على خيارات، هي المعدّلات Modifiers التي تضيفها إلى نهاية الأمر، مما يجعله يتصرف بطريقة مختلفة. تتكون هذه الخيارات عادةً من مسافة بعد اسم الأمر، متبوعة بشرطة، متبوعة بحرف واحد أو أكثر. جرب الأمر التالي على سبيل المثال، وشاهد النتيجة: ls -l يمنحك الخيار ‎-l في الأمر ls قائمة بملف أو مجلد واحد في كل سطر ومعلومات أخرى. يمكن التعرف على المجلدات من خلال البحث عن الحرف "d" على الجانب الأيسر من السطور، إذ يمكننا استخدام الأمر cd مع هذه المجلدات. يوضّح الشكل الآتي طرفية نظام ماك الصرفة في الجزء العلوي، وطرفية مخصّصة مع بعض الرموز والألوان الإضافية في الجزء السفلي، وكلاهما يعرض نتائج تشغيل الأمر ls -l: الإنشاء والنسخ والنقل والإزالة هناك عدد من الأوامر الأساسية الأخرى التي يُحتمَل أن تستخدمها كثيرًا أثناء عملك مع الطرفية. هذه الأوامر بسيطة جدًا، لذا لن نشرحها بقدر كبير من التفاصيل مثل الأمرين السابقين. استخدم أمثلة الأوامر التالية لفهمها: mkdir: يؤدي هذا الأمر إلى إنشاء مجلد جديد ضمن المجلد الحالي الذي تتواجد فيه، مع الاسم الذي تقدمه بعد الأمر، فمثلًا سينشئ الأمر mkdir my-awesome-website مجلدًا جديدًا اسمه my-awesome-website. rmdir: يزيل هذا الأمر المجلد المحدد إذا كان فارغًا فقط، فمثلًا سيزيل الأمر rmdir my-awesome-website المجلد الذي أنشأناه سابقًا. إذا أردتَ إزالة مجلد غير فارغ وإزالة كل ما يحتويه، فيمكنك استخدام الخيار ‎-r وهو اختصار recursive تكراري، ولكن يجب الانتباه عند استخدامه، إذ يجب أن تتأكد من عدم وجود أيّ شيء يمكن أن تحتاجه داخل المجلد، إذ سيختفي إلى الأبد. touch: ينشئ هذا الأمر ملفًا فارغًا جديدًا ضمن المجلد الحالي، فمثلًا ينشئ الأمر touch mdn-example.md ملفًا فارغًا جديدًا اسمه mdn-example.md. mv: ينقل هذا الأمر ملفًا من موقع الملف الأول المحدَّد إلى موقع الملف المحدد الثاني، وينقل الأمر mv mdn-example.md mdn-example.txt الملف mdn-example.md في المجلد الحالي إلى الملف mdn-example.txt في المجلد الحالي (تُكتَب المواقع كمسارات ملفات)، إذ يُعَد الملف منقولًا، ولكن هذا الأمر يعيد تسمية الملف فعليًا. cp: يشبه الأمر mv في الاستخدام، إذ ينشئ الأمر cp نسخة من الملف الموجود ضمن الموقع الأول المحدد في الموقع الثاني المحدَّد، إذ يُنشئ الأمر cp mdn-example.txt mdn-example.txt.bak نسخة من الملف mdn-example.txt بالاسم mdn-example.txt.bak، ويمكنك بالطبع تسمية هذه النسخة باسم آخر إذا أدرتَ ذلك. rm: يزيل هذا الأمر الملف المحدَّد، فمثلًا يحذف الأمر rm mdn-example.txt ملفًا اسمه mdn-example.txt. لاحظ أن هذا الحذف نهائي ولا يمكن التراجع عنه عبر سلة المحذوفات الموجودة غالبًا على واجهة مستخدم سطح المكتب. تسمح لك العديد من أوامر الطرفية باستخدام العلامات النجمية بوصفها محارف بدل Wild Card مع أيّ تسلسل من المحارف، مما يسمح بتشغيل عملية على عدد كبير من الملفات في الوقت نفسه، وتتطابق جميعها مع النمط المحدد، إذ يحذف الأمر rm mdn-*‎ جميع الملفات التي تبدأ بسلسلة المحارف mdn-‎، بينما يحذف الأمر rm mdn-*.bak جميع الملفات التي تبدأ بسلسلة المحارف mdn-‎ وتنتهي بسلسلة المحارف ‎.bak. هل تعد الطرفية خطيرة؟ عليك توخي الحذر عند استخدام الطرفية. لا تحمل الأوامر البسيطة الكثير من المخاطر، ولكن إذا جمّعتَ أوامرًا أكثر تعقيدًا، فعليك التفكير مليًا فيما ستفعله هذه الأوامر، ومحاولة اختبارها أولًا قبل تشغيلها في المجلد المحدَّد. لنفترض أن لديك 1000 ملف نصي في مجلد، وأردت الاطلاع عليها جميعًا وحذف الملفات التي يحتوي اسمها على سلسلة فرعية معينة. إن لم تكن حذرًا، يمكن أن ينتهي بك الأمر بحذف شيء مهم، وبالتالي تفقد عملك خلال هذه العملية. إحدى العادات الجيدة التي يجب عليك اتباعها هي كتابة الأمر ضمن محرر نصوص، ثم إنشاء نسخة احتياطية من مجلدك وتشغيل الأمر على هذه النسخة أولًا لاختباره. إن لم تكن مرتاحًا لتجربة أوامر الطرفية على جهازك الخاص، فيمكنك تجربتها في مكان آمن هو Glitch.com الذي يُعَد مكانًا رائعًا لتجربة شيفرة تطوير الويب، بالإضافة إلى إمكانية الوصول إلى طرفية، إذ يمكنك تشغيل كل هذه الأوامر مباشرة فيها. يُعَد tldr.sh من الموارد الرائعة للحصول على نظرة عامة وسريعة على أوامر طرفية معينة، وهي خدمة توثيق مقادَة من المجتمع على غرار MDN، ولكنها خاصة بالأوامر الطرفية. لنتعلّم الآن كيفية توصيل الأدوات مع بعضها في سطر الأوامر. ربط الأوامر باستخدام الأشرطة العمودية تعرّفنا سابقًا على الأمر ls الذي يعرض محتويات المجلد الحالي: ls ولكن إذا أردنا حساب عدد الملفات والمجلدات بسرعة ضمن المجلد الحالي، فلن يستطيع الأمر ls ذلك من تلقاء نفسه. هناك أداة أخرى متاحة من يونيكس تسمى wc تحسب عدد الكلمات أو الأسطر أو المحارف أو البايتات لكل ما يُوضَع فيها، إذ يمكن أن يكون ذلك ملفًا نصيًا، إذ ينتج عن تنفيذ الأمر التالي عدد الأسطر في الملف myfile.txt: wc -l myfile.txt كما يمكنها حساب عدد الأسطر لخرج أي أمر يُربَط معها من خلال رمز الشريط العمودي |، وسيحسبُ الأمر التالي عدد الأسطر الناتجة عن الأمر ls -أي ما سيطبعه إلى الطرفية إذا شُغِّل بمفرده- ويخرج عدد الأسطر في الطرفية: ls | wc -l بما أن الأمر ls يطبع كل ملف أو مجلد على سطر خاص به، فهذا يعطينا عدد الأدلة والملفات بفعالية. تطبع أدوات سطر أوامر يونيكس النص إلى الطرفية، ويشار إليها بالطباعة إلى الخرج المعياري Printing To Standard Output أو STDOUT اختصارًا، إذ يمكن لعدد كبير من الأوامر قراءة المحتوى من مجرى الدخل المعروف باسم الدخل المعياري Standard Input أو STDIN اختصارًا. يربط المعامل | هذه المدخلات والمخرجات مع بعضها، مما يسمح ببناء عمليات أكثر تعقيدًا لتناسب احتياجاتنا، إذ يمكن أن يصبح خرج أحد الأوامر دخلًا للأمر الذي بعده. يطبع الأمر ls عادةً خرجه إلى STDOUT، ولكن يُربَط خرجه مع الأمر wc من خلال الرمز | سيأخذ الأمر wc هذا الخرج بوصفه دخلًا له، ويحسب عدد الأسطر، ويطبعها إلى STDOUT. مثال أكثر تعقيدا سنحاول أولًا جلب محتويات صفحة "fetch" من MDN باستخدام الأمر curl الذي يمكن استخدامه لطلب المحتوى من عناوين URL مثل الرابط الآتي: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch كما يلي: curl https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch لن تحصل على خرج بسبب إعادة توجيه الصفحة إلى ‎/Web/API/fetch، إذ يجب إعلام الأمر curl صراحةً باتباع عمليات إعادة التوجيه باستخدام الراية ‎-L. لنلقِ نظرةً على الترويسات التي يعيدها developer.mozilla.org باستخدام الراية ‎-I الخاصة بالأمر curl، ونطبع جميع عمليات إعادة التوجيه التي يرسلها الموقع إلى الطرفية عن طريق ربط خرج الأمر curl مع الأمر grep باستخدام الرمز |، وسنطلبُ من الأمر grep إعادة جميع الأسطر التي تحتوي على الكلمة "location". حاول تشغيل الأمر التالي (لاحظ أن هناك إعادة توجيه واحدة فقط قبل أن نصل إلى الصفحة الأخيرة): curl https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch -L -I | grep location يجب أن يبدو الخرج كما يلي، إذ سينتج الأمر curl أولًا بعض عدّادات التنزيل أو ما شابه ذلك: location: /en-US/docs/Web/API/fetch كما يمكننا تحويل محتويات سطور الموقع location:‎، وإضافة الأصل الأساسي إلى بداية كل منها لنحصل على عناوين URL كاملة مطبوعة، لذلك سنضيف الأمر awk، وهي لغة برمجة تشبه جافاسكربت أو روبي Ruby أو بايثون Python، ولكنها أقدم منها. شغّل الأمر التالي: curl https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch -L -I | grep location | awk '{ print "https://developer.mozilla.org" $2 }' ويجب أن يكون الخرج النهائي كما يلي: https://developer.mozilla.org/en-US/docs/Web/API/fetch خصّصنا الخرج من خلال دمج هذه الأوامر لإظهار عناوين URL الكاملة التي يعيد خادم Mozilla التوجيه من خلالها عندما نطلب العنوان ‎/docs/Web/API/WindowOrWorkerGlobalScope/fetch. إضافة مزايا ألقينا نظرة على بعض الأوامر المبنية مسبقًا التي يأتي نظامك مزودًا بها، ولنلقِ نظرة الآن على كيفية تثبيت أداة CLI لجهة خارجية والاستفادة منها. يتوفر حاليًا النظام المجتمعي الواسع للأدوات القابلة للتثبيت لتطوير واجهة الويب الأمامية ضمن npm، وهي خدمة استضافة حزم يملكها القطاع الخاص، وتعمل بصورة وثيقة مع Node.js، ولكن يمكنك أن تتوقع رؤية مزيد من مزودي الحزم مع مرور الوقت. يؤدي تثبيت Node.js إلى تثبيت أداة سطر أوامر npm وأداة إضافية تعتمد على npm تسمى npx، وتوفر أداة npm بوابة لتثبيت أدوات سطر أوامر إضافية. يعمل Node.js وnpm بالطريقة نفسها في جميع الأنظمة: ماك macOS وويندوز Windows ولينكس Linux. ثبّت أداة npm على نظامك الآن مع تنزيل وتشغيل مثبّت Node.js المناسب لنظام تشغيلك. إذا طُلب منك ذلك، فتأكد من تضمين npm كجزء من عملية التثبيت. كما سنتعرّف على أداة Prettier، وهي أداة لتنسيق الشيفرات البرمجية وتحتوي على عدة خيارات بسيطة. مكان تثبيت أدوات CLI يمكننا تثبيت الأدوات بطريقة عامة باستخدام npm لنتمكن من الوصول إليها في أي مكان، أو محليًا في مجلد المشروع الحالي. هناك إيجابيات وسلبيات في كل طريقة، وهذه القائمة توضح إيجابيات وسلبيات التثبيت العام للأدوات: table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } إيجابيات التثبيت العام سلبيات التثبيت العام يمكن الوصول إليها من أي مكان في الطرفية يمكن ألّا تكون متوافقة مع شيفرة مشروعك تُثبَّت مرة واحدة فقط لن يتمكن المطورون الآخرون في فريقك من الوصول إلى هذه الأدوات، مثل مشاركة قاعدة شيفرتك عبر أداة مثل git. يستهلك مساحة أقل على القرص الصلب تتعلق هذه النقطة بالنقطة السابقة، إذ يصعب نسخ شيفرة المشروع (إذا ثبّت أدواتك محليًا، فيمكن إعدادها كاعتماديات وتثبيتها باستخدام الأمر npm install). الإصدار نفسه دائمًا يبدو مثل أي أمر يونيكس آخر يُحتمَل أن يكون التأثير السلبي للتثبيت العام أكبر بكثير من الفوائد بالرغم من أن قائمة السلبيات أقصر، ولكننا سنثبّت الأدوات بطريقة عامة لإبقاء الأمور بسيطة. سنلقي نظرة أكثر على عمليات التثبيت المحلية وفوائدها في المقال التالي. تثبيت Prettier سنثبّت أداة Prettier بوصفها أداة مساعدة عامة لسطر الأوامر، وهي أداة تنسيق شيفرة لمطوري الواجهة الأمامية، وتركز على اللغات المستندة إلى لغة جافاسكربت بالإضافة إلى دعمها لغات HTML و CSS و SCSS و JSON وغير ذلك. يمكن أن تطبّق أداة Prettier ما يلي: حفظ العبء المعرفي المتمثل في جعل النمط متسقًا يدويًا عبر جميع ملفات شيفرتك، إذ يمكن أن تطبّق Prettier ذلك تلقائيًا. مساعدة المتعلمين الجدد في تطوير الويب على تنسيق شيفرتهم من خلال تطبيق أفضل الممارسات. يمكن تثبيتها على أي نظام تشغيل وكجزء مباشر من أدوات المشروع، مما يضمن لزملائك وأصدقائك الذين يعملون على شيفرتك أن يستخدموا نمط الشيفرة الذي تستخدمه. يمكن تهيئتها للتشغيل عند الحفظ، أو أثناء الكتابة، أو حتى قبل نشر الشيفرة. افتح الطرفية بعد تثبيت نود وشغّل الأمر التالي لتثبيت Prettier: npm install --global prettier تصبح بعد ذلك أداة Prettier متاحة في الطرفية وفي أيّ مكان في نظام ملفاتك. سيؤدي تشغيل الأمر بدون أي وسطاء -كما هو الحال مع العديد من الأوامر الأخرى- إلى تقديم معلومات حول كيفية الاستخدام والمساعدة. جرب الأمر التالي وشاهد النتيجة: prettier يجب أن يبدو الخرج كما يلي: Usage: prettier [options] [file/glob ...] By default, output is written to stdout. Stdin is read if it is piped to Prettier and no files are given. … يجب دائمًا الاطلاع على معلومات الاستخدام على الأقل، حتى لو كانت طويلة، لأنها ستساعدك في فهم كيفية استخدام الأداة بطريقة أفضل. لنجرب استخدام الأداة Prettier لنتمكن من معرفة كيفية عملها. أنشئ أولًا مجلدًا جديدًا في مكان ما على نظام ملفاتك يسهل العثور عليه مثل مجلد اسمه prettier-test على سطح المكتب Desktop، ثم احفظ الشيفرة التالية في ملف جديد يسمى index.js ضمن مجلد الاختبار: const myObj = { a:1,b:{c:2}} function printMe(obj){console.log(obj.b.c)} printMe(myObj) يمكننا أن نشغّل prettier في قاعدة الشيفرة للتحقق من حاجة شيفرتنا لتعديلٍ ما. شغّل الأمر cd للانتقال إلى مجلدك، وشغّل الأمر التالي: prettier --check index.js ويجب أن تحصل على الخرج التالي: Checking formatting... index.js Code style issues found in the above file(s). Forgot to run Prettier? لذلك هناك بعض أنماط الشيفرات التي يمكن إصلاحها، سيؤدي إضافة الخيار ‎--write إلى الأمر prettier إلى إصلاح هذه المشاكل، مما يجعلنا نركز على كتابة شيفرة مفيدة فقط. شغّل إصدار الأمر التالي: prettier --write index.js وستحصل على الخرج التالي: Checking formatting... index.js Code style issues fixed in the above file(s). ولكن إذا نظرت إلى ملف جافاسكربت الخاص بك، فستجد أنه منسَّق مثل الشيفرة التالية: const myObj = { a: 1, b: { c: 2 }, }; function printMe(obj) { console.log(obj.b.c); } printMe(myObj); يمكنك جعل هذا التنسيق جزءًا تلقائيًا من عمليتك بناءً على طريقة سير عملك. الأتمتة هي المكان الذي تتفوق فيه الأدوات، وأفضل أتمتة هي الأتمتة الذي "يحدث على الفور" دون الحاجة إلى إعداد أي شيء. هناك عدد من الطرق التي يمكن من خلالها تحقيق الأتمتة مع أداة Prettier. هناك بعض الموارد الممتازة عبر الإنترنت للمساعدة، على الرغم من أن ذلك خارج نطاق هذا المقال. يمكنك استدعاء أداة Prettier: قبل تأكيد شيفرتك في مستودع git باستخدام Husky. عندما تضغط على "حفظ" في محرر الشيفرة، سواء أكان محرر VS Code أو Atom أو Sublime Text. بوصفها جزءًا من فحوصات التكامل المستمرة باستخدام أدوات مثل Github Actions. تفضيلنا الشخصي هو الخيار الثاني -أثناء استخدام محرر VS Code، وتعمل Prettier على تشغيل وتنظيف أي تنسيق تحتاجه في كل عملية حفظ. أدوات أخرى إليك قائمة مختصرة ممتعة من الأدوات لتجربتها: bat: النسخة الأفضل من الأداة cat (تُستخدم cat لطباعة محتويات الملفات). prettyping: نفّذ الأمر ping على سطر الأوامر. تُعَد أداة ping مفيدة للتحقق مما إذا كان الخادم يستجيب. htop: عارض للعمليات، مفيد عندما يكون هناك شيء ما يجعل مروحة وحدة المعالجة المركزية الخاصة بك تتصرف مثل محرك نفاث وتريد تحديد البرنامج المخالف. tldr: متاح بوصفه أداة لسطر الأوامر. لاحظ أن بعض الاقتراحات السابقة يمكن أن تحتاج إلى التثبيت باستخدام npm، كما فعلنا مع Prettier. هذا المقال جزء من سلسلة مقالات بعنوان تعلم تطوير الويب والتي تشرح كامل عملية تطوير الويب من واجهات أمامية وخلفية بالكامل. ترجمة -وبتصرُّف- للمقال Command line crash course. اقرأ أيضًا المقال التالي: أدوات مطوري الويب المدمجة في المتصفحات المقال السابق: فهم أدوات تطوير الويب من طرف العميل كيف تستخدم أدوات المطوِّر في المتصفحات الحديثة الفرق بين صفحة الويب وموقع الويب وخادم الويب ومحرك البحث
    1 نقطة
  33. يمكنك كتابة برامج لإرسال رسائل البريد الإلكتروني والرسائل النصية القصيرة SMS لإعلامك بالأشياء حتى عندما تكون بعيدًا عن حاسوبك. إذا أجريتَ أتمتةً لمهمة تستغرق بضع ساعات لإنجازها، فلن ترغب في العودة إلى حاسوبك كل بضع دقائق للتحقق من حالة البرنامج، لذا يمكن لبرنامجك إرسال رسالة نصية إلى هاتفك عند الانتهاء فقط، مما يحرّرك من التركيز على أشياء أكثر أهمية عندما تكون بعيدًا عن حاسوبك. إرسال رسائل نصية باستخدام بوابات البريد الإلكتروني لخدمة الرسائل القصيرة SMS تكون الهواتف الذكية في متناول أيدينا أكثر من الحواسيب، لذلك تُعَد الرسائل النصية وسيلةً فورية وموثوقية لإرسال الإشعارات أكثر من البريد الإلكتروني، وتكون الرسائل النصية أقصر، ممّا يزيد من احتمالية أن يتمكّن الشخص من قراءتها. الطريقة الأسهل والأكثر موثوقية لإرسال رسائل نصية هي استخدام بوابة البريد الإلكتروني لخدمة الرسائل القصيرة SMS (أو Short Message Service)، وهذه البوابة هي خادم بريد إلكتروني يُعِدّه مزوّد الهاتف المحمول لتلقي الرسائل النصية عبر البريد الإلكتروني ثم يوجّهها إلى المستلم بوصفها رسالة نصية. يمكنك كتابة برنامج لإرسال رسائل البريد الإلكتروني باستخدام الوحدتين ezgmail أو smtplib، حيث يشكّل كلٌّ من رقم الهاتف وخادم البريد الإلكتروني لشركة الهاتف عنوانَ البريد الإلكتروني للمستلم، وسيكون موضوع ونص Body البريد الإلكتروني هو نص الرسالة النصية، فمثلًا يمكنك إرسال رسالة نصية إلى رقم الهاتف 415‎-555-1234 الذي يملكه عميل شركة Verizon من خلال إرسال بريد إلكتروني إلى العنوان 4155551234‎@vtext.com. يمكنك العثور على بوابة البريد الإلكتروني لخدمة الرسائل القصيرة SMS الخاصة بمزوّد الهاتف المحمول من خلال إجراء بحث على الويب عن اسم مزوّد بوابة البريد الإلكتروني لخدمة الرسائل القصيرة، ولكن يوضّح الجدول الآتي هذه البوابات للعديد من مزوّدي الخدمة المشهورين. يمتلك العديد من المزوّدين خوادم بريد إلكتروني منفصلة للرسائل النصية القصيرة، والتي تحدّد أن تحتوي الرسائل على 160 محرفًا، وخوادم أخرى منفصلة لخدمة رسائل الوسائط المتعددة MMS، والتي ليس لها حد أقصى لعدد المحارف. إذا أردتَ إرسال صورة، فيجب استخدام بوابة MMS وإرفاق الملف بالبريد الإلكتروني. إن لم تعرف مزوّد الهاتف المحمول للمستلم، فيمكنك تجربة استخدام موقعٍ للبحث عن شركة الاتصالات، والذي يجب أن يوفّر شركة الاتصالات الخاصة برقم الهاتف، حيث يمكنك العثور على هذه المواقع من خلال البحث في الويب عن مزود الهاتف المحمول لرقمٍ ما. ستتيح لك العديد من هذه المواقع البحث عن الأرقام مجانًا بالرغم من أنها ستفرض عليك رسومًا إذا كنت بحاجة إلى البحث عن مئات أو آلاف أرقام الهواتف من خلال واجهة برمجة التطبيقات الخاصة بها. يوضّح الجدول التالي بوابات البريد الإلكتروني لخدمة الرسائل القصيرة الخاصة بمزوّدي خدمات الهاتف المحمول: مزود الهاتف الخليوي بوابة SMS بوابة MMS AT&T البوابة number@txt.att.net البوابة number@mms.att.net Boost Mobile البوابة number@sms.myboostmobile.com بوابة SMS نفسها Cricket البوابة number@sms.cricketwireless.net البوابة number@mms.cricketwireless.net Google Fi البوابة number@msg.fi.google.com بوابة SMS نفسها Metro PCS البوابة number@mymetropcs.com بوابة SMS نفسها Republic Wireless البوابة number@text.republicwireless.com بوابة SMS نفسها Sprint البوابة number@messaging.sprintpcs.com البوابة number@pm.sprint.com T-Mobile البوابة number@tmomail.net بوابة SMS نفسها U.S. Cellular البوابة number@email.uscc.net البوابة number@mms.uscc.net Verizon البوابة number@vtext.com البوابة number@vzwpix.com Virgin Mobile البوابة number@vmobl.com البوابة number@vmpix.com XFinity Mobile البوابة number@vtext.com البوابة number@mypixmessages.com تُعَد بوابات البريد الإلكتروني لخدمة SMS مجانية وسهلة الاستخدام، ولكن لها بعضٌ من العيوب الرئيسية وهي: لا يوجد أيّ ضمان بأن النص سيصل مباشرةً أو قد لا يصل أبدًا. لا توجد طريقة لمعرفة فشل النص في الوصول. لا توجد طريقة للرد خاصةٌ بمستلم النص. قد تحظرك بوابات SMS إذا أرسلتَ عددًا كبيرًا جدًا من رسائل البريد الإلكتروني، ولا توجد طريقة لمعرفة عدد الرسائل التي ستكون "أكثر من الحد المسموح". لا يعني أن بوابة SMS تسلّم رسالة نصية اليوم أنها ستعمل غدًا. يُعَد إرسال النصوص عبر بوابة SMS مثاليًا عندما تحتاج إلى إرسال رسالة عابرة غير عاجلة، وإذا كنت بحاجة إلى خدمة أكثر موثوقية، فاستخدم خدمة بوابة SMS التي ليست عبر البريد الإلكتروني كما سنوضّح لاحقًا. إرسال رسائل نصية باستخدام خدمة Twilio ستتعلّم في هذا القسم كيفية التسجيل في خدمة Twilio المجانية واستخدام وحدة بايثون الخاصة بها لإرسال رسائل نصية. خدمة Twilio هي خدمة بوابة SMS، مما يعني أنها تسمح لك بإرسال رسائل نصية من برامجك عبر الإنترنت. يحتوي الحساب التجريبي المجاني لخدمة Twilio على كمية محدودة من الرصيد وستكون النصوص مسبوقة بجملة أن النص مُرسَل من حساب Twilio تجريبي "Sent from a Twilio trial account"، ولكن قد تكون هذه الخدمة التجريبية مناسبة لبرامجك الشخصية. ليست خدمة Twilio خدمة بوابة SMS الوحيدة، فإن لم تفضل استخدام Twilio، فيمكنك العثور على خدمات بديلة من خلال البحث عبر الإنترنت عن "free sms" أو "gateway" أو "python sms api" أو حتى "بدائل twilio". ثبّت الوحدة twilio باستخدام الأمر pip install --user --upgrade twilio على نظام ويندوز Windows (أو استخدم الأداة pip3 على نظامي ماك macOS ولينكس Linux) قبل التسجيل للحصول على حساب Twilio. ملاحظة: يُعَد هذا القسم خاصًا بالولايات المتحدة الأمريكية، ولكن تقدم Twilio خدمات الرسائل النصية القصيرة لدول أخرى غير الولايات المتحدة، لذا اطّلع على موقع Twilio الرسمي لمزيد من المعلومات، حيث ستعمل وحدة twilio ودوالها باستخدام الطريقة نفسها خارج الولايات المتحدة الأمريكية. التسجيل للحصول على حساب Twilio انتقل إلى موقع Twilio الرسمي واملأ استمارة التسجيل، ولكن يجب التحقق من رقم الهاتف المحمول الذي تريد إرسال الرسائل النصية إليه بعد التسجيل للحصول على حساب جديد. انتقل إلى صفحة معرّفات المتصل التي جرى التحقق منها Verified Caller IDs وأضِف رقم هاتف يمكنك الوصول إليه، ثم سترسل خدمة Twilio رمزًا إلى هذا الرقم والذي يجب أن تدخله للتحقق منه، حيث يكون هذا التحقق ضروريًا لمنع الأشخاص من استخدام الخدمة لإرسال رسائل نصية غير مرغوب فيها إلى أرقام هواتف عشوائية. ستتمكّن الآن من إرسال رسائل نصية إلى رقم الهاتف باستخدام الوحدة twilio. توفّر خدمة Twilio لحسابك التجريبي رقم هاتف لاستخدامه بوصفه مرسلًا للرسائل النصية، وستحتاج أيضًا معرّف SID ومفتاح الاستيثاق auth token الخاصين بحسابك، إذ يمكنك العثور على هذا المعرّف والمفتاح في صفحة لوحة التحكم Dashboard عندما تسجّل الدخول إلى حسابك على Twilio، حيث تعمل هذه القيم بوصفها اسم مستخدم وكلمة مرور Twilio عند تسجيل الدخول من برنامج بايثون. إرسال رسائل نصية ثبّت الوحدة twilio وسجّل على حساب Twilio، ثم تحقق من رقم هاتفك وسجّل رقم هاتف Twilio، ثم ستحصل على المعرّف SID ومفتاح الاستيثاق الخاصين بحسابك، وستكون أخيرًا جاهزًا لإرسال رسائل نصية لنفسك من سكربتات بايثون الخاصة بك . تُعَد شيفرة بايثون الفعلية بسيطةً إلى حدٍ ما بالمقارنة مع جميع خطوات التسجيل. أدخِل ما يلي في الصدفة التفاعلية أثناء اتصال حاسوبك بالإنترنت، مع استبدال قيم المتغيرات accountSID و authToken و myTwilioNumber و myCellPhone بمعلوماتك الحقيقية: ➊ >>> from twilio.rest import Client >>> accountSID = 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' >>> authToken = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ➋ >>> twilioCli = Client(accountSID, authToken) >>> myTwilioNumber = '+14955551234' >>> myCellPhone = '+14955558888' ➌ >>> message = twilioCli.messages.create(body='Mr. Watson - Come here - I want to see you.', from_=myTwilioNumber, to=myCellPhone) يُفترَض أن تتلقى رسالة نصية بعد لحظات قليلة من كتابة السطر الأخير، وهذه الرسالة النصية هي: "Sent from your Twilio trial account - Mr. Watson - Come here - I want to see you". يجب استيراد الوحدة twilio باستخدام التعليمة from twilio.rest import Client، وليس باستخدام التعليمة import twilio فقط ➊ وفقًا للطريقة التي جرى فيها إعداد هذه الوحدة. خزّن معرّف SID الخاص بحسابك في المتغير accountSID وخزّن مفتاح الاستيثاق الخاص بك في المتغير authToken ثم استدعِ الدالة Client()‎ ومرّر إليها accountSID و authToken. يعيد استدعاء الدالة Client()‎ كائن Client ➋، حيث يحتوي هذا الكائن على السمة Attribute التي هي messages، والتي بدورها تحتوي على التابع create()‎ الذي يمكنك استخدامه لإرسال رسائل نصية، وهو التابع الذي يوجّه خوادم Twilio لإرسال رسالتك النصية. خزّن رقم Twilio ورقم هاتفك المحمول في المتغيرين myTwilioNumber و myCellPhone، ثم استدعِ التابع create()‎ ومرّر إليه وسطاء الكلمات المفتاحية Keyword Arguments التي تحدد نص الرسالة النصية ورقم المرسل (myTwilioNumber) ورقم المستلم (myCellPhone) ➌. يحتوي الكائن Message الذي يعيده التابع create()‎ على معلومات حول الرسالة النصية المُرسَلة. تابع مثال الصدفة التفاعلية من خلال إدخال ما يلي: >>> message.to '+14955558888' >>> message.from_ '+14955551234' >>> message.body 'Mr. Watson - Come here - I want to see you.' يجب أن تحتوي السمات to و from_‎ و body على رقم هاتفك المحمول ورقم Twilio والرسالة على التوالي. لاحظ أن رقم الهاتف المرسِل موجود في السمة from_‎ مع شرطة سفلية في النهاية وليس from، لأن الكلمة from هي كلمة مفتاحية في لغة بايثون، إذ لا بد أنك رأيتها مستخدمةً في صيغة تعليمة الاستيراد from modulename import *‎ مثلًا، لذلك لا يمكن استخدامها بوصفها اسمًا للسمة. تابع مثال الصدفة التفاعلية بما يلي: >>> message.status 'queued' >>> message.date_created datetime.datetime(2023, 7, 8, 1, 36, 18) >>> message.date_sent == None True يجب أن تعطي السمة status سلسلة نصية، ويجب أن تعطي السمات date_created و date_sent كائن datetime إذا أُنشِئت وأُرسِلت الرسالة. قد يبدو غريبًا ضبط السمة status على القيمة 'queued' وضبط السمة date_sent على القيمة None عندما تتلقى الرسالة النصية مسبقًا، والسبب في ذلك هو أنك التقطتَ الكائن Message في المتغير message قبل إرسال النص فعليًا. يجب إعادة جلب الكائن Message حتى تتمكّن من رؤية أحدث نسخة من السمتين status و date_sent. تحتوي كل رسالة من رسائل Twilio على معرّف سلسلة نصية SID فريد يمكن استخدامه لجلب آخر تحديث من الكائن Message. تابع مثال الصدفة التفاعلية من خلال إدخال ما يلي: >>> message.sid 'SM09520de7639ba3af137c6fcb7c5f4b51' ➊ >>> updatedMessage = twilioCli.messages.get(message.sid) >>> updatedMessage.status 'delivered' >>> updatedMessage.date_sent datetime.datetime(2023, 7, 8, 1, 36, 18) يعطي إدخال التعليمة message.sid معرّف SID الطويل الخاص بهذه الرسالة، ويمكنك استرداد كائن Message جديد مع أحدث المعلومات من خلال تمرير هذا المعرّف SID إلى التابع get()‎ الخاص بعميل Twilio ➊، حيث تكون السمات status و date_sent صحيحة في كائن Message الجديد. تُضبَط السمة status على إحدى القيم التالية التي يكون نوعها سلسلة نصية: 'queued' أو 'sending' أو 'sent' أو 'delivered' أو 'undelivered' أو 'failed'. ملاحظة: يُعَد استلام الرسائل النصية باستخدام خدمة Twilio أكثر تعقيدًا بعض الشيء من إرسالها، إذ تتطلب خدمة Twilio أن يكون لديك موقع ويب يشغّل تطبيقه الويب، ويُعَد ذلك خارج نطاق هذا المقال. تطبيق عملي: وحدة لإرسال رسائل نصية يُحتمَل أن يكون الشخص الذي سترسل إليه رسائل نصية من برامجك هو أنت، إذ تُعَد الرسائل النصية طريقة رائعة لإرسال إشعارات لنفسك عندما تكون بعيدًا عن حاسوبك. إذا أردتَ أتمتة مهمة مملة باستخدام برنامج يستغرق تشغيله بضع ساعات، فيمكنك جعله يُعلِمكَ برسالةٍ نصية عند الانتهاء، أو قد يكون لديك برنامج مجدول ليعمل خلال فترات زمنية منتظمة ويحتاج إلى الاتصال بك في بعض الأحيان مثل برنامج التحقق من الطقس الذي يرسل إليك رسالة تذكيرية بأن تجلب مظلتك معك. سنوضّح فيما يلي برنامج بايثون صغير يحتوي على الدالة textmyself()‎ التي ترسل رسالة نمرّرها إلى هذه الدالة كوسيط نوعه سلسلة نصية. افتح تبويبًا جديدًا في محرّرك لإنشاء ملف جديد وأدخِل الشيفرة البرمجية التالية، مع وضع معلوماتك الخاصة مكان معرّف SID ومفتاح الاستيثاق الخاصين بالحساب وأرقام الهاتف، واحفظ الملف بالاسم textMyself.py. #! python3 # textMyself.py - ‫تعريف الدالة textmyself()‎ التي ترسل رسالة نصية نمرّرها إليها بوصفها سلسلة نصية # ‫القيم المُحدَّدة مسبقًا: accountSID = 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' authToken = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' myNumber = '+15559998888' twilioNumber = '+15552225678' from twilio.rest import Client ➊ def textmyself(message): ➋ twilioCli = Client(accountSID, authToken) ➌ twilioCli.messages.create(body=message, from_=twilioNumber, to=myNumber) يخزِّن هذا البرنامج معرّف SID ومفتاح الاستيثاق الخاصين بالحساب والرقم المرسِل والرقم المستلِم، ثم يعرّف الدالة textmyself()‎ التي تأخذ وسيطًا ➊، وينشئ كائن Client ➋، ويستدعي التابع create()‎ مع الرسالة التي مرّرتها ➌. إذا أردتَ إتاحة الدالة textmyself()‎ لبرامجك الأخرى، فما عليك سوى وضع الملف textMyself.py في المجلد نفسه الذي يحتوي على سكربت بايثون الخاص بك، وإذا أردتَ أن يرسل أحد برامجك رسالة نصية إليك، فأضِف إليه ما يلي: import textmyself textmyself.textmyself('The boring task is finished.') يجب التسجيل في خدمة Twilio وكتابة الشيفرة البرمجية الخاصة بإرسال الرسائل النصية مرة واحدة فقط، ثم يمكنك إرسال رسالة نصية من أيٍّ من برامجك الأخرى من خلال كتابة سطرين فقط من الشيفرة البرمجية. مشاريع للتدريب حاول كتابة البرامج التي تؤدي المهام التي سنوضّحها فيما يلي لكسب خبرة عملية أكبر من خلال استخدام المعلومات التي حصلتَ عليها من المقال السابق وهذا المقال. برنامج لإرسال رسائل بريد إلكتروني لإنجاز مهمة روتينية عشوائية اكتب برنامجًا يأخذ قائمةً بعناوين البريد الإلكتروني لأشخاص وقائمةً بمهام روتينية يجب تنفيذها ويسند المهام الروتينية للأشخاص عشوائيًا، وأرسل بريدًا إلكترونيًا لكل شخص بالمهام الروتينية المُسنَدة إليه. احتفظ أيضًا بسجل للمهام الروتينية المُسنَدة مسبقًا لكل شخص لتتمكّن من التأكد من أن البرنامج يتجنب إعطاء أيّ شخص المهمة الروتينية نفسها التي أنجزها سابقًا، ويمكنك جدولة البرنامج لتشغيله مرة واحدة في الأسبوع تلقائيًا. إذا مرّرتَ قائمةً إلى الدالة random.choice()‎، فستعيد عنصرًا مُحدَّدًا عشوائيًا من القائمة. يمكن أن يبدو جزء من شيفرتك البرمجية كما يلي: chores = ['dishes', 'bathroom', 'vacuum', 'walk dog'] randomChore = random.choice(chores) chores.remove(randomChore) # أُنجِزت هذه المهمة الروتينية، لذا يجب إزالتها برنامج للتذكير بإحضار المظلة وضّحنا في مقالٍ سابق كيفية استخدام الوحدة requests لاستخراج البيانات من موقع الطقس، لذا اكتب برنامجًا يعمل قبل أن تستيقظ في الصباح مباشرةً ويتحقق مما إذا كانت السماء تمطر في ذلك اليوم. إذا كانت ستمطر، فاطلب من البرنامج أن يرسل لك رسالة تذكيرية بضرورة إحضار مظلة قبل مغادرة المنزل. برنامج لإلغاء الاشتراك التلقائي اكتب برنامجًا يبحث في حساب بريدك الإلكتروني ليجد جميع روابط إلغاء الاشتراك في جميع رسائل بريدك الإلكتروني، ويفتحها في المتصفح تلقائيًا. يجب على هذا البرنامج أن يسجّل الدخول إلى خادم IMAP الخاص بمزوّد بريدك الإلكتروني، وينزّل جميع رسائل بريدك الإلكتروني، ويمكنك استخدام المكتبة Beautiful Soup التي وضّحناها في مقالٍ سابق للتحقق من النسخة التي فيها كلمة إلغاء الاشتراك Unsubscribe ضمن الوسم link في شيفرة HTML. يمكنك استخدام الدالة webbrowser.open()‎ لفتح جميع هذه الروابط لعناوين URL تلقائيًا في المتصفح بعد الحصول على قائمة بهذه العناوين، ثم يجب المرور على الخطوات الإضافية وإكمالها يدويًا لإلغاء الاشتراك بهذه القوائم، حيث يتضمن ذلك النقر على الرابط للتأكيد في معظم الحالات. يوفّر هذا السكربت عليك الاضطرار إلى المرور على جميع رسائل بريدك الإلكتروني بحثًا عن روابط إلغاء الاشتراك، ويمكنك بعد ذلك إعطاء هذا السكربت إلى أصدقائك حتى يتمكنوا من تشغيله على حسابات بريدهم الإلكتروني، ولكن تأكّد من أن كلمة مرور بريدك الإلكتروني غير مكتوبة في شيفرتك المصدرية. التحكم في حاسوبك من خلال البريد الإلكتروني اكتب برنامجًا يتحقق من حساب البريد الإلكتروني كل 15 دقيقة بحثًا عن أيّ تعليمات ترسلها إليه عبر البريد الإلكتروني وينفّذ تلك التعليمات تلقائيًا. يُعَد BitTorrent مثلًا نظام تنزيل يستخدم تقنية الند للند peer-to-peer، حيث يمكنك تنزيل ملفات الوسائط الكبيرة على حاسوبك المنزلي باستخدام برنامج BitTorrent مجاني مثل البرنامج qBittorrent. إذا أرسلتَ رابط BitTorrent (رابطًا قانونيًا وليس رابط قرصنة) إلى البرنامج عبر البريد الإلكتروني، فسيتحقق البرنامج من بريده الإلكتروني ويعثر على هذه الرسالة ويستخرج الرابط، ثم يشغّل برنامج qBittorrent لبدء تنزيل الملف. يمكنك بهذه الطريقة جعل حاسوبك المنزلي يبدأ التنزيلات أثناء تواجدك بعيدًا عن المنزل، ويمكن الانتهاء من التنزيل (القانوني وغير المقرصن) بحلول وقت عودتك إلى المنزل. وضّحنا في مقالٍ سابق السابق كيفية تشغيل البرامج على حاسوبك باستخدام الدالة subprocess.Popen()‎، فمثلًا سيؤدي الاستدعاء التالي إلى تشغيل برنامج qBittorrent مع ملف تورنت: qbProcess = subprocess.Popen(['C:\\Program Files (x86)\\qBittorrent\\ qbittorrent.exe', 'shakespeare_complete_works.torrent']) يجب أن يتأكد البرنامج من أن رسائل البريد الإلكتروني تأتي منك، إذ قد ترغب في اشتراط أن تحتوي رسائل البريد الإلكتروني على كلمة مرور، لأنه من السهل إلى حدٍ ما أن يزيّف المخترقون عنوان "من from" في رسائل البريد الإلكتروني. يجب أن يحذف البرنامج رسائل البريد الإلكتروني التي يجدها حتى لا يكرر التعليمات في كل مرة يتحقق فيها من حساب البريد الإلكتروني، واجعل البرنامج أيضًا يرسل لك بريدًا إلكترونيًا أو رسالة تأكيد في كل مرة ينفّذ فيها أمرًا. من الجيد استخدام دوال التسجيل الموضّحة في مقالٍ سابق لكتابة سجل ملف نصي يمكنك التحقق منه في حالة ظهور أخطاء، نظرًا لأنك لن تجلس أمام الحاسوب الذي يشغّل البرنامج. يتمتع برنامج qBittorrent وتطبيقات BitTorrent الأخرى بميزةٍ تمكّنه من الإغلاق تلقائيًا بعد اكتمال التنزيل، حيث وضّحنا في مقالٍ سابق كيف يمكنك تحديد موعد إنهاء التطبيق المُشغَّل باستخدام التابع wait()‎ لكائنات Popen. سيوقِف استدعاء التابع wait()‎ التنفيذ حتى يتوقف البرنامج qBittorrent، ثم يمكن لبرنامجك إرسال بريد إلكتروني أو رسالة نصية إليك لإعلامك باكتمال التنزيل. هناك الكثير من الميزات المحتملة التي يمكنك إضافتها إلى هذا المشروع، ولكن إذا واجهتك مشكلة، فيمكنك تنزيل مثال تطبيق هذا البرنامج من nostarch. الخلاصة تختلف الرسائل النصية عن البريد الإلكتروني بعض الشيء، لأنه هناك حاجة إلى أكثر من مجرد اتصال بالإنترنت لإرسال رسائل نصية قصيرة SMS على عكس البريد الإلكتروني، حيث توفر خدمات مثل خدمة Twilio وحداتٍ تسمح بإرسال رسائل نصية من برامجك. ستتمكّن بعد إجراء عملية الإعداد الأولية من إرسال الرسائل النصية باستخدام سطرين فقط من الشيفرة البرمجية. ستتمكّن باستخدام هذه الوحدات مع مهاراتك الأخرى من برمجة الشروط المُحدَّدة التي بموجبها يجب على برامجك إرسال الإشعارات أو التذكيرات، وبالتالي ستصل برامجك الآن إلى ما هو أبعد من حاسوبك الذي تعمل عليه. ترجمة -وبتصرُّف- للقسم Sending Text Messages من مقال Sending Email and Text Messages لصاحبه Al Sweigart. اقرأ أيضًا المقال السابق: إرسال رسائل البريد الإلكتروني باستخدام لغة بايثون جدولة المهام وتشغيل برامج أخرى باستخدام لغة بايثون قراءة مستندات جداول إكسل باستخدام لغة بايثون Python الكتابة في مستندات إكسل باستخدام لغة بايثون Python
    1 نقطة
  34. أصبحت أدوات الذكاء الاصطناعي حجر الزاوية في ثورة الذكاء الاصطناعي من تشات جي بي تي Chat GPT إلى كلود Claude 3، وشقت هذه الأدوات طريقها إلى الحياة اليومية والأنشطة التجارية،وقد تمكن كل من الهواة والمحترفين على حدٍ سواء من الاستفادة من هذا التطور في أنظمة المحادثات الآلية chatbots الهواة والمحترفين على حدٍ سواء. فحسب استبيان حديث أجرته شركة DigitalOcean لعام 2023 حول أشهر التقنيات السحابية المستخدمة من قبل المطورين والشركات الصغيرة والمتوسطة رأى 45% من المشاركين في الاستبيان أن أدوات الذكاء الاصطناعي سهلت أداء وظائفهم بشكل كبير، بالمقابل وجد 43% منهم أن هناك تضخيمًا مبالغًا فيه في فعالية هذه الأدوات. يمكن إرجاع هذا التباين الشاسع في آراء المستخدمين لأحد العوامل الأساسية، ألا وهو هندسة الموجهات أو ما يعرف باسم Prompt engineering، فالمُوجَّه أو الأمر الذي تدخله لنموذج الذكاء الاصطناعي يصنع الفارق في جودة الردود التي تحصل عليها وهو ما سيجعل تعاملك معك أكثر سلاسة، أو يجعلك تعاني منه وتحبط من الردود التي لا تحقق لك مبتغاك، ويجبرك على القيام بالمهمة بنفسك دون استخدام أدواته، ومع تقدم ثورة الذكاء الاصطناعي بشكل متسارع، تزداد أهمية مهارة هندسة المُوجِّهات كمجالٍ متميز، حيث أصبحت وظيفة مهندس الموجهات Prompt engineering من الأكثر طلباً ودخلاً في أوساط الشركات. سنتعمق في مقال اليوم في الحديث عن هندسة المُوجِّهات Prompt engineering، ونوفر لك دليلاً شاملاً عن أفضل الممارسات، وبعض الأمثلة التي ستساعد نشاطك التجاري على استخراج أقصى فائدة ممكنة من تلك النماذج اللغوية الضخمة (large language models). ما هي هندسة المُوجِّهات؟ هندسة المُوجِّهات prompt engineering هي طريقة تصميم وتحسين صياغة الأوامر النصية أو التوجيات المُدخلة للنموذج اللغوي بحيث تحسن من النتائج التي ينتجها النموذج لتناسب احتياجات وأهداف المستخدم، وتتطلب مزيجاً من القدرة على الإبداع وإدراك قدرات النموذج، واستخدام استراتيجيات لصياغة وهيكلة السؤال بطريقة توجه الذكاء الاصطناعي لتوفير ردٍ دقيق ومفيد، ولا يقع خارج سياق التوجيه المُدخل له، تحسن هندسة المُوجِّهات من التفاعل الجيد بين البشر والآلات بحيث تضمن جودة وفعالية التفاعل مع الآلة. ما أهمية هندسة المُوجِّهات؟ تنبع أهمية هندسة المُوجِّهات Prompt engineering من قدرتها على التأثير على أداء نماذج الذكاء الاصطناعي، فجودة الأوامر التي تدخلها للنموذج ستضمن لك الحصول على ردود أكثر دقة وصلةً بالسؤال المطروح، وهذا يجعل هندسة المُوجِّهات مهارة جوهرية اليوم لأي شخص يحاول الاستفادة من أدوات الذكاء الاصطناعي بشكلٍ فعال، ولا تقتصر هندسة المُوجِّهات على من يتخذها وظيفةً، حيث يمكن لأي شخص يطمح في استخدام أدوات الذكاء الاصطناعي للحصول على أفكار وملاحظات أو حل مشكلات معينة أن يستخدم تقنيات هندسة المدخلات لِيتفاعل مع تلك الأدوات بشكلٍ احترافي. بعض الأسباب التي تجعل هندسة المُوجِّهات في غاية الأهمية: تحسين الدقة: فالمٌدخلات المكتوبة بطريقةٍ متقنة توجه النموذج لتوليد إجابات أكثر دقة وأيضاً أكثر صلة بالمدخلات والسؤال المطروح. توفير الوقت: تُسهّل عملية هندسة المُوجِّهات Prompt engineering من الوصول إلى النتيجة المرغوبة في عدد رسائلٍ أقل، مما يوفر معاناة شرح المطلوب وتعديل أخطاء النموذج في محادثة لانهائية قد لا تقودك لنتيجة مرضية. تسهيل القيام بالمهام المعقدة: تتطلب المهام المعقدة فهمًا عميقًا للمتطلبات واستيعابًا لتعقيد المشكلة، فالمُوجّهات النصية الجيدة تسهل على النموذج التعامل مع المطلوب بشكلٍ أوضح. تحسين تجربة المستخدم: عن طريق توفير إجابات ذات صلة بالموضوع وموثوقة. مخرجات أكثر قيمة: يساعد استخدام هندسة المُوجِّهات Prompt engineering بشكل صحيح في بعض المجالات كالبرمجة، وصناعة المحتوى، وتحليل البيانات إلى توليد نتائج وردود أكثر قيمةً وجودة. الاستخدام الفعال: من خلال تعزيز فهمنا لكيفية التواصل مع الذكاء الاصطناعي، يمكننا تجاوز القيود الحالية وابتكار حلول إبداعية توسع قدرات الذكاء الاصطناعي وتزيد كفاءته. توفير التكلفة: بعض النماذج والأدوت متاحة للاستخدام بشكلٍ محدود أو بتكلفة مادية، لذا فإن القدرة على الوصول لردٍ ذي صلة ودقيق بعدد محاولات أقل يمكن أن يوفر عليك التكلفة المادية. أفضل 10 ممارسات في هندسة المُوجِّهات إن صياغة أوامر أو توجيهات نصية prompts فعالة لنماذج الذكاء الاصطناعي من شأنها تحسين جودة الردود المنتجة، وزيادة صِلتها بالمُوجّه أو السؤال المطروح، ولأجل اكتساب هذه الخبرة في صياغة المدخلات النصية أنت بحاجة لفهمٍ جيدٍ لكيفية معالجة الذكاء الاصطناعي لهذه الموجهات وتفسيرها. في النقاط العشرة التالية، سنكتشف معاً أفضل الممارسات التي سوف تساعدك في التواصل الفعال مع الذكاء الاصطناعي وكيف تكتب موجهات prompts عالية الجودة. 1. كن محدداً قدر المستطاع احرص على كتابة مُوجِّه محدد بشكلٍ واضح ودقيق، فهذا هو المفتاح للحصول على أكثر المعلومات دقة وصلة من الذكاء الاصطناعي، فتحديد المتطلبات يزيل الغموض ويُضيّق نطاق البحث لدى الذكاء الاصطناعي، ولتحقيق هذا الشرط أنت بحاجة لإرفاق أكبر قدر من المعلومات ذات الصلة دون تحميل الذكاء الاصطناعي أية معلومات غير ضرورية، فإرفاق معلوماتٍ ليست ذات صلة بطلبك الحالي من شأنه أن يشتت ردود الذكاء الاصطناعي ويبعده عن مرادك، فالتوازن في كتابة مُوجِّه Prompt محدد يوجه الذكاء الاصطناعي إلى استخدام المعلومات الكافية فقط وتوليد إجابة دقيقة وذات صلة بالموضوع المطروح. بعض الأشياء الضرورية التي عليك توضيحها في المدخلات النصية توضيح السياق: قم بتوضيح خلفية الموضوع وتوفير المعلومات الكافية لفهم مجرى الأحداث التي تتساءل عنها، هذا يشمل الموضوع، وحجم الموضوع، وأية معلومات ذات صلة عن القيود المفروضة كأن تطلب منه على سبيل المثال توفير معلومات مقيدة بفترة زمنية معينة (آخر 5 سنوات على سبيل المثال). التنسيق المطلوب: قم بتوضيح التنسيق الذي ترغب فيه، مثلًا يمكن أن تكون الإجابة مرتبة على هيئة قائمة من النقاط، أو تقرير مفصلٌ، أو تلخيص، أو شيفرة برمجية، أو غيرها من التنسيقات وأنواع الملفات، وضح أيضاً تفضيلاتك عن العناوين والعناوين الفرعية وحجم الفقرات وغيرها من التفاصيل التنسيقية. حجم الإجابة المطلوبة: هل ترغب في إجاباتٍ مطولة أم إجابات مختصرة تتكون من نقاط واضحة عليك تحديد كل هذه التفاصيل كأن تطلب على سبيل المثال توليد ثلاثة فقرات أو إجابة بطول 250 كلمة. مستوى التفصيل: قم بتحديد مدى تعمق الإجابات، فيمكن أن تكون الإجابة سطيحة للتعريف بالموضوع بشكلٍ عام، ويمكن أن تكون تحليلًا متعمقًا في الموضوع، هذه النقطة مهمة لضمان توفير النموذج للقدر الذي تحتاجه من المعلومات. أسلوب الصياغة وطريقة الكتابة: حدد أسلوب الكتابة المناسب لاحتياجاتك، قد تكون الكتابة بشكلٍ رسمي، أو غير رسمي، أو بشكلٍ علمي، أو بشكلٍ أدبي، أو بشكل محادثة، أو غير ذلك، حيث تختلف الأساليب الممكنة باختلاف الجمهور المستهدف ونوع الكتابة. أمثلة ومقارنات: اطلب من الذكاء الاصطناعي توفير أمثلة ومقارنات من أجل توضيح المفاهيم المعقدة بشكلٍ أفضل، وتوفير معلومات مبسطة وذات صلة يسهل فهمها. 2. عزز الذكاء الاصطناعي بالأمثلة إن إرفاق الأمثلة في المُوجِّهات يعد تقنية قوية لتوجيه استجابات الذكاء الاصطناعي نحو المطلوب. فمن خلال توفيرأمثلة ضمن المُوجِّه فإنك تحدد مسبقًا نوع المعلومات أو الاستجابة التي تتوقعها وتربط بين المعلومات المتاحة لدى النموذج عن المثال الموجود بالفعل وطلبك. وهذه الطريقة مفيدة بشكل خاص للمهام المعقدة التي يكون المطلوب فيها غامضًا، وللمهام الإبداعية التي تحتوي على أكثر من إجابة صحيحة. وعندما تزود الذكاء الاصطناعي بهذه الأمثلة، تأكد من أنها تراعي جودة وأسلوب النتيجة المطلوبة وبهذا تساعد الذكاء الاصطناعي على نمذجة استجاباته بناء على هذه الأمثلة المقدمة، مما يؤدي إلى ردود ومخرجات أكثر دقة وتفصيلاً. إليك بعض أنواع الأمثلة التي يمكنك توفيرها للذكاء الاصطناعي لتساعده في توليد أفضل استجابة ممكنة: أرفق عينات من النص: يمكنك أن توفر عينة نصية تتبع الأسلوب الكتابي الذي ترغب من النموذج أن يتبعه عند توليد إجابة. وضح تنسيق البيانات: يمكنك توضيح تنسيق البيانات المخرجة وهياكلها، مثلًا يمكن أن تطلب منه وضع المعلومات في جداول أو قوائم. وفر القوالب الجاهزة: يمكنك توفير قالب جاهز لضمان توليد إجابات تتبع التنسيق والهيكل المطلوب. اكتب مقتطفات من الشيفرة البرمجية: إذا كان سؤالك متعلقًا بمشكلةٍ برمجية فمن الجيد توفير مقتطفات من الشيفرة البرمجية لضمان اتباع النموذج لقواعد اللغة البرمجية وتوليد شيفرات برمجية لهذه اللغة وليس لغيرها. وفر الرسومات البيانية والتوضيحية: إذا كنت ترغب في جعل الذكاء الاصطناعي يولد لك رسمًا بيانيًا فعليك توفير رسوماتٍ بيانية أو توضيحيةٍ مشابهة لما تحاول الوصول إليه. وفر المعلومات التسويقية: إذا كنت تستخدم الذكاء الاصطناعي لتوليد محتوى تسويقي، وفر له المعلومات التسويقية عن المنتج الخاص بك لتناسب النتائج التي يولدها هوية النشاط التجاري الذي تصمم له محتوى تسويقي. 3. وفر البيانات لتحصل على إجابات أفضل يساعد توفير المعلومات والبيانات ذات الصلة بالموضوع على تحسين جودة الإجابات المولدة بشكلٍ ملحوظ، حيث توفر البيانات أساسًا قويًا للذكاء الاصطناعي ليفهم السياق وِيتمكن من صياغة إجابة دقيقة، كما يسمح توفير البيانات التي تحتوي أرقامًا، وتواريخًا، وتصنيفات بشكلٍ منسق وهيكلٍ واضح بتوفير إجابات مفصلة تحليلية تساعد في اتخاذ القرارات، لذا من الضروري وضع البيانات في السياق المناسب لها، وتوفيرها عندما تكون متاحة، مع إرفاق مصدرها، فهذا يضيف نوعًا من المصداقية والثقة في المقارنات والتحليلات الكمية للبيانات. ولتتأكد من أن الذكاء الاصطناعي قادر على توفير إجابات مفيدة وذات صلة، استخدم دائماً بيانات ومعلومات محدثة ومنظمة بشكلٍ جيد، وفي حالة المقارنات تأكد من توضيع عوامل المقارنة. فتوفير البيانات في السياق المناسب لها يزود الذكاء الاصطناعي بالقدرة على توفير إجابات قابلة للتنفيذ، واتخاذ قرارات فعالة مبنية على الأرقام، فالمدخلات النصية المرتكزة على البيانات قيّمة للغاية في المهام التي تتطلب تعمقاً تحليلياً للأرقام، وهي تُمكّن الذكاء الاصطناعي من توليد مخرجات مفيدة للنشاط التجاري وتوافق استراتيجياته التجارية. 4. حدد هيئة النتائج التي تفضلها عند التعامل مع الذكاء الاصطناعي من المهم توفير التنسيق المناسب والمتوقع للاستجابات، حدد على سبيل المثال فيما إذا كنت ترغب في الحصول على الإجابة على هيئة تقرير، أو ملخص، أو قائمة من النقاط أو غيرها من التنسيقات التي تضمن الحصول على الإجابة بالصيغة والتنسيق المناسبين. 5. استخدم صيغة "افعل" بدلاً من "لا تفعل" عند صياغة المُوجِّهات للذكاء الاصطناعي من الأفضل توجيه الذكاء الاصطناعي نحو الفعل المناسب بدلاً من شرح ما عليه تجنبه، حيث يقلل هذا الأسلوب من الغموض ويُمكّن الذكاء الاصطناعي من توليد إجابات مفيدة وذات صلة بالموضوع، حيث تطلب التعليمات السلبية من الذكاء الاصطناعي أن يفهم الأمر ويقوم بعكسه، مما قد يزيد من احتمالية حدوث سوء فهم أو تشتت النموذج بالتركيز على ما نهي عنه، لذا كن واضحاً في تحديد الأفعال المطلوبة، لتمكن الذكاء الاصطناعي من الوصول للإجابة بشكلٍ فعال ومباشر. 6. اجعل الذكاء الاصطناعي يتقمص دور شخصية أو مرجعية محددة من المفيد توجيه الذكاء الاصطناعي لِيتقمص شخصية أو دورًا محددًا بحيث تكون هذه الشخصية هي المرجع له، تزيد هذه الاستراتيجية من فعالية ودقة مخرجات الذكاء الاصطناعي، وتساعد على توجيه الذكاء الاصطناعي لتوليد إجاباتٍ ذات صلة بهذه الشخصية. تفيد هذه الطريقة للغاية في سياق الأنشطة التجارية التي تتطلب معرفة بالمجال والسوق، وتمّكنك من توجيه الذكاء الاصطناعي لِيستخدم المصطلحات والأساليب المناسبة للسياق وبالتالي لِلمجال المطلوب بما يتوافق مع مجرى الأحداث، يساعد تحديد الشخصية أو المرجعية أيضاً في توضيح التوقعات والتفاعلات المناسبة مع الذكاء الاصطناعي ويحسن تجربة المستخدم. 7. جرب تسلسل المُوجِّهات سَلسَلة المُوجِّهات Prompt chaining هي تقنية تعتمد على دفع الذكاء الاصطناعي لتفسير إجاباته وتفصيلها بشكلٍ أوضح، عن طريق توجيهه من خلال الأوامر النصية ليناقش الخطوات التي اتخذها للوصول للإجابة واستنتاجها، تمكنك هذه الطريقة المستخدمين من فهم المنطق ومدى صحة الإجابة. يفيدك هذا الأسلوب للغاية عند التعامل مع المشكلات المعقدة أو مناقشة الأسباب التي أدت لتوليد الإجابة، حيث تضمن مستوى أعمق من حل المشكلات وفهمها ومراحل التوصل إليها، مما يُمكّن المستخدم من التعلم من طريقة إيجاد الذكاء الاصطناعي للحل. 8. قَسِّم المهام المعقدة إلى مهام أبسط عند التعامل مع المهام المعقدة، فسيساعدك تقسيمها إلى مهام في جعلها أبسط وأسهل في التعامل يجعل الذكاء الاصطناعي قادرًا على حل تلك المشكلات المعقدة، باستخدام خطوات من التعليمات التي تمنع من تشتت الذكاء الاصطناعي عن هدفه وتسهل من مهمته المطلوبة، مما يضمن أن كل جزء من المهمة الأكبر ينجز بدرجة عالية من الدقة والاهتمام بالتفاصيل. إضافةً إلى أن هذه الطريقة تسهل من عملية مراقبة وتعديل كل مهمة على حدة، حيث يمكن تعديل كل خطوة وتحسينها بشكل يرفع من الجودة الكلية لحل هذه المشكلة، وتقسيم المهام إلى أجزاء أصغر يمكن الذكاء الاصطناعي من استخدام الموارد بشكل أكثر فعالية وتوفيراً، حيث يمكننا أن نركز على الخطوات الأهم التي تطلب تركيزًا أكبر. 9. أدرك حدود نموذج الذكاء الاصطناعي وقدراته عند صياغة مُوجِّهات الذكاء الاصطناعي، من الضروري أن تعرف جيدًا حدود إمكانيات نموذج الذكاء الاصطناعي لوضع توقعات واقعية، فتكليف الذكاء الاصطناعي بمهام ليس مصممًا للقيام بها، مثل التفاعل مع قواعد بيانات خارجية أو توفير تحليل بيانات في الوقت الحقيقي سوف يؤدي إلى إجابات غير دقيقة وتعاني من ظاهرة تسمى الهلوسة Hallucination. بعض حدود إمكانيات الذكاء الاصطناعي: لا يمتلك الذكاء الاصطناعي القدرة على الوصول إلى معلومات في الوقت الحقيقي، فمعرفة النموذج تنتهي إلى آخر تحديث تم تدريبه فيه. لا يمتلك القدرة على الوصول إلى البيانات الشخصية ما لم توفرها بشكل صريح خلال التفاعل مع النظام. لا يمتلك القدرة المباشرة على التفاعل أو استخدام برامج خارجية مثل قواعد البيانات، أو المتصفحات يولد إجابات غير مفيدة في حال عدم توفر سياق واضح عند التعامل مع المواقف المعقدة. لا يمتلك القدرة على امتلاك المشاعر أو التعاطف بشكل حقيقي ولا يمتلك القدرة على تكوين تجربة شخصية. 10. استخدم الأسلوب التجريبي في تحسين نموذج الذكاء الاصطناعي يعتمد مجال هندسة المُوجِّهات Prompt engineering الصاعد بشكلٍ كبير على عقلية التجربة المستمرة، تجربة دائمة لطرق جديدة وصياغات مختلفة، حيث من الأفضل أن تُطور صياغة المدخلات النصية في دورات متتالية تتحسن فيها الصياغة وجودة الردود بشكل متتابع، لاحظ بدقة تأثير التغيرات التي تجربها في الصياغة على أداء نماذج الذكاء الاصطناعي وتعلم كيف تتغير إجابات النماذج بتجربة المدخلات المختلفة وتأثير التعديلات عليها. لا تتردد في استكشاف الاحتمالات المختلفة لصياغات مختلفة لتكتشف المدخلات النصية الأكثر فعالية للقيام بمهمة محددة دون أن تخالف أخلاقيات الذكاء الاصطناعي أو خصوصية البيانات، فاستراتيجية المحاولات التجريبية والتعلم من الأخطاء تساعدك في إتقان هندسة الموجهات وتمكنك من صياغة موجهات أكثر كفاءةً وتزيد من فهمك بشكلٍ عام لكيفية عمل نماذج اللغات الضخمة وطريقة تفسيرها للأوامر وتفاعلها مع التعليمات المختلفة. الخلاصة تعرفت في مقال اليوم على المقال يبرز أهمية هندسة المُوجِّهات (Prompt Engineering) ودورها في رفع كفاءة أدوات الذكاء الاصطناعي وأهم النصائح والممارسات التي تساعدك على صياغة مُوجِّهات عالية الجودة تمكنك من الحصول على نتائج دقيقة وملاءمة لمتطلباتك. احرص على تطبيق هذه الممارسات في تفاعلك مع نماذج الذكاء الاصطناعي، فمن شأنها أن تعزز استفادتك من هذه النماذج وتزيد إنتاجيتك وتحسن كفاءة عملك. ترجمة-وبتصرٌّف-للمقال Prompt Engineering Best Practices: Tips, Tricks, and Tools اقرأ أيضًا مصطلحات الذكاء الاصطناعي للمبتدئين تعلم الذكاء الاصطناعي أهمية الذكاء الاصطناعي إيجابيات وسلبيات الذكاء الاصطناعي برمجة الذكاء الاصطناعي
    1 نقطة
  35. نستعرض في مقال اليوم أمثلة على الذكاء الاصطناعي ونسلط الضوء على الاستخدامات المتنوعة لهذه التقنية الرائدة في حياتنا اليومية وفي مختلف الصناعات. فقد ازداد الاعتماد على الذكاء الاصطناعي بشكل كبير في الآونة الأخيرة وأصبح من المهم معرفة الطرق المختلفة لاستخدام الذكاء الاصطناعي في تأدية مهامنا المختلفة والاستعانة به لزيادة كفاءتنا وإنتاجيتنا. زيادة الاعتماد على الذكاء الاصطناعي وفق مؤشر شركة IBM لتبني تطبيقات الذكاء الاصطناعي الصادر في نوفمبر من العام 2022 تبنت أغلب الشركات تقنيات الذكاء الاصطناعي في أعمالها بنسبة بلغت 43% من الشركات المشاركة في الاستبيان، في حين تدرس 40% من الشركات الباقية استخدام الذكاء الاصطناعي في أعمالها، ولا شك أن هذه الإحصائيات تدل على إدراك شركات الأعمال لأهمية استخدام الذكاء الاصطناعي في تطوير أعمالها وزيادة أرباحها، وضرورة استخدام التقنيات الذكية لتعزيز التنافسية في السوق المتنامي للذكاء الاصطناعي واستثمار الفرص الواعدة فيه. وحتى بالنسبة للأفراد أصبح استخدام أدوات الذكاء الاصطناعي أمرًًا أساسيًا بالنسبة للكثير من الأشخاص اليوم وأداة مهمة لإنجاز أعمالهم وتعزيز إنتاجيتهم ، ولهذا السبب ازاد الطلب على أدوات الذكاء الاصطناعي وتطبيقاته في مختلف المجالات، وسنتعرف في الفقرات التالية على تطور الذكاء الاصطناعي ثم نستعرض أبرز الأمثلة على الذكاء الاصطناعي واستخدماته في قطاعات متنوعة مثل التعليم والصحة وإدارة الأعمال والتسويق وغيرها من الأمثلة العديدة الأخرى. تطور الذكاء الاصطناعي وضحنا في مقال سابق ما هو الذكاء الاصطناعي (AI) وتاريخ تطوره وذكرنا أنه تقنية تُمكّن الحواسيب وغيرها من الآلات القابلة للبرمجة على محاكاة الذكاء البشري في القدرة على الفهم والإدراك وربط الأسباب ببعضها البعض والتعلم والتفاعل مع بيئتها، والتكيف مع التغيرات لحل المشكلات بشكلٍ إبداعي. وقد تطور الذكاء الاصطناعي بشكل كبير في السنوات الأخيرة، وأجريت الكثير من الأبحاث العلمية المتعلقة بتقنياته مع التركيز على النماذج اللغوية الضخمة Large Language models التي مكنت الحواسيب من التفاعل بسهولة مع البشر وفهم لغتهم بشكل أفضل، هذا فتح الباب على مصراعيه لظهور أمثلة على الذكاء الاصطناعي المتطور القادر على التفاعل مع البشر إجراء محادثات ذكية معه بلغتهم، مثل تطبيق المحادثة الذكي ChatGPT الذي استحوذ على نسبة كبيرة من سوق أدوات الذكاء الاصطناعي. ولم يقتصر هذا التطور فقط على قدرات الذكاء الاصطناعي اللغوية، بل شمل أيضاً القدرات البصرية والقدرة على إنشاء محتوى جديد ما أكسبه نوعاً من الإبداع، فيمكنك بمجرد وصف الصورة التي في مخيلتك، وكتابة هذا الوصف للنموذج التوليدي على هيئة مُوجّه (prompt) الحصول على صورة احترافية إبداعية قريبة مما تخيلته وربما تتجاوز توقعاتك في غضون ثوانٍ! فالآلات اليوم باتت ذكية جدًا وقادرة على فهم المعاني وراء الكلمات والنصوص، كما أنها واستخراج المعلومات من البيانات البصرية كالصور ومقاطع الفيديو بل وحتى إنشاء المحتوى المكتوب والمرئي والمسموع بجودة جيدة وتتحسن بشكل سريع للغاية. وبفضل الاستثمارات الضخمة التي تحاول ضمان حصة قوية في سوق الذكاء الاصطناعي فإن هذا التخصص في حالة تطور متسارع، حتى أنه يعد اليوم أحد أسرع التقنيات نموًا ويتوقع أن يزداد نموه، وتزاد أهميته والاعتماد عليه في المستقبل. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن دعنا نستعرض تاليًا أهم الأمثلة على الذكاء الاصطناعي وتقنياته المطبقة في مختلف المجالات. أمثلة على تطبيقات معالجة اللغات الطبيعية بالذكاء الاصطناعي تتنوع الأمثلة على تشغيل الذكاء الاصطناعي ومجالاته المختلفة في مختلف القطاعات، ومن أبرز هذه المجالات معالجة اللغات الطبيعية Natural Language Processing (NLP)‎ التي تعني فهم الآلات للغة البشرية وقدرتها على معالجتها ويفيد تطبيق هذا المجال في العديد من المهام المتعلقة بمعالجة النصوص أو الكلام البشري كتحليل المشاعر للنصوص المكتوبة، وتلخيص الفقرات الطويلة، وإنتاج أو توليد محتوى نصي، وفهم الأسئلة والإجابة عليها، والترجمة الآلية للنصوص وغير ذلك من الأمثلة. كل ما نحتاجه هو إدخال موجه (prompt) يتضمن وصف للمهمة التي نريدها من النموذج لنحصل على النتائج كما لو أن بشريًا ينتجها. وبهذا يمكن الاستفادة من القدرات اللغوية القوية لنماذج الذكاء الاصطناعي الحالية في تطوير أنظمة محادثات ذكية قابلة للتطبيق في مجالات كثيرة ومتنوعة، مثل خدمة العملاء والرد على استفساراتهم بمرونة وفاعلية. أمثلة على تطبيقات الرؤية الحاسوبية بالذكاء الاصطناعي تعد الرؤية الحاسوبية Computer Vision من المجالات المتقدمة للذكاء الاصطناعي، وهناك الكثير من الأمثلة على الاستفادة منها مثل تصنيف الصور Image Classification بسهولة، والتعرف على الكائنات المختلفة وتمييزها في الصور object detection and recognition، وفصلها عن بعضها Image segmentation إلى مجموعات تملك سمات متشابهة، كما يمكن الاستفادة منها في تحسين جودة الصور كإزالة التشويش، أو تحسين الألوان، وكذلك في التعامل مع النماذج ثلاثية الأبعاد التي تشهد تأثيرًا كبيرًا في مختلف الصناعات. ولعل ما يميز مجال الرؤية الحاسوبية اليوم هو قدرتها على معالجة الصور والفيديوهات بسرعة ودقة، واستغلال التطور في المجالات الأخرى للذكاء الاصطناعي مثل معالجة اللغات الطبيعية والذكاء الاصطناعي التوليدي Generative AI في تحسين عمل خوارزميات الذكاء الاصطناعي وتمكنها من أداء مهامها مثل تحديده كائن في الصورة أو إزالته بشكل ذكي للغاية دون الحاجة لتدريب النموذج على صور جديدة ويعرف هذا الأسلوب بالتعلم بصفر أمثلة (zero-shot learning). ولعل نموذج شركة ميتا Meta المعروف باسم نموذج "افصل أي شيء يا سام Segment Anything Model SAM" من أبرز الأمثلة على التطور الكبير في مجال الرؤية الحاسوبية حيث يتيح هذا النموذج القدرة على تحليل وتفسير الصور بشكل متقدم وتحديد وفصل الكائنات بدقة، دون الحاجة لتدريبه على بيانات محددة لهذه الكائنات مسبقاً. ويمكنك تجربة استخدام هذا النموذج في هذا الموقع التجريبي. أمثلة على الذكاء الاصطناعي في التعليم لا تراعي معظم أنظمة التعلم التقليدية الفروق الفردية بين المتعلمين، وتفرض إطاراً موحداً لجميع أنواع الطلاب، وقد لا يكون هذا أفضل طريقة للتعليم، الذكاء الاصطناعي قادر على توفير عملية تعليمية بشكل مخصص مناسب للمتعلم بناءً على تفاعل الذكاء الاصطناعي مع المتعلم، فيمكنه توليد رسومات توضيحية والإجابة على أسئلة المتعلم، كما يمكنه تقييم أدائه وتقديم اقتراحات لتحسين مستواه الدراسي. ويمكن أن يساعد الذكاء الاصطناعي المعلم على تحديد نقاط الضعف في المقررات الدراسية التي يعاني الطلاب في فهمها بشكل جيد، مما يساعده على تحسين محتوى هذه المقررات بشكلٍ موجه وفعال، كما يمكن أن يوفر الذكاء الاصطناعي للمعلمين الوقت للعمل أكثر على تحسين جودة موادهم التعليمية ومحتواه ويساعد في الإجابة على كل تساؤلات الطلاب بشكلٍ فعال في أي وقت وبشكلٍ فوري. كما يمكن الاعتماد على أنظمة المساعدة الذكية (Intelligent Tutoring Systems) التي تعد أشبه بتوفير معلم خاصٍ لديه الخبرة بالمواضيع التي يتعلمها الطلاب ويجيب عن أسئلتهم ويساعدهم في إدراك المفاهيم الصعبة. وهذا قد يكون حلاً مناسباً لتعويض النقص في المعلمين في بعض البلاد والكثافة الطلابية العالية، وقد سارعت العديد من منصات التعلم على الإنترنت التي توفر مواد تعليمية وتدريبية إلى دمج أنظمة ذكاء اصطناعية لتحسن تجربة التعلم على منصاتها ووفرت نظام محادثة ذكي يستطيع الإجابة على أسئلة الطلاب المختلفة ويستفيد من الأسئلة التي يطرحونها في معرفة نقاط الضعف في المحتوى التعليمي وتحسينه. فالذكاء الاصطناعي يوفر حلولاً فعالة ومنخفضة التكلفة لتحسين تجربة التعلم وأساليب التقييم، ويسهل عملية التصحيح الآلي للاختبارات ويوفر تقييمًا دقيقًا لأداء الطلبة. ومع تطور تكنولوجيا الواقع الإفتراضي والواقع المعزز سيكون الذكاء الاصطناعي قادرًا على استخدام هذا التطور لتحسين تجربة التعلم باستخدام هذه التقنيات الحديثة، فيمكنه أن يولد للمتعلم نماذج ثلاثية الأبعاد تساعد الطالب على تخيل المفاهيم التي يتعلمها، وتستخدم هذه التقنيات حاليًا في تعليم التشريح لطلاب الطب ولدراسة الجسد البشري بشكل تفاعلي مع نماذج للجسم البشري ثلاثية الأبعاد. وهناك العديد من الأمثلة الأخرى عن استخدام الذكاء الاصطناعي في مجال التعليم، ويعتقد البعض أن التطور في الذكاء الاصطناعي سوف يستبدل المعلمين لكن هذا غير دقيق، لأن العملية التعليمة نشاط يستلزم تفاعلًا بشريًا واجتماعيًا ولن يكون الذكاء الاصطناعي قادراً على التعاطف مع مشاعر الطلبة أو يمثل قدوة لهم فهو ليس سوى آلة ويقتصر دوره على مساعدة المعلم على تحسين عمله. أمثلة على الذكاء الاصطناعي في الطب يعتبر مجال الطب من المجالات الحيوية، فحياة المريض قد تتوقف على التشخيص الدقيق لحالته في الوقت المناسب، ويمكن للذكاء الاصطناعي المساعدة في تقليل الأخطاء الطبية من خلال توفير تحليلات دقيقة وموثوقة للبيانات الطبية، والاكتشاف المبكر للأمراض، ومراقبة الحالة الطبية للمريض، وتنبيه الطبيب المتابع للحالة بتقرير مفصل عن حالته الحيوية والأدوية التى يتناولها ومدى التزامه بها في المواعيد المحددة، ومن الأمثلة على الذكاء الاصطناعي في الطب الأجهزة القابلة للارتداء مثل الساعات الذكية والأسورة الإلكترونية التي تمتلك مستشعرات لقياس المؤشرات الحيوية مثل نبضات القلب وغيرها مما قد يساعد في اكتشاف أي تدهور مفاجئ في صحة المريض. أمثلة على الذكاء الاصطناعي في تشخيص الأمراض يمكن استخدام خوارزميات الرؤية الحاسوبية المتقدمة في تحليل صور الأشعة الطبية ودمجها مع نظام تقارير يستخدم معالجة اللغات الطبيعية والذكاء الاصطناعي التوليدي لتقديم تقرير مفصل عن الحالة الطبية بعد تحليل الصور والملفات الطبية للمريض. وهناك بعض الأنظمة التي تستخدم أعراض المرض لتشخيص الأمراض وتوفر قائمة بالأمراض المحتملة حيث تستطيع إدخال الأعراض المرضية ليقوم النظام بتوفير قائمة بالأمراض المحتملة وتفاصيل عنها. الذكاء الاصطناعي والروبوتات الجراحية تساعد أنظمة الذكاء الاصطناعي بدمجها مع الروبوتات المتخصصة بالقيام بعمليات جراحية في غاية الدقة، ويمكن تطوير روبوتات طبية متعددة الأغراض، قد يكون هذا حلاً مناسباً للغاية في الحالات الخطيرة للتعامل مع الأمراض المعدية والأوبئة لضمان أمان الطاقم الطبي. تستطيع الروبوتات الجراحية القيام بالعمليات من خلال فتحات صغيرة دون القيام بقطوع كبيرة بسبب قدرتها على استخدام المناظير المزودة بكاميرات والأدوات الدقيقة للقيام بالعمليات الصعبة بدقة بالغة مما يقلل من حجم الجروح ويقلل من الألم والوقت اللازم للتعافي. أمثلة على الذكاء الاصطناعي وتمكين ذوي الاحتياجات الخاصة تعد المساعدات الصوتية (مثل سيري أو أليكسا) وتطبيقات قراءة النصوص من أولى الأدوات التي ساعدت ذوي الاحتياجات الخاصة البصرية ووفرت لهم نوعاً من الاستقلالية، ومع تطور فهم الذكاء الاصطناعي للغة تطورت قدرات هذه المساعدات وبات بإمكانها فهم الحديث بشكل جيد وعرض المعلومات المهمة، كما توفرت مساعدات بصرية تترجم الكلام المنطوق إلى صور أو رسومات باستخدام لغة الإشارة لتساعد ذوي الاحتياجات السمعية. وقد تطور الذكاء الاصطناعي اليوم وأصبح بمقدوره قراءة الأفكار، عن طريق تسجيل الإشارات الكهربية التي ينتجها المخ باستخدام جهاز رصد موجات المخ الكهربية electroencephalogram EEG فيمكن تسجيل الإشارات الكهربية التي ينتجها المخ أثناء التفكير في بعض الأشياء وتكوين قاعدة بيانات، ثم تدريب نماذج التعلم الآلي على التعلم من أنماط الإشارات المختلفة التي ينتجها المخ أثناء التفكير بشيء معين، يمكن أن تتم ترجمة هذه الأفكار إلى كلمات يتم عرضها على شاشات لتساعد الغير قادرين على التواصل أو الحركة على التعبير عن أنفسهم، تواجه هذا النهج بعض التحديات مثل التشويش الناتج أثناء تسجل الإشارات الكهربية للمخ وتبحث شركة Neuralink في تطوير هذه التقنية باستخدام شرائح تزرع داخل المخ لتسجيل الإشارات بشكل أنقى، هناك العديد من المخاطر لتطوير مثل هذه التقنيات ومخاوف قد تكون في محلها، فقدرة الآلة على أن تقرأ الأفكار قد تهدد الخصوصية ومن الممكن أن يساء استخدامها. وقد تم بالفعل تجريب شرائح شركة Neuralink على البشر بشكلٍ محدود وتطوعي، فقد ساعدت الشخص الذي استخدمها على ممارسة بعض الأنشطة مثل لعب الشطرنج بالتحكم بالحاسوب الخاص به من خلال أفكاره وغيرها من الأنشطه الأخرى، لكن لاتزال هذه تقنية تجريبية وخطيرة للغاية ولكنها تعد بالكثير من الإمكانات لتمكين ذوي الاحتياجات الحركية والذهنية. أمثلة على الذكاء الاصطناعي في مجال الصيدلة يعد مجال الصيدلة وتطوير الأدوية من المجالات العلمية المتقدمة للغاية والتى تطلب مليارات الدولارات لاستثمارها للخروج بدواءٍ واحد وسنوات طويلة من البحث والدراسة للتأكد من جاهزية هذا الدواء الجديد ليستخدم من قبل البشر، بعد دراسة كافية وشاملة وتجارب عديدة لضمان أقل التأثيرات الجانبية السلبية لهذا الدواء. ويمكن استخدام الذكاء الاصطناعي في تطوير أنواع جديدة من الأدوية بتكلفة أقل وابتكار مركبات فعالة جديدة ودراسة تأثيراتها الجانبية المحتملة وفعاليتها في نظام محاكاة كما يمكن أن يساعد الذكاء الاصطناعي في توفير بيئة محاكاة لتجربة الكثير من المركّبات الدوائية واكتشاف تأثيرها على الأهداف الحيوية المختلفة إذ يصمم الدواء لاستهداف هدفٍ حيوي مثل أنواع معينة من الخلايا وتصميم هيكل المركبات العلاجية المناسبة لضمان تأثير الدواء على الهدف المحدد وتستخدم في هذه المهمة برامج المحاكاة مثل برامج تصميم هياكل الجزئيات بمساعدة الحاسوب Computer-Aided Molecular Design. وتستخدم نماذج التعلم العميق والذكاء الاصطناعي التوليدي لتصميم هياكل بروتينية جديدة قد تساهم في اختراع مركّبات دوائية فعالة، مثال على هذه النماذج آلفا فولد AlphaFold المتخصص في توقع هياكل البروتينات المختلفة، في الجدول التالي بعض الأمثلة لنماذج التعلم العميق المستخدمة في مجال الأدوية. النموذج الاستخدام AlphaFold آلفا فولد يتوقع هياكل البروتينات Chemputer الحاسب الكميائي يتوقع توافق المركبات الكيميائية مع بعضها ORGANIC عضوي أداة تساعد على توليد مركبات بخواص مرغوبة DeepTox السمية العميقة توقع سمية المركبات الدوائية DeepChem الكيمياء العميقة يساعد على تحليل التوافق الكيميائي بين المركبات المختلفة أمثلة على الذكاء الاصطناعي في التسويق وتحليل آراء العملاء استخدام الذكاء الاصطناعي في التسويق ليس بالشيء الجديد، حيث تستخدم منصات التواصل الاجتماعي البيانات الضخمة التي تمتلكها عن مستخدميها لتقوم بعرض الإعلانات الموجهة لهم بناءً على اهتماماتهم وسجلات تصفحهم، ومع تطور تقنيات الذكاء الاصطناعي زادت الطرق الممكنة لاستخدام الذكاء الاصطناعي في التسويق والإعلانات المخصصة. وتهتم الشركات اليوم بآراء عملائها وترغب دائماً في جعلهم عملاء مستمرين وضمان بقاء سمعة الشركة بشكل جيد، لذلك تحتاج الشركات لمتابعة ومراقبة أي تغير في آراء الجماهير، وهنا تساعد أدوات الذكاء الاصطناعي بتحليل بيانات مواقع التواصل الاجتماعي المختلفة والمنشورات التي تحمل كلماتٍ مفتاحية تعبر عن الشركة لفهم آراء العملاء والجماهير على هذا المنصات، فيمكن دراسة الآراء الإيجابية والسلبية عن منتجٍ معين لتحسين جودة المنتجات وضمان تجربة خدمة عملاء متميزة. كما تساعد أدوات الذكاء الاصطناعي التحليلية على متابعة أهداف الحملات التسويقية من ناحية فهم التعليقات والمشاعر التى تعبر عنها، ودراسة العوامل التي تدفع العميل لشراء منتجات الشركة، مما يساعد على تحديد استراتيجيات أفضل في التسويق والتركيز على نقاط القوة التى تهم العملاء ويبحثون عنها، كما تمكن مدير حملات التسويق من فهم أنواع العملاء بالتالي استهدافٌ أفضل. الذكاء الاصطناعي وإنشاء المحتوى التسويقي يمكن لأدوات الذكاء الاصطناعي توليد محتوى تسويقي يناسب العملاء المختلفين بناءً على تعاملاتهم السابقة والبيانات التى تملكها الشركة أو تستطيع الوصول إليها من أجل استهدافٍ فعال ومناسب لكل عميل، فبدلاً من تصميم صورة واحدة يمكن تصميم عدد من الصور تناسب أنواع مختلفة من المستخدمين واستخدام الذكاء الاصطناعي في عرض الصورة المناسبة لكل نوعٍ من العملاء، ويمكنك الاطلاع على هذا المقال لفهم كيفية استغلال هذه التقنيات بشكلٍ عملي "دليل استخدام ChatGPT API لتحسين خدماتك عبر الإنترنت " تحسين جودة خدمة العملاء باستخدام الذكاء الاصطناعي خدمة العملاء من العوامل التنافسية التي تسعى كل الشركات في تحسينها لضمان قوتها وانتشارها في الأسواق ولاكتساب عملاء دائمين، لذا سترحب الشركات بالاستثمار في أي تحسين ممكن لهذه العملية و تحسين تجربة العنلاء من خلال الذكاء الاصطناعي، ومن أمثلة هذه الأدوات أنظمة المحادثات الذكية قادرة على الرد على أسئلة العملاء المتكررة والإجابة عن أسئلتهم عن مختلف الخدمات والسلع التي تقدمها الشركة. يمكن للشركات على سبيل المثال استخدام نماذج تعلم الآلة لتوقع العملاء الذين يفكرون في إلغاء الاشتراكات ومحاولة تقديم عروض مغرية تشجعهم على البقاء مشتركين في الخدمات التي تقدمها الشركة، كما يمكن دراسة وتحديد احتياجات العملاء والمنتجات التي يبحثون عنها وتطويرها، والاستهداف الذكي باستخدام العروض المناسبة لكل عميل. أتمتة إدارة الإعلانات بالذكاء الاصطناعي أتمتة إدارة الإعلانات أو الإعلانات المبرمجة Programmatic advertising هي طريقة تسمح للشركة بشراء مساحة لعرض الإعلانات أو بيع مساحة إعلانية بشكل آلي، من مزايا هذه الطريقة الإعلانية أنها تستخدم نماذج الذكاء الاصطناعي في توقع المواقع المناسبة لعرض الإعلانات المناسبة لفئات العملاء المستهدفة بشكلٍ آلي مما يوفر التكلفة بشكلٍ كبير مقارنة بطرق التسويق العادية المحكومة بمنصة واحدة وقد لا تصل إلى الجمهور المستهدف. أمثلة على الذكاء الاصطناعي في القطاع المالي لا شك أن تقنيات القطاع المالي financial technology (fintech)‎ تعد اليوم من المجالات الهامة والأسرع نمواً، حيث نجد اليوم أمثلة متنوعة على استخدام الذكاء الاصطناعي في خدمة العملاء وأنظمة تحليل البيانات المالية واتخاذ قرارات صائبة مثل تقرير إعطاء القروض من عدمه بناء على البيانات المستخدمة من قبل نماذج الذكاء الاصطناعي لتحديد المخاطر المحتملة من إقراضهم، ومن المتوقع أن يستمر الذكاء الاصطناعي في النمو والتقدم في هذا المجال، مما يعزز من كفاءة العمليات المالية ويقلل من حدوث الأخطاء البشرية. أمثلة على الذكاء الاصطناعي في الزراعة تُستخدم تقنيات الذكاء الاصطناعي ولا سيما تقنية إنترنت الأشياء IoT في تطوير أنظمة الزراعة الذكية، فيمكن استخدام الرؤية الحاسوبية Computer Vision لاكتشاف الآفات الزراعية وأمراض النباتات ويمكن استخدام كاميرات عادية أو طائرات مسيرة تجمع الصور ومقاطع الفيديو للأراضي الزراعية، ويتم استخدام الذكاء الاصطناعي مدعوما بالبيانات التى تجمعها أدوات الاستشعار والقياس المختلفة في مراقبة نمو المحاصيل لضمان جودتها وخلو التربة أو النباتات من المشاكل التي قد تدمر المحصول أو تؤثر على جودته. الخاتمة تعرفنا في هذا المقال على بعض الأمثلة لتطبيق الذكاء الاصطناعي في مجالات مختلفة مثل التعليم والطب والتسويق والزراعة والقطاع المالي، بعد الاطلاع على هذه الأمثلة المتنوعة، يمكن التنبؤ بزيادة انتشار استخدامات الذكاء الاصطناعي في المستقبل، وتعزيز تطبيق وتشغيل قدراته في توفير حلول ذكية لأغلب القطاعات الاقتصادية والبشرية لتحسين جودة الخدمات المقدمة والتنافسية وتوفير فرصٍ عمل جديدة. نأمل أن تكون هذه المقالة ملهمةً لك للتفكير في استخدامات جديدة للذكاء الاصطناعي في مجالك، ونرحب بأن تشاركنا في التعليقات المزيد من الأمثلة والأفكار. اقرأ أيضًا تطبيقات الذكاء الاصطناعي مصطلحات الذكاء الاصطناعي للمبتدئين من هو مهندس الذكاء الاصطناعي تعرف على أهم كتب الذكاء الاصطناعي المجانية
    1 نقطة
  36. عند إنشاء موقع الويب، نختار في البداية ألوانًا أساسية معروفة ومحددة بعناية، ولكن مع مرور الوقت، قد نضيف ألوانًا جديدة أكثر تخصيصًا أو نحتاج لإضافة إضاءة إلى لون زر معين لأسباب تتعلق بإمكانية الوصول وغيرها من الأمور الأخرى دون تخطيط جيد، مما قد يؤدي إلى حدوث فوضى في الألوان وفقدان جمالية التصميم، فكيف نضمن أن الألوان التي نختارها تتناسب مع نظام التصميم الخاص بمشروعنا؟ نكتشف في مقال اليوم دالة مزج الألوان()color-mix الجديدة نسبيًا في لغة CSS وكيف نستطيع من خلالها إنشاء ألوان متنوعة تعزز تصميم الموقع وجماليته. ما هي وظيفة الدالة ()color-mix إن الدالة ()color-mix دالة مهمة جدًا لتصميم المواقع، فهي تسمح بتحديد اللونين اللذين نريد مزجهما معًا لإنتاج لون جديد، كما تمكننا من التحكم في مقدار كل لون في المزيج واختيار مساحة الاستيفاء اللوني (color interpolation space) التي تحدد بدقة كيفية دمج الألوان مع بعضها البعض. فلفهم كيفية مزج الألوان مع بعضها علينا فهم طريقة الاستيفاء اللوني (color interpolation) لكونها معاملًا مطلوبًا لهذه الدالة، وسنناقش هذا الموضوع في فقرة لاحقة، ونعتمد على المعامل srgb في الأمثلة الحالية. سنحدد كمية كل لون في المزيج اللوني على هيئة نسبة مئوية، وفي حال عدم وضع النسب المئوية ستضع الدالة ()color-mix نسبة افتراضية 50% لكل من اللونين كما هو موضح في المثال التالي، فعند دمج اللون الأزرق مع الأحمر بدون وضع نسب مئوية ستكون النتيجة هي اللون البنفسجي. أما في حال تحديد النسبة المئوية لأحد اللونين فستضع الدالة ()color-mix النسبة المئوية للون الآخر بشكل افتراضي بحيث يكون مجموع النسبتين هو 100%. على سبيل المثال إذا أعطينا اللون الأحمر نسبة 10% ستكون النسبة المئوية الافتراضية للون الأزرق هي 90% والعكس صحيح إذا أعطينا اللون الأزرق نسبة 90% ستكون النسبة المئوية الافتراضية للون الأحمر هي 10% وستكون النتيجة نفسها في كلا الحالتين /* Both these will produce the same resultant color */ color-mix(in srgb, blue 90%, red) color-mix(in srgb, blue, red 10%) أما إذا كان مجموع النسبتين المئويتين للونين أقل من 100% فسيكون تصرف الدالة ()color-mix مختلفًا قليلًا، إذ ستحفظ المجموع كمضاعف ألفا (alpha multiplier) ومن ثم تقيّس اللونين بالاعتماد على هذا المضاعف بحيث يصل المجموع إلى 100%. أي سيعوض الفرق بين النسبتين وتوسَّعان لجعل مجموعها 100% مما يضمن حساب اللون النهائي بشكل صحيح. في المثال التالي ستمزج الدالة ()color-mix نفس الكمية من كل لون في كلا الحالتين، وستكون النتيجة نفس اللون في الحالة الثانية (حيث يكون مجموع النسبيتن 40%) ولكن بمضاعف ألفا قيمته 0.4 الذي يعوض انخفاض مجموع هاتين النسبتين لينتج نفس اللون لكنه شفاف جزئيًا لكون مجموع النسب أقل من 100%. /* Result: rgb(128 0 128) */ color-mix(in srgb, blue, red) /* Result: rgb(128 0 128 / 0.4) */ color-mix(in srgb, blue 20%, red 20%) إنشاء تدرجات فاتحة وداكنة للون معين باستخدام الدالة ()color-mix غالبًا ما نحتاج في الواقع العملي إلى إنتاج تدرجات أفتح وأغمق للون معين، ولتحقيق المطلوب يمكننا دمج اللون الأبيض أو الأسود مع اللون الأساسي بنسب متفاوتة حسب الحاجة باستخدام الدالة ()color-mix. نخلط في المثال أدناه كميات مختلفة من اللونين الأبيض والأسود مع اللون الأزرق الأساسي باستخدام الدالة ()color-mix للحصول على تدرجات زرقاء فاتحة وداكنة. /* Initial base color */ .bg-blue { background-color: blue; } /* 50% blue, 50% white */ .bg-blue-light { background-color: color-mix(in srgb, blue, white); } /* 25% blue, 75% white */ .bg-blue-lighter { background-color: color-mix(in srgb, blue, white 75%); } /* 50% blue, 50% black */ .bg-blue-dark { background-color: color-mix(in srgb, blue, black); } /* 25% blue, 75% black */ .bg-blue-darker { background-color: color-mix(in srgb, blue, black 75%); } سنحصل على التدرجات المبينة في الصورة التالية: استخدام خصائص محددة لإعادة استخدام التدرجات اللونية يمكننا تخزين قيم الدالة ()color-mix كخصائص محددة custom properties وإعادة استخدامها ضمن الكود، وهذا الأسلوب مفيد عندما نريد إنشاء تدرجات أفتح أو أغمق للون الأساسي. يوضح الكود التالي طريقة تعريف اللون الأساسي وتخزينه كقيمة للخاصية brand-- وبهذا يسهل تعديل اللون والحصول على درجات مختلفة فاتحة وداكنة منه. :root { --brand: rgb(0 0 255); --brand-light: color-mix(in srgb, var(--brand), white); --brand-lighter: color-mix(in srgb, var(--brand), white 75%); --brand-dark: color-mix(in srgb, var(--brand), black); --brand-darker: color-mix(in srgb, var(--brand), black 75%); } كما يمكن أيضًا إنشاء تدرجات مختلفة من الشفافية عن طريق الخاصية transparent على النحو التالي: :root { --brand: rgb(0 0 255); --brand-alpha-50: color-mix(in srgb, blue, transparent); --brand-alpha-75: color-mix(in srgb, blue 75%, transparent); } مثال عملي لتنسيق تدرجات لونية للزر باستخدام خصائص محددة للدالة ()color-mix سننسق في هذا المثال العملي أزار بسيطة أساسية وثانوية في الموقع، نعرف في البداية خصائص محددة تمثل اللون الأساسي وهو الأزرق، واللون الثانوي الناتج عن دمج الأزرق مع الزهري باستخدام الدالة ()color-mix ونعرف من خلالها أيضًا تدرجات أفتح لكلا اللونين كما يلي: :root { --brand: rgb(0 0 255); --brand-light: color-mix(in srgb, blue, white); --secondary: color-mix(in srgb, var(--brand), pink); --secondary-light: color-mix(in srgb, var(--secondary), white); } في الخطوة الثانية، سنطبق اللون الأساسي والثانوي على الأزرار الأساسية والثانوية في الموقع، ونضيف تأثير لتفتيح ألوان الأزرار عندما نمرر مؤشر الفأرة فوقها لإحداث تأثير (hover states) كما يلي: button { background-color: var(--brand); color: white; } button:where(:hover, :focus) { background-color: var(--brand-light); } button.secondary { background-color: var(--secondary); } button.secondary:where(:hover, :focus) { background-color: var(--secondary-light); } ستظهر نتيجة الكود على النحو التالي: See the Pen Untitled by Hsoub Academy (@HsoubAcademy) on CodePen. لسنا ملزمين بتعريف الخصائص في مستوى الجذر فقط، إذ يمكننا على سبيل المثال تعريف خاصية اللون الأساسي للمكوّن أو الزر، وإنشاء تدرجات مختلفة لهذا اللون ضمن تنسيق المكوّن باستخدام الدالة ()color-mix، ويمكن ببساطة تطبيق لون أساسي مختلف للنسخة الثانوية من المكوّن، كما يوضح الكود التالي: .card { --color: blue; background: color-mix(in srgb, var(--color), white 80%); border-top: 5px solid var(--color); padding: 1rem; } .secondary { --color: deeppink; } وستظهر نتيجة الكود أعلاه على النحو التالي: See the Pen color-mix2 by Hsoub Academy (@HsoubAcademy) on CodePen. وفيما يلي عرض توضيحي لتطبيق هذا المفهوم على مجموعة متنوعة من مكونات واجهة المستخدم، لاحظ انسجام الألوان وتناغمها. See the Pen color-mix-3 by Hsoub Academy (@HsoubAcademy) on CodePen. إنشاء تدرجات الألوان الدافئة والباردة باستخدام الدالة ()color-mix تستخدم الدالة ()color-mix في الغالب لإنشاء تدرجات مختلفة أفتح أو أغمق من لون موجود، كما يمكن استخدامها أيضًَا لإنشاء تدرجات دافئة وباردة من اللون من خلال مزج ألوان دافئة أو باردة مع الألوان الأساسية. في هذا المثال، نحدد لوحة ألوان أساسية مأخوذة من موقع Coolors ثم نضيف الألوان التي نريد مزجها لإنشاء التدرجات اللونية الدافئة والباردة بتعريف خصائص محددة: :root { --yellow: rgb(221 215 141); --peach: rgb(220 191 133); --chocolate: rgb(139 99 92); --khaki: rgb(96 89 77); --grey: rgb(147 162 155); --mix-warm: red; --mix-cool: blue; } .palette > div { --color: var(--yellow); &:nth-child(2) { --color: var(--peach); } &:nth-child(3) { --color: var(--chocolate); } &:nth-child(4) { --color: var(--khaki); } &:nth-child(5) { --color: var(--grey); } } بعد ذلك سنستخدم هذه الخصائص لمزج اللون الثاني مع اللون الأساسي الأصلي مع تحديد كمية هذا اللون، كما سنحدد أيضًا القيم الافتراضية فإذا لم تمرر قيمة افتراضية للدالة ()color-mix فسيتسخدم اللون الأساسي الأصلي. .palette > div { background: color-mix( in srgb, var(--color), var(--mix, var(--color)) var(--amount, 10%) ); } بهذه الطريقة سنكون قادرين على مزج ألوان مختلفة وتطبيق ذلك على كامل اللوحة .cool { --mix: var(--mix-cool); } .cool--20 { --amount: 20%; } .warm { --mix: var(--mix-warm); } .warm--20 { --amount: 20%; } See the Pen color-mix-4 by Hsoub Academy (@HsoubAcademy) on CodePen. تحديد فضاء الألوان المستخدمة في الاستيفاء اللوني ضمن الدالة ()color-mix استخدمنا في الفقرات السابقة نظام الألوان srgb (وهو النموذج اللوني المعياري أحمر أخضر أزرق) كطريقة لتداخل اللون، لكننا نستطيع أن نغير النتيجة بشكل جذري عن طريق تعديل فضاء الألوان color spaces المستخدم للتداخل أو الاستيفاء اللوني interpolation. تعد فضاءات الألوان مفاهيم معقدة وشرحها يتجاوز نطاق هذه المقالة، لكن من الجدير بالذكر بعض مزايا وعيوب فضاءات الألوان عند اتخاذ قرار بشأن استخدامها في الدالة ()color-mix. خيارات فضاءات الألوان يعني استيفاء اللون الطريقة التي ينتقل بها لون إلى لون آخر، ويتم ذلك باستخدام ما يُعرف بالتدرجات اللونية gradients (مثل تحول لون من الأحمر إلى الأزرق تدريجيًا) في النظام التقليدي RGB، قد تظهر الألوان في وسط التدرج بشكل باهت، بينما باستخدام أنظمة ألوان أخرى مثل lch أو oklch ستبقى الألوان مضيئة وحيوية حتى في وسط التدرج، وتكون النتائج مختلفة تمامًا عند تطبيقها على لوحات الألوان الدافئة والباردة في المثال السابق، ويمكنك رؤية الفرق بين هذه الأنظمة في الصورة أدناه. بالرغم من أن نظامي الألوان sRGB و HSL شائعان لتمثيل الألوان، لكنهما لا يقدمان نتائج دقيقة عندما يتعلق الأمر بكيفية رؤية البشر للألوان أما نموذجا oklch وoklab فهما طريقتان أحدث لتمثيل الألوان مصممتان بحيث تكون التغيرات العددية فيها مماثلة للتغيرات التي يدرك فيها الإنسان الألوان بحواسه فإذا غيرت اللون بمقدار معين على محور الإحداثيات، فإن التغيير سيكون ملاحظًا أو مرئيًا بنفس المقدار بغض النظر عن اللون الأصلي، لذا يعطي استخدام oklch وoklab نتائج أكثر دقة في رؤية الألوان عند مزجها أو تدرجها، لهذا يفضل معظم المطورن استخدامهما عند مزج الألوان باستخدام دالة ()color-mix، ولكن الخيار متروك لك في النهاية. مسارات الاستيفاء اللوني الأقصر والأطول يمكننا في فضاءات الألوان الدائرية مثل oklch و oklab و hsl اختيار الاتجاه الذي الذي ننتقل أو نتدرج فيه من لون إلى آخر لتحقيق الدمج، فعندما نمزج لونين بالتساوي ستكون زاوية اللون الناتج في منتصف الطريق بين زاويتي اللونين، وتختلف هذه الزاوية بالاعتماد على مسار الاستيفاء وإن كان يتبع المسار الأطول والأقصر حول دائرة اللون. تخيل دائرة الألوان مثل عجلة ألوان، إذا كان لديك لونان على هذه العجلة، فيمكنك الانتقال من لون لآخر عن طريق الدوران في اتجاه عقارب الساعة أو عكس اتجاه عقارب الساعة. فعند مزج لونين بالتساوي سيكون اللون الناتج في منتصف الطريق بين اللونين على العجلة ولكن يمكن أن يكون هناك مسار أقصر ومسار أطول للوصول إلى هذا اللون، في حال اختيار المسار الأقصر سيكون الدوران عبر جزء صغير من العجلة، بينما في المسار الأطول سيكون الدوران عبر جزء أكبر من العجلة. لذا، فإن اختيار الاتجاه الذي تتبعه يمكن أن يؤثر على النتيجة النهائية للون الناتج. color-mix(in hsl, rgb(255 88 88), rgb(86 86 255)); color-mix(in hsl longer hue, rgb(255 88 88), rgb(86 86 255)); جرب مزج الألوان في فضاءات الألوان وأطوال المسارات المختلفة الموضحة في الإطار التالي، ولاحظ الفرق في النتائج التي ستحصل عليها: See the Pen color-mix-5 by Hsoub Academy (@HsoubAcademy) on CodePen. دعم متصفحات الإنترنت للدالة ()color-mix دُعمت الدالة ()color-mix في جميع المتصفحات الحديثة من منتصف عام 2023، وبالطبع لن يملك جميع المستخدمين نسخًا حديثة من المتصفحات لذا سيكون الحل بوضع قيمة أولية ثابتة للألوان أولاً (بدون الاعتماد على الدالة ()color-mix)، فإذا لم يدعم المتصفح الدالة سيستخدم هذه الألوان المحددة. على سبيل المثال، لن تتمكن المتصفحات التي لا تدعم الدالة ()color-mix من التعامل مع السطر الثاني من هذا الكود: div { /* First declaration is fallback for browsers that do not support color-mix() */ background: rgb(150 0 255); background: color-mix(in srgb, blue, red); } ولمعرفة إذا كان المتصفح يدعم الدالة ()color-mix يمكن استخدام الاستعلام التالي: .card { background: lightblue; } @supports (color-mix(in srgb, blue, white)) { .card { --color: blue; background: color-mix(in srgb, var(--color), white 80%); border-top: 5px solid var(--color); } } كما يمكنك ثثبيت ملحق إضافي يدعى PostCSS يتيح لك كتابة جميع وظائف الدالة ()color-mix دون الحاجة لمعرفة حالة المتصفح حيث يقوم بتحويل الكود تلقائيًا إلى كود CSS متوافق مع جميع المتصفحات. على سبيل المثال يقوم الملحق PostCSS بتحويل الكود التالي: .some-element { background-color: color-mix(in srbg, red, blue); } إلى كود CSS كما يلي: .some-element { background-color: rgb(128 0 128); } الخلاصة تعرفنا في هذا المقال على طريقة استخدام الدالة ()color-mix لإنشاء تدرجات مختلفة للألوان ،وطريقة استخدام هذه الدالة لدمج الألوان بطرق مختلفة والاستفادة منها في تصميم المواقع، كما تعرفنا على دعم المتصفحات لهذه الدالة ويمكن القول أننا مقبلون على عصر جديد من التعامل مع الألوان على مواقع وتطبيقات الويب. ترجمة وبتصرف للمقال Creating color palettes with the CSS color-mix() function لكاتبته Michelle Barker اقرأ أيضًا تعرف على CSS التعامل مع الألوان في CSS التنسيقات الأساسية للعناصر في CSS كيفية اكتشاف دعم المتصفحات للميزات أثناء اختبار مشاريع الويب
    1 نقطة
  37. سنتعرف في هذه السلسلة من المقالات على منصة Hugging Face وهي منصة تفاعلية سهلة الاستخدام للمهتمين بإنشاء تطبيقات الذكاء الاصطناعي وتعلم الآلة، فهي توفر أكثر من 400 ألف نموذج جاهز للاستخدام وتوفر مجموعات بيانات مخصصة لتدريب نماذج جديدة، كما أنها تتيح لك التواصل مع مجتمع ضخم مع المهتمين بتعلم الآلة من جميع أنحاء العالم ومشاركة تجاربك معهم. سنبدأ السلسلة بالتعرف على أداة برمجية فعالة تعمل على هذه المنصة وهي المكتبة Transformers التي تسهل استخدام نماذج تعلم الآلة الحديثة وتمكنك من أداء عدة مهام متعلقة بالذكاء الاصطناعي، ونتعرف على النماذج المتنوعة التي توفرها هذه المكتبة للتعامل مع النصوص والصور والصوت والوسائط المتعددة كما نستعرض مختلف إطارات العمل البرمجية التي تدعمها وأهم تطبيقاتها. ما هي المكتبة Transformers مكتبة المحوّلات Transformers هي أحدث تقنيات تعلُّم الآلة المستخدمة مع أطر عمل الذكاء الاصطناعي الشهيرة مثل باي تورش PyTorch وتنسرفلو TensorFlow و JAX، وهي تزود المبرمجين بواجهات برمجة تطبيقات APIs وأدوات مساعدة تُسهّل عليهم تحميل أحدث نماذج تعلم الآلة المدربة مسبقًا pretrained models وإعادة تدريبها. وتوفر هذه النماذج المدربة مسبقًا وقتك وجهدك فلن تحتاج لجمع البيانات، وتنظيفها، وتحضيرها، ولا لتشغيل عمليات التدريب والتحسين بل يمكنك استخدام النموذج مباشرة في تطبيقك، كما توفر أيضًا الموارد وعمليات الحوسبة وحتى استهلاك الطاقة الذي تحتاجه لتدريب نماذج جديدة من الصفر، وتخدمك في العديد من مجالات الذكاء الاصطناعي وإليك أهما: مجال معالجة اللغة الطبيعية Natural Language Processing: ومن أهم تطبيقاته تصنيف النصوص text classification، والتعرّف على الكائنات المسماة named entity recognition، والإجابة على الأسئلة question answering، والاختيار من متعدد multiple choice، ونمذجة اللغة language modeling، والتلخيص summarization، والترجمة translation، وتوليد النص text generation. مجال الرؤية الحاسوبية Computer Vision: تستخدم الرؤية الحاسوبية في مشاريع عديدة مثل: تصنيف الصور image classification، والتعرّف على الكائنات object detection، وتجزئة الصور segmentation بناءً على خصائص محددة وغير ذلك. مجال الصوتيات Audio: ومن أهم تطبيقاته التعرّف التلقائي على الكلام automatic speech recognition، وتصنيف المقاطع الصوتية audio classification. مجال الأنماط المتعددة Multimodal: يقصد به التعامل مع أنواع متعددة من المُدخَلات ومن أمثلتها الإجابة على الأسئلة الموجودة ضمن جدول معين table question answering، والتعرّف البصري على الحروف optical character recognition، واستخراج المعلومات من المستندات الممسوحة ضوئيًا، وتصنيف مقاطع الفيديو video classification، والإجابة على الأسئلة مرئيًا visual question answering أي الإجابة على أسئلة حول الصور. وتدعم مكتبة المحولات التشغيل البيني framework interoperability لأطر العمل الثلاثة PyTorch و TensorFlow و JAX أي أن بإمكانك جمعها في مشروع واحد بمرونة تامة، فهي تتيح لك استخدام إطار عمل مختلف في كل مرحلة من مراحل بناء النموذج؛ تستطيع مثلًا تدريب النموذج بإطار عمل معين، ثم استخدام إطار آخر في مرحلة الاستدلال inference وهكذا، يمكنك أيضًا تصدير نماذج الآلي بصيغ مثل: ONNX و TorchScript لنشرها في بيئات الإنتاج. النماذج التي يدعمها كل إطار عمل يبين الجدول التالي نماذج المكتبة التي يدعمها كل إطار عمل من الأطر التالية PyTorch و TensorFlow و JAX حتى تاريخ ترجمة هذا المقال، سواء كانت مميزة بمُرمِز tokenizer بايثون بطيء"slow" أو سريع "fast". النموذج توافقيته مع PyTorch؟ توافقيته مع TensorFlow؟ توافقيته مع JAX؟ ALBERT نعم نعم نعم ALIGN نعم لا لا AltCLIP نعم لا لا Audio Spectrogram Transformer نعم لا لا Autoformer نعم لا لا Bark نعم لا لا BART نعم نعم نعم BARThez نعم نعم نعم BARTpho نعم نعم نعم BEiT نعم لا نعم BERT نعم نعم نعم Bert Generation نعم لا لا BertJapanese نعم نعم نعم BERTweet نعم نعم نعم BigBird نعم لا نعم BigBird-Pegasus نعم لا لا BioGpt نعم لا لا BiT نعم لا لا Blenderbot نعم نعم نعم BlenderbotSmall نعم نعم نعم BLIP نعم نعم لا BLIP-2 نعم لا لا BLOOM نعم لا نعم BORT نعم نعم نعم BridgeTower نعم لا لا BROS نعم لا لا ByT5 نعم نعم نعم CamemBERT نعم نعم لا CANINE نعم لا لا Chinese-CLIP نعم لا لا CLAP نعم لا لا CLIP نعم نعم نعم CLIPSeg نعم لا لا CLVP نعم لا لا CodeGen نعم لا لا CodeLlama نعم لا نعم Conditional DETR نعم لا لا ConvBERT نعم نعم لا ConvNeXT نعم نعم لا ConvNeXTV2 نعم نعم لا CPM نعم نعم نعم CPM-Ant نعم لا لا CTRL نعم نعم لا CvT نعم نعم لا Data2VecAudio نعم لا لا Data2VecText نعم لا لا Data2VecVision نعم نعم لا DeBERTa نعم نعم لا DeBERTa-v2 نعم نعم لا Decision Transformer نعم لا لا Deformable DETR نعم لا لا DeiT نعم نعم لا DePlot نعم لا لا Depth Anything نعم لا لا DETA نعم لا لا DETR نعم لا لا DialoGPT نعم نعم نعم DiNAT نعم لا لا DINOv2 نعم لا لا DistilBERT نعم نعم نعم DiT نعم لا نعم DonutSwin نعم لا لا DPR نعم نعم لا DPT نعم لا لا EfficientFormer نعم نعم لا EfficientNet نعم لا لا ELECTRA نعم نعم نعم EnCodec نعم لا لا Encoder decoder نعم نعم نعم ERNIE نعم لا لا ErnieM نعم لا لا ESM نعم نعم لا FairSeq Machine-Translation نعم لا لا Falcon نعم لا لا FastSpeech2Conformer نعم لا لا FLAN-T5 نعم نعم نعم FLAN-UL2 نعم نعم نعم FlauBERT نعم نعم لا FLAVA نعم لا لا FNet نعم لا لا FocalNet نعم لا لا Funnel Transformer نعم نعم لا Fuyu نعم لا لا Gemma نعم لا نعم GIT نعم لا لا GLPN نعم لا لا GPT Neo نعم لا نعم GPT NeoX نعم لا لا GPT NeoX Japanese نعم لا لا GPT-J نعم نعم نعم GPT-Sw3 نعم نعم نعم GPTBigCode نعم لا لا GPTSAN-japanese نعم لا لا Graphormer نعم لا لا GroupViT نعم نعم لا HerBERT نعم نعم نعم Hubert نعم نعم لا I-BERT نعم لا لا IDEFICS نعم لا لا ImageGPT نعم لا لا Informer نعم لا لا InstructBLIP نعم لا لا Jukebox نعم لا لا KOSMOS-2 نعم لا لا LayoutLM نعم نعم لا LayoutLMv2 نعم لا لا LayoutLMv3 نعم نعم لا LayoutXLM نعم لا لا LED نعم نعم لا LeViT نعم لا لا LiLT نعم لا لا LLaMA نعم لا نعم Llama2 نعم لا نعم LLaVa نعم لا لا Longformer نعم نعم لا LongT5 نعم لا نعم LUKE نعم لا لا LXMERT نعم نعم لا M-CTC-T نعم لا لا M2M100 نعم لا لا MADLAD-400 نعم نعم نعم Marian نعم نعم نعم MarkupLM نعم لا لا Mask2Former نعم لا لا MaskFormer نعم لا لا MatCha نعم لا لا mBART نعم نعم نعم mBART-50 نعم نعم نعم MEGA نعم لا لا Megatron-BERT نعم لا لا Megatron-GPT2 نعم نعم نعم MGP-STR نعم لا لا Mistral نعم لا نعم Mixtral نعم لا لا mLUKE نعم لا لا MMS نعم نعم نعم MobileBERT نعم نعم لا MobileNetV1 نعم لا لا MobileNetV2 نعم لا لا MobileViT نعم نعم لا MobileViTV2 نعم لا لا MPNet نعم نعم لا MPT نعم لا لا MRA نعم لا لا MT5 نعم نعم نعم MusicGen نعم لا لا MVP نعم لا لا NAT نعم لا لا Nezha نعم لا لا NLLB نعم لا لا NLLB-MOE نعم لا لا Nougat نعم نعم نعم Nyströmformer نعم لا لا OneFormer نعم لا لا OpenAI GPT نعم نعم لا OpenAI GPT-2 نعم نعم نعم OpenLlama نعم نعم لا OPT نعم نعم نعم OWL-ViT نعم لا لا OWLv2 نعم لا لا PatchTSMixer نعم لا لا PatchTST نعم لا لا Pegasus نعم نعم نعم PEGASUS-X نعم لا لا Perceiver نعم لا لا Persimmon نعم لا لا Phi نعم لا لا PhoBERT نعم نعم نعم Pix2Struct نعم لا لا PLBart نعم لا لا PoolFormer نعم لا لا Pop2Piano نعم لا لا ProphetNet نعم لا لا PVT نعم لا لا QDQBert نعم لا لا Qwen2 نعم لا لا RAG نعم نعم لا REALM نعم لا لا Reformer نعم لا لا RegNet نعم نعم نعم RemBERT نعم نعم لا ResNet نعم نعم نعم RetriBERT نعم لا لا RoBERTa نعم نعم نعم RoBERTa-PreLayerNorm نعم نعم نعم RoCBert نعم لا لا RoFormer نعم نعم نعم RWKV نعم لا لا SAM نعم نعم لا SeamlessM4T نعم لا لا SeamlessM4Tv2 نعم لا لا SegFormer نعم نعم لا SEW نعم لا لا SEW-D نعم لا لا SigLIP نعم لا لا Speech Encoder decoder نعم لا نعم Speech2Text نعم نعم لا SpeechT5 نعم لا لا Splinter نعم لا لا SqueezeBERT نعم لا لا StableLm نعم لا لا SwiftFormer نعم لا لا Swin Transformer نعم نعم لا Swin Transformer V2 نعم لا لا Swin2SR نعم لا لا SwitchTransformers نعم لا لا T5 نعم نعم نعم T5v1.1 نعم نعم نعم Table Transformer نعم لا لا TAPAS نعم نعم لا TAPEX نعم نعم نعم Time Series Transformer نعم لا لا TimeSformer نعم لا لا Trajectory Transformer نعم لا لا Transformer-XL نعم نعم لا TrOCR نعم لا لا TVLT نعم لا لا TVP نعم لا لا UL2 نعم نعم نعم UMT5 نعم لا لا UniSpeech نعم لا لا UniSpeechSat نعم لا لا UnivNet نعم لا لا UPerNet نعم لا لا VAN نعم لا لا VideoMAE نعم لا لا ViLT نعم لا لا VipLlava نعم لا لا Vision Encoder decoder نعم نعم نعم VisionTextDualEncoder نعم نعم نعم VisualBERT نعم لا لا ViT نعم نعم نعم ViT Hybrid نعم لا لا VitDet نعم لا لا ViTMAE نعم نعم لا ViTMatte نعم لا لا ViTMSN نعم لا لا VITS نعم لا لا ViViT نعم لا لا Wav2Vec2 نعم نعم نعم Wav2Vec2-BERT نعم لا لا Wav2Vec2-Conformer نعم لا لا Wav2Vec2Phoneme نعم نعم نعم WavLM نعم لا لا Whisper نعم نعم نعم X-CLIP نعم لا لا X-MOD نعم لا لا XGLM نعم نعم نعم XLM نعم نعم لا XLM-ProphetNet نعم لا لا XLM-RoBERTa نعم نعم نعم XLM-RoBERTa-XL نعم لا لا XLM-V نعم نعم نعم XLNet نعم نعم لا XLS-R نعم نعم نعم XLSR-Wav2Vec2 نعم نعم نعم YOLOS نعم لا لا YOSO نعم لا لا الخلاصة تعرفنا في مقال اليوم على منصة Hugging Face التفاعلية التي تقدم نماذج مدربة جاهزة ومجموعات بيانات للتدريب تسرع عملية تطوير تطبيقات الذكاء الاصطناعي وتعلم الآلة وتعرفنا على المجالات المختلفة التي يمكن تطبيق الذكاء الاصطناعي فيها باستخدام هذه المكتبة كما استعرضنا أطر العمل المختلفة التي توفرها لبناء النماذج. ترجمة -وبتصرف- لقسم Transformers من توثيقات Hugging Face. اقرأ أيضًا مكتبات وأطر عمل الذكاء الاصطناعي: القوة الكامنة خلف الأنظمة الذكية تلخيص النصوص باستخدام الذكاء الاصطناعي أسئلة شائعة حول الذكاء الاصطناعي استخدام النماذج التوليديّة Generative models لتوليد الصور
    1 نقطة
  38. نعرفك في مقال اليوم على لغة جافا Java إحدى لغات البرمجة العريقة عامة الأغراض وذائعة الصيت بين أوساط المطورين، ونكتشف أبرز مميزاتها وعيوبها ومجالات استخداماتها، ونختم المقال بمجموعة من النصائح والخطوات التي تسهل عليك تعلم الجافا من الصفر حتى الاحتراف. ما هي لغة جافا لغة جافا Java هي لغة برمجة عامة الأغراض أطلقتها شركة صن ميكروسيستمز Sun Microsystems عام 1995، وكان الهدف من تطويرها في الأساس إنشاء لغة برمجة محمولة ومستقلة عن نظام التشغيل فخرجوا لنا بلغة البرمجة جافا Java التي اقتبس اسمها من جزيرة جافا المشهورة بإنتاج القهوة وهي كما تعرف المشروب المفضل لدى معشر المبرمجين، كما أن شعار اللغة يأخذ شكل فنجان من القهوة. وفي عام 2009 استحوذت شركة أوراكل Oracle على شركة Sun Microsystems فأصبحت هي المالك الفعلي للغة البرمجة جافا. وعملت على تطوير إصدارات مختلفة من اللغة وأحدث إصدار من جافا عند كتابة هذا المقال هو Java SE 21 الصادر في سبتمبر عام 2023، وهو إصدار طويل الدعم LTS (سينتهي دعمه الرسمي في سبتمبر 2028) وقد فرضت لغة جافا نفسها اليوم كإحدى أشهر وأقوى لغات البرمجة في العالم، كما أنها من لغات البرمجة الأعلى طلبًا في سوق العمل وهي تستخدم في العديد من المجالات والتطبيقات التي سنتعرف عليها في فقرات لاحقة. ما أهمية آلة جافا الوهمية JVM للغة البرمجة جافا؟ تعتمد لغة جافا في تصميمها على مبدأ الكتابة مرة واحدة والتشغيل في أي مكان "write once, run anywhere" مستعينة بما يسمى آلة جافا الوهمية Java Virtual Machine أو ما يعرف اختصارًا JVM، فأي نظام تشغيل مثبت عليه JVM يمكنه تشغيل تطبيقات جافا دون أي تغيير في الكود، وآلة جافا الوهمية أو الافتراضية هي عبارة عن برنامج موجود ضمن نظام التشغيل مهمته تفسير كود البايت لجافا Java bytecode كي يتمكن من العمل على أجهزة مختلفة وأنظمة مختلفة سواء ويندوز أو لينكس أو ماك أو أندرويد …إلخ فهي بمثلة المحرك الذي يحول كود البايت إلى لغة الآلة الخاص بكل نظام. لم تكن هذه الآلية في العمل متاحة في لغات البرمجة الأخرى والتي كانت تتطلب إعادة كتابة التعليمات البرمجية لكل نظام تشغيل على حدا. ولعل هذه الميزة هي أبرز ما ميز لغة جافا عن باقي لغات البرمجة، ولا تقتصر أهمية آلة جافا الوهمية على تمكين برنامج جافا من العمل في أي بيئة تشغيل، بل تساهم الآلة الوهمية كذلك في الحفاظ على ذاكرة برامج جافا وتحسينها فهي تتضمن ميزة تراقب البرنامج بشكل مستمر وتبحث عن أي بيانات مهملة وغير مستخدمة في الذاكرة وإزالتها ما يساهم في زيادة أداء البرامج وسرعتها. مميزات لغة جافا تتميز لغة جافا بالعديد من الجوانب الإيجابية ومن أبرزها: تعد واحدة من لغات البرمجة عالية المستوى وسهلة التعلم. لغة عامة الأغراض ومتعددة الاستخدامات وتصلح لتطوير العديد من التطبيقات. لغة مشهورة وذائعة الصيت وتملك مجتمع دعم كبير ونشيط يضم الكثير من المطورين المحترفين. يمكن تشغيل أكواد جافا على أي نظام تشغيل بفضل آلة جافا الوهمية JVM. توفر ميزات تعزز أداء البرامج مثل ميزة تجميع للبيانات المهملة في الذاكرة ومسحها تلقائيًا. لغة برمجة آمنة وتوفر العديد من المميزات لحماية التطبيقات. تدعم البرمجة الموزعة أي يمكن بسهولة توزيع تطبيقات Java عبر أجهزة متعددة. سلبيات لغة جافا بالرغم من أن لغة جافا تعد واحدة من لغات البرمجة سهلة التعلم لكنها أصعب من لغات أخرى أحدث مثل بايثون وروبي والتي تناسب المبتدئين أكثر. تعد لغة جافا أبطأ من بعض لغات البرمجة الأخرى مثل C وC++‎. لا توفر الكثير من الأدوات القوية فيما يتعلق بإنشاء واجهات المستخدم الرسومية GUI مقارنة بلغات أخرى مثل بايثون أو C#‎. استخدام لغة جافا مجاني للاستخدامات الشخصية والتطويرية، لكن شركة أوراكل تفرض رسومًا مالية للاستخدام التجاري لإصدارات جافا من الإصدار 11 والإصدارات الأحدث. استخدامات جافا تتميز لغة جافا Java بكونها لغة عامة الأغراض وهي تصلح للاستخدام في مجموعة واسعة من التطبيقات ومن أبرز استخدامات جافا نذكر: تطوير تطبيقات الجوال (تطبيقات أندرويد Android) تطوير الويب تطوير تطبيقات سطح المكتب برمجة ألعاب الفيديو والألعاب الإلكترونية برمجة تطبيقات الذكاء الاصطناعي وإنترنت الأشياء لنناقش كل استخدام من هذه الاستخدامات وأهمية استخدام لغة البرمجة جافا فيه. تطوير تطبيقات الجوال (تطبيقات أندرويد Android) كانت لغة جافا Java اللغة الافتراضية المعتمدة من قبل جوجل من أجل برمجة تطبيقات الأندرويد وهي توفر العديد من المكتبات والأدوات المساعدة في تطوير تطبيقات جوال أصيلة Native سريعة وعالية الأداء وقادرة على الوصول بسهولة إلى كافة موارد ومميزات الجوال. وبالرغم من أن جوجل طورت فيما بعد لغة كوتلن Kotlin واعتبرتها اللغة البرمجية الجديدة المعتمدة لتطوير تطبيقات أندرويد عام 2019 إلا أن لغة جافا لا تزال مستخدمة بشكل كبير في برمجة تطبيقات الجوال. تطوير الويب تصلح لغة جافا أيضًا للاستخدام في مجال تطوير الويب، فهي توفر مجموعة كبيرة من المكتبات وأطر العمل وواجهات برمجة التطبيقات APIs التي تسهل عليك تطوير تطبيقات الويب نذكر من بينها: Spring وMicroNaut و Google Web Toolkit أو اختصارًا GWT، كما أنها لغة برمجة آمنة وتوفر العديد من الميزات المدمجة التي يحتاجها مطورو الويب لتطوير تطبيقات آمنة وموثوقة مثل ميزة التحكم في الوصول Access control والمصادقة Authentication. تطوير تطبيقات سطح المكتب تساعد لغة جافا على برمجة تطبيقات سطح مكتب متوافقة مع كافة أنظمة التشغيل وذات واجهات مستخدم أنيقة وقادرة على تخزين ومعالجة البيانات بكفاءة، وتوفر العديد من الأدوات المساعدة لتطوير تطبيقات سطح المكتب وأشهرها Java Swing و JavaFX وهي عبارة عن مجموعة أدوات توفر لك ما تحتاجه لبناء واجهات المستخدم الرسومية GUI لتطبيقات سطح المكتب. برمجة الألعاب الإلكترونية تعد لغة جافا Java واحدة من أشهر لغات برمجة الألعاب الإلكترونية وبشكل خاص ألعاب الجوال فهي تدعم ميزة تعدد الخيوط threads والمعالجة على التوازي، وتوفر محركات ألعاب ومكتبات وأطر عمل مساعدة في مجال تطوير الألعاب ثنائية وثلاثية الأبعاد متعددة المنصات مثل jMonkeyEngine و libGDX وLWJGL. ومن أشهر الألعاب المطورة باستخدام لغة البرمجة جافا نذكر: لعبة ماين كرافت Minecraft لعبة Asphalt 6 لعبة Star Wars Galaxies برمجة تطبيقات الذكاء الاصطناعي وإنترنت الأشياء تناسب لغة البرمجة جافا Java تطوير تطبيقات الذكاء الاصطناعي وتعلم الآلة وتطوير تطبيقات مضمنة لإنترنت الأشياء IoT فهي توفر العديد من مكتبات تعلم الآلة، كما توفر واجهات برمجة التطبيقات APIs مفيدة في هذا المجال مثل مكتبة TensorFlow و Scikit learn و JML و Weka والتي يمكن الاعتماد عليها لتطوير تطبيقات ذكاء اصطناعي متوافقة مع مختلف المنصات، كما أنها لغة برمجة قوية قادرة على التعامل بكفاءة مع البيانات الضخمة Big Data وتحليلها بسرعة وفعالية. ما الفرق بين جافا و جافا سكريبت بالرغم من تشابه اسمي اللغتين، إلا أن لغة جافا ولغة جافا سكريبت هما لغتا برمجة مختلفتان تمامًا، ولكل منهم صياغة وطريقة مختلفة في كتابة التعليمات والأكواد البرمجية لكنهما تشتركان في بعض الجوانب وتختلفان في جوانب أخرى. تتشابه هاتان اللغتان بكونهما من لغات البرمجة عالية المستوى والشائعة بين معشر المطورين، لكن لغة البرمجة جافا هي لغة برمجة مصرفة compiled عامة الأغراض تستخدم لإنشاء مختلف أنواع التطبيقات التي تعمل ضمن آلة جافا الافتراضية JVM، أو ضمن متصفح يدعم جافا من خلال ما يعرف باسم بريمجات جافا Java applet وتعتمد لغة جافا بشكل أساسي على نموذج البرمجة كائنية التوجه OOP . أما لغة جافا سكريبت فهي لغة برمجة نصية مفسرة interpreted طورتها شركة Netscape Communications عام 1995 وكان الغرض الأساسي منها هو جعل صفحات الويب تفاعلية وديناميكية تعمل ضمن المتصفح أو من طرف العميل كما أنها أصبحت فيما بعد قادرة على العمل خارج المتصفح والعمل من جانب الخادم بفضل بيئة التشغيل نود جي إس Node.js وتدعم لغة جافا سكريبت كل من نموذج البرمجة الإجرائية ونموذج البرمجة كائنية التوجه بنفس الوقت. ما الفرق بين جافا وكوتلن لغة كوتلن Kotlin هي لغة برمجة منبثقة عن لغة جافا Java وهي تعد كذلك من لغات البرمجة القوية والتي تتشابه مع لغة جافا في كونها لغة كائنية التوجه OOP وتعمل ضمن آلة جافا الافتراضية JVM وتتوافق مع العديد من المنصات والأنظمة، كما أنها لغة عامة الأغراض وتستخدم لتطوير مختلف التطبيقات مثل تطبيقات الجوال والويب. ورغم تشابه اللغتين في عدة جوانب إلا أن لغة كوتلن Kotlin أحدث من لغة جافا، وتضيف عدة تحسينات عليها، إذ توفر كوتلن نظامًا صارمًا للتحقق من الأنواع يسهل على المطورين كشف الأخطاء وصيانة الكود البرمجي، وتوفر ميزات لتعزيز أمان التطبيقات مثل أمان القيم الفارغة Null Safety التي تمنع المبرمج من تعيين قيمة فارغة لمتغير ما، فضلًا عن كون شيفراتها البرمجية أكثر اختصارًا وأسهل مقروئيةً، وتستهلك موارد وذاكرة أقل من نظيرتها المكتوبة بلغة جافا Java، وهي كذلك تمكنك من كتابة توابع برمجية جديدة لتوسيع الأصناف البرمجية classes دون الحاجة إلى تعديل الأصناف نفسها. خطوات تعلم جافا إذا كنت ترغب في تعلم جافا Java ولكنك مشتت ولا تعرف من أين تبدأ، فإليك قائمة بأبرز الخطوات التي تساعدك على تعلم لغة جافا من الصفر حتى الاحتراف: قبل البدء بخطوات تعلم لغة جافا أسس نفسك في الخوارزميات والتفكير المنطقي فهي خطوة أساسية لتعلم أي لغة برمجة وفهمها بصورة أسرع. حدد هدفك من تعلم جافا ونوع التطبيقات الذي تهدف لتطويرها باستخدامها، فهذا يساعدك على التركيز على دراسة المواضيع التي تهمك أكثر من غيرها. تعلم كيفية تثبيت لغة جافا على جهازك وكيفية استخدام أحدد محررات الأكواد أو بيئات التطوير المتكاملة IDE الخاصة بها كي تتمكن من كتابة وتنفيذ أكواد جافا وجرب كتابة أول برنامج لك في جافا. تعلم أساسيات البرمجة بلغة جافا مثل أسلوب كتابة شيفرات جافا ومفاهيم المتغيرات وأنواع البيانات الأساسية وهياكل البيانات في جافا واستخداماتها وكيفيه كتابة تعليمات التحكم كالشروط وحلقات التكرار واستخدام الدوال البرمجية. طبق ما تتعلمه من أساسيات على برامج بسيطة مثل برامج حل المعادلات أو ترتيب مجموعة من البيانات بطرق مختلفة، وتدرب على اكتشاف ومعالجة الأخطاء البرمجية فهذه مهارة أساسية لأي مبرمج. بعد أن تتقن الأساسيات انتقل لتعلم مفاهيم متقدمة في جافا وأهمها مبادئ البرمجة كائنية التوجه OOP ومفاهيم الأصناف والكائنات وتعدد الخيوط Java Multi-threading، والحزم والواجهات، وآلية التعامل مع استثناءات جافا Exceptions، وعمليات الإدخال والإخراج، وغيرها من التقنيات التي تساعدك على بناء تطبيقات متكاملة بلغة جافا. تعلم أهم المكتبات وأطر العمل المفيدة لتطوير التطبيقات التي تهتم بها وفق الهدف أو المجال الذي حددته في الخطوة الأولى، وابدأ بتطوير تطبيقات متكاملة تعزز خبرتك في هذا المجال وطور عدة مشاريع تعزز خبرتك في هذا المجال. ابحث عن فرصة عمل مناسبة للعمل كمطور جافا وبناء مشاريع فعلية لعملاء حقيقين، فالعمل الفعلي هو ما يعزز خبرتك الحقيقة ويساعدك على معرفة متطلبات سوق العمل بشكل أفضل. لا تتوقف عن التعلم أبدًا، فالبرمجة مجال متجدد ومتطور بشكل مستمر وعليك التعلم بصورة مستمرة لتتمكن من الحفاظ على الصدارة ولا تتقادم معلومات. ستجد الكثير من مصادر التعلم المنوعة عبر الانترنت التي تساعدك على تعلم برمجة جافا بصورة ذاتية من دروس ومقالات لتعلم جافا ومقاطع فيديو وكتب ودورات تدريبية وغيرها، لكن من المهم أن تنظم وقتك في التعلم وتختار مصادر تعلم موثوقة تناسب أسلوبك في التعلم ولا تشتت نفسك بكثرة المصادر. كما يمكنك الاطلاع على دورس ومقالات لغة جافا التي تنشرها أكاديمية حسوب بصورة دورية، وإذا واجهت أي تساؤل حول لغة جافا يمكن طرحه في قسم أسئلة البرمجة في الأكاديمية أو في مجتمع حسوب IO ليجيبك عليك نخبة من المبرمجين والمطورين المحترفين. الخلاصة تعرفنا اليوم على لغة البرمجة جافا التي تعد واحدة من لغات البرمجة المشهورة ومتعددة الاستخدامات والتي تصلح لإنشاء مجموعة متنوعة من التطبيقات بدءًا من تطبيقات الهاتف الجوال والألعاب البسيطة وحتى البرامج المتطورة كبرامج المحاسبة وتطبيقات الذكاء الاصطناعي وتحليل البيانات الضخمة، ومهما كان التخصص أو المجال البرمجي الذي تهتم به فإن قرار تعلم الجافا سيكون ملائمًا للعمل بهذا التخصص. اقرأ أيضًا الدليل السريع للغة البرمجة Java تعرف على ماهية جافا Java مدخل إلى أساسيات البرمجة بلغة Java: ما هي البرمجة؟ كيفية كتابة برامج صحيحة باستخدام لغة جافا Kotlin هو جافا الجديد
    1 نقطة
  39. تعدّ أنظمة إدارة قواعد البيانات Relational database management system أو اختصارًا DMBS برامج حاسوبية تسمح للمستخدمين بالتفاعل مع قاعدة البيانات وتتيح لهم إمكانية التحكّم بالوصول إلى قاعدة البيانات وكتابة البيانات فيها وتنفيذ الاستعلامات Queries التي تستخلص البيانات أو تعدلها وإنجاز أي مهمّة أخرى ذات صلة بإدارة قواعد البيانات. وبالتالي كي تتمكن من إنجاز أي من هذه المهام، يجب أن تمتلك أنظمة DMBS نموذجًا أساسيًا يُعرّف كيفية تنظيم البيانات. وإحدى منهجيات تنظيم البيانات التي لاقت استخدامًا واسعًا في برمجيات قواعد البيانات منذ ابتكارها في أواخر ستينيات القرن الماضي هي النموذج العلاقيّ أو العلائقي Relational، لدرجة أنّه وحتى وقت كتابة هذا المقال فإنّ أربعة من بين أكثر خمسة أنظمة لإدارة قواعد البيانات شيوعًا هي من النمط العلاقيّ. يوضّح هذا المقال المفاهيمي النظري تاريخ النموذج العلاقيّ وكيفية تنظيم البيانات في قواعد البيانات العلاقيَّة وكيفية استخدامها في تطبيقاتنا المختلفة. تاريخ النموذج العلاقي قواعد البيانات عبارة عن مجموعات من المعلومات أو البيانات المُنظّمة منطقيًا. إذ تُعدّ أي مجموعة من البيانات كقاعدة بيانات، بغض النظر عن كيفية أو مكان تخزينها. فحتى درج الملفات المُتضمّنة لمعلومات الرواتب يُعدّ قاعدة بيانات، كذلك الأمر بالنسبة لأي مجموعة مُكدّسة من البيانات مثل نماذج المرضى في مستشفى، أو معلومات مجموعة من عملاء شركة موزعة عبر عدّة مواقع. فقبل أن تغدو عملية تخزين وإدارة البيانات باستخدام الحواسيب شائعة، كانت قواعد البيانات المادية كهذه في الأمثلة السابقة هي الوحيدة المتاحة للحكومات والمنظمات التجارية التي كانت بحاجة لتخزين المعلومات. وفي منتصف القرن العشرين تقريبًا، شهدت علوم الحاسوب تطورات كبيرة أفضت إلى ظهور أجهزة ذات قدرة معالجة أعلى وسعات تخزين محلية وخارجية أكبر. جعلت هذه التطورات علماء الحاسوب يُدركون القدرات الهائلة لهذه الأجهزة في تخزين وإدارة كميات أكبر من البيانات. ولكن لم تكن هناك حينها نظريات مُحدّدة حول كيفية تنظيم البيانات في الحواسيب بطرق منطقية ذات معنى فقد كان من السهل تخزين البيانات عشوائيًا على جهاز ما، لكن تصميم أنظمة قواعد البيانات سيتيح إمكانية إضافة واسترجاع وترتيب وإدارة هذه البيانات بطرق عملية وثابتة هو تحدٍ أكبر. فقد أسفرت الحاجة إلى وجود نظام منطقي لتخزين وتنظيم البيانات إلى ظهور العديد من الاقتراحات حول كيفية استخدام الحواسيب في إدارة البيانات. ولعلّ أحد النماذج الأولية لقواعد البيانات كان النموذج الهرمي، حيث تنظم البيانات وفق هذا النموذج ضمن هيكلية أو بنية شبيهة بالشجرة بأسلوب مماثل لأنظمة الملفات. ويوضّح المثال التالي الشكل الذي قد يبدو عليه جزء من مخطط قاعدة بيانات هرمية تستخدم لتصنيف الحيوانات: لقد طُبِّق النموذج الهرمي على نحوٍ واسع في أنظمة إدارة قواعد البيانات الأولية، لكنه أظهر بالمقابل بعض الصعوبات من حيث المرونة. ففي هذا النموذج يمكن للسجل الواحد امتلاك عدّة أبناء Children، لكن لا يمكنه أن يتبع سوى لأب Parent واحد ضمن الهيكلية الهرمية، الأمر الذي يجعل قواعد البيانات الهرمية قادرة على التعبير فقط عن علاقات من نوع "واحد-إلى-واحد (one-to-one)" و"واحد-إلى-عديد (one-to-many)" ولا يسمح بالتعبير عن العلاقات من نوع "عديد-إلى-عديد (many-to-many)"، وهذا القصور قد يفضي إلى حدوث مشاكل لدى التعامل مع نقاط بيانات تتبع لأكثر من أب. إلى أن ابتكر عالم الحاسوب إدجار فرانك كود Edgar F. Codd والذي كان يعمل في شركة IBM النموذج العلاقيّ لإدارة قواعد البيانات وذلك في أواخر ستينيات القرن الماضي. إذ سمح نموذج Codd العلاقيّ هذا بربط السجل الواحد بأكثر من جدول، ما سمح بإمكانية التعبير عن العلاقات من نوع "عديد-إلى-عديد" بين نقاط البيانات ممكنة، بالإضافة إلى إمكانية التعبير عن العلاقات من نوع "واحد-إلى-عديد". الأمر الذي أتاح المزيد من المرونة مقارنةً بالنماذج الموجودة حينها لتصميم هياكل قواعد البيانات وأثبت قدرة أنظمة إدارة قواعد البيانات العِلاقيَّة (RDBMSs) على تلبية مجموعة أوسع بكثير من احتياجات الأعمال. كما اقترح العالم كود Codd لغة لإدارة البيانات العلاقيَّة عُرِفت باسم ألفا (Alpha)، والتي أثّرت في تطوير لغات قواعد البيانات اللاحقة. فقد أنشأ اثنان من زملائه في IBM وهما دونالد تشامبرلين Donald Chamberlin وريمون بويس Raymond Boyce لغة مستوحاة من لغة ألفا، أطلقا عليها اسم SEQUEL اختصارًا لعبارة Structured English Query Language (لغة الاستعلام الهيكلية بالإنجليزية)، ولكن بسبب وجود علامة تجارية موجودة مسبقًا بنفس الاسم، اختصروا اسم لغتهم إلى SQL والتي يُشار إليها على نحوٍ أكثر رسمية باسم لغة الاستعلام الهيكلية Structured Query Language. كانت قواعد البيانات العلاقيَّة الأولية بطيئة للغاية وغير عملية بسبب قيود العتاد، واحتاجت بعض الوقت حتى تنتشر، ولكن ومع حلول منتصف الثمانينات، طُبّق نموذج Codd العِلاقيّ في العديد من المنتجات التجارية لإدارة قواعد البيانات، سواء من قبل شركة IBM أو منافسيها. إذ قام هؤلاء المُصنعّون أيضًا باتباع خطى IBM من خلال تطوير وتنفيذ لهجاتهم الخاصة من لغة SQL. وبحلول عام 1987، صادق كل من المعهد الوطني الأمريكي للمعايير American National Standards Institute والمنظمة الدولية للمعايير International Organization for Standardization على معايير لغة SQL ونشروها، ما جعل منها اللغة المعترف بها لإدارة أنظمة قواعد البيانات العلاقيَّة. ولعلّ انتشار استخدام النموذج العلاقيّ في مجموعة متنوعة من المجالات جعل منه النموذج المعياري لإدارة البيانات. وحتى مع ظهور العديد من قواعد البيانات غير العلاقية NoSQL في السنوات الأخيرة، تبقى قواعد البيانات العلاقية هي السائدة لتخزين وتنظيم البيانات. كيف تنظم قواعد البيانات العلاقية البيانات الآن وبعد حصولك على فهمٍ عام لتاريخ النموذج العلاقيّ، لنلقِ نظرة أعمق على كيفية تنظيم البيانات وفق هذا النموذج. لعلّ أهم عناصر النموذج العلاقيّ هي العلاقات Relations، والتي تُعرف لدى المستخدمين وفي أنظمة إدارة قواعد البيانات العِلاقيَّة المعاصرة بمسمى الجداول Tabels. فالعلاقة هي مجموعة من الصفوف أو السجلات في جدول، ويشترك كل صف بمجموعة من السمات أو الأعمدة (الحقول): العمود هو أصغر هيكل تنظيمي في قاعدة البيانات العلاقيَّة، وهو يُمثّل الخصائص المختلفة التي تُعرّف السجلات ضمن الجدول. ولذا، تُعرف هذه الخصائص رسميًا باسم السمات. يمكن فهم كل صف على أنّه نسخة فريدة تًمثّل نوع ما من الأشخاص أو الكائنات أو الأحداث أو الروابط المحفوظة في الجدول. وقد تُمثّل هذه النسخ موظفي شركة أو مبيعات شركة تجارية عبر الإنترنت أو نتائج اختبارات مخبرية. على سبيل المثال، في جدول يحتوي على سجلات المدرسين في مدرسة ما، قد تتضمن الصفوف سمات مثل: الاسم name والمقررات الدراسية subjects وتاريخ بدء العمل start_date، وما إلى ذلك. ولدى إنشاء الأعمدة، يتعيّن عليك تحديد نمط البيانات الخاص بكل عمود، وهو ما يُحدّد القيم التي يمكن استقبالها فيه. وعادةً ما تُقدّم أنظمة إدارة قواعد البيانات العِلاقيَّة أنماطًا فريدة خاصة بها من البيانات والتي قد لا تكون متوافقة مباشرةً مع مثيلاتها في الأنظمة الأخرى. ومن أنماط البيانات شائعة الاستخدام كل من التواريخ، والسلاسل النصية، والأعداد الصحيحة، والقيم المنطقية. يتضمّن كل جدول في النموذج العِلاقيّ عمودًا واحدًا على الأقل يُستخدم لتمييز كل سجل على نحوٍ فريد، ويُعرف باسم المفتاح الأساسي Primary Key. وهو عمود مهم جدًا، إذ لا يحتاج المستخدمون لمعرفة مكان تخزين بياناتهم فيزيائيًا داخل الجهاز. وبدلاً من ذلك، يتولى نظام إدارة قواعد البيانات متابعة وتعقّب كل سجل واسترجاعه حسب الطلب. وبالتالي، لا يوجد ترتيب منطقي مُحدّد للسجلات، ويتمتّع المستخدمون بالحرية في استرجاع بياناتهم بالترتيب الذي يرغبون به أو باستخدام عوامل التصفية التي يختارونها. فبفرض كان لديك جدولين وتود ربطهما ببعضهما البعض، فإحدى الطرق لإنجاز ذلك هي باستخدام المفتاح الخارجي Foreign key، وهو نسخة من المفتاح الأساسي لجدول (يُعرف بالجدول "الأب") تُدرج في عمود داخل جدول آخر (يُعرف بالجدول "الابن"). يُظهر المثال التالي العلاقة بين جدولين، الأول يُستخدم لتسجيل المعلومات حول الموظفين في شركة، والثاني لتتبع مبيعات الشركة. وفي هذا المثال، يُستخدم المفتاح الأساسي لجدول الموظفين EMPLOYEES كمفتاح أجنبي لجدول المبيعات SALES: فإذا حاولت إضافة سجل إلى الجدول الابن وكانت القيمة المُدخلة في عمود المفتاح الأجنبي غير موجودة في المفتاح الأساسي للجدول الأب، فإن تعليمة الإدراج ستكون غير صالحة، وهذا يساعد في الحفاظ على صحّة مستوى العلاقة بين الجدولين (أو نزاهة العلاقة إن صح التعبير)، وبهذا ستكون السجلات في الجدولين مرتبطة على النحو الصحيح دائمًا. لقد ساعدت عناصر النموذج العلاقيّ الهيكلية في الحفاظ على تنظيم البيانات أثناء تخزينها، ولكن تخزين البيانات لن يكون مفيدًا إلا إذا كان من الممكن استرجاعها. ولاسترجاع البيانات من RDBMS، يُمكنك إنشاء ما يُسمّى بالاستعلام query وهو عبارة عن طلب منظّم لمجموعة من المعلومات. وتستخدم معظم قواعد البيانات العِلاقيَّة لغة SQL لإدارة البيانات والاستعلام عنها كما أشرنا سابقًا. إذ تتيح لغة SQL إمكانية تصفية نتائج الاستعلام ومعالجتها باستخدام مجموعة من البنى clauses، والجمل الشرطية predicates التي تقيم كصحيح TRUE أو خاطئ FALSE أو غير معروف، والتعبيرات expressions، ما يمنحك التحكم الدقيق في البيانات التي ستظهر ضمن نتائج الاستعلام. مزايا وقيود قواعد البيانات العلاقية لنفكّر في بعض مزايا وعيوب قواعد البيانات العلاقيَّة بأخذ هيكلها التنظيمي الأساسي في الحسبان. إنّ لغة SQL وقواعد البيانات التي تستخدمها في أيامنا هذه تختلف عما قدمه العالم كود Codd في نموذجه العلاقيّ الأول في عدة نواحٍ. فعلى سبيل المثال، يملي نموذج كود Codd بأنّ كل سجل في الجدول يجب أن يكون فريدًا. في حين تسمح العديد من قواعد البيانات العلاقيَّة المعاصرة بوجود سجلات مكررة. وهناك بالمقابل من يرى أن قواعد البيانات التي تستخدم لغة SQL ولا تتبع جميع مواصفات نموذج Codd لا يمكن عدها قواعد بيانات علاقيَّة حقيقية. ولكن وفي الواقع، أي نظام يستخدم SQL ويتبع نموذج Codd إلى حد معين يعدّ عادةً نظامًا لإدارة قواعد بيانات علاقيَّة. ورغم شهرة قواعد البيانات العِلاقيَّة التي ازدادت بسرعة، إلا أنّ بعض أوجه القصور المتعلقة في النموذج العِلاقيّ بدأت بالظهور مع تزايد قيمة البيانات وتوجه الشركات لتخزين كميات أكبر منها. ومن هذه التحديات والمعوقات، صعوبة توسيع قاعدة البيانات العلاقيَّة أفقيًا. والمقصود بالتوسع الأفقي أو الخارجي عملية إضافة المزيد من الأجهزة إلى نظام حالي لتوزيع الحمولة واستيعاب حركة مرور أكبر وتحقيق معالجة أسرع. وغالبًا ما تُقارن هذه العملية بالتوسع العمودي، الذي يتضمن تحسين مواصفات الخادم الحالي من خلال توسيع ذاكرة الوصول العشوائي RAM أو وحدة المعالجة المركزية CPU. والسبب وراء صعوبة توسيع قاعدة البيانات العلاقيَّة أفقيًا يعود إلى أنّ النموذج العلاقيّ مصمم لضمان الاتساق أو انسجام البيانات consistency، ما يعني أنّه عند استعلام العملاء ضمن قاعدة البيانات نفسها سيحصلون دائمًا على البيانات نفسها. فإذا قمت بتوسيع قاعدة البيانات العلاقيَّة أفقيًا عبر عدة أجهزة، سيصبح من الصعب ضمان هذا الاتساق، إذ قد يقوم العملاء بكتابة البيانات على عقدة معينة أو (جهاز) دون الباقي، وقد يكون هناك تأخير بين لحظة الكتابة الأولية والوقت الذي تُحدّث فيه العقد الأخرى لتعكس هذه التغييرات، ما يؤدي إلى عدم اتساق بينها. لقد واجهت أنظمة إدارة قواعد البيانات العلاقيَّة بعض التحديات، من بينها أن النموذج العلاقيّ قد صُمّم خصيصًا للتعامل مع البيانات المهيكلة structured data، أي البيانات التي تتوافق مع نمط بيانات مُحدد مسبقًا أو على الأقل تلك المُنظمّة على نحوٍ مُحدد. لكن مع انتشار الحواسيب الشخصية وظهور الإنترنت في أوائل التسعينات، أصبحت البيانات غير المهيكلة unstructured data، كالرسائل الإلكترونية والصور والفيديوهات أكثر شيوعًا. لا يعني كل ذلك أن قواعد البيانات العلاقيَّة باتت غير مفيدة. بل على العكس تمامًا، فالنموذج العلاقيّ ما زال هو الإطار السائد لإدارة البيانات منذ أكثر من 40 عامًا. وتدلّ شهرتها واستمراريتها على أنّ قواعد البيانات العلاقيَّة تقنية ناضجة، وهذا بحد ذاته من أبرز مزاياها. هناك العديد من التطبيقات التي صُممت للعمل مع النموذج العِلاقيّ، بالإضافة إلى وجود العديد من مدراء قواعد البيانات المحترفين الخبراء في مجال قواعد البيانات العلاقيَّة. كما تتوفر مجموعة واسعة من الموارد المطبوعة والإلكترونية متاحة لكل من يرغب في بدء التعامل مع قواعد البيانات العِلاقيَّة. ومن مميزات قواعد البيانات العلاقيَّة دعم معظمها لمجموعة من التعاملات transactions التي تضمن سلامة البيانات وتكاملها. والمعاملة transaction هي مجموعة من أوامر SQL التي تُنفذ وفق تسلسل معيّن كوحدة عمل مُنفصلة. إذ تعتمد المعاملات على مبدأ الكل أو لا شيء، بمعنى أنّ كل أمر في المعاملة يجب أن يكون صحيحًا، وإلا ستُلغى المعاملة بالكامل وبهذا نضمن صحّة البيانات ودقتها (نزاهة البيانات) عند التعديل على عدة سجلات أو جداول في الوقت نفسه. وأخيرًا، تعدّ قواعد البيانات العلاقيَّة مرنة للغاية. فقد استُخدمت في تطوير مجموعة واسعة من التطبيقات المختلفة، وتستمر في العمل بكفاءة حتى مع كميات ضخمة من البيانات. كما تعدّ لغة SQL قوية جدًا، إذ تتيح لك إمكانية إضافة وتعديل البيانات على نحوٍ فوري، بالإضافة إلى تغيير هيكلية تخطيط قواعد البيانات والجداول دون التأثير على البيانات الموجودة. الخلاصة تعرفنا في مقال اليوم على قواعد البيانات العلاقيَّة التي لا تزال وسيلة أساسية لإدارة وتخزين البيانات بعد أكثر من خمسين عامًا على وضع التصور الأولي لها، وذلك بفضل مرونتها وتصميمها الذي يضمن صحة البيانات ودقتها. وحتى مع ظهور قواعد البيانات غير العِلاقيَّة NoSQL في السنوات الأخيرة، لا زال فهم النموذج العلاقيّ ومعرفة كيفية التعامل مع أنظمة إدارة قواعد البيانات العلاقيَّة أمر أساسي لأي شخص يرغب في بناء التطبيقات المُعتمدة على قوة البيانات. وللتعرّف على المزيد حول بعض من أنظمة إدارة قواعد البيانات العِلاقيَّة الأشهر، وقواعد البيانات عمومًا، ننصحكم بالرجوع إلى قسم قواعد البيانات من أكاديمية حسوب. ترجمة -وبتصرف- للمقال Understanding Relational Databases لصاحبه Mark Drake. اقرأ أيضًا مدخل إلى تصميم قواعد البيانات تعرف على مكونات قاعدة البيانات نموذج الكيان والعلاقة ER لتمثيل البيانات وتخزينها في قاعدة البيانات ما هي محركات قواعد البيانات؟ أنواع قواعد البيانات وأهم مميزاتها واستخداماتها
    1 نقطة
  40. يبدو نوع البيانات tuple في بايثون كما يلي: coral = ('blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral') tuple (صف وتُجمَع إلى صفوف) هي بنية بيانات تُمثِّل سلسلة مرتبة من العناصر غير القابلة للتبديل، وبالتالي لا يمكن تعديل القيم الموجودة فيها. يستعمل نوع البيانات tuple لتجميع البيانات، فكل عنصر أو قيمة داخل tuple تُشكِّل جزءًا منه. توضع القيم داخل نوع البيانات tuple بين قوسين ( ) ويُفصَل بينها بفاصلة ,، وتبدو القيم الفارغة كما يلي coral = ()‎، لكن إذا احتوى نوع البيانات tuple على قيم –حتى لو كانت قيمةً واحدةً فقط– فيجب وضع فاصلة فيه مثل coral = ('blue coral',). إذا استخدمنا الدالة print()‎ على tuple، فسنحصل على الناتج الآتي الذي يُبيّن أنَّ القيمة الناتجة ستوضع بين قوسين: print(coral) ('blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral') عند التفكير بنوع tuple وغيره من بنى البيانات التي تُعبَر من أنوع «المجموعات» (collections)، فمن المفيد أن تضع ببالك مختلف المجموعات الموجودة في حاسوبك: تشكيلة الملفات الموجودة عندك، وقوائم التشغيل للموسيقى، والمفضلة الموجودة في متصفحك، ورسائل بريدك الإلكتروني، ومجموعة مقاطع الفيديو التي تستطيع الوصول إليها من التلفاز، والكثير. نوع tuple شبيه بالقوائم (lists)، لكن القيم الموجودة فيه لا يمكن تعديلها، وبسبب ذلك، فأنت تخبر الآخرين أنَّك لا تريد إجراء أيّة تعديلات على هذه السلسلة من القيم عندما تستعمل tuple في شيفرتك. إضافةً إلى ما سبق، ولعدم القدرة على تعديل القيم، فسيكون أداء برنامجك أفضل، حيث ستُنفَّذ الشيفرة بشكل أسرع إذا استعملتَ tuple بدلًا من القوائم (lists). فهرسة نوع البيانات tuple يمكن الوصول إلى كل عنصر من عناصر tuple بمفرده لأنَّه سلسلة مرتبة من العناصر، وذلك عبر الفهرسة. وكل عنصر يرتبط برقم فهرس، الذي هو عدد صحيح يبدأ من الفهرس 0. لمثال coral السابق، ستبدو الفهارس والقيم المرتبطة بها كالآتي: ‘blue coral’ ‘staghorn coral’ ‘pillar coral’ ‘elkhorn coral’ 0 1 2 3 العنصر الأول الذي يُمثِّل السلسلة النصية 'blue coral' تبدأ بالفهرس 0، وتنتهي القائمة بالفهرس رقم 3 المرتبط بالقيمة 'elkhorn coral'. ولأن كل عنصر من عناصر tuple له رقم فهرس مرتبط به، فسنتمكن من الوصول إلى عناصره فرادى. يمكننا الآن الوصول إلى عنصر معيّن في tuple عبر استخدام رقم الفهرس المرتبط به. print(coral[2]) pillar coral تتراوح قيم الفهارس في المتغير coral من 0 إلى 3 كما هو ظاهر في الجدول السابق، لذا يمكننا استدعاء العناصر الموجودة فيه فرادى كما يلي: coral[0] coral[1] coral[2] coral[3] إذا حاولنا استدعاء المتغير coral مع رقم فهرس أكبر من 3، فستظهر رسالة خطأ تشير إلى أنَّ الفهرس خارج المجال: print(coral[22]) IndexError: tuple index out of range إضافةً إلى أرقام الفهارس الموجبة، يمكننا أيضًا الوصول إلى الفهارس باستخدام رقم فهرس سالب، وذلك بالعد بدءًا من نهاية قائمة العناصر وسيرتبط آخر عنصر بالفهرس ‎-1، وهذا مفيدٌ جدًا إذا كان لديك متغير من النوع tuple وكان يحتوي عناصر كثيرة وأردتَ الوصول إلى أحد عناصره انطلاقًا من النهاية. ففي مثالنا السابق عن coral، إذا أردنا استخدام الفهارس السالبة فالناتج كالآتي: ‘elkhorn coral’ ‘pillar coral’ ‘staghorn coral’ ‘blue coral’ -1 -2 -3 -4 إذا أردنا طباعة العنصر 'blue coral' باستخدام الفهارس السالبة، فستبدو التعليمة كما يلي: print(coral[-4]) blue coral يمكننا إضافة العناصر النصية الموجودة في tuple إلى السلاسل النصية الأخرى باستخدام المعامل +: print('This reef is made up of ' + coral[1]) This reef is made up of staghorn coral استطعنا في المثال السابق إضافة عنصر موجود في الفهرس 1 مع السلسلة النصية 'This reef is made up of '، ويمكننا أيضًا استخدام المعامل + لإضافة بنيتَي tuple معًا. الخلاصة: يمكننا الوصول إلى كل عنصر من عناصر tuple على حدة باستخدام أرقام الفهارس (الموجبة أو السالبة) المرتبطة بها. تقطيع قيم tuple يمكننا استخدام الفهارس للوصول إلى عدِّة عناصر من tuple، أما التقطيع فيسمح لنا بالوصول إلى عدِّة قيم عبر إنشاء مجال من أرقام الفهارس المفصولة بنقطتين رأسيتين [x:y]. لنقل أننا نريد عرض العناصر الموجودة في وسط المتغير coral، يمكننا فعل ذلك بإنشاء قطعة جديدة: print(coral[1:3]) ('staghorn coral', 'pillar coral') عند إنشاء قطعة جديدة –كما في المثال السابق– فيمثِّل أوّل رقم مكان بدأ القطعة (متضمنةً هذا الفهرس)، ورقم الفهرس الثاني هو مكان نهاية القطعة (دون تضمين هذا الفهرس بالقطعة)، وهذا هو السبب وراء عرض المثال السابق للقيم المرتبطة بالعناصر الموجودة في الفهرسين 1 و 2. إذا أردتَ تضمين إحدى نهايتَي القائمة، فيمكنك حذف أحد الأرقام في التعبير tuple[x:y]، فمثلًا، لنقل أننا نريد عرض أوّل ثلاثة عناصر من coral، والتي هي 'blue coral' و 'staghorn coral' و 'pillar coral'، فيمكننا فعل ذلك كالآتي: print(coral[:3]) ('blue coral', 'staghorn coral', 'pillar coral') المثال السابق عرض العناصر من بداية القائمة وتوقف قبل العنصر ذي الفهرس 3. لتضمين كل العناصر الموجودة في نهاية tuple، فيمكننا عكس التعبير السابق: print(coral[1:]) ('staghorn coral', 'pillar coral', 'elkhorn coral') يمكننا استخدام الفهارس السالبة أيضًا عند التقطيع، كما فعلنا مع أرقام الفهارس الموجبة: print(coral[-3:-1]) print(coral[-2:]) ('staghorn coral', 'pillar coral') ('pillar coral', 'elkhorn coral') هنالك معاملٌ إضافيٌ يمكننا استعماله ويسمى «الخطوة»، ويُشير إلى عدد العناصر التي يجب تجاوزها بعد الحصول على أوّل عنصر من القائمة. حذفنا في جميع أمثلتنا السابقة معامل الخطوة، حيث القيمة الافتراضية له في بايثون هي 1، لذا سنحصل على جميع العناصر الموجودة بين الفهرسَين المذكورين. شكل هذا التعبير العام هو tuple[x:y:z]، إذ يُشير المعامل z إلى الخطوة. لنُنشِئ قائمةً أكبر، ثم نقسِّمها، ونعطيها القيمة 2 كخطوة: numbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) print(numbers[1:11:2]) (1, 3, 5, 7, 9) التعبير numbers[1:11:2] سيطبع القيم الموجودة بين رقمين الفهرسين 1 (بما في ذلك العنصر المرتبط بالفهرس 1) و 11 (دون تضمين ذلك العنصر)، ومن ثم ستخبر قيمةُ الخطوة 2 البرنامجَ أنَّ يتخطى عنصرًا بين كل عنصرين. يمكننا حذف أوّل معاملين واستخدام معامل الخطوة بمفرده بتعبيرٍ برمجيٍ من الشكل tuple[::z]: print(numbers[::3]) (0, 3, 6, 9, 12) طبعنا في المثال السابق عناصر numbers بعد ضبط قيمة الخطوة إلى 3، وبالتالي سيتم تخطي عنصرين. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 الخلاصة: تقطيع tuples باستخدام أرقام الفهارس الموجبة والسالبة واستعمال معامل الخطوة يسمح لنا بالتحكم بالناتج الذي نريد عرضه. إضافة بنى tuple إلى بعضها يمكن أن نُضيف بنى tuple إلى بعضها أو أن «نضربها» (multiply)، تتم عملية الإضافة باستخدام المعامل +، أما عملية الضرب فباستخدام المعامل *. يمكن أن يُستخدَم المعامل + لإضافة بنيتَي tuple أو أكثر إلى بعضها بعضًا. يمكننا إسناد القيم الموجودة في بنيتَي tuple إلى بنية جديدة: coral = ('blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral') kelp = ('wakame', 'alaria', 'deep-sea tangle', 'macrocystis') coral_kelp = (coral + kelp) print(coral_kelp) الناتج: ('blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral', 'wakame', 'alaria', 'deep-sea tangle', 'macrocystis') وصحيحٌ أنَّ المعامل + يمكنه إضافة بنى tuple إلى بعضها، لكن يمكن أن يستعمل لإنشاء بنية tuple جديدة ناتجة عن جمع بنى أخرى، لكن لا يمكنه تعديل بنية tuple موجودة مسبقًا. أما المعامل * فيمكن استخدامه لضرب بنى tuple، فربما تريد إنشاء نسخ من الملفات الموجودة في أحد المجلدات إلى الخادوم أو مشاركة قائمة بالمقطوعات الموسيقية التي تحبها مع أصدقائك، ففي هذه الحالات سترغب بمضاعفة مجموعات من البيانات (أو «ضربها»). لنضرب البنية coral بالرقم 2 والبنية kelp بالرقم 3، ثم نسندها إلى بنى tuple جديدة: multiplied_coral = coral * 2 multiplied_kelp = kelp * 3 print(multiplied_coral) print(multiplied_kelp) الناتج: ('blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral', 'blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral') ('wakame', 'alaria', 'deep-sea tangle', 'macrocystis', 'wakame', 'alaria', 'deep-sea tangle', 'macrocystis', 'wakame', 'alaria', 'deep-sea tangle', 'macrocystis') يمكننا باستخدام المعامل * أن نُكرِّر (أو نُضاعِف) بنى tuple بأي عدد من المرات نشاء، مما سينُشِئ بنى tuple جديدة اعتمادًا على محتوى البنى الأصلية. الخلاصة هي أنَّ بنى tuple يمكن إضافتها إلى بعضها أو ضربها لتشكيل بنى tuple جديدة عبر استخدام المعاملَين + و *. دوال التعامل مع tuple هنالك دوال مُضمَّنة في لغة بايثون للتعامل مع بنى tuple، لننظر إلى بعضها. len()‎ وكما في السلاسل النصية والقوائم، يمكننا حساب طول (أو عدد عناصر) بنية tuple باستخدام الدالة len()‎ حيث نُمرِّر إليها بنية tuple كمعامل (parameter)، كما يلي: len(coral) هذه الدالة مفيدة إذا أردنا أن نَضمَن أنَّ لبنية tuple عدد عناصر معيّن، فمثلًا يمكننا الاستفادة من ذلك بمقارنة بنيتين مع بعضهما. إذا أردنا طباعة عدد عناصر kelp و numbers، فسيظهر الناتج الآتي: print(len(kelp)) print(len(numbers)) الناتج: 4 13 الناتج أعلاه يشير إلى أنَّ للبنية kelp أربعة عناصر: kelp = ('wakame', 'alaria', 'deep-sea tangle', 'macrocystis') أما البنية numbers فتملك ثلاثة عشر عنصرًا: numbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) وصحيحٌ أنَّ هذه الأمثلة عناصرها قليلة نسبيًا، إلا أنَّ الدالة len()‎ تستطيع أن تخبرنا بعدد عناصر بنى tuple الكبيرة. الدالتان max()‎ و min()‎ عندما نتعامل مع بنى tuple مكوَّنة من عناصر رقمية (بما فيها الأعداد الصحيحة والأرقام ذات الفاصلة العشرية)، فيمكننا استخدام الدالتين max()‎ و min()‎ للعثور على أكبر وأصغر قيمة موجودة في بنية tuple معيّنة. تسمح لنا هاتان الدالتان باستخراج معلومات تخص البيانات القابلة للإحصاء، مثل نتائج الامتحانات أو درجات الحرارة أو أسعار المنتجات …إلخ. لننظر إلى بنية tuple مكونة من أعداد عشرية: more_numbers = (11.13, 34.87, 95.59, 82.49, 42.73, 11.12, 95.57) للحصول على القيمة العظمى من بين القيم الآتية فعلينا تمرير بنية tuple إلى الدالة max()‎ كما في max(more_numbers)، وسنستخدم الدالة print()‎ لعرض الناتج: print(max(more_numbers)) 95.59 أعادت الدالة max()‎ أعلى قيمة في بنية more_numbers. وبشكلٍ شبيهٍ بما سبق نستخدم الدالة min()‎: print(min(more_numbers)) 11.12 أُعيدَ هنا أصغر رقم عشري موجودة في البنية. يمكن الاستفادة من الدالتين max()‎ و min()‎ كثيرًا للتعامل مع بنى tuple التي تحتوي الكثير من القيم. كيف تختلف بنى tuple عن القوائم (list) الفرق الرئيسي بين tuple و list هو عدم القدرة على تعديلها، وهذا يعني أنَّنا لا نستطيع إضافة أو حذف أو استبدال العناصر داخل بنية tuple. لكن يمكننا إضافة بنيتَي tuple أو أكثر إلى بعضها بعضًا لتشكيل بنية جديدة كما رأينا في أحد الأقسام السابقة. لتكن لدينا البنية coral الآتية: coral = ('blue coral', 'staghorn coral', 'pillar coral', 'elkhorn coral') لنقل أننا نريد استبدال العنصر 'blue coral' ووضع العنصر 'black coral' بدلًا منه. فلو حاولنا تغيير بنية tuple بنفس الطريقة التي نُعدِّل فيها القوائم بكتابة: coral[0] = 'black coral' فستظهر رسالة خطأ كالآتية: TypeError: 'tuple' object does not support item assignment وذلك بسبب عدم إمكانية تعديل بنى tuple. إذا أنشأنا بنية tuple ثم قررنا أنَّ ما نحتاج له هو بنية list، فيمكننا تحويلها إلى قائمة list، وذلك بالدالة list()‎: list(coral) أصبحت بنية coral قائمةً الآن: coral = ['blue coral', 'staghorn coral', 'pillar coral'] يمكننا أن نلاحظ أنَّ بنية tuple تحوَّلتَ إلى قائمة list لأنَّ الأقواس المحيطة بالقيم أصبح مربعة الشكل. وبشكلٍ شبيهٍ بما سبق، نستطيع تحويل القوائم من النوع list إلى tuple باستخدام الدالة tuple()‎. الخلاصة نوع البيانات tuple هو مجموعةٌ من البيانات المتسلسلة التي لا يمكن تعديلها، ويوفِّر تحسينًا في أداء برامجك لأنه أسرع معالجةً من القوائم في بايثون. وعندما يراجع الآخرون شيفرتك فسيعلمون من استخدامك لبنى tuple أنك لا تريد تعديل هذه القيم. شرحنا في هذا الدرس الميزات الأساسية لبنى tuple بما في ذلك الفهارس وتقطيعها وتجميعها، وعرضنا بعض الدوال المُضمَّنة المتوافرة لهذا النوع من البيانات. هذه المقالة جزء من سلسة مقالات حول تعلم البرمجة في بايثون 3. ترجمة –وبتصرّف– للمقال Understanding Tuples in Python 3 لصاحبته Lisa Tagliaferri اقرأ أيضًا المقالة التالية: فهم القواميس في بايثون 3 المقالة السابقة: فهم كيفية استعمال List Comprehensions في بايثون 3 المرجع الشامل إلى تعلم لغة بايثون كتاب البرمجة بلغة بايثون دليلك الشامل إلى أنواع البيانات
    1 نقطة
  41. الصفوف Tuple الصّفوف نوع من البيانات التسلسليّة تماما مثل القوائم، لكنّ الصفوف غير قابلة للتغيير، يتألّف صفّ من مجموعة من القيّم نفصل بينها بفاصلة "," ولإنشاء صفّ نقوم بإسناد مجموعة من القيّم إلى متغيّر حيث نفصل بين القيم بفاصلة كما في المثال التّالي: >>> a = (1, 2, 3) >>> a[0] 1 ويُمكن أيضاً إنشاء صفّ بدون أقواس: >>> a = 1, 2, 3 >>> a[0] 1 خاصيّة قياس عدد العناصر len وتشريح الصّف ممكن أيضا، وتُطبّق هذه الخاصيّات كما فعلنا مع القوائم في الدّرس السّابق. >>> len(a) 3 >>> a[1:] 2, 3 وبما أن الأقواس تُستعمل للجمع كذلك، فيجب أن تنشئ صفّا من قيمة واحدة مع فاصلة زائدة. >>> a = (1) >> a 1 >>> b = (1,) >>> b (1,) >>> b[0] 1 ويُمكن جمع صفّين في صفّ واحد بحيث يحتوي الصّفّ الجديد على كلّ من عناصر الصفّ الأول والثّاني، فمثلا في البرنامج التّالي قُمنا بالجمع بين الصّف a و الصف b وأسندنا قيمهما إلى الصف c: >>> a = (1,2,3) >>> a (1,2,3) >>> b = ('Hsoub Academy', 'Abdelhadi') >>> b ('Hsoub Academy', 'Abdelhadi') >>> c = a+b >>> c (1, 2, 3, 'Hsoub Academy', 'Abdelhadi') يُمكن أن تحتوي الصفوف على مُختلف أنواع البيانات كذلك (الأرقام، السّلاسل النّصيّة، القيم المنطقيّة…)، ويُمكن -كما الحال مع القوائم- للعناصر النّصيّة أن تكون بين علامتي تنصيص مزدوجتين. انظر المثال: # هذا مثال على إمكانية إسناد قيم من أنواع مختلفة >>> a = ('Hsoub Academy', 'Python', 3, 10, True) >>> a ('Hsoub Academy', 'Python', 3, 10, True) # يمكنك كذلك إنشاء قائمة تحتوي على سلاسل نصيّة بين علامتي تنصيص مُزدوجتين >>> a = ("Hsoub Academy", "Python", 3, 10, True) >>> a ('Hsoub Academy', 'Python', 3, 10, True) إذا أردت إنشاء صفّ يحتوي على قيمة مُكرّرة عدّة مرّات فيُمكنك إنشاء صف من عنصر واحد ثمّ إجراء عمليّة ضرب بعدد المرّات الذي تريده: >>> ('Academy',) * 5 ('Academy', 'Academy', 'Academy', 'Academy', 'Academy') عند كتابة عدّة قيم والفصل بينها بفاصلة دون إحاطة العناصر بأي علامات تجميع كالأقواس وعلامتي []، فإنّها تكون صفوفا بشكل افتراضي، انظر المثال: >>> print 'Hsoub academy', 5, False, 'Abdelhadi' Hsoub academy 5 False Abdelhadi >>> a, b = 1, 2; >>> print "Value of a and b : ", a,b Value of a and b : 1 2 العمليات على الصفوف تُوفّر لنا بايثون عدّة دوال للتّعامل مع الصّفوف وقد ذكرنا الدّالة len وكيفية استخدامها أعلاه. وقد حان الوقت للحديث عن بعض الدوال الأخرى المُساعدة في التّعامل مع الصّفوف: دالة cmp للمُقارنة بين صفين، إذا كان الصّفان مُتساويان فالنّتيجة تكون 0 أمّا إذا كانا مُختلفين فالنّتيجة تطبع القيمة 1 أو القيمة -1 حسب الاختلاف: >>> a = (1, 2, 3) >>> b = (1, 2, 3) >>> cmp(a, b) 0 >>> a = (1, 2, 3) >>> b = (1, 2) >>> cmp(a, b) 1 >>> a = (1, 2, 3) >>> b = (1, 2) >>> cmp(b, a) -1 دالة max لإرجاع أكبر قيمة في صفّ: >>> a = ('Hsoub Academy', 'Abdelhadi') >>> max(a) 'Hsoub Academy' >>> b = (1, 2, 3) >>> max(b) 3 دالة min لإرجاع أصغر قيمة في صفّ: >>> a = ('Hsoub Academy', 'Abdelhadi') >>> min(a) 'Abdelhadi' >>> b = (1,2, 3) >>> min(b) 1 المجموعات Sets المجموعات عبارة عن جمع غير منظّم لقيّم فريدة، بحيث لا تُكرّر قيمة أكثر من مرّة. يُمكن إنشاء مجموعة فارغة وإضافة العناصر لها بالتّابع add، مع مُلاحظة أنّ التّابع add لا يقبل سوى عنصر واحد في كلّ مرة: >>> x = set() >>> x.add(1) >>> x set([1]) >>> x.add(2) >>> x set([1, 2]) >>> x.add("Hsoub Academy") >>> x set(['Hsoub Academy', 1, 2]) ولإضافة عدّة عناصر مرّة واحدة فعليك الاعتماد على التّابع update مع ملاحظة أنّ العناصر المُضافة يجب أن تكون داخل علامتي []: >>> x = set() >>> x.update([1, 3, 5, "Hsoub Academy"]) >>> x set(['Hsoub Academy', 1, 3, 5]) ولحذف عنصر من مجموعة ما، فيُمكنك الاستعانة بالتّابع remove بحيث تُمرّر العنصر الذي ترغب بحذفه: >>> x = set(['Hsoub Academy', 1, 3, 5]) >>> x.remove("Hsoub Academy") >>> x set([1, 3, 5]) أمّا إذا كنت ترغب بحذف جميع عناصر مجموعة ما، فالتّابع clear سيتكفّل بالأمر: >>> x = set(['Hsoub Academy', 1, 3, 5]) >>> x set(['Hsoub Academy', 1, 3, 5]) >>> x.clear() >>> x set([]) ويُمكنك نسخ مجموعة وإسناد المنسوخ إلى مجموعة أخرى بالتّابع copy، في المثال التّالي قمنا بنسخ المجموعة x وأسندنا المنسوخ إلى المجموعة y : >>> x = set(['Hsoub Academy', 1, 3, 5]) >>> x set(['Hsoub Academy', 1, 3, 5]) >>> y = x.copy() >>> y set(['Hsoub Academy', 1, 3, 5]) ويُمكن إنشاء مجموعة بقيّم مُتعدّدة، لاحظ في المثال التّالي أنّ النّاتج مجموعة تحتوي على عناصر فريدة (حُذِف العنصر 1 لأنّه مُكرّر): >>> x = set([3, 1, 2, 1]) set([1, 2, 3]) وهناك طريقة جديدة لإنشاء المجموعات في بايثون 2.7: >>> x = {3, 1, 2, 1} set([1, 2, 3]) ويُمكن أن تُضيف قيمة إلى مجموعة، وذلك بالدّالة add. >>> x = set([1, 2, 3]) >>> x.add(4) >>> x set([1, 2, 3, 4]) يُمكن الجمع بين مجموعتين بالمُعامل | بحيث تكون المجموعة الجديدة مُحتويّة على كلّ من عناصر المجموعتين، في المثال التّالي ننشئ أولا المجموعة x ثمّ ننشئ المجموعة y وبعد ذلك نقوم بتوحيد المجموعتين ونُسند النّتيجة إلى المجموعة x_y : >>> x = set(['Hsoub Academy', 1, 3, 5]) >>> x set(['Hsoub Academy', 1, 3, 5]) >>> y = set(["Dyouri", "Abdelhadi"]) >>> y set(['Dyouri', 'Abdelhadi']) >>> x_y = x | y >>> x_y set([1, 3, 5, 'Abdelhadi', 'Hsoub Academy', 'Dyouri']) وكما في القوائم، يُمكنك أن تتحقّق من وجود قيمة من عدمه بالعامل in، وهذه العمليّة تكون أسرع في المجموعات من القوائم ولكنك لن تستطيع أن ترى فرقا كبيرا إلّا إذا كان عدد العناصر كبيرًا. >>> x = set([1, 2, 3]) >>> 1 in x True >>> 5 in x False القواميس القواميس تُشبه القوائم، الفرق أنّك تستطيع فهرسة العناصر داخل القواميس بأي نوع من القيم، ففي القوائم يُمكنك الوصول إلى القيم فقط عبر الأعداد الصّحيحة مثل []x أما في القواميس فتستطيع الوصول إلى قيّم عبر المفاتيح كالتّالي: أولا ننشئ قاموسا، بحيث تملك كلّ قيمة مفتاحا معيّنا، كمثال المفتاح x يحمل القيمة 1: >>> a = {'x': 1, 'y': 2, 'z': 3} ويُمكنك الوصول إلى القيّم عبر المفاتيح (عوضا عن الأرقام في كما في القوائم): >>> a['x'] 1 >>> a['z'] 3 يُمكنك كذلك إنشاء قاموس فارغ وإسناد المفاتيح والقيّم بعد ذلك: >>> b = {} >>> b['x'] = 2 >>> b[2] = 'foo' >>> b[(1, 2)] = 3 >>> b {(1, 2): 3, 'x': 2, 2: 'foo'} يُمكن تعديل قيمة مفتاح بالطّريقة التّالية: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> a {'y': 2, 'x': 1, 'z': 3} >>> a['y'] = 'Hsoub Academy' >>> a {'y': 'Hsoub Academy', 'x': 1, 'z': 3} في المثال أعلاه غيّرنا قيمة المفتاح y من القيمة 2 إلى القيمة Hsoub Academy. ويُمكن إضافة مفاتيح وقيم جديدة كذلك: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> a {'y': 2, 'x': 1, 'z': 3} >>> a['w'] = 'Hsoub Academy' >>> a {'y': 2, 'x': 1, 'z': 3, 'w': 'Hsoub Academy'} يُمكنك حذف العناصر باستخدام del كالتّالي: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> del a['x'] >>> a {'y': 2, 'z': 3} ويُمكنك حذف جميع مُكوّنات قاموس بالتّابع clear كالتّالي: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> a {'y': 2, 'x': 1, 'z': 3} >>> a.clear() >>> a {} ويُمكن كذلك حذف القاموس بأكمله: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> a {'y': 2, 'x': 1, 'z': 3} >>> del a >>> a Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'a' is not defined في المثال أعلاه، حاولنا أن نصل إلى القاموس a بعد حذفه لذلك أرجع المُفسّرُ خطأ مفاده بأنّ a غير موجود. الدّالة keys تُرجع جميع المفاتيح الموجودة في قاموس، وبالطّريقة نفسها يُمكن إرجاع جميع قيّم قاموس ما باستعمال values ، أمّا إن أردت إرجاع القيم والمفاتيح الموجودة في قاموس فيُمكنك استعمال items : >>> a.keys() ['x', 'y', 'z'] >>> a.values() [1, 2, 3] >>> a.items() [('x', 1), ('y', 2), ('z', 3)] ويُمكن استعمال حلقة for للتّقدّم في القاموس واستخراج القيّم والمفاتيح: >>> for key in a: ... print key ... x y z >>> for key, value in a.items(): ... print key, value ... x 1 y 2 z 3 يُمكن التحقق من تواجد مفتاح على قاموس باستخدام عامل in أو دالة has_key. >>> 'x' in a True >>> 'p' in a False >>> a.has_key('x') True >>> a.has_key('p') False يُمكن كذلك الاعتماد على كلّ من get و setdefault بحيث الأولى تقوم بعرض قيمة مفتاح إذا كان موجودا وإذا لم يكن موجودا فترجع القيمة الافتراضيّة والتّي توضع كعامل Parameter ثان. انظر المثال لتفهم قصدي: >>> d = {'x': 1, 'y': 2, 'z': 3} >>> d.get('x', 5) 1 لقد أرجع السّطر السّابق القيمة (1) رغم أنّنا حدّدنا قيمة افتراضيّة (5) وذلك لأن المفتاح موجود ويحمل قيمة مُسبقا. >>> d.get('p', 5) 5 في المثال أعلاه، أرجعت الدّالة get القيمة (5) وذلك لأنّ المفتاح p غير موجود أصلاً. و setdefaul تقوم بوضع قيمة افتراضيّة لمفتاح إذا لم يكن موجودا. >>> d.setdefault('x', 0) 1 >>> d {'x': 1, 'y': 2, 'z': 3} >>> d.setdefault('p', 0) 0 >>> d {'y': 2, 'x': 1, 'z': 3, 'p': 0} يُمكن استخدام القواميس لتمثيل السّلاسل النّصيّة عبر المفاتيح، حيث يُستبدَلُ المفتاح بقيمته: >>> 'hello %(name)s' % {'name': 'python'} 'hello python' >>> 'Chapter %(index)d: %(name)s' % {'index': 2, 'name': 'Data Structures'} 'Chapter 2: Data Structures' ملاحظة حول المفاتيح لا يمكن أن تُسند لمفتاح واحد أكثر من قيمة، إذا حاولت أن تُسند قيمتين لأكثر من مفتاح، فإنّ آخر قيمة تكون قيمة المفتاح في النّهاية: >>> a = {'FirstName': 'Abd', 'LastName':'Dyouri', 'Job':'Writer', 'FirstName':'Abdelhadi'} >>> a {'LastName': 'Dyouri', 'Job': 'Writer', 'FirstName': 'Abdelhadi'} >>> a['FirstName'] 'Abdelhadi' يُمكن الجمع بين قاموسين في قاموس واحد بالتّابع update، مع تمرير القاموس الثّاني، في المثال التّالي، أنشأنا قاموسا a ثمّ أنشأنا القاموس b، بعد ذلك حدّثنا القاموس a واضعين فيه مُكونات القاموس b فأصبح في الأخير يحمل جميع مكونات القاموسين : >>> a = {'FirstName': 'Abd', 'LastName':'Dyouri', 'Job':'Writer', 'FirstName':'Abdelhadi'} >>> a {'LastName': 'Dyouri', 'Job': 'Writer', 'FirstName': 'Abdelhadi'} >>> b = {'Website':'Hsoub Academy', 'Language':'Arabic'} >>> b {'Website': 'Hsoub Academy', 'Language': 'Arabic'} >>> a.update(b) >>> a {'Website': 'Hsoub Academy', 'LastName': 'Dyouri', 'Job': 'Writer', 'Language': 'Arabic', 'FirstName': 'Abdelhadi'} تطبيق حول القواميس لننشئ تطبيقا بسيطا لتحويل الأرقام إلى كلمات في لغة بايثون، بحيث يكون لكلّ رقم كلمة تُقابله، افتح ملفّا واحفظه باسم dict.py واكتب فيه الشيفرات التّالية، اقرأ التّعليقات لتفهم الشّيفرة: # -*- coding: utf-8 -*- # طباعة اسم التّطبيق print 'Dictionary Version 1.0.0' # تعريف القاموس وتعيين القيم له dict = { 1:'One', 2:'Two', 3:'Three', 4:'Four', 5:'Five' } # الدّوران حول قيم ومفاتيح القاموس وطباعتها for key in dict: print key , 'in English is :' , dict[key] مُخرجات التطبيق (بعد حفظ الملفّ وتنفيذه) ستكون كالتّالي: Dictionary Version 1.0.0 1 in English is : One 2 in English is : Two 3 in English is : Three 4 in English is : Four 5 in English is : Five يُمكنك أن تعدّل في الشّيفرة كما تشاء، ويُمكنك إضافة المزيد من القيم، الأمر يعود لك. تمارين تمرين 1 اجمع قيم الصّفين التّاليين وضعها في صفّ باسم c: a = ('One','Two','Three') b = ('Hsoub Academy', 'Abdelhadi') تمرين 2 أحذف القيمة HTML من المجموعة x في الشّيفرة التّاليّة: x = set(['Ruby', 'Python', 'HTML', 'Perl']) تمرين 3 قم بتطبيق تعلّماتك لتنشئ برنامجا يعرض كلّ دولة عربية واختصارها، مثلا دولة المغرب اختصارها MA ومصر اختصارها EGY. بحيث تكون نتيجة البرنامج شيئا يبدو كالتّالي: Morocco: MA Egypt: EGY ترجمة -وبتصرف- للكتاب Python Practice Book لصاحبه Anand Chitipothu.
    1 نقطة
  42. إلى الآن، تعرفنا في هذه السلسلة من الدروس على أساسيات التعامل مع أنواع البيانات، المُتغيرات، الجمل الشرطية، وحلقات التكرار for و while. وقد أصبح لديك الآن المعلومات الكافية لبرمجة برامج مُتوسطة قد تحتوي على مئات الأسطر البرمجية، وقد حان الوقت لتتعرف على الدوال لكي تجعل مُهمة إعادة استخدام أجزاء من شيفرتك أكثر سهولة ومرونة، كما ستتعرف على بعض من الدوال المُعرفة مُسبقا في لغة بايثون. للتذكير: جميع الشّيفرات التّي تبدأ بعلامة <<< يجب أن تنفّذ على مفسر بايثون. الدوال الدّالة في البرمجة كاسم المتغيّر يُمكنك استدعاؤها عند الحاجة لكنّ المتغير لا يحمل سوى قيمة واحدة، أمّا الدّالة فتحمل شيفرة مستقلة وقد تكون هذه الشيفرة جملة شرطية أو جملة طباعة أو حلقة تكراريّة أو كل ما سبق. وتُستعمل الدوال أساسا لتجنب تكرار شيفرة عدة مرات، فمثلا لنقل بأنّك كتبت شيفرة للجمع بين عددين ثم بعد ذلك أردت أن تجمع عددين آخرين وهكذا، إذا حاولت تكرار الشيفرة سيكون الأمر مُتعبا جدا خاصة إذا كانت الشيفرة التي تكررها طويلة جدا، لذلك فلغات البرمجة توفر الدوال. لنعتبر بأنّ طباعة جملة "Hello" هي الشيفرة التّي تحملها الدّالة، انظر المثال التّالي: >>> def say_hello(): ... print "Hello" ... >>> say_hello() Hello أولا قمنا بإنشاء الدّالة say_hello في السّطر: def say_hello(): النّقاط الثّلاثة التّي تظهر بعد ذلك السّطر تعني بأن مُفسر بايثون ينتظر مدخلات أخرى، لذلك ندخل شيفرة الطّباعة (تذكر بأن هذه هي الشيفرة الأساسيّة) بعد مساحة بيضاء (أربع مسافات). بعد إنشاء الدّالة سيرجع المفسّر إلى حالته الطّبيعية، بدون أي مُخرجات، وذلك لأنّنا يجب أن نستدعي الدّالة لكي تُنفّذَ الشّيفرة التّي بداخلها، والاستدعاء يكون بكتابة اسم الدّالة مع قوسين: >>> say_hello() ما رأيناه قبل قليل هو كيفية تعريف دالة، كيفية وضع شيفرة داخلها ثم كيفية استدعائها لتنفذ الشيفرة. يُمكن أن نجعل الدالة تُعيد قيمة دون تنفيذ أي شيفرة (رغم أنّها تُنفذ شيفرة الإرجاع)، انظر المثال التالي: >>> def x(): ... return 4 ... >>> x() 4 ما فعلناه هو أنّنا قُمنا بجعل الدالة قيمة عوضا عن أن تُنفذ شيفرة ما، أي أنّنا استخدمنا الدالة x كمُتغير عادي يحمل قيمة مُحدّدة. قد تسأل نفسك، ما فائدة الأمر؟. الأمر مُفيد جدا إذا كان برنامجك كبيرا، بحيث يُمكنك استعمال الدوال كقيمة مُخرجة بعد عدة عمليات. مثلا، إذا كان لديك برنامج يطلب من المُستخدم مُدخلا (كاسمه أو كلمة مروره) وتُريد التحقق من مُدخله وإجراء عمليات عليه، فاستعمال المُتغيرات هنا ليست فكرة جيدة وذلك لأنّ الشيفرة ستكون صعبة التعديل. عوضا عن ذلك يُمكنك أن تقوم بالعمليات على المدخل داخل دالة ثم بعد ذلك تجعل الدالة تحمل القيمة التي ترغب بها في النهاية. دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن ملاحظة حول تسمية الدوال رغم أنك تستطيع تسمية الدوال بأحرف صغيرة وكبيرة معا، من المُفضل تسمية الدالة بأحرف صغيرة والفصل بين كل كلمة والأخرى بمحرف "_". المعاملات Parameters من مُميزات الدوال أنّك تستطيع أن تُعطيها مُعاملات عند تعريفها، وأن تُعطي القيم لهذه المُعاملات إما عند تعريف الدالة (المعاملات الافتراضية) أو لاحقا. لتفهم أكثر، انظر المثال التالي: >>> def say_hello(name): ... print 'Hello', name ... >>> say_hello('Abdelhadi') Hello Abdelhadi >>> say_hello('Hsoub Academy') Hello Hsoub Academy كما ترى لقد قُمنا بتعريف الدالة say_hello مع مُعامل name ووضعنا داخلها جملة طباعة لتطبع Hello متبوعا بقيمة العامل name بعدها قُمنا باستدعاء الدالة وأسندنا للعامل name قيمتين مُختلفتين، وقد كانت النتائج مُختلفة، يُمكنك أن تستدعي نفس الدالة مع معاملات مُختلفة لعدد غير محدود من المرات. يُمكنك كذلك أن تقوم بتعريف دالة مع أكثر من معامل، إليك مثالا على دالة لإعادة مجموع عددين : >>> def add_numbers(n1, n2): ... return n1 + n2 ... >>> add_numbers(3,4) 7 إذا قُمنا بتعريف دالة مع معامل فلا بد أن نقوم بتعيين قيمة العامل عند الاستدعاء وإلا فسيرجع مُفسر Python خطأ كالتّالي: >>> say_hello() TypeError: say_hello() takes exactly 1 argument (0 given) الأمر نفسه يحدث إذا عينت عددا أكثر من العوامل المُفترض، مثلا أن تعطي للدالة say_hello مُعاملين أو أكثر. يُمكنك أن تقوم بوضع قيمة افتراضية لمُعامل في سطر تعريف الدالة: >>> def num(n1, n2 = 10): ... return n1 + n2 ... >>> num(3) 13 يُمكن أن تستعمل هذه الطريقة لعرض خطأ للمُستخدم إذا نسي إدخال المُعاملات. >>> def say_hello(name = '| Error! Check the line that calls the function'): ... print 'Hello', name ... >>> say_hello() Hello | Error! Check the line that calls the function يُمكنك كذلك أن تقوم بعدة عمليات مع الدوال، وإليك قائمة ببعض هذه العمليات: تعريف دالة داخل دالة أخرى بما أن الدوال عبارة عن أجزاء من الشيفرة فتستطيع أن تقوم بإنشاء دالة أخرى أو عدد من الدوال داخل الدالة الواحدة، انظر المثال التالي: >>> def say_hello(name): ... def hello(): ... return 'Hello ' ... print hello() + name ... >>> say_hello('Abdelhadi') Hello Abdelhadi كما ترى أعلاه القيمة Hello ما هي إلا القيمة التي أرجعتها الدالة hello المعرفة بداخل الدالة say_hello. استدعاء دالة داخل دالة أخرى هذا الأمر بسيط، فقط استدع الدالة داخل دالة أخرى وستعمل كلتا الدالتان عند استدعاء الدالة الأم: >>> def say_hello(name): ... print 'Hello', name ... >>> def print_hello(): ... say_hello('Abdelhadi') ... >>> print_hello() Hello Abdelhadi في المثال أعلاه قُمنا باستدعاء الدالة say_hello من داخل الدالة print_hello. إسناد دالة لمتغير تستطيع أن تُنشئ دالة وتقوم بإسنادها لمُتغير بالطّريقة التالية: >>> def say_hello(name): ... print 'Hello', name ... >>> s = say_hello >>>> s('Abdelhadi') Hello Abdelhadi إسناد دالة كمعامل لدالة أخرى قلنا مُسبقا بأنّه يمكن للدالة أن تتصرف كمتغير وذلك عندما نجعلها ترجع قيمة بالجملة return. وهذا يعني بأنّنا نستطيع أن نسند للدالة دالة أخرى. >>> def say_hello(name): ... print 'Hello', name ... >>> def get_name(): ... return 'Abdelhadi' ... >>> say_hello(get_name()) Hello Abdelhadi إرجاع دالة داخل دالة أخرى يُمكنك أيضا أن تستعمل الجملة return لإرجاع دالة داخل دالة أخرى عوضا عن إرجاع قيمة ما، انظر المثال: >>> def get_hello(): ... return 'Hello Abdelhadi' ... >>> def say_hello(): ... return get_hello() ... >>> print say_hello() Hello Abdelhadi ستلاحظ بأنّ الدالة say_hello تحمل قيمة الدالة get_hello، وذلك لأنّنا أرجعنا هذه الأخيرة داخل الدالة say_hello. إسناد عدد لا نهائي من المعاملات لدالة ما لنقل بأنّك تريد أن تقوم بإنشاء دالة تطبع جميع المُحتويات (المُعاملات) التي تُدخلها دون الحاجة إلى تحديد كل معامل على حدة. يُمكنك أن تقوم بالأمر بما يُسمى مُعامل طول المُتغير أو Variable-length argument وذلك كالتالي: >>> def print_arguments(*args): ... print args ... >>> print_arguments(2, 4, 8, 'Abdelhadi', 'Hsoub Academy') (2, 4, 8, 'Abdelhadi', 'Hsoub Academy') المُتغير args عبارة عن صف (Tuple) من القيم، وبالتالي فإنك تستطيع أن تتعامل معه بحلقة For. يُمكن أن تستخدم أي اسم نريده لهذا المعامل، وعموما يعتبر الاسم args* تقليدا بين مُبرمجي بايثون. لاحظ أن الاختلاف بين المعامل العادي والمعامل في المثال أعلاه هو النجمة في البداية. تستطيع أن تجعل المُعاملات قاموسا عوضا عن صف بحيث تُرجع الدالة القاموس الذي يحتوي على اسم المعامل وقيمته، وذلك كالآتي: >>> def print_keyword_args(**kwargs): ... print kwargs ... >>> print_keyword_args(name = 'Abdelhadi', website = 'Hsoub Academy', n = 3) {'website': 'Hsoub Academy', 'name': 'Abdelhadi', 'n': 3} لاحظ بأنّ اسم المُعامل يبدأ بنجمتين هذه المرة، وهذا النوع من المُعاملات يسمى مُعاملات الكلمة المفتاحية Keyword Arguments لأنها ترجع قاموسا مفاتيحه هي أسماء المعاملات التي تختارها أنت وقيم المفاتيح هي قيم المعاملات. المتغيرات المحلية والمتغيرات العامة Local variables and Global variables المتغيرات المحلية هي المتغيرات التي نقوم بإنشائها داخل دالة، أما المتغيرات العامة فهي التي ننشئها خارج الدالة. يُمكنك أن تصل إلى المتغيرات العامة في أي مكان من برنامجك، على خلاف المُتغيرات المحلية التي ستتمكن من الوصول إليها فقط داخل الدالة، انظر المثال التالي: >>> def say_hello(): ... name = 'Abdelhadi' ... print 'Hello', name ... >>> say_hello() Hello Abdelhadi >>> print name Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'name' is not defined قُمنا بتعريف المُتغير name داخل الدالة say_hello وبعدها حاولنا الوصول إليه خارج الدالة، ما أدى إلى خطأ مفاده بأن مُفسر بايثون لم يتعرف على المُتغير. يُمكن أن نجعل المتغير name عامًا بإضافة الكلمة global قبله (عليك أن تقوم بهذا قبل إسناد قيمة للمُتغير)، انظر المثال التالي: >>> def say_hello(): ... global name ... name = 'Abdelhadi' ... >>> say_hello() >>> print name Abdelhadi نُلاحظ بأنّنا استطعنا الوصول إلى المُتغيّر name خارج الدالة التي عُرّفَ بها. تطبيق سنضرب مثالا بالبرنامج الذي أنشأناه في درس التعابير الشرطية والإزاحات. print 'Hello User, this is a basic sign up/login Program' username = raw_input('Enter your username please: ') password = raw_input('Enter the your password please: ') password_verification = raw_input('Verify password: ') if password == password_verification: print 'You have Successfully Signed up! \n' username_sign_in = raw_input('Enter your username please: ') password_sign_in = raw_input('Enter your password please: ') if username_sign_in == username and password_sign_in == password: print 'You have Successfully Signed in!' else: print 'username or password do not match! Please try again!' else: print 'The password and the password verification do not match! Please try again' سنركز على شيفرة التحقق من المُستخدم وكلمة المرور: if username_sign_in == username and password_sign_in == password: print 'You have Successfully Signed in!' else: print 'username or password do not match! Please try again!' إذا أردنا أن نستخدمها لأكثر من مرة في برنامجنا فعلينا أن نضعها داخل دالة. def user_logged_in?(username_sign_in, username, password_sign_in, password): if username_sign_in == username and password_sign_in == password: return True else: return False يُمكنك استخدام الدالة في أي مكان من الشيفرة: def is_user_logged_in(username_sign_in, username, password_sign_in, password): if username_sign_in == username and password_sign_in == password: return True else: return False new_password = raw_input('Enter new username: ') new_username = raw_input('Enter new password: ') print 'Ok!' password = raw_input('Hello again, Enter your username: ') username = raw_input('Enter username\'s password: ') print is_user_logged_in(username, new_username, password, new_password) الدالة is_user_logged_in تقوم بمُقارنة كلمتي المرور واسمي المُستخدم فإن كانا متطابقين فستصبح قيمة الدالة True أما إن لم تتوافق القيم فإنّ الدالة تحمل القيمة False ويُمكنك الآن استخدام الدالة مع الجمل الشرطية في أي مكان من برنامجك دون الاضطرار لإعادة كتابة شيفرة التحقق كل مرة. كما أنّ التعديل على الشيفرة بسيط جدا، فالتّعديل من مكان واحد (الدالة) يكفي يطبّق على جميع الأماكن الأخرى (أمكنة استدعاء الدالة). الدوال المعرفة مسبقا تُوفر بايثون دوالا مُعرفة مُسبقا، وقد تعاملنا مع كثير منها في الدروس السابقة، وإليك بعض الدوال المُفيدة التي توجد مُسبقا بلغة بايثون. print: دالة الطّباعة التي استخدمناها أكثر من مرة لطباعة القيم في سابق الدروس. Int: دالة تحويل القيم إلى عدد صحيح، مثال: >>> int(5.5) 5 str: دالة تحويل القيم إلى سلسلة نصيّة String: >>> str(True) 'True' وتُستعمل كثيرا لجمع سلسلة نصية بقيمة من نوع آخر بالعامل + (إذا لم تستخدم هذه الدالة فسيعرض لك مُفسر بايثون خطأ يُفيد بأنّك لا تستطيع جمع قيمتين من نوعين مُختلفين): >>> print 'ABC' + str(122) + str(False) ABC122False abs: دالة للحصول على القيمة المُطلقة Absolute Value لعدد ما (إذا كان موجبا فهو العدد نفسه، وإذا كان سالبا فمُقابله): >>> abs(3) 3 >>> abs(-3) 3 len: دالة لقياس عدد عناصر قائمة أو عدد أحرف سلسلة نصية. >>> a = ['Abdelhadi', 'Dyouri', 'Academy', 'Hsoub'] >>> b = 'Hello' >>> len(a) 4 >>> len(b) 5 min: دالة لتحديد أقل قيمة بين قيمتين أو أكثر. >>> min(4, 5, 7, 88, 3, 2) 2 max: دالة لتحديد أقل قيمة بين قيمتين أو أكثر. >>> max(4, 5, 7, 88, 3, 2) 88 range: لتوليد قائمة بأعداد بين قيمة المعامل الأول وقيمة المُعامل الثاني: >>> range(0, 11) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> range(0, 11, 3) [0, 3, 6, 9] raw_input: دالة للحصول على مُدخل نصي من المُستخدم، يُمكنك أن تسند هذا المُدخل إلى مُتغير. >>> def say_hello(name): ... print 'Hello', name ... >>> say_hello(raw_input()) Abdelhadi Hello Abdelhadi كما قُلنا سابقا، فإنك تستطيع أن تقوم بإسناد دالة كمعامل لدالة أخرى، وهذا ما فعلناه في المثال أعلاه، إذ مررنا الدالة raw_input ليكون معاملا للدالة say_hello. تمارين تمرين 1 اكتب برنامجا للحصول على قيمة من المُستخدم وتحويلها إلى قيمة عددية. تمرين 2 اكتب دالة لطباعة جملة لعدد من المرات، واترك للمُستخدم حرية اختيار عدد مرات التكرار (مُساعدة: استعمل الدالة raw_input للحصول على قيمة من المُستخدم) تمرين 3 اكتب دالة للجمع بين عددين يُدخلهما المُستخدم. تمرين 4 بَرمِجْ آلة حاسبة بسيطة تقوم بالجمع، الطّرح، الضرب والقسمة. إليك طريقة العمل: احصل على قيمة العدد الأول من المُستخدم. احصل على قيمة العدد الثاني. حول القيمتين النصيتين إلى قيمتين عدديتين. احصل على العامل الرياضي (*، /، - أو +) من المُستخدم. استخدم الجمل الشرطية لإجراء العملية المُناسبة (إذا كان المُدخل + فقم بالجمع). ترجمة -وبتصرف- من الكتاب Python Practice Book لكاتبه Anand Chitipothu.
    1 نقطة
  43. تُسِّهل البرمجة الكائنية كتابة شيفرات قابلة لإعادة الاستخدام وتجنب التكرار في مشاريع التطوير. إحدى الآليات التي تحقق بها البرمجة الكائنية هذا الهدف هي مفهوم الوراثة (inheritance)، التي بفضلها يمكن لصنفٍ فرعي (subclass) استخدام الشيفرة الخاصة بصنف أساسي (base class، ويطلق عليه «صنف أب» أيضًا) موجود مسبقًا. سيستعرض هذا الدرس بعض الجوانب الرئيسية لمفهوم الوراثة في بايثون، بما في ذلك كيفية إنشاء الأصناف الأساسية (parent classes) والأصناف الفرعية (child classes)، وكيفية إعادة تعريف (override) التوابع والخاصيات، وكيفية استخدام التابع ‎super()‎، وكيفية الاستفادة من الوراثة المتعددة (multiple inheritance). ما هي الوراثة؟ تقوم الوراثة على استخدام شيفرة صنف معين في صنف آخر أي يرث صنف يراد إنشاؤه شيفرة صنف آخر. يمكن تمثيل مفهوم الوراثة في البرمجة بالوراثة في علم الأحياء تمامًا، فالأبناء يرثون خاصيات معينة من آبائهم. ويمكن لطفل أن يرث طول والده أو لون عينيه بالإضافة إلى خاصيات أخرى جديدة خاصة فيه. كما يتشارك الأطفال نفس اسم العائلة الخاصة بآبائهم. ترث الأصناف الفرعية (subclasses، تُسمى أيضًا *الأصناف الأبناء [child classes]) التوابع والمتغيرات من *الأصناف الأساسية* (base classes، تسمى أيضًاالأصناف الآباء [parent classes]). مثلًا، قد يكون لدينا صنف أساسي يسمى ‎Parent‎ يحتوي متغيرات الأصناف ‎last_name‎ و ‎height‎ و ‎eye_color‎، والتي سيرثها الصنف الابن ‎Child‎. لمَّا كان الصنف الفرعي ‎Child‎ يرث الصنف الأساسي ‎Parent‎، فبإمكانه إعادة استخدام شيفرة ‎Parent‎، مما يسمح للمبرمج بكتابة شيفرة أوجز، وتقليل التكرار. الأصناف الأساسية تشكل الأصناف الأساسية أساسًا يمكن أن تستند إليه الأصناف الفرعية المُتفرِّعة منها، إذ تسمح الأصناف الأساسية بإنشاء أصناف فرعية عبر الوراثة دون الحاجة إلى كتابة نفس الشيفرة في كل مرة. يمكن تحويل أي صنف إلى صنف أساسي، إذ يمكن استخدامه لوحده، أو جعله قالبًا (نموذجًا). لنفترض أّنّ لدينا صنفًا أساسيًا باسم ‎Bank_account‎، وصنفين فرعيين مُشتقين منه باسم ‎Personal_account‎ و ‎Business_account‎. ستكون العديد من التوابع مشتركة بين الحسابات الشخصية (Personalaccount) والحسابات التجارية (Businessaccount)، مثل توابع سحب وإيداع الأموال، لذا يمكن أن تنتمي تلك التوابع إلى الصنف الأساسي ‎Bank_account‎. سيكون للصنف ‎Business_account‎ توابع خاصة به، مثل تابع مخصص لعملية جمع سجلات ونماذج الأعمال، بالإضافة إلى متغير ‎employee_identification_number‎ موروث من الصنف الأب. وبالمثل، قد يحتوي الصنف ‎Animal‎ على التابعين ‎eating()‎ و ‎sleeping()‎، وقد يتضمن الصنف الفرعي ‎Snake‎ تابعين إضافيين باسم ‎hissing()‎ و ‎slithering()‎ خاصين به. دعنا ننشئ صنفًا أساسيًا باسم ‎Fish‎ لاستخدامه لاحقًا أساسًا لأصناف فرعية تمثل أنواع الأسماك. سيكون لكل واحدة من تلك الأسماك أسماء أولى وأخيرة، بالإضافة إلى خصائص مميزة خاصة بها. سننشئ ملفًا جديدًا يسمى ‎fish.py‎ ونبدأ بالباني، والذي سنعرّف داخله متغيري الصنف ‎first_name‎ و ‎last_name‎ لكل كائنات الصنف ‎Fish‎، أو أصنافه الفرعية. class Fish: def __init__(self, first_name, last_name="Fish"): self.first_name = first_name self.last_name = last_name القيمة الافتراضية للمتغير ‎last_name‎ هي السلسلة النصية ‎"Fish"‎، لأننا نعلم أنّ معظم الأسماك سيكون هذا هو اسمها الأخير. لنُضف بعض التوابع الأخرى: class Fish: def __init__(self, first_name, last_name="Fish"): self.first_name = first_name self.last_name = last_name def swim(self): print("The fish is swimming.") def swim_backwards(self): print("The fish can swim backwards.") لقد أضفنا التابعين ‎swim()‎ و ‎swim_backwards()‎ إلى الصنف ‎Fish‎ حتى يتسنى لكل الأصناف الفرعية استخدام هذه التوابع. ما دام أنّ معظم الأسماك التي ننوي إنشاءها ستكون عظمية (أي أنّ لها هيكلا عظميًا) وليس غضروفية (أي أن لها هيكلًا غضروفيًا)، فيمكننا إضافة بعض الخاصيات الإضافية إلى التابع ‎__init__()‎: class Fish: def __init__(self, first_name, last_name="Fish", skeleton="bone", eyelids=False): self.first_name = first_name self.last_name = last_name self.skeleton = skeleton self.eyelids = eyelids def swim(self): print("The fish is swimming.") def swim_backwards(self): print("The fish can swim backwards.") لا يختلف بناء الأصناف الأساسية عن بناء أي صنف آخر، إلا أننا نصممها لتستفيد منها الأصناف الفرعية المُعرّفة لاحقًا. الأصناف الفرعية الأصناف الفرعية هي أصناف ترث كل شيء من الصنف الأساسي. هذا يعني أنّ الأصناف الفرعية قادرة على الاستفادة من توابع ومتغيرات الصنف الأساسي. على سبيل المثال، سيتمكن الصنف الفرعي ‎Goldfish‎ المشتق من الصنف ‎Fish‎ من استخدام التابع ‎swim()‎ المُعرّف في ‎Fish‎ دون الحاجة إلى التصريح عنه. يمكننا النظر إلى الأصناف الفرعية على أنها أقسام من الصنف الأساسي. فإذا كان لدينا صنف فرعي يسمى ‎Rhombus‎ (معيّن)، وصنف أساسي يسمى ‎Parallelogram‎ (متوازي الأضلاع)، يمكننا القول أنّ المعين (‎Rhombus‎) هو متوازي أضلاع (‎Parallelogram‎). يبدو السطر الأول من الصنف الفرعي مختلفًا قليلًا عن الأصناف غير الفرعية، إذ يجب عليك تمرير الصنف الأساسي إلى الصنف الفرعي كمعامل: class Trout(Fish): الصنف ‎Trout‎ هو صنف فرعي من ‎Fish‎. يدلنا على هذا الكلمةُ ‎Fish‎ المُدرجة بين قوسين. يمكننا إضافة توابع جديدة إلى الأصناف الفرعية، أو إعادة تعريف التوابع الخاصة بالصنف الأساسي، أو يمكننا ببساطة قبول التوابع الأساسية الافتراضية باستخدام الكلمة المفتاحية ‎pass‎، وهو ما سنفعله في المثال التالي: ... class Trout(Fish): pass يمكننا الآن إنشاء كائن من الصنف ‎Trout‎ دون الحاجة إلى تعريف أي توابع إضافية. ... class Trout(Fish): pass terry = Trout("Terry") print(terry.first_name + " " + terry.last_name) print(terry.skeleton) print(terry.eyelids) terry.swim() terry.swim_backwards() لقد أنشأنا كائنًا باسم ‎terry‎ من الصنف ‎Trout‎، والذي سيستخدم جميع توابع الصنف ‎Fish‎ وإن لم نعرّفها في الصنف الفرعي ‎Trout‎. يكفي أن نمرر القيمة ‎"Terry"‎ إلى المتغير ‎first_name‎، أما المتغيرات الأخرى فقد جرى تهيئتها سلفًا. عند تنفيذ البرنامج، سنحصل على المخرجات التالية: Terry Fish bone False The fish is swimming. The fish can swim backwards. لننشئ الآن صنفًا فرعيًا آخر يعرّف تابعًا خاصا به. سنسمي هذا الصنف ‎Clownfish‎. سيسمح التابع الخاص به بالتعايش مع شقائق النعمان البحري: ... class Clownfish(Fish): def live_with_anemone(self): print("The clownfish is coexisting with sea anemone.") دعنا ننشئ الآن كائنًا آخر من الصنف ‎Clownfish‎: ... casey = Clownfish("Casey") print(casey.first_name + " " + casey.last_name) casey.swim() casey.live_with_anemone() عند تنفيذ البرنامج، سنحصل على المخرجات التالية: Casey Fish The fish is swimming. The clownfish is coexisting with sea anemone. تُظهر المخرجات أنّ الكائن ‎casey‎ المستنسخ من الصنف ‎Clownfish‎ قادر على استخدام التابعين ‎__init__()‎ و ‎swim()‎ الخاصين بالصنف ‎Fish‎، إضافة إلى التابع ‎live_with_anemone()‎ الخاص بالصنف الفرعي. إذا حاولنا استخدام التابع ‎live_with_anemone()‎ في الكائن ‎Trout‎، فسوف يُطلق خطأ: terry.live_with_anemone() AttributeError: 'Trout' object has no attribute 'live_with_anemone' ذلك أنَّ التابع ‎live_with_anemone()‎ ينتمي إلى الصنف الفرعي ‎Clownfish‎ فقط، وليس إلى الصنف الأساسي ‎Fish‎. ترث الأصناف الفرعية توابع الصنف الأساسي الذي اشتُقَّت منه، لذا يمكن لكل الأصناف الفرعية استخدام تلك التوابع. إعادة تعريف توابع الصنف الأساسي في المثال السابق عرّفنا الصنف الفرعي ‎Trout‎ الذي استخدم الكلمة المفتاحية ‎pass‎ ليرث جميع سلوكيات الصنف الأساسي ‎Fish‎، وعرّفنا كذلك صنفًا آخر ‎Clownfish‎ يرث جميع سلوكيات الصنف الأساسي، ويُنشئ أيضًا تابعًا خاصًا به. قد نرغب في بعض الأحيان في استخدام بعض سلوكيات الصنف الأساسي، ولكن ليس كلها. يُطلَق على عملية تغيير توابع الصنف الأساسي «إعادة التعريف» (Overriding). عند إنشاء الأصناف الأساسية أو الفرعية، فلا بد أن تكون لك رؤية عامة لتصميم البرنامج حتى لا تعيد تعريف التوابع إلا عند الضرورة. سننشئ صنفًا فرعيًا ‎Shark‎ مشتقًا من الصنف الأساسي ‎Fish‎، الذي سيمثل الأسماك العظمية بشكل أساسي، لذا يتعين علينا إجراء تعديلات على الصنف ‎Shark‎ المخصص في الأصل للأسماك الغضروفية. من منظور تصميم البرامج، إذا كانت لدينا أكثر من سمكة غير عظمية واحدة، فيُستحب أن ننشئ صنفًا خاصًا بكل نوع من هذين النوعين من الأسماك. تمتلك أسماك القرش، على عكس الأسماك العظمية، هياكل مصنوعة من الغضاريف بدلاً من العظام. كما أنّ لديها جفونًا، ولا تستطيع السباحة إلى الوراء، كما أنها قادرة على المناورة للخلف عن طريق الغوص. على ضوء هذه المعلومات، سنعيد تعريف الباني ‎__init__()‎ والتابع ‎swim_backwards()‎. لا نحتاج إلى تعديل التابع ‎swim()‎ لأنّ أسماك القرش يمكنها السباحة. دعنا نلقي نظرة على هذا الصنف الفرعي: ... class Shark(Fish): def __init__(self, first_name, last_name="Shark", skeleton="cartilage", eyelids=True): self.first_name = first_name self.last_name = last_name self.skeleton = skeleton self.eyelids = eyelids def swim_backwards(self): print("The shark cannot swim backwards, but can sink backwards.") لقد أعدنا تعريف المعاملات التي تمت تهيئتها في التابع ‎__init__()‎، فأخذ المتغير ‎last_name‎ القيمة ‎"Shark"‎، كما أُسنِد إلى المتغير ‎skeleton‎ القيمة ‎"cartilage"‎، فيما أُسنِدَت القيمة المنطقية ‎True‎ إلى المتغير ‎eyelids‎. يمكن لجميع نُسخ الصنف إعادة تعريف هذه المعاملات. يطبع التابع ‎swim_backwards()‎ سلسلة نصية مختلفة عن تلك التي يطبعها في الصنف الأساسي ‎Fish‎، لأنّ أسماك القرش غير قادرة على السباحة للخلف كما تفعل الأسماك العظمية. يمكننا الآن إنشاء نسخة من الصنف الفرعي ‎Shark‎، والذي سيستخدم التابع ‎swim()‎ الخاص بالصنف الأساسي ‎Fish‎: ... sammy = Shark("Sammy") print(sammy.first_name + " " + sammy.last_name) sammy.swim() sammy.swim_backwards() print(sammy.eyelids) print(sammy.skeleton) عند تنفيذ هذه الشيفرة، سنحصل على المخرجات التالية: Sammy Shark The fish is swimming. The shark cannot swim backwards, but can sink backwards. True cartilage لقد أعاد الصنف الفرعي ‎Shark‎ تعريف التابعين ‎__init__()‎ و ‎swim_backwards()‎ الخاصين بالصنف الأساسي ‎Fish‎، وورث في نفس الوقت التابع ‎swim()‎ الخاص بالصنف الأساسي. الدالة ‎super()‎ يمكنك باستخدام الدالة ‎super()‎ الوصول إلى التوابع الموروثة التي أُعيدت كتابتها. عندما نستخدم الدالة ‎super()‎، فإننا نستدعي التابع الخاص بالصنف الأساسي لاستخدامه في الصنف الفرعي. على سبيل المثال، قد نرغب في إعادة تعريف جانب من التابع الأساسي وإضافة وظائف معينة إليه، ثم بعد ذلك نستدعي التابع الأساسي لإنهاء بقية العمل. في برنامج خاص بتقييم الطلاب مثلًا، قد نرغب في تعريف صنف فرعي ‎Weighted_grade‎ يرث الصنف الأساسي ‎Grade‎، ونعيد فيه تعريف التابع ‎calculate_grade()‎ الخاص بالصنف الأساسي من أجل تضمين شيفرة خاصة بحساب التقدير المرجّح (weighted grade)، مع الحفاظ على بقية وظائف الصنف الأساسي. عبر استدعاء التابع ‎super()‎، سنكون قادرين على تحقيق ذلك. عادة ما يُستخدم التابع ‎super()‎ ضمن التابع ‎__init__()‎، لأنّه المكان الذي ستحتاج فيه على الأرجح إلى إضافة بعض الوظائف الخاصة إلى الصنف الفرعي قبل إكمال التهيئة من الصنف الأساسي. لنضرب مثلًا لتوضيح ذلك، دعنا نعدّل الصنف الفرعي ‎Trout‎. نظرًا لأنّ سمك السلمون المرقَّط من أسماك المياه العذبة، فلنضف متغيرًا اسمه ‎water‎ إلى التابع ‎__init__()‎، ولنُعطه القيمة ‎"freshwater"‎، ولكن مع الحفاظ على باقي متغيرات ومعاملات الصنف الأساسي: ... class Trout(Fish): def __init__(self, water = "freshwater"): self.water = water super().__init__(self) ... لقد أعدنا تعريف التابع ‎__init__()‎ في الصنف الفرعي ‎Trout‎، وغيرنا سلوكه موازنةً بالتابع ‎__init__()‎ المُعرَّف سلفًا في الصنف الأساسي ‎Fish‎. لاحظ أننا استدعينا التابع ‎__init__()‎ الخاص بالصنف ‎Fish‎ بشكل صريح ضمن التابع ‎__init__()‎ الخاص بالصنف ‎Trout‎،. بعد إعادة تعريف التابع، لم نعد بحاجة إلى تمرير ‎first_name‎ كمعامل إلى ‎Trout‎، وفي حال فعلنا ذلك، فسيؤدي ذلك إلى إعادة تعيين ‎freshwater‎ بدلاً من ذلك. سنُهيِّئ بعد ذلك الخاصية ‎first_name‎ عن طريق استدعاء المتغير في الكائن خاصتنا. الآن يمكننا استدعاء متغيرات الصنف الأساسي التي تمت تهيئتها، وكذلك استخدام المتغير الخاص بالصنف الفرعي: ... terry = Trout() # تهيئة الاسم الأول terry.first_name = "Terry" # super() الخاص بالصنف الأساسي عبر __init__() استخدام print(terry.first_name + " " + terry.last_name) print(terry.eyelids) # المعاد تعريفها في الصنف الفرعي __init__() استخدام print(terry.water) # الخاص بالصنف الأساسي swim() استخدام التابع terry.swim() سنحصل على المخرجات التالية: Terry Fish False freshwater The fish is swimming. تُظهر المخرجات أنّ الكائن ‎terry‎ المنسوخ من الصنف الفرعي ‎Trout‎ قادر على استخدام المتغير ‎water‎ الخاص بتابع الصنف الفرعي ‎__init__()‎، إضافة إلى استدعاء المتغيرات ‎first_name‎ و ‎last_name‎ و ‎eyelids‎ الخاصة بالتابع ‎__init__()‎ المُعرَّف في الصنف الأساسي ‎Fish‎. يسمح لنا التابع ‎super()‎ المُضمن في بايثون باستخدام توابع الصنف الأساسي حتى بعد إعادة تعريف تلك التوابع في الأصناف الفرعية. الوراثة المُتعدِّدة (Multiple Inheritance) المقصود بالوراثة المتعددة هي قدرة الصنف على أن يرث الخاصيات والتوابع من أكثر من صنف أساسي واحد. هذا من شأنه تقليل التكرار في البرامج، ولكنه يمكن أيضًا أن يُعقِّد العمل، لذلك يجب استخدام هذا المفهوم بحذر. لإظهار كيفية عمل الوراثة المتعددة، دعنا ننشئ صنفًا فرعيًا ‎Coral_reef‎ يرث من الصنفين ‎Coral‎ و ‎Sea_anemone‎. يمكننا إنشاء تابع في كل صنف أساسي، ثم استخدام الكلمة المفتاحية ‎pass‎ في الصنف الفرعي ‎Coral_reef‎: class Coral: def community(self): print("Coral lives in a community.") class Anemone: def protect_clownfish(self): print("The anemone is protecting the clownfish.") class CoralReef(Coral, Anemone): pass يحتوي الصنف ‎Coral‎ على تابع يسمى ‎community()‎، والذي يطبع سطرًا واحدًا، بينما يحتوي الصنف ‎Anemone‎ على تابع يسمى ‎protect_clownfish()‎، والذي يطبع سطرًا آخر. سنُمرِّر الصنفين كلاهما بين قوسين في تعريف الصنف CoralReef، ما يعني أنه سيرث الصنفين معًا. دعنا الآن ننشئ كائنًا من الصنف CoralReef: ... great_barrier = CoralReef() great_barrier.community() great_barrier.protect_clownfish() الكائن ‎great_barrier‎ مُشتقٌ الصنف ‎CoralReef‎، ويمكنه استخدام التوابع من كلا الصنفين الأساسيين. عند تنفيذ البرنامج، سنحصل على المخرجات التالية: Coral lives in a community. The anemone is protecting the clownfish. تُظهِر المخرجات أنَّ التوابع من كلا الصنفين الأساسيين استُخدِما بفعالية في الصنف الفرعي. تسمح لنا الوراثة المُتعدِّدة بإعادة استخدام الشيفرات البرمجية المكتوبة في أكثر من صنف أساسي واحد. وإذا تم تعريف التابع نفسه في أكثر من صنف أساسي واحد، فإنّ الصنف الفرعي سيستخدم التابع الخاص بالصنف الأساسي الذي ظهر أولًا في قائمة الأصناف المُمرَّرة إليه عند تعريفه. رغم فوائدها الكثيرة وفعاليتها، إلا أنَّ عليك توخي الحذر في استخدام الوراثة المُتعدِّدة، حتى لا ينتهي بك الأمر بكتابة برامج مُعقَّدة وغير مفهومة للمبرمجين الآخرين. خلاصة تعلمنا في هذا الدرس كيفية إنشاء أصناف أساسية وفرعية، وكيفية إعادة تعريف توابع وخاصيات الأصناف الأساسية داخل الأصناف الفرعية باستخدام التابع ‎super()‎، إضافة إلى مفهوم الوراثة المتعددة. الوراثة هي إحدى أهم ميزات البرمجة الكائنية التي تجعلها متوافقة مع مبدأ DRY (لا تكرر نفسك)، وهذا يحسن إنتاجية المبرمجين، ويساعدهم على تصميم برامج فعالة وواضحة. هذه المقالة جزء من سلسة مقالات حول تعلم البرمجة في بايثون 3. ترجمة -وبتصرّف- للمقال Understanding Class Inheritance in Python 3 لصاحبته Lisa Tagliaferri اقرأ أيضًا المقالة التالية: كيفية تطبيق التعددية الشكلية (Polymorphism) على الأصناف المقالة السابقة: فهم متغيرات الأصناف والنسخ في بايثون 3 المرجع الشامل إلى تعلم لغة بايثون كتاب البرمجة بلغة بايثون
    1 نقطة
  44. لغة C# هي لغة برمجة أنيقة، كائنيّة التوجه Object-oriented بأنواع بيانات سليمة Type-safe تمكّن المطورين من بناء تطبيقات آمنة ومتينة تعمل على إطار العمل NET. // تبدأ التعليقات وحيدة السطر بشريطين مائلين هكذا // /* توضع التعليقات متعدّدة الأسطر بين العلامة أعلاه والعلامة أسفله */ هذا تعليق xml يُستخدَم لتوليد توثيق خارجي أو لتقديم مساعدة حسب السياق في بيئة تطوير مندمجة IDE. /// <param name="firstParam"> لتوثيق الدالة Parameter الذي هو معامل firstParam هذا تعليق</param> /// <returns>معلومات عن القيمة المُرجَعة للدالة/returns> //public void MethodOrClassOrOtherWithParsableHelp(string firstParam) {} يحدّد فضاءات اﻷسماء Namespaces التي ستستخدمها هذه الشفرة فضاءات الأسماء أدناه هي كلّها جزء من مكتبة الأصناف Classes المعيارية في إطار العمل NET. Framework Class Library using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Net; using System.Threading.Tasks; using System.IO; فضاء الأسماء هذا ليس مُتضمّنا في المكتبة المعيارية: using System.Data.Entity; لكي تتمكّن من استخدام المكتبة أعلاه فستحتاج لإضافة مرجع إلى ملف dll وهو ما يمكن لمدير الحزم NuGet فعلُه: Install-Package EntityFramework تعرّف فضاءات الأسماء مجالات لتنظيم الشفرات ضمن حزم Packages أو وِحْدات Modules لاستخدام فضاء الأسماء المُعرّف أدناه في شفرة أخرى نضيف العبارة Learning.CSharp إلى فضاءات الأسماء المستخدمة namespace Learning.CSharp { يجب أن يحوي كل ملف cs. على الأقل على صنف Class له نفس اسم الملف. يمكنك لك عدم التقيّد بهذا الشرط، إلا أنه أفضل لصحة الشفرة المصدرية public class LearnCSharp { صياغة أساسية: يمكنك التجاوز إلى “ميزات مثيرة للاهتمام” إن سبق لك كتابة شفرات بجافا أو سي++ public static void Syntax() { // للكتابة في سطر جديد Console.WriteLine استخدم Console.WriteLine("Hello World"); Console.WriteLine( "Integer: " + 10 + " Double: " + 3.14 + " Boolean: " + true); // لكتابة عبارات على نفس السطر Console.Write استخدم Console.Write("Hello "); Console.Write("World"); أنواع البيانات Types والمتغيّرات Variables دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن عرّف المتغيّرات على النحو التالي <type> <name> Sbyte - عدد صحيح (سالب أو موجب) على 8 بتات (محصور بين 128- و127) sbyte fooSbyte = 100; Byte - عدد طبيعي (موجب فقط) على 8 بتات (محصور بين 0 و255) byte fooByte = 100; Short - عدد صحيح أو طبيعي طوله 16 بتات صحيح short محصور بين -32,768 و32,767 طبيعي ushort محصور بين 0 و65,535 short fooShort = 10000; ushort fooUshort = 10000; عدد صحيح fooInt أو طبيعي fooUint طوله 32 بت int fooInt = 1; // (-2,147,483,648 <= int <= 2,147,483,647) uint fooUint = 1; // (0 <= uint <= 4,294,967,295) Long عدد صحيح fooLong أو طبيعي fooUlong طوله 64 بت long fooLong = 100000L; // (-9,223,372,036,854,775,808 <= long <= 9,223,372,036,854,775,807) ulong fooUlong = 100000L; // (0 <= ulong <= 18,446,744,073,709,551,615) النوع المبدئي default للأعداد هو int أو uint حسب طول العدد. والحرف L وراء العدد يشير إلى أن نوع العدد هو long أو ulong Double - فاصلة عائمة مزدوجة الدقة حسب المعيار 64-bit IEEE 754 double fooDouble = 123.4; // الدقة: 15-16 رقما Float - فاصلة عائمة وحيدة الدقة 32-bit IEEE 754 Floating Point float fooFloat = 234.5f; // الدقة: 7 أرقام يشير الحرف f وراء العدد إلى أن نوع العدد هو Float Decimal - نوع بيانات بطول 128 بت، ودقّة أعلى من بقية أنواع البيانات ذات الفاصلة العائمة مناسب للحسابات المالية والنقدية decimal fooDecimal = 150.3m; // Boolean - true & false bool fooBoolean = true; // or false Char - نوع بيانات بطول 16 بت يرمز لمحرف يونيكود `char fooChar = 'A'; Strings – على النقيض من جميع أنواع البيانات السابقة التي هي أنواع لقيم البيانات فإن النوع String - سلسلة محارف - هو نوع لمرجع Reference بمعنى أنه يمكنه أخذ القيمة null string fooString = "\"escape\" quotes and add \n (new lines) and \t (tabs)"; Console.WriteLine(fooString); يمكن الوصول إلى كل محرف من سلسلة المحارف عن طريق ترتيبه في السلسلة char charFromString = fooString[1]; // => 'e' لا يمكن التعديل على سلاسل المحارف؛ التعليمة fooString[1] = X خاطئة مقارنة سلاسل محارف مع قيمة الخاصيّة CurrentCulture المعرّفة في المكتبة المعيارية لتمثيل اللغة المستخدمة في النظام، مع تجاهل حالة الأحرف IgnoreCase string.Compare(fooString, "x", StringComparison.CurrentCultureIgnoreCase); تهيئة سلسلة المحارف اعتمادا على sprintf string fooFs = string.Format("Check Check, {0} {1}, {0} {1:0.0}", 1, 2); التاريخ والتهيئة DateTime fooDate = DateTime.Now; Console.WriteLine(fooDate.ToString("hh:mm, dd MMM yyyy")); سلاسل المحارف الأصلية Verbatim String يمكنك استخدام العلامة @ أمام سلسلة محارف لتخليص جميع المحارف الموجودة في السلسلة string path = "C:\\Users\\User\\Desktop"; string verbatimPath = @"C:\Users\User\Desktop"; Console.WriteLine(path == verbatimPath); // => true يمكنك توزيع سلسلة محارف على أكثر من سطر بالرمز @ لتخليص العلامة " ضع مكانها "" (" مرتين) string bazString = @"Here's some stuff on a new line! ""Wow!"", the masses cried"; استخدم الكلمة المفتاحية const لجعل المتغيّر ثابتًا غير قابل للتعديل وتُحسب القيم الثابتة أثناء تصريف البرنامج compile time const int HoursWorkPerWeek = 9001; بنى البيانات المصفوفات - يبدأ العنصر الأول عند الترتيب 0 ويجب تحديد قياس المصفوفة عند تعريفها صيغة تعريف المصفوفة هي كالتالي: ;<datatype>[] <var name> = new <datatype>[<array size>] المصفوفة intArray في المثال التالي تحوي 10 أعداد int[] intArray = new int[10]; طريقة أخرى لتعريف مصفوفة وتهيئتها int[] y = { 9000, 1000, 1337 }; ترتيب عناصر المصفوفة - الوصول إلى عنصر Console.WriteLine("intArray @ 0: " + intArray[0]); المصفوفات قابلة للتعديل. intArray[1] = 1; القوائم تُستخدَم القوائم أكثر من المصفوفات لما توفّره من مرونة وصيغة تعريف قائمة هي على النحو التالي: ;List<datatype> <var name> = new List<datatype>() List<int> intList = new List<int>(); List<string> stringList = new List<string>(); List<int> z = new List<int> { 9000, 1000, 1337 }; // تحديد القيم الابتدائية لعناصر القائمة تُستخدَم الإشارتان <> للأنواع العميمة Generics - راجع فقرة ميزات رائعة ليست للقوائم قيم مبدئية ويجب أولا إضافة قيمة قبل إمكانية الوصول إلى العنصر intList.Add(1); Console.WriteLine("intList @ 0: " + intList[0]); بنى تحتية أخرى يجدر بك مراجعتها: قوائم الانتظار Queues/ الرصوص Stacks القواميس Dictionaries HashSet تجميعاـ القراءة فقط Read-only collections الأزواج المُرتّبة Tuples (الإصدار 4 من .NET. فما فوق) العوامل Console.WriteLine("\n→Operators"); int i1 = 1, i2 = 2; // اختصار لتعريف متغيّرات عدة في آن واحد العمليات الحسابية واضحة Console.WriteLine(i1 + i2 - i1 * 3 / 7); // => 3 المقياس Modulo Console.WriteLine("11%3 = " + (11 % 3)); // => 2 عوامل المقارنة Console.WriteLine("3 == 2? " + (3 == 2)); // => false Console.WriteLine("3 != 2? " + (3 != 2)); // => true Console.WriteLine("3 > 2? " + (3 > 2)); // => true Console.WriteLine("3 < 2? " + (3 < 2)); // => false Console.WriteLine("2 <= 2? " + (2 <= 2)); // => true Console.WriteLine("2 >= 2? " + (2 >= 2)); // => true عوامل المقارنة البتّية Bitwise ~ عامل التكملة الأحادي (إن كان البت يحوي 0 يحوله إلى 1، وإن كان يحوي واحد يحوّله إلى صفر) >> إزاحة البتات إلى اليسار << إزاحة البتات إلى اليمين & عامل “و” المنطقي ^ عامل “أو” المنطقي غير الشامل exclusive OR | عامل “أو” المنطقي الشامل inclusive OR التزايد Incrementation int i = 0; Console.WriteLine("\n->Inc/Dec-rementation"); Console.WriteLine(i++); //Prints "0", i = 1. تزاد بعدي Console.WriteLine(++i); //Prints "2", i = 2. تزايد قبلي Console.WriteLine(i--); //Prints "2", i = 1. تناقص بعدي Console.WriteLine(--i); //Prints "0", i = 0. تناقص قبلي بنى التحكّم Console.WriteLine("\n->Control Structures"); تتبع بنية التحكم if else طريقة كتابة بنى التحكم في C int j = 10; if (j == 10) { Console.WriteLine("I get printed"); } else if (j > 10) { Console.WriteLine("I don't"); } else { Console.WriteLine("I also don't"); } العوامل الثلاثية بنية تحكّم if else بسيطة تمكن كتابتها على النحو التالي: <condition> ? <true> : <false> int toCompare = 17; string isTrue = toCompare == 17 ? "True" : "False"; حلقة While التكرارية int fooWhile = 0; while (fooWhile < 100) { //تتكرّر الحلقة مئة مرة، من القيمة 0 إلى القيمة 99 fooWhile++; } حلقة Do.. While التكرارية int fooDoWhile = 0; do { الحلقة معدّة للتكرار مئة مرة، من القيمة 0 إلى القيمة 99 Start iteration 100 times, fooDoWhile 0->99 if (false) continue; // تجاوز التكريرة الحالية fooDoWhile++; if (fooDoWhile == 50) break; // توقيف الحلقة تماما، والخروج منها } while (fooDoWhile < 100); حلقة for التكرارية ذات الصيغة: (<for(<start_statement>; <conditional>; <step for (int fooFor = 0; fooFor < 10; fooFor++) { // تتكرّر الحلقة عشر مرات، من القيمة 0 إلى القيمة 9 } حلقة For Each يمكن استخدام حلقة التكرار foreach للمرور عبر أي كائن Object يُنفّذ الصنف IEnumerable أو <IEnumerable<T تنفّذ جميع الأنواع التجميعية (المصفوفات، القوائم، القواميس…) في إطار العمل .Net واجهة أو أكثر من الأصناف المذكورة (يمكن حذف ()ToCharArray من التعليمة أدناه، لأن String تنفّذ الواجهة IEnumerable) foreach (char character in "Hello World".ToCharArray()) { // تمرّ على جميع المحارف في السلسلة } تعليمة Switch تعمل Switch مع أنواع البيانات byte, short, char, وint تعمل كذلك مع أنواع البيانات Enum (نتعرّض لها أدناه)، الصنف String وبضعة أصناف خاصّة تغلّف أنواع بيانات أساسية: Character,Byte,Short, و Integer. int month = 3; string monthString; switch (month) { case 1: monthString = "January"; break; case 2: monthString = "February"; break; case 3: monthString = "March"; break; يمكن تنفيذ أكثر من إجراء في كل حالة case، إلا أنه لا يمكن إضافة إجراء ضمن حالة دون إضافة تعليمة توقيف break; قبل الحالة الموالية (إن أردت فعل هذا الأمر، فستحتاج لإضافة تعليمة goto case x بعد الإجراء) case 6: case 7: case 8: monthString = "Summer time!!"; break; default: monthString = "Some other month"; break; } التحويل بين أنواع البيانات وجبْر الأنواع Typecasting تحويل البيانات تحويل سلسلة محارف String إلى عدد Integer سيظهر استثناء Exception في حالة إخفاق عملية التحويل int.Parse("123");// نحصُل على النسخة العددية من سلسلة المحارف "123" عند استخدام الدالة TryParse لتحويل نوع البيانات فإن قيمة التحويل ستكون القيمة المبدئية لنوع البيانات وفي حالة الأعداد فإن القيمة المبدئية هي 0 int tryInt; if (int.TryParse("123", out tryInt)) // ترجع الدالة قيمة منطقية Console.WriteLine(tryInt); // 123 تحويل الأعداد إلى سلاسل محارف String يتضمّن الصنف Convert عددا من التوابع Methods لتسهيل التحويل Convert.ToString(123); أو tryInt.ToString(); جبر أنواع البيانات جبر العدد العشري 15 للحصول على قيمة من النوع int ثم جبر القيمة المُتحصَّل عليها ضمنيا لنحصُل على النوع long long x = (int) 15M; } الأصناف راجع التعريفات في آخر الملف public static void Classes() { انظر تعريف الكائنات في آخر الملف استخدم الكلمة المفتاحية new لاستهلال صنف Bicycle trek = new Bicycle(); استدعاء توابع الكائن trek.SpeedUp(3); // يجب دائما المرور عبر المعدّلات والمسترجعات Setter and getter methods trek.Cadence = 100; يُستخدم التابع ToString لعرض قيمة الكائن Console.WriteLine("trek info: " + trek.ToString()); استهلال كائن جديد من الصنف PennyFarthing PennyFarthing funbike = new PennyFarthing(1, 10); Console.WriteLine("funbike info: " + funbike.ToString()); Console.Read(); } // نهاية التابع الرئيس Main method مَدخل الكونسول Console entry. التطبيقات التي تعمل عبر الطرفية يجب أن يكون لديها مدخل عبارة عن تابع رئيس public static void Main(string[] args) { OtherInterestingFeatures(); } ميزات مثيرة للاهتمام التوقيعات المبدئية للتوابع public // مجال الرؤية static // يسمح بالاستدعاء المباشر من الصنف دون المرور بكائنات int // نوع البيانات المُرجَعة, MethodSignatures( int maxCount, // المتغيّر الأول عددي int count = 0, // القيمة المبدئية هي 0، تُستخدَم إن لم يُمرَّر متغير إلى التابع int another = 3, params string[] otherParams // يستقبل بقية المتغيّرات المُمررة إلى التابع جميعا ) { return -1; } يمكن أن تكون أسماء التوابع متطابقة، ما دامت التوقيعات مختلفة وكل تابع لا يختلف عن آخر سوى في نوع البيانات المُرجَع ليس وحيدا public static void MethodSignatures( ref int maxCount, // تمرير المعاملات حسب المرجع، وليس القيمة out int count) { المعامل المُمرر في المتغيّر count سيحوي القيمة 15 خارج هذه الدالة count = 15; // معامل الخروج out يجب أن يُسنَد قبل الانتهاء من التابع } أنواع البيانات العميمة Generics الأصناف TKey وTValue يحدّدها المستخدم الذي يستدعي هذه الدالة ويحاكي هذا التابع عمل SetDefault في بايثون public static TValue SetDefault<TKey, TValue>( IDictionary<TKey, TValue> dictionary, TKey key, TValue defaultItem) { TValue result; if (!dictionary.TryGetValue(key, out result)) return dictionary[key] = defaultItem; return result; } يمكنك تقييد الكائنات التي يمكن تمريرها إلى الدالة public static void IterateAndPrint<T>(T toPrint) where T: IEnumerable<int> { بما أن الصنف T ينفّذ IEnumerable فإنه يمكننا المرور على عناصره باستخدام foreach foreach (var item in toPrint) // العنصر هو من النوع int Console.WriteLine(item.ToString()); } الكلمة المفتاحية “yield” يدلّ استخدام yield أن التابع الذي تظهر فيه هذه الكلمة المفتاحية لديه خاصيّة التكرار (أي أنه يمكن استخدام التابع مع الحلقة foreach) public static IEnumerable<int> YieldCounter(int limit = 10) { for (var i = 0; i < limit; i++) yield return i; } نستطيع استدعاء التابع أعلاه على النحو التالي public static void PrintYieldCounterToConsole() { foreach (var counter in YieldCounter()) Console.WriteLine(counter); } يمكن استخدام yield return أكثر من مرّة في نفس التابع public static IEnumerable<int> ManyYieldCounter() { yield return 0; yield return 1; yield return 2; yield return 3; } كما يمكنك استخدام “yield break” لتوقيف التكرار التابع التالي يُرجِع نصف القيم الموجودة بين 0 وlimit public static IEnumerable<int> YieldCounterWithBreak(int limit = 10) { for (var i = 0; i < limit; i++) { if (i > limit/2) yield break; yield return i; } } public static void OtherInterestingFeatures() { المعاملات الاختيارية MethodSignatures(3, 1, 3, "Some", "Extra", "Strings"); MethodSignatures(3, another: 3); // تعيين قيمة المعامل مباشرة، مع تجاوز المعاملات الاختيارية تمرير المعاملات بالمرجع By reference، والقيمة المُرجعة Out parameter BY REF AND OUT PARAMETERS int maxCount = 0, count; // المعاملات المُمررة بالمرجع يجب أن تحوي قيمة MethodSignatures(ref maxCount, out count); توابع التمديد Extension methods int i = 3; i.Print(); // مُعرَّفة أدناه الأنواع التي تقبل قيمة فارغة Nullable types، مناسبة للتخاطب مع قواعد البيانات والقيم المُرجَعة وأي نوع بيانات قيمي (أي ليس صنفا) يمكن جعله يقبل قيما فارغة بكتابة ? بعده <type>? <var name> = <value> int? nullable = null; // اختصار لـ Nullable<int> Console.WriteLine("Nullable variable: " + nullable); bool hasValue = nullable.HasValue; // قيمة منطقية صحيحة true إن لم يكن يساوي null علامتا الاستفهام المتلاصقتان ?? هما اختصار لتحدد قيمة مبدئية في حال كان المتغيّر فارغا نعطيه 0 قيمة مبدئية int notNullable = nullable ?? 0; // 0 ?. هذه العلامة عي عامل للتحقّق من القيمة الفارغة null nullable?.Print(); // استخدم تابع التمديد Print() إذا كان المتغيّر nullable مختلفا عن null المتغيّرات ضمنية النوع - يمكنك ترك المُصرّف Compiler يحدّد نوع المتغيّر: var magic = "magic is a string, at compile time, so you still get type safety"; ;magic = 9 لن تُسنَد القيمة 9 إلى المتغيّر magic لأنه يحوي سلسلة محارف الأنواع العميمة var phonebook = new Dictionary<string, string>() { {"Sarah", "212 555 5555"} // إضافة عنوان إلى دفتر العناوين }; استدعاء الدالة SetDefault المُعرَّفة أعلاه Console.WriteLine(SetDefault<string,string>(phonebook, "Shaun", "No Phone")); // No Phone يمكنك عدم تحديد TKey و TValue بما أنه يمكن استنتاجهما تلقائيا Console.WriteLine(SetDefault(phonebook, "Sarah", "No Phone")); // 212 555 5555 الدوال مجهولة الاسم Lambda expressions - تتيح كتابة شفرات على نفس السطر Func<int, int> square = (x) => x * x; // آخر عنصر من T هو القيمة المُرجعة Console.WriteLine(square(3)); // 9 التعامل مع الأخطاء try { var funBike = PennyFarthing.CreateWithGears(6); لن تُنفَّذ لأن CreateWithGears تتسبّب في استثناء Exception string some = ""; if (true) some = null; some.ToLower(); // تتسبّب في الاستثناء NullReferenceException } catch (NotSupportedException) { Console.WriteLine("Not so much fun now!"); } catch (Exception ex) // التقاط جميع الاستثناءات الأخرى { throw new ApplicationException("It hit the fan", ex); // throw; // التقاط آخر يحافظ على ركام النداء callstack } // catch { } // التقاط كل شيء دون التعامل مع الاستثناءات finally { // try أو catch تُنفّذ بعد } إدارة الموارد يمكنك إدارة الموارد المتوفّرة بسهولة حيث تنفّذ أغلب الكائنات التي تستعمل الموارد غير المستغلة (الملفات، سياق الأجهزة الطرفية، …إلخ) تُنفّذ الواجهة IDisposable تتولّى التعليمة using التخلّص من كائنات IDisposable using (StreamWriter writer = new StreamWriter("log.txt")) { writer.WriteLine("Nothing suspicious here"); } يُتخلَّص من جميع الموارد بعد الانتهاء من تنفيذ هذه الشفرة حتى ولو تسبّبت في استثناء البرمجة المتوازية var words = new List<string> {"dog", "cat", "horse", "pony"}; Parallel.ForEach(words, new ParallelOptions() { MaxDegreeOfParallelism = 4 }, word => { Console.WriteLine(word); } ); تشغيل هذه الشفرة سينتُج عنه مُخرجات متعدّدة لأن كلّ تشعّب thread يُكمل في وقت مختلف عن الآخر. أدناه أمثلة على المُخرجات cat dog horse pony dog horse pony cat الكائنات الديناميكية (رائعة للعمل مع لغات برمجة أخرى) dynamic student = new ExpandoObject(); student.FirstName = "First Name"; لا تحتاج لتعريف صنف أولا بل إنه يمكنك إضافة توابع (يُرجع التابع أدناه سلسلة محارف ويتلقّى سلسلة محارف) student.Introduce = new Func<string, string>( (introduceTo) => string.Format("Hey {0}, this is {1}", student.FirstName, introduceTo)); Console.WriteLine(student.Introduce("Beth")); تنفّذ أغلب التجميعات Collections الواجهة <IQUERYABLE<T التي توفّر الكثير من التوابع المفيدة var bikes = new List<Bicycle>(); // دراجات هوائية bikes.Sort(); // يرتّب القائمة bikes.Sort((b1, b2) => b1.Wheels.CompareTo(b2.Wheels)); // يرتّب القائمة بناءً على عدد العجلات var result = bikes .Where(b => b.Wheels > 3) // الترشيج والفلترة .Where(b => b.IsBroken && b.HasTassles) .Select(b => b.ToString()); // var sum = bikes.Sum(b => b.Wheels); يجمع عدد العجلات في كامل القائمة وينشئ قائمة من الكائنات الضمنية Implicit objects بالاعتماد على بعض خواص الدراجة الهوائية var bikeSummaries = bikes.Select(b=>new { Name = b.Name, IsAwesome = !b.IsBroken && b.HasTassles }); من الصعب توضيح الأمر هنا، إلا أنك تحصُل على نوع البيانات قبل الانتهاء من التعليمات، إذ أن المصرّف يمكنه العمل ضمنا على الأنواع أعلاه foreach (var bikeSummary in bikeSummaries.Where(b => b.IsAwesome)) Console.WriteLine(bikeSummary.Name); التوازي مع ASPARALLEL نخلط عمليّات LINQ والعمليّات المتوازية var threeWheelers = bikes.AsParallel().Where(b => b.Wheels == 3).Select(b => b.Name); سيحدث الأمر بالتوازي. تُنشَأ التشعبات تلقائيا وستُقسَّم النتائج بينها طريقة رائعة للعمل مع مجموعة بيانات ضخمة إن كانت لديك الكثير من الأنوية Cores LINQ تربط بين مخزن بيانات وكائنات من الصنف <IQueryable<T مثلا: LinqToSql تربط الكائنات مع قاعدة بيانات، LinqToXml تربط الكائنات مع مستند XML var db = new BikeRepository(); يؤجَّل التنفيذ، وهو أمر جيّد عند التعامل مع قواعد البيانات var filter = db.Bikes.Where(b => b.HasTassles); // no query run if (42 > 6) // يمكنك الاستمرار في إضافة المرشحات، حتى تلك المشروطة؛ مناسبة لميزة "البحث المتقدّم" filter = filter.Where(b => b.IsBroken); // no query run var query = filter .OrderBy(b => b.Wheels) .ThenBy(b => b.Name) .Select(b => b.Name); // still no query run يعمل الاستعلام الآن، إلا أنك لا تحصُل على نتائج الاستعلام إلا عند المرور عليها foreach (string bike in query) Console.WriteLine(result); } } // نهاية الصنف LearnCSharp يمكنك إضافة أصناف أخرى في ملف cs. public static class Extensions { توابع الصنف Extensions public static void Print(this object obj) { Console.WriteLine(obj.ToString()); } } التفويض والأحداث public class DelegateTest { public static int count = 0; public static int Increment() { // زيادة العدّاد ثم إرجاع النتيجة return ++count; } التفويض delegate هو مرجع لتابع لجعل مرجع على التابع Increment نبدأ بتعريف تفويض بنفس التوقيع أي أنه لا يأخذ أية معطيات ويُرجع عددا من النوع int public delegate int IncrementDelegate(); يمكن أيضا استخدام حدث Event لتحريك التفويض أنشئ حدثا بنوع التفويض public static event IncrementDelegate MyEvent; static void Main(string[] args) { نحيل إلى التابع Increment باستهلال التفويض وتمرير معطى هو التابع نفسه IncrementDelegate inc = new IncrementDelegate(Increment); Console.WriteLine(inc()); // => 1 يمكن تركيب التفويضات بالعامل + IncrementDelegate composedInc = inc; composedInc += inc; composedInc += inc; سينفّذ التفويض composedInc التابع Increment ثلاث مرات Console.WriteLine(composedInc()); // => 4 الاشتراك في الحدث باستخدام التفويض MyEvent += new IncrementDelegate(Increment); MyEvent += new IncrementDelegate(Increment); تحريك الحدث، أي تنفيذ كل التفويضات المشترِكة في هذا الحدث Console.WriteLine(MyEvent()); // => 6 } } صيغة تعريف صنف: <public/private/protected/internal> class <class name>{` // حقول البيانات، المشيّدات، الدوالّ.. كلّها في الداخل //تُستدعى الدوال بنفس طريقة استدعاء التوابع في جافا } public class Bicycle { // حقول/متغيّرات صنف الدراجات الهوائية Bicycle public int Cadence // عمومي public : يمكن استدعاء من أي مكان { get // مسترجع - نعرّف تابعا للوصول إلى قيمة خاصيّة من الكائن { return _cadence; } set // معدّل - نعرّف تابعا لتعيين قيمة خاصيّة { _cadence = value; // القيمة value هي المعطى المُمرّر إلى المعدّل } } private int _cadence; protected virtual int Gear // يمكن استدعاءه فقط من هذا الصنف أو الأصناف المتفرّعة منه Protected:محميّ { get; // تُنشأ خاصيّة تلقائية بحيث لا تحتاج لإضافة حقل بيانات set; } internal int Wheels // داخليّ Internal: يُمكن الوصول إليه من نفس الملف التنفيذي { get; private set; // يمكن تغيير مجال المسترجعات والمعدّلات } int _speed; // ولا يمكن الوصول إليها إلا من داخل الصنف Private كل الخاصيّات هي مبدئيا خاصّة // يمكن أيضا استخدام الكلمة المفتاحية private public string Name { get; set; } للخاصيّات صياغة استثنائية عندما نريد خاصية متاحة للقراءة فقط بمعنى أنها تعيد فقط نتيجة عبارة public string LongName => Name + " " + _speed + " speed"; النوع enum هو نوع بيانات قيمية يتمثّل في مجموعة من المتغيّرات ثابتة القيمة هذا النوع هو في الواقع مجرّد ربط اسم بقيمة (عددية، إن لم يحدد نوع آخر) أنواع البيانات الموثوقة في قيم الثوابت هي byte, sbyte, short, ushort, int, uint, long, و ulong ولا يمكن أن توجد نفس القيمة مرتين في متغيّر من النوع enum public enum BikeBrand { AIST, BMC, Electra = 42, // مباشرة enum يمكن تعيين قيمة المتغيّر في Gitane // 43 } عرّفنا هذا النوع داخل الصنف Bicycle لذا فهو نوع داخلي وعندما نريد استخدامه خارج الصنف فسيتوجّب أن نكتُب Bicycle.Brand public BikeBrand Brand; بعد تعريف نوع enum يصبح بإمكاننا تعريف متغيّر من هذا النوع تستطيع التعليم على وجود قيم عدّة يمكن الاختيار بينها بإضافة الصنف FlagsAttribute قبل تعريف النوع enum يمكن استخدام أي صنف متفرّع عن الصنف Attribute لتعليم أنواع البيانات، التوابع والمعاملات…إلخ يمكن استخدام العوامل المنطقية & و | لإجراء عمليّات منطقية داخل القيمة [Flags] public enum BikeAccessories { None = 0, Bell = 1, MudGuards = 2, // نحتاج لتعيين القيم يدويا Racks = 4, Lights = 8, FullPackage = Bell | MudGuards | Racks | Lights } الاستخدام: aBike.Accessories.HasFlag(Bicycle.BikeAccessories.Bell) في الإصدارات السابقة على الإصدار الرابع من إطار العمل NET (aBike.Accessories & Bicycle.BikeAccessories.Bell) == Bicycle.BikeAccessories.Bell public BikeAccessories Accessories { get; set; } تنتمي الخاصيّات المُعلمة بالكلمة المفتاحية static للصنف نفسه، وليس لكائن عكس بقية الخاصيّات يمكن الوصول إلى هذه الخاصيّات دون الرجوع إلى كائن محدّد ;Console.WriteLine("Bicycles created: " + Bicycle.bicyclesCreated) public static int BicyclesCreated { get; set; } عيّن القيم غير القابلة للتعديل أثناء التشغيل ولا يمكن إسناده إلا عند تعريفها أو داخل مشيّد readonly bool _hasCardsInSpokes = false; // خاصيّة خاصّة وللقراءة فقط المشيّدات Constructors هي طريقة لإنشاء الأصناف أدناه المشيّد المبدئي public Bicycle() { this.Gear = 1; // يمكن الوصول إلى خاصيّات الصنف بالكلمة المفتاحية this Cadence = 50; // إلا أنك لا تحتاجها في كل الحالات _speed = 5; Name = "Bontrager"; Brand = BikeBrand.AIST; BicyclesCreated++; } هذا مشيّد مُعيّن (يحوي معطيات) public Bicycle(int startCadence, int startSpeed, int startGear, string name, bool hasCardsInSpokes, BikeBrand brand) : base() // أولا base يستدعي { Gear = startGear; Cadence = startCadence; _speed = startSpeed; Name = name; _hasCardsInSpokes = hasCardsInSpokes; Brand = brand; } يمكن وضع المشيّدات بالتسلسل public Bicycle(int startCadence, int startSpeed, BikeBrand brand) : this(startCadence, startSpeed, 0, "big wheels", true, brand) { } صيغة كتابة الدوال (<public/private/protected> <return type> <function name> <args>) يمكن للأصناف أن تعيّن مسترجعات ومعدّلات لحقولها كما يمكنها تنفيذ الخاصيّات عبر دوال (وهي الطريقة المفضّلة في Csharp) ويمكن لمعاملات التابع أن تحوي قيما مبدئية، في هذه الحالة، يمكن استدعاء التوابع بدون تمرير معطيات عن هذه العوامل public void SpeedUp(int increment = 1) { _speed += increment; } public void SlowDown(int decrement = 1) { _speed -= decrement; } تعيّن الخاصيّات القيم وتسترجعها. إن كان غرضك الوصول إلى البيانات فقط دون تعديلها فالخاصيّات أنسب. يمكن أن يكون للخاصيّة مسترجع أو معدّل أو كلاهما private bool _hasTassles; // متغيّر خاص public bool HasTassles // مسترجع عام { get { return _hasTassles; } set { _hasTassles = value; } } كما يمكنك تعريف خاصيّة تلقائية في سطر واحد ستُنشئ هذه الصيغة حقلا داعما تلقائيا يمكنك الحد من مجال الرؤية على المسترجع أو المعدّل أو كليهما public bool IsBroken { get; private set; } يمكن للخاصيّات أن تكون تلقائية التنفيذ public int FrameSize { get; // يمكنك الحد من مجال الرؤية على المسترجع أو المعدّل //Framesize يمكنه استدعاء معدّل Bicycle يعني هذا أن الصنف private set; } يمكن تعريف فهرس على الكائنات يمكنك مثلا كتابة bicycle[0] التي ترجع القيمة “chris” للحصول على أول راكب أو كتابة “bicycle[1] = "lisa لتعيين الراكب الثاني (دراجة رباعية المقاعد!) private string[] passengers = { "chris", "phil", "darren", "regina" }; public string this[int i] { get { return passengers[i]; } set { passengers[i] = value; } } تابع لعرض قيم حقول الكائن public virtual string Info() { return "Gear: " + Gear + " Cadence: " + Cadence + " Speed: " + _speed + " Name: " + Name + " Cards in Spokes: " + (_hasCardsInSpokes ? "yes" : "no") + "\n------------------------------\n" ; } يمكن للتوابع أن تكون ثابتة (الكلمة المفتاحية static). مناسبة للدوال المساعدة public static bool DidWeCreateEnoughBicycles() { داخل التابع الثابت لا يمكن إجراء عمليات سوى على الحقول الثابتة return BicyclesCreated > 9000; } إن كان الصنف لا يحتاج إلا إلى حقول ثابتة فربما يكون من الأفضل أن يكون الصنف نفسه ثابتا } // نهاية الصنف Bicycle PennyFarthing هو صنف متفرّع من الصنف Bicycle class PennyFarthing : Bicycle { (يمثّل هذا الصنف تلك الدراجات الهوائية التي لديها عجلة أمامية كبيرة جدا، وليست لديها مسنّنات Gears لتعديل السرعة) . نستدعي مشيّد الصنف الأب public PennyFarthing(int startCadence, int startSpeed) : base(startCadence, startSpeed, 0, "PennyFarthing", true, BikeBrand.Electra) { } protected override int Gear { get { return 0; } set { throw new InvalidOperationException("You can't change gears on a PennyFarthing"); } } public static PennyFarthing CreateWithGears(int gears) { var penny = new PennyFarthing(1, 1); // عمليا لا توجد دراجة من نوع PennyFarthing بمسنّنات penny.Gear = gears; return penny; } public override string Info() { string result = "PennyFarthing bicycle "; result += base.ToString(); // نستدعي التابع الأصلي الموجود في الصنف الأب return result; } } تحتوي الواجهات على التوقيعات فقط interface IJumpable { void Jump(int meters); // جميع الأعضاء في الواجهة هي مبدئيا عمومية } interface IBreakable { bool Broken { get; } // يمكن للواجهات أن تحوي خاصيّات كما يمكنها أن تتضمّن واجهات وأحداثا } يمكن للأصناف أن ترث Inherit من صنف واحد آخر على الأكثر، إلا أنه يمكنها تنفيذ أي عدد من الواجهات ويجب أن يكون الصنف الأب الأول في لائحة الأصناف تليه الواجهات كلّها class MountainBike : Bicycle, IJumpable, IBreakable { int damage = 0; public void Jump(int meters) { damage += meters; } public bool Broken { get { return damage > 100; } } } صنف للاتصال بقاعدة البيانات، نستخدمه مثالا لعمل LinqToSql يعمل إطار العمل EntityFramework Code First لربط الكائنات بسجلات جداول البيانات (بنفس طريقة ActiveRecord في روبي، إلا أنه ثنائي الاتجاه) public class BikeRepository : DbContext { public BikeRepository() : base() { } public DbSet<Bicycle> Bikes { get; set; } } يمكن تقسيم الأصناف على ملفات cs. عدّة A1.cs public partial class A { public static void A1() { Console.WriteLine("Method A1 in class A"); } } A2.cs public partial class A { public static void A2() { Console.WriteLine("Method A2 in class A"); } } يستخدم الصنف Program أدناه الصنف A المُقسّم على ملفي cs. Program using the partial class "A" public class Program { static void Main() { A.A1(); A.A2(); } } يمكن الإداراج في سلاسل المحارف String interpolation بكتابة $ أمام السلسلة ثم إحاطة المتغيّر المُدرج بقوسين معكوفين { }. يمكنك أيضا تجميع السلسلتين، الأصلية والمُعدّلة، بالعلامة @ public class Rectangle { public int Length { get; set; } public int Width { get; set; } } class Program { static void Main(string[] args) { Rectangle rect = new Rectangle { Length = 5, Width = 3 }; Console.WriteLine($"The length is {rect.Length} and the width is {rect.Width}"); string username = "User"; Console.WriteLine([email protected]"C:\Users\{username}\Desktop"); } } ميزات جديدة في الإصدار C# 6 class GlassBall : IJumpable, IBreakable { تمهيد الخاصيّات التلقائية public int Damage { get; private set; } = 0; تمهيد الخاصيّات التلقائية المقتصرة على المسترجعات public string Name { get; } = "Glass ball"; تمهيد الخاصيّات التلقائية المقتصرة على المسترجعات في المشيّد public string GenieName { get; } public GlassBall(string genieName = null) { GenieName = genieName; } public void Jump(int meters) { if (meters < 0) العبارة nameof() مستحدثة وينتُج عنها التحقّق من وجود المعرّف "nameof(x) == "x تحول على سبيل المثال دون بقاء أسماء المتغيّرات القديمة في رسائل الخطأ بعد تحديثها throw new ArgumentException("Cannot jump negative amount!", nameof(meters)); Damage += meters; } الخاصيّات المعرَّفة ضمن هيكل العبارة public bool Broken => Damage > 100; نفس الشيء بالنسبة للتوابع public override string ToString() // سلسلة محارف تُدرج ضمنها متغيّرات => $"{Name}. Damage taken: {Damage}"; public string SummonGenie() العوامل المشترطة بالقيمة الفارغة null ترجع العبارة x?.y القيمة null بمجرد كون x مساوية ل null، بدون تقييم y => GenieName?.ToUpper(); } static class MagicService { private static bool LogException(Exception ex) { /* سجّل الاستثناءات في مكان ما */ log exception somewhere */ return false; } public static bool CastSpell(string spell) { try { // API نفترض هنا أننا نستدعي واجهة تطبيقات برمجية throw new MagicServiceException("Spell failed", 42); // نجح الاستدعاء return true; } يلتقط استثناء في حالة إخفاق استدعاء واجهة التطبيقات، أي أن قيمة Code تساوي 42 Only catch if Code is 42 i.e. spell failed catch(MagicServiceException ex) when (ex.Code == 42) { // أخفق الاستدعاء return false; } استثماءات أخرى أو الاستثناء MagicServiceException عندما تكون قيمة المتغير Code مختلفة عن 42 catch(Exception ex) when (LogException(ex)) { // لا يصل التنفيذ إلى هذه الكتلة } return false; } لاحظ أن التقاط الاستثناء MagicServiceException وإعادة إطلاقه عندما يكون المتغير Code لا يساوي القيمة 42 أو 117 هو أمر مختلف، إذ أن كتلة catch-all الأخيرة لن تلتقط الاستثناء المُعاد public class MagicServiceException : Exception { public int Code { get; } public MagicServiceException(string message, int code) : base(message) { Code = code; } } الخاصية Obsolete public static class PragmaWarning { [Obsolete("Use NewMethod instead", false)] public static void ObsoleteMethod() { /*شفرة برمجية قديمة هنا */ } public static void NewMethod() { /* شفرة برمجية جديدة */ } public static void Main() { ObsoleteMethod(); تحذير يظهر عند استخدام شفرة برمجية قديمة، ناتج عن الوسم Obsolete أعلاه CS0618: 'ObsoleteMethod is obsolete: Use NewMethod instead' تعطّل التعليمة التالية إظهار التحذير السابق #pragma warning disable CS0618 ObsoleteMethod(); // لا تحذير #pragma warning restore CS0618 ObsoleteMethod(); // CS0618: 'ObsoleteMethod is obsolete: Use NewMethod instead' } } } // نهاية فضاء الأسماء using System; ميزة في C# 6: إمكانية استخدام static مع using using static System.Math; namespace Learning.More.CSharp { class StaticUsing { static void Main() { // using مع static بدون استخدام Console.WriteLine("The square root of 4 is {}.", Math.Sqrt(4)); // using مع static باستخدام Console.WriteLine("The square root of 4 is {}.", Sqrt(4)); } } } ميزة جديدة في C# 7 ثبّت آخر إصدار من Microsoft.Net.Compilers باستخدام Nuget ثبّت آخر إصدار من System.ValueTuple باستخدام Nuget using System; namespace Csharp7 { الأزواج المرتبة Tuples، التفكيك DECONSTRUCTION والإلغاءات Discards class TuplesTest { public (string, string) GetName() { // Item1، Item2 .... تُسمى الحقول في الأزواج المرتبة مبدئيا بـ var names1 = ("Peter", "Parker"); Console.WriteLine(names1.Item2); // => Parker يمكن تخصيص أسماء الحقول تعريف النوع الأول (string FirstName, string LastName) names2 = ("Peter", "Parker"); تعريف النوع الثاني var names3 = (First:"Peter", Last:"Parker"); Console.WriteLine(names2.FirstName); // => Peter Console.WriteLine(names3.Last); // => Parker return names3; } public string GetLastName() { var fullName = GetName(); يمكن تفكيك الأزواج المرتبة (string firstName, string lastName) = fullName; يمكن إلغاء حقول من الزوج المرتب بعد تفكيكه بالعلامة _ Fields in a deconstructed tuple can be discarded by using _ var (_, last) = fullName; return last; } يمكن تفكيك أي نوع بيانات على نفس المنوال باستخدام التابع Deconstruct public int randomNumber = 4; public int anotherRandomNumber = 10; public void Deconstruct(out int randomNumber, out int anotherRandomNumber) { randomNumber = this.randomNumber; anotherRandomNumber = this.anotherRandomNumber; } static void Main(string[] args) { var tt = new TuplesTest(); (int num1, int num2) = tt; Console.WriteLine($"num1: {num1}, num2: {num2}"); // => num1: 4, num2: 10 Console.WriteLine(tt.GetLastName()); } } مطابقة الأنماط Pattern matching class PatternMatchingTest { public static (string, int)? CreateLogMessage(object data) { switch(data) { // when ترشيح إضافي باستخدام case System.Net.Http.HttpRequestException h when h.Message.Contains("404"): return (h.Message, 404); case System.Net.Http.HttpRequestException h when h.Message.Contains("400"): return (h.Message, 400); case Exception e: return (e.Message, 500); case string s: return (s, s.Contains("Error") ? 500 : 200); case null: return null; default: return (data.ToString(), 500); } } } الإحالة إلى الموارد المحلية Reference locals تعطيك إمكانية إرجاع مرجع Reference كائن بدلا من قيمته class RefLocalsTest { لاحظ الكلمة المفتاحية ref في تعليمة الإرجاع return public static ref string FindItem(string[] arr, string el) { for(int i=0; i<arr.Length; i++) { if(arr[i] == el) { // إرجاع المرجع return ref arr[i]; } } throw new Exception("Item not found"); } public static void SomeMethod() { string[] arr = {"this", "is", "an", "array"}; //في كل مكان ref لاحظ ref string item = ref FindItem(arr, "array"); item = "apple"; Console.WriteLine(arr[3]); // => apple } } الدوال المحليّة Local functions class LocalFunctionTest { private static int _id = 0; public int id; public LocalFunctionTest() { id = generateId(); لا يمكن الوصول إلى الدالة المحلية خارج هذا المجال int generateId() { return _id++; } } public static void AnotherMethod() { var lf1 = new LocalFunctionTest(); var lf2 = new LocalFunctionTest(); Console.WriteLine($"{lf1.id}, {lf2.id}"); // => 0, 1 int id = generateId(); // خطأ // error CS0103: The name 'generateId' does not exist in the current context } } } ترجمة -وبتصرّف- للمقال Learn C# in Y Minutes
    1 نقطة
  45. بايثون لغةٌ برمجة كائنية (object-oriented programming language). تركز البرمجة الكائنية (OOP) على كتابة شيفرات قابلة لإعادة الاستخدام، على عكس البرمجة الإجرائية (procedural programming) التي تركز على كتابة تعليمات صريحة ومتسلسلة. تتيح البرمجة الكائنية لمبرمجي بايثون كتابة شيفرات سهلة القراءة والصيانة، وهذا مفيد للغاية عند تطوير البرامج المُعقَّدة. التمييز بين الأصناف والكائنات أحدُ المفاهيم الأساسية في البرمجة الكائنية، ويوضح التعريفان التاليان الفرق بين المفهومين: الصنف - نموذج عام تُنسج على منواله كائنات يُنشِئها المبرمج. يُعرِّف الصنف مجموعةً من الخاصيات التي تميز أي كائن يُستنسَخ (instantiated) منه. الكائن - نسخةٌ (instance) من الصنف، فهو تجسيد عملي للصنف داخل البرنامج. تُستخدَم الأصناف لإنشاء أنماط، ثم تُستعمَل تلك الأنماط لإنشاء كائنات منها. ستتعلم في هذا الدرس كيفيَّة إنشاء الأصناف والكائنات، وتهيئة الخاصيات باستخدام تابعٍ بانٍ (constructor method)، والعمل على أكثر من كائن من نفس الصنف. الأصناف الأصناف هي نماذج عامة تُستخدم لإنشاء كائنات وسبق أن عرَّفناها آنفًا. تُنشَأ الأصناف باستخدام الكلمة المفتاحية ‎class‎، بشكل مشابه [لتعريف الدوال](رابط المقالة 34) الذي يكون باستخدام الكلمة المفتاحية ‎def‎. دعنا نعرّف صنفًا يسمى ‎Shark‎، ونجعل له تابعين مرتبطين به، swim و be_awesome: class Shark: def swim(self): print("The shark is swimming.") def be_awesome(self): print("The shark is being awesome.") تُسمَّى مثل هذه الدوال «توابعًا» (methods) لأنهما معرفتان داخل الصنف ‎Shark‎؛ أي أنهما دالتان تابعتان للصنف ‎Shark‎. الوسيط الأول لهاتَين الدالتين هو ‎self‎، وهو مرجع إلى الكائنات التي يتم بناؤها من هذا الصنف. للإشارة إلى نُسخ (أو كائنات) من الصنف، يوضع ‎self‎ دائمًا في البداية، لكن يمكن أن تكون معه وسائط أخرى. لا يؤدي تعريف الصنف ‎Shark‎ إلى إنشاء كائنات منه، وإنما يعرّف فقط النمط العام لتلك الكائنات، والتي يمكننا تعريفها لاحقًا. لذا، إذا نفّذت البرنامج أعلاه الآن، فلن يُعاد أي شيء. الكائنات الكائن هو نسخةٌ (instance) من صنف. ويمكن أن نأخذ الصنف ‎Shark‎ المُعرَّف أعلاه، ونستخدمه لإنشاء كائن يعدُّ نسخةً منه. سننشئ كائنًا ‎Shark‎ يسمى ‎sammy‎: sammy = Shark() لقد أحلنا على الكائن ‎sammy‎ ناتج الباني ‎Shark()‎، والذي يعيد نسخةً من الصنف. سنستخدم في الشيفرة التالية التابعين الخاصين بالكائن ‎sammy‎: sammy = Shark() sammy.swim() sammy.be_awesome() يستخدم الكائن ‎sammy‎ التابعين ‎swim()‎ و ‎be_awesome()‎، وقد استدعينَاهما باستعمال المعامل النقطي (‎.‎)، والذي يُستخدم للإشارة إلى خاصيات أو توابع الكائنات. في هذه الحالة، استدعينا تابعًا، لذلك استعملنا قوسين مثلما نفعل عند استدعاء دالة. الكلمة ‎self‎ هي معامل يُمرّر إلى توابع الصنف ‎Shark‎، في المثال أعلاه، يمثّل ‎self‎ الكائن ‎sammy‎. يتيح المعامل ‎self‎ للتوابع الوصول إلى خاصيات الكائن الذي استُدعيت معه. لاحظ أننا لم نمرر شيئًا داخل القوسين عند استدعاء التابع أعلاه، ذلك أنّ الكائن ‎sammy‎ يُمرّر تلقائيًا مع العامل النقطي. البرنامج التالي يوضح لنا الأمر: class Shark: def swim(self): print("The shark is swimming.") def be_awesome(self): print("The shark is being awesome.") def main(): sammy = Shark() sammy.swim() sammy.be_awesome() if __name__ == "__main__": main() لننفذ البرنامج لنرى ما سيحدث: python shark.py ستُطبع المخرجات التالية: The shark is swimming. The shark is being awesome. في الشيفرة أعلاه، استدعى الكائن ‎sammy‎ التابعين ‎swim()‎ و ‎be_awesome()‎ في الدالة الرئيسية ‎main()‎. الباني يٌستخدم الباني (Constructor Method) لتهيئة البيانات الأولية، ويُنفَّذ لحظة إنشاء الكائن. في تعريف الصنف، يأخذ الباني الاسم ‎__init__‎، وهو أول تابع يُعرّف في الصنف، ويبدو كما يلي: class Shark: def __init__(self): print("This is the constructor method.") إذا أضفت التابع ‎__init__‎ إلى الصنف ‎Shark‎ في البرنامج أعلاه، فسيَطبع البرنامجُ المخرجات التالية: This is the constructor method. The shark is swimming. The shark is being awesome. يُنفَّذ الباني تلقائيًا، لذا يستخدمه مطورو بايثون لتهيئة أصنافهم. سنُعدِّل الباني أعلاه، ونجعله يستخدم متغيرًا اسمه ‎name‎ سيمثّل اسم الكائن. في الشيفرة التالية، سيكون المتغير ‎name‎ المعامل المُمرَّر إلى الباني، ونحيل قيمته إلى الخاصية ‎self.name‎: class Shark: def __init__(self, name): self.name = name بعد ذلك، يمكننا تعديل السلاسل النصية في دوالنا للإشارة إلى اسم الصنف، على النحو التالي: class Shark: def __init__(self, name): self.name = name def swim(self): # الإشارة إلى الاسم print(self.name + " is swimming.") def be_awesome(self): # الإشارة إلى الاسم print(self.name + " is being awesome.") أخيرًا، يمكننا تعيين اسم الكائن ‎sammy‎ عند القيمة ‎"Sammy"‎ (أي قيمة الخاصية name) بتمريره إلى ‎Shark()‎ عند إنشائه: class Shark: def __init__(self, name): self.name = name def swim(self): print(self.name + " is swimming.") def be_awesome(self): print(self.name + " is being awesome.") def main(): # Shark تعيين اسم كائن sammy = Shark("Sammy") sammy.swim() sammy.be_awesome() if __name__ == "__main__": main() عرّفنا التابع ‎__init__‎، والذي يقبل مُعاملين ‎self‎ و name (تذكر أن المعامل ‎self‎ يُمرر تلقائيا إلى التابع)، ثم عرّفنا متغيرًا فيه. عند تنفيذ البرنامج: python shark.py سنحصل على: Sammy is swimming. Sammy is being awesome. لقد طُبع الاسم الذي مرّرناه إلى الكائن. ونظرًا لأنّ الباني يُنفّذ تلقائيًا، فلست بحاجة إلى استدعائه بشكل صريح، فيكفي تمرير الوسائط بين القوسين التاليين لاسم الصنف عند إنشاء نسخة جديدة منه. إذا أردت إضافة معامل آخر، مثل ‎age‎، فيمكن ذلك عبر تمريره إلى التابع ‎__init__‎: class Shark: def __init__(self, name, age): self.name = name self.age = age عند إنشاء الكائن ‎sammy‎، سنمرر عُمره أيضًا بالإضافة إلى اسمه: sammy = Shark("Sammy", 5) إذًا، تتيح البانيات تهيئة خاصيات الكائن لحظة إنشائه. العمل مع عدة كائنات تتيح لنا الأصناف إنشاء العديد من الكائنات المتماثلة التي تتبع نفس النمط. لتفهم ذلك بشكل أفضل، دعنا نضيف كائنًا آخر من الصنف ‎Shark‎ إلى برنامجنا: class Shark: def __init__(self, name): self.name = name def swim(self): print(self.name + " is swimming.") def be_awesome(self): print(self.name + " is being awesome.") def main(): sammy = Shark("Sammy") sammy.be_awesome() stevie = Shark("Stevie") stevie.swim() if __name__ == "__main__": main() لقد أنشأنا كائنًا ثانيًا من الصنف ‎Shark‎ يسمى ‎stevie‎، ومرّرنا إليه الاسم ‎"Stevie"‎. في هذا المثال، استدعينا التابع ‎be_awesome()‎ مع الكائن ‎sammy‎، والتابع ‎swim()‎ مع الكائن ‎stevie‎. لننفذ البرنامج: python shark.py سنحصل على المخرجات التالية: Sammy is being awesome. Stevie is swimming. يبدو ظاهرًا في المخرجات أننا نستخدم كائنين مختلفين، الكائن ‎sammy‎ والكائن ‎stevie‎، وكلاهما من الصنف ‎Shark‎. تتيح لنا الأصناف إنشاء عدة كائنات تتبع كلها نفس النمط دون الحاجة إلى بناء كل واحد منها من البداية. خلاصة تطرَّقنا في هذا الدرس إلى عِدَّة مفاهيم، مثل إنشاء الأصناف، وإنشاء الكائنات، وتهيئة الخاصيات باستخدام البانيات، والعمل مع أكثر من كائن من نفس الصنف. تُعدُّ البرمجة الكائنية أحد المفاهيم الضرورية التي ينبغي أن يتعلمها كل مبرمجي بايثون، لأنها تساعد على كتابة شيفرات قابلة لإعادة الاستخدام، إذ أنَّ الكائنات التي تُنشَأ في برنامج ما يمكن استخدامها في برامج أخرى. كما أنّ البرامج الكائنية عادة ما تكون أوضح وأكثر مقروئية، خصوصًا في البرامج المعقدة التي تتطلب تخطيطًا دقيقًا، وهذا بدوره يسهل صيانة البرامج مستقبلًا. هذه المقالة جزء من سلسة مقالات حول تعلم البرمجة في بايثون 3. ترجمة -وبتصرّف- للمقال How To Construct Classes and Define Objects in Python 3 لصاحبته Lisa Tagliaferri اقرأ أيضًا المقالة التالية: فهم متغيرات الأصناف والنسخ في بايثون 3 المقالة السابقة: كيفية استخدام ‎args و ‎*kwargs في بايثون 3 المرجع الشامل إلى تعلم لغة بايثون كتاب البرمجة بلغة بايثون
    1 نقطة
  46. يمثّل كلٌّ من الضّغط والتّصغيرأمرًا تقوم بتنفيذه على الأصول الموجودة في موقعك (مثل ملفات css. وملفات js.). تستطيع من خلال كِلَيهما تقليص حجم الملف وبالتّالي جعلَه أكثر فعاليّةً في عبور الشبكة بين الخواديم والمتصفّحات. بكلمات أخرى، يصبح الأداء أفضل بتقليص حجم أصولك. تمثّل الشبكة نقطةَ اختناقٍ لسرعة الويب. لهذا السّبب، يساعد تخفيض حجم الملف وتقليصه في تفادي تحميل عبء زائد على الشّبكة. لكنّهما - أي الضغط والتصغير - يختلفان عن بعضهما بوضوح. إن كنت لا تعرف هذا بالفعل، فالأمر يستحق الاطّلاع. يقوم التّصغير بأمورٍ مثل حذف الفواصل، وحذف التّعليقات، وحذف الفواصل المنقوطة غير الضّروريّة وتقليل طول الرّموز السّت عشريّة وغيرها من الأمور المشابهة. يبقى الملف شيفرةً صالحةً تمامًا. لن ترغبَ في محاولة قراءتها أو العمل عليها، لكنها لا تخرق أيًّا من القواعد. يستطيع المتصفّح قراءتها واستخدامها كما هو الحال في الملف الأصليّ. يُنشئ التّصغير ملفًا جديدًا تقومُ أنتَ باستخدامه في نهاية المطاف. على سبيل المثال، تستطيع إنشاء ملف style.css لتعمل عليه، ومن ثمّ بإمكانك تصغيره إلى style.min.css. يتحرّى الضّغط جميع المقاطع المكرّرة ويستبدلها بمؤشّرات إلى موضع الورود الأول للمقطع المعنيّ. قدّمت جوليا إيفانز Julia Evans طريقةً رائعة لفهم ما سبق (راجع منشورها والفيديو). إليك الفقرة الأولى من القصيدة: .red { color: red; } Once upon a midnight dreary, while I {pon}dered weak an{d wea}{ry,} Over many{ a }quaint{ and }curious volume of forgotten lore, W{hile I }nodded, n{ear}ly napping, su{dde}n{ly }th{ere} ca{me }a t{apping,} As{ of }so{me o}ne gent{ly }r{apping, }{rapping} at my chamb{er }door. `'Tis{ some }visitor,'{ I }mu{tte}r{ed, }`t{apping at my chamber door} - O{nly th}is,{ and }no{thi}{ng }m{ore}. وَجد gzip أن النّصّ الوارد ضمن أقواس متعرّجة هو نصٌّ مكرّر. لهذا السبب، سيُستبدل بمؤشّر يستهلك مساحةً أقل مما يستهلكه النّصّ نفسه. تظهر فعاليّة هذا الأمر في إنقاص حجم الملف، خاصّةً في حالة الشّيفرة البرمجيّة على اعتبار أنّها تحتوي بطبيعتها على الكثير من المقاطع المكرّرة. تخيّل فقط عدد مرّات ورود ‎<div في ملف HTML أو عدد مرّات ورود { في ملف CSS. يمكنك إنشاء إصدارات مضغوطة من الملفات، على سبيل المثال style.css.zip لكنّك نادرًا ما ستضطّر لذلك ولن يعرف المتصفّح ماذا يفعل بهذه الإصدارات. تتّم عمليّة الضّغط على الويب من قبل الخادم مباشرةً ذلك إذا ما قمت بإعداده للقيام بها. حالما تُطبّق الإعدادات، يحدث الضّغط تلقائيًّا ولا حاجةَ بك للقيام بأي عمل آخر. يضغط الخادم الملف ويرسله عبر الشبكة مضغوطًا. يستقبل المتصفح الملف ويفكّ ضغطه قبل استخدامه. لم أسمع قطُّ أحدًا يذكر أعباء عمليّتَي الضّغط وفكّ الضّغط، لذا سأفترض أنّها مهملةٌ وأنّ فوائدها تفوقُ أعباءها بكثيرٍ. يجري عادةً أتمتة عملية الضغط عبر أدوات البناء مثل Gulp مما يسهل عليك العملية. إليك كيفيّة تفعيل عمليّة الضّغط على خادم Apache من خلال استخدام الوحدة mod_deflate . كما يّقدّم H5BP إعدادات الخواديم لجميع الخواديم الشّائعة التي تدعم الضّغط. مثال سنستخدم ملف CSS من Bootstrap على اعتباره مرجعًا شائعًا. ستُوفّر ما يقارب 17% عند تصغير ملف CSS، أو 85% عند ضغطه أو 86% عند قيامك بكليهما. الوضع المثاليّ عند التأكد من عمل كلِّ شيءٍ كما ينبغي من خلال أدوات المطور (DevTools) موضّح كما يلي: الضّغط أكثر فعاليّة، لكنّ القيام بكليهما هو الأفضل بالمطلق. تُخفّض عمليّة الضّغط حجم الملف أكثر بخمسة أضعاف من عمليّة التّصغير. لكنّك تحصل على دفعة صغيرة إضافيّة عند القيام بالتّصغير أيضًا. هناك أيضًا دليلٌ على أنّ المتصفّحات تقرأ وتحلّل الملف المُصغّر أسرع: شرَعَت مايكروسوفت هي الأخرى بتحسين مُحلّلاتها لهذا الأمر: يندرج التّخزين المؤقّت للأصول في هذا السّياق أيضًا حيث لا يوجد ما هو أسرع من مُتصفّح لا يحتاج إلى طلب الأصول على الإطلاق. يوجد الكثير من المعلومات حول هذا الموضوع على الوِيب (أو في الكتب)، وقد نقوم بنشر مقال حول هذا الموضوع قريبًا. ترجمة -وبتصرف- للمقال The Difference Between Minification and Gzipping لصاحبه Chris Coyier
    1 نقطة
  47. مقدمة إن نموذج تمثيل المستند ك جسم أو كائن Document Object Model والذي يشار له اختصارا ب DOM يعتبر أحد الطرق الأساسية في بناء مواقع متفاعلة فيما بينها، حيث تُعتبر هذه الطريقة واجهة تسمح للغات البرمجة بمعالجة محتوى المواقع وهيكليتها. أحد اللغات المرتبطة بالـ DOM في المتصفحات هي الجافا سكربت وذلك لأنها لغة برمجة تعمل في مواقع الويب من جهة المستخدم client-side. حيث يمكن الاستفادة من مفاهيم DOM في بناء مواقع ويب متفاعلة مثل إضافة عرض صور للموقع من خلال شاشة عرض بطريقة تدوير الصور، أو إظهار لافتة تنبّه المستخدم إلى وقوعه في خطأ عند محاولته إدخال معلومات ناقصة ضمن الحقول المطلوبة، أو التبديل في قوائم التصفح الخاصة بالموقع ويتم تنفيذ هذه العمليات الثلاث من خلال لغة الجافاسكربت ولكن من خلال معالجة DOM. في هذا المقال سنتعلم ماهو DOM وكيفية التعامل معه من خلال تعريف كائن object هو document والتمييز بين أسطر التعليمات المكتوبة بلغة HTML وبين DOM. ملاحظة: لاتعتبر DOM لغة برمجة كما الحال في لغات البرمجة الاعتيادية كالجافا أو الجافا سكربت... حيث يتم تنفيذ وتطبيق مفاهيمها من خلال لغات برمجة أخرى وهنا سنستخدم لغة الجافا سكربت. المتطلبات الأساسية لفهم كيفية تطبيق مفاهم DOM بشكل فعال وتنفيذه في تطبيقات الويب من المهم أن تكون لديك معرفة سابقة بـ HTML و CSS بالإضافة إلى معرفة القواعد الأساسية حول طريقة كتابة تعليمات الجافا سكربت وهيكليتها. ما هي DOM للبدء ببناء أي موقع ويب مهما كان بسيط سنبدأ أولًا بإنشاء مستند HTML، حيث يقوم برنامج المتصفح الذي يستخدمه الزائر لمشاهدة الموقع بتفسير تعليمات html و CSS وتحويلهم إلى المحتوى، الهيكلية والتصميم الذي نشاهده أمامنا في الصفحة النهائية. بالإضافة لذلك يقوم المتصفح ببناء تمثيل للمستند يُعرف بأنه نموذج كائن المستند Document Object Model ويسمح هذا النموذج للجافا سكربت بالوصول إلى المحتوى المُعبّر عنه كنص text أو كعناصر element ضمن المستند ورؤيتها على شكل أغراض objects. ولسهولة فهم هذا المفهوم الجديد سنتعرف عليه من خلال مثال عملي يبدأ بتطوير موقع بسيط وذلك بإنشاء ملف جديد يسمى index.html ثم حفظه ضمن مجلد المشروع project directory <!DOCTYPE html> <html lang="en"> <head> <title>Learning the DOM</title> </head> <body> <h1>Document Object Model</h1> </body> </html> إن أسطر التعليمات السابقة هي أساسيات HTML لبناء موقع ويب. سنستخدم هنا متصفح Chrome ولكن يمكنك الوصول إلى نفس الخرج من خلال المتصفحات الحديثة الأخرى. أولًا سنقوم بفتح ملف index.html الذي قمنا ببنائه من خلال متصفح chrome عندها سيظهر أمامك صفحة ويب فارغة وتحوي فقط عنوان هو "Document Object Model" ومن خلال النقر بالزر اليميني في أي مكان بالصفحة ستظهر لدينا قائمة نختار منها "Inspect" والتي ستفتح لنا على جانب الصفحة أدوات التطوير، سيظهر لدينا DOM تحت تبويب "Elements" في هذه الحالة نلاحظ أن DOM الذي قمنا بإظهاره مطابق تمامًا لتعليمات html التي كتبناها سابقًا لبناء الموقع، وعند تمرير السهم فوق العنصر سنلاحظ أن مايقابله من صفحة الويب المفتوحة أمامنا ستُظلّل باللون الأزرق، كما أن السهم الموجود على جانب كل عنصر يسمح بتوسيع العناصر المكتوبة بالداخل. كائن المستند Document كائن المستند document هو عبارة عن كائن مُدمج يملك عدد من الخصائص properties والطرق methods التي يمكن استخدامها للوصول إلى الموقع وتعديله. لفهم كيفية عمل DOM يجب أولًا فهم كيف تعمل الكائنات objects في الجافا سكريبت، ويمكن ذلك من خلال الإطلاع على مقالة برمجة الكائنات Objects في جافاسكريبت في أدوات التطوير التي أظهرناها سابقًا بجانب ملف index.html ننتقل إلى التبويبة "Console" ونكتب document داخل console ثم نضغظ زر Enter حيث نلاحظ أن الخرج هو نفسه الخرج الموجود في تبويبة "Elements" document; Output #document <!DOCTYPE html> <html lang="en"> <head> <title>Learning the DOM</title> </head> <body> <h1>Document Object Model</h1> </body> إن كتابة المستند document أو العمل مباشرة في تبويب console ليست أمرًا شائعًا نقوم به خارج debugging ولكنه يساعد في ترسيخ مفهوم كائن المستند document وكيفية تعديله ومعرفه العناصر الأخرى المدرجة ضمنه. ماهو الفرق بين DOM وتعليمات HTML حاليًا في المثال السابق الذي طرحناه تبدو لنا DOM كما لو أنها تعليمات HTML نفسها ولكن يوجد أمثلة يقوم فيها المتصفح بتوليد DOM مختلف عن تعليمات HTML مثل: تعديل DOM من خلال تعليمات الجافا سكربت والتي يتم تنفيذها في جانب المستخدم. قيام المتصفح بتصحيح الأخطاء الموجودة في التعليمات HTML المكتوبة سابقًا بشكل تلقائي. سنقوم الآن باكتشاف آلية تعديل DOM من خلال استخدام الجافا سكربت التي تُطبق في جانب المستخدم. أولًا ندخل في console التعليمة document.body; عندها سيكون الخرج: Output <body> <h1>Document Object Model</h1> </body> سنلاحظ هنا أن document هو عبارة عن كائن أما body فهو خاصية property لهذا الكائن لذلك من للوصول إلى هذه الخاصية نكتب اسم الكائن ثم نقطة ثم الخاصية document.body عندها سيكون الخرج هو جميع عناصر body الموجودة في المستند document. نستطيع من خلال console تغيير بعض الصفات الظاهرة في الكائن body في هذا الموقع فمثلًا يمكن تغيير صفات style الخاصية بالـ body مثل تغيير لون الخلفية ويتم ذلك من خلال التعليمة document.body.style.backgroundColor = 'fuchsia'; بعد كتابة هذه التعليمة وإدخالها سنلحظ تغير لون خلفية الموقع للون الفوشيا: بالانتقال إلى تبويبة "Elements" أو من خلال كتابة تعليمة document.body في console مرة أخرى سنلاحظ أن DOM قد تغير Output <body style="background-color: fuchsia;"> <h1>Document Object Model</h1> </body> ملاحظة: رأينا في المثال السابق عند تغيير لون الخلفية أن خاصية لون الخلفية في CSS والذي يكتب بالشكل background-color تمت كتابته بالشكل backgroundColor في الجافا سكربت وبنفس هذا الترتيب فإن أي خاصية في CSS يمكن كتابتها في الجافا سكربت بطريقة camelCase والتي تعني أن الحرف الأول من الكلمة الأولى صغير بينما الحرف الأول من الكلمة الثانية كبير. عند الضغط بالزر اليميني على الصفحة واختيار "View Page Source" سنلاحظ أن التعليمات الظاهرة لاتحوي على الصفة attribute الجديدة للون الخلفية الذي أضفناه من خلال الجافا سكربت وذلك لأن التعليمات الأساسية الموجودة في جانب الخادم Server التي تم بناء الموقع من خلالها لاتتأثر بأي تعليمات كتبت في جانب المستخدم بلغة الجافا سكربت، ولذلك في حال قمنا بتحديث الصفحة فإن الخاصية التي أضفناها ستُلغى. بالنسبة للحالة الأخرى التي ذكرناها عن اختلاف DOM و تعليمات HTML وهي عندما يتم تصحيح الأخطاء المكتوبة في التعليمات source code آليًا من قبل المتصفح، كمثال شائع فإن الوسم tbody يجب أن يرافق الوسم table دائمًا ولكن غالبًا لايقوم المطورون بتضمين هذه الوسوم بالشكل الصحيح ضمن HTML وعندها يقوم المتصفح تلقائيًا بتصيح هذا الخطأ وإضافة الوسم tbody وبالتالي يتم تغيير DOM. بالإضافة إلى ذلك دائمًا يصحح DOM الوسوم التي لايتم إغلاقها. ملخص عرضنا في هذه المقالة تعريف للـ DOM واستطعنا الوصول إلى كائن المستند document باستخدام الجافا سكربت وconsole من أجل تغيير خصائص تابعة للكائن document، كما تعرفنا على الفرق بين HTML و DOM. أما في المقالة التالية سنقوم باستعراض معلومات مهمة عن HTML وشجرة DOM وكيفية التعامل مع عقدها Nodes وماهي الأنواع الشائعة منها. ترجمة بتصرف للمقال Introduction to DOM وكاتبتها Tania Rascia
    1 نقطة
  48. السؤال الذي قد يتبادر إلى أذهان مُطوّري الجافا هو "ما الذي عليّ أن أتعلمه الآن؟". هناك مجموعة من اللغات التي تستحق الاعتبار، مثل Clojure, Rust أو Haskell. ولكن ماذا لو كنت تريد أن تتعلم شيئًا يساعدك على دفع الفواتير وهو فوق ذلك سهل الاستخدام؟ Kotlin قد يكون خيارك الأفضل، وسنحاول في هذه المقالة أن نشرح لماذا. ما هو Kotlin؟ لغة برمجة مُطوّرة من قبل JetBrains، والذين كانوا وراء فكرة IntelliJ IDEA IDE بالإضافة إلى أشياء أخرى. بديل بسيط ومرن لجافا تتلاءم جيدًا مع أكواد جافا الموجودة تُترجم لجافا bytecode تعمل على JVM كما تُترجم أيضًا لجافا سكريبت إن كنت قد قرأت وثائقها فستلاحظ مجموعة من الأمور المهمة: تتيح لك القيام بالكثير من الأشياء بأكواد قليلة تحل الكثير من المشاكل الموجودة في جافا تساعدك على الاستمرار في استخدام النظام البيئي ecosystem المعتاد لجافا تتيح لك برمجة الواجهة الأمامية والخلفية بنفس اللغة 100٪ متوافقة مع الجافا أداؤها جيد مقارنةً بالبدائل (Clojure, Scala) لا تضيف إلّا طبقةً رقيقة من التّعقيد على جافا يبدو هذا جيدًا، أليس كذلك؟ فيما يلي سنرى بعض الأمثلة لمقارنتها بالجافا. عناصر القِيَم مقابل بيانات الأصناف Value objects vs data classes ما تراه هنا هو كائن جافا قديم ((POJO مع الأنماط المعتادة: public class HexagonValueObject { private final int x; private final int y; private final int z; public HexagonValueObject(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } public int getX() { return x; } public int getY() { return y; } public int getZ() { return z; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; HexagonValueObject hexagon = (HexagonValueObject) o; return getX() == hexagon.getX() && getY() == hexagon.getY() && getZ() == hexagon.getZ(); } @Override public int hashCode() { return Objects.hash(getX(), getY(), getZ()); } @Override public String toString() { return "HexagonValueObject{" + "x=" + x + ", y=" + y + ", z=" + z + '}'; } إنشاء عناصر القِيَم هو عملية مرهقة حتى باستخدام المكتبات مثل Lombok) Lombok يتطلب تثبيت ملحقة في بيئة العمل IDE الخاصة بك من أجل أن يعمل، وهو أمر قد لا يكون ممكنًا في جميع بيئات التطوير، يمكن تجاوز هذا المشكل بأدوات مثل Delombok، ولكنه اختراق أكثر منه حل للمشكلة)، على الأقل IDEA (أو Eclipse) يمنحك بعض المساعدة في توليد الكثير من تلك الوظائف، ولكنّ إضافة حقل ونسيان تعديل الوظيفة equals سيؤدي إلى مفاجآت سيئة. دعونا ننظر الآن إلى الكود المقابل في Kotlin: data class HexagonDataClass(val x: Int, val y: Int, val z: Int) مذهل! لقد اختصرنا الكثير من الكتابة بالمقارنة مع نسخة جافا. بيانات الأصناف في Kotlin تعطيك equals + hashCode و toString بالإضافة إلى المُحصّلات والمُعيِّنات (getters and setters). يمكنك أيضًا نسخها، مما يخلق كائنًا جديدًا مع إعادة كتابة بعض حقوله. حشو سلاسل النصوص String interpolation التعامل مع سلاسل النصوص في الجافا مرهق. ولكن يمكن تبسيطه باستخدام String.format ومع ذلك ستبقى قبيحة. public class JavaUser { private final String name; private final int age; public String toHumanReadableFormat() { return "JavaUser{" + "name='" + name + '\'' + ", age=" + age + '}'; } public String toHumanReadableFormatWithStringFormat() { return String.format("JavaUser{name='%s', age=%s}", name, age); } } Kotlin وجد حلّا لهذا، حيث أضاف مفهوم حشو السلاسل، مما بسّط استخدام المتغيرات في السلاسل الحرفية. ومكّن أيضًا استدعاء الوظائف منها! class KotlinUser(val name: String, val age: Int) { fun toHumanReadableFormat() = "JavaUser{name='$name', age=$age}" fun toHumanReadableFormatWithMethodCall() = "JavaUser{name='${name.capitalize()}', age=$age}" } دوال التمديد Extension functions كتابة المُلقّمات decorators في جافا يمكن أن يكون صعبًا، كما أنّها ليست مثالية. إذا كنت تريد أن تكتب مُلقّمًا، والذي يمكن استخدامه مع جميع الأصناف التي تقدّم List فلا يمكنك ببساطة استخدامه في الملقم خاصتك لأنّه سيحتاج منك أن تقدم الكثير من الوظائف الأخرى، لذلك ستكون مضطرًّا لتمديد AbstractList. public class ListPresenterDecorator<T> extends AbstractList<T> { private List<T> list; public ListPresenterDecorator(List<T> list) { this.list = list; } public String present() { return list.stream() .map(Object::toString) .collect(Collectors.joining(", ")); } @Override public T get(int index) { return list.get(index); } @Override public int size() { return list.size(); } } إذا كنت بحاجة إلى تلقيم شيء ما ولكنه لا يوفر أصنافًا أساسية base classes مفيدةً مثل AbstractList أو الصنف final، فأنت لا تستطيع ذلك ببساطة. لكن وظائف التمديد Extension methods يمكن أن تعطيك الحل! fun <T> List<T>.present() = this.joinToString(", ") تتصرف هذه الوظيفة كمُلقّم لجميع الأصناف Lists. لو قارنّا هذا ببديله في الجافا فإنّ هذ السطر الصغير أبسط بكثير، والأكثر من ذلك سوف يعمل أيضًا مع الأصناف final. حاول ألّا تسيء استخدامها وحسب. التحقق من العدمية Null safety التحقق من القيم المعدومة null ينطوي على الكثير من التعابير المنطقية والأنماط. مع ظهور الجافا، يمكنك أخيرًا التعامل مع هذه المشكلة بواسطة الصنف Optional، لكن ماذا لو كان مرجعOptional معدومًا null؟ ستحصل على NullPointerException، فلا زلنا بعد مرور 20 عام على ظهور جافا لا نستطيع تحديد العنصر الذي كان معدومًا. نأخذ المثال التالي: public class JavaUser { static class Address { String city; } private final String firstName; private final String lastName; private final List<Address> addresses; /** * If you want to make sure nothing is `null` * you have to check everything. */ public static String getFirstCity(JavaUser user) { if(user != null && user.addresses != null && !user.addresses.isEmpty()) { for(Address address : user.addresses) { if(address.city != null) { return address.city; } } } throw new IllegalArgumentException("This User has no cities!"); } } مع Kotlin، لديك العديد من الخيارات. إذا كان مشروعك متداخلًا مع مشاريع جافا يمكنك استخدام عامل التحقق من العدميّة (؟)null safety operator: data class KotlinUserWithNulls(val firstName: String?, // String? means that it is either a String object or a null val lastName: String?, val addresses: List<Address> = listOf()) { data class Address(val city: String?) companion object { fun fetchFirstCity(user: KotlinUserWithNulls?): String? { user?.addresses?.forEach { it.city?.let { return it } } return null } } } الكود الموجود بعد ؟ لن يُنفّذ إلا إن كان المعامل الأيسر operand غير معدوم not null. الدالة let تنشئ ارتباطًا محليًّا للكائن المُستدعى بحيث أنّ it سوف تشير إلى it.city. أما إن كان عملك مفصولًا عن الجافا فأقترح الابتعاد عن كل ما له علاقة بـ null data class KotlinUserWithoutNulls(val firstName: String, // this parameter can't be null val lastName: String, val addresses: List<Address> = listOf()) { data class Address(val city: String) companion object { fun fetchFirstCity(user: KotlinUserWithNulls) = user.addresses.first().city } } إذا لم يكن هناك أي استخدام لـ null (لا وجود لـ ؟) فكل شيء سيصبح أكثر بساطةً. استنباط النوع Type Inference Kotlin يدعم استنباط الأنواع، مما يعني أنه قادر على معرفة الأنواع من سياقها. أي مثل العامل الماسي diamond notation في الجافا <>! نأخذ المثال التالي: public class JavaUser { // ... private final String firstName; private final String lastName; private final List<Address> addresses; public Address getFirstAddress() { Address firstAddress = addresses.get(0); return firstAddress; } } هذا يبدو نفسه تقريبًا في Kotlin: data class KotlinUser(val firstName: String, val lastName: String, val addresses: List<Address> = listOf()) { data class Address(val city: String) /** * This is the same as in `JavaUser`. */ fun getFirstAddressNoInference(): Address { val firstAddress: Address = addresses.first() return firstAddress } } وذلك حتى تدع Kotlin تكتشف أنواع المتغيرات الخاصة بك: /** * Here the type of `firstAddress` is inferred from the context. */ fun getFirstAddressInferred(): Address { val firstAddress = addresses.first() return firstAddress } أو حتى الوظائف: /** * Here the return type is inferred. Note that * if a method consists of only one statement * you can omit the curly braces. */ fun getFirstAddress() = addresses.first() لا داعي للتحقق من الاستثناءات No checked exceptions ربما رأيت الكود التالي مليون مرة من قبل: public class JavaLineLoader { public List<String> loadLines(String path) { List<String> lines = new ArrayList<>(); try(BufferedReader br = new BufferedReader(new FileReader(path))) { String line; while((line = br.readLine()) != null) { lines.add(line); } } catch (IOException e) { e.printStackTrace(); } return lines; } } لأصحاب المدرسة القديمة في (IO in Java). لاحظوا التعليمة try في الكود أعلاه، الأمر نفسه سيُكتب هكذا في Kotlin: class KotlinLineLoader { fun loadLines(path: String) = File(path).readLines() } هناك بضعة أشياء ينبغي الانتباه إليها، أولًا: Kotlin ألغى التحقق من الاستثناءات. ثانيًا: Kotlin أضاف استخدام الكائنات من نوع Closeable أي: يمكنك أن تلاحظ أيضًا أنّ دالة التمديد (readLines) أضيفت إلى الصنف File. هذا النمط موجود بكثرة في Kotlin. إذا كنت قد استخدمت Guava أو Apache Commons أو شيء مماثل من قبل، فغالبًا سترى وظائف مشتركة تضاف منها إلى الصنف JDK كدالة تمديد. وهذا قد يكون مفيدًا لصحتك (أعصابك على الأقل). دعم لامبدا Lambda support دعونا نلقي نظرة على دعم lambda في الجافا: public class JavaFilterOperation { private List<String> items; @FunctionalInterface interface FilterOperation { Boolean filter(String element); } private List<String> filterBy(FilterOperation fn) { return items.stream() .filter(fn::filter) // applying the function .collect(Collectors.toList()); } public void doFilter() { filterBy((element) -> { return element.length() > 0; // calling the function with an actual lambda }); } } بما أنّه لا توجد قاعدة محددة لكتابة أنواع معاملات الوظائف method parameter types، فسيكون علينا إنشاء واجهة لها بأنفسنا. لاحظ أننا يمكن أن نستخدم Function<String, Boolean> هنا، ولكنها لن تعمل إلّا على الدوال ذات المعامل الواحد! هناك بعض الواجهات في JDK لحل هذه المشكلة، ولكن الكود سيكون مربكًا وغير واضح (مثلًا، ما دور BiFunction هنا؟)، Kotlin يحسّن هذا قليلًا: class KotlinFilterOperation { private val items = listOf<String>() fun filterBy(fn: (String) -> Boolean) = items.filter(fn) fun doFilter() { filterBy(String::isNotEmpty) // note the exension function `isNotEmpty` added to `String`! } } Kotlin يضيف قاعدةً نحويةً من أجل تمرير الدوال كمعاملات: (ParamType1, ...ParamTypeN) -> ReturnType. Kotlin يوفر مراجع للوظائف والحقول، كما يمكنك أيضًا التأشير إلى وظيفة من كائن ملموس! باستخدام المثال أعلاه يمكنني التأشير إلى الوظيفة filterBy من عيّنة instance ملموسة، هكذا: val reference = KotlinFilterOperation()::filterBy البرمجة الوظيفيّة Functional programming البرمجة الوظيفيّة أصبح لها ضجة في الوقت الحاضر. ومع جافا 8، قدمت Oracle مقاربتها لهذا الموضوع: الواجهة البرمجية Stream (Stream API). وهي تعمل كالتالي: public class JavaUser { // ... public static Set<String> fetchCitiesOfUsers( List<JavaUser> users) { return users.stream() .flatMap(user -> user.addresses.stream()) .map(JavaUser.Address::getCity) .collect(Collectors.toSet()); } } المقابل في Kotlin مشابه إلى حد ما، ولكن باختلافات دقيقة: fun fetchCitiesOfUsers(users: List<KotlinUser>) = users .flatMap(KotlinUser::addresses) .map(Address::city) .toSet() لا يوجد تحويل صريح للتسلسلات streams بما أنّ كل تجميعات Kotlin تدعمها. كنتيجة مباشرة لذلك، لن يكون عليك تمرير لامبدا لـ flatMap. تجميع النتيجة يحدث تلقائيًّا (لا حاجة لاستدعاء الوظيفة *Collectors.to). واستخدامنا لـ toSet هنا سببه الوحيد أننا نريد إرجاع عنصر من نوع Set. وإلا فيمكن حذف.toSet() توافقية جافا وKotlin يمكن أن يكون هذا معقدًا لمعظم النّاس، لكن JetBrains تعاملت مع هذا الأمر بالشكل الصحيح: public class KotlinInterop { public void helloJava() { System.out.println("Hello from Java!"); } public void helloKotlin() { JavaInterop.createInstance().helloKotlin(); } } class JavaInterop { fun helloJava() { KotlinInterop().helloJava() } fun helloKotlin() { println("Hello from Kotlin!") } companion object { @JvmStatic fun createInstance() = JavaInterop() } } التداخل هنا سلس وسهل. جافا وKotlin يمكن أن يتعايشا معًا في نفس المشروع، كما يقدم Kotlin مجموعة من التعبيرات (مثل @JvmStatic) لتسهيل استدعاء كود Kotlin من الجافا دون أية مشاكل. قد تكون قد لاحظت من هذه الأمثلة أن Kotlin يستعير الأفكار الجيدة من جافا ويُحسّنها ويحاول أن يختصر عليك الوقت والعمل إلى أدنى حد ممكن. الأنباء الأخيرة حول اعتزام جوجل جعل Kotlin واحدةً من اللغات المعتمدة علىAndroid تدعم هذا التوجه أيضًا. أشياء لتخبر بها مديرك: إذا كنت ترغب في إعطاء Kotlin فرصة فإليك بعض النصائح التي ستساعدك عند التفاوض مع مديرك أو زملائك في الفريق: Kotlin خرج من عالم الصناعة، وليس من العالم الأكاديمي. فهو يحل المشاكل التي يواجها المبرمجون اليوم. حر ومفتوح المصدر يأتي ومعه أداة مفيدة لتحويل جافا إلى Kotlin يمكنك مزج Kotlin وجافا دون جهد يُذكر يمكنك استخدام جميع أدوات وأُطُر عمل جافا الموجودة Kotlin مدعوم من قبل أفضل بيئة عمل في السوق (مع نسخة مجانية) من السهل قراءته، فحتى المبرمجون غير المتخصصون في Kotlin يمكنهم مراجعة الأكواد المكتوبة به لا تحتاج إلى رهن مشروعك بـ Kotlin: يمكنك البدء في المرحلة الأولى بكتابة الاختبارات فيه. من غير المرجح أن تتخلى JetBrains عن Kotlin لأنه يُقوّي مبيعاتها Kotlin لديه مجتمع حيوي، كما يمكنك بسهولة أن تساهم في Kotlin وتقترح ميزات جديدة باستخدام KEEP إذن، هل يستحق Kotlin الضجة المثارة حوله؟ الحكم لك. ترجمة -وبتصرّف- للمقال Kotlin is the new Java لكاتبه Adam Arold
    1 نقطة
  49. هل تعاني من صعوبة في تطبيق مفاهيم البرمجة الكائنية مع لغة JavaScript؟ إذًا أنت في المكان الصحيح، ففي هذا المقال سنبدأ بمطلع لمفاهيم البرمجة الكائنية (أو الشيئية كما قد يُطلق عليها البعض)، ومن ثم مراجعة نموذج جافا سكريبت في الكائنات، وأخيرًا شرح مفاهيم البرمجة الكائنية في جافا سكريبت، لتحصل على إلمام واف والقصة الكاملة. مراجعة في جافاسكريبت JavaScript يُمكن العودة إلى المقال إعادة تقديم JavaScript لمن أساء فهمها هنا في أكاديمية حسوب للحصول على مراجعة لأساسيات لغة جافا سكريبت وأخذ فكرة عن المغيرات وأنواع الدوال وبقية الأساسيات. البرمجة الكائنية Object-oriented programming إن البرمجة الكائنية (OOP) ما هي إلا نمط برمجي يَستخدم التجريد في إنشاء نماذج/نسخ لتجسيد العالم الحقيقي، وتَستخدم البرمجة الكائنية في ذلك أساليب مُتعدّدة من هذا النمط، فهي تستخدم الوحدات module، وتعدديّة الأشكال polymorphism والتغليف encapsulation، وتجدر الإشارة إلى أن معظم لغات البرمجة تدعم مفهوم OOP أمثال اللغات البرمجية: جافا، بايثون، روبي، وطبعًا جافا سكريبت. يُعالج أو لنقل يَتصور مفهوم البرمجة الكائنية OOP البرنامج كتشكيلة من الأشياء/الكائنات المتعاونة/المترابطة بدلًا من يتصوّره كتشكيلة من الدوال (functions) أو كسرد من الأوامر. ففي مفهوم OOP، كل كائن/شيء له القدرة على استقبال الرسائل، ومعالجة البيانات، وإرسال الرسائل إلى باقي الكائنات، ويُمكن اعتبار أنه لكل كائن object كينونة خاصة به ودور/وظيفة مستقلة عن الكائن الآخر. تُعزز البرمجة الكائنية القدرة على صيانة الشيفرة البرمجية والمرونة في التطوير، وأثبتت جدارتها على نطاق واسع في هندسة البرمجيات الكبيرة، ولأن البرمجة الكائنية تُشدد على استخدام الوحدات module، فإن الشيفرة/الكود المكتوب بمفهوم البرمجة الكائنية هو أبسط في التطوير وأسهل في الفهم مستقبلًا (عند التنقيح والتعديل)، وكما يعزز مفهوم البرمجة الكائنية التحليل المباشر للشيفرة، وفهم الحالات الشائكة فهمًا أفضل من باقي الأساليب البرمجية الأخرى. مصطلحات البرمجة الكائنية المجال في البرمجة الكائنية Namespace ما هو إلا عبارة عن حاوي تسمح للمطوّر بتحزيم جميع الوظائف تحت اسم محدد وفريد. الصنف أو الفئة Class في البرمجة الكائنية يعتني الصنف بكل ما يتعلّق بميزات وخصائص الكائن، والصنف ما هو إلا قالب template تعريفي بخاصيات properties وبطُرق/وظائف methods الكائن object. الكائن Object في البرمجة الكائنية الكائن ما هو إلا حالة/أمثولة instance من صنف class. الخاصية property في البرمجة الكائنية ما هي إلا مميزات وخصائص الكائن، كاللون مثلًا. الطريقة أو الوظيفة Method في البرمجة الكائنية تعتني الطريقة أو الوظيفة كما يُسميها البعض بقدرات الكائن، مثل قدرة المشي مثلًا، وهي دور أو وظيفة مرتبطة مع صنف class. المشيد Constructor في البرمجة الكائنية ما هو إلا طريقة method تُستدعى في لحظة استهلال instantiate الكائن، وعادةً ما يكون له نفس اسم الصنف الذي يحتويه. الوراثة Inheritance في البرمجة الكائنية يُمكن للصنف أن يرث مميزات من صنف آخر. التغليف Encapsulation في البرمجة الكائنية طريقة في تحزيم البيانات data والطُرق methods التي تستخدم البيانات. التجريد Abstraction في البرمجة الكائنية يجب على الاقتران الحاصل من: الوراثة والطُرق methods والخاصيات properties لكائن معقد وشائك التمثيل برمجيًا أن يعكس الواقع المراد محاكاته في البرمجة الكائنية. تعددية الأشكال Polymorphism في البرمجة الكائنية تحمل كلمة Poly بحد ذاتها المعنى "متعدد" وتحمل الكلمة morphism المعنى "أشكال، ويُشير المفهوم ككل إلى أن أكثر من صنف قد يُعرّف نفس الطريقة method أو الخاصية property. البرمجة المعتمدة على النموذج الأولي Prototype البرمجة المعتمدة على النموذج الأوّلي (Prototype-based programming) ما هي إلا نموذج من البرمجة الكائنية OOP ولكنها لا تستخدم الأصناف classes، بل تقوم أولًا بإعداد سلوك أي صنف class ما ومن ثم تُعيد استخدامه، ويُطلق البعض على هذا النموذج: البرمجة بلا أصناف classless، أو البرمجة المَبْدَئِية المنحى prototype-oriented، أو البرمجة المعتمدة على الأمثولة instance-based). يعود أصل اللغة المعتمدة على النموذج الأولي إلى لغة Self، والتي طوّرها David Ungar وRandall Smith، ولكن أسلوب البرمجة بدون أصناف class-less توسّع ونال شهرة كبيرة في العقد الأخير، واُعتمد من قبل العديد من اللغات البرمجية أشهرهم جافا سكريبت. البرمجة الكائنية باستخدام جافا سكريبت المجال Namespace في جافا سكريبت المجال هو أشبه بمستوعب/بحاوية (container) تسمح للمطوّر في تحزيم وظائف تحت اسم فريد، أو اسم تطبيق محدد، ففي جافا سكريبت المجال هو مجرد كائن object كأي كائن آخر يحتوي على طُرق methods، وخاصيات properties، وحتى كائنات objects. ملاحظة هامة: من المهم جدًا الانتباه إلى أنه في جافا سكريبت، لا يوجد فرق بين الكائنات العادية والمجالات namespaces، وهذا يختلف عن اللغات الكائنية الأخرى، الأمر الذي قد يُربك المبرمجين المبتدئين في جافا سكريبت. إن إنشاء مجال namespace في جافا سكريبت بسيطٌ للغاية، فمن خلال إنشاء كائن عام/مشترك/شامل global، ستصبح جميع المُتغيّرات variables والطرق methods، والدوال functions خاصياتٍ لهذا الكائن، ويٌقلل استخدام المجالات namespaces أيضًا من احتمالية تضارب الأسماء في التطبيق، منذ أن كل كائن من كائنات التطبيق ما هي إلى خاصيات كائن شامل/عام معرّفة على مستوى التطبيق. سيُنشئ في الخطوة التالية كائنًا عامًا global وبالاسم MYAPP: // global namespace var MYAPP = MYAPP || {}; يُظهر المثال السابق، كيف تم التأكّد أولًا فيما إذا كان MYAPP معرفًا (سواء في نفس الملف أو في آخر)، ففي حال الإيجاب سيُستخدم الكائن العام MYAPP، وفي حال عدم تعريفه مُسبقًا سيُنشئ كائنًا خالٍ وبالاسم MYAPP والذي سيغلّف encapsulate الطرق methods والدوال functions والمتغيرات variables والكائنات objects. كما يُمكن أيضًا إنشاء مجال فرعي sub-namespaces: // sub namespace MYAPP.event = {}; يوضّح المثال التالي الصيغة المستخدمة في إنشاء مجال namespace وإضافة متغيرات ودوال: // Create container called MYAPP.commonMethod for common method and properties MYAPP.commonMethod = { regExForName: "", // define regex for name validation regExForPhone: "", // define regex for phone no validation validateName: function(name){ // Do something with name, you can access regExForName variable // using "this.regExForName" }, validatePhoneNo: function(phoneNo){ // do something with phone number } } // Object together with the method declarations MYAPP.event = { addListener: function(el, type, fn) { // code stuff }, removeListener: function(el, type, fn) { // code stuff }, getEvent: function(e) { // code stuff } // Can add another method and properties } // Syntax for Using addListener method: MYAPP.event.addListener("yourel", "type", callback); الكائنات الأساسية/القياسية المبنية داخل لغة جافا سكريبت Standard built-in objects تتضمن لغة جافا سكريبت العديد من الكائنات في تركيبتها، على سبيل المثال، يوجد كائنات مثل Math، Object، Array، String، ويُظهر المثال التالي كيفيّة استخدام الكائن Math للحصول على رقم عشوائي باستخدام أحد طُرق method هذا الكائن وهي الطريقة ()random. console.log(Math.random()); ملاحظة: يَفترض المثال السابق وجميع الأمثلة التالية في المقال وجود دالة function بالاسم ()console.log معرّفة تعريفًا عامًا (globally)، مع العلم أن هذه الدالة ليست جزء من اللغة نفسها، ولكنها دالة متوفّرة في العديد من متصفحات الإنترنت لأغراض تشخيص الشيفرة البرمجية debugging. يُمكن العودة إلى مرجع لغة جافا سكريبت: الكائنات الأصلية المعيارية للحصول على قائمة بالكائنات المبينة داخل لغة جافا سكريبت نفسها. كل كائن في جافا سكريبت هو حالة/أمثولة instance من الكائن Object ويَرث كافة خاصياته properties وطُرقه methods. الكائنات المخصصة Custom objects في جافا سكريبت الصنف/الفئة The class لغة جافا سكريبت لغة من النوع prototype-based ولا تحتوي على العبارة class كما هو حال باقي لغات البرمجة الكائنية، كما في روبي أو بايثون، ويُربك هذا الأمر المبرمجين المعتادين على اللغات التي تعتمد على هذه العبارة أو المفهوم، وتستخدم جافا سكريبت بدلًا من ذلك الدوال functions لمحاكات مفهوم الأصناف classes، وتعريف صنف هو بسهولة تعريف أي دالّة: var Person = function () {}; الكائن (أمثولة الصنف class instance) يتطلب إنشاء حالة/أمثولة instance جديدة من كائن obj استخدام العبارة new obj، وتعيين النتيجة إلى متغيّر بغرض الوصول إلى فيما بعد. عُرّف في الشيفرة السابقة صنف class بالاسم Person، وفي الشيفرة التالية، سيُنشئ حالتين/أمثولتين instances من هذا الصنف، الأولى بالاسم person1 والثانية بالاسم person2. var person1 = new Person(); var person2 = new Person(); المشيد The constructor يُستدعى المُشيّد constructor في لحظة الاستهلال instantiation (اللحظة التي يُنشئ فيها الكائن)، والمُشيّد ما هو إلا طريقة method من طُرق الصنف class، وفي جافا سكريبت تعمل الدالة على تشييد الكائن، ولذلك لا داعي إلى تعريف طريقة method من أجل عميلة التشييد، وكل إجراء مصرّح في الصنف class يُنفّذ في لحظة الاستهلال instantiation. يُستخدم المُشيّد في تعيين خاصيات properties الكائن، أو في استدعاء طُرق methods معينة لتحضير الكائن للاستخدام، وأما إضافة طُرق صنف وتعريفها يحدث باستخدام صيغة syntax مختلفة سنتطرّق إليها فيما بعد خلال المقال. تُظهر الشيفرة التالية كيف يُسجّل log (يُرسل رسالة نصية إلى طرفية المتصفح console) مُشيّد الصنف Person رسالة نصية حينما يُستهل instantiated. var Person = function () { console.log('instance created'); }; var person1 = new Person(); var person2 = new Person(); الخاصية The property (خاصية الكائن object attribute) الخاصيات properties ما هي إلا متغيرات محتوات في الصنف class، وكل حالة/أمثولة من الكائن تمتلك هذه الخاصيات، وتُعيّن الخاصيات في دالة مُشيّد الصنف بحيثُ تُنشئ مع كل حالة/أمثولة instance. إن الكلمة المفتاحية this، والتي تُشير إلى الكائن الحالي، تسمح للمطوّر بالعمل مع الخاصيات من ضمن الصنف، والوصول (قراءةً وكتابةً) إلى الخاصية property من خارج الصنف يكون من خلال الصيغة InstanceName.Property كما هو الأمر في لغة C++ (سي بلس بلس) وJava والعديد من اللغات الأخرى، ومن داخل الصنف تُستخدم الصيغة this.Property للحصول على قيمة الخاصية أو لتعيين قيمتها. في الشيفرة التالية، عُرّفت الخاصية firstName للصنف Person وفي لحظة الاستهلال instantiation: var Person = function (firstName) { this.firstName = firstName; console.log('Person instantiated'); }; var person1 = new Person('Alice'); var person2 = new Person('Bob'); // Show the firstName properties of the objects console.log('person1 is ' + person1.firstName); // logs "person1 is Alice" console.log('person2 is ' + person2.firstName); // logs "person2 is Bob" الطرق The methods الطرق methods ما هي إلا دوال (وتُعرّف كما تعرّف الدوال functions)، فيما عدا ذلك فهي تُشبه الخاصيات properties، واستدعاء طريقة method مشابه إلى الوصول إلى خاصيّة ما، ولكن مع إضافة () في نهاية اسم الطريقة، وربما مع مُعطيات arguments، ولتعريف طريقة، تُعيّن دالة إلى خاصيّة مُسمّات من خاصيّة الصنف prototype، ويُمكن فيما بعد استدعاء الطريقة على الكائن بنفس الاسم الذي عُيّن للدالة. في الشيفرة التالية، عُرّفت ومن ثم اُستخدِمت الطريقة ()sayHello للصنف Person. var Person = function (firstName) { this.firstName = firstName; }; Person.prototype.sayHello = function() { console.log("Hello, I'm " + this.firstName); }; var person1 = new Person("Alice"); var person2 = new Person("Bob"); // call the Person sayHello method. person1.sayHello(); // logs "Hello, I'm Alice" person2.sayHello(); // logs "Hello, I'm Bob" إن الطُرق methods في جافا سكريبت ما هي إلا دالة كائن عادية مرتبطة مع كائن كخاصية property، وهذا يعني أنه يُمكن استدعاء الطُرق خارج السياق، كما في المثال التالي: var Person = function (firstName) { this.firstName = firstName; }; Person.prototype.sayHello = function() { console.log("Hello, I'm " + this.firstName); }; var person1 = new Person("Alice"); var person2 = new Person("Bob"); var helloFunction = person1.sayHello; // logs "Hello, I'm Alice" person1.sayHello(); // logs "Hello, I'm Bob" person2.sayHello(); // logs "Hello, I'm undefined" (or fails // with a TypeError in strict mode) helloFunction(); // logs true console.log(helloFunction === person1.sayHello); // logs true console.log(helloFunction === Person.prototype.sayHello); // logs "Hello, I'm Alice" helloFunction.call(person1); كما يُظهر المثال السابق، جميع الإحالات المستخدمة في استدعاء الدالة sayHello تُشير إلى نفس الدالة سواءً الاستدعاء الحاصل مع person1 أو Person.prototype أو حتى في المتغيّر helloFunction وقيمة this خلال استدعاء الدالة يعتمد على الكيفية التي تُستدعى فيها، حيث تُشير الكلمة المفتاحية this إلى الكائن الحالي الذي تُستدعى عليه الطريقة method، بمعنى عندما تم استدعاء الطريقة ()sayHello على الكائن person1 فإن this تُشير إلى الكائن person1، وعند استدعاء sayHello على الكائن person2 فإن this تُشير إلى الكائن person2، ولكن إن تم الاستدعاء بطريقة مختلفة، فإن this ستُعيّن تعينًا مختلفًا، فاستدعاء this من المتغيّر (كما في ()helloFunction) سيُعيّن this إلى الكائن العام global (والذي سيكون window في متصفح الإنترنت)، ومنذ أن هذا الكائن (على الأغلب) لا يملك الخاصّيّة firstName، ستكون النتيجة كما هو الحال في المثال السابق “Hello, I’m undefined”، كما يمكن دائمًا تعيين this صراحةً باستخدام Function#call (أو Function#apply) وهو كما كان في نهاية المثال. الوراثة تُستخدم الوراثة في جافا سكريبت في إنشاء صنف class كمثيل مخصص لصنف أو أكثر (تدعم جافا سكريبت وراثة وحيدة فقط single inheritance)، ويُطلق على الصنف المخصص عادةً ابن (child)، ويطلق على الصنف الآخر عادةً الأب (parent)، وفي جافا سكريبت يتمّ ذلك من خلال إسناد حالة/أمثولة من الصنف الأب إلى الصنف الابن، ومن ثم تخصيصه، وفي متصفحات الإنترنت الحديثة يُمكن استخدام Object.create في تحقيق الوراثة inheritance أيضًا. ملاحظة: لا تتفقد جافا سكريبت مُشيّد صنف الابن prototype.constructor (راجع Object.prototype)، وعليه يجب التصريح عن ذلك يدويًا، لمزيد من التفصيل راجع السؤال التالي على Stackoverflow. عُرّف في الشيفرة التالية الصنف Student كصنف ابن للصنف Person، ومن ثم أُعيد تعريف الطريقة ()sayHello وأُضيفت الطريقة ()sayGoodBye علاوة على ذلك. // Define the Person constructor var Person = function(firstName) { this.firstName = firstName; }; // Add a couple of methods to Person.prototype Person.prototype.walk = function(){ console.log("I am walking!"); }; Person.prototype.sayHello = function(){ console.log("Hello, I'm " + this.firstName); }; // Define the Student constructor function Student(firstName, subject) { // Call the parent constructor, making sure (using Function#call) // that "this" is set correctly during the call Person.call(this, firstName); // Initialize our Student-specific properties this.subject = subject; }; // Create a Student.prototype object that inherits from Person.prototype. // Note: A common error here is to use "new Person()" to create the // Student.prototype. That's incorrect for several reasons, not least // that we don't have anything to give Person for the "firstName" // argument. The correct place to call Person is above, where we call // it from Student. Student.prototype = Object.create(Person.prototype); // See note below // Set the "constructor" property to refer to Student Student.prototype.constructor = Student; // Replace the "sayHello" method Student.prototype.sayHello = function(){ console.log("Hello, I'm " + this.firstName + ". I'm studying " + this.subject + "."); }; // Add a "sayGoodBye" method Student.prototype.sayGoodBye = function(){ console.log("Goodbye!"); }; // Example usage: var student1 = new Student("Janet", "Applied Physics"); student1.sayHello(); // "Hello, I'm Janet. I'm studying Applied Physics." student1.walk(); // "I am walking!" student1.sayGoodBye(); // "Goodbye!" // Check that instanceof works correctly console.log(student1 instanceof Person); // true console.log(student1 instanceof Student); // true فيما يخص السطر ;(Student.prototype = Object.create(Person.prototype في الإصدارات القديمة من جافا سكريبت والتي لا تدعم Object.create يمكن إما استخدام بعض الحيل في خداع المتصفحات –هذه الخدع معروفة إما بالاسم polyfill أو shim—أو استخدام دالة تحقق نفس النتيجة كما في المثال التالي: function createObject(proto) { function ctor() { } ctor.prototype = proto; return new ctor(); } // Usage: Student.prototype = createObject(Person.prototype); التأكّد من أن this تُشير إلى الكائن المطلوب بغض النظر عن كيف للكائن أن يُستهل يمكن أن يكون صعبًا، ومع ذلك يوجد صياغة أبسط من شأنها أن تسهّل الأمر. var Person = function(firstName) { if (this instanceof Person) { this.firstName = firstName; } else { return new Person(firstName); } } التغليف Encapsulation ليس بالضرورة أن يعلم الصنف Student كيف تمّ تنفيذ/تعريف الطريقة ()walk للصنف Person لكي يستطيع استخدام تلك الطريقة، ولا يحتاج الصنف Student إلى تعريف تلك الطريقة صراحةً إلا إذا كان المطلوب التعديل عليها، ويُطلق على هذا الإجراء مفهوم التغليف encapsulation، والذي فيه يَحزم كل صنف البيانات والطُرق methods داخل وحدة/كينونة وحيدة. إخفاء المعلومات سمة شائعة في باقي اللغات البرمجية وعادةً ما توجد كخاصيات/كطُرق إما بالاسم private أو protected، وعلى الرغم من أنه يُمكن مماثلة/محاكاة ذات الأمر في جافا سكريبت، إلا أن هذا الأمر ليس مطلبًا من متطلبات البرمجة الكائنية. التجريد Abstraction التجرير ما هو إلا ميكانيكية تسمح للمطوّر في تجسيد جانب من المشكلة التي يُعمل عليها، إما من خلال الوراثة inheritance (التخصيص specialization) أو التركيب composition، وتُحقق جافا سكريبت التخصيص من خلال الوراثة، والتركيب من خلال السماح لحالات/أمثولات الصنف لتكون قيمًا لخاصيات attributes الكائنات الأخرى. الصنف Function في جافا سكريبت يرث من الصنف Object (وهذا يوضّح التخصيص في هذا النموذج) والخاصية Function.prototype ما هي إلا حالة/أمثولة من الصنف Object (وهذا يوضّح جزئية التركيب composition). var foo = function () {}; // logs "foo is a Function: true" console.log('foo is a Function: ' + (foo instanceof Function)); // logs "foo.prototype is an Object: true" console.log('foo.prototype is an Object: ' + (foo.prototype instanceof Object)); تعددية الأشكال Polymorphism كما أن جميع الطُرق methods والخاصيات properties معرّفة ضمن الخاصية prototype، فيُمكن لبقية الأصناف أن تُعرِّف طُرقًا methods بنفس الاسم، وستكون الطُرق في نطاق الصنف الذي عُرفت به، إلا إذا كان الصنفان على علاقة من نوع أب وابن parent-child، بمعنى آخر أحد الصنفان يرث من الآخر خاتمة إن الأساليب التي تم التطرُّق إليها ليست الأساليب الوحيدة التي يمكن استخدامها في تطبيق مفاهيم البرمجة الكائنية في جافا سكريبت، والتي هي مرنة إلى حد كبير في هذا الصدد، ولم تلجئ إلى أي خدع في تطبيق هذه المفاهيم، ولم تقلّد أيضًا الأساليب والنظريات المستخدمة في اللغات الأخرى، وفي جعبة جافا سكريبت العديد من الأساليب الأخرى لتطبيق مفاهيم متقدمة في البرمجة الكائنية التوجّه، ولكن هذه الأساليب المتقدمة هي خارج إطار مقالة تمهيدية، ربما نتطرّق إليها لاحقًا في الأكاديمية. ترجمة وبتصرّف للمقال Introduction to Object-Oriented JavaScript.
    1 نقطة
  50. بعد أن تعلّمنا في الدّرس السّابق كيفيّة التعامل مع كل من الصفوف، المجموعات والقواميس في لغة بايثون ، سنكمل مشوار تعلّم هذه اللغة الجميلة. سنتعلّم في هذا الدّرس كيفيّة التّعامل مع التّعابير الشّرطية، و كيفيّة استعمال الجمل الشّرطية في برامجنا وكيفّية القيّام بإزاحة مناسبة عند التّعامل مع أجزاء متعدّدة من الشّيفرة، وسنكمل هذا الدّرس بمثال تطبيقي يتجلى في برنامج تسجيل حساب والولوج إليه. مع التذكير بأنّ جميع الشّيفرات التّي تبدأ بعلامة <<< يجب أن تنفّذ على مفسر بايثون. التعابير الشرطية Conditional Expressions توفّر لنا لغة بايثون عدّة مُعاملات لمُقارنة القيّم، ونتيجة المُقارنة تكون قيمة منطقيّة Boolean إمّا True أو False. >>> 2 < 3 False >>> 2 > 3 True إليك قائمة بالمُعاملات المُتوفّرة في لغة بايثون. == يُساوي =! لا يُساوي > أصغر من < أكبر من => أصغر من أو تُساوي =< أكبر من أو تُساوي ويُمكن استعمال هذه المُعاملات أكثر من مرّة في السّطر الواحد: >>> x = 5 >>> 2 < x < 10 True >>> 2 < 3 < 4 < 5 < 6 True وتعمل المعاملات على السّلاسل النّصية كذلك (التّرتيب يكون بشكل معجمي، أي حسب ترتيب الكلمات في المُعجم). >>> "python" > "perl" True >>> "python" > "java" True يُمكن الجمع بين القيّم المنطقيّة بمعاملات منطقيّة: a and b: صحيح فقط إذا كان كل من a و b يحملان القيمة True. a or b: صحيح إذا كانت إحدى القيمتين صحيحة. not a: صحيح فقط إذا كان a يحمل القيمة False. وإليك مثالا على المُعاملات المنطقيّة: >>> True and True True >>> True and False False >>> 2 < 3 and 5 < 4 False >>> 2 < 3 or 5 < 4 True الجملة الشرطية If تُستعمل الجملة الشّرطيّة If (إذا كان) لتنفيذ جزء من الشّيفرة إذا كان الشّرط مُحقّقا: >>> if x % 2 == 0: ... print 'even' ... even >>> في المثال أعلاه طُبعَت الكلمة even لأنّ باقي قسمة 42 على 2 يُساوي صفرا (x % 2 == 0)، وبالتّالي فقد تحقّق الشّرط، فلو أنّ الشّرط لم يتحقّق لما أرجع المُفسّر أي نتيجة. يُمكن استخدام If كشرط لتنفيذ جزء منفصل من الشيفرة بالإزاحة (انظر فصل الإزاحة والمساحات أسفله)، ويكون هذا الأمر مُفيدا عندما يحتوي برنامجك على الكثير من الجمل. لاحظ بأنّ الجمل التّابعة للسّطر if x % 2 == 0 مُزاحةٌ بأربع مسافات بيضاء. الجملة else يُمكن أن تزيد على جملة If بند else وترجمته (وإلّا / إذا لم يكن ذلك صحيحًا)، والتي تنفّذ الشيفرة التّي من بعدها إذا كان الشّرط الأول خاطئا. >>> x = 3 >>> if x % 2 == 0: ... print 'even' ... else: ... print 'odd' ... odd >>> في المثال أعلاه، كان الشّرط الأول خاطئا لأن باقي قسمة 3 على 2 لا يُساوي صفرًا، ولذلك انتقل البرنامج لتنفيذ الشّيفرة بعد جملة else وقام بطباعة كلمة odd. الجملة elif يُمكن كذلك أن تزيد جملة elif وهي اختصار لـ else if والتّي تعني "إذا لم يتحقّق الشرط فانظر الشّرط التّالي": >>> x = 42 >>> if x < 10: ... print 'one digit number' ... elif x < 100: ... print 'two digit number' ... else: ... print 'big number' ... two digit number >>> في المثال أعلاه، هناك شرطان مختلفان، أولا عند تحقّق شرط كون قيمة المتغيّر x أصغر من العدد 10 فسيطبع البرنامج الجملة التي تقول بأنّ قيمة المتغير x عبارة عن رقم واحد، إذا لم يتحقّق الشّرط السّابق فسينتقل البرنامج إلى الشّرط الذي يليه وهو ما يتبع الجملة elif أي إذا كانت قيمة المتغيّر x أصغر من 100 فسيطبع البرنامج الجملة التي تفيد بأنّ قيمة المتغير x عبارة عن رقمين والجملة else تنفَّذُ إذا لم يتحقّق أي شرط وتفيد بأنّ قيمة المتغيّر x عبارة عن عدد كبير (لأنّه يتكون من 3 أرقام فأكثر). المساحة والمسافات والإزاحة المساحات التّي تسبق الشّيفرات في بايثون مُهمّة جدّا لترتيب شيفرة البرنامج ولتسهيل قراءته، كما أنّها تكون ضروريّة في بايثون، فإن لم تتّبع قوانين الإزاحة فلن يعمل البرنامج، وتُستعمل هذه الطّريقة لفصل الشّيفرات التّابعة لجزء معيّن من البرنامج، والإزاحة تكون بكتابة الشّيفرة بعد عدد معيّن من المسافات، ومن المُفضّل أن تكون أربع مسافات بيضاء، انظر المثال: هل الشّرط محقّق؟ .... نعم الشّرط محقّق .... لا الشرط غير محقق انتهى البرنامج في المثال أعلاه، الجملتان "نعم الشّرط محقّق" و "لا الشّرط غير محقّق" تابعتان للجملة "هل الشّرط محقّق؟" أمّا الجملة "انتهى البرنامج" فتابعة للبرنامج عامّة. وقد اعتمدت على النّقاط لتوضيح فكرة الإزاحة فقط وعليك أن تستبدل النّقاط بالمسافات في ملفّات بايثون. يُمكن كذلك أن تكون الشّيفرة تابعة لجملة ما، والتّي بدورها تابعة لجملة أخرى، لتتّضحك الأمور أكثر، فكّر في شجرة عائلة تتكوّن من الآباء والأولاد: جدّ ....أب 1 ........ابن 1.1 ........ابن 1.2 ....أب 2 ........ابن 2.1 ........ابن 2.2 للجد ابنان، ولكل ابن ابنان، نستنتج من هذا أنّ كلّ ابن تابع لأبيه بإزاحة أربع مسافات، أمّا الحفيد فتابع للجدّ بثماني مسافات. وإلى الآن تعرّفنا على موضع واحد تكون فيه الإزاحة إجباريّة وهي الجمل الشّرطيّة، فمثلا البرنامج التّالي: x = 42 if x % 2 == 0: print 'even' print 'Hello World' في المثال أعلاه جميع السّطور المزاحة بأربع مسافات (أي الجملة التي تطبع كلمة even) تُنفّذ عند تحقّق الشّرط فقط، أي أنّها جزء مرتبط بالشّرط في البرنامج، أمّا الشيفرة التي لم تُسبق بمسافات فتنفّذ بشكل طبيعي وتعتبر ضمن البرنامج عامّة. أمّا إذا أردنا أن نطبع جملة بعد التّحقّق من شرطين فسيكون البرنامج كالتّالي: الشّرط الأول محقّق، إذن انتقل إلى الشّرط الثّاني. الشّرط الأول غير محقّق، إذن لا تنتقل إلى الشّرط الثّاني. إليك تطبيقا للأمر في لغة بايثون: # البرنامج x = 42 if x % 2 == 0: print 'even' if x / 2 == 21: print '42/2 = 21 Is true' print 'Hello World' # المُخرج even 42/2 = 21 Is true Hello World في المثال أعلاه، قمنا بالتّحقّق من أنّ باقي قسمة العدد 42/2 يساوي 0، وبما أنّ الشّرط مُحقّق فقد طبعت الكلمة even وانتقل المُفسّر إلى الشّرط التّالي وهو التّحقّق من أن 42/2 يُساوي 21 وبما أنّه بدوره شرط مُحقّق أيضا فقد قام البرنامج طباعة الجملة 42/2 = 21 Is true وبعدها قام بطباعة الجملة Hello World لأنّها غير مُرتبطة بأي شرط. وبطبيعة الحال إذا لم يكن الشّرط الأول محقّقا، فلن ينتقل المُفسّر للشّرط التّالي ولن يقوم بأي شيء حتّى ولو كان الشّرط مُحقّقا. الحصول على قيم من مستخدم البرنامج يُمكن أن تطلب من المُستخدم أن يُدخل قيمة معيّنة، ثمّ تسند هذه القيمة إلى مُتغيّر في البرنامج، فمثلا لنقل بأنّك ترغب بالتّرحيب بالمُستخدم، أولا يجب أن تطلب منه أن يُدخل اسمه، بعدها تقوم بطباعة الجملة "Hello, Person"، بحيث تستبدل Person بالقيمة التّي أدخلها المُستخدم، انظر المثال: >>> person = raw_input('Enter your name: ') >>> 'Hello ', person إذا نفّذت البرنامج فسيكون المُخرج كالتّالي: Enter your name: وبعد إدخال اسمي والضّغط على مفتاح ENTER، فإنّ المُخرج سيكون كالتّالي: Hello Abdelhadi ما يحدث هو أن البرنامج يأخذ القيمة المُدخلة ويُسندها للمُتغيّر person وبعدها تستطيع أنت أن تطبع المُتغيّر للمُستخدم. تطبيق لنطبّق ما تعلّمناه ولننشئ برنامجا بسيطًا لجدولة مُقابلات العمل: سنطلب من المُستخدم توفير المعلومات التّاليّة: اسم المُتقدّم اسم المسؤول عن المُقابلة وقتُ المُقابلة وبعدها سنطبع جملة تحتوي على جميع المعلومات التّي قدّمها المُستخدم، افتح ملفّا باسم interview.py واكتب فيه التّالي: applicant = raw_input('Enter the applicant name: ') interviewer = raw_input('Enter the interviewer name: ') time = raw_input('Enter the appointment time: ') print interviewer, "will interview", applicant, "at", time في المثال أعلاه نطلب أولا من مُستخدم البرنامج أن يُدخل اسم المُتقدّم ثمّ تُسندُ القيمة إلى المتغيّر applicant، بعد ذلك يُطلب اسم المسؤول عن المُقابلة وتُسند قيمته إلى المُتغيّر interviewer وبعد ذلك نحصل على وقتُ المُقابلة من المُستخدم ونُسند القيمة إلى المُتغيّر time، وفي النّهاية نطبع الجملة الجامعة لكل المعلومات وتقديمها بشكل أسهل. جرّب الأمر بنفسك، وأسند القيّم التّي تريد، وانظر إلى النّتيجة، العب بالشّيفرة، أضف مميّزات أخرى كالتّحقّق من أن عُمر المُتقدّم أكبر من 18 عاما مثلا، وتذكّر بأنّ التعلّم بالتّطبيق أفضل من أي طريقة أخرى. تطبيق عملي: إنشاء برنامج تسجيل دخول بسيط الآن حان الوقت لنطبّق ما تعلّمناه، ولنقم بكتابة برنامج تسجيل دخول بسيط، ومبدأه كالتّالي: يُرحب البرنامج بالمُستخدم. يطلبُ منه معلومات التّسجيل. يفيد البرنامج المُستخدم بأنّ التّسجيل قد تم بنجاح أو بعكس ذلك. يطلب البرنامج معلومات الدّخول. يتحقّق البرنامج من أنّ المعلومات التّي أدخلها صحيحة. إذا كانت صحيحة، يطبع البرنامج رسالة نجاح. إذا كانت خاطئة، يطبع البرنامج رسالة فشل. المُتغيّرات التّي سنعتمد عليها: username: اسم المُستخدم password: كلمة المرور password_verification: تأكيد كلمة المرور (فقط للتّأكد من أنّ المُستخدم أدخل نفس كلمة المرور وأنّه يتذكّرها دون مشاكل). أولا جملة التّرحيب: print 'Hello User, this is a basic sign up/login Program' ثانيّا لنطلب من المُستخدم توفير قيّم المتغيرّات (username: اسم المُستخدم، password: كلمة المرور، password_verification: تأكيد كلمة المرور): username = raw_input('Enter your username please: ') password = raw_input('Enter the your password please: ') password_verification = raw_input('Verify password: ') الآن لنتحقق من أنّ كلمة المرور التّي أدخلها المستخدم في البداية هي نفسها التّي أدخلها عند تأكيد كلمة المرور وذلك بمقارنة المتغيّرين password و password_verification فإذا كانا يحملان نفس القيمة فهذا يعني بأنّ التّسجيل ناجح وسنطبع للمُستخدم جملة تفيد بأنّ عملية التّسجيل قد نجحت. أما إذا لم تكن القيم متساوية سنطبع جملة تفيد المستخدم بأنّ كلمة المرور وتأكيدها لا يتوافقان، ويمكن القيام بالأمر بالأسطر الآتية: if password == password_verification: print 'You have been successfully signed up!' else: print 'The password and the password verification don't match! Please try again' لقد انتهينا الآن من برمجة نظام التّسجيل، ويجب علينا الانتقال إلى الخطوة التّالية وهي مرحلة تسجيل الدّخول. بعد طباعة الجملة التّي تفيد بأنّ المستخدم قام بالتّسجيل بنجاح (انظر الشّيفرة أعلاه) سنطلب منه معلومات الولوج وذلك بإدخال اسم مُستخدمه وكلمة المرور، سنعيّن هذه القيم المدخلة حديثا إلى متغيّرين جديدين، وذلك لمقارنتهما مع قيم المتغيّرين القديمين، إذا كانت القيم توافق ما أدخله قبل قليل فسنطبع جملة تفيد بأنّ عمليّة الولوج قد نجحت، إذا لم يكن الأمر كذلك سنطبع جملة تفيد المستخدم بأنّ القيم التّي أدخلها خاطئة ثمّ يتوقّف البرنامج. الآن، لنطوّر الشّيفرة أعلاه وندخل عليها التّعديلات المطلوبة لإجراء عمليّة الولوج: if password == password_verification: print 'You have Successfully Signed up! \n' username_sign_in = raw_input('Enter your username please: ') password_sign_in = raw_input('Enter your password please: ') if username_sign_in == username and password_sign_in == password: print 'You have Successfully Signed in!' else: print 'username or password do not match! Please try again!' else: print 'The password and the password verification do not match! Please try again' لاحظ استخدام المعامل المنطقي and عند التّحقّق من أنّ اسم المستخدم وكلمة المرور المدخلتان (المخزّنة في المتغيّرين username_sign_in و password_sign_in) توافقان ما تم إدخاله من قبل. العامل and يحرص على أنّ كلا الشّرطين محققان. وبهذا نكون قد انتهينا من البرمجية الصغيرة والبسيطة، وهذه هي الشّيفرة الكاملة: print 'Hello User, this is a basic sign up/login Program' username = raw_input('Enter your username please: ') password = raw_input('Enter the your password please: ') password_verification = raw_input('Verify password: ') if password == password_verification: print 'You have Successfully Signed up! \n' username_sign_in = raw_input('Enter your username please: ') password_sign_in = raw_input('Enter your password please: ') if username_sign_in == username and password_sign_in == password: print 'You have Successfully Signed in!' else: print 'username or password do not match! Please try again!' else: print 'The password and the password verification do not match! Please try again' تمارين تمرين 1 ما مُخرجات البرنامج التّالي: print 2 < 3 and 3 > 1 print 2 < 3 or 3 > 1 print 2 < 3 or not 3 > 1 print 2 < 3 and not 3 > 1 تمرين 2 ما مُخرجات البرنامج التّالي: x = 4 y = 5 p = x < y or x < z print p تمرين 3 ما مُخرجات البرنامج التّالي: x = 4 y = 5 p = x < y or x < z print p تمرين 4 ماذا سيحدث بعد تنفيذ الشّيفرة التّالية، هل ستحدث أي أخطاء؟ علّل جوابك. x = 2 if x == 2: print x else: print y تمرين 5 ماذا سيحدث بعد تنفيذ الشّيفرة التّالية، هل ستحدث أي أخطاء؟ علّل جوابك. x = 2 if x == 2: print x else: x + تمرين 6 هل الإزاحة في البرنامج التّالي صحيحة؟ إذا لم يكن الأمر كذلك، فأصلح الخطأ. x = 2 if x == 2: print x if x+1 == 3: print 'x+1 = 3' else: print x + 2 مصادر درس Input and Output للكاتب Dr. Andrew N. Harrington. كتاب Python Practice Book لكاتبه Anand Chitipothu.
    1 نقطة
×
×
  • أضف...