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

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

  1. سامح أشرف

    سامح أشرف

    الأعضاء


    • نقاط

      4

    • المساهمات

      2934


  2. عبد النور محمد

    • نقاط

      4

    • المساهمات

      95


  3. Wael Aljamal

    Wael Aljamal

    الأعضاء


    • نقاط

      3

    • المساهمات

      6975


  4. شرف الدين حفني

    • نقاط

      3

    • المساهمات

      1690


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

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

  1. كيفية عمل برنامج يستقبل عددين ويحسب القوى ( x أس y)
    2 نقاط
  2. هل يمكن تزويدي بمعلومات اكثر عن PDO ؟
    2 نقاط
  3. لقد قرأت عن الfor await في جافاسكريبت ولكن اشعر بعدم استيعابي لها , هل من الممكن ان يتكرم احد ويبسطها ؟؟؟
    2 نقاط
  4. مرحبا، كيف يمكنني اضافة مثل هذه القائمة المنسدلة في لارافيل؟
    2 نقاط
  5. أحاول تشغيل "npm run dev" في مشروع Laravel الخاص بي ولكن حدث خطأ Error: Cannot find module 'webpack-cli/package.json' Require stack: C:\Users\abdal\AppData\Roaming\npm-cache_npx\20792\node_modules\webpack\bin\webpack.js at Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15) at Function.resolve (internal/modules/cjs/helpers.js:78:19) at runCli (C:\Users\abdal\AppData\Roaming\npm-cache_npx\20792\node_modules\webpack\bin\webpack.js:50:26) at C:\Users\abdal\AppData\Roaming\npm-cache_npx\20792\node_modules\webpack\bin\webpack.js:139:5 at processTicksAndRejections (internal/process/task_queues.js:97:5) { code: 'MODULE_NOT_FOUND', requireStack: [ 'C:\Users\abdal\AppData\Roaming\npm-cache\_npx\20792\node_modules\webpack\bin\webpack.js' ] } مع أنه تم تنزيل webpack cli.
    2 نقاط
  6. سلام الله عليكم أعاني من انقطاع شبكة الانترنت كل دقيقة تقريبا فاضطر إلى إعادة الاتصال كل مرة مع العلم أني استعمل نظام التشغيل windows 10
    1 نقطة
  7. تصميم واجهة المستخدم من أهم المهن المطلوبة حاليًا في سوق العمل، ولكن ما هي واجهة المستخدم؟ واجهة المستخدم هي ما نراه ونتفاعل معه على شاشات الحواسيب والأجهزة المحمولة، مثل موقع الإنترنت وتطبيقات الهاتف المحمول وتطبيقات الويب. لذلك فإن الشخص الذي يختار مواقع العناصر على الشاشة وتخطيط مختلف الصفحات والشاشات ومن يخطط أنماط ألوانها ورسوماتها، هو مصمم الواجهات، ويرتبط عمله مباشرة مع مطوّر الويب والتطبيقات كما يرتبط من جهة أخرى مع مصمم تجربة المستخدم. كيف يعمل مصمم واجهة المستخدم؟ من الصعب جدًّا على مصمم الرسوميات العمل على تصميم الواجهات منفردًا، لأن عمله مرتبط كليًا بالتنسيق مع مطوّر التطبيقات والويب، لذلك فإن الغالبية العظمى من مصممي الواجهات يعملون في فرق تضم مصمم رسوميات ومطوّر تطبيقات ومدير فريق الذي يجب أن يكون لديه إلمام بالتصميم والتطوير معًا، وقد يتضمن الفريق أفرادًا أكثر إن لزم الأمر مثل كاتب المحتوى وغيره. دورة تطوير واجهات المستخدم ابدأ عملك الحر بتطوير واجهات المواقع والمتاجر الإلكترونية فور انتهائك من الدورة اشترك الآن مراحل تصميم واجهة المستخدم يمر مشروع تصميم الواجهة بعدة مراحل وهي: يتلقى المدير طلبًا لتنفيذ مشروع واجهة تطبيق أو ويب ويحصل على كافة المعطيات والمعلومات اللازمة لبدء المشروع. يجتمع المدير بأعضاء الفريق ويطلعهم على المعطيات التي بين يديه ثم يوزع المهام على المصمم والمطور وعادة ما يبدأ المصممم العمل. يعمل المصمم على إنشاء رسومات نماذج أولية باستخدام القلم والورقة إلى أن يصل إلى نماذج مرضية لرؤيته الخاصة بالمشروع. ينقل المصمم هذه النماذج من الأوراق إلى الحاسوب ليرسم هذه النماذج بطريقة احترافية ومنسقة بأسلوب الإطار الشبكي Wireframe ثم يسلم هذه النماذج إلى المدير. ملاحظة: إن كان فريق العمل يعمل معًا في نفس المكتب فإنه يسلم هذه المخططات مباشرة، أو عن طريق إرسالها بالبريد الإلكتروني أو أية وسيلة اتصال أخرى، أو قد يلجأ الفريق للعمل معًا على أحد أدوات وتطبيقات سطح المكتب أو تطبيقات الويب المخصّصة لعمل الفرق في هذا المجال، حيث يتشارك الجميع الأفكار والتصاميم والنماذج ويعلّقون عليها ويتباحثون بأمرها، سنذكر بعضًا من هذه الأدوات والتطبيقات في الجزء الأخير من المقال. يتبادل المدير والمصمم الآراء والأفكار وتُنفّذ التعديلات ثم يرسل المدير النماذج إلى العميل ليبدي رأيه فيها ويطلب تعديلاته. يبدأ المصمم العمل على استخدام العناصر الرسومية والصور والألوان لإنشاء تصاميم رسومية أولية ثم يشاركها مع المدير الذي يرسلها بدوره للعميل لإبداء الرأي وطلب التعديلات. يعمل المصمم على التعديلات المطلوبة ويسلم التصاميم النهائية للمدير الذي يسلمها بدوره للمطور ليعمل على تطوير التطبيق أو الموقع ومن ثم يسلم المشروع إلى العميل. قواعد تصميم واجهة المستخدم لتصميم واجهات جيدة ومتميزة واحترافية نحتاج إلى اتباع قواعد معينة تضمن تألق وتميز التصميم كما تضمن سهولة استخدامه وقبوله من قبل المستخدمين. التناسق يجب استخدام نفس أنماط التصميم ونفس تسلسل الإجراءات للحالات المتماثلة، يتضمن ذلك الاستخدام الصحيح للألوان والطباعة والمصطلحات في الشاشات والأوامر والقوائم الفورية خلال رحلة المستخدم، حيث تسمح الواجهة المتسقة للمستخدمين بإكمال مهامهم وأهدافهم بسهولة أكبر. يجب أن يكون المستخدم مرتاحًا في استخدامه للواجهة ولا يشعر بالارتباك، مثلًا لا يجب وضع زر القائمة المنبثقة أسفل الواجهة بينما اعتاد المستخدمون على وجودها أعلى الواجهة، وكذلك لايجب أن يوضع زر شراء المنتج أعلى صفحة المنتج وفوق صورته والمعلومات حوله بينما اعتاد المستخدمون وجود هذا الزر أسفل هذه الواجهة، وهكذا. كما يُفضّل على الدوام استخدام الأشكال المألوفة والأزرار المألوفة أكثر من الأشكال الجديدة التي قد تشعر المستخدمين بالغرابة وتجعلهم يفكرون مرتين قبل استخدام العنصر أو النقر على الزر ، فهذا التردد ليس جيدًا بمقاييس تجربة المستخدم والتصميم السليم والصحيح لواجهة المستخدم. البساطة في جميع القواعد الخاصة بتصميم أي شيء تجد مبدأ البساطة دائمًا، لأن التصميم البسيط مريح أكثر للنظر ويساعد على إيصال الرسالة بسلاسة ووضوح وسهولة دون عناء وهو الهدف من التصميم، فلا أحد يحب الواجهات المزدحمة وغير المنتظمة التي تسبب الإرباك عند محاولة التعامل معها لعدم وضوح الرسالة المفروض إيصالها أو الهدف من التطبيق أو الموقع. فإضافة المزيد من العناصر المختلفة في التصميم سيقلل التركيز على العناصر المهمة والتي يجب أن يركّز عليها المصمم. لذلك يجب التخفيف من ازدحام العناصر وتأمين تصميم بسيط يتضمن أهم العناصر فقط والابتعاد عن العناصر الأقل أهمية والتي يمكن إبرازها في واجهات أخرى يمكن التنقل إليها من الواجهة الرئيسية. مثال: أهم ما يركز عليه موقعا ياهو وجوجل هو محرك البحث وعملية البحث، وبفضل التصميم البسيط والمختصر لجوجل فإن التركيز منصب على محرك البحث فحسب، بينما يسبب ازدحام العناصر المختلفة في واجهة ياهو تشتيت الانتباه عن العنصر الرئيسي الأهم وهو خانة البحث. تناسق الخطوط من المهم التمييز بين أنواع الخطوط الواجب استخدامها عند تصميم واجهات المستخدم، حيث أن هناك خطوطًا يمكن عرضها بوضوح ضمن واجهات الويب لسطح المكتب ولكنها صعبة القراءة وقليلة الوضوح عند استخدامها في الأحجام الصغيرة ضمن الشاشات الصغيرة للأجهزة المحمولة. لذلك يجب الانتباه واستخدام خطوط ثخينة نسبيًا في الواجهات المصممة للشاشات الكبيرة والخطوط النحيفة نسبيًا عند التصميم للشاشات الصغيرة. من أهم القواعد المتبعة في هذا السياق تجنب استخدام أكثر من نوعين من الخطوط ضمن أي واجهة لضمان تناسق وأناقة التصميم. مراعاة التصميم المتجاوب تساعد بعض برامج تصميم الواجهات على إنشاء تصاميم متجاوبة تتمتع بقابلية تغيير حجم العناصر والأجزاء الأساسية بحسب حجم الشاشة المعروض عليها التصميم، مثل حجم الشعار والقوائم والفقرات النصية وغيرها، بينما لا تتمتع برامج أخرى بهذه الميزة مثل برنامج الفوتوشوب والإليستريتور، لذلك يجب أن يخصص المصمم إما عناصر بأحجام متوسطة تراعي كافة الأحجام المحتملة أو يجب عليه أن ينشئ عدة نسخ من العناصر بأحجام مختلفة ليستخدمها المطور في برمجة الواجهة حتى تكون متجاوبة وقابلة للتكبير أو التصغير بحسب حجم شاشة العرض. التباين كثيرًا ما نرى واجهات لمواقع أو لتطبيقات لا تراعي مبدأ التباين على الاطلاق بحيث تكون الألوان بين العناصر المختلفة ولاسيما بين العناصر والخطوط ذات تباين متدني بحيث يكون من الصعب تمييز العناصر أو قراءة النصوص، وعلى العكس أيضًا أحيانا يكون التباين مبالغًا فيه ما يجعل النظر ومتابعة العناصر أو القراءة مزعجة للعين وغير مريحة، لذلك يجب أن يكون التباين متوسطًا ومدروسًا حتى يحقق تجربة مستخدم مريحة وجيدة. أحد أبرز أساليب تطبيق مبدأ التباين هو تصميم واجهة بلون واحد مع التدرجات القريبة وبالأخص اللون الرمادي وتدرجاته، ومع استخدام لون حيوي مميز للعنصر أو العناصر الأهم لتأمين بروزها مع تحقيق جمالية وأناقة في التصميم. الهرمية هو من المبادئ المهمة في التصميم عامة وكذلك تصميم الواجهات خاصة، نستطيع من خلاله توجيه عين المستخدم واهتمامه بطريقة تدريجية في الاتجاه الذي نريد، ويكون تطبيق هذا المبدأ عبر تعزيز خصائص مميزة إضافية تُبرز العنصر الأهم في الواجهة مع تخفيف نسبة التعزيز للعنصر التالي في الأهمية وهكذا، وبذلك يعلم تمامًا المستخدم كيفية التوجّه ضمن الواجهة. المحاذاة يجب تطبيق هذا المبدأ على جميع محاور وأطراف التصميم، وعلى عكس تصاميم أخرى حيث يطبق هذا المبدأ على محور واحد ويكون ذلك كافيًا، إلا أن ذلك غير كاف في تصميم الواجهات نظرًا لأن هذه الواجهات عادة ما تكون مكتظة بالعناصر بالموازنة مع تصاميم فنية أخرى، ما يستوجب تطبيق المحاذاة على مختلف المحاور والأطراف ليكون المنظر العام للتصميم متوازنًا ومتناسقًا. انظر للشكل التوضيحي السابق وستلاحظ مبدأ المحاذاة بكل وضوح. التقارب وهو أحد مبادئ التصميم العامة، حيث أن تطبيقه يحسّن تجربة المستخدم لأن تناثر العناصر ضمن الواجهة وتباعدها يؤدي لتجربة مزعجة للمستخدمين وغير فعّالة لذلك يجب تنظيم العناصر بقرب بعضها وبتسلسل مرتب حتى نؤمن تجربة سلسلة ومريحة للمستخدمين. الوضوح ويقصد هنا تأمين الوضوح في الخيارات والقرارات والمتطلبات التي يجب أن ينفذها المستخدم، فعلى سبيل المثال عندما تتواجد في صفحة التسجيل حقول إدخال عدة ويتطلب كل حقل نوعية إدخال مختلفة، يجب أن يكون واضحًا ومفهومًا للمستخدم ما يجب عليه إدخاله ضمن هذه الحقول وما هي الأخطاء التي ارتكبها أثناء عملية الإدخال حتى يتداركها ويصححها بطريقة سلسلة ومفهومة وواضحة. الصورة بواسطة Antonin Kus من موقع dribbble المساحة البيضاء حافظ على المساحات البيضاء قدر الإمكان وأكثر منها دون تردد، لأنها أثبتت فعاليتها في اجتذاب المستخدمين فهي تسبب الشعور بالراحة والرقي والأناقة وبها تتحقق مبادئ التناسق والبساطة بسهولة، لذلك تجنب استخدام المربعات والمستطيلات والخطوط التي تفصل بين العناصر قدر الإمكان واسمح للمساحات البيضاء بالسيطرة على مساحة التصميم العامة. مصدر الصورة أدوات تصميم واجهة المستخدم تقدم بعض هذه الأدوات والبرامج إمكانات متكاملة في تصميم الواجهات وبعضها يسمح بمشاركتها مباشرة مع باقي أعضاء الفريق لمناقشتها وتحديثها مباشرة، بينما البعض الآخر تقليدي للغاية حيث يجب أن تصمم الواجهات يدويًا من البداية ومن ثم إرسال النماذج إلى باقي أعضاء الفريق، وفي أحيان كثيرة يحتاج المصمم إلى استخدام أكثر من برنامج وتطبيق ومنصة لإتمام المهمة على أكمل وجه. أدوبي فوتوشوب أشهر برنامج للتصميم ومعالجة الصور وأكثرها شيوعًا، يمكن استخدامه لتصميم واجهات مواقع الويب أو حتى التطبيقات حيث يحتوي على أدوات الشرائح الخاصة بتقسيم وتقطيع التصميم إلى شرائح بحسب العناصر المرسومة، ومن ثم تصدّر هذه الشرائح إلى ملفات صور مستقلة لكل عنصر بتنسيق PNG لضمان خاصية الشفافية في حال تواجدها ضمن الشريحة المصدّرة، ليتمكن المطور من استخدام هذه العناصر معًا وتركيبها لإنشاء الواجهة أو التطبيق. ويمكن استخدامه لمعالجة الصور المستخدمة في التصميم أو لإنشاء عناصر أخرى كالأزرار أو الخلفيات أو أشكال القوائم وغيرها. أدوبي إليستريتور بسبب تخصصه في إنشاء الرسومات الشعاعية، فإنه البرنامج الأقوى والأنسب لإنشاء عناصر مميزة شعاعية متجاوبة التصميم لكل أجزاء وأنواع التصاميم مثل القوائم والأزرار والنماذج والرسوميات والأيقونات وغيرها. كما يمكن استخدامه لإنشاء تصاميم النماذج الأولية للمشاريع بتقنية الإطار الشبكي (Wireframe)، حيث تساعد أدواته القوية على إنشاء هذه التصاميم بسهولة وسرعة. Sketch سكتش برنامج مميز ومتخصص في إنشاء وتصميم الواجهات عالية الدقة بكل أنواعها ويعد من أقوى البرامج في هذا المجال، حيث يتضمن قوالب جاهزة للمساعدة في إنشاء هذه التصاميم، كما يتضمن إعدادات مخصصة جاهزة بحسب قياسات مختلف الأجهزة لتصميم التطبيقات والويب. لعل أبرز عيوبه هو أنه برنامج مخصص للعمل على نظام واحد فقط وهو ماكنتوش العامل على حواسيب آبل بينما لا تتوفر منه نسخ تعمل على ويندوز أو لينكس. Adobe X D يوفر أدوبي إكس دي أفضل بيئة للمشاريع الرقمية ضمن مجموعة Adobe Creative Cloud لأدوات تصميم الواجهات. لا تشبه واجهة هذا البرنامج واجهات بقية برامج أدوبي مثل الفوتوشوب والإليستريتور وغيرها، إلا أنك ستعتاد العمل عليه بسرعة لسهولة استخدامه ووفرة أدواته الخاصة بهذا النوع من التصاميم. Figma تمكنك فيجما من إنشاء واجهات وتصميمها بسرعة. حيث تفخر منصة Figma بكونها أداة تصميم تعاونية حيث يمكن لعدة مستخدمين العمل في وقت واحد على المشروع نفسه وهذا فعّال للغاية عندما يكون لديك العديد من أصحاب العلاقة في المشروع ذاته يشاركون في تشكيل النتيجة مثل المصممين والمطورين والمدراء، ولذلك هي أداة مثالية عندما تعمل على مشروع واحد بالاشتراك مع مصمم ومطور وكاتب محتوى في نفس الوقت. Balsamiq بالساميق أداة مميزة وقوية إنشاء نماذج الإطار الشبكي Wireframe حيث يمكنك تطوير البنية والتخطيطات لمشاريعك بسهولة، وتعمل عناصر السحب والإفلات على تسهيل الاستخدام ويمكنك ربط الأزرار بصفحات أخرى. هذا يعني أنه يمكنك البدء بسرعة في تخطيط واجهاتك ومن ثم مشاركتها مع فريقك أو عملائك. Zeplin مع أن زيبلن أداة جيدة لإنتاج النماذج الأولية، إلا أنه يناسب إلى حد كبير مرحلة ما بعد التصميم وما قبل التطوير جنبًا إلى جنب مع النماذج الأولية. يمكّنك تسليم التصميم والنماذج الأولية للمطورين والتأكد من تنفيذ أفكارك بطريقة جيدة. وتستطيع مشاركة ملفات سكتش Sketch و فوتوشوب Photoshop وملفات X D و فيجما Figma إلى زيبلن لاستحداث بيئة للمطورين والمصممين للعمل على المشروع معًا ومن ثم تسليمه دون الحاجة إلى إنشاء الإرشادات واستعمال وسائل التواصل المختلفة. InVision إن فيجين هو أداة تساعد في إنشاء واجهات تفاعلية جميلة مع مجموعة كبيرة من الميزات حيث يمكنك إنشاء حركات وانتقالات مخصصة من عدد من الإيماءات والتفاعلات. وبفضل هذه الأداة يمكنك التوقف عن التفكير في إنشاء العديد من النماذج لأجهزة متعددة لأنه يمكن تحقيق التصميم سريع الاستجابة داخل لوح رسم واحد. خاتمة على الرغم من أنه يجب عليك دائمًا اتخاذ قرارات قائمة على رؤيتك وخبرتك وذوقك الفني، إلا أن اتباع مجموعة من القواعد والإرشادات سيوجهك في الاتجاه الصحيح ويسمح لك باكتشاف مشاكل الاستخدام الرئيسية في وقت مبكر من عملية التصميم. تنطبق هذه القواعد على معظم واجهات المستخدم، كما تكفي مجموعة الأدوات التي ذكرناها لإنشاء تصاميم متكاملة على الرغم من وجود المزيد من التطبيقات والأدوات خارج هذه القائمة إلا أن ما ذكرناه في هذا المقال أكثر من كافٍ. والأهم هو التعاون بين أعضاء الفريق واتباع خطوات العمل لإتمام عملية التصميم وتسليم المشروع إلى العميل.
    1 نقطة
  8. تُستخدم الشبكات العصبية كوسيلةٍ للتعلم العميق، فهي واحدةٌ من المجالات الفرعية العديدة لطُرق تطبيق الذكاء الصناعي. وقد اقْتُرحت لأول مرةٍ منذ حوالي 70 عامًا في محاولةٍ لمحاكاة طريقة عمل دماغ الإنسان، إلا أنها أبسط بكثيرٍ من الخلايا العصبية الحقيقة، إذ أن كلّ خليةٍ اصطناعيةٍ مرتبطةٌ بعِدة طبقاتٍ، ولكلّ واحدةٍ منها وزنٌ مُعينٌ يُعبر عن أهمية هذه الطبقة، وذلك لتحديد كيفية استجابة الخلية العصبية عند نشْر البيانات عبرها، وبينما كانت الشبكات العصبية سابقًا محدودةً في عدد الخلايا العصبية التي تستطيع محاكاتها في ذلك الوقت -وهو الأمر الذي انعكس بدوره على تعقيد عملية التعلم التي يمكننا تحقيقها-، إلا أنه في السنوات الأخيرة، ونظرًا للتقدم الكبير في تطوّر الأجهزة، استطعنا أخيرًا بناء شبكاتٍ عصبيةٍ عميقةٍ جدًا، وتدريبها على مجموعات بياناتٍ هائلةٍ وضخمة كذلك، مما أدّى إلى تحقيق قفزاتٍ نوعية في تطور الذكاء الاصطناعي وتحديدًا تعلم الآلة. سمحت تلك القفزات النوعية للآلات بمُقاربة قدرات البشر، بل وتجاوزتها في أداء بعض المهام المحدودة. ومن بين هذه المهام، قدرتها على التعرف على الكائنات، فعلى الرغم من أن الآلات كانت غير قادرة تاريخيًا على منافسة قوة الرؤية البشرية، إلا أنّ التطورات الحديثة في التعلم العميق جعلت من الممكن بناء شبكاتٍ عصبيةٍ باستطاعتها التعرف على الكائنات والوجوه والنصوص، بل وحتى العواطف! سنُطبق في هذا المقال قِسمًا فرعيًا صغيرًا من طُرق التعرف على الكائنات، وتحديدًا التعرف على الأرقام المكتوبة بخط اليد، وذلك باستخدام مكتبة TensorFlow، وهي مكتبة بايثون مفتوحة المصدر التي طُوّرت في مختبرات غوغل Google Brain لأبحاث التعلم العميق، كما أنها من أشهر المكتبات الحالية في التعلم العميق، وسنأخذ صورًا مكتوبٌ عليها الأرقام بخط اليد من الرقم 0 وحتى الرقم 9، وسنبني شبكةً عصبيةً وندربها لكي تتعرف على التصنيف المناسب لكل رقمٍ معروضٍ في الصورة وتتنبأ به، ثم تَنسْبه لصنفٍ من أصناف الأرقام الموجودة. سنفترض إلمامك بمصطلحات ومفاهيم تعلم الآلة، مثل التدريب والاختبار والميزات والأصناف والتحسين والتقييم. لهذا لن تحتاج لخبرةٍ سابقةٍ في مجال التعلم العميق التطبيقي أو بمكتبة TensorFlow، ولمتابعة وفَهم هذا المقال جيدًا ننصحك أولًا بالاطلاع على: المفاهيم الأساسية لتعلم الآلة. المتطلبات الرئيسية لإكمال هذا المقال ستحتاج بيئةً برمجيةً للغة بايثون الإصدار 3.8 سواءً كان محليًا أو بعيدًا. ويجب أن تتضمن هذه البيئة البرمجية مدير الحِزم pip لتثبيت الحِزم، ومُنشئ البيئات الافتراضية venv لإنشاء بيئاتٍ افتراضيةٍ. 1. إعداد المشروع ستحتاج أولًا لتثبيت بعض التبعيات، وذلك لإنشاء مساحة عملٍ للاحتفاظ بملفاتنا قبل أن نتمكن من تطوير برنامج التعرف على الصور، وسنستخدم بيئة بايثون 3.8 الافتراضية لإدارة التبعيات الخاصة بمشروعنا. سَنُنشئ مجلدًا جديدًا خاصًا بمشروعنا وسندخل إليه هكذا: mkdir tensorflow-demo cd tensorflow-demo سننفذّ الأوامر التالية لإنشاء البيئة الافتراضية: python -m venv tensorflow-demo ومن ثم الامر التالي في Linux لتنشيط البيئة الافتراضية: source tensorflow-demo/bin/activate أما في Windows، فيكون أمر التنشيط: "tensorflow-demo/Scripts/activate.bat" بعد ذلك، سنُثبتّ المكتبات التي سنستخدمها. سنستخدم إصداراتٍ محددةٍ من هذه المكتبات، من خلال إنشاء ملف requirements.txt في مجلد المشروع، وسيُحدِّد هذا الملف المتطلبات والإصدارات التي سنحتاج إليها. نفتح الملف requirements.txt في محرر النصوص، ونُضيف الأسطر التالية، وذلك لتحديد المكتبات التي نريدها وإصداراتها: keras==2.6.0 numpy==1.19.5 Pillow==8.4.0 scikit-learn==1.0 scipy==1.7.1 sklearn==0.0 tensorflow==2.6.0 سنحفظ التغييرات التي طرأت على الملف وسنخرج من محرر النصوص، ثم سنُثَبت هذه المكتبات بالأمر التالي: (tensorflow-demo) $ pip install -r requirements.txt بعد تثبيتنا لهذه التبعيات، سنُصبح جاهزين لبدء العمل على مشروعنا. 2. استيراد مجموعة بيانات MNIST تُسمى مجموعة البيانات التي سنستخدمها، بمجموعة بيانات MNIST، وهي مجموعةٌ كلاسيكيةٌ في مجتمع مُطوري تعلم الآلة، وتتكون من صورٍ لأرقامٍ مكتوبةٍ بخط اليد، بحجم 28×28 بكسل. ونستعرض فيما يلي بعض الأمثلة للأرقام المُتضمنة فيها: لاحظ أنه ينبغي أن نستخدم ملفًا واحدًا لجميع أعمالنا في هذا المقال، ولنُنشئ برنامج بايثون يتعامل مع مجموعة البيانات هذه، سننشئ ملفًا جديدًا باسم main.py، وسنفتح هذا الملف بأي محرر شيفرات لدينا -مثل VS code- وسنُضيف هذه الأسطر البرمجية لاستيراد المكتبات اللازمة: import tensorflow as tf import numpy as np from sklearn.preprocessing import OneHotEncoder #مكتبة معالجة الصور from PIL import Image #التوافقية مع إصدار سابق tf.compat.v1.disable_v2_behavior() وسنضيف أيضًا هذه الأسطر من الشيفرات البرمجية لملفك لاستيراد مجموعة بيانات MNIST وذلك باختيار صور التدريب المتاحة من Tensorflow ومن ثم نُنزلها ونقسمها إلى جزئين: الأول للتدريب والثاني للاختبار: #اختيار بيانات التدريب mnist = tf.keras.datasets.mnist #تنزيل بيانات التدريب والاختبار (x_train, y_train), (x_test, y_test) = mnist.load_data() #طباعة عدد بيانات التدريب والاختبار print (len(x_train)) print (len(x_test)) #تحجيم البيانات بين 0 و 1 x_train, x_test = x_train / 255.0, x_test / 255.0 #الترميز الأحادي النشط y_train = [[i] for i in y_train] y_test = [[i] for i in y_test] enc = OneHotEncoder(sparse=True) enc.fit(y_train) y_train = enc.transform(y_train) y_test = enc.transform(y_test) تقوم الدالة 'mnist.load_data' بتنزيل البيانات وتقسيمها إلى مجموعتين واحدة للتدريب (60000 صورة) والمجموعة الثانية للاختبار (10000 صورة). وعند قراءة البيانات سنستخدم الترميز الأحادي النشط One-Hot Encoding لتمثيل التصنيفات للصور. حيث يَستَخدم الترميز الأحادي النشط One-Hot Encoding متجهًا vector مُكونٌ من قيمٍ ثنائيةٍ لتمثيل القيم الرقمية أو الصنفية. ونظرًا لأن أصنافنا مخصصةٌ لتمثيل الأرقام من 0 إلى 9، فإن المتجه سيحتوي على 10 قيمٍ، واحدةٌ لكلّ رقمٍ ممكنٍ. وتُسنَد إحدى هذه القيم بوضع القيمة 1، وذلك لتمثيل الرقم في هذا المؤشر للمتجه، كما ستُسنَد القيم الباقية بالقيمة 0. فمثلًا، سيُمثلُ الرقم 3 من خلال المتجه هكذا: [‎0 ،0 ،0 ،1 ،0 ،0 ،0 ،0 ،0 ،0]. وسنلاحظ وجود القيمة 1 في الفهرس 3، لذلك فإن المتجه سيُمثِلُ الرقم 3. ولتمثيل الصور الفعلية والتي تكون بحجم 28x28 بكسل، يتوجب علينا تسويتها في المتجه 1D بحجم 784 بكسل، وهو ناتج ضرب 28×28. وسنخزن هذه البكسلات والتي ستُشكل الصورة لاحقًا، وذلك في قيمٍ تتراوح بين 0 و255، حيث ستحدّد هذه القيم تدرج اللون الرمادي للبكسل، وستُعرَض صورنا باللونين الأبيض والأسود فقط. لذلك سيُمثلُ البكسل الأسود بالقيمة 255، والبكسل الأبيض بالقيمة 0، وذلك مع التدرجات المختلفة للون الرمادي بينهم. والآن بعد استيرادنا للبيانات، حان الوقت للتفكير في كيفية بناء الشبكة العصبية. 3. تحديد بنية الشبكة العصبية يُشير مصطلح بنية الشبكة العصبية لعناصرٍ متنوعةٍ، مثل عدد الطبقات في الشبكة وعدد الوِحدات في كلّ طبقةٍ، كما يشير إلى كيفية توصيل هذه الوِحدات بين الطبقات المختلفة. ونظرًا لأن الشبكات العصبية مستوحاةٌ من كيفية عمل الدماغ البشري، فسنستخدم مصطلح الوِحدة ليُمثّل ما يُمكن تسميته بيولوجيًا بالخلايا العصبية. تأخذ الوِحدات بعض القيم من الوِحدات السابقة مثل مُدخلاتٍ لها، حيث تتشابه مع الخلايا العصبية التي تُمرر إشاراتها حول الدماغ، ثمّ تُجري عمليةً حسابيةً، وتُمرر القيمة الجديدة مثل مُخرجاتٍ إلى وِحداتٍ أخرى، وهكذا. تُوضع هذه الوِحدات على شكل طبقاتٍ متراكبةٍ فوق بعضها البعض مشكّلةً الشبكة العصبية، بحيث يمكن للشبكة أن تتألف كحدٍ أدنى من طبقتين، طبقةٌ لإدخال القيم، وطبقةٌ أخرى لإخراج القيم. يُستخدم مصطلح الطبقة المخفية لجميع الطبقات الموجودة بين طبقات المُدخلات وطبقات المُخرجات الخارجية، أي أن تلك الطبقات تكون مخفيةً عن العالم الحقيقي. تحقق البُنى المختلفة للشبكة نتائجًا مختلفةً عن بعضها البعض، ويمكن اتخاذ الأداء مثل معيارٍ للحكم على هذه البُنى المختلفة، كما يمكن اتخاذ عناصر أخرى معيارًا للحكم، مثل الوسطاء والبيانات ومدة التدريب. سنضيف هذه الأسطر البرمجية التالية لملفك، وذلك لتخزين عدد الوِحدات المُخصصة لكلّ طبقةٍ ووضعها في متغيّراتٍ عامةٍ. وهذه الطريقة ستسمح لنا بتغيير بِنية الشبكة بمكانٍ واحدٍ، وفي نهاية هذا المقال يمكنك اختبار مدى تأثير الأعداد المختلفة من الطبقات والوِحدات على نتائج نموذجنا: n_input = 784 # input layer (28x28 pixels) n_hidden1 = 512 # 1st hidden layer n_hidden2 = 256 # 2nd hidden layer n_hidden3 = 128 # 3rd hidden layer n_output = 10 # output layer (0-9 digits) يُوضح الرسم البياني التالي تصورًا للبِنية التي صمّمناها، مع توصيل كلّ طبقةٍ بالطبقات المحيطة بها توصيلًا كاملًا: ويرتبط مصطلح الشبكة العصبية العميقة Deep Neural Network بعدد الطبقات المخفية، وعادةً ما تُشير كلمة السطحية في مصطلح الشبكة العصبية السطحية إلى وجود طبقةٍ مخفيةٍ واحدةٍ، بينما تُشير كلمة العميقة إلى وجود طبقاتٍ مخفيةٍ متعددةٍ. ونظريًا إذا أُعطِيت الشبكة العصبية السطحية ما يكفي من بياناتٍ للتدريب، فيجب أن تَقدِر على تمثيل أي وظيفةٍ يمكن للشبكة العصبية العميقة أن تؤدّيها. ولكن من ناحية الفعالية الحسابية، فغالبًا ما يكون نتائج استخدام شبكةٍ عصبيةٍ عميقةٍ ذات حجمٍ صغيرٍ أفضل من النتائج التي تُعطيها الشبكة العصبية السطحية ذات العدد الكبير من الوِحدات المخفية، وذلك عند تأديتهم لنفس المَهمة. كما أن الشبكات العصبية السطحية غالبًا ما تواجه مشكلة فَرط التخصيص Overfitting، إذ يكون هدف الشبكة الأساسي هو حفظ بيانات التدريب التي شاهدتها، ولكنها لن تستطيع تعميم المعرفة التي اكتسبتها على البيانات الجديدة، وهذا هو السبب في كون استخدام الشبكات العصبية العميقة أكثر شيوعًا، إذ أنها تسمح للطبقات المتعددة الموجودة بين البيانات المُدخلة الأولية والبيانات المُصنفة الناتجة، بتعلم الميزات على مستوياتٍ متنوعةٍ، مما يُعزز قدرة الشبكة على التعلم وتعميم الفكرة. ومن العناصر الأخرى للشبكة العصبية التي يجب تعريفها هنا هي الوسطاء الفائقة Hyperparameters، فعلى عكس الوسطاء العادية التي تُحدث قيمها أثناء عملية التدريب، سنُسند قيم الوسطاء الفائقة في البداية وسنثبتها طوال العملية. أسنِد المتغيّرات بالقيم التالية في ملفك: learning_rate = 1e-4 n_iterations = 1000 batch_size = 128 dropout = 0.5 يمثل معدل التعلم Learning Rate مدى تعديل الوسطاء في كلّ خطوةٍ من عملية التعلّم، إذ تُعَد هذه التعديلات مكونًا رئيسيًا للتدريب، فبعد كلّ عملية مرور ٍعبر الشبكة، سنضبط أوزان الطبقات قليلًا لأهمية ذلك في محاولةٍ لتقليل الخسارة، حيث يمكن لمعدل التعلم المرتفع أن يتحقق بسرعة، ولكن يمكن كذلك أن تتجاوز القيم المثلى عند تحديثها في كلّ مرة. يشير مصطلح عدد التكرارات Number Of Iterations إلى عدد مرات مرورنا على خطوة التدريب، ويشير حجم الدفعة Batch Size لعدد أمثلة التدريب التي نستخدمها في كل خطوة، كما ويمثل المتغير dropout الموضع الذي نحذف عنده بعضًا من الوِحدات عشوائيًا. وسنستخدم المتغير dropout في الطبقة النهائية المخفية لإعطاء كلّ وِحدة من الوحدات احتمالًا بنسبة 50٪ للتخلص منها في كلّ خطوة تدريبٍ، وهذا سيساعد على منع ظهور مشكلة فرط التخصيص Overfitting. حددنا الآن بِنية شبكتنا العصبية والوسطاء الفائقة التي ستُؤثر على عملية التعلّم، والخطوة التالية هي بناء الشبكة مثل مخططٍ بيانيٍ من خلال مكتبة TensorFlow. 4. بناء مخطط بياني من خلال مكتبة TensorFlow لبناء شبكتنا، لابد لنا من إعداد الشبكة مثل مخططٍ بيانيٍ حسابي من خلال مكتبة TensorFlow لتنفيذه. والمفهوم الأساسي لمكتبة TensorFlow هو tensor، وهو بنية بياناتٍ مشابهةٍ لبِنية المصفوفة Array، أو القائمة List. وهذا المتغير سيهيَأ ويُعالَج عند مروره عبر المخطط البياني للشبكة عبر عملية التعلّم. وسنبدأ بتحديد ثلاثة متغيراتٍ tensors من نوع placeholders، وهو نوع tensor تُسندُ قيمته لاحقًا. والآن سنضيف الشيفرة البرمجية التالية إلى الملف الذي نعمل عليه: X = tf.compat.v1.placeholder("float", [None, n_input]) Y = tf.compat.v1.placeholder("float", [None, n_output]) keep_prob = tf.compat.v1.placeholder(tf.float32) إنّ الوسيط الوحيد الذي يتوجب علينا تحديده عند التعريف هو حجم البيانات التي سنُسندها لاحقًا، وبالنسبة للمتغير X سنستخدم شكل [None، 784]، إذ ستمثل القيمة None كميةً غير محددةٍ، وسنُسند كميةً غير محددةٍ من الصور ذات حجم 784 بكسل. بحيث يصبح شكل المتغير Y هو [None، 10]، وستمثل None عددًا غير محددٍ من التصنيفات الناتجة، مع وجود 10 أصنافٍ محتملةٍ. وسنستخدم في المتغير keep_prob tensor من نوع placeholders للتحكم في معدل dropout، وسنجعله من نوع placeholders وذلك لجعله متغيرًا من نوعٍ قابلٍ للتعديل، بدلًا من كونه متغيرًا من نوعٍ غير قابلٍ للتعديل immutable variable، وذلك لأننا نريد استخدام نفس tensor التدريب عند إسناد dropout بالقيمة 0.5، ونفس tensor الاختبار عند إسناد dropout بالقيمة 1.0. والوسطاء التي ستُحدث قيمها الشبكة العصبية في عملية التدريب هي القيم الخاصة بوزن كلّ طبقةٍ، والتي تُعبر عن الأهمية وقيم التحيز bias values، لذلك سنحتاج لإسنادهم بقيمٍ إبتدائيةٍ بدلًا من قيمٍ فارغةٍ. وهذه القيم هي الأساس الذي ستبدأ الشبكة رحلة التعلم انطلاقًا منها، إذ ستُستخدم في تفعيل دوال الشبكة العصبية، والتي تُمثِلُ قوة الاتصالات بين الوِحدات. ونظرًا لاستمرار تحسين القيم أثناء عملية التدريب، يمكننا ضبطها حاليًا بالقيمة 0. لاحظ أن القيمة الأولية في الواقع لها تأثيرٌ كبيرٌ على الدقة النهائية للنموذج. وسنستخدم التوزيع الاحتمالي الطبيعي المنقطع Truncated normal distribution لتوليد قيمٍ عشوائيةٍ لأوزان الطبقات، بحيث يكونون قريبين من الصفر حتى يتمكنوا من التعديل إما باتجاهٍ إيجابيٍ أو سلبيٍ، كما يكونون مختلفين قليلًا، وذلك ليُنتِجوا أخطاءً مختلفةً، وبهذه الطريقة سنضمن بأن يتعلم النموذج شيئًا مفيدًا. والآن سنضيف هذه الأسطر البرمجية التالية لملفنا الذي نعمل عليه: weights = { 'w1': tf.Variable(tf.random.truncated_normal([n_input, n_hidden1], stddev=0.1)), 'w2': tf.Variable(tf.random.truncated_normal([n_hidden1, n_hidden2], stddev=0.1)), 'w3': tf.Variable(tf.random.truncated_normal([n_hidden2, n_hidden3], stddev=0.1)), 'out': tf.Variable(tf.random.truncated_normal([n_hidden3, n_output], stddev=0.1)), } بالنسبة للتحيز Bais، سنستخدم قيمةً ثابتةً صغيرةً لضمان تنشيط جميع tensors المراحل الأولية، وبالتالي المساهمة في الانتشار. وستُخزن الأوزان وجميع tensors التحيزات في objects قواميس Dictionary لسهولة الوصول إليها. أضف هذه الشيفرة البرمجية للملف الذي نعمل عليه وذلك لتعريف التحيز وقِيَمه: biases = { 'b1': tf.Variable(tf.constant(0.1, shape=[n_hidden1])), 'b2': tf.Variable(tf.constant(0.1, shape=[n_hidden2])), 'b3': tf.Variable(tf.constant(0.1, shape=[n_hidden3])), 'out': tf.Variable(tf.constant(0.1, shape=[n_output])) } والآن جهّز طبقات الشبكة العصبية من خلال تعريف العمليات التي ستتعامل مع tensors المرحلة الحالية. وأضف هذه الشيفرة البرمجية للملف الذي نعمل عليه: layer_1 = tf.add(tf.matmul(X, weights['w1']), biases['b1']) layer_2 = tf.add(tf.matmul(layer_1, weights['w2']), biases['b2']) layer_3 = tf.add(tf.matmul(layer_2, weights['w3']), biases['b3']) layer_drop = tf.nn.dropout(layer_3, keep_prob) output_layer = tf.matmul(layer_3, weights['out']) + biases['out'] ستنفذ كلّ طبقةٍ مخفيةٍ عملية ضربٍ للمصفوفة على نتائج الطبقة التي سبقتها وعلى أوزان الطبقة الحالية، وسيُضاف التحيز لهذه القيم. في الطبقة المخفية الأخيرة، سنُطبِّق عملية التسرب dropout بالقيمة 0.5 للمتغير Keep_prob الخاص بنا. الخطوة الأخيرة في بناء المخطط البياني، هي تحديد دالة الخسارة التي نريد تحسينها. والاختيار الشائع لدالة الخسارة في المكتبة البرمجية TensorFlow هو الانتروبي المشترك Joint Antropy، والمعروف كذلك باسم فقدان السجل log-loss، وهو الذي يُحدد الفرق بين التوزيعين الاحتماليين لكلً من التنبؤات والتصنيف. ويمكن أن تكون قيمة الانتروبي المشترك 0، وذلك في أفضل الأحوال عند التصنيف المثالي، وذلك مع انعدام الخسارة تمامًا. سنحتاج كذلك إلى اختيار خوارزمية التحسين المناسبة، والتي سنستخدمها لتقليل الناتج من دالة الخسارة. وتُسمى هذه العملية بعملية تحسين الانحدار التدريجي، وهي طريقةٌ شائعةٌ للعثور على الحد الأدنى للدالة، من خلال اتخاذ خطواتٍ تكراريةٍ على طول التدرج في الاتجاه السلبي التنازلي. وهناك العديد من الخيارات لخوارزميات تحسين الانحدار التدريجي المُطبقة في المكتبة البرمجية TensorFlow، إلا أننا سنستخدم في هذا المقال خوارزمية المُحسِّن أدم Adam optimizer، الذي يعمتد على عملية تحسين الانحدار التدريجي باستخدام الزخم أو كمية الحركة Momentum، وذلك بتسريع عملية التنعيم من خلال حساب متوسط ٍمُرجَّحٍ بكثرة للتدرجات، واستخدام ذلك في التعديلات مما يؤدي لتقاربٍ أسرع. وسنضيف هذه الشيفرة للملف الذي نعمل عليه: cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits( labels=Y, logits=output_layer )) train_step = tf.compat.v1.train.AdamOptimizer(1e-4).minimize(cross_entropy) عرّفنا حتى الآن الشبكة وبنيناها باستخدام المكتبة البرمجية TensorFlow، والخطوة التالية هي إرسال البيانات عبر المخطط البياني لتدريبها، ومن ثَمّ اختبارها للتحقق فيما إن كانت تعلمت شيئًا بالفعل أم لا. 5. التدريب والاختبار تتضمن عملية التدريب تغذية المخطط البياني للشبكة بمجموعة بيانات التدريب، وتحسين نتيجة دالة الخسارة، إذ أن في كلّ مرةٍ تمر فيها الشبكة عبر مجموعةٍ إضافيةٍ من صور التدريب، فستُحدثُ الوسطاء لتقليل الخسارة، وذلك بهدف تحسين دقة التنبؤ للأرقامٍ؛ أما عملية الاختبار، فتتضمن تشغيل مجموعة بيانات الاختبار الخاصة بنا عبر المخطط البياني المدرّب، كما ستتتبع عدد الصور التي صح التنبؤ بها، حتى نحسب الدقة جيدًا. قبل البدء في عملية التدريب، سوف نحدد دالة تقييم الدقة لكي نتمكن من طباعتها على مجموعاتٍ صغيرةٍ من البيانات أثناء التدريب. هذه البيانات المطبوعة ستسمح لنا بالتحقق من انخفاض الخسارة وزيادة الدقة، وذلك بدءًا من المرور الأول عبر المخطط البياني، وحتى المرور الأخير؛ كما ستسمح لنا بتتبّع ما إذا نفذنا عمليات مرور ٍكافيةً عبر المخطط البياني للوصول لنتيجةٍ مناسبةٍ ومثاليةٍ أم لا: correct_pred = tf.equal(tf.argmax(output_layer, 1), tf.argmax(Y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) سنستخدم الدالة arg_max في المتغيّر right_pred للموازنة بين الصور التي صَحَ توقُّعها، وذلك بالنظر لقيمة التنبؤات output_layer والتصنيفات Y، وسنستخدم الدالة equal لإعادة هذه النتائج مثل قائمةٍ مؤلفةٍ من قيمٍ بوليانيةٍ. ويمكننا بعد ذلك تحويل هذه القائمة للنوع float، وذلك لحساب المتوسط للحصول على درجة الدقة الإجمالية. الآن نحن جاهزون لتهيئة الجلسة لتشغيل المخطط البياني، إذ سنرسل للشبكة أمثلة التدريب الخاصة بنا، وبمجرد انتهاء التدريب، سنرسل أمثلة اختبارٍ جديدةٍ عبر المخطط البياني نفسه لتحديد دقة النموذج. أضف هذه الشيفرة للملف الذي نعمل عليه: init = tf.compat.v1.global_variables_initializer() sess = tf.compat.v1.Session() sess.run(init) إن جوهر عملية التدريب في التعلم العميق هو تحسين ناتج دالة الخسارة. ونحن هنا سنهدف إلى تقليل الفرق بين التصنيفات المُتوقعة للصور والتصنيفات الحقيقية لها. وستتضمن هذه العملية أربع خطواتٍ تتكرر لعددٍ محددٍ من مرات المرور عبر المخطط البياني، وهي: دفع القيم إلى الأمام عبر الشبكة. حساب الخسارة. دفع القيم للخلف عبر الشبكة. تحديث الوسطاء. ففي كلّ خطوة تدريب، سنعدِّل الوسطاء قليلًا في محاولةٍ لتقليل نتائج دالة الخسارة. وفي الخطوة التالية مع تَقدُّم عملية التعلّم، يجب أن نشاهد انخفاضًا في الخسارة، حيث سنوقِف التدريب في النهاية، وسنستخدم الشبكة مثل نموذجٍ لاختبار بياناتنا الجديدة. سنضيف هذه الشيفرة البرمجية للملف الذي نعمل عليه: # التدريب على دفعات صغيرة for i in range(n_iterations): startbatch = (i*batch_size) % len(x_train) endbatch = ((i+1)*batch_size) % len(x_train) batch_x = np.array(x_train[startbatch:endbatch]) batch_x = batch_x.reshape(batch_size, -1) batch_y = y_train[startbatch:endbatch].toarray() if batch_x.shape != (128, 784): continue sess.run(train_step, feed_dict={ X: batch_x, Y: (batch_y), keep_prob: dropout }) # طباعة الخسارة والدقة لكل دفعة صغيرة if i % 100 == 0: minibatch_loss, minibatch_accuracy = sess.run( [cross_entropy, accuracy], feed_dict={X: batch_x, Y: batch_y, keep_prob: 1.0} ) print( "Iteration", str(i), "\t| Loss =", str(minibatch_loss), "\t| Accuracy =", str(minibatch_accuracy) ) بعد 100 عملية مرورٍ لكلّ خطوة تدريبٍ والتي أرسلنا فيها مجموعةً صغيرةً من الصور عبر الشبكة، سنطبع نتائج دالة الخسارة والدقة لتلك الدفعة. وينبغي ألّا نتوقع هنا انخفاض معدل الخسارة وزيادة الدقة، لأن القيم لكل دفعةٍ صغيرةٍ. إذ أن النتائج ليست للنموذج بأكمله. فنحن نستخدم مجموعاتٍ صغيرةٍ من الصور بدلًا من إرسال كلّ صورةٍ بمفردها، وذلك لتسريع عملية التدريب والسماح للشبكة برؤية عددٍ من الأمثلة المختلفة قبل تحديث الوسطاء. وبمجرد اكتمال التدريب، يمكننا تشغيل الجلسة على الصور المخصصة للاختبار. وهذه المرة سنستخدم القيمة 1.0 مثل مُعدلِ تَسرّب dropout للمتغيّر Keep_prob، وذلك للتأكد من أن جميع الوِحدات نشطةٌ في عملية الاختبار. أضف هذه الشيفرة البرمجية للملف الذي نعمل عليه: إعداد صور الاختبار كمتجهات أحادية طول كل منها 28*28 # x_test = x_test.reshape(-1,784) test_accuracy = sess.run(accuracy, feed_dict={X: x_test, Y: y_test.toarray(), keep_prob: 1.0}) print("\nAccuracy on test set:", test_accuracy) والآن سنشغّل برنامجنا، لنعرف مدى دقة شبكتنا العصبية في التعرف على الأرقام المكتوبة بخط اليد. وسنحفظ التغييرات في الملف main.py الذي نعمل عليه. نَفِّذ الأمر التالي في الوِحدة الطرفية لتنفيذ الشيفرة البرمجية: (tensorflow-demo) $ python main.py سترى نتيجةً مشابهةً لما يلي، ويمكن أن تختلف قليلًا نتائج الخسارة والدقة الفردية: Iteration 0 | Loss = 3.67079 | Accuracy = 0.140625 Iteration 100 | Loss = 0.492122 | Accuracy = 0.84375 Iteration 200 | Loss = 0.421595 | Accuracy = 0.882812 Iteration 300 | Loss = 0.307726 | Accuracy = 0.921875 Iteration 400 | Loss = 0.392948 | Accuracy = 0.882812 Iteration 500 | Loss = 0.371461 | Accuracy = 0.90625 Iteration 600 | Loss = 0.378425 | Accuracy = 0.882812 Iteration 700 | Loss = 0.338605 | Accuracy = 0.914062 Iteration 800 | Loss = 0.379697 | Accuracy = 0.875 Iteration 900 | Loss = 0.444303 | Accuracy = 0.90625 Accuracy on test set: 0.9206 ولمحاولة تحسين دقة نموذجنا، أو لمعرفة المزيد حول تأثير ضبط الوسطاء الفائقة hyperparameters، يمكننا تغييرها لاختبار تأثيرها المنعكس على معدّل التعلم وعتبة التسرب Dropout Threshold، وكذا حجم الدفعة من الصور في كمية الأمثلة وعدد مرات المرور عبر المخطط، كما يمكننا كذلك تغيير عدد الوِحدات في طبقاتنا المخفية وتغيير عدد الطبقات المخفية نفسها، وذلك لنرى كيف ستؤثر بنية الشبكة العصبية على النموذج سواءً بزيادة دقته أو بتخفيضها. وللتأكد من أن الشبكة تتعرف جيدًا على الصور المكتوبة بخط اليد، فسنختبرها على صورةٍ خاصةٍ بنا، فإذا كنت تعمل على جهازك المحلي وترغب في استخدام صورٍ من جهازك، يمكنك استخدام أي محرر رسوماتٍ لإنشاء صورة بأبعاد 28x28 بكسل لأي رقمٍ تريده. مثلًا: نزل الصورة وانقلها إلى مجلد المشروع (تأكد أنها باسم test_image.png أو غير اسمها في الشيفرة) ثم أضف في نهاية الملف main.py هذا السطر البرمجي التالي لتحميل صورة الاختبار للرقم المكتوب بخط اليد: img = np.array(Image.open("test_image.png").convert('L')).ravel() إن الدالة open من مكتبة الصور Image تحمّل صورة الاختبار مثل مصفوفةٍ رباعية الأبعاد 4D، حيث تحتوي على قنوات الألوان الثلاث الرئيسية RGB بالإضافة إلى الشفافية، ولكن هذا ليس نفس التمثيل الذي استخدمناه سابقًا عند القراءة من مجموعة البيانات باستخدام المكتبة البرمجية TensorFlow، لذلك سنحتاج للقيام ببعض المهام الإضافية ليتناسب تنسيق هذه الصور مع التنسيق الذي سبق واعتمدناه في الخوارزمية. سنستخدم الدالة convert مع الوسيط L لتقليل تمثيل 4D RGBA إلى قناة لونٍ رماديةٍ واحدةٍ، وسنُخزنها على هيئة مصفوفة numpy. وسنستدعي ravel لتسوية المصفوفة. الآن بعد أن صححّنا بنية معلومات الصورة، يمكننا تشغيل الجلسة بنفس الطريقة السابقة، ولكن هذه المرة سنُرسل صورةً واحدةً فقط للاختبار. وسنضيف الشيفرة التالية للملف لاختبار الصورة وطباعة التصنيف الناتج، هكذا: prediction = sess.run(tf.argmax(output_layer, 1), feed_dict={X: [img]}) print ("Prediction for test image:", np.squeeze(prediction)) وتُستدعى الدالة np.squeeze على المتغير prediction ليُعِيد عددًا صحيحًا وفريدًا إلى المصفوفة. وسيتضح من الناتج أن الشبكة العصبية قد تعرفت على الصورة كرقم 4، هكذا: Prediction for test image: 4 يمكنك الآن تجربة عملية اختبار الشبكة باستخدام صورٍ أكثر تعقيدًا مثل الأرقام المتشابهة مع الأرقام الأخرى، أو أرقامٍ مكتوبةٍ بخطٍ سيئٍ أو حتى خاطئةٍ، وذلك لمعرفة وقياس مدى نجاحها. الخلاصة في هذا المقال، نجحنا في تدريب شبكةٍ عصبيةٍ لتصنيف مجموعة بياناتٍ MNIST بدقةٍ تصل إلى 92٪، واختبارها على صورةٍ خاصةٍ بنا، مع العلم بأنه قد تحققت نسبة أعلى في الأبحاث العلمية الحديثة وكانت حوالي 99٪ لنفس الفكرة، وذلك باستخدام بُنىً مختلفةً لشبكةٍ عصبيةٍ ذات تعقيدٍ أكبر، بحيث تتضمن طبقات تلافيفية. وتستخدم تلك الشبكات بِنيةً ثنائية الأبعاد للصورة لتمثيل المحتويات تمثيلًا أفضل من تمثيل نموذجنا السابق، إذ أن نموذجنا يُسوّي كلّ البكسلات في متجهٍ واحدٍ مكوّنٍ من 784 وِحدة. ويمكنك قراءة المزيد على الموقع الرسمي للمكتبة TensorFlow، والاطلاع على الأوراق البحثية التي تُفصِّل أدق النتائج على موقع MNIST. والآن بعد أن تعرفنا على كيفية بناء شبكةٍ عصبيةٍ وتدريبها، يمكنك تجربة هذا التطبيق واستخدامه على بياناتك الخاصة، أو اختبارها على مجموعات بياناتٍ شائعةٍ مختلفةٍ عن تلك التي استخدمناها مثل: مجموعة البيانات من غوغل أو مجموعة البيانات من CIFAR-10، وذلك للتعرف على صورٍ أكثر عموميةٍ وشموليةٍ. ترجمة -وبتصرف- للفصل How To Build a Neural Network to Recognize Handwritten Digits with TensorFlow من كتاب Python Machine Learning Projects لكاتبته Ellie Birbeck يُمكن تنزيل الكود كاملًا من Recognize-Handwritten-Numbers-MNIST-master. اقرأ أيضًا إعداد شبكة عصبية صنعية وتدريبها للتعرف على الوجوه النسخة الكاملة من كتاب مدخل إلى الذكاء الاصطناعي وتعلم الآلة النسخة العربية الكاملة من كتاب البرمجة بلغة بايثون
    1 نقطة
  9. هناك نشاط أو اختبار بلغة بايثون عن تحليل البيانات Data Analysis ارجو المساعدة ممن لديهم الخبرة في المجال
    1 نقطة
  10. واجهت هذا الخطأ Invalid src prop لكنني اتبعت هذا المرجع Invalid src prop في Next.js ولكن تم عرض الخطأ نفسه import Image from 'next/image'; import React, { Component } from 'react'; import logo from '../../public/logo.png'; // import dynamic from "next/dynamic"; // import { Grid} from "semantic-ui-react"; function TopBannerApi(props) { return ( <> <h1>Footer</h1> <p> {props.topbannerresult.map((post) =>( <> <Image src={post.image} alt="test"/> {/* <p>{post.store_name}</p> */} </> ))} </p> </> ) } export default TopBannerApi; module.exports = { reactStrictMode: true, images: { domains: ['dl8mjowvdz1rh.cloudfront.net'], } }
    1 نقطة
  11. السلام عليكم. اريد السؤال عن هل تتوفر api مجانية لتطبيق واتساب لاستخدامها مع لارافل لإرسال الرسائل فقط؟
    1 نقطة
  12. PDO اختصار لـ (PHP Data Objects) في PHP عبارة عن مكتبة تستخدم لتعامل مع عدة أنواع من قواعد البيانات ، وربط PHP في نظام قواعد البيانات ، يعني لنفرض أن لديك مشروع واستخدمت به نظام قواعد بيانات معين ، ولكن مع مرور الزمن كبر حجم المشروع وأصبح كبير جداً والنظام الذي تستخدمه لا يمكنه التعامل مع كبر حجم المشروع، وأردت أن تنقل المشروع لنظام قواعد بيانات يتناسب مع حجم المشروع ، في حالة أنك لم تستخدم PDO سوف تطر لتعديل أسطر البرمجية كثيرة لكن PDO يمكنه من عمل ذلك في تغير سطر برمجي واحد المختص بالاتصال بقاعدة البيانات . نظام PDO يستعمل أسلوب OOP . لتفعيل المكتبة على السيرفر الشخصي على نظام ويندوز تفتح الملف php.ini وتحذف ; التي في أول السطر الذي تحتاجه ;extension=php_pdo_firebird.dll ;extension=php_pdo_mssql.dll extension=php_pdo_mysql.dll extension=php_pdo_oci.dll extension=php_pdo_oci8.dll ;extension=php_pdo_odbc.dll extension=php_pdo_pgsql.dll extension=php_pdo_sqlite.dll ثم تقوم بعمل reset لحفظ التعديلات على السيرفر .
    1 نقطة
  13. كيفية حذف جميع الأصفار المتتالية(leading zeros) في c++ باستخدام الregular expression
    1 نقطة
  14. نقوم أولا بالتعبير عن نمط البحث بإستخدام التعبيرات الإعتيادية (regular expression) حيث أننا نريد حذف رقم صفر فنقوم بكتابة 0 داخل قوس في التعبير, وبما أننا نريد حذف الأصفار المتتالية نقوم بكتابة عﻻمة التتالي وهي رمز + إن كنا نريد أن نحذف الأصفار الموجودة في بداية النص نقوم بكتابة رمز ^ قبل التعبير إن كنا نريد حذف الأصفار الموجودة في نهاية النص نقوم بوضع عﻻمة ال$ في نهاية التعبير في النهاية يُصبح التعبير كما بالشكل التالي "[0]+" /// لمطابقة جميع الأصفار المتتالية سواء في بداية أو نهاية أو منتصف النص "^[0]+" ///لمطابقة الأصفار المتتالية في بداية النص "[0]+$" //لمطابقة الأصفار المتتالية في نهاية النص وبالنسبة لتطبيق ذلك في لغة c++ يجب أوﻻً أن نقوم بإنشاء متغير من نوع regex ليقوم بحفظ التعبير الذي قمنا بتصميمه regex re("^[0]+") ومن ثم نقوم بإستخدام الدالة regex_replace التي تأخذ في أول مُعطى النص الذي نريد تنفيذ التعبير عليه, وفي ثاني معطى التعبير الذي قمنا بإنشاؤه , وفي ثالث مُعطى رقم التعبير إن كنا نمتلك مجموعة مختلفة من التعبيرات regex re("^[0]+"); string s="000sharaf"; cout<<regex_replace(s,re,"");////sharaf
    1 نقطة
  15. مثلما يمكنك إستعمال واحدة من الحزم الجاهزة لذلك , يمكنك بكل حال من الأحوال نمذجة الفكرة و تطبيقها بخصوصية عالية . لنقل أن الفكرة تتبع المنطق التالي : HTML : تعريف عنصر قائمة منسدلة select , تحمل كخيارات مجموعة الدول . بحيث يحمل كل خيار خاصية value بقيمة الرقم الدولي المرافق لهاته الدولة . تعريف حقل إدخال نصي . 2. JS : يجب إضافة حدث عند الكتابة في حقل الإدخال النصي , ففي حالة مطابقة النص المدخل من طرف المستخدم لقيمة خاصية value لخيار ما في القائمة المنسدلة , يتم تحديده تلقائيا . مثال عملي : يمكنك بأي حال من الأحوال طباعة قائمة الدول بأي طريقة , و سيتم إختيار تكرار foreach في لارافيل للقيام بذلك . كما أن تنسيق العنصر يتم بخصوصية عالية , و لذلك سنستخدم صفوف بوتستراب كمثال . لنقم بتعريف الهيكلية التالية : <div class="col-12 d-flex flex-wrap"> <select id="countryList" class="col-lg-3 form-control"> @foreach ($countries as $country) <option value="{{ $country->phonecode }}"> {{ $country->name }} </option> @endforeach </select> <input type="text" id="typeNumber" class="form-control col-lg-9" placeholder="قم بإدخال رقم هاتفك مرفقا بالكود الدولي"> </div> ثم لنقم بإضافة شيفرات الجافاسكربت لتقوم بالوظائف الموصوفة سابقا , و ذلك كالتالي : var typeNumber = document.querySelector('#typeNumber'), countryList = document.querySelector('#countryList'); typeNumber.addEventListener('keypress' , function(){ var countryCode = this.value; if(!! document.querySelector('option[value="' + countryCode + '"]')) { countryList.value = countryCode; } }); أو بسياق الـ jQuery : var typeNumber = $('#typeNumber'), countryList = $('#countryList'); typeNumber.on('keypress' , function(){ var countryCode = $(this).val(); if(!! $('option[value="' + countryCode + '"]')) { countryList.val(countryCode); } }); و بشكل عام , سيمكنك تخصيص منطق عملها وفق احتياجك ووفق ما يلائم فكرتك , كأن تقوم بإعادة تشكيل هيكلية الـ HTML لتتضمن صورة مصغرة للعلم الوطني لكل دولة أو تغير طريقة التحديد لكل عنصر أو أية فكرة أخرى قد يحتاجها أي تعديل . يمكنك التحصل على قائمة بإسم الدولة مرافقا لها رقمها الدولي من هنا .
    1 نقطة
  16. يمكنك برمجة هذه القائمة من خلال وسم select بحيث تقوم بإدخال الدول و مفتاح كل دولة بشكل يدوي إلى قاعدة البيانات و من ثم عرضها في select أو يمكنك استخدام حزمة مثل حزمة composer require pragmarx/countries أو الحزمة التالية https://github.com/TappNetwork/nova-select-country-code
    1 نقطة
  17. يمكنك تحقيق ذلك عن طريق إستخدام المكتبة math في لغة جافا وتحديداً الدالة pow حيث تقوم الدالة math.pow بأخذ معطيان a, b وتقوم بإرجاع ناتج رفع العددa للقوى b فمثلاً math.pow(5,2) سيقوم برفع العدد 5 للقوى 2 مما يعطينا ناتج 25 ويمكن عمل برنامج بسيط من أجل ذلك بالجافا عن طريق الشفرة البرمجية التالية public void main(){ Scanner scan = new Scanner(System.in); int x = scan.nextInt(); int y = scan.nextInt(); System.out.println(math.pow(x,y)); }
    1 نقطة
  18. نقوم بإسناد الخاصية عند إجراء الإتصال: $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); طالما تستخدم PDO للاتصال مع القاعدة، أضف هذا السطر بعد إنشاء الاتصال مباشرة، وسيتم تطبيقه على كل مابعده
    1 نقطة
  19. تحيه طيبه للجميع كيف يمكن تحديد ارتفاع وعرض GridView بشكل تلقائي بدون ان اضع قيم انا ثابته اعتمادنا على شاشة الهاتف مقاساتها. اواجه مشكله انني قمت بتحديد القيم لشاشه هاتف اقوم بالاختبار عليها ولكن المشكله بعد تشغيل التطبيق على هاتف مساحة شاشته مختلفه العناصر صارت مثل الذي تضعها في خانه اكبر منها على سبيل المثال لدي صوره واسفل منها اسم الصوره في الهاتف الجديد النص اصبح مختفي ولو رغبة ان يظهر اقوم بتمرير تلك الصوره الى الاعلى وبعدها يظهر النص من الاسفل بمعنى الخانه اصبحت اصغر والعناصر التي بداخلها اصبحت تتحرك بها هل يوجد حل لتحديد الارتفاع والعرض بشكل تلقائي لحل هذا المشكله؟ مع العلم انني يكت بالاتطلاع على المكتبه التاليه https://pub.dev/packages/flutter_staggered_grid_view#-readme-tab- ولكني لا ارغب بستعمالها لنها تقوم بعرض بعض العناصر اطول والبعض اقصر وانا ارغب ان يكونن متساويات ف الطول
    1 نقطة
  20. const { readFileSync, writeFileSync } = require('fs') console.log('start') const first = readFileSync('./content/first.txt', 'utf8') const second = readFileSync('./content/second.txt', 'utf8') writeFileSync( './content/result-sync.txt', `Here is the result : ${first}, ${second}`, { flag: 'a' } ) console.log('done with this task') console.log('starting the next one') سلام عليكم ممكن تشرحو لى وظيفة flag: 'a' فى هذا الكود أعلاه
    1 نقطة
  21. عند التعامل مع الملفات عن طريق الحزمة fs يمكنك تحديد عدة طرق تنوي التعامل فيها مع الملف المذكور عبر تمرير المعامل flag يوجد له عدة قيم بعدة معاني أمثلة: 'a' يتم فتح الملف المذكور للكتابة واضافة المحتوى لنهاية الملف، إذا لم يكن الملف موجودا فسيتم انشائه (هذا كما في المثال المذكور) 'w' يتم فتح الملف المذكور للكتابة وازالة محتوياته وكتابة المحتويات الممررة كما لو انك تنشئ ملف جديد، إذا لم يكن الملف موجودا فسيتم انشائه 'r' يتم فتح الملف المذكور للقراءة، وسيظهر خطأ في حال الملف لم يكن موجودا (لا يتم تمريرها للتابع writeFileSync بل للتابع open) في مثالك السابق في كل مرة ستنفذ البرنامج سيقوم بإضافة محتويات الملفين المذكورين إلى الملف content/result-sync.txt
    1 نقطة
  22. هل يمكن عمل مصفوفة من الدوال في php كما هو في جافاسكريبت؟
    1 نقطة
  23. أنا أعمل حاليًا مع next@11.1.2 و webpack v5 وتعطلت لساعات مع إصلاح تحميل mp3. لقد جربت العديد من الحلول لم يعمل أي منهم من أجلي. Type error: Cannot find module 'public/sounds/bighit.mp3' or its corresponding type declarations. 14 | 15 | // Assets > 16 | import sound_bighit from "public/sounds/bighit.mp3" | ^ info - Checking validity of types .% onst path = require('path') const SRC = path.resolve(__dirname, 'public/sounds/') module.exports = { webpack: (config, { }) => { config.module.rules.push({ test: /\.mp3$/, incluse: SRC, use: { loader: 'file-loader', options: { name: '[name].[contenthash].[ext]', outputPath: 'public/sounds/', publicPath: 'public/sounds/' } } }) // config.module.rules.push({ // test: /\.mp3$/, // use: { // loader: 'file-loader', // }, // }) // config.module.rules.push({ // test: /\.mp3/, // use: { // loader: 'url-loader', // }, // }) return config } }
    1 نقطة
  24. اهلا بيك اخوي اشكرك على اقتراحك ولكن ليس هذا الطريقه التي ابحث عنها هذا الطريقة العاديه هذا سبب المشكله انا ارغب بحلها
    1 نقطة
  25. @سامح أشرفشكراً كثير لردك الجميل 💚 بس دورة ال ux google ليست مجانية كما قلت حضرتك ف يا ريت لو تجبلي لنك للدورة يكون مجاني و بارك الله فيك 🙏
    1 نقطة
  26. القيمة الافتراضية ل PDO::ATTR_ERRMODE هي PDO::ERRMODE_SILENT. لن يظهر أي أخطا SQL ولا حتى PHP. PDO::ERRMODE_SILENT الوضع الصامت، لايظهر أي خطأ أو استثناء حتى لو حدث خطأ (عند نشر الموقع نستعمل هذه القيمة لكي لايظهر شيئ للزوار) أي في نمط الإنتاج بعد إطلاق الموقع. PDO::ERRMODE_WARNING يظهر الأخطء التي تحدث في PHP أو SQL والتي تكون PHP E_WARNING عند حدوث خطأ وسوف يكمل تنفيذ السكربت مع إظهار الأخطاء. PDO::ERRMODE_EXCEPTION يتم رمي استثناء عند حدوث خطأ، ويتوقف تنفيذ البرنامج. الدالة setAttributeتستخدم لضبط نمط معين أثناء عمل الاتصال، مثل نمط الخطأ كالمثال: $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); حيث أن الشكل العام له: bool setAttribute ( int $attribute , mixed $value ) يعيد true في حال نجاح إسناد القيمة للنمط. mixed هو pseudo type تمت إضافته في PHP 8، يقبل أي نوع من الأنماط، مهما كان parameter أو return أو property
    1 نقطة
  27. UI هي واجهة المستخدم (User Interface)، بينما UX هي تجربة الإستخدام (User Experience)، ولكل منهما العديد من التفاصيل والشروحات والأداوات التي يمكنك إستخدامها، ومصمم واجهة الاستخدام UI/UX Designer لا يقوم بكتابة الأكواد ولكن كتابة الأكواد هي عمل UI/UX Developer، فالمصمم هو من يقوم بعمل مخطط للتصميم ثم يقوم المختص بتحويلها الى كود فعلي. في الوقت الحالي لن تجد الكثير من المحتوى العربي الذي يتخصص في تصميم واجهة الاستخدام UI/UX Design (على الأقل مقارنة بالمحتوى الأجنبي)، يمكنك أن تحصل على دورة مقدمة من Google بخصوص تجربة الإستخدام User Experience وهي دورة مجانية لفترة تجريبية (للحصول على الشهادة يجب أن تقوم بدفع مبلغ مالي) تقوم بدراستها من خلال موقع Coursera، تقدم الدورة شرح للأساسيات مثل wireframing و prototyping مع أسخدام أدوات مثل Adobe X.D و Figma. كما أن أكاديمية حسوب تحتوي على العشرات من المقالات في التصميم بشكل عام وفي تصميم واجهة الاستخدام UI/UX Design بشكل خاص، وأنصحك بأن تبدأ بسلسلة مقدمة إلى UI لتعلم كل ما يخص واجهة المستخدم User Interface، بالإضافة إلى سلسلة مدخل إلى تجربة المستخدم لتعلم تجربة الإستخدام User Experience، وكلٌ من السلسلتين يُعد مدخل ممتاز يحتوي على شرح لكل ما ستحتاج تعلمه للبدأ في العمل في هذا المجال. ستتعلم من خلال دورة جوجل ومن خلال السلستين السابقتين العديد من المصطلحات مثل: User Interviewing - مقابلة المستخدمين Usability Testing - اختبار قابلية الاستخدام Human Computer Interaction - تفاعل الإنسان والحاسوب Strategy Design - تصميم الإستراتيجية وغيرها الكثير. أيضًا سوف تحتاج إلى التدرب على أشهر أدوات التصميم مثل Adobe X.D و Figma فالطبع لن تستطيع عمل تصميم ممتاز حتى وإن كانت لديك معرفة كبيرة بالمجال ما لم يكن لديك معرفة بالأدوات التي سوف تستعملها. عند إنتهائك من تعلم الدروس والأدوات السابقة أنصحك بالإطلاع على المقالات العامة في قسم التصميم لأنك سوف تحصل على معرفة ممتازة بأدوات وأشياء وقواعد لم تكن تعلمها من قبل مما سيؤدي بالنهاية إلى جعل تصاميمك أكثر إحترافية. بعد تعلم ما سبق سوف تجد أن الأمور أصبحت أكثر وضوحًا وستعرف تلقائيًا الخطوة التالية.
    1 نقطة
  28. يمكنك أيضاً تمرير request.user عند استدعاء الدالة (...)save. داخل ال view: class EventSerializer(serializers.ModelSerializer): class Meta: model = models.Event exclude = ['user'] class EventView(APIView): def post(self, request): es = EventSerializer(data=request.data) if es.is_valid(): es.save(user=self.request.user) return Response(status=status.HTTP_201_CREATED) return Response(data=es.errors, status=status.HTTP_400_BAD_REQUEST) وهذا هو النموذج: class Event(models.Model): user = models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE) date = models.DateTimeField(default=timezone.now) place = models.CharField(max_length=255)
    1 نقطة
  29. يمكنك القيام بذلك من خلال تصفية السجلات الأكثر أهمية ثم استخدام random.sample لتحديد أي عدد تريده كالتالي: import random from myapp.models import MyModel qs = MyModel.objects.filter(criteria=True) #QuerySet الخرج سيكون random.sample(qs, 1) #qs الحصول على عنصر عشوائي واحد من مجموعة الاستعلام السابقة random.sample(qs, 6) # الحصول على ستة عناصر random.sample(qs, 8) # الحصول على ثمانية # وهكذا.. كما يمكنك القيام بإنشاء manager للنموذج الخاص بك للقيام بهذا النوع من الأشياء كالتالي: from django.db import models class RandomManager(models.Manager): def get_query_set(self): return super(RandomManager, self).get_query_set().order_by('?') class Painting(models.Model): title = models.CharField(max_length=100) author = models.CharField(max_length=50) objects = models.Manager() # المدير الافتراضي. randoms = RandomManager() # مدير عشوائي محدد. ولاستخدامه: random_painting = Painting.randoms.all()[0]
    1 نقطة
  30. كما ذكر سامح في الطريقة الثانية التي قدمها،.. ضمن ملف apps.py الخاص بك من مجلد التطبيق الخاص بك ، نقوم بتغيير الواصفة verbose_name. على سبيل المثال: from django.apps import AppConfig class PostConfig(AppConfig): name = 'post' verbose_name = "posts" لكن إضافةً لذلك في حال كنت تستخدم إصدارات 3 ومافوق فيجب أن تضيف الكود التالي أيضاً ضمن ملف init.py: #__init__.py قم بإضافة الكود التالي إلى ملف default_app_config = 'post.apps.PostConfig'
    1 نقطة
  31. من الممكن أن تكون الإجابات الأخرى أن تكون بطيئة باستخدام order_by ('؟') أو تستخدم أكثر من استعلام SQL. إليك نموذج حل بدون ترتيب واستعلام واحد فقط, بافتراض Postgres: random_instance_or_none = Model.objects.raw(''' select * from {0} limit 1 offset floor(random() * (select count(*) from {0})) '''.format(Model._meta.db_table)).first() ربما أن هذا سيؤدي إلى ظهور خطأ في الفهرس إذا كان الجدول فارغ.لذلك اكتب دالة مساعدة للتحقق من ذلك
    1 نقطة
  32. بالإضافة الى الاجابات الأخرى يمكنك استخدام هذه الدالة def make_test_wrapper_for(command_module): def _run_cmd_with(*args): "" "قم بتشغيل الأمر might_add_alert بالوسيطات المزودة" "" cmd = command_module.Command() (opts, args) = OptionParser(option_list=cmd.option_list).parse_args(list(args)) cmd.handle(*args, **vars(opts)) return _run_cmd_with لاستخدامها كالتالي from myapp.management import mycommand cmd_runner = make_test_wrapper_for(mycommand) cmd_runner("foo", "bar") الميزة هنا هي أنك إذا استخدمت خيارات إضافية و OptParse ، فسيؤدي ذلك إلى حل المشكلة لك,ستستخدم قاعدة بيانات الاختبار ويمكنك بعد ذلك اختبار تأثيرات قاعدة البيانات.
    1 نقطة
  33. يمكنك استخدام call_command بسهولة لتنفيذ الاوامر من داخل الكود الخاص بك بسهوله كالتالي: from django.core.management import call_command call_command('my_command', 'foo', bar='baz') حيث my_command هو اسم الأمر الذي تريد تنفيذه. وكأمثله لاحظ الأكواد التاليه: from django.core.management import call_command call_command('test', 'myapp', verbosity=3, interactive=False) حيث تنفذ تلك الأوامر تماما مثلما تستطيع تنفيذها بالطريقة التقليدية من ال terminal: $ ./manage.py migrate myapp --noinput -v 3 كذلك عوضا عن أن تقوم بعمل call_command يمكنك تشغيل manage.py من داخل الكود ببساطة كالتالي: from myapp.management.commands import my_management_task cmd = my_management_task.Command() opts = {} cmd.handle_noargs(**opts)
    1 نقطة
  34. استخدام order_by('?') سيقوم بايقاف الخادم لمدة ثانتين تقريبا خلال وقت عمله، هناك طريقة أفضل باستخدام المكتبة random المشهورة في بايثون ، الكود التالي يوضح كيفية استخدامها لاداء الغرض المطلوب: from django.db.models.aggregates import Count from random import randint class PaintingManager(models.Manager): def random(self): count = self.aggregate(count=Count('id'))['count'] random_index = randint(0, count - 1) return self.all()[random_index] أو بشكل أبسط: from random import randint count = Model.objects.count() random_object = Model.objects.all()[randint(0, count - 1)] #عينة واحدة عشوائية
    1 نقطة
  35. إن سؤالك عام في مجال SEO سأضع لك بعض مقالات أكاديمية حسوب، أرجو قرائتها وفهمها التعريف العام: الأساسيات: عناصر تؤثر في عمل SEO: أدوات تساعد في العمل: إيجاد الكلمات المفتاحية: ثم مجالات متقدمة:
    1 نقطة
  36. سأقوم بكتابة بعض الأسألة لك وسأكتب خطوات الحل, ولكن ﻻ تنظر للحل إلا بعد محاولة حلها بنفسك حتى تستفيد قم بكتابة دالة تستقبل مصفوفة من المستخدم وتقوم بطباعة جميع عناصر المصفوفة ماعدا العنصر رقم 3 قم بكتابة دالة تستقبل نصاً من المستخدم وتقوم بطباعة كل حرف على حدا قم بكتابة دالة تستقبل مصفوفة من المستخدم وتقوم بإيجااد أكبر عنصر قم بكتابة برنامج تستقبل مصفوفة وتقوم بإيجاد عنصر معين ///////////////////////////////////////////////////////////الحل////////////////////////////////////////////////////////////////////////////////////////////////// public void test(int arr[]){ for(int i=0;i<arr.length;i++){ if(i==3) continue; System.out.println(arr[i]) } } public void test(String s){ for(int i=0;i<s.length();i++) { System.out.println(s.charAt(i)); } } public int test(int arr[]){ int max=arr[0]; for(int i=0;i<arr.length;i++){ if(arr[0]>max) max=arr[0]; } return max; } public int find(int arr[],int element){ int index=0; while(index<arr.length){ if(arr[index]==element) return arr[index]; } return -1; }
    1 نقطة
  37. يمكنك أن تستعمل دالة explode التي تستعمل لتقسيم نص معين، فعلى سبيل المثال يمكن أن تقوم بتقسيم النص الذي لديك بإستخدام الفاصلة، كالتالي: <?php $number = "21 1 10 0,22 0 0 0,23 0 0 0,24 0 0 0,25 0 0 0,26 0 0 0,27 0 0 0,28 0 0 0"; $num_arr = explode(',', $number); print_r($num_arr); # Output: Array ( [0] => 21 1 10 0 [1] => 22 0 0 0 [2] => 23 0 0 0 [3] => 24 0 0 0 [4] => 25 0 0 0 [5] => 26 0 0 0 [6] => 27 0 0 0 [7] => 28 0 0 0 ) بعد ذلك يمكنك المرور على كل عنصر في هذه المصوفة وتقسيمه مرة أخرى بإستخدام دالة explode من خلال المسافات كالتالي: $counter = count($num_arr); for ($i = 0; $i < $counter; $i++) { echo explode(" ", $num_arr[$i])[0]; echo ","; } # Output: 21,22,23,24,25,26,27,28, بالطبع يمكنك حذف الفاصلة الأخيرة (الموجودة بعد رقم 28) من خلال إضافة شرط للتحقق مما إذا كان العنصر هو الأخير أم لا كالتالي: $counter = count($num_arr); for ($i = 0; $i < $counter; $i++) { echo explode(" ", $num_arr[$i])[0]; if ($i != $counter -1 ) { echo ","; } } # Output: 21,22,23,24,25,26,27,28
    1 نقطة
  38. تعلم البرمجة أمر سهل ولكن يتطلب بذل الكثير من المجهود والوقت خصوصًا في بداية التعلم حيث يكون الأمر أكثر صعوبة بسبب تعلم مصطلحات وتقنيات جديد كليًا، ومن الطبيعي للغاية أن أي درس مدته ساعتين على سبيل المثال يستغرق منك أكثر من ساعتين لإتمامه، وذلك لأن التطبيق العملي يأخذ الكثير من الوقت أيضًا. عليك أيضًا أن تحاول التعلم والمتابعة بشكل متواصل لأن التعلم المتقطع لن يفيدك كثيرًا ويعد مضيعة للوقت، لأنك ستتعلم تقنية معينة ولغة برمجة معينة ولكن عدم إستخدامك لها لفترة طويلة سيؤدي إلى نسيانك لما تعملته وبالتالي سيكون الوقت الذي استغرفته في تعلم هذه التقنية في البداية مضيعة للوقت لأنك ستعيد تعلمها من البداية. والحل هو التطبيق العملي كل فترة لكي لا تنسى ما كنت تتعلمه وتبدأ من الصفر في كل مرة. بالنسبة إلى الكلية أو الجامعة التي تدرس فيها، فهي ليس ذات أهمية، في الواقع يمكن لأي شخص لجيه إتصال بالإنترنت وحسوب أن يتعلم البرمجة بدون مشكلة، وأريد أن أشير إلى أن دورة CS50 والتي يقوم بشرحها ديفيد مالان، تعد بداية جيدة لبدأ التعلم، كما أن ديفيد مالان نفسه لم يكن يدرس في كلية تكنولوجية في البداية، بل كان يدرس في كلية الحقوق، لذلك لا تطعي بالًا لأمر إختلاف الكلية التي تخرجت منها. أنصحك أيضًا أن تقرأ هذه المقالة "دليلك الشامل لتعلم البرمجة" والتي سوف تساعدك كثيرًا في تحديد مسار معين لتتبعه وتسهل عليك الكثير من الأمر.
    1 نقطة
  39. يمكنك أن تستعمل الحسوب في أي وقت من اليوم، حتى في فترة الظهر والحر الشديد على ألا تزيد حرارة المعالج CPU عن درجة الحرارة القصوى التي ينصح بها، وكذلك بالنسبة إلى وحدة المعالجة الرسومية GPU، وتستطيع معرفة درجة الحرارة الحالية لكلٍ منهما من خلال برامج مثل Open Hardware Monitor والتي يمكنك من معرفة درجة الحرارة الحالية بالإضافة إلى درجة الحرارة القصوى التي ينصح بألا يتم تخطيها. عند تشغيل البرنامج ستجد في كلٍ من وحدة المعالجة المركزية CPU ووحدة المعالجة الرسومية GPU حقل temperature وفيه عمودين: Value (درجة الحرارة الحالية)، و Max (درجة الحرارة القصوى). لاحظ أنه يمكنك أن تتخطى درجة الحرارة القصوى في حالة كانت لديك وحدة تبريد جيدة (هوائية أو مائية) مثل وحدات التبريد الخاصة بـ Cooler Master. هناك برامج أخرى مثل IO bit Advanced SystemCare يمكنك من معرفة درجة الحرارة الحالية وإدارات التطبيقات التي تعمل في الخلفية وإزالتها ما يقلل الضغط على المعالج والذاكرة العشوائية Ram. أيضًا لا ينصح بعمل كسر للسرعة لأي قطعة من الحسوب (CPU، GPU ، RAM .. إلخ) في موجات الحر الشديد إلا إن كان لديك وحدة تبريد مائية فقط، لأن كسر سرعة أي قطعة يعني عملها بشكل أعلى من المتوقع وبالتالي زيادة حرارتها بشكل كبير. ملاحظة: في حالة كانت وحدة المعالجة الرسومية GPU مدمجة في المعالج (مثل أغلب معالجات AMD) فستكون درجة الحرارة واحدة لكلٍ منها.
    1 نقطة
×
×
  • أضف...