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

Mustafa Suleiman

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

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

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

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

    315

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

  1. بالنسبة لأول سؤال.

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

    من الأدوات التي يمكن استخدامها لتعلم المفاهيم البرمجية والحصول على معلومات موثوقة هو محرك البحث جوجل. يمكنك البحث عن المفاهيم التي تريد تعلمها باستخدام كلمات مفتاحية مثل "JavaScript Prototype"، "JavaScript Inheritance" أو "JavaScript Promise Object" والتعرف على مصادر متعددة مثل مقالات، دروس فيديو، كتب، وأكثر.

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

    بالنسبة للسؤال الثاني.

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

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

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

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

    وإليك أمثلة:

    1. عند البحث عن كلمتين متتاليتين لهما علاقة ببعض يمكن استخدام العلامة (+) أو الكلمة (AND).
    2. عند البحث عن كلمة معينة مرتبطة بكلمة أخرى مع الرغبة في البحث عن الكلمة الأولى فقط يمكن استخدام العلامة (-)، وفي هذه الحالة سيقوم بإستثناء الكلمة الثانية.
    3. إذا كنت تريد البحث عن كلمة معينة مرتبطة بكلمة أخرى ولكنك تريد البحث عن الكلمة الأولى فقط، يمكنك استخدام العلامة (-)، وفي هذه الحالة سيقوم بإستثناء الكلمة الثانية.
    4. عند البحث عن كلمتين أو جملتين ليستا مرتبطتين ببعضهما يمكن استخدام (OR).
    5. عند البحث عن موضوع معين داخل موقع معين، يمكن استخدام الكلمة (:site).
    6. في حالة عدم تذكر كلمة من الكلمات التي نبحث عنها، يمكن استخدام العلامة (*).
    7. عندما نريد معرفة التوقيت المحلي الخاص بكل دولة، يمكن استخدام (+time).
    8. عند البحث عن شئ بصيغة معينة على هيئة ملفات pdf أو برامج word، يمكن استخدام كلمة (filetype).
    9. عند البحث عن مقالات وأبحاث علمية بحتة ومصادر مختلفة، يمكن استخدام (Google scholar).
    • التدريب والممارسة: تعتبر مهارة البحث الاحترافي مهارة تتطلب تدريبا وممارسة مستمرة. عندما تبدأ في البحث عن أي مفهوم جديد، يجب عليك أن تكون على دراية بالمصادر التي يمكنك الاعتماد عليها، وتشمل ذلك المواقع والمنتديات والمدونات التي تحتوي على المعلومات المفيدة. يمكنك الاعتماد على مواقع مثل Stack Overflow وMDN Web Docs وW3Schools وغيرها من المصادر الموثوقة لتعلم البرمجة والويب.

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

    بالنسبة للتدريب الفعلي

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

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

    بالنسبة للمفاهيم البرمجية التي تريد استيعابها

    Prototype:

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

    مثال:

    function Animal(name) {
      this.name = name;
    }
    
    Animal.prototype.getName = function() {
      return this.name;
    };
    
    let dog = new Animal('Rex');
    console.log(dog.getName()); // الإخراج: 'Rex'

    سأشرح لك المزيد لأهمية ذلك المفهوم في جافا سكريبت.

    في جافاسكريبت، كل شيء هو Object، ويمكننا إنشاء Object جديدة باستخدام الكلمة الرئيسية "new". وعند إنشاء Object جديدة، فإنه يتم إنشاء سلسلة من الـPrototype objects التي تتشارك فيما بينها بالمعلومات.

    ببساطة، Prototype هو عبارة عن Object template يتم استخدامه لإنشاء Object جديدة. ويحتوي Prototype على خصائص وأساليب (methods) يتم مشاركتها بين جميع الObjects التي تم إنشاؤها باستخدام الـPrototype نفسه.

    على سبيل المثال، لنفترض أن لدينا Object template يسمى "Person" يحتوي على الخصائص name و age و methods تستخدم لطباعة البيانات الخاصة بـ Person. يمكننا إنشاء Object جديدة باستخدام الـPrototype "Person" كالتالي:

    // إنشاء Prototype
    let Person = function(name, age) {
      this.name = name;
      this.age = age;
    }
    
    Person.prototype.printInfo = function() {
      console.log("My name is " + this.name + " and I am " + this.age + " years old.");
    }
    
    // إنشاء Object جديدة باستخدام الـPrototype "Person"
    let person1 = new Person("Ahmed", 25);
    person1.printInfo(); // "My name is Ahmed and I am 25 years old."

    هنا، تم إنشاء Prototype جديد "Person" يحتوي على خصائص name و age، بالإضافة إلى method "printInfo" الذي يقوم بطباعة بيانات الـPerson. وتم إنشاء Object جديد باستخدام الـPrototype "Person" باستخدام الكلمة الرئيسية "new"، وتم استخدام method "printInfo" الموجود في الـPrototype لطباعة بيانات Object الجديدة.

    Inheritance:

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

    مثال:

    function Animal(name) {
      this.name = name;
    }
    
    Animal.prototype.getName = function() {
      return this.name;
    };
    
    function Dog(name, breed) {
      Animal.call(this, name);
      this.breed = breed;
    }
    
    Dog.prototype = Object.create(Animal.prototype);
    Dog.prototype.constructor = Dog;
    Dog.prototype.getBreed = function() {
      return this.breed;
    };
    
    let dog = new Dog('Rex', 'German Shepherd');
    console.log(dog.getName()); // الإخراج: 'Rex'
    console.log(dog.getBreed()); // الإخراج: 'German Shepherd'

    Promise object:

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

    مثال:

    function getData() {
      return new Promise(function(resolve, reject) {
        setTimeout(function() {
          resolve('Data is fetched!');
        }, 2000);
      });
    }
    
    getData()
      .then(function(data) {
        console.log(data); // الإخراج: 'Data is fetched!'
      })
      .catch(function(error) {
        console.error(error);
      });
    • أعجبني 1
  2. يعتبر Windows Hosting و Web Hosting اثنين من خيارات استضافة المواقع على منصة GoDaddy، ولكل منهما ميزاته وعيوبه.

    • Windows Hosting: تتميز بدعم تقنيات Microsoft وتشغيل اللغات التي تعتمد على منصة Windows مثل ASP.NET و .NET Core و SQL Server وغيرها. يتم استخدام لوحة التحكم Plesk لإدارة الاستضافة على Windows Hosting.
    • Web Hosting: يستخدم نظام تشغيل Linux ولوحة تحكم cPanel لإدارة الاستضافة. وتعمل على دعم لغات البرمجة المختلفة مثل PHP و Python و Ruby وغيرها.

    بالنسبة لمشروع Next.js الخاص بك، يمكنك استخدام Economy Linux Hosting with cPanel لاستضافة الموقع بدلاً من Windows Hosting. فعادةً ما يتم تشغيل مشاريع Next.js على Linux بدلاً من Windows. ومع ذلك، يجب التأكد من أن إصدار Node.js الذي تستخدمه متوافق مع Economy Linux Hosting with cPanel.

    أيضًا، يجب الانتباه إلى أن استخدام Economy Linux Hosting with cPanel يعني أنه سيتم استخدام نظام تشغيل Linux، وبالتالي قد تحتاج إلى تعلم بعض المفاهيم الأساسية لنظام التشغيل Linux ولوحة تحكم cPanel إذا لم تكن لديك الخبرة الكافية في ذلك.

    وأرجو مراجعة التعليقات على سؤالك السابق للمزيد حول Economy Linux Hosting with cPanel.

    وللمزيد عن الاستضافات

    https://io.hsoub.com/hosting/87775-ما-الفرق-بين-استضافة-cloud-hosting-و-استضافة-web-hosting

    • أعجبني 1
  3. نعم، يمكنك رفع تطبيق Next.js على منصة GoDaddy باستخدام خدمة Economy Linux Hosting with cPanel.

    يمكنك استخدام cPanel لإدارة الخادم وتثبيت Node.js وnpm لتنزيل وتثبيت التبعيات اللازمة لتشغيل تطبيقك. بعد ذلك يمكنك تحميل ملفات التطبيق وإعداد الاعدادات اللازمة لتشغيل التطبيق. يرجى ملاحظة أنه يجب عليك التأكد من أن الخادم الذي تختاره يلبي متطلبات تشغيل تطبيق Next.js.

     يمكنك اتباع الخطوات التالية:

    1. اشترِ خطة استضافة من GoDaddy وقم بتسجيل الدخول إلى لوحة التحكم الخاصة بك (cPanel).

    2. قم بإعداد نطاق الويب الخاص بك واتصل به إذا لزم الأمر.
    3. قم بإنشاء قاعدة بيانات MySQL ومستخدم بمسؤولية كاملة لهذه القاعدة.
    4. حمِّل تطبيق Next.js الخاص بك إلى مجلد على الخادم (يمكنك استخدام FTP لهذا الغرض).
    5. قم بتثبيت Node.js و NPM على الخادم باستخدام SSH.
    6. قم بتنزيل وتثبيت جميع الحزم اللازمة التي يتطلبها تطبيق Next.js.
    7. قم بتكوين ملفات الإعدادات الخاصة بتطبيق Next.js الخاص بك (مثل المتغيرات البيئية ومعلومات الاتصال بقاعدة البيانات).
    8. قم بتشغيل تطبيق Next.js باستخدام SSH وأمر NPM.

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

     سأوضح لك كل خطوة بالتفصيل:

    1- شراء حزمة استضافة Linux على GoDaddy:

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

    2- إعدادات الدومين ونقل الملفات:

    بمجرد شراء الحزمة، يمكنك إعداد اسم النطاق الخاص بك ونقل ملفات Next.js إلى الخادم الخاص بك باستخدام FTP أو SFTP.

    3- تثبيت Node.js و npm:

    يجب تثبيت Node.js و npm على الخادم الخاص بك. يمكنك فعل ذلك باستخدام الأمر التالي:

    sudo apt-get install nodejs npm

    4- تثبيت PM2:

    يمكن استخدام PM2 لإدارة تطبيق Next.js وتشغيله باستمرار. لتثبيت PM2، استخدم الأمر التالي:

    npm install pm2 -g

    5- تنزيل متطلبات المشروع:

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

    npm install

    6- بناء التطبيق:

    يجب بناء تطبيق Next.js الخاص بك بواسطة npm. يمكنك فعل ذلك باستخدام الأمر التالي:

    npm run build

    7- تشغيل تطبيق Next.js:

    يمكنك تشغيل تطبيق Next.js الخاص بك باستخدام PM2. يمكنك استخدام الأمر التالي:

    pm2 start npm --name "app-name" -- start

    8- تكوين ملفات Nginx:

    يمكنك تكوين ملفات Nginx للتوجيه إلى تطبيق Next.js الخاص بك. يمكنك فعل ذلك باستخدام الأمر التالي:

    server {
        listen 80;
        server_name example.com;
        location / {
            proxy_pass http://localhost:3000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set
          _header Host $host;
    proxy_cache_bypass $http_upgrade;
    }
    }

    بعد إعداد ملف الـ Nginx، يجب تشغيله باستخدام الأمر التالي:

    sudo systemctl start nginx
    

    ويمكنك التحقق من حالة الـ Nginx باستخدام الأمر التالي:

    sudo systemctl status nginx
    

    ستظهر لك حالة الـ Nginx ويجب أن تكون "active (running)".

    أخيراً، يجب عليك فتح منفذ 80 في جدار الحماية الخاص بالخادم إذا كان مفتوحاً على منفذ آخر، باستخدام الأمر التالي:

    sudo ufw allow 80/tcp
    

    بهذا، تم إعداد خادم Nginx لتشغيل تطبيق Next.js على خادم Ubuntu 20.04.

    • أعجبني 1
  4. نعم ، الخطأ يحدث لأن طريقة الوصول إلى اسم المركز غير صحيحة في عرض الجدول. لأن الخاصية "center" لا تنتمي مباشرة إلى نموذج المستخدم "User". بدلاً من ذلك ، يجب عليك استخدام خاصية "center" الموجودة في نموذج حساب المستخدم "accounts.Center".

    يمكنك الوصول إليها باستخدام العلاقة الموجودة في نموذج المستخدم. يجب عليك تغيير السطر "center_name = request.user.center.name" إلى "center_name = request.user.account.center.name". وبالتالي ستتمكن من الحصول على اسم المركز الصحيح الذي ينتمي إليه المستخدم الحالي.

    يمكنك تحسين رمز عرض الجدول عن طريق حذف الكود المتكرر واستخدام كائن الاستعلام الواحد الذي يتم استخدامه لعرض الجدول:

    def tablebooking(request):
        if request.method == "POST":
            statform = statusform()
            if statform.is_valid():
                statform.save()
                messages.success(request, ('Your websit was successfully added!'))
            else:
                HttpResponse(request, 'Error saving form')
            return render(request, 'user/tablebooking.html',{
                'statform':statform,
            })
    
        center_name = request.user.account.center.name
        tablebooking = Appointment.objects.filter(center__name=center_name)
    
        return render(request, 'user/tablebooking.html', {
            'tablebooking' : tablebooking
        })

    يستخدم الكود request.user.account.center.name للوصول إلى اسم المركز المرتبط بحساب المستخدم. إذا كان اسم المجال لهذا الحقل مختلفًا عن account، يجب استبداله في الكود.

  5. لتصفية نتائج البحث بحسب اسم المركز، يمكن استخدام filter وتمرير معامل البحث كمعامل center في ملف views.py.

    def tablebooking(request):
        if request.method == "POST":
            statform = statusform()
            if statform.is_valid():
                statform.save()
                messages.success(request, ('Your websit was successfully added!'))
            else:
                HttpResponse(request, 'Error saving form')
            return render(request, 'user/tablebooking.html',{
                'statform':statform,
            })
    
        center_name = request.user.center.name  # افترض هنا أن اسم المركز مخزن في حساب المستخدم
        tablebooking = Appointment.objects.filter(center__name=center_name)
    
        return render(request, 'user/tablebooking.html', {
            'tablebooking' : tablebooking
        })

    يتم استخدام request.user.center.name للوصول إلى اسم المركز المخزن في حساب المستخدم. إذا كنتي تستخدمي ميزة تسجيل الدخول المدمجة في Django، فسيتم تعيين request.user لكائن User المعني بالمستخدم الحالي.

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

    • أعجبني 1
  6. يمكن تحويل الشيفرة المعطاة إلى شيفرة JSX في React عن طريق استخدام عناصر الـ JSX والمكونات. لتحويل الشيفرة إلى JSX، يمكن القيام بالتالي:

    1- يجب إنشاء ملف جديد بامتداد .jsx

    2- يمكن إنشاء مكون جديد باستخدام function component في React ويمكن إسمه SeatMap مثلاً، ويمكن إرجاع العناصر المطلوبة.

    3- يمكن إنشاء مكون آخر للصفحة بإسم Screen ويمكن أن يتم إرجاع عنصر div وتخصيصه الفئة container.

    4- يمكن إنشاء مكون آخر لعناصر الصف بإسم Row واستخدام عناصر div لتمثيل الأماكن.

    5- يمكن إنشاء مكون آخر بإسم Seat وتخصيص الفئات اللازمة وتمثيل الأماكن الشاغرة والمحجوزة بحسب المتغيرات المعطاة في الـ CSS.

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

    بالتالي، يمكن الحصول على الشيفرة JSX على النحو التالي:

    import React from 'react';
    
    function Seat() {
      return <div className="seat"></div>;
    }
    
    function Row() {
      return (
        <div className="row">
          <Seat />
          <Seat />
          <Seat />
          <Seat className="occupied" />
          <Seat className="occupied" />
          <Seat />
          <Seat />
          <Seat />
        </div>
      );
    }
    
    function Screen() {
      return (
        <div className="container">
          <div className="screen"></div>
          <Row />
          <Row />
          <Row />
          <Row />
          <Row />
        </div>
      );
    }
    
    export default Screen;

    ملاحظة: يتم استدعاء المكون الأساسي Screen في ملف JavaScript لإظهار الكود في الصفحة، ويجب تمريره عبر ReactDOM.render() في الـ index.js لعرضه في الصفحة.

    هل هناك طريقة افضل لتحسين الكود؟

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

    import React from 'react';
    
    function App() {
      const rows = [...Array(6)].map((_, index) => {
        const seats = [...Array(8)].map((_, index) => (
          <div className="seat" key={index}></div>
        ));
    
        return <div className="row" key={index}>{seats}</div>;
      });
    
      return (
        <div className="container">
          <div className="screen"></div>
          {rows}
        </div>
      );
    }
    
    export default App;

    يستخدم هذا الكود مصفوفتين متداخلتين: المصفوفة الأولى تنشئ الصفوف، والمصفوفة الثانية تنشئ الجلوسات داخل كل صف. يتم تمرير المصفوفة الثانية إلى map داخل المصفوفة الأولى لإنشاء العناصر JSX. تم إضافة key إلى العناصر لتحسين الأداء عند إعادة رسم المكون.

     

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

    https://io.hsoub.com/webdev/143704-كيف-ادفع-مبلغ-الدورة-بواسطة-حسابي-البنكي-المصري

    وسأخبرك بذلك هنا:

    تفعيل حساب باي بال مصر حتى تتمكن من استلام وسحب الأموال، من خلال الآتي:

    1. التأكد من أن الحساب مفعل من خلال رفع صورة للهوية (بطاقة الرقم القومي) وإنتظار فترة 24 ساعة لتفعيل الحساب.
    2. الآن ستحتاج إلى فيزا البريد المصري easy pay أو فيزا Yalla في حالة عدم توفر easy pay والتي يمكنك استخراجها من أي مكتب بريد رئيسي والأفضل من العتبة وشحنها بمبلغ 100 جنيه.
    3. يجب التأكد من أن الفيزا مفعلة من خلال التحدث إلى خدمة العملاء وأنها جاهزة للسحب من باي بال.
    4. بعد ذلك قم بإضافتها لحسابك على باي بال من خلال الخطوات التالية:
    5. قم بتسجيل الدخول إلى حسابك على موقع باي بال المصري.
    6. اضغط على "إدارة المحفظة" من القائمة الرئيسية.
    7. اختر "إضافة بطاقة ائتمان أو بطاقة خصم" من القائمة.
    8. أدخل تفاصيل بطاقتك، بما في ذلك رقم البطاقة وتاريخ انتهاء الصلاحية والرمز الأمني.
    9. اختر موافق.

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

    في حالة فشل البطاقة السابقةيمكنك استخراج بطاقة inspire من نوع visa من بنك اسكندرية وستحتاج إلى:

    • نموذج طلب بطاقة الخصم المباشر
    • صورة بطاقة رقم قومي سارية

    وهي الأفضل في رأي، ولكن هي بحاجة إلى مفردات دخل إذا كان سنك أكبر من 25 سنة، ويتم استخراجها من خلال فتح حساب توفير بمبلغ 1200 جنيه في حالة وجود وظيفة، أو 300 جنيه في حالة كان سنك 25 أو أقل.

    وإذا كان سنك من 16 إلى 18 فأنت بحاجة إلى أحد والديك لفتح الحساب لك.

    لمعرفة طرق الدفع الأخرى على منصة حسوب، كشراء بطاقة هدية والدفع من خلالها حيث يمكنك الدفع لشخص آخر لشرائها لك.

     

  8. يتم استخدام العناصر الدلالية(Semantic HTML elements)  بشكل عام لأسباب عدة، من أهمها:

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

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

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

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

    يمكن استخدام العنصر section في العديد من المواقف. فيما يلي بعض الأمثلة على كيفية استخدامه:

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

    <section>
      <h2>المقدمة</h2>
      <p>هنا يتم وضع نص المقدمة</p>
    </section>
    
    <section>
      <h2>فصل 1</h2>
      <p>هنا يتم وضع نص الفصل الأول</p>
    </section>
    
    <section>
      <h2>فصل 2</h2>
      <p>هنا يتم وضع نص الفصل الثاني</p>
    </section>
    
    <section>
      <h2>الخاتمة</h2>
      <p>هنا يتم وضع نص الخاتمة</p>
    </section>

    2- في صفحة تحتوي على منتجات مختلفة، يمكن استخدام العنصر section لتقسيم الصفحة إلى قسم يحتوي على المنتجات وآخر يحتوي على تقييمات العملاء.

    <section>
      <h2>المنتجات</h2>
      <ul>
        <li>منتج 1</li>
        <li>منتج 2</li>
        <li>منتج 3</li>
      </ul>
    </section>
    
    <section>
      <h2>تقييمات العملاء</h2>
      <ul>
        <li>تقييم 1</li>
        <li>تقييم 2</li>
        <li>تقييم 3</li>
      </ul>
    </section>

    3- في صفحة ويب تحتوي على قائمة طويلة من الروابط، يمكن استخدام العنصر section لتقسيم القائمة إلى أقسام مختلفة.

    <section>
      <h2>روابط المواقع الاجتماعية</h2>
      <ul>
        <li><a href="#">رابط 1</a></li>
        <li><a href="#">رابط 2</a></li>
        <li><a href="#">رابط 3</a></li>
      </ul>
    </section>
    
    <section>
      <h2>روابط المواقع الإخبارية</h2>
      <ul>
        <li><a href="#">رابط 1</a></li

     

  9. نعم، يمكنك إقلاع نظام Ubuntu من الهارد الخارجي دون أي ضرر على نظام Windows 10 المثبت على الهارد الداخلي. يجب عليك فقط التأكد من أن إعدادات الإقلاع في جهاز الكمبيوتر الخاص بك مُعدَّة للسماح بالإقلاع من وسائط التخزين الخارجية، وذلك من خلال تغيير ترتيب الإقلاع في BIOS أو UEFI.

    عند البدء في عملية الإقلاع، سيظهر لك شاشة تحتوي على قائمة بخيارات الإقلاع المتاحة، ومن هناك يمكنك اختيار الهارد الخارجي لتشغيل نظام Ubuntu. وبعد الانتهاء من استخدام Ubuntu، يمكنك إعادة تشغيل الكمبيوتر واختيار الهارد الداخلي للعودة إلى نظام Windows 10 الذي تم تثبيته على الهارد الداخلي.

    حسنًا، هنا خطوات مفصلة لإقلاع نظام Ubuntu من الهارد الخارجي بأمان:

    1. قم بتوصيل الهارد الخارجي بجهاز الكمبيوتر الذي يحتوي على نظام Windows 10 المثبت على الهارد الداخلي.
    2. قم بتشغيل الكمبيوتر واضغط مرارًا على مفتاح الوصول للبيوس أو UEFI (مثل Delete أو F2 أو F10 أو F12 أو Esc) حتى يتم فتح واجهة BIOS أو UEFI. يمكنك العثور على الزر الصحيح لجهاز الكمبيوتر الخاص بك عبر الإنترنت أو في دليل المستخدم الخاص به.
    3. بمجرد الدخول إلى واجهة BIOS أو UEFI، قم بالتنقل إلى القائمة المسؤولة عن ترتيب الإقلاع. قد يكون اسم القائمة مختلفًا اعتمادًا على نوع جهاز الكمبيوتر الخاص بك.
    4. اختر الهارد الخارجي من بين القائمة المتاحة للإقلاع. قم بتحريكه إلى الأعلى حتى يتم تحديده كخيار إقلاع أولي. تأكد من حفظ الإعدادات الجديدة.
    5. قم بإعادة تشغيل الكمبيوتر. سيعمل الكمبيوتر على الآن من الهارد الخارجي.
    6. ستحتاج إلى إدخال اسم المستخدم وكلمة المرور الخاصة بك لتسجيل الدخول إلى نظام Ubuntu. بعد الدخول، يمكنك البدء في استخدام Ubuntu كما تشاء.
    7. عند الانتهاء من استخدام Ubuntu، قم بإيقاف التشغيل الكمبيوتر وفصل الهارد الخارجي.
    8. يمكنك الآن تشغيل الكمبيوتر واختيار الهارد الداخلي للعودة إلى نظام Windows 10. لا تنسَ حفظ الإعدادات الجديدة للترتيب في BIOS أو UEFI إذا كنت ترغب في العودة إلى الإقلاع من الهارد داخلي.

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

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

     

    • أعجبني 1
  10. لإستقبال الـ input من المستخدم في Node.js وإرساله إلى قاعدة البيانات SQLite ، يمكنك إتباع الخطوات التالية:

    1- تثبيت SQLite:

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

    npm install sqlite3

    2- فتح قاعدة البيانات:

    يمكنك فتح قاعدة البيانات باستخدام دالة Database الموجودة في مكتبة SQLite. يمكنك استخدام الأمر التالي لفتح قاعدة البيانات:

    const sqlite3 = require('sqlite3').verbose();
    const db = new sqlite3.Database(':memory:'); // يمكن تعيين المسار واسم ملف قاعدة البيانات هنا بدلاً من ':memory:'

    3- إنشاء جدول:

    يمكنك إنشاء جدول باستخدام دالة run() المتاحة في مكتبة SQLite. يمكنك استخدام الأمر التالي لإنشاء جدول:

    db.run('CREATE TABLE users (id INT, name TEXT, email TEXT)');

    4- إدخال البيانات:

    يمكن إدخال البيانات باستخدام دالة run() مرة أخرى. يمكنك استخدام الأمر التالي لإدخال بيانات مستخدم:

    const id = 1;
    const name = 'John Doe';
    const email = 'john.doe@example.com';
    
    db.run(`INSERT INTO users(id, name, email) VALUES(?, ?, ?)`, [id, name, email], function(err) {
      if (err) {
        return console.log(err.message);
      }
      console.log(`A row has been inserted with rowid ${this.lastID}`);
    });

    يمكن تغيير id و name و email إلى المدخلات المستلمة من المستخدم.

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

  11. MathType هو برنامج يسمح لك بإنشاء وتحرير الصيغ الرياضية في مستندات الوورد والويب. يمكنك استخدام MathType مع PHP عن طريق استخدام البرمجة المباشرة للاتصال بالبرنامج وتوليد الصيغ الرياضية.

    لربط برنامج MathType بموقع مكتوب باستخدام PHP، يجب تنفيذ الخطوات التالية:

    1- تأكد من أن برنامج MathType مثبت على جهاز الخادم الخاص بك.

    • تنزيل إضافة mbstring: هي إضافة PHP مهمة تتيح العمل مع النصوص المتعددة البايت. يمكن تنزيلها عن طريق مدير حزم PHP أو بتثبيتها يدويًا.
    • نسخ المجلد generic_wiris: هو المجلد الذي يحتوي على ملفات MathType الأساسية. يمكن العثور عليها في مجلدات الإضافة المثبتة لـ MathType. يجب نسخ هذا المجلد ووضعه في ال root الخاص بالخادم.
    • تهيئة الملف configuration.ini: يحتوي هذا الملف على الإعدادات الأساسية لنظام MathType. يجب فتحه وضبط الإعدادات التي تريدها، مثل نوع الرسومات وحجم الخط ولغة العرض وغيرها.
    • تهيئة صلاحيات المستخدم: يجب أن يكون للمستخدم صلاحيات تنفيذ لمحتويات المجلد generic_wiris/integration. هذا يمكن تحقيقه عن طريق تعيين الصلاحيات الصحيحة للملفات والمجلدات.

    2- قم بإنشاء نموذج HTML يحتوي على مربع نص يحتوي على صيغة رياضية تريد إدراجها باستخدام MathType. في هذا المثال، نحن سنستخدم مكتبة jQuery للوصول إلى مربع النص وإرسال النص إلى برنامج MathType.

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>MathType Demo</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
        <script type="text/javascript" src="http://localhost/mathtype/MathType.js"></script>
    </head>
    <body>
        <input type="text" id="mathInput" name="mathInput" />
        <button onclick="sendToMathType()">Insert MathType Formula</button>
        <script>
            function sendToMathType() {
                var mathText = $('#mathInput').val();
                if (mathText !== '') {
                    var mathML = MathType.ConvertEquation(mathText, "MathML");
                    window.opener.InsertMathML(mathML);
                    window.close();
                }
            }
        </script>
    </body>
    </html>

    3- تنفيذ الاتصال مع برنامج MathType باستخدام PHP. في هذه المرحلة، يتم إرسال النص من النموذج إلى PHP ومن ثم يتم إرساله إلى MathType للتحويل إلى صيغة MathML.

    <?php
    // تأكد من أن $mathInput هو اسم حقل نص الرياضيات في النموذج الخاص بك.
    $mathInput = $_POST['mathInput'];
    
    // قم بإرسال نص الرياضيات إلى MathType لتحويله إلى MathML.
    $url = 'http://localhost/mathtype/MTScript.php?equation=' . urlencode($mathInput) . '&format=MathML';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    curl_close($ch);
    
    // يجب عرض نتيجة MathML على صفحة الويب باستخدام العلامة <math> المدعومة بالمتصفح.
    // يمكن استخدام النص المنتج لإنشاء العلامة <math> المطلوبة باستخدام PHP DOMDocument.
    $dom = new DOMDocument();
    $dom->loadXML($result);
    $mathml = $dom->saveXML($dom->getElementsByTagName('math')->item(0));
    
    // ثم قم بعرض النتيجة على صفحة الويب باستخدام علامة <math> في النموذج الخاص بك.
    echo '<div>' . $mathml . '</div>';
    ?>

    يرجى ملاحظة أن الكود يستخدم cURL للاتصال بـ MathType على localhost. قم بتعديل عنوان URL في حال كان يتم استضافة MathType على مضيف آخر.

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

    وفيما يلي الكود الذي يقوم بإجراء كل هذه الخطوات:

    // تعريف الصيغة
    $formula = 'x^2 + y^2 = z^2';
    
    // ترميز الصيغة
    $encoded_formula = urlencode($formula);
    
    // جلب النتيجة من موقع مكتوب
    $url = 'http://www.sitename.com/cgi-bin/mathtype.cgi?eq=' . $encoded_formula;
    $result = file_get_contents($url);
    
    // فك ترميز النتيجة
    $decoded_result = urldecode($result);
    
    // طباعة النتيجة
    echo $decoded_result;

    يمكن تغيير قيمة المتغير $formula إلى أي صيغة رياضية أخرى، وستتم معالجتها بنفس الطريقة. ويمكن أيضًا تعديل قيمة المتغير $url ليشير إلى الموقع الذي يتم فيه استضافة برنامج MathType.

    • أعجبني 1
  12. لتحقيق هذا الهدف، يمكنك استخدام خاصية "exclude" في webpack لإخراج هذه الملفات من عملية التجميع. يمكنك تعديل قواعد Webpack الخاصة بك كما يلي:

    module: {
      rules: [
        {
          test: /\.(ts|json)$/i,
          exclude: /src\/api\/mock/,
          use: [
            // add your loader(s) here
          ],
        },
      ],
    },

    في هذا المثال، سيتم استبعاد أي ملف ينتهي بامتداد .ts أو .json من المجلد "src/api/mock" من عملية التجميع. يرجى ملاحظة أن خاصية "exclude" تستخدم الآن مع تعبيرات العادات النمطية (regular expressions) بدلاً من السلسلة النصية التي تم استخدامها في السؤال الأصلي.

    بمجرد استخدام هذه القاعدة، يجب أن تلاحظ أن Webpack لن يتضمن أيًا من ملفات ts أو JSON في مجلد "src/api/mock" في ملفات الإنتاج النهائية.

     

  13. يمكنك تحقيق هذا الأمر باستخدام CSS. يمكنك استخدام خاصية background-size لتحديد حجم الخلفية وتعديلها حتى تملأ الجانب الأيمن من الصفحة. يمكنك استخدام القيمة "cover" لتعديل حجم الخلفية حتى تملأ الصفحة بالكامل بما فيها الجانب الأيمن.

    على سبيل المثال، يمكنك استخدام الكود التالي في CSS:

    body {
      background-image: url("your-background-image.jpg");
      background-size: cover;
      background-position: center;
    }

    حيث "your-background-image.jpg" هو اسم ملف الصورة الخاص بالخلفية الذي تريد استخدامه. تعديل قيمة background-position إذا كنت تريد تغيير موضع الصورة.

    هذا الكود سيجعل الخلفية تملأ الصفحة بالكامل بما فيها الجانب الأيمن.

     

  14. الخطأ الموجود في ملف upload.js يحدث بسبب عدم العثور على الكائن Dropzone، وهو غالبًا يعني عدم تحميل المكتبة المطلوبة بشكل صحيح. يجب التأكد من أن تم تضمين مكتبة Dropzone بشكل صحيح قبل استخدامها.

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

    وإليك مثال.

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>My Upload Page</title>
        <!-- قم بتضمين Dropzone CSS -->
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/dropzone.min.css" />
    </head>
    <body>
        <h1>Upload Your Files Here</h1>
        <form action="/upload" class="dropzone"></form>
        <!-- قم بتضمين Dropzone JS -->
        <script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.js"></script>
    <script src="./upload.js"></script>
    </body>
    </html>

    في هذا المثال، يتم تضمين مكتبة Dropzone باستخدام CDN عن طريق وضع روابط CSS و JS في الصفحة HTML.

            Dropzone.autoDiscover = false;
            const myDropzone = new Dropzone('.dropzone', {
                url: '/upload',
                success: function(file, response) {
                    console.log('Upload success', response);
                },
                error: function(file, response) {
                    console.error('Upload error', response);
                }
            });

    يتم استخدام الأمر Dropzone.autoDiscover = false; لمنع Dropzone من البحث عن عناصر HTML التي يمكن تحويلها إلى مناطق إسقاط، ويتم إنشاء منطقة الإسقاط باستخدام الفئة .dropzone في عنصر النموذج. يتم تعيين مسار العمل المطلوب للإرسال إلى الخادم في خاصية url. يمكن تحديد مزيد من الإعدادات والخيارات لـ Dropzone باستخدام خيارات التكوين المختلفة.

    للمزيد:

  15. الدالة findOdd تستقبل مصفوفة (Array) A وتقوم بإرجاع العدد الذي يحدث فيه تكرارات فردية.

    مثلاً إذا كانت المصفوفة A هي [1, 2, 3, 2, 3, 1, 3]، فإن الدالة ستعيد القيمة 3، لأن العدد 3 هو الوحيد الذي يتكرر في المصفوفة بتكرار فردي.

    الكود يبدأ بتعريف دالة جديدة تسمى count والتي تستقبل مصفوفة (Array) arr وقيمة val، وتقوم بإرجاع عدد مرات تكرار val في المصفوفة arr. وتستخدم الدالة filter لتصفية القيم التي تساوي val ومن ثم حساب طول المصفوفة الناتجة.

    بعد ذلك، يتم تعريف متغير target وتعيينه بقيمة الصفر.

    تمر الدالة forEach على كل عنصر في المصفوفة A، وتستخدم دالة count لحساب عدد مرات تكرار العنصر في المصفوفة A. ثم يتم فحص ما إذا كان هذا العدد فرديًا أم لا، وذلك باستخدام العملية الرياضية % للتحقق مما إذا كان العدد الذي يمثل تكرارات العنصر في المصفوفة زوجيًا أم لا. إذا كان عدد التكرارات فرديًا، يتم تعيين قيمة العنصر الموجود حاليًا في الدورة الحالية إلى المتغير target.

    أخيراً، تعيد الدالة قيمة المتغير target الذي يمثل العدد الذي يحدث فيه تكرارات فردية في المصفوفة.

    المثال السابق:

    • في الدورة الأولى، سيتم حساب عدد مرات تكرار الرقم 1، الذي يساوي 2، لأن الرقم 1 يتكرر مرتين في المصفوفة A.
    • في الدورة الثانية، سيتم حساب عدد مرات تكرار الرقم 2، الذي يساوي 2، لأن الرقم 2 يتكرر مرتين في المصفوفة A.
    • في الدورة الثالثة، سيتم حساب عدد مرات تكرار الرقم 3، الذي يساوي 3، لأن الرقم 3 يتكرر ثلاث مرات في المصفوفة A.
    • في الدورة الرابعة، سيتم حساب عدد مرات تكرار الرقم 2 مرة أخرى، الذي يساوي 2، لأن الرقم 2 يتكرر مرتين في المصفوفة A.
    • في الدورة الخامسة، سيتم حساب عدد مرات تكرار الرقم 3 مرة أخرى، الذي يساوي 3، لأن الرقم 3 يتكرر ثلاث مرات في المصفوفة A.
    • في الدورة السادسة، سيتم حساب عدد مرات تكرار الرقم 1 مرة أخرى، الذي يساوي 2، لأن الرقم 1 يتكرر مرتين في المصفوفة A.
    • في الدورة السابعة، سيتم حساب عدد مرات تكرار الرقم 3 مرة أخرى، الذي يساوي 3، لأن الرقم 3 يتكرر ثلاث مرات في المصفوفة A.

    بعد ذلك، سيتم فحص ما إذا كان العدد الذي تم حساب تكراراته فرديًا أم لا باستخدام الشرط count(A, arrnum) % 2 !== 0، وإذا كانت الشرط صحيحة، فإن قيمة العدد الذي يمثل تكراراته ستتم تعيينها إلى المتغير target.

    أخيرًا، يتم إرجاع قيمة المتغير target الذي يمثل العدد الذي يحدث فيه تكرارات فردية في المصفوفة A.

     

    إذا قمت بتنفيذ الدالة findOdd([1, 2, 3, 2, 3, 1, 3])، فستعيد الدالة القيمة 3، لأن العدد 3 هو العدد الذي يتكرر في المصفوفة 3 مرات، وهو يحدث فيه تكرارات فردية.

     

    • شكرًا 1
  16. نعم، هناك عدة أشياء يمكنك التحقق منها قبل شراء استضافة من شركة GoDaddy لضمان أنها تلبي احتياجات مشروع Next.js الخاص بك، وتشمل هذه الأشياء:

    1. دعم Node.js: تأكد من أن GoDaddy تدعم Node.js على الخوادم الخاصة بها، وأن الإصدار المدعوم هو الإصدار الذي يدعمه مشروع Next.js الخاص بك.
    2. السعر والتكلفة: تأكد من أن تكلفة الاستضافة من GoDaddy تتناسب مع ميزانيتك، وأنه لا توجد تكاليف مخفية أو رسوم إضافية غير متوقعة.
    3. الأمان: تحقق من أن GoDaddy توفر خدمات أمنية مثل الحماية من الاختراق والنسخ الاحتياطي المنتظم للبيانات الخاصة بك.
    4. الدعم الفني: تحقق من أن GoDaddy توفر دعمًا فنيًا على مدار الساعة، ويفضل أن يكون هذا الدعم عبر الهاتف أو الدردشة المباشرة.
    5. سمعة الشركة: تحقق من سمعة GoDaddy في السوق والمراجعات التي تم نشرها على الإنترنت، والتي يمكن أن تساعدك في تقييم جودة الخدمات التي تقدمها الشركة.

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

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

    يمكنك رفع مشروع Next.js على GoDaddy باستخدام الخطوات التالية:

    1. قم بتسجيل الدخول إلى حساب GoDaddy الخاص بك.
    2. اختر خيار "استضافة المواقع" من القائمة الرئيسية.
    3. انتقل إلى صفحة "الملفات" وانقر على زر "إنشاء مجلد جديد" لإنشاء مجلد جديد لمشروعك.
    4. ارفع ملفات مشروع Next.js الخاص بك إلى المجلد الجديد باستخدام خيار "رفع الملفات".
    5. انتقل إلى صفحة "تكوينات node" وانقر على زر "إضافة تكوين جديد" لإنشاء تكوين جديد لمشروعك.
    6. قم بتحديد مجلد الرئيسي لمشروعك وأدخل الإصدار المناسب من Node.js في الحقل المخصص.
    7. احفظ التكوين الجديد وانتظر قليلاً حتى يتم تنشيطه.
    8. انتقل إلى صفحة "DNS" وانقر على زر "إضافة سجل" لإضافة سجل CNAME جديد.
    9. أدخل اسم المضيف المطلوب (على سبيل المثال، اسم مجلد مشروعك) وقم بإدخال "القيمة" باستخدام عنوان IP الخاص بموقع GoDaddy الخاص بك.
    10. احفظ الإعدادات وانتظر قليلاً حتى تتم مزامنة التغييرات.
    11. انتقل إلى متصفح الويب الخاص بك وأدخل عنوان المضيف الجديد الذي أنشأته في الخطوة 9.

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

     

    • أعجبني 1
  17. بتاريخ 1 ساعة قال أحمد رضا5:

    إضافة جيدة ولكن لن تكون لها فائدة كبيرة الا في أحجام  الشاشة الصغيرة عندما تكون العناصر بهذا الشكل:

    Capture3.PNG.71dd67d24e26bb8ece75f1e21f271c4d.PNG

    ولكن في باقي أحجام الشاشات ستكون بهذا الشكل:Capture.PNG.e2465e6f1db3fed1781c8a878d7365e5.PNG

    وبالنسبة للكود لهذا الكود :

    فستكون نتيجته هكذا في احجام الشاشات الصغيرة وسنحتاج الي عمل Scroll حتي نرى باقي العناصر:Capture4.PNG.d68802e81c72e2ac99cdc8cde09aa4ff.PNG

    وبالنسبة لوضع العنصر Button داخل العنصر a ليست أفضل ممارسة غير ذلك ستظهر بعض المشاكل مثل الخطوط التي تظهر بجانب كل زر

    Capture2.PNG

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

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

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

    1. لفعل ذلك، يمكنك تنفيذ الخطوات التالية:

    2. انتقل إلى مجلد المشروع على جهاز الكمبيوتر الخاص بك.

    3. في مجلد المشروع، ابحث عن ملف build.gradle وافتحه باستخدام محرر النصوص المفضل لديك.

    4. ابحث عن القسم signingConfigs وتأكد من أن جميع القيم المطلوبة معبأة بشكل صحيح.

    أضف الكود التالي في ملف build.gradle داخل القسم android:

    signingConfigs {
        debug {
            storeFile file('debug.keystore')
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            v1SigningEnabled true
            v2SigningEnabled true
        }
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    5. حفظ الملف.

    6. في نافذة Android Studio، قم بالنقر فوق Build من القائمة العلوية ، ثم Clean Project.

    7. قم بالنقر فوق Build ، ثم Rebuild Project.

    8. قم بتشغيل التطبيق مرة أخرى.

    إذا استمرت المشكلة، فيمكنك تشغيل الأمر --stacktrace لعرض المزيد من المعلومات عن المشكلة.

    وأيضًا قم بالرجوع إلى الإجابات على السؤال التالي وتجربة الحلول المطروحة في حال استمرار المشكلة.

     

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

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

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

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

    وإذا كنت في البداية وتريد تعلم البرمجة فيجب عليك قراءة المقالات التالية فسترشدك إلى الطريق السليم.

     

     

    ويمكنك الرجوع إلى الإجابات على السؤال التالي:

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

    https://academy.hsoub.com/learn/javascript-application-development/

    • أعجبني 1
  20. في حالة وجود margin-bottom سيوجد مسافة في النهاية خاصة بعنصر a الأخير وهو ما لا نريده، ففي الصورة المطلوبة يريد حذف المسافات بالكامل، الكود سليم ويمكن إصلاحه من خلال تعديل كود css بإضافة:

    .qlink:not(:last-child){
       margin-bottom: 7px;
    }

    ويصبح كود CSS كالتالي:

    .box{
       border-style:solid;
          display: inline-block ;
    }
    .qlink {
          display:block;
          text-align:center;
          color: white;
          width: 150px;
          padding:16px 0;
          text-decoration:none;
          font-size: 12px;
          font-weight: bold;
          background-color: #1F70C4;
        }
    .qlink:not(:last-child){
       margin-bottom: 7px;
    }
        .qlink:hover {background: #2484E9;}
        .qlink:active {background: #155292;}
    بتاريخ 4 ساعة قال أحمد رضا5:

    هذه المشكلة نتيجة للكود التالي:

    margin: 7px;
     

    وهو ما يضيف هذه المسافات 

    قم بوضع مسافة اسفل الزر فقط :

          margin-bottom: 7px;
     

    ويفضل عدم وضع العنصر Button داخل العنصر a يمكنك تأدية نفس الوظيفة باستخدام بعض التنسيقات 

    فيكون الكود كالتالي:

    <div class="box" >
        <a class="qlink" href="https://google.com/1">
          Awards
        </a>
    
        <a class="qlink" href="https://google.com/2">
          Directory
        </a>
    
        <a class="qlink" href="https://google.com/3">
          Patent
        </a>
    
        <a class="qlink" href="https://google.com/4">
          Calendar
        </a>
    
        <a class="qlink" href="https://google.com/5">
          Leave Request Tool
        </a>
    
        <a class="qlink" href="https://google.com/6">
          Publications
        </a>
      </div>
     
    .box{
       border-style:solid;
          display: inline-block ;
    }
    .qlink {
          display:block;
          text-align:center;
          color: white;
          width: 150px;
          padding:16px 0;
          text-decoration:none;
          font-size: 12px;
          font-weight: bold;
          background-color: #1F70C4;
          margin-bottom: 7px;
        }
        .qlink:hover {background: #2484E9;}
        .qlink:active {background: #155292;}
     

     

    وفي حال أراد السائل إبقاء الكود الخاص به كما هو، فيجب تعديله ليصبح بالشكل التالي:

    HTML

    <div class='container'>
        <a href="https://google.com/1">
          <button class="qlink">Awards</button>
        </a>
    
        <a href="https://google.com/2">
          <button class="qlink">Directory</button>
        </a>
    
        <a href="https://google.com/3">
          <button class="qlink">Patent</button>
        </a>
    
        <a href="https://google.com/4">
          <button class="qlink">Calendar</button>
        </a>
    
        <a href="https://google.com/5">
          <button class="qlink">Leave Request Tool</button>
        </a>
    
        <a href="https://google.com/6">
          <button class="qlink">Publications</button>
        </a>
      </div>

    CSS

    div {
      width: max-content;
      text-align: center;
      border-style:solid;
      margin: auto;
    }
    
    .qlink {
          border: none;
          background-color: #1F70C4;
          color: white;
          height: 35px;
          width: 150px;
          font-size: 12px;
          display: inline-block;
          font-weight: bold;
        }
        .qlink:hover {background: #2484E9;}
        .qlink:active {background: #155292;}

    فالمشكلة كانت في إزالة الـ margin الخاصة بالأزرار ثم ضبط عرض الـ div الأب الذي يحوي كافة العناصر ليصبح عرضه هو نفس عرض المحتوى بداخله من خلال   width: max-content; 

    1055554698_Screenshot2023-02-23163220.thumb.png.802ea0bb3c1f6b9df9ea762e197f3fd6.png

    • أعجبني 1
  21.  المشكلة في إعدادات Webpack. يجب أن تكون إعدادات الإخراج في Webpack تطابق المسار الذي يتم استخدامه في ملف الخادم (server) Express.

    عندما تحاول الوصول إلى ملف "index_bundle.js" من ملف Express، يجب أن تكون الإعدادات الخاصة بمسار الإخراج في Webpack مطابقة للمسار الذي يتم استخدامه في الصفحة HTML. في هذه الحالة، يجب على Webpack إخراج الملف إلى المسار "public/index" ويجب أن يتم الوصول إليه عبر المسار "/public/index/index_bundle.js".

    لحل المشكلة، يجب تغيير إعدادات الإخراج في Webpack كما يلي:

    module.exports = {
    entry: './app/index/index.js',
    output: {
    path: path.resolve(__dirname, 'public/index'),
    publicPath: '/public/index/', // تغيير المسار إلى "/public/index/"
    filename: 'index_bundle.js'
    },
    // ...
    };

    ومن ثم يجب استخدام هذا المسار في Express:

    app.use("/public/index", express.static(__dirname + "/public/index")); // استخدام "/public/index" بدلاً من "/"

    وبذلك يجب أن يكون بإمكانك الآن الوصول إلى "index_bundle.js" عبر المسار "http://localhost:3000/public/index/index_bundle.js".

  22. لتمكين التحديث التلقائي (hot reloading) في webpack-dev-server ، يجب إضافة خيار --hot إلى أمر البدء (start script) في package.json كما يلي:

    "scripts": {
        "start": "webpack-dev-server --mode development --inline --progress --hot",
        "build": "webpack --mode production"
    },

    بمجرد إضافة --hot ، سيتم تشغيل خادم التطوير بشكل تلقائي ويقوم بالتحديث التلقائي للملفات بمجرد حفظ التغييرات.

    إذا كنت ترغب في تشغيل التحديث التلقائي لـ webpack-dev-server عند استخدام VSCode، يمكنك استخدام ميزة "Tasks" الخاصة بـ VSCode. يمكنك إنشاء مهمة تشغيل webpack-dev-server في ملف tasks.json في مجلد .vscode في مشروعك.

    يمكنك إنشاء الملف بنفسك من خلال القائمة المنسدلة Terminal في القائمة الرئيسية، ثم اختيار Configure Tasks وإنشاء ملف جديد.

    يجب أن تكون هذه هي المهمة التي يجب تضمينها في tasks.json:

    {
      "version": "2.0.0",
      "tasks": [
        {
          "label": "start",
          "type": "npm",
          "script": "start",
          "group": {
            "kind": "build",
            "isDefault": true
          },
          "problemMatcher": "$tsc"
        }
      ]
    }

    في هذه الحالة، ستعمل هذه المهمة على تشغيل الأمر npm start والذي يشغل webpack-dev-server. عند الانتهاء من إنشاء الملف، يمكنك تشغيل المهمة من خلال الضغط على Ctrl+Shift+B في VSCode، واختيار المهمة start، مما سيقوم بتشغيل webpack-dev-server والسماح لك بالتحديث التلقائي.

  23. بتاريخ 39 دقائق مضت قال أحمد رضا5:

    يمكنك عمل ذلك باستخدام HTMl  فقط بدون الحاجة الي استخدام js :

     

        <form
          action="mailto:yourEmail@gmail.com"
          method="POST"
          encType="multipart/form-data"
        >
                <input type="email" name="email-form"  placeholder="Email" />
        </form>
     

    وبهذا يمكنك ارسال محتوي الفورم الي بريدك الإلكتروني مباشرة

    ويمكنك عمل نفس الفكرة ونظام الإشتراك في البريد باستخدام JavaScript بشكل متقدم عن طريق بعض المكتبات مثل:

    • Nodemailer
    • EmailJS

     لا يمكن استخدام "mailto:" في عنوان الإجراء (action) في النموذج لإرسال البريد الإلكتروني من خلال الجانب العميل (المتصفح)، بل يستخدم فقط لفتح برنامج البريد الإلكتروني على الكمبيوتر المحلي.

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

    يمكن تنفيذ نموذج البريد الإلكتروني باستخدام HTML و CSS و JavaScript بالشكل التالي، لكن سيتطلب معالجة البيانات المرسلة بواسطة php او node.js في الخلفية:

    HTML:

    <form id="email-form" method="POST">
      <label for="email">البريد الإلكتروني:</label>
      <input type="email" id="email" name="email" placeholder="ادخل بريدك الإلكتروني" required>
    
      <button type="submit" id="submit-btn">اشتراك</button>
    </form>
    
    <div id="success-msg" class="hidden">تم إرسال البريد الإلكتروني بنجاح.</div>
    <div id="error-msg" class="hidden">حدث خطأ أثناء إرسال البريد الإلكتروني، يرجى المحاولة مرة أخرى.</div>

    CSS:

    .hidden {
      display: none;
    }

    JavaScript:

    const form = document.querySelector('#email-form');
    const submitBtn = document.querySelector('#submit-btn');
    const successMsg = document.querySelector('#success-msg');
    const errorMsg = document.querySelector('#error-msg');
    
    form.addEventListener('submit', function(event) {
      event.preventDefault();
      const emailInput = document.querySelector('#email');
      const emailValue = emailInput.value;
    
      fetch('path/to/email/handler.php', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
        },
        body: `email=${emailValue}`
      })
      .then(response => {
        if (response.ok) {
          // إخفاء زر الإرسال وعرض رسالة النجاح
          submitBtn.classList.add('hidden');
          successMsg.classList.remove('hidden');
        } else {
          // إخفاء زر الإرسال وعرض رسالة الخطأ
          submitBtn.classList.add('hidden');
          errorMsg.classList.remove('hidden');
        }
      })
      .catch(error => {
        console.error(error);
        // إخفاء زر الإرسال وعرض رسالة الخطأ
        submitBtn.classList.add('hidden');
        errorMsg.classList.remove('hidden');
      });
    });

    يستخدم fetch() لإرسال طلب POST إلى ملف المعالجة handler.php، مع إرفاق رأس Content-Type والجسم المحتوي على بيانات البريد الإلكتروني. يتم التعامل مع الاستجابة باستخدام then()، حيث يتم التحقق من معلومة الحالة للاستجابة وإظهار رسالة النجاح أو الخطأ وفقًا لذلك. يتم التعامل مع أي أخطاء باستخدام catch()، حيث يتم عرض رسالة الخطأ في هذه الحالة. يمكن تغيير الملف المعالج و Content-Type حسب حاجتك وتكوين الخادم الذي تستخدمه.

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

     

    • Mailchimp: يتيح Mailchimp إنشاء نماذج الاشتراك المخصصة التي يمكن تضمينها في موقعك باستخدام كود HTML الذي توفره الخدمة.
    • Constant Contact: هذه الخدمة تتيح إنشاء نماذج الاشتراك بشكل سهل وبدون الحاجة إلى كتابة الكود بنفسك.
    • AWeber: هذه الخدمة تتيح إنشاء نماذج الاشتراك المخصصة بسهولة وتضمنها في موقعك باستخدام الكود HTML الذي توفره الخدمة.
    • GetResponse: يتيح GetResponse إنشاء نماذج الاشتراك المخصصة التي يمكن تضمينها في موقعك باستخدام كود HTML الذي توفره الخدمة.

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

    • شكرًا 1
  24. عندما تستورد الصورة باستخدام import كما فعلت في Img ، فإن Webpack يأخذ الملف المحدد ويقوم بتضمينه في ملف الإخراج (bundle.js) كما هو مفصل في الخيار type: 'asset/resource' الموجود في ملف webpack.config.js الخاص بك.

    عند استخدام مسار نسبي للصورة كما هو موضح في option-2 ، فإن Webpack لا يستطيع العثور على الملف لأنه يحاول البحث عنه في مجلد الإخراج (dist) وليس في مجلد الصور الخاص بالتطبيق (images).

    لتجنب هذا الخطأ، يمكنك استخدام مسارات نسبية مع webpack باستخدام publicPath في output، والذي يتم تعيينه إلى './' لجعل الملفات الموجودة في مجلد الصور الخاص بك متاحة للتطبيق. يمكنك أيضًا إضافة publicPath في file-loader كما يلي:

    {
       test: /\.(png|svg|jpg|jpeg|gif)$/i,
       type: 'asset/resource',
       generator: {
          filename: 'static/images/[hash][ext][query]'
       },
       publicPath: './'
    },

    عند الانتهاء من ذلك ، يجب أن يعمل الأمر عند استخدام المسار النسبي:

    <img src='./images/test.jpg' alt="test-2" />

    وتأكد من تأكيد وجود مجلد static/images في مجلد الإخراج (dist).

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

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

    1- تثبيت برنامج خادم الويب: يمكن استخدام أي برنامج خادم ويب مثل XAMPP أو WAMP أو Apache أو laragon لإنشاء خادم ويب. يوفر هذا البرنامج خادم ويب وقاعدة بيانات و PHP. يمكنك تنزيل البرنامج من موقع الويب الرسمي وتثبيته على جهازك.

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

    3- تعيين عنوان IP ثابت لجهازك: تعيين عنوان IP الثابت يعني تحديد عنوان الإنترنت الخاص بجهاز الكمبيوتر الخاص بك بشكل دائم، والذي يتم تعيينه يدويًا. يختلف هذا عن العنوان الديناميكي الذي يتم تعيينه تلقائيًا عند الاتصال بالإنترنت.

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

    sia_top.thumb.webp.af50ccf04c7a48061f4b2637c3668059.webp

    4- إعداد المنافذ اللازمة: يجب فتح المنافذ الخاصة بالويب سيرفر على جدار الحماية الخاص بالجهاز، للسماح لأي شخص في الشبكة بالوصول إلى الويب سيرفر. يجب فتح المنافذ 80 لبرتوكول HTTP و 443 لبروتوكول HTTPS.

     سأشرح الخطوات اللازمة لفتح المنافذ على راوتر من نوع TP-Link Archer C7.

    • تسجيل الدخول إلى لوحة التحكم الخاصة بالراوتر: افتح متصفح الويب الخاص بك واكتب عنوان IP الافتراضي الخاص بالراوتر في شريط العنوان (عادةً ما يكون 192.168.0.1 أو 192.168.1.1). سيطلب منك إدخال اسم مستخدم وكلمة مرور لتسجيل الدخول إلى لوحة التحكم.
    • الوصول إلى قسم إعدادات المنافذ: بمجرد تسجيل الدخول إلى لوحة التحكم، انتقل إلى قسم "Advanced" (متقدم) ثم اختر "Port Forwarding" (توجيه المنافذ).

    • إضافة إعدادات التوجيه: اختر "Add New" (إضافة جديدة) لإنشاء إعدادات التوجيه الجديدة. سيطلب منك تحديد اسم الجهاز (عادةً ما يكون اسم الخادم) وعنوان IP الخاص بالجهاز (عنوان IP الثابت الذي قمت بتعيينه سابقًا) ورقم المنفذ الداخلي والخارجي.

    • حفظ الإعدادات: بعد إدخال جميع التفاصيل اللازمة، انقر على "Save" (حفظ) لحفظ الإعدادات الجديدة. ستحتاج إلى تكرار هذه الخطوات لإضافة إعدادات توجيه منفذ إضافية.

    • التأكد من البورتات التي تم فتحها من خلال التوجه لموقع https://portchecker.co/checking وستجد أنه تعرف على الـ public IP الخاص بجهازك ما عليك سوى كتابة بورت 80 ثم اضغط على check وكرر نفس الأمر مع بورت 443 وتأكد من ظهور كلمة port x is open.

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

    5- تفعيل خدمة DNS: بعد الانتهاء من إعداد إعدادات الراوتر وتحديد عنوان IP الخاص بالجهاز الخادم، يمكنك استخدام DNS لتسهيل عملية الوصول إلى الخادم. يمكنك استخدام خدمات DNS المجانية مثل No-IP أو DynDNS لتسجيل عنوان IP الخاص بالخادم الخاص بك وربطه بعنوان URL سهل الاستخدام.

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

    الخطوات لاستخدام DNS هي كالتالي:

    • قم بإنشاء حساب على موقع خدمة DNS المختارة والأفضل No-IP لكونها مجانية.
    • أدخل اسم النطاق الذي تريد استخدامه واتبع التعليمات لربط عنوان IP الخاص بالخادم بالاسم المستخدم في النطاق.
    • تأكد من تحديث إعدادات الراوتر الخاص بك للسماح بمرور حركة المرور المرتبطة بـ DNS من الخارج إلى الجهاز الخادم.
    • قم بتنزيل برنامج العميل الذي يقدمه موقع خدمة DNS المختارة وتثبيته على الجهاز الخادم. سيتم تشغيل هذا البرنامج في الخلفية وسيقوم بتحديث عنوان IP الخاص بالخادم بشكل دوري.

    يمكنك الآن الوصول إلى الخادم باستخدام عنوان URL المحدد لخدمة DNS المستخدمة.

     

    • أعجبني 1
×
×
  • أضف...