<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x645;&#x642;&#x627;&#x644;&#x627;&#x62A; &#x639;&#x627;&#x645;&#x629; &#x62D;&#x648;&#x644; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;</title><link>https://academy.hsoub.com/programming/general/page/8/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x645;&#x642;&#x627;&#x644;&#x627;&#x62A; &#x639;&#x627;&#x645;&#x629; &#x62D;&#x648;&#x644; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;</description><language>ar</language><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x645;&#x634;&#x647;&#x62F; &#x645;&#x62A;&#x62D;&#x631;&#x643; &#x64A;&#x639;&#x62A;&#x645;&#x62F; &#x639;&#x644;&#x649; &#x639;&#x646;&#x635;&#x631; &#x627;&#x644;&#x645;&#x641;&#x627;&#x62C;&#x623;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x633;&#x643;&#x631;&#x627;&#x62A;&#x634;</title><link>https://academy.hsoub.com/programming/general/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%85%D8%B4%D9%87%D8%AF-%D9%85%D8%AA%D8%AD%D8%B1%D9%83-%D9%8A%D8%B9%D8%AA%D9%85%D8%AF-%D8%B9%D9%84%D9%89-%D8%B9%D9%86%D8%B5%D8%B1-%D8%A7%D9%84%D9%85%D9%81%D8%A7%D8%AC%D8%A3%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-r1553/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/62796a59d3125_--------.png.205316419412a23e6de844d60e893d14.png" /></p>

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

<p>
	سننفذ في هذا المشروع ما يلي:
</p>

<ul>
<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="">سكراتش</a> لإنشاء مشهد متحرك.
	</li>
	<li>
		اختبار الكتل البرمجية وإصلاح الأخطاء فيها.
	</li>
	<li>
		تجزئة المشهد أو ما يعرف بالتفكيك أو Decomposition باللغة الانجليزية، ثم تركيبه مشهدًا تلو الآخر.
	</li>
</ul>
<p>
	<strong>التفكيك Decomposition</strong>: هو تقسيم المشروع إلى أجزاء أصغر وأسهل في التنفيذ، مما يتيح إنشاء المشروع على أجزاء ويسهل إتمامه.
</p>

<p>
	ألقِ نظرة على <a href="https://scratch.mit.edu/projects/495932563/editor" rel="external nofollow">النتيجة النهائية لمشروعنا</a> بالنقر على زر العلم الأخضر:
</p>

<p style="width: 485px;margin: auto;">
	<iframe allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/495932563/?autostart=false" width="485"></iframe>
</p>

<p>
	يتألف مشروعنا من المراحل الأربع التالية التي سنشرحها لاحقًا:
</p>

<ul>
<li>
		مرحلة الإعداد
	</li>
	<li>
		مرحلة إثارة الفضول
	</li>
	<li>
		مرحلة المفاجأة
	</li>
	<li>
		مرحلة ردة الفعل
	</li>
</ul>
<p>
	يجب عليك اختيار تصميم مناسب وقصة مناسبة لمشهد الرسوم المتحركة واختيار عنصر المفاجأة. فكر في ماهية القصة التي سيرويها مشهدك؟ استلهم أفكارك من المشاريع التالية:
</p>

<ul>
<li>
		<a href="https://scratch.mit.edu/projects/498655116/editor" rel="external nofollow">مشروع شبح التفاحة</a>
	</li>
</ul>
<p style="width: 485px;margin: auto;">
	<iframe allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/498655116/?autostart=false" width="485"></iframe>
</p>

<ul>
<li>
		<a href="https://scratch.mit.edu/projects/498615133/editor" rel="external nofollow">مشروع القط السحري</a>
	</li>
</ul>
<p style="width: 485px;margin: auto;">
	<iframe allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/498615133/?autostart=false" width="485"></iframe>
</p>

<ul>
<li>
		<a href="https://scratch.mit.edu/projects/498616008/editor" rel="external nofollow">مشروع ضيف أعماق البحار</a>
	</li>
</ul>
<p style="width: 485px;margin: auto;">
	<iframe __idm_id__="1294343" allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/498616008/?autostart=false" width="485"></iframe>
</p>

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

<h2>
	مرحلة الإعداد
</h2>

<p>
	هل اخترت قصة لمشهدك؟ سنضيف في هذه الخطوة شخصية القصة الرئيسية، وخلفيةً، وغرضًا مثيرًا للاهتمام.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98170" href="https://academy.hsoub.com/uploads/monthly_2022_05/dinosaur-surprise.png.3769db50a8be0f7cd24b6597449a7816.png" rel=""><img alt="dinosaur-surprise.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98170" data-unique="etsjr6fbn" src="https://academy.hsoub.com/uploads/monthly_2022_05/dinosaur-surprise.png.3769db50a8be0f7cd24b6597449a7816.png"></a>
</p>

<ul>
<li>
		أولًا، انقر على <a href="https://scratch.mit.edu/projects/582222532/editor" rel="external nofollow">مشروع الرسوم المتحركة للمبتدئين</a> واطلع على الخلفيات والشخصيات المستخدمة، استلهم منها الأفكار كي تساعدك في اختيار شخصية وخلفية وغرض مناسب لمشروعك.
	</li>
	<li>
		ثانيًا، اختر كائنًا مناسبًا ليكون الشخصية الرئيسية في مشروعك، وكائنًا آخر مثيرًا للاهتمام.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98157" href="https://academy.hsoub.com/uploads/monthly_2022_05/add-sprite.png.777fea26f095dbde0c1431534a07176f.png" rel=""><img alt="add-sprite.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98157" data-unique="8v9lnbzmv" src="https://academy.hsoub.com/uploads/monthly_2022_05/add-sprite.png.777fea26f095dbde0c1431534a07176f.png"></a>
</p>

<ul>
<li>
		ثالثًا، اختر خلفيةً مناسبةً للمشهد.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98156" href="https://academy.hsoub.com/uploads/monthly_2022_05/add-backdrop.png.19654e490bc1a5bec8f4c47d5f063b13.png" rel=""><img alt="add-backdrop.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98156" data-unique="9e6fcdgha" src="https://academy.hsoub.com/uploads/monthly_2022_05/add-backdrop.png.19654e490bc1a5bec8f4c47d5f063b13.png"></a>
</p>

<ul>
<li>
		رابعًا، قرر أين تريد أن تضع الكائنات، ما حجمها وكيف ستبدو.
	</li>
</ul>
<h3>
	اختيار موضع للكائن وتثبيته
</h3>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98159" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block1.png.91168e23c18061a553945d702e84f567.png" rel=""><img alt="Block1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98159" data-unique="9xir5rz3x" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block1.png.91168e23c18061a553945d702e84f567.png" style="width: 300px; height: auto;"></a>
</p>

<p>
	كرر هذه الخطوة للكائن الآخر.
</p>

<h3>
	تعديل حجم الكائن
</h3>

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

<p style="text-align: center;">
	<img alt="Size.png" class="ipsImage ipsImage_thumbnailed" data-fileid="99904" data-unique="u2ommumrj" src="https://academy.hsoub.com/uploads/monthly_2022_05/Size.png.210c57e754cbc8175d813cbfb709e33a.png" style=""></p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98192" href="https://academy.hsoub.com/uploads/monthly_2022_05/SizeBlock.png.0e0e3e3ed77e05bdf521b539890b2cde.png" rel=""><img alt="SizeBlock.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98192" data-unique="3ocy8sbk5" src="https://academy.hsoub.com/uploads/monthly_2022_05/SizeBlock.png.0e0e3e3ed77e05bdf521b539890b2cde.png" style="width: 300px; height: auto;"></a>
</p>

<h3>
	تغيير مظهر الكائن
</h3>

<p>
	إذا أردت تغيير مظهر الكائن في كامل المشروع، انقر على نافذة <strong>المظاهر</strong> ثم اختر أحد المظاهر المتوفرة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98178" href="https://academy.hsoub.com/uploads/monthly_2022_05/NanoCustomes.png.d8fbf7a688767709ab6d04690475eb55.png" rel=""><img alt="NanoCustomes.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98178" data-unique="mhqtzd6fb" src="https://academy.hsoub.com/uploads/monthly_2022_05/NanoCustomes.png.d8fbf7a688767709ab6d04690475eb55.png" style="width: 500px; height: auto;"></a>
</p>

<p>
	أما إذا أردت تغيير مظهر الكائن في جزء من المشروع، أضف كتلة <strong>غير المظهر إلى</strong> واختر المظهر الذي تريده من النافذة المنزلقة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98164" href="https://academy.hsoub.com/uploads/monthly_2022_05/ChangeCustome.png.6cb87636fc53651ad7ead6ede3efeaee.png" rel=""><img alt="ChangeCustome.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98164" data-unique="9efcwcge8" src="https://academy.hsoub.com/uploads/monthly_2022_05/ChangeCustome.png.6cb87636fc53651ad7ead6ede3efeaee.png" style="width: 300px; height: auto;"></a>
</p>

<p>
	أضف كتلة <strong>اختفِ</strong> لإخفاء الكائن في بداية المشروع:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98174" href="https://academy.hsoub.com/uploads/monthly_2022_05/HideBlock.png.49d5d09d56090b2a8d1ae22c95f43188.png" rel=""><img alt="HideBlock.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98174" data-unique="mi431k5la" src="https://academy.hsoub.com/uploads/monthly_2022_05/HideBlock.png.49d5d09d56090b2a8d1ae22c95f43188.png" style="width: 300px; height: auto;"></a>
</p>

<h3>
	تغيير اتجاه الكائن
</h3>

<p>
	قد ترغب في تغيير اتجاه الكائن بعد إضافته. إذا أردت تغيير اتجاه الكائن في كامل المشروع، غيّر <strong>الاتجاه</strong> و<strong>نمط الدوران</strong> من نافذة <strong>الكائن</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98166" href="https://academy.hsoub.com/uploads/monthly_2022_05/ChangeDirection.png.9b287b4df1db045ee5c6617a80cffcd7.png" rel=""><img alt="ChangeDirection.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98166" data-unique="g1kf52p9n" src="https://academy.hsoub.com/uploads/monthly_2022_05/ChangeDirection.png.9b287b4df1db045ee5c6617a80cffcd7.png" style="width: 300px; height: auto;"></a>
</p>

<p>
	أما إذا أردت تغيير اتجاه الكائن في جزء من المشروع، أضف كتلتي تغيير نمط الدوران والاتجاه التاليتين:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98171" href="https://academy.hsoub.com/uploads/monthly_2022_05/DirectionBlock.png.e76d6a67d169ba770b315fb70be2457a.png" rel=""><img alt="DirectionBlock.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98171" data-unique="ijkmnad9h" src="https://academy.hsoub.com/uploads/monthly_2022_05/DirectionBlock.png.e76d6a67d169ba770b315fb70be2457a.png" style="width: 300px; height: auto;"></a>
</p>

<h3>
	احفظ المشروع
</h3>

<p>
	سمّ المشروع باسم مناسب في مربع الاسم أعلى الزاوية اليمينية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98182" href="https://academy.hsoub.com/uploads/monthly_2022_05/NewProject.png.48457fb1732aaba6a804027e60d4a8b6.png" rel=""><img alt="NewProject.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98182" data-unique="d1x3k546n" src="https://academy.hsoub.com/uploads/monthly_2022_05/NewProject.png.48457fb1732aaba6a804027e60d4a8b6.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	انقر على علامة تبويب <strong>ملف</strong> ثم انقر على خيار <strong>الحفظ إلى حاسوبك</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98189" href="https://academy.hsoub.com/uploads/monthly_2022_05/SaveProject.png.7a3b49f88ece18494b1143281254c29b.png" rel=""><img alt="SaveProject.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98189" data-unique="duxqrf3os" src="https://academy.hsoub.com/uploads/monthly_2022_05/SaveProject.png.7a3b49f88ece18494b1143281254c29b.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	إذا كنت متصلًا بالإنترنت وتملك حسابًا على موقع سكراتش سيظهر لك خيار <strong>الحفظ الآن</strong>.
</p>

<h2>
	مرحلة إثارة الفضول
</h2>

<p>
	اختر ما هو الأمر المثير للاهتمام الذي سيفعله الكائن الثاني لجذب الانتباه؟ كيف ستتفاعل معه الشخصية الأساسية؟
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98162" href="https://academy.hsoub.com/uploads/monthly_2022_05/boo.png.20b33af66080f950376682c16d041c17.png" rel=""><img alt="boo.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98162" data-unique="hj51qmf08" src="https://academy.hsoub.com/uploads/monthly_2022_05/boo.png.20b33af66080f950376682c16d041c17.png" style="width: 400px; height: auto;"></a>
</p>

<h3>
	الشخصية الثانوية
</h3>

<p>
	أولًا، اختر ماذا تريد أن يفعل كائن الشخصية الثانوية من الخيارات التالية:
</p>

<ul>
<li>
		<strong>الاهتزاز</strong>: أضف الكتل التالية ليبدو الكائن وكأنه يهتز وذلك بتدوير الكائن بضع درجات باتجاه اليمين واليسار وتكرار ذلك عدة مرات، كما يلي:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98175" href="https://academy.hsoub.com/uploads/monthly_2022_05/JiggleBlock.png.3350fb219d685e00c3b69416e363d02d.png" rel=""><img alt="JiggleBlock.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98175" data-unique="689ltinwj" src="https://academy.hsoub.com/uploads/monthly_2022_05/JiggleBlock.png.3350fb219d685e00c3b69416e363d02d.png" style="width: 300px; height: auto;"></a>
</p>

<ul>
<li>
		<strong>تأثيرات بصرية</strong>: يمكن <a href="https://scratch.mit.edu/projects/435730522/editor" rel="external nofollow">تطبيق عدة مؤثرات بصرية</a> على الكائنات في سكراتش، كما في المثال التالي:
	</li>
</ul>
<p style="width: 485px;margin: auto;">
	<iframe allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/435730522/?autostart=false" width="485"></iframe>
</p>

<p>
	تحتوي كل من الكتلتين <strong>اجعل مؤثر اللون</strong> و <strong>غيّر مؤثر اللون</strong> على نافذة منزلقة يمكن اختيار عدة تأثيرات منها لتغيير مظهر الكائنات وهي:
</p>

<ul>
<li>
		<strong>اللون</strong>: يمكن اختيار القيم من القيمة 0 إلى القيمة 199 (تُدَور الأرقام الكبيرة، فيُعد الرقم 200 كالرقم 0).
	</li>
	<li>
		<strong>عين السمكة</strong>: لا تعطي القيمة 0 أي تأثير، وكلما كبرت القيمة إزداد تأثير "عين السمكة" fisheye، أما القيم السالبة فتعطي تأثيرًا عكسيًا.
	</li>
	<li>
		<strong>الدوامة</strong>: لا تعطي القيمة 0 أي تأثير، وتعطي القيم الكبيرة الموجبة تأثيرًا أفعوانيًا نحو اليسار، أما القيم السالبة الكبيرة فتعطي تأثيرًا أفعوانيًا نحو اليمين.
	</li>
	<li>
		<strong>البكسلة</strong>: لا تعطي القيمة 0 أي تأثير، بينما تزيد القيم الكبيرة عدد البكسلات في الكائن.
	</li>
	<li>
		<strong>الموزاييك</strong>: لا تعطي القيمة 0 أي تأثير، بينما تغير القيم الكبيرة الموجبة والسالبة عدد النسخ.
	</li>
	<li>
		<strong>شدة الإضاءة</strong>: لا تعطي القيمة 0 أي تأثير، بينما تزيد القيم من 1 إلى 100 من سطوع الكائن، وتجعل القيم السالبة من القيمة 1- حتى القيمة 100- الكائن أكثر عتمةً.
	</li>
	<li>
		<strong>الشبح</strong>: لا تعطي القيمة 0 أي تأثير، بينما تزيد القيم من 1 إلى 100 من شفافية الكائن.
	</li>
</ul>
<p>
	أسند قيمًا مختلفة للتأثيرات واكتشف كيف سيتغير مظهر الكائن باختلاف القيم.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98190" href="https://academy.hsoub.com/uploads/monthly_2022_05/SetColorBlock.png.887f812c5846a8d369c2a2fa844fc7ad.png" rel=""><img alt="SetColorBlock.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98190" data-unique="eluvn5ps7" src="https://academy.hsoub.com/uploads/monthly_2022_05/SetColorBlock.png.887f812c5846a8d369c2a2fa844fc7ad.png" style="width: 350px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98186" href="https://academy.hsoub.com/uploads/monthly_2022_05/RepeatColor.png.04a0afcbc762e0a0c4a91480b62ad8ff.png" rel=""><img alt="RepeatColor.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98186" data-unique="ctj4ozuae" src="https://academy.hsoub.com/uploads/monthly_2022_05/RepeatColor.png.04a0afcbc762e0a0c4a91480b62ad8ff.png" style="width: 400px; height: auto;"></a>
</p>

<p>
	يمكنك إما استخدام كتلة أزل التأثيرات الرسومية أو الضغط على زر العلم لمسح التأثيرات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98160" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block20.png.be75410f3ca354e2bb326f64dffba789.png" rel=""><img alt="Block20.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98160" data-unique="u80ht6tcu" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block20.png.be75410f3ca354e2bb326f64dffba789.png" style="width: 400px; height: auto;"></a>
</p>

<p>
	أما إذا أردت تطبيق تأثير معين على الكائن أثناء تشغيل المشروع فضع كتلة تغيير المؤثر الرسومي تحت كتلة عند النقر على العلم الأخضر:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98161" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block21.PNG.c0de34168ca8b4d59f65047f1af52b16.PNG" rel=""><img alt="Block21.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98161" data-unique="95w8s4qlv" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block21.PNG.c0de34168ca8b4d59f65047f1af52b16.PNG" style="width: 400px; height: auto;"></a>
</p>

<p>
	لا تنسى أنه يمكنك تطبيق هذه التأثيرات الرسومية واللونية على المنصة أيضًا.
</p>

<h3>
	الشخصية الرئيسية
</h3>

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

<ul>
<li>
		جعل الشخصية تتكلم باستخدام إضافة <strong>تحويل النص إلى كلام</strong>: سنتعلم في هذه الخطوة كيفية جعل الكائنين بيكو Pico وجيغا Giga <a href="https://scratch.mit.edu/projects/499373708/editor" rel="external nofollow">ينطقان</a> كما في المشروع التالي:
	</li>
</ul>
<p style="width: 485px;margin: auto;">
	<iframe allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/499373708/?autostart=false" width="485"></iframe>
</p>

<p>
	انقر على زر <strong>إدراج إضافة</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98158" href="https://academy.hsoub.com/uploads/monthly_2022_05/AddExtension.png.9beb076290cdb91c0d8f5cfc2df489ce.png" rel=""><img alt="AddExtension.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98158" data-unique="ppbjixu11" src="https://academy.hsoub.com/uploads/monthly_2022_05/AddExtension.png.9beb076290cdb91c0d8f5cfc2df489ce.png" style="width: 200px; height: auto;"></a>
</p>

<p>
	واختر إضافة <strong>نص إلى كلام</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98199" href="https://academy.hsoub.com/uploads/monthly_2022_05/TexttoSpeech.png.cda5180250bbb52daa48f1c2dc79a2d0.png" rel=""><img alt="TexttoSpeech.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98199" data-unique="a40x5ppqf" src="https://academy.hsoub.com/uploads/monthly_2022_05/TexttoSpeech.thumb.png.6cae1ca5d6282f6131015d5e94e4be99.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	ستلاحظ إضافة كتل النص إلى كلام إلى قائمة كتل سكراتش:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98200" href="https://academy.hsoub.com/uploads/monthly_2022_05/TexttoSpeechBlocks.png.f2d42a2e458a23ad4b060a4d47b3c921.png" rel=""><img alt="TexttoSpeechBlocks.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98200" data-unique="m35uqngdo" src="https://academy.hsoub.com/uploads/monthly_2022_05/TexttoSpeechBlocks.png.f2d42a2e458a23ad4b060a4d47b3c921.png" style="width: 300px; height: auto;"></a>
</p>

<p>
	يمكنك جعل الكائنات تنطق عند النقر عليها، كما يمكنك اختيار اللغة التي ستتحدث بها، باستخدام الكتل التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98196" href="https://academy.hsoub.com/uploads/monthly_2022_05/SpeechBlocks1.png.2e18c30c2e9a107f54f3237903cc87fe.png" rel=""><img alt="SpeechBlocks1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98196" data-unique="q082rd44z" src="https://academy.hsoub.com/uploads/monthly_2022_05/SpeechBlocks1.png.2e18c30c2e9a107f54f3237903cc87fe.png" style="width: 400px; height: auto;"></a>
</p>

<p>
	كما يمكنك أيضًا اختيار صوت المتحدث، سواء أردت صوت امرأة، أم رجل، أو حتى صوت هرة!
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98176" href="https://academy.hsoub.com/uploads/monthly_2022_05/KittenVoice.png.38d27d3a3a7bc4d2254a841d1884c1b1.png" rel=""><img alt="KittenVoice.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98176" data-unique="zyi4pbihj" src="https://academy.hsoub.com/uploads/monthly_2022_05/KittenVoice.png.38d27d3a3a7bc4d2254a841d1884c1b1.png" style="width: 400px; height: auto;"></a>
</p>

<p>
	انقر على مشروع <a href="https://projects.raspberrypi.org/en/projects/space-talk" rel="external nofollow">الكائنات الفضائية</a> لمشاهدتها وهي تتحدث.
</p>

<ul>
<li>
		تغيير مظهر الكائن: يمكنك استخدام كتلة <strong>غيّر المظهر</strong> مع كتلتي <strong>قُل</strong> أو <strong>فكر</strong> لإيضاح ما يفكر أو يشعر به الكائن، كما في <a href="https://scratch.mit.edu/projects/498767227/editor" rel="external nofollow">المشروع التالي</a>:
	</li>
</ul>
<p style="width: 485px;margin: auto;">
	<iframe allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/498767227/?autostart=false" width="485"></iframe>
</p>

<p>
	وذلك باستخدام الكتل التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98165" href="https://academy.hsoub.com/uploads/monthly_2022_05/ChangeCustomeBlocks.png.840d9fee2ad4758e588676dc2f05ec2f.png" rel=""><img alt="ChangeCustomeBlocks.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98165" data-unique="adlwk3swj" src="https://academy.hsoub.com/uploads/monthly_2022_05/ChangeCustomeBlocks.png.840d9fee2ad4758e588676dc2f05ec2f.png" style="width: 400px; height: auto;"></a>
</p>

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

<ul>
<li>
		تحريك الكائن باستخدام المظاهر: شاهد حركة القنفذ في <a href="https://scratch.mit.edu/projects/499398615/editor" rel="external nofollow">المشروع التالي</a>:
	</li>
</ul>
<p style="width: 485px;margin: auto;">
	<iframe allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/499398615/?autostart=false" width="485"></iframe>
</p>

<p>
	يمكنك تحريك الكائن باستخدام كتلتي تغيير المظهر والتحرك داخل <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%83%D8%B1%D8%A7%D8%B1%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r1306/" rel="">حلقة تكرار</a>. كما يمكنك تغيير سرعة الكائن عبر تغيير الوقت في كتلة الانتظار:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98177" href="https://academy.hsoub.com/uploads/monthly_2022_05/MovementBlocks.png.67a982995974e9163456cecd4788f0ec.png" rel=""><img alt="MovementBlocks.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98177" data-unique="naikdhlzx" src="https://academy.hsoub.com/uploads/monthly_2022_05/MovementBlocks.png.67a982995974e9163456cecd4788f0ec.png" style="width: 450px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98171" href="https://academy.hsoub.com/uploads/monthly_2022_05/DirectionBlock.png.e76d6a67d169ba770b315fb70be2457a.png" rel=""><img alt="DirectionBlock.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98171" data-unique="ijkmnad9h" src="https://academy.hsoub.com/uploads/monthly_2022_05/DirectionBlock.png.e76d6a67d169ba770b315fb70be2457a.png"></a>
</p>

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

<ul>
<li>
		<p>
			تحديد الموضع والمظهر الابتدائي للكائن: إليك الكتل اللازمة لتحديد الموضع والمظهر الابتدائي للكائن عند بداية المشروع:
		</p>
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98197" href="https://academy.hsoub.com/uploads/monthly_2022_05/StartingPosBlocks.png.6b5e46e69bbc53c4664313d1866839fd.png" rel=""><img alt="StartingPosBlocks.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98197" data-unique="zccgyvplt" src="https://academy.hsoub.com/uploads/monthly_2022_05/StartingPosBlocks.png.6b5e46e69bbc53c4664313d1866839fd.png" style="width: 400px; height: auto;"></a>
</p>

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

<h3>
	تصحيح الأخطاء
</h3>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98163" href="https://academy.hsoub.com/uploads/monthly_2022_05/cat-magic.png.e999292b0ab7abb92424f36963237c1a.png" rel=""><img alt="cat-magic.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98163" data-unique="79zx6ibcd" src="https://academy.hsoub.com/uploads/monthly_2022_05/cat-magic.png.e999292b0ab7abb92424f36963237c1a.png"></a>
</p>

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

<h3>
	متى ستحدث المفاجأة؟
</h3>

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

<p>
	اطلع على <a href="https://scratch.mit.edu/projects/499336065/editor" rel="external nofollow">المشروع التالي</a> ولاحظ كيف ينفذ بعد الانتظار بضع ثوان:
</p>

<p style="width: 485px;margin: auto;">
	<iframe __idm_id__="1294344" allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/499336065/?autostart=false" width="485"></iframe>
</p>

<p>
	استخدم كتلة المؤقت التالية لتأخير تنفيذ المشروع بضع ثوانٍ بعد النقر على العلم الأخضر:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98201" href="https://academy.hsoub.com/uploads/monthly_2022_05/TimerBlock.png.036f41257f5f94d2bf764a12e17c88b1.png" rel=""><img alt="TimerBlock.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98201" data-unique="2zw12fs2b" src="https://academy.hsoub.com/uploads/monthly_2022_05/TimerBlock.png.036f41257f5f94d2bf764a12e17c88b1.png" style="width: 300px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98188" href="https://academy.hsoub.com/uploads/monthly_2022_05/ResetTimer.png.758e9b53ab87f2d635e10ee5a060fa5d.png" rel=""><img alt="ResetTimer.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98188" data-unique="x842vxp0t" src="https://academy.hsoub.com/uploads/monthly_2022_05/ResetTimer.png.758e9b53ab87f2d635e10ee5a060fa5d.png" style="width: 350px; height: auto;"></a>
</p>

<p>
	كما يمكنك تأخير تنفيذ المشروع باستخدام كتلة انتظار:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98203" href="https://academy.hsoub.com/uploads/monthly_2022_05/WaitBlock.png.df7d884ecf0d9104d1e0764d605a1e3c.png" rel=""><img alt="WaitBlock.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98203" data-unique="hwi9xn626" src="https://academy.hsoub.com/uploads/monthly_2022_05/WaitBlock.png.df7d884ecf0d9104d1e0764d605a1e3c.png" style="width: 350px; height: auto;"></a>
</p>

<h3>
	تصميم المفاجأة
</h3>

<p>
	اختر كيف سيفاجئنا الغرض أو الكائن المثير للاهتمام، هل عبر تشغيل صوت ما؟ أم عبر تغيير مظهره؟ أو تغيير المؤثرات الرسومية؟ أم تغيير حجمه؟
</p>

<p>
	يمكنك مفاجأتنا عن طريق إضافة مظهر مفاجئ إلى الكائن، كأن تحول تفاحةً إلى شبح!
</p>

<h3>
	إضافة مظهر جديد للكائن
</h3>

<p>
	انقر على نافذة المظاهر ثم انقر على أيقونة اختيار مظهر لإضافة المظهر الذي تحب من المكتبة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98168" href="https://academy.hsoub.com/uploads/monthly_2022_05/ChooseACustome.png.c412c92d73c0907eba8a8cd81867b0ff.png" rel=""><img alt="ChooseACustome.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98168" data-unique="tvq2a7f2a" src="https://academy.hsoub.com/uploads/monthly_2022_05/ChooseACustome.png.c412c92d73c0907eba8a8cd81867b0ff.png"></a>
</p>

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

<h3>
	تحويل الكائن إلى كائن آخر
</h3>

<p>
	حول الكائن إلى كائن آخر أو أضف مظهرًا مفاجئًا إلى الكائن باستخدام كتلتي الإظهار والإخفاء كما يلي:
</p>

<p>
	أضف كتلة الإخفاء التالية على الكائن الأصلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98174" href="https://academy.hsoub.com/uploads/monthly_2022_05/HideBlock.png.49d5d09d56090b2a8d1ae22c95f43188.png" rel=""><img alt="HideBlock.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98174" data-unique="mi431k5la" src="https://academy.hsoub.com/uploads/monthly_2022_05/HideBlock.png.49d5d09d56090b2a8d1ae22c95f43188.png" style="width: 350px; height: auto;"></a>
</p>

<p>
	ثم أضف كتلة الإظهار على الكائن الجديد:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98191" href="https://academy.hsoub.com/uploads/monthly_2022_05/ShowBlock.png.d0f0d3665a15c1490832b1e44c13dceb.png" rel=""><img alt="ShowBlock.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98191" data-unique="n3z5ndvjg" src="https://academy.hsoub.com/uploads/monthly_2022_05/ShowBlock.png.d0f0d3665a15c1490832b1e44c13dceb.png" style="width: 350px; height: auto;"></a>
</p>

<p>
	لا تنسى إضافة كتلة الإخفاء للكائن الجديد بعد كتلة عند النقر على العلم الأخضر!
</p>

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

<h3>
	تصحيح الأخطاء
</h3>

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

<ul>
<li>
		تغيير تموضع الكائنات باستخدام الطبقات: توجد طريقتان لوضع الكائنات في طبقات، الأولى هي بسحب الكائن على المنصة لنقله إلى الطبقة الأمامية، كما يلي:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98172" href="https://academy.hsoub.com/uploads/monthly_2022_05/drag-sprite-change-layers.gif.b770172dcb2e47b92e559228a1c55726.gif" rel=""><img alt="drag-sprite-change-layers.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="98172" data-unique="atblm2t0o" src="https://academy.hsoub.com/uploads/monthly_2022_05/drag-sprite-change-layers.gif.b770172dcb2e47b92e559228a1c55726.gif"></a>
</p>

<p>
	والثانية هي باستخدام الكتلتين البرمجيتين: إرسال إلى الطبقة أو إرسال إلى الطبقة الخلفية:
</p>

<p style="text-align: center;">
	<img alt="Front&amp;BackLayers.png" class="ipsImage ipsImage_thumbnailed" data-fileid="99906" data-unique="uimc14382" src="https://academy.hsoub.com/uploads/monthly_2022_05/628fc42d630c7_FrontBackLayers.png.b341508c9941c0e2d0439481755fcba5.png" style="width: 350px; height: auto;"></p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98187" href="https://academy.hsoub.com/uploads/monthly_2022_05/RepeatLayers.png.958d37b42be1c08820f18181f5fcd4a0.png" rel=""><img alt="RepeatLayers.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98187" data-unique="t7sur3ksp" src="https://academy.hsoub.com/uploads/monthly_2022_05/RepeatLayers.png.958d37b42be1c08820f18181f5fcd4a0.png" style="width: 350px; height: auto;"></a>
</p>

<ul>
<li>
		<p>
			لا تبدأ المفاجأة في الوقت الصحيح: تأكد من أنك اخترت المؤقت بدلًا عن الضجيج من النافذة المنسدلة للكتلة التالية، تأكد بعدها من وقت الانتظار الذي حددته:
		</p>
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98201" href="https://academy.hsoub.com/uploads/monthly_2022_05/TimerBlock.png.036f41257f5f94d2bf764a12e17c88b1.png" rel=""><img alt="TimerBlock.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98201" data-unique="2zw12fs2b" src="https://academy.hsoub.com/uploads/monthly_2022_05/TimerBlock.png.036f41257f5f94d2bf764a12e17c88b1.png" style="width: 350px; height: auto;"></a>
</p>

<h2>
	مرحلة ردة الفعل
</h2>

<p>
	سنختار في هذه الخطوة كيف ستتفاعل الشخصية الرئيسية مع المفاجأة، ماذا ستكون ردة فعلها، هل ستقول شيئًا ما، تصدر صوتًا، تتحرك أو تغير مظهرها؟ الخيار متروك لك!
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98202" href="https://academy.hsoub.com/uploads/monthly_2022_05/tresspass.png.28e3c0b05d4d2aa0971f4830a92d6f0f.png" rel=""><img alt="tresspass.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98202" data-unique="cflk8b1lm" src="https://academy.hsoub.com/uploads/monthly_2022_05/tresspass.png.28e3c0b05d4d2aa0971f4830a92d6f0f.png"></a>
</p>

<h3>
	متى ستتفاعل الشخصية
</h3>

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

<h3>
	كيف ستتفاعل الشخصية
</h3>

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

<h4>
	إضافة صوت للكائنات على المنصة
</h4>

<p>
	حدد الكائن الذي تريد إضافة صوتٍ له، ثم اضغط على علامة تبويب <strong>الأصوات</strong>، ولاحظ أن لكل كائن صوت افتراضي خاص به:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98195" href="https://academy.hsoub.com/uploads/monthly_2022_05/SoundsTab.png.6dcf812f373ea530efdb1588cdc0842c.png" rel=""><img alt="SoundsTab.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98195" data-unique="zfc2fka21" src="https://academy.hsoub.com/uploads/monthly_2022_05/SoundsTab.thumb.png.a55d661c86c2437872ded631edab47ba.png" style="width: 600px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98167" href="https://academy.hsoub.com/uploads/monthly_2022_05/choose-a-sound-button.png.82c7e2819475d79f2e441a24eda3a3e8.png" rel=""><img alt="choose-a-sound-button.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98167" data-unique="xt4w2x8ro" src="https://academy.hsoub.com/uploads/monthly_2022_05/choose-a-sound-button.png.82c7e2819475d79f2e441a24eda3a3e8.png" style="width: 250px; height: auto;"></a>
</p>

<p>
	ضع مؤشر الفأرة (أو إصبعك، إذا كنت تستخدم جهازًا لوحيًا) فوق رمز التشغيل، لتشغيل الصوت:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98194" href="https://academy.hsoub.com/uploads/monthly_2022_05/sound-preview.png.5b02edf0a471bbda1e2ed697faf1f981.png" rel=""><img alt="sound-preview.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98194" data-unique="0xmgb832c" src="https://academy.hsoub.com/uploads/monthly_2022_05/sound-preview.thumb.png.40ca2017b9fa77cd961042d510be5175.png" style="width: 550px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98179" href="https://academy.hsoub.com/uploads/monthly_2022_05/new-sound-added.png.c72f3ba9cd4e6c5b97b11b4a1785dfd4.png" rel=""><img alt="new-sound-added.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98179" data-unique="hxvryjlqz" src="https://academy.hsoub.com/uploads/monthly_2022_05/new-sound-added.thumb.png.cecc4f93f4be2655f8e4cae16d1c01ba.png" style="width: 600px; height: auto;"></a>
</p>

<p>
	ستجد الصوت الجديد الذي أضفته ضمن قائمة كتل الصوت في علامة تبويب <strong>الأصوات</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98180" href="https://academy.hsoub.com/uploads/monthly_2022_05/new-sound-block.png.234875e9cc94cc7bf578cdd2f70a12f5.png" rel=""><img alt="new-sound-block.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98180" data-unique="75ckqmb7r" src="https://academy.hsoub.com/uploads/monthly_2022_05/new-sound-block.png.234875e9cc94cc7bf578cdd2f70a12f5.png" style="width: 300px; height: auto;"></a>
</p>

<p>
	كما يمكنك إضافة أصوات للمنصة.
</p>

<h4>
	تسجيل الأصوات
</h4>

<p>
	اختر الكائن الذي تريد إضافة تسجيل صوت إليه ثم اضغط على علامة تبويب الأصوات :
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98195" href="https://academy.hsoub.com/uploads/monthly_2022_05/SoundsTab.png.6dcf812f373ea530efdb1588cdc0842c.png" rel=""><img alt="SoundsTab.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98195" data-unique="zfc2fka21" src="https://academy.hsoub.com/uploads/monthly_2022_05/SoundsTab.thumb.png.a55d661c86c2437872ded631edab47ba.png" style="width: 600px; height: auto;"></a>
</p>

<p>
	اضغط على رمز إضافة صوت ثم اضغط على رمز التسجيل :
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98184" href="https://academy.hsoub.com/uploads/monthly_2022_05/record-sound-button.png.13b2bb94911d210799837e21142614c4.png" rel=""><img alt="record-sound-button.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98184" data-unique="13zrdhcns" src="https://academy.hsoub.com/uploads/monthly_2022_05/record-sound-button.png.13b2bb94911d210799837e21142614c4.png" style="width: 250px; height: auto;"></a>
</p>

<p>
	ثم اضغط على زر التسجيل البرتقالي عندما تكون جاهزًا للتسجيل:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98185" href="https://academy.hsoub.com/uploads/monthly_2022_05/record-sound.png.39b860c7d6457cc030fbe9301760fc35.png" rel=""><img alt="record-sound.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98185" data-unique="2e58p14sf" src="https://academy.hsoub.com/uploads/monthly_2022_05/record-sound.png.39b860c7d6457cc030fbe9301760fc35.png" style="width: 500px; height: auto;"></a>
</p>

<p>
	واضغط على زر إيقاف التسجيل عند الانتهاء:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98198" href="https://academy.hsoub.com/uploads/monthly_2022_05/stop-recording-sound.png.b65cce918bb2843af8eb032ae677f564.png" rel=""><img alt="stop-recording-sound.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98198" data-unique="zs6d429bz" src="https://academy.hsoub.com/uploads/monthly_2022_05/stop-recording-sound.png.b65cce918bb2843af8eb032ae677f564.png" style="width: 500px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98169" href="https://academy.hsoub.com/uploads/monthly_2022_05/crop-your-sound.png.9140ab74028c26072dbb2af23bb8071c.png" rel=""><img alt="crop-your-sound.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98169" data-unique="rkjalcmpq" src="https://academy.hsoub.com/uploads/monthly_2022_05/crop-your-sound.png.9140ab74028c26072dbb2af23bb8071c.png" style="width: 500px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98181" href="https://academy.hsoub.com/uploads/monthly_2022_05/new-sound-inserted.png.a9ffdbe5b33dda9512cf7cbcb4dfb740.png" rel=""><img alt="new-sound-inserted.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98181" data-unique="8lidphtq1" src="https://academy.hsoub.com/uploads/monthly_2022_05/new-sound-inserted.thumb.png.f8b34b3a59c40af18dacd8f9d12c6fae.png" style="width: 550px; height: auto;"></a>
</p>

<p>
	ستجد الصوت الجديد الذي سجلته ضمن كتل الصوت في علامة تبويب الأصوات:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98193" href="https://academy.hsoub.com/uploads/monthly_2022_05/sound-blocks-menu.png.93c0c51f32c5cc0187c983b3537b71e7.png" rel=""><img alt="sound-blocks-menu.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98193" data-unique="sq02x3zyo" src="https://academy.hsoub.com/uploads/monthly_2022_05/sound-blocks-menu.png.93c0c51f32c5cc0187c983b3537b71e7.png" style="width: 350px; height: auto;"></a>
</p>

<p>
	الآن، انقر على العلم الأخضر لتختبر مشروعك، هل تتحرك الكائنات بانسيابية؟ هل لديك عنصر تشويق ورد فعل في قصتك؟ هل يُعاد تعيين كل شيء بشكل صحيح عند النقر فوق العلم الأخضر مرة أخرى؟
</p>

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

<h2>
	اختبر معلوماتك
</h2>

<p>
	انعش ذاكرتك واختبر معلوماتك بالإجابة عن الأسئلة التالية:
</p>

<ol>
<li>
		<strong>السؤال الأول</strong>: شغل المشروع التالي بالنقر على العلم الأخضر، ثم شغله مرةً ثانية، ما الخطأ الذي تلاحظه وكيف يمكن إصلاحه؟
	</li>
</ol>
<p style="width: 485px;margin: auto;">
	<iframe allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/499932713/?autostart=false" width="485"></iframe>
</p>

<p>
	(حاول تذكر ما تعلمناه قبل الإطلاع على الإجابة أدناه)
</p>

<ul style="margin-right: 40px;">
<li>
		<strong>الإجابة الصحيحة</strong>: تختفي البيضة ويزول عنصر المفاجأة بعد أول مرة، ويمكن إصلاح ذلك عبر إضافة كتلة تغيير المظهر لتظهر البيضة على الشاشة مرةً أخرى.
	</li>
</ul>
<ol start="2">
<li>
		<strong>السؤال الثاني</strong>: ما هو عمل الكتلة التالية؟
	</li>
</ol>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98183" href="https://academy.hsoub.com/uploads/monthly_2022_05/Question2.PNG.2a3b096b3b3c613bafd6af7d5cc79fc0.PNG" rel=""><img alt="Question2.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98183" data-unique="s6i9o088i" src="https://academy.hsoub.com/uploads/monthly_2022_05/Question2.PNG.2a3b096b3b3c613bafd6af7d5cc79fc0.PNG" style="width: 380px; height: auto;"></a>
</p>

<ul style="margin-right: 40px;">
<li>
		<strong>الإجابة الصحيحة</strong>: الانتظار 6 ثواني ثم إظهار الكائن.
	</li>
</ul>
<ol start="3">
<li>
		<strong>السؤال الثالث</strong>: قسمنا المشهد المتحرك في هذا المشروع إلى أجزاء صغيرة ليسهل علينا إنجازه، ما هي المراحل الأربع التي اعتمدناها في مشروعنا؟
	</li>
</ol>
<ul style="margin-right: 40px;">
<li>
		<strong>الإجابة الصحيحة</strong>: مرحلة الإعداد، مرحلة إثارة الفضول، مرحلة عنصر المفاجأة، مرحلة ردة الفعل.
	</li>
</ul>
<h2>
	ترقية المشروع
</h2>

<p>
	إليك بعض التحسينات التي يمكنك إضافتها على مشروعك لترقيته:
</p>

<ul>
<li>
		ترقية المشهد عبر تطبيق تأثيرات رسومية مختلفة، تعديل حركة الكائنات وتعديل مظاهرها.
	</li>
	<li>
		تعديل مظاهر الكائنات باستخدام محرر الرسام.
	</li>
	<li>
		تسجيل صوتك أو تسجيل تأثيرات صوتية مختلفة وإضافتها إلى المشروع.
	</li>
</ul>
<p>
	لا تنسى أن المبرمجين المحترفين يوسعون مداركهم بالإطلاع على المشاريع التي نفذها المبرمجون الآخرون، لذلك اطلع على <a href="https://scratch.mit.edu/studios/29075822" rel="external nofollow">معرض مشاريع المشهد المتحرك ذو عنصر المفاجأة</a> وانقر على الرابط المرفق مع كل مشروع لمشاهدة الكتل البرمجية الخاصة بكل مشروع في محرر سكراتش و معرفة كيف نُفِذت. اخترنا لك منها <a href="https://scratch.mit.edu/projects/499498152/editor" rel="external nofollow">المشروع التالي</a>:
</p>

<p style="width: 485px;margin: auto;">
	<iframe allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/500767602/?autostart=false" width="485"></iframe>
</p>

<p>
	وألق نظرةً أيضًا على معرض أعمال <a href="https://scratch.mit.edu/studios/29079784" rel="external nofollow">مشاريع المشهد المتحرك ذو عنصر المفاجأة</a> لمشاهدة المشاريع التي أنشأها أعضاء مجتمع سكراتش.
</p>

<p>
	ولا تنسى مشاركتنا مشروعك على مجتمع سكراتش في <a href="https://io.hsoub.com/" rel="external">منصة حسوب IO</a>.
</p>

<h2>
	خاتمة
</h2>

<p>
	تهانينا! لقد أتممت مشروع إنشاء مشهد متحرك يعتمد على عنصر المفاجأة باستخدام برنامج سكراتش. ننصحك بتنفيذ مشروع إنشاء كتاب إلكتروني تفاعلي باستخدام برنامج سكراتش كخطوتك التالية. إذا واجهت مشاكل مع برنامج سكراتش فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في <a href="https://academy.hsoub.com/questions/" rel="">أكاديمية حسوب</a>.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://projects.raspberrypi.org/en/projects/surprise-animation/0" rel="external nofollow">Surprise! animation</a> من <a href="https://raspberrypi.org/" rel="external nofollow">الموقع الرسمي لراسبيري باي</a>.
</p>

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

<ul>
<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/general/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B4%D8%AE%D8%B5%D9%8A%D8%A9-%D9%84%D9%87%D8%A7-%D8%B9%D9%8A%D9%88%D9%86-%D8%B0%D8%A7%D8%AA-%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1-%D9%83%D8%B1%D8%AA%D9%88%D9%86%D9%8A-%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-r1552/" rel="">إنشاء شخصية لها عيون ذات تأثير كرتوني باستخدام سكراتش</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%A3%D8%B6%D9%88%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%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-r1482/" rel="">إنشاء لعبة أضواء باستخدام برنامج سكراتش وحاسوب راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%84%D8%B9%D8%A8%D8%A9-%D8%A7%D9%84%D8%B3%D9%84%D9%83-%D9%88%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%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-r1495/" rel="">تصميم لعبة السلك والحلقة باستخدام برنامج سكراتش وحاسوب راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B5%D8%A8%D8%A7%D8%AD-%D9%84%D9%8A%D8%AF-%D8%AB%D9%84%D8%A7%D8%AB%D9%8A-%D8%A7%D9%84%D8%A3%D8%A8%D8%B9%D8%A7%D8%AF-%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%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-r1504/" rel="">تنفيذ مصباح ليد ثلاثي الأبعاد باستخدام سكراتش ولوحة راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%B5%D9%86%D8%B9-%D8%A2%D9%84%D8%A9-%D9%85%D9%88%D8%B3%D9%8A%D9%82%D9%8A%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-%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-r1505/" rel="">صنع آلة موسيقية باستخدام سكراتش وحاسوب راسبيري باي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1553</guid><pubDate>Mon, 23 May 2022 15:05:00 +0000</pubDate></item><item><title>&#x628;&#x646;&#x627;&#x621; &#x639;&#x62F;&#x629; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x648;&#x64A;&#x628; &#x62A;&#x642;&#x62F;&#x645;&#x64A;&#x629; PWA &#x639;&#x644;&#x649; &#x646;&#x637;&#x627;&#x642; &#x648;&#x627;&#x62D;&#x62F;</title><link>https://academy.hsoub.com/programming/general/%D8%A8%D9%86%D8%A7%D8%A1-%D8%B9%D8%AF%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D9%88%D9%8A%D8%A8-%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-%D8%B9%D9%84%D9%89-%D9%86%D8%B7%D8%A7%D9%82-%D9%88%D8%A7%D8%AD%D8%AF-r1549/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/thumb.png.46f045aa1ad372d126f14b701ddef346.png" /></p>

<p>
	ناقش ديميان Demian التحديات التي تواجهها المواقع متعددة الأصول multiple origins عند محاولة إنشاء تطبيق ويب تقدمي واحد يشملها جميعًا، وذلك في مقال <a href="https://web.dev/multi-origin-pwas/" rel="external nofollow">تطبيق الويب التقدمي على أصول متعددة</a>.
</p>

<p>
	يعد موقع <a href="https://academy.hsoub.com/entrepreneurship/ecommerce/%D8%AA%D8%A7%D8%B1%D9%8A%D8%AE-%D8%A7%D9%84%D8%AA%D8%AC%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D8%A8%D8%A7%D9%84%D8%A3%D8%B1%D9%82%D8%A7%D9%85-%D9%85%D9%86-%D8%B9%D8%A7%D9%85-2002-%D9%88%D8%AD%D8%AA%D9%89-%D8%A7%D9%84%D9%84%D8%AD%D8%B8%D8%A9-r731/" rel="">التجارة الإلكترونية</a> الافتراضي <code>www.example.com</code> مثالًا على موقع متعدد الأصول، إذا كان:
</p>

<ul>
<li>
		الصفحة الرئيسية مُستضافة على العنوان <code><a href="https://www.example.com" ipsnoembed="false" rel="external nofollow">https://www.example.com</a></code>.
	</li>
	<li>
		صفحات الفئات مستضافة على عنوان مختلف مثلًا: <code><a href="https://category.example.com" ipsnoembed="false" rel="external nofollow">https://category.example.com</a></code>.
	</li>
	<li>
		صفحات تفاصيل المنتج مستضافة على عنوان ثالث مختلف، مثلًا: <code><a href="https://product.example.com" ipsnoembed="false" rel="external nofollow">https://product.example.com</a></code>.
	</li>
</ul>
<p>
	تُقيِّد سياسة الأصل المشترك same-origin مشاركة <a href="https://academy.hsoub.com/programming/general/%D9%85%D9%81%D9%87%D9%88%D9%85-service-worker-%D9%88%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1%D9%87-%D9%81%D9%8A-%D8%A3%D8%AF%D8%A7%D8%A1-%D9%88%D8%A8%D9%86%D9%8A%D8%A9-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D9%88%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r833/" rel="">عمّال الخدمة service workers</a> وذاكرة التخزين المؤقت cache، والأذونات permessions، عبر الأصول المختلفة، لذا نوصي بشدة بتجنب هذا النوع من إعداد المواقع (سياسة الأصل المشترك)، ونوصي من لديهم مواقع مبنية بهذه الطريقة بالفعل، بالنظر في الانتقال إلى معمارية الموقع ذات الأصل الواحد single origin إذا أمكن.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2022_05/01avoid_different_origins_of_the_same_site.png.2b565a958b90dfe5837f89a434808745.png" data-fileid="97532" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="97532" data-unique="svas300ps" src="https://academy.hsoub.com/uploads/monthly_2022_05/01avoid_different_origins_of_the_same_site.png.2b565a958b90dfe5837f89a434808745.png" alt="01avoid_different_origins_of_the_same_site.png"></a>
</p>

<p style="text-align: center;">
	تجنب استخدام أصول مختلفة لأقسام نفس الموقع عند بنائك تطبيق PWA واحد يشملها جميعًا.
</p>

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

<p>
	لكن قبل البدء سنراجع أهم المفاهيم التقنية التي ستلزمنا، وذلك بالاعتماد على رابط موقع التجارة الالكترونية الافتراضي <code><a href="https://www.example.com" ipsnoembed="false" rel="external nofollow">https://www.example.com</a></code>:
</p>

<h2>
	مصطلحات تقنية
</h2>

<ul>
<li>
		النطاق Domain: هو أي تسلسل من العناوين الموجودة في <a href="https://academy.hsoub.com/devops/servers/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%85%D9%8F%D8%B5%D8%B7%D9%8E%D9%84%D8%AD%D8%A7%D8%AA-%D9%88%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%88%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D9%86%D8%B8%D8%A7%D9%85-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA-r5/" rel="">نظام أسماء النطاقات DNS</a>، مثلًا يعد <code>com</code> و<code>example.com</code> نطاقان، لكن الفرق هنا أن <code>com</code> هو النطاق الرئيسي بينما تُعد <code>example.com</code> أو مثلًا <code>test.com</code> و<code>blog.com</code> نطاقات فرعية sub domains من النطاق الرئيسي <code>com</code>، أيضًا يعد كلًا من <code>web.example.com</code> و<code>app.example.com</code> مثلًا وغيرها، نطاقات فرعية sub domains من نطاقها الرئيسي <code>www.example.com</code> الذي يُعد كما قلنا نطاق فرعي بالنسبة للنطاق الرئيسي العام <code>com</code> وهلم جرًا.
	</li>
	<li>
		اسم المضيف Host name: هو اسم مخصص لأي جهاز متصل بشبكة، يُحلّل إلى (ويقابل) عنوان IP الجهاز في نظام أسماء النطاقات DNS، مثلًا <code>www.example.com</code> هو اسم مضيف.
	</li>
	<li>
		الأصل Origin: هو تجميعة من كلًا من البروتوكول، واسم المضيف، والمنفذ (اختياريًا)، مثلًا يعد العنوان <code><a href="https://www.example.com:443" ipsnoembed="false" rel="external nofollow">https://www.example.com:443</a></code> أصل.
	</li>
</ul>
<h2>
	إنشاء علاقة بين تطبيقات الويب التقدمية PWA
</h2>

<p>
	قد ترغب في بعض الحالات بإنشاء تطبيقات مستقلة، رغم أنك لا تزال مقررًا أنها متعلقة ببعضها وتنتمي لنفس المؤسسة أو <a href="https://academy.hsoub.com/entrepreneurship/ecommerce/%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%AC%D8%A7%D8%B1%D9%8A%D8%A9-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-%D9%82%D8%B1%D8%A7%D8%B1-%D8%A7%D9%84%D8%B4%D8%B1%D8%A7%D8%A1-%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%AC%D8%A7%D8%B1%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D9%85%D9%86%D8%AA%D8%AC-r818/" rel="">العلامة التجارية brand</a>. يُعد إعادة استخدام نفس <strong>اسم النطاق</strong> لجميع هذه المواقع طريقة جيدة لتأسيس علاقة قوية بينها، مثلًا:
</p>

<ul>
<li>
		يريد موقع التجارة الإلكترونية <code><a href="https://www.example.com" ipsnoembed="false" rel="external nofollow">https://www.example.com</a></code> إنشاء تجربة موقع مستقلة تسمح للبائعين بإدارة مخزونهم، مع التأكيد لهم أن هذا الموقع بتجربته المستقلة ينتمي إلى موقع التجارة الرئيسي الذي يشتري المستخدمون منه المنتجات.
	</li>
	<li>
		تريد شركة إخبارية إنشاء تطبيق محدد لحدث رياضي عظيم، وذلك للسماح للمستخدمين بتلقي إحصائيات حول مسابقاتهم المفضلة عبر الإشعارات، وتمكينهم من تثبيت تطبيق PWA هذا على أجهزتهم بالتالي مشاهدة المحتوى الرياضي بسهولة، هذا مع التأكيد للمستخدمين أن التطبيق الرياضي يتبع لتلك الشركة الإخبارية.
	</li>
	<li>
		تريد إحدى الشركات إنشاء تطبيقات منفصلة لكلًا من الدردشة chat ورسائل البريد mail والتقويم calender وتريد أن تعمل هذه التطبيقات بشكل منفصل لكن تكون مرتبطة باسم الشركة.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2022_05/02independent_apps_with_same_domain_name.png.0a9098c50f4c5ba0f4319aaac87efee6.png" data-fileid="97533" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="97533" data-unique="1ltehycwj" src="https://academy.hsoub.com/uploads/monthly_2022_05/02independent_apps_with_same_domain_name.png.0a9098c50f4c5ba0f4319aaac87efee6.png" style="width: 629px; height: auto;" alt="02independent_apps_with_same_domain_name.png"></a>
</p>

<p style="text-align: center;">
	تريد الشركة المالكة لموقع example.com توفير ثلاثة تطبيقات PWA مستقلة، باستخدام نفس اسم المجال لتأسيس علاقة قوية بينها.
</p>

<h3>
	استخدام أصول منفصلة
</h3>

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

<p>
	إذا كنت تريد استخدام نفس اسم النطاق لجميع تطبيقات PWA المرتبطة ببعضها، فيمكنك القيام بذلك باستخدام النطاقات الفرعية sub domains. مثلًا يمكن لشركة تقدم خدمات إنترنت متعددة استضافة تطبيق بريد على الأصل <code><a href="https://mail.example.com" ipsnoembed="false" rel="external nofollow">https://mail.example.com</a></code> وتطبيق تقويم على الأصل <code><a href="https://calendar.example.com" ipsnoembed="false" rel="external nofollow">https://calendar.example.com</a></code>، وتقديم الخدمة الرئيسية لأعمالها على الأصل <code><a href="https://www.example.com" ipsnoembed="false" rel="external nofollow">https://www.example.com</a></code>.
</p>

<p>
	وهناك مثال آخر لاستخدام النطاقات الفرعية للحصول على أصول مختلفة، وهو موقع رياضي يريد إنشاء تطبيق مستقل مخصص تمامًا لحدث رياضي مهم، مثل بطولة كرة القدم، وذلك على <code><a href="https://footballcup.example.com" ipsnoembed="false" rel="external nofollow">https://footballcup.example.com</a></code>، يمكن للمستخدمين تثبيت موقع البطولة هذا على أجهزتهم واستخدامه بشكل مستقل عن موقع الرياضة الرئيسي المستضاف على <code><a href="https://www.example.com" ipsnoembed="false" rel="external nofollow">https://www.example.com</a></code>.
</p>

<p>
	قد تكون هذه الطريقة مفيدة أيضًا للأنظمة التي تتيح للعملاء إنشاء تطبيقاتهم المستقلة بهم تحت علامة الشركة التجارية، كأن يتيح أحد تطبيقات الويب للتجار إنشاء تطبيقاتهم الخاصة على نطاقات فرعية بأسمائهم مثل <code><a href="https://ahmad.example.com" ipsnoembed="false" rel="external nofollow">https://ahmad.example.com</a></code> و<code><a href="https://ali.example.com" ipsnoembed="false" rel="external nofollow">https://ali.example.com</a></code> وغيرها.
</p>

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

<ul>
<li>
		قابلية التثبيت Installability: حيث يوجد لكل تطبيق منها ملف بيان موارد Manifest، يوفر تجربة التطبيق الخاصة القابلة للتثبيت.
	</li>
	<li>
		التخزين Storage: يوجد لكل تطبيق منها ذاكرة تخزين مؤقتة cache، وميزات تخزين محلي local storage، وجميع أشكال التخزين المحلي للجهاز device-local بشكل أساسي.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D9%81%D9%87%D9%88%D9%85-service-worker-%D9%88%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1%D9%87-%D9%81%D9%8A-%D8%A3%D8%AF%D8%A7%D8%A1-%D9%88%D8%A8%D9%86%D9%8A%D8%A9-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D9%88%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r833/" rel="">عمال الخدمة Service Workers</a>: يوجد لكل تطبيق منها عامل خدمة مسؤول عن نطاقات التطبيق المسجلة فيه.
	</li>
	<li>
		الأذونات Permissions: يعطَى لكل تطبيق من تطبيقات PWA المرتبطة ببعضها عبر النطاقات الفرعية والمختلفة في الأصل، أذونات بشكل منفصل عن غيره، وهذا يفيد المستخدمين في معرفة الخدمة التي يمنحونها أذوناتهم بالضبط، كما تُنسب الإشعارات بدقة لكل تطبيق.
	</li>
</ul>
<p>
	يُوصى باتباع هذه الدرجة من العزلة (الأصول المختلفة) عند بناء عدة تطبيقات ويب تقدمية PWA مستقلة Independent.
</p>

<p>
	إذا أرادت تطبيقات النطاقات الفرعية مشاركة بياناتها المحلية مع بعضها البعض، فبإمكانها القيام بذلك عبر <a href="https://academy.hsoub.com/questions/5636-%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D9%82%D8%B5%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%84%D9%81-%D8%AA%D8%B9%D8%B1%D9%8A%D9%81-%D8%A7%D9%84%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-cookie%D8%9F/" rel="">ملفات تعريف الارتباط cookies</a>، أو بطريقة متقدمة أكثر، يمكنها مزامنة التخزين بواسطة الخادم.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="97534" data-unique="vok7ghcec" src="https://academy.hsoub.com/uploads/monthly_2022_05/03PWAs_in_distinct_origins_by_subdomains.png.c1f74b202da2dbd1f5ed941262c93821.png" style="width: 629px; height: auto;" alt="03PWAs_in_distinct_origins_by_subdomains.png"></p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="" rel=""></a>يعد بناء تطبيقات ويب تقدمية PWA مختلفة على نطاقات منفردة باستخدام النطاقات الفرعية ممارسة جيدة.
</p>

<h3>
	استخدام نفس الأصل
</h3>

<p>
	الطريقة الثانية هي بناء تطبيقات PWA المتعلقة ببعضها، على نفس الأصل same origin، ويتضمن ذلك السيناريوهات التالية:
</p>

<h4>
	مسارات غير متراكبة
</h4>

<p>
	أي تُستضاف تطبيقات PWA المتعلقة ببعضها على نفس الأصل، لكن مع مسارات paths غير متراكبة non-overlapping، مثلًا:
</p>

<ul>
<li>
		<a href="https://example.com/app1" ipsnoembed="false" rel="external nofollow">https://example.com/app1</a>
	</li>
	<li>
		<a href="https://example.com/app2" ipsnoembed="false" rel="external nofollow">https://example.com/app2</a>
	</li>
</ul>
<h4>
	المسارات المتراكبة أو المتداخلة
</h4>

<p>
	أي تستضاف تطبيقات الويب التقديمة PWA المتعددة على نفس الأصل، لكن أحد نطاقاتها متداخل nested داخل الآخر، مثلًا:
</p>

<ul>
<li>
		<a href="https://example.com" ipsnoembed="false" rel="external nofollow">https://example.com</a> (التطبيق الخارجي)
	</li>
	<li>
		<a href="https://example.com/app" ipsnoembed="false" rel="external nofollow">https://example.com/app</a> (التطبيق الداخلي)
	</li>
</ul>
<p>
	يسمح لك كلًا من الواجهة البرمجية Service Worker وتنسيق ملف بيان الموارد manifest بتطبيق الطريقتين السابقتين، وذلك بتحديد النطاقات فرعية أو رئيسية بناء على مستوى المسار path-level، لكن في كلتا الحالتين، يؤدي استخدام نفس الأصل إلى العديد من التحديات والمحدوديّات، النابعة من حقيقة أن المتصفح لن يعتبرها تطبيقات متمايزة، بالتالي <strong>لا يُنصح بهذا الأسلوب</strong>.
</p>

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

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="97535" data-unique="noaal27ak" src="https://academy.hsoub.com/uploads/monthly_2022_05/04paths_of_2independent_PWAs_on_same_origin.png.ac83cda6c4d2e802c8193d00e808b7ef.png" style="width: 629px; height: auto;" alt="04paths_of_2independent_PWAs_on_same_origin.png"></p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="" rel=""></a>لا يُنصح باستخدام المسارات المتداخلة وغير المتداخلة لاستضافة تطبيقين PWA مستقلين على نفس الأصل.
</p>

<h2>
	التحديات التي تواجه تطبيقات PWA على نفس الأصل
</h2>

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

<ul>
<li>
		التخزين Storage: تُشارَك ملفات تعريف الارتباط cookies وبيانات التخزين المحلي local storage وجميع أشكال التخزين المحلي للجهاز device-local بين التطبيقات ذات نفس الأصل origin. لهذا، فإذا قرر المستخدم مسح البيانات المحلية لأحد تطبيقات PWA المتعلقة ببعضها، فستُمسح بيانات جميع التطبيقات المشتركة بنفس الأصل مع ذلك التطبيق، فلا توجد طريقة لمسح بيانات تطبيق واحد فقط منها بعينه. تحث بعض المتصفحات مثل Chrome وغيره المستخدمين دومًا على مسح البيانات المحلية عند إلغاء تثبيت أحد التطبيقات، وهذا سيؤثر على بيانات التطبيقات الأخرى المشتركة معه في نفس الأصل، والتحدي الآخر الممكن أن تواجهه بالنسبة للتخزين في التطبيقات المشتركة بنفس الأصل، هو أن هذه التطبيقات بطبعها تشارك بعضها حصة التخزين الخاصة بها، بالتالي إذا كان أيًا منها يشغَل مساحة تخزينية كبيرة جدًا، فسيتأثر الآخر سلبًا.
	</li>
	<li>
		الأذونات Permissions: إذا منح المستخدم إذنًا لأحد تطبيقات PWA المتعلقة ببعضها، فسيُمنح نفس الإذن لجميع التطبيقات المشتركة في نفس الأصل مع ذلك التطبيق، فالأذونات مرتبطة بالأصل أيضًا كما التخزين. قد يبدو هذا ميزة، بحيث لا تضطر جميع تلك التطبيقات إلى طلب نفس الإذن، أي طلب نفس الإذن عدة مرات، لكن التحدي هنا يكمن في حظر المستخدم إذنًا لأحد التطبيقات، فوقتها تُمنع التطبيقات الأخرى المشتركة في الأصل من طلب هذا الإذن، بالتالي لا تستطيع جميعها استخدام ميزة التطبيق التي تتطلب ذلك الإذن.
	</li>
	<li>
		إعدادات المستخدم User settings: تعيّن إعدادات المستخدم لتطبيقات الويب أيضًا بالإعتماد على الأصل، مثلًا، إذا كان لتطبيقان مشتركان في الأصل أحجام خطوط مختلفة، ويريد المستخدم ضبط تكبير حجم خط أحدهما فقط، فسيَكبُر حجم خط التطبيقات الأخرى المشتركة معه في نفس الأصل.
	</li>
</ul>
<p>
	تجعلنا التحديات السابقة نتجنب هذا النهج (الأصل المشترك). لكن، إذا كنت لا تستطيع استخدام أصل منفصل (مثل نطاق فرعي) لكل تطبيق من تطبيقات PWA المتعلقة ببعضها، فيمكنك ترشيح خيار <strong>المسارات غير المتداخلة</strong> بدلًا من خيار <strong>المسارات المتراكبة أو المتداخلة</strong> ضمن خيارَي استخدام نفس الأصل في الأعلى.
</p>

<h2>
	تحديات إضافية للمسارات المتراكبة أو المتداخلة
</h2>

<p>
	المشكلة الإضافية المتعلقة بنهج المسارات المتراكبة أو المتداخلة (حيث <a href="https://example.com" ipsnoembed="false" rel="external nofollow">https://example.com</a> هو التطبيق الخارجي والمسار <a href="https://example.com/app" ipsnoembed="false" rel="external nofollow">https://example.com/app</a> هو للتطبيق الداخلي)، هو أن جميع عناوين URL في التطبيق الداخلي ستُعتبر جزءًا من كلا التطبيقين الداخلي والخارجي. وهذا يسبب عمليًا المشكلات التالية:
</p>

<ul>
<li>
		إمكانية التثبيت Installation: إذا زار المستخدم التطبيق الداخلي (مثلًا في متصفح ويب)، وكان التطبيق الخارجي مثبتًا بالفعل في جهاز المستخدم، فلن يعرض المتصفح لافتات لتثبيت التطبيق الداخلي. وذلك لأن المتصفح عندما يتحقق من إنتماء الصفحة الحالية إلى تطبيق مثبت بالفعل أم لا، فإنه سيعتبر التطبيق الداخلي مثبت على الجهاز كون التطبيق الخارجي مثبت بالفعل، ويمكن أن تُحل هذه المشكلة بتثبيت التطبيق الداخلي يدويًا (عبر خيار "إنشاء اختصار" في المتصفح)، أو تثبيت التطبيق الداخلي أولاً، قبل التطبيق الخارجي.
	</li>
	<li>
		الواجهتان البرمجيتان Notification و Padging: إذا تم تثبيت التطبيق الخارجي دون الداخلي، فستُنسب الإشعارات والشارات القادمة من التطبيق الداخلي عن طريق الخطأ إلى التطبيق الخارجي، إذ تنسب الإشعارات والشارات بدقة لكل تطبيق في حال ثبِّت كليها على جهاز المستخدم.
	</li>
	<li>
		التقاط الرابط Link Capturing: إذا تم تثبيت التطبيق الخارجي دون الداخلي، فلن يتم التقاط روابط التطبيق الداخلي المرتبطة بالتطبيق الخارجي، أي بدلًا من أن يُفتح الرابط الداخلي في نفس التبويبة ضمن نطاق تصفح التطبيق الخارجي، فإنه سيُفتح في تبويبة جديدة لأن المتصفح سعتبره تطبيقًا غريبًا (تطبيق مختلف غير مرتبط به). لكن إذا أضيفت تطبيقات PWA هذه إلى المتجر على نظامَي Chrome OS وAndroid، فسيلتقط التطبيق الخارجي تلك الروابط، وأيضًا إذا تم تثبيت التطبيق الداخلي، فسيظل نظام التشغيل يوفر للمستخدم خيار فتح تلك الروابط المتعلقة بالتطبيق الداخلي في التطبيق الخارجي.
	</li>
</ul>
<h2>
	الخاتمة
</h2>

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

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

<ul>
<li>
		على أصول منفصلة: <strong>موصى بها</strong>.
	</li>
	<li>
		على نفس الأصل بمسارات غير متداخلة: <strong>ليست مستحسنة</strong>.
	</li>
	<li>
		على نفس الأصل بمسارات متراكبة overlapping أو متداخلة nested: <strong>لا ينصح بها بشدة</strong>.
	</li>
</ul>
<p>
	إذا لم يكن بإمكانك استخدام أصول مختلفة، فاستخدم مسارات غير متداخلة، مثلًا <code><a href="https://example.com/app1" ipsnoembed="false" rel="external nofollow">https://example.com/app1</a></code> و<code><a href="https://example.com/app2" ipsnoembed="false" rel="external nofollow">https://example.com/app2</a></code>، بدلًا من المسارات المتراكبة أو المتداخلة مثل <code>https: //example.com</code> (للتطبيق الخارجي) وعنوان <code><a href="https://example.com/app" ipsnoembed="false" rel="external nofollow">https://example.com/app</a></code> (للتطبيق الداخلي).
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://web.dev/building-multiple-pwas-on-the-same-domain/" rel="external nofollow">Building multiple Progressive Web Apps on the same domain</a> من موقع <a href="https://web.dev/" rel="external nofollow">web.dev</a>.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa%D8%9F-r1480/" rel="">ما هي تطبيقات الويب التقدمية PWA</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A7%D8%B3%D8%AA%D9%82%D8%A8%D8%A7%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%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-web-share-target-r1544/" rel="">استقبال تطبيقات الويب التقدمية البيانات المشاركة عبر الواجهة البرمجية Web Share Target</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AC%D8%B9%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-%D9%8A%D8%A8%D8%AF%D9%88-%D9%83%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A-%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-r1528/" rel="">جعل تطبيق الويب التقدمي PWA يبدو كتطبيق أساسي في نظام التشغيل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%A7%D8%AE%D8%AA%D8%B5%D8%A7%D8%B1%D8%A7%D8%AA-%D9%84%D9%84%D9%85%D9%87%D8%A7%D9%85-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r1543/" rel="">إضافة اختصارات للمهام الشائعة في تطبيقات الويب التقدمية PWA</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1549</guid><pubDate>Wed, 04 May 2022 16:16:43 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x645;&#x624;&#x634;&#x631; &#x623;&#x636;&#x62E;&#x645; &#x645;&#x62D;&#x62A;&#x648;&#x649; &#x645;&#x631;&#x626;&#x64A; LCP &#x641;&#x64A; &#x645;&#x648;&#x642;&#x639; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x648;&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62D;&#x633;&#x64A;&#x646;&#x647;</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%85%D8%A4%D8%B4%D8%B1-%D8%A3%D8%B6%D8%AE%D9%85-%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D9%85%D8%B1%D8%A6%D9%8A-lcp-%D9%81%D9%8A-%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AD%D8%B3%D9%8A%D9%86%D9%87-r1561/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/6280bf073f195_------LCP-------.png.2639a211e60a4028d3660504468ceb07.png" /></p>

<p>
	تتكون كل صفحة ويب من عشرات ومئات العناصر من صور ونصوص وأزرار وودجات وغيرها حيث تتنوع أحجام هذه العناصر ويمكنك معرفة الكثير من موقعك من خلال أكبر عنصر باستخدام مؤشر أضخم محتوى مرئي LCP اختصار للعبارة Largest Contentful Paint.
</p>

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

<h2>
	ماذا يعني أضخم محتوى مرئي LCP
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98755" href="https://academy.hsoub.com/uploads/monthly_2022_05/001_wordpress_LCP.png.2b5d1530bb8f0e331a19a928d09a72fe.png" rel=""><img alt="001_wordpress_LCP.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98755" data-unique="bpfwusxxs" src="https://academy.hsoub.com/uploads/monthly_2022_05/001_wordpress_LCP.thumb.png.9a0b889db4f5a422275e09d24761cb0c.png" style="width: 650px; height: auto;"></a>
</p>

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

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

<p>
	يرتبط عادةً مؤشر LCP مع أول محتوى مرئي FCP -اختصارًا للعبارة First Contentful Paint- الذي يُخبرك بالزمن اللازم لظهور أول عنصر ضمن أي محتوى عند دخول شخص ما لموقعك. يشكل هذين المؤشرين قسمًا مما يُدعى بمؤشرات الويب المهمة التي توفر لك معلومات أكثر عن أداء الموقع بدلًا من زمن التحميل الذي يحققه الموقع. تذكر أن جوجل لا يضع بحسبانه كل شيء عند قياس مؤشر LCP بل يتجاهل عناصر مثل ملفات SVG ومقاطع الفيديو لكن يُحتمل أن تُضمن هذه العناصر في تحديثات المؤشرات المهمة لجوجل.
</p>

<p>
	ملاحظة: ترجمنا المصطلح Largest Contentful Paint إلى "أضخم محتوى مرئي" واستخدمنا تعبير الضخامة لسببين، الاول هو قولهم largest وليس biggest والثاني أن المقصود هنا الحجم الكبير بالمساحة المشغولة ضمن الشاشة والحجم من ناحية الحجم بالكيلوبايت.
</p>

<h2>
	كيفية قياس LCP؟
</h2>

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

<p>
	لقياس مؤشر أضخم محتوى مرئي عليك قياس الزمن الذي يستغرقه تحميل عنصر معين وليس كامل الصفحة، ولحسن الحظ إن استخدمت سابقًا أداةً لقياس زمن تحميل الموقع فغالبًا سوف تتضمن تفاصيل عن مؤشرات أخرى مثل أول محتوى مرئي FCP وأضخم محتوى مرئي LCP. تستطيع استخدام <a href="https://developers.google.com/speed/pagespeed/insights/" rel="external nofollow">PageSpeed Insights</a> مثلًا حيث عليك لصق رابط الموقع والضغط على Analyze site لتبدأ الأداة بإجراء اختبار أداء شامل للموقع وضمن النتائج سوف تجد نتيجة الأداء الكلي إضافةً إلى تفاصيل هذا الأداء ضمن قسم Field data حيث يوجد مؤشر LCP.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98756" href="https://academy.hsoub.com/uploads/monthly_2022_05/002_lcp-score-example-1024x700.png.6f4798ba96f84c1ce51797850aba3cf5.png" rel=""><img alt="002_lcp-score-example-1024x700.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98756" data-unique="49vc6hob8" src="https://academy.hsoub.com/uploads/monthly_2022_05/002_lcp-score-example-1024x700.thumb.png.2e24fde20dc8e46c80c5948000d8adb7.png" style="width: 700px; height: auto;"></a>
</p>

<p>
	تجمع أداة PageSpeed Insights بيانات الأداء من مجموعة مستخدمين وتستعملها لتوفير نتائج مُجمعة مع الوقت، لتوفر معلومات أكثر دقة مما توفره أدوات الاختبار الوحيد لموقعك. سوف يظهر لك أيضًا نسبة مئوية لكل مؤشر، ففي المثال السابق يوجد 89% من عمليات التحميل تحصل في أقل من 1.5 ثانية وهذه نتيجة رائعة لكن نسبة 11% الباقية من عمليات تحميل الصفحة تقع خارج ذلك المجال، وهذا يعني أن LCP لبعض المشتركين يحتاج وقتًا أكبر من 1.5 ثانية.
</p>

<p>
	من المهم أن تدرك أنه حتى لو كان موقعك مُصممًا جيدًا فإن أزمنة التحميل تختلف باختلاف المستخدم، فبعض الزوار يمتلكون سرعة اتصال إنترنت منخفضة أو ربما متواجدين في مكان جغرافي بعيد جدًا عن موقع <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r574/" rel="">الخادم</a>، وهذه الأمور هي جزء من مُسببات عديدة لأزمنة التحميل المرتفعة في بعض الحالات، لذا من المهم وجود قيمة متوسطة تُعتمد كمرجع.
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98757" href="https://academy.hsoub.com/uploads/monthly_2022_05/003_pagespeed-experiment-data.png.632e47fe13ac7368aed4ef55df29a5c1.png" rel=""><img alt="003_pagespeed-experiment-data.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98757" data-unique="omka3aou7" src="https://academy.hsoub.com/uploads/monthly_2022_05/003_pagespeed-experiment-data.thumb.png.c931347f93723a8c931d0700644cd1a1.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	إن القيمة المثالية لمؤشر أضخم محتوى مرئي أقل من 2.5 ثانية (أما بالنسبة لمؤشر FCP يجب أن تكون أقل من 1.8 ثانية) وكلما كان الوقت أقل، كان أفضل بحيث يحقق موقعك زمن تحميل كلي أقل من 3 ثانية لتوفر للزوار أفضل تجربة ممكنة أما عند ارتفاع هذه القيم فوق العتبات السابقة سوف تجد ارتفاعًا في معدل الارتداد في موقعك.
</p>

<p>
	إن أداة PageSpeed Insights من أفضل الأدوات التي يمكن استخدامها لقياس مؤشر أضخم محتوى مرئي وأزمنة تحميل الموقع الكلية لكنك تستطيع الوصول لنفس المعلومات إن كنت أعددت منصة بحث جوجل لموقعك التي توفر لك اقتراحات بهدف <a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-seo-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%84%D9%85%D9%88%D9%82%D8%B9%D9%83-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-r490/" rel="">تحسين محركات البحث</a>.
</p>

<p>
	إن أردت قياس هذه القيمة بعيدًا عن جوجل تستطيع تحقيق ذلك يدويًا باستخدام أدوات المطور ضمن المتصفح حيث تسمح لك هذه الأدوات في معظم المتصفحات إمكانية قياس زمن تحميل الموقع مع مجموعة من التفاصيل مثل زمن تحميل كل عنصر وكل عملية وكل طلب لكن تتطلب هذه العملية الكثير من العمل والأسهل استخدام أدوات طرف ثالث كالتي ذكرتها سابقًا. تستطيع أيضًا استخدام خدمات مثل GTMetrix و Pingdom's Speed Test للاطلاع على معلومات إضافية عن مؤشر LCP وغيره من المؤشرات.
</p>

<h2>
	كيفية تحسين مؤشر أضخم محتوى مرئي LCP
</h2>

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

<p>
	إليك أفضل حلول لتحسين الموقع والتي تساعدك على تحقيق قيمة أفضل لمؤشر LCP من خبرتي الشخصية في هذا المجال:
</p>

<ul>
<li>
		<strong>تعديل حجم وضغط الصور</strong> ففي معظم الحالات تتعلق قيمة LCP بالصور وكقاعدة عامة عليك تعديل قياس وحجم كل صورة ترفعها لموقعك، كما أن ووردبريس يدعم صيغة WebP بدءًا من الإصدار 5.8 وهذا يُساعد الكثير من المواقع على تسجيل قيم LCP أفضل.
	</li>
	<li>
		<strong>اختر استضافة أفضل</strong> فإن عملت جاهدًا على تحسين موقعك ومع ذلك ما زال يحتاج وقتًا طويلًا للتحميل فالسبب غالبًا هو استضافتك، لذا يمكنك استخدام باقة أعلى أو تغيير الشركة المزودة لشركة تتضمن خيارات أفضل من الحالية لديك.
	</li>
	<li>
		<strong>استخدام شبكة تسليم محتوى CDN</strong> كون <a href="https://academy.hsoub.com/devops/cloud-computing/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%AA%D8%B3%D9%84%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-cdn-%D9%84%D8%AA%D8%B3%D8%B1%D9%8A%D8%B9-%D8%AA%D8%B3%D9%84%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D8%A7%D9%84%D8%AB%D8%A7%D8%A8%D8%AA-r393/" rel="">شبكات تسليم المحتوى</a> تعمل على تخزين نسخة مؤقتة عن موقع على خوادمها حول العالم وتوفر هذه الملفات لزوار موقعك كما أن بعض هذه الشبكات توفر خدمة خاصة بتسليم الصور فقط مما يساعد على تحسين قيمة LCP بشكل ملحوظ.
	</li>
	<li>
		<strong>التخلص من الموارد التي تحجب عمليات الإخراج</strong> حيث يُعد المورد حاجبًا لعملية إخراج عندما يوقف العناصر ضمن موقعك عن التحميل حتى انتهاء تنفيذه وتحميله، وعمومًا تكون هذه العناصر أقسام مهمة من موقعك مثل <a href="http://wiki.hsoub.com/HTML" rel="external">HTML</a> و <a href="http://wiki.hsoub.com/CSS" rel="external">CSS</a> و<a href="http://wiki.hsoub.com/JavaScript" rel="external">جافاسكربت</a> لذا عليك التخلص من هذه العناصر أو تأجيل تنفيذها حتى انتهاء تحميل جميع العناصر. تستطيع استخدام إضافة لتحقيق ذلك في ووردبريس مثل WP Rocket.
	</li>
</ul>
<p>
	معظم الطرق التي ذكرت لتحسين الموقع هي توصيات اعتيادية لتحسين أداء الموقع لذا إن خصصت بعض الوقت لتحسين موقعك سوف تتحسن قيمة LCP وسوف يحصل زوارك على <a href="https://academy.hsoub.com/design/user-experience/%d9%85%d8%af%d8%ae%d9%84-%d8%a5%d9%84%d9%89-%d8%aa%d8%ac%d8%b1%d8%a8%d8%a9-%d8%a7%d9%84%d9%85%d8%b3%d8%aa%d8%ae%d8%af%d9%85-user-experience-r149/" rel="">تجربة مستخدم</a> أفضل.
</p>

<h2>
	الأسئلة المتكررة حول أضخم محتوى مرئي LCP
</h2>

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

<h3>
	ما مدى تأثير مؤشر LCP على أداء موقعي؟
</h3>

<p>
	عند قياس الأداء العام للموقع فإن زمن التحميل الكلي لا يقدم فكرة دقيقة عن مدى جودة الصفحات <a href="https://academy.hsoub.com/files/11-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-user-experience-ux/" rel="">وتجربة المستخدم</a> لكن التركيز على مؤشر معين مثل مؤشر أضخم محتوى مرئي LCP يوفر معلومات أعمق عن استجابة خادمك كما يخبرك بالزمن الذي ينتظره المستخدم لرؤية موقعك بالكامل. سوف يحسن التركيز على هذا المؤشر أو مؤشرات أخرى الأداء العام لموقعك كونها جزءًا من نظام أشمل.
</p>

<h3>
	هل زمن تحميل أضخم محتوى مرئي LCP هو نفسه زمن تحميل الصفحة PLT؟
</h3>

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

<h3>
	ما هي مؤشرات الويب المهمة غير LCP؟
</h3>

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

<h2>
	الخلاصة
</h2>

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

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.elegantthemes.com/blog/wordpress/lcp" rel="external nofollow">Largest Contentful Paint (LCP): What It Is &amp; How to Optimize Your Website for It</a> لصاحبه Will Morris.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-r572/" rel="">الفرق بين صفحة الويب وموقع الويب وخادم الويب ومحرك البحث</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D9%85%D8%A4%D8%B4%D8%B1%D8%A7%D8%AA-%D8%A3%D8%AF%D8%A7%D8%A1-%D8%A7%D9%84%D8%B3%D9%8A%D9%88-%D8%A8%D8%A7%D8%B1%D8%A7%D9%85%D8%AA%D8%B1%D8%A7%D8%AA-%D9%82%D9%8A%D8%A7%D8%B3-%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-%D9%84%D9%85%D9%88%D9%82%D8%B9%D9%83-%D9%88%D8%AA%D8%AA%D8%A8%D8%B9-%D8%A3%D8%AF%D8%A7%D8%A6%D9%87-r498/" rel="">مؤشرات أداء السيو: بارامترات قياس تحسين محركات البحث لموقعك وتتبع أدائه</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1561</guid><pubDate>Sun, 15 May 2022 09:55:11 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x634;&#x62E;&#x635;&#x64A;&#x629; &#x644;&#x647;&#x627; &#x639;&#x64A;&#x648;&#x646; &#x630;&#x627;&#x62A; &#x62A;&#x623;&#x62B;&#x64A;&#x631; &#x643;&#x631;&#x62A;&#x648;&#x646;&#x64A; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x633;&#x643;&#x631;&#x627;&#x62A;&#x634;</title><link>https://academy.hsoub.com/programming/general/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B4%D8%AE%D8%B5%D9%8A%D8%A9-%D9%84%D9%87%D8%A7-%D8%B9%D9%8A%D9%88%D9%86-%D8%B0%D8%A7%D8%AA-%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1-%D9%83%D8%B1%D8%AA%D9%88%D9%86%D9%8A-%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-r1552/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/6279687dbc673_--------.png.efd99187d59411b82407ef008a8210c2.png" /></p>

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

<p>
	سنعمل في هذا المشروع على:
</p>

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

<p style="width: 485px;margin: auto;">
	<iframe __idm_id__="598033" allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/495141114/?autostart=false" width="300"></iframe>
</p>

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

<p>
	سنشرح في البداية بعض المفاهيم المهمة، والمتمثلة في الآتي:
</p>

<ul>
<li>
		<strong>التصميم</strong>: هو عملية تقرير الهيئة التي يبدو عليها المشروع والأمور التي يتيح لك تنفيذها.
	</li>
	<li>
		<strong>المستخدم</strong>: هو الشخص الذي يستخدم المشروعذ
	</li>
	<li>
		<strong> تفاعل المستخدم</strong>: فهو الطريقة التي يتجاوب بها المشروع عندما يقوم المستخدم بأمور معينة، مثل تحريك الفأرة والنقر على الشاشة.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98149" href="https://academy.hsoub.com/uploads/monthly_2022_05/showcase-line.png.d0518f1c3dba01594e310fec687f2b12.png" rel=""><img alt="showcase-line.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98149" data-unique="43cagqjee" src="https://academy.hsoub.com/uploads/monthly_2022_05/showcase-line.thumb.png.4fe3f54dd7d68d22289bee5373061790.png" style="width: 600px; height: auto;"></a>
</p>

<h2>
	استلهم أفكارك
</h2>

<p>
	اطلع على المشاريع التالية لتحصل على الإلهام ولتكوّن فكرة حول شكل الشخصية التي ستعمل على إنشائها:
</p>

<ul>
<li>
		<a href="https://scratch.mit.edu/projects/495865093/editor" rel="external nofollow">مشروع الكعكة</a>:
	</li>
</ul>
<p style="width: 485px;margin: auto;">
	<iframe __idm_id__="598035" allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/495865093/?autostart=false" width="485"></iframe>
</p>

<ul>
<li>
		<a href="https://scratch.mit.edu/projects/495866460/editor" rel="external nofollow">مشروع أعماق البحار</a>:
	</li>
</ul>
<p style="width: 485px;margin: auto;">
	<iframe __idm_id__="598034" allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/495866460/?autostart=false" width="485"></iframe>
</p>

<ul>
<li>
		<a href="https://scratch.mit.edu/projects/495865892/editor" rel="external nofollow">شخصية سبورغ</a>:
	</li>
</ul>
<p style="width: 485px;margin: auto;">
	<iframe __idm_id__="598036" allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/495865892/?autostart=false" width="485"></iframe>
</p>

<h2>
	تصميم الشخصية
</h2>

<p>
	حان الآن وقت وضع أفكارك قيد التنفيذ كي ترى شخصيتك النور!
</p>

<h3>
	إضافة كائن من مكتبة الكائنات
</h3>

<ul>
<li>
		أولًا، افتح <a href="https://scratch.mit.edu/projects/582214330/editor" rel="external nofollow">نسخة المتصفح</a> من سكراتش باستخدام الإنترنت. أو يمكنك العمل على نسخة سطح المكتب من برنامج سكراتش بدون استخدام الإنترنت.
	</li>
	<li>
		ثانيًا، اختر كائنًا من قائمة الكائنات أو أنشئ كائنًا خاصًا بك باستخدام الرسام. تذكر أنه ليس عليك اختيار شخص أو حيوان، يمكنك اختيار غرض ما، مثل الكعكة.
	</li>
</ul>
<p>
	انقر على خيار <strong>إضافة كائن</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98115" href="https://academy.hsoub.com/uploads/monthly_2022_05/ChooseSprite.png.17eead1856d0e926a5ec30c894edab6e.png" rel=""><img alt="ChooseSprite.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98115" data-unique="xu7whbi9c" src="https://academy.hsoub.com/uploads/monthly_2022_05/ChooseSprite.png.17eead1856d0e926a5ec30c894edab6e.png" style="width: 250px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98151" href="https://academy.hsoub.com/uploads/monthly_2022_05/SpriteLibrary.png.67da0dee70d98d71eb2e6d02b19d19df.png" rel=""><img alt="SpriteLibrary.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98151" data-unique="wo9rpxsox" src="https://academy.hsoub.com/uploads/monthly_2022_05/SpriteLibrary.thumb.png.4f43295baa16f351681fd8618463487c.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	إذا احترت في اختيار الكائن، انقر على أيقونة <strong>اختيار كائن عشوائي</strong> لتحصل على كائن عشوائي من اختيار البرنامج:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98142" href="https://academy.hsoub.com/uploads/monthly_2022_05/RandomSprite.png.1dcfe3aac2fad242d969a73fbea4124e.png" rel=""><img alt="RandomSprite.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98142" data-unique="a0m5v3e5p" src="https://academy.hsoub.com/uploads/monthly_2022_05/RandomSprite.png.1dcfe3aac2fad242d969a73fbea4124e.png" style="width: 250px; height: auto;"></a>
</p>

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

<h3>
	إنشاء خلفيات وكائنات باستخدام الرسام
</h3>

<p>
	يمكنك إنشاء خلفيات ومظاهر للكائنات في الرسام باستخدام أشكال بسيطة.
</p>

<p>
	انقر على خيار<strong>الرسام</strong> من أيقونة <strong>اختيار خلفية</strong> أو من أيقونة <strong>اختيار كائن</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98141" href="https://academy.hsoub.com/uploads/monthly_2022_05/paint2.png.055c14a7fc8802d63d5f2a3365b0d146.png" rel=""><img alt="paint2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98141" data-unique="553h9pwm0" src="https://academy.hsoub.com/uploads/monthly_2022_05/paint2.png.055c14a7fc8802d63d5f2a3365b0d146.png"></a>
</p>

<p>
	ثم اختر أداةً مما يلي لإنشاء الأشكال التي ترغب بها:
</p>

<ul>
<li>
		<strong>الأداة الدائرية</strong>: اضغط على رمز الأداة لرسم دائرة، اضغط باستمرار على مفتاح Shift لمساعدتك بالرسم.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98116" href="https://academy.hsoub.com/uploads/monthly_2022_05/circle-tool.png.41050c1317a3d45044d55693fbdfd4dd.png" rel=""><img alt="circle-tool.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98116" data-unique="y9luby38h" src="https://academy.hsoub.com/uploads/monthly_2022_05/circle-tool.png.41050c1317a3d45044d55693fbdfd4dd.png"></a>
</p>

<ul>
<li>
		<strong>الأداة المستطيلة</strong>: استخدم هذه الأداة لرسم مستطيل، واضغط باستمرار على مفتاح Shift لرسم مربع.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98143" href="https://academy.hsoub.com/uploads/monthly_2022_05/rectangle-tool.png.e7bf39e876c1695e22a68b24652e8a70.png" rel=""><img alt="rectangle-tool.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98143" data-unique="xenf9cmmc" src="https://academy.hsoub.com/uploads/monthly_2022_05/rectangle-tool.png.e7bf39e876c1695e22a68b24652e8a70.png"></a>
</p>

<ul>
<li>
		<strong>الأداة المثلثة</strong>: يمكنك استخدام هذه الأداة لرسم مستطيلاتٍ أو مربعاتٍ أولًا، ثم الضغط على أداة <strong>تغيير الشكل</strong> لاختيار جزءٍ من الشكل وحذفه باستخدام أداة <strong>الحذف</strong> والحصول على شكل المثلث!
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98152" href="https://academy.hsoub.com/uploads/monthly_2022_05/square.png.7cc70d06bb1c5408a508d94993b13fd0.png" rel=""><img alt="square.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98152" data-unique="ace9byfj5" src="https://academy.hsoub.com/uploads/monthly_2022_05/square.png.7cc70d06bb1c5408a508d94993b13fd0.png" style="width: 100px; height: auto;"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98146" href="https://academy.hsoub.com/uploads/monthly_2022_05/reshape.png.f30f8e0447f7654db1b71c12d0856986.png" rel=""><img alt="reshape.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98146" data-unique="lids6s0vt" src="https://academy.hsoub.com/uploads/monthly_2022_05/reshape.png.f30f8e0447f7654db1b71c12d0856986.png"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98126" href="https://academy.hsoub.com/uploads/monthly_2022_05/delete.png.941115f274573b4f9c8a8ce072f9166b.png" rel=""><img alt="delete.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98126" data-unique="ltg3u93ec" src="https://academy.hsoub.com/uploads/monthly_2022_05/delete.png.941115f274573b4f9c8a8ce072f9166b.png"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98118" href="https://academy.hsoub.com/uploads/monthly_2022_05/corner.png.24283d26c8adc742509001ac657e9627.png" rel=""><img alt="corner.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98118" data-unique="409l09lyj" src="https://academy.hsoub.com/uploads/monthly_2022_05/corner.png.24283d26c8adc742509001ac657e9627.png" style="width: 100px; height: auto;"></a>
</p>

<p>
	استخدم أداة ملء اللون لتغيير لون الشكل:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98134" href="https://academy.hsoub.com/uploads/monthly_2022_05/fill-tool.png.27332dc27540f13896cf56618f44d404.png" rel=""><img alt="fill-tool.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98134" data-unique="o1q74sgou" src="https://academy.hsoub.com/uploads/monthly_2022_05/fill-tool.png.27332dc27540f13896cf56618f44d404.png"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98110" href="https://academy.hsoub.com/uploads/monthly_2022_05/changed-colour.png.fd9ee9c52ff9a201e18cbaa0238cbabb.png" rel=""><img alt="changed-colour.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98110" data-unique="zj03c2as9" src="https://academy.hsoub.com/uploads/monthly_2022_05/changed-colour.png.fd9ee9c52ff9a201e18cbaa0238cbabb.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	قد تحتاج لاستخدام أداتي <strong>طبقة إلى الأمام</strong> و <strong>طبقة إلى الخلف</strong> لتغيير موضع الشكل في الخلفية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98136" href="https://academy.hsoub.com/uploads/monthly_2022_05/ForwardBackward.png.d850a348a718112255ac8d55ff02c2a1.png" rel=""><img alt="ForwardBackward.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98136" data-unique="aut4gn358" src="https://academy.hsoub.com/uploads/monthly_2022_05/ForwardBackward.png.d850a348a718112255ac8d55ff02c2a1.png"></a>
</p>

<p>
	كما يمكنك تحديد عدة أشكال ومعاملتها مثل شكل واحد باستخدام أداة التجميع <strong>Group</strong> وبذلك يسهل عليك تحريك الأشكال وتعديلها:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98144" href="https://academy.hsoub.com/uploads/monthly_2022_05/Regroup.png.5ec82f2730499973815bb28734c83548.png" rel=""><img alt="Regroup.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98144" data-unique="bzdx642qm" src="https://academy.hsoub.com/uploads/monthly_2022_05/Regroup.png.5ec82f2730499973815bb28734c83548.png"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98147" href="https://academy.hsoub.com/uploads/monthly_2022_05/selected-shapes.png.2aa38a6400d3e67e7329c5ca0a352e66.png" rel=""><img alt="selected-shapes.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98147" data-unique="aag9rtmfa" src="https://academy.hsoub.com/uploads/monthly_2022_05/selected-shapes.png.2aa38a6400d3e67e7329c5ca0a352e66.png" style="width: 300px; height: auto;"></a>
</p>

<p>
	إليك مثالًا عن كائنٍ أنشأناه باستخدام الأداة الدائرية والمستطيلة، كما يمكنك الانتقال إلى <a href="https://scratch.mit.edu/projects/495903163/editor" rel="external nofollow">محرر سكراتش للتعديل عليه</a>:
</p>

<p style="width: 485px;margin: auto;">
	<iframe allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/495903163/?autostart=false" width="485"></iframe>
</p>

<p>
	لا تنسى تسمية الأشكال والخلفيات التي أنشأتها في الرسام بأسماء مناسبة.
</p>

<p>
	في الخطوة الموالية، عدل حجم الكائن ليملأ حيزًا أكبر من الشاشة، وذلك عبر تغيير الحجم في نافذة الكائن:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98150" href="https://academy.hsoub.com/uploads/monthly_2022_05/Size.PNG.81d6fad7f5a7ea7793a187feb1ab1508.PNG" rel=""><img alt="Size.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98150" data-unique="bmscftgks" src="https://academy.hsoub.com/uploads/monthly_2022_05/Size.PNG.81d6fad7f5a7ea7793a187feb1ab1508.PNG" style="width: 400px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98114" href="https://academy.hsoub.com/uploads/monthly_2022_05/ChooseBackdrop.png.79a437e9fb790a934ae5cb575fea7c95.png" rel=""><img alt="ChooseBackdrop.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98114" data-unique="no7c5ii2s" src="https://academy.hsoub.com/uploads/monthly_2022_05/ChooseBackdrop.png.79a437e9fb790a934ae5cb575fea7c95.png" style="width: 250px; height: auto;"></a>
</p>

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

<h2>
	إضافة عيون ذات تأثير كرتوني
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98112" href="https://academy.hsoub.com/uploads/monthly_2022_05/character-with-eyes.png.c13ae24a685429fd2998ba724041c003.png" rel=""><img alt="character-with-eyes.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98112" data-unique="9351dnxro" src="https://academy.hsoub.com/uploads/monthly_2022_05/character-with-eyes.png.c13ae24a685429fd2998ba724041c003.png"></a>
</p>

<ul>
<li>
		انقر على خيار <strong>الرسام</strong> لإضافة كائن العين.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98140" href="https://academy.hsoub.com/uploads/monthly_2022_05/Paint.png.f2c8c7136ac3d7b01c482544e0197566.png" rel=""><img alt="Paint.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98140" data-unique="u84nkr7b1" src="https://academy.hsoub.com/uploads/monthly_2022_05/Paint.png.f2c8c7136ac3d7b01c482544e0197566.png" style="width: 250px; height: auto;"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98096" href="https://academy.hsoub.com/uploads/monthly_2022_05/BackdropLibrary.PNG.defb9fe3985b4a88b9fb58ca347ab0a9.PNG" rel=""><img alt="BackdropLibrary.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98096" data-unique="jndxcff64" src="https://academy.hsoub.com/uploads/monthly_2022_05/BackdropLibrary.thumb.PNG.16786365b5e3979130a07e58d40733e7.PNG" style="width: 650px; height: auto;"></a>
</p>

<ul>
<li>
		استخدم <strong>أداة الدائرة</strong> وانقر باستمرار على مفتاح Shift للحصول على دائرة متناسقة الأبعاد. اخترنا في مثالنا اللون الأسود لإطار العين:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98117" href="https://academy.hsoub.com/uploads/monthly_2022_05/Circle.PNG.72a7d06f794ea0869b3c9aad57027bf1.PNG" rel=""><img alt="Circle.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98117" data-unique="agvyrjpke" src="https://academy.hsoub.com/uploads/monthly_2022_05/Circle.PNG.72a7d06f794ea0869b3c9aad57027bf1.PNG" style="width: 500px; height: auto;"></a>
</p>

<ul>
<li>
		استخدم أداة <strong>انتقاء الألوان</strong> لاختيار ألوان الملء والإطار. اسحب شريط <strong>السطوع</strong> و<strong>تشبع اللون</strong> إلى القيمة 0 للحصول على اللون الأسود، واسحب شريط <strong>السطوع</strong> إلى القيمة 100 وشريط <strong>تشبع اللون</strong> إلى القيمة 0 للحصول على اللون الأبيض.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98097" href="https://academy.hsoub.com/uploads/monthly_2022_05/Black.PNG.16d36f379defb51bb16e41da78e8e790.PNG" rel=""><img alt="Black.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98097" data-unique="0mfgk2lz2" src="https://academy.hsoub.com/uploads/monthly_2022_05/Black.PNG.16d36f379defb51bb16e41da78e8e790.PNG" style="width: 250px; height: auto;"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98155" href="https://academy.hsoub.com/uploads/monthly_2022_05/White.PNG.047ca60e575875375b426dbfc780a299.PNG" rel=""><img alt="White.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98155" data-unique="pkejrlnb5" src="https://academy.hsoub.com/uploads/monthly_2022_05/White.PNG.047ca60e575875375b426dbfc780a299.PNG" style="width: 250px; height: auto;"></a>
</p>

<ul>
<li>
		احرص على أن تكون مقلة العين (بؤبؤ العين الأسود والقزحية الملونة) متمركزة في المنتصف، حركها بحيث يصطف المؤشر الأزرق مع المؤشر الرمادي في محرر الرسام. ثم ارسم دائرة أخرى أصغر حجمًا وضعها في يمين كرة العين:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98133" href="https://academy.hsoub.com/uploads/monthly_2022_05/EyeballCircles.PNG.b47b3bc7d470241991dffd1bfbbb64d5.PNG" rel=""><img alt="EyeballCircles.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98133" data-unique="4yhh20pxv" src="https://academy.hsoub.com/uploads/monthly_2022_05/EyeballCircles.thumb.PNG.96fbd9d10c6d37d2781580389e1c2e0f.PNG" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		ارسم عدة دوائر واستخدم ألوانًا مختلفةً للحصول على عين أكثر حيوية!
	</li>
</ul>
<h3>
	تعديل إحدى مظاهر الكائن واستخدامها كعين
</h3>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98119" href="https://academy.hsoub.com/uploads/monthly_2022_05/costume-eyes.gif.0066d26be5a21b87da1b01821c926760.gif" rel=""><img alt="costume-eyes.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="98119" data-unique="1k9xxlfh1" src="https://academy.hsoub.com/uploads/monthly_2022_05/costume-eyes.gif.0066d26be5a21b87da1b01821c926760.gif" style="width: 450px; height: auto;"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98138" href="https://academy.hsoub.com/uploads/monthly_2022_05/GreenEyeball.PNG.9f582b40112d3b5f6b1c6fb37134eae7.PNG" rel=""><img alt="GreenEyeball.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98138" data-unique="jvr1pwtr0" src="https://academy.hsoub.com/uploads/monthly_2022_05/GreenEyeball.PNG.9f582b40112d3b5f6b1c6fb37134eae7.PNG" style="width: 450px; height: auto;"></a>
</p>

<p>
	بعد ذلك سمّ كائن العين الجديد باسم مناسب:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98139" href="https://academy.hsoub.com/uploads/monthly_2022_05/NewEyeballSprite.PNG.e4bd6848abccdc4c087d6ce3091fa31f.PNG" rel=""><img alt="NewEyeballSprite.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98139" data-unique="h0t4fhjy5" src="https://academy.hsoub.com/uploads/monthly_2022_05/NewEyeballSprite.PNG.e4bd6848abccdc4c087d6ce3091fa31f.PNG" style="width: 450px; height: auto;"></a>
</p>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98098" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block1.PNG.8af17b78a0465dda40a4b76d4e398224.PNG" rel=""><img alt="Block1.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98098" data-unique="kyfy0f0g3" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block1.PNG.8af17b78a0465dda40a4b76d4e398224.PNG" style="width: 450px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98128" href="https://academy.hsoub.com/uploads/monthly_2022_05/Duplicate.png.babb7774559edc6678c7a1962b650ffc.png" rel=""><img alt="Duplicate.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98128" data-unique="nl9qycpng" src="https://academy.hsoub.com/uploads/monthly_2022_05/Duplicate.png.babb7774559edc6678c7a1962b650ffc.png" style="width: 350px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98132" href="https://academy.hsoub.com/uploads/monthly_2022_05/Eyeball2.PNG.944a14e10f3eb41140fbb7b7b14a891d.PNG" rel=""><img alt="Eyeball2.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98132" data-unique="ua23396oy" src="https://academy.hsoub.com/uploads/monthly_2022_05/Eyeball2.PNG.944a14e10f3eb41140fbb7b7b14a891d.PNG" style="width: 350px; height: auto;"></a>
</p>

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

<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>.
</p>

<h3>
	تصحيح الأخطاء
</h3>

<p>
	قد تجد بعض الأخطاء في مشروعك والتي تحتاج إلى إصلاح. فيما يلي بعض الأخطاء الشائعة:
</p>

<ul>
<li>
		<strong>لا تتحرك العينان</strong>: احرص على إضافة الكتل البرمجية لكائن العين والنقر على العلم الأخضر، إذ أن العينين لن تتحركا إلى أن تُشغل البرنامج بالنقر على العلم الأخضر.
	</li>
	<li>
		<strong>تتحرك العينان بعيدًا عن مؤشر الفأرة</strong>: انقر على كائن العين، ثم اذهب إلى نافذة المظاهر وتأكد من أن البؤبؤ في الجهة اليمنى من كرة العين (بعيدًا عن المؤشر الأزرق في المنتصف). تأكد من وجود كتلة "اجعل نمط الدوران في جميع الاتجاهات"، وكتلة "اتجه نحو مؤشر الفأرة".
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98131" href="https://academy.hsoub.com/uploads/monthly_2022_05/eye-right.gif.a1db94f49aa20ed4535fd64f1ff6edce.gif" rel=""><img alt="eye-right.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="98131" data-unique="8wzrgiwmk" src="https://academy.hsoub.com/uploads/monthly_2022_05/eye-right.gif.a1db94f49aa20ed4535fd64f1ff6edce.gif"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98154" href="https://academy.hsoub.com/uploads/monthly_2022_05/tempsnip.png.f66a948afb380d5bd09134f8a65a917b.png" rel=""><img alt="tempsnip.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98154" data-unique="k69utu3tf" src="https://academy.hsoub.com/uploads/monthly_2022_05/tempsnip.png.f66a948afb380d5bd09134f8a65a917b.png" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		<strong>تتحرك العينان عشوائيًا</strong>: احرص على أن تكون مقلة العين متمركزة في المنتصف وباتجاه اليمين لتتحرك بسلاسة وتتبع حركة مؤشر الفأرة، حرك المظهر بحيث يصطف المؤشر الأزرق مع المؤشر الرمادي في محرر الرسام.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98130" href="https://academy.hsoub.com/uploads/monthly_2022_05/eye-centered.gif.468e9b2b6c7ae30b16527943abc0a0c4.gif" rel=""><img alt="eye-centered.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="98130" data-unique="gaf4yjmre" src="https://academy.hsoub.com/uploads/monthly_2022_05/eye-centered.gif.468e9b2b6c7ae30b16527943abc0a0c4.gif" style="width: 450px; height: auto;"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98154" href="https://academy.hsoub.com/uploads/monthly_2022_05/tempsnip.png.f66a948afb380d5bd09134f8a65a917b.png" rel=""><img alt="tempsnip.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98154" data-unique="k69utu3tf" src="https://academy.hsoub.com/uploads/monthly_2022_05/tempsnip.png.f66a948afb380d5bd09134f8a65a917b.png" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		<strong>تحجب الشخصية العينين</strong>: عندما تسحب الكائن إلى موضع ما على المنصة، فإنه يتوضع أمام الكائنات الأخرى، لذلك استعمل الكتلة التالية لتبقى الشخصية في الخلف:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98101" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block18.png.3def49083ef0187d6afaeb1e4d093118.png" rel=""><img alt="Block18.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98101" data-unique="9fy13ksqh" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block18.png.3def49083ef0187d6afaeb1e4d093118.png" style="width: 350px; height: auto;"></a>
</p>

<ul>
<li>
		<strong>تتبع الشخصية والعينان حركة مؤشر الفأرة</strong>: تحقق هل أضفت العينين كمظاهر للشخصية، بدلًا عن إضافتها ككائنات منفصلة؟ يمكنك إصلاح ذلك عن طريق نسخ الشخصية وتسمية النسخة "مقلة العين"، ثم حذف مظهر العين من الشخصية، وحذف مظاهر الشخصية من كائن مقلة العين. بعدها، انسخ كائن مقلة العين وسميه "مقلة العين 2". أضف كتلة "اتجه نحو مؤشر الفأرة" لكائن العين وليس للشخصية.
	</li>
	<li>
		<strong>تتبع الشخصية فقط حركة مؤشر الفأرة</strong>: يجب عليك في هذه الحالة إضافة كتلة "اتجه نحو مؤشر الفأرة" لكائن العينين بشكل منفصل وليس للشخصية. انسخ الكتل البرمجية عن طريق سحبها إلى كائن العين، ثم احذفها من كائن الشخصية عبر سحبها إلى نافذة الكتل البرمجية أو بالنقر على مفتاح Delete من لوحة المفاتيح.
	</li>
</ul>
<p>
	قد تواجهك مشاكل أخرى، حاول إصلاحها باستخدام ما تعلمته إلى الآن، وإذا استعصى عليك الحل فلا تتردد في إضافة سؤالك في قسم الأسئلة والأجوبة في <a href="https://academy.hsoub.com/questions/" rel="">أكاديمية حسوب</a> للحصول على الدعم والمساعدة.
</p>

<h2>
	إضافة تأثيرات للكائنات
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98111" href="https://academy.hsoub.com/uploads/monthly_2022_05/character-graphic-effects.png.98a95cbbd0722d4635b086955f186c08.png" rel=""><img alt="character-graphic-effects.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98111" data-unique="b2qvdsn71" src="https://academy.hsoub.com/uploads/monthly_2022_05/character-graphic-effects.png.98a95cbbd0722d4635b086955f186c08.png"></a>
</p>

<h3>
	إضافة تأثيرات على العينين
</h3>

<p>
	أولًا، أضف كتلة "عند النقر على الكائن" ثم أضف بعدها كتلة "غير مؤثر اللون" ليتغير لون العينين عند النقر عليهما.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98102" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block19.png.6fc27a6ee606620778bc36e85e22ce79.png" rel=""><img alt="Block19.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98102" data-unique="h6bh64tyz" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block19.png.6fc27a6ee606620778bc36e85e22ce79.png" style="width: 400px; height: auto;"></a>
</p>

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

<h3>
	إضافة تأثيرات على الشخصية
</h3>

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

<h3>
	استخدام مؤثرات بصرية
</h3>

<p>
	يمكن <a href="https://scratch.mit.edu/projects/435730522/editor" rel="external nofollow">تطبيق عدة مؤثرات بصرية</a> على الكائنات في سكراتش، كما في المثال التالي:
</p>

<p style="width: 485px;margin: auto;">
	<iframe allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/435730522/?autostart=false" width="485"></iframe>
</p>

<p>
	إذ تحتوي كل من الكتلتين <strong>اجعل مؤثر اللون</strong> و <strong>غيّر مؤثر اللون</strong> على نافذة منزلقة يمكن اختيار عدة تأثيرات منها لتغيير مظهر الكائنات وهي:
</p>

<ul>
<li>
		<strong>اللون</strong>: يمكن اختيار القيم من القيمة 0 إلى القيمة 199 (تُدَور الارقام الكبيرة، فيعد الرقم 200 كالرقم 0).
	</li>
	<li>
		<strong>عين السمكة</strong>: لا تعطي القيمة 0 أي تأثير، وكلما كبرت القيمة ازداد تأثير "عين السمكة" fisheye، أما القيم السالبة فتعطي تأثيرًا عكسيًا.
	</li>
	<li>
		<strong>الدوامة</strong>: لا تعطي القيمة 0 أي تأثير، وتعطي القيم الكبيرة الموجبة تأثيرًا أفعوانيًا نحو اليسار، أما القيم السالبة الكبيرة فتعطي تأثيرًا أفعوانيًا نحو اليمين.
	</li>
	<li>
		<strong>البكسلة</strong>: لا تعطي القيمة 0 أي تأثير، بينما تزيد القيم الكبيرة عدد البكسلات في الكائن.
	</li>
	<li>
		<strong>الموزاييك</strong>: لا تعطي القيمة 0 أي تأثير، بينما تغير القيم الكبيرة الموجبة والسالبة عدد النسخ.
	</li>
	<li>
		<strong>شدة الإضاءة</strong>: لا تعطي القيمة 0 أي تأثير، بينما تزيد القيم من 1 إلى 100 من سطوع الكائن، وتجعل القيم السالبة من القيمة 1- حتى القيمة 100- الكائن أكثر عتمةً.
	</li>
	<li>
		<strong>الشبح</strong>: لا تعطي القيمة 0 أي تأثير، بينما تزيد القيم من 1 إلى 100 من شفافية الكائن.
	</li>
</ul>
<p>
	أسند قيمًا مختلفة للتأثيرات واكتشف كيف سيتغير مظهر الكائن باختلاف القيم.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98148" href="https://academy.hsoub.com/uploads/monthly_2022_05/SetColorBlock.png.075298e7a96f769e2f7303e023e30910.png" rel=""><img alt="SetColorBlock.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98148" data-unique="4qp53ouik" src="https://academy.hsoub.com/uploads/monthly_2022_05/SetColorBlock.png.075298e7a96f769e2f7303e023e30910.png" style="width: 400px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98145" href="https://academy.hsoub.com/uploads/monthly_2022_05/RepeatColor.png.d413724e371aa922fcbe58c67a40747c.png" rel=""><img alt="RepeatColor.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98145" data-unique="jt5phgmeh" src="https://academy.hsoub.com/uploads/monthly_2022_05/RepeatColor.png.d413724e371aa922fcbe58c67a40747c.png" style="width: 400px; height: auto;"></a>
</p>

<p>
	يمكنك إما استخدام كتلة أزل التأثيرات الرسومية أو الضغط على زر العلم لمسح التأثيرات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98103" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block20.png.00d9c70281b9372db89b5625f3ac08ff.png" rel=""><img alt="Block20.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98103" data-unique="tervme2pz" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block20.png.00d9c70281b9372db89b5625f3ac08ff.png" style="width: 400px; height: auto;"></a>
</p>

<p>
	أما إذا أردت تطبيق تأثير معين على الكائن أثناء تشغيل المشروع، فضع كتلة تغيير المؤثر الرسومي تحت كتلة عند النقر على العلم الأخضر:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98104" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block21.PNG.00a4071806fea4838982fa7f9f802638.PNG" rel=""><img alt="Block21.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98104" data-unique="6e6bk4s0u" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block21.PNG.00a4071806fea4838982fa7f9f802638.PNG" style="width: 400px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98093" href="https://academy.hsoub.com/uploads/monthly_2022_05/accessory-sprite.png.219934399d150493c2eae7f6ed1099f9.png" rel=""><img alt="accessory-sprite.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98093" data-unique="mgayxm7bc" src="https://academy.hsoub.com/uploads/monthly_2022_05/accessory-sprite.thumb.png.5ce67b5e8c65af0cc0a5523c3912decf.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	كما في <a href="https://scratch.mit.edu/projects/496334057/editor" rel="external nofollow">المشروع التالي</a>:
</p>

<p style="width: 485px;margin: auto;">
	<iframe allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/496334057/?autostart=false" width="485"></iframe>
</p>

<p>
	أولًا، اختر ملحقًا أو مظهرًا آخر للشخصية. لاحظ أن بعض الكائنات لديها عدة مظاهر.
</p>

<p>
	ثانيًا، أضف الكتلة التالية للانتقال إلى المظهر التالي عند النقر على الشخصية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98105" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block22.PNG.da07eb93c91abad40429650698a1b03c.PNG" rel=""><img alt="Block22.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98105" data-unique="59cyk93qj" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block22.PNG.da07eb93c91abad40429650698a1b03c.PNG" style="width: 350px; height: auto;"></a>
</p>

<p>
	إذا لم يكن للكائن الذي اخترته مظاهر، أو إذا أردت إضافة المزيد من المظاهر، فيمكنك إضافتها كما يلي.
</p>

<h3>
	إضافة مظهر جديد للكائن
</h3>

<p>
	انقر على نافذة المظاهر ثم انقر على أيقونة اختيار مظهر لإضافة المظهر الذي تحب من المكتبة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98113" href="https://academy.hsoub.com/uploads/monthly_2022_05/ChooseACostume.png.70cba2367ff1fc98f1250283d6d8de1b.png" rel=""><img alt="ChooseACostume.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98113" data-unique="q0257h2n7" src="https://academy.hsoub.com/uploads/monthly_2022_05/ChooseACostume.png.70cba2367ff1fc98f1250283d6d8de1b.png" style="width: 250px; height: auto;"></a>
</p>

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

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

<h3>
	تصحيح الأخطاء
</h3>

<ul>
<li>
		<strong>نسخ الكتل من كائن إلى آخر</strong>: إذا أضفت الكتل إلى كائن بالخطأ، فيمكنك نسخ الكتل البرمجية من كائن إلى آخر عبر سحب الكتل البرمجية للكائن الأول وإفلاتها فوق أيقونة الكائن الآخر في نافذة الكائنات. أما إذا أردت نقل الكتل من كائن إلى آخر، فعليك حذفها من الكائن الأول بعد نسخها.
	</li>
	<li>
		<strong>مسح التأثيرات الرسومية</strong>: امسح التأثيرات باستخدام كتلة إزالة المؤثرات الرسومية للبدء من جديد، أو انقر على العلم الأخضر:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98106" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block23.PNG.289bb1b45b2d28a32314cc4449f6527e.PNG" rel=""><img alt="Block23.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98106" data-unique="xelj1u6zt" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block23.PNG.289bb1b45b2d28a32314cc4449f6527e.PNG" style="width: 450px; height: auto;"></a>
</p>

<h2>
	إضافة تأثيرات على المنصة
</h2>

<p>
	يمكنك إضافة بعض التأثيرات عند النقر على المنصة، كتغيير الخلفية أو إضافة تأثيرات لونية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98153" href="https://academy.hsoub.com/uploads/monthly_2022_05/stage-effects.png.891f82190ba406919e2e2408bc3ea495.png" rel=""><img alt="stage-effects.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98153" data-unique="uagpgdqle" src="https://academy.hsoub.com/uploads/monthly_2022_05/stage-effects.png.891f82190ba406919e2e2408bc3ea495.png"></a>
</p>

<p>
	أولًا، انقر على نافذة المنصة، ثم على نافذة المقاطع البرمجية. اختر ما الذي تريد فعله مما يلي:
</p>

<p>
	يمكنك تغيير المؤثرات اللونية بإضافة الكتلة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98099" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block16.png.fa9ec97d0288dc9d4dbf92793a9376ce.png" rel=""><img alt="Block16.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98099" data-unique="a718vi889" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block16.png.fa9ec97d0288dc9d4dbf92793a9376ce.png" style="width: 350px; height: auto;"></a>
</p>

<p>
	يمكنك تغيير الخلفية بإضافة الكتلة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98100" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block17.png.e15946fbf648b68f6307e624d1040e53.png" rel=""><img alt="Block17.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98100" data-unique="zuse0d1f7" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block17.png.e15946fbf648b68f6307e624d1040e53.png" style="width: 350px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98137" href="https://academy.hsoub.com/uploads/monthly_2022_05/FullScreen.png.8c10575c04e4c304d6773a3be6318a92.png" rel=""><img alt="FullScreen.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98137" data-unique="ogiho8hli" src="https://academy.hsoub.com/uploads/monthly_2022_05/FullScreen.png.8c10575c04e4c304d6773a3be6318a92.png" style="width: 400px; height: auto;"></a>
</p>

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

<h2>
	ترقية المشروع
</h2>

<p>
	إليك بعض التحسينات التي يمكنك إضافتها على مشروعك لترقيته:
</p>

<ul>
<li>
		إجراء تعديلات على جسم الكائن، مثل إضافة أطراف إضافية.
	</li>
	<li>
		إضافة كائنات أخرى لها عيون ذات طابع كرتوني
	</li>
	<li>
		إضافة خلفيات أخرى.
	</li>
	<li>
		إضافة ملحقات للكائنات، أو إضافة مظاهر أخرى للملحقات.
	</li>
	<li>
		تطبيق تأثيرات رسومية مختلفة.
	</li>
</ul>
<p>
	إليك <a href="https://scratch.mit.edu/projects/495865892/editor" rel="external nofollow">المشروع التالي</a> الذي أُضيف فيه أذرع للكائن تتحرك بحركة مؤشر الفأرة:
</p>

<p style="width: 485px;margin: auto;">
	<iframe allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/495865892/?autostart=false" width="485"></iframe>
</p>

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

<p>
	كما يمكنك زيارة <a href="https://scratch.mit.edu/studios/29029028" rel="external nofollow">معرض مشاريع</a> شخصيات العيون ذات الطابع الكرتوني للإطلاع عليها ومشاهدة الكتل البرمجية الخاصة بكل مشروع في محرر سكراتش لمعرفة كيف نُفِذت.
</p>

<h3>
	تحديد مركز دوران الكائن
</h3>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98121" href="https://academy.hsoub.com/uploads/monthly_2022_05/crosshair.png.61ff1ed0432f0ceb73eb5e57349fbd40.png" rel=""><img alt="crosshair.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98121" data-unique="9bcz34aac" src="https://academy.hsoub.com/uploads/monthly_2022_05/crosshair.png.61ff1ed0432f0ceb73eb5e57349fbd40.png"></a>
</p>

<p>
	إذا لم يكن المؤشر الرمادي في مركز الكائن، استخدم أداة التحديد لتحديد العنصر ولاحظ ظهور مؤشر أزرق:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98109" href="https://academy.hsoub.com/uploads/monthly_2022_05/CatHead.png.8bf4a7b737b9b6ebc10024368a13b08c.png" rel=""><img alt="CatHead.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98109" data-unique="6du8aam8o" src="https://academy.hsoub.com/uploads/monthly_2022_05/CatHead.png.8bf4a7b737b9b6ebc10024368a13b08c.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	اسحب الكائن بحيث يتطابق مؤشر الكائن الأزرق مع المؤشر الرمادي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98125" href="https://academy.hsoub.com/uploads/monthly_2022_05/Crosshairpointer.png.e04eabc4b40fb0c2a2f256935bfb8ee3.png" rel=""><img alt="Crosshairpointer.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98125" data-unique="k7u5y5uyc" src="https://academy.hsoub.com/uploads/monthly_2022_05/Crosshairpointer.png.e04eabc4b40fb0c2a2f256935bfb8ee3.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	إذا لم يكن مركز الدوران هو منتصف الكائن، ضع مركز الدوران على المؤشر الرمادي في محرر الرسام:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98123" href="https://academy.hsoub.com/uploads/monthly_2022_05/CrosshairNotCentered.png.7152f790a0e013e25efd331805774163.png" rel=""><img alt="CrosshairNotCentered.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98123" data-unique="0aiek4qyz" src="https://academy.hsoub.com/uploads/monthly_2022_05/CrosshairNotCentered.png.7152f790a0e013e25efd331805774163.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	ألق نظرةً على معرض أعمال <a href="https://scratch.mit.edu/studios/29120534" rel="external nofollow">شخصيات العيون ذات الطابع الكرتوني</a> لمشاهدة المشاريع التي أنشأها أعضاء مجتمع سكراتش. ولا تنسى أن تحفظ مشروعك!
</p>

<h2>
	ختامًا
</h2>

<p>
	بهذا تكون قد أتممت مشروع إنشاء شخصية لها عيون ذات تأثير كرتوني باستخدام برنامج سكراتش. إذا واجهت مشاكل مع برنامج سكراتش فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في <a href="https://academy.hsoub.com/questions/" rel="">أكاديمية حسوب</a>
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://projects.raspberrypi.org/en/projects/silly-eyes/0" rel="external nofollow">Silly Eyes</a> من <a href="https://raspberrypi.org/" rel="external nofollow">الموقع الرسمي لراسبيري باي</a>.
</p>

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

<ul>
<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/general/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-%D8%B9%D9%86-%D8%A7%D9%84%D8%AD%D8%B4%D8%B1%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-r1551/" rel="">إنشاء لعبة البحث عن الحشرات باستخدام برنامج سكراتش</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%A3%D8%B6%D9%88%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%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-r1482/" rel="">إنشاء لعبة أضواء باستخدام برنامج سكراتش وحاسوب راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%84%D8%B9%D8%A8%D8%A9-%D8%A7%D9%84%D8%B3%D9%84%D9%83-%D9%88%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%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-r1495/" rel="">تصميم لعبة السلك والحلقة باستخدام برنامج سكراتش وحاسوب راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B5%D8%A8%D8%A7%D8%AD-%D9%84%D9%8A%D8%AF-%D8%AB%D9%84%D8%A7%D8%AB%D9%8A-%D8%A7%D9%84%D8%A3%D8%A8%D8%B9%D8%A7%D8%AF-%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%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-r1504/" rel="">تنفيذ مصباح ليد ثلاثي الأبعاد باستخدام سكراتش ولوحة راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%B5%D9%86%D8%B9-%D8%A2%D9%84%D8%A9-%D9%85%D9%88%D8%B3%D9%8A%D9%82%D9%8A%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-%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-r1505/" rel="">صنع آلة موسيقية باستخدام سكراتش وحاسوب راسبيري باي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1552</guid><pubDate>Thu, 19 May 2022 15:05:00 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x64A; &#x644;&#x63A;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x627;&#x644;&#x645;&#x646;&#x627;&#x633;&#x628;&#x629; &#x644;&#x62A;&#x639;&#x644;&#x645;&#x647;&#x627;</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D8%B3%D8%A8%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85%D9%87%D8%A7-r1583/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/6291b12413b64_.png.700e5d1928380bb401879c5800fc963a.png" /></p>

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

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

<p style="text-align: center;">
	<iframe __idm_id__="57345" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="480" title="YouTube video player" width="853" src="https://www.youtube.com/embed/85iUhn4fLSA"></iframe>
</p>

<p>
	بعد اطلاعك على الفيديو وتعرفك على اللغة التي ستساعدك على تحقيق أهدافك المرجوة من رحلة تعلم البرمجة، يمكنك الاطلاع على <a href="https://academy.hsoub.com/?utm_source=youtube.com&amp;utm_medium=referral&amp;utm_campaign=academy-22marXX" rel="">الدورات التعليمية التي تقدمها أكاديمية حسوب</a>، واختيار المجال الذي وجدته أنسب لك. 
</p>

<p>
	كذلك يمكنك تدعيم رحلة تعلمك من خلال التوثيقات المجانية للغات البرمجية التي تقدمها <a href="https://wiki.hsoub.com/?utm_source=academy.hsoub.com&amp;utm_medium=Links&amp;utm_campaign=HsoubFooter" rel="external">موسوعة حسوب</a>، إلى جانب <a href="https://academy.hsoub.com/programming/" rel="">المقالات</a> المتنوعة وأبرز <a href="https://academy.hsoub.com/files/c5-programming/" rel="">الكتب</a> المهمة في هذا المجال لتسهيل عملية التعلم.
</p>
]]></description><guid isPermaLink="false">1583</guid><pubDate>Thu, 19 May 2022 15:00:00 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x644;&#x639;&#x628;&#x629; &#x627;&#x644;&#x628;&#x62D;&#x62B; &#x639;&#x646; &#x627;&#x644;&#x62D;&#x634;&#x631;&#x627;&#x62A; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x628;&#x631;&#x646;&#x627;&#x645;&#x62C; &#x633;&#x643;&#x631;&#x627;&#x62A;&#x634;</title><link>https://academy.hsoub.com/programming/general/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-%D8%B9%D9%86-%D8%A7%D9%84%D8%AD%D8%B4%D8%B1%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-r1551/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/6279590b3f163_-------.png.c5bdb61097ef50389ac27e5fbc7e1488.png" /></p>

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

<p>
	سنعمل في هذا المشروع على:
</p>

<ul>
<li>
		إنشاء مراحل مختلفة باستخدام كتلة "<strong>المظهر التالي"</strong> وكتلة <strong>"عندما تتبدل الخلفية إلى"</strong>.
	</li>
	<li>
		تشغيل الكتل البرمجية باستمرار باستخدام كتلة <strong>"كرر باستمرار"</strong>.
	</li>
	<li>
		استخدام مؤقت لإظهار مدى سرعة اللاعب في العثور على الحشرات
	</li>
</ul>
<p>
	وسنحصل على النتيجة التالية: اضغط على الحشرة لتبدأ اللعب وحاول إيجاد الحشرات بأسرع ما يمكن.
</p>

<p style="width: 485px;margin: auto;">
	<iframe __idm_id__="425988" allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/486719939/?autostart=false" width="485"></iframe>
</p>

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

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

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>معلومة</strong>: يلعب أكثر من 2.5 مليار شخص ألعاب الفيديو سنويًا. هل تساءلت يومًا ما عدد الأشخاص المشاركين في إنشاء هذه الألعاب؟ وهل سألت نفسك عما إذا كنت ترغب في تصميم الألعاب للآخرين؟ أم إنشاءها أم اختبارها؟
		</p>
	</div>
</blockquote>

<h2>
	شاشة البداية
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98084" href="https://academy.hsoub.com/uploads/monthly_2022_05/start-screen.png.c888b863925798fc0b9a25ece00588c2.png" rel=""><img alt="start-screen.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98084" data-unique="qfy63yykv" src="https://academy.hsoub.com/uploads/monthly_2022_05/start-screen.png.c888b863925798fc0b9a25ece00588c2.png" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		أولًا، افتح نسخة سطح المكتب من برنامج سكراتش، أو <a href="https://scratch.mit.edu/projects/582214723/editor" rel="external nofollow">نسخة المتصفح</a>
	</li>
	<li>
		ثانيًا، اضغط على رمز اختيار خلفية الموجود أسفل الزاوية اليسرى، ثم اختر خلفية السبورة Chalkboard من تصنيف <strong>داخلي</strong>.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98042" href="https://academy.hsoub.com/uploads/monthly_2022_05/backdrop-button.png.74488eb9cdabe16015c2f1d971d4f356.png" rel=""><img alt="backdrop-button.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98042" data-unique="dthroythg" src="https://academy.hsoub.com/uploads/monthly_2022_05/backdrop-button.png.74488eb9cdabe16015c2f1d971d4f356.png" style="width: 59px; height: auto;"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98069" href="https://academy.hsoub.com/uploads/monthly_2022_05/IndoorsBackdrops.PNG.44fca3033ff0ac5c6122f5028c8c6d9c.PNG" rel=""><img alt="IndoorsBackdrops.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98069" data-unique="0yerrgvxd" src="https://academy.hsoub.com/uploads/monthly_2022_05/IndoorsBackdrops.thumb.PNG.7bc3c38b459f0002d6b96bb4f68cebc8.PNG" style="width: 600px; height: auto;"></a>
</p>

<ul>
<li>
		ثالثًا، اضغط على نافذة <strong>المنصة</strong>. لاحظ أن للمنصة نافذة تعرض فيها <strong>الخلفيات</strong> بدلًا عن نافذة <strong>المظاهر</strong>.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98082" href="https://academy.hsoub.com/uploads/monthly_2022_05/Stage.PNG.8772782ee9599caa7318f65573b22e0b.PNG" rel=""><img alt="Stage.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98082" data-unique="kz47oz5de" src="https://academy.hsoub.com/uploads/monthly_2022_05/Stage.PNG.8772782ee9599caa7318f65573b22e0b.PNG" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		رابعًا، اضغط على نافذة <strong>الخلفيات</strong> لفتح محرر الرسوم.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98083" href="https://academy.hsoub.com/uploads/monthly_2022_05/StagePaintEditor.png.1b5e7c814abfb6dcab179bd43fd3294d.png" rel=""><img alt="StagePaintEditor.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98083" data-unique="6zl1bbjjy" src="https://academy.hsoub.com/uploads/monthly_2022_05/StagePaintEditor.thumb.png.12d0a8c71ab720322c0dce6bd7f2d679.png" style="width: 650px; height: auto;"></a>
</p>

<ul>
<li>
		خامسًا، حدد الخلفية Backdrop1 واحذفها لأننا لن نحتاجها في مشروعنا.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98063" href="https://academy.hsoub.com/uploads/monthly_2022_05/DeleteBackdrop.PNG.65e6360692212c96656e420d064e71c7.PNG" rel=""><img alt="DeleteBackdrop.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98063" data-unique="stsb0f378" src="https://academy.hsoub.com/uploads/monthly_2022_05/DeleteBackdrop.PNG.65e6360692212c96656e420d064e71c7.PNG" style="width: 550px; height: auto;"></a>
</p>

<p>
	لاحظ تحديد خلفية السبورة بعد الحذف.
</p>

<ul>
<li>
		سادسًا، انقر على خيار <strong>تحويل إلى متجه</strong> لإضافة نص وتحريكه.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98089" href="https://academy.hsoub.com/uploads/monthly_2022_05/Vector.PNG.8d5c20e2d47b7c7157f5e78d4c2641bd.PNG" rel=""><img alt="Vector.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98089" data-unique="tzt10y3ae" src="https://academy.hsoub.com/uploads/monthly_2022_05/Vector.PNG.8d5c20e2d47b7c7157f5e78d4c2641bd.PNG" style="width: 300px; height: auto;"></a>
</p>

<ul>
<li>
		سابعًا، اكتب العبارة التالية على السبورة : "ابحث عن الحشرة" باستخدام أداة النص:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98088" href="https://academy.hsoub.com/uploads/monthly_2022_05/TextonChalkboard.png.3b57177f43dc5c4f5e60e5ae9e429664.png" rel=""><img alt="TextonChalkboard.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98088" data-unique="n9a1fzsfz" src="https://academy.hsoub.com/uploads/monthly_2022_05/TextonChalkboard.png.3b57177f43dc5c4f5e60e5ae9e429664.png" style="width: 400px; height: auto;"></a>
</p>

<p>
	استخدم نوع الخط واللون الذي تفضله، ثم عدل موضع الخط باستخدام أداة التحديد (السهم) وغَيّر حجم النص عبر سحب زاوية مربع النص.
</p>

<ul>
<li>
		ثامنًا، سمي الخلفية <strong>"شاشة البداية"</strong>. يُنصح باستخدام أسماء واضحة ومتعلقة بالمشروع، لتسهيل فهم عمل المشروع عند العودة إليه.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98085" href="https://academy.hsoub.com/uploads/monthly_2022_05/StartBackdrop.PNG.fc2b6256a23a92d076bd918165dc9ffd.PNG" rel=""><img alt="StartBackdrop.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98085" data-unique="87r21viw3" src="https://academy.hsoub.com/uploads/monthly_2022_05/StartBackdrop.PNG.fc2b6256a23a92d076bd918165dc9ffd.PNG" style="width: 550px; height: auto;"></a>
</p>

<ul>
<li>
		تاسعًا، احذف كائن القطة، ثم انقر على أيقونة <strong>اختيار كائن</strong>، واكتب <strong>bug</strong> في مربع البحث واختر حشرة لاستخدامها في لعبتك. كما يمكنك تسمية مشروعك باسم مناسب للحشرة التي اخترتها، مثل "البحث عن الخنفساء".
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98081" href="https://academy.hsoub.com/uploads/monthly_2022_05/sprite-button.png.ba6a05d330dcd8ce42259fb6c9ccd570.png" rel=""><img alt="sprite-button.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98081" data-unique="fyv2q2gcm" src="https://academy.hsoub.com/uploads/monthly_2022_05/sprite-button.png.ba6a05d330dcd8ce42259fb6c9ccd570.png"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98060" href="https://academy.hsoub.com/uploads/monthly_2022_05/Bugs.PNG.64ce9df68dcfb669675b12fc2dbfdf26.PNG" rel=""><img alt="Bugs.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98060" data-unique="mwhdqhiip" src="https://academy.hsoub.com/uploads/monthly_2022_05/Bugs.thumb.PNG.04f36d7a20b251651d152fbc51c3e5a6.PNG" style="width: 600px; height: auto;"></a>
</p>

<p>
	يسمى الخطأ في البرامج الحاسوبية bug ويعني حشرة باللغة العربية، كما يُطلق على عملية البحث عن الأخطاء وإزالتها بتصحيح الأخطاء أو debugging باللغة الانجليزية. جاءت التسمية عندما وجد فريق مهندسة البرمجيات المشهورة، جريس هوبر، حشرة عث في حاسوبهم ميكانيكي الأجزاء (كانت الحواسيب ميكانيكية قبل أن تتحول إلى إلكترونية) وسجلو ذلك بملاحظة لطيفة كان محتواها "عثرنا على أول حشرة حقيقية سببت أول خطأ فعلي".
</p>

<h2>
	المرحلة الأولى
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98066" href="https://academy.hsoub.com/uploads/monthly_2022_05/first-level.png.11c171c0818c9a9e70ef78be17571089.png" rel=""><img alt="first-level.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98066" data-unique="wxt7o3wic" src="https://academy.hsoub.com/uploads/monthly_2022_05/first-level.png.11c171c0818c9a9e70ef78be17571089.png" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		أولًا، اختر خلفية أضواء المسرح Spotlight من تصنيف موسيقى.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98042" href="https://academy.hsoub.com/uploads/monthly_2022_05/backdrop-button.png.74488eb9cdabe16015c2f1d971d4f356.png" rel=""><img alt="backdrop-button.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98042" data-unique="dthroythg" src="https://academy.hsoub.com/uploads/monthly_2022_05/backdrop-button.png.74488eb9cdabe16015c2f1d971d4f356.png"></a>
</p>

<ul>
<li>
		ثانيًا، انقر على كائن الحشرة لاضافة الكتل التالية لتغيير حجم الكائن عند تغيير الخلفية:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98044" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block1.PNG.2a306c9bfb544d4497337be68d1b810b.PNG" rel=""><img alt="Block1.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98044" data-unique="z3vrdupif" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block1.PNG.2a306c9bfb544d4497337be68d1b810b.PNG" style="width: 350px; height: auto;"></a>
</p>

<ul>
<li>
		ثالثًا، اسحب كائن الحشرة إلى مخبأه، ثم أضف الكتلة التالية:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98051" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block2.PNG.0135b1c97dd9f7aaa040757a2110cef0.PNG" rel=""><img alt="Block2.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98051" data-unique="drdhxche5" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block2.PNG.0135b1c97dd9f7aaa040757a2110cef0.PNG" style="width: 400px; height: auto;"></a>
</p>

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

<ul>
<li>
		رابعًا، أضف كتلة لتشغيل صوت وتغيير الخلفية عند الضغط على الكائن:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98052" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block3.PNG.419b1f47141044c1f9da43e6668b772c.PNG" rel=""><img alt="Block3.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98052" data-unique="smbnpzw0i" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block3.PNG.419b1f47141044c1f9da43e6668b772c.PNG" style="width: 400px; height: auto;"></a>
</p>

<p>
	لاحظ أن كتلة الخلفية التالية تنقلك بين الخلفيات وفق الترتيب في نافذة الخلفيات.
</p>

<ul>
<li>
		خامسًا، انقر على نافذة المنصة وأضف الكتلة التالية ليبدأ المشروع عند شاشة البداية:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98053" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block4.PNG.54d0b425f60c75c0d9b1a4a5a735a177.PNG" rel=""><img alt="Block4.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98053" data-unique="ubzda334q" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block4.PNG.54d0b425f60c75c0d9b1a4a5a735a177.PNG" style="width: 400px; height: auto;"></a>
</p>

<p>
	انقر على العلم الأخضر لتختبر المشروع، ولاحظ أن الخنفساء ستختبئ في شاشة البداية في كرة الأضواء، كما في المرحلة الأولى.
</p>

<ul>
<li>
		سادسًا، انقر على كائن الحشرة واضف الكتل التالية لتغيير حجم الكائن عندما تتغير الخلفية إلى خلفية البداية:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98054" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block5.PNG.94476b7f93dbfb8b2ffd7648397b117f.PNG" rel=""><img alt="Block5.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98054" data-unique="9rxfw7duj" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block5.PNG.94476b7f93dbfb8b2ffd7648397b117f.PNG" style="width: 400px; height: auto;"></a>
</p>

<ul>
<li>
		سابعًا، ضع الحشرة في مخبئها في شاشة البداية، ولاحظ أنه عند الضغط على الحشرة ستتفعل الكتل البرمجية وستنتقل الخلفية إلى الخلفية التالية، يجب علينا إيجاد حل لذلك
	</li>
	<li>
		ثامنًا، انقر على العلم الأخضر لتنتقل إلى شاشة البداية، ثم انقر على كائن الحشرة واسحب الكتل التي تلي كتلة "عند النقر على الكائن" بعيدًا عنها، كما يلي:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98055" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block6.PNG.d8f5bb7fb280da88ac83409ff9911614.PNG" rel=""><img alt="Block6.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98055" data-unique="ai9khof3k" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block6.PNG.d8f5bb7fb280da88ac83409ff9911614.PNG" style="width: 400px; height: auto;"></a>
</p>

<ul>
<li>
		تاسعًا، ضع الحشرة على السبورة، تحت عبارة "ابحث عن الحشرة":
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98086" href="https://academy.hsoub.com/uploads/monthly_2022_05/Text.PNG.5f3e95954c306af6020c439cc4460944.PNG" rel=""><img alt="Text.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98086" data-unique="9wxivxtv8" src="https://academy.hsoub.com/uploads/monthly_2022_05/Text.PNG.5f3e95954c306af6020c439cc4460944.PNG" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		عاشرًا، أضف الكتل التالية لكي تتوضع الحشرة دائمًا على السبورة عند الانتقال إلى خلفية البداية:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98056" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block7.PNG.eb9be760a49852e46ea22e5a8ae6a0b6.PNG" rel=""><img alt="Block7.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98056" data-unique="703aqlbhr" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block7.PNG.eb9be760a49852e46ea22e5a8ae6a0b6.PNG" style="width: 400px; height: auto;"></a>
</p>

<ul>
<li>
		أخيرًا، اعد جمع الكتل تحت كتلة "عند النقر على الكائن" كما يلي:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98052" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block3.PNG.419b1f47141044c1f9da43e6668b772c.PNG" rel=""><img alt="Block3.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98052" data-unique="smbnpzw0i" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block3.PNG.419b1f47141044c1f9da43e6668b772c.PNG" style="width: 400px; height: auto;"></a>
</p>

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

<h2>
	إضافة ببغاء
</h2>

<p>
	سنضيف الآن ببغاءً على اللعبة ليكون بمثابة عنصر إلهاء للاعبين وليزيد من صعوبة اللعبة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98072" href="https://academy.hsoub.com/uploads/monthly_2022_05/parrot-distraction.png.66abcf08537268579de129e44d4474a1.png" rel=""><img alt="parrot-distraction.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98072" data-unique="ghseq7jwe" src="https://academy.hsoub.com/uploads/monthly_2022_05/parrot-distraction.png.66abcf08537268579de129e44d4474a1.png" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		أولًا، أضف كائن الببغاء.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98081" href="https://academy.hsoub.com/uploads/monthly_2022_05/sprite-button.png.ba6a05d330dcd8ce42259fb6c9ccd570.png" rel=""><img alt="sprite-button.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98081" data-unique="fyv2q2gcm" src="https://academy.hsoub.com/uploads/monthly_2022_05/sprite-button.png.ba6a05d330dcd8ce42259fb6c9ccd570.png"></a>
</p>

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

<ul>
<li>
		ثانيًا، أضف الكتل التالية ليرفرف الببغاء بجناحيه بلا توقف:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98057" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block8.PNG.e6d31d7a9ccc1f87a088f20534494802.PNG" rel=""><img alt="Block8.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98057" data-unique="jdgv3kcxg" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block8.thumb.PNG.355348256877f958dd4157d5fc29c026.PNG" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		ثالثًا، انقر على العلم الأخضر واختبر عمل مشروعك. هل تتذكر أين خبأت الحشرة؟
	</li>
</ul>
<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> تُحَدد الكتل الجاري تشغيلها بإطار أصفر، كالتالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98068" href="https://academy.hsoub.com/uploads/monthly_2022_05/HighlitedCodeBlocks.PNG.12ac4b86a15b6188fa6e63329615843f.PNG" rel=""><img alt="HighlitedCodeBlocks.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98068" data-unique="wjwz66kmt" src="https://academy.hsoub.com/uploads/monthly_2022_05/HighlitedCodeBlocks.PNG.12ac4b86a15b6188fa6e63329615843f.PNG" style="width: 400px; height: auto;"></a>
</p>

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

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

<p>
	سنختار في هذه الخطوة خلفيةً للمرحلة الثانية بحيث تزيد صعوبة اللعبة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98079" href="https://academy.hsoub.com/uploads/monthly_2022_05/second-level.png.da58b6509be5d09a5803a6a66dfddaef.png" rel=""><img alt="second-level.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98079" data-unique="57z3jxifo" src="https://academy.hsoub.com/uploads/monthly_2022_05/second-level.png.da58b6509be5d09a5803a6a66dfddaef.png" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		أولًا، اختر الخلفية التي تراها مناسبة. اخترنا الخلفية التالية باسم 'Urban' بسبب <a href="https://academy.hsoub.com/design/user-experience/%D8%A7%D9%84%D8%AA%D9%86%D8%A7%D8%B3%D9%82-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%8A%D8%A9-r712/" rel="">تناسق ألوانها</a> مع ألوان الخنفساء التي اخترناها:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98070" href="https://academy.hsoub.com/uploads/monthly_2022_05/insert-urban-backdrop.png.80e45b7e90537c5a372b54cf4411a8bb.png" rel=""><img alt="insert-urban-backdrop.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98070" data-unique="7mwkszepg" src="https://academy.hsoub.com/uploads/monthly_2022_05/insert-urban-backdrop.png.80e45b7e90537c5a372b54cf4411a8bb.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	احرص على اختيار خلفيات فيها تفاصيل عديدة وألوان مشابهة لألوان الحشرة التي اخترتها ليصعب إيجادها.
</p>

<ul>
<li>
		ثانيًا، اسحب الكتل التي تلي كتلة عند النقر على الكائن بعيدًا عنها كي تتمكن من وضع الخنفساء في مخبأها:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98055" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block6.PNG.d8f5bb7fb280da88ac83409ff9911614.PNG" rel=""><img alt="Block6.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98055" data-unique="ai9khof3k" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block6.PNG.d8f5bb7fb280da88ac83409ff9911614.PNG" style="width: 400px; height: auto;"></a>
</p>

<ul>
<li>
		ثالثًا، صَغّر حجم الخنفساء ليصعب العثور عليها، وذلك بإضافة كتلة تعديل الحجم التالية:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98058" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block9.PNG.b280db0ccaba4b65acafd2180dd8908f.PNG" rel=""><img alt="Block9.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98058" data-unique="cajya4bjb" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block9.PNG.b280db0ccaba4b65acafd2180dd8908f.PNG" style="width: 400px; height: auto;"></a>
</p>

<p>
	شغل المشروع لتشاهد النتيجة.
</p>

<ul>
<li>
		رابعًا، ضع الخنفساء في مخبأ مناسب.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98067" href="https://academy.hsoub.com/uploads/monthly_2022_05/hidden-urban-backdrop.png.99f5b1ad9c7d6a71501f05a1a6226f44.png" rel=""><img alt="hidden-urban-backdrop.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98067" data-unique="p7fexr4ou" src="https://academy.hsoub.com/uploads/monthly_2022_05/hidden-urban-backdrop.png.99f5b1ad9c7d6a71501f05a1a6226f44.png" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		خامسًا، أضف كتلة اذهب إلى الموضع، وذلك لتعيين إحداثيات الحشرة:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98045" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block10.PNG.55692fe262c79697f76b47c6f4c5e4ae.PNG" rel=""><img alt="Block10.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98045" data-unique="qcyi09bt6" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block10.PNG.55692fe262c79697f76b47c6f4c5e4ae.PNG" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		سادسًا، أعد جمع الكتل مع بعضها، بحيث ننتقل إلى الخلفية التالية عند النقر على كائن الحشرة، ثم انقر على العلم الأخضر لاختبار المشروع.
	</li>
	<li>
		سابعًا، أضف الكتلة التالية حتى تبقى الخنفساء خلف الببغاء دائما، حتى عند تغييرنا لموضعها:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98046" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block11.PNG.e7af136604fec7f01f81c9986204aa7b.PNG" rel=""><img alt="Block11.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98046" data-unique="c1stbed2u" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block11.PNG.e7af136604fec7f01f81c9986204aa7b.PNG" style="width: 400px; height: auto;"></a>
</p>

<h2>
	شاشة النهاية
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98064" href="https://academy.hsoub.com/uploads/monthly_2022_05/end-screen.png.5f1cd9736429fdf1ead242d530c97870.png" rel=""><img alt="end-screen.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98064" data-unique="i3ifcsj4z" src="https://academy.hsoub.com/uploads/monthly_2022_05/end-screen.png.5f1cd9736429fdf1ead242d530c97870.png" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		أولًا، أضف خلفية السبورة Chalkboard من تصنيف داخلي، ولاحظ أنه في برنامج سكراتش يمكننا إضافة الخلفية نفسها عدة مرات!
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98043" href="https://academy.hsoub.com/uploads/monthly_2022_05/Backdrops.PNG.f91c0264743e90c28129cf21b76bd0dd.PNG" rel=""><img alt="Backdrops.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98043" data-unique="74dnq9ruh" src="https://academy.hsoub.com/uploads/monthly_2022_05/Backdrops.thumb.PNG.ecfa5d01c593aeb545e2caa9255626e3.PNG" style="width: 650px; height: auto;"></a>
</p>

<ul>
<li>
		ثانيًا، انقر على نافذة <strong>الخلفيات</strong> لفتح محرر الرسوم، ثم غير اسم الخلفية إلى "شاشة النهاية" أو أي اسم معبر بحيث يسهُل عليك فهم المشروع عند العودة إليه:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98065" href="https://academy.hsoub.com/uploads/monthly_2022_05/EndBackdrop.PNG.a050c72959be48f71dc4182a580a52f2.PNG" rel=""><img alt="EndBackdrop.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98065" data-unique="s3a4izqii" src="https://academy.hsoub.com/uploads/monthly_2022_05/EndBackdrop.thumb.PNG.a2df4f72f91bbd377162cfe0d801e074.PNG" style="width: 550px; height: auto;"></a>
</p>

<ul>
<li>
		ثالثًا، انقر على كائن الحشرة وأضف الكتل التالية لوضع الحشرة على شاشة النهاية:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98047" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block12.PNG.1a3ec484dd12871fd97ecf00d8762fe6.PNG" rel=""><img alt="Block12.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98047" data-unique="raqsxv3vf" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block12.PNG.1a3ec484dd12871fd97ecf00d8762fe6.PNG" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		رابعًا، سنضيف مؤقتًا من كتل الاستشعار، وذلك لإظهار الوقت الذي استغرقه اللاعب في إيجاد الحشرة:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98048" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block13.PNG.28a7e6d9ac1613b07f41ea34ed95861e.PNG" rel=""><img alt="Block13.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98048" data-unique="k1ze5v6wg" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block13.PNG.28a7e6d9ac1613b07f41ea34ed95861e.PNG" style="width: 450px; height: auto;"></a>
</p>

<p>
	اسحب كتلة المؤقت داخل كتلة قُل، لتبدو الخنفساء وكأنها تخبر اللاعب بالوقت المستغرق!
</p>

<ul>
<li>
		خامسًا، انقر على العلم الأخضر واختبر كم تستغرق من الوقت لإيجاد الخنفساء.
	</li>
	<li>
		سادسًا، سنضيف الكتل التالية مع كتلة "قُل" لكن بدون رسالة ترحيب وذلك لإخفاء المؤقت عند الانتقال إلى شاشة البداية:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98049" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block14.PNG.cca42175a911cc6fde337e04b7ec435f.PNG" rel=""><img alt="Block14.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98049" data-unique="i5zci5wdk" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block14.PNG.cca42175a911cc6fde337e04b7ec435f.PNG" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		سابعًا، سنضيف كتلة تصفير للمؤقت عند الانتقال إلى المرحلة الأولى، وذلك لأنه بدونها، سيستمر المؤقت بحساب الثواني عند اللعب مرةً أخرى.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98050" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block15.PNG.467e628d42805ad7050ecb38fd25ed96.PNG" rel=""><img alt="Block15.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98050" data-unique="zpmlfeaeq" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block15.PNG.467e628d42805ad7050ecb38fd25ed96.PNG" style="width: 450px; height: auto;"></a>
</p>

<ul>
<li>
		ثامنًا، انقر على العلم الأخضر واختبر اللعبة. اختبر هل يُعاد ضبط المؤقت عند النقر على الخنفساء في شاشة البداية للانتقال إلى المستوى الأول؟ هل يختفي المؤقت عند الانتقال من شاشة النهاية إلى شاشة البداية؟
	</li>
</ul>
<h2>
	اختبر اللعبة
</h2>

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

<ul>
<li>
		جعل الببغاء أكثر إزعاجًا.
	</li>
	<li>
		جعل الحشرات أصغر حجمًا.
	</li>
	<li>
		تغيير تأثير اللون لتمويه الحشرة في كل مرحلة.
	</li>
	<li>
		تغيير نمط الخط أو لون الخط.
	</li>
</ul>
<p>
	يمكنك أن تطلب من شخص آخر أن يجرب اللعبة وراقب سرعته في العثور على الحشرات، ;من المؤكد أنه سيستغرق وقتًا أطول لأنه لا يعرف أين خبأتها. بعد كل ذلك ألقِ نظرةً على مشاريع "البحث عن الحشرة " التي نفذها الآخرون والموجودة في <a href="https://scratch.mit.edu/studios/29005236/" rel="external nofollow">معرض مشاريع سكراتش</a> على الموقع الرسمي لراسبيري باي.
</p>

<h2>
	مشاركة المشروع
</h2>

<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> عبر مشاركة مشروعك باتباع الخطوات التالية واحرص على عدم مشاركة أي معلومات شخصية: أولًا، سمي مشروعك باسم مناسب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98071" href="https://academy.hsoub.com/uploads/monthly_2022_05/name_file.gif.1274ce992e104cc6ad5d7776cefbb9fd.gif" rel=""><img alt="name_file.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="98071" data-unique="lnymtqezn" src="https://academy.hsoub.com/uploads/monthly_2022_05/name_file.gif.1274ce992e104cc6ad5d7776cefbb9fd.gif" style="width: 600px; height: auto;"></a>
</p>

<p>
	ثانيًا، انقر على خيار المشاركة Share لجعل المشروع متاحًا للجميع.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98080" href="https://academy.hsoub.com/uploads/monthly_2022_05/share.gif.14e886661dd2179bac170ef0305b5e7e.gif" rel=""><img alt="share.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="98080" data-unique="g1r8hede0" src="https://academy.hsoub.com/uploads/monthly_2022_05/share.gif.14e886661dd2179bac170ef0305b5e7e.gif" style="width: 600px; height: auto;"></a>
</p>

<p>
	ثالثًا، أضف إرشادات للاعبين، إن أحببت، في مربع الإرشادات Instruction box. كما يمكنك إضافة ملاحظة في مربع الملاحظات والملكية Notes and Credits إذا كان مشروعك أصليًا، أو يمكنك ذكر المشروع الأصلي الذي عدلت عليه.
</p>

<p>
	أخيرًا، انقر على خيار نسخ الرابط Copy link لمشاركته مع الأصدقاء عبر <a href="https://academy.hsoub.com/marketing/social-media/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%88%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D8%A7%D9%84%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%D9%8A-%D9%88%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84%D9%87%D8%A7-r526/" rel="">وسائل التواصل الاجتماعي</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98062" href="https://academy.hsoub.com/uploads/monthly_2022_05/copy_link.gif.cd7da072ad805ecb3d39c35ed9ae5802.gif" rel=""><img alt="copy_link.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="98062" data-unique="bb5lm4s4h" src="https://academy.hsoub.com/uploads/monthly_2022_05/copy_link.gif.cd7da072ad805ecb3d39c35ed9ae5802.gif" style="width: 550px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98061" href="https://academy.hsoub.com/uploads/monthly_2022_05/comments-off.png.336bf45b12f1122e58051edd75d41af3.png" rel=""><img alt="comments-off.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98061" data-unique="mzb3q43kt" src="https://academy.hsoub.com/uploads/monthly_2022_05/comments-off.png.336bf45b12f1122e58051edd75d41af3.png" style="width: 500px; height: auto;"></a>
</p>

<p>
	شاركنا مشروعك على مجتمع سكراتش في <a href="https://io.hsoub.com/" rel="external">منصة حسوب IO</a>.
</p>

<h2>
	اختبر معلوماتك
</h2>

<p>
	انعش ذاكرتك واختبر معلوماتك بالإجابة عن الأسئلة التالية:
</p>

<ol>
<li>
		<strong>السؤال الأول:</strong> ما هي الخلفية التي سننتقل إليها عند تشغيل الكتل التالية؟
	</li>
</ol>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98074" href="https://academy.hsoub.com/uploads/monthly_2022_05/question1.png.da07d3b055d1d64872b8c914b1e47cbe.png" rel=""><img alt="question1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98074" data-unique="6q6xtdla7" src="https://academy.hsoub.com/uploads/monthly_2022_05/question1.png.da07d3b055d1d64872b8c914b1e47cbe.png" style="width: 400px; height: auto;"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98077" href="https://academy.hsoub.com/uploads/monthly_2022_05/questionbackdrop1.png.3ee60fcb4355281f1cf64f8ef169bdbd.png" rel=""><img alt="questionbackdrop1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98077" data-unique="bk3khj9dv" src="https://academy.hsoub.com/uploads/monthly_2022_05/questionbackdrop1.thumb.png.7e43a42136d7af5b2d9dc066bf78a9b3.png" style="width: 300px; height: auto;"></a>
</p>

<p>
	(حاول تذكر ما تعلمناه قبل الإطلاع على الإجابة أدناه)
</p>

<ul style="margin-right: 40px;">
<li>
		<strong>الإجابة الصحيحة :</strong> عند النقر على الكائن سننتقل إلى الخلفية Urban.
	</li>
</ul>
<ol start="2">
<li>
		<strong>السؤال الثاني:</strong> تمعن في الكتل التالية، كيف يمكننا إصلاحها بحيث يتحرك الكائن باستمرار؟
	</li>
</ol>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98075" href="https://academy.hsoub.com/uploads/monthly_2022_05/question2.png.db3ce4b29a1bfe0af8b1283f6b6b1e68.png" rel=""><img alt="question2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98075" data-unique="84z3zqqmy" src="https://academy.hsoub.com/uploads/monthly_2022_05/question2.thumb.png.ddcbd45e4fdf86628fa04960e7071961.png" style="width: 400px; height: auto;"></a>
</p>

<ul style="margin-right: 40px;">
<li>
		<strong>الإجابة الصحيحة :</strong> عبر نقل كتلة تحرك 6 خطوات إلى داخل كتلة كرر باستمرار.
	</li>
</ul>
<ol start="3">
<li>
		<strong>السؤال الثالث:</strong> كيف يمكننا الحصول على الوقت المستغرق في اللعب كما في الصورة التالية؟
	</li>
</ol>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98078" href="https://academy.hsoub.com/uploads/monthly_2022_05/quiz_bug_number.png.0a193be66f6d028409a0dd1e64e252f3.png" rel=""><img alt="quiz_bug_number.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98078" data-unique="lotkqlt5f" src="https://academy.hsoub.com/uploads/monthly_2022_05/quiz_bug_number.png.0a193be66f6d028409a0dd1e64e252f3.png"></a>
</p>

<ul style="margin-right: 40px;">
<li>
		<strong>الإجابة الصحيحة :</strong> عبر إضافة كتلة المؤقت.
	</li>
</ul>
<h2>
	ترقية المشروع
</h2>

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

<p>
	إليك تذكرةً بما ستحتاج تنفيذه في كل مرحلة:
</p>

<ul>
<li>
		إضافة خلفية.
	</li>
	<li>
		ترتيب الخلفيات ووضع الخلفية الجديدة قبل خلفية شاشة النهاية.
	</li>
	<li>
		إضافة كتلة "عندما تتبدل الخلفية" على الخلفية الجديدة وإضافة الكتل المناسبة لإخفاء الحشرة.
	</li>
</ul>
<p>
	إليك تذكرةً بالكتل التي ستحتاجها لإخفاء الكائنات في مرحلة جديدة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98059" href="https://academy.hsoub.com/uploads/monthly_2022_05/Blocks.PNG.5cf5ef73bcd7e02891857856618576b5.PNG" rel=""><img alt="Blocks.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98059" data-unique="4pnzel8ax" src="https://academy.hsoub.com/uploads/monthly_2022_05/Blocks.thumb.PNG.b20199672e48eaa941e4cd0b362b191e.PNG" style="width: 300px; height: auto;"></a>
</p>

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

<p>
	أضف ببغاءً آخر، أو كائنًا آخر كمصدر إزعاج. إليك تذكرة بالكتل اللازمة
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98073" href="https://academy.hsoub.com/uploads/monthly_2022_05/ParrotBlocks.PNG.54bd9ddc8c26c1f31f1a1feea8189c75.PNG" rel=""><img alt="ParrotBlocks.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98073" data-unique="mkenzb367" src="https://academy.hsoub.com/uploads/monthly_2022_05/ParrotBlocks.thumb.PNG.fbec7bb9b2184b3e1a5f282deccdcadf.PNG" style="width: 350px; height: auto;"></a>
</p>

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

<h2>
	ختامًا
</h2>

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

<p>
	يُنصح بتنفيذ مشروع إنشاء شخصية لها عيون ذات تأثير كرتوني باستخدام برنامج سكراتش كخطوتك التالية، وإذا واجهت مشاكل مع برنامج سكراتش فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في <a href="https://academy.hsoub.com/questions/" rel="">أكاديمية حسوب</a>
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://projects.raspberrypi.org/en/projects/find-the-bug/0" rel="external nofollow">Find the Bug</a> من <a href="https://raspberrypi.org/" rel="external nofollow">الموقع الرسمي لراسبيري باي</a>.
</p>

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

<ul>
<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/general/%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%AD%D8%A7%D9%81%D9%84%D8%A9-%D9%85%D8%AF%D8%B1%D8%B3%D8%A9-%D9%85%D8%AA%D8%AD%D8%B1%D9%83%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-r1550/" rel="">تنفيذ مشروع حافلة مدرسة متحركة باستخدام برنامج سكراتش</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%A3%D8%B6%D9%88%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%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-r1482/" rel="">إنشاء لعبة أضواء باستخدام برنامج سكراتش وحاسوب راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%84%D8%B9%D8%A8%D8%A9-%D8%A7%D9%84%D8%B3%D9%84%D9%83-%D9%88%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%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-r1495/" rel="">تصميم لعبة السلك والحلقة باستخدام برنامج سكراتش وحاسوب راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B5%D8%A8%D8%A7%D8%AD-%D9%84%D9%8A%D8%AF-%D8%AB%D9%84%D8%A7%D8%AB%D9%8A-%D8%A7%D9%84%D8%A3%D8%A8%D8%B9%D8%A7%D8%AF-%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%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-r1504/" rel="">تنفيذ مصباح ليد ثلاثي الأبعاد باستخدام سكراتش ولوحة راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%B5%D9%86%D8%B9-%D8%A2%D9%84%D8%A9-%D9%85%D9%88%D8%B3%D9%8A%D9%82%D9%8A%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-%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-r1505/" rel="">صنع آلة موسيقية باستخدام سكراتش وحاسوب راسبيري باي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1551</guid><pubDate>Mon, 16 May 2022 15:00:00 +0000</pubDate></item><item><title>&#x647;&#x644; &#x623;&#x646;&#x62A; &#x645;&#x628;&#x631;&#x645;&#x62C; &#x645;&#x62E;&#x62A;&#x631;&#x642; Hacker &#x623;&#x645; &#x645;&#x628;&#x631;&#x645;&#x62C; &#x645;&#x635;&#x645;&#x645; Designer&#x61F;</title><link>https://academy.hsoub.com/programming/general/%D9%87%D9%84-%D8%A3%D9%86%D8%AA-%D9%85%D8%A8%D8%B1%D9%85%D8%AC-%D9%85%D8%AE%D8%AA%D8%B1%D9%82-hacker-%D8%A3%D9%85-%D9%85%D8%A8%D8%B1%D9%85%D8%AC-%D9%85%D8%B5%D9%85%D9%85-designer%D8%9F-r1727/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_10/63391b8cb8239_----Hacker---Designer-.png.0bbae3bbc3f06d99f3ac1a3ffc203af9.png" /></p>

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

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="480" src="https://www.youtube.com/embed/WTIlbDqtZag" title="هل أنت مبرمج مخترق Hacker أم مصمم Designer" width="853"></iframe>
</p>

<p>
	الآن وبعد اطلاعك على محتوى الفيديو، سيكون في إمكانك التمييز بين كل من مفهوم المبرمج المصمم والمبرمج المخترق، لتتخذ في رحلة تطويرك الأسلوب الأنسب لك. يمكنك دعم رحلة تعلمك <a href="https://academy.hsoub.com/programming/" rel="">بالمقالات البرمجية المجانية المتاحة على أكاديمية حسوب</a>، كما يمكنك الانطلاق باحترفية أكبر في تعلم <a href="https://academy.hsoub.com/learn/computer-science/" rel="">علوم الحاسوب</a> والتطوير، وذلك من خلال الاشتراك في <a href="https://academy.hsoub.com/" 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>.
</p>
]]></description><guid isPermaLink="false">1727</guid><pubDate>Thu, 12 May 2022 15:30:00 +0000</pubDate></item><item><title>&#x625;&#x631;&#x634;&#x627;&#x62F;&#x627;&#x62A; &#x644;&#x62A;&#x62D;&#x633;&#x64A;&#x646; &#x62A;&#x62C;&#x631;&#x628;&#x629; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645; UX &#x641;&#x64A; &#x648;&#x636;&#x639; &#x639;&#x62F;&#x645; &#x627;&#x644;&#x627;&#x62A;&#x635;&#x627;&#x644; &#x644;&#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x627;&#x644;&#x62A;&#x642;&#x62F;&#x645;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/general/%D8%A5%D8%B1%D8%B4%D8%A7%D8%AF%D8%A7%D8%AA-%D9%84%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-ux-%D9%81%D9%8A-%D9%88%D8%B6%D8%B9-%D8%B9%D8%AF%D9%85-%D8%A7%D9%84%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-r1546/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_04/thumb.png.6f49686567b023c01f61751b1bf4df84.png" /></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%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r832/" rel="">لتطبيقات الويب التقدمية PWAs</a> على كلًا من الشبكات البطيئة وغير المتصلة.
</p>

<p>
	يمكن أن تتأثر جودة اتصال الشبكة بشكل عام بعدة عوامل مثل:
</p>

<ul>
<li>
		تغطية ضعيفة من المزود.
	</li>
	<li>
		ظروف طقس شديدة.
	</li>
	<li>
		انقطاع التيار الكهربائي.
	</li>
	<li>
		الدخول في مناطق ميتة الاتصال دائمًا dead zones مثل البنايات ذات الجدران المانعة لاتصالات الشبكة.
	</li>
	<li>
		الدخول في مناطق ميتة الاتصال مؤقتًا مثل السفر في قطار وعبور نفق.
	</li>
	<li>
		اتصالات الإنترنت المقيدة زمنيًا time-boxed مثل الاتصالات الموجودة في المطارات أو الفنادق.
	</li>
	<li>
		الممارسات الثقافية التي تتطلب وصولًا محدودًا أو معدومًا للإنترنت في أوقات أو أيام محددة.
	</li>
</ul>
<p>
	هدفك هو تقديم تجربة مستخدم جيدة في وضع عدم الاتصال تقلل من تأثير التغيُّر في حالة التطبيق عندما يستعيد المستخدم اتصاله بالشبكة.
</p>

<h2>
	حدد ما تريد إظهاره للمستخدمين في حالة ضعف الاتصال بالشبكة
</h2>

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

<p>
	عند التفكير في نجاح أو فشل اتصال الشبكة، عليك أن تسأل نفسك أسئلة حول تجربة المستخدم UX المهمة هذه:
</p>

<ul>
<li>
		ما هي المدة التي تنتظرها لتحديد نجاح أو فشل الاتصال؟
	</li>
	<li>
		ماذا يمكنك أن تفعل أثناء تحديد نجاح أو فشل الاتصال؟
	</li>
	<li>
		ماذا تفعل في حال فشل الاتصال؟
	</li>
	<li>
		كيف تبلِّغ المستخدم بما ورد أعلاه (أنه في مرحلة انتظار تحديد حالة التطبيق، أو أن اتصاله فشل أو أن اتصالة استُعيد)؟
	</li>
</ul>
<h3>
	بلغ المستخدمين عن حالتهم الحالية وعن تغيُّر حالة التطبيق
</h3>

<p>
	أخبر المستخدم بالإجراءات التي لا يزال بإمكانه القيام بها عندما يكون في حالة فشل الاتصال، وأيضًا أخبره بحالة التطبيق الحالية، مثلًا ممكن أن يقول الإشعار:
</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="97375" href="https://academy.hsoub.com/uploads/monthly_2022_04/01inform_user_when_state_changed.png.6ea7376ee28ab62cf2e9b3f70da1d037.png" rel=""><img alt="01inform_user_when_state_changed.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97375" data-unique="d5hd9h58f" src="https://academy.hsoub.com/uploads/monthly_2022_04/01inform_user_when_state_changed.thumb.png.cc79753d90d3f6ad309bf8f9e46de29f.png"></a>
</p>

<p>
	بلّغ المستخدم بوضوح عند حدوث تغيُّر في حالة التطبيق في أسرع وقت ممكن.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97376" href="https://academy.hsoub.com/uploads/monthly_2022_04/02toast_to_inform_user_about_offline.png.7ea85831b03161a83e164a4a513ba901.png" rel=""><img alt="02toast_to_inform_user_about_offline.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97376" data-unique="9bvnlgq5x" src="https://academy.hsoub.com/uploads/monthly_2022_04/02toast_to_inform_user_about_offline.thumb.png.8d1b8e795c4ea44c579d1950fd39ff5c.png"></a>
</p>

<p>
	استخدام تطبيق Google I/O مربع إشعار لإخبار المستخدم عندما يكون في حالة عدم اتصال بالشبكة، إذ يقول الإشعار "أنت بلا اتصال، تغييراتك في My Schedule ستُحفظ لوقت لاحق".
</p>

<h3>
	بلِّغ المستخدمين عندما يتحسن اتصال الشبكة لديهم أو يعود
</h3>

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

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

<p>
	أحد الأمثلة على استخدام هذه التجربة هو <a href="https://chromestatus.com/" rel="external nofollow">متصفح Chrome Status</a> التي تُظهر ملاحظة للمستخدم عند تحديث التطبيق في الخلفية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97377" href="https://academy.hsoub.com/uploads/monthly_2022_04/03weather_app_auto-update.png.ea653e24e159da8a447a431e710a475c.png" rel=""><img alt="03weather_app_auto-update.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97377" data-unique="wh59ywdqy" src="https://academy.hsoub.com/uploads/monthly_2022_04/03weather_app_auto-update.thumb.png.8c24c8420f543e928c6fa659be784ba1.png"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97378" href="https://academy.hsoub.com/uploads/monthly_2022_04/04ana-update-message.jpeg.68f88a4edf0f557e5668d8e6ee54963d.jpeg" rel=""><img alt="04ana-update-message.jpeg" class="ipsImage ipsImage_thumbnailed" data-fileid="97378" data-unique="9h4deorn4" src="https://academy.hsoub.com/uploads/monthly_2022_04/04ana-update-message.thumb.jpeg.2decf5e85c08b759b5972bac090080c1.jpeg"></a>
</p>

<p>
	يتيح تطبيق ana (أنا) للمستخدم معرفة وقت تحديث المحتوى عبر مربع إشعار في أعلى الشاشة.
</p>

<p>
	يمكنك تخصيص مساحة ثابتة تُظهر من خلالها آخر مرة تم فيها تحديث التطبيق، سيكون هذا مفيدًا لتطبيق تحويل العملات مثلًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97380" href="https://academy.hsoub.com/uploads/monthly_2022_04/05material_money_caches_rate.png.e3a9ec963aa51056286b514b7485536c.png" rel=""><img alt="05material_money_caches_rate.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97380" data-unique="z7jl4nggv" src="https://academy.hsoub.com/uploads/monthly_2022_04/05material_money_caches_rate.thumb.png.74a09977ed36de1fcdf76e2cf80d3370.png"></a>
</p>

<p>
	تطبيق Material mony يُظهر آخر تحديث للتطبيق.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97381" href="https://academy.hsoub.com/uploads/monthly_2022_04/06notify_about_last_update.png.f283a63b8867e5ae5a64a49e9e286d57.png" rel=""><img alt="06notify_about_last_update.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97381" data-unique="ya0qu7sud" src="https://academy.hsoub.com/uploads/monthly_2022_04/06notify_about_last_update.thumb.png.88395a8022bfa19b263dbc774440ded7.png"></a>
</p>

<p>
	وينبّه المستخدم عند تحديث التطبيق.
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97382" href="https://academy.hsoub.com/uploads/monthly_2022_04/07tailpiece_auto-download_latest_news.png.4eab9003495301c5a8ebb0a5ac53c11e.png" rel=""><img alt="07tailpiece_auto-download_latest_news.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97382" data-unique="46qhtw2rd" src="https://academy.hsoub.com/uploads/monthly_2022_04/07tailpiece_auto-download_latest_news.thumb.png.2d9ecac178a48adbe04c5a6cf2224d59.png"></a>
</p>

<p>
	صحيفة الانترنت Tailpiece تُنزّل آخر الأخبار تلقائيًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97383" href="https://academy.hsoub.com/uploads/monthly_2022_04/08allow_manual_refresh.png.53b6408d63968367558ef3bfffe6a66a.png" rel=""><img alt="08allow_manual_refresh.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97383" data-unique="3wusry1xr" src="https://academy.hsoub.com/uploads/monthly_2022_04/08allow_manual_refresh.thumb.png.e5c09fa8617c37594178f5e6e24c8fc1.png"></a>
</p>

<p>
	وتسمح للمستخدمين بالتحديث يدويًا حتى لا يفقدوا مكان تصفحهم في المقال.
</p>

<h3>
	تحديث واجهة المستخدم UI لتعكس الحالة السياقية الحالية
</h3>

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

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

<h3>
	توضيح للمستخدم نموذج العرض الخاص بوضع عدم الاتصال
</h3>

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

<h2>
	تقديم تجربة افتراضية لوضع عدم الاتصال
</h2>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97384" href="https://academy.hsoub.com/uploads/monthly_2022_04/09tailpiece_notify_users_about_offline.png.e225f9d4fec3f63807a30517bb6680fc.png" rel=""><img alt="09tailpiece_notify_users_about_offline.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97384" data-unique="z93hcnifk" src="https://academy.hsoub.com/uploads/monthly_2022_04/09tailpiece_notify_users_about_offline.thumb.png.f384c30951d9007c65b3ac0c56e6e67d.png"></a>
</p>

<p>
	إذا كان الجهاز غير متصل بالشبكة، فسيُشعر Tailpiece المستخدم بذلك.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97385" href="https://academy.hsoub.com/uploads/monthly_2022_04/10cabibility_of_partly_useing_app.png.7ecb8a1a4e5fdfcd538956f4d22e9085.png" rel=""><img alt="10cabibility_of_partly_useing_app.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97385" data-unique="9f1lio1kv" src="https://academy.hsoub.com/uploads/monthly_2022_04/10cabibility_of_partly_useing_app.thumb.png.be3f14403d273db1a07cd22b97922bae.png"></a>
</p>

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

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

<h2>
	إبلاغ المستخدم عندما يكون التطبيق جاهزًا للاستخدام دون اتصال بالشبكة
</h2>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97386" href="https://academy.hsoub.com/uploads/monthly_2022_04/11notification_when_ready_offline.png.8fc8f7aa7434508e9ce85433a561a4a3.png" rel=""><img alt="11notification_when_ready_offline.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97386" data-unique="34nb7256f" src="https://academy.hsoub.com/uploads/monthly_2022_04/11notification_when_ready_offline.thumb.png.ac0fd491f23468eb8a3d82ec05db938c.png"></a>
</p>

<p>
	يظهر تطبيق Google I/O إشعارًا مفاده: اكتمل التخزين المؤقت، وستعمل الزيارات المستقبلية في وضع عدم الاتصال.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97387" href="https://academy.hsoub.com/uploads/monthly_2022_04/12chrome_status_storage_information.png.320f9c3e1b31b4c2ab22a0ccb906c7ef.png" rel=""><img alt="12chrome_status_storage_information.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97387" data-unique="57wok4hbw" src="https://academy.hsoub.com/uploads/monthly_2022_04/12chrome_status_storage_information.thumb.png.8ef6cd812b381260875de783edd55612.png"></a>
</p>

<p>
	يتضمن موقع Chrome Platform Status معلومات حول المساحة المشغولة بالتخزين المؤقت.
</p>

<h3>
	اجعل "التخزين في وضع عدم الاتصال" جزءًا واضحًا من واجهة التطبيقات كثيفة البيانات
</h3>

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

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

<h3>
	توضيح ما هو متاح حاليا
</h3>

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

<h3>
	إظهار التكلفة الفعلية للإجراء
</h3>

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

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

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

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

<h2>
	اجعل العمليات قابلة للنقل من جهاز لآخر
</h2>

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

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

<h2>
	إنشاء تجارب تصميم متكاملة
</h2>

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

<h3>
	استخدم لغة بسيطة وموجزة
</h3>

<p>
	<a href="https://academy.hsoub.com/design/user-experience/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-r709/" rel="">تجربة المستخدم</a> الجيدة لا تتعلق فقط بواجهة مصممة جيدًا، بل تتضمن المسار الذي يسلكه المستخدم بالإضافة إلى الألفاظ المستخدمة في التطبيق.
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97388" href="https://academy.hsoub.com/uploads/monthly_2022_04/13avoid_intelligible_terms.png.cb1341d4300060fe959d35ad5fe4b33b.png" rel=""><img alt="13avoid_intelligible_terms.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97388" data-unique="kl0avmx46" src="https://academy.hsoub.com/uploads/monthly_2022_04/13avoid_intelligible_terms.png.cb1341d4300060fe959d35ad5fe4b33b.png"></a>
</p>

<p>
	تجنب المصطلحات غير المفهومة للمستخدمين غير التقنيين مثل: "<a href="https://academy.hsoub.com/programming/general/%D9%85%D9%81%D9%87%D9%88%D9%85-service-worker-%D9%88%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1%D9%87-%D9%81%D9%8A-%D8%A3%D8%AF%D8%A7%D8%A1-%D9%88%D8%A8%D9%86%D9%8A%D8%A9-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D9%88%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r833/" rel="">عامل الخدمة</a>".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97389" href="https://academy.hsoub.com/uploads/monthly_2022_04/14language_and_imagery_to_describe_action.png.e337ff0966571d68beccadc5577179a7.png" rel=""><img alt="14language_and_imagery_to_describe_action.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97389" data-unique="4jki7n7jc" src="https://academy.hsoub.com/uploads/monthly_2022_04/14language_and_imagery_to_describe_action.png.e337ff0966571d68beccadc5577179a7.png"></a>
</p>

<p>
	استخدم اللغة الواضحة التي تصف الإجراء مثل: "تنزيل".
</p>

<h3>
	استخدم طرق تصميم متعددة لتسهيل تجربة المستخدم
</h3>

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

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97390" href="https://academy.hsoub.com/uploads/monthly_2022_04/15use_color_only.png.321141268c48edcdc7a32098ced56a6a.png" rel=""><img alt="15use_color_only.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97390" data-unique="d23ucs0r7" src="https://academy.hsoub.com/uploads/monthly_2022_04/15use_color_only.png.321141268c48edcdc7a32098ced56a6a.png" style="width: 400px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97391" href="https://academy.hsoub.com/uploads/monthly_2022_04/16mixture_of_design_elements.png.ad5ea90754f378a01cd5992b2dfa16f3.png" rel=""><img alt="16mixture_of_design_elements.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97391" data-unique="oi2nbe8vw" src="https://academy.hsoub.com/uploads/monthly_2022_04/16mixture_of_design_elements.png.ad5ea90754f378a01cd5992b2dfa16f3.png" style="width: 400px; height: auto;"></a>
</p>

<h3>
	استخدم أيقونات بليغة
</h3>

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

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

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97392" href="https://academy.hsoub.com/uploads/monthly_2022_04/17action_based_icons.png.e63e30846d0b70cdc91685cf3afa2ba9.png" rel=""><img alt="17action_based_icons.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97392" data-unique="ech7o0jjt" src="https://academy.hsoub.com/uploads/monthly_2022_04/17action_based_icons.png.e63e30846d0b70cdc91685cf3afa2ba9.png" style="width: 600px; height: auto;"></a>
</p>

<p>
	يمكن أن يعني وضع عدم الاتصال عددًا من الأشياء اعتمادًا على السياق، مثل التنزيل، والتصدير، والتثبيت، وما إلى ذلك. لمزيد من المعرفة، راجع مجموعة <a href="https://material.io/resources/icons/" rel="external nofollow">أيقونات التصميم Material Design</a>.
</p>

<h3>
	استخدم عناصر نائبة في التخطيط ريثما يجهز المحتوى
</h3>

<p>
	<a href="https://academy.hsoub.com/design/user-experience/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%87%D9%8A%D9%83%D9%84-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%81%D9%8A-%D9%85%D8%AC%D8%A7%D9%84-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-r252/" rel="">مخطط الهيكل skeleton layout</a> للتطبيق هو عناصر نائبة توضع في هيكل التطبيق الرئيسي ريثما يُحمّل المحتوى الفعلي، يمكنك استخدامه لتوضّح للمستخدم أن محتوى الصفحة على وشك التحميل.
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97393" href="https://academy.hsoub.com/uploads/monthly_2022_04/18Skeleton_layout_during_download.png.30cdf3e7a4cb2774a3cb69ad1bc39b7e.png" rel=""><img alt="18Skeleton_layout_during_download.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97393" data-unique="95pb1k410" src="https://academy.hsoub.com/uploads/monthly_2022_04/18Skeleton_layout_during_download.thumb.png.885a1b5b9726c69f2475493b951ad54e.png"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97394" href="https://academy.hsoub.com/uploads/monthly_2022_04/19replace_skeleton_with_real_content.png.19ad77723ce70b75415ee44b36044e19.png" rel=""><img alt="19replace_skeleton_with_real_content.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97394" data-unique="4k8bo0noq" src="https://academy.hsoub.com/uploads/monthly_2022_04/19replace_skeleton_with_real_content.thumb.png.cd972207c309abcba9af0ac623e01dbd.png"></a>
</p>

<p>
	ثم وضع المحتوى مكان تلك العناصر النائبة متى ما انتهت عملية التحميل وأصبح المحتوى جاهزًا للعرض.
</p>

<h3>
	لا تعيق المحتوى
</h3>

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

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

<h2>
	صمم لجميع طبقات المستخدمين
</h2>

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

<p>
	اعرض خيارات <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> low bandwidth للمستخدمين ذوي اتصال الشبكة الضعيف، أي قدِّم أصولًا قليلةً للتطبيق إذا كان اتصال الشبكة بطيئ. أيضًا وفِّر ميزة للاختيار ما بين الأصول عالية الجودة و منخفضة الجودة.
</p>

<h2>
	الخلاصة
</h2>

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

<p>
	تذكر هذه الإرشادات عند تصميم تجربة المستخدم للشبكات غير المستقرة:
</p>

<ul>
<li>
		فكر في كيفية التصميم في حالة نجاح الاتصال بالشبكة وحالة فشل الاتصال وأيضًا عدم استقراره.
	</li>
	<li>
		إذا كانت تكلفة نقل أو تخزين البيانات مرتفعة في تطبيقك، يجب مراعاة إعلام المستخدم بذلك.
	</li>
	<li>
		بالنسبة لمعظم المستخدمين على مستوى العالم، فإن البيئة الفنية لاتصال الشبكة (مثلًا مكان المستخدم بالنسبة للموجِّه أو الرواتر) تكاد تكون متنقلة بحتًا.
	</li>
	<li>
		الأجهزة القديمة ذات الأداء المنخفض، بالإضافة لسعة تخزين وذاكرة وقدرة معالجة محدودة، وشاشات صغيرة بجودة قليلة، فتأكد أن يكون مراعاة الأداء على مثل هذه الأجهزة جزء من تصميمك.
	</li>
	<li>
		اسمح للمستخدمين بتصفح تطبيقك عندما يكونوا في وضع عدم اتصال.
	</li>
	<li>
		أعلِم المستخدمين بوضعهم الحالي وتَغيُّر حالتهم.
	</li>
	<li>
		حاول توفير وضع عدم الاتصال افتراضيًا إذا كان تطبيقك لا يحتاج بيانات كثيرة.
	</li>
	<li>
		إذا كان تطبيقك يعالج كمية كبيرة من البيانات، فأعلِم المستخدمين حول كيفية تنزيل البيانات للاستخدام دون اتصال.
	</li>
	<li>
		اجعل المستخدم قادر على التنقل بين الأجهزة مع المحافظة على نفس التجارب بينها لنفس التطبيق.
	</li>
	<li>
		استخدم كلًا من اللغة والأيقونات والتمثيل والكتابة واللون للتعبير عن الأفكار للمستخدم.
	</li>
	<li>
		قدم تشجيع وتطمين وردود أفعال لمساعدة المستخدم في فهم حالات التطبيق المختلفة.
	</li>
</ul>
<p>
	ترجمة -وبتصرف- للمقال <a href="https://web.dev/offline-ux-design-guidelines/" rel="external nofollow">Offline UX design guidelines</a> من موقع <a href="https://web.dev/" rel="external nofollow">web.dev</a>.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa%D8%9F-r1480/" rel="">ما هي تطبيقات الويب التقدمية PWA</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D9%81%D9%87%D9%88%D9%85-service-worker-%D9%88%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1%D9%87-%D9%81%D9%8A-%D8%A3%D8%AF%D8%A7%D8%A1-%D9%88%D8%A8%D9%86%D9%8A%D8%A9-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D9%88%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r833/" rel="">مفهوم Service Worker وتأثيره في أداء وبنية مواقع وتطبيقات الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A9-web-share-r1545/" rel="">مشاركة تطبيقات الويب التقدمية البيانات عبر الواجهة Web Share</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%A7%D8%AE%D8%AA%D8%B5%D8%A7%D8%B1%D8%A7%D8%AA-%D9%84%D9%84%D9%85%D9%87%D8%A7%D9%85-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r1543/" rel="">إضافة اختصارات للمهام الشائعة في تطبيقات الويب التقدمية PWA</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1546</guid><pubDate>Sat, 30 Apr 2022 16:22:33 +0000</pubDate></item><item><title>&#x62A;&#x646;&#x641;&#x64A;&#x630; &#x645;&#x634;&#x631;&#x648;&#x639; &#x62D;&#x627;&#x641;&#x644;&#x629; &#x645;&#x62F;&#x631;&#x633;&#x629; &#x645;&#x62A;&#x62D;&#x631;&#x643;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x628;&#x631;&#x646;&#x627;&#x645;&#x62C; &#x633;&#x643;&#x631;&#x627;&#x62A;&#x634;</title><link>https://academy.hsoub.com/programming/general/%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%AD%D8%A7%D9%81%D9%84%D8%A9-%D9%85%D8%AF%D8%B1%D8%B3%D8%A9-%D9%85%D8%AA%D8%AD%D8%B1%D9%83%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-r1550/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/62794fd54377e_-------.png.c638ce806e03d6f3d9e13a6f02de141f.png" /></p>

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

<p>
	لنحصل على النتيجة التالية:
</p>

<p style="width: 485px;margin: auto;">
	<iframe __idm_id__="376833" allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/486719199/?autostart=false" width="485"></iframe>
</p>

<p>
	اضغط على العلم الأخضر لتتحرك الكائنات! ولاحظ كيف تغير الكائنات مظهرها لخلق تأثير التحريك.
</p>

<p>
	التحريك أو الرسوم المتحركة Animaton هي عملية خلق تأثير الحركة عن طريق تغيير الصور بسرعة. اعتمد الرسامون قديمًا نحت الصور من كتل خشبية واستخدموها كطوابع، لكن يمكنك الآن استخدام برنامج <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> للحصول على رسوم متحركة بكل سهولة!
</p>

<h2>
	إنشاء مشهد الحافلة
</h2>

<p>
	سنختار في هذه الخطوة خلفيةً مناسبة ونضيف إليها كائنًا وهو الحافلة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98020" href="https://academy.hsoub.com/uploads/monthly_2022_05/bus-scene.png.d336f81e670ca99fa70afa7e51a41743.png" rel=""><img alt="bus-scene.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98020" data-unique="h1kqq4kbc" src="https://academy.hsoub.com/uploads/monthly_2022_05/bus-scene.png.d336f81e670ca99fa70afa7e51a41743.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	يمكنك العمل مباشرةً على <a href="https://scratch.mit.edu/projects/582214330/editor" rel="external nofollow">نسخة المتصفح</a> من سكراتش باستخدام الانترنت أو العمل على نسخة سطح المكتب من برنامج سكراتش بدون استخدام الانترنت.
</p>

<p>
	أولًا، اضغط على رمز <strong>اختيار خلفية</strong> من قائمة المنصة الموجود في الزاوية السفلية اليسرى:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98029" href="https://academy.hsoub.com/uploads/monthly_2022_05/ChooseBackdrop.png.03a969bb78458908b7937e94b102c84e.png" rel=""><img alt="ChooseBackdrop.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98029" data-unique="kn4vglxec" src="https://academy.hsoub.com/uploads/monthly_2022_05/ChooseBackdrop.png.03a969bb78458908b7937e94b102c84e.png" style="width: 250px; height: auto;"></a>
</p>

<p>
	ثم اختر خلفيةً مناسبةً لتشكل نقطة انطلاق للحافلة. اخترنا الخلفية التالية من الخلفيات الموجودة في التصنيف <strong>خارجي</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98037" href="https://academy.hsoub.com/uploads/monthly_2022_05/outdoor-backdrop.png.11c5e3d3aa18022ae25e694884c52e6c.png" rel=""><img alt="outdoor-backdrop.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98037" data-unique="y49qbj1a7" src="https://academy.hsoub.com/uploads/monthly_2022_05/outdoor-backdrop.png.11c5e3d3aa18022ae25e694884c52e6c.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	ثانيًا، اضغط على رمز <strong>اختيار كائن</strong> من قائمة المنصة أسفل اليسار:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98030" href="https://academy.hsoub.com/uploads/monthly_2022_05/ChooseSprite.png.1cdec85d274784a9202d7bcfdbdc6f21.png" rel=""><img alt="ChooseSprite.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98030" data-unique="c2u6qbmm5" src="https://academy.hsoub.com/uploads/monthly_2022_05/ChooseSprite.png.1cdec85d274784a9202d7bcfdbdc6f21.png" style="width: 250px; height: auto;"></a>
</p>

<p>
	ثم اكتب 'bus' في مربع البحث، وأضف كائن حافلة المدينة إلى مشروعك:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98022" href="https://academy.hsoub.com/uploads/monthly_2022_05/Bus.png.86757522a8330312def64b3d94d98296.png" rel=""><img alt="Bus.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98022" data-unique="90itx2sx0" src="https://academy.hsoub.com/uploads/monthly_2022_05/Bus.thumb.png.6c2bdb1443fccf65333d684e208eb2ba.png" style="width: 600px; height: auto;"></a>
</p>

<p>
	ثالثًا، انقر على كائن الحافلة لتحديده، ثم اسحب كتلة "عند نقر العلم الأخضر" من كتل الأحداث، والتي تسمح بتشغيل المشروع عند النقر عليها:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98021" href="https://academy.hsoub.com/uploads/monthly_2022_05/bus-sprite.png.ac7bb7a4422defccca936e5f10706b3e.png" rel=""><img alt="bus-sprite.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98021" data-unique="zhavtafue" src="https://academy.hsoub.com/uploads/monthly_2022_05/bus-sprite.png.ac7bb7a4422defccca936e5f10706b3e.png"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97998" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block1.png.01909704a3c86348ae05144088a84623.png" rel=""><img alt="Block1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97998" data-unique="hdf8h5t2a" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block1.png.01909704a3c86348ae05144088a84623.png" style="width: 250px; height: auto;"></a>
</p>

<p>
	ثم اسحب الحافلة وضعها في مكان مناسب على المنصة، كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98017" href="https://academy.hsoub.com/uploads/monthly_2022_05/bus-bottom-middle.png.4d21bcbf9de5e24ad208ee5225649faa.png" rel=""><img alt="bus-bottom-middle.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98017" data-unique="8b42dld2e" src="https://academy.hsoub.com/uploads/monthly_2022_05/bus-bottom-middle.png.4d21bcbf9de5e24ad208ee5225649faa.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	لاحظ أن إحداثيات محور x ومحور y التي تصف موضع الحافلة، تُعرض في قائمة الكائنات أسفل المنصة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98031" href="https://academy.hsoub.com/uploads/monthly_2022_05/coords-sprite-pane.png.30a4493992efc4bb1cb6bd3353f0ab96.png" rel=""><img alt="coords-sprite-pane.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98031" data-unique="sfbnfj3xl" src="https://academy.hsoub.com/uploads/monthly_2022_05/coords-sprite-pane.png.30a4493992efc4bb1cb6bd3353f0ab96.png" style="width: 400px; height: auto;"></a>
</p>

<p>
	رابعًا، أضف الكتلة التالية من كتل الحركة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98009" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block2.png.0a891707c2f8b20a8190c3b5697d9330.png" rel=""><img alt="Block2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98009" data-unique="c61p2ejek" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block2.png.0a891707c2f8b20a8190c3b5697d9330.png" style="width: 300px; height: auto;"></a>
</p>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98011" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block3.png.b52cb61125d0bc8d532109b4e9d020d3.png" rel=""><img alt="Block3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98011" data-unique="v06t2f5u8" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block3.png.b52cb61125d0bc8d532109b4e9d020d3.png" style="width: 300px; height: auto;"></a>
</p>

<p>
	كما يمكنك تغيير لون الحافلة باستخدام الكتلة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98012" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block4.png.f258930682b468994455ee0e00b63571.png" rel=""><img alt="Block4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98012" data-unique="1tvbgbrw0" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block4.png.f258930682b468994455ee0e00b63571.png" style="width: 350px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98040" href="https://academy.hsoub.com/uploads/monthly_2022_05/Sprite1.png.b504e4aab3806b591a9b37f01ac2ba45.png" rel=""><img alt="Sprite1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98040" data-unique="ab1kjr938" src="https://academy.hsoub.com/uploads/monthly_2022_05/Sprite1.png.b504e4aab3806b591a9b37f01ac2ba45.png" style="width: 400px; height: auto;"></a>
</p>

<p>
	يمكنك إضافة كائن القطة من رمز <strong>اختيار كائن</strong> عبر كتابة 'Cat' في مربع البحث. لاحظ أن القطة كبيرة بالنسبة إلى حجم الحافلة، لذلك عَدّل حجمها إلى القيمة <strong>50</strong> من مربع الحجم في نافذة الكائنات:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98028" href="https://academy.hsoub.com/uploads/monthly_2022_05/ChangeSize.png.4764746424d7c772df6dff500bb84079.png" rel=""><img alt="ChangeSize.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98028" data-unique="bvuizmjd6" src="https://academy.hsoub.com/uploads/monthly_2022_05/ChangeSize.png.4764746424d7c772df6dff500bb84079.png"></a>
</p>

<h2>
	جعل القطة تستقل الحافلة
</h2>

<p>
	سنعمل في هذه الخطوة على تحريك القطة من أقصى يمين المنصة إلى الحافلة لتبدو وكأنها تمشي وذلك عبر تكرار الحركات عدة مرات باستخدام <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%83%D8%B1%D8%A7%D8%B1%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r1306/" rel="">حلقة تكرار</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98026" href="https://academy.hsoub.com/uploads/monthly_2022_05/cat-catches-bus.png.729bbf4f1bde22a0b95ab936dfe230ca.png" rel=""><img alt="cat-catches-bus.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98026" data-unique="ldrojzcu0" src="https://academy.hsoub.com/uploads/monthly_2022_05/cat-catches-bus.png.729bbf4f1bde22a0b95ab936dfe230ca.png" style="width: 450px; height: auto;"></a>
</p>

<h3>
	وضع القطة في نقطة البداية
</h3>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98039" href="https://academy.hsoub.com/uploads/monthly_2022_05/sprite-pane-direction.png.90b1d4a0ab5ef3d924b0c57c4016cc47.png" rel=""><img alt="sprite-pane-direction.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98039" data-unique="6h28xqaqd" src="https://academy.hsoub.com/uploads/monthly_2022_05/sprite-pane-direction.png.90b1d4a0ab5ef3d924b0c57c4016cc47.png"></a>
</p>

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

<p>
	ثالثًا، أضف الكتل التالية لوضع القطة في نقطة البداية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98013" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block5.png.db1d9f91b3ea9c1cf3bdfb6b83a47487.png" rel=""><img alt="Block5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98013" data-unique="1mjyrfhcg" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block5.png.db1d9f91b3ea9c1cf3bdfb6b83a47487.png" style="width: 350px; height: auto;"></a>
</p>

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

<h3>
	تحريك القطة
</h3>

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

<p>
	أولًا، أضف كتلة كرر 10 مرات، ثم أضف داخلها كتلة تحرك 10 خطوات، كما يلي:
</p>

<p style="text-align: center;">
	<img alt="Block6.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98970" data-unique="5p1fbz8d6" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block6.png.d58cfca17ffe890817c4e2df6ae8d511.png" style="width: 450px; height: auto;"></p>

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

<p>
	ثانيًا، اضغط على نافذة <strong>المظاهر</strong> ولاحظ أن القطة لديها مظهرين.
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98014" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block7.png.7d946be444fd9aa31e1a51a04fa6d190.png" rel=""><img alt="Block7.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98014" data-unique="0f95auzin" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block7.png.7d946be444fd9aa31e1a51a04fa6d190.png" style="width: 500px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98015" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block8.png.6f7b9ec50928bf2081064cea964a3b74.png" rel=""><img alt="Block8.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98015" data-unique="ko450izit" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block8.png.6f7b9ec50928bf2081064cea964a3b74.png" style="width: 500px; height: auto;"></a>
</p>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98016" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block9.png.83b73a1adc514c5950be270fd1ba2f14.png" rel=""><img alt="Block9.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98016" data-unique="fk6eml91t" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block9.png.83b73a1adc514c5950be270fd1ba2f14.png" style="width: 500px; height: auto;"></a>
</p>

<p>
	سادسًا، اضغط على العلم الأخضر واستمتع بمشاهدة القطة وهي تستقل الحافلة.
</p>

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

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة</strong> احرص دائمًا على استخدام كتلة الإظهار مع كتلة الإخفاء ليعاود الكائن الظهور بعد اختفائه.
		</p>
	</div>
</blockquote>

<h2>
	جعل فرس النهر يطير نحو الحافلة
</h2>

<p>
	سنضيف في هذه الخطوة فرس نهر ونجعله يطير نحو الحافلة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98034" href="https://academy.hsoub.com/uploads/monthly_2022_05/hippo-flies.png.61a9c714d07a9ae88ecd4096ecee8e46.png" rel=""><img alt="hippo-flies.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98034" data-unique="wuofyihvb" src="https://academy.hsoub.com/uploads/monthly_2022_05/hippo-flies.png.61a9c714d07a9ae88ecd4096ecee8e46.png" style="width: 450px; height: auto;"></a>
</p>

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

<p>
	أولًا، أضف كائن فرس النهر ذو الاسم Hippo1، ثم غَيّر حجمه، وفقًا لما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98028" href="https://academy.hsoub.com/uploads/monthly_2022_05/ChangeSize.png.4764746424d7c772df6dff500bb84079.png" rel=""><img alt="ChangeSize.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98028" data-unique="bvuizmjd6" src="https://academy.hsoub.com/uploads/monthly_2022_05/ChangeSize.png.4764746424d7c772df6dff500bb84079.png"></a>
</p>

<p>
	ثانيًا، اسحب فرس النهر إلى الزاوية العلوية اليسرى من المنصة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98035" href="https://academy.hsoub.com/uploads/monthly_2022_05/hippo-sprite-stage.png.d147e7bc89bc1f3949950362be4194e9.png" rel=""><img alt="hippo-sprite-stage.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98035" data-unique="8z6fc3ckk" src="https://academy.hsoub.com/uploads/monthly_2022_05/hippo-sprite-stage.png.d147e7bc89bc1f3949950362be4194e9.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	ثالثًا، أضف الكتل التالية لوضع فرس النهر في نقطة البداية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97999" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block10.png.e2076a5125573c35dcfe828e978aa495.png" rel=""><img alt="Block10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97999" data-unique="agxggig8v" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block10.png.e2076a5125573c35dcfe828e978aa495.png" style="width: 350px; height: auto;"></a>
</p>

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

<p>
	رابعًا، أضف كتلة اتجه نحو واختر كائن الحافلة City Bus من النافذة المنسدلة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98000" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block11.png.03cd216e41dcb86f910dc27cc98454b0.png" rel=""><img alt="Block11.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98000" data-unique="0qc956akw" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block11.png.03cd216e41dcb86f910dc27cc98454b0.png" style="width: 500px; height: auto;"></a>
</p>

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

<p>
	خامسًا، أضف كتلتي الإظهار والإخفاء كما يلي، ليبدو الكائن كأنه يدخل الحافلة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98001" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block12.png.ca118c322d021ac49024e6efcf4bd26a.png" rel=""><img alt="Block12.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98001" data-unique="kta9mf3rw" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block12.png.ca118c322d021ac49024e6efcf4bd26a.png" style="width: 500px; height: auto;"></a>
</p>

<p>
	سادسًا، اضغط على العلم الأخضر واستمتع بمشاهدة فرس النهر يطير ويستقل الحافلة!
</p>

<h2>
	انطلاق الحافلة
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98018" href="https://academy.hsoub.com/uploads/monthly_2022_05/bus-leaving.png.7d3e7d8a01813f4442b3c7b369cc29d6.png" rel=""><img alt="bus-leaving.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98018" data-unique="hl9vwnsnp" src="https://academy.hsoub.com/uploads/monthly_2022_05/bus-leaving.png.7d3e7d8a01813f4442b3c7b369cc29d6.png" style="width: 450px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98002" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block13.PNG.0769a0159f83ced5a3f26bc2c2e2c26a.PNG" rel=""><img alt="Block13.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98002" data-unique="4ni2s37h0" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block13.PNG.0769a0159f83ced5a3f26bc2c2e2c26a.PNG" style="width: 350px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98019" href="https://academy.hsoub.com/uploads/monthly_2022_05/bus-right.png.f2ebede9213b46cb60d8d352b1414178.png" rel=""><img alt="bus-right.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98019" data-unique="8i8ibvssg" src="https://academy.hsoub.com/uploads/monthly_2022_05/bus-right.png.f2ebede9213b46cb60d8d352b1414178.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	ثالثًا، أضف كتلة انزلق إلى الموضع من كتل الحركة. لاحظ أن إحداثيات الموضع قد تكون مختلفة في مشروعك.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98003" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block14.PNG.586a3aa6c89f6a174e64685596e650e6.PNG" rel=""><img alt="Block14.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98003" data-unique="t48040rn7" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block14.PNG.586a3aa6c89f6a174e64685596e650e6.PNG" style="width: 450px; height: auto;"></a>
</p>

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

<p>
	خامسًا، أضف كتلة الإخفاء لتبدو الحافلة وكأنها تغادر المنصة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98004" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block15.PNG.898cf86f1467ab1dfd58549832155197.PNG" rel=""><img alt="Block15.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98004" data-unique="xs1qk0e5o" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block15.PNG.898cf86f1467ab1dfd58549832155197.PNG" style="width: 450px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98005" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block16.PNG.89fab94768e66e76e08b8bf59cbb338b.PNG" rel=""><img alt="Block16.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98005" data-unique="j6za627eq" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block16.PNG.89fab94768e66e76e08b8bf59cbb338b.PNG" style="width: 450px; height: auto;"></a>
</p>

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

<h2>
	التأخر على الحافلة
</h2>

<p>
	هل تساءلت ماذا سيحدث لو أن القطة لم تركض بالسرعة الكافية للحاق بالحافلة؟ اتبع الخطوات التالية لتحصل على الجواب!
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98027" href="https://academy.hsoub.com/uploads/monthly_2022_05/cat-misses-bus.png.08dc62489bd7c0ed7e66732479791592.png" rel=""><img alt="cat-misses-bus.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98027" data-unique="82c2gmj6y" src="https://academy.hsoub.com/uploads/monthly_2022_05/cat-misses-bus.png.08dc62489bd7c0ed7e66732479791592.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	أولًا، انقر على كائن القطة ثم أضف كتلة انتظار كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98006" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block17.PNG.039bf434639a236e85a88b516c38b501.PNG" rel=""><img alt="Block17.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98006" data-unique="kd44zvp0k" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block17.thumb.PNG.96a9fd1d101ade66e3826146b42ac7df.PNG" style="width: 380px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98007" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block18.PNG.99a0b902ba20e42210ce160538a8eb87.PNG" rel=""><img alt="Block18.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98007" data-unique="rmqklxvmd" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block18.PNG.99a0b902ba20e42210ce160538a8eb87.PNG" style="width: 350px; height: auto;"></a>
</p>

<p>
	ثالثًا، اضغط على العلم الأخضر ولاحظ أن القطة ستمشي بسرعة أكبر. كما يمكنك تقليل وقت الانتظار إلى نصف ثانية، أو ربع ثانية 0.25، أو عشر الثانية 0.1.
</p>

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

<ul>
<li>
		احذف كتلة الاختفاء كي تبقى القطة على المنصة وتفوتها الحافلة:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98008" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block19.PNG.9b78925f6e6d17f11df8413f9d6e7845.PNG" rel=""><img alt="Block19.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98008" data-unique="ddi08c6fb" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block19.thumb.PNG.c3aff565ae0bf5cbefc6cc98aa6cce9f.PNG" style="width: 400px; height: auto;"></a>
</p>

<ul>
<li>
		زِدّ وقت انتظار الحافلة، كي تتمكن القطة من اللحاق بها، ولا تنسى إضافة كتلة الاختفاء:
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98010" href="https://academy.hsoub.com/uploads/monthly_2022_05/Block20.PNG.07ddffb65872cf99d54bb1541411bb82.PNG" rel=""><img alt="Block20.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98010" data-unique="16zug6ltu" src="https://academy.hsoub.com/uploads/monthly_2022_05/Block20.PNG.07ddffb65872cf99d54bb1541411bb82.PNG" style="width: 500px; height: auto;"></a>
</p>

<p>
	خامسًا، أجرِ التعديلات التي تراها مناسبة لتحصل على مشهد مميز! ولا تنسى حفظ المشروع.
</p>

<h2>
	تغيير الوجهة
</h2>

<p>
	يمكنك تغيير وجهة الحافلة من "جولات سكراتش" إلى وجهة من اختيارك. إلى أين تريد أن تذهب حافلتك؟
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98036" href="https://academy.hsoub.com/uploads/monthly_2022_05/maker-bus.png.686e7bd9df99001566021508322aca47.png" rel=""><img alt="maker-bus.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98036" data-unique="or6rc4zda" src="https://academy.hsoub.com/uploads/monthly_2022_05/maker-bus.png.686e7bd9df99001566021508322aca47.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	أولًا، انقر على كائن الحافلة لتحديده ثم انقر على نافذة <strong>المظاهر</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98033" href="https://academy.hsoub.com/uploads/monthly_2022_05/costumes-bus-sprite-highlighted.PNG.7b49d3d6ff6390b31e00cdef78093ae3.PNG" rel=""><img alt="costumes-bus-sprite-highlighted.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98033" data-unique="h20ey5wra" src="https://academy.hsoub.com/uploads/monthly_2022_05/costumes-bus-sprite-highlighted.thumb.PNG.5e1c38bcbc2ad2ffd369061bc88eaf8e.PNG" style="width: 650px; height: auto;"></a>
</p>

<p>
	ثانيًا، انقر على النص المكتوب باللغة الانجليزية "Scratch Tours" لتحديده، ثم انقر على خيار الحذف لحذفه أو اضغط مفتاح Delete من لوحة المفاتيح.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98025" href="https://academy.hsoub.com/uploads/monthly_2022_05/BusTextSelected.PNG.5c20523c9185b24a286b92fc9dce6d47.PNG" rel=""><img alt="BusTextSelected.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98025" data-unique="zaqoxtjpu" src="https://academy.hsoub.com/uploads/monthly_2022_05/BusTextSelected.thumb.PNG.68c7cf4db8066606473679a644de3e2c.PNG" style="width: 650px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98024" href="https://academy.hsoub.com/uploads/monthly_2022_05/BusNewLabel.PNG.3aa661733969aee4e6c85113d62c1cc8.PNG" rel=""><img alt="BusNewLabel.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98024" data-unique="o88ak19jd" src="https://academy.hsoub.com/uploads/monthly_2022_05/BusNewLabel.thumb.PNG.411465b1613152167a431ad3b03d4baf.PNG" style="width: 650px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="98038" href="https://academy.hsoub.com/uploads/monthly_2022_05/Select-Tool.PNG.10ce6fe19f9a77b3f9db9205f267f605.PNG" rel=""><img alt="Select-Tool.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="98038" data-unique="jotgv0nmq" src="https://academy.hsoub.com/uploads/monthly_2022_05/Select-Tool.thumb.PNG.b8d92d4ee977f2d527daad33c68503c2.PNG" style="width: 650px; height: auto;"></a>
</p>

<h2>
	اختبر معلوماتك
</h2>

<p>
	انعش ذاكرتك واختبر معلوماتك بالإجابة عن الأسئلة التالية:
</p>

<ol>
<li>
		<strong>السؤال الأول:</strong> متى تنطلق الحافلة بناءً على الكتلتين التالتين؟ (حاول تذكر ما تعلمناه قبل الإطلاع على الإجابة أدناه)
	</li>
</ol>
<ul style="margin-right: 40px;">
<li>
		<strong>الإجابة الصحيحة :</strong> بعد 4 ثوان من الضغط على العلم الأخضر.
	</li>
</ul>
<ol start="2">
<li>
		<strong>السؤال الثاني:</strong> أي من خصائص الكائن تتغير تلقائيًا عند تغيير موضع الكائن؟
	</li>
</ol>
<ul style="margin-right: 40px;">
<li>
		<strong>الإجابة الصحيحة :</strong> تتغير إحداثيات المحورين x وy عند سحب الكائن إلى موضع جديد على المنصة.
	</li>
</ul>
<ol start="3">
<li>
		. <strong>السؤال الثالث:</strong> ماهي فائدة كتلة التكرار التالية؟
	</li>
</ol>
<p style="text-align: center;">
	<img alt="question3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="98971" data-unique="812savgk8" src="https://academy.hsoub.com/uploads/monthly_2022_05/question3.png.f73065123e373495218135f3868b248a.png" style="width: 280px; height: auto;"></p>

<ul style="margin-right: 40px;">
<li>
		<strong>الإجابة الصحيحة :</strong> تكرار الحركة 5 خطوات وتغيير المظهر ليبدو الكائن وكأنه يتحرك.
	</li>
</ul>
<h2>
	ترقية المشروع
</h2>

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

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

<p style="text-align: center;">
	<img alt="Lyla-bus.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="98041" data-unique="vmh0ykmxh" src="https://academy.hsoub.com/uploads/monthly_2022_05/Lyla-bus.gif.623b20a97c107d7c4396c198418eeb5b.gif"></p>

<h2>
	ختامًا
</h2>

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

<p>
	ننصحك بتنفيذ مشروع البحث عن الحشرات باستخدام سكراتش كخطوتك التالية، وإذا واجهت مشاكل مع برنامج سكراتش فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في <a href="https://academy.hsoub.com/questions/" rel="">أكاديمية حسوب</a>
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://projects.raspberrypi.org/en/projects/catch-the-bus/0" rel="external nofollow">Catch the bus</a> من <a href="https://raspberrypi.org/" rel="external nofollow">الموقع الرسمي لراسبيري باي</a>.
</p>

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

<ul>
<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/general/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%85%D8%B4%D9%87%D8%AF-%D9%81%D8%B6%D8%A7%D8%A6%D9%8A-%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-r1531/" rel="">إنشاء مشهد فضائي باستخدام سكراتش</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%A3%D8%B6%D9%88%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%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-r1482/" rel="">إنشاء لعبة أضواء باستخدام برنامج سكراتش وحاسوب راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%84%D8%B9%D8%A8%D8%A9-%D8%A7%D9%84%D8%B3%D9%84%D9%83-%D9%88%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%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-r1495/" rel="">تصميم لعبة السلك والحلقة باستخدام برنامج سكراتش وحاسوب راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B5%D8%A8%D8%A7%D8%AD-%D9%84%D9%8A%D8%AF-%D8%AB%D9%84%D8%A7%D8%AB%D9%8A-%D8%A7%D9%84%D8%A3%D8%A8%D8%B9%D8%A7%D8%AF-%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%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-r1504/" rel="">تنفيذ مصباح ليد ثلاثي الأبعاد باستخدام سكراتش ولوحة راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%B5%D9%86%D8%B9-%D8%A2%D9%84%D8%A9-%D9%85%D9%88%D8%B3%D9%8A%D9%82%D9%8A%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-%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-r1505/" rel="">صنع آلة موسيقية باستخدام سكراتش وحاسوب راسبيري باي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1550</guid><pubDate>Wed, 11 May 2022 15:05:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x643;&#x648;&#x646;&#x627;&#x62A; &#x627;&#x644;&#x631;&#x626;&#x64A;&#x633;&#x64A;&#x629; &#x644;&#x644;&#x623;&#x62F;&#x627;&#x629; Performance &#x644;&#x62A;&#x62D;&#x644;&#x64A;&#x644; &#x623;&#x62F;&#x627;&#x621; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628;</title><link>https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D9%85%D9%83%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9-%D9%84%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-performance-%D9%84%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A3%D8%AF%D8%A7%D8%A1-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1541/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_04/626d0670ce2bf_---Performance.png.13947136999a7d130765dc509dcb0a06.png" /></p>

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

<h2>
	الأداة Waterfall
</h2>

<p>
	تقدِّم لك هذه الأداة عرضًا للأعمال التي ينفِّذها المتصفح عندما يستعرض موقعك أو تطبيقك، ويعتمد عمل الأداة على فكرة أنّ الأشياء التي ينفذها المتصفح عندما يستعرض موقعًا يمكن تصنيفها ضمن عدة فئات منها تشغيل <a href="https://academy.hsoub.com/programming/javascript/%D9%86%D9%85%D8%B7-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r785/?msclkid=a3286e24c86611ec848cfe770a0cb670" rel="">شيفرة جافاسكربت</a> وتحديث مخطط الصفحة وغيرها، وأنّ ما ينفذه المتصفح في لحظة ما هو شيء واحد فقط، فإذا لاحظت علامةً على مشكلة في الأداء مثل انخفاض عدد إطارات مع الزمن، فيمكنك التوجه إلى الأداة Waterfall لترى ما كان يفعله المتصفح في هذه اللحظة إذا كنت تسجل ملف الأداء.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97318" href="https://academy.hsoub.com/uploads/monthly_2022_04/01_waterfall_tool.png.d4854bbc5d5a2491c3ba3603a0fd650d.png" rel=""><img alt="01_waterfall_tool.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97318" data-unique="f98l6rlbt" src="https://academy.hsoub.com/uploads/monthly_2022_04/01_waterfall_tool.thumb.png.bf1d1bdae67bd3f4e54d29b09d0e4fd3.png" style="width: 650px; height: auto;"></a>
</p>

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

<h3>
	العلامات
</h3>

<p>
	تملك العلامات التي ترتبط بالعمليات المنفذة نظامًا لونيًا محددًا وسنستعرضها في هذا القسم:
</p>

<ul>
<li>
		<p>
			<strong>أحداث DOM</strong>: تمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97342" href="https://academy.hsoub.com/uploads/monthly_2022_04/color1.png.e89d86541a0c017b33eaa8b259860f5c.png" rel=""><img alt="color1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97342" data-unique="i4ctg542h" src="https://academy.hsoub.com/uploads/monthly_2022_04/color1.png.e89d86541a0c017b33eaa8b259860f5c.png" style="width: 50px; height: auto;"></a>، وهي شيفرة جافاسكربت التي تُنفَّذ على أساس استجابة <a href="https://academy.hsoub.com/programming/javascript/%D9%81%D9%87%D9%85-%D8%A7%D9%84%D8%A3%D8%AD%D8%AF%D8%A7%D8%AB-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r690/?msclkid=4b359ef0c86c11ecafaef054c57d27e9" rel="" style="background-color: rgb(255, 255, 255);">لأحداث DOM</a>. تقدم هذه العلامات معلومات عن ما يلي:
		</p>

		<ul>
<li>
				نوع الحدث Event type: مثل نقرة click أو رسالة message.
			</li>
			<li>
				مرحلة الحدث Event Phase: مثل هدف Target أو التقاط Capture.
			</li>
		</ul>
</li>
	<li>
		<p>
			<strong>دوال جافاسكربت</strong>: تُمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97342" href="https://academy.hsoub.com/uploads/monthly_2022_04/color1.png.e89d86541a0c017b33eaa8b259860f5c.png" rel=""><img alt="color1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97342" data-unique="i4ctg542h" src="https://academy.hsoub.com/uploads/monthly_2022_04/color1.png.e89d86541a0c017b33eaa8b259860f5c.png" style="width: 50px; height: auto;"></a>، وهي الدوال التي ينفِّذها المتصفح في صفحة الويب وتُعنون وفقًا للسبب الذي استُدعي التابع لأجله، كما تقدِّم المعلومات على صورة مكدّس استدعاءات call stack مزوَّد بروابط إلى هذه الدوال:
		</p>

		<ul>
<li>
				Script tag: تتعلق بالتعامل مع وسوم الشيفرة.
			</li>
			<li>
				setInterval: تتعلق بضبط الفترات الزمنية.
			</li>
			<li>
				setTimeout: تتعلق بتحديد زمن انتهاء العملية.
			</li>
			<li>
				requestAnimationFrame: تتعلق بطلبات إطار رسومي.
			</li>
			<li>
				Promise Callback: وتتعلق ياستدعاءات الوعود Promises.
			</li>
			<li>
				Promise Init: وتتعلق بتهيئة الوعود.
			</li>
			<li>
				Workers: تتعلق بعمّال ويب.
			</li>
			<li>
				JavaScript URI: تتعلق بعناوين موارد جافاسكربت.
			</li>
			<li>
				Event Handler: تتعلق بمعالجة الأحداث.
			</li>
		</ul>
</li>
	<li>
		<strong>تفسير HTML</strong>: تُمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97342" href="https://academy.hsoub.com/uploads/monthly_2022_04/color1.png.e89d86541a0c017b33eaa8b259860f5c.png" rel=""><img alt="color1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97342" data-unique="i4ctg542h" src="https://academy.hsoub.com/uploads/monthly_2022_04/color1.png.e89d86541a0c017b33eaa8b259860f5c.png" style="width: 50px; height: auto;"></a> وتمثِّل الوقت المستغرق في تفسير شيفرة <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> لصفحة الويب، كما تُقدِّم المعلومات على صورة مكدّس استدعاءات call stack مزوَّد بروابط إلى الدوال المستخدَمة.
	</li>
	<li>
		<strong>تفسير XML</strong>: تُمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97342" href="https://academy.hsoub.com/uploads/monthly_2022_04/color1.png.e89d86541a0c017b33eaa8b259860f5c.png" rel=""><img alt="color1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97342" data-unique="i4ctg542h" src="https://academy.hsoub.com/uploads/monthly_2022_04/color1.png.e89d86541a0c017b33eaa8b259860f5c.png" style="width: 50px; height: auto;"></a> وتمثِّل الوقت المستغرق في تفسير شيفرة <a href="https://academy.hsoub.com/programming/java/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%85%D8%AE%D8%AA%D8%B5%D8%B1%D8%A9-%D9%84%D9%84%D8%BA%D8%A9-xml-%D9%88%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84%D9%87%D8%A7-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%AC%D8%A7%D9%81%D8%A7-r1475/?msclkid=aab68157c87011ec98ee5f68040eb260" rel="">XML</a> لصفحة الويب، كما تُقدِّم المعلومات على صورة مكدّس استدعاءات مزوَّد بروابط إلى الدوال المستخدَمة.
	</li>
	<li>
		<strong>إعادة ضبط التنسيق Recalculate Style</strong>: تُمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97343" href="https://academy.hsoub.com/uploads/monthly_2022_04/color2.png.efe5058d633f6aeb94bd359f3b874f40.png" rel=""><img alt="color2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97343" data-unique="v9zgodhqi" src="https://academy.hsoub.com/uploads/monthly_2022_04/color2.png.efe5058d633f6aeb94bd359f3b874f40.png" style="width: 50px; height: auto;"></a>، وتعرض الحسابات اللازمة لضبط التنسيق المحدد لعناصر الصفحة، كما تقدِّم المعلومات على صورة تلميحات لإعادة التنسيق Restyle Hint، والتي هي قيم نصية تشير إلى نوع إعادة التنسيق الواجب تطبيقه وتأخذ القيم التالية:
		<ul>
<li>
				Self.
			</li>
			<li>
				Subtree.
			</li>
			<li>
				LaterSiblings.
			</li>
			<li>
				CSSTransitions.
			</li>
			<li>
				CSSAnimations.
			</li>
			<li>
				SVGAttrAnimations.
			</li>
			<li>
				StyleAttribute.
			</li>
			<li>
				StyleAttribute_Animations.
			</li>
			<li>
				Force.
			</li>
			<li>
				ForceDescendants.
			</li>
		</ul>
</li>
	<li>
		<strong>ضبط التخطيط Layout</strong>: تُمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97343" href="https://academy.hsoub.com/uploads/monthly_2022_04/color2.png.efe5058d633f6aeb94bd359f3b874f40.png" rel=""><img alt="color2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97343" data-unique="v9zgodhqi" src="https://academy.hsoub.com/uploads/monthly_2022_04/color2.png.efe5058d633f6aeb94bd359f3b874f40.png" style="width: 50px; height: auto;"></a> وتعرض الحسابات اللازمة لتحديد موقع وحجم عناصر الصفحة، كما تدعى هذه العملية بإعادة الإنسياب reflow أحيانًا.
	</li>
	<li>
		<strong>رسم الصفحة Paint</strong>: تُمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97344" href="https://academy.hsoub.com/uploads/monthly_2022_04/color3.png.ff6a000b11312cb9a9bf1e038492aa59.png" rel=""><img alt="color3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97344" data-unique="a7wtlr5wa" src="https://academy.hsoub.com/uploads/monthly_2022_04/color3.png.ff6a000b11312cb9a9bf1e038492aa59.png" style="width: 50px; height: auto;"></a> وترسم البكسلات على الشاشة.
	</li>
	<li>
		<strong>تجميع الموارد المستهلكة Garbage Collection</strong> تُمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97345" href="https://academy.hsoub.com/uploads/monthly_2022_04/color4.png.190a8e8b8d749014ed43c2c4af016690.png" rel=""><img alt="color4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97345" data-unique="f5il6zz2j" src="https://academy.hsoub.com/uploads/monthly_2022_04/color4.png.190a8e8b8d749014ed43c2c4af016690.png" style="width: 50px; height: auto;"></a> وتعرض أحداث تجميع الموارد المستهلكة، ويُشار إلى أحداث تجميع الموارد المستهلكة اللاتصاعدي بالعبارة Non-incremental، كما تُقدِّم المعلومات على صورة قيم نصية وهي:
		<ul>
<li>
				"ReasonA": سلسلة نصية تدل على سبب استخدام مجمع الموارد المستهلكة GC.
			</li>
			<li>
				"Non-incremental Reason": سلسلة نصية تدل على سبب استخدام مجمع الموارد المستهلكة اللاتصاعدي.
			</li>
			<li>
				ستجد في فايرفوكس 46 ميزةً جديدةً هي تجميع الموارد المستهلكة، نظرًا لضغوطات ناتجة عن حجز الذاكرة، حيث يظهر في هذه الحالة رابطًا بعنوان عرض المسببات الناتجة عن حجز الذاكرة Show Allocation Triggers. انقر عندها على الرابط لتتابع ملف الأداء المتعلق بحجز الذاكرة، وصولًا إلى لحظة وقوع حدث تجميع الموارد المستهلكة.
			</li>
		</ul>
</li>
	<li>
		<strong>تدوير المستهلكات Cycle Collection</strong>: تُمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97345" href="https://academy.hsoub.com/uploads/monthly_2022_04/color4.png.190a8e8b8d749014ed43c2c4af016690.png" rel=""><img alt="color4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97345" data-unique="f5il6zz2j" src="https://academy.hsoub.com/uploads/monthly_2022_04/color4.png.190a8e8b8d749014ed43c2c4af016690.png" style="width: 50px; height: auto;"></a>، وهي عملية تحرير بُنى البيانات التي تُخزِّن أرقام المراجع في اللغة ++C، وتشبه هذه العملية تجميع الموارد المستهلكة لكنها خاصة بكائنات <a href="https://academy.hsoub.com/programming/cpp/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-c-r802/?msclkid=8135a001c86d11ecb95c073325ea8e23" rel="">++C</a>، وهذه العمليات دائمًا من النوع تجميع Collect.
	</li>
	<li>
		<strong>اختزال المنحني البياني لعملية تدوير المستهلكات CC Graph Reduction</strong>: تُمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97345" href="https://academy.hsoub.com/uploads/monthly_2022_04/color4.png.190a8e8b8d749014ed43c2c4af016690.png" rel=""><img alt="color4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97345" data-unique="f5il6zz2j" src="https://academy.hsoub.com/uploads/monthly_2022_04/color4.png.190a8e8b8d749014ed43c2c4af016690.png" style="width: 50px; height: auto;"></a>، وتضم عمليتي التحضير أو التحسين الأولي لتدوير المستهلكات CC، وتكون هذه العمليات دائمًا من نوع تجاهل ما يمكن تجاوزه ForgetSkippable.
	</li>
	<li>
		<strong>العلامة Console</strong>: تُمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97346" href="https://academy.hsoub.com/uploads/monthly_2022_04/color5.png.31818420a8b483e153e7642be8399e44.png" rel=""><img alt="color5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97346" data-unique="3zvydgixj" src="https://academy.hsoub.com/uploads/monthly_2022_04/color5.png.31818420a8b483e153e7642be8399e44.png" style="width: 50px; height: auto;"></a>، وهي الفترة الزمنية بين استدعائين مترابطين للدالتين <code style="font-size: 16px;">()console.time</code> و<code style="font-size: 16px;">()console.timeEnd</code>، كما تُقدِّم المعلومات عبر:
		<ul>
<li>
				<strong>اسم المؤقت Timer name</strong>: على هيئة وسيط يمرَّر إلى الدالة <code>console</code>.
			</li>
			<li>
				<strong>المكدس في البداية stack at start</strong>: يعرض حالة مكدس الاستدعاء عند استدعاء الدالة <code>()console.time</code> مع روابط إلى بقية الدوال.
			</li>
			<li>
				<strong>المكدس في النهاية stack at end</strong>: وهو جديد في فايرفوكس 46، إذ يعرض حالة مكدس الاستدعاء عند استدعاء الدالة <code>()console.timeEnd</code>، فإذا كان الاستدعاء داخل وعد <code>Promise</code>؛ فسيعرض أيضًا القيمة النصية "Async stack".
			</li>
		</ul>
</li>
	<li>
		<strong>العلامة Timestamp</strong>: تُمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97347" href="https://academy.hsoub.com/uploads/monthly_2022_04/color6.png.6a92ef42f7d7fef4196674b0d4d164f9.png" rel=""><img alt="color6.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97347" data-unique="rmwtmpfj2" src="https://academy.hsoub.com/uploads/monthly_2022_04/color6.png.6a92ef42f7d7fef4196674b0d4d164f9.png" style="width: 50px; height: auto;"></a>، وهي استدعاء مفرد للدالة <code style="font-size: 16px;">()console.timeStamp</code>، كما تُظهر الوسيط الذي مُرِّر إلى هذه الدالة.
	</li>
	<li>
		<strong>تحميل محتوى DOM</strong>: تُمثّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97345" href="https://academy.hsoub.com/uploads/monthly_2022_04/color4.png.190a8e8b8d749014ed43c2c4af016690.png" rel=""><img alt="color4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97345" data-unique="f5il6zz2j" src="https://academy.hsoub.com/uploads/monthly_2022_04/color4.png.190a8e8b8d749014ed43c2c4af016690.png" style="width: 50px; height: auto;"></a>، وتُظهر الحدث <code style="font-size: 16px;">DOMContentLoaded</code>.
	</li>
	<li>
		<strong>تحميل Load</strong>: تُمثّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97347" href="https://academy.hsoub.com/uploads/monthly_2022_04/color6.png.6a92ef42f7d7fef4196674b0d4d164f9.png" rel=""><img alt="color6.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97347" data-unique="rmwtmpfj2" src="https://academy.hsoub.com/uploads/monthly_2022_04/color6.png.6a92ef42f7d7fef4196674b0d4d164f9.png" style="width: 50px; height: auto;"></a>، وتظهر حدث تحميل المستند <code style="font-size: 16px;">load</code>.
	</li>
	<li>
		<strong>أحداث عمّال ويب في الخيط الأساسي Worker event in main thread</strong>: تُمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97342" href="https://academy.hsoub.com/uploads/monthly_2022_04/color1.png.e89d86541a0c017b33eaa8b259860f5c.png" rel=""><img alt="color1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97342" data-unique="i4ctg542h" src="https://academy.hsoub.com/uploads/monthly_2022_04/color1.png.e89d86541a0c017b33eaa8b259860f5c.png" style="width: 50px; height: auto;"></a>، وتظهر الحالات التي يرسل فيها الخيط الأساسي رسائل إلى عمّال الويب أو التي يستقبل فيها رسائل من العمّال، كما وتأخذ إحدى القيمتين:
		<ul>
<li>
				تهيئة البيانات على الخيط الرئيسي Serialize data on the main thread*، إذ يحوِّل الخيط الرئيسي الرسالة إلى صيغة مناسبة كي تُرسَل إلى العامل.
			</li>
			<li>
				تجميع البيانات على الخيط الرئيسي Deserialize data on the main thread: إذ يحوّل الخيط الرئيسي البيانات القادمة من العمال إلى بنية يمكن تخزينها أو عرضها.
			</li>
		</ul>
</li>
	<li>
		<p>
			<strong>أحداث عمال ويب في خيط العمال Worker event in worker thread</strong>: تُمثَّل باللون<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97348" href="https://academy.hsoub.com/uploads/monthly_2022_04/color7.png.aa0bbb9a7eed4aa0d1712114e4e457c2.png" rel=""><img alt="color7.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97348" data-unique="zax0kahic" src="https://academy.hsoub.com/uploads/monthly_2022_04/color7.png.aa0bbb9a7eed4aa0d1712114e4e457c2.png" style="width: 50px; height: auto;"></a>، وتظهر الحالات التي يرسَل فيها العامل رسائلًا إلى الخيط الرئيسي، أو التي يستقبل فيها رسائل من الخيط الرئيسي، كما تأخذ إحدى القيمتين:
		</p>

		<ul>
<li>
				تهيئة البيانات للعامل Serialize data in worker: إذ يحوِّل العامل الرسالة إلى صيغة مناسبة كي تُرسَل إلى الخيط الرئيسي.
			</li>
			<li>
				تجميع البيانات عند العامل Deserialize data in worker: ويحوِّل العامل البيانات القادمة من الخيط الرئيسي إلى بنية يمكن للعامل فهمها.
			</li>
		</ul>
</li>
</ul>
<p>
	تملك العلامات النمط اللوني نفسه في الأدلة Waterfall وفي لوحة النظرة العامة عندما تعرض هذه الأداة، مما يُسهِّل المطابقة بينهما.
</p>

<h4>
	ترشيح العلامات
</h4>

<p>
	يمكنك التحكم بالعلامات التي تريد استعراضها، وذلك من خلال زر الترشيح ضمن شريط الأدوات:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97319" href="https://academy.hsoub.com/uploads/monthly_2022_04/02_filter_markers.png.e5a36d5d89776f758aedfce94217b625.png" rel=""><img alt="02_filter_markers.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97319" data-unique="h452b6ne6" src="https://academy.hsoub.com/uploads/monthly_2022_04/02_filter_markers.thumb.png.ce385048b8653b3123a9df5d61b4a690.png" style="width: 650px; height: auto;"></a>
</p>

<h3>
	أنماط لعمليات تشير إليها الأداة Waterfall
</h3>

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

<h4>
	تصيير التنفيذ المتسلل لعمل المتصفح
</h4>

<p>
	قد تعرض لك الأداة Waterfall النمط التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97320" href="https://academy.hsoub.com/uploads/monthly_2022_04/03_rendering_waterfall.png.d4764393fb9e59cba7a680c9a71fef1e.png" rel=""><img alt="03_rendering_waterfall.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97320" data-unique="rxjqsxuts" src="https://academy.hsoub.com/uploads/monthly_2022_04/03_rendering_waterfall.png.d4764393fb9e59cba7a680c9a71fef1e.png" style="width: 600px; height: auto;"></a>
</p>

<p>
	يمثل الشكل السابق تصوّرًا للخوارزمية الأساسية التي يعتمدها المتصفح في الاستجابة لحدث:
</p>

<ol>
<li>
		استدعاء دالة جافاسكربت: تتسبب بعض الأحداث في صفحة ويب مثل أحداث DOM، بتنفيذ شيفرة جافاسكربت، وقد تغيّر هذه الشيفرة بعض أجزاء <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%B4%D8%AC%D8%B1%D8%A9-dom-%D9%84%D8%AA%D8%B9%D8%AF%D9%8A%D9%84%D9%87%D8%A7-%D8%B9%D8%A8%D8%B1-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1104/?msclkid=578c5b65c86e11ec9fc5de60658d6c82" rel="">شجرة DOM</a> أو شجرة CSSOM.
	</li>
	<li>
		إعادة ضبط التنسيق: إذا لاحظ المتصفح تغيرات في التنسيق المحسوب لعناصر الصفحة، فلا بد من إعادة الحسابات وضبط التنسيق مجددًا.
	</li>
	<li>
		تخطيط الصفحة: يستخدِم المتصفح التنسيق المحسوب حديثًا في تقدير موقع وهندسة العناصر في الصفحة.، إذ تدعى هذه العملية بتخطيط الصفحة Layout، كما تدعى أحيانًا إعادة إنسياب reflow.
	</li>
	<li>
		رسم الصفحة: لا بد أخيرًا من إعادة رسم الصفحة على الشاشة، في حين لا تظهر الخطوة الأخيرة على الشاشة، وهي إمكانية تقسيم الصفحة إلى طبقات يُعاد رسمها بصورة مستقلة، ومن ثم يعاد دمجها بعملية التركيب Composition.
	</li>
</ol>
<p>
	لا بد أن يتسع إطار واحد للتسلسل السابق طالما أنّ الشاشة لن تُحدَّث حتى اكتمال سلسلة التنفيذ السابقة، ومن المعروف أنّ معدل 60 إطار في الثانية كاف لإظهار الرسوميات المتحركة بسلاسة ونعومة على الشاشة، ويتطلب هذا من المتصفح تنفيذ السلسلة السابقة خلال 16.7 ميلي ثانية، كما من المهم معرفة من منظور الاستجابة أنّ المتصفح لا ينفِّذ بالضرورة كل خطوة من الخطوات السابقة:
</p>

<ul>
<li>
		تُحدِّث رسوميات <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> الصفحة دون تنفيذ أيّ شيفرة <a href="https://wiki.hsoub.com/JavaScript" rel="external">جافاسكربت</a>.
	</li>
	<li>
		لا يعيد كل تغيير في خصائص تنسيق CSS تخطيط الصفحة، وإنما فقط تلك الخصائص التي تغيِّر موقع وهندسة العناصر، مثل <code>width</code> أو <code>display</code> أو <code>font-size</code> أو <code>top</code>؛ بينما لا تغير الخصائص مثل <code>color</code> أو <code>opacity</code> تخطيط الصفحة.
	</li>
	<li>
		لا يعيد كل تغيير في خصائص <a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%86%D8%B5%D9%88%D8%B5-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r251/?msclkid=ad5f25cdc86e11ec83b537ffa879f505" rel="">تنسيق CSS</a> رسم الصفحة، فإذا حرّكت العنصر باستخدام خاصية التنسيق <code>transform</code> تحديدًا، فسيستخدِم المتصفح طبقةً منفصلةً للعنصر الذي طُبقت عليه تلك الخاصية، ولا حاجة حتى لإعادة الرسم عندما يتحرك العنصر، وإنما يُضبَط موقعه وهندسته أثناء عملية تركيب الطبقات.
	</li>
</ul>
<p>
	سنطلع لاحقًا على تأثير رسوم <a href="https://academy.hsoub.com/programming/css/%d8%aa%d8%b9%d8%b1%d9%91%d9%81-%d8%b9%d9%84%d9%89-%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-css-r70/?msclkid=ad5e97fac86e11ec99fbfc3ee1c68149" rel="">CSS</a> المتحركة على الأداء، وكيف تساعد الأداة Waterfall في الإشارة إلى ذلك.
</p>

<h4>
	حجب جافاسكربت
</h4>

<p>
	تُنفَّذ جافاسكربت افتراضيًا على الخيط نفسه الذي يستخدِمه المتصفح لتحديث تخطيط الصفحة وإعادة الرسم وتنفيذ أحداث DOM وغيرها، وهكذا فإنّ تنفيذ دوال جافاسكربت يستغرق وقتًا طويلًا قد يسبب توقف استجابة الصفحة وخشونةً في عرض الرسوميات، كما قد تتجمد الصفحة بالكامل، في حين يمكن بسهولة رصد الأوقات التي تسبب فيها شيفرة جافاسكربت مشاكلًا في الاستجابة باستخدام الأداتين Frame rate وWaterfall معًا. لاحظ كيف حددنا في الشكل التالي منطقةً سببت فيه <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r1233/?msclkid=5da58804c86711ec8f910cae5c81bf0c" rel="">دالة جافاسكربت</a> نقصًا في معدل الإطارات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97321" href="https://academy.hsoub.com/uploads/monthly_2022_04/04_blocking_js.png.cc7349e6aeb116522844a9fb03262544.png" rel=""><img alt="04_blocking_js.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97321" data-unique="bhz6ibhse" src="https://academy.hsoub.com/uploads/monthly_2022_04/04_blocking_js.png.cc7349e6aeb116522844a9fb03262544.png"></a>
</p>

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

<h4>
	عملية رسم عناصر مستنزفة للوقت
</h4>

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

<h4>
	تجميع الموارد المستهلكة
</h4>

<p>
	تشير العلامات الحمراء في الأداة Waterfall إلى عمليات تجميع الموارد المستهلكة GC -بغية تحرير الذاكرة المرتبطة بها-، إذ يتجول محرك جافاسكربت والذي يُدعى <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey" rel="external nofollow">SpiderMonkey</a> في فايرفوكس في كومة الذاكرة عن المناطق التي لم يَعُد بالإمكان الوصول إليها وتحريرها، وتؤثر هذه العملية في الأداء لأنه لا بد من إيقاف محرك جافاسكربت عن تنفيذ الشيفرة مؤقتًا عندما تبدأ عملية تجميع الموارد المستهلكة، وبالتالي سيُعلَّق تنفيذ برنامجك وقد لا يستجيب إطلاقًا.
</p>

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

<ul>
<li>
		نحتاج إلى تجميع الموارد المستهلكة عندما تُحجَز مساحات كبيرة من الذاكرة.
	</li>
	<li>
		نحتاج إلى تجميع الموارد تصاعديًا عندما يكون معدل حجز الذاكرة مرتفعًا إلى الحد الذي تستنزف فيه ذاكرة محرك جافاسكربت عند تنفيذ التجميع اللاتصاعدي.
	</li>
</ul>
<p>
	عندما تسجل الأداة Waterfall علامة تجميع موارد مستهلكة، فهي تشير إلى:
</p>

<ul>
<li>
		العملية تصاعدية أم لا.
	</li>
	<li>
		سبب تنفيذ العملية.
	</li>
	<li>
		سبب تنفيذ العملية اللاتصاعدية إذا كانت كذلك.
	</li>
	<li>
		ستجد في فايرفوكس 46 وما بعد ميزةً جديدةً هي تجميع الموارد المستهلكة على أساس نتيجة لضغوطات ناتجة عن حجز الذاكرة، حيث يظهر في هذه الحالة رابطًا بعنوان عرض المسببات الناتجة عن حجز الذاكرة Show Allocation Triggers، وانقر عندها على الرابط لتتابع ملف الأداء المتعلق بحجز الذاكرة، وصولًا إلى لحظة وقوع حدث تجميع الموارد المستهلكة، كما سنعرض هذه الموضوع لاحقًا بشيء من التفصيل.
	</li>
</ul>
<h3>
	إضافة العلامات من خلال الواجهة البرمجية للطرفية
</h3>

<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/?msclkid=f931d06ac87111eca9e6c75770b3f0dd" rel="">الواجهة البرمجية</a> للطرفية Console <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> هما: "Console" و"Timestamp".
</p>

<h4>
	علامات Console
</h4>

<p>
	تساعدك على تحديد قسم محدد من التسجيل، وبالتالي استدع الدالة <code>()console.time</code> في بداية القسم الذي تريد تحديده والدالة <code>()console.timeEnd</code> عند نهايته، كما تقبل هاتين الدالتين وسيطًا يُستخدَم في تسمية هذا القسم، ولنفرض مثلًا أننا أمام الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3650_40" style="">
<span class="kwd">var</span><span class="pln"> iterations </span><span class="pun">=</span><span class="pln"> </span><span class="lit">70</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> multiplier </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000000000</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> calculatePrimes</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  console</span><span class="pun">.</span><span class="pln">time</span><span class="pun">(</span><span class="str">"calculating..."</span><span class="pun">);</span><span class="pln">

  </span><span class="kwd">var</span><span class="pln"> primes </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> iterations</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">var</span><span class="pln"> candidate </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">multiplier </span><span class="pun">*</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">random</span><span class="pun">());</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> isPrime </span><span class="pun">=</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"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> c </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> c </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">sqrt</span><span class="pun">(</span><span class="pln">candidate</span><span class="pun">);</span><span class="pln"> </span><span class="pun">++</span><span class="pln">c</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">candidate </span><span class="pun">%</span><span class="pln"> c </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">
          </span><span class="com">// not prime</span><span class="pln">
          isPrime </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
          </span><span class="kwd">break</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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isPrime</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      primes</span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="pln">candidate</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  console</span><span class="pun">.</span><span class="pln">timeEnd</span><span class="pun">(</span><span class="str">"calculating..."</span><span class="pun">);</span><span class="pln">

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

<p>
	سيبدو خرج الأداة waterfall كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97322" href="https://academy.hsoub.com/uploads/monthly_2022_04/05_waterfall_section_labeling.png.1c5c25ffe07d8b50121993a89e30f2b3.png" rel=""><img alt="05_waterfall_section_labeling.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97322" data-unique="34kdfwnsz" src="https://academy.hsoub.com/uploads/monthly_2022_04/05_waterfall_section_labeling.thumb.png.c0ee3b61204c159f4c083d5796e583fe.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	تُحدَّد العلامة من خلال الوسيط الذي مُرِّر إلى الدالة <code>()console.time</code>، كما يمكنك متابعة مكدس البرنامج ضمن الشريط الجانبي إلى اليمين عندما تختار هذه العلامة.
</p>

<p>
	أما بخصوص مكدس العملية اللامتزامنة Async stack، فسيعرِض الشريط الجانبي ابتداءً من النسخة فايرفوكس 41 حالة المكدس في نهاية التسجيل عند استدعاء <code>()console.timeEnd</code>، فإذا استدعيت <code>()console.timeEnd</code> من داخل وعد <code>Promise</code>، فسيعرض الشريط العبارة "(Async: Promise)" وسترى تحتها العبارة "async stack" التي تدل على حالة مكدس الاستدعاء في لحظة تنفيذ الوعد، وتأمل الشيفرة التالية على سبيل المثال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3650_43" style="">
<span class="kwd">var</span><span class="pln"> timerButton </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"timer"</span><span class="pun">);</span><span class="pln">
timerButton</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">"click"</span><span class="pun">,</span><span class="pln"> handleClick</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> handleClick</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">time</span><span class="pun">(</span><span class="str">"timer"</span><span class="pun">);</span><span class="pln">
  runTimer</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">).</span><span class="pln">then</span><span class="pun">(</span><span class="pln">timerFinished</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> timerFinished</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">timeEnd</span><span class="pun">(</span><span class="str">"timer"</span><span class="pun">);</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">"ready!"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> runTimer</span><span class="pun">(</span><span class="pln">t</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="kwd">new</span><span class="pln"> </span><span class="typ">Promise</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">resolve</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    setTimeout</span><span class="pun">(</span><span class="pln">resolve</span><span class="pun">,</span><span class="pln"> t</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وستعرض الأداة Waterfall علامةً للفترة الزمنية المنقضية بين الاستدعائين <code>()time</code> و<code>()timeEnd</code>، فإذا نقرت عليها، فستشاهد المكدس اللامتزامن ضمن الشريط الجانبي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97323" href="https://academy.hsoub.com/uploads/monthly_2022_04/06_async_stack.png.fcce876a1cd5884f73d01089434a04a2.png" rel=""><img alt="06_async_stack.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97323" data-unique="dm6qju75i" src="https://academy.hsoub.com/uploads/monthly_2022_04/06_async_stack.png.fcce876a1cd5884f73d01089434a04a2.png" style="width: 250px; height: auto;"></a>
</p>

<h4>
	علامات Timestamp
</h4>

<p>
	تساعدك هذه العلامة على تحديد لحظة زمنية ضمن التسجيل، لذا استدع الدالة <code>()console.timeStamp</code> لتضع علامة timestamp، كما يمكنك تمرير اسم لهذه العلامة من خلال تمرير الاسم على أساس وسيط للدالة السابقة، ولنفترض أننا عدلنا الشيفرة التي عرضناها سابقًا لتحديد لحظة زمنية كل 10 تكرارات للحلقة على سبيل المثال، ونختار عدد التكرارات على أساس اسم لهذه اللحظة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3650_46" style="">
<span class="kwd">var</span><span class="pln"> iterations </span><span class="pun">=</span><span class="pln"> </span><span class="lit">70</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> multiplier </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000000000</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> calculatePrimes</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">time</span><span class="pun">(</span><span class="str">"calculating..."</span><span class="pun">);</span><span class="pln">

  </span><span class="kwd">var</span><span class="pln"> primes </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> iterations</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">i </span><span class="pun">%</span><span class="pln"> </span><span class="lit">10</span><span class="pln"> </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">
      console</span><span class="pun">.</span><span class="pln">timeStamp</span><span class="pun">(</span><span class="pln">i</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">());</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">var</span><span class="pln"> candidate </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">multiplier </span><span class="pun">*</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">random</span><span class="pun">());</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> isPrime </span><span class="pun">=</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"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> c </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> c </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">sqrt</span><span class="pun">(</span><span class="pln">candidate</span><span class="pun">);</span><span class="pln"> </span><span class="pun">++</span><span class="pln">c</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">candidate </span><span class="pun">%</span><span class="pln"> c </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">
          </span><span class="com">// not prime</span><span class="pln">
          isPrime </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
          </span><span class="kwd">break</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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isPrime</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      primes</span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="pln">candidate</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">timeEnd</span><span class="pun">(</span><span class="str">"calculating..."</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> primes</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ستعرض الأداة waterfall شيئًا من هذا القبيل:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97324" href="https://academy.hsoub.com/uploads/monthly_2022_04/07_waterfall_timestampe.png.1d09b5a5c1762f4a3817735a50666d22.png" rel=""><img alt="07_waterfall_timestampe.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97324" data-unique="ek352t1dc" src="https://academy.hsoub.com/uploads/monthly_2022_04/07_waterfall_timestampe.thumb.png.d11739ee584feb6486809011a8727c1f.png" style="width: 600px; height: auto;"></a>
</p>

<h2>
	الأداة Frame rate
</h2>

<p>
	يُعَدّ معدّل الإطارات مقياسًا لاستجابة الصفحة، وقد تتسم الصفحات التي تتمتع بمعدل إطارات ضعيف أو غير مستقر بضعف الاستجابة أو الجمود، مما يؤثر على <a href="https://academy.hsoub.com/design/user-experience/%d9%85%d8%af%d8%ae%d9%84-%d8%a5%d9%84%d9%89-%d8%aa%d8%ac%d8%b1%d8%a8%d8%a9-%d8%a7%d9%84%d9%85%d8%b3%d8%aa%d8%ae%d8%af%d9%85-user-experience-r149/?msclkid=10e7b315c87011ec9fdceafa9afb2f2b" rel="">تجربة المستخدِم</a>.
</p>

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

	<p>
		توضيح: يقدِّم معدل 60 إطار في الثانية أداءً سلسًا، كما يتيح فترةً زمنيةً مقدارها 16.7 ميلي ثانية لإنجاز كل التحديثات المطلوبة للاستجابة إلى بعض الأحداث.
	</p>
</blockquote>

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

<h3>
	علاقة معدل الإطارات باستجابة الصفحة
</h3>

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

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

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

<h3>
	المخطط البياني لمعدل الإطارات
</h3>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97325" href="https://academy.hsoub.com/uploads/monthly_2022_04/08_perf_frame_rate.png.9616d6b57d969e7e6de2d22c8300ea3c.png" rel=""><img alt="08_perf_frame_rate.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97325" data-unique="eil4wjoy9" src="https://academy.hsoub.com/uploads/monthly_2022_04/08_perf_frame_rate.thumb.png.814add14e669e95bd38e411b7ae54bcc.png" style="width: 700px; height: auto;"></a>
</p>

<p>
	يمثِّل المحور X الزمن المنقضي أثناء تسجيل ملف الأداء، كما ستلاحظ وجود ثلاث مؤشرات هي معدل الإطارات الأعظمي ومعدل الإطارات الوسطي ومعدل الإطارات الأقل.
</p>

<h3>
	طريقة استخدام المخطط البياني لمعدل الإطارات
</h3>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97326" href="https://academy.hsoub.com/uploads/monthly_2022_04/09-perf_fr_rate_waterfall.png.05971218638649680ef911476545762b.png" rel=""><img alt="09-perf_fr_rate_waterfall.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97326" data-unique="k1p42nsd6" src="https://academy.hsoub.com/uploads/monthly_2022_04/09-perf_fr_rate_waterfall.thumb.png.e32e08428f6b5188ba7b2708da94b70e.png" style="width: 650px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97327" href="https://academy.hsoub.com/uploads/monthly_2022_04/10_perf_problem_zoom.png.663695274f6164b87ae364660daaa1cf.png" rel=""><img alt="10_perf_problem_zoom.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97327" data-unique="q2cj84s94" src="https://academy.hsoub.com/uploads/monthly_2022_04/10_perf_problem_zoom.thumb.png.b77f69551fb262078481f54c23dc2fbd.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	لاحظ كيف أعاقت دالة جافاسكربت استُدعيت عند حدث النقر خيط التنفيذ الرئيسي عن العمل مدة 170 ميلي ثانية، ولمعرفة هذه الدالة تحديدًا انتقل إلى الأداة Flame Chart لمتابعة مكدّس الاستدعاءات في هذه النقطة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97328" href="https://academy.hsoub.com/uploads/monthly_2022_04/11_perf_fr_flame_chart.png.17b9262bdac15085b972dc14cc51503d.png" rel=""><img alt="11_perf_fr_flame_chart.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97328" data-unique="m4nuafveg" src="https://academy.hsoub.com/uploads/monthly_2022_04/11_perf_fr_flame_chart.thumb.png.3ff3eedee29ead3a33b66c80de50d9b3.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	هذه الدالة إذًا <code>()doPointlessComputations</code> وهي دالة معرفة في الملف "main.js"، وقد نضطر لحل المشكلة إلى تقسيم الدالة إلى أجزاء، وتنفيذ كل جزء على حدة ضمن <code>requestAnimationFrame</code> أو تنفيذها بالكامل ضمن عامل ويب، وسنتابع لاحقًا حلولًا لمشاكل مثل هذه عندما نحلل تأثير الاستخدام المكثف لجافاسكربت على الأداء.
</p>

<h2>
	الأداة Call Tree
</h2>

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

<p>
	تُعَدّ الأداة Call Tree أداةً لتجميع العينات، إذ تلتقط دوريًا عينات لتحديد حالة محرك جافاسكربت وتسجيل حالة المكدّس في زمن تنفيذ الشيفرة، في حين يتعلق عدد العينات المجمّعة إحصائيًا عند تنفيذ دالة محددة بالزمن الذي يستغرقه المتصفح في تنفيذها، ولشرح فائدة الأداة Call Tree، سنستخدم خرج برنامج بسيط على أساس مثال، فإذا أردت الحصول على هذا البرنامج لتجربه بنفسك، فيمكنك <a href="https://github.com/mdn/performance-scenarios/blob/gh-pages/js-call-tree-1/" rel="external nofollow">تنزيله</a> من المستودع الخاص به على جيت هاب، كما يمكنك <a href="https://github.com/mdn/performance-scenarios/blob/gh-pages/js-call-tree-1/profile/call-tree.json" rel="external nofollow">تنزيل</a> ملف الأداء الذي سنشرحه من المستودع ذاته وإدراجه بعد ذلك ضمن الأداة Performance، وستجد كذلك <a href="https://developer.mozilla.org/en-US/docs/Tools/Performance/Examples/Sorting_algorithms_comparison" rel="external nofollow">شرحًا مختصرًا</a> عن هيكلية البرنامج ضمن المستودع.
</p>

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

	<p>
		ملاحظة: سنستخدم البرنامج نفسه وملف الأداء نفسه عند شرح الأداة Flame Chart لاحقًا في هذا الفصل.
	</p>
</blockquote>

<p>
	تعرض لقطة الشاشة التالية خرج برنامج يوازن بين ثلاثة <a href="https://academy.hsoub.com/programming/advanced/%D8%A3%D9%85%D8%AB%D9%84%D8%A9-%D8%B9%D9%86-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA-r1410/?msclkid=b8fa067bc87211ec9c301b0a21958fd9" rel="">خوارزميات</a> للفرز، وهي الفرز الفقاعي Bubble Sort والفرز الانتقائي Selection Sort والفرز السريع Quicksort؛ حيث يولِّد البرنامج لتنفيذ الاختبار بعض المصفوفات التي تضم أرقامًا صحيحةً عشوائيةً، ثم يفرزها باستعمال كل خوارزمية على حدة، وقد ركزنا في قسم الحالة العامة Recording overview على منطقة ظهرت فيها علامة طويلة لجافاسكربت:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97329" href="https://academy.hsoub.com/uploads/monthly_2022_04/12_perf_call_tree.png.a0429a505fb0f9d1bec3a02d396df010.png" rel=""><img alt="12_perf_call_tree.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97329" data-unique="85jppkk89" src="https://academy.hsoub.com/uploads/monthly_2022_04/12_perf_call_tree.png.a0429a505fb0f9d1bec3a02d396df010.png" style="width: 650px; height: auto;"></a>
</p>

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

<ul>
<li>
		<strong>العينات Samples</strong>: تشير إلى عدد العينات التي التُقطت عند تنفيذ دالة معينة بما في ذلك الدوال الأبناء وهي الدوال التي تُستدعيها هذه الدالة.
	</li>
	<li>
		<strong>الوقت الكلي Tota lTime</strong>: يقدَّر بالميلي ثانية ويمثِّل الوقت الكلي الذي تستغرقه شريحةً محددةً من التسجيل، كما يماثل تقريبًا عدد العينات.
	</li>
	<li>
		<strong>التكلفة الكلية Total Cost</strong>: يمثِّل النسبة المئوية للعدد الكلي للعينات في القسم المختار من التسجيل.
	</li>
	<li>
		<strong>التوقيت الذاتي Self Time</strong>: يمثِّل الوقت الذي يستغرقه تنفيذ دالة محددة دون النظر إلى زمن تنفيذ أبنائها، حيث يُقدَّر هذا الزمن من حالة المكدسات المُلتقَطة في اللحظات التي تكون فيها الدالة آخر عناصر المكدس leafmost function.
	</li>
	<li>
		<strong>التكلفة الذاتية Self Cost</strong>: تُحسب من التوقيت الذاتي على أساس نسبة مئوية للعدد الكلي من عينات القسم المحدد من التسجيل.
	</li>
</ul>
<p>
	تمثِّل الأعمدة السابقة القيم الأهم في النسخة الحالية من الأداة Call Tree، ويُفضَّل إجراء تحسين للشيفرة انطلاقًا من الدوال التي تمتلك قيمة تكلفة ذاتية مرتفعة لأنها تستغرق وقتًا طويلًا في التنفيذ، أو لأنها تُستدعى بكثرة.
</p>

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

	<p>
		توضيح: يُعَدّ استخدام الصيغة المعكوسة للأداة Call Tree مفيدًا للتركيز على هذا النوع من الدوال أو على هذه القيم للتكلفة الذاتية.
	</p>
</blockquote>

<p>
	تخبرنا أخيرًا لقطة الشاشة السابقة عن شيء ربما نعرفه بالفعل، وهو أنّ خوارزمية الفرز الفقاعي فعالة جدًا، فعدد العينات الملتقَطة في القسم الذي يسجل عملها يزيد 6 مرات عن عدد عينات القسم الذي يسجل عمل خوارزمية الفرز الانتقائي، و13 مرة عن خوارزمية الفرز السريع.
</p>

<h3>
	التنقل ضمن الأداة Call Tree
</h3>

<p>
	يوجد سهم صغير إلى جوار اسم كل دالة، وسترى عند النقر على هذا السهم مسار استدعاء هذه الدالة رجوعًا إلى بدايته، أي من الدالة التي التقطت العينة أثناء تنفيذها وحتى الدالة الجذرية، إذ يمكن مثلًا توسيع الدالة <code>()bubbleSort</code>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97330" href="https://academy.hsoub.com/uploads/monthly_2022_04/13_perf_call_tree_bubble_expand.png.3e49c6f58cb6171cc403a997e7c74f34.png" rel=""><img alt="13_perf_call_tree_bubble_expand.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97330" data-unique="auebmz6hu" src="https://academy.hsoub.com/uploads/monthly_2022_04/13_perf_call_tree_bubble_expand.thumb.png.7f6c7f0b2ed11f59722266368718b61b.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	سيظهر المخطط البياني للاستدعاء كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3650_75" style="">
<span class="pln">sortAll</span><span class="pun">()</span><span class="pln">

    </span><span class="pun">-&gt;</span><span class="pln"> sort</span><span class="pun">()</span><span class="pln">

        </span><span class="pun">-&gt;</span><span class="pln"> bubbleSort</span><span class="pun">()</span></pre>

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

	<p>
		ملاحظة: على الرغم من أنّ التكلفة الذاتية للدالة <code>()sort</code> هي 1.45% وهي مختلفة عن قيمة الدالة <code>()sort</code> الموجودة في سطر مستقل في القائمة، فذلك يدل على أنّ بعض العينات قد التُقِطت داخل الدالة <code>()sort</code> نفسها بدلًا من الدوال التي تستدعيها، وقد تلاحظ وجود عدة مسارات تعود من نقطة معينة إلى المستوى الأعلى، ولنحاول توسيع الدالة <code>()swap</code>:
	</p>
</blockquote>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97331" href="https://academy.hsoub.com/uploads/monthly_2022_04/14_perf_call_tree_swap_expand.png.fb39e5336b4b9626e117a799d63c700d.png" rel=""><img alt="14_perf_call_tree_swap_expand.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97331" data-unique="k1l65t7lx" src="https://academy.hsoub.com/uploads/monthly_2022_04/14_perf_call_tree_swap_expand.thumb.png.0fb342eebe39991e2fb9ae556f8bbbf7.png" style="width: 600px; height: auto;"></a>
</p>

<p>
	التُقِطت 253 عينة داخل الدالة <code>()swap</code>، لكن يوجد مساران مختلفان يقودان إلى هذه الدالة، إذ تستخدِمها كلتا الدالتَين <code>()bubbleSort</code> و<code>()selectionSort</code>، كما يمكننا ملاحظة أنّ 252 عينة من أصل 253 ضمن الدالة <code>()swap</code> قد التُقِطت من مسار الدالة <code>()bubbleSort</code> وعينةً واحدةً فقط من المسار الآخر. تشير هذه النتيجة إلى أنّ خوارزمية الفرز الفقاعي أقل فعاليةً مما نظن، فهي تتحمل في الواقع مسؤولية 252 عينة إضافية، أي حوالي 10% أخرى من التكلفة الكلية، كما يمكننا الحصول على المخطط البياني الكامل مع عدد العينات الموافق بمتابعة طريقة التحليل هذه:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3650_78" style="">
<span class="pln">sortAll</span><span class="pun">()</span><span class="pln">                         </span><span class="com">//    8</span><span class="pln">

    </span><span class="pun">-&gt;</span><span class="pln"> sort</span><span class="pun">()</span><span class="pln">                     </span><span class="com">//   37</span><span class="pln">

        </span><span class="pun">-&gt;</span><span class="pln"> bubbleSort</span><span class="pun">()</span><span class="pln">           </span><span class="com">// 1345</span><span class="pln">

            </span><span class="pun">-&gt;</span><span class="pln"> swap</span><span class="pun">()</span><span class="pln">             </span><span class="com">//  252</span><span class="pln">

        </span><span class="pun">-&gt;</span><span class="pln"> selectionSort</span><span class="pun">()</span><span class="pln">        </span><span class="com">//  190</span><span class="pln">

            </span><span class="pun">-&gt;</span><span class="pln"> swap</span><span class="pun">()</span><span class="pln">             </span><span class="com">//    1</span><span class="pln">

        </span><span class="pun">-&gt;</span><span class="pln"> quickSort</span><span class="pun">()</span><span class="pln">            </span><span class="com">//  103</span><span class="pln">

            </span><span class="pun">-&gt;</span><span class="pln"> partition</span><span class="pun">()</span><span class="pln">        </span><span class="com">//   12</span></pre>

<h3>
	بيانات منصة العمل
</h3>

<p>
	سترى بعض الأسطر التي تحمل قيمًا مثل Gecko أو Input &amp; Events وغيرها، بحيث تمثِّل الاستدعاءات الداخلية للمتصفح، كما تقدِّم لك بيانات هذه الأسطر معلومات قيمةً أيضًا، فقد لا تجد أية عينات تشير إلى مدى صعوبة تنفيذ شيفرة موقعك في المتصفح، وستجد في مثالنا 679 عينة مرتبطة بالقيمة Gecko، وهي ثاني أكبر مجموعة من العينات بعد عينات الدالة <code>()bubbleSort</code>، فلنوسِّع إذًا معلومات Gecko:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97332" href="https://academy.hsoub.com/uploads/monthly_2022_04/15_perf_call_tree_hecko_expand.png.9639440a195a3e19a0595e2f18276634.png" rel=""><img alt="15_perf_call_tree_hecko_expand.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97332" data-unique="zj5b0k1s5" src="https://academy.hsoub.com/uploads/monthly_2022_04/15_perf_call_tree_hecko_expand.thumb.png.d5ed5ec46cff3c4c85b66d59db87056d.png" style="width: 600px; height: auto;"></a>
</p>

<p>
	تشيرالنتائج إلى أنّ مصدر 614 عينة من هذه العينات أو حوالي 20% من التكلفة الكلية هي من استدعاء الدالة <code>()sort</code>، فإذا نظرنا إلى شيفرة هذه الدالة، فسنلاحظ بوضوح أنّ سبب التكلفة المرتفعة لعمل المنصة -أو مجهود المتصفح- هو الاستدعاء المتكرر للتابع <code>()console.log</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3650_82" style="">
<span class="kwd">function</span><span class="pln"> sort</span><span class="pun">(</span><span class="pln">unsorted</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">bubbleSort</span><span class="pun">(</span><span class="pln">unsorted</span><span class="pun">));</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">selectionSort</span><span class="pun">(</span><span class="pln">unsorted</span><span class="pun">));</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">quickSort</span><span class="pun">(</span><span class="pln">unsorted</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span></pre>

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

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

	<p>
		ملاحظة: لا تفصل الأداة Call Tree بيانات منصة العمل ضمن دوال مستقلة لما يسببه ذلك من تشويش لمستخدِم هذه البيانات وخاصةً لمن لا يستخدِم متصفح فايرفوكس، فإذا أردت معرفة تفاصيل أكثر، فعليك بتفعيل الخيار Show Gecko Platform Data ضمن الإعدادات.
	</p>
</blockquote>

<h3>
	الصيغة المعكوسة (المقلوبة) للأداة Call Tree
</h3>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97333" href="https://academy.hsoub.com/uploads/monthly_2022_04/16_invert_call_tree.png.022c74b5a6bcb28826d5eaa0af2279aa.png" rel=""><img alt="16_invert_call_tree.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97333" data-unique="m15bybp8f" src="https://academy.hsoub.com/uploads/monthly_2022_04/16_invert_call_tree.png.022c74b5a6bcb28826d5eaa0af2279aa.png" style="width: 400px; height: auto;"></a>
</p>

<h2>
	الأداة Flame Char
</h2>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97334" href="https://academy.hsoub.com/uploads/monthly_2022_04/17_perf_flame_chart.png.e97949dfab9cce6b1cf953944a3dca29.png" rel=""><img alt="17_perf_flame_chart.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97334" data-unique="2fiom8acn" src="https://academy.hsoub.com/uploads/monthly_2022_04/17_perf_flame_chart.thumb.png.9aec7c44e7d1c5dce0ab82b8beaf8a50.png" style="width: 700px; height: auto;"></a>
</p>

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

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

<h3>
	تغيير مجال العرض وإزاحة الشرائح
</h3>

<p>
	ينبغي أن تكون قادرًا على التنقل بين البيانات المعروضة بسهولة لكي تستطيع العمل بفعالية أكبر، حيث تقدِّم الأداة Flame Chart وسيلتَي تحكم لهذا الغرض:
</p>

<ul>
<li>
		<strong>Zoom</strong> (تغيير مجال العرض): لزيادة أو إنقاص مجال الشريحة المختارة من ملف التسجيل الكامل الذي يُعرَض ضمن الأداة Flame Chart، حيث تستطيع استخدام هذه الوسيلة كما يلي:
	</li>
</ul>
<ol style="margin-right: 40px;">
<li>
		دحرجة دولاب الفأرة للأعلى والأسفل ضمن Flame Chart.
	</li>
	<li>
		تحريك إصبعَين معًا للأعلى أو للأسفل على لوحة اللمس ضمن Flame Chart.
	</li>
</ol>
<ul>
<li>
		<strong>Pan</strong> (التنقل بين الشرائح): إزاحة الشريحة التي اخترتها من ملف التسجيل الكامل يمينًا أو يسارًا، إذ تستطيع استخدام هذه الوسيلة كما يلي:
	</li>
</ul>
<ol style="margin-right: 40px;">
<li>
		انقر على الشريحة المختارة ضمن لوحة النظرة العامة واسحبها بالاتجاه المطلوب.
	</li>
	<li>
		انقر واسحب في أي مكان ضمن Flame Chart.
	</li>
</ol>
<h3>
	مثال تطبيقي
</h3>

<p>
	سنلقي نظرةً على مثال بسيط هو نفسه البرنامج الذي استخدمناه سابقًا لتتابع كيف ستكشف الأداة Flame Chart سلوك برنامجك ولتوضيح عمل الأداة Call Tree، كما سنستخدم ملف الأداء نفسه، فقد وجدنا أنُ تسلسل الاستدعاءات وتعداد العينات المقابل لكل منها في ملف الأداء هو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3650_87" style="">
<span class="pln">sortAll</span><span class="pun">()</span><span class="pln">                         </span><span class="com">//    8</span><span class="pln">

    </span><span class="pun">-&gt;</span><span class="pln"> sort</span><span class="pun">()</span><span class="pln">                     </span><span class="com">//   37</span><span class="pln">

        </span><span class="pun">-&gt;</span><span class="pln"> bubbleSort</span><span class="pun">()</span><span class="pln">           </span><span class="com">// 1345</span><span class="pln">

            </span><span class="pun">-&gt;</span><span class="pln"> swap</span><span class="pun">()</span><span class="pln">             </span><span class="com">//  252</span><span class="pln">

        </span><span class="pun">-&gt;</span><span class="pln"> selectionSort</span><span class="pun">()</span><span class="pln">        </span><span class="com">//  190</span><span class="pln">

            </span><span class="pun">-&gt;</span><span class="pln"> swap</span><span class="pun">()</span><span class="pln">             </span><span class="com">//    1</span><span class="pln">

        </span><span class="pun">-&gt;</span><span class="pln"> quickSort</span><span class="pun">()</span><span class="pln">            </span><span class="com">//  103</span><span class="pln">

            </span><span class="pun">-&gt;</span><span class="pln"> partition</span><span class="pun">()</span><span class="pln">        </span><span class="com">//   12</span></pre>

<p>
	اخترنا في البداية المقطع الذي كان البرنامج فيه مشغولًا بأكمله:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97335" href="https://academy.hsoub.com/uploads/monthly_2022_04/18_perf_flame_chart_zoomed_out.png.71760b0c76494193e14e884f78dc285c.png" rel=""><img alt="18_perf_flame_chart_zoomed_out.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97335" data-unique="b92ma2grz" src="https://academy.hsoub.com/uploads/monthly_2022_04/18_perf_flame_chart_zoomed_out.thumb.png.ed9a88dee500808221e678a3e7ef0436.png" style="width: 600px; height: auto;"></a>
</p>

<p>
	لاحظ وجود الدالة <code>()sortAll</code> الملونة بالأرجواني في القمة، حيث يمتد زمن تنفيذها من بداية البرنامج حتى نهايته، وتأتي تحتها مباشرةً الدالة <code>()sort</code> باللون الأخضر الزيتوني، ويليها تعاقب استدعاءات مثل أسنان المشط لكل خوارزمية من خوارزميات الفرز الثلاث، ولنقرِّب المشهد أكثر:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97336" href="https://academy.hsoub.com/uploads/monthly_2022_04/19_perf_flame_chart_Details.png.7afe2d73266e17c3c1864a8cb670025a.png" rel=""><img alt="19_perf_flame_chart_Details.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97336" data-unique="xet2igqr1" src="https://academy.hsoub.com/uploads/monthly_2022_04/19_perf_flame_chart_Details.thumb.png.861214f98ba67e869163d1cd5d675016.png" style="width: 600px; height: auto;"></a>
</p>

<p>
	تمتد الشريحة مدة 140 ميلي ثانية وتعرض تفاصيلًا أكثر عن الدوال التي تستدعيها الدالة <code>()sort</code>. لاحظ الشيفرة التي تكوّن الدالة <code>()sort</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3650_91" style="">
<span class="kwd">function</span><span class="pln"> sort</span><span class="pun">(</span><span class="pln">unsorted</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">bubbleSort</span><span class="pun">(</span><span class="pln">unsorted</span><span class="pun">));</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">selectionSort</span><span class="pun">(</span><span class="pln">unsorted</span><span class="pun">));</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">quickSort</span><span class="pun">(</span><span class="pln">unsorted</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تمثِّل العلامة التي يبدو عنوانها "…bubb" وملوّنةً بالأخضر الزيتوني الدالة <code>()bubbleSort</code>، في حين تمثل العلامة الأخرى التي تبدو باللون الأخضر الصرف بقية دوال الفرز. لاحظ أنّ كتلة دالة الفرز الفقاعي <code>()bubbleSort</code> ذات عرض أكبر -أي تمتد لفترة أطول- من البقية، كما يمكن ملاحظة مجموعة دوال تستدعيها الدالة <code>()bubbleSort</code> وتبدو باللون الأرجواني، ولنقرّب المشهد مرة أخرى:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97337" href="https://academy.hsoub.com/uploads/monthly_2022_04/20_perf_flame_chart_more_Details.png.afb5338cc281554061eb3d6a2827b641.png" rel=""><img alt="20_perf_flame_chart_more_Details.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97337" data-unique="jg8a6txwh" src="https://academy.hsoub.com/uploads/monthly_2022_04/20_perf_flame_chart_more_Details.thumb.png.ef8ed29feba261f8d821fec509748d18.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	يساوي عرض الشريحة الأخيرة التي اخترناها حوالي 20 ميلي ثانية، وسنرى بوضوح أنّ العلامة الأرجوانية أسفل الدالة <code>()bubbleSort</code> هي استدعاءات للدالة <code>()swap</code>، فإذا أحصينا هذه الاستدعاءات، فسترى أنها 253 وفقًا للأداة Call Tree، كما تشير Call Tree إلى وقوع كل الاستدعاءات السابقة تحت الدالة <code>()bubbleSort</code> ماعدا استدعاء وحيد يقع تحت الدالة <code>()selectionSort</code>، كما يمكن أيضًا رؤية وجود علامتين خضراوين للدالتين <code>()selectionSort</code> و<code>()quickSort</code>، وسنرى استدعاءات لمنصة العمل في الفترة ما بين استدعاءات دوال الفرز، كما من المرجح أن يكون سببها استدعاء الدالة <code>()console.log</code> من داخل الدالة <code>()sort</code>.
</p>

<h2>
	الأداة Allocations
</h2>

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

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

<h3>
	تشريح لوحة الأداة Allocations
</h3>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97338" href="https://academy.hsoub.com/uploads/monthly_2022_04/21_allocations_view.png.b00acc63f0786dbf2cd9afb18a114e2d.png" rel=""><img alt="21_allocations_view.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97338" data-unique="6j93xm0iu" src="https://academy.hsoub.com/uploads/monthly_2022_04/21_allocations_view.thumb.png.5f1c99b24c13e3e39b6f150f65b2c5b7.png" style="width: 650px; height: auto;"></a>
</p>

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

<ul>
<li>
		<strong>Self Count العداد الذاتي</strong>: عدد عينات الحجز التي التُقِطت ضمن الدالة المحددة، وتُعرَض أيضًا على أساس نسبة مئوية من عدد العينات الكلي.
	</li>
	<li>
		<strong>Self Byte عدد البايتات الذاتي</strong>: العدد الكلي للبايتات الموجودة في عينة ملتقَطة داخل دالة، تُعرَض أيضًا على أساس نسبة مئوية من الكمية الكلية، كما تُرتَّب الأعمدة وفقًا لعدد البايتات الذاتي.
	</li>
</ul>
<p>
	سنجد في مثالنا السابق ما يلي:
</p>

<ul>
<li>
		تمثل العينات الملتقَطة في الدالة <code>()signalLater</code> ما مقداره 28.57% من العدد الكلي للعينات البالغ 8904.
	</li>
	<li>
		تحجز هذه العينات 1102888 بايت، أي ما مقداره 30.01% من الذاكرة الكلية المحجوزة في جميع العينات.
	</li>
</ul>
<p>
	سترى الأماكن التي تُستدعى منها كل دالة بالنقر على السهم الصغير بجوار اسمها:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97339" href="https://academy.hsoub.com/uploads/monthly_2022_04/22_allocations_calls_from_arrow.png.adab8e581b3f170825069a2edb5f4333.png" rel=""><img alt="22_allocations_calls_from_arrow.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97339" data-unique="oike2wg07" src="https://academy.hsoub.com/uploads/monthly_2022_04/22_allocations_calls_from_arrow.thumb.png.105910f4e2100dcda93de5ca040bd532.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	لاحظ كيف استُدعيت الدالة <code>()signalLater</code> من مكانين هما <code>()removeInner</code> و<code>()setSelectionInner</code>،إذ ستتمكن الآن من الرجوع خطوةً ضمن المكدس لفهم سياق حجز الذاكرة بصورة أفضل.
</p>

<h3>
	التكلفة الذاتية والتكلفة الكلية
</h3>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97340" href="https://academy.hsoub.com/uploads/monthly_2022_04/23_perf_self_total_count.png.6b2a1c98d2a04e7402a56f22c528ee8e.png" rel=""><img alt="23_perf_self_total_count.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97340" data-unique="b6bxglodv" src="https://academy.hsoub.com/uploads/monthly_2022_04/23_perf_self_total_count.thumb.png.ca5e8672c186b534e0be394ab3b8aa62.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	التقَطت الأداة 8904 عينةً في الدالة <code>()signalLater</code>، لكن هذه الدالة قد استُدعيت من مكانين <code>()removeInner</code> و<code>()setSelectionInner</code>، وتبدو قيمة العداد الذاتي لهما 0 بمعنى أنهما لا تحجزان مباشرةً أية ذاكرة، لكن قيمة العداد الكلي للدالة <code>()removeInner</code> هي 8901 وقيمته للدالة <code>()setSelectionInner</code> هي 3 فقط، أي أنّ معظم الحجوزات التي نراها في الدالة <code>()signalLater</code> مصدرها الدالة <code>()removeInner</code>.
</p>

<h3>
	حجز الذاكرة وتجميع الموارد المستهلكة
</h3>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97341" href="https://academy.hsoub.com/uploads/monthly_2022_04/24_perf_allccations_gc.png.77c2e33e21d29771d0b790fdb1629800.png" rel=""><img alt="24_perf_allccations_gc.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97341" data-unique="nmudk5fyp" src="https://academy.hsoub.com/uploads/monthly_2022_04/24_perf_allccations_gc.thumb.png.f70a9a001be9b4c924fc3fc3ed1b0a89.png" style="width: 650px; height: auto;"></a>
</p>

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

<p>
	إذا وقعت أحداث تجميع الموارد المستهلكة بسبب ضغوطات ناتجة عن حجز الذاكرة، فسيظهر في هذه الحالة رابطًا بعنوان عرض المسببات الناتجة عن حجز الذاكرة Show Allocation Triggers ضمن الشريط الجانبي إلى يمين نافذة الأداة Waterfall، فإذا نقرت على هذا الرابط، فستنتقل أدوات التطوير إلى عرض النافذة Allocations وستختار الفترة الزمنية الممتدة من نهاية آخر دورة لتجميع الموارد المستهلكة حتى بداية الدورة التي نقرت عليها، وسيعرض لك ذلك كل حجوزات الذاكرة التي أدت بمجموعها إلى وقوع حدث تجميع الموارد المستهلكة، فإذا واجهتك هذه المشكلة، فحاول إذا استطعت اختزال عدد أو حجم حجوزات الذاكرة:
</p>

<ul>
<li>
		هل يمكنك حجز ذاكرة محدودة؟ أي فقط عندما تحتاجها بدلًا من حجزها منذ البداية.
	</li>
	<li>
		هل تجري عملية الحجز ضمن حلقة؟ إذا كان الأمر كذلك، فهل بالإمكان إعادة استخدام الذاكرة المحجوزة نفسها عند كل تكرار للحلقة؟
	</li>
</ul>
<p>
	ترجمة -وبتصرف- للمقالات التالية:
</p>

<ul>
<li>
		<a href="https://developer.mozilla.org/en-US/docs/Tools/Performance/Waterfall" rel="external nofollow">Waterfall</a>.
	</li>
	<li>
		<a href="https://developer.mozilla.org/en-US/docs/Tools/Performance/Frame_rate" rel="external nofollow">Frame rate</a>.
	</li>
	<li>
		<a href="https://developer.mozilla.org/en-US/docs/Tools/Performance/Call_Tree" rel="external nofollow">Call Tree</a>.
	</li>
	<li>
		<a href="https://developer.mozilla.org/en-US/docs/Tools/Performance/Flame_Chart" rel="external nofollow">Flame Chart</a>.
	</li>
	<li>
		<a href="https://developer.mozilla.org/en-US/docs/Tools/Performance/Allocations" rel="external nofollow">Allocations</a>.
	</li>
</ul>
<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D9%88%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A3%D8%AF%D8%A7%D8%A1-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-performance-r1540/" rel="">مراقبة وتحليل أداء صفحات الويب باستخدام الأداة Performance</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D8%A7%D9%84%D8%B8%D9%87%D9%88%D8%B1-%D9%81%D9%8A-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-r485/" rel="">تحسين الظهور في محركات البحث</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1541</guid><pubDate>Tue, 10 May 2022 15:00:02 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x64A; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x627;&#x62A; &#x645;&#x641;&#x62A;&#x648;&#x62D;&#x629; &#x627;&#x644;&#x645;&#x635;&#x62F;&#x631;&#x61F;</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%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%9F-r1650/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_08/62f014281c3a3_open-sourse.png.be2647e537d1fb9551753d58b46c468d.png" /></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="">مفتوح المصدر Open Source</a> وكيف أن تلك البرمجية تتميز بأنها Open Source، ولكن هل تساءلت ماذا يعني أن برمجية ما Open Source، وكيف سيؤثر ذلك على مستقبل هذه البرمجية؟
</p>

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

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="480" title="ما هي البرمجيات مفتوحة المصدر" width="853" src="https://www.youtube.com/embed/LN1x4IcW7zU"></iframe>
</p>

<p>
	يمكنك التعرف أكثر على البرمجيات مفتوحة المصدر من خلال المقالات المجانية التي تقدمها أكاديمية حسوب، كما يمكنك البدء بتعلم البرمجة باحترافية عبر <a href="https://academy.hsoub.com/?utm_source=youtube.com&amp;utm_medium=referral&amp;utm_campaign=academy-22marXX" rel="">الدورات التي تقدمها الأكاديمية</a>.
</p>
]]></description><guid isPermaLink="false">1650</guid><pubDate>Mon, 09 May 2022 15:00:00 +0000</pubDate></item><item><title>&#x645;&#x631;&#x627;&#x642;&#x628;&#x629; &#x648;&#x62A;&#x62D;&#x644;&#x64A;&#x644; &#x623;&#x62F;&#x627;&#x621; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x623;&#x62F;&#x627;&#x629; Performance</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D9%88%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A3%D8%AF%D8%A7%D8%A1-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-performance-r1540/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_04/626d04578d2ed_-------Performance.png.9afad76a3a83be62e947dc2014751cad.png" /></p>

<p>
	يصف هذا المقال أداةً غايةً في الأهمية لتحليل أداء صفحات ويب فيما يتعلق بتنفيذ شيفرات <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> و<a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> و<a href="https://wiki.hsoub.com/JavaScript" rel="external">جافاسكربت</a>، وبالتالي سيكون المطوِّر قادرًا على تحديد النقاط السلبية في أداء الموقع والتي ستكون الهدف المناسب لعمليات التحسين والتطوير التالية.
</p>

<h2>
	نظرة سريعة على الأداة Performance
</h2>

<p>
	تلقي هذه الأداة الضوء على استجابة صفحات ويب عمومًا، وعلى أداء جافاسكربت وتخطيط الصفحة، كما تتيح هذه الأداة إنشاء تسجيلات أو ملفات أداء لصفحتك خلال فترة زمنية معينة، وتعرض لك لمحةً عامةً عن الأشياء التي نفّذها المتصفح لتصيير الصفحة من خلال تلك الملفات، ورسمًا بيانيًا عن حالة مكدس <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-javascript-r550/?msclkid=5da4a1f2c86711eca8cc6e2e64e7ca36" rel="">جافاسكربت</a> مع الزمن من خلال المكوّن frame rate.
</p>

<h3>
	مكونات الأداة Performance
</h3>

<p>
	تقدِّم لك الأداة أربع أدوات جزئية لفحص ميزات ملف الأداء بتفاصيل أكثر:
</p>

<ul>
<li>
		<strong>الأداة Waterfall</strong>: تعرض لك العمليات المختلفة التي ينفذها المتصفح مثل تنفيذ مخطط العمل وأداء جافاسكربت ومهام إعادة رسم الصفحة repaint وتجميع الموارد التي انتهى استخدامها Garbage Collection، أي ستساعدك في فهم ما ينفِّذه المتصفح عندما يتفاعل مع موقع ويب.
	</li>
	<li>
		<strong>الأداة Call Tree</strong>: تعرض <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r1233/?msclkid=5da58804c86711ec8f910cae5c81bf0c" rel="">دوال جافاسكربت</a> التي تستغرق من المتصفح أكبر وقت في تنفيذها محددةً الاختناقات التي تحدث عند تنفيذ <a href="https://academy.hsoub.com/programming/javascript/%D9%86%D9%85%D8%B7-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r785/?msclkid=a3286e24c86611ec848cfe770a0cb670" rel="">شيفرة جافاسكربت</a> الخاصة بموقع الويب.
	</li>
	<li>
		<strong>الأداة Flame Chart</strong>: تعرض حالة <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%88%D8%AF-recursion-%D9%88%D8%A7%D9%84%D9%85%D9%83%D8%AF%D8%B3-stack-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r870/?msclkid=973c90ddc86711ec8a69965b50b7ea93" rel="">مكدس استدعاءات جافاسكربت</a> والدوال التي يجري تنفيذها ومتى خلال فترة تسجيل ملف الأداء.
	</li>
	<li>
		<strong>الأداة Frame Rate</strong>: تعرض حالة التجاوب العامة لموقعك مع مختلف الشاشات.
	</li>
	<li>
		<strong>الأداة Allocations</strong>: تعرض حالة كومة الذاكرة الناتج عن تنفيذ شيفرة جافاسكربت خلال زمن تسجيل ملف الأداء، ولن تظهر هذه الأداة إلا عندما تفعِّل خيار سجل حجوزات الذاكرة Record Allocations من خلال إعدادات الأداة Performance.
	</li>
</ul>
<h3>
	سيناريوهات استخدام الأداة Performance
</h3>

<p>
	يمكن استخدام أدوات جزئية محددة أو أكثر لمراقبة حالات محددة نذكر منها:
</p>

<ul>
<li>
		<strong>متابعة الحركات الناتجة عن استخدام خصائص <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-css-r551/?msclkid=cd9dcb68c86711ec9862b8ac21a9e073" rel="">CSS</a></strong>: استخدم أداة Waterfall لفهم الآلية التي يُحدِّث فيها المتصفح صفحة ويب وتأثير الحركات التي تنتج عن تغير قيم خصائص <a href="https://academy.hsoub.com/programming/css/%d8%aa%d8%b9%d8%b1%d9%91%d9%81-%d8%b9%d9%84%d9%89-%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-css-r70/?msclkid=cd9d8518c86711ecba1c6f73c992ea4d" rel="">CSS</a> على الأداء.
	</li>
	<li>
		<strong>الاستخدام المكثَّف لجافاسكربت</strong>: استخدام الأداتين frame rate وWaterfall وللاطلاع على مشاكل الأداء الناتجة عن تنفيذ شيفرة جافاسكربت وكيف يساعد استخدام عمّال ويب web workers في حالات مثل هذه.
	</li>
</ul>
<h2>
	واجهة مستخدم الأداة Performance
</h2>

<p>
	تتألف واجهة المستخدِم من أربعة أقسام رئيسية:
</p>

<p style="text-align: center;">
	<img alt="01_performance_ui.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97298" data-unique="cwvggw22x" src="https://academy.hsoub.com/uploads/monthly_2022_04/01_performance_ui.png.60da7ecf431d6b6ce9c51fe24b5188e5.png" style="width: 550px; height: auto;"></p>

<ul>
<li>
		شريط الأدوات Toolbar.
	</li>
	<li>
		لوحة التسجيلات Recordings pane.
	</li>
	<li>
		لوحة نظرة عامة Recording overview.
	</li>
	<li>
		لوحة التفاصيل Details pane والتي قد تعرض أيًا من:
		<ul>
<li>
				تفاصيل الأداة الجزئية Waterfall.
			</li>
			<li>
				تفاصيل الأداة الجزئية Call Tree.
			</li>
			<li>
				تفاصيل الأداة الجزئية Flame Chart.
			</li>
		</ul>
</li>
</ul>
<h3>
	شريط الأدوات
</h3>

<p>
	يضم شريط الأدوات أزررًا مهمتها ما يلي:
</p>

<ul>
<li>
		تشغيل وإيقاف عملية تسجيل ملف الأداء.
	</li>
	<li>
		إدراج ملف أداء مخزن سابقًا.
	</li>
	<li>
		مسح لوحة السجلات، وانتبه أنك ستفقد أية سجلات غير مخزّنة إذا فعلت ذلك.
	</li>
	<li>
		ترشيح العلامات markers التي تُعرض عند استخدام الأداة الجزئية Waterfall.
	</li>
	<li>
		الانتقال بين تفاصيل الأدوات الجزئية في لوحة التفاصيل.
	</li>
	<li>
		الوصول إلى نافذة الإعدادات المنبثقة.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97299" href="https://academy.hsoub.com/uploads/monthly_2022_04/02_performance_toolbar.png.c6db8aa167a80ffbc794b3d3f4c649f7.png" rel=""><img alt="02_performance_toolbar.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97299" data-unique="kr9z85jxq" src="https://academy.hsoub.com/uploads/monthly_2022_04/02_performance_toolbar.thumb.png.45b7744bc0a71e47ef7beb1cd67f2033.png" style="width: 750px; height: auto;"></a>
</p>

<h3>
	لوحة التسجيلات
</h3>

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

<p style="text-align: center;">
	<img alt="03_performancr_recording_pane.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97300" data-unique="yltvens54" src="https://academy.hsoub.com/uploads/monthly_2022_04/03_performancr_recording_pane.png.667b65406c9933351ac90768a57911f1.png" style="width: 250px; height: auto;"></p>

<p>
	يُعرَض تسجيل واحد فقط وتصطف بقية التسجيلات على هيئة قائمة ضمن الأداة، كما يمكنك اختيار أيّ تسجيل لعرضه بالنقر عليه؛ أما لتخزين التسجيل على صورة ملف <a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D8%B9%D9%84%D9%85-json-r604/?msclkid=30ea9709c86811eca112be1e4184b18c" rel="">JSON</a>، فانقر على زر حفظ Save.
</p>

<h3>
	لوحة النظرة العامة
</h3>

<p>
	تعرض لمحة عامة عن التسجيل بأكمله مع الزمن الذي يمثله المحور X، كما تحوي اللوحة عنصرين هما لمحة عامة عن الأداة Waterfall ورسم بياني لمعدل الإطارات frame rate.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97301" href="https://academy.hsoub.com/uploads/monthly_2022_04/04_recording_overview.png.9914ba8c3237f11155431635e2892006.png" rel=""><img alt="04_recording_overview.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97301" data-unique="fmke2npxt" src="https://academy.hsoub.com/uploads/monthly_2022_04/04_recording_overview.thumb.png.d80f111f5c4a769a4c4c8028fe124924.png" style="width: 650px; height: auto;"></a>
</p>

<h4>
	لمحة عامة عن الأداة Waterfall
</h4>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97302" href="https://academy.hsoub.com/uploads/monthly_2022_04/05_waterfall_overview.png.09bb9d904dd9c643d4982a6881a072e6.png" rel=""><img alt="05_waterfall_overview.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97302" data-unique="2tsenu6j6" src="https://academy.hsoub.com/uploads/monthly_2022_04/05_waterfall_overview.thumb.png.ec972dfce4f17f428fcd39f618fb9631.png" style="width: 650px; height: auto;"></a>
</p>

<h4>
	الرسم البياني لمعدل الإطارات
</h4>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97303" href="https://academy.hsoub.com/uploads/monthly_2022_04/06_frame_rate_overview.png.7ab1523e49df5cb6c1221b71131d86f9.png" rel=""><img alt="06_frame_rate_overview.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97303" data-unique="zu5xiaty7" src="https://academy.hsoub.com/uploads/monthly_2022_04/06_frame_rate_overview.thumb.png.16a23c82666a96b9dc8f7cc5e9678575.png" style="width: 650px; height: auto;"></a>
</p>

<h4>
	ترابط الأحداث
</h4>

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

<p style="text-align: center;">
	<img alt="07_corelated_events.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97304" data-unique="c9eeqry6s" src="https://academy.hsoub.com/uploads/monthly_2022_04/07_corelated_events.png.db5c86bf2865dffbf8b3c7b5616defd6.png" style="width: 650px; height: auto;"></p>

<h4>
	نظرة أقرب إلى العرض
</h4>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97305" href="https://academy.hsoub.com/uploads/monthly_2022_04/08_zoomming_in_overview.png.38342439a6b9a7c623dc69892b1c7cd6.png" rel=""><img alt="08_zoomming_in_overview.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97305" data-unique="9217ovg90" src="https://academy.hsoub.com/uploads/monthly_2022_04/08_zoomming_in_overview.thumb.png.fab35abad3b827a0569561d12b348c02.png" style="width: 650px; height: auto;"></a>
</p>

<h3>
	لوحة التفاصيل
</h3>

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

<h4>
	الأداة Waterfall
</h4>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97306" href="https://academy.hsoub.com/uploads/monthly_2022_04/09_performance_waterfall.png.e1625b7900b4209f32dea845bfb24f33.png" rel=""><img alt="09_performance_waterfall.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97306" data-unique="9jumffl90" src="https://academy.hsoub.com/uploads/monthly_2022_04/09_performance_waterfall.thumb.png.2b4b34422a7174e8288a51660b1c044c.png" style="width: 650px; height: auto;"></a>
</p>

<h4>
	الأداة Call Tree
</h4>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97307" href="https://academy.hsoub.com/uploads/monthly_2022_04/10_call_tree.png.dc6db9e3a0ea03284330ece68ad5e50a.png" rel=""><img alt="10_call_tree.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97307" data-unique="g8hrt63du" src="https://academy.hsoub.com/uploads/monthly_2022_04/10_call_tree.thumb.png.47a7bbd8384f5d7c4362a3d653d8dc79.png" style="width: 650px; height: auto;"></a>
</p>

<h4>
	الأداة Flame chart
</h4>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97308" href="https://academy.hsoub.com/uploads/monthly_2022_04/11_flame_chart.png.637a1d4cbbf0144f0ce5b334e579ac48.png" rel=""><img alt="11_flame_chart.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97308" data-unique="chl54ri07" src="https://academy.hsoub.com/uploads/monthly_2022_04/11_flame_chart.thumb.png.5923fa57446570ce02afa0990227c469.png" style="width: 650px; height: auto;"></a>
</p>

<h4>
	الأداة Allocations
</h4>

<p>
	تشابه هذه الأداة الجديدة في فايرفوكس 46 الأداة Call Tree لكن لمواقع حجز الذاكرة، إذ تعرض لك الدوال التي تحجز ذاكرةً أكبر خلال فترة تسجيل ملف الأداء، ولن تظهر هذه الأداة إلا عندما تفعّل خيار سجِّل حجوزات الذاكرة Record Allocations من خلال إعدادات الأداة Performance.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97309" href="https://academy.hsoub.com/uploads/monthly_2022_04/12_allocations.png.a8cb69d43dce8af449cefad2686547d3.png" rel=""><img alt="12_allocations.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97309" data-unique="80uodt27d" src="https://academy.hsoub.com/uploads/monthly_2022_04/12_allocations.thumb.png.00dd781403620ae562d26819cb2c2a15.png" style="width: 700px; height: auto;"></a>
</p>

<p>
	لمعلومات أكثر عن الأدوات الجزئية اطلع على المقال المكوّنات الرئيسية للأداة Performance.
</p>

<h2>
	التعامل مع الأداة Performance
</h2>

<p>
	إليك بعض الإرشادات للتعامل مع الأداة Performance
</p>

<h3>
	تشغيل الأداة
</h3>

<p>
	لتشغيل الأداة:
</p>

<ul>
<li>
		اضغط المفتاحين <code>Shift</code> + <code>F5</code>
	</li>
	<li>
		اختر Performance من القائمة الفرعية أدوات مطوري ويب Web Developer الموجودة ضمن قائمة فايرفوكس أو قائمة الأدوات Tools، وهذا إذا كنت تعرض شريط القائمة أو كانت على نظام ماك أو إس OS X.
	</li>
	<li>
		اختر Performance من زر الأدوات في شريط الأدوات إذا كان موجودًا على متصفحك.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97310" href="https://academy.hsoub.com/uploads/monthly_2022_04/13_open_performance_tool.png.849c207c916959b877f780f36b083996.png" rel=""><img alt="13_open_performance_tool.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97310" data-unique="yxak99et2" src="https://academy.hsoub.com/uploads/monthly_2022_04/13_open_performance_tool.thumb.png.c5d7833590403a3696e412b06962d5c9.png" style="width: 650px; height: auto;"></a>
</p>

<h3>
	تسجيل ملف أداء
</h3>

<p>
	انقر على أيقونة الساعة في لوحة التسجيلات لبدء التسجيل وانقرها مجددًا لإيقافه، كما يمكنك بدء وإيقاف التسجيل من خلال الأداة Web Console باستخدام الأمرَين <code>()console.profile</code> و<code>()console.profileEnd</code>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97311" href="https://academy.hsoub.com/uploads/monthly_2022_04/14_record_profile.png.e34b15e07da59af91c2bb60d566b6562.png" rel=""><img alt="14_record_profile.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97311" data-unique="e1dnk5nw3" src="https://academy.hsoub.com/uploads/monthly_2022_04/14_record_profile.thumb.png.65edd864498a3aad5745aa54ac81855e.png" style="width: 650px; height: auto;"></a>
</p>

<h3>
	حفظ ملف أداء
</h3>

<p>
	انقر على الرابط الذي يحمل العنوان "حفظ Save" إلى جوار التسجيل في لوحة التسجيلات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97312" href="https://academy.hsoub.com/uploads/monthly_2022_04/15_save_profile.png.5f885abbd26199732e7786b227614999.png" rel=""><img alt="15_save_profile.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97312" data-unique="f2cr7qsbr" src="https://academy.hsoub.com/uploads/monthly_2022_04/15_save_profile.thumb.png.09f895b9bd10ff45ba68e504f3ff423a.png" style="width: 650px; height: auto;"></a>
</p>

<h3>
	تحميل ملف أداء
</h3>

<p>
	انقر على زر استيراد Import ثم اختر الملف الذي تريد استيراده.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97313" href="https://academy.hsoub.com/uploads/monthly_2022_04/16_import_profile.png.27ad5ac8d5e719dd16dc6406880a2448.png" rel=""><img alt="16_import_profile.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97313" data-unique="emz12uc1h" src="https://academy.hsoub.com/uploads/monthly_2022_04/16_import_profile.thumb.png.e77ea32f2ab48961d07fbfa5fa23ebad.png" style="width: 650px; height: auto;"></a>
</p>

<h3>
	حذف جميع الملفات المدرجة
</h3>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97314" href="https://academy.hsoub.com/uploads/monthly_2022_04/17_clear_all_profiles.png.5110d719e0e77ae02e3c6440f2886fd9.png" rel=""><img alt="17_clear_all_profiles.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97314" data-unique="5rz8rhbnr" src="https://academy.hsoub.com/uploads/monthly_2022_04/17_clear_all_profiles.thumb.png.af514635b24c1ce01a450705b7d604e1.png" style="width: 650px; height: auto;"></a>
</p>

<h3>
	اختيار أداة
</h3>

<p>
	انقر على الزر الموافق للأداة ضمن شريط الأدوات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97315" href="https://academy.hsoub.com/uploads/monthly_2022_04/18_switch_tools.png.d234e577eae0f9088da0989454da0d0e.png" rel=""><img alt="18_switch_tools.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97315" data-unique="xrymrs3f5" src="https://academy.hsoub.com/uploads/monthly_2022_04/18_switch_tools.thumb.png.5313977811b090130138faa2261daa1b.png" style="width: 650px; height: auto;"></a>
</p>

<h3>
	اختيار العلامات المعروضة
</h3>

<p>
	اضغط على زر المرشح Filter في شريط الأدوات لاختيار العلامات التي تريد إظهارها في الأداة Waterfall.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97316" href="https://academy.hsoub.com/uploads/monthly_2022_04/19_filter_markers.png.ea3c266a1155487782570c6d6cded714.png" rel=""><img alt="19_filter_markers.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97316" data-unique="miu5iu64b" src="https://academy.hsoub.com/uploads/monthly_2022_04/19_filter_markers.thumb.png.b9002448ea9eec73334f283fe04d543f.png" style="width: 650px; height: auto;"></a>
</p>

<h3>
	إلقاء نظرة أقرب على الأداء
</h3>

<p>
	اختر شريحةً محددةً من لوحة النظرة العامة للتسجيل وستعرض تفاصيل هذه الشريحة في لوحة التفاصيل.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97317" href="https://academy.hsoub.com/uploads/monthly_2022_04/20_zoom_in_record.png.1992a2e1305ce0bb0e4e46e0efc82c91.png" rel=""><img alt="20_zoom_in_record.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97317" data-unique="ddyb9wcbd" src="https://academy.hsoub.com/uploads/monthly_2022_04/20_zoom_in_record.thumb.png.65e5743e40a70c587811d2045036dbd1.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	ترجمة -وبتصرف- للمقالات التالية:
</p>

<ul>
<li>
		<a href="https://developer.mozilla.org/en-US/docs/Tools/Performance" rel="external nofollow">?What tools are available to debug and improve website performance</a>.
	</li>
	<li>
		<a href="https://developer.mozilla.org/en-US/docs/Tools/Performance/How_to" rel="external nofollow">?How to Open the Performance tools</a>.
	</li>
	<li>
		<a href="https://developer.mozilla.org/en-US/docs/Tools/Performance/UI_Tour" rel="external nofollow">UI Tour</a>.
	</li>
</ul>
<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D8%A7%D9%84%D8%B8%D9%87%D9%88%D8%B1-%D9%81%D9%8A-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-r485/" rel="">تحسين الظهور في محركات البحث</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/html-%D9%88-css-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D9%85%D9%85-%D8%A3%D9%88%D9%84-%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D9%8A%D8%A8-%D9%84%D9%83-r242/?msclkid=7e1ded17c86911ec9e82b81a7907f8e4" rel="">HTML و CSS للمبتدئين: كيف تصمم أول صفحة ويب لك</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1540</guid><pubDate>Sun, 08 May 2022 15:00:02 +0000</pubDate></item><item><title>&#x645;&#x634;&#x627;&#x631;&#x643;&#x629; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x627;&#x644;&#x62A;&#x642;&#x62F;&#x645;&#x64A;&#x629; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x639;&#x628;&#x631; &#x627;&#x644;&#x648;&#x627;&#x62C;&#x647;&#x629; Web Share</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A9-web-share-r1545/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_04/thumb.png.6f4a8f789d5087825dbc6b3b14dafc2f.png" /></p>

<p>
	يمكن لتطبيقات الويب استخدام نفس إمكانيات المشاركة التي توفرها التطبيقات المثبتة على نظام التشغيل platform-specific، وذلك باستخدام <a href="https://academy.hsoub.com/programming/general/%D8%A7%D8%B3%D8%AA%D9%82%D8%A8%D8%A7%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%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-web-share-target-r1544/" rel="">الواجهة البرمجية Web Share</a> التي تعمل في الخلفية Web Share <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>، إذ تتيح هذه الواجهة لتطبيقات الويب إمكانية مشاركة الروابط والنصوص والملفات مع التطبيقات الأخرى المثبتة على الجهاز كما التطبيقات المخصوصة بالنظام (تطبيقات النظام الأصلية أو التطبيقات المثبتة في النظام).
</p>

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

<h2>
	المفاهيم والاستخدامات
</h2>

<p>
	تتيح الواجهة البرمجية Web Share مشاركة البيانات في تطبيقات الويب ضمن قدرات استخدامها ومحدودياتها، موضّح فيما يلي هذه القدرات كما مذكور أيضًا طريقة استخدام هذه الواجهة في مشاركة محتوى تطبيقات الويب.
</p>

<h3>
	القدرات والمحدوديّات
</h3>

<p>
	تمتلك الواجهة البرمجية Web Share القدرات والمحدوديّات التالية:
</p>

<ul>
<li>
		يمكن استخدامها فقط في المواقع الآمنة، التي يُوصل إليها عبر <a href="https://academy.hsoub.com/questions/2557-%D9%85%D8%A7%D9%87%D9%88-%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-http-%D9%88-https%D8%9F/" rel="">بروتوكول HTTPS</a>.
	</li>
	<li>
		يجب أن تُستدعى استجابةً لإجراء مستخدم مثل النقر click، إذ لا يمكن استدعائها من خلال معالج التحميل <code>onload</code>.
	</li>
	<li>
		يمكن بواسطتها مشاركة عناوين URL أو نصوص أو ملفات.
	</li>
	<li>
		أصبحت متاحة على متصفحات Safari و Android و Chrome OS و Chrome على Windows، اعتبارًا من يناير كانون الأول 2021، أما إتاحتها في Chrome على MacOS لا تزال قيد التطوير، اطلع على <a href="https://developer.mozilla.org/docs/Web/API/Navigator/share#Browser_compatibility" rel="external nofollow">MDN</a> للحصول على التفاصيل.
	</li>
</ul>
<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="97373" data-unique="9l3smz3j7" src="https://academy.hsoub.com/uploads/monthly_2022_04/01.system_level_share_target_picker.png.dfa15cfb118b6c8afc4c88e4e004859a.png" alt="01.system_level_share_target_picker.png"></p>

<p style="text-align: center;">
	مُنتقي وُجْهة المشاركة على مستوى النظام مع تطبيق ويب تقدمي PWA مثبت كخيار للمشاركة إليه.
</p>

<h3>
	مشاركة الروابط والنصوص
</h3>

<p>
	إن أردت مشاركة الروابط والنصوص عبر الواجهة البرمجية Web Share، فاستخدم الدالة <code>()share</code>، وهي دالة تعتمد على <a href="https://wiki.hsoub.com/JavaScript/Promise" rel="external">الوعد promise</a> مع كائن خصائص properties مطلوب، ولمنع المتصفح من رمي خطأ TypeError، إذ يجب أن يحتوي ذلك الكائن على واحدة على الأقل من الخاصيات التالية: <code>title</code> أو<code>text</code> أو<code>URL</code> أو<code>files</code>، مثلًا يمكنك مشاركة نص بدون عنوان URL أو العكس، وإتاحة إمكانية مشاركة الخصائص الثلاثة يؤدي إلى زيادة مرونة حالات الاستخدام.
</p>

<p>
	تخيل أنه بعد تشغيل الشيفرة التالية، اختار المستخدم تطبيق بريد إلكتروني كوُجْهة مشاركة، فحينها يصبح المعامل <code>title</code> هو موضوع رسالة subject والمعامل <code>text</code> هو نص الرسالة والمعامل <code>files</code> يصبح هو مرفقات الرسالة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2906_6" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">navigator</span><span class="pun">.</span><span class="pln">share</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  navigator</span><span class="pun">.</span><span class="pln">share</span><span class="pun">({</span><span class="pln">
    title</span><span class="pun">:</span><span class="pln"> </span><span class="str">'web.dev'</span><span class="pun">,</span><span class="pln">
    text</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Check out web.dev.'</span><span class="pun">,</span><span class="pln">
    url</span><span class="pun">:</span><span class="pln"> </span><span class="str">'https://web.dev/'</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">})</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">then</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Successful share'</span><span class="pun">))</span><span class="pln">
    </span><span class="pun">.</span><span class="kwd">catch</span><span class="pun">((</span><span class="pln">error</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Error sharing'</span><span class="pun">,</span><span class="pln"> error</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	إذا حوى موقعك على عناوين URL متعددة لنفس المحتوى، فشارِك عنوان URL الأساسي للصفحة بدلاً من عنوان URL الحالي، أي بدلاً من مشاركة <code>document.location.href</code>؛ يمكنك إيجاد عنوان URL الأساسي في وسم <code><a href="https://wiki.hsoub.com/HTML/meta" rel="external">&lt;meta&gt;</a></code> ضمن <code><a href="https://wiki.hsoub.com/HTML/head" rel="external">&lt;head&gt;</a></code> الصفحة ومشاركته، فهذا سيوفر تجربة أفضل للمستخدم، ليس فقط على صعيد تجنب عمليات إعادة التوجيه، ولكنه يضمن أيضًا أن عنوان URL المشارك يخدم تجربة المستخدم الصحيحة لعميل معين، مثلًا إذا شاركك صديقك عنوان URL من هاتفه المحمول وفتحته عبر حاسوبك المكتبي، فيجب أن ترى إصدار سطح المكتب من الموقع او التطبيق المُشارك:
</p>

<pre class="ipsCode">
let url = document.location.href;
const canonicalElement = document.querySelector('link[rel=canonical]');
if (canonicalElement !== null) {
    url = canonicalElement.href;
}
navigator.share({url});
</pre>

<h3>
	مشاركة الملفات
</h3>

<p>
	إذا أردت إتاحة ميزة مشاركة الملفات في تطبيقك، اختبر أولًا إمكانية المشاركة عبر استدعاء التابع <code>()navigator.canShare</code>، ثم ضمِّن مجموعة من الملفات في استدعاء التابع <code>()navigator.share</code>:
</p>

<pre class="ipsCode">
if (navigator.canShare &amp;&amp; navigator.canShare({ files: filesArray })) {
  navigator.share({
    files: filesArray,
    title: 'Vacation Pictures',
    text: 'Photos from September 27 to October 14.',
  })
  .then(() =&gt; console.log('Share was successful.'))
  .catch((error) =&gt; console.log('Sharing failed', error));
} else {
  console.log(`Your system doesn't support sharing files.`);
}
</pre>

<p>
	لاحظ أن المثال يعالج الكشف عن ميزة إمكانية المشاركة عبر التابع <code>()navigator.canShare</code> بدلاً من التابع <code>()navigator.share</code>.
</p>

<p>
	كائن البيانات الممرر للدالة <code>()canShare</code> في هذا المثال يدعم خاصية <code>files</code> فقط، لكن يمكن مشاركة ملفات الصور والفيديو والصوت والنص. (راجع امتدادات الملفات المسموح بمشاركتها حاليًا <a href="https://docs.google.com/document/d/1tKPkHA5nnJtmh2TgqWmGSREUzXgMUFDL6yMdVZHqUsg/edit?usp=sharing" rel="external nofollow">في Chromium</a>).
</p>

<h2>
	دراسة حالة لبرنامج Santa Tracker
</h2>

<p>
	يعد <a href="https://santatracker.google.com/" rel="external nofollow">Santa Tracker</a> مشروعًا مفتوح المصدر، وهو تطبيق ترفيهي سنوي تحت عنوان عيد الميلاد أطلقته Google، يتيح للمستخدمين اللعب ومشاهدة وتعلم الأنشطة الصغيرة التي تُضاف يوميًا من بداية ديسمبر كل عام، كما يتيح تعقب السانتا (بابا نويل) أثناء عشية عيد الميلاد.
</p>

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

<p>
	لكن باستخدام الواجهة البرمجية Web Share تمكن فريق Santa Tracker من تقديم زر مشاركة واحد ويؤدي الغرض، مما يوفر مساحة ثمينة في الشاشة. توجه إلى <a href="https://santatracker.google.com/" rel="external nofollow">Santa Tracker</a> لمشاهدة فعاليِّة مشاركة الويب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2022_04/02santa_tracker_share_button.png.f560403435d57e9a2036d8fa4de3147c.png" data-fileid="97374" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="97374" data-unique="65dsmetri" src="https://academy.hsoub.com/uploads/monthly_2022_04/02santa_tracker_share_button.thumb.png.fde047e05e07b0c8f54d6e48d63e0e94.png" alt="02santa_tracker_share_button.png"></a>
</p>

<p style="text-align: center;">
	زر المشاركة في تطبيق Santa Tracker.
</p>

<h2>
	دعم المتصفحات
</h2>

<p>
	هناك فروقات دقيقة في دعم المتصفحات للواجهة البرمجية Web Share، ويوصَى باستخدام استراتيجية اكتشاف الميزات (كما هو موضح في نماذج الشيفرات السابقة) بدلاً من افتراض دعم دالة معينة.
</p>

<p>
	دعم متصفحَي Safari و Chrome استخدام الواجهة Web Share لمشاركة العناوين والنصوص وعناوين URL بداية عام 2021 بالإصدارات التالية:
</p>

<ul>
<li>
		Safari الإصدار 12 أو أحدث على macOS و iOS.
	</li>
	<li>
		Chrome الإصدار 75 أو أحدث على Android، والإصدار 89 أو أحدث على Chrome OS و Windows.
	</li>
</ul>
<p>
	كما دعم المتصفحان استخدام الواجهة Web Share لمشاركة الملفات أيضًا، وذلك بالإصدارات التالية:
</p>

<ul>
<li>
		Safari الإصدار أو أحدث على macOS وiOS.
	</li>
	<li>
		Chrome الإصدار 75 أو أحدث على Android، والإصدار 89 أو أحدث على Chrome OS و Windows.
	</li>
</ul>
<p>
	تتمتع معظم المتصفحات المبنية على متصفح Chromium، مثل Edge، بنفس الدعم لميزة المشاركة مثل الإصدار المقابل من Chrome.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://web.dev/web-share/" rel="external nofollow">Integrate with the OS sharing UI with the Web Share <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a> من موقع <a href="https://web.dev/" rel="external nofollow">web.dev</a>
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A7%D8%B3%D8%AA%D9%82%D8%A8%D8%A7%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%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-web-share-target-r1544/" rel="">استقبال تطبيقات الويب التقدمية البيانات المشاركة عبر الواجهة البرمجية Web Share Target</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa%D8%9F-r1480/" rel="">ما هي تطبيقات الويب التقدمية PWA</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AC%D8%B9%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-%D9%8A%D8%A8%D8%AF%D9%88-%D9%83%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A-%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-r1528/" rel="">جعل تطبيق الويب التقدمي PWA يبدو كتطبيق أساسي في نظام التشغيل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%A7%D8%AE%D8%AA%D8%B5%D8%A7%D8%B1%D8%A7%D8%AA-%D9%84%D9%84%D9%85%D9%87%D8%A7%D9%85-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r1543/" rel="">إضافة اختصارات للمهام الشائعة في تطبيقات الويب التقدمية PWA</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1545</guid><pubDate>Sat, 30 Apr 2022 16:02:09 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x642;&#x628;&#x627;&#x644; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x627;&#x644;&#x62A;&#x642;&#x62F;&#x645;&#x64A;&#x629; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x634;&#x627;&#x631;&#x643;&#x629; &#x639;&#x628;&#x631; &#x627;&#x644;&#x648;&#x627;&#x62C;&#x647;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629; Web Share Target</title><link>https://academy.hsoub.com/programming/general/%D8%A7%D8%B3%D8%AA%D9%82%D8%A8%D8%A7%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%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-web-share-target-r1544/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_04/thumb.png.da5d8a77f1e7cc8a484b0c0eda459c6b.png" /></p>

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

<p>
	كان فقط بإمكان التطبيقات المثبتة على نظام التشغيل platform-specific التسجيل في نظام التشغيل لاستقبال البيانات المشاركة من التطبيقات المثبتة الأخرى، لكن باستخدام الواجهة البرمجية Web Share Target (وُجهة مشاركة الويب) التي تعمل في الخلفية Web share Target <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>، أصبح بإمكان تطبيقات الويب المثبتة على الجهاز أيضًا التسجيل مع نظام التشغيل كهدف مشاركة لاستقبال بيانات من التطبيقات الأخرى.
</p>

<p>
	إمكانية استقبال تطبيقات الويب البيانات المُشاركة يُعد مكمّلًا لإمكانية تطبيقات أخرى على مشاركة البيانات، يمكنك مراجعة مقال <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A9-web-share-r1545/" rel="">مشاركة البيانات عبر الواجهة Web Share في تطبيقات الويب التقدمية</a>.
</p>

<h2>
	تجريب الواجهة البرمجية Web Share Target
</h2>

<p>
	إن أردت تجريب الواجهة البرمجة Web Share Target، اتبع الخطوات التالية:
</p>

<ul>
<li>
		افتح العرض التوضيحي لهذه الواجهة <a href="https://web-share.glitch.me/" rel="external nofollow">Web Share Target Demo</a> وذلك على متصفح Chrome، بالإصدار 76 فما فوق على نظام أندرويد، أو 89 فما فوق على سطح المكتب.
	</li>
	<li>
		انقر زر المشاركة في العرض التوضيحي.
	</li>
	<li>
		اختر أحد التطبيقات الظاهرة في مُنتقي جهات المشاركة كوجْهة للمشاركة.
	</li>
</ul>
<p>
	بعد إتمامك عملية المُشاركة، ستُشاهد النص المُشارَك في التطبيق الذي اخترته.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97371" href="https://academy.hsoub.com/uploads/monthly_2022_04/01system_level_share_target_picker.png.87f5b276d211bca3abe29ee30816154c.png" rel=""><img alt="01system_level_share_target_picker.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97371" data-unique="qoarf5pmf" src="https://academy.hsoub.com/uploads/monthly_2022_04/01system_level_share_target_picker.png.87f5b276d211bca3abe29ee30816154c.png"></a>
</p>

<p>
	منتقي وجهة المشاركة على مستوى النظام.
</p>

<h2>
	تسجيل التطبيق كهدف مشاركة
</h2>

<p>
	يجب أن يستوفي تطبيقك <a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D9%88%D9%81%D9%8A%D8%B1-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D8%AF%D8%A7%D8%AE%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1445/" rel="">معايير Chrome الخاصة بقابلية تثبيت التطبيقات</a> لتسجيله كوجهة مشاركة، أيضًا حتى يتمكن المستخدم من مشاركة محتوى ما إلى تطبيقك، فيجب أن يكون تطبيقك مثبتًا في شاشته الرئيسية، فهذا يمنع المواقع من إضافة نفسها عشوائيًا إلى منتقي وُجهات المشاركة Share Target Picker المتاح للمستخدم مشاركة المحتوى إليها.
</p>

<h2>
	حدِّث ملف بيان موارد تطبيق الويب
</h2>

<p>
	لتسجيل تطبيقك كهدف مشاركة، أضف الخاصية <code>share_target</code> إلى <a href="https://academy.hsoub.com/programming/general/%D8%B4%D8%B1%D8%AD-%D9%85%D9%84%D9%81-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86-manifest-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1385/" rel="">ملف بيانه manifest</a>، فهي تخبر نظام التشغيل بتضمين تطبيقك كخيار في منتقي وُجْهات المشاركة، وبشكل عام ما تضيفه إلى الخاصية <code>share_target</code> يضبط البيانات التي سيقبل تطبيقك أن تشارُكها.
</p>

<p>
	هناك ثلاثة طرق شائعة لضبط الخاصية <code>share_target</code>:
</p>

<ul>
<li>
		قبول محتوى المشاركة الأساسي.
	</li>
	<li>
		قبول بيانات مشاركة تُحْدِث تغييرات في التطبيق.
	</li>
	<li>
		قبول تشارُك الملفات.
	</li>
</ul>
<h3>
	قبول محتوى المشاركة الأساسي
</h3>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7544_8" style="">
<span class="str">"share_target"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="str">"action"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"/share-target/"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"method"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"GET"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"params"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">"title"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"title"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"text"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"text"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"url"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"url"</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	إذا كان تطبيقك يتيح المشاركة بواسطة بروتوكول عنوان URL Scheme، وكان يستخدم القيمة <code>body</code> للحقل <code>text</code> بدلاً من القيمة <code>text</code>، يمكنك استبدال <code>text": "text"‎"</code> في الشيفرة السابقة بالقيمة <code>"text": "body"</code>.
</p>

<p>
	النوع الافتراضي لنوع طلبية http والمعبر عنه بالحقل <code>method</code> هو <code>"GET"</code>. يشير حقل <code>enctype</code> غير الظاهر في الشيفرة السابقة إلى نوع تشفير البيانات، يعيَّن هذا الحقل بالقيمة <code>"application / x-www-form-urlencoded"</code> افتراضيًا عندما تكون الطريقة هي <code>"GET"</code>.
</p>

<h3>
	قبول بيانات مشاركة تُحْدِث تغييرات في التطبيق
</h3>

<p>
	إذا كانت البيانات المشاركة تُحدِثْ تغييرات في التطبيق الوجْهة بطريقة ما، مثلًا تحفظ إشارات مرجعية فيه، وقتها عيّن الحقل <code>method</code> بالنوع <code>"POST"</code> واضبط الحقل <code>enctype</code>.
</p>

<p>
	يُنشئ المثال التالي إشارة مرجعية في التطبيق الوُجْهة، لذا فإنه يستخدم <code>"POST"</code> للحقل <code>method</code> و القيمة <code>"multart/form-data"</code> للحقل <code>enctype</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7544_10" style="">
<span class="pun">{</span><span class="pln">
  </span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Bookmark"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"share_target"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">"action"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"/bookmark"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"method"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"POST"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"enctype"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"multipart/form-data"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"params"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="str">"url"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"link"</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	قبول مشاركة الملفات
</h3>

<p>
	كما هو الحال مع البيانات المُشاركة التي تُحْدِث تغييرات في التطبيق، يتطلب قبول مشاركة الملفات أن تكون طريقة المشاركة <code>method</code> هي <code>"POST"</code> وأن يكون نوع <code>enctype</code> هو <code>"multipart/form-data"</code>، ويجب إضافة الحقل <code>files</code>، التي تمثل مصفوفة أنواع الملفات التي يقبلها تطبيقك، عناصر المصفوفة عبارة عن كائنات مكونة من حقلين: <code>name</code> و<code>accept</code>. يمثل حقل <code>accept</code> نوع MIME للملف أو إمتداده أو مصفوفة تحتوي كليهما. يفضّل توفير مصفوفة تتضمن كلاً من نوع MIME وامتداد الملف لاختلاف أنظمة التشغيل في ما تفضِّل منهما.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7544_12" style="">
<span class="pun">{</span><span class="pln">
  </span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Aggregator"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"share_target"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">"action"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"/cgi-bin/aggregate"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"method"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"POST"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"enctype"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"multipart/form-data"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"params"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="str">"title"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"name"</span><span class="pun">,</span><span class="pln">
      </span><span class="str">"text"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"description"</span><span class="pun">,</span><span class="pln">
      </span><span class="str">"url"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"link"</span><span class="pun">,</span><span class="pln">
      </span><span class="str">"files"</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="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"records"</span><span class="pun">,</span><span class="pln">
          </span><span class="str">"accept"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">"text/csv"</span><span class="pun">,</span><span class="pln"> </span><span class="str">".csv"</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="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"graphs"</span><span class="pun">,</span><span class="pln">
          </span><span class="str">"accept"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"image/svg+xml"</span><span class="pln">
        </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="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	معالجة المحتوى المشارك
</h2>

<p>
	طريقة التعامل مع البيانات المُشارَكة أمر متروك لك ويعتمد على تطبيقك، مثلًا:
</p>

<ul>
<li>
		يمكن لتطبيق البريد الإلكتروني، صياغة بريد إلكتروني جديد من المحتوى المشارَك، باستخدام العنوان <code>title</code> كموضوع للبريد الإلكتروني، والنص المُشارك <code>text</code> والرابط <code>url</code> متسلسلَين معًا كجسم لرسالة البريد.
	</li>
	<li>
		يمكن لتطبيق تواصل إجتماعي صياغة منشور جديد من المحتوى المشارَك، بتجاهل العنوان <code>title</code>، والاستفادة من <code>text</code> كنص للمنشور، وإضافة <code>url</code> كرابط للمنشور أو حتى كنص أساسي وذلك إذا كان <code>text</code> مفقود، وإذا كان <code>url</code> مفقودًا، فقد يفحص التطبيق النص <code>text</code> بحثًا عن أي عنوان URL ويضيفه كرابط.
	</li>
	<li>
		يمكن لتطبيق مشاركة الصور إنشاء عرض شرائح جديد من المحتوى المشارَك، باستخدام العنوان <code>title</code> كعنوان لعرض الشرائح و النص <code>text</code> كوصف للعرض والملفات <code>files</code> (ملفات الصور) كشرائح تتحرك في العرض.
	</li>
	<li>
		يمكن لتطبيق الرسائل النصية صياغة رسالة جديدة من المحتوى المشارَك وذلك باستخدام النص <code>text</code> و<code>url</code> متسلسلَين معًا كنص للرسالة وتجاهل العنوان <code>title</code>.
	</li>
</ul>
<h3>
	معالجة مشاركات GET
</h3>

<p>
	إذا اختار المستخدم تطبيقك كوُجْهة مشاركة، وكانت طريقة المشاركة <code>method</code> في تطبيقك هي <code>"GET"</code> (الافتراضية)، يفتح المتصفح نافذة جديدة على عنوان URL بقيمة الحقل <code>action</code> ضمن الخاصية <code>share_target</code>، ويولِّد المتصفح بعدها استعلامًا نصيًا بسيطًا، مثلًا إذا كان التطبيق المشارِك يوفر عنوان <code>title</code> ونص <code>text</code> بقيم معينة، فإن سلسلة الاستعلام التي يولّدها المتصفح ستكون <code>?title=hello&amp;text=world</code>. ولمعالجة هذا الاستعلام، استخدم مستمع الحدث DOMContentLoaded (يحصل هذا الحدث عند الانتهاء من تحميل المستند وبناء DOM) في الواجهة الأمامية foreground وحلِّل نص الاستعلام:
</p>

<pre class="ipsCode">
window.addEventListener('DOMContentLoaded', () =&gt; {
  const parsedUrl = new URL(window.location);
  // searchParams.get() will properly handle decoding the values.
  console.log('Title shared: ' + parsedUrl.searchParams.get('title'));
  console.log('Text shared: ' + parsedUrl.searchParams.get('text'));
  console.log('URL shared: ' + parsedUrl.searchParams.get('url'));
});
</pre>

<p>
	تأكد من استخدام <a href="https://academy.hsoub.com/programming/general/%D9%85%D9%81%D9%87%D9%88%D9%85-service-worker-%D9%88%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1%D9%87-%D9%81%D9%8A-%D8%A3%D8%AF%D8%A7%D8%A1-%D9%88%D8%A8%D9%86%D9%8A%D8%A9-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D9%88%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r833/" rel="">عامل الخدمة</a> لتخزين صفحة الإجراء <code>action</code> مؤقتًا بحيث تُحمَّل بسرعة وتعمل بموثوقية، حتى إن لم يكن المستخدم متصلًا بالشبكة.
</p>

<p>
	يمكن أن تساعدك الأداة <a href="https://developers.google.com/web/tools/workbox/" rel="external nofollow">Workbox</a> في تنفيذ تخزين مؤقت مسبق preaching بالاستفادة من عامل خدمة تطبيقك.
</p>

<h3>
	معالجة مشاركات POST
</h3>

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

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7544_15" style="">
<span class="pln">self</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'fetch'</span><span class="pun">,</span><span class="pln"> event </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> url </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> URL</span><span class="pun">(</span><span class="pln">event</span><span class="pun">.</span><span class="pln">request</span><span class="pun">.</span><span class="pln">url</span><span class="pun">);</span><span class="pln">
  </span><span class="com">// If this is an incoming POST request for the</span><span class="pln">
  </span><span class="com">// registered "action" URL, respond to it.</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">event</span><span class="pun">.</span><span class="pln">request</span><span class="pun">.</span><span class="pln">method </span><span class="pun">===</span><span class="pln"> </span><span class="str">'POST'</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
      url</span><span class="pun">.</span><span class="pln">pathname </span><span class="pun">===</span><span class="pln"> </span><span class="str">'/bookmark'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    event</span><span class="pun">.</span><span class="pln">respondWith</span><span class="pun">((</span><span class="pln">async </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">const</span><span class="pln"> formData </span><span class="pun">=</span><span class="pln"> await event</span><span class="pun">.</span><span class="pln">request</span><span class="pun">.</span><span class="pln">formData</span><span class="pun">();</span><span class="pln">
      </span><span class="kwd">const</span><span class="pln"> link </span><span class="pun">=</span><span class="pln"> formData</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'link'</span><span class="pun">)</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="kwd">const</span><span class="pln"> responseUrl </span><span class="pun">=</span><span class="pln"> await saveBookmark</span><span class="pun">(</span><span class="pln">link</span><span class="pun">);</span><span class="pln">
      </span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Response</span><span class="pun">.</span><span class="pln">redirect</span><span class="pun">(</span><span class="pln">responseUrl</span><span class="pun">,</span><span class="pln"> </span><span class="lit">303</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="pun">});</span></pre>

<h3>
	التحقق من المحتوى المُشارَك
</h3>

<p>
	تحقق من معالجة البيانات المُشاركة، فللأسف ليس هناك ما يضمن أن التطبيقات الوجهة ستشارك المحتوى المخصص في المكان المناسب بناء على معاملاته (معاملات المحتوى المشارك).
</p>

<p>
	مثلًا يبقى حقل الرابط url فارغًا في نظام Android كما ترى في الصورة التالية، كونه غير مدعوم في نظام مشاركة Android، فغالبًا ما تظهر عناوين URL في حقل النص، أو أحيانًا في حقل العنوان.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97372" href="https://academy.hsoub.com/uploads/monthly_2022_04/02web_share_target_handler.png.f6f6bdf5e56106b5247daf4f75238d0b.png" rel=""><img alt="02web_share_target_handler.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97372" data-unique="v1yxj4xm6" src="https://academy.hsoub.com/uploads/monthly_2022_04/02web_share_target_handler.png.f6f6bdf5e56106b5247daf4f75238d0b.png"></a>
</p>

<p>
	معالجة المحتوى المشارَك في التطبيق الوجهة.
</p>

<h2>
	دعم المتصفحات
</h2>

<p>
	دعَم متصفحَي Chrome وEdge الواجهة البرمجية Web Share Target اعتبارًا من أوائل عام 2021 على النحو التالي:
</p>

<ul>
<li>
		الإصدار 76 فما فوق من كلا المتصفحين (Chrome وEdge) على نظام Android
	</li>
	<li>
		الإصدار 89 فما فوق من Chrome على نظام Chrome OS.
	</li>
</ul>
<p>
	تذكر بالنسبة لجميع أنظمة التشغيل الأساسية، أنه يجب تثبيت تطبيق الويب حتى يظهر كهدف محتمل لاستقبال البيانات المُشاركة.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://web.dev/web-share-target/" rel="external nofollow">Receiving shared data with the Web Share Target <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a> من موقع <a href="https://web.dev/" rel="external nofollow">web.dev</a>
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa%D8%9F-r1480/" rel="">ما هي تطبيقات الويب التقدمية PWA</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1489/" rel="">ميزات تطبيق الويب التقدمي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A9-web-share-r1545/" rel="">مشاركة تطبيقات الويب التقدمية البيانات عبر الواجهة Web Share</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%A7%D8%AE%D8%AA%D8%B5%D8%A7%D8%B1%D8%A7%D8%AA-%D9%84%D9%84%D9%85%D9%87%D8%A7%D9%85-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r1543/" rel="">إضافة اختصارات للمهام الشائعة في تطبيقات الويب التقدمية PWA</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D9%81%D9%87%D9%88%D9%85-service-worker-%D9%88%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1%D9%87-%D9%81%D9%8A-%D8%A3%D8%AF%D8%A7%D8%A1-%D9%88%D8%A8%D9%86%D9%8A%D8%A9-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D9%88%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r833/" rel="">مفهوم Service Worker وتأثيره في أداء وبنية مواقع وتطبيقات الويب</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1544</guid><pubDate>Sat, 30 Apr 2022 16:03:39 +0000</pubDate></item><item><title>&#x625;&#x636;&#x627;&#x641;&#x629; &#x627;&#x62E;&#x62A;&#x635;&#x627;&#x631;&#x627;&#x62A; &#x644;&#x644;&#x645;&#x647;&#x627;&#x645; &#x627;&#x644;&#x634;&#x627;&#x626;&#x639;&#x629; &#x641;&#x64A; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x627;&#x644;&#x62A;&#x642;&#x62F;&#x645;&#x64A;&#x629; PWA</title><link>https://academy.hsoub.com/programming/general/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%A7%D8%AE%D8%AA%D8%B5%D8%A7%D8%B1%D8%A7%D8%AA-%D9%84%D9%84%D9%85%D9%87%D8%A7%D9%85-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r1543/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_04/thumb.png.312e022aa3c1154b49d1608ad54846a0.png" /></p>

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

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

<h2>
	نبذة عن اختصارات التطبيق
</h2>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97366" href="https://academy.hsoub.com/uploads/monthly_2022_04/01app_shortcuts_menu_on_android.png.2ca27d5bbe37342d3b428c78b25ce42d.png" rel=""><img alt="01app_shortcuts_menu_on_android.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97366" data-unique="gixolb7hb" src="https://academy.hsoub.com/uploads/monthly_2022_04/01app_shortcuts_menu_on_android.png.2ca27d5bbe37342d3b428c78b25ce42d.png" style="width: 650px; height: auto;"></a>
</p>

<p style="text-align: center;">
	قائمة اختصارات التطبيق في Android.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97367" href="https://academy.hsoub.com/uploads/monthly_2022_04/01app_shortcuts_menu_on_windows.png.db0360c47291b5279662c32ccfd53082.png" rel=""><img alt="01app_shortcuts_menu_on_windows.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97367" data-unique="7uev86dkp" src="https://academy.hsoub.com/uploads/monthly_2022_04/01app_shortcuts_menu_on_windows.png.db0360c47291b5279662c32ccfd53082.png" style="width: 650px; height: auto;"></a>
</p>

<p style="text-align: center;">
	قائمة اختصارات التطبيق في Windows.
</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%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r832/" rel="">لتطبيقات الويب التقدمية PWAs</a> المثبتة على سطح مكتب أو جهاز المستخدم المحمول.
</p>

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

<ul>
<li>
		صفحات التطبيق الرئيسية (الوصول إلى صفحة التطبيق الرئيسية أو صفحة آخر الطلبات مثلًا)
	</li>
	<li>
		مهام البحث في التطبيق
	</li>
	<li>
		مهام إدخال البيانات (مثلًا كتابة رسالة بريد أو منشور)
	</li>
	<li>
		الأنشطة (مثلًا بدء محادثة مع جهات الاتصال الشائعة)
	</li>
</ul>
<h2>
	تحديد اختصارات التطبيق في بيان تطبيق الويب manifest
</h2>

<p>
	تُحدَّد اختصارات التطبيقات اختياريًا في ملف <a href="https://academy.hsoub.com/programming/general/%D8%B4%D8%B1%D8%AD-%D9%85%D9%84%D9%81-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86-manifest-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1385/" rel="">بيان موارد تطبيق الويب manifest</a>، والذي هو عبارة عن ملف JSON يخبر المتصفح عن تطبيق الويب التقدمي PWA وكيف يجب أن يتصرف عند تثبيته على حاسوب المستخدم المكتبي أو جهازه المحمول، وتُعرَّف اختصارات التطبيقات في مصفوفة <code>shortcuts</code> بالتحديد ضمن هذا الملف كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5836_9" style="">
<span class="pun">{</span><span class="pln">
  </span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Player FM"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"start_url"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"https://player.fm?utm_source=homescreen"</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">…</span><span class="pln">
  </span><span class="str">"shortcuts"</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="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Open Play Later"</span><span class="pun">,</span><span class="pln">
      </span><span class="str">"short_name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Play Later"</span><span class="pun">,</span><span class="pln">
      </span><span class="str">"description"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"View the list of podcasts you saved for later"</span><span class="pun">,</span><span class="pln">
      </span><span class="str">"url"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"/play-later?utm_source=homescreen"</span><span class="pun">,</span><span class="pln">
      </span><span class="str">"icons"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[{</span><span class="pln"> </span><span class="str">"src"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"/icons/play-later.png"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"sizes"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"192x192"</span><span class="pln"> </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="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"View Subscriptions"</span><span class="pun">,</span><span class="pln">
      </span><span class="str">"short_name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Subscriptions"</span><span class="pun">,</span><span class="pln">
      </span><span class="str">"description"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"View the list of podcasts you listen to"</span><span class="pun">,</span><span class="pln">
      </span><span class="str">"url"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"/subscriptions?utm_source=homescreen"</span><span class="pun">,</span><span class="pln">
      </span><span class="str">"icons"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[{</span><span class="pln"> </span><span class="str">"src"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"/icons/subscriptions.png"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"sizes"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"192x192"</span><span class="pln"> </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="pun">}</span></pre>

<p>
	كل عضو في مصفوفة الاختصارات shortcuts هو كائن اختصار يتكون على الأقل من حقل الاسم وعنوان url، أما الحقول الأخرى فهي اختيارية.
</p>

<ul>
<li>
		حقل الاسم name: التسمية الممكن للمستخدمين قراءتها لاختصار التطبيق.
	</li>
	<li>
		حقل الاسم المختصر short_name (اختياري): التسمية الممكن للمستخدمين قراءتها لاختصار التطبيق عندما تكون المساحة محدودة، ويوصى بتعيين هذا الحقل حتى لو كان اختياريًا.
	</li>
	<li>
		حقل الوصف description (اختياري): الغرض من اختصار التطبيق.
	</li>
	<li>
		حقل عنوان URL: عنوان URL الذي يُفتح عندما ينقر المستخدم على اختصار التطبيق، ويجب أن يكون عنوان URL هذا موجودًا في نطاق بيان تطبيق الويب.
	</li>
	<li>
		حقل الأيقونات icons (اختياري): مصفوفة من كائنات الصور، يتكون كل كائن منها خاصية <code>src</code> و<code>size</code> بشكل أساسي، بالإضافة للخاصية الإختيارية <code>type</code>.
	</li>
</ul>
<p>
	إذا كنت تريد تعيين أيقونات مثالية الحجم، فاجعلها بالحجم الموصى به 48dp، والذي يتوافق مع كثافات القياسات التالية بوحدة البكسل بناء على معادلة التحويل التالية:
</p>

<pre class="ipsCode">
px = dp * (dpi / 160)
</pre>

<ul>
<li>
		في الشاشات منخفضة الكثافة ldpi والتي تكافئ 120 dpi، الحجم 48dp يساوي 48*0.75=36px
	</li>
	<li>
		في الشاشات متوسطة الكثافة mdpi والتي تكافئ 160 dpi، الحجم 48dp يساوي 48px (نفسه)، أي يكون حجم الأيقونة 48x48 بكسل
	</li>
	<li>
		في الشاشات عالية الكثافة hdpi والتي تكافئ 240 dpi، الحجم 48dp يساوي 48*1.5=72px، أي يكون حجم الأيقونة 72x72 بكسل
	</li>
	<li>
		في الشاشات عالية الكثافة جدًا xhdpi والتي تكافئ 320 dpi، الحجم 48dp يساوي 48*2=96px، أي يكون حجم الأيقونة 96x96 بكسل
	</li>
	<li>
		في الشاشات عالية الكثافة جدًا جدًا xxhdpi والتي تكافئ 480 dpi، الحجم 48dp يساوي 48*3=144px، أي يكون حجم الأيقونة 144x144 بكسل
	</li>
	<li>
		في الشاشات عالية الكثافة جدًا جدًا جدًا xxxhdpi والتي تكافئ 640 dpi، الحجم 48dp يساوي 48*4=192px، أي يكون حجم الأيقونة 192x192 بكسل
	</li>
</ul>
<h2>
	اختبر اختصارات تطبيقك
</h2>

<p>
	للتحقق من تعيين اختصارات التطبيق بشكل صحيح، استخدم قائمة Manifest في لوحة Application في أدوات المطور DevTools.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97368" href="https://academy.hsoub.com/uploads/monthly_2022_04/03app_shortcuts_shown_in_DevTools.png.853a4444f7731e28148ef85839e10ce2.png" rel=""><img alt="03app_shortcuts_shown_in_DevTools.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97368" data-unique="dx4w5el00" src="https://academy.hsoub.com/uploads/monthly_2022_04/03app_shortcuts_shown_in_DevTools.png.853a4444f7731e28148ef85839e10ce2.png" style="width: 750px; height: auto;"></a>
</p>

<p style="text-align: center;">
	تظهر الصورة اختصارات التطبيقات في DevTools
</p>

<p>
	توفر هذه القائمة إمكانية معاينة عدة خصائص محفوظة في ملف البيان، بما في ذلك اختصارات التطبيقات، ما يسهل التحقق من تحميل أيقونات الاختصارات إذا تم تعيينها (كونها اختيارية)، بالشكل الصحيح.
</p>

<h2>
	أفضل الممارسات
</h2>

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

<h3>
	طلب اختصارات التطبيق حسب الأولوية
</h3>

<p>
	يفضَّل تعيين اختصارات التطبيقات حسب الأولوية، وذلك بوضع اختصارات التطبيقات الأكثر أهمية في بداية مصفوفة الاختصارات <code>shortcuts</code> ضمن <a href="https://academy.hsoub.com/programming/general/%D8%B4%D8%B1%D8%AD-%D9%85%D9%84%D9%81-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86-manifest-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1385/" rel="">ملف mainfest</a>، نظرًا لأن الحد الأقصى لعدد الاختصارات التي تظهر في قائمة اختصارات التطبيق يختلف باختلاف نظام التشغيل.
</p>

<p>
	مثلًا يتيح Chrome وEdge حتى 10 اختصارات للتطبيق في نظام Windows، بينما يأخذ Chrome في الاعتبار أول 4 اختصارات للتطبيق فقط في نظام Android، ويسمح متصفح Chrome 92 الآن بثلاث اختصارات للتطبيقات فقط على نظام Android 7
</p>

<h3>
	استخدم أسماء اختصارات فريدة للتطبيق
</h3>

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

<h3>
	قياس استخدام اختصارات التطبيق
</h3>

<p>
	يمكنك تعقب عناوين (الخاصية <code>url</code>) اختصارات تطبيقك لأغراض إحصائية، مثلًا لقياس مدى استخدام مستخدمي تطبيقك تلك الاختصارات.
</p>

<h2>
	دعم المتصفحات
</h2>

<p>
	يدعم متصفحَي Chrome وEdge اختصارات تطبيقات الويب التقدمية على النحو التالي:
</p>

<ul>
<li>
		الإصدار 84 فما فوق من Chrome على نظام Android.
	</li>
	<li>
		الإصدار 85 فما فوق من كلا المتصفحين (Chrome وEdge) على نظام Windows.
	</li>
	<li>
		الإصدار 92 فما فوق من Chrome على نظام Chrome OS.
	</li>
	<li>
		الإصدار 96 فما فوق من كلا المتصفحين (Chrome وEdge) على نظامَي MacOS ولينكس Linux.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97369" href="https://academy.hsoub.com/uploads/monthly_2022_04/04app_shortcuts_menu_on_Chrome_OS.png.6cb83db83ad7efcb8e1c37772c1733dd.png" rel=""><img alt="04app_shortcuts_menu_on_Chrome_OS.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97369" data-unique="dsyso8h6i" src="https://academy.hsoub.com/uploads/monthly_2022_04/04app_shortcuts_menu_on_Chrome_OS.png.6cb83db83ad7efcb8e1c37772c1733dd.png"></a>
</p>

<h2>
	دعم فاعليِّة الويب الموثوق
</h2>

<p>
	فاعليِّة الويب الموثوق Trusted Web Activity هو طريقة لتغليف تطبيق الويب التقدمي بحاوية container تجعله يتصرف كتطبيقات الهواتف المعيارية.
</p>

<p>
	تقرأ الأداة <a href="https://github.com/GoogleChromeLabs/bubblewrap" rel="external nofollow">Bubblewrap</a> المستخدمة لإنشاء تطبيقات Android باستخدام فاعليِّة الويب الموثوق، اختصارات تطبيق الويب من ملف بيانه manifest، وتولِّد تلقائيًا الإعدادات المقابلة لها لتطبيق Android.
</p>

<p>
	لاحظ عند استخدام Bubblewrap أنه يجب تحديد أيقونات لاختصارات التطبيقات وبحجم لا يقل عن 96×96 بكسل.
</p>

<p>
	أداة باني تطبيق الويب التقدمي <a href="https://www.pwabuilder.com/" rel="external nofollow">PWABuilder</a> تحوِّل تطبيق الويب التقدمي بسهولة إلى فاعليِّة ويب موثوق، وتدعم اختصارات التطبيقات.
</p>

<h2>
	نموذج
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="97370" href="https://academy.hsoub.com/uploads/monthly_2022_04/05app_shortcuts_sample.gif.271c0066e26b6e2af360e2e1961fda20.gif" rel=""><img alt="05app_shortcuts_sample.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="97370" data-unique="ee4jfty2y" src="https://academy.hsoub.com/uploads/monthly_2022_04/05app_shortcuts_sample.thumb.gif.3db86eb2a77cabc3bd58836daace139c.gif" style="width: 650px; height: auto;"></a>
</p>

<p>
	راجع <a href="https://app-shortcuts.glitch.me/" rel="external nofollow">نموذج اختصارات التطبيق</a> و<a href="https://glitch.com/edit/#!/app-shortcuts" rel="external nofollow">مصدره</a>.
</p>

<p>
	<iframe allow="camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi" loading="lazy" style="height: 450px; width: 100%; border: 0;" title="app-shortcuts on Glitch" src="https://glitch.com/embed/#!/embed/app-shortcuts?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=public%2Fmanifest.json&amp;previewSize=100"></iframe>
</p>

<p>
	ثبت تطبيق PWA هذا وجرب اختصاراته.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://web.dev/app-shortcuts/" rel="external nofollow">Get things done quickly with app shortcuts</a> من موقع <a href="https://web.dev/" rel="external nofollow">web.dev</a>
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa%D8%9F-r1480/" rel="">ما هي تطبيقات الويب التقدمية PWA</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1489/" rel="">ميزات تطبيق الويب التقدمي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AC%D8%B9%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-%D9%8A%D8%A8%D8%AF%D9%88-%D9%83%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A-%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-r1528/" rel="">جعل تطبيق الويب التقدمي PWA يبدو كتطبيق أساسي في نظام التشغيل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D8%A7%D9%84%D8%AA%D8%AF%D8%B1%D9%8A%D8%AC%D9%8A-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r1529/" rel="">التحسين التدريجي لتطبيقات الويب التقدمية PWA</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%B4%D8%B1%D8%AD-%D9%85%D9%84%D9%81-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86-manifest-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1385/" rel="">شرح ملف البيان manifest لتطبيق الويب التقدمي PWA</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1543</guid><pubDate>Sat, 30 Apr 2022 15:45:22 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x645;&#x634;&#x647;&#x62F; &#x641;&#x636;&#x627;&#x626;&#x64A; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x633;&#x643;&#x631;&#x627;&#x62A;&#x634;</title><link>https://academy.hsoub.com/programming/general/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%85%D8%B4%D9%87%D8%AF-%D9%81%D8%B6%D8%A7%D8%A6%D9%8A-%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-r1531/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_04/625fdb9ce2363_----.png.e18485449f8aa52220d950863d730e59.png" /></p>

<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>.
</p>

<p>
	وسننفذ في هذا المشروع ما يلي:
</p>

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

<p style="width: 485px;margin: auto;">
	<iframe __idm_id__="1228804" allowtransparency="true" frameborder="0" height="402" src="https://scratch.mit.edu/projects/embed/485673032/?autostart=false" width="485"></iframe>
</p>

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

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

<h2>
	إعداد المشهد
</h2>

<p>
	سنعمل في هذه الخطوة على إعداد مشهد المشروع بإضافة كائن فضائي وخلفية فضائية!
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96727" href="https://academy.hsoub.com/uploads/monthly_2022_04/backdrop-step.png.b3e985e6ac40091ce06c02c37d41deff.png" rel=""><img alt="backdrop-step.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96727" data-unique="na3bvuvjm" src="https://academy.hsoub.com/uploads/monthly_2022_04/backdrop-step.png.b3e985e6ac40091ce06c02c37d41deff.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	يمكنك العمل مباشرةً على <a href="https://scratch.mit.edu/projects/582214330/editor" rel="external nofollow">نسخة المتصفح</a> من سكراتش باستخدام <a href="https://www.bing.com/ck/a?!&amp;&amp;p=266529af8bdb51539f7f5846535f1d9a8169f82b26cc632e764df48049e52208JmltdHM9MTY1MDQ1MDE2NiZpZ3VpZD02Nzk5YmU1Mi1kYmMxLTRiYTctOTZmZi1kYzdlNTk2YjE3MGUmaW5zaWQ9NTE0OQ&amp;ptn=3&amp;fclid=d26294b0-c093-11ec-9487-e45b074b98e5&amp;u=a1aHR0cHM6Ly9hY2FkZW15Lmhzb3ViLmNvbS9kZXZvcHMvbmV0d29ya2luZy8lRDglQUElRDglQjklRDglQjElRDklODEtJUQ4JUI5JUQ5JTg0JUQ5JTg5LSVEOCVCOSVEOSU4NiVEOCVBNyVEOSU4OCVEOSU4QSVEOSU4Ni0lRDglQTglRDglQjElRDklODglRDglQUElRDklODglRDklODMlRDklODglRDklODQtJUQ4JUE3JUQ5JTg0JUQ4JUE1JUQ5JTg2JUQ4JUFBJUQ4JUIxJUQ5JTg2JUQ4JUFBLSVEOSU4OCVEOCVBNyVEOSU4NCVEOCVCNCVEOCVBOCVEOSU4MyVEOCVBNyVEOCVBQS0lRDglQTclRDklODQlRDklODElRDglQjElRDglQjklRDklOEElRDglQTktJUQ5JTg4JUQ4JUE3JUQ5JTg0JUQ4JUFBJUQ5JTg4JUQ4JUFDJUQ5JThBJUQ5JTg3LSVEOCVCQSVEOSU4QSVEOCVCMS0lRDglQTclRDklODQlRDglQjUlRDklODYlRDklODElRDklOEEtJUQ4JUE4JUQ5JThBJUQ5JTg2LSVEOCVBNyVEOSU4NCVEOSU4NiVEOCVCNyVEOCVBNyVEOSU4MiVEOCVBNyVEOCVBQS1yNTkzLz9tc2Nsa2lkPWQyNjI5NGIwYzA5MzExZWM5NDg3ZTQ1YjA3NGI5OGU1&amp;ntb=1" rel="external nofollow">الإنترنت</a> أو العمل على نسخة سطح المكتب من برنامج سكراتش بدون استخدام الإنترنت.
</p>

<p>
	تبدو واجهة محرر سكراتش كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96754" href="https://academy.hsoub.com/uploads/monthly_2022_04/scratch-interface-a.png.a805dbbabca0072e7fb311af7f532ae6.png" rel=""><img alt="scratch-interface-a.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96754" data-unique="kc0e73oke" src="https://academy.hsoub.com/uploads/monthly_2022_04/scratch-interface-a.thumb.png.2b5c31e698ca004d6cb2c2e883a94b94.png" style="width: 550px; height: auto;"></a>
</p>

<p>
	يُشغل المشروع في <strong>المنصة</strong> عند النقر على زر العلم الأخضر، ونستخدم <strong>الخلفيات</strong> لتغيير مظهر المنصة.
</p>

<p>
	أولًا، اضغط على رمز <strong>اختيار خلفية</strong> من قائمة المنصة الموجود في الزاوية السفلية اليسرى:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96732" href="https://academy.hsoub.com/uploads/monthly_2022_04/ChooseBackdrop.png.ea708307fac10b8699844f05be2a906c.png" rel=""><img alt="ChooseBackdrop.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96732" data-unique="njn88b6x6" src="https://academy.hsoub.com/uploads/monthly_2022_04/ChooseBackdrop.png.ea708307fac10b8699844f05be2a906c.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	ثانيًا، اختر إحدى الخلفيات الموجودة في تصنيف خارجي، أو اكتب Space في مربع البحث، واختر الخلفية التي تعجبك:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96757" href="https://academy.hsoub.com/uploads/monthly_2022_04/SpaceBackdrops.png.f2591f6387c811fd52eef609f647f71d.png" rel=""><img alt="SpaceBackdrops.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96757" data-unique="onwk5kk5u" src="https://academy.hsoub.com/uploads/monthly_2022_04/SpaceBackdrops.thumb.png.d27e04394db41ffb01a5485dfbd1a034.png" style="width: 550px; height: auto;"></a>
</p>

<p>
	انقر على الخلفية التي اخترتها لإضافتها لمشروعك، ولاحظ تغير شكل المنصة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96743" href="https://academy.hsoub.com/uploads/monthly_2022_04/new-backdrop.png.77eebcdd89564f60807112c0d2b81630.png" rel=""><img alt="new-backdrop.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96743" data-unique="y2ls1wot5" src="https://academy.hsoub.com/uploads/monthly_2022_04/new-backdrop.thumb.png.bf3022b15d6263cccfe3afce7b1a1ca6.png" style="width: 550px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96735" href="https://academy.hsoub.com/uploads/monthly_2022_04/DeleteSprite.png.41d18e9c1fa21668f2c75cbd539bbfed.png" rel=""><img alt="DeleteSprite.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96735" data-unique="wsnb48ora" src="https://academy.hsoub.com/uploads/monthly_2022_04/DeleteSprite.png.41d18e9c1fa21668f2c75cbd539bbfed.png" style="width: 250px; height: auto;"></a>
</p>

<p>
	رابعًا، انقر على أيقونة <strong>اختيار كائن</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96733" href="https://academy.hsoub.com/uploads/monthly_2022_04/ChooseSprite.png.4930d3b4b6b0e9b8197cfa25e6496609.png" rel=""><img alt="ChooseSprite.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96733" data-unique="v32gb37ph" src="https://academy.hsoub.com/uploads/monthly_2022_04/ChooseSprite.thumb.png.2cd56d82ed0e2b2b6e6f1c37127fbe9b.png" style="width: 550px; height: auto;"></a>
</p>

<p>
	خامسًا، اختر تصنيف <strong>عالم الخيال</strong> ثم انقر على الكائن بيكو، أو اكتب Pico في مربع البحث للعثور عليه بسرعة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96736" href="https://academy.hsoub.com/uploads/monthly_2022_04/FantasyCategory.png.f533a398e6bf971e734c0b31dec0d057.png" rel=""><img alt="FantasyCategory.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96736" data-unique="uoyhvwbf1" src="https://academy.hsoub.com/uploads/monthly_2022_04/FantasyCategory.thumb.png.e633dd38a7207ad55b568ff875818487.png" style="width: 550px; height: auto;"></a>
</p>

<p>
	سادسًا، ضع بيكو في المكان الذي تراه مناسبًا على المنصة. وضعناه في مشروعنا في الزاوية اليسرى من المنصة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96745" href="https://academy.hsoub.com/uploads/monthly_2022_04/pico.png.477ae2d01419515293a74122ee39d576.png" rel=""><img alt="pico.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96745" data-unique="jlp2v63u6" src="https://academy.hsoub.com/uploads/monthly_2022_04/pico.png.477ae2d01419515293a74122ee39d576.png" style="width: 450px; height: auto;"></a>
</p>

<h3>
	احفظ المشروع
</h3>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96750" href="https://academy.hsoub.com/uploads/monthly_2022_04/remix-button.png.38e546500b7d6fcd127dd81b7488c27a.png" rel=""><img alt="remix-button.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96750" data-unique="4qs6n3j73" src="https://academy.hsoub.com/uploads/monthly_2022_04/remix-button.png.38e546500b7d6fcd127dd81b7488c27a.png"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96748" href="https://academy.hsoub.com/uploads/monthly_2022_04/ProjectName.png.28d6c9feccd55138d31d47be000d739b.png" rel=""><img alt="ProjectName.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96748" data-unique="vxkvw7qek" src="https://academy.hsoub.com/uploads/monthly_2022_04/ProjectName.png.28d6c9feccd55138d31d47be000d739b.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	انقر على علامة تبويب <strong>ملف</strong> ثم انقر على خيار <strong>الحفظ إلى حاسوبك</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96752" href="https://academy.hsoub.com/uploads/monthly_2022_04/SaveProject.png.40e8c514cf2acf8d06b194c3c499f97d.png" rel=""><img alt="SaveProject.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96752" data-unique="z6h4vykpz" src="https://academy.hsoub.com/uploads/monthly_2022_04/SaveProject.png.40e8c514cf2acf8d06b194c3c499f97d.png" style="width: 400px; height: auto;"></a>
</p>

<p>
	إذا كنت متصلًا بالإنترنت وتملك حسابًا على موقع سكراتش سيظهر لك خيار <strong>الحفظ الآن</strong>.
</p>

<h2>
	إلقاء التحية
</h2>

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

<p>
	أولًا، انقر على كتل الهيئة لعرض قائمة الكتل، ثم انقر على كتلة (قُل السلام عليكم) لمدة 2 ثانية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96739" href="https://academy.hsoub.com/uploads/monthly_2022_04/LooksBlocks.png.429dbfdd6affa9442f6aeb7bbc78ae6d.png" rel=""><img alt="LooksBlocks.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96739" data-unique="aqb56eeml" src="https://academy.hsoub.com/uploads/monthly_2022_04/LooksBlocks.png.429dbfdd6affa9442f6aeb7bbc78ae6d.png" style="width: 280px; height: auto;"></a>
</p>

<p>
	لاحظ أن بيكو سيلقي علينا التحية لمدة ثانيتين:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96746" href="https://academy.hsoub.com/uploads/monthly_2022_04/PicoSaysHi.png.83c0ac615769988566c31149019ce1f4.png" rel=""><img alt="PicoSaysHi.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96746" data-unique="6mam7sgg4" src="https://academy.hsoub.com/uploads/monthly_2022_04/PicoSaysHi.png.83c0ac615769988566c31149019ce1f4.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	ثانيًا، اسحب كتلة (قُل السلام عليكم) لمدة 2 ثانية إلى مكان إضافة الكتل البرمجية ثم انقر عليها ثانيةً، ولاحظ أنها سوف تُحدد باللون الأصفر:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96751" href="https://academy.hsoub.com/uploads/monthly_2022_04/SalamHighlighted.png.38149fc145e0c34fc3d283516d3fae27.png" rel=""><img alt="SalamHighlighted.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96751" data-unique="w0pfy4pmr" src="https://academy.hsoub.com/uploads/monthly_2022_04/SalamHighlighted.png.38149fc145e0c34fc3d283516d3fae27.png" style="width: 500px; height: auto;"></a>
</p>

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

<p>
	ثالثًا، اسحب كتلة عند النقر على الكائن من كتل <strong>الأحداث</strong> وضعها قبل كتلة (قُل السلام عليكم)، ولاحظ أن الكتل سوف تلتصق ببعضها:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96728" href="https://academy.hsoub.com/uploads/monthly_2022_04/Block1.png.4ffde51487c681af7cccb83ca6576b06.png" rel=""><img alt="Block1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96728" data-unique="oi7xeg7wq" src="https://academy.hsoub.com/uploads/monthly_2022_04/Block1.png.4ffde51487c681af7cccb83ca6576b06.png" style="width: 350px; height: auto;"></a>
</p>

<p>
	يمكنك إضافة تعليق على الكتل لشرح عملها:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96734" href="https://academy.hsoub.com/uploads/monthly_2022_04/Comment.png.ba9e20c011cbb1b4046893f3437722e9.png" rel=""><img alt="Comment.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96734" data-unique="m2e1d1q0p" src="https://academy.hsoub.com/uploads/monthly_2022_04/Comment.png.ba9e20c011cbb1b4046893f3437722e9.png" style="width: 350px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96726" href="https://academy.hsoub.com/uploads/monthly_2022_04/AddComment.png.0832d37e7e50a19ba38ceaec82386ac3.png" rel=""><img alt="AddComment.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96726" data-unique="5i9i8f8t3" src="https://academy.hsoub.com/uploads/monthly_2022_04/AddComment.png.0832d37e7e50a19ba38ceaec82386ac3.png" style="width: 350px; height: auto;"></a>
</p>

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

<h2>
	إضافة الصوت
</h2>

<p>
	سنضيف في هذه الخطوة وسيلةً أخرى للتواصل باستخدام الأصوات:
</p>

<p>
	أولًا، انقر على علامة تبويب <strong>الأصوات</strong> وستجد الصوت Pop مضافًا إلى الكائن بيكو، انقر على أيقونة التشغيل لسماع الصوت:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96747" href="https://academy.hsoub.com/uploads/monthly_2022_04/PopSound.png.6e8e08e4f23128f9a18f4e4ec9f5b346.png" rel=""><img alt="PopSound.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96747" data-unique="c723kni88" src="https://academy.hsoub.com/uploads/monthly_2022_04/PopSound.thumb.png.c66819bd80560c065fbe75ae60ca640f.png" style="width: 550px; height: auto;"></a>
</p>

<p>
	ثانيًا، انقر على أيقونة <strong>اختيار صوت</strong> الموجودة في الزاوية اليمنى لإضافة أحد أصوات الكائنات الفضائية الموجودة في تصنيف <strong>الفضاء</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96730" href="https://academy.hsoub.com/uploads/monthly_2022_04/ChooseASound.png.7e3863567bf7bc3ce9faa328b3ff72e8.png" rel=""><img alt="ChooseASound.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96730" data-unique="g2cj6owr5" src="https://academy.hsoub.com/uploads/monthly_2022_04/ChooseASound.png.7e3863567bf7bc3ce9faa328b3ff72e8.png" style="width: 200px; height: auto;"></a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96758" href="https://academy.hsoub.com/uploads/monthly_2022_04/SpaceSounds.png.0b25f195be54d33783d9fb7b7fd98efe.png" rel=""><img alt="SpaceSounds.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96758" data-unique="3eyyxp7gv" src="https://academy.hsoub.com/uploads/monthly_2022_04/SpaceSounds.thumb.png.d5ac8d7cd62142f32933cca235aa62f1.png" style="width: 550px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96744" href="https://academy.hsoub.com/uploads/monthly_2022_04/NewSound.png.486ffd53c5bedbf3210c9e5769afdef4.png" rel=""><img alt="NewSound.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96744" data-unique="uytrc5ogy" src="https://academy.hsoub.com/uploads/monthly_2022_04/NewSound.thumb.png.cee0798252dedceee70551ea74ac71a4.png" style="width: 550px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96729" href="https://academy.hsoub.com/uploads/monthly_2022_04/Block2.png.387b3f554733583f46b434fd549ad794.png" rel=""><img alt="Block2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96729" data-unique="4nj8iu37c" src="https://academy.hsoub.com/uploads/monthly_2022_04/Block2.png.387b3f554733583f46b434fd549ad794.png" style="width: 250px; height: auto;"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96756" href="https://academy.hsoub.com/uploads/monthly_2022_04/SoundsOptions.png.84865d872be658eeb13d3211106d0966.png" rel=""><img alt="SoundsOptions.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96756" data-unique="cnyv68826" src="https://academy.hsoub.com/uploads/monthly_2022_04/SoundsOptions.png.84865d872be658eeb13d3211106d0966.png" style="width: 250px; height: auto;"></a>
</p>

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

<h2>
	تغيير مظهر الكائن
</h2>

<p>
	سنعمل في هذه الخطوة على تغيير مظهر الكائن بيكو. كما يمكن استخدام المظاهر وتغييرها لتحريك الكائنات.
</p>

<p>
	أولًا، أضف الكائن نانو من تصنيف <strong>خيال</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96731" href="https://academy.hsoub.com/uploads/monthly_2022_04/ChooseASpriteBar.png.png.81477a46892d26c031a346b3c72d376b.png" rel=""><img alt="ChooseASpriteBar.png.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96731" data-unique="th2iapx5b" src="https://academy.hsoub.com/uploads/monthly_2022_04/ChooseASpriteBar.png.png.81477a46892d26c031a346b3c72d376b.png" style="width: 250px; height: auto;"></a>
</p>

<p>
	ثانيًا، انقر على الكائن الجديد من قائمة الكائنات لاختياره:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96759" href="https://academy.hsoub.com/uploads/monthly_2022_04/Sprites.png.b50fa8bfb9fce6d634857a5755d514ba.png" rel=""><img alt="Sprites.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96759" data-unique="4c00rh7sd" src="https://academy.hsoub.com/uploads/monthly_2022_04/Sprites.png.b50fa8bfb9fce6d634857a5755d514ba.png" style="width: 280px; height: auto;"></a>
</p>

<p>
	ثالثًا، انقر على علامة تبويب <strong>المقاطع البرمجية</strong> وأضف كتلة (قُل) و كتلة (تغيير المظهر)، من كتل الهيئة ذات اللون البنفسجي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96753" href="https://academy.hsoub.com/uploads/monthly_2022_04/SayHiBlocks.png.29c550c992857628db840b3c6bf31647.png" rel=""><img alt="SayHiBlocks.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96753" data-unique="kaj4y2m87" src="https://academy.hsoub.com/uploads/monthly_2022_04/SayHiBlocks.png.29c550c992857628db840b3c6bf31647.png" style="width: 250px; height: auto;"></a>
</p>

<p>
	رابعًا، انقر على الكائن نانو على المنصة وتحقق من ظهور مربع الحوار ومن تغير مظهره.
</p>

<h3>
	جعل الكائن يستخدم لغة الإشارة
</h3>

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

<p>
	أولًا، انقر على الكائن نانو، ثم انتقل إلى علامة تبويب <strong>المظاهر</strong> لعرض المظاهر الخاصة بالكائن:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96742" href="https://academy.hsoub.com/uploads/monthly_2022_04/NanoCustomes.png.4900d6fe6f16da1d2662924a3f009a80.png" rel=""><img alt="NanoCustomes.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96742" data-unique="zy8fa2u9k" src="https://academy.hsoub.com/uploads/monthly_2022_04/NanoCustomes.png.4900d6fe6f16da1d2662924a3f009a80.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	ثانيًا، انقر على المظهر nano-b، ثم حدد إحدى يدي الكائن باستخدام أداة التحديد التي لها شكل السهم، ثم اضغط على أداة الحذف أو مفتاح Delete من لوحة المفاتيح:
</p>

<p style="text-align: center;">
	<img alt="nano-arm-selected.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97995" data-unique="27u97oq09" src="https://academy.hsoub.com/uploads/monthly_2022_05/nano-arm-selected.png.56eba1014d339b4d2f7dbbb535a15611.png" style="width: 450px; height: auto;"></p>

<p>
	سيبدو المظهر بعد الحذف كما يلي:
</p>

<p style="text-align: center;">
	<img alt="nano-arm-deleted.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97997" data-unique="kqzhmf737" src="https://academy.hsoub.com/uploads/monthly_2022_05/nano-arm-deleted.png.14fefadc9a2cff8c13f65086e8330874.png" style="width: 450px; height: auto;"></p>

<p>
	تذكر أنه يمكنك التراجع عن أي خطوة بالضغط على رمز <strong>التراجع</strong> التالي: <img alt="nano-undo.png" class="ipsImage ipsImage_thumbnailed" data-fileid="97996" data-unique="e26uu5iv8" src="https://academy.hsoub.com/uploads/monthly_2022_05/nano-undo.png.0bad5f37752b83f02154495308844552.png" style="width: 30px; height: auto;">  وفي الخطوة الموالية الثالثة، انسخ اليد اليمنى من المظهر nano-c، وذلك بالنقر عليها لتحديدها ثم النقر على خيار النسخ:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96741" href="https://academy.hsoub.com/uploads/monthly_2022_04/NanoC.png.3cd36d89dac7d4dbca4234d9b525bfa6.png" rel=""><img alt="NanoC.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96741" data-unique="hvne1el7m" src="https://academy.hsoub.com/uploads/monthly_2022_04/NanoC.png.3cd36d89dac7d4dbca4234d9b525bfa6.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	رابعًا، انتقل إلى المظهر nano-b وانقر على خيار اللصق، سيبدو الشكل كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96740" href="https://academy.hsoub.com/uploads/monthly_2022_04/NanoArmCopied.png.141b3f4f3a9fc5c23f06ff3ba90050c9.png" rel=""><img alt="NanoArmCopied.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96740" data-unique="sz20zyf99" src="https://academy.hsoub.com/uploads/monthly_2022_04/NanoArmCopied.png.141b3f4f3a9fc5c23f06ff3ba90050c9.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	خامسًا، انقر على الكائن نانو على المنصة وتحقق من ظهور مربع الحوار ومن تغير مظهره ليلقي علينا التحية باستخدام لغة الإشارة.
</p>

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

<h2>
	تغيير لون الكائن
</h2>

<p>
	سنضيف في هذه الخطوة كائنًا جديدًا ونستخدم كتل الهيئة لتغيير لون الكائن وإظهار ما يفكر به!
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96749" href="https://academy.hsoub.com/uploads/monthly_2022_04/ProjectResult.png.68b828934a0c67e70d92e177766c278e.png" rel=""><img alt="ProjectResult.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96749" data-unique="rz98fbj28" src="https://academy.hsoub.com/uploads/monthly_2022_04/ProjectResult.png.68b828934a0c67e70d92e177766c278e.png" style="width: 400px; height: auto;"></a>
</p>

<p>
	أولًا، أضف الكائن جيغا Giga من مكتبة الكائنات وضعه في الزاوية اليمنى للمنصة.
</p>

<p>
	ثانيًا، أضف الكتل التالية لتغيير لون الكائن وإظهار ما يفكر به:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96738" href="https://academy.hsoub.com/uploads/monthly_2022_04/GigaBlocks.png.06204a2efcb483cd933e65f3b731a09b.png" rel=""><img alt="GigaBlocks.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96738" data-unique="5tnvnkp4q" src="https://academy.hsoub.com/uploads/monthly_2022_04/GigaBlocks.png.06204a2efcb483cd933e65f3b731a09b.png" style="width: 300px; height: auto;"></a>
</p>

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

<p>
	رابعًا، عدل على النص والمدة الزمنية في كتلة (فكر)، في مثالنا جعلنا الكائن جيغا يرحب بالكائن نانو.
</p>

<p>
	أخيرًا، انقر على الكائن جيغا على المنصة وتحقق من ظهور مربع الحوار ومن تغير لون الكائن.
</p>

<h2>
	اختبر معلوماتك
</h2>

<p>
	انعش ذاكرتك واختبر معلوماتك بالإجابة عن الأسئلة التالية:
</p>

<ol>
<li>
		<strong>السؤال الأول</strong>: من أين يمكننا إضافة كائن جديد على المشروع؟ (حاول تذكر ما تعلمناه قبل الإطلاع على الإجابة أدناه)

		<ul>
<li>
				<strong>الإجابة الصحيحة</strong>: من قائمة الكائنات بالنقر على أيقونة <strong>إضافة كائن</strong>.
			</li>
		</ul>
</li>
	<li>
		<strong>السؤال الثاني</strong>: أين نجد الكتل التي تمكننا من إضافة مربع حوار على الكائن؟
		<ul>
<li>
				<strong>الإجابة الصحيحة</strong>: من كتل <strong>الهيئة</strong> ذات اللون البنفسجي.
			</li>
		</ul>
</li>
</ol>
<h2>
	ترقية المشروع
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96737" href="https://academy.hsoub.com/uploads/monthly_2022_04/Final.png.ec458c2f2095782db232136411334aca.png" rel=""><img alt="Final.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96737" data-unique="3h7h954qm" src="https://academy.hsoub.com/uploads/monthly_2022_04/Final.png.ec458c2f2095782db232136411334aca.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	كما يمكنك التعديل على المشروع بتغيير الخلفيات، وتغيير الطريقة التي تتواصل بها الكائنات. أطلق العنان لخيالك وأبهرنا بإبداعك. اطلع على المشروع النهائي <a href="https://scratch.mit.edu/projects/485673032/" rel="external nofollow">من هنا</a> كما يمكنك الانتقال لمشاهدة المشروع في <a href="https://scratch.mit.edu/projects/485673032/editor/" rel="external nofollow">محرر سكراتش</a>.
</p>

<h2>
	ختامًا
</h2>

<p>
	بهذا تكون قد أتممت مشروع إنشاء مشهد فضائي باستخدام برنامج سكراتش.
</p>

<p>
	ننصحك بتنفيذ مشروع حافلة المدرسة المتحركة باستخدام برنامج سكراتش كخطوتك التالية، وإذا واجهت مشاكل مع برنامج سكراتش فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في <a href="https://academy.hsoub.com/questions/" rel="">أكاديمية حسوب</a>.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://projects.raspberrypi.org/en/projects/space-talk/7" rel="external nofollow">Space Talk</a> من <a href="https://raspberrypi.org/" rel="external nofollow">الموقع الرسمي لراسبيري باي</a>.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%A3%D8%B6%D9%88%D8%A7%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%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-r1482/" rel="">إنشاء لعبة أضواء باستخدام برنامج سكراتش وحاسوب راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%84%D8%B9%D8%A8%D8%A9-%D8%A7%D9%84%D8%B3%D9%84%D9%83-%D9%88%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%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-r1495/" rel="">تصميم لعبة السلك والحلقة باستخدام برنامج سكراتش وحاسوب راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B5%D8%A8%D8%A7%D8%AD-%D9%84%D9%8A%D8%AF-%D8%AB%D9%84%D8%A7%D8%AB%D9%8A-%D8%A7%D9%84%D8%A3%D8%A8%D8%B9%D8%A7%D8%AF-%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%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-r1504/" rel="">تنفيذ مصباح ليد ثلاثي الأبعاد باستخدام سكراتش ولوحة راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%B5%D9%86%D8%B9-%D8%A2%D9%84%D8%A9-%D9%85%D9%88%D8%B3%D9%8A%D9%82%D9%8A%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-%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-r1505/" rel="">صنع آلة موسيقية باستخدام سكراتش وحاسوب راسبيري باي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1531</guid><pubDate>Thu, 28 Apr 2022 15:09:00 +0000</pubDate></item><item><title>&#x62A;&#x62D;&#x62F;&#x64A;&#x62F; &#x627;&#x633;&#x62A;&#x631;&#x627;&#x62A;&#x64A;&#x62C;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x62A;&#x637;&#x628;&#x64A;&#x642; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x627;&#x644;&#x62A;&#x642;&#x62F;&#x645;&#x64A; PWA</title><link>https://academy.hsoub.com/programming/general/%D8%AA%D8%AD%D8%AF%D9%8A%D8%AF-%D8%A7%D8%B3%D8%AA%D8%B1%D8%A7%D8%AA%D9%8A%D8%AC%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1490/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_02/6210c18150cd2_-------.png.2cd91efd1534c00acc959810a6f4ed34.png" /></p>

<p>
	<a href="https://academy.hsoub.com/design/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-%D9%88%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%AC%D8%A8-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%85%D8%B5%D9%85%D9%85%D9%8A%D9%86-%D8%A7%D9%84%D8%A7%D9%87%D8%AA%D9%85%D8%A7%D9%85-%D8%A8%D9%87%D8%A7%D8%9F-r450/" rel="">تطبيقات الويب التقدمية PWA</a> هي تطبيقات حديثة، عالية الجودة تُبنَى باستخدام تقنيات الويب. تقدم تطبيقات الويب التقدمية إمكانيات مماثلة لتطبيقات iOS والأندرويد وسطح المكتب، فهي تطبيقات موثوقة حتى في الشبكات غير المستقرة، وتتميز بقابلية التثبيت مما يُسهل على المستخدمين العثور عليها واستعمالها.
</p>

<p>
	كان تثبيت التطبيق في الماضي ممكنًا فقط في التطبيقات المخصصة للنظام، أما اليوم فتقدم تطبيقات الويب التقدمية PWA تجرِبة قابلة للتثبيت توفر نفس المستوى من التكامل والموثوقية مثل التطبيقات المخصصة للنظام.
</p>

<p>
	يمكنك القيام بذلك بطرق عدة:
</p>

<ul>
<li>
		تثبيت تطبيقات الويب التقدمية <a href="https://academy.hsoub.com/programming/general/%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%A7%D9%82%D8%AA%D8%B1%D8%A7%D8%AD%D8%A7%D8%AA-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r1446/" rel="">من المتصفح</a>.
	</li>
	<li>
		تثبيت تطبيقات الويب التقدمية من متجر التطبيقات.
	</li>
</ul>
<p>
	يعد وجود مصادر مختلفة للنشر طريقة فعالة للوصول إلى أكبر عدد من المستخدمين، ولكن قد يكون من الصعب اختيار استراتيجية صحيحة للترويج بها.
</p>

<h2>
	لماذا عليك أن تجعل تطبيق الويب الخاص بك قابلا للتثبيت؟
</h2>

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

<p>
	امتلاك تطبيق ويب تقدمي بالإضافة للتطبيق المخصص للنظام قد يكون أمرا مربكا للمستخدمين، قد يكون التطبيق المخصص للنظام خيارا أفضل لبعض المستخدمين، ويمكن أن يكون خيارا سيئا للبعض الآخر:
</p>

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

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

<h2>
	متطلبات جعل تطبيق الويب التقدمي قابلا للتثبيت
</h2>

<p>
	لدى أغلب المستخدمين تجربة مع التطبيقات القابلة للتثبيت، تظهر التطبيقات المثبتة في نظام التشغيل مثل أندرويد ونظام iOS في الشاشة الرئيسية وفي مجلد التطبيقات في Mac OS X وقائمة البداية في ويندوز، وتظهر أيضا في التطبيقات المشغلة ويمكن التبديل بينها في قائمة التطبيقات النشطة، وتظهر أيضا في محرك بحث النظام ولائحة المشاركة في التطبيقات.
</p>

<p>
	تخبرك أغلب المتصفحات بأن تطبيق الويب التقدمي الخاص بك قابل للتثبيت عند استيفاء شروط التثبيت، كمثال قد يكون المؤشر عبارة عن زر تثبيت في شريط العناوين، أو عنصر تثبيت في قائمة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="92304" href="https://academy.hsoub.com/uploads/monthly_2022_02/1.png.6311eaa8fded93ba4e5b7a8431661a7b.png" rel=""><img alt="1.png" class="ipsImage ipsImage_thumbnailed" data-fileid="92304" data-unique="8c0mg33iq" src="https://academy.hsoub.com/uploads/monthly_2022_02/1.thumb.png.6568d918c6626104174068abdd0fae7b.png" style="width: 500px; height: auto;"></a>
</p>

<p>
	المتصفح يقترح تثبيت تطبيق الويب التقدم (حاسوب مكتبي)
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="92305" href="https://academy.hsoub.com/uploads/monthly_2022_02/2.png.01a40d008d75832fe798c4c9318130da.png" rel=""><img alt="2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="92305" data-unique="7tlccww35" src="https://academy.hsoub.com/uploads/monthly_2022_02/2.thumb.png.1b1292659a3e556df7b161daf656c81e.png" style="width: 500px; height: auto;"></a>
</p>

<p>
	المتصفح يقترح تثبيت تطبيق الويب التقدم (هاتف)
</p>

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

<h2>
	معايير تثبيت تطبيق الويب التقدمي
</h2>

<p>
	يحتاج تطبيق الويب التقديمي الخاص بك إلى استيفاء الشروط التالية قبل إطلاق حدث <code>beforeinstallprompt</code> وعرض مؤشر طلب التثبيت من المستخدم:
</p>

<ul>
<li>
		أن لا يكون التطبيق مثبتًا بالفعل.
	</li>
	<li>
		أن يكون المستخدم قد تفاعل وفقًأ لإرشادات محددة.
	</li>
	<li>
		مستضافًا باتصال آمن HTTPS.
	</li>
	<li>
		يحتوي التطبيق على ملف البيان <a href="https://academy.hsoub.com/programming/general/%D8%B4%D8%B1%D8%AD-%D9%85%D9%84%D9%81-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86-manifest-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1385//" rel="">web app manifest</a> ضبطت فيه القيم التالية:
	</li>
	<li>
		خاصية <code>short_name</code> أو <code>name</code>
	</li>
	<li>
		خاصية <code>icons</code> تحتوي أيقونة بحجم 192px و 512px
	</li>
	<li>
		الخاصية <code>start_url</code>
	</li>
	<li>
		الخاصية <code>display</code> تتضمن إحدى هذه الخيارات <code>fullscreen</code> أو <code>standalone</code> أو <code>minimal-ui</code>
	</li>
	<li>
		الخاصية <code>prefer_related_applications</code> يجب أن تكون محددة أو معطلة باستعمال <code>false</code>
	</li>
	<li>
		تسجيل منجز خدمة service worker باسم <code>fetch</code>
	</li>
</ul>
<p>
	تمتلك متصفحات أخرى معايير مشابهة، وقد تمتلك اختلافات بسيطة، تحقق من المواقع التالية للحصول على التفاصيل أوضح:
</p>

<ul>
<li>
		<a href="https://docs.microsoft.com/en-us/microsoft-edge/progressive-web-apps#requirements" rel="external nofollow">Edge</a>.
	</li>
	<li>
		<a href="https://developer.mozilla.org/en-US/Apps/Progressive/Add_to_home_screen#How_do_you_make_an_app_A2HS-ready" rel="external nofollow">Firefox</a>.
	</li>
	<li>
		<a href="https://dev.opera.com/articles/installable-web-apps/" rel="external nofollow">Opera</a>.
	</li>
	<li>
		<a href="https://hub.samsunginter.net/docs/ambient-badging/" rel="external nofollow">Samsung Internet</a>.
	</li>
	<li>
		<a href="https://plus.ucweb.com/docs/pwa/docs-en/zvrh56" rel="external nofollow">UC Browser</a>.
	</li>
</ul>
<h2>
	اقتراح تثبيت تطبيق الويب التقدمي الخاص بك من خلال المتصفح
</h2>

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

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

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

<h3>
	الترويج لتثبيت تطبيق الويب التقدمي
</h3>

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

<p>
	يكون هذا كافيا في بعض الحالات، لكن إن كان هدفك هو الإشراف على عمليات تثبيت تطبيق الويب التقدمي الخاصة بك، فإننا نوصيك بشدة بانتظار الحدث <a href="https://developer.mozilla.org/en-US/docs/Web/API/BeforeInstallPromptEvent" rel="external nofollow"><code>BeforeInstallPromptEvent</code></a>، واتباع <a href="https://web.dev/promote-install/" rel="external nofollow">الأنماط للترويج لتثبيت تطبيق الويب التقدمي</a> الخاص بك.
</p>

<h2>
	تأثير اقتراحات التثبيت سلبًا على معدل التثبيت
</h2>

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

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

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

	<p>
		"مستخدم تطبيق الويب التقدمي هو المستخدم الذي شاهد الترويج بتثبيت التطبيق المخصص للنظام ولم يقم بتثبيته، وعاد للموقع 5 مرات على الأقل، أو هو المستخدم الذي ضغط على لافتة تثبيت التطبيق المخصص للنظام لكنه استمر في استخدام الموقع بدل ذلك".
	</p>
</blockquote>

<p>
	بعد ذلك، يمكن تنفيذ ذلك بالطريقة التالية:
</p>

<ol>
<li>
		عرض لافتة تثبيت التطبيق المخصص للنظام.
	</li>
	<li>
		إذا تجاهل المستخدم الإشعار، احفظ هذه المعلومة بتخزينها في ملف تعريف الارتباط (مثلا <code>document.cookie = "app-install-banner=dismissed"‎</code>).
	</li>
	<li>
		استخدام مِلَفّ تعريف ارتباط آخر لتتبع عدد زيارات المستخدم للموقع كمثال: <code>document.cookie = "user-visits=1"‎</code>.
	</li>
	<li>
		عرف دالة تستخدم المعلومات السابقة لتحديد إن كان المستخدم موجها لتطبيق الويب التقدمي كمثال: <code>isPWAUser()‎</code> واستخدم <code>()getInstalledRelatedApps</code> لمعرفة إن كان التطبيق مثبتا لتقرر إن كان المستخدم هو مستخدم تطبيق ويب تقدمي.
	</li>
	<li>
		الآن يمكنك فقط استدعاء الدالة <code>isPWAUser()‎</code> واعتمادا على ذلك أظهر زر طلب تثبيت تطبيق الويب التقدمي.
	</li>
</ol>
<h2>
	الترويج لتطبيق الويب التقدمي من متجر التطبيقات
</h2>

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

<ul>
<li>
		التطبيقات المخصصة للنظام: يمكن إنشاء هذه التطبيقات برمز خاص بالنظام، ويكون حجمها أكبر من 10 ميغابايت في الأندرويد وأكثر من 30 ميغابايت في iOS، قد ترغب في الترويج لتطبيقك المخصص للنظام إذا لم تملك تطبيق ويب تقدمي، أو إذا كان تطبيق النظام الأصلي لديك يقدم مجموعة ميزات أكثر تكاملا.
	</li>
	<li>
		تطبيقات خفيفة الحجم: يمكن إنشاء هذه التطبيقات برمز خاص بالنظام كذلك، ولكن يتم بناؤها عادة باستخدام تقنيات الويب، وتغليفها في تطبيق مخصص للنظام الأساسي، ويمكن رفع تطبيق الويب التقدمي كاملا إلى المتاجر أيضًا. تختار بعض الشركات تقديم هذه التجارب "الخفيفة"، وقد استخدمت عدة شركات أخرى هذا النهج لتطبيقاتها الرئيسية أيضًا.
	</li>
</ul>
<h2>
	الترويج للتطبيقات الخفيفة
</h2>

<p>
	حسب دراسة أعدها Google Play، فإنه لكل 6 ميغابايت تضاف في حجم ملف APK ، ينخفض معدل التثبيت بنسبة 1٪. يعني ذلك أن معدل اكتمال التنزيل لتطبيق 10 ميغابايت يمكن أن يكون أعلى تقريبا بنسبة 30٪ من تطبيق حجمه 100 ميغابايت. لحل هذا المشكل، تقدم بعض الشركات تطبيقات ويب متقدمة PWA الخاصة بها كحل لتوفير إصدار خفيف من تطبيقاتها على متجر Google Play وذلك باستخدام ما يسمى أنشطة الويب الموثوقة TWA. إذ تتيح أنشطة الويب الموثوقة القدرة على توفير تطبيق الويب التقدمي على جوجل بلاي، ولأنه مصمم باستخدام تقنيات الويب، فإن حجم التطبيق لا يتجاوز بضعة ميغابايتات. قامت شركة Oyo وهي إحدى أكبر شركات الحجز في الهند، ببناء إصدار خفيف من تطبيقها وجعلته متاحًا في متجر Google Play باستخدام أنشطة الويب الموثوقة TWA. يبلغ حجم التطبيق الخفيف 850 كيلوبايت فقط، أي ما يقارب 7٪ من حجم تطبيق Android المخصص للنظام. ويتميز بأنه عند تثبيته لا يمكن التمييز بينه وبين تطبيق Android للنظام الأصلي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="92306" href="https://academy.hsoub.com/uploads/monthly_2022_02/3.gif.a0c34a31c9f7b6d13c016b34236a6c87.gif" rel=""><img alt="3.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="92306" data-unique="1n0wa8c73" src="https://academy.hsoub.com/uploads/monthly_2022_02/3.gif.a0c34a31c9f7b6d13c016b34236a6c87.gif"></a>
</p>

<p style="text-align: center;">
	تطبيق شركة Oyo باستعمال تقنية أنشطة الويب الموثوقة TWA
</p>

<p>
	احتفظت شركة Oyo بكلا التطبيقين تاركة القرار للمستخدم لاختيار ما يناسبه.
</p>

<h2>
	توفير تطبيق ويب خفيف
</h2>

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

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

<h3>
	باستعمال واجهات تطبيقات جافاسكربت البرمجية
</h3>

<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%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%B9%D8%A8%D8%B1-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r651/" rel="">جافاسكربت</a> البرمجية <a href="https://developer.mozilla.org/en-US/docs/Web/API/NavigatorConcurrentHardware/hardwareConcurrency" rel="external nofollow"><code>navigator.hardwareConcurrency</code></a> و<a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigator/deviceMemory" rel="external nofollow"> <code>navigator.deviceMemory</code></a> و <a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigator/connection" rel="external nofollow"><code>navigator.connection</code></a>. على سبيل المثال:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2781_8" style="">
<span class="kwd">const</span><span class="pln"> deviceCategory </span><span class="pun">=</span><span class="pln"> req</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="str">'Device-Memory'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="str">'lite'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'full'</span><span class="pun">;`</span></pre>

<h3>
	باستخدام تلميحات العميل
</h3>

<p>
	يمكن أيضًا معرفة معلومات الجهاز في <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>، من خلال تلميحات العميل. إليك كيفية تنفيذ الرمز السابق لمعرفة لذاكرة الجهاز باستخدام تلميحات العميل.
</p>

<p>
	أولاً، قم بإعلام المتصفح أنك تريد تلقي تلميحات عن ذاكرة الجهاز في ترويسة استجابة http:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2781_10" style="">
<span class="pln">HTTP</span><span class="pun">/</span><span class="lit">1.1</span><span class="pln"> </span><span class="lit">200</span><span class="pln"> OK
</span><span class="typ">Content</span><span class="pun">-</span><span class="typ">Type</span><span class="pun">:</span><span class="pln"> text</span><span class="pun">/</span><span class="pln">html
</span><span class="typ">Accept</span><span class="pun">-</span><span class="pln">CH</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Device</span><span class="pun">-</span><span class="typ">Memory</span></pre>

<p>
	ستبدأ بعدها بتلقي معلومات ذاكرة الجهاز في ترويسة طلبيات HTTP:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2781_12" style="">
<span class="pln">GET </span><span class="pun">/</span><span class="pln">main</span><span class="pun">.</span><span class="pln">js HTTP</span><span class="pun">/</span><span class="lit">1.1</span><span class="pln">
</span><span class="typ">Device</span><span class="pun">-</span><span class="typ">Memory</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.5</span></pre>

<p>
	يمكنك استخدام هذه المعلومات في الخادم لتخزين ملف تعريف ارتباط يتضمن جهاز المستخدم:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2781_14" style="">
<span class="pln">app</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="str">'/route'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">req</span><span class="pun">,</span><span class="pln"> res</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// تحدد فئة الجهاز</span><span class="pln">

 </span><span class="kwd">const</span><span class="pln"> deviceCategory </span><span class="pun">=</span><span class="pln"> req</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="str">'Device-Memory'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="str">'lite'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'full'</span><span class="pun">;</span><span class="pln">

  </span><span class="com">// ضبط ملف تعريف الإرتباط</span><span class="pln">
  res</span><span class="pun">.</span><span class="pln">setCookie</span><span class="pun">(</span><span class="str">'Device-Category'</span><span class="pun">,</span><span class="pln"> deviceCategory</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">…</span><span class="pln">
</span><span class="pun">});</span></pre>

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

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2781_16" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isDeviceMidOrLowEnd</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
   </span><span class="com">// ‫أظهر إشعار طلب تثبيت التطبيق الخفيف PWA </span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
   </span><span class="com">// أظهر إشعار طلب تثبيت التطبيق التطبيق الرئيسي</span><span class="pln">
</span><span class="pun">}</span></pre>

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

<h2>
	الختام
</h2>

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

<p>
	ترجمة -وبتصرف- للمقال <a href="https://web.dev/define-install-strategy/" rel="external nofollow">How to define your install strategy‎</a> والمقال <a href="https://web.dev/install-criteria/" rel="external nofollow">What does it take to be installable?</a> لصاحبيه Demian Renzulli و Pete LePage.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1489/" rel="">ميزات تطبيق الويب التقدمي PWA </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AC%D8%AF%D9%88%D9%89-%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%85%D8%A7%D8%AF-%D8%B9%D9%84%D9%89-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-%D8%B9%D9%88%D8%B6-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D9%88%D8%A7%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B5%D9%8A%D9%84%D8%A9-r1488/" rel="">جدوى الاعتماد على تطبيقات الويب التقدمية PWA عوض تطبيقات الجوالات الأصيلة </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D9%88%D9%81%D9%8A%D8%B1-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D8%AF%D8%A7%D8%AE%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1445/" rel="">توفير تجربة تثبيت مخصصة داخل تطبيق الويب التقدمي PWA</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1490</guid><pubDate>Sat, 19 Feb 2022 10:22:05 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x623;&#x635;&#x628;&#x62D; &#x645;&#x637;&#x648;&#x631; &#x648;&#x627;&#x62C;&#x647;&#x627;&#x62A; &#x645;&#x648;&#x627;&#x642;&#x639;&#x61F;</title><link>https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81-%D8%A3%D8%B5%D8%A8%D8%AD-%D9%85%D8%B7%D9%88%D8%B1-%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D9%85%D9%88%D8%A7%D9%82%D8%B9%D8%9F-r2066/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_08/1554197027_.png.a55a84f2f0033dc2496feca7f9793119.png" /></p>
<p>
	هل تريد أن تصبح مطور واجهات أمامية؟ في هذا الفيديو سنقدم لك أهم النصائح وسنرشدك إلى الطريق الصحيح لتكون مطور واجهات أمامية Front-end developer مميز وسنخبرك عن أهم التقنيات التي يجب عليك الإلمام بها.
</p>

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

<p>
	إذا أردت التعرف أكثر على كيفية تطوير الواجهات الأمامية، فننصحك بالانضمام إلى <a href="https://academy.hsoub.com/learn/front-end-web-development" 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">2066</guid><pubDate>Wed, 27 Apr 2022 15:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x62D;&#x633;&#x64A;&#x646; &#x627;&#x644;&#x62A;&#x62F;&#x631;&#x64A;&#x62C;&#x64A; &#x644;&#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x627;&#x644;&#x62A;&#x642;&#x62F;&#x645;&#x64A;&#x629; PWA</title><link>https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D8%A7%D9%84%D8%AA%D8%AF%D8%B1%D9%8A%D8%AC%D9%8A-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r1529/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_04/625e579523b2d_------PWAs.png.a69a1f393ebc3f9e3f5bff523fb9e9b8.png" /></p>

<p>
	فاجأ نيك فينك Nick Finck وستيف شامبيون Steve Champeon عالم تصميم الويب بمفهوم "التحسين التدريجي" progressive enhancement في شهر مارس 2003، وهو مفهوم يعبر عن استراتيجية لتصميم الويب تركز على تنزيل المحتوى الأساسي لصفحة الويب أولًا، ثم تُضاف تدريجيًا الطبقات ذات التفاصيل والملامح الدقيقة على المحتوى الأساسي.
</p>

<p>
	كان التحسين التدريجي عام 2003 يتعلق باستخدام ميزات <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> الحديثة وجافاسكربت الواضحة unobtrusive JavaScript ورسومات فكتور القابلة لتغيير الحجم Scalable Vector Graphics، لكن في 2020 وما بعده أصبح التحسين التدريجي يتعلق باستخدام إمكانيات المتصفح الحديثة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96585" href="https://academy.hsoub.com/uploads/monthly_2022_04/01inclusive_web_design_slide.png.8ffa8d0a7328748dadceaeed45edb564.png" rel=""><img alt="01inclusive_web_design_slide.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96585" data-unique="jc3wcp0zk" src="https://academy.hsoub.com/uploads/monthly_2022_04/01inclusive_web_design_slide.thumb.png.59564f0fc716cd047e45e5dd95dbca9b.png" style="width: 500px; height: auto;"></a>
</p>

<p style="text-align: center;">
	شرائح عرض: تصميم ويب متكامل مع التحسين التدريجي، (<a href="http://www.hesketh.com/publications/inclusive_web_design_for_the_future/" rel="external nofollow">المصدر</a>).
</p>

<h2>
	جافاسكربت الحديثة
</h2>

<p>
	عند الحديث عن JavaScript الحديثة، فإننا نستحضر دعم المتصفح لأحدث مميزات <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%81%D9%8A-es6-%D9%86%D8%B7%D8%A7%D9%82-%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA%D8%8C-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D8%A7%D9%84%D8%B3%D9%87%D9%85%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%A8%D8%AF%D8%A6%D9%8A%D8%A9-r567/" rel="">JavaScript ES 2015</a> الأساسية، إذتتضمن (ECMAScript 2015 (ES6 <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%88%D8%B9%D9%88%D8%AF-promise-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r915/" rel="">الوعود promises</a> و<a href="https://academy.hsoub.com/programming/javascript/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-modules-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r926/" rel="">الوحدات modules</a> و<a href="https://wiki.hsoub.com/JavaScript/class" rel="external">الفئات classes</a> و<a href="https://wiki.hsoub.com/JavaScript/Template_Literals" rel="external">قالب النص template literals</a> و<a href="https://wiki.hsoub.com/JavaScript/Arrow_Functions" rel="external">الدوال السهمية arrow functions</a> والكلمتان المفتاحيتان <a href="https://wiki.hsoub.com/JavaScript/let" rel="external"><code>let</code></a> و <a href="https://wiki.hsoub.com/JavaScript/const" rel="external"><code>const</code></a> و<a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D9%88%D9%84%D8%AF%D8%A7%D8%AA-generators-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r922/" rel="">المولِّدات generators</a> و<a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%A5%D8%B3%D9%86%D8%A7%D8%AF-%D8%A8%D8%A7%D9%84%D8%AA%D9%81%D9%83%D9%8A%D9%83-destructuring-assignment-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r824/" rel="">الاسناد بالتفكيك destructuring assignment </a> ومعاملَي <a href="https://wiki.hsoub.com/JavaScript/Rest_Parameters" rel="external">البقية <code>rest</code></a> و<a href="https://wiki.hsoub.com/JavaScript/Spread_Operator" rel="external">النشر <code>spread</code></a> والنوعين <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%86%D9%88%D8%B9-map-%D8%A7%D9%84%D8%AE%D8%B1%D8%A7%D8%A6%D8%B7-%D9%88%D8%A7%D9%84%D9%86%D9%88%D8%B9-set-%D8%A7%D9%84%D8%A3%D8%B7%D9%82%D9%85-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r821/" rel=""><code>map</code> الخرائط و<code>set</code> الأطقم</a> والنوعين الخرائط والأطقم ضعيفة الإشارة <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%86%D9%88%D8%B9-weakmap-%D9%88%D8%A7%D9%84%D9%86%D9%88%D8%B9-weakset-%D8%A7%D9%84%D8%AE%D8%B1%D8%A7%D8%A6%D8%B7-%D9%88%D8%A7%D9%84%D8%A3%D8%B7%D9%82%D9%85-%D8%B6%D8%B9%D9%8A%D9%81%D8%A9-%D8%A7%D9%84%D8%A5%D8%B4%D8%A7%D8%B1%D8%A9-r822/" rel=""><code>WeackMap</code> و<code>WeackSet</code> الأطقم</a> ومميزات أخرى كثيرة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96586" href="https://academy.hsoub.com/uploads/monthly_2022_04/02ES6_browser_support.png.e86378e62ec165ef5f1170ccf7b923b9.png" rel=""><img alt="02ES6_browser_support.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96586" data-unique="2jv9gapgp" src="https://academy.hsoub.com/uploads/monthly_2022_04/02ES6_browser_support.png.e86378e62ec165ef5f1170ccf7b923b9.png" style="width: 780px; height: auto;"></a>
</p>

<p style="text-align: center;">
	جدول دعم المتصفحات لمعايير ES6. (<a href="https://caniuse.com/#feat=es6" rel="external nofollow">مصدر</a>)
</p>

<p>
	يمكن استخدام <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%84%D8%A7%D8%AA%D8%B2%D8%A7%D9%85%D9%86-%D9%88%D8%A7%D9%84%D8%A7%D9%86%D8%AA%D8%B8%D8%A7%D8%B1-asyncawait-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r921/" rel="">الدوال غير المتزامنة async</a> والتي هي أحد مميزات ES 2017، في جميع المتصفحات الرئيسية.
</p>

<p>
	تتيح الكلمتان المحجوزتان <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%84%D8%A7%D8%AA%D8%B2%D8%A7%D9%85%D9%86-%D9%88%D8%A7%D9%84%D8%A7%D9%86%D8%AA%D8%B8%D8%A7%D8%B1-asyncawait-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r921/" rel=""><code>async</code> و <code>await</code></a> كتابة السلوك غير المتزامن المعتمِد على الوعود بأسلوب نظيف، مع تجنب الحاجة إلى تكوين <a href="https://academy.hsoub.com/programming/javascript/%D8%B3%D9%84%D8%B3%D9%84%D8%A9-%D8%A7%D9%84%D9%88%D8%B9%D9%88%D8%AF-promises-chaining-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r916/" rel="">سلاسل وعود Promises chaining</a> بشكل صريح.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96587" href="https://academy.hsoub.com/uploads/monthly_2022_04/03async_functions_browser_support.png.814d34ef8f795324024003335ddb20b6.png" rel=""><img alt="03async_functions_browser_support.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96587" data-unique="a0cob4p8s" src="https://academy.hsoub.com/uploads/monthly_2022_04/03async_functions_browser_support.png.814d34ef8f795324024003335ddb20b6.png" style="width: 780px; height: auto;"></a>
</p>

<p style="text-align: center;">
	جدول دعم المتصفحات للدوال غير المتزامنة (<a href="https://caniuse.com/#feat=async-functions" rel="external nofollow">المصدر</a>).
</p>

<p>
	كما وصل سريعًا دعم المتصفحات لإضافات ES 2020 الحديثة مثل <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AA%D8%B3%D9%84%D8%B3%D9%84-%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1%D9%8A-%D9%84%D9%84%D9%88%D8%B5%D9%88%D9%84-%D9%84%D8%AE%D8%A7%D8%B5%D9%8A%D8%A7%D8%AA-%D9%83%D8%A7%D8%A6%D9%86-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1007/" rel="">التسلسل الإختياري optional chaining</a> و<a href="https://academy.hsoub.com/programming/javascript/%D8%B9%D8%A7%D9%85%D9%84-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%A8%D8%AF%D8%A7%D9%84-%D8%A7%D9%84%D9%84%D8%A7%D8%BA%D9%8A-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1005/" rel="">عامل الاستبدال اللاغي nullish coalescing</a>، لاحظ الشيفرة التالية.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9198_15" style="">
<span class="kwd">const</span><span class="pln"> adventurer </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Alice'</span><span class="pun">,</span><span class="pln">
  cat</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Dinah'</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">adventurer</span><span class="pun">.</span><span class="pln">dog</span><span class="pun">?.</span><span class="pln">name</span><span class="pun">);</span><span class="pln">
</span><span class="com">// Expected output: undefined</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</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">42</span><span class="pun">);</span><span class="pln">
</span><span class="com">// Expected output: 0</span></pre>

<h2>
	التطبيق المختار كنموذج: Fugu Greetings
</h2>

<p>
	سنعمل في هذا المقال مع تطبيق ويب تقدمي PWA بسيط اسمه <a href="https://tomayac.github.io/fugu-greetings/public/" rel="external nofollow">Fugu Greetings</a> (<a href="https://github.com/tomayac/fugu-greetings" rel="external nofollow">مستودع التطبيق على github</a>). إنشاء هذا التطبيق كان محاولة لمنح الويب كامل قوة تطبيقات Android أو iOS أو سطح المكتب.
</p>

<p>
	يُعد Fugu Greetings تطبيق رسم يتيح إنشاء بطاقات ترحيب وهمية، وإرسالها إلى الأصدقاء، ويجسد هذا التطبيق مفاهيم <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r832/" rel="">تطبيقات الويب التقدمية</a> الأساسية، فهو موثوق ومتاح بالكامل دون اتصال، كما أنه قابل للتثبيت على الشاشة الرئيسية للجهاز ويتكامل بسلاسة مع نظام التشغيل.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96588" href="https://academy.hsoub.com/uploads/monthly_2022_04/04fugu_greetings_sample_app.png.7fb9511a2554b538880217a8e7342787.png" rel=""><img alt="04fugu_greetings_sample_app.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96588" data-unique="1vx6co3om" src="https://academy.hsoub.com/uploads/monthly_2022_04/04fugu_greetings_sample_app.png.7fb9511a2554b538880217a8e7342787.png" style="width: 500px; height: auto;"></a>
</p>

<p style="text-align: center;">
	التطبيق المختار كنموذج Fugu Greetings
</p>

<h2>
	التحسين التدريجي Progressive Enhancement
</h2>

<p>
	حان الوقت للتحدث عن التحسين التدريجي، يصف مسرد مصطلحات الويب web glossary لدى موقع MDN <a href="https://developer.mozilla.org/docs/Glossary/Progressive_Enhancement" rel="external nofollow">هذا المفهوم</a> على النحو التالي:
</p>

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

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

	<p>
		تُستخدم تقنية الكشف عن الميزات feature detection بشكل عام لتحديد ما إذا كانت المتصفحات قادرة على التعامل مع الوظائف الحديثة أم لا، بينما تضاف شيفرات تعويضية Polyfills غالبًا <a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D8%B9%D9%88%D9%8A%D8%B6-%D9%86%D9%82%D8%B5-%D8%AF%D8%B9%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%84%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r795/" rel="">لتعويض نقص دعم المتصفحات لجافاسكربت</a>.
	</p>

	<p>
		-- مساهمو MDN
	</p>
</blockquote>

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

<p>
	الطريقة التقليدية التي يمكن أن تفكر فيها لاستيراد ملفات في أحد تطبيقاتك هي استخدام عنصر <a href="https://wiki.hsoub.com/HTML/input" rel="external"><code>&lt;input type=file&gt;</code></a>، حيث تُنشئ بداية العنصر، وتعين نوعه أو الخاصية <code>type</code> إلى<code>'file'</code> وتُضيف أنواع المعيار MIME إلى الخاصية <code>accept</code>، ثم تنقر عليه برمجيًا وتستمتع بالنتيجة.
</p>

<p>
	يمكنك تجريب هذه الميزة في تطبيق Fugu Greetings باختيار صورة معينة إلى التطبيق وملاحظة كيف أنها تُرسم مباشرة في حاوية الرسم canvas.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_17" style="">
<span class="kwd">const</span><span class="pln"> importImage </span><span class="pun">=</span><span class="pln"> async </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Promise</span><span class="pun">((</span><span class="pln">resolve</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> input </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'input'</span><span class="pun">);</span><span class="pln">
    input</span><span class="pun">.</span><span class="pln">type </span><span class="pun">=</span><span class="pln"> </span><span class="str">'file'</span><span class="pun">;</span><span class="pln">
    input</span><span class="pun">.</span><span class="pln">accept </span><span class="pun">=</span><span class="pln"> </span><span class="str">'image/*'</span><span class="pun">;</span><span class="pln">
    input</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'change'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      resolve</span><span class="pun">(</span><span class="pln">input</span><span class="pun">.</span><span class="pln">files</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]);</span><span class="pln">
    </span><span class="pun">});</span><span class="pln">
    input</span><span class="pun">.</span><span class="pln">click</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">}</span></pre>

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

<p>
	الطريقة التقليدية التي يمكنك فعلها لحفظ الملفات في تطبيقاتك، هي إنشاء رابط تنزيل بالخاصية <code>download</code> وبعنوان <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D9%83%D8%A7%D8%A6%D9%86-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-blob-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1285/" rel="">كائن البيانات الثنائية <strong>Blob URL</strong></a> كقيمة للخاصية <code>href</code>، ويمكنك أيضًا النقر برمجيًا لتشغيل التنزيل، ولا تنسى حذف <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">عنوان URL</a> لكائن Blob بعد توليده لمنع تسرب الذاكرة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_19" style="">
<span class="kwd">const</span><span class="pln"> exportImage </span><span class="pun">=</span><span class="pln"> async </span><span class="pun">(</span><span class="pln">blob</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'a'</span><span class="pun">);</span><span class="pln">
  a</span><span class="pun">.</span><span class="pln">download </span><span class="pun">=</span><span class="pln"> </span><span class="str">'fugu-greeting.png'</span><span class="pun">;</span><span class="pln">
  a</span><span class="pun">.</span><span class="pln">href </span><span class="pun">=</span><span class="pln"> URL</span><span class="pun">.</span><span class="pln">createObjectURL</span><span class="pun">(</span><span class="pln">blob</span><span class="pun">);</span><span class="pln">
  a</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    setTimeout</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> URL</span><span class="pun">.</span><span class="pln">revokeObjectURL</span><span class="pun">(</span><span class="pln">a</span><span class="pun">.</span><span class="pln">href</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"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
  a</span><span class="pun">.</span><span class="pln">click</span><span class="pun">();</span><span class="pln">
</span><span class="pun">};</span></pre>

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

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

<p>
	تتيح الواجهة البرمجية <a href="https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API" rel="external nofollow">File System Access</a> التي تعمل في الخلفية File System Access <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> لتطبيقك بفتح وإنشاء ملفات ومجلدات، وكذلك تعديل الملفات وحفظها، وذلك بالاستفادة من التابع <code>()window.chooseFileSystemEntries</code>، لكن عند استخدام هذا التابع تحتاج إلى استيراد مشروط لشيفرات الاستيراد والتصدير (ملفات mjs في المثال التالي) بناء على كون التابع متاحًا أم لا، أو بعبارة أخرى بناء على كون المتصفح يدعم الواجهة File System Access أم لا. موضّح طريقة القيام بذلك في الشيفرة التالية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_22" style="">
<span class="kwd">const</span><span class="pln"> loadImportAndExport </span><span class="pun">=</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</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="str">'chooseFileSystemEntries'</span><span class="pln"> in window</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Promise</span><span class="pun">.</span><span class="pln">all</span><span class="pun">([</span><span class="pln">
      </span><span class="kwd">import</span><span class="pun">(</span><span class="str">'./import_image.mjs'</span><span class="pun">),</span><span class="pln">
      </span><span class="kwd">import</span><span class="pun">(</span><span class="str">'./export_image.mjs'</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="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Promise</span><span class="pun">.</span><span class="pln">all</span><span class="pun">([</span><span class="pln">
      </span><span class="kwd">import</span><span class="pun">(</span><span class="str">'./import_image_legacy.mjs'</span><span class="pun">),</span><span class="pln">
      </span><span class="kwd">import</span><span class="pun">(</span><span class="str">'./export_image_legacy.mjs'</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="pun">};</span></pre>

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

<p>
	عند طلب صفحة من موقع ويب في المتصفحات التي لا تدعم الواجهة البرمجية File System Access، يتم فقط تحميل السكريبتات القديمة import_image_legacy.mjs و export_image_legacy.mjs التي تحتوي شيفرات التصدير والاستيراد التقليدية. يمكنك رؤية نافذة الشبكة في Firefox و Safari أدناه.
</p>

<p style="text-align: center;">
	<img alt="05safar_inspector_network_tab.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96589" data-unique="hl721ph0u" src="https://academy.hsoub.com/uploads/monthly_2022_04/05safar_inspector_network_tab.png.a827cf3ec312ee7b6bcf69d7ccbe4af3.png" style="width: 750px; height: auto;"></p>

<p style="text-align: center;">
	نافذة مراقبة الشبكة لمتصفح Safari.
</p>

<p style="text-align: center;">
	<img alt="06chrome_developer_tools_network.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96590" data-unique="0u2474ky5" src="https://academy.hsoub.com/uploads/monthly_2022_04/06chrome_developer_tools_network.png.e58a9272855a901f896169efad1cc17e.png" style="width: 750px; height: auto;"></p>

<p style="text-align: center;">
	نافذة شبكة أدوات المطورين لمتصفح Firefox.
</p>

<p>
	لكن لأن Chrome متصفح يدعم الواجهة File System Access، فيتم فقط تحميل السكربتات الجديدة import_image.mjs<em> </em>وexport_image.mjs التي تحتوي شيفرات متقدمة لميزات استيراد وتصدير الملفات في تطبيقات PWAs، بالاعتماد على الواجهة File System Access.
</p>

<p style="text-align: center;">
	<img alt="07firefox_developer_tools_network.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96591" data-unique="dpax18ctp" src="https://academy.hsoub.com/uploads/monthly_2022_04/07firefox_developer_tools_network.png.5f74725f167579995627aae0eb277c35.png" style="width: 750px; height: auto;"></p>

<p style="text-align: center;">
	نافذة شبكة أدوات المطورين لمتصفح Chrome.
</p>

<h2>
	واجهة الوصول إلى ملفات النظام
</h2>

<p>
	حان الآن الوقت لإلقاء نظرة على التنفيذ الفعلي للتحسين السابق، إذا فكرت باستيراد صورة باستخدام واجهة الوصول إلى ملفات النظام، فإنك ستستدعي التابع <code>()window.chooseFileSystemEntries</code> وتمرر له الخاصية <code>accept</code> التي تعبر من خلالها أنك تريد ملفات صور عبر امتدادات الملفات أو أنواع MIME، وينتج عن هذا مقبض ملف file handle يمكنك من خلاله الحصول على الملف الفعلي عن طريق استدعاء الدالة <code>()getFile</code>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_27" style="">
<span class="kwd">const</span><span class="pln"> importImage </span><span class="pun">=</span><span class="pln"> async </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> handle </span><span class="pun">=</span><span class="pln"> await window</span><span class="pun">.</span><span class="pln">chooseFileSystemEntries</span><span class="pun">({</span><span class="pln">
      accepts</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
          description</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Image files'</span><span class="pun">,</span><span class="pln">
          mimeTypes</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'image/*'</span><span class="pun">],</span><span class="pln">
          extensions</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'jpg'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'jpeg'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'png'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'webp'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'svg'</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="pun">});</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> handle</span><span class="pun">.</span><span class="pln">getFile</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="pln">err</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> err</span><span class="pun">.</span><span class="pln">message</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	تُطبَّق الفكرة نفسها عند تنفيذ تصدير الصورة، لكن هذه المرة تحتاج تمرير المعامل <code>type</code> بالقيمة <code>'save-file'</code> إلى التابع <code>()ChooseFileSystemEntries</code>، بهذا تحصل على مربع حوار لحفظ الملف، لم يكن هذا ضروريًا عند فتح الملف (استيراد صورة) لأن القيمة '<code>open-file'</code> هي الافتراضية للمعامل <code>type</code>.
</p>

<p>
	ستعين هنا المعامل <code>accept</code> بشكل مشابه لاستيراد ملف، لكن في التصدير العملية تقتصر على صور PNG فقط، وبدلاً من جلب الملف من المقبض، فإنك هنا تنشئ مجرى قابل للكتابة writable stream عن طريق التابع <code>()createWritable</code> الذي تستخدمه لكتابة كائن البيانات الثنائية Blob أو يعني صورة بطاقتك الترحيبية إلى الملف، وأخيرًا تغلق المجرى.
</p>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_29" style="">
<span class="kwd">const</span><span class="pln"> exportImage </span><span class="pun">=</span><span class="pln"> async </span><span class="pun">(</span><span class="pln">blob</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> handle </span><span class="pun">=</span><span class="pln"> await window</span><span class="pun">.</span><span class="pln">chooseFileSystemEntries</span><span class="pun">({</span><span class="pln">
      type</span><span class="pun">:</span><span class="pln"> </span><span class="str">'save-file'</span><span class="pun">,</span><span class="pln">
      accepts</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
          description</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Image file'</span><span class="pun">,</span><span class="pln">
          extensions</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'png'</span><span class="pun">],</span><span class="pln">
          mimeTypes</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'image/png'</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="pun">});</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> writable </span><span class="pun">=</span><span class="pln"> await handle</span><span class="pun">.</span><span class="pln">createWritable</span><span class="pun">();</span><span class="pln">
    await writable</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">blob</span><span class="pun">);</span><span class="pln">
    await writable</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="pln">err</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> err</span><span class="pun">.</span><span class="pln">message</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	إذن باستخدام التحسين التدريجي مع الواجهة البرمجية File System Access، فإنه بإمكانك استيراد ملف صورة إلى التطبيق، وتُرسم تلك الصورة مباشرة في حاوية الرسم canvas، كما يمكنك إجراء تعديلاتك على الصورة وحفظها باستخدام مربع حوار حفظ يتيح لك تحديد اسم للملف الذي تريد حفظه وموقع لتخزينه، وذلك كله فقط للمتصفحات التي تدعم الواجهة File System Access.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96592" href="https://academy.hsoub.com/uploads/monthly_2022_04/08file_open_dialog.png.10c3ddf9a5b24374e3112f2b0860f635.png" rel=""><img alt="08file_open_dialog.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96592" data-unique="5xut2eg4l" src="https://academy.hsoub.com/uploads/monthly_2022_04/08file_open_dialog.png.10c3ddf9a5b24374e3112f2b0860f635.png" style="width: 750px; height: auto;"></a>
</p>

<p style="text-align: center;">
	مربع حوار فتح ملف.
</p>

<p style="text-align: center;">
	<img alt="09mported_image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96593" data-unique="jmftt6mfx" src="https://academy.hsoub.com/uploads/monthly_2022_04/09mported_image.png.7079359a500b01b774c62ec7ebec88bd.png" style="width: 650px; height: auto;"></p>

<p style="text-align: center;">
	الصورة المستوردة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96594" href="https://academy.hsoub.com/uploads/monthly_2022_04/10saving_modified_image.png.302ace038197f04bae86da023d395c66.png" rel=""><img alt="10saving_modified_image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96594" data-unique="u88kzmoz9" src="https://academy.hsoub.com/uploads/monthly_2022_04/10saving_modified_image.png.302ace038197f04bae86da023d395c66.png" style="width: 700px; height: auto;"></a>
</p>

<p style="text-align: center;">
	حفظ الصورة المعدلة إلى ملف جديد.
</p>

<h2>
	واجهتَي مشاركة الويب
</h2>

<p>
	قد ترغب ذات مرة بمشاركة بطاقتك الترحيبية، هذا ما أتاحه مطورو Fugu Greetings بالاستفادة من الواجهتين البرمجيتين Web Share (مشاركة الويب) و Web Share Target (مشاركة وُجْهة الويب).
</p>

<p>
	تمتاز أجهزة الجوّال وأنظمة تشغيل سطح المكتب الآن بآليات مشاركة مدمجة، مثلًا في الصورة التالية هناك زر لمشاركة أحد مقالات مدونة ما في متصفح Safari على macOS، عند النقر على زر <strong>مشاركة المقال</strong> يمكنك مشاركة رابط المقال مع أصدقائك عبر تطبيقات جهازك مثلًا عبر تطبيق رسائل macOS.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96595" href="https://academy.hsoub.com/uploads/monthly_2022_04/11web_share_API_on_safari.png.7b72c8cd500c6df6cd43d0dd8f444511.png" rel=""><img alt="11web_share_API_on_safari.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96595" data-unique="p0zr05rv0" src="https://academy.hsoub.com/uploads/monthly_2022_04/11web_share_API_on_safari.png.7b72c8cd500c6df6cd43d0dd8f444511.png" style="width: 550px; height: auto;"></a>
</p>

<p style="text-align: center;">
	واجهة مشاركة الويب في متصفح Safari على macOS.
</p>

<p>
	إذا أردت تحقيق ميزة المشاركة هذه لأحد تطبيقاتك، فالشيفرة لفعل ذلك واضحة ومباشِرة، بداية تستدعي التابع <code>()navigator.share</code> وتعطيه معاملات اختيارية <code>title</code> و<code>text</code> و<code>url</code> في كائن كمعامل.
</p>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_38" style="">
<span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  await navigator</span><span class="pun">.</span><span class="pln">share</span><span class="pun">({</span><span class="pln">
    title</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Check out this article:'</span><span class="pun">,</span><span class="pln">
    text</span><span class="pun">:</span><span class="pln"> </span><span class="pun">`</span><span class="str">"${document.title}"</span><span class="pln"> by </span><span class="lit">@tomayac</span><span class="pun">:`,</span><span class="pln">
    url</span><span class="pun">:</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'link[rel=canonical]'</span><span class="pun">).</span><span class="pln">href</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="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">warn</span><span class="pun">(</span><span class="pln">err</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> err</span><span class="pun">.</span><span class="pln">message</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الطريقة التي اتبعها مطورو Fugu Greetings لمشاركة الصور هي بداية إعداد كائن <code>data</code> بمصفوفة ملفات <code>files</code> تتكون من كائن بيانات ثنائي واحد، وعنوان <code>title</code> ونص <code>text</code>، بعدها تم استخدام التابع <code>()navigator.canShare</code> يخبرنا ما إذا كان كائن data الذي نحاول مشاركته يمكن مشاركته تقنيًا عبر المتصفح أم لا (هل المتصفح حديث ويدعم المشاركة أم لا)، إذا أفاد التابع بإمكانية مشاركة الملفات، يمكن استدعاء التابع <code>()navigator.share</code> كما فعلنا في مشاركة الروابط.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_40" style="">
<span class="kwd">const</span><span class="pln"> share </span><span class="pun">=</span><span class="pln"> async </span><span class="pun">(</span><span class="pln">title</span><span class="pun">,</span><span class="pln"> text</span><span class="pun">,</span><span class="pln"> blob</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> data </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    files</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
      </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">File</span><span class="pun">([</span><span class="pln">blob</span><span class="pun">],</span><span class="pln"> </span><span class="str">'fugu-greeting.png'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        type</span><span class="pun">:</span><span class="pln"> blob</span><span class="pun">.</span><span class="pln">type</span><span class="pun">,</span><span class="pln">
      </span><span class="pun">}),</span><span class="pln">
    </span><span class="pun">],</span><span class="pln">
    title</span><span class="pun">:</span><span class="pln"> title</span><span class="pun">,</span><span class="pln">
    text</span><span class="pun">:</span><span class="pln"> text</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">
  </span><span class="kwd">try</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">navigator</span><span class="pun">.</span><span class="pln">canShare</span><span class="pun">(</span><span class="pln">data</span><span class="pun">)))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Error</span><span class="pun">(</span><span class="str">"Can't share data."</span><span class="pun">,</span><span class="pln"> data</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    await navigator</span><span class="pun">.</span><span class="pln">share</span><span class="pun">(</span><span class="pln">data</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="pln">err</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> err</span><span class="pun">.</span><span class="pln">message</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	وكعادة أي تحسين تدريجي، فقط في حال دعم المتصفح لواجهة برمجة مشاركة الويب أي فقط في حال وجود كلًا من <code>'share'</code> و <code>'canShare'</code> في كائن التنقل <code>navigator</code>، فإن تطبيق Fugu Greetings يستدعي الشيفرة السابقة (على فرض أنها محفوظة في ملف بالاسم <code>share.mjs</code>) عبر دالة الاستيراد الديناميكي <code>()import</code>، وفي المتصفحات التي تحقق شرط واحد فقط من الشرطين مثل نسخ الهاتف المحمول من متصفح Safari، فيُستَخدم الشرط المتاح فقط.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9198_42" style="">
<span class="kwd">const</span><span class="pln"> loadShare </span><span class="pun">=</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</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="str">'share'</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> navigator </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="str">'canShare'</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> navigator</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">import</span><span class="pun">(</span><span class="str">'./share.mjs'</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	بوجود ميزة المشاركة هذه في تطبيق Fugu Greetings، فإنك إذا نقرت زر <strong>مشاركة</strong> في متصفح يدعم واجهة مشاركة الويب مثل متصفح Chrome على نظام Android، يتم فتح لوحة أو حوار للمشاركة، من خلاله يمكنك اختيار التطبيق الذي تريد المشاركة إليه مثلًا Gmail، بذلك تظهر أداة إنشاء البريد الإلكتروني مع الصورة التي شاركتها كمرفق في الرسالة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96596" href="https://academy.hsoub.com/uploads/monthly_2022_04/12choosing_app_to_share_file_to.png.11da757dc7d9c02c9fd67098650cdc87.png" rel=""><img alt="12choosing_app_to_share_file_to.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96596" data-unique="70ntl9ji9" src="https://academy.hsoub.com/uploads/monthly_2022_04/12choosing_app_to_share_file_to.thumb.png.9663d9adfccbcaa6e144caf4b7069ab3.png"></a>
</p>

<p>
	اختيار تطبيق لمشاركة الملف إليه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96597" href="https://academy.hsoub.com/uploads/monthly_2022_04/13file_attached_to_new_email.png.0994e3feb91088fac7ae0a1cbd258d0d.png" rel=""><img alt="13file_attached_to_new_email.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96597" data-unique="han5xjfvl" src="https://academy.hsoub.com/uploads/monthly_2022_04/13file_attached_to_new_email.thumb.png.f9e423f713b0c9a9d9d717d7defa8385.png"></a>
</p>

<p style="text-align: center;">
	أُرفِق الملف المشارك برسالة بريد الكتروني جديدة في منشئ الـ Gmail.
</p>

<h2>
	واجهة منتقي جهات الاتصال
</h2>

<p>
	عندما تكتب بطاقة ترحيب، قد لا يكون من السهل دائمًا كتابة اسم جهة اتصال أحد أصدقائك بشكل صحيح عندما تريد مشاركته البطاقة عبر رقم هاتفه، يمكن للواجهة البرمجية Contact Picker التي تعمل في الخلفية Contact Picker <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> حل هذه المشكلة، فهي تتيح لمستخدمي التطبيق الحصول على أسماء أصدقائهم، المحفوظة في جهات اتصال هواتفهم من مجرد نقرها.
</p>

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

<p>
	قد تهتم أنت في تطبيقاتك بالوصول إلى أرقام هواتف جهات الاتصال أو عناوين بريدهم الإلكتروني أو صورهم الشخصية أو عناوين سكنهم، وبعدها تكوِّن كائن خيارات <code>options</code> وتضبط الحقل <code>multiple</code> إلى <code>true</code> لتتمكن من اختيار أكثر من مدخل (أكثر من جهة اتصال)، وأخيرًا تستدعي التابع <code>()navigator.contacts.select</code> الذي يعرض جهات الاتصال التي يختارها المستخدمين بالخاصيات المحددة في تطبيقك.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_44" style="">
<span class="kwd">const</span><span class="pln"> getContacts </span><span class="pun">=</span><span class="pln"> async </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> properties </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'name'</span><span class="pun">];</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> options </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> multiple</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
  </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> await navigator</span><span class="pun">.</span><span class="pln">contacts</span><span class="pun">.</span><span class="pln">select</span><span class="pun">(</span><span class="pln">properties</span><span class="pun">,</span><span class="pln"> options</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="pln">err</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> err</span><span class="pun">.</span><span class="pln">message</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_46" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="str">'contacts'</span><span class="pln"> in navigator</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">import</span><span class="pun">(</span><span class="str">'./contacts.mjs'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكنك تجريب الميزة التي توفرها الواجهة البرمجية Contact Picker في تطبيق Fugu Greetings بالضغط على زر جهات الاتصال <strong>contacts</strong> في التطبيق ثم اختيار أسماء جهات اتصالك التي تريد أن تُرسم في بطاقتك الترحيبية. لاحظ كيف يقتصر منتقي جهات الاتصال في تطبيق Fugu Greetings على جلب أسماء جهات الاتصال المختارة فقط دون عناوين بريدها أو معلومات أخرى مثل أرقام هواتفها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96598" href="https://academy.hsoub.com/uploads/monthly_2022_04/14Selecting_2names_with_contact_picker.png.7fa36e29969771bcbbb0d47790fb38d7.png" rel=""><img alt="14Selecting_2names_with_contact_picker.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96598" data-unique="q7s6xygjv" src="https://academy.hsoub.com/uploads/monthly_2022_04/14Selecting_2names_with_contact_picker.thumb.png.f0e6ea396670deebf92c72bd5860b022.png" style="width: 250px; height: auto;"></a>
</p>

<p style="text-align: center;">
	اختيار اسمين من قائمة جهات الاتصال عبر مُنتقي جهات الاتصال.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96599" href="https://academy.hsoub.com/uploads/monthly_2022_04/15the_2names_drawn_onto_card.png.5416fa0235fe7e934e097f2fae55aa6a.png" rel=""><img alt="15the_2names_drawn_onto_card.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96599" data-unique="474kh9a5k" src="https://academy.hsoub.com/uploads/monthly_2022_04/15the_2names_drawn_onto_card.thumb.png.35160c63603fc33fa6313a969152a4cc.png" style="width: 250px; height: auto;"></a>
</p>

<p style="text-align: center;">
	رُسمَ الاسمين في بطاقة الترحيب.
</p>

<h2>
	واجهة الحافظة غير المتزامنة
</h2>

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

<p>
	تدعم الواجهة البرمجية Clipboard غير المتزامنة التي تعمل في الخلفية <a href="https://web.dev/image-support-for-async-clipboard/" rel="external nofollow">Async Clipboard <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a> نسخ ولصق كلًا من النصوص والصور، لهذا استخدمها مطورو Fugu Greetings لإعداد ميزة النسخ من واللصق إلى التطبيق، وإذا أردت فعل ذلك في تطبيقاتك، فإنك لنسخ شيء ما إلى حافظة النظام، تحتاج أن تكتبه إليها عبر التابع <code>()navigator.clipboard.write</code> الذي يأخذ مصفوفة من عناصر الحافظة كمعامل، كل عنصر منها عبارة عن كائن بحقل قيمته الـ blob (يمثل المحتوى المنسوخ)، ومفتاحه نوع blob (كائن بيانات ثنائي).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_51" style="">
<span class="kwd">const</span><span class="pln"> copy </span><span class="pun">=</span><span class="pln"> async </span><span class="pun">(</span><span class="pln">blob</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    await navigator</span><span class="pun">.</span><span class="pln">clipboard</span><span class="pun">.</span><span class="pln">write</span><span class="pun">([</span><span class="pln">
      </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ClipboardItem</span><span class="pun">({</span><span class="pln">
        </span><span class="pun">[</span><span class="pln">blob</span><span class="pun">.</span><span class="pln">type</span><span class="pun">]:</span><span class="pln"> blob</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="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="pln">err</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> err</span><span class="pun">.</span><span class="pln">message</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	وللصق شيء ما من الحافظة، فإنك تحتاج إلى المرور على عناصرها بعد الحصول عليها من خلال التابع <code>()navigator.clipboard.read</code>.
</p>

<p>
	يمكن لكل عنصر من عناصر الحافظة ClipboardItem الاحتفاظ بمحتوياته في أنواع MIME مختلفة، لذلك فإنك للحصول على كائن blob لعنصر الحافظة فإنك بحاجة للمرور على قائمة الأنواع المتاحة افتراضيًا، ولكل نوع تستدعي الدالة <code>()getType</code> ممررًا إليها النوع الحالي في حلقة التكرار كوسيط.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_53" style="">
<span class="kwd">const</span><span class="pln"> paste </span><span class="pun">=</span><span class="pln"> async </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> clipboardItems </span><span class="pun">=</span><span class="pln"> await navigator</span><span class="pun">.</span><span class="pln">clipboard</span><span class="pun">.</span><span class="pln">read</span><span class="pun">();</span><span class="pln">
    </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> clipboardItem of clipboardItems</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> type of clipboardItem</span><span class="pun">.</span><span class="pln">types</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          </span><span class="kwd">const</span><span class="pln"> blob </span><span class="pun">=</span><span class="pln"> await clipboardItem</span><span class="pun">.</span><span class="pln">getType</span><span class="pun">(</span><span class="pln">type</span><span class="pun">);</span><span class="pln">
          </span><span class="kwd">return</span><span class="pln"> blob</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="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        console</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="pln">err</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> err</span><span class="pun">.</span><span class="pln">message</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="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="pln">err</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> err</span><span class="pun">.</span><span class="pln">message</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_55" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="str">'clipboard'</span><span class="pln"> in navigator </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="str">'write'</span><span class="pln"> in navigator</span><span class="pun">.</span><span class="pln">clipboard</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">import</span><span class="pun">(</span><span class="str">'./clipboard.mjs'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96600" href="https://academy.hsoub.com/uploads/monthly_2022_04/16clipboard_permission_prompt.png.cd9741dfbdb23f9afd569661a26e1c5c.png" rel=""><img alt="16clipboard_permission_prompt.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96600" data-unique="8d1ajzkej" src="https://academy.hsoub.com/uploads/monthly_2022_04/16clipboard_permission_prompt.png.cd9741dfbdb23f9afd569661a26e1c5c.png" style="width: 650px; height: auto;"></a>
</p>

<p style="text-align: center;">
	طلب الإذن بالوصول إلى محتوى الحافظة.
</p>

<h2>
	واجهة الشارات
</h2>

<p>
	كون تطبيق Fugu Greetings قابلًا للتثبيت installable، له أيقونة خاصة يمكن للمستخدمين تثبيتها في شريط التطبيقات app dock أو الشاشة الرئيسية، استغل مطورو Fugu Greetings هذه الأيقونة لإظهار شارة انطلاقًا منها، تحتوي عدّاد نقرات قلم الرسم pen strokes counter، وذلك بالاستفادة من الواجهة البرمجية Padging التي تعمل في الخلفية Badging <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>.
</p>

<p>
	إذا أردت إضافة شارات في تطبيقاتك، ففيما يلي طريقة استخدام الواجهة البرمجية Padging لفعل ذلك، إذ يمكنك ببساطة إضافة مستمع حدث event listener يعيِّن شارة الأيقونة بقيمة عدّاد نقرات القلم التي تزيد عند تحقق الحدث <code>pointerdown</code> (ينطلق هذا الحدث عندما يصبح مؤشر الرسم فعال)، وعند مسح محتوى حاوية الرسم يمكنك إعادة تعيين العداد إلى صفر لتُزال الشارة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_58" style="">
<span class="pln">let strokes </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

canvas</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'pointerdown'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  navigator</span><span class="pun">.</span><span class="pln">setAppBadge</span><span class="pun">(++</span><span class="pln">strokes</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

clearButton</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  strokes </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  navigator</span><span class="pun">.</span><span class="pln">setAppBadge</span><span class="pun">(</span><span class="pln">strokes</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	وكعادة أي تحسين تدريجي، حمّل هذا المنطق (الشيفرة) فقط للمتصفحات التي تدعم الواجهة البرمجية Badging:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_60" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="str">'setAppBadge'</span><span class="pln"> in navigator</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">import</span><span class="pun">(</span><span class="str">'./badge.mjs'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96601" href="https://academy.hsoub.com/uploads/monthly_2022_04/17drawing_numbers_from_1_to_7.png.54cbfd9e12f62078436c28baa57656c9.png" rel=""><img alt="17drawing_numbers_from_1_to_7.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96601" data-unique="2z1ux5798" src="https://academy.hsoub.com/uploads/monthly_2022_04/17drawing_numbers_from_1_to_7.png.54cbfd9e12f62078436c28baa57656c9.png" style="width: 750px; height: auto;"></a>
</p>

<p style="text-align: center;">
	رسم الأرقام من 1 إلى 7 بضغطة قلم واحدة لكل رقم.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96602" href="https://academy.hsoub.com/uploads/monthly_2022_04/18pen_strokes_counter_as_app_icon_badge.png.960d6a9f3c34facaee6430cacf584069.png" rel=""><img alt="18pen_strokes_counter_as_app_icon_badge.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96602" data-unique="thao4kmkf" src="https://academy.hsoub.com/uploads/monthly_2022_04/18pen_strokes_counter_as_app_icon_badge.png.960d6a9f3c34facaee6430cacf584069.png" style="width: 500px; height: auto;"></a>
</p>

<p style="text-align: center;">
	عدّاد ضغطات القلم ممثّل شارة لأيقونة التطبيق.
</p>

<h2>
	واجهة المزامنة الدورية للخلفية
</h2>

<p>
	هل تريد أن تبدأ كل يومٍ جديدٍ بمحتوى جديد؟ من الميزات الرائعة لتطبيق Fugu Greetings أنه يمكن أن يلهمك كل يوم بصورة خلفية جديدة لإنشاء بطاقتك، يستخدم التطبيق لهذه الميزة الواجهة البرمجية Periodic Background Sync التي تعمل في الخلفية Periodic Background Sync <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>، وإذا أردت فعل هذا لتطبيقاتك فإن عليك إضافة حدث مزامنة دوري periodic sync event في تسجيل <a href="https://academy.hsoub.com/programming/general/%D9%85%D9%81%D9%87%D9%88%D9%85-service-worker-%D9%88%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1%D9%87-%D9%81%D9%8A-%D8%A3%D8%AF%D8%A7%D8%A1-%D9%88%D8%A8%D9%86%D9%8A%D8%A9-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D9%88%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r833/" rel="">عامل الخدمة</a> service worker registration عبر التابع <code>()register</code>، عملية تسجيل الحدث تتطلب وسم tag يستمع عامل الخدمة إليه، وحد أدنى للفاصل الزمني للمزامنة interval. ممرر هنا حدث المزامنة بوسم اسمه <code>'image-of-the-day'</code> وبفاصل زمني لا يقل عن يوم واحد، ليحصل المستخدم على صورة خلفية جديدة كل 24 ساعة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_64" style="">
<span class="kwd">const</span><span class="pln"> registerPeriodicBackgroundSync </span><span class="pun">=</span><span class="pln"> async </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> registration </span><span class="pun">=</span><span class="pln"> await navigator</span><span class="pun">.</span><span class="pln">serviceWorker</span><span class="pun">.</span><span class="pln">ready</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    registration</span><span class="pun">.</span><span class="pln">periodicSync</span><span class="pun">.</span><span class="kwd">register</span><span class="pun">(</span><span class="str">'image-of-the-day-sync'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// An interval of one day.</span><span class="pln">
      minInterval</span><span class="pun">:</span><span class="pln"> </span><span class="lit">24</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">60</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">60</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1000</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="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="pln">err</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> err</span><span class="pun">.</span><span class="pln">message</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	الخطوة الثانية هي الاستماع إلى حدث المزامنة الدورية <code>'periodicsync'</code> في عامل الخدمة، فإذا كان وسم الحدث هو <code>'image-of-the-day'</code>، أي بنفس اسم الحدث المُسجل في عامل الخدمة، يتم جلب صورة اليوم عبر الدالة <code>()getImageOfTheDay</code>، وتُنشر النتيجة لجميع العملاء، لتُحدَّث حاويات رسمهم canvases وذاكراتهم المؤقته caches بها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_66" style="">
<span class="pln">self</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'periodicsync'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">syncEvent</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</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">syncEvent</span><span class="pun">.</span><span class="pln">tag </span><span class="pun">===</span><span class="pln"> </span><span class="str">'image-of-the-day-sync'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    syncEvent</span><span class="pun">.</span><span class="pln">waitUntil</span><span class="pun">(</span><span class="pln">
      </span><span class="pun">(</span><span class="pln">async </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">const</span><span class="pln"> blob </span><span class="pun">=</span><span class="pln"> await getImageOfTheDay</span><span class="pun">();</span><span class="pln">
        </span><span class="kwd">const</span><span class="pln"> clients </span><span class="pun">=</span><span class="pln"> await self</span><span class="pun">.</span><span class="pln">clients</span><span class="pun">.</span><span class="pln">matchAll</span><span class="pun">();</span><span class="pln">
        clients</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">((</span><span class="pln">client</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          client</span><span class="pun">.</span><span class="pln">postMessage</span><span class="pun">({</span><span class="pln">
            image</span><span class="pun">:</span><span class="pln"> blob</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="pun">})()</span><span class="pln">
    </span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	وكالعادة لأن هذه الميزة تعتبر تحسينًا تقدميًا، فيجب تحميل الشيفرة السابقة فقط للمتصفحات التي تدعم الواجهة البرمجية Periodic Background Sync لكلًا من شيفرة العميل و شفرة الخادم. لاحظ بدلاً من استخدام الاستيراد الديناميكي <code>()import</code> غير المدعوم في عامل الخدمة <a href="https://github.com/w3c/ServiceWorker/issues/1356#issuecomment-433411852" rel="external nofollow">حتى اللحظة</a>، استخدمنا الاستيراد التقليدي <code>()importScripts</code>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_68" style="">
<span class="com">// في طرف العميل</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> registration </span><span class="pun">=</span><span class="pln"> await navigator</span><span class="pun">.</span><span class="pln">serviceWorker</span><span class="pun">.</span><span class="pln">ready</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">registration </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="str">'periodicSync'</span><span class="pln"> in registration</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">import</span><span class="pun">(</span><span class="str">'./periodic_background_sync.mjs'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_70" style="">
<span class="com">// في عامل الخدمة</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="str">'periodicSync'</span><span class="pln"> in self</span><span class="pun">.</span><span class="pln">registration</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  importScripts</span><span class="pun">(</span><span class="str">'./image_of_the_day.mjs'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وبتجريب هذه الميزة في تطبيق Fugu Greetings، يؤدي الضغط على زر Wallpaper إلى إظهار صورة بطاقة الترحيب لهذا اليوم التي تُحدَّث يوميًا عبر الواجهة البرمجية Periodic Background Sync.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96603" href="https://academy.hsoub.com/uploads/monthly_2022_04/19pressing_wallpaper_button.png.a25ad84197a8bcae56d574ef476738ba.png" rel=""><img alt="19pressing_wallpaper_button.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96603" data-unique="omkgltnug" src="https://academy.hsoub.com/uploads/monthly_2022_04/19pressing_wallpaper_button.png.a25ad84197a8bcae56d574ef476738ba.png" style="width: 600px; height: auto;"></a>
</p>

<p style="text-align: center;">
	نقر زر <strong>Wallpaper</strong> يؤدي لعرض صورة اليوم.
</p>

<h2>
	واجهة مُطْلِق الإشعارات
</h2>

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

<p>
	تمكن مطورو Fugu Greeting من إضافة هذه الميزة من خلال الواجهة البرمجية Notification Triggers التي تعمل في الخلفية Notification Triggers <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>، فبعد تعيينك الوقت الذي تريد إطلاق الإشعار فيه، يُجدوِل التطبيق الإشعار باستخدام الخاصية <code>showTrigger</code>، يمكن أن تكون الجدولة عبر الكائن <code>TimestampTrigger</code> بالتاريخ الذي حددته، وسيُطلق التنبيه محليًا دون الحاجة إلى جانب الشبكة أو الخادم.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_73" style="">
<span class="kwd">const</span><span class="pln"> targetDate </span><span class="pun">=</span><span class="pln"> promptTargetDate</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">targetDate</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> registration </span><span class="pun">=</span><span class="pln"> await navigator</span><span class="pun">.</span><span class="pln">serviceWorker</span><span class="pun">.</span><span class="pln">ready</span><span class="pun">;</span><span class="pln">
  registration</span><span class="pun">.</span><span class="pln">showNotification</span><span class="pun">(</span><span class="str">'Reminder'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    tag</span><span class="pun">:</span><span class="pln"> </span><span class="str">'reminder'</span><span class="pun">,</span><span class="pln">
    body</span><span class="pun">:</span><span class="pln"> </span><span class="str">"It's time to finish your greeting card!"</span><span class="pun">,</span><span class="pln">
    showTrigger</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">TimestampTrigger</span><span class="pun">(</span><span class="pln">targetDate</span><span class="pun">),</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">}</span></pre>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_75" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="str">'Notification'</span><span class="pln"> in window </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="str">'showTrigger'</span><span class="pln"> in </span><span class="typ">Notification</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">import</span><span class="pun">(</span><span class="str">'./notification_triggers.mjs'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكنك تجريب هذه الميزة بنفسك في تطبيق Fugu Greetings، وذلك بتفعيل خيار <strong>Reminder</strong> (تذكير) الذي يَطلب منك إدخال متى تريد أن تُنبّه بشأن إنهاء بطاقتك، عندما يحين ذلك الموعد ستحصل بالفعل على تنبيه لإنهائها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96604" href="https://academy.hsoub.com/uploads/monthly_2022_04/20Scheduling_local_reminder.png.7e653d9e08ee1326c40186472e6738ad.png" rel=""><img alt="20Scheduling_local_reminder.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96604" data-unique="r30urnw8d" src="https://academy.hsoub.com/uploads/monthly_2022_04/20Scheduling_local_reminder.png.7e653d9e08ee1326c40186472e6738ad.png" style="width: 650px; height: auto;"></a>
</p>

<p style="text-align: center;">
	جدولة إشعار محلي للتذكير بإنهاء بطاقة التهنئة.
</p>

<p>
	عندما يُطلَق إشعار مجدول في Fugu Greetings، يُعرَض تمامًا مثل أي إشعار آخر، لكن الفرق أنه لا يتطلب اتصالاً بالشبكة كما قلنا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96605" href="https://academy.hsoub.com/uploads/monthly_2022_04/21triggered_notification_in_notification_center.png.c279fb11bb55ca1f3a77d906f765639a.png" rel=""><img alt="21triggered_notification_in_notification_center.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96605" data-unique="4j4bwe881" src="https://academy.hsoub.com/uploads/monthly_2022_04/21triggered_notification_in_notification_center.png.c279fb11bb55ca1f3a77d906f765639a.png"></a>
</p>

<p style="text-align: center;">
	الإشعار المطلَق يظهر في مركز إشعارات macOS.
</p>

<h2>
	واجهة قفل الإيقاظ
</h2>

<p>
	تحتاج في بعض الأحيان إلى التحديق طويلًا في الشاشة حتى يأتيك الإلهام، أسوأ ما يمكن أن يحدث حينها هو إيقاف تشغيل الشاشة، وهذا ما يحدث غالبًا تلقائيًا عند توقُف تفاعلنا مع التطبيقات لفترة طويلة. يمكن منع حدوث ذلك من خلال الواجهة البرمجية Wake Lock التي تعمل في الخلفية Wake Lock <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>.
</p>

<p>
	إذا أردت إضافة هذه الميزة لتطبيقاتك، فإن أول ما عليك فعله هو الحصول على قفل إيقاظ باستخدام التابع <code>()navigator.wakelock.request</code>، وبالتحديد للحصول على قفل إيقاظ للشاشة، يمكنك تمرير نص <code>'screen'</code> إلى التابع، وتضيف مستمع الحدث ليُعلِمُك متى يُحرَّر قفل الإيقاظ. يمكن أن يحدث هذا مثلًا عندما تتغير <a href="https://wiki.hsoub.com/JavaScript/Document/visibilityState" rel="external">قابلية ظهور النافذة</a>. فيمكنك مثلًا عندما تصبح علامة التبويب ظاهرة مجددًا، أن تعاود طلب قفل الإيقاظ.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_79" style="">
<span class="pln">let wakeLock </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> requestWakeLock </span><span class="pun">=</span><span class="pln"> async </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  wakeLock </span><span class="pun">=</span><span class="pln"> await navigator</span><span class="pun">.</span><span class="pln">wakeLock</span><span class="pun">.</span><span class="pln">request</span><span class="pun">(</span><span class="str">'screen'</span><span class="pun">);</span><span class="pln">
  wakeLock</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'release'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Wake Lock was released'</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Wake Lock is active'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> handleVisibilityChange </span><span class="pun">=</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</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">wakeLock </span><span class="pun">!==</span><span class="pln"> </span><span class="kwd">null</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">visibilityState </span><span class="pun">===</span><span class="pln"> </span><span class="str">'visible'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    requestWakeLock</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

document</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'visibilitychange'</span><span class="pun">,</span><span class="pln"> handleVisibilityChange</span><span class="pun">);</span><span class="pln">
document</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'fullscreenchange'</span><span class="pun">,</span><span class="pln"> handleVisibilityChange</span><span class="pun">);</span></pre>

<p>
	وكعادة التحسين التدريجي، تُحمِّل شيفرة هذه الميزة فقط إذا كان المتصفح يدعم الواجهة البرمجية Wake Lock.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_81" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="str">'wakeLock'</span><span class="pln"> in navigator </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="str">'request'</span><span class="pln"> in navigator</span><span class="pun">.</span><span class="pln">wakeLock</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">import</span><span class="pun">(</span><span class="str">'./wake_lock.mjs'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	هذه الواجهة مستخدمة في Fugu Greetings لتطبيق ميزة إبقاء الشاشة يقظة إذا طلب المستخدم ذلك، يمكنك تجريب هذه الميزة عبر تفعيل مربع الاختيار <strong>Insomnia</strong> الذي يُبقي الشاشة يقظة عند ابتعادك عن التطبيق بدلًا من إيقاف تشغيلها.
</p>

<p style="text-align: center;">
	<img alt="22insomnia_checkbox_keeps_app_awake.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96606" data-unique="2la3088i4" src="https://academy.hsoub.com/uploads/monthly_2022_04/22insomnia_checkbox_keeps_app_awake.png.6f728e871fa71ac4266a15d5c990178b.png" style="width: 650px; height: auto;"></p>

<p style="text-align: center;">
	مربع اختيار إبقاء الشاشة يقظة.
</p>

<h2>
	واجهة كشف التوقف
</h2>

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

<p>
	تسمح الواجهة البرمجية Idle Detection التي تعمل في الخلفية Idle Detection <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> بالكشف عن توقف استخدام تطبيقك.
</p>

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

<p>
	إذا أردت استخدام هذه الميزة لتطبيقاتك فعليك كخطوة أولى لاستخدام الواجهة Idle Detection أن تتأكد من منح المتصفح الإذن للكشف عن توقف استخدام التطبيق <code>'idle-detection'</code>، وإلا فأنت بحاجة إلى طلب ذلك الإذن عبر التابع <code>()IdleDetector.requestPermission</code>، لاحظ أن استدعاء هذه التابع يتطلب قبول من المستخدم.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_85" style="">
<span class="com">// 'idle-detection' تأكد من الحصول على الإذن</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> state </span><span class="pun">=</span><span class="pln"> await </span><span class="typ">IdleDetector</span><span class="pun">.</span><span class="pln">requestPermission</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">state </span><span class="pun">!==</span><span class="pln"> </span><span class="str">'granted'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// Need to request permission first.</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Idle detection permission not granted.'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

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

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_87" style="">
<span class="kwd">const</span><span class="pln"> idleDetector </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">IdleDetector</span><span class="pun">();</span><span class="pln">
idleDetector</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'change'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> userState </span><span class="pun">=</span><span class="pln"> idleDetector</span><span class="pun">.</span><span class="pln">userState</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> screenState </span><span class="pun">=</span><span class="pln"> idleDetector</span><span class="pun">.</span><span class="pln">screenState</span><span class="pun">;</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(`</span><span class="typ">Idle</span><span class="pln"> change</span><span class="pun">:</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">userState</span><span class="pun">},</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">screenState</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">userState </span><span class="pun">===</span><span class="pln"> </span><span class="str">'idle'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    clearCanvas</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

await idleDetector</span><span class="pun">.</span><span class="pln">start</span><span class="pun">({</span><span class="pln">
  threshold</span><span class="pun">:</span><span class="pln"> </span><span class="lit">60000</span><span class="pun">,</span><span class="pln">
  signal</span><span class="pun">,</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	وكالعادة، لا تُحمِّل الشيفرة إلا بعدما تتأكد من دعم المتصفح لها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9198_89" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="str">'IdleDetector'</span><span class="pln"> in window</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">import</span><span class="pun">(</span><span class="str">'./idle_detection.mjs'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	في تطبيق Fugu Greetings، تُمسح حاوية الرسم عند تفعيل مربع الاختيار <strong>Ephemeral</strong> زائل ويكون المستخدم متوقف عن استخدام التطبيق لفترة طويلة جدًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96607" href="https://academy.hsoub.com/uploads/monthly_2022_04/23phemeral_checked_and_user_is_idle.png.b489b2aa5a939de49c72b88ee30cb902.png" rel=""><img alt="23phemeral_checked_and_user_is_idle.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96607" data-unique="301pbtzah" src="https://academy.hsoub.com/uploads/monthly_2022_04/23phemeral_checked_and_user_is_idle.png.b489b2aa5a939de49c72b88ee30cb902.png" style="width: 650px; height: auto;"></a>
</p>

<p>
	حاوية الرسم ممسوحة كون خيار <strong>Ephemeral</strong> مفعّل والمستخدم متوقف عن استخدام التطبيق لفترة طويلة.
</p>

<h2>
	الخاتمة
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96608" href="https://academy.hsoub.com/uploads/monthly_2022_04/24request_only_files_with_code_supported.png.9836e88cd31692b2b78e3fab5778d5df.png" rel=""><img alt="24request_only_files_with_code_supported.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96608" data-unique="hsa4ndbjm" src="https://academy.hsoub.com/uploads/monthly_2022_04/24request_only_files_with_code_supported.png.9836e88cd31692b2b78e3fab5778d5df.png" style="width: 750px; height: auto;"></a>
</p>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96609" href="https://academy.hsoub.com/uploads/monthly_2022_04/25fugu_greetings_on_android_chrome.png.cb1750b4bc94cd6b3990438dd5d589ff.png" rel=""><img alt="25fugu_greetings_on_android_chrome.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96609" data-unique="50w99zrin" src="https://academy.hsoub.com/uploads/monthly_2022_04/25fugu_greetings_on_android_chrome.png.cb1750b4bc94cd6b3990438dd5d589ff.png"></a>
</p>

<p style="text-align: center;">
	نسخة Android من تطبيق Fugu Greetings في متصفح Chrome.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96610" href="https://academy.hsoub.com/uploads/monthly_2022_04/26fugu_greetings_on_desktop_safari.png.96e55346a488f74987563a5ad10ba4a4.png" rel=""><img alt="26fugu_greetings_on_desktop_safari.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96610" data-unique="f1v6axkxc" src="https://academy.hsoub.com/uploads/monthly_2022_04/26fugu_greetings_on_desktop_safari.png.96e55346a488f74987563a5ad10ba4a4.png"></a>
</p>

<p style="text-align: center;">
	نسخة سطح المكتب من تطبيق Fugu Greetings في متصفح Safari.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96611" href="https://academy.hsoub.com/uploads/monthly_2022_04/27fugu_greetings_on_desktop_chrome.png.47cb4f3a4112a3192f32a0b0620c3e09.png" rel=""><img alt="27fugu_greetings_on_desktop_chrome.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96611" data-unique="w2nlizsag" src="https://academy.hsoub.com/uploads/monthly_2022_04/27fugu_greetings_on_desktop_chrome.png.47cb4f3a4112a3192f32a0b0620c3e09.png"></a>
</p>

<p style="text-align: center;">
	نسخة سطح المكتب من تطبيق Fugu Greetings في متصفح Chrome.
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="96612" href="https://academy.hsoub.com/uploads/monthly_2022_04/28fugu_greetings_gitHub.png.0a66f08012073b5985f6e62a1cea1926.png" rel=""><img alt="28fugu_greetings_gitHub.png" class="ipsImage ipsImage_thumbnailed" data-fileid="96612" data-unique="xgmhb75tf" src="https://academy.hsoub.com/uploads/monthly_2022_04/28fugu_greetings_gitHub.png.0a66f08012073b5985f6e62a1cea1926.png" style="width: 750px; height: auto;"></a>
</p>

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

<p>
	ترجمة -وبتصرف- للمقال <a href="https://web.dev/progressively-enhance-your-pwa/" rel="external nofollow">Progressively enhance your Progressive Web App</a> من موقع <a href="https://web.dev/" rel="external nofollow">web.dev</a>.
</p>

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

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AC%D8%B9%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-%D9%8A%D8%A8%D8%AF%D9%88-%D9%83%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A-%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-r1528/" rel="">جعل تطبيق الويب التقدمي PWA يبدو كتطبيق أساسي في نظام التشغيل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa%D8%9F-r1480/" rel="">ما هي تطبيقات الويب التقدمية PWA؟</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1489/" rel="">ميزات تطبيق الويب التقدمي PWA</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%A7%D9%82%D8%AA%D8%B1%D8%A7%D8%AD%D8%A7%D8%AA-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A%D8%A9-pwa-r1446/" rel="">نماذج اقتراحات تثبيت تطبيقات الويب التقدمية PWA</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D9%88%D9%81%D9%8A%D8%B1-%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D8%AF%D8%A7%D8%AE%D9%84-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%AA%D9%82%D8%AF%D9%85%D9%8A-pwa-r1445/" rel="">توفير تجربة تثبيت مخصصة داخل تطبيق الويب التقدمي PWA</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1529</guid><pubDate>Tue, 19 Apr 2022 07:39:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x648;&#x64A;&#x628;</title><link>https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1522/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_04/624828d5a92f0_---.png.f1556ef876ef3aeaffe6d8a1cd07c6dc.png" /></p>
<p>
	سنغطي في هذا المقال من سلسلة <a href="https://academy.hsoub.com/tags/%D8%AA%D8%B9%D9%84%D9%85%20%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">تعلم البرمجة</a>:
</p>

<ul>
	<li>
		تاريخ موجز للويب.
	</li>
	<li>
		أساسيات <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>.
	</li>
	<li>
		معماريات الويب وأطر العمل فيه.
	</li>
	<li>
		دور كل من <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> و <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> و<a href="https://wiki.hsoub.com/JavaScript" rel="external">جافاسكربت</a> و<a href="https://wiki.hsoub.com/Python" rel="external">بايثون</a>.
	</li>
</ul>

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

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p>
			ملاحظة: لا يحتاج طالب البرمجة إلى أغلب المفاهيم التي سنشرحها في هذا المقال، ولا تؤثر الخبرة فيها على كتابة الشيفرات والبرامج والأمثلة التي سنكتبها إلا قليلا، وسنوفر روابط للتعمق في تلك التقنيات متى أمكن.
		</p>
	</div>
</blockquote>

<h2>
	تاريخ موجز للويب
</h2>

<p>
	ابتكر تِم برنرز-لي Tim Berners-Lee الشبكة العالمية -الوب- لحل مشكلة واجهته هو وزملاؤه في CERN، وهي مشكلة مشاركة المستندات فيما بينهم، فقد كان لديهم مستندات كثيرة في مواقع مختلفة وبصيغ مختلفة، ويحتاج كل منها إلى مفاهيم أو مواد موجودة في مستندات أخرى بعيدة، وكان الكثير من تلك المستندات مشاريع جاريةً يعمل عليها عدة أشخاص معًا.
</p>

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

<h3>
	النصوص المتشعبة ولغة HTML والمحتوى الثابت
</h3>

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

<p>
	واحتاج مفهوم النص المتشعب إلى آلية لربط المستندات معًا، فابتكر لي صيغةً نصيةً أو لغةً توصيفيةً سماها لغة توصيف النصوص الفائقة Hypertext Markup Language أو HTML اختصارًا، مبنيةً على معيار موجود من قبل اسمه لغة التوصيف المعيارية العامة Standard Generalised Markup Language أو SGML اختصارًا، وتُكتب صفحات الويب الحالية في أبسط صورها بلغة HTML أو XHTML -وهي صورة أخرى تتوافق مع HTML-، يدويًا أو بواسطة برنامج حاسوبي، وتعرض المتصفحات صفحاتها من خلال تفسير وسوم HTML تلك وإخراج المحتوى المنسَّق بها على شاشة المستخدم، ويمكن الرجوع إلى <a href="https://wiki.hsoub.com/HTML" rel="external">توثيق موسوعة حسوب للغة HTML</a> للمزيد عن هذه اللغة.
</p>

<p>
	استطاع لي بعد كتابة هذه اللغة أن ينشئ مستندات فائقةً -أو تشعبيةً وهو مصطلح آخر لوصف مستندات HTML- وإن كانت بسيطةً نسبةً إلى الموجود الآن، أتاحت تنسيق الصفحات، وإدراج الصور والروابط إلى مستندات أخرى، لاحظ أننا لم نتعرض حتى الآن لمفهوم الشبكات، فكانت الخطوة التالية هي تمكين الوصول إلى تلك المستندات من حواسيب أخرى عبر الشبكة، وقد تطلب ذلك تعريف صيغة قياسية لعناوين تلك المستندات وذلك المحتوى، وهو ما صار يُعرف فيما بعد باسم <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">المحدد الموحد للموارد Uniform Resource Locator أو URL</a> اختصارًا، يشير أول جزء منه إلى البروتوكول المستخدم، والذي يكون عادةً <code>http</code> أو <code>https</code> في حالة الويب، أما الجزء التالي فيستخدم تسميةً قياسيةً في الإنترنت لتحديد الخادم -ومنفذًا اختياريًا هو عادةً المنفذ 80 كما شرحنا في المقال السابق-، ثم يأتي الجزء الأخير وهو الموقع المنطقي logical للمحتوى على الخادم، ونستخدم كلمة المنطقي هنا لأن هذا الموقع قد لا يكون حقيقيًا أصلًا، وإنما متعلق بموقع ثابت ما يعرفه الخادم، وإن كان يبدو مثل مسار مطلق لمجلد في نظام يونكس، وقد يترجم الخادم الموقع إلى استدعاء تطبيق أو صورة أخرى من مصادر البيانات، لذا إذا نظرنا إلى الرابط الكامل للصفحة <a href="http://www.alan-g.me.uk/l2p2/tutweb.htm" ipsnoembed="true" rel="external nofollow">http://www.alan-g.me.uk/l2p2/tutweb.htm</a> مثلًا، فسنجد أنه يتكون مما يلي:
</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 style="text-align:center">
				البروتوكول
			</th>
			<th style="text-align:center">
				عنوان IP
			</th>
			<th style="text-align:center">
				المنفذ
			</th>
			<th style="text-align:center">
				الموقع
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td style="text-align:center">
				<code>http://‎</code>
			</td>
			<td style="text-align:center">
				<code>www.alan-g.me.uk</code>
			</td>
			<td style="text-align:center">
				<code>‎:80</code>
			</td>
			<td style="text-align:center">
				<code>‎/l2p2/tutweb.htm</code>
			</td>
		</tr>
	</tbody>
</table>

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

<h3>
	الصفحات الديناميكية وواجهة البوابة المشتركة CGI
</h3>

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

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

<p>
	أما التقنية المستخدمة في إنشاء المحتوى الديناميكي للويب فتسمى واجهة البوابة المشتركة CGI، وتمتاز بسهولة تنفيذها وحياديتها اللغوية بحيث لا تتعلق بلغة بعينها، فقد كُتبت تطبيقات الويب الأولى المبنية على CGI بلغات مثل C و <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> وملفات باتش لنظام DOS -أو batch files- وسكربتات صدفة يونكس، إلا أنها لم تلبث أن صارت تُكتب بلغة Perl وحدها بسبب القدرة الكبيرة لهذه اللغة على معالجة النصوص، ووجود وحدة CGI library لمعالجة طلبات الويب، وتحتوي <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>cgi</code> التي تُستخدم لبناء تطبيقات ويب ديناميكية، وإن كانت بسيطة، وسندرس ذلك في مقال لاحق.
</p>

<p>
	كل هذا العمل يضع إمكانيات التفاعل مع المستخدمين على عاتق الخادم، لذا صار جليًا أننا نحتاج إلى نوع من البرمجة داخل المتصفح، لأننا نريد سرعة الاستجابة في هذا التفاعل، وقد وفر متصفح Netscape ذلك في صورة جافاسكربت -و VBScript في متصفح إنترنت إكسبلورر-. وبهذه البرمجة النصية scripting languages -التي لا تحتاج إلى تصريف compiling قبل تشغيلها- صار المتصفح ينشئ نموذجًا برمجيًا للمستند داخل ذاكرته، فيما يسمى بنموذج كائن المستند Document Object Model أو <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-dom-r644/" rel="">DOM</a> اختصارًا -وقد شاعت هذه التقنية إلى أن صارت معيارًا موحدًا على مستوى المتصفحات- ثم تستطيع اللغات النصية scripting languages أن تبحث في ذلك النموذج عن مكونات المستند، مثل الفقرات أو الجداول، وتعدلها، بتغيير لونها مثلًا أو موضعها في الصفحة، وقد كان ذلك مفيدًا في التحقق من صحة مدخَلات المستخدم مثلًا قبل إرسال البيانات إلى الخادم.
</p>

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

<p>
	من النادر كتابة تطبيقات الويب باستخدام هذا البروتوكول حاليًا، وقد فقدت Perl موقعها في كونها لغةً مفضلةً للويب في ظل وجود تقنيات مثل صفحات الخوادم النشطة Active Server Pages أو ASP اختصارًا، وصفحات <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="">جافا</a> للخوادم Java Server Pages أو JSP، وكذلك <a href="https://wiki.hsoub.com/PHP" rel="external">PHP</a> وغيرها، وسنلقي نظرةً على تقنية من تلك التقنيات المبنية على بايثون في مقال لاحق.
</p>

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

<h2>
	بروتوكول النصوص التشعبية HTTP
</h2>

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

<ul>
	<li>
		GET: لقراءة المستند من الخادم.
	</li>
	<li>
		POST: لإرسال البيانات إلى الخادم.
	</li>
	<li>
		PUT: لإنشاء مستند جديد على الخادم، أو بديل له.
	</li>
	<li>
		DELETE: لحذف المستند من الخادم.
	</li>
</ul>

<p>
	توجد رسائل أخرى غير التي ذكرناها، لكننا ذكرنا الرسائل الأساسية المستخدمة في بناء التطبيقات، ولعل أكثرها استخدامًا GET و POST، غير أننا نستطيع أن نرى أن لدينا أساسًا من نمط CRUD التقليدي هنا، والذي يعني إنشاء Create وقراءة Read وتعديل Update وحذف Delete.
</p>

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

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

<h2>
	استخدام الوحدة urllib.requests
</h2>

<p>
	لجلب صفحة ويب بسيطة نستورد <code>urllib.request</code>، ثم نفتح رابطًا لقراءة النتيجة، كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9193_17" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">import</span><span class="pln"> urllib</span><span class="pun">.</span><span class="pln">request </span><span class="kwd">as</span><span class="pln"> url
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> site </span><span class="pun">=</span><span class="pln"> url</span><span class="pun">.</span><span class="pln">urlopen</span><span class="pun">(</span><span class="str">'http://www.alan-g.me.uk/l2p2/index.htm'</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> page </span><span class="pun">=</span><span class="pln"> site</span><span class="pun">.</span><span class="pln">read</span><span class="pun">()</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="pln"> page </span><span class="pun">)</span></pre>

<p>
	هذا هو كل ما نحتاج إليه، فلدينا الآن سلسلة نصية تحتوي على شيفرة HTML للصفحة الرئيسية للنسخة الإنجليزية من هذه السلسلة، ونستطيع موازنتها إن شئنا مع نتيجة استخدام <code>View&gt;Source</code> في المتصفح، حيث سنرى أن لهما نفس المحتوى تقريبًا، باستثناء أن المتصفح ينسق HTML لجعلها أسهل في القراءة.
</p>

<p>
	يبقى أن نسأل أنفسنا ماذا نفعل بالمحتوى الذي لدينا؟ والجواب أننا بلا شك نريد استخراج معلومات منه من خلال تحليله، ويتضمن هذا التحليل في أبسط صوره البحث عن سلسلة أو تعبير نمطي ما، إذ نستطيع أن نبحث في جميع وسوم الصور مثلًا في الصفحة من خلال البحث عن السلسلة <code>‎'&lt;img'‎</code>، أو <code>‎'&lt;IMG'‎</code>، أو التعبير النمطي <code>‎'&lt;img'‎</code> مع تعيين الراية <code>re.IGNORECASE</code>.
</p>

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

<h2>
	هيكل تطبيق الويب
</h2>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="95237" href="https://academy.hsoub.com/uploads/monthly_2022_04/WebArchitecture.png.01fcff21e68c0fda41d4b28fb16868b6.png" rel="" data-fileext="png"><img alt="WebArchitecture.png" class="ipsImage ipsImage_thumbnailed" data-fileid="95237" data-unique="b0ut1kei4" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2022_04/WebArchitecture.png.01fcff21e68c0fda41d4b28fb16868b6.png"></a>
</p>

<p>
	تختلف التقنيات المستخدمة في كل مرحلة عن الأخرى، وسننظر الآن في تلك الوحدات بالترتيب.
</p>

<h3>
	متصفح الويب Web Browser
</h3>

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

<h3>
	مستمع الويب Web Listener
</h3>

<p>
	حزمة قياسية -مثل <a href="https://academy.hsoub.com/devops/servers/web/apache/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%B6%D8%A8%D8%B7-%D8%AE%D8%A7%D8%AF%D9%85-apache-r407/" rel="">خادم Apache</a> المعروف-، رغم وجود عدة حزم أخرى، ولا تحتوي هذه الحزمة على أي مزايا يمكن للمستخدم برمجتها، باستثناء بعض الإعدادات.
</p>

<h3>
	خادم التطبيق Application Server
</h3>

<p>
	تكون هذه الحزمة غالبًا حزمة خادم قياسيةً، إما متكاملةً مع مستمع الويب، أو مستقلةً بذاتها، كما في حالة حاوية Tomcat Java Server Container، أو قد تكون إطار عمل برمجي، مثل <a href="https://academy.hsoub.com/programming/python/django/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-django%C2%A0-r353/" rel="">جانغو Django للغة بايثون</a>، أو <a href="https://academy.hsoub.com/programming/python/flask/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-flask-r333/" rel="">إطار فلاسك Flask</a> الذي سندرسه لاحقًا.
</p>

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

<h3>
	ملفات HTML
</h3>

<p>
	ملفات HTML هي ملفات نصية قياسية تُخزَّن على الخادم، وتُكتب بمزيج من لغات HTML وCSS وجافاسكربت، وربما VBScript إذا كانت في بيئة ويندوز، وسبب استخدام هذه اللغات الثلاثة مجموعةً؛ هو أن كلًا منها يؤدي دورًا مستقلًا في بناء الصفحة وجعلها قابلة للتعديل اللاحق، فتحدد لغة HTML بنية المستند، مثل العناوين والجداول والفقرات والصور وغيرها، وتوفر أوراق الأنماط المتتالية -أو التنسيقات الموروثة- <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-css-r551/" rel="">CSS</a> المظاهر الجمالية، مثل الألوان والمواضع على الصفحة والخطوط، وتتحكم في طريقة عرض عناصر HTML على الصفحة، بينما تتحكم جافاسكربت في السلوك الديناميكي للعناصر، مثل القوائم المنسدلة والعناصر القابلة للطي وغيرها، وقد استُخدمت في البداية للتحقق من البيانات، غير أن خيارات التحقق التي أتت في <a href="https://academy.hsoub.com/programming/html/html5/%D8%AE%D9%85%D8%B3%D8%A9-%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1-%D8%B9%D9%84%D9%8A%D9%83-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87%D8%A7-%D8%B9%D9%86-html5-r324/" rel="">HTML5</a> حلت محلها في هذه الوظيفة.
</p>

<h3>
	قاعدة البيانات
</h3>

<p>
	حزمة قاعدة البيانات في الغالب حزمة قياسية مثل التي شرحناها في <a href="https://academy.hsoub.com/devops/servers/databases/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r602/" rel="">مقال العمل مع قواعد البيانات</a>، وتتكون من <a href="https://academy.hsoub.com/programming/sql/%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%82%D8%A7%D8%AA-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%D9%81%D9%8A-sql-r590/" rel="">جداول SQL</a> واستعلاماتها وبعض الإجراءات المخزنة في أي لغة تدعمها قاعدة البيانات، ويكون الوصول إلى تلك البيانات غالبًا باستخدام واجهة برمجة التطبيقات <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>
	ويتبين مما سبق أننا نحتاج إلى أن نتعلم HTML وCSS وجافاسكربت وبايثون وSQL أيضًا إذا أردنا بناء تطبيق ويب كامل، وكذلك كيفية إعداد الخوادم المختلفة وإدارتها، إلا أن مطوري الويب يتخصصون غالبًا إما في <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8/#%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA%20%D8%A7%D9%84%D8%A3%D9%85%D8%A7%D9%85%D9%8A%D8%A9%20Front-End" rel="">تطوير الواجهات الأمامية</a> فقط، فيتعلمون اللغات التي تبني ما يراه المستخدم النهائي، مثل HTML و CSS و<a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-javascript-r550/" rel="">جافاسكربت</a> ونحوها، أو <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8/#%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%AE%D9%84%D9%81%D9%8A%D8%A9-Back-End" rel="">تطوير الواجهات الخلفية</a> فقط، فيتعلمون <a href="https://wiki.hsoub.com/Python" rel="external">بايثون</a> أو أي لغة تطوير أخرى مثل جافا و <a href="https://academy.hsoub.com/programming/php/%D8%AA%D9%85%D9%87%D9%8A%D8%AF-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-php-r235/" rel="">PHP</a> و<a href="https://wiki.hsoub.com/Ruby" rel="external">روبي Ruby</a> و<a href="https://wiki.hsoub.com/SQL" rel="external">SQL</a> (انظر مصادر التعلم وخارطة الطريق في مقال <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8/" rel="">المدخل الشامل لتعلم تطوير الويب</a>).
</p>

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

<p>
	سندرس في المقالين التاليين جانبًا من برمجة الويب من جانب العميل client side وجانب الخادم server side، فسنرى كيف نعالج HTML كما لو كانت في متصفح، وهذا ضروري إذا أردنا بناء قاعدة بيانات من المعلومات التي نحصل عليها من الويب، فقد نحصل على البيانات من موقعي ويب مختلفين، ونريد جمعهما معًا لتحليل الظواهر الشائعة trends، وهو ما يُعرف ببرمجة جانب العميل client side programming.
</p>

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

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

<h2>
	خاتمة
</h2>

<p>
	نأمل في نهاية هذا المقال أن تكون تعلمت ما يلي:
</p>

<ul>
	<li>
		تُرسل الطلبات إلى خوادم الويب باستخدام طلبات http GET.
	</li>
	<li>
		يرد خادم الويب بمستند HTML.
	</li>
	<li>
		نحتاج إلى تحليل HTML لاستخراج البيانات التي نريدها.
	</li>
	<li>
		التعابير النمطية ليست أفضل أداة لتحليل HTML.
	</li>
	<li>
		توفر بايثون حزم <code>browser</code> و<code>urllib</code> و<code>html</code> لاستخدامها في برمجة جانب العميل.
	</li>
	<li>
		توفر بايثون كذلك عدة وحدات للتحليل، لعل أبرزها ElementTree.
	</li>
	<li>
		يُفضل التحكم في سلوك المتصفح من داخل صفحة الويب باستخدام جافاسكربت.
	</li>
</ul>

<p>
	ترجمة -بتصرف- <a href="http://www.alan-g.me.uk/l2p2/tutweb.htm" rel="external nofollow">للفصل الثامن والعشرين: Working With the Web</a> من كتاب Learn To Program لصاحبه Alan Gauld.
</p>

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

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/python/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r1523/" rel="">برمجة عملاء ويب باستخدام بايثون</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/networking/%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D8%A7%D9%84%D8%A8%D8%B1%D8%A7%D9%85%D8%AC-%D9%88%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-r603/" rel="">تواصل البرامج والعمليات البرمجية عبر الشبكة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8/#%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%AE%D9%84%D9%81%D9%8A%D8%A9-Back-End" 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/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/javascript/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B7%D9%88%D9%90%D9%91%D8%B1-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%AF%D9%8A%D8%AB%D8%A9-r541/" rel="">كيف تستخدم أدوات المطوِّر في المتصفحات الحديثة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-r572/" rel="">كيف تستخدم أدوات المطوِّر في المتصفحات الحديثة - جافاسكربت - أكاديمية حسوب (hsoub.com)</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1522</guid><pubDate>Sat, 16 Apr 2022 15:01:00 +0000</pubDate></item></channel></rss>
