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

عبدالباسط ابراهيم

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

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

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

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

    11

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

  1. "guest@" ليس دالة ولا متغير في البرمجة بشكل عام، ولا يمكن الإجابة على السؤال بدقة دون معرفة السياق الذي تم استخدام هذا المصطلح فيه. ولكن يبدو أنه خاص بإطار العمل laravel لذلك كجزء من إصدار Laravel 5.5، قدمت Laravel توجيهات جديدة في Blade تسمى @auth و @guest. كما يوحي الاسم، كل منهما يمكن أن يكون مفيدًا لتحديد ما إذا كان المستخدم الحالي مصادقًا أم زائرًا. في الإصدارات السابقة من Laravel، كنا نستخدم التوجيهة @if مع Auth()->check() للتحقق من حالة المصادقة للمستخدم. ولكن التوجيهات الجديدة تجعل الكود أكثر نظافة، لنرى كيف يمكننا استخدامها. الآن يمكننا التحقق بسرعة مما إذا كان المستخدم الحالي مصادقًا أو زائرًا: // باستخدام @guest @guest guest stuff here @else logged user stuff here @endauth // باستخدام @auth @auth logged user stuff here @else guest stuff here @endauth الطريقة القديمة للتحقق من حالة المصادقة: @if (auth()->check()) @endif
  2. تستطيع تحديد عدد معين من السجلات الجديدة في Django باستخدام: - Model Manager - Limiting queryset في حالتك، يمكنك عمل التالي: أنشئ Manager خاص بـ Flashcard from django.db import models class FlashcardManager(models.Manager): def create_flashcards(self, num): for i in range(num): Flashcard.objects.create() class Flashcard(models.Model): objects = FlashcardManager() # use the custom manager استدعي `.create_flashcards(10)` كل يوم لإنشاء 10 فلاش كارد فقط. from .models import Flashcard Flashcard.objects.create_flashcards(10) يمكن أيضًا استخدام `.bulk_create()` وتحديد عدد السجلات: Flashcard.objects.bulk_create([Flashcard() for i in range(10)]) أو استخدام `queryset.limit()`: for i in range(10): Flashcard.objects.create() هذه الطرق ستضمن إنشاء 10 فلاش كارد فقط كل يوم. تستطيع اختيار الطريقة المناسبة لك.
  3. تطوير الويب مستمر لسنوات لعدة أسباب: يستمر الطلب على مهارات تطوير الويب في النمو كلما تحولت المزيد من الشركات إلى الإنترنت وزادت من وجودها على الإنترنت. يدفع نمو التجارة الإلكترونية ووسائل التواصل الاجتماعي وتطبيقات الويب المتنقل هذا الطلب. الويب يتطور باستمرار مع تقنيات وإطارات ولغات جديدة. هذا يعني أن مطوري الويب لديهم العديد من الفرص للتعلم المستمر والنمو وتطوير مهاراتهم. يحافظ على العمل مثير للاهتمام ومشوق. هناك تخصصات متعددة ضمن تطوير الويب، بدءاً من التطوير الأمامي إلى الخلفي، إلى تطوير الجزء الكامل. هذا يتيح لمطوري الويب إيجاد تخصصات ضيقة تتوافق مع اهتماماتهم وقدراتهم. رواتب تطوير الويب نسبيا عالية مقارنة بمهن أخرى، وفرص العمل عن بعد والعمل الحر توفر مرونة. ولكن يؤثر الذكاء الاصطناعي (AI) على تطوير الويب وتخلق فرص عمل جديدة في هذا المجال. ويعتبر أحد المجالات التي يؤثر فيها الذكاء الاصطناعي بشكل كبير يمكنك قراءة المزيد من المقالات في التعليق السابق بدلاً من التكرار
  4. كما في التعليقات السابقة فهذا الأمر يرجع إليك من خلال معرفة مميزات وعيوب كل مجال كما يلي تطوير الويب: مجال واسع ومتنوع يشمل تطوير مواقع الويب والتطبيقات المستندة إلى الويب. مطلوب للغاية بسبب انتشار الإنترنت واعتماد العديد من الشركات على الحضور على الإنترنت. تحتاج إلى مهارات في لغات مثل HTML & CSS & JavaScript. فرص العمل واسعة وتشمل وكالات الإعلانات وشركات التسويق ووسائل الإعلام وكبرى الشركات. العيب الرئيسي هو المنافسة العالية وسرعة تغير التقنيات. تطوير التطبيقات: يشمل جميع أنواع التطبيقات سواء كانت موجهة لأجهزة أندرويد أو آي أو إس. هناك عدد كبير ومتزايد من التطبيقات، لذلك فرص العمل واسعة. يتطلب فهما عميقا لأنظمة التشغيل وأدوات البرمجة التي تدعم كل منصة. المنافسة عالية بسبب شعبية تطبيقات الهاتف. هندسة البرمجيات: مجال مستقر ومهني يهتم بعملية تصميم البرمجيات وضمان جودتها. المهندسون يطورون وينفذون اللوائح والممارسات الجيدة لتطوير البرمجيات بكفاءة. أساليب العمل منهجية ومنظمة تستخدم أدوات مثل UML. فرص العمل متاحة في جميع القطاعات الصناعية والدخل جيد. تكون عملية تطوير البرمجيات أكثر كفاءة وفعالية. الذكاء الاصطناعي: مجال في طور النمو بسرعة مع تزايد الحاجة إلى تقنيات الذكاء الاصطناعي. تحديات برمجية مثيرة للاهتمام كالروبوتات والتعلم الآلي. فرص العمل كبيرة في القطاعات الصناعية الرئيسية. المهارات الرياضية والإحصائية ضرورية. جديد نسبيا، ولكن لديه مستقبل واعد.
  5. تستخدم قوالب Django علامات {% if %} و {% endif %} لإنشاء عبارات if. يتمثل بناء الجملة الأساسي لعبارة if في الشكل التالي: {% if variable %} <!-- الكود الذي يتم تنفيذه إذا كانت القيمة المحددة للمتغير صحيحة --> {% endif %} يمكن استخدام أي متغير صالح للقالب داخل عبارة if، مثل المتغيرات المرسلة من العرض أو المتغيرات التي تم حسابها في القالب. مثال بسيط على عبارة if في قالب Django أحد الأمثلة البسيطة والشائعة في استخدام عبارة if في قالب Django هو عندما ترغب في التحقق مما إذا كان المستخدم المتصل حاليًا بالموقعد أم لا، ومن ثم توفير الخطوات اللازمة بناءً على حالة المصادقة. هكذا يتم تنفيذه: <h1>مرحبًا بك في موقعي</h1> {% if user.is_authenticated %} <p>مرحبًا، {{ user.username }}</p> <p><a href="{% url 'logout' %}">تسجيل الخروج</a></p> {% else %} <p>أنت غير مسجل الدخول.</p> <p><a href="{% url 'login' %}">تسجيل الدخول</a></p> {% endif %} في هذا المثال، تقوم عبارة if بفحص خاصية user.is_authenticated لتحديد ما إذا كان المستخدم قد سجل الدخول أم لا. اعتمادًا على النتيجة، سيتم عرض محتوى مختلف في القالب. إذا كان المستخدم قد سجل الدخول، سيتم عرض "مرحبًا [اسم المستخدم]" ورابط تسجيل الخروج، وإلا فسيتم عرض "أنت غير مسجل الدخول" ورابط تسجيل الدخول. {% else %} و {% elif %} بالإضافة إلى الجملة if الأساسية، تدعم قوالب Django أيضًا استخدام علامات {% else %} و {% elif %}. يمكن استخدام علامة {% else %} لتحديد كود يتم تنفيذه إذا لم يتم تلبية الشرط في عبارة if، كما فعلنا في المثال السابق، بينما يمكن استخدام علامة {% elif %} لتحديد شروط إضافية يتم فحصها. ولكن إذا كنت تريد ربط عدة عبارات if معًا باستخدام علامة {% elif %} للتحقق من شروط إضافية، فيمكنك استخدام الشكل التالي: {% if variable == 5 %} <p>المتغير يساوي 5.</p> {% elif variable == 10 %} <p>المتغير يساوي 10.</p> {% else %} <p>المتغير لا يساوي 5 أو 10.</p> {% endif %}
  6. يمكن أن تواجه مشكلة في عدم ظهور النتيجة في المتصفح بسبب استخدام أسلوبين مختلفين لتحميل نفس الملف `home.glb`. يتم استخدام `model-viewer` element في HTML و `GLTFLoader` في Three.js لتحميل الملف وعرضه. يجب استخدام الأسلوب الواحد لتحميل الملف، وإما استخدام `model-viewer` أو `GLTFLoader`. إذا كنت تريد استخدام `model-viewer`، يمكنك إزالة كود `GLTFLoader` في Script.js واستخدام العنصر `model-viewer` في HTML: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>3D</title> </head> <body> <div class="container"> <model-viewer src="./home.glb" auto-rotate camera-controls alt="cube"></model-viewer> </div> </body> </html> بينما إذا كنت تريد استخدام GLTFLoader، فيمكنك إزالة العنصر model-viewer من HTML وتغيير كود Script.js إلى الشكل التالي: import * as THREE from 'three'; import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls' import {GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader'; import {DRACOLoader} from 'three/examples/jsm/loaders/DRACOLoader'; const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); const controls = new OrbitControls(camera, renderer.domElement); camera.position.set(0, 0, 5); controls.update(); const loader = new GLTFLoader(); const draco = new DRACOLoader(); draco.setDecoderPath('/examples/jsm/libs/draco/'); loader.setDRACOLoader(draco); // Load a glTF resource loader.load( '/home.glb', gltf => { gltf.scene.scale.set(.1,.1,.1); scene.add(gltf.scene); }, xhr => { let percent = xhr.loaded / xhr.total * 100; console.log(`${percent}% of home model loaded.`); }, error => { console.error(error); } ); function animate() { requestAnimationFrame(animate); renderer.render(scene, camera); } animate(); ويجب أن يتم تضمين الملفات اللازمة لـ OrbitControls و GLTFLoader و DRACOLoader لضمان عمل الكود بشكل صحيح.
  7. السبب في جعل الصنف الأول "abstract" هو أنه يعمل كصنف أساسي أو واجهة للصنف الآخر الذي يمتد منه. في هذه الحالة، يهدف "NewestBooksState" إلى كونها واجهة مشتركة لجميع الحالات الممكنة التي يمكن أن يكون عليها "NewestBooksCubit". بجعل "NewestBooksState" مجرد صنف أساسي، فلا يمكن إنشاؤه مباشرة، ولكن يمكن تمديده من خلال صنف آخر لتعريف حالات أكثر تحديداً. هذا هو نمط شائع في إدارة الحالة بنمط Cubit أو BLoC، حيث يكون الحالة الأساسية مجردة، وتمتد الحالات الفعلية منها لتمثيل حالحالات المختلفة للتطبيق. بالإضافة إلى ذلك، بتنفيذ صنف "Equatable" والتعديل على الطريقة "props"، يمكّن ذلك من مقارنة الحالات المختلفة بسهولة عن طريق مقارنة خصائصها. وهذا مهم عندما يصدر Cubit حالة جديدة ونريد التحقق من ما إذا كانت مختلفة عن الحالة السابقة وتحريك التحديثات وفقًا لذلك. كما أن استخدام الفئة المجردة abstract class في بلوك (BLoC) له عدة فوائد: تنظم الحالات (states) في هيكل تراثي. يمكن للفئة المجردة ان تكون اب لجميع الحالات، وبالتالي تربط بينها. تجبر على تطبيق الوظائف التي يحتويها الفئة الأب abstract class في الفئات المشتقة منها. مثلا يمكن تعريف وظيفة abstract في الفئة الأب، ثم تطبيقها في الفئات البنات. تسهل اضافة فئات جديدة مشتقة لأن التركيبة والقواعد الأساسية يتم وضعها في الفئة الأب. تساعد في اعادة الإستخدام لأن الفئة الأب تحتوي على المنطق المشترك بين الحالات، ويمكن استخدام نفس المنطق في سياقات مختلفة. في المثال الذي أعطيته، تم استخدام abstract class لتنظيم حالات الكيوبت (cubit) في هيكل تراثي. وهذا يسهل الحفاظ على الكود وتطويره فيما بعد.
  8. الفرق بين الParameters والArguments: في هذا المثال، لدينا دالة تسمى "addNumbers" تقوم بإضافة رقمين وإرجاع النتيجة: function addNumbers(num1, num2) { return num1 + num2; } يتم تعريف المتغيرات num1 و num2 كـ parameters في تعريف الدالة. وعند استدعاء الدالة، يتم تمرير الـ arguments وهي القيم الفعلية التي يتم إدخالها إلى الدالة، كما هو موضح في المثال التالي: var result = addNumbers(5, 10); console.log(result); // النتيجة هي 15 في هذا المثال، يتم تعريفالـ parameters num1 و num2 في تعريف الدالة "addNumbers". وعند استدعاء الدالة باستخدام الـ arguments 5 و 10، تتم إسناد القيم 5 و 10 إلى المتغيرات num1 و num2 على التوالي، وتقوم الدالة بإضافة المتغيرين وإرجاع النتيجة 15. الفرق بين الDeclaration والInitialization: في هذا المثال، لدينا متغير يسمى "name" يتم تعريفه في الكود وإسناد قيمة له في وقت لاحق: var name; name = "John"; console.log(name); // النتيجة هي "John" في هذا المثال، يتم استخدام الـ Declaration لتعريف المتغير "name" دون تحديد قيمة محددة له. ويتم استخدام الـ Initialization لإسناد القيمة "John" إلى المتغير "name" في الوقت الذي يتم فيه تعريفه، ويتم ذلك باستخدام علامة الـ "=" لإسناد قيمة "John" إلى المتغير "name". وبعد ذلك، يتم طباعة قيمة المتغير باستخدام console.log()، وتكون النتيجة "John". الـ Execution Context: في هذا المثال، لدينا دالة تسمى "greet" تقوم بطباعة رسالة ترحيب باستخدام المتغير "name": function greet(name) { console.log("Hello, " + name + "!"); } var message = "Welcome to my website!"; greet("John"); عند استدعاء الدالة "greet" باستخدام الـ argument "John"، يتم إنشاء Execution Context جديد يحتوي على المتغيرات التالية: المتغير "name" الذي تم تعريفه كـ parameter في دالة "greet". المتغير "message" الذي تم تعريفه في المستوى العلوي من الكود. يتم إنشاء Lexical Environment جديد لكل Execution Context، والذي يحتوي على الـ Identifier bindings التي تم تعريفها في هذا النطاق. في هذا المثال، يتم الوصول إلى المتغير "name" من خلال Lexical Environment الخاص بـ Execution Context الذي تم إنشاؤه لدالة "greet"، بينما يتم الوصول إلى المتغير "message" من خلال Lexical Environment العلوي للكود. الـ Lexical Environment: في هذا المثال، لدينا دالة تسمى "calculateArea" تقوم بحساب مساحة المستطيل باستخدام المتغيرات "width" و "height": ini function calculateArea(width, height) { var area = width * height; return area; } var width = 5; var height = 10; var result = calculateArea(width,height); console.log(result); // النتيجة هي 50 في هذا المثال، يتم تعريف المتغيرات "width" و "height" في المستوى العلوي من الكود، وتتم إسناد القيم 5 و 10 إلى المتغيرات على التوالي. وعند استدعاء الدالة "calculateArea" باستخدام الـ arguments "width" و "height"، يتم إنشاء Execution Context جديد يحتوي على المتغيرات التالية: المتغير "width" الذي تم تعريفه في المستوى العلوي من الكود. المتغير "height" الذي تم تعريفه في المستوى العلوي من الكود. المتغير "area" الذي يتم تعريفه داخل الدالة "calculateArea". يتم إنشاء Lexical Environment جديد لكل Execution Context، والذي يحتوي على الـ Identifier bindings التي تم تعريفها في هذا النطاق. في هذا المثال، يتم الوصول إلى المتغيرات "width" و "height" من خلال Lexical Environment العلوي للكود، بينما يتم الوصول إلى المتغير "area" من خلال Lexical Environment الخاص بـ Execution Context الذي تم إنشاؤه لدالة "calculateArea". وتتم إدارة المتغيرات في هذه الـ Lexical Environment، ويتم الوصول إليها من خلال الـ Execution Context الخاص بها. يمكنك الإطلاع على المزيد من المعلومات من خلال المقالة التالية
  9. يمكنك استخدام الحل التالي RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^egypt/(.*)$ egypt.php/$1 [L] في هذا المثال، يتم استخدام الشرط %{REQUEST_FILENAME} !-f لتحويل الروابط التي لا تشير إلى ملفات في الموقع، والشرط %{REQUEST_FILENAME} !-d لتحويل الروابط التي لا تشير إلى مجلدات في الموقع، وذلك لتجنب تحويل الروابط الثابتة في الموقع. يتم استخدام النمط ^egypt/(.*)$ لتحويل جميع الروابط التي تحتوي على متغيرات إلى صفحة واحدة egypt.php.يتم استخدام خاصية RewriteCond لفحص الشرط %{REQUEST_FILENAME} !-f و%{REQUEST_FILENAME} !-d للتأكد من عدم وجود ملف أو مجلد بالاسم المطلوب في الطلب، وهذا يضمن تحويل الروابط فقط إذا لم يتم العثور على ملف أو مجلد بهذا الاسم في الموقع. يتم استخدام الشرط [L] في نهاية القاعدة RewriteRule لإيقاف تطبيق أي قواعد أخرى إذا تم تحويل الرابط بنجاح. يجب أن يتم وضع هذه القاعدة في ملف .htaccess ووضع الملف في المجلد الرئيسي لموقع الويب. يجب التأكد من تفعيل إعادة الكتابة RewriteEngine في ملف htaccess وأن يكون الملف قابل للقراءة والكتابة من قبل المستخدم المسؤول عن الخادم.
  10. يتم استخدام خاصية before في CSS لعرض محتوى معين قبل العنصر الذي تتم معالجته. ومع ذلك، فإنه لا يمكن استخدام خاصية before مع عنصر input كما تم الشرح في التعليقات السابقة علاوة على ذلك، فإن استخدام الخاصية before مع عنصر input من نوع search قد يؤدي إلى تغيير مظهر العنصر بشكل غير مرغوب فيه، وذلك بسبب كيفية تنسيق المتصفحات لهذا النوع من العنصر. بدلاً من ذلك، يمكن استخدام الصورة كخلفية لعنصر input والتحكم في مظهرها باستخدام CSS. ومن الممكن أيضافة الصورة باستخدام خاصية background-image في CSS، ويمكن تعديل مظهر الصورة باستخدام خصائص مثل background-position و background-size وغيرها. على سبيل المثال، يمكن استخدام الكود التالي لإضافة ايقونة البحث كخلفية لعنصر input من نوع search: input[type="search"] { background-image: url("path/to/search-icon.png"); background-position: right center; background-repeat: no-repeat; padding-right: 20px; /* تعديل هذه القيمة حسب حجم الصورة */ } يتم وضع الصورة كخلفية للعنصر input باستخدام خاصية background-image. كما يتم تحديد موضع الصورة باستخدام خاصية background-position، وتحديد عدم تكرار الصورة باستخدام خاصية background-repeat. وأخيرًا، يتم إضافة بعض التباع باستخدام خصائص الحشو (padding) لضمان عدم تغطية النص بالصورة. ومثال على ذلك يمكنك الإطلاع على ال pen التالية https://codepen.io/tippingpointdev/pen/WNZbWGe
  11. تعتبر كل من بيئات العمل على الحاسوب المحلية (مثل Jupyter) والبيئات السحابية (مثل Google Colab) خيارات جيدة لتعلم الآلة وتحليل البيانات. ولكل منهما مزايا وعيوب: بيئات العمل على الحاسوب المحلية: مزايا: لديك السيطرة الكاملة على البيئة وإمكانية تثبيت أي برامج أو مكتبات تحتاجها. عادة ما تكون أسرع في التنفيذ لأن الحوسبة تتم محليًا. عيوب: تحتاج إلى موارد حاسوب قوية محلية لتشغيل التعلم الآلي. يمكن أن يكون الإعداد والصيانة معقدًا. البيئات السحابية مثل Google Colab: مزايا: لا تحتاج إلى موارد حاسوب قوية محلية. تستضيف Google البيئة وتوفر معالجة GPU. سهل الإعداد والاستخدام. لا تحتاج إلى تثبيت أي برامج. عيوب: ليس لديك السيطرة الكاملة على البيئة. محدودة بما توفره Google. عادة ما تكون أبطأ في التنفيذ بسبب الوقت اللازم لنقل البيانات إلى السحابة ومنها. لذا أنصح باستخدام كليهما واختيار الأنسب حسب المهمة. يمكنك استخدام بيئة محلية عند الحاجة إلى سرعة عالية أو مرونة كاملة، واستخدام Colab عند الحاجة إلى موارد GPU دون التزام بشراء حاسوب قوي. نعم، بشكل عام تعتبر بيئات العمل المحلية أكثر متعة في الاستخدام لأنها توفر لك حرية أكبر في التحكم وتخصيص البيئة. وبالنسبة لمعالجات M1 و M2 الجديدة في أجهزة ماك، فهي ممتازة لتعلم الآلة وتحليل البيانات. وذلك لأسباب عدة: تقدم M1 و M2 أداءً عاليًا مع كفاءة عالية في استهلاك الطاقة، مما يجعلها مثالية لأعمال الحوسبة الدقيقة مثل التعلم الآلي. تأتي M1 و M2 بوحدات معالجة الرسوميات (GPU) عالية الأداء مدمجة، والتي تفيد كثيرًا في تسريع التدريب على الشبكات العصبية. تدعم M1 و M2 معمارية ARM التي تميل إلى أن تكون أكثر كفاءة في الطاقة من معماريات x86 التقليدية. وهذا يفيد في تشغيل النماذج الحسابية المعقدة لفترة أطول. يوجد العديد من إطارات العمل الشهيرة في مجال التعلم الآلي مثل TensorFlow و PyTorch و Keras مدعومة جيدًا على المعالجات M1 و M2. لذلك، إذا كان بمقدورك شراء جهاز ماك الجديد بمعالج M1 أو M2، فسيكون خيارًا رائعًا لتعلم الآلة والحوسبة على الحاسوب الشخصي.
  12. كما أخبرك مصطفى في التعليق السابق أن أي مشروع يحتاج إلى الوقت الذي قد يطول في بعض الأحيان لذلك يجب عليك الصبر والأستمرار في تحسن الموقع هناك بعض النقاط التي يمكن تحسينها لزيادة فرص النجاح، وهي كالتالي: تحسين محتوى الموقع: يجب أن يحتوي الموقع على محتوى جذاب ومفيد لللزوار، ويجب أن يكون المحتوى متخصصًا ومفصلًا للمنتجات والخدمات التي تقدمها. يمكنك استخدام أدوات البحث عن الكلمات الرئيسية للمساعدة في تحديد موضوعات المحتوى الأكثر بحثًا وشعبية. تحسين تصميم الموقع: يجب أن يكون تصميم الموقع جذابًا وسهل الاستخدام ويجب أن يكون متوافقًا مع الأجهزة المختلفة والشاشات المختلفة. الإعلان عن الموقع: يجب أن تستثمر في الإعلان عن الموقع باستخدام الشبكات الاجتماعية والإعلانات المدفوعة على محركات البحث والشبكات الاجتماعية لجذب المزيد من الزوار والمستخدمين. تحسين ترتيب الموقع في محركات البحث: يمكنك تحسين ترتيب الموقع في محركات البحث من خلال تحسين محتوى الموقع وتحسين الكلمات الرئيسية والروابط الداخلية والخارجية. الابتكار: يجب أن تكون مبتكرًا في تقديم العروض والخصومات والصفقات لجذب المزيد من الزوار والعملاء. نصيحتي الأخيرة هي أن تبحث عن المزيد من المعلومات والموارد حول كيفية تطوير وتسويق موقع الكوبونات، وتحاول الاستفادة من الأفكار والتقنيات الجديدة لتحقيق المزيد من النجاح. وأتمنى لك التوفيق في مشروعك.
  13. هذه الأخطاء في التصميم نتيجة تحديد height معين فإذا كان ال height أكبر ستظهر مشكلة كما في الموقع الخاص بك لذلك لحل مشكلة تداخل الأقسام comment و contact يجب عليك حذف السطر التالي .section_comments { height: 100vh; } أما بالنسبة لل footer فقم بحذف السطر التالي .section_Contact { height: 90vh; } وبدلاً من الحذف يمكنك استخدام min-height بدلاً من height
  14. يبدو أن هناك عدة أخطاء في الرمز المعروض. إليك بعض التوصيات لتصحيح هذه الأخطاء: في السطر الأول، استخدم "className" بدلاً من "ClassName" إذا كنت تريد تعيين صفات الفئة. في السطر الثاني، يجب أن تكون قائمة المستخدمين داخل العلامات القوسية "[]" بدلاً من "{}". في السطر الثالث، يجب أن تكون الأقواس الدائرية بين الأقواس الزوجية "()" بدلاً من "}". في السطر الرابع، تحتاج إلى تحديد اسم العنصر "key" لكل عنصر في قائمة المستخدمين أو سيتم إصدار تحذير في وحدة المعالجة المركزالتعديل المقترح للرمز هو كالتالي: <div className='container'> <div className='row'> {this.state.users.map((ele) => <Users key={ele.id} userinfo={ele} delete={this.state.delete} /> )} </div> </div> const users = [ { name: 'angular', id: 1, examresult: true }, { name: 'html', id: 2, examresult: false, }, { name: 'php', id: 3, examresult: false, }, { name: 'laravel', id: 4, examresult: true, } ]; class Users extends React.Component { render() { return ( <div> <p>{this.props.userinfo.name}</p> <p>{this.props.userinfo.id}</p> <p>{this.props.userinfo.examresult}</p> <button onClick={() => this.props.delete(this.props.userinfo.id)}>Delete</button> </div> ); } } تم تغيير اسم العنصر "ClassName" إلى "className" في السطر الأول. تم تحديد العنصر "key" لكل عنصر في قائمة المستخدمين لتجنب إصدار تحذيرات في وحدة المعالجة المركزية. تم إنشاء عنصر فرعي يسمى "Users" لعرض معلومات المستخدم وزر الحذف. تم تمرير "ele.id" كمعرف للمستخدم لدالة الحذف. يمكنك استخدام هذا الرمز كأساس لتصحيح أخطاء الرمز الخاص بك.
  15. تخزين البيانات بشكل مباشر كنص عربي وإنجليزي يمكن أن يسهّل العملية ويجعلها تبدو أكثر بساطة، ولكن يمكن أن يؤدي إلى مشاكل في حالة الترجمة أو البحث عن النصوص، لأن الكلمات العربية والإنجليزية تتباينفي نحوها وتهجئتها وقد تكون قد تم تخزينها بطريقة غير متوافقة مع بعض قواعد البيانات. من ناحية أخرى، تخزين البيانات كمعرفات فريدة يمكن أن يسهل البحث عن البيانات وتحديثها، ولكن يمكن أن يؤدي إلى زيادة حجم القواعد والتعقيد في التعامل معها. بالنسبة لتفضيل أي طريقة، فذلك يعتمد على الحاجة والغرض من التطبيق. إذا كان التطبيق يتضمن ترجمة نصوص أو البحث عن النصوص بشكل متكرر، فقد يكون من المفضل تخزين البيانات بشكل مباشر كنص عربي وإنجليزي. وإذا كان التطبيق يحتاج إلى تحديثات متعددة للبيانات أو تحديثات متعددة لقواعد البيانات، فقد يكون من المفضل تخزين البيانات كمعرفات فريدة. بشكل عام، يفضل استخدام معرفات فريدة لتخزين البيانات في قواعد البيانات بسبب المزايا العديدة التي توفرها، مثل البحث السريع والتحديثات السريعة. ومع ذلك، في بعض الحالات، قد يكون من المناسب استخدام تخزين المعلومات كنص عربي وإنجليزي، مثل في حالات البيانات الثابتة التي لا يتم تحديثها كثيرًا. بشكل عام، يعتمد الاختيار بين تخزين البيانات بشكل مباشر كنص عربي وإنجليزي أو تخزينها كمعرفات فريدة على احتياجات التطبيق ومتطلباته.
  16. لا يتم حل الأسئلة الإختبارية إنما يمكنني تقديم بعض التعليمات للمساعدة من خلال التعليمات التالية طباعة الأعداد الصحيحة: استخدم حلقة تكرارية لطباعة الأعداد من 1 إلى 100، أو استخدم حلقة تكرارية لطباعة الأعداد من 100 إلى 1 للحصول على الترتيب التنازلي. إيجاد قيمة المتسلسلة: استخدم حلقة تكرارية لحساب قيمة المتسلسلة s باستخدام المعادلة s=x/3+x2/5+x3/7+..........x5/11. طباعة المتسلسلة: استخدم حلقة تكرارية لحساب وطباعة المتسلسلة باستخدام المعادلة i/(i+1)!. طباعة المتسلسلة: استخدم حلقةتكرارية لحساب وطباعة المتسلسلة باستخدام المعادلة i/(2i+1). إيجاد قيمة w: استخدم شرطًا لفحص قيمة x، وعيّن قيمة w بناءً على قيمة x باستخدام الشروط التالية: - إذا كانت x>0، فعين قيمة w على x+1. - إذا كانت x=0، فعين قيمة w على sin(x)+5. - إذا كانت x<0، فعين قيمة w على 2x-1.
  17. بدلاً من ذلك ، يمكنك اتباع التوثيق الرسمي المحدث واستخدام سطر الأوامر Firebase CLI لإنشاء ملف firebase_options.dart تلقائيًا في مجلد lib الخاص بك ، والذي سيحدد خيارات Firebase الصحيحة لك. الخطوات هي: تثبيت Flutterfire CLI: dart pub global activate flutterfire_cli تكوين Flutterfire (قم بتشغيله في أصل مشروعك وامر بالارشاد من خلال اختيار مشروع Firebase الصحيح ومنصات الهدف): flutterfire configure استيراد ملف firebase_options.dart المولد تلقائيًا في ملف main.dart الخاص بك وتهيئة Firebase على النحو التالي: void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); runApp(MyApp()); } وبهذه الطريقة ، لا تحتاج إلى تعريف options يدويًا. وسيقوم Flutterfire CLI بتوليد ملف Dart لدعم منصتك (Android و iOS وتجريبي Web) وسيعرّف خيارات Firebase المناسبة تلقائيًا.
  18. نعم، توجد مكتبات في React Native تسمح باستخدام التاريخ الهجري. من أشهرها: - react-native-hijri-date-picker: تتيح اختيار تواريخ هجرية بواسطة DatePicker. - hijri-date: تسمح بالتعامل مع التواريخ الهجرية بسهولة، مثل إضافة أيام/شهور، تحويل إلى ميلادي، إلخ. يمكن استخدام المكتبة hijri-date على النحو التالي: import HijriDate from 'hijri-date'; // أخذ تاريخ هجري حالي const hijri = HijriDate.now(); // طباعة التاريخ في شكل كامل (مثلاً: ١٤٤١/٣/٢٥ هـ) console.log(hijri.format('iYYYY/iMM/iDD')); // إضافة شهر واحد const nextMonth = hijri.addMonths(1); // تحويل إلى ميلادي const miladi = hijri.toGregorian(); هذه المكتبة تسهل التعامل مع التواريخ الهجرية في تطبيقات React Native. رجاء استخدم وثائقها لمعرفة كافة الإمكانيات التي تقدمها. وهناك مكتبات أخرى تعمل مع التواريخ الهجرية في React Native: react-native-hijri: توفر عدة أدوات للتعامل مع التاريخ الهجري مثل تحويل التواريخ بين الميلادي والهجري، إضافة أشهر/أيام، الحصول على اليوم/الشهر الحالي، إلخ. hijri-converter: بسيطة وتسمح فقط بتحويل التواريخ بين الميلادي والهجري. react-native-calendars: مكتبة توفر تقويماً شاملاً في React Native، وتدعم عرض التقويم الميلادي والهجري. react-hijri: أخرى بسيطة توفر تحويل التواريخ وعرض تقويم هجري. يمكن استخدام هذه المكتبات بنفس طريقة hijri-date تقريباً. من الأفضل اختبار عدة مكتبات واختيار الأنسب لاحتياجاتك.
  19. سأشرح لك الاختلافات بين الوظيفتين بالتفصيل: الوظيفة الأولى: تأخذ هذه الوظيفة واحدًا من المعاملات (`num`) وتزيد قيمته بواحد باستخدام المشغل `++`. ثم تسجل القيمة المضافة إلى `num` في وحدة التحكم باستخدام `console.log()`. عند استدعاء الوظيفة `increase(1)`، ستزيد الوظيفة قيمة `num` إلى `2` وتقوم بطباعتها في وحدة التحكم. الوظيفة الثانية تأخذ هذه الوظيفة واحدًا من المعاملات (`number`) وتستخدم المشغل `++` لزيادة قيمة `number` بواحد، لكنها تعيد القيمة الأصلية لـ `number` قبل زيادتها باستخدام المشغل `++`. عند استدعاء الوظيفة `increase1(1)`، ستعيد الوظيفة القيمة `1`، وليس القيمة المضافة `2`، لأن `return` يعيد القيمة الأصلية لـ `number` قبل زيادتها باستخدام `++`. بالإضافة إلى ذلك، يمكن ملاحظة أن الوظيفة الأولى تستخدم `console.log()` لإظهار القيمة في وحدة التحكم، بينما تستخدم الوظيفة الثانية `return` لإرجاع القيمة من الوظيفة. بشكل عام، يمكن القول أن الفرق بين الوظيفتين هوأن الوظيفة الأولى تزيد القيمة الممرة إليها وتعرض القيمة المضافة في وحدة التحكم، في حين تعيد الوظيفة الثانية القيمة الأصلية الممرة إليها وتزيد القيمة بعد ذلك.
  20. هذه مقارنة بين MERN و PHP/Laravel مع أحصائيات حديثة: وفقا لموقع Indeed، فإن الوظائف التي تطلب MERN زادت من 223,000 وظيفة في عام 2018 إلى 430,000 في 2022، بينما الوظائف التي تطلب PHP زادت من 294,0000 إلى 510,000 في نفس الفترة. من المتوقع أن يكون هناك طلب متزايد على مطوري MongoDB مقارنة بـ MySQL حيث أن قواعد بيانات NoSQL تحظى بشعبية متزايدة . من المتوقع أن يزداد طلب React.js خلال السنوات القليلة المقبلة مع زيادة اعتماد تطبيقات الجيل التالي على واجهات مستخدم فعالة و مرنة. من المتوقع أن يستمر نمو Node.js بوتيرة أسرع من PHP كمحرك خلفي للويب نظرا لسرعته العالية ومنصة JavaScript المشتركة. بشكل عام، ما زال MERN Stack أكثر طلبا ونموا في سوق العمل بسبب استخدامه لتقنيات حديثة ومستويات عالية من الأداء والمرونة، في حين أن PHP/Laravel لا تزال قوية ولكن مع معدلات نمو أقل. من وجهة نظري الشخصية، أفضل MERN stack تستخدم التكنولوجيات الحديثة - فهي تستخدم تكنولوجيات جديدة نسبياً مثل MongoDB و React.js تطوير سريع - يمكن تطوير تطبيقات ويب مع MERN بشكل أسرع على العموم. مطلوبة من قبل الشركات الكبرى - تبحث العديد من الشركات الكبرى حاليا عن مطورين يمتلكون خبرة في تقنية MERN لتطوير تطبيقاتهم. بينما PHP و Laravel لا زالت تستخدم على نطاق واسع، إلا أن MERN تعتبر الخيار الأول لدى العديد من الشركات حالياً بسبب مزاياها التي ذكرتها.
  21. بالإضافة للشرح السابق يمكن التعمق أكثر في الفروقات بين برمجة الروبوتات وتعلم الآلة من خلال النقاط التالية: الغرض: تركز برمجة الروبوتات على تطوير برامج التحكم في الروبوتات لتنفيذ مهام محددة، بينما يركز تعلم الآلة على تطوير نماذج تنبؤية وأنظمة قادرة على التعلم والتكيف مع البيئة المحيطة بها. المنهجية: تستخدم برمجة الروبوتات منهجية البرمجة التقليدية، والتي تعتمد على تطوير الكود وتحديد القواعد والمنطق المحددة مسبقًا، بينما يستخدم تعلم الآلة منهجية البيانات، والتي تعتمد على تحليل البيانات واستخراج الأنماط والمعلومات منها لتطوير نماذج تنبؤية ونظم قادرة على التعلم والتكيف. البيانات: تحتاج برمجة الروبوتات إلى البيانات المحددة مسبقًا لتنفيذ المهام المطلوبة، بينما يعتمد تعلم الآلة على البيانات الحقيقية والمتغيرة لتحليلها واستخراج المعلومات منها. التكامل: تتطلب برمجة الروبوتات التكامل بين الأجهزة الآلية والبرمجيات والمستخدمين، بينما يتطلب تعلم الآلة التكامل بين البيانات والخوارزميات والخوارزميات والتطبيقات. الاستخدامات: يستخدم برمجة الروبوتات بشكل رئيسي في الصناعة والتصنيع والروبوتات الجوية والتنقيب عن النفط والغاز، بينما يمكن استخدام تعلم الآلة في مجالات أخرى مثل التصنيع والتجارة الإلكترونية والطب والتمويل والتسويق. الأداء: يمكن لبرمجة الروبوتات تنفيذ المهام المحددة بشكل فعال ودقيق، بينما يمكن لتعلم الآلة تحسين الأداء والتكيف مع التغييرات في البيئة المحيطة بها. التدريب: يحتاج تعلم الآلة إلى التدريب باستخدام مجموعة من البيانات الحقيقية لتحسين أدائه، بينما يتطلب تدريب برمجة الروبوتات على مهمة محددة بالاعتماد على البرمجة التقليدية. القدرة على التعلم: يمكن لتعلم الآلة التعلم من البيانات وتحسين أدائها مع تغيير الظروف، بينما لا يمكن لبرمجة الروبوتات التعلم بنفس الطريقة وتحتاج إلى إعادة برمجة لكل مهمة جديدة. البرمجة: يتطلب برمجة الروبوتات مهارات برمجة محددة، بينما يتطلب تعلم الآلة مهارات تحليل البيانات والرياضافةً إلى النقاط السابقة، يمكن التعمق أيضًا في الأساليب والتقنيات المستخدمة في كل من برمجة الروبوتات وتعلم الآلة. فعلى سبيل المثال، في برمجة الروبوتات يتم استخدام لغات برمجة مثل C++ وJava وPython، وتستخدم تقنيات مثل الذراع الروبوتية والحساسات ونظم الملاحة، في حين يتم استخدام في تعلم الآلة تقنيات مثل التعلم العميق وشبكات العصب الاصطناعي والتحليل الإحصائي، ويتم استخدام لغات برمجة مثل Python وR وMATLAB. وبالإضافة إلى ذلك، تختلف الأدوار والمسؤوليات في كل من برمجة الروبوتات وتعلم الآلة. فعلى سبيل المثال، يتطلب تطوير برامج التحكم في الروبوتات العمل مع مهندسي الروبوتات والميكانيكيين والكهربائيين لتصميم وتطوير الأجزاء الميكانيكية والكهربائية والبرمجيات. ويتطلب تعلم الآلة العمل مع فريق متعدد التخصصات من علماء البيانات وخبراء تحليل البيانات ومطوري البرمجيات والمهندسين الإحصائيين. وبشكل عام، يمكن القول إن برمجة الروبوتات وتعلم الآلة هما مجالان مختلفان ولكنهما يمكن أن يتعاونا سويًا لتطوير أنظمة ذكية وروبوتات قادرة على التعلم والتكيف مع البيئة المحيطة بها. ومن المهم فهم الفروقات بين الاثنين لتحديد النهج المناسب لتطوير النظم الذكية الحديثة وتحسين أدائها وفعاليتها في تنفيذ المهام المختلفة. ويمكن القول إن برمجة الروبوتات تركز على تنفيذ المهام المحددة والمبرمجة مسبقًا بشكل فعال ودقيق، بينما يركز تعلم الآلة على تحليل البيانات والاستفادة منها ل
  22. حسب وصفك، يبدو أنه تم إنشاء تطبيقين داخل مشروع واحد في Firebase، ولكن عند إرسال الإشعارات، يتم إرسالها لكل التطبيقين في المشروع بدلاً من تطبيق واحد فقط. يجب عليك تعيين معرّف التطبيق (application ID) المخصص لكل تطبيق في Firebase. يمكنك القيام بذلك من خلال إضافة حزمة تطبيق جديدة في Firebase ونسخ معرّف التطبيق المخصص الخاص بكل تطبيق في الإعدادات. من ثم، يجب عليك تحديد معرّف التطبيق (application ID) المناسب عند إرسال الإشعارات، مثل استخدام معرّف التطبيق الصحيح في خيار "target" في Firebase Cloud Messaging API عند إرسال الإشعارات. تأكد من أن ملفات google-services.json الخاصة بكل تطبيق تم وضعها في المسار الصحيح في كل تطبيق وتحتوي على معرّف التطبيق المخصص الصحيح. بعد ذلك، يمكنك إرسال الإشعارات إلى التطبيق المناسب باستخدام معرّف التطبيق الصحيح. يجب عليك أيضًا التأكد من أن تحديد "new campaign" يعمل بشكل صحيح ويتم تحديد التطبيق الصحيح في كل حملة. إذا قمت بتحديد كل هذه الخطوات بشكل صحيح وما زالت المشكلة قائمة، فمن المشكلة قد تكون في إعدادات Firebase Cloud Messaging API الخاصة بك، ويجب عليك التحقق من الإعدادات والتأكد من أنها صحيحة. كما يمكنك التحقق من سجلات Firebase Cloud Messaging API للعثور على أي أخطاء تظهر هناك. إذا لم تتمكن من حل المشكلة بنفسك، يمكنك الاستعانة بدعم Firebase للحصول على مساعدة إضافية في حل المشكلة.
  23. لا يحق لمطوري تطبيقات تسجيل المكالمات الوصول إلى محتوى المكالمات بكامل تفاصيلها، بما في ذلك أرقام الهواتف، إلا بعد الحصول على إذن من المستخدم وفقًا للقوانين المحلية والدولية المتعلقة بالخصوصية. وبالتالي كما أخبرك مصطفى أن من المفترض ألا يقوم مطور البرنامج بتسجيل أي بيانات لك ولكن ربما تكون هناك بعض البرامج التي ربما تقوم بذلك وذلك بالتأكيد عدم احترام لخصوصية المستخدمين والالتزام بالقوانين واللوائح المتعلقة بحماية البيانات الشخصية. أما بالنسبة للسؤال الثاني فإنه لا يمكنك استرجاع المكالمات المسجلة وذلك في حالة أن هناك برنامج يقوم بتسجيل المكالمات وحفظها لدى المطور ولكن يعتمد على سياسة التطبيق والإجراءات التي يتبعها المطور في هذا الصدد. ومن المهم الاتصال بفريق دعم التطبيق أو الاستعانة بالموارد الداخلية للتطبيق لمعرفة ما إذا كان بإمكانهم استرداد المكالمة المحذوفة أو لا أما بشأن استعادة مكالمة محذوفة، فإذا كان الملف المسجل مخزنًا في جهاز الهاتف، يمكن استخدام تطبيقات استعادة البيانات لمحاولة استرداد الملف. ومع ذلك، لا يمكن ضمان النجاح الكامل لهذه العملية، ويجب الحرص على استخدام تطبيقات موثوقة لتجنب فقدان المزيد من البيانات أو التعرض للاختراق.
  24. هذا الخطأ يحدث عندما يتم تشغيل أمر `venv` دون تمرير مسار لإنشاء البيئة الافتراضية، أو عندما يتم تمرير مسار خاطئ. لإنشاء بيئة العمل الافتراضية باستخدام `venv`، يمكن استخدام الأمر التالي في سطر الأوامر: python -m venv ENV_DIR حيث `ENV_DIR` هو المسار الذي تريد إنشاء بيئة العمل الافتراضية به. لتفادي هذا الخطأ، تأكد من تمرير المسار الصحيح لإنشاء بيئة العمل الافتراضية، وتأكد من أن الأمر يتم تشغيله بالطريقة الصحيحة. يمكنك تحديد مسار لإنشاء البيئةالافتراضية باستخدام `venv` بالأمر التالي: python -m venv path/to/venv ويجب تعويض `path/to/venv` بالمسار الذي تريد إنشاء بيئة العمل الافتراضية به. على سبيل المثال، لإنشاء بيئة العمل الافتراضية في مجلد venv داخل مجلد العمل الحالي، يمكن استخدام الأمر التالي: python -m venv venv وسيتم إنشاء بيئة العمل الافتراضية في مجلد venv داخل المجلد الحالي.
  25. يمكن استخدام مكتبات خارجية لتسهيل عملية إضافة الإشعارات في تطبيق Android Studio. واحدة من هذه المكتبات هي Firebase Cloud Messaging (FCM) التي تسمح بإرسال الإشعارات إلى التطبيق من الخادم. لإضافة دعم FCM في تطبيق Android Studio، يجب إضافة مكتبة Firebase Messaging إلى مشروع التطبيق. بعد ذلك، يمكن إنشاء خادم FCM وتضمينه في التطبيق لإرسال الإشعارات إلى التطبيق. فيما يلي مثال عن إرسال الإشعارات باستخدام FCM في تطبيق Android Studio: إضافة مكتبة Firebase Messaging إلى مشروع التطبيق عن طريق تعديل ملف `build.gradle` في المستوى التطبيق: dependencies { implementation 'com.google.firebase:firebase-messaging:20.2.4' } إنشاء خادم FCM باستخدام Firebase Console وحفظ مفتاح المشروع الذي تم إنشاؤه. إضافة مستلم (Receiver) للاستماع إلى الإشعارات الواردة من FCM وتنفيذ الإجراءات المناسبة لعرض الإشعارات في التطبيق. يمكن القيام بذلك بإنشاء فئة تنفيذ BroadcastReceiver وتحديد الدوال التي تنفذ عند استلام الإشعارات، كما يلي: public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); // إنشاء كائن من الـ NotificationCompat.Builder NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.notification_icon) .setContentTitle(remoteMessage.getNotification().getTitle()) .setContentText(remoteMessage.getNotification().getBody()) .setPriority(NotificationCompat.PRIORITY_DEFAULT); // تحديد الفعل الذي يتم تنفيذه عند النقر على الإشعار Intent intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); builder.setContentIntent(pendingIntent); // عرض الإشعار NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(notificationId, builder.build()); } } تحديد خصائص الإشعارات المراد إرسالها من الخادم FCM وإرسالها إلى التطبيق باستخدام مفتاح المشروع. يمكن القيام بذلك باستخدام Firebase Console أو استخدام REST API. يمكنك تخصيص تطبيقك باستخدام هذه المكتبات الخارجية لتسهيل إضافة الإشعارات، وتوفير الوقت والجهد في تطوير التطبيق. كما يفضل الإطلاع على التوثيق الرسمي من google من هذا الرابط
×
×
  • أضف...