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

معاذ قره محمد

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

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

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

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

    2

كل منشورات العضو معاذ قره محمد

  1. الخطأ أنك تقوم بتخزين العنصر الأول مثلاً april في المتحول el ثم تقوم بتخزين العنصر الثاني march بنفس العنصر el ومنه يكتب فوق القيمة القديمة وتذهب الأولى. يجب عليك أن تستخدم مصفوفة لحفظ العناصر لتتجنب هذه المشكلة: print("[]:") num=int(input("...")) y=0 list = [] # عرفنا المصفوفة while y<num: y+=1 el=input("Enter Element:") list.append(el) #أضفنا هنا العنصر المدخل داخل المصفوفة الآن أصبح لديك جميع العناصر داخل المصفوفة list كل ما عليك فعله طباعتها معكوسة! بالتوفيق
  2. هل يمكنك إرفاق ملفات المشروع لنقوم بمساعدتك بشكل أفضل !
  3. ليست لدي فكرة فيما إن كان مطوّروا البيئة وفّروا إمكانية لذلك، لكن لا تأخذ الأمور كثيراً على عاتقك، أي ما المانع فيما إذا بقي هذا الخرج ظاهراً، أليس المهم أن ينفّذ الكود الخاص بك بلا أخطاء! إضافة إلى أنّ ما يظهر لك هو كلام مساعد لك في عملك. ولربما يكون هناك طريقة لتنفيذ الأمر الذي ترجوه، فيمكنك البحث في إعدادات برنامج الـ netbeans عن ذلك أو انتظر أحد المدربين ليقوم بإرشادك. بالتوفيق إن شاء الله
  4. السبب في الخطأ أنك تضع عملية جمع بين المؤقت والقيمة المراد إدخالها للطريقة hello. أي أنك لا تقوم بتعريف الوسيط name ومنه سيعتبره undefined، تقوم بحل المشكلة بالطريقة التي ذكرت في التعليق السابق. أو بإمكانك كتابة: setTimeout(() => hello("Youssef"), 3000)
  5. الظاهر في الـ output بداية هو اسم مشروعك ثم رسالة أنّ التطبيق قد أنشئ بنجاح، ثم زمن التنفيذ الذي استغرقه التنفيذ والساعة التي انتهى التنفيذ بها. هذا النوع من الرسائل سيظهر كثيراً معك لاحقاً، لاسيما عندما تعاين أخطاء في البرنامج كحال جميع المبرمجين، من الأفضل أن تعتاد على مثل هذه الرسائل، حيث هناك فائدة منها ولو لم تعلم ذلك الآن.
  6. السبب في ذلك أنّك تنفّذ كلّ طرق الـ check ضمن الجملة الشرطية، والجملة الشرطية عند أول خطأ تراه تقوم بإرساله والخروج فوراً. حاول التعديل على الكود ليصبح: form.addEventListener('submit', function (e) { e.preventDefault() let check1 = checkRequired([username, email, password, confirmPassword]); let check2 = checkLength(username, 4, 15); let check3 = checkLength(password, 6, 20); let check4 = checkEmail(email); if (check1 && check2 && check3 && check4) { localStorage.setItem("register-username", username.value) localStorage.setItem("register-email", email.value) localStorage.setItem("register-password", password.value) setTimeout(() => { window.location = "./login.html" }, 1000) } }) بحيث تقوم بتنفيذ جميع طرق التفحّص وإرسال جميع الأخطاء.
  7. يمكنك ذلك من خلال استبدال الأمر المستخدم: SELECT id as '#ID', name_ar as 'الإسم العربي', name_en as 'الإسم الإنجليزي', status as 'الحالة' FROM levels بالأمر: SELECT id as '#ID', name_ar as 'الإسم العربي', name_en as 'الإسم الإنجليزي', CASE WHEN status=0 THEN "غير مفعل" ELSE "مفعل" END as 'الحالة' FROM levels حيث بدّلنا العمود status بالجملة الشرطية CASE التي ستقوم بفحص قيمة status إن كانت 0 ستضع غير مفعل، وإن كانت غير ذلك "أي واحد" ستضع مفعّل. أنصحك بقراءة المزيد عن الجملة الشرطية CASE من خلال موسوعة حسوب.
  8. النص المكتوب في Tarts يشرح نفسه بنفسه، يقول يريد واصفات ووظائف. واصفاته واصفة وحيدة هي withFruit وهي قيمة منطقية إما صح أو خطأ فيما إذا كان الـ Tarts مع فواكه أم بدون. ووظائفه اثنان: مشيّد أربع قيم، معرف id، ونكهة flavor، وحجم size، وفيما إذا كان مع فواكه أم بلا فواكه withFruit. وحساب السعر، حيث يتوقف على حجم الـTarts الصغير بـ6 ريال سعودي، والمتوسط بـ10، والكبير بـ12 وهذا يعتمد على القيمة المدخلة من المشيّد لحجم الـTarts أي الواصفة size. وانتبه أنه إذا كان الـTarts مع فواكه ستزيد على السعر 3 ريال وستبقيه على حاله فيما لم نضف أي فواكه. انتبه إلى أنّه قد تزيد واصفات في الصف Tarts حسب الحاجة لحفظ البيانات من المشيد. ما يجب عليك هو كتابة هذا الكود من فهمك له، ثم إذا حصلت معك بعض المشاكل وتوقّفت في مكان ما قم رجاءً بمشاركة الكود مع المشكلة لنستطيع مساعدتك. فهذا السؤال لاختبارك ولكي ترتقي بفكرك البرمجي فيجب عليك حلّه بنفسك.
  9. إذا كنت تعمل على قاعدة بيانات من نوع (sql) فهناك ما يسمى بالـ users، حيث يمكنك إنشاء مستخدمين بصلاحيات مختلفة، ويمكنك من خلال ذلك أن تدخل كل موقع عن طريق مستخدم معين، فتكون ربطت عدة مواقع بقاعدة بيانات واحدة بصلاحيات مختلفة. مثلاً لإنشاء مستخدم يمكن كتابة الكود التالي: CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'password'; ولكي تضيف له صلاحيات معينة يمكن كتابة الكود التالي: GRANT ALL PRIVILEGES ON * . * TO 'new_user'@'localhost'; حيث أضفنا هنا كل الصلاحيات على كل قواعد البيانات إلى هذا المستخدم (user)، يمكنك للاطلاع على الصلاحيات أن تزور SQL في موسوعة حسوب، انظر لفقرة التعامل مع المستخدمين. لاحظ أنه يمكنك أيضاً إنشاء أدوار (roles) عوضاً عن المستخدمين وإعطاء صلاحية لكل دور وربط الأدوار بالمستخدمين. وفي حال كنت تتعامل مع قاعدة بيانات من نمط (nosql) فغالباً ما توفّر نفس الفكرة في لوحة التحكم، يمكنك البحث عن كيفية إنشاء مستخدمين وإعطاء صلاحيات لهم في قاعدة البيانات المستخدمة لكي تحقق الغرض الذي ترجوه.
  10. ما فهمته منك أنك تريد أن تخزّن كل البيانات إن كانت مطابقة فقط ولا تخزّن أي شيء إن كان هناك أحد البيانات غير مطابق. لكن أظن الآن أنّك تعني أنه إن لم يكن إلا اسم المستخدم -مثلاً- صحيح تريد أن تخزنه لوحده دون بقية القيم الخاطئة. يمكنك فعل ذلك بنفس الطريقة التي شرحتها، لكن بالتعديل التالي: form.addEventListener('submit', function(e){ e.preventDefault() if (checkRequired([username]) and and checkLength(username, 4, 15)) { // سيخزن اسم المستخدم إذا حقق الشرطين localStorage.setItem("register-username", username.value) } else { // false هنا اكتب ما تريد فعله في حال أعاد } if (checkRequired([password,confirmPassword]) and checkLength(password, 6, 20) and checkPassword(password, confirmPassword)) { // أضف هنا كلمة السر } else { // ما يجب فعله عندما تكون كلمة السر لا تحقق الشروط } if(checkRequired(email) and checkEmail(email)){ // أضف الإيميل } else{ // ما يجب فعله عندما يكون الإيميل لا يحقق الشروط } }) هكذا ستخزن كل واصفة لوحدها، ويوجد طريقة أخرى مثل: form.addEventListener('submit', function(e){ e.preventDefault() // سننشئ بداية غرض let data = {}; // سنضيف له الخصائص المطابقة للشروط فقط، ثم نضيفه إلى التخزين if (checkRequired([username]) and and checkLength(username, 4, 15)) { // سيخزن اسم المستخدم إذا حقق الشرطين data.username = username; } else { // false هنا اكتب ما تريد فعله في حال أعاد } if (checkRequired([password,confirmPassword]) and checkLength(password, 6, 20) and checkPassword(password, confirmPassword)) { // أضف هنا كلمة السر data.password = password; } else { // ما يجب فعله عندما تكون كلمة السر لا تحقق الشروط } if(checkRequired(email) and checkEmail(email)){ // أضف الإيميل data.email = email; } else{ // ما يجب فعله عندما يكون الإيميل لا يحقق الشروط } // وأخيراً أضف الغرض إلى التخزين localStorage("usreData", JSON.stringify(data)); }) فائدة الطريقة JSON.stringify أن تحول الغرض إلى string حيث لا يمكننا تخزين الغرض في ال localStorage. وعندما نجلبه سنستخدم الطريقة JSON.parse لتحويل الـstring إلى غرض مرة أخرى. JSON.parse(localSorage.getItem("userData"))
  11. هناك عدة طرق لفعل ذلك، مثلاً يمكنك أن تعيد من كل check function (الطرق المخصصة للفحص) قيمة منطقية، أعني بذلك (true or false)، ثم تقوم بفحص ما تعيده، فإذا أعادت true تكمل الفحص وإذا أعادت false توقف الفحص ولا تضيف إلى الـ localStorage إلا إذا اجتازت كل طرق الفحص بقيمة true، سأضرب مثال على إحدى الطرق في الأعلى: function checkRequired(inputArr) { inputArr.forEach(function (input) { if (input.value.trim() === '') { showError(input, `${getFieldName(input)} is required`) } else { showSuccess(input); return false; // false في حال كان أحدهم فارغاً سنعيد } }); return true; // true في حالة كان كل المدخلات غير فارغة سنعيد } والآن نأتي إلى ما سنفعله عند الـ submit، نكتب: form.addEventListener('submit', function(e){ e.preventDefault() if (checkRequired([username,email,password,confirmPassword])){ localStorage.setItem("register-username", username.value) } else { // false هنا اكتب ما تريد فعله في حال أعاد } // checkLength(username, 4, 15) // checkLength(password, 6, 20) // checkEmail(email) // checkPassword(password, confirmPassword) }) طبعاً يجب أن تقوم بالتحقق من كل طرق الفحص، لكن ضربت لك مثالاً واحداً لتتّضح الصورة، عند تعديلك على كل الطرق بالطريقة التي ذكرتها في الأعلى، سيكون بإمكانك كتابة: form.addEventListener('submit', function(e){ e.preventDefault() if (checkRequired([username,email,password,confirmPassword]) and checkLength(username, 4, 15) and checkLength(password, 6, 20) and checkEmail(email) and checkPassword(password, confirmPassword)) { localStorage.setItem("register-username", username.value) } else { // false هنا اكتب ما تريد فعله في حال أعاد } })
  12. المشكلة هي أنك في نهاية ال dislike الأول تقوم بإعادة إنشاء عناصر HTML من أجل favoriteItems عن طريق الوظيفة drawFavoriteProducts لكن لا تقوم بإعادة إسناد حدث الـ dislike لتلك العناصر، لحل المشكلة يمكنك التعديل على الكود بالشكل التالي: favorites.addEventListener('click', ()=>{ // get liked products from localStorage favoriteItems = JSON.parse(localStorage.getItem('favoriteProducts')) if(favoriteItems.length != 0){ // create a popup let overlay = document.createElement("div"); overlay.setAttribute("class", "popup-overlay"); document.body.appendChild(overlay); // styling and draw the popup-overlay let favoriteWrapper = document.createElement("div"); favoriteWrapper.setAttribute("class", "favorite-wrapper"); overlay.appendChild(favoriteWrapper); function drawFavoriteProducts(favorites) { let drawFavoriteProducts = favorites.map((favItem) => { return ` <i class="fa-sharp fa-solid fa-circle-xmark closeBtn"></i> <div class="favorite-card"> <p class="dislike" data-click="${favItem.id}"> Dislike <i class="fa-regular fa-thumbs-down"></i> </p> <img src="${favItem.img_url}.png" alt="" srcset=""> <h2 class="favorite-title">${favItem.title}</h2> </div> `; }); favoriteWrapper.innerHTML = drawFavoriteProducts.join(""); // أسندنا هنا قابلية إزالة الإعجاب إلى العناصر ablityToDislike(); } drawFavoriteProducts(favoriteItems); // remove disliked products //ablityToDislike وضعت هنا وظيفة إسناد الأحداث ضمن طريقة سميتها function ablityToDislike() { let disliked = document.querySelectorAll(".dislike"); disliked.forEach((item) => { let dislikeId = item.getAttribute("data-click"); item.addEventListener("click", () => { favoriteItems = favoriteItems.filter((data) => data.id != dislikeId); localStorage.setItem("favoriteProducts", JSON.stringify(favoriteItems)); drawFavoriteProducts(favoriteItems); }); }); } } }) هذا سيحل المشكلة، بالتوفيق إن شاء الله.
  13. هذا هو الصف الذي يحوي الوظيفة main الظاهر في القائمة النهائية: com.mycompany.mavenproject.Mavenproject قم بالضغط مرتين عليه أو اضغط Select Main Class بعد تحديده عن طريق الماوس، إذا لم تتمّ الأمور قم بحذف المشروع وأعد إنشاءه وتأكد من عدم تحديد الخيار المحدد باللون الأصفر لأنه غالباً ما يسبب تلك المشكلة. أرجو أن يقوم ذلك بحلّ مشكلتك.
  14. إذا كنت تقصد بالكود التالي: SELECT * FROM tenders WHERE code = 1810 OR ref = 5555-55555 OR con_number = 50 AND id =! 8 أن تقول إما 1810 = code أو 55555-5555 = ref أو 50 = con_number وفي كل الحالات لا يجب أن يجلب العنصر ذو 8 = id عندها يجب أن تكتب بالشكل: SELECT * FROM tenders WHERE (code = 1810 OR ref = 5555-55555 OR con_number = 50) AND id =! 8 وذلك لأن البيانات سترى كودك القديم بالشكل (إما ( 1810 = code) أو ( 55555-5555 = ref) أو (50 = con_number و 8 = id)) وهذا مغاير لما تريده أنت. أما بالنسبة لموضوع التعديل فيمكنك من خلال الأمر select أن تتأكد من وجود أي عنصر يحوي في خصائصه قيم مشابهة للقيم في العنصر المعدل الجديد، في المثال التالي سأتأكد من عدم تكرار الاسم قبل تعديله -كمثال-: // العبارة القادمة تبحث في كل الجدول إلا العنصر الذي نعدله الآن $q1 = SELECT * FROM table WHERE name = target_name AND NOT id = "id العنصر قيد التعديل"; $result = $conn->query($q1); if(!$result){ // سيدخل إلى هذه الجملة الشرطية في حال الاسم لم يكن مكرر // هنا نضع أمر التعديل }
  15. كل ما عليك فعله هو تعديل mavenproject ليصبح main class. اضغط بالزر الأيمن للماوس على الصف mavenproject ثم اختر properties، اضغط على الخيار Run من القائمة اليسرى اضغط على Browse بجانب الحقل main class واختر الصف الذي يحوي الوظيفة main، ثم حاول تنفيذ الكود مرة أخرى سيعمل بدون مشاكل. أتمنى أن يحلّ ذلك مشكلتك، بالتوفيق
  16. الخطأ بسيط إن شاء الله، يقول Can't create database 'hajj'; database exists بمعنى لا يمكن إنشاء قاعدة البيانات "hajj"، قاعدة البيانات موجودة أصلاً ! فلا يمكننا إنشاء قاعدتي بيانات بنفس الاسم في نفس المكان، أليس هذا منطقياً ؟ يمكنك حلّ المشكلة عن طريق مراعاة حالة أننا قد قمنا بإنشاء قاعدة البيانات سلفاً، فيمكنك استخدام تعبير try catch للقيام بذلك، والذي يحاول تنفيذ الكتلة البرمجية بعد try فإن لم يستطع التنفيذ لوجود خطأ ما يقوم بتنفيذ الكتلة البرمجية بعد catch التي تأخذ كمعامل لها الخطأ الحاصل. $q1="CREATE DATABASE hajj"; try{ $result = mysqli_query($con,$q1); if ($result) { echo "Database created successfully"."<br>"; } } catch(error) { // ضع هنا ما تريد القيام به في حال حدث الخطأ // كمثال echo "Database is already exists"; } الفائدة: ما يهم هو أن تعلم سبب الخطأ، أنه لا يمكنك إنشاء قاعدتي بيانات بنفس الاسم في نفس المكان، والحل هو أن تقوم بمراعاة هذه الحالة بالتحقق من وجود قاعدة البيانات قبل إنشائها، وإنشائها فقط في حالة كانت غير منشأة.
  17. قمت بالاطلاع على الكود الخاص بك، ثم تبديل الصف col-6 بالصفين col-12 col-md-6 كالتالي: <div class="row"> <div class="col-12 col-md-6"> <!-- هنا --> <h2 class="section-title">شيتوس جيم</h2> <p>يسعى في ضمان حصولك على جميع ما تحتاجه من أجل تحقيق كافة أهدافك الصحية والوصول إلى مستوى متطور من اللياقة البدنية ويتم ذلك من خلال استخدام أحدث المعدات المتطورة وبرامج التأهيل ذات الإستراتيجيات المختلفة </p> </div> <div class="col-12 col-md-6"> <!-- هنا --> <img src="https://img.freepik.com/free-photo/caucasian-sport-abdominal-background-wall_1296-394.jpg?size=626&ext=jpg&ga=GA1.2.237098104.1665821310" alt="" srcset=""> </div> </div> لأن الصف col-12 يطبق على جميع الشاشات ما لم نخصصه بصف آخر مختص بشاشة معيّنة، فإذا خصصنا على شاشة كما في المثال (col-md-6) ستطبق على الشاشة المحددة وهي المتوسطة هنا وما فوقها أي وعلى الشاشة الكبيرة أيضاً. فيصبح معنى هذين الصفين أنه في حال الشاشات قبل الmd سيأخذ من الgrid عرض 12 عمود، وعند الشاشة md فما فوقها سيأخذ العرض 6 أعمدة من الgrid. ثم قمت بوضع العرض النسبي 100% :width للصورة عوضاً عن العرض الثابت 380px، لكي تتناسب مع جميع الشاشات فتأخذ العرض المتاح فقط.
  18. نحن متوافرون كي نساعدك للوصول إلى المرحلة التي تقوم أنت بكتابة الكود للتنسيق الصحيح على جميع الشاشات، فإذا فعلنا ذلك عنك لم تحصّل أنت النتيجة المرجوّة، فيمكنك أن تطالع كيفية جعل الموقع متناسق مع جميع الشاشات باستخدام التقنيات التي تريدها من خلال المراجع التي سأرفقها، حاول أن تتعلم الخاصة ولماذا تستعمل وكيف تستعمل ثم استفد من ذلك في مشروعك. وفي حال تعرضت لمشاكل أثناء قيامك بالتنسيق أرجو منك السؤال عنها هنا وسنساعدك بقدر المستطاع. المراجع استعلامات الوسائط (Media Queries) في CSS دروس أكاديمة حسوب خاصة ببوتستراب الموقع الرسمي للبوتستراب Bootstrap كما يمكنك الاطلاع على السؤال التالي:
  19. يرجى الانتباه أنّ لكل عنصر في HTML وظيفة معينة، واستخدام الوسم الصحيح في المكان الصحيح يحسن موقعك في محركات البحث. والوسم <kbd> مثلاً يمثل عنصر HTML نصي مضمّن الذي يشير إلى إدخال المستخدم النصي من لوحة مفاتيح أو إدخال صوتي أو أي جهاز إدخال آخر. ووفقا للاصطلاح، يقوم المتصفح بعرض محتويات الوسم <kbd> باستخدام خط monospace الافتراضي الخاص به (وهو خط يركز على الحرف بدلاً من الكلمة بحيث يأخذ كل حرف نفس المساحة عند كتابته في أي مكان)، على الرغم من أن هذا غير مطلوب بموجب معيار HTML. ويمكنك الاطلاع على المزيد من خصائصه هنا: موسوعة حسوب العنصر <kbd>
  20. لنعد أولاً إلى تعريف البرمجة، فالبرمجة هي أكثر من مجرد إتقان لغة برمجية أو إصلاح أخطاء شيفرة برمجية معينة بل هي إثبات عملي للفكر التحليلي والرياضي والمنطقي والقدرة على تفكيك المشاكل الكبيرة والمعقدة إلى أجزاء صغيرة ومفهومة وقابلة للحلّ. أي أنّنا سيكون لدينا مشكلة ضخمة كمشروع فيه الكثير من الوظائف مثلاً، ثمَّ سنقوم بتحليله شيئاً فشيئاً إلى أن يصبح لدينا خارطة ذهنية للوظائف التي ستكون في المشروع وكيفية بنائها، وهذا لا شك يحتاج إلى الخبرة أي الوقت والممارسة والاستغراق بالتفكير. ولا بدّ من الإشارة هنا إلى أهمية مواقع حل المشكلات البرمجية مثل موقع Codeforces، فحل المشكلات على مواقع مثل هذا ستمكنك من تطوير تفكيرك التحليلي والتفكير المنطقي وحل المشكلات المنطقية بشكل أسرع. والآن لننطلق إلى واقع ملموس ومعايير في بناء المشروع يمكن اتباعها وفهمها لتكون حجر الأساس. إذاً كيف نقوم ببناء خطة حلّ شاملة لمشروعنا ؟ وما سأنقله هنا ليس تعليمات ثابتة وإنما مبادئ ننطلق منها جميعًا، كلٌ منا يطبقها بأسلوبه الخاص. 1. فهم المشكلة: إن فهمنا للمشكلة المطروحة هي الخطوة الأكثر صعوبة في طريقنا لحلّها، بل إن أكثر المشاكل تأتي صعوبتها من عدم تمكننا من فهم عميق لها. ولكن متى تعلم بأنك استطعت فهم المشكلة؟ إذا كنت قادرًا على شرحها بكلمات واضحة وسهلة بحيث يستطيع أي شخص فهمها عندها تكون بالفعل قد فهمت المشكلة. 2. تحليل المشكلة: إن تقسيم المشكلة يلعب دورًا مهمًا في طريقك لإيجاد الحلّ، لذا حاول أن تقسّمها إلى أجزاء صغيرة ثمّ حُلّ كلَّ جزء منها على حدة ويُنصح في البداية بحلّ أسهل جزء منها ومن ثمّ الأصعب فالأصعب وهكذا إلى أن يتمّ حلّ جميع أجزائها، وبعدها إجمع هذه الأجزاء مع بعضها للحصول على الحلّ النهائي للمشكلة الأصلية (الكبيرة). 3. إعداد خطة للحل: بعد أن فهمت وحللت المشكلة، يأتي دور وضع الخطة المناسبة للحلّ بحيث تغطي كافة الجوانب والتفاصيل للمشكلة، ولا تشرع في الحلّ من دون خطة (على أمل أن تجد الحلّ بطريقة ما) لأن المفتاح الرئيسي للوصول للحلّ هي الخطة الواضحة والمنظمة والتي تضمن وصولنا للحلّ النهائي. 4. مواجهة حالة السكتة البرمجية: ماذا لو فرضنا أنك لم تستطع حلّ أي جزء من المشكلة، ولا حتى الأجزاء السهلة منها (وهذا قد يحدث في بعض الأحيان)، إن كثير من المبرمجين يقعون في هذه الحالة فلا يستطيعون أن يُحرزوا أي تقدم يذكر في تطوير الشيفرة البرمجية وهذا أشبه ما يمكن بالسكتة الدماغية (حيث لا يستطيع المريض القيام بأي حركة)، في الحقيقة إن هذه الحالة طبيعية جدًا ومعظمنا قد تعرض لها في بداية مشواره والاختلاف الوحيد هو أن المبرمج المحترف لديه فضول أكثر حول المشكلة ومعرفة سبب حدوثها بدلًا من أن يكون منزعجًا أو غاضبًا منها. وفي هذه الحالة هنالك حلّين يمكنك تجربتهما للخروج من هذا المأزق: 1. تنقيح الأخطاء: والمقصود الأخطاء البرمجية 2. مراجعة وتقييم الحلّ: أي فحص الحل الذي عملنا عليه، هل هو الحل الأمثل حقّاً وهل كان صحيحا منذ البداية؟ 5. البحث عن حلول عبر الإنترنت: فإنّ الاستفادة من الخبرات السابقة المتوفرة على الأنترنت فيه تسهيل كبير لحل المشاكل البرمجية، فقد أصبحت أغلب المشكلات مكررة بشكل كبير على الانترنت. ختاماً أتركك مع المرجع التالي: حل المشكلات وأهميتها في احتراف البرمجة
  21. هنالك عاملان أساسيان ساهما في إضافة الدوال السهمية: الدوال القصيرة وعدم استخدام قيمة this خاصة بالدالة. أنصحك للمزيد من التعرف على الدوال السهمية بالنظر إلى الدوال السهمية في javascript
  22. حضرتك كتبت الكود، الرجاء لو تقومين بتوضيح ما المشكلة التي حصلت معك لنقوم بالمساعدة. كما أنك في السطر 16 والسطر 24 كتبت 10000 عوضاً عن 1000، فالمصفوفة ستكون بعشر أعمدة ومئة سطر أي ستحتوي على 1000 عنصر وليس 10000.
  23. نمط intersection observer يستخدم لمراقبة عنصر ما فيما إذا دخل شاشة العرض أو غادر منها، دون الحاجة إلى مكتبات خارجية. سأورد هنا مثالاً عن animation on scroll باستخدام intersection observer. في البداية ليكن لدينا محتوى ال html التالي: <div class="container"> <p> Lorem ipsum dolor sit amet consectetur adipisicing elit. Iure, beatae eius iste minima veritatis tempora molestiae harum. Perspiciatis praesentium odit magnam recusandae earum. Similique, magnam ratione. Sint distinctio rerum blanditiis. </p> <img src="https://ljc-dev.github.io/hosted-assets/thumb-a.png" alt="صورة ما"> <p> Lorem ipsum dolor sit amet consectetur adipisicing elit. Iure, beatae eius iste minima veritatis tempora molestiae harum. Perspiciatis praesentium odit magnam recusandae earum. Similique, magnam ratione. Sint distinc tiorerum blanditiis. </p> </div> عبارة عن قسم فيه نصان وصورة. وأنشأت في ملف ال style التنسيق التالي: * { margin: 0; padding: 0; box-sizing: border-box; } html, body { width: 100%; } .container { display: flex; flex-flow: column; align-items: center; } img { position: relative; width: 300px; height: 300px; margin: 0 auto; opacity: 0; transform: translateY(100px); transition: transform 1s, opacity 1s; } .fadeIn { opacity: 1; transform: translateY(0px); } p { font-size: 2rem; margin: 2rem 0; width: 300px; } أريدك أن تلاحظ أن الصف fadeIn لم يتم استخدامه إلى الآن على أيّة عنصر، وهو الصف الذي سنستخدمه ليقوم ب animation معين عند النزول بشاشة العرض إلى مكان العنصر. الآن نأتي لنشرح كيف سنستخدم intersection observer على مثالنا السابق: أول ما يجب فعله هو أن نقوم بجلب العناصر من ملف الhtml التي نريدها أن تخضع لل animation ثم سنقوم بإنشاء غرض من الصنف IntersectionObserver والذي يأخذ كمعامل أول له وظيفة callback، وهذه الوظيفة تأخذ كمعامل أول لها مصفوفة من المدخلات entries والتي سنستخدمها لنقوم بإنشاء الanimation الخاص بنا. وبالعودة إلى IntersectionObserver فإنه يأخذ كمعامل ثان له خيارات أخرى يمكنك الاطلاع عليها ببحث بسيط على الانترنت. وفي النهاية سنضع المراقب الخاص بنا على العنصر الذي نريده أن يتفاعل. لننطلق إلى الكود إذاً const img = document.querySelector("img") // جلبنا الصورة // أنشأنا طريقة لنضعها كمعامل أول للمراقب الخاص بنا // هي مصفوفة من المدخلات الخاصة بالعنصر entriesحيث أنّ ال // أي تم تقاطع العنصر المراقب مع شاشة العرض entry.isIntersecting ثم قمنا بالمرور عليها بحلقة وفحص فيما إذا كانت // إلى العنصر المطلوب fadeIn في حال تحقق الشرط سنضيف التنسيق const callback = (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { entry.target.classList.add("fadeIn") } }) } // سندع الخيارات (المعامل الثاني) فارغاً في مثالنا const options = {} // وهنا نقوم بإنشاء مراقبنا الخاص const myObserver = new IntersectionObserver(callback, options) // img في النهاية نضيف هذا المراقب للعنصر myObserver.observe(img) أتمنى أن تكون قد فهمت كيف يمكننا استخدام intersection observer في مشاريعك القادمة. يمكنك الضغط هنا إذا أردت الحصول على المزيد من المعلومات حول هذا الموضوع.
  24. أهلا بك محمد لا لن نقوم بتعيين primary key ثاني حيث لا يجوز أن يكون لكل جدول إلا primary key واحد فقط. لكنّنا إذا أردنا أن نعين foreign key لخاصة ما يجب أن تحقق هذه الخاصة شروط معينة. مثلا لدينا جدول ما وليكن table1 يحوي عدة صفات من بينها صفة phone وهي ليست primary key، لكنها فريدة unique ولا يمكن أن تكون خالية not null. في حال تحقق هذان الشرطان يمكننا القول عن هذه الصفة ضمن الجدول أنها super key، وبما أن هذا المفتاح الفائق super key مكون من أدنى حد ممكن من الصفات (من صفة واحدة هي phone) فيمكننا القول عنه أنه candidate key (مفتاح مرشح). ومنه هذا المفتاح المرشح من الجدول table1 والذي ليس primary key i مؤهل ليكون له مرجع في جدول آخر. أي يمكننا وضع صفة phoneRef ضمن جدول آخر وليكن table2 ليكون foreign key للصفة phone من الجدول table1. للتلخيص، يمكننا وضع مفتاح أجنبي في جدول ما فقط للصفات التي تحقق شرط ال candidate key في جدول آخر.
  25. بشكل عام الجواب لا. فال Foreign Key فقط يمكنه أن يكون مرجعاً لأعمدة فريدة من جدول آخر، أي أنّ ال Foreign key لا بدّ أن يكون مفتاحاً مرشّحاً في جدول آخر كما أنّ ال Primary key هو مفتاح مرشّح في الجدول. حيث المفتاح المرشح هو أقل المفاتيح الفائقة super key صفاتٍ -أي أقلها عدد أعمدة- (والمفتاح الفائق: هو صفة أو مجموعة صفات من الجدول تعطي تعريفاً فريداً لكل سطر). يمكنك الرجوع إلى موسوعة حسوب عبر الرابط التالي لتتعرف أكثر على استخدام المفتاح الأجنبي Foreign key موسوعة حسوب - مفاتيح الجداول
×
×
  • أضف...