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

سمير عبود

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

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

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

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

    34

كل منشورات العضو سمير عبود

  1. نعم هذا ما أقصد و ستعمل الطبقة الوسيطة تلقائياً مع أي مستخدم قد سجل دخوله في موقعك، أرى أن هذه الطريقة أفضل من جلب كل المستخدمين و إنقاص 1 من عدد الأيام بشكل دوري. أيضاً يمكنك التوسع كأن تضع نموذجاً للخطط المتاحة (Plans) و كل خطة لها مدة معينة (شهر، 6 أشهر، سنة، مرة واحدة للأبد) و تربط نموذج الإشتراكات بنموذج الخطط.
  2. أليس من الأفضل وضع جدول بيانات لإشتراكات المستخدمين بحيث يكون هناك علاقة بين المُستخدم و الإشتراكات (للمستخدم عدة إشتراكات) عندما يشترك المُستخدم في خطة ما تقوم بحفظ تاريخ اشتراكه و تاريخ إنتهاء الإشتراك حسب الخطة، في نموذج المستخدم تقوم بإنشاء تابع (hasValidSubscription) تقوم بالتحقق من خلاله إن كان المُستخدم لديه إشتراك صالح أم لا. داخل التابع تجلب آخر سجل إشتراك للمستخدم و تقارن خاصية تاريخ إنتهاء الإشتراك بالتاريخ الحالي و تُعيد قيمة منطقية تحدد إذا كان الإشتراك صالح أم لا. إن كان التاريخ الحالي أكبر ذلك معناه أن الإشتراك مزال صالح، و إذا كان العكس فالإشتراك منتهي. ثم تستخدم التابع في عرض الصفحات التي توفر الخدمات في موقعك، قد يكون التابع عبارة عن طبقة وسيطة middleware تعمل في المسارات التي تحتاج إشتراك، بهذا الشكل إن كان المستخدم لديه إشتراك صالح ستسمح الطبقة الوسيطة بمروره، إن كان العكس فسيتم إعادة توجيهه مثلاً لصفحة تخبره أن الإشتراك منتهي و عليه تحديثه.
  3. بإمكانك إستعمال حلقة غير منتهية، و من داخل الحلقة تسأل المُستخدم إن كان يريد الإستمرار أم لا و على حسب الإجابة إن كانت الإجابة نعم يكرر الكتلة البرمجية غير ذلك تقوم بعمل break للحلقة و يتوقف البرنامج، بهذا الشكل ستتكرر العمليات إلى أن يقوم المستخدم بإختيار عدم الإستمرار: while(True): num1 = int(input("Enter the first number: ")) num2 = int(input("Enter the second number: ")) operation = input("Enter the operation type (*, +, -, /): ") if operation == "*": print(num1 * num2) elif operation == "+": print(num1 + num2) elif operation == "-": print(num1 - num2) elif operation == "/": if num2 != 0: print(num1 / num2) else: print("Cannot divide by zero.") else: print("Error") choice = input("do you want to continue? [Yes / No]: ") if choice == "Yes": continue else: print("Good Bye!") break السطر: while(True): يضمن التكرار إلى حين إيقاف الحلقة. و الكتلة: choice = input("do you want to continue? [Yes / No]: ") if choice == "Yes": continue else: print("Good Bye!") break تسأل المستخدم عن خيار المواصلة، و يتم التعامل على أساس الخيار سواء Yes أو غير ذلك.
  4. لا الأمر ليس كذلك فلكل دورة شهادة بالإسم الخاص بها، و المقصود ليس 4 دورات و إنما المقصود أنه حتى تستطيع التقدم لإجراء إمتحان يُشترط أن تكون قد أتممت على الأقل 4 مسارات رئيسية من الدورة نفسها و أنجزت التطبيقات العملية التي يتم بناؤها من خلال تلك المسارات و قمت برفعها في حسابك على GitHub لإرسالها للمراجعة.
  5. مرحباً بك، نعم فهي دورة تأسيسية و تبدأ معك من الصفر، حيث أنه تم إعداد الدورة من طرف نخبة من المطورين بأسلوب عملي شيق الدورة متاحة كاملةً على أكاديمية حسوب دون التقيد بمواعيد زمنية، ويمكنك حضورها في أي وقتٍ تشاء، فالدروس كلها مسجلة، ويمكنك إعادة الدرس أكثر من مرة والرجوع له متى تشاء في حال احتجت إلى ذلك. أيضاً يوجد فريق من المدربون متاحون دائمًا وسيتابعوا معك ويجيبوا على أسئلتك في أي وقت. أيضاً ستتمكنين من متابعة التحديثات التي تطرأ على الدورة التي اشتركت بها بشكل مجاني لا فقط سعر الإشتراك الأولي، كل ما نحتاج إلى إستعماله من برامج هو مفتوح المصدر و سيتم توفير أي شيء يتم إستعماله داخل الدورة من برامج، طريقة تثبيت البرامج و ما إلى ذلك موجود في الدروس. ليس هناك مدة محددة و الأمر نسبي يعتمد على الطالب نفسه، يفضل تنظيم وقتك و تخصيص جزء من يومك لمتابعة الدروس و الإنضباط على نظام معين لتحقيق أكبر إستفادة لا ليس هناك دروس تتطلب حضور فكل الدروس مسجلة كما ذكرت في الأعلى لا يوجد متطلبات معينة فقط جهاز بمواصفات و خصائص متوسطة يكفي للبدأ. نعم فكما قلت أن الدورة تأسيسية و بعد إنهائها وفهم محتواها ستُسهل عليك الدخول إلى أي مجال و التخصص فيه و إليك محتواها: مدخل إلى علوم الحاسوب أساسيات البرمجة قواعد البيانات البرمجة الكائنية الخوارزميات وبنى المعطيات أنماط التصميم أساسيات هندسة البرمجيات هذه هي المسارات الرئيسية الخاصة بالدورة لحد الساعة في بعض المسارات سيطلب المحاضر حل بعض التمارين، و سيقوم بتقديم الحل في الدرس الموالي سيكون من الأفضل محاولة حل هذه التمارين بنفسك و مطابقة الحل الخاص بك بالحل الخاص به و رؤية الأفكار الجديدة التي إستخدمها و إقتباسها، لكن بشكل عام يجب دائما التطبيق مع المدرب سواء عندما يشرح أساسيات أو عندما يحل تمارين. يتم الحصول على الشهادة بعد إجتياز الإمتحان النهائي، و ليس بعد إتمام الدورة، فجميع الشهادات التي تصدرها أكاديمية حسوب تصدر فقط بعد اجتياز الامتحان بنجاح، سأرفق لك في الأسفل بعض الروابط المهمة التي يجب عليك الإطلاع عليها لمعرفة كل ما يتعلق بالإمتحان و الشهادة. هذا ما ذُكر في صفحة الدورة بخصوص هذا الأمر: سنمنحك باقة كتابة السيرة الذاتية في موقع بعيد بقيمة 99$ مجانًا. سيجري لك فريق أخصائيي التوظيف مقابلة صوتية يتعرف فيها على مهاراتك، ويكتب لك أفضل سيرة ذاتية مخصصة لك؛ ثم سيتابع معك لضبط حسابك على مستقل وبعيد ويقدم لك نصائح مخصصة للحصول على عملك الأول. روابط مهمة: صفحة دورة علوم الحاسوب بها كل المعلومات التي تخص الدورة، و معظم الأسئلة التي قمتِ بطرحها يوجد أجوبتها هناك، يوجد وصف مفصل لمحتوى الدورة و أجوبة لمعظم الأسئلة الشائعة. مركز مساعدة أكاديمية حسوب فيه صفحات لمعظم المواضيع الشائعة مثل: الامتحان والحصول على الشهادة و كيف أشترك بالدورات و كيف أتواصل مع المدرّبين و غير ذلك من المواضيع، كما يُمكن من خلاله التواصل مع الدعم لشرح مشكلة أو تقديم إقتراح، تحديد موعد الإمتحان، و الأمور التي تخص الإدارة
  6. لم أفهم سؤالك يُرجى التوضيح أكثر، إن كان سؤالك يتعلق بأحد دورات أكاديمة حسوب يُرجى طرحه أسفل الدرس الذي تتابعه لأن هذا القسم خاص بالأسئلة العامة. قد يكون من المفيد لك لو إطلعت على الصفحة التالية: كيف أتواصل مع المدرّبين
  7. إن كنت تريد تعلم لغة HTML فهذا يعني أنك تريد إحتراف و تعلم تطوير الويب، و هذا أمر جيد فمجال تطوير الويب مطلوب بشكل كبير في المشاريع على مواقع العمل الحر و من خلال الشركات، لكن لغة HTML لوحدها لا تكفي يجب عليك أن تضع خطة كاملة لدراسة مُعظم اللغات و التقنيات الأساسية المُستعملة في تطوير الويب، لذلك أنصحك بالإطلاع على المقال التالي: الذي سيوضح لك هذا المجال و ما عليك تعلمه لتُصبح مُحترف فيه، أيضاً سيكون من المفيد لك إذا إطلعت على هذا المقال أيضاً: الذي سيشرح لك مُعظم مجالات البرمجة، و يوضح لك الرؤية. بعد معرفة التقنيات التي يجب أن تكون لديك فيها خبرة في المجال الذي تريده، يُمكن دراستها واحدة تلو الأخرى إكتساب خبرات في كل تقنية أو لغة من خلال الدراسة النظرية و التطبيقات العملية. يُمكنك إستخدام يوتيوب و إنتقاء الدورات التي تراها مناسبة لك في هذه المرحلة، و إن كنت تريد التوسع في الفهم، و كنت تحب المحتوى المكتوب فإليك بعض المصادر من الأكاديمية: سلسلة مقالات مدخل إلى HTML5 سلسلة مقالات أساسيات تطوير الويب سلسلة مقالات CSS 101 سلسلة مقالات ملاحظات للعاملين بلغة CSS سلسلة مقالات التحريك في CSS دليل تعلم جافاسكربت سلسلة مقالات جافاسكربت في المتصفح سلسلة مقالات جافاسكربت متقدمة و هناك مقالات مختلفة تشرح أشياء متنوعة بالإضافة إلى تطبيقات عملية كثيرة يُمكنك البحث من خلال الأكاديمية، أيضاً يوجد موسوعة حسوب فيها توثيق لمعظم اللغات.
  8. موضوع التعلم و طريقة التعلم المناسبة لك بالإضافة لمتابعة الدروس و كم الوقت الذي تحتاجه في اليوم للتعلم يعتمد عليك وحدك و على الطريقة التي ترتاح لها فكل شخص و طبيعته البعض يحب تدوين المعلومات المهمة التي يشرحها المدرب أو المحاضر في الدروس بدفتر و يُنظمها بشكل يُسهل عليه فيما بعد مراجعة تلك المعلومات بسرعة يُمكنك إتباعها إن كنت ترتاح لها. يُمكنك أيضاً إتباع الطريقة التالية: تقوم بإنشاء مجلد بنفس الإسم للدورة التي تتابعها و تضعه في جهازك بمكان ما إن كان للدورة عدة مسارات فتُنشئ مجلد للمسار الذي تتابعه و تضع له نفس إسم المسار و كل مسار تفعل نفس الشيء بداخل مجلد المسار، إن كان للمسار مسارات فرعية فتُنشئ لها مجلدات تحمل نفس الإسم كما فعلت مع المسارات الرئيسية الدرس أيضاً تضع له مجلد، بحيث أن هدفك من هذه الطريقة هو فهرسة الدورة إلى مجلدات، بعد مشاهدة الدرس تضع التطبيق الذي قام به المدرب في الدرس داخل مجلد الدرس الذي أنشأته ثم تطبق شيء من عندك لترسيخ الدرس وفهمه تكرر العملية مع كافة الدروس، بعد نهاية المسار أو الدورة سيكون لديك مجلد يحوي كل التطبيقات الخاصة بالدروس، يُمكنك الرجوع لها متى ما أردت لإسترجاع معلومة ما نسيتها و تكون بحاجتها. هذه الطريقة تتبعها مع المسارات التي يتم شرح الأساسيات فيها أما المسارات التطبيقية، فتكون موجهة لتنفيذ تطبيق كامل و أنت هنا ستقوم بإنشاء مجلد للتطبيق و تطبق على الملفات الموجودة و تُحدثها بإستمرار مع مُضي الدروس. أيضاً لا تقم بـ حفظ التوابع، أسماؤها و اسماء الخصائص و العناصر و ما إلى ذلك، و إنما إستهدف الفهم إن كنت قد فهمت الدرس و طبقت بعض الأشياء لترسيخ الفهم فذلك يكفي، تذكر العناصر و الأسماء و عدم الوقوع في الأخطاء بكثرة يأتي بالممارسة و كثرة التجربة، بالإضافة للخبرة المتراكمة التي تنتج من الإحتكاك باللغة أو التقنية لفترة أطول. بالتوفيق.
  9. تحديد لغة الموقع في إطار laravel يتم من خلال ملف الإعدادات: config/app.php يوجد مفتاح للُغة الإفتراضية للتطبيق: 'locale' => 'en', لكن هذا لن يكون كافي، فإن كان مُحتوى الصفحات مكتوب مباشرة باللغة العربية، ستحتاج إلى ترجمته، في الغالب نستخدم في صفحات العرض دوال: __() trans() لترجمة المُحتوى و نستخدم بداخلها مفاتيح تنوب عن المُحتوى الفعلي، ثم في ملفات الترجمة الموجودة في المجلد lang نضع مجلدات بأسماء ال locals مثلاً ar و en ثم بداخلها نُنشئ ملفات بالشكل التالي: /lang /en messages.php /ar messages.php ثم بداخل كل منها نضع الترجمات: <?php // lang/en/messages.php return [ 'welcome' => 'Welcome to our application!', ]; // lang/ar/messages.php return [ 'welcome' => 'مرحبا بك في تطبيقنا', ]; بحيث في الصفحات عند إستعمال دوال الترجمة نكتب: __('messages.welcome'); و بهذا الشكل سيتم جلب المُحتوى حسب اللغة الإفتراضية للتطبيق، و بنفس الشكل يتم ترجمة كافة محتوى الموقع. يجب أيضاً تحويل dir في html إلى ltr إن كانت rtl: <html lang="en" dir="ltr"> و إستخدام ملف تنسيقات يتوافق مع الإتجاه (من اليسار إلى اليمين) أما إن كان الهدف جعل الموقع يدعم عدة لغات و إتاحة تصفح الموقع باللغة التي يريدها المستخدم و إمكانية التبديل بين اللغات فالمساهمة التالية ستكون مفيدة لك: توثيق Laravel Localization
  10. حاول إستيراد ملف اللغة من المجلد dist بالشكل التالي: import moment from "moment" import "moment/dist/locale/ar" moment.locale("ar"); بإمكانك أيضاً استعمال وحدة Day.js Nuxt Module و في التوثيق طريقة التثبيت و إعدادها لتعمل مع nuxt، إضافة اللغات و تعيين اللغة الإفتراضية.
  11. ستجد في هذه الصفحة: كتب البرمجة كل الكتب التي قامت الأكاديمية بنشرها و التي تخص مجال البرمجة، لحد الساعة لا يوجد كتاب للغة PHP، و لا أدري إن كانت الأكاديمية تخطط لهذا الأمر، لكن يُمكنك مُتابعة الصفحة من زر المتابعة في الأعلى و إذا تم نشر كتاب جديد ستتلقى إشعاراً بذلك، أيضا إن قمت بتصفح الصفحات الخاصة بالكتب المنشورة ستجد أنها بدأت على شكل مقالات و ستجد في الأسفل جزء يضم كافة روابط تلك المقالات. فإن كنت من محبي المحتوى المكتوب يُمكنك الإطلاع على قسم المقالات، هناك عدد كبير من المقالات التي تتمحور حول لغة PHP: مقالات لغة PHP سلسلة PHP 101 و هي سلسلة تضم 11 مقال سلسلة ملاحظات للعاملين بلغة PHP و هي سلسلة تضم 47 مقال. و هناك أيضاً مقالات تخص إطار Laravel و نظام إدارة المحتوى ووردبريس
  12. بإمكانك إستخدام مكتبة xlsx، يُمكنك تصفح مستودع المكتبة على github من خلال SheetJS / sheetjs. و هي مكتبة خاصة بجافاسكربت للتعامل مع جداول Excel. مثال بسيط للإستعمال: لدي ملف بالإسم file.xlsx بداخله و رقة واحدة sheet1، و المحتوى التالي: Html Css JavaScript Python Django Flask في العمود الأول. نحاول من خلال جافاسكربت، قراءة الملف و الوصول لمُحتوى كل خلية: أولاً نقوم بإستيراد المكتبة عبر Cdn: <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script> ثم نستخدم المكتبة لقراءة محتوى الملف السابق: <script type="module"> const workbook = await fetch('./file.xlsx', { type: 'array' }) .then(resp => resp.arrayBuffer()) .then(buff => XLSX.read(buff)) .catch(err => console.error(err)) console.log(workbook) </script> بهذا الشكل نقرأ الملف و نُخزن محتواه في المتغير workbook. ثم يُمكننا أن نصل إلى الورقة الأولى: let sheet = workbook.Sheets[workbook.SheetNames[0]]; console.log(sheet) ثم نقرأ ال range و هو كائن به خاصيتين s تُعبر عن البداية (start) و e تُعبر عن النهاية (end) أي بداية المُحتوى و نهايته في الورقة، و في كل من الخاصيتين s و e هناك خاصيتين r و c تُعبران عن الصف و العمود: let range = XLSX.utils.decode_range(sheet['!ref']); console.log(range) أخيراً يُمكننا العُبور على الخليات المتواجدة في الورقة بإستعمال المُتغير range و الحلقات for: for (let R = range.s.r; R <= range.e.r; ++R) { for (let C = range.s.c; C <= range.e.c; ++C) { console.log('Row : ' + R); console.log('Column : ' + C); let cellref = XLSX.utils.encode_cell({c:C, r:R}); console.log(cellref) if(!sheet[cellref]) continue; let cell = sheet[cellref]; console.log(cell.v) } } بعد التشغيل سنتحصل في نافذة ال console للمتصفح: Row : 0 Column : 0 A1 Html Row : 1 Column : 0 A2 Css Row : 2 Column : 0 A3 JavaScript Row : 3 Column : 0 A4 Python Row : 4 Column : 0 A5 Django Row : 5 Column : 0 A6 Flask و هذا محتوى ملف ال Html بشكل كامل: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script> <script type="module"> const workbook = await fetch('./file.xlsx', { type: 'array' }) .then(resp => resp.arrayBuffer()) .then(buff => XLSX.read(buff)) .catch(err => console.error(err)) console.log(workbook) let sheet = workbook.Sheets[workbook.SheetNames[0]]; console.log(sheet) let range = XLSX.utils.decode_range(sheet['!ref']); console.log(range) for (let R = range.s.r; R <= range.e.r; ++R) { for (let C = range.s.c; C <= range.e.c; ++C) { console.log('Row : ' + R); console.log('Column : ' + C); let cellref = XLSX.utils.encode_cell({c:C, r:R}); console.log(cellref) if(!sheet[cellref]) continue; let cell = sheet[cellref]; console.log(cell.v) } } </script> </body> </html> حتى يعمل الملف بدون مشاكل عليك تشغيله عبر خادم، يُمكنك إستعمال إضافة Live Server في برنامج Vs Code لتحقيق ذلك. يُمكنك أيضاً التوسع أكثر و قراءة الدوال و التوابع المتواجدة في توثيق المكتبة و إستعمالها لتحقيق ما تريد.
  13. إن كان الهدف بناء صفحة ويب، بإمكانك الإعتماد على لغة برمجة و إطار عمل خفيف خاص بها يستعمل في مجال تطوير الويب، مثلاً يُمكنك الإعتماد على لغة بايثون و إطار Flask مع بعض المكتبات التي تتيح التعامل مع البيانات و جداول excel. إن لم تكن لديك خبرة في التعامل مع إطار Flask يُمكنك الإطلاع على Flask 101 و هي سلسلة مقالات بسيطة تُعرف بالإطار و بعض المفاهيم فيه. مكتبة openpyxl للتعامل مع ملفات Excel القراءة منها و التعديل عليها. مكتبة pandas و هي مكتبة غنية عن التعريف في بايثون للتعامل مع البيانات و تحليلها، يُمكن قراءة البيانات فيها من ملفات Excel، JSON، CSV و غيرها، ثم تحليل تلك البيانات حسب المطلوب إن لم ترغب في إستخدام Flask فيُمكن أيضاً إستخدام streamlit و هي مكتبة بايثون مفتوحة المصدر تتيح بناء تطبيق ويب مخصص لعلم البيانات والتعلم الآلي وغير ذلك الكثير. يهدف Streamlit إلى بناء ونشر التطبيقات دون الحاجة إلى أي معرفة بتطوير الويب. و بطبيعة الحال إن كانت لغة البرمجة غير بايثون فهناك طرق متاحة في تلك اللغة، لكن ذكرت لغة بايثون بحكم أنها مشهورة و شائعة الإستعمال في مجال تحليل البيانات.
  14. يوجد دورات كثيرة على الإنترنت في أي مجال تريد، فقط إستخدم محرك البحث و إبحث عن الدورة التي تريدها، أيضاً من خلال موقع يوتيوب، إبحث و إنتقِ الدورة التي تعجبك و تراها مفيدة لك. توفر أكاديمية حسوب دورة مدفوعة: دورة تطوير التطبيقات باستخدام لغة Python و هي دورة شاملة تشرح مُعظم المجالات التي يُمكن إستخدام لغة بايثون فيها. كما توفر الأكاديمية مُحتوى مكتوب مجاني يُمكنك الإستفادة منه: دليل تعلم بايثون و هي عبارة عن سلسلة مقالات مكتوبة تبدأ من الصفر. كما يوجد مقالات متنوعة في لغة بايثون و اطر عملها يُمكنك تصفحها من هنا كما أصدرت الأكاديمية عدة كتب في الكثير من التقنيات و اللغات البرمجية من بينها كتاب البرمجة بلغة بايثون 1.0.0 و هو عبارة عن تجميعة من المقالات المترجمة و الموجودة على الأكاديمية ستجد روابطها في صفحة الكتاب يُمكنك القراءة و التعلم من المقالات بشكل منفصل أو تحميل الكتاب الذي يضم المحتوى بشكل كامل و التعلم منه.
  15. نعم فالدورات التي أرفقت روابطها تتعلق بمجال ال Back End، يُمكنك الإطلاع على مُحتويات الدورة بالضغط على الرابط و سيُحولك إلى صفحة الدورة، في الأسفل ستجد قسم بعُنوان مسارات الدورة فيه ستجد كافة المحتوى الذي يتم شرحه و المواقع التطبيقية التي يتم بناؤها في الدورة.
  16. مجال تطوير الويب ينقسم إلى قسمين، قسم تطوير الواجهات الأمامية و هو يرتكز على ثلاث لغات أساسية هي HTML و CSS و JavaScript بالإضافة إلى بعض التقنيات التي تساعد المطور في العمل على بناء الصفحات و مظهر العناصر و الأقسام بالإضافة إلى بعض التفاعلات و الحركية التي يتم تطبيقها بإستعمال JavaScript، يُسمى المطور الذي يعمل في هذا المجال مُطور واجهات أمامية (Front End Developer). دورة تطوير واجهات المستخدم المُقدمة من أكاديمية حسوب تستهدف هذا المجال، القسم الثاني من مجال تطوير الويب هو قسم تطوير الواجهات الخلفية و هذا القسم خاص بالتعامل مع البيانات و معالجتها، تخزين البيانات في قواعد البيانات و قراءتها، التعديل عليها، التفاعل مع طلبات المستخدم، عمليات المصادقة، تسجيل الدخول، الخروج، التعامل مع الجلسات و ما إلى ذلك من عمليات، فحتى تبني موقع كامل (الواجهات الأمامية و الخلفية) تحتاج إلى تعلم هذا المجال أيضاً، هناك لغات كثيرة و أطر عمل خاصة بتلك اللغات تساعدك في هذا الجزء من تطوير تطبيقات الويب، أبرزها لغة PHP و أطرها مثل Laravel، Symfony، CodeIgniter، Yii، CakePHP و غيرها، لغة بايثون و إطار العمل Django، لغة روبي و إطار العمل Rails و لغة جافاسكربت أيضاً يمكن إستخدامها في جانب الواجهات الخلفية بالإعتماد على تقنية NodeJs بالإضافة إلى إطار ExpressJs أنصحك بالإطلاع على هذا المقال: فهو يُعتبر مدخل لعالم الويب و يشرح مجالات الويب و بعض المجالات المُرتبطة به يُسمى المطور الذي يُتقن التعامل مع الواجهات الخلفية و الواجهات الأمامية مُطور شامل Full-Stack Developer، أكاديمة حسوب توفر دورات تشرح التعامل مع الواجهات الخلفية عبر مُختلف اللغات: دورة تطوير تطبيقات الويب باستخدام لغة PHP دورة تطوير التطبيقات باستخدام لغة Python لغة بايثون متعددة الإستخدام في الدورة يتم شرح إطار فلاسك و Django و كلاهما يُستعملان في تطوير الويب دورة تطوير التطبيقات باستخدام لغة JavaScript لغة جافاسكربت أيضاً متعددة الإستخدام و في الدورة يتم التطرق لعدد من المجالات التي يمكن إستخدام لغة جافاسكربت فيها و من بينها NodeJs و إطار Express دورة تطوير تطبيقات الويب باستخدام لغة Ruby كخلاصة تم بناء دورة تطوير واجهات المُستخدم لتُغطي كافة الجوانب و التقنيات المُستعملة في مجال ال Front End لأن هناك من يريد التخصص في هذا المجال فقط، و في حالتك يجب عليك تعلم مجال ال Back End حتى تستطيع إضافة الخاصيات و الميزات التي تريد إضافتها.
  17. يُرجى توضيح الشيفرات التي تكتبها في صنف ال View الذي يقوم بمعالجة الطلب، حتى نستطيع معرفة سبب المشكلة
  18. أعتقد أن لديك خطأ في ترتيب المعاملات عند إستدعاء التابع getConnection، يستقبل أولاً url ثم المستخدم ثم كلمة المرور: con = DriverManager.getConnection(url, username, password);
  19. لقد عدلت الإجابة السابقة و هي تحوي الحل للمُشكلة فقط عليك تعديل المسار الذي تضعه بداخل الدالة url ليُصبح مساراً نسبياً: url('../pic/pimg.jpg')
  20. يُرجى توضيح هيكلية الملفات في المجلد الذي تعمل عليه، إضغط على أيقونة الملفات في vscode حتى تظهر الهيكلية وقم بأخذ لقطة شاشة توضح الهيكلية بشكل كامل مع مكان تواجد الصورة. أيضاً يرجى توضيح كود ال css الخاص بتنسيقات الخلفية، و طريقة إستعراضك للمشروع عندما تحدث المُشكلة، أي الرابط الذي تفتحه غالباً تكون المُشكلة لديك بسبب مسار الصورة حاول إستخدام مسار نسبي يبدأ من ملف التنسيقات وصولاً إلى ملف الصورة: بفرض أن هيكلية الملفات لديك: css - style.css img - test.png index.html في هذه الحالة ستكتب بداخل الدالة url: url('../img/test.png') و ../ تعني إصعد من المجلد الحالي للملف إلى المجلد الأب، أي مجلد المشروع ثم أدخل للمجلد img ستجد ملف صورة بالإسم test.png. و هذا ما أعتقد أنه لديك كهيكلية، أعتقد أنه لديك ملف html في مجلد المشروع بالإضافة لمجلد فيه ملفات css و مجلد فيه الصور، عند تشغيل المشروع عبر الإضافة فهو يبدأ الخادم في المجلد الحاوي لملف html و / تعني ذلك المجلد، بالتالي مسار الصورة يكون صحيح. أما عندما تستعرض المشروع عبر فتح ملف html مباشرةً تُصبح / لا تُعبر عن جذر المشروع بل شيء آخر في ملفات النظام.
  21. لا يُمكنك ذلك، بما أن الملف متاح للعميل بالمتصفح يُمكنه تحميله بطريقة أو بأخرى مهما قمت بتصعيب المهمة عليه، بدلا من ذلك يُمكنك منع وصول الملف إلى العميل (المُتصفح) من الأساس، يمكنك من الخادم إستخدام مكتبة أو طريقة بلغة البرمجة التي تستخدمها لقراءة الملف و تحويله إلى html و عرضه عندما يطلبه العميل (أي عرض صفحة ال Html أو محتوى الملف على شكل html) إن كنت ترغب في إتباع هذه الطريقة عليك البحث من خلال الإنترنت عن مشاريع أو مكتبات مفتوحة المصدر باللغة التي تستخدمها للقيام بمهمة تحويل الملف من PDF إلى HTML، شخصياً إحتجت في مشروع للقيام بالعكس أي تحويل HTML إلى PDF. و كحل لتصعيب المهمة على المستخدم يُمكنك إستخدام الطرق التي ذكرها المُدرب عدنان في الأعلى، كما يُمكنك إستخدام مكتبة PDF.js و تخصيصها.
  22. إذا كنت قد استخدمت معامل الدمج الفارغ (null coalescing operator) في الماضي، فربما لاحظت أيضًا عيوبه: لا يعمل الدمج الفارغ في استدعاءات التوابع. بدلاً من ذلك، تحتاج إلى اختبارات تحقق وسيطة، أو تعتمد على المعامل optional المتاح في بعض الأطر: $startDate = $subscription->getStartDate(); $dateAsString = $startDate ? $startDate->asDateTimeString() : null; يوفر المعامل (null safe) وظائف مشابهة للمعامل (null coalescing)، ولكنه يدعم أيضًا استدعاءات التوابع. بدلاً من كتابة هذا: <?php $country = null; if ($session !== null) { $user = $session->user; if ($user !== null) { $address = $user->getAddress(); if ($address !== null) { $country = $address->country; } } } الإصدار الثامن من PHP يسمح لك بكتابة: $country = $session?->user?->getAddress()?->country; فهو يتحقق إن كان أي من الكائنات في السلسلة قيمته null فإنه يُعيد null دون حدوث خطأ، أما إن كان هناك كائن فإنه يستدعي الخاصية أو التابع. يُمكن إستخدامه في العديد من الحالات التي تتطلب التحقق و عبارات if كثيرة و الحالات التي نكون فيها نجهل القيمة المعادة من الكائن أو التابع إن كانت null أم قيمة حقيقية.
  23. للبرمجة مجالات متعددة لكن مُعظم المجالات العامة لا تحتاج إلمام كبير بالمفاهيم المُتقدمة في الرياضيات و فهم عميق لها، فقط بعض الأساسيات مثل العمليات الرياضية و الأولوية في تلك العمليات (يعني الأساسيات التي نتعلمها في بداية المشوار الدراسي)، و يعتمد الأمر أيضاً على المنتج الذي يتم بناؤه، فالمُنتجات التي تستهدف حل المسائل الرياضية و الفيزيائية و تستوجب التعامل مع المفاهيم المُعقدة بطبيعة الحال تحتاج إلمام بتلك المفاهيم فمن غير المعقول إنشاء تطبيق لحساب التفاضل و التكامل و عدم الإلمام بهذه المفاهيم. أيضاً مجالات مثل الذكاء الإصطناعي و تعلم الآلة و التعلم العميق تحتاج إلى الرياضيات. أنصحك بالإطلاع على هذا المقال للتعرف على مجالات البرمجة: و هذا المقال أيضاً: يوجد في أسفل كل مقالات روابط لمقالات مُشتركة ستُفيدك.
  24. نعم هناك فرق بين الإطارين Laravel و Symfony، كلاهما يُعتبر إطار عمل للُغة PHP، إطار Symfony ظهر أولاً تم إطلاق أول إصدار منه سنة 2005 أما Laravel فتم إطلاق أول إصدار منه سنة 2011. يركز Laravel على بساطة الكود بالنسبة للمطور (للوصول إلى الحل ببساطة) والذي يمر عبر استخدام التوابع السحرية لـ PHP من أجل تقديم كود مقروء مقارب لللغة الإنجليزية. يفرض Symfony صرامة أكبر وهو أقرب إلى كود PHP الكلاسيكي (باستثناء إعدادات yaml)، وبالتالي فهو أكثر تفصيلًا بشكل عام. يسمح استخدامه المنخفض للتوابع السحرية بالتنقل بشكل أفضل في الكود والتحليل الثابت المبسط. إختيار أحدهما على الآخر يرجع للسوق، متطلبات العمل أو المشروع، الخيار الشخصي أيضاً، كلاهما يُمكننا من إنشاء تطبيقات و مشاريع متوسطة التعقيد إلى معقدة، أيضاً كلاهما يوفر السرعة و الأداء الجيد بالإضافة للحماية و الأمان و مجموعة من الأدوات المساعدة في التطوير. إطار Laravel يستخدم بذاته بعض المكونات من Symfony حتى لا يكرر العجلة التثبيت: في كلا الإطارين، يمكن إجراء التثبيت من خلال أمر create-project الخاص بـ composer: # Laravel composer create-project laravel/laravel example-app # Symfony composer create-project symfony/skeleton:"6.3.*" my_project_directory cd my_project_directory composer require webapp يتطلب Symfony عدة أوامر لأنه يُنشئ مشروع في وضع "microservice" إفتراضيًا، و يُضمن الحد الأدنى من المكونات فقط. يسمح لك أمر composer require webapp بتثبيت جميع المكونات اللازمة لإنشاء تطبيق ويب كلاسيكي. نلاحظ أيضًا أن الإطارين يشتملان على أمر (laravel لـ إطار Laravel وsymfony لـ إطار Symfony) يمكن استخدامهما للتحكم في إطار العمل وتنفيذ مهام معينة (تهيئة مشروع على سبيل المثال). هيكلية ملفات المشروع: تتشابه هيكلية الملفات في الإطارين مع وجود مجلد public والذي سيكون بمثابة جذر خادم HTTP. يتم وضع الشيفرات المصدرية للمشروع في مجلد src بالنسبة لـ Symfony و app في حالة Laravel. في كلا الإطارين ستوضع الإعدادات في مجلد بالإسم config مع الاختلاف الرئيسي وهو التنسيق المستخدم في الملفات. يستخدم Laravel ملفات PHP تُرجع مصفوفات يستخدم Symfony ملفات yaml بشكل افتراضي كلاهما يعتمد على نمط التصميم MVC المسارات: الآن بعد أن تم تثبيت الإطارات، سنكون قادرين على إنشاء المسار الأول لإنشاء الصفحة. في حالة Laravel نبدأ بإنشاء المتحكم، يمكن إنشاء المتحكم يدوياً أو عن طريق أوامر artisan المساعدة: لإنشاء متحكم عبر artisan نكتب: php artisan make:controller HelloController ثم نستطيع وضع الوظائف بداخله: <?php namespace App\Http\Controllers; class HelloController extends Controller { public function hello() { return 'Hello'; } } ثم نعلن عن المسار الذي يسمح بالوصول إلى الوظيفة: // routes/web.php Route::get('/hello', [HelloController::class, 'hello'])->name('hello'); من ناحية Symfony، من الممكن الإعلان عن المسارات من خلال السمات الموجودة في المتحكم مباشرةً. الأوامر الموافقة لـ artisan في Symfony هي أوامر bin/console فلإنشاء متحكم في Symfony نقوم بتنفيذ: php bin/console make:controller HelloController ثم نستطيع وضع الوظائف بداخله: <?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; class BlogController extends AbstractController { #[Route('/hello', name: 'hello')] public function hello(): Response { return new Response('hello'); } } و كما تلاحظ فإن المسار يأتي مضمناً كسمة فوق الوظيفة التعامل مع الطلبات: بالنسبة لكلا الإطارين، من الممكن حقن وسيط في وظائف المتحكم للتعامل مع الطلب: public function hello(Request $request): Response { dd($request->query->get('name')); } لاحظ أن كائن الطلب الموجود في Laravel يرث من صنف الطلب الموجود في Symfony ليقدم طرقًا أسرع لتنفيذ العمليات الأساسية. التعامل مع مُعاملات المسارات: بالإضافة إلى معالجة الطلب، من الممكن أيضًا تمرير معاملات في عنوان ال URL. بناء الشيفرة والتشغيل متشابه في الإطارين: # Laravel Route::get('/hello/{name}', [HelloController::class, 'hello']); # Symfony #[Route('/hello/{name}')] يمكننا بعد ذلك الوصول لهذا المعامل في المتحكم كوسيط في الوظيفة: public function hello(string $name) { } محرك القالب: لعرض صفحات HTML سيكون من الممكن استخدام محرك قوالب، وعند هذه النقطة يظهر فرق بين الإطارين يستخدم Symfony محرك القوالب twig الذي يستخدم syntax خاص به مثال: {% extends "base.html.twig" %} {% block title %}Page Title{% endblock %} {% block sidebar %} {{ parent() }} <p>This is appended to the master sidebar.</p> {% endblock %} {% block content %} {% for post in posts %} <article> <h2>{{ post.title }}</h2> <p>{{ post.excerpt }}</p> <p><a href="{{ path('post.show', {slug: post.slug}) }}">Read more ...</a></p> </article> {% endblock %} يستخدم Laravel محرك قوالب خاص بإطار العمل: Blade. يقوم هذا المحرك بتوسيع ال syntax الخاص بـ PHP بميزات جديدة ولكنه يقبل أيضًا كود PHP صالح. مثال: @extends('layouts.app') @section('title', 'Page Title') @section('sidebar') @parent <p>This is appended to the master sidebar.</p> @endsection @section('content') @foreach($posts as $post) <article> <h2>{{ $post->title }}</h2> <p>{{ $post->excerpt }}</p> <p><a href="{{ route('post.show', ['slug' => $post->slug]) }}">Lire la suite</a></p> </article> @endforeach @endsection .لاحظ أن Blade يوفر نظامًا من المكونات تسمح لك بتضمين جزء من القالب باستخدام syntax أقرب إلى HTML: <form method="post"> <x-input :value="$post->title" label="Title"> </form> الإستمارات: إحدى المهام المتكررة عند العمل على الواجهة الخلفية هي إنشاء النماذج ومعالجتها. في Symfony، يمر إنشاء الإستمارة عبر صنف مخصص يسمح لنا بتمثيل البيانات في الإستمارة الخاصة مع إمكانية إضافة قواعد التحقق من الصحة إلى الخصائص باستخدام سمات PHP. في Laravel لا يوجد فئة لتمثيل الإستمارة، ولا لتوليد الإستمارة. في شيفرة القالب الخاصة بنا، سنقوم بإنشاء الإستمارة الخاص بنا بالطريقة الكلاسيكية (يمكننا استخدام التضمينات أو المكونات لتبسيط كتابة الحقول). ORM: يعد ORM أيضًا نقطة اختلاف كبيرة بين الإطارين. يستخدم Laravel بشكل افتراضي Eloquent وهو ORM يعتمد على Active Record حيث يكون النموذج مسؤولاً عن تمثيل الكيان، ولكن أيضًا عن إدارة البيانات من خلال الجدول الموافق في قاعدة البيانات. // get $post = Post::find(1); // update $post->title = "Title 1"; $post->save(); // create $post2 = Post::create(['title' => 'Title 2']); // delete $post3->destroy(); يستخدم Symfony بشكل افتراضي Doctrine وهو ORM يعتمد على مبدأ Data Mapper حيث يقوم بفصل مفهوم الكيان (كائن يمثل البيانات)، والمستودع Repository (كائن يستخدم لاسترداد الكيانات) والمدير Manager (كائن مسؤول عن إدارة البيانات). $em = $this->getDoctrine()->getManager(); // Entity Manager // get $post = $em->getRepository(Post::class)->find(1); // update $post->setTitle('Title 1'); // create $post2 = new Post(); $post2->setTitle('Title 2'); $em->persist($post2); // delete $em->remove($post3); // وفي جميع الحالات لا يتم إرسال البيانات إلى قاعدة البيانات // للقيام بذلك، يجب عليك استدعاء التابع flush $em->flush(); يمتلك Eloquent جمل أقصر ومنطقًا يبدو أكثر طبيعية، ولكن هذه البساطة الواضحة يمكن أن تؤدي إلى "نماذج كبيرة" لأنه سيتم تخزين كل المنطق في مكان واحد. بينما يسمح Doctrine بفصل أفضل ولكن سيتبين أنها مطولة نسبيًا في الحالات البسيطة. المصادقة: بالنسبة للمصادقة، يقدم Laravel "مجموعات بدأ" تسمح لنا بإعداد جميع عمليات إدارة حساب المستخدم الكلاسيكية. مثل Jetstream و UI بالإضافة إلى Breeze ستقوم هذه المجموعات بتوليد النماذج Models و المتحكمات بالإضافة لملفات القوالب اللازمة، مثلاً عند إستخدام Breeze: php artisan breeze:install php artisan migrate npm install npm run dev سيتم إنشاء الكود في مجلد التطبيق الخاص بك ويمكنك تعديله لإضافة السلوك الذي تريده عن طريق تعديل الكود المصدري. لدى Symfony، من جانبها، مكون أمان يقوم بإدارة المصادقة: php bin/console make:user php bin/console make:auth php bin/cinsole make:registration-form سيسمح لك تشغيل هذه الأوامر بتكوين إعداد المصادقة. من ناحية أخرى، ما يتم تقديمه افتراضيًا هو أقل بكثير مقارنة بـ Laravel وستحتاج إلى تطوير قسم تذكير كلمة المرور وتحرير الحساب وحذفه و ما إلى ذلك. نفس القلب: حاوية الخدمة Service Container: على الرغم من وجود نهج مختلف من حيث الأساليب المقدمة، إلا أن الإطارين يحتويان على نفس نظام حاوية الخدمة لتوصيل المكونات المختلفة معًا. إذا أردنا على سبيل المثال توليد صفحة: // laravel view('posts.index'); // نقوم بإستدعاء دالة عامة // Symfony $this->render('posts/index.html.twig') // نقوم بإستدعاء تابع من المتحكم على الرغم من الاختلاف الكبير بين الطريقتين، إلا أن هاتين الطريقتين تنفذان تعليمات برمجية متشابهة نسبيًا إذا نظرنا إلى ما هو مخفي خلفهما: // Laravel // view('posts.index'); Container::getInstance()->get('view')->make('posts/index'); // Symfony // $this->render('posts/index.html.twig') $this->container->get('twig')->render('posts/index.html.twig') في كلتا الحالتين، سيبدأ الإطار بإنشاء حاوية سيتم ملؤها بعد ذلك بخدمات مختلفة يمكن استرجاعها بعد ذلك وفقًا للاحتياجات داخل التطبيق. يختلف Laravel عن Symfony في أنه يجعل الحاوية قابلة للوصول في أي مكان في التطبيق بفضل استخدام Singleton، حيث سيفرض Symfony صرامة أكبر من خلال إجبار المستخدم على تحديد التبعيات من خلال ملف services.yml.
  25. يوجد أيقونة لثلاث نقاط فوق بعض بجانب أيقونة الإعدادات ⚙️ إضغط عليها سيظهر لك ما يلي: من خلال القائمة التي تظهر يمكنك التحكم في موضع أدوات المطور في متصفح Edge
×
×
  • أضف...