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

Mustafa Suleiman

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

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

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

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

    305

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

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

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

    وبعد إختيار الدورة المناسبة لك، ستجد في صفحة الدورة زر اشترك الآن كالتالي:

    2023-07-26_20-03-41.thumb.png.17af0a9cbc14fe02b15132401f858b25.png

    ولكن ذلك في حالة عدم وجود عروض، وحاليًا يوجد العرض الصيفي وتفاصيله هي الحصول على دورتين بتكلفة دورة واحدة ورابط العرض هو التالي:

    بعد التوجه للرابط اضغط على زر اشترك الآن، أو قم بالنزول لأسفل وستجد القسم الخاص بإختيار الدورتين وخانات إدخال بيانات البطاقة الإئتمانية ( يجب أن تكون من نوع Debit أو Credit وليس Prepaid) الخاص بك كالتالي:

    Snag_2a98feb.thumb.png.a793d5865355a735bc4d744d73ae8dd2.png

    وأخيرًا اضغط على اشترك الآن.

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

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

     

    • أعجبني 1
  2. أولاً، تحتاج إلى إضافة الصورة والنص في الواجهة. باستخدام Row لعرضهما جنبًا إلى جنب:

    import 'package:flutter/material.dart';
    
    class CustomSwitch extends StatefulWidget {
      @override
      _CustomSwitchState createState() => _CustomSwitchState();
    }
    
    class _CustomSwitchState extends State<CustomSwitch> {
      bool _isSwitched = false;
    
      @override
      Widget build(BuildContext context) {
        return Row(
          children: [
            Icon(
              _isSwitched ? Icons.check_box : Icons.check_box_outline_blank,
              color: _isSwitched ? Colors.green : Colors.grey,
            ),
            SizedBox(width: 8),
            GestureDetector(
              onTap: () {
                setState(() {
                  _isSwitched = !_isSwitched;
                });
              },
              child: Text(
                _isSwitched ? 'تم التفعيل' : 'غير مفعل',
                style: TextStyle(
                  color: _isSwitched ? Colors.green : Colors.grey,
                ),
              ),
            ),
          ],
        );
      }
    }

    ثم استخدم CustomSwitch في أي مكان ترغب فيه داخل تطبيقك، كالتالي:

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Custom Switch'),
            ),
            body: Center(
              child: CustomSwitch(),
            ),
          ),
        );
      }
    }

     

  3. بإمكانك التحقق من المعلومات عبر طلبات POST و GET باستخدام الـ "Request" المدمجة، والوصول إلى بيانات الطلب من خلال هذا الكائن وتحليلها للتحقق منها.

    وإليك الخطوات للتوضيح:

    طلب GET:

    للوصول إلى بيانات طلب GET، استخدم الـ "query" المدمجة في كائن الطلب.

    // استقبال البيانات من الطلب GET
    public function getExample(Request $request) {
        $data = $request->query();
        
        // تحقق من وجود معلومة معينة بالاستعلام الذي تم إرساله
        if ($request->has('key')) {
            // اعمل شيئاً مع المعلومة الموجودة في المفتاح 'key'
        }
        
        // ... تابع باقي المنطق الخاص بك
    }

    طلب POST:

    نستخدم الـ "input" المدمجة في كائن الطلب.

    // استقبال البيانات من الطلب POST
    public function postExample(Request $request) {
        $data = $request->input();
        
        // تحقق من وجود معلومة معينة بالمتغيرات التي تم إرسالها بالطلب POST
        if ($request->has('key')) {
            // اعمل شيئاً مع المعلومة الموجودة في المفتاح 'key'
        }
        
        // ... تابع باقي المنطق الخاص بك
    }

    في كلا الحالتين، تستطيع الوصول إلى قيمة معينة من خلال استخدام الدالة "input" مع اسم المفتاح كمعامل.

    وإليك مثال للحصول على قيمة معينة من طلب POST:

    // استقبال البيانات من الطلب POST
    public function postExample(Request $request) {
        $username = $request->input('username');
        $password = $request->input('password');
        
        // ... تابع باقي المنطق الخاص بك
    }

     

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

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

    وهناك العديد من فوائد استخدام القواميس في بايثون، منها:

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

    بالإضافة إلى تنظيم البيانات بطريقة سهلة ومفهومة، حيث تستخدم المفاتيح لتصنيف وتنظيم القيم.

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

    وتساعد القواميس في التعامل مع البيانات ذات التنظيم الهيكلي بسهولة، مثل الJSON والـXML.

    وإليك بعض الأمثلة على كيفية استخدام القواميس في بايثون.

    تخزين معلومات المستخدمين:

    # قاموس لتخزين معلومات المستخدمين
    user_info = {
        'اسم المستخدم': 'john_doe',
        'البريد الإلكتروني': 'john@example.com',
        'العمر': 30,
        'المدينة': 'نيويورك'
    }
    
    # الوصول إلى قيمة معينة باستخدام المفتاح
    print("اسم المستخدم:", user_info['اسم المستخدم'])
    print("العمر:", user_info['العمر'])

    لتخزين أسماء المنتجات وأسعارها:

    products = {
        "Apple": 100,
        "Orange": 50,
        "Banana": 25
    }

    لتخزين بيانات غير مرتبة:

    data = {
        "name": "John Doe",
        "age": 20,
        "address": "123 Main Street, Anytown, CA"
    }

    التحكم في تدفق البرنامج:

    # تحديد عملية بناءٍ سريعٍ للأرقام
    operations = {
        '+': lambda x, y: x + y,
        '-': lambda x, y: x - y,
        '*': lambda x, y: x * y,
        '/': lambda x, y: x / y
    }
    
    operator = '+'  # اختيار عملية الجمع
    num1 = 10
    num2 = 5
    
    # استخدام العملية المحددة لإجراء الحساب
    result = operations[operator](num1, num2)
    print("النتيجة:", result)

    تمثيل بيانات هيكلية:

    # مثال لقاموس متعدد الأبعاد
    employees = {
        'موظف1': {
            'الاسم': 'أحمد',
            'العمر': 25,
            'المدينة': 'القاهرة'
        },
        'موظف2': {
            'الاسم': 'سارة',
            'العمر': 30,
            'المدينة': 'دبي'
        }
    }
    
    # الوصول إلى تفاصيل موظف معين
    print("معلومات موظف1:", employees['موظف1'])
    print("اسم موظف2:", employees['موظف2']['الاسم'])
  5. دورة بايثون تحتوي على أكثر من دورة بداخلها ومقسمة إلى مسارات، وستحتاج إلى 4 أشهر على الأقل والفترة المناسبة هي 6 أشهر والتي أراها مناسبة لدراسة أي مجال برمجي.

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

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

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

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

    وأيضًا أنصحك بقراءة التالي لتوضيح الأمر بخصوص علمية الحفظ أم الفهم:

  6. توجه إلى المسار التالي على جهازك من خلال نسخه ولصقه في شريط العنوان ثم اضغط Enter:

    C:\Program Files\Oracle\VirtualBox\drivers\vboxsup

    وستجد هناك ملف باسم VBoxSup.inf ثم اضغط بزر الفأرة الأيمن عليه واختر install كالتالي:

    Snag_55cefa.thumb.png.d9971e3ffe5a8f25a396a739debb0438.png

    الآن قم بفتح منفذ الأوامر CMD من خلال البحث عنه في شريط البحث بالأسفل في الويندوز، ثم اختر run as administrator ثم اكتب الأمر التالي:

    sc start vboxsup

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

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

    وبإمكانك إضافة أوامر تسجيل (Log) في أماكن محددة من التطبيق لتتبع تدفق التنفيذ والقيم المتغيرة، واستخدام أدوات تسجيل الأحداث مثل Logcat في Android Studio لعرض السجلات وفهم سير تنفيذ التطبيق والمعلومات المفيدة حول الأخطاء.

    وإليك الخطوات لكيفية تصحيح أخطاء تطبيق Android:

    1. قم بتمكين تصحيح USB على جهازك. يمكنك العثور على هذا الإعداد في قائمة خيارات المطور.
    2. توصيل جهازك بالكمبيوتر باستخدام كابل USB.
    3. افتح Android Studio.
    4. في شريط الأدوات، انقر فوق الزر "تشغيل".
    5. حدد خيار "التصحيح".
    6. وفي حال كنت تقوم بتصحيح أخطاء تطبيقك لأول مرة، فسيطلب منك Android Studio تثبيت أدوات Android Debug Bridge (ADB). انقر فوق "تثبيت" لتثبيت أدوات ADB.
    7. سيقوم Android Studio الآن ببناء تطبيقك وتثبيته على جهازك. بمجرد تثبيت التطبيق، وسيبدأ في التشغيل في وضع التصحيح.

    والآن تستطيع تعيين نقاط التوقف breakpoints  في الكود، ثم الإنتقال سطر بسطر لتفقد أين يقع الخطأ.

  8. أنت تتحدث عن درس المجموعات Sets في أساسيات لغة بايثون Python  في بنى المعطيات الخطية Data Structures، لذلك أرجو منك التعليق أسفل فيديو الدرس في المرة القادمة ليتم مساعدتك بشكل افضل.

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

    مثال: 

    # إنشاء مجموعة قابلة للتعديل
    set1 = {1, 2, 3, 4, 5}
    print(set1)  # Output: {1, 2, 3, 4, 5}
    
    # إضافة قيمة جديدة
    set1.add(6)
    print(set1)  # Output: {1, 2, 3, 4, 5, 6}
    
    # حذف قيمة
    set1.remove(3)
    print(set1)  # Output: {1, 2, 4, 5, 6}

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

    مثال:

    # إنشاء مجموعة غير قابلة للتعديل باستخدام frozenset
    frozen_set = frozenset({10, 20, 30, 40})
    print(frozen_set)  # النتيجة: frozenset({40, 10, 20, 30})
    
    # لا يمكن إجراء أي تغيير في المجموعة الغير قابلة للتعديل
    # frozen_set.add(50)  # سيؤدي هذا إلى خطأ TypeError: 'frozenset' object has no attribute 'add'

    وبالنسبة لكائن قابل للتكرار (Iterable)، فهو كائن يمكن الانتقال عبر عناصره بشكل متتالٍ، أي أننا نستطيع استخدام الحلقات مثل حلقة for للوصول إلى كل عنصر في الكائن.

    مثال:

    # قائمة قابلة للتكرار
    my_list = [10, 20, 30, 40, 50]
    
    # الوصول إلى عناصر القائمة باستخدام حلقة for
    for item in my_list:
        print(item)
    # النتيجة:
    # 10
    # 20
    # 30
    # 40
    # 50

    وبالمقابل، الكائن غير قابل للتكرار يعني أنه لا يمكن استخدام الحلقات للوصول إلى العناصر بشكل متتالٍ.

    مثال:

    my_number = 42
    
    # لا يمكن استخدام حلقة for مباشرة للعدد (Number) لأنه غير قابل للتكرار
    for digit in my_number:
       print(digit)  # سيؤدي هذا إلى خطأ TypeError: 'int' object is not iterable

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

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

    مثال:

    # إنشاء مجموعة تحتوي على قيم مكررة
    my_set = {1, 2, 2, 3, 4, 4, 5, 5}
    
    # عرض المجموعة
    print(my_set)  # النتيجة: {1, 2, 3, 4, 5}
    
    # عند إضافة قيمة مكررة للمجموعة، ستقوم Python تلقائيًا بإزالتها
    my_set.add(3)
    print(my_set)  # النتيجة: {1, 2, 3, 4, 5}
    
    # يمكنك استخدام التحويل إلى مجموعة لإزالة القيم المكررة من قائمة
    my_list = [1, 2, 2, 3, 4, 4, 5, 5]
    unique_set = set(my_list)
    print(unique_set)  # النتيجة: {1, 2, 3, 4, 5}

    المجموعات (Sets) تتكون فعليًا من قيم فريدة غير قابلة للتكرار، ولا يمكن أن تحتوي على عناصر مكررة، وهي في الواقع مجموعة قيم لا تتكرر، ولا تحتوي على ترتيب معين للعناصر.

    وبخصوص القابلية للتعديل، فالمجموعة (set) هي هيكل بيانات قابل للتعديل (Mutable) في لغة Python، ويمكنك إضافة وحذف العناصر من المجموعة بحرية، أما frozenset فهو هيكل بيانات غير قابل للتعديل (Immutable) ولا يمكن تعديل أو تغيير العناصر الموجودة فيه.

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

    ثم مفهوم التركيب والتفكيك (Composition and Aggregation)، حيث تعتمد البرمجة الكائنية على تركيب الكائنات من خلال تضمينها في بعضها البعض (التركيب) أو ربطها بشكل منطقي (التفكيك).

    يأتي بعد ذلك التوريث (Inheritance) والذي يسمح بإنشاء كائن جديد بناءً على كائن موجود واكتساب الخصائص والسلوكيات من الكائن الأصل.

    ننتقل بعد ذلك إلى الدوال والأساليب (Methods)، وهي سلوكيات الكائنات وتستخدم لتنفيذ العمليات والإجراءات.

    ثم مفهوم التغليف (Encapsulation) والذي يتيح لك تجميع البيانات والأساليب ذات الصلة معًا في كائن واحد وإخفاء التفاصيل الداخلية عن الخارج.

    وأخيرًا مفهوم التحول (Polymorphism) والذي يتيح للكائنات القدرة على تنفيذ نفس الواجهة بطرق مختلفة، ويساعد على تبسيط البرمجة وجعلها أكثر مرونة.

    وقد تم توضيح مجموعة المبادئ البرمجية الخمسة SOLID Principles التي تهدف إلى جعل التصميم البرمجي قابلًا للتوسع والصيانة.

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

    ومن خلال تنفيذ مشاريع كبيرة نسبيًا ستفهم أهمية استخدام البرمجة الكائنية مقارنًة بكتابة الدوال والكود بدون استخدام الكلاسات.

    وبخصوص الـ Design Patterns فعليك بالإطلاع عليها فقط في البداية، لكن مع التركيز بشدة على نمط Model-View-Controller (MVC) فهو الأكثر استخدامًا وستحتاجه في العمل، أما باقي الأنماط فتستطيع تعلمها بعد مرور فترة وإنهائك أكثر من مشروع، وقد لا تحتاج إليها، وإليك شرح مفصل لما أقصده:

     

  10. المشكلة لديك في اسم كتابة اسم الـ Prop بشكل غير صحيح في مكون Note.js حيث أنك مررت إليه Prop باسم noteClicked ولكنك كتبته باسم noteclicked لاحظ حرف c صغير والصحيح هو حرف C كبير أي يصبح الكود كالتالي:

    import React from "react";
    
    const Note = (props) => {
      const {title, noteClicked, active} = props;
      return (
        <li className={`note-item ${active && "active"}`} onClick={noteClicked}>
          {title}
        </li>
      );
    };
    
    export default Note;

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

    • أعجبني 2
  11. هل جربت تصفح الموقع من خلال متصفح آخر؟ في حال تم التصفح بشكل طبيعي فعليك بحذف الملفات المؤقتة للمتصفح الذي يوجد به المشكلة من خلال الضغط على علامة القفل بجان رابط موقع الأكاديمية وذلك في جوجل كروم، ثم إختيار Cookies and site data:

    2023-07-25_15-03-07.png.6ebe416365918c475222abc3fe3084f1.png

    بعد ذلك اختر  manage  Cookies and site data وستظهر لك نافذة بها البيانات الخاصة بالموقع، فقم بحذف الجميع كالتالي:

    2023-07-25_15-04-41.png.c408ef6869f737c44a3ff80794aabf6a.png

    وفي حال لم يتم حل المشكلة، فقد تحتاج إلى حذف جميع الملفات المؤقتة للمتصفح من خلال الضغط على CTRL + SHIFT + DELETE ثم إختيار ALL TIME من القائمة المنسدلة ثم تحديد Cookies and other site data وCached images files ثم الضغط على clear data، لكن يجب التنبيه أن تلك الطريقة تعني تسجيل خروجك من جميع المواقع لأنه سيتم حذف الكوكيز.

    2023-07-25_15-08-27.png.4f5b84a17eef93ece4dbe587ff8112a1.png

     

    • أعجبني 1
  12. ما تريدينه هو رفع مشروع يستخدم Webpack على GitHub pages وقد تم توضيح ذلك من خلال الفيديو التالي:

    وسأوضح لك الخطوات:

    أولاً عليك بإنشاء مستودع جديد على GitHub.

    ثم فتح مجلد الـ build أو dist النهائي فقط في vscode، وهو المجلد الذي يتم به تجميع الكود النهائي للمشروع ليصبح جاهز للنشر.

    ثم إنشاء مستودع git داخل ذلك المجلد من خلال المر التالي:

    git init

    والآن عليك بكتابة الأوامر التالية بالترتيب من أجل رفع المشروع إلى المستودع على GitHub:

    git add.
    git commit -m "my first commit"
    git branch -M main
    git remote add origin <رابط المستودع على جيت هوب>
    git push origin main

    والآن توجهي للمستودع الخاص بالمشروع على GitHub ثم الضغط على تبويب الإعدادات Settings، وستجدي خيار باسم pages اضغطي عليه ثم اختاري الفرع الذي تم رفع المشروع علي ه كما بالصورة:

    0.png.36fb9e85e2cd42951e49270f8eed5186.thumb.png.2eae5b22963f3a82a258e3eb0f2720d7.pngوالآن سننتظر قليلاً لحين الحصول على رابط المشروع لتصفحه كما بالصورة:

    10.thumb.png.80bb5629143b6d32e3da160a0ec508e3.png.ce2d4393b8271c0068bcd8a90c63788c.png

    وفي حال أردتي رفع المشروع بالكامل بما في ذلك مجلد build فعليك بتجاهل الخطوة الأولى وإنشاء المستودع في جذر المشروع الرئيسي ثم رفعه إلى المستودع بنفس الأوامر التي ذكرتها لك ثم التوجه إلى الإعدادات وتفعيل pages والآن ستحصلين على رابط أضيفي إليه build في النهاية من أجل تصفح مجلد build، أي كالتالي:

    أضيفي إليه أنت build ليصبح كالتالي:

    وستجدين المزيد من التوضيح والشرح هنا:

     

    0.png.36fb9e85e2cd42951e49270f8eed5186.png

  13. مزايا Express error handler

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

    متى يجب استخدام Express error handler (throw new Error)

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

    متى يجب تجنب استخدام Express error handler (throw new Error)

    • عند حدوث خطأ غير متوقع.
    • عند حدوث خطأ لا يمكنك التعامل معه.
    • عند حدوث خطأ غير مهم.

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

    // Handle a 404 error
    app.use(function(req, res, next) {
      if (req.originalUrl === '/404') {
        res.status(404).send('The page you are looking for is not found.');
      } else {
        next();
      }
    });
    
    // Handle a 500 error
    app.use(function(err, req, res, next) {
      res.status(500).send('An unexpected error occurred.');
    });

     

    • شكرًا 1
  14. الإختلاف هو في طريقة تحويل البيانات إلى سلسلة، حيث يقوم x-www-form-urlencoded  بتحويل البيانات إلى سلسلة باستخدام رمز URL، بينما يحول raw البيانات إلى سلسلة كما هي.

    ونستخدم x-www-form-urlencoded للبيانات التي سيتم إرسالها عبر نموذج ويب، مثلاً لإرسال اسم المستخدم وكلمة المرور إلى خادم، وتحويل تلك البيانات إلى سلسلة، وستبدوا السلسلة الناتجة كالتالي:

    username=johndoe&password=secret

    ولاحظ أنه يتم ترميز البيانات بتنسيق مفتاح/قيمة وإرسالها في جسم الطلب.

    أي لو في إرسال طلب POST لإضافة مستخدم جديد إلى قاعدة البيانات، يمكنك استخدام x-www-form-urlencoded لإرسال البيانات التالية:

    البيانات:

    • key: name، value: John Doe
    • key: email، value: johndoe@example.com
    • key: age، value: 30

    وفي مشروع Node.js، يجب أن تُعالج طلبات POST هذه الأنواع من البيانات في جسم الطلب، باستخدام إطار عمل مثل Express، ويمكنك قراءة بيانات x-www-form-urlencoded أو raw من جسم الطلب كالتالي:

    const express = require('express');
    const bodyParser = require('body-parser');
    
    const app = express();
    
    // تمكين معالجة x-www-form-urlencoded
    app.use(bodyParser.urlencoded({ extended: false }));
    
    app.post('/api/users', (req, res) => {
      const { name, email, age } = req.body;
      // قم بإجراء الإجراءات اللازمة لإضافة المستخدم إلى قاعدة البيانات هنا
      res.send('تمت إضافة المستخدم بنجاح');
    });
    
    app.listen(3000, () => {
      console.log('الخادم يعمل على المنفذ 3000');
    });

    بينما يستخدم raw عادةً للبيانات التي لا يمكن تحويلها إلى سلسلة باستخدام رمز URL، أي في حال كنت تريد إرسال ملف إلى خادم، فتستطيع استخدام raw لتحويل الملف إلى سلسلة، وستبدوا السلسلة الناتجة كالتالي:

    <file content>

    أي في حال أننا نريد إرسال بيانات في تنسيق غير مشفر، مثل نص عادي (Plain Text) أو JSON أو XML.

    ولنفترض أنك ترغب في إرسال طلب POST لإضافة مستخدم جديد باستخدام تنسيق JSON، هنا نستخدم Raw لإرسال البيانات التالية:

    البيانات (JSON):

    {
      "name": "John Doe",
      "email": "johndoe@example.com",
      "age": 30
    }

    وبالمثل يتوجب معالجة طلبات POST لذلك النوع من البيانات في جسم الطلب باستخدام إطار عمل مثل Express، ويمكنك قراءة بيانات x-www-form-urlencoded أو raw من جسم الطلب كالتالي:

    const express = require('express');
    const bodyParser = require('body-parser');
    
    const app = express();
    
    // تمكين معالجة JSON
    app.use(bodyParser.json());
    
    app.post('/api/users', (req, res) => {
      const { name, email, age } = req.body;
      // قم بإجراء الإجراءات اللازمة لإضافة المستخدم إلى قاعدة البيانات هنا
      res.send('تمت إضافة المستخدم بنجاح');
    });
    
    app.listen(3000, () => {
      console.log('الخادم يعمل على المنفذ 3000');
    });

     

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

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

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

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

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

     

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

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

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

    وأنصحك بقراءة التالي لتفهم الفائدة الكبيرة التي تحصل عليها جراء دراسة علوم الحاسب:

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

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

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

    لكن حاول تفقد الدورات لديك من خلال تبويب دوراتي كالتالي:

    fa734df5-3708-4e0c-9ea1-fb4d3c7d0c96.thumb.png.364ab38ae8a0a067accc7af63344893b.png

    وستجد الدورات التي قمت بالإشتراك بها، وهنا توضيح بشكل مفصل:

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

  19. الأسئلة الإختبارية لا يتم الإجابة عليها بشكل مباشر، وأنت تريد فعل ذلك من خلال لغة جافا، صحيح؟

    سأوضح لك الخطوات باستخدام لغة جافا ومكتبة java.time.LocalDate، حيث سيتعين عليك استيراد المكتبة java.time.LocalDate وjava.time.format.DateTimeFormatter لتعامل مع التواريخ وتنسيقها.

    ثم إنشاء الدالة الرئيسية (main) التي ستكون نقطة البدء لتنفيذ البرنامج.

    بعد ذلك حدد التاريخ الثابت الذي ترغب في طرحه من التاريخ الآخر،  ويجب أن يكون التاريخ في شكل نصي "yyyy/M/d" ويمكن تخزينه في متغير نصي (String).

    ثم باستخدام DateTimeFormatter، قم بتحويل النصوص إلى كائنات LocalDate.

    الآن استخدم دوال minusYears و minusMonths و minusDays لطرح التاريخ الثابت من التاريخ الآخر.

    وفي النهاية عرض النتيجة باستخدام System.out.println() بناءًا على نمط التنسيق المعين (مثلاً "yyyy/M/d").

    وبذلك ستتمكن من طرح التاريخ الثابت (constantDate) من التاريخ الآخر (otherDate) وعرض النتيجة بتنسيق "yyyy/M/d" في الإخراج القياسي، وبالطبع يمكن تحسين الكود بإضافة التحقق من صحة التواريخ المدخلة والتعامل مع الاستثناءات المحتملة.

  20. أولاً، Django هو إطار عمل ويب يستند إلى Python، بينما Angular هو إطار عمل ويب يستند إلى JavaScript.

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

    بينما في الواجهة الخلفية نستخدم Django وربطها بالواجهة الأمامية عن طريق الـ API's.

    بينما لو أردتي استخدام Django فقط فهناك حل وهو تحويل الموقع إلى Progressive Web App (PWA) فتستطيعي استخدام django-pwa  من أجل تحويل الموقع إلى نسخة قابلة للاستخدم كتطبيق على الهاتف، وهو أشبه بنسخة من الموقع للهاتف لكن على هيئة تطبيق مع ميزة التصفح بدون إنترنت.

    وفي حال أردتي بدائل للواجهة الخلفية فهناك NODE.JS في حال قمتي بتعلم  React Native فستصبح خيار ممتاز لك، لكونها بيئة عمل تعتمد على جافاسكريبت أيضًا.

    بينما Flutter يعتمد على لغة Dart.

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

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

    • شكرًا 1
  21. أرجو منك طرح الأسئلة المتعلقة بالدورات أسفل الفيديو الخاص بالسؤال في التعليقات أسفل الفيديو، وطرح الأسئلة العامة هنا.

    وبخصوص سؤالك حاول القيام بالتالي:

    sudo chown root:root /etc/vsftpd.conf

    ثم الأمر التالي:

    sudo openssl req -x509 -nodes -days 1095 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

    ثم التالي:

    service vsftpd start

    بعد ذلك الأمر التالي:

    service vsftpd reload

    ثم إعادة التشغيل:

    sudo systemctl restart vsftpd.service

    ثم التجربة:

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

  23. في حال أنك تريد استخدام كود من main.js في ملف home.js فعليك بتضمين ملف main.js أولاً حتى تصبح الدوال جاهزة ومعرفة عند استدعائها في ملف home.js حيث أن الكود يتم قراءته من الأعلى للأسفل.

     

    • أعجبني 1
  24. بالطبع فأنت بحاجة إلى تعديل الكود ليتوافق مع التغييرات التي حدثت في الإصدار 8.0.

    لذلك حاول التحقق من ملفات السكربت والصفحات الخاصة به للتأكد من عدم وجود أخطاء قوية (Fatal Errors) أو رسائل خطأ عند تشغيلها على PHP 8، بالإَضافة إلى التأكد من عدم استخدام الوظائف المتوقفة (deprecated functions) التي قد تكون تم استبدالها بوظائف جديدة في PHP 8.

    وفي حال لم تتمكن من تحديد سبب التوافقية، بإمكانك استخدام أدوات التحويل (Migration tools) المتاحة لتحويل السكربت من PHP 7 إلى PHP 8، وتلك  الأدوات تساعد في اكتشاف التغييرات التي تحتاج إلى إجرائها لتحقيق التوافقية مع PHP 8 ومنها:

    وستجد هنا الدليل الرسمي الذي يوضح طريقة عمل Migrating أو تحويل الكود من  PHP 7.4 إلى PHP 8.0، حيث يتم شرح التغييرات التي حدثت:

×
×
  • أضف...