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

Mustafa Suleiman

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

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

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

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

    365

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

  1. المشكلة تحدث عند تشغيل أمر بناء (build) في مشروع Flutter على Android، والسبب الرئيسي هو عدم وجود توقيع صحيح لأحد المكونات أو الوظائف المستخدمة في المشروع، وعليك بالتالي: 1- تحديث Flutter وأدوات التطوير المرتبطة بها إلى أحدث إصدار، باستخدام الأمر التالي في منفذ الأوامر: flutter upgrade ففي بعض الأحيان تحدث المشكلة بسبب أن إصدار Flutter غير متوافق مع إصدار gradle لديك، فمثلاً لو كان لديك إصدار 3.7 من Flutter فلن يعمل مع إصدار 8 من gradle وبالتالي ستحتاجين إلى استخدام الإصدار 7.4.2 من gradle أو تحديث Flutter. 2- حذف مجلد build في مشروع Flutter وأعيدي تشغيل عملية البناء، بالأوامر التالية: cd <مسار المشروع> flutter clean flutter build apk و cd أقصد بها التوجه إلى المجلد الخاص بالمشروع ثم تنفيذ الأوامر الأخرى بالترتيب. 3- تأكدي من أنك تستخدمي نسخة من Java Development Kit (JDK) متوافقة مع Flutter، وحاليًا يوصى باستخدام JDK بإصدار 8 أو أحدث. وقومي بالتحقق من إعدادات المتغيرات البيئية (Environment Variables) على جهاز الكمبيوتر الخاص بك للتأكد من تعيين المسار الصحيح لـ JDK. 4- تحققي من ملف build.gradle في مشروع Flutter، وتأكدي من أنه لا يوجد أي أخطاء في الإعدادات الخاصة بالتبعيات (dependencies) أو الوظائف المستخدمة. وإذا استمرت المشكلة، فقد تحتاجي إلى مراجعة سجلات الأخطاء (log) المفصلة التي تظهر عند تشغيل الأمر مع خيار --debug للحصول على مزيد من المعلومات حول الخطأ الذي يحدث. وأيضًا حاولي استخدام الأمر التالي: flutter doctor -v لفحص وعرض معلومات مفصلة حول بيئة تطوير Flutter المحلية على جهاز الكمبيوتر لديك، وعند تنفيذ هذا الأمر، ستحصلي على تقرير شامل يوضح حالة تثبيت Flutter والأدوات المرتبطة بها، بما في ذلك الأدوات اللازمة لتطوير تطبيقات Flutter على منصات مختلفة مثل Android وiOS.
  2. في الآونة الأخيرة هناك نقاش دائر حول ما الفرق بين software Developer والـ Software Engineer وإذا بحثت على الإنترنت ستجد أن الـ Software Engineer هو مسؤول عن عملية تصميم السوفت وير أو البرنامج من البداية حتى النهاية من حيث التصميم والتحليل وهيكلة المشروع وخلافه. أما الـ Developer فهو مسؤول عن كتابة الكود فقط، أو تنفيذ المهام المطلوبة منها والتي وضعها الـ Software Engineer، وذلك التعريف على الإنترنت فقط. أما على أرض الوقع فكلاهما سواء وهما شخص واحد، ويجب على الـ Developer الجيد أن يطمح إلى أن يكون Software Engineer ويتعلم أساسيات البرمجة وعلوم الحاسوب ودورة الحياة لتطوير الأنظمة البرمجية SDLC وهي إختصار لـ Software Development Life Cycle، وقد تم توضيحها في النقاش التالي: بالإضافة إلى دراسة الخوارزميات وهياكل البيانات وتعلم مهارة Problem solving، وأنماط التصميم Design Patterns. أيضًا يجب الإلمام بالـ hardware architecture لمعرفة كيف يتم معالجة الكود الخاص بك عن طريق المعالج والنظام والذاكرة العشوائية. وفي بداية تعلمك قد تبدوا الأمور السابقة صعبة الفهم أو لا تجد فائدة لها، وذلك صحيح، ونصيحتي إليك هي بمحاولة فهمها بقدر استطاعتك، ثم تعلم لغة البرمجة الأولى لك والعودة إلى مذاكرة ما سبق مرة أخرى وستجد فائدة كبيرة جدًا وستفهم ما كان مبهم وأشبه بعلوم الفضاء بالنسبة لك في البداية.
  3. ما يؤهلك للعمل في تلك الشركات هو تعلم مجالك بإحترافية وسنوات الخبرة المطلوبة في وصف الوظيفة والأمر مختلف من وظيفة لأخرى، لكن ما يهم حقًا هو تعلم Data Structure وAlgorithms وSystem Design والـ Problem Solving. حيث أنه يتم إختبارك في تلك المهارات بشكل قوي، وستجد العديد من الكورسات التي تؤهلك لإجتياز تلك الإختبارات من خلال تعلم تلك المهارات بشكل قوي وعلى أسس صحيحة، لا أن تحقظ حل بعض الأسئلة الشهيرة فقط فبذلك أنت تخدع نفسك. وأيضًا مهارات الـ Soft skills وتستطيع البحث عنها على اليوتيوب وهي هامة جدًا في مقابلات العمل، بالإضافة إلى تعلم مهارة إنشاء CV قوي أي مهارة كيف تعرض وتسوق لنفسك بشكل مختصر وتلك مهارة هامة سواء في الـ CV أو مقابلة العمل. والأمر سيسير كالتالي: أولاً عليك الحصول على مقابلة عمل، وإليك بعض النقاط حول ذلك: يحتاج المرشح للحصول على مقابلة عمل في إحدى شركات FAANG. تكون هناك الكثير من السير الذاتية التي ترسل لشركات تكنولوجيا المعلومات، ومعظمها سيئة التنسيق ولا تشتمل على تعليم في علوم الحاسوب أو خبرة. هناك بعض الطرق الفعالة لتميز سيرتك الذاتية هنا، مثل: 1. الحصول على توصية من موظف داخل الشركة، 2. وجود خبرة عمل كمبرمج، 3. حصولك على شهادة في علوم الحاسوب، و 4. تقديم سيرة ذاتية تبدو جميلة (قليل من الأخطاء الإملائية، تنسيق جيد، وربما تحتوي على عدة لغات برمجة أو شيء مشابه). والتركيز يجب أن يكون على أسهل طريقة وهي الحصول على توصية، قم ببناء شبكتك الاجتماعية وابحث عن أشخاص يعملون في تلك الشركات الكبرى الذين يمكنهم تقديم سيرتك الذاتية، وهذه خطوة جيدة لك ولهم أيضًا لأن تلك الشركات تدفع مكافآت مالية للمهندسين الذين يوصون بمزيد من المهندسين البرمجيين. بعد ذلك، قم بالتركيز على النقطة الثانية. النقطة الثانية: أداء جيد في المقابلة. بعد تحقيق النقطة الأولى، ستحصل على مقابلات في الشركات الخمس. لاحظ أن معدل نجاح هذه المقابلات منخفض، فعادةً ما تبدأ بامتحان تلقائي أو مكالمة هاتفية لمدة ساعة مع مهندس برمجي أو اثنين، وسيطرحون عليك سؤالًا مأخوذًا مباشرة من "Cracking the Coding Interview"، وستكتب إجابة وتقول "هذا O(N log N)" وسيشيدون بك لأنك واحد من بين خمسة أشخاص تقريبًا تجتازوا تلك الاختبارات الهاتفية وتستمرون في المراحل التالية. وللنجاح في تلك المرحلة، يجب دراسة الخوارزميات وهياكل البيانات، وحل مشاكل مماثلة لـ LeetCode، ونأمل أن يقوم أحد أصدقائك الذين قدمت لهم توصية بإجراء بعض المكالمات التجريبية للممارسة. وهذا النوع من الممارسة سيكون جزءًا كبيرًا من تركيزك خلال فترة العمل لمدة عامين، وهذا هو المعيار الرئيسي الذي ستقيم عليه، إلى احترافيتك أثناء المقابلة والتجهيز الجيد لها. بعد ذلك، ستأتي مرحلة المقابلة في المكان الفعلي (on-site interview) وستكون مشابهة للمقابلة الهاتفية باستثناء أنك ستجري خمسة مقابلات متتالية. وقد يكون لديك فرصة 1 من بين 6 لاجتياز هذه المرحلة، في المتوسط. وستساعدك الممارسة بشكل كبير. الأخبار الجيدة هي أن العملية تعتمد إلى حد كبير على الصدفة، بفرض أنك جيد جدًا في الإجابة على هذا النوع من المشكلات، فإذا ما قمت بالمقابلة في الشركات الخمس، فإن الفرص جيدة جدًا أن يتم اجتيازك في إحداها، وسوف تتحسن قدرتك على المقابلة مع الوقت. بالإضافة إلى ذلك، تتوفر لدى بعض هذه الشركات فرصة لإعادة المقابلة بعد ستة أشهر إلى سنة. لذا، فإن الفرصة لاجتياز المقابلة الأولى ضئيلة، ولكن الفرصة جيدة في الواقع لاجتياز إحدى المقابلات في النهاية، وتحتاج فقط إلى اجتياز المقابلة مرة واحدة. وهل أنت مرتاح في التحدث أمام عدة أشخاص؟ عليك بأن تصبح مرتاحًا من خلال إجراء مقابلات عمل والتعود عليها، وانتبه إلى أن حل مشكلة خوارزمية في المنزل شيء، وحل مشكلة خوارزمية على لوح أبيض أمام عدة أشخاص ومهنة تحقق من ستة أرقام مالية هي شيء آخر تمامًا. وبالطبع عليك العمل على اللغة الإنجليزية الخاصة بك، وأنصحك بمشاهدة الفيديو التالي على اليوتيوب: كيف تصل للشركات العالمية؟ || بودكاست مع المهندس أحمد علي - مهندس برمجيات في شركة فيسبوك. وستتعلم الكثير خلال مقابلة مدتها ساعة ونص من المعلومات المفيدة حقًا.
  4. ذلك الموجه موجود فقط في إطار لارافيل وليس PHP كما تم التوضيح في التعليقات السابقة.
  5. الطريقة الأولى هي عن طريق الدخول على جهازك عن طريق برامج مثل Anydesk أو TeamViewer وتجربة الموقع على جهازك. والطريقة الثانية هي بإرسالة فيديو تعرض من خلال الموقع ومميزاته للعميل. والطريقة الثالثة هي برفع الموقع على استضافة لكن قم بعمل build للمشروع ورفعه، أي أنك لن تقوم برفع الكود المصدري. والطريقة الرابعة هي بإنشاء استضافة محلية للموقع على جهازك، وإرسال الرابط للعميل، كما لو أنك قمت برفعه على استضافة، وأمثلة لتلك الخدمات هي: Ngrok Localtunnel Serveo Teleconsole Pagekite
  6. برمجة الروبوتات تتطلب برمجة على الحاسوب الشخصي وليس بالضرورة استخدام بيئات سحابية مثل Google Colab، وبإمكانك استخدام الحاسوب الشخصي لتطوير وتجربة برامج الروبوتات وتحميلها مباشرة إلى الروبوت. ولكن بعض الأشخاص يفضلون استخدام بيئات سحابية مثل Google Colab لبرمجة الروبوتات بسبب بعض المزايا التي توفرها هذه البيئات. مثلاً، يمكن تشغيل البرامج على خوادم السحابة بدلاً من تشغيلها على الحاسوب الشخصي، وذلك قد يكون مفيدًا في حالة الروبوتات التي تحتاج إلى موارد كبيرة أو للتجربة والتطوير السريع دون الحاجة إلى تثبيت البرامج محليًا. أي ببساطة، إذا كان حاسوبك بمواصفات جيدة فلن تحتاج إلى Google Colab. وإليك مزيد من التفاصيل عن مجال برمجة الروبوتات Robotics :
  7. إذا كنت تريد أخذ لقطة شاشة Screenshot للموقع من أجل وضعه في معرض الأعمال، فهناك إضافات خاصة للمتصفح تسمح لك بذلك وهم: Screely وتلك الإضافة تسمح لك بأخذ لقطة للشاشة ووضعها في إطار لتبدوا إحترافية مثل الصورة التالية: ولكن اللقطة ليست لكامل الموقع، وإذا أردت إلتقاط كامل الموقع فأنصحك بالإضافة التالية: FireShot تلك الإضافة تسمح لك بأخذ لقطات للموقع كيفما تريد ومنها إلتقاط صورة لكامل الموقع وبأعلى جودة:
  8. تلك المشكلة حلها لديك أنت، ولا أحد قادر على حلها لك، فقط سيقدم لك النصائح، ومن لا يريد مساعدة نفسه فلا أحد يستطيع مساعدته، وبإمكانك مساعدة نفسك بتقليل المشتتات من حولك وصاحب الملل، نعم الملل هو من سيدفعك للمذاكرة والقيام بشيء مفيد بدلاً من التركيز على الملهيات والمشتتات التي تبقي عقلك مشغولاً ويتلذذ بجرعات الدوبامين اللحظية وقصيرة الأجل. وطالما اخترت مجالك على أساس سليم، كما شرحت لك من قبل وسأترك لك النقاش هنا: بعد ذلك عليك بإختيار مسار تعليمي مكون من الكورسات اللازمة للحصول على المهارات المطلوبة في ذلك المجال، أي يجب أن تختار الكورسات وتلتزم بها من البداية وبالطبع تستطيع تغييرها إن كانت سيئة لكن فيما يتعلق بالكورسات المجانية فالأمر محدود وليس لديك الكثير من الخيارات. وبخصوص الإلتزام فقد تحدثت عن ذلك من قبل في النقاشات التالية: الإلتزام في تعلم البرمجة وتجنب المشتتات
  9. مسؤولية إنشاء الـ API هي خاصة بمطور الواجهة الخلفية، لكنك تستطيع تعلم ذلك، وذلك ما قصدته بكونك تستطيع، أو بإمكانك استخدام تقنيات توفر لك إنشاء API بدون الحاجة إلى إنشاء سيرفر وتعرف باسم Serverless مثل Netlify Functions وAWS Lambda. وNetlify Functions هي خدمة من Netlify تسمح لك بتشغيل شفراتك كـ API endpoints بشكل بسيط، وهي جزء من خدمات الـ serverless functions، وطريقة لنشر الكود الخادم كـ API endpoints، حيث يتم تشغيلها تلقائيًا عند حدوث حدث محدد، وتقوم بمعالجة الشفرات التي تعمل على الجانب الخادم وتتوقف بعد الإنتهاء من المهمة. وأغلب مطوري تطبيقات يستخدمون Firebase كواجهة خلفية للتطبيق وتتيح لهم إرسال واستقبال الطلبات أي إنشاء API وأيضًا قاعدة بيانات، بكل سهولة، وفقط عليك بتعلم كيفية الإتصال وإنشاء حساب وقاعدة بيانات واستخدام الدوال الخاصة بها في الكود لديك. وأيضًا هناك منصات مشابهة وهم Appwrite وSupabase، وإليك نبذة مختصرة: Firebase مجموعة شاملة من الأدوات التي توفر بنية تحتية قوية لتطوير تطبيقات الهاتف المحمول والويب، وتتضمن Firebase خدمات مختلفة مثل قاعدة بيانات الوثائق (Firestore) وتخزين الملفات والمصادقة وإرسال الإشعارات والتحليلات وغيرها الكثير، وتستطيع استخدام API Firebase لإجراء عمليات القراءة والكتابة والمزيد بدون الحاجة إلى كتابة الكود الخاص بالخلفية. Appwrite منصة خلفية مفتوحة المصدر تساعدك في بناء خدمات الويب السحابية (Backend-as-a-Service) بسهولة، وتوفر Appwrite مجموعة من الخدمات المختلفة مثل قاعدة بيانات الوثائق والتخزين والمصادقة والتحليلات، وبإمكانك استخدام API Appwrite لإنشاء وتعديل واستعلام البيانات دون الحاجة لمعرفة متقدمة بالواجهة الخلفية. Supabase منصة لإنشاء واجهة برمجة تطبيقات قاعدة البيانات (API) مبنية على PostgreSQL، وتوفر Supabase تجربة مشابهة لقاعدة بيانات PostgreSQL التقليدية مع إضافة طبقة من الواجهة البرمجية التي تجعل من السهل إنشاء وتعديل البيانات. وبالطبع تستطيع استخدام API Supabase لإجراء العديد من العمليات القياسية مثل الاستعلامات والإدخال والتحديث والحذف دون الحاجة لمعرفة متقدمة بالواجهة الخلفية. في المجمل، كل هذه المنصات تسعى إلى تبسيط تطوير التطبيقات وتقديم واجهات سهلة الاستخدام للمطورين الذين ليسوا متخصصين في الواجهة الخلفية، ولكن ستحتاج إلى بعض المعرفة الأساسية بمفاهيم الواجهة الخلفية والاستعلامات والتحكم في البيانات لتتمكن من استخدام هذه الأدوات بكفاءة. ولعلك تتسائل ما الفرق بين Serverless ومنصات مثل Firebase؟ ببساطة منصة مثل Firebase توفر تطوير تطبيقات شاملة تقدمها Google، وتتضمن Firebase مجموعة واسعة من الخدمات المستندة إلى السحابة مثل قاعدة بيانات الوثائق (Firestore)، وخدمة التخزين، والمصادقة، وإرسال الإشعارات، والتحليلات، والاستضافة، وغيرها الكثير. ويتم تطوير Firebase بشكل خاص لتسهيل تطوير التطبيقات النقالة وتوفير البنية التحتية اللازمة للتطبيقات الحديثة. من ناحية أخرى، يعتبر Serverless نمطًا لتطوير التطبيقات، ولا يرتبط بمنصة محددة، وتستخدم خدمات Serverless مثل AWS Lambda أو Azure Functions أو Google Cloud Functions لتنفيذ شفرة التطبيق فقط عندما يتم استدعاؤها، دون الحاجة لتكوين وإدارة خادم خاص، أي يتيح لك استخدام Serverless توفير الوقت والجهد في إدارة البنية التحتية وتكوين الخوادم. وFirebase تستخدم تحت الغطاء خدمات Serverless لتنفيذ بعض وظائفها، وكمثال فهي تستخدم Firebase Cloud Functions (وهي خدمة Serverless) لتشغيل الكود المستضاف في Firebase. أي يمكن اعتبار الخدمات السابقة (Supabase وAppwrite وFirebase) جزءًا من النمط Serverless في بعض الجوانب.
  10. بالطبع تستطيع إنشاء API، وقد تم الحديث بشكل مفصل في النقاش التالي: ما هو الـ API
  11. السؤال غير واضح، أرجو توضيح السؤال مع مثال بالصورة لو أمكن
  12. الكود سليم، لكن كمحاولة استخدم الكود التالي: function onEdit(e) { const url = "http://localhost:8000/edit"; // استبدله بعنوان URL الصحيح لخادمك الشخصي const options = { method: "POST", headers: { "Content-Type": "application/json", }, payload: JSON.stringify(e), // إرسال بيانات التعديل كجزء من الجسم (payload) للطلب muteHttpExceptions: true, }; try { UrlFetchApp.fetch(url, options); } catch (error) { console.error("حدث خطأ أثناء إرسال الطلب:", error); } } قمت بإضافة خاصية "headers" لتعيين نوع المحتوى إلى "application/json"، كما قمت بتحويل بيانات التعديل (e) إلى سلسلة JSON باستخدام JSON.stringify() وإرسالها كجزء من الجسم (payload) للطلب. تم أيضًا إضافة كتلة try-catch للتعامل مع الأخطاء المحتملة أثناء إرسال الطلب، وستتم طباعة أي خطأ إلى سجل الخطأ ويمكنك مراجعته لمعرفة تفاصيل الخطأ المحدث. وعليك باستبدال عنوان URL الصحيح لخادمك في السطر const url = "http://localhost:8000/edit"; بالعنوان الصحيح الذي يستخدمه السيرفر لديك. وتأكد من أن السيرفر يستجيب للطلبات POST وأن لديك الإعدادات الصحيحة للوصول المشترك (CORS) للسماح للطلبات الواردة من نطاق Google Apps Script.
  13. الكلاس في HTML هو وسيلة لتحديد اسم للعنصر من أجل تطبيق تنسيق عليه بشكل دقيق عن طريق CSS أو تنفيذ سكريبت من خلال جافاسكريبت، وذلك عن طريق البحث عن العنصر باسم الكلاس ثم تنفيذ ما تريده. فتخيل لو لديك أكثر من عنصر div مثلاً ولكن تريد تنفيذ تنسيق لـ div محدد، فمن الأسهل وضع اسم له عن طريق الكلاس بدلاً من إختياره بصعوبة بناءًا على مكانه في الكود وإن تغير مكانه سيحدث مشكلة، لذلك إختياره بناءًا على اسمه سواء عن طريق الكلاس أو الـ id هو الصحيح. وبخصوص الأيقونة، فالكود في الصورة يستخدم أسماء الكلاسات الخاصة بمكتبة font-awesome والتي تقوم بتوفير أيقونات من خلال كتابة الكلاس الخاص بالأيقونة، وقد تم شرح ذلك بشكل وافي هنا:
  14. أولاً سأشرح لك ما معنى كل من الـ pseudo-classes الآتية: وقبل ذلك لنفهم ما معنى pseudo-class في CSS، وهي تعبير يستخدم لتحديد حالة محددة أو حالة خاصة لعنصر HTML، وتسمح pseudo-classes بتطبيق أنماط وتنسيقات مختلفة للعناصر بناءً على حالتها أو عنصر معين. {}a:link هذا يحدد النمط الذي ستظهر به الروابط التي لم يتم النقر عليها بعد (روابط لم يتم زيارتها). {}a:visited يحدد النمط الذي ستظهر به الروابط التي تم النقر عليها مسبقًا (روابط تم زيارتها أي النقر عليها). {}a:focus تحدد النمط الذي ستظهر به الروابط عندما تكون محددة بواسطة المستخدم (جرب الضغط على Tab في الكيبورد وستجد أنه يتم التنقل بين عناصر الصفحة إلى أن تصل للروابط). {}a:hover يحدد النمط الذي ستظهر به الروابط عندما يتم تحريك المؤشر فوقها. {}a:active يحدد النمط الذي ستظهر به الروابط عندما يتم النقر عليها (الضغط بالفأرة دون الإفلات أي بشكل مستمر أي اللحظة التي تضغط فيها بالفأرة). والترتيب الذي يشترط في هذه القواعد هو أمر مهم لأنه يُحدد ترتيب تطبيق الأنماط وتعديلات الشكل على الروابط وفقًا لحالة الروابط وتفاعل المستخدم معها. ولكن ذلك ليس ضروري حيث أن التنسيق هنا يتم بناءًا على حالة العنصر وليس موقعه في الكود المكتوب، وفي حال قمت بكتابة مثلاً focus أو hover في البداية فلن يتغير شيء، حيث يطبق التنسيق بناءًا على حالة العنصر فقط. ولتوضيح أفضل، إليك مثالًا على كيفية استخدام هذه القواعد: a:link { color: blue; } a:visited { color: purple; } a:focus { color: DarkTurquoise; } a:hover { color: red; } a:active { color: green; } وستكون الروابط غير المزارة باللون الأزرق (a:link)، وعندما يتم النقر على الرابط ويتم تحويله إلى حالة مزارة، سيتغير لونه إلى اللون البنفسجي (a:visited). وعند التنقل بين عناصر الصفحة عند الضغط على Tab سيكون اللون هو DarkTurquoise. وعند تحريك المؤشر فوق الرابط، سيتغير لونه إلى اللون الأحمر (a:hover)، وعند النقر عليه، سيتغير لونه إلى اللون الأخضر (a:active) وجرب عدم الإفلات أي اضغط بشكل مستمر وستجد أن لونه أخضر. وإليك مثال: <!DOCTYPE html> <html> <head> <title>تنسيق الروابط</title> <style> a { color: blue; } a:visited { color: p; } a:focus { color: DarkTurquoise; } a:hover { color: red; } a:active { color: green; } </style> </head> <body> <h1>تنسيق الروابط</h1> <p> <a href="#">روابط الصفحة</a> <br> <a href="#">رابط آخر</a> <br> <a href="#">رابط إضافي</a> </p> </body> </html>
  15. خاصية margin: 0 تستخدم لتحديد هوامش (margins) لعناصر HTML، وتعمل على تحديد المسافة بين العناصر والعناصر الأخرى في الصفحة. ولكن في حالة جداول HTML، خاصية margin: 0 لا تعمل بنفس الطريقة التي تعمل بها في عناصر HTML الأخرى. بل نستخدم خاصية border-collapse في جدول HTML، والتي تعمل على دمج حدود (borders) الخلايا المجاورة معًا، مما يؤدي إلى إزالة التباعد (spacing) الافتراضي بين الخلايا، ويعمل ذلك على تجنب ظهور التباعد الزائد ويمنح الجدول مظهرًا مرتب ومتجانس. في حين، خاصية margin: 0 لا تعمل على تجاهل التباعد بين الخلايا في جدول HTML، وحين وضعها على حقول الجدول td فلن تجد لها تأثير، وعند وضعها على الجدول نفسه table ستجد أنه يبتعد عند العناصر الأخرى بمقدار الـ margin الذي قمت بوضعه وإليك مثال: <style> table { border-collapse: collapse; margin: 10px } table td { border: 1px solid black; } </style> <table> <tr> <td>خلية 1</td> <td>خلية 2</td> <td>خلية 3</td> </tr> <tr> <td>خلية 4</td> <td>خلية 5</td> <td>خلية 6</td> </tr> </table>
  16. في لغة جافا، تستطيع استخدام الأنواع البدائية (مثل char) مباشرة دون الحاجة إلى إنشاء كائنات من الكلاس المرتبط بهذه الأنواع، وأيضًا بإمكانك استخدام الكلاس Character للتعامل مع الأحرف ككائنات. ويوفر الكلاس Character في جافا العديد من الدوال والميثودز المفيدة للتعامل مع الأحرف، مثل دالة isLetter() التي تحقق ما إذا كانت الحرف متكونة من حرف فقط أو لا، أي استخدام الدالة isLetter() على كائن من الكلاس Character لفحص الحرف الموجود فيه واسترجاع نتيجة الفحص. وكمثال، عندما نقوم بتعريف متغير من النوع البدائي char ونمنحه قيمة، فتستطيع استخدام الدالة isLetter() من الكلاس Character لفحص إذا كان الحرف الذي تم تخزينه يمثل حرفًا أو لا، وفي حالتنا، فإن الكود يعمل بشكل صحيح لأننا نقوم بتمرير قيمة الحرف إلى الدالة isLetter() ونطبع النتيجة التي تم استرجاعها من الدالة. لذلك، بالرغم من أنه يمكننا استخدام الأنواع البدائية مباشرة، إلا أن الكلاسات المرتبطة بهذه الأنواع (مثل Character) توفر وظائف إضافية ودوال مفيدة للتلاعب والتعامل مع هذه الأنواع. وإليك مثال يوضح كيفية استخدام الكلاس Character لفحص إذا كان الحرف متكونًا من حرف أو لا: public class Main { public static void main(String[] args) { char c1 = 'g'; // استخدام الدالة isLetter() من الكلاس Character boolean isLetter = Character.isLetter(c1); if (isLetter) { System.out.println("الحرف " + c1 + " هو حرف"); } else { System.out.println("الحرف " + c1 + " ليس حرف"); } } } أولاً نقوم بتعريف المتغير c1 كحرف 'g'، ثم نستخدم الدالة isLetter() من الكلاس Character لفحص إذا كان الحرف c1 يمثل حرفًا أو لا، ونتمكن من استرجاع النتيجة وتخزينها في متغير من النوع boolean بواسطة الكود boolean isLetter = Character.isLetter(c1);. ثم نقوم بفحص القيمة المخزنة في المتغير isLetter، وإذا كانت true، فإن الحرف c1 هو حرف ونقوم بطباعة رسالة توضح ذلك، وإذا كانت false، فإن الحرف c1 ليس حرف ونقوم بطباعة رسالة توضح ذلك. وبناءًا على القيمة المخزنة في المتغير c1 (الحرف 'g')، سيتم طباعة النتيجة "الحرف g هو حرف"، لأن الحرف 'g' هو حرف صالح. وإليك مصادر أخرى للشرح:
  17. الخطأ يخبرك أن الدالة FlatButton غير معرفة، هل قمت بكتابتها بشكل صحيح، أي تأكد من كتابة الأحرف الصغيرة والكبيرة في اسم الدالة بشكل صحيح، وأيضًا هل هناك مكتبة تستوردها لتعريف تلك الدالة؟
  18. أشرت لك من قبل أن الصيغة غير مدعومة في HTML5 وسيتوجب عليك تحويل الصيغة إلى أحد الصيغ التالية MP4, WebM, OGV عن طريق مكتبة مخصصة لذلك أو باستخدام أحد برامج تحويل الفيديوهات مثل: Any Video Converter Freemake Video Converter Free Video Converter وغيرها من البرامج الأخرى، وكما ذكرت لك هناك مكتبات تسمح بتحويل الفيديو مثل: https://www.npmjs.com/package/video-converter https://www.npmjs.com/package/video-format-converter https://www.npmjs.com/package/html5-media-converter
  19. بخصوص شرح عن <video> فستجد شرح كامل له في موسوعة حسوب، وأيضًا هناك دروس في قسم المقالات يشرح كيفية إضافة مقاطع الفيديو في HTML: وبخصوص العنصر <source> فقد تم شرحه في موسوعة حسوب أيضًا: https://wiki.hsoub.com/HTML/source وسبب أن الفيديو لا يعمل أن الصيغة .mov غير مدعومة في html5 وتستطيع رؤية الصيغ المدعومة من هنا: https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats والأمر يتطلب تحويل صيغة الفيديو إلى صيغة أخرى قبل عرضه في المتصفح وهناك مكتبات لذلك مثل html5-media-converter، ولكن لتجنب تعقيد الأمور الآن، استخدم فيديو بصيغة mp4.
  20. أرجو منك توضيح السؤال وما هو المشروع الذي تعمل عليه وأيضًا ستجد سبب الخطأ في محرر الأكواد VScode في تبويب PROBLEMS وتستطيع الوصول إليه عن طريق الضغط على CTRL + SHIFT + M معًا.
  21. هل قصدت وضع تلك الخواص التي أسفلها خط متعرج باللون الأحمر داخل قوسين {} لأن سبب المشكلة هو ذلك، حيث أنك قمت بغلق دالة onPressed بالقوس { قبل child
  22. أولاً عليك بإختيار محرك الألعاب الذي تريد تصميم ألعابك عليه، وسأذكر لك المحركات الشائعة: Unity3d Unreal Engine Godot GameMaker Studio Construct 3 Panda3D Buildbox CryEngine وستجد الجميع ينصحك بـ Unity حيث يتيح لك إنشاء أي لعبة مجانًا وهناك دعم قوي له. حييث قامت شركة Unity Tech بإنشاء Unity وهو محرك تطوير ألعاب متعدد المنصات، ويسمح لك بإنشاء ألعاب ثلاثية الأبعاد وثنائية الأبعاد، وأيضًا إنشاء ألعاب الواقع الافتراضي والواقع المعزز. وبعد تعلم أساسيات Unity، ستحتاج إلى إتقان لغة برمجة C#، وهي تُستخدم لإنشاء السكربتات داخل Unity. وأيضًا بإمكانك استخدام لغة برمجة C# التابعة لشركة Microsoft لإنشاء تطبيقات الويب وتطبيقات الجوال والألعاب. وهي أسهل بكثير للتعلم من لغات البرمجة الأخرى مثل C++ أو C، وتُستخدم في Unity لتطوير الألعاب، ومن الضروري أن تأخذ في الاعتبار اكتساب الأساسيات الأساسية للغة، ولكن ذلك لا يعني أنك ستتقنها في 15 إلى 20 يومًا أو حتى شهر. وبخصوص التطوير ستحتاج إلى بيئة تطوير متكاملة (IDE) لتعلم وكتابة C#، وهناك بيئة تطوير متكاملة رسمية من Microsoft تُسمى Visual Studio Community، وهي مجانية للأبد وتتيح لك كتابة أكواد C# بشكل إفتراضي دون تثبيت أية إضافات. وضع في إعتبارك أن محرك مثل Unreal Engine يستخدم لغة C++، لذلك إذا كان لديك الوقت الكافي فأنصحك بتعلم C++ ثم C#.
  23. حاولي استخدام الأمر التالي: flutter config --android-sdk "path-to-your-android-sdk-path" واستبدلي "path-to-your-android-sdk-path" بالمسار إلى Android SDK في حاسوبك، أي مثلاً المسار قد يكون كالتالي لديك: flutter config --android-sdk "C:\Program Files (x86)\Android\android-sdk" ولتسهيل مهمة العثور على المسار: توجهي إلى Android Studio. توجهي إلى Tools في الإعدادات. اذهبي إلى SDK Manager. ستجدي مسار Android SDK. وإذا استمرت المشكلة تأكدي من تثبيت إًصدار Android SDK Build-Tools المطلوب وهو في الصورة مطلوب 33.2.0 وستجديه في الرابط التالي: https://androidsdkmanager.azurewebsites.net/Buildtools
  24. هناك جدول يسمى STUDENTS يحتوي على عدة أعمدة ومنها "Name" و "Marks" و "ID"، والمطلوب منك هو كتابة استعلام SQL لاسترجاع اسم أي طالب في الجدول الذي حصل على درجة أعلى من قيمة معينة (Marks). وترتيب النتائج يجب أن يكون وفقًا للثلاثة أحرف الأخيرة من كل اسم، فإذا كان هناك طلاب ينتهي اسمهم بنفس الثلاثة أحرف الأخيرة (مثل Bobby و Robby)، يتم ترتيبهم ثانويًا بناءً على قيمة ID بترتيب تصاعدي. وستحتاج إلى قراءة الجدول واستخدام استعلام SQL للقيام بالمطلوب، ومثال للجدول هو: ومثال للنتيجة: Ashley Julia Belvet وستجد جزء يوضح السبب والمنطق وراء النتائج التي تم استرجاعها من الاستعلام، لنفس الأسباب التي تم ذكرها في الشرح السابق، حيث تم تحديد أن هناك ثلاثة طلاب فقط (Ashley و Julia و Belvet) الذين حصلوا على درجات أعلى من 75، ثم تمت مقارنة الأحرف الثلاثة الأخيرة من أسمائهم و ترتيبهم وفقًا لذلك. Ashley تنتهي بـ 'ley' Julia تنتهي بـ 'lia' Belvet تنتهي بـ 'vet' وعند مقارنة هذه الثلاثة مقاطع أحرف، ستجد أنه لا يوجد تكرار للأحرف وأن 'ley' أصغر من 'lia' و'lia' أصغر من 'vet'. وبالتالي، تم ترتيب الأسماء وفقًا لذلك الترتيب.
  25. السبب هو أنك بحاجة إلى إنشاء موقع لكل شيء تقريبًا، فحتى تطبيقات الهاتف لها موقع رسمي على الإنترنت والإنترنت أساسه مواقع الويب، وأتت تطبيقات الهاتف لتسهيل مهمة استخدام الموقع عن طريق تحويله إلى هاتف أو إنشاء الموقع في هيئة تطبيق وبالطبع بتصميم مختلف لتسهيل عملية الاستخدام إلى أقصى حد ممكن. وأيضًا تطبيقات الهاتف في بعض الأحيان لا تستوعب الميزات التي قد يتحملها موقع، وأيضًا على الموقع تستطيع تصفح كم هائل من البيانات في وقت أقل وبشكل أفضل من تطبيقات الهاتف. وفيما يتعلق بالبرمجة، فدائمًا ما أنصح بتعلم مجال الويب أولاً إذا كنت لم تحدد مجالك بعد، لكونه يفتح لك الكثير من الخيارات سواء مطور واجهة أمامية أو خلفية وتتعلم منه الكثير من المهارات التي ستحتاجها عند تعلم أي مجال آخر بالتالي أنت الرابح في النهاية، وأيضًا أسهل نسبيًا من المجالات الأخرى مما يسهل عليك مهمة كسر الحاجز بينك وبين مجال البرمجة.
×
×
  • أضف...