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

Wael Aljamal

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

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

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

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

    218

كل منشورات العضو Wael Aljamal

  1. توضيح للآلية: يمكن استخدام الدوال التالية، لإضافة وجلب Cookies: set cookie نمرر له اسم و قيمة و تاريخ الصلاحية ويقوم بإضافتها get cookie يبحث عن cookie موجودة لدينا ويجلبها check cookie يتأكد من صلاحيتها function setCookie(cname, cvalue, exdays) { var d = new Date(); d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); var expires = "expires="+d.toUTCString(); document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; } function getCookie(cname) { var name = cname + "="; var ca = document.cookie.split(';'); for(var i = 0; i < ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') { c = c.substring(1); } if (c.indexOf(name) == 0) { return c.substring(name.length, c.length); } } return "-1"; // أو فارغة } function checkCookie() { var user = getCookie("username"); if (user != "") { alert("Welcome again " + user); } else { user = prompt("Please enter your name:", ""); if (user != "" && user != null) { setCookie("username", user, 365); } } } خلال دورة جلب الرسائل، نجلب ID آخر رسالة مقروءة لدينا من خلال cookies وإن لم تكن موجودة نضع رقمها الافتراضي بقيمة أصغر من أي رسالة أخرى مثلا قيمة سالبة -1. ثم نقوم بعمل استعلام من قاعدة البيانات ونجلب الرسائل، ربما تكون بعض الرسائل قد قرأها المستخدم، لذلك نقارن بين معرفات الرسائل و نسند أصناف CSS مختلفة بين رسالة مقروءة و رسالة جديدة. الرسائل القديمة لها معرف أصغر من المعرف المحفوظ لدى المستخدم، أما الجديدة فأكبر لأن id تلقائي متزايد. seenId = getCookie("messageId"); messages = getAllMessages(); loop on messages as msg { if msg.id < seenId old message CSS else new message CSS seenId = msg.id // update تحديث } setCookie("messageId",seenId,365);// update تحديث
  2. عند عمل استعلام، يمكننا تخطي عدد من الصفحات باستخدام الدالة skip ويمكن أيضا تحديد عدد العناصر للصفحة باستخادم limit: مثال لجلب عدد من الطلاب وتقسيمهم في صفحات: function printStudents(pageNumber, nPerPage) { print( "Page: " + pageNumber ); db.students.find() .sort( { _id: 1 } ) .skip( pageNumber > 0 ? ( ( pageNumber - 1 ) * nPerPage ) : 0 ) .limit( nPerPage ) .forEach( student => { print( student.name ); } ); } pageNumber لعرض رقم الصفحة المطلوبة nPerPage عدد العناصر للصفحة الواحدة تم ترتيب الطلاب حسب المعرف الخاص بهم id. العلاقة الرياضية تحدد عدد السجلات التي سيتم تخطيها، رقم الصفحة مضروبا بعدد العناصر لصفحة واحدة
  3. لعرض الملف الحالي يمكننا استخدام filename__ مباشرة: console.log(__filename); فهي module أي وحدة خاصة لذلك. أما لطباعة المسار فقط نستخدم dirname__: console.log(__dirname);
  4. يمكن استخدام الحزمة ip مباشرة لعرض IP: var ip = require("ip"); console.dir ( ip.address() ); تم استخدام console.dir لطباعة جميع التفاصيل لعنوان IP. يمكن أيضا استخدام المكتية dns و os بالشكل التالي: require('dns').lookup(require('os').hostname(), function (err, add, fam) { console.log('addr: ' + add); }) حيث جلبنا hostname الذي يحوي IP. وطريقة أخرى باستخدام networkInterfaces var os = require('os'); var networkInterfaces = os.networkInterfaces(); console.log(networkInterfaces);
  5. عادةً نريد الاحتفاظ بكل الرسائل، عند جلب رسالة جديدة نضيف لها صنف CSS يميزها عن الرسائل القديمة، ثم اربط التعديل للرسائل الجديدة بدالة set Time Out التي تزيل الصنف المميز بعد انقضاء نصف ثانية مثلا. setTimeout(function(){ $(formMessages).removeClass('newMassage'); }, 2000); يمكن دمج الإضافة والحذف للصنف المميز سويا هكذا: $(formMessages) .addClass('newMassage') .delay(2000) .queue(function(next){ $(this).removeClass('newMassage'); }) حيث تم استخدام الرتل queue لتنظيم استدعاء الدوال
  6. أرجو أن تبدأ بكتابة البرنامج و سنساعدك إن حصل معك أخطاء. حاول استخدام الدالة split استخدام القاموس dict الحل: تقسم السلسلة النصية المتعلقة بالإدخال split لكلمات عن طريق فصل الكلمات بالفراغ ' ' split تعيد مصفوفة، نمر عليها بحلقة for ولكل عنصر منها هو كلمة، أيضا يمكننا المرور عليها بحلقة لكل كلمة و لكل حرف نضيفهم للقاموس الخاص بهم (قاموس كلمات - قاموس أحرف) المرور على القاموسين و اختيار أكبر عدد للمفتاح لكل من الكلمات و القاموس لأنه يدل على الأكثر تكرار هذا مثال مجرد للتوضيح، حاول اتباع نفس الخطوات wordsDict = {} text = input() words = text.split(' '); loop on wodrs as word wordsDict[word] += 1 res = max(wordsDict, key=wordsDict.get) كما يمكن استخدام الصنف Counter. لعد الأحرف تحتاج لحلقة أخرى تمر على الكلمة word. أكمل على نفس النمط
  7. السؤال غير واضح، أرجو كتابة جميع التفاصيل كنص و إضافة الشيفرة البرمجية في محرر النصوص، وأرجو أن تبدأي بكتابة البرنامج و سنساعدك إن حصل معك أخطاء.
  8. يمكنك حفظ ID آخر رسالة مقروءة ضمن ملفات Cookies في متصفح المستخدم. وعند جلب رسائل جديدة، أي رسالة لها معرف ID أكبر هي جديدة.. ثم قم بإسناد آخر ID لل Cookies كتحديث (بعد كل رسالة جديدة).
  9. أنت تحاول الوصول لمتغيرات معرفة ضمن صنف آخر بدون إنشاء غرض من هذا الصنف. حاول استخدام الكلمة المفتاحية static قبل اسم النتغير عند تعريفه.. public static GameObject astroidobj; ^^^^^^^^ يمكنك إضافتها لجميع المتغيرات (خصائص الصنف) لديك.
  10. هذا يعتمد على البيانات التي تجلبها كموقع، يمكنك تخزين الإحداثيات x,y في متغيرين مثلا وتسند لهما القيمة المعادة من marker في الصفحة الأخرى، أو جلب اسم المنطقة/العنوان كامل كنص و تخزينه. التحقق،بالنسبة للنص: النص غير فارغ. وبالنسبة للموقع كإحداثيات: درجات الطول تتراوح بين -90 و 90. أما درجات العرض بين -180 و 180.
  11. سأضيف قالب HTML + CSS يمكنك الاستفادة منه في عمل بنية لمنطقة الدردشة: HTML: <!-- الحاوي الرئيسية --> <div id="Thread"> <div id="Header"></div> <!-- قائمة عرض الرسائل --> <div id="MessageList"> <!-- رسائل --> <div class="message"> <p>Latest</p> </div> <div class="message"> <p>Older</p> </div> <div class="message"> <p>Oldest</p> </div> </div> <div id="Footer"></div> </div> ثم CSS: #Thread { background-color: mediumseagreen; display: flex; /* نطبق فليكس للحاوية */ flex-direction: column; overflow-y: hidden; height: 100vh; } #Header { height: 25px; background-color: blueviolet; } #MessageList { background-color: deepskyblue; height: 100%; display: flex; /* ونطبق فليكس للقائمة */ flex-direction: column-reverse; overflow-y: auto; } .message { background-color: white; padding: 4px; border: 1px solid #f9f9f9; font-size: 1rem; margin: 4px; } #Footer { height: 100px; background: red; } الملاحظة من الإجابة الأولى أن الحاوية لعنصر يجب أن نضيف لها display: flex; لكي تعمل يمكنك التعلم أكثر عن الخاصية Flex من توثيق أكاديمية حسوب من wiki.hsoub/CSS/flex
  12. يمكن استخدام خاصية Flex في CSS، حيث يمكنك إضافة التالي لحاوية الرسائل: #MessageList { flex-direction: column-reverse; /* سيتم عكس عرض العناصر داخلها */ } سيتم عرض الأولاد لهذه الحاولة بترتيب من الأسفل للأعلى
  13. الدالة translate تجلب قيمة النص الموافقة للمفتاح الممرر، وإن لم تجده ينتج استثناء (خطأ) يمكنك إرفاق الشيفرة للتأكد من المشكلة، وعليك أن توضح الخطأ، يصعب علينا فهم سبب المشكلة بالضبط بدون أي دليل
  14. تأكد من تطابق المفتاح الممرر لدالة translate مع ملفات الترجمة، ربما تقوم بتمرير المحتوى بشكل ديناميكي، فتم تمرير متغير فارغ. أو لم يتم الوصول لبيانات الترجمة بالأصل
  15. ربما مخفية. حاولي الضغط على F1 إن كان بوضع ملئ الشاشة اضغطي على F11 أو Ctrl + Shift + P ثم نحدد toggle menu bar
  16. لفتح مجلد ما في vs code أرجو فتح محرر أوامر cmd/terminal ثم كتابة: . code any/path> code . النقطة ضرورية، إن فتح المجلد فهذا يعني أن vs code مثبت. هذا بسبب التحديثات في البرنامج.
  17. يتم تنزل نسخة vs code الخاصة بأجهزة mac من رابط التحميل التالي: في الجزء الأيمن خاص ب mac إن كنت تستطيع تحديد المشكلة بدقة أكثر و إرفاق صور سيكون ذلك أفضل.
  18. يمكننا باستخدام التعابير المنتظمة: نستورد المكتبة re = regular expression ثم نطبق الدالة findall: import re text = "Hello, World! 0 Started 99, I'm 20 years" result = re.findall(r'\d+', text) => ['42', '32', '30'] d يعبر عن digit أي رقم. + (على الأقل واحد)
  19. للأسف هذا غير متاح، يجب دفع الاشتراك بالدورة التي ترغب بها قبل منحك إذن الوصول لها والتمكن من مشاهدة المحتوى ومتابعة الدروس. إن كان لديك أسئلة بخصوص الدفع، يمكنك فتح تذكرة من خلال مركز مساعدة حسوب
  20. ربما الفرع الحالي ليس باسم master بل main. لذلك يمكننا تعويض اسم الفرع الحالي ب HEAD مثلا ودفع الملفات ل master.. git push origin HEAD:master أيضا حاول دفع الملفات ل main. لعرض اسم الفرع الذي تعمل عليه حاليا نفذ الأمر: git branch -va
  21. إن كنت تعمل في بيئة تفاعلية interactive interpreter حيث تحتاج لإعادة تحميل النوذج module و بسبب تعديله يمكنك استخدام الدالة reload وتمرير اسمه لها for i in range(5): reload(mySecrept) بدل التضمين العادي. بشكل عام نضمن الmodule مرة واحدة و نستدعي الدالة منه مثل إجابة الكدرب عبدالمجيد.
  22. يمكننا إيقاف الحلقتين سوياً، بعدة طرق، استخدام Product التي تقوم على الجداء الديكارتي لقائمتين وتمر على الناتج بحلقة واحدة، هنا تعليمة break واحدة تكسر الحلقة: from itertools import product for x, y in product(range(10), range(10)): if y == : break أو نضع الحلقتين ضمن دالة و نستخدم تعليمة return: def myLoops(): for i in range(10): for j in range(10): print(...) if j == 5: return myLoops() يمكن عمل متغير بولياني Boolean يقوم بكسر الحلقة الخارجية حيث يتم اختباره بعد الخروج من الحلقة الداخلية، حيث نغير قيمته إلى Ture مثلا: myBreak = false for i in range(5): for n in range(5): if i == 5: myBreak = true break print(i, n) if myBreak : break # هنا نخرج من الحلقة الخارجية
  23. أرجو أن تبدأي بكتابة البرنامج و سنساعدك إن حصل معك أخطاء.
  24. أرجو أن تبدأي بكتابة البرنامج و سنساعدك إن حصل معك أخطاء.
  25. ربما قمت بعملية توقيع التطبيق مرتين، ونتج مفتاحين مختلفين، لعرض المفتاح الذي يعمل به التطبيق يمكنك تنفيذ التعليمة: keytool -list -v -alias key -keystore android/app/key.jks ثم وضع هذه القيمة في Firebase طبعا المسار هو مكان وضع المفتاح أي ملف key.jks
×
×
  • أضف...