-
المساهمات
46 -
تاريخ الانضمام
-
تاريخ آخر زيارة
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو أروى عفان
-
سنتعلم في هذا المقال كيفية إنشاء مجسم ثلاثي الأبعاد لرجل ثلج باستخدام برنامج بلندر Blender. إليك النتيجة النهائية للمشروع: ستحتاج في هذا المشروع إلى: عتاديات: حاسوب مكتبي أو شخصي قادر على تشغيل برنامج بلندر. برمجيات: برنامج بلندر Blender الإصدار 2.8 (أو أي إصدار أحدث). كما يمكنك الحصول على موارد المشروع ونتيجته النهائية من مستودع GitHub. إنشاء قاعدة رجل الثلج سنتبع الخطوات التالية لإنشاء قاعدة رجل الثلج: افتح برنامج بلندر وأغلق الشاشة الافتتاحية بالضغط على يمين الشاشة، ثم حدد المكعب واحذفه بالضغط على الرمز X لأننا لن نحتاجه، أكد الأمر بالضغط على مفتاح Enter. انقر على قائمة الإضافة المنسدلة Add الموجودة في أعلى اليسار، ثم انقر على خيار الشبكة Mesh واختر بعدها خيار الكرة UV Sphere. وبذلك نكون قد أضفنا الكرة لتكون بمثابة قاعدة لرجل الثلج. صيّر الشكل بالضغط على مفتاح F12 لترى كيف يبدو (أو بالضغط على مفتاحي FN + F12 إذا كنت تستعمل جهازًا يعمل بنظام تشغيل ماك). لاحظ أن قاعدة رجل الثلج تبدو صغيرة، لذلك يجب علينا تعديل حجمها. اضغط على مفتاح ESC للخروج من وضع التصيير. حدد الكرة بالنقر عليها، ثم اختر أداة التحجيم Scale tool من القائمة الموجودة على اليسار واستخدم المقابض الملونة لتعديل حجم الكرة. لاحظ صعوبة استخدام المقابض للحصول على الشكل المطلوب، إذ أنك قد تحصل على شكل شبيه بالبيضة: لا تقلق! إذ توجد طريقة أفضل للقيام بذلك. أولًا، احذف الكرة وأضف أخرى جديدة، ثم حدد الكرة الجديدة واضغط على مفتاح S لتغيير حجم الكرة بشكل موحد، وذلك بمجرد سحب الفأرة. انقر بالفأرة حين تحصل على الحجم المرغوب، ثم صيّر الشكل بالضغط على مفتاح F12 (أو مفتاحي FN + F12 إذا كنت تستعمل جهازًا يعمل بنظام تشغيل ماك) للتأكد من أنك حصلت على الحجم المطلوب، واضغط على مفتاح ESC للخروج من وضع التصيير. عدّل حجم الكرة مرةً أخرى إذا كان حجمها لا يزال كبيرًا، وذلك بالضغط على مفتاح S وسحب مؤشر الفأرة، ثم تأكد من حجمها بوضع التصيير: إنشاء رأس رجل الثلج أضف كرةً جديدةً لتكون بمثابة رأس لرجل الثلج، وذلك باتباع الخطوات السابقة. قد تستغرب من عدم ظهور الكرة على الرغم من أنك نفذت الخطوات كما يجب، لكن لا تقلق، فقد تكون الكرة أضيفت بداخل الكرة الأولى، وكل ماعليك فعله هو أن تسحبها باستخدام أداة التحريك Move من القائمة الموجودة على اليسار: اسحب الكرة باستخدام المقبض الأزرق (المعبر عن المحور Z) وضعها فوق الكرة الأخرى. صيّر المجسم لترى كيف يبدو : لاحظ أننا بحاجة تصغير حجم الرأس. اضغط على مفتاح ESC للخروج من وضع التصيير. اضغط على الكرة العليا لتحديدها، ثم اضغط على مفتاح S لتغيير حجم الكرة بشكل موحد، وذلك بسحب الفأرة للداخل باتجاه مركز الكرة، ثم صيّر المجسم مرةً أخرى لترى كيف يبدو : عدّل حجم الرأس حتى تحصل على الحجم المناسب، ثم عدل تموضع الرأس على القاعدة وثبته بسحبه نحو الأسفل قليلًا باستخدام المقابض، وصيّر الشكل للتأكد. إضافة أنف لرجل الثلج سنستخدم مخروطًا لإنشاء أنف رجل الثلج. انقر على قائمة الإضافة المنسدلة Add، ثم على خيار الشبكة Mesh، ثم اختر مخروطًا Cone، قد يضاف المخروط إلى قاعدة رجل الثلج، اسحبه للأعلى باستخدام المقبض الأزرق. عدّل حجم المخروط بالضغط على المفتاح S، أو باستخدام أداة التحجيم Scale tool التي قد تكون أنسب في هذه الحالة: ثم استخدم أداة التحريك لوضع المخروط في مكانه الصحيح، كالتالي: حدّد المخروط، ثم استخدم أداة التدوير ٌRotation tool من قائمة الأدوات لتدويره. ستظهر على الشاشة منحنيات ملونة، استخدمها لتدوير المخروط : تشبه هذه المنحنيات عمل المقابض الملونة، لكنها تستخدم لتدوير الشكل بالإتجاه المطلوب: استخدم أداة التحريك والمقابض الملونة لوضع المخروط في مكان الأنف الصحيح. صيّر الشكل لترى كيف يبدو الأنف الجديد؟ هل حصلت على شكل مشابه لرجل الثلج؟ إنشاء القبعة سنضيف أسطوانةً تكون بمثابة قبعة رجل الثلج، انقر على قائمة الإضافة المنسدلة Add، ثم على خيار الشبكة Mesh، ثم اختر اسطوانة Cylinder. قد تضاف الأسطوانة إلى قاعدة رجل الثلج، اسحبها للأعلى باستخدام المقبض الأزرق. اضغط على مفتاح S لتغيير حجم الاسطوانة بسحب الفأرة باتجاه مركز الأسطوانة لتصغيرها. ضع الأسطوانة فوق رأس رجل الثلج باستخدام المقابض الثلاثة الملونة، وصيّر المجسم لترى كيف يبدو: الآن، أطلق العنان لإبداعك، وأضف المزيد من التفاصيل إلى رجل الثلج. يمكنك أن تضيف إليه عينين، أو ذراعين، أو أزرارًا. إليك الشكل النهائي الذي حصلنا عليه لتستلهم منه. في الختام تهانينا، بهذا تكون قد أتممت مشروعك باستخدام برنامج بلندر، ننصحك بتنفيذ مشاريع إضافية تكون خطواتك التالية لتنمية مهاراتك في العمل على برنامج بلندر، كما تتوفر في قسم التصميم في أكاديمية حسوب عدد من المقالات حول تعليم العمل على برنامج التصميم ثلاثي الأبعاد بلندر. إذا واجهت مشاكلًا مع برنامج بلندر، فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال Snowman من الموقع الرسمي لراسبيري باي. اقرأ أيضًا إنشاء نموذج ثلاثي اﻷبعاد لصاروخ باستخدام برنامج بلندر إنشاء منزل ثلاثي اﻷبعاد باستخدام برنامج بلندر إنشاء نموذج ثلاثي اﻷبعاد لقرد يرتدي قبعة احتفال باستخدام برنامج بلندر
-
سنتعلم في هذا المقال كيفية إضافة زر إلى مشروع كرة الضغط بحيث يمكننا ضغط كائن الكرة في سكراتش وعصرها باستخدام هذا الزر. ستحتاج في هذا المشروع إلى: عتاديات: حاسوب راسبيري باي. أسلاك توصيل jumper cables ذات نهايات ذكر/أنثى (عدد 2). مصاصة شرب. غراء لاصق. برمجيات: برنامج سكراتش الإصدار الثالث نسخة سطح المكتب Scratch 3 Desktop. تحميلات: نزل مشروع كرة الضغط الكامل ثم ازل ضغط مجلد المشروع. ستتعلم في هذا المقال: كيفية عمل مفتاح كهربائي بسيط Switch باستخدام أسلاك التوصيل. كيفية استخدام برنامج سكراتش للتحسس للمدخلات الفيزيائية. كيفية إنشاء زر في برنامج سكراتش. كما يمكنك الحصول على المشروع الكامل من هنا أو تنزيله من ملف zip. صنع مفتاح كهربائي سنتعلم في هذه الخطوة كيفية تحريك كائنات سكراتش والتى تدعى "سبرايت" Sprite باستخدام مفتاح كهربائي. أولًا، افتح برنامج سكراتش من القائمة الرئيسية ثم اضغط على برمجة Programming ثم سكراتش Scratch 3. ثانيًا، سيظهر لك قط سكراتش الشهير على المنصة Stage، اسحب كتلة أحداث لوحة المفاتيح Keyboard Events إلى المنصة لتحريك الكائن باستخدام الكتل الموضحة في الصورة: اخترنا تحريك الكائن 10 خطوات عند الضغط على مفتاح المسطرة space. اضغط على العلم الأخضر لتشغيل البرنامج ثم اضغط على مفتاح المسطرة عدة مرات لتحريك الكائن. سنتعلم الآن كيفية إضافة حدث event لتحريك الكائن باستخدام مفتاح كهربائي (يسمى أيضًا مفتاح تبديل، أو قاطعة) مصنوع منزليًا، والذي يسمح بمرور التيار الكهربائي من سلك إلى آخر عبر إكمال وصل الدارة. ثالثًا، سنصنع مفتاحًا كهربائيًا باستخدام سلكي توصيل بنهايات ذكر-أنثى، وذلك عبر توصيل أحد الأسلاك إلى رجل التأريض ذات الرقم 6 على لوحة راسبيري باي: رابعًا، وصل سلك ذو نهاية ذكر-أنثى إلى الرجل ذات الرقم 21 على لوحة راسبيري باي: خامسًا، أضف ملحق الإلكترونيات البسيطة Simple Electronics إلى برنامج سكراتش. سادسًا، أضف الكتلتين التاليتين لتحسس الدخل من المفتاح الكهربائي، حيث أنه عند الضغط على الزر 21 الموصول إليه المفتاح الكهربائي، يتحرك الكائن 10 خطوات: أخيرًا، اضغط على زر العلم الأخضر لتشغيل برنامج سكراتش ثم وصل سلكي التوصيل ببعضهما، ستلاحظ تحرك الكائن عشر خطوات. افصل السلكين ثم أعد توصيلهما لتحريك الكائن عشر خطوات أخرى. لا تنسى حفظ مشروعك. إضافة المفتاح الكهربائي إلى لعبة كرة الضغط يُعد مشروع تخفيف التوتر باستخدام كرة الضغط مثاليًا لإضافة متحكم فيزيائي إليه. يمكنك إتباع الإرشادات لإنشاء نسختك الخاصة من المشروع، إذا لم تنفذه بعد، أو يمكنك تنزيل المشروع النهائي مباشرةً، أو من المرفقات نهاية المقال. افتح مشروع كرة الضغط باستخدام برنامج سكراتش على حاسب الراسبيري باي، واضغط على الكرة لعصرها، ثم أضف ملحق الإلكترونيات البسيطة Simple Electronics للمشروع وأضف الكتلة التالية كما في الخطوة السابقة: استخدم الكتل التالية كي يتحسس البرنامج لضغط الكرة ويطبق التغيير اللازم على كائن الكرة: اضغط بالزر الأيمن للفأرة على كتلة set [whirl v] effect to (100) واختر نسخ Duplicate من القائمة، اسحب الكتل التي نسختها وضعها أسفل الكتلة when button 21 is pressed كما يلي: اضغط على زر العلم الأخضر لتشغيل المشروع، أصبح الآن بإمكانك عصر كائن الكرة في سكراتش عبر وصل الأسلاك مع بعضها، ولا تنسى حفظ المشروع. اصنع زرا خاصا بك لتفريغ التوتر حان الآن وقت صنع زر خاص بك لتخفيف التوتر، بعد أن برمجنا اللعبة في سكراتش. أولًا، احضر رقاقة ألمنيوم بمقاس 15x15 سم، واطوها عدة مرات حتى يصبح حجمها 3x3 سم: ثانيًا، اطوِ الرقاقة الثانية بنفس الطريقة حتى تحصل على صفيحتين مربعتي الشكل. ثالثًا، قص مصاصة الشرب إلى أربع أجزاء وشكل منها مربع عبر رصفها على حواف الرقاقة. رابعًا، ألصق المصاصات باستخدام الغراء. ثم ألصق رقاقة الألمنيوم الثانية فوق المصاصات لتحصل على ما يشبه الفطيرة. تبث أحد سلكي التوصيل ذو نهاية ذكر-أنثى على الرقاقة السفلية، وثبت السلك الأخر على الرقاقة العلوية؛ لا يهمنا ترتيب الأسلاك في هذه الحالة. شغل المشروع بالضغط على زر العلم الأخضر، أصبح بإمكانك الآن عصر الكرة بالضغط على منتصف الشكل حتى تتلامس رقاقتي الألمنيوم. اختبر معلوماتك بهذا تكون قد قطعت شوطًا كبيرًا والآن حان وقت إنعاش ذاكرتك لتثبيت المعلومات التي تعلمتها. السؤال الأول: ماهو جهاز الدخل الذي يعمل على إيقاف أو تمرير التيار الكهربائي بين نقطتين؟ (حاول تذكر ما تعلمناه قبل الإطلاع على الإجابة أدناه) الإجابة الصحيحة هي: المفتاح الكهربائي. السؤال الثاني: ما هي صيغة الكتلة التي تتحسس للضغط على المفتاح الموصول مع الرجل رقم 21؟ الإجابة الصحيحة هي : when button 21 is pressed. السؤال الثالث: اذكر مادة تسمح بمرور التيار الكهربائي ويمكن استخدامها لصنع زر؟ الإجابة الصحيحة هي : ورق الألمنيوم. ختامًا بهذا تكون قد أتممت مشروعك الثاني باستخدام حاسوب راسبيري باي و برنامج سكراتش، وننصحك بتنفيذ مشروع لعبة الحلقة والسلك كخطوتك التالية. إذا واجهت مشاكل مع راسبيري باي أو برنامج سكراتش فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب ترجمة -وبتصرف- للمقال Raspberry Pi and Scratch stress buster من الموقع الرسمي لراسبيري باي. اقرأ أيضًا إنشاء لعبة أضواء باستخدام برنامج سكراتش وحاسوب راسبيري باي البرمجة باستخدام سكراتش Scratch البرمجة باستخدام لغة بايثون في تطبيقات راسبيري باي
-
سنتعلم في هذا المقال كيفية إنشاء مجسم ثلاثي الأبعاد لصاروخ باستخدام برنامج بلندر Blender. إليك النتيجة النهائية للمشروع: ستحتاج في هذا المشروع إلى: عتاديات: حاسوب مكتبي أو شخصي قادر على تشغيل برنامج بلندر. برمجيات: برنامج بلندر Blender الإصدار 2.8 (أو أي إصدار أحدث). كما يمكنك الحصول على موارد المشروع ونتيجته النهائية من مستودع GitHub. إنشاء قاعدة الصاروخ سننشئ الآن قاعدة الصاروخ باتباع الخطوات التالية: افتح برنامج بلندر وأغلق الشاشة الافتتاحية، ثم حدد المكعب واحذفه بالضغط على الرمز X. انقر على قائمة الإضافة المنسدلة Add، ثم على خيار الشبكة Mesh ثم اختر اسطوانة Cylinder. ستمثل هذه الأسطوانة قاعدة الصاروخ، ثم سنضيف رأس الصاروخ في الخطوة التالية. بعد ذلك انقر على وضع التحرير Edit Mode من القائمة الموجودة في أعلى اليسار. اختر أداة الحواف Edge Select لإنشاء الزعانف، والتي تساعد على تثبيت الصاروخ أثناء طيرانه: حدد أربع حواف في قاعدة الأسطوانة تكون متوازيةً ومتعامدةً مع بعضها، وذلك بالضغط مع الاستمرار على مفتاح Shift أثناء النقر على الحواف. اضغط على مفتاح S وحرك الفارة لسحب الحواف للخارج، ثم اضغط على مفتاح Enter عند الإنتهاء. وبذلك أصبحت قاعدة الصاروخ جاهزة. إنشاء جسم الصاروخ سننشئ في هذه الخطوة جسم الصاروخ، وذلك باتباع الخطوات التالية: انقر على أداة تحديد الأسطح Face select من القائمة التالية: حدد السطح العلوي للأسطوانة، ثم ارفعها للأعلى قليلًا. لاحظ أننا لم نحصل على الشكل المطلوب لأن الزعانف ارتفعت أيضًا: اضغط على مفتاحي CTRL + Z للتراجع عن التعديلات، إذ أننا سننسخ الوجه العلوي عدة مرات بواسطة أداة الاستخراج. اضغط على خيار استخراج منطقة Extrude region من القائمة الموجودة على اليسار، أو اضغط مباشرةً على المفتاح E من لوحة المفاتيح. اسحب الجزء العلوي باستخدام رمز الزائد + حتى تحصل على الارتفاع المطلوب. استخرج الوجه العلوي مرةً أخرى ليكون بمثابة قاعدة لرأس الصاروخ المخروطي، باستخدام خيار استخراج منطقة Extrude region أو المفتاح E من لوحة المفاتيح. إنشاء رأس الصاروخ المخروطي يجب أن يكون للصاروخ رأس مدبب، سنستخدم أداة ضبط الحجم Resize tool للحصول على الشكل المطلوب، وذلك باتباع الخطوات التالية: حدد الوجه العلوي للصاروخ. غيّر حجم الوجه العلوي بالضغط على المفتاح S وتحريك الفأرة للحصول على رأس مدبب، انقر بالفأرة عندما تحصل على الشكل المطلوب. صيّر الصور بالضغط على مفتاح F12 (أو مفتاحي FN + F12 إذا كنت تستعمل جهازًا يعمل بنظام تشغيل ماك) لترى كيف يبدو الصاروخ. لاحظ أنه قد يبدو الصاروخ كبيرًا بعض الشيء، لهذا استخدم أداة ضبط الحجم لتعديل حجمه. اضغط على مفتاح ESC للخروج من وضع التصيير. انتقل إلى وضع الكائنات Object Mode من القائمة أعلى اليسار، ثم حدد الصاروخ بالضغط عليه. اضغط على المفتاح S لتصغير حجم الصاروخ، ثم انقر بالفأرة حين تحصل على الحجم المرغوب. صيّر الشكل للتأكد من أنك حصلت على الحجم المطلوب. تلوين الصاروخ سنضيف في هذه الخطوة بعض الألوان والمرح للصاروخ، إذ سنطلي جسم الصاروخ بلون أزرق. ثم حدد الصاروخ بالنقر عليه. انقر على قائمة خصائص المواد Material Properties من القائمة اليمنى. أضف مادة جديدة بالنقر على خيار New. أعد تسمية المادة باسم لون أزرق أو Blue. حدد لونًا أزرقًا من قائمة الألوان الأساسية Base Color لتلوين الصاروخ. إضافة تخطيطات إلى جسم الصاروخ حدّد الصاروخ، ثم انتقل إلى وضع التحرير Edit Mode من القائمة العلوية، أو بالضغط على مفتاح Tab. اضغط على أداة تحديد الأسطح Face select. انقر على قائمة خصائص المواد Material Properties من القائمة اليمنى، وأضف مادةً جديدةً بالنقر على الرمز +. رابعًا، انقر على خيار New وسمي لون أبيض أو White. خامسًا، حدّد لونًا أبيض من قائمة الألوان الأساسية Base Color. أصبح بإمكانك الآن إضافة هذا اللون إلى أسطح الصاروخ. حدّد أحد الأسطح لتلوينه، ثم اختر المادة البيضاء وانقر على خيار تعيين Assign لتطبيق اللون على السطح المحدد. اختر الأسطح التي تريد تلوينها وكرر الخطوات السابقة. يمكنك تحديد عدة أسطح بالضغط المستمر على مفتاح Shift، والنقر على الأسطح المراد تلوينها. صيّر الصاروخ لترى كيف يبدو. تلوين رأس الصاروخ باللون الأحمر لقد حان وقت إضافة البهجة على الصاروخ وتلوين الرأس باللون الأحمر، لهذا اضغط على الرأس لتحديده. أضف مادةً جديدةً باسم Red، واختر لها لونًا أحمرًا من عجلة الألوان الأساسية Base Color. طبّق المادة الحمراء على الرأس بالضغط على خيار تعيين Assign. صيّر لترى كيف يبدو الصاروخ بعد إضافة التخطيطات البيضاء والرأس الأحمر. والآن تحدى نفسك وأطلق العنان لإبداعك، وأضف المزيد من الألوان والمواد إلى صاروخك. إليك الشكل النهائي الذي حصلنا عليه لتستلهم منه. ختاما بهذا تكون قد أتممت مشروعك باستخدام برنامج بلندر. يُنصح بتنفيذ مشاريع إضافية لتكون هي خطوتك التالية لتنمية مهاراتك في العمل على برنامج بلندر. ويتوفر في قسم التصميم في أكاديمية حسوب عدد من المقالات حول تعليم العمل على برنامج التصميم ثلاثي الأبعاد بلندر. إذا واجهت أي مشاكل مع برنامج بلندر، فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال Rocket من الموقع الرسمي لراسبيري باي. اقرأ أيضًا إنشاء منزل ثلاثي اﻷبعاد باستخدام برنامج بلندر إنشاء نموذج ثلاثي اﻷبعاد لقرد يرتدي قبعة احتفال باستخدام برنامج بلندر بلندر للمبتدئين: كيف تصمّم وتحرّك روبوت - نمذجة الجسم والرأس
-
سنتعلم في هذا المقال كيفية تنفيذ مشروع باستخدام أرجل الدخل والخرج GPIO pins لراسبيري باي وذلك لصنع آلات بسيطة. سنوصل أسلاكًا وأضواءً مع راسبيري باي، وذلك لصنع دارة كهربائية بسيطة، ثم نربطها مع لعبة حاسوب لإتمام مهمتنا وهي إيجاد القنفذ المتخفي. إليك صورة عن مشروع الحوسبة النهائي الذي ستنفذه ومهمتك الأساسية فيه هي إيجاد القنفذ عبر تحريك اللاعب بواسطة مفاتيح الأسهم، وسيضيء ضوء الليد LED عندما تقترب من القنفذ. ستحتاج خلال هذا المقال إلى: عتاديات: حاسوب راسبيري باي. أسلاك توصيل jumper cables ذات نهايات أنثى/أنثى (عدد 3). ثنائي باعث للضوء Light Emitting diode، واختصارًا ضوء ليد LED. مقاومة resistor (يُفضل اختيار مقاومة ذات قيمة منخفضة). برمجيات: برنامج سكراتش الإصدار الثالث Scratch 3- وهنا يجب التنويه أنه لا يمكن إكمال هذا المشروع باستخدام محرر سكراتش عبر الإنترنت، ويجب إكماله باستخدام إصدار سطح المكتب من سكراتش بعد تثبيته على راسبيري باي. تحميلات: نزل مشروع سكراتش الكامل من هنا أو تجده من الملف الخاص بالمرفقات الذي تجده أيضًا عند نهاية المقال. ستتعلم في هذا المقال: كيفية توصيل دارة بسيطة مع لوحة راسبيري باي. كيفية استخدام ضوء ليد مع راسبيري باي وبرنامج سكراتش. اختبار الدارة ستوصل في هذه الخطوة مقاومة وضوء ليد إلى أرجل الدخل والخرج GPIO في راسبيري باي لاختبار عمل الدارة. يرمز المصطلح GPIO إلى أرجل الدخل والخرج ذات الأغراض العامة General Purpose Input/Output، وتسمح هذه الأرجل بإنشاء آلات بسيطة عن طريق إرسال إشارة كهربائية من إحدى الأرجل عبر سلك توصيل، إلى جهاز ما (مثل المقلومة أو ضوء الليد) ثم إلى أحد أرجل التأريض في راسبيري باي لإكمال الدارة. يمكن برمجة الدارة بواسطة الكتل البرمجية التي يقدمها برنامج سكراتش. يجب أن يكون لأسلاك التوصيل نهايات مجوفة، أي من النوع أنثى، ليتم إدخالها فوق الأرجل. أولًا، وَصّل سلك توصيل ذو نهايات أنثى-أنثى إلى الرجل رقم واحد. تكون هذه الرجل في حالة عمل دائمًا وتزود كل ما يوصل إليها باستطاعة مقدارها 3 فولت. ثم أدخل الطرف الطويل لضوء الليد في النهاية الحرة من سلك التوصيل، ثم وصل الطرف القصير مع سلك توصيل ثاني. ثانيًا، أدخل أحد طرفي مقاومة في النهاية الحرة لسلك التوصيل الثاني، ثم أدخل الطرف الثاني للمقاومة في سلك توصيل آخر. تعمل المقاومة على التحكم في التيارات الكهربائية المارة في الدارة وبالتالي تحمي ضوء الليد من الاحتراق. ثالثًا، أكمل الدارة عبر توصيل الطرف الحر من سلك التوصيل إلى الرجل رقم ستة، وهي رجل التأريض. لاحظ أنه حالما تغلق الدارة سيضيء الليد! أخيرًا، في حال لم يضيء الليد، تأكد من توصيل الطرف الطويل لضوء الليد إلى الرجل رقم واحد وهي رجل الخرج، وتوصيل الطرف القصير إلى رجل التأريض وهي الرجل رقم ستة. تذكر أن الليد يعمل باتجاه واحد (حيث أن الطرف الطويل يمثل القطب الموجب، والطرف القصير يمثل السالب). تحقق بعد ذلك من أن جميع التوصيلات ثابتة ومدخلة بشكل صحيح، ثم بدل الليد بآخر إذا لم يضيء، لأنه قد يكون تالفًا. سنوصل الدارة في الخطوة التالية إلى أحد أرجل التحكم بحيث يمكننا التحكم بها باستخدام الشيفرة. كتابة الشيفرة سنوصل الدارة في هذه الخطوة إلى أحد أرجل الخرج ونتحكم بها باستخدام ملحق الإلكترونيات البسيطة Simple Electronics في برنامج سكراتش. جربنا دارتنا وهي تعمل بشكل سليم، وضوء الليد يعمل؛ لكننا نريد ربطه ببرنامج سكراتش ليضيء عند تنفيذ أحداث معينة، ولإنجاز ذلك يجب توصيل الليد إلى أحد أرجل الخرج على لوحة راسبيري باي. أولًا، انزع سلك التوصيل من الرجل رقم 1 ووصله إلى رجل أخرى، استخدمنا الرجل رقم 21 بسبب سهولة الوصول إليها، ولكن يمكنك استخدام أي من الأرجل العامة المرقمة General Purpose (اختصارًا GP) على لوحة راسبيري باي. لاتنسى تغيير رقم الرجل في كل الشيفرة إذا استخدمت رجل غير الرجل رقم 21. ثانيًا، نزل مشروع سكراتش من هنا أو من المرفقات نهاية المقال ثم افتحه، واختر خلفيةً مناسبةً للمنصة Stage، ثم لاحظ ظهور السكربت التالي على الشاشة: ثالثًا، أضف الكتل البرمجية الجاهزة التالية باستخدام ملحق الإلكترونيات البسيطة Simple Electronics إلى كتلة تعليمة if بحيث يضيء الليد إذا كانت المسافة distance أصغر من 10، أما إذا كانت المسافة غير ذلك else فإنه ينطفئ. أخيرًا، انقر على زر العلم الأخضر لتشغيل الشيفرة وانطلق في مهمة البحث عن القنفذ! ولا تنسى حفظ المشروع. اختبر معلوماتك انعش ذاكرتك واختبر معلوماتك بالإجابة عن الأسئلة التالية: السؤال الأول: يُعد فحص الدارة عند توصيل ليد ومقاومة إلى لوحة الراسبيري باي أمرًا ضروريًا، اشرح كيف يتم ذلك؟ (حاول تذكر ما تعلمناه قبل الإطلاع على الإجابة أدناه) الإجابة الصحيحة هي: بما أن التيار يسري من رجل التغذية ذات جهد 3 فولت عبر المقاومة إلى رجل التأريض GND، إذًا يجب توصيل الطرف الطويل من الليد إلى رجل التغذية والطرف القصير إلى رجل التأريض GND ووصل مقاومة بينهما. السؤال الثاني: أي من ملحقات سكراتش استخدمناها للتحكم بضوء الليد في مشروعنا؟ (حاول تذكر ما تعلمناه قبل الإطلاع على الإجابة أدناه) الإجابة الصحيحة هي: ملحق الإلكترونيات البسيطة Raspberry Pi Simple Electronics والذي يعد أسهل ملحق للتعامل مع أرجل الدخل والخرج العامة GPIO. السؤال الثالث: أضف الكتل البرمجية اللازمة إلى السكربت التالي لجعل الليد يضيء عندما تتلامس الكائنات في واجهة سكراتش، وينطفىء خلاف ذلك. الإجابة الصحيحة هي: أضف الكتلة ختامًا تهانينا! لقد أتممت مشروعك الأول باستخدام حاسوب راسبيري باي و برنامج سكراتش. يمكنك إضافة تحسينات إلى المشروع كإضافة أصوات sounds عند إيجاد القنفذ، أو إضافة ليد آخر وبرمجته ليضيء عندما تبتعد عن القنفذ، أطلق العنان لخيالك! ننصحك بتنفيذ مشروع لعبة تخفيف التوتر باستخدام سكراتش كخطوتك التالية، حيث ستتعلم فيه كيفية استخدام المدخلات الإلكترونية مع سكراتش! إذا واجهت مشاكل مع راسبيري باي فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب ترجمة -وبتصرف- للمقال An LED Game من الموقع الرسمي لراسبيري باي. اقرأ أيضًا تجميع راسبيري باي والتحضير لاستعماله جولة في راسبيان: نظام تشغيل راسبيري باي البرمجة باستخدام لغة بايثون في تطبيقات راسبيري باي
-
سنتعلم في هذا المقال كيفية الاستخراج Extrude وتعديل الكائنات في برنامج بلندر Blender، وذلك عبر إنشاء منزل بسيط بدءًا من كتلة واحدة. إليك النتيجة النهائية للمشروع: ستحتاج في هذا المشروع إلى: عتاديات: حاسوب مكتبي أو شخصي قادر على تشغيل برنامج بلندر. برمجيات: برنامج بلندر Blender الإصدار 2.8 (أو أي إصدار أحدث). كما يمكنك الحصول على موارد المشروع ونتيجته النهائية من مستودع GitHub. التعامل مع الرؤوس والحواف والأسطح أغلق الشاشة الافتتاحية لبرنامج بلندر وستلاحظ ظهور مكعب على الشاشة تلقائيًا. لاحظ أنك مهما حركت المكعب باستخدام الفأرة لن يبدو الشكل الحالي مشابهًا للمنزل بعد، وقد يخطر في بالك أن تضيف مخروطًا من علامة تبويب إنشاء Create في شريط الأدوات Toolbox، كما يلي: لكن، لا يزال المجسم بعيدًا كل البعد عن شكل المنزل. لهذا يُفضل تعديل المكعب للحصول على شكل المنزل. بالتالي. حدد المكعب ثم اختر وضع التحرير Edit Mode من القائمة أعلى الزاوية اليسرى. يُتيح لك وضع التحرير إمكانية تعديل كل جزءٍ من المكعب لإعادة تشكيله، وتوجد فيه ثلاثة خيارات هي: تعديل الرؤوس vertices، أو الحواف edges، أو الوجوه faces، وتجدها جميعًا في القائمة العلوية. الرؤوس اختر رمز الرؤوس من القائمة، إذ سيمكّنك من تحديد زوايا المكعب. بعد ذلك اختر أحد زوايا vertex المكعب، وذلك عبر الضغط عليها. اسحب الرأس باستخدام المقابض الزرقاء والخضراء والحمراء، وذلك لإنشاء شكل جديد. تأكد من تحديد أداة النقل move tool من القائمة الموجودة على اليسار إن لم تظهر المقابض. لا تنسى أنه يمكنك التراجع عن التعديلات التي أجريتها على الشكل. وإن لم تعجبك، اضغط على مفتاحي CTRL + Z. الحواف اختر رمز الحوافر الذي يتيح لك إمكانية تحديد حواف المكعب. اضغط على الحافة لتمييزها باللون الأبيض. حرك الحافة باستخدام المقابض الزرقاء والخضراء والحمراء، وذلك لإنشاء شكل جديد، كما يلي: الأسطح اختر رمز الأسطح الذي يتيح لك تحديد أسطح أو أوجه المكعب. بعد ذلك اختر أحد أسطح المكعب، وذلك عبر الضغط عليها. حرك السطح باستخدام المقابض الزرقاء والخضراء والحمراء، وذلك لإنشاء شكل جديد، كما يلي: ثم تراجع عن التعديات التي أجريتها بالضغط مرارًا على مفتاحي CTRL + Z، وذلك حتى تحصل على شكل المكعب الأصلي. إنشاء نصف سقف سننشئ أولًا نصف السقف، ثم ننشىء النصف الآخر. لهذا ابدأ بتحديد إحدى الحواف، وذلك باختيار أداة الحواف من القائمة العلوية. اضغط الآن على الحافة العلوية اليمنى للمكعب. ثم اسحبها للأعلى باستخدام المقبض الأزرق، كما يلي: وبذلك نكون قد حصلنا على نصف منزل ذو حافة مرتفعة للأعلى، ولازلنا بحاجة النصف الآخر، وسنستخدم لذلك أداة الاستخراج أو "التمديد" Extrude لإكمال الشكل، لأن المكعب قد أدى وظيفته. الاستخراج اختر أداة الأسطح من القائمة العلوية. ثم اضغط على الوجه الأيمن الخارجي للمكعب لتحديده. اضغط على منطقة الاستخراج Extrude Region من قائمة الأدوات الموجودة على اليسار. اضغط باستمرار على علامة الزائد واسحبها باستخدام الفأرة لاستخراج السطح، استمر بالسحب حتى تحصل على الشكل الذي تريده. إنشاء النصف الآخر من السقف اختر أداة الحواف من القائمة العلوية. اضغط الآن على الحافة العلوية اليمنى للمكعب. ثم اختر أداة التحريك move tool، واسحب الحافة العليا نحو الأسفل إلى مستوى نظيرتها في الطرف الآخر لتحصل على شكل متناظر في كلا الجانبين ويبدو شبيهًا بالمنزل. قد لا يبدو المنزل متناسقًا حتى الآن، لهذا مهمتك الآن هي تحسين مظهره، إذ يمكنك توظيف ما تعلمناه في صنع نماذج معقدة. تحدي تلوين المنزل تحدى نفسك واختبر مهاراتك عبر تلوين المنزل لتحصل على نتيجة مشابهة لما يلي: اختر أحد الأسطح وأضف له مادة Material لتتمكن من تلوينه وذلك باتباع الخطوات التالية: انقر على نافذة خصائص المواد Material Properties الموجودة على يمين الشاشة، ثم اضغط على رمز الزائد ثم اختر إنشاء مادة جديدة create a New material. اختر لونًا للمادة من مربع اختيار اللون الأساسي Base Color. أخيرًا، حدد المادة ثم اضغط على خيار تعيين Assign لإضافة المادة على السطح. اطلق العنان لمخيلتك وأضف المزيد من الألوان إلى منزلك. ختامًا بهذا تكون قد أتممت مشروعك باستخدام برنامج بلندر. ننصحك بتنفيذ مشاريع إضافية مثل خطوتك التالية لتنمية مهاراتك في العمل على برنامج بلندر. كما تتوفر في قسم التصميم في أكاديمية حسوب عدد من المقالات حول تعليم العمل على برنامج التصميم ثلاثي الأبعاد بلندر. إذا واجهت مشاكل مع برنامج بلندر فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال Block House من الموقع الرسمي لراسبيري باي. اقرأ أيضًا إنشاء نموذج ثلاثي اﻷبعاد لقرد يرتدي قبعة احتفال باستخدام برنامج بلندر بلندر للمبتدئين: كيف تصمّم وتحرّك روبوت - نمذجة الجسم والرأس كيف تصمم وتحرك روبوت: التحريك ومفاتيح التأطير في بلندر بلندر للمبتدئين: كيف تصمّم وتحرّك روبوت - تنسيق التناظر وتصميم الفم
-
يسمح تقييد معدل التراسل Rate limiting بإدارة حركة مرور البيانات في الشبكة، ويحد من عدد المرات التي يكرر فيها المستخدم عملية ما خلال مدة معينة، مثل استخدام واجهة برمجة التطبيقات API. تُعد الخدمات التي لا تحتوي على إجراءات أمان لتقيد من معدل التراسل معدل التراسل عرضة لزيادة التحميل وإعاقة العمل السليم للتطبيق. سنتعلم في هذا المقال كيفية إنشاء خادم Node.js قادر على التحقق من عنوان IP الخاص بالطلب وحساب معدل هذه الطلبات من خلال مقارنة العلامات الزمنية للطلبات لكل مستخدم، فإذا تجاوز عنوان IP الحد المعين الذي اخترناه في تطبيقنا، فسوف نتصل بواجهة برمجة تطبيقات Cloudflare API ونضيف عنوان IP إلى القائمة، بعدها سننشئ قاعدة جدار حماية Cloudflare Firewall تحظر جميع الطلبات الواردة من عناوين IP الموجودة في تلك القائمة. إذًا سننشئ مشروع Node.js على منصة تطبيقات DigitalOcean التي تدعي App Platform والتي تحمي النطاقات المسجلة والمضافة إلى حسابك في Cloudflare بتقيد معدل التراسل. ستحتاج خلال هذا المقال إلى: حساب Cloudflare، ويفي الحساب المجاني Free plan من Cloudflare بالغرض. احرص اختيار الحساب المجاني عند إنشاء حساب جديد. نطاق مسجل ومضاف إلى حسابك في Cloudflare. يمكنك الإطلاع على كيف نخفف من هجمات DDoS ضد موقعنا باستخدام CloudFlare مع Cloudflare، وننصح بقراءة هذا المقال للتعرف على أساسيات نظام أسماء النطاقات DNS ومكوناته. خادم Express مع بيئة Node.js، اتبع الخطوات في المقال التالي لإعداد خادم Express. حساب على GitHub ونسخة مثبتة من برنامج gitعلى جهازك، يُعد ذلك ضروريًا لأننا سنرسل الشيفرة من GitHub على منصة App Platform من DigitalOcean. حساب على موقع DigitalOcean. إعداد المشروع والنشر على منصة App Platform سنوسع خادم Express الأساسي الذي أنشأناه في مقال دليل استخدام Node.js وإطار العمل Express للمبتدئين، في هذه الخطوة، ونرسل الشيفرة إلى مستودع GitHub Repository، ثم ننشر التطبيق على منصة App Platform. افتح مجلد مشروع خادم Express بواسطة إحدى محررات النصوص البرمجية، ثم أنشئ ملفًا جديدًا في المجلد الرئيسي للمشروع باسم getignore.، وأضف الأسطر التالية: node_modules/ .env لاحظ أن السطر الأول في ملف getignore. يوجه git لعدم تتبع المجلد node_modules، ويتيح ذلك عدم زيادة حجم المستودع، إذ يُولَد المجلد node-modules عند الحاجة باستخدام الأمر npm install، أما السطر الثاني فيمنع تتبع ملف متغيرات البيئة، وسوف ننشئ الملف env. في الخطوات التالية. انتقل إلى ملف server.js في محرر النصوص البرمجية وعدل الأسطر التالية: ... app.listen(process.env.PORT || 3000, () => { console.log(`Example app is listening on port ${process.env.PORT || 3000}`); }); يتيح الاستخدام الشرطي للمتغير PORT تشغيل الخادم ديناميكيًا على المنفذ المعين PORT في متغير البيئة process.env أو استخدام المنفذ 3000 كمنفذ احتياطي. لاحظ أن السلسلة الموجودة في التابع console.log ليست محاطة بعلامة اقتباس عادية وإنما بعلامة اقتباس مائلة (`) ، إذ يتيح ذلك استخدام القوالب النصية template literals التي تسمح باستخدام التعابير expressions ضمن السلاسل. شَغّل التطبيق من واجهة الطرفية Terminal باستخدام الأمر التالي: node server.js لاحظ أن واجهة المتصفح ستعرض الرسالة التالية: "Successful response" أي أنه نجحت الاستجابة، وسيظهر الخرج التالي في واجهة الطرفية: Example app is listening on port 3000 سننشر الآن التطبيق على منصة App platform بعد أن تأكدنا من عمل خادم Express بنجاح. أولاً ، هيئ git في المجلد الرئيسي للمشروع وأرسل الشيفرة إلى حسابك في GitHub، ثم انتقل إلى لوحة التحكم Dashboard في منصة App Platform في المتصفح وانقر على زر إنشاء التطبيق Create App. ثم اضغط على خيار GitHub وتوثيق مع GitHub، ثم اختر مستودع مشروعك من القائمة المنسدلة. راجع الإعدادات، ثم سمي التطبيق، وبما أننا سنعمل على مرحلة تطوير التطبيق في هذا المقال يُفضل أن نختار الخطة الأساسية Basic Plan، ثم اضغط على زر تشغيل التطبيق Launch App. انتقل بعد ذلك إلى صفحة الإعدادات Settings واضغط على قسم النطاقات Domains ثم أضف النطاق الخاص بك الموجه بواسطة Cloudflare في حقل اسم النطاق الرئيسي أو الفرعي Domain or Subdomain Name، ثم اضغط على خيار إدارة النطاق الخاص بك You manage your domain وانسخ سجل CNAME لتضيفه إلى حساب DNS الخاص بنطاقك في Cloudflare. افتح لوحة تحكم النطاق في Cloudflare في علامة تبويب جديدة، ثم اضغط على تبويبة DNS، واضغط بعدها على زر إضافة سجل Add Record واختر CNAME عند خيار النوع Type، اكتب الرمز @ ثم الصق سجل CNAME الذي نسخته سابقًا من منصة App Platform. اضغط على زر الحفظ Save ثم انتقل إلى صفحة الإعدادات Settings في لوحة تحكم App platform واضغط بعدها على قسم النطاقات Domains، ثم اضغط على زر إضافة نطاق Add Domain. اضغط على علامة تبويب عمليات النشر Deployments لمشاهدة تفاصيل التطبيقات المنشورة. يمكنك الضغط على نطاقك your_domain لاستعراضه في المتصفح، حالما ينتهي النشر. لاحظ أن واجهة المتصفح ستعرض الرسالة التالية: نجحت الاستجابة "successful response". ستحصل على الرسالة التالية عند الانتقال إلى علامة تبويب سجلات التشغيل الحالية Runtime Logs في لوحة تحكم App Platform: Example app is listening on port 8080 لاحظ أن المنفذ 8080 هو المنفذ الافتراضي في App Platform، يمكنك تغييره من الإعدادات قبل النشر. الآن، سنتعلم كيفية تحديد ذاكرة التخزين المؤقت cache لحساب الطلبات الواردة إلى مُقيِّد معدل التراسل Rate limiter. تخزين عنوان IP المستخدم وحساب عدد الطلبات في الثانية سنخزن في هذه الخطوة عنوان IP المستخدم في ذاكرة تخزين مؤقتة cache مع مجموعة من الطوابع الزمنية timestamps لمراقبة عدد الطلبات في الثانية من عنوان IP لكل مستخدم. تُخزن ذاكرة التخزين المؤقت البيانات التي يستخدمها تطبيق ما بشكل متكرر، ويُحتفظ عادةً بالبيانات الموجودة في ذاكرة التخزين المؤقت في أجهزة الوصول السريع مثل ذاكرة الوصول العشوائي RAM، فالغرض الأساسي منها هو تسريع استرداد البيانات عن طريق تقليل الحاجة إلى استردادها من وسائط التخزين الأبطأ. سنحتاج إلى ثلاثة حزم من برنامج مدير الحزم npm وهي node-cache وis-ip و request-ip. فتلتقط الحزمة request-ip عنوان IP المستخدم الذي يطلب الخادم، أما الحزمة node-cache فتنشئ ذاكرة تخزين مؤقتة تستخدم لتتبع طلبات المستخدم، وتستخدم الحزمة is-ip للتحقق فيما إذا كان عنوان IP هو عنوان IPv6. ثبت الحزم node-cache وis-ip و request-ip في الطرفية باستخدام مدير الحزم npm عن طريق الأمر التالي: npm i node-cache is-ip request-ip افتح ملف server.js بواسطة إحدى محررات النصوص البرمجية وأضف الأسطر التالية بعد سطر const express = require('express');: ... const requestIP = require('request-ip'); const nodeCache = require('node-cache'); const isIp = require('is-ip'); ... يحضّر السطر الأول وحدة requestIP من حزمة request-ip التي ثبتها سابقًا، فتقوم هذه الوحدة بإلتقاط عنوان IP المستخدم الذي يطلب الخادم. أما السطر الثاني فيحضّر وحدة nodeCache من حزمة node-cache، التي تنشئ ذاكرة تخزين مؤقتة تستخدم لتتبع طلبات المستخدم في الثانية. ويحضّر السطر الثالث وحدة isIp من الحزمة is-ip، ويتحقق فيما إذا كان عنوان IP من الإصدار السادس IPv6 الذي سوف تصوغه وفق ترميز CIDR المعتمد في Cloudflare. عَرِّف المتغيرات الثابتة في ملف server.js: ... const TIME_FRAME_IN_S = 10; const TIME_FRAME_IN_MS = TIME_FRAME_IN_S * 1000; const MS_TO_S = 1 / 1000; const RPS_LIMIT = 2; يحدد المتغير الثابت TIME_FRAME_IN_S الفترة التي يحسب خلالها تطبيقك متوسط الطوابع الزمنية للمستخدم، ويجدر بالذكر أن زيادة الفترة الزمنية سيؤدي إلى زيادة حجم الذاكرة المؤقتة، وبالتالي سيؤدي إلى استهلاك حجم أكبر من الذاكرة. ويحدد المتغير الثابت TIME_FRAME_IN_MS الفترة التي يحسب خلالها تطبيقك متوسط الطوابع الزمنية للمستخدم، ولكن بالميللي ثانية، وسنستخدم معامل التحويل MS_TO_S لتحويل الزمن من صيغة الميللي ثانية إلى صيغة الثواني. يحدد المتغير RPS_LIMIT حد العتبة الذي سيؤدي إلى تشغيل مقيد معدل التراسل، ويغير قيمة العتبة وفقًا لمتطلبات التطبيق، وقد أسندنا له القيمة 2 والتي تعتبر قيمة معتدلة، في المتغير RPS_LIMIT أثناء مرحلة التطوير. يمكنك باستخدام إطار العمل Express كتابة دوال وسيطة middleware لها وصول إلى جميع طلبات HTTP الواردة إلى خادمك. استدعِ التابع ()app.use لتعريف دالة وسيطة، ومررها ضمنه، باتباع هذه الطريقة أنشئ دالة وسيطة باسم ipMiddleware: ... const ipMiddleware = async function (req, res, next) { let clientIP = requestIP.getClientIp(req); if (isIp.v6(clientIP)) { clientIP = clientIP.split(':').splice(0, 4).join(':') + '::/64'; } next(); }; app.use(ipMiddleware); ... لاحظ أن الدالة ()getClientIP تستخدم الكائن req من الدالة الوسيطة كمعامل. نستدعي الدالة ()v6. مع الوحدة is-ip، وتعطي نتيجة صحيحة true إذا كان الوسيط الممرر إليها عنوان IPv6. يجب عليك صياغة عناوين IPv6 وفق قناع شبكة 64/ حسب ترميز CIDR، كالآتي: aaaa:bbbb:cccc:dddd::/64 ينشئ التابع (':')split. مصفوفة من السلسلة التي تحتوي على عناوين IP ويفصلهم بواسطة المحرف:. يرجع التابع (splice(0,4. أول أربعة وسطاء في المصفوفة. أما التابع (':')join. فيرجع سلسلة من المصفوفة مع المحرف :. يوجه التابع ()next الدالة الوسيطة للانتقال إلى الدالة الوسيطة التالية، إن وجدت، ونلاحظ في مثالنا أنها تنقل الطلب إلى المسار / من طلب GET. احرص على تضمين ذلك في التابع، وإلا فلن ينتقل الطلب من الدالة الوسيطة. هيئ نسخة instance من الوحدة node-cache عن طريق إضافة المتغير التالي بعد الثوابت: ... const IPCache = new nodeCache({ stdTTL: TIME_FRAME_IN_S, deleteOnExpire: false, checkperiod: TIME_FRAME_IN_S }); ... يمكننا إعادة تعريف المعاملات overriding الأساسية الخاصة بوحدة nodecache وتبديلها إلى خصائص محددة custom properties باستخدام المتغير الثابت IPCache: stdTTL: يعبر عن الفاصل الزمني بالثواني الذي يُحذَف بعده زوج مفتاح-قيمة key-value من عناصر ذاكرة التخزين المؤقت. TTL تعني وقت الحياة Time To Live، وهي مقياس للوقت الذي تنتهي بعده ذاكرة التخزين المؤقت. deleteOnExpire: اضبطه على falseحيث أننا سنكتب تابع استدعاء فيما بعد ليتعامل مع الحدث expired. *checkperiod يعبر عن الفاصل الزمني بالثواني الذي يُشغَل بعده فحص تلقائي للعناصر منتهية الصلاحية. تكون القيمة الإفتراضية 600، لكن فحص انتهاء الصلاحية في تطبيقك سيحدث في وقت أقصر، لأن القيمة المحددة أصغر. يمكنك الإطلاع على توثيق node-cache للحصول على مزيد من المعلومات عن المعاملات الإفتراضية لحزمة node-cache. سيساعدك المخطط التالي على تصور كيفية تخزين ذاكرة التخزين المؤقت للبيانات: سننشئ الآن زوج مفتاح-قيمة لعنوان IP الجديد ونضيفه للزوج القديم في حال وجود عنوان IP في الذاكرة المؤقتة. تكون القيمة عبارة عن مصفوفة من العلامات الزمنية timestamps المقابلة لكل طلب وارد إلى تطبيقك. أنشئ الدالة ()updateCache بعد المتغير الثابت IPCache لإضافة علامات زمنية للطوابع في الذاكرة المؤقتة: ... const updateCache = (ip) => { let IPArray = IPCache.get(ip) || []; IPArray.push(new Date()); IPCache.set(ip, IPArray, (IPCache.getTtl(ip) - Date.now()) * MS_TO_S || TIME_FRAME_IN_S); }; ... لاحظ أن السطر الأول في الدالة يحضر مجموعة العلامات الزمنية لعنوان IP المحدد أو يهيئ مصفوفة فارغة إذا كان فارغًا. نقوم في السطر التالي بإضافة العلامة الزمنية الحالية التي التقطت بواسطة الدالة ()new Date إلى المصفوفة. تأخذ الدالة ()set. ثلاثة وسطاء هي : key و value وTTL، فيعيد الوسيط الأخير تعريف قيمة TTL القياسية عن طريق استبدال قيمة stdTTL في المتغير IPCache، ويستخدم TTL الحالية إذا كان عنوان IP موجودًا في الذاكرة المؤقتة، عدا عن ذلك تُحَدد قيمة TTL من المتغير TIME_FRAME_IN_S. تُحسَب قيمة TTL لزوج مفتاح-قيمة الحالي عن طريق طرح قيمة العلامة الزمنية الحالية من العلامة الزمنية لانتهاء الصلاحية، وتُحَول النتيجة إلى ثواني ثم تُمَرر إلى حقل الوسيط الثالث في الدالة ()set.. تقبل الدالة ()getTtl. مفتاحًا وعنوان IP كوسطاء وترجع زمن TTL للزوج مفتاح-قيمة كعلامة زمنية، وفي حال عدم وجود عنوان IP في الذاكرة المؤقتة، تُرجِع undefined وتستخدم القيمة الاحتياطية في المتغير TIME_FRAME_IN_S. أضف الأسطر التالية في الدالة الوسيطة ipMiddleware بعد تعليمة if (isIp.v6(clientIP)) لحساب عدد الطلبات في الثانية من عنوان IP الذي يطلب التطبيق: ... updateCache(clientIP); const IPArray = IPCache.get(clientIP); if (IPArray.length > 1) { const rps = IPArray.length / ((IPArray[IPArray.length - 1] - IPArray[0]) * MS_TO_S); if (rps > RPS_LIMIT) { console.log('You are hitting limit', clientIP); } } ... يضيف السطر الأول الطابع الزمني للطلب الوارد من عنوان IP إلى ذاكرة التخزين المؤقت عن طريق استدعاء دالة ()updateCache، ويجمع السطر الثاني مجموعة العلامات الزمنية لعنوان IP. إذا كان عدد العناصر في مصفوفة العلامات الزمنية أكبر من واحد (إذ يحتاج حساب الطلبات في الثانية إلى علامتين زمنيتين على الأقل)، وعدد الطلبات في الثانية هو أكبر من قيمة العتبة التي حددناها في الثوابت، إذا سوف يطبع عنوان IP في لوحة التحكم console. يحسب المتغير rps عدد الطلبات في الثانية عن طريق تقسيم عدد الطلبات على فارق الفاصل الزمني، ثم يحول النتيجة إلى الثانية. بما أننا اسندنا القيمة false إلى الخاصية deleteOnExpire في المتغير IPCache، علينا الآن التعامل يدويُا مع الحدث expired، فتوفر وحدة node-cache دالة استدعاء تُشَغل الحدث expired. أضف الأسطر التالية بعد المتغير IPCache: ... IPCache.on('expired', (key, value) => { if (new Date() - value[value.length - 1] > TIME_FRAME_IN_MS) { IPCache.del(key); } }); ... تقبل دالة رد النداء()on. مفتاح key وقيمة value العنصر منتهي الصلاحية كوسطاء، وتكون value عبارة عن مصفوفة علامات زمنية للطلبات مخزنة في الذاكرة المؤقتة. يتحقق السطر المحدد الثاني من العنصر الأخير في مصفوفة القيم بمقارنته مع المتغيرTIME_FRAME_IN_S، إذ يطرح آخر عنصر في مصفوفة القيم value من الدالة new Date() (الوقت الحالي)، فإذا كانت النتيجة أصغر من قيمة المتغير TIME_FRAME_IN_S تأخذ الدالة .del() المفتاحkey كوسيط وتحذف العنصر منتهي الصلاحية من ذاكرة التخزين المؤقت. ... else { const updatedValue = value.filter(function (element) { return new Date() - element < TIME_FRAME_IN_MS; }); IPCache.set(key, updatedValue, TIME_FRAME_IN_S - (new Date() - updatedValue[0]) * MS_TO_S); } ... يوفر تابع المصفوفات المحلي filter() في جافاسكريبت دالة استدعاء لترشيح العناصر الموجودة في مصفوفة العلامات الزمنية. يتحقق السطر الثالث من الشيفرة السابقة من نتيجة طرح العناصر من الدالة new Date() إذا كانت أصغر من المتغير TIME_FRAME_IN_S ويخزن النتيجة في المتغير updatedValue ثم تضاف العناصر التي تمت تصفيتها إلى المتغير updatedValue. يؤدي ذلك إلى تحديث ذاكرة التخزين المؤقت بالعناصر التي تمت تصفيتها في المتغير updatedValue وزمن TTL الجديد. تحفز قيم TTL التي تطابق العنصر الأول من المتغير updatedValue تشغيل دالة .on('expired')عندما تحذف الذاكرة المؤقتة العنصر التالي. وتحسب قيمة زمن TTL الجديد عن طريق حساب الفرق بين المتغير TIME_FRAME_IN_S والوقت منتهي الصلاحية منذ أول علامة زمنية للطلب في المتغير updatedValue. شَغّل التطبيق من واجهة الطرفية: node server.js انتقل إلى العنوان localhost:3000 في متصفح الويب، ولاحظ أن المتصفح سوف يعرض الرسالة: "Successful response"، ثم جرب حَدِث الصفحة عدة مرات حتى تتجاوز قيمة المتغير RPS_LIMIT ولاحظ النتيجة التي ستعرضها الطرفية: Example app is listening on port 3000 You are hitting limit ::1 ملاحظة: يظهر عنوان localhost IP على الشكل ::1، لكن ذلك سيتغير، إذ يلتقط تطبيقك العنوان العام Public IP للمستخدم عند نشره خارج الخادم المحلي localhost. أصبح بإمكان تطبيقك تتبع طلبات المستخدم وتخزين العلامات الزمنية في ذاكرة التخزين المؤقت. سنتعلم في الخطوة التالية كيفية استخدام واجهة برمجة تطبيقات Cloudflare لإعداد جدار الحماية Firewall. إعداد جدار حماية Cloudflare سنتعلم في هذه الخطوة كيفية إعداد جدار حماية Cloudflare لإيقاف عناوين IP عند الوصول إلى الحد المعين، وكيفية إنشاء متغيرات البيئة environment variables، واستدعاء واجهة برمجة تطبيقات Cloudflare. سجل الدخول في لوحة تحكم Cloudflare، ثم اذهب إلى الصفحة الرئيسية لحسابك ومنها اضغط على علامة تبويب الإعدادات Configurations، ثم قوائم Lists. أنشئ قائمة جديدة باسم your_list. افتح لوحة تحكم النطاق الخاص بك your_domain من الصفحة الرئيسية Home، ثم اضغط على علامة تبويب الجدار الناري Firewall واضغط على قواعد الجدار الناري Firewall Rules ثم على إنشاء قاعدة جديدة Create a Firewall rule وسَمِها باسم تختاره مثل your_rule_name مجازًا. اختر عنوان المصدر IP Source Address من القائمة المنسدلة، واختر is in list عند خيار المُشغِل Operator، و your_list عند خيار القيمة Value، ثم اضغط على حجب Block من القائمة المنسدلة للخيار Choose an action، واضغط بعدها على زر نشر Deploy. أنشئ ملفًا بصيغة env. في المجلد الرئيسي للمشروع وأضف عليه الأسطر التالية حتى نتمكن من استدعاء واجهة تطبيقات Cloudflare من تطبيقنا: ACCOUNT_MAIL=your_cloudflare_login_mail API_KEY=your_api_key ACCOUNT_ID=your_account_id LIST_ID=your_list_id انتقل إلى قسم الملف الشخصي My Profile في لوحة تحكم Cloudflare، ثم اضغط على علامة تبويب وحدات واجهة التطبيقات API Tokens للحصول على قيمة API_KEY، ثم اضغط على عرض View في قسم Global API Key واكتب كلمة المرور الخاصة بك. انتقل إلى علامة تبويب الإعدادات Configuration ثم إلى قسم القوائم Lists، واضغط على زر تعديل Edit بجانب القائمة your_list التي أنشأتها. يمكنك الحصول على معرف الحساب ACCOUNT_IDومعرف القائمة LIST_ID من عنوان URL من المتصفح الذي يكون على الصيغة التالية: https://dash.cloudflare.com/your_account_id/configurations/lists/your_list_id تنبيه: احرص على أن يكون محتوى الملف env. سريًا وليس متاحًا للجميع، وذلك عن طريق إضافته ضمن ملف gitignore. الذي أنشأناه في الخطوة الأولى. ثبت حزمة axios و dotenv في الطرفية بواسطة مدير الحزم: npm i axios dotenv أضف الأسطر التالية بعد سطر المتغير nodeCache: ... const axios = require('axios'); require('dotenv').config(); ... يحضر السطر الأول وحدة axios من حزمة axios المثبتة، وسنستخدم هذه الوحدة لإجراء استدعاءات إلى واجهة برمجة تطبيقات Cloudflare. يُعِد السطر الثاني وحدة dotenv ويفَعّل المتغير العام process.env الذي سيعرف قيم ملف env. في ملف server.js. أضف الأسطر البرمجية التالية إلى تعليمة If الشرطية التالية if (rps > RPS_LIMIT) فوق السطر:console.log('You are hitting limit', clientIP) حتى تتمكن من استدعاء واجهة برمجة تطبيقات Cloudflare: ... const url = `https://api.cloudflare.com/client/v4/accounts/${process.env.ACCOUNT_ID}/rules/lists/${process.env.LIST_ID}/items`; const body = [{ ip: clientIP, comment: 'your_comment' }]; const headers = { 'X-Auth-Email': process.env.ACCOUNT_MAIL, 'X-Auth-Key': process.env.API_KEY, 'Content-Type': 'application/json', }; try { await axios.post(url, body, { headers }); } catch (error) { console.log(error); } ... أصبح بإمكاننا الآن الاتصال بواجهة برمجة تطبيقات Cloudflare عن طريق العنوان URL لإضافة عنصر، وفي حالتنا سنضيف عنوان IP إلى القائمة your_list، إذ تظهر واجهة برمجة تطبيقات Cloudflare المتغيران ACCOUNT_MAIL و API_KEY في ترويسة الطلب على الشكل X-Auth-Email و X-Auth-Key. أما جسم الطلب فيتألف من عنوان IP الذي سيضاف إلى القائمة وتعليق comment له القيمة your_comment. ضع في الحسبان أنه يمكنك استبدال التعليق comment بالتعليق الذي يحلو لك لتمييز القيمة المدخلة. يوضع الطلب POST المستدعى على الشكل ()axios.post ضمن الكتلة البرمجية try-catch لمعالجة الأخطاء، إن وجدت، فتحتاج الدالة axios.post إلى الوسطاء التالية: url، body، headers لإنشاء الطلب. يجب عليك تغيير قيمة المتغير clientIP عند تجريب الطلبات إلى عنوان IP تجريبي مثل: 198.51.100.0/24 لأن Cloudflare لايقبل عنوان الخادم المحلي localhost: ... let clientIP = '198.51.100.0/24'; ... شغل التطبيق من واجهة الطرفية: node server.js انتقل إلى العنوان localhost:3000 في المتصفح وستلاحظ ظهور الرسالة: "Successful response". حَدِث الصفحة عدة مرات حتى تتجاوز قيمة المتغير RPS_LIMIT ولاحظ النتيجة التي ستعرضها الطرفية: Example app is listening on port 3000 You are hitting limit ::1 انتقل الآن إلى صفحة لوحة تحكم Cloudflare ثم إلى صفحة القوائم your_list حيث سيظهر عنوان IP الذي أضفناه في القائمة your_list، ثم ستظهر صفحة الجدار الناري بعد إرسال التغييرات إلى GitHub. انشر تطبيقك بعد حفظ التعديلات وارفع الشيفرة على GitHub، وبنا أننا فعّلنا خيار النشر التلقائي auto-deploy سيرسل الكود تلقائيًا من GitHub إلى منصة App Platform لنشره. ستحتاج إلى إضافة ملف env. إلى منصة App Platform في قسم متغيرات بيئة التطبيق App-Level Environment Variables من تبويبة الإعدادات Settings. أضف زوج مفتاح-قيمة إلى ملف env. كي يستطيع تطبيقك الوصول إلى محتوياته من App Platform. انتقل إلى نطاقك في المتصفح بعد انتهاء النشر وحَدِث الصفحة باستمرار حتى تصل إلى الحد RPS_LIMIT، عندها سيظهر المستعرض صفحة الجدار الناري من Cloudflare: ستحصل على الرسالة التالية عند الانتقال إلى علامة تبويب سجلات التشغيل الحالية Runtime Logs في لوحة تحكم App Platform: You are hitting limit your_public_ip يمكنك التأكد من أن الجدار الناري يحظر عنوان IP المحدد في القائمة your_list فقط، عن طريق الدخول إلى نطاقك your_domain من جهاز أخر أو عبر اتصال VPN، ويمكنك حذف عنوان IP من لوحة تحكم Cloudflare. قد يتطلب الحصول على رد من الجدار الناري بضع ثوان بسبب الرد المخزن سابقُا في المتصفح. مبارك! لقد أعددت جدار Cloudflare الناري لحظر عناوين IP عندما يصل المستخدمون إلى حد معدل التراسل عن طريق استدعاء واجهة برمجة تطبيقات Cloudflare. ختامًا تعلمنا في هذا المقال كيفية إنشاء مشروع Node.js ونشره على منصة App Platform من DigitalOcean وتوجيهه للاتصال بنطاقك Cloudflare، وطبقنا إجراء حماية للنطاق من زيادة حد معدل التراسل عن طريق إعداد الجدار الناري في Cloudflare. يمكنك، فيما بعد، تعديل قاعدة الجدار الناري لإظهار تحدٍ JS Challenge أو رمز تحقق كابتشا CAPTCHA بدلاً من حظر المستخدم، اطلع على مستندات Cloudflare لمزيد من التفاصيل حول ذلك. وللحصول على المساعدة والدعم يمكنك إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة- وبتصرف للمقال How To Build a Rate Limiter With Node.js on App Platform لصاحبه Abel Mathew اقرأ أيضًا بناء تطبيق Node.js باستخدام Docker دمج قاعدة البيانات MongoDB في تطبيقك Node إدارة المستخدمين في تطبيق Node.js باستعمال قواعد بيانات MongoDB ومكتبة Mongoose حفظ بيانات تطبيقات Node.js في قاعدة بيانات MongoDB اختبار الواجهة الخلفية لتطبيقات Node.js عبر مكتبة Jest
-
يوفر نظام ألعاب الفيديو Wii المقدم من شركة نينتندو Nintendo واجهةً فريدةً تسمح للاعبين بالانغماس في تجربة اللعب. سنصمم في هذا المقال قبضة تحكم Nintendo Wii باستخدام برنامج الفوتوشوب، حيث لن تحتاج سوى إلى معرفة الأساسيات للحصول على النتيجة التالية: تصميم الخلفية: أنشئ مستندًا جديدًا بقياس 30x50 بوصة، ثم أنشئ طبقة layer جديدة ولونها بأي لون تختاره، ثم طبق تراكب تدرجي Gradient Overlay من نافذة خيارات المزج Blending options وفق الاعدادات التالية: تصميم شكل القبضة: أنشئ طبقةً جديدةً ثم استخدم أداة المستطيل ذات الحواف المستديرة Rounded rectangle Tool واختصارها U بنصف قطر Radius بمقدار 22 بكسل، لإنشاء شكل القبضة. استخدم إعدادات المزج التالية للحصول على نفس النتيجة: عملية إضافة اللمعان: أنشئ طبقةً جديدةً لإضافة بعض اللمعان على القبضة، وارسم خطًا أبيضًا مستقيمًا مثل التالي: حدد الطبقة الجديدة، واضغط باستمرار على مفتاح CTRL، ثم انقر على طبقة جسم القبضة؛ أو حدد الطبقة الجديدة، ثم اضغط على تحديد Select، ثم تحميل التحديد Load Selection، وانقر على موافق. حدد اللون الأبيض، ثم انقر على أداة الفرشاة Brush Tool واختصارها B، واختر الفرشاة ذات الحواف الخشنة المدورة. غَيّر القطر الرئيسي إلى 600 بكسل، وانقر مرةً واحدةً لإضفاء تأثير توهج داخلي. اضغط مفتاحي Ctrl + D لإزالة تحديد الشكل، ثم طبق شفافية Opacity للطبقة بمقدار 50%، ثم اختر أداة الممحاة واختصارها E وخفض شفافيتها، ثم استخدمها لمسح القليل من اللمعان: إضافة مكبرات الصوت: أنشئ طبقةً جديدةً واختر اللون التالي #3a3a3a، ثم أنشئ مجموعة دوائر باستخدام أداة الفرشاة، وذلك باتباع الأحجام الموضحة في الصورة التالية: انسخ الطبقة بالضغط على مفتاحي Ctrl + J وطبق عليها إعدادات المزج التالية: ضع الطبقة المنسوخة تحت الطبقة القديمة للحصول على نتيجة مماثلة لما يلي: أضواء الليد: أنشئ طبقةً جديدة وارسم مستطيلًا أسفلها باستخدام اللون 858585#، ثم انسخه مرتين. أنشئ طبقة جديدة لإضافة اللمعان على المستطيلات التي ستكون بمثابة أضواء الليد LED، وذلك بتطبيق إعدادات المزج التالية: ستحصل على النتيجة التالية: أنشئ طبقةً جديدة، ثم باستخدام أداة الفرشاة بحجم 3 بكسل، ارسم دائرةً واحدةً فوق المستطيل الأول، ودائرتين فوق الثاني، وهكذا. نحتاج إلى اختيار نفس لون جسم القبضة، لكننا سنطبق تأثير التراكب اللوني Color Overlay لنستطيع تمييز ما نفعله، وعند الانتهاء، ألغِ تأثير التراكب اللوني Color Overlay وطبق تأثير Bevel and Emboss وفق الإعدادات التالية: مفتاح التشغيل: أنشئ طبقةً جديدةً، ثم ارسم دائرة باستخدام أداة الفرشاة. طبق عليها إعدادات المزج التالية: ستحصل على نتيجة مماثلة لما يلي: أنشئ الآن طبقةً جديدةً لإنشاء رمز التشغيل، وارسم دائرةً رماديةً صغيرةً داخل المفتاح، كما يلي: ثم أنشئ تحديدًا دائريَا صغيرًا كالتالي، ثم احذفه: أنشئ الآن تحديدًا مستطيلًا، ثم احذفه: أنشئ الآن تحديدًا عاموديًا صغيرًا واملأه: يجب أن تحصل على نتيجة مشابهة لما يلي: طبق إعدادات المزج التالية: اكتب كلمة POWER باستخدام أداة النص Text Tool واختصارها T، استخدم الخط Kartika واللون 8a8888#. تصميم الشعار: استخدم أداة النص لكتابة شعار "Wii" باستخدام الخط Sony Sketch EFF واللون #989898. مفتاح القائمة الرئيسية: أنشئ طبقة جديدة، ثم ارسم دائرةً فوق المكبر: طبق إعدادات المزج التالية: انسخ الطبقة وأضف إلى الطبقة الجديدة الإعدادات التالية: ضع الطبقة الجديدة خلف الطبقة الأصلية، ثم أنشئ تحديدًا حول إحدى الطبقتين، وأنشئ طبقةً جديدة. اختر اللون الأبيض واستخدم أداة الفرشاة باتباع الخطوات التي نفذناها في الخطوة الثالثة للحصول على النتيجة التالية: أنشئ طبقةً جديدة، ثم ارسم فيها منزلًا صغيرًا باللون #31befa، ثم اكتب "HOME" أسفل المفتاح الرئيسي باستخدام الخط Kartika أو الخط Simplified Arabic واللون 878686#. زر التخفيض (-): طبق إعدادات المزج التالية: كرر ما فعلناه في الخطوة السابقة للحصول على تأثير اللمعان. أنشئ طبقةً جديدةً وارسم خطًا أفقيًا مستقيمًا باللون الرمادي. زر الزيادة (+): أنشئ طبقةً جديدةً وارسم دائرةً على يمين زر القائمة الرئيسية. كرر ما فعلناه في الخطوة السابقة، وارسم علامة زائد باللون الرمادي في منتصف الدائرة. إضافة الزر (A): أنشئ طبقةً جديدةً فوق زر القائمة، ثم أنشئ دائرةً أكبر ولوّنها بالاسود. طبق الإعدادات التالية: يجب أن تحصل على النتيجة التالية: ثم أنشئ طبقةً جديدةً لإضافة تأثير اللمعان كما في الخطوات السابقة. أنشئ طبقةً جديدةً أصغر من حجم الزر بقليل، واملأه باللون الأبيض، ثم امسح بعض أجزائه كما يلي: اكتب الحرف A باللون الرمادي داخل الزر باستخدام الخط Simplified Arabic. إضافة الزرين 1 و 2: أنشئ طبقةً جديدةً وارسم عليها دائرةً باللون الرمادي. انسخ الدائرة وحركها لليمين قليلًا: طبق الإعدادات التالية: أضف تأثير اللمعان: اكتب الرقم 2 داخل الزر باستخدام الخط Kartika. انسخ هذه الطبقة واكتب الرقم 1 داخل الزر، ثم حرك الدائرة الرمادية للحصول على مظهر مختلف عن الزر الآخر. إضافة لوحة التحكم: استخدم أداة المستطيل ذات الحواف المستديرة بحجم 2 بكسل لإضافة أزرار التحكم، أنشئ طبقةً جديدةً واتّبع الخطوات التالية: أنشئ مستطيلًا عموديًا: ثم أنشئ مستطيلًا أفقيًا: طبق اعدادات المزج التالية: أنشئ طبقةً جديدةً وطبق عليها تأثير اللمعان لإضفاء بعض الحيوية على القبضة، ثم أنشئ طبقةً جديدةً وأضف عليها أربعة خطوط مستقيمة كما يلي: تُعَد هذه الخطوة اختيارية، يمكنك تغيير لون مفتاح التشغيل من اللون الرمادي للأحمر لإضفاء مظهر أكثر واقعية على قبضة التحكم. حدد طبقة قبضة التحكم وطبق عليها اعدادات المزج التالية: أضف طبقةً جديدةً لإضافة بعض الظلال واللمعان أعلى القبضة، واستخدم فرشاة ذات لون رمادي: إضافة انعكاس: حدد جميع الطبقات عدا طبقة الخلفية، وذلك بالضغط على مفتاح Ctrl أو Shift والنقر على الطبقات، ثم انقر على إحدى الطبقات بالزر الأيمن واختر دمج الطبقات Merge Layers، ثم انسخ الطبقة بالنقر على مفتاحي Ctrl + J وانقر على قائمة تحرير Edit ثم Transform ثم اقلب عاموديًا Flip horizontal. ضع الطبقة الجديدة خلف القديمة واخفض قيمة الشفافية Opacity. لتحصل على النتيجة التالية: ختامًا يشرح هذا المقال كيفية تصميم قبضة تحكم واقعية للمبتدئين، كما يمكنك الاستفادة من جميع الملاحظات والحيل التي نفذناها في المقال لإنشاء عبوات وتصاميم واقعية. إذا واجهت مشاكل مع برنامج فوتوشوب، فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال How to Recreate the Nintendo Wii Controller in Photoshop من الموقع. اقرأ أيضًا أهم الأخطاء التي يجب تجنبها أثناء تصميم الأيقونات كيفية تكبير وتحويل وتغيير حجم عنصر في الفوتوشوب كيفية إنشاء أنماط Patterns رسومية تفصيلية باستخدام برنامج فوتوشوب كيفية تصميم تأثير الجلد على النصوص في الفوتوشوب
-
ستظهر لك عدة خيارات عند الانتقال إلى صفحة التنزيلات Download في الموقع الرسمي لتوزيعة أوبنتو Ubuntu، منها إصدار خادم أوبنتو Ubuntu Server وإصدار الحاسوب الموجه للمستخدم العادي Ubuntu Desktop. قد يبدو الأمر مربكًا للمستخدمين الجدد، لماذا يوجد إصداران، بل أربعة إصدارات؟ وأيها يجب أن تستخدم؟ هل هذه الإصدارات متماثلة، وما الفرق بينها؟ سنتعرف في هذا المقال على الفرق بين نسختي الخادم والمستخدم من أوبنتو، وأي منها يجب أن تستخدم. حتى نميز الفرق بين خادم أوبنتو ومستخدم أوبنتو، يجب أن ندرك أولًا الفرق بين نظام تشغيل الخادم ونظام التشغيل ذي الواجهات الرسومية (نظام تشغيل الحاسوب المكتبي). نظام تشغيل الحاسوب المكتبي يُشار عادةً إلى الحاسوب الشخصي بحاسوب مكتبي أو كلمة Desktop باللغة الانجليزية، ويوفر نظام تشغيل الحاسوب المكتبي واجهة مستخدم رسومية يتحكم بها المستخدم بواسطة الفأرة ولوحة المفاتيح بكل سهولة، حيث أن الهدف الرئيسي لهذا النظام هو توفير إمكانية تصفح الويب، وتعديل المستندات، وعرض الصور أو الفيديو وتعديلها، بالإضافة إلى استخدام الألعاب وكتابة الأكواد البرمجية؛ أي توفير حاسوب للاستخدامات العامة للأشخاص، و المستخدمين العاديين، وأفراد العائلة. سنستخدم في هذا المقال مصطلح "حاسوب مكتبي" والذي يشمل الحاسوب المحمول أيضًا، فهو المصطلح العام للتعبير عن أي حاسوب شخصي. نظام تشغيل الخادم يُسهل نظام تشغيل الخادم تفعيل خدمات الاستضافة على الويب، مثل استضافة المواقع الالكترونية، والتطبيقات، وخوادم الوسائط المرئية وقواعد البيانات، وغيرها. لا يُزود هذا النظام عادةً بواجهة رسومية، بل يجب عليك التعامل مع النظام عن طريق كتابة الأوامر في سطر الأوامر أو ما يعرف بالطرفية Terminal، كما في أنظمة التشغيل المبنية على نظام لينكس Linux. وتكمن ميزة هذه النظم بأن نظام التشغيل لا يتطلب ذاكرة وصول عشوائية RAM ذات حجم كبير أو حاسوب ذو قدرات حوسبة عالية، لأنها لاتتعامل مع بيئة سطح مكتب رسومية. كما يُزود نظام تشغيل الخادم بحزم لها إعداداتها الخاصة. بت الآن تعرف الفرق بين إصداري خادم أوبنتو ومستخدم أوبنتو بعد أن أوضحنا الفرق بين نظامي الخادم والحاسوب المكتبي. واجهة المستخدم تُعد واجهة المستخدم أحد أبرز الفروق بين نسخة الخادم ونسخة نظام الحاسوب المكتبي أو نسخة المستخدم من أوبنتو، حيث أن نسخة المستخدم تعتمد واجهة غنوم Gnome الرسومية ويتم التعامل معها بسهولة باستخدام الفأرة. لا يوفر إصدار نظام تشغيل الخادم واجهة رسومية، ويعتمد فقط واجهة طرفية تظهر عند تسجيل الدخول إليه يمكن التحكم بها عن بُعد من حواسيب أخرى باستخدام بروتوكول الاتصال الآمن SSH. طريقة التنزيل يُعد تثبيت نسخة مستخدم أوبنتو أمرًا سهلًا بفضل واجهة التثبيت الرسومية، كما يمكنك تجريب نسخة USB مباشرة أولًا ثم تنزيلها في بضع دقائق، في حال أعجبتك، باتباع تعليمات التثبيت التي ستظهر لك على الشاشة. لايُعد تثبيت إصدار الخادم من أوبنتو أمرًا سهلًا، على خلاف إصدار المستخدم، لأنك ستضطر إلى استخدام الطرفية لتثبيته، فإن لم يكن التعامل مع الطرفية مألوفًا بالنسبة لك ستواجه صعوبة في تنفيذ المهام، حتى أبسطها كالاتصال بشبكة الواي فاي Wi-Fi. التطبيقات تركز التطبيقات الأساسية في واجهة المستخدم من أوبنتو على المستخدمين العاديين؛ فهي تشمل متصفحات الويب، والبرامج المكتبية، ومشغلات الوسائط والألعاب وغيرها. بينما تكون تطبييقات خادم أوبنتو مخصصة لخدمات الويب، و لايقتصر الأمر على ذلك فقط، بل يكون لبعض التطبيقات إعدادات مختلفة، على سبيل المثال يكون بروتوكول الاتصال الآمن SSH مهيئًا بشكل مسبق للعمل مع نظام الخادم والاتصال به عن بعد من حواسيب أخرى. بينما يجب عليك تفعيل بروتوكول الاتصال الآمن يدويًا في نسخة المستخدم. العتاديات اللازمة ستحتاج إلى ذاكرة وصول عشوائية بحجم 4 جيغا بايت لتشغيل الواجهة الرسومية غنوم على نسخة المستخدم، ويجب أن تتوفر لديك مساحة تخزين على أحد الأقراص بمقدار 20 جيغا بايت على الأقل، ولكن تختلف الأمور بالنسبة لنسخة الخادم، حيث أنها لا تستخدم الواجهة الرسومية، أي لا تستهلك واجهة سطر الأوامر الكثير من موارد النظام، ولذلك يمكنك تشغيل خادم أوبنتو بسهولة على جهاز بحجم ذاكرة 512 ميغا بايت وقرص تخزين بحجم 5 جيغا بايت. يعتمد حجم الذاكرة RAM وقرص التخزين على خدمة الويب التي تريد تفعيلها، ولذلك يجب أن تتقيد بالحجم المطلوب للخدمة المعينة، لكن تفي سعة 512 ميغا بايت للذاكرة و 1 جيغا بايت لقرص التخزين بالغرض في أغلب الحالات. غرض الاستخدام يجب أن تسأل نفسك هذا السؤال: ما هي أغراض استخدامك لنظام أوبنتو؟ حتى تتمكن من اختيار النسخة المناسبة لك، فإذا كنت تريد تفعيل واستخدام أحد خدمات الويب، فعليك اختيار نسخة الخادم، ويجب أن تكون على دراية بكيفية التعامل مع الطرفية بواسطة أوامر لينوكس. أما إذا كنت تريد استخدام نظام أوبنتو كحاسوب عادي يعمل بنظام تشغيل، استخدم نسخة المستخدم، وإذا كنت تريد استخدامه لتعلم أوامر لينكس، أو أداة دوكر Docker أو حتى تثبيت خادم LAMP محلي بسيط، فإن نسخة المستخدم مناسبة لذلك. الخلاصة، يعد خادم أوبنتو الخيار الأفضل عند استخدام الخوادم، بينما تُعد نسخة المستخدم أفضل للاستخدامات العادية. هل يفضل استخدام نسخة المستخدم على الخادم أم تثبيت واجهة رسومية على نسخة الخادم؟ يجب أن نأخذ في الحسبان أن نسخة المستخدم من أوبنتو ونسخة الخادم كلاهما توزيعات لنظام التشغيل لينكس، إذًا يمكن استخدام نسخة المستخدم من أوبنتو كخادم لتوفير خدمات استضافة الويب، كما يمكن تثبيت واجهة رسومية على نسخة الخادم. لكن لايعني ذلك أن الاستخدام الأنف الذكر أمرٌ محمود؛ فذلك يعارض غرض إنشاء إصدارات مختلفة من أنظمة تشغيل الخوادم والمستخدمين. ضع في الحسبان أن التبديل من نسخة المستخدم إلى نسخة الخادم يتطلب جهدًا إضافيًا، والعكس صحيح، لذلك تجنب العناء عن طريق تحديد غرضك من استخدام نظام أوبنتو، ثم نزّل وثبّت النسخة المناسبة. في الختام، نأمل أن نكون أوضحنا الفرق بين نسخة أوبنتو المكتبية ونسخة الخادم. للحصول على المساعدة والدعم يمكنك إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب ترجمة- وبتصرف للمقال من موقع Itsfoss لصاحبه Abhishek Prakash اقرأ أيضًا كيفية تنصيب نسخة الخواديم من أوبنتو وإعداد مختلف تطبيقاته أساسيات الأمن والحماية على خواديم أوبنتو: الجدار الناري تنصيب وإعداد خدمة البريد الإلكتروني Postfix على أوبنتو كيفية تثبيت ووردبريس على خادوم LAMP في أوبنتو 16.04
-
سنتعلم في هذا المقال كيفية إنشاء مجسم ثلاثي الأبعاد لقرد يرتدي قبعة حفلات باستخدام برنامج بلندر Blender. إليك النتيجة النهائية للمشروع: ستحتاج في هذا المشروع إلى: عتاديات: حاسوب مكتبي أو شخصي قادر على تشغيل برنامج بلندر. برمجيات: برنامج بلندر Blender الإصدار 2.8 (أو أي إصدار أحدث). كما يمكنك الحصول على موارد المشروع ونتيجته النهائية من مستودع GitHub. خاصية التكبير والتدوير لاحظ أنه عندما تفتح برنامج بلندر، ستظهر لك الشاشة الافتتاحية التالية: أغلقها عبر الضغط على يمين الشاشة. ستظهر لك شاشة العرض ثلاثي الأبعاد، حيث ستضع جميع العناصر التي تريد عرضها أو تصيّيرها render، ولاحظ أن لديك حاليًا ثلاثة عناصر. يتيح لك وضع العرض ثلاثي الأبعاد التقريب أو تكبير الأجسام وتصغيرها باستخدام دولاب الفأرة. جرب ذلك الآن يمكنك تدوير الشاشة بالضغط على زر الفأرة الأوسط أو عجلة الفأرة وتدوير المؤشر بالاتجاه الذي ترغب. وضع العرض ثلاثي الأبعاد تظهر الشاشة أو المشهد في وضع العرض ثلاثي الأبعاد بشكل مشابه لما تراه في ألعاب الحاسوب، وتوجد ثلاثة مكونات رئيسية في المشهد ثلاثي الأبعاد سنشرحها قبل البدء في التنفيذ. المكعب يوجد لديك مكعب في منتصف الشاشة، وهو ما سنعمل عليه و نصيّره حتى نحصل على الشكل المطلوب. مصدر ضوئي يمكنك معرفة مصدر الضوء في المشهد وذلك عبر تدوير المشهد. دوّر المشهد حتى ترى الجزء العلوي من مصدر الضوء. كاميرا تحدد الكاميرا الزاوية التي ستشاهد منها المشهد. دوّر المشهد حتى يصبح خلف الكاميرا، وذلك بالضغط على الرقم 0 من لوحة المفاتيح أو من نافذة عرض View > Cameras > Active Cameras: ستعرض لك الكاميرا صورة المكعب. التصيير يُعّرف التصيّير Rendering بأنه عملية توليد صورة من نموذج ثلاثي الأبعاد. صيّر المشهد التالي عبر الضغط على مفتاح F12 في لوحة المفاتيح، أو اضغط على مفتاحي F12 + Fn إذا كنت تستخدم حاسوبًا يعمل على نظام تشغيل. لاحظ أن الجزء العلوي والجانب الأيمن من المكعب مضاءان، لكن الجانب الأيسر مظلم. يعود ذلك لأن مصدر الضوء موجود أعلى الجانب الأيمن من المكعب. اضغط على مفتاح ESC للخروج من وضع التصيّير. تحديد الكائنات ونقلها يمكنك تحديد الكائنات في برنامج بلندر بمجرد الضغط على زر الفأرة الأيمن. الآن، حدد المكعب ولاحظ ظهور حد برتقالي حول المكعب. كما يمكنك تحريك الكائنات في بلندر باستخدام المقابض الزرقاء، والحمراء، والخضراء؛ إذ يُستخدم المقبض الأزرق للتحرك صعودًا وهبوطًا على محور z، ويُستخدم المقبض الأخضر للتنقل يمنةً ويسرى على المحور y، أما المقبض الأحمر فيتنقل على المحور x. حرك المكعب للأعلى بالضغط بزر الفأرة الأيسر على المقبض الأزرق، إذ سيظهر لك خطٌ أزرق، حرك المكعب على امتداده. حرك المكعب لليمين باستخدام المقبض الأخضر، وسيظهر لك خطٌ أخضر، عندها حرك المكعب على امتداده. حرك المكعب للأمام وللخلف باستخدام المقبض الأحمر، وسيظهر لك خطٌ أحمر حرك المكعب على امتداده. انقل المكعب إلى مكان آخر، ثم اذهب إلى عرض التصيير لترى كيف يبدو المكعب، فمثلًا: قد ترى جزءً من المكعب، أو لا تراه أبدًا، ويعني ذلك أن المكعب ليس في مجال تغطية الكاميرا. اضغط على مفتاح ESC للخروج من عرض التصيير. ثم حرك المشهد حتى يصبح خلف الكاميرا، مثل الآتي: استخدم المقابض الثلاثة لتحريك المكعب حتى يصبح خلف الكاميرا. صيّر المكعب لترى كيف يبدو، سترى ذات الشكل. اضغط على مفتاح ESC للخروج من عرض التصيير. إضافة القرد احذف المكعب لأننا لن نحتاجه في هذه الخطوة، وذلك باتباع الخطوات التالية: انقر بزر الفأرة الأيسر على المكعب لتحديده، لاحظ ظهور حد برتقالي حول المكعب. ادخل وضع العرض ثلاثي الأبعاد. اضغط على الرمز X لحذف المكعب، ستظهر لك رسالة تأكيد الحذف. انقر على خيار الحذف Delete أو اضغط على مفتاح Enter. يمكنك أيضًا إضافة كائنات للمشهد باستخدام قائمة الإضافة المنسدلة Add، وذلك بالضغط على خيار الشبكة Mesh من القائمة، ثم اختيار القرد Monkey. لاحظ ظهور القرد على الشاشة: ضع القرد أمام الكاميرا كما فعلنا سابقًا مع المكعب، وذلك لتتمكن من رؤيته بعد التصيير. استخدم المقابض الملونة لتحريك القرد. إضافة قبعة الاحتفال حان الآن وقت إضافة قبعة احتفال للقرد، سنستخدم لذلك مخروطًا، باتباع الخطوات التالية: أضف مخروطًا Cone من خيار الشبكة Mesh من قائمة Add، وبهذا يصبح لديك مخروط وقرد في المشهد. حان الآن وقت وضع المخروط فوق القرد. بدايةً، كبر الصورة لتحصل على رؤية أفضل لكلا المجسمين. حدد المخروط بالضغط عليه بزر الفأرة الأيسر. استخدم أداة التحريك، ثم المقابض الثلاثة لوضع المخروط على رأس القرد، قرّب وكبر الصورة إن احتجت لذلك. تحقق من زوايا مختلفة للتأكد من أن المخروط موضوع بشكل مناسب. صيّر المجسم لترى كيف سيبدو: لاحظ بعد التصيير أن الصورة غير مضاءة بشكل كافٍ. لا تنسى الضغط على مفتاح ESC للخروج من وضع التصيير. تعديل الإضاءة سننقل في هذه الخطوة مصدر الضوء، بحيث ينير لنا الوجه الأمامي للقرد. انقر بزر الفأرة الأيسر على المصباح لتحديده، ولاحظ تحديده بلون برتقالي، ثم حرك المصباح باستخدام المقابض حتى يضيء وجه القرد. صيّر القرد، ثم تأكد من أنه مضاءٌ بقدر كافي، كما في المثال التالي: إذا لم تكن الإضاءة كافية، فاضغط على مفتاح ESC وحرك المصباح باتجاه وجه القرد. والآن، تحدى نفسك واختبر معلوماتك، إليك بعض الاقتراحات التي يمكنك تطبيقها: أضف المزيد من الكائنات من علامة التبويب إنشاء Create من شريط الأدوات. حرك الكائنات لخلق مشهد مختلف. أضف كرة ديسكو لإتمام مشهد الحفلة. أضف حافة إلى قبعة الحفلة. ختامًا بهذا تكون قد أتممت مشروعك باستخدام برنامج بلندر، وهنا ننصحك بتنفيذ مشاريع إضافية في خطوتك التالية لتنمية مهاراتك في العمل على برنامج بلندر. كما يتوفر في قسم التصميم في أكاديمية حسوب عدد من المقالات حول تعليم العمل على برنامج التصميم ثلاثي الأبعاد بلندر. إذا واجهت مشاكلًا مع برنامج بلندر، فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال Party Monkey من الموقع الرسمي لراسبيري باي. اقرأ أيضًا كيف تصمم وتحرك روبوت: التحريك ومفاتيح التأطير في بلندر كيف تصمّم وتحرّك روبوت: خامات بلندر ومفاتيح الشكل بلندر للمبتدئين: كيف تصمّم وتحرّك روبوت - تنسيق التناظر وتصميم الفم
-
سنشرح في هذا المقال كيفية التعامل مع المسارات routes وأنواع طلبات HTTP في إطار العمل Express بتطبيق مشروع عملي، وسنتعلم كيفية تحديد المسارات واستخدام طلبات HTTP من نوع GET و POST و PUT و DELETE لمعالجة البيانات. تتعامل المسارات مع انتقال المستخدم إلى عناوين URL مختلفة، ويسهل بروتوكول HTTP عمليات التواصل ونقل البيانات من خادم Express إلى متصفح الويب. يُفضل أن يكون لديك معرفة مسبقة ببيئة Node.js، لكن ذلك ليس ضروريًا، انظر صفحة التعريف Node.js على موسوعة حسوب وننصح بقراءة صفحة طريقة الاستعمال وتشغيل الأمثلة أيضًا من التوثيق نفسه. إعداد المشروع احرص على أن تكون لديك بيئة Node.js جاهزة ومثبتة على حاسوبك حتى تتمكن من استخدام إطار العمل Express. نفذ الخطوات التالية في الطرفية Terminal: أولًا، أنشئ مجلدًا جديدًا خاص بالمشروع باسم node-express-routing: mkdir node-express-routing ثم انتقل إلى المجلد الجديد: cd node-express-routing ثانيًا، أنشئ مشروعك الجديد معتمدًا الإعدادات الافتراضية، ومن ضمنها ملف package.json حتى تتمكن من الوصول إلى الاعتماديات dependencies: npm init -y ثم أنشئ ملف index.js حيث ستتعامل مع المسارات وتوابع طلبات HTTP: touch index.js ثبت الحزمتين Express و nodemon، إذ سنحتاج إلى الحزمة الأخيرة لإعادة تشغيل المشروع باستمرار عند كل تغيير في ملف index.js: npm install express --save npm install nodemon --save-dev افتح الملف package.json باستخدام إحدى محررات النصوص وأضف سكربت البدء start لتشغيل ملف index.js عبر الأمر nodemon: { "name": "node-express-routing", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "nodemon index.js" }, "keywords": [], "author": "Paul Halliday", "license": "MIT" } يتيح لك ذلك استخدام الأمر npm start في الطرفية لتشغيل خادم Express وحفظ التعديلات. تهانينا! أصبحت جاهزًا لإنشاء خادم Express بعد أن أعددت الحزمة nodemon لتعيد تشغيل الخادم عند التعديل على الملف index.js. تشغيل خادم Express ستتعامل مع منطق دمج المسارات ومختلف أنواع طلبيات HTTP في خادم Express الخاص بك، وستعمل على إعداد وتشغيل خادم خاص بك لتتصور كيف سيبدو مشروعك في المتصفح. اطلب وحدة Express عبر التابع require، في ملف index.js ثم خزن نسخة instance في المتغير app، وبعد ذلك أعلن عن متغير PORT واضبطه إلى القيمة 3000. const express = require('express'); const app = express(); const PORT = 3000; app.use(express.json()); app.listen(PORT, () => console.log(`Express server currently running on port ${PORT}`)); ثم استدعِ التابع ()listen مع التابع ()app ومرر المتغير PORT كوسيط أول، ودالة رد نداء callback كوسيط ثاني، إذ تقوم الدالة الوسيطة ()listen بإنشاء خادم محلي على المنفذ المحدد بالمتغير PORT لمعاينة التعديلات. مرر الوسيط ()express.json إلى التابع ()app.use لتحليل البيانات الواردة من خلال طلبات HTTP الخاصة بك. اعتمدت الإصدارات السابقة على تبعية المحلل body-parser، أما في الإصدارات الأحدث ضمنت Express برمجيات وسيطة معدة مسبقًا لتحليل البيانات خصوصًا التي بصيغة JOSN. اكتب الأمر التالي في الطرفية لتبدأ تشغيل المشروع: npm start سيُخدَّم المشروع على العنوان http://localhost:3000، وستلاحظ رسالة الخطأ التالية عند الانتقال إلى المتصفح: تعد هذه خطوة البداية، الآن علينا تعريف طلبيات HTTP للتخاطب الصحيح بين المتصفح والخادم. استقبال الخادم طلبية GET من طلبيات HTTP يمكنك إرسال البيانات من خادم Express الخاص بك إلى المتصفح لمعاينة مشروعك بناءً على إرساله طلبية GET محددة الوجهة، ولفعل ذلك استدعِ التابع ()get. مع المتغير app ولا تحدد الوجهة حاليًا، ومرر له دالة تأخذ الوسطين request و response كما يلي: app.get('/', (request, response) => { response.send('Hello'); }); لاحظ أن الوسيط request يحتوي على معلومات عن الطلبية GET التي أرسلها المتصفح، بينما يرسل التابع ()response.send بيانات إلى المتصفح، إما على شكل سلسلة، أو كائن، أو مصفوفة كرد أو إجابة على الطلب المرسل. لنتعرف على المسارات وطلبات HTTP الأخرى، بعد أن طبقنا طلبية GET. التعامل مع المسارات Routes أنشئ طلبية GET مع تحديد المسار '/accounts' والمسار '/accounts/:id'، ثم صَرّح عن مصفوفة حسابات باسم accounts: let accounts = [ { "id": 1, "username": "paulhal", "role": "admin" }, { "id": 2, "username": "johndoe", "role": "guest" }, { "id": 3, "username": "sarahjane", "role": "guest" } ]; app.get('/accounts', (request, response) => { response.json(accounts); }); app.get('/accounts/:id', (request, response) => { const accountId = Number(request.params.id); const getAccount = accounts.find((account) => account.id === accountId); if (!getAccount) { response.status(500).send('Account not found.') } else { response.json(getAccount); } }); ستحصل على جميع معلومات الحسابات الموجودة في المصفوفة عند الانتقال إلى العنوان الآتي: http://localhost:3000/accounts حيث ستكون نتيجة الخرج كما يلي: [ { "id": 1, "username": "paulhal", "role": "admin" }, { "id": 2, "username": "johndoe", "role": "guest" }, { "id": 3, "username": "sarahjane", "role": "guest" } ] يمكن طلب معلومات حساب محدد بعينه من خلال إرسال مُعرِّفه إلى نقطة الوصول endpoint التالية: id:/، حيث يعتبر إطار العمل Express أن :id في نقطة الوصول /accounts/:id هي نص بديل لأحد معاملات المستخدم ويطابقها مع القيمة المقابلة في الرابط المرسل لنقطة الوصول. لاحظ النتيجة عند الانتقال إلى العنوان http://localhost:3000/accounts/3: { "id": 3, "username": "sarahjane", "role": "guest" } التعامل مع الطلبيات POST و PUT و DELETE توفر طلبيات HTTP الأخرى غير النوع GET (اجلب) مرونة أكبر في التعامل مع البيانات وهي الطلبيات POST (انشر) و PUT (ضع) و DELETE (احذف)، إذ تنشئ الطلبية POST بيانات جديدة في الخادم (تنشر على الخادم)، بينما تعدل الطلبية PUT على البيانات الموجودة (تضع بيانات في الخادم)، أما الطلبية DELETE فتمسح البيانات من الخادم. طلبية POST استخدم طلبية POST لإنشاء بيانات جديدة في مصفوفة الحسابات accounts، عن طريق استدعاء التابع ()post. مع المتغير app وتحديد المسار accounts/ في حقل الوسيط الأول: app.post('/accounts', (request, response) => { const incomingAccount = request.body; accounts.push(incomingAccount); response.json(accounts); }) ستُرسل البيانات القادمة من الطلبية POST إلى مصفوفة الحسابات accounts ثم يرسل الرد على هيئة كائن JSON. لاحظ أن مصفوفة الحسابات accounts أصبحت تحتوي على مستخدم جديد: [ { "id": 1, "username": "paulhal", "role": "admin" }, { "id": 2, "username": "johndoe", "role": "guest" }, { "id": 3, "username": "sarahjane", "role": "guest" }, { "id": 4, "username": "davesmith", "role": "admin" } ] طلبية PUT يمكن تعديل حساب ما إن أرسلت طلبية PUT إلى الخادم، ويمكن له أن يعالجها عن طريق استدعاء التابع ()put. مع المتغير app وتمرير المسار '/accounts/:id' في حقل الوسيط الأول، وستجد من خلاله مُعرِّف الحساب المدخل، وتستخدم التابع الشرطي if لتعديل البيانات الجديدة: app.put('/accounts/:id', (request, response) => { const accountId = Number(request.params.id); const body = request.body; const account = accounts.find((account) => account.id === accountId); const index = accounts.indexOf(account); if (!account) { response.status(500).send('Account not found.'); } else { const updatedAccount = { ...account, ...body }; accounts[index] = updatedAccount; response.send(updatedAccount); } }); يمكنك الآن تعديل البيانات في مصفوفة الحسابات، فإن أرسلت طلبية PUT إلى الخادم عبر الوجهة التالية: http://localhost:3000/accounts/1 لطلب تغيير دور مستخدم محدد مثل إرسال البيانات التالية: { "role": "guest" } فسيتغير دور "role" ذلك المستخدم من مدير admin إلى ضيف guest، وذلك عند الانتقال إلى العنوان http://localhost:3000/accounts/1: { "id": 1, "username": "paulhal", "role": "guest" } الطلبية DELETE يمكن حذف المستخدمين وبياناتهم إن أرسلت طلبية DELETE إلى الخادم والذي يعالجها عن طريق استدعاء التابع ()delete. مع المتغير app وتضمين المسار '/accounts/:id' في حقل الوسيط الأول. سيبحث التابع بعدها ضمن مصفوفة الحسابات عن الحساب ذو المعرف المراد حذفه ويتخذ الإجراء المناسب. app.delete('/accounts/:id', (request, response) => { const accountId = Number(request.params.id); const newAccounts = accounts.filter((account) => account.id != accountId); if (!newAccounts) { response.status(500).send('Account not found.'); } else { accounts = newAccounts; response.send(accounts); } }); لاحظ أنه عند إرسال طلبية DELETE إلى العنوان http://localhost:3000/accounts/1 أن الحساب ذا المعرف 1 من مصفوفة الحسابات accounts سيُحذَف. ختامًا تعلمنا في هذا المقال كيف يساعد تحديد المسارات واستخدام طلبيات HTTP في تفاعل الخادم مع الطلبيات التي يرسلها المتصفح كما وضحنا في مثال المستخدمين والتعامل مع بياناتهم من إنشاء وتحديث وحذف في خادم Express. للحصول على المساعدة والدعم يمكنك إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة- وبتصرف للمقال How To Define Routes and HTTP Request Methods in Express لصاحبه Paul Halliday. اقرأ أيضًا التعامل مع كائن الإجابة res على طلبية HTTP في إطار العمل Express التعامل مع كائن الطلبية req في إطار العمل Express دليل استخدام Node.js وإطار العمل Express للمبتدئين
-
سنتعرف في هذا المقال على الكائن res في إطار العمل Express وكيفية استخدامه، إذ يُعد الكائن response "إجابة" واختصارًا res جزءًا أساسيًا من الثنائي response-request طلب-إجابة، حيث يقوم بإرسال البيانات من الخادم إلى العميل من خلال طلبات HTTP. ستحتاج خلال هذا المقال إلى: يُفضل أن يكون لديك معرفة مسبقة ببيئة Node.js، لكن ذلك ليس ضروريًا، انظر صفحة التعريف Node.js على موسوعة حسوب وننصح بقراءة صفحة طريقة الاستعمال وتشغيل الأمثلة أيضًا من التوثيق نفسه. معرفة بطلبات HTTP، ارجع إلى مقال مدخل إلى HTTP: شرح التخاطب بين العميل والخادم. اختبار التابعين ()status. و ()append. يرسل التابع ()send. المُستخدَم في الكائن res البيانات المعرفة في حقل الوسيط إلى طرف العميل. يتعامل هذا التابع مع الوسطاء سواء كانت سلسلة، أو مصفوفة، أو كائن. استخدم طلب GET مع تحديد وجهته كالتالي 'home/'، إليك طريقة كتابة الشيفرة في ملف index.js: app.get('/home', (req, res) => { res.send('Hello World!')) }); نلاحظ أن الطلب GET يقبل تمرير دالة رد نداء إليه تقبل الوسيطين res و req؛ ويمكنك استخدام الكائن res آنذاك لإرسال السلسلة "!Hello World" إلى طرف العميل. يُعَّرف التابع ()send. ترويساته بشكل محلي بناءً على نوع البيانات Content-Type وطولها Content-Length. يُحَدد الكائن res حالة شيفرات HTTP عن طريق التابع ()status.، لذا استدعيه مع الكائن res، بتمرير أحد شيفرات حالة HTTP كوسيط: res.status(404).send('Not Found'); يحدد التابع ()status. رمز حالة HTTP بالقيمة 404، والتي تخبر العميل بأن البيانات أو الصفحة المطلوبة غير موجودة "not found". يمكنك إرسال شرح للرمز للعميل باستخدام التابع ()send.. يُدمَج عمل التابعين status و send في التابع ()sendStatus. لسهولة التنفيذ: res.sendStatus(404); نلاحظ أن التابع ()sendStatus. يحدد رمز حالة HTTP بالرمز 404 ويرسلها إلى طرف العميل بخطوة واحدة، أو باستدعاء واحد. توضح رموز حالة HTTP الرد القادم من الخادم، إذ تعتمد متصفحات الإنترنت على شيفرات حالة HTTP لإخبار العميل بوجود البيانات وإعلامه عند حدوث خطأ داخلي من طرف الخادم. استخدم التابع ()append. لتعريف ترويسة في استجابة أو رد الخادم، عن طريق تمرير الترويسة كوسيط أول عند استدعاء التابع ()append.، وتمرير قيمة في الوسيط الثاني، كما يلي: res.append('Content-Type', 'application/javascript; charset=UTF-8'); res.append('Connection', 'keep-alive') res.append('Set-Cookie', 'divehours=fornightly') res.append('Content-Length', '5089990'); نلاحظ أن التابع ()append. يقبل ترويسات قياسية وغير قياسية في السطر الواحد. التعرف على عمل التوابع redirect و render و method يوجه التابع ()redirect. العميل إلى صفحة أخرى، عند استدعائه من طرف الكائن res. أي أنه عندما يُدخل المستخدم معلومات تسجيل الدخول في طرف العميل، يسهل التابع ()redirect. إعادة توجيهه إلى الصفحة المطلوبة. استدعِ التابع ()redirect. مع الكائن res كما يلي: res.redirect('/sharks/shark-facts') يوجه التابع ()redirect. العميل إلى الوجهة 'sharks/shark-facts/'. أما التابع ()render. فيقبل ملف HTML في حقل الوسيط ويرسله إلى العميل، ويقبل وسيطًا ثانيًا هو كائن محلي مع خاصيات محددة لتعريف الملف المرسل إلى طرف العميل. طَبق طلب GET مع تحديد الوجهة إلى 'shark-game/': app.get('/shark-game', (req, res) => { res.render('shark.html', {status: 'good'}); }); لاحظ أن استدعاء التابع ()render. مع الكائن res يؤدي إلى إرسال ملف HTML التالي shark.html مع خاصية الحالة status إلى العميل. ينهي التابع ()end. عمل حلقة الإجابة response cycle، وينصح باستدعائه في أخر خطوة عند إرسال بيانات إلى طرف العميل. استدعِ التابع ()sentStatus. مترافقًا مع التابع ()end. كالتالي: res.sendStatus(404).end(); يكمل التابع ()end. رد الخادم ويرسله إلى طرف العميل بمجرد أن يحدد التابع ()sentStatus. رمز حالة HTTP إلى 404، ونلاحظ مما سبق أن الكائن res يسهل عملية إرسال البيانات والملفات أيضًا. دعنا نتعرف على طرق أخرى للتعامل مع الملفات باستخدام الكائن res. التعامل مع الملفات باستخدام الكائن res يوفر التابع ()sendFile.إمكانية إرسال ملفات HTML و CSS و JavaScript إلى العميل، عند استدعائه مع الكائن res. استدعِ الطلب GET مع ضبط الوجهة إلى 'gallery/:fileName/': // GET https://sharks.com/gallery/shark-image.jpg app.get('/gallery/:fileName', function (req, res, next) { var options = { root: path.join(__dirname, 'public') }; res.sendFile(req.params.fileName, options, function (err) { if (err) next(err); else console.log('Sent:', fileName); }); }); لاحظ أن المتغير options هو كائن فيه الخاصية root التي تشير إلى المسار المطلق للمجلد العام public بجمع __dirname مع public عبر التابع path.join(). تشمل محتويات المجلد العام public كلًا من ملفات HTML و CSS و JavaScript، ويقبل التابع ()sendFile المتغير options كوسيط ثاني، ومعالج للأخطاء كوسيط ثالث، وهكذا تُرسل الملفات المخزنة في مجلد public إلى طرف العميل. يمكنك استدعاء التابع ()download. مع الكائن res لتسهيل التعامل مع الملفات، فأضف معالجة لطلب GET المرسل إلى الوجهة 'gallery/:fileName/' كالتالي: // GET https://sharkss.com/gallery/shark-image.jpg app.get('/gallery/:fileName', function(req, res){ const file = `${__dirname}/public/${req.params.fileName}`; res.download(file); }); يحث التابع ()download. طرف العميل على تنزيل ملف ما ويرفق ترويسات مناسبة لنوع الملف، وذلك كله باستدعاء واحد. استخدم التابع ()type. عند استدعاء الكائن res لتحديد قيمة Content-Header بتحديد صيغة الملف كالتالي: res.type('png') // => 'image/png' res.type('html') // => 'text/html' res.type('application/json') // =>'application/json' لاحظ أن التابع ()type. يظهر نوع الملف مع قيمته في Content-Header. ختاما تعرفنا في هذا المقال على الكائن res، ومحتوياته من توابع تسهل إرسال البيانات والملفات عبر طلبات HTTP المرسلة من خادم Express إلى طرف العميل. لمزيد من المعلومات عن الكائن res يرجى الإطلاع على التوثيق الرسمي من موقع Express. للحصول على المساعدة والدعم يمكنك إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة- وبتصرف للمقال How To Use the res Object in Express لصاحبه William Le. اقرأ أيضًا التعامل مع كائن الطلبية req في إطار العمل Express دليل استخدام Node.js وإطار العمل Express للمبتدئين مدخل إلى Node.js وExpress
-
يُعد الكائن request واختصارًا req جزءًا أساسيًا من الثنائي request وresponse، أي طلب وجواب، إذ يفحص الاستدعاءات من طرف العميل، ويرسل طلبات HTTP، ويتعامل مع البيانات الواردة بشكل سلسلة محرفية أو كائن JSON. ستتعرف في هذا المقال بالتفصيل على كائن الطلبية req في إطار العمل Express. ستحتاج في هذا المقال إلى: يُفضل أن يكون لديك معرفة مسبقة ببيئة Node.js، لكن ذلك ليس ضروريًا، انظر صفحة التعريف Node.js على موسوعة حسوب وننصح بقراءة صفحة طريقة الاستعمال وتشغيل الأمثلة أيضًا من التوثيق نفسه. معرفة بطلبات HTTP، ارجع إلى مقال مدخل إلى HTTP: شرح التخاطب بين العميل والخادم. إدارة البيانات الواردة من العميل يستقبل إطار العمل Express بيانات من طرف العميل بواسطة الكائن req في ثلاث نسخ Instances هي: req.params وreq.query وreq.body. يلتقط الكائن req.params البيانات بناءً على المعاملات المحددة في العنوان URL. استخدم الطلب GET مع المعامل userid:/ في ملف index.js كما يلي: // GET https://example.com/user/1 app.get('/:userid', (req, res) => { console.log(req.params.userid) // "1" }) يوجه الكائن req.params إطار العمل Express إلى إظهار نتيجة معرف المستخدم user's id بواسطة المعامل userid:/ المأخوذة من العنوان، فمثلًا طلبية GET للعنوان https://example.com/user/1 تطابق القيمة 1 للمعامل userid وتطبعه في الطرفية Console. استخدم الكائن req.query للوصول إلى الاستعلامات المرسلة في العنوان URL، حيث يمكن لهذا الكائن البحث عن البيانات المرسلة في العنوان وترشيحها وفرزها. أضف الطلب GET مع تحديد الوجهة search/، في ملف index.js كما يلي: // GET https://example.com/search?keyword=great-white app.get('/search', (req, res) => { console.log(req.query.keyword) // "great-white" }) يطابق الكائن req.query البيانات التي أرسلها العميل في الرابط على شكل استعلام (بوضع كلمة مفتاحية وقيمة بعد الإشارة ?)، فنجد مثلًا في المثال السابق أن العنوان المرسل بطلبية GET يطابق أولًا المسار search/ ويزودنا بمعلومات (تدعى استعلامات) مرسلة في العنوان نصل إليها عن طريق الكائن query الذي يوفره Express وهي كلمة البحث keyword التي قيمتها great-white في حالة المثال السابق. أي تُظهِر نتيجة إضافة الوسيط keyword. إلى الكائن req.query الرسالة التالية: great-white في طرفية المتصفح. يُتيح الكائن req.body الوصول إلى البيانات التي أرسلها العميل بشكل سلسة أو كائن JSON، ويُستخدم عادة للحصول على البيانات من طلبي POST و PUT في خادم Express. استخدم طلب POST مع تحديد الوجهة login/، في ملف index.js كما يلي: // POST https://example.com/login // // { // "email": "user@example.com", // "password": "helloworld" // } app.post('/login', (req, res) => { console.log(req.body.email) // "user@example.com" console.log(req.body.password) // "helloworld" }) يخزن الكائن req.body معلومات البريد الإلكتروني وكلمة المرور التي يدخلها المستخدم، ويرسلها إلى خادم Express، فيطبع المثال التالي قيمة البريد email وكلمة المرور password التي أرسلها العميل في طلبيته إلى الرابط https://example.com/login (كما نفعل عندما نريد تسجيل الدخول إلى أي موقع). بعد أن تعلمنا طرق تنفيذ الكائن req، سنتعرف على الأساليب الأخرى لاستخدامه في خادم Express. فحص العنوان باستخدام خاصيات الكائن req يمكن لخاصيات الكائن req أن تعرض الأجزاء الأساسية للعنوان URL وفقًا للبنية العامة، ومنها: protocol: البرتوكول. hostname: اسم المضيف. path: مسار العنوان. originalUrl: العنوان الأساسي. subdomains: النطاق الفرعي. أعِد الطلب GET مع تحديد الوجهة creatures/، في ملف index.js كما يلي: // https://ocean.example.com/creatures?filter=sharks app.get('/creatures', (req, res) => { console.log(req.protocol) // "https" console.log(req.hostname) // "example.com" console.log(req.path) // "/creatures" console.log(req.originalUrl) // "/creatures?filter=sharks" console.log(req.subdomains) // "['ocean']" }) يمكننا الوصول إلى عدة أجزاء من العنوان URL باستخدام الخاصيات الجاهزة built-in properties مثل خاصية البروتوكول protocol وخاصية اسم المضيف hostname، وتؤدي طباعة الكائن req في الطرفية مع الخاصيات إلى الحصول على بنية العنوان URL. تحليل الخاصيات الإضافية للكائن req يحتوي الكائن res على عدة خاصيات توفر مرونة في التعامل مع طلبات HTTP. استخدم خاصية method. في الكائن req، لمعرفة نوع طلبية HTTP المرسلة أي إن كانت GET أو POST أو PUT أو DELETE، فمثلًا يوضح المثال التالي طلبية DELETE نعرض فيها نوع الطلبية عبر الخاصية req.method والتي ستكون قيمتها بالفعل DELETE: app.delete('/', (req, res) => { console.log(req.method) // "DELETE" }) استعمل التابع ()header. الذي يوفره الكائن req للحصول على بيانات الترويسات المرسلة إلى خادمك، مثلًا نفذ طلب POST مع تحديد الوجهة login/، في ملف index.js كما يلي: app.post('/login', (req, res) => { req.header('Content-Type') // "application/json" req.header('user-agent') // "Mozilla/5.0 (Macintosh Intel Mac OS X 10_8_5) AppleWebKi..." req.header('Authorization') // "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..." }) تعرض الدالة ()req.header نوع الترويسة مثل نوع المحتوى Content-Type والاستيثاق Authorization، ووسطاؤها غير حساسة لحالة الأحرف لذلك يمكنك استخدام req.header('Content-Type') أو req.header('content-type') على حد سواء. إذا أضفت cookie-parser كملف اعتمادية dependency في خادم Express، حينها ستخزن الخاصية req.cookie القيم الموجودة في المحلل parser. أضف الخاصية req.cookie ثم طبق الخاصية sessionDate في ملف index.js كما يلي: // Cookie sessionDate=2019-05-28T01:49:11.968Z req.cookies.sessionDate // "2019-05-28T01:49:11.968Z" لاحظ أنه عند استدعاء الكائن req سيستدعي النتيجة من تاريخ جلسة ملف تعريف الارتباط cookie. ختاما تهانينا! لقد تعلمت كيف يزودنا إطار Express بخاصيات مُعّدة مسبقًا لنتمكن من استخدام الكائن req كجزء من ثنائي request-response للتعامل مع طلبات HTTP والبيانات من طرف العميل. انتقل إلى موقع Express الرسمي للاطلاع على التوثيقات الرسمية للكائن req. للحصول على المساعدة والدعم يمكنك إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال How To Use the req Object in Express لصاحبه William Le. اقرأ أيضًا مدخل إلى Node.js وExpress دليل استخدام Node.js وإطار العمل Express للمبتدئين إنشاء مدوّنة باستخدام Node.js وExpress (الجزء الأول)
-
يسمح إطار تطبيقات الويب Express المستخدم في بيئة Node.js بتسريع عمل واجهات برمجة التطبيقات المتينة API وخوادم الويب بسهولة، وهو عبارة عن حزمة خفيفة الحجم لا تحجب ميزات Node.js الأساسية. سنتعرف في هذا المقال على كيفية تثبيت إطار Express واستخدامه لإنشاء خادم ويب. ستحتاج خلال هذا المقال إلى: بيئة تطوير محلية من أجل Node.js. يتوافق هذا المقال مع كل من الإصدارات Node v15.14.0، و ، express v4.171 و npm v7.10.0، و server-index v1.9.1 إعداد المشروع افتح واجهة الطرفية Terminal وانشئ مجلدًا للمشروع الجديد، كما يلي: $ mkdir express-example انتقل بعدها إلى المجلد الذي أنشأته آنفًا: $ cd express-example أصبح بإمكانك الآن استخدام مشروع npm جديد: $ npm init -y ثبت حزمة express باستخدام الأمر التالي: npm install express@4.17.1 أصبح لديك مشروع Express جاهز للاستخدام. إنشاء خادم Express أنشئ ملفًا باسم server.js وافتحه بواسطة أحد محررات النصوص البرمجية، ثم أضف الأسطر البرمجية التالية: const express = require('express'); const app = express(); يعمل السطر الأول على جلب وحدة Express module الرئيسية من الحزم التي ثبتها سابقًا، هذه الوحدة هي عبارة عن دالة تُنفَّذ في السطر الثاني لإنشاء المتغير app. يمكنك إنشاء عدة متغيرات app بهذه الطريقة لكل منها طلباتها requests وردودها responses الخاصة بها. const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('Successful response.'); }); نوجه خادم Express لتخديم طلبات GET القادمة إلى الخادم بواسطة الأسطر البرمجية السابقة. يتضمن Express دوال مشابهة لطلبيات POST وطلبيات PUT وهي الدالة ()app.post والدالة ()app.put، وغيرها. تقبل هذه الدوال معاملين أساسين، الأول هو عنوان URL الذي ستعالجه الدالة، ونتعامل هنا مع / والذي يعبر عن الصفحة الرئيسية للموقع في حالتنا: localhost:3000. أما المعامل الثاني فهو دالة لها وسيطين: req و res، إذ يعبر الوسيط req عن الطلب المرسل إلى الخادم، ويمكننا استخدامه لمعرفة ما يطلبه العميل client، أما الوسيط res فيعبر عن الرد الذي سنرسله للعميل. ثم استدعينا دالة send بواسطة res لإظهار الرسالة: ".Successful response". const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('Successful response.'); }); app.listen(3000, () => console.log('Example app is listening on port 3000.')); يجب أن نشغل الخادم بمجرد انتهائها من إعداد الطلبات requests، وذلك بتمرير القيمة 3000 إلى الدالة listen التي تخبر المتغير app بالمنفذ port الذي يجب استعماله. يُعد تمرير دالة في المعامل الثاني أمرًا اختياريًا، حيث تُنفذ هذه الدالة عند تشغيل الخادم، الأمر الذي يمكننا من معرفة فيما إذا كان التطبيق يعمل في الطرفية console. شَغل التطبيق من واجهة الطرفية باستخدام الأمر: node server.js اكتب localhost:3000 في متصفح الانترنت، ستلاحظ ظهور رسالة: "Successful response"، وستعرض واجهة الطرفية الرسالة التالية: Example app is listening on port 3000. وبذلك نكون قد حصلنا على خادم ويب! ولكن، على الأرجح أنك ترغب بإرسال أكثر من سطر نصي واحد إلى العميل. سنشرح بإيجاز ما هي البرامج الوسيطة Middleware وكيفية إعداد هذا الخادم كخادم ملفات ثابت. استخدام البرامج الوسيطة Middleware يمكننا كتابة دوال وسيطة middleware functions في Express لها صلاحية وصول لكل طلبات HTTP القادمة إلى الخادم، ويمكن لهذه الدوال القيام بما يلي: تنفيذ أي عملية على الطلبيات. إجراء تعديلات على الكائنين request و response. إنهاء دورة الطلبية-الرد request-response. استدعاء الدالة الوسيطة التالية في المكدس. يمكننا كتابة دوال وسيطة خاصة بنا أو استخدام برامج وسيطة تابعة لجهات خارجية عن طريق استيرادها بالطريقة نفسها التي نتبعها مع الحزم. سنبدأ بتعلم كيفية كتابة دالة وسيطة خاصة بنا، ثم سنستخدم بعض البرامج الوسيطة لتخديم الملفات الثابتة، ونستدعي ()app.use لتعريف دالة وسيطة ثم تمريرها إلى دالة أخرى. فيما يلي دالة وسيطة لطباعة الوقت الحالي في وحدة التحكم عند كل طلب: const express = require('express'); const app = express(); app.use((req, res, next) => { console.log('Time: ', Date.now()); next(); }); app.get('/', (req, res) => { res.send('Successful response.'); }); app.listen(3000, () => console.log('Example app is listening on port 3000.')); توجه الدالة next الدالة الوسيطة للانتقال إلى الدالة الوسيطة التالية إن وجدت. من الضروري كتابة ذلك وإلا سيبقى الطلب معلقًا في هذه الدالة الوسيطة. كما يمكننا تمرير مسار إلى الدالة الوسيطة، وعندها ستعالج فقط الطلبات القادمة إلى ذلك المسار، كما يلي: const express = require('express'); const app = express(); app.use((req, res, next) => { console.log('Time: ', Date.now()); next(); }); app.use('/request-type', (req, res, next) => { console.log('Request type: ', req.method); next(); }); app.get('/', (req, res) => { res.send('Successful response.'); }); app.listen(3000, () => console.log('Example app is listening on port 3000.')); تعالج الدالة الطلبات الواردة إلى localhost:3000/request-type فقط، عند تمرير request-type/ في الوسيط الأول للدالة ()app.use. شَغل التطبيق من واجهة الطرفية باستخدام الأمر: $ node server.js اكتب localhost:3000/request-type في متصفح الانترنت، ستلاحظ أن واجهة الطرفية ستعرض وقت الطلب والرسالة "Request type: GET". سنستخدم الآن دالة وسيطة جاهزة لتخديم الملفات الثابتة static files، حيث يُزَود Express بدالة وسيطة جاهزة express.static، وسنستخدم دالة وسيطة خارجية، وهي serve-index لعرض الملفات الملفات مفهرسةً وفق فهرس. أنشئ مجلدًا باسم public داخل المجلد الموجود فيه خادم express، وضع فيه بعض الملفات ثم ثبت حزمة serve-index: $ npm install serve-index@1.9.1 استورد حزمة serve-indexفي أعلى ملف الخادم، ثم ضَمّن البرنامجين الوسيطين express.static و serve-index وأخبرهما بمسار الوصول للمجلد واسمه: const express = require('express'); const serveIndex = require('serve-index'); const app = express(); app.use((req, res, next) => { console.log('Time: ', Date.now()); next(); }); app.use('/request-type', (req, res, next) => { console.log('Request type: ', req.method); next(); }); app.use('/public', express.static('public')); app.use('/public', serveIndex('public')); app.get('/', (req, res) => { res.send('Successful response.'); }); app.listen(3000, () => console.log('Example app is listening on port 3000.')); أعد تشغيل الخادم وانتقل إلى العنوان localhost:3000/public، ستظهر لك قائمة بجميع ملفاتك. ختامًا تعلمنا في هذا المقال كيفية تثبيت Express واستخدامه في بناء خادم ويب، واستخدام دوال وسيطة مضمنة وأخرى تابعة لجهات خارجية. للحصول على المساعدة والدعم يمكنك إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب ترجمة -وبتصرف- للمقال How To Get Started with Node.js and Express من موقع Digital Ocean. اقرأ أيضًا مدخل إلى Node.js وExpress إنشاء مدوّنة باستخدام Node.js وExpress (الجزء الأول)
-
سوف تتعرف في هذا المقال على حاسوب راسبيري باي Raspberry Pi المُصغَّر، وكل ما تحتاجه لاستخدامه، وكيف تُعده للعمل. ما الذي ستحتاجه توجد عدة نماذج من الراسبيري باي، وبالنسبة لمعظم الناس، فإن الطراز B من الجيل الرابع Raspberry Pi 4 Model B يُعَد الخيار الأنسب، كما أنه الأحدث والأسرع والأسهل في الاستخدام. يُزود Raspberry Pi 4 بذاكرة وصول عشوائي RAM بسعة 2 جيغابايت أو بسعة 4 جيغابايت أو بسعة 8 جيغابايت. تفي سعة 2 جيغابايت بمعظم الأعراض التعليمية ومشاريع الهواة، بالإضافة لاستخدام الراسبيري باي كحاسوب مكتبي. تستهلك الإصدارات Zero و Zero W و Zero WH من راسبيري باي والإصدار Raspberry Pi Zero طاقة أقل، كما أنها أصغر حجمًا، مما يجعلها مناسبة للمشاريع المتنقلة مثل الروبوتات. بشكل عام، من الأسهل البدء بمشروع باستخدام الجيل الرابع من راسبيري باي ثم الانتقال إلى جيل آخر، كما يمكن شراء راسبيري باي من الموقع الرسمي أو من أي متجر محلي بالقرب منك. مصدر طاقة تحتوي جميع طرازات راسبيري باي على منفذ USB مشابه للمنفذ الموجود في معظم الهواتف المحمولة، وذلك للتوصيل مع مأخذ طاقة كهربائية. يكون منفذ USB إما من النوع C في الجيل الرابع من راسبيري باي، أو من النوع micro USB في كل من الجيل الأول والثاني والثالث. ستحتاج مصدر طاقة يوفر: 3.0 أمبير على الأقل للجيل الرابع من راسبيري باي. 2.5 أمبير على الأقل للجيل الثالث من راسبيري باي. ننصح باستخدام مصدر طاقة أصلي ذي منفذ USB من النوع C مثل مزود الطاقة الرسمي المُصنع بواسطة منظمة Raspberry Pi عند استخدام الجيل الرابع من راسبيري باي، أو باستخدام مزود الطاقة الاحتياطية الرسمي المُصنع بواسطة منظمة Raspberry Pi لكل من الجيل الأول والثاني والثالث. بطاقة تخزين نوع microSD يحتاج الراسبيري باي بطاقة تخزين SD لتخزين جميع الملفات ونظام التشغيل الخاص عليها، حيث ستحتاج بطاقة تخزين microSD بسعة 8 جيغابايت على الأقل. يقدم العديد من بائعي راسبيري باي بطاقات تخزين بحيث تكون مهيأة وجاهزة للاستخدام على نظام تشغيل الراسبيري باي . لوحة مفاتيح وفأرة ستحتاج إلى لوحة مفاتيح ذات وصلة USB وفأرة ذات وصلة USB لإعداد راسبيري باي، وبعد إعداد راسبيري باي، سيمكنك استخدام فأرة ولوحة مفاتيح تعمل بتقنية البلوتوث، لكنك ستحتاج إلى فأرة ولوحة مفاتيح تعملان بوصلة USB لإعداده أول مرة. شاشة تلفاز أو حاسوب ستحتاج إلى كبل لتوصيل الراسبيري باي بالشاشة وعرض واجهة نظام التشغيل Raspberry Pi OS، والذي تطلق عليه تسمية راسبيان Raspbian، ويُمكن للشاشة أن تكون شاشة تلفاز أو حاسوب. كما يمكن لراسبيري باي استخدام مكبرات الصوت المدمجة مع شاشة العرض لتشغيل الصوت. وصلة HDMI يحتوي Raspberry Pi على مخرج HDMI متوافق مع منفذ HDMI الموجود في معظم أجهزة التلفاز وشاشات الحاسوب الحديثة وقد تحوي العديد من شاشات الحاسوب أيضًا على منافذ DVI أو VGA. يحتوي الجيل الرابع من راسبيري باي على منفذي micro HMDI، مما يسمح بتوصيل شاشتين منفصلتين. ستحتاج إلى كبل أحد طرفيه micro HDMI والطرف الآخر HDMI ، لتوصيل الجيل الرابع من راسبيري باي بشاشة عرض أو يمكنك استخدام كبل HDMI عادي، بالإضافة إلى محول من micro HDMI إلى HDMI . يحتوي كل من الإصدار الأول والثاني والثالث من راسبيري باي على منفذ HDMI واحد كامل الحجم، لذا يمكن توصيله بالشاشة باستخدام كبل HDMI عادي. DVI إذا احتوت الشاشة على منفذ DVI، فيمكنك توصيلها بجهاز الراسبيري باستخدام كبل HDMI-DVI. VGA تحوي بعض الشاشات فقط على منفذ VGA. لتوصيل راسبيري باي بهذا النوع من الشاشات، يمكنك استخدام محول من HDMI إلى DVI. إضافات اختيارية ستجد فيما يلي بعض الإضافات الاختيارية التي يمكنك شراؤها لتحسين تجربة استخدام راسبيري باي. علبة حافظة يمكن وضع راسبيري باي في علبة لحمايته، لكن هذا الأمر ليس ضروريًا، ويمكن شراء العلبة الرسمية لكل من الجيل الرابع من الإصدار Zero وZero W من راسبيري باي من الموقع الرسمي أو من أقرب متجر محلي. سماعات ومكبرات الصوت تحتوي النماذج كبيرة الحجم من راسبيري باي (عدا عن الإصدارين Zero و Zero W من راسبيري باي) منفذًا صوتيًا قياسيًا مثل المنفذ الموجود في الهاتف الذكي أو مشغل MP3، لذلك يمكن توصيل سماعات رأس أو مكبرات صوت إلى راسبيري باي لتشغيل الصوت. إذا احتوت الشاشة الموصولة مع راسبيري باي على مكبرات صوت مدمجة، يمكن تشغيل الصوت من خلالها. كبل إثرنت تحتوي النماذج كبيرة الحجم من راسبيري باي (عدا عن الإصدارين Zero و Zero W من راسبيري باي) على منفذ إثرنت Ethernet قياسي للوصول للانترنت؛ لكن ستحتاج إلى محوّلة من منفذ USB إلى منفذ إثرنت لتتمكن من الاتصال بالإنترنت، كما يمكن الإتصال بالإنترنت لاسلكيًا في كل من الجيل الرابع والثالث من راسبيري باي والإصدار Zero . إعداد بطاقة SD إذا كان لديك بطاقة SD لا تحتوي على نظام التشغيل Raspberry Pi OS ، أو إذا رغبت في إعادة ضبط راسبيري باي، فيمكنك بسهولة تثبيت نظام تشغيل راسبيري باي OS بنفسك. ستحتاج إلى حاسوب يحتوي على منفذ بطاقة SD وهذا المنفذ موجود في معظم الحواسيب المحمولة وحواسيب سطح المكتب. تثبيت نظام التشغيل Raspbian باستخدام برنامج Raspberry Pi Imager يُعَد استخدام برنامج Raspberry Pi Imager أسهل طريقة لتثبيت نظام التشغيل راسبين Raspbian على بطاقة SD. استخدام برنامج Raspberry Pi Imager تفضل بزيارة صفحة التنزيلات Raspberry Pi downloads. انقر على الرابط الخاص بـتنزيل برنامج Raspberry Pi Imager الموافق لنظام التشغيل لديك. وعند انتهاء التحميل، انقر على الملف المُحَمل لتشغيل الملف المُثبِّت. ستُستبدال البيانات المخزنة على بطاقة SD أثناء عملية التهيئة، لذلك إذا احتوت بطاقة SD على ملفات، على سبيل المثال ملفات من إصدار قديم لنظام التشغيل راسبيان، يُنصح بنسخ هذه الملفات أولًا لضمان عدم فقدانها نهائيًا. قد يمنع نظام التشغيل من فتح المُثبِّت، فمثلًا قد تظهر الرسالة التالية في ويندوز عند محاولة تشغيل المُثبِّت: عندها يجب النقر على مزيد من المعلومات More info ثم شَغل على أي حال Run anyway اتبع التعليمات لتثبيت وتشغيل برنامج Raspberry Pi Imager، ثم أدخل بطاقة الذاكرة SD في جهاز الحاسوب أو في فتحة SD للحاسوب المحمول. اختر نظام التشغيل الذي تريد تثبيته في برنامج Raspberry Pi Imager، وبطاقة SD التي تريد تثبيته عليها. انقر على الزر WRITE وانتظر حتى ينتهي Raspberry Pi Imager من التثبيت، وبمجرد الحصول على الرسالة التالية يمكنك إخراج بطاقة SD. توصيل راسبيري باي احرص على توصيل كل شيء بـراسبيري باي ومن الضروري الانتباه لترتيب التوصيل، لضمان سلامة الأجهزة. ثم أدخل بطاقة التخزين SD التي أعددتها للعمل مع نظام تشغيل راسبيان في فتحة بطاقة microSD على الجانب السفلي من راسبيري باي. صِل فأرةً ذات كبل USB بمنفذ USB على راسبيري باي (لا يهم أي منفذ ستستخدم) صِل لوحة المفاتيح بنفس الطريقة. بعد ذلك تأكد من أن الشاشة موصولة بمأخذ الطاقة وأنها تعمل. لاحظ أن منفذ HDMI في راسبيري باي يحتوي على جانب مسطح في الأعلى، لهذا استخدم كبلًا لربط الشاشة بمنفذ HDMI الخاص بـراسبيري باي، كما يمكنك استخدام محول إذا لزم الأمر. الجيل الرابع من راسبيري باي صِل الشاشة بأول منفذ HDMI، المسمى HDMI0. تأكد من استخدام المنفذ HDMI0 (الأقرب إلى مدخل الطاقة) وليس HDMI. يمكنك توصيل شاشة ثانية اختيارية بنفس الطريقة. الجيل الأول والثاني والثالث من راسبيري باي صِل الشاشة بمنفذ HDMI الوحيد. إذا احتوت الشاشة على مكبرات صوت، فسوف يُشَغل الصوت من خلالها. يُمكنك أيضًا توصيل سماعات الرأس أو مكبرات صوت بمنفذ الصوت. إعداد راسبيري باي للعمل لا يحتوي راسبيري باي على مفتاح طاقة، فهو سيعمل فور توصيله إلى منفذ الطاقة. صِل مصدر الطاقة مع منفذ الطاقة الخاص براسبيري باي. يجب أن يُضيء ضوء LED أحمر على راسبيري باي، وهو ما يشير إلى أن راسبيري باي متصل بمصدر طاقة. عندما يبدأ راسبيري باي بالعمل (أو الإقلاع)، ستظهر صور تُوت عُليق في الجزء العلوي الأيسر من الشاشة. ستظهر واجهة سطح مكتب نظام راسبيان بعد ثوانٍ قليلة. الانتهاء من الإعداد عند تشغيل راسبيري باي لأول مرة، سيظهر تطبيق Welcome to Raspberry Pi ليُرشدك إلى خطوات الإعداد الأولي. انقر على Next لبدء الإعداد. ثم اختر البلد Country واللغة Language والمنطقة الزمنية Timezone الخاصة بك، ثم انقر على التالي Next مرةً أخرى. يمكنك الآن إدخال كلمة مرور جديدة لـراسبيري باي ثم النقر علىNext . اتصل بالشبكة اللاسلكية عن طريق تحديد اسمها وإدخال كلمة المرور ثم النقر على Next. إذا لم يحتوي إصدار راسبيري باي على ميزة الاتصال اللاسلكي ، فلن تظهر لك هذه الشاشة. يجب عليك انتظار ظهور رمز الاتصال اللاسلكي والوقت الصحيح قبل تحديث البرنامج. انقر على Next، ثم انتظر ريثما يبحث معالج تثبيت التطبيقات عن تحديثات نظام التشغيل راسبيان، ثم يُثبتها (قد يستغرق الأمر بعض الوقت). الآن، انقر على إعادة التشغيل Restart لإنهاء الإعداد. لن تحتاج إلى إعادة التشغيل إلا إذا كان ذلك ضروريًا لإكمال التحديث. أين تحصل على المساعدة إذا واجهت مشاكلًا مع راسبيري باي، فهناك عدة أماكن يمكنك الحصول على المساعدة والدعم منها: يمكنك إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. كما يمكنك طلب المساعدة باللغة الإنجليزية عن طريق: التحقق من قسم المساعدة ودليل استكشاف الأخطاء وإصلاحها على موقع Raspberry Pi. منتدى الراسبيري باي، بما في ذلك قسم المبتدئين، مكانًا رائعًا لطرح الأسئلة والحصول على الدعم. طلب المساعدة على Twitter باستخدام الوسم #rpilearn ، أو أرسل سؤالًا في Raspberry Pi Stack Exchange. ختاما بهذا تكون قد انتهيت من المقال الأول من سلسلة مقالات تمهيدية تساعدك على البدء بسهولة مع راسبيري باي. ترجمة -وبتصرف- للمقال Setting up your Raspberry Pi من موقع راسبيري باي. اقرأ أيضًا تعرف على جهاز راسبيري باي Raspberry Pi تجميع راسبيري باي والتحضير لاستعماله جولة في راسبيان: نظام تشغيل راسبيري باي