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

Adnane Kadri

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

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

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

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

    52

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

  1. أظنك ستحتاج بشكل أو بآخر استعمال واحدة من مكتبات Faker لتزييف بيانات تتعلق بالمنتجات التي تحاول انشاءها واستغلالها في تخيل أو تصور الشكل النهائي للموقع. تتوفر مكتبة fakerjs كواحدة منها. فيما يلي رابط المكتبة على الغيت هب. طريقة الاستعمال سهلة، ستحتاج تثبيت المكتبة عن طريق مدير الحزم npm أول الامر: npm install --save-dev @faker-js/faker ثم استيراد وحدة faker واستعمال توابعها لتزييف البيانات: import { faker } from '@faker-js/faker'; const dummyData = { userId: faker.datatype.uuid(), username: faker.internet.userName(), email: faker.internet.email(), avatar: faker.image.avatar(), password: faker.internet.password(), birthdate: faker.date.birthdate(), registeredAt: faker.date.past(), }; console.log(dummyData) سيمكنك استعمال هاته البيانات في تصيير المكونات واستعمالها كبيانات اختبارية.
  2. تأكد من ان الحساب الذي تستعمله في الدفع يمتلك مبلغا كافيا لاكمال عملية الدفع، ان كان البنك الخاص بك يشترط مصادقة باستعمال كود CVV (card verification value) لاكمال عملية الدفع فيحتمل ان تواجه مشكلة مشابهة، (هو الكود المكون من ثلاث ارقام الموجود خلف البطاقة). لأن AWS لا تدعمه، وتنصح بمراسلة الدعم الخاص بالبنك للتنازل عن هاته المصادقة. (على الأقل للتحويل الحالي). راسل خدمة عملاء AWS، واعرف اكثر عن المشكلة. حاول ايضا البحث عن مشاكل عملاء مشابهة عن طريق استعمال نص رسالة الخطأ: there was a problem with your payment information aws
  3. مرحبا محمد، يمكنك الاطلاع على هاته المقالة كدليل شامل لتعلم البرمجة: تصفح أيضا تفاصيل مختلف الدورات التي يتم عرضها: دورة تطوير المنتجات دورة علوم الحاسوب دورة تطوير واجهات المستخدم دورة تطوير التطبيقات باستخدام لغة Python دورة تطوير التطبيقات باستخدام لغة جافاسكربت دورة تطوير التطبيقات باستخدام لغة PHP دورة تطوير التطبيقات باستخدام لغة Ruby
  4. فكرتك غير واضحة. هل يمكنك التوضيح مع ارفاق الشيفرات بشكل مكتوبة او قابل للمعاينة؟
  5. ان كنت تستخدم هيروكو كخادم للتخزين فستواجه مشكلة لأن خوادم هيروكو توصف على أنها سريعة الزوال، ربما لن تواجه مشكلة في حالة استخدمت المسار العام لها. قد تكون مشكلتك مشابهة لـهاته:
  6. لا يبدوا من التفاصيل التقنية الموصوفة أن فشل الارسال راجع الى حظر عنوان IP فالأرجح هو أن المشكلة تتعلق بصندوق بريد المستلم the recipient mailbox. الحظ: تأكد أيضا من عنوان النطاق الخاص بك غير مستهلك expired وابحث عن دلالة كود الخطأ الذي يظهر ضمن التقرير: Socket error code 10061 جرب ايضا الاستفسار عن المشكلة في منتديات Microsoft او راسل الدعم بالمشكلة.
  7. ما هو نظام ادارة قواعد البيانات التي تستعملها؟ الأمر عادي، ويماثل اي طريقة أخرى لحذف وتحديث سجل من قواعد البيانات. فهو عموما سيتبع المنطق التالي: انشاء ملف عرض يصف الهيكلة المطلوبة، ويحتوي نموذجين كل منهما يوجه الى مسارين A و B. يمثل المساران A و B نقطتي وصول تشيران الى تابعي متحكم خاص بالمنشور وليكن delete و update. عند استهداف التابع الاول يتم تنفيذ شيفرة الحذف الخاصة بالمنشور. وعند استهداف التابع الثاني يتم تنفيذ شيفرة التحديث الخاصة بالمنشور. الآن لن تحتاج الا حماية هاذين المسارين وليكن عن طريق الطبقات الوسيطة Middlewares. اين ستحتاج التحقق من هوية المرسل للطلب ومن صلاحياته. بالطبع فإن هذا هو المنطق العام للعملية. لن تحتاج الا نمذجتها عن طريق الشيفرة الخاصة بك، وذلك يختلف بحسب اطار عمل الواجهة الامامية او محرك القالب المستعمل، نظام قاعدة البيانات وما الى ذلك.
  8. هل يمكنك الاشارة الى اطار العمل او اللغة التي تستعملها؟ ربما تبحث عن أحد مكتبات faker. مثل fakerphp في PHP أو fakerjs في جافاسكربت أو Faker في بايثون. وموجودة حتى في Perl و Ruby. على اختلاف هاته اللغات، كل هاته المكتبات توفر تابعا email يهتم بتوليد عناوين بريد الكتروني مزيفة او اختبارية. يمكنك بذرها الى قواعد البيانات واستعمالها لذات الغرض. قد تحتاج ايضا خادم SMTP اختباري من مثل Mailtrap، لاستقبال هاته الرسائل.
  9. أظن أن هاته التوابع تم التخلي عنها في نسخ متأخرة من PHPunit (اذكر انها كانت موجودة في النسخة الخامسة من لارافيل). فقد تم فصل عملية اختبار الواجهة الامامية أو اتمتة المتصفح عن الـ core الخاص بـ PHPunit فهي الآن تركز على: اختبارات HTTP اختبارات قواعد البيانات اختبارات Console بجانب تزييف الاحداث لغرض الاختبار او ما يسمى Mocking أما في يخص أتمتة المتصفح فيتوفر الآن Laravel dusk كحزمة خارجية والذي يتكامل بشكل جميل مع قوقل كروم. هو يوفر تقريبا نفس التوابع والادوات التي كانت متوفرة سابقا. اعرف أكثر عن اختبارات المتصفح (Laravel Dusk) في Laravel
  10. يمكنك استخدام ذات التابع السابق لعمل ذات الشيء. $targetID = 'YOUR_ID'; $this->assertDatabaseMissing('courses' ,['id' => $targetID]); ليست العملية معقدة كثيرا، نظم ذلك فقط. دورة الحياة داخل تابع الاختبار تكون دائما بشكل او بآخر كـ: مرحلة لتحضير البيانات مرحلة للقيام بأكشن والخروج بنتيجة مرحلة للقيام بالتوكيدات على اشياء او سلوكات معينة
  11. كتطبيق عملي للوصف السابق يمكنك القيام بالتالي: عند تقديم طلب من طرف الراكب او العميل يتم االتالي. <?php ... class RideController extends controller { /** * حجز رحلة * * @return void */ public function book(){ // انشاء رحلة جديدة وسائق معين $ride = Ride::create([ 'user_id' => auth()->id() , 'driver_id' => 'RANDOM_DRIVER_ID']); // انشاءرحلة مجدولة ScheduledRide::create([ 'ride_id' => $ride->id ]); // تنبيه السائق عن رحلة جديدة event(new NotifyDriverByRideEvent($scheduledRides->ride)); } } لاحظ وجود انموذج بيانات Ride يعبر عن الرحلة التي قام المستخدم بحجزها. في ذات الوقت تم انشاء رحلة مجدولة تعبر عن مهمة جدولة الرحلة. ويتم تمثيل ذلك بانموذج ببيانات آخر هو ScheduledRide سنحتاج الآن جعل هاته الرحلات المجدولة مهام يتم تحميلها بشكل ديناميكي من طرف المجدول. ليمكن التحقق مثلا من ما ان كانت الرحلة قبلت من السائق خلال الخمس دقائق الماضية او هي معلقة. بملف app/Console/Kernel.php سنحتاج عرض كامل الرحلات المعلقة او المجدولة والتحقق مثلا من ما ان قام السائق بقبول الرحلة أو لا: /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { /* جلب كاملة الرحلات المجدولة */ $scheduledRides = ScheduledRide::all(); // المرور على كامل الرحلات المجدولة foreach ($scheduledRides as $scheduledRide) { $schedule->call(function() use($scheduledRide) { // التحقق من ما ان قبلت الرحلة من طرف السائق if($scheduledRide->ride->is_approved_by_driver){ // ان كانت الرحلة قد قبلت لن نحتاج ان تكون الرحلة مجدولة او معلقة فهي تامة $scheduledRide->delete(); }else{ // اما في غير ذلك // سنعدل الرحلة التي تمثل الرحلة المجدولة هاته ونسندها لسائق جديد $scheduledRide->ride->update(['driver_id' => 'NEW_DRIVER_ID']); // وبالطبع ننبه السائق الجديد ايضا event(new NotifyDriverByRideEvent($scheduledRide->ride)); // .. ولما لا اخبار السائق السابق بان الرحلة قد فاتته // او استعمال ذلك في حساب معدل ادائه في التطبيق } })->everyTenMinutes(); // ضع اي خيار تواتر يوافق حاجتك او حاجة العملاء } } طبعا الفكرة تحتاج تنظيما وتنظيفا اكثر، ولكن ستتجه بشكل او بآخر نحو ذات المفاهيم.
  12. ما هي حالة الاستخدام التي تحاول اختبارها تحديدا؟ ما تحاول القيام به غير واضح اساسا.
  13. هل قمت بكتابة اي شيفرات او بانشاء اي مهام يمكن توجيهها للطريقة الموصوفة؟
  14. لا، لا يقبل التابع assertDatabaseMissing ولا التابع assertDatabaseHas مصفوفة متعددة الابعاد Multi-dimensional، يجب تمرير مصفوفة ثنائية البعد بالخصائص والقيم المراد استبعادها او البحث عنها فقط.
  15. أظن أن معرفة بسيطة بجزئيتي جدولة المهام وطوابير الانتظار في لارافيل سيكون كافيا لتصور شيفرة كاملة عن العملية الموضحة اعلاه.
  16. ما تحاول القيام به هنا غير واضح جيدا. اذ يفترض من تابع الاختبار ان يعبر عن حالة استخدام واضحة وجلية. فلا نقول: public function testUserProduct() بل نقول: public function test_user_can_create_a_product() أو: public function test_user_can_archive_a_product() أو ما الى ذلك (بالطبع لا اقصد طريقة الكتابة). بالنسبة لحالة الاختبار الأولى فأنت تحاول التأكد ان قاعدة البيانات لا تمتلك اي سجل في جدول supervisors يمتلك قيمة فارغة في عمود sup_id. لا مشكلة بذلك. أما بالنسبة لحالة الاستخدام الثانية، فأنت تقوم بتحديد كورس معين ثم تقوم بالتأكد من ان الكورس غير موجود .. فالعملية هنا غير منطقية أساسا، أظنك تحتاج اعادة صياغة حالة الاختبار. بما أنك تقوم باختبار قواعد البيانات، فيفضل استعمال اتصال قاعدة بيانات in-memory مثل اتصال sqlite وذلك عن طريق الغاء تعليق الاسطر التالية في ملف phpunit.xml: <env name="DB_CONNECTION" value="sqlite"/> <env name="DB_DATABASE" value=":memory:"/>
  17. جرب تحديد عنصر الفيديو المستهدف ثم قم بايقافه عن طريق الاستعانة بالوظيفة pause: let targetVideo = document.querySelector('#myVideo') targetVideo.pause() قد تحتاج ايضا اعادة عداد الوقت الى الصفر: targetVideo.currentTime = 0 العنصر <video>
  18. يمكنك معاملة هاته الدالة كميزة. واختبارها كحالة استخدام عن طريق اختبارات الميزة في لارافيل. لنقل ان الدالة الخاصة بك يتم الاشارة اليها عن طريق المسار: 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
  19. يمكنك الاستعانة بمفهوم جدولة المهام Task scheduling و طوابير الانتظار Queue لتنفيذ او جدولة مهمة اسناد الراكب الى السائق المستهدف والتحقق من قبول ذلك. فيكون منطق العملية مشابها لـ: عند تقديم طلب من طرف الراكب او العميل يتم اضافة مهمة اسناد الراكب للسائق الى طابور انتظار يتم مباشرة التحقق من تنفيذ او قبول المهمة عن طريق ارفاق ما يسمى بخيار تواتر frequency option للمهمة المجدولة، اذ يتم التحقق من ما ان تمت المهمة المقصودة كل مدة n من الزمن. في حالة عدم قبول اسناد المهمة خلال المدة n يتم اعادة الاسناد الى سائق آخر وهكذا. بالطبع فإن هذا هو المنطق العام للعملية. يمكنك التوسع في الفكرة أكثر. جدولة المهام (Task scheduling) في Laravel
  20. للاستفادة قصوى من محتوى كل درس يفضل التطبيق العملي مع ما يقوم به المدرب خلال هذا الدرس. وهذا حتى بالنسبة للمسارات النظرية من مثل مسارات الأساسيات، على أنه سيتم فيما بعد مماررسة كل هاته الأساسيات في المسارات التطبيقية اللاحقة أين سيكون من الواجب عليك الممارسة العملية سواء للاستفادة من محتوى الدورة او كشرط لاجتياز الامتحان والتحصل على الشهادة فيما بعد.
  21. هل تقصد أنك تريد "تحديد دروس الفصل القادم التي لم يتم تنزيلها بعد الموافقة لمستوى الطالب"؟
  22. يحدث هذا لأنك تحاول استعمال تضمين وحدة نمطية مصدرة تصديرا معنونا (named export) في حين أنك تقوم بتصدير وحدة data كوحدة افتراضية. ما تحتاج القيام به هو اما: اعادة تصدير الوحدة data بشكل معنون فيكون: // data.js export const data = { // you data object } او استيراد وحدة data بشكل افتراضي فيكون: import data from './data.js' تعرف عن الوحدات في Typescript
  23. npm هو مدير حزم ووحدات Node بجانب كونه آداة CLI. يقوم npm بالتعامل مع نوعين من التثبيتات: global installs وهي الحزم ووالوحدات التي يتم تثبيتها على الجهاز ولا يختص بها مشروع معين. local install وهي الحزم والوحدات التي يتم تثبيتها على مشروع معين ويكون استعمالها حصرا بذاك المشروع. اما بالنسبة لـ npx فهو منفذ لحزم node دون الحاجة الى ان تكون هاته الحزم مثبتة. اذ يكفي ان تكون مسجلة ضمن حزم node المقبولة. ويعتبر استعماله عمليا عند الحاجة الى تنفيذ حزمة معينة مرة واحدة فقط خلال زمن المشروع، فعلى سبيل المثال: لا يبدوا من المنطقي ان نقوم بتثبيت الوحدة المسؤولة عن توليد مشروع react جاهز ثم نشغلها. سيكون من الافضل لو يتم مباشرة تنفيذها لتوليد المشروع. لأنه لا حاجة من بقاءها ضمن المشروع. يوجد ايضا nvm الذي هو مدير نسخ نود Node Version Manager الذي يمكن بواسطته ادارة نسخ متعددة من NodeJS في آن واحد.
  24. تحدث المشكلة في الغالب بسبب ان المصفوفة sizes تحتوي على مصفوفة اخرى متداخلة nested فهي مصفوفة multi dimensional. وللمرور على عناصر مصفوفة مثل التي لديك اظن انك تحتاج المرور على الكائنات بداخل اول مصفوفة. فيكون: foreach ($sizes[0] as $size) { .. الباقي أيضا قد تحتاج طباعة size من داخل حلقة foreach لفهم كيفية المرور على عناصره.
  25. مثل هاته المشكلة شائعة عند استعمال بوتستراب. اذ يرجع عدم اشتغال هذا المكون الى احد السببين في الغالب: هو أن ملف جافاسكربت الخاص ببوتستراب لديك غير مضمن او مضمن بشكل جزئي او غير صحيح. أو: هو أنك تصف المكون على طريقة نسخة معينة من بوتستراب في حين أنك تستعمل نسخة مخالفة. للتأكد من الأول تأكد من أن ملفك يحتوي على تضمين لملف جافاسكربت بوتستراب ومرفقاته 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 فهو ذات السياق الذي لديك.
×
×
  • أضف...