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

Kais Hasan

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

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

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

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

    24

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

  1. إجابة Kais Hasan سؤال في كيف انفذ function علي object بعد انتهاء وقت معين كانت الإجابة المقبولة   
    يمكنك إضافة خاصية إلى الغرض الذي تريده فيها الوقت الذي تم إنشاءه، و من ثم يمكن القيام بكتابة مهمة دورية تقوم بالتحقق فيما إذا كان هنالك غرض قد تجاوز المدة أم لا.
    مثلاُ في حالتك نضع للغرض الذي يمثل الستوري وقت الإنشاء و نقوم بكتابة مهمة دورية مثلاً كل 10 دقائق أو حسب الرغبة تقوم بالمرور على الستوريات لل users و تحذفها في حال تجاوزت الوقت المحدد.
    يمكن القيام بذلك عن طريق مكتبة تسمى cron و هي مشابهة في العمل لل cron في نظام linux يمكن كتابتها بالشكل التالي:
    var cronJob = require("cron").CronJob; // هذه المهمة ستقوم بالتنفيذ كل 10 دقائق new cronJob("* /10 * * * *", function() { // نقوم بوضع الكود الذي نريد تنفيذه هنا }, null, true); يمكنك الإطلاع على تفاصيل هذه المكتبة هنا.
  2. إجابة Kais Hasan سؤال في اشعارات التطبيق العامة كانت الإجابة المقبولة   
    بما أنه لدينا إشعارات و مستخدمين، و هناك إشعارات تصل إلى عدة عملاء  و عملاء يتلقون أكثر من إشعار، فإنه لدينا هنا علاقة متعدد لمتعدد.
    بالتالي أفضل طريقة للقيام بذلك هو إنشاء جدول لهذه العلاقة بحيث تحوي على المفتاح الرئيسي الذي يمثل العميل (أي المفتاح الرئيسي لجدول العملاء) بالإضافة للمفتاح الرئيسي لجدول الإشعارات، و بالتالي يمكننا في هذا الجدول تخزين هذه المعلومات.
    يمكن مثلاً في حال رأى مستخدم إشعاراً ما أن تضيف البيانات المطلوبة إلى هذا الجدول، أي المفتاح الرئيسي لهذا المستخدم بالإضافة إلى المفتاح الرئيسي للإشعار.
    بذلك عندما تريد تنبيه أي مستخدم يمكن في البداية البحث في هذا الجدول و استثناء أي إشعارات مرتبطة بهذا المستخدم في هذا الجدول.
    طريقة أخرى أن تخزن في هذا الجدول كافة الإشعارات، و عندما يرى مستخدم إشعار ما، تقوم بحذف السطر الذي يوافق المفتاح الرئيسي للمستخدم و المفتاح الرئيسي للإشعار.
    في كلتا الطريقتين الجدول الذي ستقوم بإنشاءه سيكون المفتاح الرئيسي له مركب من العمود الذي يمثل المفتاح الرئيسي للمستخدم و العمود الذي يمثل المفتاح الرئيسي للإشعار.
  3. إجابة Kais Hasan سؤال في كيفية إستدعاء ملف CSV إلى NumPy في بايثون python؟ كانت الإجابة المقبولة   
    يمكننا التعامل مع ملفات ال 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.
  4. إجابة Kais Hasan سؤال في خطأ في تثبيت حزمه في البايثون كانت الإجابة المقبولة   
    أفترض أنك قمت بتنزيل المكتبة باستعمال pip و بالتالي بإمكانك الوصول إليها كأنها تعليمة في البايثون و لكن ليس من ال cmd (هناك طريقة أخرى للوصول إليها).
    لتشغيلها عليك القيام بالتالي:
    python -m virtualenv <nameOfEnv> أي كل ما عليك هو أن تسبق التعليمة ب python -m و يجب أن تعمل.
    في حال حدوث مشاكل إضافية يرجى تزويدي بتفاصيل عملية التنزيل التي قمت بها حتى أستطيع مساعدتك أكثر.
  5. إجابة Kais Hasan سؤال في تابع يقوم بإضافة مصفوفة إلى أخرى في البايثون كانت الإجابة المقبولة   
    الخطأ في هذا التابع هو أنك تقوم بإضافة قيمة افتراضية 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)  
  6. إجابة Kais Hasan سؤال في كيفية تصدير أكثر من مكون في ملف واحد في React.js؟ كانت الإجابة المقبولة   
    لا يمكنك القيام بأكثر من export default واحد في كل module، يمكنك القيام بأنماط أخرى من ال export مثل ال named export عوضاً عن ذلك.
    أي يمكن تعديل الكود الخاص بك بالشكل التالي:
    export function Container() { return ( <div> <Slide /> <Slide /> <Slide /> </div> ); } export function Slide() { return ( <div> Some Text Content </div> ); }  
  7. إجابة Kais Hasan سؤال في كيفية تعريف مسارات django urls خاصة بقبول لغتين في التطبيق كانت الإجابة المقبولة   
    بما أنك تريد القيام بذلك من أجل اللغة فهناك طريقة أفضل من استعمال ال regex  لذلك، و هو استعمال ال i18_patterns بحيث تقوم بإحاطة ال urls التي تريد أن يكون خيار اللغة مفعل من أجلهم و سيقوم الدجانغو تلقائياً بأخذ الخيارات التي قمت بإتاحتها عن طريق ال settings من أجل اللغة.
    كمثال على ذلك:
    from django.urls import path, include from pages.views import HomeView from django.conf.urls.i18n import i18n_patterns urlpatterns = i18n_patterns( path('admin/', admin.site.urls), path('products/', include('products.urls')), path('accounts/', include('allauth.urls')), path('reviews/', include('reviews.urls')), path('language-preference/', include('pages.urls')), path('shopping_cart/', include('shopping_cart.urls')), path('', HomeView.as_view(), name='home'), ) و في ملف ال settings يجب عليك وضع ما يلي:
    LANGUAGES = ( ('ar', gettext('Arabic')), ('fr', gettext('French')), ) USE_I18N = True و بالتالي هنا لن يأخذ غير الخيارين الذي يعبران عن اللغات التي قمت بتحديدها.
    هذه الطريقة أفضل ﻷنها تلقائياً سوف تقوم بوضع اللغة على اللغة المحلية للمستخدم، بالطبع يجب عليك توفير زر يقوم بعملية التحويل (لن يقوم المستخدم بكتابة اللغة في الرابط)، و لكن حتى بدون زر التحويل هذا سوف يقوم بأخذ اللغة الافتراضية لجهاز المستخدم.
    هناك طريقة أخرى تعتمد على ال regex و لكنها ليست مستحبة، أما إذا كنت تريد أن يقوم المستخدم بإدخال متحول و له شروط معينة يمكنك القيام بتعديل ذلك في ال view بحيث تقوم بإرجاع 404 في حال لم تكن قيمة المتحول ما تريده.
    و إذا كنت مصراً على استعمال ال regex فيمكنك استعمال re_path و الذي هو يمثال ال path و لكن يقبل ب regex و بالتالي يمكنك ضمنه وضع خيار ar|fr بحيث سيأخذ فقط أحدهما.
  8. إجابة Kais Hasan سؤال في كيفية تحويل الصور إلى أبيض وأسود عبر PIL في بايثون Python؟ كانت الإجابة المقبولة   
    هناك عدة طرق للقيام بذلك.
    الطريقة الأولى و هي الطريقة اليدوية، هو أن تقوم بتحويل الصورة في البداية إلى صورة رمادية (في حال لم تكن كذلك بالفعل)، و من ثم تحدد عتبة ما، حيث أن جميع القيم فوق هذه العتبة أو القيم المساوية لها سوف تصبح 1 (أي أبيض) و ما تبقى سيصبح 0 (أي أسود)، يمكن القيام بالتحويل ببساطة باستعمال المكتبة و ما تبقى هو عملية طبيعية على المصفوفات.
     
    الطريقة الثانية الأسرع، هي استعمال توابع PIL الجاهزة للتحويل مباشرة بالشكل التالي:
    from PIL import Image file = "example.jpg" img = Image.open(file) img.convert("1") img.show() حيث أن ال 1 هنا يمثل التمثيل باستعمال بت واحد فقط، و هذا مكافئ للتحويل إلى 0 و 1 فقط.
  9. إجابة Kais Hasan سؤال في ما الفرق بين writeFile و writeFileSync في Node.js؟ كانت الإجابة المقبولة   
    writeFile يسمح لك بإنشاء ملف و تمرير البيانات في وقت الإنشاء.
    هذا التابع يأخذ 3 بارمترات و بارامتر اختياري.
    file هذا البارامتر يمثل المسار للملف متضمنا اسم الملف و اللاحقة.
    data يخزن في هذا البارامتر البيانات التي نريد حفظها في الملف.
    options هذا البارامتر اختياري و يمكن استعماله لتغيير القيم الافتراضية للترميز و النمط و هل سنقوم بالكتابة أم القراءة أم الإضافة الخ..
    callback هذا البارامتر يمثل تابع سيتم استدعاءه عند الانتهاء من تنفيذ التعليمة بشكل صحيح أو في حال حدوث خطأ.
     
    writeFileSync يقوم بنفس مهام التابع السابق و لكن يأخذ فقط 2 بارامتر و بارامتر اختياري كما يلي:
    file 
    data
    options
    كل هذه البارامترات لها نفس الوظيفة كما في التابع الأول و لكن الفرق أن هذا التابع لا يأخذ تابع كبارامتر، و هذا سيؤدي إلى أن هذا التابع سيوقف تنفيذ البرنامج حتى ينتهي من عمله على عكس التابع السابق الذي لن يقوم بذلك و عوضاً عن ذلك سيستعمل التابع callback الذي سنقوم بتمريره لمعالجة حالات الخطأ أو لتنفيذ كود معين بعد انتهاء الكتابة.
     
  10. إجابة Kais Hasan سؤال في خطأ Hooks can only be called inside the body of a function component في React.js؟ كانت الإجابة المقبولة   
    ال hooks وظيفتها تكون ضمن ال component، فمثلا ال hook التي قمت باستعمالها تقوم بالإضافة إلى ال state، و بالتالي لا معنى من وجودها خارج ال component.
    و هذا تماما ما يقوله لك الخطأ.
    يمكنك تصحيح الكود عن طريق إدخال ال hook إلى داخل التابع بالشكل التالي:
    import React, { useState } from "react"; export const MyComponent = (props) => { const [count, setCount] = useState(0); return <span>{count}</span> }  
  11. إجابة Kais Hasan سؤال في كيفية المقارنة بين قائمتين والحصول على العناصر المشتركة في بايثون Python؟ كانت الإجابة المقبولة   
    يمكنك تحويل المصفوفتين إلى مجموعات و القيام بعملية تقاطع بينهما، على الشكل التالي:
    a = [1, 2, 3, 4, 5] b = [3, 4, 5, 6, 7] s1 = set(a) s2 = set(b) ans = s1.intersection(s2) print(ans) # {3, 4, 5} أي أننا هنا نقوم بتحويل ال list إلى set عن طريق استعمال set(a) مثلاً، و من ثم نقوم بعملية التقاطع باستعمال التابع intersection.
    بالطبع يمكنك القيام بذلك بشكل يدوي، و هناك عدة طرق سأذكر أبسط واحدة بينها لسهولة الفهم و لكن هذه الطريقة غير مستحبة ﻷنها تستهلك زمن كبير في حال كانت المصفوفات كبيرة:
    def shared(a, b): ans = [] for i in a: if i in b: ans.append(i) return ans a = [1, 2, 3, 4, 5] b = [4, 5, 6, 7, 8] ans = shared(a, b) print(ans) # [4, 5] إن التابع السابق يأخذ مصفوفتين سنقوم بحساب العناصر المشتركة بينهما، في البداية نقوم بتعريف مصفوفة فارغة لنخزن الجواب فيها.
    ثم نقوم بالمرور على عناصر المصفوفة الأولى، و نختبر فيما إذا كان العنصر الحالي موجود في المصفوفة الثانية، للتحقق من ذلك نستعمل المعامل in ، في حال تحقق الشرط نقوم بإضافة العنصر الحالي إلى المصفوفة ans عن طريق استعمال التابع append.
    و لكن كما ذكرت مسبقاً يفضل استعمال المجموعات للتحقق من هذه الأمور، ﻷن أداءها أفضل.
  12. إجابة Kais Hasan سؤال في كيفية تغير منطقة التوقيت Zone في كائن Date في جافاسكريبت JavaScript؟ كانت الإجابة المقبولة   
    يمكن القيام بذلك بسهولة باستعمال التابع toLocaleString، مثلا يمكن كتابة تابع يقوم بذلك بشكل كامل بالشكل التالي:
    function convertTZ(date, tzString) { return new Date((typeof date === "string" ? new Date(date) : date).toLocaleString("en-US", {timeZone: tzString})); } الآن إذا كنت تريد تغيير التاريخ إلى منطقة أخرى يمكنك ذلك عن طريق تمرير القيمة إما ك string  أو ك object من Date، مثال على ذلك:
    date = new Date(); convertedDate = convertTZ(date, 'Asia/Riyadh'); console.log(convertedDate);  
  13. إجابة Kais Hasan سؤال في ما الفرق بين إستخدام Canvas و SVG في رسم الأشكال؟ كانت الإجابة المقبولة   
    كمقارنة بين النوعين:
    SVG أفضل من ناحية التوسع حيث أنه يمكن طباعته بجودة عالية مهما كانت دقة الشاشة، بينما canvas لا يملك هذه الخاصية و له جودة منخفضة في حال كانت دقة الشاشة عالية.
    SVG يعطي أداء أفضل من أجل عدد قليل من الأشكال أو في حال كانت مساحة الشكل كبيرة، بينما canvas له أداء أفضل في حال كان هناك عدد كبير من الأشكال و في حال كانت مساحة الشكل صغيرة.
    يمكن تعديل ال  SVG عن طريق js, CSS بينما يمكن تعديل ال canvas فقط باستعمال ال js.
     
  14. إجابة Kais Hasan سؤال في تحديد سقف Cloud Firestore كانت الإجابة المقبولة   
    بحسب الموقع الرسمي فإن هذه الخاصية غير مدعومة حتى الآن و لكن يتم دراسة إمكانية إضافتها في المستقبل، بدلاً عن ذلك يمكنك تحديد ميزانية معينة بحيث يتم تنبيهك عند الوصول إلى حد الميزانية الذي قمت بتحديده.
    يمكنك الوصول إلى ذلك من قسم الدفع Billing و من ثم القيام بإضافة ميزانية جديدة (في حال لم يكن لديك واحدة مسبقاً) و يمكنك من الخيارات تحديد حد معين عن الوصول إليه سيتم تنبيهك.
    بحسب الموقع فإن بعض المناطق يحدث فيها تأخر في إرسال التنبيه قد يصل إلى بضعة أيام.
×
×
  • أضف...