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

Wael Aljamal

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

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

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

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

    218

إجابات الأسئلة

  1. إجابة Wael Aljamal سؤال في ما هو بروتوكول SSH ولماذا نستخدمه كانت الإجابة المقبولة   
    إن SSH هو Secure Shell (SSH) أي صدفة آمنة، وهو بروتوكول شبكي مشفّر يعمل على خلق نفق اتصال يتم فيه نقل البيانات وتنفيذ الأوامر عبر الشبكة وخاصة على استضافات لينوكس مهما كان أمان الشبكة التي يتم الاتصال عبرها.
     
    يستخدم SSH التوثيق Authentication بطريق منها:
     Public-Key Authentication: استعمال مفتاح خاص Key عوض اسم المستخدم وكلمة السر.  Host-Key Authentication: هي الطريقة الأكثر انتشارا عند الاتصال بسيرفر، كتابة اسم المستخدم وكلمته السرية. يعمل SSH بواسطة TCP و وفق هرمية زبون-عميل client–server architecture
    للاتصال بالحاسوب البعيد، نحتاج اسم المستخدم و IP للحاسوب:
    ssh -p 22 username@remote_host ssh -p 22 waelaljamal@12.23.45.58 في هذا الجزء يطلب اسم المستخدم الذي تريدين الاتصال من خلاله و الاستضافة user@host نستبدل user باسم المستخدم و host إما بعنوان IP أو domain مثل example.com. ولاتظهر كلمة السر عند كتابتها (مخفية) حتى لانعلم عدد الأحرف التي نكتبهم.
    بعد تحقيق الاتصال (قد يطلب كلمة سر الاستضافة) يمكن نقل الملفات وتنفيذ أي أمر من خلال مدير الأوامر المحلي cmd أو حتى terminal عن بعد.
    قبل الاتصال علينا إنشاء مفاتيح الاتصال/التشفير أي نستخدم الأمر:
    ssh-keygen مما يولد مفتاحين:
    Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. ssh/id_rsa./~         : المفتاح الخاص. لا تنشر هذا الملفّ!  ssh/id_rsa.pub./~   : المفتاح العام المُرتبط. هذا الملفّ يمكن مشاركته بحرية. مثلا نضعه في حساب github لنستطيع رفع الملفات للمستودع البعيد.. لتجنب فقطع اتصال SSH يمكنك استخدام أداة autossh أي auto ssh والتي تبقي الخدمة نشطة وتنفذ بالأمر:
    autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C يستخدم خوارزميات التشفير التالية:
    Algorithms EdDSA,[27] ECDSA, RSA and DSA for public-key cryptography.[28] ECDH and Diffie–Hellman for key exchange.[28] HMAC, AEAD and UMAC for MAC.[29] AES (and deprecated RC4, 3DES, DES[30]) for symmetric encryption. AES-GCM[31] and ChaCha20-Poly1305 for AEAD encryption. SHA (and deprecated MD5) for key fingerprint. يتم العمل حالياُ بالإصدار 2 من SSH التي يرمز لها ب SSH-2.
    مقالات أكاديمية حسوب عن SSH  
  2. إجابة Wael Aljamal سؤال في php خطأ 403 ليس لدي صلاحيات في الوصول للموارد كانت الإجابة المقبولة   
    ما هو السيرفر الذي تستخدمه؟ وما الرابط الذي تطلبه وأي وضعت ملف PHP؟
    إن كنت تستخدم wamp تأكد من وضع الملف ضمن:
    C:\wamp64\www ثم في المسار:
    c:\wamp\alias\phpmyadmin.conf أو c:\wamp64\alias\phpmyadmin.conf لاتقم بتعديل السطر الأول تأكد من التالي:
    <Directory "c:/wamp64/apps/phpmyadmin5.0.2/"> Options +Indexes +FollowSymLinks +MultiViews AllowOverride all هذا Require local وهذا </Directory> تحت سطر options استبدل الذي لديك ب AllowOverride all Require all granted
    حل آخر:
    <Directory "c:/wamp22/apps/phpmyadmin3.5.1/"> Options Indexes FollowSymLinks MultiViews AllowOverride all Order Deny,Allow Deny from all Allow from localhost 127.0.0.1 ::1 </Directory>  
    احفظ الملف وأعد تشغيل المخدم
  3. إجابة Wael Aljamal سؤال في ما هو بروتوكول SCP ولماذا نستخدمه كانت الإجابة المقبولة   
    إن SCP هو Secure copy protocol أي بروتوكول النسخ الآمن يستخدم لنقل الملفات بين الحواسيب يستخدم على الشبكة network. يفيد في:
    نقل ملفات بين الحاسوب المحلي والحاسوب البعيد local host and remote host أو بين حاسوبين بعيدين remote hosts يعمل باستخدام البروتوكول  TCP port 22 يسمح برفع ملف مع الاحتفاظ بالخيارات permissions, timestamps الصلاحيات و التوقيع الزمني تم بناء هذا البروتوكول على Secure Shell protocol (SSH) ويعتمد عليه ويستخدم نفس طريقة المصادقة authentication مما يضمن موثوقية و سرية البيانات authenticity and confidentiality.
    يعمل خلال وضعين:
    source mode: قراءة ملف من القرص الصلب وإرساله عبر الشبكة sink mode: استقبال ملفات من الشبكة وكتابتهم على القرص كيفية نسخ ملف:
    من حاسوب محلي للحاسوب البعيد (على الشبكة)
    scp LocalSourceFile user@remotehost:directory/TargetFile LocalSourceFile مسار ملف محلي user@remotehost اسم المستخدم في الاستضافة directory/TargetFile مسار نسخ البيانات/الهدف أما بين حاسوبين على الشبكة:
    scp user@remotehost:directory/SourceFile LocalTargetFile يستخدم الوسيط r لجعل عملية النسخ عودية لتشمل جميع الملفات ضمن مجلد scp -r user@host:directory/SourceFolder LocalTargetFolder ^^ في حال كان الحاسوب المستقبل يشغل برمجية SCP على منفذ غير 22 يمكن تمريره كوسيط
    scp -P 2222 user@host:directory/SourceFile TargetFile ^^^^^^^ port مشكلة في البروتوكول: تسمح بالمرسل بالكتابة فوق ملفات موجودة مسبقاً عند المستقبل مما يمسح الملفات القديمة ويعدلها. overwrite arbitrary files بالإضافة لمشاكل في إرسال البيانات النصية.
    تم إيقاف التعامل معه في عام 2019 واستبدل مع البروتوكولين sftp and rsync
     
     
  4. إجابة Wael Aljamal سؤال في كيف أقوم بعملية رفع مشروع Ruby on rails على الاستضافة كانت الإجابة المقبولة   
    الآن علينا تجهيز قواعد البيانات والجدار الناري للمساح بتشغيل التطبيق مع تثبيت مخدم الويب nginx 
    #نحدث المكتبات في النظام apt update && apt upgrade #تعديل الجدار الناري apt install ufw && ufw allow 22 && ufw logging off && ufw enable && ufw status #تثبيت مخدم ويب و قواعد بيانات apt install curl git nginx postgresql libpq-dev ^^^^^ ^^^^^^^^^^ Installing NGINX & Passenger حيث أن passenger هي الحزمة التي تشغل تطبيق ريلز للاستجابة، لأنه لايتعامل مباشرة مع طلبيات HTTP
    #(a) تثبيت مفتاح PGP key sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7 #(b) تثبيت passenger من APT repository sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list' sudo apt-get update #(c) Install Passenger and Nginx module sudo apt-get install -y libnginx-mod-http-passenger #(d) تحقق من ملف التكوين configuration files exist if [ ! -f /etc/nginx/modules-enabled/50-mod-http-passenger.conf ]; then sudo ln -s /usr/share/nginx/modules-available/mod-http-passenger.load /etc/nginx/modules-enabled/50-mod-http-passenger.conf ; fi sudo ls /etc/nginx/conf.d/mod-http-passenger.conf ثم تخصيص ملف التكوين
    نضيف ملف الإعداد passenger.conf ننشيئ sudo nano /etc/nginx/conf.d/mod-http-passenger.conf نضيف له passenger_ruby /home/deploy/.rbenv/shims/ruby; نحذف الإعداد الافتراضي sudo rm /etc/nginx/sites-enabled/default نضيف إعدادات مخصصة sudo nano /etc/nginx/sites-enabled/my_rails_app بعد تهيئة ملف الإعدادات نضع به القالب التالي مع التخصيص المناسب مثل المنفذ الذي سيعمل عليه التطبيق والمجلد الجذر للمشروع مع تفعيل passenger
    server { listen 80; listen [::]:80; server_name _; root /home/deploy/sample_rails_app/current/public; passenger_enabled on; passenger_app_env staging; } ونشغل nginx 
    sudo service nginx start نثبت أداة Ruby Version Manager (RVM) مدير إصدارات لغة روبي،
    نحمل المفتاح:
    gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB ثم نثبت روبي وريلز install ruby and rails:
    \curl -sSL https://get.rvm.io | bash -s stable --rails ثم للتحقق من إصدار روبي:
    $ ruby --version ruby 2.7.2p137 // ريلز gem $ gem list rails rails (6.0.3.4) يمكن تثبيت نسخة مخصصة عن طريق rvm بتحديدها كما في الأمر:
    rvm install ruby-2.7.2 rvm use 2.7.2 // تثبيت ريلز بطريقة مختلفة gem update --system && gem install bundler rails ثم نرفع الملفات على الاستضافة إما كملف مضغوط أو من خلال رفعهم على github 
    ثم نثبت المكتبات الخاصة بمشروعنا بتنفيذ الأمر التالي في مجلد المشروع الرئيسي:
    bundle install ثم نعمل على تهجير قواعد البيانات وتشغيل المخدم
    تجهيز قواعد البيانات (تثبيت قاعدة بيانات و إنشاء مستخدم خاص بالمشروع) أحد الخيارين:
    postgres sudo apt-get install postgresql postgresql-contrib libpq-dev sudo su - postgres createuser --pwprompt deploy createdb -O deploy myapp exit mysql sudo apt-get install mysql-server mysql-client libmysqlclient-dev sudo mysql_secure_installation # Open the MySQL CLI to create the user and database mysql -u root -p CREATE DATABASE IF NOT EXISTS myapp; CREATE USER IF NOT EXISTS 'deploy'@'localhost' IDENTIFIED BY '$omeFancyPassword123'; CREATE USER IF NOT EXISTS 'deploy'@'%' IDENTIFIED BY '$omeFancyPassword123'; GRANT ALL PRIVILEGES ON myapp.* TO 'deploy'@'localhost'; GRANT ALL PRIVILEGES ON myapp.* TO 'deploy'@'%'; FLUSH PRIVILEGES; \q ننشئ ملف إعدادات البيئة ونضع فيه بيانات قاعدة البيانات
    # For Postgres DATABASE_URL=postgresql://deploy:PASSWORD@127.0.0.1/myapp # For MySQL DATABASE_URL=mysql2://deploy:$omeFancyPassword123@localhost/myapp RAILS_MASTER_KEY=ohai SECRET_KEY_BASE=1234567890 STRIPE_PUBLIC_KEY=x STRIPE_PRIVATE_KEY=y # etc... بقي تهجير قواعد البيانات وبدء المخدم بالأمرين:
    bin/rake db:migrate bin/rails s  
  5. إجابة Wael Aljamal سؤال في كيفية جلب الاستعلامات عبر SELECT في SQL كانت الإجابة المقبولة   
    الكلمة المفتاحية SELECT تعني اختار (أو حدد) ثم نكتب بعدها أسماء الحقول التي نريد جلب بياناتهم
    SELECT col1, col2, ... FROM table; وعلينا تحديد أسماء الحقول حسب الجدول الذي نجلب منه البيانات فلا نضع أسماء حقول غير موجودة..
    مثلا لدينا جدول فيه رقم الزيون واسمه وعنوانه و رقمه، ونريد عرض اسم الزبون و عنوانه فقط، لذلك نحدد هذين الحقلين في الاستعلام:
    SELECT CustomerName,Address FROM Customers; أما لجلب جميع الحقول نضع نجمة * بدل أسماء الحقول
    SELECT * FROM Customers; يمكن ل SELECT فلترة النتائج مثلا نريد عرض المدن المختلفة التي ينتمي منها الزبائن فنستعمل DISTINCT لجلب القيم المختلفة:
    SELECT DISTINCT Country FROM Customers; أو جلب عدد محدد من الحقول:
    SELECT TOP 3 * FROM students WHERE Country='Germany'; وفي حال عمل دمج، يلزم تحديد الاسم المستعار لكل خاصية نريد عرضها:
     
  6. إجابة Wael Aljamal سؤال في لماذا نستخدم الربط الذاتي self join في جداول قاعدة البيانات SQL؟ كانت الإجابة المقبولة   
    نستخدم الربط الذاتي self join  عندما نريد الربط بين عناصر من نفس الجدول ويكون لها علاقة بينهم، مثل عمل استعلام يظهر أسماء الموظفين مع أسماء مردائهم، كما ترى جميع الموظفين والمدراء موجودين في نفس الجدول (جدول الموظفين)
    لذلك نعمل استعلام يدمج الجدول بنفسه ويتم الربط بناءً على أن رقم المدير لموظف ما هو نفسه رقم معرف أحد الموظفين..
    الشكل العام:
    SELECT column_name(s) FROM table1 T1, table1 T2 WHERE condition; لاحظ أن اسم الجدول يظهر مرتين في عبارة الدمج join  نأخذ اسمين مستعارين لنفس الجدول ونطبق الشرط عليهم يمكن استخدام INNER JOIN أو LEFT JOIN select e1.Name As Employee Name, e2.Name As Boss from employees e1 inner join employees e2 on e1.Boss_id = e2.Id جلبنا اسم الموظف واسم المدير من علاقة الربط، حيث أن معرف رقم المدير للموظف من أول نسخة من الجدول تقابل معرف موظف من النسخة الثانية للجدول
    مثلا استعلام آخر لمعرفة الموظفين من نفس المدينة:
    select e1.Name As Employee1, e2.Name As Employee2, e1.city As City Name from employees e1 inner join employees e2 on e1.city = e2.city ORDER BY e1.City; // مفيدة للترتيب  
     
  7. إجابة Wael Aljamal سؤال في ما هو خادم Bitnami ولماذا نستخدمه؟ كانت الإجابة المقبولة   
    Bitnami هي مكتبة من أدوات التثبيت أو حزم البرامج لتطبيقات الويب ومجموعات البرامج والأجهزة الافتراضية تعمل على تحزيم ثم نشر تطبيقات مفتوحة المصدر أي  application packaging and publishing.
    تُستخدم حزم Bitnami لتثبيت البرامج على Linux و Windows و Mac OS X و Solaris
    توفر حزم تثبيت للعديد من المنصات مثلWordPress و Drupal و Joomla! و Redmine و AbanteCart و PrestaShop و Magento و MediaWiki وغيرها، تدعم تثبيتهم في مختلف البيئات من الحاسوب المحلي لنظم الحوسبة السحابية.
    حسب التوثيق الخاص بهم، جميع البرمجيات التي تنشرها تكون محدثة باستمرار ومدعمة بملفات الإعدادات والتكوين configuration والتي تكون مختبرة على جميع البيئات.
    يمكن نشر deploy التطبيقات على مختلف النظم Google Cloud, AWS, or Azure..
    التنصيب: توفر Bitnami برنامج التنصيب / التثبيت installer متوافق مع جميع البيئات، وله واجهة wizard يمكن من خلالها اختيار التطبيقات التي تريد تثبيتها، تتضمن أيضاً هذه الخطوات إضافة إعداداتك الخاصة وبعد انتهاء التثبيت تكون البرمجية جاهزة للعمل.
     
  8. إجابة Wael Aljamal سؤال في ما هو خادم LAMP ولماذا نستخدمه؟ كانت الإجابة المقبولة   
    لتثبيت البرمجيات على لينوكس نستخدم الأداة apt، أولا نتأكد من تحديثها:
    sudo apt-get update ثم نحدث المكتبات والبرمجيات الحالية system cache
    sudo apt update ثم نثبت مخدم أباتشي apache2
    sudo apt install apache2 الآن نعدل سماحية جدار الحماية لنسمح للمخدم بتبادل البيانات والوصول للشبكة:
    sudo ufw app list يظهر التالي ونختار:
    Output Available applications: Apache Apache Full Apache Secure OpenSSH sudo ufw app info "Apache Full" حيث أنه بعمل على المنفذين ports 80 and 443.
    الآن ليصبح لنا الموقع متاح، على الرابط مثلا:
    http://your_server_ip ونضع عنوان IP من ناتج التعليمة التالية:
    ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//' وإن احتجت curl utility نثبتها:
    sudo apt install curl ثم تثبيت قاعدة البيانات:
    sudo apt install mysql-server sudo mysql_secure_installation وتشغيلها sudo mysql ثم نثبت PHP مع الحزم اللازمة لاتصالها مع قاعدة البيانات:
    sudo apt install php libapache2-mod-php php-mysql ثم نعيد تشغيل المخدم
    sudo systemctl restart apache2 يمكن أيضا تثبيت phpmyadmin
    sudo apt-get install phpmyadmin في حال احتجت لاستخدام SSL / HTTPS:
    sudo apt-get install apache2 apache2-doc apache2-npm-prefork apache2-utils libexpat1 ssl-cert  
     
  9. إجابة Wael Aljamal سؤال في ما سبب ظهور رسالة يجب أن يتم الموافقة على هذا المحتوى قبل نشره كانت الإجابة المقبولة   
    يكتب الطلاب رسائل مثل، شكرا لك، أو حلت المشكلة.. فنحن لانقبل مثل هذه التعليقات لكي لا يتشتت الطلاب الآخرون. نركز على تعليقات الأسئلة فقط وحلول المدربين للمشاكل، ليستفيد باقي الطلاب من الملاحظات أو الشروحات الإضافية للدروس.
    أما عند طرح الطالب سؤال عن محتوى الدرس، يتم الموافقة عليه بأسرع وقت وتقديم إجابة له. يمكنك وضع إعجاب للإجابة.
    واستخدم الاقتباس إن أردت تحديد جزء من رسالة للاستفسار عنه، واكتب أي استفسار عن الدرس واطلب توضيح والمدربين سيتابعون معك.
    بالتوفيق
  10. إجابة Wael Aljamal سؤال في ما الفرق بين Join و Subquery في SQL كانت الإجابة المقبولة   
    نستخدم JOIN عندما نريد الربط بين جدولين اعتماداً على قيمة أحد الحقول والتي غالبا تكون مفتاح رئيسي في أحد الجدولين ومفتاح ثانوي في الجدول الآخر (مع العلم يمكن الربط بين الجدول ونفسه)
    نستخدمها عندما يكون لدينا معلومات لكائن ما في الجدول موجودة في جدولين أو أكثر، حيث نضطر لعمل ربط بين جدولين مثلا.
    جدول الموظفين يحوي معلومات الموظف مع رقم القسم فقط، وجدول الأقسام يحوي على رقم القسم و اسم القسم وموقعه، لذلك هنا علينا الربط بين الجدولين لنعرف اسم القسم وموقعه لكل موظف. ويتم الربط بناءاً على رقم القسم.
    SELECT * FROM Employees INNER JOIN Departement ON Employees.deptID = Departement.ID; أما Subquery نستخدمها لعمل استعلام جزئي يعيد لنا بعض النتائج، والتي نعتمد عليها في الاستعلام الأساسي حيث يكون من الصعب عمل فلترة من خلال استعلام واحد (أو مثلا نحتاج لعمل فلترة في جدول آخر ثم فلترة أخرى في جدولنا).
    مثلا نجلب معلومات المنتجات (من جدول المنتجات) التي تم بيعها أكثر من 10 مرات (عدد مرات البيع من جدول الفواتير/الطلبيات)
    SELECT p.Name FROM Products p WHERE ProductID = ANY (SELECT ProductID FROM Orders WHERE Quantity > 10); أحيانا يمكن عمل نفس الاستعلام عن طريق JOIN أو Subquery ويفضل استخدام JOIN لأنه أسرع في معظم الوقت لأن عملية الربط بين الجداول تكون مفهرسة وتعتمد على المفتاح الرئيسي و الثانوي .. أي عملية تطابق السجلات تكون سريعة
    مع ملاحظة أن الاستعلام الفرعي يتم تنفيذه أولا ولمرة واحدة (أو أكثر حسب نوع الاستعلام فإن كان هنالك عنصر يتم اختباره من الاستعلام الأب سيتكرر استدعاء الاستعلام الفرعي).
    والدمج ينتج جدول يحوي جميع الحقول في كلا الجدولين المدموجين  حسب حقل الربط.
  11. إجابة Wael Aljamal سؤال في لماذا نستخدم الفهرسة في قواعد البيانات Database Index و MySQL كانت الإجابة المقبولة   
    تفيد الفهرسة في تسريع الوصول للبيانات في الجدول عند البحث (خاصة عند كتابة الشروط) وكما نعلم عندما تكون لدينا بيانات مرتبة، تصبح عملية البحث أسرع حيث أن أغلب خوارزميات البحث تعتمد على بيانات مرتبة. مثلاً خوارزمية البحث الثنائي.
    الفهرس في قاعدة البيانات هو ملف (أو أكثر) يحوي على قيم عمود ما من الجدول ولكن بطريقة مرتبة، وكل قيمة تحوي ارتباط لموقعها الفعلي في الجدول (مثل مؤشر أو رابط) فعندما نريد تطبيق شرط ما على عمود في الجدول، نبحث ضمن الفهرس (لسرعة البحث) ثم يرشدنا الفهرس لمكان البيانات الفعلية (سطر جدول قاعدة البيانات الفعلي) وهنا نسترجع بيانات كامل السجل.
    مثلا من الجيد استخدام حقل اللإيميل وعمل فهرسة عليه.
    SELECT * FROM Employee WHERE email = 'wael@hsoub.com' يمكننا إنشاء فهرس أو أكثر للجدول - حسب الحقول التي نختبرها بالشرط بشكل متكرر - لأن حجم الفهارس يصبح كبير ويمكن ألا يكون له فائدة في تسريع الأداء.. لذلك نختاره بدقة
    # إنشاء فهرس أو أكثر لجدول ما CREATE INDEX [ name ] ON tbl ( col [, ...]); # إنشاء فهرس لتسريع البحث حسب اسم المقالة CREATE INDEX index_title ON posts (title); القيود على إنشاء الفهارس أن تكون قيمة الهود رقمية أو نصية varchar (لا يقبل text) حتى تكون الفهرسة نافعة وسريعة.
    للفهرس معامل مهم هو fillfactor (معامل الملئ) وهذا يحدد نسبة حشو ملفات الفهرسة، لأننا نعلم أن البيانات تزيد باستمرار ولضمان ترتيبهم ضمن الفهرس في ملفات، علينا إبقاء مساحة فارغة فيهم لضمان وضع البيانات الجديدة في ترتريب سليم بدون الإضطرار لوضعهم في ملفات أخرى وعمل روابط تنقل بين صفحات الفهارس ومثلا نسبة الحجز للملف نضعهم 75%..
    حذف فهرس DROP INDEX [ IF EXISTS ] name [ CASCADE | RESTRICT ] تعديل فهرس ALTER INDEX [ IF EXISTS ] name RENAME TO new_name ALTER INDEX distributors SET (fillfactor = 75); قاعدة مهمّة أخرى عند استخدام الفهارس هي أنه ينبغي الانتباه إلى ربط الجداول (عبر التعليمة join مثلا)؛ إذ يجب أن تُنشَأ فهارس للحقول المستخدمة في الربط، كما يجب أن تشترك هذه الحقول في نوع البيانات.
    تشبه فهرسة الكتب، الهدف منها تسريع البحث.
     
  12. إجابة Wael Aljamal سؤال في ماهي أنواع الخوادم والاستضافات وما الفرق بينهم كانت الإجابة المقبولة   
    يوجد عدة عوامل في تحديد الاستضافة الأفضل لموقعك، وهذا يعتمد على عدة عوامل مثل عدد الزوار (هذا يتطلب تحديداً قوة معالجة وذاكرة RAM)،ثم الحاجة لتخزين ملفات وصور بحجم تخزين كبير (هذا يتطلب مساحة تخزين كبيرة) أيضاً الأسعار (لا تحجز استضافة غالية أو خدمات لا تحتاجهم)، توافر خدمات النسخ الاحتياطي و البريد الالكتروني.
    الأرخص والأضعف: الاستضافة المشتركة Shared Hosting يتشارك عدة زبائن نفس المخدم ما يؤدي لتوزيع قوة المخدم عليهم (زبائن كل المواقع) وهذا غير مناسب لعدد زبائن كبير لأنه يسبب توقف المخدم. يفيد في حالة موقع صغير وعدد زبائن قليل.
    الأقوى والأغلى: الخادم المخصص Dedicated Server هنا عليك شراء الخادم وتثبيت نظام التشغيل ربما توظيف مختص لمتابعته، هنا تستفيد من كل موارد الخادم لكن كل المسؤوليات و الدعم الفني و التطوير و زيادة مساحة التخزين عليك أن تديرها بنفسك.
    الحل المتوسط هو الخوادم الافتراضية VPS وهو الأكثر مرونة وقوة توفره شركات الخدمات السحابية (يمكن اعتباره خدمة سحابية خاصة) تعطيك كامل التحكم في الإعدادات، وهو مناسب للنمو المعتدل. (قدرة المعالجة محدودة)
    أما في الخادم السحابي حيث يتم دعم موقعك على عدد كبير من الخوادم (ينفع في حال تعطل أحدهم) وتصبح الخدمة أسرع لأن العميل يتصل على أقرب مخدم له، يمكنك تعديل قوة المعالجة وحجم التخزين من لوحة التحكم وهو الأاسهل من حيث الترقية والتوسع والاتاحية (قوة المعالجة كبيرة بكامل قوة المنظومة)
     
     
     
  13. إجابة Wael Aljamal سؤال في انا استخدم ويندوز 8 واريد ان اقوم بفتح ملف xd ولكن البرنامج لا يعمل .. هل توجد طريقة لفتح ملفات xd بدون adobe xd ؟؟ كانت الإجابة المقبولة   
    حاول استخدام أحد الأدوات المتوفر على الانترنت online مثل PSDETCH. Photopea
    إن قمت بتصدير ملف التصميم من AdobeXD على شكل SVG فيمكنك فتحه في Figma وهو برنامج تصميم مجاني لكنه لايدعم ملفاتXD
  14. إجابة Wael Aljamal سؤال في كيف أقوم بتثبيت وضبط وتشغيل قواعد بيانات mongoDB في الخادم NoSQL كانت الإجابة المقبولة   
    يقدم التوثيق الرسمي خطوات للتثبيت على كل أنظمة التشغيل المدعومة مع ملاحظات حسب إصدار كل نسخة لهم و من مونغو.
    مثلاً في نظام أوبنتو يتم التثبيت من خلال أداة Advanced Packaging Tool (APT) مدير الحزم البرمجية للنظام.
    الخطوات العريضة:
    تحميل المفتاح العام من خلال wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add - ثم 
    تثبيت الحزمة gnupg  sudo apt-get install gnupg ثم إعادة الأمر رقم 1 الخاص بامفتاح
    ثم إنشاء ملف القوائم  sources.list.d/mongodb-org-5.0.list # يختلف حسب الإدار للنظام تأكد من التوثيق echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list  
    ثم أمر التثبيت  sudo apt-get install -y mongodb-org  
    ثم تشغيل الخدمة mongodb  sudo systemctl start mongod  
    توثيق التثبيت:
     mongodb/manual/installation
  15. إجابة Wael Aljamal سؤال في ماهو نظام الهيكلة النجمي Star Schema في تصميم قواعد البيانات ولماذا نستعمله؟ كانت الإجابة المقبولة   
    مع تطور مفاهيم قواعد البيانات أوجد الخبراء أنظمة هيكلية تعطي أداء أفضل من أنظمة أخرى.
    من أنواع هيكلة قواعد البيانات و العلاقات بين الجداول هو النظام النجمي، حيث يعتمد على وجود جدول وسيط يربط بين الجداول الفرعية الأخرى في قاعدة البيانات، هذا يسرع الوصول لبيانات نحتاجها في جدول آخر حيث يقلل عدد عمليات الربط الضرورية.
    الجدول الرئيسي يدعى جدول الحقيقة Fact table (يحوي غالباً على إحصائيات) والجداول الفرعية الوصفية Dimension تحوي بيانات عادية مثلاً نصية..
    البيانات الواقعية رقمية ( عدد مبيعات المنتج) ، بينما بيانات الأبعاد وصفية (مثل سعر المنتج ولونه ووزنه ...).
    هيكلية نجمية:

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

    مثال:
    استطعنا ربط جميع الجداول الفرعية مع جدول الحقيقة بعملية واحدة، بدل سلسلة عمليات ربط
    SELECT P.Brand, S.Country AS Countries, SUM(F.Units_Sold) FROM Fact_Sales F INNER JOIN Dim_Date D ON (F.Date_Id = D.Id) INNER JOIN Dim_Store S ON (F.Store_Id = S.Id) INNER JOIN Dim_Product P ON (F.Product_Id = P.Id) WHERE D.Year = 1997 AND P.Product_Category = 'tv' GROUP BY P.Brand, S.Country  

  16. إجابة Wael Aljamal سؤال في كيف أضيف أو أعدل بيانات لجدول ناتج عن استعلام فرعي SQL SubQuery كانت الإجابة المقبولة   
    لإضافة بيانات لجدول ما، يمكن استخدام عبارة INSERT INTO ونمرر لها القيم VALUES على شكل استعلام SELECT:
    INSERT INTO TopStudents SELECT * FROM Students WHERE marks > 90; مثلا لدينا جدول TopStudents يحوي الطلاب المتفوقين في مادة ما، نريد ملأه بقيم الطلاب الذين حصلو على علامة أكبر من 90.
    عبارة SELECT سوف تعيد حميع القيم الموافقة للشرط (بيانات الطلاب) وتمررهم لعبارة INSERT ليتم إضافتهم.
    والشكل العام للعبارة:
    INSERT INTO tableB SELECT * FROM tableA WHERE condition; يمكن أن يكون الاستعلام SELECT معقداً أكثر ولكن انتبه لتوافق الحقول بين ناتج الاستعلام و بنية الجدول
    لتحديد الحقول التي تريد إضافتها مرر أسماء الأعمدة:
    INSERT INTO tableB (col1, col2, col3, ...) SELECT col1, col2, col3, ... FROM tableA WHERE condition; والتعديل من SubQuery:
    نستخدم الكلمة المفتاحية UPDATE SET ..هنا استخدمنا شرط لمعالجة ناتج الاستعلام
    UPDATE customers SET vip = IF (SELECT sum(Amount) FROM payment WHERE customers.CustomerID = payment.CustomerID) > 5000 THEN True ELSE False; لاحظ أن الحقل VIP سيتم تحديد قيمته إن كان مجموع مشتريات الزبون أكبر من 5000 
  17. إجابة Wael Aljamal سؤال في كيف أقوم بعملية رفع مشروع Next JS على الاستضافة المشتركة Shared Hosting وماهي الأمور التي يجب أن أتأكد منها كانت الإجابة المقبولة   
    أولا التأكد من تنصيب بيئة NodeJS على المخدم بواسطة CPanel يمكنك مراجعة خطوات التنصيب بالإجابة التالية:
    الآن نحتاج لتنصيب حزمة pm2 فهي process manager ل JavaScript runtime Node.js:
    npm install -g pm2 ثم في nginx نعطي سماحية للمنفذ الذي يعمل عليه تطبيق NextJS 
    في nginx.conf/server/location أضف السطر proxy_pass http://localhost:6060 ثم نعمل على رفع الملفات الخاصة بالمشروع pages, public, src , package.json إلى مسار ما علة المخدم:
    /var/www/your-Next-folder ثم نعدل صلاحيات المجلد: ونقوم بتنصيب الحزم
    sudo chown -R $USER:$USER /var/www/your-Next-folder ثم نقوم بتنصيب الحزم > cd to your-Next-folder > run: npm -i ثم ضمن package.json نعدل أمر تشغيل التطبيق حسب المنفذ المستخدم
    next start -p your-port next start -p 6060 ثم بناء وتشغيل المشروع:
    npm run build pm2 start "npm run start" --name Next-project ملاحظة: إن اعترضتك مشكلة في بناء npm build تكون بسبب قلة الذاكرة الافتراضية، لذلك ينصح بعمل البناء محليا على حاسوبك،
    في حال رفع ملفات ساكنة هنا قد نحتاج لبرنامج يخدم المشروع، تأكد من معمارية المشروع كالتالي:
    public_html Next_project .next src server.js package.json ... حيث أن شيفرة server.js ستكون بالشكل:
    const { createServer } = require("http"); const { parse } = require("url"); const next = require("next"); const dev = process.env.NODE_ENV !== "production"; const port = !dev ? process.env.PORT : 3000; // Create the Express-Next App const app = next({ dev }); const handle = app.getRequestHandler(); app .prepare() .then(() => { createServer((req, res) => { const parsedUrl = parse(req.url, true); const { pathname, query } = parsedUrl; handle(req, res, parsedUrl); console.log("pathname", pathname); }).listen(port, (err) => { if (err) throw err; console.log(`> Ready on http://localhost:${port}`); }); }) .catch((ex) => { console.error(ex.stack); process.exit(1); }); الآن التشغيل ك node server.js.
    npm install cross-env "scripts": { "start": "cross-env NODE_ENV=production node server.js" } كما يمكن تنفيذ أمر next export الذي ينتج ملفات ساكنة يمكن رفعها على المخدم 
    قد تحتاج لملف .htaccess لتوجه الطلبيات نحو مخدمك، سيكون بهذه الطريقة:
    RewriteEngine On RewriteRule ^$ http://127.0.0.1:3000/ [P,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ http://127.0.0.1:3000/$1 [P,L] مع تغيير المنفذ للمستخدم لديك في مثالنا 6060.
    أفضل استضافة هي vercel لسهولة النشر عليها 
    كما يمكن لأداء أفضل استخدام vps
     
  18. إجابة Wael Aljamal سؤال في كيف نحذف البيانات فقط من كل جداول قاعدة البيانات عن طريق أمر واحد مع الحفاظ على وجود هيكلية هذه الجداول كانت الإجابة المقبولة   
    يمكننا المرور على جميع الجداول وعمل truncate لهم، افتح محرر الأوامر cmd أو terminal ثم اكتب أمر musql وبعد ظهور المؤشر
    اكتب السطر التالي:
    mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done هذا الأمر سوف يجلب أسماء جميع الجداول في قاعدة بيانات ما، ثم ينفذ أمر truncate الذي يحذف بيانات الجدول دون حذف هيكلية الجدول نفسه.
    إذا ظهر لك مشاكل (حذف جدول مرتبط بجدول آخر) أو لتجنب حدوث أخطاء بالأساس، نضبط عدم إظهار تحذيرات عند حذف المفاتيح الثانوية Forien kyes
    SET FOREIGN_KEY_CHECKS=0; ثم أمر الحذف ... ثم نعيد القيد SET FOREIGN_KEY_CHECKS=1; ويمكن تجميع الأوامر السابقة في script وحيد:
    SET FOREIGN_KEY_CHECKS = 0; SELECT @trunc_str := CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, ';') FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_schema IN ('db_name1','db_name2'); PREPARE statement FROM @trunc_str; EXECUTE statement; DEALLOCATE PREPARE statement; SET FOREIGN_KEY_CHECKS = 1; وإن أردت استخدام shell script:
    # اسم قاعدة البيانات DATABASE_NAME=$1 # اسم مستخدم قاعدة البيانات read -p "DB User: " DBUSER # كلمة السسر للمستخدم read -s -p "DB Password: " DBPASSWORD echo "" # طباعة فراغ # حذف بيانات الجداول mysql -Nse 'show tables' -D $DATABASE_NAME -u$DBUSER -p$DBPASSWORD | while read table; do echo "SET FOREIGN_KEY_CHECKS = 0;truncate table \`$table\`; SET FOREIGN_KEY_CHECKS = 1;"; done | mysql $DATABASE_NAME -u$DBUSER -p$DBPASSWORD exit 0 إن كنت تستعمل  phpMyAdmin يمكن من واجهة التحكم تفريغ قاعدة البيانات:
    Database View => Check All (tables) => Empty  
  19. إجابة Wael Aljamal سؤال في ما الفرق بين drop table و truncate table في SQL كانت الإجابة المقبولة   
    إن التعليمة drop table تقوم بحذف الجدول وتعريفه نهائيا من القاعدة أي البيانات مع الهيكلية الخاصة به Schema
    أما Truncate تحذف فقط البيانات، فعليك:
    تجنب استخدام عبارة DELETE FORM TABLE WHERE 1 لأنها بطيئة استخدام عبارة truncate لحذف محتوى جدول مع الإبقاء عليه  TRUNCATE TABLE tbl_name  
    للتخلص من الجدول بشكل نهائي استخدم DROP:
    DROP TABLE IF EXISTS tbl_name;  
    فائدة العبارة DELETE في حذف سجلات يمكن تحديدها بشرط ما:
    DELETE FROM People WHERE F_Name = 'wael'  
     
  20. إجابة Wael Aljamal سؤال في كيف أقوم بعملية رفع مشروع لارافل Laravel على الاستضافة وماهي الأمور التي يجب أن أتأكد منها كانت الإجابة المقبولة   
    إن متطلبات تشغيل المشروع، تعتمد على إصدار Laravel بالإضافة للمكتبات الخارجية التي قمت بتثبيتها في composer.json
    متطلبات لارافيل العامة:
    في مسار PHP في ملف php.ini أزل الفاصلة المنقوطة ; من أمام كل من الميزات التالية لأن لارافل تعتمد عليهم ثم احفظ الملف وأعد تشغيل المخدم.
    على الأغلب تجد تنصيب PHP في مسار تثبيت المخدم الذي تستعمله أو نفذ سكربت 
    <php phpinfo(); ?> المتطلبات:
    PHP >= 7.3 BCMath PHP Extension Ctype PHP Extension Fileinfo PHP Extension JSON PHP Extension Mbstring PHP Extension OpenSSL PHP Extension PDO PHP Extension Tokenizer PHP Extension XML PHP Extension بعد إنشائك لمشروع لارافل، احتفظ بالمجلد public بموقعه ضمن public_html ولا تبدله ولا تنقله المهم أن يكون متاح على الشبكة ، إنما باقي المشروع يمكن أن تضعه خارج public_html وتعدل السطرين التاليين في index.php ليدلا على مجلد الجذر للمشروع
    require __DIR__.'/../bootstrap/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php'; إعداد ngnix الموصى به من لارافل:
    server { listen 80; # منفذ server_name example.com; # دومين root /srv/example.com/public; # مسار المشروع على الاستضافة add_header X-Frame-Options "SAMEORIGIN"; # إعدادات حماية add_header X-Content-Type-Options "nosniff"; index index.php; # الملف الجذر لتصفح المشروع charset utf-8; # ترميز الأحرف ليقبل العربية و غيرها من اللغات location / { try_files $uri $uri/ /index.php?$query_string; # إعادة توجيه الطلبات } location = /favicon.ico { access_log off; log_not_found off; } # أيقونة الموقع location = /robots.txt { access_log off; log_not_found off; } # ملف الفهرسة error_page 404 /index.php; # صفحة غير متوفرة location ~ \.php$ { # إعداد PHP fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } } لرفع المشروع، ادخل مجلد المشروع ثم حدد جيمع الملفات والمجلدات بدون vendor ثم قم بعمل أرشيف أو ضغطه zip منهم، تحديد بزر الفأرة ثم add to archive ثم علينا رفع هذا الملف للاستضافة.
    نسجل دخول للوحة التحكم في الاستضافة، ثم نفتح متصفح الملفات ثم نتوجه ل public_html ونرفع الملف المضغوط عليه، ثم نفك الضغط.
    ننتقل لمسار المشروع ثم نقوم بتثبيت الاعتماديات:
    composer install --optimize-autoloader --no-dev ^^^^^^^^ لاتثبت اعتماديات المطورين نتأكد من أن المجلد public متاح للقراءة وله صلاحية  (يمكن 644 )  مناسبة (755 موصى بها) مثله مثل مجلد التخزين storage و cache.  
    chmod -R o+w storage chmod -R o+w bootstrap/cache وربط التخزين 
    php artisan storage:link ln -s /home/username/laravel-project/storage/app/public/ /home/username/public_html/laravel-project/storage إنشاء قاعدة بيانات فارغة، لأن لارافل تقوم بعملية تهجير وتبني الجداول (طبعا أنت يفترض أن تتبع هذه الطريق) 
    يفضل أن يكون للمستخدم صلاحيات كالة على القاعدة ALL PREVILLAGE 
    ثم يبقى تعديل ملف البيئة env وإدراج معلومات قاعدة البيانات التي أنشأناها مع معلومات المستخدم.
    APP_URL=http://localhost DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret ونقوم بإلغاء تفعيل app_debug
    APP_DEBUG=false وباقي الإعدادت
    APP_NAME=Laravel اي اسم APP_ENV=production APP_KEY= سيتم توليده من خلال أمر لاحق APP_DEBUG=false APP_URL=http://localhost رابط الاستضافة لديك ثم نولد مفتاح:
    php artisan key:generate نحذف الكاش:
    php artisan config:cache php artisan route:cache php artisan view:cache ثم نقوم بعمل التهجير
    php artisan migrate php artisan db:seed في حال بيانات افتراضية الآن الموقع جاهز للعمل، جزء API ليس له متطلبات إضافية
    في حال اتصالك بقواعد بيانات خارجية تأكد من ضبط driver الخاص بها لكل خدمة laravel/config/database.php
    ... 'connections' => [ 'sqlite' => [ 'driver' => 'sqlite', 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', ], 'mysql' => [ 'driver' => 'mysql', 'host' => env('RDS_HOSTNAME', '127.0.0.1'), 'port' => env('RDS_PORT', '3306'), 'database' => env('RDS_DB_NAME', 'forge'), 'username' => env('RDS_USERNAME', 'forge'), 'password' => env('RDS_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], ... لإضافة تعديلات، نطفي artisan ثم نعيد تشغيله بعد الانتهاء
    php artisan down إيقاف php artisan up تشغيل في حال قمت بعدد من التعديلات الكثيرة، ولكي لارفع المجلد المضغوط عددة مرات، يمكن رفع المشروع على مستودع مثل github أو gitbucket ثم استنساخ المستودع git clone أول مرة ثم git pull.. بعد كل تحديث تقوم به (git push إلى المستودع) لكي تسحب التحديثات للاستضافة 
    تابع المستجدات على توثيق لارافل.
  21. إجابة Wael Aljamal سؤال في كيفية إعداد بيانات اعتماد AWS-SDK في NextJS كانت الإجابة المقبولة   
    لكي تجعل المفتاح AWS_ACCESS_KEY_ID قبل للقراءة زمن التشغيل أي runtime variable يجب تعديل الضبط لديك لأنه الآن يعمل وفق  build time variable وذلك بإضافة الإعدادات ل serverRuntimeConfig
    // سوف نستبدل هذه env: { AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID }, // بهذه module.exports = { serverRuntimeConfig: { AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID } } وتأكد من ضبط  aws.config.update حيث أن هيكليته لديك غير مطابقة للتوثيق
    const aws = require('aws-sdk') aws.config.update({ 'credentials': { 'accessKeyId': process.env.AWS_ACCESS_KEY_ID_MYAPP, 'secretAccessKey': process.env.AWS_SECRET_ACCESS_KEY_MYAPP }, 'region': process.env.AWS_REGION_MYAPP, 'bucketname': process.env.AWS_BUCKET_NAME // (...) }) // New S3 class const s3 = new aws.S3() module.exports = (req, res) => { // (...) } توثيق: AWS SDK Environment Variables
  22. إجابة Wael Aljamal سؤال في كيف يمكنني استخدام vs code لبرمجية ++C وتثبيت الإضافة المناسبة extension كانت الإجابة المقبولة   
    يوجد في vs code عدة إضافات لكل لغة برمجية، يمكنك تجريب أي منهم وبقاء التي أعجبتك مفعلة enable وأبطل التي لاتريدها disable.
    عليك الآن، إما إنشاء مجلد وتضع فيه مشروعك البرمجي، أو فقط تقوم بإنشاء ملف، وتأكد من أن اللاحقة cpp.
    ثم اكتب الشيفرة التي تريها ضمنه. ربما لن ينفذ الملف لأنه ليس لديك مترجم لغة c++ حيث عليك تحميله بشكل منفصل.
    يمكنك تثبيت المترجم: Mingw-w64 via MSYS2
    يمكنك أيضاً استخدام CodeBlocks
  23. إجابة Wael Aljamal سؤال في إعادة تسمية عمود ما في SQL كانت الإجابة المقبولة   
    هل يمكنك تصفح قاعدة البيانات والتأكد من اسم الجدول؟ لربما قد تغير بدون أن تنتبه 
    حاول عمل هذه:
    alter table table_name change column original_name new_name  
  24. إجابة Wael Aljamal سؤال في ظهور المشكلة The code signature version is no longer supported بعد تحديث نظام IOS عند تجريب التطبيق كانت الإجابة المقبولة   
    أحدهم قام بحذف الهاتف من ذاكرة Xcode أي عمل له unregister ثم أعاد وصله قد تضطر للذهاب لحساب مطور أبل لديك، في قسم 'Certificates, Identifiers & Profiles' > profiles > provisioning profiles ثم إضافة الجهاز الذي تستعمله للاختبار، اتبع بعض الخطوات وسوف تحصل على ملف قم بتحميله بأي اسم.. ثم قم بتشغيله بالنقر المزدوج عليه سيتم ربط الهاتف وحل المشكلة حاول تحديث مكتبات XCODE  
    ربما تحتاج لإعادة توقيع التطبيق مع التنسيق الجديد له Using the Latest Code Signature Format..
    لحل المشكلة التي سببها تحديث نظام IOS عن طريق Flutter اتبع التوثيق المقدم من فلاتر:
    flutter/ios-project-migration ربما يوجد مفتاحين تحقق للجهاز، احذف الأول
    security find-identity -p codesigning -v security delete-identity -Z المفتاح لديك
    وشرح إضافي من القائمين على Flutter من  github
  25. إجابة Wael Aljamal سؤال في تجميع بيانات الطلبيات التي تعود لنفس الشحص ثم تحديد الحالة العامة لها في SQL كانت الإجابة المقبولة   
    سنعمل عدة خطوات لحل المشكلة:
    تجميع طلبيات كل شخص على حدى باستخدام group by ثم عمل استعلام فرعي يختبر تصنيف طلبيات كل شخص select customer_name , (case WHEN 'DELIVERED' = ALL (SELECT status FROM customer_order) then 'COMPLEATED' WHEN 'SUBMITTED' = ALL (SELECT status FROM customer_order) then 'AWATING PROGRESS' WHEN 'DELIVERED' != some(SELECT status FROM customer_order) then 'IN PROGRESS' ELSE 'AWATING SUBMITTON' END) as final_status from customer_order group by customer_name إن لم يعمل الاستعلام، يمكن تجزيئه واستخدام VIEW وتشكل جدول يحوي جزء من العلاقة.
    كما استخدمنا العبارة CASE لإعادة حالة مجموعة الطلبيات، حيث كل منها تختبر أحد الحالات، وتعيد سلسلة نصية كما هو مطلوب.
    لاحظ أن ترتيب عمل الشروط ضمن CASE ضروري حسب الحالات لديك
×
×
  • أضف...