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

Mustafa Suleiman

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

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

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

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

    305

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

  1.  أنا بحاجة لتفقد وإختبار الموقع من خلال أدوات المطور أو يمكنك القيام أنت بذلك، قم بتحديد حالة hover من خلال أدوات المطور لعناصر القائمة ثم تفقد الجزء الذي يظهر أسفل الـ navbar من أين يأتي.

    وأيضًا لاحظت أنه عند التمرير للأسفل يتم تغطية الـ navbar بخلفية زرقاء، هل تقصد ذلك؟ من الأفضل إعطائه قيمة z-index أعلى لتجنب ذلك.

  2. أنت تريد استخراج اسم النظام من نتيجة Nmap، صحيح؟

    عليك بالبحث عن حقل "OS" في الإخراج وستجد اسم النظام، وإليك مثال لنتيجة لـ Nmap:

    Nmap scan report for 127.0.0.1
    Host is up (0.00012s latency).
    Not shown: 998 closed ports
    PORT    STATE SERVICE
    22/tcp  open  ssh
    80/tcp  open  http
    
    Host: 127.0.0.1 (localhost)
    OS: Microsoft Windows 10 (10.0 Build 19041)
    Aggressive OS guesses:
      Microsoft Windows 10 (10.0 Build 19041)

    اسم النظام هو "Microsoft Windows 10 (10.0 Build 19041)".

    ولاستخراج تلك القيمة، استخدم الأمر التالي:

    nmap 127.0.0.1 | grep OS

    تستطيع أيضًا استخدام الأمر التالي لاستخراج اسم النظام والمعلومات الأخرى حول المضيف المستهدف:

    nmap -O 127.0.0.1

    والنتيجة هي إخراج المعلومات التالية:

    Host: 127.0.0.1 (localhost)
    OS: Microsoft Windows 10 (10.0 Build 19041)
    Aggressive OS guesses:
    Microsoft Windows 10 (10.0 Build 19041)

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

    وTTL هي قيمة يتم تعيينها من قبل مرسل الحزمة وتُستخدم لتحديد عدد أجهزة التوجيه التي يمكن للحزمة المرور عبرها قبل رفضها، والقيمة الافتراضية لـ TTL لأنظمة Linux و Unix هي 64، بينما القيمة الافتراضية لـ TTL لأنظمة Windows هي 128.

    وإليك القيم:

    • Linux/Unix -  64
    • Windows - 128
    • AIX  - 255
    • BSD - 255
    • Solaris - 255

     

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

  4. أنت بحاجة إلى تعلم لغة برمجة أولاً تؤهلك لتطوير تطبيقات الأندرويد، وحاليًا يوجد لغتي جافا وكوتلن لتطوير تطبيقات Native.

    أما إذا أردت تعلم إطار عمل من أجل تطوير تطبيق يعمل على الأندرويد و iOS، فأمامك إطار Flutter ولغة البرمجة الخاصة به هي Dart وأيضًا يوجد React Native ولغة البرمجة الخاصة به هي جافاسكريبت.

    لذلك عليك بتحديد ما تريده، ثم البدء في التعلم وأنصحك قبل ذلك بقراءة التالي:

    ويوجد في أكاديمية حسوب دورة تطوير تطبيقات باستخدام جافاسكريبت وبها مسار كامل لتطوير تطبيقات الهاتف باستخدام React Native.

    • شكرًا 1
  5. بالطبع فدورة بايثون شاملة، فلو بحثت عن متطلبات وظيفة python developer أو back-end بلغة بايثون على LinkedIn مثلاً ستجد أن الدورة تغطي تلك المتطلبات.

    وخلال الدورة ستقوم بإنشاء مشاريع حقيقية لوضعها بمعرض أعمالك وليست مجرد نماذج.

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

     

  6. المشكلة هي أنك تحاول تحميل صورة لمستخدم جديد باستخدام اسم المستخدم كاسم الملف في Firebase Storage وتحميل الصورة قبل أن يتم إنشاء المستخدم في Firebase Authentication.

    أي أن السطر التالي في ملف Register.jsx هو السبب في حدوث الخطأ:

    const storageRef = ref(storage, displayName);

    وعند تشغيل ذلك السطر، يتم البحث عن مجلد أو ملف باسم المستخدم (displayName) في Firebase Storage، ولكن بما أن المستخدم لم يتم إنشاؤه بعد (إذ لم يتم إنجاز عملية createUserWithEmailAndPassword بنجاح)، فإن Firebase يقوم بإرجاع خطأ بسبب عدم وجود المستخدم.

    لذلك حاول تأجيل عملية تحميل الصورة حتى يتم إنشاء المستخدم بنجاح، عن طريق تحويل جزء من الكود داخل المحاولة (try) إلى جزء من التأكيد (then) في Promise الذي يتم إرجاعه من createUserWithEmailAndPassword.

    قم بتحديث الكود في ملف Register.jsx كما يلي:

    const handleSubmit = async (e) => {
      e.preventDefault();
      const displayName = e.target[0].value;
      const email = e.target[1].value;
      const password = e.target[2].value;
      const file = e.target[3].files[0];
    
      try {
        const res = await createUserWithEmailAndPassword(auth, email, password);
    
        // تم إنشاء المستخدم بنجاح، يمكن الآن متابعة عملية تحميل الصورة
        const storageRef = ref(storage, displayName);
        const uploadTask = uploadBytesResumable(storageRef, file);
    
        // باقي الكود لتحميل الصورة وتحديث بيانات المستخدم يبقى كما هو
        // ...
      } catch (err) {
        // يمكنك معالجة الخطأ هنا إذا لزم الأمر
      }
    };

     

  7. من المفترض أن يتم طلب توثيق الهوية بعد أول مشروع لك على الموقع، وشروط الواجب توافر في الوثائق هي:

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

    وتستطيع قراءة المزيد من هنا:

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

     

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

    • تقديم نسخة من كشف حسابك المصرفي.
    • التحقق من رقم هاتفك المحمول.
    • التحقق من عنوانك البريدي.

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

    ثم، انقر فوق علامة التبويب "الحساب" وحدد "التوثيق" من القائمة. سيرشدك PayPal بعد ذلك خلال عملية التوثيق.

    • أعجبني 1
  9. أولاً عليك بتصميم جدول للمنتجات يحتوي على معلومات المنتجات مثل الاسم والسعر والكمية المتوفرة وغيرها من المعلومات التي تحتاجها كالتالي:

    CREATE TABLE products (
        product_id INT AUTO_INCREMENT PRIMARY KEY,
        product_name VARCHAR(255) NOT NULL,
        price DECIMAL(10, 2) NOT NULL,
        quantity INT NOT NULL
    );

    ثم إنشاء جدول لتخزين بيانات الفواتير مثل تاريخ الفاتورة ومعلومات الموظف وحالة الدفع.

    CREATE TABLE invoices (
        invoice_id INT AUTO_INCREMENT PRIMARY KEY,
        employee_name VARCHAR(255) NOT NULL,
        invoice_date DATE NOT NULL,
        total_amount DECIMAL(10, 2) NOT NULL,
        amount_paid DECIMAL(10, 2) NOT NULL,
        payment_status ENUM('Unpaid', 'Partially Paid', 'Paid') NOT NULL
    );

    بعد ذلك ربط جدول المنتجات بجدول الفواتير لكي تتمكن من تتبع التفاصيل الخاصة بكل فاتورة والمنتجات المرتبطة بها:

    CREATE TABLE invoice_details (
        detail_id INT AUTO_INCREMENT PRIMARY KEY,
        invoice_id INT NOT NULL,
        product_id INT NOT NULL,
        quantity INT NOT NULL,
        subtotal DECIMAL(10, 2) NOT NULL,
        FOREIGN KEY (invoice_id) REFERENCES invoices (invoice_id),
        FOREIGN KEY (product_id) REFERENCES products (product_id)
    );

    والآن تأتي خطوة إضافة بيانات المنتجات بإضافة بعض البيانات الاختبارية لجدول المنتجات باستخدام عبارة INSERT INTO.

    INSERT INTO products (product_name, price, quantity)
    VALUES
        ('Product 1', 10.00, 50),
        ('Product 2', 15.00, 30),
        ('Product 3', 20.00, 20);

    وعندما يقوم الموظف بعمل طلب جديد، يتم إنشاء فاتورة جديدة في جدول الفواتير، وربما تحتاج إلى تعبئة بعض المعلومات مثل اسم الموظف وتاريخ الفاتورة.

    وبعد إنشاء الفاتورة، قم بإضافة تفاصيل الطلب (المنتجات المطلوبة وكمياتها) إلى جدول تفاصيل الفواتير.

    ثم احتفظ بمعلومات المبلغ المدفوع في جدول الفواتير، وتستطيع تحديث حالة الدفع إلى "Partially Paid" عند دفع جزء من المبلغ وعند دفع المبلغ بالكامل يمكنك تحديث حالة الدفع إلى "Paid".

    وباستخدام حقل الحالة في جدول الفواتير، بإمكانك متابعة ما إذا كان العميل قد قام بدفع الفاتورة بالكامل أم لا.

  10. لديه خطأ يعني أنه عندما تقوم بتطبيق مشغّل الفحص (null check operator) "!" على قيمة تكون فارغة (null)، وعند استخدام "!" بجانب متغير أو خاصية يفترض أن تكون غير فارغة (non-null)، فإذا كانت القيمة فعليًا فارغة (null)، سيتم رفع خطأ بسبب هذا التصريح غير الصحيح.

    وفي الكود لديك قبل استخدام المشغّل "!" على المتغير أو الخاصية، عليك بالتحقق إذا كانت القيمة فعليًا غير فارغة باستخدام التحقق من القيمة الفارغة كالتالي:

    if (myVariable != null) {
      // قم بتنفيذ العمليات على myVariable هنا
    }

    أيضًا استخدم مشغل عدم الائتمان "?" بدلاً من "!" والذي سيتجاوز الخطأ إذا كان المتغير فعليًا فارغًا (null) وسيعيد قيمة افتراضية بدلاً من رفع الخطأ كالتالي:

    var value = myVariable?.someProperty;

    وفي حال كانت myVariable فارغة (null)، سيتم تعيين قيمة value بدلاً من رفع الخطأ.

    بإمكانك أيضًا استخدام ثلاثي العوامل للتحقق من أكثر من خاصية في سلسلة من الخصائص دون رفع الخطأ إذا كان أحد هذه الخصائص فارغًا (null):

    var value = myVariable?.someProperty?.anotherProperty;

     

  11. أنت تقصد التصميم المتجاوب للموقع، صحيح؟

    ستحتاج إلى استخدام الـ  media query من أجل ضبط تصميم الصفحة على مختلف أحجام الشاشات وذلك من خلال إختبار الموقع وتفق الـ Break points التي يصبح فيها التنسيق غير سليم عند حجم معين، وذلك باستخدام أدوات المطور في المتصفح أي بتصغير حجم الموقع أو إختيار حجم معين للشاشة وتصفح الموقع لإختباره.

    ومن الأفضل أن تعتمد من البداية على الـ Grid والـ Flex ووحدة قياس rem وأيضًا خاصية max-width من أجل تسهيل عملية تجاوب الصفحة.

    وقد تم ذكر ذلك هنا بالتفصيل:

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

    • أعجبني 1
  12. عليك بتجربة التطبيق بالتحديث الأخير بدون أية تعديلات، لتفقد هل المشكلة من التعديلات التي قمت بها وتتعارض من كود معين في التطبيق أم هناك مشكلة في السورس كود نفسه.

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

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

    وهل حاولت تجربة التطبيق على هاتف آخر؟

  13. عليك أن تنتبه إلى  أن الدالة isNaN() غير موجودة في C++، والدالة isNaN() هي دالة في JavaScript، وليس في C++.

    ولتحديد ما إذا كان الرقم الذي أدخله المستخدم هو قيمة غير صالحة في C++، فعليك بالإعتماد على مكتبات iostream و limits التي تحتوي على وظائف الإدخال والإخراج وتعريفات مثل numeric_limits للتحقق من الخصائص العددية.

    ثم كتابة دالة main() التي تعد نقطة البداية في البرنامج. تقوم بتعريف متغير "n" من النوع double لتخزين العدد الذي سيدخله المستخدم.

    ويُطلب من المستخدم إدخال عدد من خلال استخدام std::cout و std::cin. std::cout يُستخدم لإخراج رسالة للمستخدم ليدخل العدد المطلوب.

    ثم نستخدم الحلقة while(true) لتكرار المطالبة بإدخال العدد حتى يُدخل المستخدم عددًا صحيحًا إيجابيًا.

    داخل الحلقة، استخدم std::cin للتحقق من الإدخال الصحيح، وذلك بوضع std::cin في شرط if للتحقق من نجاح القراءة، وإذا نجحت القراءة، نتحقق مما إذا كان العدد المُدخل (n) أكبر من الصفر، وفي حال إذا كذلك، فإننا نخرج من الحلقة باستخدام break ويكون الإدخال صحيحًا وإيجابيًا.

    وإذا كان لدينا إدخال غير صحيح (مثل إدخال حرف) أو كان العدد أقل من أو يساوي الصفر، يُطلب من المستخدم إعادة المحاولة من خلال طباعة رسالة "Invalid input. Please enter a positive number: ".

    ثم معالجة الخطأ بوضع std::cin في حالة خطأ باستخدام std::cin.clear() ومسح المحتوى السابق المدخل بواسطة std::cin.ignore().

    وعندما يُدخل المستخدم عددًا صحيحًا إيجابيًا، سنخرج من الحلقة ونطبع الرقم المدخل بواسطة std::cout.

    وفي النهاية يُعيد البرنامج 0 كرمز للخروج من البرنامج بنجاح.

    وإليك مثال:

    #include <iostream>
    #include <limits>
    
    int main() {
      double n;
      std::cout << "Enter a positive number: ";
    
      while (true) {
        if (std::cin >> n) {
          if (n > 0) {
            break; // المدخل صحيح وإيجابي، نخرج من الحلقة
          } else {
            std::cout << "Invalid input. Please enter a positive number: ";
          }
        } else {
          std::cout << "Invalid input. Please enter a number: ";
          std::cin.clear();
          std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
      }
    
      std::cout << "The number is: " << n << std::endl;
    
      return 0;
    }
  14. استخدم دالة array_combine()، وهي تستقبل مصفوفة من المفاتيح ومصفوفة من القيم وتعيد مصفوفة جديدة يكون كل عنصر فيها هو زوج مفتاح-قيمة من عنصر المصفوفة الأولى مع عنصر المصفوفة الثانية المقابل له.

    أي في حال لدينا المصفوفة التالية:

    $friends = [
        "Ahmed Gamal" => "AG",
        "Osama Mohamed" => "OM",
        "Mahmoud Gamal" => "MG",
        "Ahmed Samy" => "AS"
    ];

    ونريد دمج أوامر array_reverse() وarray_flip()، نكتب الكود كالتالي:

    $reversed_and_flipped_friends = array_combine(array_reverse($friends), array_flip($friends));

    وستقوم تلك الدالة بإنشاء مصفوفة جديدة كالتالي:

    [
        "OM" => "Osama Mohamed",
        "AG" => "Ahmed Gamal",
        "MG" => "Mahmoud Gamal",
        "AS" => "Ahmed Samy"
    ]

    وبإمكانك طباعة المصفوفة الجديدة بالشكل التالي:

    echo '<pre>';
    print_r($reversed_and_flipped_friends);
    echo '</pre>';

    والنتيجة هي:

    Array
    (
        [OM] => Osama Mohamed
        [AG] => Ahmed Gamal
        [MG] => Mahmoud Gamal
        [AS] => Ahmed Samy
    )

     

    • أعجبني 2
  15. تقصد أن الظل أسفل الـ navbar غير سليم؟ أما تقصد أنك تحاول إضافة ظل لعنصر absolute؟ من الأسهل إضافة الظل مباشرًة للـ navbar.

    عامًة في Tailwind CSS، تستطيع  استخدام خاصية shadow، وتحتوي خاصية shadow على الأنماط المختلفة للظل، بما في ذلك shadow-sm و shadow-md و shadow-lg وغيرها، ومن الأفضل استخدام shadow-md هنا لأنه يقدم ظل معتدل.

    <nav class="bg-white p-4 shadow-md">
      <!-- محتوى النافبار هنا -->
    </nav>

    أما عن طريق CSS فسنقوم بالتالي:

    .navbar {
      box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); /* يمكنك ضبط هذه القيم حسب احتياجاتك */
    }
    • 0px: إزاحة الظل أفقياً، هنا ليس هناك إزاحة (الظل مباشرة تحت العنصر).
    • 4px: إزاحة الظل عمودياً، أي أن الظل سيكون 4 بكسل أسفل العنصر.
    • 6px: تمويه (blur) الظل. هذا يضيف ضبابية للظل ليبدو أكثر طبيعية.
    • rgba(0, 0, 0, 0.1): اللون والشفافية (opacity) للظل، واستخدمت اللون الأسود (RGB 0, 0, 0) والشفافية 0.1، وبإمكانك تغيير القيم للوصول إلى الظل المطلوب.
  16. حاول استخدام مكتبة أخرى لضغط الفيديو مثل  FFmpegAndroid (تدعم جافا فقط) وهي مكتبة منفصلة يتطلب تضمينها واستخدامها في مشروع Android لديك باستخدام Gradle أو تحميل ملف JAR مباشرة.

    ثم أنشئ AsyncTask مماثلة للكود لديك، ولكن في دالة doInBackground()، قم بتنفيذ عملية ضغط الفيديو مع الصوت باستخدام FFmpeg.

    بعد ذلك استخدم FFmpeg في doInBackground() لضغط الفيديو مع الصوت، باستخدام الأمر

    ffmpeg -i input_video.mp4 -c:v libx264 -c:a aac -strict experimental -b:a 128k output_video.mp4

    لضغط الفيديو مع الصوت بتنسيق MP4، ويُفترض أن input_video.mp4 هو المسار الكامل للفيديو الذي تم اختياره، و output_video.mp4 هو المسار الذي سيتم حفظ الفيديو المضغوط به.

    وفي onPostExecute()، استخدم المسار الكامل للفيديو المضغوط لتعيين VideoView.

    وفي حال أردت استخدام مكتبة حديثة (مكتوبة بواسطة كوتلن) وتدعم Flutter أيضًا وهي أفضل في رأي فاستخدم مكتبة LightCompressor وإليك المستند الرسمي الخاص بها:

    وهي تعتمد على MediaCodec API في أندرويد.

  17. أنت نستخدم نوع ملف webm، ,وليس هناك دعم من متصفح الويب  لصيغة ملف webm، حيث أن الصيغ المدعومة في عنصر audio هي  MP3, WAV, و OGG.

    أي حاول تسجيل الصوت باستخدام صيغة ملف مدعومة على جهاز الكمبيوتر الخاص بك (مثل wav أو ogg)، وتحديث الكود على النحو التالي:

    في ملف audio.html، غيِّر نوع الصيغة في عنصر <audio> إلى صيغة ملف مدعومة، مثل wav أو ogg:

    <audio style="display:none" id="audi" controls="controls" src="" type="audio/wav"></audio>

    وفي ملف audio.php، غيِّر المصفوفة $allowedExtension لتشمل الصيغة التي تم اختيارها في الملف audio.html:

    if ($audio_url = _file('audio', ['wav', 'ogg'], 1000 * 1000 * 5, 'upload')) {
        // ...
    }

    وفي حال كنت ترغب في دعم صيغ أخرى للملفات الصوتية، فتستطيع إضافتها إلى المصفوفة $allowedExtension في ملف audio.php.

  18. أنت تقصد تمارين للدوال في جافاسكريبت، صحيح؟

    تمارين للمبتدئين

    • كتابة دالة تأخذ رقمًا كإدخال وتعيد ضعفه.
    • كتابة دالة تأخذ رقمين كإدخال وتعيد مجموعهما.
    • كتابة دالة تأخذ رقمًا كإدخال وتعيد الفرق بينه وبين 10.
    • كتابة دالة تأخذ رقمًا كإدخال وتعيد النصف الصحيح له.
    • كتابة دالة تأخذ رقمًا كإدخال وتعيد الجذر التربيعي له.

    تمارين متوسطة

    • كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد مجموعتها.
    • كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد أكبرها.
    • كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد أصغرها.
    • كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد عدد الأعداد الزوجية فيها.
    • كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد عدد الأعداد الفردية فيها.

    تمارين متقدمة

    • كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تبدأ بحرف متحرك.
    • كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تنتهي بحرف ساكن.
    • كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تحتوي على حرف "a".
    • كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تحتوي على حرف "e".
    • كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تحتوي على حرف "i".

     

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

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

    وإليك بعض المنصات التي يمكنك من خلالها شراء العملات الرقمية:

    • Binance
    • Coinbase
    • Kraken
    • Bitfinex
    • Huobi

    وأنصحك بالبحث عن دورة التداول في العملات الرقمية على اليوتيوب لتفهم الأمر، ولا تستمع لنصيحة أي أحد بدون دراية وعلم.

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

    وأي مسار برمجي بحاجة على الأقل إلى 6 أشهر وقد تصل إلى سنة لبعض الأشخاص، وأنا لا أتحدث عن دورة واحدة بل مسار برمجي مثل الواجهة الأمامية به أكثر من دورة وليس دورة واحدة مثلاً (أساسيات html, css, js) ثم لديك دورة مفصلة ومتقدمة لجافاسكريبت ثم دورة خاصة بـ React.

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

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

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

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

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

    وأنصحك بقراءة التالي:

  21. يوجد طريقتان لنقل مجلد من مجلد آخر إلى سطح المكتب في Linux.

    الطريقة الأولى هي استخدام واجهة المستخدم الرسومية (GUI):

    1. افتح مدير الملفات.
    2. انتقل إلى المجلد الذي يحتوي على المجلد الذي تريد نقله.
    3. حدد المجلد الذي تريد نقله.
    4. اسحب المجلد إلى سطح المكتب.

    الطريقة الثانية هي استخدام سطر الأوامر. للقيام بذلك:

    1. افتح نافذة موجه الأوامر.
    2. انتقل إلى المجلد الذي يحتوي على المجلد الذي تريد نقله في منفذ الأوامر terminal.
    3. اكتب الأمر التالي:
    mv source_folder destination_folder

    وبالطبع استبدل source_folder باسم المجلد أو الملف، واستبدل اسم destination_folder بالوجهة التي تريد نقل المجلد أو الملف إليها.

    أي في حال كنت تريد نقل المجلد "my_folder" إلى سطح المكتب، فستكتب الأمر التالي:

    mv my_folder ~/Desktop

    وسيؤدي ذلك إلى نقل المجلد "my_folder" إلى سطح المكتب.

  22. بتاريخ On 18‏/7‏/2023 at 15:26 قال mohammad.jawareesh:

    هناك input من filed search 

    استخدم قيمة ذلك الحقل لتنفيذ البحث في قاعدة البيانات، كالتالي:

    في ملف العرض (View) الخاص بك، أنشئ نموذج (Form) بحث بالشكل التالي:

    <form method="GET" action="/search">
      <input type="text" name="query" placeholder="ابحث عن الاسم">
      <button type="submit">ابحث</button>
    </form>

    ثم، في ملف التوجيه (Routes)، حدد مسار للبحث وربطه بوظيفة في وحدة التحكم (Controller)، كالتالي:

    Route::get('/search', 'SearchController@search');

    وفي وحدة التحكم (Controller) الخاصة بالبحث، تستطيع استقبال الاستعلام (query) المدخل من الحقل واستخدامه في جملة البحث، كالتالي:

    use Illuminate\Http\Request;
    use App\Models\Table;
    
    class SearchController extends Controller
    {
        public function search(Request $request)
        {
            $query = $request->input('query');
    
            $results = Table::where('name', 'LIKE', '%' . $query . '%')->get();
    
            // عرض النتائج أو قم بالإجراءات المناسبة
    
            return view('search_results', ['results' => $results]);
        }
    }

    بحيث تستقبل الاستعلام (query) من الحقل بواسطة كائن Request، ثم استخدامه في جملة البحث للبحث عن السجلات التي تحتوي على الاستعلام في حقل الاسم، وتُرسل النتائج إلى عرض (View) المستخدم لعرضها بطريقة مناسبة.

    واستبدل Table بالاسم الصحيح للنموذج لديك، واستبدال search_results بعرض النتائج أيضًا.

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

    مثال عن تخزين قائمة من الأرقام باستخدام Set:

    const set = new Set([1, 2, 3, 4, 5]);
    
    // set.has(3) // true
    // set.has(6) // false

     تحتوي المجموعة set على الأرقام 1 و 2 و 3 و 4 و 5. لا تحتوي المجموعة على الرقم 6.

    الـ WeakSet هي  مجموعة من الكائنات فقط،  ولا يمكن الوصول إلى العناصر في الWeakSet إلا من خلال معرفها، مما يعني أن العناصر في الWeakSet لن يتم جمعها بواسطة GC حتى لا يتم الإشارة إليها بأي طريقة أخرى.

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

    تخزين قائمة من الكائنات باستخدام Map:

    const map = new Map([
      [1, "Object 1"],
      [2, "Object 2"],
      [3, "Object 3"]
    ]);
    
    // map.get(1) // "Object 1"
    // map.get(4) // undefined

    تحتوي الخريطة map على الكائنات { id: 1, name: "Object 1" } و { id: 2, name: "Object 2" } و { id: 3, name: "Object 3" }. لا تحتوي الخريطة على الكائن { id: 4, name: "Object 4" }.

    الـ WeakMap عبارة عن مجموعة من الكائنات فقط، ونصل إلى القيم في الـ WeakMap فقط عن طريق معرف المفتاح.، أي أن القيم في الWeakMap لن يتم جمعها بواسطة GC حتى لا يتم الإشارة إليها بأي طريقة أخرى.

    والحالات التي تصلح لاستخدام الـ WeakSet والـ WeakMap هي للتعامل مع الكائنات التي لا يجب أن تتم إدارتها أو جمعها من قبل  (Garbage Collector - GC) في لغات البرمجة التي تدعم تلك الهياكل ومنها جافاسكريبت.

    مثلاً قد تستخدم الـ WeakSet لتخزين قائمة بالمراجع إلى الكائنات التي تم إنشاؤها مؤقتًا، بحيث يتم حذف هذه الكائنات بمجرد عدم استخدامها بعد الآن، ونستخدم الـ WeakMap لتخزين مجموعة من الإعدادات، بحيث يتم حذف الإعدادات بمجرد عدم استخدامها بعد الآن.

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

    وإليك مثال عن تخزين قائمة من الكائنات التي تم إنشاؤها مؤقتًا:

    const weakSet = new WeakSet();
    
    const obj1 = {
      id: 1,
      name: "Object 1"
    };
    
    const obj2 = {
      id: 2,
      name: "Object 2"
    };
    
    weakSet.add(obj1);
    weakSet.add(obj2);
    
    // delete obj1;
    
    // weakSet.has(obj1) // false
    // weakSet.has(obj2) // true

    كما ترى، تم حذف الكائن obj1 من مجموعة weakSet، لأنه لم يكن هناك كائنات أخرى تشير إليه.

    تخزين مجموعة من الإعدادات:

    const weakMap = new WeakMap();
    
    const setting1 = {
      key: "key1",
      value: "value1"
    };
    
    const setting2 = {
      key: "key2",
      value: "value2"
    };
    
    weakMap.set(setting1, setting1.value);
    weakMap.set(setting2, setting2.value);
    
    // delete setting1;
    
    // weakMap.get(setting1) // undefined
    // weakMap.get(setting2) // "value2"

    كما ترى، لم يعد بإمكاننا الحصول على قيمة setting1 من مجموعة weakMap، لأنه لم يكن هناك كائنات أخرى تشير إليه، ولكن، لا يزال بإمكاننا الحصول على قيمة setting2.

    وأنصحك بقراءة التالي:

     

×
×
  • أضف...