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

Kais Hasan

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

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

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

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

    24

كل منشورات العضو Kais Hasan

  1. إن الطريقة __new__ تقوم بإنشاء غرض جديد من الصنف المطلوب بينما الطريقة __init__ تقوم بتهيئته بالقيم المطلوبة و بالتالي فإن __new__ تقوم بإعادة غرض من هذا الصنف بينما __init__ لا ترجع شيئاً. عندما نقوم بتعريف كائن من صف فإننا نستعمل الباني، و هو فعلياً يقوم في البداية باستعمال __new__ لإنشاء غرض جديد ثم يستدعي __init__ على هذا الغرض بالبارامترات التي قمنا بتمريرها. في غالب الأحيان لن تضطر إلى تعريف __new__ بنفسك، حيث أن استعمالها يعتبر متقدم نوعاً ما، بشكل عام أنت تريدها لضبط عملية صنع الأغراض، مثلا في حال كنت تريد تصميم صنف يتبع نمط التصميم singleton فإنه يمكن استعمالها لتقييد ألا يتم صنع أكثر من غرض واحد، بالشكل التالي: class SingletonClass(object): def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = super(SingletonClass, cls).__new__(cls) return cls.instance بينما __init__ نقوم باستعمالها بشكل طبيعي مثل الباني، حيث أنها تقوم بتهيئة جميع البيانات التابعة للغرض المنشئ.
  2. لا تحتاج إلى دورة لتعلمه، في حال كنت تعلم كيفية التعامل مع git فلا يلزمك غير أن تتعلم كيفية تخزين ما يخزنه ال git محلياً على سيرفر على الانرنيت، يمكنك ال github من مشاركة الكود الخاص بك مع العالم، حيث في حال قمت بتحديد أنك تريده عام فإن أي مطور آخر سيستطيع استعمال الكود الخاص بك و التطوير عليه مثلاً، بالطبع يمكنك وضع حقوق ملكية معينة. يمكنك إنشاء حساب عليه و اتباع التعليمات التي تقدم لك في البداية و ستجد نفسك قادراً على التعامل معه بسرعة كبيرة. بالطبع هو يوفر أكثر بكثير من مهمة تخزين فقط، فباستعماله يمكنك التعاون مع العديد من المطورين على مشروع واحد و تنظيم العمل، كما يمكنك إنشاء أكواد تقوم بالتنفيذ بشكل تلقائي في حال حدوث أحداث معينة، مثلاً عندما يقوم أحد المطورين بإضافة كود يمكنك أن تقوم بتنفيذ الاختبارات التي قمت بكتابتها سابقاً للتأكد من أن كل شيء يعمل كما تريد. أنصحك بالتسجيل بالموقع و إتباع ال get started حتى تتكون لديك تجربة عن كيفية استعماله.
  3. إن التوابع السهمية لا تملك خاصية ربط للمؤشر this لوحدها، حيث أنها تأخذ ذلك من المحيط التي هي فيه على شكل closure. أي في حال قمنا بوضعها ضمن class فإنها ستأخذ ال this الخاص بهذا ال class بشكل دقيق سوف تأخذ ال this كغرض من هذا ال class في حال كانت الطريقة عادية أو ستكون this تدل على ال class نفسه في حال كانت الطريقة static و لكن بما أنها تقوم بذلك على شكل closure فإن ذلك سيكون غير قابل للتعديل، أي أنه في حال أخذنا التابع من هذا الصف فإن this ستظل مرتبطة به، لفهم هذه الخاصية هذا مثال يوضح ذلك: class C { a = 1; autoBoundMethod = () => { console.log(this.a); } } const c = new C(); c.autoBoundMethod(); // 1 const { autoBoundMethod } = c; autoBoundMethod(); // 1 // If it were a normal method, it should be undefined in this case
  4. هناك العديد من المكونات المهمة في قسم meta من ال html لتحسين ظهورك. أحد أهم هذه المكونات هو title، عليك اختيار هذا بشكل فريد و أن يكون مرتبط ارتباطاً وثيقاً بالمحتوى الخاص بالصفحة، و هو النص الذي يظهر كعنوان لموقعك في نتائج محرك البحث. ثاني أهم مكون هو ال description و هو التفاصيل التي تظهر تحت ال title عند ظهور الموقع في نتائج محرك البحث، و هو مهم جداً حيث أنه من الممكن أن يقرر المستخدم دخول موقعك أو لا تبعاً لهذا الوصف فقط. هناك الكثير من المكونات الأخرى المهمة ك robots و الذي يسمح لك بإعلام محرك البحث بأن بعض الصفحات لا تحتوي على معلومات مهمة جداً و هذا يساعد على عدم تخفيض جودة موقعك بسبب هذه الصفحات فقط. كما أن المكون viewport مهم لإعلام محرك البحث أن موقعك يدعم ال mobile و هو من أهم الأمور حالياً.
  5. إن القاموس في البايثون يعتمد على ما يسمى hash function للقيام بإيجاد سريع لمكان المفتاح، و هذه القيمة لا يجب أن تتغير من أجل الأداء و بسبب ذلك لا يمكن استعمال أي نمط قابل للتغيير mutable كمفتاح في البايثون. يمكنك استعمال tuple بدلا من ذلك، و إن كنت تريد استعمال شيء مشابه لل set من أجل خواص معينة ضمنها فيمكن استعمال نسخة أخرى غير قابلة للتعديل و هي ال frozenset بالشكل التالي: s = set() s.add(2) s.add(3) print(s) d = dict() d[frozenset(s)] = 1 print(d)
  6. يمكن استعمال خدمة stripe و التي تسمح لك بعدة أنواع من عمليات الشراء، منها الاشتراك الشهري بخيارات مختلفة تتيحها لمستخدمينك، بالإضافة إلى الشراء لمرة واحدة و التي هي الطريقة التي تناسب المتاجر الالكترونية. يمكنك تحديد العديد من طرق الدفع التي تريدها أيضاً عن طريق هذه الخدمة. توفر هذه الخدمة ميزة الاختبار بشكل مجاني، حيث يمكنك إضافتها إلى موقعك و اختبار عملية الدفع بشكل كامل عن طريق حساب testing، كما توفر webhook لكي تستمع إلى أحداث مختلفة بحيث يمكنك الاستجابة لها، مثلا حدث الانتهاء من عملية شراء يمكنك الاستماع عليه لإرسال إيميل إلى العميل الذي قام بالشراء. لاستعمال هذه الخدمة عليك إنشاء أغراض عليها و يمكن ذلك باستعمال API سهلة الفهم. مثلاً يمكنك إنشاء غرض عن طريق استعمال ما يلي: $stripe = new \Stripe\StripeClient( 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' ); $stripe->products->create([ 'name' => 'Gold Special', ]); و في النهاية عندما تريد إنشاء عملية شراء نقوم بإضافة الأغراض إلى session و نرسله إلى ال stripe. يمكنك الاطلاع على documentation من أجل معلومات تفصيلية أكثر.
  7. إن الطريقة التي ينصح بها هي استعمال التابع escape الموجود ضمن المكتبة re للقيام بإضافة رمز ال escape تلقائيا قبل كل ما يلزم. نقوم في البداية بوضع النمط الذي نريد البحث عنه ضمن string مثلا بالشكل التالي: v = sys.argv[2] my_regex = r"نمط معين" + re.escape(v) + r"نمط معين" ثم نقوم باستعماله في التابع search بشكل اعتيادي. بالطبع يمكنك أيضاً استعمال f-string للقيام بوضع المتحول ضمن النمط و لكن المبدأ يبقى نفسه، يجب القيام بعملية escape في البداية، مثال على ال f-string : v = sys.argv[2] my_regex = f"نمط معين{re.escape(v)}نمط معين"
  8. من أهم العمليات التي يجب عليك القيام بها هي استعمال ملف يحمل المتحولات السرية التي يجب عليك استعمالها، مثل ال SECRET_KEY و معلومات ال database. في هذا الملف يجب عليك وضع القيم التي تريدها في التطوير، و عند الرفع فإن الاستضافة بغض النظر عن نوعها سوف تسمح لك بإدخال قيم المتحولات التي تريدها و بشكل سري. يفضل وضع الخيارات التالية أيضاً و التي هي عبارة عن خيارات أمان. if env == 'production': SECURE_BROWSER_XSS_FILTER = True X_FRAME_OPTIONS = 'DENY' SECURE_SSL_REDIRECT = True SECURE_HSTS_SECONDS = 3600 SECURE_HSTS_INCLUDE_SUBDOMAINS = True SECURE_HSTS_PRELOAD = True SECURE_CONTENT_TYPE_NOSNIFF = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') في حال كنت تريد استعمال تخزين لملفات مرفوعة فيجب عليك التسجيل في خدمة ما، مثل AWS لديها خدمات خاصة بالتخزين، و من ثم يجب عليك أيضاً إضافة متحولات خاصة بهذه الخدمات.
  9. يمكن استعمال مكتبة sklearn للقيام بذلك، عن طريق استعمال التابع shuffle، إن هذا التابع يقدم لنا ميزات غير موجودة في تابع ال shuffle الموجود في المكتبة random. إحدى هذه الميزات هي القيام بعملية shuffle لمجموعة من المصفوفات مع الحفاظ على التقابل بينهما، مثلا لنفترض أنه لديك مصفوفتين إحداهما تمثل أرقام زبائن و يقابلها مصفوفة ثانية تمثل أسماء هؤلاء الزبائن،فهنا أنت لديك تقابل بين المصفوفتين و عندما تريد القيام بال shuffle يجب عليك الحفاظ على ذلك و هو ما تقوم به هذه المكتبة. طبعا يمكن تمرير أي عدد من المصفوفات و ستقوم بذلك مع المحافظة على التقابل. يمكن استعمالها بالشكل التالي: from sklearn.utils import shuffle a1 = [1, 2, 3, 4, 5] a2 = ['name1', 'name2', 'name3', 'name4', 'name5'] new_a1, new_a2 = shuffle(a1, a2) print(new_a1) print(new_a2) طبعا يمكن تمرير أي عدد من المصفوفات نريده.
  10. بعد أن قمتي بإضافة الصورة فإنه من الواضح أن الخطأ هو في القيمة التي قمتي بتمريرها ك parameter في ال url حيث أن القيمة فارغة. إن القيمة الفارغة أتت من doctor.profile.slug حتى أن الخطأ يقول ذلك فهو يقول أن قائمة الوسطاء الممررة هي: ('',) عليكي التدقيق في البيانات ضمن ال model، فالخطأ من ذلك.
  11. لا يبدو أن هناك خطأ في إعدادات ال urls و قد قمت بكتابة كود يماثل الكود الخاص بك بدون أي مشاكل، أعتقد أن المشكلة ليست في ذلك. يرجى ارسال لقطة شاشة للخطأ بشكل كامل كما هو.
  12. يمكننا تحويل المصفوفة السابقة إلى مصفوفة numpy و من ثم استعمال مفهوم ال mask للأدلة و الذي يقوم بتحديد الأدلة التي نريد التعديل عليها عن طريق مصفوفة أصفار و واحدات. أي أننا نمرر مصفوفة أصفار و واحدات طولها يساوي طول المصفوفة الأصلية و هو يقوم بالتعديل على كل العناصر التي يقابلها واحد في المصفوفة الممررة. يمكن القيام بذلك على الشكل التالي: import numpy as np first_col = [231, 456, 84, 1234, 126, 0, 79, 0, 212, 0] first_col = np.array(first_col) first_col[first_col == 0] = m إن first_col == 0 ستنشئ مصفوفة طولها بطول first_col و تحوي واحد عندما تكون القيمة صفر و صفر عكس ذلك، و بالتالي هنا سنقوم بالتعديل في كل الأماكن التي عندها القيمة صفر.
  13. يمكن القيام بذلك باستعمال setprecision و التي تقوم بتحديد عدد الأرقام بعد الفاصلة. يوجد هذا التابع في المكتبة iomanip و التي تحوي على الكثير من التوابع الخاصة بالتلاعب بالدخل و الخرج من ناحية التمثيل، من الجيد الإطلاع عليها لمعلومات إضافية. يمكن القيام بما سبق بالشكل التالي: #include<iostream> #include<iomanip> using namespace std; const double PI = 3.14; double circle_area(double r){ return r * r * PI; } int main(){ double r; cin >> r; cout << setprecision(2) << fixed << circle_area(r) << '\n'; return 0; } حيث هنا fixed تقوم بطباعة رقمين دائماً حتى لو كان يكفي رقم واحد بعد الفاصلة، في حال كنت لا تريد ذلك يمكنك إزالتها فقط.
  14. يمكننا التعامل مع ملفات ال csv بشكل فعال باستعمال المكتبة pandas و خاصة باستعمال التابع read_csv. من ثم يمكن الوصول إلى العمود المطلوب و تمريره إلى np.array للحصول على المطلوب، أي لتحويل العمود إلى مصفوفة numpy. يمكن القيام بذلك بالشكل التالي: import pandas as pd import numpy as np df = pd.read_csv('data.csv', header=None) first_col = np.array(df[[0]]) second_col = np.array(df[[1]]) هنا قمنا بوضع الخيار header=None و ذلك ﻷنه لا يوجد أسماء للأعمدة في الملف، و بالتالي البيانات تبدأ من أول سطر و هو سيقوم هنا بتسمية الأعمدة بالأرقام بدءاً من الصفر، و لهذا أمكننا الوصول إلى أول عمود باستعمال الدليل 0 و ثاني عمود باستعمال الدليل 1.
  15. إن الغرض Object يسمح لنا بالحصول على الكثير من المعلومات من الأغراض في ال javascript و أحد هذه المعلومات هي ال attributes الخاصة بالغرض، و هو يعيد ذلك على شكل مصفوفة و بالتالي يمكن التحقق من أن طولها يساوي الصفر. يمكن القيام بذلك بالشكل التالي: const myObj = {}; Object.keys(myObj).length == 0;
  16. هل قمتي بتضمين ملف ال urls الخاص بهذا ال app في ملف ال urls للمشروع؟ و في حال أنك قمتي بذلك فيرجى مشاركة الكود الخاص بهذا الملف هنا حتى أستطيع مساعدتك بشكل أفضل.
  17. لإنشاء ملفات pdf يمكنك استعمال مكتبة في ال javascript و هي jsPDF و التي تحتوي على عدة خيارات لإنشاء قوالب pdf و إنشاء أنماط معينة يمكن استعمالها في أكثر من ملف pdf، يمكنك الإطلاع على هذه المكتبة من هنا. من أجل تحويل html إلى pdf فإنه يوجد الكثير من المواقع و لكن ليس جميعها يحتوي على API، يمكنك استعمال pdflayer و هو موقع يوفر هذه الخدمة بشكل مجاني و يمكن التعامل معه عن طريق API، يمكنك الوصول إلى الموقع من هنا. يمكنك أيضاً استعمال مكتبة في البايثون تسهل عليك العمل مع ال django و هي reportLab، يمكنك الاطلاع عليها هنا و كمثال على استعمالها بشكل بسيط في الدجانغو: import io from django.http import FileResponse from reportlab.pdfgen import canvas def some_view(request): # Create a file-like buffer to receive PDF data. buffer = io.BytesIO() # Create the PDF object, using the buffer as its "file." p = canvas.Canvas(buffer) # Draw things on the PDF. Here's where the PDF generation happens. # See the ReportLab documentation for the full list of functionality. p.drawString(100, 100, "Hello world.") # Close the PDF object cleanly, and we're done. p.showPage() p.save() # FileResponse sets the Content-Disposition header so that browsers # present the option to save the file. buffer.seek(0) return FileResponse(buffer, as_attachment=True, filename='hello.pdf') أقترح عليك أن تستعمل الطريقة الثانية في كل الأحوال ﻷنه من الأسهل بناء ملف html.
  18. أفترض أنك قمت بتنزيل المكتبة باستعمال pip و بالتالي بإمكانك الوصول إليها كأنها تعليمة في البايثون و لكن ليس من ال cmd (هناك طريقة أخرى للوصول إليها). لتشغيلها عليك القيام بالتالي: python -m virtualenv <nameOfEnv> أي كل ما عليك هو أن تسبق التعليمة ب python -m و يجب أن تعمل. في حال حدوث مشاكل إضافية يرجى تزويدي بتفاصيل عملية التنزيل التي قمت بها حتى أستطيع مساعدتك أكثر.
  19. الخطأ في هذا التابع هو أنك تقوم بإضافة قيمة افتراضية mutable و هذا يعني أنها قابلة للتعديل. حيث أن البايثون يقوم بحساب قيم المتحولات الافتراضية مرة واحدة فقط عند التعريف و بعدها يقوم باستعمال القيمة التي لديه، و بالتالي عندما تقوم بتعديل القيمة أنت فإنك تعدل على القيمة الأصلية. لحل هذه المشكلة يمكننا القيام بالتالي: def f(a1, a2=None): if a2 is None: a2 = [] for i in a1: a2.append(i) return a2 a = [1, 2, 3] b = f(a) print(b) c = [1, 2, 3, 4] d = f(c) print(d) بالطبع يمكنك اختصار الوقت و استعمال التابع extend الذي يقوم بما تريده بالشكل التالي: a = [1, 2, 3] b = [4, 5] a.extend(b)
  20. يمكنك القيام بذلك عن طريق استعمال المكتبة time بالشكل التالي: import time t1 = time.time() sum = 0 for i in range(100000): sum += i t2 = time.time() print(f'{(t2-t1)*1000} ms') حيث أن الكود الذي يقوم بالجمع هو فقط على سبيل المثال. و نحن هناك نقوم بتحديد الوقت قبل تنفيذ الكود و بعده و نقوم بالطرح للحصول على وقت تنفيذ الكود.
  21. يرجى توضيح المقصود بذلك، هل تعني أنه سيولد دخل بشكل عشوائي أم ماذا؟ إذا كان بإمكانك إعطاء التفاصيل بدقة فسيكون بإمكاني مساعدتك.
  22. إن هذا خطأ في هيكلية الموقع الخاص بك، حيث أنه لا يمكنك أن تضع مكون div داخل مكون p و لا يمكنك أن تضع مكون ul داخل مكون p . يمكنك أن تستعمل ال span بدلاً عن ال div داخل ال p.
  23. بالإضافة إلى الطريقة في الجواب السابق، فإنه حاليا يتم التوجه بشكل كبير للتعامل مع ال containers و التي تسهل العمل كثيراً عندما نقوم بالرفع على ال cloud كما أنها تضمن أن الموقع سيبدو عند الرفع تماماً كما كان يبدو عند التطوير. للقيام بذلك يمكن استعمال ال docker و الذي يمكننا من بناء image يمكننا رفعها ببساطة على الاستضافة المطلوبة، مثلاً AWS يقدم خدمة خاصة بال containers و كل ما عليك هو رفع ال image التي قمت ببناءها و سيبدأ الموقع العمل، طبعاً يجب عليك ضبط إعدادادت قاعدة البيانات بشكل منفصل طبعاً. لبناء image كل ما عليك هو أن تقوم بكتابة ما يسمى docker file و الذي يحوي التعليمات المطلوبة لبناء ال image و التي تكون عادة عبارة عن عمليات نسخ الكود و تنزيل المكتبات و في النهاية التعليمة التي تجعل الموقع يبدأ. أنصحك بالإطلاع على هذه الطريقة فلقد وفرت لي الكثير من الوقت و الجهد مقارنة بالطريقة التقليدية للرفع. و هي الطريقة المنصوح بها حالياً.
  24. يمكنك استعمال التابع toLocaleDateString و الذي يقوم بأخذ العديد من الإعدادت الممكنة، في حالتك هذه يمكن استعماله بالشكل التالي: let options = { year: 'numeric', month: '2-digit', day: '2-digit' }; let todayDate = new Date(); let formattedTodayDate = todayDate.toLocaleDateString('en-GB', options); حيث هنا قمنا بتحديد الخيارات التي نريدها من أجل كل قسم، توجد خيارات كثيرة للتعديل على كل قسم من التاريخ و لكن هذه الخيارات هي المطلوبة من أجل الشكل الذي تريده. قمت باستعمال en-GB ﻷنها تقوم بوضع اليوم في الأول و من ثم الشهر على عكس en-US التي تضع الشهر أولاً ثم اليوم و بالتالي كما طلبت.
  25. يمكنك استعمال المكون button بدلاً عن المكون a و القيام بكتابة تابع للانتقال إلى الرابط المطلوب، هذا لن يجعل أي رابط يظهر في أسفل الصفحة و سيعطي شكل أفضل، حيث أن استعمال المكون a سيعطي رابط أسفل الصفحة و لكن سيكون رابط خاطئ و بالتالي هذا لن يكون جيداً بالنسبة لسمعة الموقع الخاص بك. يمكن استعمال طريقة المكون button بشكل مماثل لطريقة التعامل مع المكون a بالشكل التالي: <button onclick="window.location.href='Your Link here'">Something</button> طبعاً يفضل أن يحمل الزر اسم يدل على المكان الذي سيذهب إليه، أيضاً من أجل تجربة مستخدم أفضل.
×
×
  • أضف...