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

Mustafa Suleiman

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

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

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

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

    300

أجوبة بواسطة Mustafa Suleiman

  1. الطريقة التي تستخدمها لربط عدة collections في Firebase صحيحة وليست بها خطأ، ولكن، قد يصعب إدارة العديد من عمليات الربط لأكثر من 25 مجموعة.

    ولتحسين الأداء، تستطيع استخدام دالة الاستعلامات المتعددة (Batched Writes) في Firebase التي تتيح لك إنشاء وتحديث وحذف العديد من المستندات في مجموعة واحدة في نفس الوقت.

    وبإمكانك الاطلاع على التفاصيل الكاملة عن Batched Writes في Firebase من هنا: https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes 

    أيضًا عليك بالنظر في إمكانية استخدام الرسائل الفورية (Firebase Cloud Messaging) في Firebase لتحسين الأداء وتقليل العمليات اللازمة للحصول على بيانات جديدة وإرسالها إلى التطبيق الخاص بك.

    بالإضافة إلى النظر في تحسين هيكل البيانات الخاص بك في Firebase لتقليل عدد المستندات التي تحتاج إلى الوصول إليها في كل مرة.

    مثلاً، دمج بعض المعلومات في مستند واحد بدلاً من إنشاء مستندات منفصلة لكل بيانات.

    وإليك بعض الأفكار التي يمكن استخدامها لتحسين الكود الخاص بك:

    • استخدام الدوال المتعددة للحصول على بيانات متعددة بدلاً من استخدام await Future.wait، وذلك قد يحسن من الأداء ويجعل الكود أكثر وضوحًا وقابلية للصيانة، مثال: استخدام الدالة getBooksSnapshot بدلاً من await booksSnapshotFuture.
    • تستطيع استخدام Stream للحصول على بيانات متعددة من Firebase بطريقة فعالة من حيث الأداء، من خلال إنشاء Stream واحد للحصول على جميع البيانات المطلوبة من Firebase.
    • يمكن هيكلة قاعدة البيانات الخاصة بك بشكل أفضل لتجنب الحاجة إلى الوصول إلى عدة مجموعات للحصول على بيانات متعددة، عن طريق إنشاء مجموعات فرعية أو إضافة بيانات إضافية إلى المستندات الحالية لتجنب الحاجة إلى الوصول إلى مجموعات متعددة للحصول على بيانات متعددة.

     

    • أعجبني 1
  2. بالطبع أنت قمت بتثبيت إطار Django وبايثون على حاسوبك، إذن عليك القيام بالتالي:

    1. قم بفتح موجه الأوامر (command prompt) واستخدم "cd" للانتقال إلى مجلد العمل الخاص بك.
    2. بعد ذلك، استخدم الأمر "django-admin startproject" لإنشاء مشروع Django جديد.
    3.  بمجرد إنشاء المشروع ، انتقل إلى دليل المشروع باستخدام الأمر "cd".
    4. استخدم الأمر "python manage.py runserver" لتشغيل السيرفر المحلي، ويمكنك الآن فتح متصفح والوصول إلى الموقع الخاص بك عن طريق الذهاب إلى العنوان "http://localhost:8000/".
    5.  إذا كنت تريد تغيير رقم المنفذ الافتراضي للسيرفر المحلي ، فتستطيع استخدام الأمر "python manage.py runserver 0.0.0.0:8080" لتشغيل السيرفر على المنفذ 8080.
    6. وبعد ذلك يمكنك تنفيذ تطبيق الإدارة الخاص بك في السيرفر المحلي وتحميله في المتصفح الخاص بك عن طريق زيارة العنوان "http://localhost:8000/admin".

    وأيضًا بإمكانك إنشاء بيئة افتراضية (Virtual Environment) لمشروع Django الخاص بك لتفادي تعارض الإصدارات مع الحزم الأخرى المثبتة في جهاز الكمبيوتر الخاص بك، وذلك من خلال التالي:

    1-إنشاء مجلد جديد:

    mkdir {directory_name}

    نضيف مكان {directory_name} اسم المجلد الجديد، مثلاً mkdir app وسينشيء مجلد باسم app في نظام ويندوز.

    2- تثبيت جانغو Django:

    pipenv install django

    3- تفعيل البيئة الإفتراضية:

    pipenv shell

    4- إنشاء مشروع جانغو جديد:

    django-admin startproject {project_name} .

     عليك بتغيير مكان {project_name} باسم مشروع جانغو.

    5- تشغيل مشروع جانغو:

    python .\manage.py runserver

    6- إنشاء تطبيق جانغو:

    python .\manage.py startapp {app_name}

    واستبدل {app_name} باسم تطبيق جانغو الذي تريده.

  3. الخطأ يظهر أن هناك تعارض في متطلبات الحزم المستخدمة في مشروعك. وتحتاج إلى التحقق من ملف composer.json الخاص بمشروع Laravel الخاص بك والتأكد من أن متطلبات الحزم محدثة وتتوافق مع متطلبات حزمة Chatify.

    في هذه الحالة، تحتاج إلى تحديث متطلبات الحزم في ملف composer.json لتتوافق مع متطلبات حزمة Chatify، و يمكنك القيام بذلك عن طريق تنفيذ الأمر التالي في مجلد مشروع Laravel الخاص بك:

    composer require pusher/pusher-php-server:^7.0

    ومن ثم، يمكنك تنفيذ أمر تثبيت Chatify مرة أخرى باستخدام الأمر التالي:

    composer require munafio/chatify

    وإذا واجهت أي مشاكل أخرى، فيمكنك استخدام الخيار --with-all-dependencies للسماح بالتحديثات والإزالات للحزم التي تم تأمينها على إصدارات محددة.

    composer require munafio/chatify --with-all-dependencies

     أيضً تستطيع ا تحديد الإصدار المحدد لحزمة Chatify بإضافة القيود الخاصة بالإصدار في الأمر composer require:

    composer require munafio/chatify:^1.6.1

    بعد تحديث متطلبات الحزم وتثبيت Chatify بنجاح، تأكد من تنفيذ الأمر التالي لتحديث ملف الارتباطات composer.lock:

    composer update

    وفي النهاية، تأكد من إضافة مزود Pusher إلى ملف تكوين Laravel الخاص بك config/app.php كما هو موضح في توثيق Chatify.

    • شكرًا 1
  4. هناك إضافة godot-python التي تمكنك من استخدام لغة البرمجة بايثون في محرك الألعاب Godot.

    حيث أن إضافة godot-python هي إضافة مفتوحة المصدر توفر واجهة برمجية تسمح بكتابة البرامج النصية بلغة بايثون داخل Godot، وتوفر دعمًا للإصدارات الأقدم من Godot بالإضافة إلى Godot 4.

    وستحتاج إلى محرر Visual Studio وتثبيت اللإضافات اللازمة الخاصة بلغة C++ أثناء تثبيت البرنامج، حيث ستجد إضافة باسم Desktop development with C++.

    وبعد ذلك عليك بإنشاء بيئة إفتراضية للغة بايثون ثم تثبيت إضافة godot-python  من المستودع، وإتباع الخطوات التي تم شرحها في مستودع الإضافة حيث هناك خطوات تفصيلية.

    وأيضًا تستطيع البحث عن Integrating Python into Godot وستجد شروحات عن هذا الأمر.

    وهناك أمر آخر ألا وهو إمكانية  استخدام لغة البرمجة بايثون Python لتعزيز قدرات محرك الألعاب Godot، عن طريق تشغيل السكريبت بالخلفية أثناء تشغيل اللعبة في الجهة الأمامية.

    وذلك من خلال إنشاء بيئة افتراضية virtual environment للبرامج بلغة بايثون، وتنفيذ الأوامر في وقت التشغيل، والتعامل مع الأرقام والمصفوفات.

    ولرؤية شرح عن ذلك عليك بالبحث عن Use Python to Enhance The Godot Game Engine وستجد أمثلة وشرح حول الأمر.

     حل آخر باستخدام لغة GDScript 

    GDScript هي لغة برمجة عالية المستوى ومكتوبة بشكل ديناميكي تستخدم لإنشاء محتوى في محرك ألعاب Godot.

    تستخدم اللغة نحوية الفراغات للتنسيق indentation-based syntax، وهي تشبه لغات البرمجة مثل Python.

    وهدف GDScript هو أن يكون محسّنًا ومتكاملاً بشكل وثيق مع محرك Godot، مما يسمح بمرونة كبيرة لإنشاء المحتوى والتكامل.

    وتمامًا كما يوحي اسمها، فإن GDScript مستقلة بالكامل عن لغة Python وليست مبنية عليها.

    لذلك يمكن القول أن GDScript تعتمد بشكل أساسي على تنسيقها الخاص والمحسّن لمحرك Godot وليست تعتمد على أي لغة برمجة أخرى.

  5. بالنسبة لسؤالك الأول، فإذا أردت إزالة الرسومات التي تم إنشاؤها باستخدام Plotly.js ، تستطيع استخدام الأمر التالي:

    Plotly.purge()

    وهذا الأمر يمكنه إزالة جميع الرسومات من المنطقة النشطة.

    أما بالنسبة لسؤالك الثاني، فهناك العديد من الأسباب التي قد تؤدي إلى عدم ظهور الرسمة وهذا يتطلب التحقق من عدة عوامل،

    مثلاً، إذا كانت قيم x و y تم تمريرها بشكل صحيح وإذا كان لديك أيضًا عناصر HTML و CSS اللازمة لعرض الرسمة في صفحتك.

    حاول استخدام Console log للتحقق من الأخطاء في الكود  الذي تم إنشاؤه ويمكنك أيضًا استخدام محرر النصوص المدمج في المستعرض للتحقق من أي أخطاء في HTML أو CSS.

    وتأكد من أن كل من phi و h هي مصفوفات من الأعداد التي تحتوي على 16 عنصرًا، حيث يبدو أن عدد العناصر في كلا المصفوفتين يجب أن يكون متساويًا لأنهما تم تمريرهما كقيم x و y في مصفوفة البيانات.

    كما يجب التأكد من أن لديك أيضًا الرمز اللازم لعرض الرسمة في صفحتك HTML/CSS، وعلى سبيل المثال، يمكنك إضافة عنصر div إلى صفحتك HTML وتحديد الارتفاع والعرض الخاص بالرسمة، ثم تحديد معرف العنصر الخاص بـ div كـ id للمصفوفة layout ، مثل هذا الشكل:

    <!DOCTYPE html>
    <html>
    <head>
    </head>
    <body>
    	<div id="plotly-div" style="width: 600px; height: 400px;"></div>
    	<script>
    		var data = [{x:[phi], y:[h], type: 'curve'}];
    		var layout = {
    			fileopt : "overwrite",
    			filename : "simple-node-example",
    			// إعدادات أخرى مثل عنوان المخطط وأي إعدادات أخرى يمكن إضافتها هنا
    		};
    		Plotly.newPlot('plotly-div', data, layout);
    	</script>
    </body>
    </html>

    و سيتم إنشاء عنصر div بمعرف plotly-div حيث يتم تعيين العرض والارتفاع. بعد ذلك، يتم إنشاء مصفوفة data ومصفوفة layout ويتم استخدام Plotly.newPlot() لرسم الرسمة داخل العنصر div المحدد بمعرف plotly-div.

    وإذا كنت تستخدم الكود في محرر الأكواد VScode فلا تنسى استيرد أو تثبيت المكتبة، ويمكنك استخدام CDN كالتالي:

    <head>
      <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
    </head>

     

  6. أرجو أن تتفهم سبب عدم وجود إمكانية لذلك، حيث أنه في حالة السماح بتحميل الفيديو سيتم إتاحة الدورات للجميع، وقد تم بذل مجهود كبير من قبل فريق من المدربين في إعداد وتوفير تلك الدورات لك، وأيضًا يتم تحديث الدورات كل 3 شهور بالإضافة إلى الدعم من قبل أكثر من مدرب للإجابة على أسئلتك ومساعدتك في أي وقت.

    وأيضًا الشهادة والإختبارات والدورات الأخرى التي يتم توفيرها لك لاستكمال مسارك البرمجي الذي إخترته.

    والسبب الرئيسي لعدم السماح بتحميل الكورسات لمشاهدتها offline هو أن معظم منصات التعليم الإلكتروني تعتمد على نموذج البث المباشر لتوفير المحتوى التعليمي، ويتم تخزين محتوى الفيديو والمواد التعليمية على خوادم الشركة المزودة للخدمة التعليمية والتي يتم الوصول إليها من خلال الإنترنت فقط.

    وأيضًا هناك سبب آخر، إتاحة المواد التعليمية بشكل مجاني يضر أكثر مما يفيد، فمن طلب الإجتهاد وعلو الشأن عليه ببذل بعض الجهد ودفع جزء من ماله ليثبت صدق عزيمته ويحصل على مواد تعليمية قيمة تؤهله لمراده، بينما من ليس لديه عزيمة وصدق في طلبه فلن يقوم بذلك على عكسك أنت.

  7. بالإضافة إلى الطريقة التي ذكرها لك عدنان، هناك عدة طرق  لتجميع الأرقام الزوجية الأقل من 20 تلقائيًا وتشمل:

     

    1- استخدام حلقة (loop) لتكرار الفحص والإضافة. يمكن استخدام حلقة لتكرار عملية الفحص والإضافة حتى الوصول إلى جميع الأرقام المدخلة.

    من خلال الحلقة مع جملة if للتحقق مما إذا كان العدد زوجيًا وأقل من 20، وإذا كانت الشروط متوفرة يمكن إضافة العدد إلى المتغير result.

    2- استخدام مصفوفة (array) لتخزين الأرقام وإجراء الفحص. يمكن تخزين الأرقام المدخلة في مصفوفة واستخدام حلقة لتحقيق الفحص والإضافة إلى المتغير result.

    عن طريق الجملة if داخل الحلقة للتحقق مما إذا كان العدد زوجيًا وأقل من 20، وإذا كانت الشروط متوفرة يمكن إضافة العدد إلى المتغير result.

    3- الإعتماد على الدالة (function) لتنفيذ الفحص والإضافة. يمكن إنشاء دالة تتلقى مجموعة من الأرقام كمدخلات وتقوم بتنفيذ الفحص والإضافة تلقائيًا. يمكن استخدام الجملة if داخل الدالة للتحقق مما إذا كان العدد زوجيًا وأقل من 20، وإذا كانت الشروط متوفرة يمكن إضافة العدد إلى المتغير result. يمكن استخدام الدالة في أي مكان في الشيفرة التي تريدها لتجميع الأرقام الزوجية.

    مثال للطريقة الثانية:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int result = 0;
        int num;
    
        cout << "Please enter a number: ";
    
        while (cin >> num && num < 20) {
            if (num % 2 == 0) {
                result += num;
            }
            cout << "Please enter another number: ";
        }
    
        cout << "The sum of even numbers smaller than 20 is: " << result << endl;
    
        return 0;
    }

    والكود يطلب من المستخدم إدخال عدد واحد فقط في البداية، ثم استخدام حلقة while لطلب المزيد من الأرقام الزوجية الأقل من 20 مع الاستمرار في إضافة الأرقام إلى المتغير result.

    ويتوقف البرنامج عندما يتم إدخال رقم غير زوجي أو رقم أكبر من 20. في النهاية، يتم طباعة مجموع الأرقام الزوجية الأقل من 20.

    • شكرًا 1
  8. Firebase هي منصة شاملة تحتوي على خدمات عديدة، بما في ذلك قاعدة بيانات Realtime و Cloud Firestore، وتستطيع استخدام أي منهما بناءً على احتياجاتك.

    إذا كنت تستخدم Cloud Firestore، فإنه يستخدم نموذج قاعدة بيانات NoSQL مختلف عن نموذج MySQL الذي اعتدت عليه.

    حيث يتم تخزين البيانات في مستندات (documents) في مجموعات (collections) بدلاً من الجداول (tables). لكن يمكن الوصول إلى البيانات باستخدام العلاقات والاستعلامات التي تتطلبها تطبيقك.

    مثلاً، يمكنك إنشاء مجموعتين، واحدة لـ"الكتب" وأخرى لـ"السنوات"، ثم ربطهما معًا باستخدام مفتاح خارجي، وهذا يمكن القيام به باستخدام المراجع (references) في Firestore.

    بخصوص السؤال الثاني

    من المناسب تخزين البيانات التي تريد عرضها في القوائم المنسدلة (dropdown lists) في قاعدة البيانات، حتى يمكنك تحديث هذه البيانات وإضافة عناصر جديدة دون الحاجة إلى تحديث تطبيقك.

    وتستطيع تخزين هذه البيانات في مجموعة خاصة بها في قاعدة البيانات، أو يمكن استخدام Firebase Realtime Database لتخزينها كما أنه يسمح بتخزين بيانات في شكل JSON.

    أي يمكنك تخزين البيانات المختلفة سواء في قاعدة البيانات أو كملفات JSON داخل تطبيقك.

    ولكن إذا كانت هذه البيانات تحتوي على معلومات متغيرة بشكل مستمر أو تحتاج إلى تحديثات من الخادم، فقاعدة البيانات هي الخيار الأفضل.

    • أعجبني 1
  9. مما أراه في الصورة أن هناك تحذير يظهر في قاعدة البيانات phpMyAdmin وهو عبارة عن رسالة خطأ تشير إلى أن هناك خطأ في الجدول الذي يسمى "global_priv" في قاعدة البيانات MySQL.

    ويقوم نظام phpMyAdmin بمحاولة إصلاح هذا الجدول ، لكنه يعتبر أن الفهرس الخاص به تالف ولا يمكن إصلاحه.

    لذلك، يمكنك محاولة تشغيل أمر REPAIR TABLE على الجدول المتضرر باستخدام أداة MySQL مثل MySQL Command Line Client أو phpMyAdmin نفسه.

    REPAIR TABLE global_priv;

    وإذا لم يعمل الأمر السابق ، يمكنك حذف الجدول المتضرر وإعادة إنشائه، ويرجى ملاحظة أنه قد يتم فقدان البيانات في حالة حذف الجدول ، لذلك يرجى إجراء نسخ احتياطي قبل القيام بأي إجراءات.

    وأيضًا تأكدي من أن جدول باسم user حيث أن رسالة الخطأ تشير إلى أنه تم إجراء استعلام SELECT على جدول يسمى "mysql.user" في قاعدة البيانات MySQL والذي يطلب فقط تحديد صف واحد من الجدول باستخدام عبارة "LIMIT 1" وعندما يتم تنفيذ الاستعلام، فإنه يواجه خطأ.

    قد يكون السبب هو أن الجدول "mysql.user" غير موجود في قاعدة البيانات MySQL أو أن الحساب الذي يستخدمه phpMyAdmin للوصول إلى قاعدة البيانات لا يمتلك الأذونات اللازمة لعرض محتويات الجدول.

    • أعجبني 1
  10. بتاريخ 6 ساعة قال محمود قربون:

    واريد ان اسال كم احتاج ساعة دراسة في اليوم ل الانتهاء من الدورة ؟

     

    إذا كنت متفرغ فأنصحك بتخصيص 6 إلى 10 ساعات يوميًا للمذاكرة، أما إذا كنت غير متفرغ فيمكنك تخصيص 3 ساعات يوميًا للمذاكرة أو ساعتان حيث أن أقل من ذلك لا يعتبر وقت كافي.

    وكلما زدت في الوقت والإجتهاد كان أفضل لك، ولكن ذلك لا يعني أن تخصص 10 ساعات لمشاهدة الفيديوهات بل خليط ما بين المشاهدة ثم الكتابة وراء المدرب أو بمفردك ومحاولة التغيير في الكود الذي كتبه المدرب وخلق تحدي بسيط لك وأيضًا البحث عن حل للمشاكل التي تواجهك من خلال القراءة أو مشاهدة فيديو على اليوتيوب مثلاً ولكن حاول البحث والقراءة أولاً.

    فلا تعود نفسك على رؤية الحل مباشرًة فعند البحث ستجد معلومات كثيرة أنت بحاجة إليها في البداية، وأيضًا ستكتشف المصادر الخاصة بالمعلومات والأدوات.

    أي أن الوقت اللازم يتوقف عليك أنت، فالبعض قد ينهي الدورة بشكل سريع لكن هل حقق الاستفادة المرجوة فعلاً؟

    وهناك نصيحة، في البداية عليك أن تسير ببطيء من أجل الإسراع لاحقًا لا العكس، حيث أن الأساسيات هي ما ستوفر لك التعلم بشكل أسرع مستقبلاً وتجنب التخبط والتشتت.

    بتاريخ 6 ساعة قال محمود قربون:

    وما هي طريقة التعلم الصحيحة تسجيل المعلومات ام مشاهدة الفيديو اكثر من مرا ؟

     

    كل شخص له طريقة مفضلة في المذاكرة واسترجاع المعلومات، مثلاً إذا كان الكتابة بالورقة والقلم مريح لك ويفيدك فقم بتسجيل المعلومات الهامة التي تريد استرجاعها فيما بعد.

    والبعض يفضل مشاهدة 4 فيديوهات مثلاً ثم التطبيق بمفرده بدون الكتابة وراء المدرب، ومحاولة البحث، ثم الرجوع للفيديو لتذكر أمرًا ما أو رؤية كيفية تنفيذ كود معين.

    ودائمًا وأبدًا أفضل طريقة هي من خلال كتابة الكود، فمهما قمت بالمشاهدة حتى لو ألف ساعة، ذلك لا يغني عن كتابة الكود بيديك وتمرين عقلك على حل المشكلات البرمجية والتفكير قبل كتابة الكود.

    بتاريخ 6 ساعة قال محمود قربون:

    وهل اشاهد الفيديو واطبق المعلومات ام اشاهد الفيديو مرة واحدة واحاول ان اطبق لوحدي ؟

     

    إذا كان الفيديو بحجم صغير فقم بمشاهدة فيديو حتى 4 فيديوهات تبعًا لما يناسبك، ثم قم بالتطبيق بمفردك لمحاكاة ما قام به المدرب، ثم حاول إضافة ميزة أو خاصية جديدة أو القيام بشيء معقد قليلاً أي اخلق تحدي بسيط يجعلك تبحث أو تفكر قليلاً إذا أردت.

    ولا مشكلة في الرجوع للفيديو لتذكر أمرًا ما، لكن ذلك ملاذك الأخير بعد التفكير والبحث.

    بتاريخ 6 ساعة قال محمود قربون:

    انا وصلت مسار بناء صفحات هبوط لكن ما نسيت المسارات الي قبل بشكل تام 

    عند الرجوع للدورة بعد فترة إنقطاع، أفضل طريقة للاسترجاع هي بإعادة القيام بتنفيذ مشروع قمت بتنفيذه من قبل في الدورة.

    حيث أن ذلك سيحفزك إلى مذاكرة الأمور التي نسيتها من خلال إعادة المشاهدة أو البحث.

    وتستطيع أيضًا إعادة المشاهدة ولكن بسرعة 2X ثم إعادة التطبيق على مشروع لتثبيت ما تم استرجاعه.

     

  11. 1- لكي تظهر رسم بياني من Plotly.js في output في VSCode، تستطيع استخدام مكتبة "plotly-nodejs" والتي تسمح بإنشاء رسوم بيانية من Plotly.js دون الحاجة إلى فتح المتصفح.

    ولتثبيت هذه المكتبة باستخدام npm، اكتب الأمر التالي:

    npm install plotly-nodejs

    ثم يمكنك استخدام الكود التالي كمثال لإنشاء رسم بياني من Plotly.js وطباعته في output في VSCode:

    const plotly = require('plotly-nodejs');
    
    const data = [
      {
        x: [1, 2, 3],
        y: [4, 5, 6],
        type: 'scatter'
      }
    ];
    
    const layout = {
      title: 'My Plotly Chart'
    };
    
    plotly.plot(data, layout).then((figure) => {
      console.log(figure);
    }).catch((err) => {
      console.error(err);
    });

    2- لا يمكن التحكم في جدول Console باستخدام أوامر Console مثل console.table لأنها تتحكم فقط في كيفية طباعة البيانات في Console.

    ومع ذلك، تستطيع استخدام مكتبات Node.js مثل "cli-table" لإنشاء جداول مع تحكم كامل في التنسيق والعرض. ولتثبيت هذه المكتبة باستخدام npm، اكتب الأمر التالي:

    npm install cli-table

    وتستطيع استخدام الكود التالي كمثال لإنشاء جدول وطباعته في output في VSCode:

    const Table = require('cli-table');
    
    const table = new Table({
      head: ['Name', 'Age', 'Gender'],
      style: {
        head: ['green'],
        border: ['white']
      }
    });
    
    table.push(
      ['John', 30, 'Male'],
      ['Jane', 25, 'Female'],
      ['Bob', 45, 'Male']
    );
    
    console.log(table.toString());

     

    • شكرًا 1
  12. بتاريخ 4 دقائق مضت قال Iham Hatem:

    نعم يتغير اتجاه النص نفسه وليس المحاذاة ولكن تم حل المشكلة الحمدلله 

    السبب في أن تغيير الاتجاه إلى اليمين وتحديد النص إلى اليمين يعمل في هذه الحالة هو استخدام القاعدة العامة "*".

    حيث أن علامة"*" تطبق تنسيقًا على جميع عناصر الصفحة، بما في ذلك النصوص والصور وغيرها، مما يجعلها قاعدة CSS عامة وقوية. بإضافة !important في النهاية، تمنع تطبيق أي قيمة CSS أخرى للعناصر المحددة، مما يجعل هذا التنسيق الأكثر أولوية ويتم تطبيقه بشكل قاطع على جميع العناصر.

    على الرغم من أن استخدام القاعدة العامة "*" و !important يمكن أن يكون حلًا سريعًا لتغيير محاذاة الموقع، إلا أنه يجب الانتباه إلى الأثر الجانبي الذي قد يكون لهذه الطريقة على التصميم العام للموقع، حيث يتم تطبيق التنسيق على جميع العناصر الموجودة في الموقع، بما في ذلك العناصر التي لا تتطلب تغييرًا في الاتجاه أو تحديد النص. لذلك، من الأفضل استخدام المحددات المحددة بدقة لتطبيق التنسيق الذي تريده بشكل أفضل.

    وأيضًا من الأفضل أن تنتيه جيدًا للـ CSS Specificity أثناء كتابة التسيقات، وسأشرح لك الأمر:

    تعتبر CSS Specificity (التحديدية) هي طريقة لتحديد أيّ تعليمات CSS ستطبّق على عناصر الصفحة، عندما يتواجد أكثر من قاعدة تعريف CSS تستهدف نفس العنصر. بمعنى آخر، الـ Specificity تحدد الأولوية بين القواعد المختلفة عند تطبيقها على نفس العنصر.

    يتم تحديد Specificity بناءً على عدد المحددات والفئات والعناصر المستخدمة في تحديد العنصر المستهدف في القاعدة CSS. تبدأ Specificity من أصفر إلى أعلى، حيث تتمثل في العدد الذي يتم تحديده بناءً على الأنواع الثلاثة التالية:

    1- الـ Inline Styles

    تعتبر الأولوية العالية جدًا، حيث يتم كتابة الأوامر CSS مباشرة في العنصر، وتطبق هذه الأوامر دون أي تأخير.

    2- الـ ID Selectors

    يأتي بعدها محدد الـ ID، والذي يتم تحديده بواسطة "#" متبوعاً بإسم الـ ID. على سبيل المثال، "#header".

    3- الـ Classes والـ Attributes والـ Elements Selectors

    تأتي هذه التحديدات في المرتبة الأخيرة من ناحية التحديدية. ويشمل ذلك تحديد الـ class والـ attribute والـ element. على سبيل المثال، ".main-header"، "[type="text"]"، "p"، وهكذا.

    يتم ترتيب الأولويات كما يلي:

    • الأولوية العالية للـ Inline styles.
    • إذا كان هناك ID، فإنها تأخذ الأولوية على التحديدات الأخرى.
    • إذا كانت التحديدات متساوية في ID، يتم التحقق من التحديدات الموجودة في الـ classes/attributes/elements.
    • في حالة وجود تحديدات متساوية في جميع المستويات، يتم تطبيق الأخير الذي تم تعريفه في الكود.
  13. الخطأ يعني أن GD Library غير متاحة في مكان تثبيت PHP الخاص بك، وتحتاج إلى تثبيتها وتمكينها على الخادم الخاص بك لتتمكن من تحويل الصور وتغيير حجمها باستخدام مكتبة الوسائط Spatie.

    وتستطيع القيام بذلك عن طريق التحقق من تثبيت GD Library على الخادم الخاص بك وتمكينها في ملف php.ini الخاص بـ PHP. 

    بعد تمكين GD Library  يجب أن تعمل Spatie media library بشكل صحيح ويمكنك رفع الصور بنجاح.

    وعلى نظام ويندوز تستطيع تحميل وتثبيت ملف DLL الخاص بـ GD Library من على الموقع الرسمي لـ PHP.

    وعليك بالعثور على الإصدار الصحيح من GD Library الذي يتوافق مع إصدار PHP الذي تستخدمه، ثم تحميل الملف DLL ونسخه إلى مجلد ext في مكان تثبيت PHP الخاص بك.

    ثم تفعيلها في ملف php.ini  عن طريق إضافة السطر التالي:

    extension=gd

    وهناك حزمة أخرى لتعامل مع الصور تستخدم على نطاق واسع في لغة PHP وتدعى "ImageMagick"، وتلك الحزمة تتيح لك التلاعب بالصور بطريقة متقدمة أكثر من GD Library وتدعم تنسيقات الصور الشائعة.

    وتستطيع تثبيت ImageMagick على الخادم الخاص بك بنفس الطريقة التي تم تثبيت GD Library بها.

    بمجرد تثبيت ImageMagick وتمكينه في ملف php.ini الخاص بـ PHP، يمكنك استخدامها مع Spatie media library أو أي حزمة أخرى لتعامل مع الصور في PHP.

    والجدير بالذكر أنه يمكن استخدام GD Library و ImageMagick معًا في نفس الوقت في بعض الحالات للحصول على أفضل نتائج التلاعب بالصور في PHP.

    • شكرًا 1
  14. يتم إضافة shadow تلقائيًا على الشرائح في swiper أو للدقة يتم إضافة linear-gradient من خلال خاصية background-image فكما ترى في الصورة هناك كلاس باسم:

    • swiper-slide-shadow-left
    • swiper-slide-shadow-right

    Screenshot2023-04-26152848.thumb.png.407a47cd193ea85751e966a9c16b8f9d.png

    وهو المسؤول عن إضافة الظل الذي تراه، ولحل تلك المشكلة، يمكنك استخدام التنسيق التالي في ملف App.css لديك:

    .swiper-slide-shadow-left,
    .swiper-slide-shadow-right {
      background-image: none !important;
    }

     

    • شكرًا 1
  15.  يجب أن تحدد ما الذي تريد فعله بالضبط من خلال تعلمك PHP و وورد بريس.

    هل تريد إنشاء مشروع خاص بك فقط، أو العمل بواسطة وورد بريس فقط؟ أي أنك ستتخصص في وورد بريس؟

    ذلك ممكن بالتأكيد، لكن إذا أردت العمل بشكل إحترافي والحصول على وظيفة، فيجب تعلم إطار لارافيل فهو ما يعطي للغة PHP قيمتها في سوق العمل، فبدونه لكانت اللغة قل استخدامها بشكل كبير منذ سنوات.

    ويجب عليك استكشاف المهارات المطلوبة لوظيفة مطور PHP وتعلم تلك المهارات، ألقي نظرة على مواقع التوظيف وإنظر على أكثر من وظيفة وتعلم المهارات التي تم طلبها بكثرة، والتي بالطبع ستجد من ضمنها إطار لارافيل وأحيانًا تجد مطلوب إطار Vue.js للواجهة الأمامية.

    وبالطبع بعض الوظائف تطلب خبرة في وورد بريس، لذلك كما قلت لك الأمر يتوقف على ما تريده، ونصيحتي هي قم بالتعلم بالتدريج ولا تستعجل وطبق على أكثر من مشروع أو قم بإعادة بناء المشروع بمفرد بعد الإنتهاء منه، ولا تتسرع في الإنتقال للقسم التالي.

    وبالطبع هناك فرص عمل لمطور وورد بريس فقط سواء في سوق العمل أو على مواقع العمل الحر، لكن أنت تحصر نفسك في جزء صغير فقط والأفضل زيادة المهارات الخاصة بك وبالتالي ستحصل على فرص عمل أفضل

  16. هناك 3 طرق لحساب الدقة:

    1- حساب نسبة الدقة باستخدام وظيفة ABS في إكسل

    يمكنك استخدام وظيفة ABS في إكسل لحساب نسبة الخطأ أولاً، ثم طرح الخطأ من 1 سيعطيك نسبة الدقة.

    أدخل الصيغة التالية في الخلية E5 كما هو موضح في الصورة التالية:

    =1-ABS(C5/D5-1)

    Calculate-Accuracy-Percentage-in-Excel-3.png.688720ced0472d6a7e7637e3bad40c4a.png

    ثم، انقر على أيقونة % لتطبيق تنسيق الرقم النسبي. بعد ذلك، انقر نقرًا مزدوجًا على أيقونة Fill Handle أو اسحبها لتطبيق الصيغة على الخلايا أدناه.

    2- حساب نسبة الدقة باستخدام وظيفة IF في إكسل

    يمكنك استبدال وظيفة ABS بوظيفة IF في إكسل للحصول على نفس النتيجة.

    أولاً، ضع الصيغة التالية في الخلية E5 كما هو موضح أدناه.

    =1-IF(C5>D5,(C5-D5)/D5,(D5-C5)/D5)

    Calculate-Accuracy-Percentage-in-Excel-4.png.6f770ba556e7561935315e134fb4f77a.png

    ثم، ضع تنسيق الرقم النسبي في تلك الخلية عن طريق النقر على أيقونة % من علامة التبويب الرئيسية. بعد ذلك، ضع الصيغة على جميع الخلايا أدناه باستخدام أيقونة Fill Handle.

    3- استخدام وظيفة MIN-MAX لحساب نسبة الدقة في إكسل

    بديلًا، يمكنك استخدام وظائف MAX و MIN في إكسل لذلك، تعيد وظيفة MAX القيمة القصوى داخل نطاق معين بينما تعيد وظيفة MIN القيمة الدنيا.

    أولاً، أدخل الصيغة التالية في الخلية

    =1-(MAX(C5:D5)-MIN(C5:D5))/D5

    Calculate-Accuracy-Percentage-in-Excel-5.png.5e1b1234965a19f74b817941758786b0.png

    ثانيًا، حدد تنسيق الرقم النسبي باستخدام أيقونة % كما هو موضح في الصورة أدناه. أخيرًا، ضع الصيغة على جميع الخلايا أدناه باستخدام أيقونة Fill.

  17. سأشرح لك الأمر من خلال الخطوات التي عليك إتباعها لإنشاء قاعدة بيانات تحتوي على بيانات باللغة العربية والإنجليزية:

    1- يتم تحديد الحقول التي سيحتويها الجدول بما في ذلك الحقول المشتركة بين اللغتين والحقول الخاصة بكل لغة.

    | اسم الكتاب | اسم الكاتب | السعر باللغة العربية | السعر باللغة الإنجليزية |

    2- تحديد تنسيق الحقول لتتناسب مع النصوص المكتوبة باللغتين، مثلاً، تحديد تنسيق الحقل للنصوص بحيث يمكن دعم النصوص الطويلة في اللغة العربية.

    | اسم الكتاب | varchar(100) | | اسم الكاتب | varchar(50) | | السعر باللغة العربية | decimal(10,2) | | السعر باللغة الإنجليزية | decimal(10,2) |

    3- تحديد ترميز البيانات الذي يسمح بتخزين النصوص باللغتين العربية والإنجليزية بدون أخطاء. يمكن استخدام UTF-8 كترميز يدعم النصوص باللغتين.

    4- تخزين البيانات في الجدول بطريقة تمكن من الوصول إلى النصوص باللغتين على حد سواء، حيث تستطيع استخدام حقل مشترك للنصوص العامة وحقول مخصصة لكل لغة للنصوص الخاصة باللغة.

    وتستطيع تخزين نفس البيانات باللغة العربية والإنجليزية أو أي لغات أخرى أخرى في قواعد البيانات بحيث يكون لكل لغة حقل مخصص لها، ويتم ذلك عن طريق تحديد نوع الحقل ليتناسب مع نوع البيانات المخزنة فيه.

    مثلاً، جدول يحتوي على حقلين لكل بيان (اسم المستخدم والجنسية)، أحدهما مخصص للغة العربية والآخر مخصص للغة الإنجليزي،  وتخزين الاسماء والجنسيات باللغة المناسبة في كل حقل من هذين الحقلين.

     

  18. أنا أكره النصائح المكتلجة أي العامة والتي لا تصلح للجميع بدون معرفة تفاصيلهم الشخصية، حيث أن بعض النصائح قد تضر والمقصود هو الإفادة!

    وسأحاول نصيحتك بدون أن أضرك، في البداية أن تسير مع القطيع أفضل لك من تسير عكس التيار، فالأمر بحاجة إلى مجهود عظيم أنت في غنى عنه ولا أعرفك شخصيًا هل ستتحمل ذلك أم لا.

    نصيحة غريبة صحيح؟ أتفهم ذلك، لكن من تجربة واقعية أن تقوم بفعل ما يفعله الجميع بشكل روتيني أفضل لك من أن تقوم بمحاولة تشكيل الواقع تبعًا لما تريده أنت.

    أي لا تقم بالتركيز على أي شيء آخر غير الدراسة في الوقت الحالي، وفي فترة الأجازة قم بتعلم البرمجة إن كنت صادقًا فعلاً في تعلمها.

    وبعد الإنتهاء من الثانوية العامة سيتحدد مصيرك الأكاديمي فإما بكلية جيدة ولها مستقبل أو كلية شهادة فقط، والشهادة هامة جدًا في عالمنا العربي لا تستهن بها.

    وأنصحك بالإجتهاد للحصول على مجموع يؤهلك لدخول كلية حاسبات ومعلومات، حيث ستقطع أشواطًا وتسهل على نفسك الأمر في تعلم البرمجة وستجد حافز كبير وأصدقاء لهم نفس الهدف أيضًا، وهو أمر عظيم.

    ودائمًا في حياتك ضع أولويات، فمثلاً الدراسة لها وقت محدد وتنتهي، أي أنك لو لم تجتهد لفشلت دراسيًا وفوت على نفسك فرص جيدة لمستقبلك.

    وتأني ولا تستعجل وقارن نفسك بنفسك فقط وليس بالآخرين، وأنت أدرى بظروفك، ولكن لا تتكاسل، ولا تشغل بالك بأمور كثيرة خاصة بالمستقبل فتفشل في حاضرك ومستقبلك، بل ركز على ما ستفعله خلال فترة سنة إلى سنتين.

    ولا تشغل بالك كثيرًا بالرزق، فقط إجتهد في المذاكرة وتطوير نفسك في فترات فراغك من الدراسة، وأيضًا اختر أصدقائك جيدًا، فصدقني أنت هو متوسط أقرب 5 أشخاص لك وشخصيتك ستتشكل بناءًا على ذلك وأفعالك وتفكيرك أيضًا، فاخترهم جيدًا. 

     

    • شكرًا 1
  19. بتاريخ 5 ساعة قال Ahmed Alfadaly:

    اها فهمتك استاذي قد قمت بشئ وهو إدخال ال for..loop الثانيه بداخل الاولي وأخرج نواتج صحيحه ولكن يوجد تكرار لبعض القيم وهذا لم يعجبني 

    ثانيا الا يوجد طريقه لاخراج النواتج ف table منظم مثلا كل قيمه زاويه phi لها h و v و a معينه وهكذا ف  table

    تستطيع استخدام حلقتي for بدلاً من ذلك، حيث تقوم الحلقة الداخلية بتخزين قيم h، v، a، والحلقة الخارجية بتخزين قيم phi. بعد ذلك، يمكن رسم الرسم البياني باستخدام المكتبة المناسبة، مثل  Plotly طالما أنك تستخدم JavaScript.

    وقد تبدو بعض القيم مكررة لأنك تستخدم خطوة 0.5 في الحلقة الداخلية وبعض القيم تحتوي على مجموعة من الأرقام العشوائية الصغيرة التي يمكن أن تؤدي إلى تقريب القيمة بشكل غير دقيق.

    وبالنسبة لعرض القيم كجدول ورسم بياني، تستطيع استخدام المكتبة المذكورة أعلاه أو أي مكتبة أخرى، أو ببساطة إنشاء جدول HTML يعرض القيم بطريقة منظمة وسهلة القراءة، وإنشاء رسم بياني باستخدام المكتبة التي تفضلها.

     

  20. حاول تسجيل الدخول من خلال وضع التخفي أو incognito  وجرب تشغيل الفيديوهات، فإن عملت بشكل طبيعي، فيجب حذف الملفات المؤقتة الخاصة بالمتصفح من خلال الضغط على CTRL + SHift + Delete وسيظهر لك الصفحة التالية قم بالضغط على Clear data أو مسح البيانات.

    opera-cache-delete.jpg.758c7719674284a05b686b4a3837bb56.jpg

    والآن أرجو منك تحديث المتصفح إلى آخر إصدار، فمثلاً لو كنت تستخدم جوجل كروم فقم بالتوجه للرابط التالي

    • chrome://settings/help

    وستجد أمامك خانة التحديث.

    وأيضًا عليك بإعادة تشغيل الراوتر الخاص بك، ثم حاول تشغيل الفيديوهات إن استمرت المشكلة، قم بتجربة متصفح آخر، وإن استمرت المشكلة عليك بتجربة تغيير الـ DNS للشبكة الخاص بك للـ DNS الخاص بجوجل.

    وفي بعض الأحيان قد تكون المشكلة من الإضافات الخاصة بالمتصفح، لذلك بالتجربة من متصفح بدون إضافات.

    وإن استمرت المشكلة جرب استخدام VPN، وإن استمرت المشكلة عليك بالتحدث لمركز المساعدة الخاص بأكاديمية حسوب.

  21. أرجو منك شرح ما هو المطلوب بالضبط، حتى أتمكن من مساعدتك.

    وإذا فهمت سؤالك بشكل صحيح، فتستطيع  استخدام مكتبة Volley لإرسال طلبات متعددة الأجزاء (Multipart Request) باللغة العربية عن طريق تعريب الرسائل والنصوص التي تستخدمها في الطلب.

    1. قم بإنشاء صنف جديد يرث من Request ويستخدم نوع الطلب MultipartEntityBuilder المستخدم في إرسال الطلبات متعددة الأجزاء.
    2.  استخدم النص العربي المطلوب داخل مكونات الطلب مثل العنوان والنص الرئيسي وغيرها، وتأكد من استخدام ترميز النص الصحيح.
    3. يمكنك استخدام مثيلات الفئة ByteArrayBody لإضافة صور أو ملفات أخرى إلى الطلب، ويمكنك تعريب الأسماء أيضًا.

    مثال:

    public class ArabicMultipartRequest extends Request<String> {
    
        private MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
        private Response.Listener<String> listener;
        private HashMap<String, String> params;
    
        public ArabicMultipartRequest(String url, HashMap<String, String> params, Response.Listener<String> listener, Response.ErrorListener errorListener) {
            super(Method.POST, url, errorListener);
            this.listener = listener;
            this.params = params;
            buildMultipartEntity();
        }
    
        private void buildMultipartEntity() {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                entityBuilder.addTextBody(entry.getKey(), entry.getValue(), ContentType.create("text/plain", Charset.forName("UTF-8")));
            }
            entityBuilder.addPart("image", new ByteArrayBody(imageData, "image.png"));
        }
    
        @Override
        public String getBodyContentType() {
            return entityBuilder.build().getContentType().getValue();
        }
    
        @Override
        public byte[] getBody() throws AuthFailureError {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            try {
                entityBuilder.build().writeTo(bos);
            } catch (IOException e) {
                VolleyLog.e("IOException writing to ByteArrayOutputStream");
            }
            return bos.toByteArray();
        }
    
        @Override
        protected Response<String> parseNetworkResponse(NetworkResponse response) {
            String result = "";
            try {
                result = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return Response.success(result, HttpHeaderParser.parseCacheHeaders(response));
        }
    
        @Override
        protected void deliverResponse(String response) {
            listener.onResponse(response);
        }
    }

     

  22. المشكلة في الكود هي عدم استخدام دالة trim() لإزالة الفراغات الزائدة في نهاية السلسلة التي تم قراءتها باستخدام دالة read().

    وتستطيعاستخدام دالة trim() بعد قراءة الحجم لإزالة الفراغات الزائدة وذلك عن طريق استخدام الكود التالي:

    size = size.trim();

    وهذا يحذف أي فراغات زائدة في بداية أو نهاية السلسلة ويجعل الرسالة تظهر بشكل صحيح دون أي فراغات زائدة في النهاية.

    يمكنك إضافة هذا الكود بعد الحصول على قيمة الحجم وقبل طباعة النتيجة، كما هو موضح في الكود التالي:

    var size = read();
    write("Enter your size: ");
    size = read().trim();
    write("Your size = " + size);

     

  23. أنصحك باستخدام استضافة Railway.app فهي سهلة للغاية، ويمكنك رفع المشروع من خلال مستودع الـ GitHub وإضافة متغيرات البيئة وغيرها وسيعمل المشروع في ثوانٍ، وتستطيع إضافة قاعدة بيانات.

    todos-gif.gif.019894a06ea03a20094ed9ea7e0f17d7.gif

    وهناك قوالب جاهزة يمكنك الإختيار من بينها إذا أردت لإنشاء مشروع جديد للغة أو إطار العمل الذي تريده على الاستضافة.

    CleanShot_2022-02-01_at_01.gif.a4ada9103c56c59f36d553890460d75e.gif

    وهناك منفذ أوامر خاص بالإستضافة CLI يمكنك العمل من خلاله إذا أردت.

    CLIexample_fiflvb.gif.5857bfdb7d4b09a1c7c556d314c95692.gif

    ويمكنك قراءة المستندات الرسمية حيث بها شرح وافي، أو تستطيع البحث على اليوتيوب بالتالي deploy json server on railway أو How to deploy on railway

    وأيضًا هناك استضافة أخرى باسم render وهي جيدة أيضًا.

    • شكرًا 1
  24. تستطيع دعم اللغة العربية في VolleyMultipartRequest عن طريق تعيين مجموعة الأحرف المستخدمة في الإرسال على أن تكون بترميز UTF-8.

    والقيام بذلك عن طريق استخدام الدالة setCharacterEncoding في كائن VolleyMultipartRequest.

    يمكن إضافة السطر التالي في دالة VolleyMultipartRequest لتعيين مجموعة الأحرف على UTF-8:

    @Override
    public String getBodyContentType() {
        return "application/json; charset=utf-8";
    }

    وبهذا سيتم إرسال البيانات بترميز UTF-8 الذي يدعم اللغة العربية.

    • أعجبني 1
×
×
  • أضف...