<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x627;&#x644;&#x623;&#x646;&#x638;&#x645;&#x629; &#x648;&#x627;&#x644;&#x623;&#x646;&#x638;&#x645;&#x629; &#x627;&#x644;&#x645;&#x62F;&#x645;&#x62C;&#x629;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/page/3/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x627;&#x644;&#x623;&#x646;&#x638;&#x645;&#x629; &#x648;&#x627;&#x644;&#x623;&#x646;&#x638;&#x645;&#x629; &#x627;&#x644;&#x645;&#x62F;&#x645;&#x62C;&#x629;</description><language>ar</language><item><title>&#x627;&#x644;&#x623;&#x62C;&#x647;&#x632;&#x629; &#x627;&#x644;&#x637;&#x631;&#x641;&#x64A;&#x629; Peripherals &#x648;&#x646;&#x648;&#x627;&#x642;&#x644;&#x647;&#x627; Buses &#x641;&#x64A; &#x645;&#x639;&#x645;&#x627;&#x631;&#x64A;&#x629; &#x627;&#x644;&#x62D;&#x627;&#x633;&#x648;&#x628;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D8%B7%D8%B1%D9%81%D9%8A%D8%A9-peripherals-%D9%88%D9%86%D9%88%D8%A7%D9%82%D9%84%D9%87%D8%A7-buses-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1721/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_09/6335736331576_----Peripherals---.png.83307b5e1d3cbfd2de7dac25b3603ba6.png" /></p>
<p>
	الأجهزة الطرفية peripherals هي مجموعة الأجهزة الخارجية التي تتصل بحاسوبك، ويجب أن يكون للمعالج طريقة ما للتواصل مع هذه الأجهزة الطرفية لجعلها مفيدة، وتسمى قناة الاتصال بين المعالج والأجهزة الطرفية بالناقل Bus.
</p>

<h2>
	المفاهيم الخاصة بنواقل الأجهزة الطرفية
</h2>

<p>
	يتطلب الجهاز عمليات إدخال وإخراج ليكون مفيدًا، ويوجد هناك عدد من المفاهيم الشائعة المطلوبة للتواصل المفيد مع الأجهزة الطرفية التي سنستعرضها فيما يلي.
</p>

<h3>
	المقاطعات Interrupts
</h3>

<p>
	تسمح <a href="https://academy.hsoub.com/programming/java/%D8%A7%D9%84%D8%A3%D8%AD%D8%AF%D8%A7%D8%AB-%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%AA%D8%B2%D8%A7%D9%85%D9%86%D8%A9-%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%B3-polling-loops-%D9%88%D8%A7%D9%84%D9%85%D9%82%D8%A7%D8%B7%D8%B9%D8%A7%D8%AA-interrupts-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC-r963/" rel="">المقاطعة</a> للجهاز بمقاطعة المعالج حرفيًا بما تعنيه الكلمة للإشارة إلى بعض المعلومات، فمثلًا تُنشَأ مقاطعة لتسليم حدث الضغط على مفتاح إلى <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">نظام التشغيل</a> عند الضغط عليه، إذ تسنِد تركيبة من نظام التشغيل وبيوس BIOS مقاطعةً لكل جهاز.
</p>

<p>
	ترتبط الأجهزة عمومًا بمتحكم المقاطعة القابل للبرمجة Programmable Interrupt Controller أو PIC اختصارًا، وهو شريحة منفصلة تُعَدّ جزءًا من اللوحة الأم التي تخزّن معلومات المقاطعة مؤقتًا وتنقلها إلى المعالج الرئيسي، كما يحتوي كل جهاز على خط مقاطعة فيزيائي بينه وبين أحد خطوط PIC التي يوفرها النظام، فإذا أراد الجهاز مقاطعة المعالج، فسيعدّل الجهد على هذا الخط.
</p>

<p>
	هناك وصف واسع جدًا لدور متحكم PIC وهو أنه يتلقى هذه المقاطعة ويحولها إلى رسالة ليستخدمها المعالج الرئيسي، كما يختلف هذا الإجراء حسب المعمارية، ولكن المبدأ العام هو أن يضبط نظام التشغيل جدول واصف المقاطعات Interrupt Descriptor Table الذي تربط فيه كل مقاطعة محتمَلة بعنوان شيفرة برمجية للانتقال إليها عند تلقي المقاطعة كما هو موضح في الشكل الآتي.
</p>

<p>
	كتابة معالج المقاطعة Interrupt Handler هو عمل مطور برنامج تشغيل الجهاز بالتزامن مع نظام التشغيل.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="108795" href="https://academy.hsoub.com/uploads/monthly_2022_09/01_interrupt.png.feb55776f69217346903ff81ef77ceb5.png" rel=""><img alt="interrupt" class="ipsImage ipsImage_thumbnailed" data-fileid="108795" data-unique="ubronrm3b" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_09/01_interrupt.png.feb55776f69217346903ff81ef77ceb5.png"></a>
</p>

<p>
	نظرة عامة على معالجة المقاطعة: يرفع الجهاز المقاطعة إلى متحكم المقاطعة، حيث تمرِّر هذه المقاطعة المعلومات إلى المعالج. ينظر المعالج إلى جدول واصف مقاطعاته الذي يملؤه نظام التشغيل للعثور على الشيفرة البرمجية التي تعالج الخطأ.
</p>

<p>
	تقسّم معظم المشغّلات معالجة المقاطعات إلى نصفين سفلي وعلوي، إذ يتعرف النصف السفلي على المقاطعة ويضع الإجراءات في رتل للمعالجة ويعيد المعالج إلى ما كان يفعله سابقًا بسرعة، في حين سيُشغَّل النصف العلوي لاحقًا عندما تكون وحدة المعالجة المركزية متاحةً، وسينفّذ المعالجة الإضافية، كما يؤدي ذلك إلى وقف المقاطعة التي تعطل وحدة المعالجة المركزية بأكملها.
</p>

<h4>
	حفظ الحالة
</h4>

<p>
	بما أنّ المقاطعة يمكن أن تحدث في أيّ وقت، فيجب أن تتمكن من العودة إلى العملية الجارية عند الانتهاء من معالجة المقاطعة، كما أنّ مهمة نظام التشغيل هي التأكد من أنه يحفظ أيّ حالة State عند الدخول إلى معالج المقاطعة، أي يسجلها ويستعيدها عند العودة من معالج المقاطعة، وتكون بذلك المقاطعة واضحةً تمامًا في كل ما يحدث في ذلك الوقت بغض النظر عن الوقت الضائع.
</p>

<h4>
	المقاطعات Interrupts والمصائد Traps والاستثناءات Exceptions
</h4>

<p>
	ترتبط المقاطعة عمومًا بحدث خارجي من جهاز فيزيائي، ولكن تُعَدّ الآلية نفسها مفيدةً للتعامل مع عمليات النظام الداخلية، فإذا اكتشف المعالج مثلًا حالات مثل الوصول إلى ذاكرة غير صالحة أو محاولة القسمة على صفر أو تعليمات غير صالحة، فيمكنه داخليًا رفع استثناء ليعالجه نظام التشغيل، كما تُستخدَم هذه الآلية ليلتقط نظام التشغيل استدعاءات النظام ولتطبيق <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%81%D8%B5%D9%84-%D8%A7%D9%84%D8%AB%D8%A7%D9%84%D8%AB-%D8%A7%D9%84%D8%B0%D8%A7%D9%83%D8%B1%D8%A9-%D8%A7%D9%84%D9%88%D9%87%D9%85%D9%8A%D8%A9-virtual-memory-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-r978/" rel="">الذاكرة الوهمية virtual memory</a>، في حين تبقى مبادئ مقاطعة الشيفرة البرمجية المُشغَّلة بطريقة غير متزامنة كما هي بالرغم من إنشائها داخليًا وليس من مصدر خارجي.
</p>

<h4>
	أنواع المقاطعات
</h4>

<p>
	هناك طريقتان رئيسيتان لإصدار إشارات إلى المقاطعات على الخط هما المستوى level والحافة edge المُنبَّهة، إذ تحدّد المقاطعات ذات المستوى المُنبَّه جهد خط المقاطعة الذي يُحتفَظ به مرتفعًا للإشارة إلى وجود مقاطعة معلَّقة، في يحن تكتشف المقاطعات ذات الحافة المُنبَّهة الانتقالات في الناقل عندما ينتقل جهد الخط من منخفض إلى مرتفع، ويكتشف متحكم المقاطعة PIC نبضة الموجة المربعة باستخدام المقاطعة ذات الحافة المنبَّهة عند إصدار الإشارة ورفع المقاطعة.
</p>

<p>
	يظهر الفرق عندما تشترك الأجهزة في خط مقاطعة، إذ سيكون خط المقاطعة مرتفعًا في نظام المقاطعة ذي المستوى المنبَّه حتى معالجة جميع الأجهزة التي رفعت المقاطعة وإلغاء تأكيد مقاطعتها، كما تشير النبضة الموجودة على الخط إلى متحكم المقاطعة PIC الذي تنشئه المقاطعة في نظام المقاطعة ذي الحافة المنبَّهة، وستصدر هذه النبضة إشارةً إلى نظام التشغيل لمعالجة المقاطعة في حالة ظهور نبضات أخرى على الخط المؤكَّد مسبقًا من جهاز آخر.
</p>

<p>
	تكمن مشكلة المقاطعات ذات المستوى المنبَّه في أنها يمكن أن تتطلب قدرًا كبيرًا من الوقت لمعالجة مقاطعة أحد الأجهزة، إذ يظل خط المقاطعة مرتفعًا أثناء هذا الوقت ولا يمكن تحديد ما إذا تسبّب أيّ جهاز آخر في حدوث مقاطعة على الخط، وهذا يعني أنه يمكن أن يكون هناك زمن تأخير كبير وغير متوقع في خدمة المقاطعات.
</p>

<p>
	يمكن ملاحظة المقاطعة طويلة الأمد ووضعها في رتل انتظار في المقاطعات ذات الحافة المُنبَّهة، ولكن لا يزال بإمكان الأجهزة الأخرى التي تشترك في الخط الانتقال -وبالتالي رفع المقاطعات- أثناء حدوث ذلك، ويؤدي ذلك إلى حدوث مشاكل جديدة، إذ يمكن تفويت أحد المقاطعات في حالة مقاطعة جهازين في الوقت نفسه أو يمكن أن يؤدي التشويش البيئي أو غيره إلى حدوث مقاطعة زائفة يجب تجاهلها.
</p>

<h4>
	المقاطعات غير القابلة للتقنع أو الإخفاء Non-maskable Interrupts
</h4>

<p>
	يجب أن يكون النظام قادرًا على إخفاء المقاطعات أو منعها في أوقات معينة، ويمكن وضع المقاطعات لتكون قيد الانتظار، لكن هناك صنف معيّن من المقاطعات يسمى المقاطعات غير القابلة للتقنّع أو الإخفاء Non-maskable Interrupts أو NMI اختصارًا، إذ تُعَدّ هذه المقاطعات استثناءً من هذه القاعدة مثل مقاطعة إعادة الضبط reset.
</p>

<p>
	يمكن أن تكون مقاطعات NMI مفيدةً لتطبيق أشياء مثل مراقبة النظام، حيث تُرفَع مقاطعة NMI دوريًا وتضبِط بعض الرايات التي يجب أن يقرّ بها نظام التشغيل، فإذا لم يظهر هذا الإقرار قبل مقاطعة NMI الدورية التالية، فيمكن عَدّ النظام أنه لا يحرز أيّ تقدم، كما يمكن استخدام مقاطعات NMI لتشخيص Profiling النظام، إذ يمكن رفع مقاطعات NMI الدورية واستخدامها لتقييم الشيفرة البرمجية التي يعمل بها المعالج حاليًا، مما يؤدي بمرور الوقت إلى إنشاء ملف تعريف للشيفرة البرمجية التي تعمل والحصول على رؤية مفيدة للغاية حول أداء النظام.
</p>

<h3>
	فضاء الإدخال والإخراج IO
</h3>

<p>
	يجب أن يتصل المعالج بالجهاز الطرفي عبر عمليات الإدخال والإخراج IO، ويُطلَق على الشكل الأكثر شيوعًا من عمليات IO عمليات الإدخال والإخراج المرتبطة بالذاكرة Memory Mapped IO، إذ ترتبط المسجلات الموجودة على الجهاز مع الذاكرة، وما عليك سوى القراءة أو الكتابة في عنوان محدد من الذاكرة للتواصل مع الجهاز.
</p>

<h2>
	الوصول المباشر للذاكرة DMA
</h2>

<p>
	بما أن سرعة الأجهزة أقل بكثير من سرعة المعالجات، فيجب أن يكون هناك طريقة ما لتجنب انتظار وحدة المعالجة المركزية للبيانات من الأجهزة.
</p>

<p>
	يُعَدّ الوصول المباشر للذاكرة Direct Memory Access -أو DMA اختصارًا- طريقةً لنقل البيانات مباشرةً بين الجهاز الطرفي وذاكرة RAM الخاصة بالنظام، ويمكن لمشغّل الجهاز إعداده لإجراء نقل باستخدام طريقة الوصول DMA من خلال إعطائه منطقةً من ذاكرة RAM لوضع بياناته فيها، ثم يمكنه بدء نقل DMA والسماح لوحدة المعالجة المركزية بمواصلة تنفيذ المهام الأخرى.
</p>

<p>
	سيرفع الجهاز المقاطعة بعد الانتهاء ويرسل لمشغّل الجهاز إشارةً باكتمال النقل، ثم ستكون البيانات القادمة من الجهاز مثل ملف من قرص صلب أو إطارات من بطاقة التقاط الفيديو موجودةً في الذاكرة وجاهزةً للاستخدام.
</p>

<h2>
	نواقل أخرى
</h2>

<p>
	تصل نواقل أخرى بين ناقل PCI والأجهزة الخارجية مثل ناقل USB الذي سنتعرف عليه فيما يلي.
</p>

<h3>
	USB
</h3>

<p>
	يُعَدّ جهاز USB من وجهة نظر نظام التشغيل أنه مجموعة من نقاط النهاية المجمَّعة معًا في واجهة ما، إذ يمكن أن تكون نقطة النهاية إما نقطة إدخال أو إخراج، بحيث تنقل نقطة النهاية البيانات باتجاه واحد فقط، كما يمكن أن تحتوي نقاط النهاية على عدد من الأنواع المختلفة هي:
</p>

<ul>
	<li>
		نقاط نهاية خاصة بعمليات التحكم Control End-points: مخصصة لإعداد الجهاز وغير ذلك.
	</li>
	<li>
		نقاط نهاية خاصة بالمقاطعات Interrupt End-points: تُستخدَم لنقل كميات صغيرة من البيانات، ولديها أولوية عليا.
	</li>
	<li>
		نقاط النهاية المجمَّعة Bulk End-points: تنقل كميات كبيرة من البيانات ولكنها لا تحصل على قيود زمنية مضمونة.
	</li>
	<li>
		عمليات النقل المتزامنة Isochronous Transfers: هي عمليات نقل ذات أولوية عالية في الوقت الحقيقي، ولكن إذا جرى تفويتها، فلن يعاد تجربتها، وتُستخدَم لبيانات البث مثل الفيديو أو الصوت حيث لا توجد فائدة من إرسال البيانات مرةً أخرى.
	</li>
</ul>

<p>
	يمكن أن يكون هناك العديد من الواجهات المكونة من نقاط نهاية متعددة، وتُجمَّع الواجهات ضمن إعدادات Configurations، ولكن معظم الأجهزة لها إعداد واحد فقط.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="108796" href="https://academy.hsoub.com/uploads/monthly_2022_09/02_uhci.png.6476363968789f7b70d195803538ee10.png" rel=""><img alt="02_uhci.png" class="ipsImage ipsImage_thumbnailed" data-fileid="108796" data-unique="4fpopiwv1" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_09/02_uhci.png.6476363968789f7b70d195803538ee10.png"></a>
</p>

<p style="text-align: center;">
	نظرة عامة على متحكم UCHI (مأخوذة من <a href="https://web.archive.org/web/20220118052209/http://download.intel.com/technology/usb/UHCI11D.pdf" rel="external nofollow">توثيق إنتل Intel</a>)
</p>

<p>
	يوضح الشكل السابق نظرة عامة على واجهة متحكم المضيف العامة Universal Host Controller Interface أو UHCI اختصارًا، إذ ويوفر نظرةً عامةً حول كيفية نقل بيانات USB خارج النظام عن طريق مجموعة من العتاد والبرمجيات، كما تضبط البرمجيات قالب بيانات بتنسيق محدد لمتحكم المضيف لقراءته وإرساله عبر ناقل USB.
</p>

<p>
	يحتوي المتحكم بدءًا من أعلى يسار الشكل السابق على مسجل إطارات مع عدّاد يُزاد دوريًا في كل ميلي ثانية، إذ تُستخدَم هذه القيمة للفهرسة ضمن قائمة إطارات تنشئها البرمجيات، ويؤشّر كل إدخال في هذا الجدول إلى رتل واصفات النقل Transfer Descriptors، كما تضبط البرمجيات هذه البيانات في الذاكرة ويقرؤها المتحكم المضيف الذي يُعَدّ شريحةً منفصلةً تشغّل ناقل USB، ويجب أن تجدول البرمجيات أرتال العمل بحيث يُمنَح 90% من وقت الإطار للبيانات المتزامنة ويُمنَح 10% المتبقية لبيانات المقاطعة والتحكم والبيانات المُجمَّعة.
</p>

<p>
	تعني الطريقة التي تُربَط بها البيانات أنّ واصفات النقل للبيانات المتزامنة ترتبط بمؤشر إطار معيّن واحد فقط -أي فترة زمنية معينة واحدة فقط- ثم ستُهمَل، لكن تُوضَع جميع بيانات المقاطعة والتحكم والبيانات المُجمَّعة ضمن رتل انتظار بعد البيانات المتزامنة، وبالتالي إذا لم تُرسَل في إطار واحد -أو فترة زمنية واحدة- فسيجري ذلك في المرة التالية.
</p>

<p>
	تتواصل طبقات USB عبر كتل طلبات USB أو URB اختصارًا، إذ تحتوي كتل URB على معلومات حول نقطة النهاية التي يرتبط بها هذا الطلب والبيانات وأي معلومات أو سمات ذات صلة ودالة رد نداء call-back function تُستدعَى عند اكتمال كتلة URB، كما ترسِل مشغّلات USB كتل URB بتنسيق ثابت إلى مركز USB الذي يديرها بالتنسيق مع متحكم مضيف USB على النحو الوارد أعلاه، وتُرسَل بياناتك إلى جهاز USB عبر مركز USB، ثم تُشغَّل دالة رد النداء.
</p>

<p>
	ترجمة -وبتصرُّف- للقسم <a href="https://www.bottomupcs.com/peripherals.xhtml" rel="external nofollow">Peripherals and buses</a> من الفصل <a href="https://www.bottomupcs.com/chapter02.xhtml" rel="external nofollow">Computer Architecture</a> من كتاب <a href="https://www.bottomupcs.com/" rel="external nofollow">Computer Science from the Bottom Up</a> لصاحبه Ian Wienand.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A7%D8%AA-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1722/" rel="">أنظمة المعالجات في معمارية الحاسوب</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D9%85%D9%8A%D9%82%D8%A9-%D8%B9%D9%84%D9%89-%D8%AA%D8%B3%D9%84%D8%B3%D9%84-%D8%A7%D9%84%D8%B0%D9%88%D8%A7%D9%83%D8%B1-%D8%A7%D9%84%D9%87%D8%B1%D9%85%D9%8A-%D9%88%D8%A7%D9%84%D8%B0%D8%A7%D9%83%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D8%AE%D8%A8%D8%A6%D9%8A%D8%A9-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1720/" rel="">نظرة عميقة على تسلسل الذواكر الهرمي والذاكرة المخبئية في معمارية الحاسوب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">المدخل الشامل لتعلم علوم الحاسوب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%81%D8%B5%D9%84-%D8%A7%D9%84%D8%B3%D8%A7%D8%A8%D8%B9-%D9%81%D9%87%D9%85-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%AE%D8%A8%D8%A6%D8%A9-caching-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r995/" rel="">فهم عملية التخبئة (Caching) في معمارية الحاسوب</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1721</guid><pubDate>Thu, 29 Sep 2022 18:06:00 +0000</pubDate></item><item><title>&#x646;&#x638;&#x631;&#x629; &#x639;&#x645;&#x64A;&#x642;&#x629; &#x639;&#x644;&#x649; &#x62A;&#x633;&#x644;&#x633;&#x644; &#x627;&#x644;&#x630;&#x648;&#x627;&#x643;&#x631; &#x627;&#x644;&#x647;&#x631;&#x645;&#x64A; &#x648;&#x627;&#x644;&#x630;&#x627;&#x643;&#x631;&#x629; &#x627;&#x644;&#x645;&#x62E;&#x628;&#x626;&#x64A;&#x629; &#x641;&#x64A; &#x645;&#x639;&#x645;&#x627;&#x631;&#x64A;&#x629; &#x627;&#x644;&#x62D;&#x627;&#x633;&#x648;&#x628;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D9%85%D9%8A%D9%82%D8%A9-%D8%B9%D9%84%D9%89-%D8%AA%D8%B3%D9%84%D8%B3%D9%84-%D8%A7%D9%84%D8%B0%D9%88%D8%A7%D9%83%D8%B1-%D8%A7%D9%84%D9%87%D8%B1%D9%85%D9%8A-%D9%88%D8%A7%D9%84%D8%B0%D8%A7%D9%83%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D8%AE%D8%A8%D8%A6%D9%8A%D8%A9-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1720/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_09/63356d24c92b6_-----------.png.5465aa2ca47c332b01d5284a5cdbd6b7.png" /></p>
<p>
	يمكن <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%88%D8%AD%D8%AF%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A%D8%A9-%D9%88%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1716/" rel="">لوحدة المعالجة المركزية</a> جلب التعليمات والبيانات مباشرةً من <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%81%D8%B5%D9%84-%D8%A7%D9%84%D8%B3%D8%A7%D8%A8%D8%B9-%D9%81%D9%87%D9%85-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%AE%D8%A8%D8%A6%D8%A9-caching-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r995/" rel="">الذاكرة المخبئية Cache Memory</a> الموجودة على شريحة المعالج فقط، لذا يجب تحميل الذاكرة المخبئية من ذاكرة النظام الرئيسية، أي ذاكرة الوصول العشوائي Random Access Memory -أو RAM اختصارًا-، ولكن تحتفظ الذاكرة RAM بمحتوياتها فقط عند الوصل بمصدر طاقة، لذلك يجب تخزينها على مساحة تخزين دائمة وغير متطايرة.
</p>

<h2>
	تسلسل الذواكر الهرمي
</h2>

<p>
	نطلق على طبقات الذواكر التالية اسم تسلسل الذواكر الهرمي Memory Hierarchy:
</p>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
} 

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table>
	<thead>
		<tr>
			<th>
				السرعة
			</th>
			<th>
				الذاكرة
			</th>
			<th>
				الوصف
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				الأسرع
			</td>
			<td>
				الذاكرة المخبئية Cache
			</td>
			<td>
				الذاكرة المخبئية هي ذاكرة مضمَّنة في وحدة المعالجة المركزية، وهي ذاكرة سريعة جدًا وتستغرق دورة واحدة فقط للوصول إليها، ولكن هناك حد لحجمها لأنها مُدمَجة مباشرةً في <a href="https://academy.hsoub.com/certificates/comptia/%D9%88%D8%AD%D8%AF%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A%D8%A9-r58/" rel="">وحدة المعالجة المركزية</a>، كما توجد هناك عدة مستويات فرعية من الذاكرة المخبئية تسمى L1 و L2 و L3 بسرعات متزايدة قليلًا عن بعضها البعض.
			</td>
		</tr>
		<tr>
			<td>
				 
			</td>
			<td>
				الذاكرة RAM
			</td>
			<td>
				يجب أن تأتي جميع التعليمات وعناوين التخزين الخاصة بالمعالج من الذاكرة RAM، وتستغرق وحدة المعالجة المركزية بعض الوقت للوصول إلى الذاكرة RAM يسمى زمن التأخير Latency بالرغم من أنها ذاكرة سريعة جدًا، كما تُخزَّن الذاكرة RAM في شرائح منفصلة ومخصصة متصلة <a href="https://academy.hsoub.com/certificates/comptia/%D8%A7%D9%84%D9%84%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D8%A3%D9%85-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r55/" rel="">باللوحة الأم</a>، مما يعني أنها أكبر بكثير من الذاكرة المخبئية.
			</td>
		</tr>
		<tr>
			<td>
				الأبطأ
			</td>
			<td>
				<a href="https://academy.hsoub.com/certificates/comptia/%D8%A7%D9%84%D9%82%D8%B1%D8%B5-%D8%A7%D9%84%D8%B5%D9%84%D8%A8-%D8%A7%D9%84%D9%87%D9%8A%D9%83%D9%84%D8%A9%D8%8C-%D8%A7%D9%84%D9%85%D9%88%D8%A7%D8%B5%D9%81%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-r60/" rel="">القرص الصلب Disk</a>
			</td>
			<td>
				جميعنا على دراية بالبرامج التي تصلنا على قرص مرن floppy disk أو قرص مضغوط، ونعلم كيفية حفظ ملفاتنا على القرص الصلب، ونعلم الوقت الطويل الذي يمكن أن يستغرقه البرنامج للتحميل من القرص الصلب، إذ يعني وجود آليات فيزيائية مثل الأقراص الدوارة والرؤوس المتحركة أن الأقراص الصلبة هي أبطأ وسيلة من وسائل التخزين، ولكنها أكبرها حجمًا.
			</td>
		</tr>
	</tbody>
</table>

<p>
	النقطة المهمة التي يجب معرفتها حول تسلسل الذواكر الهرمي هي المقايضات بين السرعة والحجم على حساب بعضهما البعض، فكلما كانت الذاكرة أسرع، كان حجمها أصغر.
</p>

<p>
	سبب فعالية الذواكر المخبئية هو أنّ شيفرة الحاسوب البرمجية تعرض شكلَين من أشكال المحلية Locality هما:
</p>

<ol>
	<li>
		تشير المحلية المكانية Spatial Locality إلى احتمالية الوصول إلى البيانات الموجودة ضمن الكتل مع بعضها بعضًا.
	</li>
	<li>
		تشير المحلية الزمانية Temporal Locality إلى أن البيانات المستخدَمة مؤخرًا يُحتمَل أن تُستخدَم مرة أخرى قريبًا.
	</li>
</ol>

<p>
	يعني ذلك أنه يمكن الاستفادة من تنفيذ أكبر قدر ممكن من عمليات الوصول السريعة إلى الذاكرة أي المحلية الزمانية وتخزين كتل صغيرة من المعلومات ذات الصلة أي المحلية المكانية.
</p>

<h3>
	الذاكرة المخبئية
</h3>

<p>
	تُعَدّ الذاكرة المخبئية أحد أهم عناصر معمارية وحدة المعالجة المركزية، إذ يجب على المطورين فهم كيفية عمل الذاكرة المخبئية في أنظمتهم لكتابة شيفرة برمجية فعالة، كما تُعَدّ نسخةً سريعةً جدًا من ذاكرة النظام الرئيسية الأبطأ، وهي أصغر بكثير من الذواكر الرئيسية لأنها مضمنة داخل شريحة المعالج جنبًا إلى جنب مع المسجلات ومنطق المعالج، وهناك حدود اقتصادية ومادية لأقصى حجم لها.
</p>

<p>
	تجد الشركات المصنعة مزيدًا من الطرق لحشر مزيد من الترانزستورات على الشريحة، مما يؤدي إلى زيادة أحجام الذواكر المخبئية بصورة كبيرة، ولكن يُقدَّر حجم حتى أكبر الذواكر المخبئية بعشرات الميجابايتات بعكس حجم الذاكرة الرئيسية المقدَّر بالجيجابايتات أو حجم القرص الصلب المقدَّر بالتيرابايتات.
</p>

<p>
	تتكون الذاكرة المخبئية من قطع صغيرة تعكس محتوى أجزاء من الذاكرة الرئيسية، إذ يُطلَق على حجم هذه القطع بحجم الخط Line Size، ويساوي تقريبًا 32 أو 64 بايتًا، ومن الشائع التحدث عن حجم الخط أو خط الذاكرة المخبئية عند الحديث عن الذاكرة المخبئية، والذي يشير إلى قطعة واحدة تعكس محتوى قطعة من الذاكرة الرئيسية، كما يمكن للذاكرة المخبئية فقط تحميل وتخزين الذاكرة بأحجام مضاعفة من خط الذاكرة المخبئية.
</p>

<p>
	تحتوي الذواكر المخبئية على تسلسلها الهرمي الخاص، ويطلق عليه عادةً L1 و L2 و L3، إذ تُعَدّ الذاكرة المخبئية L1 هي الأسرع والأصغر و L2 أكبر وأبطأ منها و L3 هي الأكبر والأبطأ، كما تُقسَم الذاكرة المخبئية L1 إلى ذواكر مخبئية خاصة بالتعليمات وأخرى بالبيانات، وتُعرف باسم معمارية هارفارد Harvard Architecture بعد أن قدمها حاسوب Harvard Mark-1 القائم على المُرحّلات Relay.
</p>

<p>
	تساعد الذواكر المخبئية المقسمة على تقليل الاختناقات في خطوط الأنابيب، حيث تشير مراحل خط الأنابيب السابقة إلى تعليمات الذاكرة المخبئية وتشير المراحل اللاحقة إلى بيانات الذاكرة المخبئية، كما يسمح توفير ذاكرة مخبئية منفصلة للتعليمات بإجراء تطبيقات بديلة تستفيد من طبيعة مجرى التعليمات بغض النظر عن فائدة تقليل التنازع على مورد مشترك، إذ تكون الذاكرة المخبئية الخاصة بالتعليمات للقراءة فقط، أي لا تحتاج إلى ميزات باهظة الثمن على الشريحة مثل تعدد المنافذ، ولا تحتاج إلى التعامل مع عمليات قراءة الكتل الفرعية لأن مجرى التعليمات يستخدِم عمومًا عمليات وصول ذات أحجام أكثر انتظامًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="108789" href="https://academy.hsoub.com/uploads/monthly_2022_09/01_sets.png.b2e61a70eb9466c970e3d4b71c8bcc01.png" rel=""><img alt="01_sets.png" class="ipsImage ipsImage_thumbnailed" data-fileid="108789" data-unique="7irue7lf1" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_09/01_sets.png.b2e61a70eb9466c970e3d4b71c8bcc01.png"></a>
</p>

<p style="text-align: center;">
	ترابط الذاكرة المخبئية: يمكن أن يجد خط ذاكرة مخبئية معيّن مكانًا صالحًا في أحد الإدخالات المظللة.
</p>

<p>
	يطلب المعالج باستمرار من الذاكرة المخبئية أثناء التشغيل العادي التحققَ من تخزين عنوان معيّن في الذاكرة المخبئية، لذلك تحتاج الذاكرة المخبئية لطريقة ما لمعرفة ما إذا كان لديها خط صالح أم لا، فإذا أمكن تخزين عنوان معيّن في أيّ مكان ضمن الذاكرة المخبئية، فيجب البحث في كل خط من الذاكرة المخبئية في كل مرة يُنشَأ فيها مرجع لتحديد وصول صحيح أو خاطئ، كما يمكن الاستمرار في البحث السريع من خلال إجرائه على التوازي في عتاد الذاكرة المخبئية، ولكن يكون البحث في كل إدخال مكلفًا للغاية بحيث يتعذر تطبيقه في ذاكرة مخبئية ذات حجم معقول، لذا يمكن جعل الذاكرة المخبئية أبسط من خلال فرض قيود على مكان وجود عنوان معيّن.
</p>

<p>
	يُعَدّ ذلك مقايضةً، فالذاكرة المخبئية أصغر بكثير من ذاكرة النظام، لذا يجب أن تحمل بعض العناوين أسماء بديلة Alias للعناوين الأخرى، فإذا جرى تحديث عنوانَين يحملان أسماء بديلةً لبعضهما البعض باستمرار، فسيقال أنهما يتنازعان على خط الذاكرة المخبئية، كما يمكننا تصنيف الذواكر المخبئية إلى ثلاثة أنواع عامة كما هو موضح في الشكل السابق وهي:
</p>

<ul>
	<li>
		الذواكر المخبئية المربوطة مباشرةً Direct mapped Caches التي تسمح لخط الذاكرة المخبئية بالتواجد فقط في إدخال واحد في الذاكرة المخبئية، ويُعَدّ ذلك أبسط تطبيق في العتاد، ولكن -كما هو موضح في الشكل السابق- لا توجد إمكانية لتجنب استخدام الأسماء البديلة لأن العنوانَين المظلَّلين يجب عليهما التشارك في خط الذاكرة المخبئية نفسه.
	</li>
	<li>
		الذواكر المخبئية الترابطية بالكامل Fully Associative Caches التي تسمح بوجود خط الذاكرة المخبئية في أيّ إدخال منها، مما يؤدي إلى تجنّب مشكلة الأسماء البديلة، لأن أيّ إدخال يكون متاحًا للاستخدام، لكن يُعَدّ تطبيق ذلك في العتاد مكلفًا للغاية لأنه يجب البحث عن كل موقع محتمَل في الوقت نفسه لتحديد ما إذا كانت القيمة موجودةً في الذاكرة المخبئية.
	</li>
	<li>
		الذواكر المخبئية التجميعية Set Associative Caches التي تُعَدّ عبارةً عن مزيج من الذواكر المخبئية المربوطة مباشرةً والذواكر المخبئية الترابطية بالكامل، وتسمح بوجود قيمة معينة للذاكرة المخبئية في بعض المجموعات الفرعية من الخطوط الموجودة ضمن هذه الذاكرة المخبئية، كما تُقسَم الذاكرة المخبئية إلى مناطق تسمَّى طرقًا Ways، ويمكن وجود عنوان معيّن في أيّ طريق، وبالتالي ستسمح الذاكرة المخبئية التجميعية المؤلفة من مجموعة من الطرق عددها n لخط الذاكرة المخبئية بالتواجد ضمن مجموعة الإدخالات التي عددها يساوي باقي قسمة مجموعة الكتل الإجمالية ذات الحجم المحدد على n، ويظهِر الشكل السابق عينةً من ذاكرة تجميعية مؤلفة من 8 عناصر و 4 طرق، إذ يكون للعنوانَين أربعة مواقع محتملة، مما يعني أنه يجب البحث عن نصف الذاكرة المخبئية فقط في كل عملية بحث، وكلما زاد عدد الطرق، زادت المواقع الممكنة ونقصت الأسماء البديلة، مما يؤدي إلى أداء أفضل.
	</li>
</ul>

<p>
	يجب أن يتخلص المعالِج من الخط بمجرد امتلاء الذاكرة المخبئية لإفساح المجال لخط جديد، وهناك العديد من <a href="https://academy.hsoub.com/programming/advanced/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA-r1282/" rel="">الخوارزميات</a> التي يمكن للمعالج من خلالها اختيار الخط الذي سيتخلص منه مثل خوارزمية الأقل استخدامًا مؤخرًا Least Recently Used -أو LRU اختصارًا- والتي تُعَدّ خوارزميةً يجري فيها التخلص من أقدم خط غير مستخدَم لإفساح المجال للخط الجديد.
</p>

<p>
	ليس هناك داع لضمان التوافق مع الذاكرة الرئيسية عندما تكون البيانات للقراءة فقط من الذاكرة المخبئية، لكن يحتاج المعالج لاتخاذ بعض القرارات حول كيفية تحديث الذاكرة الرئيسية الأساسية عندما يبدأ في الكتابة في خطوط الذاكرة المخبئية، إذ ستكتب طريقة التخزين الخاصة بالذاكرة المخبئية التي تُسمَّى Write-through Cache التغييرات مباشرةً في ذاكرة النظام الرئيسية عندما يحدّث المعالج الذاكرة المخبئية، ويُعَدّ ذلك أبطأ لأن عملية الكتابة في الذاكرة الرئيسية أبطأ، في حين تؤخر طريقة التخزين الخاصة بالذاكرة المخبئية التي تُسمَّى Write-back Cache كتابةَ التغييرات على الذاكرة RAM حتى الضرورة القصوى، والميزة الواضحة لذلك هي أنّ الوصول إلى الذاكرة الرئيسية مطلوب عند كتابة إدخالات الذاكرة المخبئية.
</p>

<p>
	يُشار إلى خطوط الذاكرة المخبئية المكتوبة دون وضعها في الذاكرة على أنها متسخة Dirty، فعيبها هو أنه يمكن أن يتطلب الأمر وصولَين إلى الذاكرة أحدهما لكتابة بيانات الذاكرة الرئيسية المتسخة والآخر لتحميل البيانات الجديدة عند التخلص من إدخال معيّن من الذاكرة المخبئية.
</p>

<p>
	إذا كان الإدخال موجودًا في كل من الذاكرة المخبئية ذات المستوى الأعلى والمستوى الأدنى في الوقت نفسه، فإننا نسمّي الذاكرة المخبئية ذات المستوى الأعلى بالشاملة Inclusive. بينما إذا أزالت الذاكرة المخبئية ذات المستوى الأعلى التي تحتوي على خط معيّن إمكانيةَ احتواء ذاكرة مخبئية ذات مستوى أقل على هذا الخط، فإننا نقول أنها حصرية Exclusive وسنناقش ذلك لاحقًا.
</p>

<h3>
	عنونة الذاكرة المخبئية
</h3>

<p>
	لم نناقش حتى الآن كيف تقرر الذاكرة المخبئية ما إذا كان عنوان معيّن موجودًا في الذاكرة المخبئية أم لا، إذ يجب أن تحتفظ الذواكر المخبئية بمجلد للبيانات الموجودة حاليًا في خطوط الذاكرة المخبئية، ويمكن وضع مجلد وبيانات الذاكرة المخبئية على المعالج معًا، ولكن يمكن أن يكونا منفصلَين أيضًا كما في حالة المعالج POWER5 الذي يحتوي على مجلد ذاكرة L3 على المعالج، ولكن يتطلب الوصول إلى البيانات اجتياز ناقل L3 للوصول إلى ذاكرة خارجية ليست على المعالج، ويمكن أن يسهّل هذا الترتيب معالجة عمليات الوصول الصحيحة أو الخاطئة بصورة أسرع دون التكاليف الأخرى للاحتفاظ بالذاكرة المخبئية بالكامل على المعالج.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="108790" href="https://academy.hsoub.com/uploads/monthly_2022_09/02_tags.png.45481cd424b91f87533cf77a52eaac70.png" rel=""><img alt="02_tags.png" class="ipsImage ipsImage_thumbnailed" data-fileid="108790" data-unique="vfb3zfc1s" src="https://academy.hsoub.com/uploads/monthly_2022_09/02_tags.png.45481cd424b91f87533cf77a52eaac70.png"></a>
</p>

<p>
	وسوم الذاكرة المخبئية Cache Tags: يجب التحقق من الوسوم على التوازي للحفاظ على وقت الاستجابة منخفضًا، إذ يتطلب المزيدُ من بتات الوسوم (أي ارتباطات مجموعات أقل) عتادًا أكثر تعقيدًا لتحقيق ذلك. بينما تعني ارتباطاتُ المجموعات الأكثر وسومًا أقل، ولكن يحتاج المعالج الآن إلى عتاد لمضاعفة خرج العديد من المجموعات التي يمكن أن تضيف زمن تأخير أيضًا.
</p>

<p>
	يمكن تحديد ما إذا كان العنوان موجودًا في الذاكرة المخبئية بسرعة من خلال فصله إلى ثلاثة أجزاء هي الوسم Tag والفهرس Index والإزاحة Offset.
</p>

<p>
	تعتمد بتات الإزاحة على حجم خط الذاكرة المخبئية، إذ يمكن استخدام خط بحجم 32 بايت مثلًا آخر 5 بتات أي 2‎<sup>5</sup>‎ من العنوان بوصفه إزاحةً في الخط، ويُعَدّ الفهرس خط ذاكرة مخبئية معيّن يمكن أن يتواجد فيه الإدخال، فلنفترض أنه لدينا ذاكرة مخبئية تحتوي على 256 إدخالًا مثلًا، فإذا كانت هذه الذاكرة هي ذاكرة مخبئية مربوطة مباشرةً، فيمكن أن تكون البيانات موجودة في خط واحد محتمَل فقط، لذا تصف 8 بتات التالية (2‎<sup>8</sup>‎) بعد الإزاحة الخط المراد التحقق منه بين 0 و 255.
</p>

<p>
	لنفترض الآن أنّ الذاكرة المخبئية المكونة من 256 عنصرًا مقسمة إلى طريقين، وهذا يعني أنّ هناك مجموعتين مؤلفتين من 128 خط، ويمكن أن يقع العنوان المحدد في أيّ من هاتين المجموعتين، وبالتالي فإن المطلوب هو 7 بتات فقط على أساس فهرس للإزاحة في الطرق المؤلفة من 128 إدخالًا، كما نخفّض عدد البتات المطلوبة على أساس فهرس لأن كل طريق يصبح أصغر عندما نزيد عدد الطرق بالنسبة إلى حجم ذاكرة مخبئية معيّن.
</p>

<p>
	لا يزال مجلد الذاكرة المخبئية بحاجة إلى التحقق مما إذا كان العنوان المخزن في الذاكرة المخبئية هو العنوان الذي يريده، وبالتالي فإن البتات المتبقية من العنوان هي بتات الوسوم التي يتحقق مجلد الذاكرة المخبئية منها مقابل بتات وسم العنوان الواردة لتحديد ما إذا كان هناك عملية وصول صحيحة أم لا، وهذه العلاقة موضحة في الصورة السابقة.
</p>

<p>
	إذا كان هناك طرق متعددة، فيجب إجراء هذا التحقق على التوازي في كل طريق، ثم تُمرَر النتيجة بعد ذلك إلى معدد إرسال Multiplexor ينتج عنه نتيجة وصول صحيحة hit أو خاطئة miss، وكلما كانت الذاكرة المخبئية أكثر ارتباطًا، قل عدد البتات المطلوبة للفهرس وزاد عدد البتات المطلوبة للوسم، حتى الوصول إلى أقصى حد للذاكرة المخبئية الترابطية بالكامل حيث لا تُستخدَم بتات كبتات للفهرس، كما تُعَدّ المطابقة على التوازي لبتات الوسوم مكونًا باهظًا لتصميم الذاكرة المخبئية وهي عمومًا العامل المحدّد لعدد الخطوط -أي حجمها- التي يمكن أن تنمو إليها الذاكرة المخبئية.
</p>

<p>
	ترجمة -وبتصرُّف- للقسم <a href="https://www.bottomupcs.com/memory.xhtml" rel="external nofollow">Memory</a> من الفصل <a href="https://www.bottomupcs.com/chapter02.xhtml" rel="external nofollow">Computer Architecture</a> من كتاب <a href="https://www.bottomupcs.com/" rel="external nofollow">Computer Science from the Bottom Up</a> لصاحبه Ian Wienand.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D8%B7%D8%B1%D9%81%D9%8A%D8%A9-peripherals-%D9%88%D9%86%D9%88%D8%A7%D9%82%D9%84%D9%87%D8%A7-buses-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1721/" rel="">الأجهزة الطرفية Peripherals ونواقلها Buses في معمارية الحاسوب</a>
	</li>
	<li>
		المقال السابق:<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%88%D8%AD%D8%AF%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A%D8%A9-%D9%88%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1716/" rel=""> تعرف على وحدة المعالجة المركزية وعملياتها في معمارية الحاسوب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/certificates/comptia/%D8%A7%D9%84%D8%B0%D8%A7%D9%83%D8%B1%D8%A9-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87%D8%A7-r59/" rel="">الذاكرة وأنواعها</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%81%D8%B5%D9%84-%D8%A7%D9%84%D8%B3%D8%A7%D8%A8%D8%B9-%D9%81%D9%87%D9%85-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%AE%D8%A8%D8%A6%D8%A9-caching-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r995/" rel="">فهم عملية التخبئة (Caching) في معمارية الحاسوب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">المدخل الشامل لتعلم علوم الحاسوب</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1720</guid><pubDate>Sun, 25 Sep 2022 18:00:00 +0000</pubDate></item><item><title>&#x639;&#x631;&#x636; &#x633;&#x637;&#x62D; &#x645;&#x643;&#x62A;&#x628; &#x631;&#x627;&#x633;&#x628;&#x64A;&#x631;&#x64A; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; VNC</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%B9%D8%B1%D8%B6-%D8%B3%D8%B7%D8%AD-%D9%85%D9%83%D8%AA%D8%A8-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-vnc-r2081/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/--VNC.png.ccf4d56ae52063c4063f40a395ea33ab.png" /></p>
<p>
	ستتعلم في هذا الدرس كيفية ربط جهاز راسبيري باي Raspberry Pi بحاسوبك الشخصي وذلك باستخدام حوسبة الشبكة الافتراضية - Virtual Network Computing (VNC).
</p>

<p>
	سنتمكن من خلال VNC الوصول إلى سطح مكتب حاسوب راسبيري باي باستخدام الحاسوب الشخصي وذلك للتحكم بجميع أوامر راسبيري باي وبرمجتها.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="603" id="ips_uid_9038_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="عرض سطح مكتب راسبيري باستخدام VNC" width="1072" data-embed-src="https://www.youtube.com/embed/NxLcq2bYg0U"></iframe>
</p>

<p>
	تعرف أكثر على <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">علوم الحاسب</abbr> وأنظمة التشغيل في <a href="https://academy.hsoub.com/learn/computer-science/" rel="">دورة علوم الحاسوب المقدمة من أكاديمية حسوب</a>، ولا تنسَ الاستعانة خلال رحلة تعلمك وعملك بتوثيقات <a href="https://wiki.hsoub.com/%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" rel="external">موسوعة حسوب</a> المجانية. وإذا أردت متابعة المعلومات البرمجية العلمية مكتوبة فيمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/" rel="">قسم البرمجة في أكاديمية حسوب</a>، كما يمكنك متابعة جديد الفيديوهات التقنية المتاحة على <a href="https://www.youtube.com/@HsoubAcademy" rel="external nofollow">يوتيوب أكاديمية حسوب</a> مجانًا.
</p>
]]></description><guid isPermaLink="false">2081</guid><pubDate>Fri, 23 Sep 2022 15:00:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x648;&#x62D;&#x62F;&#x629; &#x627;&#x644;&#x645;&#x639;&#x627;&#x644;&#x62C;&#x629; &#x627;&#x644;&#x645;&#x631;&#x643;&#x632;&#x64A;&#x629; &#x648;&#x639;&#x645;&#x644;&#x64A;&#x627;&#x62A;&#x647;&#x627; &#x641;&#x64A; &#x645;&#x639;&#x645;&#x627;&#x631;&#x64A;&#x629; &#x627;&#x644;&#x62D;&#x627;&#x633;&#x648;&#x628;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%88%D8%AD%D8%AF%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A%D8%A9-%D9%88%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1716/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_09/632bf2f2211b4_---------.png.5ea41a958f6cf9a1468d7250f9ceae70.png" /></p>
<p>
	تنفّذ وحدة المعالجة المركزية التعليمات على القيم الموجودة في المسجّلات Registers، إذ يوضّح المثال الآتي أولًا ضبط R1 على القيمة 100 وتحميل القيمة من موقع الذاكرة <code>0x100</code> إلى R2 وجمع القيمتين، ثم وضع النتيجة في R3، وأخيرًا تخزين القيمة الجديدة 110 في R4.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="108406" href="https://academy.hsoub.com/uploads/monthly_2022_09/01_computer.png.58239ffafab8e7aa914707a0fb01800b.png" rel=""><img alt="01_computer.png" class="ipsImage ipsImage_thumbnailed" data-fileid="108406" data-unique="xnve4c0bv" src="https://academy.hsoub.com/uploads/monthly_2022_09/01_computer.png.58239ffafab8e7aa914707a0fb01800b.png"></a>
</p>

<p>
	يتكون الحاسوب من <a href="https://academy.hsoub.com/certificates/comptia/%D9%88%D8%AD%D8%AF%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A%D8%A9-r58/" rel="">وحدة معالجة مركزية Central Processing Unit</a> -أو CPU اختصارًا- متصلة <a href="https://academy.hsoub.com/certificates/comptia/%D8%A7%D9%84%D8%B0%D8%A7%D9%83%D8%B1%D8%A9-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87%D8%A7-r59/" rel="">بالذاكرة</a>، إذ توضّح الصورة السابقة المبدأ العام لجميع عمليات الحاسوب، كما تنفّذ وحدة المعالجة المركزية التعليمات المقروءة من الذاكرة، وهناك نوعان من هذه التعليمات هما:
</p>

<ol>
	<li>
		التعليمات التي تحمّل القيم من الذاكرة إلى المسجلات وتخزّن القيم من المسجلات إلى الذاكرة.
	</li>
	<li>
		التعليمات التي تُشغَّل على القيم المخزَّنة في المسجّلات مثل جمع أو طرح أو ضرب أو قسمة قيمتين موجودتين في مسجلين، أو إجراء العمليات الثنائية and و or و xor وغيرها، أو إجراء عمليات حسابية أخرى، مثل الجذر التربيعي و sin و cos و tan وغيرها.
	</li>
</ol>

<p>
	لذا نجمع في مثالنا ببساطة العدد 100 مع قيمة مُخزَّنة في الذاكرة ونخزّن النتيجة الجديدة في الذاكرة.
</p>

<h3>
	التفريع Branching
</h3>

<p>
	يُعَدّ التفريع عمليةً مهمةً لوحدة المعالجة المركزية، وذلك بغض النظر عن عمليتي التحميل أو التخزين، إذ تحتفظ وحدة المعالجة المركزية داخليًا بسجل للتعليمة التالية التي ستنفَّذ في مؤشر التعليمات Instruction Pointer، بحيث يُزاد هذا المؤشر ليؤشّر إلى التعليمة التالية تسلسليًا، إذ ستتحقق التعليمة الفرعية مما إذا كان لمسجل معيّن القيمة صفر، أو تتحقق من وجود من ضبط راية flag ما. فإذا كان الأمر كذلك، فسيُعدَّل المؤشر ليؤشّر إلى عنوان مختلف، وبالتالي ستكون التعليمة التالية للتنفيذ من جزء مختلف من البرنامج، وهذه هي الطريقة التي تعمل بها الحلقات وتعليمات القرار.
</p>

<p>
	يمكن مثلًا تنفيذ التعليمة <code>if (x==0)‎</code> من خلال إيجاد ناتج تطبيق عملية <code>or</code> على اثنين من المسجلات، أحدهما يحمل القيمة <code>x</code> والآخر يحمل القيمة صفر، فإذا كانت النتيجة صفرًا، فستكون المقارنة صحيحة، أي أنّ جميع بتات <code>x</code> أصفار ويجب تنفيذ جسم التعليمة، وإلّا فستتجاوز التعليمة الفرعية هذه الشيفرة.
</p>

<h3>
	الدورات
</h3>

<p>
	جميعنا على دراية بسرعة الحاسوب المعطاة بالميجاهرتز أو الجيجاهرتز التي تقابل ملايين أو آلاف الملايين من الدورات في الثانية، ويسمى ذلك بسرعة الساعة Clock Speed لأنها السرعة التي تنبض بها ساعة الحاسوب الداخلية، إذ تُستخدَم النبضات ضمن المعالج لإبقائه متزامنًا داخليًا، ويمكن البدء بعملية أخرى في كل لحظة أو نبضة.
</p>

<h3>
	جلب التعليمة وفك تشفيرها وتنفيذها وتخزين نتيجتها
</h3>

<p>
	يتكون تنفيذ تعليمة واحدة من دورة معينة من الأحداث، وهي الجلب وفك التشفير والتنفيذ والتخزين، إذ يجب على وحدة المعالجة المركزية تطبيق الخطوات التالية لتنفيذ تعليمة <code>add</code> السابقة مثلًا:
</p>

<ol>
	<li>
		الجلب Fetch: الحصول على التعليمات من الذاكرة إلى المعالج.
	</li>
	<li>
		فك التشفير Decode: فك <a href="https://academy.hsoub.com/apps/general/%D8%A7%D9%84%D8%AA%D8%B4%D9%81%D9%8A%D8%B1-%D9%88%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84%D8%A7%D8%AA%D9%87-%D9%81%D9%8A-%D8%A7%D9%84%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D8%B1%D9%82%D9%85%D9%8A-r380/" rel="">تشفير</a> ما يجب أن تفعله داخليًا، أي الجمع في هذه الحالة.
	</li>
	<li>
		التنفيذ Execute: أخذ القيم من المسجلات وجمعها.
	</li>
	<li>
		التخزين Store: تخزين النتيجة في مسجل آخر، كما يمكن رؤية مصطلح انتهاء Retiring التعليمة.
	</li>
</ol>

<h4>
	نظرة داخلية إلى وحدة المعالجة المركزية
</h4>

<p>
	تحتوي وحدة المعالجة المركزية داخليًا على العديد من المكونات الفرعية المختلفة التي تطبّق كلًا من الخطوات المذكورة سابقًا، كما يمكن أن تحدث جميعها بصورة مستقلة عن بعضها البعض، وهي مشابهة لخط الإنتاج في المصانع، حيث توجد العديد من المحطات ولكل خطوة مَهمة معينة لأدائها، ثم يمكنه تمرير النتائج إلى المحطة التالية وأخذ مدخلات جديدة للعمل عليها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="108407" href="https://academy.hsoub.com/uploads/monthly_2022_09/02_block.png.b2578d8dc8d5c56a55771ef03e81c26d.png" rel=""><img alt="02_block.png" class="ipsImage ipsImage_thumbnailed" data-fileid="108407" data-unique="ei7lw5upr" style="width: 550px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_09/02_block.png.b2578d8dc8d5c56a55771ef03e81c26d.png"></a>
</p>

<p>
	تتكون وحدة المعالجة المركزية من العديد من المكونات الفرعية المختلفة، وتطبّق كل منها مهمةً مُخصَّصةً.
</p>

<p>
	توضِّح الصورة السابقة مخططًا بسيطًا لبعض الأجزاء الرئيسية لوحدة المعالجة المركزية الحديثة، حيث يمكنك رؤية التعليمات تأتي ثم يفك المعالج تشفيرها؛ كما تحتوي وحدة المعالجة المركزية على نوعين رئيسيين من المسجّلات، هما مسجلات العمليات الحسابية الخاصة بالأعداد الصحيحة ومسجلات العمليات الحسابية الخاصة بالأعداد العشرية.
</p>

<p>
	تُعَدّ الأعداد العشرية Floating Point طريقةً لتمثيل الأعداد ذات المنزلة العشرية بصيغة ثنائية، ويجري التعامل معها بطريقة مختلفة ضمن وحدة المعالجة المركزية، كما تُعَدّ المسجلات MMX (توسع الوسائط المتعددة Multimedia Extension) و SSE (مجرى بيانات متعددة لتعليمة مفردة Streaming Single Instruction Multiple Data) أو Altivec مسجلات مماثلة للمسجلات الخاصة الأعداد العشرية.
</p>

<p>
	يُعَدّ ملف المسجلات Register File اسمًا يجمع جميع المسجلات الموجودة ضمن وحدة المعالجة المركزية، وتوجد ضمنه أجزاء وحدة المعالجة المركزية التي تنفّذ كل العمل، إذ تحمّل المعالجات أو تخزّن قيمةً في مسجل أو من مسجل إلى الذاكرة، أو تنفّذ بعض العمليات على القيم الموجودة في المسجلات كما قلنا سابقًا.
</p>

<p>
	تُعَدّ وحدة الحساب والمنطق Arithmetic Logic Unit -أو ALU اختصارًا- قلب عمليات وحدة المعالجة المركزية، إذ تأخذ القيم من المسجلات وتنفّذ أيًا من العمليات المتعددة التي تستطيع وحدة المعالجة المركزية تنفيذها، كما تحتوي جميع المعالجات الحديثة على عدد من وحدات ALU، بحيث يمكن لكل منها العمل بصورة مستقلة، وتحتوي المعالجات مثل المعالج بنتيوم Pentium على وحدات ALU سريعة ووحدات ALU بطيئة، إذ تكون الوحدات السريعة أصغر حجمًا، لذا يمكنك استخدام المزيد منها على وحدة المعالجة المركزية، ولكن يمكنك تنفيذ العمليات الأكثر شيوعًا فقط؛ أما وحدات ALU البطيئة، فيمكنها تنفيذ جميع العمليات ولكنها تكون أكبر حجمًا.
</p>

<p>
	تعالِج وحدة إنشاء العناوين Address Generation Unit -أو AGU اختصارًا- التواصل مع الذاكرة المخبئية Cache Memory والذاكرة الرئيسية لجلب القيم إلى المسجلات لكي تعمل وحدة ALU، ثم استعادة القيم من المسجلات إلى الذاكرة الرئيسية، كما تحتوي مسجلات الأعداد العشرية على المفاهيم نفسها، ولكنها تستخدِم مصطلحات مختلفةً قليلًا لمكوناتها.
</p>

<h4 id="pipeline">
	استخدام خط الأنابيب
</h4>

<p>
	تُعَدّ عملية وحدة ALU التي تجمع قيم المسجلات منفصلةً تمامًا عن عملية وحدة AGU التي تكتب القيم في الذاكرة، إذ لا يوجد سبب يمنع وحدة المعالجة المركزية من تطبيق هاتين العمليتين معًا في وقت واحد، كما توجد عدة وحدات ALU في النظام والتي يمكن أن تعمل كل منها على تعليمات منفصلة.
</p>

<p>
	يمكن لوحدة المعالجة المركزية تنفيذ بعض عمليات الأعداد العشرية باستخدام منطق الأعداد العشرية أثناء تشغيل تعليمات الأعداد الصحيحة أيضًا، إذ تسمى هذه العملية باستخدام خط الأنابيب Pipelining، ويشار إلى المعالج الذي يمكنه تطبيق هذه العملية بأن له معمارية عددية فائقة Superscalar Architecture، إذ تُعَدّ جميع المعالجات الحديثة معالجات عدديةً فائقةً، ويحتوي أيّ معالج حديث على أكثر من أربع مراحل يمكنه استخدامها ضمن خط أنابيب، وكلما زاد عدد المراحل التي يمكن تنفيذها في الوقت نفسه، زاد عمق خط الأنابيب.
</p>

<p>
	يمكن تشبيه خط الأنابيب بأنبوب مملوء بكرات زجاجية، باستثناء أن هذه الكرات هي تعليمات وحدة المعالجة المركزية، إذ ستضع الكرات الزجاجية في نهاية واحدة، بحيث تضعها واحدةً تلو الأخرى -أي كرة لكل نبضة ساعة- حتى تملأ الأنبوب، وستنتقل كل كرة زجاجية -أو تعليمة- تدفعها للداخل إلى الموضع التالي بمجرد أن يمتلئ الأنبوب مع سقوط كرة في النهاية التي تمثّل النتيجة.
</p>

<p>
	تؤدي التعليمات الفرعية إلى إحداث فوضى في هذا النموذج، إذ يمكن أن تتسبب أو لا تتسبب في بدء التنفيذ من مكان مختلف، فإذا أردت استخدام خط الأنابيب، فسيتعين عليك تخمين الاتجاه الذي ستتجه فيه التعليمة الفرعية حتى تعرف التعليمات التي يجب إحضارها إلى خط الأنابيب، فإذا خمّنت وحدة المعالجة المركزية ذلك بصورة صحيحة، فسيسير كل شيء على ما يرام، إذ تستخدِم المعالجات مثل معالج بنتيوم ذاكرة تخزين مؤقت Trace Cache لتعقب مسار التعليمات الفرعية، حيث يمكن في كثير من الأحيان أن تخمّن الطريق الذي ستذهب إليه التعليمة الفرعية من خلال تذكر نتائجها السابقة، فإذا تذّكرتَ نتيجة التعليمة الفرعية الأخيرة في حلقة تتكرر 100 مرة مثلًا، فستكون على صواب 99 مرة، لأن المرة الأخيرة فقط ستستمر في البرنامج فعليًا؛ بينما إذا جرى تخمين المعالج بطريقة غير صحيحة، فهذا يعني أنّ المعالج قد أهدر كثيرًا من الوقت ويجب عليه مسح خط الأنابيب والبدء من جديد.
</p>

<p>
	يشار إلى هذه العملية عادةً باسم تفريغ خط الأنابيب Pipeline Flush وهي مماثلة للحاجة إلى التوقف وإفراغ كل الكرات من الأنبوب، كما تتكوّن عملية تخمين التعليمة الفرعية Branch Prediction من تفريغ خط الأنابيب وأخذ التخمين أو عدم الأخذ به وفتحات تأخير التعليمة الفرعية branch delay slots.
</p>

<h4>
	إعادة الترتيب
</h4>

<p>
	إذا كانت وحدة المعالجة المركزية هي الأنبوب، فسنكون لك الحرية في إعادة ترتيب الكرات ضمنه طالما أنها تخرج من نهايته بالترتيب نفسه الذي وضعتَها فيه، إذ نسمي ذلك بترتيب البرنامج Program Order لأنه ترتيب التعليمات المُعطَى في البرنامج الحاسوبي، كما يمكنك الاطلاع على المثال التالي الذي يمثل إعادة ترتيب المخزن المؤقت Buffer:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6802_8" style=""><span class="lit">1</span><span class="pun">:</span><span class="pln"> r3 </span><span class="pun">=</span><span class="pln"> r1 </span><span class="pun">*</span><span class="pln"> r2
</span><span class="lit">2</span><span class="pun">:</span><span class="pln"> r4 </span><span class="pun">=</span><span class="pln"> r2 </span><span class="pun">+</span><span class="pln"> r3
</span><span class="lit">3</span><span class="pun">:</span><span class="pln"> r7 </span><span class="pun">=</span><span class="pln"> r5 </span><span class="pun">*</span><span class="pln"> r6
</span><span class="lit">4</span><span class="pun">:</span><span class="pln"> r8 </span><span class="pun">=</span><span class="pln"> r1 </span><span class="pun">+</span><span class="pln"> r7</span></pre>

<p>
	افترض مجرى التعليمات الموضح سابقًا، إذ يجب على التعليمة 2 انتظار اكتمال التعليمة 1 قبل أن تبدأ، وهذا يعني أنّ خط الأنابيب يجب عليه التوقف أثناء انتظار القيمة المراد حسابها، كما تعتمد التعليمتان 3 و 4 على قيمة <code>r7</code>، ولكن التعليمتان 2 و 3 لا تعتمدان على بعضهما البعض أبدًا، وهذا يعني أنهما يعملان في مسجلات منفصلة تمامًا، فإذا بدّلنا بين التعليمتين 2 و 3، فسنحصل على ترتيب أفضل لخط الأنابيب، إذ يمكن أن ينفّذ المعالج عملًا مفيدًا بدلًا من انتظار اكتمال خط الأنابيب للحصول على نتيجة التعليمة السابقة.
</p>

<p>
	يمكن أن تتطلب التعليمات بعض الأمان حول كيفية ترتيب العمليات عند كتابة شيفرة منخفضة المستوى، إذ نطلق على هذا المتطلب دلالات الذاكرة Memory Semantics، فإذا أردت اكتساب الدلالات Acquire Semantics، فهذا يعني أنه يجب عليك التأكد من إكمال نتائج جميع التعليمات السابقة للتعليمة الحالية، وإذا أردت تحرير الدلالات Release Semantics، فهذا يعني أنّ جميع التعليمات بعد هذه التعليمة يجب أن ترى النتيجة الحالية.
</p>

<p>
	توجد دلالات أخرى أكثر صرامة وهي حاجز الذاكرة Memory Barrier أو سور الذاكرة Memory Fence الذي يتطلب أن تكون العمليات مرتبطةً بالذاكرة قبل المتابعة، كما يضمن المعالج هذه الدلالات في بعض المعماريات، بينما يجب أن تحددها بصورة صريحة في المعماريات الأخرى، ولا يحتاج معظم المبرمجين إلى القلق بشأنها على الرغم من أنك قد تصادفها.
</p>

<h3>
	معمارية CISC ومعمارية RISC
</h3>

<p>
	يمكن تقسيم معماريات الحاسوب إلى معمارية حاسوب مجموعة التعليمات المعقدة Complex Instruction Set Computer -أو CISC اختصارًا- ومعمارية حاسوب مجموعة التعليمات المُخفَّضة Reduced Instruction Set Computer أو RISC اختصارًا.
</p>

<p>
	لاحظ أننا في المثال الأول من مقالنا حمّلنا القيم صراحةً في المسجلات وأجرينا عملية الجمع، ثم خزّنا القيمة الناتجة المحفوظة في مسجل آخر في الذاكرة، إذ يُعَدّ ذلك مثالًا عن نهج RISC للحوسبة الذي يشمل تنفيذ العمليات على القيم الموجودة في المسجلات وتحميل القيم وتخزينها بصورة صريحة من الذاكرة وإليها، كما يمكن أن يكون نهج CISC مجرد تعليمات مفردة تأخذ قيمًا من الذاكرة وتنفذ عملية الجمع داخليًا ثم تكتب النتيجة، وهذا يعني أنّ التعليمات يمكن أن تستغرق عدة دورات، ولكن كلا النهجين يحققان في النهاية الهدف نفسه.
</p>

<p>
	تُعَدّ جميع المعماريات الحديثة معماريات RISC حتى معمارية إنتل بنتيوم Intel Pentium الأكثر شيوعًا والتي تهدم التعليمات داخليًا إلى تعليمات فرعية بأسلوب RISC داخل الشريحة قبل التنفيذ، بالرغم من وجود مجموعة تعليمات مصنَّفة على أنها CISC، وهناك عدة أسباب لذلك وهي:
</p>

<ul>
	<li>
		تجعل معمارية RISC البرمجة بلغة التجميع Assembly أكثر تعقيدًا، نظرًا لأن جميع المبرمجين تقريبًا يستخدِمون لغات عالية المستوى ويتركون العمل الشاق لإنتاج شيفرة التجميع للمصرّف Compiler، وبالتالي ستتفوق المزايا الأخرى على هذا العيب.
	</li>
	<li>
		بما أنّ التعليمات الموجودة في معالج RISC أبسط، فهناك مساحة أكبر ضمن شريحة المسجلات، إذ تُعَدّ المسجلات أسرع أنواع الذواكر كما نعلم من تسلسل الذواكر الهرمي، ويجب في النهاية تنفيذ جميع التعليمات على القيم المحفوظة في المسجلات، لذا ستؤدي زيادة عدد المسجلات إلى أداء أعلى عند تكافؤ جميع الأشياء الأخرى.
	</li>
	<li>
		بما أنّ جميع التعليمات تُنفَّذ في الوقت نفسه، فسيكون استخدام خطوط الأنابيب ممكنًا، وكما نعلم أنّ استخدام خط الأنابيب يتطلب تدفقات من التعليمات باستمرار إلى المعالج، لذلك إذا استغرقت بعض التعليمات وقتًا طويلًا جدًا دون أن تتطلب التعليمات الأخرى ذلك، فسيصبح خط الأنابيب معقدًا ليكون فعّالًا.
	</li>
</ul>

<h4>
	معمارية EPIC
</h4>

<p>
	يُعَدّ معالج إيتانيوم Itanium مثالًا على معمارية معدَّلة تسمى الحوسبة الصريحة للتعليمات الفرعية Explicitly Parallel Instruction Computing.
</p>

<p>
	ناقشنا سابقًا كيف أنّ المعالجات الفائقة لها خطوط أنابيب بها العديد من التعليمات في الوقت نفسه ضمن أجزاء مختلفة من المعالج، إذ يمكن تحقيق ذلك من خلال إعطاء التعليمات للمعالج بالترتيب الذي يمكن أن يحقق أفضل استفادة من العناصر المتاحة في وحدة المعالجة المركزية، وقد كان تنظيم مجرى التعليمات الواردة تقليديًا مهمة العتاد، إذ يصدر البرنامج التعليمات بطريقة تسلسلية، ويجب أن ينظر المعالج إلى الأمام ويحاول اتخاذ قرارات حول كيفية تنظيم التعليمات الواردة.
</p>

<p>
	الفكرة وراء معمارية EPIC هي أنّ هناك مزيد من المعلومات المتاحة على مستويات أعلى والتي يمكن أن تجعل هذه القرارات أفضل مما يفعله المعالج، ويؤدي تحليل مجرًى من تعليمات لغة التجميع -كما تفعل المعالجات الحالية- إلى فقدان الكثير من المعلومات التي قدّمها المبرمج في الشيفرة البرمجية الأصلية.
</p>

<p>
	فكر في الأمر على أنه الفرق بين دراسة مسرحية لشكسبير وقراءة نسخة ملاحظات الجرف Cliff's Notes من المسرحية نفسها، فكلاهما يمنحك النتيجة نفسها، ولكن النسخة الأصلية تحتوي على جميع أنواع المعلومات الإضافية التي تحدد المشهد وتعطيك فهمًا جيدًا للشخصيات، وبالتالي يمكن نقل منطق ترتيب التعليمات من المعالج إلى المصرّف، وهذا يعني أنّ مطوِّري المصرّفات يجب أن يكونوا أذكى في محاولة العثور على أفضل ترتيب للشيفرة البرمجية للمعالج، كما يجب تبسيط المعالج كثيرًا، إذ نُقِل الكثير من عمله إلى المصرِّف.
</p>

<p>
	يوجد مصطلح آخر غالبًا ما يُستخدَم مع معمارية EPIC وهو عالم التعليمات الطويلة جدًا Very Long Instruction World -أو VLIW اختصارًا-، إذ تُوسَّع كل تعليمة للمعالج لإخباره بالمكان الذي يجب أن ينفّذ فيه التعليمة في وحداته الداخلية، وتكمن مشكلة هذا الأسلوب في أنّ الشيفرة البرمجية تعتمد كليًا على طراز المعالج الذي صُرِّفت الشيفرة البرمجية من أجله، كما تُجري الشركات دائمًا مراجعات على العتاد، وتجعل العملاء يعيدون تصريف تطبيقاتهم في كل مرة، مما جعل صيانة مجموعة من الشيفرات البرمجية الثنائية المختلفة أمرًا غير عملي.
</p>

<p>
	تحل معمارية EPIC هذه المشكلة بطريقة علوم الحاسوب المعتادة من خلال إضافة طبقة من التجريد، كما تنشئ معمارية EPIC عرضًا مبسطًا مع بعض الوحدات الأساسية مثل الذاكرة ومسجّلات الأعداد الصحيحة والعشرية بدلًا من التحديد الصريح للجزء الدقيق من المعالج الذي يجب أن تنفّذ التعليمات عليه.
</p>

<p>
	ترجمة -وبتصرُّف- للقسم <a href="https://www.bottomupcs.com/chapter02.xhtml#the_cpu" rel="external nofollow">The CPU</a> من الفصل <a href="https://www.bottomupcs.com/chapter02.xhtml" rel="external nofollow">Computer Architecture</a> من كتاب <a href="https://www.bottomupcs.com/" rel="external nofollow">Computer Science from the Bottom Up</a> لصاحبه Ian Wienand.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي:  <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D9%85%D9%8A%D9%82%D8%A9-%D8%B9%D9%84%D9%89-%D8%AA%D8%B3%D9%84%D8%B3%D9%84-%D8%A7%D9%84%D8%B0%D9%88%D8%A7%D9%83%D8%B1-%D8%A7%D9%84%D9%87%D8%B1%D9%85%D9%8A-%D9%88%D8%A7%D9%84%D8%B0%D8%A7%D9%83%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D8%AE%D8%A8%D8%A6%D9%8A%D8%A9-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1720/" rel="">نظرة عميقة على تسلسل الذواكر الهرمي والذاكرة المخبئية في معمارية الحاسوب</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D9%85%D8%AB%D9%8A%D9%84-%D8%A7%D9%84%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D9%88%D8%A7%D9%84%D8%A3%D8%B9%D8%AF%D8%A7%D8%AF-%D9%81%D9%8A-%D8%A7%D9%84%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8%D9%8A%D8%A9-r1659/" rel="">تمثيل الأنواع والأعداد في الأنظمة الحاسوبية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/certificates/comptia/%D9%88%D8%AD%D8%AF%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A%D8%A9-r58/" rel="">وحدة المعالجة المركزية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">المدخل الشامل لتعلم علوم الحاسوب</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1716</guid><pubDate>Thu, 22 Sep 2022 11:04:00 +0000</pubDate></item><item><title>&#x648;&#x635;&#x644; &#x631;&#x627;&#x633;&#x628;&#x631;&#x64A; &#x628;&#x627;&#x64A; &#x628;&#x62D;&#x627;&#x633;&#x648;&#x628;&#x643; &#x639;&#x628;&#x631; SSH</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D9%88%D8%B5%D9%84-%D8%B1%D8%A7%D8%B3%D8%A8%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D8%A8%D8%AD%D8%A7%D8%B3%D9%88%D8%A8%D9%83-%D8%B9%D8%A8%D8%B1-ssh-r2080/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/---SSH.png.51a7f77e1e1a451100d26ee62a1bf170.png" /></p>
<p>
	سنشرح في هذا الدرس كيفية الوصول إلى طرفية راسبيري باي Raspberry Pi باستخدام حاسوبك الشخصي وذلك عبر خادم <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr>.
</p>

<p>
	من خلال استخدام خادم <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> ستتمكن من كتابة جميع أوامر الطرفية الخاصة براسبيري باي وتنفيذها دون الحاجة إلى وصل شاشة خارجية بجهاز راسبيري باي.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="603" id="ips_uid_117_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="وصل راسبري باي بحاسوبك عبر SSH" width="1072" data-embed-src="https://www.youtube.com/embed/sT4KrnuU-Pg"></iframe>
</p>

<p>
	تعرف أكثر على أنظمة التشغيل و <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></abbr> في <a href="https://academy.hsoub.com/learn/computer-science/" rel="">دورة علوم الحاسوب</a>، ولا تنسَ الاستعانة خلال رحلة تعلمك وعملك بتوثيقات <a href="https://wiki.hsoub.com/%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" rel="external">موسوعة حسوب</a> المجانية. وإذا أردت متابعة المعلومات البرمجية العلمية مكتوبة فيمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/" rel="">قسم البرمجة في أكاديمية حسوب</a>، كما يمكنك متابعة جديد الفيديوهات التقنية المتاحة على <a href="https://www.youtube.com/@HsoubAcademy" rel="external nofollow">يوتيوب أكاديمية حسوب</a> مجانًا.
</p>
]]></description><guid isPermaLink="false">2080</guid><pubDate>Thu, 15 Sep 2022 15:00:00 +0000</pubDate></item><item><title>&#x62A;&#x645;&#x62B;&#x64A;&#x644; &#x627;&#x644;&#x623;&#x646;&#x648;&#x627;&#x639; &#x648;&#x627;&#x644;&#x623;&#x639;&#x62F;&#x627;&#x62F; &#x641;&#x64A; &#x627;&#x644;&#x623;&#x646;&#x638;&#x645;&#x629; &#x627;&#x644;&#x62D;&#x627;&#x633;&#x648;&#x628;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D9%85%D8%AB%D9%8A%D9%84-%D8%A7%D9%84%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D9%88%D8%A7%D9%84%D8%A3%D8%B9%D8%AF%D8%A7%D8%AF-%D9%81%D9%8A-%D8%A7%D9%84%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8%D9%8A%D8%A9-r1659/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_08/62f4ee2421aaa_--.jpg.af9ae9cc1f8004fdb0fcbbb2177ba0c2.jpg" /></p>
<p>
	يجب التصريح عن نوع كل متغير في اللغة التي يحدَّد فيها نوع المتغير typed language مثل اللغة C، إذ يُعلِم النوع <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%81%D8%B5%D9%84-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%AA%D8%B5%D8%B1%D9%8A%D9%81-compilation-%D9%81%D9%8A-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r976/" rel="">المصرِّف</a> مالذي يتوقع تخزينه في المتغير، وبالتالي يستطيع المصرّف تخصيص مساحة كافية لهذا الاستخدام، والتحقق من أن المبرمج لا ينتهك قيود النوع المحدَّد
</p>

<h2>
	معايير اللغة C
</h2>

<p>
	من الضروري الاطلاع قليلًا على تاريخ اللغة البرمجية C على الرغم من الاختلاف الطفيف بينها وبين بقية اللغات، إذ تُعَدّ C بأنها اللغة السائدة في عالم برمجة الأنظمة، فكل <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">نظام تشغيل</a> ومكتباته المرتبطة به التي يشيع استخدامها مكتوبة باللغة C، كما يوفِّر كل نظام مصرِّفًا compiler للغة C، وقد وضِع معيار صارم لهذه اللغة للحد من اختلافها بين هذه الأنظمة والتي من المؤكد أنّ كل منها سيجري العديد من التغييرات التي لن تتوافق مع بعضها.
</p>

<p>
	يُعرَف هذا المعيار رسميًا باسم ISO/IEC 9899:1999(E)‎، لكن يشار إليه عادةً بالاختصار C99، إذ تشرف عليه منظمة المعايير الدولية ISO، كما أتيح شراء المعيار كاملًا على <a href="https://academy.hsoub.com/devops/networking/%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r571/" rel="">الإنترنت</a>، ولم تَعُد الإصدارات القديمة من هذا المعيار مثل الإصدار C89 -الذي سبق C99 وأصدِر في عام 1989- و ANSI C شائعة الاستخدام، وأصبحت جزءًا من أحدث معيار، كما أنّ توثيق المعيار تقني بحت ويذكر بالتفصيل تقريبًا جميع نواحي اللغة، إذ يشرح مثلًا بنيتها بصيغة باكوس نور Backus Naur وقيم <code>define#</code> المعيارية والآلية التي يجب أن تعمل وفقها العمليات.
</p>

<p>
	من الضروري أيضًا ملاحظة ما الذي لا تحدده معايير اللغة C، والأهم من ذلك أنه يجب أن يكون المعيار ملائمًا لكل معمارية حاسوبية حالية ومستقبلية، وبالتالي يحرص على عدم تحديد المجالات التي تعتمد على المعمارية، كما يُعَدّ الرابط بين معيار اللغة C والمعمارية الأساسية هو واجهة التطبيق الثنائية Application Binary Interface -أو ABI اختصارًا- التي سنتحدث عنها لاحقًا، كما سيذكر المعيار في عدة مواضع أن أية عملية أو بنية معيّنة سيكون لها نتيجة غير محددة أو نتيجة تعتمد على التنفيذ، ومن البديهي أن المبرمج لا يمكنه الاعتماد على هذه النتائج إذا كان يريد كتابة شيفرة برمجية محمولة portable.
</p>

<h2>
	جنو سي GNU C
</h2>

<p>
	ينفِّذ مصرِّف GNU C -والذي يشار إليه عادةً بالاختصار gcc- معيار C99 بالكامل تقريبًا، ويطبِّق أيضًا مجموعة إضافات للمعيار سيستخدمها المبرمجون غالبًا للحصول على خصائص وظيفية إضافية على حساب قابلية النقل إلى مصرِّف آخر، إذ ترتبط هذه الإضافات عادةً بالشيفرة البرمجية ذات المستوى المنخفض low level code وهي أكثر شيوعًا في مجال برمجة النظم؛ أما أكثر إضافة يشيع استخدامها في هذا المجال، فهي شيفرة التجميع المُضمّن inline assembly، كما يجب على المبرمجين قراءة توثيق مصرِّف GNU C وفهم متى قد يستخدِمون الخصائص الإضافية على المعيار.
</p>

<p>
	يمكن توجيه مصرِّف GNU C للالتزام بدقة بالمعيار مثل راية <code>std = c99-</code> والتحذير أو توليد خطأ عند تنفيذ أمور معينة لا تتوافق مع المعيار. وهذا طبعًا يناسبك عندما تكون بحاجة إلى ضمان إمكانية نقل شيفرتك البرمجية بسهولة إلى مصرِّف آخر.
</p>

<h2>
	الأنواع
</h2>

<p>
	نحن المبرمجون معتادون على استخدام المتغيرات لتمثيل مساحة من الذاكرة لتحمل قيمةً، إذ يجب التصريح عن نوع كل متغير في اللغة التي يُحدَّد فيها نوع المتغير typed language مثل اللغة C، كما يخبر النوع المصرِّف مالذي يتوقع تخزينه في المتغير، وبالتالي سيستطيع المصرِّف تخصيص مساحة كافية لهذا الاستخدام والتحقق من أنّ المبرمج لا ينتهك قيود النوع المحدَّد، وسنجد في الصورة التالية مثالًا على المساحة المخصصة لبعض الأنواع الشائعة من المتغيرات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="104994" href="https://academy.hsoub.com/uploads/monthly_2022_08/types.png.0f8f74d4f0b46ecd5a05b4c719d73ea0.png" rel=""><img alt="types.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104994" data-unique="tzecnzhne" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_08/types.thumb.png.01938e23c4cbccf4482f246084cfa5dc.png"></a>
</p>

<p style="text-align: center;">
	(الأنواع)
</p>

<p>
	يذكر معيار C99 أصغر حجم ممكن لكل نوع من أنواع المتغيرات المعرَّفة في اللغة C فقط، وذلك لأنّ الحجم الأمثل للأنواع يختلف اختلافًا كبيرًا بين مختلف معماريات المعالجات وأنظمة التشغيل، ولكي تكون العملية صحيحةً تمامًا يجب ألا يفترض المبرمجون أبدًا حجم أيّ من متغيراتهم، لكن يحتاج نظام التشغيل الفعال بطبيعة الحال إلى اتفاقات حول الأحجام التي ستحجزها أنواع المتغيرات في النظام، كما تتقيد كل معمارية ونظام تشغيل بواجهة التطبيق الثنائية Application Binary Interface -أو ABI اختصارًا-، إذ تملأ واجهة التطبيق الثنائية لنظام ما التفاصيل التي تربط بين معيار اللغة C ومتطلبات العتاد الصلب الأساسي ونظام التشغيل، كما تُكتَب واجهة التطبيق الثنائية لمجموعة محدَّدة من المعالج ونظام التشغيل.
</p>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
} 

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table>
	<thead>
		<tr>
			<th>
				النوع
			</th>
			<th>
				الحجم الأدنى وفق معيار C99 بواحدة البِتّ
			</th>
			<th>
				الحجم الشائع أي معمارية 32 بِتّ
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				char
			</td>
			<td>
				8
			</td>
			<td>
				8
			</td>
		</tr>
		<tr>
			<td>
				short
			</td>
			<td>
				16
			</td>
			<td>
				16
			</td>
		</tr>
		<tr>
			<td>
				int
			</td>
			<td>
				16
			</td>
			<td>
				32
			</td>
		</tr>
		<tr>
			<td>
				long
			</td>
			<td>
				32
			</td>
			<td>
				32
			</td>
		</tr>
		<tr>
			<td>
				long long
			</td>
			<td>
				64
			</td>
			<td>
				64
			</td>
		</tr>
		<tr>
			<td>
				المؤشرات Pointers
			</td>
			<td>
				حسب التنفيذ
			</td>
			<td>
				32
			</td>
		</tr>
	</tbody>
</table>

<p>
	نلاحظ في مثالنا السابق أنّ الاختلاف الوحيد عن المعيار C99 هو أن حجم المتغير من نوع <code>int</code> هو 32 بِتّ عادةً، وهو ضعف الحد الأدنى الصارم لحجم 16 بت الذي يتطلبه المعيار C99، كما أنّ المؤشرات Pointers هي فعليًا عنوان فقط، أي أنّ قيمتها تكون عنوانًا وبالتالي "تشير" إلى موقع آخر في الذاكرة، لذا يجب تخصيص حجم كافٍ للمؤشر حتى يتمكن من عنونة أيّ موقع في ذاكرة النظام.
</p>

<h3>
	64 بت
</h3>

<p>
	إحدى النواحي المربِكة هي إدراج حوسبة 64 بت، إذ يعني هذا أنّ المعالج يمكنه معالجة العناوين التي تخزَّن على 64 بت وتحديدًا تكون سعة السجلات 64 بِتّ، وهو موضوع سنتناوله في مقال لاحق من هذه السلسلة.
</p>

<p>
	يعني هذا أولًا أنّ جميع المؤشرات يجب أن تكون بحجم 64 بِتّ حتى تتمكن من تمثيل أيّ عنوان محتمل في النظام، لكن عندها يجب على منفّذِي النظام system implementers تحديد حجم الأنواع الأخرى، في حين ينتشر استخدام نموذجَين شائعَين على نطاق واسع كما هو موضح في الجدول التالي:
</p>

<table>
	<thead>
		<tr>
			<th>
				النوع
			</th>
			<th>
				الحجم الأدنى وفق معيار C99 بواحدة البِتّ
			</th>
			<th>
				الحجم الشائع LP64
			</th>
			<th>
				الحجم الشائع في نظام التشغيل ويندوز
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				char
			</td>
			<td>
				8
			</td>
			<td>
				8
			</td>
			<td>
				8
			</td>
		</tr>
		<tr>
			<td>
				short
			</td>
			<td>
				16
			</td>
			<td>
				16
			</td>
			<td>
				16
			</td>
		</tr>
		<tr>
			<td>
				int
			</td>
			<td>
				16
			</td>
			<td>
				32
			</td>
			<td>
				32
			</td>
		</tr>
		<tr>
			<td>
				long
			</td>
			<td>
				32
			</td>
			<td>
				64
			</td>
			<td>
				32
			</td>
		</tr>
		<tr>
			<td>
				long long
			</td>
			<td>
				64
			</td>
			<td>
				64
			</td>
			<td>
				64
			</td>
		</tr>
		<tr>
			<td>
				المؤشرات Pointers
			</td>
			<td>
				حسب التنفيذ
			</td>
			<td>
				64
			</td>
			<td>
				64
			</td>
		</tr>
	</tbody>
</table>

<p>
	يمكنك ملاحظة أنه في نموذج long pointer 64 أي المؤشرالطويل 64 -أو LP64 اختصارًا- يحدَّد حجم قيم المتغير من نوع <code>Long</code> بـ 64 بِتّ، وهذا يختلف عن نموذج 32 بِتّ الذي عرضناه سابقًا، إذ يستخدَم نموذج LP64 في أنظمة UNIX على نطاق واسع؛ أما في النموذج الآخر، فيبقى حجم المتغير من نوع <code>long</code> بقيمة 32 بت، وهذا يحافظ على أقصى قدر ممكن من التوافق مع الشيفرة البرمجية بنظام 32، إذ يُستخدَم هذا النموذج في نظام ويندوز الذي يدعم 64 بِتّ.
</p>

<p>
	تكمن أسباب وجيهة خلف عدم زيادة حجم المتغير من نوع <code>int</code> إلى 64 بِتّ في أيّ من النموذجين، فإذا زاد حجم هذا المتغير إلى 64 بِتّ، فلن تترك للمبرمجين أيّ طريقة للحصول على متغير بحجم 32 بِتّ، وستكون الطريقة الوحيدة هي إعادة تعريف المتغيرات من نوع <code>short</code> لتكون من نوع 32 بِتّ الأكبر.
</p>

<p>
	يُعَدّ المتغير بحجم 64 بِتّ كبيرًا جدًا لدرجة أنه ليس مطلوبًا عمومًا لتمثيل العديد من المتغيرات، فنادرًا ما تتكرر الحلقات loops مثلًا عدد مرات أكبر من أن يتسع في متغير حجمه 32 بِتّ الذي يتسع لـ 4294967296 مرة، وعادةً ما تمثَّل الصور بثمانية بِتّات لكل من قيم الأحمر والأخضر والأزرق وثمانية بِتّات إضافية مخصصة للمعلومات الإضافية (قناة ألفا) ما مجموعه 32 بِتّ، وبالتالي سيؤدي استخدام متغير بحجم 64 بِتّ في كثير من الحالات إلى إهدار أول 32 بِتّ على الأقل إذا لم يُهدَر أكثر من ذلك، وليس هذا فحسب، وإنما حجم مصفوفة عدد صحيح integer يتضاعف بذلك أيضًا.
</p>

<p>
	يعني هذا أنّ البرامج ستستهلك حجمًا أكبر من ذاكرة النظام دون أيّ تحسن يذكر في أدائه، وبالتالي حجمًا أكبر من ذاكرة التخزين المؤقت cache التي سنتحدث عنها بالتفصيل في مقال لاحق من هذه السلسلة، ولهذا السبب اختار نظام ويندوز الاحتفاظ بتخزين قيم المتغيرات من نوع long في 32 بت، فبما أنّ الكثير من واجهات <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> على نظام ويندوز قد كُتبَت في الأصل لاستخدام متغيرات من نوع long مخزَّنة على نظام 32 بِتّ، لذا لا تحتاج إلى بِتّات إضافية، مما سيوفر ذلك مساحةً مهدورةً كبيرةً في النظام دون الحاجة إلى إعادة كتابة كامل <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">واجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a>.
</p>

<p>
	إذا جربنا البديل المقترَح المتمثل في إعادة تعريف المتغير من نوع <code>short</code> ليكون متغيرًا يخزَّن على 32 بِتّ، فسيستطيع المبرمجون الذين يعملون على نظام 64 بِتّ تحديد هذا النوع للمتغيرات التي يعلمون أنها مرتبطة بقيم أصغر، ولكن عند العودة إلى نظام 32 بِتّ، فسيكون متغير <code>short</code> نفسه الذي حددوه الآن بحجم 16 بِتّ فقط، وهي قيمة تجاوزوها بمراحل كبيرة عمليًا، أي 2‎<sup>10</sup> = 65536.
</p>

<p>
	سيحقق جعل المبرمج يطلب متغيرات أكبر حجمًا عندما يعلم أنه سيحتاج إليها توازنًا فيما يتعلق بمخاوف قابلية النقل وإهدار المساحة في الأنظمة الثنائية.
</p>

<h3>
	مؤهلات الأنواع
</h3>

<p>
	يتحدث معيار اللغة C أيضًا عن بعض المؤهلات qualifiers لأنواع المتغيرات، إذ يشير المؤهل <code>const</code> مثلًا إلى أنّ المتغير لن تُعدَّل قيمته الأصلية أبدًا، والمؤهل <code>volatile</code> يقترح على المصرِّف بأنّ قيمة المتغير قد تتغير بعيدًا عن تدفق تنفيذ البرنامج، لذا يجب أن يحرص المصرِّف على عدم إعادة ترتيب الوصول إليه بأيّ شكل من الأشكال، كما يُعَدّ كل من مؤهل المؤشَّر <code>signed</code> ومؤهل غير المؤشَّر <code>unsigned</code> أنهما المؤهلَين الأهم على الأرجح، فهما يحدِّدان فيما إذا كان يُسمَح للمتغير بأن يأخذ قيمةً سالبةً أم لا، وسنتناول هذا بالتفصيل لاحقًا. الغرض من جميع المؤهلات هو تمرير معلومات إضافية للمصرِّف حول كيفية استخدامِه للمتغير، ويعني هذا أمرَين وهما أنّ المصرِّف قادر على التحقق مما إذا انتهكت القواعد التي وضعتها بنفسك مثل الكتابة في متغير قيمته ثابتة <code>const</code>، وقادر على إجراء تحسينات بناءً على المعلومات الإضافية، وسندرس هذا في مقالات لاحقة من هذه السلسلة.
</p>

<h3>
	الأنواع المعيارية
</h3>

<p>
	يدرك واضعو معيار C99 أنّ كل هذه القواعد والأحجام ومخاوف توفر قابلية للنقل قد تصبح مربكةً جدًا، ولتسهيل الأمر فقد قدموا في المعيار سلسلةً من الأنواع الخاصة التي تحدِّد الخصائص المضبوطة للمتغير، وتُحدَّد في الترويسة <code>&lt;stdint.h&gt;</code> وصيغتها <code>qtypes_t</code>، إذ يرمز المحرف <code>q</code> إلى المؤهل ويرمز <code>type</code> إلى النوع الأساسي، في حين يرمز المحرف <code>s</code> إلى الحجم بواحدة البِتّ و<code>t-</code> هو امتداد يشير إلى أنك تستخدِم الأنواع المعرَّفة في معيار C99.
</p>

<p>
	تشير الصيغة <code>uint8_t</code> مثلًا إلى عدد صحيح غير مؤشَّر يخزَّن على 8 بِتّات بالضبط، وقد عُرِّفَت العديد من الأنواع الأخرى، إذ يمكنك الاطلاع على القائمة الكاملة المفصَّلة في مقطع المكتبة المعيارية 17.8 لمعيار C99 أو في ملف الترويسة الموجود بصورة مشفَّرة، كما إنّ توفير هذه الأنواع هي مهمة النظام الذي يطبق معيار C99 بأن يحدِّد لها الأنواع ذات الحجم الملائم على النظام المستهدَف، فمثلًا توفِّر مكتبات النظام هذه الترويسات في <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">نظام التشغيل لينكس</a>.
</p>

<p>
	لاحظ أنّ معيار C99 فيه عوامل مساعدة لتحقيق قابلية النقل لـ <code>printf</code>، إذ يمكن استخدام وحدات ماكرو PRI macros في <code>&lt;inttypes.h&gt;</code> على أساس عوامل محددة للأنواع التي حُدِّدت أحجامها، وكما ذكرنا يمكنك الاطلاع على المعلومات كاملةً في المعيار أو باستخراج الترويسات.
</p>

<h3>
	التطبيق العملي للأنواع
</h3>

<p>
	نرى في النموذج التالي الذي يمثِّل التحذيرات التي ترد عندما لا تتطابق الأنواع مثالًا على فرض الأنواع قيودًا تحدِّد أيّ العمليات المتاح تنفيذها على المتغير وكيف يستعين المصرِّف بهذه المعلومات ليعرض تحذيرًا عند استخدام المتغيرات بطريقة تخالف تلك القيود، إذ نبدأ في هذه الشيفرة البرمجية بإسناد قيمة عدد صحيح <code>integer</code> للمتغير <code>char</code>، وبما أنّ حجم المتغير <code>char</code> أصغر، فسنفقد القيمة الصحيحة للعدد الصحيح <code>integer</code>.
</p>

<p>
	نحاول بعدها تعيين مؤشر pointer للمتغير <code>char</code> يشير إلى الذاكرة التي حددنا بأنها عدد صحيح <code>integer</code>، ويمكن تنفيذ هذه العملية، لكنها ليست آمنةً، لذا نُفِّذ المثال الأول على جهاز معالجه بينتيوم Pentium ذو 32 بِتّ، وأعيدَت القيمة الصحيحة، لكن يبلغ حجم المؤشر 64 بتّ -أي 8 بايت- في نظام معالجه إيتانيوم Itanium ذو 64 بِتّ كما هو موضح في المثال الثاني، ولكن حجم العدد الصحيح <code>integer</code> يبلغ 4 بايت فقط، وبالطبع لن تتسع 8 بايت في 4 بايت.
</p>

<p>
	يمكننا محاولة خداع المصرف بتحويل القيمة قبل إسنادها، ولاحظ أننا في هذه الحالة فاقمنا المشكلة عندما نفَّذنا هذا التحويل وتجاهلنا تحذير المصرف، لأنّ المتغير الأصغر لا يمكنه الاحتفاظ بجميع المعلومات الواردة من المؤشر، فنتلقى في النهاية عنوانًا غير صالح.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5197_16" style=""><span class="pln">  </span><span class="lit">1</span><span class="pln"> </span><span class="com">/*
     * types.c
     */</span><span class="pln">

  </span><span class="lit">5</span><span class="pln"> </span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
    </span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdint.h&gt;</span><span class="pln">

    </span><span class="typ">int</span><span class="pln"> main</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">10</span><span class="pln">     </span><span class="kwd">char</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*</span><span class="pln">p </span><span class="pun">=</span><span class="pln"> </span><span class="str">"hello"</span><span class="pun">;</span><span class="pln">

        </span><span class="typ">int</span><span class="pln"> i</span><span class="pun">;</span><span class="pln">

 </span><span class="lit">15</span><span class="pln">     </span><span class="com">// نقل متغير كبير إلى متغير أصغر منه</span><span class="pln">
        i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x12341234</span><span class="pun">;</span><span class="pln">
        a </span><span class="pun">=</span><span class="pln"> i</span><span class="pun">;</span><span class="pln">
        i </span><span class="pun">=</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">
        printf</span><span class="pun">(</span><span class="str">"i is %d\n"</span><span class="pun">,</span><span class="pln"> i</span><span class="pun">);</span><span class="pln">
 </span><span class="lit">20</span><span class="pln"> 
        </span><span class="com">// ‫‎نقل المؤشر ليشير إلى متغير من نوع ‎integer‎</span><span class="pln">
        printf</span><span class="pun">(</span><span class="str">"p is %p\n"</span><span class="pun">,</span><span class="pln"> p</span><span class="pun">);</span><span class="pln">
        i </span><span class="pun">=</span><span class="pln"> p</span><span class="pun">;</span><span class="pln">
        </span><span class="com">// الخداع بإجراء التحويلات</span><span class="pln">
 </span><span class="lit">25</span><span class="pln">     i </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pun">)</span><span class="pln">p</span><span class="pun">;</span><span class="pln">
        p </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">char</span><span class="pun">*)</span><span class="pln">i</span><span class="pun">;</span><span class="pln">
        printf</span><span class="pun">(</span><span class="str">"p is %p\n"</span><span class="pun">,</span><span class="pln"> p</span><span class="pun">);</span><span class="pln">

        </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="lit">30</span><span class="pln"> </span><span class="pun">}</span></pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5197_18" style=""><span class="pln">  </span><span class="lit">1</span><span class="pln"> $ uname </span><span class="pun">-</span><span class="pln">m
    i686

    $ gcc </span><span class="pun">-</span><span class="typ">Wall</span><span class="pln"> </span><span class="pun">-</span><span class="pln">o types types</span><span class="pun">.</span><span class="pln">c
  </span><span class="lit">5</span><span class="pln"> types</span><span class="pun">.</span><span class="pln">c</span><span class="pun">:</span><span class="pln"> </span><span class="typ">In</span><span class="pln"> function </span><span class="str">'main'</span><span class="pun">:</span><span class="pln">
    types</span><span class="pun">.</span><span class="pln">c</span><span class="pun">:</span><span class="lit">19</span><span class="pun">:</span><span class="pln"> warning</span><span class="pun">:</span><span class="pln"> assignment makes integer from pointer without a cast

    $ </span><span class="pun">./</span><span class="pln">types
    i is </span><span class="lit">52</span><span class="pln">
 </span><span class="lit">10</span><span class="pln"> p is </span><span class="lit">0x80484e8</span><span class="pln">
    p is </span><span class="lit">0x80484e8</span><span class="pln">

    $ uname </span><span class="pun">-</span><span class="pln">m
    ia64
 </span><span class="lit">15</span><span class="pln"> 
    $ gcc </span><span class="pun">-</span><span class="typ">Wall</span><span class="pln">  </span><span class="pun">-</span><span class="pln">o types types</span><span class="pun">.</span><span class="pln">c
    types</span><span class="pun">.</span><span class="pln">c</span><span class="pun">:</span><span class="pln"> </span><span class="typ">In</span><span class="pln"> function </span><span class="str">'main'</span><span class="pun">:</span><span class="pln">
    types</span><span class="pun">.</span><span class="pln">c</span><span class="pun">:</span><span class="lit">19</span><span class="pun">:</span><span class="pln"> warning</span><span class="pun">:</span><span class="pln"> assignment makes integer from pointer without a cast
    types</span><span class="pun">.</span><span class="pln">c</span><span class="pun">:</span><span class="lit">21</span><span class="pun">:</span><span class="pln"> warning</span><span class="pun">:</span><span class="pln"> cast from pointer to integer of different size
 </span><span class="lit">20</span><span class="pln"> types</span><span class="pun">.</span><span class="pln">c</span><span class="pun">:</span><span class="lit">22</span><span class="pun">:</span><span class="pln"> warning</span><span class="pun">:</span><span class="pln"> cast to pointer from integer of different size

    $ </span><span class="pun">./</span><span class="pln">types
    i is </span><span class="lit">52</span><span class="pln">
    p is </span><span class="lit">0x40000000000009e0</span><span class="pln">
 </span><span class="lit">25</span><span class="pln"> p is </span><span class="lit">0x9e0</span></pre>

<h2>
	تمثيل الأعداد
</h2>

<p>
	سنشرح كيفية تمثيل الأعداد بمختلف مجالاتها مثل الأعداد السالبة والأعداد العشرية وغيرهما.
</p>

<h3>
	القيم السلبية
</h3>

<p>
	نميِّز العدد السالب في نظامنا العشري الحديث بوضع علامة الطرح <code>-</code> قبله؛ أما عندما نستخدِم النظام الثنائي، فعلينا اتباع أسلوب مختلف عند الإشارة إلى الأرقام السالبة، إذ يوجد نظام وحيد شائع استخدامه في العتاد الصلب الحديث، لكن معيار C99 يحدِّد ثلاثة أساليب مقبولة لتمثيل القيمة السلبية.
</p>

<h3>
	بت الإشارة Sign Bit
</h3>

<p>
	أبسط طريقة هي تخصيص بت واحد من العدد يشير إلى قيمة سالبة أو موجبة حسب هل هو محدَّد أم لا، وهذا مشابه للنهج الرياضي الذي يبين قيمة العدد بإشارتي <code>+</code> و<code>-</code>، إذ يُعَدّ هذا منطقيًا نوعًا ما، وقد مثّلت بعض أجهزة الحاسوب الأولية أعدادًا سالبةً بهذه الطريقة، لكن يتيح استخدام الأعداد الثنائية بعض الاحتمالات الأخرى التي تسهِّل عمل مصممي العتاد الصلب.
</p>

<p>
	لاحظ أنّ القيمة <code>0</code> قد أصبح لها الآن قيمتان مكافئتان، واحدة حُدِّد فيها بِتّ إشارة وواحدة دون تحديده، وقد يُشار أحيانًا إلى هذه القيم بـ <code>0+</code> و <code>0-</code> على التوالي.
</p>

<h3>
	المتمم الأحادي One's complement
</h3>

<p>
	يطبِّق نهج المتمِّم الأحادي العملية not على العدد الموجب لتمثيل العدد السالب، لذا تمثَّل القيمة 90- (0x5A-) مثلًا بـ <code>10100101 = 01011010~</code>.
</p>

<p>
	لاحظ أن العامِل <code>~</code> هو عامِل في اللغة C الذي يطبق عامِل <code>NOT</code> على القيمة، كما يدعى أحيانًا بعامِل المتمم الأحادي لأسباب صارت معروفة لدينا الآن.
</p>

<p>
	الميزة الأكبر في هذا النظام هي أنه لا يشترط تطبيق منطق خاص عند إضافة عدد سالب إلى عدد موجب، باستثناء أنه يجب إضافة أيّ حمل carry إضافي متبقي إلى القيمة النهائية، لذا تأمل الجدول التالي:
</p>

<table>
	<thead>
		<tr>
			<th>
				النظام العشري
			</th>
			<th>
				النظام الثنائي
			</th>
			<th>
				العملية
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				90-
			</td>
			<td>
				10100101
			</td>
			<td>
				+
			</td>
		</tr>
		<tr>
			<td>
				100
			</td>
			<td>
				01100100
			</td>
			<td>
				 
			</td>
		</tr>
		<tr>
			<td>
				---
			</td>
			<td>
				--------
			</td>
			<td>
				 
			</td>
		</tr>
		<tr>
			<td>
				10
			</td>
			<td>
				00001001 <sup>1</sup>
			</td>
			<td>
				9
			</td>
		</tr>
		<tr>
			<td>
				 
			</td>
			<td>
				00001010
			</td>
			<td>
				10
			</td>
		</tr>
	</tbody>
</table>

<p>
	إذا أضفت البتات الواحد تلو الآخر، فستجد أنه سينتج لديك في النهاية بِتّ حمل carry bit الموضَّح في الجدول، وستنتج لدينا القيمة الصحيحة 10 بإضافته مجددًا إلى العدد الأصلي.
</p>

<p>
	مجددًا لا تزال لدينا مشكلة تمثيل الصِفرين، ولا يوجد حاسوب حديث يستخدِم المتمم الأحادي، والسبب الرئيسي في ذلك وجود نظام أفضل.
</p>

<h4>
	المتمم الثنائي Two's Complement
</h4>

<p>
	يتشابه المتمم الثنائي تمامًا مع المتمم الأحادي، باستثناء أنّ التمثيل السالب يضاف إليه واحد ونتجاهل أيّ بِتّات حمل متبقية، فإذا طبقناه على المثال السابق، فسنمثِّل العدد <code>90-</code> وفق ما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5197_20" style=""><span class="pun">~</span><span class="lit">01011010</span><span class="pun">+</span><span class="lit">1</span><span class="pun">=</span><span class="lit">10100101</span><span class="pun">+</span><span class="lit">1</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10100110</span></pre>

<p>
	يعني هذا أنّ هناك تماثلًا غريبًا بعض الشيء في الأعداد التي يمكن تمثيلها؛ ففي العدد الصحيح integer مثلًا الذي يخزَّن على 8 بِتّ لدينا <sup>8</sup>2 = 256 قيمة ممكنة، كما يمكننا تمثيل 127- في نهج تمثيل بِتّ الإشارة بواسطة 127، لكن يمكننا تمثيل 127- في نظام المتمم الثنائي بواسطة 128 لأننا أزلنا مشكلة وجود صفرين، وضَع في الحسبان أنّ الصفر السالب هو <code>(1 + 00000000~) = (1 + 11111111) = 00000000</code>، ولاحظ تجاهل بِتّ الحمل.
</p>

<table>
	<thead>
		<tr>
			<th>
				النظام العشري
			</th>
			<th>
				النظام الثنائي
			</th>
			<th>
				OP العملية
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				90-
			</td>
			<td>
				10100110
			</td>
			<td>
				+
			</td>
		</tr>
		<tr>
			<td>
				100
			</td>
			<td>
				01100100
			</td>
			<td>
				 
			</td>
		</tr>
		<tr>
			<td>
				---
			</td>
			<td>
				--------
			</td>
			<td>
				 
			</td>
		</tr>
		<tr>
			<td>
				10
			</td>
			<td>
				00001010
			</td>
			<td>
				 
			</td>
		</tr>
	</tbody>
</table>

<p>
	لا بدّ أنك لاحظت أنّ تطبيق المتمم الثنائي لن يُحيج مصممي العتاد الصلب إلا إلى توفير عمليات منطقية لدارات الإضافة، إذ يمكن إجراء عملية الطرح عن طريق متمم ثنائي ينفي القيمة المراد طرحها ثم يضيف القيمة الجديدة، وبالمثل يمكنك تنفيذ عملية الضرب بالجمع المتكرر وعملية القسمة بالطرح المتكرر. وبالتالي يختزل المتمم الثنائي جميع العمليات الحسابية البسيطة بعملية الجمع، ومن الجدير بالذكر أنه تستخدِم جميع الحواسيب الحديثة تمثيل المتمم الثنائي.
</p>

<h4>
	امتداد الإشارة Sign-extension
</h4>

<p>
	بناءً على صيغة المتمم الثنائي، عند زيادة حجم القيمة المؤشَّرة signed value، من المهم أن تمدَّد إشارة sign-extended البتات الإضافية، أي المنسوخة من البِتّ الأولي للقيمة الحالية، إذ تمثَّل قيمة العدد الصحيح <code>10-</code> من نوع <code>int</code> المخزَّن على 32 بت في المتمم الثنائي في النظام الثنائي عبى سبيل المثال بالعدد <code>111111111111111111111111110110</code>، فإذا أردنا تحويله إلى عدد صحيح من نوع <code>long long int</code> مخزَّن على 64 بِتّ، فعلينا أن نحرص على تعيين الرقم <code>1</code> للـ 32 بِتّ الإضافية للاحتفاظ بالإشارة نفسها للعدد الأصلي.
</p>

<p>
	بفضل المتمم الثنائي، يكفي أخذ البِتّ الأولي من قيمة الخرج exiting value واستبدال جميع البتات المضافة بهذه القيمة، ويشار إلى هذه العمليات باسم امتداد الإشارة، وعادةً يتعامل معها المصرِّف في الحالات المحدَّدة في معيار اللغة، مع توفير المعالج عمومًا تعليمات خاصة لأخذ قيمة وتمديد إشارتها إلى قيمة أكبر.
</p>

<h3>
	الأعداد العشرية Floating Point
</h3>

<p>
	تحدثنا حتى الآن عن الأعداد الصحيحة integer أو الأعداد الكاملة فقط، وتسمى فئة الأعداد التي يمكن أن تمثِّل القيم العشرية بالأعداد العشرية.
</p>

<p>
	نحتاج لإنشاء عدد عشري إلى طريقة لتمثيل مفهوم الجزء العشري في النظام الثنائي، ويُعرف النظام الأشيع الذي يحقق ذلك بمعيار الأعداد العشرية IEEE-754 لأن من نشره كان معهد مهندسي الكهرباء والإلكترون، كما يُعَدّ النظام بسيط للغاية من ناحية المفهوم، وهو مشابه إلى حد ما للصيغة العلمية scientific notation.
</p>

<p>
	قد تمثَّل القيمة <code>123.45</code> عمومًا في الصيغة العلمية بالصيغة ‎1.2345*10<sup>2</sup>‎، إذ نسمي <code>1.2345</code> <a href="https://ar.wikipedia.org/wiki/%D8%B1%D9%82%D9%85_%D8%B0%D9%88_%D8%A3%D9%87%D9%85%D9%8A%D8%A9" rel="external nofollow">الجزء المعنوي significand</a> (أو الجزء الأهم الأساسي الذي له أهمية)؛ أما 10 فهو الأساس radix و <code>2</code> هو الأُس exponent.
</p>

<p>
	نفكك البتات المتاحة في نموذج العدد العشري IEEE لنمثِّل الإشارة والجزء العشري وأس العدد العشري، إذ يمثَّل العدد العشري بالصيغة: "الإشارة × الجزء المعنوي × <sup>الأس</sup>2"، ويعادل بِتّ الإشارة إما <code>1</code> أو <code>1-</code>، وبما أننا نعمل في النظام الثنائي، فسيكون لدينا دائمًا الأساس الضمني <code>2</code>، كما تتنوع أحجام قيمة العدد العشري، وسندرس في الفقرة التالية القيمة التي تخزَّن على 32 بت فقط، وكلما زاد عدد البتات حظينا بدقة أكبر.
</p>

<table>
	<thead>
		<tr>
			<th>
				الإشارة
			</th>
			<th>
				الأس
			</th>
			<th>
				الجزء المعنوي/الجزء العشري
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				S
			</td>
			<td>
				EEEEEEEE
			</td>
			<td>
				MMMMMMMMMMMMMMMMMMMMMMM
			</td>
		</tr>
	</tbody>
</table>

<p>
	العامل المهم الآخر هو انحياز bias الأس، إذ يجب أن يمثِّل الأس القيم الموجبة والسالبة، وبالتالي تُطرَح القيمة الضمنية للعدد <code>127</code> من الأس، إذ يحتوي الأس <code>0</code> مثلًا على حقل أس يساوي <code>127</code>، في حين يمثِّل <code>128</code> العدد <code>1</code> ويمثل <code>126</code> العدد <code>1-</code>.
</p>

<p>
	يضيف كل بِتّ من الجزء المعنوي مزيدًا من الدقة إلى القيم التي يمكننا تمثيلها، وضَع في الحسبان تمثيل الصيغة العلمية للقيمة <code>198765</code>، إذ يمكننا كتابة هذا بالصيغة 1.98765x10<sup>6</sup>، الذي يقابل التمثيل التالي:
</p>

<table>
	<thead>
		<tr>
			<th>
				10<sup>-5</sup>
			</th>
			<th>
				10<sup>-4</sup>
			</th>
			<th>
				10<sup>-3</sup>
			</th>
			<th>
				10<sup>-2</sup>
			</th>
			<th>
				10<sup>-1 </sup>
			</th>
			<th>
				.
			</th>
			<th>
				10<sup>0</sup>
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				5
			</td>
			<td>
				6
			</td>
			<td>
				7
			</td>
			<td>
				8
			</td>
			<td>
				9
			</td>
			<td>
				.
			</td>
			<td>
				1
			</td>
		</tr>
	</tbody>
</table>

<p>
	يتيح كل رقم إضافي مجالًا أكبر من القيم العشرية التي يمكننا تمثيلها، إذ يزيد كل رقم بعد الفاصلة العشرية من دقة العدد بمقدار 10 مرات في ا<a href="https://academy.hsoub.com/certificates/cisco/ccna/%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84%d8%b9%d8%af-%d8%a7%d9%84%d8%ab%d9%86%d8%a7%d8%a6%d9%8a-%d9%81%d9%8a-%d8%a7%d9%84%d8%b4%d8%a8%d9%83%d8%a7%d8%aa-r22/" rel="">لنظام العشري</a>، فيمكننا مثلًا تمثيل <code>0.0</code> بـ <code>0.9</code> -أي 10 قيم- برقم واحد بعد الفاصلة عشرية، و<code>0.00</code> بـ <code>0.99</code> -أي 100 قيمة- برقمين، وهكذا؛ أما في النظام الثنائي، فبدلًا من أن يمنحنا كل رقم إضافي دقة أكبر بعشر أضعاف، لا نحظى إلا بضعفَي الدقة كما هو موضَّح في الجدول التالي، ويعني هذا أنّ التمثيل الثنائي الخاص لا يوجّهنا دائمًا بطريقة مباشرة إلى التمثيل العشري.
</p>

<table>
	<thead>
		<tr>
			<th>
				10<sup>-5</sup>
			</th>
			<th>
				10<sup>-4</sup>
			</th>
			<th>
				10<sup>-3</sup>
			</th>
			<th>
				10<sup>-2</sup>
			</th>
			<th>
				10<sup>-1 </sup>
			</th>
			<th>
				.
			</th>
			<th>
				10<sup>0</sup>
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				5
			</td>
			<td>
				6
			</td>
			<td>
				7
			</td>
			<td>
				8
			</td>
			<td>
				9
			</td>
			<td>
				.
			</td>
			<td>
				1
			</td>
		</tr>
	</tbody>
</table>

<p>
	لا تكون دقة كسورنا كبيرةً جدًا باستخدام بِتّ واحد فقط للدقة، فلا يسعنا إلا أن نقول أنّ الكسر إما <code>0</code> أو <code>0.5</code>، فإذا أضفنا بِتًّا آخرًا للدقة، فيمكننا الآن القول أن القيمة العشرية هي إما <code>0</code> أو <code>0.25</code> أو <code>0.5</code> أو <code>0.75</code>. ومع إضافة بِتّ آخر للدقة يمكننا الآن تمثيل القيم <code>0</code>، <code>0.125</code>، <code>0.25</code>، <code>0.375</code>، <code>0.5</code>، <code>0.625</code>، <code>0.75</code>، <code>0.875</code>.
</p>

<p>
	وبالتالي فكلما زدنا عدد البِتّات حظينا بدقة أكبر، لكن بما أنّ مجال الأعداد المحتملة غير محدود، فلن تكفي البِتَات أبدًا لتمثيل أية قيمة محتمَلة، فإذا كان لدينا بِتّين فقط للدقة على سبيل المثال، وأردنا تمثيل القيمة <code>0.3</code>، فلا يمكننا القول إلا أنها أقرب إلى <code>0.25</code>، وطبعًا هذا غير كاف في معظم التطبيقات، لكن عندما يكون لدينا 22 بِتّ للجزء المعنوي، فسنحظى بدقة أفضل بكثير، لكن لا يزال ذلك غير كاف في معظم التطبيقات.
</p>

<p>
	تزيد قيمة متغير من نوع <code>double</code> عدد بتات الجزء المعنوي إلى 52 بت، كما أنها تزيد مجال قيم الأس أيضًا، كما تخصص بعض الأجهزة 84 بِتّ للعدد العشري، و64 بِتّ للجزء المعنوي، إذ تتيح 64 بِتّ تلك دقةً هائلةً لا بدّ أن تكون مناسبةً لجميع التطبيقات،لشمهم باستثناء التطبيقات شديدة التعقيد والتي تحتاج حجمًا أكبر ( هل هذا كافٍ لتمثيل طول أقل من حجم الذرة؟).
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5197_23" style=""><span class="lit">1</span><span class="pln"> $ cat </span><span class="typ">float</span><span class="pun">.</span><span class="pln">c
    </span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">

    </span><span class="typ">int</span><span class="pln"> main</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
  </span><span class="lit">5</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="typ">float</span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.45</span><span class="pun">;</span><span class="pln">
            </span><span class="typ">float</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8.0</span><span class="pun">;</span><span class="pln">

            </span><span class="kwd">double</span><span class="pln"> ad </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.45</span><span class="pun">;</span><span class="pln">
 </span><span class="lit">10</span><span class="pln">         </span><span class="kwd">double</span><span class="pln"> bd </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8.0</span><span class="pun">;</span><span class="pln">

            printf</span><span class="pun">(</span><span class="str">"float+float, 6dp    : %f\n"</span><span class="pun">,</span><span class="pln"> a</span><span class="pun">+</span><span class="pln">b</span><span class="pun">);</span><span class="pln">
            printf</span><span class="pun">(</span><span class="str">"double+double, 6dp  : %f\n"</span><span class="pun">,</span><span class="pln"> ad</span><span class="pun">+</span><span class="pln">bd</span><span class="pun">);</span><span class="pln">
            printf</span><span class="pun">(</span><span class="str">"float+float, 20dp   : %10.20f\n"</span><span class="pun">,</span><span class="pln"> a</span><span class="pun">+</span><span class="pln">b</span><span class="pun">);</span><span class="pln">
 </span><span class="lit">15</span><span class="pln">         printf</span><span class="pun">(</span><span class="str">"dobule+double, 20dp : %10.20f\n"</span><span class="pun">,</span><span class="pln"> ad</span><span class="pun">+</span><span class="pln">bd</span><span class="pun">);</span><span class="pln">

            </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

 </span><span class="lit">20</span><span class="pln"> $ gcc </span><span class="pun">-</span><span class="pln">o </span><span class="typ">float</span><span class="pln"> </span><span class="typ">float</span><span class="pun">.</span><span class="pln">c

    $ </span><span class="pun">./</span><span class="typ">float</span><span class="pln">
    </span><span class="typ">float</span><span class="pun">+</span><span class="typ">float</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6dp</span><span class="pln">    </span><span class="pun">:</span><span class="pln"> </span><span class="lit">8.450000</span><span class="pln">
    </span><span class="kwd">double</span><span class="pun">+</span><span class="kwd">double</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6dp</span><span class="pln">  </span><span class="pun">:</span><span class="pln"> </span><span class="lit">8.450000</span><span class="pln">
 </span><span class="lit">25</span><span class="pln"> </span><span class="typ">float</span><span class="pun">+</span><span class="typ">float</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20dp</span><span class="pln">   </span><span class="pun">:</span><span class="pln"> </span><span class="lit">8.44999998807907104492</span><span class="pln">
    dobule</span><span class="pun">+</span><span class="kwd">double</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20dp</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="lit">8.44999999999999928946</span><span class="pln">

    $ python
    </span><span class="typ">Python</span><span class="pln"> </span><span class="lit">2.4</span><span class="pun">.</span><span class="lit">4</span><span class="pln"> </span><span class="pun">(#</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Oct</span><span class="pln"> </span><span class="lit">20</span><span class="pln"> </span><span class="lit">2006</span><span class="pun">,</span><span class="pln"> </span><span class="lit">00</span><span class="pun">:</span><span class="lit">23</span><span class="pun">:</span><span class="lit">25</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">30</span><span class="pln"> </span><span class="pun">[</span><span class="pln">GCC </span><span class="lit">4.1</span><span class="pun">.</span><span class="lit">2</span><span class="pln"> </span><span class="lit">20061015</span><span class="pln"> </span><span class="pun">(</span><span class="pln">prerelease</span><span class="pun">)</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Debian</span><span class="pln"> </span><span class="lit">4.1</span><span class="pun">.</span><span class="lit">1</span><span class="pun">-</span><span class="lit">16.1</span><span class="pun">)]</span><span class="pln"> on linux2
    </span><span class="typ">Type</span><span class="pln"> </span><span class="str">"help"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"copyright"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"credits"</span><span class="pln"> or </span><span class="str">"license"</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> more information</span><span class="pun">.</span><span class="pln">
    </span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="lit">8.0</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.45</span><span class="pln">
    </span><span class="lit">8.4499999999999993</span><span class="pln">

 </span><span class="lit">35</span><span class="pln"> </span></pre>

<p>
	يُعَدّ النموذج السابق مثالًا عمليًا لما تحدثنا عنه، ولاحظ أنه تتطابق الإجابتان بالنسبة للأجزاء العشرية الستة الافتراضية لتحقيق الدقة التي حددناها في <code>printf</code>، وذلك لأن عملية تقريبهما نفِّذت تنفيذًا صحيحًا، لكن عندما يُطلب منك إعطاء نتائج بدقة أكبر ولتكن في هذه الحالة 20 منزلة عشرية، فسنجد أنها تبدأ في الاختلاف.
</p>

<p>
	منحتنا الشيفرة البرمجية التي تستخدِم النوع <code>double</code> نتيجةً أدق، لكنها لا تزال غير صحيحة كليًا، كما أننا نجد أنّ المبرمجين الذين لا يتعاملون بوضوح مع القيم من نوع <code>float</code> لا يزالون يواجهون مشاكل في دقة المتغيرات.
</p>

<h4>
	القيم الموحدة Normalised Values
</h4>

<p>
	يمكننا تمثيل قيمة بعدة أساليب مختلفة في الصيغة العلمية مثل 10023x10<sup>0</sup> = 1002.3x10<sup>1</sup> = 100.23x10<sup>2</sup>، وبالتالي نعرّف صيغة التوحيد بأنه الصيغة التي يكون فيها <code>‎1/radix &lt;= significand &lt; 1</code>، إذ تعني radix الأساس وتعني significand الجزء المعنوي، و<a href="https://en.wikipedia.org/wiki/Normalized_number" rel="external nofollow">العدد الموحَّد</a> normalized number هو العدد المكتوب <a href="https://ar.wikipedia.org/wiki/%D9%83%D8%AA%D8%A7%D8%A8%D8%A9_%D8%B9%D9%84%D9%85%D9%8A%D8%A9" rel="external nofollow">بالصيغة العلمية</a> scientific notation مع رقم عشري واحد غير صفري على الأقل بعد الفاصلة.
</p>

<p>
	يضمن هذا في النظام الثنائي أن يكون البِتّ الذي يقع أقصى اليسار leftmost bit من الجزء المعنوي دائمًا 1، فعند معرفتنا لذلك، يمكننا الحصول على بِتّ إضافي للدقة حسب ما ورد في المعيار أنه عندما يكون البت الأيسر 1 يكون ضمنيًا.
</p>

<table>
	<thead>
		<tr>
			<th>
				العملية الحسابية
			</th>
			<th>
				الأس
			</th>
			<th>
				2<sup>-5</sup>
			</th>
			<th>
				2<sup>-4</sup>
			</th>
			<th>
				2<sup>-3</sup>
			</th>
			<th>
				2<sup>-2</sup>
			</th>
			<th>
				2<sup>-1 </sup>
			</th>
			<th>
				.
			</th>
			<th>
				2<sup>0</sup>
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				0.375 = 1* (0.25+0.125)
			</td>
			<td>
				<sup>0</sup>2
			</td>
			<td>
				0
			</td>
			<td>
				0
			</td>
			<td>
				1
			</td>
			<td>
				1
			</td>
			<td>
				0
			</td>
			<td>
				.
			</td>
			<td>
				0
			</td>
		</tr>
		<tr>
			<td>
				0.375= 5. * (0.5+0.25)
			</td>
			<td>
				<sup>1-</sup>2
			</td>
			<td>
				0
			</td>
			<td>
				0
			</td>
			<td>
				0
			</td>
			<td>
				1
			</td>
			<td>
				1
			</td>
			<td>
				.
			</td>
			<td>
				0
			</td>
		</tr>
		<tr>
			<td>
				0.375= 0.25 * (1+0.5)
			</td>
			<td>
				<sup>2-</sup>2
			</td>
			<td>
				0
			</td>
			<td>
				0
			</td>
			<td>
				0
			</td>
			<td>
				0
			</td>
			<td>
				1
			</td>
			<td>
				.
			</td>
			<td>
				1
			</td>
		</tr>
	</tbody>
</table>

<p>
	كما ترى في المثال السابق، يمكننا جعل القيمة قيمة موحَّدة من خلال تحريك البِتّات للأمام طالما أننا نعوِّض عن ذلك بزيادة الأس.
</p>

<h4>
	مهارات التوحيد Normalisation
</h4>

<p>
	من المشكلات الشائعة التي يواجهها المبرمجون هي العثور على أول بِتّ ضبط في مجموعة البِتّات bitfield، ولنأخذ مجموعة البتات <code>0100</code> مثالًا، فعند البدء من اليمين، يكون بِتّ الضبط الأول هو البِتّ 2، إذ نبدأ من الصفر كما هو معتاد.
</p>

<p>
	الطريقة المعيارية للعثور على هذه القيمة هي الإزاحة إلى اليمين والتحقق مما إذا كان البِتّ الأول هو <code>1</code> أي بت الضبط، ثم إنهاء العملية أو تكرارها، وتُعَدّ هذه عمليةً بطيئةً، فإذا كان طول مجموعة البِتّات 64 بِتّ وكان بِتّ الضبط هو الأخير فقط، فيجب أن تمر بجميع البتات الثلاثة والستين التي تسبقها.
</p>

<p>
	لكن إذا كانت قيمة مجموعة البتات هذه هي الجزء المعنوي لعدد عشري وكان علينا توحيدها، فسنعرف من قيمة الأس عدد مرات إزاحتها، كما تضمَّن عملية التوحيد عمومًا في وحدة عتاد العدد العشري على المعالج، لذا تؤدَّى بسرعة كبيرة، وعادةً أسرع بكثير من عمليات الإزاحة والاختبار المتكررة.
</p>

<p>
	يوضِّح البرنامج التالي طريقتين للعثور على أول بِتّ ضبط متَّبعتَين على معالج إتانيوم. إذ يدعم المعالج إتانيوم -مثل حال معظم معالجات الخوادم- نوع العدد العشري الموسَّع الذي يخزَّن على 80 بِتّ، والجزء المعنوي الذي يخزن على 64 بِتّ، ويعني هذا أنّ نوع <code>unsigned long</code> يتوافق بدقة في الجزء المعنوي لنوع <code>long double</code>، فعندما تحمَّل القيمة توحَّد، وبالتالي من خلال قراءة قيمة الأس مطروحًا منها انحياز 16 بِتّ يمكننا رؤية مدى انزياحها.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5197_25" style=""><span class="pln">  </span><span class="lit">1</span><span class="pln"> </span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">

    </span><span class="typ">int</span><span class="pln"> main</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
  </span><span class="lit">5</span><span class="pln">     </span><span class="com">// ‫ في التمثيل الثنائي = 0000 0000 0000 1000</span><span class="pln">
        </span><span class="com">// ‫ عدد البتات  3210 7654 1098 5432</span><span class="pln">
        </span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x8000</span><span class="pun">;</span><span class="pln">
        </span><span class="typ">int</span><span class="pln"> count </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> </span><span class="pun">!(</span><span class="pln">i </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">0x1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">10</span><span class="pln">         count </span><span class="pun">++;</span><span class="pln">
            i </span><span class="pun">=</span><span class="pln"> i </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        printf</span><span class="pun">(</span><span class="str">"First non-zero (slow) is %d\n"</span><span class="pun">,</span><span class="pln"> count</span><span class="pun">);</span><span class="pln">

 </span><span class="lit">15</span><span class="pln">     </span><span class="com">// توحَّد هذه القيمة عندما تُحمَّل</span><span class="pln">
        </span><span class="kwd">long</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> d </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x8000UL</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">long</span><span class="pln"> exp</span><span class="pun">;</span><span class="pln">

        </span><span class="com">// تعليمات "الحصول على أس العدد العشري" في معالج إتانيوم</span><span class="pln">
 </span><span class="lit">20</span><span class="pln">     </span><span class="kwd">asm</span><span class="pln"> </span><span class="pun">(</span><span class="str">"getf.exp %0=%1"</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">"=r"</span><span class="pun">(</span><span class="pln">exp</span><span class="pun">)</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">"f"</span><span class="pun">(</span><span class="pln">d</span><span class="pun">));</span><span class="pln">

        </span><span class="com">// الأس متضمنًا الانزياح</span><span class="pln">
        printf</span><span class="pun">(</span><span class="str">"The first non-zero (fast) is %d\n"</span><span class="pun">,</span><span class="pln"> exp </span><span class="pun">-</span><span class="pln"> </span><span class="lit">65535</span><span class="pun">);</span><span class="pln">

 </span><span class="lit">25</span><span class="pln"> </span><span class="pun">}</span></pre>

<h4>
	خلاصة الأفكار السابقة
</h4>

<p>
	نستخرج مكونات العدد العشري ونطبع القيمة التي يمثلها في نموذج الشيفرة البرمجية التالية، إذ سنحرز نتيجةً فقط عندما تكون القيمة عددًا عشريًا بحجم 32 بِتّ بصيغة المعيار IEEE، وهذا شائع في معظم المعماريات من نوع <code>float</code> أي عدد عشري.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5197_27" style=""><span class="pln">  </span><span class="lit">1</span><span class="pln"> </span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
    </span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;string.h&gt;</span><span class="pln">
    </span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdlib.h&gt;</span><span class="pln">

  </span><span class="lit">5</span><span class="pln"> </span><span class="com">/* 2^n إرجاع */</span><span class="pln">
    </span><span class="typ">int</span><span class="pln"> two_to_pos</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> n</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
 </span><span class="lit">10</span><span class="pln">     </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> two_to_pos</span><span class="pun">(</span><span class="pln">n </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">double</span><span class="pln"> two_to_neg</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> n</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
 </span><span class="lit">15</span><span class="pln">     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">1.0</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="pun">(</span><span class="pln">two_to_pos</span><span class="pun">(</span><span class="pln">abs</span><span class="pun">(</span><span class="pln">n</span><span class="pun">)));</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

 </span><span class="lit">20</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> two_to</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> n</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> two_to_pos</span><span class="pun">(</span><span class="pln">n</span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">25</span><span class="pln">         </span><span class="kwd">return</span><span class="pln"> two_to_neg</span><span class="pun">(</span><span class="pln">n</span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="com">/* ‫مراجعة بعض أجزاء الذاكرة للمتغير "m" الذي هو الجزء المعنوي 
 30    للعدد العشري بحجم 24 بت، نبدأ بالمقلوب من البتات في أقصى اليمين
       دون أي سبب معين */</span><span class="pln">
    </span><span class="kwd">double</span><span class="pln"> calc_float</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> m</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> bit</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="com">/*  23 بت؛ هذا ينهي العودية */</span><span class="pln">
 </span><span class="lit">35</span><span class="pln">     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">bit </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">23</span><span class="pun">)</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

        </span><span class="com">/* إذا كان البت مضبوطًا، فهو يمثل القيمة 2/1^بت  */</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">m </span><span class="pun">&gt;&gt;</span><span class="pln"> bit</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">40</span><span class="pln">         </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">1.0L</span><span class="pun">/</span><span class="pln">two_to</span><span class="pun">(</span><span class="lit">23</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> bit</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> calc_float</span><span class="pun">(</span><span class="pln">m</span><span class="pun">,</span><span class="pln"> bit </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">

        </span><span class="com">/* وإلا انتقل إلى البت التالي */</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> calc_float</span><span class="pun">(</span><span class="pln">m</span><span class="pun">,</span><span class="pln"> bit </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
 </span><span class="lit">45</span><span class="pln"> 
    </span><span class="typ">int</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> argc</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*</span><span class="pln">argv</span><span class="pun">[])</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">float</span><span class="pln"> f</span><span class="pun">;</span><span class="pln">
        </span><span class="typ">int</span><span class="pln"> m</span><span class="pun">,</span><span class="pln">i</span><span class="pun">,</span><span class="pln">sign</span><span class="pun">,</span><span class="pln">exponent</span><span class="pun">,</span><span class="pln">significand</span><span class="pun">;</span><span class="pln">
 </span><span class="lit">50</span><span class="pln"> 
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">argc </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            printf</span><span class="pun">(</span><span class="str">"usage: float 123.456\n"</span><span class="pun">);</span><span class="pln">
            exit</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
 </span><span class="lit">55</span><span class="pln">     </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">sscanf</span><span class="pun">(</span><span class="pln">argv</span><span class="pun">[</span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="str">"%f"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">f</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            printf</span><span class="pun">(</span><span class="str">"invalid input\n"</span><span class="pun">);</span><span class="pln">
 </span><span class="lit">60</span><span class="pln">         exit</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="com">/* سنحتاج إلى خداع المصرف، كأننا بدأنا استخدام التحويلات
           ‫ فمثلًا (int)(f) ستجري تحويلًا فعليًا لنا 
 65        نريد الوصول إلى البتات الأولية، لذا ننسخها إلى متغير
           بنفس الحجم. */</span><span class="pln">
        memcpy</span><span class="pun">(&amp;</span><span class="pln">m</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">f</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">);</span><span class="pln">

        </span><span class="com">/* بت الإشارة هو أول بت */</span><span class="pln">
 </span><span class="lit">70</span><span class="pln">     sign </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">m </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">31</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">0x1</span><span class="pun">;</span><span class="pln">

        </span><span class="com">/* الأس هو البتات الثمانية التي تلي بت الإشارة */</span><span class="pln">
        exponent </span><span class="pun">=</span><span class="pln"> </span><span class="pun">((</span><span class="pln">m </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">23</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">127</span><span class="pun">;</span><span class="pln">

 </span><span class="lit">75</span><span class="pln">     </span><span class="com">/* الجزء المعنوي يملأ المنازل العشرية، ويكون أول بت ضمنيًا 1
           وبالتالي هو قيمة المعامل OR 24 بت. */</span><span class="pln">
            significand </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">m </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">0x7FFFFF</span><span class="pun">)</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="lit">0x800000</span><span class="pun">;</span><span class="pln">

        </span><span class="com">/* اطبع قيمةً تمثل الأس */</span><span class="pln">
 </span><span class="lit">80</span><span class="pln">     printf</span><span class="pun">(</span><span class="str">"%f = %d * ("</span><span class="pun">,</span><span class="pln"> f</span><span class="pun">,</span><span class="pln"> sign </span><span class="pun">?</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">for</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">23</span><span class="pln"> </span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">;</span><span class="pln"> i</span><span class="pun">--)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">significand </span><span class="pun">&gt;&gt;</span><span class="pln"> i</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">
                printf</span><span class="pun">(</span><span class="str">"%s1/2^%d"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">==</span><span class="pln"> </span><span class="lit">23</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="str">""</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">" + "</span><span class="pun">,</span><span class="pln">
 </span><span class="lit">85</span><span class="pln">                    </span><span class="lit">23</span><span class="pun">-</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        printf</span><span class="pun">(</span><span class="str">") * 2^%d\n"</span><span class="pun">,</span><span class="pln"> exponent</span><span class="pun">);</span><span class="pln">

        </span><span class="com">/* اطبع تمثيلًا كسريًا */</span><span class="pln">
 </span><span class="lit">90</span><span class="pln">     printf</span><span class="pun">(</span><span class="str">"%f = %d * ("</span><span class="pun">,</span><span class="pln"> f</span><span class="pun">,</span><span class="pln"> sign </span><span class="pun">?</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">for</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">23</span><span class="pln"> </span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">;</span><span class="pln"> i</span><span class="pun">--)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">significand </span><span class="pun">&gt;&gt;</span><span class="pln"> i</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">
                printf</span><span class="pun">(</span><span class="str">"%s1/%d"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">==</span><span class="pln"> </span><span class="lit">23</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="str">""</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">" + "</span><span class="pun">,</span><span class="pln">
 </span><span class="lit">95</span><span class="pln">                    </span><span class="pun">(</span><span class="typ">int</span><span class="pun">)</span><span class="pln">two_to</span><span class="pun">(</span><span class="lit">23</span><span class="pun">-</span><span class="pln">i</span><span class="pun">));</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        printf</span><span class="pun">(</span><span class="str">") * 2^%d\n"</span><span class="pun">,</span><span class="pln"> exponent</span><span class="pun">);</span><span class="pln">

        </span><span class="com">/* حول هذا إلى قيمة عشرية واطبعه */</span><span class="pln">
</span><span class="lit">100</span><span class="pln">     printf</span><span class="pun">(</span><span class="str">"%f = %d * %.12g * %f\n"</span><span class="pun">,</span><span class="pln">
               f</span><span class="pun">,</span><span class="pln">
               </span><span class="pun">(</span><span class="pln">sign </span><span class="pun">?</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">),</span><span class="pln">
               calc_float</span><span class="pun">(</span><span class="pln">significand</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">),</span><span class="pln">
               two_to</span><span class="pun">(</span><span class="pln">exponent</span><span class="pun">));</span><span class="pln">
</span><span class="lit">105</span><span class="pln"> 
        </span><span class="com">/* اجرِ العملية الحسابية الآن */</span><span class="pln">
        printf</span><span class="pun">(</span><span class="str">"%f = %.12g\n"</span><span class="pun">,</span><span class="pln">
               f</span><span class="pun">,</span><span class="pln">
               </span><span class="pun">(</span><span class="pln">sign </span><span class="pun">?</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln">
</span><span class="lit">110</span><span class="pln">            calc_float</span><span class="pun">(</span><span class="pln">significand</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln">
               two_to</span><span class="pun">(</span><span class="pln">exponent</span><span class="pun">)</span><span class="pln">
            </span><span class="pun">);</span><span class="pln">

        </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="lit">115</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	وفيما يلي نموذج خرج القيمة <code>8.45</code> الذي درسناه سابقًا:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5197_29" style=""><span class="pln">$ </span><span class="pun">./</span><span class="typ">float</span><span class="pln"> </span><span class="lit">8.45</span><span class="pln">
</span><span class="lit">8.450000</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pun">/</span><span class="lit">2</span><span class="pun">^</span><span class="lit">0</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">2</span><span class="pun">^</span><span class="lit">5</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">2</span><span class="pun">^</span><span class="lit">6</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">2</span><span class="pun">^</span><span class="lit">7</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">2</span><span class="pun">^</span><span class="lit">10</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">2</span><span class="pun">^</span><span class="lit">11</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">2</span><span class="pun">^</span><span class="lit">14</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">2</span><span class="pun">^</span><span class="lit">15</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">2</span><span class="pun">^</span><span class="lit">18</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">2</span><span class="pun">^</span><span class="lit">19</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">2</span><span class="pun">^</span><span class="lit">22</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">2</span><span class="pun">^</span><span class="lit">23</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">^</span><span class="lit">3</span><span class="pln">
</span><span class="lit">8.450000</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pun">/</span><span class="lit">1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">32</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">64</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">128</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">1024</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">2048</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">16384</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">32768</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">262144</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">524288</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">4194304</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">/</span><span class="lit">8388608</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">^</span><span class="lit">3</span><span class="pln">
</span><span class="lit">8.450000</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1.05624997616</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">8.000000</span><span class="pln">
</span><span class="lit">8.450000</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8.44999980927</span></pre>

<p>
	نستخلص من هذا المثال فكرةً عن تسلل عدم الدقة إلى أعدادنا العشرية.
</p>

<p>
	ترجمة -وبتصرّف- لقسم من الفصل <a href="https://www.bottomupcs.com/types.xhtml" rel="external nofollow">Chapter 2. Binary and Number Representation</a> من كتاب <a href="https://www.bottomupcs.com/index.xhtml" rel="external nofollow">Computer Science from the Bottom Up</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%88%D8%AD%D8%AF%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A%D8%A9-%D9%88%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1716/" rel="">تعرف على وحدة المعالجة المركزية وعملياتها في معمارية الحاسوب</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%B9%D8%AF-%D8%A7%D9%84%D8%AB%D9%86%D8%A7%D8%A6%D9%8A-binary-%D8%A3%D8%B3%D8%A7%D8%B3-%D8%A7%D9%84%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-r1658/" rel="">تعرف على نظام العد الثنائي Binary أساس الحوسبة </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">المدخل الشامل لتعلم علوم الحاسوب</a>
	</li>
	<li>
		النسخة العربية لكتاب: <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">أنظمة التشغيل للمبرمجين</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1659</guid><pubDate>Mon, 29 Aug 2022 16:02:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x646;&#x638;&#x627;&#x645; &#x627;&#x644;&#x639;&#x62F; &#x627;&#x644;&#x62B;&#x646;&#x627;&#x626;&#x64A; Binary &#x623;&#x633;&#x627;&#x633; &#x627;&#x644;&#x62D;&#x648;&#x633;&#x628;&#x629;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%B9%D8%AF-%D8%A7%D9%84%D8%AB%D9%86%D8%A7%D8%A6%D9%8A-binary-%D8%A3%D8%B3%D8%A7%D8%B3-%D8%A7%D9%84%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-r1658/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_08/62f4e57aa1cf9_---.jpg.9aa133431aebb2ab69a8643285afc9d9.jpg" /></p>
<p>
	<a href="https://academy.hsoub.com/certificates/cisco/ccna/%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84%d8%b9%d8%af-%d8%a7%d9%84%d8%ab%d9%86%d8%a7%d8%a6%d9%8a-%d9%81%d9%8a-%d8%a7%d9%84%d8%b4%d8%a8%d9%83%d8%a7%d8%aa-r22/" rel="">النظام الثنائي</a> هو نظام عددي يكون أساس العدد فيه 2، ويمثل المعلومات بحالتين متنافيتين لا ثالث لهما، ويتكون العدد الثنائي من عناصر تسمى <strong>بِتات bits</strong> بحيث يمكن أن يكون كل بت بإحدى الحالتين المحتمَلتَين، واللتين نمثلهما عمومًا بالرقمين 1 و 0.
</p>

<h2>
	نظرية النظام الثنائي
</h2>

<p>
	النظام الثنائي هو نظام يكون فيه الأساس هو العدد 2 ليمثل المعلومات بحالتين متنافيتين، ويتكون العدد الثنائي من عناصر تسمى بِتّات، إذ يمكن أن يكون كل بِتّ بإحدى الحالتين المحتمَلتين واللتين نمثِّلهما عمومًا بالرقمين 1 و 0، ويمكننا القول أنهما تمثِّلان القيمتَين الصحيحة والخاطئة؛ أما من الناحية الكهربائية، فقد تمثَّل الحالتين بجهد كهربائي مرتفع ومنخفض أو مثل زر التشغيل والإيقاف.
</p>

<p>
	نبني الأعداد الثنائية بالطريقة نفسها التي نبني بها الأعداد في نظامنا التقليدي العشري الذي يكون فيه الأساس هو العدد 10، لكن بدلاً من منزلة الآحاد ومنزلة العشرات ومنزلة المئات، …إلخ، لدينا منزلة الواحد ومنزلة الاثنين ومنزلة الأربعة ومنزلة الثمانية، …إلخ، أي كما هو موضح في الجدول التالي:
</p>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
} 

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table>
	<thead>
		<tr>
			<th>
				2<sup>0</sup>
			</th>
			<th>
				2<sup>1</sup>
			</th>
			<th>
				2<sup>2</sup>
			</th>
			<th>
				2<sup>3</sup>
			</th>
			<th>
				2<sup>4</sup>
			</th>
			<th>
				2<sup>5</sup>
			</th>
			<th>
				2<sup>6</sup>
			</th>
			<th>
				‎2<sup>...‎</sup>
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				1
			</td>
			<td>
				2
			</td>
			<td>
				4
			</td>
			<td>
				8
			</td>
			<td>
				16
			</td>
			<td>
				32
			</td>
			<td>
				64
			</td>
			<td>
				…
			</td>
		</tr>
	</tbody>
</table>

<p>
	لنمثِّل العدد 203 على سبيل المثال في الأساس العشري، إذ نعلم أننا نضع الرقم 3 في منزلة الآحاد، والرقم 0 في منزلة العشرات والرقم 2 في منزلة المئات، ويمثَّل هذا من خلال الأُسس exponents كما في الجدول التالي:
</p>

<table>
	<thead>
		<tr>
			<th>
				10<sup>0</sup>
			</th>
			<th>
				10<sup>1</sup>
			</th>
			<th>
				10<sup>2</sup>
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				3
			</td>
			<td>
				0
			</td>
			<td>
				2
			</td>
		</tr>
	</tbody>
</table>

<p>
	أو نمثلها بطريقة أخرى:
</p>

<p>
	2x 10<sup>2</sup> + 3 x 10<sup>0</sup> = 200 + 3 = 203
</p>

<p>
	لنمثِّل العدد نفسه بالنظام الثنائي، إذ سيكون لدينا الجدول التالي:
</p>

<table>
	<thead>
		<tr>
			<th>
				2<sup>0</sup>
			</th>
			<th>
				2<sup>1</sup>
			</th>
			<th>
				2<sup>2</sup>
			</th>
			<th>
				2<sup>3</sup>
			</th>
			<th>
				2<sup>4</sup>
			</th>
			<th>
				2<sup>5</sup>
			</th>
			<th>
				2<sup>6</sup>
			</th>
			<th>
				2<sup>7</sup>
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				1
			</td>
			<td>
				1
			</td>
			<td>
				0
			</td>
			<td>
				1
			</td>
			<td>
				0
			</td>
			<td>
				0
			</td>
			<td>
				1
			</td>
			<td>
				1
			</td>
		</tr>
	</tbody>
</table>

<p>
	ويكافئ هذا:
</p>

<p>
	2<sup>7</sup> + 2<sup>6</sup> + 2<sup>3</sup> + 2<sup>1</sup> + 2<sup>0</sup> = 128 + 64 + 8 + 2 + 1 = 203
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة علوم الحاسوب
		</p>

		<p class="banner-subtitle">
			دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/computer-science/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة علوم الحاسوب" src="https://academy.hsoub.com/learn/assets/images/courses/computer-science.png">
	</div>
</div>

<h3>
	أسس الحوسبة
</h3>

<p>
	قد تتساءل كيف لعدد بسيط أن يكون الأساس الذي بنيَت عليه كل الأمور المذهلة التي يستطيع الحاسوب تنفيذها، ورغم صعوبة تصديق ذلك إلا أنها الحقيقة، إذ يحتوي المعالج الموجود في حاسوبك على مجموعة معقدة -لكنها محدودة في النهاية- من التعليمات instructions التي يمكن تنفيذها على قيم مثل الجمع والضرب، …إلخ، إذ يُسنَد عدد إلى كل تعليمة من هذه التعليمات بصورة أساسية، حتى يمثَّل برنامج كامل بسلسلة من الأعداد فقط، أي أضف هذا إلى ذاك، اضرب بذاك، قسّم عليه، وهكذا، فإذا كان المعالج مثلًا يعلم أنّ العملية <code>2</code> هي الجمع، فإنّ العدد <code>252</code> قد يعني "اجمع 5 و 2 وخزِّن الناتج في مكان ما"، وتُعَدّ العمليات في الواقع أعقد بكثير طبعًا، إذ سنتناولها في فصل معمارية الحاسوب لاحقًا، لكن باختصار هذا هو الحاسوب.
</p>

<p>
	كان بمقدور المرء في عهد البطاقات المثقَّبة punch-cards أن يرى بعينه الواحدات والأصفار التي تكوِّن مسار البرنامج من خلال النظر إلى الثقوب الموجودة على البطاقة، طبعًا تحوّل ذلك اليوم إلى آلية التخزين السريع والدقيق بواسطة قطبية الجزيئات الممغنطة الصغيرة مثل الأشرطة tapes أو الأقراص disks، والذي أتاح لنا حمل كميات هائلة تفوق التصور من البيانات في جيوبنا.
</p>

<p>
	إنّ ترجمة هذه الأعداد إلى خدمات تنفع البشرية هي ما يجعل الحاسوب نافعًا لهذه الدرجة، وتتكوّن الشاشات مثلًا من ملايين البكسلات pixels المنفصلة، وكل منها صغير لدرجة لا تميّزه عين الإنسان، لكنها تكوِّن صورةً مكتملةً عندما تكون مجتمعةً، إذ يحتوي كل بكسل عمومًا على عناصر محدَّدة من الأحمر والأخضر والأزرق التي تكوِّن اللون الذي يعرضه، وبالتأكيد يمكن تمثيل هذه القيم بالأعداد التي بالطبع يمكن تمثيلها بالنظام الثنائي، وبالتالي يمكن تقسيم أيّ صورة إلى ملايين النقاط الفردية، وتُمثَّل كل نقطة بمجموعة من ثلاث قيم تمثِّل قيم الأحمر والأخضر والأزرق للبكسل، وبالتالي عندما يكون لدينا سلسلة طويلة من هذه الأعداد وتكون مُصاغةً بصورة صحيحة، فستتمكن أجهزة الفيديو في حاسوبك من تحويل هذه الأعداد إلى إشارات كهربائية لتشغيل وإيقاف البكسلات الفردية لعرض صورة.
</p>

<p>
	سنبني بيئة الحوسبة الحديثة بأكملها في الكتاب بدءًا من اللبنة الأساسية هذه، أي من القاعدة إلى القمة إذا صح التعبير.
</p>

<h3>
	البتات bits والبايتات byts
</h3>

<p>
	يمكننا بصورة أساسية تمثيل أيّ شيء بعدد كما تحدثنا في الفقرات السابقة، ويمكن تحويله إلى النظام الثنائي وإجراء عمليات عليه بواسطة الحاسوب، إذ سنحتاج على الأقل لتمثيل جميع أحرف الأبجدية مثلًا إلى توليفات مختلفة وكافية لتمثيل جميع المحارف الصغيرة lower case والمحارف الكبيرة upper case والأعداد وعلامات الترقيم إلى جانب بعض الأمور الإضافية، ويعني هذا أننا ربما سنحتاج إلى حوالي 80 توليفة مختلفة.
</p>

<p>
	إذا كان لدينا بِتّان، فيمكننا تمثيل 4 توليفات فريدة محتملة وهي <code>00 01 10 11</code>؛ أما إذا كان لدينا ثلاث بِتّات، فيمكننا تمثيل 8 توليفات مختلفة، وبصورة عامة، إذا كان لدينا عدد <code>n</code> من البِتّات يمكننا تمثيل 2<sup><code>n</code></sup> توليفة فريدة.
</p>

<p>
	تمنحنا 8 بِتّات 2<sup>8</sup> = 256 تمثيلًا فريدًا، وهذا عدد أكثر من كاف للتوليفات الأبجدية التي نحتاجها، كما أننا ندعو كل 8 بِتّات ببايت، كما أنّ حجم المتغير من نوع <code>char</code> هو بايت واحد في لغة C.
</p>

<h4>
	أسكي ASCII
</h4>

<p>
	يستطيع أيّ شخص اختلاق رابط بين الأحرف والأعداد عشوائيًا بما أنّ البايت يمكنه تمثيل أيّ قيمة بين 0 و 255، فقد تقرِّر الشركة المصنعة لبطاقات الفيديو مثلًا أنّ رقم <code>1</code> يمثل المحرف 'A'، لذا عندما ترسَل القيمة <code>1</code> إلى بطاقة الفيديو، ستعرض المحرف 'A' بحالته الكبيرة على الشاشة، وقد تقرِّر الشركة المصنعة للطابعة لسبب ما أن الرقم <code>1</code> يمثل 'z' بالحالة الصغيرة، وبالتالي سيتطلب عرض وطباعة الشيء نفسه تحويلات معقدة، ولتجنب حدوث ذلك ابتُكِرت الشيفرة المعيارية الأميركية لتبادل المعلومات American Standard Code for Information Interchange -أو ASCII اختصارًا-، وهذه الشيفرة مبنية على 7 بتات 7-bit code، أي توجد 2<sup>7</sup> أو 128 شيفرةً متاحةً.
</p>

<p>
	ينقسم مجال الشيفرات إلى جزأين رئيسيين هما الشيفرات الغير قابلة للطباعة والشيفرات القابلة للطباعة، إذ تكون المحارف القابلة للطباعة مثل الأحرف الكبيرة والصغيرة والأعداد وعلامات الترقيم، في حين تكون المحارف الغير قابلة للطباعة مخصصةً للتحكم وتنفيذ عمليات مثل محارف الإرجاع carriage-return، أي العودة إلى بداية السطر الحالي دون النزول إلى السطر التالي، أو رن جرس الطرفية عند ورود المحرف Bell أو شيفرة القيمة الفارغة <code>NULL</code> الخاصة التي لا تمثل شيئًا على الإطلاق.
</p>

<p>
	تكفي المحارف 127 الفريدة للغة الإنجليزية الأميركية، لكنها تصبح محدودةً جدًا عندما يريد المرء تمثيل المحارف السائدة في اللغات الأخرى وخاصةً اللغات الآسيوية التي قد تحتوي على عدة آلاف من المحارف الفريدة، وللحد من ذلك، تنتقل الأنظمة الحديثة من شيفرة أسكي إلى يونيكود Unicode التي تستخدِم ما يصل إلى 4 بايتات لتمثل محرفًا، وهذا يفسح مجالًا أكبر بكثير.
</p>

<h4>
	التكافؤ Parity
</h4>

<p>
	يبقى بت واحد من البايت فائضًا بما أنّ شيفرة الأسكي مبنية على 7 بتات فقط، ويمكن الاستفادة منه في تحقيق التكافؤ parity، إذ يُعَدّ شكلًا بسيطًا من أشكال التحقق من الأخطاء، فتخيّل حاسوبًا يستخدِم بطاقات مثقبة في عملية الإدخال، بحيث يمثِّل وجود الثقب البِتّ 1 وغيابه يمثل البِتّ 0، وستؤدي أية تغطية غير مقصودة لثقب ما إلى قراءة قيمة غير صحيحة وستتسبب في سلوك غير معرَّف.
</p>

<p>
	يتيح التكافؤ إجراء فحص بسيط للبِتّات المؤلِّفة للبايت للتأكد من أنها قُرِئت بصورة صحيحة، ويمكننا تنفيذ التكافؤ الفردي أو الزوجي باستخدام البِتّ الفائض الذي نَعدّه بِتّ التكافؤ، فإذا كان عدد الواحدات في المعلومات المخزَّنة على البِتّات السبعة فرديًا، فسيضبط بت التكافؤ ويكون حينها التكافؤ فرديًا odd parity، وإذا كان عددها زوجيًا، فلا يضبط بِتّ التكافؤ؛ أما التكافؤ الزوجي Even parity، فهو عكس ذلك، فإذا كان عدد الواحدات زوجي، فسيُضبط بِتّ التكافؤ على الرقم 1، وبهذه الطريقة سينتج عن تغيّر بِتّ واحد خطأ تكافؤ يمكن اكتشافه.
</p>

<h4>
	الحواسيب ذات أنظمة 16 و 32 و 64 بت
</h4>

<p>
	لا تتسع جميع الأعداد في بايت أو مجموعة محددة من البايتات، فبفرض أن كان رصيدك المصرفي كبيرًا مثلًا فهو يحتاج إلى مجال أوسع مما يمكن أن يتسع في بايت واحد لتمثيله، وتتألف المعماريات الحديثة في الحواسيب حاليًا من أنظمة 32 بت على الأقل، وهذا يعني أنها تعمل مع 4 بايتات في وقت واحد عند المعالجة والقراءة أو الكتابة على الذاكرة، ونشير آنذاك إلى كل 4 بايتات <strong>بالكلمة word</strong>، وهذا مشابه للغة حيث تكوِّن الأحرف -أو البتات- الكلمات في جملة ما، والفارق في الحاسوب عن اللغة أنه تكون كل الكلمات بالحجم نفسه، وهو حجم المتغير من نوع <code>int</code> في اللغة C الذي يساوي 32 بِتّ، أما معماريات 64 بت الحديثة، يضاعف حجم عمل المعالج إلى 8 بايت بدلًا من 4 في معماريات 32 بت.
</p>


<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>



<h4>
	كيلوبايت وميغابايت وغيغابايت
</h4>

<p>
	تتعامل الحواسيب مع عدد كبير من البايتات وهذا ما يجعلها شديدة القوة، وبالتالي نحتاج إلى وسيلة للتحدث عن أعداد ضخمة من البايتات، والوسيلة البديهية لذلك هي استخدام بادئات نظام الوحدات الدولي International System of Units -أو SI اختصارًا- كما هو متّبع في معظم المجالات العلمية الأخرى، إذ يشير الكيلو مثلًا إلى 10<sup>3</sup> أو 1000 وحدة، بحيث يكون الكيلوغرام الواحد هو 1000 غرام.
</p>

<p>
	يُعَدّ 1000 عددًا تقريبيًا round جيدًا في الأساس العشري، لكنه يمثَّل في النظام الثنائي بـ <code>1111101000</code> وهو ليس عددًا تقريبيًا، لكن 1024 أو 2<sup>10</sup> هو عدد تقريبي والذي يمثَّل في النظام الثنائي بـ <code>10000000000</code>، وهو قريب جدًا من الكيلو في النظام العشري، أي العدد 1000 قريب من العدد 1024، وبالتالي أصبح 1024 بايت بطبيعة الحال يُعرَف بالكيلوبايت؛ أما الوحدة التالية في نظام الوحدات الدولي، فهي ميغا mega المقابلة لقيمة 10<sup>6</sup>، كما تستمر البادئات بالازدياد بمقدار 10<sup>3</sup> المقابلة للتجميع المعتاد المكون من ثلاثة أرقام عند كتابة أعداد كبيرة، كما يصادف مجددًا أن تكون 2<sup>20</sup> قريبةً من تحديد نظام الواحدات الدولي للميغا في النظام العشري، أي 1048576 بدلًا من 1000000، فعند زيادة واحدات النظام الثنائي بالقوى من مضاعفات 10 تبقى قريبةً وظيفيًا من قيمة النظام العشري في نظام الواحدات الدولي، مع أنه يحيد قليلًا كل عامل متزايد عن دلالة أساس نظام الواحدات الدولي، وبالتالي فإنّ وحدات النظام العشري في نظام الواحدات الدولي قريبة بما يكفي على قيم النظام الثنائي، وقد شاع استخدامها لتلك القيم.
</p>

<table>
	<thead>
		<tr>
			<th>
				الاسم
			</th>
			<th>
				معامل النظام الثنائي
			</th>
			<th>
				بايت
			</th>
			<th>
				معامل النظام العشري القريب
			</th>
			<th>
				بايت في النظام العشري
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				1 كيلوبايت
			</td>
			<td>
				2<sup>10</sup>
			</td>
			<td>
				1024
			</td>
			<td>
				10<sup>3</sup>
			</td>
			<td>
				1000
			</td>
		</tr>
		<tr>
			<td>
				1 ميغابايت
			</td>
			<td>
				2<sup>20</sup>
			</td>
			<td>
				1.048.576
			</td>
			<td>
				10<sup>6</sup>
			</td>
			<td>
				1.000.000
			</td>
		</tr>
		<tr>
			<td>
				1 غيغابايت
			</td>
			<td>
				2<sup>30</sup>
			</td>
			<td>
				1.073.741.824
			</td>
			<td>
				10<sup>9</sup>
			</td>
			<td>
				1.000.000.000
			</td>
		</tr>
		<tr>
			<td>
				1 تيرابايت
			</td>
			<td>
				2<sup>40</sup>
			</td>
			<td>
				1.099.511.627.776
			</td>
			<td>
				10<sup>12</sup>
			</td>
			<td>
				1.000.000.000.000
			</td>
		</tr>
		<tr>
			<td>
				1 بيتابايت
			</td>
			<td>
				2<sup>50</sup>
			</td>
			<td>
				1.125.899.906.842.624
			</td>
			<td>
				10<sup>15</sup>
			</td>
			<td>
				1.000.000.000.000.000
			</td>
		</tr>
		<tr>
			<td>
				1 إكسابايت
			</td>
			<td>
				2<sup>60</sup>
			</td>
			<td>
				1.152.921.504.606.846.976
			</td>
			<td>
				10<sup>18</sup>
			</td>
			<td>
				1.000.000.000.000.000.000
			</td>
		</tr>
	</tbody>
</table>

<p>
	قد يفيدك ترسيخ معامِلات النظام الثنائي في ذاكرتك كثيرًا في الربط السريع للعلاقة بين عدد البِتّات والأحجام التي يفهمها الإنسان، إذ يمكننا بسرعة مثلًا حساب إمكانية حاسوب بنظام 32 بِتّ أن يعالج ما يصل إلى 4 غيغابايت من الذاكرة من خلال ملاحظة إعادة التركيب (4) 2<sup>2</sup> + 2<sup>30</sup>، وبالمثل يمكن أن تعالِج قيمة 64 بِتّ ما يصل إلى 16 إكسابايت، أي 2<sup>60</sup> + 2<sup>4</sup>، كما يمكنك حساب ضخامة هذا العدد، ولتأخذ فكرةً عن مدى ضخامته، فيمكنك حساب المدة التي ستستغرقها في العد إلى 2<sup>64</sup> إذا عددت رقمًا واحدًا كل ثانية.
</p>

<h4>
	كيلوبت وميغابت وغيغابت
</h4>

<p>
	سيشار إلى السعات غالبًا بالبِتّات بدلًا من البايتات إلى جانب الارتباك الذي يحدث نتيجة العبء المفرط لتحويل واحدات نظام الواحدات الدولي SI بين النظامَين الثنائي والعشري، ويحدث هذا عمومًا عند التحدث في مجال الشبكات أو أجهزة التخزين، فربما لاحظت أنّ اتصال ADSL لديك يشار إليه بقيمة مثل 1500 كيلوبِت في الثانية، إن العملية الحسابية بسيطة، إذ نضرب بالعدد 1000 للكيلو ثم نقسِّم على 8 لنحوِّله إلى بايت ثم نقسِّمه على العدد 1024 لنحوله إلى كيلوبايت، وبالتالي تكون 1500 كيلوبِت في ثانية = 183 كيلوبايت في الثانية.
</p>

<p>
	أقرَّت هيئة نظام الواحدات الدولي هذه الاستخدامات المزدوجة وحددت بادئات فريدةً للاستخدام الثنائي، إذ تقابل 1024 بايت بموجب المعيار كيبي بايت kibibyte، وهو اختصار للكيلوبايت الثنائي kilo binary byte وتُختصر بـ KiB؛ أما البادئات الأخرى، فلها بادئة مماثلة مثل ميبي بايتس MiB، ويمنع العرف المتَّبع إلى حد كبير استخدام هذه المصطلحات، لكنك قد تراها في بعض المؤلَّفات.
</p>

<h4>
	التحويل
</h4>

<p>
	يُعّدّ استخدام الحاسوب الطريقة الأسهل للتحويل بين الأنظمة، فبعد كل شيء هذا ما يبرع فيه. ومع ذلك، فمن المفيد معرفة كيفية إجراء التحويلات يدويًا.
</p>

<p>
	تُعَدّ القسمة المتكررة الطريقة الأسهل للتحويل بين الأنظمة، بحيث نقسِّم ناتج القسمة بصورة متكررة على الأساس إلى أن يصبح ناتج القسمة صفرًا مع تدوين الباقي في كل خطوة، ثم ندوِّن الباقي بالعكس، أي نبدأ من الأسفل ونلحق العدد بالجهة اليمين في كل مرة، وسنذكر مثالًا للتوضيح، كما سيكون الأساس 2 نظرًا لأننا نحوِّل إلى النظام الثنائي.
</p>

<table>
	<thead>
		<tr>
			<th>
				عملية القسمة
			</th>
			<th>
				النتيجة
			</th>
			<th>
				الباقي
			</th>
			<th>
				اتجاه قراءة الباقي
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				2 ÷ 203<sub>10</sub>
			</td>
			<td>
				101
			</td>
			<td>
				1
			</td>
			<td>
				 
			</td>
		</tr>
		<tr>
			<td>
				2 ÷ 101<sub>10</sub>
			</td>
			<td>
				50
			</td>
			<td>
				1
			</td>
			<td>
				↑
			</td>
		</tr>
		<tr>
			<td>
				2 ÷ 50<sub>10</sub>
			</td>
			<td>
				25
			</td>
			<td>
				0
			</td>
			<td>
				↑
			</td>
		</tr>
		<tr>
			<td>
				2 ÷ 25<sub>10</sub>
			</td>
			<td>
				12
			</td>
			<td>
				1
			</td>
			<td>
				↑
			</td>
		</tr>
		<tr>
			<td>
				2 ÷ 12<sub>10</sub>
			</td>
			<td>
				6
			</td>
			<td>
				0
			</td>
			<td>
				↑
			</td>
		</tr>
		<tr>
			<td>
				2 ÷ 6<sub>10</sub>
			</td>
			<td>
				3
			</td>
			<td>
				0
			</td>
			<td>
				↑
			</td>
		</tr>
		<tr>
			<td>
				2 ÷ 3<sub>10</sub>
			</td>
			<td>
				1
			</td>
			<td>
				1
			</td>
			<td>
				↑
			</td>
		</tr>
		<tr>
			<td>
				2 ÷ 1<sub>10</sub>
			</td>
			<td>
				0
			</td>
			<td>
				1
			</td>
			<td>
				↑
			</td>
		</tr>
	</tbody>
</table>

<p>
	ابدأ بقراءة الباقي من الأسفل وأضف كل عدد منه إلى اليمين لتحصل على النتيجة <code>11001011</code>، وقد وجدنا فعلًا أنّ هذه القيمة في النظام الثنائي هي 203 في النظام العشري.
</p>

<h3>
	العمليات البوليانية Boolean Operations
</h3>

<p>
	اكتشف جورج بول عالم الرياضيات مجالًا كاملًا في الرياضيات يسمى جبر بُول Boolean Algebra، وعلى الرغم من أنّ اكتشافاته كانت في منتصف القرن التاسع عشر، إلا أنها أصبحت لاحقًا أساسيات <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">علوم الحاسوب</a>، ويُعَدّ جبر بول هو موضوع واسع النطاق، لذا سنتناول في هذا الكتاب بعض مبادئه الأساسية فقط حتى تستطيع بدء رحلة التعلم.
</p>

<p>
	تأخذ العمليات البوليانية ببساطة دخلًا معينًا وتنتج خرجًا معينًا حسب قاعدة معينة، وأبسط عملية بوليانية مثلًا هي <code>not</code>، وهي تعكس قيمة معامِل operand الدخل؛ أما المعامِلات الأخرى، فتأخذ عادةً دخلين وتنتج خرجًا واحدًا.
</p>

<p>
	يسهل تذكر العمليات البوليانية الأساسية المستخدَمة في علوم الحاسوب وقد أدرجناها في هذا الفصل، ومثلناها بجداول الحقيقة truth tables التي تبيِّن بمظهر بسيط جميع المدخلات والمخرجات المحتمَلة، ويقابل مصطلح حقيقي true القيمة <code>1</code> في النظام الثنائي.
</p>

<h4>
	معامل Not
</h4>

<p>
	تمثَّل عادةً بالرمز <code>!</code>، وهي تعكس قيمة الدخل فتحول <code>0</code> إلى <code>1</code> و <code>1</code> إلى <code>0</code>.
</p>

<table>
	<thead>
		<tr>
			<th>
				الدخل
			</th>
			<th>
				الخرج
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				1
			</td>
			<td>
				0
			</td>
		</tr>
		<tr>
			<td>
				0
			</td>
			<td>
				1
			</td>
		</tr>
	</tbody>
</table>

<h5>
	معامل And
</h5>

<p>
	تذكَّر العبارة التالية: "تكون النتيجة حقيقيةً إذا كان الدخل الأول حقيقيًا <strong>و</strong> الدخل الثاني حقيقيًا" لكي يسهل عليك تذكُّر آلية عمل معامل <code>and</code>.
</p>

<table>
	<thead>
		<tr>
			<th>
				الدخل الأول
			</th>
			<th>
				الدخل الثاني
			</th>
			<th>
				الخرج
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				0
			</td>
			<td>
				0
			</td>
			<td>
				0
			</td>
		</tr>
		<tr>
			<td>
				1
			</td>
			<td>
				0
			</td>
			<td>
				0
			</td>
		</tr>
		<tr>
			<td>
				0
			</td>
			<td>
				1
			</td>
			<td>
				0
			</td>
		</tr>
		<tr>
			<td>
				1
			</td>
			<td>
				1
			</td>
			<td>
				1
			</td>
		</tr>
	</tbody>
</table>

<h4>
	معامل Or
</h4>

<p>
	تذكَّر العبارة التالية: "تكون النتيجة حقيقيةً إذا كان الدخل الأول حقيقيًا <strong>أو</strong> الدخل الثاني حقيقيًا" لكي يسهل عليك تذكُّر آلية عمل معامل <code>or</code> .
</p>

<table>
	<thead>
		<tr>
			<th>
				الدخل الأول
			</th>
			<th>
				الدخل الثاني
			</th>
			<th>
				الخرج
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				0
			</td>
			<td>
				0
			</td>
			<td>
				0
			</td>
		</tr>
		<tr>
			<td>
				1
			</td>
			<td>
				0
			</td>
			<td>
				1
			</td>
		</tr>
		<tr>
			<td>
				0
			</td>
			<td>
				1
			</td>
			<td>
				1
			</td>
		</tr>
		<tr>
			<td>
				1
			</td>
			<td>
				1
			</td>
			<td>
				1
			</td>
		</tr>
	</tbody>
</table>

<h5>
	معامل أو الحصرية Exclusive Or
</h5>

<p>
	تختصَر عبارة معامل أو الحصرية Exclusive Or بـ <code>xor</code> وهي حالة خاصة من معامِل <code>or</code>، بحيث يكون الخرج حقيقيًا عندما يكون أحد المدخَلين فقط حقيقيًا، وستدهشك الحيل المميزة التي يستطيع هذا المعامِل تنفيذها، لكنها ليست مستخدَمةً كثيرًا في النواة.
</p>

<table>
	<thead>
		<tr>
			<th>
				الدخل الأول
			</th>
			<th>
				الدخل الثاني
			</th>
			<th>
				الخرج
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				0
			</td>
			<td>
				0
			</td>
			<td>
				0
			</td>
		</tr>
		<tr>
			<td>
				1
			</td>
			<td>
				0
			</td>
			<td>
				1
			</td>
		</tr>
		<tr>
			<td>
				0
			</td>
			<td>
				1
			</td>
			<td>
				1
			</td>
		</tr>
		<tr>
			<td>
				1
			</td>
			<td>
				1
			</td>
			<td>
				0
			</td>
		</tr>
	</tbody>
</table>

<h3>
	استخدام العمليات البوليانية في الحواسيب
</h3>

<p>
	قد يصعب عليك تصديق أنّ أساس كل ما ينفِّذه حاسوبك هو تلك المعامِلات التي تحدثنا عنها، فالجامع النصفي half adder مثلًا هو أحد أنواع الدارات التي تتكون من العمليات البوليانية التي تجمع البِتّات، وقد سُمّي الجامع النصفي لأنه لا يعالج البتات الفائضة، وستبدأ في بناء كيان يجمع أعداد ثنائية طويلة من خلال وضع أكثر من جامع نصفي معًا، ثم أضف إليه بعض الذواكر الخارجية وستكون قد بنيت حاسوبًا.
</p>

<p>
	تنفَّذ العمليات البوليانية من الناحية الإلكترونية في بوابات gates مصنوعة من الترانزستورات transistors، لذا لا بد أنك سمعت عن عدد الترانزستورات transistor counts وقانون مور وغيرها، وكلما زاد عدد الترانزستورات زاد عدد البوابات وزاد عدد الأشياء التي يمكنك جمعها، كما ستحتاج لبناء الحاسوب الحديث إلى عدد هائل من البوابات وعدد هائل من الترانزستورات، إذ تحتوي بعض معالِجات إيتانيوم Itanium الحديثة على حوالي 460 مليون ترانزستور.
</p>

<h3>
	العمل بالنظام الثنائي في اللغة C
</h3>

<p>
	توجد واجهة مباشرة لجميع المعامِلات التي ذكرناها في اللغة C، ويشرح الجدول التالي هذه المعامِلات:
</p>

<table>
	<thead>
		<tr>
			<th>
				المعامل
			</th>
			<th>
				اصطلاحه في اللغة C
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				not
			</td>
			<td>
				!
			</td>
		</tr>
		<tr>
			<td>
				and
			</td>
			<td>
				&amp;
			</td>
		</tr>
		<tr>
			<td>
				or
			</td>
			<td>
				\
			</td>
		</tr>
		<tr>
			<td>
				xor
			</td>
			<td>
				^
			</td>
		</tr>
	</tbody>
</table>

<p>
	نطبّق هذه المعامِلات على المتغيرات لتعديل البِتّات ضمن المتغير، ولكن يجب علينا أولًا أن نتناول شرحًا للترميز الست العشري قبل أن نستعرض أمثلةً عن ذلك.
</p>


<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			طور أعمالك مع حلول الذكاء الاصطناعي المبتكرة
		</p>

		<p class="banner-subtitle">
			اسبق منافسيك نحو المستقبل وحقق أهدافك بالاستعانة بقوة الذكاء الاصطناعي
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://khamsat.com/ai-services" rel="external">اطلب خدمات الذكاء الاصطناعي الآن</a>
		</div>
	</div>
</div>



<h2>
	النظام الست عشري Hexadecimal
</h2>

<p>
	يشير النظام الست عشري إلى نظام أساسه العدد 16، والسبب الوحيد لاستخدامنا هذا النظام في علوم الحاسوب هو أنه يسهِّل على الإنسان التفكير في الأرقام الثنائية، إذ يسهِّل عدم تعامل الحواسيب إلا مع النظامَين الثنائي والست عشري على الإنسان محاولته التعامل مع الحاسوب.
</p>

<p>
	لكن لماذا اختير الأساس 16؟ إن الخيار الطبيعي هو الأساس 10 لأننا معتادون على التفكير في الأساس 10 حسب نظامنا العددي اليومي، لكن الأساس 10 لا يتوافق كثيرًا مع النظام الثنائي؛ إذ نحتاج إلى أربع بتات لتمثيل 10 عناصر مختلفة في النظام الثنائي، لكن تلك الأربع بتات توفر لنا ست عشرة توليفة محتمَلة، لذا نحن أمام احتمالين؛ إما أن نختار الطريقة شديدة التعقيد المتمثلة في محاولة التحويل بين النظام العشري والثنائي، أو أن نختار الطريقة السهلة وننشئ نظامًا عدديًا أساسه العدد 16 وهو النظام الست عشري.
</p>

<p>
	يستخدِم النظام الست عشري الأعداد القياسية في النظام العشري مع إضافة الأحرف <code>A B C D E F</code> التي تشير إلى الأعداد <code>10 11 12 13 14 15</code>، مع الانتباه إلى بدء العدّ من الصفر، فمتى ما رأيت عددًا مسبوقًا بـ <code>0x</code>، فاعلم أنه يدل على عدد ست عشري، وكما ذكرنا أنه سنحتاج إلى أربع بتات بالضبط لتمثيل 16 نمط مختلف في النظام الثنائي، لذا يمثِّل كل عدد ست عشري أربع بتات بالضبط، ويجب أن تعدّه تمرينًا لتتعلم الجدول التالي عن ظهر قلب.
</p>

<table>
	<thead>
		<tr>
			<th>
				النظام الست عشري
			</th>
			<th>
				النظام الثنائي
			</th>
			<th>
				النظام العشري
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				0
			</td>
			<td>
				0000
			</td>
			<td>
				0
			</td>
		</tr>
		<tr>
			<td>
				1
			</td>
			<td>
				0001
			</td>
			<td>
				1
			</td>
		</tr>
		<tr>
			<td>
				2
			</td>
			<td>
				0010
			</td>
			<td>
				2
			</td>
		</tr>
		<tr>
			<td>
				3
			</td>
			<td>
				0011
			</td>
			<td>
				3
			</td>
		</tr>
		<tr>
			<td>
				4
			</td>
			<td>
				0100
			</td>
			<td>
				4
			</td>
		</tr>
		<tr>
			<td>
				5
			</td>
			<td>
				0101
			</td>
			<td>
				5
			</td>
		</tr>
		<tr>
			<td>
				6
			</td>
			<td>
				0110
			</td>
			<td>
				6
			</td>
		</tr>
		<tr>
			<td>
				7
			</td>
			<td>
				0111
			</td>
			<td>
				7
			</td>
		</tr>
		<tr>
			<td>
				8
			</td>
			<td>
				1000
			</td>
			<td>
				8
			</td>
		</tr>
		<tr>
			<td>
				9
			</td>
			<td>
				1001
			</td>
			<td>
				9
			</td>
		</tr>
		<tr>
			<td>
				A
			</td>
			<td>
				1010
			</td>
			<td>
				10
			</td>
		</tr>
		<tr>
			<td>
				B
			</td>
			<td>
				1011
			</td>
			<td>
				11
			</td>
		</tr>
		<tr>
			<td>
				C
			</td>
			<td>
				1100
			</td>
			<td>
				12
			</td>
		</tr>
		<tr>
			<td>
				D
			</td>
			<td>
				1101
			</td>
			<td>
				13
			</td>
		</tr>
		<tr>
			<td>
				E
			</td>
			<td>
				1110
			</td>
			<td>
				14
			</td>
		</tr>
		<tr>
			<td>
				F
			</td>
			<td>
				1111
			</td>
			<td>
				15
			</td>
		</tr>
	</tbody>
</table>

<p>
	بالطبع لا يوجد سبب للتوقف عن متابعة النمط (مثل تحديد G للقيمة 16)، ولكن القيم الستة عشرة هي موازنة ممتازة بين تقلبات الذاكرة البشرية وعدد البتات التي يستخدمها الحاسوب، كما ستجد أيضًا الأساس 8 مستخدَمًا أحيانًا في سماحيات الملفات في أنظمة يونكس مثلًا، ونمثِّل ببساطة أعدادًا أكبر من البتات بأعداد أكثر، إذ يمكن مثلًا تمثيل متغير يتألف من ستة عشر بت بالقيمة <code>0xAB12</code>، وما عليك سوى تحويل كل رقم على حدى وفقًا للجدول السابق ثم جمع القيم معًا لتجد مقابلها في النظام الثنائي، أي لتكون القيمة المقابلة للقيمة <code>0xAB12</code> هي العدد الذي يتألف من 16 بت في النظام الثنائي <code>1010101100010010</code>، كما نستطيع التحويل من النظام الثنائي إلى النظام الست عشري بعكس تلك العملية، كما نستطيع الاستعانة بنهج القسمة المتكررة ذاته لتغيير أساس أي عدد، فلإيجاد قيمة العدد 203 بالنظام الست عشري مثلًا:
</p>

<table>
	<thead>
		<tr>
			<th>
				عملية القسمة
			</th>
			<th>
				النتيجة
			</th>
			<th>
				الباقي
			</th>
			<th>
				اتجاه قراءة الباقي
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				16 ÷ 203<sub>10</sub>
			</td>
			<td>
				12
			</td>
			<td>
				11 (0xB)
			</td>
			<td>
				 
			</td>
		</tr>
		<tr>
			<td>
				16 ÷ 12<sub>10</sub>
			</td>
			<td>
				0
			</td>
			<td>
				12 (0xC)
			</td>
			<td>
				↑
			</td>
		</tr>
	</tbody>
</table>

<p>
	لذا تكون قيمة 203 في النظام الست عشري هي <code>0xCB</code>
</p>

<h2>
	الاستخدام العملي للأنظمة العددية
</h2>

<p>
	سنطلع فيما يلي على الاستخدام العملي للأنظمة العددية وما النتائج العملية التي ممكن أن نحصل عليها.
</p>

<h3>
	استخدام النظام الثنائي في الشيفرات البرمجية
</h3>

<p>
	تُعَدّ برمجة حاسوب بلغات عالية المستوى high level دون معرفة أيّ شيء عنه هو أمر عملي بحت على الرغم من أنّ النظام الثنائي هو اللغة الأساسية لكل حاسوب، وعلى أية حال نهتم ببعض مبادئ النظام الثنائي الأساسية والمستخدَمة بصورة متكررة بالنسبة شيفرة البرمجية منخفضة المستوى low level code التي سنتناولها.
</p>

<h3>
	التقنع والرايات
</h3>

<p>
	سنشرح مفهوم عمليتي التقنع والرايات وكيفية تطبيقهما عمليًا على الأنظمة العددية.
</p>

<h4>
	التقنع Masking
</h4>

<p>
	من المهم غالبًا جعل البنى والمتغيرات تحجز مساحةً بأكثر طريقة فعالة ممكنة في الشيفرة البرمجية منخفضة المستوى، وقد يتضمن هذا في بعض الحالات تعبئة packing متغيرين -يكونان مرتبطين ببعضهما عمومًا- بمتغير واحد بطريقة فعالة.
</p>

<p>
	تذكَّر أنّ كل بِتّ يمثل حالتين، فإذا علمنا مثلًا أنّ للمتغير 16 حالة محتمَلة فقط، فيمكن تمثيله بـ 4 بِتّات، أي 2<sup>4</sup> = 16 قيمةً فريدةً، لكن أصغر نوع يمكننا التصريح عنه في اللغة C هو 8 بتات وهو نوع <code>char</code> أي محرف، فإما نهدر أربع بتات، أو نجد طريقةً نستخدِم فيها تلك البتات الفائضة، ويمكننا تحقيق ذلك بسهولة من خلال عملية التقنُّع التي تتبع قواعد العمليات المنطقية لاستخراج القيم وهي موضَّحة في الصورة التالية.
</p>

<p>
	نحتفظ بقيمتَين منفصلتين تتألفان من 4 بِتّات داخل محرف واحد يتألف من 8 بِتّات، إذ نُعِدّ البِتّات الأربعة الأولى (الزرقاء) قيمةً واحدةً والبِتَات الأربعة الأخيرة (الحمراء) قيمةً أخرى، وقد ضبطنا القناع على تعيين قيمة البتات الأربعة الأخيرة <code>1</code> (<code>0x0F</code>) لاستخراج البِتّات الأربعة السفلية، وبما أنّ المعامِل and المنطقي سيضبط البت إلى <code>1</code> فقط إذا كانت قيمة كلا البتّين <code>1</code>، فستخفي البِتّات التي ضبطنا قيمتها على <code>0</code> في القناع وهي البتات التي لا تهمنا بصورة فعالة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="104992" href="https://academy.hsoub.com/uploads/monthly_2022_08/001masking.png.6e3f100aea609456afa1ede4a05e6882.png" rel=""><img alt="001masking.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104992" data-unique="p0wgfllxt" src="https://academy.hsoub.com/uploads/monthly_2022_08/001masking.png.6e3f100aea609456afa1ede4a05e6882.png"></a>
</p>

<p style="text-align: center;">
	(التقنُّع)
</p>

<p>
	نقلب القناع للحصول على البِتّات الأربعة الأولى (الزرقاء)، أي نضبط البِتّات الأربعة الأولى على القيمة <code>1</code> والبتات الأربعة الأخيرة على القيمة <code>0</code>، وستلاحظ أنّ نتيجة هذا ستكون <code>0000 1010</code> أو <code>0xA0</code> في النظام الست عشري، على حين أننا نريد فعلًا أن نعتبر هذه القيمة الفريدة المؤلفة من 4 بتات <code>1010</code> أي <code>0x0A</code>، ولوَضع هذه البتات في الموضع الصحيح نستخدِم المعامِل <code>right shift</code> أربع مرات، والذي سيمنحنا القيمة النهائية <code>1010 0000</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3053_9" style=""><span class="pln">  </span><span class="lit">1</span><span class="pln"> </span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">

    </span><span class="com">#define</span><span class="pln"> LOWER_MASK </span><span class="lit">0x0F</span><span class="pln">
    </span><span class="com">#define</span><span class="pln"> UPPER_MASK </span><span class="lit">0xF0</span><span class="pln">
  </span><span class="lit">5</span><span class="pln"> 
    </span><span class="typ">int</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> argc</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">char</span><span class="pun">*</span><span class="pln"> argv</span><span class="pun">[])</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
            </span><span class="com">/* قيمتان بحجم 4 بتات مخزنتان في متغير بحجم 8 بتات */</span><span class="pln">
 </span><span class="lit">10</span><span class="pln">         </span><span class="kwd">char</span><span class="pln"> value </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0xA5</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">char</span><span class="pln"> lower </span><span class="pun">=</span><span class="pln"> value </span><span class="pun">&amp;</span><span class="pln"> LOWER_MASK</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">char</span><span class="pln"> upper </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">value </span><span class="pun">&amp;</span><span class="pln"> UPPER_MASK</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">

            printf</span><span class="pun">(</span><span class="str">"Lower: %x\n"</span><span class="pun">,</span><span class="pln"> lower</span><span class="pun">);</span><span class="pln">
 </span><span class="lit">15</span><span class="pln">         printf</span><span class="pun">(</span><span class="str">"Upper: %x\n"</span><span class="pun">,</span><span class="pln"> upper</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span></pre>

<p>
	يتطلب ضبط البِتّات المعامِل or المنطقي، لكن سنستخدم الأصفار <code>0</code> بدلًا من استخدام الواحدات <code>1</code> على أساس قناع، كما ننصحك برسم مخطط مشابه للصورة السابقة والعمل على ضبط البِتّات بواسطة المعامِل <code>or</code> المنطقي.
</p>

<h4>
	الرايات flags
</h4>

<p>
	يتضمن البرنامج غالبًا عددًا كبيرًا من المتغيرات التي توجد فقط بصيغة رايات flags في شروط معينة، فآلة الحالات state machine مثلًا هي خوارزمية تتنقل عبر عدد من الحالات المختلفة، لكنها لا تتواجد إلا في حالة واحدة فقط في المرة الواحدة، ولنقل أنه لديها 8 حالات مختلفة، إذ نستطيع بسهولة التصريح عن 8 متغيرات مختلفة، بحيث يكون هناك متغير واحد لكل حالة، لكن في كثير من الحالات يفضَّل التصريح عن متغير واحد مؤلف من 8 بتات وتعيين راية لكل بِتّ للإشارة إلى حالة معينة.
</p>

<p>
	تُعَدّ الرايات حالةً خاصةً من التقنُّع، لكن يمثِّل كل بِتّ حالةً بوليانيةً معينةً، أي تشغيل أو إيقاف، كما يمكن لمتغير مؤلَّف من عدد <code>n</code> من البتات أن يحمل العدد <code>n</code> من الرايات المختلفة، ويُعَدّ نموذج الشيفرة البرمجية التالي هو مثال نموذجي على استخدام الرايات، وستلحظ اختلافات في هذه الشيفرة البرمجية الأساسية في معظم الأحيان.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3053_11" style=""><span class="pln">  </span><span class="lit">1</span><span class="pln"> </span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">

    </span><span class="com">/*
     *  تعريف كافة الرايات الثمانية المحتمَلة لمتغير بحجم 8 بتات
  5  *        الاسم    النظام الست عشري    النظام الثنائي
     */</span><span class="pln">
    </span><span class="com">#define</span><span class="pln"> FLAG1 </span><span class="lit">0x01</span><span class="pln"> </span><span class="com">/* 00000001 */</span><span class="pln">
    </span><span class="com">#define</span><span class="pln"> FLAG2 </span><span class="lit">0x02</span><span class="pln"> </span><span class="com">/* 00000010 */</span><span class="pln">
    </span><span class="com">#define</span><span class="pln"> FLAG3 </span><span class="lit">0x04</span><span class="pln"> </span><span class="com">/* 00000100 */</span><span class="pln">
 </span><span class="lit">10</span><span class="pln"> </span><span class="com">#define</span><span class="pln"> FLAG4 </span><span class="lit">0x08</span><span class="pln"> </span><span class="com">/* 00001000 */</span><span class="pln">
    </span><span class="com">/* ... وهكذا */</span><span class="pln">
    </span><span class="com">#define</span><span class="pln"> FLAG8 </span><span class="lit">0x80</span><span class="pln"> </span><span class="com">/* 10000000 */</span><span class="pln">

    </span><span class="typ">int</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> argc</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*</span><span class="pln">argv</span><span class="pun">[])</span><span class="pln">
 </span><span class="lit">15</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">char</span><span class="pln"> flags </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> </span><span class="com">/* متغير بحجم 8 بتات */</span><span class="pln">

</span><span class="pun">‫</span><span class="pln">        </span><span class="com">/* ضبط الرايات بمعامل ‎ orالمنطقي */</span><span class="pln">
        flags </span><span class="pun">=</span><span class="pln"> flags </span><span class="pun">|</span><span class="pln"> FLAG1</span><span class="pun">;</span><span class="pln"> </span><span class="com">/* ضبط الراية الأولى */</span><span class="pln">
 </span><span class="lit">20</span><span class="pln">     flags </span><span class="pun">=</span><span class="pln"> flags </span><span class="pun">|</span><span class="pln"> FLAG3</span><span class="pun">;</span><span class="pln"> </span><span class="com">/* ضبط الراية الثالثة

        /* ‫تحقق من الرايات بالمعامل and المنطقي. إذا كانت الراية مضبوطة بالقيمة 1
         * ‫سيرجع المعامل and قيمة 1
         * if مما سيحقق الشرط الوارد في  */</span><span class="pln">
 </span><span class="lit">25</span><span class="pln">     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">flags </span><span class="pun">&amp;</span><span class="pln"> FLAG1</span><span class="pun">)</span><span class="pln">
            printf</span><span class="pun">(</span><span class="str">"FLAG1 set!\n"</span><span class="pun">);</span><span class="pln">

        </span><span class="com">/* سيكون هذا بالطبع غير صحيح */</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">flags </span><span class="pun">&amp;</span><span class="pln"> FLAG8</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">30</span><span class="pln">         printf</span><span class="pun">(</span><span class="str">"FLAG8 set!\n"</span><span class="pun">);</span><span class="pln">

        </span><span class="com">/* ‫تحقق من عدة رايات بواسطة or المنطقي
         * سيمرر هذا لأن الراية الأولى مضبوطة */</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">flags </span><span class="pun">&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">FLAG1</span><span class="pun">|</span><span class="pln">FLAG4</span><span class="pun">))</span><span class="pln">
 </span><span class="lit">35</span><span class="pln">         printf</span><span class="pun">(</span><span class="str">"FLAG1 or FLAG4 set!\n"</span><span class="pun">);</span><span class="pln">

        </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">    </span></pre>

<p>
	ترجمة -وبتصرف- للقسم <a href="https://www.bottomupcs.com/chapter01.xhtml" rel="external nofollow">Binary — the basis of computing</a> من الفصل Chapter 2. Binary and Number Representation من كتاب <a href="https://www.bottomupcs.com/index.xhtml" rel="external nofollow">Computer Science from the Bottom Up</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D9%85%D8%AB%D9%8A%D9%84-%D8%A7%D9%84%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D9%88%D8%A7%D9%84%D8%A3%D8%B9%D8%AF%D8%A7%D8%AF-%D9%81%D9%8A-%D8%A7%D9%84%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8%D9%8A%D8%A9-r1659/" rel="">تمثيل الأنواع والأعداد في الأنظمة الحاسوبية</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%81%D9%87%D9%88%D9%85-%D9%88%D8%A7%D8%B5%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-descriptors-%D9%88%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7%D9%87%D8%A7-%D8%A8%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%AC%D8%B1%D9%8A%D8%AF-%D9%81%D9%8A-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-r1657/" rel="">مفهوم واصفات الملفات File Descriptors وارتباطها بعملية التجريد في أنظمة التشغيل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/certificates/cisco/ccna/%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84%d8%b9%d8%af-%d8%a7%d9%84%d8%ab%d9%86%d8%a7%d8%a6%d9%8a-%d9%81%d9%8a-%d8%a7%d9%84%d8%b4%d8%a8%d9%83%d8%a7%d8%aa-r22/" rel="">أساسيات نظام العد الثنائي في الشبكات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1658</guid><pubDate>Mon, 22 Aug 2022 16:01:00 +0000</pubDate></item><item><title>&#x645;&#x641;&#x647;&#x648;&#x645; &#x648;&#x627;&#x635;&#x641;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; File Descriptors &#x648;&#x627;&#x631;&#x62A;&#x628;&#x627;&#x637;&#x647;&#x627; &#x628;&#x639;&#x645;&#x644;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x62C;&#x631;&#x64A;&#x62F; &#x641;&#x64A; &#x623;&#x646;&#x638;&#x645;&#x629; &#x627;&#x644;&#x62A;&#x634;&#x63A;&#x64A;&#x644;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%81%D9%87%D9%88%D9%85-%D9%88%D8%A7%D8%B5%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-descriptors-%D9%88%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7%D9%87%D8%A7-%D8%A8%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%AC%D8%B1%D9%8A%D8%AF-%D9%81%D9%8A-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-r1657/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_08/62f4df1988b8d_-.jpg.2d30cb6f90a2ccd207ba45cae964d913.jpg" /></p>
<p>
	إحدى أولى المفاهيم التي يتعلمها مبرمج أنظمة يونكس هي أنّ عمل كل برنامج يبدأ بثلاث ملفات تكون مفتوحةً مسبقًا:
</p>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
} 

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table>
	<thead>
		<tr>
			<th>
				الاسم الوصفي
			</th>
			<th>
				الاسم المختصر
			</th>
			<th>
				رقم الملف
			</th>
			<th>
				الشرح
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				مجرى الدخل القياسي
			</td>
			<td>
				stdin
			</td>
			<td>
				0
			</td>
			<td>
				الدخل من لوحة المفاتيح
			</td>
		</tr>
		<tr>
			<td>
				مجرى الخرج القياسي
			</td>
			<td>
				stdout
			</td>
			<td>
				1
			</td>
			<td>
				الخرج الظاهر على الطرفية
			</td>
		</tr>
		<tr>
			<td>
				مجرى الخطأ القياسي
			</td>
			<td>
				stderr
			</td>
			<td>
				2
			</td>
			<td>
				خرج رسائل الخطأ على الطرفية
			</td>
		</tr>
	</tbody>
</table>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="104987" href="https://academy.hsoub.com/uploads/monthly_2022_08/62f4df19c00dc_001Defaultunixfiles.png.6eb5be36d56f116c81112c2ea8a36c06.png" rel="" data-fileext="png"><img alt="001Default unix files.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104987" data-unique="4dgjoyybk" style="width: 300px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_08/62f4df1a94e37_001Defaultunixfiles.thumb.png.d7d278bc5cb3a4efeec6f2f35306de70.png"></a>
</p>

<p style="text-align: center;">
	(ملفات يونيكس الافتراضية)
</p>

<p>
	يستحضر هذا إلى أذهاننا السؤال عمّا يمثله الملف المفتوح وكيفية فتحه، إذ تسمى القيمة التي يعيدها استدعاء <code>open</code> لفتح الملف اصطلاحًا بواصف الملف file descriptor، وهي أساسًا فهرس لمصفوفة من الملفات المفتوحة المخزَّنة في النواة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="104989" href="https://academy.hsoub.com/uploads/monthly_2022_08/002file-descriptors.png.44b0185a21d73434839f1aaeb78e47ad.png" rel="" data-fileext="png"><img alt="002file-descriptors.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104989" data-unique="fuq5vcwwq" style="width: 800px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_08/002file-descriptors.png.44b0185a21d73434839f1aaeb78e47ad.png"></a>
</p>

<p style="text-align: center;">
	(فائدة واصفات الملفات في عملية التجريد)
</p>

<p>
	تُعَدّ واصفات الملفات فهرسًا لجدول واصفات الملفات تخزنه النواة، بحيث تنشئ النواة واصف ملف استجابةً لاستدعاء <code>open</code> وتربطه ببعض التجريد لكائن يشبه الملف سواءً كان جهازًا فعليًا أو نظام ملفات أو شيء بعيد عن هذا كل البعد، وبالتالي توجه النواة استدعاءات عمليات القراءة <code>read</code> والكتابة <code>write</code> التي تشير إلى واصف الملف ذاك إلى الموضع الصحيح لتنفذ مهمة مفيدة في النهاية.
</p>

<p>
	تعرض الصورة نظرةً عامةً على تجريد العتاد، وباختصار يُعَدّ واصف الملف البوابة إلى تجريدات النواة للعتاد والأجهزة الأساسية.
</p>

<p>
	لنبدأ من المستوى الأدنى، إذ يتطلب نظام التشغيل وجود مبرمج ينشئ تعريفًا للجهاز device driver أو برنامج تعريف حتى يتمكن من التواصل مع أحد أجهزة العتاد، ويُكتَب تعريف الجهاز هذا إلى <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">واجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a> التي توفرها النواة بالطريقة نفسها والتي وردت في مثال المقال السابق، إذ سيوفر تعريف الجهاز مجموعة دوال تستدعيها النواة استجابةً للمتطلبات المختلفة، ويمكننا في المثال المبسَّط في الصورة السابقة رؤية أن تعريف الجهاز يوفِّر دالة القراءة <code>read</code> والكتابة <code>write</code> اللتين ستُستدعيان استجابةً للعمليات المماثلة التي تنفذ على واصف الملف، كما يعلم تعريف الجهاز كيف يحوِّل هذه الطلبات العامة إلى طلبات أو أوامر محددة لجهاز محدد.
</p>

<p>
	تقدم النواة واجهة-ملف file-interface لتوفير التجريد لمساحة المستخدِم عبر ما يسمى بطبقة الجهاز device layer عمومًا، إذ تمثَّل الأجهزة المادية على المضيف بملف له نظام ملفات خاص مثل <code>dev‎/</code>، ففي أنظمة يونكس وما يشابهها تحتوي عقد الجهاز device-nodes على ما اصطلح تسميته بالعدد الرئيسي major number والعدد الثانوي minor number، مما يتيح للنواة ربط عقد محددة بما يقابلها ببرنامج التعريف الموفر، كما يمكنك الاطلاع عليها من خلال الأمر <code>ls</code> كما هو موضح في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8776_16" style=""><span class="pln">$ ls </span><span class="pun">-</span><span class="pln">l </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="kwd">null</span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">zero </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">tty
crw</span><span class="pun">-</span><span class="pln">rw</span><span class="pun">-</span><span class="pln">rw</span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> root root </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="typ">Aug</span><span class="pln"> </span><span class="lit">26</span><span class="pln"> </span><span class="lit">13</span><span class="pun">:</span><span class="lit">12</span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="kwd">null</span><span class="pln">
crw</span><span class="pun">-</span><span class="pln">rw</span><span class="pun">-</span><span class="pln">rw</span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> root root </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="typ">Sep</span><span class="pln">  </span><span class="lit">2</span><span class="pln"> </span><span class="lit">15</span><span class="pun">:</span><span class="lit">06</span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">tty
crw</span><span class="pun">-</span><span class="pln">rw</span><span class="pun">-</span><span class="pln">rw</span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> root root </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> </span><span class="typ">Aug</span><span class="pln"> </span><span class="lit">26</span><span class="pln"> </span><span class="lit">13</span><span class="pun">:</span><span class="lit">12</span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">zero</span></pre>

<p>
	ينقلنا هذا إلى واصف الملف، وهو الأداة التي تستخدِمها مساحة المستخدِم للتواصل مع الجهاز الأساسي، وبصورة عامة ما يحدث عند فتح الملف هو أنّ النواة تستخدِم معلومات المسار لربط map واصف الملف بشيء يوفِّر واجهتّي <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> قراءة وكتابة وغيرهما مناسبة، فعندما تكون عملية فتح الملف <code>open</code> للجهاز مثل ‎<code>/dev/sr0</code>‎ في مثالنا السابق، فسيوفر العدد الرئيسي والثانوي لعقدة الجهاز المفتوح المعلومات التي تحتاجها النواة للعثور على تعريف الجهاز الصحيح وإتمام عملية الربط mapping، كما ستعلم النواة بعد ذلك كيف توجه الاستدعاءات اللاحقة مثل القراءة <code>read</code> إلى الدوال الأساسية التي يوفرها تعريف الجهاز.
</p>

<p>
	يعمل الملف غير المرتبط بجهاز non-device file بآلية مشابهة، على الرغم من وجود طبقات أكثر خلال العملية، فالتجريد هنا هو نقطة الوصل أو الربط mount point، وكما تملك عملية توصيل نظام الملفات file system mounting غايةً مزدوجةً تتمثل في إعداد عملية الربط mapping، بحيث يتعرف نظام الملفات على الجهاز الأساسي الذي يوفِّر التخزين وتعلم النواة أنّ الملفات المفتوحة في نقطة التوصيل تلك يجب أن توجَّه إلى تعريف نظام الملفات، كما تُكتَب أنظمة الملفات على واجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> محددة لنظام الملفات العام التي توفرها النواة على غرار تعريفات الأجهزة.
</p>

<p>
	بالطبع الصورة الكاملة معقدة أكثر في الواقع، إذ تضم عدة طبقات أخرى، فتبذل النواة على سبيل المثال جهدًا كبيرًا لتخزين cache أكبر قدر ممكن من البيانات الواردة من الأقراص في الذاكرة الخالية، ويقدِّم هذا العديد من الميزات التي تحسِّن السرعة، كما تحاول النواة تنظيم الوصول إلى الجهاز بأكثر طريقة فعالة وممكنة مثل محاولة طلب الوصول إلى القرص للتأكد من أن البيانات المخزَّنة فيزيائيًا بالقرب من بعضها ستستعاد معًا حتى لو لم ترد الطلبات بترتيب تسلسلي، بالإضافة إلى انتماء العديد من الأجهزة إلى فئة أعم مثل أجهزة USB أو SCSI التي توفِّر طبقات التجريد الخاصة بها للكتابة عليها، وبالتالي ستمر أنظمة الملفات في هذه الطبقات المتعددة بدلًا من الكتابة مباشرةً على الأجهزة، أي يكون فهم النواة هو فهم كيفية ترابط واجهات <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> المتعددة تلك وتواجدها مع بعضها.
</p>

<h2>
	الصدفة Shell
</h2>

<p>
	تُعَدّ الصدفة بوابة التفاعل مع <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">نظام التشغيل</a> سواءً كانت باش bash أو zsh أو csh أو أيّ نوع من أنواع الأصداف الأخرى العديدة، إذ تشترك جميعها أساسًا في مهمة رئيسية واحدة فقط، وهي أنها تتيح لك تنفيذ البرامج، كما ستبدأ بفهم آلية تنفيذ الصدفة لهذه المهمة فعليًا عندما سنتحدث لاحقًا عن بعض العناصر الداخلية لنظام التشغيل.
</p>

<p>
	لكن الأصداف قادرة على تنفيذ مهام أكبر بكثير من مجرد إتاحة تنفيذ برنامج، إذ تتميز بقدرات قوية لإعادة توجيه الملفات، وتتيح لك تنفيذ عدة برامج في الوقت نفسه وكتابة نصوص برمجية تبني برامج متكاملة، وهذا كله يعيدنا إلى مقولة كل شيء هو عبارة عن ملف.
</p>

<h3>
	إعادة التوجيه Redirection
</h3>

<p>
	لا نريد في معظم الأحيان أن تشير واصفات الملفات القياسية التي تحدثنا عنها في بداية المقال إلى مواضع محددة افتراضيًا، فقد ترغب مثلًا في تسجيل كامل خرج البرنامج على ملف تحدده على القرص أو في جعله يتلقى أوامره من ملف أعددته مسبقًا، وقد ترغب في تمرير خرج برنامج ليكون دخل برنامج آخر، إذ تيسّر الصدفة ذلك وأكثر بالعمل مع نظام التشغيل.
</p>

<table>
	<thead>
		<tr>
			<th>
				الاسم
			</th>
			<th>
				الأمر
			</th>
			<th>
				الوصف
			</th>
			<th>
				مثال
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				إعادة التوجيه إلى ملف
			</td>
			<td>
				<code>filename &lt;</code>
			</td>
			<td>
				أخذ كامل الخرج الناتج عن Standard Out وتسجيله في الملف <code>filename</code> (استبدل <code>filename</code> باسم الملف). ملاحظة: استخدم <code>&lt;&lt;</code> لتُلحق الخرج بنهاية محتوى الملف بدلًا من استبدال محتواه
			</td>
			<td>
				<code>ls &gt; filename</code>
			</td>
		</tr>
		<tr>
			<td>
				القراءة من ملف
			</td>
			<td>
				<code>filename &gt;</code>
			</td>
			<td>
				نسخ كافة البيانات من الملف إلى دخل البرنامج القياسي standard input
			</td>
			<td>
				<code>echo &lt; filename</code>
			</td>
		</tr>
		<tr>
			<td>
				التمرير Pipe
			</td>
			<td>
				<code>program1 | program2</code>
			</td>
			<td>
				أخذ كامل خرج standard out البرنامج الأول <code>program1</code> وتمريره إلى دخل standard input البرنامج الثاني <code>program2</code>
			</td>
			<td>
				<code>ls | more</code>
			</td>
		</tr>
	</tbody>
</table>

<h3>
	تنفيذ عملية التمرير pipe
</h3>

<p>
	يُعَدّ تنفيذ الأمر <code>ls | more</code> مثالًا آخرَ على قدرة التجريد، فما يحدث هنا بصورة أساسية هو أنه بدلًا من ربط واصف الملف لمجرى الخرج القياسي بإحدى الأجهزة الأساسية مثل الطرفية لعرض الخرج عليها، يوجَّه الواصف إلى مخزن مؤقت buffer في الذاكرة توفِّره النواة ويطلق عليه عادةً الأنبوب pipe، والمميز هنا هو إمكانية عملية أخرى أن تربط دخلها القياسي standard input بالجانب الآخر من المخزن المؤقت ذاته buffer وتستحوذ على خرج العملية الأخرى بفعالية كما هو موضَّح في الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="104991" href="https://academy.hsoub.com/uploads/monthly_2022_08/62f4df232138d_003Pipeinaction.png.f8e10a929b0203a4bd69bda5ce9e930b.png" rel="" data-fileext="png"><img alt="003Pipe in action.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104991" data-unique="7gg12c2lj" src="https://academy.hsoub.com/uploads/monthly_2022_08/62f4df232138d_003Pipeinaction.png.f8e10a929b0203a4bd69bda5ce9e930b.png"></a>
</p>

<p style="text-align: center;">
	(الأنبوب)
</p>

<p>
	الأنبوب هو مخزن مؤقت في الذاكرة يربط عمليتين معًا، وتشير واصفات الملف إلى كائن الأنبوب الذي يخزن البيانات المرسلة إليه من خلال عملية الكتابة ليصرِّفها من خلال عملية القراءة.
</p>

<p>
	تخزِّن النواة عمليات الكتابة في الأنبوب حتى تصرّف عملية قراءة مقابلة من الجانب الآخر للمخزن المؤقت، وهذا مفهوم قوي جدًا وهو أحد الأشكال الأساسية للتواصل بين العمليات inter-process communication -أو IPC اختصارًا- في أنظمة يونكس وما يشابهها، كما لا تقتصر عملية التمرير على نقل البيانات، إذ يمكن أن تؤدي دور قناة إشارات signaling channel، فإذا قرأت إحدى العمليات أنبوبًا فارغًا، فستعطله أو تجمده block افتراضيًا أو تضعه في حالة سبات hibernation إلى حين توفر بعض البيانات، وسنتعمق في هذا أكثر في مقال لاحق من هذه السلسلة، وبالتالي قد تستخدِم عمليتان أنبوبًا للإبلاغ عن اتخاذ إجراء ما عن طريق كتابة بايت واحد من البيانات، فبدلًا من أن تكون البيانات الفعلية مهمةً، فإن مجرد وجود أية بيانات في الأنبوب يمكن أن تشير إلى رسالة، فلنفترض مثلًا أنّ إحدى العمليات تطلب طباعة عملية أخرى لملف وهو أمر سيستغرق بعض الوقت، لذا قد تُعِدّ العمليتان أنبوبًا بينهما بحيث تقرأ العملية التي أرسلت الطلب الأنبوب الفارغ، وبما أنه فارغ، فسيعطّل هذا الاستدعاء وتبطِل العملية، لكن بمجرد الانتهاء من الطباعة، ستكتب العملية الأخرى رسالةً في الأنبوب ويؤدي ذلك إلى إيقاظ العملية التي أرسلت الطلب بصورة فعالة وإرسال إشارة تدل على انتهاء العمل.
</p>

<p>
	ينبثق عن السماح للعمليات بتمرير البيانات بين بعضها بهذه الطريقة مصطلح شائع آخر في يونكس للأدوات الصغيرة التي تنفذ أمرًا معينًا، ويضفي تسلسل هذه الأدوات الصغيرة مرونةً لا تستطيع أداة موحَّدة إضفاءها في معظم الأحيان.
</p>

<p>
	ترجمة -وبتصرُّف- لقسم من الفصل <a href="https://www.bottomupcs.com/file_descriptors.xhtml" rel="external nofollow">Chapter 1. General Unix and Advanced C</a> من كتاب <a href="https://www.bottomupcs.com/index.xhtml" rel="external nofollow">Computer Science from the Bottom Up</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي:<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%B9%D8%AF-%D8%A7%D9%84%D8%AB%D9%86%D8%A7%D8%A6%D9%8A-binary-%D8%A3%D8%B3%D8%A7%D8%B3-%D8%A7%D9%84%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-r1658/" rel=""> تعرف على نظام العد الثنائي Binary أساس الحوسبة</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%AA%D8%AC%D8%B1%D9%8A%D8%AF-abstraction-%D9%81%D9%8A-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86-r1656/" rel="">مفهوم التجريد abstraction في أنظمة التشغيل وأهميته للمبرمجين</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AA%D8%AC%D8%B1%D9%8A%D8%AF-abstraction%C2%A0%D9%88%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-interfaces-%D9%88%D8%A7%D9%84%D8%B3%D9%85%D8%A7%D8%AA-traits-%D9%81%D9%8A-php-r317/" rel="">التجريد (Abstraction) والواجهات (Interfaces) والسمات (Traits) في PHP</a>
	</li>
	<li>
		النسخة العربية الكاملة لكتاب: <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">أنظمة التشغيل للمبرمجين</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1657</guid><pubDate>Wed, 17 Aug 2022 16:04:00 +0000</pubDate></item><item><title>&#x645;&#x641;&#x647;&#x648;&#x645; &#x627;&#x644;&#x62A;&#x62C;&#x631;&#x64A;&#x62F; abstraction &#x641;&#x64A; &#x623;&#x646;&#x638;&#x645;&#x629; &#x627;&#x644;&#x62A;&#x634;&#x63A;&#x64A;&#x644; &#x648;&#x623;&#x647;&#x645;&#x64A;&#x62A;&#x647; &#x644;&#x644;&#x645;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x646;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%AA%D8%AC%D8%B1%D9%8A%D8%AF-abstraction-%D9%81%D9%8A-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86-r1656/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_08/62f4daba5fc30_-----C-.jpg.ddda55f45a420ce7ed8b9d8c2daecdf4.jpg" /></p>
<p>
	مفهوم الملف هو تجريد abstraction مناسب إما كحوض للبيانات أو مصدر لها، وبالتالي هو تجريد ممتاز لجميع الأجهزة التي قد يوصلها المرء بالحاسوب. هذا الإدراك هو سر القوة العظيمة لنظام التشغيل يونيكس ويتجلى في مجمَل تصميم كامل المنصة. ويُعَدّ توفير تجريد الأجهزة هذا للمبرمج من الأدوار الرئيسية <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">لنظام التشغيل</a>.
</p>

<h2>
	كل شيء عبارة عن ملف
</h2>

<p>
	تُعَدّ مقولة كل شيء عبارة عن ملف مبدأً يُستمَد غالبًا من أنظمة يونكس Unix وما يشابهها مثل <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">لينكس linux</a> وبي إس دي BSD.
</p>

<p>
	لنتخيل ملفًا في إطار مألوف مثل معالج النصوص، إذ تكون العمليتان الأساسيتان اللتان نستطيع تنفيذهما على ملف في معالج النصوص التخيلي هذا كما يلي:
</p>

<ol>
	<li>
		قراءته، أي قراءة معالج النصوص البيانات الحالية المحفوظة.
	</li>
	<li>
		الكتابة ضمنه، أي كتابة المستخدِم بيانات جديدةً.
	</li>
</ol>

<p>
	لنستعرض بعض الطرفيات الشائعة الموصولة بالحاسوب، وما هو ارتباطها بالعمليات الأساسية على الملفات:
</p>

<ol>
	<li>
		الشاشة.
	</li>
	<li>
		لوحة المفاتيح.
	</li>
	<li>
		الطابعة.
	</li>
	<li>
		القرص المدمَج CD-ROM.
	</li>
</ol>

<p>
	تشبه كل من الشاشة والطابعة ملفًا للكتابة فقط، إذ تُعرَض المعلومات نقاطًا على الشاشة أو خطوطًا على الصفحة بدلًا من تخزينه على هيئة بِتّات على القرص؛ أما لوحة المفاتيح، فتُعَدّ مثل ملف للقراءة فقط، إذ ترد البيانات من ضغطات المستخدِم على المفاتيح، وكذلك الأمر بالنسبة للقرص المضغوط CD-ROM مثلًا، لكن تخزَّن البيانات مباشرةً على القرص بدلًا من أن يدخلها المستخدِم عشوائيًا.
</p>

<p>
	وبالتالي فإن مفهوم الملف هو تجريد abstraction مناسب إما لحوض البيانات أو مصدرها، لذا فهو تجريد ممتاز لجميع الأجهزة التي قد يوصلها المرء بالحاسوب، ويُعَدّ هذا الإدراك هو سر القوة العظيمة لنظام التشغيل يونيكس ويتجلى في مجمَل تصميم كامل المنصة، كما يُعَدّ توفير تجريد الأجهزة هذا للمبرمج من الأدوار الرئيسية لنظام التشغيل.
</p>

<p>
	ربما لا نبالغ عندما نقول أنّ التجريد هو المفهوم الأساسي الذي يدعم جميع أشكال الحوسبة الحديثة، إذ لا يمكن لشخص واحد فهم كل الأمور من <a href="https://academy.hsoub.com/design/user-interface/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-ui-%D9%88%D9%85%D8%AA%D8%AD%D9%83%D9%85%D8%A7%D8%AA%D9%87%D8%A7-r529/" rel="">تصميم واجهة مستخدِم</a> حديثةً إلى العمليات الداخلية لوحدة المعالجة المركزية CPU الحديثة، ناهيك عن بنائها بكاملها بأنفسهم؛ أما بالنسبة للمبرمجين، فالتجريد هو اللغة المشتركة التي تتيح لنا التعاون والابتكار.
</p>

<p>
	يمنحنا تعلّم التنقل بين التجريدات رؤيةً أعمق لطريقة استخدام التجريدات بأفضل الأساليب وأكثرها ابتكارًا، وسندرس في هذه السلسلة التجريدات في الطبقات الدنيا وبين التطبيقات ونظام التشغيل وبين نظام التشغيل والعتاد الصلب، كما توجد العديد من الطبقات الأعلى منها وكل منها تستحق التفرُّد بسلسلة خاصة بها، ونأمل منك اكتساب بعض الرؤى عن التجريدات التي يقدِّمها نظام التشغيل الحديث مع دراسة كل مقال من مقالات هذه السلسلة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="104985" href="https://academy.hsoub.com/uploads/monthly_2022_08/001abstraction.png.7fbe0859f44568f724fea9591d655d66.png" rel="" data-fileext="png"><img alt="001abstraction.png" class="ipsImage ipsImage_thumbnailed" data-fileid="104985" data-unique="otkklqq10" src="https://academy.hsoub.com/uploads/monthly_2022_08/001abstraction.png.7fbe0859f44568f724fea9591d655d66.png"></a>
</p>

<p style="text-align: center;">
	(صورة توضح مفهوم التجريد)
</p>

<h2>
	تطبيق التجريد
</h2>

<p>
	يُطبَّق التجريد عمومًا بما يسمى <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-api%D8%9F-r1512/" rel="">واجهة برمجة التطبيق <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a>، ويُعَدّ <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> مصطلحًا مبهمًا نوعًا ما، إذ يشير إلى أمور مختلفة حسب سياقات الأعمال البرمجية المتنوعة،يصمم المبرمج في الأساس مجموعة دوال functions، ويُوثِّق واجهتها ووظيفتها حسب مبدأ أن التنفيذ الفعلي الذي يزوده بواجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> يكون مخفيًا.
</p>

<p>
	تقدِّم العديد من تطبيقات الويب على سبيل المثال <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">واجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a> يمكن الوصول إليها عن طريق <a href="https://academy.hsoub.com/programming/general/%d9%85%d8%af%d8%ae%d9%84-%d8%a5%d9%84%d9%89-http-r73/" rel="">بروتوكول HTTP</a>، ويطلق الوصول إلى البيانات بهذه الطريقة عدة سلاسل معقدة من استدعاءات الإجراءات البعيدة remote procedure calls واستعلامات قاعدة البيانات database queries وعمليات نقل البيانات data transfers، وتكون جميعها غير مرئية بالنسبة للمستخدِم النهائي الذي يتلقى البيانات المقتضبة ببساطة.
</p>

<p>
	سيألف الذين هم على دراية باللغات البرمجية كائنية التوجه object-oriented مثل <a href="https://academy.hsoub.com/programming/java/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D9%84%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-java-r599/" rel="">جافا Java</a> أو <a href="https://academy.hsoub.com/programming/python/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r211/" rel="">بايثون Python</a> أو <a href="https://academy.hsoub.com/programming/cpp/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-c-r802/" rel="">++C</a> مفهوم التجريد في الأصناف classes، إذ تزِّود التوابع methods الصنف بالواجهة لكنها تجرِّد التنفيذ.
</p>

<h3>
	تطبيق التجريد بلغة البرمجة C
</h3>

<p>
	تُعَدّ مؤشرات الدالة function pointers منهجيةً شائعةً تُستخدَم في نواة نظام تشغيل لينكس وغيرها من الشيفرات البرمجية الأساسية المكتوبة بلغة C والتي لا يكون مفهوم كائنية التوجه مدمجًا فيها، كما يُعَدّ فهم هذا المصطلح أمرًا رئيسيًا لقراءة معظم الشيفرات البرمجية الأساسية المكتوبة بلغة C، إذ يمكّنك فهم طريقة قراءة التجريدات الموجودة ضمن الشيفرة البرمجية من تكوين فكرة عن تصاميم واجهات <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> الداخلية.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9638_15" style=""><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">

</span><span class="com">/* الواجهة البرمجية التي سننفذها */</span><span class="pln">
</span><span class="kwd">struct</span><span class="pln"> greet_api
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">int</span><span class="pln"> </span><span class="pun">(*</span><span class="pln">say_hello</span><span class="pun">)(</span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*</span><span class="pln">name</span><span class="pun">);</span><span class="pln">
    </span><span class="typ">int</span><span class="pln"> </span><span class="pun">(*</span><span class="pln">say_goodbye</span><span class="pun">)(</span><span class="kwd">void</span><span class="pun">);</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="pun">‫</span><span class="com">/* تطبيق دالة hello */</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> say_hello_fn</span><span class="pun">(</span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*</span><span class="pln">name</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"Hello %s\n"</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">‫</span><span class="com">/* تطبيق دالة goodbye */</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> say_goodbye_fn</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"Goodbye\n"</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/* بنية لتنفيذ الواجهة البرمجية*/</span><span class="pln">
</span><span class="kwd">struct</span><span class="pln"> greet_api greet_api </span><span class="pun">=</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">say_hello </span><span class="pun">=</span><span class="pln"> say_hello_fn</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">say_goodbye </span><span class="pun">=</span><span class="pln"> say_goodbye_fn
</span><span class="pun">};</span><span class="pln">

</span><span class="pun">‫</span><span class="com">/* لا تحتاج الدالة main()‎ معرفة أيّ شيء عن آلية عمل
‫* say_hello/goodbye، فهي لا تعلم إلا أنها تعمل*/</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> main</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> argc</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*</span><span class="pln">argv</span><span class="pun">[])</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    greet_api</span><span class="pun">.</span><span class="pln">say_hello</span><span class="pun">(</span><span class="pln">argv</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]);</span><span class="pln">
    greet_api</span><span class="pun">.</span><span class="pln">say_goodbye</span><span class="pun">();</span><span class="pln">

    printf</span><span class="pun">(</span><span class="str">"%p, %p, %p\n"</span><span class="pun">,</span><span class="pln"> greet_api</span><span class="pun">.</span><span class="pln">say_hello</span><span class="pun">,</span><span class="pln"> say_hello_fn</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">say_hello_fn</span><span class="pun">);</span><span class="pln">

    exit</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تُعَدّ هذه الشيفرة البرمجية بأنها أبسط نموذج عن البنى التي يتكرر استخدامها في جميع أجزاء نواة لينكس والبرامج الأخرى المبنية على اللغة C، ولنلقِ نظرةً على بعض العناصر المحددة.
</p>

<p>
	نبدأ بالبنية التي تحدِّد الواجهة البرمجية <code>struct greet_api</code>، فالدوال التي أحيطت أسمائها بأقواس مع محدد المؤشر pointer marker تصف مؤشر الدالة، إذ يصف مؤشر الدالة النموذج الأولي للدالة التي يجب أن يشير إليها، كما سيؤدي توجيهه إلى دالة دون إضافة النوع المُعاد return type الصحيح أو المعاملات الصحيحة على الأقل إلى توليد تحذير من المصرِّف، وإذا تركته في الشيفرة البرمجية، فيحتمل أن يؤدي إلى تنفيذ عملية خاطئة أو أعطال، لذلك إذ ستجد غالبًا أنّ أسماء المعامِلات parameters قد حُذفت ولم يُحدَّد إلا نوع المعامِل، ويتيح هذا للمنفذ تحديد أسماء المعامِلات لتجنب ورود تحذيرات من المصرِّف.
</p>

<p>
	سنتناول الآن تنفيذ الواجهة البرمجية، إذ ستجد عادةً في الدوال الأعقد مصطلحًا يدل على أنّ دوال تنفيذ الواجهة البرمجية هي عبارة عن غلاف حول الدوال الأخرى التي تكون عادةً مسبوقةً بشرطة سفلية أو اثنتين، إذ ستستدعي الدالة <code>()say_hello_fn</code> دالةً أخرى <code>()say_hello_function_</code> على سبيل المثال، ولهذه عدة استخدامات، إذ نستخدمها عمومًا لنحظى بأجزاء أبسط وأصغر من الواجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> -في تنظيم الوسائط arguments أو التحقق منها مثلًا- منفصلةً عن عملية التنفيذ الأعقد، ويسهّل هذا غالبًا المسار إلى تحقيق تغييرات ملموسة في العمليات الداخلية مع ضمان بقاء الواجهة ثابتة، إلا أنّ عملية التنفيذ هنا بسيطة جدًا ولا تحتاج حتى إلى دوال داعمة خاصة بها، كما يختلف مدلول بادئات الدالة التي تكون شرطة سفلية واحدة <code>_</code> أو مزدوجة <code>__</code> أو حتى ثلاثية <code>___</code> باختلاف المشاريع، لكنها عمومًا تُعَدّ تحذيرًا مرئيًا بأنه لا يُفترَض استدعاء الدالة مباشرةً من خارج الواجهة.
</p>

<p>
	<strong>ملاحظة</strong>: قد يُشار إلى دالة الشرطة السفلية المزدوجة <code>‎__‎foo‎</code> في المحادثات بالتابع السحري dunder foo وتكون فو foo مثل س أو ص في الجبر.
</p>

<p>
	نملأ مؤشرات الدالة في المرحلة ما قبل الأخيرة في <code>struct greet_api greet_api</code>، إذ يُعَدّ اسم الدالة مؤشرًا، لذا لا حاجة لأخذ عنوان الدالة مثل <code>say_hello_fn&amp;</code>، وأخيرًا يمكننا استدعاء دوال واجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> ضمن بنية <code>main</code>.
</p>

<p>
	ستلاحظ هذا المصطلح باستمرار عند تصفحك الشيفرة المصدرية source code،ـ ويمكن أن نوضح ذلك في هذا المثال البسيط الذي اجتزأناه من الملف include/linux/virtio.h في الشيفرة المصدرية لنواة نظام لينكس:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9638_17" style=""><span class="pln"> </span><span class="com">/**
 * virtio_driver - operations for a virtio I/O driver
 * @driver: underlying device driver (populate name and owner).
 * @id_table: the ids serviced by this driver.
 * @feature_table: an array of feature numbers supported by this driver.
 * @feature_table_size: number of entries in the feature table array.
 * @probe: the function to call when a device is found.  Returns 0 or -errno.
 * @remove: the function to call when a device is removed.
 * @config_changed: optional function to call when the device configuration
 *    changes; may be called in interrupt context.
 */</span><span class="pln">
</span><span class="kwd">struct</span><span class="pln"> virtio_driver </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">struct</span><span class="pln"> device_driver driver</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> virtio_device_id </span><span class="pun">*</span><span class="pln">id_table</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">unsigned</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="pun">*</span><span class="pln">feature_table</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">unsigned</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> feature_table_size</span><span class="pun">;</span><span class="pln">
        </span><span class="typ">int</span><span class="pln"> </span><span class="pun">(*</span><span class="pln">probe</span><span class="pun">)(</span><span class="kwd">struct</span><span class="pln"> virtio_device </span><span class="pun">*</span><span class="pln">dev</span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">(*</span><span class="pln">scan</span><span class="pun">)(</span><span class="kwd">struct</span><span class="pln"> virtio_device </span><span class="pun">*</span><span class="pln">dev</span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">(*</span><span class="pln">remove</span><span class="pun">)(</span><span class="kwd">struct</span><span class="pln"> virtio_device </span><span class="pun">*</span><span class="pln">dev</span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">(*</span><span class="pln">config_changed</span><span class="pun">)(</span><span class="kwd">struct</span><span class="pln"> virtio_device </span><span class="pun">*</span><span class="pln">dev</span><span class="pun">);</span><span class="pln">
</span><span class="com">#ifdef</span><span class="pln"> CONFIG_PM
        </span><span class="typ">int</span><span class="pln"> </span><span class="pun">(*</span><span class="pln">freeze</span><span class="pun">)(</span><span class="kwd">struct</span><span class="pln"> virtio_device </span><span class="pun">*</span><span class="pln">dev</span><span class="pun">);</span><span class="pln">
        </span><span class="typ">int</span><span class="pln"> </span><span class="pun">(*</span><span class="pln">restore</span><span class="pun">)(</span><span class="kwd">struct</span><span class="pln"> virtio_device </span><span class="pun">*</span><span class="pln">dev</span><span class="pun">);</span><span class="pln">
</span><span class="com">#endif</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	كل المطلوب هو أن نفهم فهمًا سطحيًا أنّ هذه البنية هي وصف لجهاز الإدخال والإخراج I/O الافتراضي، ونلاحظ أن المتوقَّع من مستخدِم واجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> هذه -أي كاتب تعريف الجهاز device driver- هو تقديم عدد من الدوال التي ستُستدعَى في شروط مختلفة أثناء تشغيل النظام، أي عند تقصّي عتاد جديد hardware أو عند إزالة عتاد ما، …إلخ على سبيل المثال، كما يحتوي على مجموعة بيانات، وهي البُنى التي يجب تعبئتها بالبيانات المرتبطة بها، كما يُعَدّ البدء بعناصر توصيف مثل هذه أسهل طريقة لبدء فهم الطبقات المختلفة لشيفرة النواة البرمجية.
</p>

<h3>
	المكتبات
</h3>

<p>
	تؤدي المكتبات دورَين يوضحان التجريد، هما:
</p>

<ul>
	<li>
		تتيح للمبرمجين إعادة استخدام الشيفرة البرمجية المتاح الوصول إليها عمومًا.
	</li>
	<li>
		تؤدي دور الصندوق الأسود في تنفيذ الخصائص الوظيفية عن المبرمج.
	</li>
</ul>

<p>
	تختص المكتبة التي تنفذ الوصول إلى البيانات غير المعالَجة في الملفات على سبيل المثال بلاحقة JPEG بميزة تتيح للعديد من البرامج التي ترغب في الوصول إلى ملفات الصور استخدام المكتبة نفسها، كما لا يضطر المبرمجون الذين يبرمجون هذه البرامج إلى الانشغال بالتفاصيل الدقيقة لصيغة الملف JPEG، وإنما يركزون جهودهم على دور الصورة أو موضعها في البرنامج.
</p>

<p>
	يشار إلى المكتبة القياسية في منصة يونكس باسم <code>libc</code> عمومًا، ومهمتها توفير الواجهة الأساسية للنظام، والاستدعاءات الأساسية مثل <code>()read</code> و <code>()write</code> و <code>()printf</code>، كما توصَف واجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> هذه بمجملها بتوصيف يسمى بوزيكس POSIX، وهي متاحة مجانًا على الإنترنت وتصف العديد من الاستدعاءات التي تؤلف واجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> القياسية في نظام يونكس.
</p>

<p>
	تتبع معظم منصات يونكس عمومًا معايير بوزيكس، مع وجود بعض الفروقات الطفيفة التي تكون مهمةً أحيانًا (وهذا ما يفسر تعقيد أنظمة بناء غنو Gnu autotools المختلفة، التي تحاول دومًا إخفاء هذه الفروقات عنك). يحتوي نظام لينوكس على العديد من الواجهات التي لا تتبع معايير بوزيكس، لذا فإن بناء تطبيقات تستخدم هذه الواجهات دون غيرها لن يجعل تطبيقك محمولًا portable بما يكفي.
</p>

<p>
	تُعّدّ المكتبات تجريدًا أساسيًا يضم الكثير من التفاصيل، وسنتناول في فصول لاحقة آلية عمل المكتبات بالتفصيل.
</p>

<p>
	ترجمة -وبتصرّف- للقسم <a href="https://www.bottomupcs.com/chapter00.xhtml" rel="external nofollow">Everything is a file!‎</a> والقسم <a href="https://www.bottomupcs.com/abstration.xhtml" rel="external nofollow">Implementing abstraction</a> من الفصل <a href="https://www.bottomupcs.com/chapter00.xhtml" rel="external nofollow">Chapter 1. General Unix and Advanced C</a> من كتاب <a href="https://www.bottomupcs.com/index.xhtml" rel="external nofollow">Computer Science from the Bottom Up</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%81%D9%87%D9%88%D9%85-%D9%88%D8%A7%D8%B5%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-descriptors-%D9%88%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7%D9%87%D8%A7-%D8%A8%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%AC%D8%B1%D9%8A%D8%AF-%D9%81%D9%8A-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-r1657/" rel="">مفهوم واصفات الملفات File Descriptors وارتباطها بعملية التجريد في أنظمة التشغيل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AA%D8%AC%D8%B1%D9%8A%D8%AF-abstraction%C2%A0%D9%88%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-interfaces-%D9%88%D8%A7%D9%84%D8%B3%D9%85%D8%A7%D8%AA-traits-%D9%81%D9%8A-php-r317/" rel="">التجريد (Abstraction) والواجهات (Interfaces) والسمات (Traits) في PHP</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/advanced/%D9%86%D9%85%D8%B7-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%85%D8%B9%D9%85%D9%84-%D8%A7%D9%84%D8%AA%D8%AC%D8%B1%D9%8A%D8%AF-abstract-factory-r504/" rel="">نمط التصميم معمل التجريد Abstract Factory</a>
	</li>
	<li>
		النسخة العربية الكاملة لكتاب: <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">أنظمة التشغيل للمبرمجين</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1656</guid><pubDate>Fri, 12 Aug 2022 16:06:00 +0000</pubDate></item><item><title>&#x62C;&#x648;&#x644;&#x629; &#x641;&#x64A; &#x646;&#x638;&#x627;&#x645; &#x62A;&#x634;&#x63A;&#x64A;&#x644; &#x631;&#x627;&#x633;&#x628;&#x64A;&#x631;&#x64A; &#x628;&#x627;&#x64A;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%AC%D9%88%D9%84%D8%A9-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r2079/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/----.png.e74289749d5cf2bf5f9a23fa121bbcad.png" /></p>
<p>
	سنشرح في هذا الفيديو عن كيفية استخدام نظام تشغيل Raspberry Pi OS أو كما هو معروف باسم راسبيان، وسنتعرف على أهم برمجيات هذا النظام وكيفية تشغيل كل برنامج من هذه البرامج.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="603" id="ips_uid_3269_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="جولة في نظام تشغيل راسبيري باي" width="1072" data-embed-src="https://www.youtube.com/embed/ZxkJsEtDLzw"></iframe>
</p>

<p>
	إذا أردت التعرف أكثر على أنظمة التشغيل والحاسوب، فننصحك بالانضمام إلى <a href="https://academy.hsoub.com/learn/computer-science/" rel="">دورة علوم الحاسوب</a>، ولا تنسَ الاستعانة خلال رحلة تعلمك وعملك بتوثيقات <a href="https://wiki.hsoub.com/%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" rel="external">موسوعة حسوب</a> المجانية. وإذا أردت متابعة المعلومات البرمجية العلمية مكتوبة فيمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/" rel="">قسم البرمجة في أكاديمية حسوب</a>، كما يمكنك متابعة جديد الفيديوهات التقنية المتاحة على <a href="https://www.youtube.com/@HsoubAcademy" rel="external nofollow">يوتيوب أكاديمية حسوب</a> مجانًا.
</p>
]]></description><guid isPermaLink="false">2079</guid><pubDate>Tue, 09 Aug 2022 15:00:00 +0000</pubDate></item><item><title>&#x62A;&#x62C;&#x645;&#x64A;&#x639; &#x631;&#x627;&#x633;&#x628;&#x64A;&#x631;&#x64A; &#x628;&#x627;&#x64A; &#x648;&#x627;&#x644;&#x62A;&#x62D;&#x636;&#x64A;&#x631; &#x644;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645;&#x647;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AC%D9%85%D9%8A%D8%B9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%88%D8%A7%D9%84%D8%AA%D8%AD%D8%B6%D9%8A%D8%B1-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-r2078/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/------.png.7b5bb2953d9d79e1996afc49783825a3.png" /></p>
<p>
	ستتعلم خلال هذا الفيديو كيفية تجميع أجزاء حاسوب راسبيري باي raspberry pi والأدوات اللازمة لتشغيله، كما ستتعلم كيفية تنزيل نظام تشغيل راسبيان Raspbian على حاسوب راسبيري باي، وذلك من منصة راسبيري مباشرةً.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="603" id="ips_uid_9524_6" src="https://academy.hsoub.com/applications/core/interface/index.html" title="تجميع راسبيري باي والتحضير لاستعماله" width="1072" data-embed-src="https://www.youtube.com/embed/Rtrihe6lwJ8"></iframe>
</p>

<p>
	إذا أردت التعرف أكثر على أنظمة التشغيل والحاسوب، فننصحك بالانضمام إلى <a href="https://academy.hsoub.com/learn/computer-science/" rel="">دورة علوم الحاسوب</a>، ولا تنسَ الاستعانة خلال رحلة تعلمك وعملك بتوثيقات <a href="https://wiki.hsoub.com/%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" rel="external">موسوعة حسوب</a> المجانية. وإذا أردت متابعة المعلومات البرمجية العلمية مكتوبة فيمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/" rel="">قسم البرمجة في أكاديمية حسوب</a>، كما يمكنك متابعة جديد الفيديوهات التقنية المتاحة على <a href="https://www.youtube.com/@HsoubAcademy" rel="external nofollow">يوتيوب أكاديمية حسوب</a> مجانًا.
</p>
]]></description><guid isPermaLink="false">2078</guid><pubDate>Mon, 01 Aug 2022 15:00:00 +0000</pubDate></item><item><title>&#x623;&#x62F;&#x627;&#x629; &#x627;&#x644;&#x62A;&#x647;&#x64A;&#x626;&#x629; &#x641;&#x64A; &#x631;&#x627;&#x633;&#x628;&#x64A;&#x631;&#x64A; &#x628;&#x627;&#x64A;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D8%AF%D8%A7%D8%A9-%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D9%81%D9%8A-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1621/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_06/62bc2d442f469_------.png.531c2382a1fa470f6ed627e72b224d6e.png" /></p>

<p>
	تُعد أداة التهيئة في راسبيري باي حزمةً برمجيةً فعالةً لضبط كثيرٍ من الإعدادات على <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AC%D9%87%D8%A7%D8%B2-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi-r1356/" rel="">جهاز راسبيري باي</a>، ابتداءً من الواجهات المتوفرة في الجهاز وصولًا إلى البرامج والتحكُّم بها عبر الشبكات الحاسوبية. قد يصعُب ضبط الإعدادات المختلفة على المستخدمين الجدد، لذلك سيأخذ هذا الملحق بيدك خطوةً خطوة في كل شرح كل إعداد وبيان الغاية منه. تستطيع تحميل الأداة من قائمة راسبيري باي ضمن فئة "التفضيلات Preferences"، أو من خلال واجهة سطر الأوامر بكتابة الأمر التالي في نافذة برنامج "الطرفية Terminal":
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9711_10" style="">
<span class="pln">raspi</span><span class="pun">-</span><span class="pln">config</span></pre>

<p>
	ستجد اختلافًا بين طريقتي عرض النسخة الرسومية لأداة التهيئة ونسخة واجهة سطر الأوامر، إذ ستظهر الخيارات في فئات مختلفة. سيعتمد هذا الملحق على النسخة الرسومية.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>تحذير:</strong> يُفضّل عدم استخدام أداة تهيئة راسبيري باي، إذا لم تعرف تمامًا ما الإعداد الذي تحتاج إلى تغييره؛ فعندما تضيف إلى باي تجهيزات جديدة مثل تجهيزة هات للصوت audio HAT أو تجهيزة كاميرا، فسترشدك التعليمات إلى الإعدادات التي ينبغي تغييرها، لذلك اترك الاعدادات عمومًا كما هي.
		</p>
	</div>
</blockquote>

<h2>
	نافذة النظام
</h2>

<p>
	تضم نافذة النظام System tab خيارات تتحكم بمجموعة الإعدادات التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="102269" href="https://academy.hsoub.com/uploads/monthly_2022_06/system_tab_01.png.8cbf3753e6bfd3235740c7ec00fd97d3.png" rel=""><img alt="system_tab_01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="102269" data-unique="i5u2rop3g" src="https://academy.hsoub.com/uploads/monthly_2022_06/system_tab_01.png.8cbf3753e6bfd3235740c7ec00fd97d3.png" style="width: 550px; height: auto;"></a>
</p>

<ul>
<li>
		<strong>كلمة المرور Password</strong>: انقر على الزر "تغيير كلمة المرور Change Password" لاختيار كلمة مرور جديدة للمستخدم الحالي (المستخدم 'pi' هو المستخدم الافتراضي).
	</li>
	<li>
		<strong>اسم المضيف Hostname</strong>: وهو الاسم الذي يعرِّف به باي نفسه على الشبكات، إذ ينبغي أن يمتلك كل جهاز باي اسمًا فريدًا إن كان هناك عدة أجهزة على نفس الشبكة.
	</li>
	<li>
		<strong>واجهة الإقلاع Boot</strong>: سيقلع باي وصولًا إلى "سطح المكتب Desktop" بالوضع الافتراضي للإعداد، ويمكن اختيار "To CLI" للإقلاع وصولًا إلى واجهة سطر الأوامر التي شرحناها في الملحق "C".
	</li>
	<li>
		<strong>تسجيل دخول تلقائي Auto Login</strong>: عندما يكون الخيار "مثل مستخدم حالي As current user" مفعلًا (وهو مفعلٌ افتراضيًا)، سيحمّل راسبيان سطح المكتب دون طلب اسم المستخدم وكلمة المرور.
	</li>
	<li>
		<strong>التحقق من الاتصال بالشبكة عند الإقلاع Network Boot</strong>: إذا كان الخيار "انتظار شبكة الاتصال wait for network" مفعلًا، فلن يُحمّل راسبيان سطح المكتب حتى يضمن وجود اتصال بالشبكة.
	</li>
	<li>
		<strong>شاشة مؤقتة Splash Screen</strong>: عندما يُفعَّل هذا الخيار، تختفي رسائل إقلاع <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AC%D9%88%D9%84%D8%A9-%D9%81%D9%8A-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%A7%D9%86-%D9%86%D8%B8%D8%A7%D9%85-%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1371/" rel="">راسبيان</a> خلف شاشة رسومية مؤقتة.
	</li>
	<li>
		<strong>فيديو باي 4 Pi 4 Video</strong>: يُتاح هذا الإعداد في النموذج Pi 4 ويعطيك القدرة على تبديل مخرج الفيديو، إذ يمكِّنك الخيار "4K HDMI" من بث الفيديوهات بدقة "4K" عبر أحد منفذي micro أو HDMI أو كلاهما؛ بينما يمكِّن الخيار "تماثلي Analog" عرض الفيديوهات المركبة composite video عبر منفذ الفيديو 3.5 مم، ويُعد هذا الخيار جيدًا إذا كان لديك شاشة أو تلفاز قديم ليس له منفذ HDMI. لا يُفعّل افتراضيًا أيًا من الخيارين السابقين وتُعرض الفيديوهات بدقة 1080p عبر منافذ micro أو HDMI. انتبه إلى أنّ تفعيل الخيار "4K" سيزيد من استهلاك الطاقة والحمل على وحدة المعالجة المركزية CPU ووحدة معالجة الرسوميات GPU، لذلك من الأفضل إلغاء تفعيل هذا الخيار إذا لم تكن بحاجته حاجةً ماسةً لتوجيه موارد الجهاز لمهامٍ أخرى.
	</li>
</ul>
<h2>
	نافذة الواجهات
</h2>

<p>
	وتضم الإعدادات التي تتحكم بواجهات العتاد الصلب المتوفرة على باي، وهي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="102266" href="https://academy.hsoub.com/uploads/monthly_2022_06/interface_tab_02.png.19ee7662774f5a19a4cea9137b657012.png" rel=""><img alt="interface_tab_02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="102266" data-unique="1vikjpxeh" src="https://academy.hsoub.com/uploads/monthly_2022_06/interface_tab_02.png.19ee7662774f5a19a4cea9137b657012.png" style="width: 550px; height: auto;"></a>
</p>

<ul>
<li>
		<strong>الكاميرا Camera</strong>: يمكّن أو يعطّل واجهة الكاميرا التسلسلية Camera Serial Interface -أو اختصارًا CSI-، للتعامل مع تجهيزة كاميرا راسبيري باي.
	</li>
	<li>
		<strong><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></strong>: يمكّن أو يعطّل واجهة المفسر المؤمّنة Secure Shell Interface، والتي تسمح بتشغيل واجهة سطر الأوامر على باي من حاسوب آخر على الشبكة باستخدام عميل <a href="https://academy.hsoub.com/devops/security/ssh/%D8%A3%D9%86%D9%81%D8%A7%D9%82-ssh%D8%8C-%D9%85%D8%A7%D9%87%D9%8A%D8%AA%D9%87%D8%A7-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D9%87%D8%A7-r76/" rel=""><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></a>.
	</li>
	<li>
		<strong>VCN</strong>: يمكّن أو يعطّل واجهة الشبكة الافتراضية Virtual Network Computing، والتي تسمح لك باستعراض الواجهة الرسومية لسطح مكتب باي من حاسوب آخر على الشبكة باستخدام عميل VCN.
	</li>
	<li>
		<strong>SPI</strong>: يمكّن أو يعطّل واجهة الطرفيات التسلسلية Serial Peripheral Interface، التي تُستخدم للتحكم ببعض التجهيزات المتصلة بالمنصة GPIO.
	</li>
	<li>
		<strong>I2C</strong>: يمكّن أو يعطّل <a href="https://ar.wikipedia.org/wiki/%D9%85%D9%85%D8%B1_%D9%86%D8%A7%D9%82%D9%84_%D8%A8%D9%8A%D9%86_%D8%A7%D9%84%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA_%D8%A7%D9%84%D9%85%D8%AA%D9%83%D8%A7%D9%85%D9%84%D8%A9" rel="external nofollow">الممر الناقل بين الدارات المتكاملة</a> Inter-Integrated Circuit التي تُستخدم للتحكم ببعض التجهيزات المتصلة بمنصة GPIO.
	</li>
	<li>
		<strong>المنفذ التسلسلي Serial Port</strong>: يمكّن أو يعطّل المنفذ التسلسلي Serial port الخاص براسبيري باي والمُتاح عبر المنصة GPIO.
	</li>
	<li>
		<strong>واجهة سطر الأوامر التسلسلية Serial Console</strong>: تمكّن أو تعطّل واجهة الأوامر التسلسلية المتاحة للمنفذ التسلسلي، ويمكن تعديل هذا الإعداد عند تمكين الإعداد Serial Port.
	</li>
	<li>
		<strong>1-Wire</strong>: يمكّن أو يعطّل الواجهة 1-Wire التي تُستخدم للتحكم ببعض التجهيزات المتصلة بمنصة GPIO.
	</li>
	<li>
		<strong>Remote GPIO</strong>: تمكّن أو تعطّل خدمة شبكة تسمح بالتحكم بمنصة GPIO لحاسوب باي من حاسوب آخر على الشبكة باستخدام المكتبة <a href="https://gpiozero.readthedocs.io/" rel="external nofollow">GPIO Zero</a>.
	</li>
</ul>
<h2>
	نافذة الأداء
</h2>

<p>
	وتضم الإعدادات التي تتحكم بحجم الذاكرة المتاحة وسرعة عمل المعالج.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="102268" href="https://academy.hsoub.com/uploads/monthly_2022_06/performance_tab_03.png.6c31c3022d176852f2ba72387417d8d3.png" rel=""><img alt="performance_tab_03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="102268" data-unique="zyxkl6jn5" src="https://academy.hsoub.com/uploads/monthly_2022_06/performance_tab_03.png.6c31c3022d176852f2ba72387417d8d3.png" style="width: 550px; height: auto;"></a>
</p>

<ul>
<li>
		<strong>رفع تردد التشغيل Overclock</strong>: يتيح لك هذا الإعداد جملةً من الخيارات التي تزيد أداء باي لكنه بالمقابل يزيد من استهلاك الطاقة والحرارة واحتمال قصر عمر التجهيزة؛ وهو غير متاح في كل نماذج باي.
	</li>
	<li>
		<strong>ذاكرة وحدة المعالجة الرسومية GPU Memory</strong>: وتتيح لك ضبط حجم الذاكرة المخصص للاستخدام من قبل معالج رسوميات باي. قد تزيد الذاكرة التي تزيد عن 128 ميغا بايت (افتراضية) الأداء أثناء تصيير الرسوميات ثلاثية الأبعاد والمهام الإعتيادية لوحدة معالجة الرسوميات للأغراض العامة general-purpose GPU -أو اختصارًا GPGPU-، على حساب الذاكرة المخصصة لنظام التشغيل راسبيان؛ بينما يحسِّن تخفيض الذاكرة المخصصة للرسوميات أداء بعض المهام الحساسة للذاكرة على حساب انخفاض أداء تصيير الرسوميات ثلاثية الأبعاد والكاميرا وبعض ميزات عرض الفيديوهات التي قد تصبح غير متاحة.
	</li>
</ul>
<h2>
	نافذة إعدادات الموقع الجغرافي
</h2>

<p>
	وتضم الإعدادات التي تتحكم بالمنطقة الجغرافية التي صّممت باي لتعمل ضمنها بما في ذلك إعدادات لوحة المفاتيح.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="102267" href="https://academy.hsoub.com/uploads/monthly_2022_06/locale_tab_04.png.8f1e40cc881504709ff1cf9ae83f6076.png" rel=""><img alt="locale_tab_04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="102267" data-unique="asr9by5sb" src="https://academy.hsoub.com/uploads/monthly_2022_06/locale_tab_04.png.8f1e40cc881504709ff1cf9ae83f6076.png" style="width: 550px; height: auto;"></a>
</p>

<ul>
<li>
		<strong>محلي Locale</strong>: يسمح لك باختيار موقعك، وهو إعدادٌ يتعلق بالنظام نفسه ويضبط اللغة والبلد ومجموعات المحارف. انتبه إلى أنّ تغيير اللغة في هذا الإعداد سيؤثر فقط على لغة التطبيقات التي تتوفر ترجمةً لها إلى اللغة المختارة.
	</li>
	<li>
		<strong>المنطقة الزمنية TimeZone</strong>: ويتيح لك اختيار منطقتك الزمنية وذلك بانتقاء منطقة من العالم يليها اختيار أقرب مدينة إليك. إذا اتصلت باي بالانترنت وعرضت الساعة توقيتًا خاطئًا، يكون السبب عادةً اختيار منطقة زمنية خاطئة.
	</li>
	<li>
		<strong>لوحة المفاتيح Keyboard</strong>: يتيح لك اختيار نمط لوحة المفاتيح ولغتها ومخطط محارفها؛ فإذا لاحظت أن لوحة المفاتيح تطبع حروفًا أو رموزًا خاطئةً، يمكن تصحيحها من خلال هذا الإعداد.
	</li>
	<li>
		<strong>البلد الذي تستخدم فيه WIFI</strong>: ويسمح لك باختيار البلد لأغراض تنظيم استخدام أمواج الراديو للاتصال اللاسلكي. احرص على اختيار البلد الذي تستخدم فيه باي، فاختيارك لبلد آخر قد يُفقدك القدرة على الاتصال بنقاط الوصول اللاسلكية المجاورة التي قد تخضع لقوانين البث اللاسلكي. إذًا، من الأفضل اختيار البلد قبل محاولة الاتصال <a href="https://academy.hsoub.com/devops/networking/%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D9%84%D8%A7%D8%B3%D9%84%D9%83%D9%8A%D8%A9-wireless-networks-%D9%88%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-access-networks-r492/" rel="">بالشبكات اللاسلكية</a>.
	</li>
</ul>
<p>
	ترجمة -وبتصرف- للملحق The Raspberry Pi Configuration Tool من كتاب <a href="https://www.raspberrypi.org/magpi-issues/Beginners_Guide_v2.pdf" rel="external nofollow">The Official Raspberry Pi Beginner's Guide</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%B3%D8%B7%D8%B1-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%A7%D9%86-%D9%81%D9%8A-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1620/" rel="">واجهة سطر أوامر راسبيان في راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AC%D9%85%D9%8A%D8%B9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%88%D8%A7%D9%84%D8%AA%D8%AD%D8%B6%D9%8A%D8%B1-%D9%84%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84%D9%87-r1370/" rel="">تجميع راسبيري باي والتحضير لاستعماله</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-raspberry-pi-%D9%84%D9%84%D8%B9%D9%85%D9%84-r1417/" rel="">إعداد Raspberry Pi للعمل</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1621</guid><pubDate>Wed, 29 Jun 2022 10:58:40 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x631;&#x627;&#x633;&#x628;&#x631;&#x64A; &#x628;&#x627;&#x64A; Raspberry Pi</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%B1%D8%A7%D8%B3%D8%A8%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi-r2077/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/-----.png.78a89cf44adee5a08b16dff47a6ea39f.png" /></p>
<p>
	هذا الفيديو سيكون مدخل لك للتعرف على راسبيري باي raspberry pi، الحاسوب الصغير الذي لا يتجاوز حجمه بطاقة الائتمان، والذي نتعرف خلاله على أقسام ونظام تشغيل راسبيري باي، وسيكون هذا الفيديو مدخل إلى سلسلة من الفيديوهات تعلمك كيفية برمجة وصناعة روبوتك الخاص باستخدام هذا الحاسوب.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="603" id="ips_uid_7316_6" src="https://academy.hsoub.com/applications/core/interface/index.html" title="التعرف على راسبري باي Raspberry Pi" width="1072" data-embed-src="https://www.youtube.com/embed/mCuK-trw_ZI"></iframe>
</p>

<p>
	إذا أردت التعرف أكثر على أنظمة التشغيل والحاسوب، فننصحك بالانضمام إلى <a href="https://academy.hsoub.com/learn/computer-science/" rel="">دورة علوم الحاسوب</a>، ولا تنسَ الاستعانة خلال رحلة تعلمك وعملك بتوثيقات <a href="https://wiki.hsoub.com/%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" rel="external">موسوعة حسوب</a> المجانية. وإذا أردت متابعة المعلومات البرمجية العلمية مكتوبة فيمكنك الاطلاع على <a href="https://academy.hsoub.com/programming/" rel="">قسم البرمجة في أكاديمية حسوب</a>، كما يمكنك متابعة جديد الفيديوهات التقنية المتاحة على <a href="https://www.youtube.com/@HsoubAcademy" rel="external nofollow">يوتيوب أكاديمية حسوب</a> مجانًا.
</p>
]]></description><guid isPermaLink="false">2077</guid><pubDate>Tue, 26 Jul 2022 15:00:00 +0000</pubDate></item><item><title>&#x628;&#x631;&#x645;&#x62C; &#x62E;&#x648;&#x627;&#x631;&#x632;&#x645;&#x64A;&#x62A;&#x643; &#x627;&#x644;&#x623;&#x648;&#x644;&#x649; &#x639;&#x628;&#x631; &#x633;&#x643;&#x631;&#x627;&#x62A;&#x634; Scratch</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D8%B1%D9%85%D8%AC-%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%AA%D9%83-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%89-%D8%B9%D8%A8%D8%B1-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-scratch-r1619/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_06/62bae5017f212_-----scratch.png.3f03e9b925305eab992cc16591ad37c3.png" /></p>

<p>
	ازداد عدد الأطفال ممن يتلقون التعليم من المنازل في الآونة الأخيرة وهذا استدعى إيجاد طرق مبتكرة ومميزة للتعليم فقد تغيرت الصورة النمطية عن غرفة الصف وفي هذه المقالة سأشارك معكم كيف تعلمت البرمجة واكتشفتها سويًا مع طلابي.
</p>

<h2>
	ما هي الشيفرة
</h2>

<p>
	الأجهزة الإلكترونية على اختلاف أنواعها من هواتف ذكية وحواسيب وألعاب الفيديو وحتى الغسالات جميعها تستخدم الشيفرة code لتنفيذ مهامها، ومهما تطور علم <a href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">الذكاء الاصطناعي وتعلم الآلة</a> فالشيفرة تحتاج دائمًا لعقول بشرية تكتبها وهؤلاء هم المبرمجون.
</p>

<p>
	إذًا فالشيفرة يكتبها المبرمجون وتتكون من مجموعة <a href="https://academy.hsoub.com/programming/advanced/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA-r1282/" rel="">خوارزميات</a> هي بدورها لوائح من التعليمات المركبة والمنظمة بدقة فائقة لتبدو أشبه بالوصفة، وتحلل هذه الشيفرة وتترجم إلى <a href="https://academy.hsoub.com/programming/java/%D8%AF%D9%88%D8%B1%D8%A9-%D8%A7%D9%84%D8%AC%D9%84%D8%A8-%D9%88%D8%A7%D9%84%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r962/" rel="">لغة الآلة</a> لينفذها الجهاز، وبالتالي المهارة الأولى الواجب تعلمها هي كتابة التعليمات وفق القواعد والترتيب الصحيح لتتمكن الحواسيب من فك تشفيرها ومعالجتها.
</p>

<h2>
	ما هو سكراتش Scratch؟
</h2>

<p>
	<a href="https://scratch.mit.edu/" rel="external nofollow">سكراتش Scratch</a> منصة خاصة بتعليم البرمجة للأطفال من عمر 8 سنوات فما فوق وذلك عبر لغة برمجة مرئية تعتمد تحريك اللبنات (الكتل) من خلال السحب والإفلات لتشكل مع بعضها رسومًا متحركة أو ألغاز أو ألعاب فيديو.
</p>

<p>
	يسهل سكراتش البرمجة على الصغار لكونه يعتمد على لبنات مرئية مبرمجة وجاهزة تتطلب التركيب فقط هو أشبه بتركيب المكعبات فهو لا يتطلب الكتابة الإملائية الصحيحة للتعليمات بخلاف البرمجة التقليدية.
</p>

<p>
	سكراتش أكثر من أداة تعليمية له بعد اجتماعي فهو يشجع المستخدمين على مشاركة مشاريعهم وإعادة دمجها معًا. كما أنه يوفر إمكانية العمل دون اتصال للحالات التي تملك مصادر إنترنت محدودة كبعض المنازل والغرف الصفية.
</p>

<h2>
	تعلم مصطلحات البرنامج
</h2>

<p>
	هذه الفقرة مهمة حتى لمن استخدم سكراتش قبلًا وذلك لتعلم مصطلحات البرنامج ومنطقه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="102206" href="https://academy.hsoub.com/uploads/monthly_2022_06/02-AR-codekids2_1_interface.png.e68da09ceca6348828652619cd206799.png" rel=""><img alt="02-AR-codekids2_1_interface.png" class="ipsImage ipsImage_thumbnailed" data-fileid="102206" data-unique="yae3l0ffa" src="https://academy.hsoub.com/uploads/monthly_2022_06/02-AR-codekids2_1_interface.thumb.png.8b0060b53d7d1ce621205af8685fa2e5.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	يمكنك إنشاء لعبة فيديو باستخدام سكراتش عبر تحريك لبنات المقاطع البرمجية code blocks وتركيبها معًا لتكون سكريبت بعملية أشبه ما تكون بتركيب المكعبات، والسكريبت -نسميه أيضًا بالخوارزمية- هو لائحة من التعليمات المرتبة على شكل وصفة، أما الكائن sprite الظاهر في الصورة فهو شخصية مصغرة أو كيان ما ضمن اللعبة والمنصة هي خلفية اللعبة ويتم التحكم بكليهما عبر السكريبت.
</p>

<p>
	كل سكريبت ضمن البرنامج يبدأ بلبنة برمجية مميزة تسمى قبعة الحدث event hat وتتميز رسوميًا عن غيرها من اللبنات بأنها مدورة من الأعلى ومهمتها انتظار حدث معين ليبدأ ومن ثم إعطاء أمر التشغيل لكافة اللبنات التي تليها في السكريبت.
</p>

<h2>
	لنبدأ البرمجة
</h2>

<p>
	جرب التحديات التالية لتبدأ رحلتك البرمجية عبر سكراتش
</p>

<h3>
	1. التحدي الأول: تحريك الكائن لليمين
</h3>

<p>
	المطلوب إنشاء خوارزمية تحرك الكائن لليمين عند الضغط على السهم الأيمن في لوحة المفاتيح.
</p>

<p>
	في البرمجة الحلول دائمًا متعددة وفي الصورة أدناه نعرض احتمالين لحل هذا التحدي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="102207" href="https://academy.hsoub.com/uploads/monthly_2022_06/img03-AR-codekids2_2_code.png.383991c96812f530e5eddebd4033fed3.png" rel=""><img alt="img03-AR-codekids2_2_code.png" class="ipsImage ipsImage_thumbnailed" data-fileid="102207" data-unique="shu7bwi2g" src="https://academy.hsoub.com/uploads/monthly_2022_06/img03-AR-codekids2_2_code.png.383991c96812f530e5eddebd4033fed3.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	لنناقش الحل:
</p>

<ol>
<li>
		ما الذي سيحدث لو غيرنا الرقم؟
	</li>
	<li>
		ما الذي سيحدث إن وصل الكائن أثناء حركته إلى حافة الشاشة؟
	</li>
	<li>
		ما هي اللبنة الواجب استخدامها حتى لا يختفي الكائن عند وصوله لحافة الشاشة؟
	</li>
</ol>
<p>
	انظر التغيرات أدناه:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="102208" href="https://academy.hsoub.com/uploads/monthly_2022_06/img04-AR-codekids2_3_code.png.bcfe2f8f967406c9b0ea9476d0e24942.png" rel=""><img alt="img04-AR-codekids2_3_code.png" class="ipsImage ipsImage_thumbnailed" data-fileid="102208" data-unique="l3z8v5jgt" src="https://academy.hsoub.com/uploads/monthly_2022_06/img04-AR-codekids2_3_code.png.bcfe2f8f967406c9b0ea9476d0e24942.png" style="width: 480px; height: auto;"></a>
</p>

<p>
	ستلاحظ بعد التنفيذ أن الكائن يصل لحافة الشاشة ويبدأ بالاهتزاز إلى الأعلى والأسفل وهذا السلوك في السكريبت يدعى بالخطأ bug وتصحيحه يدعى بتنقيح الخطأ debugging، وفي حالتنا يتم التصحيح عبر اختيار الكائن والضغط على زر الاتجاهات واختر الأيقونة يمين/يسار أو الأيقونة الخاصة بمنع الدوران كما في الصورة أدناه:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="102213" href="https://academy.hsoub.com/uploads/monthly_2022_06/img05-AR-codekids2_4_code.jpg.1ac5da822488edd61037f53e4d6eed26.jpg" rel=""><img alt="img05-AR-codekids2_4_code.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="102213" data-unique="ycyju5fyx" src="https://academy.hsoub.com/uploads/monthly_2022_06/img05-AR-codekids2_4_code.thumb.jpg.6043b5ae5f393e3b85890d940beb3dd8.jpg" style="width: 450px; height: auto;"></a>
</p>

<p>
	نفذ مجددًا هل تلاحظ أي أخطاء؟
</p>

<ol>
<li>
		إن توقف الاهتزاز عند حافة الشاشة فانتقل للتحدي التالي.
	</li>
	<li>
		إن كان الكائن في برنامجك يتحرك يسارًا عندما يصل لحافة الشاشة حتى وأنت تضغط السهم الأيمن فأنت إذًا جاهز للتحدي التالي.
	</li>
</ol>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="102210" href="https://academy.hsoub.com/uploads/monthly_2022_06/img06-AR-codekids2_5_code.png.69d5f2d75f2b154084d6d1d7c7ece83a.png" rel=""><img alt="img06-AR-codekids2_5_code.png" class="ipsImage ipsImage_thumbnailed" data-fileid="102210" data-unique="h82cza76f" src="https://academy.hsoub.com/uploads/monthly_2022_06/img06-AR-codekids2_5_code.png.69d5f2d75f2b154084d6d1d7c7ece83a.png" style="width: 450px; height: auto;"></a>
</p>

<h3>
	2. التحدي الثاني: تحريك الكائن لليسار
</h3>

<p>
	المطلوب إنشاء خوارزمية تحرك الكائن لليسار عند الضغط على السهم الأيسر في لوحة المفاتيح. بنفس طريقة التحدي الأول ننجز هذا التحدي لاحظ الحل في الصورة أدناه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="102211" href="https://academy.hsoub.com/uploads/monthly_2022_06/img07-AR-scratch3-left-right_answer.png.51984da43c7add82e9a733b3bd764278.png" rel=""><img alt="img07-AR-scratch3-left-right_answer.png" class="ipsImage ipsImage_thumbnailed" data-fileid="102211" data-unique="awh8uukwg" src="https://academy.hsoub.com/uploads/monthly_2022_06/img07-AR-scratch3-left-right_answer.thumb.png.30175daf1d68f9632cc96eec5977bd4f.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	بعد الانتهاء سمي مشروعك واحفظه عبر الخيار حفظ أو حفظ الآن ولا حاجة لاستخدام خيار حفظ باسم أو حفظ نسخة لأن ذلك يعني مضاعفة المشروع.
</p>

<h2>
	لا تتوقف عند هذا الحد
</h2>

<p>
	البرمجة تعني التجريب والمحاولة مجددًا حتى الوصول للنتيجة المطلوبة وهذا بالضبط ما يجعلها مادتي المفضلة في التدريس، ولا تتوقف عند هذه الأمثلة افترض مشكلة ما وحاول الوصول إلى حل لها اطلع على لبنات المقاطع البرمجية الموجودة وابني السكريبت اللازم.
</p>

<p>
	الأهم دائمًا أن لا تيأس وتذكر أنه لا يوجد إجابة خاطئة هنا فالموضوع كله يتعلق بالإبداع وإيجاد الحلول والاستمتاع.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/article/20/9/scratch" rel="external nofollow">Code your first algorithm in Scratch</a> لصاحبه Jess Weichler.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r662/" rel="">تعلم البرمجة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/advanced/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA-r1282/" rel="">مدخل إلى الخوارزميات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-scratch-r1407/" rel="">البرمجة باستخدام سكراتش Scratch</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1619</guid><pubDate>Wed, 13 Jul 2022 16:03:00 +0000</pubDate></item><item><title>&#x648;&#x627;&#x62C;&#x647;&#x629; &#x633;&#x637;&#x631; &#x623;&#x648;&#x627;&#x645;&#x631; &#x631;&#x627;&#x633;&#x628;&#x64A;&#x627;&#x646; &#x641;&#x64A; &#x631;&#x627;&#x633;&#x628;&#x64A;&#x631;&#x64A; &#x628;&#x627;&#x64A;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%B3%D8%B7%D8%B1-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%A7%D9%86-%D9%81%D9%8A-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1620/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_06/62bc2891c6ee5_-----.png.1ed4f46c5dc2f928ac51c166afa7f5a7.png" /></p>

<p>
	تستطيع الوصول إلى معظم برامج <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AC%D9%87%D8%A7%D8%B2-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi-r1356/" rel="">راسبيري باي</a> عبر سطح المكتب، إلا أنك تحتاج واجهةً لكتابة تعليمات نصية تُعرف بواجهة سطر الأوامر Command-line interface -أواختصارًا CLI- للوصول إلى بعض البرامج. يؤمن هذه الواجهة في راسبيان تطبيقٌ يُدعى "الطرفية Terminal".
</p>

<p>
	لن يحتاج معظم المستخدمين إلى تعلُّم العمل عبر واجهة سطر الأوامر CLI، لكن ما سيقدمه هذا الملحق هو مدخلٌ بسيط لمن يرغب بتعلم مزيدٍ عنها.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>معلومات أكثر:</strong> لم يُكتب هذا الملحق ليكون دليلًا شاملًا لتعلم واجهة سطر الأوامر الخاصة بنظام لينوكس، فإذا كنت تبحث عن تفاصيل أكثر، عُد إلى <a href="https://rpf.io/terminal" rel="external nofollow">صفحة الويب المخصصة</a> لذلك في موقع راسبيري باي.
		</p>
	</div>
</blockquote>

<h2>
	فتح تطبيق الطرفية
</h2>

<p>
	يصل المستخدم إلى CLI عبر برنامجٍ يُدعى "الطرفية Terminal"، وهو برنامج يُحمِّل ما يُعرف تقنيًا بواجة الطباعة الافتراضية عن بُعد Virtual teletype terminal؛ إذ تعود هذه التسمية إلى الفترة الزمنية التي أعطى فيها مستخدمي الحاسوب الأوامر عبر آلة كاتبة كهروميكانيكية بدلًا من استخدام لوحة المفاتيح والشاشة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="102263" href="https://academy.hsoub.com/uploads/monthly_2022_06/raspbian_Terminal_01.png.83b752729efb1218b41742fb160dbd71.png" rel=""><img alt="raspbian_Terminal_01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="102263" data-unique="gi5lzjo20" src="https://academy.hsoub.com/uploads/monthly_2022_06/raspbian_Terminal_01.thumb.png.9c67d6a681a4c0a02b77b245232b8308.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	يمكنك فتح الطرفية عن طريق النقر على أيقونة راسبيري لفتح القائمة والانتقال إلى فئة "برامج ملحقة Accessories"، ثم النقر على "الطرفية Terminal". يمكن سحب نافذة الطرفية إلى سطح المكتب كما يمكن تكبيرها وتصغيرها وتغيير حجم خط الكتابة إن كان من الصعب قراءته، أو ليناسب حجم النافذة وذلك بالنقر على القائمة "تحرير Edit" ثم اختيار "تكبير Zoom in"، أو "تصغير Zoom out"K أو بالضغط على المفتاح "CTRL" ثم أحد الزرين "+" أو "-".
</p>

<h2>
	محث الطرفية
</h2>

<p>
	أول ما تراه في الطرفية هو <strong>المحث Prompt</strong> الذي يكون منتظرًا تعليماتك. يظهر المحث في راسبيان على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1856_10" style="">
<span class="pln">pi@raspberrypi</span><span class="pun">:~</span><span class="pln"> $</span></pre>

<p>
	يشير الاسم ما قبل "@" إلى اسم المستخدم وما بعده إلى اسم الحاسوب الذي تستخدمه وهو افتراضيًا "raspberrypi". بعد الرمز ":" ستشاهد الرمز "~" وهو اختصارٌ يشير إلى المجلد الرئيسي Home directory ويمثِّل مجلد العمل الذي تعمل ضمنه حاليًا current working directory -أواختصارًا CWD-؛ أما الرمز "$" فيشير إلى أن المستخدم الحالي غير مفوّض unprivileged، أي يحتاج إلى كلمة مرور ليُنفّذ مهامًا، مثل إضافة أو إزالة البرامج.
</p>

<h2>
	الانطلاق في العمل
</h2>

<p>
	اكتب التعليمة التالية ثم اضغط المفتاح "Enter":
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1856_12" style="">
<span class="pln">cd </span><span class="typ">Desktop</span></pre>

<p>
	سيتغير المُحِث إلى:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1856_15" style="">
<span class="pln">pi@raspberrypi</span><span class="pun">:~/</span><span class="typ">Desktop</span><span class="pln"> $</span></pre>

<p>
	أصبح سطح المكتب الآن هو مجلد العمل الحالي الذي يقع مباشرةً تحت المجلد الرئيسي، والذي يشير إليه الرمز "~"، ونُفِّذ ذلك من خلال تعليمة تغيير مجلد العمل <code>cd</code>. يمكنك العودة إلى المجلد الرئيسي بأربعة طرق، حاول أن تجرب كل منها على حدى، ثم جرّب استخدامها للعودة إلى مجلد فرعي لسطح المكتب.
</p>

<ul>
<li>
		الطريقة الأولى- باستخدام الأمر التالي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1856_19" style="">
<span class="pln">cd </span><span class="pun">..</span></pre>

<p>
	إذ يُعد الرمز ".." اختصارًا للمجلد الذي يقع مباشرةً فوق مجلد العمل الحالي أو المجلد الأب، وطالما أنّ المجلد الرئيسي هو الأب المباشر لمجلد سطح المكتب فستصل إليه. عُد إلى سطح المكتب وحاول تجريب الأمر التالي.
</p>

<ul>
<li>
		الطريقة الثانية- باستخدام الأمر التالي:
	</li>
</ul>
<pre class="ipsCode">
cd ~
</pre>

<p>
	ويعني الأمر حرفيًا "توجَّه إلى المجلد الرئيسي"، إذ يمكنك الانتقال بهذه التعليمة إلى المجلد الرئيسي من أي مجلد تعمل عليه، على خلاف الطريقة الأولى التي تنقلك إلى المجلد الأب الأعلى مباشرةً من مجلد العمل الحالي. عُد إلى سطح المكتب وحاول تجريب الطريقة الثالثة التالية.
</p>

<ul>
<li>
		الطريقة الثالثة- باستخدام الأمر التالي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1856_21" style="">
<span class="pln">cd</span></pre>

<p>
	إذا لم تضع عنوان المجلد الذي ستنتقل إليه بعد التعليمة <code>cd</code> سيقودك افتراضيًا إلى المجلد الرئيسي. عُد إلى سطح المكتب وحاول تجريب الأمر الأخير التالي.
</p>

<ul>
<li>
		الطريقة الرابعة- باستخدام الأمر التالي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1856_23" style="">
<span class="pln">cd </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">pi</span></pre>

<p>
	إذ يمثِّل المسار ما بعد التعليمة <code>cd</code> المسار المطلق absolute path والذي سيعمل بغض النظر عن المجلد الحالي، وينقلك إلى المجلد الرئيسي من أي مجلد تعمل عليه كما هو حال التعليمتين السابقتين، لكن عليك ذكر اسم المستخدم (pi في حالتنا هذه).
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>حالة الأحرف الصحيحة:</strong> تُعد واجهة سطر الأوامر في راسبيان حساسةً لحالة الأحرف، أي يختلف الأمر إن بدلت حرفًا بحالته الكبيرة Upper case بآخر حالته صغيرة Lower case؛ ففي حال تلقيت رسالة "لا يوجد ملف أو مجلد بهذا الاسم no such file or directory" أثناء محاولة تغيير مجلد العمل، تأكد من وجود "D" وليس"d" في بداية الكلمة "Desktop" مثلًا.
		</p>
	</div>
</blockquote>

<h2>
	التعامل مع الملفات
</h2>

<p>
	لكي تتمرن على أساليب التعامل مع الملفات، انتقل إلى سطح المكتب واكتب الأمر:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1856_32" style="">
<span class="pln">touch </span><span class="typ">Test</span></pre>

<p>
	سيظهر على سطح المكتب عند تنفيذ التعليمة السابقة ملفٌ اسمه "Test"، إذ تُستخدم التعليمة <code>touch</code> عادةً لتحديث معلومات الوقت والتاريخ لملف، لكن في الحالة التي لا يكون فيها هذا الملف موجودًا (مثل حالتنا) تُنشئ التعليمة هذا الملف.
</p>

<p>
	جرّب التعليمة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1856_34" style="">
<span class="pln">cp </span><span class="typ">Test</span><span class="pln"> </span><span class="typ">Test2</span></pre>

<p>
	سيظهر على سطح المكتب ملفٌ آخر باسم "Test2" ويمثّل نسخةً مطابقةً للملف الأصلي. لنحذف هذه النسخة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1856_30" style="">
<span class="pln">rm </span><span class="typ">Test2</span></pre>

<p>
	لن يظهر الملف على سطح المكتب بعد الآن.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>تحذير:</strong> يُحذف الملف عند استخدام التعليمة <code>rm</code> نهائيًا ولا يُنقل إلى سلة المحذوفات كما هو الحال عند حذف ملف من خلال الواجهة الرسومية لبرنامج "مدير الملفات File manager" لكي تستعيده لاحقًا إذا أردت.
		</p>
	</div>
</blockquote>

<p>
	حاول أن تجرّب الآن التعليمة التالية:
</p>

<pre class="ipsCode">
mv Test Test2
</pre>

<p>
	تنقل هذه التعليمة الملف "Test"، إذ سيختفي عن سطح المكتب ليحل محله الملف "Test2"، الذي يعد نسخةً مطابقةً أيضًا عن الملف الأصلي، وتُستخدم هذه الطريقة في تغيير اسم ملف مثلًا.
</p>

<p>
	إذا لم يكن سطح المكتب هو مجلد العمل الحالي، قد تحتاج إلى معرفة ما يحتويه هذا المجلد من مجلدات وملفات لذلك اكتب التعليمة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1856_36" style="">
<span class="pln">ls</span></pre>

<p>
	إذ تًظهر هذه التعليمة قائمةً بمحتويات المجلد الحالي أو محتويات أي مجلد آخر تحدده لهذه التعليمة. أضِف بعض الخيارات إلى تعليمتك لتتمكن من عرض تفاصيل أكثر، مثل الملفات المخفية وحجم الملفات:
</p>

<pre class="ipsCode">
ls -larth
</pre>

<p>
	تتحكم الخيارات التالية بتعليمة <code>ls</code>:
</p>

<ul>
<li>
		<code>l</code>: يعرض النتائج في قائمة عمودية طويلة.
	</li>
	<li>
		<code>a</code>: يعرض جميع الملفات والمجلدات.
	</li>
	<li>
		<code>r</code>: يعكس الترتيب الاعتيادي للمعروضات.
	</li>
	<li>
		<code>t</code>: يعرض المحتويات وفقًا لتاريخ أخر تعديل، ومع <code>r</code> سيعرض لك الملفات الأقدم في بداية القائمة.
	</li>
	<li>
		<code>h</code>: يُظهر حجم الملف بطريقة مقروءة للبشر ليسهل فهمه.
	</li>
</ul>
<h2>
	تشغيل البرامج
</h2>

<p>
	لا يمكن تشغيل بعض البرامج إلا باستخدام سطر الأوامر، بينما يمتلك البعض الآخر واجهات رسومية وواجهة لسطر الأوامر؛ إذ تُعد "أداة تهيئة البرمجيات Pi software configuration tool" مثالًا عن الحالة الأخيرة، والتي تُشغَّل عادةً من قائمة راسبيري باي.
</p>

<p>
	لنجرّب طريقة <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">سطر الأوامر</a> بكتابة التعليمة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1856_38" style="">
<span class="pln">raspi</span><span class="pun">-</span><span class="pln">config</span></pre>

<p>
	ستكون نتيجة التعليمة رسالة خطأ مفادها أنه لا يمكن تشغيل البرنامج إلا في حالة كان مستخدم جذر رئيسي root user، لذلك حاول تغيير التعليمة إلى:
</p>

<pre class="ipsCode">
sudo raspi-config
</pre>

<p>
	التوجيه <code>sudo</code> هو اختصار لعبارة "switch-user do"، وهي تجبر راسبيان على تنفيذ الأمر كأنه مستخدمٌ رئيسي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="102264" href="https://academy.hsoub.com/uploads/monthly_2022_06/termian_config_tool_02.png.ea89b8f40d428270c0c14d831a91a5e6.png" rel=""><img alt="termian_config_tool_02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="102264" data-unique="4hiux174d" src="https://academy.hsoub.com/uploads/monthly_2022_06/termian_config_tool_02.thumb.png.ad3cab97e131b8a97fafdb77e406e41d.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	لا تستخدم هذا التوجيه ما لم يتطلب البرنامج الذي تشغله امتيازات عالية مثل حالة تثبيت أو إزالة برامج أو ضبط إعدادات النظام، فلا يجب أن تُشغّل لعبة مثلًا باستخدام <code>sudo</code>. اضغط على المفتاح "TAB" مرتين، ثم اختر "إنهاء Finish" واضغط على المفتاح "Enter" لإغلاق أداة التهيئة والعودة إلى واجهة سطر الأوامر.
</p>

<p>
	نفذ أخيرًا التعليمة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1856_44" style="">
<span class="pln">exit</span></pre>

<p>
	التي ستنهي جلسة العمل وتغلق برنامج الطرفية.
</p>

<h2>
	استخدام الطرفيات TTYs
</h2>

<p>
	لا يمثِّل برنامج "الطرفية Terminal" الواجهة الوحيدة لسطر الأوامر، بل بالإمكان الانتقال إلى أية طرفيات قيد العمل، والتي تُعرف بواجهات الأوامر البعيدة teletype -أو اختصارًا TTYs-. للانتقال إلى tty2 اضغط على المفتاحين "CTRL" + "ALT" معًا واضغط معهما الزر "F2".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="102265" href="https://academy.hsoub.com/uploads/monthly_2022_06/tty2_terminal_03.png.f27557d851c11e7bb8cd56c033c90a1f.png" rel=""><img alt="tty2_terminal_03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="102265" data-unique="2vtlgi0ef" src="https://academy.hsoub.com/uploads/monthly_2022_06/tty2_terminal_03.png.f27557d851c11e7bb8cd56c033c90a1f.png" style="width: 500px; height: auto;"></a>
</p>

<p>
	لا بدّ من تسجيل دخولك باستخدام كلمة المرور واسم المستخدم، وستتمكن بعد ذلك من التعامل مع هذه الطرفية كما فعلنا سابقًا. هذه الطرفيات مفيدةٌ خاصةً عندما لا تكون قادرًا على الوصول إلى سطح المكتب لسببٍ أو لآخر. لمغادرة tty2 اضغط على المفتاحين "CTRL" + "ALT" معًا واضغط معهما الزر "F7". عند العودة إلى tty2 مجددًا سترى كل ما أنجزته سابقًا قبل مغادرتها. اكتب التعليمة <code>exit</code> ثم اضغط على المفاتيح "CTRL+ALT+F7" للعودة إلى سطح المكتب، وتأتي أهمية تنفيذ هذه التعليمة قبل مغادرة TTY في تسجيل خروجك تلقائيًا، إذ سيتمكن أي شخصٍ قادرٍ على الوصول إلى TTY من العبث بحسابك دون الحاجة لكتابة كلمة المرور.
</p>

<p>
	تهانينا، لقد اجتزت خطوتك الأولى في احتراف واجهة سطر الأوامر الخاصة بالنظام راسبيان.
</p>

<p>
	ترجمة -وبتصرف- للملحق The command-line interface من كتاب <a href="https://www.raspberrypi.org/magpi-issues/Beginners_Guide_v2.pdf" rel="external nofollow">The Official Raspberry Pi Beginner's Guide</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: أداة التهيئة في راسبيري باي
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A7%D9%84%D8%A8%D8%B1%D8%A7%D9%85%D8%AC-%D8%B9%D9%84%D9%89-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1602/" rel="">تثبيت أنظمة التشغيل والبرامج على راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A3%D9%85%D8%B1-%D8%AC%D8%AF%D9%8A%D8%AF-%D9%81%D9%8A-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%81%D9%8A-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1518/" rel="">إنشاء أمر جديد في بيئة سطر الأوامر في راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%81%D9%8A-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1509/" rel="">التعامل مع بيئة سطر الأوامر في راسبيري باي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1620</guid><pubDate>Wed, 29 Jun 2022 10:57:20 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x623;&#x646;&#x638;&#x645;&#x629; &#x627;&#x644;&#x62A;&#x634;&#x63A;&#x64A;&#x644; &#x648;&#x627;&#x644;&#x628;&#x631;&#x627;&#x645;&#x62C; &#x639;&#x644;&#x649; &#x631;&#x627;&#x633;&#x628;&#x64A;&#x631;&#x64A; &#x628;&#x627;&#x64A;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A7%D9%84%D8%A8%D8%B1%D8%A7%D9%85%D8%AC-%D8%B9%D9%84%D9%89-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1602/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_06/62adc3136f262_--------.png.a61a1c8031c2c99f53f7930314144f7b.png" /></p>

<p>
	صُمم البرنامج "نوبس NOOBS" لتسهيل عملية تثبيت <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">أنظمة التشغيل</a> على راسبيري باي ما أمكن، إذ يمكنك شراء بطاقة ذاكرة microSD ثُبت عليها نوبس مسبقًا من أي موزّع لتجهيزات باي، أو اتباع التعليمات التالية لتثبيت البرنامج على بطاقة ذاكرة خاصة بك.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>تحذير:</strong> إذا اشتريت بطاقة ذاكرة microSD ثُبِّت عليها برنامج نوبس فلن تحتاج سوى وضعها في راسبيري باي؛ أما بالنسبة للتعليمات في الفقرات التالية فهي موجهة للبطاقات الفارغة أو التي تريد إعادتها إلى حالتها الأصلية. لا تطبِّق هذه التعليمات إذًا على أي بطاقة ذاكرة تحتوي على ملفات قبل نسخها احتياطيًا على وسيط تخزين آخر لأنك ستخسرها.
		</p>
	</div>
</blockquote>

<h2>
	تنزيل نوبس NOOBS
</h2>

<p>
	لتثبيت نوبس على بطاقة ذاكرة فارغة، عليك تنزيل البرنامج من موقع ويب راسبيري باي على حاسوب قادر على قراءة بطاقة الذاكرة microSD و full-size SD مع محوِّل لبطاقة microSD، ويمكنك استخدام قارئ بطاقات ذاكرة بواجهة USB كذلك. استخدم المتصفح في الوصول إلى موقع <a href="https://rpf.io/downloads" rel="external nofollow">التنزيلات</a> الخاص براسبيري باي وانقر على برنامج نوبس المُعلّم بأيقونة راسبيري باي في الصفحة التي يحملها المتصفح، ثم انقر "تنزيل ملف مضغوط Download ZIP" ضمن الفئة "تنزيل نوبس دون اتصال أو عبر الشبكة NOOBS Offline and network install".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101219" href="https://academy.hsoub.com/uploads/monthly_2022_06/NOOBS_download_page_01.png.13ee24763c2aaeb41ba53200db298c9a.png" rel=""><img alt="NOOBS_download_page_01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101219" data-unique="6m3ld5nba" src="https://academy.hsoub.com/uploads/monthly_2022_06/NOOBS_download_page_01.thumb.png.f6893c27a3a6f5ab76ff868c50ea9a97.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	يستغرق تنزيل نوبس وقتًا وخاصة إن كان الاتصال بالإنترنت بطيئًا. عند انتهاء التنزيل أدخل بطاقة الذاكرة في الحاسوب، وستظهر على شكل سواقة مفردة قابلة للإزالة، وقد تُضطرإلى تهيئتها format أولًا إن لم تظهر بهذا الشكل.
</p>

<p>
	<strong>خياري تنزيل:</strong> لاحظ وجود نسختين قابلتين للتنزيل على صفحة تنزيلات نوبس، هما: NOOBS و NOOBS Lite. تنزِّل النسخة الأولى نوبس ونسخة عن آخر إصدار لنظام التشغيل راسبيان في حزمة واحدة؛ بينما تنزِّل النسخة الثانية نوبس فقط. ما يحتاجه معظم المستخدمين هي النسخة الأولى، فلا تنزل النسخة الثانية إلا إذا كنت تخطط لتثبيت نظام تشغيل آخر غير راسبيان. تُثبَّت النسختان بالطريقة ذاتها كما نشرحها في هذا الملحق.
</p>

<h2>
	تهيئة بطاقة الذاكرة microSD
</h2>

<p>
	لتهيئة بطاقة ذاكرة مستخدمة سابقًا لتثبيت نوبس، ينبغي لمستخدمي ويندوز أو ماك أو إس تنزيل <a href="https://rpf.io/sdcard" rel="external nofollow">أداة تهيئة بطاقة الذاكرة</a> "SD Card Association SD Memory Card Formatter"، ثم تثبيتها، أما بالنسبة لمستخدمي <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">لينوكس</a>، فالأداة "disk management tool" هي المستخدمة في حذف أية تقسيمات على البطاقة، ثم إنشاء جزء وحيد single partition وتهيئته وفق نظام الملفات VFAT، ثم إكمال هذا الدليل.
</p>

<p>
	أدخل بطاقة الذاكرة في الحاسوب إن لم تكن قد فعلت ذلك، ثم شغِّل الأداة "SD Card Formatter". ابحث عن بطاقة الذاكرة ضمن القائمة "اختر بطاقةً Select card"، إذ قد تجد أكثر من بطاقة لها نفس اسم بطاقتك إن كنت قد استخدمتها سابقًا مع راسبيري باي، لذلك اختر واحدةً منها في هذه الحالة وتحقق من اختيارك للقرص الصحيح (بطاقة الذاكرة) بالاطلاع على معلومات القرص في قسم "معلومات البطاقة card information" الذي يعرض حجم ونوع بطاقة الذاكرة microSD التي أدخلتها. حاول أن تختار الآخرى إن كانت المعلومات المعروضة ليست صحيحة (ليست معلومات بطاقتك)، وتحقق من صحة المعلومات من جديد حتى تتأكد تمامًا بأنها البطاقة الصحيحة. تحقق كذلك من عمل نسخة احتياطية لأية ملفات مخزنة عليها قد تحتاجها لاحقًا، ثم سمِّ البطاقة "NOOBS" من خلال الصندوق "عنوان وحدة التخزين volume label" وانقر زر "تهيئة format" وأكّد -عندما يُطلب منك ذلك- رغبتك في تهيئة القرص. لن يستغرق خيار التهيئة السريعة "quick format" سوى ثوانٍ معدودة ليكتمل. أغلق بعد ذلك أداة التهيئة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101213" href="https://academy.hsoub.com/uploads/monthly_2022_06/format_tool_windows_02.png.e4eadfd38f4903cb60c73928ec3ecd72.png" rel=""><img alt="format_tool_windows_02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101213" data-unique="xjtcjucss" src="https://academy.hsoub.com/uploads/monthly_2022_06/format_tool_windows_02.thumb.png.fc96d502644f535ad435773c7d2c73c7.png" style="width: 650px; height: auto;"></a>
</p>

<h2>
	تثبيت نوبس
</h2>

<p>
	وهي عمليةٌ بسيطة مثل عملية سحب وإفلات. ابحث عن ملف نوبس الذي نزلته مسبقًا وستجده عادةً في مجلد " التنزيلات Downloads". يُدعى هذا الملف "ملف أرشيف Archive file"، ويحتوي نسخًا عن كثيرٍ من الملفات التي ضُغطت ضمنه لتقليل حجمها وتسريع تنزيلها. انقر على الأرشيف نقرًا مزدوجًا لفتحه، ثم اضغط على المفتاحين "CTRL+ A" في نظام ويندوز، أو "⌘+A" في نظام ماك أو إس لاختيار جميع ملفات الأرشيف، ثم اسحب هذه الملفات إلى بطاقة الذاكرة microSD ثم أفلتها وانتظر حتى تكتمل عملية النسخ والتي قد تستمر عدة دقائق. أخرج بطاقة الذاكرة عندما ينتهي نسخ الملفات من الحاسوب وضعها في راسبيري باي. عندما تُقلع باي مرةً أخرى سيُحمّل برنامج نوبس وسيطلب منك اختيار نظام التشغيل الذي تود تثبيته.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101212" href="https://academy.hsoub.com/uploads/monthly_2022_06/drag_noobs_files_03.png.edfab6b2189e2c409249b2cc188280ad.png" rel=""><img alt="drag_noobs_files_03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101212" data-unique="fnq7p66yn" src="https://academy.hsoub.com/uploads/monthly_2022_06/drag_noobs_files_03.thumb.png.fbbd1a2f34953f01615c1e805a58f770.png" style="width: 650px; height: auto;"></a>
</p>

<h2>
	تثبيت البرامج وإزالتها
</h2>

<p>
	يأتي مع نظام التشغيل راسيبان Raspbian مجموعةً من البرامج المُختارة من قبل مؤسسة راسبيري باي لكنها طبعًا ليست الوحيدة التي تعمل على راسبيان. سترشدك الأفكار التالية إلى طريقة تصفُّح برامج إضافية وتثبيتها أو إزالتها لتوسيع إمكانيات باي. بُنيت الإرشادات في هذا الملحق على ما شرحناه في المقال الثالث "<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%86%D8%B8%D8%A7%D9%85-%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%A7%D9%86-r1371/" rel="">نظام تشغيل راسبيري باي (راسبيان)</a>" من هذه السلسلة <a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A%20%D8%A8%D8%A7%D9%8A/" rel="">دليل راسبيري باي</a> حول استخدام بعض البرمجيات الأساسية، لذلك من الأفضل العودة إلى هذا الفصل -إن لم تفعل بعد- قبل استخدام الطرق التي سنشرحها في هذا الملحق.
</p>

<p>
	<strong>سعة بطاقة الذاكرة:</strong> تستهلك البرامج الإضافية التي تثبتها مساحةً أكبر على بطاقة الذاكرة. تسمح لك مثلًا بطاقات الذاكرة بحجم 16 جيجابايت أو أكثر بتثبيت برامج أكثر، ويمكنك التحقق من أن بطاقة الذاكرة التي تنوي استخدامها مناسبةٌ لراسبيري باي من خلال <a href="https://rpf.io/sdcardlist" rel="external nofollow">موقع دعم راسبيري</a>.
</p>

<h2>
	تصفح البرامج الموجودة
</h2>

<p>
	يمكن تصفُّح قائمة البرمجيات المُتاحة لراسبيان، والتي تُعرف باسم مستودعات البرمجيات software repositories من خلال النقر على أيقونة راسبيري والانتقال إلى فئة "تفضيلات Preferences"، ثم النقر على "إضافة/ إزالة البرامج Add/Remove Software". ستظهر نافذة الأداة بعد عدة ثوانٍ.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101210" href="https://academy.hsoub.com/uploads/monthly_2022_06/add_remove_packages_04.png.91f4987f14cf42c6192e2dd606e2c9a7.png" rel=""><img alt="add_remove_packages_04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101210" data-unique="rckza4o4y" src="https://academy.hsoub.com/uploads/monthly_2022_06/add_remove_packages_04.png.91f4987f14cf42c6192e2dd606e2c9a7.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	يتضمن الجانب الأيسر للنافذة قائمةً بالفئات تشبه تلك التي تراها في قائمة راسبيري باي. ستعرض لك نافذة إضافة / إزالة البرامج جميع البرمجيات التي تندرج تحت فئة معينة عند النقر عليها؛ ويمكنك أيضًا البحث عن برنامج أو توصيف برنامج بكتابته في صندوق البحث في أعلى يسار النافذة، مثل "محرر نصوص text editor"، أو "ألعاب games"، وستجد نتيجة البحث على هيئة قائمة من البرامج التي حققت معيار البحث من كل الفئات. لمزيدٍ من المعلومات حول أي برنامج منها، انقر عليه ضمن القائمة وستُعرض المعلومات في الفراغ أسفل النافذة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101217" href="https://academy.hsoub.com/uploads/monthly_2022_06/search_for_package_05.png.959bb84374344f893a4e6ed59872b789.png" rel=""><img alt="search_for_package_05.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101217" data-unique="74ivl8tlr" src="https://academy.hsoub.com/uploads/monthly_2022_06/search_for_package_05.thumb.png.55ae4e3173bf69a3ef827865b1f79683.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	في حال ضمّت فئةٌ من الفئات كثيرًا من البرمجيات المتاحة للتثبيت، سيستغرق ذلك وقتًا أطول من نافذة إضافة/إزالة البرامج لعرضها.
</p>

<h2>
	تثبيت برنامج
</h2>

<p>
	فعّل مربع التحقق بجوار البرنامج الذي تريد تثبيته بالنقر عليه. ويمكنك طبعًا النقر على مربعات التحقق قبل مجموعة البرامج التي تحتاجها لكي تثبتها الأداة في نفس الوقت. ستتحول الأيقونة إلى جانب البرنامج الذي تختاره إلى أيقونة صندوق مفتوح وعليه الرمز "+" للإشارة إلى أنه جاهزٌ للتثبيت؛ وعندما تكتمل قائمة البرامج التي تحتاجها انقر على أحد الزرين "OK" أو "Apply"، إذ لا فرق بين الزرين السابقين سوى أنّ الأول يغلق النافذة عند الانتهاء من التثبيت بينما يبقيها الثاني مفتوحة. سيُطلب منك إدخال كلمة المرور للتأكد من هويتك، فلن ترغب بالتأكيد أن يعبث أحد بالبرامج التي تثبتها على باي
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101214" href="https://academy.hsoub.com/uploads/monthly_2022_06/install_package_06.png.e71208703aebc3789d58f70a4ff96350.png" rel=""><img alt="install_package_06.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101214" data-unique="wybtz2sqy" src="https://academy.hsoub.com/uploads/monthly_2022_06/install_package_06.thumb.png.ad97706f12fb4a318f5ec432f464dc16.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	قد تلاحظ أحيانًا أنّ مجموعة حزم قد جرى تثبيتها مع البرنامج الذي ثبته، إذ تُعرف هذه الحزم بالاعتماديات dependencies ويحتاجها برنامجك للعمل بصورةٍ جيدة، مثل حزمة المؤثرات الصوتية التي تحتاجها الألعاب، أو قاعدة بيانات للعمل مع مخدم ويب. يمكنك الوصول إلى برنامجك بعد اكتمال التثبيت ضمن الفئة التي ينتمي إليها في قائمة راسبيري باي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101211" href="https://academy.hsoub.com/uploads/monthly_2022_06/confirm_install_package_07.png.407f5f2656847b031001084436fe7fc1.png" rel=""><img alt="confirm_install_package_07.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101211" data-unique="rrvs4fpbq" src="https://academy.hsoub.com/uploads/monthly_2022_06/confirm_install_package_07.thumb.png.4e9fbc282b1f67052c3197fa7b0c687a.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	تذَكر أن الفئات في قائمة راسبيري باي قد تختلف عن الفئات في أداة إضافة / إزالة البرامج، وقد لا تجد اختصارًا لبعض البرامج التي ثبتّها في قائمة راسبيري إطلاقًا والتي تعرف ببرامج سطر الأوامر Command-line software، إذ ينبغي تشغيلها من برنامج الطرفية "Terminal". لمزيدٍ من المعلومات حول <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">سطر الأوامر</a> والطرفية راجع الملحق "C" (واجهة سطر الأوامر).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101216" href="https://academy.hsoub.com/uploads/monthly_2022_06/raspberry_pi_menu_08.png.365c26ff04f6af117a41f695f8eaf419.png" rel=""><img alt="raspberry_pi_menu_08.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101216" data-unique="nk5oj246e" src="https://academy.hsoub.com/uploads/monthly_2022_06/raspberry_pi_menu_08.png.365c26ff04f6af117a41f695f8eaf419.png" style="width: 650px; height: auto;"></a>
</p>

<h2>
	إلغاء تثبيت برنامج
</h2>

<p>
	لإزالة أو إلغاء تثبيت برنامج، افتح أداة إضافة / إزالة البرامج، ثم ابحث عن البرنامج الذي تريد إلغاء تثبيته وألغِ تفعيل مربع التحقق إلى جواره بالنقر عليه؛ كما يمكنك استخدام صندوق البحث لإيجاد البرنامج المطلوب؛ وتستطيع كذلك إلغاء تثبيت عدة برامج معًا بالنقر على مربع التحقق بجوار كل منها وإلغاء تفعيله، وسيتغير عندها شكل الأيقونة إلى صندوق مفتوح بجواره سلة محذوفات للإشارة بأن هذا البرنامج سيُحذف أو يُلغى تثبيته. انقر بعد ذلك على أحد الزرين "OK" أو "Apply" لتبدأ العملية، وسيطلب منك إدخال كلمة المرور إن لم تكن قد أدخلتها لسببٍ ما خلال الدقائق القليلة الماضية، كما قد يُطلب منك تأكيد عملية إلغاء تثبيت البرنامج وأية اعتماديات مرتبطة به أيضًا. سيختفي البرنامج من قائمة باي عند اكتمال عملية إلغاء التثبيت، ولن تُحذف طبعًا أية ملفات كنت قد أنشأتها بهذا البرنامج، مثل الرسوميات أو الصور أو المستندات وغيرها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101218" href="https://academy.hsoub.com/uploads/monthly_2022_06/uninstall_package_09.png.07126b9280119b9964be5884daca569c.png" rel=""><img alt="uninstall_package_09.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101218" data-unique="wxbwxirvt" src="https://academy.hsoub.com/uploads/monthly_2022_06/uninstall_package_09.thumb.png.60a2a0c323e8a6f079d1758fb8a65635.png" style="width: 650px; height: auto;"></a>
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>تحذير:</strong> تظهر جميع البرامج المُثبتة على راسبيان في قوائم الأداة "إضافة / إزالة البرامج Add/Remove Software" بما في ذلك البرامج الضرورية لعمل راسبيري باي. قد تُحذف أحيانًا برامج وحزم برمجيات تؤثر على عمل سطح المكتب فلا تظهر بعد ذلك، ولتفادي هذا الأمر يجب عليك عدم إلغاء تثبيت أية برامج حتى تتأكد من أنك لن تحتاجها لاحقًا؛ وإذا حدث ذلك فجأةً، أعد تثبيت راسبيان وفقًا لإرشادات الفصل الثاني "<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AC%D9%85%D9%8A%D8%B9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%88%D8%A7%D9%84%D8%AA%D8%AD%D8%B6%D9%8A%D8%B1-%D9%84%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84%D9%87-r1370/" rel="">العمل على راسبيري باي</a>" من سلسلة <a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A%20%D8%A8%D8%A7%D9%8A/" rel="">دليل راسبيري باي</a> هذه، أو أعد تثبيت برنامج نوبس NOOBS كما شرحنا سابقًا.
		</p>
	</div>
</blockquote>

<p>
	ترجمة -وبتصرف- للملحقين Installing NOOBS to a microSD card و Installing and uninstalling software من كتاب <a href="https://www.raspberrypi.org/magpi-issues/Beginners_Guide_v2.pdf" rel="external nofollow">The Official Raspberry Pi Beginner's</a> Guide
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%B1%D8%A8%D8%B7-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7-%D9%85%D8%B9-%D9%84%D9%88%D8%AD%D8%A9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%88%D8%AA%D8%B4%D8%BA%D9%8A%D9%84%D9%87%D8%A7-r1601/" rel="">ربط كاميرا مع لوحة راسبيري باي وتشغيلها</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AC%D9%85%D9%8A%D8%B9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%88%D8%A7%D9%84%D8%AA%D8%AD%D8%B6%D9%8A%D8%B1-%D9%84%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84%D9%87-r1370/" rel="">تجميع راسبيري باي والتحضير لاستعماله</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%A7-%D9%87%D9%88-%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi%D8%9F-r1578/" rel="">ما هو حاسوب راسبيري باي Raspberry Pi؟</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1602</guid><pubDate>Sat, 18 Jun 2022 12:20:57 +0000</pubDate></item><item><title>&#x631;&#x628;&#x637; &#x643;&#x627;&#x645;&#x64A;&#x631;&#x627; &#x645;&#x639; &#x644;&#x648;&#x62D;&#x629; &#x631;&#x627;&#x633;&#x628;&#x64A;&#x631;&#x64A; &#x628;&#x627;&#x64A; &#x648;&#x62A;&#x634;&#x63A;&#x64A;&#x644;&#x647;&#x627;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%B1%D8%A8%D8%B7-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7-%D9%85%D8%B9-%D9%84%D9%88%D8%AD%D8%A9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%88%D8%AA%D8%B4%D8%BA%D9%8A%D9%84%D9%87%D8%A7-r1601/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_06/62a4801adff80_-------Raspberr-Pi-Raspberry-pi-4-Python-Thonny-scratch-Raspbian-Physical-computing-GPIO-Pins-Sense-HAT-HAT--.png.4d32a02cbd63b43ec3d6e6acf6cb9e61.png" /></p>

<p>
	تستطيع التقاط صورٍ عالية الدقة وتسجيل مقاطع فيديو باستخدام تجهيزة الكاميرا، التي تتصل مع باي Pi Camera Module وتساعدك في إنشاء مشاريع محتوًى بصري مميزة.
</p>

<p>
	إذا كنت مهتمًا بإنتاج محتوًى بصري مهم، أو "رؤية حاسوبية Computer Vision" كما تُعرف في حقل الروبوت، فستكون كاميرا باي بدايةً جيدة. تظهر التجهيزة على شكل دارة صغيرة مربعة الشكل لها كابل شريطي ribbon cable يمكن وصله إلى <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AC%D9%87%D8%A7%D8%B2-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi-r1356/" rel="">راسبيري باي</a> عبر المنفذ التسلسلي للكاميرا Camera Serial Interface -أو اختصارًا CSI-؛ مما يسمح لباي بالتقاط صورٍ ثابتة أو متحركة بدقةٍ عالية للاستخدامات المتنوعة.
</p>

<p>
	تُعرف كاميرا باي حتى لحظة تحرير هذه النسخة من الكتاب بأنها التجهيزة "v2" أو تجهيزة النسخة 2.1 المبنية على حساس الصورة "Sony IMX219"، وهو نفسه الحساس الذي قد تجده خلف هاتفك الذكي أو جهازك اللوحي. تصل دقة الحساس إلى 8 ميغا بكسل وهذا يعني أنه قادرٌ على التقاط صورٍ مكونة من 8 ملايين بيكسل pixel موزعةٍ إلى 3280 بيكسل عرضًا و2464 بيكسل طولًا (جداء الرقمين السابقين سيتجاوز قليلًا 8 ملايين). يمكن للكاميرا التقاط مقاطع فيديو إضافةً إلى الصور الثابتة وبدقة Full HD التي تعتمدها معظم أجهزة التلفاز بمعدلٍ يصل إلى 30 إطارًا في الثانية ليساعدك على إظهار حركةٍ سلسةٍ ويعزّز إمكانية تأثيرات الحركة البطيئة. يمكن رفع معدل الالتقاط إلى 60 إطارًا في الثانية بتخفيض الدقة إلى 720p وإلى 90 إطار في الثانية بتخفيض الدقة أكثر إلى 480p؛ وهي دقة منظومة VGA للشاشات التقليدية.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		أنواع الكاميرات: تتوفَّر نسختان من تجهيزة كاميرا باي، النسخة العادية "normal" والنسخة "NoIR"؛ حيث تُركّب النسخة العادية من الكاميرا على لوحةٍ خضراء؛ بينما تُركب النسخة "NoIR" على لوحةٍ سوداء. استخدم النسخة العادية إذا كنت تريد التقاط الصور والفيديوهات في بيئةٍ جيدة الإضاءة وستحصل على أفضل جودة للصور؛ بينما تساعدك النسخة "NoIR"( سمُيت كذلك لأنها لا تحتوي مُرشحًا للأشعة تحت الحمراء IR) على التقاط الصور في الظلام الدامس. لذلك يُفضّل استخدام النسخة "NoIR" إذا كنت تنوي تركيب كاميرا مراقبة أمنية أو أي مشروع يتطلب رؤيةً ليلية، وتذكر أنه عليك شراء منبعٍ للأشعة تحت الحمراء إذا كنت تنوي استخدامها.
	</p>
</blockquote>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101207" href="https://academy.hsoub.com/uploads/monthly_2022_06/pi_cam_0.png.26d5dc3f5452cc9734e34c266e1ee936.png" rel=""><img alt="pi_cam_0.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101207" data-unique="s6o53w6fg" src="https://academy.hsoub.com/uploads/monthly_2022_06/pi_cam_0.png.26d5dc3f5452cc9734e34c266e1ee936.png"></a>
</p>

<h2>
	تثبيت كاميرا راسبيري باي
</h2>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		الحصول على كاميرا: يمكنك شراء كاميرا راسبيري باي من أقرب متجر إلكترونيات أو طلبها على الإنترنت من أي موزعٍ محلي لديك.
	</p>
</blockquote>

<p>
	مثل تجهيزة إضافية، لا بدّ من فصل التغذية الكهربائية عن باي وسحب كابل التغذية قبل وصل تجهيزة الكاميرا. أوقف تشغيل راسبيري باي بالنقر على أيقونة راسبيري باي، ثم اختيار الأمر "إيقاف التشغيل Shutdown". انتظر حتى تتوقف باي عن العمل، ثم انزع كابل التغذية الكهربائية.
</p>

<p>
	افتح علبة الكاميرا وستجد دارةً صغيرةً مربعة هي الكاميرا نفسها وكابلًا شريطيًا سيكون متصلًا بالكاميرا في معظم الحالات. اقلب الكاميرا بحيث تواجه عدستها الأرض إذا لم يكن الكابل متصلًا بها، ثم ابحث عن وصلةٍ بلاستيكية مسطحة لها طرفان ناتئان قليلًا. اضغط على النتوئين للداخل واسحبهما للخلف، فيتحرك معك جزءٌ من الوصلة إلى الخارج. ازلق الكابل الشريطي في الوصلة بحيث تكون حافته الفضية إلى الأسفل والقطعة الزرقاء لطرفه نحو الأعلى، ثم ادفعه جيدًا في الوصلة وأعِد الجزء الذي سحبته إلى مكانه. يمكنك وصل أي من طرفي الكابل الشريطي إلى الكاميرا وتأكد عند وصله بأنه مركبٌ جيدًا، حيث يجب ألا يخرج من مكانه إذا حاولت سحبه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101199" href="https://academy.hsoub.com/uploads/monthly_2022_06/connecting_ribbon_cable_to_camera_01.png.dbdce6b0874fdfef57ea00da8cef5e6a.png" rel=""><img alt="connecting_ribbon_cable_to_camera_01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101199" data-unique="e361h3mrr" src="https://academy.hsoub.com/uploads/monthly_2022_06/connecting_ribbon_cable_to_camera_01.png.dbdce6b0874fdfef57ea00da8cef5e6a.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 1-8 توصيل الكابل الشريطي إلى الكاميرا
</p>

<p>
	سنركِّب الطرف الآخر على باي بنفس الطريقة. جد أولًا منفذ الكاميرا "CSI" وارفع الغطاء قليلًا إلى الأعلى، وقد يكون من الأسهل لو أخرجت باي من حاضنتها إن كنت تستخدم واحدة. ازلق كابل الكاميرا في الوضعية التي يكون فيها منفذ HDM لراسبيري باي متجهًا نحوك، ثم ادفع الغطاء بلطف إلى مكانه. تأكد عند وصل الكابل بأنه مركبٌ جيدًا، حيث يجب ألا يخرج من مكانه إذا حاولت سحبه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101200" href="https://academy.hsoub.com/uploads/monthly_2022_06/connecting_ribbon_cable_to_csi_02.png.9fa0d53744f732524d70f4bc1b96c9b5.png" rel=""><img alt="connecting_ribbon_cable_to_csi_02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101200" data-unique="lz1exd69v" src="https://academy.hsoub.com/uploads/monthly_2022_06/connecting_ribbon_cable_to_csi_02.png.9fa0d53744f732524d70f4bc1b96c9b5.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 2-8 توصيل الكابل الشريطي للكاميرا مع منفذ CSI لباي
</p>

<p>
	يأتي مع عدسة الكاميرا رقعةٌ بلاستيكية زرقاء لحمايتها من الخدش أثناء التصنيع والشحن والتركيب. جد النتوء الصغير على طرف الرقعة وانتزعه بلطف لتصبح الكاميرا جاهزةً للاستخدام.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تعديل ضبط العدسة: تُزوّد كاميرا راسبيري باي عادةً بحلقةٍ بلاستيكية مصممة لضبط العدسات (ضبط البعد المحرقي). وعلى الرغم من أن ضبط المصنع مثالي لاستخدام كاميرتك في اللقطات القريبة، سيتيح لك تدوير الحلقة إعادة ضبط العدسات يدويًا.
	</p>
</blockquote>

<p>
	صل التغذية الكهربائية مجددًا إلى باي واتركها حتى تحمّل راسبيان. لا بدّ من إخبار باي أنك وصلت الكاميرا لتتمكن من استخدامها. انقر على أيقونة راسبيري، ثم انتقل إلى فئة "تفضيلات preferences" وانقر على "إعداد راسبيري باي Raspberry Pi Configuration". انقر على نافذة "واجهات interfaces" في نافذة الأداة السابقة عندما يكتمل تحميلها، ثم ابحث عن "كاميرا Camera" وانقر على زر الخيارات الدائري إلى يسار الكلمة "تمكين Enabled" لتفعيله. انقر الزر "OK"، ستطلب منك الأداة إذنًا لإعادة تشغيل باي. دعها تفعل ذلك وستصبح الكاميرا جاهزةً عندما يقلع النظام من جديد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101202" href="https://academy.hsoub.com/uploads/monthly_2022_06/enable_camera_using_pi_config_03.png.85165a14f3865963fafde574624aad6b.png" rel=""><img alt="enable_camera_using_pi_config_03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101202" data-unique="6nszverfe" src="https://academy.hsoub.com/uploads/monthly_2022_06/enable_camera_using_pi_config_03.png.85165a14f3865963fafde574624aad6b.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 3-8 لا بدّ من تفعيل الكاميرا باستخدام أداة إعداد راسبيري باي
</p>

<h3>
	اختبار الكاميرا
</h3>

<p>
	للتأكد من تثبيت الكاميرا وتفعيل واجهتها على نحوٍ صحيح، يمكن استخدام أداة الصور الثابتة <strong>rapistill</strong> وأداة الفيديو <strong>raspivid</strong> المصممتين لالتقاط الصور من خلال تجهيزة الكاميرا باستخدام واجهة سطر الأوامر command-line interface -أو اختصارًا CLI-. لن تجد هاتين الأداتين مثل بقية البرامج ضمن قائمة راسبيري باي الرئيسية بل ينبغي تحميلهما من برنامج الطرفية "Terminal"، الذي تجده في فئة "البرامج الملحقة Accessories". بالنقر على البرنامج ستظهر نافذةٌ لها خلفيةٌ سوداء وأسطرٌ باللونين الأزرق والأخضر تمثًِل الطرفية التي تسمح لك بالتعامل مع واجهة سطر الأوامر.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101208" href="https://academy.hsoub.com/uploads/monthly_2022_06/terminal_window_04.png.bd5987da340ac28776dffe524162b298.png" rel=""><img alt="terminal_window_04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101208" data-unique="7slucwttu" src="https://academy.hsoub.com/uploads/monthly_2022_06/terminal_window_04.png.bd5987da340ac28776dffe524162b298.png" style="width: 500px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 4-8 نافذة برنامج الطرفية Terminal التي تسمح لك بالوصول إلى سطر الأوامر
</p>

<p>
	اكتب الأمر التالي في الطرفية لاختبار الكاميرا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5823_12" style="">
<span class="pln">raspistill </span><span class="pun">-</span><span class="pln">o test</span><span class="pun">.</span><span class="pln">jpg</span></pre>

<p>
	وبمجرد الضغط على المفتاح <strong>Enter</strong> ستظهر صورةٌ كبيرة لما تعرضه الكاميرا على الشاشة، ويُعرف ذلك باسم <strong>العرض المباشر</strong> والذي يستمر خمس ثوانٍ ما لم تحدد خلاف ذلك. تلتقط الكاميرا بعد 5 ثوان صورةً ثابتة لما تعرضه وتخزّنها في المجلد "home" باسم <code>test.jpg</code>. إذا أردت التقاط صورةٍ أخرى، نفِّذ التعليمة السابقة مجددًا ولا تنس تغيير اسم ملف الخرج بعد الخيار <code>o-</code> وإلا ستخزن الصورة الجديدة فوق القديمة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101203" href="https://academy.hsoub.com/uploads/monthly_2022_06/live_preview_05.png.adbe813f64c799ef0631e345971131b1.png" rel=""><img alt="live_preview_05.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101203" data-unique="3ro0y5wv1" src="https://academy.hsoub.com/uploads/monthly_2022_06/live_preview_05.png.adbe813f64c799ef0631e345971131b1.png" style="width: 650px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 5-8 العرض المباشر للكاميرا
</p>

<p>
	إذا كانت صورة العرض المباشر مقلوبةً رأسًا على عقب، فعليك تنبيه <code>raspistil</code> بأن الكاميرا مقلوبة. صُممت تجهيزة الكاميرا لكي يكون الكابل الشريطي خارجًا من الحافة السفلية؛ فإذا كان خارجًا من أحد جانبي أو من أعلى باي كما هو الحال في بعض الكاميرات التي ينتجها طرفٌ ثالث، فعليك تدوير الصورة 90 أو 180 أو 270 درجة باستخدام الخيار <code>rot-</code>. استخدم ببساطة الأمر التالي إذا خرجت الكاميرا من الأعلى:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5823_15" style="">
<span class="pln">raspistill </span><span class="pun">-</span><span class="pln">rot </span><span class="lit">180</span><span class="pln"> </span><span class="pun">-</span><span class="pln">o test</span><span class="pun">.</span><span class="pln">jpg</span></pre>

<p>
	بينما لو خرجت الكاميرا مع الشريط من الجانب الأيمن، دوّر الصورة 90 درجة؛ ودوّرها 270 درجة، إذا خرجت من الجانب الأيسر؛ وإذا كانت الزاوية الأصلية لالتقاط الصورة غير صحيحة استخدم الخيار <code>rot-</code> لتدويرها إلى وضعها الصحيح. لرؤية الصورة الملتقطة: افتح برنامج "مدير الملفات File Manager" من قائمة راسبيري فئة "برامج ملحقة Accessories"، ثم انتقل إلى المجلد "home/Pi" وستجد الصورة باسم "test.jpg". انقر على الصورة نقرًا مزدوجًا لفتحها ضمن برنامج "عارض الصور image viewer". تستطيع بالطبع إرسال الصورة عبر البريد الإلكتروني؛ أو رفعها إلى موقع ويب؛ أو نقلها إلى وسيط تخزين خارجي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101206" href="https://academy.hsoub.com/uploads/monthly_2022_06/62a474849fc72_opining_captured_image_06.png.6ad5d17c18b870f453adbf5322ac3580.png" rel=""><img alt="opining_captured _image_06.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101206" data-unique="25v8q4h3z" src="https://academy.hsoub.com/uploads/monthly_2022_06/62a474849fc72_opining_captured_image_06.png.6ad5d17c18b870f453adbf5322ac3580.png" style="width: 650px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 6-8 عرض الصورة الملتقطة
</p>

<h3>
	تعرف على مكتبة picamera
</h3>

<p>
	يعدّ استخدام مكتبة <a href="https://wiki.hsoub.com/Python" rel="external">بايثون</a> picamera الطريقة الأكثر مرونة في التحكم بتجهيزة كاميرا باي سواءً بالعرض المباشر أو بالتقاط الصور والفيديوهات، كما تسمح لك بدمج ما التقطته في برامجك الخاصة، وكذلك مع البرامج التي تستخدم المنصة GPIO من خلال مكتبة GPIO Zero.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		البرمجة بلغة بايثون: تفترض مشاريع هذا المقال أنك على درايةٍ وخبرة بلغة البرمجة بايثون وبيئة العمل المتكاملة ثوني Thonny، إضافةً إلى معرفتك بأرجل المنصة GPIO؛ فإذا لم تكن كذلك، ننصحك بالعمل أولًا على المشاريع المطروحة في المقال الخامس "<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1418/" rel="">البرمجة باستخدام بايثون</a>" والمقال السادس "<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%B1%D8%A8%D8%B7-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D8%A8%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D9%88%D8%A8%D8%B1%D9%85%D8%AC%D8%AA%D9%87%D8%A7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%D9%88%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r1496/" rel="">ربط راسبيري باي بعناصر إلكترونية وبرمجتها باستخدام سكراتش وبايثون</a>" من السلسلة.
	</p>
</blockquote>

<p>
	أغلق برنامج الطرفية إذا كان مفتوحًا بالنقر على زر الإغلاق X في أعلى يمين النافذة، ثم افتح ثوني بالطريقة المعتادة. أنشئ مشروعًا جديدًا واحفظه باسم "Camera". أدرج المكتبات التي يحتاجها برنامجك من خلال كتابة الأسطر التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5823_19" style="">
<span class="pln">from picamera </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">PiCamera</span><span class="pln">
from time </span><span class="kwd">import</span><span class="pln"> sleep
camera </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PiCamera</span><span class="pun">()</span></pre>

<p>
	يتيح لك سطر الشيفرة الأخير التحكم بتجهيزة الكاميرا من خلال الدالة <code>camera</code>. لتبدأ العرض، اكتب الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5823_21" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">start_preview</span><span class="pun">()</span><span class="pln">
sleep</span><span class="pun">(</span><span class="lit">10</span><span class="pun">)</span><span class="pln">
camera</span><span class="pun">.</span><span class="pln">stop_preview</span><span class="pun">()</span></pre>

<p>
	انقر على أيقونة التشغيل "Run" وسيختفي سطح المكتب ويحل مكانه عرضٌ مباشرٌ على كامل الشاشة لما تراه الكاميرا. حاول تحريك الكاميرا أو التلويح بيدك أمام عدساتها وستلاحظ تغيُّر الصورة المعروضة على الشاشة لتطابق التغيير الجاري. يتوقف العرض وينتهي تنفيذ برنامجك بعد عشر ثوانٍ.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101204" href="https://academy.hsoub.com/uploads/monthly_2022_06/live_preview_python_07.png.451280a1755a1482d70530be616c8da6.png" rel=""><img alt="live_preview_python_07.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101204" data-unique="vk9527yo3" src="https://academy.hsoub.com/uploads/monthly_2022_06/live_preview_python_07.png.451280a1755a1482d70530be616c8da6.png" style="width: 600px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 7-8 عرض ما تراه الكاميرا على كامل الشاشة.
</p>

<p>
	دوّر الصورة إذا ظهرت بزاوية عرضٍ خاطئة حتى تحصل على الاتجاه الصحيح وذلك باستخدام سطر الشيفرة التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5823_26" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">rotation </span><span class="pun">=</span><span class="pln"> </span><span class="lit">180</span></pre>

<p>
	بوضعه تحت السطر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5823_28" style="">
<span class="pln">camera </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PiCamera</span><span class="pun">()</span></pre>

<p>
	إذا كان العرض مقلوبًا رأسًا على عقب، ستجعله تعليمة الدوران السابقة بوضعه الصحيح. تسمح لك تعليمة الدوران بتدوير الصورة بزاوية 90 و 180 و 270 درجة، ويتعلق اختيار زاوية الدوران الصحيحة بمكان خروج كابل الكاميرا إذا كان من يمين تجهيزة الكاميرا أو أعلاها وهكذا. إذًا، تذكّر كتابة تعليمة دوران الصورة في بداية كل برنامج لتفادي العرض الخاطئ.
</p>

<h3>
	التقاط صور ثابتة
</h3>

<p>
	يتوجب تعديل برنامجك لالتقاط صورة وتخزينها بدلًا من عرض ما تراه الكاميرا فقط. ابدأ أولًا بتعديل قيمة التأخير الزمني <code>(10)sleep</code> إلى <code>(5)sleep</code>، ثم اكتب السطر التالي بعدها مباشرةً:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5823_30" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">capture</span><span class="pun">(</span><span class="str">'/home/pi/Desktop/image.jpg'</span><span class="pun">)</span></pre>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		وقت ضبط الصورة: تحلّل الكاميرا الفيديو وهي في وضع العرض لضبط إعداداتها على أفضل جودةٍ للصورة إذا احتاج الأمر. ستلاحظ ذلك في الظلام الدامس أو في ظروف الإضاءة الشديدة، حيث يكون من المستحيل رؤية ما تعرضه بداية ثم يصبح أوضح فجأة. لهذا السبب يُفضّل إضافة تأخيرٍ زمني مقداره 2 ثانية على الأقل قبل التقاط الصورة.
	</p>
</blockquote>

<p>
	تُخزّن الدالة صورةً ثابتة، ولا بدّ أن تحدد ضمنها اسم الصورة التي تلتقطها ومكان تخزينها. لاحظ أنك تخزن الصورة في الشيفرة السابقة على سطح المكتب، ابحث عنها في جوار "سلة المحذوفات Wastebasket". ابعد نافذة ثوني إذا كانت تعيق الرؤية، ثم انقر على ملف الصورة التي التقطها برنامجك لتراها.
</p>

<p>
	تهانينا، لقد كتبت أولى برامجك للكاميرا!
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101205" href="https://academy.hsoub.com/uploads/monthly_2022_06/opening_image_08.png.26fc220785d52cd5e6286c5d9b1498bf.png" rel=""><img alt="opening_image_08.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101205" data-unique="exsgm78uh" src="https://academy.hsoub.com/uploads/monthly_2022_06/opening_image_08.png.26fc220785d52cd5e6286c5d9b1498bf.png" style="width: 650px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 8-8 فتح الصورة التي التقطتها
</p>

<h3>
	التقاط مقاطع فيديو
</h3>

<p>
	تستطيع أيضًا تصوير مقاطع فيديو وتخزينها. احذف كل الشيفرة بين الدالتين <code>()camera.start_preview</code> و<code>()camera.stop_preview</code>، ثم اكتب الشيفرة التالية تحت الدالة الأولى:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5823_34" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">start_recording</span><span class="pun">(</span><span class="str">'/home/pi/Desktop/video.h264'</span><span class="pun">)</span><span class="pln"> 
sleep</span><span class="pun">(</span><span class="lit">10</span><span class="pun">)</span><span class="pln"> 
camera</span><span class="pun">.</span><span class="pln">stop_recording</span><span class="pun">()</span></pre>

<p>
	تعرض الكاميرا ما تراه كما في الحالة السابقة لكنها تسجل في نفس الوقت مقطع فيديو في ملفٍ على سطح المكتب. ستستمر العملية 10 ثوان، لذلك قد تفكر في فعل شيءٍ ما أمام الكاميرا ليبدو الفيديو أكثر تشويقًا، وسيتوقف بعد ذلك التسجيل. يمكنك حينها العودة إلى سطح المكتب ومتابعة الفيديو، حيث ستجده باسم "video.h264"، وستظهر رسالةٌ لطيفة على الطرفية عند انتهاء عرض الفيديو.
</p>

<p>
	تهانينا، ستلتقط من الآن فصاعدًا مقاطع فيديو باستخدام كاميرا باي!
</p>

<h2>
	زر لتحريك الرسوميات
</h2>

<p>
	سنحاول تصميم مشروعٍ مميز اعتمادًا على ما تعلمته في هذا المقال وخبرتك التي اكتسبتها في توصيل المكوّنات الفيزيائية إلى أرجل المنصة GPIO. سنُصمم استوديو خاص بك لتحريك الرسوميات والصور؛ حيث تمثّل تحريك الرسوميات عملية التقاط الكثير من الصور المتلاحقة لغرضٍ ما أو لشخص، ومن ثم تحريك الصور بتتابعٍ معين ليظهر الغرض وكأنه يتحرك. وبالطبع سترى أن الغرض ساكن إذا نظرت إلى كل صورةٍ على حدى؛ ولكن إذا عرضتها على نحوٍ متتابع بسرعة، فسيبدو وكأنه يتحرك وبالسرعة التي تريد.
</p>

<p>
	ستحتاج في هذا المشروع إلى:
</p>

<ul>
<li>
		زر كبس Push button.
	</li>
	<li>
		لوحة اختبار.
	</li>
	<li>
		أسلاك بوصلات طرفية "M2M".
	</li>
	<li>
		زوج أسلاك بوصلات طرفية "M2F".
	</li>
	<li>
		أسلاك بوصلات "F2F"، إذا لم تستخدم لوحة الاختبار، وبالطبع سيصعب عليك عندها ضغط الزر براحة.
	</li>
</ul>
<p>
	إذا أردت أن تتذكر أية معلومات عن هذه المكوّنات، عليك مراجعة مقال "<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%B1%D8%A8%D8%B7-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D8%A8%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D9%88%D8%A8%D8%B1%D9%85%D8%AC%D8%AA%D9%87%D8%A7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%D9%88%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r1496/" rel="">البرمجة الفيزيائية باستخدام سكراتش وبايثون</a>".
</p>

<p>
	ستحتاج الآن إلى أغراض لتحريكها والتي قد تكون أي شيء، مثل لعبة أو زهرة أو شخصية. جمِّع الدارة أولًا بتثبيت الزر على لوحة الاختبار، ثم صِل مسار التغذية السالب للوحة مع أحد أرجل الأرضية GND للمنصة GPIO بواسطة سلك M2F. استخدم سلك M2M لوصل أحد أرجل الزر بمسار التغذية السالب للوحة وسلك M2F لوصل رجله الأخرى بالرجل GP2 للمنصة GPIO.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101198" href="https://academy.hsoub.com/uploads/monthly_2022_06/connecting_push_button_09.png.39626a950a30732defbfa624e33e522f.png" rel=""><img alt="connecting_push_button_09.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101198" data-unique="t0t06x680" src="https://academy.hsoub.com/uploads/monthly_2022_06/connecting_push_button_09.png.39626a950a30732defbfa624e33e522f.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	الشكل 9-8 وصل الزر إلى أحد أرجل المنصة GPIO
</p>

<p>
	أنشئ مشروعًا جديدًا في ثوني واحفظه باسم "Stop Motion"، وابدأ بإدراج المكتبات اللازمة لعمل الكاميرا ومنصة GPIO:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5823_37" style="">
<span class="pln">from picamera </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">PiCamera</span><span class="pln">
from gpiozero </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Button</span><span class="pln">
camera </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PiCamera</span><span class="pun">()</span><span class="pln"> 
button </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Button</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span></pre>

<p>
	اكتب الآن الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5823_39" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">start_preview</span><span class="pun">()</span><span class="pln"> 
button</span><span class="pun">.</span><span class="pln">wait_for_press</span><span class="pun">()</span><span class="pln">
camera</span><span class="pun">.</span><span class="pln">capture</span><span class="pun">(</span><span class="str">'/home/pi/Desktop/image.jpg'</span><span class="pun">)</span><span class="pln">
camera</span><span class="pun">.</span><span class="pln">stop_preview</span><span class="pun">()</span></pre>

<p>
	انقر على أيقونة التشغيل وسيظهر على الشاشة العرض المباشر لما تراه الكاميرا؛ حيث سيبقى العرض على الشاشة مستمرًا حتى تضغط على الزر ليختفي العرض المباشر وينتهي برنامجك بعد أن يخزّن الصورة الملتقطة على سطح المكتب. ابحث عن الصورة التي تحمل الاسم "image.jpg" وحاول فتحها للتأكد أن البرنامج يعمل على مايرام.
</p>

<p>
	يتطلب تحريك الرسوميات إنشاء كثيرٍ من الصور لتعطي انطباعًا بالحركة عندما تعرض على نحوٍ متتالي، ولهذا ستحتاج إلى مجلدٍ خاص على سطح المكتب لتخزين جميع هذه الصور. انقر على سطح المكتب بالزر اليميني في أي مكانٍ فارغ، ثم اختر الأمر "إنشاء Create New" ثم "مجلد Folder" وسمِّه "animation" (استخدم أحرف صغيرةً بالكامل)، ثم انقر الزر "OK".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101201" href="https://academy.hsoub.com/uploads/monthly_2022_06/create_new_animi_folder_10.png.78c3f5b078fcba25ed257f34cbcf425d.png" rel=""><img alt="create_new_animi_folder_10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101201" data-unique="0yejos46k" src="https://academy.hsoub.com/uploads/monthly_2022_06/create_new_animi_folder_10.png.78c3f5b078fcba25ed257f34cbcf425d.png" style="width: 650px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 10-8 إنشاء مجلد جديد لتخزين الصور التي تلتقطها الكاميرا.
</p>

<p>
	ليس مريحًا إعادة تشغيل برنامجك في كل مرة تلتقط فيها صورة، لذا لا بدّ من تغييره ليستخدم حلقة. وعلى خلاف الحلقات التي استخدمناها سابقًا ستحتاج إلى حلقةٍ تنهي العملية بسلاسة؛ فلو أوقفت البرنامج والكاميرا في حالة العرض المباشر، فلن تكون قادرًا على الوصول إلى سطح المكتب بعده! ستحتاج لإنجاز الأمر إلى تعليمتي <code>try</code> و<code>except</code>.
</p>

<p>
	احذف كل الشيفرة التي تأتي بعد الدالة <code>camera.start_preview</code>، ثم اكتب:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5823_42" style="">
<span class="pln">frame </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span></pre>

<p>
	تُنشئ هذه التعليمة المتغير الجديد <code>frame</code> وتسند له القيمة <code>1</code>. يخزِّن البرنامج في هذا المتغير رقم الإطار الحالي وسنستخدمه للتأكُّد من تخزين ملفٍ جديد كل مرة وإلا ستُخزن الصور فوق بعضها كلما ضُغط الزر.
</p>

<p>
	سننشئ الآن الحلقة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5823_44" style="">
<span class="kwd">while</span><span class="pln"> </span><span class="typ">True</span><span class="pun">:</span><span class="pln">    
    </span><span class="kwd">try</span><span class="pun">:</span></pre>

<p>
	تخبر التعليمة <code>try</code> بايثون بأن ينفذ ما بداخلها من التعليمات، والتي ستكون تعليمات التقاط الصورة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5823_47" style="">
<span class="pln">        button</span><span class="pun">.</span><span class="pln">wait_for_press</span><span class="pun">()</span><span class="pln">
        camera</span><span class="pun">.</span><span class="pln">capture</span><span class="pun">(</span><span class="str">'/home/pi/Desktop/animation/frame%03d.jpg'</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> frame</span><span class="pun">)</span><span class="pln"> 
        frame </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span></pre>

<p>
	نلفت انتباهك إلى عدة حيلٍ ذكية في الشيفرة السابقة وأولها استخدام التعبير <code>03d%</code>؛ والذي يسمح بإضافة أصفارٍ إلى عددٍ ليُكتب بثلاث خانات؛ أي سيُكتب العدد "1" على النحو التالي "001"، ويكتب العدد "12" على النحو التالي "012". يساعدك هذا الحل على تخزين الصورة وفق الترتيب الصحيح دون أن تخزّن فوق بعضها. أما التعليمة <code>frame%</code> في آخر السطر ستجعل <a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">بايثون</a> يستخدم رقم الإطار اسمًا لملف الصورة الملتقطة. يزيد السطر الذي يليه قيمة المتغير <code>frame</code> بمقدار واحد فستتحول قيمته من <code>1</code> إلى <code>2</code> عند أول ضغطة على الزر وهكذا. سنستخدم التعليمة <code>except</code> لتحديد نهاية عملية التقاط الصور وتخزينها. اكتب الشيفرة التالية منتبهًا للإزاحة؛ ولذلك أزِل مستوًى واحدًا من المسافة البادئة في السطر الأول حتى يعرف بايثون أنها ليست جزءًا من <code>try</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_53" style="">
<span class="pln">    </span><span class="kwd">except</span><span class="pln"> </span><span class="typ">KeyboardInterrupt</span><span class="pun">:</span><span class="pln">        
        camera</span><span class="pun">.</span><span class="pln">stop_preview</span><span class="pun">()</span><span class="pln">        
        </span><span class="kwd">break</span></pre>

<p>
	سيبدو البرنامج الكامل على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_51" style="">
<span class="kwd">from</span><span class="pln"> picamera </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">PiCamera</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> time </span><span class="kwd">import</span><span class="pln"> sleep
</span><span class="kwd">from</span><span class="pln"> gpiozero </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Button</span><span class="pln">
camera </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PiCamera</span><span class="pun">()</span><span class="pln">
button </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Button</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span><span class="pln">
camera</span><span class="pun">.</span><span class="pln">start_preview</span><span class="pun">()</span><span class="pln">
frame </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">    
    </span><span class="kwd">try</span><span class="pun">:</span><span class="pln">        
        button</span><span class="pun">.</span><span class="pln">wait_for_press</span><span class="pun">()</span><span class="pln"> 
        camera</span><span class="pun">.</span><span class="pln">capture</span><span class="pun">(</span><span class="str">'/home/pi/Desktop/animation/frame%03d.jpg'</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> frame</span><span class="pun">)</span><span class="pln">        
        frame </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">    
    </span><span class="kwd">except</span><span class="pln"> </span><span class="typ">KeyboardInterrupt</span><span class="pun">:</span><span class="pln">        
        camera</span><span class="pun">.</span><span class="pln">stop_preview</span><span class="pun">()</span><span class="pln">        
        </span><span class="kwd">break</span></pre>

<p>
	انقر على أيقونة التشغيل "Run"، ثم اضغط مفتاحي لوحة المفاتيح "Ctrl" و"C". ليس بالضرورة ضغط المفتاحين معًا فيكفي ضغط "Ctrl" باستمرار ثم ضغط "C" وتحرير المفتاحين بعدها. ينفِّذ هذان الزران معًا ما يُسمى مقاطعة interrupt مصدرها لوحة المفاتيح لإيقاف عمل البرنامج. وهذا ما يفعله تمامًا السطر:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_69" style="">
<span class="pln">    </span><span class="kwd">except</span><span class="pln"> </span><span class="typ">KeyboardInterrupt</span><span class="pun">:</span><span class="pln"> </span></pre>

<p>
	حيث تتوقف عملية التقاط الصور مباشرةً عندما ننفِّذ طلب مقاطعةً بواسطة لوحة المفاتيح؛ وإلا ستعيق نافذة العرض المباشر للكاميرا الوصول إلى سطح المكتب إذا أنهيت البرنامج بالنقر على أيقونة الإيقاف "Stop".
</p>

<p>
	على الرغم من تنفيذ بايثون لأية شيفرات صحيحة، لكن في حالتنا يأتي أمر الإيقاف من الشيفرة التي ستنهي العرض المباشر للكاميرا ومن ثم توقِف البرنامج على النحو الصحيح. وهكذا ستكون مستعدًا الآن لتحريك الرسوميات.
</p>

<p>
	ثبِّت الكاميرا في مكانٍ مناسب لالتقاط صورة الغرض الذي تريد تحريكه، وتأكد بأنه ثابت لا يتحرك، فإذا تحركت الكاميرا ستُفسد العملية. ضع الغرض في موقعه الأولي، ثم انقر أيقونة التشغيل وراقب العرض المباشر للكاميرا لتتأكد أن كل شيء في مكانه الصحيح. اضغط الزر لالتقاط أول صورة (أول إطار)، ثم حرِّك الغرض بلطف؛ فكلما كان اختلاف الموقع بين الصورتين ضئيًلا كان الرسم المتحرك الناتج أكثر نعومة. اضغط الزر مرةً أخرى لالتقاط الإطار الثاني وحرِّك الغرض وهكذا كرّر العملية حتى تنتهي. كلما زاد عدد الصور المُلتقطة، كلما زادت مدة الرسم المتحرك الذي تصممه. اضغط مفتاحي لوحة المفاتيح "Ctrl+C" لإيقاف البرنامج ثم افتح المجلد "animation" على سطح المكتب بالنقر المزدوج عليه. تحقق من أي صورة بالنقر عليها نقرًا مزدوجًا واستعراض تفاصيلها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101197" href="https://academy.hsoub.com/uploads/monthly_2022_06/captrd_images_folder_11.png.08de51056ac013e0343d3ee508f4983e.png" rel=""><img alt="captrd_images_folder_11.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101197" data-unique="02k60qjv6" src="https://academy.hsoub.com/uploads/monthly_2022_06/captrd_images_folder_11.png.08de51056ac013e0343d3ee508f4983e.png" style="width: 650px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 11-8 الصور الملتقطة في المجلد المخصص لها
</p>

<p>
	ليس لدينا حتى اللحظة سوى مجلدٍ ممتلئ بالصور الثابتة ولا بدّ من تحويلها إلى فيديو لكي ننشئ الرسم المتحرك الذي نريده. لذلك، انقر على أيقونة باي وانتقل إلى فئة "البرامج الملحقة Accessories"، ثم انقر على برنامج الطرفية "terminal" التي تمثّل واجهة سطر الأوامر(ستُناقش بمزيدٍ من التفصيل في الملحق "C"). بعد أن يكتمل تحميل برنامج الطرفية استخدم الأمر التالي للانتقال إلى المجلد "animation" على سطح المكتب:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_71" style="">
<span class="pln">cd </span><span class="typ">Desktop</span><span class="pun">/</span><span class="pln">animation</span></pre>

<p>
	وانتبه أن يكون الحرف <code>D</code> في كلمة <code>Desktop</code> كبيرًا؛ لأن راسبيان حساسٌ لحالة الأحرف فلن يعمل أي أمر إذا لم تكتبه تمامًا كما هو في الأصل. عندما تنتقل إلى المجلد المطلوب اكتب الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_60" style="">
<span class="pln">avconv </span><span class="pun">-</span><span class="pln">r </span><span class="lit">1</span><span class="pln"> </span><span class="pun">-</span><span class="pln">i frame</span><span class="pun">%</span><span class="lit">03d</span><span class="pun">.</span><span class="pln">jpg </span><span class="pun">-</span><span class="pln">r </span><span class="lit">10</span><span class="pln"> animation</span><span class="pun">.</span><span class="pln">h264</span></pre>

<p>
	يحمل الأمر السابق البرنامج <code>avconv</code>، الذي يقرأ الصور الثابتة من المجلد ويحوّلها إلى فيديو يُدعى <code>animation.h264</code>. قد يستغرق الأمر عدة دقائق وفقًا لعدد الصور الثابتة في المجلد؛ وستعرف أنه انتهى من عمله عندما ترى محث الطرفية يومض في سطرٍ جديد. ابحث عن الملف "animation.h264" في مجلد الصور وانقر عليه نقرًا مزدوجًا لتشغيله، كما يمكنك استخدام الطرفية بكتابة الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_62" style="">
<span class="pln">omxplayer animation</span><span class="pun">.</span><span class="pln">h264</span></pre>

<p>
	بمجرد تحميل الفيديو سترى ما أنجزته. تهانينا، لقد حولت باي إلى أداة لإنشاء الرسوم المتحركة.
</p>

<p>
	إذا رأيت أن الفيديو سريع كثيرًا أو بطيء كثيرًا، غيِّر الخيار <code>r 10-</code> في تعليمة تشغيل البرنامج <code>avconv</code> زيادةً أو نقصانًا؛ حيث يتحكم هذا الخيار بمعدل الإطارات المعروضة في الثانية. كلما زاد المعدل كلما كان الفيديو أكثر دقة وسلاسة لكنه سيعرض مشاهدًا أقل في حجم محدد للمقطع. والعكس صحيح، فنقصان المعدل يجعل الملف أقل نعومة لكنه سيعرض مشاهدًا أكثر في نفس الحجم. إذا أردت أخيرًا حفظ مقطع الفيديو انقله إلى المجلد "فيديوهات Videos" وإلا سيُسجَّل مقطع فيديو جديد فوقه في كل مرةٍ تشغِّل فيها برنامجك.
</p>

<h3>
	الإعدادات المتقدمة للكاميرا
</h3>

<p>
	إذا أردت التمتُّع بقدرةٍ أكبر على التحكم بإعدادات تجهيزة كاميرا راسبيري باي، يمكنك الاستفادة من مكتبة picamera في بايثون للوصول إلى الإعدادات المختلفة للكاميرا، وقد فصلنا فيما يلي هذه الإعدادات مع قيمها الافتراضية لتستخدمها لاحقًا في برامجك:
</p>

<h4>
	إعداد الموازنة التلقائية للون الأبيض camera.awb_mode
</h4>

<p>
	يضبط هذا الإعداد الموازنة التلقائية للون الأبيض في الكاميرا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_65" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">awb_mode </span><span class="pun">=</span><span class="pln"> </span><span class="str">'auto’</span></pre>

<p>
	ويُضبط على أحد الخيارات التالية:
</p>

<ul>
<li>
		<code>off</code>
	</li>
	<li>
		<code>auto</code> افتراضي.
	</li>
	<li>
		<code>sunlight</code>
	</li>
	<li>
		<code>cloudy</code>
	</li>
	<li>
		<code>shade</code>
	</li>
	<li>
		<code>tungsten</code>
	</li>
	<li>
		<code>fluorescent</code>
	</li>
	<li>
		<code>incandescent</code>
	</li>
	<li>
		<code>flash</code>
	</li>
	<li>
		<code>horizon</code>
	</li>
</ul>
<p>
	بدِّل بين الخيارات السابقة إذا رأيت الصورة مائلةً للزرقة أو الاصفرار.
</p>

<h4>
	إعداد الإضاءة camera.brightness
</h4>

<p>
	يحدّد مقدار إضاءة الصورة الملتقطة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_76" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">brightness </span><span class="pun">=</span><span class="pln"> </span><span class="lit">50</span></pre>

<p>
	حيث تكون الصورة مظلمةً عندما تكون قيمة الإعداد <code>0</code> وشديدة الإضاءة (أقرب إلى اللون الأبيض) عندما تكون قيمته <code>100</code>.
</p>

<h4>
	إعداد التأثيرات اللونية camera.color_effects
</h4>

<p>
	يغيّر هذا الإعداد التأثيرات اللونية التي تستخدمها الكاميرا، حيث يُترك هذا الإعداد عادةً دون تغيير.
</p>

<pre class="ipsCode">
camera.color_effetcs = None
</pre>

<p>
	لكن إن زوّدت الإعداد بزوجٍ من الأرقام، سيغير ذلك طريقة تسجيل الكاميرا للألوان. حاول أن تضع القيمة <code>(128،128)</code> لإنتاج صورٍ بالأبيض والأسود.
</p>

<h4>
	إعداد وضوح الصورة camera.contrast
</h4>

<p>
	يضبط هذا الإعداد وضوح الصورة؛ حيث تجعل القيم العالية الصورة أكثر حيوية؛ بينما تجعل القيم المنخفضة الصورة باهتةً جدًا. يمكنك استخدام قيم بين <code>100-</code> وهي القيمة الدنيا و <code>100</code> وهي أعلى قيمة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_78" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">contrast </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span></pre>

<h4>
	إعداد القص camera.crop
</h4>

<p>
	يسمح لك بقص أجزاءٍ من الصورة من الأطراف أو الأعلى والتقاط الجزء الذي تريده من الصورة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_80" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">crop </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">)</span></pre>

<p>
	حيث تمثّل الأرقام ما بين القوسين إحداثيات X و Y والعرض والارتفاع. تُلتقط الصورة افتراضيًا بأكملها، لكن إن أردت رؤية تأثير هذا الإعداد، حاول تغيير آخر قيمتين إلى <code>0.5-</code> و <code>0.5</code>.
</p>

<h4>
	إعداد التعويضات camera.exposure_compensation
</h4>

<p>
	يضبط يدويًا كمية الضوء الواصل إلى حساس الكاميرا الضوئي عند التقاط الصورة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_82" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">exposure_compensation </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span></pre>

<p>
	وعلى خلاف تغيير السطوع brightness يتحكم هذا الإعداد بالكاميرا نفسها وليس بالصورة، ويأخذ قيمه بين <code>25-</code> (معتمٌ جدًا) إلى <code>25</code> (ساطع جدًا).
</p>

<h4>
	إعداد درجة الإضاءة camera.exposure_mode
</h4>

<p>
	يضبط نمط التعرض الضوئي exposure (نمط تحديد كمية الضوء التي تصل إلى الحساس الضوئي للكاميرا) أو المنطق الذي تتبعه الكاميرا في تحديد هذه الكمية.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_84" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">exposure_mode </span><span class="pun">=</span><span class="pln"> </span><span class="pun">‘</span><span class="pln">auto</span><span class="pun">’</span></pre>

<p>
	يأخذ هذا الإعداد هذه القيم:
</p>

<ul>
<li>
		<code>off</code>
	</li>
	<li>
		<code>auto</code> افتراضي
	</li>
	<li>
		<code>night</code>
	</li>
	<li>
		<code>backlight</code>
	</li>
	<li>
		<code>spotlight</code>
	</li>
	<li>
		<code>sports</code>
	</li>
	<li>
		<code>snow</code>
	</li>
	<li>
		<code>beach</code>
	</li>
	<li>
		<code>verylong</code>
	</li>
	<li>
		<code>fixedfps</code>
	</li>
	<li>
		<code>antishake</code>
	</li>
	<li>
		<code>fireworks</code>
	</li>
</ul>
<h4>
	إعداد معدل التقاط الإطارات camera.framerate
</h4>

<p>
	يحدِّد عدد الصور التي تلتقطها الكاميرا في الثانية عند تصوير مقطع فيديو أو ما يسمى معدل التقاط الإطارات.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_86" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">framerate </span><span class="pun">=</span><span class="pln"> </span><span class="lit">30</span></pre>

<p>
	تسمح لك المعدلات العالية بالتقاط فيديوهات أكثر نعومة، لكنها تستهلك حجمًا أكبر في الذاكرة. وبالتالي يرتبط المعدل الالتقاط العالي بانخفاض الدقة المستخدمة التي يمكن التحكم بها أيضًا من خلال الإعداد "camera.resolution".
</p>

<h4>
	إعداد القلب الأفقي camera.hflip
</h4>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_88" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">hflip </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">False</span></pre>

<p>
	يقلب هذا الخيار الصورة الملتقطة أفقيًا أو بالنسبة للمحور X عندما يأخذ القيمة <code>True</code>.
</p>

<h4>
	إعداد التأثيرات camera.image_effect
</h4>

<p>
	يطبق هذا الإعداد مجالًا من التأثيرات على تيار الفيديو والتي ستظهر في العرض المباشر وفي الصور والفيديوهات المخزّنة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_90" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">image_effect </span><span class="pun">=</span><span class="pln"> </span><span class="pun">‘</span><span class="pln">none</span><span class="pun">’</span></pre>

<p>
	هذه التأثيرات هي:
</p>

<ul>
<li>
		<code>blur</code>
	</li>
	<li>
		<code>cartoon</code>
	</li>
	<li>
		<code>colorbalance</code>
	</li>
	<li>
		<code>colorpoint</code>
	</li>
	<li>
		<code>colorswap</code>
	</li>
	<li>
		<code>deinterlace1</code>
	</li>
	<li>
		<code>deinterlace2</code>
	</li>
	<li>
		<code>denoise</code>
	</li>
	<li>
		<code>emboss</code>
	</li>
	<li>
		<code>film</code>
	</li>
	<li>
		<code>gpen</code>
	</li>
	<li>
		<code>hatch</code>
	</li>
	<li>
		<code>negative</code>
	</li>
	<li>
		<code>none</code>
	</li>
	<li>
		<code>oilpaint</code>
	</li>
	<li>
		<code>pastel</code>
	</li>
	<li>
		<code>posterise</code>
	</li>
	<li>
		<code>saturation</code>
	</li>
	<li>
		<code>sketch</code>
	</li>
	<li>
		<code>solarize</code>
	</li>
	<li>
		<code>washedout</code>
	</li>
	<li>
		<code>watercolor</code>
	</li>
</ul>
<h4>
	إعداد camera.ISO
</h4>

<p>
	يغيّر إعدادات ISO للكاميرا والتي تؤثر على حساسيتها للضوء.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_92" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">ISO </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span></pre>

<p>
	تضبط الكاميرا هذا الإعداد تلقائيًا وفقًا لكمية الضوء المتاحة. كما يمكنك ضبطه يدويًا باختيار أحد القيم التالية: 100 أو 200 أو 320 أو 400 أو 500 أو 640 أو 800؛ وكلما زادت القيمة تحسَّن أداء الكاميرا في ظروف الإضاءة المنخفضة؛ لكن ستزداد في المقابل خشونة الصور أو الفيديوهات الملتقطة.
</p>

<h4>
	إعداد camera.meter_mode
</h4>

<p>
	يتحكم بكيفية تحديد الكاميرا لكمية الضوء المتاح عندما تضبط مقدار تعرضها للضوء.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_94" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">meter_mode </span><span class="pun">=</span><span class="pln"> </span><span class="pun">‘</span><span class="pln">average</span><span class="pun">’</span></pre>

<p>
	تقسِّم الكاميرا افتراضيًا كمية الضوء التي تصلها بالتساوي على كامل الصورة. وإليك بقية الخيارات:
</p>

<ul>
<li>
		<code>backlit</code>
	</li>
	<li>
		<code>matrix</code>
	</li>
	<li>
		<code>spot</code>
	</li>
</ul>
<h4>
	إعداد الدقة camera.resolution
</h4>

<p>
	يضبط هذا الإعداد دقة الصورة أو الفيديو المُلتقط على هيئة زوجٍ من الأعداد يمثّلان العرض والارتفاع.
</p>

<pre class="ipsCode">
camera.resolution = (1920,1080)
</pre>

<p>
	يُساعدك اختيار دقةٍ منخفضة على توفير مساحة التخزين وزيادة معدل الالتقاط؛ بينما تسمح لك الدقة العالية في زيادة جودة الصورة لكنها تستهلك مساحة تخزينٍ أكبر.
</p>

<h4>
	إعداد التدوير camera.rotation
</h4>

<p>
	يتحكم بزاوية تدوير الصورة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_96" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">rotation </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span></pre>

<p>
	يأخذ هذا الإعداد قيمًا من 0 درجة مرورًا بالزاوية 90 و 180 و 270 رجوعًا إلى 0. استخدم هذا الخيار عندما لا تكون قادرًا على ضبط موقع الكاميرا وخرج الكابل من أسفل التجهيزة.
</p>

<h4>
	إعداد الإشباع camera.saturation
</h4>

<p>
	يضبط هذا الإعداد درجة إشباع الصورة أو درجة وضوح الألوان ويأخذ قيمًا بين 100- و 100.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_98" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">saturation </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span></pre>

<h4>
	إعداد الحدة camera.sharpness
</h4>

<p>
	يضبط هذا الإعداد حدة تمايز ألوان الصورة ويأخذ قيمًا بين 100- و 100.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_100" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">sharpness </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span></pre>

<h4>
	إعداد سرعة الغالق camera.shutter_speed
</h4>

<p>
	يحدد سرعة فتح وإغلاق غالق الكاميرا shutter عند التقاط صورة أو فيديو.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_102" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">shutter_speed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span></pre>

<p>
	يمكن ضبط هذا الإعداد يدويًا بواحدة الميكرو ثانية، وكلما زادت مدة بقاء الغالق مفتوحًا كان ذلك أفضل للبيئات المنخفضة الإضاءة والعكس صحيح في البيئات عالية السطوع؛ ويفضل أن يبقى هذا الخيار على وضعه الافتراضي بحيث يُضبط من قِبل الكاميرا تلقائيًا.
</p>

<h4>
	إعداد القلب العمودي camera.vflip
</h4>

<p>
	يقلب هذا الخيار الصورة الملتقطة عموديًا أو بالنسبة للمحور Y عندما يأخذ القيمة <code>True</code>.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_104" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">vflip</span><span class="pun">=</span><span class="pln"> </span><span class="kwd">False</span></pre>

<h4>
	إعداد التثبيت camera.video_stabilization
</h4>

<p>
	يفعِّل هذا الخيار تقنية تثبيت الفيديو عندما يأخذ القيمة <code>True</code>.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5823_108" style="">
<span class="pln">camera</span><span class="pun">.</span><span class="pln">video_stabilization </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">False</span></pre>

<p>
	فعّل هذا الخيار عندما تتحرك الكاميرا أثناء التسجيل كأن تكون مرتبطة بروبوت أو محمولة باليد، وذلك لتخفيف الاهتزازات في مقطع الفيديو الذي تصوره.
</p>

<p>
	يمكنك الاطلاع على مزيدٍ من المعلومات عن الإعدادات السابقة والإعدادات التي لم نذكرها على الموقع الرسمي للمكتبة <a href="picamera.readthedocs.io" rel="">picamera</a>
</p>

<p>
	ترجمة -وبتصرف- للفصل الثامن "The Raspberry Pi Camera Module" من كتاب <a href="https://www.raspberrypi.org/magpi-issues/Beginners_Guide_v2.pdf" rel="external nofollow">The official Raspberry Pi beginner's guide</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-%D8%A7%D9%84%D9%81%D9%8A%D8%B2%D9%8A%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%85%D8%B9-%D9%84%D9%88%D8%AD%D8%A9-%D8%B3%D9%86%D8%B3-%D9%87%D8%A7%D8%AA-sense-hat-r1600/" rel="">الحوسبة الفيزيائية: برمجة راسبيري باي مع لوحة سنس هات Sense HAT</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D8%AF%D8%A1-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1497/" rel="">بدء استخدام راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AC%D9%87%D8%A7%D8%B2-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi-r1356/" rel="">تعرف على جهاز راسبيري باي Raspberry Pi</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AC%D9%85%D9%8A%D8%B9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%88%D8%A7%D9%84%D8%AA%D8%AD%D8%B6%D9%8A%D8%B1-%D9%84%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84%D9%87-r1370/" rel="">تجميع راسبيري باي والتحضير لاستعماله</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1601</guid><pubDate>Sat, 11 Jun 2022 11:44:38 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62D;&#x648;&#x633;&#x628;&#x629; &#x627;&#x644;&#x641;&#x64A;&#x632;&#x64A;&#x627;&#x626;&#x64A;&#x629;: &#x628;&#x631;&#x645;&#x62C;&#x629; &#x631;&#x627;&#x633;&#x628;&#x64A;&#x631;&#x64A; &#x628;&#x627;&#x64A; &#x645;&#x639; &#x644;&#x648;&#x62D;&#x629; &#x633;&#x646;&#x633; &#x647;&#x627;&#x62A; Sense HAT</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-%D8%A7%D9%84%D9%81%D9%8A%D8%B2%D9%8A%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%85%D8%B9-%D9%84%D9%88%D8%AD%D8%A9-%D8%B3%D9%86%D8%B3-%D9%87%D8%A7%D8%AA-sense-hat-r1600/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_06/62a3198da97d1_-----Raspberry-Pi-Raspberry-pi-4-Python-Thonny-scratch-Raspbian-Physical-computing-GPIO-Pins-Sense-HAT-HAT---.png.bba78a549979ddae456bab0cface8991.png" /></p>

<p>
	تُعد سنس هات Sense HAT، التي اسُتخدمت في محطة الفضاء الدولية، لوحةً إلكترونيةً مستقلة ومتعددة الوظائف تُضاف إلى <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AC%D9%87%D8%A7%D8%B2-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi-r1356/" rel="">راسبيري باي</a> عبر المنصة GPIO، ومزُوّدة بحسّاسات sensors ومصفوفة عرض ضوئية LED matrix display.
</p>

<p>
	تُدعم أجهزة راسبيري باي Raspberry Pi بنوع خاص من اللوحات الإلكترونية المضافة التي تُدعى بالتجهيزات المتصلة من الأعلى Hardware attached on top -أواختصارًا HAT-، والتي يمكنها إضافة أي شيء إلى راسبيري باي باي ابتداءً من المايكروفون مرورًا بالأضواء والمرحّلات Relays وحتى الشاشات. تُعد سنس هات من أكثر تجهيزات هات فائدةً وقد صّممت خصيصًا لمهمة الفضاء أسترو باي Astro Pi، وهي مهمةٌ مشتركةٌ بين مؤسسة راسبيري باي ووكالة فضاء المملكة المتحدة ووكالة الفضاء الأوروبية، والتي كانت قد اطّلعت على تجهيزات هات المُخصصة لراسبيري واختارت سنس هات لتنقلها إلى محطة الفضاء الدولية مع الصاروخ الذي حمل معدات المختبر المداري "Cygnus"؛ ولا تزال سنس هات التي لقبها رواد الفضاء "إد ED" و"إيزي Izzy" تُنفِّذ الشيفرات وتُجري اختبارات علمية يُساهم بها أطفال المدارس من كل أنحاء أوروبا.
</p>

<p>
	يمكنك الحصول على التجهيزة سنس هات نفسها لدى معظم موزعي راسبيري باي، كما يمكنك استخدام برمجيات تحاكي عمل سنس هات إن لم تشأ شراء واحدة.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		حقيقية أم محاكاة: ستتفاعل مع محتويات هذا المقال على النحو الأمثل إن كنت تملك سنس هات حقيقية متصلةً بالمنصة GPIO، وإن لم تتوفر لديك التجهيزة، تجاوز ببساطة الفقرة التي تحمل العنوان "تثبيت سنس هات" وانتقل إلى المشاريع التي يمكنك تنفيذها على المقلّد.
	</p>

	<p>
		يُعد هذا الفصل جزءًا من سلسلة "<a href="https://academy.hsoub.com/search/?tags=%D8%AF%D9%84%D9%8A%D9%84%20%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A%20%D8%A8%D8%A7%D9%8A&amp;sortby=newest&amp;page=1" rel="">مدخل إلى راسبيري باي</a>".
	</p>
</blockquote>

<h2>
	تعرف على سنس هات
</h2>

<p>
	سنس هات هي لوحةٌ إلكترونيةٌ مُضافةٌ متعددة الوظائف تُوصل براسبيري باي، وتضم اللوحة مصفوفةً أبعادها 8X8 من المؤشرات الضوئية الحمراء والخضراء والزرقاء RGB القابلة للبرمجة والتي يمكن التحكم بها لإنتاج أي لون تقريبًا من ملايين الألوان المتاحة، إضافةً إلى متحكّم بمقبض ألعاب Joystick بخمس وجهات وستة حساسات مدمجة، هي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101023" href="https://academy.hsoub.com/uploads/monthly_2022_06/sense_hat.png.1d1f0e0aa60421f525fbec2225f9d7fb.png" rel=""><img alt="sense_hat.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101023" data-unique="4e3c91jlc" src="https://academy.hsoub.com/uploads/monthly_2022_06/sense_hat.png.1d1f0e0aa60421f525fbec2225f9d7fb.png" style="width: 350px; height: auto;"></a>
</p>

<ul>
<li>
		<strong>جيروسكوب Gyroscope</strong>، الذي يتحسس للتغيُّرات في زاوية الدوران مع الزمن، أو كما يُعرف تقنيًا بالسرعة الزاويّة angular velocity، وذلك بتعقب اتجاه حقل الجاذبية للأرض، وهو الحقل الناتج عن قوة الجاذبية التي تشد الأشياء إلى مركز الأرض. ببساطة، يستشعر الجيروسكوب دوران سنس هات بالنسبة لسطح الأرض ويحدّد سرعة دورانها.
	</li>
	<li>
		<strong>مقياس التسارع Accelerometer</strong>: خلافًا للجيروسكوب الذي يقيس تغيرات زاوية الحركة بالنسبة لسطح الأرض يقيس مقياس التسارع القوة المسببة لتسارع الحركة في الاتجاهات المختلفة، وستتمكن بقراءة البيانات الناتجة عن الحساسين السابقين من تحديد وجهة سنس هات وكيف تتحرك.
	</li>
	<li>
		<strong>مقياس حقل مغناطيسي Magnetometer</strong>، الذي يقيس شدة الحقل المغناطيسي، ويساهم أيضًا في تتبُّع حركة سنس هات بقياس شدة الحقل المغناطيسي الأرضي وتقدير جهة الشمال المغناطيسي، كما يُستخدم في الكشف عن الأجسام المعدنية والحقول الكهربائية. دُمجت الحساسات الثلاث السابقة ضمن رُقاقة واحدةٍ تحمل الاسم "‘ACCEL/GYRO/MAG" على لوحة سنس هات.
	</li>
	<li>
		<strong>حساس رطوبة</strong>، الذي يقيس كمية بخار الماء في الهواء وهذا ما يُعرف بالرطوبة النسبية relative humidity، التي تبدأ بالقيمة 0% (لا رطوبة في الهواء) وصولًا إلى 100% (الهواء مشبعٌ تمامًا ببخار الماء). يمكن استخدام بيانات الحساس لتوقع هطول الأمطار مثلًا.
	</li>
	<li>
		<strong>حساس ضغط بارومتري Barometric</strong>، الذي يقيس الضغط الجوي. وعلى الرغم من اعتقاد الكثيرين بارتباطه فقط بنشرات الطقس إلا أن له استخدامٌ آخر غير معروف، إذ يمكنه تعقبك إن كنت صاعدًا إلى تلة أو جبل أو نازلًا عنه نظرًا لتغيُّر الضغط الجوي للأرض عند الارتفاع أو الانخفاض عن مستوى سطح البحر.
	</li>
	<li>
		<strong>حساس درجة الحرارة</strong> لقياس درجة حرارة الوسط المحيط، وقد يتأثر بحرارة لوحة سنس هات، وبالتالي قد تحصل على حرارة أدنى أو أعلى من القراءة الصحيحة إذا كنت تضع باي ضمن حاضنة. لا يوجد حساس حرارة مستقل في سنس هات بل تستخدم حساسا الحرارة المدمجان مع حساسي الرطوبة والضغط، ويمكن لبرنامجك استخدام حساس أو حساسين فقط من هذه المجموعة.
	</li>
</ul>
<h2>
	تثبيت سنس هات
</h2>

<p>
	إذا اشتريت لوحة سنس هات، فابدأ بإخراجها من علبتها وتأكد من وجود جميع الأجزاء، وهي اللوحة نفسها وأربعة دعائم معدنية أو بلاستيكية تُعرف باسم المباعدات Spacers وثمانية براغي Screws. قد تجد أيضًا بعض الأرجل المعدنية المشابهة لأرجل GPIO على باي مثبتة على شريط بلاستيكي أسود، ادفع الشريط أسفل لوحة سنس هات في هذه الحالة والأرجل متجهة للأعلى حتى تسمع صوت إطباق. صُممت المباعدات لحماية سنس هات من الانحناء عند استخدام مقبض الألعاب، ورغم أن سنس هات ستعمل دون تثبيت المباعدات، إلّا أنّ استخدامها سيحمي لوحة سنس هات ولوحة راسبيري باي والمنصة GPIO من الضرر.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>تحذير</strong>: لا ينبغي وصل تجهيزات "هات" إلى راسبيري باي أو فصلها إلا بعد إطفاء باي وفصلها عن التغذية الكهربائية. أبقِ هات مستويةً أثناء وصلها وتحقق جيدًا من تطابق فتحاتها مع أرجل المنصة GPIO قبل دفعها.
		</p>
	</div>
</blockquote>

<p>
	ثبِّت المباعدات بدفع أربعة براغي من أسفل لوحة راسبيري باي إلى الأعلى عبر الثقوب الأربعة في كل زاوية، ثم لُف المباعدات فوق البراغي. ادفع سنس هات بعد التأكد من تطابق موقعها فوق منصة GPIO تمامًا نحو المنصة وحاول أن تجعلها مستويةً قدر الإمكان. ثبِّت سنس هات بواسطة البراغي الأربعة الباقية بإدخالها ضمن الثقوب الموجودة على زوايا سنس هات لتدخل ضمن المباعدات التي ثبتّها مسبقًا. ينبغي أن تكون سنس هات مستويةً تمامًا إن ثبّتها جيدًا ولن تنحني عندما تضغط على أزرار مقبض الألعاب. أعِد وصل باي إلى التغذية الكهربائية وسترى مصفوفة الأضواء على سنس هات وقد أضاءت بنمط ألوان قوس قزح ثم انطفأت.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101012" href="https://academy.hsoub.com/uploads/monthly_2022_06/HAT_rainbow_pattern_01.png.ee1b7ca90fe9b9e60c2070fdba5554f6.png" rel=""><img alt="HAT_rainbow_pattern_01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101012" data-unique="deaoaqprz" src="https://academy.hsoub.com/uploads/monthly_2022_06/HAT_rainbow_pattern_01.png.ee1b7ca90fe9b9e60c2070fdba5554f6.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	(شكل 1- ظهور نمط شكل قوس قزح عند وصل التغذية الكهربائية)
</p>

<p>
	فك البراغي العلوية الأربعة إذا أردت إزالة سنس هات، ثم ارفعها بحذر كي لا تثني أرجل GPIO كونها مرتبطةٌ بإحكام معها (قد تضطر إلى زحزحتها قليلًا بالمفك). أزِل المباعدات عن باي بعد ذلك لتتحرر البراغي السفلية الأربعة.
</p>

<h2>
	مرحبا سنس هات
</h2>

<p>
	سنبدأ مثل معظم المشاريع البرمجية بعرض رسالة ترحيب بمستخدمي سنس هات من خلال المصفوفة الضوئية، فإذا كنت ستستخدم مقلّد سنس هات، فعليك تشغيله بالنقر على أيقونة راسبيان والانتقال إلى فئة "برمجة Programming" ثم النقر على مقلّد سنس هات "Sense HAT Emulator".
</p>

<h3>
	سكراتش ترحب بك
</h3>

<p>
	شغّل سكراتش 2 من قائمة راسبيان ثم انقر على الفئة "كتل إضافية More Blocks" ضمن لوحة الكتل البرمجية، ثم انقر على زر "إضافة موسّع Add an Extension". اختر الموسّع "Pi SenseHAT"، ثم انقر "OK". ستظهر لك الآن جميع الكتل البرمجية التي تساعدك على التحكم بمختلف ميزات سنس هات بما في ذلك المصفوفة الضوئية وستجد هذه الكتل ضمن الفئة "كتل إضافية More Blocks".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101019" href="https://academy.hsoub.com/uploads/monthly_2022_06/pi_sense_extension_02.png.4be794094c94c27c81e9b3669cb4d0a1.png" rel=""><img alt="pi_sense_extension_02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101019" data-unique="psbxgtusk" src="https://academy.hsoub.com/uploads/monthly_2022_06/pi_sense_extension_02.thumb.png.b388a4372c7c1de4009cb5397ddc1847.png" style="width: 700px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 2-7 إضافة الموّسع "Pi SenseHAT" إلى سكراتش 2
</p>

<p>
	اسحب الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100970" href="https://academy.hsoub.com/uploads/monthly_2022_06/when_GF_clicked.png.9248459fea09a401d0401e250c332379.png" rel=""><img alt="when_GF_clicked.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100970" data-unique="01zckk4e2" src="https://academy.hsoub.com/uploads/monthly_2022_06/when_GF_clicked.png.9248459fea09a401d0401e250c332379.png" style="width: 120px; height: auto;"></a> إلى منطقة بناء البرنامج، ثم ضع الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100958" href="https://academy.hsoub.com/uploads/monthly_2022_06/scroll_message.png.dee93c87ead87df072ce09855bcc17dc.png" rel=""><img alt="scroll_message.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100958" data-unique="ubti2uncf" src="https://academy.hsoub.com/uploads/monthly_2022_06/scroll_message.png.dee93c87ead87df072ce09855bcc17dc.png" style="width: 110px; height: auto;"></a> تحتها مباشرةً وعدِّل النص، لتقرأ الكتلة عبارة "!Hello World" مع قيمة دوران مساوية 0 وبلونٍ أبيض وخلفية مُطفأة off.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="100995" href="https://academy.hsoub.com/uploads/monthly_2022_06/code_03.png.59e681de378a55724a2d510308367f4f.png" rel=""><img alt="code_03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100995" data-unique="kd1hv9bqs" src="https://academy.hsoub.com/uploads/monthly_2022_06/code_03.png.59e681de378a55724a2d510308367f4f.png" style="width: 550px; height: auto;"></a>
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		الخبرة في البرمجة ضرورية، إذ نفترض في هذا المقال امتلاكك الخبرة اللازمة في العمل على سكراتش 2 أو بايثون في بيئة التطوير ثوني Thonny، سواءٌ قد عملت على مشاريع الفصول السابقة بلغتي سكراتش أو بايثون أو كلاهما؛ وفي حال لم تطلع على شيفرات تلك المشاريع، أو لم تكن لديك فكرة عن لغتي البرمجة السابقتين، فعُد رجاءً إلى أحد الفصلين 4 <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-scratch-r1407/" rel="">البرمجة باستخدام سكراتش</a>، أو الفصل 5 <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1418/" rel="">البرمجة باستخدام بايثون</a>، وابدأ بمشاريع الفصل الذي تختاره أولًا.
	</p>
</blockquote>

<p>
	هناك طبعًا العديد من النقاط الواجب شرحها في الكتلة السابقة، لكننا سنكتفي الآن بالنقر على الراية الخضراء لتشغيل البرنامج ومراقبة سنس هات أو المقلّد. ستمر أحرف العبارة "!Hello, World" التي تكوّنها الأضواء البيضاء للمصفوفة تباعًا وببطء، كما هو موضح في الشكل التالي.
</p>

<p>
	تهانينا، نجح برنامجك في العمل.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101018" href="https://academy.hsoub.com/uploads/monthly_2022_06/messgae_scroll_across_matrix_04.png.4e4a4c45d05c0133a9ab771eceeb8e4b.png" rel=""><img alt="messgae_scroll_across_matrix_04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101018" data-unique="26ej37w8e" src="https://academy.hsoub.com/uploads/monthly_2022_06/messgae_scroll_across_matrix_04.png.4e4a4c45d05c0133a9ab771eceeb8e4b.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 3-7 ستتحرك رسالتك خلال مصفوفة المؤشرات الضوئية
</p>

<p>
	بعد أن نجحت في عرض الرسالة لا بدّ من إلقاء نظرة على بقية خصائص الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100958" href="https://academy.hsoub.com/uploads/monthly_2022_06/scroll_message.png.dee93c87ead87df072ce09855bcc17dc.png" rel=""><img alt="scroll_message.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100958" data-unique="ubti2uncf" src="https://academy.hsoub.com/uploads/monthly_2022_06/scroll_message.png.dee93c87ead87df072ce09855bcc17dc.png" style="width: 110px; height: auto;"></a>، فبالإضافة إلى إمكانية تغيير الرسالة، يمكنك تغيير القيمة rotation التي تتحكم بطريقة عرض الرسالة على سنس هات. انقر على السهم الصغير بجوار rotation وغيِّر القيمة إلى 90 لتصبح الكتلة بالصيغة "Hello, World! at rotation 90 in colour white background off". شغِّل البرنامج وستلاحظ أنّ الرسالة ستتحرك من الأسفل إلى الأعلى وليس من اليسار إلى اليمين.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101017" href="https://academy.hsoub.com/uploads/monthly_2022_06/message_scrolls_vertically_05.png.6b5c0218a03f185a7566f516670b31ba.png" rel=""><img alt="message_scrolls_vertically_05.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101017" data-unique="ry9bsz1mf" src="https://academy.hsoub.com/uploads/monthly_2022_06/message_scrolls_vertically_05.png.6b5c0218a03f185a7566f516670b31ba.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 4-7 ستتحرك الرسالة عموديًا الآن
</p>

<p>
	أعِد قيمة rotation إلى 0 وغيِّر لون الأضواء التي تعرض الرسالة بالنقر على السهم الصغير بجوار "in colour white"، ثم اختر لونًا من القائمة: أحمر red، أزرق blue، أصفر yellow، سماوي cyan، أرجواني magenta، أبيض white، إضافةً لخيار off لإطفاء الأضواء بدلًا من تشغيلها، وهو مكافئ للون الأسود. اختر حاليًا اللون الأصفر وانقر الراية الخضراء ولاحظ تغيّر لون النص.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="100974" href="https://academy.hsoub.com/uploads/monthly_2022_06/changing_text_color_06.png.59abb45ffa9978693a3ba5f5be763599.png" rel=""><img alt="changing_text_color_06.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100974" data-unique="hbozr6jid" src="https://academy.hsoub.com/uploads/monthly_2022_06/changing_text_color_06.png.59abb45ffa9978693a3ba5f5be763599.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 5-7 تغيير لون الرسالة المعروضة
</p>

<p>
	انقر أخيرًا على السهم الصغير بجوار الخيار background لترى قائمة الألوان السابقة نفسها. لن يتغير لون المؤشرات الضوئية التي تعرض الرسالة هذه المرة بل ألوان مجموعة المؤشرات التي لا تعرضها والتي تُسمى خلفية Background. غيِّر ألوان النص والخلفية لتصل إلى التشكيلة المثالية، فلن تتماشى بعض الألوان مع البعض الآخر. وطالما أنك قادر على تحريك رسالتك عبر الشاشة، يمكنك مشاهدة الحروف كلٌ على حدى.
</p>

<p>
	اسحب الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100958" href="https://academy.hsoub.com/uploads/monthly_2022_06/scroll_message.png.dee93c87ead87df072ce09855bcc17dc.png" rel=""><img alt="scroll_message.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100958" data-unique="ubti2uncf" src="https://academy.hsoub.com/uploads/monthly_2022_06/scroll_message.png.dee93c87ead87df072ce09855bcc17dc.png" style="width: 100px; height: auto;"></a> خارج منطقة بناء البرنامج لحذفها واستبدلها بالكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100967" href="https://academy.hsoub.com/uploads/monthly_2022_06/show_letter_A.png.6af091840dfb90888a08a1b317ec8ea9.png" rel=""><img alt="show_letter_A.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100967" data-unique="ezws3d6ze" src="https://academy.hsoub.com/uploads/monthly_2022_06/show_letter_A.png.6af091840dfb90888a08a1b317ec8ea9.png" style="width: 100px; height: auto;"></a> ثم انقر الراية الخضراء وسترى الفرق. تعرض المصفوفة حرفًا واحدًا كل مرة في المكان نفسه حتى نغيّر ذلك دون أن تتحرك الحروف عبر المصفوفة أو تختفي. يُطبَّق على هذه الكتلة نفس النظام اللوني المطبَّق على الكتلة السابقة، لذلك حاول تغيير لون الحرف إلى الأحمر.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101011" href="https://academy.hsoub.com/uploads/monthly_2022_06/display_single_letter_07.png.833a6a37832f10de06460071ad6e0042.png" rel=""><img alt="display_single_letter_07.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101011" data-unique="u34eftq1f" src="https://academy.hsoub.com/uploads/monthly_2022_06/display_single_letter_07.png.833a6a37832f10de06460071ad6e0042.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 6-7 يظهر على الشاشة حرف واحد
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تحدٍ- كرر الرسالة: هل تستطيع الاستفادة من الحلقات ليتكرر عرض العبارة المتحركة باستمرار؟ هل تستطيع أن تغيّر ألوان الحروف التي تُعرض واحدًا تلو الآخر؟
	</p>
</blockquote>

<h3>
	بايثون ترحب بك
</h3>

<p>
	حمّل أيًا من نمطي بيئة العمل ثوني Thonny البسيط، أو القياسي بالنقر على أيقونة راسبيان، ثم انتقل إلى فئة "برمجة Programming"، ثم انقر أخيرًا على أي من اختصاري ثوني. ستغطي واجهة ثوني واجهة المقلّد إذا كنت تستخدمه، لذلك غيِّر موقع النافذتين حتى تتمكن من عرضهما معًا على الشاشة.
</p>

<p>
	ستحتاج إلى إدراج مكتبة SenseHat، إذا كنت ستستخدم بايثون لكتابة برنامجك سواءٌ لتجهيزة سنس هات، أم للمقلّد. اكتب ما يلي في نافذة الشيفرة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_31" style="">
<span class="kwd">from</span><span class="pln"> sense_hat </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">SenseHat</span><span class="pln"> 
sense </span><span class="pun">=</span><span class="pln"> </span><span class="typ">SenseHat</span><span class="pun">()</span><span class="pln"> </span></pre>

<p>
	للمكتبة دالةٌ بسيطة تقرأ الرسالة وتنسِّقها لتظهر على مصفوفة الأضواء ومن ثم تحرِّكها بلطف. اكتب الشيفرة التالية الآن:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_33" style="">
<span class="pln">sense</span><span class="pun">.</span><span class="pln">show_message</span><span class="pun">(</span><span class="str">"Hello, World!"</span><span class="pun">)</span></pre>

<p>
	احفظ برنامجك باسم "Hello Sense HAT"، ثم انقر أيقونة التشغيل "Run"، ستتحرك الرسالة ببطء على شاشة المصفوفة الضوئية.
</p>

<p>
	تهانينا، نجح برنامجك في العمل.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تغيير في شيفرة بايثون: يمكن لشيفرة بايثون العمل على سنس هات والمقلد، لكن لا بدّ من إجراء تغيير بسيط عند استخدام المقلد بتغيير السطر:
	</p>
</blockquote>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_35" style="">
<span class="pln"> </span><span class="kwd">from</span><span class="pln"> sense_hat </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">SenseHat</span></pre>

<p>
	إلى:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_37" style="">
<span class="pln"> </span><span class="kwd">from</span><span class="pln"> sense_emu </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">SenseHat</span></pre>

<p>
	وبالعكس.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101021" href="https://academy.hsoub.com/uploads/monthly_2022_06/scrolling_message_python_08.png.1ab2c20a1ead6c2d974a316f8043b1ea.png" rel=""><img alt="scrolling_message_python_08.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101021" data-unique="8o7962c0x" src="https://academy.hsoub.com/uploads/monthly_2022_06/scrolling_message_python_08.png.1ab2c20a1ead6c2d974a316f8043b1ea.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 7-7 تحريك الرسالة عبر شاشة المصفوفة الضوئية.
</p>

<p>
	يوجد للدالة <code>()show_message</code> ميزاتٌ أخرى، لذلك عُد إلى برنامجك وعدّل الدالة لتصبح على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_40" style="">
<span class="pln">sense</span><span class="pun">.</span><span class="pln">show_message</span><span class="pun">(</span><span class="str">"Hello, World!"</span><span class="pun">,</span><span class="pln"> text_colour</span><span class="pun">=(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">),</span><span class="pln"> back_colour</span><span class="pun">=(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">),</span><span class="pln"> scroll_speed</span><span class="pun">=(</span><span class="lit">0.05</span><span class="pun">))</span></pre>

<p>
	تُعرف هذه التعليمات التي تفصل بينها فاصلة "," داخل قوسي الدالة باسم المعاملات Parameters، وهي تتحكم بعمل الدالة من نواحٍ عدة، ويُعد <code>()=scroll_speed</code> أبسط هذه المعاملات، إذ يتحكم بسرعة عرض الرسالة على الشاشة؛ فلو كانت قيمته 0.05، فستتحرك الرسالة بسرعة مضاعفة عن السرعة الاعتيادية، وكلما زادت القيمة كلما قلت السرعة.
</p>

<p>
	أما المعاملان <code>()=text_colour</code> و <code>()=back_colour</code> (مكتوبان وفق التهجئة البريطانية على خلاف تعليمات <a href="https://academy.hsoub.com/programming/python/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r211/" rel="">بايثون</a> الأخرى) فيحددان لون النص ولون الخلفية، لكنهما لا يستخدمان أسماء الألوان بل يستخدمان النظام اللوني الثلاثي الذي تحدد فيه نسب الألوان الأساسية الأحمر ثم الأخضر ثم الأزرق واختصارًا RGB، إذ يمثل الرقم الأول من الثلاثية كمية اللون الأحمر في اللون المحدد والتي تأخذ القيم من 0 (لا لون أحمر) حتى 255 (الحد الأقصى للون الأحمر)، ويمثل الرقم الثاني كمية اللون الأخضر، والثالث كمية اللون الأزرق.
</p>

<p>
	انقر على أيقونة التشغيل "Run" وراقب سنس هات. لاحظ كيف تتحرك الرسالة التي تظهر بلون أصفر على خلفية زرقاء بسرعة أكبر. بدِّل قيم المعاملات السابقة لتحصل على طريقة العرض الملائمة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101006" href="https://academy.hsoub.com/uploads/monthly_2022_06/color_changing_python_09.png.30a5b93ee6c35f9223be9dffc13088f7.png" rel=""><img alt="color_changing_python_09.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101006" data-unique="vbz2tzpa8" src="https://academy.hsoub.com/uploads/monthly_2022_06/color_changing_python_09.png.30a5b93ee6c35f9223be9dffc13088f7.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 8-7 تغيير لون النص والخلفية.
</p>

<p>
	يمكنك استخدام المتغيرات لإعطاء أسماء مناسبة للون الذي تريده بدلًا من استخدام نظام RGB. لتجربة ذلك اكتب الشيفرة التالية قبل سطر الدالة <code>()sense.show_message</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_44" style="">
<span class="pln">yellow </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> 
blue </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">)</span></pre>

<p>
	ثم عدًل سطر الدالة نفسها ليصبح على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_46" style="">
<span class="pln">sense</span><span class="pun">.</span><span class="pln">show_message</span><span class="pun">(</span><span class="str">"Hello, World!"</span><span class="pun">,</span><span class="pln"> text_colour</span><span class="pun">=(</span><span class="pln">yellow</span><span class="pun">),</span><span class="pln"> back_ colour</span><span class="pun">=(</span><span class="pln">blue</span><span class="pun">),</span><span class="pln"> scroll_speed</span><span class="pun">=(</span><span class="lit">0.05</span><span class="pun">))</span></pre>

<p>
	إذا نقرت على أيقونة التشغيل مجددًا فلن تلحظ أية تغيرات، وستبقى رسالتك بلون أصفر وخلفية زرقاء وكل ما هناك أنك استخدمت المتغيرات لجعل اللون الذي اخترته مقروءًا بدلًا من استخدام مجموعة أرقام؛ وهكذا يمكن تعريف العدد الذي تشاء من الألوان ومنحها أسماءً، فيمكنك مثلًا تسمية اللون (255,0,0) باسم "أحمر red" واللون (255,255,255) باسم "أبيض white" وسيكون "الأسود black" هو حتمًا اللون (0,0,0).
</p>

<p>
	يمكنك كذلك عرض الرسالة مثل حروف متلاحقة واحدًا تلو الآخر بدل تحريكها، ولتنفيذ ذلك احذف سطر التعليمة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_48" style="">
<span class="pln">sense</span><span class="pun">.</span><span class="pln">show_message</span><span class="pun">()</span></pre>

<p>
	واستبدله بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_50" style="">
<span class="pln">sense</span><span class="pun">.</span><span class="pln">show_letter</span><span class="pun">(</span><span class="str">"Z"</span><span class="pun">)</span></pre>

<p>
	انقر على أيقونة التشغيل لترى الحرف "Z" على شاشة سنس هات، إذ سيبقى الحرف مكانه هذه المرة، فلا تتحرك الحروف المفردة بحد ذاتها على الشاشة. يمكنك كذلك التحكم في لون وخلفية الحرف من خلال الدالة <code>()sense.show_letter</code> وباستخدام معاملات مشابهةٍ لمعاملات الدالة <code>()sense.show_message</code>، جرّب ذلك.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تحدٍ-كرر الرسالة: هل تستطيع الاستفادة من الحلقات ليتكرر عرض العبارة المتحركة باستمرار؟ هل تستطيع أن تغيّر ألوان الحروف التي تعرض واحدًا تلو الآخر؟ ما هي أكبر سرعة قد تحرّك بها رسالة؟
	</p>
</blockquote>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101010" href="https://academy.hsoub.com/uploads/monthly_2022_06/display_letter_python_10.png.130a159143fa3060641e29c042c01ab2.png" rel=""><img alt="display_letter_python_10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101010" data-unique="xk7wpa4y8" src="https://academy.hsoub.com/uploads/monthly_2022_06/display_letter_python_10.png.130a159143fa3060641e29c042c01ab2.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 9-7 إظهار حرف وحيد
</p>

<h2>
	الرسم بالأضواء
</h2>

<p>
	لا تُستخدم المصفوفة الضوئية في سنس هات لعرض الرسائل فقط، بل يمكنك عرض الصور أيضًا، إذ يُعامل كل مؤشر ضوئي في المصفوفة مثل بكسل pixel (بكسل= عنصر-صورة أو بكسل كما هو شائع) مفرد في الصورة التي تختارها، وبالتالي ستكون قادرًا على إحياء برامجك بالصور وحتى الرسوم المتحركة. ولكي تتمكن من إظهار الرسوميات والصور، لا بدّ أن تكون قادرًا على تغيير كل مؤشر ضوئي على حدى، لذلك علينا أولًا فهم طريقة تنظيم المؤشرات الضوئية في مصفوفة سنس هات لكتابة البرنامج الصحيح الذي يضيء ويطفئ المؤشر الضوئي المطلوب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101014" href="https://academy.hsoub.com/uploads/monthly_2022_06/LED_matrix_coordinates_11.png.6c6ae2d73edeaba6d47ae5ebfb2896b0.png" rel=""><img alt="LED_matrix_coordinates_11.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101014" data-unique="mogqmp4f8" src="https://academy.hsoub.com/uploads/monthly_2022_06/LED_matrix_coordinates_11.thumb.png.5ae8b335e941c9bd486dd151739933ae.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 10-7 نظام الإحداثيات الخاص بالمصفوفة الضوئية.
</p>

<p>
	تضم المصفوفة ثمانية مؤشرات ضوئية في كل صف وثمانية في كل عمود، وتُعَد المؤشرات كما هو الحال في معظم <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات البرمجة</a> إذ تبدأ من 0 وتنتهي عند الرقم 7، وسيكون المؤشر الضوئي في الزاوية اليسارية العليا في الصف 0 والعمود 0 أي إحداثياته (0,0)، إذ يمثِّل الإحداثي الأول قيمة X التي تشير إلى الأعمدة والإحداثي الثاني قيمة Y التي تشير إلى الأسطر. وستكون إحداثيات المؤشر في الزاوية اليمينية السفلية بناء على هذه المنظومة (7,7) وهكذا. يمكنك ملاحظة المؤشر الضوئي الأزرق مثلًا المبين في الشكل السابق عند الإحداثيات (0,2) والأحمر عند الإحداثيات (4,7).
</p>

<p>
	قد يفيدك رسم مخطط للمؤشرات الضوئية على ورقة مقسمة عندما تخطط لعرض صورة ما على شاشة سنس هات، كما يمكنك الاستعانة بالجداول الإلكترونية spreadsheets لتخطيط طريقة عرض الصورة مثل برنامج <a href="https://academy.hsoub.com/apps/productivity/liberoffice/libreoffice-calc/" rel="">ليبر أوفيس كالك LibreOffice Calc</a>.
</p>

<h3>
	عرض الصور باستخدام سكراتش
</h3>

<p>
	ابدأ مشروعًا جديدًا في <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-scratch-r1407/" rel="">سكراتش</a> بعد حفظ مشروعك السابق إن أردت. حمّل الموسِّع "PI Sense HAT" من خلال الفئة "كتل إضافية More Blocks"، ولا تنس أن تعيد هذه الخطوة في كل مرة تنشئ فيها مشروعًا جديدًا يستخدم سنس هات وإلا لن تظهر الكتل التي تتحكم بهذه التجهيزة. اسحب الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100970" href="https://academy.hsoub.com/uploads/monthly_2022_06/when_GF_clicked.png.9248459fea09a401d0401e250c332379.png" rel=""><img alt="when_GF_clicked.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100970" data-unique="wv26rw8w5" src="https://academy.hsoub.com/uploads/monthly_2022_06/when_GF_clicked.png.9248459fea09a401d0401e250c332379.png" style="width: 120px; height: auto;"></a> إلى منطقة بناء البرنامج، ثم ضع تحتها مباشرةً الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100963" href="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_white.png.7fe820ab69b0c77b80aaa0be5c7ec261.png" rel=""><img alt="set_all_pixels_to_white.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100963" data-unique="pzfbxs8iu" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_white.png.7fe820ab69b0c77b80aaa0be5c7ec261.png" style="width: 140px; height: auto;"></a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="100996" href="https://academy.hsoub.com/uploads/monthly_2022_06/code_04.png.4d67289e91e4462cf8393442cbb895bd.png" rel=""><img alt="code_04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100996" data-unique="r50g1aic8" src="https://academy.hsoub.com/uploads/monthly_2022_06/code_04.png.4d67289e91e4462cf8393442cbb895bd.png" style="width: 250px; height: auto;"></a>
</p>

<p>
	انقر على الراية الخضراء دون أن تنظر مباشرةً إلى المصفوفة الضوئية لأن المؤشرات ستضيء بلون أبيض لامع قد لا يكون النظر إليها مباشرة أمرًا مريحًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101013" href="https://academy.hsoub.com/uploads/monthly_2022_06/leds_bright_white_12.png.98a4c6742066fbec64042a66a057bd52.png" rel=""><img alt="leds_bright_white_12.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101013" data-unique="ojvceygzz" src="https://academy.hsoub.com/uploads/monthly_2022_06/leds_bright_white_12.png.98a4c6742066fbec64042a66a057bd52.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 11-7
</p>

<p>
	لا تنظر مباشرةً إلى مصفوفة الأضواء عندما تضيء بلون أبيض لامع
</p>

<p>
	انقر على السهم الصغير بجوار الخيار white واختر لونًا مختلفًا، ثم أعد تشغيل البرنامج. اختر من جديد الخيار off بدلًا من اختيار لون محدد، ثم شغِّل البرنامج مجددًا لتُطفأ كل الأضواء في هذه الحالة. يمكنك استخدام نظام RGB لمزج اللون المطلوب إذا أردت لونًا خاصًا بك. لهذا اسحب الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100959" href="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_off.png.f959bf05aa69725e9adb0ba1654a29e8.png" rel=""><img alt="set_all_pixels_to_off.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100959" data-unique="v7mmvkt29" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_off.png.f959bf05aa69725e9adb0ba1654a29e8.png" style="width: 120px; height: auto;"></a> خارج منطقة بناء البرنامج واستبدلها بالكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100962" href="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_R_255_G_255_B_255.png.5b12a3b69e77a17e3f930808c0550d06.png" rel=""><img alt="set_all_pixels_to_R_255_G_255_B_255.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100962" data-unique="axh7ledss" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_R_255_G_255_B_255.png.5b12a3b69e77a17e3f930808c0550d06.png" style="width: 200px; height: auto;"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="100997" href="https://academy.hsoub.com/uploads/monthly_2022_06/code_05.png.849f6eef99cb7f4fe2b6232ef66d965e.png" rel=""><img alt="code_05.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100997" data-unique="hqwqprupu" src="https://academy.hsoub.com/uploads/monthly_2022_06/code_05.png.849f6eef99cb7f4fe2b6232ef66d965e.png" style="width: 250px; height: auto;"></a>
</p>

<p>
	انقر على الراية الخضراء وستضيء المؤشرات بلون أبيض لامع من جديد. يمكنك الآن تصميم اللون الذي تريد بتحديد كميات اللون الأحمر والأخضر والأزرق في الكتلة السابقة بعد الخيارات R و G و B على التوالي. يمكن أن تحمل أي كمية قيمًا من 0 حتى 255. عدّل الكتلة لتصبح <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100961" href="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_R_0_G_255_B_0.png.2a71e2aa33e52ca92c157237f5810e94.png" rel=""><img alt="set_all_pixels_to_R_0_G_255_B_0.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100961" data-unique="1hw5q5h5x" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_R_0_G_255_B_0.png.2a71e2aa33e52ca92c157237f5810e94.png" style="width: 180px; height: auto;"></a> ثم انقر الراية الخضراء لتضيء المصفوفة الآن بلون أخضر لامع.
</p>

<p style="text-align: center;">
	<img alt="lighting_in_green_13.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101016" data-unique="tkwc2t573" src="https://academy.hsoub.com/uploads/monthly_2022_06/lighting_in_green_13.png.4f675003d9e463831c4b407cb8903160.png" style="width: 400px; height: auto;"></p>

<p style="text-align: center;">
	شكل 12-7 ستضيء المصفوفة كلها باللون الأخضر اللامع.
</p>

<p>
	جرب قيمًا مختلفة لمنظومة RGB لتحصل على اللون الذي تريده وسجل هذه القيم لاستخداماتك المستقبلية. ولكي تتمكن من عرض صورةٍ ما، لا بدّ أن تكون قادرًا على التحكم بكل مؤشر ضوئي على حدى. لتنشئ مثلًا نسختك عن البرنامج الذي يعرضه الشكل 10-7، الذي يُضاء فيه مؤشرين ضوئيين لبيكسلين باللون الأحمر والأزرق، غيِّر الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100961" href="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_R_0_G_255_B_0.png.2a71e2aa33e52ca92c157237f5810e94.png" rel=""><img alt="set_all_pixels_to_R_0_G_255_B_0.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100961" data-unique="1hw5q5h5x" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_R_0_G_255_B_0.png.2a71e2aa33e52ca92c157237f5810e94.png" style="width: 200px; height: auto;"></a> إلى <img alt="set_all_pixels_to_R_0_G_0_B_0.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100984" data-unique="khvq17v4e" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_R_0_G_0_B_0.png.f0ec7c380db2c84246dc8c13bca05c9d.png" style="width: 180px; height: auto;">، ثم اسحب كتلتي <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100966" href="https://academy.hsoub.com/uploads/monthly_2022_06/set_pixel_0_0_to_white.png.16a56c2976f717039681e521a01caecb.png" rel=""><img alt="set_pixel_0_0_to_white.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100966" data-unique="v32o5g5g3" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_pixel_0_0_to_white.png.16a56c2976f717039681e521a01caecb.png" style="width: 150px; height: auto;"></a> لتكونا تحتها مباشرةً وغير قيمهما لتكونا كما في الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="100998" href="https://academy.hsoub.com/uploads/monthly_2022_06/code_14.png.213d727ec32a10170ee533c0aff229e4.png" rel=""><img alt="code_14.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100998" data-unique="y8utczv0k" src="https://academy.hsoub.com/uploads/monthly_2022_06/code_14.png.213d727ec32a10170ee533c0aff229e4.png" style="width: 250px; height: auto;"></a>
</p>

<p>
	انقر على الراية الخضراء لتشاهد الضوئين الأحمر والأزرق كما في الشكل 10-7.
</p>

<p>
	تهانينا، تستطيع الآن التحكم بكل مؤشر ضوئي على نحوٍ مستقل.
</p>

<p>
	عدّل الكتل السابقة كما في التسلسل التالي وأضف الكتل المناسبة لتحصل على البرنامج التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="100999" href="https://academy.hsoub.com/uploads/monthly_2022_06/code_15.png.5e08ad64eb23bdd331db8896ad409e2c.png" rel=""><img alt="code_15.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100999" data-unique="3yeuhcnw8" src="https://academy.hsoub.com/uploads/monthly_2022_06/code_15.png.5e08ad64eb23bdd331db8896ad409e2c.png" style="width: 350px; height: auto;"></a>
</p>

<p>
	حاول أن تتوقع الصورة التي ستظهر على المصفوفة الضوئية بناءً على الإحداثيات التي استخدمتها في كتل التسلسل السابق قبل أن تنقر على الراية الخضراء، ثم شغّل البرنامج لترى إن كنت على حق. على الرغم من إمكانية استخدام كتل <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100964" href="https://academy.hsoub.com/uploads/monthly_2022_06/set_pixel.png.7e4a26d1ae7a0a8e40b78a9ff14b33d9.png" rel=""><img alt="set_pixel.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100964" data-unique="jj7rlyp8a" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_pixel.png.7e4a26d1ae7a0a8e40b78a9ff14b33d9.png" style="width: 60px; height: auto;"></a> في عرض الصور البسيطة، لكن موسِّع سنس هات الموجود في النسخة سكراتش 2 لن يكون مناسبًا لعرض صور معقدة أو رسوميات متحركة. لذلك فكِّر في الانتقال إلى بايثون عند كتابة برنامجك.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تحدٍ- تصاميم جديدة: هل يمكنك تصميم لوحات أكثر؟ حاول أن تُحضر ورقة مقسمة إلى مربعات واستخدمها لتخطيط لوحتك يدويًا. هل بإمكانك رسم لوحة وتغيِّر ألوانها؟
	</p>
</blockquote>

<h3>
	عرض الصور باستخدام بايثون
</h3>

<p>
	ابدأ برنامجًا جديدًا في ثوني واحفظه باسم "Sense HAT Drawing" ثم اكتب الشيفرة التالية في نافذة الشيفرة وانتبه إلى استبدال <code>sense_hat</code> بمقابلتها <code>sense_emu</code> إذا كنت ستستخدم المقلّد:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_88" style="">
<span class="kwd">from</span><span class="pln"> sense_hat </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">SenseHat</span><span class="pln"> 
sense </span><span class="pun">=</span><span class="pln"> </span><span class="typ">SenseHat</span><span class="pun">()</span></pre>

<p>
	وتذكر أنك ستحتاج كلا سطري الشيفرة السابقين لاستخدام سنس هات. أضف بعد ذلك السطر التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_90" style="">
<span class="pln">sense</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">)</span></pre>

<p>
	انقر على أيقونة التشغيل Run دون النظر مباشرةً إلى المصفوفة الضوئية لأنها ستضيء بأكملها باللون الأبيض اللامع عند تشغيل البرنامج.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101033" href="https://academy.hsoub.com/uploads/monthly_2022_06/white_matrix_python_16.png.d0933e5fe1587b466af94bb22c401908.png" rel=""><img alt="white_matrix_python_16.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101033" data-unique="0rhhuhkcl" src="https://academy.hsoub.com/uploads/monthly_2022_06/white_matrix_python_16.png.d0933e5fe1587b466af94bb22c401908.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 13-7
</p>

<p>
	لا تنظر مباشرة إلى مصفوفة الأضواء عندما تضيء بلون أبيض لامع
</p>

<p>
	صُممت الدالة <code>()sense.clear</code> لإلغاء برمجة كل المؤشرات الضوئية لكنها تقبل أيضًا معاملات لونية وفق نظام RGB، أي يمكنك تغيير لون المصفوفة إلى أي لون تريد. عدّل الشيفرة في السطر الأخير على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_93" style="">
<span class="pln">sense</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span></pre>

<p>
	انقر على أيقونة التشغيل Run وسيتحول لون سنس هات إلى الأخضر اللامع. جرِّب ألوانًا مختلفة أو استخدم المتغيرات التي سمّيتها سابقًا بأسماء الألوان في برنامجك "Hello World" لتبسيط الأمر أكثر.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101015" href="https://academy.hsoub.com/uploads/monthly_2022_06/led_matrix_python_17.png.a3db036dba752a6a276e2d058f784f6b.png" rel=""><img alt="led_matrix_python_17.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101015" data-unique="8tbcgtkm8" src="https://academy.hsoub.com/uploads/monthly_2022_06/led_matrix_python_17.png.a3db036dba752a6a276e2d058f784f6b.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 14-7 ستضيء المصفوفة الضوئية باللون الأخضر اللامع.
</p>

<p>
	لإطفاء الأضواء، استخدم قيمة RGB الموافقة للون الأسود وهي (0,0,0)، كما يمكنك تنفيذ ذلك بطريقة أسهل وذلك بتعديل السطر الأخير من برنامجك ليصبح على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_96" style="">
<span class="pln">sense</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">()</span></pre>

<p>
	ستطفئ الدالة <code>()sense.clear</code> أضواء سنس هات إن كانت أقواسها فارغة، وهذا ما ستحتاجه لإلغاء برمجة المؤشرات الضوئية بأكملها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101022" href="https://academy.hsoub.com/uploads/monthly_2022_06/sense_clear_func_18.png.a917f2f34e7d3114b6fdd9edf89bcb32.png" rel=""><img alt="sense_clear_func_18.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101022" data-unique="0beartv3z" src="https://academy.hsoub.com/uploads/monthly_2022_06/sense_clear_func_18.png.a917f2f34e7d3114b6fdd9edf89bcb32.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 15-7 استخدم الدالة <code>sense.clear</code> لإطفاء أضواء مصفوفة سنس هات.
</p>

<p>
	لتنشئ نسختك عن البرنامج الذي يعرضه الشكل 10-7 والمكوّن من مؤشرين ضوئيين محددين يضيئان باللونين الأحمر والأزرق، أضِف الشيفرة التالية مباشرةً بعد الدالة <code>()sense.clear</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_99" style="">
<span class="pln">sense</span><span class="pun">.</span><span class="pln">set_pixel</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">))</span><span class="pln">
sense</span><span class="pun">.</span><span class="pln">set_pixel</span><span class="pun">(</span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">))</span></pre>

<p>
	يمثِّل المعامل الأول من الدالة <code>()sense.set_pixel</code> الإحداثي X (رقم العمود) لمنظومة إحداثيات المصفوفة، ويمثِّل المعامل الثاني الإحداثي Y، بينما يحدد الإحداثي الثالث لون المؤشر الضوئي بطريقة RGB. انقر على أيقونة التشغيل Run لترى تنفيذ الشيفرة، ولاحظ كيف ستضيء المصفوفة على نحوٍ مشابه لما يعرضه الشكل 10-7.
</p>

<p>
	احذف الآن السطرين السابقين واكتب الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_101" style="">
<span class="pln">sense</span><span class="pun">.</span><span class="pln">set_pixel</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">))</span><span class="pln">
sense</span><span class="pun">.</span><span class="pln">set_pixel</span><span class="pun">(</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">))</span><span class="pln">
sense</span><span class="pun">.</span><span class="pln">set_pixel</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="lit">100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">))</span><span class="pln">
sense</span><span class="pun">.</span><span class="pln">set_pixel</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">))</span><span class="pln">
sense</span><span class="pun">.</span><span class="pln">set_pixel</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">))</span><span class="pln">
sense</span><span class="pun">.</span><span class="pln">set_pixel</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">))</span><span class="pln">
sense</span><span class="pun">.</span><span class="pln">set_pixel</span><span class="pun">(</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">))</span><span class="pln">
sense</span><span class="pun">.</span><span class="pln">set_pixel</span><span class="pun">(</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">))</span></pre>

<p>
	تأمل إحداثيات المؤشرات الضوئية في الشيفرة السابقة وتوقع نتيجتها قبل تشغيل البرنامج، ثم تحقق من ذلك بعد التشغيل. وكما ترى سيكون رسم أي لوحة بتكرار استدعاء واحد للدالة <code>()sense.set_pixel</code> بطيئًا، ومن الأفضل تغيير عدة بكسلات في الوقت نفسه. لهذا احذف كل الأسطر التي تستدعي الدالة <code>()sense.set_pixel</code> واكتب الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_103" style="">
<span class="pln">g </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
b </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
creeper_pixels </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">    g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln">
                      g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln">    
                      g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln">    
                      g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln">    
                      g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln">    
                      g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln">    
                      g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln">    
                      g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g </span><span class="pun">]</span><span class="pln">
sense</span><span class="pun">.</span><span class="pln">set_pixels</span><span class="pun">(</span><span class="pln">creeper_pixels</span><span class="pun">)</span></pre>

<p>
	سنشرح الشيفرة السابقة لاحقًا لكن ابدأ بتشغيل البرنامج لنرى إن استطعت تمييز الشكل الذي ستعرضه سنس هات. لاحظ كيف يُنشئ أول سطرين متغيرين نسند إليهما قيم RGB المحددة للونين الأخضر <code>g</code> والأسود <code>b</code> لتسهيل كتابة وقراءة الشيفرة؛ وتنشئ كتلة الشيفرة التي تليهما متغيرًا يضم بين قوسين مربعين ألوان جميع بكسلات الشاشة الضوئية تفصل بينها الفاصلة ",". لاحظ كيف استخدمنا المتغيرين السابقين <code>g</code> و <code>b</code> بدلًا من الأرقام في تحديد الألوان وسيظهر حلزون نتيجة تنفيذ الشيفرة كما في الشكل 16-7. تقبل الدالة <code>(sense.set_pixels(creeper_pixels</code> المتغير <code>creeper_pixels</code> مثل معامل، ثم ترسم المصفوفة كاملةً في اللحظة نفسها، وهذا أسهل طبعًا من رسم كل بكسل لوحده.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101009" href="https://academy.hsoub.com/uploads/monthly_2022_06/display_image_on_matrix_19.png.dab6de09f6858d14815999f45e235ad2.png" rel=""><img alt="display_image_on_matrix_19.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101009" data-unique="63cojc22q" src="https://academy.hsoub.com/uploads/monthly_2022_06/display_image_on_matrix_19.png.dab6de09f6858d14815999f45e235ad2.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 16-7 عرض صورة على المصفوفة الضوئية.
</p>

<p>
	من الممكن أيضًا تدوير أو قلب الصورة لعرض الصورة بالشكل الصحيح عند تدوير سنس هات، أو لتصميم رسم متحرك بسيط انطلاقًا من صورة غير متناظرة.
</p>

<p>
	ابدأ بتعديل قيم المتغير <code>creeper_pixels</code> لنغمض عين الحلزون على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_106" style="">
<span class="pln">creeper_pixels </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">    g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln">    
                      g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln">
                      g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln">
                      g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> 
                      g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> 
                      g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> 
                      g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln">   
                      g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> g </span><span class="pun">]</span></pre>

<p>
	انقر على Run وسترى عين الحلزون وقد أغمضت كما هو موضح في الشكل التالي. ولإنشاء رسمٍ متحرك انتقل إلى بداية برنامجك وأضِف السطر التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_108" style="">
<span class="kwd">from</span><span class="pln"> time </span><span class="kwd">import</span><span class="pln"> sleep</span></pre>

<p>
	عُد إلى آخر البرنامج وأضف ما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_110" style="">
<span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">
    sleep</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln">    
    sense</span><span class="pun">.</span><span class="pln">flip_h</span><span class="pun">()</span></pre>

<p>
	انقر على زر التشغيل Run وسترى الحلزون وهو يغلق ويفتح عينيه بالتناوب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101030" href="https://academy.hsoub.com/uploads/monthly_2022_06/simple_two_frame_anim_20.png.0fbe717a18fcfa29759682f8976555c4.png" rel=""><img alt="simple_two_frame_anim_20.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101030" data-unique="5e0suhsz0" src="https://academy.hsoub.com/uploads/monthly_2022_06/simple_two_frame_anim_20.png.0fbe717a18fcfa29759682f8976555c4.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 17-7 رسم متحرك من إطارين
</p>

<p>
	تقلب الدالة <code>()flip_h</code> الصورة وفق محورها الأفقي، بينما تقلبها الدالة <code>()flip_v</code> وفق محورها العمودي؛ وتستطيع أيضًا تدوير الصورة بزوايا 0 و 90 و 180 و 270 ثم العودة إلى 0 درجة باستخدام الدالة <code>(sense.set_rotation(90</code> بعد استبدال <code>90</code> بالزاوية المطلوبة. حاول أن تستخدم هذه الدالة ليدور الحلزون بدلًا من إغماض عينيه&gt;
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تحدٍ- تصاميم جديدة: هل يمكنك تصميم لوحات ورسوم متحركة أكثر؟ حاول أن تُحضر ورقةً مقسّمةً إلى مربعات واستخدمها لتخطيط لوحتك يدويًا أولًا ليسهل عليك كتابة المتغير. هل بإمكانك رسم لوحة وتغيّر ألوانها؟
	</p>

	<p>
		تلميح: يمكنك تغيير المتغيرات بعد استخدامها في المرة الأولى.
	</p>
</blockquote>

<h2>
	تحسس العالم من حولك
</h2>

<p>
	من الممتع العمل مع المصفوفة الضوئية لسنس هات، لكن تظهر قوتها الحقيقية عند استخدام حساساتها المختلفة، إذ تتيح لك تلك الحساسات استشعار المحيط من درجة الحرارة إلى الحركة ومن ثم استخدام هذه المعلومات في برامجك بالطريقة التي تريد.
</p>

<h3>
	تحسس البيئة المحيطة
</h3>

<p>
	تأخذ حساسات الضغط والحرارة والرطوبة لسنس هات البيانات من البيئة المحيطة بها، لذلك فهي حساسات بيئية.
</p>

<h4>
	استشعار البيئة المحيطة باستخدام سكراتش
</h4>

<p>
	ابدأ برنامجًا جديدًا في سكراتش بعد حفظ البرنامج السابق إن أردت، ثم أضف الموّسع "Sense HAT" إلى فئة "كتل إضافية More Blocks". اسحب الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100970" href="https://academy.hsoub.com/uploads/monthly_2022_06/when_GF_clicked.png.9248459fea09a401d0401e250c332379.png" rel=""><img alt="when_GF_clicked.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100970" data-unique="wv26rw8w5" src="https://academy.hsoub.com/uploads/monthly_2022_06/when_GF_clicked.png.9248459fea09a401d0401e250c332379.png" style="width: 125px; height: auto;"></a> إلى منطقة بناء البرنامج، وضع تحتها الكتلة <img alt="set_all_pixels_to_off.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100959" data-unique="zzh0wmtn7" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_off.png.f959bf05aa69725e9adb0ba1654a29e8.png" style="width: 125px; height: auto;">. من المفيد تنفيذ هاتين الخطوتين في بداية برنامجك لتتأكد من عدم عرض أي شيء على المصفوفة الضوئية قد يكون عالقًا من برنامج سابق. اسحب بعد ذلك الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100956" href="https://academy.hsoub.com/uploads/monthly_2022_06/say_hello_for_2_secs.png.0fd814ae577ba92bf30e11054513f667.png" rel=""><img alt="say_hello_for_2_secs.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100956" data-unique="6pcddjmfv" src="https://academy.hsoub.com/uploads/monthly_2022_06/say_hello_for_2_secs.png.0fd814ae577ba92bf30e11054513f667.png" style="width: 130px; height: auto;"></a> الموجودة في الفئة "مظهر Look"، وضعها مباشرةً تحت الكتل السابقة.
</p>

<p>
	لقراءة الضغط الجوي، ابحث عن الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100954" href="https://academy.hsoub.com/uploads/monthly_2022_06/pressure.png.3c48d26ef10d2f4f7a6f6d832bdb9c2b.png" rel=""><img alt="pressure.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100954" data-unique="649ectltj" src="https://academy.hsoub.com/uploads/monthly_2022_06/pressure.png.3c48d26ef10d2f4f7a6f6d832bdb9c2b.png" style="width: 70px; height: auto;"></a> في فئة "كتل إضافية More Blocks"، ثم اسحبها وأفلتها مكان الكلمة "!Hello" في الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100956" href="https://academy.hsoub.com/uploads/monthly_2022_06/say_hello_for_2_secs.png.0fd814ae577ba92bf30e11054513f667.png" rel=""><img alt="say_hello_for_2_secs.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100956" data-unique="6pcddjmfv" src="https://academy.hsoub.com/uploads/monthly_2022_06/say_hello_for_2_secs.png.0fd814ae577ba92bf30e11054513f667.png" style="width: 120px; height: auto;"></a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101000" href="https://academy.hsoub.com/uploads/monthly_2022_06/code_21.png.b71198c39ac0ee2d15ad75b172f901d4.png" rel=""><img alt="code_21.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101000" data-unique="cc9l52enh" src="https://academy.hsoub.com/uploads/monthly_2022_06/code_21.png.b71198c39ac0ee2d15ad75b172f901d4.png" style="width: 250px; height: auto;"></a>
</p>

<p>
	انقر على الراية الخضراء، وستبلغك شخصية القط القراءة الحالية للضغط الجوي من حساس الضغط بالميلي بار، وستختفي الرسالة بعد ثانيتين. حاول أن تنفخ فوق سنس هات (أو تزيد قيمة الضغط عبر المحاكي) وأن تشغل البرنامج بالتوازي فسترى قراءة أعلى هذه المرة.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تقليد الحساسات: إذا كنت تستخدم مقلّد سنس هات Sense HAT Emulator، فلا بدّ من تفعيل تفعيل الحساسات البيئية والعطالية inertial. انقر على "تعديل Edit" ثم "تفضيلات Preferences"، ثم انقر على مربعات التحقق بجوار "الحساسات البيئية Environment sensors" و"الحساسات العطالية Inertial Measurement" لتفعيلهما قبل النقر على زر "إغلاق Close"
	</p>
</blockquote>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101027" href="https://academy.hsoub.com/uploads/monthly_2022_06/showing_pressure_reading_22.png.cb06bd6aead5bf04330e3ba7551bcc0b.png" rel=""><img alt="showing_pressure_reading_22.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101027" data-unique="wkbtjt6mk" src="https://academy.hsoub.com/uploads/monthly_2022_06/showing_pressure_reading_22.thumb.png.b13323e8b498d595e490e6777ace293e.png" style="width: 700px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 18-7 عرض قراءة حساس الضغط
</p>

<p>
	ولكي نعرض مستوى الرطوبة بدلًا من الضغط، احذف الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100954" href="https://academy.hsoub.com/uploads/monthly_2022_06/pressure.png.3c48d26ef10d2f4f7a6f6d832bdb9c2b.png" rel=""><img alt="pressure.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100954" data-unique="649ectltj" src="https://academy.hsoub.com/uploads/monthly_2022_06/pressure.png.3c48d26ef10d2f4f7a6f6d832bdb9c2b.png" style="width: 70px; height: auto;"></a> واستبدلها بالكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100950" href="https://academy.hsoub.com/uploads/monthly_2022_06/humidity.png.68a9e1e1c300ba1c6bb77f5512050f97.png" rel=""><img alt="humidity.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100950" data-unique="76zfc1otw" src="https://academy.hsoub.com/uploads/monthly_2022_06/humidity.png.68a9e1e1c300ba1c6bb77f5512050f97.png" style="width: 70px; height: auto;"></a>. شغِّل البرنامج الآن وسترى قيمة مستوى الرطوبة في الغرفة. جرّب كذلك أن تنفخ فوق سنس هات (أو تزيد قيمة الرطوبة عبر المحاكي) وأن تشغّل البرنامج بالتوازي فسترى قراءة أعلى هذه المرة لأن نفسك رطبٌ جدًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101026" href="https://academy.hsoub.com/uploads/monthly_2022_06/showing_humidity_reading_23.png.89d7d1d08fde7adcfadc7d96f1e1af7d.png" rel=""><img alt="showing_humidity_reading_23.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101026" data-unique="aseyv0qoy" src="https://academy.hsoub.com/uploads/monthly_2022_06/showing_humidity_reading_23.thumb.png.11d46e609c3b6e52743c1800d36d4fdc.png" style="width: 700px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 19-7 عرض قراءة حساس الضغط
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		غيِّر القيم: إذا كنت تستخدم المقلّد، فبالإمكان تغيير القيم التي يولّدها المقلّد باستخدام المزلاج slider والأزرار. حاول أن تحرك مزلاج الضغط للأسفل، ثم انقر الراية الخضراء مجددًا.
	</p>
</blockquote>

<p>
	إذا أردت الحصول على درجة الحرارة احذف الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100950" href="https://academy.hsoub.com/uploads/monthly_2022_06/humidity.png.68a9e1e1c300ba1c6bb77f5512050f97.png" rel=""><img alt="humidity.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100950" data-unique="76zfc1otw" src="https://academy.hsoub.com/uploads/monthly_2022_06/humidity.png.68a9e1e1c300ba1c6bb77f5512050f97.png" style="width: 70px; height: auto;"></a> واستبدل بها الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100968" href="https://academy.hsoub.com/uploads/monthly_2022_06/temperature.png.2996fd385e706e05c323eb61d5396d85.png" rel=""><img alt="temperature.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100968" data-unique="lblhgm6bj" src="https://academy.hsoub.com/uploads/monthly_2022_06/temperature.png.2996fd385e706e05c323eb61d5396d85.png" style="width: 90px; height: auto;"></a>، ثم شغِّل البرنامج مجددًا وستظهر درجة الحرارة بالدرجات المئوية (سلزيوس). قد لا تكون الدرجة المعروضة نفسها درجة حرارة الغرفة الفعلية، إذ تنتج راسبيري باي حرارةً أثناء عملها فتسخِّن سنس هات وحساساتها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101028" href="https://academy.hsoub.com/uploads/monthly_2022_06/show_temperature_reading_24.png.8da61a9e78735df9220afca74b184e12.png" rel=""><img alt="show_temperature_reading_24.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101028" data-unique="wdnoja5xy" src="https://academy.hsoub.com/uploads/monthly_2022_06/show_temperature_reading_24.thumb.png.36b1258e7ba0b4790671e49613b14864.png" style="width: 700px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 20-7 عرض قراءة حساس الحرارة
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تحدٍ- تحريك وحلقات: هل يمكنك تعديل البرنامج لقراءة قيم كلّ حساسٍ على حدى، ثم تحريك النتيجة على المصفوفة الضوئية بدلًا من طباعتها على المسرح؟ هل تستطيع تنفيذ حلقة ليقرأ البرنامج المؤشرات البيئية على نحوٍ مستمر؟
	</p>
</blockquote>

<h4>
	تحسس البيئة المحيطة باستخدام بايثون
</h4>

<p>
	أنشئ برنامجًا جديدًا في ثوني واحفظه باسم "Sense HAT Sensors"، ثم اكتب الشيفرة التالية منتبهًا إلى استخدام المكتبة <code>sense_emu</code> بدلًا عن <code>sense_hat</code> عند استخدام المقلِّد:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_183" style="">
<span class="kwd">from</span><span class="pln"> sense_hat </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">SenseHat</span><span class="pln"> 
sense </span><span class="pun">=</span><span class="pln"> </span><span class="typ">SenseHat</span><span class="pun">()</span><span class="pln"> 
sense</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">()</span></pre>

<p>
	من المفيد تنفيذ الأمر <code>()sense.clear</code> في بداية برنامجك لتتأكد من عدم عرض أي شيء على المصفوفة الضوئية قد يكون عالقًا من برنامجٍ سابق.
</p>

<p>
	اكتب الأمر التالي لقراءة بيانات حساس الضغط:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_185" style="">
<span class="pln">pressure </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_pressure</span><span class="pun">()</span><span class="pln"> 
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">pressure</span><span class="pun">)</span></pre>

<p>
	انقر على أيقونة التشغيل Run وسترى قراءة الحساس مطبوعةً في نافذة المفسِّر بالميلي بار. حاول أن تنفخ فوق سنس هات، أو تزيد قيمة الضغط عبر المحاكي، وأن تشغِّل البرنامج بالتوازي فسترى قراءة أعلى هذه المرة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101025" href="https://academy.hsoub.com/uploads/monthly_2022_06/showing_higher_pressure_python_25.png.79e16d1c14abcbf986dfebbe74cb8990.png" rel=""><img alt="showing_higher_pressure_python_25.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101025" data-unique="7ekdre6vg" src="https://academy.hsoub.com/uploads/monthly_2022_06/showing_higher_pressure_python_25.thumb.png.82756ec29ae457775666f9e07397d765.png" style="width: 700px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 21-7 إظهار قراءة أعلى للضغط
</p>

<p>
	للانتقال إلى قراءة حساس الرطوبة، احذف السطرين السابقين ثم اكتب ما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_188" style="">
<span class="pln">humidity </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_humidity</span><span class="pun">()</span><span class="pln"> 
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">humidity</span><span class="pun">)</span></pre>

<p>
	انقر على أيقونة التشغيل Run، وسترى قراءةً أخرى في نافذة المفسّر تمثِّل الرطوبة النسبية بالنسبة المئوية. جرّب كذلك أن تنفخ فوق سنس هات (أو تزيد قيمة الرطوبة عبر المحاكي) وأن تشغل البرنامج بالتوازي فسترى قراءةً أعلى هذه المرة، فنفسك رطبٌ جدًا.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		غيِّر القيم: إذا كنت تستخدم المقلّد، فبالإمكان تغيير القيم التي يولّدها أي حساس باستخدام المزلاجات والأزرار. حاول أن تحرك مزلاج الضغط للأسفل، ثم انقر الراية الخضراء مجددًا.
	</p>
</blockquote>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101008" href="https://academy.hsoub.com/uploads/monthly_2022_06/display_humidity_python_26.png.8290bd6697b40f84376898d776197466.png" rel=""><img alt="display_humidity_python_26.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101008" data-unique="tyitlg9r4" src="https://academy.hsoub.com/uploads/monthly_2022_06/display_humidity_python_26.thumb.png.c39d1462f8a1eec4231f506c6f3ccbc8.png" style="width: 700px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 22-7 إظهار قراءة حساس الرطوبة.
</p>

<p>
	ولتعرض قراءة حساس الحرارة، أزِل آخر سطرين واستبدلهما بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_191" style="">
<span class="pln">temp </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_temperature</span><span class="pun">()</span><span class="pln"> 
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">temp</span><span class="pun">)</span></pre>

<p>
	شغِّل البرنامج مجددًا وستظهر درجة الحرارة بالدرجات المئوية (سلزيوس). قد لا تكون الدرجة المعروضة نفسها درجة حرارة الغرفة الفعلية، إذ تنتج راسبيري باي حرارةً أثناء عملها فتسخن سنس هات وحساساتها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101029" href="https://academy.hsoub.com/uploads/monthly_2022_06/show_temperature_reading_27.png.b3a2351c2386f5c7f7956a3989473c23.png" rel=""><img alt="show_temperature_reading_27.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101029" data-unique="y1vvav8xr" src="https://academy.hsoub.com/uploads/monthly_2022_06/show_temperature_reading_27.thumb.png.75f2d6f47fd41329406d8aa3172db35d.png" style="width: 700px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 20-7 عرض قراءة حساس الحرارة
</p>

<p>
	تعطي سنس هات درجة الحرارة عادة بناءً على قراءة حساس الحرارة المدمج ضمن حساس الرطوبة، لكن إذا أردت قراءة الحساس الآخر المُدمج مع حساس الضغط استعمل الدالة <code>()sense.get_temperature_from_pressure</code>، وقد تستخدم القراءتين معًا ثم تأخذ متوسطهما لدقة أفضل، لهذا احذف السطرين الأخيرين واكتب:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_195" style="">
<span class="pln">htemp </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_temperature</span><span class="pun">()</span><span class="pln">
ptemp </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_temperature_from_pressure</span><span class="pun">()</span><span class="pln">
temp </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">htemp </span><span class="pun">+</span><span class="pln"> ptemp</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> 
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">temp</span><span class="pun">)</span></pre>

<p>
	انقر على أيقونة التشغيل Run، وسترى قيمة درجة الحرارة المأخوذة مثل متوسطٍ لقراءتي الحساسين ضمن نافذة المفسِّر، وإذا كنت تستخدم المقلّد فستحصل على النتيجة نفسها في الحالات الثلاث.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="100973" href="https://academy.hsoub.com/uploads/monthly_2022_06/average_temp_28.png.b701846422f8b79bf1c55a49549a0cf7.png" rel=""><img alt="average_temp_28.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100973" data-unique="08g2t58ac" src="https://academy.hsoub.com/uploads/monthly_2022_06/average_temp_28.thumb.png.c7d52585b6eb076ea0d22a99139bed37.png" style="width: 700px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 24-7 درجة الحرارة بناء على قراءتي كلا الحساسين
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تحدٍ- تحريك وحلقات: هل يمكنك تعديل البرنامج لقراءة كل حساس على حدى، ثم تحريك النتيجة على المصفوفة الضوئية بدلًا من طباعتها في نافذة المفسِّر؟ هل تستطيع تنفيذ حلقة ليقرأ البرنامج المؤشرات البيئية على نحوٍ مستمر؟
	</p>
</blockquote>

<h3>
	استشعار الحركة
</h3>

<p>
	يُشكّل الجيروسكوب وحساسا التسارع والحقل المغناطيسي ما يُسمى بوحدة قياس العطالة inertial measurement unit -أواختصارًا IMU-. وعلى الرغم من أنّ قراءة هذه الحساسات ستُؤخذ تقنيًا من البيئة المحيطة، مثل شدة الحقل المغناطيسي في الجوار، إلا أنها تُستخدم عادةً لاستشعار حركة سنس هات، إذ تظهر قيمة IMU مثل مجموعة قراءات لعدّة حساسات تسمح لك بعض لغات البرمجة بقراءة كل منها بصورةٍ مستقلة، بينما تعطيك بعضها الآخر قراءةً مشتركةً لكل الحساسات.
</p>

<p>
	ولكي تتعامل مع IMU، لا بدّ من فهم طبيعة حركة الأشياء. تتحرك سنس هات وباي المتصلة معها في فراغ ثلاثي الأبعاد يحدده معلم إحداثي ثلاثي المحاور كما يلي:
</p>

<ul>
<li>
		المحور X وتُحدد عليه الحركة الجانبية من طرف إلى طرف.
	</li>
	<li>
		المحور Y وتُحدد عليه الحركة للأمام والخلف.
	</li>
	<li>
		المحور Z وتُحدد عليه الحركة للأعلى والأسفل.
	</li>
</ul>
<p>
	ويمكن لباي الدوران حول هذه المحاور، لكن وصف هذه الحركات سيتغير قليلًا؛ إذ يُدعى الدوران حول المحور X "تدحرج roll" وحول المحور Y "تقلّب pitch" وحول المحور Z "فتل Yaw". فعندما تدوّر سنس هات حول محورها القصير "Y" فأنت تُقلّبها، وعندما تدور حول المحور الطولي "X" تدحرجها، وتفتلها عندما تدور بوضعها الأفقي على الطاولة. فكّر بالأمر مثل طائرة، إذ تتقلَّب الطائرة بحلقة دائرية وهي تقلع حتى تصل إلى الارتفاع المطلوب وتتدحرج عندما تدور دوران النصر، وتفتل عندما تريد الدوران لتغيير الاتجاه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101032" href="https://academy.hsoub.com/uploads/monthly_2022_06/spatial_axeses_of_sensehat_29.png.aa28d16d99fa7f52af56cbce7e823d13.png" rel=""><img alt="spatial_axeses_of_sensehat_29.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101032" data-unique="9k46asdzg" src="https://academy.hsoub.com/uploads/monthly_2022_06/spatial_axeses_of_sensehat_29.thumb.png.568095d092ce57547fac038e81d168e9.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 25-7 المحاور الفراغية لتحديد قيمة MUI لسنس هات
</p>

<h4>
	استشعار الحركة باستخدام سكراتش
</h4>

<p>
	ابدأ برنامجًا جديدًا وحمّل موسِّع سنس هات، ثم اسحب الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100970" href="https://academy.hsoub.com/uploads/monthly_2022_06/when_GF_clicked.png.9248459fea09a401d0401e250c332379.png" rel=""><img alt="when_GF_clicked.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100970" data-unique="wv26rw8w5" src="https://academy.hsoub.com/uploads/monthly_2022_06/when_GF_clicked.png.9248459fea09a401d0401e250c332379.png" style="width: 125px; height: auto;"></a> إلى منطقة بناء البرنامج، وضع تحتها الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100963" href="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_white.png.7fe820ab69b0c77b80aaa0be5c7ec261.png" rel=""><img alt="set_all_pixels_to_white.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100963" data-unique="pzfbxs8iu" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_white.png.7fe820ab69b0c77b80aaa0be5c7ec261.png" style="width: 150px; height: auto;"></a> ، ثم غيّرها بالنقر على الزر الصغير بجوار الكلمة "white" إلى <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100959" href="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_off.png.f959bf05aa69725e9adb0ba1654a29e8.png" rel=""><img alt="set_all_pixels_to_off.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100959" data-unique="v7mmvkt29" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_off.png.f959bf05aa69725e9adb0ba1654a29e8.png" style="width: 140px; height: auto;"></a> . اسحب الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100949" href="https://academy.hsoub.com/uploads/monthly_2022_06/forever.png.0971ca9a488811e21e6f6edf3dfaaf91.png" rel=""><img alt="forever.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100949" data-unique="pq5em30qj" src="https://academy.hsoub.com/uploads/monthly_2022_06/forever.png.0971ca9a488811e21e6f6edf3dfaaf91.png" style="width: 65px; height: auto;"></a> إلى أسفل التسلسل السابق وضع داخلها الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100955" href="https://academy.hsoub.com/uploads/monthly_2022_06/say_hello.png.477de9404dea6e497fec15eff6fcb97d.png" rel=""><img alt="say_hello.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100955" data-unique="yy919syw6" src="https://academy.hsoub.com/uploads/monthly_2022_06/say_hello.png.477de9404dea6e497fec15eff6fcb97d.png" style="width: 80px; height: auto;"></a>. ستحتاج إلى كتل ضم join blocks لإظهار قراءات المحاور الثلاث (تدحرج- تقلب- فتل)، إضافةً إلى كتل سنس هات الموافقة. تذكر إضافة فواصل ومسافات فارغة أثناء ترتيب كتل الضم لتسهيل قراءة النتيجة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101001" href="https://academy.hsoub.com/uploads/monthly_2022_06/code_30.png.35be27f6a2c177b553558bc5704f1917.png" rel=""><img alt="code_30.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101001" data-unique="ob1l99t7n" src="https://academy.hsoub.com/uploads/monthly_2022_06/code_30.png.35be27f6a2c177b553558bc5704f1917.png" style="width: 600px; height: auto;"></a>
</p>

<p>
	انقر على الراية الخضراء لتشغيل البرنامج، ثم حاول تدوير سنس هات وباي بحذر كي لا تزيح الكابلات. ستظهر قيم المحاور الثلاث وتتغير باستمرار مع تغير وضع سنس هات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101007" href="https://academy.hsoub.com/uploads/monthly_2022_06/diplsy_three_axes_values_31.png.28c32e177e5ba1ee0f7136cbf9947f83.png" rel=""><img alt="diplsy_three_axes_values_31.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101007" data-unique="haggsptwq" src="https://academy.hsoub.com/uploads/monthly_2022_06/diplsy_three_axes_values_31.thumb.png.fca1cbf5df0627d6ea0f4e05b60d901a.png" style="width: 700px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 26-7 عرض قيم التقلب pitch والتدحرج roll والفتل yaw
</p>

<h4>
	استشعار الحركة باستخدام بايثون
</h4>

<p>
	ابدأ برنامجًا جديدًا في ثوني واحفظه باسم "Sense HAT Movement"، ثم اكتب الشيفرة التالية منتبهًا إلى استخدام المكتبة <code>sense_emu</code> بدلًا عن <code>sense_hat</code> عند استخدام المقلد:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_136" style="">
<span class="kwd">from</span><span class="pln"> sense_hat </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">SenseHat</span><span class="pln">
sense </span><span class="pun">=</span><span class="pln"> </span><span class="typ">SenseHat</span><span class="pun">()</span><span class="pln"> 
sense</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">()</span></pre>

<p>
	لاستخدام معلومات عن IMU في تحديد الوجهة الحالية لسنس هات وفقًا لمحاورها الثلاث، اكتب الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_138" style="">
<span class="pln">orientation </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_orientation</span><span class="pun">()</span><span class="pln">
pitch </span><span class="pun">=</span><span class="pln"> orientation</span><span class="pun">[</span><span class="str">"pitch"</span><span class="pun">]</span><span class="pln"> 
roll </span><span class="pun">=</span><span class="pln"> orientation</span><span class="pun">[</span><span class="str">"roll"</span><span class="pun">]</span><span class="pln"> 
yaw </span><span class="pun">=</span><span class="pln"> orientation</span><span class="pun">[</span><span class="str">"yaw"</span><span class="pun">]</span><span class="pln"> 
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"pitch {0} roll {1} yaw {2}"</span><span class="pun">.</span><span class="pln">format</span><span class="pun">(</span><span class="pln">pitch</span><span class="pun">,</span><span class="pln"> roll</span><span class="pun">,</span><span class="pln"> yaw</span><span class="pun">))</span></pre>

<p>
	انقر على أيقونة التشغيل Run وسترى قراءات اتجاه سنس هات على المحاور الثلاث. حاول تدوير سنس هات ثم انقر على أيقونة التشغيل مجددًا وستلاحظ تغيُّر القراءات بما يعكس الوجهة الجديدة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101024" href="https://academy.hsoub.com/uploads/monthly_2022_06/showing_axes_rotation_python_32.png.0507c85b76037e5c710c527df2091ebc.png" rel=""><img alt="showing_axes_rotation_python_32.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101024" data-unique="zgijg62vq" src="https://academy.hsoub.com/uploads/monthly_2022_06/showing_axes_rotation_python_32.png.0507c85b76037e5c710c527df2091ebc.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	عرض قيم التقلب pitch والتدحرج roll والفتل yaw
</p>

<p>
	يمكن أن يسهم قياس MUI بأكثر من تحديد وجهة سنس هات فهو قادرٌ على اكتشاف الحركة. وللحصول على قراءة دقيقة للحركة، لا بدّ من قراءة MUI باستمرار من خلال حلقات، فلن تعطيك قراءة واحدة أية فائدة تُذكر في استشعار الحركة على خلاف تحديد الوجهة. احذف كل ما يأتي بعد الدالة <code>()sense.clear</code> واكتب التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_141" style="">
<span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">
    acceleration </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_accelerometer_raw</span><span class="pun">()</span><span class="pln">
    x </span><span class="pun">=</span><span class="pln"> acceleration</span><span class="pun">[</span><span class="str">'x'</span><span class="pun">]</span><span class="pln">    
    y </span><span class="pun">=</span><span class="pln"> acceleration</span><span class="pun">[</span><span class="str">'y'</span><span class="pun">]</span><span class="pln">    
    z </span><span class="pun">=</span><span class="pln"> acceleration</span><span class="pun">[</span><span class="str">'z'</span><span class="pun">]</span></pre>

<p>
	لدينا الآن ثلاثة متغيرات لتخزين قراءات مقياس التسارع على المحاور الثلاث: X للحركة يمينًا ويسارًا، Y للحركة أمامًا وخلفًا، Z للأعلى والأسفل. من الصعب أحيانًا قراءة بيانات مقياس التسارع، لذلك اكتب الشيفرة التالية لتدوير الرقم إلى أقرب عدد صحيح وبذلك يسهل فهمها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_143" style="">
<span class="pln">    x </span><span class="pun">=</span><span class="pln"> round</span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln">
    y </span><span class="pun">=</span><span class="pln"> round</span><span class="pun">(</span><span class="pln">y</span><span class="pun">)</span><span class="pln">
    z </span><span class="pun">=</span><span class="pln"> round</span><span class="pun">(</span><span class="pln">z</span><span class="pun">)</span></pre>

<p>
	اطبع النتائج بعد ذلك كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_146" style="">
<span class="pln">    </span><span class="kwd">print</span><span class="pun">(</span><span class="str">"x={0}, y={1}, z={2}"</span><span class="pun">.</span><span class="pln">format</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> z</span><span class="pun">))</span></pre>

<p>
	انقر على أيقونة التشغيل وسترى قراءات مقياس التسارع مطبوعةً على شاشة المفسِّر، لكنه سيستمر في طباعة الأرقام بلا توقُّف وعليك النقر على أيقونة "Stop" لإيقاف البرنامج.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="100947" href="https://academy.hsoub.com/uploads/monthly_2022_06/accelerometer_reading_python_33.png.2a570736640edf915a37f939660f48a3.png" rel=""><img alt="accelerometer_reading_python_33.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100947" data-unique="r00h1s9yi" src="https://academy.hsoub.com/uploads/monthly_2022_06/accelerometer_reading_python_33.png.2a570736640edf915a37f939660f48a3.png" style="width: 700px; height: auto;"></a>
</p>

<p>
	شكل 28-7 قراءات مقياس التسارع مقرّبة إلى أقرب رقم صحيح. نلاحظ أن مقياس التسارع يعطي القراءة 1.0 للجاذبية (1G) على أحد المحاور (المحور Z إذا كانت باي وسنس هات أفقيتان على الطاولة) على الرغم من أن سنس هات لا تتحرك، والسبب وراء ذلك هو أن الحساس يستشعر الجاذبية الأرضية التي تشد سنس هات نحو مركز الأرض.
</p>

<p>
	حاول رفع سنس هات مع باي للأعلى بحذر أثناء عمل البرنامج، لكن انتبه كي لا تُزاح الكابلات. أمِل اللوحتان بحيث يتجّه منفذا الشبكة المحلية والناقل USB نحو الأرض فستتغير القراءة لتصبح 0G على Z و 1G على X، وستتحول القراءتان على X و Z إلى 0G وعلى Y إلى 1G عندما تميل اللوحتان بحيث يتجه منفذ HDMI لباي نحو الأرض. إذا حاولت أن تميلها بحيث يتجه منفذ HDMI نحو السقف ستتغير القراءة على Y لتصبح 1G-. وبمعرفة أن الجاذبية الأرضية هي تقريبًا 1G وفهم المحاور الفراغية بالطريقة التي عرّفناها سابقًا، ستتمكن من استعمال قراءات مقياس التسارع لتحديد توجّه اللوحة نحو الأسفل والأعلى، وستتمكن أيضًا من اكتشاف الحركة. حاول أن تهزّ اللوحتين وراقب الأرقام في نافذة المفسِّر، وكلّما زادت شدة الاهتزاز كلما زادت قراءة مقياس التسارع.
</p>

<p>
	عندما تستخدم الدالة <code>()sense.get_accelerometer_raw</code>، فأنت تخبر سنس هات في هذه الحالة أن تعطِّل الحساسين الباقيين في IMU (الجيروسكوب ومقياس الحقل المغناطيسي) وتعيد قراءات مقياس التسارع فقط، ويمكن طبعًا فعل نفس الشيء عند استخدام أي حساسٍ آخر. استبدل السطر:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_149" style="">
<span class="pln">acceleration </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_accelerometer_raw</span><span class="pun">()</span></pre>

<p>
	بالسطر:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_152" style="">
<span class="pln">orientation </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_gyroscope_raw</span><span class="pun">()</span></pre>

<p>
	غيّر الكلمة <code>acceleration</code> في الأسطر الثلاثة داخل الحلقة إلى <code>orientation</code>، ثم انقر أيقونة التشغيل لترى قيم توجه سنس هات على المحاور الثلاث مدوّرةً إلى أقرب عدد صحيح. ستأتيك البيانات هذه المرة من الجيروسكوب فقط دون استخدام مقياسي الحقل المغناطيس والتسارع، ويفيد ذلك في تحديد وجهة سنس هات إن تحركت على ظهر روبوت مثلًا دون الحاجة لأخذ تعقيدات الحركة بالحسبان أو استخدامها في جوار مصدر قوي للإشعاع المغناطيسي.
</p>

<p>
	لاستخدام مقياس الحقل المغناطيسي، أوقف البرنامج ثم احذف كل أسطر برنامجك ما عدا الأربعة الأولى منه، ثم اكتب الشيفرة التالية تحت بداية الحلقة <code>while True</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_155" style="">
<span class="pln">north </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_compass</span><span class="pun">()</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">north</span><span class="pun">)</span></pre>

<p>
	شغِّل برنامجك وسترى اتجاه الشمال المغناطيسي وقد طُبع في نافذة المفسِّر. دوّر سنس هات بلطف وستلاحظ تغيرات القراءة نظرًا لانحراف توجهها بالنسبة للشمال المغناطيسي. لقد نجحت في صناعة بوصلة. قرِّب مغناطيسًا (يمكنك استخدام المغانط التي تُلصق على البرادات) من سنس هات وراقب تغيّر قراءة مقياس الحقل المغناطيسي.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تحدٍ- دوران تلقائي: هل تستطيع بمهارتك التي اكتسبتها في التعامل مع المصفوفة الضوئية ومقاييس العطالة أن تكتب برنامجًا يدوّر صورةً لتلائم وضعية سنس هات؟
	</p>
</blockquote>

<h3>
	التحكم بمقبض الألعاب
</h3>

<p>
	يتواجد في الزاوية اليمينية السفلية لسنس هات، وقد تراه صغيرًا لكنه فعّال جدًا وقادرٌ على تمييز إشارات الدخل من أربعة جهات (أمام وخلف ويمين ويسار)، كما يمتلك قناة دخل خامسة تصل إليها بالضغط على المقبض في منتصفه وكأنه زر الكبس في المنتصف.
</p>

<p>
	<strong>تحذير</strong>: لا ينبغي استخدام مقبض سنس هات ما لم تستخدم المباعدات التي تحدثنا عن تثبيتها سابقًا، لأن الضغط على المقبض سيثني سنس هات مما يسبب في تضررها وتضرر منصة GPIO معها.
</p>

<h4>
	التحكم بمقبض الألعاب باستخدام سكراتش
</h4>

<p>
	ابدأ برنامجًا جديدًا وحمّل موسِّع سنس هات، ثم اسحب الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100970" href="https://academy.hsoub.com/uploads/monthly_2022_06/when_GF_clicked.png.9248459fea09a401d0401e250c332379.png" rel=""><img alt="when_GF_clicked.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100970" data-unique="wv26rw8w5" src="https://academy.hsoub.com/uploads/monthly_2022_06/when_GF_clicked.png.9248459fea09a401d0401e250c332379.png" style="width: 120px; height: auto;"></a> إلى منطقة بناء البرنامج وضع تحتها الكتلة <img alt="set_all_pixels_to_white.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100963" data-unique="er1yl9ix1" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_white.png.7fe820ab69b0c77b80aaa0be5c7ec261.png" style="width: 150px; height: auto;"> واضبط الخيار "white" على "off".
</p>

<p>
	يرتبط مقبض سنس هات في سكراتش scratch مع مفاتيح الأسهم في لوحة المفاتيح، فعندما تضغط زر "أمام" في المقبض فهذا أمرٌ مماثل لضغط مفتاح السهم "أعلى" وكذلك الأمر عند ضغط زر المقبض اليساري فهذا مماثلٌ لضغط مفتاح السهم اليساري في لوحة المفاتيح وهكذا، بينما يطابق ضغط المقبض في منتصفه مثل زر الكبس ضغط المفتاح "Enter" في لوحة المفاتيح.
</p>

<p>
	<strong>تحذير</strong>: لا يتوفر مقبض الألعاب سوى على سنس هات الفيزيائية، فإذا كنت تستخدم المقلِّد فعليك بمفاتيح الأسهم على لوحة المفاتيح لمحاكاة المقبض.
</p>

<p>
	نظرًا للارتباط السابق، سنستعمل كتل الأحداث نفسها التي نستخدمها لقراءة مُدخلات لوحة المفاتيح. اسحب الآن الكتلة <img alt="when_space_key_pressed.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100971" data-unique="d7hk8p8wa" src="https://academy.hsoub.com/uploads/monthly_2022_06/when_space_key_pressed.png.00226a1d618b9c91aa6fbc6eeb2d8376.png" style="width: 180px; height: auto;"> إلى منطقة بناء البرنامج، ثم غيّر الخيار فيها إلى "up arrow" بدلًا من "space". اسحب الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100956" href="https://academy.hsoub.com/uploads/monthly_2022_06/say_hello_for_2_secs.png.0fd814ae577ba92bf30e11054513f667.png" rel=""><img alt="say_hello_for_2_secs.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100956" data-unique="6pcddjmfv" src="https://academy.hsoub.com/uploads/monthly_2022_06/say_hello_for_2_secs.png.0fd814ae577ba92bf30e11054513f667.png" style="width: 130px; height: auto;"></a> وضعها تحت الكتلة السابقة حتى نرى نتيجة هذا البرنامج.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101002" href="https://academy.hsoub.com/uploads/monthly_2022_06/code_34.png.4178c0bc5cb045d27523a3b568630dae.png" rel=""><img alt="code_34.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101002" data-unique="n5v6yljga" src="https://academy.hsoub.com/uploads/monthly_2022_06/code_34.png.4178c0bc5cb045d27523a3b568630dae.png" style="width: 250px; height: auto;"></a>
</p>

<p>
	تحرك إلى الأمام من خلال المقبض وستشاهد القط يحييك بالعبارة "!Hello". عدّل العبارة السابقة لتصبح "!Joystick Up" ثم أضف كتل أحداث Events وكتل مظهر Looks إلى برنامجك حتى يعطي الضغط على أي زر من أزرار المقبض الخمسة نتيجة على النحو التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101003" href="https://academy.hsoub.com/uploads/monthly_2022_06/code_35.png.7e2f2634c46528a225fd2fbbdb3fdcc9.png" rel=""><img alt="code_35.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101003" data-unique="njfu2ai9f" src="https://academy.hsoub.com/uploads/monthly_2022_06/code_35.thumb.png.a71e658ab0a4b7b63c8b8ce155aa0b7f.png"></a>
</p>

<p>
	اضغط على أزرار المقبض بكل الاتجاهات لكي ترى نتيجة عملك.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تحدٍ أخير: هل يمكنك استخدام مقبض سنس هات للتحكم بشخصية سكراتش على المسرح؟ هل يمكنك عرض رسالة تهنئة على المصفوفة الضوئية إن نجحت الشخصية بجمع أغراض على المسرح؟ (هذه الأغراض طبعًا هي شخصيات أخرى)
	</p>
</blockquote>

<h4>
	التحكم بمقبض الألعاب باستخدام بايثون
</h4>

<p>
	ابدأ برنامجًا جديدًا في ثوني واحفظه باسم "Sense HAT Joystick"، ثم اكتب الأسطر الثلاث التي تهيئ سينس هات وتطفئ أضواء المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_164" style="">
<span class="kwd">from</span><span class="pln"> sense_hat </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">SenseHat</span><span class="pln">
sense </span><span class="pun">=</span><span class="pln"> </span><span class="typ">SenseHat</span><span class="pun">()</span><span class="pln">
sense</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">()</span></pre>

<p>
	استخدم تاليًا حلقةً لا نهائية <code>while True</code> وأخبر بايثون أن ينصت ضمنها إلى أحداث الدخل الناتجة عن الضغط على أزرار المقبض. سيزيح ثوني الشيفرة تلقائيًا بمسافة بادئة داخل الحلقة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_167" style="">
<span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">for</span><span class="pln"> event </span><span class="kwd">in</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">stick</span><span class="pun">.</span><span class="pln">get_events</span><span class="pun">():</span></pre>

<p>
	أضِف أخيرًا الشيفرة التي تنفذ شيئًا عند ضغط زر المقبض المحدد داخل حلقة for، وسيزيحها ثوني تلقائيًا أيضًا بمسافة بادئة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_169" style="">
<span class="pln">        </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">event</span><span class="pun">.</span><span class="pln">direction</span><span class="pun">,</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">action</span><span class="pun">)</span></pre>

<p>
	انقر على أيقونة التشغيل Run، واضغط على الأزرار المختلفة لمقبض سنس هات وسترى أسماء الجهات التي تحركت نحوها قد طُبعت في نافذة المفسِّر. وستلاحظ أيضًا أن هناك حدثان مرتبطان بكبسةٍ واحدةٍ على أحد أزرار المقبض الأول عند الضغط على الزر والآخر عند تحريره. يمكن الاستفادة من هذا برمجيًا كما لو كنت تبرمج حركةً لشخصيةٍ في لعبة، بحيث تتقدم باتجاه محدد عند الضغط على زر ثم تتوقف بمجرد أن تحرره.
</p>

<p>
	يمكن استخدام المقبض لتفعيل دوال بدلًا من أن يكون استخدامها محدودًا ضمن حلقة "for". احذف كل الأسطر التي تلي الدالة <code>()sense.clear</code> واكتب الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_171" style="">
<span class="kwd">def</span><span class="pln"> red</span><span class="pun">():</span><span class="pln">    
    sense</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> blue</span><span class="pun">():</span><span class="pln">    
    sense</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> green</span><span class="pun">():</span><span class="pln">    
    sense</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">  
</span><span class="kwd">def</span><span class="pln"> yellow</span><span class="pun">():</span><span class="pln">    
    sense</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span></pre>

<p>
	تحوّل هذه الدوال المصفوفة الضوئية إلى لون وحيد (أحمر أو أزرق أو أخضر أو أصفر) لتسهيل طريقة عرض برنامجك. ولكي تستدعي هذه الدوال لا بُد من تحديد أي دالة تتوافق مع أي زرٍ للمقبض، لذلك اكتب الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_173" style="">
<span class="pln">sense</span><span class="pun">.</span><span class="pln">stick</span><span class="pun">.</span><span class="pln">direction_up </span><span class="pun">=</span><span class="pln"> red 
sense</span><span class="pun">.</span><span class="pln">stick</span><span class="pun">.</span><span class="pln">direction_down </span><span class="pun">=</span><span class="pln"> blue 
sense</span><span class="pun">.</span><span class="pln">stick</span><span class="pun">.</span><span class="pln">direction_left </span><span class="pun">=</span><span class="pln"> green 
sense</span><span class="pun">.</span><span class="pln">stick</span><span class="pun">.</span><span class="pln">direction_right </span><span class="pun">=</span><span class="pln"> yellow 
sense</span><span class="pun">.</span><span class="pln">stick</span><span class="pun">.</span><span class="pln">direction_middle </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">clear</span></pre>

<p>
	يحتاج البرنامج الآن إلى حلقة لا نهائية تُعرف بالحلقة الأساسية التي تُبقي البرنامج مستمرًا في عمله لمراقبة الدخل القادم إلى باي عبر مقبض سنس هات بدلًا من تنفيذ الشيفرة مرةً واحدةً ثم توقف البرنامج. اكتب الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_175" style="">
<span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">    
    </span><span class="kwd">pass</span></pre>

<p>
	انقر على أيقونة التشغيل وحاول التحكم بالمقبض وستشاهد تألق المصفوفة الضوئية بألوان مختلفة، ولإطفاء الأضواء اضغط على المقبض ككل لأن الضغط على منتصفه سيستدعي الدالة <code>()sense.clear</code> التي تطفئ المصفوفة.
</p>

<p>
	تهانينا، أصبحت قادرًا على التقاط إشارات مقبض سنس هات.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تحدٍ أخير: هل يمكنك استخدام ما تعلمته في رسم صورة على الشاشة ثم تدويرها باتجاه زر المقبض الذي تضغطه؟ هل يمكنك التبديل بين أكثر من صورة عند الضغط على زر المنتصف؟
	</p>
</blockquote>

<h2>
	مشروع سكراتش: جهاز أضواء راقصة يتعلق بالحرارة
</h2>

<p>
	طالما أنك انطلقت في مسيرتك في عالم سنس هات فقد حان الوقت لتضع كل ما تعلمته في تصميم جهاز أضواء راقصة حساس للحرارة، وهو جهاز يكون في أوج لمعانه عندما يكون باردًا ثم يبطئ تدريجيًا عندما يسخن.
</p>

<p>
	ابدأ مشروعًا جديدًا في سكراتش وحمّل موّسع سنس هات من فئة "كتل إضافية More Blocks". اسحب كما جرت العادة الكتلتين <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100970" href="https://academy.hsoub.com/uploads/monthly_2022_06/when_GF_clicked.png.9248459fea09a401d0401e250c332379.png" rel=""><img alt="when_GF_clicked.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100970" data-unique="wv26rw8w5" src="https://academy.hsoub.com/uploads/monthly_2022_06/when_GF_clicked.png.9248459fea09a401d0401e250c332379.png" style="width: 120px; height: auto;"></a> و <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100963" href="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_white.png.7fe820ab69b0c77b80aaa0be5c7ec261.png" rel=""><img alt="set_all_pixels_to_white.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100963" data-unique="pzfbxs8iu" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_all_pixels_to_white.png.7fe820ab69b0c77b80aaa0be5c7ec261.png" style="width: 145px; height: auto;"></a>. ولا تنسَ تغيير الخيار "white" إلى "off" في الكتلة الأخيرة. سنبدأ بتصميم الجهاز البسيط بحرفية، لذلك اسحب الكتلة إلى منطقة بناء البرنامج، ثم ضع بداخلها الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100965" href="https://academy.hsoub.com/uploads/monthly_2022_06/set_pixel_0_0_to_R_255_G_255_B_255.png.a7b472ca7a995fdab3e8915c3f138d54.png" rel=""><img alt="set_pixel_0_0_to_R_255_G_255_B_255.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100965" data-unique="k8zhq730g" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_pixel_0_0_to_R_255_G_255_B_255.png.a7b472ca7a995fdab3e8915c3f138d54.png" style="width: 220px; height: auto;"></a> ثم املأ جميع فراغاتها بكتلة المعامل <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100953" href="https://academy.hsoub.com/uploads/monthly_2022_06/pick_random_1_to_10.png.432ed9c0213e6a891a90927367217fc4.png" rel=""><img alt="pick_random_1_to_10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100953" data-unique="klfmte4cs" src="https://academy.hsoub.com/uploads/monthly_2022_06/pick_random_1_to_10.png.432ed9c0213e6a891a90927367217fc4.png" style="width: 135px; height: auto;"></a>. يمثِّل أول مربعين فارغين الإحداثيين X و Y لموقع المؤشر الضوئي في المصفوفة لذلك لا بُد من تعديل كتلتي اختيار الرقم العشوائي في كلا الفراغين لتصبح من 0 إلى 7 بدلًا من 1 إلى 10؛ وكذلك الأمر بالنسبة للفراغات الثلاث التالية التي تمثِّل كمية اللون الأحمر ثم الأخضر ثم الأزرق، فلا بُد من تغيير مجال المتغير العشوائي ضمنها ليكون من 0 إلى 255 بدلًا من 1 إلى 10.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101004" href="https://academy.hsoub.com/uploads/monthly_2022_06/code_36.png.4f4ad7acebe7fccdf14c0e13dac1b995.png" rel=""><img alt="code_36.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101004" data-unique="w8c0o8m10" src="https://academy.hsoub.com/uploads/monthly_2022_06/code_36.thumb.png.564bf8ab685036ab6f1e4f0126d3289b.png" style="width: 700px; height: auto;"></a>
</p>

<p>
	انقر على الراية الخضراء وسترى المصفوفة الضوئية في سنس هات تضيء بألوان عشوائية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101031" href="https://academy.hsoub.com/uploads/monthly_2022_06/sparkler_scratch_37.png.484fde13d1e43b8064e86db81951fbbb.png" rel=""><img alt="sparkler_scratch_37.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101031" data-unique="4htkwc90j" src="https://academy.hsoub.com/uploads/monthly_2022_06/sparkler_scratch_37.png.484fde13d1e43b8064e86db81951fbbb.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 29-7 ضاءة المؤشرات الضوئية بألوان عشوائية
</p>

<p>
	تهانينا، لقد صنعت جهاز بريق الكتروني.
</p>

<p>
	لا يتفاعل هذا الجهاز مع محيطه حتى اللحظة، لذلك اسحب الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100969" href="https://academy.hsoub.com/uploads/monthly_2022_06/wait_1_secs.png.fe314c5786687e40d33d29e4e352d19a.png" rel=""><img alt="wait_1_secs.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100969" data-unique="6uec4ygtw" src="https://academy.hsoub.com/uploads/monthly_2022_06/wait_1_secs.png.fe314c5786687e40d33d29e4e352d19a.png" style="width: 80px; height: auto;"></a> وضعها تحت الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100964" href="https://academy.hsoub.com/uploads/monthly_2022_06/set_pixel.png.7e4a26d1ae7a0a8e40b78a9ff14b33d9.png" rel=""><img alt="set_pixel.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100964" data-unique="jj7rlyp8a" src="https://academy.hsoub.com/uploads/monthly_2022_06/set_pixel.png.7e4a26d1ae7a0a8e40b78a9ff14b33d9.png" style="width: 65px; height: auto;"></a> ضمن الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100949" href="https://academy.hsoub.com/uploads/monthly_2022_06/forever.png.0971ca9a488811e21e6f6edf3dfaaf91.png" rel=""><img alt="forever.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100949" data-unique="pq5em30qj" src="https://academy.hsoub.com/uploads/monthly_2022_06/forever.png.0971ca9a488811e21e6f6edf3dfaaf91.png" style="width: 65px; height: auto;"></a>. اسحب كتلة عامل القسمة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100948" href="https://academy.hsoub.com/uploads/monthly_2022_06/divide.png.f728d66811e1df58fe51807a67c092b1.png" rel=""><img alt="divide.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100948" data-unique="cyeyoiv6w" src="https://academy.hsoub.com/uploads/monthly_2022_06/divide.png.f728d66811e1df58fe51807a67c092b1.png" style="width: 50px; height: auto;"></a> وضعها مكان الرقم 1 في كتلة الانتظار، ثم اسحب الكتلة <a class="ipsAttachLink ipsAttachLink_image" data-fileid="100968" href="https://academy.hsoub.com/uploads/monthly_2022_06/temperature.png.2996fd385e706e05c323eb61d5396d85.png" rel=""><img alt="temperature.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100968" data-unique="lblhgm6bj" src="https://academy.hsoub.com/uploads/monthly_2022_06/temperature.png.2996fd385e706e05c323eb61d5396d85.png" style="width: 95px; height: auto;"></a> وضعها في فراغ كتلة عامل القسمة الأول وضع 10 في الفراغ الثاني.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101005" href="https://academy.hsoub.com/uploads/monthly_2022_06/code_38.png.e08b2785755d63604083be4f162ca486.png" rel=""><img alt="code_38.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101005" data-unique="279xxvs32" src="https://academy.hsoub.com/uploads/monthly_2022_06/code_38.thumb.png.2a73ddc2c7b2f9306cadf38058e3c46d.png" style="width: 750px; height: auto;"></a>
</p>

<p>
	انقر الراية الخضراء مجددًا وستلاحظ أن حدة اللمعان قد انخفضت بوضوح، إلا إذا كنت تعيش في مكان بارد جدًا، ويعود السبب وراء ذلك إلى تصميمك تأخير زمني متعلِّق بالحرارة، إذ ينتظر برنامجك عددًا من الثواني تساوي قيمة درجة الحرارة مقسومةً على 10 قبل تنفيذ ما هو موجود داخل الحلقة؛ فلو كانت درجة الحرارة 20 مئوية سينتظر البرنامج ثانيتين، وينتظر ثانية إذا كانت درجة الحرارة 10 مئوية وأقل من ثانية إذا كانت تحت 10 درجات مئوية؛ أما إن كانت القراءة سالبة (الحرارة تحت الصفر المئوي)، فلن يكون هناك تأخير زمني إطلاقًا وستُنفذ الحلقة دون تأخير.
</p>

<p>
	تهانينا، لقد أنجزت بنفسك برنامجًا يُكامل بين مختلف ميزات سنس هات.
</p>

<p>
	للاطلاع على مشاريع أخرى تستخدم سنس هات، عليك بالملحق "D" (اطلع أكثر)
</p>

<h2>
	مشروع بايثون: مسبار ترايكوردر
</h2>

<p>
	طالما أنك انطلقت في مسيرتك في عالم سنس هات فقد حان الوقت لتضع كل ما تعلمته في تصميم جهاز ترايكوردر Tricorder، وهو جهاز يعرفه جيدًا محبي بعض أفلام الخيال العلمي (ستار ترك تحديدًا) بأنه مسبارٌ قادرٌ على تحليل بيانات الحساسات التي يضمها.
</p>

<p>
	ابدأ مشروعًا جديدًا في ثوني واحفظه باسم "Tricorder" ثم اكتب الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_229" style="">
<span class="kwd">from</span><span class="pln"> sense_hat </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">SenseHat</span><span class="pln">
sense </span><span class="pun">=</span><span class="pln"> </span><span class="typ">SenseHat</span><span class="pun">()</span><span class="pln"> 
sense</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">()</span></pre>

<p>
	علينا في الخطوة الثانية تعريف دوال لكل حساس من حساسات سنس هات، وسنبدأ بحساسات IMU:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_231" style="">
<span class="kwd">def</span><span class="pln"> orientation</span><span class="pun">():</span><span class="pln">    
    orientation </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_orientation</span><span class="pun">()</span><span class="pln">    
    pitch </span><span class="pun">=</span><span class="pln"> orientation</span><span class="pun">[</span><span class="str">"pitch"</span><span class="pun">]</span><span class="pln">    
    roll </span><span class="pun">=</span><span class="pln"> orientation</span><span class="pun">[</span><span class="str">"roll"</span><span class="pun">]</span><span class="pln">    
    yaw </span><span class="pun">=</span><span class="pln"> orientation</span><span class="pun">[</span><span class="str">"yaw"</span><span class="pun">]</span></pre>

<p>
	وطالما أننا سنحرك نتائج قراءة الحساسات على شاشة المصفوفة الضوئية، فمن الأفضل تدوير القراءات إلى رقمٍ عشري واحد بعد الفاصلة حتى لا ننتظر مرور عشرات الأرقام قبل أن ننتهي من عرض أحد النتائج:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_233" style="">
<span class="pln">    pitch </span><span class="pun">=</span><span class="pln"> round</span><span class="pun">(</span><span class="pln">pitch</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">    
    roll </span><span class="pun">=</span><span class="pln"> round</span><span class="pun">(</span><span class="pln">roll</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">    
    yaw </span><span class="pun">=</span><span class="pln"> round</span><span class="pun">(</span><span class="pln">yaw</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span></pre>

<p>
	سنحتاج أخيرًا إلى تحريك النتائج على المصفوفة لأن الترايكوردر مسبارٌ محمولٌ باليد، ولا حاجة لوصله إلى شاشة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_235" style="">
<span class="pln">    sense</span><span class="pun">.</span><span class="pln">show_message</span><span class="pun">(</span><span class="str">"Pitch {0}, Roll {1}, Yaw {2}"</span><span class="pun">.</span><span class="pln"> format</span><span class="pun">(</span><span class="pln">pitch</span><span class="pun">,</span><span class="pln"> roll</span><span class="pun">,</span><span class="pln">     yaw</span><span class="pun">))</span></pre>

<p>
	لقد انتهينا الآن من إنشاء دالةٍ تقرأ وتُظهر وجهة سنس هات بناءً على مقياس IMU، وعلينا الآن إنشاء دوال مماثلة لبقية الحساسات. لنبدأ بحساس الحرارة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_237" style="">
<span class="kwd">def</span><span class="pln"> temperature</span><span class="pun">():</span><span class="pln">    
    temp </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_temperature</span><span class="pun">()</span><span class="pln">    
    temp </span><span class="pun">=</span><span class="pln"> round</span><span class="pun">(</span><span class="pln">temp</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">    
    sense</span><span class="pun">.</span><span class="pln">show_message</span><span class="pun">(</span><span class="str">"Temperature: %s degrees Celsius"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> temp</span><span class="pun">)</span></pre>

<p>
	انتبه إلى السطر الذي يعرض النتيجة على المصفوفة الضوئية ولاحظ وجود الرمز <code>s%</code>، ويُدعى هذا الرمز "محدد مكان placeholder" ويُستبدل بمحتوى المتغير <code>temp</code>، ويساعدك ذلك على تنسيق الخرج بطريقة جميلة تظهر فيها القراءة بين عنوان "Temperature" ووحدة القياس "degrees Celsius".
</p>

<p>
	سننشئ الآن دالةً لحساس الرطوبة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_239" style="">
<span class="kwd">def</span><span class="pln"> humidity</span><span class="pun">():</span><span class="pln">
    humidity </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_humidity</span><span class="pun">()</span><span class="pln">    
    humidity </span><span class="pun">=</span><span class="pln"> round</span><span class="pun">(</span><span class="pln">humidity</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">    
    sense</span><span class="pun">.</span><span class="pln">show_message</span><span class="pun">(</span><span class="str">"Humidity: %s percent"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> humidity</span><span class="pun">)</span></pre>

<p>
	ثم لحساس الضغط البارومتري:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_242" style="">
<span class="kwd">def</span><span class="pln"> pressure</span><span class="pun">():</span><span class="pln">    
    pressure </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_pressure</span><span class="pun">()</span><span class="pln">    
    pressure </span><span class="pun">=</span><span class="pln"> round</span><span class="pun">(</span><span class="pln">pressure</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">    
    sense</span><span class="pun">.</span><span class="pln">show_message</span><span class="pun">(</span><span class="str">"Pressure: %s millibars"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> pressure</span><span class="pun">)</span></pre>

<p>
	وأخيرًا للبوصلة التي تعتمد على قراءة حساس الحقل المغناطيسي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_244" style="">
<span class="kwd">def</span><span class="pln"> compass</span><span class="pun">():</span><span class="pln">    
    </span><span class="kwd">for</span><span class="pln"> i </span><span class="kwd">in</span><span class="pln"> range</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">):</span><span class="pln">        
        north </span><span class="pun">=</span><span class="pln"> sense</span><span class="pun">.</span><span class="pln">get_compass</span><span class="pun">()</span><span class="pln">    
        north </span><span class="pun">=</span><span class="pln"> round</span><span class="pun">(</span><span class="pln">north</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">    
        sense</span><span class="pun">.</span><span class="pln">show_message</span><span class="pun">(</span><span class="str">"North: %s degrees"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> north</span><span class="pun">)</span></pre>

<p>
	استخدمنا في الدالة السابقة حلقةً قصيرةً ومحدودةً لتأخذ عدة قراءات متلاحقة من مقياس الحقل المغناطيسي للتأكُّد من كفاية البيانات لإظهار قراءة دقيقة. عدِّل مجال الحلقة إلى 20 أو 30 وحتى 100 إن شعرت بأن القراءة غير مستقرة وذلك لتحسين الدقة.
</p>

<p>
	يتكون برنامجك الآن من خمس دوال تقرأ كلٌ منها بيانات أحد حساسات سنس هات ثم تحرِّك هذه البيانات على المصفوفة الضوئية. بقي علينا إيجاد طريقة لنختار الحساس الذي سنعرض بياناته ومن المؤكد أن مقبض سنس هات هو الحل الأمثل.
</p>

<p>
	اكتب الشيفرة التالية إذًا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_246" style="">
<span class="pln">sense</span><span class="pun">.</span><span class="pln">stick</span><span class="pun">.</span><span class="pln">direction_up </span><span class="pun">=</span><span class="pln"> orientation
sense</span><span class="pun">.</span><span class="pln">stick</span><span class="pun">.</span><span class="pln">direction_right </span><span class="pun">=</span><span class="pln"> temperature
sense</span><span class="pun">.</span><span class="pln">stick</span><span class="pun">.</span><span class="pln">direction_down </span><span class="pun">=</span><span class="pln"> compass
sense</span><span class="pun">.</span><span class="pln">stick</span><span class="pun">.</span><span class="pln">direction_left </span><span class="pun">=</span><span class="pln"> humidity
sense</span><span class="pun">.</span><span class="pln">stick</span><span class="pun">.</span><span class="pln">direction_middle </span><span class="pun">=</span><span class="pln"> pressure</span></pre>

<p>
	تربط الشيفرة السابقة كل حساس بأحد أزرار الاتجاه لمقبض سنس هات؛ إذ يكون الزر الأعلى لقراءة الوجهة والأسفل لقراءة مقياس الحقل المغناطيسي (البوصلة) واليمين لقراءة حساس الحرارة واليسار لقراءة الرطوبة والأوسط لقراءة الضغط.
</p>

<p>
	لا بُدّ أخيرًا من وضع برنامجك بأكمله ضمن حلقةٍ لا نهائية رئيسية تصغي إلى أحداث الضغط على أزرار المقبض دون أن تنهي البرنامج مباشرةً. اكتب ما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4357_248" style="">
<span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">    
    </span><span class="kwd">pass</span></pre>

<p>
	انقر على أيقونة التشغيل Run وجرِّب الضغط على أزرار المقبض لقراءة أحد الحساسات. اضغط زرًا آخر حالما ينتهي عرض القراءة السابقة وراقب النتيجة.
</p>

<p>
	تهانينا، لقد صممت مسبار ترايكوردر محمول باليد مكتمل الوظائف.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101020" href="https://academy.hsoub.com/uploads/monthly_2022_06/scrolling_each_result_39.png.41e4c90420d36ea609843b0edf59bb21.png" rel=""><img alt="scrolling_each_result_39.png" class="ipsImage ipsImage_thumbnailed" data-fileid="101020" data-unique="ol7uexlp5" src="https://academy.hsoub.com/uploads/monthly_2022_06/scrolling_each_result_39.png.41e4c90420d36ea609843b0edf59bb21.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شكل 30-7 ستتحرك كل نتيجة عبر المصفوفة الضوئية
</p>

<p>
	للاطلاع على مشاريع أخرى تستخدم سنس هات، عليك بالملحق "D" (اطلع أكثر).
</p>

<p>
	ترجمة -وبتصرف- للفصل السابع "Physical computing with Sense HAT" من كتاب <a href="https://www.raspberrypi.org/magpi-issues/Beginners_Guide_v2.pdf" rel="external nofollow">The official Raspberry Pi beginner's guide</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%B1%D8%A8%D8%B7-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D8%A8%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D9%88%D8%A8%D8%B1%D9%85%D8%AC%D8%AA%D9%87%D8%A7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%D9%88%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r1496/" rel="">ربط راسبيري باي بعناصر إلكترونية وبرمجتها باستخدام سكراتش وبايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%A7-%D9%87%D9%88-%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi%D8%9F-r1578/" rel="">ما هو حاسوب راسبيري باي Raspberry Pi؟</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%81%D9%8A-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1509/" rel="">التعامل مع بيئة سطر الأوامر في راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-raspberry-pi-%D9%84%D9%84%D8%B9%D9%85%D9%84-r1417/" rel="">إعداد Raspberry Pi للعمل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AC%D9%85%D9%8A%D8%B9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%88%D8%A7%D9%84%D8%AA%D8%AD%D8%B6%D9%8A%D8%B1-%D9%84%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84%D9%87-r1370/" rel="">تجميع راسبيري باي والتحضير لاستعماله</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1600</guid><pubDate>Wed, 22 Jun 2022 15:08:00 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x648; &#x62D;&#x627;&#x633;&#x648;&#x628; &#x631;&#x627;&#x633;&#x628;&#x64A;&#x631;&#x64A; &#x628;&#x627;&#x64A; Raspberry Pi&#x61F;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%A7-%D9%87%D9%88-%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi%D8%9F-r1578/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/628369d7dcccd_--Raspberry-Pi-.png.4dcf7a203f3fe7308f9eb1145d91f490.png" /></p>

<p>
	<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AC%D9%87%D8%A7%D8%B2-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi-r1356/" rel="">راسبيري باي Raspberry Pi</a> هو الاسم التجاري لسلسلة الحواسيب وحيدة اللوحة المُنتجة من قبل مؤسسة <a href="https://www.raspberrypi.org/about/" rel="external nofollow">Raspberry Pi</a>؛ وهي مؤسسة خيرية بريطانية غير ربحية تهدف إلى نشر ثقافة الحوسبة بين الناس وجعلها متاحةً بسهولة.
</p>

<p>
	أُطلقت لوحة راسبيري باي عام 2012، وأُصدرت عدة نسخٍ مكررةٍ ومطورةٍ منها منذ ذلك الحين؛ إذ كانت اللوحة الأساسية ذات وحدة معالجة مركزية CPU وحيدة النواة بسرعة 700 ميغا هرتز وذاكرة وصول عشوائي RAM بسعة 256 ميغا بايت فقط؛ أمّا الإصدار الأحدث منها فكان مع وحدة معالجة مركزية رباعية النواة بمعدّل نبضات ساعة يتجاوز 1.5 غيغا هرتز وذاكرة وصول عشوائي RAM بسعة 4 غيغا بايت، أمّا سعرها فلم يتجاوز 100$ يومًا، وهي عادةً بحدود 35$، حتى أن الإصدار "Pi Zero" كان بسعر 5$ فقط.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98913" href="https://academy.hsoub.com/uploads/monthly_2022_05/raspberry-pi-3bplus-1.jpg.48223f17c5bfc4b53c5c5f2ae360fc1b.jpg" rel=""><img alt="raspberry-pi-3bplus-1.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="98913" data-unique="nwhuzwev5" src="https://academy.hsoub.com/uploads/monthly_2022_05/raspberry-pi-3bplus-1.jpg.48223f17c5bfc4b53c5c5f2ae360fc1b.jpg" style="width: 450px; height: auto;"></a>
</p>

<p>
	استخدم الناس حول العالم لوحة راسبيري باي في المجالات التالية:
</p>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r662/" rel="">تعلّم البرمجة</a>.
	</li>
	<li>
		بناء مشاريع العتاد Hardware.
	</li>
	<li>
		استخدام الأتمتة في المنازل.
	</li>
	<li>
		تطبيق مجموعات <a href="https://academy.hsoub.com/devops/cloud-computing/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-kubernetes-r467/" rel="">Kubernetes</a> وهو نظامٌ مفتوح المصدر لأتمتة وإدارة التطبيقات المتوضعة في الحاويات عبر عدة أجهزة والبيئات الافتراضية والمادية والسحابية والمحلية.
	</li>
	<li>
		الحوسبة الحدية Edge Computing، التي تجعل الحوسبة وتخزين البيانات أقرب إلى مصادر البيانات.
	</li>
	<li>
		التطبيقات الصناعية.
	</li>
</ul>
<p>
	إذًا، تُعَد لوحة راسبيري باي حاسوبًا قليل التكلفة يعمل بنظام تشغيل لينوكس Linux، ويوفّر مجموعةً من منافذ الإدخال والإخراج متعدّدة الأغراض GPIO، التي تسمح بالتحكم بالعناصر الإلكترونية لحالات الحوسبة الفيزيائية والعمل في مجال إنترنت الأشياء Internet of Things- أو اختصارًا IOT.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98911" href="https://academy.hsoub.com/uploads/monthly_2022_05/gpio_1.png.a261cadd94c1f4c0ff5611744041351f.png" rel=""><img alt="gpio_1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98911" data-unique="a9pqy6zrz" src="https://academy.hsoub.com/uploads/monthly_2022_05/gpio_1.png.a261cadd94c1f4c0ff5611744041351f.png" style="width: 450px; height: auto;"></a>
</p>

<h2>
	إصدارات اللوحة راسبيري باي
</h2>

<p>
	أُصدرت العديد من الأجيال للّوحة راسبيري باي ابتداءً من "Pi 1" إلى "Pi 4"، وحتّى Pi 400، كما أُصدر عمومًا نموذجين من معظم الأجيال، هما النموذج A والنموذج B؛ إذ يُعد النموذج A الأرخص وبسعة ذاكرة RAM أقل وعدد أقل من الأرجل (منافذ الـ USB ومنافذ الشبكة Ethernet). يُعَد الجيل "Pi Zero" نموذجًا مبسطًا من الجيل "Pi 1" الأصلي، ويتميز بكونه أصغر حجمًا وأقل سعرًا، ونبيِّن فيما يلي قائمةً بأجيال اللوحة:
</p>

<ul>
<li>
		Pi 1 Model B (2012)
	</li>
	<li>
		Pi 1 Model A (2013)
	</li>
	<li>
		Pi 1 Model B+ (2014)
	</li>
	<li>
		Pi 1 Model A+ (2014)
	</li>
	<li>
		Pi 2 Model B (2015)
	</li>
	<li>
		Pi Zero (2015)
	</li>
	<li>
		Pi 3 Model B (2016)
	</li>
	<li>
		Pi Zero W (2017)
	</li>
	<li>
		Pi 3 Model B+ (2018)
	</li>
	<li>
		Pi 3 Model A+ (2019)
	</li>
	<li>
		Pi 4 Model A (2019)
	</li>
	<li>
		Pi 4 Model B (2020)
	</li>
	<li>
		Pi 400 (2021)
	</li>
</ul>
<h2>
	مؤسسة راسبيري باي
</h2>

<p>
	تسعى مؤسسة راسبيري باي لإتاحة الإمكانات الكبيرة للحوسبة والصناعة الرقمية للجميع حول العالم من خلال توفير حواسيب عالية الأداء ورخيصة الثمن ليتمكن الناس من استخدامها للتعلّم، أو حل المشاكل، أو حتى بهدف التسلية. كما أنها تسعى لتأمين طرق التواصل والتعليم اللازمة لمساعدة الناس على <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">تعلّم الحوسبة</a> والصناعة الرقمية، إذ أنها تطوّر مصادرًا مجانيةً لتعلّم الحوسبة وكيفية إنجاز المهام باستخدام الحواسيب، كما أنّها تدرّب أشخاصًا لتوجيه الآخرين نحو التعلُّم.
</p>

<p>
	ويُعد كلًا من المشروعين Code Club و CoderDojo جزءًا من مؤسسة راسبيري باي رغم كونهما منصاتٍ مستقلةً غير مرتبطة بلوحات راسبيري باي حصرًا. وتروّج مؤسسة راسبيري باي لهذه المشاريع وتسعى لتوسيع انتشارها بهدف ضمان إمكانية وصول كل طفلٍ حول العالم إلى تعلّم الحوسبة. إضافةً لذلك، يُقام الحدث <a href="https://www.raspberrypi.org/jam/" rel="external nofollow">Raspberry Jams</a> لدعوة الناس من كل الفئات العمرية ليتعرفوا معًا على راسبيري باي ويتبادلون الأفكار والمشاريع.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98912" href="https://academy.hsoub.com/uploads/monthly_2022_05/jam.jpg.6a01516ea52213de80dad0a37cd58579.jpg" rel=""><img alt="jam.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="98912" data-unique="1w1c96qcj" src="https://academy.hsoub.com/uploads/monthly_2022_05/jam.jpg.6a01516ea52213de80dad0a37cd58579.jpg" style="width: 450px; height: auto;"></a>
</p>

<h2>
	راسبيري باي والمصادر المفتوحة
</h2>

<p>
	تعمل راسبيري باي مع الأنظمة مفتوحة المصدر؛ فهي قادرةٌ على تشغيل <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">نظام لينوكس Linux</a> ودعم عدّة توزيعات منه؛ كما أن نظام تشغيلها الأساسي "Pi OS" مفتوح المصدر أيضًا ويدير مجموعةً من البرامج <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوحة المصدر</a>. وتعد مؤسسة راسبيري باي من المساهمين في نواة لينوكس وغيرها من <a href="https://academy.hsoub.com/programming/workflow/git/%d9%83%d9%8a%d9%81-%d8%aa%d8%b3%d8%a7%d9%87%d9%85-%d9%81%d9%8a-%d9%85%d8%b4%d8%a7%d8%b1%d9%8a%d8%b9-%d9%85%d9%81%d8%aa%d9%88%d8%ad%d8%a9-%d8%a7%d9%84%d9%85%d8%b5%d8%af%d8%b1-%d8%b9%d9%84%d9%89-github-r265/" rel="">المشاريع مفتوحة المصدر</a>، بالإضافة إلى إصدارها عدة برمجيات مفتوحة المصدر خاصّةً بها، و<a href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/README.md" rel="external nofollow">مخططات</a> راسبيري باي دوريًا بمثابة توثيق documentation. ولكن في الواقع، لا تُعد لوحات راسبيري باي عتادً مفتوحًا (العتاد المفتوح هو العتاد المُرخص به، بحيث يمكن لأي شخص دراسته والتعديل عليه وإعادة توزيعه).
</p>

<p>
	تعتمد مؤسسة راسبيري باي على الأرباح من مبيعات وحدات راسبيري باي لإنجاز أعمالها الخيرية في قطاع التعليم.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98915" href="https://academy.hsoub.com/uploads/monthly_2022_05/schematics.png.c96891df817f5f7ccc98e0e513b27d38.png" rel=""><img alt="schematics.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98915" data-unique="9b1gztkuo" src="https://academy.hsoub.com/uploads/monthly_2022_05/schematics.png.c96891df817f5f7ccc98e0e513b27d38.png" style="width: 650px; height: auto;"></a>
</p>

<h2>
	ما يمكنك إنجازه مع لوحة راسبيري باي
</h2>

<p>
	يشتري بعض الناس لوحة راسبيري باي ليتعلموا كتابة الشيفرات البرمجية؛ أما الأشخاص الذين يعرفون أصلًا كتابتها فيستخدمون اللوحة لتعلّم برمجة الدارات الإلكترونية والمشاريع الفيزيائية.
</p>

<p>
	تفتح لوحة راسبيري باي أمامك الآفاق لإنشاء مشاريعك الخاصة، والتي من شأنها أتمتة منزلك؛ وهو أمرٌ شائعٌ في مجتمعات المصادر المفتوحة، لأنه يمنحك كافّة إمكانات السيطرة على مشروعك بدلاً من استخدام نظام مغلقٍ خاصٍ بغيرك.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98914" href="https://academy.hsoub.com/uploads/monthly_2022_05/rpi-physical.jpg.4c41dab89e2632e87a982069c855021c.jpg" rel=""><img alt="rpi-physical.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="98914" data-unique="n1ebykumb" src="https://academy.hsoub.com/uploads/monthly_2022_05/rpi-physical.thumb.jpg.f7229e26a169f6d4b32efa4984b6af98.jpg"></a>
</p>

<p>
	تبيّن القائمة التالية بعض المشاريع الممكن تنفيذها باستخدام راسبيري باي:
</p>

<ul>
<li>
		حظر الإعلانات على شبكتك باستخدام "pi-hole".
	</li>
	<li>
		إنشاء قاعدة بيانات "PostgreSQL" في راسبيري باي.
	</li>
	<li>
		إنشاء مجيب آلي لتويتر Twitter الخاص بك باستخدام <a href="https://wiki.hsoub.com/Python" rel="external">لغة بايثون Python</a> وراسبيري باي.
	</li>
	<li>
		بناء مشاريع باستخدام الكاميرا الخاصّة بلوحة راسبيري باي وأي تجهيزات وعتاد يمكن وصلها بها.
	</li>
	<li>
		إنشاء عارض صور رقمي.
	</li>
</ul>
<p>
	القائمة السابقة هي على سبيل المثال لا الحصر إذ المشاريع التي يمكن تنفيذها براسبيري باي لا تحصى، ونترك بين يديك هذا الحاسوب الرائع لتجرب وتتعلم وتبدع.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/resources/raspberry-pi" rel="external nofollow">What is Raspberry Pi?‎</a> من موقع opensource.com.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AC%D9%88%D9%84%D8%A9-%D9%81%D9%8A-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%A7%D9%86-%D9%86%D8%B8%D8%A7%D9%85-%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1371/" rel="">جولة في راسبيان: نظام تشغيل راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AC%D9%85%D9%8A%D8%B9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%88%D8%A7%D9%84%D8%AA%D8%AD%D8%B6%D9%8A%D8%B1-%D9%84%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84%D9%87-r1370/" rel="">تجميع راسبيري باي والتحضير لاستعماله</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-raspberry-pi-%D9%84%D9%84%D8%B9%D9%85%D9%84-r1417/" rel="">إعداد Raspberry Pi للعمل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D8%AF%D8%A1-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1497/" rel="">بدء استخدام راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AE%D8%B5%D9%8A%D8%B5-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%B3%D8%B7%D8%AD-%D9%85%D9%83%D8%AA%D8%A8-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1498/" rel="">تخصيص واجهة سطح مكتب راسبيري باي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1578</guid><pubDate>Tue, 17 May 2022 09:42:46 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x645;&#x629; &#x641;&#x64A; &#x625;&#x646;&#x62A;&#x631;&#x646;&#x62A; &#x627;&#x644;&#x623;&#x634;&#x64A;&#x627;&#x621; IoT</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D8%A7%D9%84%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1-iot-r1514/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_03/6241b33420d32_----IoT.png.bba11acf3936530227f6ef50229c75c0.png" /></p>

<p>
	يشير مصطلح إنترنت الأشياء Internet of Things -واختصارًا IoT- إلى العالم الواسع من الأجهزة المتصلة مع بعضها بعضًا، إذ تزوَّد هذه الأجهزة بمستشعرات مدمجة تعمل على توفير البيانات، كما يمكن التحكم بها عبر الإنترنت، ومن الأمثلة الشائعة على ذلك أجهزة أتمتة المنزل، مثل منظمات الحرارة الذكية، والإضاءة التي يمكن التحكم فيها عن بُعد، وغيرها من مجسات المرور، وأجهزة قياس جودة المياه، ومكونات الشبكة الكهربائية الذكية لتتبع البضائع المصنعة وأساطيل المركبات في جميع أنحاء العالم.
</p>

<p>
	ومع النمو السريع في مجال إنترنت الأشياء، أصبح هناك عدد من المعايير والأدوات والمشاريع والسياسات والأطر والمنظمات المتنافسة التي تسعى لتحديد كيفية تواصل الأجهزة المتصلة في العصر الحديث، ومن هنا تزايدت أهمية <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">المصادر المفتوحة</a> والمعايير المفتوحة، حيث تعمل على ضمان قدرة اتصال الأجهزة مع بعضها اتصالًا صحيحًا، وكذلك مع عمليات المعالجة الخلفية للكميات الهائلة من البيانات الضخمة التي تولدها هذه الأجهزة.
</p>

<h2>
	استخدامات أجهزة إنترنت الأشياء
</h2>

<p>
	تعتمد كيفية الاستفادة من الأجهزة المتصلة بإنترنت الأشياء على ما إذا كان الهدف منها جمع البيانات أو أتمتة العمليات، وعلى نطاق الاستخدام، وتعمل العديد من الأجهزة الاستهلاكية للأفراد بطريقة غير تقليدية، ومنها ما ذكر أعلاه، وتندرج العديد من هذه الأجهزة في فئة أتمتة المنزل، ومنها:
</p>

<ul>
<li>
		الإضاءة الداخلية والخارجية، والمنافذ الكهربائية المتحَكم بها بواسطة أجهزة الاستشعار، وأجهزة ضبط الوقت، والتطبيقات عن بعد.
	</li>
	<li>
		منظم الحرارة Thermostat، وأجهزة تغيير الجو الداخلي للمنزل بناءً على معرفة مكانك، وظروف درجة الحرارة الخارجية، وأهدافك في توفير الطاقة.
	</li>
	<li>
		الكاميرات، وأجهزة استشعار الحركة، والأقفال التلقائية، وغيرها من أجهزة التحكم في الوصول التي يمكن دمجها في أنظمة الأمان والمراقبة المتقدمة.
	</li>
	<li>
		أجهزة استشعار تسرب المياه، وأجهزة إنذار الدخان، واستشعار أول أكسيد الكربون، وغيرها من الأجهزة المصممة لحماية الأشخاص والممتلكات من الحوادث العرضية.
	</li>
	<li>
		الغسالات والمجففات والثلاجات وغيرها من الأجهزة التي لها وظائف خاصة، وتنبهك إلى حالتها عن بُعد.
	</li>
	<li>
		شواحن السيارات الكهربائية، وبطاريات الشحن المحمولة، والأجهزة الأخرى التي تشحن بذكاء في غير ساعات الذروة، لتوفير المال، وتقليل ذروة الطلب على الطاقة.
	</li>
</ul>
<p>
	بالإضافة إلى أجهزة أخرى، مثل مستشعرات معدل ضربات القلب القابلة للارتداء، وأجهزة مراقبة الأطفال، وأجهزة استشعار النوم، والمصممة للمساعدة في المهام اليومية أو المساعدة في تتبع المعلومات الحيوية وغير الحيوية، وأصبحت العديد من الأجهزة، مثل السيارات، عبارةً عن شبكة من المستشعرات التي تتعقب أنواعًا من المعلومات حول أدائها وسلامتها، مما مكّن من توفير ميزات وخيارات ترفيهية جديدة.
</p>

<p>
	تختلف أجهزة إنترنت الأشياء في الحكومات والشركات والمؤسسات قليلًا عن الأجهزة الموجهة للأفراد، وتركز عمومًا على جمع البيانات التي يمكن معالجتها وتصورها، وغالبًا ما تكون هذه البيانات آنيةً real-time data، مثل:
</p>

<ul>
<li>
		تستطيع شركات المرافق العامة التنبؤ بالطلب على الطاقة والمياه بدقة، مما يقلل الإهدار.
	</li>
	<li>
		تساعد المستشعرات البيئية المتقدمة، مثل أجهزة مراقبة المياه والضوضاء وجودة الهواء، في فهم مصادر التلوث وآثاره، قبل أن تؤثر سلبًا على النظام البيئي وصحة الإنسان.
	</li>
	<li>
		يمكن لوكالات السلامة العامة تطوير أنظمة إنذار مبكر أكثر تقدمًا للكوارث الطبيعية، مثل الزلازل والفيضانات، والحصول على بيانات أفضل لتقديم الخدمات الحيوية، مثل مكافحة الحرائق وتقديم الإغاثة الإنسانية.
	</li>
	<li>
		يمكن للشركات والحكومات تتبع الموقع الحالي لأساطيل المركبات، وقطع الغيار، والمنتجات، وعينات الرعاية الصحية والأدوية.
	</li>
	<li>
		يمكن للحكومات المحلية تتبع مواقف السيارات في الوقت الفعلي، وطلبات العبور، ومعرفة متى تصل حاويات القمامة إلى سعتها القصوى، لتوفير خدمات أفضل والتخطيط للمستقبل.
	</li>
</ul>
<p>
	وتوجد العديد من الأمثلة الأخرى أيضًا، ومن المتوقع أن يُطوَّر المزيد منها في السنوات القادمة.
</p>

<h2>
	أهمية المعايير المفتوحة لإنترنت الأشياء
</h2>

<p>
	قد لا تتمكن الأجهزة من الاتصال مع بعضها البعض دون <a href="https://ar.wikipedia.org/wiki/%D9%85%D8%B9%D9%8A%D8%A7%D8%B1_%D9%85%D9%81%D8%AA%D9%88%D8%AD" rel="external nofollow">معايير مفتوحة</a> open standards وبروتوكولات مشتركة، إذ تتصل العديد من أجهزة إنترنت الأشياء بالإنترنت في النهاية، إلا أن الطرق المستخدمة للتواصل مع بعضها البعض ومع مراكز التحكم المحلية غالبًا ما تكون محتكرةً أو موثقةً توثيقًا ضعيفًا، فبدون أساس مشترك للاتصال، قد تكون مقيدًا بمزود واحد لجميع الأجهزة، ومن الممكن أن تُترك عالقًا مع مجموعة من الأجهزة غير الصالحة للعمل؛ لأن الشركة المصنعة للأجهزة توقفت عن العمل أو قررت إيقاف الدعم لأجهزتك.
</p>

<p>
	وتعمل منظمات مثل <a href="https://allseenalliance.org/" rel="external nofollow">AllSeen Alliance</a>، وهي أحد مشاريع مؤسسة Linux Foundation، على إنشاء أطر عمل مشتركة للأجهزة، لتكون قادرةً على التواصل مع بعضها بعضًا مهما كانت الشركة المصنعة.
</p>

<h2>
	التعامل مع البيانات الضخمة
</h2>

<p>
	مع وجود مليارات من الأجهزة المتصلة بالإنترنت قيد الاستخدام حاليًا، والذي يُتوقَّع أن يصل لعشرات المليارات من الأجهزة الأخرى المتصلة عبر الإنترنت في السنوات القليلة المقبلة، تجمع أعداد ضخمة من أجهزة الاستشعار الجديدة البيانات حول العالم، لذلك تحتاج المنظمات التي تستخدم شبكات من أجهزة الاستشعار إلى طريقة لمعالجة جميع البيانات الجديدة التي تتلقاها وتخزنها.
</p>

<p>
	ولا تتطلب هذه البيانات المجمعة مقاييس تخزين ومعالجة مختلفين وحسب، بل تتطلب تقنيات جديدةً أيضًا، وتسمح لنا التطورات الجديدة في <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D9%88%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%A3%D8%B3%D8%B3-%D8%A7%D9%84%D8%AA%D9%8A-%D9%86%D8%B4%D8%A3-%D8%B9%D9%84%D9%8A%D9%87%D8%A7-r988/" rel="">الذكاء الاصطناعي artificial intelligence</a> و<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">تعلم الآلة machine learning</a> وتنقيب البيانات data mining بالعثور على أنماط من البيانات لن تستطيع أساليب التحليل التقليدية أن تتعامل معها، ولكن أدوات البيانات الضخمة مفتوحة المصدر تجعل تحليل هذه الأنماط ممكنًا.
</p>

<h2>
	أهمية الأمن في مجال إنترنت الأشياء
</h2>

<p>
	مع دخول المزيد من الأجهزة إلى منازلنا، والتي تجمع بيانات حول كل جانب من جوانب حياتنا؛ أصبح الأمان والخصوصية من أبرز الاهتمامات، وعلى الرغم من أن سياسة الخصوصية تحدد العديد من قضايا الخصوصية، إلا أن التكنولوجيا في حد ذاتها تعد جزءًا مهمًا من الأمان، وهذا أحد الأسباب التي تجعل المصدر المفتوح مهمًا لإنترنت الأشياء.
</p>

<p>
	يعمل كل جهاز قادر على الاتصال بشبكة على الأقل على <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">نظام تشغيل</a> أولي بجانب التعليمات البرمجية التي تحدد وظيفته، ويسمح وجود قاعدة تعليمات برمجية مفتوحة المصدر باختبار أمان الجهاز وفحصه وإصلاحه بسهولة للمساعدة في إبعاد المتسللين، ويمكن تحسين نظام التشغيل الآمن، مثل نواة لينكس Linux kernel وأنظمة التشغيل مفتوحة المصدر الأخرى، لاستخدامها في الأجهزة المدمجة للمساعدة في الحفاظ على أمان البيانات والأجهزة.
</p>

<h2>
	البدء بمجال إنترنت الأشياء
</h2>

<p>
	إن دخولك مجال إنترنت الأشياء، وإنشاء أجهزتك وبرامجك الخاصة أمر سهل، حيث توجد العديد من منصات عتاد الحاسوب hardware platforms التي تستهدف المبتدئين والهواة وتمتلك مجتمعات كبيرةً، وتتضمن العديد من العتاد المفتوح جزئيًا أو كليًا، فبعض منصات الأجهزة الأكثر شيوعًا لإنشاء أجهزة متصلة بإنترنت الأشياء تتضمن Arduino، وهو مثالي للعمليات منخفضة الطاقة، ويمكنه الاتصال بواسطة اللوحات الإضافية عبر العديد من بروتوكولات الاتصالات الشائعة، و<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AC%D9%87%D8%A7%D8%B2-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi-r1356/" rel="">Raspberry Pi</a> التي تتضمن منفذ <a href="https://academy.hsoub.com/certificates/cisco/ccna/%D8%B4%D8%B1%D8%AD-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-%D8%A5%D9%8A%D8%AB%D8%B1%D9%86%D8%AA-ethernet-r8/" rel="">الإيثرنت Ethernet</a> المدمج باللوحة، مما يجعل اتصالات الشبكة أمرًا سهلًا.
</p>

<p>
	وفرنا سلسلة حول راسبيري باي باسم <a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A%20%D8%A8%D8%A7%D9%8A/" rel="">دليل راسبيري باي</a> والتي تشرح راسبيري باي وكيفية استخدامه من البداية وحتى الاتقان فيمكنك البدء بها لولوج عالم إنترنت الأشياء.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/resources/internet-of-things" rel="external nofollow">What is the Internet of Things?‎</a> من موقع opensource.com.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%A5%D9%86%D8%AC%D8%A7%D8%B2%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%B1%D8%A7%D8%B9%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81-%D8%A3%D8%AB%D8%B1%D8%AA-%D9%81%D9%8A-%D8%AD%D9%8A%D8%A7%D8%AA%D9%86%D8%A7-%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A9-r975/" rel="">الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">مدخل إلى الذكاء الاصطناعي وتعلم الآلة</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1514</guid><pubDate>Mon, 28 Mar 2022 14:05:36 +0000</pubDate></item></channel></rss>
