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

شرف الدين حفني

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

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

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

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

    2

كل منشورات العضو شرف الدين حفني

  1. ﻻ حاجة لكتابة جملة check يكفي فقط تحديد الroom.guest_ssn ك foreign key حتى نضمن وجود نزيل بهذا المُعرف
  2. بما أن النزيل يمكنه حجز العديد من الغرف ولكن على الجانب الأخر لا يمكن للغرفة أن يتم حجزها من قِبل أكثر من نزيل فهذا يعني أن يوجد علاقة واحد إلى كثير (one-to-many) بين النزيل والغرفة لتحقيق تلك العلاقة يمكننا ببساطة أن نجعل جدول الغرفة يحتوي على الid الخاص بالنزيل كforeign key مما يؤدي للسماح بوجود أكثر من صف في جدول الغرف يحتوي كلًا منهم على المُعرف الخاص بالنزيل وبالتالي يتم إعتبارهم مملوكين لنفس النزيل ويمكنك فهم الموضوع أيضًا عبر قراءة المقالة التالية
  3. قم بفتح المشروع ومن ثم الضغط على كلمة more ومن ثم إختيار view logs كما يظهر في الصورة
  4. هذا الخطأ لا أعتقد أنه كامل, برجاء فتح الlogs الخاصة بالمشروع ومن ثم الضغط على كلمة restary all dynos ومن ثم القيام بإعادة طلب ال/api/v1/users مرة أخرى وإرسال الlogs كاملةً وشكرًا
  5. ما الخطأ الذي يأتيك عندما تقوم بتنفيذ الجملة على هيروكو؟
  6. بالإضافة إلى إجابة سامح إن كنت تستخدم flask_restful يمكنك تحقيق الغرض عبر تحويل الصورة إلى تشفير base64 ومن ثم إرجاع التشفير في رد الjson ويمكن تحقيق ذلك عبر التالي قراءة ملف الصورة وتحويله إلى تشفير base64 with open("image.jpg", "rb") as image_file: data = base64.b64encode(image_file.read()) إرجاع التشفير return {"data":data}
  7. كما تلاحظ عندما نقوم بإدخال مُعرف غير موجود لا نقوم بإرجاع قيمة null للمُستخدم بل بدلًا من ذلك نقوم بإرجاع الNullPerson وهو عبارة عن كائن من نوع person ولكن له خصائص معينة مثل أن إسمه guest يُستخدم هذا النمط عند التعامل مع مصدر للبيانات مثل قاعدة بيانات ويوجد لدينا إحتمالية رجوع قيمة بnull فنستخدم ذلك النمط لنتفادى الأخطاء التي قد تنتج من التعامل مع قيمة بnull constructor(id,name) { this.id = id this.name = name; } } // Null person wrapper class NullPerson { constructor() { this.id = null this.name = 'Guest'; } } const persons = [ new Person(1, "sharaf"), new Person(2, "ashraf") ] function findPerson(id) { const person = persons.find(person => person.id === id) if (person) return person else return new NullPerson() } let personOne = findPerson(1) console.log("Welcome, " + personOne.name) let personTwo = findPerson(99) console.log("Welcome, " + personTwo.name)
  8. ستلاحظ في الملفات المرفقة إنشاء ملف الجافاسكريبت وكيف يتم إرسال البيانات من بين الملفات drive-download-20211214T123328Z-001.zip
  9. الdesign patterns أو (أنماط التصميم) هي عبارة عن نمط أو نموذج يُستخدم لحل مشكلة ما شائعة, على سبيل المثال إن كان لدينا صنف يُسمى duck ولدى هذا الصنف تصرفين أو دالتين أساسيين هما fly و quack وكان لدينا أنواع من البط فبالتالي سنجعلهم يرثون من الصنف duck, ولكن ماذا إن كان لكل نوع من البطducks طريقة مختلفة للطيران fly وإصدار الصوت quack فبالتالي ماذا يمكننا أن نفعل؟ إما أن نقوم بعمل implementation للدالتين fly & quack بداخل كل صنف من الأصناف والذي سيكون أمرُ مرهق وسينشئ إحتمالية أكبر لحدوث الأخطاء البرمجية ويوجد حل أخر وهو إستخدام النمط strategy design pattern والذي في تلك الحالة أو الموقف يخبرنا أن نقوم بعمل أصناف لأنواع الطيران وإصدار الصوت المختلفة, على سبيل المثال FlyWithWings, FlyWithWings ونجعلهم جميعا يرثون من واجهة interface مشتركة ولنسميها الأن flying, ومن ثم نقوم بإعطاء أصناف البط المختلف خاصية تعبر عن سلوك الطيران flyTechnique ونجعلها من نوع نفس الواجهة التي أنشئناها من قليل flying ومن ثم نقوم بعمل الدالة setFlyTechnique, ونقوم بتكرار الخطوات السابقة مع دالة إصدار الصوت, بهذه الطريقة قمنا بفصل الخواص التي تتغير ووضعناها في أصناف خاصة بها وبالتالي لا يهمنا متى تمت إضافة أو إزالة نوع جديد من البط أو الطيران أو الصوت حيث أننا قمنا بعزل كلٍ منهم عن الأخر
  10. مرحبًا, هل يمكنك إرسال مجلد المشروع بشكلٍ مضغوط؟
  11. من الممكن نقل البيانات عبر الصفحات بإستخدام ال session storage وهي عبارة عن مساحة تخزينية للمتصفح خاصة بكل نافذة فيمكنك إذًا إضافة حدث click على زر السعر يكون كالأتي const product={ name:"اسم المنتج", price:"سعر المنتح" } purchase_btn = document.querySelector('#اكتب هنا المُعرف الخاص بالزر') purchase_btn.addEventListener('click',()=>localStorage.set('product', JSON.stringify(product)) window.location.href = "مسار الصفحة المُراد التحويل لها"; ومن ثم يمكن إستقبال البيانات في الصفحة الأخرى عبر الدالة localStorage.get const product = JSON.parse(localStorage.getItem("product")) ها قد اصبح لديك المنتج في الصفحة الأخرى ويمكنك إظهار رسالة شكر لك على ثقتك بنا سيتم معالجة طلبك خلال 3 أيام عبر الدالة alert كما بالشكل التالي alert(" شكر لك على ثقتك بنا سيتم معالجة طلبك خلال 3 أيام ")
  12. يمكنك إستخدام الدالة alert, حيث تقوم تلك الدالة بأخذ مُعامل ومن ثوم يتم إظهار نافذة منبثقة على الشاشة تحمل الرسالة التي تم تمريرها للدالة, ويمكنك إستغلالها في الشفرة لديك بشكلٍ مماثل للتالي <button id="alert" onclick="alert('لقد تم الحجز بنجاح')"> book a session </button> كما تُلاحظ قد أضفنا الخاصية onclick للزر والتي تحدد ما يجب على الزر فعله عند الضغط عليه من قبل المُستخدم, ومن ثم يتم تنفيذ الدالة alert والتي تقوم بإظهار الرسالة إلى المستخدم
  13. هذا لأن عند استخدام الخطاف(hook ) الخاص بالدالة updateOne تكون this تشير إلى الإستعلامة وليس إلى الوثيقة, للحصول على الوثيقة يمكنك الإستعلام عنها بواسطة كائن الإستعلام الذي يتم تمريره كما في الشفرة التالية userSchema.pre('updateOne',async function(){ const docToBeUpdated = await this.model.findOne(this.getQuery()); } حيث أن التابع model يُمثل الmodel الذي نحصل عليه بإستخدام mongoose.model ولكن بما أننا لا يمكننا إستخدام الmongoose.model قبل إنشاء الخطاف فبالتالي نقوم بالحصول عليه عبر الشفرة السابقة
  14. إن كنت تستخدم flask_restfull يمكنك إستدعاء التابع reqparse from flask_restful import reqparse ومن ثم تقوم بإنشاء كائن من خلال هذا الparser تضع فيه البيانات التي تريد استقبالها من الbody user_args = reqparse.RequestParser() user_args.add_argument("name", type=str, help="name") user_args.add_argument("email", type=str, help="email") ومن ثم تأتي في دالة الget أو الpost وتقم بإستقبال الجسم عبر الشفرة التالية args = user_args.parse_args()
  15. تلك المواقع إن حاولت ترجمتها عبر جوجل سيتم ترجمتها ترجمة حرفية مما يؤدي إلى غموض في كثير من الكلمات, لذلك من الأفضل محاولة تعلم اللغة الإنجليزية وترجمة فقط الكلمات التي تواجه صعوبة بها ولكن ليس ترجمة الموضوع كله, أو يمكنك محاولة التعلم عبر أحد المصادر العربية مثل دورات أكاديمية حسوب أو موسوعة حسوب التي تُعد أحد أكبر المراجع والتوثيقات العربية موسوعة حسوب
  16. قبل الإجابة على هذا السؤال نحتاج أن نفهم أولًا بعض الأشياء عن الشبكات: كل جهاز راوتر(router) يقوم بالإتصال على شبكة الإنترنت عبر رقم يُسمى ip address (عنوان بروتوكول الإنترنت) وهو رقم فريد يُعبر عن كل جهاز متصل بالإنترنت, ماذا يحدث عندما نقوم برفع موقع على الإنترنت؟ ما يحدث هو أن ذلك الجهاز بالفعل يحتوي على رقم عنوان لبروتوكول الإنترنت (ip address) ولكن عندما تقوم بالولوج إليه من خلال المتصفح يتم إستبدال ذلك الرقم بإسم حتى يصبح معبرًا وسهل قرائته وكتابته من قِبل الإنسان فعلى سبيل المثال يتم ترجمة العنوان 102.132.97.35 إلى facebook.com حسنًا, كيف يعلم جهاز الحاسب الذي يعمل كخادم (server) البرنامج الذي يتم الولوج إليه؟ فكما لاحظت أن الجهاز يأخذ ip address ولكن هذا الجهاز بالتأكيد يحتوي على العديد من الملفات والبرامج كيف يستطيع التحديد أي برنامج فيهما سيستقبل الطلب ؟ هنا يأتي دور الport number أو رقم المنفذ, حيث يتم تحديد البرنامج او البروتوكول المتبع من خلال المنفذ, فعلى سبيل المثال إن قمت بتشغيل قاعدة بيانات mysql وتطبيق flask وتطبيق react يعمل على node js , بما أنهم جميعًا يعملون بشكل محلي فسيكون الip address لهم هو 127.0.0.1 والتي يتم ترجمتها إلى localhost , فكيف يمكنك تحديد أي تطبيق منهم تريد الولوج إليه؟ الإجابة هي بالمنفذ, تقوم بإعطاء كل تطبيق منفذ معين فتقوم بالولوج إلى فلاسك مثلًا من خلال localhost:5000 والولوج إلى mysql من خلال localhost:3306 فبالتالي لا يمكن تشغيل التطبيق بدون رقم منفذ
  17. برجاء عمل export لقاعدة البيانات ومن ثم إرفاقها في تعليق حتى أتمكن من معاينتها
  18. لا يوجد تعارض بين إستخدام next js و express js ماهو next js هو عبارة عن إطار عمل من أجل إنشاء تطبيقات ويب بال react js تكون تدعم الserver-side renering, و الstatic site generation حيث في العادي عند الدخول على تطبيق مبني بواسطة react يقوم الخادم بإرسال ملفات الجافاسكريبت إلى العميل ومن ثم يقوم العميل بتشغيلها من قِبل المتصفح وذلك ما يدعى بالclient side rendering وذلك له بعض العيوب مثل أنه بطئ نسبيًا كما أنه ليس جيدًا من أجل الseo حيث لا يفهم محرك البحث أكواد الجافاسكريبت تلك بالإضافة إلى إمكانية برمجة الصفحات بتقنية الstatic site generation والتي تعني أن الصفحات يتم إنشاؤها في الbuild time(وقت بناء المشروع ) فعندما يقوم المستخدم بطلبها تأتي جاهزة لا يتم تجهيزها من البداية, وهذا يجعل الأداء فائق السرعة, يمكنك أيضًا بناء الapi وتطوير الواجهات الخلفية بواسطتها ماهي express js إطار عمل من قِبل node js يتم إستخدامه لبرمجة الواجهات الخلفية back-end وإنشاء الAPI , إذًا السؤال هل تقوم بإستخدام next js + express js أم تستخدم next js فقط؟ لا يوجد إجابة مثالية حيث تلك مسئلة تفضيل express js مشهورة أكثر ولها مجتمع أكبر كما أن عند إستخدام الnext js من أجل الباك اند سيجعل كلًا من الواجهة الخلفية والأمامية في نفس التطبيق مما يعني عند إعادة عمل deployment إلى أحدهم ستضطر إلى عمل deployment للأخر بينما next js لها ميزة أنك ستقوم ببرمجة كل شئ في نفس التطبيق
  19. يمكنك تحقيق ذلك عن طريق الأتي يوجد بلغة sql كلمة order by التي تقوم بتحديد ترتيب البيانات في الشفرة خاصتك يتم ترتيب السجلات تصاعديًا بناءًا على قيمة الid يمكننا عكس ذلك عبر إضافة تلك الشفرة في نهاية الsql حتى يتم ترتيب العناصر بالشكل المعاكس order by id desc لتصبح في النهاية شفرة الsql كالتالي SELECT n.*, a.* FROM `news` as n inner join accounts as a WHERE a.id = n.writer_id AND a.admin_type ='".$admin_type."' order by id desc LIMIT $offset, $no_of_records_per_page
  20. يمكنك رفع الصور باستخدام react js و firebase باتباع الخطوات التالية تثبيتfire base عبر الامر التالي npm i firebase استيراد الmodule(الوحدة) الخاصة بربط مشروع الفاير بيز initializeApp import { initializeApp } from "firebase/app"; تثبيت كلاً من الوحدات getStorage المسؤلة عن ربط مشروعك بالمساحة التخزينية الخاصة بالفايربيز , ref المسؤلة عن الإشارة إلى المجلدات والمسارات في مساحتك التخزينية, و uploadBytes المسؤلة عن رفع الملفات إلى المساحة التخزينية import {getStorage, ref, uploadBytes} from "firebase/storage"; الإعلان عن كائن الfirebaseConfig الذي يوجد به معلومات الوصول إلى مشروع الفايربيز الخاص بك ويمكنك إيجاده عبر الدخول إلى خانة الproject settings في مشروع الفايربيز الخاص بك ويكون منظره مقارب للشكل التالي const firebaseConfig = { apiKey: "xxxxxxxxxxxxxx", authDomain: "xxxxxxxxxxxxx", databaseURL: "xxxxxxxxxxxxx", projectId: "xxxxxxxxxxxxxx", storageBucket: "xxxxxxxxxxxxxxxxxxx", messagingSenderId: "xxxxxxxxxxxxxxxx", appId: "1:618307687043:"xxxxxxxxxxxxxxx", measurementId: "xxxxxxxxxxx" }; بالطبع مع إستبدال الx بالمعلومات السرية الخاصة بك التي ستجدها في خانة الproject settings تهيئة التطبيق عبر const app = initializeApp(firebaseConfig); تهيئة التعامل مع المساحة التخزينية const storage = getStorage(app); تهيئة المسار للملفات const imagesRef = ref(storage,"/images/") هنيئًا لك يمكنك الأن رفع الملفات عن طريق الشفرة التالية uploadBytes(imagesRef, image) .then(snapshot=>getDownloadURL(snapshot.ref) .then(async(url)=>callback) المتغير image يجب أن يحمل الصورة التي يقوم المستخدم برفعها , وبمجرد كتابة السطر الاول uploadBytes(imageRef,image) يكون قد تم رفع الصورة, وبالنسبة للدالة getDownloadURL فهي مسؤلة عن جلب الرابط الخاص بتحميل الصورة حتى تقوم برفقها في قاعدة البيانات لتستطيع عرضها للمستخدم بعد ذلك, ولأن تلك الدالة هي دالة async يتم بعدها كتابة .then ومن ثم تقوم بكتابة الإجراء المُراد إتخاذه مع رابط التحميل(مثل إرساله للnode js api مثلًا بغرض إرفاقه في قاعدة البيانات) بالتوفيق
  21. إفتح الterminal بداخل مجلد المشروع قم بتنفيذ الأمر $ git init -b main قم بعد ذلك بإضافة الملفات إلى المستوعد عبر الأوامر التالية git add . git commit -m "first commit" ومن ثم قم بربط المستودع المحلي بمستودع الgithub $ git remote add origin <رابط المشروع على جيتهاب> قم بعمل push للمستودع git push origin main
  22. الIR (Instruction registry) هو registry مسؤل عن تخزين الأمر الذي يتم تخزينه في الوقت الحالي MBR/MDR كلاهما يعبان عن نفس الشئ وهو الregistry الخاص بالمُوصل(bus) المربوط بالذاكرة وتنتقل البيانات من خلاله, ويتم تسجيل أي بيانات تنتقل من الذاكرة إلى ذلك الregister ستجد تشابه بين الMDR/MBR وبين الIR ربما لأنك في كثيرٍ من الأحيان تلاحظ تواجد نفس البيانات في الMBR وال IR في نفس الوقت, ولكن في الحقيقة هذا خاطئ, ما يحدث أن أي بيانات تنتقل من الذاكرة سواء كانت معلومات أو أوامر يتم تخزينها في الMBR أولًا ومن ثم تحدد الMBR إن كانت البيانات عبارة عن أوامر يتم تمريرها إلى الIR , إن لم تكن أوامر لا يتم تخزينها في الIR فمثلًا إن أخذنا المنظر التالي مثالًا MEMORY 300 3940 301 5941 .... .... .... 940 0002 941 0003 يتم تنفيذ أول أمر , سنعتبر أن الرمز 3 يعبر عن أمر تخزين القيمة في الAC , فما سيحدث هو أن الIR سيقوم بتخزين 3940 والMBR سيقوم بتخزين ال3940 ومن ثم سيقوم ال MBR بتخزين ال0002 ولكن الIR لكن يقوم بتخزينها لأنها بيانات وليس أمر وفي العنوان 301 نجد التعليمة 5941 والتي تعبر عن جمع الAC مع العنوان 941 سيتم تخزين ال5941 في كلاً من الIR وال MBR ومن ثم يقوم الMBR بجلب البينات من 941 والتي هي 0003 ووقتها لن يتم تخزينها في الIR لأنها ليست أوامر وإنما بيانات الملخص: الIR يستخدم لتخزين الأوامر فقط, الMBR/MDR يرمزان لنفس الشئ ويستخدمان لتنفيذ أي بيانات(سواء أوامر او معلومات)
  23. دالة socket.handshake.address تقوم بإرجاع العنوان من الإصدار السادس ip6 وليس الرابع ip4 لهذا يبدو شكله غريبًا عليك, وفي الإصدار السادس عندما يكون هناك مجموعة من الأصفار يتم إختصارها بالعلامة :: لذا فإن العنوان الذي يرجع لك يمكن ترجمته إلى الشكل التالي 0000:0000:0000:0000:0000:0000:0000:0001 والذي يوازي في الإصدار الرابع العنوان 127.0.0.1 والذي هو عنوان الكمبيوتر المحلي localhost
  24. تلك المشكلة تحدث بسبب أن المتصفح لديك يقوم بإعتبار الموقع أنه غير أمن, يمكنك حل المشكلة عبر فتح المتصفح في الهاتف والذهاب إلى الرابط التالي chrome://flags/#unsafely-treat-insecure-origin-as-secure ومن ثم تقوم بكتابة رابط التطبيق في مربع الInsecure origins treated as esecure ومن ثم الضغط على كلمة default وتحويلها إلى enable ثم تقوم بإعادة تشغيل المتصفح ليعمل معك بسلام
  25. يمكنك التأكد من ذلك عبر إستخدام الregex عن طريق الدالة regex_replace التي تقوم بأخذ مُعاملات كالتالي النص المُراد تطبيق النمط عليه النمط النص الذي سيتم إستبداله بدلًا من النمط وتقوم بإرجاع النص الجديد, فيمكنك تنفيذ الدالة على النص الموجود لديك وتعطي في النص المُستبدِل قيمة فارغة أي يتم حذفه, ومن ثم مقارنة طول النص الجديد بالنص القديم, إن تغير الطول هذا يعني أنهم لم يُصبحو نفس النص, أي أن الكلمة موجودة , ويمكن تطبيق ذلك عبر الشفرة البرمجية التالية string a = "hello world"; string b = "hello"; regex re(b); string c = regex_replace(a,re,""); if(c.length()<a.length()) cout<<"true"; else cout<<"false"
×
×
  • أضف...