<?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/13/?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>&#x647;&#x644; &#x623;&#x646;&#x62A; &#x645;&#x628;&#x631;&#x645;&#x62C; &#x645;&#x62E;&#x62A;&#x631;&#x642; Hacker &#x623;&#x645; &#x645;&#x635;&#x645;&#x651;&#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%B5%D9%85%D9%91%D9%85-designer-%D8%9F-r522/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_08/599da2b611365_main(16).png.b8ffd02ff833a2c738b0e29fe78e0416.png" /></p>

<p>
	قبل عشرين عامًا، كان المبرمج الجيّد هو ذلك الذي يكون قادرًا على أن يحشر تطبيقًا كاملًا في ملف بامتداد <code>.COM</code> وبحجم 64 كيلوبايت، أما من كان قادرًا على الإتيان بأفضل أداء مع معالج Intel 80386 الضعيف فكان يعدّ واحدًا من أساطين عالم البرمجة.
</p>

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

<p>
	فاليوم أصبحت الحواسيب رخيصة الثمن وأجور المبرمجين مرتفعة، ودخلنا في عصر جديد تسود فيه “عقلية المصمم Designer Mentality” حيث تكون مقروئية الشفرة البرمجية أهمّ بكثير من أدائها.
</p>

<h2 id="الأسعار-مقابل-المرتبات">
	الأسعار مقابل المرتّبات
</h2>

<p>
	انظر إلى هذا الرسم البياني.
</p>

<p style="text-align: center;">
	<img alt="pic-001.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24604" data-unique="8f61n2zjt" src="https://academy.hsoub.com/uploads/monthly_2017_08/pic-001.png.e9d6758a379fcae1a79c06d660321560.png"></p>

<p>
	<br>
	يمثّل هذا الرسم البياني مقارنة بين نوعين من التوجهات خلال العقدين الماضيين (1994-2014). ويمكنك أن تلاحظ أن التوجّه الأوّل في تضاؤل تدريجي حيث تصبح ذواكر الحواسيب وأقراص التخزين الصلبة أرخص ثمنًا مع تقدم الزمن.
</p>

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

<p>
	هذا يعني أنّ نفقات إنشاء موقع إلكتروني بلغة <a href="https://academy.hsoub.com/programming/php/" rel="">PHP</a> سنة 1994 أكثر بـ 1000 مرة من نفقات شراء الأجهزة سنة 2014، وأقلّ بثلاث مرات من نفقات المبرمجين، مع الأخذ بالاعتبار أنّنا نستخدم التكنولوجيا ذاتها، إذ لا نزال نستخدم نظام <a href="https://academy.hsoub.com/devops/linux/" rel="">Linux</a> مع خادوم <a href="https://academy.hsoub.com/devops/servers/web/apache/" rel="">Apache</a>.
</p>

<p>
	الفرق هنا أنّه في سنة 1994 إن كان تطبيقك يواجه مشاكل في الأداء بسبب محدودية الأجهزة، فإنّك ستدفع 35,000 دولار مقابل كل غيغابايت من الذاكرة العشوائية، أما في 2014 فستدفع 10$ فقط.
</p>

<p>
	في سنة 1994 كان توظيف المزيد من المبرمجين بهدف تحسين الشفرة البرمجية أو حتى إعادة كتابتها أفضل وأجدى من شراء أجهزة ومعدّات جديدة، أمّا في سنة 2014 فقد انعكست الأمور تمامًا، فقد أصبحت مضاعفة حجم الخادوم أرخص بمرتين (خصوصًا إن كان الخادوم عبارة عن <a href="https://academy.hsoub.com/tags/virtualization/#elSearch_main" rel="">سحابة افتراضية</a>) من أجور تحسين الشفرة البرمجية.
</p>

<p>
	في سنة 1994 كان أفضل المبرمجين والمهندسين هم أولئك الذين يمتلكون “عقلية المخترق” أما في 2014 فالتقدير أصبح من نصيب كل من يملك “عقلية المصمم”.
</p>

<h2 id="عقلية-المخترق">
	عقلية المخترق
</h2>

<p>
	لو سألت صاحب عقلية المخترق عن رأيه في دالة توليد متسلسلة فابيوناتشي هذه والمكتوبة بلغة <a href="https://academy.hsoub.com/programming/java/" rel="">Java</a> لأجابك بأنّها “شفرة أنيقة” (هل تظنّ ذلك؟):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4289_7" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> f</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> n</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> n</span><span class="pun">&gt;</span><span class="lit">2</span><span class="pun">?</span><span class="pln">f</span><span class="pun">(</span><span class="pln">n</span><span class="pun">-</span><span class="lit">1</span><span class="pun">)+</span><span class="pln">f</span><span class="pun">(</span><span class="pln">n</span><span class="pun">-</span><span class="lit">2</span><span class="pun">):</span><span class="pln">n</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	عادة ما يتّصف المخترق الجيّد بالصفات التالية:
</p>

<ul>
<li>
		يستخدم جميع الخصائص المعروفة - وغير المعروفة - في لغة البرمجة التي يستخدمها.
	</li>
	<li>
		الناس عنده صنفان: مخترق ومبتدئ، وهو يكتب الشفرات للمخترقين فقط.
	</li>
	<li>
		يشعر بالملل والإحباط من اتباع القواعد والمعايير.
	</li>
	<li>
		لا يكتب اختبارات الوحدة Unit tests فالمبرمجون الثانويون سيقومون بهذا الأمر لاحقًا.
	</li>
	<li>
		يستمتع بأداء المهام الصعبة، فهكذا تظهر موهبته للعلن.
	</li>
	<li>
		يفضّل استقاء وظائف التطبيق من النقاشات الجانبية على تنفيذ ما يرد في مستند المواصفات Specifications، فذلك أكثر متعة.
	</li>
	<li>
		لا يتحمّل رؤية شخص يجري التعديلات على الشفرة التي كتبها.
	</li>
	<li>
		يفضّل أن يكرّس جهده في مشروع واحد فقط.
	</li>
</ul>
<p>
	المخترق شخص موهوب، ويرغب في التعبير عن هذه الموهبة في البرامج التي يكتبها، ويستمتع بهذا الأمر ويقوم به غالبًا بدافع المتعة لا أكثر. يمكن القول إنّه مرتبط بالشفرة التي يكتبها ولا يمكنه تخيّل حياة سعيدة بعد الانفصال عنها، ويشعر المخترق بأنّ الشفرة ملكه وحده ولا يستطيع التفكير بالأمر من منظور آخر.
</p>

<p>
	وعندما أتوجه بالسؤال التالي إلى أحد أصدقائي المخترقين: “من سيفهم العمل الذي ستؤدّيه هذه الشفرة؟” يكون الجواب الذي أسمعه بصورة شبه دائمة: “سيسألونني!” - عادة ما ترافق الإجابة نبرة استعلاء مصحوبة بابتسامة صادقة.
</p>

<h2 id="عقلية-المصمم">
	عقلية المصمّم
</h2>

<p>
	أما صاحب عقلية المصمّم فسيعيد ترتيب الشفرة السابقة لجعلها سهلة القراءة، وستكون “الشفرة الأنيقة” في نظره بالصورة التالية (ما رأيك أنت؟):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4289_9" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> fibo</span><span class="pun">(</span><span class="pln">final </span><span class="kwd">int</span><span class="pln"> pos</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  final </span><span class="kwd">int</span><span class="pln"> num</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">pos </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    num </span><span class="pun">=</span><span class="pln"> fibo</span><span class="pun">(</span><span class="pln">pos </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> fibo</span><span class="pun">(</span><span class="pln">pos </span><span class="pun">-</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    num </span><span class="pun">=</span><span class="pln"> pos</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"> num</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أعتقد أن المصمّم الجيّد يمتاز بالصفات التالية:
</p>

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

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

<h2 id="المستقبل">
	المستقبل
</h2>

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

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

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

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

<p>
	ترجمة - وبتصرّف - للمقال <a href="http://www.yegor256.com/2014/10/26/hacker-vs-programmer-mentality.html" rel="external nofollow">Are You a Hacker or a Designer?</a> لصاحبه Yegor Bugayenko.<br>
	حقوق الصورة البارزة محفوظة لـ <a href="http://www.freepik.com" rel="external nofollow">Freepik</a>
</p>
]]></description><guid isPermaLink="false">522</guid><pubDate>Wed, 23 Aug 2017 15:43:53 +0000</pubDate></item><item><title>&#x62E;&#x637;&#x648;&#x627;&#x62A; &#x623;&#x633;&#x627;&#x633;&#x64A;&#x651;&#x629; &#x644;&#x62A;&#x62D;&#x633;&#x64A;&#x646; &#x623;&#x62F;&#x627;&#x621; &#x627;&#x644;&#x645;&#x648;&#x627;&#x642;&#x639;</title><link>https://academy.hsoub.com/programming/general/%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D9%91%D8%A9-%D9%84%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D8%A3%D8%AF%D8%A7%D8%A1-%D8%A7%D9%84%D9%85%D9%88%D8%A7%D9%82%D8%B9-r519/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_08/main.png.8fa275f0c2913b340f7a873f2c98f85b.png" /></p>

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

<p>
	يشرح هذا المقال خطوات بسيطة يمكن أن يؤدّي تطبيقها - إلى جانب<a href="https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B8%D9%91%D9%85-%D8%B4%D9%81%D8%B1%D8%A9-css-%D9%84%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A3%D9%81%D8%B6%D9%84-%D9%88%D8%A3%D8%AF%D8%A7%D8%A1-%D8%A3%D8%AD%D8%B3%D9%86-r518/" rel=""> تنظيم شفرة CSS</a> - إلى تحسّن ملحوظ في أداء الموقع.
</p>

<h2 id="تصغير-الملفات-وضغطها">
	تصغير الملفات وضغطها
</h2>

<p>
	تعدّ إزالة الشفرة المتكررة وغير الضرروية من أبسط الطرق وأفضلها في تقليل حجم ملف CSS، ولكن هناك بعض الطرق الأخرى. تتمثّل إحدى هذه الطرق في تصغير minify وضغط ملفات <a href="https://academy.hsoub.com/programming/html5/" rel="">HTML</a> و CSS و <a href="https://academy.hsoub.com/programming/javascript/" rel="">JavaScript</a>. كذلك يمكن ضغط الصور وإزالة التعليقات و مواصفات الألوان Color Profiles غير الضرورية.
</p>

<h3 id="آلية-gzip-للضغط">
	آلية gzip للضغط
</h3>

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

<p>
	ليست تهيئة gzip بالأمر الصعب، وقد أبلى فريق <a href="https://html5boilerplate.com/" rel="external nofollow">HTML5 Boilerplate</a> بلاءً حسنًا في هذا المجال. ولضغط الملفات بآلية gzip ستحتاج إلى إضافة ملف <code>.htaccess</code> إلى المجلد الرئيسي في خادوم الويب ثم تدرج في هذا الملف أنواع الملفات التي ترغب في ضغطها. لا تنسَ إضافة النقطة إلى بداية اسم الملف، لأنّ هذا الملف هو من الملفات المخفية.
</p>

<p>
	يمكنك أن تجد في إعدادات خادوم Apache في HTML5 Boilerplate <a href="https://github.com/h5bp/server-configs-apache/blob/master/src/web_performance/compression.conf" rel="external nofollow">أنواع الملفات التي يُنصح بضغطها</a>، ولا بأس بالتذكير مرة أخرى أنّ شفرة ضغط هذه الملفات يجب أن تكون في ملف <code>.htaccess</code> في المجلد الرئيسي لخادوم الويب. وجدير بالذكر أن هذا الملف لا يعمل إلا مع خواديم <a href="https://academy.hsoub.com/tags/apache/#elSearch_main" rel="">Apache</a> والتي تتطلب تفعيل الوحدات التالية.
</p>

<ul>
<li>
		<code>mod_setenvif.c</code>
	</li>
	<li>
		<code>mod_headers.c</code>
	</li>
	<li>
		<code>mod_deflate.c</code>
	</li>
	<li>
		<code>mod_filter.c</code>
	</li>
	<li>
		<code>mod_expires.c</code>
	</li>
	<li>
		<code>mod_rewrite.c</code>
	</li>
</ul>
<p>
	لا تقلق إن وجدت صعوبة في هذا الأمر، فهناك بعض الخواديم التي تهيّئ لك هذه الأمور نيابة عنك، فبطبيعة الحال، ضغط الملفات وتصغير حجمها يكون دائمًا في مصلحة خادوم الويب.
</p>

<p>
	<strong>قياس نسبة الضغط</strong>
</p>

<p>
	تقدّم أداة الفحص Inspector في متصفح Google Chrome عددًا كبيرًا من المعلومات حول أداء الصفحة، ويمكن الوصول إليها من خلال التبويب Network. إضافة إلى ذلك، هناك عدد من المواقع الإلكترونية التي تساعد على معرفة ما إذا كانت خاصية الضغط gzip مفعّلة أم لا.
</p>

<p style="text-align: center;">
	<img alt="01_chrome_inspector.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24486" data-unique="dsi7bumr2" src="https://academy.hsoub.com/uploads/monthly_2017_08/01_chrome_inspector.png.706a1a1f9fd543651c1b3e4d432ff07a.png"></p>

<p>
	في تبويب Network يتم التعرّف على جميع الملفات المحمّلة بواسطة المتصفح وعرض أحجام تلك الملفات والمدة التي استغرقتها عملية التحميل. لاحظ كيف أن ضغط الملفات قد قلّل من حجمها بنسبة 60% تقريبًا.
</p>

<p style="text-align: center;">
	<img alt="02_chrome_inspector.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24487" data-unique="qk1bhl2h2" src="https://academy.hsoub.com/uploads/monthly_2017_08/02_chrome_inspector.png.34ec5ccaac13ca417eff0f2b72d3917d.png"></p>

<p>
	يمكن التعرّف على أنواع وسائل الضغط التي يدعمها المتصفح من خلال اختيار أحد الملفات. في الصورة أعلاه نلاحظ أنّ المتصفح يدعم gzip، deflate و sdch كما هو مبيّن في ترويسة الطلب المرسل من المتصفح.
</p>

<p>
	أما ترويسة Header الإجابة الواردة من الخادوم فتبيّن أن الملف مضغوط بواسطة gzip.
</p>

<h3 id="ضغط-الصور">
	ضغط الصور
</h3>

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

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

<p>
	تتوفّر العديد من الأدوات التي تساعد على ضغط الصور، من أفضلها <a href="http://imageoptim.com/" rel="external nofollow">ImageOptim</a> لنظام Mac و <a href="http://pnggauntlet.com/" rel="external nofollow">PNGGauntlet</a> لنظام Window، و <a href="https://trimage.org/" rel="external nofollow">Trimage</a> لنظام لينكس. تقوم هذه الخدمات بضغط صيغ الصور الأكثر شيوعًا مثل JPG و PNG.
</p>

<p style="text-align: center;">
	<strong>نموذج لضغط الصور</strong>
</p>

<p style="text-align: center;">
	<em>غير مضغوطة، 455kb</em>
</p>

<p style="text-align: center;">
	<img alt="03_not_compressed.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="24488" data-unique="mokg25mkf" src="https://academy.hsoub.com/uploads/monthly_2017_08/03_not_compressed.jpg.a53d36dda83f6d936032c5a8b448dc73.jpg"></p>

<p style="text-align: center;">
	<em>مضغوطة، 401kb</em>
</p>

<p style="text-align: center;">
	<img alt="04_compressed.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="24489" data-unique="q7dgw8c67" src="https://academy.hsoub.com/uploads/monthly_2017_08/04_compressed.jpg.6631c1c39c4a6e11dd35e09d15d6b762.jpg"></p>

<p style="text-align: center;">
	باستخدام ImageOptim فإنّ حجم الصورة أعلاه قد انخفض بمقدار 14% دون المساس بدقّة الصورة أو جودتها.
</p>

<p style="text-align: center;">
	<img alt="05_ImageOptim.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24490" data-unique="u4jr32qja" src="https://academy.hsoub.com/uploads/monthly_2017_08/05_ImageOptim.png.465a505f9621b912596b35033e3a94ce.png"></p>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6172_20" style="">
<span class="pln">    </span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"ocean.jpg"</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"440"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"660"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"Oceanview"</span><span class="tag">&gt;</span></pre>

<h2 id="تقليل-طلبات-http">
	تقليل طلبات HTTP
</h2>

<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>

<h3 id="دمج-الملفات-المتشابهة">
	دمج الملفات المتشابهة
</h3>

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

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6172_8" style="">
<span class="pln">    </span><span class="com">&lt;!-- سيء --&gt;</span><span class="pln">
    </span><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"css/reset.css"</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"css/base.css"</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"css/site.css"</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="tag">&gt;</span><span class="pln">

    </span><span class="com">&lt;!-- جيد --&gt;</span><span class="pln">
    </span><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"css/styles.css"</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="tag">&gt;</span></pre>

<p>
	يجب تحميل ملفات CSS في <strong>بداية</strong> صفحة الوِب ضمن الوسم <code>head</code>، أما ملفات JavaScript فيجب تحميلها في <strong>نهاية</strong> الصفحة ضمن الوسم <code>body</code>. والسبب هو أنّه يمكن استكمال تحميل ملفات CSS أثناء تحميل بقية أجزاء الصفحة، في حين أنّه لا يمكن تصيير ملفات JavaScript متعددة في نفس الوقت، لذا فإن هذه الملفات تمنع تحميل بقية عناصر الصفحة. يجب الانتباه هنا إلى ملفات JavaScript تُحمّل لا تزامنيًا Asynchronously بعد اكتمال تصيير الصفحة، وكذلك يجب الانتباه إلى أن JavaScript قد تكون مطلوبة في تصيير عناصر الصفحة كما هو الحال عند اسخدام HTML5 shiv.
</p>

<h3 id="شرائح-الصور-image-sprites">
	شرائح الصور Image Sprites
</h3>

<p>
	المقصود بشرائح الصور في CSS هو استخدام صورة خلفية واحدة في مجموعة من العناصر، والهدف هنا هو تقليل عدد طلبات HTTP الناشئة من استخدام مجموعة من الصور.
</p>

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

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

<p style="text-align: center;">
	<img alt="06_icons_sprite.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24491" data-unique="7r54pg22b" src="https://academy.hsoub.com/uploads/monthly_2017_08/06_icons_sprite.png.d1639e42189eeb18cd2cb06af22bd428.png"></p>

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

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

<p style="text-align: left;">
	<strong><em>HTML</em></strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6172_10" style="">
<span class="pln">    </span><span class="tag">&lt;ul&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"bold"</span><span class="tag">&gt;</span><span class="pln">Bold Text</span><span class="tag">&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"italic"</span><span class="tag">&gt;</span><span class="pln">Italicize Text</span><span class="tag">&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"underline"</span><span class="tag">&gt;</span><span class="pln">Underline Text</span><span class="tag">&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"size"</span><span class="tag">&gt;</span><span class="pln">Size Text</span><span class="tag">&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"bullet"</span><span class="tag">&gt;</span><span class="pln">Bullet Text</span><span class="tag">&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"number"</span><span class="tag">&gt;</span><span class="pln">Number Text</span><span class="tag">&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"quote"</span><span class="tag">&gt;</span><span class="pln">Quote Text</span><span class="tag">&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"left"</span><span class="tag">&gt;</span><span class="pln">Left Align Text</span><span class="tag">&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"center"</span><span class="tag">&gt;</span><span class="pln">Center Align Text</span><span class="tag">&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
      </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"right"</span><span class="tag">&gt;</span><span class="pln">Right Align Text</span><span class="tag">&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
    </span><span class="tag">&lt;/ul&gt;</span></pre>

<p style="text-align: left;">
	<strong><em>CSS</em></strong>
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6172_12" style="">
<span class="pln">    ul </span><span class="pun">{</span><span class="pln">
      margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
      padding</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">
    li </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
      list</span><span class="pun">-</span><span class="pln">style</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
      margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    li a </span><span class="pun">{</span><span class="pln">
      background</span><span class="pun">:</span><span class="pln"> linear</span><span class="pun">-</span><span class="pln">gradient</span><span class="pun">(#</span><span class="pln">fff</span><span class="pun">,</span><span class="pln"> </span><span class="com">#eee);</span><span class="pln">
      border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid </span><span class="com">#ccc;</span><span class="pln">
      border</span><span class="pun">-</span><span class="pln">radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3px</span><span class="pun">;</span><span class="pln">
      display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="pln">
      padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3px</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    li a</span><span class="pun">:</span><span class="pln">hover </span><span class="pun">{</span><span class="pln">
      border</span><span class="pun">-</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#999;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    li span </span><span class="pun">{</span><span class="pln">
      background</span><span class="pun">:</span><span class="pln"> url</span><span class="pun">(</span><span class="str">"sprite.png"</span><span class="pun">)</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="kwd">no</span><span class="pun">-</span><span class="pln">repeat</span><span class="pun">;</span><span class="pln">
      color</span><span class="pun">:</span><span class="pln"> transparent</span><span class="pun">;</span><span class="pln">
      display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="pln">
      font</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">/</span><span class="lit">0</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">
      height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">16px</span><span class="pun">;</span><span class="pln">
      width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">16px</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">italic </span><span class="pun">{</span><span class="pln">
      background</span><span class="pun">-</span><span class="pln">position</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">16px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">underline </span><span class="pun">{</span><span class="pln">
      background</span><span class="pun">-</span><span class="pln">position</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">32px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">size </span><span class="pun">{</span><span class="pln">
      background</span><span class="pun">-</span><span class="pln">position</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">48px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">bullet </span><span class="pun">{</span><span class="pln">
      background</span><span class="pun">-</span><span class="pln">position</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">64px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">number </span><span class="pun">{</span><span class="pln">
      background</span><span class="pun">-</span><span class="pln">position</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">80px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">quote </span><span class="pun">{</span><span class="pln">
      background</span><span class="pun">-</span><span class="pln">position</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">96px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">left </span><span class="pun">{</span><span class="pln">
      background</span><span class="pun">-</span><span class="pln">position</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">112px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">center </span><span class="pun">{</span><span class="pln">
      background</span><span class="pun">-</span><span class="pln">position</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">128px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">right </span><span class="pun">{</span><span class="pln">
      background</span><span class="pun">-</span><span class="pln">position</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">144px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span></pre>

<p style="text-align: center;">
	<a href="http://codepen.io/shayhowe/pen/gblxy" rel="external nofollow">(تجربة حيّة)</a>
</p>

<h3 id="معرف-الموارد-الموحد-uri-الخاص-ببيانات-الصورة">
	معرّف الموارد الموحّد URI الخاص ببيانات الصورة
</h3>

<p>
	إضافة إلى استخدام شرائح الصور، يمكن الاستفادة من <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-encoding%D8%8C-%D8%A7%D9%84%D8%AA%D8%B9%D9%85%D9%8A%D8%A9-encryption%D8%8C-%D8%A7%D9%84%D8%AA%D8%AC%D8%B2%D8%A6%D8%A9-hashing-%D9%88%D8%A7%D9%84%D8%AA%D8%B4%D9%88%D9%8A%D8%B4-obfuscation%D8%9F-r308" rel="">البيانات المُرمَّزة</a> Encoded للصورة وتضمينها مباشرة في HTML و CSS وذلك من خلال معرّف الموارد الموحّد الخاص بالبيانات Data URI، وبهذا لن يُرسَل أي طلب HTTP إلى الخادوم. هذه الطريقة مفيدة للصور الصغيرة والتي لا تكون عرضة للتغيير، وعندما يكون بالإمكان نقل ملفات HTML و CSS إلى ذاكرة التخبئة Cach. ولكن لا يخلو الأمر من مشاكل، إذ يصعب أحيانا تبديل هذه المعرّفات ومتابعتها وقد تحتاج إلى توليد المعرّف مرة أخرى، إضافة إلى أنّها لا تعمل مع المتصفحات القديمة وخصوصًا Internet Explorer 7 وما قبله.
</p>

<p>
	إن كان بالإمكان تقليل عدد طلبات HTTP باستخدام هذه الطريقة، وإن كان بالإمكان تخزين ملفات HTML و CSS في ذاكرة التخبئة فإن الفوائد التي ستجينها باستخدام هذه الطريقة تفوق المشاكل المترتبة عنها. هناك عدد من الأدوات التي تساعد في توليد معرّف البيانات مثل <a href="http://websemantics.co.uk/online_tools/image_to_data_uri_convertor/" rel="external nofollow">هذا المحوّل</a> وأداة <a href="http://www.patternify.com/" rel="external nofollow">Patternify</a>. ومع ذلك تأكّد دائمًا من أنّ حجم البيانات في معرّف البيانات الخاصّ بالصورة أقل حجمًا من ملفّ الصورة الأصلية.
</p>

<p style="text-align: left;">
	<strong><em>HTML</em></strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6172_14" style="">
<span class="pln">    </span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">"100"</span><span class="pln"> </span><span class="atn">width</span><span class="pun">=</span><span class="atv">"660"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"Rigged Pattern"</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAPUlEQVQYV2NkQAO6m73+X/bdxogujiIAU4RNMVwhuiQ6H6wQl3XI4oy4FMHcCJPHcDS6J2A2EqUQpJhohQAyIyYy0nBAGgAAAABJRU5ErkJggg=="</span><span class="tag">&gt;</span></pre>

<p style="text-align: left;">
	<strong><em>CSS</em></strong>
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6172_16" style="">
<span class="pln">    div </span><span class="pun">{</span><span class="pln">
      background</span><span class="pun">:</span><span class="pln"> url</span><span class="pun">(</span><span class="str">"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAPUlEQVQYV2NkQAO6m73+X/bdxogujiIAU4RNMVwhuiQ6H6wQl3XI4oy4FMHcCJPHcDS6J2A2EqUQpJhohQAyIyYy0nBAGgAAAABJRU5ErkJggg=="</span><span class="pun">)</span><span class="pln"> repeat</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span></pre>

<p style="text-align: center;">
	<a href="http://codepen.io/shayhowe/pen/znciu" rel="external nofollow">(تجربة حيّة)</a>
</p>

<h2 id="خزن-الملفات-الشائعة-في-ذاكرة-التخبئة">
	خزّن الملفات الشائعة في ذاكرة التخبئة
</h2>

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

<p>
	وكما هو الحال مع ضغط الملفات، فإنّ تعيين مدّة بقاء الملفات في ذاكرة التخبئة يكون من خلال ملف <code>.htaccess</code>. ومرة أخرى فقد أعدّ فريق HTML5 Boilerplate <a href="https://github.com/h5bp/server-configs-apache/blob/master/src/web_performance/expires_headers.conf" rel="external nofollow">ملفًّا خاصًّا</a> لتعيين تاريخ انتهاء صلاحية الملفات في ذاكرة التخبئة وذلك في إعدادات خادوم Apache الخاصّ بهم.
</p>

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

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6172_18" style="">
<span class="pln">    </span><span class="typ">ExpiresByType</span><span class="pln"> text</span><span class="pun">/</span><span class="pln">css </span><span class="str">"access plus 1 year"</span><span class="pln">
    </span><span class="typ">ExpiresByType</span><span class="pln"> application</span><span class="pun">/</span><span class="pln">javascript </span><span class="str">"access plus 1 year"</span></pre>

<p>
	إن كانت ملفات CSS و JavaScript تتغيّر في كل أسبوع ولا يُتحكَّم في إصداراتها باستخدام ملفات منفصلة فمن الأفضل تغيير قيمة <code>"access plus 1 year"</code> إلى <code>"access plus 1 week"</code>. ويمكن مراجعة <a href="http://httpd.apache.org/docs/current/mod/mod_expires.html" rel="external nofollow">صفحة صيغة <code>mod_expires</code></a> للتعرّف على القيم المتاحة.
</p>

<p>
	ترجمة - وبتصرّف - للمقال <a href="http://learn.shayhowe.com/advanced-html-css/performance-organization" rel="external nofollow">Performance &amp; Organization</a> لصاحبه Shay Howe.
</p>

<p>
	حقوق الصورة البارزة محفوظة لـ <a href="http://www.freepik.com/free-vector/web-design-background_1015293.htm" rel="external nofollow">Freepik</a>
</p>
]]></description><guid isPermaLink="false">519</guid><pubDate>Fri, 11 Aug 2017 15:09:15 +0000</pubDate></item><item><title>&#x642;&#x644;&#x628; &#x627;&#x62A;&#x651;&#x62C;&#x627;&#x647; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x644;&#x62A;&#x64F;&#x635;&#x628;&#x62D; &#x645;&#x646; &#x627;&#x644;&#x64A;&#x645;&#x64A;&#x646; &#x625;&#x644;&#x649; &#x627;&#x644;&#x64A;&#x633;&#x627;&#x631; RTL &#x2013; &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x62B;&#x627;&#x646;&#x64A;</title><link>https://academy.hsoub.com/programming/general/%D9%82%D9%84%D8%A8-%D8%A7%D8%AA%D9%91%D8%AC%D8%A7%D9%87-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D8%AA%D9%8F%D8%B5%D8%A8%D8%AD-%D9%85%D9%86-%D8%A7%D9%84%D9%8A%D9%85%D9%8A%D9%86-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%8A%D8%B3%D8%A7%D8%B1-rtl-%E2%80%93-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r420/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_02/rtl.png.719c5c834daaa578baa44415317ca177.png" /></p>

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

<p style="text-align: center;">
	<img alt="rtl.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21417" data-unique="i1zv2rh4d" src="https://academy.hsoub.com/uploads/monthly_2017_02/rtl.png.3f8fe3f6f976a884619d6bf08903160c.png" style=""></p>

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

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allowfullscreen="true" frameborder="0" height="270" src="https://www.youtube.com/embed/3qQeCPl3cjk?feature=oembed" width="480"></iframe>
	</div>
</div>

<p>
	 
</p>

<p>
	سنكمل حيث انتهينا في درسنا السابق، وحان الوقت الآن لنتعمّق في بعض المواضيع المتقدمة المتعلقة بتطوير واجهات من اليمين إلى اليسار. <a href="https://academy.hsoub.com/programming/general/%D9%82%D9%84%D8%A8-%D8%A7%D8%AA%D9%91%D8%AC%D8%A7%D9%87-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D8%AA%D9%8F%D8%B5%D8%A8%D8%AD-%D9%85%D9%86-%D8%A7%D9%84%D9%8A%D9%85%D9%8A%D9%86-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%8A%D8%B3%D8%A7%D8%B1-rtl-%E2%80%93-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r419/" rel="">شرحنا في الدرس الأول الأساسيات</a>، وسنشرح هنا بعض الخاصيات المُحدَثَة التي أتت حديثًا على الويب والتي ستعطينا فكرةً عن مستقبل الويب.
</p>

<h2 id="التقنيات-الحديثة">
	التقنيات الحديثة
</h2>

<p>
	الأساس الذي تستند عليه الواجهات ذات الاتجاه من اليمين إلى اليسار (RTL) هو خاصيات CSS، وهذه الخاصيات تتطور مع الوقت كما هو حال بقية مكوّنات الويب.<br>
	سأذكر هنا بعض خاصيات CSS التي يمكنك تجربتها على الفور في النسخ الحديثة من المتصفحات (من المحتمل أن تتغير هذه المعلومات بعد صدور تحديثات جديدة للمتصفحات).<br>
	محاذاة النص: تعودنا في الماضي على تحديد المحاذاة الأفقية للنص عبر <code>text-align: left</code> أو <code>right</code>؛ أما الآن، فلدينا القيمتان <code>start</code> و <code>end</code>. فعلى سبيل المثال <code>text-align: start</code> ستعطي نتيجةً مختلفةً بناءً عمّا إذا كان اتجاه المحتوى من اليمين إلى اليسار أم من اليسار إلى اليمين. القيمة <code>start</code> تُشير إلى اليسار في اتجاه LTR وإلى اليمين في اتجاه RTL، والعكس صحيح للقيمة <code>end</code>.<br>
	مثالٌ يستخدم <code>left|right</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1290_11">
<span class="com">#content {</span><span class="pln">
  text</span><span class="pun">-</span><span class="pln">align</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">:</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
html</span><span class="pun">[</span><span class="pln">dir</span><span class="pun">=</span><span class="str">"rtl"</span><span class="pun">]</span><span class="pln"> </span><span class="com">#content {</span><span class="pln">
  text</span><span class="pun">-</span><span class="pln">align</span><span class="pun">:</span><span class="pln"> right</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أما لو استعملنا <code>start|end</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1290_13">
<span class="com">#content {</span><span class="pln">
  text</span><span class="pun">-</span><span class="pln">align</span><span class="pun">:</span><span class="pln"> start</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لا حاجة إلى استعمال قاعدة خاصة باتجاه RTL باستخدامنا للقيمتين <code>start|end</code>.<br>
	دعم المتصفح: Chrome 1.0+‎، و Safari 3.1+‎، و Firefox 3.6+‎، وأندرويد، و iOS، غير مدعومة في متصفح Internet Explorer في الوقت الراهن.<br>
	خاصيات <code>padding</code> و <code>margin</code> و <code>border</code>: هنالك تحسيناتٌ أُدخِلَت على تلك الخاصيات.<br>
	أصبحت كل واحدة منها تقبل لاحقةً إضافيةً هي <code>‎-inline-start</code> أو <code>‎-inline-end</code>، فمثلًا يمكننا أن نكتب <code>padding-inline-end</code> أو <code>margin-inline-start</code>. تعطي هذه الكلمات المحجوزة الجديدة نفس تأثير <code>start</code> و <code>end</code> في محاذاة النص: الخاصية <code>padding-inline-start</code> تماثِل <code>padding-left</code> في اتجاه LTR وتماثِل <code>padding-right</code> في اتجاه RTL. أما <code>margin-inline-end</code> تعطي نفس تأثير <code>margin-right</code> في اتجاه LTR و <code>margin-left</code> في اتجاه RTL.<br>
	مثالٌ يستعمل <code>left|right</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1290_15">
<span class="com">#content {</span><span class="pln">
  padding</span><span class="pun">-</span><span class="pln">left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">12px</span><span class="pun">:</span><span class="pln">
  margin</span><span class="pun">-</span><span class="pln">right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
html</span><span class="pun">[</span><span class="pln">dir</span><span class="pun">=</span><span class="str">"rtl"</span><span class="pun">]</span><span class="pln"> </span><span class="com">#content {</span><span class="pln">
  padding</span><span class="pun">-</span><span class="pln">left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  padding</span><span class="pun">-</span><span class="pln">right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">12px</span><span class="pun">;</span><span class="pln">
  margin</span><span class="pun">-</span><span class="pln">left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
  margin</span><span class="pun">-</span><span class="pln">right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نفس المثال لكن باستعمال <code>start|end</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1290_17">
<span class="com">#content {</span><span class="pln">
  padding</span><span class="pun">-</span><span class="kwd">inline</span><span class="pun">-</span><span class="pln">start</span><span class="pun">:</span><span class="pln"> </span><span class="lit">12px</span><span class="pun">:</span><span class="pln">
  margin</span><span class="pun">-</span><span class="kwd">inline</span><span class="pun">-</span><span class="kwd">end</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أكرِّر أنَّه لا حاجة إلى قاعدة خاصة باتجاه RTL؛ فستصبح خاصية <span style="font-family:Arial,Helvetica,sans-serif;">margin-inline-end</span> وكأنها <span style="font-family:Courier New,Courier,monospace;">margin-right</span> في اتجاه LTR و <span style="font-family:Comic Sans MS,cursive;">margin-left</span> في اتجاه RTL.<br>
	دعم المتصفحات: Firefox 41+‎ فقط.<br>
	تحديد الموقع المطلق (absolute position) للعناصر: الخاصيتان <span style="font-family:Arial,Helvetica,sans-serif;">left</span> وright أساسيتان لتحديد الموقع المطلق، لكن قريبًا سترى استخدامًا لخاصياتٍ أذكى، ألا وهي offset-inline-startوoffset-inline-end.<br>
	يجدر بالذكر أنَّك تستطيع استعمال offset-block-startوoffset-block-end بدلًا من top و bottom على التوالي وبالترتيب.<br>
	مثالٌ يستعمل left|right:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1290_20">
<span class="com">#content {</span><span class="pln">
  position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span><span class="pln">
  left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5rem</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
html</span><span class="pun">[</span><span class="pln">dir</span><span class="pun">=</span><span class="str">"rtl"</span><span class="pun">]</span><span class="pln"> </span><span class="com">#content {</span><span class="pln">
  left</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">auto</span><span class="pun">;</span><span class="pln">
  right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5rem</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نفس المثال لكن باستعمال <code>start|end</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_1290_22">
<span class="com">#content {</span><span class="pln">
  offset</span><span class="pun">-</span><span class="kwd">inline</span><span class="pun">-</span><span class="pln">start</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5rem</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أكرر مرةً أخرى أنَّ مفهوم <code>start|end</code> وفَّر علينا كتابة بعض الشيفرات في ملف CSS.<br>
	دعم المتصفحات: Firefox 41+‎ فقط.<br>
	تحديد موقع العناصر باستخدام float: استعملنا <code>float: left</code> و <code>float: right</code> لوقتٍ طويل، لكنك ستتمكن قريبًا من استعمال <code>float: inline-start</code> و <code>float: inline-end</code>. خاصية <code>inline-start</code> ترتِّب عنصرك إلى اليسار في اتجاه LTR وإلى اليمين في اتجاه RTL.<br>
	مثالٌ يستعمل <code>left|right</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1290_24">
<span class="com">#content {</span><span class="pln">
  </span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
html</span><span class="pun">[</span><span class="pln">dir</span><span class="pun">=</span><span class="str">"rtl"</span><span class="pun">]</span><span class="pln"> </span><span class="com">#content {</span><span class="pln">
  </span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> right</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نفس المثال لكن باستعمال <code>start|end</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1290_26">
<span class="com">#content {</span><span class="pln">
  </span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">inline</span><span class="pun">-</span><span class="pln">start</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	دعم المتصفحات: Firefox 44.<br>
	Web Components (مكوِّنات الويب): وهي <a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components" rel="external nofollow">عناصر الواجهة الرسومية القابلة لإعادة الاستخدام</a>. إذا تعاملت مع web components من قبل فستعلم أنَّ أنماط CSS الخاصة بها موجودة ضمن شجرة DOM فرعية (shadow DOM)، لذا لن تتمكن افتراضيًا من الحصول على اتجاه الصفحة التي تستعمل تلك المكوِّنة عبر <code>html[dir="rtl"]</code>، لكن شجرة DOM الفرعية (shadow DOM) تتضمن محدِّدًا جديدًا اسمه <code>‎:host-context()‎</code> الذي تستطيع استخدامه لتحديد عنصر في شجرة DOM الأساسية (host DOM).<br>
	لنحاول تبسيط الأمر عبر مثال. لنقل أنَّ لديك عنصرًا داخل شجرة DOM فرعية اسمه back. كنت ستستخدم <code>html[dir="rtl"] .back {}‎</code> في حال لم تكن داخل شجرة DOM فرعية، لكنك لا تستطيع استخدام هذا المُحدِّد من داخل مكوِّن (component). المُحدِّد المكافئ للمحدِّد السابق الذي تستطيع استخدامه داخل مكوِّن هو:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1290_28">
<span class="pun">.</span><span class="pln">back</span><span class="pun">:</span><span class="pln">host</span><span class="pun">-</span><span class="pln">context</span><span class="pun">(</span><span class="pln">html</span><span class="pun">[</span><span class="pln">dir</span><span class="pun">=</span><span class="str">"rtl"</span><span class="pun">])</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	ليس من الواضح ما مدى دعم هذا النوع من المُحدِّدات، لكن يمكنك استخدام هذه <a href="https://github.com/webcomponents/webcomponentsjs" rel="external nofollow">الطريقة الالتفافية</a>.<br>
	لا ترغب باستخدام الطرق الالتفافية لكنك تريد أن تجرِّب اتجاه RTL في web component في المتصفحات التي تدعمها مثل فيرفكس (بعد تفعيل الراية <code>dom.webcomponents.enabled</code>) ومتصفح Google Chrome؟ يمكنك فعل ذلك عبر <a href="https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver" rel="external nofollow">Mutation Observers</a> بمراقبة الخاصية <code>document.documentElement.dir</code>. ستبدو شيفرة المراقبة شبيهةً بالمثال الآتي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1290_30">
<span class="kwd">var</span><span class="pln"> dirObserver </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MutationObserver</span><span class="pun">(</span><span class="pln">updateShadowDir</span><span class="pun">);</span><span class="pln">
dirObserver</span><span class="pun">.</span><span class="pln">observe</span><span class="pun">(</span><span class="pln">document</span><span class="pun">.</span><span class="pln">documentElement</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  attributeFilter</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'dir'</span><span class="pun">],</span><span class="pln">
  attributes</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	لا تنسَ أن تُهيّئ دالتك لأول مرة بعد تحميل الصفحة، بعد شيفرة المراقبة مباشرةً:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1290_32">
<span class="pln">updateShadowDir</span><span class="pun">();</span></pre>

<p>
	ستبدو دالة <code>updateShadowDir()‎</code> كالآتي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1290_34">
<span class="kwd">function</span><span class="pln"> updateShadowDir</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"> internal </span><span class="pun">=</span><span class="pln"> myInnerElement</span><span class="pun">.</span><span class="pln">shadowRoot</span><span class="pun">.</span><span class="pln">firstElementChild</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">document</span><span class="pun">.</span><span class="pln">documentElement</span><span class="pun">.</span><span class="pln">dir </span><span class="pun">===</span><span class="pln"> </span><span class="str">'rtl'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    internal</span><span class="pun">.</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">'dir'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'rtl'</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">
    internal</span><span class="pun">.</span><span class="pln">removeAttribute</span><span class="pun">(</span><span class="str">'dir'</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	كل ذلك عبر JavaScript. سيملك أول «ابن» (first child) في المكوِّنة خاصية <code>dir</code> قابلة للتغيير، وستعتمد أنماط CSS عليه كمُحدِّد بدلًا من عنصر <code>html</code>. ولنقل أنَّ ذاك العنصر هو <code>span</code>، لذا سيكون مُحدِّدك شبيهًا بما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1290_36">
<span class="pln">span</span><span class="pun">[</span><span class="pln">dir</span><span class="pun">=</span><span class="str">"rtl"</span><span class="pun">]</span><span class="pln"> rest</span><span class="pun">-</span><span class="pln">of</span><span class="pun">-</span><span class="pln">the</span><span class="pun">-</span><span class="pln">selectors</span><span class="pun">-</span><span class="pln">chain </span><span class="pun">{</span><span class="pln"> </span><span class="pun">…</span><span class="pln"> </span><span class="pun">}</span></pre>

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

<h2 id="مستقبل-اتجاه-rtl-في-الويب">
	مستقبل اتجاه RTL في الويب
</h2>

<p>
	إعلام الخادوم باتجاه النص: في الوقت الراهن نفقد قيمة اتجاه الصفحة (أو اتجاه عناصر النموذج) عند إرسال نموذج يحتوي على حقول إدخال نصية. أتت الخواديم بطرقٍ خاصةٍ بها لكي تُحدِّد اتجاه النص الُمرسَل إليها.<br>
	لحل هذه المشكلة ولإضافة معلومات حول اتجاه النص المُرسَل، ابتكرت W3C خاصيةً جديدةً ووضعتها في مواصفة نماذج HTML5 اسمها <code>dirname</code>، التي ستُضيفها المتصفحات في المستقبل القريب.<br>
	وكما ذَكَرَ المعيار، «تضمين خاصية <code>dirname</code> في حقول النموذج يُفعِّل إرسال اتجاه العنصر، ويعطي اسم الحقل الذي يحتوي على هذه القيمة أثناء عملية الإرسال. إذا حُدِّدت هذه الخاصية، فيجب ألّا تكون قيمتها فارغةً».<br>
	بعبارة أخرى: إضافة هذه الخاصية إلى حقول <code>&lt;input&gt;</code> أو <code>&lt;textarea&gt;</code> يؤدي إلى تمرير اتجاهها مع معلومات GET أو POST التي ستُرسَل إلى الخادوم. لننظر إلى مثالٍ عملي. ليكن لدينا هذا النموذج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1290_38">
<span class="tag">&lt;form</span><span class="pln"> </span><span class="atn">action</span><span class="pun">=</span><span class="atv">"result.php"</span><span class="pln"> </span><span class="atn">method</span><span class="pun">=</span><span class="atv">"post"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"comment"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">dirname</span><span class="pun">=</span><span class="atv">"comment.dir"</span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">submit</span><span class="tag">&gt;</span><span class="pln">Send!</span><span class="tag">&lt;/button&gt;</span><span class="pln">
</span><span class="tag">&lt;/form&gt;</span></pre>

<p>
	ستحتوي عبارة POST التي ستُرسَل إلى الخادوم على حقلٍ اسمه <code>comment</code>، وحقلٍ آخر اسمه <code>comment.dir</code>. وإذا كتب المستخدم الكلمة «Hello» في الحقل النصي وأرسل النموذج، فستكون النتيجة هي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1290_40">
<span class="pln">comment</span><span class="pun">=</span><span class="typ">Hello</span><span class="pun">&amp;</span><span class="pln">comment</span><span class="pun">.</span><span class="pln">dir</span><span class="pun">=</span><span class="pln">ltr</span></pre>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1290_42">
<span class="pln">comment</span><span class="pun">=%</span><span class="pln">D9</span><span class="pun">%</span><span class="lit">85</span><span class="pun">%</span><span class="pln">D8</span><span class="pun">%</span><span class="pln">B1</span><span class="pun">%</span><span class="pln">D8</span><span class="pun">%</span><span class="pln">AD</span><span class="pun">%</span><span class="pln">D8</span><span class="pun">%</span><span class="pln">A8</span><span class="pun">%</span><span class="pln">D8</span><span class="pun">%</span><span class="pln">A7</span><span class="pun">&amp;</span><span class="pln">comment</span><span class="pun">.</span><span class="pln">dir</span><span class="pun">=</span><span class="pln">rtl</span></pre>

<p>
	<a href="http://www.w3.org/TR/html5/forms.html#submitting-element-directionality:-the-dirname-attribute" rel="external nofollow">يمكنك قراءة المواصفة من هنا.</a><br>
	ملاحظة: لكي تُعرَض المحارف العربية عرضًا صحيحًا في عناوين URL في متصفحك، فيجب أن تُرمَّز المحارف بترميز UTF-8، وكل حرف عربي يستعمل 4 محارف مفصولة فيما بينهما برمز %.<br>
	على سبيل المثال، لو كان لديك <a href="http://ar.wikipedia.org/wiki/%D9%86%D8%AC%D9%8A%D8%A8_%D9%85%D8%AD%D9%81%D9%88%D8%B8" rel="external nofollow">هذا الرابط</a>؛ فسيحوله متصفحك عندما تزوره إلى <a href="http://ar.wikipedia.org/wiki/%D9%86%D8%AC%D9%8A%D8%A8_%D9%85%D8%AD%D9%81%D9%88%D8%B8" rel="external nofollow">هذه الصّفحة</a>
</p>

<h2 id="طرق-أفضل-لكيفية-التعامل-مع-الخلفيات-والصور-في-rtl">
	طرق أفضل لكيفية التعامل مع الخلفيات والصور في RTL
</h2>

<p>
	هل سئمتَ من استخدام <code>transform: scaleX(-1)</code> لعكس صور الخلفية؟ قدّمَت W3C كلمةً محجوزةً جديدةً في CSS اسمها <code>rtlflip</code> التي تُستعمل كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1290_44">
<span class="pln">background</span><span class="pun">-</span><span class="pln">image</span><span class="pun">:</span><span class="pln"> url</span><span class="pun">(</span><span class="pln">backbutton</span><span class="pun">.</span><span class="pln">png</span><span class="pun">)</span><span class="pln"> rtlflip</span><span class="pun">;</span></pre>

<p>
	ستقلل عليك هذه الكلمة المحجوزة من عبء قلب جميع صورك عبر خاصية <code>transform: scaleX(-1)</code> يدويًا. من الممكن استعمالها أيضًا في قاعدة صور القوائم كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1290_46">
<span class="pln">list</span><span class="pun">-</span><span class="pln">style</span><span class="pun">-</span><span class="pln">image</span><span class="pun">:</span><span class="pln">url</span><span class="pun">(</span><span class="str">'sprite.png#xywh=10,30,60,20'</span><span class="pun">)</span><span class="pln"> rtlflip</span><span class="pun">;</span></pre>

<p>
	تقول صفحة المواصفة أيضًا أنَّ هذه الكلمة المحجوزة يمكن أن تستعمل في جميع الطرق الممكنة لتحديد الصور في CSS3. على سبيل المثال: <code>url</code> و <code>sprite</code> و <code>image-list</code> و <code>linear-gradient</code> و <code>radial-gradient</code>.
</p>

<h2 id="الواجهة-البرمجية-للتدويل">
	الواجهة البرمجية للتدويل
</h2>

<p>
	إليكم بعض الأجزاء غير المشهورة المتعلقة باتجاه RTL في الواجهة البرمجية للتدويل (Internationalization APIs) في JavaScript<br>
	تدعم الواجهة البرمجية للتدويل عددًا كبيرًا من اللغات مع مشتقاتها؛ فمثلًا لا تدعم هذه الواجهة البرمجية اللغة العربية فحسب، وإنما تدعم «العربية-مصر» و «العربية-تونس» وقائمة طويلة بالاشتقاقات الأخرى.<br>
	استخدام الأرقام العربية المشرقية بدلًا من الأرقام العربية الغربية: تُستخدم الأرقام العربية المشرقية (١٢٣) في بعض البلدان بدلًا من الأرقام العربية الغربية (123). تسمح لنا واجهة التدويل البرمجية بتحديد متى نريد إظهار ١٢٣ ومتى نظهر 123.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1290_48">
<span class="pln">console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intl</span><span class="pun">.</span><span class="typ">NumberFormat</span><span class="pun">(</span><span class="str">'ar-EG'</span><span class="pun">).</span><span class="pln">format</span><span class="pun">(</span><span class="lit">1234567890</span><span class="pun">));</span></pre>

<p>
	السطر السابق يقول أنَّنا نريد تنسيق الرقم 1234567890 بصيغة الأرقام التي تستعملها مصر (<code>ar-EG</code>). الناتج: ١٬٢٣٤٬٥٦٧٬٨٩٠
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1290_50">
<span class="pln">console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intl</span><span class="pun">.</span><span class="typ">NumberFormat</span><span class="pun">(</span><span class="str">'ar-TN'</span><span class="pun">).</span><span class="pln">format</span><span class="pun">(</span><span class="lit">1234567890</span><span class="pun">));</span></pre>

<p>
	نقول هنا أننا نريد إظهار الرقم بالصيغة المعتمدة في تونس؛ ولمّا كانت تونس تستعمل الأرقام العربية الغربية، فسيكون الناتج: 1234567890<br>
	إظهار التواريخ بالتقويم الهجري بدلًا من الميلادي: هناك صفحة <a href="http://google.com/ramadan" rel="external nofollow">google.com/ramadan</a> خاصة بإظهار معلومات حول شهر رمضان. وأحد أهم المعلومات الموجودة هي رقم اليوم في الشهر الهجري (القمري). تستخدم Google طريقة التفافية للحصول على هذه المعلومات. لكنك تستطيع الحصول على نفس المعلومات عبر الواجهة البرمجية للتدويل بسطرٍ وحيد بدلًا من مكتبة JavaScript كاملة.<br>
	هذا مثال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1290_52">
<span class="pln">console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intl</span><span class="pun">.</span><span class="typ">DateTimeFormat</span><span class="pun">(</span><span class="str">"fr-FR-u-ca-islamicc"</span><span class="pun">).</span><span class="pln">format</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">()));</span></pre>

<p>
	السطر السابق يعني أنَّنا نريد أن يكون التاريخ الحالي بالتقويم الهجري وأن يُعرَض بالأرقام العربية الغربية (<code>fr-FR</code>). الناتج هو: 16/12/1436
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1290_54">
<span class="pln">console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Intl</span><span class="pun">.</span><span class="typ">DateTimeFormat</span><span class="pun">(</span><span class="str">"ar-SA-u-ca-islamicc"</span><span class="pun">).</span><span class="pln">format</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">()));</span></pre>

<p>
	نفس الأمر هنا، لكن التنسيق لمحليّة (locale) الخاصة بالسعودية التي تستعمل الأرقام العربية المشرقية. الناتج: ١٦‏/١٢‏/١٤٣٦
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	رأينا في هذا الدرس بعض التقنيات المتقدمة لدعم اتجاه RTL، وأخذنا فكرةً عن مستقبل دعم RTL من معايير الويب.<br>
	ترجمة -وبتصرّف- للمقال <a href="http://google.com/ramadan" rel="external nofollow">Building RTL-Aware Web Apps &amp; Websites: Part 2</a> لصاحبه أحمد نفزاوي
</p>
]]></description><guid isPermaLink="false">420</guid><pubDate>Wed, 26 Oct 2016 10:48:00 +0000</pubDate></item><item><title>&#x642;&#x644;&#x628; &#x627;&#x62A;&#x651;&#x62C;&#x627;&#x647; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x644;&#x62A;&#x64F;&#x635;&#x628;&#x62D; &#x645;&#x646; &#x627;&#x644;&#x64A;&#x645;&#x64A;&#x646; &#x625;&#x644;&#x649; &#x627;&#x644;&#x64A;&#x633;&#x627;&#x631; RTL &#x2013; &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x623;&#x648;&#x644;</title><link>https://academy.hsoub.com/programming/general/%D9%82%D9%84%D8%A8-%D8%A7%D8%AA%D9%91%D8%AC%D8%A7%D9%87-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%84%D8%AA%D9%8F%D8%B5%D8%A8%D8%AD-%D9%85%D9%86-%D8%A7%D9%84%D9%8A%D9%85%D9%8A%D9%86-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%8A%D8%B3%D8%A7%D8%B1-rtl-%E2%80%93-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r419/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_02/rtl.png.5f11b4175711353985d68306b0e5762b.png" /></p>
<p id="قلب-اتجاه-تطبيقات-الويب-لتصبح-من-اليمين-إلى-اليسار-rtl-الجزء-الأول">
	هذا هو الدرس الأول من درسين يشرحان لك كيف تطوِّر مواقع الويب ذات الاتجاه من اليمين إلى اليسار (RTL)، وهذا يعني جعل موقع الويب متوافقًا مع اللغات التي تُكتَب من اليمين إلى اليسار مثل العربية والفارسية والأردو.
</p>

<h2 id="ماذا-يعني-اتجاه-الكتابة-من-اليمين-إلى-اليسار">
	ماذا يعني اتجاه الكتابة من اليمين إلى اليسار؟
</h2>

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

<p style="text-align: center;">
	<img alt="rtl.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21416" data-unique="8zx1mcz33" style="" src="https://academy.hsoub.com/uploads/monthly_2017_02/rtl.png.2b88d5dd10296c27bfc0bfccc09368a7.png">
</p>

<p>
	مصطلح «اليمين-إلى-اليسار» (Right-to-Left) أو RTL اختصارًا، يُشير إلى أكثر من مجرد المخطوطة المستعملة للكتابة؛ حيث يُشير إلى جميع الأمور المتعلقة بتطوير مواقع وتطبيقات الويب لكي تظهر بشكل سليم عند استخدام اللغة العربية أو غيرها من اللغات التي تُكتَب من اليمين إلى اليسار.<br>
	قبل المتابعة، لنوضِّح بعض الالتباسات حول RTL.<br>
	أولًا، RTL لا تعني ترجمة النص إلى العربية: فالأمر أكثر من مجرد ترجمة واجهة موقعك إلى العربية، وإنما جعل كل جزء من الواجهة الرسومية ملائمًا لاتجاه RTL؛ وأنصحك أن تفعل ذلك بشكلٍ صحيح، فعدم إكمالك لدعم اتجاه RTL سيفقدك زوارك ومصداقيتك.<br>
	ثانيًا، اتجاه RTL لا يعني «قلب كل شيء»: لستُ متأكدًا إن أُصلِحتَ هذه العلة أم لا، لكن ضبط «المحلية» (locale) إلى العربية في واجهة Gnome سيؤدي إلى إظهار الوقت بالشكل «PM 33:12» بدلًا من «‏12:33‎ PM‏‏».<br>
	هذا ليس صحيحًا، نحن لا نذكر الوقت بالمقلوب بالعربية. أي أنَّ هنالك استثناءات وأشياء يجب الانتباه إليها مثل الأرقام، وسنشرح ذلك لاحقًا.<br>
	لماذا عليك أن تهتم بدعم موقعك لاتجاه RTL؟<br>
	ربما تطور مواقع عالمية بلغاتٍ مثل الإنكليزية أو الفرنسية، وأنت متخوفٌ من RTL وتحسبها صعبةً ومرعبةً وستُضيف كمًا كبيرًا من العمل على مشروعك. حسنًا، الأمر ليس كما تظن، فبعد أن تستوعب المبادئ الأساسية، فلن تحتاج إلا لبذل جهدٍ قليلٍ.<br>
	من البدهي أن تهتم –كمطور ويب عربي– بدعم الموقع التي تطوره للغة العربية (أو لبقية اللغات التي تُكتَب من اليمين إلى اليسار)؛ فلا حاجة لتذكيرك أنَّ هنالك أكثر من 410 مليون شخص حول العالم يتحدث لغةً تُكتَب من اليمين إلى اليسار (وهذا عددٌ ضخمٌ جدًا. لاحظ أنَّ الرقم التقديري السابق مبنيٌ على <a href="https://en.wikipedia.org/wiki/List_of_languages_by_number_of_native_speakers" rel="external nofollow">قائمة اللغات في ويكيبيديا</a>). أصبحت أغلبية الشركات تُضيف دعمًا للغات المكتوب من اليمين إلى اليسار في برمجياتها (مثل ويندوز، و iOS، وأندرويد) وكذلك الأمر للعديد من المواقع العالمية؛ لذا سيتوقع زوار موقعك مِمَن يتحدثون العربية (وغيرها من اللغات المكتوبة من اليمين إلى اليسار) أن يحقق موقعك هذه التوقعات بما يخص دعم RTL. فبدون هذا الدعم قد لا يتحول زوار موقعك إلى زوارٍ دائمين.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير واجهات المستخدم
		</p>

		<p class="banner-subtitle">
			ابدأ عملك الحر بتطوير واجهات المواقع والمتاجر الإلكترونية فور انتهائك من الدورة
		</p>

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

	<div class="banner-img">
		<img alt="دورة تطوير واجهات المستخدم" src="https://academy.hsoub.com/learn/assets/images/courses/front-end-web-development.png">
	</div>
</div>

<h2 id="نصائح-عامة-لدعم-اتجاه-rtl">
	نصائح عامة لدعم اتجاه RTL
</h2>

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

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

<p style="text-align: center;">
	<img alt="1-fxoscontactsapp-250x444.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21415" data-unique="hr749owmg" style="" src="https://academy.hsoub.com/uploads/monthly_2017_02/1-fxoscontactsapp-250x444.png.cfb847782e494859b5b720f2f8f47c01.png">
</p>

<ul>
	<li>
		لا تظن أنَّ مستخدمي RTL هم أشخاصٌ يستعملون أياديهم اليسرى. فأغلبية مَن يتحدث بالعربية يكتبها بيده اليمنى، كما هو الحال في بقية أنحاء العالم. لذا لا تقلب أيّ شيءٍ ليس متعلقًا بكيفية قراءة المستخدم لمحتوى الصفحة. مثالٌ على هذا هو شريط التمرير «أ-ي A-Z» (الموجود على يمين الصورة السابقة) في تطبيق «جهات الاتصال» في أغلبية الهواتف الذكية. هذا الشريط موضوعٌ على الجهة اليمنى لأنه من الأسهل استخدامه باليد اليمنى، لذا لا حاجة إلى قلب اتجاهه وجعله في الجزء الأيسر في نمط RTL.
	</li>
</ul>

<h2 id="كيفية-جعل-المحتوى-rtl">
	كيفية جعل المحتوى RTL
</h2>

<p>
	أول خطوة نحو جعل اتجاه صفحة الويب من اليمين إلى اليسار هي إضافة <code>dir="rtl"‎</code> إلى وسم <code>&lt;html&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7244_8"><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">dir</span><span class="pun">=</span><span class="atv">"rtl"</span><span class="tag">&gt;</span></pre>

<p>
	الخاصية <code>dir</code> هي اختصارٌ لكلمة «direction»، وضبط قيمتها إلى <code>rtl</code> تجعل نقطة البداية الأفقية لعناصر صفحة الويب من اليمين بدلًا من اليسار.<br>
	لكي تضع نمط CSS لعنصرٍ معيّن إذا كانت الصفحة RTL فقط:
</p>

<ol>
	<li>
		أنشِئ نسخةً من أيّة أنماط CSS اعتيادية التي ستُطبَّق على العنصر الهدف.
	</li>
	<li>
		أضف المُحدِّد <code>html[dir="rtl"]</code> قبل سلسلة المُحدِدات (selector chain).
	</li>
	<li>
		كلما وجدت خاصيةً أو قيمة تُمثِّل التموضع الأفقي للعنصر، فاستعمل القاعدة المُعاكسة لها. على سبيل المثال، إذا وجدتَ <code>float: left</code> فبدِّلها إلى <code>float: right</code>.<br>
		كمثالٍ عمليٍ على كلامنا السابق، إذا كان أحد أنماط CSS كالآتي:
	</li>
</ol>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6590_7"><span class="pun">.</span><span class="pln">someClass </span><span class="pun">{</span><span class="pln">
    text</span><span class="pun">-</span><span class="pln">align</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
    padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">10px</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    text</span><span class="pun">-</span><span class="pln">decoration</span><span class="pun">:</span><span class="pln"> underline</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	فسنأخذ نسخةً منه ونحدِّثها كالآتي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6590_9"><span class="pln">html</span><span class="pun">[</span><span class="pln">dir</span><span class="pun">=</span><span class="str">"rtl"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">someClass </span><span class="pun">{</span><span class="pln">
    text</span><span class="pun">-</span><span class="pln">align</span><span class="pun">:</span><span class="pln"> right</span><span class="pun">;</span><span class="pln">
    padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أننا حذفنا القاعدة <code>text-decoration: underline;‎</code>، فلسنا بحاجة إلى إعادة تعريف هذه القيمة لنسخة RTL لأنها لا تؤثر على اتجاه أي عنصر. وبالتالي ستُطبَّق القاعدة الأصلية.<br>
	هذا مثالٌ أكثر تفصيلًا. <a href="http://codepen.io/anefzaoui/pen/dYGKQZ" rel="external nofollow">يمكنك أن تجربه مباشرةً على متصفحك</a>.<br>
	شيفرة HTML:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6590_11"><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">dir</span><span class="pun">=</span><span class="atv">"ltr"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"button"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"directionSwitch"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"Switch LTR/RTL"</span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;hr/&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"boxOne"</span><span class="tag">&gt;&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"boxTwo"</span><span class="tag">&gt;&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	شيفرة CSS:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6590_13"><span class="pun">.</span><span class="pln">boxOne </span><span class="pun">{</span><span class="pln">
  width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">170px</span><span class="pun">;</span><span class="pln">
  height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">170px</span><span class="pun">;</span><span class="pln">
  background</span><span class="pun">-</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#0072C6;</span><span class="pln">
  margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">boxTwo </span><span class="pun">{</span><span class="pln">
  width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">120px</span><span class="pun">;</span><span class="pln">
  height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">120px</span><span class="pun">;</span><span class="pln">
  background</span><span class="pun">-</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#C3191E;</span><span class="pln">
  margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">70px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

html</span><span class="pun">[</span><span class="pln">dir</span><span class="pun">=</span><span class="str">"rtl"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">boxOne </span><span class="pun">{</span><span class="pln">
  margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">20px</span><span class="pln"> </span><span class="lit">0</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">

html</span><span class="pun">[</span><span class="pln">dir</span><span class="pun">=</span><span class="str">"rtl"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">boxTwo </span><span class="pun">{</span><span class="pln">
  margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">70px</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	شيفرة JavaScript:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6590_15"><span class="pln">document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">'directionSwitch'</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="kwd">function</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"> docDirection </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">documentElement</span><span class="pun">.</span><span class="pln">dir</span><span class="pun">;</span><span class="pln">  
  </span><span class="kwd">var</span><span class="pln"> isRTL </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">docDirection </span><span class="pun">===</span><span class="pln"> </span><span class="str">'rtl'</span><span class="pun">);</span><span class="pln">
  document</span><span class="pun">.</span><span class="pln">documentElement</span><span class="pun">.</span><span class="pln">dir </span><span class="pun">=</span><span class="pln"> isRTL </span><span class="pun">?</span><span class="pln"> </span><span class="str">'ltr'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'rtl'</span><span class="pun">;</span><span class="pln">

</span><span class="pun">});</span></pre>

<p>
	لن تكون الحالات العملية بهذه البساطة؛ فهنالك تطبيقاتٌ فيها عددٌ كبيرٌ جدًا من قواعد CSS ومن المحددات، ولديك عدِّة استراتيجيات يمكنك اتباعها. وهذه إحداها:
</p>

<ol>
	<li>
		انسخ القواعد واحذف ما ليس لازمًا: أولًا، انسخ محتوى صفحة الأنماط إلى ملفٍ آخر، وأضف <code>html[dir="rtl"]</code> إلى جميع القواعد، ثم احذف أيّة خاصيات لا تتعلق بالاتجاه الأفقي للعناصر. وسينتهي بك المطاف بملفٍ صغيرٍ هدفه هو التعامل مع اتجاه RTL فقط.
	</li>
	<li>
		اقلب الاتجاهات: عدِّل كل الخاصية التي تُشير إلى اليسار (left) في الملف الجديد إلى معاكسها: أي <code>padding-left</code> ستصبح <code>padding-right</code>، و <code>float: right</code> ستصبح <code>float: left</code> …إلخ. لاحظ أنَّه إذا كان عندك خاصية <code>padding-left</code> في الملف الأصلي ثم عدَّلتها إلى <code>padding-right</code> فستبقى الخاصية الأصلية <code>padding-left</code> مطبقةً. لذا عليك إضافة الخاصية <code>padding-left: unset</code> بالإضافة إلى خاصية <code>padding-right</code>، وإلا فسيُطبِّق المتصفح كلا القاعدتين: خاصية <code>padding-left</code> من ملف CSS الأصلي وخاصية <code>padding-right</code> من الملف المعدَّل لاتجاه RTL. والأمر مشابهٌ لبقية الخاصيات مثل <code>margin-left|right</code> و <code>border-left|right</code> …
	</li>
	<li>
		أعد لصق المحتويات في الملف الأصلي: بعد أن تنتهي من إكمال الخطوتين السابقتين، فالصق القواعد الجديدة في الملف الملف الأصلي بعد القواعد الأصلية. أفضِّل شخصيًا أن أضيف تعليقًا صغيرًا مثل <code>/* **** RTL Content **** */</code> لكي أستطيع التفريق بسهولة بين الأنماط الأصلية والأنماط المُعدَّلة لاتجاه RTL.
	</li>
</ol>

<h2 id="طريقة-أفضل-فصل-أنماط-rtl-و-ltr-عن-بعضهما">
	طريقة أفضل: فصل أنماط RTL و LTR عن بعضهما
</h2>

<p>
	قد تواجه في بعض الأحيان حالاتٍ غريبة التي يحدث فيها تضاربٌ بين الأنماط. وهذا يتضمن وراثة قيم بعض الخاصيات من خاصياتٍ أخرى، مما يعني أنَّك في بعض الأحيان لا تعرف تمامًا ما هي القاعدة التي عليك تجاوزها. وربما أضفتَ <code>margin-right</code> إلى قواعد RTL لكنك لستَ متأكدًا ما هي القيمة التي عليك ضبطها إلى خاصية <code>margin-left</code> الأصلية.<br>
	أرى أنَّه من المستحسن أن تتبع منهجية أخرى، والتي هي أفضل في الحالات العملية لكنها أطول بعض الشّيء. سنفصل الخاصيات التابعة لكل اتجاه (RTL و LTR) عن بعضها بعضًا تمامًا. هذا مثالٌ عنها: لنقل أنَّنا لدينا قاعدة تتضمن <code>‎.wrapper .boxContainer .fancyBox</code> كالآتية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6590_17"><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">.</span><span class="pln">boxContainer </span><span class="pun">.</span><span class="pln">fancyBox </span><span class="pun">{</span><span class="pln">
    text</span><span class="pun">-</span><span class="pln">align</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
    padding</span><span class="pun">-</span><span class="pln">left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
    text</span><span class="pun">-</span><span class="pln">decoration</span><span class="pun">:</span><span class="pln"> underline</span><span class="pun">;</span><span class="pln">
    color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#4A8CF7;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بدلًا من إضافة خاصيات أخرى لاتجاه RTL فيها <code>padding-left</code> و <code>padding-right</code>، فيمكنك أن تكتب:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6590_19"><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">.</span><span class="pln">boxContainer </span><span class="pun">.</span><span class="pln">fancyBox </span><span class="pun">{</span><span class="pln">
    text</span><span class="pun">-</span><span class="pln">decoration</span><span class="pun">:</span><span class="pln"> underline</span><span class="pun">;</span><span class="pln">
    color</span><span class="pun">:</span><span class="pln"> </span><span class="com">#4A8CF7;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

html</span><span class="pun">[</span><span class="pln">dir</span><span class="pun">=</span><span class="str">"ltr"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">.</span><span class="pln">boxContainer </span><span class="pun">.</span><span class="pln">fancyBox </span><span class="pun">{</span><span class="pln">
    text</span><span class="pun">-</span><span class="pln">align</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
    padding</span><span class="pun">-</span><span class="pln">left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

html</span><span class="pun">[</span><span class="pln">dir</span><span class="pun">=</span><span class="str">"rtl"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">.</span><span class="pln">boxContainer </span><span class="pun">.</span><span class="pln">fancyBox </span><span class="pun">{</span><span class="pln">
    text</span><span class="pun">-</span><span class="pln">align</span><span class="pun">:</span><span class="pln"> right</span><span class="pun">;</span><span class="pln">
    padding</span><span class="pun">-</span><span class="pln">right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	هذا الحل يتضمن ثلاثة أجزاء:
</p>

<ol>
	<li>
		القاعدة (أو المُحدِّد) الأصلية وفيها خاصياتٌ ليست متعلقة بالاتجاه، لأنها مشتركة بين الاتجاهين RTL و LTR.
	</li>
	<li>
		محدد يُعالج الاتجاه من اليسار إلى اليمين –<code>html[dir="ltr"]</code>– لا يوجد فيه سوى خاصيات لها علاقة بالاتجاه والتي تتوافق قيمها مع التخطيط (layout) الذي لديك لاتجاه LTR.
	</li>
	<li>
		مُحدِّد يعالج الاتجاه من اليمين إلى اليسار –<code>html[dir="rtl"]</code>– بنفس خاصيات حالة LTR، لكن قيمها مضبوطة لكي تتوافق مع التخطيط الذي لديك لاتجاه RTL.<br>
		لاحظ كيف أنَّ القاعدة الثانية تملك خاصية <code>padding-left</code> فقط، بينما القاعدة الثالثة تملك خاصية <code>padding-right</code> فقط. وهذا لأنَّ كل واحد منها خاصة بالاتجاه المُحدَّد في خاصية <code>dir</code>.<br>
		هذه الطريقة جيدة وجميلة ويسهل التعامل معها، ولا تحتاج فيها إلى حذف قيم بعض الخاصيات (لاحظ أنَّ الكلمة المحجوزة <code>unset</code> <a href="http://caniuse.com/#search=unset" rel="external nofollow">غير مدعومة في جميع المتصفحات</a>. لأكبر قدر من التوافقية، عليك أن تُعيد تعريف القيمة التي ترغب بها لأي خاصية تريد حذف قيمتها).
	</li>
</ol>

<h2 id="كيفية-ضبط-اتجاه-الصفحة-باستخدام-javascript">
	كيفية ضبط اتجاه الصفحة باستخدام JavaScript؟
</h2>

<p>
	هذا سهلٌ جدًا، ويتطلب سطرًا وحيدًا فقط: <code>document.documentElement.dir</code><br>
	يمكنك طباعة هذه القيمة إلى console كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6590_21"><span class="kwd">var</span><span class="pln"> direction </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">documentElement</span><span class="pun">.</span><span class="pln">dir</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">direction</span><span class="pun">);</span></pre>

<p>
	أو تستطيع <a href="http://codepen.io/anefzaoui/pen/WQxWQQ" rel="external nofollow">تجربة المثال الحي</a>.<br>
	استعمل السطر الآتي لضبط اتجاه الصفحة: <code>document.documentElement.dir = "rtl"</code><br>
	هذا <a href="http://codepen.io/anefzaoui/pen/gaMyPN" rel="external nofollow">مثالٌ متكاملٌ</a> حول الحصول على قيمة اتجاه الصفحة وضبطها:<br>
	شيفرة HTML:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6590_23"><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">dir</span><span class="pun">=</span><span class="atv">"ltr"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"button"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"Set document direction to RTL"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"setDirection"</span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"directionStatus"</span><span class="tag">&gt;&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	شيفرة JavaScript:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6590_25"><span class="kwd">function</span><span class="pln"> getDirection</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"> direction </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">documentElement</span><span class="pun">.</span><span class="pln">dir</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">'directionStatus'</span><span class="pun">).</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'This document\'s direction is: '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> direction</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"> dirButton </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">'setDirection'</span><span class="pun">);</span><span class="pln">
dirButton</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="kwd">function</span><span class="pun">(</span><span class="pln">evt</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"> isRTL </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">documentElement</span><span class="pun">.</span><span class="pln">dir </span><span class="pun">===</span><span class="pln"> </span><span class="str">'rtl'</span><span class="pun">);</span><span class="pln">
  document</span><span class="pun">.</span><span class="pln">documentElement</span><span class="pun">.</span><span class="pln">dir </span><span class="pun">=</span><span class="pln"> isRTL </span><span class="pun">?</span><span class="pln"> </span><span class="str">'ltr'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'rtl'</span><span class="pun">;</span><span class="pln">
  dirButton</span><span class="pun">.</span><span class="pln">value </span><span class="pun">=</span><span class="pln"> isRTL </span><span class="pun">?</span><span class="pln"> </span><span class="str">'Set document direction to RTL'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'Set document direction to LTR'</span><span class="pun">;</span><span class="pln">
  getDirection</span><span class="pun">();</span><span class="pln">
</span><span class="pun">});</span></pre>

<h2 id="حلول-مؤتمتة">
	حلول مؤتمتة
</h2>

<p>
	تحدثنا بما فيه الكفاية عن الطرق اليدوية لقلب الاتجاه إلى RTL. لننظر الآن إلى بعض الحلول المؤتمتة.
</p>

<h3 id="css-flip">
	css-flip
</h3>

<p>
	طوَّرت تويتر حلًا لأتمتة كامل العملية وجعل قلب الاتجاه إلى RTL أسهل للمشاريع الكبيرة. هذا المشروع مفتوح المصدر ويمكنك أن تجده على <a href="https://github.com/twitter/css-flip" rel="external nofollow">Github</a>.<br>
	إضافة NPM هذه تغطي جميع الحالات التي قد تواجهها عندما تعمل على قلب الاتجاه إلى RTL، بما في ذلك الحالات الغريبة. بعض ميزاتها:
</p>

<ul>
	<li>
		no-flip: لإخبار مُحرِّك القلب أنَّك لا تريد أن تُقلَب هذه الخاصية وذلك بإضافة <code>/* @noflip*/</code> في بداية الخاصية. على سبيل المثال، إذا كتبتَ <code>‎/* @noflip*/ float: left</code> فستبقى الخاصية <code>float: left</code> عند تشغيل css-flip.
	</li>
	<li>
		replace: عندما تكون لديك صور خلفية تختلف بين RTL و LTR، فيمكنك أن تُحدِّد صورةً بديلةً بتضمين <code>‎/*@replace: url(my/image/path) */‎</code> قبل الخاصية الأصلية. فلنقل أنَّ لديك الخاصية <code>background-image: url(arrow-left.png)</code> وإذا حدثت السطر إلى <code>‎/*@replace: url(arrow-rightish.png) */ background-image: url(arrow-left.png);‎</code> فستصبح الخاصية النهائية في اتجاه RTL كالآتية: <code>background-image: url(arrow-rightish.png);‎</code>.
	</li>
</ul>

<p>
	يمكنك استعمال css-flip عبر سطر الأوامر بتنفيذ <code>css-flip path/to/file.css &gt; path/to/file.rtl.css</code> أو عبر تضمين css-flip في صفحتك. للمزيد من المعلومات راجع <a href="https://github.com/twitter/css-flip" rel="external nofollow">مستودع github</a>. يجدر بالذكر أنَّ css-flip يُستعمَل في برمجيات تويتر.
</p>

<h3 id="rtlcss">
	rtlcss
</h3>

<p>
	أداةٌ أخرى لأتمتة العملية برمجها «محمد يونس» تدعى rtlcss التي تتوفر على github وتوفر ميزاتٍ رائعة. يمكنك باستخدام هذه الأداة أن:
</p>

<ul>
	<li>
		تعيد تسمية القواعد (مثلًا، إعادة تسمية <code>‎#boxLeft</code> إلى <code>‎#boxRightSide</code>).
	</li>
	<li>
		تتجاهل بعض القواعد من عملية القلب.
	</li>
	<li>
		تتجاهل خاصياتٍ معينة.
	</li>
	<li>
		تضيف قيمًا جديدة.
	</li>
	<li>
		تضيف قيم خاصيات جديدة بين قيم الخاصيات الأخرى.<br>
		يمكنك استخدام هذه الأداة عبر سطر الأوامر؛ ويمكنك إنشاء ملف أنماط RTL بتنفيذ الأمر الآتي في نفس المجلد الذي يتوفر فيه ملف CSS الأصلي:
	</li>
</ul>

<pre class="ipsCode" id="ips_uid_6590_27">rtlcss input.css output.rtl.css</pre>

<p>
	أو يمكنك أن تضمنه في صفحتك. للمزيد من المعلومات راجع <a href="https://github.com/MohammadYounes/rtlcss" rel="external nofollow">صفحة المشروع على github.</a><br>
	هذا المشروع مشهور جدًا ويستعمل من عدِّة مشاريع بما فيها ووردبريس.
</p>

<h2 id="خاتمة">
	خاتمة
</h2>

<p>
	ما يزال هنالك الكثير لنغطيه، لكن هذه المقالة أمدتك بالمعلومات اللازمة لبدء مشوارك مع RTL. سنشرح في المقالة القادمة مواضيع متقدمة عن RTL.<br>
	إذا كانت لديك أيّة أسئلة حول RTL، فاطرحها في التعليقات.<br>
	ترجمة -وبتصرّف- للمقال <a href="https://hacks.mozilla.org/2015/09/building-rtl-aware-web-apps-and-websites-part-1/" rel="external nofollow">Building RTL-Aware Web Apps &amp; Websites: Part 1</a> لصاحبه أحمد نفزاوي
</p>
]]></description><guid isPermaLink="false">419</guid><pubDate>Sat, 01 Oct 2016 23:00:00 +0000</pubDate></item><item><title>&#x645;&#x627;&#x644;&#x641;&#x631;&#x642; &#x628;&#x64A;&#x646; &#x627;&#x644;&#x62A;&#x631;&#x645;&#x64A;&#x632; (Encoding)&#x60C; &#x627;&#x644;&#x62A;&#x639;&#x645;&#x64A;&#x629; (Encryption)&#x60C; &#x627;&#x644;&#x62A;&#x62C;&#x632;&#x626;&#x629; (Hashing) &#x648;&#x627;&#x644;&#x62A;&#x634;&#x648;&#x64A;&#x634; (Obfuscation)&#x61F;</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-encoding%D8%8C-%D8%A7%D9%84%D8%AA%D8%B9%D9%85%D9%8A%D8%A9-encryption%D8%8C-%D8%A7%D9%84%D8%AA%D8%AC%D8%B2%D8%A6%D8%A9-hashing-%D9%88%D8%A7%D9%84%D8%AA%D8%B4%D9%88%D9%8A%D8%B4-obfuscation%D8%9F-r308/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/encoding-encryption-hashing-obfuscation.png.77918630fdb60d5f6da9466b45cfc450.png" /></p>

<p>
	يوجد لدى كثيرين خلط بين مصطلحات متقاربة هي التعميّة Encryption، الترميز Encoding، التجزئة Hashing والتشويش Obfuscation. سيتناول هذا المقال ماهية كلّ واحد من هذه المصطلحات.
</p>

<p style="text-align: center;">
	<img alt="encoding-encryption-hashing-obfuscation.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14771" data-unique="4lf3ixzb8" src="https://academy.hsoub.com/uploads/monthly_2016_04/encoding-encryption-hashing-obfuscation.png.9740891be763632e9826f61ccb2d46b4.png"></p>

<h2 id="الترميز">
	الترميز
</h2>

<p style="text-align: center;">
	<img alt="01_encoding.png.8f193055b4200ed2992f71c0f51fe182.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14772" data-unique="jing2dm6x" src="https://academy.hsoub.com/uploads/monthly_2016_04/01_encoding.png.8f193055b4200ed2992f71c0f51fe182.png.cf91f4cf25374d80da08407384fdb5c8.png"></p>

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

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

<p>
	أمثلة: ASCII ،Unicode، ترميز روابط URL و Base64.
</p>

<h2 id="التعمية">
	التعمية
</h2>

<p style="text-align: center;">
	<img alt="02_encryption.png.057301acaa39a77fd8f43f75b314fd25.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14773" data-unique="dm30cnw2k" src="https://academy.hsoub.com/uploads/monthly_2016_04/02_encryption.png.057301acaa39a77fd8f43f75b314fd25.png.aedf7c4ca51336e09ef103fa9763496f.png"></p>

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

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

<p>
	أمثلة: AES ،Blowfish و RSA.
</p>

<h2 id="التجزئة">
	التجزئة
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="14774" href="https://academy.hsoub.com/uploads/monthly_2016_04/03_hashing.thumb.png.58cf69fcfe4f4706ea3d30686aeba875.png.fc36d6dcd7e8cf033b840d4994452776.png" rel="external"><img alt="03_hashing.thumb.png.58cf69fcfe4f4706ea3d30686aeba875.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14774" data-unique="xns3minr9" src="https://academy.hsoub.com/uploads/monthly_2016_04/03_hashing.thumb.png.58cf69fcfe4f4706ea3d30686aeba875.thumb.png.21e1e1d2c6096f5d24c8f174ca586e15.png"></a>
</p>

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

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

<p>
	أمثلة: SHA-3 و MD5 (أصبح قديما)
</p>

<h2 id="التشويش">
	التشويش
</h2>

<p style="text-align: center;">
	<img alt="04_obfuscation.png.d8d89bad40d1a7293e3e62d49585027a.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14775" data-unique="jf1a0fd48" src="https://academy.hsoub.com/uploads/monthly_2016_04/04_obfuscation.png.d8d89bad40d1a7293e3e62d49585027a.png.7922d0f35d17e7f6bcd785f2c439f090.png"></p>

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

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

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

<p>
	أمثلة: مشوِّش JavaScript و ProGuard.
</p>

<p>
	<strong>ملحوظة: </strong>ربما تتساءل متى يُستحسن استخدام التشويش بدلا من التعمية؛ والجواب هو أن التشويش يُستخدَم لجعل البيانات أصعب فهما على مستغِلّ محدَّد (شخص مّا) مع إبقائها في متناول مستغِلّ آخر (حاسوب). بالنسبة للتعميّة فيصعُب في جميع الأحوال الاستفادة من البيانات دون الحصول على المفتاح السّري.
</p>

<h2 id="خلاصة">
	خلاصة
</h2>

<ul>
<li>
		يهدف الترميز إلى الإبقاء على <strong><em>قابلية استخدام</em></strong> البيانات، ويمكن عكسُه بنفس خوارزمية الترميز؛ أي أنه لا يحتاج لمفاتيح سرية.
	</li>
	<li>
		تُستخدَم التعمية للحفاظ على <strong><em>خصوصية البيانات</em></strong> وتتطلّب إزالةُ التعمية استخدامَ مفتاح سري.
	</li>
	<li>
		تُستخدَم التجزئة لغرض التحقق من <strong><em>سلامة</em></strong> البيانات باكتشاف وجود تعديلات تدلّ عليها مُخرجات التجزئة.
	</li>
	<li>
		يُستخدم التشويش لمنع الأشخاص من <strong><em>فهم</em></strong> معنى بيانات خصوصا شفرات برمجية للحد من إمكانية تطبيق الهندسة العكسية على برنامج أو سرقة وظائفه.
	</li>
</ul>
<p>
	ترجمة -وبتصرّف- لمقال <a href="https://danielmiessler.com/study/encoding-encryption-hashing-obfuscation/" rel="external nofollow">Encoding vs. Encryption vs. Hashing vs. Obfuscation</a> لصاحبه Daniel Miessler.
</p>
]]></description><guid isPermaLink="false">308</guid><pubDate>Mon, 04 Apr 2016 21:17:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x62E;&#x62A;&#x627;&#x631; &#x631;&#x62E;&#x635;&#x629; &#x645;&#x641;&#x62A;&#x648;&#x62D;&#x629; &#x627;&#x644;&#x645;&#x635;&#x62F;&#x631; &#x644;&#x628;&#x631;&#x627;&#x645;&#x62C;&#x643;</title><link>https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81-%D8%AA%D8%AE%D8%AA%D8%A7%D8%B1-%D8%B1%D8%AE%D8%B5%D8%A9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D9%84%D8%A8%D8%B1%D8%A7%D9%85%D8%AC%D9%83-r293/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_03/how-to-choose-opensource-licence.png.e64e81a91df9c0070fe9167565cc2766.png" /></p>
<p dir="rtl">
	ما الذي يجعل مشروعك مفتوح المصدر؟ أن تكون الشّيفرة متوفرةً مجانًا على الإنترنت؟ أو أن تستطيع استعماله، أو تعديله وإرساله إلى صديقك؟ إذا ابتغينا الدقة، فإن الرخصة هي التي تعطيك الامتيازات لفعل كل ما سبق ذكره. فعندما "تفتح" مصدر مشروعك، فعليك أن تُضمِّن ملف رخصة يُحدِّد ما هي الشروط التي سيُسمَح للآخرين باستعمال مشروعك وفقًا لها. لحسن الحظ، هنالك خياراتٌ عديدةٌ يمكنك الاختيار بينها، فلا حاجة إلى أن تكون محاميًا لفعل ذلك؛ لكن لسوء الحظ هنالك الكثير من الرخص، مما يجعلك تحتار أيهم ستختار.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="how-to-choose-opensource-licence.png.282" class="ipsImage ipsImage_thumbnailed" data-fileid="13687" data-unique="0z7ioo0al" src="https://academy.hsoub.com/uploads/monthly_2016_03/how-to-choose-opensource-licence.png.2820d00136189f2020e4b53542a55578.png">
</p>

<p dir="rtl">
	<strong>تنبيه</strong>: هذه هي طريقة ترخيص مشاريعي الخاصة، لكنني لست محاميًا وهذه المقالة لا تُمثِّل نصيحة قانونية.
</p>

<h2 dir="rtl">
	ما هي الرخص؟
</h2>

<p dir="rtl">
	عدد الرخص التي يمكن اعتبارها "حرة" (free) أو مفتوحة المصدر (open-source) بالمئات! إذا كنت تريد قوائم طويلة، فراجع القوائم الموجودة على موقع مشروع <a href="http://www.gnu.org/licenses/license-list.html#SoftwareLicenses" rel="external nofollow">GNU</a> و <a href="http://opensource.org/licenses/alphabetical" rel="external nofollow">opensoucre.org</a> أو على <a href="https://en.wikipedia.org/wiki/Comparison_of_free_and_open-source_software_licenses" rel="external nofollow">ويكيبيديا</a>، وحتى تلك القوائم الطويلة ليست شاملة لجميع الرخص.
</p>

<p dir="rtl">
	وعلى الرغم من التعداد الكبير للرخص، لكن الفروقات بينها ليست محورية؛ والسبب وراء وجود عدد كبير منها هو أنَّ كاتبيها صعيبو المراس في اختيار الكلمات وبعض التفاصيل، لكن يمكن اعتبار شروط الكثير منها متماثلة. ادخل إلى موقع <a href="https://tldrlegal.com/" rel="external nofollow">tl;drLegal</a> لمراجعة سريعة لشروط مختلف الرخص.
</p>

<h2 dir="rtl">
	الرخص المتساهلة و Copyleft
</h2>

<p dir="rtl">
	أكبر أمر يُفرِّق بين الرخص هو <a href="http://www.gnu.org/licenses/copyleft.ar.html" rel="external nofollow">Copyleft</a>، وهو مصطلحٌ أوجده مشروع غنو (GNU) لمنع الأشخاص الذين سيعيدون توزيع البرمجيات في المستقبل من تقييد الحريات التي أعطيتَها للمشروع عند إطلاقه، وهذا يعني أنَّه على أيّ شخصٍ يريد أن يُعيد توزيع نسخةٍ مُعدَّلةٍ من الشيفرة التي كتبتَها أن ينشر تعديلاته أيضًا.
</p>

<p dir="rtl">
	تُطبِّق بعض الرخص ذاك المبدأ (مثل GPL، و LGPL، وMPL) بينما لا تُطبقه الأخرى (مثل MIT، و Apache، و BSD). قد تكون رخص "copyleft" مفيدةً جدًا لمنع إساءة استعمال مشروعك، وقد تكون في بعض الأحيان معيقةً لاستعماله من الشركات التي قد لا تقدر على استعمال شيفرات مرخصة بتلك الرخصة في برمجياتها التجارية.
</p>

<h2 dir="rtl">
	مجال مشروعك
</h2>

<p dir="rtl">
	أحد أهم الأشياء التي يجب أخذها بعين الاعتبار عند اختيار رخصة لمشروعك هو "المجال"؛ هل هو مكتبة برمجية، أم أداة للمطورين، أم تطبيق كامل للمستخدم النهائي؟ إذا كان سيُستعمَل مع مكتباتٍ أخرى، فعليك أن تكون حذرًا في اختيارك للرخصة بسبب مشاكل في التوافقية بين الرخص (سنشرح ذلك بعد قليل).
</p>

<p dir="rtl">
	أختارُ للتطبيقات الكاملة أو المنتجات، مثل تطبيقات الأندرويد أو <a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%B3%D8%B7%D8%AD-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8/" rel="">تطبيقات سطح المكتب</a> أو الأدوات التي تعمل من سطر الأوامر، رخصًا من نمط copyleft مثل <a href="http://www.gnu.org/licenses/gpl-3.0.ar.html" rel="external nofollow">GPLv3</a> التي تطمئنني أنَّ المشروع سيبقى مفتوح المصدر دومًا.
</p>

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

<p dir="rtl">
	شخصيًا، أستعمل رخصًا متساهلة في هذه الحالة، مثل <a href="http://opensource.org/licenses/MIT" rel="external nofollow">MIT</a> أو <a href="http://opensource.org/licenses/BSD-3-Clause" rel="external nofollow">BSD</a>؛ وبينما تترك تلك الرخص احتمال أن تشتق الشركات مصدر المشروع الخاص بك، وتطوره ولا تعطيك التعديلات عليه، لكن ذلك غير عملي أو منطقي لكثيرٍ من الشركات؛ لأن الاختلاف من مصدر الشيفرة الأصلي سيجعلهم يتحملون عبء تكاليف الصيانة التي تتجاوز عادةً قيمة التّعديل الذي أجروه على شيفرة مشروعك.
</p>

<p dir="rtl">
	رخصة <a href="http://www.gnu.org/licenses/lgpl-3.0.en.html" rel="external nofollow">LGPL</a> ليست خيارًا سيئًا أيضًا، إذ تسمح للآخرين باستعمال نسخة مُصرَّفة (compiled) من المكتبة مع شيفراتهم المملوكة (proprietary أو الاحتكارية)، وفي نفس الوقت ستحافظ على حقوق مصدر المكتبة.
</p>

<h2 dir="rtl">
	المشاكل في التوافقية
</h2>

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

<p dir="rtl">
	انظر إلى الحزم البرمجية التي تستعملها في مشروعك، وحاول أن تختار رخصةً لا تتعارض مع بنود تلك الحزم. هنالك مصادرٌ عدِّة تستطيع الحصول على معلومات توافقية الرخص منها، بما في ذلك <a href="https://en.wikipedia.org/wiki/Comparison_of_free_and_open-source_software_licenses" rel="external nofollow">ويكيبيديا</a>. تؤثر عادةً المشاكل في التوافقية على الرخص المعقَّدة والمحدَّدة مثل GPLv3؛ فكلما ازداد طول الرخصة وتخصيصها للبنود، كما ازدادت احتمالية حدوث مشاكل في التوافقية.
</p>

<h2 dir="rtl">
	تحقق من مجتمعك
</h2>

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

<p dir="rtl">
	على سبيل المثال، مجتمعَا JavaScript و Ruby يُحبذون الرخص الأكثر سماحيةً مثل MIT، بينما تُنشَر المشاريع المكتوبة بلغة C/C++‎ برخصة GPL.
</p>

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

<h2 dir="rtl">
	بدون رخصة
</h2>

<p dir="rtl">
	<a href="https://github.com/blog/1964-open-source-license-usage-on-github-com" rel="external nofollow">إحصائيات الاستخدام</a> التي نُشِرَت من Ben Balter على مدونة Github في مطلع عام 2015 تُظهِر أنَّ حوالي 80% من المستودعات على الموقع لا تُضمِّن رخصة؛ وهذا يعني أنَّ لا يُسمَح لأي شخص قانونيًا أن يستعمل الشيفرة الخاصة بهم حتى لو كانت متوفرة على الإنترنت لأنه لا يمكن اعتبارها "مفتوحة المصدر". هذا أمرٌ كارثي!
</p>

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

<h2 dir="rtl">
	الخلاصة
</h2>

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

<p dir="rtl">
	ما هي الرخصة التي استعملتها لآخر مشروعٍ لك؟ أخبرنا في التعليقات.
</p>

<p dir="rtl">
	ترجمة -وبتصرّف- للمقال <a href="http://radek.io/2015/08/03/picking-an-oss-licence/" rel="external nofollow">How to pick an open source licence for your code</a> لصاحبه Radek Pazdera.
</p>
]]></description><guid isPermaLink="false">293</guid><pubDate>Sun, 06 Mar 2016 07:54:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x623;&#x62F;&#x648;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x637;&#x648;&#x64A;&#x631; &#x641;&#x64A; &#x645;&#x62A;&#x635;&#x641;&#x62D; &#x627;&#x644;&#x648;&#x64A;&#x628; DevTools</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D9%81%D9%8A-%D9%85%D8%AA%D8%B5%D9%81%D8%AD-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-devtools-r277/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/html-css-beginners-devtools.png.d0c9163133e22e19787b80a59560002e.png" /></p>

<div id="wmd-preview-section-32">
	<p id="مدخل-إلى-أدوات-التطوير-البرمجية-في-متصفح-الويب-devtools">
		تمتلك معظم المتصفّحات أداة خفيّة تسمح لنا بالنظر خلف كواليس ما يجري في صفحة الويب. يُعتبر هذا أمرًا مفيدًا جدًّا من أجل تفحّص مواقع الويب الخاصّة بنا أو من أجل الاستلهام من مواقع ويب الأخرى. يمتلك متصفّح Chrome حاليًّا أكثر هذه الأدوات فعاليةً والتي تُسمّى أدوات المطوّر Developer Tools أو اختصارًا DevTools.
	</p>

	<p>
		تعلمنا في الدروس السابقة كيفية <a href="https://academy.hsoub.com/programming/html5/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/" rel="">إنشاء</a> و <a href="https://academy.hsoub.com/apps/web/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%B1-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A3%D9%88-%D9%85%D9%88%D9%82%D8%B9-%D9%88%D9%8A%D8%A8-%D9%82%D9%85%D8%AA-%D8%A8%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%87-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r52/" rel="">نشر</a>  و <a href="https://academy.hsoub.com/programming/css/html-%D9%88-css-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-css-r272/" rel="">تنسيق موقعنا الأول باستخدام CSS</a>. سنقوم في هذا الدرس باستعمال أدوات المطور لتفحص موقعنا والتعديل عليه.
	</p>

	<p style="text-align: center;">
		<img alt="html-css-beginners-devtools.png.8d520eb5" class="ipsImage ipsImage_thumbnailed" data-fileid="12772" data-unique="awbgv9a65" src="https://academy.hsoub.com/uploads/monthly_2016_02/html-css-beginners-devtools.png.8d520eb5e461a51f17a415d2c0ef5da9.png"></p>
</div>

<div id="wmd-preview-section-33">
	<h2 id="فتح-أدوات-التطوير-البرمجية-في-chrome">
		فتح أدوات التطوير البرمجية في Chrome
	</h2>

	<p>
		يمكن الوصول إلى هذه الأدوات بعدّة أساليب:
	</p>

	<ul>
<li>
			انقر بز الفأرة الأيمن على أيّ عنصر في صفحة الويب ثم اختر <strong>Inspect</strong>.
		</li>
		<li>
			استخدم<span style="font-family:courier new,courier,monospace;"> Ctrl+Shift+I</span> من لوحة المفاتيح أو اضغط <span style="font-family:courier new,courier,monospace;">F12</span>.
		</li>
	</ul>
<p>
		لنجرّب ذلك على موقعنا الحالي. يجب أن تحصل على شكل شبيه بما يلي: 
	</p>

	<p style="text-align: center;">
		<img alt="open-devtools.png.2a063d0ba23cf4b10d7107" class="ipsImage ipsImage_thumbnailed" data-fileid="12771" data-unique="rzp4rzkz4" src="https://academy.hsoub.com/uploads/monthly_2016_02/open-devtools.png.2a063d0ba23cf4b10d7107416741bb55.png"></p>

	<p>
		<strong>ملاحظة</strong>: إذا كنت تستخدم المحرّر Brackets فمن الأفضل أن تلغي تفعيل ميزة Live Preview (التي تحدّثنا عنها في <a href="https://academy.hsoub.com/programming/html5/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/" rel="">الدرس الأوّل: كيف تصمم أول صفحة ويب لك</a>) ثم أعد تحميل الصفحة ضمن المتصفّح وإلّا فيمكن أن ترى معرّفات id إضافية في الشيفرة يُضيفها المحرّر Brackets تلقائيًّا.
	</p>
</div>

<div id="wmd-preview-section-34">
	<h2 id="تفحص-عنصر">
		تفحص عنصر
	</h2>

	<p>
		يمكن باستخدام أدوات التطوير DevTools تفحُّص أي عنصر ضمن صفحة الويب. كمثال على ذلك، لنتفحّص العنصر <span style="font-family:courier new,courier,monospace;">h2</span> وذلك بالنقر بزر الفأرة الأيمن على العنوان "Welcome" ثم اختيار <strong>Inspect</strong>. سيؤدّي ذلك إلى فتح DevTools والانتقال إلى العنصر <span style="font-family:courier new,courier,monospace;">h2</span> ضمن الرماز مباشرةً: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_02/devtools-h2.png.07397fa927dbff10b98921c5a5a362f2.png" data-fileid="12770" rel=""><img alt="devtools-h2.thumb.png.e5695849b857040244" class="ipsImage ipsImage_thumbnailed" data-fileid="12770" data-unique="bwsz7504y" src="https://academy.hsoub.com/uploads/monthly_2016_02/devtools-h2.thumb.png.e5695849b8570402446e549b57bbc7e7.png"></a>
	</p>

	<p>
		تظهر هذه الأدوات في القسم الأيمن لنافذة المتصفّح (وقد تظهر في القسم السفلي منها)، ومن هناك يمكننا أن نشاهد التنسيقات المُطبّقة على العنصر <span style="font-family:courier new,courier,monospace;">h2</span>. يجب أن نرى الألوان التي عرّفناها مسبقًا ضمن الملف <span style="font-family:courier new,courier,monospace;">main.css</span>. يمكننا أن نرى قسمًا اسمه user agent stylesheet وفيه نجد قواعد التنسيق الافتراضيّة المطبّقة على أيّ عنصر من النوع <span style="font-family:courier new,courier,monospace;">h2</span> وذلك من قِبَل المتصفّح.
	</p>

	<p>
		أمّا في الأسفل فيمكننا أن نرى مستطيلًا ملوّنًا. يرينا هذا المستطيل الحجم والمسافات والحدود لعنصر <span style="font-family:courier new,courier,monospace;">h2</span> الذي نتفحّصه. فمثلًا نجد أنّ الخاصية <span style="font-family:courier new,courier,monospace;">padding</span> تحمل القيمة 5 كما عرّفناها مسبقًا ضمن الملف<span style="font-family:courier new,courier,monospace;"> main.css</span>.
	</p>
</div>

<div id="wmd-preview-section-35">
	<h2 id="تغيير-التنسيقات-ورماز-html">
		تغيير التنسيقات ورماز HTML
	</h2>

	<p>
		سنتناول الآن الجزء المثير في هذا الدرس. يمكننا تغيير أو إلغاء تفعيل التنسيقات بالإضافة إلى تحرير رماز HTML مباشرةً ضمن المتصفّح. فمثلّا إذا نقرنا على المربّع الملوّن الموجود بجوار <span style="font-family:courier new,courier,monospace;">background-color</span> يمكننا تغيير لون الخلفيّة للعنصر <span style="font-family:courier new,courier,monospace;">h2</span> الذي نتفحّصه حاليًّا، أو حتى يمكننا إدخال قيمة جديدة للخاصيّة <span style="font-family:courier new,courier,monospace;">padding</span>.
	</p>

	<p>
		يمكن تغيير رماز HTML بالنقر بزر الفأرة الأيمن على رماز العنصر في نافذة DevTools ثم اختيار <strong>Edit as Html</strong>.
	</p>

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

<div id="wmd-preview-section-36">
	<h2 id="الاستلهام-من-مواقع-ويب-الأخرى">
		الاستلهام من مواقع ويب الأخرى
	</h2>

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

	<p>
		من أجل مواقع ويب الأكبر يمكن أن يكون عدد التنسيقات كبيرًا، فيمكن أن توجد عدة قواعد css لنفس العنصر تتجاوز بعضها البعض. يمكن أن نرى مثالًا على ذلك مع عنصر <span style="font-family:courier new,courier,monospace;">h1</span>. فحجم الخط الذي عرّفناه لهذا العنصر في الدرس (<a href="https://academy.hsoub.com/programming/css/html-%D9%88-css-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-css-r272/" rel="">مقدمة إلى تنسيقات CSS</a>) يتجاوز حجم الخط القياسي المعرّف افتراضيًّا ضمن المتصفّح له، وهكذا يتم تجاوز التعريف الأصلي.
	</p>

	<p style="text-align: center;">
		<img alt="css-overwrite.png.76117a765ab0575367129e" class="ipsImage ipsImage_thumbnailed" data-fileid="12769" data-unique="zo67od3jk" src="https://academy.hsoub.com/uploads/monthly_2016_02/css-overwrite.png.76117a765ab0575367129e9a2a6571e6.png"></p>

	<p>
		سننشئ في <a href="https://academy.hsoub.com/programming/html5/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%D9%86%D8%B4%D8%A6-%D9%85%D9%88%D9%82%D8%B9%D8%A7-%D9%85%D9%86-%D8%B9%D8%AF%D8%A9-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r286/" rel="">الدرس الخامس</a> ثلاث صفحات من أجل المدوّنة Blog والمشاريع Projects والتواصل Contact لمشروعنا.
	</p>

	<p>
		ترجمة -وبتصرّف- للمقال <a href="http://code.makery.ch/library/html-css/part4/" rel="external nofollow">HTML &amp; CSS Tutorial - Part 4: Development Tools in the Browser</a> لصاحبه Marco Jakob.
	</p>
</div>
]]></description><guid isPermaLink="false">277</guid><pubDate>Tue, 09 Feb 2016 19:33:00 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x62E;&#x632;&#x64A;&#x646; &#x627;&#x644;&#x645;&#x624;&#x642;&#x62A; &#x644;&#x644;&#x648;&#x64A;&#x628; Web Caching: &#x62A;&#x631;&#x648;&#x64A;&#x633;&#x627;&#x62A; HTTP &#x648;&#x627;&#x633;&#x62A;&#x631;&#x627;&#x62A;&#x64A;&#x62C;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x62E;&#x632;&#x64A;&#x646; &#x627;&#x644;&#x645;&#x624;&#x642;&#x62A;</title><link>https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%85%D8%A4%D9%82%D8%AA-%D9%84%D9%84%D9%88%D9%8A%D8%A8-web-caching-%D8%AA%D8%B1%D9%88%D9%8A%D8%B3%D8%A7%D8%AA-http-%D9%88%D8%A7%D8%B3%D8%AA%D8%B1%D8%A7%D8%AA%D9%8A%D8%AC%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%85%D8%A4%D9%82%D8%AA-r205/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_11/web-caching-http-headers.png.cc7b0399ae8b5a0c68c73d5b57d295aa.png" /></p>

<p dir="rtl">إنّ <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%85%D8%A4%D9%82%D8%AA-%D9%84%D9%84%D9%88%D9%8A%D8%A8-web-caching-%D8%A7%D9%84%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-r204/">التخزين المؤقّت Caching</a> للمحتوى بشكل ذكي هو واحد من أكثر الطرق فعاليّة لتحسين التجربة لزوّار موقعنا، إنّ التخزين المؤقّت Caching، أو تخزين المحتوى بشكل مؤقّت من الطلبات السّابقة، هو جزء من لُب استراتيجيّة توصيل المحتوى المُنفَّذة ضمن ميفاق HTTP protocol، تستطيع المُكوِّنات عبر مسار توصيل المحتوى أن تقوم بالتخزين المؤقّت للعناصر لتسريع الطلبات اللاحقة، والتي تكون خاضعة لسياسات التخزين المؤقّت المُصرَّح عنها بالنسبة للمحتوى.</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_11/web-caching-http-headers.png.c30f9689c307d2481d56bd1185e6e1e6.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="7792" src="https://academy.hsoub.com/uploads/monthly_2015_11/web-caching-http-headers.thumb.png.759d6f6c866a56383fc849d5f6dae7e1.png" class="ipsImage ipsImage_thumbnailed" alt="web-caching-http-headers.thumb.png.759d6"></a></p><p dir="rtl">سنناقش في هذا الدّرس كيفيّة اختيار سياسات التخزين المؤقّت لنضمن أن يتمكّن التخزين المؤقّت في جميع أنحاء شبكة الإنترنت من معالجة محتوانا بشكل صحيح، وسنتحدّث عن استخدام ترويسات التخزين المؤقّت، وتوظيف الاستراتيجيات المختلفة للحصول على أفضل مزيج من الأداء والمرونة.</p><h2 dir="rtl"><a rel="external nofollow" name="__DdeLink__6188_1171688750"></a> ترويسات التخزين المؤقت Caching Headers</h2><p dir="rtl">تعتمد سياسة التخزين المؤقّت على عاملين مختلفين، كيان التخزين المؤقّت والذي يُقرِّر بنفسه أن يقوم بالتخزين المؤقّت للمحتوى المقبول أم لا، فيستطيع أن يُقرِّر أن يُخزِّن بشكل مؤقّت أقل مما هو مسموح له ولا أكثر من ذلك.</p><p dir="rtl">يتم تحديد مُعظم سلوك التخزين المؤقّت عن طريق سياسة التخزين المؤقّت، والتي تُوضَع من قبل مالك المحتوى.</p><p dir="rtl">تتمحور هذه السياسات بشكل أساسي حول استخدام ترويسات HTTP مُحدّدة.</p><p dir="rtl">ومع تحديثات ميفاق HTTP protocol ظهرت بعض الترويسات المختلفة التي تُركِّز على التخزين المؤقّت مع مستويات مختلفة من التعقيد، ولكنّ الترويسات التالية هي التي لا نزال بحاجة إلى الانتباه لها:</p><ul dir="rtl"><li><strong>Expires</strong>: إنّ الترويسة Expires واضحة جدًّا، على الرغم من أنّها محدودة المجال، فتقوم بشكل أساسي بتعيين وقت في المستقبل تنتهي فيه صلاحيّة المحتوى، وعند هذه النقطة يجب على أي طلب لهذا المحتوى أن يعود إلى الخادوم الأصل، تُستخدَم هذه الترويسة أفضل ما يُمكن كاحتياط فقط.</li><li><strong>Cache-Control</strong>: وهي البديل الأكثر حداثة للترويسة Expires ومدعومة بشكل جيّد وتقوم بتطبيق تصميم أكثر مرونة، وهي مُفضّلة تقريبًا في كل الحالات على Expires، ولكن لن يضرّنا تعيين قيمة لهما معًا، سنناقش تفاصيل الخيارات التي بإمكاننا تعيينها مع Cache-Control لاحقًا.</li><li><strong>Etag</strong>: تُستخدَم الترويسة Etag في التحقّق من التخزين المؤقّت، حيث يُزوّدنا الخادوم الأصل بترويسة Etag فريدة لأجل العناصر حينما يقوم بتخديم المحتوى في البداية، فعندما يُريد التخزين المؤقّت التحقق من المحتوى الذي يملكه عند انتهاء الصلاحيّة يستطيع إرسال الترويسة Etag التي يملكها من أجل المحتوى إلى الخادوم الأصل والذي إمّا أن يُخبر التخزين المؤقّت بأنّه يملك نفس المحتوى أو يقوم بإرسال المحتوى الجديد (مع ترويسة Etag جديدة).</li><li><strong>Last-Modified</strong>: تُحدِّد هذه الترويسة المرّة الأخيرة التي تمّ فيها تعديل العنصر، ويُمكن استخدامها كجزء من استراتيجيّة التحقّق لضمان محتوى حديث.</li><li><strong>Content-Length</strong>: بالرغم من أنّها لا تُشارِك تحديدًا في التخزين المؤقّت فإنّه من الهام تعيين قيمة لهذه الترويسة عند تعريف سياسات التخزين المؤقّت، حيث ترفض بعض البرمجيّات التخزين المؤقّت للمحتوى إن لم تكن تعلم مُسبقًا حجم هذا المحتوى الذي تحتاج لحجز مساحة له.</li><li><strong>Vary</strong>: يستخدم التخزين المؤقّت بشكل نموذجي المُضيف host المطلوب والمسار إلى الموارد كمفتاح يُخزَّن بواسطته العنصر المطلوب، يُمكِن استخدام الترويسة Vary لنخبر التخزين المؤقّت أن ينتبه إلى ترويسة إضافيّة عندما يُقرّر إذا ما كان الطلب لنفس هذا العنصر، وهي أكثر ما تستخدم لإخبار التخزين الاحتياطي أن تستخدم الترويسة Accept-Encoding كمفتاح أيضًا، بحيث يعلم التخزين المؤقّت كيف يُفرِّق بين المحتوى المضغوط compressed وغير المضغوط.</li></ul><h3 dir="rtl">نظرة جانبية على الترويسة Vary</h3><p dir="rtl">تزوّدنا الترويسة <span style="font-family:courier new,courier,monospace;">Vary</span> بالقدرة على تخزين إصدارات مختلفة من نفس المحتوى على حساب تمييع diluting المُدخلات في التخزين المؤقّت.</p><p dir="rtl">ففي حالة Accept-Encoding يسمح لنا إعداد الترويسة Vary بالتمييز بشكل قاطع بين المحتوى المضغوط وغير المضغوط، حيث نحتاج لهذا لتخديم هذه العناصر بشكل صحيح للمتصفّحات التي لا تستطيع التعامل مع المحتوى المضغوط، وهو ضروري من أجل توفير سهولة الاستخدام الأساسيّة، ومن إحدى السمات التي تُخبرنا بأنّ الترويسة Accept-Encoding قد تكون مُرشّحًا جيّدًا من أجل الترويسة Vary هي أنّها تمتلك فقط قيمتان أو ثلاث قيم ممكنة.</p><p dir="rtl">يبدو عنصر مثل User-Agent للوهلة الأولى طريقة جيّدة للتمييز بين متصفّحات الحواسيب ومتصفّحات الهواتف النقّالة لتخديم إصدارات مختلفة لموقعنا، ومع ذلك وبما أنّ السلاسل النصيّة لـ User-Agent ليست معياريّة فستكون النتيجة غالبًا عدّة إصدارات من نفس المحتوى في التخزينات المؤقّتة الوسيطة مع نسبة استخدام تخزين مؤقّت Cache hit ratio ضئيلة، ينبغي استخدام الترويسة Vary باعتدال، خاصّة إن لم نكن نملك القدرة على تقليل تكرار الطلبات في التخزينات المؤقّتة الوسيطة التي نتحكّم بها (والذي قد يكون ممكنًا إن استفدنا من شبكة توصيل محتوى content delivery network على سبيل المثال).</p><h2 dir="rtl">كيف تؤثر أعلام الترويسة Cache-Control على التخزين المؤقت</h2><p dir="rtl">أشرنا سابقًا إلى كيفيّة استخدام الترويسة Cache-Control من أجل مواصفات سياسة التخزين المؤقّت الحديثة، يُمكن تعيين عدد من التعليمات المختلفة لهذه السياسة باستخدام هذه الترويسة، مع فصل التعليمات المتعدّدة بواسطة الفواصل.</p><p dir="rtl">ومن بعض خيارات Cache-Control التي نستطيع استخدامها للنص على سياسة التخزين المؤقّت للمحتوى لدينا نجد:</p><ul><li><strong>no-cache</strong>: تُحدِّد هذه التعليمة أنّه يجب التحقّق من أي محتوى مُخزَّن مؤقّتًا عند كل طلب قبل تخديمه إلى العميل، وتقوم فعليًّا بتحديد المحتوى بأنّه قديم stale فورًا، ولكن تتيح له استخدام تقنيات إعادة التحقّق لتجنّب إعادة تنزيل كامل العنصر مرّة أخرى.</li><li><strong>no-store</strong>: تشير هذه التعليمة إلى أنّه لا يُمكن التخزين المؤقّت للمحتوى بأي طريقة، وهي ملائمة لتعيينها إن كانت الاستجابة تمثّل بيانات حسّاسة.</li><li><strong>public</strong>: تقوم بتحديد المحتوى بأنّه عام ممّا يعني أنّه يمكن التخزين المؤقّت له من قبل المتصفّح أو من قبل أي تخزينات مؤقّتة وسيطة، يتم تحديد الاستجابات بالنسبة للطلبات التي تستخدم استيثاق HTTP بأنّها خاصّة private افتراضيًّا، وتستطيع هذه الترويسة تجاوز ذلك الإعداد.</li><li><strong>private</strong>: تقوم بتحديد المحتوى بأنّه خاص private، والذي يُمكن تخزينه من قبل متصفّح المستخدم ويُمنَع تخزينه بشكل مؤقّت من قبل أي أطراف وسيطة، تستخدم هذه التعليمة غالبًا للبيانات الخاصّة بالمستخدم.</li><li><strong>max-age</strong>: يضبط هذا الإعداد الفترة العظمى التي يُمكن خلالها تخزين المحتوى بشكل مؤقّت قبل أن تجب إعادة التحقّق منه أو إعادة تحميله من الخادوم الأصل، وهو يستبدل الترويسة Expires من أجل المتصفّحات الحديثة وهو الأساس لتحديد حداثة جزء من المحتوى، تُحدَّد قيمة هذا الخيار بالثواني ووقت الحداثة الأعظمي المقبول هو سنة واحدة (31536000 ثانية).</li><li><strong>s-maxage</strong>: وهو مشابه كثيرًا للإعداد max-age بأنّه يشير للفترة الزمنيّة التي يُمكِن خلالها التخزين المؤقّت للمحتوى، ويكمن الفرق في أنّ هذا الخيار يُطبَّق فقط على التخزينات المؤقّتة الوسيطة، يسمح جمعه مع الخيار السابق ببناء سياسة أكثر مرونة.</li><li><strong>must-revalidate</strong>: يُشير هذا الخيار إلى أنّه يجب إطاعة معلومات الحداثة المنصوص عليها من خلال max-age، s-maxage، أو الترويسة Expires بشكل صارم، فلا يُمكِن تخديم المحتوى القديم تحت أي ظروف، ويمنع هذا استخدام المحتوى المُخزَّن مؤقّتًا في حالة انقطاعات الشبكة والسيناريوهات المشابهة لها.</li><li><strong>proxy-revalidate</strong>: يقوم هذا الإعداد بنفس ما يقوم به الإعداد السابق ولكن ينطبق فقط على وسطاء التخزين المؤقّت البيني intermediary proxies، ويبقى متصفّح المستخدم في هذه الحالة قادرًا على تخديم المحتوى القديم في حالة انقطاعات الشبكة، ولكن لا يُمكن استخدام التخزينات المؤقّتة الوسيطة لهذا الغرض.</li><li><strong>no-transform</strong>: يمنع هذا الخيار التخزينات المؤقّتة من تعديل المحتوى الذي تلقّته لأسباب تتعلّق بالأداء تحت أي ظروف، يعني هذا على سبيل المثال أنّ التخزين المؤقّت غير قادر على إرسال إصدارات مضغوطة من محتوى لم يتلقّاه بشكل مضغوط وغير مسموح له بهذا أصلًا.</li></ul><p dir="rtl">نستطيع الجمع بين كل ما سبق بطرق مختلفة للحصول على سلوك متعدّد للتخزين المؤقّت، بعض القيم التبادليّة هي:</p><ul dir="rtl"><li>no-cache ،no-store، وسلوك التخزين المؤقّت الطبيعي الذي نشير إليه بغياب أحدهما</li><li>public و private</li></ul><p dir="rtl">يحل الخيار no-store محل no-cache إن كان كلاهما موجودًا، ومن أجل الاستجابة على الطلبات التي لا تتعلق بالاستيثاق يتم تطبيق الخيار public، ومن أجل الاستجابة على الطلبات التي تحتوي استيثاق يتم تطبيق الخيار private، ويُمكِن تجاوزها بتضمين الخيار المعاكس في الترويسة Cache-Control.</p><h2 dir="rtl">تطوير سياسة تخزين مؤقت</h2><p dir="rtl">يُمكِن في العالم المثالي التخزين المؤقّت لكل شيء بقوّة والتواصل مع الخواديم فقط للتحقّق من المحتوى بين حين وآخر، ولكن على الرغم من ذلك لا يحدث هذا في الممارسة العمليّة، لذا ينبغي أن نحاول تعيين سياسات تخزين مؤقّت عاقلة تطمح إلى الموازنة بين تنفيذ تخزين مؤقّت طويل المدى والاستجابة لاحتياجات الموقع المتغيّر.</p><ol><li><h3 dir="rtl">مشاكل شائعة</h3></li></ol><p dir="rtl">هنالك العديد من الحالات التي لا يُمكِن أو لا ينبغي فيها تنفيذ التخزين المؤقّت نظرًا لكيفيّة إنتاج هذا المحتوى (توليده بشكل مُتغيّر بحسب المستخدم) أو طبيعة هذا المحتوى (معلومات بنكيّة حساسة على سبيل المثال)، ومن المشاكل الأخرى التي تُواجِه العديد من مديري النّظم عند إعداد التخزين المؤقّت هي الحالة التي تكون فيها إصدارات أقدم ومنتشرة من محتوانا ليست قديمة بعد على الرغم من نشر إصدارات أجدد منها.</p><p dir="rtl">تتم مصادفة هاتين المشكلتين بشكل متكرّر وتمتلكان أثرًا هامًّا على أداء التخزين المؤقّت ودقّة المحتوى الذي نقوم بتخديمه، ومع ذلك نستطيع الحد من هذه المشاكل عن طريق تطوير سياسات تخزين مؤقّت تتوقّع هذه المشاكل.</p><ol start="2"><li><h3 dir="rtl">توصيات عامة</h3></li></ol><p dir="rtl">على الرغم من أنّ الحالة هي التي تُملي علينا استراتيجيّة التخزين المؤقّت المُلائِمة، تستطيع التوصيات التالية إرشادنا نحو بعض القرارات المنطقيّة.</p><p dir="rtl">هناك بعض الخطوات التي نستطيع اتخاذها لزيادة نسبة استخدام التخزين المؤقّت Cache hit ratio قبل الانتقال لاستخدام ترويسات محدّدة، ومن بعض الأفكار نجد:</p><ul dir="rtl"><li>إنشاء أدلّة directories مُخصّصة للصور، ملفات css، والمحتوى المُشترَك: يسمح وضع المحتوى في أدلّة مُخصّصة بالرجوع بسهولة إليها من أي صفحة على موقعنا.</li><li>استخدام نفس الرابط URL للإشارة إلى نفس العناصر: بما أنّ التخزينات المؤقّتة تستخدم مفتاح مُكوَّن من المُضيف والمسار للمحتوى المطلوب فيجب أن نتأكّد من أن نشير إلى محتوانا بنفس الطريقة على كافّة صفحات موقعنا، وتجعل النصيحة السابقة من هذا أسهل.</li><li>استخدام الأشكال الشبحية sprites لصور CSS حيثما أمكن ذلك: تُقلِّل الأشكال الشبحية لصور CSS من أجل عناصر مثل الأيقونات والتصفّح navigation من عدد الجولات المطلوبة لتصيير render موقعنا وتسمح لنا بالتخزين المؤقّت لذلك الشكل الشبحي لوقت طويل.</li><li>استضافة الـ scripts والموارد الخارجيّة بشكل محلّي بقدر الإمكان: إن كُنّا نستخدم scripts خاصة بلغة javascript وموارد خارجيّة أخرى فيجب أن نأخذ بعين الاعتبار استضافة هذه الموارد على خواديمنا الخاصّة، نلاحظ أنّه يجب علينا الانتباه لأي تحديثات جديدة لهذه الموارد لكي نقوم بتحديث نسختنا المحليّة منها.</li><li>وضع بصمة خاصّة لعناصر التخزين المؤقّت: من المناسب أن نقوم بوضع بصمة خاصّة بالنسبة للمحتوى الثابت مثل ملفّات CSS وJavascript، ويعني هذا إضافة مُعرِّف فريد unique identifier إلى اسم الملف (عادةً تلبيد hash للملف) بحيث إن تمّ تعديل المورد يُمكِن طلب الاسم الجديد للمورد مما يجعل الطلبات تجتاز التخزين المؤقّت بشكل صحيح، توجد العديد من الأدوات التي تساعد في إنشاء بصمات وتعديل المراجع إليها في ملفّات HTML.</li></ul><p dir="rtl">ومن ناحية اختيار الترويسات الصحيحة للعناصر المختلفة، فيمكن اعتبار ما يلي كمرجع عام:</p><ul dir="rtl"><li><strong>السماح لكافّة التخزينات المؤقتة بتخزين الممتلكات العامّة general assets</strong>: ينبغي أن يتم التخزين المؤقّت للمحتوى الثابت وغير المتعلّق بالمستخدم في كافّة النقاط على سلسلة التوصيل، ممّا يسمح للتخزينات المؤقّتة الوسيطة بالاستجابة بالمحتوى للعديد من المستخدمين.</li><li><strong>السماح للمتصفّحات بالتخزين المؤقّت للممتلكات الخاصّة بالمستخدم</strong>: من المقبول والمفيد بالنسبة للمحتوى الخاص بالمستخدم أن نسمح بالتخزين المؤقّت داخل متصفّح المستخدم، وبينما يكون من غير الملائم فعل هذا على التخزينات المؤقّتة الوسيطة يسمح التخزين المؤقّت في المتصفّح بالاستعادة الآنيّة للمحتوى من أجل المستخدمين خلال الزيارات اللاحقة.</li><li><strong>عمل استثناءات للمحتوى الأساسي الحساس بالنسبة للوقت</strong>: إن كنّا نملك محتوى حساس بالنسبة للوقت نقوم بعمل استثناء للقواعد السابقة بحيث لا يتم تخديم المحتوى القديم في الحالات الحرجة، على سبيل المثال إن كان موقعنا يمتلك عربة تسوّق shopping cart فينبغي أن تعكس العناصر الموجودة فيها فورًا، واعتمادًا على طبيعة المحتوى يُمكِن تعيين الخيار no-cache أو no-store في الترويسة Cache-Control لتحقيق هذا.</li><li><strong>توفير خيارات للتحقّق دومًا</strong>: تسمح لنا خيارات التحقّق بتحديث المحتوى القديم بدون أن يتوجّب علينا تنزيل كامل الموارد مرّة أخرى، يسمح تعيين الترويسات Etag وLast-Modified للتخزينات المؤقّتة بأن تتحقّق من محتواها وتعيد تخديمه إن لم يتم تعديله على الخادوم الأصل، مما يؤدي إلى إنقاص الحمل load.</li><li><strong>تعيين أوقات حداثة freshness times طويلة للمحتوى الداعم</strong>: من أجل الاستفادة من التخزين المؤقّت بشكل فعّال فإنّ العناصر المطلوبة كمحتوى داعم لملء الطلب ينبغي عادة أن تملك وقت حداثة طويل، وهو مناسب بشكل عام من أجل لعناصر مثل الصور وملفّات CSS والتي يتم سحبها لتصيير صفحة HTML المطلوبة من قبل المستخدم، يسمح تعيين وقت حداثة طويل مع جمعه بوضع بصمة بأن تقوم التخزينات المؤقّتة بتخزين هذه الموارد لفترات طويلة، فإن تمّ تغيير الممتلكات فستقوم البصمة المُعدّلة بإبطال العنصر المُخزَّن مؤقّتًا وستقوم بتحفيز تنزيل المحتوى الجديد، وحتى ذلك الحين يُمكِن أن يتم تخزين العناصر الداعمة بشكل مؤقّت لوقت طويل في المستقبل.</li><li><strong>تعيين أوقات حداثة freshness times قصيرة للمحتوى الأب</strong>: يجب أن يملك عنصر الاحتواء وقت حداثة قصير نسبيًّا أو حتى لا يتم تخزينه بشكل مؤقّت نهائيًّا وذلك من أجل تطبيق المخطّط السّابق، وهو بشكل نموذجي صفحة HTML التي تستدعي العناصر المساعدة الأخرى، فيتم تنزيل ملفّات HTML بشكل متكرّر ممّا يسمح لها بالاستجابة للتغيرات بسرعة، ومن ثمّ بعدها يُمكِن التخزين المؤقّت للمحتوى الداعم بشدّة.</li></ul><p dir="rtl">المفتاح الأساسي لتحقيق هذا هو خلق موازنة تُفضِّل التخزين المؤقّت بشدّة حيثما أمكن مع ترك فُرَص لإبطال المُدخلات مُستقبلًا عندما يتم حدوث تغييرات، من المرجّح أن يملك موقعنا تركيبة من:</p><ul dir="rtl"><li>عناصر مُخزَّنة مؤقّتًا بشدّة</li><li>عناصر مُخزّنة مؤقّتًا مع وقت حداثة قصير والقدرة على إعادة التحقّق</li><li>عناصر لا ينبغي تخزينها بشكل مؤقّت إطلاقًا</li></ul><p dir="rtl">والهدف هو نقل المحتوى إلى الفئة الأولى إن أمكن مع الحفاظ على مستوى مقبول من الدقة.</p><h2 dir="rtl">الخاتمة</h2><p dir="rtl">إنّ أخذ الوقت للتأكّد من أنّ موقعنا يملك سياسات تخزين مؤقّت مناسبة في مكانها له تأثير هام عليه، حيث يسمح التخزين المؤقّت بالتقليل من نفقات عرض النطاق bandwidth المترافقة مع تخديم نفس المحتوى بشكل متكرّر، سيكون خادومنا أيضًا قادر على التعامل مع كميّة كبيرة من حركة مرور البيانات traffic باستخدام نفس العتاد، وربّما الأهم من كل ذلك أنّ العملاء سيملكون تجربة أسرع على موقعنا ممّا يقود بهم إلى العودة إليه بشكل متكرّر، وفي حين أنّ التخزين المؤقّت بشكل فعّال ليس حلًّا سحريًّا فإنّ إعداد سياسات تخزين مؤقّت مناسبة يعطينا مكاسب ملموسة بجهد قليل.</p><p dir="rtl"><a rel="external nofollow" name="_GoBack"></a> ترجمة -وبتصرّف- لـ <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/web-caching-basics-terminology-http-headers-and-caching-strategies">Web Caching Basics: Terminology, HTTP Headers, and Caching Strategies</a> لصاحبه Justin Ellingwood.</p>
]]></description><guid isPermaLink="false">205</guid><pubDate>Mon, 23 Nov 2015 20:50:45 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x62E;&#x632;&#x64A;&#x646; &#x627;&#x644;&#x645;&#x624;&#x642;&#x62A; &#x644;&#x644;&#x648;&#x64A;&#x628; Web Caching: &#x627;&#x644;&#x645;&#x635;&#x637;&#x644;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x623;&#x633;&#x627;&#x633;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%85%D8%A4%D9%82%D8%AA-%D9%84%D9%84%D9%88%D9%8A%D8%A8-web-caching-%D8%A7%D9%84%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-r204/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_11/web-caching-concepts.png.ca5b7f191e58181251829ef40b375400.png" /></p>

<p dir="rtl">إنّ التخزين المؤقّت Caching للمحتوى بشكل ذكي هو واحد من أكثر الطرق فعاليّة لتحسين التجربة لزوّار أي موقع. إنّ التخزين المؤقّت Caching، أو تخزين المحتوى بشكل مؤقّت من الطلبات السّابقة، هو جزء من لُب استراتيجيّة توصيل المحتوى المُنفَّذة ضمن ميفاق HTTP protocol، تستطيع المُكوِّنات عبر مسار توصيل المحتوى أن تقوم بالتخزين المؤقّت للعناصر لتسريع الطلبات اللاحقة، والتي تكون خاضعة لسياسات التخزين المؤقّت المُصرَّح عنها بالنسبة للمحتوى.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_11/web-caching-concepts.png.f19bc5802f405569a4e6ecb359b09d05.png"><img data-fileid="7657" class="ipsImage ipsImage_thumbnailed" alt="web-caching-concepts.thumb.png.fbd0c3ac2" src="https://academy.hsoub.com/uploads/monthly_2015_11/web-caching-concepts.thumb.png.fbd0c3ac27e1538a2df5042b3a9b0b50.png"></a></p><p dir="rtl">سنناقش في هذا الدّرس بعض المفاهيم الأساسيّة للتخزين المؤقّت لمحتوى الويب، وسنتحدّث عن الفوائد التي يتيح لنا التخزين المؤقّت الحصول عليها والأماكن التي يتم فيها هذا التخزين.</p><h2 dir="rtl">ما هو التخزين المؤقت Caching؟</h2><p dir="rtl">التخزين المؤقّت Caching هو مصطلح يُعبِّر عن تخزين الاستجابات القابلة لإعادة استخدامها لجعل الطلبات اللاحقة تتم بشكل أسرع، تُوجد العديد من الأنواع المختلفة المُتاحة للتخزين المؤقّت، وكل منها له خصائصه الفريدة، فالتخزين المؤقّت للتطبيقات والتخزين المؤقّت للذاكرة شائعان لقدرتهما على تسريع بعض الاستجابات.</p><p dir="rtl">إنّ التخزين المؤقّت للويب Web Caching -وهو محور درسنا هذا- هو نوع مختلف من التخزين المؤقّت، وهو ميزة التصميم الأساسيّة في ميفاق HTTP protocol والتي تهدف لتصغير حركة مرور البيانات عبر الشبكة network traffic مع تحسين الاستجابة التي يتلقّاها النظام ككل، تُوجد التخزينات المؤقّتة Caches في كل مستوى من مستويات رحلتنا مع المحتوى، ابتداءً من الخادوم الأصلي وحتى المتصفّح.</p><p dir="rtl">يعمل التخزين المؤقّت للويب عن طريق التخزين المؤقّت لاستجابات HTTP للطلبات وفق قواعد معيّنة، ويتم بعدها تلبية الطلبات اللاحقة للمحتوى المُخزّن بشكل مؤقّت من التخزين المؤقّت القريب من المستخدم بدلًا من إعادة إرسال الطلبات إلى خادوم الويب.</p><h2 dir="rtl">الفوائد</h2><p dir="rtl">يُساعد التخزين المؤقّت الفعّال مستهلكي المحتوى ومزوّدي المحتوى، ومن الفوائد التي يقدّمها لتوصيل المحتوى نجد:</p><ul dir="rtl"><li><strong>تقليل تكاليف الشبكة</strong>: يُمكن التخزين المؤقّت للمحتوى في عدّة نقاط على مسار الشبكة بين مُستهلِك المحتوى ومصدر المحتوى، وعندما يتم تخزين المحتوى بشكل مؤقّت في مكان أقرب للمستهلك فلن تُحدِث الطلبات نشاطًا إضافيًّا للشبكة ما وراء نقطة التخزين المؤقّت.</li><li><strong>تحسين الاستجابة</strong>: يُمكِّننا التخزين المؤقّت من استرجاع المحتوى بشكل أسرع لأنّه ليس من الضروري القيام بدورة كاملة عبر الشبكة من أجل استرجاعه، يستطيع التخزين المؤقّت القريب من المستخدم، مثل التخزين المؤقّت للمتصفّح browser cache، أن يجعل هذا الاسترجاع للمحتوى لحظيًّا.</li><li><strong>تحسين الأداء على نفس العتاد</strong>: بالنسبة للخادوم الذي هو منشأ المحتوى فبإمكاننا الحصول على المزيد من الأداء من نفس العتاد عن طريق السماح بالتخزين المؤقّت العنيف aggressive caching، فيتمكّن مالك المحتوى من الاستفادة من الخواديم القويّة على مسار التوصيل لتتحمّل شدّة بعض تحميلات المحتوى.</li><li><strong>توافر المحتوى أثناء انقطاعات الشبكة</strong>: يُمكِن استخدام التخزين المؤقّت ضمن سياسات مُحدّدة لتخديم المحتوى للمستخدمين النهائيين عندما لا يكون هذا المحتوى متوفّرًا لفترة قصيرة من الوقت من الخواديم الأصل.</li></ul><h2 dir="rtl">مصطلحات</h2><p dir="rtl">قد نصادف عند التعامل مع التخزين المؤقّت بعض المصطلحات غير المألوفة، ومن أشيعها ما يلي:</p><ul dir="rtl"><li><strong>الخادوم الأصل Origin server</strong>: إنّ الخادوم الأصل هو المكان الأصلي للمحتوى، فإن كنت تلعب دور مُدير خادوم الويب فهو الجهاز الذي تتحكّم به، وهو مسؤول عن تخديم أي محتوى لم نتمكّن من استرجاعه من التخزين المؤقّت على طول مسار الطلب، وإعداد سياسة التخزين المؤقّت لكافّة المحتويات.</li><li><strong>نسبة استخدام التخزين المؤقّت Cache hit ratio</strong>: تُقاس فعاليّة التخزين المؤقّت وفق نسبة استخدام التخزين المؤقّت cache hit ratio أو معدل الاستخدام hit rate، وهي نسبة الطلبات التي يُمكن استرجاعها من التخزين المؤقّت على العدد الكلّي للطلبات، وعندما تكون مرتفعة تدل على أنّنا استطعنا استرجاع نسبة عالية من الطلبات من التخزين المؤقّت، وهو عادةً النتيجة المرجوّة لمعظم مُديري النُظُم.</li><li><strong>الحداثة Freshness</strong>: وهو مصطلح يُستخدم ليصف إذا ما كان العنصر في التخزين المؤقّت لا يزال يُعد مُرشَّحًا لتخديمه إلى العميل، يُستخدَم المحتوى الموجود في التخزين المؤقّت كاستجابة فقط إذا كان ضمن الإطار الزمني للحداثة freshness المُحدَّد من قبل سياسة التخزين المؤقّت.</li><li><strong>المحتوى القديم Stale content</strong>: تنتهي صلاحيّة العناصر الموجودة في التخزين المؤقّت وفق إعدادات freshness المُحدَّدة من قبل سياسته الخاصة، يُوصف المحتوى مُنتهي الصلاحيّة بأنّه قديم "stale"، وبشكل عام لا يُمكن استخدام هذا المحتوى للإجابة على طلبات العملاء، ويجب هنا إعادة الاتصال مع الخادوم الأصل لاسترجاع المحتوى الجديد أو للتحقّق على الأقل من أنّ المحتوى المُخزَّن مؤقّتًا لا يزال دقيقًا.</li><li><strong>التحقّق Validation</strong>: يُمكِن التحقّق من العناصر الموجودة في التخزين المؤقّت من أجل تحديث مُدّة صلاحيتها، ويتضمّن هذا التواصل مع الخادوم الأصل لنعرف إذا ما كان المحتوى المُخزَّن مؤقّتًا لا يزال يُمثِّل أحدث إصدار من هذه العناصر.</li><li><strong>الإبطال Invalidation</strong>: الإبطال هو عمليّة إزالة المحتوى من التخزين المؤقّت قبل الوقت المُحدّد لانتهاء صلاحيّته، وهو ضروري إن تمّ تغيير المحتوى على الخادوم الأصل، فامتلاك محتوى قديم في التخزين المؤقّت سيسبب مشاكل هامّة للعميل.</li></ul><p dir="rtl">يُوجد المزيد من مصطلحات التخزين المؤقّت، ولكن ينبغي أن تُساعدك المصطلحات السّابقة في البدء.</p><h2 dir="rtl">ما هو المحتوى الذي يمكن تخزينه بشكل مؤقت؟</h2><p dir="rtl">يجعل بعض المحتوى من نفسه أكثر سهولة للتخزين المؤقّت من محتوى آخر، فمن المحتوى القابل بشدّة للتخزين المؤقّت لمعظم المواقع نجد:</p><ul dir="rtl"><li>صور الشعارات والعلامات التجاريّة</li><li>الصور غير المتناوبة Non-rotating images (مثل أيقونات التصفّح navigation)</li><li>ملفّات التنسيق Style sheets</li><li>ملفّات Javascript العامّة</li><li>المحتوى القابل للتنزيل</li><li>ملفّات الوسائط Media Files</li></ul><p dir="rtl">تميل هذه المحتويات إلى عدم تغيّرها بشكل متكرّر، لذا نستفيد من تخزينها بشكل مؤقّت لفترات طويلة.</p><p dir="rtl">ومن بعض العناصر التي يجب أن نحذر عند تخزينها بشكل مؤقّت نجد:</p><ul dir="rtl"><li>صفحات HTML</li><li>الصور المتناوبة Rotating images</li><li>ملفّات CSS و Javascript المُعدَّلة بشكل متكرّر</li><li>المحتوى الذي يتم طلبه من خلال كعكات الاستيثاق authentication cookies</li></ul><p dir="rtl">ومن العناصر التي لا ينبغي إطلاقًا تخزينها بشكل مؤقّت تقريبًا:</p><ul dir="rtl"><li>البيانات الحسّاسة (معلومات البنك، إلخ ..)</li><li>المحتوى المرتبط بالمستخدم والمتغيّر بشكل متكرّر</li></ul><p dir="rtl">وبالإضافة للقواعد العامّة السّابقة من الممكن تحديد سياسات تسمح لنا بالتخزين المؤقّت لأنواع مختلفة من المحتوى بشكل مناسب، على سبيل المثال إن كانت تظهر نفس شاشة العرض من موقعنا للمستخدمين الذين قاموا بالاستيثاق فمن الممكن التخزين المؤقّت لها في أي مكان، وإن كانت تظهر شاشة تعرض معلومات حسّاسة عن المستخدم في موقعنا فمن الممكن أن تكون صالحة للتخزين المؤقّت لبعض الوقت، وربّما نخبر متصفّح المستخدم أن يقوم بالتخزين المؤقّت ولكن من دون إخبار أي أماكن وسيطة أخرى للتخزين المؤقّت أن تقوم بتخزين شاشة العرض هذه.</p><h2 dir="rtl">أماكن التخزين المؤقت لمحتوى الويب</h2><p dir="rtl">يُمكِن التخزين المؤقّت للمحتوى في العديد من النقاط المختلفة على طول سلسلة التوصيل:</p><ul dir="rtl"><li><strong>التخزين المؤقّت للمتصفّح Browser cache</strong>: تحتفظ متصفّحات الإنترنت لنفسها بمكان صغير للتخزين المؤقّت، يقوم المتصفّح نموذجيًّا بتعيين سياسة تنص على أهم العناصر التي يجب تخزينها مؤقّتًا، والتي قد تكون محتوى خاص بالمستخدم أو محتوى يُعتبَر من المُكلِف تنزيله ومن المرجّح أن يُطلَب مرّة أخرى.</li><li><strong>وسطاء التخزين المؤقّت البيني Intermediary caching proxies</strong>: يستطيع أي خادوم بين العميل وبنيتنا التحتيّة أن يقوم بالتخزين المؤقّت كما يرغب، يتم الحفاظ على هذه التخزينات المؤقّتة من قبل مزوّدات خدمة الإنترنت ISPs أو أطراف مستقلّة أخرى.</li><li><strong>التخزين المؤقّت العكسي Reverse Cache</strong>: بإمكان البنية التحتيّة لخادومنا تنفيذ التخزين المؤقّت الخاص بها لخدمات المنتهى الخلفي backend services، وبهذه الطريقة يُمكِن تخديم المحتوى من نقطة الاتصال بدلًا من الوصول لخواديم المنتهى الخلفي backend عند كل طلب.</li></ul><p dir="rtl">تقوم هذه المواقع عادةً بعمل تخزين مؤقّت للعناصر وفق سياسات التخزين المؤقّت لديها والسياسات المُحدَّدة على الخادوم الأصل.</p><h2 dir="rtl">الخاتمة</h2><p dir="rtl">تحدّثنا في هذا الدّرس عن مفهوم التخزين المؤقّت وشرحنا بعض المصطلحات الأساسيّة فيه، وشاهدنا الفوائد التي نحصل عليها من استخدامه، والأماكن التي يتم فيها هذا التخزين.</p><p dir="rtl">تكلمنا أيضًا عن أنواع المحتوى التي يُمكِن تخزينها بشكل مؤقّت والأنواع التي لا يجب إطلاقًا تخزينها.</p><p dir="rtl"><a rel="external nofollow" name="_GoBack"></a> ترجمة -وبتصرّف- لـ <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/web-caching-basics-terminology-http-headers-and-caching-strategies">Web Caching Basics: Terminology, HTTP Headers, and Caching Strategies</a> لصاحبه Justin Ellingwood.</p><p dir="rtl">حقوق الصورة البارزة: <a href="http://www.freepik.com/free-vector/graphic-with-technology-icons_795841.htm" rel="external nofollow">Designed by Freepik</a>.</p>
]]></description><guid isPermaLink="false">204</guid><pubDate>Thu, 19 Nov 2015 21:48:00 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x645;&#x648;&#x642;&#x639; &#x628;&#x62A;&#x623;&#x62B;&#x64A;&#x631; scrolling &#x645;&#x645;&#x64A;&#x632;</title><link>https://academy.hsoub.com/programming/general/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%85%D9%88%D9%82%D8%B9-%D8%A8%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1-scrolling-%D9%85%D9%85%D9%8A%D8%B2-r165/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/scrolling-effect.png.14c15db1ce0753ac1d1b3db2d0db5008.png" /></p>

<p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/scrolling-effect.png.e3d39216d497db0b4e9c8a2c0b5aa545.png"><img data-fileid="4774" class="ipsImage ipsImage_thumbnailed" alt="scrolling-effect.thumb.png.afa4707eb3fa0" src="https://academy.hsoub.com/uploads/monthly_2015_09/scrolling-effect.thumb.png.afa4707eb3fa0a8568dedb212c8c70c7.png"></a></p><p dir="rtl">أكاد أجزم أنك سمعت ورأيت <a href="https://academy.hsoub.com/search/?tags=parallax+scrolling">تأثير parallax</a> في عالم تصميم وتطوير المواقع، فقد أصبح هذا التأثير أحد أجمل التأثيرات وأكثرها استخدامًا، فهو يعطي للزائر تجربة مميزة وفريدة عندما يقوم بتصفح الموقع نزولًا وصعودًا (scroll up and down). في هذا الدرس سوف نستخدم عدد من إضافات jQuery الجاهزة لإنشاء هذا التأثير.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure1.jpg.3a4ec1b27db21deb9a16238ef60ba33c.jpg"><img data-fileid="4762" class="ipsImage ipsImage_thumbnailed" alt="Figure1.thumb.jpg.6a3c3d18b1d7fc1d5999a7" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure1.thumb.jpg.6a3c3d18b1d7fc1d5999a761b1b0e8a1.jpg"></a></p><p dir="rtl">سنقوم في هذا الدرس بإنشاء موقع يحتوي على ستة أقسام، وكل قسم من هذه الأقسام يتمدد على كامل الصفحة، وسوف يحتوي كل قسم على موقع ما ومعلومات مبسطة عن الموقع.</p><p dir="rtl"><a rel="external nofollow" href="http://chrisspooner.com/my-sites/">تصفح النتيجة النهائية من هنا</a><a rel="external nofollow" href="http://chrisspooner.com/my-sites/">.</a></p><h2 dir="rtl">تصميم الموقع</h2><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2-slides.jpg.f371b6cc1fd3d18fc86494202336fbd2.jpg"><img data-fileid="4763" class="ipsImage ipsImage_thumbnailed" alt="Figure2-slides.thumb.jpg.c3371f1a9322df9" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure2-slides.thumb.jpg.c3371f1a9322df945fb1bcab69189b2b.jpg"></a></p><p dir="rtl">قبل أن نبدأ بتكويد الموقع يجب علينا تصميمه باستخدام الفوتوشوب. يمكنك في الصورة بالأعلى رؤية محتويات كل قسم من الأقسام الستة، وبما أن تأثير parallex يعمل بشكل أفضل في التصاميم التي تغطي كامل الصفحة فسوف نستخدم صور صغيرة ونستخدمها كنمط متكرر (repeating pattern) في بعض الأقسام والبعض الآخر سوف يحتوي على خلفية بصورة كبيرة. وسوف يحتوي كل قسم على عنوان، شرح، صورة وزر.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3.jpg.ad8c84a7cca8de6bc19c12a2055c4cfa.jpg"><img data-fileid="4764" class="ipsImage ipsImage_thumbnailed" alt="Figure3.thumb.jpg.1c2a27f31aaa98dde64ed4" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure3.thumb.jpg.1c2a27f31aaa98dde64ed4a61a36af5c.jpg"></a></p><p dir="rtl">ابدأ الآن باستخراج جميع الصور التي سوف تحتاجها لتصميم الموقع. وبما أنّ التصميم الذي نعمل عليه سيحتوي على الكثير من الصور فسوف نحاول الحصول على أقل حجم ممكن للصور، فبدلًا من استخدام الصيغة PNG-24 فسوف نستخدم صيغة PNG-8 للحصول على حجم أقل.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4.jpg.c7d3b187e8f7b3001a08d79a19f19759.jpg"><img data-fileid="4765" class="ipsImage ipsImage_thumbnailed" alt="Figure4.thumb.jpg.b4fd24651cc5105d32833c" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure4.thumb.jpg.b4fd24651cc5105d32833c839f58d64e.jpg"></a></p><p dir="rtl">ذكرنا سابقًا بأننا سوف نستخدم صور صغيرة كنمط متكرر (repeating pattern) في بعض أقسام الموقع وذلك لأن هذه هي أسهلة طريقة للحصول على خلفية جميلة باستخدام صور ذات حجم صغير.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5.jpg.25bbc23fb01730777e160f1e9d788392.jpg"><img data-fileid="4766" class="ipsImage ipsImage_thumbnailed" alt="Figure5.thumb.jpg.d578cca8a703449a57700a" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure5.thumb.jpg.d578cca8a703449a57700ab0656d0c75.jpg"></a></p><p dir="rtl">أمّا في الأقسام الأخرى من الموقع فسوف نستخدم صور كبيرة كخلفية. حاول أن تضغط الصور لتقليل حجمها ولكن احرص على أن تكون جودتها جيدة بعد ضغطها.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure6-images.jpg.0328753d2a8ab8ea3b19f2ad38b56cd9.jpg"><img data-fileid="4767" class="ipsImage ipsImage_thumbnailed" alt="Figure6-images.thumb.jpg.a1b3ff07890d343" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure6-images.thumb.jpg.a1b3ff07890d343742b046b801f4407e.jpg"></a></p><p dir="rtl">قم الآن بوضع كل الصور داخل مجلد ووضع الصور الخاصة بكل قسم في مجلد خاص بها وتسمية المجلدات بأسماء مناسبة.</p><h2 dir="rtl">بنية ملف HTML</h2><p dir="rtl">يمكننا أن نبدأ الآن بتكويد الموقع وسوف نبدأ أولًا بكتابة أكواد HTML.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta charset="utf-8" /&gt;
  &lt;title&gt;My Sites&lt;/title&gt;
  &lt;link href="style.css" rel="stylesheet" /&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;ul class="curtains"&gt;
    &lt;li&gt;
      &lt;section id="intro"&gt;
        &lt;h1&gt;My homes on the web&lt;/h1&gt;
        &lt;p&gt;How’s it going? I'm Chris Spooner. I'm a creative Designer, avid Blogger and I'm generally crazy about pretty colours and shapes.&lt;/p&gt;
        &lt;p&gt;Like most people who spend a lot of time on the Interwebs, […] a portal to all the places you can find my content on the web.&lt;/p&gt;
        &lt;p&gt;Fancy visiting my homes on the net? Here you’ll find info and links to my best stuff.&lt;/p&gt;
      &lt;/section&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p dir="rtl">سوف ننشئ ملف HTML بسيط ونضيف له وسم <strong><span style="font-family:courier new,courier,monospace;">&lt;ul&gt;</span></strong>، وسوف نستخدم لاحقًا في هذا الدرس إضافة اسمها curtains.js وهذه الإضافة تتطلب أن نعطي العنصر الأب (وسم <strong><span style="font-family:courier new,courier,monospace;">&lt;ul&gt;</span></strong> في حالتنا هذه) class باسم <strong><span style="font-family:courier new,courier,monospace;">curtains.</span></strong> لاحظ أيضًا أننا وضعنا جميع العناصر التي سوف تظهر في الصفحة داخل وسم <strong><span style="font-family:courier new,courier,monospace;">&lt;li&gt;</span></strong>.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;li&gt;
  &lt;section id="spoon"&gt;
    &lt;h2&gt;Blog.SpoonGraphics&lt;/h2&gt;
    &lt;a href="http://blog.spoongraphics.co.uk" id="spoon-photo"&gt;&lt;img src="images/spoon-photo.png" alt="Visit Blog.SpoonGraphics" /&gt;&lt;/a&gt;
    &lt;p&gt;Blog.SpoonGraphics is my main design blog, […] head over there and have a browse. &lt;/p&gt;
    &lt;p class="btn"&gt;&lt;a href="http://blog.spoongraphics.co.uk"&gt;Visit Blog.SpoonGraphics&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
&lt;/li&gt;</pre><p dir="rtl">قم الآن بإضافة عناصر كل قسم داخل عنصر <strong><span style="font-family:courier new,courier,monospace;">&lt;li&gt;</span></strong> خاص به (ذكرنا سابقًا أن الموقع سيحتوي على ستة أقسام وبالتالي فسوف نحتاج إلى ستة عناصر من نوع <strong><span style="font-family:courier new,courier,monospace;">&lt;li&gt;</span></strong>). ستكون إضافة IDs إلى بعض العناصر أمرًا جيدًا لأنّ ذلك سيسهل علينا تحديد تلك العناصر باستخدام jQuery وبالتالي إنشاء التأثير المطلوب.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;section id="cs"&gt;
  &lt;h2&gt;ChrisSpooner.com&lt;/h2&gt;
  &lt;p&gt;I also post random content over on my ChrisSpooner.com personal blog. […] this is the place to go!&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href="http://www.chrisspooner.com"&gt;&lt;img src="images/cs-vid-1.jpg" alt="" /&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.chrisspooner.com"&gt;&lt;img src="images/cs-vid-2.jpg" alt="" /&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.chrisspooner.com"&gt;&lt;img src="images/cs-vid-3.jpg" alt="" /&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.chrisspooner.com"&gt;&lt;img src="images/cs-vid-4.jpg" alt="" /&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.chrisspooner.com"&gt;&lt;img src="images/cs-vid-5.jpg" alt="" /&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.chrisspooner.com"&gt;&lt;img src="images/cs-vid-6.jpg" alt="" /&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/section&gt;</pre><p dir="rtl">كل العناصر التي ترغب بأن تكون جزءًا من التأثير ستحتاج إلى إضافتها على شكل عناصر منفردة بذاتها. فإذا نظرت إلى القسم الخامس ستلاحظ في أسفل الصفحة أن هناك ستة صور لمقاطع فيديو وكل صورة من هذه الصور موجودة في عنصر `&lt;li&gt;` لوحده (أنظر إلى الكود في الأعلى).</p><h2 dir="rtl">إضافة تنسيقات CSS</h2><p dir="rtl">يمكننا الآن إضافة تنسيقات CSS إلى الموقع.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">body {
  font: 18px/30px Sans-serif; color: #fff;
}

section {
  overflow: hidden; height: 993px;
}</pre><p dir="rtl">سنبدأ أولًا بإضافة تنسيقات CSS تخص الخطوط (نوع الخط المستعمل وحجمه وهكذا) ليتم تطبيقها على الموقع، وسوف نعطي الخاصية <strong><span style="font-family:courier new,courier,monospace;">overflow: hidden</span></strong> للعناصر <strong><span style="font-family:courier new,courier,monospace;">&lt;section&gt;</span></strong> وذلك حتى لا يظهر أي أشرطة تمرير أفقية (horizontal scrollbars) في المتصفح. لاحظ أيضًا أننا أعطينا ارتفاع ثابت بقيمة 993px لجميع عناصر <strong><span style="font-family:courier new,courier,monospace;">&lt;section&gt;</span></strong> حتى يتساوى ارتفاع جميع الأقسام.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#intro {
  background: #c3c2c1 url(images/intro-bg.jpg) left no-repeat;
}

#intro h1 {
  width: 858px; height: 161px;
  background: url(images/intro-title.png); text-indent: -9999px;
  position: relative; top: 145px; left: 0;
}

#intro p {
  position: relative; top: 200px; left: 350px;
  width: 508px; margin: 0 0 30px 0;
}

#intro p:nth-child(2) {
  font-weight: bold;
}</pre><p dir="rtl">لاحظ أننا أعطينا خاصية background لعناصر h1 لاستبدال النصوص بالصور لتتناسب مع تصميم الموقع، كما أننا استعملنا الخصائص `<strong><span style="font-family:courier new,courier,monospace;">position: relative</span></strong>`، `<strong><span style="font-family:courier new,courier,monospace;">top</span></strong>` و`<strong><span style="font-family:courier new,courier,monospace;">left</span></strong>` لموضعة النصوص في أماكنها الصحيحة.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">#gaming {
  background: #28323c url(images/gaming-bg.jpg);
  background-size: cover;
}

#gaming h2 {
  width: 740px; height: 324px;
  background: url(images/gaming-title.png); text-indent: -9999px;
  position: relative; top: 87px; left: 90px;
}

#gaming p {
  position: relative; top: 110px; left: 100px;
}

#gaming .btn a {
  display: block; width: 728px; height: 176px;
  background: url(images/gaming-link.png); text-indent: -9999px;
  position: relative; top: 70px;
}</pre><p dir="rtl">يمكننا القول أنّ هناك تشابه في تنسيقات CSS لجميع العناصر مع وجود بعض الاختلافات في أماكن وجود العناصر. ففي الأقسام السابقة استعملنا صورة خلفية مكررة، أمّا في الأقسام التالية فقد استعملنا صورة خلفية كبيرة واستخدمنا أيضًا الخاصية `<strong><span style="font-family:courier new,courier,monospace;">background-size: cover</span></strong>` حتى نجعل الخلفية تتجاوب مع الأبعاد المختلفة للمتصفحات.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">cs ul li {
  float: left; box-shadow: 0 0 20px rgba(0,0,0,0.5); line-height: 0;
  position: absolute; list-style: none;
}

#cs ul li:nth-child(1) {
  top: 640px; left: 100px;
  transform: rotate(10deg);
  -moz-transform: rotate(10deg);
  -webkit-transform: rotate(10deg);
  z-index: 1;
}

#cs ul li:nth-child(2) {
  top: 600px; left: 420px;
  transform: rotate(-5deg);
  -moz-transform: rotate(-5deg);
  -webkit-transform: rotate(-5deg);
  z-index: 3;
}

#cs ul li:nth-child(3) {
  top: 680px; left: 570px;
  transform: rotate(-2deg);
  -moz-transform: rotate(-2deg);
  -webkit-transform: rotate(-2deg);
  z-index: 2;
}</pre><p dir="rtl">بالنسبة لصور مقاطع الفيديو الموجودة في القسم الخامس، فقد قمنا باستخدام <strong><span style="font-family:courier new,courier,monospace;">()transform: rotate</span></strong> و<strong><span style="font-family:courier new,courier,monospace;">z-index</span></strong> حتى نُظهرها بالشكل الذي تراه. كما أننا استعملنا المحدد <strong><span style="font-family:courier new,courier,monospace;">()nth-child:</span></strong> لتسهيل عميلة تحديد العناصر المتتابعة من دون الحاجة إلى إعطاء class لكل عنصر.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure7-coded.jpg.fe0ce088f36893fb26e425030cf6aaeb.jpg"><img data-fileid="4768" class="ipsImage ipsImage_thumbnailed" alt="Figure7-coded.thumb.jpg.14a7685b9073f521" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure7-coded.thumb.jpg.14a7685b9073f521ccc73d39d9a55493.jpg"></a></p><p dir="rtl">انتهينا الآن من إضافة تنسيقات CSS وبقي علينا استخدام إضافات jQuery ليعمل كل شيء كما هو مطلوب.</p><h2 dir="rtl">إضافة بعض أكواد jQuery</h2><p dir="rtl">حتى نحصل على التأثير المطلوب فإننا سنقوم باستخدام إضافتين جاهزتين وهما <a rel="external nofollow" href="https://github.com/victa/curtain.js">Curtain.js</a> و<a rel="external nofollow" href="http://johnpolacek.github.com/scrollorama/">Scrollorama</a>.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;link href="js/curtain.css" rel="stylesheet" /&gt;

&lt;script src="http://code.jquery.com/jquery-1.8.2.min.js"&gt;&lt;/script&gt;
&lt;script src="js/curtain.js"&gt;&lt;/script&gt;
&lt;script src="js/jquery.scrollorama.js"&gt;&lt;/script&gt;
&lt;script src="js/scripts.js"&gt;&lt;/script&gt;</pre><p dir="rtl">سنحتاج في البداية إلى ربط مكتبة jQuery وهاتين الإضافتين بملف HTML الخاص بالموقع. قم بتحميل الإضافتين ووضعهما داخل وسم `<strong><span style="font-family:courier new,courier,monospace;">&lt;script&gt;</span></strong>`، قم أيضًا بإنشاء ملف باسم scripts.js وقم بوضعه داخل وسم `<span style="font-family:courier new,courier,monospace;"><strong>&lt;script&gt;</strong></span>` لأننا سنحتاج هذا الملف في إضافة التأثيرات الخاصة بالإضافتين. لا تنسى أيضًا إضافة تنسيقات CSS التي تأتي مع إضافة Curtain.js.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure8.jpg.300a66bcb3fc40b909e436593a86bc72.jpg"><img data-fileid="4769" class="ipsImage ipsImage_thumbnailed" alt="Figure8.thumb.jpg.c0a9731d753056d1944521" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure8.thumb.jpg.c0a9731d753056d19445210473301e8d.jpg"></a></p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">$(document).ready(function(){
    $('.curtains').curtain();
});</pre><p dir="rtl">أول سطر برمجي عليك أن تضعه في ملف scripts.js هو المسؤول عن تشغيل إضافة Curtain.js. سنقوم بتحديد العنصر <strong><span style="font-family:courier new,courier,monospace;">curtains.</span></strong> (وهو نفس الوسم `<span style="font-family:courier new,courier,monospace;">&lt;ul&gt;</span>` الذي أضفناه في ملف HTML). ستقوم عندها الإضافة بإظهار القسم المناسب عندما يقوم المستخدم بالتمرير إلى أسفل الصفحة (scroll down).</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure9.jpg.8f581f559b57c1831adc0e44e718c66b.jpg"><img data-fileid="4770" class="ipsImage ipsImage_thumbnailed" alt="Figure9.thumb.jpg.553cf9efb192abd8592b00" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure9.thumb.jpg.553cf9efb192abd8592b00aee688bdfa.jpg"></a></p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">$(document).ready(function(){
  $('.curtains').curtain();
  var scrollorama = $.scrollorama({
    blocks:'.curtains'
  });

  scrollorama.animate('#intro h1',{
    duration:200, property:'left', end:-860
  });
});</pre><p dir="rtl">وبالنسبة للإضافة الثانية (Scrollorama)، فإنها توفر تأثيرات تمرير أكثر. تحتاج اولًا إلى تطبيق الإضافة على نفس العنصر كما فعلنا مع الإضافة السابقة، يمكنك بعد ذلك أن تستخدمها لإنشاء تأثيرات التمرير لكل عنصر على حدة. وأول هذه العناصر هو `#intro h1`، بحيث نختار الخاصية التي نريدها (`<span style="font-family:courier new,courier,monospace;">left</span>` في هذه الحالة) ومن ثم تغيير قيمة بداية أو نهاية التأثير الحركي. لاحظ أننا قمنا بإزاحة العنوان (h1) بقيمة 890 pixels إلى اليسار عند التمرير بمقدار 200 pixels.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure10.jpg.f3f97e86fd58783e625e07f54936244a.jpg"><img data-fileid="4771" class="ipsImage ipsImage_thumbnailed" alt="Figure10.thumb.jpg.20dc5e416846cd769e9fa" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure10.thumb.jpg.20dc5e416846cd769e9fa9d58f30ad34.jpg"></a></p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">scrollorama.animate('#spoon-photo',{
  delay:993, duration:993, property:'top', start:100, end:-300
});</pre><p dir="rtl">المثال التالي يخص القسم الثاني من الموقع وبالأخص الصورة الموجودة على اليمين، بحيث نقوم بتحديد هذه الصورة وتحركيها بشكل مستقل عن محتوى الصفحة مما يخلق تأثير parallax جميل. وحتى نضمن أن التأثير لن يبدأ إلا عندما يصل الزائر إلى القسم الثاني فسوف نقوم بتأخير العملية بمقدار 993 pixles وهو الارتفاع الخاص بكل قسم، وبهذا فإن التأثير سوف يبدأ عندما يختفي القسم الأول بالكامل.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure11.jpg.ea74e57d330691176b56a698f860632b.jpg"><img data-fileid="4772" class="ipsImage ipsImage_thumbnailed" alt="Figure11.thumb.jpg.c1970cd05d9ed14be59c4" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure11.thumb.jpg.c1970cd05d9ed14be59c40b389d0999e.jpg"></a></p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">scrollorama.animate('#line25-photo',{
  delay:993, duration:1986, property:'rotate', start:-10, end:10
});

scrollorama.animate('#gaming .btn',{
  delay:2000, duration:993, property:'left', start:-800, easing:'easeOutBounce'
});</pre><p dir="rtl">أي خاصية CSS ذات قيمة عددية يمكن إعطاؤها تأثيرات حركية. ففي هذين المثال تمّ تدوير الصورة الموجودة في القسم الثالث وتحريك الزر الموجود في القسم الرابع. بالنسبة لقيمة `<strong><span style="font-family:courier new,courier,monospace;">duration: 1986</span></strong>` فهي ضعف الارتفاع الخاص بالاقسام (993px) ولقد استخدمت حتى يعمل التأثير الحركي حتى بعد أن يختفي القسم الثالث عن الأنظار، بينما استعملنا القيمة `<strong><span style="font-family:courier new,courier,monospace;">duration: 993</span></strong>` لأننا نريد أن يتوقف التأثير عندما يختفي القسم الرابع عن الأنظار ويبدأ القسم الخامس.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/Figure12.jpg.4ad2b8c61529e2b0038be70dd904d4ff.jpg"><img data-fileid="4773" class="ipsImage ipsImage_thumbnailed" alt="Figure12.thumb.jpg.5293aecccb31fd2d9b378" src="https://academy.hsoub.com/uploads/monthly_2015_09/Figure12.thumb.jpg.5293aecccb31fd2d9b3780cc069e42a3.jpg"></a></p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">scrollorama.animate('#cs ul li:nth-child(1)',{
  delay:2979, duration:993, property:'top', start:840, end: 640
});

scrollorama.animate('#cs ul li:nth-child(2)',{
  delay:2979, duration:993, property:'top', start:800, end: 640
});

scrollorama.animate('#cs ul li:nth-child(3)',{
  delay:2979, duration:993, property:'top', start:920, end: 580
});

scrollorama.animate('#cs ul li:nth-child(4)',{
  delay:2979, duration:993, property:'top', start:880, end: 620
});

scrollorama.animate('#cs ul li:nth-child(5)',{
  delay:2979, duration:993, property:'top', start:830, end: 660
});

scrollorama.animate('#cs ul li:nth-child(6)',{
  delay:2979, duration:993, property:'top', start:960, end: 600
});</pre><p dir="rtl">قمنا بإعطاء جميع صور الفيديو في القسم الخامس تأثيرًا حركيًا للخاصية `<span style="font-family:courier new,courier,monospace;">top</span>` وبتأخير (delay) مقداره 2979px (3*993=2979 وهو ارتفاع ثلاثة أقسام لأننا نحتاج إلى تمرير ثلاثة أقسام قبل أن يظهر هذا القسم). ومع استعمال قيم `<span style="font-family:courier new,courier,monospace;">start</span>` و`<span style="font-family:courier new,courier,monospace;">end</span>` مختلفة يمكننا إنشاء تأثير parallax جميل بحيث تتحرك بعض الصور أسرع من الأخرى، وكل هذا يحدث في حين تقوم إضافة Curtain.js بإظهار القسم.</p><h2 dir="rtl">جعل الموقع يعمل عندما تكون الجافاسكربت معطلة</h2><p dir="rtl">إذا كنت تريد أن يعمل الموقع في حالة وجود الجافاسكربت معطل فإنك سوف تحتاج إلى الدخول على ملف curtain.css والبحث عن السطر التالي:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.curtains &gt; li{
  position: fixed;
}</pre><p>واجعله كالتالي:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">.curtains &gt; li{
  /*position: fixed;*/
}</pre><p dir="rtl">سوف يسمح هذا للموقع أن يعمل حتى لو كان الجافاسكربت معطل.</p><p dir="rtl">وبما أنّ غالبية الزوار لديهم الجافاسكربت مفعّل، فسوف تحتاج إلى الكود التالي حتى نستعيد التأثير لهؤلاء الزوار:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">$('.curtains&gt;li').css('position', 'fixed');
</pre><h2 dir="rtl">خاتمة</h2><p dir="rtl">كما رأيت فتصميم موقع بتأثيرات scrolling وparallax ليس بالأمر الصعب، فيمكن لإضافة Curtain.js لوحدها أن تعطينا تأثيرًا جميلًا ولكن إضافة التأثيرات الحركية واستخدام إضافة Scrollorama جعل الأمر أكثر جمالًا.</p><p dir="rtl"><a rel="external nofollow" href="http://chrisspooner.com/my-sites/">تصفّح النتيجة النهائية من هنا</a><a rel="external nofollow" href="http://chrisspooner.com/my-sites/">.</a></p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="http://line25.com/tutorials/create-a-cool-website-with-fancy-scrolling-effects">Create a Cool Website with Fancy Scrolling Effects</a> لصاحبه Iggy.</p><p dir="rtl">حقوق الصورة البارزة: <a rel="external nofollow" href="http://www.freepik.com/free-vector/step-by-step-internet-business_758745.htm">Designed by Freepik</a>.</p><link href="js/curtain.css" rel="stylesheet">
]]></description><guid isPermaLink="false">165</guid><pubDate>Sun, 13 Sep 2015 22:34:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x62A;&#x642;&#x646;&#x64A;&#x629; "&#x627;&#x644;&#x623;&#x62D;&#x62F;&#x627;&#x62B; &#x627;&#x644;&#x645;&#x64F;&#x631;&#x633;&#x644;&#x629; &#x645;&#x646; &#x637;&#x631;&#x641; &#x627;&#x644;&#x62E;&#x627;&#x62F;&#x648;&#x645; (SSE)"</title><link>https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AA%D9%82%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%A3%D8%AD%D8%AF%D8%A7%D8%AB-%D8%A7%D9%84%D9%85%D9%8F%D8%B1%D8%B3%D9%84%D8%A9-%D9%85%D9%86-%D8%B7%D8%B1%D9%81-%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-sse-r98/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/sse.png.b4db0ff530e19639257d40727960b989.png" /></p>

<meta charset="utf-8"><title></title><style type="text/css"></style><p id="-">SSE اختصار لـ Server Sent Events وتسمى أيضًا EventSource تُستخدم لِبنّاء تطبيقات ويب تفاعلية. حيث يُرسل الخادوم أحداثا في الوقت الحقيقي إلى المستخدم، قد يتضمن الحدث تنبيهات للمستخدم أو بيانات يمكن استغلالها في عمل شيء ما وتحديث صفحة الويب.</p><p>في السّابق، لِعمل تحديث تلقائي للبيانات كل ثانية كانت تُستَخدم هذه الطريقة:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">setInterval(function(){ // إستدعاء الدالة بشكل تكراري
    xhr = new XMLHttpRequest(); // إستخدام طلب ajax
    xhr.onreadystatechange = function(){// عند أي تغير في حالة الطلب
        if(this.readyState == 4){// تم إستقبال النص بنجاح
            // إفعل بعض الاوامر
        }
    }
    xhr.open("get","http://localhost"); // تحديد نوع الطلب ورابط الموقع
    xhr.send("mydata"); // إرسال البيانات إلى الخادم
}, 1000); // تحديد مدّة التكرار إلى ثانية
</pre><pre><span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 1.6;">أو هذه الطريقة الأكثر تطورًا:</span>
</pre><pre data-pbcklang="javascript" data-pbcktabsize="" class="javascript ipsCode prettyprint">function getAjax(){ // تعريف الدالة التي ستدعى بشكل تكراري
    xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){
        if(this.readyState == 4)
            setTimeout(function(){ // استدعاء ألدالة مجددًا بعد ثانية من الإنتهاء لِتكرار طلب الajax
                getAjax();
            },1000);
    }
    xhr.open("get","http://localhost");
    xhr.send("mydata");
}
getAjax();// إستدعاء الدالة للمرة الأولى</pre><p>هذه الطرق صحيحة لكنها ليست الأفضل، حيث تقوم بإرسال طلب كل ثانية للخادم مما يُسبٍّب ضغط عليه وغالبًا لا يكون التحديث في الوقت الحقيقي لظهوره. فكرة عمل SSE أن الطلب يظل مَفتوحا في إنتظار محتوى جديد والخادم هو من يُرسل المحتوى الجديد وليس المتصفح من يطلبه.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_06/sse.png.f7b6dd648231905fc4a08e457e3b8463.png"><img data-fileid="2673" class="ipsImage ipsImage_thumbnailed" alt="sse.thumb.png.dbdd1c6982aaf625212669e661" src="https://academy.hsoub.com/uploads/monthly_2015_06/sse.thumb.png.dbdd1c6982aaf625212669e661d01908.png"></a></p><p><span style="line-height: 22.3999996185303px;">SSE</span> ليست الطريقة الوحيدة لِبناء تطبيقات ويب تفاعلية، يوجد العديد من الطرق الأخرى من أشهرها WebSocket.</p><h2 id="-sse-websocket">مُقارنة بين SSE و WebSocket</h2><h3 id="-">السهولة والتوافقية</h3><p>معظم الإستضافات المشتركة لا تَدعم WebSocket وهو يعمل على بروتوكل ws أو wss (في حالة إستخدام شهادة أمان ssl) وهما مختلفان عن الذي عليه واجهة المستخدم مما يُسبِّب مشاكل في مصادفة الاثنين معًا (يوجد مكتبات لفعل ذلك) على خلاف SSE التي تُعتبر طلب عادي على نفس بروتوكول واجهة المستخدم النهائية.</p><h3 id="-">تزامن المتسخدمين</h3><p>WebSocket يُمكنها عمل تزامن بين المستخدمين بطريقة مباشرة حيث أن الإتصلات تُعالج كلها معًا. في SSE لايوجد طريقة مباشرة لِتزامن المسخدمين معًا لأن كل طلب مُنفصل عن الآخر لذا تُستخدم قاعدة بيانات وتحفظ أخر التغيرات للمستخدم الأول وعند المستخدم الآخر يَتم البحث بشكل دوري عن التغيرات في قاعدة البيانات ثم إرسالها إلى المستخدم الآخر.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_06/web-sockets.png.6452b21b98fa8a3373b21cbeb6d8cbc6.png"><img data-fileid="2674" class="ipsImage ipsImage_thumbnailed" alt="web-sockets.thumb.png.bd7a0d40d4aab5136d" src="https://academy.hsoub.com/uploads/monthly_2015_06/web-sockets.thumb.png.bd7a0d40d4aab5136db0275ca0684444.png"></a></p><h3 id="-">إرسال وإستقبال البيانات</h3><p>WebSocket و SSE يدعمان إستقبال البيانات لكن لا يُمكن إرسال البيانات إلى الخادم بإستخدام SSE، أي عند بناء تطبيق يعتمد على إرسال وإستقبال البيانات من الخادوم ستضطر إلى بناء صفحة منفصلة تقوم بإستقبال الطلبات من المستخدم بواسطة ajax مثلًا.</p><h3 id="-websocket-">تطبيقات قد يكون إستخدام WebSocket فيها أفضل</h3><ul><li>في تطبيق سيحتاج إلى تفاعل المستخدمين معًا (تطبيق تواصل مثلًا) سيكون إستخدام WebSocket أفضل من SSE لأن الأخيرة لا يُمكنها إستقبال الطلبات من الخادوم.</li><li>إرسال إشعارات أو رسائل للمستخدم أو أي تطبيق لن يَحتاج المستخدم فيه إلى إرسال رسائل إلى الخادوم. هنا ممكن أن يكون إستخدام SSE أفضل وأسهل.</li></ul><h2 id="-">اهلًا بالعالم</h2><p>قبل البدء يجب أن تَعرف <a rel="external nofollow" href="http://caniuse.com/#search=websocket">المتصفحات الداعمة</a> لـِ SSE وأن متصفح أنترنت أكسبلور لايَدعمه لكن يُمكنك إستخدام مكتبة خارجية لدعمه مثل <a rel="external nofollow" href="https://github.com/Yaffle/EventSource/">EventSource.js</a> (يتم تضمين ملف javascript في الصفحة) هذا مثال لنص مصدري لإستجابة طلب SSE:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">http/1.1 200 OK ## الصفحة موجودة !
Content-Type: text/event-stream  ## تعريف المتصفح أن الصفحة هي محتوى لطلب SSE

event: delete## تعريف الحدث الذي سيُستقبل من javascript
data: "some data" ## البيانات التي سترسل إلى الحدث

event: add## تعريف حدث آخر
data: "some data"

data: "some data"## إرسال بيانات بدون حدث مُعرف
id: 3 ## غير مهم وغير مطلوب بشكل ضروري يُستخدم لتحديد مُعرف lastEventId للرسائل</pre><p>الأمثلة مكتوبة بلغة php ويُمكنك فعلها في أي لغة ويب أخرى هذا تطبيق بسيط لجلب الساعة من الخادم لحظة بلحظة. ملف server.php ( الذي سيعالج طلبات SSE احفظه بجوار واجهة المستخدم أو أي مكان آخر مع تغير المسار في شفرة javascript ):</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">&lt;?php
    set_time_limit(0);// تحديد أقصى مدة للطلب غير نهائية لان هناك خوادم تقوم بتحديدها
    $time = 1;// متغير بقيمة الوقت الذي سيرسل فيه تحديث جديد
    header("Content-Type: text/event-stream");// إرسال ترويسة أن الصفحة هي محتوى sse
    header('Cache-Control: no-cache'); // لمنع حفظ الكاش للصفحة
    while(true){// تكرار
        /*
            date("s-i-h") تُخرج الوقت على التَنسيق ساعة-دقيقة-ثانية
            PHP_EOL تعني سطر جديد يُمكن إستخدام \n لكن سَتختلف من نظام تَشغيل الى آخر
        */
        echo "data: ".date("s-i-h").PHP_EOL;
        echo PHP_EOL; // كتابة نص جديد آخر للتفريق بين التنبيهات

        // إرسال المحتوى الذي كتب دون الإنتظار إلى انتهاء الصفحة
        ob_flush();
        flush();

        // إيقاف الاسكربت إلى المدة التي تم تعريفها في المتغير time لمدة ثانية أن لم تَقف الاسكربت سَيعمل بدون توقف 
        sleep($time);
    }
?&gt;</pre><p>إن فتحت الصفحة ستجد أنها تقوم بإرسال الساعة الحالية كل ثانية. </p><p>الآن الواجهة التي ستتعامل معها:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset="utf-8"&gt;
    &lt;/head&gt;
    &lt;body style="direction: rtl"&gt;
        &lt;label&gt;الساعة الآن : &lt;span&gt;.......&lt;/span&gt;&lt;/label&gt;
        &lt;script type="text/javascript"&gt;
            if(!EventSource)
                alert("مٌتصفحك لايَدعم SSE :(");
            else{
                SSE = new EventSource("server.php"); // انشاء الطلب
                SSE.onmessage = function(ms){ // عند وجود رسالة جديدة
                    document.querySelector("span").innerHTML = ms.data;// استبدال النص بالجديد
                }
                SSE.onerror = function(){//عند وجود خطأ
                    alert("يوجد خطأ في الاتصال ...");
                    mkcon(); // إعادة الطلب
                }
            }
        &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;
</pre><h3 id="-">الأحداث وطرق انشاءها</h3><p>يُمكن في <span style="line-height: 22.3999996185303px;">SSE</span> إنشاء أحداث مخصصة لكي تَكون الشفرة أكثر ذكاءا، مثلًا إرسال حدث لحذف عنصر وحدث لإنشاء عنصر آخر.</p><p>مثال: تعريف مصفوفة بإسم الألوان أحمر أخضر أزرق.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">$colors = array("red", "green", "blue");</pre><p>ثم تعريف اسم الحدث بإسم عشوائي من هذه الألوان:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">$colors[rand(0,2)];</pre><p>ليكون النص الكامل لملف <strong>server.php</strong>:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">&lt;?php
    set_time_limit(0);// تحديد أقصى مدة للطلب غير نهائية لان هناك خوادم تقوم بتحديدها
    $time = 1;// متغير بقيمة الوقت الذي سيرسل فيه تحديث جديد
    header("Content-Type: text/event-stream");// إرسال ترويسة أن الصفحة هي محتوى sse
    $colors = array( // مصفوفة الألوان من النوع الرقمي
        "red",
        "green",
        "blue"
    );
    while(true){// تكرار
        /*
            date("s-i-h") تُخرج الوقت على التَنسيق ساعة-دقيقة-ثانية
            PHP_EOL تعني سطر جديد يُمكن إستخدام \n لكن سَتختلف من نظام تَشغيل إلى آخر
        */
        echo "data: ".date("s-i-h").PHP_EOL;
        echo "event: ".
            $colors[rand(0,2)] // توليد لون عشوائي بإسم الحدث
        .PHP_EOL;
        echo PHP_EOL; // كتابة نص جديد آخر للتفريق بين التنبيهات

        // إرسال المحتوى وعدم الإنتظار إلى إكتمال الطلب إلى النهاية
        ob_flush();
        flush();

        // إيقاف الاسكربت إلى المدة التي تم تعريفها في المتغير time لمدة ثانية أن لم تَقف الاسكربت سَيعمل بدون توقف 
        sleep($time);
    }
?&gt;</pre><p>وفي واجهة المستخدم إنشاء بعض العناوين:</p><pre data-pbcklang="html" data-pbcktabsize="" class="html ipsCode prettyprint">&lt;style&gt;
.red{
    color: red
}
.blue{
    color: blue
}
.green{
    color: green
}
&lt;/style&gt;
&lt;label class="red"&gt;
    .......
&lt;/label&gt;
&lt;label class="green"&gt;
    .......
&lt;/label&gt;
&lt;label class="blue"&gt;
    .......
&lt;/label&gt;</pre><p>الآن إستقبال الأحداث:</p><pre data-pbcklang="javascript" data-pbcktabsize="" class="javascript ipsCode prettyprint">SSE.addEventListener("red",function(ms){ //اللّون الأحمر red اسم الحدث الذي عرف من php
    document.querySelector(".red").innerHTML = ms.data;
});</pre><p>لتصبح شفرة الواجهة الكاملة:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset="utf-8"&gt;
        &lt;style&gt;
            .red{
                color: red
            }
            .blue{
                color: blue
            }
            .green{
                color: green
            }
        &lt;/style&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;label class="red"&gt;
            .......
        &lt;/label&gt;
        &lt;label class="green"&gt;
            .......
        &lt;/label&gt;
        &lt;label class="blue"&gt;
            .......
        &lt;/label&gt;
        &lt;script type="text/javascript"&gt;
            if(!EventSource)
                alert("مٌتصفحك لايَدعم SSE :(");
            else{
                function mkcon(){
                    SSE = new EventSource("server.php"); // إنشاء الطلب
                    SSE.addEventListener("red",function(ms){ //اللون الأحمر
                        document.querySelector(".red").innerHTML = ms.data;
                    });
                    SSE.addEventListener("green",function(ms){ //اللون الأخضر
                        document.querySelector(".green").innerHTML = ms.data;
                    });
                    SSE.addEventListener("blue",function(ms){ //اللون الأزرق
                        document.querySelector(".blue").innerHTML = ms.data;
                    });
                    SSE.onerror = function(){//عند وجود خطأ
                        alert("يوجد خطأ في الاتصال ...");
                        mkcon(); // اعادة الطلب
                    }
                }
                mkcon();
            }
        &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre><p>ستجد أن أحدى الساعات من الثلاثة تزيد بشكل عشوائي كل ثانية لكن بالطبع هذا مثال، لن تقوم بإستخدام هذه التقنية في هذا.</p><h3 id="-json">إستخدام بيانات json</h3><p>إن أردت إرسال مقال بإستخدام SSE فستحتاج إلى إرسال العنوان والمحتوى ولن تُرسل حدثين لذلك يُمكنك إستخدام json كما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">{
    "title": "العنوان",
    "content": "المحتوى"
}</pre><p>اذًا سَترسل هذه البيانات:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">data: {"title": "ألعنوان","content":"ألمحتوى"}</pre><p>ثم سيكون إستقبال البيانات من خلال javascript بهذا الشكل:</p><pre data-pbcklang="javascript" data-pbcktabsize="" class="javascript ipsCode prettyprint">SSE.onmessage = function(ms){
    var JsonData = JSON.parse(ms.data); // قراءة نص json
    alert(JsonData.title + "\n" + JsonData.content);
}</pre><p>مثال عملي عن إرسال بيانات json بتوقيت السيرفر المحلي:</p><p id="-server-php"><strong>ملف server.php</strong></p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">&lt;?php
    set_time_limit(0);//تُحدد أقصى مدة للطلب غير نهائية لان هناك خوادم تقوم بتحديدها
    $time = 1;// متغير بقيمة الوقت الذي سيرسل فيه تحديث جديد
    header("Content-Type: text/event-stream");// إرسال ترويسة أن الصفحة هي محتوى sse

    while(true){// تكرار
        /*
            date("s-i-h") تُخرج الوقت على التَنسيق ساعة-دقيقة-ثانية
            PHP_EOL تعني سطر جديد يُمكن إستخدام \n لكن سَتختلف من نظام تَشغيل الى آخر
        */
        echo 'data: '.
            /**
                مصفوفة بالوقت.
                دالة json_encode تقوم بتحويل البيانات الى ترميز json
            */
            json_encode(array(
                "hour" =&gt; date("h"), // الساعة
                "minute" =&gt; date("i"), // الدقيقة
                "second" =&gt; date("s") // الثانية
            ))
        .PHP_EOL;
        echo PHP_EOL; // كتابة نص جديد آخر للتفريق بين التنبيهات

        // إرسال المحتوى وعدم الإنتظار إلى إكتمال الطلب إلى النهاية
        ob_flush();
        flush();

        // إيقاف الاسكربت إلى المدة التي تم تعريفها في ألمتغير time لمدة ثانية ان لم تَقف الاسكربت سَيعمل بدون توقف 
        sleep($time);
    }
?&gt;</pre><p><strong>وملف الواجهة:</strong></p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta charset="utf-8"&gt;
    &lt;/head&gt;
    &lt;body style="direction: rtl"&gt;
        &lt;p&gt;الساعة الآن &lt;b id="hour"&gt;0&lt;/b&gt; و &lt;b id="minute"&gt;0&lt;/b&gt; دقيقة و &lt;b id="second"&gt;0&lt;/b&gt; ثانية.&lt;/p&gt;
        &lt;script type="text/javascript"&gt;
            if(!EventSource)
                alert("مٌتصفحك لايَدعم SSE :(");
            else{
                function mkcon(){
                    SSE = new EventSource("server.php"); // إنشاء الطلب
                    SSE.onmessage = function(ms){
                        var JsonData = JSON.parse(ms.data); // قراءة نص json
                        document.querySelector("#hour").innerHTML = JsonData.hour; // إستبدال الساعة
                        document.querySelector("#minute").innerHTML = JsonData.minute;// إستبدال الدقائق
                        document.querySelector("#second").innerHTML = JsonData.second;// إستبدال الثواني
                    }
                    SSE.onerror = function(){//عند وجود خطأ
                        alert("يوجد خطأ في الاتصال ...");
                        mkcon(); // إعادة الطلب
                    }
                }
                mkcon();
            }
        &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre><p>في هذا المثال والذي سبقه لن تَحتاج إلى إستحدام <span style="line-height: 22.3999996185303px;">SSE</span> ويمكن عَمل ذلك بإستخدام javascript بسهولة.</p><h2 id="-">تطبيق على ما شُرح: بناء تطبيق تواصل</h2><p>لم تُستخدم قاعدة بيانات لتسهيل تشغيل السكربت (لكن بالطبع إستخدام قاعدة بيانات أفضل) سيولد لون لكل مستخدم وسيحفظ في cookies للتعرف عليه في الرسائل، ستحفظ البيانات في ملف ChatData.json على هذا الشكل (كان يُمكن إستخدام قاعدة بيانات sqlite):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">[// مصفوفة الرسائل
    {
        "author": "rgb(54,48,98)", // لون السمتخدم
        "message": "رسالة",
    },
    {
        "author": "rgb(54,48,98)", // لون السمتخدم
        "message": "رسالة 2",
    }// ....,...,..
]</pre><h3 id="-">تصميم الواجهة</h3><p>هذه هيكلة الصفحة:</p><pre data-pbcklang="html" data-pbcktabsize="" class="html ipsCode prettyprint">&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
    &lt;meta charset="utf-8"&gt;
    &lt;title&gt;تجربة&lt;/title&gt;
    &lt;meta name="viewport" content="width=device-width"&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;div class="messages"&gt;
        &lt;/div&gt;
        &lt;div class="form"&gt;
            &lt;div class="author me"&gt;&lt;/div&gt;
            &lt;textarea placeholder="كتابة رسالة"&gt;&lt;/textarea&gt;
            &lt;button id="send"&gt;أرسل&lt;/button&gt;
        &lt;/div&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre><p>إضافة الحيوية للصفحة:</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">body,html{
    width: 100%;/** جعل عرض الصفحة بكامل الشاشة **/
    direction: rtl;
    height: 100%;
    background: #f0f0f0;/** لون الخلفية **/
    padding: 0;
    margin: 0
}
/** جعل حجم بعض العناصر يحسب بالحواشي الخارجة **/
.messages,
.messages &gt; .message,
.message &gt; .content,
.form,
.form &gt; textarea{
    box-sizing: border-box
}
/** الرسائل **/
.messages{
    padding: 40px; /** عمل فراغ بقيمة 40px من كل جهة **/
    height: 80%;
    overflow-y: auto/** جعل الرسائل الزائدة تتحول الى اسكرول **/
}
/** عناصر لن تكون بكامل عرض الحافظة **/
.message &gt; .author,
.message &gt; .content{
    display: inline-block;/** لن يأخذ العنصر كامل العرض **/
    vertical-align: top /** العنصر سيكون في محاذة الأعلى **/
}
/** هوية المستخدم **/
.message &gt; .author{
    width: 64px;
    height: 64px;
    background: #ddd; /** اللون الافتراضي سيغير بعد ذلك **/
    border-radius: 100% /** تدوير العنصر **/
}
/** جسم الرسالة **/
.message &gt; .content{
    background: white;
    box-shadow: 0 0 1px #ccc; /** تأثير الظل **/
    padding: 20px;
    margin-right: 30px;
    /** لجعل الصفحة أكثر إستجابة على الشاشات المختلفة **/
    width: 100%;
    max-width: 550px 
}
/** عناصرالتحكم لإرسال رسالة **/
.form{
    padding: 10px;
    height: 20%
}
/** صندوق النصوص **/
.form &gt; textarea{
      width: 100%;
      max-width: 678px;
      height: 100%
}
/** زر الإرسال **/
.form &gt; button{
    background: rgb(31, 158, 238);
    padding: 4px 20px;
    border: 0;
    cursor: pointer; /** مؤشر الفارة **/
    color: white;
    border-radius: 3px /** عمل بعض الحواف **/
}
.form &gt; button:active{
    background: rgb(31, 158, 200) 
}
/** تصميم الجوال إصلاح بعض العلل **/
@media screen and (max-width:640px){
    .messages{
        padding: 0
    }
    .message &gt; .content{
        margin: 0;
        margin-bottom: 20px
    }
}</pre><h3 id="-">إستقبال الرسائل</h3><p>SEE لاتدعم إرسال البيانات إلى الخادوم لذا سَتستخدم ajax لذلك. هذه شفرة بسيطة لإرسال الرسائل إلى الخادوم (يُضاف بين الوسم script في أخر الصفحة قبل &lt;/body&gt; أو إن كنت ستضيفه الى head، يجب أن يكون في دالة:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">window.onload = function(){
   //هنا
}; </pre><pre data-pbcklang="javascript" data-pbcktabsize="" class="javascript ipsCode prettyprint">document.querySelector("#send").addEventListener("click",function(){// عند الضغط على زر إرسال
    var mss = document.querySelector(".form &gt; textarea").value; // محتوى الرسالة
    if(mss &amp;&amp; mss.length){// التأكد من أن الرسالة مكتوبة
        var ajax = new XMLHttpRequest();
        ajax.onreadystatechange = function(){
            if(this.readyState == 4)
                alert("تم إرسال الرسالة");
        }
        ajax.open("get","server.php"); // نوع الطلب ومسار الإرسال
        ajax.send("?ms="+mss);// إرسال الرسالة
    }
});</pre><p>ستحدث مشكلة إن أرسل المستخدم أكثر من رسالة في وقت واحد، من الممكن أن تصل رسالة قبل الأخرى. لذا سنستعمل قائمة بالرسائل المرسلة ونقوم بمعالجتها واحدة ثم الأخرى مع تحسين تجربة المستخدم قليلًا:</p><pre data-pbcklang="javascript" data-pbcktabsize="" class="javascript ipsCode prettyprint">messagesList = []; // مصفوفة بالرسائل
InProgress = false;// يوجد طلب يُعالج أم لا
function sendFirstMessage(){
    if(!messagesList.length || InProgress) // لايوجد رسائل أو هناك رسالة تُعالج
        return false;
    var ajax = new XMLHttpRequest();
    ajax.onreadystatechange = function(){ // الرسالة ارسلت
        if(this.readyState == 4){
            messagesList.splice(0, 1);// حذف الرسالة المرسلة اول رسالة
            InProgress = false; // تم الإنتهاء من العمل
            sendFirstMessage(); // إرسال الرسالة الأخرى
        }
    }
    ajax.onerror = function(){
        alert("خطأ في الإتصال جاري المحاولة مجددًا");
        sendFirstMessage();
    }
    InProgress = true;
    ajax.open("get","send.php?message="+messagesList[0]); // نوع الطلب ومسار الإرسال
    ajax.send();// إرسال الرسالة
}
document.querySelector("#send").addEventListener("click",function(){// عند الضغط على زر إرسال
    var mss = document.querySelector(".form &gt; textarea").value; // محتوى الرسالة
    if(mss &amp;&amp; mss.length){// التأكد من أن هناك رسالة مكتوبة
        messagesList.push(mss); // إضافة رسالة إلى المصفوفة
        sendFirstMessage(); // إرسال الرسالة الأولى
        document.querySelector(".form &gt; textarea").value = "";// افراغ حقل إرسال الرسائل
    }
});</pre><p>ملف الخادوم الذي سيستقبل الرسائل، لن تكتب [] في الملف لتسهيل الكتابة في نهايته دون قِرائته:</p><p id="-send-php-"><strong>ملف send.php (الذي سيستقبل الرسائل)</strong></p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">&lt;?php
    if(empty($_GET["message"]))
      die();
    /* التأكد من المستخدم */
    if(!isset($_COOKIE["author"]) || !preg_match("/^rgb\([0-9]{0,3}\,[0-9]{0,3}\,[0-9]{0,3}\)$/i",$_COOKIE["author"])){
      // توليد لون عشوائي أن لم يُعرف من قبل
      $R = rand(0,250); // اللّون الأحر
      $G = rand(0,250); // اللّون الأخضر        
      $B = rand(0,250); // اللّون الأزرق        
      setcookie("author","rgb($R,$G,$B)"); // نمط الألوان rgb
    }
    $message = str_replace(array("&lt;","&gt;"),array("&amp;lt;","&amp;gt;"),$_GET["message"]); // الوقاية من ثغرة xss
    $data = array( // البيانات التي ستكتب
        "content" =&gt; $message,
        "author" =&gt; $_COOKIE["author"]
    );
    $FILE = fopen("./ChatData.json","a"); //فتح الملف للكتابة فيه
    $star = (!filesize("./ChatData.json")) ? "" :",";// إضافة فاصلة أن تم الكتابة بالملف من قبل
    fwrite($FILE,$star.json_encode($data)); // كتابة بيانات json في الملف
    fclose($FILE);
?&gt;</pre><p><strong>ملاحظة:</strong> سبب إستخدام الألوان هو لكي تتمكن من التعامل مع المستخدمين وحفظ البيانات في قاعدة البيانات للمستخدم.</p><p><strong>ملف server.php (الذي سيراقب تغير الملف ويرسل التحديث)</strong></p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">&lt;?php
    set_time_limit(0); // لايوجد اقصى مدة للطلب
    header("Content-Type: text/event-stream");
    $viewd = 0; // عدد الرسائل التي عرضت لمنع إرسال الرسالة اكثر من مرة
    $lastFileSize = 0; // حجم الملف عندما يتغير فان هناك رسالة ارسلت
    while(true){
        if(filesize("./ChatData.json") &gt;= $lastFileSize){// التحديث فقط عند تغير حجم الملف
            $messages = json_decode("[".file_get_contents("./ChatData.json")."]"); // قراءة الرسائل
            for($i=$viewd;$i&lt;=sizeof($messages)-1;$i++){ // حلقة تكرار من أخر رسالة مُرسلة
                echo "data: ".json_encode($messages[$i]).PHP_EOL;
                echo PHP_EOL;
            }
            $viewd = sizeof($messages); // تحديث عدد الرسائل المرسلة
   $lastFileSize = filesize("./ChatData.json"); // تحديث مُتغير أخر حجم للملف
        }
        ob_flush();
        flush();
        sleep(1);
    }
?&gt;</pre><p>ثم في واجهة المستخدم شفرة javascript لجلب التحديثات:</p><pre data-pbcklang="javascript" data-pbcktabsize="" class="javascript ipsCode prettyprint">sse = new EventSource("server.php"); // انشاء الاتصال
sse.onmessage = function(ms){
    var data = JSON.parse(ms.data); // قراءة بيانات json
    var message = document.createElement("div"); // عنصر الرسائل
    message.setAttribute("class","message"); // اضافة كلاسس message 
    var author = document.createElement("div"); // عنصر مُرسل الرسائل
    author.setAttribute("class","author"); // اضافة كلاسس author 
    author.style.backgroundColor = data.author; // تغير لون الخلفية لمعرف المستخدم
    message.appendChild(author); // اضافة عنصر مُعرف مُعرف المستخدم الى عنصر الرسالة
    var content = document.createElement("p"); // محتوى الرسالة
    content.setAttribute("class","content");
    content.innerHTML = data.content;// محتوى الرسالة
    message.appendChild(content);
    messages = document.querySelector(".messages");
    messages.appendChild(message);// اضافة عنصر الرسالة الى حافظة الرسائل
    messages.scrollTop = messages.scrollHeight; // انزال الاسكرول الى الاعلى
}    </pre><p>ليعمل على انترنت اكسبلور يجب تضمين ملف javscript هذا في الـ header:</p><pre data-pbcklang="javascript" data-pbcktabsize="" class="javascript ipsCode prettyprint">&lt;script src="https://rawgithub.com/remy/polyfills/master/EventSource.js"&gt;&lt;/script&gt; </pre><p>يجب ان يكون العمل مُطابق لهذا:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_06/project-img_(1).png.7b2b96269f665a7f7e55a6aaa447bac3.png"><img data-fileid="2671" class="ipsImage ipsImage_thumbnailed" alt="project-img_(1).thumb.png.9f50ae30949343" src="https://academy.hsoub.com/uploads/monthly_2015_06/project-img_(1).thumb.png.9f50ae309493437e3d15a4088969a3d2.png"></a></p><p>إن لم يعمل معك بشكل صحيح يُمكنك <a class="ipsAttachLink" href="https://academy.hsoub.com/applications/core/interface/file/attachment.php?id=2670">تحميل ملفات الأمثلة</a> وقراءتها حتى تتمكن من معرفة كيف يعمل هذا المثال .</p><h2 id="الخاتمة">الخاتمة</h2><p>يُمكنك رؤية المزيد من المصادر لمعرفة المزيد حول <span style="line-height: 22.3999996185303px;">SSE:</span></p><ul><li><a rel="external nofollow" href="http://www.w3.org/TR/2012/WD-eventsource-20120426/">eventsource من طرف W3C</a>.</li><li><a rel="external nofollow" href="https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events">Server Sent Events من طرف مدونة موزيلا للمبرمجين</a>.</li></ul>
]]></description><guid isPermaLink="false">98</guid><pubDate>Mon, 15 Jun 2015 09:38:00 +0000</pubDate></item><item><title>&#x627;&#x639;&#x62A;&#x645;&#x627;&#x62F; &#x646;&#x638;&#x627;&#x645; &#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x645;&#x62D;&#x62A;&#x648;&#x649; &#x623;&#x648; &#x627;&#x644;&#x642;&#x64A;&#x627;&#x645; &#x628;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x62E;&#x627;&#x635;&#x629;&#x61F; &#x645;&#x64F;&#x633;&#x627;&#x639;&#x62F;&#x643; &#x644;&#x627;&#x62A;&#x62E;&#x627;&#x630; &#x627;&#x644;&#x642;&#x631;&#x627;&#x631;</title><link>https://academy.hsoub.com/programming/general/%D8%A7%D8%B9%D8%AA%D9%85%D8%A7%D8%AF-%D9%86%D8%B8%D8%A7%D9%85-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D8%A3%D9%88-%D8%A7%D9%84%D9%82%D9%8A%D8%A7%D9%85-%D8%A8%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AE%D8%A7%D8%B5%D8%A9%D8%9F-%D9%85%D9%8F%D8%B3%D8%A7%D8%B9%D8%AF%D9%83-%D9%84%D8%A7%D8%AA%D8%AE%D8%A7%D8%B0-%D8%A7%D9%84%D9%82%D8%B1%D8%A7%D8%B1-r96/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/cms-vs-dev.png.51539aae211addae4b101a5db6d030f6.png" /></p>

<p dir="rtl">رجل أعمال؟ لديك شركة ناشئة؟ مؤسسة؟ نشاط تجاري؟ وجود موقع إلكتروني لعملك شيء ضروري و حتمي لا بدّ منه. تطوّر الإنترنت بشكل كبير جعل النشاط التجاري عليه مهمًا وزاد بدرجة كبيرة وملحوظة، لذلك أنت بحاجة لإيجاد مكان لعملك على شبكة الإنترنت لأهمية التواصل مع الجمهور الخاص بك، وفتحِ أسواقٍ جديدة، إقليمية وعالمية. عند البدء في اتخاذ قرار إيجاد كيان إلكتروني لك على الشبكة، أول ما يخطر في ذهنك هو إنشاء موقع الكتروني خاص بعملك، وهنا تبدأ رحلة البحث عن موقع مناسب لطبيعة عملك، وأهم ما يبحث عنه أصحاب العمل في الغالب هو موقع بواجهة مرنة، بسيطة سهلة وسلسة للمستخدمين، متوافق مع محركات البحث وبأقل تكلفة ممكنة. هذه الأمور غالبًا ما تشغل بال أصحاب العمل، بالإضافة للتساؤل الأكبر وهو: ما السبيل لتحقيقِ ما سبق؟ هنا نقفُ على مفترقِ طرقٍ مهم :</p><ul><li>الإستعانة بمطور أو بشركة برمجيات لبناء موقع كامل من الصفر.</li><li>استخدام أحد نظم إدارة المحتوى.</li></ul><p dir="rtl">وغالبًا ما يعتقد الجميع بأن الأمر هنا اختياريًا، في الحقيقة لا.. !!</p><h2 dir="rtl">لا تُعِدْ اختراعَ العجلة !</h2><p dir="rtl">في عالم الويب، يوجد العديد من نظم إدارة المحتوى المتنوعة، تتيح لك إمكانية إنشاء موقع بسيط، أو بناء مواقع كبيرة ومعقدة بسهولة ويسر. لمن لا يعرف نظم إدارة المحتوى، وكيف يخدم هذا النظام مشرفي المواقع وتحديد النظام المناسب لموقعك ستكون هذه المقالة دليلك المعرفي.</p><h2 dir="rtl">ما هو نظام إدارة المُحتوى ؟</h2><p dir="rtl">نظام إدارة المحتوى أو ما يعرف بـ (CMS وهي اختصار لـContent Management System)، هو نظام مصمم لإدارة محتوى موقع على شبكة الانترنت أو غيرها من الموارد الإلكترونية التي يتم استخدامها بشكل تعاوني من قبل عددٍ من الناس، وغالبًا تُستخدم نُظم إدارة المحتوى لعمل مواقع مثل: المدونات، مواقع الأخبار، المتاجر الإلكترونية ، والعديد من المواقع للشركات ومواقع التسويق. يهدف نظام إدارة المحتوى لتجنيب الناشر أو المسؤول عن الموقع الحاجة لاستخدام الشيفرات البرمجية، أو حتى معرفته بإحدى لغات الويب مثل : Html. من خلال نظام إدارة المحتوى، بإمكانك بناء وإدارة موقعك الخاص دون الحاجة لمساعدة مصمم و مطوّر ويب، ولكن في بعض الحالات قد تحتاج لمطور إذا أردت إضافة بعض العناصر لصفحات الموقع.</p><h3 dir="rtl">مميزات و عيوب استخدام نظام إدارة محتوى مقارنة بالبرمجة الخاصة.</h3><p dir="rtl">المواقع المتطورة والتفاعلية التي نراها اليوم مكتوبة بلغات برمجية مثل : (php / Asp.net). بناء مواقع كهذه يتطلب مهارات برمجية وتطويرية، وإذا كنت ممن يودون بناء مواقهم دون الحاجة لمعرفة الـ HTML، أو احدى لغات البرمجة، فنُظم إدارة المحتوى صُممت خصيصًا لك، فهي كل ما تحتاجُه لإنشاء موقع بتصميم احترافي، يحقق لك طموحك ويُلبي حاجتك. العديد من الشركات الناشئة والصغيرة التي تود بناء وإدارة مواقعها بنفسها عمدت إلى اختيار أحد نظم إدارة المحتوى في هذه الأيام.</p><h2 dir="rtl">ايجابيات وسلبيات استخدام نظام إدارة محتوى مقارنة بالبرمجة الخاصة</h2><h3 dir="rtl">الإيجابيات : </h3><ul dir="rtl"><li><strong>سهولة الاستخدام:</strong> في المواقع ذات البرمجة الخاصة (مواقع php، asp.net)، اذا أردت عمل أي تغيير في لوحة التحكم فأنت بالتأكيد بحاجة للعودة للمبرمج أو شركة البرمجة التي قامت بتطوير الموقع. بالنسبة لنظام إدارة المحتوى، لا تحتاج لمهارات خاصة، فالأمر بسهولة برامج ميكروسوفت المكتبية، مع خاصية السحب و الإفلات. بالإضافة إلى لوحة تحكمٍ بسيطة وغير مُعقدة، كما يوفر نظام إدارة المحتوى شروحات ووثائق للمبتدئين.</li><li><strong>تصميم ثابت:</strong> في المواقع ذات البرمجة الخاصة، التصميم النهائي للواجهة الأمامية يصبح ثابتًا، ولو طرأ أي تغيير في نوع المحتوى المعروض في الموقع يتأثر التصميم ككل ولا يظهر بصورة سليمة، و تحتاج لمصمم أو مطوّر متخصص للقيام بالتعديل أو الإضافة، مع الأخذ بعين الإعتبار أنّ تكلفة التعديل أو التطوير في هذه الحالة أعلى بكثير مقارنة مع نظام إدارة المحتوى المُصمم خصيصًا لاستيعاب جميع أنواع المحتوى، ولو احتجت لتغيير الواجهة الأمامية لن يتطلب ذلك أي تعقيدات، فكل ما عليك هو تغيير القالب بكل بساطة.</li><li><strong>تكلفة أقل:</strong> العديد من نظم إدارة المحتوى المجانية، بالإضافة لإمكانية استضافة موقعك على خوادمهم، وتكلفتها المدفوعة أقل بكثير من تكلفة بناء وتطوير موقع ببرمجة خاصة.</li><li><strong>تفعلُها بنفسك:</strong> ربما لا يوجد لكل نظام إدارة المحتوى فريق دعم فني، لكن لديهم مجتمع مستخدمين للمساعدة في حل المشكلات الخاصة به، والمعلومات والحلول موجودة بشكل مجاني على الإنترنت. بإمكانك حل المشكلات بنفسك أو الاستعانة بمطور إذا كانت الأمر معقدًا، مع العلم أن التكلفة بالنسبةِ لك هي الوقت والجهد، إذا ما قورِنت مع دعم فني خاص.</li></ul><h3 dir="rtl">السلبيات:</h3><ul dir="rtl" style="line-height: 22.3999996185303px;"><li><p dir="rtl"><strong>التخصص و التوسع:</strong> الموضوع هنا مشابه جدًا لعملية شراء منزل جديد أو بناءه، فشراء منزلٍ جديد محكوم بالتصميم الخاص المُسبق له، فإما أن يكون رائعًا وإبداعيًا أو سيئًا للغاية، وهذا يرتبط بذوق المهندس أو مالكه. أما بناء منزل جديد، فأنت ستخطط لهُ وفق رؤيتك الخاصة، وذوقكَ الرفيع، وحسب احتياجاتك ورغباتك، مثلاً : ستضع بالحسبان وجود مساحات إضافية إذا كنت تخطط لإنجاب طفل جديد،أواستضافة أحد الأقارب،أو تخصيص مساحة لبركة مياه.. الخ. الأمر نفسة ينطبق على نُظم إدارة المحتوى، فمهما ذكرنا من إيجابيات تبقى بالنهاية محدودة ومخصصة لسبب بنائها الأساسي، إذ لا يمكننا تنفيذ جميع أنواع المواقع والتطبيقات من خلالها، خصوصًا المشاريع الكبيرة.</p></li></ul><h2 dir="rtl">كيف تختار نظام إدارة محتوى مناسب لك؟</h2><p dir="rtl">بعض نظم إدارة المحتوى تحتوي على العديد من الوظائف والتعقيدات، غالبًا لن تحتاج لها إذا كان موقعك عبارة عن مدونة مثلًا. من الضروري أن تحدد قائمة أسئلة تُجيب من خلالها على سؤالٍ مهم: ما الذي أريده من موقعي؟ إجابتكَ على هذا السؤال تُساعدك في تحديد الخيار المناسب لك، وتقدير مدى توسع عملك أو شركتك مستقبلًا والتمكن من تحديد النظام الأمثل، ومدى إمكانية إضافة الخصائص الجيدة له، و هل هو مناسبٌ لعملك أم لا. بإمكانك أيضًا الرجوع إلى مطوّر برمجيات واستشارته حول الخيار الأمثل لمشروعك، وأي النظم يعد الأنسب له.</p><p dir="rtl">هناك العديد من نظم إدارة المحتوى المدفوعة والمجانية، التي لا يُمكن حصرُها في مقالة، لذلك سنناقش أكثر النظم انتشارًا، بالإضافة لإيجابيات و سلبيات كل نظام على حده، وفي نهاية المقالة ستكون قادرًا على تحديد النظام الأنسب لموقعك.</p><p dir="rtl">الجدول التالي يُبيّن أكثر النظم انتشارًا، بناءً على: سعر التكلفة، سهولة الاستخدام، حجم مجتمع المستخدمين على الويب، إمكانية التخصيص.</p><table dir="rtl" cellpadding="7" cellspacing="0"><colgroup><col><col><col><col></colgroup><tbody><tr><td><h4>النظام</h4></td><td><h4>    الإيجابيات</h4></td><td><h4>    السلبيات </h4></td><td><h4>    السوق المستهدفة</h4></td></tr></tbody><tbody><tr><td bgcolor="#dfd8e8"><h4>Wordpress</h4></td><td bgcolor="#dfd8e8"><ul><li>سهلة الاستخدام.</li><li>كبر حجم مجتمع مستخدميها.</li></ul></td><td bgcolor="#dfd8e8"><ul><li> قلة دعمها للمحتوى المتعدد.</li><li>معرضة للإختراق.</li></ul></td><td bgcolor="#dfd8e8"><ul><li>مواقع المؤسسات والشركات الصغيرة.</li><li>المدونات.</li></ul></td></tr><tr><td><h4>Joomla</h4></td><td><ul><li>تدعم تعدد اللغات.</li><li>تعدد الصلاحيات والمستخدمين.</li></ul></td><td><ul><li>النظام الداخلي معقد جداً.</li><li>لا تتوافق مع محركات البحث بسهولة.</li></ul></td><td><ul><li>مواقع الشبكات الإجتماعية.</li><li>المجلات الالكترونية.</li></ul></td></tr><tr><td bgcolor="#dfd8e8"><h4>Drupal</h4></td><td bgcolor="#dfd8e8"><ul><li>التخصيص والإستقرار.</li><li>تحمل ضغط زوار عالي.</li></ul></td><td bgcolor="#dfd8e8"><ul><li>قلة القوالب والتصاميم.</li><li>بحاجة لمعرفة بالتقنية.</li></ul></td><td bgcolor="#dfd8e8"><ul><li>الشركات الكبيرة.</li><li>مواقع التجارة الالكترونية.</li></ul></td></tr><tr><td><h4>Tumblr</h4></td><td><ul><li>سهولة التنصيب.</li><li>ميزة الاسئلة والإجابات.</li><li>خصائص البريد للجمهور.</li></ul></td><td><ul><li>لا توفر خيارات تحكم بشكل كبير في المحتوى.</li></ul><p> </p></td><td><ul><li>المدونات.</li><li>مواقع نماذج الاعمال.</li></ul></td></tr></tbody></table><h3 dir="rtl">ووردبرس WordPress :</h3><p dir="rtl">تُعد أكثر نظام تدوين صديق للمستخدم، وتيح له تعديلها لإنشاء موقع احترافيّ دون الحاجة لأي معرفة بالـ HTML. بإمكانك أن تضيف الصفحات والمنشورات باستخدام الإضافات ( plugins )، ويمكنك أن تُضيف العديد من الوظائف والخصائص إلى موقعك. نظام WordPress مخصص للتدوين ويمتاز بتوافقه مع محركات البحث، وبالأرشفة السريعة لمواضيعه. وإذا نظرنا للنظام من وجهة نظر تسويقية، فهو يعتبر نظام تصعب مقاومته، لواجهته الاحترافية سهلة الاستخدام، التي تستطيع التعامل معها بسلاسة بدون الحاجة إلى دليلٍ إرشادي. إذا أردت التغيير في التصميم والألوان، قد تحتاج لمعرفة مسبقة بأساسيات الـ CSS، أو بإمكانك أن تستعين بمطور لديه الخبرة في هذا النظام للقيام بالتعديلات اللازمة.</p><p dir="rtl">تنصيب نظام WordPress سريع بالإضافة للميزة الأساسية، وهي الأرشفة السريعة لمواضيعها في محركات البحث وعلى رأسها محرك البحث الشهير Google، مقارنة مع Joomla التي تحتاجُ وقتًا أطول في عملية الأرشفة، وسبب ذلك أن النظام يساعدك في كتابة مقالاتك وفق أحدث معايير الـ SEO .</p><p dir="rtl">ساعتين من التعلم عبر فيديوهات YouTube أو القراءة عن WordPress كفيلةٌ بجعلك قادرًا على خلق محتوىً رائع واحترافيّ بطريقةٍ صحيحة، بالإضافة لتعلم استخدام التصنيفات والصفحات الثانوية.</p><p dir="rtl">لا تحتوي Wordpress على نظام تعدد اللغات، لكن بإمكانك تنصيب إضافات معدة لذلك سهلة الإستخدام. كما تستطيع تحمل عدد كبير من الزوار، فهي لا تنهار بسهولة، حتى مع الكثير من المحتوى. تحديثات WordPress ليست كبيرة مما يجعلها منصة مستقرة إلى حد ما.</p><p dir="rtl">والآن سنلخص لكم أهم الإيجابيات والسلبيات للمنصة :</p><h4 dir="rtl">الايجابيات:</h4><ul dir="rtl"><li>مجانية .</li><li>سهلة التنصيب و الصيانة.</li><li>نطاق مستخدمين واسع.</li><li>أكبر عدد من الإضافات و الملحقات متاحة.</li><li>صديقة لمحركات البحث مع العديد من الإضافات.</li><li>مجموعة متميزة من القوالب.</li></ul><h4 dir="rtl">السلبيات:</h4><ul dir="rtl"><li>خياراتها محدودة.</li><li>القوائم الرئيسية مرتبطة بالقالب المنصب وفي حالة اردت التعديل فانت بحاجه لمعرفة مسبقة في برمجية الـ wordpress.</li><li>ليس كل الاضافات الخاصة بها سهلة الاستخدام و الفهم.</li><li>مناسبة للمواقع التالية: المدونات، مواقع الشركات لصغيرة، المواقع الشخصية.</li></ul><h3 dir="rtl">Drupal:</h3><p dir="rtl">تعتبر من أعرقِ نظم إدارة المحتوى، فهي أول نظام إدارة محتوى تم اطلاقه عام 2001، وهي نظام مفتوح المصدر مجاني، تتميز بقوتها و سلاسة التعامل معها من جانب المطورين، فهي توفر خيارات متعددة ومرنه في التطوير وتمكنهم من بناء مواقع قوية وضخمة من خلالها، لذا لا نستغرب أن موقع البيت الابيض مثلا تم إنشاؤه من خلالها، كما أنها منصة تمتاز بالثبات، وبإمكانك بناء مواقع بمُحتويات مُركّبة، بفضل وجود وحدتي CCK و Views. يُمكنك استخدامها لبناء مواقع لا يُمكنك بناؤها باستخدام wordpress أو Joomla، هذه الوحدات تساعدك على بناء موقع بمحتوى متعدد ومتخصص، تتمكن من خلالها التحكم بطريقة أسلوب عرض المحتوى في الموقع بكل سهولة ويسر.</p><p dir="rtl">لو أخذنا على سبيل المثال : موقع إعلانات مبوبة. من خلال هذه الوحدات بإمكانك إنشاء حقول محتوى متعددة والتحكم بهذه الحقول بكل سهولة ويسر وتنيظم عرض المحتوى، فمثلاً : لو أردت أن يظهر آخر ما تم اضافته للموقع من إعلانات أو ترتيب الإعلانات حسب المدينة أو تاريخ الإضافة، وغيرها العديد من الخيارات التي تمكنك من التحكم بشكل كبير في موقعك.</p><p dir="rtl">من وجهة نظري، أهم ما يميز Drupal هو أن التصميم لا يتحكم بالموقع كما في WordPress، بل هي من تتحكم بالتصميم .</p><h4 dir="rtl">ايجابياتها:</h4><ul dir="rtl"><li>مجانية.</li><li>حل ممتاز للمواقع التي تمتلك حركة عالية من الزوار باستمرار.</li><li>التحكم في حجم الموقع بكل سهولة.</li><li>تتميز باستقرار عالي.</li><li>القدرة على تحرير المحتوى من خلال الواجهة الأمامية للموقع.</li><li>لديها نظام مستخدمين قوي ومرن في التعامل، يمكنك من منح أذونات متعددة.</li><li>صديقة لمحركات البحث.</li></ul><h4 dir="rtl">سلبياتها:</h4><ul dir="rtl"><li>على خلاف WordPress، استخدام Drupal بحاجه لمعرفة مسبقة بتقنيات الـ HTML ، ومعرفة جيّدة بلغة البرمجة PHP.</li><li>عدد القوالب الخاصة بها محدود.</li><li>الإضافات المجانية قليله مقارنة بغيرها من نظم ادارة المحتوى.</li><li><a rel="external nofollow" name="_GoBack"></a> تكلفة الصيانة مرتفعة نسبيًا.</li><li>مناسبة للمواقع التالية: الشركات الكبيرة، مواقع الإعلانات المبوبة، مواقع التجارة الإلكترونية الكبيرة.</li></ul><h3 dir="rtl">Joomla:</h3><p dir="rtl">إذا كنت تريد إنشاء مجتمع إلكتروني أو شبكة اجتماعية مع نظام العضويات فيها أو غُرف للأخبار، منتديات، موقع أخباري لنشر المقالات، أو استضافة كتّاب عديدين للنشر في موقعك ..الخ، ستكون Joomla الخيار الأمثل لك، لأنها مصممة لهذا الغرض.</p><p dir="rtl">إنشاء هيكلية وبنية الموقع سهلة، فقط تحتاج منك معرفة أساسية بكيفية عمل المنصة، ولا تحتاج منك إلى أي معرفة بلغة الـHTML . تتيح لك المنصة إمكانية الجدولة الزمنية للمقالات، وتصنيفها حسب تاريخ النشر واسم المؤلف، والكثيرمن الخصائص الأخرى.</p><p dir="rtl">تمنحكَ Joomla في لوحة التحكم الكثير من القوة والخيارات والخصائص. حتى تستطيع إعداد موقعك بسرعة وسهولة وحرفية، عليكَ اقتناء دليل يُعرّفك بماهية لوحة التحكم وكيفية استخدامها. محاولة التعلّم الذاتي والاكتشاف الشخصي لها بدون أي مساعد قد يأخذ منك عدة أيام بدون أية نتائج. المظهرالعام للقوالب بسيط، ويمكنك تغييرالألوان فيه وشعارالموقع أيضًا بسهولة. على الرغم من هذه الميّزة، ستلاحظ أنّ بنية مواقع Joomla الهيكلية معقدة. تدعم المنصة عدة لغات مدمجة في الموقع، مثلاً: العربية والإنجليزية والتحويل بينهما، ميّزة ذلك أنها مضمنة في المنصة بدون الحاجة لإضافتها على عكس Wordpress، كما تُعد حل وسط بين wordpress و Drupal فهي تتمتع بالسهولة وتعدد الوظائف.</p><h4 dir="rtl">ايجابياتها:</h4><ul dir="rtl"><li>على الرغم من أنها لا تُشبه Wordpress، إلا أنها مازالت تُعد مرنه وسهلة للاستخدام من قبل المستخدم إلى حدٍ ما.</li><li>كما هو الحال في wordpress، <span style="line-height: 22.3999996185303px; text-align: right;">Joomla</span>   أيضًا لديها مجتمع إلكتروني كبير، وجمهور خاص بها .</li><li>توفر عدد كبير من الملحقات والإضافات.</li></ul><h4 dir="rtl">سلبياتها:</h4><ul dir="rtl"><li>عملية استيراد المقالات من موقع لآخرصعبة ومعقدة. هناك الكثيرمن الإضافات التي تؤدي هذه الوظيفة، ولكن المشكلة تكمن في اختلاف إصدارات المنصة، الذي قد يؤدي إلى حدوث مشاكل كثيرة تتعلق بعدم التوافقية أوالتأثيرعلى نسق المحتوى أوحذف جزءٍ منه.</li><li>استهلاك مصادر وموارد الخادم المُستضاف عليهِ الموقع. هذه المشكلة لم تتحسن في الإصدارات الحديثة حتى آخر إصدار وهو 2.5 الأحدث لها بل على العكس، المشكلة تفاقمت وأصبحت أكثر سوءًا.</li><li>Joomla تقوم بالكثير من التحسينات على منصتها بشكلٍ منتظم، وهذا قد يؤدي لإلغاءِ وتحطيمِ الإصدارات السابقة من الإضافات. عملية الترقية من الإصدارات القديمة إلى الجديدة ليست بالمهمة السهلة، خصوصًا عندما يتعلق الأمر بتنصيب نظام العضويات المعقد أو نظام المنتديات .</li><li>مناسبة للمواقع التالية: المنتديات، المجلات الإلكترونية، مواقع التجارة الإلكترونية متوسطة الحجم.</li></ul><h3 dir="rtl">Tumblr :</h3><p dir="rtl">البعض يعرفها كمنصة للتواصل الإجتماعي، والآخر يعتبرها منصة للتدوين المصغر. لكن القليل هم من يستخدمها بذكاء كموقع الكتروني. إذا كنت تفضل موقع بسيط بلوحة تحكم بسيطة وتواصل مباشر مع جمهورك بخيارات مرنه ف tumblr هي خيارك الأنسب.</p><h4 dir="rtl">ايجابياتها:</h4><ul dir="rtl"><li>تستطيع اختيار نطاق خاص مجانًا.</li><li>بإمكانك استضافة نطاق فرعي على tumblr للمدونة الخاصة بموقعك مثل : blog.yourdomain.com .</li><li>سهلة الإستخدام و لا تحتاج لتدريب.</li><li>تحتوي على ميزة الأسئلة والإجابات من خلال الجمهور.</li><li>لديها تطبيقات للهواتف الذكية، مما يعني قدرة إدارة المحتوى الخاص بك من أي جهاز.</li></ul><h4>سلبياتها:</h4><ul dir="rtl"><li>ليست مناسبه للمواقع ذات الوظائف المتعددة.</li><li>غير مناسبة للمواقع ذات المحتوى الكبير.</li><li>تفتقر للتحكم الكامل بالموقع بسبب استضافتها على خادوم Tumblr.</li><li>مناسبة للمواقع التالية: مواقع نماذج الأعمال، موقع مدونة، موقع لمستقل (إذا كُنتَ مهندسًا أو طبيبًا، فالمنصة تُعد خيارًا مميزًا لنشر معلوماتك وخبراتك وسط جمهورٍ كبير، مع إمكانية التواصل معك وطرح الأسئلة والإستفسارات من قبل الجمهور) .</li></ul><p dir="rtl">بعد أن تعرفت على نظم إدارة المحتوى، هل يعني ذلك إلغاء فكرة البرمجة الخاصة؟ بالطبع لا. نظم إدارة المحتوى وجدت لتوفر علينا الوقت والجهد حسب متطلباتنا، إلا أن إمكانياتها رغم كثرتها وكبر حجمها تبقى محدودة. إذًاً... متى أحتاج لبرمجة الموقع ببرمجة خاصة ؟</p><ul dir="rtl"><li>لبناء نظام موظفين .</li><li>في مواقع البنوك.</li><li>في المواقع  التي تقدم خدمة معينة مثل: مواقع تصميم الإنفوجرافيك.</li><li>أيضًا إذا كنت بحاجة لعمل لوحة تحكم تتوافق مع نظام الشركة و يتعامل معها الموظفين.</li></ul>
]]></description><guid isPermaLink="false">96</guid><pubDate>Wed, 10 Jun 2015 17:15:00 +0000</pubDate></item><item><title>&#x62A;&#x637;&#x648;&#x64A;&#x631; &#x635;&#x641;&#x62D;&#x629; &#x647;&#x628;&#x648;&#x637; (Landing Page)</title><link>https://academy.hsoub.com/programming/general/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%B5%D9%81%D8%AD%D8%A9-%D9%87%D8%A8%D9%88%D8%B7-landing-page-r78/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_05/landing-page-code.png.369b9061bda2006daffa3e4170e5c737.png" /></p>

<div id="wmd-preview-section-16"><p>في المقال الأول تكلمنا حول <a href="http://academy.hsoub.com/marketing/inbound-marketing/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%87%D8%A8%D9%88%D8%B7-landing-pages-%D9%88%D9%85%D9%83%D9%88%D9%91%D9%86%D8%A7%D8%AA%D9%87%D8%A7-r23/">أساسيات صفحات الهبوط</a>، وفي المقال الثاني <a href="http://academy.hsoub.com/design/graphic-design/photoshop/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%B5%D9%81%D8%AD%D8%A9-%D9%87%D8%A8%D9%88%D8%B7-landing-page-r41/">صممنا صفحة هبوط في Photoshop</a> باستخدام ما تعلمانه، الآن سنكمل ما بدأنا به ببناء صفحة الهبوط فعليا، سنمر على كل المراحل إنطلاقا من توزيع الملفات إلى صفحة جاهزة، هيا لننطلق.</p><p>يمكنك تحميل <a class="ipsAttachLink" href="http://academy.hsoub.com/applications/core/interface/file/attachment.php?id=2004">الشِفرة المصدرية لهذا الدرس</a> لمعاينة النتيجة النهائية. وهذا تذكير بواجهة الصفحة:</p><p style="text-align: center;" href="https://academy.hsoub.com/uploads/monthly_2015_05/landing-page.png.fe45081a488343dd572ae5c8c972a487.png"><img data-fileid="1985" class="ipsImage ipsImage_thumbnailed" alt="landing-page.thumb.png.f649d7622729e75b2" style="box-sizing: border-box; vertical-align: middle; height: auto; max-height: 100%; padding: 1px; border-radius: 3px; color: rgb(168, 100, 171); font-family: 'Droid Arabic Naskh', 'Open Sans', 'Helvetica Neue', Helvetica, Tahoma, Arial, sans-serif; font-size: 16px; line-height: 32px; text-align: center; border: 1px solid rgb(226, 226, 226) !important;" src="https://academy.hsoub.com/uploads/monthly_2015_05/landing-page.thumb.png.f649d7622729e75b2a474e2727e698e8.png"></p></div><div id="wmd-preview-section-17"><h2 id="الأساسيات">الأساسيات</h2><p>في البداية سنقوم بتوضيح ما سنقوم باستخدامه ولماذا سنستخدمه.</p><ul><li>أولا، لدينا الصور التي حصلنا عليها من <a href="http://academy.hsoub.com/design/graphic-design/photoshop/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%B5%D9%81%D8%AD%D8%A9-%D9%87%D8%A8%D9%88%D8%B7-landing-page-r41/">ملف PSD الذي قمنا بتصميمه في درس التصميم</a>، فلنستخدمها.</li><li>لن نستخدم خط أيقونات لسبب وجيه وهو أنها ستكون مضيعة وقت وبدون فائدة فعلية فالصفحة مجرد صفحة واحدة لذا لا يوجد الكثير لنقلق بشأنه (بشأن عدد طلبات HTTP كمثال).</li><li>سنستخدم هيكلة <a rel="external nofollow" href="http://www.h5bp.io/">HTML5 Boilerplate</a> وهو هيكل عمل مصغر لبناء صفحات HTML حيث يحتوي على تقسيم مجلدات ممتاز، ويوزدك ببعض الملفات المهمة مثل .htaccess و ملف index كامل يحتوي على كل شيء تحتاجه.</li><li>سنستعمل بعض إضافات إطار عمل Bootstrap، وهم:<ul><li> <a rel="external nofollow" href="http://getbootstrap.com/javascript/#affix">Affix</a> من أجل تثبيت قائمة التصفح عند النزول.</li><li>إضافة <a rel="external nofollow" href="http://getbootstrap.com/javascript/#scrollspy">Scrollspy</a> من أجل تغيير لون الأيقونات كلما ممرنا على مرحلة.</li></ul></li><li>سنستخدم إضافة Owl carousel 2.0 من أجل جزء الشهادات، إذا كنت تملك إضافة أخرى فأنت حر باستخدامها.</li><li>سنستعمل موقع <a rel="external nofollow" href="https://tinypng.com/">TinyPNG</a> من أجل ضغط الصور التي حصلنا عليها من ملف PSD.</li><li>سنستخدم موقع <a rel="external nofollow" href="https://everythingfonts.com/otf-to-woff">Everything Font</a> من أجل تحويل خط Cocon إلى نسخة الويب (woff) حتى نستخدمها.</li></ul></div><div id="wmd-preview-section-18"><h2 id="تقسييم-الملفات">تقسييم الملفات</h2><p>سيكون تقسيمنا للملفات على الشكل التالي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">project/
├── css/
│   ├── main.css
│   ├── normalize.css
│   └── owl.carousel.css
├── fonts/
│   └── CoconNextArabicLight.woff
├── js/
│   ├── main.js
│   └── vendors/
│       ├── bootstrap.min.js
│       ├── jquery-1.11.2.min.js
│       └── owl.carousel.min.js
├── img/
├── index.html
└── favicon.ico</pre><p>عند تحميل إطار عمل H5BP فإنه يزودنا بالتقسييم بالتالي بشكل افتراضي، ما قمنا به نحن هو إضافة بعض الملفات في بعض الأماكن فحسب، مجلد img يحتوي على الصور التي حصلنا عليها من المرحلة السابقة عبر استخراجها من فوتوشوب، كما قمنا بإضافة bootstrap.js الذي يحتوي على كلٍ من affix وscrollspy. <br>وقمنا بحذف بعض الملفات مثل modernizer وhtml5shiv لأننا لن ندعم المتصفحات القديمة.</p></div><div id="wmd-preview-section-19"><h2 id="البداية">البداية</h2><p>حسنا، نحتاج إلى أن نعد بعض الأمور قبل أن نبدأ، بعد تحميل كامل المكتبات المطلوبة نستطيع البدأ بإعداد بعض الأمور.</p><p>نحن نملك <a href="http://academy.hsoub.com/applications/core/interface/file/attachment.php?id=1986">خط Cocon</a> بصيغة سطح المكتب (ttf). لا ضرر في هذه الصيغة إطلاقا، هي تعمل بشكل ممتاز في المتصفحات، ولكننا نستطيع تقليل الحجم إلى النصف عبر تحويل الخط إلى صيغة woff المخصصة للويب وذلك عبر موقع <a rel="external nofollow" href="https://everythingfonts.com/otf-to-woff">التحويل</a> (ستجد الخط محولا في <a class="ipsAttachLink" href="http://academy.hsoub.com/applications/core/interface/file/attachment.php?id=2004">الشفرة المصدرية لهذا الدرس</a>). </p><p>نحتاج إلى ضغط الصور، هناك فائدة عظيمة نكسبها هنا، <a rel="external nofollow" href="https://tinypng.com/">موقع TinyPNG</a> سيقوم بتقليل حجم الصور إلى أكثر 70% مع الحفاظ على الجودة، وهذا حجم ممتاز لذلك سنقوم بذلك أيضا.</p><p>الآن سنعد بعض الأمور الابتدائية في ملف CSS:</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">@import url(owl.carousel.css);

@font-face {
    font-family: Cocon;
    src: url(../fonts/CoconNextArabicLight.woff) format('woff');
}

*, *:before, *:after {
    box-sizing: border-box;
}

body {
    font-family: cocon, sans-serif;
    background: #fff;
    position: relative;
}</pre><ul><li>سنقوم باستدعاء ملف <span style="font-family:courier new,courier,monospace;">owl.carousel</span> من أجل تأثيرات الحركة في السكربت، سنقوم بإدراج <a style="line-height: 22.3999996185303px;" href="http://academy.hsoub.com/applications/core/interface/file/attachment.php?id=1986">خط Cocon</a> للاستخدام، سنستعمل <span style="font-family:courier new,courier,monospace;">box-sizing</span> من أجل احتواء العناصر بشكل أفضل. </li><li>سنضيف بعض الأمور الافتراضية لوسم <span style="font-family:courier new,courier,monospace;">body</span>. </li><li>مكتبة <span style="font-family:courier new,courier,monospace;">scrollspy</span> تحتاج إلى أن يكون وسم body بخاصية <span style="font-family:courier new,courier,monospace;">position:relative</span> من أجل أن تعمل.</li></ul></div><div id="wmd-preview-section-20"><h2 id="هيكلة-الصفحة">هيكلة الصفحة</h2><p>في سابق الأمر، كنُت قد خططت لبناء الصفحة عبر إطار عمل Bootstrap المعروف، وسبق وقلت هذا في المقال السابق، ولكني تراجعت عن الأمر لقلة الفوائد مقارنة بالسيئات، ووجدتها فرصة حسنة لاستخدام Flex module والتكلم عنه أكثر.</p><p>أما بخصوص Bootstrap فلدي آرائي حوله، من بينها أنّه إطار مناسب تماما لإطلاق المشاريع بسرعة من أجل التجريب (لاحظ الاسم Bootstrap) كما أنّه إطار مناسب لبناء المشاريع الداخلية حيث لن يتم إطلاق المشروع لجمهور فعلي، إلا إذا كنت تنوي تخصيصه حتى النخاع فتغير مظهره، فذلك شأنك.</p><p>الصفحة مكونة من 6 أجزاء أساسية: </p><ol><li>رأس الصفحة.</li><li>روابط التصفح عبر الصفحة.</li><li>مميزات التطبيق.</li><li>الاقتباسات (أو الشهادات).</li><li>الأرقام (أو التحليلات).</li><li>التحميل والمشاركة.</li></ol><p>والهيكة الأساسية ستكون كالتالي:</p><pre data-pbcklang="html" data-pbcktabsize="" class="html ipsCode prettyprint">&lt;header class="l-header"&gt;
  &lt;div class="l-app-preview"&gt;
  &lt;/div&gt;
  &lt;div class="l-page-fold"&gt;
  &lt;/div&gt;
&lt;/header&gt;&lt;!-- .l-header --&gt;

&lt;nav class="l-sticky-nav"&gt;
  &lt;div class="sticky-nav"&gt;
  &lt;/div&gt;&lt;!-- sticky-nav --&gt;
&lt;/nav&gt;&lt;!-- l-sticky-nav --&gt;

&lt;article id="features-section"&gt;
  &lt;section class="l-app-feature"&gt;
  &lt;/section&gt;
&lt;/article&gt;&lt;!-- #features-section --&gt;

&lt;article id="testimonials-section"&gt;
&lt;/article&gt;&lt;!-- #testimonials-section --&gt;

&lt;article id="analysicts-section"&gt;
&lt;/article&gt;&lt;!-- #analysicts-section --&gt;

&lt;article id="download-section"&gt;
&lt;/article&gt;&lt;!-- #download-section --&gt;</pre><p>قمنا بتقسييم كل جزء من الصفحة إلى وسم article مستقل (ما عدى روابط التصفح ورأس الصفحة حيث يملكان وسوما افتراضية خاصة بهم من قبل).</p><p>قمنا بتقسييم رأس الصفحة إلى جزئين، الأول سيحتوي بداخله صورة واجهة التطبيق، أما الثاني فسيحتوي على العنوان إلى جانب السطر الرئيسي وزر التحميل.</p><p>روابط التصفح تملك جزئين، حاوي رئيسي وحاوي الروابط، وهناك سبب وجيه لهذا التكرار، بحيث عندما يتم تفعيل تثبيت الروابط على أعلى الشاشة، نرى أن يبقى هناك مكان فارغ (في المكان السابق الذي كانت الروابط موجودة فيه) حيث لا يحدث اختلال في الصفحة، الجزء المسؤول عن هذا سيكون l-sticky-nav، أيضا لاحظوا أنّ كل الروابط التي تحتوي على حرف L قبل اسمها (اختصارا لـ layout) ستكون مسؤولة عن الهيكلة بشكل خاص.</p></div><div id="wmd-preview-section-21"><h2 id="رأس-الصفحة">رأس الصفحة</h2><pre data-pbcklang="html" data-pbcktabsize="" class="html ipsCode prettyprint">&lt;header class="l-header"&gt;
  &lt;div class="l-app-preview"&gt;
    &lt;img src="img/home-screen.png" alt=""&gt;
  &lt;/div&gt;
  &lt;div class="l-page-fold"&gt;
    &lt;h1 class="display-title"&gt;اكتشف أشخاصا بنفس اهتماماتك&lt;/h1&gt;
    &lt;p class="display-content"&gt;تعرف على أشخاص يشاركونك الهوايات والاهتمامات شارك، اقرء، وتواصل مع الجميع عبر تطبيق اهتمامات&lt;/p&gt;
      &lt;a href="" class="display-badge"&gt;
        &lt;img src="img/badge.png" alt="حمل من متجر التطبيقات"&gt;
      &lt;/a&gt;
  &lt;/div&gt;
&lt;/header&gt;&lt;!-- .l-header --&gt;</pre><p>كان ذلك هو رأس الصفحة، بكل بساطة وكما أشدنا سابقا، الآن حان وقت إضافة بعض CSS له.</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.l-header {
    display: flex;
    justify-content: center;
    align-items: center;

    width: 100%;
    min-height: 100vh;/* used to make sure the header will cover the screen */
    position: relative;
    padding: 48px 0; /* سيعطي هذا بعض المساحة للشاشات الصغيرة حيث المحتوى أكبر من ارتفاع الشاشة */

    background: url(../img/background.png) center center no-repeat;
    background-attachment: fixed;
    background-size: cover;
}</pre><p>الشفرة المصدرية مقسمة لثلاث أجزاء، كل جزء له مهمته المعينة.</p><p>الجزء الأول مسؤول عن هيكلة رأس الصفحة، نحن نطلب منه أن يستخدم <span style="font-family:courier new,courier,monospace;">flex</span> كنظام للهيكلة عبر <span style="font-family:courier new,courier,monospace;">display:flex</span> وأن يقوم بوضع جميع العناصر في منتصف الصفحة أفقيا عبر <span style="font-family:courier new,courier,monospace;">justify-content:center</span> والواقع أنها تقبل العديد من الخيارات الأخرى، منها <span style="font-family:courier new,courier,monospace;">flex-start</span> التي تضع جميع العناصر في بداية الصفحة (اليمين في حالة العربية، أو اليسار في حالة اللاتينية، لكن الأمر لا علاقة له باتجاه الصفحة في واقع الأمر، بل باتجاه ترتيب العناصر عبر خاصية <span style="font-family:courier new,courier,monospace;">flex-direction</span> التي تقبل 4 خيارات وهي ترتيب العناصر بشكل أفقي من بداية الصفحة لنهايتها عبر <span style="font-family:courier new,courier,monospace;">row</span> ومن نهاية الصفحة إلى بدايتها عبر <span style="font-family:courier new,courier,monospace;">row-reverse</span> أو من أعلى الصفحة إلى أسفلها عبر <span style="font-family:courier new,courier,monospace;">column</span> أو العكس عبر <span style="font-family:courier new,courier,monospace;">column-reverse</span> وسنتكلم عن هذا لاحقا) أو خيار <span style="font-family:courier new,courier,monospace;">flex-end</span> الذي يقوم بالعكس، والخياران اللذان ستستخدمها كثيرا وهما <span style="font-family:courier new,courier,monospace;">space-around</span> حيث يتم توزيع المساحة بين العناصر بالتساوي (وبالتالي في المنتصف ولكن مع مساحة بينهم وقبلهم وبعدهم) و <span style="font-family:courier new,courier,monospace;">space-between</span> والتي تقوم بتوزيع المساحة بين العناصر بدون إضافة مساحة قبل العناصر وبعدهم (أيّ يتم تركيز كامل المساحة في المنتصف). الخيار الثالث يقول أننا نريد أن نضع العناصر في المنتصف عموديا وذلك عبر <span style="font-family:courier new,courier,monospace;">align-items:center</span> والواقع أنّ الخاصية تملك أيضا خيارات كثيرة لا متسع لنا لشرحها كاملة الآن لأنها تحتاح لشرح بالصور في الغالب، ومنها<span style="font-family:courier new,courier,monospace;"> flex-start</span> التي تضع العناصر أعلى الصفحة (أو بالأحرى حسب الطريقة التي تم تحديد اتجاه المحور العمودي فيها عبر <span style="font-family:courier new,courier,monospace;">flex-direction</span> كما بيّنا سابقا).</p><p>الجزء الثاني، هو مسؤول عن جعل حجم رأس الصفحة بكامل أبعاد الشاشة، نستطيع جعله بكامل عرض الشاشة عبر <span style="font-family:courier new,courier,monospace;">width:100%</span> أو بالمثل عبر <span style="font-family:courier new,courier,monospace;">width:100vw</span> لا فرق بينهم لأنّ حاوي رأس الصفحة نفسه بكامل عرض الصفحة، تبقى المشكلة في الارتفاع، تحديد 100% لن ينفع وتحديد رقم معين لن ينفع إطلاقا مع كل الشاشات، الحل الوحيد هو استخدام وحدة القياس الجديدة vh والتي تقيم أبعاد الشاشة وليس العناصر، بحيث 100vh تعني كامل ارتفاع الشاشة.</p><p>في الجزء الثالث سنقوم بإضافة خلفية، وضعها في المنتصف، نعطيها خاصية cover حتى تتمدد (مع المحافظة على الأبعاد ratio) على حسب الشاشة.</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.l-header:before {
    content: "";
    position: absolute;
    top: 0;
    right: 0;
    height: 100%;
    width: 100%;
    background-color: rgba(0,0,0,0.64);
}</pre><p>هذا الجزء مسؤول عن إضافة تأثير السواد فوق الصورة، البعض يقوم بإضافة عنصر (div) آخر داخل رأس الصفحة من أجل تحقيق هذا، ولكن هذا الحل أكثر نظافة، لاشيء فعلي لنشرحه هنا عدى أنّ عدم إدراج خاصية content (حتى ولو كانت فارغة) سيجعل الشفرة المصدرية السابقة غير فعالة، فأشباه الأصناف (pseudo-classes) لا تعمل بدونه.</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.l-app-preview,
.l-page-fold {
    width: 50%;
    z-index: 10;
    position: relative; /* نحتاج إلى هذا الجزء لأن خاصية z-index لا تعمل مع static */
}</pre><p>هنا نقوم بإعطاء كل جزء منهم 50% من عرض الحاوي الخاص بهم، حتى يتم توزيع المحتوى بشكل عادل، خاصية z-index حتى نتأكد من أنّ المحتوى فوق تأثير السواد على الخلفية (لن يشكل هذا مشكلة في الأغلب لأننا استخدمنا شبه صنع before الذي سيضعه قبل العناصر أصلا). <br>خاصية position:relative تم وضعها من أجل z-index لأنّه لا يعمل بدون تحديدها (في الواقع هو يعمل مع الجميع عدى static أيّ القيمة الافتراضية).</p><p>مع إضافة بعض التأثيرات على العنوان، والقيام بتوسيط الصفحة، نخرج بهذه الشِفرة:</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.l-header {
    display: flex;
    justify-content: center;
    align-items: center;
    width: 100%;
    min-height: 100vh;
    position: relative;
    padding: 48px 0;
    background: url(../img/background.png) center center no-repeat;
    background-attachment: fixed;
    background-size: cover;
}

.l-header:before {
    content: "";
    position: absolute;
    top: 0;
    right: 0;
    height: 100%;
    width: 100%;
    background-color: rgba(0,0,0,0.64);
}

.l-app-preview,
.l-page-fold {
    width: 50%;
    z-index: 10;
    position: relative;
}

.l-app-preview img {
    display: block;
    margin: 0 auto;
}

.l-page-fold {
    padding-left: 24px;
}

.display-title {
    color: #fff;
    font-size: 55px;
    line-height: 1.2;
    margin-bottom: 36px;

}

.display-content {
    color: #fff;
    font-size: 28px;
    line-height: 1.7;
    margin-bottom: 128px;
}</pre><p>تاليا سنعمل على روابط التصفح</p></div><div id="wmd-preview-section-22"><h2 id="روابط-التصفح">روابط التصفح</h2><p>الهيكلة كالتالي:</p><pre data-pbcklang="html" data-pbcktabsize="" class="html ipsCode prettyprint">&lt;nav class="l-sticky-nav"&gt;
    &lt;div class="sticky-nav"&gt;
        &lt;div class="nav-element"&gt;
            &lt;a href="#features-section" class="nav-element--link active"&gt;
                &lt;img src="img/equalizer.png" alt="" class="nav-element--image"&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="nav-element"&gt;
            &lt;a href="#testimonials-section" class="nav-element--link"&gt;
                &lt;img src="img/id.png" alt="" class="nav-element--image"&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="nav-element"&gt;
            &lt;a href="#analysicts-section" class="nav-element--link"&gt;
                &lt;img src="img/globe.png" alt="" class="nav-element--image"&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="nav-element"&gt;
            &lt;a href="#download-section" class="nav-element--link"&gt;
                &lt;img src="img/download.png" alt="" class="nav-element--image"&gt;
            &lt;/a&gt;
        &lt;/div&gt;
    &lt;/div&gt;&lt;!-- sticky-nav --&gt;
&lt;/nav&gt;&lt;!-- l-sticky-nav --&gt;</pre><p>لاشيء لشرحه، هيا لنطلع على شِفرة CSS:</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.l-sticky-nav {
    margin-bottom: 128px; /* هذا الجزء منفصل عن روابط التحكم، بالأحرى عندما تلتصق الروابط في أعلى الشاشة سيبقى هذا في مكانه */
}

.l-sticky-nav.fixed {
    padding: 50px; /* عندما يتم تثبيت التثبيت على روابط التصفح، سيبقى هذا في مكانه حتى لا تختل المساحة */
}</pre><p>سنعطي الحاوي الأول بعض المساحة في الأسفل، أيضا عندما يتم تثبيت الروابط سيصبح l-sticky-nav فارغا وبالتالي يكون ارتفاعه 0، مما يلغي فائدته، لذا في تلك الحالة سنجعل ارتفاعه 100px.</p><p>الآن بالنسبة للحاوي الثاني:</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.sticky-nav {
    display: flex;
    justify-content: space-around;
    flex-wrap: wrap;
    padding: 24px;
    background-color: #fff;
    box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.1);
}</pre><p>خاصية flex-wrap تحدد هل سيقوم الحاوي بوضع كامل العناصر في سطر واحد (عبر إعطائه no-wrap أيضا الخاصية الافتراضية) أو بوضع العناصر في سطر جديد إن لم يكن هناك متسع من المكان (عبر wrap)، عدى هذا كل شيء واضح، نقوم بتوسيط العناصر فحسب.</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.sticky-nav.affix {
    top: 0;
    right: 0;
    width: 100%;
    z-index: 10;
    position: fixed;
}</pre><p>الآن عند تفعيل التثبيت سيتم (عبر Javascript) إضافة class إلى الحاوي الثاني، إنطلاقا منه سنقوم بتحديد ما نريده، وهو تثبيت العناصر في أعلى الشاشة، لكن في العلم أنّه عند إضافة خاصية fixed فالعنصر يخرج من نسق الصفحة، وشيء آخر وهو أنّ خاصية <span style="font-family:courier new,courier,monospace;">display:block</span> لا تفيد بشيء حينها، لذا العنصر لن يأخذ كامل المساحة الأفقية التي يجدها (width:100%) بل يأخذ ما يحتاجه فحسب، لذا علينا تحديد الأمر بأنفسنا.</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.nav-element--image {
    filter: grayscale(100%);
    -webkit-filter: grayscale(100%);
    transition: all 200ms ease-out;
}

.nav-element--link.active .nav-element--image,
.nav-element--link:hover .nav-element--image {
    filter: grayscale(0);
    -webkit-filter: grayscale(0);
}</pre><p>نقوم بتحويل جميع الأيقونات إلى الرمادي عدى الأيقونات المفعلة (.active) أو التي يكون المؤشر فوقها.</p><p>وهكذا نكون انتهينا من جزء آخر، الدور على جزء مميزات التطبيق.</p></div><div id="wmd-preview-section-23"><h2 id="مميزات-التطبيق">مميزات التطبيق</h2><p>الهيكلة كالتالي:</p><pre data-pbcklang="html" data-pbcktabsize="" class="html ipsCode prettyprint">&lt;article id="features-section"&gt;
    &lt;section class="l-app-feature"&gt;
        &lt;div class="app-feature-preview"&gt;
            &lt;img src="img/feature-1.png" alt="" class="app-feature-image"&gt;
        &lt;/div&gt;
        &lt;div class="app-feature-content"&gt;
            &lt;h2 class="app-feature-title"&gt;أضف، تابع، وتواصل مع من تشاركه الاهتمام&lt;/h2&gt;
            &lt;p class="app-feature-text"&gt;أضف إلى قائمة أصدقائك من تجدهم يشاركونك نفس الاهتمام، صنف أصدقائك على حسب اهتماماتك، وتواصل مباشرة معهم&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;
    &lt;section class="l-app-feature"&gt;
        &lt;div class="app-feature-preview"&gt;
            &lt;img src="img/feature-2.png" alt="" class="app-feature-image"&gt;
        &lt;/div&gt;
        &lt;div class="app-feature-content"&gt;
            &lt;h2 class="app-feature-title"&gt;شارك ما تجده مميزا، وعبر عن رأيك&lt;/h2&gt;
            &lt;p class="app-feature-text"&gt;أكتب المقالات لتشاركها مع دائرة أصدقائك، وأقرء مقالات الجديدة أو اكتشف اهتمامات جديدة&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;
    &lt;section class="l-app-feature"&gt;
        &lt;div class="app-feature-preview"&gt;
            &lt;img src="img/feature-3.png" alt="" class="app-feature-image"&gt;
        &lt;/div&gt;
        &lt;div class="app-feature-content"&gt;
            &lt;h2 class="app-feature-title"&gt;ابني حسابك الشخصي، وأحصل على متابعين&lt;/h2&gt;
            &lt;p class="app-feature-text"&gt;ابني حسابك الشخصي الخاص، شارك صورك وسيرتك، ودع الناس يقومون بمتابعتك&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;
&lt;/article&gt;&lt;!-- #features-section --&gt;</pre><p>تم تقسييم كل جزء إلى section خاص به يحتوي بدوره على قسمين، واحد للصورة وواحد للعنوان والشرح، الأمر شبيه تماما برأس الصفحة، في الواقع سيعمل بنفس مفهوم رأس الصفحة.</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.l-app-feature {
    display: flex;
    justify-content: center;
    align-items: center;

    padding: 128px 0;
}
    .l-app-feature:nth-child(even) {
        flex-direction: row-reverse;
        background: #13191C;
    }
        .l-app-feature:nth-child(even) .app-feature-title,
        .l-app-feature:nth-child(even) .app-feature-text {
            color: white;
        }</pre><p>الشيء الوحيد الجديد هنا هو (nth-child(even نحن هنا نقوم بتحديد كل العناصر التي تكون رتبتها رقما زوجيا (الثاني والرابع والسادس، يمكن أيضا القيام بالأمر عبر تمرير 2n+2 بدل evenمن أجل نفس النتيجة، في الواقع تستطيع تمرير أي معادلة من الشكلة an+b من أجل استهداف العناصر التي تريدها) قمنا بتمرير flex-direction:row-reverse من أجل عكس اتجاه المحور الأفقي حتى تبدأ العنصر من الاتجاه المعاكس، هذا سيجعل الصورة على اليسار والمحتوى على اليمين. وهذه كامل الشِفرة</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.l-app-feature {
    display: flex;
    justify-content: center;
    align-items: center;

    padding: 128px 0;
}
    .l-app-feature:nth-child(even) {
        flex-direction: row-reverse;
        background: #13191C;
    }
        .l-app-feature:nth-child(even) .app-feature-title,
        .l-app-feature:nth-child(even) .app-feature-text {
            color: white;
        }
.app-feature-preview,
.app-feature-content {
    width: 50%;
    max-width: 600px;
}

.app-feature-preview img {
    display: block;
    margin: 0 auto;
}

.app-feature-title {
    font-size: 36px;
    color: #f85940;
    margin-bottom: 36px;
}

.app-feature-text {
    font-size: 28px;
    color: rgba(30,30,30,.9);
    line-height: 1.7;
}</pre></div><div id="wmd-preview-section-24"><h2 id="جزء-الشهادات">جزء الشهادات</h2><p>في هذا الجزء قمنا باستخدام carousel من أجل عرض الشهادات والهيكلة كانت كالتالي:</p><pre data-pbcklang="html" data-pbcktabsize="" class="html ipsCode prettyprint">&lt;article id="testimonials-section"&gt;
    &lt;h1 class="section-title"&gt;فلنسمع رأي البقية&lt;/h1&gt;
    &lt;section class="testimonials-carousel"&gt;
        &lt;div class="testimonial-item"&gt;
            &lt;div class="testimonial-text"&gt;أتمنى لو كان هذا التطبيق موجودا قبل سنة&lt;/div&gt;
            &lt;div class="testimonial-avatar"&gt;&lt;img src="img/face-1-128.png" alt="" class="testimonial-image"&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/section&gt;
&lt;/article&gt;&lt;!-- #testimonials-section --&gt;</pre><p>أضفنا عنوانا، إلى جانب وضع الشهادات في حاوي خاص بهم من أجل تحديده عبر Javascript، ثم وضعنا لكل شهادة حاوي خاص بها testimonial-text يحتوي على محتوى الشهادة بالإضافة إلى صورة.</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.testimonial-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 24px 0;
    margin-bottom: 48px;
}</pre><p>هيكلة كل عنصر يتكون بسيطة، استخدما flex-direction:column لترتيب العناصر عموديا، كما استخدما align-items:center لتوسيط العناصر أفقيا (لاحظ أننا استخدمناها سابقا لتوسيط العناصر عموديا، ولكن لأن محور الترتيب اختلف الآن فهي ترتب العناصر أفقيا إلى الوسط)</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.testimonial-text:before,
.testimonial-text:after {
    font-size: 48px;
    display: inline-block;
    padding: 0 16px;
}
.testimonial-text:before {
    content: "”";
}
.testimonial-text:after {
    content: "“";
}</pre><p>قمنا هنا بإضافة علامتي تنصيص قبل وبعد الشهادة، قمنا بتكبير حجمهما ووضع بعض الفراغ بينهما وبين الشهادة.</p><p>OwlCarousel (السكربت المستخدم من أجل عرض الشهادات) يعطينا أزرار التصفح بين الشهادات (على شكل نقاط) ولكنها بدون أيّ تأثير لذا سنقوم بذلك يدويا</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.owl-dots {
    text-align: center;
}

.owl-dot {
    height: 16px;
    width: 16px;
    border: 2px solid #E4523B;
    border-radius: 50%;
    display: inline-block;
    margin: 0 4px;
}

.owl-dot.active {
    background: #E4523B;
}</pre></div><div id="wmd-preview-section-25"><h2 id="تحليلات-الأرقام">تحليلات الأرقام</h2><p>يحين وقت أرقام التحليلات، من أجل إطفاء التغيير وإضافة التركيز قمنا بإضافة خلفية لهم، هيكلة الجزء كانت كالتالي:</p><pre data-pbcklang="html" data-pbcktabsize="" class="html ipsCode prettyprint">&lt;article id="analysicts-section"&gt;
    &lt;h1 class="section-title section-title__white"&gt;بعض الأرقام&lt;/h1&gt;
    &lt;div class="l-analysicts"&gt;
        &lt;div class="analysicts-item"&gt;
            &lt;div class="item-image"&gt;
                &lt;img src="img/articles.png" alt=""&gt;
            &lt;/div&gt;
            &lt;h1 class="item-number"&gt;320&lt;/h1&gt;
            &lt;h2 class="item-title"&gt;مقالة نشرت&lt;/h2&gt;
        &lt;/div&gt;
        &lt;div class="analysicts-item"&gt;
            &lt;div class="item-image"&gt;
                &lt;img src="img/groups.png" alt=""&gt;
            &lt;/div&gt;
            &lt;h1 class="item-number"&gt;57&lt;/h1&gt;
            &lt;h2 class="item-title"&gt;مجموعة أنشئت&lt;/h2&gt;
        &lt;/div&gt;
        &lt;div class="analysicts-item"&gt;
            &lt;div class="item-image"&gt;
                &lt;img src="img/users.png" alt=""&gt;
            &lt;/div&gt;
            &lt;h1 class="item-number"&gt;+8000&lt;/h1&gt;
            &lt;h2 class="item-title"&gt;عضو مُسجل&lt;/h2&gt;
        &lt;/div&gt;
        &lt;div class="analysicts-item"&gt;
            &lt;div class="item-image"&gt;
                &lt;img src="img/upload.png" alt=""&gt;
            &lt;/div&gt;
            &lt;h1 class="item-number"&gt;450&lt;/h1&gt;
            &lt;h2 class="item-title"&gt;ملف رفع&lt;/h2&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/article&gt;&lt;!-- #analysicts-section --&gt;</pre><p>منطق الهيكلة شبيهة بهيكلة مميزات التطبيق والشِفرة والتقسييم كانا بسيطان إلى أقصى حد:</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">#analysicts-section {
    position: relative;
    padding: 48px 0;
    margin: 48px 0;

    background: url(../img/numbers-background.png) center center no-repeat;
    background-attachment: fixed;
    background-size: cover;
}

.l-analysicts {
    display: flex;
    justify-content: space-around;
    flex-wrap: wrap;
}

.analysicts-item {
    text-align: center;
    color: white;
}</pre></div><div id="wmd-preview-section-26"><h2 id="جزء-التحميل-والمشاركة">جزء التحميل والمشاركة</h2><p>هذا الجزء بسيط إلى أقصى حد، عنوان بسيط مع زر للتحميل و 4 أزرار للدلالة على شبكات التطبيق الاجتماعية</p><pre data-pbcklang="html" data-pbcktabsize="" class="html ipsCode prettyprint">&lt;article id="download-section"&gt;
    &lt;h1 class="section-title"&gt;إذا، هل قررت الانضمام؟&lt;/h1&gt;
    &lt;div class="cta-button"&gt;&lt;img src="img/badge.png" alt=""&gt;&lt;/div&gt;
    &lt;div class="l-social-links"&gt;
        &lt;a href="" class="social-link"&gt;
            &lt;img src="img/facebook.png" alt="شارك في Facebook"&gt;
        &lt;/a&gt;
        &lt;a href="" class="social-link"&gt;
            &lt;img src="img/twitter.png" alt="شارك في Twitter"&gt;
        &lt;/a&gt;
        &lt;a href="" class="social-link"&gt;
            &lt;img src="img/pinterest.png" alt="شارك في Pinterest"&gt;
        &lt;/a&gt;
        &lt;a href="" class="social-link"&gt;
            &lt;img src="img/google.png" alt="شارك في Google+"&gt;
        &lt;/a&gt;
    &lt;/div&gt;
&lt;/article&gt;
</pre><p>وبنفس البساطة أيضا</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.cta-button {
  margin: 36px 0;
  text-align: center;
  display: block;
}

.l-social-links {
  display: flex;
  justify-content: space-around;
  padding: 48px 0 64px;
}</pre></div><div id="wmd-preview-section-27"><h2 id="جافاسكربت">Javascript</h2><p>حان الوقت لإضافة Javascript إلى الصفحة، سنبدأ بإضافة Affix لروابط التصفح من أجل تثبيتهم.</p><p>تنويه: في عالم مثالي كنا لنستخدم <span style="font-family:courier new,courier,monospace;">position:sticky</span> لتقوم بالمهمة لنا، للأسف المتصفح الوحيد الذي يدعمها هو فيرفوكس، متصفح chrome كان يدعمها من قبل ولكنهم أزالوا الدعم في الوقت الحالي، لذا affix يعتبر أشبه بـِ polyfill.</p><p>لدينا الشِفرة التالية التي سيتقوم بكل شيء لنا:</p><pre data-pbcklang="javascript" data-pbcktabsize="" class="javascript ipsCode prettyprint">$('.sticky-nav').affix({
  offset: {
    top: $('.l-header').outerHeight()
  }
});
$('.sticky-nav').on('affix.bs.affix', function () {
    $('.l-sticky-nav').addClass('fixed');
});
$('.sticky-nav').on('affixed-top.bs.affix', function () {
    $('.l-sticky-nav').removeClass('fixed');
});</pre><p>نقوم بتفعيل السكربت عبر إضافته إلى <span style="font-family:courier new,courier,monospace;">sticky-nav</span> ثم نقوم بتحديد offset والذي يعني متى يتم تفعيل السكربت، نحن نريده أن يتفعل حالما يتم المرور عليه، نريد حساب كامل المسافة التي فوقه، وتلك المسافة ستكون حجم رأس الصفحة، لذا نضيفها عبر <span style="font-family:courier new,courier,monospace;">()outerHeight</span> التي تحسب الارتفاع الخارجي (من ضمنه padding).</p><p>ثانيا نقوم بالاستماع إلى بعض الأحداث (events) والسكربت يوفر لنا 4 أحداث، سنستخدم اثنين فحسب، أول حدث ينطلق عندما يتم تفعيل السكربت مباشرة، وفي تلك اللحظة نضيف fixed إلى الحاوي من أجل أن يستغل المكان، تاليا نستمع للحدث الثاني والذي ينطلق حالما يتم إزالة السكربت (عند الرجوع للحالة العادية) في تلك اللحظة سنزيل fixed عن الحاوي ليعود إلى طبيعته.</p><p>الآن سنتجه إلى scrollspy وهي تملك شروطا أكثر ازعاجا، مثل أنّها تعمل مع عناصر bootstrap فحسب لذا سنقوم ببعض التعديل في HTML و CSS أولا.</p><pre data-pbcklang="html" data-pbcktabsize="" class="html ipsCode prettyprint">&lt;nav class="l-sticky-nav"&gt;
    &lt;ul class="nav sticky-nav"&gt;
        &lt;li class="nav-element"&gt;
            &lt;a href="#features-section" class="nav-element--link active"&gt;
                &lt;img src="img/equalizer.png" alt="" class="nav-element--image"&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li class="nav-element"&gt;
            &lt;a href="#testimonials-section" class="nav-element--link"&gt;
                &lt;img src="img/id.png" alt="" class="nav-element--image"&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li class="nav-element"&gt;
            &lt;a href="#analysicts-section" class="nav-element--link"&gt;
                &lt;img src="img/globe.png" alt="" class="nav-element--image"&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li class="nav-element"&gt;
            &lt;a href="#download-section" class="nav-element--link"&gt;
                &lt;img src="img/download.png" alt="" class="nav-element--image"&gt;
            &lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;&lt;!-- sticky-nav --&gt;
&lt;/nav&gt;&lt;!-- l-sticky-nav --&gt;</pre><p>ما قمنا به هنا هو إضافة nav إلى الحاوي الثاني sticky-nav وقمنا بتغييره من div إلى ul ثم قمنا بتغيير العناصر nav-element من div إلى li.</p><p>نقوم الآن بتعديل بعض CSS:</p><pre data-pbcklang="css" data-pbcktabsize="" class="css ipsCode prettyprint">.nav-element.active .nav-element--image,
.nav-element:hover .nav-element--image {
    filter: grayscale(0);
    -webkit-filter: grayscale(0);
}</pre><p>كل ما فعلناه هو أننا غيرنا nav-element–link إلى nav-element فحسب. الآن نستطيع استخدام الإضافة بشكل عادي تماما.</p><pre data-pbcklang="javascript" data-pbcktabsize="" class="javascript ipsCode prettyprint">$('body').scrollspy({ target: '.l-sticky-nav' });</pre><p>سوف نقوم بإضافتها إلى body هذا لأن عناصرنا (أقسام الصفحة) تقع مباشرة داخل وسم body وحددنا الهدف l-sticky-nav حيث يكون هو من يتم تعديل القيم فيه.</p><p>تاليا سنقوم بإضافة carousel إلى الشهادات:</p><pre data-pbcklang="javascript" data-pbcktabsize="" class="javascript ipsCode prettyprint">if($('.testimonials-carousel').children().length &gt; 1) {
    $('.testimonials-carousel').owlCarousel({
        loop: true,
        nav: false,
        dots: true,
        rtl: true,
        items: 1
    }) 
}  </pre><p>ما نقوم به هو أننا نتفقد إن كان هنالك أكثر من شهادة، لأن OwlCarousel لا يعمل إذا كان هناك عنصر واحد في الصفحة (مشكلة على الأرجح سيتم إزالتها في النسخة الرسمية) <br>بعد ذلك نقوم بتفعيله، وإعطائه بعض الخيارات، منها أننا لا نريد روابط للتقليب إلى اليمين واليسار، وأننا نريد نقاط التصفح فحسب، وأننا نريده أن يعمل من اليمين إلى اليسار (هذا السبب الوحيد الذي يدفعنا إلى استخدام النسخة 2.0 على النسخة الرسمية 1.3 وهو بسبب دعم اليمين إلى اليسار) وأننا نريد عنصرا واحدا كل مرة.</p><p>هذا هو كامل شِفرة Javascript، لقد كانت بسيطة حقا:</p><pre data-pbcklang="javascript" data-pbcktabsize="" class="javascript ipsCode prettyprint">$(document).ready(function(){
    $('.sticky-nav').affix({
      offset: {
        top: $('.l-header').outerHeight()
      }
    });
    $('.sticky-nav').on('affix.bs.affix', function () {
        $('.l-sticky-nav').addClass('fixed');
    });
    $('.sticky-nav').on('affixed-top.bs.affix', function () {
        $('.l-sticky-nav').removeClass('fixed');
    });

    $('body').scrollspy({ target: '.l-sticky-nav' });

    if($('.testimonials-carousel').children().length &gt; 1) {
        $('.testimonials-carousel').owlCarousel({
            loop: true,
            nav: false,
            dots: true,
            rtl: true,
            items: 1
        }) 
    }    
})</pre></div><div id="wmd-preview-section-28"><h2 id="الخاتمة">الخاتمة</h2><p>كانت هذه رحلة طويلة، انطلقنا من تعلم أساسيات ومكونات صفحات الهبوط إلى بناء واحدة لتطبيق وهمي، أول مقال ليس مخصصا للمطوريين أو المصممين بشكل خاص، أيّ مسوق أو مدير مشروع يستطيع أن يبني صفحة هبوط منتجه انطلاقا من ذلك الدليل على ورقة وإرساله لمطور ما، المقالان الآخيران كان أكثر تعمقا حيث في الواقع تطبيقا لما تعلمناه، الآن لكم المقدرة على إطلاق صفحات لمشاريعك، وجلب عملاء أكثر ومشتريين أكثر</p></div>
]]></description><guid isPermaLink="false">78</guid><pubDate>Fri, 15 May 2015 10:31:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; HTTP: &#x634;&#x631;&#x62D; &#x627;&#x644;&#x62A;&#x62E;&#x627;&#x637;&#x628; &#x628;&#x64A;&#x646; &#x627;&#x644;&#x639;&#x645;&#x64A;&#x644; &#x648;&#x627;&#x644;&#x62E;&#x627;&#x62F;&#x645;</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-http-%D8%B4%D8%B1%D8%AD-%D8%A7%D9%84%D8%AA%D8%AE%D8%A7%D8%B7%D8%A8-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%84-%D9%88%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%85-r74/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_05/http-go.png.0beffa3973ee6e5f4bd1d1a7c3b46204.png" /></p>

<p id="-">
	تعلمنا في <a data-ss1634143796="1" href="https://academy.hsoub.com/code/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-http-r73/" rel="">الجزء السابق أن HTTP</a> بروتوكول على مستوى التطبيقات. حان الوقت لنفهم كيفية استخدام هذا البروتوكول للتواصل بين العميل والخادوم.
</p>

<h2 id="-">
	جلب الأشياء من الويب
</h2>

<p>
	تذكر أن عميل HTTP (وهو المتصفح عادةً) هو الطرف الذي يبدأ بإرسال الطلب إلى الخادوم. يسمح بروتوكول HTTP للعميل بالتعبير عن نيّته من خلال بضعة مُكوّنات: الرابط (URI)، وأفعال HTTP، وترويساته.
</p>

<h3 id="-">
	تسمية الأشياء
</h3>

<p>
	تمثّل الروابط (URIs) حجر الأساس في الويب، لأنّها تحل مشكلة مهمّة على مستوى الإنترنت بكاملها، وهي مشكلة منح الأشياء <strong>مُعرّفًا تنفرد به</strong> على الشّبكة.
</p>

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

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

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

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
myRoom.org/table/book/001
myRoom.org/shelf/book/002
otherRoom.org/cup/001
otherRoom.org/flower/001
otherRoom.org/book/001</pre>

<p>
	أعتقد أنك الآن فهمت ما أقصد. لدينا الآن نظام من اللصاقات الّتي تستخدم لتحديد كل شيء في المكان بدقة. في الويب، نحن نتعامل مع فضاء معلومات واللصاقات المُستخدمة ليست سوى الروابط (URIs).
</p>

<h3 id="-">
	الوصول إلى الأشياء المُسمَّاة
</h3>

<p>
	شرحنا كيف يُبنى طلب HTTP في المقال السابق من خلال الطرفية. استخدمنا بناءً بسيطًا مع فعل HTTP المُسمّى <code>GET</code> مع ترويسة واحدة: <code>Host</code>.
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
GET / HTTP/1.1
Host: www.opera.com</pre>

<p>
	القائمة الكاملة لأفعال HTTP الحالية هي: <code>OPTIONS</code>، <code>GET</code>، <code>HEAD</code>، <code>POST</code>، <code>PUT</code>، <code>DELETE</code>، <code>TRACE</code>، <code>CONNECT</code>. لكل فعل دورٌ مختلف عن الأفعال الأخرى وسنشرح ذلك في المقالات التالية. أكثر الأفعال استخدامًا هو <code>GET</code>، ففي كلّ مرة نُدخل عنوان <code>HTTP</code> في شريط العناوين في المتصفح، فإنّنا نرسل طلب <code>GET</code> إلى خادوم.
</p>

<p>
	في عالم الويب يُرسل العميل معلومات أكثر (المزيد من ترويسات HTTP) إلى الخادوم للتفاهم على المطلوب. يستغل الخادوم هذه المعلومات ليُعدّل الجواب بما يناسب الترويسات. تتوفّر أداة عمليّة جدًا في <a data-ss1634143796="1" href="http://my.opera.com/dragonfly/blog/" rel="external nofollow">Opera Dragonfly</a> لإنشاء طلبات HTTP مُخصّصة وفحص إجابة الخادوم. يمكنك إيجادها في قسم Network في تبويب "Make Request".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-ss1634143796="1" href="https://academy.hsoub.com/uploads/monthly_2015_04/network.png.cd7a50db412789d3b5eacf48383cff90.png" rel="" data-fileid="1537"><img alt="network.thumb.png.de53ab9cf7b10f6a8f4cad" class="ipsImage ipsImage_thumbnailed" data-fileid="1537" src="https://academy.hsoub.com/uploads/monthly_2015_04/network.thumb.png.de53ab9cf7b10f6a8f4cad68aac5218b.png"></a>
</p>

<p>
	هنالك ثلاث مناطق في تبويب Make Request:
</p>

<ul>
<li>
		<strong>الرابط (URL):</strong> مُعرّف المُحتوى (أو عنوان الويب)
	</li>
	<li>
		<strong>متن الطّلب (Request body):</strong> ما سيُرسله العميل إلى الخادوم (يُرسل الزّر "Send request" الطّلب إلى الخادوم عبر الشّبكة)
	</li>
	<li>
		<strong>الجواب (Response):</strong> جواب الخادوم بعد إرسال الطّلب
	</li>
</ul>
<h3 id="-http">
	تخصيص طلب HTTP
</h3>

<ol>
<li>
		انسخ <code><a data-ss1634143796="1" href="http://www.opera.com/" rel="external nofollow">http://www.opera.com/</a></code> إلى قسم URL.
	</li>
	<li>
		انسخ والصق طلب HTTP التّالي إلى قسم "Request body" في تبويب Network. أضفنا الترويسة <code>Accept-Language</code> إلى طلب HTTP السابق.
	</li>
	<li>
		اضغط الزر "Send request".
	</li>
</ol>
<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
GET / HTTP/1.1
Host: www.opera.com
Accept-Language: en</pre>

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

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="">
&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;</pre>

<p>
	لنُجرّب الفرنسيّة:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
GET / HTTP/1.1
Host: www.opera.com
Accept-Language: fr</pre>

<p>
	سُيجيب الخادم هذه المرة بالفرنسيّة، ويتبيّن ذلك في نص المستند وفي مصدره:
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="">
&lt;!DOCTYPE html&gt;
&lt;html lang="fr"&gt;</pre>

<p>
	لاحظ أنّنا استخدمنا الرابط نفسه بالضّبط (<code><a data-ss1634143796="1" href="http://www.opera.com/" rel="external nofollow">http://www.opera.com/</a></code>) ولكنّنا تلقّينا إجابتين مُختلفتين لا لشيء إلا لأننا غيّرنا الترويسة <code>Accept-Language</code>. لاحظ أيضًا أنّ الخادوم أجاب بترويسات كثيرة تُعطينا معلوماتٍ عن حالة المحتوى ونوعه... إلخ. يسمح هذا للعميل بتعديل أسلوب معالجة المستند. يمكنك تجربة لغات مُختلفة مثل اليابانية (<code>ja</code>) والألمانية (<code>de</code>)... إلخ.
</p>

<p>
	ما الذي يحدث إن طلبنا لغة غير موجودة على الخادوم؟ جرّب مثلًا الصّينيّة (<code>zh</code>):
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
GET / HTTP/1.1
Host: www.opera.com
Accept-Language: zh</pre>

<p>
	ستتلقى النسخة الإنكليزية من الموقع. هل هذا مُحيّر؟ الحقيقة أنّ هذا الأمر يعتمد على تصميم الموقع ذاته. فقد يُصمم جواب HTTP بأسلوب آخر، كأن يُجيب الخادوم "لا، ما من نسخة صينية من الموقع لدينا"، أو "ليست لدينا نسخة صينية، ولكن لدينا اللغات التالية: ...). ولكن فريق تجربة المستخدمين في Opera قرر إرسال النسخة الإنكليزية من الموقع عند طلب لغة غير مُتوفّرة. المسألة مسألة اختيار، فلا قاعدة تُفرض على المواقع بهذا الشأن.
</p>

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

<h2 id="-">
	تذكّر
</h2>

<ul>
<li>
		<strong>URI:</strong> نظام لتعريف المعلومات على الشبكة.
	</li>
	<li>
		<strong>أفعال HTTP:</strong> يتضمّن البروتوكول حاليًا الأفعال التّالية: <code>OPTIONS</code>، <code>GET</code>، <code>HEAD</code>، <code>POST</code>، <code>PUT</code>، <code>DELETE</code>، <code>TRACE</code>، <code>CONNECT</code>. وقد تعرّفنا في هذه المقالة على أكثرها استخدامًا وهو <code>GET</code>. <strong> </strong>ترويسات HTTP:** الترويسات هي بيانات إضافية يُرسلها العميل لإعطاء معلومات أكثر عن البيانات المُتبادلة بين العميل والخادوم. تُفيد بعض هذه الترويسات الخادوم بحيث يختار الأسلوب الأفضل للإجابة.
	</li>
</ul>
<p>
	ترجمة (بشيء من التّصرّف) لمقال <a data-ss1634143796="1" href="https://dev.opera.com/articles/http-lets-get-it-on/" rel="external nofollow">HTTP: Let’s GET It On!</a> لصاحبه Karl Dubosy.
</p>
]]></description><guid isPermaLink="false">74</guid><pubDate>Tue, 12 May 2015 22:40:00 +0000</pubDate></item><item><title>&#x631;&#x645;&#x648;&#x632; &#x627;&#x644;&#x625;&#x62C;&#x627;&#x628;&#x629; &#x641;&#x64A; HTTP</title><link>https://academy.hsoub.com/programming/general/%D8%B1%D9%85%D9%88%D8%B2-%D8%A7%D9%84%D8%A5%D8%AC%D8%A7%D8%A8%D8%A9-%D9%81%D9%8A-http-r75/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_05/http-status-codes.png.7abd9495ef470f1fd2bc7a1f706d6c21.png" /></p>

<p>كان ختام <a href="http://academy.hsoub.com/code/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-http-r73/">المقالة السّابقة</a> قولُنا أن بروتوكول HTTP يدير التّفاعل بين عميل وخادوم، وقد شرحنا فكرة ترويسات HTTP. سيكون لدينا الكثير مما يُقال عن هذه الترويسات في أجزاء تالية من هذه السّلسلة، فهذه الترويسات تؤثّر في التّفاعل بين الطّرفين وفي أداء الموقع. أمّا اليوم، فسنطّلع على جانب لا يقلّ أهمّيّة عن التّرويسات، وهو رموز إجابات HTTP.</p><h2 id="-">نزهة في الشوارع</h2><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/map.jpg.c4b5cbdd8e5703643fb74ceba8f4403e.jpg"><img data-fileid="1538" class="ipsImage ipsImage_thumbnailed" alt="map.thumb.jpg.81db63db1c0aba56f7c1286892" src="https://academy.hsoub.com/uploads/monthly_2015_04/map.thumb.jpg.81db63db1c0aba56f7c12868921a3450.jpg"></a></p><p>خرجت ذات صباح قاصدًا مقهى لأقرأ كتابًا، لكنّني وجدت المقهى مُغلقًا حينها، وقد كُتب على لوحة على الباب أنّ احتفالًا يُقام خلال هذا الأسبوع، ولذلك فإنّ المقهى سينتقل <strong>مؤقتًا</strong> ليُقدّم القهوة في شاحنة الطّعام (التي سمّوها "307") قرب النهر. ذهبت إلى ذلك المكان واستمتعت بشرب القهوة.</p><p>قرّرت بعدئذٍ التجوّل في مكتبتي المفضّلة في المدينة، فوجدتها مُغلقةً كذلك، إلّا أنّني رأيت لوحة على الباب تقول أن المكتبة ستتوسع ولذلك انتقلت <strong>بشكل دائم</strong> إلى مبنى جديد في 301 شارع برنرز-لي. لم يُزعجني ذلك، فالمكان قريب. ذهبت إلى هناك فاستقبلني الموظّفون بالتّرحاب: "<strong>200</strong> سلامة!". حسنًا، أنا أبالغ قليلًا، لكنّك فهمتني!</p><p>في طريقي إلى البيت، وجدت متجرًا مهجورًا غطّى الغبار أبوابه في 410 شارع برنرز-لي، وقد أُلصقت ورقةٌ على الباب تقول أنّ صاحب المحلّ تقدّم بطلب إشهار الإفلاس واضطّر إلى إغلاق المتجر، <strong>إلى الأبد</strong>. وكأنّ العجائب لم تنتهِ اليوم، إذ رأيت في نهاية 500 شارع برنرز-لي مبنى من 4 طوابق وقد انهار بالكامل. ما الذي حدث هنا؟!</p><p>لم يكن يومي سيئًا بالمجمل، لذا قرّرت أن أكمل يومي بكتابة مقال عن رموز HTTP الّتي تُرسلها الخواديم إلى العملاء الّذين يرسلون الطّلبات.</p><h2 id="-http-">صياغة جواب HTTP وسطر الحالة</h2><p>تطرّقنا في المقال السّابق إلى السّطر الأول من صيغة الطّلبات الّتي يُرسلها العميل (بما في ذلك أفعال HTTP). وسنركّز الآن على السّطر الأول من رسالة الجواب الّتي تصل من الخادوم، ومعاني الرّموز المختلفة الّتي تظهر في هذا السّطر. لاحظ التّشابه بين نوعي الرّسائل (الطّلبات والإجابات). فكما ينصّ توثيق الإصدارة <a rel="external nofollow" href="https://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging#section-3.1">1.1 من HTTP</a>:</p><blockquote><p>إما إن تكون رسالة HTTP طلبًا من العميل إلى الخادوم أو جوابًا من الخادوم للعمل. من حيث الصّياغة، لا يختلف نوعا الرّسائل إلى في السّطر الأوّل، والذي إمّا أن يكون سطر طلب (للطلبات) أو سطر حالة (للإجابات)، وفي خوارزميّة تحديد طول متن الرّسالة (القسم 3.3).</p></blockquote><p>يُدعى السّطر الأول في الجواب إذًا <a rel="external nofollow" href="https://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging#section-3.1.2">سطر الحالة</a>. يبدأ السّطر بإصدارة بروتوكول HTTP ثمّ مسافة ثم رمز من ثلاثة أرقام، ثم مسافة ثمّ جملة تشرح الرّمز، كهذا المثال:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">HTTP/1.1 200 OK</pre><p>الجملة القصيرة الأخيرة غير إلزامية وعلى العملاء تجاهلها، ولا ينبغي أن يستخدمها برنامج بغرض تفسير الجواب. لنطّلع الآن على بعض أكثر رموز الحالة شيوعًا وما يعنيه كلّ رمز منها.</p><h2 id="-http">رموز الحالة في HTTP</h2><h3 id="200-">200، كلّ شيء على ما يرام!</h3><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/coffee.png.d3a25c0ab83446399d6e679d8f1a7a28.png"><img data-fileid="1539" class="ipsImage ipsImage_thumbnailed" alt="coffee.thumb.png.01a48569d9350cf7c751212" src="https://academy.hsoub.com/uploads/monthly_2015_04/coffee.thumb.png.01a48569d9350cf7c751212539ad6853.png"></a></p><p>في كلّ مرّة يريد شخصٌ ما زيارة الصّفحة الرئيسيّة لموقع Opera، يُرسل العميل طلبًا إلى <code><a rel="external nofollow" href="http://www.opera.com/">http://www.opera.com/</a></code> برسالة مثل هذه:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">GET / HTTP/1.1
Host: www.opera.com
Accept-Language: fr
User-Agent: BrowseAndDream/1.0</pre><p>يُحلّل الخادوم الرّسالة الّتي وصلته من العميل ويُرسل جوابًا بناء على ما فهمه من الرابط والترويسات. وكما ذكرنا في المقالتين السّابقتين، يكون الهدف الأهمّ هو إدارة التّواصل بين الطّرفين بما يحقّق أقصى فائدة لكليهما.</p><p>إن فهم الخادوم الرّسالة، فإنّه يرسل رسالة تبدأ بـ<code>200 OK</code>، أي أنّ كلّ شيء على ما يُرام. تحوي الرسالة بضع ترويسات إجابة ثمّ محتوى الصّفحة، والّذي قد يختلف بناءً على ترويسات الطّلب، فلا إجابة مُطلقة. فكما في كل تفاوض، يجري حوارٌ بين الطّرفين للوصول إلى أفضل تسوية. فيما يلي مثالٌ عن إجابة على الطّلب السّابق:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">HTTP/1.1 200 OK
Date: Fri, 24 Aug 2012, 13:56:44 GMT</pre><h3 id="307-">307، انتقلتُ مؤقّتًا إلى مكان آخر</h3><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/food-truck.png.8411e708dec8ee4c082018686ea43504.png"><img data-fileid="1540" class="ipsImage ipsImage_thumbnailed" alt="food-truck.thumb.png.b7e953349c466b24b56" src="https://academy.hsoub.com/uploads/monthly_2015_04/food-truck.thumb.png.b7e953349c466b24b56d4d7aa7e1a7d3.png"></a></p><p>يمكن للخادوم أن يجيب العميل برسالة تبيّن أنّ المحتو قد انتقل مؤقتًا إلى مكان آخر. ويفيد هذا عندما تريد إعادة توجيه العميل إلى صفحة مُعيّنة لفترة قصيرة. افترض مثلًا موقعًا يُعطي توقّعات الطقس لتاييبي، وقد شبّ إعصار هائل مؤخّرًا فيها. سيكون من المفيد إعلام المُستخدمين بوقوع هذا الإعصار حتى هدوئه. قد يكون الطّلب مثل هذا:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">GET /taiwan/weather/today HTTP/1.1
Host: meteo.example.org</pre><p>قد يرغب الخادوم بإجابة العميل قائلًا: "سأنقلك إلى صفحة أخرى تُعطيك معلومات مفصّلة عن الأزمة الحاليّة في تاييبي". قد تبدو الإجابة مثل هذه:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">HTTP/1.1 307 Temporary Redirect
Date: Fri, 24 Aug 2012, 13:56:44 GMT
Location: http://meteo.example.org/taiwan/weather/crisis</pre><p>يتبع المتصفح عادةً الوجهة الجديدة المذكورة في سطر <code>Location</code>. يمكن أن يطلب الخادوم إعادة التّوجّه إلى نطاق آخر على الويب. وحالما تنتهي الأزمة، يمكن للخادوم إزالة إعادة التّوجيه. ينبغي ألّا يتذكّر العميل إعادة التّوجيه للأبد. فهذا مُهمّ في حالة الإشارات المرجعيّة وسجل التصفّح. من الممكن تصميم برنامج يُدير عمليّات إعادة التّوجيه هذه بطريقة مُفيدة.</p><p>لا يرى المُستخدم إعادة التّوجيه في معظم المتصفّحات، ولكن من الممكن إرسال متن مع جواب إعادة التّوجيه يعرض على المستخدم رسالة تحوي رابطًا للمكان الجديد يُسمح للمُستخدم بنقره.</p><h3 id="301-">301، تغيّر العنوان بشكل دائم</h3><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/book.png.0612221e0630ab3f8e8905c99e21d410.png"><img data-fileid="1541" class="ipsImage ipsImage_thumbnailed" alt="book.thumb.png.a22d3038a9b9ece44b41f1756" src="https://academy.hsoub.com/uploads/monthly_2015_04/book.thumb.png.a22d3038a9b9ece44b41f1756b8bcb12.png"></a></p><p>عند إدارة المعلومات على موقع ويب، قد نحتاج إلى إعلام العميل (ومستخدميه) أن الصّفحة المطلوبة قد انتقلت بشكل دائم. ففي الشّركات، يُعاد تنظيم الأقسام أحيانًا بعد الاتّحاد مع شركة أخرى أو عند تغيّر الأولويّات. لنفترض مثلًا أن وحدة الآلات الكهربائيّة في شركة تقنية قد ضُمَّت إلى قسم الإلكترونيّات. وعندها يمكن إعادة توجيه عميل يطلب:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">GET /section/electromech/about HTTP/1.1
Host: inc.example.com</pre><p>إلى:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">HTTP/1.1 301 Moved Permanently
Date: Fri, 24 Aug 2012, 13:56:44 GMT
Location: http://inc.example.com/section/electronic/about</pre><p>الفرق بين الرمز <code>307</code> الّذي شرحناه في الفقرة السّابقة، والرّمز <code>301</code>، أنّ التّغيّر في العنوان دائم في حالة الرّمز الثّاني، وهي رسالة واضحة من الخادوم للعميل تطلب منه أن يُغيّر الإشارات المرجعيّة المحفوظة لديه إلى العناوين الجديدة. يمكن للمتصفّح تنفيذ ذلك من تلقاء نفسه أو بعد استشارة المستخدم.</p><p>لإعادة توجيه الروابط القديمة فائدتان مُباشرتان. الأولى هي كسب ثقة المستخدمين بموقعك، بأن تُبدي اهتمامك بالمُحافظة على المعلومات الّتي تستضيفها. والثّانية هي استقرار الموارد، فالمواقع الّتي تُعرف بمحافظتها على الرّوابط تكون أكثر احتمالًا لأن تُشير إليها مواقع أخرى على المدى البعيد، ممّا يزيد ترتيب الموقع في مُحرّكات البحث.</p><h3 id="410-">410، وداعًا يا صديقي العزيز!</h3><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/closed.png.72c55fc737e1396a4d525c5243165018.png"><img data-fileid="1542" class="ipsImage ipsImage_thumbnailed" alt="closed.thumb.png.f3aae852d0e35f03453aca3" src="https://academy.hsoub.com/uploads/monthly_2015_04/closed.thumb.png.f3aae852d0e35f03453aca30eefe901d.png"></a></p><p>تحتاج بعض المواقع أحيانًا إلى إبلاغ العميل باختفاء المعلومات الّتي كانت موجودة على رابط مُعيّن للأبد. وقد يكون لهذا مُبرّراته. نحن نعلم أن الروابط الجيّدة لا تتعطّل؛ ولكنّ الرّمز <code>410 Gone</code> هو الوسيلة الوحيدة المناسبة لتعطيلها. لنكن أكثر دقّة: هذا الرّمز هة طريقة لإخبار المستخدمين أن المحتوى الّذي كان موجودًا من قبل على هذا الرابط قد حُذِفَ عمدًا. وهذا معناه أن الخادوم يطلب من العُملاء الّذي يقصدون هذا الرّابط <strong>ألّا يتذكّروه</strong>. ففي متصفّح يستخدم الإشارات المرجعيّة وسجّلات التّصفّح، يُعتبر هذا الرّمز إبلاغًا للمتصفّح بسلامة حذف هذا الرّابط. افترض شبكة اجتماعيّة يُطلب فيها الوصول إلى صفحة مُستخدم:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">GET /people/jeanpaulsartres HTTP/1.1
Host: socialnetwork.example.com</pre><p>قرّر المستخدم أن يُغادر شبكتك الاجتماعيّة ويُغلق حسابه، قد تُريد أن تُبلغ غيره من المستخدمين الّذين يطلبون صفحته من سجلّ المتصفّح أو إشاراته المرجعيّة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">HTTP/1.1 410 Gone</pre><h3 id="500-">500، يا للمصيبة!</h3><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/collapsed-house.png.af25aa0f6b48c2e9b0601789e09c2a8f.png"><img data-fileid="1543" class="ipsImage ipsImage_thumbnailed" alt="collapsed-house.thumb.png.fe23c16814380d" src="https://academy.hsoub.com/uploads/monthly_2015_04/collapsed-house.thumb.png.fe23c16814380d42fcefc3e4f3496602.png"></a></p><p>قد يتعذّر على الخادوم إجابة الطّلب لسبب مجهول. لا يتدخّل HTTP على الإطلاق في تفاصيل عمل الموقع، مثل طريقة تخزين قواعد البيانات على الخادوم، أو كيف يجلب الخادوم البيانات ويُعالجها. ربّما توقّف الطّلب عند برنامج مُعيّن على الخادوم ولم يصل الجواب، وعندها يُبلغ الخادوم العميل ومستخدمه عن وقوع خطأ ما غير معروف بجواب مثل هذا:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">HTTP/1.1 500 Internal Server Error</pre><h2 id="-">استخدام سطور الحالة في الإجابات الّتي تُرسلها الخواديم</h2><p>عند تصميم نظام لإدارة المحتوى، يكون من الضّروري فصل الطّبقات بصورة موارد وروابط إلى هذه الموارد، فهذا مُفيد عند إجابة طلبات العملاء بالمعلومات الصّحيحة، وتقديم المحتوى للبرامج أو للبشر هو شيء جوهريّ في صفة الخواديم. ولأنّ المعلومات تتغيّر وتتطوّر،فإنّ تصميم الخواديم بما يراعي هذه النّقطة يُعطيها مرونة أكبر. لا تهدف هذه السّلسلة إلى شرح تفاصيل تطبيق إجابات الخواديم من النّاحية البرمجيّة، ولكنّنا سنستعرض مثالين يُفيدان كنقطتي انطلاق، على الرّغم من أنّهما قد لا يُفيدان في حالة المواقع الضّخمة الّتي تضمّ آلاف الرّوابط.</p><h3 id="-apache">إعادة التّوجيه في Apache</h3><p>في حال أردت إعادة توجيه <em><a rel="external nofollow" href="http://inc.example.com/section/">http://inc.example.com/section/</a><strong>electromech</strong>/about</em> إلى <em><a rel="external nofollow" href="http://inc.example.com/section/">http://inc.example.com/section/</a><strong>electronic</strong>/about</em>، يمكن إضافة ملف .htaccess في جذر الموقع يحوي التّعليمات التّالية:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">RewriteEngine On
RewriteBase /
RewriteRule ^/section/electromech/about /section/electronic/about [L,R=301]</pre><p>مُلاحظة: هنالك طرق أخرى لتنفيذ هذا الغرض، كاستخدام httpd.conf أو قواعد البيانات أو من خلال النّصوص البرمجيّة... إلخ. واختيار الطّريقة المناسبة يعتمد على تصميم النّظام.</p><h3 id="-nginx">إعادة التّوجيه في nginx</h3><p>خادوم Nginx هو الآخر شائع الاستخدام، وخصوصًا على شبكات توفير المحتوى (CDNs). يمكن إعادة كتابة المثال السّابق لاستخدامه مع nginx:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">server {
    listen 80;
    server_name inc.example.com;
    rewrite ^/section/electromech/about http://inc.example.com/section/electronic/about permanent;
}</pre><h2 id="-http">تصنيف رموز HTTP</h2><p>تعرّفنا على بضع رموز HTTP فيما سبق، ولكنّها <a rel="external nofollow" href="https://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics#section-4">أكثر من ذلك</a>، وبعض هذه الرّموز ذائع الصّيت مثل <code>404 Not Found</code>، وبعضها مغمور لا يُرى كثيرًا. وفي كلا الحالتين يمكن الاستعانة بالرّقم الأوّل للرّمز لأخذ فكرة عن معناه، كون هذا الرقم يُشير إلى العائلة الّتي ينتمي إليها الرّمز:</p><ul><li><code>1xx</code> (بيان): وصل الطّلب، وتجري مُعالجته.</li><li><code>2xx</code> (نجاح): وصل الطّلب وفُهم وقُبل.</li><li><code>3xx</code> (إعادة توجيه): يُطلب إجراء تالٍ لإكمال الطّلب.</li><li><code>4xx</code> (خطأ من جهة العميل): صياغة الطّلب خاطئة أو يتعذّر تحقيقه.</li><li><code>5xx</code> (خطأ من جهة الخادوم): فشل الخادوم في تحقيق طلب يبدو سليمًا.</li></ul><h2 id="-">الخلاصة</h2><p>إلى هنا نكون قد وصلنا إلى نهاية دراستنا لرموز حالة HTTP. أحثّك على الاطّلاع على كلّ رمز والتّعرّف على فائدته. لبعض هذه الرموز تأثيرات خاصّة على التّخزين المؤقّت وعلى متن رسالة HTTP؛ سنُلقي نظرةً على التّخزين المؤقت لاحقًا.</p><h2 id="-">تذكّر</h2><ul><li>تُرسل الخواديم رموز حالة HTTP لتزويد العميل بمعلومات سريعة عن الجواب.</li><li>تؤثّر رموز HTTP في التّخزين المؤقّت ومُعالجة الرّوابط من جهة العميل.</li><li>تُصنّف رموز HTTP ضمن عدّة مجموعات.</li></ul><p>ترجمة (بشيء من التّصرّف) لمقال <a rel="external nofollow" href="https://dev.opera.com/articles/http-response-codes/">HTTP: Response Codes</a> لصاحبه Karl Dubosy.</p>
]]></description><guid isPermaLink="false">75</guid><pubDate>Sun, 10 May 2015 22:36:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; OAuth 2</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-oauth-2-r72/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_05/oauth2-intro.png.c7d2bd292f02e25c51a82544f987f80e.png" /></p>
<p>
	OAuth 2 هو آليّة للتّرخيص تسمح للتطبيقات بطلب وصول محدود إلى حسابات المستخدمين في خدمات HTTP، مثل Facebook وGitHub وDigitalOcean. يعمل OAuth 2 بتوكيل الخدمة المستضيفة لحساب المستخدم باستيثاق هذا الحساب، ثمّ السّماح للتطبيقات الخارجيّة بالوصول إلى حساب المستخدم هذا. يوفّر OAuth 2 مسارًا لترخيص تطبيقات الويب و<a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%B3%D8%B7%D8%AD-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8/" rel="">تطبيقات سطح المكتب</a> والأجهزة المحمولة.
</p>

<p>
	هذا الدّرس موجّه لمطوّري التّطبيقات، وهو يُلقي الضّوء على أدوار OAuth 2 وأنواع الرُّخَص المتاحة، وكذلك يستعرض مجالات استخدامه وسير عمليّة التّرخيص.
</p>

<p>
	لنبدأ بالتّعرّف على أدوار OAuth.
</p>

<h2 id="-oauth">
	أدوار OAuth
</h2>

<p>
	يُحدِّد OAuth أربعة أدوار:
</p>

<ul>
	<li>
		مالك المحتوى
	</li>
	<li>
		العميل
	</li>
	<li>
		خادوم المحتوى
	</li>
	<li>
		خادوم التّرخيص
	</li>
</ul>

<p>
	سنُفصّل كلًّا من هذه الأدوار في الفقرات التّالية.
</p>

<h3 id="-_-_">
	مالك المحتوى: <em>المستخدم</em>
</h3>

<p>
	مالك المحتوى هو <em>المستخدم</em> الذي يُرخِّص <em>لتطبيقٍ</em> الوصول إلى حسابه. وصول التّطبيق إلى حساب المستخدم محدودٌ "بنطاق" (scope) الترخيص الممنوح (مثلاً: صلاحيّة القراءة والكتابة).
</p>

<h3 id="-_-api-_">
	خادوم المحتوى/التّرخيص: <em>الواجهة البرمجيّة (<abbr title="واجهة برمجية | Application Programming Interface"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>)</em>
</h3>

<p>
	يستضيف خادوم المحتوى حسابات المستخدمين المحميّة، ويتحرّى خادوم التّرخيص هويّة <em>المستخدم</em> ثمّ يمنح التّطبيق رمز وصول (access token).
</p>

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

<h3 id="-_-_">
	العميل: <em>التّطبيق</em>
</h3>

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

<h2 id="-">
	سير البروتوكول نظريًّا
</h2>

<p>
	بعد أن تعرّفنا على أدوار OAuth، دعونا نلقِ نظرةً على المخطّط التالي، والذي يبيّن كيف تتفاعل هذه الأدوار فيما بينها:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_04/abstract_flow.png.a43ee76bde960d32141c4660179bce01.png" rel="" data-fileid="1531" data-fileext="png"><img alt="abstract_flow.thumb.png.ea9bcdd6a051a682" class="ipsImage ipsImage_thumbnailed" data-fileid="1531" src="https://academy.hsoub.com/uploads/monthly_2015_04/abstract_flow.thumb.png.ea9bcdd6a051a6820fc3edc95ca869ce.png"></a>
</p>

<p>
	وفيما يلي شرح أكثرُ تفصيلًا للخطوات المُبيّنة في المُخطّط:
</p>

<ol>
	<li>
		يطلب <em>التطبيق</em> رخصةً للوصول إلى الخدمة من <em>المستخدم</em>
	</li>
	<li>
		إن رخّص <em>المستخدم</em> الطّلب، فإنّ <em>التطبيق</em> يحصل على إذن بالتّرخيص
	</li>
	<li>
		يطلب بعدها <em>التطبيق</em> رمز وصول (access token) من <em>خادوم التّرخيص</em> (الواجهة البرمجيّة) مُقدّمًا ما يُثبت هوّيته مع إذن التّرخيص الّذي حصل عليه.
	</li>
	<li>
		إن كانت هويّة التّطبيق موثّقة وإذن التّرخيص سليمًا، أصدر <em>خادوم التّرخيص</em> (الواجهة البرمجيّة) رمز وصول (access token) يمنحه للتّطبيق، لتكتمل حينئذٍ عمليّة الترخيص.
	</li>
	<li>
		يطلب التّطبيق من <em>خادوم المحتوى</em> (الواجهة البرمجيّة) المحتوى المطلوب، مُقدّمًا رمز الوصول الّذي حصل عليه.
	</li>
	<li>
		إن كان رمز الوصول سليمًا، قدّم <em>خادوم المحتوى</em> (الواجهة البرمجيّة) المحتوى المقصود <em>للتطبيق</em>
	</li>
</ol>

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

<h2 id="-">
	تسجيل التّطبيق
</h2>

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

<ul>
	<li>
		اسم التّطبيق
	</li>
	<li>
		موقع التّطبيق
	</li>
	<li>
		رابط إعادة الّتوجيه (Redirect URL) أو الاستدعاء الرّاجع (Callback URL)
	</li>
</ul>

<p>
	تُعيد الخدمة توجيه المستخدم إلى رابط إعادة التّوجيه الّذي توفّره بعد ترخيصه لتطبيق (أو رفضه)، وعليه فإنّ هذا الرابط هو المسؤول عن التّعامل مع رموز الترخيص أو رموز الوصول (access tokens).
</p>

<h3 id="-">
	مُعرّف العميل وكلمة سرّ العميل
</h3>

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

<h2 id="-">
	إذن التّرخيص
</h2>

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

<ul>
	<li>
		<strong>رمز التّرخيص (Authorization Code):</strong> تستخدمه التّطبيقات الّتي تعمل على الخواديم
	</li>
	<li>
		<strong>ضمنيّ (Implicit):</strong> تستخدمه تطبيقات الويب وتطبيقات الأجهزة المحمولة (أي التّطبيقات الّتي تعمل على جهاز المُستخدم)
	</li>
	<li>
		<strong>كلمة مرور مالك المحتوى:</strong> تستخدمها التّطبيقات الموثوقة، كتلك الّتي تتبع للخدمة ذاتها
	</li>
	<li>
		<strong>كلمة مرور العميل:</strong> تستخدم في حالة الوصول للواجهة البرمجيّة للتّطبيقات
	</li>
</ul>

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

<h3 id="-">
	الإذن من نوع "رمز الترخيص":
</h3>

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

<p>
	سنشرح الآن سير عمليّة التّرخيص في هذا النّوع من الأذون:
</p>

<h4 id="-">
	سير التّرخيص بالرّمز
</h4>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_04/auth_code_flow.png.9e8f76fbe49f015e9b74bb28d233b669.png" rel="" data-fileid="1533" data-fileext="png"><img alt="auth_code_flow.thumb.png.f2791d44e06b9fa" class="ipsImage ipsImage_thumbnailed" data-fileid="1533" src="https://academy.hsoub.com/uploads/monthly_2015_04/auth_code_flow.thumb.png.f2791d44e06b9fa6d96cd856677fd8d2.png"></a>
</p>

<p id="-1-">
	<strong>الخطوة 1: رابط رمز الترخيص</strong>
</p>

<p>
	يُعطى المُستخدم في البداية رابطًا لرمز التّرخيص يُشبه هذا:
</p>

<pre class="ipsCode prettyprint prettyprinted" data-pbcklang="" data-pbcktabsize="" style=""><span class="pln">https</span><span class="pun">:</span><span class="com">//cloud.digitalocean.com/v1/oauth/authorize?response_type=code&amp;client_id=CLIENT_ID&amp;redirect_uri=CALLBACK_URL&amp;scope=read</span></pre>

<p>
	فيما يلي شرحٌ لمكوّنات الرابط:
</p>

<ul>
	<li>
		<strong><a href="https://cloud.digitalocean.com/v1/oauth/authorize" rel="external nofollow">https://cloud.digitalocean.com/v1/oauth/authorize</a>:</strong> نقطة الوصول إلى قسم التّرخيص في الواجهة البرمجيّة
	</li>
	<li>
		<strong>client_id=client_id:</strong> مُعرّف العميل للّتطبيق (كيفيّة تحديد الواجهة البرمجيّة لهويّة التّطبيق)
	</li>
	<li>
		<strong>redirect_uri=CALLBACK_URL:</strong> المكان الّذي تعيد الخدمة توجيه وكيل المستخدم إليه بعد منح رمز الترخيص
	</li>
	<li>
		<strong>response_type=code:</strong> يُبيّن أنّ تطبيقك يطلب إذنًا بالحصول على رمز ترخيص
	</li>
	<li>
		<strong>scope=read:</strong> يُعيّن مستوى الوصول الّذي يطلبه المُستخدم
	</li>
</ul>

<p id="-2-">
	<strong>الخطوة 2: يُرخّص المستخدم التّطبيق</strong>
</p>

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

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_04/authcode.png.c44255994e4c6d53856e7da5f0b9ad99.png" rel="" data-fileid="1532" data-fileext="png"><img alt="authcode.thumb.png.9344c969118059fa7e01e" class="ipsImage ipsImage_thumbnailed" data-fileid="1532" src="https://academy.hsoub.com/uploads/monthly_2015_04/authcode.thumb.png.9344c969118059fa7e01e8f7ea72aed0.png"></a>
</p>

<p>
	هذه الصّورة مُلتقطة من صفحة ترخيص DigitalOcean، ونرى فيها التّطبيق "Thedropletbook App" يطلب إذنًا بقراءة حساب المُستخدم "manicas@digitalocean.com".
</p>

<p id="-3-">
	<strong>الخطوة 3: يتلقّى التطبيق رمز التّرخيص</strong>
</p>

<p>
	إذا نقر المُستخدم "Authorize Application"، فإنّ الخدمة تُعيد تحويل وكيل المستخدم إلى رابط إعادة التّوجيه الّذي حدّده التّطبيق أثناء تسجيل المُطوِّر له، وتُرفق الخدمة مع الرّابط <em>رمز التّرخيص</em>. مثال على الرّابط (مُفترضين أنّ التّطبيق هو "dropletbook.com"):
</p>

<pre class="ipsCode prettyprint prettyprinted" data-pbcklang="" data-pbcktabsize="" style=""><span class="pln">https</span><span class="pun">:</span><span class="com">//dropletbook.com/callback?code=AUTHORIZATION_CODE</span></pre>

<p id="-4-access-token-">
	<strong>الخطوة 4: يطلب التّطبيق رمز الوصول (Access Token)</strong>
</p>

<p>
	يطلب التّطبيق من الخدمة رمز وصول، مُمرّرًا لها رمز التّرخيص مع تفاصيله، بما في ذلك <em>كلمة سرّ العميل</em>، والّتي تُرسل جميعها إلى رابط الحصول على رمز الوصول الخاصّ بالخدمة. فيما بلي مثال على طلب POST يُرسل إلى رابط رمز الوصول في DigitalOcean:
</p>

<pre class="ipsCode prettyprint prettyprinted" data-pbcklang="" data-pbcktabsize="" style=""><span class="pln">https</span><span class="pun">:</span><span class="com">//cloud.digitalocean.com/v1/oauth/token?client_id=CLIENT_ID&amp;client_secret=CLIENT_SECRET&amp;grant_type=authorization_code&amp;code=AUTHORIZATION_CODE&amp;redirect_uri=CALLBACK_URL</span></pre>

<p id="-5-">
	<strong>الخطوة 5: يتلقّى التّطبيق رمز الوصول</strong>
</p>

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

<pre class="javascript ipsCode prettyprint prettyprinted" data-pbcklang="javascript" data-pbcktabsize="" style=""><span class="pun">{</span><span class="str">"access_token"</span><span class="pun">:</span><span class="str">"ACCESS_TOKEN"</span><span class="pun">,</span><span class="str">"token_type"</span><span class="pun">:</span><span class="str">"bearer"</span><span class="pun">,</span><span class="str">"expires_in"</span><span class="pun">:</span><span class="lit">2592000</span><span class="pun">,</span><span class="str">"refresh_token"</span><span class="pun">:</span><span class="str">"REFRESH_TOKEN"</span><span class="pun">,</span><span class="str">"scope"</span><span class="pun">:</span><span class="str">"read"</span><span class="pun">,</span><span class="str">"uid"</span><span class="pun">:</span><span class="lit">100101</span><span class="pun">,</span><span class="str">"info"</span><span class="pun">:{</span><span class="str">"name"</span><span class="pun">:</span><span class="str">"Mark E. Mark"</span><span class="pun">,</span><span class="str">"email"</span><span class="pun">:</span><span class="str">"mark@thefunkybunch.com"</span><span class="pun">}}</span></pre>

<p>
	أصبح التّطبيق الآن مُرخّصًا! وبإمكانه استخدام الّرمز للوصول إلى حساب المُستخدم عن طريق الواجهة البرمجيّة للخدمة، محدودًا بنطاق الوصول، إلى أن تنتهي مدّة الرّمز أو يُسحب التّرخيص. في حال أُصدر رمز إعادة تجديد الرّخصة (refresh token)، فبإمكان التّطبيق استخدامه للحصول على رمز وصول جديد في حال انتهى مدّة السّابق.
</p>

<h3 id="-">
	الإذن الضّمنيّ
</h3>

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

<p>
	لا يدعم هذا النّوع من الأذون رموز إعادة تجديد التّرخيص.
</p>

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

<h4 id="-">
	سير التّرخيص الضّمنيّ
</h4>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_04/implicit_flow.png.36bc8731d7b899ffe9c4664a753f700d.png" rel="" data-fileid="1534" data-fileext="png"><img alt="implicit_flow.thumb.png.1383d44c26188d7d" class="ipsImage ipsImage_thumbnailed" data-fileid="1534" src="https://academy.hsoub.com/uploads/monthly_2015_04/implicit_flow.thumb.png.1383d44c26188d7d167e5abca344bc65.png"></a>
</p>

<p id="-1-">
	<strong>الخطوة 1: رابط التّرخيص الضّمني</strong>
</p>

<p>
	يُعرض على المُستخدم رابط التّرخيص، الّذي يطلب رمزًا من الواجهة البرمجيّة، يبدو هذا الرّابط مُشابهًا لرابط رمز التّرخيص، باستثناء أنّه يطلب رمز token بدلًا من code (لاحظ نوع الجواب المطلوب "token"):
</p>

<pre class="ipsCode prettyprint prettyprinted" data-pbcklang="" data-pbcktabsize="" style=""><span class="pln">https</span><span class="pun">:</span><span class="com">//oauth.example.com/authorize?response_type=token&amp;client_id=CLIENT_ID&amp;redirect_uri=CALLBACK_URL&amp;scope=read</span></pre>

<p>
	<strong>ملاحظة:</strong> لا تدعم DigitalOcean حاليًا التّرخيص الضّمني، لذا ذكرنا رابطًا وهميًّا "oauth.example.com".
</p>

<p id="-2-">
	<strong>الخطوة 2: يرخّص المُستخدم التّطبيق</strong>
</p>

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

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_04/authcode.png.c44255994e4c6d53856e7da5f0b9ad99.png" rel="" data-fileid="1532" data-fileext="png"><img alt="authcode.thumb.png.9344c969118059fa7e01e" class="ipsImage ipsImage_thumbnailed" data-fileid="1532" src="https://academy.hsoub.com/uploads/monthly_2015_04/authcode.thumb.png.9344c969118059fa7e01e8f7ea72aed0.png"></a>
</p>

<p>
	نرى في الصّورة التّطبيق "Thedropletbook App" يطلب إذنًا بقراءة حساب المُستخدم "manicas@digitalocean.com".
</p>

<p id="-3-">
	<strong>الخطوة 3: يتلقّى وكيل المُستخدم رمز الوصول مع رابط إعادة التّوجيه</strong>
</p>

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

<pre class="ipsCode prettyprint prettyprinted" data-pbcklang="" data-pbcktabsize="" style=""><span class="pln">https</span><span class="pun">:</span><span class="com">//dropletbook.com/callback#token=ACCESS_TOKEN</span></pre>

<p id="-4-">
	<strong>الخطوة 4: يتبع وكيل المُستخدم مسار إعادة التّوجيه</strong>
</p>

<p>
	يتبع وكيل المُستخدم رابط إعادة التّوجيه مع احتفاظه برمز الوصول.
</p>

<p id="-5-">
	<strong>الخطوة 5: يُرسل التّطبيق نصًّا برمجيًّا لاستخراج رمز الوصول</strong>
</p>

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

<p id="-6-">
	<strong>الخطوة 6: يُمرّر رمز الوصول إلى التّطبيق</strong>
</p>

<p>
	يُنفّذ وكيل المستخدم النّصّ البرمجيّ ويُمرّر رمز الوصول المُستخرَج إلى التّطبيق.
</p>

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

<p>
	<strong>ملاحظة:</strong> لا تدعم DigitalOcean حاليًا التّرخيص الضّمني، لذا ذكرنا رابطًا وهميًّا "oauth.example.com".
</p>

<h3 id="-">
	الإذن بالوصول إلى كلمة مرور مالك المُحتوى
</h3>

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

<h4 id="-">
	سير التّرخيص بالحصول على كلمة مرور المُستخدم
</h4>

<p>
	بعد أن يُعطي المستخدم كلمة مروره للتّطبيق، يطلب التّطبيق رمز الوصول من خادوم التّرخيص. يُشبه طلب POST ما يلي:
</p>

<pre class="ipsCode prettyprint prettyprinted" data-pbcklang="" data-pbcktabsize="" style=""><span class="pln">https</span><span class="pun">:</span><span class="com">//oauth.example.com/token?grant_type=password&amp;username=USERNAME&amp;password=PASSWORD&amp;client_id=CLIENT_ID</span></pre>

<p>
	إن كان اسم المُستخدم وكلمة المرور صحيحين، يُعيد خادوم التّرخيص رمز وصول للتّطبيق ويُصبح التّطبيق مُرخّصًا!
</p>

<p>
	<strong>ملاحظة:</strong> لا تدعم DigitalOcean حاليًا التّرخيص بالحصول على كلمة المرور، لذا ذكرنا رابطًا وهميًّا "oauth.example.com".
</p>

<h3 id="-">
	الإذن بالوصول إلى كلمة مرور العميل
</h3>

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

<h4 id="-">
	سير التّرخيص بالحصول على كلمة مرور العميل
</h4>

<p>
	يطلب التّطبيق رمز الوصول مُرسلًا مُعرَّفه وكلمة مروره إلى خادوم التّرخيص، فيما يلي مثال عن طلب POST:
</p>

<pre class="ipsCode prettyprint prettyprinted" data-pbcklang="" data-pbcktabsize="" style=""><span class="pln">https</span><span class="pun">:</span><span class="com">//oauth.example.com/token?grant_type=client_credentials&amp;client_id=CLIENT_ID&amp;client_secret=CLIENT_SECRET</span></pre>

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

<p>
	<strong>ملاحظة:</strong> لا تدعم DigitalOcean حاليًا التّرخيص بالحصول على كلمة مرور العميل، لذا ذكرنا رابطًا وهميًّا "oauth.example.com".
</p>

<h2 id="-">
	مثال على استخدام رمز الوصول
</h2>

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

<p>
	فيما يلي مثال عن طلب يُرسل للواجهة البرمجيّة للخدمة باستخدام <code>curl</code>، لاحظ أنّه يتضمّن رمز الوصول:
</p>

<pre class="ipsCode prettyprint prettyprinted" data-pbcklang="" data-pbcktabsize="" style=""><span class="pln">curl </span><span class="pun">-</span><span class="pln">X POST </span><span class="pun">-</span><span class="pln">H </span><span class="str">"Authorization: Bearer ACCESS_TOKEN""https://</span><abbr title="واجهة برمجية | Application Programming Interface"><span class="str">api</span></abbr><span class="str">.digitalocean.com/v2/$OBJECT"</span></pre>

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

<h2 id="-">
	سير الحصول على رمز إعادة تجديد الرُخصة
</h2>

<p>
	يؤدّي استخدام رمز وصول بعد انتهاء مدّة صلاحيّته إلى "خطأ رمز غير سليم (Invalid Token Error)". في هذه النّقطة، يمكن استخدام رمز إعادة تجديد الرّخصة في حال أُصدَر مع رمز الوصول للحصول على رمز وصول جديد من خادوم التّرخيص.
</p>

<p>
	فيما يلي مثال على طلب POST للحصول على رمز وصول جديد مُستخدمين رمز إعادة تجديد:
</p>

<pre class="ipsCode prettyprint prettyprinted" data-pbcklang="" data-pbcktabsize="" style=""><span class="pln">https</span><span class="pun">:</span><span class="com">//cloud.digitalocean.com/v1/oauth/token?grant_type=refresh_token&amp;client_id=CLIENT_ID&amp;client_secret=CLIENT_SECRET&amp;refresh_token=REFRESH_TOKEN</span></pre>

<h2 id="-">
	الخاتمة
</h2>

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

<p>
	إذا أردت تعلّم المزيد عن OAuth 2، اطّلع على هذه المصادر القيّمة (بالإنكليزيّة):
</p>

<ul>
	<li>
		<a href="https://www.digitalocean.com/community/tutorials/how-to-use-oauth-authentication-with-digitalocean-as-a-user-or-developer" rel="external nofollow">How To Use OAuth Authentication with DigitalOcean as a User or Developer</a>
	</li>
	<li>
		<a href="https://www.digitalocean.com/community/tutorials/how-to-use-the-digitalocean-api-v2" rel="external nofollow">How To Use the DigitalOcean <abbr title="واجهة برمجية | Application Programming Interface"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> v2</a>
	</li>
	<li>
		<a href="http://tools.ietf.org/html/rfc6749" rel="external nofollow">The OAuth 2.0 Authorization Framwork</a>
	</li>
</ul>

<p>
	ترجمة (بشيء من التّصرّف) لمقال <a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2" rel="external nofollow">Introduction to OAuth 2</a> لصاحبه Mitchell Anicas.
</p>
]]></description><guid isPermaLink="false">72</guid><pubDate>Wed, 06 May 2015 21:19:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; HTTP</title><link>https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-http-r73/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_06/introHTTP.jpg.74f665517bc3582b46adb35e52c8a1f1.jpg" /></p>

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

<p>
	في عالم الويب، لدينا بروتوكول فعّال جدًّا على مستوى التّطبيقات يُمهّد الحواسيب حول العالم لتبادل الأحاديث النّافعة، واسمه <a href="https://en.wikipedia.org/wiki/HTTP" rel="external nofollow">Hypertext Transfer Protocol</a>، أو HTTP اختصارًا؛ وهو بروتوكول يُصنّف ضمن طبقة التّطبيقات فوق <a href="https://en.wikipedia.org/wiki/TCP/IP_model" rel="external nofollow">TCP/IP</a>، وهو أيضًا بروتوكول للتواصل. كثيرًا ما يغيب شرح HTTP في دروس التصميم والتطوير للويب، وهذا أمرٌ مُخزٍ: ففهمه يُعينك في تحسين تفاعل المستخدم وتحقيق أداء أفضل للموقع وإنشساء أدوات فعّالة لإدارة المعلومات على الويب.
</p>

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

<h2 id="-">
	ما معنى بروتوكول تواصل؟
</h2>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="1535" href="https://academy.hsoub.com/uploads/monthly_2015_04/communication.png.899ee5aeaa236e7f58a2676de7aba945.png" rel=""><img alt="communication.thumb.png.823127c06bce3598" class="ipsImage ipsImage_thumbnailed" data-fileid="1535" src="https://academy.hsoub.com/uploads/monthly_2015_04/communication.thumb.png.823127c06bce3598f03ff99e0f67e09e.png"></a>
</p>

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

<h2 id="-http-">
	ما محلّ HTTP من الإنترنت؟
</h2>

<p>
	يقوم HTTP نفسه فوق بروتوكولات أخرى. فعند الاتصال بموقع ويب مثل <code>www.example.org</code>، يستخدم وكيل المستخدم (user agent) مجموعة بروتوكولات <a href="http://en.wikipedia.org/wiki/TCP/IP_model" rel="external nofollow">TCP/IP</a>، والتي صُمّمت في عام 1970 مؤلّفة من <a href="https://tools.ietf.org/html/rfc1122" rel="external nofollow">4 طبقات</a>:
</p>

<ol>
<li>
		طبقة <strong>الوصلة (Link)</strong>، والتي تصف الوصول إلى الوسيط المادّي (كاستخدام بطاقة الشبكة مثلًا)
	</li>
	<li>
		طبقة <strong>الإنترنت</strong>، والتي تصف كيفيّة تغليف البيانات وتوجيهها (IP أو Internet Protocol)
	</li>
	<li>
		طبقة <strong>النقل (Transport)</strong>، والتي تصف كيفية نقل البيانات من نقطة الانطلاق إلى الوجهة (TCP وUDP)
	</li>
	<li>
		طبقة <strong>التطبيقات (Application)</strong>، والتي تصف معنى وصياغة الرسائل المنقولة (HTTP)
	</li>
</ol>
<p>
	فـ HTTP إذًا هو <strong>بروتوكول على مستوى التطبيقات</strong> يقوم على الطبقات السابقة، لا تنسَ هذه الفكرة. يُساعد فصل هذا النّموذج في طبقات على تطوير أجزاءه بصورة منفصلة دون الحاجة لإعادة تصميمها جميعًا. فمثلًا، يمكن تطوير TCP، باعتباره بروتوكولًا في طبقة النّقل، دون الحاجة لتعديل HTTP كونه برتوكولًا في طبقة التّطبيقات. لكن الواقع العمليّ يجعل التفاصيل أكثر تعقيدًا عند الحاجة للوصول إلى تواصل ذي أداء عالٍ. سنركّز في الأجزاء الأولى من هذه السّلسلة على فصل الطّبقات كما هو مُعرَّف في نموذج TCP/IP.
</p>

<p>
	صُمِّم HTTP بغرض تبادل المعلومات بين برنامجين من خلال رسائل تُسمّى رسائل HTTP، وتؤثّر طريقة تشكيل هذه الرسائل في العميل (client) والخادوم (server) والأطراف الوسيطة (كالخواديم الوكيلة proxies).
</p>

<h2 id="-">
	لنتواصل مع خادوم!
</h2>

<p>
	يُعتبر المنفذ رقم 80 المنفذ المبدئيّ للاتّصال بخواديم الويب، ويمكن التأكّد من ذلك بتجربة نُجريها من الطّرفيّة. افتح الطّرفية (أو سطر الأوامر) وجرّب الاتصال بـ <code>www.opera.com</code> على المنفذ 80 مُستخدمًا الأمر التالي:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
telnet www.opera.com 80</pre>

<p>
	من المُفترض أن يكون الناتج:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
Trying 195.189.143.147...
Connected to front.opera.com.
Escape character is '^]'.
Connection closed by foreign host.</pre>

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

<h2 id="-http-">
	لنتحدّث بلغة HTTP!
</h2>

<p>
	لنحاول ثانية التواصل مع الخادوم. أدخل الرسالة التالية في الطرفية (أو سطر الأوامر):
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
telnet www.opera.com 80</pre>

<p>
	ما إن يُؤسّس الاتصال، اكتب رسالة HTTP التالية بسرعة (قبل أن يُغلق الخادوم الاتصال بنفسه)، ثم اضغط Enter مرّتين:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
GET / HTTP/1.1
Host: www.opera.com</pre>

<p>
	تُحدّد هذه الرسالة:
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;"><code>GET</code></span>: أي أننا نريد "الحصول على" تمثيل البيانات.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><code>/</code></span>: أي أنّ المعلومات التي نريدها مخزنة في جذر الموقع.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><code>HTTP/1.1</code></span>: أي أننا نتحدث ببروتوكول HTTP ذي الإصدارة 1.1.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><code>Host:</code></span>: أي أننا نريد الوصول إلى الموقع المُحدّد.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><code>www.opera.com</code></span>: اسم الموقع هو <span style="font-family:courier new,courier,monospace;">www.opera.com</span>.
	</li>
</ul>
<p>
	على الخادوم الآن أن يُجيب طلبنا. من المفترض أن تمتلئ نافذة الطرفية بمحتوى مشابه لما يلي:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
HTTP/1.1 200 OK
Date: Wed, 23 Nov 2011 19:41:37 GMT
Server: Apache
Content-Type: text/html; charset=utf-8
Set-Cookie: language=none; path=/; domain=www.opera.com; expires=Thu, 25-Aug-2011 19:41:38 GMT
Set-Cookie: language=en; path=/; domain=.opera.com; expires=Sat, 20-Nov-2021 19:41:38 GMT
Vary: Accept-Encoding
Transfer-Encoding: chunked

&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
...</pre>

<p>
	يقول الخادوم هنا: "أنا أتحدث HTTP الإصدارة 1.1. نجحَ طلبك، لذا أجبت بالرمز <code>200</code>." الكلمة <span style="font-family:courier new,courier,monospace;"><code>OK</code></span> ليست إلزامية والهدف منها شرح معنى الرمز للبشر - وهي تُشير في حالتنا إلى أن الأمور تسير على ما يرام وأن رسالتنا قُبلت. يلي ذلك سلسلة من "ترويسات HTTP" التي تُرسل لتصف الرسالة، وكيف يجب أن تُفهم. أخيرًا نجد محتويات الصفحة المُستضافة على جذر الموقع، والّتي تبدأ بـ <code>&lt;!DOCTYPE html&gt;</code>. 
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="1536" href="https://academy.hsoub.com/uploads/monthly_2015_04/request-response.jpg.d62ce6b813bfdca3063a6b180f4fa84c.jpg" rel=""><img alt="request-response.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="1536" src="https://academy.hsoub.com/uploads/monthly_2015_04/request-response.thumb.jpg.fd1b72fc009291f9fd4c9e82723c6cb0.jpg"></a>
</p>
]]></description><guid isPermaLink="false">73</guid><pubDate>Sun, 03 May 2015 11:32:00 +0000</pubDate></item><item><title>&#x645;&#x642;&#x627;&#x631;&#x646;&#x629; &#x634;&#x627;&#x645;&#x644;&#x629; &#x628;&#x64A;&#x646; &#x645;&#x62F;&#x648;&#x646;&#x627;&#x62A; Blogger &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/general/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%B4%D8%A7%D9%85%D9%84%D8%A9-%D8%A8%D9%8A%D9%86-%D9%85%D8%AF%D9%88%D9%86%D8%A7%D8%AA-blogger-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r65/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_04/wordpress-blogger_480x300.png.72ef61c4c39da45fe040fc8ca8ebf514.png" /></p>
<p dir="rtl">&#1601;&#1610; &#1576;&#1583;&#1575;&#1610;&#1577; &#1585;&#1581;&#1604;&#1578;&#1603; &#1573;&#1604;&#1609; &#1593;&#1575;&#1604;&#1605; &#1575;&#1604;&#1578;&#1583;&#1608;&#1610;&#1606; &#1603;&#1606;&#1608;&#1593; &#1605;&#1606; &#1571;&#1606;&#1608;&#1575;&#1593; &#1575;&#1604;&#1593;&#1605;&#1604; &#1575;&#1604;&#1581;&#1585;&#1548; &#1578;&#1581;&#1578;&#1575;&#1580; &#1594;&#1575;&#1604;&#1576;&#1575;&#1611; &#1573;&#1604;&#1609; &#1575;&#1604;&#1573;&#1604;&#1605;&#1575;&#1605; &#1576;&#1576;&#1593;&#1590; &#1575;&#1604;&#1606;&#1602;&#1575;&#1591; &#1575;&#1604;&#1607;&#1575;&#1605;&#1577; &#1601;&#1610; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1580;&#1575;&#1604;&#1548; &#1605;&#1606;&#1607;&#1575; &#1575;&#1604;&#1576;&#1581;&#1579; &#1593;&#1606; &#1605;&#1606;&#1589;&#1577; &#1587;&#1607;&#1604;&#1577; &#1604;&#1573;&#1583;&#1575;&#1585;&#1577; &#1608;&#1606;&#1588;&#1585; &#1575;&#1604;&#1605;&#1581;&#1578;&#1608;&#1609; &#1593;&#1576;&#1585; &#1575;&#1604;&#1588;&#1576;&#1603;&#1577; &#1575;&#1604;&#1593;&#1606;&#1603;&#1576;&#1608;&#1578;&#1610;&#1577;&#1548; &#1608;&#1576;&#1575;&#1604;&#1591;&#1576;&#1593; &#1601;&#1573;&#1606; &#1605;&#1593;&#1585;&#1601;&#1578;&#1603; &#1576;&#1605;&#1605;&#1610;&#1586;&#1575;&#1578; &#1608;&#1593;&#1610;&#1608;&#1576; &#1605;&#1606;&#1589;&#1575;&#1578; &#1575;&#1604;&#1578;&#1583;&#1608;&#1610;&#1606; &#1575;&#1604;&#1605;&#1582;&#1578;&#1604;&#1601;&#1577; &#1587;&#1578;&#1587;&#1575;&#1593;&#1583;&#1603; &#1601;&#1610; &#1575;&#1582;&#1578;&#1610;&#1575;&#1585; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577; &#1575;&#1604;&#1605;&#1604;&#1575;&#1574;&#1605;&#1577; &#1604;&#1603;.</p><p dir="rtl">&#1581;&#1575;&#1604;&#1610;&#1575;&#1611; &#1578;&#1593;&#1578;&#1576;&#1585; &#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577; &#1575;&#1604;&#1571;&#1603;&#1579;&#1585; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1575;&#1611; &#1601;&#1610; &#1578;&#1588;&#1594;&#1610;&#1604; &#1575;&#1604;&#1605;&#1608;&#1575;&#1602;&#1593; &#1608;&#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1581;&#1608;&#1604; &#1575;&#1604;&#1593;&#1575;&#1604;&#1605;&#1548; &#1604;&#1603;&#1606; &#1585;&#1576;&#1605;&#1575; &#1610;&#1580;&#1583; &#1575;&#1604;&#1603;&#1579;&#1610;&#1585; &#1605;&#1606; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1610;&#1606; &#1601;&#1610; &#1575;&#1604;&#1576;&#1583;&#1575;&#1610;&#1577; &#1576;&#1593;&#1590; &#1575;&#1604;&#1589;&#1593;&#1608;&#1576;&#1577; &#1601;&#1610; &#1575;&#1604;&#1578;&#1593;&#1575;&#1605;&#1604; &#1605;&#1593;&#1607;&#1575;&#1548; &#1604;&#1584;&#1604;&#1603; &#1610;&#1604;&#1580;&#1571; &#1575;&#1604;&#1603;&#1579;&#1610;&#1585; &#1605;&#1606;&#1607;&#1605; &#1573;&#1604;&#1609; &#1605;&#1606;&#1589;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1575;&#1604;&#1571;&#1587;&#1607;&#1604; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1575;&#1611; &#1605;&#1606; &#1608;&#1580;&#1607;&#1577; &#1606;&#1592;&#1585;&#1607;&#1605;&#1548; &#1604;&#1603;&#1606; &#1587;&#1585;&#1593;&#1575;&#1606; &#1605;&#1575; &#1610;&#1576;&#1583;&#1571; &#1575;&#1604;&#1578;&#1601;&#1603;&#1610;&#1585; &#1581;&#1608;&#1604; &#1583;&#1602;&#1577; &#1575;&#1582;&#1578;&#1610;&#1575;&#1585; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577; &#1608;&#1605;&#1583;&#1609; &#1578;&#1608;&#1575;&#1601;&#1602;&#1607;&#1575; &#1605;&#1593; &#1585;&#1594;&#1576;&#1575;&#1578; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;.</p><p dir="rtl">&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1606;&#1580;&#1583; &#1578;&#1587;&#1575;&#1572;&#1604;&#1575;&#1611; &#1610;&#1591;&#1601;&#1608; &#1573;&#1604;&#1609; &#1575;&#1604;&#1587;&#1591;&#1581; &#1605;&#1593; &#1603;&#1604; &#1576;&#1583;&#1575;&#1610;&#1577; &#1580;&#1583;&#1610;&#1583;&#1577; &#1605;&#1606; &#1571;&#1581;&#1583; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1610;&#1606; &#1571;&#1604;&#1575; &#1608;&#1607;&#1608; &#1576;&#1604;&#1608;&#1580;&#1585; &#1571;&#1605; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587;: &#1571;&#1610;&#1607;&#1605;&#1575; &#1571;&#1587;&#1578;&#1582;&#1583;&#1605;&#1567; &#1571;&#1608; &#1571;&#1610;&#1607;&#1605;&#1575; &#1571;&#1601;&#1590;&#1604;&#1567; &#1608;&#1576;&#1575;&#1593;&#1578;&#1602;&#1575;&#1583;&#1610; &#1575;&#1604;&#1588;&#1582;&#1589;&#1610; &#1601;&#1573;&#1606; &#1607;&#1584;&#1575; &#1575;&#1604;&#1578;&#1587;&#1575;&#1572;&#1604; &#1610;&#1580;&#1576; &#1571;&#1606; &#1610;&#1603;&#1608;&#1606; &#1593;&#1604;&#1609; &#1606;&#1581;&#1608; &#1605;&#1594;&#1575;&#1610;&#1585; &#1578;&#1605;&#1575;&#1605;&#1575;&#1611; &#1604;&#1571;&#1606; &#1571;&#1601;&#1590;&#1604;&#1610;&#1577; &#1605;&#1606;&#1589;&#1577; &#1605;&#1593;&#1610;&#1606;&#1577; &#1604;&#1610;&#1587;&#1578; &#1575;&#1604;&#1593;&#1575;&#1605;&#1604; &#1575;&#1604;&#1571;&#1587;&#1575;&#1587;&#1610; &#1575;&#1604;&#1584;&#1610; &#1610;&#1580;&#1576; &#1571;&#1606; &#1610;&#1606;&#1591;&#1604;&#1602; &#1605;&#1606;&#1607; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1548; &#1576;&#1604; &#1601;&#1610; &#1605;&#1583;&#1609; &#1605;&#1604;&#1575;&#1574;&#1605;&#1577; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577; &#1608;&#1578;&#1608;&#1575;&#1601;&#1602;&#1607;&#1575; &#1605;&#1593; &#1585;&#1594;&#1576;&#1575;&#1578; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;.</p><p dir="rtl">&#1608;&#1576;&#1571;&#1610; &#1581;&#1575;&#1604;&#1548; &#1587;&#1606;&#1581;&#1575;&#1608;&#1604; &#1605;&#1606; &#1582;&#1604;&#1575;&#1604; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1608;&#1590;&#1608;&#1593; &#1605;&#1606;&#1575;&#1602;&#1588;&#1577; &#1576;&#1593;&#1590; &#1575;&#1604;&#1601;&#1585;&#1608;&#1602;&#1575;&#1578; &#1575;&#1604;&#1607;&#1575;&#1605;&#1577; &#1576;&#1610;&#1606; &#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1608;&#1605;&#1606;&#1589;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1608;&#1575;&#1604;&#1573;&#1580;&#1575;&#1576;&#1577; &#1593;&#1604;&#1609; &#1607;&#1584;&#1575; &#1575;&#1604;&#1578;&#1587;&#1575;&#1572;&#1604;&#1548; &#1604;&#1603;&#1606; &#1571;&#1585;&#1580;&#1608; &#1571;&#1606; &#1606;&#1604;&#1578;&#1601;&#1578; &#1573;&#1604;&#1609; &#1575;&#1604;&#1606;&#1602;&#1575;&#1591; &#1575;&#1604;&#1578;&#1575;&#1604;&#1610;&#1577; &#1602;&#1576;&#1604; &#1575;&#1604;&#1576;&#1583;&#1575;&#1610;&#1577;:</p><ul><li><p dir="rtl">&#1575;&#1604;&#1605;&#1602;&#1575;&#1585;&#1606;&#1577; &#1575;&#1604;&#1578;&#1575;&#1604;&#1610;&#1577; &#1605;&#1608;&#1580;&#1607;&#1577; &#1576;&#1588;&#1603;&#1604; &#1571;&#1587;&#1575;&#1587;&#1610; &#1604;&#1604;&#1585;&#1575;&#1594;&#1576;&#1610;&#1606; &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1573;&#1581;&#1583;&#1609; &#1575;&#1604;&#1605;&#1606;&#1589;&#1578;&#1610;&#1606; &#1601;&#1610; &#1605;&#1580;&#1575;&#1604; &#1575;&#1604;&#1578;&#1583;&#1608;&#1610;&#1606; &#1571;&#1608; &#1605;&#1575; &#1588;&#1575;&#1576;&#1607;&#1548; &#1608;&#1604;&#1610;&#1587;&#1578; &#1605;&#1602;&#1575;&#1585;&#1606;&#1577; &#1604;&#1605;&#1575; &#1610;&#1605;&#1603;&#1606;&#1606;&#1575; &#1601;&#1593;&#1604;&#1607; &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1603;&#1604; &#1605;&#1606;&#1589;&#1577;.</p></li><li><p dir="rtl">&#1575;&#1604;&#1605;&#1602;&#1575;&#1585;&#1606;&#1577; &#1587;&#1578;&#1603;&#1608;&#1606; &#1576;&#1610;&#1606; &#1605;&#1606;&#1589;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1608; WordPress.org &#1594;&#1610;&#1585; &#1575;&#1604;&#1605;&#1583;&#1601;&#1608;&#1593;&#1577;</p></li><li><p dir="rtl">&#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1602;&#1575;&#1585;&#1606;&#1577; &#1604;&#1575; &#1578;&#1588;&#1576;&#1607; &#1575;&#1604;&#1605;&#1602;&#1575;&#1585;&#1606;&#1575;&#1578; &#1576;&#1610;&#1606; &#1601;&#1585;&#1610;&#1602;&#1610; &#1603;&#1585;&#1577; &#1575;&#1604;&#1602;&#1583;&#1605; "&#1585;&#1610;&#1575;&#1604; &#1605;&#1583;&#1585;&#1610;&#1583;" &#1608;"&#1576;&#1585;&#1588;&#1604;&#1608;&#1606;&#1577;" &#1571;&#1608; &#1576;&#1610;&#1606; &#1588;&#1585;&#1603;&#1578;&#1610; Apple &#1608;Samsung&#1548; &#1601;&#1607;&#1610; &#1604;&#1575; &#1578;&#1607;&#1583;&#1601; &#1573;&#1604;&#1609; &#1606;&#1587;&#1601; &#1605;&#1606;&#1589;&#1577; &#1605;&#1575; &#1608;&#1578;&#1605;&#1580;&#1610;&#1583; &#1575;&#1604;&#1571;&#1582;&#1585;&#1609;&#1548; &#1576;&#1604; &#1607;&#1610; &#1605;&#1581;&#1575;&#1608;&#1604;&#1577; &#1593;&#1605;&#1604;&#1610;&#1577; &#1604;&#1605;&#1587;&#1575;&#1593;&#1583;&#1577; &#1575;&#1604;&#1602;&#1575;&#1585;&#1574; &#1604;&#1604;&#1608;&#1589;&#1608;&#1604; &#1573;&#1604;&#1609; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1605;&#1606;&#1589;&#1577; &#1605;&#1593;&#1610;&#1606;&#1577; &#1608;&#1601;&#1602; &#1605;&#1593;&#1575;&#1610;&#1610;&#1585; &#1605;&#1581;&#1583;&#1583;&#1577;.</p></li></ul><p dir="rtl">&#1583;&#1593;&#1608;&#1606;&#1575; &#1606;&#1576;&#1583;&#1571;</p><h2 dir="rtl">&#1571;&#1608;&#1604;&#1575;&#1611;: &#1575;&#1604;&#1605;&#1604;&#1603;&#1610;&#1577;</h2><p dir="rtl">&#1576;&#1604;&#1608;&#1580;&#1585; &#1607;&#1610; &#1605;&#1606;&#1589;&#1577; &#1606;&#1588;&#1585; &#1605;&#1581;&#1578;&#1608;&#1609; &#1578;&#1605;&#1578;&#1604;&#1603;&#1607;&#1575; &#1588;&#1585;&#1603;&#1577; Google&nbsp;&#1575;&#1604;&#1593;&#1605;&#1604;&#1575;&#1602;&#1577; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1610;&#1605;&#1603;&#1606;&#1603; &#1575;&#1604;&#1608;&#1579;&#1608;&#1602; &#1576;&#1607;&#1575; &#1583;&#1608;&#1606; &#1578;&#1585;&#1583;&#1583; &#1603;&#1594;&#1610;&#1585;&#1607;&#1575; &#1605;&#1606; &#1605;&#1606;&#1578;&#1580;&#1575;&#1578; &#1588;&#1585;&#1603;&#1577; Google&nbsp;&#1575;&#1604;&#1585;&#1575;&#1574;&#1593;&#1577;&#1548; &#1576;&#1610;&#1606;&#1605;&#1575; &#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1607;&#1610; &#1606;&#1592;&#1575;&#1605; &#1605;&#1601;&#1578;&#1608;&#1581; &#1575;&#1604;&#1605;&#1589;&#1583;&#1585; &#1604;&#1573;&#1583;&#1575;&#1585;&#1577; &#1575;&#1604;&#1605;&#1608;&#1575;&#1602;&#1593; &#1578;&#1605;&#1578;&#1604;&#1603;&#1607; &#1588;&#1585;&#1603;&#1577;&nbsp;Automattic &#1608;&#1610;&#1593;&#1608;&#1583; &#1581;&#1602; &#1605;&#1604;&#1603;&#1610;&#1577; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1573;&#1604;&#1609; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606; &#1606;&#1601;&#1587;&#1607;.</p><p dir="rtl">&#1608;&#1584;&#1604;&#1603; &#1610;&#1593;&#1606;&#1610; &#1571;&#1606;&#1603; &#1604;&#1587;&#1578; &#1575;&#1604;&#1605;&#1575;&#1604;&#1603; &#1575;&#1604;&#1581;&#1602;&#1610;&#1602;&#1610; &#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585;&#1548; &#1601;&#1610;&#1605;&#1603;&#1606; &#1604;&#1588;&#1585;&#1603;&#1577; Google &#1581;&#1584;&#1601; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1575;&#1604;&#1582;&#1575;&#1589;&#1577; &#1576;&#1603; &#1571;&#1608; &#1573;&#1594;&#1604;&#1575;&#1602;&#1607;&#1575; &#1605;&#1572;&#1602;&#1578;&#1575;&#1611; &#1571;&#1608; &#1606;&#1607;&#1575;&#1574;&#1610;&#1575;&#1611; &#1601;&#1610;&#1605;&#1575; &#1573;&#1584;&#1575; &#1602;&#1605;&#1578; &#1576;&#1605;&#1582;&#1575;&#1604;&#1601;&#1577; &#1588;&#1585;&#1608;&#1591; &#1575;&#1604;&#1606;&#1588;&#1585; &#1608;&#1575;&#1604;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1571;&#1608; &#1581;&#1578;&#1609; &#1573;&#1584;&#1575; &#1571;&#1585;&#1575;&#1583;&#1578; &#1580;&#1608;&#1580;&#1604; &#1584;&#1604;&#1603; &#1604;&#1587;&#1576;&#1576; &#1571;&#1608; &#1604;&#1570;&#1582;&#1585; &#1608;&#1581;&#1610;&#1606;&#1607;&#1575; &#1604;&#1606; &#1578;&#1603;&#1608;&#1606; &#1575;&#1604;&#1588;&#1585;&#1603;&#1577; &#1605;&#1590;&#1591;&#1585;&#1577; &#1604;&#1573;&#1576;&#1583;&#1575;&#1569; &#1571;&#1610; &#1578;&#1601;&#1575;&#1589;&#1610;&#1604; &#1581;&#1608;&#1604; &#1571;&#1587;&#1576;&#1575;&#1576; &#1575;&#1604;&#1573;&#1594;&#1604;&#1575;&#1602;.</p><p dir="rtl">&#1576;&#1610;&#1606;&#1605;&#1575; &#1605;&#1593; &#1605;&#1583;&#1608;&#1606;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1587;&#1578;&#1603;&#1608;&#1606; &#1571;&#1606;&#1578; &#1575;&#1604;&#1605;&#1575;&#1604;&#1603; &#1575;&#1604;&#1601;&#1593;&#1604;&#1610; &#1604;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1608;&#1610;&#1605;&#1603;&#1606;&#1603; &#1573;&#1594;&#1604;&#1575;&#1602;&#1607;&#1575; &#1603;&#1610;&#1601;&#1605;&#1575; &#1578;&#1585;&#1610;&#1583;&#1548; &#1608;&#1604;&#1575; &#1610;&#1605;&#1603;&#1606; &#1604;&#1580;&#1607;&#1577; &#1605;&#1593;&#1610;&#1606;&#1577; &#1573;&#1594;&#1604;&#1575;&#1602; &#1571;&#1608; &#1581;&#1584;&#1601; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1604;&#1587;&#1576;&#1576; &#1571;&#1608; &#1604;&#1570;&#1582;&#1585; &#1581;&#1610;&#1579; &#1587;&#1578;&#1603;&#1608;&#1606; &#1604;&#1583;&#1610;&#1603; &#1587;&#1610;&#1591;&#1585;&#1577; &#1603;&#1575;&#1605;&#1604;&#1577; &#1593;&#1604;&#1609; &#1605;&#1581;&#1578;&#1608;&#1610;&#1575;&#1578; &#1608;&#1605;&#1604;&#1601;&#1575;&#1578; &#1605;&#1583;&#1608;&#1606;&#1578;&#1603; &#1605;&#1606; &#1582;&#1604;&#1575;&#1604; &#1575;&#1587;&#1578;&#1590;&#1575;&#1601;&#1577; &#1582;&#1575;&#1589;&#1577;.</p><p dir="rtl">&#1575;&#1604;&#1605;&#1587;&#1571;&#1604;&#1577; &#1575;&#1604;&#1579;&#1575;&#1606;&#1610;&#1577; &#1575;&#1604;&#1605;&#1578;&#1585;&#1578;&#1576;&#1577; &#1593;&#1604;&#1609; &#1605;&#1608;&#1590;&#1608;&#1593; &#1575;&#1604;&#1605;&#1604;&#1603;&#1610;&#1577; &#1607;&#1610; &#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1577; &#1576;&#1610;&#1593; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;&#1548; &#1601;&#1605;&#1593; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585; &#1607;&#1606;&#1575;&#1603; &#1589;&#1593;&#1608;&#1576;&#1577; &#1576;&#1575;&#1604;&#1594;&#1577; &#1601;&#1610; &#1576;&#1610;&#1593; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1605;&#1593; &#1593;&#1583;&#1605; &#1581;&#1602;&#1603; &#1571;&#1589;&#1604;&#1575;&#1611; &#1601;&#1610; &#1576;&#1610;&#1593;&#1607;&#1575;&#1548; &#1576;&#1610;&#1606;&#1605;&#1575; &#1605;&#1593; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1601;&#1604;&#1603; &#1575;&#1604;&#1571;&#1581;&#1602;&#1610;&#1577; &#1575;&#1604;&#1603;&#1575;&#1605;&#1604;&#1577; &#1601;&#1610; &#1576;&#1610;&#1593; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1605;&#1578;&#1609; &#1588;&#1574;&#1578; &#1608;&#1576;&#1603;&#1604; &#1587;&#1607;&#1608;&#1604;&#1577;.</p><p dir="rtl"><strong>&#1575;&#1604;&#1582;&#1604;&#1575;&#1589;&#1577;</strong>: &#1605;&#1606; &#1575;&#1604;&#1608;&#1575;&#1590;&#1581; &#1571;&#1606; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1604;&#1583;&#1610;&#1607; &#1571;&#1601;&#1590;&#1604;&#1610;&#1577; &#1601;&#1610; &#1607;&#1584;&#1607; &#1575;&#1604;&#1606;&#1602;&#1591;&#1577;&#1548; &#1604;&#1603;&#1606; &#1605;&#1606; &#1575;&#1604;&#1573;&#1606;&#1589;&#1575;&#1601; &#1575;&#1604;&#1602;&#1608;&#1604; &#1576;&#1571;&#1606; &#1588;&#1585;&#1603;&#1577; Google &#1604;&#1575; &#1578;&#1604;&#1580;&#1571; &#1573;&#1604;&#1609; &#1573;&#1594;&#1604;&#1575;&#1602; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1576;&#1587;&#1576;&#1576; &#1575;&#1606;&#1578;&#1607;&#1575;&#1603; &#1576;&#1587;&#1610;&#1591; &#1608;&#1607;&#1610; &#1594;&#1610;&#1585; &#1605;&#1578;&#1593;&#1587;&#1601;&#1577; &#1573;&#1591;&#1604;&#1575;&#1602;&#1575;&#1611; &#1601;&#1610; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1607;&#1584;&#1575; &#1575;&#1604;&#1581;&#1602;. &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1601;&#1573;&#1606; &#1575;&#1604;&#1575;&#1604;&#1578;&#1586;&#1575;&#1605; &#1576;&#1587;&#1610;&#1575;&#1587;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1610;&#1590;&#1605;&#1606; &#1604;&#1603; &#1593;&#1583;&#1605; &#1575;&#1604;&#1605;&#1587;&#1575;&#1587; &#1576;&#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1605;&#1606; &#1591;&#1585;&#1601; Google.</p><h2 dir="rtl">&#1579;&#1575;&#1606;&#1610;&#1575;&#1611;: &#1575;&#1604;&#1578;&#1589;&#1605;&#1610;&#1605;</h2><p dir="rtl">&#1575;&#1604;&#1603;&#1579;&#1610;&#1585; &#1605;&#1606; &#1575;&#1604;&#1602;&#1608;&#1575;&#1604;&#1576; &#1575;&#1604;&#1605;&#1578;&#1608;&#1601;&#1585;&#1577; &#1604;&#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585; &#1607;&#1610; &#1602;&#1608;&#1575;&#1604;&#1576; &#1605;&#1606;&#1582;&#1601;&#1590;&#1577; &#1575;&#1604;&#1580;&#1608;&#1583;&#1577;&#1548; &#1608;&#1581;&#1578;&#1609; &#1601;&#1610; &#1581;&#1575;&#1604; &#1581;&#1589;&#1608;&#1604;&#1603; &#1593;&#1604;&#1609; &#1602;&#1575;&#1604;&#1576; &#1605;&#1605;&#1610;&#1586; &#1587;&#1578;&#1580;&#1583; &#1571;&#1606; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1575;&#1604;&#1571;&#1582;&#1585;&#1609; &#1578;&#1587;&#1578;&#1593;&#1605;&#1604; &#1606;&#1601;&#1587; &#1575;&#1604;&#1602;&#1575;&#1604;&#1576; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1601;&#1573;&#1606; &#1575;&#1604;&#1581;&#1589;&#1608;&#1604; &#1593;&#1604;&#1609; &#1602;&#1575;&#1604;&#1576; &#1575;&#1581;&#1578;&#1585;&#1575;&#1601;&#1610; &#1608;&#1605;&#1605;&#1610;&#1586; &#1604;&#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585; &#1604;&#1610;&#1587; &#1576;&#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1587;&#1607;&#1604;&#1548; &#1582;&#1589;&#1608;&#1589;&#1575;&#1611; &#1605;&#1593; &#1608;&#1580;&#1608;&#1583; &#1593;&#1583;&#1583; &#1602;&#1604;&#1610;&#1604; &#1580;&#1583;&#1575;&#1611; &#1605;&#1606; &#1575;&#1604;&#1605;&#1591;&#1608;&#1585;&#1610;&#1606; &#1604;&#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585;.</p><p dir="rtl">&#1608;&#1602;&#1583; &#1578;&#1578;&#1580;&#1607; &#1601;&#1593;&#1604;&#1575;&#1611; &#1604;&#1575;&#1582;&#1578;&#1610;&#1575;&#1585; &#1571;&#1581;&#1583; &#1575;&#1604;&#1605;&#1582;&#1578;&#1589;&#1610;&#1606; &#1601;&#1610; &#1578;&#1591;&#1608;&#1610;&#1585; &#1602;&#1608;&#1575;&#1604;&#1576; &#1576;&#1604;&#1608;&#1580;&#1585; &#1608;&#1578;&#1583;&#1601;&#1593; &#1604;&#1607; &#1605;&#1602;&#1575;&#1576;&#1604; &#1584;&#1604;&#1603; &#1604;&#1604;&#1581;&#1589;&#1608;&#1604; &#1593;&#1604;&#1609; &#1602;&#1575;&#1604;&#1576; &#1610;&#1606;&#1575;&#1587;&#1576;&#1603;&#1548; &#1604;&#1603;&#1606;&#1603; &#1601;&#1610; &#1575;&#1604;&#1594;&#1575;&#1604;&#1576; &#1587;&#1578;&#1615;&#1589;&#1591;&#1583;&#1605; &#1576;&#1575;&#1604;&#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1575;&#1604;&#1605;&#1581;&#1583;&#1608;&#1583;&#1577; &#1580;&#1583;&#1575;&#1611; &#1575;&#1604;&#1578;&#1610; &#1578;&#1587;&#1605;&#1581; &#1576;&#1607;&#1575; &#1605;&#1606;&#1589;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1605;&#1606; &#1581;&#1610;&#1579; &#1575;&#1604;&#1578;&#1589;&#1605;&#1610;&#1605; &#1608;&#1575;&#1604;&#1602;&#1575;&#1604;&#1576;.</p><p dir="rtl">&#1571;&#1605;&#1575; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1601;&#1578;&#1605;&#1578;&#1604;&#1603; &#1605;&#1580;&#1605;&#1608;&#1593;&#1577; &#1603;&#1576;&#1610;&#1585;&#1577; &#1580;&#1583;&#1575;&#1611; &#1605;&#1606; &#1575;&#1604;&#1602;&#1608;&#1575;&#1604;&#1576; &#1575;&#1604;&#1585;&#1575;&#1574;&#1593;&#1577; &#1608;&#1575;&#1604;&#1578;&#1589;&#1575;&#1605;&#1610;&#1605; &#1575;&#1604;&#1605;&#1578;&#1606;&#1608;&#1593;&#1577;&#1548; &#1603;&#1605;&#1575; &#1610;&#1605;&#1603;&#1606; &#1604;&#1604;&#1605;&#1583;&#1608;&#1606; &#1575;&#1604;&#1581;&#1589;&#1608;&#1604; &#1593;&#1604;&#1609; &#1602;&#1608;&#1575;&#1604;&#1576; &#1575;&#1581;&#1578;&#1585;&#1575;&#1601;&#1610;&#1577; &#1604;&#1604;&#1594;&#1575;&#1610;&#1577;&#1548; &#1608;&#1610;&#1605;&#1603;&#1606;&#1607; &#1608;&#1590;&#1593; &#1578;&#1589;&#1608;&#1585;&#1607; &#1575;&#1604;&#1582;&#1575;&#1589; &#1576;&#1575;&#1604;&#1578;&#1589;&#1605;&#1610;&#1605; &#1575;&#1604;&#1584;&#1610; &#1610;&#1585;&#1594;&#1576; &#1576;&#1607; &#1608;&#1587;&#1610;&#1580;&#1583; &#1575;&#1604;&#1603;&#1579;&#1610;&#1585; &#1605;&#1606; &#1575;&#1604;&#1605;&#1591;&#1608;&#1585;&#1610;&#1606; &#1575;&#1604;&#1605;&#1605;&#1610;&#1586;&#1610;&#1606; &#1593;&#1604;&#1609; &#1575;&#1587;&#1578;&#1593;&#1583;&#1575;&#1583; &#1604;&#1578;&#1606;&#1601;&#1610;&#1584; &#1603;&#1604; &#1605;&#1575; &#1610;&#1585;&#1610;&#1583; &#1608;&#1593;&#1604;&#1609; &#1571;&#1601;&#1590;&#1604; &#1608;&#1580;&#1607;&#1548; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1601;&#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1578;&#1602;&#1583;&#1605; &#1604;&#1603; &#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1594;&#1610;&#1585; &#1605;&#1581;&#1583;&#1608;&#1583;&#1577; &#1605;&#1606; &#1581;&#1610;&#1579; &#1575;&#1604;&#1578;&#1589;&#1605;&#1610;&#1605; &#1608;&#1575;&#1604;&#1602;&#1608;&#1575;&#1604;&#1576;&#1548; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1604;&#1575; &#1583;&#1575;&#1593;&#1610; &#1604;&#1604;&#1602;&#1604;&#1602; &#1573;&#1591;&#1604;&#1575;&#1602;&#1575;&#1611; &#1581;&#1608;&#1604; &#1605;&#1587;&#1571;&#1604;&#1577; &#1575;&#1604;&#1578;&#1589;&#1605;&#1610;&#1605;.</p><p dir="rtl"><strong>&#1575;&#1604;&#1582;&#1604;&#1575;&#1589;&#1577;</strong>: &#1575;&#1604;&#1571;&#1601;&#1590;&#1604;&#1610;&#1577; &#1605;&#1606; &#1581;&#1610;&#1579; &#1575;&#1604;&#1602;&#1608;&#1575;&#1604;&#1576; &#1608;&#1575;&#1604;&#1578;&#1589;&#1605;&#1610;&#1605; &#1607;&#1610; &#1604;&#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587;.</p><h2 dir="rtl">&#1579;&#1575;&#1604;&#1579;&#1575;&#1611;: &#1575;&#1604;&#1578;&#1593;&#1575;&#1605;&#1604; &#1605;&#1593; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577;</h2><p dir="rtl">&#1578;&#1578;&#1605;&#1610;&#1586; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585; &#1576;&#1587;&#1607;&#1608;&#1604;&#1577; &#1603;&#1575;&#1605;&#1604;&#1577; &#1601;&#1610; &#1575;&#1604;&#1578;&#1593;&#1575;&#1605;&#1604; &#1605;&#1593; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577;&#1548; &#1608;&#1576;&#1605;&#1580;&#1585;&#1583; &#1575;&#1605;&#1578;&#1604;&#1575;&#1603;&#1603; &#1604;&#1581;&#1587;&#1575;&#1576; GMail&nbsp;&#1587;&#1578;&#1603;&#1608;&#1606; &#1602;&#1575;&#1583;&#1585;&#1575;&#1611; &#1593;&#1604;&#1609; &#1573;&#1606;&#1588;&#1575;&#1569; &#1605;&#1583;&#1608;&#1606;&#1577; &#1605;&#1580;&#1575;&#1606;&#1610;&#1577; &#1593;&#1576;&#1585; &#1576;&#1604;&#1608;&#1580;&#1585; &#1608;&#1575;&#1604;&#1576;&#1583;&#1569; &#1601;&#1610; &#1606;&#1588;&#1585; &#1575;&#1604;&#1605;&#1608;&#1575;&#1590;&#1610;&#1593; &#1605;&#1606; &#1582;&#1604;&#1575;&#1604; &#1604;&#1608;&#1581;&#1577; &#1575;&#1604;&#1578;&#1581;&#1603;&#1605; &#1575;&#1604;&#1576;&#1587;&#1610;&#1591;&#1577; &#1608;&#1583;&#1608;&#1606; &#1575;&#1604;&#1583;&#1582;&#1608;&#1604; &#1601;&#1610; &#1571;&#1605;&#1608;&#1585; &#1576;&#1585;&#1605;&#1580;&#1610;&#1577; &#1571;&#1608; &#1601;&#1606;&#1610;&#1577;.</p><p dir="rtl">&#1576;&#1610;&#1606;&#1605;&#1575; &#1578;&#1581;&#1578;&#1575;&#1580; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1573;&#1604;&#1609; &#1605;&#1593;&#1585;&#1601;&#1577; &#1576;&#1576;&#1593;&#1590; &#1575;&#1604;&#1571;&#1588;&#1610;&#1575;&#1569; &#1575;&#1604;&#1601;&#1606;&#1610;&#1577; &#1608;&#1575;&#1604;&#1576;&#1585;&#1605;&#1580;&#1610;&#1577; &#1576;&#1588;&#1603;&#1604; &#1605;&#1587;&#1576;&#1602; &#1581;&#1578;&#1609; &#1578;&#1578;&#1605;&#1603;&#1606; &#1605;&#1606; &#1578;&#1606;&#1589;&#1610;&#1576; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1608;&#1575;&#1604;&#1576;&#1583;&#1569; &#1601;&#1610; &#1606;&#1588;&#1585; &#1575;&#1604;&#1605;&#1608;&#1575;&#1590;&#1610;&#1593;&#1548; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1602;&#1583; &#1610;&#1580;&#1583; &#1576;&#1593;&#1590; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1610;&#1606; &#1589;&#1593;&#1608;&#1576;&#1577; &#1601;&#1610; &#1575;&#1604;&#1578;&#1593;&#1575;&#1605;&#1604; &#1605;&#1593; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1601;&#1610; &#1575;&#1604;&#1576;&#1583;&#1575;&#1610;&#1577;.</p><p dir="rtl"><strong>&#1575;&#1604;&#1582;&#1604;&#1575;&#1589;&#1577;</strong>: &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585; &#1604;&#1607;&#1575; &#1575;&#1604;&#1571;&#1601;&#1590;&#1604;&#1610;&#1577; &#1605;&#1606; &#1581;&#1610;&#1579; &#1575;&#1604;&#1578;&#1593;&#1575;&#1605;&#1604; &#1608;&#1587;&#1607;&#1608;&#1604;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1608;&#1604;&#1575; &#1578;&#1578;&#1591;&#1604;&#1576; &#1605;&#1593;&#1585;&#1601;&#1577; &#1605;&#1587;&#1576;&#1602;&#1577; &#1576;&#1575;&#1604;&#1571;&#1605;&#1608;&#1585; &#1575;&#1604;&#1601;&#1606;&#1610;&#1577;.</p><h2 dir="rtl">&#1585;&#1575;&#1576;&#1593;&#1575;&#1611;: &#1575;&#1604;&#1578;&#1581;&#1603;&#1605; &#1601;&#1610; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577;</h2><p dir="rtl">&#1578;&#1608;&#1601;&#1585; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585; &#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1605;&#1581;&#1583;&#1608;&#1583;&#1577; &#1580;&#1583;&#1575;&#1611; &#1604;&#1604;&#1578;&#1581;&#1603;&#1605; &#1601;&#1610; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577; &#1608;&#1578;&#1582;&#1589;&#1610;&#1589;&#1607;&#1575; &#1576;&#1575;&#1604;&#1591;&#1585;&#1610;&#1602;&#1577; &#1575;&#1604;&#1605;&#1604;&#1575;&#1574;&#1605;&#1577; &#1604;&#1604;&#1605;&#1583;&#1608;&#1606;&#1548; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1593;&#1604;&#1609; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606; &#1575;&#1604;&#1593;&#1605;&#1604; &#1608;&#1601;&#1602; &#1605;&#1575; &#1578;&#1615;&#1605;&#1604;&#1610;&#1607; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577; &#1593;&#1604;&#1610;&#1607; &#1608;&#1604;&#1610;&#1587; &#1575;&#1604;&#1593;&#1603;&#1587;&#1548; &#1601;&#1605;&#1579;&#1604;&#1575;&#1611; &#1607;&#1606;&#1575;&#1603; &#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1605;&#1581;&#1583;&#1608;&#1583;&#1577; &#1580;&#1583;&#1575;&#1611; &#1601;&#1610; &#1575;&#1604;&#1578;&#1581;&#1603;&#1605; &#1576;&#1575;&#1604;&#1578;&#1593;&#1604;&#1610;&#1602;&#1575;&#1578; &#1608;&#1606;&#1605;&#1575;&#1584;&#1580; &#1575;&#1604;&#1575;&#1578;&#1589;&#1575;&#1604; &#1583;&#1575;&#1582;&#1604; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;. &#1571;&#1610;&#1590;&#1575;&#1611; &#1604;&#1575; &#1578;&#1587;&#1605;&#1581; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585; &#1576;&#1573;&#1590;&#1575;&#1601;&#1577; &#1605;&#1581;&#1585;&#1585;&#1610;&#1606; &#1608;&#1605;&#1587;&#1575;&#1607;&#1605;&#1610;&#1606; &#1570;&#1582;&#1585;&#1610;&#1606; &#1604;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;&#1548; &#1608;&#1580;&#1608;&#1583; &#1593;&#1583;&#1583; &#1605;&#1581;&#1583;&#1608;&#1583; &#1605;&#1606; &#1575;&#1604;&#1589;&#1601;&#1581;&#1575;&#1578; &#1575;&#1604;&#1579;&#1575;&#1576;&#1578;&#1577;&#1548; &#1593;&#1583;&#1605; &#1575;&#1604;&#1602;&#1583;&#1585;&#1577; &#1593;&#1604;&#1609; &#1575;&#1604;&#1578;&#1581;&#1603;&#1605; &#1601;&#1610; &#1570;&#1604;&#1610;&#1577; &#1592;&#1607;&#1608;&#1585; &#1575;&#1604;&#1605;&#1608;&#1575;&#1590;&#1610;&#1593; &#1608;&#1594;&#1610;&#1585;&#1607;&#1575;.</p><p dir="rtl">&#1571;&#1605;&#1575; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1601;&#1578;&#1605;&#1578;&#1604;&#1603; &#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1594;&#1610;&#1585; &#1605;&#1581;&#1583;&#1608;&#1583;&#1577; &#1604;&#1604;&#1578;&#1581;&#1603;&#1605; &#1601;&#1610; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577; &#1608;&#1576;&#1575;&#1604;&#1591;&#1585;&#1610;&#1602;&#1577; &#1575;&#1604;&#1578;&#1610; &#1578;&#1604;&#1575;&#1574;&#1605; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1548; &#1601;&#1610;&#1605;&#1603;&#1606; &#1573;&#1583;&#1585;&#1575;&#1580; &#1593;&#1583;&#1583; &#1594;&#1610;&#1585; &#1605;&#1581;&#1583;&#1608;&#1583; &#1605;&#1606; &#1575;&#1604;&#1605;&#1587;&#1575;&#1607;&#1605;&#1610;&#1606; &#1608;&#1575;&#1604;&#1605;&#1581;&#1585;&#1585;&#1610;&#1606; &#1583;&#1575;&#1582;&#1604; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1608;&#1578;&#1582;&#1589;&#1610;&#1589; &#1605;&#1604;&#1601;&#1575;&#1578;&#1607;&#1605; &#1575;&#1604;&#1588;&#1582;&#1589;&#1610;&#1577;&#1548; &#1606;&#1592;&#1575;&#1605; &#1578;&#1581;&#1603;&#1605; &#1605;&#1605;&#1610;&#1586; &#1601;&#1610; &#1575;&#1604;&#1578;&#1593;&#1604;&#1610;&#1602;&#1575;&#1578; &#1608;&#1606;&#1605;&#1575;&#1584;&#1580; &#1575;&#1604;&#1575;&#1578;&#1589;&#1575;&#1604; &#1608;&#1575;&#1604;&#1589;&#1601;&#1581;&#1575;&#1578; &#1575;&#1604;&#1579;&#1575;&#1576;&#1578;&#1577; &#1608;&#1570;&#1604;&#1610;&#1577; &#1592;&#1607;&#1608;&#1585; &#1575;&#1604;&#1605;&#1608;&#1575;&#1590;&#1610;&#1593;&#1548; &#1576;&#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1577; &#1573;&#1604;&#1609; &#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1577; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1575;&#1578; &#1604;&#1578;&#1608;&#1601;&#1610;&#1585; &#1575;&#1604;&#1605;&#1586;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1604;&#1604;&#1578;&#1581;&#1603;&#1605; &#1601;&#1610; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577;.</p><p dir="rtl"><strong>&#1575;&#1604;&#1582;&#1604;&#1575;&#1589;&#1577;</strong>: &#1575;&#1604;&#1571;&#1601;&#1590;&#1604;&#1610;&#1577; &#1605;&#1606; &#1581;&#1610;&#1579; &#1575;&#1604;&#1578;&#1581;&#1603;&#1605; &#1601;&#1610; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577; &#1607;&#1610; &#1604;&#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587;.</p><h2 dir="rtl">&#1582;&#1575;&#1605;&#1587;&#1575;&#1611;: &#1578;&#1581;&#1587;&#1610;&#1606; &#1575;&#1604;&#1592;&#1607;&#1608;&#1585; &#1601;&#1610; &#1605;&#1581;&#1585;&#1603;&#1575;&#1578; &#1575;&#1604;&#1576;&#1581;&#1579; "SEO"</h2><p dir="rtl">&#1610;&#1593;&#1578;&#1602;&#1583; &#1575;&#1604;&#1603;&#1579;&#1610;&#1585; &#1605;&#1606; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1610;&#1606; &#1576;&#1571;&#1606; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1605;&#1606;&#1589;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1610;&#1593;&#1591;&#1610;&#1607;&#1575; &#1571;&#1601;&#1590;&#1604;&#1610;&#1577; &#1605;&#1606; &#1606;&#1575;&#1581;&#1610;&#1577; SEO &#1608;&#1584;&#1604;&#1603; &#1604;&#1571;&#1606;&#1607;&#1575; &#1578;&#1575;&#1576;&#1593;&#1577; &#1604;&#1588;&#1585;&#1603;&#1577; Google &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1592;&#1607;&#1608;&#1585; &#1571;&#1601;&#1590;&#1604; &#1583;&#1575;&#1582;&#1604; &#1605;&#1581;&#1585;&#1603; &#1576;&#1581;&#1579; Google &#1593;&#1604;&#1609; &#1575;&#1604;&#1571;&#1602;&#1604;&#1548; &#1601;&#1610; &#1575;&#1604;&#1608;&#1575;&#1602;&#1593; &#1607;&#1584;&#1575; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590; &#1594;&#1610;&#1585; &#1589;&#1581;&#1610;&#1581; &#1576;&#1575;&#1604;&#1605;&#1591;&#1604;&#1602;.</p><p dir="rtl">&#1583;&#1593;&#1608;&#1606;&#1575; &#1606;&#1581;&#1578;&#1580; &#1576;&#1585;&#1571;&#1610; &#1575;&#1604;&#1605;&#1607;&#1606;&#1583;&#1587; &#1601;&#1610; &#1588;&#1585;&#1603;&#1577; &#1580;&#1608;&#1580;&#1604; Matt Cutts&#1548; &#1601;&#1607;&#1608; &#1610;&#1593;&#1605;&#1604; &#1604;&#1583;&#1609; &#1575;&#1604;&#1588;&#1585;&#1603;&#1577; &#1575;&#1604;&#1605;&#1575;&#1604;&#1603;&#1577; &#1608;&#1575;&#1604;&#1583;&#1575;&#1593;&#1605;&#1577; &#1604;&#1576;&#1604;&#1608;&#1580;&#1585; &#1576;&#1610;&#1606;&#1605;&#1575; &#1578;&#1593;&#1605;&#1604; &#1605;&#1583;&#1608;&#1606;&#1578;&#1607; &#1575;&#1604;&#1588;&#1582;&#1589;&#1610;&#1577; &#1593;&#1576;&#1585; &#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587;.</p><p dir="rtl">&#1610;&#1585;&#1609; Matt &#1571;&#1606; &#1603;&#1604; &#1605;&#1606; &#1575;&#1604;&#1605;&#1606;&#1589;&#1578;&#1610;&#1606; &#1578;&#1593;&#1605;&#1604; &#1576;&#1588;&#1603;&#1604; &#1605;&#1606;&#1575;&#1587;&#1576; &#1605;&#1593; SEO &#1608;&#1603;&#1604; &#1605;&#1606;&#1589;&#1577; &#1604;&#1607;&#1575; &#1573;&#1610;&#1580;&#1575;&#1576;&#1610;&#1575;&#1578; &#1608;&#1587;&#1604;&#1576;&#1610;&#1575;&#1578;&#1548; &#1604;&#1603;&#1606; &#1601;&#1610; &#1606;&#1601;&#1587; &#1575;&#1604;&#1608;&#1602;&#1578; &#1601;&#1573;&#1606; &#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1578;&#1593;&#1591;&#1610; &#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1608;&#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1577; &#1578;&#1582;&#1589;&#1610;&#1589; &#1571;&#1603;&#1576;&#1585; &#1601;&#1610; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1587;&#1571;&#1604;&#1577;.</p><p dir="rtl">&#1608;&#1610;&#1590;&#1610;&#1601; Matt &#1576;&#1571;&#1606;&#1607; &#1573;&#1584;&#1575; &#1603;&#1606;&#1578; &#1578;&#1605;&#1578;&#1604;&#1603; &#1605;&#1581;&#1578;&#1608;&#1609; &#1580;&#1610;&#1583; &#1608;&#1593;&#1583;&#1583;&#1611;&#1575; &#1605;&#1593;&#1602;&#1608;&#1604;&#1611;&#1575; &#1605;&#1606; &#1575;&#1604;&#1585;&#1608;&#1575;&#1576;&#1591; &#1575;&#1604;&#1605;&#1572;&#1583;&#1610;&#1577; &#1604;&#1605;&#1583;&#1608;&#1606;&#1578;&#1603; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1586;&#1608;&#1575;&#1585;&#1611;&#1575; &#1571;&#1603;&#1579;&#1585;&#1548; &#1601;&#1573;&#1606; &#1575;&#1604;&#1605;&#1587;&#1571;&#1604;&#1577; &#1604;&#1606; &#1578;&#1588;&#1603;&#1604; &#1571;&#1610; &#1601;&#1575;&#1585;&#1602; &#1576;&#1610;&#1606; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1571;&#1608; &#1576;&#1604;&#1608;&#1580;&#1585;.</p><p dir="rtl">&#1610;&#1605;&#1603;&#1606;&#1606;&#1575; &#1575;&#1604;&#1602;&#1608;&#1604; &#1576;&#1571;&#1606; &#1605;&#1587;&#1571;&#1604;&#1577; SEO &#1578;&#1593;&#1578;&#1605;&#1583; &#1601;&#1610; &#1575;&#1604;&#1571;&#1587;&#1575;&#1587; &#1593;&#1604;&#1609; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606; &#1606;&#1601;&#1587;&#1607;&#1548; &#1601;&#1603;&#1604; &#1605;&#1606; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1608;&#1576;&#1604;&#1608;&#1580;&#1585; &#1604;&#1575; &#1578;&#1602;&#1583;&#1605; &#1571;&#1610; &#1605;&#1605;&#1610;&#1586;&#1575;&#1578; &#1601;&#1610; &#1607;&#1584;&#1575; &#1575;&#1604;&#1582;&#1589;&#1608;&#1589; &#1575;&#1576;&#1578;&#1583;&#1575;&#1569;&#1611;&#1548; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1593;&#1604;&#1609; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606; &#1605;&#1593;&#1585;&#1601;&#1577; &#1576;&#1593;&#1590; &#1575;&#1604;&#1575;&#1587;&#1578;&#1585;&#1575;&#1578;&#1610;&#1580;&#1610;&#1575;&#1578; &#1575;&#1604;&#1605;&#1578;&#1593;&#1604;&#1602;&#1577; &#1576;&#1575;&#1604;&#1587;&#1610;&#1608; &#1604;&#1604;&#1581;&#1589;&#1608;&#1604; &#1593;&#1604;&#1609; &#1592;&#1607;&#1608;&#1585; &#1571;&#1601;&#1590;&#1604;.</p><p dir="rtl">&#1604;&#1603;&#1606; &#1610;&#1605;&#1603;&#1606; &#1604;&#1605;&#1587;&#1578;&#1582;&#1583;&#1605;&#1610; &#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1575;&#1604;&#1575;&#1587;&#1578;&#1593;&#1575;&#1606;&#1577; &#1604;&#1575;&#1581;&#1602;&#1575;&#1611; &#1576;&#1576;&#1593;&#1590; &#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1575;&#1578; &#1575;&#1604;&#1605;&#1578;&#1593;&#1604;&#1602;&#1577; &#1576;&#1600; SEO&nbsp;&#1605;&#1579;&#1604; &#1573;&#1590;&#1575;&#1601;&#1577; Yoast &#1608;&#1575;&#1604;&#1578;&#1610; &#1578;&#1608;&#1601;&#1585; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1605;&#1605;&#1610;&#1586;&#1575;&#1578; &#1608;&#1575;&#1604;&#1575;&#1581;&#1578;&#1610;&#1575;&#1580;&#1575;&#1578; &#1575;&#1604;&#1605;&#1578;&#1593;&#1604;&#1602;&#1577; &#1576;&#1575;&#1604;&#1587;&#1610;&#1608;&#1548; &#1608;&#1607;&#1584;&#1575; &#1575;&#1604;&#1571;&#1605;&#1585; &#1594;&#1610;&#1585; &#1605;&#1578;&#1608;&#1601;&#1585; &#1601;&#1610; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585;.</p><p dir="rtl"><strong>&#1575;&#1604;&#1582;&#1604;&#1575;&#1589;&#1577;:</strong> &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1610;&#1578;&#1610;&#1581; &#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1571;&#1608;&#1587;&#1593; &#1605;&#1606; &#1606;&#1575;&#1581;&#1610;&#1577; &#1578;&#1581;&#1587;&#1610;&#1606; &#1605;&#1581;&#1585;&#1603;&#1575;&#1578; &#1575;&#1604;&#1576;&#1581;&#1579; "SEO" &#1605;&#1606; &#1582;&#1604;&#1575;&#1604; &#1578;&#1608;&#1601;&#1610;&#1585; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1575;&#1578; &#1608;&#1575;&#1604;&#1602;&#1583;&#1585;&#1577; &#1593;&#1604;&#1609; &#1578;&#1607;&#1610;&#1574;&#1577; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1604;&#1605;&#1581;&#1585;&#1603;&#1575;&#1578; &#1575;&#1604;&#1576;&#1581;&#1579; &#1576;&#1588;&#1603;&#1604; &#1571;&#1601;&#1590;&#1604;&#1548; &#1604;&#1603;&#1606; &#1601;&#1610; &#1606;&#1601;&#1587; &#1575;&#1604;&#1608;&#1602;&#1578; &#1610;&#1580;&#1576; &#1575;&#1604;&#1575;&#1604;&#1578;&#1601;&#1575;&#1578; &#1573;&#1604;&#1609; &#1571;&#1606; &#1580;&#1608;&#1583;&#1577; &#1575;&#1604;&#1605;&#1581;&#1578;&#1608;&#1609; &#1607;&#1610; &#1575;&#1604;&#1606;&#1602;&#1591;&#1577; &#1575;&#1604;&#1605;&#1585;&#1603;&#1586;&#1610;&#1577; &#1601;&#1610; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;&#1548; &#1576;&#1605;&#1593;&#1606;&#1609; &#1604;&#1608; &#1571;&#1606;&#1603; &#1578;&#1605;&#1578;&#1604;&#1603; &#1605;&#1581;&#1578;&#1608;&#1609; &#1590;&#1593;&#1610;&#1601; &#1608;&#1587;&#1610;&#1569; &#1605;&#1593; &#1571;&#1601;&#1590;&#1604; &#1575;&#1587;&#1578;&#1585;&#1575;&#1578;&#1610;&#1580;&#1610;&#1577; &#1587;&#1610;&#1608; &#1601;&#1610; &#1575;&#1604;&#1593;&#1575;&#1604;&#1605; &#1601;&#1604;&#1575; &#1578;&#1578;&#1608;&#1602;&#1593; &#1571;&#1606; &#1578;&#1581;&#1602;&#1602; &#1605;&#1583;&#1608;&#1606;&#1578;&#1603; &#1571;&#1610; &#1606;&#1580;&#1575;&#1581; &#1581;&#1602;&#1610;&#1602;&#1610; &#1593;&#1604;&#1609; &#1589;&#1593;&#1610;&#1583; &#1575;&#1604;&#1588;&#1576;&#1603;&#1577; &#1575;&#1604;&#1593;&#1606;&#1603;&#1576;&#1608;&#1578;&#1610;&#1577;. &#1576;&#1610;&#1606;&#1605;&#1575; &#1575;&#1604;&#1605;&#1581;&#1578;&#1608;&#1609; &#1575;&#1604;&#1580;&#1610;&#1583; &#1587;&#1608;&#1575;&#1569; &#1603;&#1575;&#1606; &#1593;&#1576;&#1585; &#1605;&#1606;&#1589;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1571;&#1608; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1607;&#1608; &#1575;&#1604;&#1605;&#1601;&#1578;&#1575;&#1581; &#1575;&#1604;&#1581;&#1602;&#1610;&#1602;&#1610; &#1604;&#1604;&#1606;&#1580;&#1575;&#1581;.</p><h2 dir="rtl">&#1587;&#1575;&#1583;&#1587;&#1575;&#1611;: &#1575;&#1604;&#1578;&#1603;&#1575;&#1604;&#1610;&#1601;</h2><p dir="rtl">&#1578;&#1578;&#1610;&#1581; &#1604;&#1603; &#1605;&#1606;&#1589;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1573;&#1606;&#1588;&#1575;&#1569; &#1605;&#1583;&#1608;&#1606;&#1577; &#1605;&#1580;&#1575;&#1606;&#1610;&#1577; &#1576;&#1588;&#1603;&#1604; &#1603;&#1575;&#1605;&#1604;&#1548; &#1581;&#1610;&#1579; &#1610;&#1578;&#1605; &#1575;&#1587;&#1578;&#1590;&#1575;&#1601;&#1577; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1604;&#1583;&#1609; &#1587;&#1610;&#1585;&#1601;&#1585;&#1575;&#1578; &#1580;&#1608;&#1580;&#1604; &#1583;&#1608;&#1606; &#1583;&#1601;&#1593; &#1571;&#1610; &#1605;&#1576;&#1604;&#1594; &#1605;&#1602;&#1575;&#1576;&#1604; &#1584;&#1604;&#1603;&#1548; &#1576;&#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1577; &#1573;&#1604;&#1609; &#1584;&#1604;&#1603; &#1587;&#1578;&#1581;&#1589;&#1604; &#1593;&#1604;&#1609; 1 &#1580;&#1610;&#1580;&#1575;&#1576;&#1575;&#1610;&#1578; &#1604;&#1578;&#1582;&#1586;&#1610;&#1606; &#1575;&#1604;&#1589;&#1608;&#1585; &#1605;&#1606; &#1582;&#1604;&#1575;&#1604; &#1582;&#1583;&#1605;&#1577; &#1576;&#1610;&#1603;&#1575;&#1587;&#1575; &#1605;&#1580;&#1575;&#1606;&#1575;&#1611; &#1608;&#1610;&#1605;&#1603;&#1606;&#1603; &#1586;&#1610;&#1575;&#1583;&#1578;&#1607;&#1575; &#1573;&#1604;&#1609; 15 &#1580;&#1610;&#1580;&#1575;&#1576;&#1575;&#1610;&#1578; &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1581;&#1587;&#1575;&#1576; &#1580;&#1608;&#1580;&#1604; &#1576;&#1604;&#1587; &#1571;&#1608; &#1581;&#1587;&#1575;&#1576; &#1580;&#1608;&#1580;&#1604; &#1583;&#1585;&#1575;&#1610;&#1601; &#1605;&#1580;&#1575;&#1606;&#1575;&#1611; &#1571;&#1610;&#1590;&#1575;&#1611;&#1548; &#1603;&#1605;&#1575; &#1578;&#1587;&#1605;&#1581; &#1604;&#1603; &#1580;&#1608;&#1580;&#1604; &#1576;&#1606;&#1588;&#1585; &#1593;&#1583;&#1583; &#1604;&#1575; &#1606;&#1607;&#1575;&#1574;&#1610; &#1605;&#1606; &#1575;&#1604;&#1605;&#1608;&#1575;&#1590;&#1610;&#1593; &#1593;&#1576;&#1585; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1608;&#1575;&#1604;&#1602;&#1583;&#1585;&#1577; &#1593;&#1604;&#1609; &#1573;&#1606;&#1588;&#1575;&#1569; &#1593;&#1583;&#1577; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1593;&#1576;&#1585; &#1581;&#1587;&#1575;&#1576; &#1608;&#1575;&#1581;&#1583;&#1548; &#1608;&#1575;&#1604;&#1571;&#1607;&#1605; &#1571;&#1606; &#1580;&#1608;&#1580;&#1604; &#1578;&#1578;&#1610;&#1581; &#1604;&#1605;&#1583;&#1608;&#1606;&#1578;&#1603; &#1581;&#1580;&#1605; &#1578;&#1576;&#1575;&#1583;&#1604; &#1576;&#1610;&#1575;&#1606;&#1575;&#1578; Bandwidth &#1594;&#1610;&#1585; &#1605;&#1581;&#1583;&#1608;&#1583;. &#1608;&#1576;&#1575;&#1604;&#1591;&#1576;&#1593; &#1610;&#1605;&#1603;&#1606; &#1583;&#1601;&#1593; &#1576;&#1593;&#1590; &#1575;&#1604;&#1578;&#1603;&#1575;&#1604;&#1610;&#1601; &#1575;&#1604;&#1576;&#1587;&#1610;&#1591;&#1577; &#1576;&#1581;&#1587;&#1576; &#1575;&#1604;&#1585;&#1594;&#1576;&#1577; &#1604;&#1592;&#1607;&#1608;&#1585; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1576;&#1588;&#1603;&#1604; &#1571;&#1601;&#1590;&#1604; &#1571;&#1607;&#1605;&#1607;&#1575; &#1575;&#1582;&#1578;&#1610;&#1575;&#1585; &#1575;&#1587;&#1605; &#1606;&#1591;&#1575;&#1602;&nbsp;&#1582;&#1575;&#1589; &#1604;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1576;&#1583;&#1604;&#1575;&#1611; &#1593;&#1606; &#1575;&#1587;&#1605; &#1606;&#1591;&#1575;&#1602;&nbsp;&#1601;&#1585;&#1593;&#1610;&nbsp;&#1578;&#1602;&#1583;&#1605;&#1607; &#1576;&#1604;&#1608;&#1580;&#1585; &#1576;&#1588;&#1603;&#1604; &#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1548; &#1576;&#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1577; &#1573;&#1604;&#1609; &#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1577; &#1575;&#1582;&#1578;&#1610;&#1575;&#1585; &#1602;&#1575;&#1604;&#1576; &#1605;&#1583;&#1601;&#1608;&#1593;.</p><p dir="rtl">&#1571;&#1605;&#1575; &#1605;&#1593; &#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1601;&#1610;&#1580;&#1576; &#1593;&#1604;&#1610;&#1603; &#1575;&#1605;&#1578;&#1604;&#1575;&#1603; &#1575;&#1587;&#1578;&#1590;&#1575;&#1601;&#1577; &#1604;&#1605;&#1583;&#1608;&#1606;&#1578;&#1603; &#1605;&#1606; &#1582;&#1604;&#1575;&#1604; &#1573;&#1581;&#1583;&#1609; &#1575;&#1604;&#1588;&#1585;&#1603;&#1575;&#1578; &#1575;&#1604;&#1578;&#1610; &#1578;&#1608;&#1601;&#1585; &#1582;&#1583;&#1605;&#1575;&#1578; &#1575;&#1604;&#1575;&#1587;&#1578;&#1590;&#1575;&#1601;&#1577;&#1548; &#1608;&#1610;&#1580;&#1576; &#1593;&#1604;&#1610;&#1603; &#1581;&#1610;&#1606;&#1607;&#1575; &#1578;&#1581;&#1583;&#1610;&#1583; &#1575;&#1604;&#1605;&#1578;&#1591;&#1604;&#1576;&#1575;&#1578; &#1575;&#1604;&#1578;&#1610; &#1578;&#1581;&#1578;&#1575;&#1580;&#1607;&#1575; &#1605;&#1583;&#1608;&#1606;&#1578;&#1603; &#1605;&#1579;&#1604; &#1575;&#1604;&#1605;&#1587;&#1575;&#1581;&#1577; &#1575;&#1604;&#1578;&#1582;&#1586;&#1610;&#1606;&#1610;&#1577; &#1608;&#1581;&#1580;&#1605; &#1578;&#1576;&#1575;&#1583;&#1604; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1610;&#1605;&#1603;&#1606;&#1603; &#1575;&#1582;&#1578;&#1610;&#1575;&#1585; &#1571;&#1606;&#1587;&#1576; &#1575;&#1604;&#1593;&#1585;&#1608;&#1590; &#1575;&#1604;&#1578;&#1610; &#1578;&#1608;&#1601;&#1585;&#1607;&#1575; &#1588;&#1585;&#1603;&#1575;&#1578; &#1575;&#1604;&#1575;&#1587;&#1578;&#1590;&#1575;&#1601;&#1577; &#1575;&#1604;&#1605;&#1582;&#1578;&#1604;&#1601;&#1577;&#1548; &#1608;&#1576;&#1575;&#1604;&#1591;&#1576;&#1593; &#1587;&#1578;&#1602;&#1608;&#1605; &#1576;&#1583;&#1601;&#1593; &#1605;&#1576;&#1604;&#1594; &#1605;&#1575;&#1583;&#1610; &#1588;&#1607;&#1585;&#1610; &#1576;&#1581;&#1587;&#1576; &#1582;&#1591;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1590;&#1575;&#1601;&#1577; &#1575;&#1604;&#1578;&#1610; &#1575;&#1582;&#1578;&#1585;&#1578;&#1607;&#1575;&#1548; &#1608;&#1603;&#1604;&#1605;&#1575; &#1575;&#1586;&#1583;&#1575;&#1583;&#1578; &#1575;&#1604;&#1605;&#1578;&#1591;&#1604;&#1576;&#1575;&#1578; &#1575;&#1604;&#1582;&#1575;&#1589;&#1577; &#1604;&#1605;&#1583;&#1608;&#1606;&#1578;&#1603; &#1605;&#1579;&#1604; &#1575;&#1604;&#1581;&#1575;&#1580;&#1577; &#1604;&#1605;&#1587;&#1575;&#1581;&#1577; &#1571;&#1603;&#1576;&#1585; &#1571;&#1608; &#1571;&#1589;&#1576;&#1581;&#1578; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1578;&#1587;&#1578;&#1602;&#1591;&#1576; &#1593;&#1583;&#1583; &#1586;&#1608;&#1575;&#1585; &#1571;&#1603;&#1576;&#1585;&#1548; &#1603;&#1604;&#1605;&#1575; &#1575;&#1586;&#1583;&#1575;&#1583;&#1578; &#1575;&#1604;&#1581;&#1575;&#1580;&#1577; &#1604;&#1583;&#1601;&#1593; &#1605;&#1576;&#1575;&#1604;&#1594; &#1573;&#1590;&#1575;&#1601;&#1610;&#1577; &#1608;&#1575;&#1604;&#1575;&#1606;&#1578;&#1602;&#1575;&#1604; &#1604;&#1575;&#1587;&#1578;&#1590;&#1575;&#1601;&#1577; &#1605;&#1606;&#1575;&#1587;&#1576;&#1577; &#1571;&#1603;&#1579;&#1585; &#1604;&#1605;&#1578;&#1591;&#1604;&#1576;&#1575;&#1578; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;.</p><p dir="rtl">&#1607;&#1606;&#1575;&#1603; &#1606;&#1602;&#1591;&#1577; &#1607;&#1575;&#1605;&#1577; &#1605;&#1585;&#1578;&#1576;&#1591;&#1577; &#1576;&#1605;&#1587;&#1571;&#1604;&#1577; &#1575;&#1604;&#1578;&#1603;&#1575;&#1604;&#1610;&#1601; &#1608;&#1607;&#1610; &#1571;&#1610; &#1575;&#1604;&#1605;&#1606;&#1589;&#1578;&#1610;&#1606; &#1571;&#1601;&#1590;&#1604; &#1604;&#1578;&#1581;&#1602;&#1610;&#1602; &#1575;&#1604;&#1583;&#1582;&#1604; &#1605;&#1606; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;&#1567; &#1601;&#1610; &#1575;&#1604;&#1608;&#1575;&#1602;&#1593; &#1605;&#1587;&#1571;&#1604;&#1577; &#1578;&#1581;&#1602;&#1610;&#1602; &#1575;&#1604;&#1583;&#1582;&#1604; &#1607;&#1610; &#1605;&#1587;&#1571;&#1604;&#1577; &#1605;&#1585;&#1578;&#1576;&#1591;&#1577; &#1576;&#1580;&#1608;&#1583;&#1577; &#1575;&#1604;&#1605;&#1581;&#1578;&#1608;&#1609; &#1608;&#1575;&#1582;&#1578;&#1610;&#1575;&#1585;&#1603; &#1604;&#1605;&#1580;&#1575;&#1604; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1576;&#1589;&#1608;&#1585;&#1577; &#1605;&#1604;&#1575;&#1574;&#1605;&#1577; &#1576;&#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1577; &#1573;&#1604;&#1609; &#1575;&#1578;&#1576;&#1575;&#1593; &#1591;&#1585;&#1602; &#1578;&#1587;&#1608;&#1610;&#1602; &#1601;&#1593;&#1575;&#1604;&#1577; &#1604;&#1580;&#1604;&#1576; &#1575;&#1604;&#1605;&#1586;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1586;&#1608;&#1575;&#1585; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1583;&#1582;&#1604; &#1571;&#1601;&#1590;&#1604;&#1548; &#1608;&#1604;&#1610;&#1587; &#1604;&#1607;&#1575; &#1593;&#1604;&#1575;&#1602;&#1577; &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577; &#1571;&#1608; &#1578;&#1604;&#1603; &#1604;&#1603;&#1606; &#1583;&#1593;&#1608;&#1606;&#1575; &#1606;&#1606;&#1608;&#1607; &#1604;&#1571;&#1605;&#1585;&#1610;&#1606;&#1548; &#1575;&#1604;&#1571;&#1608;&#1604; &#1571;&#1606; &#1582;&#1583;&#1605;&#1577; &#1580;&#1608;&#1580;&#1604; &#1571;&#1583;&#1587;&#1606;&#1587; &#1607;&#1610; &#1573;&#1581;&#1583;&#1609; &#1582;&#1583;&#1605;&#1575;&#1578; &#1588;&#1585;&#1603;&#1577; &#1580;&#1608;&#1580;&#1604; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1601;&#1573;&#1606; &#1585;&#1576;&#1591; &#1605;&#1583;&#1608;&#1606;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1576;&#1581;&#1587;&#1575;&#1576; &#1571;&#1583;&#1587;&#1606;&#1587; &#1610;&#1578;&#1605; &#1576;&#1589;&#1608;&#1585;&#1577; &#1587;&#1585;&#1610;&#1593;&#1577; &#1608;&#1578;&#1602;&#1583;&#1605; &#1580;&#1608;&#1580;&#1604; &#1578;&#1587;&#1607;&#1610;&#1604;&#1575;&#1578; &#1604;&#1602;&#1576;&#1608;&#1604; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1575;&#1604;&#1578;&#1575;&#1576;&#1593;&#1577; &#1604;&#1607;&#1575; &#1605;&#1606; &#1582;&#1604;&#1575;&#1604; &#1575;&#1604;&#1578;&#1603;&#1575;&#1605;&#1604; &#1576;&#1610;&#1606; &#1571;&#1583;&#1587;&#1606;&#1587; &#1608;&#1576;&#1604;&#1608;&#1580;&#1585;&#1548; &#1576;&#1610;&#1606;&#1605;&#1575; &#1578;&#1581;&#1578;&#1575;&#1580; &#1571;&#1581;&#1610;&#1575;&#1606;&#1575;&#1611; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1604;&#1576;&#1593;&#1590; &#1575;&#1604;&#1608;&#1602;&#1578; &#1604;&#1575;&#1593;&#1578;&#1605;&#1575;&#1583;&#1607;&#1575; &#1593;&#1576;&#1585; &#1580;&#1608;&#1580;&#1604; &#1571;&#1583;&#1587;&#1606;&#1587;. &#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1579;&#1575;&#1606;&#1610; &#1610;&#1578;&#1593;&#1604;&#1602; &#1576;&#1605;&#1587;&#1578;&#1602;&#1576;&#1604; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;&#1548; &#1601;&#1573;&#1584;&#1575; &#1571;&#1585;&#1583;&#1578; &#1578;&#1581;&#1608;&#1610;&#1604; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1573;&#1604;&#1609; &#1571;&#1588;&#1576;&#1607; &#1576;&#1575;&#1604;&#1605;&#1588;&#1585;&#1608;&#1593; &#1575;&#1604;&#1578;&#1580;&#1575;&#1585;&#1610; &#1608;&#1578;&#1581;&#1602;&#1610;&#1602; &#1583;&#1582;&#1604; &#1571;&#1603;&#1576;&#1585; &#1601;&#1585;&#1576;&#1605;&#1575; &#1578;&#1581;&#1578;&#1575;&#1580; &#1581;&#1610;&#1606;&#1607;&#1575; &#1604;&#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1571;&#1603;&#1576;&#1585; &#1604;&#1573;&#1583;&#1575;&#1585;&#1577; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1587;&#1578;&#1603;&#1608;&#1606; &#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1582;&#1610;&#1575;&#1585;&#1603; &#1575;&#1604;&#1571;&#1601;&#1590;&#1604;.</p><p dir="rtl"><strong>&#1575;&#1604;&#1582;&#1604;&#1575;&#1589;&#1577;</strong>: &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585; &#1604;&#1607;&#1575; &#1575;&#1604;&#1571;&#1601;&#1590;&#1604;&#1610;&#1577; &#1605;&#1606; &#1581;&#1610;&#1579; &#1575;&#1604;&#1578;&#1603;&#1575;&#1604;&#1610;&#1601;&#1548; &#1576;&#1610;&#1606;&#1605;&#1575; &#1610;&#1580;&#1576; &#1571;&#1606; &#1610;&#1578;&#1608;&#1601;&#1585; &#1604;&#1603; &#1605;&#1576;&#1604;&#1594; &#1605;&#1575;&#1583;&#1610; &#1604;&#1573;&#1606;&#1588;&#1575;&#1569; &#1605;&#1583;&#1608;&#1606;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587;.</p><h2 dir="rtl">&#1587;&#1575;&#1576;&#1593;&#1575;&#1611;: &#1575;&#1604;&#1571;&#1605;&#1575;&#1606;</h2><p dir="rtl">&#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1603; &#1604;&#1605;&#1606;&#1589;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1601;&#1571;&#1606;&#1578; &#1578;&#1602;&#1608;&#1604; &#1608;&#1583;&#1575;&#1593;&#1575;&#1611; &#1604;&#1605;&#1588;&#1575;&#1603;&#1604; &#1575;&#1604;&#1571;&#1605;&#1575;&#1606; &#1608;&#1575;&#1604;&#1581;&#1605;&#1575;&#1610;&#1577; &#1575;&#1604;&#1582;&#1575;&#1589;&#1577; &#1576;&#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;&#1548; &#1601;&#1588;&#1585;&#1603;&#1577; &#1580;&#1608;&#1580;&#1604; &#1607;&#1610; &#1575;&#1604;&#1605;&#1587;&#1572;&#1608;&#1604; &#1575;&#1604;&#1605;&#1576;&#1575;&#1588;&#1585; &#1593;&#1606; &#1575;&#1604;&#1605;&#1593;&#1575;&#1604;&#1580;&#1577; &#1575;&#1604;&#1571;&#1605;&#1606;&#1610;&#1577; &#1604;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1608;&#1581;&#1605;&#1575;&#1610;&#1578;&#1607;&#1575; &#1605;&#1606; &#1575;&#1604;&#1575;&#1582;&#1578;&#1585;&#1575;&#1602;&#1548; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1601;&#1604;&#1610;&#1587; &#1607;&#1606;&#1575;&#1603; &#1583;&#1575;&#1593;&#1610; &#1604;&#1608;&#1590;&#1593; &#1573;&#1590;&#1575;&#1601;&#1575;&#1578; &#1571;&#1608; &#1582;&#1583;&#1605;&#1575;&#1578; &#1571;&#1605;&#1606;&#1610;&#1577; &#1571;&#1608; &#1575;&#1604;&#1575;&#1587;&#1578;&#1593;&#1575;&#1606;&#1577; &#1576;&#1571;&#1581;&#1583; &#1575;&#1604;&#1605;&#1582;&#1578;&#1589;&#1610;&#1606; &#1601;&#1610; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1580;&#1575;&#1604;. &#1608;&#1604;&#1594;&#1575;&#1610;&#1577; &#1575;&#1604;&#1570;&#1606; &#1578;&#1593;&#1578;&#1576;&#1585; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585; &#1593;&#1589;&#1610;&#1577; &#1593;&#1604;&#1609; &#1575;&#1604;&#1575;&#1582;&#1578;&#1585;&#1575;&#1602; &#1605;&#1606; &#1602;&#1576;&#1604; &#1575;&#1604;&#1602;&#1585;&#1575;&#1589;&#1606;&#1577; &#1608;&#1585;&#1576;&#1605;&#1575; &#1578;&#1593;&#1578;&#1576;&#1585; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1610;&#1586;&#1577; &#1607;&#1610; &#1575;&#1604;&#1571;&#1602;&#1608;&#1609; &#1605;&#1606; &#1576;&#1610;&#1606; &#1603;&#1604; &#1575;&#1604;&#1605;&#1605;&#1610;&#1586;&#1575;&#1578; &#1575;&#1604;&#1582;&#1575;&#1589;&#1577; &#1576;&#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585;.</p><p dir="rtl">&#1571;&#1605;&#1575; &#1593;&#1606;&#1583; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1603; &#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1601;&#1587;&#1578;&#1603;&#1608;&#1606; &#1571;&#1606;&#1578; &#1575;&#1604;&#1605;&#1587;&#1572;&#1608;&#1604; &#1575;&#1604;&#1571;&#1587;&#1575;&#1587;&#1610; &#1593;&#1606; &#1578;&#1608;&#1601;&#1610;&#1585; &#1575;&#1604;&#1581;&#1605;&#1575;&#1610;&#1577; &#1575;&#1604;&#1604;&#1575;&#1586;&#1605;&#1577; &#1604;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1608;&#1605;&#1578;&#1575;&#1576;&#1593;&#1578;&#1607;&#1575; &#1601;&#1610; &#1581;&#1575;&#1604; &#1581;&#1583;&#1608;&#1579; &#1571;&#1610; &#1582;&#1604;&#1604; &#1571;&#1608; &#1575;&#1582;&#1578;&#1585;&#1575;&#1602;. &#1608;&#1576;&#1575;&#1604;&#1585;&#1594;&#1605; &#1605;&#1606; &#1608;&#1580;&#1608;&#1583; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1575;&#1578; &#1575;&#1604;&#1605;&#1578;&#1593;&#1604;&#1602;&#1577; &#1576;&#1575;&#1604;&#1581;&#1605;&#1575;&#1610;&#1577; &#1608;&#1575;&#1604;&#1578;&#1591;&#1608;&#1610;&#1585; &#1608;&#1575;&#1604;&#1578;&#1581;&#1583;&#1610;&#1579; &#1575;&#1604;&#1571;&#1605;&#1606;&#1610; &#1575;&#1604;&#1583;&#1575;&#1574;&#1605; &#1604;&#1604;&#1605;&#1606;&#1589;&#1577; &#1573;&#1604;&#1575; &#1571;&#1606; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1578;&#1576;&#1602;&#1609; &#1593;&#1585;&#1590;&#1577; &#1604;&#1607;&#1580;&#1605;&#1575;&#1578; &#1575;&#1604;&#1602;&#1585;&#1575;&#1589;&#1606;&#1577;. &#1601;&#1605;&#1579;&#1604;&#1575;&#1611; &#1605;&#1606; &#1575;&#1604;&#1605;&#1605;&#1603;&#1606; &#1571;&#1606; &#1578;&#1578;&#1593;&#1585;&#1590; &#1576;&#1593;&#1590; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1604;&#1607;&#1580;&#1605;&#1575;&#1578; &#1581;&#1580;&#1576; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; DDOS &#1608;&#1573;&#1610;&#1602;&#1575;&#1601;&#1607;&#1575; &#1604;&#1605;&#1583;&#1577; &#1605;&#1593;&#1610;&#1606;&#1577;&#1548; &#1576;&#1610;&#1606;&#1605;&#1575; &#1604;&#1575; &#1610;&#1605;&#1603;&#1606; &#1581;&#1583;&#1608;&#1579; &#1571;&#1605;&#1585; &#1605;&#1606; &#1607;&#1584;&#1575; &#1575;&#1604;&#1602;&#1576;&#1610;&#1604; &#1605;&#1593; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585; &#1608;&#1587;&#1610;&#1585;&#1601;&#1585;&#1575;&#1578; &#1580;&#1608;&#1580;&#1604;&#1548; &#1608;&#1576;&#1575;&#1604;&#1591;&#1576;&#1593; &#1607;&#1584;&#1575; &#1604;&#1575; &#1610;&#1593;&#1606;&#1610; &#1571;&#1606; &#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1607;&#1610; &#1605;&#1606;&#1589;&#1577; &#1594;&#1610;&#1585; &#1570;&#1605;&#1606;&#1577;&#1548; &#1604;&#1603;&#1606; &#1601;&#1610; &#1606;&#1601;&#1587; &#1575;&#1604;&#1608;&#1602;&#1578; &#1610;&#1580;&#1576; &#1575;&#1604;&#1575;&#1607;&#1578;&#1605;&#1575;&#1605; &#1576;&#1607;&#1584;&#1607; &#1575;&#1604;&#1606;&#1602;&#1591;&#1577; &#1605;&#1606; &#1602;&#1576;&#1604; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606; &#1604;&#1590;&#1605;&#1575;&#1606; &#1593;&#1583;&#1605; &#1608;&#1580;&#1608;&#1583; &#1571;&#1610; &#1605;&#1588;&#1575;&#1603;&#1604; &#1605;&#1587;&#1578;&#1602;&#1576;&#1604;&#1610;&#1577;.</p><p dir="rtl"><strong>&#1575;&#1604;&#1582;&#1604;&#1575;&#1589;&#1577;</strong>: &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585; &#1604;&#1607;&#1575; &#1571;&#1601;&#1590;&#1604;&#1610;&#1577; &#1608;&#1575;&#1590;&#1581;&#1577; &#1605;&#1606; &#1581;&#1610;&#1579; &#1575;&#1604;&#1571;&#1605;&#1575;&#1606; &#1608;&#1575;&#1604;&#1581;&#1605;&#1575;&#1610;&#1577;&#1548; &#1576;&#1610;&#1606;&#1605;&#1575; &#1578;&#1581;&#1578;&#1575;&#1580; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1573;&#1604;&#1609; &#1575;&#1604;&#1605;&#1578;&#1575;&#1576;&#1593;&#1577; &#1605;&#1606; &#1589;&#1575;&#1581;&#1576; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1604;&#1578;&#1608;&#1601;&#1610;&#1585; &#1575;&#1604;&#1581;&#1605;&#1575;&#1610;&#1577; &#1575;&#1604;&#1604;&#1575;&#1586;&#1605;&#1577;.</p><h2 dir="rtl">&#1579;&#1575;&#1605;&#1606;&#1575;&#1611;: &#1575;&#1604;&#1583;&#1593;&#1605;</h2><p dir="rtl">&#1604;&#1604;&#1571;&#1587;&#1601; &#1601;&#1573;&#1606; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585; &#1604;&#1575; &#1578;&#1578;&#1605;&#1578;&#1593; &#1576;&#1583;&#1593;&#1605; &#1581;&#1602;&#1610;&#1602;&#1610; &#1605;&#1606; &#1591;&#1585;&#1601; &#1580;&#1608;&#1580;&#1604;&#1548; &#1601;&#1601;&#1610; &#1581;&#1575;&#1604; &#1575;&#1582;&#1578;&#1610;&#1575;&#1585;&#1603; &#1604;&#1604;&#1578;&#1583;&#1608;&#1610;&#1606; &#1593;&#1576;&#1585; &#1605;&#1606;&#1589;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1593;&#1604;&#1610;&#1603; &#1571;&#1606; &#1578;&#1606;&#1587;&#1609; &#1578;&#1605;&#1575;&#1605;&#1575;&#1611; &#1576;&#1593;&#1590; &#1575;&#1604;&#1605;&#1589;&#1591;&#1604;&#1581;&#1575;&#1578; &#1605;&#1579;&#1604; &#1601;&#1585;&#1610;&#1602; &#1575;&#1604;&#1583;&#1593;&#1605; &#1571;&#1608; &#1605;&#1580;&#1578;&#1605;&#1593; &#1575;&#1604;&#1583;&#1593;&#1605; &#1608;&#1605;&#1606; &#1575;&#1604;&#1571;&#1601;&#1590;&#1604; &#1571;&#1604;&#1575; &#1578;&#1578;&#1593;&#1576; &#1606;&#1601;&#1587;&#1603; &#1601;&#1610; &#1605;&#1581;&#1575;&#1608;&#1604;&#1577; &#1575;&#1604;&#1575;&#1578;&#1589;&#1575;&#1604; &#1576;&#1607;&#1605; &#1571;&#1608; &#1581;&#1578;&#1609; &#1575;&#1604;&#1576;&#1581;&#1579; &#1593;&#1606; &#1591;&#1585;&#1610;&#1602;&#1577; &#1604;&#1604;&#1575;&#1578;&#1589;&#1575;&#1604;. &#1608;&#1604;&#1604;&#1578;&#1608;&#1590;&#1610;&#1581; &#1571;&#1603;&#1579;&#1585; &#1610;&#1608;&#1580;&#1583; &#1607;&#1606;&#1575;&#1603; &#1605;&#1606;&#1578;&#1583;&#1609; &#1583;&#1593;&#1605; &#1585;&#1587;&#1605;&#1610; &#1582;&#1575;&#1589; &#1576;&#1576;&#1604;&#1608;&#1580;&#1585; &#1610;&#1591;&#1585;&#1581; &#1576;&#1593;&#1590; &#1575;&#1604;&#1605;&#1588;&#1575;&#1603;&#1604; &#1608;&#1575;&#1604;&#1581;&#1604;&#1608;&#1604; &#1575;&#1604;&#1582;&#1575;&#1589;&#1577; &#1576;&#1576;&#1604;&#1608;&#1580;&#1585; &#1608;&#1610;&#1605;&#1603;&#1606;&#1603; &#1575;&#1604;&#1576;&#1581;&#1579; &#1582;&#1604;&#1575;&#1604;&#1607; &#1593;&#1606; &#1573;&#1581;&#1583;&#1609; &#1575;&#1604;&#1605;&#1588;&#1575;&#1603;&#1604; &#1575;&#1604;&#1578;&#1610; &#1608;&#1575;&#1580;&#1607;&#1578;&#1603;&#1548; &#1604;&#1603;&#1606; &#1593;&#1604;&#1609; &#1575;&#1604;&#1571;&#1594;&#1604;&#1576; &#1604;&#1606; &#1578;&#1580;&#1583; &#1607;&#1606;&#1575;&#1603; &#1571;&#1610; &#1605;&#1587;&#1575;&#1593;&#1583;&#1577; &#1581;&#1602;&#1610;&#1602;&#1610;&#1577; &#1604;&#1581;&#1604; &#1605;&#1588;&#1603;&#1604;&#1578;&#1603; &#1593;&#1576;&#1585; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1606;&#1578;&#1583;&#1610;&#1575;&#1578; &#1571;&#1608; &#1581;&#1578;&#1609; &#1571;&#1610; &#1578;&#1601;&#1575;&#1593;&#1604; &#1605;&#1606; &#1602;&#1576;&#1604; &#1575;&#1604;&#1605;&#1591;&#1608;&#1585;&#1610;&#1606;. &#1608;&#1576;&#1575;&#1582;&#1578;&#1589;&#1575;&#1585; &#1573;&#1606; &#1608;&#1575;&#1580;&#1607;&#1578;&#1603; &#1605;&#1588;&#1603;&#1604;&#1577; &#1583;&#1575;&#1582;&#1604; &#1576;&#1604;&#1608;&#1580;&#1585; &#1601;&#1593;&#1604;&#1610;&#1603; &#1575;&#1582;&#1578;&#1589;&#1575;&#1585; &#1575;&#1604;&#1608;&#1602;&#1578; &#1608;&#1575;&#1604;&#1593;&#1605;&#1604; &#1593;&#1604;&#1609; &#1573;&#1610;&#1580;&#1575;&#1583; &#1575;&#1604;&#1581;&#1604; &#1576;&#1606;&#1601;&#1587;&#1603; &#1571;&#1608; &#1593;&#1606; &#1591;&#1585;&#1610;&#1602; &#1575;&#1604;&#1575;&#1587;&#1578;&#1593;&#1575;&#1606;&#1577; &#1576;&#1571;&#1581;&#1583; &#1575;&#1604;&#1605;&#1582;&#1578;&#1589;&#1610;&#1606; &#1576;&#1593;&#1610;&#1583;&#1575;&#1611; &#1593;&#1606; &#1575;&#1604;&#1583;&#1593;&#1605; &#1575;&#1604;&#1585;&#1587;&#1605;&#1610; &#1605;&#1606; &#1580;&#1608;&#1580;&#1604;.</p><p dir="rtl">&#1571;&#1605;&#1575; &#1576;&#1575;&#1604;&#1606;&#1587;&#1576;&#1577; &#1604;&#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1601;&#1607;&#1610; &#1578;&#1578;&#1605;&#1578;&#1593; &#1576;&#1583;&#1593;&#1605; &#1601;&#1606;&#1610; &#1603;&#1575;&#1605;&#1604;&#1548; &#1605;&#1593; &#1608;&#1580;&#1608;&#1583; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1605;&#1587;&#1575;&#1607;&#1605;&#1610;&#1606; &#1608;&#1575;&#1604;&#1605;&#1591;&#1608;&#1585;&#1610;&#1606; &#1575;&#1604;&#1605;&#1587;&#1578;&#1593;&#1583;&#1610;&#1606; &#1604;&#1578;&#1602;&#1583;&#1610;&#1605; &#1575;&#1604;&#1605;&#1587;&#1575;&#1593;&#1583;&#1577; &#1593;&#1576;&#1585; &#1602;&#1587;&#1605; &#1575;&#1604;&#1605;&#1587;&#1575;&#1593;&#1583;&#1577; &#1571;&#1608; &#1575;&#1604;&#1605;&#1606;&#1578;&#1583;&#1609; &#1575;&#1604;&#1585;&#1587;&#1605;&#1610; &#1575;&#1604;&#1582;&#1575;&#1589; &#1576;&#1575;&#1604;&#1605;&#1606;&#1589;&#1577;&#1548; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1587;&#1578;&#1580;&#1583; &#1581;&#1604;&#1575;&#1611; &#1604;&#1571;&#1594;&#1604;&#1576; &#1575;&#1604;&#1605;&#1588;&#1575;&#1603;&#1604; &#1575;&#1604;&#1578;&#1610; &#1602;&#1583; &#1578;&#1608;&#1575;&#1580;&#1607;&#1603; &#1593;&#1606;&#1583; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1603; &#1604;&#1604;&#1605;&#1606;&#1589;&#1577; &#1576;&#1603;&#1604; &#1587;&#1607;&#1608;&#1604;&#1577;.</p><p dir="rtl"><strong>&#1575;&#1604;&#1582;&#1604;&#1575;&#1589;&#1577;</strong>: &#1578;&#1605;&#1578;&#1604;&#1603; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1571;&#1601;&#1590;&#1604;&#1610;&#1577; &#1603;&#1575;&#1605;&#1604;&#1577; &#1605;&#1606; &#1581;&#1610;&#1579; &#1575;&#1604;&#1583;&#1593;&#1605; &#1575;&#1604;&#1601;&#1606;&#1610; &#1608;&#1573;&#1610;&#1580;&#1575;&#1583; &#1575;&#1604;&#1581;&#1604;&#1608;&#1604; &#1604;&#1571;&#1610; &#1605;&#1588;&#1603;&#1604;&#1577; &#1578;&#1608;&#1575;&#1580;&#1607; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;.</p><h2 dir="rtl">&#1578;&#1575;&#1587;&#1593;&#1575;&#1611;: &#1605;&#1587;&#1578;&#1602;&#1576;&#1604; &#1575;&#1604;&#1605;&#1606;&#1589;&#1617;&#1578;&#1610;&#1606;</h2><p dir="rtl">&#1583;&#1593;&#1608;&#1606;&#1575; &#1606;&#1593;&#1608;&#1583; &#1573;&#1604;&#1609; &#1575;&#1604;&#1608;&#1585;&#1575;&#1569; &#1602;&#1604;&#1610;&#1604;&#1575;&#1611; &#1608;&#1606;&#1578;&#1584;&#1603;&#1585; &#1575;&#1604;&#1582;&#1591;&#1608;&#1577; &#1575;&#1604;&#1578;&#1610; &#1602;&#1575;&#1605;&#1578; &#1576;&#1607;&#1575; &#1588;&#1585;&#1603;&#1577; &#1610;&#1575;&#1607;&#1608; &#1576;&#1573;&#1594;&#1604;&#1575;&#1602; &#1605;&#1606;&#1578;&#1583;&#1610;&#1575;&#1578; &#1605;&#1603;&#1578;&#1608;&#1576; &#1608;&#1575;&#1604;&#1589;&#1583;&#1605;&#1577; &#1575;&#1604;&#1578;&#1610; &#1578;&#1604;&#1602;&#1578;&#1607;&#1575; &#1588;&#1585;&#1610;&#1581;&#1577; &#1608;&#1575;&#1587;&#1593;&#1577; &#1605;&#1606; &#1575;&#1604;&#1605;&#1587;&#1578;&#1582;&#1583;&#1605;&#1610;&#1606; &#1601;&#1610; &#1575;&#1604;&#1593;&#1575;&#1604;&#1605; &#1575;&#1604;&#1593;&#1585;&#1576;&#1610; &#1581;&#1610;&#1606;&#1607;&#1575;.</p><p dir="rtl">&#1604;&#1603;&#1606; &#1604;&#1575; &#1588;&#1603; &#1571;&#1606; &#1607;&#1584;&#1607; &#1575;&#1604;&#1589;&#1583;&#1605;&#1577; &#1587;&#1578;&#1603;&#1608;&#1606; &#1605;&#1578;&#1608;&#1575;&#1590;&#1593;&#1577; &#1580;&#1583;&#1575;&#1611; &#1601;&#1610; &#1581;&#1575;&#1604; &#1571;&#1602;&#1583;&#1605;&#1578; &#1580;&#1608;&#1580;&#1604; &#1593;&#1604;&#1609; &#1573;&#1594;&#1604;&#1575;&#1602; &#1582;&#1583;&#1605;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1576;&#1593;&#1583; &#1601;&#1578;&#1585;&#1577; &#1605;&#1593;&#1610;&#1606;&#1577; &#1605;&#1606; &#1575;&#1604;&#1586;&#1605;&#1606;&#1548; &#1608;&#1604;&#1603; &#1571;&#1606; &#1578;&#1578;&#1589;&#1608;&#1585; &#1584;&#1604;&#1603; &#1575;&#1604;&#1570;&#1606;.</p><p dir="rtl">&#1607;&#1606;&#1575;&#1603; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1605;&#1582;&#1575;&#1608;&#1601; &#1581;&#1608;&#1604; &#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1577; &#1573;&#1602;&#1576;&#1575;&#1604; &#1580;&#1608;&#1580;&#1604; &#1593;&#1604;&#1609; &#1582;&#1591;&#1608;&#1577; &#1588;&#1576;&#1610;&#1607;&#1577; &#1576;&#1582;&#1591;&#1608;&#1577; &#1610;&#1575;&#1607;&#1608; &#1610;&#1608;&#1605;&#1575;&#1611; &#1605;&#1575;&#1548; &#1608;&#1605;&#1605;&#1575; &#1610;&#1588;&#1610;&#1585; &#1593;&#1604;&#1609; &#1607;&#1584;&#1575; &#1575;&#1604;&#1571;&#1605;&#1585; &#1571;&#1606; &#1588;&#1585;&#1603;&#1577; &#1580;&#1608;&#1580;&#1604; &#1604;&#1605; &#1578;&#1602;&#1605; &#1576;&#1573;&#1591;&#1604;&#1575;&#1602; &#1571;&#1610; &#1578;&#1581;&#1583;&#1610;&#1579;&#1575;&#1578; &#1581;&#1602;&#1610;&#1602;&#1610;&#1577; &#1571;&#1608; &#1578;&#1591;&#1608;&#1610;&#1585; &#1601;&#1593;&#1604;&#1610; &#1593;&#1604;&#1609; &#1605;&#1606;&#1589;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1605;&#1606;&#1584; &#1601;&#1578;&#1585;&#1577; &#1591;&#1608;&#1610;&#1604;&#1577; &#1580;&#1583;&#1575;&#1611;&#1548; &#1576;&#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1577; &#1573;&#1604;&#1609; &#1571;&#1606; &#1578;&#1591;&#1576;&#1610;&#1602; &#1576;&#1604;&#1608;&#1580;&#1585; &#1604;&#1606;&#1592;&#1575;&#1605; &#1571;&#1606;&#1583;&#1585;&#1608;&#1610;&#1583; &#1610;&#1593;&#1578;&#1576;&#1585; &#1605;&#1606; &#1571;&#1587;&#1608;&#1571; &#1575;&#1604;&#1578;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1575;&#1604;&#1578;&#1610; &#1571;&#1591;&#1604;&#1602;&#1578;&#1607;&#1575; &#1575;&#1604;&#1588;&#1585;&#1603;&#1577;&#1548; &#1605;&#1605;&#1575; &#1610;&#1593;&#1591;&#1610; &#1575;&#1606;&#1591;&#1576;&#1575;&#1593;&#1575;&#1611; &#1604;&#1583;&#1609; &#1575;&#1604;&#1576;&#1593;&#1590; &#1576;&#1593;&#1583;&#1605; &#1575;&#1607;&#1578;&#1605;&#1575;&#1605; &#1580;&#1608;&#1580;&#1604; &#1576;&#1605;&#1606;&#1589;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1576;&#1588;&#1603;&#1604; &#1580;&#1583;&#1610;&#1548; &#1608;&#1578;&#1585;&#1603;&#1610;&#1586;&#1607;&#1575; &#1576;&#1588;&#1603;&#1604; &#1603;&#1576;&#1610;&#1585; &#1580;&#1583;&#1575;&#1611; &#1593;&#1604;&#1609; &#1582;&#1583;&#1605;&#1577; &#1610;&#1608;&#1578;&#1610;&#1608;&#1576; &#1575;&#1604;&#1578;&#1610; &#1578;&#1581;&#1602;&#1602; &#1604;&#1607;&#1575; &#1571;&#1585;&#1576;&#1575;&#1581; &#1591;&#1575;&#1574;&#1604;&#1577;.</p><p dir="rtl">&#1608;&#1593;&#1604;&#1609; &#1575;&#1604;&#1585;&#1594;&#1605; &#1605;&#1606; &#1571;&#1606; &#1575;&#1604;&#1605;&#1582;&#1575;&#1608;&#1601; &#1576;&#1573;&#1594;&#1604;&#1575;&#1602; &#1582;&#1583;&#1605;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1607;&#1610; &#1605;&#1582;&#1575;&#1608;&#1601; &#1605;&#1576;&#1585;&#1585;&#1577;&#1548; &#1604;&#1603;&#1606; &#1604;&#1575; &#1578;&#1608;&#1580;&#1583; &#1571;&#1610; &#1583;&#1604;&#1575;&#1574;&#1604; &#1581;&#1602;&#1610;&#1602;&#1610;&#1577; &#1578;&#1583;&#1593;&#1605;&#1607;&#1575; &#1571;&#1608; &#1581;&#1578;&#1609; &#1578;&#1604;&#1605;&#1610;&#1581;&#1575;&#1578; &#1581;&#1608;&#1604; &#1575;&#1604;&#1571;&#1605;&#1585; &#1605;&#1606; &#1588;&#1585;&#1603;&#1577; &#1580;&#1608;&#1580;&#1604;&#1548; &#1608;&#1575;&#1604;&#1605;&#1602;&#1575;&#1585;&#1606;&#1577; &#1576;&#1605;&#1587;&#1571;&#1604;&#1577; &#1573;&#1594;&#1604;&#1575;&#1602; &#1610;&#1575;&#1607;&#1608; &#1604;&#1605;&#1603;&#1578;&#1608;&#1576; &#1604;&#1575; &#1578;&#1587;&#1578;&#1602;&#1610;&#1605; &#1605;&#1591;&#1604;&#1602;&#1575;&#1611;&#1548; &#1608;&#1575;&#1604;&#1605;&#1578;&#1575;&#1576;&#1593; &#1575;&#1604;&#1580;&#1610;&#1583; &#1604;&#1604;&#1571;&#1581;&#1583;&#1575;&#1579; &#1610;&#1593;&#1604;&#1605; &#1575;&#1604;&#1589;&#1593;&#1608;&#1576;&#1575;&#1578; &#1575;&#1604;&#1578;&#1610; &#1608;&#1575;&#1580;&#1607;&#1578;&#1607;&#1575; &#1605;&#1575;&#1585;&#1610;&#1587;&#1575; &#1605;&#1575;&#1610;&#1585; &#1575;&#1604;&#1585;&#1574;&#1610;&#1587;&#1577; &#1575;&#1604;&#1578;&#1606;&#1601;&#1610;&#1584;&#1610;&#1577; &#1604;&#1588;&#1585;&#1603;&#1577; &#1610;&#1575;&#1607;&#1608; &#1608;&#1575;&#1590;&#1591;&#1585;&#1575;&#1585;&#1607;&#1575; &#1593;&#1604;&#1609; &#1575;&#1578;&#1582;&#1575;&#1584; &#1593;&#1583;&#1577; &#1582;&#1591;&#1608;&#1575;&#1578; &#1581;&#1575;&#1587;&#1605;&#1577; &#1608;&#1602;&#1608;&#1610;&#1577;&#1548; &#1608;&#1607;&#1608; &#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1584;&#1610; &#1604;&#1575; &#1578;&#1593;&#1575;&#1606;&#1610; &#1605;&#1606;&#1607; &#1580;&#1608;&#1580;&#1604; &#1581;&#1575;&#1604;&#1610;&#1575;&#1611; &#1608;&#1604;&#1575; &#1581;&#1578;&#1609; &#1601;&#1610; &#1575;&#1604;&#1587;&#1606;&#1608;&#1575;&#1578; &#1575;&#1604;&#1602;&#1604;&#1610;&#1604;&#1577; &#1575;&#1604;&#1605;&#1602;&#1576;&#1604;&#1577;.</p><p dir="rtl">&#1604;&#1603;&#1606; &#1604;&#1606;&#1601;&#1578;&#1585;&#1590; &#1601;&#1610; &#1571;&#1587;&#1608;&#1569; &#1575;&#1604;&#1581;&#1575;&#1604;&#1575;&#1578; &#1571;&#1606; &#1580;&#1608;&#1580;&#1604; &#1602;&#1575;&#1605;&#1578; &#1576;&#1573;&#1594;&#1604;&#1575;&#1602; &#1582;&#1583;&#1605;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1601;&#1607;&#1604; &#1610;&#1593;&#1606;&#1610; &#1584;&#1604;&#1603; &#1590;&#1610;&#1575;&#1593; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;&#1567; &#1576;&#1575;&#1604;&#1578;&#1571;&#1603;&#1610;&#1583; &#1604;&#1575; &#1601;&#1588;&#1585;&#1603;&#1577; &#1593;&#1605;&#1604;&#1575;&#1602;&#1577; &#1605;&#1579;&#1604; &#1580;&#1608;&#1580;&#1604; &#1604;&#1606; &#1578;&#1578;&#1585;&#1603; &#1575;&#1604;&#1605;&#1587;&#1578;&#1582;&#1583;&#1605; &#1575;&#1604;&#1584;&#1610; &#1608;&#1590;&#1593; &#1575;&#1604;&#1579;&#1602;&#1577; &#1601;&#1610; &#1582;&#1583;&#1605;&#1575;&#1578;&#1607;&#1575; &#1604;&#1587;&#1606;&#1608;&#1575;&#1578; &#1583;&#1608;&#1606; &#1573;&#1610;&#1580;&#1575;&#1583; &#1581;&#1604; &#1601;&#1593;&#1575;&#1604;&#1548; &#1608;&#1571;&#1576;&#1587;&#1591; &#1607;&#1584;&#1607; &#1575;&#1604;&#1581;&#1604;&#1608;&#1604; &#1607;&#1608; &#1573;&#1593;&#1591;&#1575;&#1569; &#1605;&#1607;&#1604;&#1577; &#1586;&#1605;&#1606;&#1610;&#1577; &#1605;&#1593;&#1610;&#1606;&#1577; &#1604;&#1606;&#1602;&#1604; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1593;&#1576;&#1585; &#1605;&#1606;&#1589;&#1577; &#1571;&#1582;&#1585;&#1609;. &#1576;&#1575;&#1604;&#1591;&#1576;&#1593; &#1587;&#1578;&#1603;&#1608;&#1606; &#1607;&#1606;&#1575;&#1603; &#1571;&#1590;&#1585;&#1575;&#1585; &#1605;&#1593;&#1610;&#1606;&#1577; &#1580;&#1585;&#1575;&#1569; &#1584;&#1604;&#1603; &#1604;&#1603;&#1606; &#1610;&#1605;&#1603;&#1606; &#1605;&#1593; &#1575;&#1604;&#1608;&#1602;&#1578; &#1578;&#1583;&#1575;&#1585;&#1603; &#1607;&#1584;&#1607; &#1575;&#1604;&#1571;&#1590;&#1585;&#1575;&#1585; &#1608;&#1575;&#1604;&#1578;&#1594;&#1604;&#1576; &#1593;&#1604;&#1610;&#1607;&#1575;.</p><p dir="rtl">&#1571;&#1605;&#1575; &#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1601;&#1604;&#1575; &#1588;&#1603; &#1571;&#1606; &#1571;&#1605;&#1575;&#1605;&#1607;&#1575; &#1605;&#1587;&#1578;&#1602;&#1576;&#1604;&#1575;&#1611; &#1608;&#1575;&#1593;&#1583;&#1575;&#1611;&#1548; &#1601;&#1607;&#1610; &#1578;&#1587;&#1610;&#1585; &#1610;&#1608;&#1605;&#1575;&#1611; &#1576;&#1593;&#1583; &#1610;&#1608;&#1605; &#1606;&#1581;&#1608; &#1605;&#1586;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1578;&#1591;&#1608;&#1610;&#1585; &#1608;&#1575;&#1604;&#1578;&#1581;&#1583;&#1610;&#1579; &#1582;&#1589;&#1608;&#1589;&#1575;&#1611; &#1605;&#1593; &#1608;&#1580;&#1608;&#1583; &#1570;&#1604;&#1575;&#1601; &#1575;&#1604;&#1605;&#1591;&#1608;&#1585;&#1610;&#1606; &#1608;&#1575;&#1604;&#1605;&#1582;&#1578;&#1589;&#1610;&#1606; &#1601;&#1610; &#1575;&#1604;&#1576;&#1585;&#1605;&#1580;&#1577; &#1571;&#1608; &#1575;&#1604;&#1578;&#1589;&#1605;&#1610;&#1605; &#1608;&#1575;&#1604;&#1605;&#1608;&#1575;&#1590;&#1610;&#1593; &#1575;&#1604;&#1605;&#1585;&#1578;&#1576;&#1591;&#1577; &#1576;&#1578;&#1591;&#1608;&#1610;&#1585; &#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587;&#1548; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1601;&#1573;&#1606; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1603; &#1604;&#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1587;&#1610;&#1588;&#1593;&#1585;&#1603; &#1576;&#1575;&#1591;&#1605;&#1574;&#1606;&#1575;&#1606; &#1571;&#1603;&#1576;&#1585; &#1581;&#1608;&#1604; &#1605;&#1587;&#1578;&#1602;&#1576;&#1604; &#1605;&#1583;&#1608;&#1606;&#1578;&#1603; &#1608;&#1578;&#1591;&#1608;&#1610;&#1585;&#1607;&#1575; &#1576;&#1588;&#1603;&#1604; &#1583;&#1575;&#1574;&#1605;&#1548; &#1576;&#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1577; &#1573;&#1604;&#1609; &#1584;&#1604;&#1603; &#1587;&#1578;&#1603;&#1608;&#1606; &#1571;&#1606;&#1578; &#1575;&#1604;&#1605;&#1578;&#1581;&#1603;&#1605; &#1575;&#1604;&#1608;&#1581;&#1610;&#1583; &#1601;&#1610; &#1605;&#1589;&#1610;&#1585; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1608;&#1605;&#1587;&#1578;&#1602;&#1576;&#1604;&#1607;&#1575;.</p><p dir="rtl"><strong>&#1575;&#1604;&#1582;&#1604;&#1575;&#1589;&#1577;:</strong> &#1578;&#1605;&#1578;&#1604;&#1603; &#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1571;&#1601;&#1590;&#1604;&#1610;&#1577; &#1608;&#1575;&#1590;&#1581;&#1577; &#1605;&#1606; &#1606;&#1575;&#1581;&#1610;&#1577; &#1605;&#1587;&#1578;&#1602;&#1576;&#1604; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577;&#1548; &#1587;&#1608;&#1575;&#1569; &#1605;&#1606; &#1581;&#1610;&#1579; &#1575;&#1604;&#1605;&#1604;&#1603;&#1610;&#1577; &#1571;&#1608; &#1575;&#1604;&#1578;&#1591;&#1608;&#1610;&#1585; &#1608;&#1575;&#1604;&#1578;&#1581;&#1583;&#1610;&#1579;&#1548; &#1601;&#1610; &#1606;&#1601;&#1587; &#1575;&#1604;&#1608;&#1602;&#1578; &#1604;&#1575; &#1610;&#1608;&#1580;&#1583; &#1571;&#1610; &#1606;&#1607;&#1608;&#1590; &#1581;&#1602;&#1610;&#1602;&#1610; &#1604;&#1594;&#1575;&#1610;&#1577; &#1575;&#1604;&#1570;&#1606; &#1604;&#1605;&#1606;&#1589;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1576;&#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1577; &#1573;&#1604;&#1609; &#1575;&#1604;&#1605;&#1582;&#1575;&#1608;&#1601; &#1575;&#1604;&#1582;&#1575;&#1589;&#1577; &#1576;&#1573;&#1594;&#1604;&#1575;&#1602; &#1575;&#1604;&#1582;&#1583;&#1605;&#1577; &#1605;&#1606; &#1591;&#1585;&#1601; &#1580;&#1608;&#1580;&#1604;.</p><p dir="rtl">&#1576;&#1593;&#1583; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1606;&#1575;&#1602;&#1588;&#1577; &#1575;&#1604;&#1605;&#1601;&#1589;&#1604;&#1577; &#1604;&#1571;&#1608;&#1580;&#1607; &#1575;&#1604;&#1601;&#1585;&#1602; &#1576;&#1610;&#1606; &#1575;&#1604;&#1605;&#1606;&#1589;&#1578;&#1610;&#1606; &#1583;&#1593;&#1608;&#1606;&#1575; &#1606;&#1604;&#1582;&#1589; &#1571;&#1576;&#1585;&#1586; &#1605;&#1605;&#1610;&#1586;&#1575;&#1578; &#1608;&#1593;&#1610;&#1608;&#1576; &#1603;&#1604; &#1605;&#1606;&#1589;&#1577; &#1593;&#1604;&#1609; &#1607;&#1610;&#1574;&#1577; &#1606;&#1602;&#1575;&#1591; &#1587;&#1585;&#1610;&#1593;&#1577;.</p><p dir="rtl"><strong>&#1605;&#1605;&#1610;&#1586;&#1575;&#1578; &#1576;&#1604;&#1608;&#1580;&#1585;</strong></p><ul dir="rtl"><li>&#1605;&#1606;&#1589;&#1577; &#1576;&#1587;&#1610;&#1591;&#1577; &#1580;&#1583;&#1575;&#1611; &#1608;&#1587;&#1607;&#1604;&#1577; &#1575;&#1604;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;.</li><li>&#1575;&#1604;&#1578;&#1603;&#1575;&#1605;&#1604; &#1605;&#1593; &#1582;&#1583;&#1605;&#1575;&#1578; &#1588;&#1585;&#1603;&#1577; &#1580;&#1608;&#1580;&#1604; &#1608;&#1571;&#1607;&#1605;&#1607;&#1575; &#1580;&#1608;&#1580;&#1604; &#1571;&#1583;&#1587;&#1606;&#1587;.</li><li>&#1605;&#1580;&#1575;&#1606;&#1610;&#1577; &#1578;&#1605;&#1575;&#1605;&#1575;&#1611;&#1548; &#1605;&#1593; &#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1577; &#1583;&#1601;&#1593; &#1605;&#1576;&#1575;&#1604;&#1594; &#1576;&#1587;&#1610;&#1591;&#1577; &#1576;&#1581;&#1587;&#1576; &#1585;&#1594;&#1576;&#1577; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606; &#1605;&#1579;&#1604; &#1575;&#1605;&#1578;&#1604;&#1575;&#1603; &#1583;&#1608;&#1605;&#1610;&#1606; &#1605;&#1583;&#1601;&#1608;&#1593; &#1571;&#1608; &#1575;&#1604;&#1581;&#1589;&#1608;&#1604; &#1593;&#1604;&#1609; &#1602;&#1575;&#1604;&#1576; &#1582;&#1575;&#1589; &#1608;&#1571;&#1603;&#1579;&#1585; &#1575;&#1581;&#1578;&#1585;&#1575;&#1601;&#1610;&#1577; &#1605;&#1606; &#1575;&#1604;&#1602;&#1608;&#1575;&#1604;&#1576; &#1575;&#1604;&#1605;&#1580;&#1575;&#1606;&#1610;&#1577;.</li><li>&#1578;&#1608;&#1601;&#1585; &#1605;&#1587;&#1578;&#1608;&#1609; &#1593;&#1575;&#1604;&#1610; &#1605;&#1606; &#1575;&#1604;&#1581;&#1605;&#1575;&#1610;&#1577; &#1608;&#1575;&#1604;&#1571;&#1605;&#1575;&#1606;</li><li>&#1578;&#1587;&#1575;&#1593;&#1583; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606; &#1576;&#1575;&#1604;&#1578;&#1585;&#1603;&#1610;&#1586; &#1593;&#1604;&#1609; &#1578;&#1602;&#1583;&#1610;&#1605; &#1575;&#1604;&#1605;&#1581;&#1578;&#1608;&#1609; &#1576;&#1593;&#1610;&#1583;&#1575;&#1611; &#1593;&#1606; &#1575;&#1604;&#1571;&#1605;&#1608;&#1585; &#1575;&#1604;&#1601;&#1606;&#1610;&#1577; &#1575;&#1604;&#1571;&#1582;&#1585;&#1609;.</li></ul><p dir="rtl"><strong>&#1593;&#1610;&#1608;&#1576; &#1576;&#1604;&#1608;&#1580;&#1585;</strong></p><ul dir="rtl"><li>&#1593;&#1583;&#1605; &#1608;&#1580;&#1608;&#1583; &#1573;&#1590;&#1575;&#1601;&#1575;&#1578;</li><li>&#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1605;&#1581;&#1583;&#1608;&#1583;&#1577; &#1576;&#1575;&#1604;&#1606;&#1587;&#1576;&#1577; &#1604;&#1604;&#1578;&#1589;&#1605;&#1610;&#1605; &#1608;&#1575;&#1604;&#1602;&#1575;&#1604;&#1576;</li><li>&#1604;&#1587;&#1578; &#1575;&#1604;&#1605;&#1575;&#1604;&#1603; &#1575;&#1604;&#1581;&#1602;&#1610;&#1602;&#1610; &#1604;&#1604;&#1605;&#1608;&#1602;&#1593;</li><li>&#1593;&#1583;&#1605; &#1608;&#1580;&#1608;&#1583; &#1583;&#1593;&#1605; &#1601;&#1606;&#1610;</li><li>&#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1605;&#1581;&#1583;&#1608;&#1583;&#1577; &#1580;&#1583;&#1575;&#1611; &#1604;&#1578;&#1582;&#1589;&#1610;&#1589; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1608;&#1575;&#1604;&#1578;&#1581;&#1603;&#1605; &#1576;&#1607;&#1575;</li></ul><p dir="rtl"><strong>&#1605;&#1605;&#1610;&#1586;&#1575;&#1578; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587;</strong></p><ul dir="rtl"><li>&#1605;&#1606;&#1589;&#1577; &#1605;&#1585;&#1606;&#1577; &#1578;&#1605;&#1578;&#1604;&#1603; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1608;&#1592;&#1575;&#1574;&#1601; &#1608;&#1575;&#1604;&#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1575;&#1604;&#1605;&#1582;&#1578;&#1604;&#1601;&#1577;</li><li>&#1608;&#1580;&#1608;&#1583; &#1605;&#1580;&#1605;&#1608;&#1593;&#1577; &#1603;&#1576;&#1610;&#1585;&#1577; &#1580;&#1583;&#1575;&#1611; &#1605;&#1606; &#1575;&#1604;&#1578;&#1589;&#1575;&#1605;&#1610;&#1605; &#1608;&#1575;&#1604;&#1602;&#1608;&#1575;&#1604;&#1576; &#1575;&#1604;&#1578;&#1610; &#1610;&#1605;&#1603;&#1606;&#1603; &#1575;&#1604;&#1575;&#1582;&#1578;&#1610;&#1575;&#1585; &#1576;&#1610;&#1606;&#1607;&#1575;.</li><li>&#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1577; &#1578;&#1582;&#1589;&#1610;&#1589; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1576;&#1588;&#1603;&#1604; &#1603;&#1575;&#1605;&#1604;&#1548; &#1576;&#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1577; &#1573;&#1604;&#1609; &#1608;&#1580;&#1608;&#1583; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1575;&#1578;</li><li>&#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1577; &#1575;&#1604;&#1578;&#1581;&#1603;&#1605; &#1575;&#1604;&#1603;&#1575;&#1605;&#1604; &#1576;&#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1576;&#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1577; &#1573;&#1604;&#1609; &#1581;&#1602; &#1575;&#1604;&#1605;&#1604;&#1603;&#1610;&#1577;.</li><li>&#1583;&#1593;&#1605; &#1601;&#1606;&#1610; &#1588;&#1575;&#1605;&#1604; &#1608;&#1575;&#1604;&#1581;&#1589;&#1608;&#1604; &#1593;&#1604;&#1609; &#1581;&#1604; &#1604;&#1571;&#1610; &#1605;&#1588;&#1603;&#1604;&#1577; &#1602;&#1583; &#1578;&#1608;&#1575;&#1580;&#1607;&#1603;</li></ul><p dir="rtl"><strong>&#1593;&#1610;&#1608;&#1576; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587;</strong></p><ul dir="rtl"><li>&#1578;&#1581;&#1578;&#1575;&#1580; &#1576;&#1593;&#1590; &#1575;&#1604;&#1608;&#1602;&#1578; &#1604;&#1604;&#1578;&#1593;&#1604;&#1605; &#1608;&#1575;&#1604;&#1578;&#1593;&#1575;&#1605;&#1604; &#1605;&#1593; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577;</li><li>&#1578;&#1581;&#1578;&#1575;&#1580; &#1573;&#1604;&#1609; &#1589;&#1610;&#1575;&#1606;&#1577; &#1608;&#1605;&#1578;&#1575;&#1576;&#1593;&#1577; &#1583;&#1608;&#1585;&#1610;&#1577;</li><li>&#1578;&#1581;&#1578;&#1575;&#1580; &#1573;&#1604;&#1609; &#1583;&#1601;&#1593; &#1578;&#1603;&#1575;&#1604;&#1610;&#1601; &#1571;&#1603;&#1576;&#1585; &#1608;&#1578;&#1608;&#1601;&#1610;&#1585; &#1605;&#1610;&#1586;&#1575;&#1606;&#1610;&#1577; &#1605;&#1581;&#1583;&#1583;&#1577; &#1605;&#1606;&#1584; &#1575;&#1604;&#1576;&#1583;&#1575;&#1610;&#1577; &#1604;&#1576;&#1606;&#1575;&#1569; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;.</li><li>&#1575;&#1604;&#1589;&#1593;&#1608;&#1576;&#1577; &#1601;&#1610; &#1575;&#1604;&#1578;&#1593;&#1575;&#1605;&#1604; &#1605;&#1593; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577; &#1608;&#1575;&#1604;&#1578;&#1603;&#1610;&#1601; &#1605;&#1593;&#1607;&#1575; &#1601;&#1610; &#1575;&#1604;&#1576;&#1583;&#1575;&#1610;&#1577;&#1548; &#1582;&#1589;&#1608;&#1589;&#1575;&#1611; &#1604;&#1604;&#1605;&#1583;&#1608;&#1606;&#1610;&#1606; &#1575;&#1604;&#1580;&#1583;&#1583;.</li></ul><p dir="rtl">&#1608;&#1575;&#1604;&#1570;&#1606; &#1608;&#1589;&#1604;&#1606;&#1575; &#1573;&#1604;&#1609; &#1575;&#1604;&#1573;&#1580;&#1575;&#1576;&#1577; &#1575;&#1604;&#1606;&#1607;&#1575;&#1574;&#1610;&#1577; &#1593;&#1606; &#1575;&#1604;&#1578;&#1587;&#1575;&#1572;&#1604; &#1575;&#1604;&#1571;&#1587;&#1575;&#1587;&#1610; &#1604;&#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1608;&#1590;&#1608;&#1593;&#1548; &#1605;&#1575;&#1584;&#1575; &#1571;&#1587;&#1578;&#1582;&#1583;&#1605; &#1576;&#1604;&#1608;&#1580;&#1585; &#1571;&#1605; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587;&#1567;</p><p dir="rtl">&#1601;&#1610; &#1575;&#1604;&#1576;&#1583;&#1575;&#1610;&#1577; &#1583;&#1593;&#1608;&#1606;&#1575; &#1606;&#1578;&#1601;&#1602; &#1576;&#1571;&#1606; &#1578;&#1580;&#1585;&#1576;&#1577; &#1575;&#1604;&#1578;&#1583;&#1608;&#1610;&#1606; &#1608;&#1578;&#1602;&#1583;&#1610;&#1605; &#1605;&#1581;&#1578;&#1608;&#1609; &#1580;&#1610;&#1583; &#1607;&#1610; &#1578;&#1580;&#1585;&#1576;&#1577; &#1578;&#1587;&#1578;&#1581;&#1602; &#1575;&#1604;&#1583;&#1593;&#1605; &#1575;&#1604;&#1603;&#1575;&#1605;&#1604; &#1608;&#1575;&#1604;&#1578;&#1602;&#1583;&#1610;&#1585; &#1576;&#1594;&#1590; &#1575;&#1604;&#1606;&#1592;&#1585; &#1593;&#1606; &#1575;&#1604;&#1605;&#1606;&#1589;&#1577; &#1575;&#1604;&#1578;&#1610; &#1587;&#1578;&#1602;&#1608;&#1605; &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1607;&#1575; &#1604;&#1607;&#1584;&#1575; &#1575;&#1604;&#1594;&#1585;&#1590;&#1548; &#1601;&#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1575;&#1578; &#1607;&#1610; &#1606;&#1588;&#1575;&#1591; &#1604;&#1591;&#1610;&#1601; &#1608;&#1580;&#1605;&#1610;&#1604; &#1580;&#1583;&#1575;&#1611; &#1610;&#1587;&#1575;&#1593;&#1583;&#1606;&#1575; &#1601;&#1610; &#1602;&#1590;&#1575;&#1569; &#1576;&#1593;&#1590; &#1575;&#1604;&#1608;&#1602;&#1578; &#1575;&#1604;&#1605;&#1601;&#1610;&#1583; &#1608;&#1575;&#1604;&#1605;&#1605;&#1578;&#1593; &#1604;&#1606;&#1575; &#1608;&#1604;&#1604;&#1570;&#1582;&#1585;&#1610;&#1606;&#1548; &#1601;&#1578;&#1602;&#1575;&#1587;&#1605; &#1582;&#1576;&#1585;&#1575;&#1578;&#1603; &#1608;&#1605;&#1593;&#1585;&#1601;&#1578;&#1603; &#1608;&#1605;&#1607;&#1575;&#1585;&#1575;&#1578;&#1603; &#1605;&#1593; &#1575;&#1604;&#1570;&#1582;&#1585;&#1610;&#1606; &#1608;&#1575;&#1604;&#1576;&#1583;&#1569; &#1601;&#1610; &#1578;&#1603;&#1608;&#1610;&#1606; &#1588;&#1576;&#1603;&#1577; &#1605;&#1606; &#1575;&#1604;&#1571;&#1589;&#1583;&#1602;&#1575;&#1569; &#1608;&#1575;&#1604;&#1581;&#1589;&#1608;&#1604; &#1593;&#1604;&#1609; &#1576;&#1593;&#1590; &#1575;&#1604;&#1571;&#1605;&#1608;&#1575;&#1604; &#1607;&#1610; &#1578;&#1580;&#1585;&#1576;&#1577; &#1605;&#1579;&#1610;&#1585;&#1577; &#1608;&#1605;&#1605;&#1578;&#1593;&#1577; &#1601;&#1593;&#1604;&#1575;&#1611;.</p><p dir="rtl">&#1604;&#1603;&#1606; &#1605;&#1606; &#1575;&#1604;&#1580;&#1610;&#1583; &#1571;&#1606; &#1578;&#1578;&#1610;&#1581; &#1604;&#1606;&#1601;&#1587;&#1603; &#1575;&#1604;&#1602;&#1604;&#1610;&#1604; &#1605;&#1606; &#1575;&#1604;&#1608;&#1602;&#1578; &#1604;&#1604;&#1578;&#1601;&#1603;&#1610;&#1585; &#1608;&#1575;&#1578;&#1582;&#1575;&#1584; &#1575;&#1604;&#1602;&#1585;&#1575;&#1585; &#1575;&#1604;&#1605;&#1606;&#1575;&#1587;&#1576; &#1608;&#1601;&#1602;&#1611;&#1575; &#1604;&#1578;&#1591;&#1604;&#1593;&#1575;&#1578;&#1603; &#1608;&#1571;&#1607;&#1583;&#1575;&#1601;&#1603; &#1575;&#1604;&#1578;&#1610; &#1578;&#1585;&#1610;&#1583; &#1575;&#1604;&#1608;&#1589;&#1608;&#1604; &#1573;&#1604;&#1610;&#1607;&#1575; &#1605;&#1606; &#1582;&#1604;&#1575;&#1604; &#1605;&#1580;&#1575;&#1604; &#1575;&#1604;&#1578;&#1583;&#1608;&#1610;&#1606;&#1548; &#1601;&#1573;&#1580;&#1585;&#1575;&#1569; &#1578;&#1593;&#1583;&#1610;&#1604;&#1575;&#1578; &#1590;&#1582;&#1605;&#1577; &#1593;&#1604;&#1609; &#1605;&#1583;&#1608;&#1606;&#1578;&#1603; &#1576;&#1593;&#1583; &#1601;&#1578;&#1585;&#1577; &#1605;&#1606; &#1575;&#1604;&#1586;&#1605;&#1606; &#1602;&#1583; &#1610;&#1572;&#1579;&#1585; &#1593;&#1604;&#1609; &#1578;&#1589;&#1606;&#1610;&#1601;&#1607;&#1575; &#1583;&#1575;&#1582;&#1604; &#1605;&#1581;&#1585;&#1603;&#1575;&#1578; &#1575;&#1604;&#1576;&#1581;&#1579; &#1576;&#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1577; &#1573;&#1604;&#1609; &#1575;&#1606;&#1582;&#1601;&#1575;&#1590; &#1593;&#1583;&#1583; &#1575;&#1604;&#1586;&#1608;&#1575;&#1585; &#1604;&#1605;&#1583;&#1608;&#1606;&#1578;&#1603;.</p><p dir="rtl">&#1604;&#1584;&#1604;&#1603; &#1571;&#1585;&#1580;&#1608; &#1571;&#1606; &#1578;&#1587;&#1575;&#1593;&#1583;&#1603; &#1575;&#1604;&#1606;&#1602;&#1575;&#1591; &#1575;&#1604;&#1578;&#1575;&#1604;&#1610;&#1577; &#1576;&#1575;&#1604;&#1573;&#1590;&#1575;&#1601;&#1577; &#1573;&#1604;&#1609; &#1575;&#1604;&#1605;&#1602;&#1575;&#1585;&#1606;&#1577; &#1575;&#1604;&#1601;&#1575;&#1574;&#1578;&#1577; &#1601;&#1610; &#1578;&#1581;&#1583;&#1610;&#1583; &#1575;&#1582;&#1578;&#1610;&#1575;&#1585;&#1603; &#1576;&#1589;&#1608;&#1585;&#1577; &#1605;&#1604;&#1575;&#1574;&#1605;&#1577;</p><h3 dir="rtl">&#1575;&#1604;&#1581;&#1575;&#1604;&#1575;&#1578; &#1575;&#1604;&#1578;&#1610; &#1610;&#1615;&#1601;&#1590;&#1604; &#1601;&#1610;&#1607;&#1575; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1576;&#1604;&#1608;&#1580;&#1585;</h3><ul><li><p dir="rtl">&#1575;&#1604;&#1578;&#1583;&#1608;&#1610;&#1606; &#1576;&#1588;&#1603;&#1604; &#1605;&#1606;&#1602;&#1591;&#1593; &#1571;&#1608; &#1594;&#1610;&#1585; &#1606;&#1592;&#1575;&#1605;&#1610;&#1548; &#1576;&#1581;&#1610;&#1579; &#1578;&#1602;&#1608;&#1605; &#1576;&#1575;&#1604;&#1578;&#1583;&#1608;&#1610;&#1606; &#1576;&#1589;&#1608;&#1585;&#1577; &#1594;&#1610;&#1585; &#1585;&#1587;&#1605;&#1610;&#1577; &#1608;&#1593;&#1604;&#1609; &#1601;&#1578;&#1585;&#1575;&#1578; &#1605;&#1578;&#1576;&#1575;&#1593;&#1583;&#1577;.</p></li><li><p dir="rtl">&#1593;&#1583;&#1605; &#1575;&#1604;&#1581;&#1575;&#1580;&#1577; &#1604;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1605;&#1605;&#1610;&#1586;&#1575;&#1578; &#1608;&#1575;&#1604;&#1582;&#1589;&#1575;&#1574;&#1589; &#1608;&#1575;&#1604;&#1578;&#1581;&#1603;&#1605; &#1583;&#1575;&#1582;&#1604; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;&#1548; &#1571;&#1610; &#1571;&#1606; &#1605;&#1575; &#1610;&#1607;&#1605;&#1603; &#1607;&#1608; &#1606;&#1588;&#1585; &#1605;&#1581;&#1578;&#1608;&#1609; &#1605;&#1593;&#1610;&#1606; &#1576;&#1593;&#1610;&#1583;&#1575;&#1611; &#1593;&#1606; &#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1575;&#1604;&#1578;&#1581;&#1603;&#1605; &#1575;&#1604;&#1582;&#1575;&#1589;&#1577; &#1576;&#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;.</p></li><li><p dir="rtl">&#1582;&#1608;&#1590; &#1578;&#1580;&#1585;&#1576;&#1577; &#1580;&#1583;&#1610;&#1583;&#1577; &#1608;&#1588;&#1576;&#1607; &#1578;&#1580;&#1585;&#1610;&#1576;&#1610;&#1577; &#1601;&#1610; &#1605;&#1580;&#1575;&#1604; &#1575;&#1604;&#1578;&#1583;&#1608;&#1610;&#1606;&#1548; &#1608;&#1576;&#1575;&#1604;&#1578;&#1575;&#1604;&#1610; &#1610;&#1605;&#1603;&#1606;&#1603; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1605;&#1606;&#1589;&#1577; &#1576;&#1604;&#1608;&#1580;&#1585; &#1604;&#1601;&#1578;&#1585;&#1577; &#1605;&#1593;&#1610;&#1606;&#1577; &#1608;&#1578;&#1581;&#1583;&#1610;&#1583; &#1582;&#1591;&#1608;&#1575;&#1578;&#1603; &#1575;&#1604;&#1605;&#1602;&#1576;&#1604;&#1577; &#1575;&#1593;&#1578;&#1605;&#1575;&#1583;&#1575;&#1611; &#1593;&#1604;&#1609; &#1606;&#1578;&#1575;&#1574;&#1580; &#1607;&#1584;&#1607; &#1575;&#1604;&#1601;&#1578;&#1585;&#1577;.</p></li><li><p dir="rtl">&#1593;&#1583;&#1605; &#1575;&#1605;&#1578;&#1604;&#1575;&#1603; &#1575;&#1604;&#1605;&#1593;&#1585;&#1601;&#1577; &#1575;&#1604;&#1604;&#1575;&#1586;&#1605;&#1577; &#1601;&#1610; &#1575;&#1604;&#1571;&#1605;&#1608;&#1585; &#1575;&#1604;&#1578;&#1602;&#1606;&#1610;&#1577; &#1608;&#1575;&#1604;&#1601;&#1606;&#1610;&#1577; &#1575;&#1604;&#1605;&#1578;&#1593;&#1604;&#1602;&#1577; &#1576;&#1573;&#1583;&#1575;&#1585;&#1577; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;&#1548; &#1608;&#1604;&#1575; &#1578;&#1585;&#1610;&#1583; &#1578;&#1582;&#1589;&#1610;&#1589; &#1576;&#1593;&#1590; &#1575;&#1604;&#1608;&#1602;&#1578; &#1604;&#1604;&#1578;&#1593;&#1604;&#1605;</p></li><li><p dir="rtl">&#1593;&#1583;&#1605; &#1575;&#1604;&#1585;&#1594;&#1576;&#1577; &#1601;&#1610; &#1573;&#1606;&#1601;&#1575;&#1602; &#1571;&#1610; &#1605;&#1576;&#1575;&#1604;&#1594; &#1605;&#1575;&#1583;&#1610;&#1577; &#1593;&#1604;&#1609; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;</p></li><li><p dir="rtl">&#1575;&#1602;&#1578;&#1589;&#1575;&#1585; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1593;&#1604;&#1609; &#1605;&#1580;&#1575;&#1604; &#1608;&#1575;&#1581;&#1583; &#1601;&#1602;&#1591; &#1605;&#1606; &#1605;&#1580;&#1575;&#1604;&#1575;&#1578; &#1575;&#1604;&#1578;&#1583;&#1608;&#1610;&#1606;.</p></li></ul><h3 dir="rtl">&#1575;&#1604;&#1581;&#1575;&#1604;&#1575;&#1578; &#1575;&#1604;&#1578;&#1610; &#1610;&#1615;&#1601;&#1590;&#1604; &#1601;&#1610;&#1607;&#1575; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587;</h3><ul><li><p dir="rtl">&#1573;&#1606;&#1588;&#1575;&#1569; &#1605;&#1583;&#1608;&#1606;&#1577; &#1588;&#1575;&#1605;&#1604;&#1577; &#1608;&#1605;&#1578;&#1603;&#1575;&#1605;&#1604;&#1577; &#1608;&#1578;&#1581;&#1578;&#1575;&#1580; &#1573;&#1604;&#1609; &#1575;&#1604;&#1593;&#1583;&#1610;&#1583; &#1605;&#1606; &#1573;&#1605;&#1603;&#1575;&#1606;&#1610;&#1575;&#1578; &#1575;&#1604;&#1578;&#1582;&#1589;&#1610;&#1589;</p></li><li><p dir="rtl">&#1575;&#1604;&#1585;&#1594;&#1576;&#1577; &#1601;&#1610; &#1575;&#1604;&#1578;&#1581;&#1603;&#1605; &#1575;&#1604;&#1603;&#1575;&#1605;&#1604; &#1576;&#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;&#1548; &#1608;&#1575;&#1604;&#1575;&#1581;&#1578;&#1601;&#1575;&#1592; &#1576;&#1605;&#1604;&#1603;&#1610;&#1577; &#1605;&#1581;&#1578;&#1608;&#1610;&#1575;&#1578; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1576;&#1589;&#1608;&#1585;&#1577; &#1578;&#1575;&#1605;&#1577;.</p></li><li><p dir="rtl">&#1575;&#1604;&#1593;&#1605;&#1604; &#1593;&#1604;&#1609; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1576;&#1588;&#1603;&#1604; &#1578;&#1580;&#1575;&#1585;&#1610;&#1548; &#1571;&#1610; &#1608;&#1580;&#1608;&#1583; &#1606;&#1610;&#1577; &#1604;&#1576;&#1610;&#1593;&#1607;&#1575; &#1601;&#1610; &#1605;&#1585;&#1581;&#1604;&#1577; &#1605;&#1593;&#1610;&#1606;&#1577;</p></li><li><p dir="rtl">&#1575;&#1604;&#1605;&#1602;&#1583;&#1585;&#1577; &#1593;&#1604;&#1609; &#1575;&#1604;&#1578;&#1593;&#1575;&#1605;&#1604; &#1575;&#1604;&#1601;&#1593;&#1575;&#1604; &#1605;&#1593; &#1605;&#1606;&#1589;&#1577; &#1608;&#1608;&#1585;&#1583; &#1576;&#1585;&#1587; &#1608;&#1605;&#1593;&#1585;&#1601;&#1577; &#1576;&#1575;&#1604;&#1571;&#1605;&#1608;&#1585; &#1575;&#1604;&#1601;&#1606;&#1610;&#1577;.</p></li><li><p dir="rtl">&#1575;&#1604;&#1605;&#1602;&#1583;&#1585;&#1577; &#1593;&#1604;&#1609; &#1583;&#1601;&#1593; &#1575;&#1604;&#1578;&#1603;&#1575;&#1604;&#1610;&#1601; &#1575;&#1604;&#1582;&#1575;&#1589;&#1577; &#1576;&#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577;</p></li><li><p dir="rtl">&#1575;&#1604;&#1581;&#1575;&#1580;&#1577; &#1604;&#1608;&#1580;&#1608;&#1583; &#1582;&#1610;&#1575;&#1585;&#1575;&#1578; &#1608;&#1575;&#1587;&#1593;&#1577; &#1604;&#1602;&#1575;&#1604;&#1576; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;&#1577; &#1608;&#1575;&#1604;&#1578;&#1589;&#1605;&#1610;&#1605; &#1575;&#1604;&#1582;&#1575;&#1589; &#1576;&#1607;&#1575;.</p></li><li><p dir="rtl"><a rel="external nofollow" name="_GoBack"></a> &#1575;&#1604;&#1578;&#1583;&#1608;&#1610;&#1606; &#1575;&#1604;&#1605;&#1578;&#1608;&#1575;&#1589;&#1604; &#1608;&#1591;&#1608;&#1610;&#1604; &#1575;&#1604;&#1605;&#1583;&#1609; &#1608;&#1608;&#1580;&#1608;&#1583; &#1585;&#1572;&#1610;&#1577; &#1605;&#1587;&#1578;&#1602;&#1576;&#1604;&#1610;&#1577; &#1604;&#1583;&#1609; &#1575;&#1604;&#1605;&#1583;&#1608;&#1606;.</p></li></ul>
]]></description><guid isPermaLink="false">65</guid><pubDate>Thu, 09 Apr 2015 12:52:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x637;&#x651;&#x631;&#x64A;&#x642; &#x646;&#x62D;&#x648; &#x641;&#x647;&#x645; &#x645;&#x64F;&#x62A;&#x63A;&#x64A;&#x631; &#x627;&#x644;&#x645;&#x633;&#x627;&#x631; PATH$</title><link>https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%B7%D9%91%D8%B1%D9%8A%D9%82-%D9%86%D8%AD%D9%88-%D9%81%D9%87%D9%85-%D9%85%D9%8F%D8%AA%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%B1-path-r58/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_04/path_480x300.png.0237bfda44f20fb398f0d38ff7658141.png" /></p>

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

<p>
	يصيب سطر الأوامر بطبيعته الرّهبة في قلوب كثير من النّاس، إذ يرونه (في عُرف المجتمع) تقنيّة غامضةً يمارسها سحرةُ الحاسوب و"المُخترقون". الحقيقة أنّه سطر الأوامر ليس بهذه الرّوعة، فما هو إلا مجموعة من الأدوات شديدة البساطة أنشأها موظّفو Bell (الّتي تُعرف الآن بالاسم AT&amp;T) لإنجاز مهامّ معظمها بسيط في السّبعينيّات من القرن الماضي، وليس فيها من التّطوّر التّقنيّ أكثر ممّا في فرن المايكروويف في مطبخك!
</p>

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

<p>
	ولعلّ واحدًا من أهمّ تلك المفاهيم هو مفهوم المسار (Path).
</p>

<p>
	تعتمد أدوات التّطوير للمتصفّح ومُعالجات CSS ومكتبات JavaScript وأدوات أخرى كثيرة على وجود Ruby أو Node.js مثبّتتين على جهازك. من هذه الأدوات <a data-ss1627733513="1" data-ss1627733551="1" data-ss1627733566="1" href="http://bower.io/" rel="external nofollow">Bower</a>. يجمع بين هذه الأدوات كلّها أنّها ستُضطرّك إلى التّعامل مع المسار عاجلًا أو آجلًا، والسّبب أنّ يجب على المسار أن يعلم بوجود الأدوات الّتي تثبّتها في بيئة التّطوير على جهازك حتّى يستطيع سطر الأوامر أن يعمل بصورة صحيحةٍ.
</p>

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

<h2 id="-">
	مُتغيّر صغير ومتواضع
</h2>

<p>
	<code>‏‎</code><span style="font-family:courier new,courier,monospace;">$PATH</span><code>‎</code>، كما تُفصح إشارة الدولار في أوّله والحروف الكبيرة الّتي تتلوها، مُتغيّر في بيئة Unix. القيمة المحفوظة في هذا المتغيّر هي قائمةً بمسارات إلى أدلّة (مُجلّدات)، مفصولةٍ بنقطتين (<code>:</code>)، كهذه القائمة:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
/root/directory/binary:/root/other_directory/other_binary</pre>

<p>
	إن كنت من أولئك المهووسين بتسمية المُتغيّرات، فقد تتساءل لما لم يُسمَّ المُتغيّر ‎<code>$PATHS</code>‎ (بصيغة الجمع)، كونه يحوي عدّة مسارات. اسمحوا لي بأن أخمّن السبب تخمينًا، فلربّما يُشير الاسم المُفرد إلى "مسار التّحميل المُكوّن من عدّة مسارات منفردة"، يبدو تخمينًا معقولًا!
</p>

<p>
	لو قادك فضولك إلى تحرّي أنواعٍ أخرى من متغيّرات البيئة في نظامك، فاكتب <span style="font-family:courier new,courier,monospace;">env</span> في سطر الأوامر ثمّ اضغط Enter وسترى قائمة بكلّ متغيّرات البيئة الموجودة حاليًّا.
</p>

<p>
	بما أنّ <code>‏‎</code><span style="font-family:courier new,courier,monospace;">$PATH</span><code>‎</code> مُتغيّر، يمكننا تغييره كما نشاء، وفي أيّ وقت. يمكنك مثلًا كتابة هذا الأمر في الصّدفة (shell) لديك:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
export PATH=banana</pre>

<p>
	ما نتيجة هذا الأمر؟ جرّب تشغيله في نافذة جديدة داخل الطّرفيّة لديك أو في أي تطبيق صدفة تستخدمه، كبرنامج Terminal في OS X.
</p>

<p>
	ثمّ جرّب بعد ذلك تنفيذ أي أمر Unix مثل <code>ls</code> (الّذي يطبع قائمة بمحتويات دليل/مُجلّد). ستكون النّتيجة: 
</p>

<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
 ‎-bash: ls: command not found</pre>

<p>
	‎ مع أنّ الأمر كان يعمل بلا مشكلات من قبل!
</p>

<p>
	هذه الحيلة الشقيّة علّمتنا أنّ محتويات <code>‏‎</code><span style="font-family:courier new,courier,monospace;">$PATH</span><code>‎</code> ضروريّة جدًّا، وإلّا اختلط الحابل بالنّابل!
</p>

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

<p>
	كدت أنسى! لتصحيح هذه المشكلة، أغلق برنامج الطّرفية وأعد فتحه، فالعطل مؤقّتٌ في حالتنا، ولكن إيّاك أن تحفظ القيمة الخاطئة في ملفّ ‎<span style="font-family:courier new,courier,monospace;">~/.bash_profile</span>‎، فعندها سيكون الوضع سيئًا للغاية!
</p>

<h2 id="-">
	حكاية عن البرامج الثّنائيّة
</h2>

<p>
	تُدعى بعض البرامج القابلة للتنفيذ في Unix "ملفّات ثنائيّة (binaries)". لأكون صادقًا معك، هذا الاسم غير مناسب على الإطلاق، لأنّه يهتمّ بصيغة البرامج بدلًا من وظيفتها. عندما تكتب برنامج Unix يؤدّي مهمّة مُحدَّدة، فإنّك قد تحتاج إلى تجميعه (compile) قبل أن تتمكّن من تنفيذه، عمليّة التجميع هذه تُنتج ملفًّا ثنائيًّا (binary). تعتمد هذه الملفّات الصّيغة الثنائيّة لتمثيل التّعليمات بصورة يسهل تنفيذها على الحاسوب بدلًا من الملفّات النّصيّة البسيطة (كملفّات مصدر البرنامج source code).
</p>

<p>
	في Unix مُجلّدات عديدة تُحفظ فيها هذه الملفّات الثّنائيّة، وبإمكانك معرفة المُجلّد الذي يُستخدم بصورة مبدئيّة لتحميل الملفّات الثّنائيّة في الملف ‎<span style="font-family:courier new,courier,monospace;">/etc/paths</span>‎:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
 # الأمر cat يطبع محتويات ملفّ
$ cat /etc/paths 
/usr/bin 
/bin 
/usr/sbin 
/sbin 
/usr/local/bin</pre>

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

<p>
	هذا هو سبب المشكلات الّتي تواجهها عندما تُحاول تثبيت برنامجٍ جديد موجودٍ مسبقًا على نظامك، كما في حالة تثبيت إصدارة جديدةٍ من Git على OS X بدل تلك المُرفقة مع النّظام. هذا أمرٌ سيّئ لأنّ Git 2.0 ممتاز!
</p>

<p>
	عندما أستعمل <span style="font-family:courier new,courier,monospace;">cd</span> (الّذي يُغيّر الدّليل الحاليّ) للانتقال إلى ‎<span style="font-family:courier new,courier,monospace;">/usr/bin</span>‎ (وهو مُجلّد يشيع تخزين البرامج فيه) ثمّ أستعمل <code>ls</code>، فإنّنى أرى أكثر من ألف نتيجة! وهذا أمرٌ غير مُفيد، ولذا أستعمل <span style="font-family:courier new,courier,monospace;"><a data-ss1627733513="1" data-ss1627733551="1" data-ss1627733566="1" href="http://en.wikipedia.org/wiki/Grep" rel="external nofollow">grep</a></span> ضمن الأمر <span style="font-family:courier new,courier,monospace;">ls | grep git</span> لأُصفِّيَ النّتائج بحيث تقتصر على البرامج تحوي الكلمة "git":
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
$ ls | grep git 
git
git-cvsserver
git-receive-pack
git-shell 
git-upload-archive 
git-upload-pack</pre>

<p>
	كما ترى، هناك نسخة من Git في ‎<span style="font-family:courier new,courier,monospace;">/usr/bin</span>‎، وعند تثبيت نسخة نظيفة من OS X فستكون هذه النّسخة هي المُعتمدة، كما يُبيّن تنفيذ الأمر <span style="font-family:courier new,courier,monospace;">which git</span>.
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
$ which git 
/usr/local/bin/git</pre>

<p>
	مهلًا! لماذا تُخالف النّتيجة لديّ ما توقّعته؟ لنفحص الأمر بدقّة بإرفاق <span style="font-family:courier new,courier,monospace;">which</span> بالخيار ‎<span style="font-family:courier new,courier,monospace;">-a</span>‎:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
$ which -a git
/usr/bin/git
/usr/local/bin/git</pre>

<p>
	هذا يؤكّد وجود نسختين من Git مثبّتتين على نظامي، ولكنّ الأولى هي المُعتمدة عندما أُنفّذ أوامر <span style="font-family:courier new,courier,monospace;">git</span> في سطر الأوامر.
</p>

<h2 id="-">
	تغيير المسارات
</h2>

<p>
	قرّرت تثبيت إصدارٍ مُختلف من Git على نظامي مُستخدمًا مُدير حزم اسمه <a data-ss1627733513="1" data-ss1627733551="1" data-ss1627733566="1" href="http://brew.sh/" rel="external nofollow">Homebrew</a> لأنّني أحبّ أن أُسيطر على الأدوات الّتي أستخدمها كلّ يوم وأحدّثها وقتما أشاء. كان بإمكاني تحديث نسخة Git المُرفقَة مع النّظام، لكنّني لا أعلم إن كان هذا سيُعطِب البرامج الّتي تعتمد على وجودها.
</p>

<p>
	نعلم إذن أنّ البحث عن البرامج يتبع ترتيب القائمة في الملفّ ‎<span style="font-family:courier new,courier,monospace;">/etc/paths‎</span>، فلم لا نُغيّر هذا التّرتيب؟
</p>

<p>
	أرى أن المُجلّد ‎<span style="font-family:courier new,courier,monospace;">/usr/local/bin</span>‎ الّذي يحوي إصدار Git الّذي ثبّته Homebrew يقع في نهاية الملفّ ‎<span style="font-family:courier new,courier,monospace;">/etc/paths</span>‎، وهذا يعني أن برنامج <span style="font-family:courier new,courier,monospace;">git</span> في ‎<span style="font-family:courier new,courier,monospace;">/usr/bin</span>‎ يطغى على الإصدار الّذي أريده.
</p>

<p>
	بالطّبع لا شيء يمنعك من تغيير التّرتيب في الملفّ ‎<span style="font-family:courier new,courier,monospace;">/etc/paths‎ </span>بحيث تضع ‎<span style="font-family:courier new,courier,monospace;">/usr/local/bin</span>‎ في أعلى القائمة لتُعتمد نسخة Git من Homebrew، وستصادف هذه النّصيحة كثيرًا على Stack Overflow، لكن صدّقني... هذا أمرٌ بالغ السوء، لا تفعله! لم يُقصد من هذه الملفّات أن يُعدّلها مستخدمٌ منفردٌ لأنّه تؤثّر على كلّ النظام (حتّى وإن كنت الوحيد الّذي تستعمل الحاسوب)، وقد يسبب هذا التّغيير مشكلات لن تُدرك أسبابها في المستقبل، فقد تعتمد إحدى الأدوات في OS X على التّرتيب الأصليّ للملفّ ‎<code>/etc/paths</code>‎.
</p>

<p>
	بدلًا من ذلك، عدّل المُتغيّر <code>‏‎</code><span style="font-family:courier new,courier,monospace;">$PATH</span><code>‎</code> في بيئتك <em>أنت</em>، في نسختك <em>أنت</em> من الملفّ ‎<span style="font-family:courier new,courier,monospace;"><code>.</code>bash_profile</span>‎، الموجودة في <span style="font-family:courier new,courier,monospace;">‎/Users/yourusername/.bash_profile</span>‎.
</p>

<p>
	ما عليك إلّا أن تجعل البحث يُجرى في ‎<span style="font-family:courier new,courier,monospace;">/usr/local/bin</span>‎ أوّلًا في الملفّ ‎<span style="font-family:courier new,courier,monospace;">.bash_profile</span>‎:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
# في الملفّ /Users/olivierlacan/.bash_profile
export PATH=/usr/local/bin:$PATH</pre>

<p>
	وهذا يؤدّي إلى تصدير مُتغيّر البيئة <span style="font-family:courier new,courier,monospace;">‎$PATH‎</span> الجديد وذلك بطباعة المُتغيّر الحاليّ وإسباقه بـ ‎<span style="font-family:courier new,courier,monospace;">/usr/local/bin</span>‎ على يسار كلّ المسارات الأخرى. بعد حفظ الملفّ ‎<span style="font-family:courier new,courier,monospace;">~/.bash_profile‎</span>، وإعادة تشغيل الصّدفة، يُفترض أن ترى هذه النّتيجة عند استدعاء <span style="font-family:courier new,courier,monospace;">echo</span> على المُتغيّر:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</pre>

<p>
	لاحظ أنّ ‎<span style="font-family:courier new,courier,monospace;">/usr/local/bi</span>n‎ مذكور مرّتين في المتغيّر ‎<span style="font-family:courier new,courier,monospace;">$PATH</span>‎ ولا بأس في هذا. ولأنّه ذُكر أوّلًا، فكلّ البرامج الّتي تُحمّل منه في المّرة الأولى ستُتجاهَل عند الوصول إليه ثانيةً. كنت أتمنّى وجود طريقة آمنة وبسيطة لتغيير ترتيب المسارات، ولكنّ الحلول الّتي أعرفها شديدة التّعقيد. بإمكانك دومًا تجاوز القيمة المبدئيّة لـ‎<span style="font-family:courier new,courier,monospace;">$PATH</span>‎ بالكامل، ولكن فقط عندما تُدرك تمامًا ما الّذي تفعله وأيّ المسارات يجب تضمينها.
</p>

<h2 id="-">
	على مفترق المسارات
</h2>

<p>
	بعد أن عدّلت المسار ‎<span style="font-family:courier new,courier,monospace;">$PATH</span>‎ كما يحلو لك، بإمكانك التأكّد من أنّ البرنامج المرغوب يُستدعى عندما تُنفّذ الأمر <span style="font-family:courier new,courier,monospace;">git</span>:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
$ which git 
/usr/local/bin/git 

$ git --version 
git version 2.0.0
/usr/bin/git --version git version 1.8.5.2 (Apple Git-48)</pre>

<p>
	عظيم! الإصدارة 2.0.0 من Git هي الّذي يتلقّى أوامر <span style="font-family:courier new,courier,monospace;">git</span> (وهي الإصدارة الّتي ثبّتها Homebrew)، بينما تغيب الإصدارة <span style="font-family:courier new,courier,monospace;">1.8.5.2</span> المُرفقة مع النّظام. إن قرّرت ألّا تستخدم الإصدارة 2.0.0 بعد الآن، ليس عليك سوى إزالتها وستعود الإصدارة الأقدم للعمل بصورة انسيابيّة.
</p>

<h2 id="-">
	احمِ مسارك
</h2>

<p>
	تُضيف أدوات تطوير (وتصميم) كثيرة أوامر برمجيّة إلى الملفّ ‎<span style="font-family:courier new,courier,monospace;">.bash_profile</span>‎ بعد تثبيتها، والغالب أنّها لا تخبرك بذلك، فإن وجدت مسارات غريبة مُدرجةً في الملفّ، فقد يُفسّر ذلك بطء تحميل جلسة جديدة كلّ مرّة (الأمر الّذي يحدث عند فتح صدفة جديدة أو لسان جديد في الطّرفيّة): مُتغيّر <span style="font-family:courier new,courier,monospace;">‎$PATH</span>‎ طويل، يتطلّب وقتًا طويلًا لتحميله.
</p>

<p>
	إليكم مساري اليوم:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
/Users/olivierlacan/.rbenv/shims:/Users/olivierlacan/.rbenv/bin:/usr/local/bin:/usr/local/heroku/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/MacGPG2/bin</pre>

<p>
	تصعب قراءته قليلًا، لذا أُفضّل تجزئته على سطور باستخدام الأمر <span style="font-family:courier new,courier,monospace;">tr</span> (الّذي يستبدل حروفًا مُحدّدة):
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
$ echo $PATH | tr ':' '\n'
/Users/olivierlacan/.rbenv/shims
/Users/olivierlacan/.rbenv/bin
/usr/local/bin
/usr/local/heroku/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
/opt/X11/bin
/usr/local/MacGPG2/bin</pre>

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

<p>
	قد لا تبدو فائدة تعلّم ‎<span style="font-family:courier new,courier,monospace;">$PATH</span>‎ وكيفيّة عمله عظيمةً. ولكن لأنك مُطوِّر ويب، فستحتاج إلى التّعامل مع سطر الأوامر، وقد تتعطّل إحدى أدواتك يومًا، والآن وقد تعلّمت مسارك وكيف يبدو وهو نظيف، والأسلوب الصّحيح لتعديله، وكيف تتأكّد من أنّه يعلم بوجود برامجك، فإنّ عودتك إلى "مسارك" المهنيّ ستستغرق دقائق بدلًا من ساعات!
</p>

<p>
	ترجمة (بتصرّف) لمقال <a data-ss1627733513="1" data-ss1627733551="1" data-ss1627733566="1" href="http://alistapart.com/article/the-path-to-enlightenment" rel="external nofollow">The $PATH to Enlightement</a> لصاحبه Oliver Lacan
</p>
]]></description><guid isPermaLink="false">58</guid><pubDate>Sun, 05 Apr 2015 21:09:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;</title><link>https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81-%D8%AA%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r17/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/HOW-TO-CODE.jpg.c2e36cc97b6adfbcc4fffb14b9faab65.jpg" /></p>
<p style="text-align:right;">
	حين يسألني أحدهم عن كيف يصبح مبرمجا وما هي المصادر التي يجب أن يعتمد عليها وما الخطوات التي يجب إتباعها، فإن الجواب المناسب الوحيد، والذي لم أقله بعد لأحد، هو ”إذا كنت تملك ما يؤهلك لأن تكون مبرمجا فإنك ستعرف طريقك بنفسك“. السبب هو أن البرمجة فن كما أنها علم. من منطلق أنها فن فهي تتطلب حدا أدنى من الموهبة وليس فقط الاكتفاء بحفظ القواعد، ومن حيث أنها علم فهي مبنية أساسا على المنطق وبصفة عامة على الرياضيات، التي تعتبر كابوسا لدى الطالب العربي. حين تملك الموهبة لتبدع بالبرمجة وحين تملك الإستعداد العقلي للتعامل مع النصوص البرمجية المجردة، فإنك آنذاك لن تحتاج لطرح السؤال السابق.
</p>

<p style="text-align:right;">
	الخلاصة.. إذا لم تكن قادرا على: الاستمتاع بالبرمجة وتذوقها كتذوق الشعر، التفكير المنطقي المجرد، وإيجاد الإبرة المناسبة بين كومة من الإبر، فلا تضيع وقتك في <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>، لأنك لن تتعلمها ولأنها لا تناسبك.
</p>

<p style="text-align:right;">
	إذا كنت ترى نفسك صالحا لتكون مبرمجا فلدي لك نصيحتان لا غير: (1) ابحث بنفسك، ستجد الكثير من المصادر المتنوعة وكثيرا من الآراء المتناقضة، وحدك ستكون قادرا على اختيار ما يناسبك. (2) النصيحة الثانية هي تمرن دائما. أول خطوة لكي تنطلق في <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> هي البدء فورا في البرمجة. لا يهم ماذا ستبرمج ولا كم الأخطاء التي سترتكب. المران المتواصل هو وحده الكفيل بتحسين قدراتك. سيكون من الجيد أيضا ألا تكتفي بالتمرن وحيدا، ثمة آلاف البرامج الحرة المتاحة للتطوير لمن يشاء. جرب أن تدلي بدلوك وأضف تعديلاتك على تلك البرامج. ستُرفض بعض التعديلات وستواجه الكثير من الانتقادات اللاذعة، لكنك تباعا ستحسن من جودة النصوص البرمجية التي تكتب، إلى أن تصبح محترفا فخبيرا.
</p>

<h2 style="text-align:right;">
	كيف تعلمت أنا البرمجة؟
</h2>

<p style="text-align:right;">
	ملاحظة أولية: لا أعتبر نفسي مبرمجا بعد، لكني على الأقل أعرف الأساسيات التي تتيح لي برمجة مشاريعي الخاصة.
</p>

<p style="text-align:right;">
	لفترة طويلة كنت أتعلم البرمجة بشكل نظري محض. لم يكن لدي جهاز كمبيوتر آنذاك وكنت أقتنص أي مصدر أجده بأي لغة كان. القراءة دون التطبيق ليست طريقة فعالة من أجل <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>، لكن لم يكن لدي غيرها (ما زلت حتى الآن أحب كتابة الأكواد في الورقة، حين أكون خارج البيت، ثم أنقلها للكمبيوتر لاحقا). كنت أقرأ كثيرا. لا أفهم أغلب ما أقرأ لكني كنت أخزنه في ذاكرتي لوقت آخر حتى أجد القطع الناقصة التي تتيح لي فهم الصورة الكاملة.
</p>

<p style="text-align:right;">
	أول ما تعلمته كان HTML&amp;CSS، (أعتقد سنة 2000). الطريف أنني تعلمتهما بالإسبانية خلال ورشة نظمها طلبة إسبان في المدينة (هناك سمعت أول مرة بجوجل). لم أكن أعرف من الإسبانية إلا بضع كلمات مما دخل العامية المغربية ومما تشابه مع كلمات فرنسية. لكني قبل ذلك كنت قرأت بعض المعلومات المتفرقة حول HTML في مجلات عربية وفرنسية.
</p>

<p style="text-align:right;">
	بعد ذلك كانت لي بضع محاولات مع جافاسكريبت، لكن المشكلة آنذاك أن جافاسكريبت لم تكن تستخدم كلغة حقيقية كما الآن، بل فقط بغرض تزيين الصفحات ببعض الحركات الديناميكية، لذلك لم أتعلم منها الكثير.
</p>

<p style="text-align:right;">
	ثم جاء الدور على PHP. أظن سنة 2004. قرأت بعض الأساسيات في مواقع فرنسية ثم بدأت أحمل بعض السكريبتات الصغيرة وأعدل عليها قليلا. لكن كل ذلك كان على سبيل اللهو لا غير. رغم أنني بدأت آنذاك في تقديم خدمات تصميم المواقع وتركيب برامج PHP، إلا أنني لم أكن أنظر إلى الأمر بشكل جدي، ولم تكن البرمجة تزيد عن كونها مجرد هواية أخرى، لذلك لم أتعمق في تعلمها. إن كنت اليوم قد وصلت إلى مستوى معقول في PHP مع إمكانية لاستخدام لغات برمجة أخرى بسهولة نسبية، فإن ذلك راجع فقط للممارسة، التي رغم أنها لم تكن متعمقة إلا أنها ساهمت، بجانب قراءاتي المتواصلة، في وصولي إلى المستوى الحالي.
</p>

<p style="text-align:right;">
	<strong>أفضل المصادر التي صادفتها خلال مسيرتي البطيئة في <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>:</strong>
</p>

<ul>
	<li style="text-align:right;">
		جوجل: محرك بحث لا غنى عنه في أي مرحلة. دائما عد إليه لتجد حلول المشاكل التي تصادفها.
	</li>
	<li style="text-align:right;">
		<a href="http://stackoverflow.com/" rel="external nofollow">stackoverflow</a>: موقع مهم جدا للمبرمجين. يمكنك أن تجد فيه حلولا تقريبا لكل المشاكل التي قد تصادفها، ويمكنك أن تطرح أسئلتك وتتواصل مع المبرمجين المحترفين.
	</li>
	<li style="text-align:right;">
		<a href="https://academy.hsoub.com/php/" rel="">تعلم لغة PHP</a><span>: </span>مرجع عربي شامل لكل ما تحتاجه لتعلم php من الصفر. أفضل الدروس والمقالات والنصائح والكتب والعديد من المصادر المتنوعة لتعلم لغة php تجدها في مكان واحد.
	</li>
	<li style="text-align:right;">
		<a href="http://www.amazon.com/gp/product/013147149X/ref=as_li_ss_tl?ie=UTF8&amp;tag=18bl-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=013147149X" rel="external nofollow">PHP 5 Power Programming</a>: كتاب مهم جدا، لا يعيبه سوى أنه لم يحدث منذ سنة 2004، وهي فترة طويلة عرفت خلالها اللغة الكثير من التحديثات.
	</li>
	<li style="text-align:right;">
		<a href="http://www.smashingmagazine.com/" rel="external nofollow">smashingmagazine</a>: موقع شهير لا غنى عنه لأي مصمم. يتابع أيضا الجديد في HTML&amp;CSS وجافاسكريبت.
	</li>
	<li style="text-align:right;">
		<a href="http://www.amazon.com/gp/product/1430223634/ref=as_li_ss_tl?ie=UTF8&amp;tag=18bl-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399369&amp;creativeASIN=1430223634" rel="external nofollow">Beginning Ruby</a>: أفضل كتاب لشرح أساسيات روبي. هو صالح أيضا حتى لمستخدمي اللغات الأخرى بحكم أساسيات البرمجة التي يتطرق لها. في نفس السياق، وجدت أن الإطلاع على إطار العمل RubyOnRails مهم جدا للحصول على أفكار جديدة وأساليب مختلفة في البرمجة يمكن الاستفادة منها عند استخدام لغات برمجة أخرى. شخصيا تغير أسلوب استخدامي لـ PHP تماما بعد أن بدأت في استخدام ريلز.
	</li>
</ul>
]]></description><guid isPermaLink="false">17</guid><pubDate>Mon, 06 Feb 2012 22:25:00 +0000</pubDate></item></channel></rss>
