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

Mustafa Suleiman

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

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

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

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

    393

كل منشورات العضو Mustafa Suleiman

  1. ممتاز، إذن الهدف هو التنفيذ وليس التعلم من أجل التخصص، تحتاج تعلم الأداة أقصد، أنصحك إذن بتعلم دورة تطوير التطبيقات باستخدام لغة JavaScript. من خلالها ستتمكن من بناء مواقع وتطبيقات للهاتف أو للحاسوب، بالتالي تستطيع تعلم لغة تمكنك من تنفيذ أي شيء تريده تقريبًا. الدورة الأخرى المناسبة هي دورة تطوير تطبيقات الويب باستخدام لغة PHP وذلك لو أردت طريقة أسهل لبناء المواقع ولكن ليس تطبيقات الهاتف أو سطح المكتب حيث لغة PHP غير مناسبة لذلك. بعد تقرير أي دورة ستختار مما سبق، ستحتاج إلى دورة تطوير واجهات المستخدم أيضًا في حال ستقوم ببناء مواقع الويب لتتمكن من بناء (التصميم أي الواجهة الأمامية الأزرار والصور وخلافه). لكن لو تريد تحليل البيانات واستخدام الذكاء الاصطناعي في عملك، إذن هناك دورتي: دورة تطوير التطبيقات باستخدام لغة Python (تستطيع من خلالها بناء مواقع ويب كاملة أيضًا) دورة الذكاء الاصطناعي ويوجد حاليًا عرض دورتين بسعر دورة واحدة.
  2. ما هو الهدف من تعلم البرمجة؟ هل هو العمل؟ إن كان كذلك فما هو عمرك الحالي، وهل تنوي العمل بشركة أو مواقع العمل الحر؟ أيضًا ما هو وقت الدراسة المتاح لك يوميًا؟
  3. بيانات التدريب نستخدمها كالتالي: model.fit(x_train, y_target_train, epochs=..., batch_size=...) و بيانات Validation/Dev Data، نستخدمها لمراقبة أداء النموذج أثناء التدريب كاكتشاف Overfitting، وضبط الهايبربارامترات مثل معدل التعلم، عدد الطبقات، أيضًا اختيار أفضل إصدار من النموذج. الأمر الذي يساعدك في تحديد متى تتوقف عن التدريب Early Stopping؟ وأي نموذج أفضل؟ وذلك في مكتبات مثل Keras/TensorFlow: history = model.fit( x_train, y_target_train, validation_data=(x_dev, y_target_dev), epochs=..., batch_size=... ) أو في Scikit-Learn: model.fit(x_train, y_target_train) val_score = model.score(x_dev, y_target_dev) ثم بيانات الاختبار لتقييم أداء النموذج النهائي بشكل موضوعي بعد انتهاء التدريب والضبط. test_loss, test_accuracy = model.evaluate(x_test, y_target_test) ولا تستخدم بيانات الاختبار أبدًا أثناء التدريب أو الضبط، فهي مخصصة للتقييم النهائي فقط، وفي حال ليسل لديك بيانات تطوير كافية، فاستخدام تقنيات مثل Cross-Validation. إليك مثال كامل: from sklearn.model_selection import train_test_split from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense x_train, x_temp, y_target_train, y_target_temp = train_test_split(x, y_target, test_size=0.3, random_state=42) x_dev, x_test, y_target_dev, y_target_test = train_test_split(x_temp, y_target_temp, test_size=0.5, random_state=42) model = Sequential([ Dense(64, activation='relu', input_shape=(input_dim,)), Dense(32, activation='relu'), Dense(1, activation='sigmoid') ]) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) history = model.fit( x_train, y_target_train, validation_data=(x_dev, y_target_dev), epochs=20, batch_size=32 ) test_loss, test_accuracy = model.evaluate(x_test, y_target_test) print(f"Test Accuracy: {test_accuracy * 100:.2f}%")
  4. تفقد الموقع بدءًا من 15 مايو القادم: https://depi.gov.eg/StaticContent/Calendar
  5. تلك مبادرة مقدمة من الحكومة المصرية تهدف إلى تعزيز قدرات الشباب المصري في مجال تكنولوجيا المعلومات والاتصالات وتأهيلهم لسوق العمل الرقمي. والغرض تأهيل الشباب المصري من سن 15 إلى 32 عامًا في مختلف مجالات التكنولوجيا الرقمية الحديثة، مثل الذكاء الاصطناعي، وعلوم البيانات، والأمن السيبراني، وتطوير البرمجيات، والشبكات، والبنية التحتية الرقمية، والفنون الرقمية. وتسعى إلى دعم عملية التحول الرقمي في مصر من خلال بناء جيل جديد من الكفاءات التكنولوجية القادرة على قيادة هذا التحول، وتعزيز الصادرات الرقمية المصرية من خلال تأهيل كوادر قادرة على المنافسة في الأسواق العالمية. وبها برامج تدريبية مركزة تتراوح مدتها من 4 إلى 9 أشهر في مجالات تكنولوجيا المعلومات والاتصالات. تستطيع التقديم من خلال الموقع الرسمي للمبادرة والمجالات البرمجية المتوفرة بها ومنها الذكاء الاصطناعي: https://depi.gov.eg/
  6. عليك تنفيذ الأمر التالي في منفذ الأوامر (الشاشة السوداء terminal) ثم الضغط على Enter: pip list ,سيقوم بعرض قائمة بجميع المكاتب المثبتة في بيئة بايثون الحالية، وستظهر القائمة في شكل جدول يحتوي على اسم المكتبة والإصدار الخاص بها. سيظهر جدول بعمودين عمود Package لاسم المكتبة وعمود Version لإصدار المكتبة.
  7. ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
  8. الأسئلة الخاصة بالدورات لا نضعها هنا، ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
  9. بالضبط، تجمع بين احتمالية البقاء على قيد الحياة بدون حدث والوقت المستغرق بشكل يعكس القيمة التراكمية للبقاء بدون حدث، قم بتجربتها وتقييمها، وإذا لزم الأمر، استكشف طرق دمج أخرى ومقارنة النتائج لتحديد الطريقة الأفضل للمشكلة.
  10. ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
  11. لو افترضنا أنّ efs يمثل حجم التأثير لدواء جديد على مرض معين، فقيمة أعلى تعني دواء أكثر فعالية. و efs_time يمثل الوقت اللازم لبدء ظهور تأثير الدواء بالأيام، فقيمة أقل تعني ظهور التأثير بشكل أسرع. إذن نريد إنشاء متغير هدف يعكس الفاعلية الكلية للدواء مع مراعاة كل من حجم التأثير وسرعة الظهور. فسنقوم بتجربة طرق الدمج ،وهي الضرب، القسمة، الجمع الموزون من أجل إختيار أفضل طريقة: data['target_multiply'] = data['efs'] * data['efs_time'] data['target_divide'] = data['efs'] / data['efs_time'] w1 = 0.7 w2 = 0.3 data['target_weighted_sum'] = (w1 * data['efs']) + (w2 * data['efs_time']) print(data.head()) ثم تدريب نموذج انحدار خطي بسيط لكل متغير هدف قمنا بإنشائه، حيث سنستخدم efs و efs_time كمتغيرات مستقلة features، والمتغيرات الهدف التي أنشأناها في الكود السابق كمتغير هدف target. target_variables = ['target_multiply', 'target_divide', 'target_weighted_sum'] results = {} X = data[['efs', 'efs_time']] for target_name in target_variables: y = data[target_name] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = LinearRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test) r2 = r2_score(y_test, y_pred) rmse = np.sqrt(mean_squared_error(y_test, y_pred)) mae = mean_absolute_error(y_test, y_pred) results[target_name] = {'R-squared': r2, 'RMSE': rmse, 'MAE': mae} print("\nنتائج تقييم نماذج الانحدار:") for target_name, metrics in results.items(): print(f"\nالمتغير الهدف: {target_name}") for metric_name, metric_value in metrics.items(): print(f"{metric_name}: {metric_value:.4f}") بعد تشغيل الكود، ستظهر لك نتائج تقييم الأداء لكل نموذج انحدار، حيث يمثل كل نموذج طريقة دمج مختلفة للمتغيرات efs و efs_time. قارن قيم مقاييس التقييم R-squared، RMSE، MAE بين النماذج المختلفة، حيث R-squared كلما كانت القيمة أقرب إلى 1، كان النموذج أفضل في تفسير التباين في المتغير الهدف. وRMSE و MAE كلما كانت القيم أقل، كان النموذج أفضل في التنبؤ بقيم المتغير الهدف بدقة أكبر أي أخطاء أقل.
  12. السؤال غير واضح؟ ما المطلوب تنفيذه بالضبط؟ تقصد دمج المتغيرين efs و efs_time لإنشاء متغير هدف واحد مناسب لاستخدامه في نموذج انحدار Regression؟
  13. صحيح، فبطبيعته هو معرف فريد لكل صف في البيانات ومصمم لتمييز السجلات عن بعضها البعض في قاعدة البيانات، وليس لتقديم أي معلومة ذات معنى حول ما تحاول التنبؤ به باستخدام نموذج تعلم الآلة. فالنموذج يبحث عن أنماط وعلاقات في الميزات للتنبؤ بالمتغير المستهدف، وعمود الـ ID لا يقدم أي نمط أو علاقة مفيدة. لكن في حالات نادرة جداً يكون له معنى ضمني مرتبط بالبيانات، بمعنى لو الـ ID يتضمن تاريخاً أو تسلسلاً زمنياً، فتلك معلومات مفيدة، رغم أنه من الأفضل استخراج تلك المعلومة الزمنية في ميزة منفصلة بدلاً من استخدام الـ ID نفسه. وللتأكيد، لو الـ ID مجرد رقم أو نص عشوائي لتعريف الصفوف، فإزالته هي القاعدة.
  14. لنبدأ بالترتيب من حيث البنية البسيطة إلى التعقيد والميزات المتقدمة. في بداية تعلمك لتطوير الويب، تتعلم اللغات الأساسية المبني عليها جميع التقنيات الأخرى، وهم HTML , CSS, JS. ومن خلالها تقوم ببناء مواقع ويب ثابتة Static أي محتواها ثابت لا يتغير، مثلاً صفحة هبوط لمنتج ما سيظل محتواها ثابت ولن يتغير، وذلك يسمى موقع إلكتروني. أما تطبيقات الويب هي أكثر ديناميكية وتفاعلية من المواقع الإلكترونية، فالغرض الرئيسي لتطبيقات الويب هو تمكين المستخدم من القيام بمهام محددة أو تحقيق أهداف معينة من خلال الإنترنت، وهي أشبه بالبرامج الحاسوبية التقليدية ولكنها تعمل داخل متصفح الويب. بالتالي المواقع الثابتة لا يتم تغيير محتواها، بينما الديناميكية يتغير محتواها، من خلال إضافة واجهة خلفية لذلك الموقع ويتفاعل المستخدم مع الموقع ويغير من محتواه، مثلاً هنا أنت قمت بإضافة سؤال وبذلك محتوى الموقع تغير وبذلك يصبح موقع ديناميكي. وللعلم مصطلح موقع إلكتروني هو مصطلح عام يشمل كلا النوعين (الثابت والديناميكي)، ولكن بخصوص المقارنة بين موقع إلكتروني مقابل تطبيق ويب، فإذن المواقع الإلكترونية هي النوع الثابت أو المواقع الديناميكية البسيطة التي تركز على عرض المحتوى فقط بشكل أساسي. بالتالي المواقع الديناميكية وتطبيقات الويب يتم بنائها من خلال إطار جانغو أو لارافل أو Flask، الفرق يعتمد على مدى التعقيد ووظائف وغرض الموقع. لكن ذلك ليس كافٍِ بالنسبة للواجهة الأمامية لو أردت المزيد من التفاعلية والسرعة وتجنب إعادة تحميل الصفحة في كل طلب يقوم به المستخدم (إرسال البيانات للواجهة الخلفية)، علينا استخدام أحد إطارات الواجهة الأمامية مثل React أو Vue.js.
  15. ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
  16. أول خطوة هي بناء معجم من بيانات التدريب، أي قم بتحليل بيانات النصوص، واستخرج جميع الكلمات الفريدة، ويوجد أدوات مثل collections.Counter في Python لحساب تردد الكلمات وتحديد الكلمات الفريدة. ثم استبعاد الكلمات النادرة من المعجم، فالكلمات التي تظهر عدد قليل جدًا من المرات ليست مفيدة للتدريب وتزيد من حجم المعجم بلا داعٍ. وnum_embeddings يعني عدد الـ Embeddings حدده بحساب عدد العناصر الفريدة التي تريد تمثيلها، مثلاً الكلمات الفريدة في معجمك أو المستخدمين أو العناصر، ذلك هو حجم قاموسك من الـ Embeddings. والـ embedding_dim هي أبعاد الـ Embedding حددها بالتجربة، ابدأ بقيمة مستخدمة بكثرة مثل 100-300، وجرّب قيمًا مختلفة ولاحظ كيف يؤثر ذلك على أداء النموذج، فالأبعاد الأكبر أفضل للمهام المعقدة والمعاجم الكبيرة، لكنها تستهلك موارد أكثر. وفي حال تستخدم Embeddings مدربة مسبقًا مثل Word2Vec أو GloVe أو FastText، فهي تأتي بأبعاد محددة، حيث GloVe بأبعاد 50، 100، 200، أو 300. بالتالي لو قررت استخدام تلك الـ Embeddings المدربة مسبقًا، فإن embedding_dim يكون بالفعل محددًا مسبقًا.
  17. للتوضيح ببساطة، الـ Embeddings طريقة لتمثيل الكائنات مثل الكلمات، أو العناصر، إلخ، كمتجهات ذات أبعاد منخفضة في فضاء رياضي، الفكرة أننا نريد تمثيل الكائنات بطريقة تصبح بها الكائنات المتشابهة قريبة من بعضها في ذلك الفضاء، والكائنات المختلفة تكون بعيدة. PyTorch توفر طبقة جاهزة torch.nn.Embedding لتنفيذ الـ Embeddings بسهولة. import torch.nn as nn import torch بعد ذلك، إنشاء طبقة الـ Embedding باستخدام الدالة البانية nn.Embedding()، والتي تتطلب مُدخلين رئيسيين: num_embeddings: عدد الـ Embeddings المراد إنشاؤها يمثل حجم المعجم لديك بمعنى عدد الكلمات الفريدة أو عدد العناصر الفريدة. embedding_dim: أبعاد كل Embedding، أي طول المتجه الذي سيمثل كل كائن. للتبسيط لو لديك معجم يحتوي على 10000 كلمة وترغب في تمثيل كل كلمة بمتجه ذي 100 بُعد، نكتب: embedding_layer = nn.Embedding(num_embeddings=10000, embedding_dim=100) ولاستخدامها يجب تمرير مؤشرات indices الكائنات التي تريد الحصول على الـ Embedding الخاصة بها، وتلك المؤشرات عبارة عن موتر Tensor من الأعداد الصحيحة. indices = torch.tensor([5, 100, 500]) embeddings = embedding_layer(indices) print(embeddings.shape) print(embeddings) من الأفضل استخدام Pre-trained Embeddings وهي مدربة مسبقًا مثل Word2Vec أو GloVe أو FastText، فهي تعلمت على كميات هائلة من النصوص، وتعتبر نقطة بداية جيدة للتدريب، خاصة لو كمية البيانات المتوفرة لديك محدودة.
  18. لا يوجد إصدار رسمي لـ DeepHit في TensorFlow من قِبل المصدر الرسمي، لكن يوجد محاولات من المطورين لإعادة تنفيذ النموذج باستخدام TensorFlow. ستجد تطبيق لذلك هنا: https://github.com/Actis92/DeepHitTF2 https://github.com/carlr67/deephitplus ومن الأفضل استخدام مكتبات مساعدة مثل tensorflow-survival أو tf-keras لتبسيط تنفيذ نماذج Survival Analysis. https://github.com/tensorflow/addons/tree/master/tensorflow_addons/losses
  19. من الأفضل إرفاق مجلد المشروع بشكل كامل لتسهيل الأمر
  20. هل تكوين ملف config/filesystems.php هو كالتالي؟ 'disks' => [ 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ], ], وتأكدي من تنفيذ أمر التهجير: php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="migrations" ثم: php artisan migrate أيضًأ ملف config/media-library.php في حال لم يكن موجوداً، عليكِ نشره باستخدام الأمر: php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="config" ثم تعديل نموذج Category كالتالي: namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\MediaCollections\Models\Media; class Category extends Model implements HasMedia { use HasFactory, InteractsWithMedia; protected $fillable = ['name', 'description', 'photo']; public function registerMediaCollections(): void { $this->addMediaCollection('categories') ->singleFile() ->useDisk('public') // تحديد القرص المستخدم ->storedIn('categories'); // تحديد المجلد داخل القرص } public function registerMediaConversions(Media $media = null): void { $this->addMediaConversion('webp') ->format('webp') ->quality(90) ->performOnCollections('categories'); $this->addMediaConversion('avif') ->format('avif') ->quality(90) ->performOnCollections('categories'); } public function subCategories() { return $this->hasMany(SubCategory::class); } } ثم تعديل دالة store في الكونترولر في الجزء الخاص بـ $request->hasFile: if ($request->hasFile('photo')) { $category->addMediaFromRequest('photo') ->toMediaCollection('categories'); } وتنفيذ الأمر التالي لإنشاء الرابط الرمزي للتخزين: php artisan storage:link ثم حذف الملفات والإعدادات المؤقتة: php artisan optimize:clear ومن المفترض أن يتم حفظ الصور في المسار storage/app/public/categories.
  21. سيؤدي إلى مشاكل كبيرة مع القيم الفارغة NULL/NaN في حال لم يتم التعامل معها بحذر، لديك استخدمت OrdinalEncoder الذي يحوِّل كل عمود فئوي إلى عمود واحد عددي مع الحفاظ على هيكل الأعمدة، وذلك يسمح باستخدام نفس الـ mask لاستعادة القيم الفارغة بعد التشفير. لكن من خلال One-Hot Encoding كـ OneHotEncoder من sklearn، يتم إنشاء أعمدة جديدة لكل فئة، الأمر الذي يغير هيكل البيانات بالكامل، ويجعل تطبيق الـ mask الأصلي الذي يعتمد على عدد الأعمدة القديمة مستحيلًا. بعد التشفير بـ One-Hot، ستنشئ أعمدة جديدة لكل فئة كعمود لون به ٣ فئات سيصبح ٣ أعمدة. والـ mask الأصلي يعتمد على عدد الأعمدة القديمة، ولن يتطابق مع عدد الأعمدة الجديدة، ويؤدي إلى أخطاء. وحتى لو تم تعبئة القيم الفارغة بـ missing قبل التشفير، فإن One-Hot سينشئ عمودًا جديدًا لتلك القيمة، وعند محاولة استعادة القيم الفارغة باستخدام encoded_series[mask] = pd.NA، ستكون العملية غير منطقية لأن الأعمدة الجديدة لا تتوافق مع الـ mask. بالتالي عليك التعامل مع القيم الفارغة كفئة مستقلة، بمعنى املأ القيم الفارغة بـ missing قبل التشفير كما تفعل حاليًا. ثم استخدم OneHotEncoder مع تحديد المعلمة handle_unknown='ignore' وستعتبر missing فئة عادية، ولن تحتاج إلى استعادة القيم الفارغة بعد التشفير. from sklearn.preprocessing import OneHotEncoder def onehotencoder_data(data): categorical_cols = data.select_dtypes(include=['object']).columns temp_data = data[categorical_cols].fillna('missing') ohe = OneHotEncoder(handle_unknown='ignore', sparse_output=False) encoded_data = ohe.fit_transform(temp_data) new_columns = ohe.get_feature_names_out(categorical_cols) encoded_df = pd.DataFrame(encoded_data, columns=new_columns, dtype='Int64') data = data.drop(columns=categorical_cols) data = pd.concat([data, encoded_df], axis=1) return data ثم احذف الصفوف التي تحتوي على قيم فارغة قبل التشفير، وذلك ربما يؤدي إلى فقدان بيانات مهمة، فتعامل بحذر، بمعنى القيم الفارغة يجب أن تُعالَج بشكل منفصل حسب البيانات، أقصد هل تعكس missing معلومة مهمة؟ ففي بعض البيانات هي مهمة وتمثل معلومة.
  22. ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
  23. ستحتاج إلى معالجة البيانات الفئوية الاسمة مثل النوع الأول من السكر، من خلالOne-Hot Encoding. أو التمثيلات المضمنة Embeddings أفضل للبيانات الفئوية الاسمية أو الترتيبية في حال عدد الفئات كبيرًا، أو يوجد علاقات معقدة بين الفئات، أو في نماذج تسلسلية.
  24. لا يٌشترط ذلك، لكن مُستحسن، خاصةً عند التعامل مع النماذج التي تتطلب حسابات رياضية دقيقة كالشبكات العصبونية. ففي معظم عمليات الشبكات العصبونية كالضرب المصفوفي، الاشتقاق التلقائي، مُصمَّمة للعمل مع أعداد float32 أو float16، حيث float16 يُقلل استخدام الذاكرة ويُسرّع الحسابات على GPUs الحديثة كتقنية Tensor Cores في بطاقات NVIDIA، لكنه يُؤثر على الدقّة. والنماذج تتعلم من خلال تحديث الأوزان باستخدام التدرجات gradients، والتي تكون من نوع float. PyTorch يدعم أنواعًا عديدة مثل int، long، double، إلخ، لكن لو أدخلت بيانات من نوع int إلى نموذج يتوقع float، ستحصل على خطأ: RuntimeError: expected scalar type Float but found Long بالتالي عند تحميل البيانات، حوّلها مباشرةً باستخدام .float(): import torch data = torch.tensor([1, 2, 3], dtype=torch.float32) وفي حال البيانات من نوع int في مصفوفة NumPy: import numpy as np numpy_array = np.array([1, 2, 3], dtype=np.float32) tensor = torch.from_numpy(numpy_array)
  25. نعتذر لك عبدالله، أرجو إبعاد فكرة أنه تم سرقة أموالك تمامًا، الأمر ليس كذلك مُطلقًا، سيتم الرد عليك وحل المشكلة فلا تقلق بخصوص ذلك، وسأقوم بتفقد المشكلة الخاصة بك. مسألة التأخر في الرد أحيانًا تحدث بسبب وجود ضغط على مركز المساعدة، لذا الأمر طبيعي ولا داعي للقلق.
×
×
  • أضف...