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

Mustafa Suleiman

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

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

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

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

    272

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

  1. الدالة findOdd تستقبل مصفوفة (Array) A وتقوم بإرجاع العدد الذي يحدث فيه تكرارات فردية. مثلاً إذا كانت المصفوفة A هي [1, 2, 3, 2, 3, 1, 3]، فإن الدالة ستعيد القيمة 3، لأن العدد 3 هو الوحيد الذي يتكرر في المصفوفة بتكرار فردي. الكود يبدأ بتعريف دالة جديدة تسمى count والتي تستقبل مصفوفة (Array) arr وقيمة val، وتقوم بإرجاع عدد مرات تكرار val في المصفوفة arr. وتستخدم الدالة filter لتصفية القيم التي تساوي val ومن ثم حساب طول المصفوفة الناتجة. بعد ذلك، يتم تعريف متغير target وتعيينه بقيمة الصفر. تمر الدالة forEach على كل عنصر في المصفوفة A، وتستخدم دالة count لحساب عدد مرات تكرار العنصر في المصفوفة A. ثم يتم فحص ما إذا كان هذا العدد فرديًا أم لا، وذلك باستخدام العملية الرياضية % للتحقق مما إذا كان العدد الذي يمثل تكرارات العنصر في المصفوفة زوجيًا أم لا. إذا كان عدد التكرارات فرديًا، يتم تعيين قيمة العنصر الموجود حاليًا في الدورة الحالية إلى المتغير target. أخيراً، تعيد الدالة قيمة المتغير target الذي يمثل العدد الذي يحدث فيه تكرارات فردية في المصفوفة. المثال السابق: في الدورة الأولى، سيتم حساب عدد مرات تكرار الرقم 1، الذي يساوي 2، لأن الرقم 1 يتكرر مرتين في المصفوفة A. في الدورة الثانية، سيتم حساب عدد مرات تكرار الرقم 2، الذي يساوي 2، لأن الرقم 2 يتكرر مرتين في المصفوفة A. في الدورة الثالثة، سيتم حساب عدد مرات تكرار الرقم 3، الذي يساوي 3، لأن الرقم 3 يتكرر ثلاث مرات في المصفوفة A. في الدورة الرابعة، سيتم حساب عدد مرات تكرار الرقم 2 مرة أخرى، الذي يساوي 2، لأن الرقم 2 يتكرر مرتين في المصفوفة A. في الدورة الخامسة، سيتم حساب عدد مرات تكرار الرقم 3 مرة أخرى، الذي يساوي 3، لأن الرقم 3 يتكرر ثلاث مرات في المصفوفة A. في الدورة السادسة، سيتم حساب عدد مرات تكرار الرقم 1 مرة أخرى، الذي يساوي 2، لأن الرقم 1 يتكرر مرتين في المصفوفة A. في الدورة السابعة، سيتم حساب عدد مرات تكرار الرقم 3 مرة أخرى، الذي يساوي 3، لأن الرقم 3 يتكرر ثلاث مرات في المصفوفة A. بعد ذلك، سيتم فحص ما إذا كان العدد الذي تم حساب تكراراته فرديًا أم لا باستخدام الشرط count(A, arrnum) % 2 !== 0، وإذا كانت الشرط صحيحة، فإن قيمة العدد الذي يمثل تكراراته ستتم تعيينها إلى المتغير target. أخيرًا، يتم إرجاع قيمة المتغير target الذي يمثل العدد الذي يحدث فيه تكرارات فردية في المصفوفة A. إذا قمت بتنفيذ الدالة findOdd([1, 2, 3, 2, 3, 1, 3])، فستعيد الدالة القيمة 3، لأن العدد 3 هو العدد الذي يتكرر في المصفوفة 3 مرات، وهو يحدث فيه تكرارات فردية.
  2. نعم، هناك عدة أشياء يمكنك التحقق منها قبل شراء استضافة من شركة GoDaddy لضمان أنها تلبي احتياجات مشروع Next.js الخاص بك، وتشمل هذه الأشياء: دعم Node.js: تأكد من أن GoDaddy تدعم Node.js على الخوادم الخاصة بها، وأن الإصدار المدعوم هو الإصدار الذي يدعمه مشروع Next.js الخاص بك. السعر والتكلفة: تأكد من أن تكلفة الاستضافة من GoDaddy تتناسب مع ميزانيتك، وأنه لا توجد تكاليف مخفية أو رسوم إضافية غير متوقعة. الأمان: تحقق من أن GoDaddy توفر خدمات أمنية مثل الحماية من الاختراق والنسخ الاحتياطي المنتظم للبيانات الخاصة بك. الدعم الفني: تحقق من أن GoDaddy توفر دعمًا فنيًا على مدار الساعة، ويفضل أن يكون هذا الدعم عبر الهاتف أو الدردشة المباشرة. سمعة الشركة: تحقق من سمعة GoDaddy في السوق والمراجعات التي تم نشرها على الإنترنت، والتي يمكن أن تساعدك في تقييم جودة الخدمات التي تقدمها الشركة. بعد التحقق من هذه الأمور وتأكد من أن GoDaddy تلبي احتياجات مشروع Next.js الخاص بك، يمكنك شراء خطة استضافة منها ورفع مشروع Next.js الخاص بك على الخوادم الخاصة بها. و النقاط التي ذكرتها متوفرة في منصة GoDaddy حيث تدعم Node.js، وتوفر خيارات استضافة بتكلفة معقولة، وتوفر خدمات أمنية ودعم فني على مدار الساعة، ولديها سمعة جيدة في السوق. لذلك، يمكنك الاعتماد على GoDaddy لرفع مشروع Next.js الخاص بك على الإنترنت. ومع ذلك، يمكنك البحث عن مزودي خدمات استضافة أخرى ومقارنة الميزات والأسعار لضمان اختيار الخيار الأفضل لمشروعك. يمكنك رفع مشروع Next.js على GoDaddy باستخدام الخطوات التالية: قم بتسجيل الدخول إلى حساب GoDaddy الخاص بك. اختر خيار "استضافة المواقع" من القائمة الرئيسية. انتقل إلى صفحة "الملفات" وانقر على زر "إنشاء مجلد جديد" لإنشاء مجلد جديد لمشروعك. ارفع ملفات مشروع Next.js الخاص بك إلى المجلد الجديد باستخدام خيار "رفع الملفات". انتقل إلى صفحة "تكوينات node" وانقر على زر "إضافة تكوين جديد" لإنشاء تكوين جديد لمشروعك. قم بتحديد مجلد الرئيسي لمشروعك وأدخل الإصدار المناسب من Node.js في الحقل المخصص. احفظ التكوين الجديد وانتظر قليلاً حتى يتم تنشيطه. انتقل إلى صفحة "DNS" وانقر على زر "إضافة سجل" لإضافة سجل CNAME جديد. أدخل اسم المضيف المطلوب (على سبيل المثال، اسم مجلد مشروعك) وقم بإدخال "القيمة" باستخدام عنوان IP الخاص بموقع GoDaddy الخاص بك. احفظ الإعدادات وانتظر قليلاً حتى تتم مزامنة التغييرات. انتقل إلى متصفح الويب الخاص بك وأدخل عنوان المضيف الجديد الذي أنشأته في الخطوة 9. بهذه الطريقة، يمكنك رفع مشروع Next.js الخاص بك على GoDaddy وجعله متاحاً عبر الإنترنت. يرجى ملاحظة أنه قد تختلف الخطوات المحددة قليلاً اعتمادًا على نوع الاشتراك الذي اشتريته من GoDaddy.
  3. يصعب الجزم أي الطرق أفضل إلا بعد تحديد ما الهدف من تلك الأزرار وكيف سيتم عرضها وأحجام الشاشات التي يتطلب دعمها. الكود الذي تم توفيره هو لسطح المكتب فقط ولحل المشكلة المعروضة.
  4. يبدو أن هناك مشكلة في إنشاء ملف التوقيع الخاص بتطبيقك. يمكنك محاولة تشغيل التطبيق باستخدام إعدادات التوقيع الافتراضية المؤقتة لحل المشكلة مؤقتًا وتمكينك من تشغيل التطبيق على الأجهزة المحلية. 1. لفعل ذلك، يمكنك تنفيذ الخطوات التالية: 2. انتقل إلى مجلد المشروع على جهاز الكمبيوتر الخاص بك. 3. في مجلد المشروع، ابحث عن ملف build.gradle وافتحه باستخدام محرر النصوص المفضل لديك. 4. ابحث عن القسم signingConfigs وتأكد من أن جميع القيم المطلوبة معبأة بشكل صحيح. أضف الكود التالي في ملف build.gradle داخل القسم android: signingConfigs { debug { storeFile file('debug.keystore') storePassword 'android' keyAlias 'androiddebugkey' keyPassword 'android' v1SigningEnabled true v2SigningEnabled true } } buildTypes { debug { signingConfig signingConfigs.debug } } 5. حفظ الملف. 6. في نافذة Android Studio، قم بالنقر فوق Build من القائمة العلوية ، ثم Clean Project. 7. قم بالنقر فوق Build ، ثم Rebuild Project. 8. قم بتشغيل التطبيق مرة أخرى. إذا استمرت المشكلة، فيمكنك تشغيل الأمر --stacktrace لعرض المزيد من المعلومات عن المشكلة. وأيضًا قم بالرجوع إلى الإجابات على السؤال التالي وتجربة الحلول المطروحة في حال استمرار المشكلة.
  5. لتصميم تطبيقات الجوال، هناك العديد من اللغات والأطر البرمجية (Frameworks) المختلفة التي يمكن استخدامها، ولكن الخيار المناسب يعتمد على الاحتياجات والمتطلبات الخاصة بالتطبيق. تعلم لغة Java وتصميم التطبيقات بها يمكن أن يساعدك على فهم مفاهيم البرمجة والتصميم بشكل عام، حيث أن Java تستخدم على نطاق واسع في تطوير تطبيقات الجوال وتطبيقات الويب، ولها مجموعة قوية من المكتبات والأطر البرمجية المتاحة للمطورين. بالنسبة لتعلم لغة Dart واستخدام إطار العمل Flutter، فهو خيار آخر جيد. فFlutter هو إطار عمل قوي وشامل لتطوير تطبيقات الجوال، ويتميز بواجهات المستخدم المرنة والجميلة والأداء العالي، كما يتيح Flutter تطوير تطبيقات تعمل على نظامي التشغيل iOS و Android، بحيث يمكنك إنشاء تطبيق واحد يعمل على كلا المنصتين. يمكنك البدء بتعلم أيٍ من هاتين اللغتين وإطار العمل الخاص بها والتعرف على المكتبات والأدوات المتاحة لكل منهما. وبالتالي يمكنك اختيار الخيار الأنسب بناءً على الاحتياجات الخاصة بالتطبيق الذي تريد تطويره، ومدى قدرتك على التعامل مع المكتبات والأدوات المختلفة، وبالتالي تحديد الخيار الذي يناسبك أفضل من حيث الإنتاجية والجودة. وإذا كنت في البداية وتريد تعلم البرمجة فيجب عليك قراءة المقالات التالية فسترشدك إلى الطريق السليم. ويمكنك الرجوع إلى الإجابات على السؤال التالي: وهناك دورة في حسوب لتطوير التطبيقات، ستتعلم منها ما تريد. https://academy.hsoub.com/learn/javascript-application-development/
  6. في حالة وجود margin-bottom سيوجد مسافة في النهاية خاصة بعنصر a الأخير وهو ما لا نريده، ففي الصورة المطلوبة يريد حذف المسافات بالكامل، الكود سليم ويمكن إصلاحه من خلال تعديل كود css بإضافة: .qlink:not(:last-child){ margin-bottom: 7px; } ويصبح كود CSS كالتالي: .box{ border-style:solid; display: inline-block ; } .qlink { display:block; text-align:center; color: white; width: 150px; padding:16px 0; text-decoration:none; font-size: 12px; font-weight: bold; background-color: #1F70C4; } .qlink:not(:last-child){ margin-bottom: 7px; } .qlink:hover {background: #2484E9;} .qlink:active {background: #155292;} وفي حال أراد السائل إبقاء الكود الخاص به كما هو، فيجب تعديله ليصبح بالشكل التالي: HTML <div class='container'> <a href="https://google.com/1"> <button class="qlink">Awards</button> </a> <a href="https://google.com/2"> <button class="qlink">Directory</button> </a> <a href="https://google.com/3"> <button class="qlink">Patent</button> </a> <a href="https://google.com/4"> <button class="qlink">Calendar</button> </a> <a href="https://google.com/5"> <button class="qlink">Leave Request Tool</button> </a> <a href="https://google.com/6"> <button class="qlink">Publications</button> </a> </div> CSS div { width: max-content; text-align: center; border-style:solid; margin: auto; } .qlink { border: none; background-color: #1F70C4; color: white; height: 35px; width: 150px; font-size: 12px; display: inline-block; font-weight: bold; } .qlink:hover {background: #2484E9;} .qlink:active {background: #155292;} فالمشكلة كانت في إزالة الـ margin الخاصة بالأزرار ثم ضبط عرض الـ div الأب الذي يحوي كافة العناصر ليصبح عرضه هو نفس عرض المحتوى بداخله من خلال width: max-content;
  7. المشكلة في إعدادات Webpack. يجب أن تكون إعدادات الإخراج في Webpack تطابق المسار الذي يتم استخدامه في ملف الخادم (server) Express. عندما تحاول الوصول إلى ملف "index_bundle.js" من ملف Express، يجب أن تكون الإعدادات الخاصة بمسار الإخراج في Webpack مطابقة للمسار الذي يتم استخدامه في الصفحة HTML. في هذه الحالة، يجب على Webpack إخراج الملف إلى المسار "public/index" ويجب أن يتم الوصول إليه عبر المسار "/public/index/index_bundle.js". لحل المشكلة، يجب تغيير إعدادات الإخراج في Webpack كما يلي: module.exports = { entry: './app/index/index.js', output: { path: path.resolve(__dirname, 'public/index'), publicPath: '/public/index/', // تغيير المسار إلى "/public/index/" filename: 'index_bundle.js' }, // ... }; ومن ثم يجب استخدام هذا المسار في Express: app.use("/public/index", express.static(__dirname + "/public/index")); // استخدام "/public/index" بدلاً من "/" وبذلك يجب أن يكون بإمكانك الآن الوصول إلى "index_bundle.js" عبر المسار "http://localhost:3000/public/index/index_bundle.js".
  8. لتمكين التحديث التلقائي (hot reloading) في webpack-dev-server ، يجب إضافة خيار --hot إلى أمر البدء (start script) في package.json كما يلي: "scripts": { "start": "webpack-dev-server --mode development --inline --progress --hot", "build": "webpack --mode production" }, بمجرد إضافة --hot ، سيتم تشغيل خادم التطوير بشكل تلقائي ويقوم بالتحديث التلقائي للملفات بمجرد حفظ التغييرات. إذا كنت ترغب في تشغيل التحديث التلقائي لـ webpack-dev-server عند استخدام VSCode، يمكنك استخدام ميزة "Tasks" الخاصة بـ VSCode. يمكنك إنشاء مهمة تشغيل webpack-dev-server في ملف tasks.json في مجلد .vscode في مشروعك. يمكنك إنشاء الملف بنفسك من خلال القائمة المنسدلة Terminal في القائمة الرئيسية، ثم اختيار Configure Tasks وإنشاء ملف جديد. يجب أن تكون هذه هي المهمة التي يجب تضمينها في tasks.json: { "version": "2.0.0", "tasks": [ { "label": "start", "type": "npm", "script": "start", "group": { "kind": "build", "isDefault": true }, "problemMatcher": "$tsc" } ] } في هذه الحالة، ستعمل هذه المهمة على تشغيل الأمر npm start والذي يشغل webpack-dev-server. عند الانتهاء من إنشاء الملف، يمكنك تشغيل المهمة من خلال الضغط على Ctrl+Shift+B في VSCode، واختيار المهمة start، مما سيقوم بتشغيل webpack-dev-server والسماح لك بالتحديث التلقائي.
  9. لا يمكن استخدام "mailto:" في عنوان الإجراء (action) في النموذج لإرسال البريد الإلكتروني من خلال الجانب العميل (المتصفح)، بل يستخدم فقط لفتح برنامج البريد الإلكتروني على الكمبيوتر المحلي. لا يمكن استخدام JavaScript وحده لإرسال رسائل بريد إلكتروني من المستخدم مباشرةً، لأن JavaScript لغة برمجة تعمل على الجانب العميل (المتصفح) وليست على الخادم. ومع ذلك، يمكن استخدام JavaScript لإرسال طلب إلى الخادم ليتم معالجتها هناك. يمكن تنفيذ نموذج البريد الإلكتروني باستخدام HTML و CSS و JavaScript بالشكل التالي، لكن سيتطلب معالجة البيانات المرسلة بواسطة php او node.js في الخلفية: HTML: <form id="email-form" method="POST"> <label for="email">البريد الإلكتروني:</label> <input type="email" id="email" name="email" placeholder="ادخل بريدك الإلكتروني" required> <button type="submit" id="submit-btn">اشتراك</button> </form> <div id="success-msg" class="hidden">تم إرسال البريد الإلكتروني بنجاح.</div> <div id="error-msg" class="hidden">حدث خطأ أثناء إرسال البريد الإلكتروني، يرجى المحاولة مرة أخرى.</div> CSS: .hidden { display: none; } JavaScript: const form = document.querySelector('#email-form'); const submitBtn = document.querySelector('#submit-btn'); const successMsg = document.querySelector('#success-msg'); const errorMsg = document.querySelector('#error-msg'); form.addEventListener('submit', function(event) { event.preventDefault(); const emailInput = document.querySelector('#email'); const emailValue = emailInput.value; fetch('path/to/email/handler.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: `email=${emailValue}` }) .then(response => { if (response.ok) { // إخفاء زر الإرسال وعرض رسالة النجاح submitBtn.classList.add('hidden'); successMsg.classList.remove('hidden'); } else { // إخفاء زر الإرسال وعرض رسالة الخطأ submitBtn.classList.add('hidden'); errorMsg.classList.remove('hidden'); } }) .catch(error => { console.error(error); // إخفاء زر الإرسال وعرض رسالة الخطأ submitBtn.classList.add('hidden'); errorMsg.classList.remove('hidden'); }); }); يستخدم fetch() لإرسال طلب POST إلى ملف المعالجة handler.php، مع إرفاق رأس Content-Type والجسم المحتوي على بيانات البريد الإلكتروني. يتم التعامل مع الاستجابة باستخدام then()، حيث يتم التحقق من معلومة الحالة للاستجابة وإظهار رسالة النجاح أو الخطأ وفقًا لذلك. يتم التعامل مع أي أخطاء باستخدام catch()، حيث يتم عرض رسالة الخطأ في هذه الحالة. يمكن تغيير الملف المعالج و Content-Type حسب حاجتك وتكوين الخادم الذي تستخدمه. هناك العديد من خدمات ومواقع البريد الإلكتروني الذي يمكن استخدامها لإضافة نماذج الاشتراك على موقعك بدون الحاجة إلى كتابة الكود بنفسك. هذه الخدمات عادةً ما تتيح إنشاء نماذج الاشتراك بسهولة وبشكل سريع، ويتم تضمينها في موقعك باستخدام قطعة من الكود الذي توفره الخدمة. ومن بين الخدمات المشهورة لذلك: Mailchimp: يتيح Mailchimp إنشاء نماذج الاشتراك المخصصة التي يمكن تضمينها في موقعك باستخدام كود HTML الذي توفره الخدمة. Constant Contact: هذه الخدمة تتيح إنشاء نماذج الاشتراك بشكل سهل وبدون الحاجة إلى كتابة الكود بنفسك. AWeber: هذه الخدمة تتيح إنشاء نماذج الاشتراك المخصصة بسهولة وتضمنها في موقعك باستخدام الكود HTML الذي توفره الخدمة. GetResponse: يتيح GetResponse إنشاء نماذج الاشتراك المخصصة التي يمكن تضمينها في موقعك باستخدام كود HTML الذي توفره الخدمة. هذه الخدمات لها تكاليف، وتختلف الأسعار والميزات المتاحة في كل منها. يمكنك البحث عن خدمة مناسبة لاحتياجاتك وميزانيتك.
  10. عندما تستورد الصورة باستخدام import كما فعلت في Img ، فإن Webpack يأخذ الملف المحدد ويقوم بتضمينه في ملف الإخراج (bundle.js) كما هو مفصل في الخيار type: 'asset/resource' الموجود في ملف webpack.config.js الخاص بك. عند استخدام مسار نسبي للصورة كما هو موضح في option-2 ، فإن Webpack لا يستطيع العثور على الملف لأنه يحاول البحث عنه في مجلد الإخراج (dist) وليس في مجلد الصور الخاص بالتطبيق (images). لتجنب هذا الخطأ، يمكنك استخدام مسارات نسبية مع webpack باستخدام publicPath في output، والذي يتم تعيينه إلى './' لجعل الملفات الموجودة في مجلد الصور الخاص بك متاحة للتطبيق. يمكنك أيضًا إضافة publicPath في file-loader كما يلي: { test: /\.(png|svg|jpg|jpeg|gif)$/i, type: 'asset/resource', generator: { filename: 'static/images/[hash][ext][query]' }, publicPath: './' }, عند الانتهاء من ذلك ، يجب أن يعمل الأمر عند استخدام المسار النسبي: <img src='./images/test.jpg' alt="test-2" /> وتأكد من تأكيد وجود مجلد static/images في مجلد الإخراج (dist).
  11. في البداية إذا أردت التحكم في جهازك عن بعد فقط، فيمكنك استخدام برامج مثل TeamViewer وتركها تعمل على الجهاز والدخول عليه بواسطة الـ IP وباستطاعتك تعيين كلمة سر. أما تحويل جهازك إلى سيرفر عام يمكن أن يتم باستخدام بعض البرامج المجانية التي تمكنك من إعداد خادم على جهازك الخاص وجعله متاحًا للوصول من أي جهاز آخر على شبكة الإنترنت. سأشرح لك الخطوات الأساسية اللازمة لتحقيق ذلك: 1- تثبيت برنامج خادم الويب: يمكن استخدام أي برنامج خادم ويب مثل XAMPP أو WAMP أو Apache أو laragon لإنشاء خادم ويب. يوفر هذا البرنامج خادم ويب وقاعدة بيانات و PHP. يمكنك تنزيل البرنامج من موقع الويب الرسمي وتثبيته على جهازك. 2- اختبار الويب سيرفر: يجب التأكد من أن الويب سيرفر يعمل بشكل صحيح على جهازك. يمكن القيام بذلك عن طريق فتح متصفح وزيارة localhost. 3- تعيين عنوان IP ثابت لجهازك: تعيين عنوان IP الثابت يعني تحديد عنوان الإنترنت الخاص بجهاز الكمبيوتر الخاص بك بشكل دائم، والذي يتم تعيينه يدويًا. يختلف هذا عن العنوان الديناميكي الذي يتم تعيينه تلقائيًا عند الاتصال بالإنترنت. بعد تثبيت برنامج الخادم الخاص بك، سيكون من الضروري تعيين عنوان IP الثابت لجهاز الكمبيوتر الخاص بك، حيث يمكن استخدام هذا العنوان للوصول إلى جهاز الكمبيوتر الخاص بك عبر الشبكة. ومن أجل ذلك يمكنك العثور على إعداد تعيين العنوان الثابت في قسم الشبكة في إعدادات جهاز الكمبيوتر الخاص بك. 4- إعداد المنافذ اللازمة: يجب فتح المنافذ الخاصة بالويب سيرفر على جدار الحماية الخاص بالجهاز، للسماح لأي شخص في الشبكة بالوصول إلى الويب سيرفر. يجب فتح المنافذ 80 لبرتوكول HTTP و 443 لبروتوكول HTTPS. سأشرح الخطوات اللازمة لفتح المنافذ على راوتر من نوع TP-Link Archer C7. تسجيل الدخول إلى لوحة التحكم الخاصة بالراوتر: افتح متصفح الويب الخاص بك واكتب عنوان IP الافتراضي الخاص بالراوتر في شريط العنوان (عادةً ما يكون 192.168.0.1 أو 192.168.1.1). سيطلب منك إدخال اسم مستخدم وكلمة مرور لتسجيل الدخول إلى لوحة التحكم. الوصول إلى قسم إعدادات المنافذ: بمجرد تسجيل الدخول إلى لوحة التحكم، انتقل إلى قسم "Advanced" (متقدم) ثم اختر "Port Forwarding" (توجيه المنافذ). إضافة إعدادات التوجيه: اختر "Add New" (إضافة جديدة) لإنشاء إعدادات التوجيه الجديدة. سيطلب منك تحديد اسم الجهاز (عادةً ما يكون اسم الخادم) وعنوان IP الخاص بالجهاز (عنوان IP الثابت الذي قمت بتعيينه سابقًا) ورقم المنفذ الداخلي والخارجي. حفظ الإعدادات: بعد إدخال جميع التفاصيل اللازمة، انقر على "Save" (حفظ) لحفظ الإعدادات الجديدة. ستحتاج إلى تكرار هذه الخطوات لإضافة إعدادات توجيه منفذ إضافية. التأكد من البورتات التي تم فتحها من خلال التوجه لموقع https://portchecker.co/checking وستجد أنه تعرف على الـ public IP الخاص بجهازك ما عليك سوى كتابة بورت 80 ثم اضغط على check وكرر نفس الأمر مع بورت 443 وتأكد من ظهور كلمة port x is open. من المهم ملاحظة أن إعدادات توجيه المنافذ يمكن أن تختلف قليلاً بين الراوترات المختلفة، ومن المهم أيضًا إتباع الإرشادات الخاصة بالراوتر الخاص بك للتأكد من تمكين توجيه المنافذ بطريقة صحيحة. 5- تفعيل خدمة DNS: بعد الانتهاء من إعداد إعدادات الراوتر وتحديد عنوان IP الخاص بالجهاز الخادم، يمكنك استخدام DNS لتسهيل عملية الوصول إلى الخادم. يمكنك استخدام خدمات DNS المجانية مثل No-IP أو DynDNS لتسجيل عنوان IP الخاص بالخادم الخاص بك وربطه بعنوان URL سهل الاستخدام. وسبب القيام بتلك الخطوة هو ربط الـ public IP باسم دومين أو عنوان URL يمكنك كتابته والدخول على جهازك عن بعد، فربما بعد إعادة تشغيل الراوتر قد يتغير الـ public IP، ويمكنك الحصول من مزود الخدمة على static IP. الخطوات لاستخدام DNS هي كالتالي: قم بإنشاء حساب على موقع خدمة DNS المختارة والأفضل No-IP لكونها مجانية. أدخل اسم النطاق الذي تريد استخدامه واتبع التعليمات لربط عنوان IP الخاص بالخادم بالاسم المستخدم في النطاق. تأكد من تحديث إعدادات الراوتر الخاص بك للسماح بمرور حركة المرور المرتبطة بـ DNS من الخارج إلى الجهاز الخادم. قم بتنزيل برنامج العميل الذي يقدمه موقع خدمة DNS المختارة وتثبيته على الجهاز الخادم. سيتم تشغيل هذا البرنامج في الخلفية وسيقوم بتحديث عنوان IP الخاص بالخادم بشكل دوري. يمكنك الآن الوصول إلى الخادم باستخدام عنوان URL المحدد لخدمة DNS المستخدمة.
  12. هناك العديد من الخيارات المتاحة لاستضافة تطبيقات Next.js على الإنترنت، ويمكن الاختيار بين خيارات مثل: Vercel: هي منصة استضافة خاصة بـ Next.js وتوفر دعمًا متميزًا لهذه التقنية وتقدم خدمة الاستضافة بشكل مجاني ومدفوع، وتسمح لإضافة عدد غير محدود من النطاقات. namecheap: تدعم شركة Namecheap استضافة تطبيقات Next.js وتوفر خيارات متعددة للخوادم المشتركة والخوادم الخاصة بأسعار مناسبة. يمكنك اختيار خطة استضافة تناسب احتياجاتك وميزانيتك، مع توفير خيارات متعددة للدفع ودعم فني متاح على مدار الساعة. Heroku: هي خدمة استضافة تدعم تقنية Node.js وتتميز بأنها سهلة الاستخدام وتوفر خدمة مدفوعة ومجانية. DigitalOcean: هي خدمة استضافة توفر خيارات متعددة للاستضافة بدءًا من الخوادم الافتراضية حتى الخوادم الخاصة والاستضافة المدارة، وتوفر دعمًا لتقنية Node.js و Next.js، ويمكن إضافة عدد غير محدود من النطاقات. AWS Elastic Beanstalk: هي خدمة استضافة توفر دعمًا لتقنية Node.js و Next.js، وتسمح بإضافة عدد غير محدود من النطاقات، وتعتمد على سحابة Amazon Web Services (AWS)، وتوفر خيارات متعددة للتكوين والتوسع. Google Cloud Platform: هي خدمة استضافة توفر دعمًا لتقنية Node.js و Next.js، وتسمح بإضافة عدد غير محدود من النطاقات، وتتميز بأنها سهلة الاستخدام وتقدم خدمة مجانية ومدفوعة. Cloudflare Pages: يمكن لـ Cloudflare Pages دعم عدة نطاقات لتطبيق واحد، وتوفر خدمة CDN مدمجة لتحسين أداء التطبيقات، بالإضافة إلى أنها توفر عمليات نشر بسيطة وسهلة الاستخدام. وتوفر Cloudflare Pages خيارات دفع مختلفة مثل الاشتراك الشهري أو الدفع مقابل الاستخدام بأسعار تنافسية بالمقارنة مع خدمات الاستضافة الأخرى. Netlify: تعتبر Netlify مثالية للاستضافة السريعة والبسيطة لتطبيقات Next.js. توفر خططًا مجانية ومدفوعة ، ولكن يمكن أن تكون الخطط المدفوعة أكثر تكلفة. Linode: توفر Linode خدمة VPS مع خطط متعددة بأسعار مختلفة. تدعم Node.js ويمكن استخدامها لتشغيل تطبيقات Next.js. توجد العديد من الخيارات المتاحة لاستضافة تطبيقات Next.js، والخيار الأفضل يعتمد على ميزانيتك واحتياجاتك الفردية. من بين الخيارات التي تم ذكرها، Vercel هي الخيار الأكثر تخصصاً لاستضافة تطبيقات Next.js، وتقدم خدمة استضافة مدفوعة ومجانية مع دعم لإضافة عدد غير محدود من النطاقات.
  13. ممتاز، تعلم HTML و CSS هو الخطوة الأولى لتصميم وتطوير صفحات الويب، ولكن هناك الكثير من التقنيات والأدوات المختلفة التي يجب أن تتعلمها لتكون مطور ويب محترف. HTML و CSS ليستا لغات برمجة، إنما هما لغتان تستخدمان لتطوير صفحات الويب. HTML هي لغة ترميز النصوص التي تستخدم لتحديد هيكل صفحات الويب، بينما تستخدم CSS لتحديد التنسيقات والأساليب الجمالية لعرض محتوى الصفحة. بينما لغة JavaScript تعتبر لغة برمجة مستخدمة بشكل شائع في تطوير صفحات الويب وتطبيقات الويب. يمكن استخدام JavaScript لتوفير العديد من المزايا لصفحات الويب، بما في ذلك تحديث المحتوى ديناميكيًا وتفعيل العناصر التفاعلية. لذلك، إذا كان الشخص يرغب في تطوير صفحات الويب التفاعلية والديناميكية، فسيحتاج بالتأكيد إلى تعلم JavaScript. ولكن إذا أردت أن تأسيس نفسك بشكل قوي في البرمجة ولديك وقتٍ كافي لذلك، فأنصحك بفعل ذلك وبشدة والإتجاه نحو تعلم لغة C++ قبل تعلم JavaScript. وإذا أردت تعلم مجال الويب، إليك مسارًا كاملاً لتصبح مطور Full-stack لتتمكن من إنشاء مشروع كاملاً بمفردك: JavaScript: هي لغة برمجة تستخدم عادة لتطوير وظائف تفاعلية في صفحات الويب، مثل التحقق من الإدخالات وإضافة تأثيرات متحركة. لتعلم JavaScript. Bootstrap: هي إطار عمل لتصميم صفحات الويب تستخدمه العديد من المواقع الكبيرة، والذي يسهل عليك عملية تصميم الصفحات وجعلها تستجيب بشكل جيد على جميع الأجهزة المختلفة. tailwindcss: يمكنك تعلم tailwindcss بدلاً من Bootstrap فهى توفر مرونة أكبر في تخصيص التصميم وإعادة استخدام الأكواد في العديد من المشاريع المختلفة، حيث يمكن للمطورين تعريف مخصصاتهم الخاصة واستخدامها في أي مكان داخل التطبيق. Sass: هي لغة تعتمد على CSS، وتستخدم لتبسيط عملية كتابة الأنماط والتنسيقات في CSS، وتحسين إمكانية إعادة استخدام الشفرة. Git: هو نظام للتحكم في الإصدارات يستخدم لتتبع التغييرات في الشفرة المصدرية وإدارة تعاون فريق العمل على المشاريع. تعلم إطارات العمل (Frameworks): تعتبر إطارات العمل مجموعة من الأدوات والمكتبات التي تساعد المطورين في إنشاء تطبيقات الويب بسهولة وسرعة. بعض الإطارات الشائعة هي React.js و Angular و Vue.js. إطارات العمل الخاصة بالـ Back-End: يمكن استخدام إطارات العمل الخاصة بالـ Back-End مثل Node.js وإطار العمل الخاص بها Express.js لبناء تطبيقات ويب ديناميكية وقابلة للتوسع. تتيح هذه الإطارات العديد من المزايا مثل: القدرة على التعامل مع البيانات وقواعد البيانات باستخدام لغة جافاسكريبت على الجانب الخادم. القدرة على بناء API للتفاعل مع التطبيقات الأخرى وتوفير خدمات ويب. 8 - قواعد البيانات: يجب تعلم قواعد البيانات الحديثة والشائعة مثل MySQL أو MongoDB أو PostgreSQL. لتعلم العمل مع إطارات العمل الخاصة بالـ Back-End، يمكن البدء بتعلم الأساسيات في لغة جافاسكريبت ومفاهيم البرمجة الأساسية. بعد ذلك يمكن التحول إلى تعلم إطار العمل Node.js و Express.js، والتعلم عن كيفية التعامل مع البيانات والاتصال بقاعدة البيانات. من المهم أيضًا التعلم عن كيفية بناء API وتصميمها بشكل صحيح لتوفير خدمات ويب عالية الجودة وآمنة. يجب أيضًا تعلم الأمان والحماية وكيفية التعامل مع الأخطاء والأخطار المحتملة في تطوير تطبيقات الويب.
  14. إذا فهمت سؤالك بشكل صحيح، سأقوم بتقسيم الإجابة إلى جزئين على أي حال. الجزء الأول (الجانب البرمجي) التطبيقات مثل Apple Pay و STC Pay تسمى Fintech، وإليك الطريقة التي يتم إنشاء تلك التطبيقات بها بشكل مختصر: يتضمن الجانب الخاص بالبرمجة في إنشاء تطبيق مثل Apple Pay العديد من العناصر التقنية المهمة، ومن أهمها: لغات البرمجة: يجب اختيار اللغات البرمجية المناسبة لبناء تطبيق Apple Pay. يمكن استخدام Objective-C أو Swift لبرمجة تطبيقات iOS، بينما يمكن استخدام Java أو Kotlin لبرمجة تطبيقات Android. البرمجة النظيفة: يجب كتابة الكود بشكل نظيف ومنظم ومناسب للصيانة والتحسين فيما بعد، مما يسهل على المطورين العمل على المشروع بشكل أفضل في المستقبل. الواجهة البرمجية للتطبيق (API): يجب إنشاء واجهة برمجية تتيح للمستخدمين التفاعل مع التطبيق بشكل مريح وبسيط، وتوفير أدوات ووظائف تجعل استخدام التطبيق سهلاً وفعالاً. دمج الدفع: يتطلب إنشاء تطبيق مثل Apple Pay دمج وظيفة الدفع الآمن والموثوق به، وذلك من خلال استخدام البوابات الدفع الشهيرة مثل Stripe و PayPal وغيرها. الامتثال للمعايير الأمنية: يجب على المطورين الالتزام بالمعايير الأمنية الصارمة، مثل PCI DSS و GDPR، لتأمين المعلومات الحساسة وحماية البيانات الشخصية للمستخدمين. اختبار التطبيق: يجب إجراء اختبارات شاملة لتحقيق الجودة والموثوقية والأداء المطلوب للتطبيق، وذلك من خلال استخدام أدوات الاختبار المختلفة مثل Xcode و Android Studio. التطوير المستمر: يجب العمل على تطوير التطبيق باستمرار، وتحديثه وتطويره لتلبية متطلبات المستخدمين وتحسين الأداء والأمان و الاستجابة للتغييرات في البيئة التقنية والتحديثات الجديدة في الأجهزة والأنظمة الأساسية. يمكن تحقيق ذلك من خلال استخدام أساليب التطوير الحديثة مثل Agile وDevOps والعمل على تطبيق أفضل الممارسات في هذا المجال. بناء الخادم وقاعدة البيانات: يجب أن يتم تخزين معلومات العملاء بشكل آمن في قاعدة البيانات. يتطلب هذا إنشاء خادم واستضافة البيانات وضمان أمانها وحمايتها. بناء تطبيق الهاتف الجوال: يجب أن يتم برمجة تطبيق للهواتف الذكية يعمل بنظام iOS و Android. يجب أن يكون التطبيق متوافقًا مع مختلف أنواع الهواتف المحمولة. تكنولوجيا الاتصال اللاسلكي (NFC): يستخدم Apple Pay تقنية NFC لنقل المعلومات بين الهاتف الذكي وجهاز الدفع عند السداد. يجب عليك إضافة هذه التقنية إلى تطبيقك إذا كنت تريد إنشاء تطبيق مشابه. يجب الانتباه إلى أن إنشاء تطبيق مثل Apple Pay يحتاج إلى خبرة ومهارات تطويرية عالية، وموارد كبيرة للتطوير والتسويق والصيانة والدعم. الجزء الثاني (طريقة شحن الرصيد) تعتمد محافظ الكترونية مثل Apple Pay و STC Pay على تقنية الدفع الرقمي التي تستخدمها، والتي تتيح للمستخدمين إجراء المدفوعات الإلكترونية بشكل سهل وآمن. ولشحن رصيد المحافظ الإلكترونية، يمكن القيام بذلك من خلال الخطوات التالية لجميع المحافظ الإلكترونية بشكل عام: قم بتحميل تطبيق المحفظة الإلكترونية المناسبة على هاتفك الذكي. اختر الخيار "شحن الرصيد" أو "إضافة الأموال" في التطبيق. حدد المبلغ الذي ترغب في شحنه إلى محفظتك الإلكترونية. اختر طريقة الدفع المناسبة، والتي قد تشمل الدفع باستخدام بطاقة الائتمان أو الخصم المباشر أو خيارات أخرى مثل PayPal أو Apple Pay إذا كانت متاحة، وفي بعض البلاد العربية يمكن شحن المحافظ الإلكترونية نقدًا عن طريق فروع مزود الخدمة. قم بإدخال معلومات الدفع وتأكيد العملية. بالنسبة لمحفظة Apple Pay تستطيع شحن رصيدك في Apple Pay بسهولة باستخدام بطاقات الائتمان أو الخصم الخاصة بك التي تم تخزينها في محفظتك الرقمية. وفيما يلي خطوات شحن الرصيد في Apple Pay: قم بفتح تطبيق المحفظة على جهاز iPhone أو iPad الخاص بك. اختر بطاقة الائتمان أو الخصم التي ترغب في استخدامها لشحن الرصيد. انتقل إلى قسم "بطاقات" من التطبيق ، وانقر على "إضافة المال". اختر المبلغ الذي ترغب في إضافته إلى رصيد Apple Pay الخاص بك. انقر على "Apple Pay" باعتبارها طريقة دفع. أدخل معلومات الدفع وتأكد من صحتها، مثل رمز الأمان الثلاثي أو رمز التحقق المكون من 4 أرقام. انقر على "إضافة المال" وانتظر حتى تكتمل العملية. هناك طرق أخرى للشحن أيضًا مثل: الحوالة البنكية: يمكنك استخدام الحوالة البنكية لشحن رصيد في Apple Pay، وذلك عن طريق إضافة حساب البنك إلى التطبيق ومن ثم تحويل المبلغ المراد شحنه إلى حساب Apple Pay. تطبيقات الدفع الإلكتروني الأخرى: توجد العديد من التطبيقات الأخرى التي تتيح شحن رصيد في Apple Pay، مثل PayPal وVenmo وCash App وغيرها، ويمكن استخدامها لنقل الأموال من حسابها إلى حساب Apple Pay. ستظهر الأموال المضافة إلى رصيد Apple Pay الخاص بك على الفور بعد اكتمال العملية. يمكنك استخدام هذه الأموال في التطبيقات والخدمات التي تقبل Apple Pay كطريقة دفع. بالنسبة لمحفظة STC Pay يمكنك شحن المحفظة من خلال تطبيق STC Pay عن طريق الطرق الآتية: 1- عن طريق Apple Pay: اضغط على "إضافة الأموال" اضغط خيار Apple Pay أدخل المبلغ الذي تريد إضافته اختر بطاقة من بطاقاتك الموجودة في Apple Wallet لإضافة الأموال منها أكّد العملية لإضافة الأموال بثوانٍ. 2- عن طريق البطاقة الائتمانية أو بطاقة مدى: اضغط على "إضافة الأموال" اضغط خيار البطاقة الائتمانية أو بطاقة مدى أدخل المبلغ الذي تريد إضافته، ثم استمرار أدخل تفاصيل البطاقة أكّد العملية لشحن حسابك بثوانٍ. 3- عن طريق التحويل المحلي إلى STC Pay: اضغط على "إضافة الأموال" اضغط خيار التحويل البنكي إلى STC Pay اختر من البنوك المتعاونة وانسخ رقم الحساب أو الآيبان حوّل محلياً من حسابك البنكي إلى حسابك في STC Pay من خلال لصق رقم الحساب أو الآيبان ستصل الحوالة خلال ساعات عمل بنكك الرسمي. 4- عن طريق سداد: اضغط على "إضافة الأموال" اضغط خيار سداد انسخ رقم سداد المكون من 10 أرقام في STC Pay اختر دفع فاتورة سداد من حسابك البنكي وإضافة فاتورة جديدة باسم المفوتر.
  15. ستجد هنا شرح كامل لطريقة الإشتراك وطرق الدفع وهما باي بال و البطاقة الإئتمانية. وهناك طريقة أخرى وهي بطاقة الهدية: تُوفّر أكاديمية حسوب لزوارها إمكانية شراء بطاقة هدية ومشاركتها، ليتمكن متلقّي الهدية من استخدامها في التسجيل بالدورات المتوفرة في الأكاديمية. وفي حال عدم إمكانية الدفع بالطرق السابقة: يمكن الدفع للدورات التدريبية المختلفة بواسطة أي بطاقة بنكية أو حساب بايبال، ولا يشترط أن يقوم الشخص الذي يدرس الدورة بدفع سعرها، فإذا كان لديك أقارب أو أصدقاء في الخارج يمكنهم مساعدتك في دفع تكلفة الدورة. يجب الإشارة إلى أنه بعد اجتياز الامتحان النهائي للدورة والتأكد من هوية المتدرب، يتم منح الشهادة الخاصة بالدورة للشخص الذي اجتاز الامتحان بنجاح، بغض النظر عن هوية الشخص الذي دفع ثمن الدورة. عند اشتراكك بإحدى دورات حسوب، ستحصل تلقائيًا على وصول لأول مسار من بقية الدورات بشكل مجاني لتتعرف على محتواها، وبعد ذلك يمكنك الاشتراك بدورة ثانية في حال أردتِ إكمال المسارات في هذه الدورة الجديدة.
  16. لا بالطبع لا يجب أن يكون لديك حاسوب بمواصفات عالية للتعلم والعمل. يمكنك البدء في التعلم والعمل بأي جهاز كمبيوتر يعمل بنظام التشغيل المناسب للمهام التي تريد القيام بها. ومع ذلك، يمكن أن يكون لديك حاجة إلى زيادة سعة الذاكرة العشوائية RAM وتحسين المعالج وبطاقة الرسومات في بعض الحالات لتشغيل بعض البرامج الثقيلة بشكل مريح، ولكن هذا يعتمد على نوع العمل الذي تقوم به. مواصفات الحاسوب المناسب للبرمجة: المعالج: يفضل اختيار معالج بسرعة عالية ويفضل أن يكون بـ 4 أو أكثر من النوى. الذاكرة العشوائية (RAM): يجب أن تكون بحجم كافي لتشغيل برامج التطوير، يفضل 8 جيجابايت أو أكثر. القرص الصلب (HDD) أو قرص الحالة الصلبة (SSD): يجب أن يكون بحجم كافي لتثبيت النظام والبرامج، ويفضل استخدام SSD لتسريع عملية التحميل والإقلاع. بطاقة الشاشة: يفضل استخدام بطاقة شاشة متوسطة الأداء أو عالية الأداء إذا كنت ستعمل على تطوير برامج الجرافيك أو الألعاب. مواصفات الحاسوب المناسب لبرامج الجرافيك: المعالج: يفضل اختيار معالج بسرعة عالية ويفضل أن يكون بـ 4 أو أكثر من النوى. الذاكرة العشوائية (RAM): يجب أن تكون بحجم كافي لتشغيل برامج الجرافيك، يفضل 16 جيجابايت أو أكثر. القرص الصلب (HDD) أو قرص الحالة الصلبة (SSD): يجب أن يكون بحجم كافي لتثبيت النظام والبرامج، ويفضل استخدام SSD لتسريع عملية التحميل والإقلاع. بطاقة الشاشة: يفضل استخدام بطاقة شاشة عالية الأداء مثل NVIDIA GeForce أو AMD Radeon. ملحوظة: يمكن العمل على البرمجة وبرامج الجرافيك بحاسوب بمواصفات أقل، ولكن المواصفات المذكورة أعلاه ستساعد على تحسين سرعة العمل وجودة الأداء. في المجمل، يمكن البدء في التعلم والعمل بأي جهاز كمبيوتر متاح لديك، ثم ترقية الموارد تباعًا حسب الحاجة وقدرتك على ذلك. بالنسبة لطريقة التقديم على دورات أكاديمية حسوب: ستجدي هنا شرح كامل لطريقة الإشتراك وطرق الدفع وهما باي بال و البطاقة الإئتمانية. عند اشتراكك بإحدى دورات حسوب، ستحصلي تلقائيًا على وصول لأول مسار من بقية الدورات بشكل مجاني لتتعرفي على محتواها، وبعد ذلك يمكنك الاشتراك بدورة ثانية في حال أردتِ إكمال المسارات في هذه الدورة الجديدة. يمكنك الحصول على المزيد من التفاصيل حول الدورات وإن كان لديك أي سؤال من مركز المساعدة.
  17. يمكن استخدام لغة C++ لرسم ثلاث أهرامات بجانب بعض باستخدام حلقات التكرار والدوال المساعدة في مكتبة الرسم المختارة. وهذا مثال بسيط يرسم ثلاث أهرامات بجانب بعض باستخدام مكتبة SDL: #include <iostream> #include <SDL.h> // تعريف الثوابت اللازمة للبرنامج const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; const int PYRAMID_HEIGHT = 10; const int PYRAMID_SPACING = 20; const int PYRAMID_BASE_WIDTH = 10; int main(int argc, char* args[]) { // تهيئة المكتبة SDL_Init(SDL_INIT_VIDEO); SDL_Window* window = SDL_CreateWindow("Pyramids", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF); // عمل حلقة لرسم الأهرامات for (int i = 0; i < 3; i++) { // حساب إحداثيات الأهرام int x = (SCREEN_WIDTH / 4) + (i * (PYRAMID_BASE_WIDTH + PYRAMID_SPACING)); int y = SCREEN_HEIGHT - PYRAMID_HEIGHT; // عمل حلقة لرسم الصفوف في الأهرام for (int j = 0; j < PYRAMID_HEIGHT; j++) { // حساب إحداثيات الصف int rowWidth = PYRAMID_BASE_WIDTH - j; int rowX = x + ((PYRAMID_BASE_WIDTH - rowWidth) / 2); int rowY = y - (j * 10); // رسم النجوم في الصف for (int k = 0; k < rowWidth; k++) { SDL_RenderDrawPoint(renderer, rowX + k, rowY); } } } // عرض الرسم على الشاشة وانتظار الإغلاق SDL_RenderPresent(renderer); SDL_Delay(5000); // تحرير الموارد والخروج SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0; } يمكن تعديل قيم الثوابت المعرفة في البرنامج لتحقيق نتائج مختلفة. ويمكن استخدام الحلقات لتوسيع الرسم وإضافة مزيد من الأشكال.
  18. الخطأ الذي تتلقاه يشير إلى أن بعض الحقول الإلزامية في نموذج Django لم تتم إدخالها في الطلب POST الخاص بك. تأكد من تقديم جميع الحقول الإلزامية والتأكد من أنها ليست فارغة. بعض الأسباب الأخرى التي يمكن أن تتسبب في هذا الخطأ تشمل: عدم تضمين حقل الرمز الخاص بك في نموذج النموذج في النموذج HTML. عدم إضافة enctype="multipart/form-data" إلى العلامة form في النموذج HTML لدعم تحميل الملفات. عدم تضمين csrf_token في النموذج HTML للحماية ضد هجمات CSRF. قمت بإضافة تعليقات لشرح الأمور الجديدة التي قمت بتحديثها في الكود. from django.shortcuts import render, redirect from django.contrib import messages from .forms import ProductForm def Add_Product(request): if request.method == "POST": form = ProductForm(request.POST, request.FILES) if form.is_valid(): # استخدمت قوسين للاستدلال # احفظ البيانات وتمرير العنصر المميز إلى commit=False product = form.save(commit=False) # تحديد المستخدم الذي قام بإنشاء العنصر product.created_by = request.user product.save() # رسالة نجاح في حالة النجاح messages.success(request, 'Product has been added.') return redirect('product') else: # رسالة خطأ إذا كانت النموذج غير صالح messages.error(request, form.errors) else: # تم إنشاء نموذج فارغ لعرض الصفحة الأولية form = ProductForm() context={ 'form':form, 'title':'iPanel | Product Master', 'page_title':'Product List', 'tree_title_1':'Product', 'tree_title_2':'Add', 'tree_url':'product', 'btn_type':'fa fa-regular fa-plus', } return render(request,'panel/product/form.html',context) تأكد من تحديث ملف views.py بالكود الجديد وإعادة تشغيل الخادم Django ومحاولة إرسال النموذج مرة أخرى. يجب أن تعمل الآن دون الحصول على أي أخطاء.
  19. أنت بحاجة إلى قراءة المقالات التالية بتمعن وهدوء وستجد الإجابة بنفسك، لأنك بحاجة إلى فهم طريقة عمل الـ event handlers في React.
  20. إذا كنت تواجه مشكلة في عدم ظهور محرر الصفحات WPBakery على موقع الويب الخاص بك، فهناك بعض الخطوات التي يمكنك اتباعها لإصلاح المشكلة: 1- التأكد من تثبيت الإضافة بشكل صحيح: تأكد من أن الإضافة مثبتة ومفعلة بشكل صحيح. يمكنك التحقق من ذلك من خلال الذهاب إلى قائمة الإضافات في لوحة التحكم الخاصة بالموقع والتحقق من حالة WPBakery. إذا لم يكن WPBakery مثبتًا بشكل صحيح ، فقد يكون من الأفضل إلغاء تثبيته وإعادة تثبيته مرة أخرى. يمكنك القيام بذلك من خلال الانتقال إلى "الإضافات" في لوحة التحكم الخاصة بموقعك ، وإلغاء تثبيت WPBakery ، ثم إعادة تثبيته مرة أخرى. 2- التحقق من تحديثات الإضافة: تحقق من أن الإضافة محدثة إلى أحدث إصدار متاح. يمكنك التحقق من ذلك عن طريق التحقق من قائمة التحديثات في لوحة التحكم الخاصة بالموقع. 3- تعطيل الإضافات الأخرى: جرب تعطيل جميع الإضافات الأخرى على موقع الويب الخاص بك وتحقق من ما إذا كان ذلك يؤدي إلى حل المشكلة. قد تتعارض بعض الإضافات مع WPBakery وتؤدي إلى مشكلة في عرض المحرر. 4- مسح ذاكرة التخزين المؤقت للمتصفح: يمكنك مسح ذاكرة التخزين المؤقت للمتصفح الخاص بك لحل المشكلة. يمكنك القيام بذلك من خلال إعدادات المتصفح الخاص بك. 5- التأكد من أن WPBakery يدعم نسخة WordPress الحالية: تحقق من أن WPBakery يدعم الإصدار الحالي من WordPress الذي تستخدمه. إذا كانت نسخة WPBakery الحالية لا تدعم نسخة WordPress الحالية ، فقد يكون من الأفضل ترقية إضافة WPBakery.
  21. لعرض كلمة "bold" بحجم عريض في خيارات الـ BooleanField في نموذج Django، يمكن استخدام الـ HTML الأساسي في الخيارات بدلاً من تنسيق النص على النحو التالي: class modela(models.Model): fielda = models.BooleanField(default=True, choices=((True, 'some <b><strong>bold</strong></b> text'), (False, 'zzz'))) يتم استخدام وسم HTML <strong> بدلاً من <b>، حيث يعطي هذا الوسم تأثيرًا عريضًا للنص بدلاً من الوسم <b>. بعد ذلك، يتم استخدام CSS لتعيين حجم الخط للنص العريض. يمكن القيام بذلك بإضافة كود CSS في ملف الـ HTML الخاص بك على النحو التالي: <style> strong { font-weight: bold; font-size: 1.2em; } </style> يمكنك تعديل حجم الخط الخاص بـ <strong> حسب الحجم الذي تريده باستخدام خاصية font-size. في هذا المثال، تم تعيين حجم الخط على 1.2em. بعد ذلك، سيتم عرض خيارات الـ BooleanField بـ "bold" بحجم عريض في صفحة الويب الخاصة بك. class forma(forms.ModelForm): class Meta: model = modela widgets = {'fielda': forms.RadioSelect} fields = '__all__' def a(request): form = forma() return render(request, 'a.html', {'form': form}) {{ form.as_p }} وللاستفاضة: يمكن تنسيق النص في بايثون باستخدام عدد من الأدوات والوظائف المتوفرة في لغة البرمجة بايثون. 1- استخدام لغة التوصيف (markup language): يمكن استخدام لغة توصيف مثل HTML لتنسيق النص في بايثون. على سبيل المثال، يمكنك استخدام الوسم <b> لتحويل النص إلى نص عريض، <i> لتحويله إلى نص مائل، وما إلى ذلك. يمكن تطبيق هذه العلامات على النص المخرج عن طريق الدمج مع النص في متغيرات أو طباعتها بشكل مباشر في وظائف الإخراج مثل print(). 2- استخدام وظائف التنسيق المتاحة في Python: يوفر بايثون العديد من الوظائف المتاحة لتنسيق النص، مثل format() و f-string. تسمح هذه الوظائف بإدخال متغيرات داخل النص وإجراء عمليات تنسيق عليها، مثل إضافة صفراء قبل الأرقام أو تحديد عدد الأرقام العشرية. وهي بشكل عام تستخدم عند الرغبة في إنشاء سلسلة نصية معقدة وتتيح للمبرمجين تنسيق النص بشكل ديناميكي. 3- استخدام مكتبات تنسيق النص: توفر بعض مكتبات Python ميزات تنسيق النص المتطورة، مثل Pygments و TextBlob. يمكن استخدام هذه المكتبات لتحويل النص إلى HTML أو Markdown وتنسيقه بشكل متقدم. يمكن استخدام أي من هذه الطرق لتنسيق النص في بايثون، والطريقة التي يتم استخدامها يعتمد على حاجة المستخدم والمتطلبات المحددة للمشروع.
  22. في حال فهمت سؤالك بشكل صحيح. في البداية يجب فهم كيف يمكنك استخدام الـ JavaScript للوصول إلى قيمة العنصر input element وإدخالها في الـ list of items. يمكنك استخدام الأحداث (Events) لتحديد عندما يتم النقر على زر submit. عند حدوث هذا الحدث، يمكنك استخدام الـ DOM (Document Object Model) للوصول إلى قيمة الـ input element وإضافتها إلى الـ list of items. يمكن استخدام الـ XMLHttpRequest لإرسال post request وتحديث الـ list of items. هذا مثال بسيط يستخدم الـ HTML والـ JavaScript لإنشاء تطبيق to-do list: <!DOCTYPE html> <html> <head> <title>To-Do List</title> </head> <body> <h1>To-Do List</h1> <form> <input type="text" id="new-item"> <button type="submit" id="add-item">Add Item</button> </form> <ul id="list"></ul> <script> const form = document.querySelector('form'); const newItemInput = document.querySelector('#new-item'); const list = document.querySelector('#list'); form.addEventListener('submit', (event) => { event.preventDefault(); const newItemText = newItemInput.value; const newItem = document.createElement('li'); newItem.textContent = newItemText; list.appendChild(newItem); newItemInput.value = ''; }); </script> </body> </html> في هذا المثال، يتم استخدام الأحداث (Events) للتعامل مع النقر على زر الـ submit، ثم يتم استخدام الـ DOM للوصول إلى قيمة العنصر input element وإضافتها إلى الـ list of items. يتم أيضًا مسح قيمة العنصر input element بعد الإضافة. يمكن تحسين هذا الكود لإضافة المزيد من الميزات، مثل حذف العناصر أو تعديلها. كما يمكن استخدام مكتبات مثل React أو Angular أو Vue.js لتسهيل إنشاء تطبيقات to-do list أكثر تعقيدًا. يمكنك البدء بإنشاء مكونات (Components) في React لعناصر التطبيق المختلفة، مثل عنصر الإدخال (input) والزر (button) وقائمة العناصر (list of items). ثم يمكنك استخدام الأحداث (Events) في React للتعامل مع إضافة وحذف العناصر. فيما يلي مثال لكيفية استخدام React لإنشاء تطبيق to-do list: import React, { useState } from 'react'; function TodoList() { const [items, setItems] = useState([]); const [text, setText] = useState(''); function handleSubmit(event) { event.preventDefault(); if (text.trim().length === 0) { return; } const newItem = { text }; setItems([...items, newItem]); setText(''); } function handleDelete(index) { setItems(items.filter((_, i) => i !== index)); } return ( <div> <h1>To-Do List</h1> <form onSubmit={handleSubmit}> <input type="text" placeholder="Enter a new item..." value={text} onChange={(event) => setText(event.target.value)} /> <button type="submit">Add Item</button> </form> <ul> {items.map((item, index) => ( <li key={index}> {item.text} <button onClick={() => handleDelete(index)}>Delete</button> </li> ))} </ul> </div> ); } export default TodoList; في هذا المثال، يتم استخدام الـ hooks في React لإنشاء حالتين (state)، واحدة لقائمة العناصر (items) والأخرى لنص العنصر الجديد (text). يتم استخدام الـ useState لتعيين الحالة الأولى (items) إلى مصفوفة فارغة، ثم يتم استخدام الـ useState لتعيين الحالة الثانية (text) إلى قيمة فارغة. يتم استخدام الـ function handleSubmit عند النقر على زر الإضافة لإضافة عنصر جديد إلى قائمة العناصر. يتم التحقق من أن النص غير فارغ قبل إضافته. يتم استخدام الـ function handleDelete عند النقر على زر الحذف لحذف عنصر من قائمة العناصر. يتم استخدام الـ filter لإنشاء قائمة جديدة تحتوي على جميع العناصر باستثناء العنصر الذي تم حذفه. يتم عرض قائمة العناصر باستخدام الـ map، حيث يتم عرض كل عنصر في قائمة مع زر الحذف. يتم استخدام الـ key لتعيين مفتاح فريد لكل عنصر لتحسين أداء التطبيق. لتضمين هذا المكون في تطبيق React أكبر، يمكنك استدعاءه داخل المكون الأساسي الرئيسي (root component) وتضمينه في واجهة المستخدم باستخدام JSX، وهو لغة توضيحية تجمع بين JavaScript وHTML. import React from 'react'; import TodoList from './TodoList'; function App() { return ( <div> <h1>My Todo App</h1> <TodoList /> </div> ); } export default App; يتم استدعاء TodoList كمكون داخل المكون الرئيسي App باستخدام JSX، حيث يتم عرض العناصر الخاصة بـ TodoList تحت عنوان التطبيق الرئيسي. هذه هي بعض الأفكار الأساسية لاستخدام React في إنشاء تطبيق to-do list. يمكن تطويرها بمزيد من الوظائف والميزات، مثل التعديل والتصنيف والتنبيهات وما إلى ذلك.
  23. يبدو أن الخطأ ينتج عن استخدام دالة eval() في دالة handelEqials(). في بعض الحالات، قد يكون استخدام دالة eval() خطيرًا ويمكن أن يتسبب في أخطاء في الصياغة أو ثغرات أمنية. يمكنك محاولة استخدام دالة math.evaluate() بدلاً من دالة eval() من مكتبة mathjs لتجنب هذه المشكلات. استبدل دالة handelEqials() بالتالي: const handelEqials=()=>{ setInbutText(math.evaluate(inbutText)) } تم تعديل الكود المقدم، حيث تم تعديل اسماء بعض الكمبوننتات والدوال لتكون متناسبة مع الكود المعروض، وتم تعديل بعض الخطوات لكي تقوم بعملية الحسابات بشكل صحيح، وتم تعديل الزر "/" ليعمل بشكل صحيح في الحسابات، وتم تعديل الزر "*" ليعمل بشكل صحيح في الحسابات، وتم اضافة الزر "-" لعملية الطرح في الحسابات. ويمكنك دائمًا استخدام الاختصار الذي سينظم ويزيل جميع الواردات imports غير الضرورية من الملف الحالي في MAC ، يكون [Ctrl + Option + O] بالنسبة للبعض هو [Option + Shift + O] وبالنسبة للويندوز استبدل option بزر Alt import React, { useState } from 'react'; import './App.css'; import Button from './components/Button'; import Inbut from './components/Inbut'; import ClearButton from './components/ClearButton'; import * as math from 'mathjs'; const App = () => { const [inbutText, setInbutText] = useState(''); const addToInbut = (val) => { setInbutText(inbutText + val); }; const handleEquals = () => { const result = math.evaluate(inbutText); setInbutText(result); }; return ( <div className="app"> <div className="calc-wrapper"> <Inbut inbut={inbutText} /> <div className="row"> <Button handleClick={addToInbut}>7</Button> <Button handleClick={addToInbut}>8</Button> <Button handleClick={addToInbut}>9</Button> <Button handleClick={() => addToInbut('/')}>/</Button> </div> <div className="row"> <Button handleClick={addToInbut}>4</Button> <Button handleClick={addToInbut}>5</Button> <Button handleClick={addToInbut}>6</Button> <Button handleClick={() => addToInbut('*')}>x</Button> </div> <div className="row"> <Button handleClick={addToInbut}>1</Button> <Button handleClick={addToInbut}>2</Button> <Button handleClick={addToInbut}>3</Button> <Button handleClick={() => addToInbut('+')}>+</Button> </div> <div className="row"> <Button handleClick={addToInbut}>.</Button> <Button handleClick={addToInbut}>0</Button> <Button handleClick={handleEquals}>=</Button> <Button handleClick={() => addToInbut('-')}>-</Button> </div> <ClearButton handleClick={() => setInbutText('')}>Clear</ClearButton> </div> </div> ); }; export default App;
  24. تشير رسالة الخطأ هذه إلى أنه ليس لديك أذونات كافية للوصول إلى مفتاح التسجيل المطلوب أو تعديله لتثبيت Python. لحل هذا الخطأ، سيتطلب ذلك التعديل على الـ key المذكور بداخل الـ registry، وهو أمر لا أنصحك به والأفضل تثبيت Python على نظام Windows باستخدام عدة طرق مختلفة، إليك بعض الطرق البديلة: باستخدام Anaconda: Anaconda هي منصة شائعة لعلوم البيانات تحتوي على Python والعديد من المكتبات العلمية المثبتة مسبقًا. يمكنك تنزيل وتثبيت Anaconda من الموقع الرسمي (https://www.anaconda.com/products/distribution). باستخدام مدير الحزم: يتيح بعض مديري الحزم لنظام Windows، مثل Chocolatey، لك تثبيت Python وتبعياته من سطر الأوامر. يمكنك العثور على تعليمات لتثبيت Python باستخدام Chocolatey على موقع Chocolatey (https://chocolatey.org/packages/python). باستخدام برنامج تثبيت سابق : تتوفر بعض برامج تثبيت سابقة من Python لنظام Windows يمكنك تنزيلها وتثبيتها مباشرة. على سبيل المثال، على موقع ActiveState (https://www.activestate.com/products/python/downloads/).
  25. يمكن إضافة مستخدم جديد إلى القاموس عن طريق إضافة مفتاح جديد مع القيمة المرادة. على سبيل المثال، يمكن إضافة المستخدم "Ali" برقم هاتف "4444444444" بالطريقة التالية: phone_books["Ali"] = 4444444444 القاموس (Dictionary) في لغة البرمجة بايثون هو نوع من البيانات المتاحة، ويسمح بتخزين القيم باستخدام مفاتيح. يتم تخزين المفاتيح والقيم كزوج من القيم في القاموس. وهذا يمكن أن يكون مفيدًا في العديد من السيناريوهات مثل تخزين قيم نظام إدخال المستخدم، أو متابعة ترتيب بناء جدول البيانات. على سبيل المثال، يمكن إنشاء قاموس بسيط لتخزين بيانات الشخص الأول كالتالي: person = {"name": "John", "age": 28, "city": "New York"} وبما أن القاموس يستخدم المفاتيح لتخزين القيم، فإنه يمكن الوصول إلى القيم باستخدام اسم المفتاح. على سبيل المثال، يمكن الوصول إلى اسم الشخص في القاموس السابق كالتالي: print(person["name"]) سيتم طباعة "John" في الشاشة. يمكن أيضًا إضافة عناصر إلى القاموس بسهولة. على سبيل المثال، يمكن إضافة عنصر "email" لشخصنا السابق كالتالي: person["email"] = "john@example.com" يمكن حذف عنصر من القاموس باستخدام الأمر del كالتالي: del person["city"] يمكن الوصول إلى قائمة بجميع المفاتيح في القاموس باستخدام الأمر keys() كالتالي: print(person.keys()) ويمكن الوصول إلى قائمة بجميع القيم في القاموس باستخدام الأمر values() كالتالي: print(person.values()) يمكن الوصول إلى قائمة بجميع العناصر في القاموس باستخدام الأمر items() كالتالي: print(person.items()) يمكن استخدام القاموس في العديد من السيناريوهات المختلفة، بما في ذلك تخزين معلومات المستخدمين، وتخزين بيانات النظام، وإدارة قوائم الاختيار والخيارات، والتعامل مع البيانات المسترجعة من قواعد البيانات، والعديد من التطبيقات الأخرى.
×
×
  • أضف...