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

لوحة المتصدرين

  1. Tamim Fahed

    Tamim Fahed

    الأعضاء


    • نقاط

      7

    • المساهمات

      124


  2. عبدالله عبدالرحمن11

    • نقاط

      5

    • المساهمات

      526


  3. Fahmy Mostafa

    Fahmy Mostafa

    الأعضاء


    • نقاط

      4

    • المساهمات

      91


  4. ريم المهدي

    ريم المهدي

    الأعضاء


    • نقاط

      2

    • المساهمات

      127


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 06/24/21 في كل الموقع

  1. عندي ملف بايثون لحضر ماكات معينه في انتنة وايرلس السكربت يقوم بحضر 22 ماك ادرس فقط كيف بدي اعدل فيه ليقوم بحضر عدد غير محدود من الماك ادرس NanoBlker.py
    2 نقاط
  2. عندما أستخدم التابع list.append لإضافة عنصر إلى القائمة، يتم اعتبار قيمتها False كالتالي: >>> x = [] >>> not x.append(123) True >>> ما هو سبب هذا الأمر؟ وهل يمكن تطبيقه في دوال خاصة بي أيضًا؟
    2 نقاط
  3. الإصدار 1.0.0

    47854 تنزيل

    لا يخفى على أي متعلم لمجال علوم الحاسوب كثرة الاهتمام بمجال الذكاء الاصطناعي وتعلم الآلة، وكذلك الأمر بالنسبة لمستخدم التقنية العادي الذي بات يرى تطورًا كبيرًا في الآلات والتقنيات التي تحيط به بدءًا من المساعد الصوتي الآلي في جواله وحتى سيارته وبقية الأشياء الذكية المحيطة به. تتوالى الاختراعات والاكتشافات يومًا بعد يوم وتتنافس كبرى الشركات حول من يحرز أكبر تقدم ليخطف الأضواء من غيره. ونظرًا لهذا الاهتمام، ولضعف المحتوى العربي وسطحيته في هذا المجال أيضًا، قررنا توفير مصدر عربي دسم لشرح مجال الذكاء الاصطناعي وتعلم الآلة نظريًا وعمليًا لذا وضعنا فهرس المحتوى آنذاك وبدأنا العمل. هذا الكتاب هو الجزء الأول النظري التأسيسي من أصل جزآن عن الذكاء الاصطناعي وتعلم الآلة، ويبدأ بعرض أهمية الذكاء الاصطناعي وتعلم الآلة عبر الإشارة إلى المشاريع والإنجازات التي قدَّمها هذا المجال إلى البشرية حتى يومنا هذا وكيف أثرت على كل مجالات حياتنا اليومية. ينتقل بعدها إلى لمحة تاريخية عن المجال وكيفية ولادته ومراحل حياته حتى يومنا الحالي. ستجد بعدئذٍ المعلومات الدسمة في الفصل الثالث الذي يشرح المصطلحات المتعلقة بمجال تعلم الآلة ويشرح أساليب تعليم الإنسان للآلة والأسس التي بنيت عليها عمليات تعليم الآلة (منها شرح طرائق تعلم الآلة التقليدية ثم التجميع والتعلم المعزز وحتى الشبكات العصبية والتعلم العميق). يعرض الفصل الأخير تحديات عملية تعليم الآلة وما علاقة البيانات فيها، ثم أخيرًا عرض خارطة طريق لأهم المفاهيم التي يجب أن تتقنها في حال أردت التوسع في المجال وإتقانه. بعد الانتهاء من الجزء الأول في هذا الكتاب وتأسيس المفاهيم والمصطلحات التي يقوم عليها مجال الذكاء الاصطناعي وتعلم الآلة، يمكنك الانتقال إلى الجزء الثاني وهو كتاب عشرة مشاريع عملية عن الذكاء الاصطناعي لبدء تطبيق مشاريع عملية تطبيقية مبنية على بيانات واقعية وتنفيذ أفكار مشاريع من الحياة العملية باستخدام الذكاء الاصطناعي. ساهم بالعمل على هذا الكتاب، محمد لحلح تأليفًا، وجميل بيلوني تحريرًا وإشرافًا، وأخرجه فنيًا فرج الشامي. أرجو أن نكون قد وُفقنَا في هذا العمل لسد ثغرةً كبيرةً في المحتوى العربي -كما خططنا لذلك- الذي يفتقر أشد الافتقار إلى محتوى جيد ورصين في مجال الذكاء الاصطناعي وتعلم الآلة. هذا الكتاب مرخص بموجب رخصة المشاع الإبداعي Creative Commons «نسب المُصنَّف - غير تجاري - الترخيص بالمثل 4.0». يمكنك قراءة فصول الكتاب على شكل مقالات من هذه الصفحة، «الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية»، أو من مباشرةً من الآتي: الفصل الأول: الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية الفصل الثاني: الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها الفصل الثالث: المفاهيم الأساسية لتعلم الآلة الفصل الرابع: تعلم الآلة: التحديات الرئيسية وكيفية التوسع في المجال
    1 نقطة
  4. الغالب أنّ البرامج المفتوحة المصادر تتطلّب شيئًا من التّهيئة المُملّة عند أوّل استعمال، وقد يبدو للوهلة الأولى أنّ تلك التّهيئة تؤخّرك عن غايتك، التي هي حلّ المشكلة باستخدام الأداة المعنيّة، إلّا أنّ عمليّة التّهيئة فرصةٌ حسنةٌ للتّعوّد على استخدام واحدةٍ من أهمّ أدوات المهنة: سطر الأوامر. يصيب سطر الأوامر بطبيعته الرّهبة في قلوب كثير من النّاس، إذ يرونه (في عُرف المجتمع) تقنيّة غامضةً يمارسها سحرةُ الحاسوب و"المُخترقون". الحقيقة أنّه سطر الأوامر ليس بهذه الرّوعة، فما هو إلا مجموعة من الأدوات شديدة البساطة أنشأها موظّفو Bell (الّتي تُعرف الآن بالاسم AT&T) لإنجاز مهامّ معظمها بسيط في السّبعينيّات من القرن الماضي، وليس فيها من التّطوّر التّقنيّ أكثر ممّا في فرن المايكروويف في مطبخك! ولكنّ سطر الأوامر مفيد جدًّا، وفائدته تُشبه استخدام الأدوات الكهربائيّة في العمارة بدلًا من استخدام الأيدي. يمكننا تعلّم أدقّ تفاصيله بالاستعانة ببعض المفاهيم والاستعارات اللّفظية. ولعلّ واحدًا من أهمّ تلك المفاهيم هو مفهوم المسار (Path). تعتمد أدوات التّطوير للمتصفّح ومُعالجات CSS ومكتبات JavaScript وأدوات أخرى كثيرة على وجود Ruby أو Node.js مثبّتتين على جهازك. من هذه الأدوات Bower. يجمع بين هذه الأدوات كلّها أنّها ستُضطرّك إلى التّعامل مع المسار عاجلًا أو آجلًا، والسّبب أنّ يجب على المسار أن يعلم بوجود الأدوات الّتي تثبّتها في بيئة التّطوير على جهازك حتّى يستطيع سطر الأوامر أن يعمل بصورة صحيحةٍ. قد تبدو الحاجة لفهم آليّة عمل المسار عودةً إلى الوراء، ولكنّك كلّما استخدمت أدوات سطر الأوامر أكثر، كان احتمال نشوء المُشكلات عن المسار أكبر. ولئلّا تُضيّع ساعات من يومك (أو ربّما لئلّا تبدأ برمي أغراضٍ ثقيلة على شاشة حاسوبك!)، تعّلم أساسيّات استخدام المسار. مُتغيّر صغير ومتواضع ‏‎$PATH‎، كما تُفصح إشارة الدولار في أوّله والحروف الكبيرة الّتي تتلوها، مُتغيّر في بيئة Unix. القيمة المحفوظة في هذا المتغيّر هي قائمةً بمسارات إلى أدلّة (مُجلّدات)، مفصولةٍ بنقطتين (:)، كهذه القائمة: /root/directory/binary:/root/other_directory/other_binary إن كنت من أولئك المهووسين بتسمية المُتغيّرات، فقد تتساءل لما لم يُسمَّ المُتغيّر ‎$PATHS‎ (بصيغة الجمع)، كونه يحوي عدّة مسارات. اسمحوا لي بأن أخمّن السبب تخمينًا، فلربّما يُشير الاسم المُفرد إلى "مسار التّحميل المُكوّن من عدّة مسارات منفردة"، يبدو تخمينًا معقولًا! لو قادك فضولك إلى تحرّي أنواعٍ أخرى من متغيّرات البيئة في نظامك، فاكتب env في سطر الأوامر ثمّ اضغط Enter وسترى قائمة بكلّ متغيّرات البيئة الموجودة حاليًّا. بما أنّ ‏‎$PATH‎ مُتغيّر، يمكننا تغييره كما نشاء، وفي أيّ وقت. يمكنك مثلًا كتابة هذا الأمر في الصّدفة (shell) لديك: export PATH=banana ما نتيجة هذا الأمر؟ جرّب تشغيله في نافذة جديدة داخل الطّرفيّة لديك أو في أي تطبيق صدفة تستخدمه، كبرنامج Terminal في OS X. ثمّ جرّب بعد ذلك تنفيذ أي أمر Unix مثل ls (الّذي يطبع قائمة بمحتويات دليل/مُجلّد). ستكون النّتيجة: ‎-bash: ls: command not found ‎ مع أنّ الأمر كان يعمل بلا مشكلات من قبل! هذه الحيلة الشقيّة علّمتنا أنّ محتويات ‏‎$PATH‎ ضروريّة جدًّا، وإلّا اختلط الحابل بالنّابل! ولكن لماذا؟ لأنّ المسار يُحدّد ما يمكن تنفيذه في الصّدفة، فإن لم تعثر الصّدفة على شيءٍ يطابق اسمه ما كتبته، فلن تستطيع تنفيذه، والفكرة نفسها مُطبّقة في عدّة لغات برمجة وأطر عمل للويب مثل Rails. كدت أنسى! لتصحيح هذه المشكلة، أغلق برنامج الطّرفية وأعد فتحه، فالعطل مؤقّتٌ في حالتنا، ولكن إيّاك أن تحفظ القيمة الخاطئة في ملفّ ‎~/.bash_profile‎، فعندها سيكون الوضع سيئًا للغاية! حكاية عن البرامج الثّنائيّة تُدعى بعض البرامج القابلة للتنفيذ في Unix "ملفّات ثنائيّة (binaries)". لأكون صادقًا معك، هذا الاسم غير مناسب على الإطلاق، لأنّه يهتمّ بصيغة البرامج بدلًا من وظيفتها. عندما تكتب برنامج Unix يؤدّي مهمّة مُحدَّدة، فإنّك قد تحتاج إلى تجميعه (compile) قبل أن تتمكّن من تنفيذه، عمليّة التجميع هذه تُنتج ملفًّا ثنائيًّا (binary). تعتمد هذه الملفّات الصّيغة الثنائيّة لتمثيل التّعليمات بصورة يسهل تنفيذها على الحاسوب بدلًا من الملفّات النّصيّة البسيطة (كملفّات مصدر البرنامج source code). في Unix مُجلّدات عديدة تُحفظ فيها هذه الملفّات الثّنائيّة، وبإمكانك معرفة المُجلّد الذي يُستخدم بصورة مبدئيّة لتحميل الملفّات الثّنائيّة في الملف ‎/etc/paths‎: # الأمر cat يطبع محتويات ملفّ $ cat /etc/paths /usr/bin /bin /usr/sbin /sbin /usr/local/bin في كلّ سطر من الملف دليل واحدٌ. وقد رُتّبت المسارات بأسلوب مدروس، فإذا وجد ملفّ ثنائيّ في مسارٍ منها، حُمِّل، وإن وجد ملفّ آخر بالاسم نفسه في مسار آخر، لم يُنظر إليه. أي إنّ المسارات المُرتّبة في أعلى القائمة ذات أولويّة أكبر من تلك الّتي تقع أدناها. هذا هو سبب المشكلات الّتي تواجهها عندما تُحاول تثبيت برنامجٍ جديد موجودٍ مسبقًا على نظامك، كما في حالة تثبيت إصدارة جديدةٍ من Git على OS X بدل تلك المُرفقة مع النّظام. هذا أمرٌ سيّئ لأنّ Git 2.0 ممتاز! عندما أستعمل cd (الّذي يُغيّر الدّليل الحاليّ) للانتقال إلى ‎/usr/bin‎ (وهو مُجلّد يشيع تخزين البرامج فيه) ثمّ أستعمل ls، فإنّنى أرى أكثر من ألف نتيجة! وهذا أمرٌ غير مُفيد، ولذا أستعمل grep ضمن الأمر ls | grep git لأُصفِّيَ النّتائج بحيث تقتصر على البرامج تحوي الكلمة "git": $ ls | grep git git git-cvsserver git-receive-pack git-shell git-upload-archive git-upload-pack كما ترى، هناك نسخة من Git في ‎/usr/bin‎، وعند تثبيت نسخة نظيفة من OS X فستكون هذه النّسخة هي المُعتمدة، كما يُبيّن تنفيذ الأمر which git. $ which git /usr/local/bin/git مهلًا! لماذا تُخالف النّتيجة لديّ ما توقّعته؟ لنفحص الأمر بدقّة بإرفاق which بالخيار ‎-a‎: $ which -a git /usr/bin/git /usr/local/bin/git هذا يؤكّد وجود نسختين من Git مثبّتتين على نظامي، ولكنّ الأولى هي المُعتمدة عندما أُنفّذ أوامر git في سطر الأوامر. تغيير المسارات قرّرت تثبيت إصدارٍ مُختلف من Git على نظامي مُستخدمًا مُدير حزم اسمه Homebrew لأنّني أحبّ أن أُسيطر على الأدوات الّتي أستخدمها كلّ يوم وأحدّثها وقتما أشاء. كان بإمكاني تحديث نسخة Git المُرفقَة مع النّظام، لكنّني لا أعلم إن كان هذا سيُعطِب البرامج الّتي تعتمد على وجودها. نعلم إذن أنّ البحث عن البرامج يتبع ترتيب القائمة في الملفّ ‎/etc/paths‎، فلم لا نُغيّر هذا التّرتيب؟ أرى أن المُجلّد ‎/usr/local/bin‎ الّذي يحوي إصدار Git الّذي ثبّته Homebrew يقع في نهاية الملفّ ‎/etc/paths‎، وهذا يعني أن برنامج git في ‎/usr/bin‎ يطغى على الإصدار الّذي أريده. بالطّبع لا شيء يمنعك من تغيير التّرتيب في الملفّ ‎/etc/paths‎ بحيث تضع ‎/usr/local/bin‎ في أعلى القائمة لتُعتمد نسخة Git من Homebrew، وستصادف هذه النّصيحة كثيرًا على Stack Overflow، لكن صدّقني... هذا أمرٌ بالغ السوء، لا تفعله! لم يُقصد من هذه الملفّات أن يُعدّلها مستخدمٌ منفردٌ لأنّه تؤثّر على كلّ النظام (حتّى وإن كنت الوحيد الّذي تستعمل الحاسوب)، وقد يسبب هذا التّغيير مشكلات لن تُدرك أسبابها في المستقبل، فقد تعتمد إحدى الأدوات في OS X على التّرتيب الأصليّ للملفّ ‎/etc/paths‎. بدلًا من ذلك، عدّل المُتغيّر ‏‎$PATH‎ في بيئتك أنت، في نسختك أنت من الملفّ ‎.bash_profile‎، الموجودة في ‎/Users/yourusername/.bash_profile‎. ما عليك إلّا أن تجعل البحث يُجرى في ‎/usr/local/bin‎ أوّلًا في الملفّ ‎.bash_profile‎: # في الملفّ /Users/olivierlacan/.bash_profile export PATH=/usr/local/bin:$PATH وهذا يؤدّي إلى تصدير مُتغيّر البيئة ‎$PATH‎ الجديد وذلك بطباعة المُتغيّر الحاليّ وإسباقه بـ ‎/usr/local/bin‎ على يسار كلّ المسارات الأخرى. بعد حفظ الملفّ ‎~/.bash_profile‎، وإعادة تشغيل الصّدفة، يُفترض أن ترى هذه النّتيجة عند استدعاء echo على المُتغيّر: $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin لاحظ أنّ ‎/usr/local/bin‎ مذكور مرّتين في المتغيّر ‎$PATH‎ ولا بأس في هذا. ولأنّه ذُكر أوّلًا، فكلّ البرامج الّتي تُحمّل منه في المّرة الأولى ستُتجاهَل عند الوصول إليه ثانيةً. كنت أتمنّى وجود طريقة آمنة وبسيطة لتغيير ترتيب المسارات، ولكنّ الحلول الّتي أعرفها شديدة التّعقيد. بإمكانك دومًا تجاوز القيمة المبدئيّة لـ‎$PATH‎ بالكامل، ولكن فقط عندما تُدرك تمامًا ما الّذي تفعله وأيّ المسارات يجب تضمينها. على مفترق المسارات بعد أن عدّلت المسار ‎$PATH‎ كما يحلو لك، بإمكانك التأكّد من أنّ البرنامج المرغوب يُستدعى عندما تُنفّذ الأمر git: $ which git /usr/local/bin/git $ git --version git version 2.0.0 /usr/bin/git --version git version 1.8.5.2 (Apple Git-48) عظيم! الإصدارة 2.0.0 من Git هي الّذي يتلقّى أوامر git (وهي الإصدارة الّتي ثبّتها Homebrew)، بينما تغيب الإصدارة 1.8.5.2 المُرفقة مع النّظام. إن قرّرت ألّا تستخدم الإصدارة 2.0.0 بعد الآن، ليس عليك سوى إزالتها وستعود الإصدارة الأقدم للعمل بصورة انسيابيّة. احمِ مسارك تُضيف أدوات تطوير (وتصميم) كثيرة أوامر برمجيّة إلى الملفّ ‎.bash_profile‎ بعد تثبيتها، والغالب أنّها لا تخبرك بذلك، فإن وجدت مسارات غريبة مُدرجةً في الملفّ، فقد يُفسّر ذلك بطء تحميل جلسة جديدة كلّ مرّة (الأمر الّذي يحدث عند فتح صدفة جديدة أو لسان جديد في الطّرفيّة): مُتغيّر ‎$PATH‎ طويل، يتطلّب وقتًا طويلًا لتحميله. إليكم مساري اليوم: /Users/olivierlacan/.rbenv/shims:/Users/olivierlacan/.rbenv/bin:/usr/local/bin:/usr/local/heroku/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/MacGPG2/bin تصعب قراءته قليلًا، لذا أُفضّل تجزئته على سطور باستخدام الأمر tr (الّذي يستبدل حروفًا مُحدّدة): $ echo $PATH | tr ':' '\n' /Users/olivierlacan/.rbenv/shims /Users/olivierlacan/.rbenv/bin /usr/local/bin /usr/local/heroku/bin /usr/bin /bin /usr/sbin /sbin /usr/local/bin /opt/X11/bin /usr/local/MacGPG2/bin أشياءٌ كثيرة تحدث هنا، ولكن فهمها أسهل وهي موزّعة على سطور. جرّب تنفيذ الأمر ذاته، فإنّ لم تفهم سبب وجود إحدى السّطور، فاحرص على إيجاده، فقد تتعلّم شيئًا مُفيدًا. قد لا تبدو فائدة تعلّم ‎$PATH‎ وكيفيّة عمله عظيمةً. ولكن لأنك مُطوِّر ويب، فستحتاج إلى التّعامل مع سطر الأوامر، وقد تتعطّل إحدى أدواتك يومًا، والآن وقد تعلّمت مسارك وكيف يبدو وهو نظيف، والأسلوب الصّحيح لتعديله، وكيف تتأكّد من أنّه يعلم بوجود برامجك، فإنّ عودتك إلى "مسارك" المهنيّ ستستغرق دقائق بدلًا من ساعات! ترجمة (بتصرّف) لمقال The $PATH to Enlightement لصاحبه Oliver Lacan
    1 نقطة
  5. أريد أن أقوم بتبديل عدد من الأسطر في ملف نصي عادي، لذلك أقوم بقراءة كل الملف (قد تحدث مشاكل إن كان الملف كبير للغاية)، وبعد ذلك أقوم بالبحث عن السطر المطلوب وتبديله، لكن المشكلة هي بمجرد إيجاد السطر المطلوب تبديله لا أعلم كيفية حذف السطر الخاص به والكتابة مكانه، هل توجد طريقة للكتابة في مكان معين في ملف نصي بدلًا من كتابة كامل محتوى الملف مرة أخرى؟ هذا هو الكود الخاص بي: f = open(file) for line in f: if line.contains('foo'): newline = line.replace('foo', 'bar') # كيفية كتابة هذا السطر الجديد مرة أخرى إلى الملف
    1 نقطة
  6. هل يوجد أمر معيّن أو طريقة لنسخ أو نقل المجموعة collection من قاعدة بيانات إلى أخرى؟ علماً بأن القاعدتين موجودتين على نفس الخادم. لقد قرأت في التوثيق الرسمي ولم ألاحظ ماهي آلية تحقيق ذلك.
    1 نقطة
  7. أحاول إنشاء دالة تقوم بحذف كل الحروف المتحركة (aeiou) من نص مدخل إليها، لكن المشكلة هي أنه لا يتم حذف كل الحروف المتحركة، ويتبقى حرف متحرك أخير، هذا هو الكود الخاص بي: text = "Hellooo, world! Words!" def removeVowel(text): textlist = list(text.lower()) for char in textlist: if char in 'aeiou': textlist.remove(char) return "".join(textlist) print(removeVowel(text)) # hll, wrld! words! كما تلاحظ حرف o في كلمة words لم يتم حذفه، ما الخطأ الذي أقوم به هنا؟
    1 نقطة
  8. لدي مستندات فيها تاريخ معيّن بالشكل التالي: { "username" : "test123", "subDate" : ISODate("2020-10-01T00:00:00.000Z"), "phone" : 112334556 } وأقوم بإجراء الاستعلام التالي: find({ "subDate" : { "$gte" : { "$date" : "2020-10-01T00:00:00.000Z"}} }) ولكن لا يتم إعادة أي مستند، ما الخطأ هنا وكيف يمكنني إجراء هذا الاستعلام حسب التاريخ؟
    1 نقطة
  9. هل من الممكن تخزين الصور أو حتى الفيديو كما هي في قاعدة البيانات بدلاً من فقط تخزين مسار وجودها على الخادم؟ لقد لاحظت أن المستندات في mongodb لها سعة تخزين محددة، ولكن أرغب بتخزين بعض الصور ضمن قاعدة البيانات. فهل يجب أن أقوم بتقسم الملفات على أكثر من مستند بهذه الحالة؟ وماهي الطريقة لتخزين هكذا ملفات في mongodb؟
    1 نقطة
  10. كيف نقوم بتقسيم البيانات باستخدام LeavePOut في مكتبة Sklearn؟
    1 نقطة
  11. أنت لديك 5 عينات، موزعة كالتالي: عينة للأصناف 2و1و3 وعينتين للصنف 4 ال "number of members in each class" يقصد بها عدد الأعضاء في كل صف أي عدد العينات من أجل كل صف. يحاول StratifiedKFold الحفاظ على نسبة معينة في كل fold من هؤلاء الأعضاء. أنت حددت 3 تقسيمات "Fold" وبالتالي في كل تقسيمة من أجل الكلاس 2 مثلاً، يجب على الأقل الحفاظ على نسبة0.33 =1/3 عضو. ومن الكلاس 1 و 3 أيضاً يجب أن تتحقق نفس النسبة (0.33 عضو). أما من أجل الكلاس 4 فيجب أن تتحقق النسبة 2/3=0.67 عضو. لكن 0.33 تعني جزء من العينة وهذا غير ممكن! يجب على الأقل أن يكون عدد الأعضاء في الكلاسات من 1 إلى 3 يساوي 3 ومن الكلاس 4 أيضاً 3 لكي يصبح 1 عضو في كل تقسيمة على الأقل. ولهذا السبب ظهر الخطأ. إذاً يجب أن يكون لديك على الأقل 3 عينات من أجل كل كلاس. لاحظ أيضاً أنك إذا وضعت 2 (أقصد تقسيمتين) سوف ينجح الأمر لكنه سيعطيك التحذير التالي: UserWarning: The least populated class in y has only 1 members, which is less than n_splits=2. % (min_groups, self.n_splits)), UserWarning) حيث أنه يعطيك خطأ إذا لم يجد أي كلاس يحقق الشرط (لأنه لن يكون لفكرة الخوارزمية معنى بعد ذلك)، بينما يعطيك تحذير إذا كان هناك كلاس واحد على الأقل يحققه.
    1 نقطة
  12. عندما نقوم بالتخزين فهناك نوعين للتخزين وهما تخزين البيانات ،وتخزين الملفات وطرق تخزين كلاً منهما تختلف عن الآخرى ويفضل عدم استخدام الملفات في قواعد البيانات لأن هذا ليس عملي يمكنك تخزين ملفات أو صور في mongodb ويسمى بمستند BSON لكن الحد الأقصى لحجم الملف هو 16 ميجا أي إذا كان حجم الملف أكبر فيجب عليك تقسيمه لأجزاء بحجم 16 ميجا لكي تستطيع حفظه في mongodb ويمكنك حفظها كنوع BinData أي بيانات ثنائية ، ويمكنك إستخدام GridFs لتخزين الملفات الذي حجمها يتجاوز 16 ميجا String newFileName = "my-image"; // إنشاء ملف صورة File imageFile = new File("/users/victor/images/image.png"); /* إنشاء GridFS بإسم صورة */ GridFS gfsPhoto = new GridFS(db, "photo"); GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile); gfsFile.setFilename(newFileName); // حفظ الملف gfsFile.save();
    1 نقطة
  13. لدي مستندات تحوي قيم للتاريخ ومنها القيم الافتراضية timestamps مثل حقلي created_at و updated_at بالإضافة إلى حقول أخرى تمت إضافتها إلى المستند. ولكن المشكلة أنه يتم حفظ التوقيت بشكل متخلف في قاعدة البيانات عن توقيت جهازي، فهو دوماً يسبق التوقيت ببضع ساعات. وحتى عندما أقوم بالرفع على خادم الويب، يتخلف هذا التوقيت أيضاً عند إضافة مستندات جديدة. كيف يقوم mongoose باختيار التوقيت؟ وهل هنالك طريقة معيّنة للتعامل مع التوقيت حتى تكون موحّدة لكل المستخدمين بغض النظر عن اختلاف تواقيتهم أو المكان الذي يتواجدون به؟
    1 نقطة
  14. احاول مقارنة عدد من المستندات من خلال الرقم الفريد لها _id . ولكن النتيجة دوماً تظهر بشكل false أو لا يوجد تطابق، حتى ولو كان الحقل له نفس القيمة: if (userId == custom._id) { // لا يتم الدخول أبداً إلى محتوى الشرط } مع أن القيم هي نفسها عندما أقوم بطباعتها: userId: 49bb74fc678713bf6a00456 custom._id: 49bb74fc678713bf6a00456 كيف يمكنني حل هذه المشكلة؟
    1 نقطة
  15. لقد قمت بإزالة نسخة node.js من جهازي بنظام ويندوز، ثم قمت بتحميل النسخة الأخيرة من node.js من الموقع الرسمي، ولكن عندما أقوم بالتأكد من النسخة من خلال الأمر التالي: node --version يظهر لي رقم النسخة السابقة والتي قمت بإزالتها وتحديثها، ولا يتم طباعة رقم النسخة الجديدة بدلاً منها. ماهي الطريقة الصحيحة لإزالة النسخة القديمة نهائياً من النظام وتحديثها؟
    1 نقطة
  16. لقد قمت بتحميل المكتبة dotenv وتضمينها ضمن مشروع node.js كالتالي: require('dotenv').config() وقمت بإنشاء الصفحة .env ووضعت بداخلها بعض المتغيرات، مثال: PORT=4000 EMAIL=test@test.com وأقوم باستخدام nodemon ضمن بيئة التطوير و pm2 على الخادم. ولكن كيف يمكنني التحكّم بقيم هذه المتغيرات بحيث يتم استخدام قيم محددة في بيئة التطوير development وقيم أخرى عندما أقوم بمحاكاة تشغيل المشروع على الخادم؟
    1 نقطة
  17. يجب عليك تحديث النسخة الحالية من npm من خلال: npm install npm -g --ca="" أو في حال أردت إبقاء النسخة الحالية، يجب عليك تنفيذ الأمر التالي والذي يقوم بإخبار npm باستخدام مسجلات معروفة known registars: npm config set ca "" كما يمكنك أيضاً العودة إلى التوثيق الرسمي وقراءة بعض الخطوات التي تم شرحها ليتم تطبيقها ضمن مختلف البيئات فيما يتعلق بالتحديث و self signed certificates. من الحلول الأخرى أيضاً: تحديث node.js وتحديث npm بشكل عام: npm update npm -g أو يمكنك تغيير رابط الحصول على المسجلات إلى http بالشكل التالي: npm config set registry="http://registry.npmjs.org/"
    1 نقطة
  18. يمكنك استخدام apache في تخديم صفحات PHP الموجودة في مشروعك من خلال استخدام proxyPass ضمن ملف httpd.conf في apache والتي ستقوم باستقبال جميع الطلبات من مسار محدد وتوجّهه إلى مشروعك: ProxyPass /project http://localhost:8000 ثم يجب عليك إزالة التعليق من الأسطر التالية: LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so وبعدها سيتم إعادة توجيه أي طلبات من المسار project إلى مشروعك المبني ضمن node.js والذي يجب أن يكون أيضاً على نفس المنفذ الذي قمنا بتعريفه ضمن proxyPass: var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Node js back-end is running, port = 8000 '); }).listen(8000, '127.0.0.1'); أما بقية الطلبات والتي هي تابعة إلى PHP فسيتم تخديمها من قبل Apache
    1 نقطة
  19. يمكنك عمل ذلك كالآتي from datetime import timedelta, date class DateIterable: def __init__(self, start_date, end_date): # تهيئة بداية ونهاية التواريخ self.start_date = start_date self.end_date = end_date self._present_day = start_date def __iter__(self): # إعادة الكائن # __iter__ return self def __next__(self): # مقارنة التاريخ الحاضر مع التاريخ الأخير # إذا كان التاريخ الحاضر أكبر من التاريخ الأخير فسيتوقف التكرار if self._present_day >= self.end_date: raise StopIteration today = self._present_day self._present_day += timedelta(days=1) return today if __name__ == '__main__': for day in DateIterable(date(2020, 1, 1), date(2020, 1, 6)): print(day) أو يمكنك إضافة هذا الكود في الكائن def __iter__(self): for x in self.iterable: yield x كما يلي class someClass: def __init__(self,list): self.list = list def __iter__(self): for x in self.list: yield x var = someClass([1,2,3,4,5]) for num in var: print(num)
    1 نقطة
  20. السبب أن هناك مشكلة وعند إستخدام NumPy إصدار 1.19.4 ستظهر لك هذه المشكلة والحل كان عبر إزالة تثبيت هذه النسخة وتثبيت النسخة 1.19.3 pip install numpy==1.19.3 ولكن من الخامس يناير 2021 نسخة NumPy إصدار 1.19.5 قد تم نشرها ويبدو أنها قد حلت هذه المشكلة ويمكنك تثبيت آخر نسخة
    1 نقطة
  21. تم تقديم عبارة with لأول مرة منذ خمس سنوات، في Python 2.5. تُستخدم with عند العمل مع موارد غير مُدارة "unmanaged resources" مثل file streams Open network connections. Unmanaged memory ومع الأقفال Locks و ال sockets وال subprocesses. يسمح لك بالتأكد من "تنظيف" المورد عند انتهاء تشغيل الكود الذي يستخدمه، حتى إذا تم طرح استثناءات. ففي حال استخدمتها مع الملفات فتتمثل ميزة استخدام عبارة with في ضمان إغلاق الملف بشكل آمن بغض النظر عن كيفية الخروج من الكتل البرمجية المتداخلة الموجودة لديك. بحيث إذا حدث استثناء قبل نهاية الكتلة البرمجية، فسيتم إغلاق الملف بشكل مسبق بواسطة معالج استثناء خارجي. وإذا كانت الكتلة المتداخلة تحتوي على تعليمة return ، أو تعليمة continue أو break، فإن تعليمة with ستغلق الملف تلقائياً في تلك الحالات أيضاً. حيث تضمن عبارة with نفسها بالحصول على الموارد وتحريرها بالشكل المناسب. يكون استخدامها مفيداً عندما يكون لديك عمليتان مترابطتان ترغب في تنفيذهما كزوج، مع وجود كتلة من التعليمات البرمجية بينهما. المثال الكلاسيكي هو فتح ملف ومعالجة الملف ثم إغلاقه وهذا ماسنراه في المثال التالي: # وبدون معالجة للاستثناءات التي قد تحدث with بدون استخدام f = open('path', 'w') f.write('hsoub') f.close() # مع معالجة للاستثناءات التي قد تحدث with بدون استخدام f = open('path', 'w') try: f.write('hsoub') finally: f.close() #with استخدام with open('path', 'w') as file: f.write('hsoub') في أول مثال قد يؤدي حدوث استثناء أثناء استدعاء write إلى عدم إغلاق الملف بشكل سليم مما يؤدي إلى حدوث العديد من الأخطاء في الكود. الطريقة الثانية في المثال أعلاه تهتم بجميع الاستثناءات ولكن استخدام تعليمة with يجعل الكود مضغوطاً وقابل للقراءة بشكل أكبر. وبالتالي ، تساعد العبارة في تجنب الأخطاء والتسريبات من خلال ضمان تحرير المورد بشكل صحيح عند تنفيذ التعليمات البرمجية التي تستخدم المورد بالكامل. ولاحظ أنك لن تحتاج لتعليمة close كما في أول حالتين. يمكنك أيضاً استخدام تعليمة with مع كائنات معرفة من قبلك حيث يمكن استخدامها في الكائنات التي يحددها المستخدم وهذا مفيد بالنسبة لك لأن دعم عبارة with في العناصر الخاصة بك سيضمن عدم ترك أي مورد مفتوحًا أبدًا. لاستخدامها مع الكائنات المعرفة من قبل المستخدم، تحتاج فقط إلى إضافة التوابع __enter __ () و __exit __ () في الكائن، مثال: class wr(object): def __init__(self, file_name): self.file_name = file_name def __enter__(self): self.file = open(self.file_name, 'w') return self.file def __exit__(self): self.file.close() #مع الكائن with استخدام التعليمة with wr('file.txt') as f: f.write('hasoub') إن الكلمة المفتاحية with تشكل باني ل wr، وبمجرد وصول التنفيذ لتعليمة with يتم إنشاء كائن من wr، ثم يقوم بايثون باستدعاء التابع enter الذي يقوم بتهيئة المورد الذي تريد أن تستخدمه في ال object الخاص بك، ويجب أن تقوم طريقة __enter __ () دائمًا بإرجاع واصف للمورد "descriptor"(مقبض للوصول للملف) الذي تم الحصول عليه. يتم استخدام f للإشارة لل descriptor الذي تم الحصول عليه من التابع enter، ويتم وضع الكود البرمجي الذي يستخدم المورد بداخل كتلة with وبمجرد تنفيذ الكود الموجود داخل الكتلة with ، يتم استدعاء طريقة __exit __ () ليتم تحرير جميع الموارد. # وهذا ليس كل شيء عن تعليمة with.
    1 نقطة
  22. يمكننا أن نحول dataframe إلى مصفوفة عن طريق إستخدام .values أيضاً إذ أنها تخرج الناتج في شكل مصفوفة كما هو موضح في المثال التالي: import numpy as np import pandas as pd df = pd.DataFrame([ {'var1': 'a', 'var2': 1}, {'var1': 'b', 'var2': 1}, {'var1': 'c', 'var2': 1}, {'var1': 'd', 'var2': 2}, {'var1': 'e', 'var2': 2}, {'var1': 'f', 'var2': 2}]) df.values أو يمكننا الحصول على البيانات كاملة بالإضافة لindex بإضافة الدالة reset_index() وتصبح الدالة كالتالي: df.reset_index().values كما يمكننا الحصول على البيانات بالindex أيضاً بإستخدام الدالة to_records() كالتالي: df.to_records() لكن بالطبع التحويل بإستخدام الدالة المخصصة لذلك هي أفضل مثلما هو موضح في الإجابتين السابقتين و ذلك لتفادي أي أخطاء قد تنتج. كما يمكننا الحصول على مصفوفة بإستخدام الدالة asarray التي تستقبل dataframe كمدخل و ترجع مصفوفة البيانات أو إستخدام الدالة array التي تقوم بنفس العملية، البرنامج التالي يوضح طريقة إستخدام الدالتين: np.asarray(df) np.array(df)
    1 نقطة
  23. 1- تستخدم with في لغة البرمجة بايثون لexception handling وذلك لتفادى توقف البرنامج عن العمل في حالة ظهور خطأ و يجعل ايضاً البرنامج أكثر مقروئية. و تستخدم غالباً للتحكم في حالة التعامل مع الذاكرة أو المعالج streaming لانها تتأكد من أن كل ما تم إستخدامه في البرنامج تم إغلاقه release resources. 2- مثال لبرنامج بإستخدام with و بدون إستخدامها في حالة فتح ملف للكتابة: file = open('myfile', 'w') file.write('hello world!') file.close() في البرنامج السابق فتحنا الملف المعرف بmyfile وقمنا بكتابة العبارة hello world! بداخله ثم قفلنا الملف، و الان يمكننا تنفيذ نفس المثال و لكن بإستخدام try except كالتالي: file = open('myfile', 'w') try: file.write('hello world!') except: file.close() والان يمكننا أن نستخدم with بالطريقة التالية: with open('myfile', 'w') as file: file.write('hello world!') لاحظ أننا لم نقم بعملية قفل الملف التي تتكفل بها عبارة with إذ أن الملف يتم قفله و تحرير كل مساحة تم إستخدامها في الذاكرة بعد الإستخدام مباشرة. أي عملية خطأ تحدث في عملية الكتابة تدخلنا في تنفيذ الجزء الخاص بexcept وقد لا يتم قفل الملف بصورة صحيحة و التي يعتمد عليها معظم التعديلات في الملف. 3- نعم لا مانع من إستخدام العبارة with لانها تؤدي نفس غرض try except لكن مع الميزات الإضافية التي تم ذكرها في 1 و 2. 4- لعلك لاحظت عزيزي @Fahmy Mostafa أن العبارة with تستخدم مع الstreaming، لذلك يمكنك التفكير في الأحوال التي تحتاج فيها إرسال و إستقبال البيانات إما محلياً بالتعامل مع ملفات موجودة بالجهاز كفتح ملف للقراءة و الكتابة، والتعامل مع قواعد البيانات كالمثال الموضح في شرح @عبدالمجيد الجرادي، أو إستقبال و إرسال بيانات خارجياً عن طريق الإنترنت مثلاً. يمكنك مراجعة موقع بايثون للتعرف على streams أكثر.
    1 نقطة
  24. يمكن الاعتماد على المؤشر iterator: حيث نقوم ببناء الصنف بطريقة مشابهة للتالي: class Counter(object): # تهيئة العنصر def __init__(self, start, stop): self.start = start self.stop = stop # تعريف المؤشر def __iter__(self): return self # الدالة لجلب العنصر التالي def __next__(self): # next in Python 2 # اختبار الشرط if self.start >= self.stop: raise StopIteration current = self.start * self.start self.start += 1 return current iterator = Counter(a, b) ولجلب العنصر الحالي يمكن إضافة الدالة current التي تعيد start ألمعدلة: def current(self): return self.start وبطريقة أخرى: كما يمكن الاستفادة من مفهوم المولد generator والكلمة المفتاحية yield: def counter(start, stop): for i in range(start, stop): yield i Counter = counter(3, 9)
    1 نقطة
  25. في بايثون الكلمة المحجوزة with تستخدم عند التعامل مع الموارد غير المُدارة مثل file streams إنه يسمح لك بالتأكد من أن المَورد تم تنظيفه عندما يكون الكود الذي استخدمه انتهى من عمله حتى إذا ظهرت إستثناءات exceptions فيمكنك إستخدام try/finally لمعالجة الإستثناء وايضاً with تتأكد من أن عملية file stream لا تقوم بحظر العمليات الأخرى إذا ظهر إستثناء إذا أردت فتح وقراءة ملف ستستخدم الكود التالي file = open('file-path', 'w') try: file.write('Lorem ipsum') finally: file.close() لكن مع with ستحصل على كود أكثر نظافة كالآتي with open('file-path', 'w') as file: file.write('Lorem ipsum') كما في الكود السابق ، مع with تم تبسيط الكود الى سطرين فقط يمكنك إستخدام with مع عمليات الطلب من قواعد البيانات ايضاً كما يلي def get_all_users(): with sqlite3.connect('db/users.db') as connection: cursor = connection.cursor() cursor.execute("SELECT * FROM users ORDER BY id desc") all_users = cursor.fetchall() return all_users
    1 نقطة
  26. يمكنك استخدام with في ال error handling و ال management resources غالباً في بث الملفات حيث تستخدم في عدة عمليات مرتبطة ومترتبة على بعضها ويمكنك استخدامها كالتالي with open('file.txt', 'w') as f: f.write('hello') في هذه الحالة لا تحتاج لاستخدام f.close فهي تقوم بذلك بدلاً عنك بالطبع لا مشكلة في استخدام with بل اعد الأفضل في بعض الإستخدامات يمكنك بالطبع استخدام try except بدلاً منها ولكن with توفر عليك بعض المهام وإختصار للكود حتى تستطيع استخدام with يجب توفير الدعم لها من خلال إنشاء Context Manager على هيئة كائن حتى يتواجد الدوال __enter__ و __exit__ لتستطيع العمل ب with هناك العديد من الدوال والمكتبات التي بدأت توفير الدعم للعمل ب with
    1 نقطة
  27. من DataFrame الى مصفوفة NumPy في المثال الآتي نقوم بتحويل DataFrame الى مصفوفة NumPy import pandas as pd #تهيئة #DataFrame df = pd.DataFrame( [[21, 72, 67], [23, 78, 69], [32, 74, 56], [52, 54, 76]], columns=['a', 'b', 'c']) print('DataFrame\n----------\n', df) #التحويل arr = df.to_numpy() print('\nNumpy Array\n----------\n', arr) وللتحويل من DataFrame الى مصفوفة NumPy عندما يكون لدى DataFrame أنواع بيانات مختلفة import pandas as pd import numpy as np #تهيئة # dataframe df = pd.DataFrame( [[21, 72, 67.1], [23, 78, 69.5], [32, 74, 56.6], [52, 54, 76.2]], columns=['a', 'b', 'c']) print('DataFrame\n----------\n', df) print('\nDataFrame datatypes :\n', df.dtypes) #التحويل arr = df.to_numpy() print('\nNumpy Array\n----------\n', arr) print('\nNumpy Array Datatype :', arr.dtype)
    1 نقطة
  28. يمكنك استخدام الدالة to_numpy() وهذه الدالة تقوم باسترجاع الناتج كالتالي DataFrame([ {'var1': 'a', 'var2': 1}, {'var1': 'b', 'var2': 1}, {'var1': 'c', 'var2': 1}, {'var1': 'd', 'var2': 2}, {'var1': 'e', 'var2': 2}, {'var1': 'f', 'var2': 2} ]).to_numpy()
    1 نقطة
  29. نعم يمكن الاعتماد على برنامج Memsource في الترجمة المتخصصة والعلمية في حال توفر ذاكرة الترجمة تحوي المصطلحات الخاصة بالمجال ويتم إضافتها لمشروع الترجمة والاستعانة بها في عملية الترجمة ومستواه متقدم جدا في هذا المجال نظرا لتعدد الخيارات بالنسبة لإضافة ذاكرات الترجمة أو حتى بناء ذاكرات جديدة من أعمال ترجمة سابقة. بالنسبة لترجمة المدونات والترجمة الآلية نعم تتوفر الترجمة الآلية على برنامج Memsource وتطبيقه الخاص بالهاتف المحمول كما يدعم مواقع الوورد برسWordpress المدونات وصفحات الهبوط إلى عدة لغات.
    1 نقطة
×
×
  • أضف...