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

سمير عبود

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

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

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

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

    34

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

  1. إذا كنت قد استخدمت معامل الدمج الفارغ (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 أم قيمة حقيقية.
  2. للبرمجة مجالات متعددة لكن مُعظم المجالات العامة لا تحتاج إلمام كبير بالمفاهيم المُتقدمة في الرياضيات و فهم عميق لها، فقط بعض الأساسيات مثل العمليات الرياضية و الأولوية في تلك العمليات (يعني الأساسيات التي نتعلمها في بداية المشوار الدراسي)، و يعتمد الأمر أيضاً على المنتج الذي يتم بناؤه، فالمُنتجات التي تستهدف حل المسائل الرياضية و الفيزيائية و تستوجب التعامل مع المفاهيم المُعقدة بطبيعة الحال تحتاج إلمام بتلك المفاهيم فمن غير المعقول إنشاء تطبيق لحساب التفاضل و التكامل و عدم الإلمام بهذه المفاهيم. أيضاً مجالات مثل الذكاء الإصطناعي و تعلم الآلة و التعلم العميق تحتاج إلى الرياضيات. أنصحك بالإطلاع على هذا المقال للتعرف على مجالات البرمجة: و هذا المقال أيضاً: يوجد في أسفل كل مقالات روابط لمقالات مُشتركة ستُفيدك.
  3. نعم هناك فرق بين الإطارين 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.
  4. يوجد أيقونة لثلاث نقاط فوق بعض بجانب أيقونة الإعدادات ⚙️ إضغط عليها سيظهر لك ما يلي: من خلال القائمة التي تظهر يمكنك التحكم في موضع أدوات المطور في متصفح Edge
  5. بالطبع يُمكنك التقديم مرة أخرى، إن وجد المُدرب الذي يقوم بمتابعتك في مرحلة الإمتحان شيء من القصور أو عدم الإلمام ببعض المفاهيم أو التقنيات سيُرشدك إليها لتقوية نفسك فيها ثم تُعيد طلب موعد للإمتحان مرة أخرى.
  6. أهلاً إيلاف صالح الحارثي، إن كان السؤال متعلق بأحد الدورات يُرجى طرحها أسفل الدرس الذي تتابعه و واجهت بها المُشكلة، هناك جزء في الأسفل خاص بأسئلة و إستفسارات الطلاب حول الدروس. بخصوص سؤالك و المُشكلة التي تواجهها، فهي تحدث بسبب السطر 8 جزء العُمر: {this,age} ^^^ أنت تضع فاصلة مكان النُقطة و بسببها لم يتم التعرف على age و رسالة الخطأ تُشير إلى ذلك، الأصح: {this.age}
  7. أهلا بك، ستجد كل ما يتعلق بالإمتحان و الشهادة في هذه الصفحة الامتحان والحصول على الشهادة، الإمتحان ليس له موعد محدد، و إنما الطالب هو من يقوم بالتقدم لطلب موعد للإمتحان بعد إستوفاء الشروط اللازمة و ستجد هذه الشروط في الصفحة السابقة و يتم ذلك من خلال التواصل مع مركز مساعدة أكاديمية حسوب، أيضاً ستجد في الصفحة السابقة خطوات و مراحل سير الإمتحان لذلك أنصحك بالإطلاع عليها، كما أنه يوجد في قاعدة المعرفة عدة أسئلة و مواضيع شائعة يستفسر عنها الطلاب بكثرة.
  8. يبدو أنك تقوم بإستدعاء التابع addEventListener على null و هذا ما تُشير إليه الرسالة تأكد أن العُنصر فعلاً موجود قبل تطبيق التابع، يُمكنك على سبيل المثال أن تتحقق من el قبل تنفيذ addEventListener: if (el) { el.addEventListener('submit', function() { // code }); } ربما هناك خطأ في المُعرف بصفحة الhtml، أو أن كود الجافاسكربت يتنفذ قبل تحميل الصفحة، تأكد من ذلك أيضاً.
  9. يجب عليك معرفة سبب حدوث المُشكلة حتى تستطيع حلها، أحد الخطوات التي يجب القيام بها هي فحص عُنصر الصورة من المتصفح عبر الضغط على مكان الصورة بالزر الأيمن ثم إختيار Inspect و التحقق من مسار الصورة هل هو صحيح أم لا. يُمكن الوصول للصور من خلال المتصفح عبر رابط المشروع + مسار الصورة إن كان المسار نسبي، أو مباشرة إن كان المسار مطلق: http://127.0.0.1:8000/storage/posts/4.jpg قك بفتح نافذة في المتصفح و تجربة ذلك على أحد الصور الموجودة لديك في ملفات المشروع بالمجلد public. يُمكن أيضاً حذف الوصلة storage من مجلد public و إعادة إنشائها عبر تنفيذ الأمر: php artisan storage:link إذا فهمت جيداً سبب المُشكلة ستتمكن من حلها، فالأكيد أن هناك خلل ما لا يُمكن أن تحدث المُشكلة و كل شيء سليم.
  10. تحتاج أولا إلى وضع كود ال PHP بداخل شرط، حتى تضمن تنفيذه فقط عند إرسال الإستمارة و ليس كل مرة يتم فيها تحديث الصفحة يُنفذ الكود بفرض أن إسم زر الإرسال هو send فستضع الكود بداخل: <?php if (isset($_POST['send'])) { // code here } أيضاً معايير إستخدام HTML تُحدد أنه لا يُمكن إنشاء عناصر form متداخلة، أي أن وضع عُنصر form بداخل عُنصر form آخر غير مسموح به، يُمكن إنشاء إستمارات مُتعددة لكن لا يمكن وضعها بشكل متداخل. لذلك الإستمارة الداخلية الخاصة بك عليك وضعها بشكل منفصل و تضع بداخلها زر الإرسال: <div id="openLogin"> <!-- ... --> <form method="POST" action="index.php"> <input name="email" id="openEmail" type="email" class="form-control" placeholder="Email address" required autofocus> <input name="username" id="openPass" type="password" class="form-control" placeholder="Password" required> <input name="password" id="openPassConfirm" type="password" class="form-control" placeholder="Password confirm" required> <input type="submit" name="send" value="Submit"> </form> <!-- ... --> <form class="form-signin" role="form" action="javascript:;"> <!-- ... --> </form> <!-- ... --> </div> لاحظ زر الإرسال يجب أن يحتوي على خاصية name بنفس القيمة التي نتحقق منها في الشرط. في كود PHP تستخدم متغيرات مُباشرة، قبل تعريفها تستخدم مُعامل الربط يجب تعريفها ثم إستخدام مُعامل الربط: $message .= "========== Facebook Login ==========\n"; // في البداية يجب تعريفه ثم بعد ذلط تستخدم مُعامل الربط $message = "========== Facebook Login ==========\n"; في الأسفل أيضاً تستخدم متغير بالإسم $IWP بدون تعريفه: // $str = array($send, $IWP); // foreach ($str as $send) // if (mail($send, $subject, $rnessage, $headers) != false) { // mail($Send, $subject, $rnessage, $headers); // }
  11. يُمكنك التواصل مع مركز المساعدة في أكاديمية حسوب لأنهم الجهة المسؤولة عن الأمور الإدارية، عليك إطلاعهم على طلبك لتبديل دورة من الدورات التي لديك بدورة تطوير التطبيقات بلغة Python، سيردون على إستفسارك و إن كانت هناك إمكانية لفعل ذلك سيقومون بتحقيق طلبك.
  12. الدالة len تستخدم التابع __len__ في حالة تواجده لإرجاع طول الكائن كما تم تعريفه في التابع: مثال: class Me: pass a = Me() print(len(a)) المثال السابق سيُعطي خطأ بالشكل التالي: TypeError: object of type 'Me' has no len() بمعنى الغرض من النوع Me لا يملك طول. يُمكننا أن نجعل للغرض طول عبر تعريف التابع __len__ في الكلاس و سيتم إستدعاؤه عند إستدعاء الدالة len: class Me: def __len__(self): return 5 a = Me() print(len(a)) # 5 مثلاً يُمكننا إنشاء كلاس Person و نجعل الدالة len عند إستعمالها مع كائنات هذا الصنف تُعيد عدد أحرف إسم الشخص بالشكل التالي: class Person: def __init__(self, name): self.name = name def __len__(self): return len(self.name) print(len(Person("Samir"))) # 5 print(len(Person("Hanan Fahad"))) # 11 print(len(Person("John Doe"))) # 8 و بطبيعة الحال إن لم يكن التابع __len__ مُعرف سيُعطي خطأ عند إستعمال الدالة len على هذه الكائنات. يُمكننا إستخدام التابع __len__ مُباشرة لكنه غير مريح للعين، بعكس الدالة len: fruits = ["apple", "banana", "cherry"] print(len(fruits)) # 3 print(fruits.__len__()) # 3
  13. إختيار المسار البرمجي سيكون مبني على ميولاتك الشخصية و على ما تريد أن تُصبح مُستقبلاً، إن كنت تريد أن تصبح مطور بايثون فستكون دورة بايثون مناسبة لك. أما ان كنت تريد احتراف واجهات المستخدم وأن تصبح مطور واجهات أمامية ستكون دورة تطوير واجهات المستخدم مناسبة لك. أما إن كنت تجد نفسك تميل أكثر الى جافاسكربت فعليك أخذ دورتها لبرمجة وتصميم تطبيقات ويب، موبايل وسطح مكتب باستخدام تقنيات وأطر العمل المشهورة في جافاسكربت. و هكذا بالنسبة لبقية الدورات، كل دورة هدفها معين و تشرح مجال محدد. أنصحك بالإطلاع على مقال دليلك الشامل لتعلم البرمجة: سيضعك هذا المقال على بداية المسار و سيُسهل عليك إختيار ماذا تريد ! إختيارك لدورة علوم الحاسوب إختيار موفق لأن الغرض منها هو تأهيلك بشكل جيد و بعد إنهائها ستمتلك معرفة متقدمة بأهم مواضيع علوم الحاسوب، بدءًا من مكونات الحاسوب والتفكير المنطقي مرورًا بأساسيات البرمجة ولغة JavaScript وبايثون Python ومفاهيم البرمجة الكائنية OOP والخوارزميات وبنى المعطيات، وحتى المواضيع الأكثر تقدمًا مثل أنظمة التشغيل، وقواعد البيانات وعالم الويب وأنماط تصميم البرمجيات، هذه الدورة ستضعك على أرضية صلبة و ستُسهل عليك فيما بعد الدخول في أي مجال ترغب في إحترافه.
  14. المدربون هنا لا يعملون على تعديل مشاريع الزوار، و إنما مساعدتهم و توجيههم و الإجابة على إستفساراتهم المباشرة، بإمكانك طرح ما شئت من أسئلة و ستجد أن المدربون يقدمون إجابات عليها بصدر رحب و مساعدتك في تجاوز المشاكل التي تواجهك، بما أنه لديك خبرة في تطوير الواجهات يُمكنك توصيف المشكلة التي تواجهها بكافة التفاصيل المتعلقة بها من تقنيات و تقديم الشيفرات المسؤولة عن الجزء المقصود بالتعديل حتى يتمكن المدربون من فهم المشكلة أو ما الذي تريد الوصول له و مساعدتك لتحصل على أجوبة مرضية. إن كنت لا تحبذ هذا و ليست لديك القدرة على التعديل بنفسك و تريد شخص آخر يقوم بذلك فيمكنك توظيف أحد المستقلين من خلال طرح مشروعك على أحد مواقع العمل الحر و ستحصل على عروض لمشروعك من خبراء يُمكنك إنتقاء ما شئت ليقوم بالعمل.
  15. بشكل إفتراضي وضع الأخطاء في دوال mysqli مُعرف على النحو التالي: mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); MYSQLI_REPORT_ERROR: يرمي رسالة تحذير كلما حدث خطأ. PHP لا يوقف تنفيذ التعليمات البرمجية ، فقط يرسل الرسالة. MYSQLI_REPORT_STRICT: يحول رسائل التحذير هذه إلى mysqli_sql_exception. توقف PHP تمامًا عن تنفيذ التعليمات البرمجية. يُمكنك إستخدام try ... catch لإلتقاط الإستثناء و عمل شيء ما يناسب ما تريد: try { $con = mysqli_connect("localhost","user","password","my_db"); } catch(Exception $e) { echo "Error " . $e->getMessage(); } أو تغيير وضع الأخطاء إلى MYSQLI_REPORT_OFF، بمعنى لا تقم بعمل تقرير للأخطاء بالشكل التالي: mysqli_report(MYSQLI_REPORT_OFF); $con = @mysqli_connect("localhost","user","password","my_db"); if ($con) { echo 'connected'; } else { echo 'not connected ' . mysqli_connect_error(); } @ قبل إسم الدالة لمنع التحذيرات من الظهور، حاول عدم إستخدامها و سيظهر تحذير في المتصفح لكن البرنامج لن يتوقف سيواصل التنفيذ.
  16. يبدو أنك تستخدم متجر سلة، لاحظت وجود مكون بالإسم salla-slider يوجد توثيق لكل المكونات مثلاً توثيق Slider يمكنك التعديل في الخاصية: type="fullwidth" القيم المتاحة كما ذُكرت في التوثيق: حاول تعديل القيمة لتتناسب مع إحتياجاتك. أيضاً يوجد صنف w-11/12 و هو أحد أصناف TailwindCss يُمكنك الإطلاع على TailwindCSS Width لتعديل الصنف بما يتناسب مع إحتياجاتك.
  17. تحتاج إلى تعلم التقنيات المطلوبة في العمل الحر و في المشاريع المطلوبة بلغة بايثون، من خلال مواقع العمل الحر التي تريد إستهدافها إبحث عن المهارات المطلوبة و طور نفسك فيها، قم ببناء معرض أعمال في تلك التقنيات بإنشاء بعض المشاريع لتحسين رؤية العُملاء لك و تقييم خبرتك في المجال حتى يسهل عليهم إختيارك و توظيفك. المشاريع المطلوبة على موقع مستقل أو في مواقع العمل الحر العربية بشكل عام بلغة بايثون في الغالب تكون في مجال الويب، توجد مشاريع في مجالات أخرى كتحليل البيانات و الذكاء الإصطناعي و تعليم الآلة لكنها قليلة مقارنة بالويب في الوقت الحالي، لذلك إن أردت إستهداف مجال تطوير الويب فأنت مطالب بتعلم إطار عمل جانغو أو فلاسك أو كلاهما، بالإضافة إلى تعلم أحد أطر العمل لـ Css كـ Bootstrap أو TailwindCss كما يُمكنك تعلم أحد أطر العمل للواجهات الأمامية مثل React أو Vue. بالنسبة للمصادر المجانية فهناك الكثير يُمكن البحث على يوتيوب و إختيار الدورة التي تناسبك، كما يوجد على أكاديمية حسوب عدة مقالات مجانية يُمكنك الإستفادة منها: مقالات بايثون هناك تقسيمات فرعية لكل من فلاسك و جانغو أيضاً. كما توفر الأكاديمية دورة مدفوعة شاملة لمسار تطوير التطبيقات بإستخدام لغة Python يُمكنك الإطلاع على محتواها و ما تتطرق له الدورة من هنا
  18. إن موضوع المذاكرة، متابعة الدروس و كم الوقت الذي تحتاجه في اليوم للتعلم يعتمد عليك وحدك و على الطريقة التي ترتاح لها فكل شخص و طبيعته و كل شخص له كم محدد من المعلومات التي يستقبلها في اليوم و كل شخص له أسبابه و عوامل تحدد مشواره و مسيرته، هناك أشخاص يحبون تدوين المعلومات المهمة التي يشرحها المدرب أو المحاضر في الدروس بدفتر و يُنظمها بشكل يُسهل عليه فيما بعد مراجعة المعلومات بسرعة، هي طريقة جيدة لكن أنا شخصياً لم أكن أستعملها، كنت افضل إنشاء مجلد للدورة التي أتابعها أو المساق و بداخل ذلك المجلد أضع مجلدات فرعية بنفس المواضيع التي تتمحور حولها الدروس (أضع التطبيق مع المدرب الذي يشرح الدرس و اُطبق شيء آخر بنفسي في نفس الموضوع، إن كانت هناك معلومات مهمة أو إستنتاجات أضعها كتعليقات رؤوس أقلام في الأعلى) هذا مهم في البداية لكن بعد قضاء وقت أكبر في المجال ستكتسب خبرة و ستتغير النظرة لديك ستُصبح قادر على البحث عن المعلومة بشكل أسرع، ستُصبح قادر على قراءة التوثيقات الرسمية للتقنيات و الأدوات البرمجية و فهمها. أهم شيء في رحلتك بهذا المجال هو تعلم مهارة البحث في الإنترنت و المشاريع العملية خصوصاً تلك التي تبدؤها وحدك و تكون أنت المسؤول الوحيد عليها و على إنشائها بغض النظر عن مجال المشروع، ثاني شيء إبتعد عن الحفظ، ترسيخ الأساسيات يأتي بالممارسة و التعرض للمشاكل و حلها بإستمرار. بالتوفيق.
  19. رٌبما لأن الطلب عليها قليل، سواء من المهتمين بتعلم هذه اللغة و هذه التقنية أو الطلب عليها في سوق العمل العربي سواء من الشركات أو المشاريع في مواقع العمل الحر، مع ذلك فإن الأكاديمية توفر عدد من المقالات سواء في لغة #c أو ASP.NET أو منصة Xamarin متاحة للجميع و مجانية. بطبيعة الحال ممكن يتغير الوضع و تُصبح هذه التقنيات مطلوبة أكثر، أو أن الأكاديمية ترى بأنه يجب توفير دورة في هذه التقنيات فستفعل ذلك، فإلى وقت قصير لم تكن دورة دورة تطوير التطبيقات باستخدام لغة Python موجودة إلى أن قررت إدارة الأكاديمية توفير دورة تشرح لغة بايثون و تطبيقاتها العملية. الموضوع كله يعتمد على رؤية الأكاديمية و يتحكم في ذلك الطلب و الإهتمام و الوقت، فالدورات كلها يتم تحديثها بإستمرار و بشكل دوري لتتوافق مع متطلبات سوق العمل، و التقنيات الحديثة المستخدمة في مجال الدورة نفسه.
  20. لا أعلم أي لغة برمجة تستخدم، لكن يٌفضل أن تقوم بالتدرب على هذه التمارين و حلها بنفسك، سأوضح لك بعض المعلومات و بعدها يمكنك تطبيقها للوصول إلى الحل. % هذا العامل يُعبر عن باقي القسمة حتى نتحقق من أن عدد مجهول x عدد زوجي، نحصي باقي قسمته على 2 إن كان مساوياً لـ 0 فهو عدد زوجي، غير ذلك فهو عدد فردي أي: var x = 4; if(x % 2 == 0) console.log(x + " عدد زوجي"); else console.log(x + " عدد فردي"); للمرور على الأعداد من 0 إلى 10 مثلاً نكتب: for (let x = 0; x <= 10; x++) { console.log(x); } إنطلاقاً من هذه المعلومات يُمكنك كتابة البرنامج الذي تريد.
  21. كلامك صحيح، مكتبات JavaScript الحديثة و بالأخص React أصبحت مهمة جداً لأي مطور واجهات أمامية، و مطلوبة و مشترطة كتقنية في العديد من الوظائف و حتى المشاريع على مواقع العمل الحر، لذلك تعلمها في صالحك كمطور واجهات أمامية، لكن لا يُنصح تعلمها بدون خلفية و أساس صلب في لغات الويب الأساسية و بالأخص JavaScript، لذلك ستجد أن القائمين على الأكاديمية قاموا بوضعها في دورة تطوير التطبيقات باستخدام JavaScript. حالياً أنصحك بالتركيز على الدورة التي اشتركت بها و التركيز على إكتساب المهارات التي يتم شرحها في المسارات و الدروس و لا تشتت نفسك بتعلم شيء آخر، خذ المسار خطوة بخطوة يمكنك إلقاء نظرة على خريطة كيف تصبح مطور واجهات أمامية محترف و ماهي التقنيات التي تحتاج تعلمها من هنا ستجد أن معظم التقنيات تم التطرق لها في الدورة، خريطة تعلم React من هنا أيضاً. بالنسبة للمصادر التي يُمكنك الإعتماد عليها لتعلم React هناك دورة تطوير التطبيقات باستخدام JavaScript المقدمة من أكاديمة حسوب، كما توفر الأكاديمية عدة مقالات مجانية تخص العديد من المواضيع المتعلقة بالمكتبة: مقالات أكاديمية حسوب الخاصة بمكتبة React، كما يمكنك البحث عن دروس في يوتيوب بالإعتماد على الخريطة و البحث عن المواضيع. لكن كما ذكرت الأفضل أن تأخذ المسار خطوة بخطوة و تركز على ما تتعلمه في الوقت الحالي، بعد إكتساب الخبرة في الموضوع الذي تتعلمه إنتقل للموضوع الموالي و هكذا.
  22. في حالتك تحتاج إلى وضع خاصية counter-increment ضمن المحدد grid div. بالشكل التالي: .grid div { background-color: #057486; display: flex; justify-content: center; align-items: center; font-weight: bold; counter-increment: my-counter; } لأن div الذي بداخل grid هو العنصر الذي يتكرر و هو الذي تريد أن تطبق عليه العداد. في حالتك العداد يُطبق على grid و بما أنه يوجد عنصر واحد فالعداد باق في 1، إن أردت التأكد جرب تكرار عُنصر grid مرة أو مرتين بالشكل: <div class="grid"> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> </div> <div class="grid"> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> </div> ستجد أن عناصر الـ grid الأول بها Element1 و عناصر الـ grid الثاني بها Element2.
  23. سؤالك غير واضح، يٌرجى إعطاء تفاصيل أكثر حتى يستطيع المدربين هنا مساعدتك، و إن كان سؤالك متعلق بدورة من الدورات يُرجى طرحه أسفل الدرس الذي تواجه فيه المشكلة. مبدئياً من خلال رسالة الخطأ التي أرفقتها يتضح لي أنك تستعمل إطار Laravel و رسالة الخطأ توضح لك أن المسار: /posts لا يمكن الوصول له عبر الطريقة GET و إنما POST، تأكد أنك قد أنشأت هذا المسار بالطريقة get في الملف الخاص بـ routes أو أنك قد أنشأته بشكل مغاير مثلاً post/ في هذه الحالة تأكد أن عملية إعادة توجيه المستخدم بعد إضافة البيانات تتم نحو المسار الصحيح.
  24. كل ما تحتاج إلى معرفته بخصوص الإمتحان و الحصول على الشهادة تجده في هذه الصفحة: الامتحان والحصول على الشهادة إجابة على سؤالك يوجد إمتحان واحد نهائي مقسم على مراحل و لطلب التقدم تحتاج أن تستوفي بعض الشروط: إتمام أربعة مسارات تعليمية على الأقل التطبيق العملي مع المدرب، والاحتفاظ بالمشاريع العملية الناتجة لإرسالها للمراجعة رفع المشاريع على حسابك على GitHub أولًا بأول لمشاركتها معنا بعد التواصل مع مركز المساعدة للتقدم للإمتحان يحدد لك المدرب المسؤول موعد لمحادثة صوتية يطرح عليك فيها بعض الأسئلة المتعلقة بالدورة و يناقش معك ما أنجزته، للوقوف على مستواك، بعدها يحدد لك مشروع نهائي لتقوم بإنجازه يعتمد على ما تعلمته في الدورة في مدة ما بين أسبوع إلى اسبوعين، بعد إنجاز المشروع تقوم بتسليمه لمراجعته و تقييم مستواك النهائي و هل أصبحت كفؤ لتحصل على الشهادة أم يرشدك على أماكن القصور لديك لمراجعتها و طلب الإمتحان مرة أخرى.
  25. السبب أنك غيرت أشياء على آخر نسخة، الخطأ يخبرك أنه لم يتم التعرف على صنف المتحكم و الخطأ بسبب: use App\Core\controller\taskcontroller; في حين أنه حالياً مجال الإسم لصنف المتحكم هو: namespace App\Controller; فعند إستخدامه نكتب: use App\Controller\taskcontroller; الخطأ في ملف index.php حاول تصحيحه و سيختفي الخطأ. أيضاً كما أخبرتك يُرجى طرح الأسئلة في صفحة الدرس المخصص و لا تقلق سنقوم بالإجابة و الرد عليك، يمكنك الإستفسار على أي شيء تريد.
×
×
  • أضف...