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

حمزة عباد

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

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

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

آخر الزوار

لوحة آخر الزوار معطلة ولن تظهر للأعضاء

إنجازات حمزة عباد

عضو نشيط

عضو نشيط (3/3)

123

السمعة بالموقع

4

إجابات الأسئلة

  1. وعليكم السلام ورحمة الله، نعم تبدو لي أنّ هذه فكرة جيّدة لتعلّم البرمجة بـJavaScript. من الجيد أن تأتي بمواضيع مميزة كهذه وتحاول تطبيقها. في حالة البرنامج الذي تريد إنشاءه، عليك أوّلا تحديد ما هي الحروف العربية القابلة للتمديد (نرى في مثالك أنّ "ه" و "ن" و "ت" و "ج" هي حروف قابلة للتمديد، بينما "ذ" و "ر" مثلا ليست حروفا قابلة للتمديد). بعد ذلك، يجب كتابة خوارزمية تحدد الحروف الواجب تمديدها والمقدار الذي يجب تمديدها به حتى يصبح الطول الكلّي للكلمة موافقا للطول المطلوب. حسب ما يظهر في مثالك، فيمكن أن يكون هناك أكثر من حرف قابل للتمديد في نفس الكلمة (مثل "تجريبي") ويجب تمديدها بنفس المقدار، أو بطريقة تراها أكثر مناسبة. بالطبع أشجعك على القيام بهذا المشروع. وبالمناسبة، ذكّرتني بأوّل مشروع برمجي قمت به أنا قبل حوالي 12 سنة، ولا أزال أحتفظ به. وهو صفحة ويب تقوم بالتحويل بين سلاسل DNA و RNA (أو كما ترمز لها بالفرنسية ADN و ARN) وكذلك سلاسل الأحماض الأمينية. كانت فكرة المشروع مستوحاة من دروس العلوم الطبيعية التي درسناها أيّام الثانوية، حيث تعلّمت لغة JavaScript في ذلك الوقت. إذا أردت الإطلاع على ذلك المشروع فلعله يفيدك، فلقد رفعته على هذا الرابط: https://hamza5.github.io/DNA-translator_AR/ وإذا أردت رؤية الكود الذي كتبته في ذلك الوقت لإنشاء هذه الصفحة، فيمكنك إيجاده هنا: https://github.com/Hamza5/DNA-translator_AR بالتوفيق لك في مسيرتك البرمجية!
  2. وعليكم السلام ورحمة الله، التوثيق (Documentation) هو مجموعة الصفحات (المعروضة عادة على الموقع الرسمي) التي تشرح كل تفاصيل لغة البرمجة أو المكتبة أو إطار العمل (أو أي شيء آخر، حتّى لو كان غير متعلّق بالبرمجة). ميزة التوثيق أنّه يتضمّن كلّ شيء متعلّق بالموضوع المدروس (أو على الأقل، هذا هو المفروض). مثلا، في توثيق لغة Python، تجد كل عرضا (مع بعض الشرح) لكلّ وحدات المكتبة الرئيسية التي تأتي مع مفسّر هذه اللغة. فمثلا، توجد وحدة pickle لتخزين جميع هياكل بيانات Python في ملفات، وتوجد وحدة zipfile للتعامل مع الأرشيف، وتوجد وحدة wave لمعالجة الصوت، وهكذا... التوثيق هو جزء ضروري من أي مشروع. لا يمكن أن تكون هناك لغة برمجة أو إطار عمل أو حتى مكتبة صغيرة من دون توثيق (إذا كان هناك مشروع بدون توثيق فلا تنظر إليه أصلا!). أمّا الدروس التعليمية، سواء كانت مقروءة أم مشاهدة، فهذه ليست أساسية. بالطبع، كل لغات البرمجة وأطر العمل الشهيرة سوف تجد لها دروسا تعليمية، لكن هذا الأمر ليس دائما. سوف تتعامل في مسيرتك البرمجية مع مكتبات غير مشهورة، وهذه لن تجد لها دروسا تعليمية لكن سيكون عليك الاعتماد على نفسك من خلال الاستعانة بالتوثيق. بالطبع لا، وهذه فائدة التوثيق، فهو يمثّل مرجعا تعود إليه كلّما احتجت إلى مراجعة ما نسيته أو تعلّم إمكانيات إضافية للمكتبة من التي لم تكن تعرفها بعد. شخصيا، استخدمت Numpy في كثير من المشاريع ومع ذلك لم أستخدم منها سوى مميزات قليلة منها، أمّا أغلب مميزات المكتبة فلا أحسن استخدامها، لكن يمكنني دائما العودة إلى التوثيق والبحث في الأنترنت من أجل التعلم أكثر.
  3. لفعل ذلك يجب عليك معالجة الحدث beforeunload في window: function onBeforeUnload(e) { if (thereAreUnsavedChanges()) { e.preventDefault(); e.returnValue = ''; return; } delete e['returnValue']; } window.addEventListener('beforeunload', onBeforeUnload); بالنسبة لـthereAreUnsavedChanges() فهذه دالّة يجب عليك برمجتها لتوافق الشرط الذي تريد عنده منع المستخدم من مغادرة الصفحة. لكن للأسف، في المتصفّحات الجديدة، لا يمكن تعديل النص الذي يظهره المتصفّح للمستخدم, نصّ التأكيد يختاره المتصفّح نفسه. لكن ما يمكنك فعله هو إظهار الرسالة على الصفحة مباشرة في من خلال الدالّة السابقة. يمكن الإطلاع أكثر عن كيفية معالجة هذا الحدث من توثيق شبكة موزيلا للمطورين: https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event
  4. طول أو قصر وقت الفيديوهات وعددها شيء غير مؤثر بشكل كبير في مقارنة الدورات. الأهم هو المحتوى الموجود فيها والأهم منه هو استيعاب الطالب لما يدرسه فيها. في الفيديوهات الأولى مثلا قد يكون عدد الفيديوهات كثيرا ووقتها قصير نسبيا، لأنها تتناول مفاهيم بسيطة يمكن دراستها في وقت قصير، كما أنّ عدد هذه المفاهيم يكون كبيرا (كل شيء يبدو هكذا في البداية) لذلك تكون عدد الفيديوهات كثيرة. لكن مع التقدّم في الدروس تصبح عدد الفيديوهات أقل ويزداد طولها (وتعقيدها)، وسوف تصبح الدروس مترابطة فيما بينها بشكل كبير، والطالب عندما يحاول تطبيق كل ما يدرسه فيها (وربّما يزيد إبداعا من عنده، فهذا أحسن) سوف يكلّفه هذا وقتا كثيرا ويقع في مشاكل وسيحتاج إلى طلب المساعدة من المشرفين وغير ذلك. لذلك لا يمكن حساب وقت الدورة بناء على عدد الفيديوهات أو مجموع وقتها، بل إن الأمر يختلف من طالب لآخر، فكلّ طالب له قدراته الخاصّة في الدراسة واهتماماته وأشغاله. يمكنك إيجاد إجابات مشابهة عن كيفية تقدير مدّة الدورة وآلية الامتحان في هذا السؤال:
  5. كتابة الكود غير مرتبطة بالمحرر الذي تختارينه. يمكن أن تختاري أي محرر تريدين. في دورة تطوير التطبيقات باستخدام Python يستخدم المدرّب عادة برنامج PyCharm لأن هذا هو خياره الشخصي، لكن هذا ليس شرطا. إذا كنت متمكّنة أكثر في VS Code أو تشعرين بأنه يريحك أكثر أو متوافق مع جهازك بشكل أحسن فيمكنك استخدامه. وفي حالة لم تستطيعي متابعة المدرّب في جزئية محددة بسبب اختلاف البرامج، فيمكنك طرح سؤال في قسم التعليقات أسفل الدرس وسوف يقوم أعضاء الإشراف الذين يستخدمون VS Code بمساعدتك.
  6. الاحتفاظ بالمشاريع يعني الإبقاء على الملفات التي تمّ العمل عليها عند متابعة المدرّب. في الدروس المتقدّمة تكون المشاريع مجلّدات تحوي عدّة ملفّات كثيرة وكبيرة، وهذه يجب الاحتفاظ بها. سوف يتم رفع هذه المشاريع على GitHub في وقت لاحق قبل التقدّم للامتحان. في الدروس الابتدائية تكون المشاريع متكوّنة من ملف واحد، فمن الأحسن الاحتفاظ بها هي أيضا. في بعض الدروس الابتدائية لا توجد أصلا ملفّات لحفظها. في هذه الحالة يمكنك نسخ الأوامر التي تم إدخالها في ملف نصّي مثلا. لا أعتقد أن أخذ لقطات الشاشة أمر ضروري لكنها فكرة جيّدة ويمكنك إضافتها.
  7. بالفعل، من الصعب جدّا (أو لنقل من شبه المستحيل) أن تكون هناك دورة تعليمية تدرّسك كلّ ما تحتاج تعلّمه في مجال ما. دورة تطوير التطبيقات بلغة JavaScript (والتي يتم تدريس React JS فيها) ليست استثناء من هذه القاعدة. لذلك، فالجواب هو أنه لا يمكنك أن تكتفي بمتابعة محتوى الدورة فقط وتفترض أن هذا كاف للاشتغال في سوق العمل. بالطبع، سوف تحتاج إلى قراءة توثيق React مرّة واحدة على الأقل بعد أو أثناء دراستك للمسار. وسيكون من الأحسن لو تحاول أن تبدع قليلا خارج ما يقوم به المدرّب، إذ أنّه كلّما حاولت الاعتماد على نفسك أكثر كلّما زاد استيعابك للمعلومات وتحسنت فرصك للنجاح فيما بعد في ميدان عملك. لذلك، حاول أن تستثمر أقصى ما تستطيع من الوقت من أجل تحسين مهاراتك، حتى بالمواد الموجودة خارج الدورة. قد تجد معلومات مفيدة أيضا في مقالات أكاديمية حسوب: https://academy.hsoub.com/programming/javascript/react/ وأيضا من التوثيق المتوفّر على موسوعة حسوب: https://wiki.hsoub.com/React
  8. وعليكم السلام، أنا أستخدم Bing AI والذي هو نسخة متطوّرة مقارنة بـChatGPT، إذ أنّه يبحث في الأنترنت قبل الإجابة ويعطيك مصادر كل معلومة (الرابط الذي وجدها فيه). Bing AI لديه 3 أوضاع : دقيق، متوازن، ومبدع. في الوضعين دقيق ومتوازن يستخدم النموذج GPT-3.5 Turbo، بينما في الوضع المبدع يستخدم GPT-4. النتائج التي يعطيها مبهرة للغاية. أنا دائما أستعين به في عملي وفي حلّ المشاكل التي تظهر لي في نظامي أو برامجي. وهو مجاني بالكامل. مؤخرا أضافوا بعض الأمور المدفوعة لكنّي لم أطّلع عليها ولست أشعر أنني في حاجة إلى أكثر من المتوفّر فيه مجانا. يمكنك تجربته من من موقع محرّك البحث Bing.com، والشرط الوحيد لاستخدامه هي أن تستخدم المتصفّح Microsoft Edge وليس أي متصفّح آخر. على أيّة حال المتصفّح Edge هو ممتاز أيضا ومتوفّر على جميع أنظمة التشغيل، فهذا الشرط ليس مزعجا بل هو فائدة إضافية.
  9. أنت تحاول تشغيل أوامر Ubuntu من خلال Python shell، وهذا شيء غير منطقي. أوّلا، قم بالخروج من Python shell عن طريق الضغط بلوحة المفاتيح على المفتاحين: Ctrl+D أو بكتابة الأمر: exit() ثم الضغط على Enter. بعد ذلك أعد كتابة أوامر Ubuntu التي يجب القيام بها. وبالمناسبة، يرجى في المرّة القادمة طرح الأسئلة في قسم التعليقات أسفل فيديو الدرس حتّى نتمكّن من معرفة الأوامر التي تريد القيام بها بالضبط.
  10. المتغيّر employees يحوي قائمة من المتغيّرات، لذلك، عندما نستخدمه نحصل على القائمة كاملة: employees = ['E1', 'E2', 'E3'] print(employees) # تظهر: ['E1', 'E2', 'E3'] بينما الكتابة employees[index] تعني العنصر من القائمة الموجود عند الفهرس index: employees = ['E1', 'E2', 'E3'] index = 0 print(employees[index]) # تظهر: 'E1' index = 1 print(employees[index]) # تظهر: 'E2'
  11. هذا الخطأ يعني أن المتغيّر gradinets غير معرّف (لاحظ أنّك سميته gradinets وليس gradients، يعني أنّك قلبت بين حرفي n و e). ابحث عن المكان الذي أخطأت فيه في الكتابة (يبدو أنّه سطر apply_gradients)، وأصلح الخطأ. أيضا تأكّد من تشغيل كل الخلايا في هذا notebook بالترتيب، لأن الترتيب مهم.
  12. هل ما تريده هو تخزين النص الذي يطبعه برنامجك في منفّذ الأوامر في ملف؟ إذا كان كذلك، فتوجد طريقة تعمل مع كل البرامج، وهي استخدام عامل إعادة التوجيه إلى ملف: node app.js > log.txt هذه الطريقة تقوم بتخزين ما يظهر على الإخراج القياسي (Standard output - stdout)، لذلك، فالأخطاء لن تظهر في هذا الملف وستستمر بالظهور على الشاشة. لإعادة توجيه الأخطاء التي تظهر عبر إخراج الأخطاء القياسي (Standard Error Output - stderr) نحو ملف آخر يمكن فعل ذلك كالتالي: node app.js > log.txt 2> errors.txt إذا أردت جعل كل الإخراج، سواء كان مصدره من stdout أو من stderr في نفس الملف، فيمكن فعل ذلك بالأمر التالي: node app.js > log.txt 2>&1
  13. وعليكم السلام، عندما نقول أنّ هناك لغة آلة يتم ترجمة البرامج إليها ثم يتم تشغيل البرامج مباشرة من طرف الحاسوب، فهذه الفكرة المبسطة جدا والمختصرة اختصارا مخلّا فادحا، لكن الأمر لا يتم بهذه البساطة في الحقيقة. في الواقع، عند اختراع الحواسيب الأولى، في سنوات الأربعينات والخمسينات من القرن الماضي، والتي كان حجمها يملأ غرفة كاملة و وزنها بالقناطير، كانت بالفعل لا تملك أنظمة تشغيل! ولكن مشكلة هذه الحواسيب هي أنّها كانت بسيطة جدّا: يعمل عليها برنامج واحد فقط، ويظهر نتائجه عبر شاشة بسيطة لا تتمكن سوى من إظهار قدر قليل من النص. يمكنك أن تتخيّل أن هذه الحواسيب كانت مثل آلة حاسبة، لكنّها كانت قابلة للبرمجة! كما ترى، حواسيب مثل هذه لا تصلح لشيء في وقتنا. ماذا نفعل بحاسوب يستطيع تشغيل برنامج واحد فقط، ولا يستطيع عرض سوى نص قليل مثل آلة حاسبة؟ لذلك تمّ تطوير الحواسيب حتى تستطيع تشغيل عدّة برامج، توفّر دخولا لعدّة مستخدمين، تعطي إدارة للذاكرة الحية، للقرص الصلب، للشبكة، للبطارية .... ولكثير من الأمور الأخرى. لكن انتظر، كيف يستطيع الحاسوب فعل كلّ هذا؟ هل ستكتب له برنامجا يعلّمه كيف يقوم بذلك؟ لا أعتقد أنّك تريد فعل هذا من برنامجك، وحتى لو أردت فلن تستطيع، فهذا يتطلّب سنوات من العمل وفريق عمل ضخم حتّى تستطيع إنشاء برنامج يمكنه إدارة موارد الحاسوب بطريقة فعّالة هكذا. لحسن الحظ، ليس عليك كتابة برنامج كهذا، لأنّ هذا النوع من البرامج موجود بالفعل، وهو يسمى: نظام التشغيل! إذن نظام التشغيل ما هو إلّا برنامج كبير يقوم بتنظيم عمل البرامج الأخرى. في الواقع، الآلة لا تستطيع التعامل إلّا مع برنامج واحد، وهذا البرنامج في الحواسيب الحديثة هو نظام التشغيل الذي يقوم بدوره بتشغيل بقية البرامج. لذلك، فعندما نقول أنّ البرنامج تمّت ترجمته إلى لغة الآلة، فهذا يكافئ أن نقول أنّ هذا النص مكتوب بالحروف العربية، لكن هل كلّ نصّ مكتوب بالحروف العربيّة تستطيع فهمه إذا كنت تتحدّث باللغة العربية؟ بالطبع لا! فربّما هو باللغة الفارسية أو الأوردو أو بالعثمانية أو أيّة لغة أخرى تستخدم الحروف العربيّة. لذلك، فلغة الآلة تعني الحروف المستخدمة، بينما تفسير الحروف إلى معاني هو وظيفة نظام التشغيل. هذا بالنسبة للغات المترجمة، أمّا اللغات المفسّرة فلا يتم أصلا ترجمتها إلى لغة الآلة، بل يتم تشغيلها مباشرة من طرف المفسّر، والمفسّر هنا أيضا يعتمد على نظام التشغيل لكي يستطيع العمل وتشغيل برنامجك الذي تكتبه من خلاله.
  14. tuple و frozenset شيئان مختلفان. tuple تحفظ العناصر بترتيبها الذي أنشأته بها، والعناصر فيها قابلة للتكرار، فيمكن أن يكون لدينا tuple بهذا الشكل: t = (1, 5, 6, 5, 9, 1, 6) العناصر هذه سوف تبقى في أماكنها التي تمّ تعريفها بها، والتكرار بين العناصر سوف يبقى أيضا من دون تغيير: len(t) # 7 t[1] # 5 t[3] # 5 t.count(5) # 2 بينما frozenset (وأيضا set العادية) تحفظ عناصرها من دون أي ترتيب ولا تسمح بالتكرار: s = frozenset((1, 5, 6, 5, 9, 1, 6)) len(s) # 4 لا يمكن الوصول إلى عناصر frozenset بالترتيب، لأنّه لا يوجد ترتيب فيها كما قلنا: s[0] # TypeError: 'frozenset' object is not subscriptable لذلك، فالشيء المشترك الوحيد بين tuple و frozenset هو عدم إمكانية التعديل عليهما بعد إنشائهما، أمّا بقية خصائصهما فهي مختلفة. لذلك، نحتاح frozenset إذا أردنا إنشاء هيكل بيانات غير قابل للتعديل ولا يقبل التكرار. هذا مفيد في عدّة تطبيقات، مثل أن نحصل على بيانات مكررة من قاعدة بيانات أو شيء مشابه، ثمّ نريد أن نحذف التكرار منها، فهنا frozenset ستكون الهيكل المناسب.
  15. أشعر أنني أجبت على هذا السؤال من قبل، في جزء من جواب حول السؤال "تثبيت البيئة الافتراضية لبايثون على النظام"، لذلك أعيد وضع الإجابة هنا مادامت مفيدة لهذا السؤال أيضا: لذلك فالمسألة ليست متعلّقة بحجم المشروع، بل بالاعتماديات التي يتطلّبها. إذا كانت كلّ الاعتماديات متوفّرة على نظامك بالفعل (يعني تمّ تثبيتها سابقا بدون استخدام بيئة افتراضية، من طرفك أو من طرف برنامج آخر، كما هو الحال مع برامج Linux التي يتم تثبيتها عن طريق مدير الحزم (package manager))، أو كان البرنامج لا يحتاج إلى اعتماديات، فلا حاجة لبيئة افتراضية. والعكس بالعكس.
×
×
  • أضف...