لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
عرض المحتوى الحاصل على سمعة أكبر منذ 08/02/25 in مقالات البرمجة
-
سنبدأ في هذا المقال من سلسلة برمجة الذكاء الاصطناعي في تعلم أساسيات لغة بايثون، وهي من أهم لغات البرمجة على الإطلاق المستخدمة في مجال الذكاء الاصطناعي، ولكنها ليست لذلك فقط؛ إذ تُستعمَل لغة بايثون في كثير من المجالات الأخرى مثل برمجة المواقع وبرامج سطح المكتب وأنظمة التشغيل وغيرها. قبل البدء في أساسيات لغة بايثون: ما هي لغة البرمجة بايثون؟ تعني بايثون في اللغة الإنجليزية نوعًا من الثعابين الكبيرة، لكنها لم تُسمى لذلك بل سُمِّيَت بهذا الاسم تيمنًا ببرنامج ترفيهي قدَّمته قناة 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 اقرأ أيضًا المقال السابق: البرمجة والخوارزميات والذكاء الاصطناعي المرجع الشامل إلى تعلم لغة بايثون النسخة العربية الكاملة من كتاب البرمجة بلغة بايثون2 نقاط
-
نعيش اليوم في عصر يتصف بتفجر غير مسبوق في كمية البيانات، فكل الأجهزة التي نتعامل معها في حياتنا اليومية سواء هواتفنا الجوالة أو مواقع التجارة الإلكترونية التي نتسوق منها أو شبكات التواصل الاجتماعي التي نتصفحها بشكل يومي وحتى أجهزة الاستشعار الموجودة في أجهزة إنترنت الأشياء التي باتت منتشرة في كل مكان حولنا…إلخ. كلها تتعقبنا وتسجل بياناتنا والإجراءات التي نقوم بها والخيارات التي نتخذها ولك أن تتخيل كمية البيانات المهولة التي تولد عن كل هذا طوال الوقت! هذه البيانات الضخمة في شكلها الأولي لا تعني أي شيء في الواقع لذا كان لا بد من تحليلها واستخراج المعلومات المفيدة منها وهنا يأتي دور علم البيانات الحديث الذي يعالج كل جزء من البيانات التي يتم إنشاؤها اليوم لتطوير وتيرة الأعمال واتخاذ القرارات الصائبة والموثوقة التي تعتمد على هذه المعلومات. سنركز في مقال اليوم على أحد التخصصات المهمة في هذا العلم وهو تحليل البيانات 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 من الأساسيات حتى الاحتراف. الخلاصة تعرفنا في مقال اليوم على مفهوم تحليل البيانات واستكشفنا معًا المهام المختلفة لمحلل البيانات وكيف يتعامل مع جميع البيانات التي يتم إنشاؤها كل يوم والمتاحة في مكان عمله، من بيانات المعاملات في قاعدة بيانات تقليدية وبيانات القياس المختلفة والبيانات التي يتم جمعها من وسائل التواصل الاجتماعي وكيف يستخرج منها المعرفة التي تطور سير العمل وتحسنه للأفضل. هل لديك اهتمام بتحليل البيانات؟ إذا كانت الإجابة نعم فقد حان الوقت لتبدأ من الآن رحلتك في احتراف هذا التخصص الواعد الذي يزدهر الطلب عليه بشكل كبير في سوق العمل.1 نقطة
-
كانت لحظة مرعبة حينما جلست على حاسوبي بعد أن «عضّ القرش» كبل الإنترنت وانقطع، وأدركت حينها كم أقضي وقتًا على الإنترنت حينما أستعمل حاسوبي؛ فلدي عادة أن أتحقق من بريدي يدويًا (مع أن التنبيهات تصلني أولًا بأول!) وأفتح تويتر (إكس، سمهِّ ما شئت) وأنظر ما آخر المستجدات. كثيرٌ من عملنا على الحاسوب يتطلب وصولًا إلى الانترنت، ومصطلح «استخراج البيانات من الويب» Web scraping يستعمل مع البرامج التي تنزل المحتوى من الإنترنت وتعالجه. فمثلًا لدى غوغل عدد من البوتات لتنزيل محتوى صفحات الويب وفهرستها وأرشفتها لتستعملها في محرك البحث. سنتعلم في هذا المقال عن عددٍ من الوحدات في بايثون التي تسهل علينا استخراج البيانات من الويب: webbrowser: حزمة تأتي مع بايثون وتفتح متصفحًا على صفحة ويب معينة. requests: تنزل الملفات وصفحات الويب من الإنترنت. bs4: تفسّر شيفرات HTML التي تكتب فيها صفحات الويب. selenium: تشغل وتتحمل في متصفح ويب، والوحدة selenium قادرة على ملء الاستمارات ومحاكاة ضغطات الفأرة في المتصفح. مشروع: برنامج mapIt.py مع وحدة webbrowser الدالة open() في الوحدة webbrowser تفتح صفحة ويب معينة في نافذة متصفح جديدة. جرب ما يلي في الصدفة التفاعلية: >>> import webbrowser >>> webbrowser.open('https://academy.hsoub.com/') ستجد أكاديمية حسوب مفتوحةً في لسانٍ جديد في المتصفح. هذا كل ما تستطيع الوحدة webbrowser فعله، لكن مع ذلك يمكننا أن نجري بعض الأمور اللطيفة مع الدالة open()، فمثلًا قد تكون مهمة فتح خرائط جوجل والبحث عن عنوان معين أمرًا مملًا، ونستطيع التخلص من بضع خطوات لو كتبنا سكربتًا يفتح خرائط جوجل ويوجهها إلى عنوان الشارع المنسوخ في الحافظة لديك، وبالتالي سيكون عليك أن تنسخ العنوان إلى الحافظة وتشغل السكربت، وستفتح الخريطة لديك. هذا ما يفعله البرنامج: يحصل على عنوان الشارع من وسائط سطر الأوامر أو من الحافظة يفتح نافذة متصفح ويوجهها إلى صفحة خرائط جوجل المرتبطة بعنوان الشارع. هذا يعني أن على الشيفرة البرمجية أن تفعل ما يلي: تقرأ وسائط سطر الأوامر تقرأ محتويات الحافظة تستدعي الدالة webbrowser.open() لتفتح صفحة الويب. احفظ ملفًا جديدًا باسم mapIt.py، ولنبدأ برمجته. الخطوة 1: معرفة الرابط الصحيح اعتمادًا على التعليمات الموجودة في الملحق ب، اضبط برنامج mapIt.py ليعمل من سطر الأوامر كما في المثال الآتي: C:\> mapit 870 Valencia St, San Francisco, CA 94110 سيستخدم البرنامج وسائط سطر الأوامر بدلًا من الحافظة، وإذا لم نمرر إليه أيّة وسائط فحينها سيقرأ محتويات الحافظة. علينا بدايةً أن نحصِّل ما هو عنوان URL الذي يجب فتحه للعثور على شارع معين. إذا فتحت خرائط جوجل في المتصفح وبحثت عن عنوان فسيكون الرابط في الشريط العلوي يشبه: https://www.google.com/maps/place/870+Valencia+St/@37.7590311,-122.4215096,17z/data=!3m1!4b1!4m2!3m1!1s0x808f7e3dadc07a37:0xc86b0b2bb93b73d8 نعم العنوان في الرابط، لكن هنالك نص كثير إضافي غيره. تضيف المواقع عادةً بيانات إضافية لتتبع الزوار أو تخصيص المواقع. لكن إن حاولت الذهاب إلى الرابط التالي: https://www.google.com/maps/place/870+Valencia+St+San+Francisco+CA/ فسترى العنوان مفتوحًا أمامك. وبهذا كل ما نحتاج إليه هو فتح صفحة ويب ذات العنوان التالي: https://www.google.com/maps/place/your_address_string حيث your_address_string هو العنوان الذي تريد عرضه في الخريطة. الخطوة 2: التعامل مع وسائط سطر الأوامر يجب أن تبدو الشيفرة لديك كما يلي: #! python3 # mapIt.py - تشغيل خريطة في المتصفح باستخدام عنوان # من سطر الأوامر أو الحافظة. import webbrowser, sys if len(sys.argv) > 1: # Get address from command line. address = ' '.join(sys.argv[1:]) # TODO: الحصول على العنوان من الحافظة. بعد سطر !# سنستورد الوحدة webbrowser لتشغيل المتصفح والوحدة sys لمحاولة قراءة وسائط سطر الأوامر. يخزن المتغير sys.argv اسم الملف ووسائط سطر الأوامر، وإذا احتوت هذه القائمة على أكثر من عنصر واحد (الذي هو اسم الملف) فيجب أن تكون قيمة استدعاء len(sys.argv) أكبر من 1، وهذا يعني أن هنالك وسائط في سطر الأوامر. عادةً ما يُفصَل بين وسائط سطر الأوامر بفراغات، لكن في هذه الحالة نريد أن نفسر جميع الوسائط على أنها سلسلة نصية واحدة، ولما كانت قيمة sys.argv هي قائمة تحتوي على سلاسل نصية، فيمكننا استخدام التابع join() معها، مما يعيد سلسلة نصية واحدة؛ لكن انتبه أننا لا نريد اسم الملف ضمن تلك السلسلة النصية، فعلينا استخدام sys.arv[1:] لإزالة أول عنصر في القائمة، ثم سنتخزن تلك القيمة في المتغير address. يمكنك تشغيل البرنامج بكتابة ما يلي في سطر الأوامر: mapit 870 Valencia St, San Francisco, CA 94110 وستكون قيمة المتغير sys.argv هي القائمة: ['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110'] وبالتالي تكون قيمة المتغير address هي السلسلة النصية '870 Valencia St, San Francisco, CA 94110'. الخطوة 3: التعامل مع محتويات الحافظة وتشغيل المتصفح تأكد أن الشيفرة الخاصة بك تشبه الشيفرة الآتية: #! python3 # mapIt.py - تشغيل خريطة في المتصفح باستخدام عنوان # من سطر الأوامر أو الحافظة. import webbrowser, sys, pyperclip if len(sys.argv) > 1: # Get address from command line. address = ' '.join(sys.argv[1:]) else: # الحصول على العنوان من الحافظة. address = pyperclip.paste() webbrowser.open('https://www.google.com/maps/place/' + address) إذا لم تكن هنالك وسائط ممررة عبر سطر الأوامر، فسيفترض البرنامج أن العنوان منسوخ إلى الحافظة، ويمكننا الحصول على محتوى الحافظة باستخدام pyperclip.paste() وتخزينها في المتغير address. آخر خطوة هي تشغيل المتصفح مع توفير رابط URL صحيح لخرائط غوغل عبر webbrowser.open(). ستوفر عليك بعض البرامج التي ستطورها ساعات من العمل، لكن بعض قد يكون بسيطًا ويوفر عليك بضع ثوانٍ في كل مرة تجري فيها مهمة تكرارية مثل فتح عنوان ما على الخريطة، الجدول التالي يقارن بين الخطوات اللازمة لعرض الخريطة: فتح الخريطة يدويًا استخدام سكربت mapIt.py تحديد العنوان نسخ العنوان فتح متصفح الويب الذهاب إلى خرائط غوغل الضغط على حقل الإدخال لصق العنوان الضغط على enter تحديد العنوان نسخ العنوان تشغيل mapIt.py مقارنة الخطوات اللازمة لعرض الخريطة أفكار لبرامج مشابهة تساعدك الوحدة webbrowser إذا كان لديك عنوان URL لصفحة معينة تريد اختصار عملية فتح المتصفح والتوجه إليها، يمكنك أن تستفيد منها لإنشاء: برنامج يفتح جميع الروابط المذكورة في مستند نصي في ألسنة جديدة. برنامج يفتح المتصفح على صفحة الطقس لمدينتك. برنامج يفتح مواقع التواصل الاجتماعي التي تزورها عادة. تنزيل الملفات من الويب باستخدام الوحدة requests تسمح لك الوحدة requests بتنزيل الملفات من الويب دون أن تفكر في مشاكل الشبكة أو الاتصال أو ضغط البيانات. لا تأتي الوحدة requests مضمنةً في بايثون، وإنما عليك تثبيتها أولًا من سطر الأوامر بتشغيل الأمر pip install --user requests. أتت الوحدة requests لتقدم حلًا بديلًا لوحدة urllib2 في بايثون لأنها معقدة زيادة عن اللزوم، وأنصحك أن تزيل الوحدة urllib2 من ذهنك تمامًا، لأنها وحدة صعبة دون داعٍ، وعليك استخدام الوحدة requests دومًا. لنجرب الآن أن الحزمة requests مثبتة صحيحًا بإدخال ما يلي في الصدفة التفاعلية: import requests>>> import requests إذا لم تظهر أي رسالة خطأ فهذا يعني أن الحزمة requests مثبتة عندك. تنزيل صفحة ويب باستخدام الدالة requests.get() الدالة requests.get() تقبل سلسلةً نصيةً فيها رابط URL لتنزيلها. إذا استعملت الدالة type() على القيمة المعادة من الدالة requests.get() فسترى أن الناتج هو كائن Response، الذي يحتوي على الرد الذي تلقاه برنامجك بعد إتمام الطلبية إلى خادم الويب. سنستكشف سويةً الكائن Response بالتفصيل لاحقًا، لكن لنكتب الآن الأسطر الآتية في الطرفية التفاعلية على حاسوب متصل بالإنترنت: >>> import requests ➊ >>> res = requests.get('https://automatetheboringstuff.com/files/rj.txt') >>> type(res) <class 'requests.models.Response'> ➋ >>> res.status_code == requests.codes.ok True >>> len(res.text) 178981 >>> print(res.text[:250]) The Project Gutenberg EBook of Romeo and Juliet, by William Shakespeare This eBook is for the use of anyone anywhere at no cost and with almost no restrictions whatsoever. You may copy it, give it away or re-use it under the terms of the Proje الرابط الذي طلبناه هو مستند نصي لمسرحية روميو وجولييت على موقع الكتاب الأصلي ➊، يمكنك أن ترى نجاح الطلبية إلى صفحة الويب بالنظر إلى السمة status_code من الكائن Response، إذا كانت القيمة الخاصة بها تساوي requests.codes.ok فهذا يعني أن كل شيء على ما يرام ➋. بالمناسبة، رمز الاستجابة الذي يدل على أن الأمور على ما يرام OK في HTTP هو 200، ومن المرجح أنك تعرف الحالة 404 التي تشير إلى رابط غير موجود. يمكنك العثور على قائمة برموز الاستجابة في HTTP ومعانيها في الصفحة قائمة رموز الاستجابة في HTTP من ويكيبيديا. إذا نجحت الطلبية، فستخزن صفحة الويب التي نزلناها كسلسلة نصية في المتغير text في كائن Response. يحتوي هذا المتغير على سلسلة نصية طويلة فيها المسرحية كاملةً. وإذا استدعيت len(res.text) فسترى أنها أطول من 178,000 محرف. استدعينا في النهاية print(res.text[:250]) لعرض أول 250 محرف. إذا فشل الطلب وظهرت رسالة خطأ مثل "Failed to establish a new connection" أو "Max retries exceeded" فتأكد من اتصالك بالإنترنت. لا نستطيع نقاش جميع أسباب عدم القدرة على الاتصال بالخوادم لتعقيد الموضوع، لكن أنصحك بالبحث في الويب عن المشكلة التي تواجهك لترى حلها. التأكد من عدم وجود مشاكل كما رأينا سويةً، يملك الكائن Response السمة status_code التي تأكدنا أنها تساوي requests.codes.ok (وهو متغير فيه القيمة الرقمية 200) للتحقق من نجاح عملية التنزيل. هنالك طريقة أخرى سهلة للتحقق من نجاح التنفيذ هو استدعاء التابع raise_for_status() على الكائن Response، التي ستؤدي إلى إطلاق استثناء إذا حدث خطأ حين تنزيل الملف، ولن تفعل شيئًا إن سارت الأمور على ما يرام. جرب ما يلي في الصدفة التفاعلية: >>> res = requests.get('https://inventwithpython.com/page_that_does_not_exist') >>> res.raise_for_status() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\Al\AppData\Local\Programs\Python\Python37\lib\site-packages\requests\models .py", line 940, in raise_for_status raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 404 Client Error: Not Found for url: https://inventwithpython .com/page_that_does_not_exist.html يضمن لنا التابع ()raise_for_status أن البرنامج سيتوقف إذا حدثت مشكلة في التنزيل، وهذا مناسب جدًا إذا أردنا إيقاف البرنامج حين حصول مشكلة في التنزيل. أما لو كنا نريد استمرار البرنامج حتى لو فشل تنزيل الملف فيمكننا حينئذٍ أن نحيط التابع raise_for_status() بالتعبيرات try و except لمعالجة هذا الاستثناء: import requests res = requests.get('https://inventwithpython.com/page_that_does_not_exist') try: res.raise_for_status() except Exception as exc: print('There was a problem: %s' % (exc)) التابع raise_for_status() في الشيفرة السابقة سيؤدي إلى طباعة ما يلي: There was a problem: 404 Client Error: Not Found for url: https:// inventwithpython.com/page_that_does_not_exist.html احرص دومًا على استدعاء التابع raise_for_status() بعد استدعاء requests.get() لتضمن أن برنامجك قد نزَّل الملف دون مشاكل قبل إكمال التنفيذ. حفظ الملفات المنزلة إلى نظام الملفات يمكنك الآن حفظ صفحة الويب إلى نظام الملفات لديك باستخدام الدالة open() والتابع write()، هنالك بعض الاختلافات البسيطة عمّا فعلناه سابقًا: علينا أن نفتح الملف في وضع الكتابة بالنظام الثنائي write binary بتمرير السلسلة النصية 'wb' كوسيط ثانٍ إلى الدالة open() حتى لو كان الملف المنزل نصيًا (مثل مسرحية روميو وجولييت في المثال أعلاه)، لأننا نريد كتابة البيانات الثنائية بدلًا من البيانات النصية للحفاظ على ترميز النص encoding. لنستعمل حلقة for مع التابع iter_content() للكائن Response لكتابة صفحة الويب إلى ملف: >>> import requests >>> res = requests.get('https://automatetheboringstuff.com/files/rj.txt') >>> res.raise_for_status() >>> playFile = open('RomeoAndJuliet.txt', 'wb') >>> for chunk in res.iter_content(100000): playFile.write(chunk) 100000 78981 >>> playFile.close() يعيد التابع iter_content() قطعًا من النص في كل تكرار لحلقة التكرار، وكل قطعة يكون لها نوع البيانات bytes وتحدد لها كم بايتًا يجب أن يكون طول كل قطعة، وأرى أن مئة ألف بايت هو حجم مناسب، لذا لنمرر 100000 إلى التابع iter_content(). أنشأنا الآن الملف RomeoAndJuliet.txt في مجلد العمل الحالي، لاحظ أن اسم الملف في موقع الويب هو rj.txt بينما اسم الملف المحفوظ لدينا مختلف. تذكر أن الوحدة requests تنزل محتويات صفحات الويب لديك، وبعد تنزيلها يكون على عاتقك التعامل معها وحفظها إن شئت أينما تشاء. للمراجعة، هذه هي الخطوات الكاملة لتنزيل وحفظ ملف: استدعاء التابع requests.get() لتنزيل ملف. استدعاء open() مع الخيار 'wb' لإنشاء ملف جديد وفتحه للكتابة في الوضع الثنائي. المرور على التابع iter_content() للكائن Response. استدعاء التابع write() في كل تكرار لكتابة المحتوى إلى الملف. إغلاق الملف close(). هذا كل ما يتعلق بالوحدة requests! قد تبدو لك حلقة for مع iter_content() معقدةً مقارنةً باستخدام open() و write() و close() التي استخدمناها لكتابة الملفات النصية؛ لكننا فعلنا ذلك لنضمن أن برنامجنا لن يستهلك ذاكرة كثيرة إذا نزلنا ملفات ضخمة. يمكنك قراءة المزيد حول ميزات الوحدة requests الأخرى من requests.readthedocs.org. لغة HTML قبل أن نستخلص المعلومات من صفحات الويب، لنتعلم بعض أساسيات HTML أولًا، ولنرى كيف نصل إلى أدوات المطور في متصفح الويب، التي ستجعل عملية استخراج البيانات من الويب أمرًا سهلًا جدًا. مصادر لتعلم HTML لغة HTML هي الصيغة التي تكتب فيها صفحات الويب، ويفترض هذا المقال أن لديك بعض الأساسيات حول HTML، لكن إن كنت تريد البدء من الصفر فأنصحك أن تراجع: توثيق HTML في موسوعة حسوب. قسم HTML في أكاديمية حسوب. تذكرة سريعة في حال لم تلمس HTML من مدة، سأخبرك بملخص بسيط عنها. ملفات HTML هي ملفات نصية لها اللاحقة html، وتكون النصوص فيها محادثة بالوسوم tags، وكل وسم يكون ضمن قوسي زاوية <>، وتخبر هذه الوسوم المتصفحات كيف يجب أن تعرض الصفحة. يمكن أن يكون هنالك نص بين وسم البداية ووسم النهاية، وهذا ما يؤلف عنصرًا element. فمثلًا، الشيفرة الآتية تعرض لك Hello, world! في المتصفح، وتكون كلمة Hello بخط عريض: <strong>Hello</strong>, world! وستبدو في المتصفح كما في الشكل الآتي: مثال Hello, world! معروضة في متصفح وسم البداية <strong> يخبر المتصفح أن النص سيكون بخط عريض، ووسم النهاية </strong> يخبر المتصفح أين هي نهاية النص العريض. هنالك وسوم متنوعة في HTML، ولبعض تلك الوسوم خاصيات تُذكَر ضمن قوسَي الزاوية <>، مثلًا الوسم <a> يعني أن النص هو رابط، وتكون قيمة هذا الرابط محددة بالخاصية href. مثال: Al's free <a href="https://inventwithpython.com">Python books</a>. ستبدو صفحة الويب كما في الشكل الآتي: رابط معروض في متصفح. تمتلك بعض العناصر الخاصية id التي تستخدم لتعريف عناصر الصفحة بشكل فريد، ويمكنك أن تطلب من برامجك البحث عن عنصر ما باستخدام معرفه id، لهذا تكون معرفة قيمة id لأحد العناصر من أهم الأمور التي سنستعمل فيها أدوات المطور أثناء كتابة برامج استخلاص البيانات من صفحات الويب. عرض مصدر صفحة HTML إذا أردت إلقاء نظرة على مصدر صفحة HTML لإحدى الصفحات التي تزورها، اضغط على الزر الأيمن للفأرة واختر View page source كما في الشكل التالي. هذا النص هو ما يحصل عليه متصفحك وهو يعرف كيف يعرض الصفحة اعتمادًا على ذاك النص. عرض مصدر صفحة ويب أنصح -وبشدة- أن تجرب عرض مصدر صفحات HTML لبعض مواقعك المفضلة، حتى لو لم تفهم تمامًا كل ما تراها أمامك، فلست بحاجة إلى احتراف HTML لتعرف كيف تكتب برامج لاستخراج البيانات؛ فليس المطلوب منك برمجة موقعك الشخصي وإنما أن يكون لديك ما يكفي لتحصل البيانات المطلوبة. فتح أدوات المطور إضافةً إلى عرض المصدر، يمكنك أن تلقي نظرة على صفحات HTML باستخدام أدوات المطور في متصفحك. يمكنك أن تضغط الزر F12 في كروم لإظهارها، أو الضغط على F12 مرة أخرى لإخفائها. يمكنك أيضًا فتحها من القائمة الجانبية ثم Developer Tools، أو الضغط على ⌘-⌥-I في ماك. أدوات المطور في متصفح كروم أما في فايرفكس، فيمكنك فتح أدوات المطور بالضغط على Ctrl+Shift+C في ويندوز ولينكس، أو ⌘-⌥-C في ماك، وأدوات المطور هنا تشبه كروم كثيرًا. بعد تفعيل أدوات المطور في متصفحك، يمكنك الضغط بالزر الأيمن للفأرة على أي عنصر واختيار Inspect Element في القائمة المنبثقة لترى شيفرة HTML المسؤولة عن ذاك الجزء من الصفحة. ستستفيد من ذلك كثيرًا عندما تبدأ تفسير صفحات HTML لاستخراج البيانات منها. استخدام أدوات المطور للعثور على عناصر HTML بعد أن نزل برنامج صفحة الويب باستخدام الوحدة requests فسيكون لدينا صفحة الويب كاملةً كسلسلة نصية واحدة، وعلينا أن نجد طريقة لمعرفة ما هي عناصر HTML التي تحتوي على المعلومات التي نريد استخراجها من الصفحة. ستساعدنا هنا أدوات المطور في ذلك. لنقل مثلًا أننا نريد كتابة برنامج لجلب بيانات الطقس من موقع weather.gov. لكن قبل أن نبدأ بكتابة الشيفرات فعلينا القيام ببعض التحريات أولًا. إذا زرنا الموقع وبحثنا عن الرمز البريدي 94105 فستحصل على صفحة تظهر لك الطقس في تلك المنطقة. ماذا إن كانت مهتمًا باستخراج بيانات الطقس لهذا العنوان البريدي؟ اضغط بالزر الأيمن على مكان معلومات الطقس في تلك الصفحة واختر Inspect Element من القائمة، وستظهر لك نافذة أدوات المطور، التي تريك شيفرات HTML المسؤولة عن ذاك الجزء من الصفحة كما يظهر في الشكل التالي. انتبه إلى أن الموقع قد يتغير دوريًا وقد تظهر لك عناصر مختلفة وعليك اتباع نفس الخطوات لتفحص العناصر الجديدة. تفحص عناصر صفحة الطقس باستخدام أدوات المطور يمكننا أن نرى ما هي شيفرة HTML المسؤولة عن عرض الطقس في الصفحة السابقة، وهي: <div class="col-sm-10 forecast-text">Sunny, with a high near 64. West wind 11 to 16 mph, with gusts as high as 21 mph.</div> هذا ما نبحث عنه تمامًا، يبدو أن معلومات الطقس موجودة داخل عنصر <div> له صنف CSS باسم forecast-text. اضغط بالزر الأيمن على العنصر في أدوات المطور واختر من القائمة Copy ▸ CSS Selector، وستُنسَخ لك سلسلة نصية مثل الآتية إلى الحافظة: 'div.row-odd:nth-child(1) > div:nth-child(2)' ويمكنك أن تستخدم تلك السلسلة النصية مع التابع ذ في BS4 أو find_element_by_css_selector() في Selenium كما هو مشروح في هذا المقال. الآن وبعد أن عرفت ما الذي تبحث عنه تحديدًا، يمكن لوحدة Beautiful Soup أن تساعدك في العثور عليه. تفسير HTML مع وحدة BS4 تستخدم الوحدة Beautiful Soup في استخراج المعلومات من صفحة HTML، واسم الوحدة في بايثون هو bs4 للإشارة إلى الإصدار الرابع منها، ويمكننا تثبيتها عبر الأمر pip install --user beautifulsoup4 (راجع الملحق أ لتعليمات حول تثبيت الوحدات). صحيح أننا استخدمنا beautifulsoup4 لتثبيت الوحدة، لكن حين استيرادها في بايثون سنستعمل import bs4. ستكون أمثلتنا عن BS4 عن تفسير ملف HTML (أي تحليلها والتعرف على أجزائها) مخزن محليًا على حاسوبنا. افتح لسانًا جديدًا في محرر Mu وأدخل ما يلي فيه واحفظه باسم example.html: <!-- This is the example.html example file. --> <html><head><title>The Website Title</title></head> <body> <p>Download my <strong>Python</strong> book from <a href="https:// inventwithpython.com">my website</a>.</p> <p class="slogan">Learn Python the easy way!</p> <p>By <span id="author">Al Sweigart</span></p> </body></html> نعم، حتى ملفات HTML البسيطة فيها مختلف العناصر والخاصيات، وستكون الأمور أعقد بكثير في المواقع الكبيرة، لكن مكتبة BS4 هنا لمساعدتنا وتسهيل الأمر علينا. إنشاء كائن BeautifulSoup من سلسلة HTML نصية يمكننا استدعاء الدالة bs4.BeautifulSoup() مع تمرير سلسلة نصية تحتوي على شيفرة HTML التي ستفسر. تعيد الدالة bs4.BeautifulSoup() كائن BeautifulSoup. جرب ما يلي في الصدفة التفاعلية على حاسوبك مع وجود إنترنت: >>> import requests, bs4 >>> res = requests.get('https://academy.hsoub.com') >>> res.raise_for_status() >>> academySoup = bs4.BeautifulSoup(res.text, 'html.parser') >>> type(academySoup) <class 'bs4.BeautifulSoup'> هذه الشيفرة تستعمل requests.get() لتنزيل صفحة الويب من موقع أكاديمية حسوب ثم تمرر قيمة السمة text للرد إلى الدالة bs4.BeautifulSoup() التي تعيد كائن BeautifulSoup نخزنه في المتغير academySoup. يمكننا أيضًا تحميل ملف HTML من القرص لدينا بتمرير كائن File إلى الدالة bs4.BeautifulSoup() مع وسيط ثانٍ يخبر وحدة BS4 ما المفسر الذي عليها استعماله لتفسير الملف. أدخل ما يلي في الصدفة التفاعلية مع التأكد أنك في نفس المجلد الذي يحتوي على ملف example.html: >>> exampleFile = open('example.html') >>> exampleSoup = bs4.BeautifulSoup(exampleFile, 'html.parser') >>> type(exampleSoup) <class 'bs4.BeautifulSoup'> المفسر 'html.parser' المستخدم هنا يأتي مع بايثون، لكن يمكنك استخدام المفسر 'lxml' الأسرع إذا ثبتت الوحدة الخارجية lxml. اتبع التعليمات الموجودة في الملحق أ لتثبيت الوحدة باستخدام الأمر pip install --user lxml. إذا لم نضمِّن الوسيط الثاني الذي يحدد المفسر فسيظهر التحذير: UserWarning: No parser was explicitly specified. بعد أن يكون لدينا كائن BeautifulSoup سنتمكن من استخدام توابعه لتحديد أجزاء معينة من مستند HTML. العثور على عنصر باستخدام التابع select() يمكنك الحصول على عنصر من عناصر صفحة الويب في الكائن BeatuifulSoup باستدعاء التابع select() وتمرير محدد CSS (أي CSS Selector) للعنصر الذي تبحث عنه. المحددات تشبه التعابير النمطية في وظيفتها: تحدد نمطًا يمكن البحث عنه في صفحات الويب. نقاش محددات CSS خارج سياق هذه السلسلة، لكن هذه مقدمة مختصرة عنها في الجدول التالي، وأنصحك بالاطلاع على توثيق المحددات في موسوعة حسوب. المحدد الذي يمرر إلى التابع ()select سيطابق soup.select('div') جميع عناصر <div> soup.select('#author') جميع العناصر التي لها الخاصية id وقيمتها author soup.select('.notice') جميع العناصر التي لها خاصية class ولها صنف CSS باسم notice soup.select('div span') جميع عناصر <span> الموجود داخل عناصر <div> soup.select('div > span') جميع العناصر <span> الموجودة مباشرةً داخل عناصر <div> بدون وجود أي عنصر بينهما soup.select('input[name]') جميع عناصر <input> التي لها الخاصية name بغض النظر عن قيمتها soup.select('input[type="button"]') جميع عناصر <input> التي لها الخاصية type وتكون مساوية إلى button أمثلة عن محددات CSS يمكن دمج مختلف أنماط المحددات مع بعضها لمطابقة أنماط أكثر تعقيدًا، فمثلًا soup.select('p #author') ستطابق أي عنصر له خاصية id قيمتها author لكن يجب أن يكون هذا العنصر موجودًا داخل عنصر <p>. بدلًا من محاولة كتابة المحددات بنفسك، يمكنك الضغط بالزر الأيمن على أي عنصر في صفحة الويب واختيار Inspect Element، وحينما تفتح أدوات المطور اضغط بالزر الأيمن على عنصر HTML واختر Copy ▸ CSS Selector لنسخ محدد CSS إلى الحافظة لتستطيع لصقه في الشيفرة لديك. التابع select() سيعيد قائمةً بعناصر Tag، وهذا ما تفعله وحدة BS4 لتمثيل عنصر HTML. هذه القائمة ستحتوي على كائن Tag لكل مطابقة للمحدد في كائن BeautifulSoup. يمكن تمرير كائن Tag إلى الدالة str() لعرض وسوم HTML التي تمثلها. تمتلك قيم Tag أيضًا السمة attrs التي تظهر جميع خاصيات HTML للعنصر ممثلةً كقاموس. لنجرب على ملف example.html بإدخال ما يلي في الصدفة التفاعلية: >>> import bs4 >>> exampleFile = open('example.html') >>> exampleSoup = bs4.BeautifulSoup(exampleFile.read(), 'html.parser') >>> elems = exampleSoup.select('#author') >>> type(elems) # elems هي قائمة من كائنات Tag <class 'list'> >>> len(elems) 1 >>> type(elems[0]) <class 'bs4.element.Tag'> >>> str(elems[0]) # تحويل الكائن إلى سلسلة نصية. '<span id="author">Al Sweigart</span>' >>> elems[0].getText() 'Al Sweigart' >>> elems[0].attrs {'id': 'author'} ستستخرج الشيفرة السابقة العنصر الذي له id="author" في مستند HTML. سنستخدم select('#author') للحصول على قائمة بجميع العناصر التي لها id="author"، وسنخزن قائمة كائنات Tag في المتغير elems، وسيخبرنا التعبير len(elems) أن لدينا كائن Tag وحيد في القائمة، أي جرت عملية المطابقة لعنصر HTML وحيد. استدعاء التابع getText() على العناصر سيعيد النص الموجود في العنصر، أي السلسلة النصية الموجودة بين وسم البدء والإغلاق. أما تمرير الكائن إلى الدالة str() سيعيد سلسلة نصيةً فيها وسمَي البداية والنهاية مع نص العنصر؛ أما السمة attrs فستعطينا قاموسًا فيه خاصيات العنصر كاملةً. يمكنك أيضًا استخراج جميع عناصر <p> من كائن BeautifulSoup كما في المثال الآتي: >>> pElems = exampleSoup.select('p') >>> str(pElems[0]) '<p>Download my <strong>Python</strong> book from <a href="https:// inventwithpython.com">my website</a>.</p>' >>> pElems[0].getText() 'Download my Python book from my website.' >>> str(pElems[1]) '<p class="slogan">Learn Python the easy way!</p>' >>> pElems[1].getText() 'Learn Python the easy way!' >>> str(pElems[2]) '<p>By <span id="author">Al Sweigart</span></p>' >>> pElems[2].getText() 'By Al Sweigart' ستعطينا select() ثلاث مطابقات، والتي ستخزن في المتغير pElems. سنجرب استخدام str() على الكائنات pElems[0] و pElems[1] و pElems[2] لعرض العناصر كسلاسل نصية، وسنجرب أيضًا التابع getText() لإظهار نص تلك العناصر فقط. الحصول على معلومات من خاصيات العنصر يسهل علينا التابع get() الخاص بكائنات Tag الوصول إلى خاصيات العناصر، ونمرر لهذا التابع سلسلةً نصيةً باسم الخاصية attribute وسيعيد لنا قيمتها. لنجرب المثال الآتي على الملف example.html: >>> import bs4 >>> soup = bs4.BeautifulSoup(open('example.html'), 'html.parser') >>> spanElem = soup.select('span')[0] >>> str(spanElem) '<span id="author">Al Sweigart</span>' >>> spanElem.get('id') 'author' >>> spanElem.get('some_nonexistent_addr') == None True >>> spanElem.attrs {'id': 'author'} يمكننا استخدام select() للعثور على أي عناصر <span> ثم تخزين أول عنصر مطابق في المتغير spanElem، الذي سنمرر للتابع get() القيمة 'id' للحصول على قيمة المعرف الخاصة به، وهي 'author' في مثالنا. مشروع: فتح جميع نتائج البحث في كل مرة أبحث فيها في جوجل، لا أريد أن أرى نتيجة بحث واحدة فقط ثم أنتقل إلى النتيجة التي بعدها، بل أضغط بسرعة على الزر الأوسط للفأرة على كل الروابط (أو الضغط عليها مع زر Ctrl) لفتحها في لسان جديد وأقرؤها معًا لاحقًا. فعلت هذا الأمر كثيرًا في جوجل لدرجة أنني مللت من البحث ثم الضغط على كل الروابط واحدًا واحدًا. ماذا لو كتبت برنامجًا أستطيع عبره كتابة عبارة البحث وسيفتح لي متصفحًا فيه كل نتائج البحث الأولى مفتوحةً كل واحد منها في لسان في المتصفح؟ لنكتب سكربتًا يفعل ذلك مع صفحة نتائج بحث فهرس حزم بايثون. يمكن تعديل هذا البرنامج ليعمل على الكثير من المواقع الأخرى، لكن انتبه إلى أن محركات البحث غوغل و DockDockGo عادةً ما تصعب عملية استخراج نتائج البحث من مواقعها. هذا ما يفعله البرنامج: الحصول على عبارة البحث من سطر الأوامر الحصول على صفحة نتائج البحث فتح لسان متصفح جديد لكل نتيجة هذا يعني أن على برنامجك أن يفعل ما يلي: قراءة وسائط سطر الأوامر من sys.argv. الحصول على صفحة نتائج البحث عبر الوحدة requests. العثور على جميع روابط نتائج البحث. استدعاء الدالة webbrowser.open() لفتحها في المتصفح. لنبدأ البرمجة بفتح ملف جديد باسم searchpypi.py في محررنا. الخطوة 1: الحصول على وسائط سطر الأوامر وطلب صفحة نتائج البحث قبل أن نبدأ بالبرمجة، علينا أن نعرف ما هو رابط URL لصفحة نتائج البحث. انظر إلى شريط العنوان في المتصفح بعد إتمامك لعملية البحث، وسترى أن الرابط يشبه https://pypi.org/search/?q=SEARCH_TERM_HERE. يمكننا استخدام الوحدة requests لتنزيل هذه الصفحة، ثم استخدام BS4 للبحث عن الروابط في مستند HTML. يمكننا في النهاية أن نستعمل وحدة webbrowser لفتح تلك الروابط في ألسنة جديدة. يحب أن تكون الشيفرة كما يلي: #! python3 # searchpypi.py - فتح عدة نتائج بحث. import requests, sys, webbrowser, bs4 print('Searching...') # عرض النص ريثما تحمل الصفحة res = requests.get('https://pypi.org/search/?q=' + ' '.join(sys.argv[1:])) res.raise_for_status() # TODO: Retrieve top search result links. # TODO: فتح لسان لكل نتيجة. سيحدد المستخدم كلمات البحث عبر تمريرها إلى سطر الأوامر أثناء تشغيل البرنامج، وستخزن في sys.argv كما رأينا في المقالات السابقة لهذه السلسلة. الخطوة 2: العثور على كل النتائج ستحتاج الآن إلى وحدة BS4 لاستخراج نتائج البحث من مستند HTML المنزل. لكن كيف يمكننا معرفة المحدد المناسب لحالتنا؟ ليس من المنطقي مثلًا البحث عن جميع عناصر <a> لوجود روابط كثيرة لا تهمنا؛ والحل هنا أن نفتح أدوات المطور في المتصفح وننظر إلى المحدد المناسب الذي سينتقي لنا الروابط التي نريدها فقط. بعد أن نبحث فسنجد بعض العناصر التي تشبه التالي: <a class="package-snippet" href="/project/pyautogui/"> ولا يهمنا إن كانت تلك العناصر معقدة، وإنما نحتاج إلى النمط الذي علينا استخدامه للبحث عن الروابط. لنعدل شيفرتنا إلى: #! python3 # searchpypi.py - Opens several google results. import requests, sys, webbrowser, bs4 --snip-- # Retrieve top search result links. soup = bs4.BeautifulSoup(res.text, 'html.parser') # فتح لسان لكل نتيجة. linkElems = soup.select('.package-snippet') إذا ألقيت نظرةً إلى عناصر <a> فستجد أن جميع نتائج البحث لها الخاصية class="package-snippet" وإذا بحثنا في كامل مصدر الصفحة فسنتأكد أن الصنف package-snippet ليس مستخدمًا إلا لروابط نتائج البحث. لا يهمنا ما هو الصنف package-snippet ولا ما يفعل، وإنما يهمنا كيف سنستفيد منه لتحديد عناصر <a> التي نبحث عنها. لننشِئ كائن BeautifulSoup من صفحة HTML التي نزلناها ونستخدم المحدد '.package-snippet' لتحديد جميع عناصر <a> التي لها صنف CSS المحدد؛ ضع في ذهنك أن موقع PyPI قد يحدث واجهته الرسومية وقد تحتاج إلى استخدام محدد CSS مختلف مستقبلًا، إن حدث ذلك فمرر المحدد الجديد إلى التابع soup.select() وسيعمل البرنامج على ما يرام. الخطوة 3: فتح نتائج البحث في المتصفح لنخبر برنامجنا الآن أن يفتح لنا النتائج الأولى في متصفح الويب. أضف ما يلي إلى برنامجك: #! python3 # searchpypi.py - فتح عدة نتائج بحث. import requests, sys, webbrowser, bs4 --snip-- # فتح لسان لكل نتيجة. linkElems = soup.select('.package-snippet') numOpen = min(5, len(linkElems)) for i in range(numOpen): urlToOpen = 'https://pypi.org' + linkElems[i].get('href') print('Opening', urlToOpen) webbrowser.open(urlToOpen) سيفتح البرنامج افتراضيًا أول خمسة روابط في المتصفح باستخدام الوحدة webbrowser، لكن قد يكون ناتج بحث المستخدم أقل من خمس نتائج، فحينها ننظر أيهما أقل، 5 أم عدد عناصر القائمة المعادة من استدعاء التابع soup.select(). الدالة المضمنة في بايثون min() تعيد العدد الأصغر من الوسائط الممررة إليها (والدالة max() تفعل العكس). يمكنك أن تستخدم الدالة min() لمعرفة إذا كان عدد الروابط أقل من 5 وتخزين الناتج في المتغير numOpen، والذي ستستفيد منه في حلقة for عبر range(numOpen). سنستخدم الدالة webbrowser.open() في كل تكرار لحلقة for لفتح الرابط في المتصفح. لاحظ أن قيمة الخاصية href في عناصر <a> لا تحتوي على https://pypi.org لذا علينا إضافتها بأنفسنا إلى قيمة الخاصية href قبل فتح الرابط. يمكنك الآن فتح أول 5 نتائج بحث عن «boring stuff» في محرك بحث PyPI بكتابة الأمر searchpypi boring stuff في سطر الأوامر. أفكار لبرامج مشابهة من الجميل أن يكون لدينا برنامج يفتح لنا عدة ألسنة في المتصفح لأي عملية روتينية مكررة، مثل: فتح جميع صفحات المنتجات في متجر أمازون بعد البحث عن منتج معين. فتح كل روابط المراجعات لمنتج ما. فتح الصور الناتجة بعد إجراء عملية بحث سريعة على أحد مواقع الصور مثل Flickr. مشروع: تنزيل كل رسمات XKCD عادةً ما تحدث المواقع والمدونات الصفحة الرئيسية لها بعرض آخر منشور فيها، مع وجود زر «السابق» الذي يأخذك إلى المنشور السابق، ثم تجد في المنشور السابق زرًا يأخذك للمنشور الذي قبله، وهلم جرًا، مما ينشِئ سلسلةً من الصفحات التي تأخذك من الصفحة الرئيسية إلى صفحة أول منشور في الموقع. إذا أردت نسخةً من محتوى موقعٍ ما لتقرأها وأنت غير متصل بالإنترنت، فيمكنك أن تفتح بنفسك كل صفحة وتحفظها، لكن هذا الأمر ممل جدًا ومن المناسب كتابة برنامج لأتمتة هذه المهمة. موقع XKCD هو موقع كوميكس له نفس البنية المذكورة. وصفحته الرئيسية فيها زر Prev للعودة إلى الكوكميس السابقة، لكن عملية تنزيل كل الكوميكس واحدةً واحدةً تأخذ وقتًا كثيرًا، لكننا نستطيع كتابة سكربت لأتمتة ذلك في ثوانٍ معدودة. هذا ما سيفعله برنامجنا: فتح صفحة XKCD الرئيسية حفظ صورة الكوميكس في تلك الصفحة الانتقال إلى صفحة الكوميكس السابق تكرار العملية حتى الوصول إلى أول صورة كوميكس. هذا يعني أن الشيفرة البرمجية ستفعل ما يلي: تنزيل الصفحات باستخدام الوحدة requests. العثور على رابط URL لصورة الكوميكس باستخدام وحدة BS4. تنزيل وحفظ صورة الكوميكس إلى نظام الملفات باستخدام iter_content(). العثور على رابط صورة الكوميكس السابقة، وتكرار العملية كلها. افتح ملفًا جديدًا في محررك وسمِّه باسم downloadXkcd.py. الخطوة 1: تصميم البرنامج إذا فتحت أدوات المطور في المتصفح ونظرت إلى عناصر الصفحة، فسترى ما يلي: رابط URL لملف صورة الكوميكس في الخاصية href في العنصر <img>. العنصر <img> موجود داخل العنصر <div id="comic">. الزر Perv له الخاصية rel وقيمتها prev. صفحة أول صورة كوميكس يشير فيها الزر Prev إلى الرابط https://xkcd.com/# مما يشير إلى عدم وجود صفحات سابقة. عدّل الشيفرة لتبدو كما يلي: #! python3 # downloadXkcd.py - تنزيل كل صورة كوميكس في XKCD. import requests, os, bs4 url = 'https://xkcd.com' # starting url os.makedirs('xkcd', exist_ok=True) # store comics in ./xkcd while not url.endswith('#'): # TODO: Download the page. # TODO: Find the URL of the comic image. # TODO: Download the image. # TODO: حفظ الصورة إلى ./xkcd. # TODO: الحصول على رابط الصفحة السابقة. print('Done.') سيكون لدينا متغير اسمه url يبدأ بالقيمة 'https://xkcd.com' وتحدث قيمته دوريًا ضمن حلقة for لتصبح الرابط الموجود في الزر Prev للصفحة الحالية. وسننزل صورة الكوميكس في كل تكرار من تكرارات حلقة for الموجودة في الرابط url، وسننتهي من حلقة التكرار حينما تنتهي قيمة url بالعلامة '#'. سننزل ملفات الصور إلى مجلد موجود في مجلد العمل الحالي باسم xkcd، وسنتأكد من أن المجلد موجود باستدعاء os.makedirs() مع تمرير وسيط الكلمات المفتاحية exist_ok=True الذي يمنع الدالة من رمي استثناء إن كان المجلد موجودًا مسبقًا. بقية الشيفرة هو تعليقات سنملؤها في الأقسام القادمة. الخطوة 2: تنزيل صفحة الويب لنكتب الشيفرة الآتية التي ستنزل الصفحة: #! python3 # downloadXkcd.py - تنزيل كل صورة كوميكس في XKCD. import requests, os, bs4 url = 'https://xkcd.com' # starting url os.makedirs('xkcd', exist_ok=True) # store comics in ./xkcd while not url.endswith('#'): # Download the page. print('Downloading page %s...' % url) res = requests.get(url) res.raise_for_status() soup = bs4.BeautifulSoup(res.text, 'html.parser') # TODO: Find the URL of the comic image. # TODO: Download the image. # TODO: حفظ الصورة إلى ./xkcd. # TODO: الحصول على رابط الصفحة السابقة. print('Done.') لنطبع بدايةً قيمة url ليعرف المستخدم ما هو رابط URL الذي يحاول البرنامج تنزيله، ثم سنستخدم الدالة requests.get() في الوحدة requests لتنزيل الصفحة. ثم سنستدعي التابع raise_for_status() كالعادة لرمي استثناء إن حدثت مشكلة ما في التنزيل؛ ثم إن سارت الأمور على ما يرام فسننشِئ كائن BeautifulSoup من نص الصفحة المنزلة. الخطوة 3: البحث عن صورة الكوميكس وتنزيلها لنعدل شيفرة برنامجنا: #! python3 # downloadXkcd.py - تنزيل كل صورة كوميكس في XKCD. import requests, os, bs4 --snip-- # Find the URL of the comic image. comicElem = soup.select('#comic img') if comicElem == []: print('Could not find comic image.') else: comicUrl = 'https:' + comicElem[0].get('src') # Download the image. print('Downloading image %s...' % (comicUrl)) res = requests.get(comicUrl) res.raise_for_status() # TODO: حفظ الصورة إلى ./xkcd. # TODO: الحصول على رابط الصفحة السابقة. print('Done.') بعد تفحص صفحة XKCD عبر أدوات المطور، سنعرف أن عنصر <img> لصورة الكوميكس موجود داخل عنصر <div> له الخاصية id التي قيمتها هي comic، وبالتالي سيكون المحدد '#comic img' صحيحًا لتحديد العنصر <img> عبر كائن BeautifulSoup. تمتلك بعض صفحات موقع XKCD على محتوى خاص لا يمثل صورة بسيطة، لكن لا بأس فيمكننا تخطي تلك الصفحات، فإن لم يطابِق المحدد الخاص بنا أي عنصر فسيعيد استدعاء soup.select('#comic img') قائمة فارغة، وحينها سيظهر برنامجنا رسالة خطأ ويتجاوز الصفحة دون تنزيل الصورة. عدا ذلك، فسيعيد المحدد السابق قائمةً فيها عنصر <img> وحيد، ويمكننا الحصول على قيمة الخاصية src لعنصر <img>ونمررها إلى requests.get() لتنزيل صورة الكوميكس. الخطوة 4: حفظ الصورة والعثور على الصفحة السابقة لنعدل الشيفرة لتصبح كما يلي: #! python3 # downloadXkcd.py - تنزيل كل صورة كوميكس في XKCD. import requests, os, bs4 --snip-- # حفظ الصورة إلى ./xkcd. imageFile = open(os.path.join('xkcd', os.path.basename(comicUrl)), 'wb') for chunk in res.iter_content(100000): imageFile.write(chunk) imageFile.close() # الحصول على رابط الصفحة السابقة. prevLink = soup.select('a[rel="prev"]')[0] url = 'https://xkcd.com' + prevLink.get('href') print('Done.') أصبح لدينا ملف صورة الكوميكس مخزنًا في المتغير res، وعلينا كتابة بيانات هذه الصورة إلى ملف في نظام الملفات المحلي لدينا. سنحدد اسم الملف المحلي للصورة ونمرره إلى الدالة open()، لاحظ أن المتغير comicUrl يحتوي على قيمة تشبه القيمة الآتية: 'https://imgs.xkcd.com/comics/heartbleed_explanation.png' ويبدو أنك لاحظت وجود مسار الملف فيها. يمكنك استخدام الدالة os.path.basename() مع comicUrl لإعادة آخر جزء من رابط URL السابق، أي 'heartbleed_explanation.png'، ويمكنك حينها استخدام هذا الاسم حين حفظ الصورة إلى نظام الملفات المحلي. يمكنك أن تضيف هذا الاسم إلى اسم مجلد xkcd باستخدام الدالة os.path.join() كما تعلمنا سابقًا لكي يستخدم برنامجك الفاصل الصحيح (الخط المائل الخلفي \ في ويندوز، والخط المائل / في لينكس وماك). أصبح لدينا الآن اسم ملف صحيح، ويمكننا استدعاء الدالة open() لفتح ملف جديد بوضع الكتابة الثنائية 'wb'. إذا كنت تذكر حينما حفظنا الملفات التي نزلناها عبر الوحدة requests في بداية المقال كنا نمر بحلقة تكرار على القيمة المعادة من التابع iter_content()، وستكتب الشيفرة الموجودة في حلقة for قطعًا من بيانات الصورة (كحد أقصى 100,000 بايت كل مرة) إلى الملف، ثم تغلق الملف. أصبحت الصورة محفوظة لديك محليًا الآن! علينا بعدئذٍ استخدام المحدد 'a[rel="prev"]' لتحديد العنصر <a> الذي له العلاقة rel مضبوطةً إلى prev. يمكنك استخدام قيمة الخاصية href لعنصر <a> المحدد للحصول على رابط صورة الكوميكس السابقة، والتي ستخزن في المتغير url، ثم ستدور حلقة while مرة أخرى وتعيد تنفيذ عملية التنزيل من جديد على الصفحة الجديدة. سيبدو ناتج تنفيذ البرنامج كما يلي: Downloading page https://xkcd.com... Downloading image https://imgs.xkcd.com/comics/phone_alarm.png... Downloading page https://xkcd.com/1358/... Downloading image https://imgs.xkcd.com/comics/nro.png... Downloading page https://xkcd.com/1357/... Downloading image https://imgs.xkcd.com/comics/free_speech.png... Downloading page https://xkcd.com/1356/... Downloading image https://imgs.xkcd.com/comics/orbital_mechanics.png... Downloading page https://xkcd.com/1355/... Downloading image https://imgs.xkcd.com/comics/airplane_message.png... Downloading page https://xkcd.com/1354/... Downloading image https://imgs.xkcd.com/comics/heartbleed_explanation.png... --snip– هذا المشروع هو مثال ممتاز لبرامج تتبع الروابط تلقائًا لاستخراج كمية معلومات كبيرة من الويب. يمكنك تعلم المزيد من المعلومات حول ميزات Beautiful Soup الأخرى من توثيقها الرسمي. أفكار لبرامج مشابهة تنزيل صفحات الويب وتتبع الروابط فيها هو أساس أي برنامج زحف crawler. يمكنك أن تبرمج برامج تفعل ما يلي: تنسخ موقعًا كاملًا احتياطيًا. تنسخ جميع التعليقات من أحد المنتديات. تعرض قائمة بجميع المنتجات التي عليها تخفيضات في أحد المتاجر. الوحدتان requests و bs4 رائعتين جدًا، لكن عليك أن تعرف ما هو رابط URL المناسب لتمريره إلى requests.get()، لكن في بعض الأحيان قد لا يكون ذلك سهلًا؛ أو ربما عليك تسجيل الدخول إلى أحد المواقع قبل بدء عملية الاستخراج، لهذا السبب سنستكشف سويةً الوحدة selenium لأداء مهام معقدة. التحكم في المتصفح عبر الوحدة selenium تسمح الوحدة selenium لبايثون بالتحكم برمجيًا بالمتصفح بضغط الروابط وتعبئة الاستمارات، مثلها كمثل أي تفاعل من مستخدم بشري. يمكننا أن نتفاعل مع صفحات الويب بطرائق أكثر تقدمًا في الوحدة selenium مقارنة مع requests و bs4، لكنها قد تكون أبطأ وأصعب بالتشغيل في الخلفية لأننا نفتح متصفح ويب كامل مقارنة بتنزيل بعض الصفحات من الويب. لكن إن كان علينا التعامل مع صفحات الويب بطريقة تعتمد على شيفرات JavaScript التي تحدث الصفحة، فعلينا استخدام selenium بدلًا من requests. أضف إلى ذلك أن المواقع الشهيرة مثل أمازون تستخدم برمجيات للتعرف على الزيارات الآتية من سكربتات التي تحاول استخراج البيانات من صفحاتها أو إنشاء عدّة حسابات مجانية، ومن المرجح أن تحجب هذه المواقع برامجك بعد فترة؛ وهنا تأتي الوحدة selenium التي تعمل مثل متصفحات الويب العادية. أحد أشهر العلامات التي تتعرف فيها المواقع أن الزيارات آتية من برنامج (أو سكربت script) هي عبارة user-agent، التي تُعرِّف متصفح الويب المستخدم وتضمَّن في كل طلبيات HTTP. فمثلًا تكون عبارة user-agent للوحدة requests شيء يشبه 'python-requests/2.21.0'. يمكنك زيارة موقع مثل whatsmyua.info لتعرف ما هي user-agent الخاصة بك. أما الوحدة selenium فمن المرجح أن تظن المواقع أنها مستخدم بشري، لأنها تستخدم user-agent شبيه بالمتصفحات العادية مثل: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0 ولأن نمط التصفح فيها يشبه المتصفحات الأخرى، فستُنزَّل الصور والإعلانات وملفات تعريف الارتباط والمتتبعات كما في المتصفحات العادية. لكن يمكن للمواقع كشف selenium وتحاول شركات شراء بطاقات الدخول والمتاجر الإلكترونية حجب أي سكربتات تستعمل متصفح selenium. تشغيل متصفح تتحكم فيه selenium سنرى في الأمثلة القادمة كيفية التحكم في متصفح فيرفكس من selenium، إذا لم يكن مثبتًا لديك فيمكنك تنزيله من getfirefox.com، ويمكنك تثبيت selenium،من سطر الأوامر بتشغيل pip install --user selenium، وأذكرك بالذهاب إلى الملحق أ لمزيد من المعلومات. قد يكون استيراد مكونات selenium مختلفًا عليك، فبدلًا من import selenium سنستعمل from selenium import webdriver (سبب فعل selenium لذلك خارج نطاق هذه السلسلة لا تقلق حوله). يمكنك بعد ذلك تشغيل فايرفوكس مع selenium بكتابة ما يلي في الصدفة التفاعلية: >>> from selenium import webdriver >>> browser = webdriver.Firefox() >>> type(browser) <class 'selenium.webdriver.firefox.webdriver.WebDriver'> >>> browser.get('https://inventwithpython.com') ستلاحظ أن متصفح فايرفوكس قد بدأ بالعمل حين استدعاء webdriver.Firefox(). استدعاء type() على webdriver.Firefox() سيظهر أنها من نوع البيانات WebDrive، واستدعاء التالي: browser.get('https://inventwithpython.com') سيوجه المتصفح إلى https://inventwithpython.com/. بعد استدعاء webdriver.Firefox() و get() ستفتح الصفحة في متصفح فايرفوكس إذا واجهت مشكلة من قبيل 'geckodriver' executable needs to be in PATH فهذا يعني أن عليك تنزيل محرك فايرفوكس يدويًا قبل استخدام selenium للتحكم به. يمكنك التحكم بمتصفحات أخرى غير فيرفكس إذا ثبتت محرك الويب لهم webdriver. لمتصفح فايرفوكس، اذهب إلى github.com وثبت محرك geckodriver لنظام تشغيلك. (كلمة «Gecko» هي اسم محرك المتصفح engine في فيرفكس). سيحتوي الملف المضغوط المنزل على geckodriver.exe في ويندوز أو geckodriver في ماك ولينكس، وعليك وضعه في مسار PATH الخاص في نظامك، راجع الإجابة الآتية stackoverflow.com. أما لمتصفح كروم فاذهب إلى chromium.org ونزل الملف المضغوط المناسب لنظامك، وضع الملف chromedriver.exe أو chromedriver في مسار PATH كما ذكرنا أعلاه. يمكن فعل نفس الأمر لبقية المتصفحات الرئيسية، ابحث سريعًا في الويب عن اسم المتصفح متبوعًا بالكلمة webdriver وستجدها. قد تواجه مشاكل في تشغيل المتصفحات الجديدة في selenium، بسبب عدم التوافقية بينهما، لكن يمكنك إجراء حل التفافي بتثبيت نسخة قديمة من المتصفح أو من وحدة selenium. يمكنك معرفة تاريخ الإصدارات من pypi.org. للأسف قد تحدث مشاكل توافقية بين selenium وبعض إصدارات المتصفحات، وأنصحك حينها بالبحث في الويب عن الحلول المقترحة، وراجع الملحق أ لمعلومات حول تثبيت إصدار محدد من selenium (مثل تثبيت pip install --user -U selenium==3.14.1). العثور على عناصر في الصفحة توفر كائنات WebDriver عددًا من التوابع للعثور على عناصر صفحة، ويمكن تقسيمها إلى قسمين من التوابع find_element_ و find_elements_*. توابع find_element_* تعيد كائن WebElement وحيد يمثل أول عنصر في الصفحة يطابق الطلبية التي حددتها، بينما تعيد توابع _find_elements قائمة من كائنات WebElement_* لكل عنصر مطابق في الصفحة. يظهر الجدول الموالي أمثلة على التوابع find_element_ و find_elements_ المستدعاة على كائن WebDriver مخزن في المتغير browser. اسم التابع كائن/قائمة كائنات WebElement browser.find_element_by_class_name(name) browser.find_elements_by_class_name(name) العناصر التي تستخدم صنف CSS باسم name browser.find_element_by_css_selector(selector) browser.find_elements_by_css_selector(selector) العناصر التي تطابق محدد CSS معين browser.find_element_by_id(id) browser.find_elements_by_id(id) العناصر التي تطابق id معين browser.find_element_by_link_text(text) browser.find_elements_by_link_text(text) عناصر <a> التي يطابق محتواها القيمة text كاملةً browser.find_element_by_partial_link_text(text) browser.find_elements_by_partial_link_text(text) عناصر <a> التي يطابق محتواها القيمة text جزئيًا browser.find_element_by_name(name) browser.find_elements_by_name(name) العناصر التي لها الخاصية name وتطابق قيمة معينة browser.find_element_by_tag_name(name) browser.find_elements_by_tag_name(name) العناصر التي تطابق وسمًا معينًا، وهي غير حساسة لحالة الأحرف (أي <a> يمكن أن يطابق عبر 'a' أو 'A') توابع WebDriver للعثور على العناصر في selenium باستثناء التوابع *_by_tag_name() تكون جميع الوسائط الممررة إلى الدوال حساسةً لحالة الأحرف، وإذا لم تكن العناصر موجودة في الصفحة فستطلق selenium الاستثناء NoSuchElement، وعليك استخدام عبارات try و except إذا لم ترغب بتوقف برنامج عن العمل عند ذلك. بعد أن تحصل على كائن WebElement فيمكنك أن تتعرف على المزيد حوله بقراءة سماته أو استدعاء توابع المذكورة في الجدول التالي: السمة أو التابع الوصف tag_name اسم الوسم، مثل 'a' لعنصر <a> get_attribute(name) قيمة خاصية name للعنصر text النص الموجود داخل العنصر، مثل 'hello' في <span>hello</span> clear() مسح النص المكتوب في الحقول النصية is_displayed() إعادة True إذا كان العنصر ظاهرًا، وإلا فيعيد False is_enabled() إعادة True إذا كان حقل الإدخال مفعلًا، وإلا فيعيد False is_selected() لأزرار الانتقاء radio ومربعات التأشير checkbox ستعيد True إذا كان العنصر مختار، وإلا فتعيد False location قاموس فيه المفاتيح 'x' و 'y' لمكان العنصر في الصفحة سمات وتوابع الكائن WebElement مثلًا، افتح ملفًا جديدًا واكتب البرنامج الآتي: from selenium import webdriver browser = webdriver.Firefox() browser.get('https://inventwithpython.com') try: elem = browser.find_element_by_class_name(' cover-thumb') print('Found <%s> element with that class name!' % (elem.tag_name)) except: print('Was not able to find an element with that name.') فتحنا هنا متصفح فيرفكس ووجهناه إلى رابط URL معين، وحاولنا العثور على العناصر التي لها الصنف bookcover، وإذا عثرنا على أحد العناصر فسنطبع اسم الوسم عبر السمة tag_name؛ أما لو لم يعثر على أي عنصر فسنطبع رسالة مختلفة. سيعيد البرنامج الناتج الآتي: Found <img> element with that class name! أي عثرنا على عنصر <img> له اسم الصنف 'bookcover'. الضغط على عناصر الصفحة تمتلك كائنات WebElement المعادة من التوابع find_element_* و find_elements_* التابع click() الذي يحاكي ضغطات الفأرة على العنصر، ويمكن استخدام هذا التابع للضغط على رابط أو تحديد زر انتقاء أو الضغط على زر الإرسال أو أي حدث آخر يُطلَق عند الضغط على أحد العناصر. جرب المثال الآتي في الطرفية التفاعلية: >>> from selenium import webdriver >>> browser = webdriver.Firefox() >>> browser.get('https://inventwithpython.com') >>> linkElem = browser.find_element_by_link_text('Read Online for Free') >>> type(linkElem) <class 'selenium.webdriver.remote.webelement.FirefoxWebElement'> >>> linkElem.click() # follows the "Read Online for Free" link سيفتح متصفح فيرفكس الصفحة ويحصل على العنصر <a> الذي يحتوي على النص Read it Online ويحاكي الضغط على الرابط كما لو ضغطته بنفسك. تعبئة وإرسال الاستمارات يمكن تعبئة الحقول النصية مثل <input> أو <textarea> بالبحث عنها ثم استدعاء التابع send_keys(). جرب ما يلي في الطرفية التفاعلية: >>> from selenium import webdriver >>> browser = webdriver.Firefox() >>> browser.get('https://login.metafilter.com') >>> userElem = browser.find_element_by_id('user_name) >>> userElem.send_keys('your_real_username_here') >>> passwordElem = browser.find_element_by_id('user_pass') >>> passwordElem.send_keys('your_real_password_here') >>> passwordElem.submit() لطالما لم تغيّر صفحة MetaFilter المعرف id لحقول اسم المستخدم وكلمة المرور بعد نشر هذا الكتاب، فيمكنك استخدام الشيفرة السابقة لملء تلك الحقول النصية (تذكر أنك تستطيع استخدام أدوات المطور للتأكد من المعرف id للحقول في أي وقت). استدعاء التابع submit() على أي عنصر في الاستمارة له نفس تأثير الضغط على زر الإرسال. تحذير: ابتعد عن تخزين كلمات المرور الخاصة بك في الشيفرة المصدرية لبرامجك قدر الإمكان، فمن السهل تسريب كلمات المرور إذا تركناها دون تشفير. يمكن لبرنامجك أن يطلب كلمة المرور من المستخدم أثناء التشغيل كما ناقشنا في مقال سابق. إرسال المفاتيح الخاصة تمتلك selenuim وحدةً للمفاتيح الخاصة التي لا يمكن كتابتها كسلسلة نصية، مثل زر Tab أو الأسهم. تلك القيم مخزنة كسمات في الوحدة selenium.webdriver.common.keys، ولأن اسم الوحدة طويل جدًا فمن الأسهل كتابة from selenium.webdriver.common.keys import Keys في بداية البرنامج، وحينها تستطيع استخدام Keys في أي مكان تريد أن تكتب فيه selenium.webdriver.common.keys. يعرض الجدول 12-5 أشهر القيم المستخدمة. الجدول 12-5: أشهر القيم المستخدمة في الوحدة selenium.webdriver.common.keys. السمة الشرح Keys.DOWN و Keys.UP و Keys.LEFT و Keys.RIGHT الأسهم في لوحة المفاتيح Keys.ENTER و Keys.RETURN زر Enter Keys.HOME و Keys.END و Keys.PAGE_DOWN و Keys.PAGE_UP أزرار Home و End و PageDown و PageUp على التوالي Keys.ESCAPE و Keys.BACK_SPACE و Keys.DELETE أزرار Escape و Backspace و Delete على التوالي Keys.F1 و Keys.F2 و . . . و Keys.F12 الأزرار F1 حتى F12 في الصف العلوي من لوحة المفاتيح Keys.TAB زر Tab فمثلًا لو لم يكن المؤشر موجودًا داخل حقل نصي، فالضغط على زر Home و End سيؤدي إلى التمرير إلى بداية ونهاية الصفحة على التوالي. جرب ما يلي على الصدفة التفاعلية ولاحظ كيف يؤدي استدعاء send_keys() إلى تمرير الصفحة: >>> from selenium import webdriver >>> from selenium.webdriver.common.keys import Keys >>> browser = webdriver.Firefox() >>> browser.get('https://nostarch.com') >>> htmlElem = browser.find_element_by_tag_name('html') >>> htmlElem.send_keys(Keys.END) # scrolls to bottom >>> htmlElem.send_keys(Keys.HOME) # scrolls to top العنصر <html> موجود في كل ملفات HTML، ويكون كامل محتوى مستند HTML داخله؛ وتحديد هذا العنصر مفيد لو أردنا إرسال المفاتيح إلى صفحة الويب عمومًا، وهذا بدوره مفيد إذا كانت الصفحة تحمِّل محتوى جديد عند التمرير إلى أسفل الصفحة. الضغط على أزرار المتصفح يمكن أن تحاكي الوحدة selenium الضغط على أزرار المتصفح المختلفة: التابع browser.back() يضغط على زر الرجوع التابع browser.forward() يضغط على زر إلى الأمام التابع browser.refresh() يضغط على زر التحديث التابع browser.quit() يضغط على زر إغلاق النافذة المزيد من المعلومات حول Selenium يمكن للوحدة selenium فعل الكثير مما لم نذكره هنا، فيمكنك أن تعدل محتوى ملفات تعريف الارتباط، وتأخذ لقطة شاشة، وتشغل سكربت JavaScript مخصص …إلخ. لمزيد من المعلومات حول تلك الخصائص فأنصحك أن تزور التوثيق الرسمي. الخلاصة المهام المملة ليست متعلقة بالملفات المحلية على حاسوبك. إذا كنت قادرًا على تنزيل صفحات الويب برمجيًا فستستطيع أتمتة أي مهمة تردك! تسهل الوحدة requests تنزيل صفحات الويب، وبعد تعلم أساسيات HTML فيمكنك أن تستخدم الوحدة BeautifulSoup لتفسير الصفحات التي تنزلها. لكن إن كانت تريد أتمتة أي مهمة متعلقة بالويب أيًا كانت، فيمكنك التحكم برمجيًا مباشرةً بمتصفح الويب عبر الوحدة selenium، التي تسمح لك بفتح المواقع وملء الاستمارات كما لو كان برنامجك كائنًا بشريًا يتصفح المواقع. مشاريع تدريبية لكي تتدرب، اكتب برامج لتنفيذ المهام الآتية. إرسال البريد الإلكتروني من سطر الأوامر اكتب برنامج يقبل عنوان بريد إلكتروني وسلسلة نصية في سطر الأوامر، ثم يستخدم selenium للدخول إلى حسابك البريدي وإرسال بريد إلكتروني إلى العنوان المحدد (أنصحك بإنشاء حساب تجريبي مختلف عن حسابك الأساسي). اكتب برامج أخرى لإضافة منشورات إلى فيسبوك أو تويتر (إكس، سمه ما شئت!). منزِّل الصور اكتب برنامج يفتح أحد مواقع مشاركة الصور مثل Flickr ويبحث عن تصنيف معين من الصور وينزل جميع نتائج البحث في الصفحة الأولى. يمكنك أن تكتب برنامج يعمل على أي موقع مشاركة صور ولديه خاصية البحث. لعبة 2048 لعبة 2048 هي لعبة بسيطة تسمح لك بجمع مربعات بجعلها تنزلق إلى أحد الاتجاهات باستخدام أزرار الأسهم. يمكنك أن تحصل على نتيجة عالية إذا جعلت الانزلاق بهذا الترتيب مرارًا وتكرارًا: الأعلى ثم اليمين ثم الأسفل ثم اليسار. اكتب برنامج بسيط يفتح اللعبة gabrielecirulli.github.io وينفذ النمط السابق للعب اللعبة تلقائيًا. التحقق من الروابط اكتب برنامج يأخذ رابط URL من صفحة ويب، ويحاول أن ينزل كل صفحة مرتبطة فيها، ويُعلِّم كل الصفحات التي تعيد 404 وتؤشر عليها أنها روابط مكسورة. ترجمة -بتصرف- للمقال Web Scraping من كتاب Automate the Boring Stuff with Python. اقرأ أيضًا المقال السابق: تنقيح أخطاء Debugging شيفرتك البرمجية باستخدام لغة بايثون برمجة عملاء ويب باستخدام بايثون أهم 10 مكتبات بايثون تستخدم في المشاريع الصغيرة مشاريع بايثون عملية تناسب المبتدئين النسخة العربية الكاملة لكتاب البرمجة بلغة بايثون1 نقطة
-
هل أنت مهتم بتعلم البرمجة والتطوير لكنك تتساءل ما هي مدة تعلم البرمجة؟ وكم أحتاج من الوقت لتعلم لغة برمجة معينة، وهل سأستغرق وقتًا طويلًا لتعلمها والعمل بها؟ وفي مقال اليوم نحاول أن نجيبك على كل هذه الأسئلة ونقدم بعض النصائح المفيدة التي تساعدك على التقدم بشكل أسرع. في الواقع قد تختلف الإجابة على هذا السؤال اعتمادًا على عدة عوامل مثل الوقت الذي يمكنك توفيره لدراسة البرمجة يوميًا ومدى استيعابك، وهل تبدأ من الصفر أم لديك بعض المعلومات المسبقة عن البرمجة، وما هو المجال أو التخصص الذي ترغب بتعلمه كم يستغرق تعلم البرمجة دعنا نتفق أنه ليس من السهل تحديد جواب دقيق لهذا السؤال، جرب مثلًا أن تكتب في محرك البحث جوجل "كم يستغرق تعلم البرمجة" ستفاجئ بالحصول على إجابات متفاوتة بشكل كبير على هذا السؤال قد تتراوح من ثلاثة أشهر إلى خمس سنوات! يعزى هذا التفاوت الكبير في الإجابات إلى وجود عوامل عديدة تلعب دورًا في تحديد مدة تعلم البرمجة، بعض هذه العوامل فردية وتختلف من شخص لآخر فهناك أشخاص يتعلمون المفاهيم الجديدة أسرع من غيرهم، وبعضهم لديه متسع من الوقت يمكن تخصيصه يوميًا في دراسة البرمجة أكثر من غيره، وبعضها الآخر عوامل تتعلق بطبيعة لغة البرمجة التي تنوي تعلمها أو التخصص البرمجي التي تود تعلمه وهل ترغب بالتعلم لدخول سوق العمل أم لمجرد اكتساب مهارات شخصية فكل هذه العوامل تؤثر على وتيرة تعلمك وزمن تحقيق أهدافك. سنناقش في الفقرات التالية بعض العوامل المهمة التي تؤثر على مدة تعلم البرمجة ونوضح كم يستغرق تعلم البرمجة بناء على كل حالة من الحالات لنساعدك على تحديد الوقت المطلوب بشكل تقريبي بحسب حالتك. العوامل التي تؤثر على مدة تعلم البرمجة الخبرة المسبقة صعوبة لغة البرمجة المستوى الذي تطمح للوصول إليه التخصص أو المجال البرمجي أسلوب التعلم جودة مصادر التعلم الخبرة المسبقة فإذا كنت تنوي تعلم البرمجة من الصفر ولم يكن لديك أي خلفية تقنية وليس لديك أدنى فكرة عن مبادئ التعامل مع الحاسوب ومفهوم الخوارزميات وأسس التفكير المنطقي وحل المشكلات وعن أي لغة برمجة سابقة فسيستغرق تعلم البرمجة وقتًا طويلاً منك نظرًا لوجود مجموعة واسعة من المفاهيم التي عليك تعلمها وقد يستغرق الأمر عدة أشهر حتى تتمكن من كتابة استيعاب أساسيات البرمجة وفهم مفردات لغة البرمجة التي تستخدمها وكتابة برنامج الأول بها بنفسك وتنفيذه بشكل صحيح. من الضروري أن لا تشعر بالإحباط في بدايات تعلم البرمجة وتأسيس نفسك بها فالبدايات دومًا هي الأصعب فإذا تخطيت هذه المرحلة فستتمكن من التقدم بتعلم البرمجة بوتيرة أسرع وسيسهل عليك الانتقال لتعلم أي لغة برمجة أخرى. صعوبة لغة البرمجة أحد العوامل المهمة في زمن تعلم البرمجة هو اللغة التي تختارها فهناك العديد من لغات البرمجة المختلفة مثل لغة بايثون Python. وجافا Java و C++ و PHP وغيرها الكثير وبعض هذه اللغات سهل التعلم وبعضها الآخر أكثر صعوبة ويستغرق مدة تعلم أطول فتعلم لغة برمجة سهلة نسبيًا يستغرق حوالي أربعة إلى ستة أشهر وستحتاج لوقت أكبر إذا كنت تتعلم لغة برمجة صعبة. لذا عندما تقرر تعلم البرمجة فمن الأفضل أن تبحث عن لغة لها منحنى تعلم "Learning Curve" سهل وغير حاد أو معقد، ومنحنى التعلم هو طريقة بيانية للتعبير عن صعوبة تعلم الشخص لموضوع خلال فترة زمنية معينة ويعبر عن سرعة التقدم والخبرات المكتسبة في هذا الموضوع مع مرور الوقت. على سبيل المثال تملك لغة بايثون Python منحنى تعليمي أسهل من لغة جافا Java بسبب تعتبر لغة تركيبتها التي تشبه إلى حد كبير اللغة الإنجليزية وقواعدها السهلة، لهذا السبب فإن مدة تعلم لغة البايثون ستكون أقصر من مدة تعلم لغة جافا وتقدر المدة الوسطية لتعلم أساسيات بايثون بخمس إلى عشر أسابيع في حين تصل مدة تعلم جافا من ستة أشهر إلى 18 شهرًا، ويمكنك مطالعة المزيد من المعلومات حول لغات البرمجة التي يفضل أن تبدأ بها تعلم البرمجة من خلال مقال أسهل لغات البرمجة. المستوى الذي تطمح للوصول إليه إذا كنت تقصد عند سؤالك ما المدة التي أحتاجها لتعلم البرمجة أن تتعلم أساسيات البرمجة وتتعرف على طريقة أسلوب كتابة الشيفرات والتعليمات وتعريف المتغيرات وأنواع البيانات، والحلقات والشروط والدوال البرمجية …إلخ. لمجرد اكتساب مهارة تنمي تفكيرك المنطقي والتحليلي وتوسع مداركك وتمكنك من كتابة برامج حاسوبية لحل مشكلات بسيطة أو أتمتة مهامك اليومية المتكررة فهذا الأمر لن يتطلب منك سوى ثلاثة إلى ستة أشهر فقط لتعلم البرمجة بأي لغة كانت. لكن هذه المدة لن تكون كافية لك لاحتراف البرمجة ودخول سوق العمل فهذا الأمر قد يتطلب منك حوالي سنة أو أكثر للعمل على بناء برامج معقدة وتطبيقات احترافية متكاملة تتعامل مع مشكلات فعلية وتنبي من خلالها معرض أعمال جيد يعزز فرصتك في الحصول على عمل مناسب وإذا كنت تحتاج علم لغة برمجة سهلة نسبيًا يستغرق حوالي أربعة إلى ستة أشهر. التخصص أو المجال البرمجي إن مجالات البرمجة كثيرة ومتنوعة مثل تطوير الويب وبرمجة المواقع وبرمجة الألعاب والذكاء الاصطناعي وعلوم البيانات والأمن السيبراني وغيرها الكثير وبتطلب كل تخصص برمجي مجموعة مهارات مختلفة عن الآخر فكلما زادت المهارات المطلوبة وزاد تعقيدها، كلما زاد الوقت الذي تحتاجه لتعلمها. على سبيل المثال، تبلغ مدة تعلم برمجة المواقع حوالي ستة أشهر إلى عام واحد، في حين يحتاج تعلم أساسيات الذكاء الاصطناعي مدة أطول قد تصل لسنة أو أكثر لأنه مجال أكثر تعقيدًا ويتطلب وجود أساس جيد في الرياضيات والإحصاء ويحتج بعض الوقت للتآلف مع مصطلحاته والتعرف على تخصصاته المختلفة وتعلم خوارزميات التعلم الآلي ولغات برمجة الذكاء الاصطناعي كما يحتاج للكثير من الممارسة لإتقانه. أسلوب تعلم البرمجة تختلف مدة تعلم البرمجة أيضًا بحسب الطريقة التي تختارها للتعلم، فإذا اخترت دارسة البرمجة عن طريق التعليم الأكاديمي والتسجيل في إحدى الجامعات فستستغرق وقتًا طويلًا لا يقل عن أربع أو خمس سنوات لأنك ستضطر على الالتزام بمنهج محدد. أما إذا اخترت التعلم الذاتي فستتمكن من توفير الكثير من الوقت وتقتصر اعلى لغات البرمجة والتقنيات التي تحتاج لتعلمها وبقدر ما تثابر وتبذل من جهد وتلتزم بخطة تعلم منظمة وساعات تعلم محددة يوميًا فستختصر من زمن تعلم البرمجة وتتمكن من دخول سوق العمل بسرعة أكبر. جودة مصادر التعلم إذا قررت تعلم البرمجة فستجد الكثير من مصادر التعلم المتنوعة من دروس ومقالات وكتب ومقاطع فيديو ودورات تدريبية وغيرها من المصادر التي تساعدك لكن هذه المصادر ليست على نفس المستوى من الجودة وقد يصعب عليك كمبتدئ تمييز الغث من السمين وتحديد الترتيب الصحيح لمواضيع التعلم والتركيز على تعلم ما يهمك. كما أن تعلمك من مصادر مشتتة وبطريقة عبثية فتارة تشاهد مقطع فيديو عن موضوع ما وتارة تقرأ مقالة عن موضوع آخر وتارة تبدأ بقراءة كتاب ثم تمل منه سريعًا سيزيد بلا شك من مدة تعلم البرمجة وتحقيق هدفك وتذكر أن المشتت لا يصل. فإذا كنت تتعلم البرمجة دون خطة منهجية واضحة وتريد اختصار وقت تعلم البرمجة فمن الأفضل أن تستثمر وقتك وجهدك وتسجل في دورة تدريبية المنهجية التي تقدم لك المعرفة التي تحتاجها بالتسلسل الصحيح وتوضح لك الأدوات والتقنيات التي تحتاجها وتقيم مهاراتك بشكل معياري وتساعدك على تنفيذ تطبيقات عملية تعزز ما تعلمته وتزيد فرصتك في الحصول على وظائف برمجة مناسبة لمهاراتك. ستجد في أكاديمية حسوب الكثير من الدورات التعليمية عالية الجودة بمختلف التخصصات توفر لك إمكانية التعلم من الصفر دون الحاجة لأي معرفة مسبقة وتساعدك على التعلم بطريقة منظمة وتقرن التعليم النظري بالتطبيق العملي والأهم أنها توفر لك مدربين خبراء يرشدونك ويدعمونك طوال رحلتك التعليمية ويساعدونك في الإجابة على أي تساؤل وحل أي مشكلة تواجهك ويسعدون بتقديم المشورة التي تحتاجها حتى تحترف البرمجة وتجد فرصة العمل المناسبة. هل فات الوقت على تعلّم البرمجة كثيرًا ما نسمع أسئلة من قبيل أنا مهتم بالبرمجة والتقنية وأرغب في تعلمها لأعمل في وظيفة أفضل وذات مردود مادي أعلى أو أرغب بتعلم البرمجة لمواكبة التطور التقني وتعزيز مهارات حل المشكلات لدي ولكن عمري (كذا سنة) فهل فات الوقت على تعلم البرمجة؟ دعني أخبرك بأنه مهما كان عمرك فإن الأوان لم يفت على تعلم البرمجة فالعمر لا يشكل أي عائق في التعلم سواء في ظل وفرة الموارد المتاحة لمساعدتك. وقد يستغرق تعلم البرمجة مدة أطول مع التقدم في السن لكنك قادر على تقليل هذه المدة في حال خصصت وقتًا أطول وأسست نفسك بشكل جيد بالاعتماد على مصادر عالية الجودة وامتلكت الإرادة والرغبة الحقيقية للتعلم فهذا كفيل بجعلك تتغلب على أي صعوبات أو عوائق تواجهها. نصائح لتقليل مدة تعلم البرمجة حدد هدفك من تعلم البرمجة والتخصص البرمجي المناسب لك، وضع خطة لتعلم التقنيات واللغات التي تفيدك في هذا التخصص. عزز مهارة حل المشكلات والتفكير المنطقي قبل البدء بالبرمجة فهي مهارات أساسية تقلل مدة تعلم البرمجة. ركز على تعلم لغة برمجة سهلة وتناسب المبتدئين فهذا يسهل عليك استيعاب المفاهيم البرمجية بوقت أقل ويسهل عليك الانتقال لتعلم أي لغة برمجة أخرى. لا تستسلم بسرعة، فتعلم أي شيء جديد سيكون صعبًا في البداية ويستغرق بعض الوقت لفهم الأساسيات ومع الوقت والخبرة تصبح الأمور أسهل. اعتمد على مصدر جيد لتعلم البرمجة ولا تشتت نفسك بكثرة المصادر. احرص على التطبيق العملي لما تتعلمه من مفاهيم فهذا يعزز مهاراتك ويساعدك على بناء معرض أعمال يثبت خبرتك. تعلم مع أصدقاء لديهم نفس اهتمامك وضع معهم هدفًا مشترك وخطة للتعلم وتعاون معهم في حل المشكلات وتعلم المفاهيم الجديدة فهذا يجعل التعلم أكثر متعة ويحفزك على المواصلة. الخلاصة نأمل أن يكون هذا المقال قد ساعدك في تحديد كم يستغرق تعلم البرمجة ومعرفة أهم العوامل التي تلعب دورًا في الإجابة على هذا السؤال بشكل تقريبي، وكما وضحنا في المقال لا يوجد جواب واحد يناسب الجميع على هذا السؤال لكن بإمكانك اختصار مدة تعلم البرمجة ودخول سوق العمل بسرعة بالمثابرة والجهد. وتذكر في الختام أن البرمجة تحتاج منك إلى الاستمرار في التعلم وتطوير نفسك حتى بعد الاحتراف ودخول سوق العمل، فالتقنيات تتغير وتتطور باستمرار ومن الضروري مواكبة هذه التغييرات وتطبيقها في عملك للحفاظ على مكانتك التنافسية وتلبية متطلبات سوق العمل المتجددة. اقرأ أيضًا دليل شامل لتعلم البرمجة قواعد البرمجة ببساطة للمبتدئين اكتشف ما هي البرمجة وما أهمية تعلمها برمجة الحاسوب للمبتدئين لماذا يجب أن تعلم طفلك البرمجة؟1 نقطة
-
مصطلح إطار العمل أو الفريم وورك 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 ودوره المهم في توفير الوظائف القياسية وتحديد الخطوط العريضة التي تنظم المشاريع البرمجية وتوفر وقت وجهد المطورين والمبرمجين، واكشتفنا أهم الفروقات بين أطر العمل وبين أدوات تطوير البرامج الأخرى مثل المكتبات ولغات البرمجة، وتعلمنا طريقة اختيار أفضل إطار عمل يناسب متطلباتنا وعددنا أهم صفات إطار العمل الجيد، وأخيرًا استعرضنا قائمة بأهم أطر العمل المستخدمة في مجالات مختلفة كتطبيقات الويب وتطبيقات الجوال وغيرها من المجالات. هل تستخدم في عملك أحد أطر العمل التي وردت في سياق المقال أو أطر عمل أخرى؟ ما هو هذا الإطار وفي أي مجال تستخدمه؟ هل هناك أي مشاكل تواجهها في التعامل مع هذا الإطار أم أنك راضٍ عن أدائه. شاركنا تجربتك في التعليقات أسفل المقال. اقرأ أيضًا تعلم أساسيات البرمجة قواعد البرمجة ببساطة للمبتدئين أسهل لغات البرمجة مهندس البرمجيات من هو وما هي مهامه تعرف على تخصص هندسة البرمجيات1 نقطة
-
لكل مهنة قواعد تنظمها وتضمن إنجاز الأعمال فيها بأفضل صورة ممكنة، ومهنة البرمجة ليست استثناء! حيث تعد قواعد البرمجة من الأمور التي ينبغي على أي مبرمج تعلمها، والحرص على اتباعها عند تطوير البرامج والتطبيقات المختلفة. نضعك في مقال اليوم على بداية الطريق، ونعرفك على أهم قواعد البرمجة، ونوضح لك أهمية استخدامها وكيف يمكنك تحقيقها، وبالتدريب والممارسة ستتمكن من اتباعها عندما تطور برامجك وتطبيقاتك. ما هي قواعد البرمجة؟ قواعد البرمجة هي مجموعة من التوصيات والإرشادات التي ينبغي للمبرمجين اتباعها والالتزام بها عند استخدام أي لغة من لغات البرمجة للحصول على كود برمجي عالي الجودة وسهل الصيانة. يضمن لك تطبيق قواعد البرمجة إنتاج برامج مفهومة وواضحة وسهلة القراءة والتعديل، وهو أمر مهم لأي مبرمج لاسيما عندما يعمل ضمن فريق عمل ويتشارك مع عدة مبرمجين أو مطورين على تطوير نفس المشروع. لاشك أن تطبيق قواعد البرمجة ليس بالأمر السهل ولن يتحقق بسرعة، فتطبيق القواعد يأتي في مرحلة لاحقة، فبعد أن تتمكن من أساسيات البرمجة، وتتدرب على طريقة التفكير البرمجي، وحل المشكلات، عليك أن تتقدم خطوة للأمام وتتعلم كيف تحسن من برامجك من خلال تطبيق القواعد البرمجية عليها. سنعرض الآن عددًا من أهم قواعد البرمجة فكن جاهزًا! أهم قواعد البرمجة إليك أهم ثمان قواعد أساسية ينبغي عليك اتباعها لتبرمج كالمحترفين: اتبع القواعد العرفية للغة التي تبرمج بها وثق الكود الذي تكتبه حافظ على البساطة 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"، فهي عبارة عن نماذج يضعها المطورون لحل المشكلات المتكررة والمتشابهة، وستكتسب من خلال تعلمها القدرة على إعادة استخدام نفس الأنماط في كل مرة تظهر فيها نفس المشكلة، ويمكنك اعتبارها بمثابة فكرة مجردة توضح طريقة حل المشكلة وتسهل عليك تحقيقها برمجيًا. الخلاصة تعرفنا في مقال اليوم على أهم قواعد البرمجة التي على المبرمج اتباعها، فلا ينبغي أن تتعلم أساسيات البرمجة فقط، بل عليك أن تتقدم خطوة للأمام وتحرص على اتباع أفضل الممارسات البرمجية عند كتابة الكود كي يكون المنتج الرقمي الذي تنشؤه أكثر كفاءة وموثوقية واحترافية. وتذكر أنه يمكن للجميع كتابة كود برمجي يفهمه الحاسوب لكن القليلين فقط يمكنهم كتابة كود جيد يفهمه الإنسان أيضًا، ومن خلال حرصك على اتباع قواعد البرمجة التي شرحناها تضمن أن تكون من هذه الفئة القليلة من المبرمجين المحترفين، كل ما تحتاجه هو التدريب الجيد على كتابة الأكواد والبرامج بصورة محسنة تراعي هذه القواعد بأفضل طريقة. اقرأ أيضًا تعلم تطوير الويب دليلك الشامل إلى لغات البرمجة أسهل لغات البرمجة ما هي فوائد تعلم البرمجة؟1 نقطة
-
مقدمة تُعتبر المصفوفة في الجافا سكريبت كائن عمومي (global) الغرض منه هو تخزين البيانات، وتحتوي المصفوفة إما على مجموعة من العناصر بنوع بيانات واحد أو أكثر، وقد تكون فارغة. نستخدم الفهارس العددية التي تبدأ من القيمة 0 للوصول إلى عناصر المصفوفة. المصفوفات مفيدة جدًا بما أنها تُخزن عدة قيم في متغير واحد، وهذا الأمر يقلل وينظم الشيفرة البرمجية التي نكتبها ويجعلها أكثر ملائمة للقراءة والصيانة. تستطيع المصفوفة أن تحتوي على أي نوع بيانات، ابتداءً من الأرقام ومرورا بالنصوص والكائنات وغيرها من أنواع البيانات. لتوضيح كيف من الممكن أن تكون المصفوفات مهمة، لنفترض أننا نريد أن نحفظ أسماء المحيطات في متغيرات عدة، بحيث يكون لكل محيط المتغير الخاص به: oceans.js // Assign the five oceans to five variables const ocean1 = "Pacific"; const ocean2 = "Atlantic"; const ocean3 = "Indian"; const ocean4 = "Arctic"; const ocean5 = "Antarctic"; هذه الطريقة مُضجرة جدا، وتُصبح أكثر صعوبة بشكل متسارع في المتابعة والصيانة. باستخدام المصفوفات، نستطيع تبسيط الأمر. oceans.js // Assign the five oceans let oceans = [ "Pacific", "Atlantic", "Indian", "Arctic", "Antarctic", ]; بدلًا من استخدام خمسة متغيرات منفصلة، نستطيع الان أن يكون لدينا متغير واحد يحتوي على جميع العناصر الخمسة. لإنشاء المصفوفة، نستخدم الأقواس المربعة [ ] كما هو واضح في الشيفرة البرمجية السابقة، وللوصول إلى عنصر معين في المصفوفة، نستخدم الفهرس مع المصفوفة بالطريقة التالية: // Print out the first item of the oceans array oceans[0]; Output Pacific في هذا الدرس سنتعلم كيفية بناء المصفوفة، وكيفية الوصول إلى عناصرها، والاضافة إليها وتعديلها والحذف منها، كما سنتعلم كيفية المرور خلال عناصرها باستخدام حلقة التكرار. إنشاء مصفوفة يوجد طريقتان لإنشاء المصفوفة في جافا سكريبت: التعريف اللفظي باستخدام الأقواس المعكوفة. التعريف بواسطة الباني (constructor) باستخدام كلمة new. لنوضح كيفية إنشاء مصفوفة تحتوي على أنواع سمك القرش، وذلك باستخدام التعريف اللفظي بواسطة الأقواس المربعة: sharks.js // Initialize array of shark species with array literal let sharks = [ "Hammerhead", "Great White", "Tiger", ]; الان نُعرف نفس المصفوفة باستخدام الباني وذلك بواسطة الجملة new Array() : sharks.js // Initialize array of shark species with array constructor let sharks = new Array( "Hammerhead", "Great White", "Tiger", ); كلا الطريقتين سوف يُنشئ لنا المصفوفة، ولكن طريقة التعريف اللفظي هي المشهورة والأكثر تفضيلا بما أن التعريف باستخدام الباني قد يؤدي إلى نتائج غير مستقرة وغير متوقعة وعليك الانتباه في حال صادفتك تلك الطريقة في التعريف أو في حال استخدامك لها. نستطيع طباعة محتويات المصفوفة بكتابة المتغير الخاص بها مباشرة: // Print out the entire sharks array sharks; Output [ 'Hammerhead', 'Great White', 'Tiger' ] تُستخدم المصفوفات عادة في تجميع العناصر أو القوائم من نفس نوع البيانات، ولكن من الناحية التقنية، فإن المصفوفات تستطيع أن تحتوي على عناصر من أنواع مختلفة بالإضافة إلى إمكانية أن تحتوي على مصفوفات أخرى: // Initialize array of mixed datatypes let mixedData = [ "String", null, 7, [ "another", "array", ], ]; بعد أن تعلمنا كيفية إنشاء المصفوفة، نستطيع الان التعامل معا بأكثر من طريقة، ولكننا في البداية نحتاج الى فهم كيفية فهرسة المصفوفات (Arrays Indexing). ملاحظة: قد تجد اخر عنصر في المصفوفة ينتهي بفاصلة وأحيانا قد لا تجد هذه الفاصلة. تُعرف هذه الفاصلة بالفاصلة التابعة (Trailing comma)، ومن الشائع ان تكون غير موجودة، ولكن بشكل عام أصبح من الأفضل أن يتم استخدامها في الشيفرة البرمجية بسبب أنها تجعل الاختلافات بين الإصدارات (في عملية إدارة الإصدارات Versions Control) أكثر وضوحا وتسهل من إضافة وإزالة عناصر المصفوفة دون أخطاء. لاحظ أن الفاصلة التابعة غير مسموح بها في ملفات JSON. فهرسة المصفوفات إذا تعاملت مسبقاً مع النصوص والفهرسة في الجافا سكريبت، ستكون مُلمًا بمفهوم فهرسة المصفوفات، حيث أن النص يُعتبر شبيهًا بالمصفوفة. لا تحتوي المصفوفات على عناصر مزدوجة على شكل اسم/قيمة، وبدلا من ذلك، فإن المصفوفات تُفهرس بقيم عددية تبدأ من القيمة 0. المثال التالي ينشئ مصفوفة باسم seaCreatures: seacreatures.js let seaCreatures = [ "octopus", "squid", "shark", "seahorse", "starfish", ]; الجدول التالي يُفصل كيف يتم فهرسة كل عنصر في المصفوفة بقيمة عددية ابتداءً من 0: octopus squid shark seahorse starfish 0 1 2 3 4 العنصر الأول في المصفوفة هو octopus ومُفهرس في الموقع 0 من المصفوفة، والعنصر الأخير هو starfish ومُفهرس في الموقع 4. تبدأ الفهرسة من 0، وهذا يتضارب مع طبيعتنا الفطرية ببدء العد من القيمة 1، لذلك نحتاج لأخذ الاحتياط وأن نتذكر هذه النقطة دائما حتى تصبح طبيعية. نستطيع أن نحصل على عدد العناصر في المصفوفة باستخدام الخاصية length: seaCreatures.length; Output 5 على الرغم من أن الفهارس الخاصة بالمصفوفة seaCreatuers تبدأ من 0 إلى 4، فإن الخاصية length سوف تُرجع العدد الفعلي للعناصر الموجودة في المصفوفة. إذا أردنا معرفة رقم الفهرس لعنصر معين في المصفوفة، وليكن مثلا seahorse، نستطيع أن نستخدم لذلك الوظيفة indexOf() : seaCreatures.indexOf("seahorse"); Output 3 إذا لم تحتوي المصفوفة على العنصر الذي نريده، فلن نحصل على رقم فهرس لعنصر غير موجود، وفي هذه الحالة، فإن الوظيفة سترجع لنا القيمة -1 كما في المثال التالي: seaCreatures.indexOf("cuttlefish"); Output -1 بواسطة أرقام الفهارس المرتبطة بعناصر المصفوفة، فإنه لدينا القدرة على الوصول لكل عنصر بشكل منفرد بهدف العمل على هذا العنصر والتعامل معه. الوصول لعناصر المصفوفة يتم الوصول لعنصر في مصفوفة جافا سكريبت بواسطة الإشارة لرقم الفهرس للعنصر بين قوسين معكوفين: seaCreatures[1]; Output squid نعلم أن الرقم 0 سيعيد لنا دائما العنصر الأول في المصفوفة. كذلك نستطيع إيجاد العنصر الأخير في المصفوفة بواسطة إجراء عملية طرح قيمة 1 من قيمة الخاصية length للمصفوفة، والإشارة لناتج هذه العملية كرقم فهرس للعنصر الأخير كما هو موضح في المثال التالي: const lastIndex = seaCreatures.length - 1; seaCreatures[lastIndex]; Output starfish محاولة الوصول لعنصر غير موجود سيعيد لنا undefined: seaCreatures[10]; Output undefined للوصول لعنصر مصفوفة متداخلة (مصفوفة داخل مصفوفة)، فعلينا إضافة فهرس اخر يعود للمصفوفة الداخلية: let nestedArray = [ [ "salmon", "halibut", ], [ "coral", "reef", ] ]; nestedArray[1][0]; Output coral في المثال السابق، قمنا بالوصول للعنصر coral بالإشارة لرقم الفهرس الذي يحتوي المصفوفة الداخلية وهو 1، ثم أشرنا للفهرس الذي يحتوي على العنصر في المصفوفة الداخلية وهو 0. إضافة عنصر لمصفوفة في المتغير seaCreatuers يوجد لدينا 5 عناصر بأرقام فهراس تبدأ من 0 الى 4. إذا أردنا أن نُضيف عنصر جديد لهذه المصفوفة، فيمكننا أن نقوم بذلك بإعطاء قيمة للفهرس التالي الذي يلي اخر فهرس: seaCreatures[5] = "whale"; seaCreatures; Output [ 'octopus', 'squid', 'shark', 'seahorse', 'starfish', 'whale' ] إذا قمنا بإضافة عنصر وتجاهلنا قيمة الفهرس التالي ووضعنا بدلا منه فهرس بقيمة 7 مثلا، فإن ذلك يؤدي لإضافة عنصر غير مُعرف (undefined) للمصفوفة كما في المثال التالي: seaCreatures[7] = "pufferfish"; seaCreatures; Output [ 'octopus', 'squid', 'shark', 'seahorse', 'starfish', 'whale', , 'pufferfish' ] هذه المشكلة نستطيع تجنبها باستخدام الوظيفة push() والتي تقوم بإضافة العنصر الجديد في نهاية المصفوفة: // Append lobster to the end of the seaCreatures array seaCreatures.push("lobster"); seaCreatures; Output [ 'octopus', 'squid', 'shark', 'seahorse', 'starfish', , 'whale', 'pufferfish', 'lobster' ] على العكس تماما من الوظيفة push()، فإن الوظيفة unshift() تقوم بإضافة العنصر في بداية المصفوفة: // Append dragonfish to the beginning of the seaCreatures array seaCreatures.unshift("dragonfish"); seaCreatures; Output [ 'dragonfish', 'octopus', 'squid', 'shark', 'seahorse', 'starfish', 'whale', , 'pufferfish', 'lobster' ] باستخدام الوظيفتين السابقتين، ستكون لديك المقدرة على إضافة عناصر جديدة للمصفوفة إما في بدايتها، أو نهايتها. إزالة عنصر من مصفوفة لإزالة عنصر معين من مصفوفة، نستخدم الوظيفة splice(). في المصفوفة seaCreatuers قمنا بإضافة عنصر غير مُعرف وليس له قيمة، ولإزالته نقوم بالتالي: seaCreatures.splice(7, 1); seaCreatures; Output [ 'dragonfish', 'octopus', 'squid', 'shark', 'seahorse', 'starfish', 'whale', 'pufferfish', 'lobster' ] في الوظيفة splice()، المُعامل الأول يشير لرقم الفهرس الذي سنبدأ بالإزالة من عنده (في هذه الحالة 7)، والمُعامل الثاني يشير لعدد العناصر التي نرغب بإزالتها (في حالتنا سيكون 1 حيث أننا نرغب بإزالة عنصر واحد). الوظيفة splice() ستؤثر على المتغير الأصلي. لذلك، إذا أردنا أن نحافظ على المصفوفة الأصلية دون تغيير، نستخدم الوظيفة slice() ونعطي القيمة الناتجة عنها لمتغير جديد. let newArray = slice(7, 1); الوظيفة pop() ستزيل العنصر الأخير من المصفوفة: // Remove the last item from the seaCreatures array seaCreatures.pop(); seaCreatures; Output [ 'dragonfish', 'octopus', 'squid', 'shark', 'seahorse', 'starfish', 'whale', 'pufferfish' ] العنصر lobster أُزيل من المصفوفة لأنه العنصر الأخير، ولإزالة العنصر الأول في المصفوفة، نستخدم الوظيفة shift(): // Remove the first item from the seaCreatures array seaCreatures.shift(); seaCreatures; Output [ 'octopus', 'squid', 'shark', 'seahorse', 'starfish', 'whale', 'pufferfish' ] باستخدام الوظيفتين pop() و shift() نستطيع إزالة العناصر من بداية المصفوفة أو نهايتها. يُفضل استخدام الوظيفة pop() قدر الإمكان، حيث أن باقي العناصر في المصفوفة تبقى في مواقعها دون تغيير. تعديل العناصر في المصفوفة نستطيع تغيير أي قيمة عنصر في المصفوفة وذلك بإعطاء القيمة الجديدة للعنصر باستخدام عملية المساواة، كما نفعل تماما عند التعامل مع المتغيرات العادية: // Assign manatee to the first item in the seaCreatures array seaCreatures[0] = "manatee"; seaCreatures; Output [ 'manatee', 'squid', 'shark', 'seahorse', 'starfish', 'whale', 'pufferfish' ] طريقة أخرى لتغيير قيمة العنصر باستخدام الوظيفة splice() وذلك بإضافة مُعامل جديد. فمثلا، إذا أردنا تغيير قيمة العنصر seahorse والذي يقع في الفهرس 3، نستطيع إزالته وإضافة قيمة جديدة بدلا منه: // Replace seahorse with sea lion using splice method seaCreatures.splice(3, 1, "sea lion"); seaCreatures(); Output [ 'manatee', 'squid', 'shark', 'sea lion', 'starfish', 'whale', 'pufferfish' ] في المثال السابق، قمنا بإزالة العنصر seahorse من المصفوفة، ووضعنا بدلا منه القيمة sea lion في نفس الفهرس 3. حلقة التكرار خلال المصفوفة نستطيع المرور على عناصر المصفوفة من خلال حلقة تكرار for وذلك بالاستفادة من خاصية length. في المثال التالي، نُنشئ مصفوفة باسم shellfish ونطبع رقم كل فهرس فيها بالإضافة إلى قيمة العنصر المرتبط بالفهرس: // Create an array of shellfish species let shellfish = [ "oyster", "shrimp", "clam", "mussel", ]; // Loop through the length of the array for (let i = 0; i < shellfish.length; i++) { console.log(i, shellfish[i]); } Output 0 'oyster' 1 'shrimp' 2 'clam' 3 'mussel' نستطيع أيضا استخدام حلقة التكرار for…of وهي خاصية جديدة في الجافا سكريبت: // Create an array of aquatic mammals let mammals = [ "dolphin", "whale", "manatee", ]; // Loop through each mammal for (let mammal of mammals) { console.log(mammal); } Output dolphin whale manatee حلقة التكرار for…of لا تقوم باستخدام رقم الفهرس للعناصر في المصفوفة، ولكنها بشكل عام طريقة أبسط وأكثر اختصارا للمرور على المصفوفة من خلال حلقة التكرار. استخدام حلقات التكرار مفيد بشكل كبير في طباعة قيم عناصر المصفوفة وهو يشبه عرض العناصر من قاعدة بيانات خلال موقع الكتروني. خاتمة تُعتبر المصفوفات جزء أساسي ومهم في برمجة الجافا سكريبت. في هذا الدرس تعلمنا كيفية إنشاء المصفوفة، وكيفية فهرستها، وتعلمنا إجراء بعض العمليات المهمة على المصفوفات مثل إزالة العناصر والتعديل عليها. وكذلك تعلمنا طريقتين للمرور على عناصر المصفوفة من خلال حلقات التكرار والتي تهدف لإجراء عمليات على عناصر المصفوفة مثل طباعة محتوياتها وطباعة أرقام الفهارس. ترجمة -وبتصرّف- للمقال Understanding Arrays in JavaScript لصاحبه Tania Rascia حقوق الصورة البارزة محفوظة لـ Freepik1 نقطة
-
حققت برامج التعلم العميق والذكاء الاصطناعي نموًا متزايدًا في الآونة الأخيرة، إذ تشير الإحصاءات إلى أن القيمة السوقية لهذه التقنيات الحديثة قد تصل إلى 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 كيف يمكن للذكاء الاصطناعي أن يشكل مستقبل تسويق المحتوى اقرأ أيضًا الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها تعلم الآلة: التحديات الرئيسية وكيفية التوسع في المجال تعلم الذكاء الاصطناعي1 نقطة