-
المساهمات
2165 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
2
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو عبد الوهاب بومعراف
-
أرجوا تفقد الملفات المرفقة في فيديو المدخل الخاص بالمسار الذي تشاهده حيث ستجد هناك الملفات المرفقة التي تم استخدامها في كل الدورة.
-
SWC هي أداة حديثة تستخدم في تطوير الويب ووظيفتها الأساسية تكمن في تحويل كود JavaScript وTypeScript إلى كود جاهز للتشغيل في المتصفحات. أما كلمة SWC فهي اختصار ل Speedy Web Compiler ومعناها "المترجم السريع للويب" وتم بناؤها SWC بلغة Rust، وهي لغة سريعة جدا في الأداء، وهذا ما يجعل SWC أسرع بعشرات المرات من أدوات تقليدية مثل Babel. بالنسبة لتطوير المواقع فنحن نكتب الكود بلغة حديثة مثل TypeScript أو JavaScript بميزات حديثة ولكن ليس كل المتصفحات تدعم هذه الميزات لذلك نحتاج إلى تحويل هذا الكود إلى نسخة أبسط تستطيع المتصفحات فهمها وهنا يأتي دور SWC حيث يقوم بهذه المهمة بسرعة كبيرة جدا. وما يميز SWC عن غيره هو أمران: السرعة والمرونة فمن ناحية السرعة تأتي من استخدام لغة Rust وهي أسرع بكثير من JavaScript أما المرونة فتعني أن SWC يدعم تحويل TypeScript وJSX الذي يستخدم في React كما يمكن تخصيصه عبر الإضافات (Plugins)، مثل ما كان يفعل المطورون مع Babel. أما اليوم بدأ SWC يستخدم في أدوات شهيرة مثل Next.js، وVite، وTurbopack لأنه يختصر وقت التحويل (build) من دقائق إلى ثوان وهذا يحسن تجربة المطورين بشكل كبير كما يمكن استخدام SWC لتقليل حجم الكود النهائي عبر ضغطه (minify) أو إزالة الأجزاء غير المستخدمة (tree shaking).
-
لا تزال تستخدمه بطبيعة الحالى لأنه يعتبر الركيزة الأساسية لأي تطبيق ويب يعتمد على HTML وJavaScript. فال DOM ليس تقنية قديمة انتهت صلاحيتها، بل هو بنية معيارية ومستمرة لتفاعل المتصفح مع المحتوى، وتستخدم من قبل كل الأطر والمكتبات الحديثة مثل React وVue وAngular وغيرها. وحتى تلك التي تعتمد على مفهوم "Virtual DOM" مثل React، فإنها في النهاية تقوم بتحويل التغيرات إلى DOM حقيقي لعرضها في المتصفح. لكن ربما أنت تقصد التغييرات التي حصلت عليه فما تغير مع الوقت هو طريقة التعامل مع DOM وليس DOM نفسه. فبدلا من التلاعب اليدوي والمباشر به كما كنا نفعل في jQuery، أصبحت الشركات تستخدم أدوات حديثة لتقليل التعامل اليدوي وتحسين الأداء، ولكن النتيجة النهائية تظل DOM يمكنك المطالعة أكثر من هنا:
-
المشكلة هنا تكمن في التعامل الخاطئ مع حالتين خاصتين داخل حلقة do-while والتي تتحكم بدورها في إدخال إجابة المستخدم. فأولا عند إدخالك ل "h" أو "H" للمساعدة فالكود كان يحتوي على تعليق // IDK فقط دون أي تنفيذ فعلي لعرض الخيارات المتاحة من المصفوفة: questions[i][1] مما يعني أن طلب المساعدة كان يتم تجاهله تماما وثانيا المشكلة الأكبر كانت في منطق دالة isValidAnswer() وتفاعلها مع شرط الحلقة، حيث أن هذه الدالة كانت ترجع 0 (false) للنص الفارغ، مما يجعل شرط: while(isValidAnswer(userAnswer)) يتوقف ويخرج من الحلقة، فيتم تمرير النص الفارغ " " إلى مقارنة الإجابة: if(userAnswer == questions[i][2]) حيث يُعتبر إجابة خاطئة حتماً. ولحل المشكلة سيتطلب إعادة هيكلة منطق التحقق بحيث تصبح دالة isValidAnswer() ترجع true لجميع الحالات التي تتطلب البقاء في الحلقة (النص الفارغ، المساعدة، الإدخال غير الصالح) و false فقط للإجابات الصالحة القابلة للتقييم، مع إضافة دالة showHelp() لعرض الخيارات من questions[i][1] عند طلب المساعدة، وإضافة continue بعد كل حالة خاصة للعودة إلى بداية الحلقة دون الخروج إلى فحص صحة الإجابة، بهذا الشكل يتم ضمان أن المستخدم لا يخرج من حلقة السؤال إلا بإدخال إجابة صالحة أو اختيار الخروج من الاختبار كالتالي: else if(userAnswer === "h" || userAnswer === "H"){ alert(`Options:\n1) ${questions[i][1][0]}\n2) ${questions[i][1][1]}\n3) ${questions[i][1][2]}\n4) ${questions[i][1][3]}`); continue; } function isValidAnswer(usrAns){ if(usrAns === "" || usrAns === "h" || usrAns === "H"){ return 1; } if(isNaN(Number(usrAns))){ alert("VALID INPUT") return 1; } return 0; }
-
هذا الكود ينشئ قائمة مهام بسيطة حيث يمكن للمستخدم كتابة مهمة في خانة الإدخال ثم إضافتها بالضغط على الزر. ويتم استخدام useState لحفظ المهام في مصفوفة بحيث يتم عرضها على الشاشة، وأما useRef نستخدمها للوصول مباشرة إلى قيمة الإدخال بدون الحاجة لإعادة تحميل الصفحة أو تحديث الحالة عند كل ضغط على المفاتيح. فمثلا عند الضغط على زر Add يتم أخذ النص من حقل الإدخال باستخدام ref.current.value ثم يضاف إلى القائمة باستخدام setTodos، وبعدها يتم إفراغ حقل الإدخال. والكود يظهر المهام في النهاية باستخدام map داخل قائمة غير مرتبة <ul>.
-
الفرق بين var و let يكمن في أربعة جوانب رئيسية أولا من ناحية النطاق ف var يعمل في كامل الدالة حتى لو تم تعريفه داخل بلوك فرعي مثل الشروط أو الحلقات، بينما let يعمل فقط داخل البلوك الذي عُرِّف فيه فقط، مما يجعله أكثر دقة في التحكم بالمتغيرات. ثانيا عند الاستخدام قبل التعريف ف var لا يظهر خطأ بل يعطي قيمة undefined بسبب خاصية الرفع، أما let فيظهر خطأ لأنه لا يمكن الوصول إليه قبل تعريفه. الفرق الثالث هو أنّ var يسمح بإعادة تعريف نفس المتغير عدة مرات في النطاق الواحد دون مشاكل، بينما let يرفض ذلك ويظهر خطأ لحماية البرنامج من الأخطاء غير المقصودة. وأخيرا في الحلقات var يستخدم نفس المتغير في جميع الدورات مما يسبب مشاكل مع الدوال المؤجلة، أما let فينشئ متغيرا منفصلا لكل دورة وفي البرمجة الحديثة ينصح باستخدام let لكونه أكثر أمانا ووضوحا من var الذي يحمل مشاكل تقنية عديدة. let في JavaScript var في JavaScript
-
هذا الأسلوب قد يكون مرهق وغير فعال، ركز على فهم العناصر والمفاهيم المطروحة في الدروس جيدا، وتدرب عليها عمليا من خلال تطبيقها في مشاريع صغيرة أو تمارين. مع الوقت، ستتراكم معرفتك بشكل طبيعي، و يمكنك الرجوع إلى موسوعة حسوب كمرجع عند الحاجة إلى عنصر معين، مما يساعدك على تعلم كيفية البحث واستخدام الوثائق بشكل صحيح فهي مهارة أساسية في مجال البرمجة، و مع التكرار والتطبيق المستمر ستجد أنك قد حفظت العناصر الأكثر استخداما تلقائيا دون جهد كبير.
- 4 اجابة
-
- 1
-
-
الملفات المحفوظة في المسار /kaggle/working/ تحذف تلقائيا بمجرد إغلاق الجلسة أو إعادة تشغيل النوت بوك، لذا إذا أردت الاحتفاظ بها بشكل دائم يمكنك تحميل الملفات يدويا إلى جهازك باستخدام FileLink أو files.download، أو رفعها كـ Dataset جديد في قسم Datasets الخاص بك على Kaggle، مما يسمح لك بالوصول إليها لاحقا في أي نوت بوك.
- 6 اجابة
-
- 1
-
-
لعمل ذلك فستحتاج إلى استخدام شرط داخل الحلقة for لتحديد ما إذا كان العنصر الحالي هو العنصر المرغوب في تجاهله وفي حالتك هنا يجب أن نقوم بالدوران على عناصر القائمة fruit، وسنتحقق داخل الحلقة مما إذا كان العنصر ليس 'mango' ثم نطبعه وإذا كان 'mango' سنتجاهله ببساطة. هذا المنطق يمكن تنفيذه مباشرة باستخدام الشرط if داخل الحلقة بدون الحاجة إلى break أو continue بهذا الشكل: fruit = ['orange', 'banana', 'mango', 'lemon'] for item in fruit: if item != 'mango': print(item) بهذا التعديل سيتم طباعة 'orange' و'banana' و'lemon' فقط، لأن 'mango' سيتم تخطيه تلقائيا عند التحقق من الشرط.
-
بالنسبة لظهور abc بجانب logo في اقتراحات VS Code فهذا يحدث لأن المحرر يتعامل مع logo كنص عادي Text بدلا من خاصية Vue معرفة، بينما المشكلة الثانية هي ظهور الخطأ التالي: ESLint "'MyNav' is defined but never used" وذلك في ملف MyMain.vue على الرغم من أن الكومبوننت مستخدم فعلا والسبب الجذري لكلا المشكلتين هو أن إضافة Vue - Official مثبتة لكنها معطلة كما يظهر زر "Disable" في الصورة مما يجعل VS Code غير قادر على فهم بنية Vue.js وخصائصها بشكل صحيح. لذا يجب تفعيل الإضافة بالضغط على زر "Enable" ثم إعادة تشغيل VS Code وبعدها ستختفي جميع هذه المشاكل لأن المحرر سيتعرف على logo كخاصية Vue صحيحة ويفهم أن MyNav هو كومبوننت مستخدم.
-
هذا ليس بخطأ فاللون الأزرق هنا لون افتراضي ويعتمد اللون عادة على الثيم الذي تستخدمه في محرر الأكواد. واللون الأزرق طبيعي فهذا تلوين تلقائي من المحرر لكلمات JavaScript المهمة. أما بالنسبة للكود لديك فهو صحيح ولا خطأ أو لبس فيه. يمكنك معرفة المزيد من ويكي حسوب هنا: https://wiki.hsoub.com/JavaScript
-
يعتمد ذلك على ماذا ترغب في التخصص فيه فدورة الذكاء الاصطناعي فمجال الدورة فيها مجال متقدم بعض الشئ وبحاجة إلى معرفة مسبقة بالبرمجة وأي شخص لديه إلمام بأساسيات بايثون ولكن مع ذلك فإن الدورة تقدم مسارا كاملا خاصا بأساسيات بايثون أي أنها وضعت في الحسبان هذا الاحتمال وسيساعدك ذلك المسار في فهم كيفية التعامل مع تطبيقات الذكاء الاصطناعي. أي أنه لا مشكلة في الإشتراك بدورة الذكاء الاصطناعي، لكن ستحتاج إلى فترة لكي تستوعب بعض الأمور بها، وفي البداية يتم شرح أساسيات لغة بايثون ثم شرح قواعد البيانات، لذا فهي تحتوي على شرح جيد للأساسيات، كما أن المدربين سيرافقونك لشرح كل واردة وشاردة. يمكنك الاطلاع أكثر من خلال هذه الإجابات:
-
هذا السطر هنا: mounted(){ this.myRoutes = this.$router.options.routes } يتم تنفيذه بعد تركيب المكون على الصفحة مباشرة أي في دورة حياة المكون، ويهدف إلى جلب جميع المسارات (routes) المعرفة في التطبيق باستخدام Vue Router. ويتم ذلك من خلال الوصول إلى this.$router، وهو كائن الراوتر العام المرتبط بالتطبيق، الذي يدير عملية التوجيه بين الصفحات. هذا الراوتر يتم إنشاؤه عادة في ملف مثل router/index.js ويتم تمرير إعدادات إليه مثل وضع التوجيه (mode)، وقائمة الصفحات (routes) التي تمثل كل مسار يقود إلى مكون معين في واجهة المستخدم. عند الوصول إلى this.$router.options.routes فإننا نقرأ خاصية routes من إعدادات الراوتر (options)، وهي عبارة عن مصفوفة تحتوي على جميع المسارات المعرفة في التطبيق، حيث يحتوي كل عنصر فيها على معلومات مثل path (رابط الصفحة)، name، وcomponent. أما تخزين هذه القائمة في المتغير myRoutes فيتيح استخدام هذه المعلومات لاحقا داخل المكون، مثل عرض قائمة تنقل ديناميكية أو التحقق من وجود صفحات معينة أو تخصيص التوجيه بناء على شروط. بالنسبة ل router هو النظام المسؤول عن التحكم في تنقل المستخدم بين صفحات التطبيق بدون إعادة تحميل الصفحة (SPA)، أما route فهو كائن يمثل الصفحة الحالية التي أنت فيها حاليًا، ويحتوي على معلومات مثل المسار الحالي (this.$route.path)، البارامترات (this.$route.params) والاستعلامات (this.$route.query).
-
11 ساعة أكيد هذا الروتين سيضر بصحتك الجسدية والنفسية وسيؤثر على حياتك بطبيعة الحال. إن كنت مشتركا في إحدى دورات الأكاديمية فلست مجبرا لقضاء 11 ساعة كاملة يوميا لإنهاء الدورات فالدورات ما دمت مشتركا فيها فهي متاحة لك مدى الحياة بما فيها من محتوى وتحديثات وبما فيها من دعم مستمر ومتواصل على مدار الساعة من قبل مدربين مختصين سيرافقونك في رحلتك في أكاديمية حسوب إلى أن تتعلم وتحصل على الشهادة بل سيتم مرافقتك حتى بعد حصولك عليها. لذا لا داعي للعجلة فهذا الروتين الكثيرون بدؤوا به لكنهم توقفوا في مرحلة معينة لأن الحماس الزائد غلب عليهم لذا يجب أن نوازن بين حياتنا وتعلم البرمجة كي نستطيع المواصلة في هذا المجال الواسع. إليك ثلة من الإجابات التي ستعينك على اختيار أفضل طرق دراسة الدورات في أكاديمية حسوب: ومن هنا: و:
-
يمكنك إيجاد شروحات أكثر من خلال التوثيق الرسمي للغة جافا سكريبت على موسوعة ويكي حسوب من هنا: debugger في JavaScript وليس فقط debugger بل مختلف الوسوم والعناصر والدوال وغيرها كلها مشروحة هناك بشكل مبسط مرفقة بأمثلة عملية. بالنسبة ل debugger فهو عبارة عن تعبير برمجي يقوم بتفعيل وضعية التنقيح من خلال إيقاف تشغيل الكود مؤقتا عندما تصل إليها، حتى يتمكن المبرمج من فحص المتغيرات ومعرفة ما يحدث في تلك اللحظة وهذا مفيد عند تتبع الأخطاء لكن لن تعمل إلا إذا كنت تستخدم أداة تنقيح مثل أدوات المطور في المتصفح وإذا لم تكن هناك أداة تنقيح تعمل، فلن يحدث أي شيء عند وصول الكود إلى debugger. وببساطة debugger هو عبارة عن نقطة توقف للمبرمج ليفحص الكود لاحظ هذا المثال: let x = 5; let y = 10; debugger; // هنا سيتوقف الكود لتفحص القيم let z = x + y; console.log(z); هنا يمكنك عندها مشاهدة قيمة x وy قبل أن يحسب z ونستعملها هنا لمعرفة إن كانت المتغيرات فعلا تحمل القيم الصحيحة المتوقعة أم لا وتختلف الاستعمالات حسب الكود الذي ترغب في استخدام المنقّح عليه.
-
حسبما فهمته منك فأنت تريد أن تعرف كيف تنشئ بيانات خاصة بك مثل الاسم أو العمر داخل كود JavaScript ثم ترسل هذه البيانات إلى سيرفر باستخدام دالة fetch وهذا ما يسمى بإرسال طلب HTTP يحتوي على body فيه بيانات تكون من اختيارك إن كان كذلك فسأفترض أنك تريد إرسال تقييم وتعليق حول فيلم معين أولا نبدأ بإنشاء كائن (Object) يحتوي على البيانات الخاصة بهذا التقييم: const review = { movieId: 101, rating: 4.8, comment: "الفيلم جيد." }; الآن نريد إرسال هذه البيانات إلى الخادم عبر fetch نستخدم الطريقة POST، ونحدد أن نوع المحتوى هو JSON، ثم نضع البيانات داخل الخاصية body بعد تحويلها إلى نص باستخدام JSON.stringify: fetch("https://example.com/api/reviews", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(review) }) .then(response => response.json()) .then(result => { console.log("تم إرسال التقييم بنجاح:", result); }) .catch(error => { console.error("حدث خطأ أثناء إرسال التقييم:", error); }); لاحظ هنا أنّ: movieId يحدد معرف الفيلم الذي يتم تقييمه. rating هو التقييم الرقمي مثلا من 5. comment هو تعليق المستخدم على الفيلم.
-
المهارات الحقيقية المطلوبة الآن في الذكاء الاصطناعي تشمل بشكل أكبر بناء أنظمة ال LLM من الصفر وليس مجرد استخدام APIs، وتطوير نماذج multimodal، وهندسة ال MLOps للإنتاج الفعلي، والأهم هو فهم الرياضيات وراء النماذج وليس مجرد استخدام مكتبات جاهزة. أما في علوم البيانات نجد الإحصاء المتقدم والتجريب A/B testing، وبناء data pipelines معقدة، والأهم هنا هو القدرة على حل مشاكل الأعمال الحقيقية وليس مجرد عمل dashboards جميلة. والمطلوب حقا هو خبرة في مجال صناعي محدد مع مهارات تقنية عميقة، لأن السوق مشبع بالأفراد الذين يعرفون Python وpandas فقط، لكن النادر هو الذي يفهم البرمجة ويطبق ال AI بشكل عملي ومربح.
-
السلام عليكم خاصية تحميل الفيديو لم يتم إضافتها من قبل الأكاديمية لعدة أسباب أهمها لضمان عدم نشر مقاطع الدورات في مواقع مختلفة غير منصة الأكاديمية ولتفادي تعريضها للقرصنة والسرقة لذا فهذا الأمر حاليا غير متوفر ففي حالة انتشار المقاطع وسرقتها يكون فيه ظلم وإجحاف في حق الطلاب. في حال كان لديك بطئ في تشغيل المقاطع يمكنك ضبط جودة الفيديو لجودة مناسبة لك وإيقافه بعض الوقت إلى حين تحميله ثم المشاهدة بعد ذلك بأريحية يمكنك الاطلاع أكثر على الأمر من هنا:
-
هذه الدوال يطلق عليها تسمية دوال دورة حياة المكونات فمثلا beforeCreate تعتبر أول دالة تُستدعى قبل إنشاء المكون تماماً، حيث لا تكون البيانات أو الطرق متاحة بعد، وتُستخدم لإعداد plugins خارجية أو HTTP interceptors أما created تُستدعى بعد تهيئة البيانات لكن قبل إدراج المكون في DOM، وهي المكان المثالي لاستدعاء APIs وجلب البيانات الأولية. في حين beforeMount تحدث قبل إدراج المكون في DOM مباشرة ونادراً ما تُستخدم. بخصوص mounted تُستدعى بعد إدراج المكون في DOM وهي النقطة المثالية للتفاعل مع عناصر DOM وتهيئة المكتبات الخارجية وبدء المؤقتات بينما beforeUpdate تحدث عند تغيير البيانات وقبل إعادة رسم DOM، مفيدة لحفظ حالة العناصر مثل scroll position وأما updated فتُستدعى بعد تحديث DOM ويجب تجنب تعديل البيانات فيها لمنع الحلقات اللانهائية. beforeUnmount (أو beforeDestroy في نسخة Vue 2) هي الفرصة الأخيرة لتنظيف الموارد قبل إزالة المكون، حيث تُستخدم لإلغاء المؤقتات وإزالة event listeners وإغلاق WebSocket connections. unmounted أو destroyed في Vue 2 كما تُستدعى بعد إزالة المكون تماماً وتُستخدم للتنظيف النهائي وإرسال analytics events.
-
يمكننا توضيح الفرق بين Vue.js و Nuxt.js بشكل مبسط أكثر تخيل معي أن Vue هو محرك سيارة قوي ومرن للغاية، بينما Nuxt هو السيارة الكاملة والجاهزة للقيادة، والمصممة بأفضل شكل ممكن حول هذا المحرك. Vue.js في جوهره هو "مكتبة برمجية" أو "إطار عمل" أساسي لبناء واجهات المستخدم، فهو يمنحنا الأدوات الأساسية لرسم المكونات على الشاشة وتحديثها بناء على البيانات، ولكنه غير ملزم بهيكل معين. لاحظ هنا أن هذا يعني أنك عندما تبدأ مشروع Vue خالص، عليك أن تقرر بنفسك وتعدّ كل شيء يدويا من كيفية تنظيم الملفات، وكيفية التعامل مع التوجيه (routing) باستخدام مكتبة مثل Vue Router، وكيفية إدارة الحالة العامة للتطبيق (state management) باستخدام Pinia أو Vuex، وكيفية تحسين الأداء ومحركات البحث (SEO). هذه المرونة الكاملة تجعله ممتازًا للمشاريع الصغيرة أو لإضافة أجزاء تفاعلية داخل تطبيق موجود بالفعل. أما Nuxt.js فهو ليس بديلا ل Vue، بل هو "إطار عمل فوق إطار عمل آخر" (Meta-framework) مبني على Vue. لأنه يأتي بهيكل جاهز ومنظّم ومجموعة هائلة من الميزات القوية المدمجة مسبقا والتي تحل معظم المشاكل المعقدة التي تواجه المطورين. أهم هذه الميزات هي "التصيير من جانب الخادم" (Server-Side Rendering - SSR) و"توليد المواقع الثابتة" (Static Site Generation - SSG)، وهما ميزتان ضروريتان لتحسين أداء التحميل الأولي وتحسين ظهور الموقع في محركات البحث (SEO)، وهو أمر صعب تحقيقه في Vue وحده. كما يوفر Nuxt نظام توجيه (routing) تلقائي يعتمد على أسماء الملفات، ونظام استيراد تلقائي للمكونات، وأدوات مدمجة لجلب البيانات من الخوادم، وبنية ملفات موحدة تسهل العمل على المشاريع الكبيرة والتعاون بين الفرق. إذا للإجابة على سؤال من الأفضل فهذا يعتمد كليا على مشروعك ففي حال كنت تبني مشروعا صغيرا جدا، أو أداة بسيطة، أو تحتاج إلى أقصى درجات المرونة لتصميم بنية مخصصة بالكامل، فإن Vue وحده قد يكون كافيا لتحقيق ذلك لكن بالنسبة لـ 95% من المشاريع الحديثة والكاملة مثل المواقع التجارية، المدونات، لوحات التحكم، والمتاجر الإلكترونية فإن Nuxt هو الخيار الأفضل والأكثر احترافية. لكونه يسرّع عملية التطوير بشكل هائل، ويفرض أفضل الممارسات، ويحل مشاكل SEO والأداء المعقدة بشكل تلقائي، ويمنح تجربة تطوير متكاملة وممتعة.
-
بداية فلاجتياز الامتحان يجب تحقيق هذه الشروط: إتمام أربعة مسارات تعليمية على الأقل التطبيق العملي مع المدرب، والاحتفاظ بالمشاريع العملية الناتجة لإرسالها للمراجعة رفع المشاريع على حسابك على GitHub أولا بأول لمشاركتها معنا بعد تحقيقك لها سيتعين عليك التواصل مع مركز المساعدة لإخبارهم برغبتك في إجراء الامتحان مع تزويدهم بروابط مشاريعك التي طبقتها أثناء الدورة ويجب أن تكون قد طبقت المشاريع مع المدرب أثناء الدورة، ولا يمكن اجراء امتحان بمشاهدة المحتوى فقط. بعد ذلك سيحددون لك موعد لاجراء محادثة صوتية لمدة 30 دقيقة يطرح المدرب فيها أسئلة متعلقة بالدورة ويناقش معك ما نفذته خلالها. وبالنسبة لمشروع التخرج سيحدد لك المدرب مشروعًا مرتبطًا بما تعلمته أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع الى أسبوعين. ثم سيراجع المدرب المشروع الذي أنجزته، وإن سارت جميع الخطوات السابقة بشكل صحيح، ستتخرجين وتحصلين على الشهادة أو يرشدك المدرّب لأماكن القصور ويطلب منك تداركها ثم التواصل مع مركز المساعدة من جديد.
-
مكتبة mpdf هي مكتبة لا تنتمي رسميا إلى Laravel لكنها تعمل معه دون مشاكل. ومن مميزاتها الرئيسية أنها تدعم الكتابة بالعربية بشكل صحيح، بما في ذلك الحروف المتصلة والاتجاه من اليمين إلى اليسار (RTL) لذا لا تحتاج إلى إعدادات معقدة، فقط اختر خطا يدعم العربية مثل Amiri أو Cairo وأضفه داخل الكود بالنسبة لتثبيت المكتبة فهو يتم عبر Composer كالتالي: composer require mpdf/mpdf ثم في كودك: $mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'default_font' => 'Amiri']); $mpdf->WriteHTML('<div style="direction: rtl; font-family: Amiri;">هذا نص عربي</div>'); $mpdf->Output(); والمميز هنا أنك لا تحتاج إلى باقات Laravel إضافية، فقط تحتاج لاستدعاء الكلاس مباشرة وهذا ما سيمنحك الأداء السريع والدعم لل CSS جيد، والمخرجات تكون نظيفة ومرتبة حتى في الجداول والقوائم. فهذه المكتبة مناسبة أيضا للتقارير وحتى لإعداد الفواتير، أو أي مستند رسمي باللغة العربية بعكس مكتبات أخرى مثل dompdf التي قد تواجهك مشاكل في فصل الحروف أو المحاذاة.
