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

Mustafa Suleiman

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

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

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

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

    305

أجوبة بواسطة Mustafa Suleiman

  1. السؤال الصحيح هو، هل لديك الوقت الكافي؟ 

    عليك بتحديد الوقت المتاح لك ثم التخطيط على أساسه، وأيضًا تحديد الدورات بناءًا على الهدف والمجال الذي تنوي التخصص به، فلو أردت التأسيس في مجال البرمجة بشكل جيد ولديك الوقت الكافي، فعليك بتعلم C++ أولاً لكن البعض قد يجدها صعبة ويصاب بالإحباط بدون داعي، ولذلك ستجد أغلب دورات أساسيات البرمجة تقوم بتدريس لغة بايثون لكونها لغة قوية وشائعة الاستخدام ومطلوبة وسهلة، أي أن الأمر راجع لك وتستطيع التجربة والحكم ولا مشكلة في ذلك أبدًا لكن بشرط المحاولة.

    وقد ذكرت أنك درست CS50 ولن تحتاج إلى أكثر من ذلك حاليًا في البداية، عليك فقط بإختيار لغة البرمجة الأولى لك والتمسك بها والتعمق فيها من خلال تنفيذ المشاريع بعد دراسة الأساسيات والتطبيق عليها، وإذا أردت دراسة جافاسكريبت كلغة برمجة أولى فلا مشكلة في ذلك، لكن الصحيح هو C أو C++ ثم بايثون ثم جافاسكريبت رغم أني أفضل C++ ثم بايثون ثم جافاسكريبت، هل أنا تعلمت بتلك الطريقة؟ 

    لا، الوقت لدي كان محدود، لذلك تعلمت أساسيات البرمجة من خلال بايثون لقلة الوقت لدي ولسهولة تعلم بايثون، ثم انتقلت إلى الواجهة الأمامية وتعمقت في جافاسكريبت، ثم تعلمت إطار خاص بالواجهة الأمامية وهو React ثم تعلمت الواجهة الخلفية من خلال node.js وذلك خلال فترة 6 أشهر وبمعدل 10 ساعات يوميًا وربما أكثر، فالأمر ليس بالهين أبدًا.

    وإذا أردت نصيحة واحدة فقط، ركز على الأساسيات ما استطعت وبشدة ثم طبق عليها بأكثر من مشروع حتى تشعر أنك استوعبتها تمامًا وأصبح الأمر سهل من خلال التكرار.

    وأنت لديك الوقت كما أظن، فتعلم بالطريقة الصحيحة كما أشرت لك، ثم انتقل للغة الخاصة بالمجال الذي تنوي التخصص به.

    • أعجبني 1
  2. أنت تتحدث عن بايثون وبها تُعرف كل من القوائم والصفوف باسم «المجموعات» وبالطبع هناك بعض الاختلافات الرئيسية:

    القوائم هي بنية بيانات قابلة للتغيير، مما يعني أنه باستطاعتك إضافة عناصر إليها أو حذفها أو تعديلها دون الحاجة إلى إنشاء قائمة جديدة، وتُستخدم القوائم لتخزين البيانات التي لا تحتاج إلى أن تكون مرتبة، مثل قائمة المهام أو قائمة التسوق.

    الصفوف هي بنية بيانات غير قابلة للتغيير، مما يعني أنه لا يمكنك إضافة عناصر إليها أو حذفها أو تعديلها دون إنشاء صف جديد، وتُستخدم الصفوف عادةً لتخزين البيانات التي تحتاج إلى أن تكون مرتبة، مثل قائمة الطلاب في الفصل الدراسي أو قائمة المنتجات في متجر.

    متى تستخدم القائمة؟

    عندما تحتاج إلى بنية بيانات قابلة للتغيير يمكن أن تحتوي على عناصر من أنواع مختلفة، أي مثل استخدام قائمة لتخزين قائمة المهام أو قائمة التسوق أو قائمة الطلاب في الفصل الدراسي أو قائمة المنتجات في متجر.

    متى تستخدم الصف؟

    في حال أنك تحتاج إلى بنية بيانات غير قابلة للتغيير يمكن أن تحتوي على عناصر من نوع واحد فقط، مثلاً صف لتخزين قائمة الطلاب في الفصل الدراسي أو قائمة المنتجات في متجر.

    وإليك بعض الأمثلة:

    # هذا مثال على قائمة تحتوي على أسماء الطلاب في الفصل الدراسي:
    students = ["John", "Mary", "Peter", "Susan"]
    
    # هذا مثال على صف يحتوي على علامات الطلاب في الفصل الدراسي:
    grades = [90, 80, 70, 60]
    
    # هذا مثال على كيفية إضافة عنصر إلى قائمة:
    students.append("Alice")
    
    # هذا مثال على كيفية حذف عنصر من قائمة:
    students.remove("Mary")
    
    # هذا مثال على كيفية تعديل عنصر في قائمة:
    students[0] = "Jane"
    
    # هذا مثال على كيفية إنشاء صف جديد من قائمة:
    grades_2 = list(grades)

     

    • أعجبني 1
  3. تلك نتيجة طبيعية لدراسة الدورة بالأسلوب الغير صحيح، وفي البداية ستحتاج إلى 3 أشهر على الأقل في حالة الدراسة بشكل يومي لإنهاء الدورة في حال كانت تلك لغة البرمجة الأولى لك، حيث سيتعين عليك المراجعة وإعادة بعض الدروس وإعادة تنفيذ بعض المشاريع بمفردك وخلافه، لكي تتمكن من تثبيت المعلومات.

    ولا مشكلة إذا استغرقت أكثر من ذلك، لكن يجب ثم يجب تحديد جدول زمني واقعي بناءًا على الوقت المتاح لك وبناءًا على تقديرك لنفسك وعلى المقدار الذي تستطيع استيعابه بشكل يومي، وخصص وقت لكتابة الكود والتدرب على ما تعلمته وليس مشاهدة الفيديوهات فقط.

    وعليك باستيعاب أنه يوجد ما يسمى بمنحنى النسيان  وهو مفهوم يستخدم في علم النفس لوصف طريقة تغير الذاكرة مع مرور الوقت، ويعني كيفية تلاشي الذكريات مع مرور الزمن وتقليل قدرة الفرد على استعادة المعلومات التي تم تخزينها في الذاكرة.

    في بداية تخزين المعلومات، يكون الاسترجاع سهلًا ودقيقًا، ولكن مع مرور الوقت، يتلاشى الاسترجاع ويصبح أصعب، ويشير منحنى النسيان إلى أن هناك فترة تتلاشى خلالها المعلومات بشكل سريع في البداية، ولكن مع مرور الوقت، يصبح معدل النسيان أقل وأقل، ويتم الحفاظ على الجوهر الأساسي للمعلومات المهمة.

    فبعد مرور يوم واحد من التعلم، هناك انخفاض في الاسترجاع الدقيق للمعلومات، ويعتمد مدى النسيان على عوامل مثل طبيعة المعلومات ومدى تكرارها وأهميتها بالنسبة للشخص تتراوح نسبة النسيان بعد مرور يوم واحد بين 20% إلى 40% من المعلومات.

    وبعد 3 أيام من 50% إلى 70% وبعد مرور أسبوع ترتفع النسبة إلى 70% وحتى 90%، وذلك في حال لم تقم بإعادة تكرار ما تعلمته وذلك من خلال تنفيذ مشاريع للتطبيق على ما تعلمته وتثبيت المعلومات واستخدام ما سبق وتعلم أمور جديدة.

    أي بعد التطبيق لأول مرة، من الأفضل أن تقوم بالتطبيق مرة أخرى بعد مرور أٍسبوع والأمر قد يبدوا ممل، لكن أنت مخير بين ذلك أو ألم نسيان المعلومات وضياع الوقت الذي استغرقته في ذلك، وعليك أيضًا التركيز على الفهم ثم الحفظ وكلاهما مطلوبان لكن الفهم أولاً فهو ما سيسمح لك بالبحث عن المعلومات واستخدامها حتى لو نسيتها، وستنسى بعض الأشياء بالطبع والجميع كذلك حتى من لديه سنوات خبرة، لكن بسبب الفهم والاستيعاب هو قادر على البحث واستخدام ما يريد مباشرًة.

    وستجد المزيد من التفصيل في النقاش التالي:

     

  4. بتاريخ الآن قال عمار عبد الهادي ميرزا:

    ارجو ان يكون بإمكانك توضيح كيفية وضع ال attribution لكل من 

    Google fonts و font awesome icons 

    Google Fonts

    •  استخدام Google Fonts مجانيًا ويتضمن العديد من الخطوط المميزة.
    • ولوضع ال attribution لـ Google Fonts، تستطيع إضافة نص صغير في صفحتك أو تطبيقك الذي يحتوي على الخط المستخدم.
    • وبإمكانك استخدام النص التالي كمثال لل attribution لخطوط Google Fonts: "Fonts by Google Fonts" أو "Powered by Google Fonts"، وأيضًا إضافة رابط لصفحة Google Fonts (https://fonts.google.com/) لتوجيه المستخدمين إلى المصدر الأصلي.

    Font Awesome Icons

    • مكتبة Font Awesome Icons مجانية أيضًا وتوفر مجموعة كبيرة من الأيقونات المتنوعة.
    • ويُفضل وضع attribution لـ Font Awesome Icons ولكنه ليس إلزاميًا.
    • باستطاعتك إضافة attribution في صفحة الاعتمادات أو صفحة الشكر في تطبيقك أو موقعك.
    • مثلاً استخدم النص التالي كمثال لل attribution لـ Font Awesome Icons: "Icons by Font Awesome" أو "Powered by Font Awesome"، أو إضافة رابط لصفحة Font Awesome (https://fontawesome.com/) للإشارة إلى المصدر الأصلي.
  5. نستخدم جملة SQL كالتالي للبحث عن الأسماء بجميع الأشكال الممكنة:

    SELECT * FROM table_name WHERE name LIKE '%محمد%' AND name LIKE '%فادي%' AND name LIKE '%عادل%' AND name LIKE '%جواريش%';

    أما إذا كنت تستخدم إطار عمل Laravel وتستخدم ORM Eloquent، فاستخدم الكود التالي:

    $results = DB::table('table_name')
        ->where('name', 'LIKE', '%محمد%')
        ->where('name', 'LIKE', '%فادي%')
        ->where('name', 'LIKE', '%عادل%')
        ->where('name', 'LIKE', '%جواريش%')
        ->get();

    وبالطبع نستبدل table_name بالاسم الصحيح للجدول الذي تحتوي عليه البيانات.

  6. السؤال متعلق بدورة تطوير واجهات المستخدم، لذلك أرجو منك التعليق أسفل فيديو الدورة المتعلق بالسؤال في التعليقات، وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة، ليتم مساعدتك بشكل أفضل.

  7. عليك بتعديل السطر الخاص بالاستيراد إلى التالي:

    from TaskController import TaskController

     وفي حال وجود مشكلة لديك في الدورة أرجو منك التعليق أسفل فيديو الدورة في التعليقات ليتم مساعدتك بشكل أفضل وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة.

  8. أنتي بحاجة إلى كتابة الباسورد الخاص بالنظام ولا مشكلة في حال لم يظهر لك الباسورد يكفي كتابته ثم الضغط على Enter وسيتم التحميل وتأكدي من جود إتصال إنترنت قبل تحميل بايثون.

    والطريقة الصحيحة لثبيت بايثون على نظام لينكس هي بتنفيذ الأوامر التالية:

    sudo apt update && sudo apt upgrade -y
    
    sudo apt install python3 python3-pip

    ثم تأكدي من تثبيت بايثون من خلال معرفة الإصدار بالأمر التالي:

    python3 --version 

     

  9. تختلف كمية ذاكرة الوصول العشوائي (RAM) التي يحتاجها التعدين من العملة الرقمية إلى أخرى أي حسب صعوبة تعدين العملية والمتبقي منها، فمثلاً يحتاج تعدين البيتكوين إلى ذاكرة وصول عشوائي بسعة 4 غيغابايت على الأقل، بينما يحتاج تعدين الإيثيريوم إلى ذاكرة وصول عشوائي بسعة 8 غيغابايت على الأقل وأنا أتحدث عن الحد الأدنى.

    ويستهلك تعدين العملات الرقمية كمية كبيرة من الطاقة، وذلك بسبب العمليات الحسابية المعقدة التي تتطلبها عملية التعدين، وتختلف كمية الطاقة التي يستهلكها التعدين من العملة الرقمية إلى أخرى، وذلك حسب خوارزمية التعدين المستخدمة، حيث يستهلك تعدين البيتكوين كمية كبيرة من الطاقة لكونه يعتمد على البطاقة الرسومية GPU بشكل كبير، بينما يستهلك تعدين الإيثيريوم كمية أقل من الطاقة.

    وبإمكانك حساب استهلاك الطاقة في تعدين العملات الرقمية باستخدام الصيغة التالية:

    استهلاك الطاقة = قوة الهاش (hash rate) * الجهد الكهربائي (voltage) * التيار الكهربائي (current)

    حيث:

    • قوة الهاش: هي عدد العمليات الحسابية التي يمكن أن يقوم بها الجهاز في الثانية الواحدة.
    • الجهد الكهربائي: هو مقدار الجهد الكهربائي الذي يتطلبه الجهاز لتشغيله.
    • التيار الكهربائي: هو مقدار التيار الكهربائي الذي يمر عبر الجهاز.

    ولحساب قوة الهاش استخدم أداة مثل Minerstat أو WhatToMine.

    بينما لحساب الجهد الكهربائي استخدم أداة مثل FurMark أو OCCT.

    وكذلك لحساب التيار الكهربائي استخدم أداة مثل HWMonitor أو AIDA64.

    وانتبه إلى أن استهلاك الطاقة في تعدين العملات الرقمية قد يصبح مرتفعًا جدًا، مما يؤدي إلى ارتفاع فاتورة الكهرباء، لذلك، من المهم اختيار جهاز التعدين الذي يتمتع بكفاءة عالية في استهلاك الطاقة.

    وأيضًا عليك بحساب الربح بعد خصم تلك المصاريف والفواتير، حيث أن كل بطاقة شاشة تستطيع تعدين عدد معين من العملات الرقمية ولها استهلاك طاقة معين ولها تكلفة إجمالية وهي سعر البطاقة، فعليك بحساب متى ستحصل على تكلفة الكرت ثم تبدأ في الحصول على الربح وأيضًا حساب تكلفة الكهرباء.

  10. لتغيير الألوان في منفذ الأوامر المتضمن في vscode عليك بالتواجه إلى الإعدادات من خلال الضغط على CTRL + ,  أو من خلال file ثم Preferences ثم Settings.

    والآن ابحث عن workbench color في شريط البحث في الإعدادات، وستجد أنه ظهر لك خيار باسم  Edit in settings.json اضغط عليه كالتالي:

    2023-07-18_11-04-00.thumb.png.ad78e9d9d9a93f03832415c92dea96b1.png

    ثم ستجد خاصية باسم workbench.colorCustomizations فقم بإضافة الكود التالي بها:

    "workbench.colorCustomizations": {
        "terminal.background":"#131212",
        "terminal.foreground":"#dddad6",
        "terminal.ansiBlack":"#1D2021",
        "terminal.ansiBrightBlack":"#665C54",
        "terminal.ansiBrightBlue":"#0D6678",
        "terminal.ansiBrightCyan":"#8BA59B",
        "terminal.ansiBrightGreen":"#237e02",
        "terminal.ansiBrightMagenta":"#8F4673",
        "terminal.ansiBrightRed":"#FB543F",
        "terminal.ansiBrightWhite":"#FDF4C1",
        "terminal.ansiBrightYellow":"#FAC03B",
        "terminal.ansiBlue":"#00a1f9",
        "terminal.ansiCyan":"#8BA59B",
        "terminal.ansiGreen":"#95C085",
        "terminal.ansiMagenta":"#8F4673",
        "terminal.ansiRed":"#FB543F",
        "terminal.ansiWhite":"#A89984",
        "terminal.ansiYellow":"#FAC03B"
    },

    وذلك سيقوم بتخصيص الألوان في منفذ الأوامر، وأهم خاصيتين هما background للون الخلفية وforeground من أجل لون النص.

    ولا تنسى حفظ التغييرات بالضغط على CTRL + S

  11. بتاريخ 16 ساعة قال صابر مغترب:

    استاذي الفاضل معذرتا كون انني لم يسبق لي معرفة بهذا اللغة ولكن توضيح عندي قاعده بيانات بالاكسس وعامل جدول WebCode فيه الشفرة الاتي 


    <style>
    *{box-sizing:border-box;font-size:18px}
    .card{margin:10px auto;padding:10px;width:100%;}
    .card th{height:40px;}

    table{width:100%;border:1px gray solid;border-collapse:collapse;overflow-y:hidden;}

    th,td{padding: 4px 8px;border:1px #ccc solid;height:40px}

    td span{padding:0 8px;background:orange;color:white;font-size:14px;}
       
    table { background-color:#E8F8F0; color:black; text-align: center;}


    th{background:#146356; color:white;}
    </style>

    عندي نموذج بالاكسس فية WebBrowser2 لعرض البيانات من جدول بالاكسس 

    مثلا عندي العنوان اسم الصنف رقم الصنف في الاعلي تظهر بس عندما تحريك عجلة الموس او مفاتيح الكيبورد اعلا واسفل يختفي عناوي الجدول بالمستغرض  ان شاء الله اكون اوصلت لك الشرح بطريقه افضل

    تحياتي استاذي

    استاذ ي الفاضل اعتقد انك فهمتني والمعذره كوني مبتدي معاكم لم اوضح بشكل افضل فشرحت لاستاذنا Mustafa Suleiman ما اريده ياليت توضح لي كيف العمل لذالك اليك المثال العنوانين براس الصفحه اريدها ثابته حفظك الله استاذي

    عنوان الجدول.rar 78.5 kB · 0 تنزيلات عنوان الجدول.accdb 1.32 MB · 0 تنزيلات

    أرجو توضيح ما تريده من خلال صورة أو فيديو لفهم سبب المشكلة ، وما فهمته أنك تريد تثبيت عنوان الجدول بناءًا على الكود الذي وضحته، ونستخدم خاصية position بقيمة sticky من أجل ذلك كالتالي:

    th {
      position: sticky;
      top: 0;
      background: #146356;
      color: white;
    }

     

  12. لغة جافاسكريبت هي لغة خاصة بالواجهة الأمامية في المقام الأول وليست خاصة بالواجهة الخلفية على وجه الخصوص، لكونها لغة تعمل في المتصفح، لكن من خلال بيئة عمل node.js تستطيع استخدامها في الواجهة الخلفية.

    وبالطبع ستواجه صعوبة في البداية وخصوصًا أول شهر أو شهرين حسوب مستواك في البرمجة، وعليك بالتركيز على تعلم وإتقان لغة برمجة واحدة في البداية، والتركيز على الأساسيات بشدة ثم التطبيق عليها بأكثر من مشروع وزد مستوى الصعوبة تدريجيًا.

    وبخصوص المسألة البرمجية فحلها بأبسط شكل هو كالتالي:

    function getEvenNumbers(numbers) {
      return numbers.filter(number => number % 2 === 0);
    }

    حيث تستقبل الدالة مصفوفة من الأرقام كمدخل وتقوم بإرجاع مصفوفة جديدة تحتوي فقط على الأعداد الزوجية، وتستخدم الدالة filter لتصفية المصفوفة الأصلية بناءًا على شرط التحقق من أن العدد يمكن قسمته على 2 بدون باقي، مما يعني أن العدد زوجي أي كالتالي:

    function getEvenNumbers(numbers) {
      return numbers.filter(number => number % 2 === 0);
    }
    
    
    const numbers = [1, 2, 3, 4, 5, 6];
    const evenNumbers = getEvenNumbers(numbers);
    console.log(evenNumbers); // ستقوم بطباعة [2, 4, 6] في وحدة التحكم

    مقالات ودروس جافاسكريبت في أكاديمية حسوب

    • أعجبني 1
  13. عليك بالتسجيل في مستقل وخمسات وتقديم إثبات للهوية من أجل تفعيل حسابك، ثم إنشاء معرض أعمال إحترافي ومتخصص، بمعنى أنه يجب وجود تناسق أو ثيم في طريقة العرض لكون مجالك فني بالأساس، وأيضًا متخصص أي لا يحتوي على نماذج لأعمال غير المجال الذي تريد العمل به، فذلك يؤدي إلى نتيجة عكسية ويظهر أنك غير محترف وليس على دراية بما تقوم به.

    حيث أن العملاء في مجال العمل الحر يبحثون عن الشخص المتمكن والمتميز في مجاله بسبب وجود أزمة ثقة في أن المستقل قادر على تنفيذ العمل أم لا، وأيضًا البعض يبحثون السعر الأقل ومن ينفذ لهم كل شيء تقريبًا وبسعر قليل فعليك بإختيار عملائك لتتجنب المشاكل، وفي البداية قد تقدم تضحيات من أجل الحصول على أول مشروع وتقييم.

    وعليك بمعرفة طريقة كتابة وتقديم عرض جيد ومناسب للقيمة التي ستوفرها للعميل أي لا تبالغ في السعر ولا في العرض الذي ستقدمه، وأنصحك بقراءة التالي:

     

  14. عليك بتعلم الأنماط الهامة أولاً، ففي مشاريع PHP ولارافيل (Laravel)، هناك العديد من أنماط التصميم (Design Patterns) وهي بالترتيب:

    Model-View-Controller (MVC)

    هو نمط تصميم شائع ومفيد في تطوير تطبيقات الويب، ويهدف إلى فصل الأجزاء المختلفة من التطبيق وتنظيمها بشكل منهجي، ولارافيل إطار عمل يعتمد على نمط MVC، حيث يوفر هيكلًا MVC مسبقًا يمكنك استخدامه لتنظيم تطبيقك.

    Dependency Injection (DI)

    يهدف إلى تقليل الاعتمادية الزائدة على الكائنات وتعزيز إعادة استخدامها واختبارها بسهولة، وفي لارافيل، تستطيع استخدام حاويات الحقن (Containers) لتنفيذ Dependency Injection وإدارة تبعيات الكائنات.

    Repository

    نمط Repository يوفر واجهة للتعامل مع البيانات، ويتم استخدامه لفصل طبقة البيانات عن طبقة الأعمال (Business Layer)، وبإمكانك استخدام ذلك النمط في لارافيل للتفاعل مع قواعد البيانات وتنفيذ العمليات المتعلقة بالبيانات.

    Singleton

    نمط Singleton يهدف إلى ضمان أن يتم إنشاء كائن واحد فقط من فئة معينة وتوفير نقطة وصول عامة إليه، وتستطيع الإعتماد عليه في لارافيل لإنشاء مكونات مشتركة في التطبيق التي تحتاج إلى مشاركة بيانات وحالة بين عدة أجزاء من التطبيق.

    وإذا أردت قراءة كتابة فأنصحك بقراءة Head First design patterns.

     

    • أعجبني 1
    • شكرًا 1
  15. لا داعي للقلق من فك الغطاء الخلفي للاب توب، فهو مخصص لذلك، وفي أجهزة اللاب توب الحديثة الأمر سهل لكن في الموديلات القديمة أصعب قليلاً، وفي بعض الأحيان قد تجد منفذ مخصص للرامات أي عليك فك الجزء الصغير المخصص لها وليس كامل الضهر من أجل إضافة قطعة رامات جديدة.

    ولمعرفة ذلك أنصحك بالبحث عن Disassembly ثم اكتب بجانبها اسم الموديل الخاص بجهازك وستجد على اليوتيوب فيديو يوضح طريقة فتح الجهاز لصيانته.

    وبخصوص الشركات التي أنصحك بشراء الرامات منها فهى Crucial ثم Kingston ثم Corsair وأيضًا G.SKILL ولدينا Samsung، والأمر يعتمد على الميزانية الخاص بك قم بتحديد الميزانية ثم ابحث عن المتاح من ضمن السابق ذكرهم.

  16. بالطبع لا، لكن عليك بتعلم أساسيات التصميم الجيد لواجهات المستخدم مثل إختيار الألوان والمسافات والخطوط وتحديد التصميم بناءًا على مستخدمي الموقع وهوية الشركة المالكة للموقع والتناسق بين عناصر التصميم visual hierarchy.

    ثم تعلم أيضًا أداة تصميم مناسبة مثل Figma وهي الأفضل الآن بلا منازع وستسهل عليك الكثير من الأمور لكن في البداية ستحتاج وقت لتعلمها.

    أما بخصوص التصميم نفسه فتستطيع مشاهدة عدة تصماميم من موقع توفر تصماميم جاهزة للمواقع ثم محاولة التقليد ونسخ ما نال إعاجبك ثم تكوين تصميم مختلف، وقد تم ذكر تلك المواقع هنا:

    ومع الوقت ستتحسن بلا شك وستصبح قادر على تنفيذ تصاميم جيدة لكونك استوعبت القواعد وما يجب فعله وما لا يجب فعله، وأنصحك بالتعلم في البداية من القنوات التالية على اليوتيوب:

     

  17. تستطيع حل المشكلة والسماح بتشغيل السكريبتات في PowerShell عن طريق الأمر التالي:

    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

    ثم قم بإعادة تشغيل طرفية PowerShell وأعد تنفيذ الأوامر التي كنت تقوم بها مرة أخرى.

    وفي حال أنك تريد التعامل مع منفذ أوامر أسهل من PowerShell وتجنب التعقيدات الخاصة بتلك الطرفيات والأوامر المختلفة بها، فأنصحك باستخدام CMD وهي طرفية Command prompt.

    وتستطيع تشغيلها عن طريق البحث عن CMD في شريط البحث بالأسفل في الويندوز.

    وبإمكانك تشغيل الطرفية في مسار المشروع مباشرًة من خلال كتابة cmd في شريط العنوان ثم اضغط على Enter كالتالي:

    cmd.thumb.png.70995f32cf20551fd224e878ca507b2b.png

  18. تحتاج إلى تنفيذ طريقة onPostExecute في Compressvedio لتنفيذ الإجراءات المطلوبة بعد الانتهاء من ضغط الفيديوK ,إضافة رمز الإرسال إلى السيرفر في تلك الطريقة.

    تحتاج أيضًا إلى تمرير المسار الذي تم ضغطه للدالة Compressvedio().execute() في onActivityResult()، وأنت تمرر file.getPath() ولكن ذلك غير صحيح، فيجب عليك تمرير مسار الملف الذي تم ضغطه من خلال vediopath في doInBackground().

    أي في onActivityResult(): قم بتعيين vediopath إلى القيمة المسترجعة من Compressvedio().execute() بدلاً من file.getPath().

    قبل التعديل:

    new Compressvedio().execute("false", videoUri.toString(), file.getPath());

    بعد التعديل:

    new Compressvedio().execute("false", videoUri.toString(), vediopath);

    وفي Compressvedio، قم بتنفيذ الإجراءات اللازمة بعد الانتهاء من ضغط الفيديو داخل onPostExecute().

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        dialogo.dismiss();
    
        // Get the compressed video file.
        File filea = new File(s);
    
        // Get the file size in kilobytes.
        float size2 = filea.length() / 1024f;
    
        // Log the file size.
        Log.d("sizs", String.format("Size : %.2f kB", size2));
    
        // Set the display name of the compressed video file.
        displayName = String.valueOf(Calendar.getInstance().getTimeInMillis() + ".mp4");
    
        // Perform further actions here, such as uploading the compressed video to the server.
    }

    وتأكد من إضافة الكود اللازم لرفع الملف المضغوط إلى السيرفر في المكان المناسب داخل onPostExecute().

  19. الدورة الأقرب لمجال الذكاء الاصطناعي في أكاديمية حسوب هي دورة بايثون، حيث أنك ستحتاج إلى تعلم بايثون بلا شك إذا أردت التخصص في مجال الذكاء الاصطناعي وأيضًا يوجد بالدورة مسار خاص بـ أساسيات تعلم الآلة Machine Learning وأيضًا مسار خاص بـ تحليل البيانات.

    وربما لديك تساؤل حول أهمية تعلم الرياضيات في مجال الذكاء الاصطناعي، ووببساطة ما أنت بحاجة إليه في البداية هو التالي:

    • الرياضيات المهمة لتعلم الآلة هي الجبر الخطي والاحتمالات والتفاضل والتكامل (Calculus).
    • في الجبر الخطي، يجب فهم المفاهيم الأساسية مثل الأشعة والفضاء الشعاعي والاستقلال والارتباط الخطي والأشعة الأساسية والقيم الذاتية.
    • في الاحتمالات، يجب معرفة القوانين الأساسية والتوزيعات الشهيرة.
    • في التفاضل والتكامل، يكفي فهم مفاهيم المشتقات، والتكامل غير مهم في البداية.
    • يجب فهم الأساسيات في هذه المجالات معًا، وعدم التركيز على مجال واحد فقط.
    • الرياضيات مهمة لفهم شبكات العصبونات، حيث يمكن تصور الشبكة كتابع يحول الإدخال في فضاء شعاعي بواسطة العمليات الخطية والغير خطية.
    • تدريب الشبكات يعتمد على خوارزمية gradient descent التي تتطلب فهمًا أساسيًا للتفاضل والتكامل.
    • لا يجب التعمق العميق في الرياضيات قبل بدء تعلم الآلة، ويجب التركيز على الأساسيات فقط.
    • يمكن توسيع فهم الرياضيات عند الحاجة، ولا يجب محاولة تعلم كل شيء في الرياضيات بسبب واسعها.
    • الرياضيات المتقطعة ليست ضرورية في شبكات العصبونات، حيث يجب أن تكون الشبكات تابعة مستمرة وتعامل مع التوابع المستمرة والمشتقات.

    وبعد ذلك ستحتاج إلى دورة متخصصة في الذكاء الاصطناعي وأغلبها باللغة الإنجليزية، على منصات مثل Udemy وCoursera. 

    وأنصحك بالبحث عن machine learning course  على اليوتيوب وستجد بعض الدورات المفيدة ومنها دورة باللغة العربية.

  20. أولاً عليك باستيعاب أن الخطاف (Hooks) هي ميزة جديدة في React التي تم إدخالها في إصدار React 16.8، وتسمح الـ Hooks بكتابة وإعادة استخدام الحالة والعمليات الجانبية (side effects) في الـ function components بطريقة أكثر بساطة وسهولة مقارنةً بالـ class components.

    وفيما يلي بعض الفوائد التي يوفرها الخطاف مقارنةً بالـ class components:

    1. يتطلب الخطاف أقل كود وصيانة مقارنةً بالـ class components، وتستطيع الإعتماد على الخطافات مباشرة داخل الـ function components دون الحاجة إلى إنشاء فئة منفصلة.
    2.  يوفر استخدام الحالة المحلية (local state) بشكل مباشر في الـ function components باستخدام useState، مما يجعل إنشاء وتحديث الحالة أكثر بساطة.
    3. بإمكانك استخدام الخطاف useEffect للقيام بالعمليات الجانبية مثل الاشتراك في حدث أو إصدار طلب إلى الخادم أو التعامل مع القائمة أو الوقت. يجعل الخطاف من السهل إضافة وإزالة العمليات الجانبية وتتبعها بشكل أفضل.
    4. كتابة الخطافات وإعادة استخدامها في مكوناتك المختلفة، مما يسهل إدارة وصيانة الكود.
    5.  في بعض الحالات، يوفر الخطاف أداءًا أفضل مقارنةً بالـ class components، حيث يتم تحسين أداء الخطافات بشكل مستمر في تحديثات React.

    وإليك شرح للخطافات التي ذكرتها:

    useState

    يسمح لك خطاف useState بإدارة الحالة في مكون وظيفي. يعيد متغير حالة ودالة تحديث.

    أي في حال لديك مكون يعرض عددًا، يمكنك استخدام خطاف useState لإنشاء متغير حالة يسمى count، بعد ذلك استخدم الدالة setCount لتحديث قيمة المتغير.

    const [count, setCount] = useState(0);

    useEffect

    يسمح لك خطاف useEffect بتنفيذ تأثيرات جانبية في مكون وظيفي، مثل استدعاءات API، أو الاشتراكات، أو المؤقتات.

    مثلاً لدينا مكون يعرض قائمة بالعناصر، هنا نعتمد على  خطاف useEffect لاستدعاء استدعاء API لتحميل العناصر.

    useEffect(() => {
      // Make an API call to load the items
    }, []);

    ولاحظ أن المصفوفة تعني أنه لا يوجد إعتماديات، بالتالي يتم تشغيل الخطاف مرة واحدة في بداية الـ Rendering للمكون.

    useRef

    يتيح لك خطاف useRef الوصول إلى قيمة قابلة للتغيير من داخل مكون وظيفي، والقيمة قابلة للتغيير هي أي شيء مثل عنصر DOM أو وظيفة.

    أي في حال لدينا مكون يحتاج إلى الوصول إلى عنصر DOM، نستخدم خطاف useRef لإنشاء إشارة إلى العنصر.

    const myRef = useRef();

    useCallback

    يسمح لك خطاف useCallback بإنشاء وظيفة مؤقتة، وهي مفيدة لتحسين الأداء عندما يكون لديك دالة تعتمد على المتغيرات التي تتغير كثيرًا.

    مثال: لدينا مكون يحتوي على دالة تعتمد على متغير count، هنا نستخدم خطاف useCallback لإنشاء وظيفة مؤقتة لن تتغير عندما تتغير قيمة count.

    const myCallback = useCallback(() => {
      // This function will not be re-evaluated when `count` changes
    }, [count]);

    useMemo

    خطاف آخر وهو useMemo لإنشاء قيمة مؤقتة، لتحسين الأداء أيضًا عندما يكون لديك قيمة تعتمد على المتغيرات التي تتغير كثيرًا.

    const myValue = useMemo(() => {
      // This value will not be re-evaluated when `count` changes
    }, [count]);

    وكلا الخطافات، useCallback و useMemo، تستطيع استخدامهما لتحسين الأداء عن طريق تجنب إعادة تقييم الدالة، ولكن هناك بعض الاختلافات الرئيسية بين هاتين الخطافين:

    useCallback تستخدم لمنع إعادة تقييم الدالة عندما تتغير المدخلات، أي إذا كان لديك دالة تعتمد على متغير، اعتمد على useCallback لإنشاء نسخة من الدالة لن تتغير عندما تتغير قيمة المتغير.

    أما useMemo تستخدم لمنع إعادة تقييم القيمة عندما تتغير المدخلات، ففي حال كان لديك وظيفة تعتمد على متغير، تستطيع استخدام useMemo لإنشاء نسخة من القيمة لن تتغير عندما تتغير قيمة المتغير.

    useContext

    يسمح لك خطاف useContext بالوصول إلى سياق من مكون وظيفي، بمعنى أي شيء مثل سياق البيانات أو سياق الحالة.

    مثلاً عندما تحتاج إلى الوصول إلى سياق البيانات، استخدم خطاف useContext للوصول إلى السياق.

    const myData = useContext(MyDataContext);

    useReducer

    يسمح لك خطاف useReducer بإدارة حالة معقدة في مكون وظيفي، حيث يستخدم خطاف useReducer دالة مخفضة لتحديث الحالة.

    أي عندما تحتاج إلى إدارة حالة تحتوي على قائمة من العناصر، اعتمد على خطاف useReducer لإنشاء متغير حالة يحتوي على قائمة من العناصر.

    const [state, dispatch] = useReducer(reducer, initialState);
  21. forEach، map، filter، و reduce ببساطة هي وظائف تُستخدم لتكرار عناصر المصفوفة، والفرق الرئيسي بينها هو ما تفعله بالعناصر أثناء التكرار.

    • forEach يتكرر عبر جميع عناصر المصفوفة ويؤدي الوظيفة المحددة إلى كل منها.
    • map يتكرر عبر جميع عناصر المصفوفة ويعيد مصفوفة جديدة تحتوي على ناتج تطبيق الوظيفة المحددة على كل عنصر.
    • filter يتكرر عبر جميع عناصر المصفوفة ويعيد مصفوفة جديدة تحتوي فقط على العناصر التي تفي بشرط معين.
    • reduce يتكرر عبر جميع عناصر المصفوفة ويجمعها معًا لإنشاء قيمة واحدة.

    وإليك مثال على استخدام كل وظيفة:

    const numbers = [1, 2, 3, 4, 5];
    
    // forEach
    numbers.forEach(number => console.log(number));
    
    // map
    const doubledNumbers = numbers.map(number => number * 2);
    console.log(doubledNumbers); // [2, 4, 6, 8, 10]
    
    // filter
    const evenNumbers = numbers.filter(number => number % 2 === 0);
    console.log(evenNumbers); // [2, 4, 6]
    
    // reduce
    const sumOfNumbers = numbers.reduce((a, b) => a + b, 0);
    console.log(sumOfNumbers); // 15

    for loop و while loop هي أيضًا وظائف تُستخدم لتكرار العناصر، ولكن الفرق الرئيسي بينها هو أن for loop يحدد عدد المرات التي يجب تكرار فيها الـ loop، بينما while loop يستمر في التكرار حتى يتم استيفاء شرط معين.

    // for loop
    for (let i = 0; i < 5; i++) {
      console.log(i);
    }
    
    // while loop
    let i = 0;
    while (i < 5) {
      console.log(i);
      i++;
    }

    لاحظ أن في for نقوم بالتكرار حتى وصول قيمة i رقم أقل من 5 ونستطيع تعديل تلك القيمة، بمعنى أن عدد مرات التكرار معروفة لدينا.

    بينما في while لاحظ أن الحلقة تستمر في التكرار في حال الشرط ما زال صحيحًا أي تُستخدم حلقة while عندما لا تعرف عدد المرات التي يجب تكرار فيها التعليمات.

    أي أن forEach، map، filter، و reduce هي وظائف أكثر تعقيدًا من for loop و while loop، ونستخدمها لكتابة كود أكثر كفاءة  وقابلية للقراءة.

     

  22. بالطبع، فإذا أردت أن تصبح مطور واجهة خلفية Back-End فسيتعين عليك إنشاء الواجهات البرمجية API، وإعداد الخادم لاستقبال طلبات CRUD.

    ولا مشكلة إذا واجهت صعوبة في البداية، فتلك هي طبيعة مجال البرمجة وسيسهل عليك الأمر لاحقًا مع التكرار وإعادة كتابة الكود، وتستطيع البحث ثم السؤال عن أي شيء تريد فهمه أو توضيح له.

    أما إذا كنت تريد التخصص بالواجهة الأمامية، فتستطيع الإكتفاء بالمفهوم العام والتعرف على طبيعة عمل الخادم والـ API من أجل يكون لديك دراية على ما يجري بالخلفية، حيث أنك ترسل وتستقبل بيانات من الـ API في الواجهة الأمامية.

    وأنصحك بالإطلاع على التالي:

     

  23. الموقع سرعته جيدة ولا مشكلة في تصفحه، وأرى أنك تستخدم Blogger وهنا لا تتوفر الإضافات المخصصة لتهيئة الموقع مثل ووردبريس، ولكن هناك بعض الأمور التي يمكنك القيام بها وهي:

    • استخدم قالبًا سريعً فبعض القوالب أسرع من غيرها، لذا من المهم اختيار قالب سريع إذا كنت تريد تحسين سرعة موقعك.
    • قم بضغط الصور حيث الصور هي أحد أكبر العوامل التي تؤثر على سرعة موقعك، ويمكنك ضغط الصور لتقليل حجمها دون التأثير على جودتها من خلال صيغة webP.
    • تجنب استخدام الكثير من JavaScript وCSS. JavaScript وCSS فقد تبطئ موقعك إذا تم استخدامها بكثرة، حاول تقليل استخدامهما قدر الإمكان.
    • تخزين الصور في ذاكرة التخزين المؤقت (الكاش) فتخزين الصور في ذاكرة التخزين المؤقت يساعد في تحسين سرعة موقعك عن طريق تقليل عدد المرات التي يحتاج فيها المتصفح إلى تحميل الصور, كالتالي:

    اختر القالب لديك ثم اضغط على Edit HTML، ثم ابحث عن عنصر   <head> وبداخله أضف الكود التالي:

    <include expiration='7d' path='/assets/**.css'/> 
    <include expiration='7d' path='/assets/**.js'/> 
    <include expiration='3d' path='/assets/**.gif'/>
    <include expiration='3d' path='/assets/**.jpeg'/>
    <include expiration='3d' path='/assets/**.jpg'/>
    <include expiration='3d' path='/assets/**.png'/>
    • استخدم شبكة توصيل المحتوى (CDN). مثل كلاود فلير وهي مجموعة من الخوادم موزعة في جميع أنحاء العالم، ويساعد ذلك في تحسين سرعة موقعك عن طريق تحميل الصور من الخادم الأقرب إلى الزائر.

     

    • شكرًا 1
  24. الأعداد العقدية تعني أعداد يمكن تمثيلها على شكل a + bi، حيث a و b هما عددان حقيقيان و i هو جذر الوحدة، والأعداد العقدية لها العديد من التطبيقات في الرياضيات والعلوم، ربما الأمر مبهم بعض الشيء لذلك إليك بعض الأمثلة على كيفية استخدام الأعداد العقدية في الرياضيات والعلوم:

    • الهندسة: نستخدمها لتمثيل النقاط في المستوى المعقد، كتمثيل النقطة (1، 2) على المستوى المعقد على شكل 1 + 2i.
    • التحليل: لتمثيل الدوال والتكاملات، مثل تمثيل دالة الأس x^2 + 1 على شكل (x + i)^2 + 1.
    • الهندسة التحليلية: لتمثيل الخطوط والمنحنيات، حيث يمكن تمثيل الخط y = x على شكل x + iy = 1.
    • الجبر الخطي: لتمثيل المصفوفات والتحويلات الخطية، من أجل تمثيل المصفوفة [1 2; 3 4] على شكل 1 + 2i 3 + 4i.
    • نظرية الأعداد: لدراسة الأعداد الصحيحة والنسبية، كإثبات أن عدد الأعداد الصحيحة الموجبة التي هي أيضًا أعداد أولية زوجية هو عدد محدود باستخدام الأعداد العقدية.
    • الفيزياء: لتمثيل الموجات والمجالات الكهرومغناطيسية، فيمكننا تمثيل موجة الضوء على شكل سينوسيود مع تردد وسعة معينين.
    • الهندسة الكهربائية: لتصميم الدوائر الكهربائية، فيمكن استخدام الأعداد العقدية لحساب التيار في دائرة كهربائية.
    • الاتصالات: لتصميم أنظمة الاتصالات، من أجل تشفير الإشارات في الاتصالات السلكية واللاسلكية.
    • الكيمياء: يمكن استخدام الأعداد العقدية لدراسة التفاعلات الكيميائية لحساب طاقة التفاعل الكيميائي.
    • العلوم المالية: لدراسة الأسواق المالية وحساب مخاطر الاستثمار.
    • أعجبني 2
  25. بتاريخ 12 ساعة قال Eman Salha:


    FAILURE: Build failed with an exception.

    * What went wrong:
    Execution failed for task ':app:validateSigningDebug'.
    > java.util.concurrent.ExecutionException: com.android.builder.utils.SynchronizedFile$ActionExecutionException: java.io.IOException: com.android.ide.common.signing.KeytoolException: Failed to create keystore.

    * Try:
    > Run with --stacktrace option to get the stack trace.
    > Run with --info or --debug option to get more log output.
    > Run with --scan to get full insights.

    * Get more help at https://help.gradle.org

    BUILD FAILED in 30s
    Exception: Gradle task assembleDebug failed with exit code 1

    حد يعرف يحل هذا الايرور

    هل تعملين على مشروع Flutter؟ على أي حال هناك مشكلة في إنشاء مخزن مفاتيح Keystore وتستطيعي إضافة المفتاح من خلال الأمر التالي:

    keytool -genkey -v -keystore debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000

    وفي حال كنتي تعملين على مشروع Flutter فعليك بتنفيذ الأمر التالي:

    flutter upgrade 

    أيضًا تأكدي من تحديث أدوات Android SDK:

    1. افتحي Android Studio.
    2. انقري على قائمة "Tools ".
    3. اختاري "Android" ثم"SDK Manager.".
    4. في علامة التبويب "SDK Platforms"، تأكدي من تثبيت أحدث إصدار من Android SDK.
    5. في علامة التبويب " SDK Tools"، تأكدي من تثبيت أحدث إصدارات أدوات Android SDK.
    6. انقري فوق الزر "Apply".

    والآن عليك بتنفيذ الأمر التالي:

    flutter clean

    ثم تشغيل المشروع.

    وإذا استمرت المشكلة، حاولي تنفيذ أمر flutter doctor من أجل تفقد الأخطاء في المشروع.

×
×
  • أضف...