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

Mustafa Suleiman

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

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

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

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

    302

كل منشورات العضو Mustafa Suleiman

  1. مرحبًا بك في أي وقت، وبخصوص العروض، فيتم توفير عروض كل فترة وخاصًة في المناسبات، وأيضًا في بعض الأحيان توجد كوبونات خصم ولكن ليس دائمًا، لذلك عليك بالتحدث لمركز المساعدة الخاصة بأكاديمية حسوب والسؤال عن توافرها أم لا. وقد وضحت سابقًا أوقات العروض التي غالبًا يتم توفير خصومات بها:
  2. الخاصية innerHtml تكتب بالشكل التالي innerHTML لذلك عليك تعديلها، والأفضل هو innerText. وأيضًا عليك بالتأكد من عدم وجود أخطاء في الكونسول عند الضغط على الزر، وتأكد من أنك قمت ربط ملف الجافاسكريبت بشكل صيح، وأيضًا كتابة اسمه بشكل صحيح وانتبه إلى الحرف الصغيرة والكبيرة وكتابتها كما هي، وأيضًا كتابة المسار إلى الملف بشكل صحيح. ويتم استيراد ملف جافاسكريبت في HTML بالشكل التالي: <script src="index.js"></script> وإذا كان في مجلد آخر باسم js مثلاً وليس بجانب ملف html مباشرًة فعليك بكتابة المسار كالتالي: <script src="js/index.js"></script>
  3. أرجو منك توضيح السؤال وذكر ما تريد فعله بالضبط، وبخصوص الكود: ربما هناك خطأ في اسم المتغير BATH في الدالة __init__. ربما تقصد PATH بدلاً من BATH. أيضًا تحقق من المرجع إلى قائمة self.column_values في دالة X، حيث يجب عليك استدعاء دالة W قبل استخدام self.column_values في دالة X. وهناك خطأ في الرجوع من دالة X، ويجب عليك إرجاع قيمة self.column_values بدلاً من تعديل قيمة self.A. from openpyxl import load_workbook class W_book: def __init__(self, PATH, A): self.PATH = PATH self.A = A def W(self): self.workbook = load_workbook(self.PATH) self.sheet = self.workbook.active self.column_values = [cell.value for cell in self.sheet['A']] def X(self): self.W() # استدعاء الدالة W للحصول على القيم المطلوبة return self.column_values وبخصوص التعديل الذي قمت به: فلا يوجد خطأ في استدعاء الدالة X وتعيين قيمة m، والحروف الكبيرة والصغيرة تعتبر مختلفة في لغة Python، لذا يجب أن تتأكد من استخدام الأحرف الكبيرة والصغيرة بشكل صحيح في أسماء المتغيرات والدوال، بالشكل التالي: a = W_book('d:\abc.xlsx', 'g1') a.X() m = a.A وتأكد أنك تقوم بتمرير القيمة 'g1' كسلسلة نصية وتقوم بإستدعاء الدالة X بحرف كبير a.X()، ثم تعيين قيمة m إلى a.A بدلاً من g1.
  4. عليك بتعلم كيف تقوم بعمل Debugging من خلال أدوات المطور في جوجل كروم مثلاً، وكما شرح لك عمر، قام هو هو بتفقد التنسيقات والكلاسات الخاصة بالعناصر من خلال المتصفح، وربط بينها وبين التنسيقات الخاصة بالعنصر الأب. وقام بتجربة تعديل التنسيق بوضع خواص CSS على العنصر من خلال المتصفح، وذلك أسرع بمراحل بدلاً من التعديل على الكود ثم النظر إلى المتصفح مرة أخرى، بل عليك التجربة داخل المتصفح نفسه من خلال أدوات المطور، وكيف تفعل ذلك؟ عليك بمشاهدة الفيديو التالي وأيضًا قراءة التعليقات، وستتعلم كيف تستخدم أداة المطور في جوجل كروم:
  5. تستطيع الوصول إلى المتغير a في دالة S_Names() عن طريق تمريره كوسيطة إلى الدالة. def S_Names(a): q = a.workbook.sheetnames print(q) return q ثم استدعاء الدالة S_Names() وتمرير المتغير a إليها لاستخراج أسماء أوراق العمل. S_Names(a)
  6. هناك بعض التعديلات التي يجب إجراؤها كالتالي: في الدالة __init__ التي تم إنشاؤها في الـ class W_book، يجب تعيين قيمة المتغيرات workbook و sheet إلى القيم التي يتم تمريرها إلى الـ constructor، وذلك باستخدام self للإشارة إلى المتغيرات الخاصة بالـ class. كما يجب تحميل الملف باستخدام load_workbook داخل الـ constructor. from openpyxl import load_workbook class W_book: def __init__(self, BATH): self.BATH = BATH self.workbook = load_workbook(BATH) self.sheet = self.workbook.active وعند استدعاء الكلاس من صفحة البرنامج، بإمكانك تمرير مسار الملف إلى الـ constructor لإنشاء كائن الـ class وتعيينه للمتغير a، كمثال: from cls1 import W_book a = W_book('D:\ABC.xlsx') الآن تستطيع الوصول إلى المتغيرات workbook و sheet باستخدام a.workbook و a.sheet على التوالي في باقي الأكواد، مثلاً، إذا كنت ترغب في سحب القيم من الأعمدة والصفوف، باستطاعتك استخدام a.sheet['A1'].value للوصول إلى قيمة الخلية A1.
  7. السبب الأساسي هو طريقة عمل دالة setTimeout في جافا سكريبت. فعند تنفيذ الحلقة for، يتم تكرار دالة setTimeout في كل تكرار بحيث تقوم بتعيين دالة لتنفيذها بعد فترة زمنية محددة، وهي 3 ثوانٍ في الكود. ولكن، تكون قيمة i قد اكتمل تنفيذها قبل أن تنفذ دالة setTimeout المعطاة، مما يعني أن جميع تكرارات الحلقة for ستكون قد اكتملت بسرعة في غضون فترة زمنية صغيرة، بحيث تكون قيمة i قد وصلت إلى القيمة 5. وعندما يحين الوقت لتنفيذ الدوال التي تم تعيينها في setTimeout، فإن قيمة i الحالية هي القيمة الأخيرة (5) في كل حالة، وبالتالي، سيتم طباعة "hi" خمس مرات في الوقت نفسه بعد انتهاء فترة الانتظار البالغة 3 ثوانٍ. والصحيح هو كتابة الكود كالتالي بوضع قيمة إنتظار بناءًا على قيمة i: for (let i = 0; i < 5; i++) { setTimeout(function() { console.log('hi: ' + i ); }, 1000 * (i + 1)); }
  8. أولاً عليك إنشاء اتصال بقاعدة البيانات باستخدام معلومات الاتصال الصحيحة: <?php $servername = "اسم_خادم_قاعدة_البيانات"; $username = "اسم_مستخدم_قاعدة_البيانات"; $password = "كلمة_مرور_قاعدة_البيانات"; $dbname = "اسم_قاعدة_البيانات"; // إنشاء الاتصال $conn = new mysqli($servername, $username, $password, $dbname); // التحقق من نجاح الاتصال if ($conn->connect_error) { die("فشل الاتصال بقاعدة البيانات: " . $conn->connect_error); } ?> بعد إنشاء الاتصال بقاعدة البيانات، تستطيعي استعمال استعلام SQL لاسترداد المرضى المسجلين عند الدكتور المعين. ولنفترض أن لديك معرّفًا فريدًا لكل دكتور في قاعدة البيانات، فستحتاج إلى استخدام هذا المعرّف لاسترداد المرضى المتعلقين به، وقومي بإضافة الكود التالي لاستعلام SQL لاسترداد المرضى: <?php $doctor_id = $_SESSION['doctor_id']; // تحصل على معرف الدكتور من جلسة الدخول // استعلام SQL لاسترداد المرضى المسجلين عند الدكتور المعين $sql = "SELECT * FROM المرضى WHERE doctor_id = $doctor_id"; $result = $conn->query($sql); if ($result->num_rows > 0) { // يوجد مرضى مسجلين عند الدكتور while ($row = $result->fetch_assoc()) { // قم بعرض بيانات المرضى هنا echo "اسم المريض: " . $row["اسم_المريض"] . "<br>"; echo "رقم الهوية: " . $row["رقم_الهوية"] . "<br>"; // وهكذا... } } else { // لا يوجد مرضى مسجلين عند الدكتور echo "لا يوجد مرضى مسجلين عندك حاليًا."; } // إغلاق الاتصال بقاعدة البيانات $conn->close(); ?> وانتبهي إلى أنه يجب أن يتم تغيير اسم الجدول "المرضى" وأسماء الأعمدة وأيضًا استخدام المتغير المناسب لمعرف الدكتور في قاعدة البيانات، كما يجب أن يكون لديك جلسة لتتتبع معرف الدكتور بعد تسجيل الدخول وقبل عرض الصفحة الخاصة بالدكتور.
  9. اعلم أن أي مسار تعليمي مثل مسار تعلم تطوير مواقع الويب، سيستغرق منك 6 أشهر للدراسة بشكل سليم في حال اتبعت مسار تعليمي جيد. لذلك عليك يجب أن تعلم أن تعلم أساسيات البرمجة من خلال لغة مثل C++ يستغرق وقت بالتأكيد، فإذا كان هناك وقت متاح أمامك فتعلم أولاً أساسيات البرمجة من خلال C++، وإذا كان الأمر صعب عليك وتجده معقد بالرغم من المحاولة للفهم والتطبيق، فتعلم بايثون في تلك الحالة. ثم انتقل إلى تعلم مسار الويب وبالطبع اللغات الأساسية هي HTML, CSS, JS وستجد على اليوتيوب الكثير من الدورات، أو بإمكانك إلقاء نظرة على دورة تطوير الويب باستخدام جافاسكريبت في أكاديمية حسوب. وبإمكانك تعلم أساسيات css و html من خلال دورة تطوير واجهات المستخدم في الأكاديمية، حيث أن المسار الأول من كل الدورات متاح لك بشكل مجاني، وبذلك ستتعلم HTML, CSS, JS بالإضافة إلى React و React Native و Electron.js. ونيصحتي إليك هي ألا تتعلم الخوارزميات وهياكل البيانات في البداية، بل الأفضل تعلمها بعد أن تقوم بإنشاء مشروع كبير والعودة لتعلمها وستجد أن لها فائدة فعلاً وستفهم أهميتها. ولكن ما عليك تعلمه هو أساسيات علوم الحاسب، مثل كيف يعمل الويب وأساسيات HTTP ومكونات الحاسوب مثل كيف يتم ترجمة الكود وكيف يتم معالجته من قبل المعالج والرامات والنظام. وبخصوص االواجهة الخلفية، فهى واحدة سواء للموقع أو تطبيق الهاتف، وعندما تتعلم الواجهة الخلفية ستفهم ما معنى أن تقوم بإنشاء API وترسل بيانات وتستقبل بيانات أو حذف وتحديث البيانات فيما يعرف باسم CRUD. وأنصحك بقراءة التالي:
  10. كلا المجالين، تعلم الآلة وتحليل البيانات، لهما ارتباط وثيق ببعضهما البعض ويمكن أن يتعاونا في مجالات عديدة، ف في مجال تعلم الآلة، تستخدم البيانات لتدريب النماذج وتطوير الخوارزميات التي تستخدم لتحليل البيانات واستخراج المعلومات القيمة منها. ولذلك عليك بتحديد المجال الذي تريده. وبالنسبة لفرص العمل لمحللي البيانات على مواقع العمل الحر أو عن بُعد، فالمجال يشهد نموًا كبيرًا وزيادة في الطلب على المحللين الماهرين، وهناك العديد من المنصات والمواقع التي توفر فرص عمل لمحللي البيانات على مستوى العالم في المواقع الأجنبية أو تفقد الوظائف على LinkedIn فستجد وظائف خاصة بتعلم الآلة وتحليل البيانات. انواع الوظائف في مجال تحليل البيانات
  11. الأمر يتطلب مبرمج للإطلاع على موقعك وتنفيذ ما تريده، وإذا كنت تريد إضافة ميزة المحادثة لموقعك فتستطيع ذلك عن طريق خدمات مثل Tawk.to وLiveChat وIntercom، أو إضافة زر لمحادثتك مباشرًة على واتساب أو فيسبوك ماسنجر.
  12. حاول استخدام المتغيرات StringVar المستقلة لتخزين القيم وتحديثها في جميع الأماكن المرتبطة بها. import tkinter as tk from tkinter import ttk def update_dropdown_values(): new_values = ["New Option 1", "New Option 2", "New Option 3"] selected_value.set("") # إعادة تعيين القيمة المحددة dropdown['values'] = new_values root = tk.Tk() selected_value = tk.StringVar(root) dropdown = ttk.Combobox(root, textvariable=selected_value, values=["Option 1", "Option 2", "Option 3"]) dropdown.pack() update_button = tk.Button(root, text="تحديث القائمة", command=update_dropdown_values) update_button.pack() root.mainloop() إنشاء متغير selected_value باستخدام StringVar لتخزين القيمة المحددة في القائمة المنسدلة، وعند تحديث قيمة القائمة، نقوم بإعادة تعيين القيمة المحددة باستخدام selected_value.set("") لضمان عدم وجود قيمة غير صحيحة محددة بعد تغيير القائمة. وتستطيع استخدام متغير selected_value في جميع القوائم المنسدلة المرتبطة به، وسيتم تحديث قيم القوائم المنسدلة تلقائيًا عند استدعاء الدالة update_dropdown_values التي تقوم بتحديث قيم القائمة.
  13. تستطيع استخدام الأسلوب configure للقائمة المنسدلة (Combobox) وتحديث قائمة القيم. import tkinter as tk from tkinter import ttk def update_dropdown_values(): new_values = ["New Option 1", "New Option 2", "New Option 3"] dropdown['values'] = new_values root = tk.Tk() dropdown = ttk.Combobox(root, values=["Option 1", "Option 2", "Option 3"]) dropdown.pack() update_button = tk.Button(root, text="تحديث القائمة", command=update_dropdown_values) update_button.pack() root.mainloop() وفي الكود تم إنشاء قائمة منسدلة (Combobox) وتعيين القيم الافتراضية لها باستخدام values الموجودة في البداية، ثم بإضافة زر يقوم بتحديث قيم القائمة المنسدلة عند النقر عليه. وعند النقر على الزر، تستدعى الدالة update_dropdown_values التي تقوم بتعديل values للقائمة المنسدلة وتعيين القيم الجديدة.
  14. اعذرني على التحدث معك بصراحة، لكن بتلك الطريقة لن تصل إلى شيء في البرمجة، فهى مملة بطبيعتها وعملية التعلم مملة أيضًا فقد تواجه مشكلة تقتضي منك يوم كامل لحلها فهل ستترك مجال البرمجة؟ دائمًا ما أنصح أن تجعل الملل صديقًا لك، فللأسف برمجت عقولنا على المكافآت السريعة، تخيل معي أنه قبل أن تتعلم البرمجة تقضي وقتك في مشاهدة التيك توك وفيديوهات يوتيوب السريعة وألعاب الكمبيوتر والسوشيال ميديا وخلافه. وبدأت تعلم البرمجة لتجد أنه لا يوجد مكافآت سريعة، بل جد واجتهاد وساعات مذاكرة طويلة، والمكافأة تأتي بعد فترة من المذاكرة حيث ستجد نفسك تتحسن بعد فترة وتصبح قادر على تنفيذ مشروع بسيط مثلاً وستفرح بذلك. وفي البرمجة لا يوجد طريق مختصر، أو يوجد لكنه نهايته مسدودة، حيث ستصبح قداراتك البرمجية ضعيفة، ولن تتمكن من تعلم تقنيات أو لغات جديدة، فعند التأني في تعلم الأساسيات وبذل الوقت والجهد، فستجد نفسك تتعلم بشكل أسرع فيما بعد وقادر على تجربة أشياء جديدة ومستوعب للمصطلحات البرمجية وتعقيداتها دون مشكلة، ولن تخاف إذا رأيت كود لم تراه من قبل. الأمر أشبه بتخطي فترة التدريب في ألعاب الكمبيوتر، للعب مباشرًة، لتجد نفسك أنك مشتت وتتخبط وتعود إلى التدريب مرة أخرى أو تقوم بالبحث عن كيفية اللعب أو تجاوز عقبة ما؟ وأنصحك بقراءة النقاشات التالية، فستجد بها إجابة على الكثير من الأسئلة لديك:
  15. الأسئلة الإختبارية لا يتم الإجابة عليها بشكل مباشر، ولكن يمكن مساعدتك بإرشادك للخطوات، أو حل مشكلة بالكود لو قمت بتوفيره. وإليك الخطوات البرمجية لرسم الشكل المطلوب باستخدام Java Applet: 1- إنشاء مشروع جديد في بيئة تطوير Java لديك. 2- إنشاء فئة جديدة واعتبرها فئة الرسم (مثلاً DrawingApplet) واجعلها تمتد من java.applet.Applet. 3- ضمن فئة الرسم، قم بتجاوز الطريقة paint() لرسم الشكل المطلوب، وسأوفر لك جزء من الكود للتوضيح فقط: import java.applet.Applet; import java.awt.*; public class DrawingApplet extends Applet { public void paint(Graphics g) { // رسم الشكل البيضاوي الخارجي // رسم الشكل البيضاوي الداخلي // رسم النص } } 4- قم بتصدير وتشغيل البرنامج لرؤية الشكل المطلوب. وتأكد من أنك قد قمت بتثبيت Java Development Kit (JDK) على جهاز الكمبيوتر لديك، وأن بيئة تطوير Java الخاصة بك مُكوّنة بشكل صحيح لكي تتمكن من تشغيل البرنامج. وكمعلومة فقط انتبه إلى أن استخدام Java Applet قد أصبح قديمًا وغير مدعومٍ بشكل جيد في المستعرضات الحديثة، ويُفضل استخدام تقنيات الويب الأحدث مثل HTML5 وCSS3 وJavaScript لتحقيق نفس الغرض. قسم دروس ومقالات لغة جافا في أكاديمية حسوب
  16. لربط أداة Combobox في Tkinter بملف Excel باستخدام مكتبة Openpyxl، عليك بالتالي: 1- استيراد المكتبات المطلوبة: from tkinter import * from tkinter.ttk import Combobox from openpyxl import load_workbook 2- تحميل ملف Excel باستخدام load_workbook: workbook = load_workbook('اسم_الملف.xlsx') sheet = workbook.active # تحديد ورقة العمل النشطة 3- استخراج قيم العمود الأول من ورقة العمل وتخزينها في قائمة: column_values = [cell.value for cell in sheet['A']] # افتراضًا أن القيم في العمود الأول (A) 4- إنشاء نافذة Tkinter وإضافة أداة Combobox: window = Tk() combo = Combobox(window, values=column_values) # تعيين قيم القائمة المنسدلة combo.pack() 5- إضافة دالة تعمل عند اختيار قيمة من Combobox: def on_combobox_selected(event): selected_value = combo.get() # القيمة المحددة من القائمة المنسدلة row_index = column_values.index(selected_value) + 1 # +1 لأن الصفوف تبدأ من 1 وليس 0 corresponding_value = sheet['B' + str(row_index)].value # افتراضًا العمود الثاني (B) # قم بعرض القيمة المقابلة في أداة النص أو قم بطباعتها print(corresponding_value) # يمكنك استخدام أي طريقة تعرض القيمة combo.bind("<<ComboboxSelected>>", on_combobox_selected) # ربط الدالة بحدث اختيار القيمة من Combobox window.mainloop() وبذلك عند اختيار قيمة من Combobox، ستستدعى الدالة on_combobox_selected وسيتم استخراج القيمة المقابلة لها من العمود الثاني (افترضت العمود B) ومن ثم يمكنك طباعتها أو عرضها في أداة النص أو التلاعب بها على النحو الذي ترغب به.
  17. هناك متغيرات في Tkinter مثل StringVar لتحديث قيم القوائم المنسدلة في تطبيقك، وفيما يلي مثال يوضح الأمر لك: import tkinter as tk from tkinter import ttk def update_dropdown(): selected_value.set("New Value") # تحديث قيمة المتغير root = tk.Tk() selected_value = tk.StringVar(root) selected_value.set("Default Value") # القيمة الافتراضية للمتغير dropdown = ttk.Combobox(root, textvariable=selected_value, values=["Option 1", "Option 2", "Option 3"]) dropdown.pack() update_button = tk.Button(root, text="تحديث القائمة", command=update_dropdown) update_button.pack() root.mainloop() قمت بإنشاء متغير selected_value باستخدام StringVar وتعيين القيمة الافتراضية له، ثم إنشاء قائمة منسدلة باستخدام ttk.Combobox وربطها بالمتغير selected_value باستخدام الخاصية textvariable. وعند تحديث قيمة المتغير باستخدام الدالة set()، سيتم تحديث قيمة القائمة المنسدلة تلقائيًا. أيضًا قمت بإضافة زر يقوم بتحديث قيمة المتغير عند النقر عليه، وبإمكانك تغيير القيم المتاحة في القائمة المنسدلة بتعديل قائمة values الموجودة في ttk.Combobox.
  18. لن تستطيع الحصول على عنوان MAC للزائر باستخدام لغة PHP، فعناوين MAC تكون مرتبطة بالأجهزة المادية مثل بطاقات الشبكة والراوترات، ولا يتم إرسالها عبر الإنترنت في طبقة التطبيق، وتُستخدم عناوين MAC في الشبكات المحلية فقط لتوجيه حركة البيانات بين الأجهزة المتصلة في الشبكة المحلية. وستجد على الإنترنت كود مثل التالي: <?php // PHP code to get the MAC address of Server $MAC = exec('getmac'); // Storing 'getmac' value in $MAC $MAC = strtok($MAC, ' '); // Updating $MAC value using strtok function, // strtok is used to split the string into tokens // split character of strtok is defined as a space // because getmac returns transport name after // MAC address echo "MAC address of Server is: $MAC"; ?> لكنه يستخدم للحصول على عنوان MAC للسيرفر الذي يقوم بتشغيل كود PHP، وليس للزائر، أو المستخدمين على نفس الشبكة المحلية لديك. وبإمكانك فقط الحصول على عنوان IP للزائر باستخدام PHP من خلال استخدام المتغير المدمج: $_SERVER['REMOTE_ADDR'] ويعيد هذا المتغير عنوان IP للزائر الحالي الذي يقوم بالوصول إلى صفحة الويب، ويجب أن تكون مدركًا أن عناوين IP متغيرة وغير دائمة بطبيعتها، ويمكن تغييرها أو تخطيها باستخدام بروكسي أو شبكات VPN، وبالتالي قد لا تكون دقيقة بنسبة 100% لتحديد هوية الزائر.
  19. هناك طريقتين لتحميل مستودع على جهازك، والأولى بشكل مباشر عن طريق تحميل المستودع في مشكل ملف مضغوط بصيغة ZIP عن طريق الضغط على زر code باللون الأخضر الموجود في المستودع ثم إختيار Download ZIP كما بالصورة وسيتم التحميل: الطريقة الثانية هي عن طريق نسخ الرابط الموجود أسفل تبويب HTTPS الذي سيظهر لك عن الضغط على زر Code باللون الأخضر في المستودع، وستجد بجانب الرابط زر عند الضغط عليه سيتم نسخ الرابط كما بالصورة السابقة. والآن افتح واجهة سطر الأوامر (Command Line Interface) على جهازك، مثل Git Bash أو Terminal. انتقل إلى المسار الذي ترغب في تحميل المستودع فيه، باستخدام أمر cd للتنقل بين المجلدات، مثلاً: cd اسم المجلد أو المسار أي يجب أن تنتقل إلى المسار الذي تريد عمل نسخ للمستودع به وإليك شرح لكيفية التنقل عن طريق أمر cd، ويجب أن يكون المسار هو مجلد أو تستطيع إنشاء مجلد من خلال سطر الأومر بواسطة الأمر: mkdir اسم المجلد وأسهل طريقة لفتح منفذ الأوامر في مسار سطح المكتب هو الضغط على shift ثم الضغط على زر الفأرة الأيمن وسيظهر لك في القائمة إختيار terminal. بعد ذلك استخدم الأمر git clone مع رابط المستودع الذي قمنا بنسخه، كالتالي: git clone رابط المستودع وبالطبع الأمر يتم تنفيذه في منفذ الأوامر، وإليك مثال: git clone https://github.com/username/repository.git وسيقوم Git بتنزيل المستودع بأكمله إلى المجلد الحالي الذي كنت فيه، وستظهر رسائل توضح تقدم التحميل.
  20. إذا كان السؤال متعلق بأحد الدورات أرجو التعليق أسفل فيديو الدورة وطرح الأسئلة العامة الغير متعلقة بالدورة هنا في قسم أسئلة البرمجة. وبخصوص سؤالك، لديك مشكلة في طريقة استخدام واجهة console حيث أنك استدعيت ميثود log منها بطريقة غير صحيحة كالتالي: console,log() والصحيح هو استخدام نقطة (.) للفصل بين اسم الكائن (console) والدالة (log) التي يتم استدعاؤها على هذا الكائن، حيث يُستخدم هذا النمط في جافاسكريبت للوصول إلى الأعضاء أو الخصائص أو الدوال المتوفرة على الكائنات أو الواجهة. وكما تعلم كل شيء في جافاسكريبت هو عبارة عن كائن، كل شيء. والكائن أو الواجهة (console) هو كائن مدمج في جافاسكريبت يتيح واجهة لإجراءات المستخدم على وحدة التحكم في المستعرض، والدالة (log) تُستخدم لطباعة رسالة في وحدة التحكم أو الـ console في المتصفح. فإذا استخدمت فاصلة (,) بدلاً من النقطة (.)، مثل console,log()، فسيعتبر جافاسكريبت أنها تعبير يحتوي على اسم كائن (console) ودالة آخرى تحمل اسم (log)، وهذا ليس المطلوب، أي تم الفصل بينهم. وما أقصد بواجهة هو أنه في جافاسكريبت، console هي واجهة (Interface) مدمجة تقدم وظائف للتواصل مع وحدة التحكم في المتصفح أو البيئة التي يعمل فيها الكود. وواجهة console تحتوي على عدة دوال مفيدة للإخراج (output) والتحكم في سير التنفيذ. بعض الدوال الشائعة المتوفرة في واجهة console هي: log(): تُستخدم لطباعة رسائل تنبيه أو معلومات في وحدة التحكم. error(): تُستخدم لطباعة رسائل خطأ في وحدة التحكم. warn(): تُستخدم لطباعة رسائل تحذير في وحدة التحكم. info(): تُستخدم لطباعة رسائل معلومات في وحدة التحكم. clear(): تُستخدم لمسح وحدة التحكم من الرسائل السابقة. وغيرها من الدوال المفيدة. وتستطيع استخدام واجهة console للتحقق من قيم المتغيرات أثناء تطوير التطبيقات، وتصحيح الأخطاء، وتقييم أداء الكود.
  21. عند العمل على مشاريع فلاتر (Flutter)، باستطاعتك استخدام أنماط مختلفة لتنظيم وإدارة الكود، وهناك نمطين شائعين في عالم فلاتر هما MVVM و Repository. سأوضح لك الفارق بينهما وسأشرح كل نمط على حدة 1- MVVM (Model-View-ViewModel) يعتبر MVVM من أنماط التصميم الأكثر شيوعًا في تطوير تطبيقات الهواتف المحمولة بما في ذلك فلاتر، وينقسم هذا النمط إلى ثلاثة أجزاء رئيسية: Model: يمثل البيانات والمنطق الخاصة بالتطبيق، ويمكن أن يكون لديك مثيلات للنماذج التي تحتوي على بيانات يستخدمها التطبيق. View: تمثل واجهة المستخدم، وتعرض البيانات المنتجة من ViewModel وتتفاعل مع المستخدم. ViewModel: يعمل كوسيط بين Model و View، ويتولى استرجاع البيانات من Model وتحويلها إلى شكل مناسب للعرض على الـ View، أيضًا يحتوي على المنطق اللازم للتعامل مع استجابة المستخدم. الفكرة الرئيسية وراء MVVM هي فصل الواجهة البصرية عن البيانات والمنطق الخاصة بها، مما يتيح تبسيط عملية اختبار وصيانة التطبيق وسهولة إضافة ميزات جديدة. 2- Repository Pattern يستخدم نمط Repository لإدارة استرجاع البيانات وحفظها في التطبيق، ويقدم هذا النمط واجهة وسيطة (Interface) تحدد العمليات الممكنة مع البيانات مثل الاسترجاع والحفظ والتحديث والحذف، ويقوم المستودع (Repository) الفعلي بتنفيذ هذه العمليات باستخدام مصادر البيانات المناسبة مثل قواعد البيانات أو خدمات الويب. وفي سياق فلاتر، يمكن أن يكون المستودع هو الجزء الذي يسترجع البيانات من قواعد البيانات أو يتصل بخدمات الويب لجلب البيانات، وبإمكانك استخدام Repository Pattern بشكل مستقل أو مع نمط آخر مثل MVVM لتوفير واجهة بين النمطين. أي الفكرة الأساسية وراء Repository Pattern هي تجنب تكرار كود الوصول للبيانات في مختلف أجزاء التطبيق، وتوفير واجهة واحدة للتعامل معها، بدلاً من أن يتم استدعاء وكتابة الاستعلامات المباشرة في أجزاء مختلفة من التطبيق، ويستخدم المستودع كوسيط للتفاعل مع البيانات. الأسلوب الأكثر احترافية الأمر يعتمد على نوع المشروع وحجمه وتعقيده، فعادةً ما ينصح باستخدام نمط MVVM لأنه يفصل واجهة المستخدم عن البيانات ويسهل اختبار وصيانة التطبيق. أما إذا كنت تعمل على مشروع بسيط وغير معقد، فتستطيع استخدام نمط Repository بشكل مستقل، وإذا اقتضى الأمر تستطيع أيضًا استخدام كلا النمطين معًا.
  22. إذا كان سؤالك يتعلق بأحد الدورات فأرجو التعليق أسفل فيديو الدورة المتعلق بالسؤال وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة. وبخصوص سؤالك، فتستطيع تحديد العناصر <input> في CSS باستخدام العديد من الخصائص المختلفة بالإضافة إلى type. فالتحديد بواسطة type="password" يعني أنك تستهدف الحقول ذات النوع "password" فقط، وأيضًا بإمكانك استهداف العناصر <input> باستخدام أي صفة أخرى متوفرة في HTML. مثال على ذلك، استهداف الحقول التي تحتوي على صفة required بالشكل التالي: input[required] { border-color: red; } وهناك العديد من الصفات المختلفة التي يمكن استخدامها لتحديد العناصر <input>، مثل id و class و name وغيرها، وباستطاعتك استخدام هذه الصفات بدلاً من type لتحديد العناصر بطرق مختلفة. مثلاً، استهداف الحقول ذات الـ id المحدد بالشكل التالي: input#myInput { background-color: yellow; } أو يمكنك استهداف الحقول ذات الـ class المحددة بالشكل التالي: input.myClass { font-weight: bold; } أي تستطيع تحديد العناصر <input> بواسطة العديد من الصفات المختلفة وليس فقط type. وأنصحك بقراءة التالي: صفحات تصنيف «CSS Selectors» من موسوعة حسوب
  23. فائدة "document" في الكود الذي في الصورة هي الوصول إلى عنصر في صفحة HTML باستخدام جافا سكريبت، وتستخدم للوصول إلى عناصر HTML الموجودة في صفحة الويب والتعامل معها بشكل ديناميكي. حيث تستخدم الدالة getElementById للوصول إلى عنصر HTML الذي يحمل الهوية "username". وتقوم بحفظ قيمة المدخل الموجود في هذا العنصر في متغير تسميه "username". وتتمثل أهمية "document" في السماح لك بالتفاعل مع صفحة الويب وتعديلها ديناميكياً باستخدام جافا سكريبت، ومن أجل الوصول إلى العناصر المحددة في صفحة الويب مثل النماذج أو العناصر المعرّفة بواسطة الهوية، يجب استخدام "document". وبدون استخدام "document"، لن يكون بإمكانك الوصول إلى عنصر النموذج الذي يحمل الهوية "username"، وبالتالي لن تتمكن من الحصول على قيمة المدخل في هذا العنصر واستخدامها في الجملة التي تعرضها في نافذة التنبيه (alert). أي أن "document" هو كائن يمثل مستند HTML الحالي، ويوفر العديد من الطرق والخصائص للتفاعل مع العناصر في الصفحة وتعديلها والوصول إليها. وللمزيد من الشرح والتفصيل أنصحك بقراءة التالي:
  24. أرجو توضيح السؤال، وما فهمته أنك تحاول حفظ الصورة وكتابة اسم لها في الفوتوشوب صحيح؟ إليك الخطوات: قم بفتح الصورة في برنامج Adobe Photoshop. اختر "File" (ملف) في الشريط العلوي للبرنامج، ثم اختر "Save As" (حفظ ك). ستظهر لك نافذة حفظ الملف، قم بتحديد مسار الحفظ والمجلد الذي ترغب في حفظ الصورة فيه. في الجزء السفلي من نافذة حفظ الملف، ستجد خيار "Format" (تنسيق)، فحدد الصيغة التي ترغب في حفظ الصورة بها، مثل JPEG أو PNG. وفي خانة اسم الملف "File name" تستطيع كتابة الوصف الذي تريده . بمجرد الانتهاء من إضافة الوصف وتحديد اسم الملف ومكان الحفظ، انقر على زر "Save" (حفظ) لحفظ الصورة مع الوصف.
  25. هناك تعارض في أسماء الملفات بسبب الحالة الكبيرة والصغيرة للحروف، وفي ويندوز يتم التفريق بين الحروف الكبيرة والصغيرة في أسماء الملفات. لذلك، يعتبر الملف 'c:/Users/saadaoui/Desktop/Backend/models/product.js' مختلفًا عن الملف 'c:/Users/saadaoui/Desktop/Backend/models/Product.js' بسبب اختلاف الحالة في الحرف الأول من اسم الملف (product.js مقابل Product.js). عندما تستدعي الملف './models/product' في الملف 'c:/Users/saadaoui/Desktop/Backend/index.js'، يحاول النظام إدراج الملف 'product.js' ولكنه يجد تعارضًا بسبب الاختلاف في حالة الحروف. يجب الاستدعاء الصحيح للملف هو الذي يتطابق مع الاسم الفعلي للملف بالضبط من حيث الحالة الكبيرة والصغيرة للحروف، أي الاستدعاء كالتالي: './models/Product' بدلاً من './models/product'. تأكد أيضًا من أنك تستخدم نفس الحالة الكبيرة والصغيرة لاسم الملف عند الاشارة إليه في الملف 'c:/Users/saadaoui/Desktop/Backend/index.js'.
×
×
  • أضف...