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

Nuhla Almasri

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

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

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

2 متابعين

آخر الزوار

لوحة آخر الزوار معطلة ولن تظهر للأعضاء

إنجازات Nuhla Almasri

عضو نشيط

عضو نشيط (3/3)

57

السمعة بالموقع

15

إجابات الأسئلة

  1. يمكنك استخدام مكتبة جاهزة للCaptcha من الjquery كالتالي <!-- captcha challenge: placeholder --> <div id="botdetect-captcha" data-captchastylename="jqueryFormCaptcha"></div> <label> <span>Retype the characters from the picture:</span> <!-- captcha code: user-input textbox --> <input type="text" id="userCaptchaInput" > </label> <script src="node_modules/jquery/jquery.min.js"></script> <script src="node_modules/jquery-captcha/dist/jquery-captcha.min.js"></script> و هنا تقوم بعمل تصديق على صحة الأدخال كالتالي // إنشاء نسخة captcha للواجهة الأمامية في معالج الأحداث DOM. // وقم بتعيين خاصية captchaEndpoint للإشارة إلى // مسار نقطة نهاية اختبار captcha على الواجهة الخلفية لتطبيقك var captcha = $('#botdetect-captcha').captcha({ captchaEndpoint: 'simple-captcha-endpoint.ashx' }); $('#contactForm').submit(function (event) { if (isNameValid && isEmailValid && isSubjectValid && isMessageValid) { // الحصول على قيمة كود // captcha التي أدخلها المستخدم ليتم التحقق من صحتها في الجانب الخلفي var userEnteredCaptchaCode = captcha.getUserEnteredCaptchaCode(); // الحصول على معرف مثيل captcha الذي حاول المستخدم حله var captchaId = captcha.getCaptchaId(); var postData = { name: $('#name').val(), email: $('#email').val(), subject: $('#subject').val(), message: $('#message').val(), userEnteredCaptchaCode: userEnteredCaptchaCode, captchaId: captchaId }; ..... ..... /// هنا تقوم بعملية ‘إرسال البيانات أو أي عملية تحتاجها } و هنالك طريقة أخرى و هي عيارة عن خلق canvas و رسم أحرف بطريقة عشوائية و تتمكن من خلالها أن تحدد المدخلات التي تريدها كالتالي : // يتم استخدام document.querySelector () لتحديد عنصر من المستند باستخدام المعرف الخاص به let captchaText = document.querySelector('#captcha'); var ctx = captchaText.getContext("2d"); ctx.font = "30px Roboto"; ctx.fillStyle = "#08e5ff"; let userText = document.querySelector('#textBox'); let submitButton = document.querySelector('#submitButton'); let output = document.querySelector('#output'); // يحتوي alphaNums على الأحرف التي تريد إنشاء CAPTCHA بها let alphaNums = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; let emptyArr = []; // تولد هذه الحلقة سلسلة عشوائية من 7 أحرف باستخدام alphaNums // علاوة على ذلك ، يتم عرض هذه السلسلة على أنها CAPTCHA for (let i = 1; i <= 7; i++) { emptyArr.push(alphaNums[Math.floor(Math.random() * alphaNums.length)]); } var c = emptyArr.join(''); //هنا تقوم برسم الcanvas // و يحتوي على الاحر المرادة ctx.fillText(emptyArr.join(''),captchaText.width/4, captchaText.height/2); // هنا دالة تقوم بعمل النصديق على ال البانات المدخلة submitButton.addEventListener('click', function() { // هنا نقوم بالمقارنة بين القيمة المدخلة و القيمة التي تم عرضها و على أساسها نخبر المستحدم أن كانت صحيحة أم لا if (userText.value === c) { output.classList.add("correctCaptcha"); output.innerHTML = "Correct!"; } else { output.classList.add("incorrectCaptcha"); output.innerHTML = "Incorrect, please try again"; } });
  2. أنت تستخدم الPHP و أختلاف طريقة كتابة الكود لا يختلف بأستعماله لكل لغة طريقة معينىة بتطبيق نفس الكود ما ارسلته انا هو بال Javascript , nodeJs لكن المهم أن الطريقة المستخدمة تخدمك فقط لأستدعاء بيانات من السيرفير و ليس لأرسال أو تعديل البينات بالسيرفير وإن أحتجت لتعديل أو أرسال بيانات ستحتاج الى أستعمال http Request. أستخدام الSSE هو لتقليل الثقل على السيرفر كما ذكرنا و هذا ما انت تريده
  3. // هكذا يتم تعريف الSSE // من جهة السيرفير لاحظ أنه لا يستقبل أي داتا و ضمنيا فقط يستقبل رقم المستخدم و أسم الأيفينت // هنا تعريف الEventHandler // لل SSE function eventsHandler(request, response, next) { const headers = { 'Content-Type': 'text/event-stream', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache' }; response.writeHead(200, headers); const data = `data: ${JSON.stringify(facts)}\n\n`; response.write(data); const clientId = Date.now(); // هنا نقوم بإعطاء المستخدم ID // و يتم المصادقة فقط مره واحدة const newClient = { id: clientId, response }; clients.push(newClient); request.on('close', () => { console.log(`${clientId} Connection closed`); clients = clients.filter(client => client.id !== clientId); }); } // و هنا نستخدم أسم ال EVENTHANDLER // الذي نريد تنفيدذه app.get('/events', eventsHandler); و من جهة المستخدم يقوم بإستدعاء الدالة مرارا و تكرار حسب إسم الروات التي تقوم بأستدعاء الSSE eventHandler
  4. نظام الSSE ليس لتعديل البيانات و بعث بيانات يعتبر نظام الSSE مثال على إرسال البيانات من إتجاه واحد فقط من ناحية الServer فقط لذلك لا يمكنك إرسال أي معلومات الى السيرفير سوى للقيام بعمل HandChaking أي خلق أتصال بين السيرفر و التطبيق مثال على أستعمال هذه الطريقة هي Notification أي جلب أي معلومات يتم تحديثها بأستمرار . نظام الSEE يشبه كثيرا ال WebSocket الا أن WebSockets تختلف بحيث أنها ترسل و تستقبل معلومات من و إالى السيرفر أما الSSE فقط يرسل من السيرفير الى التطبيق و أن أرسلت معلومات زائدة عن رقم ال CLIENT أو إسم الEVENT .. الخ, فسوف يتم تجاهلها عملية إرسال المعلومات من السيرفير الى التطبيق عدة مرات لن يقوم بغلق السيرفير و لن يكون تدفق المعلومات عبئ على الشبكة بحيث أنه لن يتم إرسال المعلومات من السيرفير الى المتصفح أو الهاتف بشكل مستمر بالرغم من أن الأتصال يبقى مفتوح بحيث أولا لا يوجد أرسال سوى بأتجاه واحد فقط كما أن عملية التصافح HandChacking تحدث مرة واحدة فقط و أيضا الأتصال ممكن أن يتم أيقافه مؤقتا إن لم يكن المستخدم active لذلك لن يكون هناك تاثير كبير على عمل السيرفير أن كان هنالك الألاف من الستخدمين و لهذه المشكلة تم تصميم هذه النظام
  5. type hints هي طريقة لأعطاء البايثون دلالة للقيمة الراجعة أو حتى الأصناق على القيمة المحتملة التيى تقوم ببناءها و هي طرdقة جيدة لمساعدة ال type checkers للبايثون بحيث أنه بهذه الطريقة يقوم بمعرفة ماذا يجب أن تمرر أو أن ترجع و من هنا يستطيع ال type checkers بسهولة أن يخمن إن كنت تقوم بإرسال صنف غير متوقع و مثال على هذا الموضوع التالي : def headline(text, align=True): if align: return f"{text.title()}\n{'-' * len(text)}" else: return f" {text.title()} ".center(50, "o") print(headline("python type checking")) print(headline("python type checking", align=False)) #--------------- أضف الآن تلميحات الكتابة عن طريق التعليق على الوسيطات وقيمة الإرجاع على النحو التالي: def headline(text: str, align: bool = True) -> str:# هنا نقوم بتحديد الصنف للقيمة الراجعة لتسهيل عملية التحمين if align: return f"{text.title()}\n{'-' * len(text)}" else: return f" {text.title()} ".center(50, "o") print(headline("python type checking", align="left")) print(headline("python type checking", align="center"))
  6. تعتبر write, writefile من الدوال low-level access أي هي وسيلة سريعة لكتابة بعض المعلومات على ملف و لكن الفرق بين write , writeFile هو أن writeFile تقوم بفتح و كتابة و أغلاق الملف دون الحاجة الى أستعمال أي أمر أخر أما write فلا تقوم بأغلاق الملف و عليك أغلاقة أما بالنسبة لل fs.createWriteStream بالمقارنة مع السابقات فهي من الدوال الأعلى قدرة على الحفظ بطريقة دقيقة حيث أنها تفتح مجرى stream ليقوم بتدفق المعلومات من الى الملف بشكل طوابير queues و بهذه الطريقة فأن هذه الطريقة تتيح لك كتابة ملفات بحجم أكبر و أدق من الدوال السابقة حيث أن write, weiteFile ليسو عمليين حينما تقوم بكتابة ملفات كبيرة الحجم
  7. ما عليك سوى جعل الماركر Draggable كالتالي var marker = new google.maps.Marker({ position: myLatlng, map: map, draggable:true, title:"Drag me!" }); و من هنا يمكنك أضافة EventListener للعلامة يقوم مثلا بطباعة القيمة كالتالي marker.addListener('dragged', printMarkerLocation); function printMarkerLocation(){ console.log('Lat: ' + marker.position.lat() + ' Lng:' + marker.position.lng() );}
  8. البدائل تكمن بأستعمال Clouds مثلا S3 AWS, Firestore ,googlecloud و أماكن تخزين كثيرة و لها API's خاصة بها و كيفية إستعمالها و لكن إن كان السيرفير الذي تقوم بتحميل الملفات اليه يمكنك من تحميل حجم لا بأس به من الصور و الفيديو فيمكنك الإستغناء عن هذه ال API's
  9. أولا عملية معالجة الأخطاء تحتاج الى تنفيذ أمور معينة على قاعدة البيانات بحيث أنه لن يتبين لك ما هية الأخطاء سوي عندما تقوم بعملية ادخال أو تعديل أو حذف هنا يتبين لك ما الحاطاء التي تحدث بكل الأحوال عند القيام بعمل دالة تقوم بإدخال بيان الى قاعدة البيانات فمن المهم دائما القيام بعمل try ... catch مثال على ذلك مايلي // هنا نقووم بتعريف الدالة التي تقوم بإدخال البيان function InsertData(doc, cd /* هذه دالة أخرى نقوم بتمريرها و أحذ الناتج منها سواؤ كانت خطأ أو الأدخال تم بشكل صحيح*/){ try { collection.Insert(doc); // هنا نقوم بأستعمال إسم الدالة التي قمنا بتمريرها و تمرير أن النتيجة صحيحية cd({result:"Done"},null) } catch (MongoWriteConcernException ex) { if (ex.Code == 11000) //هنا يمكنك أن تقوم بعمل exception //throw new YourConflictException("User already exists for username and/or email"); // أو بأرسال الخطأعن طريق الدالة كالتالي cd(null,{error:"MongoWriteConcernException") else // throw ex; cd(null,{error:"Other Exceptions") } } // و هنا الدالة نستخدمها مثلا بال Controllers // بالشكل النالي InsertData(doc, function(data, error){ // طبعا هنا يمكنك أن تحدد نوع ال statuse if(error) res.send(error) // طبعا هنا يمكنك أن تحدد نوع ال statuse res.send(data) })
  10. إستعملت نفس الطريقة و لا يوجد بها أي ضرر خصوصا أن الرئاكت يستعمل virtual Dom أي أنه لا يقوم بإرسال الصفحة كامله بل يرسل التغييرات و يتم أستقبالها و تعديل هذه التغييرات بشجرة الdom
  11. على الأغلب طريقة إرسال FormData خاطئة عند أرسال صورة عن طريق ال Formdata عليك تحديد ContantTypr ب 'multipart/form-data' الرجاء محاول إرسال المعلومات بالطريقة التالية بدلا مما سبق var formData = new FormData(); formData.append('profileImg', this.state.profileImg, this.state.title) console.log(formData); axios({ method: "post", url: "/api/posts", data: formData, headers: { "Content-Type": "multipart/form-data" }, }) .then(function (response) { //handle success console.log(response); }) .catch(function (response) { //handle error console.log(response); });
  12. يمكنك إستخدام Regular Expressions بحيث تجد جميع الأحرف كمصفوفة و من ثم تقوم بتحويل هذه المصفوفة الى string و بطريقة سلهة جدا كالتالي import re word1 = " ".join(re.findall("[a-zA-Z]+", st)) و إن أردت أيضا الأرقام فيمكنك إضافة 0-9 داخل الأقواس فيتم جلب الأرقام أيضا
  13. من المعروف أن أي دالة تصف ب statice تكون تنتمي للصنف و ليس لاوبجت من ذلك الصنف بما معناه إننا نستطيع إستدعاء الدالة فقط بكتابة إسم الصنف دون عمل instance منه أي خلق أوبجت كالتالي class A(object): def foo(self, x): print(f"executing foo({self}, {x})") @classmethod def class_foo(cls, x): print(f"executing class_foo({cls}, {x})") @staticmethod def static_foo(x): print(f"executing static_foo({x})") #هنا نقوم بخلق أوبجكت أو وحده من هذا الصنف a = A() #يمكننا هنا أستدعاء الclassmethod #بهذه الطريقة فقط a.class_foo(1) # static_fooأما ال #فهي تنتمي فقط للكلاس و ليس للأوبجت لذلك يتم أستدعائها من عن طريق إسم الكلاس #كالتالي A.static_foo('hi') كما أن الclassmethod تمكنك من تغيير الجالة للأوبجكت الstaticmethod لا تستطيع بها أنم تقوم بتغيير أي حالة و ليس لها علم بأي معلومات عن الأوبجكت و كما نرى classmethos تاخذ cls كمتغير يمرر اليها و يجب تمريره أما الstaticmethod فليس شرط أن تأخذ أي متغير
  14. هنا مثال صغير لحفظ المعلومات داخل ال shredprefrences طبعا الحال state تكون عن طريق ال blocs , redux و كثير من مكتبات تنظيم الأحوال //هنا نقوم بحفظ الحال الى الجهاز ك file void saveToPrefs(AppState state) async { // نستدعي الshredprefrrences SharedPreferences preferences = await SharedPreferences.getInstance(); // ناخذ قيمة الحال بعد تحويلها و نقوم بتخزينها بالملف var string = json.encode(state.toJson()); writeFile(string); // و هنا نقوم بحفظ المعلومات داخل ال sharedprefrences await preferences.setString('AlbumsState', string); }
  15. يمكنك استخدام litsql يتم تحميلها بنفس التطبيق او خفظه كملف json يتم حفظه ب SharedRefrences و عند طلب المعلومات يمكنك الأستعانة بهذا الملف أو ال litsql و استخراج البيانات منها
×
×
  • أضف...