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

Mustafa Suleiman

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

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

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

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

    384

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

  1. السن مناسب حيث أن الأطفال في سن 11 عامًا قادرون على تعلم البرمجة، ويتمتعون بالقدرة على فهم مفاهيم البرمجة والقدرة على الابتكار والإبداع في إنشاء البرامج. والحد الأدنى لتعلم البرمجة يمكن أن يختلف من شخص لآخر، وذلك يعتمد على مدى الاستعداد والقدرة على التعلم والتفاعل مع المواد التعليمية. ومع ذلك، فإن الحد الأدنى الموصى به للبدء في تعلم البرمجة هو حوالي 8-10 سنوات، ويمكن للأطفال في هذا العمر أن يتعلموا البرمجة باستخدام لغات البرمجة المناسبة لهذا العمر مثل Scratch و Blockly وغيرها. وفي دورة علوم الحاسب سيتم شرح الأساسيات ومن ضمنها استخدام بيئة سكراتش لتعلم أساسيات التفكير المنطقي ومفاهيم البرمجة. وإليك نبذة مختصرة عن الدورة: ماذا ستتعلم في هذه الدورة؟ أساسيات الحاسوب وعلومه والتفكير المنطقي وما هي الخوارزميات وكيف تفيد في البرمجة تطبيقات عملية على أساسيات التفكير المنطقي باستخدام بيئة سكراتش Scratch التفاعلية أساسيات لغة البرمجة JavaScript وتطبيق المفاهيم التي تم شرحها باستخدامها، والتوسع في شرح التطبيقات العملية للغات البرمجة أساسيات أنظمة التشغيل المختلفة وكيفية تثبيت البرمجيات اللازمة للبرمجة عليها أساسيات سطر الأوامر في نظام لينكس، وشرح الأسس التي بني عليها النظام مع تطبيقها عمليًا أنظمة قواعد البيانات المختلفة، مع شرح تفصيلي للغة SQL للتعامل معها مبادئ أساسية في أنظمة قواعد البيانات NoSQL المفاهيم الأساسية التي تبنى فيها صفحات الويب مفاهيم أساسية في الشبكات والخوادم، وكيف يتم استقبال الطلبيات إلى الخادم والرد عليها مبادئ الحماية والأمان في الويب لمن هذه الدورة؟ لمن لا يمتلك أي خبرة مسبقة في البرمجة ويريد الدخول في هذا المجال الشيق لمن يفكر بتغيير مساره المهني ويرغب بأن يصبح مبرمج ولا يعرف من أين يبدأ للمبرمجين الذين تعلموا احدى لغات البرمجة ذاتياً ويرغبوا بملئ الفراغات وتعلم الأسس لطلاب الجامعات الذين يواجهوا صعوبة ببعض المواد مثل أنظمة التشغيل وقواعد البيانات لمن حاول تعلم البرمجة بالسابق وشعر أنها صعبة ولم يتمكن من المواصلة وبعد الإنتهاء منها، سيستطيع الطفل استيعاب مجال البرمجة والمفاهيم المحيطة به، ويصبح قادر على تحديد ما الذي يريد تعلمه بعد ذلك من خلال الدورات الأخرى. وباشتراكه في دورة علوم الحاسب، يمكنه رؤية المسار الأول من باقي الدورات لتحديد ما الذي يريده قبل الاشتراك في الدورة. والمهم في ذلك السن، هو تحبيب وترغيب البرمجة إلى الطفل وعدم إنتظار نتائج منه، بل يكفي تقديم دورة علوم الحاسب إليه وتشجيعه على دراستها، حتى لو قام بدراستها على مراحل لا مشكلة. وأيضًا التعلم عملية تكرارية، لذلك قد يحتاج إلى إعادة تكرار المشاهدة والتطبيق على ما تعلمه على فترات متباعدة، وبذلك يتم كسر الحاجز واستيعاب المفاهيم والأساسيات. وهناك فيديو خاص عن نصائح لتعليم البرمجة للأطفال من أكاديمية حسوب.
  2. مجال العمر الحر ليس مجال بحد ذاته بل سوق عمل، ويجب عليك إمتلاك مهارة للمنافسة به والحصول على مشاريع وفرص توظيف عن بعد. وفي البداية عليك بمعرفة المجالات الملطوبة في مواقع العمل الحر والتي منها المواقع التالية: مستقل خمسات بعيد ومن المفترض أن تكوني متخصصة في أحد المهارات التالية للعمل على المواقع السابقة: أعمال وخدمات استشارية برمجة، تطوير المواقع والتطبيقات هندسة، عمارة وتصميم داخلي تصميم، فيديو وصوتيات تسويق إلكتروني ومبيعات كتابة، تحرير، ترجمة ولغات دعم، مساعدة وإدخال بيانات تدريب وتعليم عن بعد وكل مجال من السابق بداخله تخصصات أخرى، فمثلاً، مجال البرمجة يحتوي على برمجة المواقع وبرمجة تطبيقات الهاتف وبرمجة برامج سطح المكتب، وبداخل كل تخصص هناك لغات برمجة مختلفة وهكذا. والأمر قد يبدوا معقد من الخارج، لكن خطوة بخطوة سيسهل الأمر عليك والجميع بدأ من نقطة الصفر. وبالنسبة للمدة اللازمة لتعلم أي مهارة، ففي رأي من 6 شهور وحتى سنة أو سنتين، حيث أن الأمر يتوقف على مقدار إجتهادك، وأيضًا معلوماتك المتوفرة أو خبراتك التي قد تساعدك في التعلم بشكل أسرع. والأفضل لك هو قراءة المقالات التالية لتحديد المجال الذي تريده، وفهم طبيعة العمل الحر بشكل شامل، بدلاً من التصورات الخيالية التي يروج لها على وسائل التواصل الإجتماعي. دليلك الشامل إلى العمل الحر عبر الإنترنت 28 وظيفة من وظائف العمل الحر الأكثر طلبًا للمبتدئين: 10 مقالات في مجال العمل الحر ينبغي لك قراءتها كيفية العمل على موقع مستقل وتحقيق أول 25 دولار بعد أن تقومي بقراءة المقالات السابقة، لا تترددي في الاستفسار عما تحتاجيه هنا، ولكن بعد قراءة المقالات. وأيضًا قد تحتاجي إلى قراءة النقاش التالي:
  3. بالإمكان ربط كود بايثون مع كود React Native باستخدام Bridge API. ويستخدم Bridge API لإنشاء واجهات المستخدم والتعامل مع قواعد البيانات والاتصال بخدمات الويب والتحكم في التحليلات والأدوات الأخرى التي تعمل بلغة بايثون. ويتم تنفيذ Bridge API باستخدام وظيفة "native modules" في React Native و "Python modules" في بايثون. ويجب معرفة أنه يمكن استخدام Bridge API لتوفير القدرة على إعادة استخدام برامج بايثون الموجودة بالفعل وإضافة ميزات جديدة إلى تطبيقات React Native باستخدام لغة بايثون. مثلاً، تستطيعي استخدام بايثون لإنشاء نماذج التعلم الآلي والتفاعل معها في تطبيق React Native، وذلك من خلال مكتبة TensorFlow المتاحة في بايثون لإنشاء نماذج تعلم الآلة وتدريبها على البيانات. وبعد ذلك نستخدم Bridge API لربط تطبيق React Native مع تلك النماذج وتوفير واجهة المستخدم اللازمة لتفاعل المستخدمين معها. مثال بسيط على طريقة الربط بين بايثون وReact Native في البداية، عليك بإنشاء وحدة بايثون بسيطة تُسمى "calculator.py" وضعي بها الكود التالي: def add(a, b): return a + b الآن سنقوم بإنشاء Native Module في React Native لاستدعاء هذه الوحدة. يمكنك إنشاء ملف جديد يسمى "CalculatorModule.js" وضعي به التالي: import { NativeModules } from 'react-native'; const { Calculator } = NativeModules; export default { add: (a, b) => { return Calculator.add(a, b); }, }; وتأكدي من تحديد اسم Native Module كـ "Calculator"، ثم يمكنك استخدام هذا Native Module في كود React Native الخاص بك. من خلال إنشاء شاشة جديدة تُسمى "CalculatorScreen.js" كالتالي: import React, { useState } from 'react'; import { View, Text, TextInput, Button } from 'react-native'; import Calculator from './CalculatorModule'; const CalculatorScreen = () => { const [a, setA] = useState(''); const [b, setB] = useState(''); const [result, setResult] = useState(''); const handleAdd = () => { const res = Calculator.add(Number(a), Number(b)); setResult(res.toString()); }; return ( <View> <TextInput value={a} onChangeText={setA} /> <TextInput value={b} onChangeText={setB} /> <Button title="Add" onPress={handleAdd} /> <Text>{result}</Text> </View> ); }; export default CalculatorScreen; وكما ترين يتم استدعاء Native Module "Calculator" واستخدامه في دالة "handleAdd" لجمع الأعداد المدخلة، وعرض نتيجة الجمع في عنصر "Text". والمثال بسيط لكنه يوضح كيفية استخدام Bridge API لربط كود بايثون مع كود React Native، وبنفس المبدأ تستطيعي تطوير تطبيقات React Native متكاملة مع قواعد البيانات والتحكم في التحليلات والأدوات الأخرى.
  4. بالطبع يمكنك إنشاء مواقع، تطبيقات وبرامج سطح مكتب باستخدام جافاسكريبت. والتطبيقات يتم إنشائها باستخدام إطار العمل الشهير "React Native"، و الذي يستخدم مجموعة متنوعة من التقنيات والأدوات بما في ذلك HTML و CSS و JavaScript لإنشاء تطبيقات الهواتف. وبالنسبة لكفاءة التطبيقات المبنية باستخدام الجافاسكريبت، فإنها متقاربة في الأداء مقارنة باللغات الأخرى المستخدمة في تطوير التطبيقات مثل Swift و Kotlin و Java. ومع ذلك ، فإن كفاءة التطبيق يعتمد على عدة عوامل أخرى بما في ذلك نوع التطبيق وحجم البيانات التي يتم تداولها ومستوى تحسين الأداء للكود. والمقارنة ظالمة بعض الشيء، حيث أن React Native يسمح لك بإنشاء تطبيقات متعددة المنصات بسهولة بين منصتي iOS و Android ، وبالتالي يسهل عملية تطوير التطبيقات ويوفر الكثير من الوقت والجهد. أما التطبيقات الأصلية Native المبنية بواسطة Swift و Kotlin و Java فهي لا تعمل على المنصات الأخرى، أي Swift تستخدم لبناء تطبيقات لنظام iOS بينما Kotlin و Java لنظام أندرويد. وقد تم ذكر المزيد من التفاصيل والشرح والمقارنات في نقاشات سابقة، أرجو منك قرائتها تجنبًا للتكرار.
  5. مساحة الرامات لديك صغيرة جدًا، وتشغيل نظامي وهمي على تلك المساحة من الرامات أمر صعب، لذلك يجب أن تكون على الأقل 8 جيجابايت وتلك مساحة صغيرة أيضًا، ففي الوقت الحالي المساحة المناسبة للرامات هي 16 جيجابايت. وذلك لتتمكن من تشغيل المتصفح ومتابعة الدروس وتشغيل محرر الأكواد وبرامج أخرى بجانب النظام الوهمي وأيضًا النظام الأساسي الخاص بك يشغل ما بين 2 جيجابايت إلى 4 جيجابايت. ولا تضغط على نفسك كثيرًا، يكفيك 8 جيجابايت من الذاكرة العشوائية لتعمل بشكل جيد، والأفضل هو 16 أو 12 جيجابايت حسب استطاعتك. وأيضًا سيفيدك بالتأكيد شراء هارد SSD وجعله وحدة التخزين الأساسية للنظام والبرامج لديك، فالعمل على هارد HDDيجعلك تشعر كأن الجهاز يعاني حتى لو كانت مواصفات الحاسوب مرتفعة، وذلك سبب سرعة القراءة والكتابة المنخفضة لذلك النوع من وحدة التخزين. لكن كما أشرت لك، الأمر يتوقف على ميزانيتك ولا تضغط على نفسك كثيرًا ،قم بشراء الرامات أولاً وتستطيع شراء رامات مستخدمة و SSD وأيضًا بتكلفة منخفضة.
  6. .loader { border: 16px solid #f3f3f3; border-top: 16px solid #3498db; border-radius: 50%; width: 120px; height: 120px; animation: spin 2s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } السبب هو أنك قمت بنسخ تنسيق CSS الخاص بالـ Loader السابق حيث أنني وفرت لك تنسيق للـ Loader بسيط يقوم بالدوران، أما إذا أردت استخدام الصورة فعليك باستخدام تنسيق مختلف أي قم بإزالة التنسيق الذي نسخته أنت. وعليك بتنسيق كلاس .loader بالشكل الذي تراه مناسبًا. وكنصيحة عزيزي، لا تقم أبدًا بنسخ الكود دون أن تقرأه وتعرف ما الذي يضيفه لمشروعك أو ماذا يفعل، تجنبًا لحدوث مشاكل في الكود الخاص بك.
  7. عليك بإضافة مسار الصورة الصحيح في الكود الذي اشرت إليه سابقٌا، فمثلاً لو كانت الصورة داخل مجلد images في مجلد المشروع فسيصبح المسار كالتالي: <!-- loader --> <div class="loader"> <img src="images/loader.gif"> </div>
  8. السبب في أن جميع العناصر لديها نفس القيمة percentage هو لأنه تم تحديث القيمة في الحلقة forEach بشكل متكرر وتم استخدام نفس الحالة لجميع العناصر. ولذلك، عليك باستخدام دالة محدثة لتحديث قيمة percentage لكل عنصر في الحدث onscroll. ويمكن تغيير الكود كالتالي: const [percentage, setPercentage] = useState({}) window.onscroll = function () { if (window.scrollY >= progressAnim.current.offsetTop - 300) { skills.forEach(skill => { setPercentage(prevPercentage => ({ ...prevPercentage, [skill.id]: skill.progress })) }) } } return ( <div className="App"> <Section src={img_1} /> <Section src={img_2} /> <div className="skills" ref={progressAnim}> {skills.map(skill => ( <Progress key={skill.id} percentage={percentage[skill.id] || 0} circleWidth="200" name={skill.language} /> ))} </div> </div> ) حيث تم تحويل القيمة percentage إلى كائن حيث يتم استخدام معرف العنصر كمفتاح. ثم استخدام دالة محدثة لتحديث قيمة percentage بشكل منفصل لكل عنصر. أخيراً، واستخدام القيمة المحدثة في كل عنصر في عنصر تقدم الدائرة Progress. طريقة أخرى و هناك طريقة أخرى لحل هذه المشكلة، وهي باستخدام useEffect بدلاً من استخدام دالة محدثة في حدث onscroll، كالتالي: const [percentage, setPercentage] = useState({}) useEffect(() => { const handleScroll = () => { if (window.scrollY >= progressAnim.current.offsetTop - 300) { const newPercentage = {} skills.forEach(skill => { newPercentage[skill.id] = skill.progress }) setPercentage(newPercentage) } } window.addEventListener('scroll', handleScroll) return () => { window.removeEventListener('scroll', handleScroll) } }, [skills, progressAnim]) return ( <div className="App"> <Section src={img_1} /> <Section src={img_2} /> <div className="skills" ref={progressAnim}> {skills.map(skill => ( <Progress key={skill.id} percentage={percentage[skill.id] || 0} circleWidth="200" name={skill.language} /> ))} </div> </div> ) باستخدام useEffect بدلاً من الحدث onscroll، يتم استدعاء دالة handleScroll في كل مرة يتم فيها التمرير، وتحدث قيمة percentage فقط إذا تم تمرير العنصر المطلوب. ثم إضافة الحدث الذي يتم استدعاءه إلى النافذة في useEffect. وفي النهاية، وإزالة الحدث عند إزالة المكون.
  9. إضافة صوت ترحيبي و Loader لإضافة صوت الترحيب ، تستطيع استخدام عنصر HTML5 audio ، ويتم تشغيله باستخدام JavaScript. أولاً ، قم بإنشاء عنصر audio في HTML الخاص بك باستخدام العلامة <audio> ، وحدد مصدر الصوت الخاص بك باستخدام العلامة <source> ، كما يلي: <audio id="welcome-sound"> <source src="path/to/sound/file.mp3" type="audio/mp3"> </audio> بعد ذلك، عليك استخدام addEventListener لتعيين حدث load لتشغيل الصوت عندما تنتهي صفحة الويب من التحميل بدلاً من استخدام window.onload. وسنعتمد على حدث DOMContentLoaded بدلاً من load لتحديد الحدث الذي يتم إطلاقه عندما يتم تحميل كل العناصر في الصفحة بشكل كامل بدلاً من انتظار الصفحة بالكامل (مثل الصور) للانتهاء من التحميل ، وهذا يجعل الصفحة تستجيب بشكل أسرع. document.addEventListener("DOMContentLoaded", function(event) { // تشغيل الصوت document.getElementById('welcome-sound').play(); }); إضافة loader إلى صفحتك سيتم الجمع ما بين استخدام العناصر المختلفة في CSS لإنشاء loader مخصص، وتستطيع استخدام صور GIF المحملة مسبقًا ، مثل الصورة التي أرفقتها، أو يمكنك استخدام الرسومات SVG أو CSS لإنشاء loader. بعد ذلك ، سنعتمد على JavaScript لإظهار وإخفاء loader بناءً على حالة تحميل الصفحة. HTML <!-- loader --> <div class="loader"> <img src="path/to/loader/image.gif"> </div> CSS .loader { border: 16px solid #f3f3f3; border-top: 16px solid #3498db; border-radius: 50%; width: 120px; height: 120px; animation: spin 2s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } في الكود أعلاه ، يتم إنشاء loader باستخدام حدود CSS ودائرة مع مجموعة محددة من الألوان. يتم إنشاء الحركة باستخدام animation CSS ، والذي يسمح لل loader بالدوران بشكل لا نهائي. Javascript document.addEventListener("DOMContentLoaded", function(event) { const loader = document.querySelector(".loader"); loader.style.display = "none"; // إخفاء loader عند بدء تحميل الصفحة // تشغيل الصوت document.getElementById('welcome-sound').play(); // إظهار loader بعد 3 ثوانٍ من بدء تحميل الصفحة setTimeout(function() { loader.style.display = "block"; }, 3000); // إخفاء loader بعد 5 ثوانٍ من بدء تحميل الصفحة setTimeout(function() { loader.style.display = "none"; }, 5000); }); من خلال استهداف العنصر .loader باستخدام document.querySelector يتم إخفاؤه باستخدام style.display = "none". ثم تشغيل الصوت بواسطة document.getElementById('welcome-sound').play();. بعد ذلك ، يتم استخدام setTimeout لإظهار loader بعد 3 ثوانٍ من بدء تحميل الصفحة ، وإخفائه بعد 5 ثواني. إضافة صوت عندما يقوم الزائر بإنشاء حساب جديد عليك باستخدام العنصر audio في HTML لتشغيل الصوت ويمكنك تعيين مصدر الصوت في الـ JavaScript. بالنسبة لإضافة اسم العميل المسجل إلى رسالة الصوت ، سنعتمد على قيمة العنصر input الخاص بالاسم لاسترداد الاسم الذي قام المستخدم بكتابته. ثم يمكنك إضافة هذا الاسم إلى نص الرسالة الصوتية باستخدام concat في JavaScript. HTML <input type="text" id="name" placeholder="الاسم"> <button id="submit">إنشاء الحساب</button> <audio id="welcome-sound"> <source src="welcome.mp3" type="audio/mpeg"> </audio> Javascript document.getElementById("submit").addEventListener("click", function() { const name = document.getElementById("name").value; const welcomeMessage = "مرحباً " + name + "! تم إنشاء حسابك بنجاح"; const audio = document.getElementById("welcome-sound"); audio.src = "welcome.mp3"; // مصدر الصوت audio.play(); setTimeout(function() { alert(welcomeMessage); }, 3000); // 3 ثوانٍ للتأكد من عرض الرسالة الصوتية بشكل كامل }); الكود يستخدم addEventListener لاستماع حدث النقر على الزر "إنشاء الحساب". ويتم استخدام قيمة العنصر input الخاص بالاسم لإعداد رسالة الترحيب بشكل ديناميكي. ثم يتم تشغيل الصوت وإضافة رسالة الترحيب إلى الـ alert التي تظهر بعد ثلاث ثوانٍ من تشغيل الصوت. ويمكنك تغيير المدة المحددة في setTimeout وفقًا لاحتياجاتك.
  10. يجب عليك الحرص عند استخدام برامج التسويق وارسال الرسائل الترويجية على تيليجرام، لأنه إذا قمت بإرسال العديد من الرسائل إلى مستخدمين لا يرغبون فيها، فقد يتم التبليغ عن حسابك ويتم حظره من قبل تيليجرام. وبالنسبة للحلول الممكنة، يمكن تجربة الخيارات التالية: الحرص على عدم إرسال العديد من الرسائل المزعجة في فترة قصيرة، والتأكد من الحصول على موافقة المستخدمين قبل إرسال الرسائل. استخدام خدمات الرسائل الجماعية الرسمية على تيليجرام والتي توفرها شركة تيليجرام نفسها، مثل Telegram Advertising وTelegram Bot API، والتي تتيح لك إرسال الرسائل التسويقية بطريقة شرعية. ,حد الرسائل الأقصى لإرسال الرسائل من خلال Telegram Bot API هو 30 رسالة في الثانية، وهذا يعني أنه يمكنك إرسال حوالي 1,800 رسالة في الدقيقة باستخدام هذه الواجهة. ومع ذلك، عليك بالحرص في عدم إرسال الرسائل بشكل متكرر ومتعدد، حتى لا يتم حظر حساب البوت الخاص بك من قبل تيليجرام، والأفضل استخدام المهام المجدولة للحفاظ على توزيع متساوٍ للرسائل على مدار اليوم بدلاً من إرسال جميع الرسائل في نفس الوقت. وأيضًا عليك بتحسين جودة المحتوى الذي ترسله، وجعله مفيداً وجذاباً للمستخدمين، مما يقلل من احتمالية التبليغ عنها. عند التبليغ عن رسائلك أنها Spam أو مزعجة سيتم حظر أو تقييد حسابك بعد عدد معين من التبليغات، حيث يتم فحص حسابك من قبل مشرفي تيليجرام. وهناك حل آخر وهو إنشاء جروب خاص بالمهتمين بما تسوق له، والأمر سيستغرق وقت، لكن تلك الطريقة أفضل ومستدامة وستحقق نتائج بلا شك، وهناك عدة طرق لفعل ذلك، إما من خلال توفير عروض في الجروب الخاص بك، خصومات أو شروحات حصرية وهكذا، أي يجب أن يحصل المستخدم على فائدة من إشتراكه في القناة أو الجروب الخاص بك. وبالنسبة لحسابك الذي تم حظره، حاول التحدث وشرح مشكلتك من خلال الرابط التالي : https://telegram.me/spambot
  11. لعرض القائمة الكاملة للأوامر التي تم إدخالها في التيرمنال، قم بإدخال الأمر التالي في النافذة الخاصة بالتيرمنال وستظهر لك جميع الأوامر التي قمت بإدخالها في السابق بالترتيب الزمني. history أيضًا تستطيع استخدام الأمر التالي للبحث عن أوامر محددة بدلاً من عرض القائمة بأكملها. history | grep 'الأمر المبحوث عنه' مثلاً، للعثور على جميع الأوامر التي تحتوي على "git" في السجل السابق للأوامر، قم بإدخال الأمر history | grep 'git'
  12. تستطيع الحصول على المجلد الخاص بمشروع Unity من خلال إطار العمل (Editor) في Unity، حيث يحتوي على جميع الملفات والمجلدات الخاصة بمشروعك. وعليك بالنقر بزر الماوس الأيمن على ايقونة المشروع في لوحة المشاريع في Unity، ثم اختيار "Show in Explorer"، و سيتم فتح نافذة المستكشف وسترى المجلد الذي يحتوي على جميع ملفات المشروع. بمجرد الحصول على هذا المجلد، يمكنك متابعة الخطوات التي ذكرتها سابقًا لحل المشكلة التي تواجهك.
  13. رسالة الخطأ تعني عدم وجود ملف meta لبعض الملفات في مجلدات البرنامج، وبالتالي يتم تجاهل تلك الملفات من قبل البرنامج. لحل هذا الخطأ، عليك بالاتي : افتح مجلد "Asset Packages" في مشروع Unity الخاص بك. ابحث عن المجلد "com.unity.render-pipelines.universal" وافتحه. ابحث عن المجلد "Editor" وافتحه. ابحث عن المجلد "VFXGraph" وافتحه. ابحث عن المجلد "Shaders" وافتحه. ابحث عن الملفات المشار إليها في رسالة الخطأ ("PassForward2D.template" و "PassDepthOrMV.template"). انسخ الملفات المشار إليها إلى مجلد "Assets" في مشروع Unity الخاص بك. قم بفتح Unity وانتظر حتى يتم إعادة بناء المشروع. تأكد من أن الملفات المنسوخة موجودة الآن في مجلد "Assets" وأنها لا تزال موجودة في المجلدات الأصلية. يجب أن يعمل البرنامج الآن دون أي مشاكل. وإذا لم يتم حل المشكلة بهذه الطريقة، يمكنك محاولة إعادة تنزيل البكج الذي قمت بتثبيته في Unity وتثبيته مرة أخرى للتأكد من أن جميع الملفات المطلوبة موجودة.
  14. في البداية يجب عليك معرفة الخطوات اللازمة للإشتراك في عرض رمضان: 1- توجه إلى الرابط التالي : https://academy.hsoub.com/ وستجد عرض رمضان أمامك قم بالضغط عليه: 2- بعد ذلك ستجد زر باسم اشترك الآن، اضغط عليه: 3- سيتم نقلك إلى القسم الخاص بإختيار الدورات وإتمام عملية الدفع، حيث أن وسيلة الدفع المتوفرة هي بطاقة الإئتمان فقط بالنسبة لعرض رمضان. وأيضًا لا تتوفر أكواد خصم "لعرض رمضان"، فهو عرض بذاته. وإذا كنت تريد الدفع عن طريق باي بال، فعليك بالتواصل مع مركز المساعدة الخاص بأكاديمية حسوب بخصوص ذلك الأمر، فمن الممكن أن يخبروك أن تقوم بشراء دورة بدون العرض والدفع من خلال باي بال ثم سيتم إضافة الدورة الأخرى التي تريدها. وأرجو منك قراءة النقاش التالي:
  15. في البداية يجب عليك فهم كيف يتم الربط بين ملفات HTML , CSS, JavaScript. وهناك عدة طرق، ولكن الطريقة الأسهل هي بإضافة رابط ملفات CSS و JavaScript داخل ملف HTML. وHTML هي لغة تصميم صفحات الويب ويمكن الربط بين ملفات HTML و CSS عن طريق استخدام عنصر الـlink. ويتم وضع هذا العنصر في العنوان <head> من صفحة HTML، واستخدام الـlink للإشارة إلى ملف CSS الذي يحتوي على التعليمات البرمجية المتعلقة بتصميم الصفحة. وللقيام بذلك عليك جميع ملفات المشروع داخل مجلد واحد على هاتفك. مثال: <head> <link rel="stylesheet" type="text/css" href="style.css"> </head> وكما ترى استخدمت العنصر <link> مع تحديد الخاصية rel="stylesheet" التي تشير إلى أن هذا العنصر يربط بين ملف HTML وملف CSS. وتحديد الخاصية type="text/css" التي تشير إلى نوع الملف الذي يتم الربط به، وهو ملف CSS. وأخيراً تحديد مسار الملف الذي يتم الربط به بإستخدام الخاصية href="style.css". وإذا كان الملف داخل مجلد آخر في مجلد المشروع، أي مثلاً داخل مجلد باسم mohamedفيجب كتابة المسار بشكل صحيح كالتالي: <head> <link rel="stylesheet" type="text/css" href="mohamed/style.css"> </head> أما بالنسبة للربط بين ملفات HTML و JavaScript فهو يتم عن طريق استخدام العنصر <script>. فعند وضع الكود البرمجي للـ JavaScript داخل العنصر <script>، سيتم تنفيذ الكود عند تحميل الصفحة. وذلك من خلال ربط ملف JavaScript الخارجي باستخدام الخاصية src، بتحديد مسار الملف الذي يتم الربط به. مثال: <head> <script src="كود.js"></script> </head> ولا تنسى كتابة اسم الملف والمسار الصحيح، فهنا قمنا بربط كود الجافاسكريبت بواسطة ملف باسم كود.js أشهر محررات الأكواد على الهاتف الجدير بالذكر أنه يمكنك استخدام VScode الخاص بأجهزة الحاسوب من خلال المتصفح عن طريق الرابط التالي: https://vscode.dev أما بخصوص التطبيقات فتستطيع الإعتماد على أحد التطبيقات التالية: 1- DroidEdit محرر نصوص يحتوي على العديد من الميزات المفيدة مثل الإكمال التلقائي، والتميز اللوني، وإدارة الملفات، وتوفير مساحة التخزين السحابية. 2-Quoda يوفر Quoda الكثير من الميزات المفيدة للمستخدمين، مثل تمييز الألوان وتحرير الشفرة المصدرية وحفظ المشروعات. 3- Acode محرر نصوص يتميز بالسرعة والبساطة، ويدعم العديد من لغات البرمجة ويتميز بالأدوات المفيدة وسهولة الاستخدام. 4- Turbo Editor محرر نصوص بسيط وسهل الاستخدام يتيح للمستخدمين الوصول إلى أدوات التحرير المهمة بسرعة، مثل البحث، والاستبدال، والتميز اللوني. 5- QuickEdit محرر نصوص بسيط وسهل الاستخدام يتيح للمستخدمين الوصول إلى أدوات التحرير المهمة بسرعة، مثل البحث، والاستبدال، والتميز اللوني. 6- Code Peeker Pro تطبيق خفيف يمكن استخدامه لتحرير وعرض ملفات الشفرة المصدرية المختلفة، كما يدعم العديد من لغات البرمجة. 7- Codeanywhere تطبيق متميز لتحرير الشفرة المصدرية ويتيح الوصول إلى الأدوات المتقدمة للتحرير، ويوفر للمستخدمين التخزين السحابي والوصول إلى ملفات الشفرة المصدرية في أي وقت ومن أي مكان.
  16. سيتم الرد عليك بلا شك عزيزي، أرجو منك الإنتظار قليلاً ولا تقلق أبدًا بخصوص ذلك، وبعد 24 ساعة إذا لم يتم الرد، قم بالتواصل مرة أخرى.
  17. أرجو منك طرح السؤال أسفل فيديو الدورة الخاص به لنتمكن من مساعدتك، وطرح الأسئلة العامة الغير خاصة بالدورات هنا في قسم أسئلة البرمجة. وأيضًا توضيح ما الذي تتوقعه من الكود بالضبط. وعلى أي حال، إليك شرح الكود الخاص بك: وهو عبارة عن برنامج بسيط يتم استخدامه لإيجاد مجموع أرقام معينة وإضافة كل مجموع إلى قائمة جديدة. يتم تعريف قائمة من الأرقام بمسمى "numbers" وتحتوي على الأرقام [2, 5, 3, 1, 4]. تعريف قائمة فارغة جديدة بمسمى "empty". تعريف متغير بمسمى "result" بقيمة صفر، وسيتم استخدامه لحساب مجموع الأرقام. استخدام حلقة تكرار "for" لتمرير عبر كل عنصر في قائمة الأرقام. في كل مرة تتم فيها مرور حلقة التكرار عبر عنصر من الأرقام، يتم إضافة القيمة الحالية إلى المتغير "result". بعد ذلك، يتم إضافة المجموع الحالي (أي "result") إلى قائمة "empty". في النهاية، يتم طباعة مجموع الأرقام النهائي الذي تم حسابه وتخزينه في المتغير "result"، والذي هو 15 في هذه الحالة. بالتالي، يتم إنشاء قائمة جديدة باستخدام "empty" تحتوي على مجموع الأرقام المتراكم، حيث ستكون القائمة تحتوي على القيم [2, 7, 10, 11, 15].
  18. من الأفضل تخزين البيانات في صورة Lowercase من البداية في قاعدة البيانات.، ثم البحث عنها لحل لتلك المشكلة، أي سنبحث عن البيانات بعد أن قمنا بتخزينها في صورة حروف صغيرة: String nameCountryLower = NameContry.toLowerCase(); FirebaseFirestore.instance .collection('my_collection') .where('Country', isEqualTo: nameCountryLower) .get() .then((querySnapshot) { // يمكنك استخدام querySnapshot.docs للوصول إلى النتائج // ... }); أو استخدام أدوات أخرى للبحث في قاعدة البيانات وقد تم ذكرها في الرابط التالي: https://firebase.google.com/docs/firestore/solutions/search وهناك حل آخر: من خلال تحويل الاستعلام البحثي إلى مجموعة من القيم المتغيرة (variations) والتي يتم البحث عنها جميعها في الحقل الذي يراد البحث عنه. مثا: إذا كان البحث هو "oman" ، فسيتم تحويله إلى مجموعة ["oman"، "OMAN"، "Oman"] والتي تشمل جميع الحالات الممكنة لهذا الاستعلام بغض النظر عن حجم الأحرف. ثم يتم إجراء استعلام "in" حيث يتم البحث عن جميع هذه القيم المتغيرة في الحقل الذي يراد البحث عنه. يدعم استعلام "in" ما يصل إلى 10 مساواة (==) بين القيم مع عامل التشغيل "OR" اللوجيكي. وبهذا يمكن الاحتفاظ بحقل واحد فقط "name" والبحث فيه باستخدام التغييرات المحتملة عليه. List<String> variations = ["oman", "OMAN", "Oman"]; // TODO: write a function that converts the query string into this kind of Array QuerySnapshot search = await FirebaseFirestore.instance.collection("users").where("name", whereIn: variations).get(); وهنا يتم استخدام متغير القائمة (List) بدلاً من مصفوفة (Array) وكذلك الاستعلام البحثي whereIn بدلاً من "in"، وبعد ذلك يتم استخدام الدالة get() للحصول على نتائج الاستعلام.
  19. استخدم الدالة with في الاستعلام لجلب جميع الأحداث مع علاقتها بالكليات، ثم استخدام حلقة foreach للحصول على اسم الكلية لكل حدث. مثال: $events = Event::with('FaNa')->get(); foreach ($events as $event) { $facultyName = $event->FaNa->Faculty_Name; // القيام بالعمليات المطلوبة باستخدام اسم الكلية } ستحصل على مصفوفة $events تحتوي على جميع الأحداث وعلاقتها بالكليات، وستتمكن من الوصول إلى اسم الكلية لكل حدث باستخدام $event->FaNa->Faculty_Name.
  20. مرحبًا @Abdraouf Laifa أرجو منك مراجعة النقاش التالي وقد تم الإجابة على سؤالك به وحل المشكلة.
  21. حاول استخدام حلقة foreach() للتكرار على جميع العناصر في مصفوفة الكليات (faculties) وإنشاء قائمة منسدلة (dropdown list) تحتوي على جميع الكليات المتاحة. و استخدام هذه القائمة المنسدلة للسماح للمستخدمين بتحديد الكلية التي يرغبون في إضافة البيانات الخاصة بهم. اليك كود يعرض قائمة المنسدلة لجميع الكليات: {!! Form::open(['route' => 'route_name', 'method' => 'post']) !!} {!! Form::label('Faculty', 'Select a Faculty') !!} {!! Form::select('Faculty_ID', $faculties->pluck('Faculty_Name', 'Faculty_ID')) !!} {!! Form::submit('Submit') !!} {!! Form::close() !!} يتم فتح نموذج HTML باستخدام {!! Form::open() !!} وتحديد عنوان URL الذي يرسل إليه النموذج باستخدام مفتاح الخاصية 'route'، أيضًا تحديد طريقة الإرسال باستخدام مفتاح الخاصية 'method'. بعد ذلك، إنشاء تسمية لعنصر الاختيار المنسدل باستخدام {!! Form::label() !!}. ثم، إنشاء عنصر الاختيار المنسدل باستخدام {!! Form::select() !!}، حيث يتم تمرير قيمة 'Faculty_ID' كاسم لعنصر الاختيار المنسدل ومصفوفة الكليات ($faculties) كقيمة للخيارات المتاحة في عنصر الاختيار المنسدل. واستخدام دالة pluck() لاستخراج اسم الكلية كنص من مصفوفة الكليات، وكذلك استخراج قيمة Faculty_ID كقيمة للخيارات في عنصر الاختيار المنسدل. أخيرًا، إنشاء زر Submit باستخدام {!! Form::submit() !!}، وإغلاق النموذج باستخدام {!! Form::close() !!}.
  22. تستطيع استخدام الدالة foreach() لتكرار على جميع العناصر الموجودة في مصفوفة Array أو في قائمة Collection في Laravel. و دالة foreach() متاحة في لغة البرمجة PHP التي يعتمد عليها Laravel. مثال: $array = array('item1', 'item2', 'item3'); foreach ($array as $item) { echo $item; } وبالإمكان استخدام الدالة foreach() لاسترجاع جميع العناصر في قائمة Collection في Laravel كما يلي: $collection = collect(['item1', 'item2', 'item3']); foreach ($collection as $item) { echo $item; } وبذلك تستطيع التكرار على جميع العناصر في مصفوفة Array أو في قائمة Collection في Laravel والقيام بالعمليات التي تريدها على كل عنصر.
  23. ربما قام شخص ما بمحاولة تسجيل الدخول عدة مرات، ولذلك تم إغلاق حسابك لحمايته. والحل الذي أمامك الآن هو تسجيل الدخول من أحد الأجهزة التي تم التعرف عليها مسبقًأ قبل غلق الحساب، سواء هاتفك أو حاسوبك. وإذا استمرت المشكلة، سيتعين عليك إثبات ملكيتك للحساب، وتسطيع ذلك من الضغط على الرابط التالي: https://facebook.com/login/identify ثم قم بالبحث عن حسابك بواسطة الإيميل أو رقم الهاتف. وأيضًا يجب أن يكون جهاز تم تسجيل الدخول منه من قبل، ثم اتبع خطوات إعادة تعيين كلمة السر الخاصة بحسابك. وإذا استمرت المشكلة ولم تتمكن من إعادة تعيين كلمة السر، قم بإرسال طلب مراجعة لحسابك عبر الرابط التالي: https://web.facebook.com/help/contact/260749603972907 أيضًأ تستطيع استعادة حساب Facebook الخاص بك باستخدام حساب صديق أو عائلة: قم بالدخول إلى حساب Facebook لصديق أو عضو عائلتك عن طريق استخدام حاسوب. ابحث عن حساب Facebook الخاص بك الذي تريد استعادته. انقر فوق زر "المزيد" تحت الصورة الغلاف. حدد "البحث عن الدعم أو الإبلاغ عن الحساب". حدد "شيء آخر" ثم انقر على "التالي". انقر على "استعادة هذا الحساب" واتبع الخطوات الإضافية التي ستظهر على الشاشة لإثبات هويتك وإثبات أنك صاحب الحساب.
  24. إضافة إلى ما ذكره محمد، يمكن أن تكون الأرقام Double Precision أكثر دقة من الأرقام ذات الدقة المفردة، لأنها تستخدم 64 بتًا لتمثيل الرقم بدلاً من 32 بتًا. وهذا يعني أن الأرقام Double Precision يمكن أن تمثل قيم أكبر وأصغر من الأرقام ذات الدقة المفردة، وتسمح بإجراء العمليات الحسابية الأكثر دقة. وفيما يتعلق بأنواع الأرقام في JavaScript، فإن اللغة توفر ثلاثة أنواع أساسية للأرقام: الأعداد الصحيحة (integers) والأعداد العشرية (floating-point numbers) و NaN (Not a Number). ويتم تمثيل الأعداد العشرية في JavaScript باستخدام Double Precision، حيث يتم تخزينها باستخدام 64 بتًا، كما يمكن استخدام الأعداد العشرية في JavaScript لتمثيل الأعداد الصحيحة بسبب نطاقها الأكبر. أما بالنسبة لـ Syntactic Sugar في JavaScript، فهناك العديد من الأمثلة على ذلك، مثل استخدام "arrow functions" بدلاً من الدوال العادية و "template literals" بدلاً من السلاسل النصية المعتادة. هناك العديد من أمثلة Syntactic Sugar في JavaScript، وهنا مثال بسيط: بدلاً من استخدام الدالة العادية: function add(x, y) { return x + y; } يمكن استخدام الـ arrow function: const add = (x, y) => x + y; وبهذا يتم تبسيط كتابة الدالة وجعلها أكثر وضوحًا وسهولة للفهم.
  25. بالنسبة لخلط جميع الأعمدة دفعًة واحدة: انقر بزر الماوس الأيمن على رأس الجدول (الصندوق الأعلى الأيسر) لتحديد جميع الأعمدة، كما في الصورة التالية: 2- قم بإختيار Sort أو ترتيب 3- بعد ذلك إختر ترتيب مخصص Custom sort 4- الآن ستظهر لك نافذة اضغط على options واختر sort left to right أو ترتيب من اليسار إلى اليمين، ثم إضغط Ok. 5- قم بإختيار الترتيب على حسب ما تريده، مثلاً إختر الترتيب بالصف الأول sort by ويمكنك تعديل باقي الخيارات بما يتناسب مع ما تريده. 6- انقر فوق "موافق" لتأكيد الخلط.
×
×
  • أضف...