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

Mustafa Suleiman

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

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

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

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

    384

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

  1. Google Developer عباةر عن برنامج مجاني يقدم مجموعة من الأدوات والموارد لمن يرغبون في إنشاء تطبيقات وخدمات على منصة Google، أي للمطورين. ويوفر التالي: مجموعة واسعة من الأدوات مثل Android Studio، Firebase، Google Cloud Platform، و Google Maps APIs. دروسًا، وثائق، ودورات تدريبية لمساعدة المطورين على تعلم كيفية استخدام أدوات Google. دعمًا تقنيًا للمطورين من خلال المنتديات، وشبكات التواصل الاجتماعي، ووثائق الدعم. فرصًا للمطورين لعرض تطبيقاتهم على متجر Google Play، والحصول على شهادة Google Developer، والمشاركة في برامج Google Developer Groups. بإمكانك الانضمام إلى برنامج Google Developer مجانًا من خلال موقع Google Developer.
  2. أنت تستخدم طريقة المدى الربيعي (IQR) للكشف عن البيانات الشاذة، وهي طريقة مستخدمة بكثرة وفعالة. وهناك طرق مختلفة لما تريده، أولها الفهرس المنطقي Boolean Indexing diabetes = diabetes[(diabetes['Insulin'] >= lower_bound) & (diabetes['Insulin'] <= upper_bound)] سيتم إنشاء مجموعة بيانات جديدة تسمى diabetes تستبعد الصفوف التي تحتوي على قيم "Insulin" شاذة. الطريقة الثانية هي باستخدام طريقة drop: outlier_indices = diabetes[(diabetes['Insulin'] < lower_bound) | (diabetes['Insulin'] > upper_bound)].index diabetes.drop(outlier_indices, inplace=True) ستحذف الصفوف التي تحتوي على قيم شاذة من مجموعة البيانات الأصلية diabetes. الطريقة الثالثة هي من خلال loc: diabetes.loc[~((diabetes['Insulin'] < lower_bound) | (diabetes['Insulin'] > upper_bound)), :] ستنشئ مجموعة بيانات جديدة تحتوي فقط على الصفوف التي لا تحتوي على قيم شاذة.
  3. الـ Outlier عبارة عن قيمة بيانات تقع بعيدًا عن بقية البيانات في مجموعة البيانات. وأحيانًا يكون سببها خطأ في القياس أو بيانات غير متوقعة، وتؤثر على متوسط المجموعة، والانحراف المعياري، والارتباطات. وتستطيع إزالتها أو تحويلها أو استخدام تقنيات إحصائية مقاومة. مثلاً في مجموعة بيانات لدرجات الطلاب، يكون هناك طالب حصل على درجة 95 بينما حصل بقية الطلاب على درجات بين 70 و 85. بينما الـ Extreme Outlier هي قيمة بيانات تقع بعيدًا جدًا عن بقية البيانات في مجموعة البيانات، بشكل أكبر من outlier العادي، وذلك يعرف أيضًا باسم gross error. وغالبًا ما يكون سببها خطأ في القياس أو بيانات غير متوقعة بشكل كبير، وتؤثر بشكل كبير على متوسط المجموعة، والانحراف المعياري، والارتباطات، وتؤثر على تحليل البيانات بشكل كبير مقارنًة بالـ Outlier. ويجب التعامل معها بحذر شديد، فمن الضروري إزالتها أو تحويلها، ولكن يجب التحقق من سبب وجودها أولاً. مثلاً في نفس مجموعة البيانات، هناك طالب حصل على درجة 150 بينما حصل بقية الطلاب على درجات بين 70 و 85.
  4. تحتاج إلى تعديل التالي في ملف settings.gradle في السطر 3: def localProperties = Properties() لتصبح: def localProperties = new Properties() أي بوضع كلمة new. إن لم تجد ما سبق فقم بوضع كلمة new قبل السطر الذي يسبب المشكلة مثلاً كالتالي: if (keystorePropertiesFile.exists()) { keystoreProperties.load( new FileInputStream(keystorePropertiesFile))}
  5. ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم الأسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
  6. ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم الأسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
  7. طالما ذكرت سوق العمل الحر فتوجه مباشرًة إلى PHP ولارافل ثم تعلم ووردبريس، لكن لا تستمع إلى أحد، تفقد مواقع العمل الحر التي تنوي العمل عليها ونوعية المشروع المعروضة والمهارات الخاصة بها، ثم اتخذ قرارك بناءًا على ذلك. وفي كلا الأحوال سيتعين عليك تعلم جافاسكريبت فهي لغة الويب للواجهة الأمامية وبدونها ستحتاج إلى استخدام مكتبة مثل alpine للإلتفاف حول عدم تعلم اللغة، وذلك لا أنصحك به، قم بتعلم الأساسيات التي تمكنك من فهم سطور اللغة على الأقل ثم تستطيع استخدام مكتبة مثل alpine وبعد ذلك تستطيع التعمق في تعلم جافاسكريبت بعد فترة. ابحث عن Tall stack وتعلم التقنيات الخاص به بعد القيام بالبحث في الخطوة الأولى وإتخاذ قرارك.
  8. بخصوص شرح لمكتبة Turtle فلا يوجد على وجه الخصوص، هناك نقاشات حول تلك المكتبة هنا: بينما ستجد هنا شرح لمكتبة pygame وتطبيقات عملية على المكتبة ففي المقال التالي يوجد مرجع لكافة المقالات حول pygame في الأكاديمية: بالطبع على اليوتيوب يوجد شروحات عملية لكلاهما
  9. من الطرق السهلة لفعل ذلك هي Permutation Feature Importance أو أهمية ميزة الإزاحة، وستجدها بالعديد من مكتبات التعلم الآلي، مثل scikit-learn، حيث توفر وظائف مدمجة لحسابها. وتلك الطريقة توفر تصنيفًا واضحًا لأهمية الميزة، الأمر الذي يسهل فهم النتائج وتفسيرها، وتستطيع تطبيق أهمية ميزة الإزاحة على أي نموذج تعلم آلي، بما في ذلك النماذج الخطية وغير الخطية، دون الحاجة إلى تعديلات كبيرة على النموذج أو معاملاته الفائقة. أيضًا مقاومة للارتباطات بين الميزات، وهو أمر شائع في العديد من مجموعات البيانات، وبإمكانك حساب أهمية ميزة الإزاحة بسرعة نسبية، خاصة عند مقارنتها بطرق أخرى مثل إزالة الميزة التكرارية (RFE). للتوضيح: from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.inspection import permutation_importance X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) rf = RandomForestClassifier(n_estimators=100, random_state=42) rf.fit(X_train, y_train) importances = permutation_importance(rf, X_test, y_test, n_repeats=10, random_state=42) # الحصول على درجات أهمية الميزة importance_scores = importances.importances_mean # فرز الميزات حسب الأهمية sorted_features = np.argsort(importance_scores)[::-1] # تحديد أفضل 3 ميزات top_3_features = sorted_features[:3] print("Best 3:", X.columns[top_3_features])
  10. أقصد النتيجة التي حصلنا عليها من خلال اختبارنا الإحصائي ليست نتيجة عشوائية، بل هي نتيجة ذات احتمال ضئيل جدًا للحدوث إن كانت الفرضية الصفرية صحيحة. أي أن هناك احتمالًا ضئيلًا جدًا لأن يكون ذلك الفرق نتيجة للصدفة. للتوضيح: الفرضية الصفرية: لا يوجد فرق بين متوسطي العينتين. الفرضية البديلة: يوجد فرق بين متوسطي العينتين. في حال قيمة p أقل من مستوى الدلالة (عادةً 0.05)، فإننا نرفض الفرضية الصفرية ونستنتج أن هناك فرقًا "ذو دلالة إحصائية" بين متوسطي العينتين.
  11. عليك تحديد ما هو استخدامك هل للبرمجة فقط أم هناك استخدامات أخرى وما هي الميزانية، وهل تستخدم الحاسوب خارج المنزل أم داخل المنزل أغلب الوقت؟ عامًة للبرمجة أنت لست بحاجة إلى مواصفات مرتفعة يكفي حاسوب بمواصفات متوسطة والأهم وجود 16 جيجابايت من الذاكرة العشوائية و هارد SSD للنظام.
  12. الغرض منها إجراء اختبار t للعينات المستقلة وهو اختبار إحصائي لمقارنة متوسطين لعينتين مستقلتين. وذلك عندما تريد معرفة هل هناك فرق ذو دلالة إحصائية بين متوسطين لعينتين مستقلتين. حيث تُجري ttest_ind اختبار t للعينات المستقلة وتُعيد قيمتين: القيمة p: وهي احتمال الحصول على الفرق المُلاحظ بين متوسطي العينتين إن لم يكن هناك فرق حقيقي بينهما. إحصائية t: وهي قياس الفرق بين متوسطي العينتين مُقسّمًا على خطأ المعياري. وتستقبل المعلمات التالية: a: مصفوفة NumPy تحتوي على البيانات للعينة الأولى. b: مصفوفة NumPy تحتوي على البيانات للعينة الثانية. axis: المحور الذي يتم حساب الاختبار عليه (افتراضيًا 0). equal_var: قيمة منطقية تُشير إلى ما إن كان يُفترض أن يكون التباين متساويًا بين العينتين (افتراضيًا True). nan_policy: كيفية التعامل مع القيم المفقودة (افتراضيًا "propagate"). للتوضيح: import scipy.stats as stats import numpy as np data1 = np.array([1, 2, 3, 4, 5]) data2 = np.array([6, 7, 8, 9, 10]) result = stats.ttest_ind(data1, data2) print(" p:", result.pvalue) print(" t:", result.statistic) لاحظ في حال كانت القيمة p أقل من مستوى الدلالة (عادةً 0.05)، فإننا نرفض الفرضية الصفرية ونستنتج أن هناك فرقًا ذو دلالة إحصائية بين متوسطي العينتين. أما لو القيمة p أكبر من مستوى الدلالة، فإننا لا نرفض الفرضية الصفرية ونستنتج أنه لا يوجد فرق ذو دلالة إحصائية بين متوسطي العينتين.
  13. في حال لديك أسئلة تتعلق بمحتوى الدروس في الدورة نقوم بالتعليق أسفل الدرس المتعلق بالسؤال أي العنوان الخاص به والمحتوى متعلق بالسؤال. إن كان السؤال غير متعلق بمحتوى الدورة أي خارج محتوى الدرس نقوم بطرح السؤال في قسم أسئلة البرمجة هنا على العام. بما أنّ السؤال لديك متعلق بمراجعة المشروع بشكل عام لذا تستطيع التعليق على الدروس الخاصة بالخاتمة.
  14. من الممكن ذلك بالطبع، وKaggle منصة ممتازة لتعلم مهارات تحليل البيانات والتعلم الآلي لأنها تُقدم مسابقاتها ببيانات حقيقية. لكن لا تُحاول المشاركة في مسابقات متقدمة في البداية، ابدأ بمسابقات خاصة بالمبتدئين لتعلم الأساسيات. ويجب إبراز ما قمت به بشكل سهل القراءة وبالرسوم البيانية وليس مجرد نص فقط، مثلاً كالتالي لكن أضف بعض الصور: https://github.com/tiannaparris/Data-Analysis-Portfolio ستجد تفصيل هنا بخصوص المهارات اللازمة للعمل على تعلمها أيضًا:
  15. ستحتاجين إلى استخدام إطار العمل JUnit الخاص بإختبارات الوحدة وهو الأكثر استخدامًا بخصوص جافا. أيضًا استخدام Mockito وهي إطار عمل لتنفيذ Mocking وتساعدك على اختبار الكود الذي يعتمد على كائنات أخرى، بمعنى إنشاء كائنات مزيفة mock objects في اختبارات الوحدة، وذلك إختياري لتحسين اختبارات الوحدة التي تقومين بها. لنقم بإضافة إطار العمل JUnit بإضافة التبعية التالية في ملف build.gradle: dependencies { testImplementation 'junit:junit:4.13.2' } ثم إنشاء فئة جديدة في src/test/java بامتداد .java. وتلك الفئة ستحتوي على اختبارات الوحدة. ثم كتابة اختبارات الوحدة باستخدام إطار العمل JUnit وسيبدوا كالتالي بدون Mockito: import org.junit.Before; import org.junit.Test; public class ExampleTest { private ExampleClass exampleClass; @Before public void setup() { exampleClass = new ExampleClass(); } @Test public void testExampleMethod() { // كتابة اختبار الوحدة هنا assertEquals("النتيجة المتوقعة", exampleClass.exampleMethod()); } } ثم تشغيل الاختبارات باستخدام Android Studio، وتستطيعي تشغيل الاختبارات الفردية أو جميع الاختبارات في الفئة. الآن عليكِ تمكين مكتبة Mockito في مشروعك عن طريق إضافة التبعية التالية في ملف build.gradle: dependencies { testImplementation 'org.mockito:mockito-core:4.0.0' } ثم إنشاء كائنات مزيفة باستخدام مكتبة Mockito أي نقوم بالكتابة في نفس ملف إختبار الوحدة، ليصبح بالشكل التالي: import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; import static org.junit.Assert.assertEquals; public class MyActivityTest { @RunWith(MockitoJUnitRunner.class) public class MyActivityTest { @Test public void testCalculateSum() { MyActivity myActivity = new MyActivity(); int result = myActivity.calculateSum(2, 3); assertEquals(5, result); } @Test public void testCalculateSumWithMock() { MyDependency dependency = Mockito.mock(MyDependency.class); Mockito.when(dependency.getValue()).thenReturn(5); MyActivity myActivity = new MyActivity(dependency); int result = myActivity.calculateSumWithDependency(); assertEquals(10, result); Mockito.verify(dependency, Mockito.times(1)).getValue(); } } } لاحظي: @Test لإضافة اختبارات جديدة وهو خاص بـ Junit Mockito.mock() لإنشاء كائنات mock objects. Mockito.when() لإرجاع قيم محددة من mock objects. Mockito.verify() للتأكد من استدعاء الطرق المطلوبة. استخدم assertEquals() للتأكد من أن النتيجة تساوي القيمة المتوقعة. بعد ذلك تشغيل الاختبارات باستخدام Android Studio. والإختبار هنا من أجل التأكد هل تُرجع دالة calculateSumWithDependency القيمة الصحيحة عندما تُرجع دالة getValue() في الكائن المزيف القيمة 5؟ وهل تُستدعى دالة getValue() في الكائن المزيف مرة واحدة فقط؟ وبالطبع لا يجب كتابة اسم الكلاس بالضرورة MyActivityTest، بإمكانك اختيار أي اسم تريدينه، لكن من المهم أن يكون اسمًا وصفيًا يعكس وظيفة الكلاس، أي مثلاً تسميته MyActivityCalculatorTest أو MyActivityDependencyTest لإبراز ما يتم اختباره.
  16. الدومين ستحتاج إلى شرائه فهو غير مجاني ولديك منصة مثل Namecheap توفر ذلك، وبعد شرائه تستطيع ربطه على الاستضافة حتى لو مجانية. حيث أنّ الاستضافة المجانية توفر لك دومين فرعي subdomain مثلاً على netlify ستحصل على دومين فرعي مشابه للتالي: portfolio-project.netlify.app
  17. أحيانًا يتم إرسال مثل تلك الرسائل بشكل تلقائي من خلال أداة معينة وليس على وجه الخصوص لملفك، أي يتم تحديد كلمات مفتاحية معينة وإختيار بلد محددة وإرسال الرسائل. منصة outlier.ai منصة معروفة وبها عدد كبير من الموظفين وذلك هو حسابها على لينكدإن: https://www.linkedin.com/company/try-outlier/ والهدف منها هو تدريب نماذج الذكاء الاصطناعي والدفع لك مقابل ذلك.
  18. سيتم ذلك لا تقلق محمد، أرجو الإنتظار لحين مراجعة مشاريعك في حال قمت بتسليمها وسيتم الرد عليك عند الإنتهاء، في حال لم تقم بتسليمها من الأفضل توفير الروابط الخاصة بها على github
  19. لأنها أكثر الخوارزميات كفاءة في البحث في مصفوفات مرتبة، وتعمل بزمن تشغيل O(log n) ، حيث n هو عدد العناصر في المصفوفة، أي أن زمن البحث يقل بشكل كبير مع زيادة عدد العناصر. وتستخدم في العديد من التطبيقات المختلفة، مثل قواعد البيانات، والبحث في الملفات، وإدارة الذاكرة، وغيرها. وتتمثل الفكرة الأساسية في تقسيم المصفوفة إلى نصفين، ثم تحديد النصف الذي يحتوي على العنصر المطلوب. مثلاً لو لدينا مصفوفة مرتبة تحتوي على الأرقام 1، 2، 3، 4، 5، 6، 7، 8، 9، وتبحث عن الرقم 5، فستقوم خوارزمية البحث الثنائي بتقسيم المصفوفة إلى نصفين: النصف الأول: 1، 2، 3، 4 النصف الثاني: 5، 6، 7، 8، 9 ثم ستقوم بتحديد النصف الذي يحتوي على الرقم 5، وهو النصف الثاني، ثم تقسيم النصف الثاني إلى نصفين مرة أخرى: النصف الأول: 5، 6 النصف الثاني: 7، 8، 9 ثم ستقوم بتحديد النصف الذي يحتوي على الرقم 5، وهو النصف الأول، ثم ستقوم بتحديد الرقم 5 في النصف الأول. أي تخيل أنك تبحث عن رقم معين في قائمة مرتبة من الأرقام، تبدأ بالبحث في النقطة الوسطى للقائمة، وفي حال كان الرقم الذي تبحث عنه أكبر من الرقم في النقطة الوسطى، فإنك تركز على النصف العلوي من القائمة، وفي حال الرقم الذي تبحث عنه أصغر من الرقم في النقطة الوسطى، فإنك تركز على النصف السفلي من القائمة، وتكرر تلك العملية حتى تجد الرقم الذي تبحث عنه. ولا يمكن استخدام خوارزمية البحث الثنائي مع البيانات غير مرتبة، وأحيانًا لا تُعطي تلك الخوارزمية النتيجة الصحيحة عند وجود بيانات متكررة. بالتالي هي ليست دائمًا الأفضل في كل الحالات، فهناك خوارزميات أخرى أفضل في بعض الحالات، ومنها: خوارزمية البحث الخطي: أفضل في حالات البحث في مصفوفات صغيرة أو غير مرتبة. خوارزمية البحث الثنائي المتكرر: أفضل في حالات البحث في مصفوفات مرتبة بشكل خاص. خوارزمية البحث الحشوي: أفضل في حالات البحث في مصفوفات كبيرة ومرتبة بشكل خاص.
  20. لو قمت بإنشاء مصفوفة من 3x3 من الأعداد الصحيحة، فإن NumPy ستقوم بتخصيص 9 عناصر في الذاكرة، وستحدد الشكل على أنه (3, 3)، والنوع على أنه int64، والخطوات على أنها (1, 3) و (3, 1). أي أن كل عنصر في المصفوفة يتم تخزينه في الذاكرة بشكل متوالي، مع استخدام الخطوات لتحديد مواقع العناصر المجاورة في المصفوفة. وتلك بنية بيانات تسمى مصفوفة متجانسةhomogeneous array، وهي تُخزن جميع العناصر من نفس نوع البيانات في منطقة متجاورة في الذاكرة. بالتالي تسمح للمكتبة بالتعامل مع البيانات بشكل فعال ومتوافق مع الذاكرة، مما يجعلها مناسبة للعمليات الحسابية الكبيرة. للتوضيح أكثر لو قمت بإنشاء مصفوفة NumPy من نوع int تحتوي على 5 عناصر: import numpy as np arr = np.array([1, 2, 3, 4, 5]) فسيتم تخصيص مساحة في الذاكرة لـ 5 عناصر من نوع int كالتالي: عنوان قيمة 0x1000 1 0x1008 2 0x1010 3 0x1018 4 0x1020 5 وتستخدم مؤشرات pointers الذاكرة للوصول إلى العناصر بشكل مباشر.
  21. أتفهم التشتت الذي يحدث في البداية، لكن بشكل واقعي مجال البرمجة ليس بالسهل ولا يوجد به إختصارات تؤدي لنفس النتيجة التي سيحصل عليها شخص بذل مجهود أكبر. تستطيع مشاهدة بعض المسارات والإكتفاء بذلك، لكن لن تصل للمستوى الذي سيصل إليه الشخص الأول، وأيضًا سيصبح مستواك ضعيف ولن تتمكن من حل المشاكل التي ستواجهك وستحتاج إلى الإعتماد على الآخرين. مجال الواجهة الخلفية Back-End على وجه الخصوص أصعب من الواجهة الأمامية وبحاجة إلى التعلم بشكل مُعمق وليس بشكل سطحي فالأمر يمر بدون مشكلة نسبيًا لو تخصصت في الواجهة الأمامية. لذا ستحتاج إلى دراسة كامل دورة علوم الحاسوب لتتأسس بشكل جيد في البرمجة ويصبح لديك نظرة عامة شاملة، وهناك بعض المسارات مثل الخوارزميات وهياكل البيانات وأنماط التصميم ستواجه صعوبة في فهمها في البداية حاول استيعابها بنسبة 50 إلى 70% وفيما بعد عند التخصص وتنفيذ مشاريع ستتفهم الأمر وتستطيع العودة إليها لاستيعابها بشكل أوضح. أي لا يوجد مسار في الدورة ليس مهم طالما أنك تدرس الدورة بدون خبرة سابقة في البرمجة.
  22. يتم حاليًا مراجعة دورة تطوير الألعاب فهي دورة حديثة نسبيًا، نعتذر لك في الوقت الحالي.
  23. الأمر سيتم كالتالي من خلال إنشاء نموذج HTML ومعالجة البيانات الخاصة به: <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $answers = $_POST; $correctAnswers = array( 'q1' => 'a', 'q2' => 'b', ); $score = 0; foreach ($answers as $question => $answer) { if ($answer === $correctAnswers[$question]) { $score++; } } echo '<div id="result">النتيجة: ' . $score . ' من ' . count($correctAnswers) . '</div>'; } ?> <form id="quiz-form" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <div id="questions"> <h2>السؤال 1</h2> <input type="radio" name="q1" value="a"> الإجابة A <input type="radio" name="q1" value="b"> الإجابة B <input type="radio" name="q1" value="c"> الإجابة C <input type="radio" name="q1" value="d"> الإجابة D <h2>السؤال 2</h2> <input type="radio" name="q2" value="a"> الإجابة A <input type="radio" name="q2" value="b"> الإجابة B <input type="radio" name="q2" value="c"> الإجابة C <input type="radio" name="q2" value="d"> الإجابة D </div> <button id="submit-btn" type="submit">إرسال</button> </form> لاحظ أننا نقارن البيانات المرسلة بالإجابة الصحيحة من خلال مصفوفة correctAnswers وإضافة النتيجة لمتغير باسم score لكل إجابة صحيحة.
  24. ما هي اللغة أو التقنية المستخدمة في مشروعك؟
  25. أولاً، تفقد هل الخادم (VPS) يعمل على المنفذ 8000. يمكنك فعل ذلك عن طريق تشغيل الأمر التالي في منفذ الأوامر، حيث يجب أن يكون المنفذ الذي تستخدمه Nginx لـ WebSocket هو نفس المنفذ الذي يستخدمه Django: sudo netstat -tlnp | grep 8000 ثانياً، لنتأكد من أن تكوين Nginx صحيح، عن طريق تشغيل الأمر التالي: sudo nginx -t ثم لنتأكد من أنّ الخادم يعمل على بروتوكول HTTP/1.1، عن طريق إضافة السطر التالي إلى تكوين Nginx: proxy_http_version 1.1; نفس الأمر لنتأكد من أنه يعمل مع بروتوكول WebSocket، بإضافة التالي: proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; ثم التأكد من أنّه يعمل مع بروتوكول SSL/TLS، بإضافة التالي: ssl_certificate /etc/letsencrypt/live/domain_name/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem; أيضًا قم بتجربة إضافة / إلى نهاية العنوان إن حدث مشكلة قم بإزالتها فذلك يعتمد على إعدادات websocket في الخادم لديك: location /ws/ { proxy_pass http://127.0.0.1:8000/; وفي ملف الإعدادات في django في مصفوفة ALLOWED_HOSTS يجب أن تحتوي على يحتوي على اسم المجال، وإليك مثال عليك تعديله: ALLOWED_HOSTS = ['test.com', 'www.news.com', 'blog.news.com', '111.222.333.444'] أيضًأ في حال تستخدم SSL/TLS، فقم بتعيين SECURE_PROXY_SSL_HEADER في ملف settings.py. SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
×
×
  • أضف...