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

Sam Ahw

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

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

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

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

    16

كل منشورات العضو Sam Ahw

  1. إن الخطأ UnknownHostException لا يعطي الكثير من التفاصيل حول المشكلة التي تواجهها فهو خطأ عام ويوجد عدة أسباب لحدوثه، ولكن بشكل عام يظهر هذا الخطأ بكثرة عند عدم توفر اتصال جيّد بالانترنت، ومن الحلول التي يمكنك تجربتها: - حاول التأكد من اتصال جيّد بالانترنت أو حاول تغيير الشبكة. - ابحث عن الملف gradle.properties الموجود ضمن مجلّد المشروع وقم بتغيير القيمة distributionUrl=https\ إلى distributionUrl=http\ - ابحث عن الملفات (gradlew و gradlew.bat) ثم قم بتغيير القيمة DEFAULT_JVM_OPTS الموجودة ضمن الملف كالتالي: DEFAULT_JVM_OPTS="-Dhttp.proxyHost=XXXX -Dhttp.proxyPort=XXXX -Dhttp.proxyUser=XXXX -Dhttp.proxyPassword=XXXX -Dhttps.proxyHost=XXXX -Dhttps.proxyPort=XXXX -Dhttps.proxyUser=XXXX-Dhttps.proxyPassword=XXXX" وبعد ذلك قم بتنفيذ الأمر التالي: gradlew clean build في حال استمرت المشكلة مع مشاريع أخرى، حاول حذف برنامج محرر الشيفرات البرمجية android studio في حال كنت تستخدمه وأعد تثبيته من جديد على حاسوبك.
  2. يجب عليك ذكر المزيد من التفاصيل حول نوع قاعدة البيانات المستخدمة وإرفاق بنية جدول قاعدة البيانات كما هي موجودة حالياً لنستطيع مساعدتك بشكل أفضل، فالصورة المرفقة ليست دقيقة فيما يتعلّق بقواعد البيانات وقد يوجد عدّة طرق لتطبيقها بشكل عملي. ولكن بشكل عام، في حال كانت قاعدة البيانات من نوع MySQL مثلاً يمكنك الاستفادة من التابع SUM أو توابع التجميع aggregate لمطابقة بعض الشروط حسب بنية الجدول في قاعدة البيانات: SELECT SUM(marks) AS Marks FROM marksDetails;
  3. في النسخ الحديثة من لارافل، أتاحت للمبرمجين سهولة في التعامل مع جدولة الأعمال، فبدلاً من إنشاء مجدول cron خاص لتنفيذ مهمة محددة وإدارتها مباشرةً من الخادم، أتاح إطار العمل واجهة لمعالجة هذه الأوامر مباشرةً من خلال الشيفرة البرمجية. بالنسبة لسؤالك، فالتوقيت الموجود ضمن Cron يمكنك استخدامه بنفس الصيغة من خلال الشيفرة البرمجية: ->cron('* * * * *'); بحيث يتم تغيير علامة النجمة (*) حسب التوقيت الذي ترغب فيه، وبنفس الطريقة يوجد بعض التوابع التي يمكنك استخدامها بشكل مباشر في حال لم يكن لديك خبرة مسبقة بالتعامل مع صيغة cron، من بعض الأمثلة: ->everyMinute(); ->everyTwoMinutes(); ->hourly(); ->hourlyAt(17); ->daily(); ... وبالتالي لن تحتاج لتنفيذ الأوامر مثل queue:work بشكل مباشر، بل بدلاً من ذلك يمكنك جدولة queue بالشكل التالي: $schedule->job(new Heartbeat)->everyFiveMinutes(); وجدولة المهام من خلال موجّه الأوامر أو الخادم بشكل مباشر تتم من خلال تنفيذ الأوامر بالشكل التالي: * * * * * php /path/to/your/project/artisan queue:work كما يمكنك قراءة المزيد من التفاصيل والأمثلة في التوثيق الرسمي في لارافل من قسم (جدولة المهام Task Scheduling). في حال كان لديك مشكلة أخرى، أرجو منك ذكر المزيد من التفاصيل وتوضيح سؤالك.
  4. هل يمكنك مشاركة رسالة الخطأ التي تظهر لك في حال كان يوجد مشكلة في التطبيق؟ الألوان لا تساعد في تحديد الخطأ وذلك لأنها قد تختلف من بيئة تطوير لأخرى ومن مشروع لآخر. في حال كانت تظهر لك الرسالة التالية: Cannot resolve symbol ‘AppCompatActivity’ يمكنك التوجه إلى ملف build.gradle الموجود على مستوى التطبيق (مجلّد app) وتعديل السطر التالي: ‘com.android.support:appcompat-v7:XX.X.X’ إلى ‘com.android.support:appcompat-v7:XX.X.+’ (حسب النسخة المستخدمة في مشروعك، بإضافة العلامة +). وبعدها يمكنك التوجه إلى القائمة File في برنامج Android Studio واختيار Sync Project with Gradle Files لمزامنة التغييرات في مشروعك بعد الحفظ.
  5. حاول التقاط الأخطاء حتى تستطيع الحصول على رسائل خطأ أكثر وضوحاً وتحديد مكان وجود الخطأ في الشيفرة البرمجية لديك، مثال: try { const app = initializeApp(firebaseConfig); const auth = getAuth(app); } catch(error) { console.log('Error:', error) } وعند ظهور رسائل الخطأ المفصلة يمكنك البحث عنها بكتابة رسالة الخطأ على الانترنت وستجد العديد من الحلول لأشخاص واجهت نفس المشكلة التي تواجهها أنت وتمكنّت من حلها. فمثلاً إضافة التضمين التالي بالترتيب قد يساعدك على حل المشكلة: import { initializeApp } from 'firebase/app'; import { getAuth } from "firebase/auth"; import { getFirestore } from "firebase/firestore"; const firebaseConfig{ ... } مع تصدير auth , db لاستخدامها في الشيفرة البرمجية لديك: const app = initializeApp(firebaseConfig); const auth = getAuth(app); const db = getFirestore(); export { auth, db }; في النهاية قد تختلف رسائل الخطأ من جهاز لآخر حسب نظام التشغيل لديك ونسخ الإصدارات التي تستخدمها والطريقة التي قمت فيها بربط Firebase لذلك أفضل حل هو أن تقوم بالبحث عن رسائل الخطأ وحلها بشكل مباشر على جهازك.
  6. تقدّم Firebase العديد من الخدمات والحلول البرمجية التي يعتمد عليها عدد كبير من مواقع الانترنت وتطبيقات الهاتف الجوال. بتعلّملك لتقنيات Firebase وطرق استخدامها وتطبيقها قد يوفّر عليك الوقت والجهد كمبرمج حيث تسهّل العديد من المهمات على المبرمج وتتيح إمكانية ربط سهلة ومرنة مع مختلف أنماط المشاريع. من الممكن الاستغناء عن بعض تقنياتها والقيام بها بنفسك مثل خدمات التوثيق وقاعدة البيانات وغيرها في حال وجدت نفسك قادر على إنشاء هذه الخصائص بنفسك دون الحاجة لخدمات Firebase، ولكن ذلك قد يزيد وقت تنفيذ المشروع ويزيد من حجم العمل المطلوب حيث سيتوجب عليك بناء هذه الخصائص بنفسك من الصفر والعمل على صيانتها واختبارها بشكل كامل في الواجهة الخلفية Backend.
  7. في حال كنت تقصد كيف يتم مشاركة المشروع الذي تعمل عليه، فيمكنك ذلك من خلال تصدير المشروع من خلال النافذة Export Wizard Dialog والتي تتيح لك بعض الخيارات لتصدير المشروع ومشاركته على أي وسيلة. ولكن يتم تشغيل المشروع فقط على أنظمة التشغيل المدعومة حسب مشروعك الذي تعمل عليه (في حال كان تطبيق سطح مكتب .exe أو غيرها من الأنماط). حاول اتباع الإرشادات الموجودة ضمن الرابط التالي كيف تحصل على إجابك لسؤالك؟ للحصول على أجابات أدق على سؤالك.
  8. تأكد من عدم وجود أكثر من آلة مفتوحة بنفس الوقت، من خلال تنفيذ الأمر: vagrant global-status والذي سيطلعك على تفاصيل العمليات الجارية لديك. وحاول إغلاق أي عمليات أخرى غير التي تستخدمها حالياً في ssh. في حال استمرت المشكلة حاول تثبيت مكتبة Ruby. وإعادة تثبيت مكاتب virtualbox-dkms التالية: sudo apt-get remove virtualbox-dkms sudo apt-get install virtualbox-dkms sudo modprobe vboxdrv sudo modprobe vboxnetflt وأيضاً من الحلول الأخرى المتاحة هي التوجه إلى مجلّد vagrant وحذفه نهائياً من خلال الأمر التالي: vagrant box remove ubuntu/trusty64 مع استبدال الاسم الأخير حسب الاسم الموجود لديك، ولمعرفة الاسم يمكنك تنفيذ الأمر التالي: vagrant box list
  9. ضمن الجزء الخاص بشيفرة PHP لديك أنت تقوم بإزالة السجل من قاعدة البيانات فقط، وفي حال كنت تخزّن مسار الصورة ضمن سجل قاعدة البيانات يمكنك استخدام الدالة unlink لحذف الصورة من المجلّد حسب القيمة الموجودة في قاعدة البيانات (مسار أو اسم الملف). مثال: $filePath = 'path/to/file.jpg' // جلب القيمة من قاعدة البيانات if (file_exists($filePath)){ unlink($filePath); }
  10. أعتقد من الشيفرة البرمجية لديك أن المتغيّر $order['id'] هو من الشيفرة وليس ضمن الاستعلام، لذلك يمكنك تبسيط الأمر بإجراء هذا الاختبار على مستوى التطبيق بما أن قيمة المتغيّر موجودة مسبقاً لديك وبالتالي تنفيذ أحد الاستعلامين بشكل منفصل حسب قيمة المتغيّر. أو يمكنك إجراء نفس الشروط IF ضمن استعلام Mysql التي ستجريها ضمن الشيفرة البرمجية ولكن ذلك سيزيد من تعقيد الاستعلام وخاصةً أنه في حالتك يتم التجميع بين عدد من الجداول. حيث يمكن استخدام الشروط IF ضمن الاستعلامات بالشكل التالي: IF(fd.condition = 1, 'Y', 'N') (في حال تحقق الشرط = 1 سيتم أخذ القيمة "Y" وإلا سيتم أخذ القيمة "N"). مثال على مشروعك: IF(patron_colors.order_id > 0 , patron_colors.color_name = order_buttons.color_select OR patron_colors.color_name = order_buttons.color_select AND patron_colors.order_id=' .$order['id'] , patron_colors.color_name = order_buttons.color_select OR patron_colors.color_name = order_buttons.color_select) كما يمكن أن تأخذ الشروط أشكال أخرى حسب مكان ورودها ضمن الاستعلام ويمكنك إجراء بحث إضافي على الانترنت للتوسع بطرق استخدامها والاطلاع على بعض الأمثلة الأخرى.
  11. بالطبع يمكنك ذلك، تتيح لارافل العديد من الحلول للتعامل مع البث الحي للبيانات بالاعتماد على تقنيات Websockets. يمكنك البدء بالتعرّف على هذه التقنية وقراءة قسم Broadcasting في توثيق لارافل لفهم الحلول الموجودة ومزايا كل منها. وإذا أردت البحث أكثر ستجد العديد من المصادر حول Laravel Websockets بأشكال مختلفة دروس، مقالات، فيديوهات،..إلخ. أما بالنسبة للتأثير على مشروعك الحالي، يمكنك البدء بإضافة هذه الخاصية بشكل منفصل ضمن المشروع بحيث لا تتداخل الشيفرات البرمجية مع الصفوف والكائنات الموجودة حالياً وبعد اختبار النظام ككل يمكنك البدء بدمجه حسب الوظائف المطلوبة لديك. كما يمكنك الاستفادة من بعض التقنيات الموجودة بشكل منفصل مثل Pusher والتي يمكنك إضافتها لمشروعك الحالي بسهولة دون أن تؤثر على بنية المشروع.
  12. يمكنك استخدام حقل الإدخال input ضمن نموذج في HTML لإختيار صورة من ملفات الجهاز حتى يتم رفعها إلى خادم الويب كالتالي: <form> <label for="img">Select image:</label> <input type="file" accept="image/*"> <input type="submit"> </form> حيث تتيح لك الخاصية accept السماح باختيار نوع معيّن من الملفات مثل الصور image وملفات الصوت audio/* والفيديو video/* وغيرها. إكمال الشيفرة البرمجية يتطلب معرفة بآلية عمل خادم الويب وطرق إرسال البيانات بين طرفي المستخدم والخادم لذا حاول البحث عبر الانترنت حسب لغات البرمجة أو أطر العمل التي تتعلمها وستجد العديد من الأمثلة والحلول الكاملة.
  13. كل من الطريقتين صحيح لكتابة الزر: <input type="button"> أو <button type="button"> لذا حاول تغيير الخاصية type إلى button بدلاً من submit حتى لايتم تحديث الصفحة عند الضغط على الزر. وسيتم تنفيذ التابع editNoteHandler
  14. مع أن الشيفرة البرمجية المرفقة غير كاملة، ولكن بشكل عام عند وجود أكثر من زر داخل النموذج form، سيتم اعتبار حدث النقر على أي زر بمثابة submit لذلك يجب عليك إضافة الخاصية التالية للأزرار الثانوية الموجودة ضمن النموذج form: <button type="button">Edit</button> ^^^^^^^^^^^^^ إضافة هذه الخاصية ستمنع إرسال النموذج submit
  15. ظهور هذا الخطأ عادةً بسبب مشكلة في ملفات gradle، يمكنك حذفه وإعادة تحميله من خلال اتباع الخطوات التالية: أولاً تأكد من تجربة الأوامر التالية لعلها تحل المشكلة: flutter clean flutter pub get flutter run في حال لم يتم حل المشكلة يمكنك تجربة الخطوات التالية لإعادة تحميل gradle: - ضمن المسار التالي يجب أن تقوم بحذف ملفات gradle والتي تجده ضمن المسار التالي: C:\Users\myuser\.gradle\wrapper\dists ^^^^^^ هنا سيكون اسم المستخدم على جهازك ضمن هذا المسار ستجد مجلّد متبوعاً باللاحقة -all مثلاً في حال كان لديك النسخة 6.7 سيكون اسمه: gradle-6.7-all نقوم بحذفه. - ثم قم بفتح المشروع في android studio أو من خلال موجّه الأوامر لتنفيذ الأمر التالي: flutter run -v - وأخيراً أعد تنفيذ الأمر flutter clean في حال لم تتمكن من حل المشكلة بهذه الطريقة، حاول البحث على الانترنت بكتابة الخطأ الظاهر لك zip END header not found في أي محرك بحث وستحصل على العديد من الطرق التي يمكنك اتباعها لحل المشكلة.
  16. في هذه الحالة لن تستطيع الوصول بشكل مباشر إلى قيمة user من المتحكّم studentController. إن المتحكّم الأول لديك supervisorController يقوم بالوصول إلى قيمة المتحوّل user من خلال الطلب request، والطلب request يتم تمرير بياناته من خلال المسار الموافق له route وبالتالي استدعاء هذه القيمة في متحكّم آخر لن تستطيع الوصول إلى القيم الممررة من خلال المسار Route لأنه سيتم استخدام مسار آخر. بصورة عامة، إن معمارية إطار العمل لارافل MVC لاينصح باستخدام المتغيّرات العامة Global variables فذلك سيزيد من تعقيد الشيفرة البرمجية لديك وبمفهوم لارافل إن خصائص أو متغيرات كل متحكّم يجب أن تكون خاصة private للمتحكّم نفسه فقط وفي حال وجدت أن الشيفرة البرمجية تتطلب استدعاء عدة متحكمات لإنجاز دالة معينة فيجب عليك إعادة بناء مشروعك لأن الشيفرة البرمجية لديك غير أمثلية. في حالتك هذه، يمكنك إعادة الوصول إلى القيم المررة من خلال الطلب request بإعادة كتابة الشيفرة البرمجية نفسها: Class StudentController extends Controller{ public function index(Request $request){ $user = request()->user --> هنا سيتم الوصول إلى قيمة المتغير من خلال الطلب الموجود في المسار Route } } ولكن عندها يجب عليك أيضاً تعديل المسار route ليتناسب مع ذلك. أقترح عليك مراجعة أساسيات إطار عمل لارافل والاطلاع على التوثيق الرسمي لترسيخ فكرة معمارية MVC والتمييز بين كل المسارات Routes و المتحكّمات Controllers
  17. يجب إضافة الفاصلة (,) بعد كل خاصية من خصائص الكائن في الجافاسكريبت. وفي الشيفرة لديك نسيت إضافة الفاصلة بعد الخاصية age:16 فظهر الخطأ (الشريط الأحمر) على الخاصية gender. let person = { name: 'Yousef', age: 16 , ^^ يجب عليك إضافة الفاصلة هنا ... }
  18. في مختلف لغات البرمجة يجب عليك تضمين الصف أو الملف الذي تريد استخدامه أولاً، مثلاً في إطار العمل لارافل يمكنك إضافة المتحكّم كالتالي: بفرض لديك المتحكّم الأول TasksController: <?php use App\Task; class TasksController extends Controller { public function addTask($task){ ... } } لكي تسطيع الوصول إلى توابع ومتغيرات هذا المتحكّم في متحكّم آخر يمكنك إضافته كالتالي: <?php use App\Http\Controllers\TasksController; -->يتم تضمين المتحكّم في بداية الملف class JobsController extends Controller { public function checkTasks($id) { // ثم يمكنك إنشاء كائن جديد للوصول إلى أي توابع أو متغيرات ضمن هذا المتحكّم $tasks_controller = new TasksController; // الوصول إلى توابع المتحكّم $tasks_controller->addTask($task); } } قد يكون التطبيق مختلف بين لغة برمجة وأخرى لذلك عند طرح السؤال يجب عليك ذكر المزيد من التفاصل حول لغة البرمجة أو إطار العمل الذي تستخدمه حتى نستطيع تقديم إجابات مناسبة للغة البرمجة التي تستخدمها. يمكنك الاطلاع على الإرشادات الموجودة هنا: كيف تحصل على إجابة لسؤلك؟
  19. يمكنك إنشاء حساب لك على مواقع العمل الحر والخدمات المصغّرة مثل منصة مستقل وخمسات، وطرح خدماتك التي تستطيع تقديمها مع كتابة بعض التفاصيل عن مهاراتك وسيرتك الذاتية. كما تتيح لك هذه المنصات إمكانية البحث عن مشاريع تستطيع إنجازها والتقدّم عليها.
  20. بالطبع يمكنك استخدام خدمة تسجيل الدخول من Google دون استخدام Firebase لأن كل منهما منفصل عن الآخر وخدمة تسجيل الدخول من Google يتم استخدامها في لغات برمجة وأطر عمل مختلفة بشكل مستقل بدءً من مواقع الويب وحتى تطبيقات الهاتف الجوال. ولكن Firebase تتيح لك جميع الأدوات اللازمة لتسهل عليك العمل كما يمكنك ربط خاصية تسجيل الدخول مع قاعدة بيانات مباشرةً ضمن Firebase وبالتالي حفظ بيانات المستخدمين ومعلومات تسجيل الدخول الخاصة بهم لاستخدامها ومكاملتها في وظائف التطبيق لديك. متى يفضّل استخدام Firebase؟ في حال كان لديك خادم ويب متكامل وقاعدة بيانات منفصلة للتطبيق مسبقاً يمكنك الاستغناء عن Firebase وبرمجة تسجيل الدخول بشكل يدوي وحفظ البيانات في قاعدة البيانات الخاصة بخادم الويب لديك. أما في حال كان تطبيقك يعتمد على بعض خصائص Firebase أو Firestore وقاعدة البيانات وطرق تسجيل الدخول الأخرى، من الأسهل لك استخدام خصائص تسجيل الدخول المقدّمة من Firebase لأنها ستختصر عليك الوقت والجهد بدلاً من برمجة طرق تسجيل الدخول بشكل يدوي ومنفصل.
  21. في نظام ويندوز يمكنك تجميع الملفات النصية في مجلّد واحد وفتح نافذة موجه الأوامر CMD ضمن هذا المجلّد وتنفيذ الأمر التالي: copy *.txt newfile.txt حيث newfile هو اسم الملف الذي سينتج عن دمج كافة الملفات ذات اللاحقة txt الموجودة ضمن المجلّد ملاحظة: في حال أردت الفصل بين محتويات الملفات يجب عليك التأكد من ترك سطر فارغ في آخر كل ملف، لأن تنفيذ الأمر السابق سيقوم بجمع محتوى الملفات كما هو دون الفصل بين محتويات هذه الملفات.
  22. لا يشير اللون الأحمر هنا إلى خطأ ضمن مشروعك. يظهر اسم الملف باللون الأحمر وبجانبه الحرف D أي Deleted (محذوف). وهذه الأحرف التي تظهر بجانب اسماء الملفات هي من قبل GIT لمساعدتك على متابعة حالة الملفات في مستودع مشروعك ضمن GIT ورموزها كالتالي: A: Added - عند إضافة ملف جديد M: Modified - ملف موجود مسبقاً ضمن المستودع وتم التعديل عليه (تم حفظه ضمن GIT قبل مرحلة Commit) D: Deleted - ملف تم حذفه ولم يعد موجود ضمن المستودع. U: Untracked: الملف جديد أو تم التعديل عليه وهو خارج نطاق المستودع (لم يتم إضافته إلى المستودع بعد). C: Conflict: نسخة الملف متضاربة مع نسخة سابقة موجودة في مستودع المشروع R: Renamed: تم تغيير اسم الملف عن الاسم المحفوظ في مستودع المشروع S: Submodule - وجود الملف ضمن مستودع جزئي آخر. هذه الإشارات والألوان تسهل على المبرمج متابعة حالة الملفات بدلاً من تنفيذ الأمر التالي ضمن موجّه الأوامر: git status وعند قيامك بحفظ التغيرات ضمن مستودع مشروعك ستختفي من محرر الشيفرات البرمجية. ولكن في حال أردت تعطيلها يمكنك ذلك من خلال النافذة File ثم Preferences ثم Settings وبعد ذلك قم بالبحث عن العبارة التالية: "git.decorations.enabled" وقم بتغييرها إلى false.
  23. يمكنك الاستعلام عن طرق الدفع المتاحة والعملات من خلال التواصل مع فريق الدعم بالضغط على زر تحدث معنا الموجود (في هذه الصفحة) سيساعدونك ويجيبون على أي استفسار لديك.
  24. موقع codesandbox هو محرر لكتابة الشيفرات البرمجية ومعاينتها ضمن المتصفح، وهو ليس لغة برمجة أو إطار عمل لبناء تطبيقات الهاتف الجوال، بل هو محرر شيفرات مثله مثل برنامج Vs Code على جهازك الحاسوب إنما فقط يتيح إمكانية إنشاء نسخ بسيطة أو مسودة لمشروع برمجي لتستطيع كمطوّر مشاركة الشيفرة البرمجية مع غيرك عبر الانترنت. لتطوير تطبيقات الهاتف الجوال يجب عليك بناء المشروع باستخدام إحدى لغات البرمجة أو أطر العمل التي تدعم التطبيقات كما تم الإشارة لك في التعليق السابق (Android, Flutter, React Native, Swift وغيرها). يمكنك الإطلاع على المصادر التالية لتستطيع التمييز أكثر بين هذه المصطلحات والتقنيات قبل اختيار الحل الأمثل لمشروعك:
  25. يمكنك تحقيق ذلك من خلال إضافة مكونات Views فارغة للفصل بين العناصر مع تحديد الخاصية weights حسب المسافة المطلوبة: ضمن hotizontal linear layout: <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <!-- زر أو أيقونة على جهة اليسار --> <Button ... ... /> <!-- فاصل أو مسافة --> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <!-- زر أو عنصر جديد في الوسط --> <Button ... ... /> <!-- فاصل أو مسافة --> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <!-- زر أو عنصر على جهة اليمين --> <Button ... ... /> </LinearLayout> ولكن يوجد حل أسهل وأسرع من خلال استخدام relativeLayout في حال كان لديك عدد أقل من العناصر وستمكنك من التحكم بموضع هذه العناصر بالنسبة للحاوية بدلاً من ترك مسافات فارغة. حاول البحث والإطلاع على relativeLayout على الانترنت، كما يمكنك لصق أجزاء الشيفرات والكود البرمجي مباشرةً عند طرح سؤالك لتسهل مساعدتك والإجابة على أسئلتك في المستقبل.
×
×
  • أضف...