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

Mustafa Suleiman

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

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

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

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

    336

كل منشورات العضو Mustafa Suleiman

  1. تستطيع استخدام كلمة مرور مختلفة لكل قاعدة بيانات على حدى في MongoDB، وذلك بتكرار الخطوات التي أشار إليك بها محمد، لإنشاء مستخدم وتعيين كلمة مرور جديدة لكل قاعدة بيانات ترغب في استخدامها. أيضًا بإمكانك استخدام نفس المستخدم وكلمة المرور لعدة قواعد بيانات إذا كنت ترغب في ذلك. وسأشرح لك الكود: use اسم_قاعدة_البيانات db.createUser({ user: "اسم_المستخدم", pwd: "كلمة_المرور", roles: [ { role: "اسم_الدور", db: "اسم_قاعدة_البيانات" } ] }) 1- use اسم_قاعدة_البيانات: هذا الأمر يستخدم للتبديل إلى قاعدة البيانات التي ترغب في إنشاء مستخدم لها، واستبدل "اسم_قاعدة_البيانات" بالاسم الذي ترغب في استخدامه لقاعدة البيانات. 2- db.createUser(): يستخدم لإنشاء مستخدم جديد وتعيين كلمة مرور له. وعليك باستبدال "اسم_المستخدم" و"كلمة_المرور" بالقيم الخاصة بالمستخدم الذي ترغب في إنشائه. 3- roles: [ { role: "اسم_الدور", db: "اسم_قاعدة_البيانات" } ]: في هذا الجزء من الكود، يتم تحديد الدور (role) الذي يحدد الصلاحيات والامتيازات التي يمتلكها المستخدم. وعليك استبدال "اسم_الدور" بدور MongoDB المناسب لاحتياجاتك، مثلاً استخدام "readWrite" لمنح المستخدم صلاحيات القراءة والكتابة. وإليك بعض الأمثلة للأدوار الشائعة ووصفها: read: يمنح المستخدم صلاحية القراءة فقط للمجموعات والمجموعات الفرعية. readWrite: يمنح المستخدم صلاحية القراءة والكتابة للمجموعات والمجموعات الفرعية. dbAdmin: يمنح المستخدم صلاحية الإدارة لقاعدة البيانات المحددة، بما في ذلك إنشاء وحذف المجموعات وإجراء العمليات الإدارية الأخرى. userAdmin: يمنح المستخدم صلاحية إدارة المستخدمين في قاعدة البيانات، مثل إنشاء وحذف المستخدمين وتعديل الأذونات. dbOwner: يمنح المستخدم جميع صلاحيات القراءة والكتابة والإدارة في قاعدة البيانات، بما في ذلك إنشاء وحذف المجموعات وإجراء العمليات الإدارية وإدارة المستخدمين. وتذكر أنه يمكنك تعيين عدة أدوار للمستخدم عن طريق تكرار الكود المذكور في قوسين مربعين ضمن roles. مثال: roles: [ { role: "readWrite", db: "اسم_قاعدة_البيانات" }, { role: "dbAdmin", db: "اسم_قاعدة_البيانات" } ] ويجب الإنتباه إلى أنه عليك إمتلاك صلاحية كافية لإنشاء المستخدم وتعيين كلمة المرور، حيث ستحتاج إلى تشغيل هذه الأوامر باستخدام مستخدم يحمل صلاحية الإدارة (مثل المستخدم الأولي "admin") لكي تتمكن من إنشاء المستخدم بنجاح.
  2. مساحة عرض الصورة على موقع مستقل هي 128 في 128 بكسل والنسخة المصغرة منها هي 36 في 36 بكسل، أي للحصول على أفضل عرض للصورة، من الأفضل رفع صورة مربعة بأي مقاس على الموقع. ويجب أن تكون الصورة إحترافية وليست صورة سيلفي أو ليست صورة شخصية لك. أما إذا كنت تتسائل من أجل تصميم حجم مشابه لها في تصميمك، فعليك بإختيار الحجم المناسب الذي يتناسب مع باقي مكونات التصميم، وأيضًا عرض الصورة بشكل واضح.
  3. عند وضع Column داخل SingleChildScrollView، بإمكان لـ Column أن يتمدد بشكل لا محدود في الاتجاه الرأسي داخل SingleChildScrollView. وبالتالي، لن يتم رمي استثناء عند تمرير المحتوى. وهناك بعض التناقض في الشروط التي يتم فيها رمي استثناء عند استخدام Expanded داخل SingleChildScrollView. في الواقع، إذا وضعت Expanded داخل SingleChildScrollView، ستحدث استثناءات لأن Expanded يحاول التمدد لاستغلال المساحة المتبقية، في حين يسمح SingleChildScrollView بالتمدد غير المحدود. ففي حالة وضع Column بداخل SingleChildScrollView، يتم تطبيق تمدد Column على العناصر الموجودة داخلها فقط، وليس على الـ SingleChildScrollView نفسه. ببساطة، SingleChildScrollView يعمل على إظهار المحتوى الذي يتجاوز المساحة المتاحة على الشاشة بواسطة التمرير، في حين يتمدد Column فقط بناءً على المحتوى الذي يحتويه. وإليك مثالًا بسيطًا يوضح استخدام Column داخل SingleChildScrollView بدون حدوث استثناء: import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Example', home: Scaffold( appBar: AppBar( title: Text('Example'), ), body: SingleChildScrollView( child: Column( children: [ Container( height: 200, // ارتفاع ثابت للمثال color: Colors.blue, ), Container( height: 200, color: Colors.green, ), Container( height: 200, color: Colors.red, ), // يمكنك إضافة المزيد من العناصر هنا ], ), ), ), ); } } تم وضع Column داخل SingleChildScrollView وتحديد ارتفاع ثابت لكل عنصر في Column، بغض النظر عن عدد العناصر، ستظهر جميعها داخل SingleChildScrollView ويمكن التمرير لعرض المحتوى الكامل.
  4. كلاهما مطلوبان في سوق العمل، والأمر يتوقف على سوق العمل لديك، عليك بالبحث على مواقع مثل LinkedIn وIndeed وبعيد أو أي موقع آخر شهير للوظائف في بلدك، فمثلاً في مصر يوجد Wuzzuf. ولا تأخذ كلامي بنسبة 100% على أنه الصحيح عليك بالبحث لتتخذ قرارك، وعامًة في العالم العربي المطلوب بكثرة بالنسبة للمبتدأين في مجال البرمجة هو PHP وإطار لارافيل وورد بريس، وأيضًا إطار .NET المعتمد على لغة C# وغالبًا يتم استخدام Angular بالنسبة للواجهة الأمامية عند استخدام .NET وذلك ليس شرط بالطبع حيث تستطيع إنشاء واجهة أمامية بدون Angular. أما الـ MERN Stack فستجد فرص بلا شك، لكن عادة ما يتم طلب خبرة سنة حيث أن React وNode.js يعتمدوا على الكثير من المكتبات الأخرى لذلك أنت بحاجة إلى خبرة حقيقية من خلال بناء مشاريع ومواجهة الأخطاء الشائعة والتعود عليها، حتى يتم قبولك في وظيفة. وهناك بعض الشركات التي توفر فرص عمل بخبرة بسيطة أي لا يشترط خبرة سنة في حال كنت مطور MERN أي مطور Full stack، وبالطبع يجب وجود مشاريع حقيقية وليست مجرد نماذج بسيطة بمعرض أعمالك باي حال من الأحوال. وهناك دورة تطوير التطبيقات باستخدام لغة JavaScript توفر لك التطبيق على مشاريع لوضعها بمعرض أعمالك، وهي خاصة بمسار MERN. وأيضًا هناك دورة تطوير تطبيقات الويب باستخدام لغة PHP وإطار لارافيل وورد بريس. أي أنه عليك بالبحث عن متطلبات الوظائف الخاصة بمستوى Junior أو Entry level أو خبرة سنة وقرر على ذلك الأساس. فإذا كان لديك الوقت ولست على عجلة للحصول على وظيفة، فقم بتعلم مسار MERN، والعكس صحيح بالنسبة PHP. وإذا أردت التخصص في الواجهة الأمامية فقط فعليك بتعلم Angular إذا أردت التوظيف بشكل سريع، والعكس صحيح بالنسبة لـ React. أما إذا أردت العمل على مواقع العمل الحر فيجب عليك أن تكون مطور Full stack، وبالنسبة للمواقع العربية فعليك تعلم PHP ولارافيل وورد بريس. وأكرر، يجب أن تقوم بالبحث عن الوظائف المتاحة في سوق العمل المحلي لديك وتقرر على هذا الأساس.
  5. عند وضع Column widget داخل SingleChildScrollView، فإنه لا يحدث استثناء (exception) لأن SingleChildScrollView يسمح بالتمدد (expansion) غير محدود في الاتجاه الرأسي، بغض النظر عن عدد عناصر Column. SingleChildScrollView يعمل على إظهار كل عناصر القائمة بطريقة يمكن التمرير (scrollable) حتى وإن كانت أكثر من المساحة المتاحة على الشاشة. وعندما يكون لديك عنصر واحد فقط في SingleChildScrollView، ويمكن لـ Column أن يتمدد (expand) بشكل غير محدود في الاتجاه الرأسي ليتناسب مع حجم محتواه. أما بالنسبة لاستخدام Expanded داخل SingleChildScrollView، فالمشكلة تكمن في أن Expanded يحاول التمدد بنسبة معينة مقابل المساحة المتبقية، ولكن بسبب وجود SingleChildScrollView الذي يسمح بالتمدد غير المحدود، يكون هناك صراع بين الـ Expanded و SingleChildScrollView في التمدد، وهذا ما يتسبب في رمي استثناء (exception). وإذا أردت استخدام Column داخل SingleChildScrollView وتجنب الاستثناء، تستطيع استخدام واجهة ConstrainedBox لتحديد حجم ثابت لـ Column، بحيث لا يحاول التمدد بشكل غير مناسب. مثال للتوضيح: import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Example', home: Scaffold( appBar: AppBar( title: Text('Example'), ), body: SingleChildScrollView( child: ConstrainedBox( constraints: BoxConstraints(), // قيود خالية، لا تحدد أي قيود على الحجم child: Column( children: [ // عناصر القائمة هنا // يمكنك وضع قائمة طويلة هنا دون حدوث استثناء ], ), ), ), ), ); } }
  6. في البداية أنا لا أنصحك بالإنتقال من Vite إلى Laravel Mix وتم توضيح سبب ذلك في النقاش التالي: سأشرح لك طريقة الإنتقال من استخدام Vite إلى Laravel mix بشكل صحيح: أولاً عليك بحذف Vite من المشروع وذك عن طريق حذف أي حزم متعلقة بـ Vite في ملف package.json مثل التالي: "laravel-vite-plugin": "^0.7.5", و "vite": "^4.0.0" وأيضًا حذف ملف vite.config.js وملف package-lock.json ومجلد node_modules. والآن قم بالتالي: 1- تثبيت Laravel Mix باستخدام npm عن طريق الأمر التالي في مجلد المشروع: npm install laravel-mix --save-dev 2- بعد التثبيت، ستحتاج إلى إنشاء ملف webpack.mix.js في جذر مشروع Laravel حيث سيحتوي على تكوينات Laravel Mix. في ملف webpack.mix.js، يمكنك تحديد مدخلات ومخرجات ملفات CSS و JavaScript. مثلاً، إذا كان لديك ملف app.css و app.js تحت مجلد resources/assets/css و resources/assets/js على التوالي، سيكون شكل الكود كالتالي: const mix = require('laravel-mix'); mix.js('resources/assets/js/app.js', 'public/js') .sass('resources/assets/css/app.scss', 'public/css'); في المثال، سيتم دمج ملف app.js وتحويله إلى ملف JavaScript واحد في المسار public/js وكذلك ملف app.scss سيتم دمجه وتحويله إلى ملف CSS واحد في المسار public/css. وبإمكانك تكوين المزيد من المدخلات والمخرجات حسب احتياجات مشروعك. وللمزيد عن طريقة الاستخدام قم بقراءة المستند الرسمي من هنا: https://laravel-mix.com/docs/6.0/installation أو قراءة الدليل العربي من موسوعة حسوب: https://wiki.hsoub.com/Laravel/mix 3- بعد تكوين webpack.mix.js، تستطيع تشغيل Laravel Mix باستخدام الأمر التالي: npx mix وسيبدأ Laravel Mix في دمج وتحويل الملفات وفقًا للتكوينات المحددة. وإذا كنت ترغب في تشغيل Mix على مدار الوقت أثناء التطوير، فاستخدم الأمر التالي بدلاً من الأمر السابق: npx mix watch سيبدأ Mix في الاستماع إلى أي تغييرات في الملفات وتنفيذ المهام المطلوبة تلقائيًا. أو تستطيع استخدام السكريبتات في ملف package.json لاستخدامها بدلاً من الأوامر السابقة كالتالي: "scripts": { "dev": "npm run development", "development": "mix", "watch": "mix watch", "watch-poll": "mix watch -- --watch-options-poll=1000", "hot": "mix watch --hot", "prod": "npm run production", "production": "mix --production" }, ولتشغيل Mix على مدار الوقت أثناء التطوير، فاستخدم الأمر npm run watch. وبخصوص رسالة الخطأ التي تظهر لك، فهى تعني أن ملف webpack.mix.js يتم التعامل معه كملف ES Module، وذلك لأن ملف package.json الأساسي في مشروعك يحتوي على "type": "module". حاول القيام بالتالي: 1- تغيير اسم الملف webpack.mix.js لينتهي بامتداد .cjs بدلاً من .js، أي تغيير اسم الملف إلى مثلاً webpack.mix.cjs. 2- تغيير رمز الاستيراد في ملف webpack.config.js من require() إلى استخدام import() الديناميكي. حيث يعمل import() مع جميع CommonJS modules، وبالتالي تستطيع استخدامه في ملف webpack.config.js، أي استبدال السطر 11 في ملف webpack.config.js بالتالي: const { mix } = import('laravel-mix'); بعد ذلك، عليك بتعديل قيمة "type" في ملف package.json إلى "commonjs" بدلاً من "module". أي تغيير السطر الذي يحتوي على "type": "module" في ملف package.json إلى التالي: "type": "commonjs"
  7. بالنسبة للسؤال الأول: تستطيع إزالة الخاصية height من الـ Container في Flutter، وإذا قمت بإزالة height أو قمت بتعيينها إلى null، فسيتم تحجيم الـ Container تلقائيًا بناءً على حجم المحتوى الذي يحتوي عليه، ولن يتسبب ذلك في رمي استثناء (Exception). بالنسبة للسؤال الثاني: بإمكانك استخدام Expanded داخل SingleChildScrollView دون تحديد ارتفاع محدد، حيث أن Expanded يقوم بتمدد العنصر الفرعي ليمتلئ بالمساحة المتاحة المتبقية داخل SingleChildScrollView. وسيعتمد ذلك على المحتوى الذي يتم تضمينه داخل Expanded وأيضًا على التركيب العام لواجهتك. إذا تم توفير محتوى يتطلب مساحة إضافية، فقد يؤدي استخدام Expanded دون تحديد ارتفاع محدد إلى زيادة الارتفاع وبالتالي إمكانية التمرير داخل SingleChildScrollView. ولكن يجب ملاحظة أنه في بعض الحالات، قد يكون من الأفضل تحديد ارتفاع محدد لـ SingleChildScrollView بدلاً من الاعتماد على Expanded فقط، خاصة إذا كان لديك محتوى كبير يمكن أن يتجاوز المساحة المتاحة ويسبب مشكلة في التمرير. وتطبيقًا على الكود الخاص بك، إليك نسخة محدثة حيث تم إزالة الـ height من الـ Container واستخدام Expanded داخل SingleChildScrollView: SingleChildScrollView( child: Column( children: [ Text('Widget 1'), Text('Widget 2'), // Add your widgets inside the Column // ... ], ), ) حيث تم إزالة Container وتم استخدام SingleChildScrollView مباشرة مع Column، وباستطاعتك وضع أي عدد من الودجتس (Widgets) داخل Column وستتمكن من التمرير إذا كانت المساحة المتاحة غير كافية لعرض جميع الودجتس في الشاشة بشكل كامل. وستقوم Expanded بتمدد المساحة داخل SingleChildScrollView لسد الفراغ المتاح بعد وضع الودجتس داخل Column. لاحظ أنه في بعض الحالات قد تحتاج إلى إضافة خاصية physics لـ SingleChildScrollView لتمكين التمرير بشكل صحيح، وذلك حسب المتطلبات الخاصة بتطبيقك.
  8. رسالة الخطأ تعني أن FirebaseOptions لا يمكن أن تكون قيمة null عند إنشاء التطبيق الافتراضي. حاول إتباع التالي لحل المشكلة: 1- تأكد من أنك قمت بإضافة ملف google-services.json الخاص بـ Firebase إلى مجلد الجذر في مشروع Flutter الخاص بك. 2- تأكد من أنك قمت بإضافة جميع حزم Firebase اللازمة إلى ملف pubspec.yaml في مشروعك، وتستطيع التأكد من وجود الحزم اللازمة وإصداراتها الصحيحة في ملف pubspec.yaml، ثم قم بتشغيل الأمر flutter pub get لتثبيتها. 3- تأكد من أن تكوين Firebase الخاص بك صحيح في مشروع Flutter، من خلال فتح ملف android/app/build.gradle وتأكد من وجود التكوينات التالية: apply plugin: 'com.google.gms.google-services' dependencies { implementation platform('com.google.firebase:firebase-bom:32.0.0') // ... } 4- تحقق من أنه تم تثبيت مكون Google Services الصحيح في مشروعك فيجب وجود السطر التالي في ملف android/build.gradle: classpath 'com.google.gms:google-services:4.3.15' 5- تأكد من استدعاء دالة main() باستخدام الكلمة المفتاحية async واستخدام await قبل دالة Firebase.initializeApp() لضمان تهيئة Firebase بنجاح قبل تشغيل التطبيق.
  9. الشرح بمثال أفضل طريقة للتوضيح، وإذا فرضنا أن لديك الكلاس التالي في JavaScript: class MyClass { constructor() { this.property = "Hello, World!"; } sayHello() { console.log(this.property); } } وتريد تطبيقه على عنصر HTML، تستطيع استخدام الأكواد التالية: // تعريف العنصر الذي ترغب في تطبيق الكلاس عليه const myElement = document.getElementById("myElement"); // تطبيق الكلاس على العنصر const myObject = new MyClass(); myElement.classList.add("myClass"); // استدعاء الوظائف في الكلاس myObject.sayHello(); والآن في HTML، قم بإنشاء العنصر الذي ترغب في تطبيق الكلاس عليه: <div id="myElement"></div> وبالطبع يجب تضمين ملف الجافاسكريبت في HTML من خلال التالي: <script type="text/javascript" src="yourJavascript.js"></script> وعليك بتعديل اسم الملف في خاصية src. ,إذا قمت بذلك بشكل صحيح، فيجب أن يتم طباعة "Hello, World!" في وحدة التحكم (console) وأن يكون العنصر في HTML يحتوي على الكلاس "myClass".
  10. @محمد عبدالله18 الكود في header.php سليم ولا يحتوي على أي خطأ واضح يمكن أن يؤدي إلى تجاوز الوقت الأقصى للتنفيذ، وقد يكون السبب الحقيقي للمشكلة في ملفات أخرى أو في الطريقة التي يتم تنفيذها، وأنت ذكرت أنه عند حذف ملف ناف بار يتم حل المشكلة فعليك بتفقد ما الخطأ في الملف والكود. وهناك طريقة يمكنك استخدامها لتحديد السبب الحقيقي وراء خطأ تجاوز الوقت الأقصى، من خلال تعطيل تنفيذ الكود تدريجيًا في header.php والتأكد من أن كل جزء يعمل بشكل صحيح دون تجاوز الوقت الأقصى. تستطيع القيام بذلك باختبار التعليمات البرمجية الواحدة تلو الأخرى بتعليقها باستخدام علامة التعليق // أو /* */. <link rel="stylesheet" href="<?php echo $css?>bootstrap.rtl.min.css"> <link rel="stylesheet" href="<?php echo $css?>bootstrap.min.css"> <link rel="stylesheet" href="<?php echo $css?>all.min.css"> <link rel="stylesheet" href="<?php echo $css?>backend.css"> ثم أعد تشغيل المشروع ووتحقق مما إذا كانت المشكلة مستمرة. إذا توقفت المشكلة، فهذا يشير إلى أن الخطأ قد يكون في أحد هذه الأجزاء المعلقة، فقم بإلغاء التعليق لكل جزء على حدة وأعد التحقق من المشكلة بعد كل جزء لتحديد أي جزء يسبب تجاوز الوقت الأقصى. إذا استمرت المشكلة بعد تعليق جميع الأجزاء، فإن السبب قد يكون في أجزاء أخرى من المشروع مثل ملف ناف بار، وليس في header.php نفسه. أو هناك كود معقد أو استعلام قاعدة بيانات يستغرق وقتًا طويلًا للتنفيذ في أحد الملفات الأخرى التي تم تضمينها في init.php أو في صفحة dashboard.php. تستطيع مراجعة هذه الملفات للتحقق من وجود أي تعليمات برمجية تستغرق وقتًا طويلًا أو تسبب حلقة تكرارية غير محدودة. وربما هناك خطأ في رمز الصفحة الرئيسية index.php الخاص بك بعد إضافة شريط التنقل (Navigation Bar) باستخدام Bootstrap. فقد يتم تحميل الأكواد المشتركة مرتين، مرة واحدة في ملف header.php ومرة أخرى في ملف init.php، مما يسبب تكرار تحميل الأكواد وتأثيرًا سلبيًا على أداء الموقع وزيادة وقت التنفيذ. تستطيع إزالة إحدى الأكواد المكررة في الملفات، مثلاً إزالة السطر التالي من ملف init.php: include $tpl . 'navbar.php';
  11. من خلال الكود، لاحظت أنه هناك مشكلة صغيرة في تعريف العنوان الذي يتم استخدامه في توجيه الطلبات. يجب أن يكون عنوان الطريق كما يلي: Route::get('show/{id}', function($id) { $post = DB::table('posts')->find($id); return view('posts.show', compact('post')); }); لاحظ أنني قمت بتغيير {$id} إلى {id} في تعريف الطريق، حيث يجب أن يكون لديك واحد فقط $ قبل اسم المتغير في الطريق. تحتاج أيضًا إلى التأكد من وجود قيم في قاعدة البيانات تتطابق مع المعرّفات التي تحاول الوصول إليها في الرابط، فإذا كنت تحاول الوصول إلى /show/1، فيجب أن يكون هناك سجل في جدول "posts" يحمل معرّف 1. تأكد من أن هناك سجلات موجودة في قاعدة البيانات وأن المعرّفات التي تحاول الوصول إليها تتطابق مع هذه السجلات، وأيضًا تنفيذ الأمر الذي أخبرك به محمد. وإذا لم تكن هذه هي المشكلة، فيرجى تقديم المزيد من التفاصيل حول الخطوات التي قمت بها ورسالة الخطأ التي تحصل عليها.
  12. إذا كان السؤال متعلق بدورة PHP فأرجو منك طرح السؤال أسفل فيديو الدورة المتعلق بالسؤال، وطرح الأسئلة العامة هنا. ومن خلال رسالة الخطأ يظهر أن المشكلة تحدث في ملف header.php الذي يتم تضمينه في init.php. حيث يحدث خطأ في الوقت الأقصى المسموح لتنفيذ البرنامج، وذلك يشير إلى أن هناك عملية تستغرق وقتًا طويلًا للتنفيذ قبل أن يحدث خطأ التجاوز. و هناك أسباب محتملة لحدوث ذلك، مثلاً تعليمة معقدة في header.php تستغرق وقتًا طويلًا للتنفيذ، أو هناك حلقة تكرارية تستمر إلى ما لا نهاية، أو ربما يتم استدعاء ملف آخر يتسبب في تعليمة تكرارية. جرب تعليق السطور في header.php بشكل تدريجي واختبار الكود بعد كل خط لمعرفة أين تحدث المشكلة بالضبط، وقد تحتاج أيضًا إلى مراجعة ملفات أخرى مرتبطة بهذا المشروع للتحقق من أنها لا تسبب أي تضاربات أو مشاكل في التنفيذ. أو يمكنك مشاركة الكود في ملف header.php لتفقد المشكلة.
  13. أرجو منك طرح السؤال أسفل فيديو الدورة الخاص به في المرة القادمة. الأمر الذي استخدمته لإنشاء venv ليس كاملًا، حيث يتطلب استخدام أمر venv واحد على الأقل بعده، في الخطأ الذي تلقيته، يشير إلى أنه تم توفير ENV_DIR كواحد من الوسائط المطلوبة، ولكنها لم تتم تحديدها بشكل صحيح. فبدلاً من كتابة "python3 -m venv" فقط، يجب تحديد مسار المجلد الذي ترغب في إنشاء البيئة الافتراضية فيه. مثال: python3 -m venv venv حيث أن venv الأخيرة هي اسم المجلد الخاص بالبيئة الإفتراضية، وتستطيع تغيير الاسم كما تريد والاسم الشائع هو venv. وبعد إنشاء بيئة العمل الافتراضية باستخدام venv، عليك باتباع الخطوات التالية: 1- تفعيل بيئة العمل: venv\Scripts\activate ولاحظ أنه في أول الأمر تم كتابة اسم المجلد الخاص بالبيئة الإفتراضية. 2- تثبيت الحزم اللازمة: بعد تفعيل بيئة العمل، تستطيع تثبيت الحزم المطلوبة باستخدام مدير الحزم الخاص بـ Python (pip). مثلاً تثبيت حزمة Flask، استخدم الأمر التالي: pip install flask وعليك تثبيت باقي الحزم الأخرى اللازمة للمشروع، وأيضًا ضبط متغيرات البيئة كما سيتم شرحها لك في الدورة.
  14. معنى الرسالة أن هناك خطأ في ملف pubspec.yaml الخاص بمشروعك، والرسالة تشير إلى خطأ في السطر 61 في عمود 4، و يفترض أن يكون لديك مفتاح صحيح في هذا السطر وفقًا لصيغة YAML، لذلك حاول اتبع الخطوات التالية: قم بفتح ملف pubspec.yaml في محرر النصوص الخاص بك. انتقل إلى السطر 61 وتحقق من وجود أي أخطاء في النحو أو التنسيق. تأكد من أن المفتاح الموجود في هذا السطر صحيح ومكتوب بشكل صحيح وأنه ليس هناك أخطاء في التنسيق مثل تقديمه بطريقة صحيحة. بعد إجراء التعديلات المطلوبة، يجب أن تتمكن من تنفيذ flutter pub get بنجاح دون وجود أخطاء. وسأشرح لك الأمر بمثال عن كيفية حدوث خطأ مشابه في ملف pubspec.yaml: ... 60 dependencies: 61 assets: 62 - assets/images/ 63 - assets/fonts/ ... الخطأ في المثال هو أن العنصر "assets" يفتقد رمز النقطة الرأسية (colon) بعد كلمة "assets"، ويجب أن يكون الملف pubspec.yaml بهذا الشكل الصحيح: ... 60 dependencies: 61 assets: 62 - assets/images/ 63 - assets/fonts/ ... تأكد من إضافة النقطة الرأسية بعد "assets" وترتيب الهمزة والساكنة بشكل صحيح للمفتاح والقيمة الموجودة في القائمة، بعد ذلك، يجب أن تتمكن من تنفيذ flutter pub get بنجاح.
  15. سأوضح لك الخطوات التي أشار إليك بها عدنان: 1- إنشاء ملف XML لتصميم إشعارك، باستخدام عنصر RelativeLayout أو LinearLayout لتحديد تخطيط الإشعار الخاص بك وتضمين العناصر المختلفة مثل الصورة والنص. مثال: <!-- notification.xml --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/notification_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/notification_icon" /> <TextView android:id="@+id/notification_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/notification_icon" android:text="عنوان الإشعار" /> <TextView android:id="@+id/notification_message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/notification_title" android:layout_toRightOf="@id/notification_icon" android:text="رسالة الإشعار" /> </RelativeLayout> 2- في فئة النشاط (Activity) أو الخدمة (Service) التي ترغب في استخدام الإشعار، أنشئ كائنًا من فئة NotificationCompat.Builder لبناء الإشعار. مثال: // في الأعلى من الفئة، قم بإضافة استيرادات التالية: // import androidx.core.app.NotificationCompat; // import androidx.core.app.NotificationManagerCompat; public class MyActivity extends AppCompatActivity { // ... private static final String CHANNEL_ID = "my_channel_id"; // قم بتعيين قيمة فريدة لهذا المعرف private void showNotification() { // بناء الإشعار NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("عنوان الإشعار") .setContentText("رسالة الإشعار") .setPriority(NotificationCompat.PRIORITY_DEFAULT); // قم بإنشاء النقرة النائبة (PendingIntent) للتعامل مع نقرة المستخدم على الإشعار (اختياري) Intent intent = new Intent(this, MyActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); builder.setContentIntent(pendingIntent); // إنشاء الإشعار NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(notificationId, builder.build()); } // ... } 3- إنشاء قناة الإشعار (Notification Channel) في طراز الأندرويد الذي يدعم قنوات الإشعارات (Android 8.0 أو أعلى). مثال: public class MyApplication extends Application { private static final String CHANNEL_ID = "my_channel_id"; // يجب أن يتطابق مع القيمة المستخدمة في الخطوة السابقة @Override public void onCreate() { super.onCreate(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // إنشاء قناة الإشعار CharSequence name = "اسم القناة"; String description = "وصف القناة"; int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); channel.setDescription(description); // تهيئة إعدادات قناة الإشعار NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); } } } 4. تنفيذ دالة showNotification() عند الحاجة لعرض الإشعار. بمجرد تنفيذ دالة showNotification()، ستقوم ببناء الإشعار وعرضه للمستخدم، وتستطيع استدعاء هذه الدالة من أي مكان في تطبيقك وفي أي سياق مناسب. مثلاً استدعاء showNotification() عندما يتم اكتشاف حدث جديد في التطبيق، مثل وصول رسالة جديدة أو تحديث مهم، أيضًا استدعائها من داخل خدمة (Service) لعرض إشعارات دورية أو قائمة بالتحديثات الجديدة. مثال على استدعاء showNotification(): public class MyActivity extends AppCompatActivity { // ... private void checkForNewMessages() { // افحص على وجود رسائل جديدة // إذا تم العثور على رسالة جديدة، عرض إشعار if (hasNewMessages()) { showNotification(); } } // ... } تأكد من تعيين القيم المناسبة لكائن NotificationCompat.Builder في دالة showNotification() واستخدم الأساليب المناسبة لتخصيص الإشعار حسب احتياجات تطبيقك. من الهام جدًا أن تتذكر أنه بدءًا من Android 8.0 (API level 26)، يجب عليك إنشاء قناة إشعارات (Notification Channel) وتعيينها لكائن NotificationCompat.Builder حتى يتم عرض الإشعار بنجاح. وتأكد من استدعاء الدالة createNotificationChannel() في الوقت المناسب، كما تم شرحه في الخطوة 3 في الإجابة السابقة.
  16. رسالة الخطأ في الملف App.js تعني أن هناك مشكلة في تعريف المتغير 'Text'، حيث أنه غير معرف. وعليك أولاً بكتابة المكون بشكل صحيح، عن طريق تمرير props كمعامل في المكون كالتالي: import React from 'react'; function Text(props) { return <p>{props.text}</p>; } export default Text; ثم يمكنك استيراد المكون "Text" في ملف App.js واستخدامه كما تريد: import React from 'react'; import Text from './Text'; function App() { return ( <div> <Text text="مرحبًا بك" /> </div> ); } export default App; ولاحظ أنني قمت بتمرير text كـ prop بقيمة مرحبًا بك للمكون Text. ,تأكد من وضع ملف "Text.js" في نفس المجلد الذي يحتوي على ملف "App.js"، أو قم بتعديل المسار المناسب في حالة وجودهما في مجلدين منفصلين، أي استورده بشكل صحيح.
  17. في مجال البرمجة لا غنى عن مستوى مقبول من اللغة الإنجليزية، ففي العمل اليومي ستتعرض للغة الإنجليزية بلا شك، سواء عند البحث عن مشكلة تريد حل لها على المواقع الأجنبية، أو قراءة المستندات الخاصة بالمكتبات وإطار العمل الذي تستخدمه من أجل معرفة كيفية استخدام ميزة معينة في المشروع أو من أجل حل مشكلة تواجهك. وأيضًا في الإيميلات والتراسلات بين فريق العمل قد يتم استخدام اللغة الإنجليزية بها، لذلك أنت بحاجة إلى مستوى مقبول من حيث القراءة والاستماع والكتابة وقد يتم التغاضي عن التحدث. أي يجب إمتلاك ما تستطيع به تسيير أمور عملك اليومي بدون مشاكل، وإلا سيتم إختيار شخص آخر يمتلك مهارات تواصل جيدة فبيئة العمل لا تعني كتابة الكود فقط. وربما تجد شركات تستخدم لا تحتاج إلى لغة إنجليزية في بيئة العمل، لكن ذلك أمر نادر تلك الأيام حيث يجب إمتلاك مستوى مقبول كما ذكرت، وتستطيع دراسة اللغة الإنجليزية من قناة طليق أو ذي أمريكان إنجليش على اليوتيوب أو من خلال تطبيق الهاتف. وقد تم التطرق إلى سؤالك بالتفصيل في النقاش التالي:
  18. بالنسبة لسؤالك الأول: فتطبيقات تسجيل المكالمات المتوفرة على Google Play تعمل بطرق مختلفة وتختلف في سياساتها وقدراتها، وأغلبها يقوم بتنفيذ العملية على جهازك الخاص، وليس على خوادم المطور الخارجية. وغالبًا ما يتم تخزين ملفات تسجيل المكالمات على جهازك أو في سحابة التخزين الشخصية التي تحددها (مثل Google Drive أو Dropbox)، وليس عند مطور التطبيق. بالتالي، فإن الأرقام والتفاصيل الشخصية المتعلقة بالمكالمة تكون محفوظة فقط على جهازك وليست متاحة للمطور. ومع ذلك، يجب أن تتأكد من قراءة سياسة الخصوصية وشروط الاستخدام لكل تطبيق تسجيل المكالمات قبل استخدامه. قد توجد بعض التطبيقات التي تجمع وتخزن المكالمات على خوادم المطور، ولذا يجب أن تتأكد من الإعدادات والسياسات الخاصة بالتطبيق لمعرفة كيفية معاملة بياناتك الشخصية. وبالنسبة لسؤالك الثاني: في حالة كان هناك خاصية التخزين السحابي ومزامنة التسجيلات الخاصة بك، فتستطيع تحميل التطبيق والدخول بحسابك وستجد المكالمات التي تم تسجيلها سابقًا. أما إذا كان يتم التخزين على حسابك في Google Drive فعليك بتفقد المجلد هناك وستجد المكالمات المسجلة. أما إذا كان يتم التخزين على جهازك وحذفت التطبيق، فهناك إحتمالان، الأول أن مجلد المكالمات المسجلة قد تم حذفه ولن تستطيع استرجاعه حيث أن ذلك حدث منذ فترة بناءًا على كلامك. والإحتمال الثاني أن مجلد المكالمات المسجلة مازال موجود وعليك بتفقد الملفات الصوتية لديك للتأكد من ذلك.
  19. المشكلة تحدث عندما تحاول تحويل قيمة من نوع int إلى نوع String في السطر التالي: controller.itemsId.toString() ويتوقع البرنامج أن يكون itemsId من نوع String وليس int. لذلك عليك بتحويل itemsId إلى String قبل تمريره إلى paniercontroller، وتستطيع استخدام الدالة toString() لتحقيق ذلك. وهناك عدة طرق لفعل ذلك، ومنها: controller.paniercontroller.add(controller.itemsId.toString()); من المهم أيضًا التحقق مما إذا كانت القيمة controller.itemsId صحيحة وغير فارغة، فقم بالتحقق من صحة القيمة قبل تحويلها إلى سلسلة نصية باستخدام شرط مثل هذا: IconButton( onPressed: () { if (controller.itemsId != null) { controller.paniercontroller.add( controller.itemsId.toString() ); } }, icon: Icon(Icons.add) ),
  20. كلاهما مطلوبان في سوق العمل، لكن لكل سوق عمل متطلباته فربما لديك المطلوب بكثرة هي لغة جافاسكريبت وإطارات العمل والمكتبات الخاصة بها مثل React و Node.js. لذلك لإتخاذ القرار بشكل سليم وليس بناءًا على تفضيلات شخصية أو إحصائيات عالمية، حدد ماذا تريد أنت بالضبط هل تريد العمل في السوق المحلي؟ إذًا توجه لمواقع التوظيف الشهيرة في بلدك مثل LinkedIn وغيرها أنت أدرى بهم، وتفقد هل هناك وظائف متاحة لمطور واجهات خلفية بلغة بايثون وإطار دجانغو قم بالبحث بأكثر من كلمة مفتاحية مثل backend developer أو Django developer أو python developer. فإن وجدت طلب على تلك المهارات فأنت في الطريق السليم، وإن لم تجد عليك بسؤال شخص له خبرة سواء من خلال جروب على فيسبوك يجمع مبرمجي بلدك أو شخص تعرفه يعمل في السوق المحلي لديك. وفي حال لم تكن مطلوبة، عليك باستكمال تعلم أساسيات بايثون فستحقق استفادة منها لا شك، بعد ذلك انتقل لتعلم جافاسكريبت والإطارات والمكتبات الخاصة بها، أو لغة PHP وإطار لارافيل ومنصة وورد بريس. وقبل أن تتعلم أي لغة سواء جافاسكريبت أو PHP عليك بالبحث والتأكد من أنها مطلوبة في سوق العمل لديك وليس التعلم لمجرد أنك تحب لغة معينة ضع شغفك جانبًا لحين الحصول على وظيفة. وإذا كنت تريد العمل على مواقع العمل الحر مثل خمسات ومستقل، عليك بتفقد المشاريع والمهارات الخاصة بها لتنفيذها، والأغلبية بحاجة إلى مبرمجين PHP وإطار لارافيل ومنصة وورد بريس وذلك على مواقع العمل الحر العربية. لا تستمتع لأحد ليس لديه خبرة، وتفقد أنت الوظائف وقرر بعد ذلك، وابحث بكلمات مختلفة مثل react developer أو node.js developer أو php developer أو laravel developer أو WordPress developer وطالما أنك تريد الواجهة الخلفية فقم بالبحث عن backend developer وتفقد ما هي اللغات وإطار العمل الأكثر طلبًا بالنسبة لمستوى Junior أو Entry level أو خبرة سنة.
  21. أرجو منك طرح السؤال أسفل فيديو الدورة وتوضيح الرسالة والأفضل نسخها ولصقها في السؤال، وذلك لنتمكن من مساعدتك بشكل أفضل. وجرب إغلاق المتصفح بالكامل ومحرر الأكواد لديك ثم تشغيل المشروع من جديد، وأخبرني بالنتيجة. شكرًا لك.
  22. المشكلة تتعلق بأخطاء في عملية البناء لتطبيق Flutter على نظام Windows، حيث يوجد خطأ في ملف "image_provider.dart" في السطر 998، يفتقد علامة ";" بعد النقطة في نهاية السطر، وأيضًا يوجد خطأ يشير إلى عدم إمكانية تعيين قيمة من نوع "Type" إلى متغير من نوع "int". بالإضافة إلى خطأ آخر يشير إلى فشل عملية البناء الخاصة بـ CMake و MSBuild، وقد يكون هناك مشكلة في ملفات المشروع أو إعدادات بناء البرنامج. حاول تجربة الحلول التالية: تأكد من تحديث Flutter وجميع المكتبات والأدوات ذات الصلة إلى أحدث الإصدارات المتاحة. التحقق من الملف "image_provider.dart" وتأكد من وجود العلامة ";" بشكل صحيح في السطر 998 وأنه لا يوجد أخطاء أخرى في الملف. تأكد من أنك تستخدم إصدارًا متوافقًا من CMake و MSBuild، من خلال التحقق من تثبيتهما بشكل صحيح وتكوينهما بشكل صحيح في البيئة الخاصة بالتطوير. تحديث بيئة التطوير الخاصة بك (مثل Visual Studio) إلى أحدث إصدار، حيث قد يكون هناك تحديثات أو إصلاحات لمشاكل معروفة. تنفيذ الأمر flutter clean إعادة تشغيل النظام الخاص بك وتنفيذ عملية بناء التطبيق مرة أخرى للتحقق مما إذا كانت المشكلة قد تم حلها.
  23. الخطأ "Network Error" يشير إلى حدوث خطأ في الشبكة أثناء إجراء الاستدعاء، وطالما أنك لا تواجه مشكلة في الخادم من جانب العميل وتستطيع رؤية البيانات، حاول تجربة التالي لحل المشكلة: 1- في بعض الأحيان، يمكن أن يتسبب تعطيل سياسات الأمان (CORS) في حدوث أخطاء شبكة، لذلك عليك تمكين CORS على الخادم الخاص بك للسماح بالطلبات القادمة من المستعرض. من خلال إضافة رأس (header) إلى استجابة الخادم للسماح بجميع المصادر. مثال: const express = require('express'); const app = express(); app.get('/users', (req, res) => { // رمز لاسترداد بيانات المستخدمين const users = [{ name: 'User 1' }, { name: 'User 2' }]; res.setHeader('Access-Control-Allow-Origin', '*'); res.json(users); }); app.listen(5000, () => { console.log('Server is running on port 5000'); }); 2- قد يكون هناك خطأ آخر في الجزء الخادم من التطبيق، تأكد من أن الخادم يعمل بشكل صحيح وأنه لا يوجد أخطاء في رمز الخادم الخاص بك. 3- تصحيح الكود الخاص بك للتأكد من استخدام Axios بشكل صحيح، حاول استخدام كود مشابه للتالي: import axios from 'axios'; import { useEffect, useState } from 'react'; const MyComponent = () => { const [users, setUsers] = useState([]); useEffect(() => { const fetchData = async () => { try { const response = await axios.get('http://localhost:5000/users'); setUsers(response.data); } catch (error) { console.error('Error fetching data:', error); } }; fetchData(); }, []); return ( // تقوم بعرض البيانات هنا ); }; export default MyComponent; تأكد من تغيير "Axios" إلى "axios" بالحرف الصغير في استيرادها حيث أنك تستوردها بالحرف الكبير.
  24. بجانب حزمة accesscontrol يوجد حزم أخرى تؤدي نفس الغرض. 1- حزمة "express-session" أدوار: تمنح المستخدمين أو العملاء دورًا معينًا مثل "مستخدم عادي" أو "مشرف". أذونات: يمكن تعيين الأذونات لكل دور بناءً على احتياجات التطبيق، مثل الوصول إلى صفحات معينة أو القدرة على إجراء إجراءات معينة. 2- حزمة "passport" أدوار: تتيح للمستخدمين تسجيل الدخول باستخدام مقدمي الخدمة المعتمدين مثل Google أو Facebook أو Twitter. أذونات: تعيين الأذونات لكل مستخدم معتمد بناءً على معلوماته والتحقق من صحته. 3- حزمة "jsonwebtoken" أدوار: إنشاء رموز مصادقة (tokens) للمستخدمين الموثوق بهم للوصول إلى موارد محددة. أذونات: تضمين الأذونات داخل الرموز المصادقة لتحديد الصلاحيات والوصول المسموح به. 4- حزمة "acl" أدوار: إنشاء مجموعات أدوار مخصصة وتعيين أذونات محددة لكل دور. أذونات: تعيين الأذونات على المسارات والإجراءات والموارد الأخرى في التطبيق. 5- حزمة "connect-roles" أدوار: إنشاء أدوار مخصصة وتعيينها للمستخدمين لتحديد صلاحياتهم. أذونات: تعيين الأذونات لكل دور مثل الوصول إلى صفحات معينة أو القدرة على إجراء إجراءات معينة. وإليك مثال مفصل على كيفية استخدام حزمة "express-session" لإدارة أدوار المستخدمين: 1- تثبيت حزمة "express-session" باستخدام npm عبر الأمر التالي. npm install express-session 2- استيراد الحزمة وتكوينها. عليك إضافة التالي في ملف التهيئة الخاص بتطبيقك (مثل app.js أو server.js): const session = require('express-session'); app.use(session({ secret: 'secret-key', resave: false, saveUninitialized: true })); هنا، يتم استيراد حزمة "express-session" وتكوينها لاستخدامها في تطبيق Express، وتحديد المفتاح السري (secret-key) الذي يستخدم لتوقيع وتشفير معلومات الجلسة. 3- تعيين دور المستخدم. عند تسجيل الدخول للمستخدم، تستطيعي تعيين دوره بناءً على المعلومات الخاصة به. app.post('/login', (req, res) => { // تحقق من صحة بيانات المستخدم وتنفيذ العمليات اللازمة // عند التحقق من صحة بيانات المستخدم، قم بتعيين دور المستخدم req.session.role = 'مستخدم عادي'; res.send('تم تسجيل الدخول بنجاح'); }); 4- التحقق من دور المستخدم وإعدادات الأذونات. تستطيعي التحقق من دور المستخدم وتعيين الأذونات المناسبة في مسارات التطبيق المناسبة. app.get('/admin', (req, res) => { if (req.session.role === 'مشرف') { // يتمكن المشرف من الوصول إلى هذه الصفحة res.send('مرحبًا بك، مشرف'); } else { // الوصول مرفوض للمستخدمين العاديين res.status(403).send('عذرًا، ليس لديك الصلاحية للوصول إلى هذه الصفحة'); } });
  25. الخطأ في الصورة يتعلق بإصدار تضمين Android الذي يستخدمه التطبيق، والرسالة التحذيرية تعني أن الإصدار الذي تستخدمه قد تم إهماله (deprecated) ويجب ترقية التطبيق إلى الإصدار الجديد (v2 embedding) لتفادي حدوث أخطاء غير متوقعة أثناء التشغيل أو حدوث أخطاء في المستقبل أثناء عملية البناء. المشكلة الثانية تتعلق بأخطاء في نظام CMake الذي يستخدم في عملية البناء، وهناك خطأين ويشير الخطأ الأول إلى أن مجلد CMakeCache.txt الحالي الذي يقع في المسار "C:/food/build/windows/CMakeCache.txt" مختلف عن المجلد الذي تم إنشاءه فيه "d:/cL.i<s/food/build/windows"، وهذا قد يؤدي إلى إنشاء الملفات الثنائية في مكان غير صحيح. والخطأ الثاني يشير إلى أن المصدر "C:/food/windows/CMakeLists.txt" لا يتطابق مع المصدر "D:/oL.i<./food/windows/CMakeLists.txt" المستخدم لإنشاء ذاكرة التخزين المؤقت (cache)، ويوصى بإعادة تشغيل CMake مع مجلد المصدر الصحيح. ولحل المشكلة عليك بترقية التطبيق إلى الإصدار الجديد من تضمين Android (v2 embedding) وفقًا للوثائق المشار إليها في الرسالة، وهي: https://github.com/flutter/flutter/wiki/Upgrading-pre-1.12-Android-projects وتستطيع البحث على يوتيوب عن Fix app to be migrated to the android embedding v2 in flutter وستجد شرح يوضح خطوات الحل. بعد ذلك، يجب التأكد من تصحيح إعدادات نظام CMake والمجلدات المستخدمة للمصدر وذاكرة التخزين المؤقت للتأكد من تطابقها وتحديدها بشكل صحيح. أيضًا التأكد من تحديث Flutter وجميع المكتبات والأدوات ذات الصلة إلى أحدث الإصدارات المتاحة، حيث قد يساعد ذلك في حل بعض المشاكل المتعلقة بالتوافق والتحديثات الضرورية للمشروع.
×
×
  • أضف...