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

Hassan Hedr

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

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

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

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

    38

كل منشورات العضو Hassan Hedr

  1. المسافة بسبب إضافة تنسيق space-between الذي يوزع المساحة الفارغة بين العناصر، يمكنك اختبار إزالة ذلك التنسيق وستجد العناصر بجانب بعضها، أو يمكنك إبقائها وإضافة عنصر ثالث وستلاحظ كيف يتم توزيع المساحة الفارغة المتبقية بين تلك العناصر : <FlatList data={[{id: 1}, {id: 2}, {id: 3}]} ^^^^^^^
  2. الشيفرة غير مقروءة أسماء المتغيرات ضمن التوابع مبهمة وتحتاج إلى توضيح، يمكنك حصر المشكلة ضمن تابع ما (مثلًا المشكلة في التابع add) وتعديل أسماء المتغيرات لتعبر عن البيانات التي تحويها وتصبح مقروءة بشكل أفضل، وإرفاق مثال لاستخدام سليم ومثال لاستخدام به مشكلة حتى يتوضح سؤالك بشكل أفضل ونستطيع المساعدة
  3. يرجى إضافة الشيفرة البرمجية التي توصلت إليها ضمن نص السؤال حتى يتوضح استفسارك وتحصل على إجابة واضحة
  4. حاول استيراد ملفات CSS وجافاسكريبت من مكتبة bootstrap ضمن ملف جافاسكريبت الرئيسي للتطبيق كالتالي: import 'bootstrap/css/bootstrap.min.css'; import 'bootstrap/js/bootstrap.min.js'; في حال تريد تنسيقات bootstrap من اليمين إلى اليسار استبدل ملف CSS السابق بالتالي: import 'bootstrap/css/bootstrap.rtl.min.css'; بالنسبة لمكتبة boostrap-icons يمكنك استيراد تنسيقاتها كالتالي: import 'bootstrap-icons/font/bootstrap-icons.css';
  5. في البداية تكون كل المفاهيم جديدة وغير مألوفة بالنسبة لك، لكن بعد الممارسة وتكرار تطبيقها ضمن أكثر من سياق ستجد سهولة أكبر في فهمها وتطبيقها بشكل جيد، الأمر يعتمد أولا على فهمك للأفكار الجديدة بشكل جيد، لذا حاول ألّا تنتقل لفكرة جديدة قبل التمكن من الفكرة الحالية، بعدها حاول تطبيق الفكرة بنفسك خارج سياق المشروع إن أمكن، لا تعتمد على الحفظ فهو غير مهم هنا بسبب كمية المعلومات التي قد تستخدمها وسرعة تغييرها مع المستقبل، استبدل ذلك بمهارة البحث عن المعلومة والقراءة عنها ومهارة طرح السؤال بشكل واضح للحصول على إجابة، الحل هو التمرين والتطبيق العملي، ستجد نفسك تتقدم مع الوقت، يمكنك الاستفادة من قراءة المقال التالي:
  6. يجب الانتظار لحين الانتهاء من تحميل المستند بشكل كامل حتى يستجيب لمثل هذه الأوامر، لذا يفضل وضع الشيفرة ضمن الحدث DOMContentLoaded ما يعني انتهاء تحميل محتوى شجرة الكائنات DOM للصفحة كالتالي: document.addEventListener("DOMContentLoaded", function(event) { document.scroll(100,200); }); في حال كنت تستخدم JQuery يمكنك كتابته بالشكل التالي: $(document).ready(function() { document.scroll(100,200); });
  7. في هذه الحالة المشكلة قد تكون من تعريفك للخاصية التي تخزن عدد الزيارات بشكل ثابت static، هذا يعني أن المتغير سيتم مشاركته بين جميع كائنات Customers وليس لكل كائن عداده الخاص، هنا الحل يكون بإزالة الكلمة static لتصبح الخاصية خاصة بكل كائن على حدى بشكل منفصل
  8. في حال كنت تريد اعتبار الكائن عحاوية للخصائص ضمنها وللتوابع الخاصة للتعامل مع تلك الخصائص هنا يأتي دور البرمجة كائنية التوجه وتعريف المفهوم كصنف ضمن التطبيق، مثال يمكنك بعد تعريف الكائن الإشارة لاحقًا للخصائص التي يحتويها، وهنا يأتي دور الكلمة this حيث تعين قيم الخصائص على كل كائن جديد يتم إنشاؤه باستخدام new: function Person(name) { this.name = name; this.sayHi = () => console.log("My name is " + this.name); } const emad = new Person("Emad"); // لاحقا يمكن التالي emad.sayHi(); // My name is Emad console.log(emad.name) // Emad بينما في حال تعريفك للمفهوم على شكل تابع، فأنت تعامله كإجرائية تنفذ مرة واحدة وتنسى، أي لا يمكنك لاحقًا الاستفادة من الخواص الممررة للتابع، هي مجرد عمل ينفذ في كل مرة يستدعى التابع، يسمى هذا الأسلوب بالبرمجة الوظيفية ،مثال: function Person(name) { console.log("My name is " + this.name); } // يستدعى في كل مرة نريد التنفيذ Person("Emad"); // My name is Emad Person("Bilal"); // My name is Bilal يمكنك الاستفادة من قراءة المقالات التالية:
  9. المواصفات التي تهمك: وحدة المعالجة المركزية CPU، الجيل الذي ينتمي إليه والسرعة الخاصة به الذاكرة RAM، يهمك سعتها في سرعة أداء الجهاز وإمكانية فتح عدة برامج معًا دون التأثير على الأداء ذاكرة التخزين، تهمك سعتها لتخزن ملفات مشاريعك وبرامجك على الحاسوب من المواصفات الأخرى التي تهمك حجم الشاشة أيضًا، يمكنك الاستفادة من الإجابات على السؤال التالي
  10. الأمر يعتمد على عدة عوامل، الحاسب الشخصي يكون ثابت وغير قابل للتنقل، في حال ليس لديك مكان عمل ثابت أو تفضل التنقل الحاسب المحمول أفضل لك، المقارنة الحقيقية بينهما هي في مواصفات العتاد الممكن شراءها بتلك الميزانية، حيث لا فرق (تقريبًا) بين حاسب شخصي وحاسب محمول يملكان نفس القطع بنفس المواصفات، ركز على ما يهمك في حال كنت مبرمجًا سرعة المعالجة وسعة الذاكرة RAM مهمة لك، في حال كنت تعمل في مجال التصميم سعة وقدرة كرت الشاشة ستكون مهمة لك، فاضل بين المواصفات وما يناسبك من استخدام شخصي ومجال عملك
  11. الأمر المنفذ قام بتشغيل خادم websocket بنجاح على المنفذ 6005، لكن حال إغلاقك للطرفية Terminal سيتم إيقاف الخادم، لذا وبحسب نوع الاستضافة يجب إبقاء تشغيل الخادم ضمن إجرائية منفصلة دومًا، يجب التواصل مع الدعم الفني للاستضافة بخصوص أمرين: إمكانية وكيفية تشغيل خادم Websocket في الخلفية دومًا فتح المنفذ 6005 على الشبكة الواسعة WAN ليتمكن أي تطبيق من الوصول إليه عبر منفذ مخصص أو عنوان نطاق خاص حسب طبيعة تطبيقك يوجد العديد من المكتبات والإضافات ولكل منها طرقها الخاصة بتثبيتها والعمل بها، بل وتختلف أحيانًا طريقة الاستخدام من إصدار لآخر، لذا كمبرمج من المهم امتلاك مهارة البحث والقراءة ضمن توثيقات تلك المكتبات وحتى السؤال للحصول على معلومة تفيد المشروع الذي تعمل عليه
  12. يمكنك إضافة بيانات وصفية meta values إضافية خاصة باليوم والأسبوع الحالي، عبر إضافة بادئة لاسم المفتاح تدل على اليوم أو الأسبوع الحالي باستخدام التابع date والتنسيقات التالية: Y يدل على السنة الحالية m يدل عل الشهر الحالي d يدل على تاريخ اليوم W تدل على الأسبوع الحالي ضمن السنة وتعدل عليها دومًا كالتالي: function wpb_set_post_views($postID) { function increment_view_count($postID, $key) { $count = get_post_meta($postID, $count_key, true); if ($count == '') { $count = 0; delete_post_meta($postID, $count_key); add_post_meta($postID, $count_key, '0'); } else { $count++; update_post_meta($postID, $count_key, $count); } } // الكلي increment_view_count($postID, 'wpb_post_views_count'); // يومي increment_view_count($postID, date('Y_m_d') . '_wpb_post_views_count'); // 2022_05_17_wpb_post_views_count // أسبوعي increment_view_count($postID, date('Y_W') . '_wpb_post_views_count'); // 2022_20_wpb_post_views_count } لاحظ استخراج منطق جلب تعيين المشاهدات لأنه متكرر، وبنفس الطريقة نجلب نفس المفاتيح لليوم الحالي، لاحظ أيضًا استخراج منطق جلب عدد المشاهدات إلى تابع منفصل لأن العملية مكررة، يمكنك تنسيق النتيجة كما هو مناسب لتطبيقك كالتالي: function wpb_get_post_views($postID) { function get_view_count($postID, $key) { $count = get_post_meta($postID, $key, true); if ($count == '') { delete_post_meta($postID, $key); add_post_meta($postID, $key, '0'); return 0; } return $count; } return sprintf( '%d total views - %d views weekly - %d views today', // الكلي get_view_count($postID, 'wpb_post_views_count'), // يومي get_view_count(date($postID, 'Y_m_d') . '_wpb_post_views_count'), // أسبوعي get_view_count($postID, date('Y_W') . '_wpb_post_views_count'), ); } يمكنك الاستفادة من قراءة المقال التالي:
  13. الأمر المجدول يجب أن ينفذ عدة مرات في اليوم بشكل دائم، لذا بدل من تنفيذه يدويًا كل مرة يمكن إنشاء Cron Job يصف الأمر المراد تنفيذه والفترة الزمنية الواجب إعادة تنفيذه بعدها، ضمن الحقل Command أضف الأمر التالي: cd public_html && php artisan schedule:run >> /dev/null 2>&1 ضمن باقي الحقول ضع نجمة "*"، يمكنك أيضًا أن تجد الإعدادات جاهزة من قائمة Common Settings أضف الأمر المجدول بالضغط على Add New Cron Job سيتم تنفيذ الأمر تلقائيًا بعد ذلك، لكن تأكد أن جذر التطبيق لديك موجود ضمن public_html وإلا عدل هذا المسار ضمن الأمر المضاف إلى مسار جذر مشروع لارافل لديك
  14. إذا كنت تستخدم هذه الشيفرة في بناء تطبيق ويب فإن كل طلب جديد سينشئ كائنات Customer جديدة بخصائص جديدة تبدأ من الصفر، بحسب إطار العمل الذي تستخدمه الحل يكون بتخزين تلك القيمة ليس كخاصية ضمن الكائن نفسه بل ضمن مخزن دائم (كقاعدة بيانات أو معلومات الجلسة Session) وعند كل طلب تستخرج هذه القيمة إلى الصنف Customer وتضيف عليها وتحدثها ضمن المخزن
  15. الأمر المجدول يجب أن ينفذ عدة مرات وبشكل دائم، لذا لن تتمكن بنفسك يدويًا من ذلك، أضف الأمر إلى الحقل Command، وفي الحقول الباقية يجب وضع * وإضافة هذا العمل الجديد ليقوم نظام التشغيل بشكل تلقائي بتنفيذ هذا الأمر بشكل دائم بدلًا منك
  16. اللغة الرسمية لتطوير تطبيقات أندرويد هي لغة جافا، وهي لغة تعتمد مبدأ البرمجة غرضية التوجه وعمومًا هي أبسط وأسهل لغة في هذا المجال من ناحية التعلم، أساسيات اللغة تبقى نفسها سواء كنت تبرمج لتطبيقات أندرويد أم تطبيقات سطح مكتب، ما يختلف هو إطار العمل المستخدم أي الأصناف Classes التي تستخدمها لبناء التطبيق، ما تقصده هو بناء تطبيق متعدد المنصات cross platform أي بناء تطبيقات لمنصات مختلفة من نفس الشيفرة المصدرية، ولا يوجد إطار عمل مشهور يوفر ذلك حاليًا، يجب بناء تطبيقك بشكل منفصل مرة لتطبيق أندرويد ومرة لتطبيق سطح المكتب، قد تتمكن من استخراج بعض الشيفرات المشتركة بين التطبيقين (إذا كنت تملك خبرة كافية في كتابة شيفرات عالية التجريد) على شكل مكتبة Jar ومشاركتها بين التطبيقين بدل من كتابتها مرتين، لكن عمومًا سيوجد لديك مستودعين كل منهما خاص بتطبيق معين يمكنك الاستفادة من قراءة المقالات التالية:
  17. نعم يكفي تشغيل بعض تلك الأوامر يدويًا، يفضل الرجوع للتوثيق الرسمي للاستضافة لكل منها طريقة في إعداد ذلك، وفي حال واجهت مشكلات يمكنك عادة التواصل مع الدعم الفني لشركة الاستضافة وسيساعدونك في عملية الإعداد
  18. الإعدادات المذكورة متعلقة باستخدامك للحزمة Horizon لمراقبة التطبيق، والخطوات المذكورة هي على التوالي لتشغيل خادم مقابس الويب ثم انشاء مهمة مجدولة لتشغيل الدور Queue للتطبيق ثم تشغيل horizon نفسه، supervisor هو برنامج مراقبة الإجرائيات يمكن تثبيته ضمن لينكس، ودوره هو إبقاء إجرائية horizon تعمل بلا توقف، الملاحظة الأولى: خادم مقابس الويب عادة يعمل بشكل منفصل، الملاحظة الأولى تخبرك بضرورة تشغيل خادم Websocket بتنفيذ الأمر التالي مع تغيير رقم المنفذ بما هو مناسب للمشروع: php artisan websockets:serve --port=6006 الملاحظة الثانية تخبرك بضرورة إنشاء cronjob يعمل بشكل دائم وينفذ الأمر php artisan schedule:run ضمن ملف مشروعك لكي تعمل الوظائف Jobs المستخدمة ضمن المشروع: * * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1 يمكنك الاستفادة من قراءة المقال التالي: الملاحظة الثالثة متعلقة باستخدام horizon لمراقبة الدور Queue أثناء عمل تطبيقك عبر تنفيذ الأمر التالي لبدء المراقبة: php artisan horizon والأمر التالي لإيقاف عملية المراقبة: php artisan horizon:terminate
  19. التنسيقات التي أضفتها تؤثر فقط على وسوم img ضمن text-box. داخل landing.، بينما الصورة hero تقع خارج text-box، كما ذكرت لك حدد للصورة صنف hero أولا كي لا تؤثر على الصورة الأخرى كالتالي: <img src="images/hero.svg" class="hero" /> ^^^^^^^^^^^^ أخرج التنسيقات الخاصة بتلك الصورة إلى داخل landing فقط واحذف القديمة وحددها عبر الصنف hero كالتالي: .landing { .text-box { ... } img.hero { width: 100%; max-width: 650px; } }
  20. هل يمكنك إرفاق ملفات المشروع بعد التعديل من فضلك
  21. نعم فانزياح الصورة خارج حدود الحاوية لها يجعل فراغًا تلاحظه على طول الصفحة
  22. @Mohamed Montaser3المشكلة لديك في الصورة hero.svg، يجب تحديد العرض لها ب 100% حتى لا تتجاوز عرض الحاوية وتظهر لديك أخطاء في التنسيقات، ولتنسيقها ضمن قياسات الشاشات الكبيرة يمكنك استخدام max-width حتى لا تصبح أكبر من اللازم، أضف الصنف hero إلى وسم الصورة، ثم أضف التنسيقات التالية: .hero { width: 100%; max-width: 650px; }
  23. في حال كان المتغير الذي يخزن عدد الزيارات للعميل هو خاصية ضمن الصنف Customer، هذا يعني أن لكل كائن جديد ينشئ باستخدام new عداده الخاص، أي لحساب زيارتين لنفس العميل يجب استدعاء count على نفس الكائن مرتين كالتالي: Customer shahad = new Customer("shahad"); shahad.count(); // أول زيارة لشهد shahad.count(); // الزيارة الثانية لشهد Customer reem = new Customer("reem"); reem.count(); // أول زيارة لريم يمكنك الاستفادة من قراءة المقال التالي:
  24. يفضل إرفاق الشيفرة بشكل نصي ضمن الأسئلة العامة، في حال كنت تنفذ أحد المشاريع ضمن دروس الدورات يمكنك التعليق أسفل الدرس وإرفاق الملفات ليتم مساعدتك
  25. الصنف أو Class يمكن اعتباره المخطط الذي يستخدم لتوليد الكائنات Objects، يحوي الصنف تعريفًا بالتوابع والخصائص التي ستتوفر ضمن كائنات هذا الصنف، يوجد تابع خاص افتراضي يسمى التابع الباني Contractor، مهمته الأساسية تحديد كيفية بناء الكائنات من الصنف، مثال الصنف التالي: class Person { } باستخدام الكلمة new يمكن استدعاء التابع الباني عبر ذكر اسم الصنف ثم قوسي استدعاء التابع الباني : const emad = new Person(); يمكن تخصيص التابع الباني ضمن الصنف وتحديد المعاملات اللازمة لإنشاء كائن جديد وتعيين تلك المعاملات إلى خصائص ضمن الصنف: class Person { constructor(name, age) { this.name = name; this.age = age; } } الآن يجب تمرير تلك المعاملات عند إنشاء كائن جديد: const emad = new Person("Emad", 27); console.log(emad.name); // "Emad" console.log(emad.age); // 27 يمكنك الاستفادة من قراءة المقالات التالية:
×
×
  • أضف...