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

Adnane Kadri

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

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

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

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

    52

كل منشورات العضو Adnane Kadri

  1. جرب تحديد عنصر الفيديو المستهدف ثم قم بايقافه عن طريق الاستعانة بالوظيفة pause: let targetVideo = document.querySelector('#myVideo') targetVideo.pause() قد تحتاج ايضا اعادة عداد الوقت الى الصفر: targetVideo.currentTime = 0 العنصر <video>
  2. يمكنك معاملة هاته الدالة كميزة. واختبارها كحالة استخدام عن طريق اختبارات الميزة في لارافيل. لنقل ان الدالة الخاصة بك يتم الاشارة اليها عن طريق المسار: Route::get('/example/{byear}' , [MyController::class ,'countAge']) ستحتاج اول الأمر انشاء حالة اختبار Test case عن طريق تنفيذ: php artisan make:test CountAgeTest ستلاحظ انشاء ملف جديد بداخل مجلد tests/Feature الخاص بتطبيق لديك. محتوى الملف سيكون مشابها لـ: <?php namespace Tests\Feature; use PHPUnit\Framework\TestCase; class CountAgeTest extends TestCase { /** * A basic test example. * * @return void */ public function test_basic_test() { $this->assertTrue(true); } } في العادة يعبر الصنف CountAgeTest عن مجموع حالات الاستخدام التي تندرج تحت هذا الهدف وهو حساب العمر. فعلى سبيل المثال يتفرع عن هذا الهدف: حالة ان يتم تقديم سنة اكبر من الحالية (2040 مثلا)، كيف نتوقع ان يتم التعامل معها؟ حالة ان يتم تقديم عدد سالب. حالة ان يتم تقديم سلسلة نصية بدل عدد. حالة ان يتم تقديم عدد عشري عوض عدد صحيح موجب. كل هاته الحالات تسمى حالات استخدام تتبع عن الهدف الأساسي الذي هو حساب العمر. (قد يمثل Task او Goal في مخططات حالات الاستخدام ان كنت معتادا على العمل في فرق). فأنت سنحتاج نمذجة هاته الحالات ومن بينها الحالة التي وصفتها. لنأخذ الخاصة بك كمثال: في لارافيل يتم وصف حالات الاختبار كتوابع تبدأ اما ب test : <?php namespace Tests\Feature; use PHPUnit\Framework\TestCase; class CountAgeTest extends TestCase { /** * */ public function test_if_age_can_be_counted() { // } } او مميزة بتعليق @test ويسمى annotation: <?php namespace Tests\Feature; use PHPUnit\Framework\TestCase; class CountAgeTest extends TestCase { /** @test*/ public function age_can_be_counted() { // } } بنية حالة الاختبار تتبع غالبا نمطا مشابها: /** @test*/ public function age_can_be_counted() { # 1 - تحضير البيانات # 2 - القيام بال action والخروج بنتيجة # 3 - استعمال التوكيدات assertions للتأكد من حصول شيء معين } مثال: /** @test*/ public function age_can_be_counted() { # 1 - تحضير البيانات $exampleByear = 1960; $ageNow = 62; # 2 - القيام بال action والخروج بنتيجة $response = $this->get('/example/'.$exampleByear); # 3 - استعمال التوكيدات assertions للتأكد من حصول شيء معين $response->assertStatus(200); // التأكد من ان كود حالة الطلب يعبر عن طلب ناجح $this->assertEquals( $response->getContent(), $ageNow ) } لاحظ استعمال التوكيد assertStatus و assertEquals وهما تابعان يوفرهما لارافيل ضمن سلسلة من التوابع يمكن الاستفادة منها لاختبار نتائج مختلفة. أخيرا، لن تحتاج الا طباعة الأمر: php artisan test أو: vendor/bin/phpunit أو: phpunit لتشغيل الاختبارات، خرج الأمر هو ما سيعبر عن اما نجاح او فشل حالة الاختبار. مقدمة إلى التعامل مع الاختبارات في Laravel
  3. يمكنك الاستعانة بمفهوم جدولة المهام Task scheduling و طوابير الانتظار Queue لتنفيذ او جدولة مهمة اسناد الراكب الى السائق المستهدف والتحقق من قبول ذلك. فيكون منطق العملية مشابها لـ: عند تقديم طلب من طرف الراكب او العميل يتم اضافة مهمة اسناد الراكب للسائق الى طابور انتظار يتم مباشرة التحقق من تنفيذ او قبول المهمة عن طريق ارفاق ما يسمى بخيار تواتر frequency option للمهمة المجدولة، اذ يتم التحقق من ما ان تمت المهمة المقصودة كل مدة n من الزمن. في حالة عدم قبول اسناد المهمة خلال المدة n يتم اعادة الاسناد الى سائق آخر وهكذا. بالطبع فإن هذا هو المنطق العام للعملية. يمكنك التوسع في الفكرة أكثر. جدولة المهام (Task scheduling) في Laravel
  4. للاستفادة قصوى من محتوى كل درس يفضل التطبيق العملي مع ما يقوم به المدرب خلال هذا الدرس. وهذا حتى بالنسبة للمسارات النظرية من مثل مسارات الأساسيات، على أنه سيتم فيما بعد مماررسة كل هاته الأساسيات في المسارات التطبيقية اللاحقة أين سيكون من الواجب عليك الممارسة العملية سواء للاستفادة من محتوى الدورة او كشرط لاجتياز الامتحان والتحصل على الشهادة فيما بعد.
  5. هل تقصد أنك تريد "تحديد دروس الفصل القادم التي لم يتم تنزيلها بعد الموافقة لمستوى الطالب"؟
  6. يحدث هذا لأنك تحاول استعمال تضمين وحدة نمطية مصدرة تصديرا معنونا (named export) في حين أنك تقوم بتصدير وحدة data كوحدة افتراضية. ما تحتاج القيام به هو اما: اعادة تصدير الوحدة data بشكل معنون فيكون: // data.js export const data = { // you data object } او استيراد وحدة data بشكل افتراضي فيكون: import data from './data.js' تعرف عن الوحدات في Typescript
  7. npm هو مدير حزم ووحدات Node بجانب كونه آداة CLI. يقوم npm بالتعامل مع نوعين من التثبيتات: global installs وهي الحزم ووالوحدات التي يتم تثبيتها على الجهاز ولا يختص بها مشروع معين. local install وهي الحزم والوحدات التي يتم تثبيتها على مشروع معين ويكون استعمالها حصرا بذاك المشروع. اما بالنسبة لـ npx فهو منفذ لحزم node دون الحاجة الى ان تكون هاته الحزم مثبتة. اذ يكفي ان تكون مسجلة ضمن حزم node المقبولة. ويعتبر استعماله عمليا عند الحاجة الى تنفيذ حزمة معينة مرة واحدة فقط خلال زمن المشروع، فعلى سبيل المثال: لا يبدوا من المنطقي ان نقوم بتثبيت الوحدة المسؤولة عن توليد مشروع react جاهز ثم نشغلها. سيكون من الافضل لو يتم مباشرة تنفيذها لتوليد المشروع. لأنه لا حاجة من بقاءها ضمن المشروع. يوجد ايضا nvm الذي هو مدير نسخ نود Node Version Manager الذي يمكن بواسطته ادارة نسخ متعددة من NodeJS في آن واحد.
  8. تحدث المشكلة في الغالب بسبب ان المصفوفة sizes تحتوي على مصفوفة اخرى متداخلة nested فهي مصفوفة multi dimensional. وللمرور على عناصر مصفوفة مثل التي لديك اظن انك تحتاج المرور على الكائنات بداخل اول مصفوفة. فيكون: foreach ($sizes[0] as $size) { .. الباقي أيضا قد تحتاج طباعة size من داخل حلقة foreach لفهم كيفية المرور على عناصره.
  9. مثل هاته المشكلة شائعة عند استعمال بوتستراب. اذ يرجع عدم اشتغال هذا المكون الى احد السببين في الغالب: هو أن ملف جافاسكربت الخاص ببوتستراب لديك غير مضمن او مضمن بشكل جزئي او غير صحيح. أو: هو أنك تصف المكون على طريقة نسخة معينة من بوتستراب في حين أنك تستعمل نسخة مخالفة. للتأكد من الأول تأكد من أن ملفك يحتوي على تضمين لملف جافاسكربت بوتستراب ومرفقاته jQuery و popper.js، اما عن طريق cdn: <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.12.9/dist/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> او عن طريق مدير الحزم npm: npm install bootstrap وبالطبع في هاته الحالة ستحتاج تضمينه بملف جافاسكربت التطبيق لديك: require 'bootstrap'; ومن ثم تحزيمه: npm run dev أما عن الاحتمال الثاني فيجب التأكد من مطابقة سياق كل نسخة: ان استعملت بوتستراب 5 احرص على ان تعرف خواص القائمة المنسدلة كـ: data-bs-toggle="dropdown" اما ان استعملت بوتستراب 4 فهو ذات السياق الذي لديك.
  10. تحسين الأرشفة والظهور على محركات البحث لا يختص به موقع دون الآخر وانما تتحكم في الموضوع مجموعة من العوامل والنقاط نذكر منها: أنشئ ملف خارطة الموقع sitemap.xml أنشئ ملف robots.txt أنشئ محتواك بعناية واحرص الا يحتوي اخطاء املائية اختر كلمات مفتاحية قليلة المنافسة لزيادة حظوظك تابع جمهور الموقع من على تحليلات قوقل وحاول استقصاء اهتماماتهم قم بانشاء روابط داخلية في موقعك حدث محتواك بشكل دوري يمكنك ايضا الاستعانة بمختص بذلك في مستقل او خمسات مثلا.
  11. هل جربت تشفير هاته الملفات باستعمال base64 لنقلها كسلاسل نصية عادية؟ اذ سيمكن حقن هاته الملفات كسلاسل base64 ضمن الكائن الخاص بك بشكل عادي جدا. ومن ثم سيمكن نقله الى الخادم الذي سيتولى عملية الغاء التشفير بشكل منفصل ومستقل تماما (رغم انه يمكن تخزين هاته السلاسل الناتجة الا انه لا يعد تطبيقا جيدا). أظن انها افضل مقاربة للتعامل مع هذا النوع من الكائنات. صادفنا قبل مدة ليست بالكثيرة احد المشاكل المشابهة التي وجدنا فيها هذا الحل كعملي جدا. خصوصا وانه لا يمكن انشاء nested data forms لارسالها للخادم إلا بشكل يتلاعب كثيرا بهيكلة النموذج الذي نتعامل معه. ملخص العملية: عند رفع ملف ما، يتم تشفيره الى سلسلة base64 على جانب العميل. يتم حقن ناتج التشفير في الكائن المراد ارساله للخادم يستقبل الخادم الكائن كمصفوفة multi dimensional عن طريق المرور على عناصر هاته المصفوفة يقوم بالغاء تشفير هاته السلاسل اما كملفات او كصور ويقوم بحفظها الى قرص التخزين. تحقن مسارات الملفات الى قرص التخزين مكان السلاسل المشفرة الناتج: نقل سليم للملفات دون تجاوز هيكلة الكائن او طريقة ارساله.
  12. نعم لن تواجه اي مشكلة بذلك، أتوقع ان شكل البيانات التي يتم حقنها الى كل من ملفي العرض index.blade.php مختلفتان، ولذلك فإن سيتم تصيير الصفحة في كل حالة بطريقة مختلفة عن الأخرى. فان كان الموجه الاول يعرض الصفحة كـ: return view('index' ,compact('data1')); و الموجه الثاني يعرضها كـ: return view('index', compact('data2')); فإنك ستحتاج بطريقة ما للتحقق من ما ان كان متغير ما ممررا لتصيير الصفحة: @if(isset($data1)) .// طريقة العرض الاولى @elseif(isset($data2)) .// طريقة العرض الثانية @endif ورغم امكانية تطبيق الفكرة الا أنه لا يعد تطبيقا جيدا للشيفرة النظيفة، فهو لا يحترم مبدأ فصل المهام seperating of concerns بالدرجة الأولى. بالاضافة الى مبدأ المسؤولية الواحدة single responsibility. اذ يمكنك على كل حال فصل الاختلاف فقط. وان كان هنالك تشابه بين طريقتي العرض فيمكنك الاحتفاظ بالتشابه في ملف مكون منفصل وتصيير مكونات الاختلاف في كل مرة.
  13. جرب ايضا استعراض الاستعلام كاملا قبل تنفيذه عن طريق ذات الوظيفة السابقة dd: $number = request()->courseNumber; $query = 'select Course_name from .... WHERE Has_Pre IN ('.$number.')'; dd($query); هل يمكنك التقاط صورة للناتج؟
  14. يمكنك استعراض قيمة المتغير الممرر والتأكد من ان هنالك معاملا يتم تمريره بالفعل في تابع المتحكم المستهدف عن طريق الوظيفة dd: $number = request()->courseNumber; dd($number); هل يظهر الرقم المرسل هنا بشكل عادي؟
  15. بالطبع ان التعليق السابق لا يعني نسخ الاستعلام بشكل مباشر (النقاط مثلا تعني بقية الاستعلام مثل ما تصفه)، فهو توضيح لطريقة حقن متغير في سلسلة نصية. ان كانت المشكلة في علامة التنصيص يمكنك تجاهلها عن طريق استعمال علامتي تنصيص بدل واحدة "" أيضا سيتطلب منك هذا معرفة بلارافيل ولغة PHP
  16. انتبه الى وجود خطأ في توصيف اسم احد الجداول المستهدفة: $query = 'SELECT * FROM pack_items JOIN tenders t on pack_items.tender_id = t.id WHERE tender_id = '.$id; ^^^^^^^^^ اظنك تقصد tenders. اذا كنت تحاول تعريف اسم مستعار Alias لجدول tenders فبالطبع لا تنسى الكلمة المفتاحية AS فيكون الاستعلام صحيحا كـ: $query = 'SELECT * FROM pack_items JOIN tenders AS t on pack_items.tender_id = t.id WHERE tender_id = '.$id; او مباشرة: $query = 'SELECT * FROM pack_items JOIN tenders on pack_items.tender_id = tenders.id WHERE tender_id = '.$id;
  17. الفكرة الأولى من مخططات التدفق او خارطة الانسياب هي في تنظيم عملية تدفق البيانات التي تطبق في نقل البيانات من المدخلات الى المخرجات دون التركيز في التفاصيل الدقيقة. فهي الوسيلة لتمثيل خطوات معينة من بداية خوارزمية الى نهايتها، وبالتالي تضمن: أخذ تصور واضح لكاملة للخطوات المطلوبة لتطبيق فكرة معينة بشكل يسهل عليه تحليل المعطيات والمتطلبات الى خطوات برمجية. تسهيل التعامل مع العمليات التي تحتاج خوارزميات معقدة يكثر فيها التشعب والاحتمالات الكثيرة. تمتلك مخططات التدفق بعض العناصر المتفق على دلاليتها للاشارة الى شيء ما، فعلى سبيل المثال: يدل السهم ← في المخطط على اتجاه الانسياب المنطقي للبرنامج وبالتالي يعرف اسبقية خطوة على خطوة اخرى. استفد اكثر من الاجابات على سؤال مماثل: ايضا تعرف على مجموعة برمجيات لرسم وتمثيل مخططات التدفق:
  18. ستحتاج طبعا التوجيه الى تابع المتحكم المعني من داخل الاستمارة بحيث يكون الرقم مرفقا ضمن الطلب. فإن كان التابع index من المتحكم CourseController هو ما يحوي هاته الشيفرة، بحيث يوجه المسار التالي اليه: Route::post('/path' ,[CourseController::class ,'index'])->name('my.path'); فإنك ستحتاج الاشارة الى هذا المسار في الاستمارة: <form action="{{ route('my.path') }}" method="POST"> @csrf @method('POST') <input name="courseNumber" /> .. الباقي ثم استقبال هذا المعامل في المتحكم المعني: $number = request()->courseNumber; $x = DB::select('select Course_name from .... WHERE Has_Pre IN ('.$number.')')
  19. طريقة نمذجة البيانات في جدول تعتمد على هيكلة هاته البيانات بدرجة أولى، يمكن عمل حلقة foreach للمرور على ناتج الاستعلام وطباعة البيانات بالشكل التالي: <table> @foreach($s as $courseName) <tr> <td> {{ $courseName['firstCol'] }} </td> <td> {{ $courseName['secondCol'] }} </td> </tr> @endforeach </table> أيضا قد تحتاج الاستعانة بالأسماء المستعارة Aliases في SQL لتنظيم هيكلة الناتج: $s =DB::select(' select c.Course_name as FirstCol, pc.Course_name as SecondCol from courses c inner join prerequsites p on c.course_id=p.course_id inner join courses pc on p.Has_Pre=pc.Course_id'); ولما لا، استعمال باني الاستعلامات Query Builder في لارافيل لكتابة الاستعلام بشكل أكثر تنظيما: DB::table('courses') ->select('courses.Course_name as FirstCol', 'courses.Course_name as SecondCol') ->join('prerequsites' , 'courses.course_id' , '=' , 'prerequsites.course_id') ->join('courses','prerequsites.Has_Pre','=','courses.Course_id') ->get(); كيف تستخدم منشئ الاستعلامات Query builder للتخاطب مع قاعدة البيانات في Laravel منشئ الاستعلامات في Laravel حسب ويكي حسوب قوالب Blade في Laravel
  20. لا يمكن تشخيص سبب الخطأ او أخذ تصور كامل عنه دون الاطلاع على الشيفرة المسؤولة. يررجى ارفاق تفاصيل اكثر عن المشكلة.
  21. من بين ميزات الدورات التي ذكرتها أنها لا تشترط منك أي خبرة مسبقة أو أي مكتسبات قبلية. وستتخرج كمطور تطبيقات جافاسكربت أو مطور ويب شامل باستخدام لغة PHP. فإن كان السؤال ان كنت ستحتاج كشرط فلا، ولكن ان كان السؤال هل من الافضل ذلك، فنعم بالطبع. لأن الاستزادة من العلم والاطلاع على المفهوم الأوسع ستعطيك نظرة أشمل على المجال وعلى كيفية التعامل معه. اعرف أكثر عن دورة تطوير التطبيقات باستخدام جافاسكربت من خلال هذا الرابط وعن دورة تطوير التطبيقات باستخدام لغة PHP من خلال هذا الرابط.
  22. دورة تطوير تطبيقات الويب باستخدام لغة PHP هي تشكيلة من تقريب ال 60 ساعة فيديوهات تعليمية تعتمد على التطبيق العملي بجانب التعلم النظري. تخصص أيضا مسارا كاملا للعمل بلارافيل كأشهر اطار عمل للغة PHP. تحتوي على المسارات: أساسيات لغة PHP أساسيات إطار العمل Laravel مسار تدريبي لبناء شبكة اجتماعية تشبه انستغرام مسار تدريبي لبناء واجهة تطبيقات برمجية Restful API تطوير موقع للإعلانات المبوبة تطوير نظام لإدارة المحتوى بناء متجر الكتروني لبيع الكتب بناء تطبيق لتقييم الأماكن على الخرائط بناء تطبيق مشاركة فيديوهات تطوير قوالب وردبرس تطوير متاجر ووكومرس وبين كل هذا وهذا يتم المرور على كامل النقاط التي أشرت اليها وأكثر. اعرف اكثر عن الدورة من هنا
  23. وجدت فكرة مشابهة لهاته الفكرة عملية جدا وتخدم غرضا لدينا في أحد المشاريع البرمجية مؤخرا أين احتجنا استعمال هاته الصيغة لإرسال البيانات لا لتخزينها. لأن عيب هاته الطريقة أنها تأخذ مساحة تخزين كبيرة جدا من قاعدة البيانات مقارنة بحفظها في خوادم تخزين سحابية او اقراص تخزين عادية بصيغها الأصلية ك raw binary حيث أن فرق صيغة base64 على raw binary هو حوالي ال 33%، وهو فرق كبير جدا. سيعني هذا بطئا في الاستعلام حولها، وسينعكس هذا سلبا بالطبع على آداء الموقع. يمكنك الاستعانة بصيغة base64 لارسال وتبادل البيانات لا أكثر، فإن كان هنالك سبب ما يدفعك الى عدم استعمال data forms فيمكنك تشفير هاته الصور أو الملفات وإرسالها إلى الخادم وترك عملية إلغاء تشفيرها للخادم.
  24. الطريقة لا تخص ReactNative على وجه الخصوص. يسمى الملف الحاوي للمتغير وحدة نمطية module. ويمكنك تصدير اي متغير في جافاسكربت في بيئة Node من وحدة نمطية عن طريق استعمال الكلمة المفتاحية export على نحو export const exampleVariable=true ثم استيرادها باستعمال import مرفقة باسم المتغير موجود داخل معقوفتين على نحو import {example} from 'test.js' لاحظ انه من المهم استعمال المعقوفتين لأنها تهتص بنوع من التصدير يسمى التصدير المعنون named export. أما في حالة الحاجة إلى استيراد متغير واحد من ملف الوحدة النمطية المستهدفة يمكنك الحاق الكلمة export بالكلمة default ليكون الاستيراد بدون معقوفتين.
  25. أظنك تحاول استعمال التابع prepare على متغير تفترض أنه من صنف PDO لتحضير استعلام قواعد بيانات. تحدث مثل هاته المشكلة عندما لا يتم تهيئة كائن عن الصنف pdo بشكل صحيح، اذ تعتبر PHP المتغير المسند سلسلة نصية او قيمة بوليانية أحيانا في حالة فشل الاتصال. تأكد من حقن سطر مشابه للتالي: $pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass); في مكان قبل استعمال اي توابع عنه. ايضا لتشخيص المشكلة بشكل دقيق يرجى إرفاق الشيفرة كاملة.
×
×
  • أضف...