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

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

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

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

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

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

    2

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

  1. يمكنك الضغط بزر الفأرة الأيمن على البرنامج من الأعلى وإختيار menu bar كما يتضح في الصورة المُرفقة بعد ذلك سيظهر لك الشريط بالأعلى مجددًا , يمكنك حينها الضغط على veiw وإختيار Appearence ومن ثم إختيار Activity bar كما هو موضح في الصورة التالية
  2. يمكنك تنفيذ النصائح التي اخبرك بها الأستاذ بلال, بالاضافة الى انك يمكنك استخدام هياكل بيانات افضل من تخزين الاسماء والارقام على هيئة مصفوفتين, على سبيل المثال, يمكنك إنشاء object ويكون الkey للobject هو الاسم والvalue هي رقم الهاتف او العكس, سيحسن ذلك من الكود خاصتك بشكلٍ أفضل
  3. مرحبًا محمد , في الحقيقة عادةً لا يتم عمل تلك المميزات من الصفر, بل يتم استخدام احد الخوادم والapis التي تساعد على مثل تلك المميزات, ومن اشهر الحلول هو استخدام twilio , وهو عبارة عن خدمة لتسهيل ارسال الرسائل عبر الواتساب او الsms ويمكنك البدأ باستخدامه عبر الذهاب الى موقعهم والقراءة عنه من هنا
  4. في حالة المشاريع الحقيقية يتم رفع mongodb على إستضافة بدلًا من الlocalhost على جهازك حتى يمكن الوصول اليها من خلال الip الخاص بالاستضافة, ويوجد العديد من الحلول لرفع mongodb على استضافة مثل: أن يتم تثبيت mongodb على نفس سيرفر الاستضافة الموجود عليه الbackend ومن ثم يتصل الباك اند بالmongodb وكانها localhost بما انها على نفس السيرفر والباك اند نفسه يتم الاتصال به من الخارج عبر ip السيرفر ان يتم تثبيت mongodb على احد الخدمات المخصصة لذلك مثل خدمة mongodb atlas والتي تساعدك على انشاء قاعدة بيانات mongodb وتعطيك رابط للوصول اليها من اي مكان حتى تصبح جاهزة للمشاريع الحقيقية
  5. رسالة الخطأ تخبرك بأن في السطر رقم 19 في كود الجافاسكريبت تحاول استخدام متغير باسم Mike وهذا المتغير غير موجود, يُرجى مسح السطر رقم 19 الذي يستخدم المتغير او تعريف المتغير, وإن كنت تعتقد بأن الكود سليم يُرجى إرفاق الكود كاملًا حتى نتمكن من معاينته بشكلٍ أفضل
  6. محمود يمكنك وضع الكود في تعليق بدلًا من ارفاق الملفات وكتابة ما المشكلة التي واجهتك بالظبط حتى نتمكن من مساعدتك بشكلٍ جيد
  7. دورة cs50 هي دورة اكاديمية بعض الشئ بمعنى أنها تعتبر مقدمة لدراسة علوم الحاسب حيث يتم دراسة مقدمة للتعامل مع الذاكرة ومقدمة للتعامل مع اللغات التي تحتوي على ادارة للذاكرة مثل c, c++ وتعطي مقدمة للأسيمبلي والخوارزميات وهياكل البيانات الخ, فكما يتضح الغرض من الدورة ان يكون لديك خلفية عن افرع الحاسوب حتى تتمكن من الاستمرار في الدراسة الاكاديمية, بينما دورة علوم الحاسوب المقدمة من أكاديمية حسوب متشابهة بعض الشئ حيث تقدم لك مقدمة للمواضيع الاساسية في علوم الحاسب أيضًا مثل هياكل البيانات والخوارزميات وانظمة التشغيل وقواعد البيانات الخ, ولكنها ليست موجهة للسلك الاكاديمي بنفس درجة cs50 وإنما موجهة لتفهم المفاهيم الهامة لعلوم الحاسب وتتمكن بعدها من اختيار المسار الذي تود العمل به دون مشاكل حيث تبني لك الدورة الأساس البرمجي وتعودك على التفكير البرمجي لتتمكن بعدها من دراسة مختلف المسارات التي تؤهلك لسوق العمل بالنسبة إلى هياكل البيانات فإن دورة علوم الحاسب المقدمة من أكاديمية حسوب تحتوي على دروس خاصة بالخوارزميات وهياكل البيانات بعنوان"الخوارزميات وبنى المعطيات"
  8. كلاس RandomAccessFile يتم استخدامه لقراءة وكتابة الملفات , وعادة يتم استخدامه في الملفات الكبيرة نسبيًا, حيث باقي الكلاسات الخاصة بالتعامل مع الملفات في جافا مثل FileReader و FileWriter تقوم بقراءة الملف بشكل متسلسل, على سبيل المثال ان كان الملف طوله 100 بايت واردنا قراءة الملف من بداية البايت رقم 30 يجب ان يمر الكلاس على الملف بدايةً من البايت رقم 0 حتى يصل الى البايت المطلوب, ونفس الحال أيضًا في حالة الكتابة يقوم الكلاس FileWriter بالمرور على الملف من البايت 0 حتى البايت الذي نريد الكتابة فيه وبالطبع ان كان حجم الملف كبير يؤدي هذا الى بطئ في عملية القراءة والكتابة , بينما RandomAccessFile يوفر لنا امكانية الذهاب مباشرةً إلى بايت معين في الملف دون المرور على الملف من بدايته مما يوفر في الاداء والوقت, ومن أشهر الدوال لهذا الكلاس دالة seek والتي تحدد المكان الذي نريد الذهاب إليه في الملف RandomAccessFile randomfile = new RandomAccessFile("test.txt", "rw"); randomfile.seek(5); دالة write التي تقوم بكتابة البيانات في الملف randomfile.write("test".getBytes()); وكما تلاحظ نقوم هنا بكتابة النص عبارة عن bytes حيث لا يمكن اضافة النصوص مباشرة لذا نقوم بتحويلها الى بايتس عبر الدالة getBytes
  9. تلك الرسالة تخبرك بأن يوجد خطأ في إسم المستخدم أو كلمة المرور الخاصين بقاعدة البيانات التي تحاول الاتصال بها, يرجى التاكد من صحة البيانات وسيتم حينها الإتصال بنجاح
  10. تلك المشكلة تحدث بسبب علاقة الجوين كما أوضح أ.وائل ويمكنك حلها أيضًا عبر إستخدام group by لحقل يُمثل السجل مثل ال id لتكون في النهاية الجملة الإستعلامية الخاصة بك كالتالي SELECT order_threads.*, thread.image , thread.name, patron.id AS patronID, patron.order_id AS patronOrderID, patron_colors.patron_id AS patron_colors_Patron_id , patron_colors.color_name AS patron_colors_color_name, patron_colors.id AS patron_colors_ID, patron_colors.color_count AS patron_colors_colorCount FROM order_threads JOIN thread ON order_threads.thread_id = thread.id JOIN patron_colors ON patron_colors.patron_id = order_threads.color_select OR patron_colors.color_name = order_threads.color_select LEFT JOIN patron ON patron.id = patron_colors.patron_id WHERE patron.order_id = order_threads.order_id AND order_threads.order_id='36'; group by id
  11. بالإضافة إلى إجابة حسن , في الأسفل مثال بسيط بإستخدام الجافاسكريبت للتطبيق على تلك المفاهيم axios.get('https://jsonplaceholder.typicode.com/todos/1') .then(response => console.log(response)) في ذلك المثال يوجد لدينا api عنوانها https://jsonplaceholder.typicode.com تحتوي على العديد من الموارد , في مثالنا هنا نحتاج إلى جلب كائن معين من النوع todos والمُعرف الخاص به id يساوي 1 , لذا سنقوم بعمل طلب ajax على الرابط https://jsonplaceholder.typicode.com/todos/1 وحتى نتمكن من عمل الطلب قمنا بإستخدام مكتبة axios والتي هي تقوم بتطبيق مفهوم الأجاكس , عبر إستخدام التابع get والذي يقوم بعمل get request أي يقوم بعمل طلب لجلب البيانات, ومن ثم نقوم بطباعة البيانات, ستلاحظ عند طباعة البيانات أنها يتم طباعتها بالشكل التالي { "userId": 1, "id": 1, "title": "delectus aut autem", "completed": false } تلك الصيغة تُسمى صيغة json وهي صيغة يتم التعامل بها بين الapi وبين الجافاسكريبت لتسهيل عملية نقل البيانات, يوجد صيغ اخرى يمكن إستخدامها مثل xml لكن لم يعد من الشائع إستخدامها تلك الأيام أصبح من الشائع إستخدام الjson والتي كما تلاحظ هي عبارة عن مفتاح وقيمة أو key - value حيث نقوم بفتح أقواس {} وبداخلها نقوم بوضع المفتاح وبعدها علامة : ومن ثم قيمته , لذا في المثال السابق لدينا المفتاح userId قيمته 1 والمفتاح id قيمته 1 ,والمفتاح title قيمته delectus aut autem والمفتاح completed قيمته false وبالطبع توفر صيغة json عدة أنواع أخرى من البيانات مثل المصفوفة أو مثل وضع كائن جيسون بداخل كائن جيسون أخر , ويمكنك القراءة عنها بشكل مفصل من خلال الروابط المرفقة في اجابة أ.حسن
  12. الدورة موجهة لتعليم تطوير واجهات المستخدم بغض النظر عن نظام التشغيل , فنظام التشغيل لن يشكل فرقًا , حيث نفس الاكواد تعمل على لينكس وويندوز دون إختلاف
  13. محمد ارجو منك ايضًا ارفاق ملفات الباك اند حتى نتمكن من تجربة التطبيق بشكلٍ جيد
  14. الخصائص القابلة للإحصاء يمكن الحصول عليها عند مناداة الدالة Object.keys(obj) بينما الغير قابلة للإحصاء لن تظهر, بالإضافة إلى أننا عند عبورنا على خصائص الكائن من خلال for in لن تظهر لنا إلا الخصائص القابلة للإحصاء فقط, ويمكننا فهم الأمر بشكلٍ أكبر عبر الأمثلة التالية var obj = {}; Object.defineProperty(obj, 'a', { value: 123 }); // خاصية غير قابلة للإحصاء obj.b = 4; // خاصية قابلة للإحصاء لأننا أنشأناها عبر // إسناد قيمة إلى خاصية مباشرةً console.log(Object.keys(obj))////هنا لن تظهر لنا إلا الخاصية b فقط for(key in obj) console.log(key)//هنا لن يتم طباعة أيضًا إلا الخاصية b فقط وتلك الخصائص يمكننا الإستفادة منها في عدة أمور كمثال عند محاولتنا لتحويل الكائن لديك إلى مصفوفة, يمكننا إستخدام الشفرة التالية const arr = Object.keys(obj).map(key=>obj[key]) في تلك الحالة لن يتم تحويل الخواص التي ليست قابلة للإحصاء وذلك لأنها لن تظهر لنا في التابع Object.keys , لذا يُستحسن دومًا محاولة التعامل مع الخواص القابلة للإحصاء بدلًا من الغير قابلة إلا في حالة أنك أردت وضع خاصية لا تظهر في الحالات التي ذكرناها
  15. قد يكون ذلك الخطأ سببه أنك تحاول إدخال البيانات فيه في نفس الوقت تكون فاتح الملف , برجاء التأكد من إغلاق الملف حين محاولة إدخال البيانات عبر الform
  16. لغات c/c++ لا تدعم النصوص في الswitch case , قد يرجع ذلك لعدة أسباب من ضمنها أن c/c++ لا يوجد بها نوع string وإنما يتم إستيراده , إن لاحظت في الكود خاصتك ستجد السطرين #include <iostream> using namespace std; ذلك السطر هو الذي يقوم بإستيراد النوع string بالإضافة إلى بعض الدوال بالطبع, لذا لغة c++ في الأساس لا تحتوي على النوع string وإنما يتم التعبير عنه من قِبل مصفوفة من الحروف, ولذلك لا يمكن إستخدامه في الswitch case لأنه ليس موجود في اللغة نفسها
  17. محمد ارسل ملفات المشروع كاملًا لان تلك الملفات ناقصة
  18. محمد أرجو طباعة الprofileId بداخل الدالة createRoom وليس طباعة userId
  19. هل يمكنك طباعة profileId حتى نتأكد أنه تم إرساله بصورة صحيحة عبر تعديل الشفرة البرمجية لدالة craeteRoom لجعلها كالتالي export const creatRoom = async(req,res)=>{ const { profileId, Numberofroom,NameOfroom,QrCode,date}=req.body; try{ console.log(profileId); const room = await models.Room.create({ NameOfroom, Numberofroom, QrCode, date, profileId }); res.status(200).json({message:'تم إنشاء الحصة بنجاح '}); } catch(e){ res.status(500).json(e); console.log(e); } }; أرجو بعد الطباعة أن ترينا لقطة شاشة لناتج الطباعة
  20. أغلب اللغات البرمجية الحديثة لا تدعم مفهوم الوراثة المتعددة, ولكن يوجد بدائل لهذا المفهوم , من ضمنهم كما إقترح أستاذ عدنان إستخدام الtraits , كما أيضًا يوجد مبدأ هام في البرمجة كائنية التوجه وهو prefer composition over inheritance أي " إستخدم التركيب بدلًا من الوراثة" ولكن ما المقصود بذلك؟ يمكننا معرفة المقصود عبر المثال التالي : <?php class Vehicle { public function move() { echo "emad's car started moving"; } } class Car extends Vehicle { public function accelarate() { move(); } } $car = new Car(); $car->accelarate(); في المثال السابق قمنا بإستخدام الوراثة, ولكن ماذا لو أردنا أن نرث من صنف أخر ما الحل؟ أو ماذا إن كنا لا نحتاج جميع الدوال والوظائف التي يقدمها الصنف الأب , في هذا الوقت الوراثة ليس شئ منطقي لذا المنطقي أ، نقوم بإستخدام التركيب أو بالإنجليزية Composition وهو عبارة عن وضع كائن من الصنف الأب بداخل الصنف الإبن لذا يتمكن الصنف الإبن من إستخدام وظائف الصنف الأب دون الوراثة منه كما يظهر لدينا بعد تعديل المثال السابق <?php class Vehicle { public function move() { echo "emad's car started moving"; } } class Car { private $vehicle; public function __construct(Vehicle $vehicle) { $this->vehicle = $vehicle; } public function accelarate() { $this->vehicle->move(); } } $vehicle = new Vehicle(); $car = new Car($vehicle); $car->accelarate(); كما يتضح لنا تمكنا الأن من إستخدام وظائف الصنف vehicle دون وراثتها وذلك عبر إنشاء كائن من ذلك الصنف في الصنف Car , وهذا ما يُسمى بالcomposition ويمكننا تطبيق ذلك المبدأ في حالتك عبر وضع كائنات من الأصناف الثلاثة بداخل الصنف الجديد كما يتضح لنا في الشفرة البرمجية التالية class A { // ... } class B { // ... } class C { // ... } class child{ $a; $b; $c; public function __construct(A $a, B $b, C $c) { $this->a = $a; $this->b = $b; $this->c = $c; } ///////يمكنك هنا وضع الوظائف التي تحتاجها وتقوم بإستدعاؤها من الأصناف التي قمنا بعمل تركيب لها }
  21. هل يمكنك أن ترينا الطريقة التي قمت بإدخال البيانات بها ؟ لأنه من الواضح أنك لم تدخل منشئ الحصة عند إنشاؤها
  22. أرجو فتح ملف index.js والذهاب إلى السطر رقم 6 وكتابته على الشكل التالي sequelize.sync({force:true}) حيث أن الخاصية {force:true} ستقوم بمسح البيانات الموجودة في قاعدة البيانات وإعادة بناؤها مرة أخرى حتى يتم بناؤها بالعلاقة الصحيحة بين الحصة والمدرس, بعد أن تقوم بتشغيل الخادم ستلاحظ ظهور العلاقة في قاعدة البيانات في الجدول room حيث سيظهر لك الحقل الجديد profileId , بعد ذاك يمكنك مسح الخاصية force:true مرة أخرى حتى لا يتم مسح البيانات في كل مرة يتم تشغيل الخادم فيها بالتوفيق
  23. الجدول الذي يحمل العلاقة بينهما ليس جدول lista وإنما هو نفسه جدول الrooms وهذا لأنها علاقة واحد إلى كثير, وفي علاقة الواحد إلى كثير يكون جدول الكثير هو الذي يحمل مفتاح العلاقة , لذا أرجو إزالة الخاصية foreignKey من العلاقة وإعادة إنشاء قاعدة البيانات ستلاحظة إنشاء جدول rooms يحمل بداخله مفتاح يُشير إلى الأستاذ الموجود في تلك الحصة
×
×
  • أضف...