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

Ola Abbas

الأعضاء
  • المساهمات

    189
  • تاريخ الانضمام

  • تاريخ آخر زيارة

كل منشورات العضو Ola Abbas

  1. سنتعرف هنا في هذا المقال على كيفية إنشاء عدة نماذج Forms في برنامج سكريبوس. نماذج PDF صُمِّمت نماذج PDF لتُمكّن للمستخدم الذي يعرضها عبر الإنترنت أو محليًا على الحاسوب، من إضافة بيانات إلى هذا النموذج بعد أن يطبعها المستخدم أو يرسلها عبر البريد الإلكتروني. مكونات نموذج PDF يمكنك إضافة أي شيء تريده إلى ملف PDF مثل النصوص والصور والأشكال، وأي شيء يقدمه برنامج سكريبوس Scribus. وإذا أردت إنشاء نموذج PDF، فيجب أن تتعلم أيضًا كيفية استخدام أدوات PDF الخاصة، إذ توجد هذه الأدوات في شريط أدوات PDF من اليسار إلى اليمين كما يلي: زر ضغط PDF-Button: يُستخدَم الزر لبدء بعض الإجراءات، وسننشئ زرّين في مثالنا أحدهما لطباعة النموذج والآخر لإرساله ليكون بمثابة بريد إلكتروني، ويمكننا تحسين الزر بواجهة نسميها "أيقونة icon". قد يستخدم الزر الواحد ما يصل إلى ثلاثة أيقونات مختلفة، والتي تمكّننا من إظهار تأثير الضغط على الزر وتغيير الأيقونة التي تظهر عندما تتحرك الفأرة فوق الزر. حقل نص Text Field: يُعَد حقل النص مثل إطار نص، ولكن مع إمكانية استخدام الأعداد التي تُمثَّل مثل تاريخ أو التي تحتوي على عدد معين من الأعداد العشرية أو التي تظهر في صورة نسبة مئوية. مربع اختيار Check Box: مربع صغير يُظهِر العلامة [×] عند النقر عليه. سنستخدم في مثالنا هذا المربع للإشارة إلى أن المتقدّم للدورة هو ذكر أو أنثى. مربع تحرير وسرد Combo Box: مربع التحرير والسرد هو قائمة منسدلة فيها خيارات موضوعة ضمن نموذج مطوي، حيث يفتح المستخدم القائمة لتحديد الخيار. مربع قائمة List Box: يُستخدم مربع القائمة أيضًا لتقديم خيارات، ولكن تكون في هذه الحالة بعض العناصر من القائمة على الأقل مرئيةً دائمًا. يمكن للمستخدم التمرير في القائمة، ولكن لا يُعَد فتحها أولًا أمرًا ضروريًا. حاشية نص Text Annotation: هي حقل نص يحتوي ملاحظات تكون غير مرئية في نموذج pdf، حيث يمكنك استخدام الحاشية لإضافة نص إلى النموذج فقط، ولكن يمكنك أيضًا إضافة روابط إلى مواقع في مكان آخر في المستند أو إلى مواقع إلكترونية على الإنترنت. حاشية رابط Link Annotation: يُستخدم للروابط إلى مواقع في المستند، حيث يمكن في هذه الحالة استخدام الإحداثيات الدقيقة بواحدة النقطة Point، وذلك وفقًا لأنظمة القياس المستخدَمة في برنامج سكريبوس Scribus. يمكن أيضًا استخدام روابط لمواقع إلكترونية خارجية. كيفية البدء في إنشاء نموذج PDF يجب مراعاة الميزات التالية عند تصميم نموذج PDF: التخطيط Layout: حاول تصميم نموذجك مسبقًا، حيث يمكنك إضافة إطارات نص وجداول وصور وأشكال، أو أي شيء يمكن أن يقدمه برنامج سكريبوس. ستُستخدَم هذه العناصر لتمثيل النمط الأساسي الذي تستخدمه شركتك أو مؤسستك، وسيكون إظهار المعلومات المتوقَّعة من المستخدم ضمن النموذج أمرًا ضروريًا. حقول PDF: يجب استخدام الحقول المتاحة التي يقدمها سكريبوس، والتي لها أنواع متعددة. الإعداد Set up: يجب عليك التعرف على التعديلات المتعددة الممكنة على الحقول، ويمكنك إعداد الحقول في نوافذ متعددة. عمليات التحقّق Validations: يمكن ضبط حدود للمدخلات التي تُدخَل في الحقل، إذ يمكنك تقييد إدخال عدد بحدود معينة على سبيل المثال، وهذا ما سنطبّقه في مثالنا. العمليات الحسابية Calculations: يمكنك إعداد عملية حسابية معينة للحقل، حيث تكون الاحتمالات هي جمع محتويات حقلين أو أكثر أو ضربها وما إلى ذلك، كما يمكن أيضًا حساب القيمة العليا أو الدنيا، أو حساب متوسط القيم لعدد كبير من الحقول، ويمكن أيضًا إجراء حسابات أخرى أكثر تعقيدًا ولكنها تتطلب برمجة لذلك. البرمجة Programming: إذا أردت أن يكون نموذجك ذكيًا، فيجب تعلّم البرمجة باستخدام لغة JavaScript، وهي لغة برمجة لا تُستخدَم في نماذج PDF فقط، ولكن على مواقع الويب أيضًا. إن لم تتعرّف على البرمجة سابقًا، فتوقع أن تستغرق بضعة أشهر لتصبح ماهرًا فيها إلى حد ما. ستقدّم لك الفقرة التالية بعض التلميحات والنصائح عن مكان العثور على مزيد من المعلومات حول لغة JavaScript. لغة JavaScript Java: هي لغة برمجة سوّقت لها شركة Sun Microsystems في عام 1995، حيث أمضى المطورون المسؤولونن جيمس جوسلينج James Gosling ومايك شيريدان Mike Sheridan وباتريك نوتون Patrick Naughton، حوالي أربع سنوات لتطوير هذه اللغة. تقول القصة أن هؤلاء المطورين شربوا كثيرًا من القهوة، وهو شيء لا بد أن تفعله عندما تبدأ في البرمجة، حيث جاءت العلامة التجارية للقهوة التي شربوها من جزيرة Java، ومن هنا جاء اسم هذه اللغة وأيقونتها التي تعرض فنجان قهوة مُصمَّم. أخذت لغة JavaScript الاصطلاحات وتعريفات التسمية المتعددة من لغة Java ولكن لديها إعداد مختلف حتى الآن، وقد استُخدِمت هذه اللغة في الأصل من جانب العميل في المتصفحات، فإذا تصفحت الإنترنت وألقيت نظرةً خاطفةً على صفحة يقدمها لك الخادم، فأنت العميل. لقد طوَّر هذه اللغة براندون فينش Brendan Finch في عام 1995، والذي عمل في شركة نتسكيب Netscape التي صمَّمت متصفحًا مشهورًا نافس إنترنت إكسبلورر Internet Explorer منافسةً شديدةً لفترة طويلة. لغة JavaScript لبرامج Acrobat: وضعت شركة البرمجيات أدوبي Adobe معيار PDF، حيث يُحتمَل أن تجد برنامج Acrobat Reader على حاسوبك الخاص، لأنه قارئ لمستندات PDF، ويُستخدَم على نظاق واسع. تبذل هذه الشركة جهودًا كبيرة لشرح استخدام لغة JavaScript، لأنها الخيار الأفضل في نماذج PDF. برنامج سكريبوس ولغة Javascript: يصعُب إلى حد ما معرفة مدى "فهم" سكريبوس لمقدار تعلّق لغة JavaScript بالنماذج. نموذج PDF يُظهِر الشكل الآتي النموذج الذي سنبنيه خطوةً بخطوة كما يظهر في سكريبوس، وتُعَد الدوائر الحمراء مجرد علامات للإشارة إلى عناصر النموذج التالية: حقول النص Text fields. مربعات الاختيار Check Boxes. مربعات التحرير والسرد Combo Box. حقل الحاشية النصية Annotation field. الأزرار Buttons. كل شيء آخر -مثل الترويسة والخطوط- هي كائنات سكريبوس عادية. هناك أيضًا بعض الإطارات النصية البسيطة مثل الإطارات التي تحتوي على M وF، والتكلفة باليورو Cost (euro)‎، وعدد المتقدمين Nr attending، وكذا التكلفة الإجمالية باليورو Totals (euro)‎، وهي ببساطة تسميات لعناصر النموذج المجاورة لها. يوضّح الشكل التالي النموذج كما يظهر في برنامج Adobe Reader باستثناء الأزرار، إذ يُظهِر اللون الأزرق الفاتح المناطق التي يمكن إدخال بعض المدخلات فيها ضمن النموذج. تُعَد الكلمة Name مدخلةً افتراضيةً تشير أيضًا إلى نوع الدخل، لذلك يمكنك حذفها وإدخال اسمك لملء هذا النموذج. يجب أن تدرك أنه لا يمكن اختبار النموذج أثناء تصميمه ضمن سكريبوس، أي لا تعمل جميع عناصر النموذج في سكريبوس، لذلك يجب عليك اتخاذ الخطوات التالية في كل مرة تنفّذ فيها خطوةً في عملية التصميم وتريد التحقق منها: احفظ النموذج في سكريبوس مثل ملف sla. صدّر النموذج بتنسيق PDF. ابحث عن ملف PDF الناتج وافتحه باستخدام برنامج Adobe Reader. اختبر النموذج. إذا وجدت أي أخطاء أو أردت متابعة التصميم، فيجب أن تغلق Adobe Reader وتعود إلى بيئة سكريبوس. أجرِ التغييرات التي تريدها أو وسّع النموذج. احفظه مرةً أخرى في سكريبوس، وصدّر ملف PDF جديد واستبدل إصدار PDF السابق به. قد يبدو هذا أمرًا بديهيًا، ولكن في بعض الأحيان يمكن نسيانه، وهو ما يؤدي إلى إنشاء إصدارات مختلفة متعددة، وبالتالي ترتبِك أثناء محاولتك لمعرفة النسخة النهائية "الحقيقية". كرّر هذه الخطوات كلما كان ذلك ضروريًا إلى أن يعمل النموذج تمامًا كما تخيلته. ستعتاد على عناصر النموذج المختلفة مع مرور الوقت، ولن تجد أن إعادة فحص ملف PDF بعد كل تغيير أمرًا ضروريًا. التخطيط Layout سننشئ نموذج تسجيل وهمي لنوع معين من التدريب لمدرسي اللغة الإنجليزية كلغة ثانية EFL باستخدام منهجية معينة، وهنا اتبع الآتي: جهّز مستندًا جديدًا بحجم A4 أو رسالة Letter. تحتاج بعض إطارات النص. نضع اسم المعهد في الأعلى، ثم نطبّق الألوان لاحقًا، إذ سنأخذ اللون من لون واجهة الزر. يمكن تصميم أيقونة الأزرار باستخدام برنامج رسم بسيط مثل الرسام (إن استخدمت نظام تشغيل ويندوز). سنستخدم في الزاوية اليسرى السفلية إطارين نصيين صغيرين يحويان إما ذكر M(ale)‎ أو أنثى F(emale)‎. توجد على اليمين ثلاثة إطارات نصية التي تحتوي Cost (euros)‎ وNr attending وTotals (euro)‎، ويكون ارتفاع الإطارات 5.5 مم تقريبًا، والخط Arial وحجمه 12 نقطة. سنخفّض النص في الإطارات قليلًا، مما يُعطي مظهرًا أفضل. انقر على قسم الأعمدة وتباعد النص Columns & text distances في تبويب نص Text من نافذة خصائص Properties، أو من نافذة خصائص النص في الإصدار 1.5.7 من برنامج سكريبوس، وطبّق تباعدًا 1 مم من الأعلى. سنضيف خطين سميكين هنا، وستظهر لنا النتائج حتى الآن مثلما في الشكل الآتي. لا تُعَد مواضع الأدلة Guides مهمة جدًا، حيث يمكنك تقدير مواضعها وسيفي ذلك بالغرض. لاحظ أن الهدف الرئيسي من الأدلة هو المساعدة في محاذاة الكائنات المختلفة، وإنشاء بعض التوازن ضمن التخطيط. إضافة عناصر نموذج PDF الخطوة التالية هي إضافة عناصر نموذج PDF والتي هي: سبعة حقول نصية ومربعي اختيار ومربع تحرير وسرد وزرّين، ولكل من هذه العناصر طريقته الخاصة: حقل النص Text field: يمكن للشخص الذي يستخدم النموذج ملء المعلومات في حقل نصي، ولكن سنضيف في مثالنا نصًا افتراضيًا يوضّح للمستخدم المعلومات المتوقعة. سترى في الشكل الآتي حقلين نصيين مكتملين على اليسار وحقلًا آخر يجب ملؤه بنص مناسب، حيث يمكنك كتابة النص مباشرةً في حقول النص، مثل الكتابة في إطارات النص النمطية، وبعد ذلك حدّد حقلًا نصيًا واستخدم محرّر القصص Story editor في سكريبوس لتحرير محتويات الإطار. مربعات الاختيار Check boxes: يوجد حقلان يمكن ملؤهما بعلامة، إذ نستخدم هذين الحقلين للدلالة على جنس المتقدّم. لا يمكن أن يكون المتقدّم ذكرًا وأنثى في الوقت نفسه، لذلك يجب أن يسمح النموذج بوضع علامة واحدة فقط في أحد مربعات الاختيار. سنتأكد من أن وضع علامة في أحد المربعات يزيل العلامة من المربع الآخر باستخدام البرمجة. قد تكون لدينا قائمة بالخيارات غير الحصرية التي يمكن للمستخدم الاختيار من بينها في بعض الحالات، وبما أنه سيكون هناك أكثر من خيار واحد، فلن نحتاج إلى هذه البرمجة التي تقيّد الاختيار. مربع التحرير والسرد Combo box: سنملأ مربع التحرير والسرد بعدد من خيارات التدريب، حيث سيملأ برنامج صغير هذا المربع مؤقتًاعندما ينقر المستخدم عليه، وستُملَأ التكلفة في أحد حقول النص بمجرد أن يختار المتقدّم التسجيل في تدريب معين، ويتطلب ذلك أيضًا قليلًا من البرمجة. ستُدخَل النتيجة فقط عندما ينقر المستخدم في حقل آخر، إذ سنجبر المستخدم على ذلك عن طريق ملء خانة عدد المتقدمين بالقيمة صفر، ولهذا يجب على المستخدم تغيير ذلك، وبالتالي سينفّذ البرنامج، ويمكنك تطبيق ذلك بطرق أخرى أيضًا. الأزرار Buttons: يمكن البدء بإجراء من خلال النقر على زر. الزر الأشهر الذي نستخدمه يوميًا هو زر موافق أو OK، إذ يسمح لنا برنامج سكريبوس أيضًا بإضافة مثل هذا الزر إلى النموذج. نجد خلف زر طباعة النموذج "Print From" جزء البرنامج الذي ينفّذ هذا الإجراء. لا يحتاج زر إرسال النموذج أيَّ شيفرة برمجية لأنه يمكن ضبط هذا الإجراء في نافذة ضمن برنامج سكريبوس. الأحداث Events يُعَد النقر على زر أو النقر في حقل نصي حدثًا إذا ملأت حقلًا نصيًا، أو إذا اخترت من مربع قائمة أو مربع تحرير وسرد ثم نقرت في حقل آخر، فهذا يسمى أيضًا. يتصل الحدث بحقل نصي أو زر أو أي عنصر تحكم آخر في نموذج PDF، ويوفّر كل حدث يمكن اكتشافه إمكانية إضافة جزء من شيفرة برمجية إليه. سنضيف في نموذجنا زرًا لطباعة النموذج عندما ينقر المستخدم عليه. وسنستخدم حدث mouse down (أي النقر على زر الفأرة الأيسر عند وضع مؤشرها على الزر) لبرمجة الجزء الذي سينفّذ هذه المهمة، بحيث إذا نقر المستخدم على الزر عشر مرات فرضًا، فسيُطبَع النموذج عشر مرات. تسمَّى طريقة البرمجة هذه بالبرمجة المُقادة بالأحداث، فجميع أنظمة التشغيل المتوفرة حاليًا للحواسيب مثل Apple OS X وOS / 2 وLinux وWindows وغيرها مبنية على هذا المبدأ، ولا بد أنك على دراية بهذه الطريقة، وستتعرّف الآن على الجانب الخلفي من هذه التقنية وتبرمجها بنفسك. ارسم حقل pdf نصي على يسار النموذج. اضبطه على النحو التالي: نوع الخط Arial وحجمه 12 نقطة، تباعد من الأعلى 1 مم، العرض تقريبًا 60 مم والارتفاع 5.5 مم. انسخ هذا الحقل ثلاث مرات (باستخدام Ctrl + C ثم Ctrl + V من لوحة المفاتيح في نظام Windows)، ثم ضَع هذه النسخ أسفل بعضها البعض بدقة. لاحظ أنه يمكنك أيضًا استخدام قائمة عنصر Item ثم مضاعفة/تحويل ثم نُسخ مطابقة Multiple Duplicate لإنشاء هذه النسخ، إما عن طريق نسخ سلسلة منها مع تباعد رأسي معين، أو إنشاء عدد من الصفوف مع التباعد الذي ضبطته. انقر على حقل النص الأول بزر الفأرة الأيمن واختر من القائمة المنبثقة تحرير نص Edit text باستخدام محرّر القصص. ثم يفتح محرر القصص، حيث يمكنك كتابة النص. حرّر النص وأغلق نافذة محرّر القصص، ثم سيظهر النص في حقل النص. كرّر هذا الإجراء لإضافة النصوص إلى الحقول الأربعة التالية: الاسم Name والعنوان Address والرمز البريدي Postal code والمدينة City. ارسم مربعي الاختيار بجوار إطارات النص التي تقرأ M وF على التوالي. نحتاج إلى عناصر تحكم pdf التالية على الجانب الأيمن من النموذج: مربع التحرير والسرد في الأعلى. ثلاثة حقول نصية تحت مربع التحرير والسرد وعلى يمين الإطارات النصية الثلاثة الموجودة سابقًا. ثم زرين أسفل هذه المجموعة. يوضّح الشكل التالي النموذج كما يجب أن يبدو عليه حتى الآن. لاحظ أن الإطار االمحدّد باللون الأحمر غير مذكور، ولكنه إطار حاشية نصية Text Annotation. وضع أيقونة Icon على الزر يمكن تحسين الأزرار باستخدام صورة صغيرة عليها، إذ نسمّي هذه الصورة أيقونة، أو يمكنك بدلًا من ذلك إضافة نص قصير إلى واجهة الزر فقط. تُعَد إضافة نص إلى زر في سكريبوس مثل إضافة نص إلى حقل نصي. سنرسم هذه الأيقونة في مثالنا كما يلي: استخدم برنامج رسم مثل برنامج الرسام الخاص بنظام Windows. حدّد حجم لوحة الرسم الذي يجب أن يتناسب مع حجم الزر. يجب أن يكون القياس 200‎ x 100 بكسل أكثر من كافٍ. وستجد الحجم في أيّ برنامج ضمن الخيار خصائص من قائمة ملف. سيسمح لك برنامج الرسم بإضافة نص، واستخدام خط مثل Wingdings أو Symbol لإضافة إشارات خاصة مثل لوحة مفاتيح الحاسوب والسهم والمغلّف. أضف بعض ألوان للخلفية وبعض الخطوط السميكة مع تظليل أغمق قليلًا، فهذا يعطي إحساسًا بتأثير الظل. احفظ رسم الأيقونة وانتقل إلى سكريبوس. إعداد الحقول المهمة التالية هي إعداد جميع الحقول من خلال نافذة خصائص الحقل Field Properties. لنبدأ بأحد الأزرار: انقر نقرًا مزدوجًا على الزر الموجود على اليمين، لتفتح نافذة خصائص الحقل. أسنِد اسمًا لهذا الحقل. إذا تخطيت ذلك فإن جميع عناصر التحكم في النموذج ستأخذ اسمًا عامًا يتكون من نوع الحقل ورقم، حيث لن يكون هذا الاسم واضحًا جدًا. لذلك انتقل إلى تبويب المظهر Appearance وأسند اسمًا يوضّح الغرض من الحقل. اختر الخيار لا طباعة No Print في قسم الوضوح Visibility. وإذا قرر المستخدم طباعة النموذج بعد ذلك، فلن تكون طباعة الأزرار أمرًا ضروريًا. حدّد التبويب خيارات Options واختر نوع الزر عادي Normal. ثم تفتح نافذة فتح Open، وستحدّد واجهة الزر (الرمز أو الأيقونة) التي جهّزتها للتو. ضع في بالك أنه يمكنك استخدام ما يصل إلى ثلاثة أيقونات: عادي Normal (المرئي في معظم الأحيان)، وPressed الذي ظهر عند النقر على الزر، وتدفق Roll over الذي يظهر عندما يحوم مؤشر الفأرة فوق الزر. وقد استخدمنا في مثالنا أيقونةً واحدةً فقط. انقر على تبويب إجراء Action وحدّد النوع Type سلّم النموذج Submit form. اكتب رابط url في خانة تسليم للرابط Submit to url. يوضّح الشكل التالي كيفية استخدام عنوان البريد الإلكتروني، حيث سيحاول برنامج Adobe Acrobat Reader فتح عميل البريد على حاسوب المستخدم. وإذا فشل في ذلك فستظهر نافذة مع بعض الخيارات. اكتمل إعداد الزر الآن. يمكن تحسين الزر الأيسر الذي يعالج طباعة النموذج باستخدام أيقونة بنفس الطريقة السابقة. لكننا استخدمنا محرر القصص لإضافة نص إلى الزر. إذا استخدمت لون خلفية للزر الذي يرسل نتائج النموذج عبر البريد الإلكتروني تمامًا كما فعلنا، فيمكنك استخدام أداة سكريبوس قطارة العين Pipet لإضافة هذا اللون إلى ألوان المستند واستخدامه لتحسين عنوان النموذج والخطين اللذين أضفناهما سابقًا. اصطلاحات التسمية Naming Conventions تمكّننا الأسماء المُسنَدة للحقول في "الجزء الخلفي" من النموذج من أداء مهام معينة من خلال أجزاء الشيفرة البرمجية، حيث يجب ألّا يكون جانب المستخدم (الجزء الأمامي) وجانب المبرمج (الجزء الخلفي) من النموذج متماثلين. تُعَد الأسماء العامة مرهقةً عمليًا، لأنها تُستخدم أيضًا لتقديم نتائج النموذج عند إرسالها عن طريق البريد الإلكتروني، ولذلك يُفضَّل أن تحصل على نتيجة كما يلي: table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } اسم الحقل الدخل G. Bruijnes Name Langstraat 6 Address ‎1234 AA Postal code Stadje City ON Female وتكون النتيجة الأقل وضوحًا بأسماء عامة كما يلي: اسم الحقل الدخل G. Bruijnes Text22 Langstraat 6 Text37 ON Text42 يمكن أن تختلف لغة التسميات عن اللغة المستخدمة في النموذج، لأن النتائج قد يعالجها موظفون لا يتحدثون الإنجليزية، ولكن هذا ليس ضروريًا ويمكنك استخدام أي شيء تريده. يستخدم المبرمجون غالبًا نوعًا مختلفًا من التسميات يسمَّى الترميز المجري Hungarian Notation، حيث يُذكَر نوع الكائن في الاسم (نسمي الحقل كائنًا أو عنصر تحكم)، لذلك تكون اللغة الإنجليزية في هذه الحالة هي اللغة السائدة وتكون أسماء الحقول كما يلي: اسم الحقل chkFemale txtAcqAddress btnPrintForm توضّح البادئة chk أننا نتعامل مع مربع اختيار، وستشير txt إلى حقل نصي، وbtn إلى زر. إعداد الحقول الأخرى يمكنك إعداد الحقول بالنقر المزدوج عليها لتظهر نافذة خصائص الحقل. يوضح الجدول التالي جميع المعلومات الضرورية لأنواع الحقول الأخرى: عنصر التحكم التبويب في نافذة خصائص الحقل الإعداد Checkbox (M)‎ المظهر Appearance الاسم: M Checkbox (M)‎ خيارات Options الإعداد الافتراضي غير مُحدَّد Checkbox (F)‎ المظهر Appearance الاسم: F Checkbox (F)‎ خيارات Options الإعداد الافتراضي غير مُحدَّد (معظم المعلمين من الإناث) Combo box المظهر الاسم: Training الحقل الموجود بجوار التكلفة Cost المظهر الاسم: Cost الحقل الموجود بجوار التكلفة Cost نسّق Format الملف منسّق كـ: عدد Number، كسور عشرية: 0، استخدم رمز العملة Use Currency symbol: دون تحديد، التنسيق: 9,999.99 الحقل الموجود بجوار التكلفة Cost تحقّق Validate يجب أن تكون القيمة أكبر أو يساوي: 1 الحقل الموجود بجوار التكلفة Cost في محرّر القصص Story Editor: الدخل Input، والمحاذاة Alignment الدخل: 0، والمحاذاة: إلى اليمين الحقل الموجود بجوار التكلفة الإجمالية Totals المظهر الاسم: Totals الحقل الموجود بجوار التكلفة الإجمالية Totals نسّق Format الملف منسّق كـ: عدد Number، كسور عشرية: 0، استخدم رمز العملة Use Currency symbol: دون تحديد، التنسيق: 9,999.99 إذا أضفت حقل حاشية نصية النوع Type وصلة شبكية خارجية External weblink إذا أضفت حقل حاشية نصية الموقع Destination أي موقع إالكتروني www.yourwebsite.com مثلًا وبذلك يكتمل إعداد الحقول. إضافة البرمجة (أجزاء الشيفرة البرمجية) نستخدم لغة JavaScript لأتمتة أحداث معينة. ليست هناك حاجة لأن تكون لديك أي خبرة برمجية محددة لتتمكن من فهم أجزاء الشيفرة التي سنستخدمها. ;إذا أردت إنشاء المزيد من نماذج pdf بنفسك، فلن يكون هناك مفر، إذ يجب عليك تعلم لغة JavaScript. مربعات الاختيار check boxes معظم المدرسين من الإناث، ولذلك حدّدنا مربع الاختيار F افتراضيًا. انقر نقرًا مزدوجًا على مربع الاختيار M. حدد التبويب الإجراء Action في نافذة خصائص الحقل. اختر النوع Type: جافاسكربت JavaScript. اختر الحدث Event: الفأرة للأعلى Mouse up. انقر على زر تحرير Edit. انسخ جزء الشيفرة التالي: var v = this.getField("F"); v.value="Off"; يقع جزء الشيفرة في حدث الفأرة للأعلى Mouse up في مربع الاختيار M. إذا نقرت على مربع الاختيار M، فستوضَع علامة الاختيار في هذا المربع، وهذا يعني أنه يجب إزالة علامة الاختيار المعيارية في مربع الاختيار F. أشرنا أولًا إلى الحقل F في هذا الجزء من الشيفرة، ثم يمكننا عند تحقّق ذلك أن نحوّل قيمة الحقل F إلى "إيقاف Off". اختر قائمة ملف File ثم حفظ وإغلاق Save and Exit في قائمة المحرر عند الانتهاء. ثم سترى جزء الشيفرة في نافذة خصائص الحقل. انقر على الزر "موافق" في نافذة "خصائص الحقل Field Properties". انقر نقرًا مزدوجًا على مربع الاختيار F. حدد التبويب الإجراء وأضف الإعداد نفسه الذي أجريته مع مربع الاختيار M. جزء الشيفرة مختلف قليلًا. قد يرتكب المستخدم خطأً أو قد يغير رأيه، لذلك يجب أيضًا أن نكون قادرين على إزالة العلامة من مربع الاختيار M: var m = this.getField("M"); m.value="Off"; مصطلحات برمجية يعني الاختصار var متغيرًا variable، فالمتغير هو اسم عشوائي نستخدمه للإشارة إلى شيء ما. وتشير المتغيرات في أجزاء الشيفرة السابقة إلى الحقول ذات الأسماء M وF على التوالي، وهي الحقول التي وضعناها في النموذج بجوار حقلي النص M(ale)‎ وF(emale)‎؛ بينما Value هو خاصية الكائن، والكائن هو الحقل، حيث لكل كائن خصائص محددة تمامُا كما هو الحال في الحياة الواقعية، حيث تمتلك السيارة خاصية اللون Color وخاصية عدد الأبواب NumberOfDoors على سبيل المثال. يقع الحدث عندما يحدث شيء مثل النقر بالفأرة على زر أو تحريك الفأرة فوق كائن مثل حقل نص أو مربع اختيار. لاحظ أن المتغير v يوضح أن اسم المتغير في لغة JavaScript لا يجب أن يتطابق مع اسم الحقل. أجزاء الشيفرة لمربع التحرير والسرد يستخدم مربع التحرير والسرد جزأين برمجيين، حيث يكون الجزء الأول نشطًا عندما ينقر المستخدم على المربع ويزوّده بقائمة الدورات الممكنة، وبالتالي تقديم عدد من الخيارات. يجب أن ننفّذ ذلك في وقت تحميل النموذج في قارئ PDF، ولكن هذا خارج نطاق هذا المقال، لذلك سنستخدم الطريقة التالية: انقر نقرًا مزدوجًا على مربع التحرير والسرد. حدّد تبويب الإجراء Action. اختر النوع: جافاسكربت JavaScript. اختر الحدث: On focus. انقر على الزر تحرير وانسخ جزء الشيفرة التالي: var f = this.getField("Training"); f.editable = false; f.doNotSpellCheck = true; f.commitOnSelChange = true; f.setItems( ["Choose course!", "Basic", "Intermediate", "Advanced"]); يمكن منع حدوث تغيير في إعدادات الحقل باستخدام شيفرة برمجية، إذ يمكننا أن نحرم المستخدم من إمكانية ملء تدريب غير موجود من خلال f.editable = false;‎. وإذا سمحنا بالتعديل، فسيصبح الأمر برمته أكثر تعقيدًا، لأنه يجب أيضًا التحقق من معلومات المستخدم المتوفرة، وقد عطّلنا التدقيق الإملائي أيضًا لأننا سنضيف أسماء التدريبات الصحيحة بأنفسنا. سيُملَأ مربع التحرير والسرد بأربعة احتمالات، أولها اختيار الدورة، حيث يشير المستخدم إلى المعلومات المطلوبة. تمثّل المدخلات الثلاثة الأخرى الدورات التدريبية المتاحة. ويمكنك إضافة ما تريد، ولكن يجب بعد ذلك تعديل جزء الشيفرة الآتي: اختر حفظ وإغلاق في قائمة ملف ضمن المحرّر. حدّد الحدث On blur، حيث يشير هذا الحدث إلى النقر بالفأرة في المربع أو استخدام مفتاح Tab من لوحة المفاتيح لينتقل المؤشر إلى مربع التحرير والسرد، بعد ذلك انسخ جزء الشيفرة التالي: var t = this.getField("Training"); var c = this.getField("Cost"); switch (t.value){ case 'Basic': { c.value=250; } break; case 'Intermediate': { c.value=275; } break; case 'Advanced': { c.value=325; } break; default: { c.value=0; } } يشير المتغير c إلى حقل النص الذي اسمه Cost ويمثّل التكلفة. يُكتَب المبلغ في هذا الحقل اعتمادًا على الاختيار الذي أُجري في مربع التحرير والسرد، وهناك قيمة افتراضية هي 0، وهي صالحة طالما لم يُحدَّد أي خيار. العمليات الحسابية Calculations يجب أن نجري العملية الحسابية اللازمة لجداء عدد المتقدمين بتكلفة الدورة كما يلي: انقر على الحقل خلف إطار النص المكتوب عليه Totals. حدّد تبويب احسب Calculate. انقر فوق زر اختيار "القيمة هي Value is the" واختر "الناتج product" من القائمة. انقر على الزر "التقط Pick"، واحرص على أن تكون الحقول Cost وNrAt في قسم الحقول المحدَّدة كما في الشكل الآتي. أغلق جميع النوافذ بزر موافق. اختبار النموذج احفظ عملك في سكريبوس. صدّر الملف بصيغة pdf. احفظ الملف مرةً أخرى في سكريبوس، وذلك لحفظ التغييرات التي أجريتها على طريقة تصدير سكريبوس للملف بصيغة pdf. ابحث عن ملف pdf على القرص الصلب وافتحه باستخدام برنامج Acrobat Reader أو أي قارئ PDF آخر. تحقق مما إذا كان كل شيء يعمل بصورة صحيحة. إذا كانت التغييرات مطلوبة فأغلق ملف pdf، وأجرِ تغييرات في بيئة سكريبوس وكرّر الخطوات السابقة. لننفّذ هذه الخطوات معًا كما يلي: انتقل أولًا إلى سكريبوس، وافتح القائمة ملف File واختر حفظ Save. ارجع إلى القائمة ملف واختر تصدير Export، ثم اختر حفظ مثل PDF. ما عليك سوى إجراء تغييرات في بضع تبويبات فقط هي: التبويب التغيير الإعداد عام General إخراج للملف: Output to File: استخدم اسمًا وموقعًا يسهّلان عليك العثور على الملف بعد ذلك. عام General التوافق Compatibility الإصدار PDF 1.4 (Acrobat 5)‎ على الأقل خطوط Fonts الخطوط للتضمين Fonts to embed اضغط على ضمّن الكل Embed all لون Color الإخراج بهدف: Output Intended For: شاشة / ويب Screen / Web انقر الآن على زر حفظ Save. افتح مستكشف Windows أو أي مدير ملفات آخر مناسب لنظام التشغيل الذي تستخدمه مثل نوتيلوس Nautilus في نظام أوبونتو Ubuntu، أو فايندر Finder على آبل Apple. ابحث عن ملف pdf وافتحه، إذ يمكنك تشغيل برنامج Adobe Reader وفتح الملف منه. قد يعرض القارئ تحذيرًا، وهذا التحذير واضح، فالنموذج قادر على إرسال البيانات بالبريد الإلكتروني. تحقق مما إذا كان كل شيء صحيحًا، وانقر على مربع التحرير والسرد، بعدها حدّد دورةً تدريبية، واختبر أيضًا عمل زر طباعة النموذج. إذا ثُبِّت عميل بريد إلكتروني مثل أوتلوك Outlook لنظام التشغيل ويندوز، فستُعالَج نتائج النموذج مباشرة. بينما في حالة وجود خدمة بريد عبر الإنترنت مثل ياهو Yahoo أو جيميل Gmail، فيجب حفظ ملف pdf أولًا -ويمكن ذلك فقط مع الإصدار 9 من Adobe Reader أو الإصدارات الأحدث-، ثم يمكن إرسال النتائج عبر البريد الإلكتروني. يمكنك اختيار عدة أنواع من الملفات عند الحفظ مثل: النوع الوصف النوع ‎ .fdf تنسيق ملف نموذج Adobe، حيث تُحفَظ البيانات الموجودة في الحقول فقط. يجب في هذه الحالة أن يكون لدى المتلقي أيضًا نسخة من النموذج الأصلي، ثم تُضاف البيانات المرسَلة عبر البريد الإلكتروني تلقائيًا إلى النموذج. النوع ‎ .xfdf تنسيق ملف النموذج الموسَّع extended form file format القادر على إظهار مزيد من الخيارات. النوع ‎ .xml تنسيق ملف قادر على عرض البيانات في الحقول المناسبة على صفحة ويب. النوع ‎.txt تُحفَظ البيانات في هذه الحالة كملف نصي بسيط يمكن فتحه وقراءته باستخدام أي معالج أو محرّر نصوص متوفر على نظامك. النتائج تبدو النتائج كملف FDF كما يلي: نتائج النموذج تُطبَع عادةً جميع الحقول حقلًا تلو الآخر. وقد وضعنا كل حقل على سطر خاص به من أجل الوضوح في الشكل السابق، إذ يجب ترتيبها بنفس الترتيب الذي وُضِعت فيه ضمن النموذج، وإذا استخدمت ترتيبًا مختلفًا، فسينعكس ذلك على النتيجة. لا ينبغي أن يمثل ذلك مشكلةً كبيرةً جدًا بسبب إضافة أسماء الحقoول أيضًا إلى الملف، وهذا سبب وجيه لتسمية الحقول الخاصة بك بعناية وعدم استخدام الأسماء المعيارية. يمكن تغيير ترتيب الحقول في بيئة سكريبوس، وهنا استخدم تبويب X وY وZ في نافذة الخصائص لتغيير الترتيب باستخدام قسم مستوى Levels، كما في الشكل السابق. سترى رقم الحقل بالتناوب عند تحديد الحقل، ويمكن أيضًا العثور على اسم الحقل ضمن هذا التبويب في الجزء العلوي، إذ يمكنك تغيير الاسم من هنا أيضًا. ترجمة -وبتصرّف- للمقال A Brief Tutorial on Forms لصاحبه Gerrit Bruijnes. اقرأ أيضًا كيفية بدء استخدام برنامج سكريبوس Scribus كيفية إنشاء أشكال معقدة ذات زوايا دائرية في برنامج سكريبوس Scribus خط الشبكة الأساسي Baseline Grid في برنامج سكريبوس كيفية إنشاء رمز RSS Feed في برنامج سكريبوس Scribus كيفية إنشاء لافتة نيون Neon Sign في برنامج سكريبوس Scribus
  2. سنتحدث في هذا المقال عن كيفية تطبيق تأثيرات فنية على الصور في برنامج سكريبوس Scribus الذي يحتوي على تأثيرات متنوعة، مثل السطوع والتدرج الرمادي، وتأثير الأشعة السينية والأبيض والأسود، وغيرها الكثير، مما يعطي جاذبية للصور، كما سنتحدث عن كيفية إنشاء إطار صورة بحواف ضبابية في سكريبوس Scribus باستخدام تدرج لوني شعاعي Radial Gradient مع تغيير تعتيم Opacity وتظليل Shade التعبئة اللونية كيفية تطبيق تأثيرات فنية على الصور في سكريبوس يمكنك إنشاء تأثيرات صور رائعة في برنامج سكريبوس Scribus دون الحاجة إلى تعلم برنامج جيمب GIMP أو فوتوشوب Photoshop. لا يقدِّم هذا المقال دليلًا شاملًا لتأثيرات الصور في سكريبوس، وإنما يقدِّم بعض الأساسيات وبعض التأثيرات المحدَّدة التي يمكنك تطبيقها، حيث يفترَض أنك تعرف بالفعل كيفية وضع صورة في إطارها، والتعامل مع الإطار لتتناسب الصورة معه. الإعداد يجب أولًا أن تنزِّل الصورة التي سنعمل عليها، حيث يمكنك استخدام التأثيرات على أي صورة تريدها، ولكن هذه الصورة مناسبة لإظهار التأثيرات التي نريد تطبيقها. افتح سكريبوس وأنشئ مستندًا جديدًا (استخدم القياس الذي تريده). أنشئ إطار صورة له شكل الصورة نفسه (صورة باتجاه أفقي مثلًا). انقر بزر الفأرة الأيمن على الإطار واختر استيراد صورة Get Image من القائمة. اختر الصورة التي نزَّلتها للتو ثم اضغط موافق. اضبط الصورة والإطار لتحصل على الصورة بأكملها ضمن الإطار. أساسيات التأثيرات تأثيرات الصورة Image Effects هي تغييرات يمكنك تطبيقها على الصور في سكريبوس، إذ لن تغيِّر هذه التأثيرات الصورة الأصلية، بل ستطبِّق التغييرات داخل سكريبوس فقط، والتي ستراها على الشاشة وستنتقل إلى الخرج النهائي دون تغيير الصورة الأصلية. سنبدأ أولًا بتطبيق بعض التأثيرات الأساسية لترى كيفية عملها. انقر بزر الفأرة الأيمن على إطار الصورة، واختر مؤثرات الصورة Image Effects من القائمة، حيث ستُنقَل إلى نافذة مؤثرات الصورة كما هو موضح في الشكل التالي: توجد في هذه النافذة أربعة أقسام رئيسية هي: لوحة المعاينة Preview، حيث سترى نتيجة تطبيق التأثيرات على صورتك. لوحة الخيارات Options، حيث سترى الإعدادات المختلفة التي تغير كيفية تطبيق التأثيرات على الصورة. قائمة "المؤثرات المتوفرة Available Effects"، حيث يمكنك اختيار التأثيرات لتطبيقها على الصورة. أخيرًا، قائمة التأثيرات المُطبَّقة حاليًّا على الصورة والتي تُسمَّى "التأثيرات المتوفرة حاليًّا Effects in Use". يمكن إضافة تأثير إلى الصورة من خلال تحديده من قائمة المؤثرات المتوفرة، ثم الضغط على زر إضافة لإرساله إلى القائمة التالية. ويمكن إزالة تأثير من قائمة التأثيرات المطبَّقة من خلال تحديده من قائمة المؤثرات المتوفرة حاليًّا، ثم الضغط على زر إزالة. تُطبَّق التأثيرات الموجودة في القائمة على الصورة بترتيب تنازلي، إذ يُطبَّق التأثير في أعلى القائمة أولًا، ثم الذي بعده وهكذا. ويمكنك تغيير ترتيب تطبيق التأثيرات باستخدام أزرار الأسهم التي تشير للأعلى وللأسفل بجانب زر إزالة. إضافة التأثير الأول لنبدأ بتطبيق بعض التأثيرات: حدد تأثير "السطوع Brightness" من القائمة واضغط على زر إضافة، لكن لن يتغير شيء في لوحة المعاينة، لأن تأثير "السطوع" افتراضيًّا لا يطبِّق شيئًا في البداية إلى أن تخبره بخلاف ذلك باستخدام لوحة الخيارات. اسحب شريط التمرير إلى اليمين وإلى اليسار في لوحة الخيارات، حيث يمكنك أن ترى كيفية تطبيق التأثير على الصورة في لوحة المعاينة، بعدها حرِّك السطوع إلى اليسار -سطوع إيجابي- لجعل الصورة أفتح، وحرِّكه إلى اليمين -سطوع سلبي- لجعلها أغمق. حدِّد تأثير "السطوع" الذي أضفته للتو واضغط على زر إزالة، وبالتالي سيُزال هذا التأثير وسترى أن المعاينة قد تغيَّرت إلى الصورة الأصلية. حدِّد تأثير "تدرج رمادي Greyscale" من القائمة واضغط على زر إضافة، حيث يجب أن تعرض لوحة المعاينة الآن الصورة رماديةً وبدون ألوان، وستلاحظ أنه لا توجد خيارات في لوحة الخيارات، فبعض التأثيرات ليس لها خيارات، لأنها ببساطة تطبِّق شيئًا واحدًا ولا يمكنك تغييره. اضغط على موافق. ستلاحظ الآن تطبيق تأثير "التدرج الرمادي Greyscale" على صورتك، وهو تأثير جيد ولكنه ليس فنيًّا، حيث سنطبِّق بعد ذلك بعض التأثيرات بطرق أكثر تعقيدًا. تحسين تأثير التدرج الرمادي سننشئ الآن صورةً فنيةً بتدرج رمادي، فقد رأيتَ نسخة الصورة ذات التدرج الرمادي في وقت سابق، والتي تبدو "فنيةً" بعض الشيء كما تبدو معظم الصور بالأبيض والأسود، ولكن سكريبوس يمكنه تحسين ذلك. افتح نافذة مؤثرات الصورة Image Effects وأزِل أي تأثيرات متوفرة حاليًّا (حدِّدها ثم اضغط على زر إزالة). حدِّد تأثير "درجتين لونيتين Duotone" من التأثيرات المتوفرة واضغط على زر إضافة، حيث ستلاحظ أن صورتك تبدو ذات تدرج رمادي مرةً أخرى، ولكنها أغمق قليلًا من ذي قبل. اضغط على قائمة الألوان للون 2 في لوحة الخيارات، واختر اللون "الأبيض White". ستبدو صورتك الآن مشابهةً لتأثير التدرج الرمادي Greyscale السابق، وهو جيد ولكن يمكنك جعل الصورة تبدو أفضل. اضغط على الرمز الموجود تحت قائمة اختيار اللون 1، وهو مربع غريب بداخله خط قطريٌّ مثل الشكل التالي: يؤدي ذلك إلى فتح "محرِّر المنحنى Curve Editor" للون 1 كما في الشكل التالي الذي قد يبدو معقدًا، ولكن ما عليك سوى اتباع التعليمات، ثم تجربة بعض التعديلات عليه لتعرف ما يفعله: انقر باستمرار على نقطة من الخط القطري عند النقطة (1,1) على شبكة محرر المنحنى، واسحبها للأسفل إلى النقطة (1,0) على الشبكة كما في الشكل التالي، ولاحظ تغيُّر المعاينة واختفاء خلفية الصورة: انقر باستمرار على نقطة من الخط القطري، حيث تعبر الخط العمودي الثالث من شبكة محرِّر المنحنى، واسحبها للأسفل إلى النقطة (3,2) على الشبكة كما في الشكل التالي: انقر على رمز "محرِّر المنحنى Curve Editor" مرةً أخرى لإغلاقه، واضغط موافق. هنا يجب أن تظهر لك الصورة كما يلي: محاكاة صورة 1 بت Simulating 1-Bit إن أردت صورةً بالأبيض والأسود بدلًا من صورة ذات تدرج رمادي، فهذا أمر بسيط في سكريبوس الذي يطبِّق محاكاةً لما يسمى أحيانًا "صورة 1 بت". افتح نافذة مؤثرات الصورة مرةً أخرى وحدِّد تأثير "درجتين لونيتين Duotone" الذي أضفته للتو في قائمة "التأثيرات المتاحة حاليًّا". افتح محرِّر المنحنى Curve Editor للون 1 واسحب المنحنى، بحيث يبدو مثل الشكل التالي: انقر على رمز محرِّر المنحنى Curve Editor للون 1، ثم اضغط على موافق. يجب أن تكون لديك الآن صورة تشبه الشكل التالي، وأن تبدو جيدةً على الرغم من أنها ليست صورة 1 بت باللون الأبيض والأسود تمامًا: درجة اللون البني الداكن Sepia Tone إن أردت إنشاء صورة ذات لون بني داكن على الطراز القديم، فالأمر سهل مع سكريبوس، حيث يجب أولًا إنشاء لون جديد لاستخدامه مع التأثير كما يلي: اختر قائمة تحرير Edit، ثم الألوان والتعبئة Colors. اضغط على زر جديد أو إضافة. أدخِل "Sepia" مثل اسم للون الجديد. اضبط نمط الألوان على "RGB". اضبط قيم RGB على النحو التالي: R = 235 وB = 130 وB = 40. اضغط موافق ثم موافق مرةً أخرى. سننشئ بعد ذلك التأثير كما يلي: افتح نافذة مؤثرات الصورة وأزل أي تأثيرات متوفرة حاليًّا. حدِّد تأثير "درجتين لونيتين Duotone" من قائمة التأثيرات المتوفرة، واضغط على زر إضافة. اضبط اللون 2 ليكون "Sepia". اضغط على موافق. وهذا كل ما عليك فعله للحصول على تأثير كما في الشكل التالي: تأثير الأشعة السينية X-Ray إذا احتجت يومًا إلى صورة تشبه صورة الأشعة السينية، فيمكن لسكريبوس فعل ذلك. افتح نافذة مؤثرات الصورة وأزِل أي مؤثرات متوفرة حاليًّا. حدِّد تأثير "اعكس Invert" من المؤثرات المتاحة واضغط على زر إضافة. اضغط على موافق. ستبدو الصورة مثل صورة الأشعة السينية في الشكل التالي: لكن صور الأشعة السينية ليست ملونةً بهذا الشكل، ويمكن معالجة ذلك بطريقتين، هما استخدام تأثيرات متعددة، وقلب تأثير الدرجتين اللونيتين. تأثيرات متعددة Multiple Effects افتح نافذة مؤثرات الصورة، وحدِّد تأثير "تدرج رمادي Greyscale" من المؤثرات المتوفرة، بعدها اضغط على زر إضافة لإضافته إلى قائمة التأثيرات. اضغط على موافق. عندها ستظهر لديك صورة مثل الشكل التالي: قلب التأثير درجتين لونيتين Duotone افتح نافذة مؤثرات الصورة وأزِل أي تأثيرات متوفرة حاليًّا. حدِّد تأثير "درجتين لونيتين Duotone" من التأثيرات المتوفرة، واضغط على زر إضافة. حدِّد اللون "الأخضر Green" من قائمة "اللون 2" في لوحة الخيارات. اضغط على رمز محرِّر المنحنى Curve Editor للون 2، واضغط على رمز "اقلب المنحنى Invert" في الأعلى. اضغط على محرِّر المنحنى مرةً أخرى ليختفي. اضغط على رمز محرِّر المنحنى Curve Editor للون 1 واضغط على رمز "اقلب المنحنى Invert" في الأعلى. اضغط على محرر المنحنى مرةً أخرى ليختفي. اضغط على موافق. هنا سينتج الشكل الآتي وهو أفضل بكثير، حيث لن تكون صور الأشعة السينية خضراء، ولكنها أفضل بكثير من تأثير "الخيال العلمي". استخدام الصورة مثل خلفية قد ترغب أحيانًا في وضع صورة أسفل نصٍّ ما ليكون جذابًا، ولكن قد تعترض الصورة النص، مما يصعِّب قراءته، وهنا يمكنك إنشاء تأثير بسيط ومناسب لذلك، باستخدام مؤثرات الصور في سكريبوس. افتح نافذة مؤثرات الصورة وأزِل أي تأثيرات متوفرة حاليًّا. أضف تأثير "تدرج رمادي Greyscale". أضف تأثير "السطوع Brightness"، واضبط شريط تمرير خيار السطوع على القيمة 100 تقريبًا. أضف تأثير "الضبابية Blur"، واضبط خيار نصف القطر Radius على القيمة 5. اضغط على موافق. أضف حقل نص فوق الصورة وأدخِل نصًّا. سيكون لديك الآن شيء مشابه للشكل التالي، وهنا لا تتردد في تغيير خيارات التأثيرات للحصول عليها بالطريقة التي تريدها: تأثير Pop Art يمكنك دمج تأثيرات مختلفة لإنتاج شيء يشبه تأثير Pop Art (لا يشبه كثيرًا هذا التأثير ولكنه تأثير غير عادي وملوَّن وقد يكون مفيدًا أحيانًا)، وذلك باتباع الخطوات الآتية: افتح نافذة مؤثرات الصورة وأزِل أي تأثيرات متوفرة حاليًّا. أضف تأثير "الضبابية Blur" واضبط خيار نصف القطر Radius على القيمة 1. أضف تأثير "المنحنيات Curves" واسحب المنحنى في لوحة الخيارات ليكون مشابهًا للشكل التالي: أضف تأثير "تقليل الألوان Posterise"، واضبط خيار قلِّل الألوان Posterise على القيمة 4. أضف تأثير "حدّ Sharpen"، واضبط خياري نصف القطر Radius، والقيمة Value على القيمة 4. اضغط على موافق. يجب أن يكون لديك الآن شيء مشابه للشكل التالي: قد لا تستخدم أبدًا شيئًا مثل الصورة السابقة، ولكن يمكنك أن ترى كيفية إضافة التأثيرات لبعضها البعض لإنتاج تأثيرات مختلفة، كما يمكنك استخدام التأثيرات نفسها على صورة مختلفة لإعطاء تأثير عام مختلف مثل الشكل التالي: كيفية إنشاء إطار صورة بحواف ضبابية في سكريبوس التقنيات المحدَّدة المستخدَمة في هذا الدرس هي: إنشاء لون جديد. إضافة صورة وتغيير حجمها وتعديلها. تغيير حجم شكل. إنشاء تدرج لوني شعاعي Radial Gradient. تغيير تعتيم Opacity وتظليل Shade التعبئة اللونية. الإعداد افتح مستند سكريبوس Scribus جديدًا. ستحتاج أولًا إلى صورة مهما كانت، ولكننا نوصي بأن يكون عنصر أو عناصر الصورة الرئيسية موجودًا بالقرب من مركزها للحصول على أفضل النتائج. ويُفضَّل أن تكون الخلفية ذات لون فاتح، أو أن تكون بيضاء اللون. ويمكنك تنزيل الصورة المستخدمة في هذا المقال (ستكون أصغر دقة مناسبة). ستحتاج بعد ذلك إلى لون للإطار، حيث سيَفِي أي لون بالغرض طالما أنه يتناسب مع الصورة، ولكننا سننشئ لونًا جديدًا، وسنسمِّيه "Shocking Pink". اختر قائمة تحرير Edit ثم الألوان والتعبئة Colors. اضغط على زر جديد أو إضافة. غيِّر الاسم إلى "Shocking Pink" (بدون علامات الاقتباس). حدد نمط الألوان "CMYK" من القائمة. غيِّر باستخدام أشرطة التمرير أو حقول الإدخال قيم "C" إلى 2% و"M" إلى 90% و"Y" إلى 20% و"K" إلى 2%. انقر على موافق في نافذة "تحرير الألوان Edit Color". اضغط موافق في نافذة الألوان والتعبئة. ستحتاج اللون "الأبيض"، ولكن يُحتمَل أن يكون لديك فعليًا من أي لوحة ألوان افتراضية. الصورة أنشئ إطار صورة يكون تقريبًا بنفس شكل صورة في وسط مستندك. الحجم ليس مهمًّا هنا، ولكن اجعل عرضه يقارب نصف عرض الصفحة لتتمكَّن من رؤية التأثير. وإذا اخترت صورة أفقية، فاجعل إطار الصورة أفقيًّا. انقر بزر الفأرة الأيمن على إطار الصورة واختر استيراد صورة Get Image من القائمة. حدِّد صورتك ثم اضغط موافق. انقر بزر الفأرة الأيمن على إطار الصورة، واختر اضبط الصورة إلى الإطار Adjust Image to Frame من القائمة. انقر بزر الفأرة الأيمن على إطار الصورة، واختر اضبط الإطار إلى الصورة Adjust Frame to Image من القائمة. يجب أن يكون لديك الآن شيء مثل الشكل الآتي، ولكن يجب قص أقسام الصورة التي لا تريدها. انتقل إلى تبويب صورة Image في نافذة خصائص Properties، أو انتقل إلى نافذة خصائص الصورة في الإصدار 1.5.7 من سكريبوس التي يمكن الوصول إليها من قائمة نوافذ ثم خصائص المحتوى. انقر على الخيار "تحجيم حر Free Scaling". اسحب الجزء السفلي من إطار الصورة لأعلى، بحيث يختفي جزء من المزهرية كما في الشكل التالي: قد يكفي هذا لتحرير الصورة حاليًّا، ولكن يمكنك دائمًا العودة وإجراء تعديلات على الصورة لاحقًا إن لم تكن راضيًا. الإطار حدِّد إطار الصورة واختر قائمة عنصر Item، ثم مضاعفة/تحويل، ثم نُسخ مطابقة Multiple Duplicate. اقبل الإعدادات الافتراضية، ثم اضغط على موافق. حدِّد الصورة المكرَّرة (اختر الصورة العلوية). اختر قائمة عنصر ثم تحويل لـ Convert To، ثم مضلع Polygon. انقر نقرًا مزدوجًا على المضلع لفتح نافذة محرِّر العقد Nodes Editor. أدخِل القيمة 60 نقطة في حقل الإدخال الثالث من الأسفل من شبكة الرموز لتمديد أو تقليص المضلع، حيث سيعتمد الحجم الدقيق على حجم إطار الصورة الأصلي، ولكن قد تحتاج إلى تجربتها أولًا. اضغط على مفتاح Tab من لوحة المفاتيح للتأكد من إدخال القيمة. اضغط على أيقونة "مدِّد حجم المسار بالقيمة المعروضة Enlarge the Size" على حقل النص الذي أدخلت القيمة فيه. اضغط على زر إنهاء التحرير أو موافق للخروج من محرِّر العقد. يجب أن يكون لديك الآن شيء مثل الشكل التالي: التعبئة حدِّد المضلع الأكبر، ثم انتقل إلى تبويب ألوان في نافذة خصائص. حدِّد تبويب لون التعبئة Fill. حدِّد لون التعبئة الذي أنشأته مسبقًا وهو اللون "Shocking Pink". بهذا تكون الصورة قد اختفت الآن خلف المضلع، ولكن لا بأس بذلك. اختر نمط التعبئة "متدرج شعاعي Radial Gradient" من القائمة. اسحب نقطة توقف التدرج الأيسر -المثلث الصغير- إلى الموضع 50%. حدِّد اللون "الأبيض" من قائمة الألوان. يجب أن تكون لديك الآن دائرة بيضاء في منتصف المضلع مثل الشكل التالي: تأثير الضبابية Fuzz اضبط التعتيم أو العتمة Opacity على القيمة 0% في تبويب ألوان ضمن نافذة خصائص، لتظهر صورتك مرةً أخرى. وهنا يجب إجراء مزيد من التعديلات على التعبئة المتدرجة الشعاعية، لهذا: انقر على شريط التعبئة المتدرجة لإنشاء نقطة توقف جديدة لهذا التدرج اللوني، واسحبها إلى الموضع 60%. تأكد من ضبط اللون على اللون "الأبيض". اضبط التعتيم على القيمة 30%. أنشئ نقطة توقف متدرجة أخرى في الموضع 70%. اضبطها على اللون "Shocking Pink". اضبط التعتيم على القيمة 50%. اضبط الظل Shade على القيمة 50%. اسحب نقطة توقف التدرج اليمنى إلى الموضع 80%. يجب أن يكون لديك الآن شريط متدرج مشابه للشكل التالي: إذا تخطى "الحد الضبابي" حافةَ إطار الصورة، فقد ترغب في تغيير نقاط توقف التدرج قليلًا من خلال سحبها جميعًا إلى اليسار بحوالي 10 أو 15% مثلًا، مع الاحتفاظ بالمسافة نفسها بين هذه النقاط. يمكنك بعد ذلك تحريك الإطار بالكامل لتوسيط عناصر الصورة بصورة صحيحة إن لزم الأمر. يجب أن يظهر لديك الآن شيء مثل الشكل التالي: الخلاصة الهدف الأساسي من هذا المقال هو توضيح أن سكريبوس لديه الكثير من تأثيرات الصور التي يمكن استخدامها بعدة طرق لإنشاء تأثيرات غير عادية ورائعة. فقد تكون النتيجة أحيانًا عديمة الجدوى ولن تستخدمها أبدًا، ولكنك لن تعرف أبدًا ما يمكن فعله إن لم تجرِّب. وإذا أردت أن يكون الانتقال بين اللون الأبيض ولون التعبئة أكثر سلاسةً، فستحتاج إلى إضافة مزيدٍ من نقاط توقف التدرج بين النقاط الموجودة سابقًا، مع تغيير إعدادات التعتيم والتظليل لتتلاءم مع هذا التعديل. وقد أنشأنا المثال التالي بهذه التقنية، ثم أضفنا نصًّا ومستطيلًا منحرفًا في الخلف: ترجمة -وبتصرُّف- للمقالين How to be artistic with image effects و How to create a fuzzy-edged picture frame اقرأ أيضًا كيفية التعامل مع إطارات الصور في برنامج سكريبوس Scribus كيفية وضع نص على مسار باستخدام برنامج سكريبوس Scribus كيفية إنشاء رسوم من النمط Pop Art Explosion في برنامج سكريبوس Scribus
  3. يجب على كل موجّهٍ وبغض النظر عن مدى بساطة أو تعقيد بقية آلية تخصيص الموارد، أن يطبِّق بعض أنظمة الأرتال التي تحكم كيفية تخزين الرزم مؤقتًا أثناء انتظار الإرسال. ويمكن عدُّ خوارزمية الرتل على أنها تخصيص لكلٍّ من حيز النطاق التراسلي لإرسال الرزم، ومساحة التخزين المؤقت لتجاهل الرزم، كما أنها تؤثر مباشرةً على زمن الانتقال الذي تتعرض له الرزمة من خلال تحديد المدة التي تنتظرها الرزمة حتى تُرسل. يقدِّم هذا القسم خوارزميتي أرتال شائعتين هما "الداخل أولًا، يخرج أولًا first-in, first-out"، أو اختصارًا FIFO والرتل العادل fair queuing أو اختصارًا FQ، ويحدّد هذا القسم العديد من الاختلافات المُقترحة. رتل الداخل أولا يخرج أولا FIFO ويُطلق عليه أيضًا رتل من يأتي أولًا يُخدَّم أولًا first-come, first-served أو اختصارًا FCFS. تُعَد فكرة رتل FIFO بسيطةٌ وهي على نحو أن الرزمة الأولى الواردة إلى موجّه هي الرزمة الأولى المُرسلة، وهذا موضحٌ في القسم (أ) من الشكل الآتي، والذي يُظهر أولًا رتل FIFO مع "فتحات" لاستيعاب ما يصل إلى ثمانية رزم. بما أن مقدار مساحة المخزن المؤقت في كل موجهٍ محدودة، فإذا وصلت رزمة وكان الرتل (مساحة المخزن المؤقت) ممتلئًا، فسيتجاهل الموجّه هذه الرزمة كما هو موضحٌ في القسم (ب) من الشكل الآتي، ويجري ذلك بغض النظر عن التدفق الذي تنتمي إليه الرزمة أو مدى أهمية الرزمة، ويسمى هذا أحيانًا "إسقاط الذيل tail drop"، حيث تُسقَط الرزم التي تصل إلى نهاية رتل FIFO. من المُلاحظ أن إسقاط الذيل ونظام FIFO هما فكرتان منفصلتان، فنظام FIFO هو نظام جدولةٍ يحدد الترتيب الذي تُرسَل الرزم به؛ أما إسقاط الذيل فهو سياسة إسقاط تحدّد الرزم التي تُسقَط. بما أن نظام FIFO وإسقاط الذيل هما أبسط أمثلةٍ لنظام جدولة وسياسة إسقاط على التوالي، فسيُنظر إليهما أحيانًا على أنهما حزمة bundle تُسمى تطبيق رتل الفانيلا vanilla queuing implementation، حيث يُشار إلى هذه الحزمة غالبًا ببساطة على أنها رتل FIFO، بينما يجب أن تُسمى بصورةٍ أدق FIFO مع إسقاط الذيل. يقدّم القسم اللاحق مثالًا لسياسة إسقاطٍ أخرى تستخدم خوارزمية أعقد من "هل يوجد مخزنٌ مؤقتٌ متاح؟"، وذلك لتحديد موعد إسقاط الرزم. يمكن استخدام سياسة الإسقاط هذه مع نظام FIFO، أو مع أنظمة جدولةٍ أعقد. يُعَد نظام FIFO مع إسقاط الذيل أبسط خوارزميات الأرتال وأكثرها استخدامًا في موجّهات الإنترنت حتى وقت كتابة هذا الكتاب. حيث يدفع هذا النهج البسيط للرتل بكامل مسؤولية التحكم في الازدحام وتخصيص الموارد إلى أطراف الشبكة، وبالتالي فإن الشكل السائد للتحكم في الازدحام في الإنترنت لا يفترض حاليًا أي مساعدة من الموجّهات، حيث يتحمل بروتوكول TCP مسؤولية اكتشاف الازدحام والاستجابة له. يختلف الرتل ذو الأولوية priority اختلافًا بسيطًا عن رتل FIFO الأساسي، حيث تتمحور فكرته حول تمييز كل رزمةٍ بأولوية ويمكن حمل العلامة mark في عنوان IP على سبيل المثال، وهذا ما سنناقشه في قسمٍ لاحق. تطبّق الموجّهات بعد ذلك عدّة أرتال FIFO، ويكون لكل رتل صنف أولوية، حيث يرسل الموجّه دائمًا الرزم من الرتل ذي الأولوية العليا إذا كان هذا الرتل غير فارغٍ قبل الانتقال إلى الرتل ذي الأولوية التالية، وتبقى الرزم مُدارةً بطريقة FIFO ضمن كل أولوية. تخرج هذه الفكرة قليلًا عن نموذج تقديم أفضل جهد، لكنها لا تذهب إلى حد تقديم ضماناتٍ لأي صنف أولوية معينة، فهي تسمح فقط للرزم ذات الأولوية العالية بالتقدم إلى الأمام. مشكلة الرتل ذي الأولوية هي أنه يمكن أن يُبقي جميع الأرتال الأخرى منتظرةً إلى أجلٍ غير مُسمّى؛ وهذا يعني أنه طالما أن هناك رزمةً واحدةً على الأقل ذات أولوية عالية في رتلٍ ذي أولوية عالية، فلن يجري تقديم الأرتال ذات الأولوية المنخفضة، وحتى يكون هذا قابلًا للتطبيق، فيجب أن تكون هناك قيودٌ صارمة على مقدار حركة المرور ذات الأولوية العالية المُدخلة إلى الرتل، كما يجب أن يكون واضحًا مباشرةً أنه لا يمكننا السماح للمستخدمين بضبط الرزم الخاصة بهم على أولوية عالية بطريقةٍ لا يمكن التحكم فيها؛ ولهذا يجب علينا إما منعهم تمامًا أو تأمين أحد أنواع "الصد pushback" للمستخدمين. إحدى الطرق الواضحة لفعل ذلك هي استخدام الاقتصاد، حيث يمكن للشبكة أن تتقاضى رسومًا أكبر لتقديم رزم ذات أولوية عالية أكثر من الرزم ذات الأولوية المنخفضة، ولكن هناك تحديات كبيرة أمام تطبيق مثل هذا المخطط في بيئةٍ لامركزية مثل الإنترنت. تتمثل إحدى المواقف التي يُستخدَم فيها الرتل ذو الأولوية في الإنترنت؛ في حماية الرزم الأعلى أهميةً، مثل تحديثات التوجيه الضرورية لتثبيت جداول التوجيه بعد تغيير مخطط الشبكة topology، حيث يوجد غالبًا رتلُ خاصٌ لمثل هذه الرزم الممكن تحديدها من خلال قيمة محرف الخدمات المميزة Differentiated Services Code Point والمعروفة سابقًا باسم حقل TOS في ترويسة IP، وهذه في الواقع حالةٌ بسيطة لفكرة "الخدمات المميزة". الرتل العادل تكمن المشكلة الرئيسية لرتل FIFO بعدم تمييزه بين مصادر حركة المرور المختلفة، أو عدم فصله للرزم وفقًا للتدفق الذي تنتمي إليه، وهذه مشكلة على مستويين مختلفين، فليس واضحًا في المستوى الأول أن تكون أية خوارزمية للتحكم في الازدحام ومُطبَّقةٌ بالكامل في المصدر قادرةً على التحكم في الازدحام بصورةٍ مناسبة وبمساعدةٍ قليلة جدًا من الموجّهات؛ أما على مستوىً آخر، فبما أن آلية التحكم في الازدحام مُطبَّقةٌ بأكملها في المصادر ولا يوفر رتل FIFO وسيلةً لمراقبة مدى التزام المصادر بهذه الآلية، فمن الممكن لمصدرٍ (تدفقٍ) سيء التصرف التقاط جزءٍ كبيرٍ من سعة الشبكة عشوائيًا. من الممكن بالتأكيد لتطبيقٍ معين عدم استخدام بروتوكول TCP في الإنترنت، وبالتالي تجاوز آلية التحكم في الازدحام من طرفٍ إلى طرف (تطبيقاتٌ مثل الاتصال الهاتفي عبر الإنترنت تفعل ذلك اليوم)، فمثل هذا التطبيق قادرٌ على إغراق موجّهات الإنترنت برزمها الخاصة، مما يتسبب في التخلص من رزم التطبيقات الأخرى. يمثّل الرتل العادل FQ خوارزميةً مصمَّمةً لمعالجة هذه المشكلة، حيث تتمحور فكرته في الاحتفاظ برتلٍ منفصلٍ لكل تدفقٍ يعالجه الموجّه حاليًا، ويخدّم الموجه بعد ذلك هذه الأرتال في نوعٍ من جولة روبن round-robin وهو تجوُّل دَوري موضحٌ في الشكل الآتي، حيث إذا أرسل التدفق الرزم بسرعةٍ كبيرة فسيمتلئ الرتل الخاص به، وعندما يصل رتلٌ إلى طولٍ معين، فستُهمَل الرزم الإضافية المُنتمية إلى رتل هذا التدفق، وبذلك لا يمكن لمصدرٍ معين زيادة حصته عشوائيًا من سعة الشبكة على حساب التدفقات الأخرى. لاحظ أن رتل FQ لا يتضمن إخبار الموجّه لمصادر حركة المرور بأي شيء عن حالة الموجّه أو عن الطريقة المتّبَعة لحدّ سرعة إرسال مصدرٍ معين للرزم، لكن لا يزال رتل FQ مصممًا لاستخدامه جنبًا إلى جنب مع آلية التحكم في الازدحام من طرفٍ إلى طرف، وهو يفصل ببساطة حركة المرور، بحيث لا تتداخل مصادر حركة المرور ذات السلوك السيئ مع أولئك الذين يطبقون بأمانة الخوارزمية من طرفٍ إلى طرف. يفرض رتل FQ أيضًا العدل بين مجموعة التدفقات التي تديرها خوارزميةٌ جيدة السلوك للتحكم في الازدحام. لا يزال هناك عددٌ متواضعٌ من التفاصيل التي يتعين عليك الحصول عليها بصورةٍ صحيحة. التعقيد الرئيسي هو أنه ليست الرزم التي تُعالَج على موجهٍ بالضرورة بنفس الطول، فمن الضروري مراعاة طول الرزمة لتخصيص حيز النطاق التراسلي للرابط الصادر بطريقةٍ عادلة؛ فإذا أدار الموجّه تدفقتين على سبيل المثال، أحدهما يحتوي على رزم بطول 1000 بايت والآخر رزم بطول 500 بايت (ربما بسبب التجزئة fragmentation الصاعدة من هذا الموجّه)، فإن تطبيق جولة روبن بسيطة للرزم من رتل كل تدفقٍ ستعطي التدفق الأول ثلثي حيز النطاق التراسلي للرابط، بينما يأخذ التدفق الثاني ثلث حيز النطاق التراسلي الخاص به فقط. ما نريده فعليًأ هو تطبيق جولة روبن على بتٍ تلو الآخر bit-by-bit round-robin، بحيث يرسل الموجّه بتًا من التدفق 1، ثم بتًا من التدفق 2، وهكذا. من الواضح أنه من غير المجدي تداخل البتات من رزمٍ مختلفة، لذلك تحاكي آلية رتل FQ هذا السلوك من خلال تحديد وقت انتهاء إرسال رزمةٍ معينة إذا أُرسِلت باستخدام آلية "جولة روبن على بتٍ تلو الآخر" ثم استخدام وقت الانتهاء هذا لتتابع رزم الإرسال. من أجل فهم خوارزمية تقريب "جولة روبن على بتٍ تلو الآخر"، افترِض سلوك تدفقٍ واحدٍ وتخيل ساعةً تدق مرةً واحدةً في كل مرةٍ يُرسَل فيها بتٌ واحد من جميع التدفقات النشطة (يكون التدفق نشطًا عندما يكون لديه بياناتٌ في الرتل)، وافترض أن يشير Pi إلى طول الرزمة i لهذا التدفق النشط، وSi إلى الوقت الذي يبدأ فيه الموجّه في إرسال الرزمة i، وFi إلى الوقت الذي ينتهي فيه الموجّه من إرسال الرزمة i، فإذا جرى الإعلان عن Pi من حيث عدد دقات الساعة اللازمة لإرسال الرزمة i (مع الأخذ بالحسبان أن الوقت يتقدم دقةً واحدةً في كل مرةٍ يحصل فيها هذا التدفق على قيمة 1 بت من الخدمة)، فمن السهل رؤية أن: Fi=Si+Pi ولكن لمعرفة متى نبدأ في إرسال الرزمة i، فلابد من التمييز بين ما إذا كان وصول الرزمة قد حصل قبل أو بعد انتهاء الموجه من إرسال الرزمة i-1 من هذا التدفق، فإذا وصلت قبلها، فمن المنطقي أن يُرسَل البت الأول من الرزمة i مباشرةً بعد آخر بت من الرزمة i-1؛ ومن ناحيةٍ أخرى، من المحتمل انتهاء الموجّه من إرسال الرزمة i-1 قبل وصول الرزمة i بوقتٍ طويل، مما يعني وجود فترةٍ من الوقت كان خلالها رتل هذا التدفق فارغًا، وبالتالي لم تتمكن آلية round-robin من إرسال أي رزمةٍ من هذا التدفق. وعلى افتراض أن Ai يشير إلى وقت وصول الرزمة إلى الموجّه، فعندئذٍ ستكون Si=max(Fi-1,Ai)، وبالتالي يمكننا حساب: Fi=max(Fi-1,Ai)+Pi ننتقل الآن إلى الحالة التي يوجد فيها أكثر من تدفقٍ واحد، ونجد أن هناك مشكلةً في تحديد Ai، حيث لا يمكننا قراءة ساعة الحائط فقط عند وصول الرزمة. وكما هو مذكور أعلاه؛ نريد وقتًا للتقدم بدَقةٍ واحدة في كل مرةٍ تحصل فيها جميع التدفقات النشطة على بتٍ واحد من الخدمة في إطار آلية "جولة روبن على بتٍ تلو الآخر"، لذلك سنحتاج إلى ساعةٍ تتقدم ببطء أكثر عندما يكون هناك المزيد من التدفقات، إذ يجب أن تتقدم الساعة بدَقةٍ واحدة عند إرسال n بت إذا كان هناك n من التدفقات النشطة، وستُستخدَم هذه الساعة لحساب Ai. نحسب الآن ومن أجل كل تدفقٍ Fi لكل رزمةٍ تصل باستخدام الصيغة أعلاه، ثم نتعامل مع كل Fi على أنه علامة زمنية timestamp، والرزمة التالية للإرسال هي دائمًا الرزمة التي تحتوي على أقل علامةٍ زمنية، أي الرزمة التي يجب أن تنتهي من الإرسال قبل جميع الرزم الأخرى. لاحظ أن هذا يعني أن الرزمة يمكن أن تصل إلى تدفقٍ، ويمكن حشرها في الرتل أمام رزمةٍ أطول منها لأنها أقصر من رزمة من تدفقٍ آخر موجود بالفعل في الرتل في انتظار الإرسال، ولكن هذا لا يعني أن الرزمة الواصلة حديثًا يمكنها منع الرزمة التي يجري إرسالها حاليًا. إن هذا النقص في إجراءات المنع، هو الذي يحفظ تطبيق رتل FQ الموصوف للتو من محاكاة مخطط آلية "جولة روبن على بتٍ تلو الآخر" الذي نحاول تقريبه. افترض المثال الوارد في الشكل السابق لمعرفة كيفية عمل هذا التطبيق للرتل العادل بصورةٍ أفضل، حيث يوضح القسم (أ) من الشكل السابق أرتالًا لتدفقين؛ وتختار الخوارزمية كلا الرزمتين من التدفق 1 لإرسالهما قبل الرزمة في رتل التدفق 2، بسبب أوقات الانتهاء المبكرة لهما؛ أما في القسم (ب) من الشكل السابق، فقد بدأ الموجّه في إرسال رزمةٍ من التدفق 2 عند وصول رزمةٍ من التدفق 1. لا يمنع التطبيق رزمة التدفق 2، على الرغم من أن الرزمة التي تصل على التدفق 1 كانت ستنتهي قبل التدفق 2 إذا كنا نستخدم رتلًا عادلًا مثاليًا على بتٍ تلو الآخر bit-by-bit fair queuing. هناك شيئان يجب ملاحظتهما حول الرتل العادل، أولها عدم ترك الرابط خاملًا أبدًا طالما أن هناك رزمةٌ واحدةً على الأقل في الرتل، ويُقال عن أي مخطط أرتال بهذه الخاصية أنه مُحافظ على العمل work conserving. أحد آثار الحفاظ على العمل هو أنه إذا شاركتَ رابطًا مع الكثير من التدفقات التي لا ترسل أي بياناتٍ بعد ذلك؛ فيمكنك استخدام سعة الرابط الكاملة للتدفق الخاص بك، وبمجرد أن تبدأ التدفقات الأخرى في الإرسال، فستبدأ في استخدام حصتها وستنخفض السعة المتاحة للتدفق الخاص بك. الشيء الثاني الواجب ملاحظته هو أنه إذا حُمِّل الرابط بالكامل مع وجود n تدفقٍ ترسل بيانات، فلا يمكنك استخدام أكثر من ‎1/n th من حيز النطاق التراسلي للرابط، وإذا حاولت إرسال أكثر من ذلك، فستُسنَد علاماتٌ زمنية كبيرة بصورةٍ متزايدة إلى رزمك، مما يتسبب في بقائها في الرتل لفترةٍ أطول في انتظار الإرسال. سيحدث طفحان للرتل في النهاية على الرغم من أن قرار إسقاط الرزم الخاصة بك أو بشخصٍ آخر لا تحدده حقيقة أننا نستخدم الرتل العادل، بينما يُحدَّد ذلك من خلال سياسة الإسقاط حيث أن FQ هي خوارزمية جدولة، وهي مثل FIFO يمكن دمجها مع سياسات إسقاط متنوعة. بما أن FQ يحافظ على العمل، فإن أي حيز نطاق تراسلي لا يستخدمه تدفقٌ هو حيز نطاقٍ تراسلي متاحٌ تلقائيًا للتدفقات الأخرى؛ وإذا كان لدينا أربعة تدفقات تمر عبر موجّه على سبيل المثال وكلهم يرسلون رزمًا، فسيستقبل كل تدفقٍ ربع حيز النطاق التراسلي، ولكن إذا كان تدفقٌ من هذه التدفقات خاملًا لفترةٍ طويلة بما يكفي لاستنزاف جميع رزمه من رتل الموجّه، فستتشارك التدفقات الثلاثة المتبقية حيز النطاق التراسلي المتاح، حيث سيتلقى كلٌ منها الآن ثلث حيز النطاق التراسلي. يمكننا التفكير في FQ على أنه يوفر حصةً دنيا مضمونةً من حيز النطاق التراسلي لكل تدفق، مع إمكانية الحصول على أكثر من ذلك إذا كانت التدفقات الأخرى لا تستخدم حصصها من حيز النطاق التراسلي. يمكن تطبيق شكلٍ مختلف من رتل FQ، يُسمى "الرتل العادل الموزون weighted fair queuing" أو اختصارًا WFQ، والذي يسمح بإسناد وزنٍ لكل تدفق (رتل). يحدِّد هذا الوزن منطقيًا عدد البتات الواجب إرسالها في كل مرةٍ تُرسَل فيها خدمات الموجّه في الرتل، ويتحكم هذا الوزن بفعالية في النسبة المئوية لحيز لنطاق التراسلي للرابط الذي سيحصل عليه التدفق، كما يمنح FQ البسيط كل رتلٍ وزنًا قدره 1، مما يعني أنه منطقيًا يُرسَل بتًا واحدًا فقط من كل رتلٍ في كل مرة، وينتج عن ذلك حصول كل تدفق على 1 / nth من حيز النطاق التراسلي عند وجود n تدفق، ولكن قد يكون لرتلٍ واحدٍ وزن 2 مع رتل WFQ، ولرتلٍ آخر وزن 1، ولرتلٍ ثالث وزن 3. وبفرض احتواء كل رتلٍ دائمًا على رزمةٍ تنتظر إرسالها، فسيحصل أول تدفقٍ على ثلث حيز النطاق التراسلي المتاح، والتدفق الثاني على سدس حيز النطاق التراسلي المتاح، وسيحصل التدفق الثالث على نصف حيز النطاق التراسلي المتاح. وصفنا آلية عمل WFQ من حيث التدفقات، ولكن يمكن تطبيقه على أصناف حركة المرور، حيث تُعرَّف هذه الأصناف بطريقةٍ أخرى مختلفةٍ عن التدفقات البسيطة، ويمكننا استخدام بعض البتات في ترويسة IP لتحديد الأصناف وتخصيص رتلٍ ووزنٍ لكل صنفٍ على سبيل المثال، وهذا هو بالضبط ما اُقترِح مثل جزءٍ من معمارية الخدمات المميزة التي ستُشرح لاحقًا. نلاحظ أنه يتوجب على الموجّه الذي يطبّق رتل WFQ تعلُّم الأوزان الواجب إسنادها لكل رتلٍ من مكانٍ ما، إما عن طريق الضبط اليدوي، أو عن طريق نوعٍ من إصدار الإشارات من المصادر، حيث سنتجه نحو نموذجٍ قائم على الحجز في الحالة الثانية، ويوفّر إسناد وزنٍ لرتلٍ شكلًا ضعيفًا من الحجز لأن هذه الأوزان مرتبطة بصورة غير مباشرة فقط بحيز النطاق التراسلي الذي يستقبله التدفق، كما يعتمد حيز النطاق التراسلي المتاح للتدفق أيضًا على عدد التدفقات الأخرى التي تتشارك بالرابط على سبيل المثال. سنبحث في قسمٍ لاحق كيفية استخدام رتل WFQ على أنه أحد مكونات آلية تخصيص الموارد القائمة على الحجز. أخيرًا، نلاحظ أن هذه المناقشة الكاملة لإدارة الأرتال توضح مبدأ تصميم نظام مهم يُعرف باسم فصل السياسة عن الآلية، حيث تتمثل الفكرة في عرض كل آليةٍ على أنها صندوقٌ أسود يوفر خدمةً متعددة الأوجه يمكن التحكم فيها بواسطة مجموعة من المقابض knobs، وتحدد السياسة إعدادًا معينًا لتلك المقابض ولكنها لا تعرِف أو تهتم بكيفية تنفيذ هذا الصندوق الأسود، كما تكون الآلية المعنية في هذه الحالة هي نظام الأرتال؛ أما السياسة فهي إعدادٌ معين لأي تدفقٍ يحصل على مستوى الخدمة مثل الأولوية أو الوزن. سنناقش بعض السياسات الممكن استخدامها مع رتل WFQ لاحقًا. ترجمة -وبتصرّف- للقسم Queuing Disciplines من فصل Congestion Control من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا المقال السابق: مشكلة تخصيص الموارد للتحكم في الازدحام في الشبكات الحاسوبية تقنية تبديل التسمية متعددة البروتوكولات MPLS في الشبكات الحاسوبية تطبيق مبدلات وموجهات الشبكات الحاسوبية برمجيا وعتاديا
  4. ربما استخدمت سابقًا أداة منحنى بيزيه Bezier Curve في برنامج سكريبوس Scribus لإنشاء بعض المنحنيات الجميلة، ولكن يُرجَّح أنك كنت مرتبكًا تمامًا ولم تتمكن من إنشاء أي شيء بخلاف بعض المنحنيات العشوائية. يُظهِر الشكل التالي محاولةً أولى في إنشاء دائرة باستخدام أداة منحنى بيزيه دون فهمها أولًا. إذا كانت محاولاتك لاستخدام هذه الأداة مشابهةً للشكل السابق، فهذا المقال يناسبك. الإعداد افتح برنامج سكريبوس وأنشئ مستندًا جديدًا (سيفي القياس A4 أو رسالة Letter بالاتجاه الرأسي بالغرض). يجب أولًا أن تُظهِر الشبكة وتفعّل خاصية اتباع الشبكة Grid Snapping -وهذا مهم لأنه سيسمح لك بإنشاء الأشكال بسهولة أكبر-، باتباع الآتي: اختر قائمة ملف File ثم إعداد المستند Document Setup. حدد قسم "الأدلة Guides" من القائمة. حدّد الخيار شبكة الصفحة Page Grid لإظهارها من تبويب الوضوح. اضبط تباعد الشبكة الرئيسية Major Grid Spacing على القيمة 100 نقطة. اضبط تباعد الشبكة الثانوية Minor Grid Spacing على القيمة 20 نقطة. اضغط على موافق. اختر قائمة صفحة Page ثم اتبع الشبكة Snap to Grid. إذا كان الخيار "اتبع الشبكة" محدَّدًا مسبقًا، فلا تحدده مرةً أخرى. يجب أن يبدو مستندك كالشكل التالي: إنشاء المنحنى الأول من الأشياء المهمة التي يجب معرفتها حول استخدام منحنيات بيزيه، أنه لا يمكنك إنشاء جميع الأشكال الممكنة دفعةً واحدة، إذ تتبع أداة منحنى بيزيه قواعدًا معينةً عند الرسم بها، لذلك يجب عدم تجربة إنشاء أشكال خيالية أو معقدة للغاية. سنتبع في هذا المقال بعض الاصطلاحات التي تسهّل توضيح ما عليك تطبيقه باستخدام الرسوم البيانية كما في الشكل التالي: تشير إشارة X الحمراء إلى النقطة التي تحتاج فيها إلى النقر بزر الفأرة الأيسر ثم تحريره (نقرة عادية فقط). يشير السهم الأزرق إلى أنه يجب عليك الضغط بزر الفأرة الأيسر على نهاية السهم عند النقطة، والاستمرار في الضغط على زر الفأرة، ثم سحب المؤشر حتى تصل إلى النهاية عند رأس السهم حيث يجب تحرير زر الفأرة بعد ذلك. يشير المربع الأصفر إلى أنه يجب النقر بزر الفأرة الأيمن لإنهاء رسم المنحنى، ولا يهم مكان مؤشر الفأرة عند النقر بزرها الأيمن. تمثل الأرقام الموجودة بجانب الأشكال الترتيب الذي يجب أن تطبّق به هذه الإجراءات. يمكنك إنشاء المنحنى الأول باستخدام الخطوات التالية الموضّحة في الشكل السابق: الإجراء الأول هو النقر على الزاوية اليسرى السفلية من المربع. ثم اسحب من أعلى اليمين إلى أعلى اليسار. ثم انقر بزر الفأرة الأيمن للانتهاء. يمكنك الآن تجربة الخطوات السابقة كما يلي: اختر قائمة إدراج Insert ثم منحنى بيزيه، أو يمكنك تحديد أداة منحنى بيزيه من شريط الأدوات. اتبع الإجراءات الموضّحة في الشكل السابق. يجب أن يكون لديك الآن قوس بسيط أو ربع دائرة مثل الشكل التالي: الشيء الذي طبّقته حتى الآن هو إخبار سكريبوس بمكان بدء رسم المنحنى (النقطة 1)، وبالمكان الذي سيمر المنحنى من خلاله (النقطة 2)، وتشير النقطة 3 إلى الطريقة التي تريد رسم المنحنى بها. يستخدم سكريبوس أثناء رسم المنحنيات أشياءً تسمى نقاط التحكم Control Points تخبره بكيفية تشكيل المنحنى، فنقطة التحكم الوحيدة في هذا المثال هي الموضع 3 (نهاية السحب). إنشاء منحنى كامل سترسم الآن منحنيًا كاملًا وستبدأ الأمور في أن تصبح أوضح قليلًا، وهنا اتبع الآتي: اختر قائمة إدراج ثم منحنى بيزيه، أو يمكنك تحديد أداة منحنى بيزيه من شريط الأدوات. اتبع الإجراءات الموضحة في الشكل التالي: يجب أن تنشأ لديك نصف دائرة مثل الشكل التالي: ربما لاحظت تحرّك "النهاية الحرة" للمنحنى مع مؤشر الفأرة مثل الخط المنقّط في الشكل الآتي، لأن سكريبوس يحاول باستمرار حساب المكان الذي يجب رسم الجزء الأخير من المنحنى فيه، كما أن المنحنى يتبع دائمًا بعض الاتجاهات المختارة مسبقًا بغض النظر عن المكان الذي حرّكتَ مؤشر الفأرة فيه، وسبب ذلك هو نقاط التحكم. انقر نقرًا مزدوجًا على نصف الدائرة الذي أنشأته للتو لتفتح نافذة محرر العقد Node Editor. يوضَح الشكل الآتي كيفية إنشاء منحنى نصف الدائرة، حيث يمكنك أن ترى في أسفل اليسار المكان الذي نقرت عليه لبدء المنحنى (مكان تواجد النقطة الزرقاء) والذي يُسمى عقدة Node، فالعقدة هي ببساطة نقطة يرسم سكريبوس منحنى من خلالها. يمكنك أيضًا أن ترى في الجزء العلوي مكان السحب من موضع إلى آخر، حيث أنشأت بداية السحب العقدة الثانية، كما أنشأت نهاية السحب نقطةً وردية اللون (النقطة A)، والتي تُسمَّى نقطة تحكم. تخبر نقاط التحكم سكريبوس بكيفية رسم المنحنى من خلال النقاط (العقد) الأخرى التي اخترتها. يمكنك رؤية العقدة الأخيرة في أسفل اليمين، ولكن هناك أيضًا نقطة تحكم وردية أخرى لم تنشئها (النقطة B)، وإنما أنشأها سكريبوس، وهي النقطة المضاعفة والمقابلة لنقطة التحكم الأولى. لقد أخبرتَ سكريبوس بمكان إنشاء نقطة التحكم الأولى عندما سحبت من النقطة 2 إلى النقطة 3، ولكنك أيضًا منحته -من خلال اتجاه السحب- اتجاهًا يعكس فيه نقطة التحكم الأولى عبر العقدة الثانية لإنشاء نقطة التحكم الثانية، وقد حدث هذا الانعكاس بزاوية قائمة على "الخط" الذي رسمته بالسحب من النقطة 2 إلى النقطة 3. لاحظ الخط المنقّط الأرجواني في الشكل التالي: يستغرق هذا المفهوم بعض الوقت للتعود عليه وأفضل طريقة لفهمه هي التدرب على رسم بعض المنحنيات مع السحب من النقطة 2 إلى النقطة 3 بزوايا مختلفة. حاول إنشاء مزيد من المنحنيات مع تغيير زاوية السحب، ثم افتح محرّر العقد لمعرفة مكان إنشاء نقاط التحكم، حيث يمكنك بعد ذلك تجربة بعض المنحنيات الأكثر تعقيدًا. أغلق نافذة محرّر العقد بالضغط على إنهاء التحرير أو على موافق عند الانتهاء. إنشاء دائرة كاملة اختر قائمة إدراج ثم منحنى بيزيه، أو حدد أداة منحنى بيزيه من شريط الأدوات. اتبع الإجراءات الموضّحة في الشكل التالي: يجب أن تحصل الآن على دائرة مشابهة للشكل التالي: لاحظ تغيير اتجاه المنحنى الثاني من خلال السحب في اتجاه مختلف في المرة الثانية، إذ يمكنك الذهاب في أي اتجاه تريده بمجرد الانتهاء من منحنى كامل. إنشاء موجة سنرسم هذه المرة خطًا متموجًا، وذلك باتباع الخطوات الآتية: اختر قائمة إدراج ثم منحنى بيزيه، أو حدّد أداة منحنى بيزيه من شريط الأدوات. اتبع الإجراءات الموضَّحة في الشكل التالي: يجب أن تحصل الآن على شكل يشبه الشكل التالي: لاحظ كيف يمكنك تغيير اتجاه المنحنى. إنشاء شكل الشبح اختر قائمة إدراج ثم منحنى بيزيه، أو حدّد أداة منحنى بيزيه من شريط الأدوات. اتبع الإجراءات الموضّحة في الشكل الآتي، أينما حذفنا الأرقام من أسفل الرسم البياني لمنع حدوث فوضى، ولكن يجب أن تكون قادرًا على تحديد الطريق الذي يجب أن تسلكه. يمكنك بعد ذلك إعطاء الشبح لون تعبئة، ورسم بعض العيون باستخدام الدوائر، وستحصل على شكل شبيه بالشكل الآتي (بؤبؤ العين عبارة عن نسخٍ أصغر من بياض العين). لا تقلق إن لم تتمكن من رسم الشبح بالكامل، فهذا ليس مهمًا حاليًا، لأن المهم هو معرفة كيفية رسم المنحنيات. يمكنك استخدام هذه التقنيات البسيطة جدًا التي تعلمتّها لصنع الأشكال بسهولة. إنشاء أشكال مفيدة يمكنك باستخدام منحنى بيزيه رسم دوائر، ولكن سكريبوس لديه أداة لرسم الدوائر فعليًا بحيث يمكنك رسم شبح بها، ولكن قد تتساءل عن فائدة رسم مثل هذه الأشكال عمليًا، فالأشكال التي رسمتها حتى الآن لا تُعَد مفيدةً جدًا، لكنها تُظهِر لك كيفية عملية الرسم. إذًا لنرسم الآن بعض الأشياء المفيدة. إنشاء مستطيلات ذات زوايا منحنية تُعَد المستطيلات ذات الزوايا المنحنية مفيدةً للغاية، ويمكنك إنشاؤها عن طريق رسم شكل مستطيل عادي واستخدام خاصية التدوير في سكريبوس (من تبويب شكل Shape في نافذة الخصائص Properties)، ولكن يمكنك أيضًا رسم منحنياتك الخاصة باستخدام منحنيات بيزيه. اختر قائمة إدراج Insert ثم منحنى بيزيه، أو حدد أداة منحنى بيزيه من شريط الأدوات. اتبع الإجراءات الموضّحة في الشكل التالي: يجب أن تحصل الآن على شكل يشبه الشكل التالي: لننشئ الآن أشكالًا أكثر تعقيدًا. إنشاء أشكال ذات زوايا منحنية يمكنك رسم أي شكل له زوايا منحنية تقريبًا باستخدام منحنيات بيزيه، وذلك باتباع الآتي: اختر قائمة إدراج ثم منحنى بيزيه، أو حدد أداة منحنى بيزيه من شريط الأدوات. اتبع الإجراءات الموضَّحة في الشكل الآتي، وابدأ من النقطة S (البداية)، ثم تحرّك باتجاه عقارب الساعة إلى النقطة E (النهاية) كما يلي: ثم يجب أن تحصل على الشكل التالي: تمرين حاول إنشاء الأشكال الموضَّحة في الشكل الآتي للمتعة فقط، إذ يمكنك إنشاء أي شكل تريده باستخدام منحنى بيزيه واحد والتقنيات الموضحة سابقًا. ترجمة -وبتصرّف- للمقال Bezier Curve Basics - Part 1 - Simple Geometric Shapes. اقرأ أيضًا خط الشبكة الأساسي Baseline Grid في برنامج سكريبوس كيف تعزل صورة وتنشئ مسار قطع Clipping Path لتدفق النص في سكريبوس كيفية إنشاء رمز RSS Feed في برنامج سكريبوس Scribus كيفية إنشاء التأثير Distressing Mask في برنامج سكريبوس لإنتاج تأثيرات تعبئة جذابة كيفية إنشاء الظلال في برنامج سكريبوس Scribus
  5. يُعَد تكرار العناصر الدقيق على الصفحة ميزةً مهمةً لكل تطبيق تخطيط أو رسم، حيث يمكن منه خلاله استخدام عملية نسخ ولصق بسيطة لتكرار كائن بصورة مستمرة، ولكن السماح للحاسوب بحساب موضع التكرارات يمكن أن يسهِّل الأمور ويوفِّر كثيرًا من الوقت. يقدِّم برنامج سكريبوس Scribus أداتين قويتين ومتعددتي الاستخدامات لإنشاء العناصر المنسوخة وتحديد موضعها، هما التكرار المتعدد Multiple Duplicate، والتحويل Transform، حيث تتشابه هاتان الميزتان تمامًا في بعض النواحي، ولكن تسمح كلٌّ منهما بطرق مختلفة قليلًا لإنشاء نسخ متعددة لبعض العناصر على صفحتك. التكرار المتعدد Multiple Duplicate يحتوي سكريبوس على عملية بسيطة هي عملية النسخ المطابق Duplicate، والتي يمكن الوصول إليها من قائمة عنصر Item ثم مضاعفة / تحويل، ثم نسخ مطابق Duplicate (أو الاختصارCtrl + D من لوحة المفاتيح)، حيث تعمل هذه العملية على إنشاء نسخة من الكائن المحدد، مع إزاحة مقدارها 10 نقاط في كل من الاتجاهين X وY، وإذا أردت تحديد شكل آخر من أشكال التموضع تلقائيًّا، فعليك استخدام عملية التكرار المتعدد Multiple Duplicate وإنشاء نسخة واحدة فقط. لقد كانت عملية التكرار المتعدد -التي يمكن الوصول إليها من قائمة عنصر ثم مضاعفة / تحويل، ثم نُسخ مطابقة Multiple Duplicate- قبل الإصدار 1.3.5 من سكريبوس؛ عمليةً بسيطةً لإنشاء نسخة واحدة أو أكثر من عنصر، مع وجود إزاحات X وY متتالية بين نسخة ونسخة أخرى. ولا يزال بإمكان هذه العملية العمل بهذه الطريقة، ولكننا سنلقي أولًا نظرةً على طريقة مفيدة أكثر، وهي عملية إنشاء صفوف وأعمدة، حيث لا تنشئ هذه العملية جدولًا، بل تنشئ مصفوفةً مكرَّرةً وبسيطةً من الكائن المحدد. يوضِّح الشكل التالي التبويب "بعدد الصفوف والأعمدة By Rows and Columns" في نافذة التكرار المتعدد: ستؤدي الإعدادات السابقة إلى النسخ المكررة في الشكل الآتي. ومن بين إحدى الميزات التي يجب علينا ملاحظتها؛ هي ميزة "الفجوة الأفقية Horizontal Gap" التي تشير إلى المسافات الرأسية بين الأعمدة. يوضِّح الشكل التالي التبويب الآخر من نافذة التكرار المتعدد، وهو تبويب "بعدد النسخ By Number of Copies": يعمل هذا الخيار بطريقة مشابهة جدًا لعملية التكرار المتعدد Multiple Duplicate في الإصدارات السابقة، ولكن نجد هنا خيارًا لإنشاء فجوة بين النسخ بدلًا من الإزاحة بمقدار معين -والذي لا يزال خيارًا متاحًا-، حيث ستنتج هذه الإعدادات أحد الصفوف التي تراها في المثال أعلاه. لاحظ أن 3 نسخ بالإضافة إلى النسخ الأصلية ستنُتِج لنا 4 أعمدة. يوجد أيضًا الخيار تدوير Rotation في الشكل السابق، وبالتالي يمكنك أيضًا إضافة بعض التدوير لكل نسخة من هذه النسخ المتكررة. يوضِّح الشكل التالي إنشاء 3 نسخ مع فجوة بمقدار 8 نقاط وتدوير بمقدار 10 درجات بين كل نسخة وأخرى: يُعَد الخط المنقط الموجود في الشكل السابق دليلًا أفقيًا يوضَع لإظهار أن محور الدوران هو حول النقطة الأساسية، وهي عندئذٍ زاوية الإطار اليسرى العليوية. لاحظ كيفية تدوير المحتوى مع الإطار. التحويل Transform أبسط استخدام لخيار التحويل، هو الذي يمكن الوصول إليه من قائمة عنصر ثم "مضاعفة / تحويل"، يليها تحويل Transform، وهو عملية تعديل كائن من خلال استخدام إحدى الطرق التالية: التحجيم Scaling. الترجمة Translation. التدوير Rotation. الانحراف Skewing. تشير "الترجمة Translation" إلى تحريك كائن يمينًا أو يسارًا، ولأعلى أو لأسفل في المستند. وتتوفَّر كل من هذه العمليات السابقة في مكان آخر في سكريبوس، لذلك لا يُعَد استخدام إحدى هذه العمليات فعَّالًا لتغيير كائن ما، وتكمن قيمة ميزة التحويل في أنه يمكنك إجراء هذه العمليات تسلسليًّا، كما يمكنك استخدامها لإنشاء نسخ متسلسلة من الكائن، وإجراء التعديلات في كل مرة بصورة تسلسلية أيضًا. يوضِّح الشكل التالي الخيارات المتعددة عند تحديد هذه العمليات: إن المجموعات المحتملة لهذه العمليات لا حصر لها، لذلك فإن التجربة ضرورية للتعرف على التأثيرات المختلفة لهذه المجموعات من العمليات. لنُلقي نظرةً على مثال بسيط، حيث نترجم فيه صورةً ثم ندوِّر كل نسخة بمقدار 10 درجات، إذ يشبه هذا المثال تجربة التكرار المتعدد أعلاه، ولكن النتيجة مختلفة تمامًا كما يلي: لقد بدأت العملية بالترجمة ثم التدوير، ولكن هنا كانت عملية الترجمة التالية على طول المحور الأفقي بعد التدوير للإطار رقم 2، ثم تكررت العملية مرةً أخرى. لاحظ أن الصورة لا تُدوَّر، حيث تحدث ظاهرة مماثلة مع إطار النص، إذ تبقى سطور النص محاذيةً للصفحة أفقيًّا، ولا تُدوَّر مع الإطار. ستجد أيضًا أن النتائج مختلفةً إذا أجريت التدوير أولًا ثم ترجمة الإطار، لذلك يُعَد ترتيب العمليات المختلفة مهمًّا. لقد طبَّقنا على المثال التالي إعدادات ترجمة بمقدار 140 نقطة، ثم تحجيم بمقدار 60%. لاحظ تصغير مقدار الترجمة مع كل نسخة بنسبة 60%، بغض النظر عن التحجيم التسلسلي المتوقع. لقد دمجنا في المثال البسيط التالي الذي يوضِّح تأثيرات الانحراف ترجمةً بمقدار 130 نقطة، مع انحراف أفقي بمقدار 5 درجات، وإذا طبَّقنا انحرافًا رأسيًّا أيضًا؛ فستنحرف معها الإطارات تسلسليًّا في اتجاه رأسي، وذلك على غرار ما رأيناه في عملية التدوير أعلاه. لقد بدأت جميع الأمثلة السابقة بصورةٍ ضمن إطار، وذلك مع تغيُّر حجمها ليناسب هذا الإطار، ولكن سيحدث شيء مختلف تمامًا إذا استخدمنا التحجيم الحر Free Scaling، حيث لا تُزاح الصورة، بل تكون نسخة الإطار الجديدة بمثابة تكملة للصورة، كما لو أن هذا الجزء منها موضوع هناك في الأصل، وبالتالي يجب ضبط تحجيم الصورة لتكون في كل نسخة جديدة. لذلك تعمل هذه العملية مثل لصق الصورة نفسها في عدة إطارات، وقد طبَّقنا في هذا المثال ترجمةً بمقدار 130 نقطة، ثم انحرافًا أفقيًّا ورأسيًّا بمقدار 5 درجات لكل منهما: يمكننا تجنُّب حسابات المحتوى هذه إذا استخدمنا عملية التحويل على شكل أو مضلع، حيث يتمثل أحد قيود التحويل في أنه لا توجد طريقة لتجربة الإعدادات مثل المعاينة، كما لا توجد طريقة لحفظ مجموعة من العمليات لاستخدامها لاحقًا، لذلك سينتهي الأمر بالمحاولة والخطأ، وهنا يجب إما تذكر الإعدادات أو تدوين ملاحظات بها لتجربة إعدادات مختلفة. يوضِّح الشكل التالي مثالًا عن سهم متحوِّل عرضه حوالي 41 نقطة، ومدوَّر بمقدار 30 درجة، ثم مُترجَم بمقدار 46 نقطة على 11 نسخة: إذ يضيف تدوير 11 نسخة بمقدار 30 نقطة ما يصل إلى 330 درجة، لذلك من المتوقع أن تملأ هذه النسخ دائرةً مثل الشكل السابق، كما قد تحتاج إلى التلاعب بالترجمة أو بالنقطة الأساسية بهدف الحصول على التأثير المطلوب. ترجمة -وبتصرُّف- للمقال Help:Manual Multiduplicatetransform. اقرأ أيضًا دليل موجز عن إنشاء النماذج Forms في سكريبوس Scribus كيفية وضع نص على مسار باستخدام برنامج سكريبوس Scribus أساسيات منحنى بيزيه Bezier Curve في سكريبوس خط الشبكة الأساسي Baseline Grid في برنامج سكريبوس
  6. قد نكون لديك في بعض الأحيان صورة تريد أن يتدفق النص حولها دون ظهور خلفية الصورة، ويمكنك تطبيق ذلك عن طريق عزل الصورة وإنشاء مسار قطع ليتدفق النص حولها في برنامج سكريبوس Scribus. يتكون هذا المقال من جزأين: يُطبَّق الجزء الأول في برنامج جيمب GIMP، ويطبَّق الجزء الثاني في برنامج سكريبوس سكريبوس. الجزء الأول على برنامج جيمب GIMP ستحتاج أولًا إلى صورة للعمل عليها، ويمكنك استخدام أي صورة تريدها تقريبًا، ولكن إذا أردت متابعة الخطوات معنا، فستحتاج إلى تنزيل الصورة الموضّحة في الشكل التالي (ستكون نسخة الصورة ذات القياس 1280x850 رائعة ولكن الخيار متروك لك): يجب أن يكون للصورة التي تختارها "تركيز" رئيسي واحد وأن تكون الخلفية "دون تفاصيل" نسبيًا، فكلما كانت الخلفية دون تفاصيل كثيرة، كلما كان عزل الصورة أسهل، كما يُعَدّ وجود الشعر والفراء في الصورة كابوسًا للعزل الصحيح الذي سيحتاج كثيرًا من الوقت. الخطوة أ: التحديد Selection حمّل الصورة في برنامج جيمب. ستطبّق الكثير من العمل الدقيق، لذلك يُفضَّل التكبير بمقدار 200% مثلًا. حدد "أداة التحديد الحر Free Select Tool" من لوحة الأدوات Toolbox (وهي تلك الأداة التي تشبه حبل رعاة البقر). تأكّد من وضع علامة على "التنعيم Antialiasing". تأكّد من تحديد "نعّم الحواف Feather edges" أيضًا واضبط "نصف القطر Radius" على القيمة 2. سيكون إعداد تحسين الحواف وتنعيمها السابق جيدًا مع معظم الصور، ولكن يمكنك تجربة استخدام إعدادات مختلفة. نريد عزل السيارة في الصورة السابقة من خلال تحديد السيارة دون تضمين الخلفية، من خلال رسم خط حول ما تريد عزله، وهنا عليك باتباع الخطوات الآتية: انقر في المكان الذي تريد أن تبدأ منه ثم استمر في النقر حول الشكل الذي تريد عزله عن الصورة كما في الشكل التالي: لا تحتاج في هذه المرحلة إلى أن تكون دقيقًا جدًا، إذ يمكنك الرجوع إلى الوراء وتغيير أي أخطاء طفيفة، حيث يؤدي الضغط على مفتاح Backspace من لوحة المفاتيح إلى التراجع عن آخر نقطة نقرت عليها، ولكن كلما استغرقت وقتًا أطول في التحديد الصحيح، كانت النتيجة أفضل. استخدم مسافات صغيرة بين النقرات عند المنحنيات، ولكن استخدم مسافات طويلة للحواف المستقيمة مثل الجانب السفلي من السيارة وأسفل الإطارات. هدفك الأساسي هو رسم خط باستخدام أداة التحديد حول الكائن الذي تريد عزله مع وجود قليل من الخلفية داخل التحديد كما في الشكل التالي: إن لم متأكدًا من مكان رسم خط التحديد، فارسم قليلًا داخل جزء الصورة الذي تحاول عزله بدلًا من الرسم خارجه. يمكنك جعل التحديد بسيطًا كما تريد، ولكنك سترى التأثير بصورة أفضل إذا أخذت الوقت الكافي لتحديد الكائن تحديدًا صحيحًا. الخطوة ب: العزل Isolation اختر قائمة تحديد Select ثم اعكس Invert بمجرد أن تحدّد صورتك وتكون راضٍ عنه. يؤدي ذلك إلى عكس التحديد، أي تصبح الخلفية هي المحدَّدة. حدد "أداة الملء بالدلو Bucket Fill Tool" من لوحة الأدوات (تشبه هذه الأداة الدلو). انتقل إلى عينات الألوان الموجودة أسفل الأدوات مباشرةً، وتأكّد من أن اللون الأبيض هو لون المقدمة كما في الشكل التالي (سنستخدم اللون الأبيض هنا لأن الصفحة التي ستضع الصورة عليها بيضاء): تأكد من وضع علامة على "لون ملء صدر الصورة FG color fill" (أسفل عينات الألوان). تأكد أيضًا من وضع علامة على "ملء التحديد الكامل Fill whole selection". حرّك المؤشر إلى خلفية الصورة ثم انقر عليها. وستُمحَى بذلك الخلفية كما في الشكل التالي: إن لم تكن راضيًا عمّا محوته، فتراجع عن ذلك وغيّر التحديد باستخدام أيٍّ من أدوات التحديد، وهنا اتبع الآتي: اختر قائمة تحديد Select ثم اعكس Invert لإعادة التحديد إلى الصورة بدلًا من الخلفية. اختر قائمة تحديد مرةً أخرى ثم مدّد التحديد Grow. أدخِل الحجم الذي تريد تمديد التحديد به (استخدم القيمة 32 بكسلًا، لأنك لا تريد أن يلمس النص الصورة ولكن يمكنك استخدام القيمة التي تريدها). يجب أن ترى الآن أن التحديد قد زاد وأن هناك "فراغًا" حول الصورة كما في الشكل التالي: الخطوة ج: التعديلات Adjustments ضع في بالك أن برنامج سكريبوس سيبذل قصارى جهده لملاءمة النص حول الصورة بأكثر الطرق فعاليةً، أي أنه سيحاول وضع النص حيثما استطاع بما في ذلك المناطق "المقّعرة" مثل المنطقة الموجودة أسفل السيارة. لذلك يجب إزالة هذه المناطق من خلال إضافة المزيد إلى التحديد. حدّد "أداة التحديد الحر Free Select Tool" من لوحة الأدوات مرةً أخرى. حدّد النمط "أضِف إلى التحديد الحالي Add to the current selection" في خيارات "التحديد الحر" تحت الأدوات. ارسم تحديدًا جديدًا ينتقل من أسفل إطار السيارة الخلفي إلى أسفل الإطار الأمامي، ثم إلى داخل التحديد الأصلي أسفل قوس العجلة الأمامية، ثم أسفل قوس العجلة الخلفية، ثم ارجع إلى نقطة البداية. ثم استخدم نفس الأسلوب لإزالة الفراغ من أسفل مقدمة السيارة مثل الشكل التالي: يجب الآن إنشاء مسار قطع للصورة حتى يتدفق النص حولها. يمكنك أيضًا في معظم الحالات التقليص من الحجم الكلي للصورة لإزالة كل المساحة البيضاء غير المطلوبة خارج التحديد، ولكنك لست بحاجة ذلك هنا. الخطوة د: مسار القطع Clipping Path اختر قائمة تحديد ثم إلى المسار To Path. سينشئ برنامج جيمب الآن مسار القطع وفقًا للتحديد، وقد يستغرق هذا بعض الوقت على الحواسيب البطيئة مع استخدام صورة ذات حجم كبير، كما سيظهر شريط الحالة في أسفل نافذة جيمب الرئيسية تقدّمه. ثم اختر قائمة ملف File ثم تصدير كـ Export As. اضبط نوع الملف على النوع TIFF، وأعطِ الملف اسمًا مناسبًا إذا أردت ذلك، ثم اضغط على الزر تصدير Export. اضبط أي خيارات ضغط تريدها أو اقبل الخيار الافتراضي، واضغط على زر تصدير Export مرةً أخرى، ويهذا تكون قد أصبحت لديك الآن صورة لها مسار. الجزء الثاني: على برنامج سكريبوس Scribus ضع الصورة في مستند مع بعض النص حولها. الخطوة أ: الصورة الأساسية انتقل إلى برنامج سكريبوس وافتح مستندًا جديدًا أو افتح مستندًا تريد وضع صورتك فيه. أنشئ إطار الصورة واجعله كبيرًا جدًا لتتمكّن من الحصول على الصورة بأكملها. انقر بزر الفأرة الأيمن على إطار الصورة واختر استيراد صورة Get Image. اختر صورة TIFF واضغط على زر موافق. قد تحتاج إلى تغيير حجم صورتك للحصول عليها بالطريقة التي تريدها داخل الإطار (نفّذ ذلك قبل المتابعة). الخطوة ب: النص أنشئ إطار نص فوق إطار الصورة، بحيث أن مكان وضعه متروك لك اعتمادًا على التأثير الذي تريد رؤيته، لكننا سنجعل إطار النص أكبر قليلًا من إطار الصورة لنتمكّن من رؤية التأثير. انقر بزر الفأرة الأيمن على إطار النص واختر نص نموذجي Sample text. يمكنك تحميل النص الخاص بك أو كتابته باستخدام المحرّر مثل المعتاد، ولكننا استخدمنا نصًا نموذجيًا لأغراض التوضيح. اضغط على زر موافق لإنشاء نص نموذجي. اذهب إلى تبويب نص Text في نافذة خصائص Properties (أو نافذة خصائص النص من قائمة نوافذ ثم خصائص المحتوى في الإصدار 1.5.7 من برنامج سكريبوس)، واجعل عدد الأعمدة 2 واجعل الفراغ Gap بينهما 20 نقطة من تبويب "الأعمدة وتباعد النص Columns and Text Distances". يجب كتابة النص على جميع أنحاء الصورة كما في الشكل التالي، ولكن هذا جيد حاليًا. انقر بزر الفأرة الأيمن على إطار النص واختر المستوى Level ثم أرسله للأسفل Lower to Bottom. يجب أن تكون الصورة فوق النص، ولكن هناك الكثير من المساحة البيضاء. الخطوة ج: استخدام مسار القطع يجب أن تخبر سكريبوس الآن باستخدام مسار القطع الذي أنشأته مسبقًا. انقر بزر الفأرة الأيمن على الصورة واختر خصائص الصورة الموسَّعة Extended Image Properties. اختر "التحديد Selection"، حيث يمكنك رؤية شكل المسار، ثم اضغط على الزر "موافق". يوجد الآن "حد Boundary" وهو الفراغ الذي أنشأته عن طريق "تمديد Growing" التحديد مسبقًا حول الصورة، ولكن النص لا يتدفق حولها. حدّد الخيار "التفاف النص حول مسار قصاصة الصورة Use Image Clip Path" في التبويب شكل Shape من نافذة خصائص Properties. وبهذا يكون قد تدفّقَ النص الآن حول الصورة كما هو الحال في الشكل التالي: الخلاصة هناك العديد من الطرق المختلفة التي يمكنك من خلالها إنشاء تحديد في برنامج جيمب قبل إنشاء مسار القطع وجميعها لها عيوبها ومزاياها اعتمادًا على التأثير الذي تحاول تحقيقه. جرّب "أداة التحديد الضبابي Fuzzy Select Tool" مع الصور التي تكون الخلفية فيها غالبًا لونًا واحدًا على سبيل المثال، لتعرف ما إذا كان بإمكانك إنشاء عكس التحديد - مثل التحديد الذي تحصل عليه في بداية الخطوة ب: التحديد - بنقرة واحدة فقط. ترجمة -وبتصرّف- للمقال How to Isolate an image and create a clipping path for text flow. اقرأ أيضًا كيفية رسم صندوق منظوري الشكل في برنامج سكريبوس Scribus كيفية إنشاء تأثير نص مخيف في برنامج سكريبوس Scribus كيفية إنشاء رمز RSS Feed في برنامج سكريبوس Scribus كيفية إنشاء رسوم من النمط Pop Art Explosion في برنامج سكريبوس Scribus كيفية التعامل مع محرر القصص Story Editor في برنامج سكريبوس Scribus
  7. لقد رأينا طبقاتٍ كافية من تسلسل بروتوكول الشبكة الهرمي لفهم كيفية نقل البيانات بين العمليات عبر الشبكات غير المتجانسة، وسننتقل الآن إلى مشكلةٍ تمتد على كامل مكدّس البروتوكولات، وهي كيفية تخصيص الموارد بفعاليةٍ وعدالةٍ بين مجموعةٍ من المستخدمين المتنافسين، حيث تشمل الموارد المشاركة حيّز نطاق الروابط التراسلي والمخازن المؤقتة على الموجّهات أو المبدّلات، إذ تُوضَع الرزم في رتلٍ في انتظار الإرسال. وتتنافس الرزم على موجّهٍ لاستخدام رابطٍ، حيث تُوضع كل رزمةٍ متنافسة في رتلٍ انتظارًا لدورها وإرسالها عبر الرابط. عند تنافس عدد كبير جدًا من الرزم على نفس الرابط يمتلئ الرتل ويحدث شيئان غير مرغوبٍ فيهما هما: تعرُّض الرزم لتأخير طرفٍ إلى طرف، وفي أسوأ الحالات يحدث طفحانًا للأرتال وإسقاطًا drop للرزم، ويُقال هنا أن الشبكة مزدحمة عندما يستمر حدوث الأرتال الطويلة ويصبح إسقاط الرزم أمرًا شائعًا، لذلك توفِّر معظم الشبكات آليةً للتحكم في الازدحام للتعامل مع مثل هذا الموقف. يُعَد التحكم في الازدحام وتخصيص الموارد وجهان لعملة واحدة، أي من الممكن تجنب الازدحام إذا لعبت الشبكة دورًا نشطًا في تخصيص الموارد مثل جدولة أي دارةٍ افتراضية يمكنها استخدام رابط فيزيائي معيّن خلال فترةٍ زمنيةٍ معينة، وهذا ما يجعل التحكم في الازدحام أمرًا غير ضروري. من الصعب تخصيص موارد الشبكة بدقة لأن الموارد المعنية موزعةٌ في جميع أنحاء الشبكة؛ وبالتالي يجب جدولة الروابط المتعددة التي تربط سلسلةً من الموجّهات. من جهةٍ أخرى، يمكن السماح دائمًا لمصادر الرزم بإرسال أكبر قدرٍ تريده من البيانات ثم التعافي من الازدحام في حالة حدوثه، وهذا هو النهج الأسهل رغم أنه قد يكون معطِّلًا، وذلك لأن الشبكة قد تتجاهل العديد من الرزم قبل أن يحدث التحكم في الازدحام. يكون الشعور بالحاجة إلى تخصيص الموارد بين المستخدمين المتنافسين شديدًا في الأوقات التي تكون فيها الشبكة مزدحمة، أي عندما تصبح الموارد قليلةً مقابل الطلب. هناك أيضًا حلول في الوسط، حيث تُتخَذ قرارات تخصيصٍ غير دقيقة، ولكن لا يزال من الممكن حدوث الازدحام، وبالتالي لا تزال هناك حاجة إلى آلية للتعافي منه، ولا يهم حقًا فيما إذا سُميت مثل تلك الحلول بحلول التحكم في الازدحام المختلطة أو تخصيص الموارد أو كليهما. يتضمن التحكم في الازدحام وتخصيص الموارد كلًا من المضيفين وعناصر الشبكة مثل الموجهات، ويمكن استخدام أنظمة أرتال مختلفة في عناصر الشبكة للتحكم بترتيب إرسال الرزم والتحكم في الرزم المُهمَلة dropped، وكذلك فصل حركة المرور لمنع رزم أحد المستخدمين من التأثير غير المناسب على رزم مستخدمٍ آخر؛ حيث تحدِّد آلية التحكم في الازدحام في المضيفين النهائيين مدى السرعة المسموح بها للمصادر بإرسال الرزم في محاولةٍ لمنع حدوث الازدحام في المقام الأول، وللمساعدة في القضاء على الازدحام في حالة حدوثه. سنبدأ بنظرة عامة على التحكم في الازدحام وتخصيص الموارد، ونناقش بعد ذلك مختلف أنظمة الأرتال الممكن تنفيذها على الموجّهات داخل الشبكة متبوعةً بوصف خوارزمية التحكم في الازدحام التي يوفرها بروتوكول TCP على المضيفين، بعدها سنكتشف العديد من التقنيات التي تتضمن كلًا من الموجهات والمضيفين، والتي تهدف إلى تجنب الازدحام قبل أن يصبح مشكلة، وفي الأخير سندرس المجال الواسع لجودة الخدمة. يجب الأخذ في الحسبان احتياجات التطبيقات لتلقي مستويات مختلفة من تخصيص الموارد في الشبكة مع وصف عددٍ من الطرق الممكن لتلك التطبيقات طلب هذه الموارد من خلالها وإمكانية تلبية الشبكة لها. مشاكل تخصيص الموارد يُعد تخصيص الموارد والتحكم في الازدحام من القضايا المعقدة التي كانت موضوع الكثير من الدراسات منذ تصميم الشبكة الأولى، ولا تزال ضمن مجالات بحث نشطة. أحد العوامل التي تجعل هذه القضايا معقدةً هو أنها ليست معزولةً بمستوى واحد من تسلسل البروتوكول الهرمي. يُطبَّق تخصيص الموارد جزئيًا في الموجّهات والمبدلات والروابط داخل الشبكة والجزء الآخر في بروتوكول النقل الذي يعمل على المضيفين النهائيين، وقد تستخدم الأنظمة الطرفية بروتوكولات إصدار الإشارات signalling لنقل متطلباتها من الموارد إلى عقد الشبكة التي تستجيب بمعلوماتٍ حول توفُّر الموارد. يتمثل أحد الأهداف الرئيسية لهذا الفصل في تحديد إطارٍ يمكن من خلاله فهم هذه الآليات، إلى جانب تقديم التفاصيل ذات الصلة حول عينة تمثيلية من الآليات. يجب توضيح مصطلحاتنا قبل المُضي قدمًا، حيث نعني بعملية تخصيص الموارد؛ العمليةَ التي تحاول من خلالها عناصر الشبكة تلبية المتطلبات المتنافسة التي تمتلكها التطبيقات لموارد الشبكة، مثل مساحة المخزن المؤقت وحيّز نطاق الرابط التراسلي في الموجّهات أو المبدلات. من الممكن عدم تلبية جميع المتطلبات في كثير من الأحيان، مما يعني أن بعض المستخدِمين أو التطبيقات قد تتلقى موارد شبكة أقل مما تريد، ويتمثل جزء من مشكلة تخصيص الموارد في تحديد متى يجب أن تقول لا ولمن. نستخدم مصطلح التحكم في الازدحام لوصف الجهود التي تبذلها عقد الشبكة لمنع حالات الحِمل الزائد أو الاستجابة لها. وبما أن الازدحام سيئٌ عمومًا للجميع، فلابُد من تخفيف الازدحام أو منعه في المقام الأول، ويمكن تحقيق ذلك ببساطة عن طريق إقناع عددٍ قليل من المضيفين بالتوقف عن الإرسال وبالتالي تحسين الوضع لأي شخصٍ آخر، ولكن من الشائع أكثر أن يكون لآليات التحكم في الازدحام بعض جوانب الإنصاف، حيث أنها تحاول مشاركة الألم بين جميع المستخدمين بدلًا من التسبب في ألم شديد لعدد قليل، وهكذا نرى أن العديد من آليات التحكم في الازدحام تحتوي على نوعٍ من تخصيص الموارد مضمَّنٌ فيها. من المهم أيضًا فهم الفرق بين التحكم في التدفق flow control والتحكم في الازدحام congestion control؛ حيث يتضمن التحكم في التدفق منع المرسل السريع من تجاوز مستقبِلٍ بطيء؛ بينما يهدف التحكم في الازدحام إلى منع مجموعةٍ من المرسلين من إرسال الكثير من البيانات إلى الشبكة بسبب نقص الموارد في مرحلةٍ ما، ويُخلَط غالبًا بين هذين المفهومين حيث يتشاركان أيضًا في بعض الآليات. نموذج الشبكة نبدأ بتحديد ثلاث سماتٍ بارزةٍ لمعمارية الشبكة، ولكن الجزء الأكبر من هذا القسم هو ملخصٌ للأفكار المقدَّمة في الفصول السابقة ذات الصلة بمشكلة تخصيص الموارد. شبكة تبديل الرزم سنفترض تخصيص الموارد في شبكة تبديل الرزم Packet-Switched Network (أو الإنترنت)، والتي تتكون من روابط ومبدلاتٍ (أو موجّهات) متعددة، كما سنستخدم مصطلح الموجّه طوال مناقشتنا نظرًا لأن معظم الآليات الموضحة في هذا الفصل مصمَّمة للاستخدام على شبكة الإنترنت، وبالتالي عُرِّفت في الأصل باستخدام الموجهات بدلًا من المبدلات، ولكن المشكلة هي نفسها سواءٌ كانت على شبكةٍ أو عبر شبكةٍ متشابكة internetwork مثل شبكة الإنترنت. قد يكون لمصدرٍ معين في مثل هذه البيئة سعةً كافيةً على الرابط الصادر المباشر لإرسال رزمة، ولكن تواجه الرزم رابطًا تستخدمه مصادرُ حركة مرور مختلفة في مكانٍ ما في منتصف الشبكة. يوضح الشكل الآتي هذا الموقف، فهناك رابطان عاليا السرعة يغذّيان رابطًا منخفض السرعة؛ وهذا على عكس شبكات الوصول المشترك مثل شبكة إيثرنت والشبكات اللاسلكية، حيث يمكن للمصدر مراقبة حركة المرور مباشرةً على الشبكة واتخاذ قرارٍ بإرسال رزمةٍ أم لا. لقد رأينا فعليًا الخوارزميات المستخدمة لتخصيص حيز النطاق التراسلي على شبكات الوصول المشترك مثل شبكات Ethernet وWi-Fi، حيث تُعَد خوارزميات التحكم في الوصول هذه مماثلة إلى حدٍ ما لخوارزميات التحكم في الازدحام في شبكة التبديل. لاحظ أن مشكلة التحكم في الازدحام مختلفة عن التوجيه، حيث يمكن أن يُسنَد للرابط المزدحم وزن حافةٍ كبير من خلال بروتوكول التوجيه، لذلك فإن الموجّهات ستسير حوله، ولكن لن يحل "التوجيه حول routing around" الرابط المزدحم مشكلة الازدحام. لا نحتاج إلى النظر لأبعد من الشبكة البسيطة الموضحة في الشكل الآتي لرؤية هذا، حيث يجب أن تتدفق كل حركة المرور عبر نفس الموجّه للوصول إلى الوجهة. قد يكون هذا مثالًا متطرفًا، إلا أنه من الشائع أن يكون لديك موجّهٌ معين لا يمكن التوجيه حوله، فربما يصبح هذا الموجه مزدحمًا، ولا يوجد شيءٌ يمكن أن تفعله آلية التوجيه حيال ذلك. يسمى هذا الموجه المزدحم أحيانًا "موجّه عنق الزجاجة bottleneck router". التدفقات عديمة الاتصال نفترض أن الشبكة عديمة الاتصال Connectionless بصورةٍ أساسية بالنسبة للكثير من مناقشتنا، ومع أية خدمة موجَّهةٍ بالاتصال، ومطبَّقةٍ في بروتوكول النقل الذي يعمل على المضيفين النهائيين. هذا هو بالضبط نموذج الإنترنت، حيث يوفِّر بروتوكول IP خدمة توصيل مخطط بيانات عديمة الاتصال ويطبّق بروتوكول TCP تجريد اتصال من طرفٍ إلى طرف مع الملاحظة أن هذا الافتراض لا ينطبق على شبكات الدارات الافتراضية مثل ATM وX.25، حيث تعبر في مثل هذه الشبكات رسالةُ إعداد الاتصال الشبكةَ عند إنشاء دارة، وتحتفظ رسالة الإعداد هذه بمجموعة من المخازن المؤقتة للاتصال في كل موجّه، مما يوفر شكلًا من أشكال التحكم في الازدحام، حيث يُنشَأ اتصالٌ فقط إذا كان من الممكن تخصيص مخازن مؤقتة كافية له في كل موجه، لكن يتمثل العيب الرئيسي في هذا النهج في أنه يؤدي إلى نقص استخدام الموارد، حيث لا تتوفر المخازن المؤقتة المحجوزة لدارة معينة للاستخدام من قِبل حركة المرور الأخرى، حتى لو لم تكن تستخدمها تلك الدارة حاليًا. ينصب التركيز في هذا الفصل على مناهج تخصيص الموارد التي تنطبق في شبكةٍ متشابكة، وبالتالي فإننا نركز بصورةٍ أساسية على الشبكات عديمة الاتصال. نحتاج إلى تعديل مصطلح "عديمة الاتصال" لأن تصنيفنا للشبكات على أنها إما عديمة الاتصال أو موجَّهة بالاتصال مقيدٌ للغاية؛ فهناك منطقةٌ رمادية بينهما. يُعَد الافتراض القائل بأن جميع مخططات البيانات مستقلة تمامًا في شبكةٍ عديمة الاتصال افتراضًا قويًا للغاية، حيث تُبدَّل بالتأكيد مخططات البيانات بصورةٍ مستقلة، ولكن عادةً ما يكون هناك تدفقٌ من مخططات البيانات بين زوجٍ معينٍ من المضيفين عبر مجموعة معينة من الموجّهات، كما أن فكرة عدِّ التدفق سلسلةً من الرزم المرسلة بين زوج المصدر / الوجهة، واتباع نفس المسار عبر الشبكة فكرةٌ مجردةٌ ومهمةٌ في سياق تخصيص الموارد وهي ماسنستخدمه في هذا الفصل. تتمثل إحدى قوى تجريد التدفق في إمكانية تحديد التدفقات بدرجاتٍ مختلفة، حيث يمكن مثلًا أن يكون التدفق من مضيفٍ إلى مضيف، أي لهما نفس عناوين مضيف المصدر / الوجهة، أو عمليةٍ إلى عملية أي لهما نفس أزواج المصدر / الوجهة المضيف / المنفذ. إن مصطلح التدفق في الحالة الثانية هو في الأساس نفس مصطلح القناة كما كنا نستخدمه في هذا الكتاب، وسبب تقديمنا لمصطلحٍ جديد هو أن التدفق مرئي للموجّهات داخل الشبكة، في حين أن القناة هي تجريد من طرفٍ إلى طرف. يوضح الشكل التالي عدة تدفقات تمر عبر سلسلةٍ من الموجّهات: بما أن العديد من الرزم ذات الصلة تتدفق عبر كل موجّه، فمن المنطقي في بعض الأحيان الاحتفاظ ببعض معلومات الحالة لكل تدفق، وهي المعلومات الممكن استخدامها لاتخاذ قرارات تخصيص الموارد حول الرزم التي تنتمي إلى التدفق، وتسمى هذه الحالة أحيانًا الحالة اللينة soft state، ويتمثل الاختلاف الرئيسي بين الحالة اللينة والحالة القاسية أو الصلبة hard state؛ في عدم الإلتزام دائمًا بإنشاء الحالة اللينة وإزالتها بصورةٍ صريحة عن طريق إصدار الإشارات، كما تمثّل الحالة اللينة أرضيةً وسطية بين شبكةٍ عديمة الاتصال بحتة لا تحتفظ بأية حالةٍ في الموجّهات والشبكة الموجَّهة بالاتصال البحت، والتي تحافظ على الحالة الصلبة في الموجّهات. لا تعتمد الإدارة الصحيحة للشبكة على وجود الحالة اللينة وتُوجَّه كل رزمة بصورةٍ صحيحة بغض النظر عن هذه الحالة، وسيكون الموجّه أكثر قدرةً على التعامل مع الرزمة عندما تنتمي هذه الرزمة إلى تدفقٍ يحتفظ فيه الموجّه حاليًا بالحالة اللينة. لاحظ أنه يمكن تحديد التدفق ضمنيًا أو بصورةٍ واضحة، حيث يراقب كل موجّهٍ في الحالة الأولى الرزمَ المنتقلة بين نفس زوج المصدر / الوجهة، عن طريق فحص العناوين الموجودة في الترويسة، ويتعامل مع هذه الرزم على أنها تنتمي إلى نفس التدفق بغرض التحكم في الازدحام، بينما يرسل المصدر في الحالة الثانية رسالة إعداد التدفق عبر الشبكة معلنًا أن تدفق الرزم على وشك البدء. يمكن القول أن التدفقات الصريحة explicit flows لا تختلف عن الاتصال عبر شبكةٍ موجهةٍ بالاتصال، ولكن لا بد من لفت الانتباه إلى هذه الحالة نظرًا لعدم تضمُّن التدفق أية دلالات من طرفٍ إلى طرف حتى عند تأسيسه بصورةٍ صريحة وعدم شموله للتسليم الموثوق والمرتّب لدارةٍ افتراضية، فهو موجودٌ ببساطة لغرض تخصيص الموارد. سنرى أمثلةً على التدفقات الضمنية والصريحة في هذا الفصل. نموذج الخدمة سنركز في القسم الأول من هذا الفصل على الآليات التي تفترض نموذج خدمة الإنترنت بأفضل جهد، والذي تُعامَل فيه جميع الرزم معاملةً متساويةً مع عدم إعطاء المضيف النهائي أية فرصة لمطالبة الشبكة بمنح بعض الرزم أو التدفقات ضماناتٍ معينة أو خدمة تفضيلية. وسيكون موضوع القسم اللاحق هو تحديد نموذج خدمة يدعم نوعًا من الخدمة أو الضمان المفضل، مثل ضمان حيز النطاق التراسلي المطلوب لبث الفيديو، ويقال أن نموذج الخدمة هذا يوفر جودة خدمةٍ QoS متعددة. هناك في الواقع مجموعةٌ من الاحتمالات تتراوح من نموذج خدمة أفضل جهد بحت إلى نموذجٍ تتلقى فيه التدفقات الفردية ضماناتٍ كميّة بجودة الخدمة، ويتمثل أحد أكبر التحديات في تحديد نموذج خدمةٍ يلبي احتياجات مجموعةٍ واسعة من التطبيقات حتى تلك التطبيقات التي ستُخترع في المستقبل. تصنيف آليات تخصيص الموارد هناك طرقٌ لا حصر لها تختلف فيها آليات تخصيص الموارد، لذا فإن إنشاء تصنيفٍ شامل هو اقتراحٌ صعب. نفسّر حاليًا ثلاثة أبعاد يمكن من خلالها وصف آليات تخصيص الموارد. التصنيف المتمحور حول الموجه مقابل التصنيف المتمحور حول المضيف يمكن تصنيف آليات تخصيص الموارد إلى مجموعتين كبيرتين: تلك التي تعالج المشكلة من داخل الشبكة أي في الموجهات أو المبدلات على سبيل المثال، وتلك التي تعالج المشكلة من حواف الشبكة، أي في المضيفين وربما داخل بروتوكول النقل، وذلك نظرًا لتشارُك الموجّهات داخل الشبكة والمضيفين على حواف الشبكة في تخصيص الموارد، فإن المشكلة الحقيقية تكمن في المكان الذي يقع فيه معظم العبء. في التصميم المتمحور حول الموجّه Router-Centric سيتحمل كل موجهٍ مسؤولية تحديد وقت إعادة توجيه الرزم واختيار الرزم التي ستُهمَل، وكذلك إعلام المضيفين الذين ينشئون حركة مرور الشبكة بعدد الرزم المسموح لهم بإرسالها؛ أما في التصميم المتمحور حول المضيف Host-Centric، فسيراقب المضيفون النهائيون ظروف الشبكة (عدد الرزم التي يحصلون عليها بنجاح عبر الشبكة على سبيل المثال) ويعدّلون سلوكهم وفقًا لذلك. نلاحظ أن هاتين المجموعتين ليستا متعارضتين، فعلى سبيل المثال لا تزال تتوقع الشبكة التي تضع العبء الأساسي في إدارة الازدحام على الموجّهات التزام المضيفون النهائيون بأية رسائل استشارية ترسلها الموجّهات، بينما لا تزال هناك سياسةٌ معينة مهما كانت بسيطة للموجهات في الشبكات التي تستخدم التحكم في الازدحام من طرفٍ إلى طرف لتحديد الرزم التي ستُهمَل عند طفحان الأرتال الخاصة بها. التصنيف القائم على الحجز مقابل التصنيف القائم على الاستجابة الراجعة الطريقة الثانية التي تُصنَّف بها آليات تخصيص الموارد في بعض الأحيان؛ هي وفقًا لاستخدامها الحجز Reservation أو الاستجابة الراجعة Feedback. وفي نظامٍ قائمٍ على الحجز، ستطلب بعض الكيانات مثل المضيف النهائي من الشبكة قدرًا معينًا من السعة لتخصيصها للتدفق، ثم يخصّص كل موجّهٍ بعد ذلك مواردًا كافية، أي مخازن مؤقتة و/ أو نسبةً من حيز نطاق الرابط التراسلي لتلبية هذا الطلب، وعند تعذُّر تلبية الطلب في موجهٍ ما لأن ذلك سيؤدي إلى الإفراط في الالتزام بموارده، فسيرفض هذا الموجّه الحجز، وهذا مشابه للحصول على إشارة مشغول عند محاولة إجراء مكالمة هاتفية؛ أما في النهج القائم على الاستجابة الراجعة، فيبدأ المضيفون النهائيون في إرسال البيانات دون حجز أي سعة أولًا، ثم يضبطون معدل الإرسال وفقًا للاستجابات الراجعة التي يتلقونها. قد تكون هذه الاستجابات الراجعة إما صريحةً مثل إرسال الموجّه المزدحم رسالة "الرجاء الإبطاء" إلى المضيف، أو ضمنيةً مثل ضبط المضيف النهائي معدل الإرسال وفقًا للسلوك الذي يمكن ملاحظته خارجيًا للشبكة مثل فقد رزمة. من المُلاحظ شمول النظام القائم على الحجز على آلية تخصيص مواردٍ تتمحور حول الموجّه دائمًا، وذلك لأن كل موجّهٍ مسؤول عن تتبُّع مقدار سعته المتاحة حاليًا، وتحديد ما إذا كان يمكنه قبول حجوزاتٍ جديدة. قد تضطر الموجهات أيضًا إلى التأكد من أن كل مضيفٍ مستقر داخل الحجز الذي أجراه، وإذا أرسل مضيفٌ البيانات بصورةٍ أسرع مما ادّعى عند إجراء الحجز؛ فستكون رزم هذا المضيف مرشحةً بصورةٍ أكبر للإهمال في حالة ازدحام الموجّه. قد يتضمن النظامُ القائم على الاستجابة الراجعة آليةً متمحورةً حول الموجّه أو حول المضيف، فإذا كانت الاستجابات صريحة، فيسشارك الموجّه إلى حدٍ ما على الأقل في مخطط تخصيص الموارد؛ أما إذا كانت الاستجابات ضمنيةً، فسيقع كل العبء تقريبًا على عاتق المضيف النهائي، حيث تُسقِط الموجّهات الرزم بصمتٍ عندما تصبح مزدحمة. لا يجب أن يجري المضيفون النهائيون الحجز، حيث يمكن لمسؤول الشبكة تخصيص موارد للتدفقات أو لمجموعاتٍ أكبر من حركة المرور كما سنرى لاحقًا. التصنيف القائم على أساس النافذة مقابل التصنيف القائم على المعدل الطريقة الثالثة لتوصيف آليات تخصيص الموارد هي وفقًا لاعتمادها على النافذة Window أو على المعدّل Rate. ويُعَد هذا التصنيف هو أحد المجالات المذكورة أعلاه، حيث تُستخدَم آليات ومصطلحات مماثلة للتحكم في التدفق والتحكم في الازدحام، وتحتاج كل من آليات التحكم في التدفق وتخصيص الموارد إلى وسيلةٍ للتعبير للمرسل عن مقدار البيانات المسموح له بإرسالها، وهناك طريقتان عامتان للتعبير عن ذلك من خلال نافذة أو معدل. لقد رأينا بروتوكولات نقل قائمةٍ على النوافذ مثل بروتوكول TCP، حيث يعلن المستقبِل عن نافذةٍ للمرسل، وتتوافق هذه النافذة مع مقدار مساحة المخزَن المؤقت التي يمتلكها المستقبِل، وتحدّ من مقدار البيانات التي يمكن للمرسل إرسالها؛ وهذا يعني أنه يدعم التحكم في التدفق يمكن استخدام آليةٍ مماثلة لإعلان النافذة داخل الشبكة لحجز مساحة المخزن المؤقت، وبالتالي دعم تخصيص الموارد، حيث تعتمد آليات التحكم في الازدحام في بروتوكول TCP على النافذة. من الممكن أيضًا التحكم في سلوك المرسل باستخدام المعدّل، أي عدد البتات في الثانية الممكن للمستقبل أو الشبكة استيعابها، إذ يُعَد التحكم المستند إلى المعدّل منطقيًا للعديد من تطبيقات الوسائط المتعددة التي تميل إلى إنشاء بياناتٍ بمعدّلٍ متوسط معين، والتي تحتاج على الأقل إلى حدٍ أدنى من الإنتاجية لتكون مفيدة، فقد يُنشِئ برنامج ترميز الفيديو على سبيل المثال فيديو بمعدلٍ متوسط يبلغ 1 ميجابت في الثانية، وبمعدّل ذروة يبلغ 2 ميجابت في الثانية؛ كما يُعَد توصيف التدفقات على أساس المعدل خيارًا منطقيًا في نظامٍ قائمٍ على الحجز ويدعم جودة خدمة مختلفة، حيث يحجز المرسل العديد من البتات في الثانية ويحدّد كل موجهٍ على طول المسار فيما إذا كان يمكنه دعم هذا المعدل من خلال النظر إلى التدفقات الأخرى التي تعهدَ بها. ملخص تصنيف تخصيص الموارد يوحي تصنيف طرق تخصيص الموارد في نقطتين مختلفتين على طول كلٍ من الأبعاد الثلاثة كما فعلنا للتو إلى مايصل لثماني استراتيجياتٍ فريدة. في حين أن هناك ثماني مقاربات مختلفة ممكنة بالتأكيد، إذ نلاحظ أنه من الناحية العملية أنه يبدو أن استراتيجيتين عامتين هما الأكثر انتشارًا، كما ترتبط هاتان الاستراتيجيتان بنموذج الخدمة الأساسي للشبكة. يفترض نموذج الخدمة عادةً أفضل جهد استخدام للاستجابات الراجعة ضمنيًا، وذلك نظرًا لعدم سماح هذا النموذج للمستخدمين بحجز سعة الشبكة، وهذا بدوره يعني أن معظم مسؤولية التحكم في الازدحام تقع على عاتق المضيفين النهائيين، ربما مع بعض المساعدة من الموجّهات. تستخدم هذه الشبكات عمليًا المعلوماتِ المستندة إلى النافذة، وهذه هي الإستراتيجية العامة المعتمدة في الإنترنت. من ناحيةٍ أخرى، قد يتضمن نموذج الخدمة القائم على جودة الخدمة شكلًا من أشكال الحجز، ومن المحتمل أن يتطلب دعم هذه الحجوزات مشاركةً كبيرة للموجّه، مثل وضع الرزم ضمن رتلٍ بطريقةٍ مختلفة اعتمادًا على مستوى الموارد المحجوزة التي تتطلبها، ويمكن التعبير عن هذه الحجوزات من حيث المعدل نظرًا لأن النوافذ مرتبطة بصورةٍ غير مباشرة فقط بكمية حيز النطاق التراسلي التي يحتاجها المستخدم من الشبكة. معايير تقييم آليات تخصيص الموارد المسألة الأخيرة هي معرفة ما إذا كانت آلية تخصيص الموارد جيدةً أم لا. بالعودة إلى بيان المشكلة المذكور في بداية هذا الفصل، فقد طُرح سؤال عن كيفية تخصيص الشبكة لمواردها بصورةٍ فعالة وعادلة، ويشير هذا السؤال إلى مقياسين واضحين على الأقل يمكن من خلالهما تقييم مخطط تخصيص الموارد. تخصيص الموارد الفعال تتمثل نقطة البداية لتقييم فعالية مخطط تخصيص الموارد بافتراض مقياسين رئيسيين للشبكات هما الإنتاجية، والتأخير، فمن الواضح أننا نريد أكبر قدرٍ ممكن من الإنتاجية وأقل تأخيرٍ ممكن، ولكن غالبًا ما تكون هذه الأهداف متعارضةً إلى حدٍ ما مع بعضها بعضًا. ومع ذلك فمن بين إحدى الطرق المؤكدة لزيادة إنتاجية خوارزمية تخصيص الموارد؛ السماح بأكبر عددٍ ممكن من الرزم في الشبكة، وذلك من أجل استخدام جميع الروابط حتى نسبة 100%، حيث نفعل هذا لتجنب احتمال أن يصبح الرابط خاملًا، وهذا يُضِّر بالإنتاجية، وتكمن مشكلة هذه الإستراتيجية في أن زيادة عدد الرزم في الشبكة يزيد أيضًا من طول الأرتال في كل موجّه، وتؤدي الأرتال الأطول بدورها إلى تأخير الرزم لفترةٍ أطول في الشبكة. اقترح بعضُ مصممي الشبكات استخدام نسبة الإنتاجية إلى التأخير مثل مقياس لتقييم فعالية مخطط تخصيص الموارد، ويشار إلى هذه النسبة أحيانًا باسم طاقة الشبكة: Power = Throughput / Delay نلاحظ أنه من غير الواضح بأن الطاقة هي المقياس الصحيح للحكم على فعالية تخصيص الموارد، وذلك لاستناد النظرية الكامنة وراء الطاقة إلى رتل شبكةٍ من النوع M / M / 1 الذي يفترض أرتالًا لا نهائية، حيث أن الشبكات الحقيقية لها مخازنٌ مؤقتة محدودة، وقد تضطر أحيانًا إلى إسقاط الرزم، وبما أن هذا الكتاب ليس كتابًا يشرح نظريات الأرتال، فسنقدّم فقط هذا الوصف الموجز لرتل M / M / 1، حيث 1 يعني أنه يحتوي على خادمٍ واحد، ويشير حرفا M إلى أن توزيع كلٍ من أوقات وصول الرزم والخدمة هو توزيعٌ أسي Markovian. ومن ناحيةٍ أخرى، تُعرَّف الطاقة عادةً بالنسبة إلى اتصالٍ واحد (تدفق) وليس واضحًا كيف تمتد إلى اتصالاتٍ متعددة متنافسة. على الرغم من هذه القيود الشديدة إلى حدٍ ما لكن لم تحظَ أي بدائل أخرى بقبولٍ واسعٍ، وبالتالي يستمر استخدام الطاقة. يُعَد الهدف هنا هو زيادة هذه النسبة إلى الحد الأقصى، وهي دالةٌ لمقدار الحِمل الذي تضعه على الشبكة، ويُضبَط الحِمل بواسطة آلية تخصيص الموارد، حيث يعطي الشكل الآتي منحنىً تمثيليًا للطاقة، إذ تعمل آلية تخصيص الموارد بصورةٍ مثالية في ذروة هذا المنحنى، وتكون الآلية معتدلةً ومستقرةً للغاية على يسار القمة؛ أي أنه لا يُسمَح بإرسال رزمٍ كافيةٍ لإبقاء الروابط مشغولة، ويُسمح بدخول العديد من الرزم إلى الشبكة إلى يمين القمة ويزداد التأخير بسبب الانتظار في الرتل الذي يبدأ بالاستحواذ على أي مكاسبٍ صغيرة في الإنتاجية. ومن المثير للاهتمام أن منحنى الطاقة هذا يشبه إلى حدٍ كبير منحنى إنتاجية النظام في نظام مشاركة الوقت في الحاسوب، حيث يتحسن معدل نقل النظام مع قبول المزيد من الوظائف في النظام حتى يصل إلى نقطةٍ يكون فيها الكثير من المهام قيد التشغيل، ويبدأ النظام بالتأزُّم thrash، حيث يقضي كل وقته في تبديل صفحات الذاكرة ويبدأ معدل النقل في الانخفاض. إن العديد من أنظمة التحكم في الازدحام قادرةٌ على التحكم في الحِمل بطرقٍ بدائية للغاية؛ أي أنه من غير الممكن ببساطة تشغيل "المقبض knob" قليلًا والسماح فقط بعددٍ صغيرٍ من الرزم الإضافية في الشبكة، لذلك يحتاج مصممو الشبكات إلى القلق بشأن ما يحدث حتى عندما يعمل النظام تحت عبءٍ ثقيلٍ للغاية أي في أقصى الطرف الأيمن من المنحنى في الشكل السابق. نود من الناحية المثالية تجنُّب الموقف الذي يذهب فيه معدّل نقل النظام إلى الصفر لأن النظام يتأزّم، ولكننا نريد باستخدام مصطلحات الشبكات نظامًا مستقرًا stable تستمر فيه الرزم بالمرور عبر الشبكة، حتى عندما تعمل الشبكة تحت عبءٍ ثقيل، وإذا كانت الآلية غير مستقرة؛ فقد تتعرض الشبكة إلىانهيار الازدحام congestion collapse. تخصيص الموارد العادل لا يُعَد الاستخدام الفعال لموارد الشبكة المعيار الوحيد للحكم على مخطط تخصيص الموارد، إذ يجب علينا أيضًا أن ننظر في مسألة العدل، ومع ذلك فإننا ندخل بسرعةٍ في وضعٍ غير مفهوم عندما نحاول تحديد ما يشكّل بالضبط تخصيصًا عادلًا للموارد، حيث يوفر مخطط تخصيص الموارد القائم على الحجز على سبيل المثال طريقةً واضحةً لخلق ظلمٍ خاضعٍ للسيطرة، وقد تُستخدم في مثل هذا المخطط حجوزاتٌ لتمكين تدفق فيديو من أخذ 1 ميجابت في الثانية عبر رابطٍ ما، بينما يأخذ نقل ملف 10 كيلو بت في الثانية فقط عبر نفس الرابط. في حال عدم وجود معلوماتٍ صريحة، فسنود أن يتلقى كل تدفقٍ حصةً متساويةً من حيز النطاق التراسلي عندما تتشارك عدة تدفقاتٍ رابطًا معينًا. يفترض هذا التعريف أن الحصة العادلة من حيز النطاق التراسلي تعني حصةً متساوية، ولكن قد لا تساوي الحصصُ المتساوية الحصصَ العادلة، حتى في حالة عدم وجود حجوزات. إذًا هل يجب أن ننظر أيضًا إلى طول المسارات التي يجري موازنتها؟ وما هو العدل على سبيل المثال عندما يتنافس تدفقٌ واحد مؤلف من أربع قفزات مع ثلاثة تدفقات ذات قفزةٍ واحدة كما هو موضح في الشكل التالي؟ بافتراض أن هذا العدل يعني المساواة وأن جميع المسارات متساوية الطول، فقد اقترح الباحث في مجال الشبكات "راج جاين" مقياسًا يمكن استخدامه لتحديد مدى عدالة آلية التحكم في الازدحام، حيث يُعرَّف مؤشر العدل لجاين على نحو أنه بافتراض مجموعةٍ من إنتاجيات التدفق التالية (x1, x2, …, xn) المُقاسة بوحدات ملائمة مثل بتات / ثانية؛ فستُسنِد الدالة التالية مؤشر العدل للتدفقات: ينتج عن مؤشر العدل دائمًا رقمٌ بين 0 و1، حيث يمثل 1 أكبر قدرٍ من العدل، ومن أجل فهم الحدس الكامن وراء هذا المقياس سنتأمل الحالة التي تتلقى فيها جميع التدفقات n إنتاجيةً قدرها 1 وحدة من البيانات في الثانية، ويكون مؤشر العدل في هذه الحالة هو: لنفترض الآن أن تدفقًا واحدًا يتلقى إنتاجيةً بقيمة 1 + Δ، فيكون مؤشر العدل هو: لاحظ أن المقام يزيد البسط بمقدار (n−1)Δ2، وبالتالي فإن مؤشر العدل قد انخفض الآن إلى ما دون 1 سواءً كان التدفق الفردي يزداد أو ينقص عن جميع التدفقات الأخرى (Δ موجبة أو سالبة). هناك حالةٌ بسيطة أخرى يجب مراعاتها حيث يتلقى عدد k فقط من n تدفق إنتاجيةً متساوية، ويتلقى n-k مستخدمًا متبقيًا إنتاجيةً صفرية، وفي هذه الحالة ينخفض مؤشر العدل إلى k / n. ترجمة -وبتصرّف- للقسم Issues in Resource Allocation من فصل Congestion Control من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا المقال السابق: النقل في الوقت الحقيقي باستخدام بروتوكول RTP في الشبكات الحاسوبية تأسيس الشبكات الحاسوبية والتعرف على تطبيقاتها كشف الأخطاء على مستوى البت في الشبكات الحاسوبية
  8. سنوضّح في هذا المقال فوائد استخدام خط شبكة سكريبوس الأساسي الذي يُستخدَم للتأكد من صحة محاذاة سطور النص في الصفحة بين إطارات النصوص، وإذا أردت إنشاء مستندات ذات مظهر احترافي، فستحتاج إلى معرفة كيفية استخدام خط الشبكة الأساسي، فهو جزء أساسي ومهم جدًا من سكريبوس، لذلك يستحق التعلّم. سنوضّح أيضًا كيفية استخدام بعض العمليات المفيدة الأخرى، لذلك إن كنت جديدًا على سكريبوس، فهذا المقال جيد لك لأننا سنشرح كل شيء ببطء شديد وبعناية. الإعداد افتح برنامج سكريبوس، وأنشئ صفحةً جديدةً موجَّهةً رأسيًا (سيكون القياس A4 أو Leaflet جيدًا)، حيث يُفضَّل عرض المستند من منظور بعيد حاليًا لتتمكّن من رؤيته كاملًا من قائمة عرض View ثم تقريب ثم 50%. يجب الآن إضافة بعض الإطارات، لهذا ارسم هذه الإطارات داخل الهوامش مع ترك مسافة صغيرة بينها. لا تقلق بشأن جعل هذه الإطارات مصطفةً بصورة صحيحة، فهذا قد يساعدك أكثر إذا تعمّدت جعل الإطارات سيئة المحاذاة، لترى ما يحدث بعد إصلاح كل شيء. بعد هذا اتبع الخطوات الآتية: اختر قائمة إدراج Insert ثم إطار نص Text Frame. ارسم الإطار بالقرب من أعلى يسار الصفحة إلى الأسفل بالقرب من منتصف الجزء السفلي من الصفحة. اختر قائمة إدراج ثم إطار صورة Image Frame. ارسم الإطار من الجانب العلوي الأيمن على يمين إطار النص الأول إلى الأسفل في منتصف الجانب الأيمن من الصفحة. اختر قائمة إدراج ثم إطار نص مرةً أخرى. ارسم الإطار في المساحة المتبقية من الإطارين السابقين. يجب أن يكون لديك الآن شيء يشبه الشكل التالي: النص الأولي حدّد إطار النص الأيسر. انقر بزر الفأرة الأيمن واختر "نص نموذجي Sample Text" من القائمة لفتح نافذة Lorem Ipsum. مرّر إلى أسفل قائمة اللغات وحدّد "لوريم إيبسوم قياسي Standard Lorem Ipsum". ثم اضغط على موافق، وهنا يجب أن يُملأ الآن إطار النص الأول بنص لاتيني لا معنى له. حدّد إطار النص الأول، واختر القائمة عنصر Item ثم "صِل إطارات النص"، بعد ذلك "ربط إطارات النصوص Link Text Frames. حدّد إطار النص الآخر، وبالتالي سيستمر النص في إطار النص الثاني. الصورة الأولية يمكنك استخدام أي صورة تريدها، فالصورة موضوعة فقط مثل شيء يعترض طريق النص حتى تتمكن من رؤية كيفية عمل خط الشبكة الأساسي. يمكنك تنزيل الصورة التي سنستخدمها، بعدها اتبع الآتي: حدّد إطار الصورة. انقر بزر الفأرة الأيمن واختر استيراد صورة Get Image من القائمة. حدد موقع الصورة التي تريد استخدامها ثم اضغط موافق. انقر بزر الفأرة الأيمن واختر اضبط الصورة إلى الإطار Adjust Image to Frame من القائمة. يجب أن تبدو صفحتك الآن مثل الشكل الآتي. لا تقلق من عدم محاذاة الأشياء بصورة صحيحة، أو إن لم تملأ الصورة إطارها، فهذا ليس مهمًا الآن. اختبر عملك اختر قائمة عرض ثم تقريب، ثم 200% لتقريب الصفحة. مرّر الصفحة حسب الحاجة لتنظر إلى وسطها. إذا نظرت إلى سطور النص في الإطار الأيسر ووازنتها مع سطور النص في إطار النص الآخر، فستلاحظ أن أسفل الأحرف متوضّعة على ارتفاعات مختلفة من الصفحة كما في الشكل الآتي، حيث لا تصطف الأحرف الموجودة على اليسار -على الخط الأزرق المنقط- مع الأحرف الموجودة على اليمين على الخط الأرجواني. وكما يظهر بالصورة؛ سيبدو هذا فوضويًا، (جرب مستويات تكبير مختلفة من قائمة عرض، لإلقاء نظرة على النص بتكبيرات مختلفة)، ولكن يمكنك إصلاحه متبعًا الآتي: حدّد إطار النص السفلي الأيمن واستخدم مفاتيح لوحة المفاتيح للأعلى وللأسفل لتحريك الإطار. حاول أن تجعل الأجزاء السفلية من سطور النص تحاذي نفس الارتفاع على الصفحة بين إطاري النص. تستغرق هذه العملية وقتًا طويلًا للغاية، وإذا كان عليك أن تنفّذ الشيء نفسه على صفحات متعددة مع عدة إطارات نصية في كل منها، فستشعر بالإحباط الشديد، لكن لا تخف من ذلك، فالحل متمثّل باستخدام خط الشبكة الأساسي. اختر قائمة عرض ثم تقريب ثم 50% للتبعيد. ترتيب كل شيء يجب عليك إنشاء بعض الأنماط Styles قبل أن تبدأ بخط الشبكة الأساسي. يُعَد إعداد الأنماط أمرًا سهلًا، وتتيح لك الأنماط الآتية إجراء التغييرات لاحقًا بسهولة أكبر. نمط الحروف Character Style اختر قائمة تحرير Edit ثم أنماط Styles لفتح نافذة مدير الأنماط Style Manager. اسحب النافذة إلى يسار الشاشة، وإن لم تكن موجودةً هناك بالفعل فسيسهل هذا عليك استخدامها لأنها تكبر عند استخدامها اعتمادًا على ما تفعله. اضغط على زر جديد New واختر نمط الحروف Character Style من القائمة. قد تبدو النافذة الآن معقدةً بعض الشيء -خاصةً إن لم تستخدمها سابقًا-، ولكنها ستصبح أسهل عند استخدامك المتكرر لها . أدخِل النص "Body" (بدون علامات الاقتباس) ليكون اسمًا لنمط الحروف في الجزء العلوي من النافذة. اضغط على زر تطبيق Apply. يمكنك الآن رؤية نمط الحروف الجديد في القائمة ضمن أنماط الحروف. نهتم في هذا المقال فقط بشبكة الخط الأساسي، لذلك اقبل في هذه الحالة الخيارات الافتراضية دون تغيير، لكنك قد تحتاج إلى تغيير مزيد من الأشياء عند إنشاء أنماطك الخاصة. نمط الفقرة Paragraph Style اضغط على الزر جديد New مرةً أخرى واختر نمط الفقرة Paragraph Style من القائمة. أدخِل النص "Body" (بدون علامات الاقتباس) مثل اسم لنمط الفقرة. انقر على تبويب "نمط الحروف Character Style" أسفل حقل الاسم، حيث سنربط نمط الحروف الذي أنشأناه مسبقًا بنمط الفقرة. اضغط على زر القائمة "بناءً على Based On" واختر "Body" من القائمة، بذلك تكون قد أخبرت نمط الفقرة "Body" باستخدام نمط الحروف "Body"، وستطبَّق أي تغييرات على نمط الحروف "Body" تلقائيًا على أي نص باستخدام نمط الفقرة "Body". انقر على تبويب "خصائص Properties" أسفل حقل الاسم. اضغط على القائمة التي قد يكون اسمها حاليًا "تباعد أسطر ثابت Fixed Linespacing" تحت العنوان "المحاذاة والمسافات Distances and Alignment". اختر حاذِ لخط الشبكة الأساسي Align to Baseline Grid من القائمة. اضغط على زر "تطبيق Apply" في الجزء السفلي من النافذة. يمكنك الآن رؤية نمط الفقرة الجديد في القائمة ضمن أنماط الفقرة، وهنا اضغط إما على الزر اكتمل Done لتصغير النافذة، أو أغلقها تمامًا -فالأمر متروك لك هنا-، ثم يجب تطبيق الأنماط الجديدة على النص. التطبيق حدّد إطار النص الأيسر. افتح التبويب "إعدادات النمط Style Settings" في تبويب نص Text من نافذة خصائص، أو من نافذة خصائص النص في الإصدار 1.5.7 من برنامج سكريبوس. حدّد النمط "Body" بدلًا من بلا نمط No Style أو نمط فقرة افتراضي من قائمة نمط الفقرة Paragraph Style. لاحظ كيف تحرَّك النص قليلًا، لأنه يستخدم حاليًا خط الشبكة الأساسي كما هو محدّد في نمط الفقرة "Body". لا يمكنك رؤية خط الشبكة الأساسي حاليًا، ولكن لا تقلق، فليس جعله مرئيًا أمرًا صعبًا. اختر قائمة ملف File ثم إعداد المستند Document Setup. حدد "الأدلة Guides" من القائمة. انتقل إلى تبويب الوضوح ثم حدّد مربع اختيار إظهار خط الشبكة الأساسي. اضغط موافق. يجب أن تبدو صفحتك الآن مثل الشكل التالي، حيث تمثّل هذه الخطوط الرمادية خط الشبكة الأساسي. اختر قائمة عرض ثم تقريب ثم 200% لتقريب الصفحة مرةً أخرى. مرّر الصفحة حسب الحاجة حتى تصل إلى وسطها. يمكنك الآن أن ترى أن سطور النص في إطار النص الأيسر موجودة في المواضع الرأسية نفسها لسطور النص في إطار النص الآخر كما في الشكل الآتي، ويتواجد الجزء السفلي من الحروف على خطوط الشبكة الأساسية، أي يستند أساس الحروف على هذه الخطوط، لذلك سًمِّي بخط الشبكة الأساسي. بهذا إذًا تكون قد جرت محاذاة النص، ولنجرّب الآن ما يلي: حدّد إطار النص السفلي الأيمن. استخدم مفتاح المؤشر للأعلى من لوحة المفاتيح لتحريك موضع إطار النص. استمر في الضغط حتى ترى النص يتحرك لأعلى. لاحظ بقاء النص في مكانه أثناء تحريك إطار النص للأعلى إلى أن وصلت إلى نقطة معينة عندما تحرّك النص إلى الخط الأساسي الذي فوقه، والسبب في ذلك هو محاولة برنامج سكريبوس -عند استخدام خط الشبكة الأساسي- رسم النص على طول الخط الأساسي الأول الموجود خلف إطار النص، وإن لم تكن هناك مساحة كافية لرسم هذا السطر من النص (إذا كانت الأحرف عالية جدًا مثلًا)، فسينتقل سكريبوس إلى الخط الأساسي التالي ويبدأ في رسم النص هناك. يطبّق سكريبوس كل العمل للتأكد من محاذاة النص عبر إطارات النص دون الحاجة إلى إجراء أي تعديلات يدوية، عندما تستخدم خط الشبكة الأساسي، حيث يجب عليك -عند عدم استخدام خط الشبكة الأساسي- تحريك إطارات النص لأعلى ولأسفل حتى تصطف مع بعضها البعض كما فعلت سابقًا، وهذا أمر صعب جدًا. تغيير حجم الخط لنجرّب الآن أن نصغّر حجم النص، وذلك باتباع الخطوات الآتية: اختر قائمة عرض View ثم تقريب ثم 100% لتتمكّن من رؤية قدر مناسب من النص. اختر قائمة تحرير Edit ثم أنماط Styles لإعادة فتح نافذة "مدير الأنماط" مرةً أخرى. حدد نمط الحروف "Body". اضغط على زر تحرير Edit لتحرير النمط. غيّر حجم الخط ليكون أصغر قليلًا (غيّره من 12 نقطة إلى 10 نقاط مثلًا). اضغط على زر تطبيق Apply ثم على زر اكتمل Done. سترى الآن أن النص أصغر ولكنه لا يزال محاذيًا لخط الشبكة الأساسي. لذلك إذا أجريت تغييرًا كبيرًا على تنسيق النص، فإن خط الشبكة الأساسي يحافظ على محاذاة كل شيء بصورة جيدة. لكن إذا اعتقدت أن المسافة بين السطور كبيرة جدًا الآن، فيمكنك إصلاح ذلك بسهولة باتباع الآتي: اختر قائمة ملف ثم إعداد المستند. حدّد قسم "الأدلة" من القائمة. اضبط حجم الشبكة أو تباعد خط الشبكة الأساسي ليكون أصغر (غيّره من 14 نقطة إلى 12 نقطة مثلًا) من تبويب الموضع. اضغط على الزر تطبيق ثم موافق. بهذا تكون قد أصبحت المسافة بين السطور أصغر مع بقاء محاذاة سطور النص، وبما أنك تستخدم خط الشبكة الأساسي والأنماط؛ فكل ما عليك فعله لتقليل حجم النص هو إجراء تغيير طفيف مرةً واحدةً في النمط، ثم تغيير حجم الشبكة فقط. يمكنك أيضًا تكبير النص من خلال تطبيق الخطوات السابقة نفسها ولكن زِد القيم بدلًا من أن تنقصها. إزاحة الخط الأساسي أحيانًا، لا يكون موضع خط الشبكة الأساسي مناسبًا تمامًا لما تريده بسبب تخطيط أو تصميم صفحتك، فقد تبدأ سطور النص مرتفعةً أو منخفضةً جدًا في الصفحة. لهذا فإذا واجهتك هذه المشكلة، فجرّب الخطوات التالية: اختر قائمة ملف ثم إعداد المستند. حدد قسم "الأدلة" من القائمة. غيّر قيمة إزاحة خط الشبكة الأساسي Offset من تبويب الموضع، وهذه هي المسافة من أعلى الصفحة التي سيبدأ سكريبوس خط الشبكة الأساسي منها. اضغط على زر تطبيق ثم موافق لرؤية التغيير المطبَّق. لاحظ أن هناك فراغًا في أعلى الصفحة قبل أن يبدأ خط الشبكة الأساسي. الخلاصة قد يتطلب ذلك كثيرًا من العمل، ولكن خط الشبكة الأساسي جزء مهم جدًا من تصميم الصفحة الجيد، لهذا يجب أن تأخذ الوقت الكافي للتعرف عليه والتعود على استخدامه، إذ ستوفر كثيرًا من الوقت لاحقًا وستكون منشوراتك أفضل بكثير بسببه. ترجمة -وبتصرّف- للمقال Baseline Grid Explained. اقرأ أيضًا كيفية إنشاء رمز RSS Feed في برنامج سكريبوس Scribus كيفية إنشاء التأثير Distressing Mask في برنامج سكريبوس لإنتاج تأثيرات تعبئة جذابة كيفية إنشاء الظلال في برنامج سكريبوس Scribus كيفية التعامل مع محرر القصص Story Editor في برنامج سكريبوس Scribus الطريقة الأساسية لترقيم العناصر تسلسليا في برنامج سكريبوس Scribus
  9. سنوضح في هذا المقال كيفية إنشاء صندوق بسيط منظوريّ الشكل بخطوات سهلة توضّح لك كيفية البدء. التقنيات المحددة المستخدمة إنشاء وعرض الشبكة Grid. إنشاء أشكال بسيطة. إنشاء خطوط بيزيه Bezier. تحويل خطوط بيزيه إلى مضلعات. قص المضلعات باستخدام خطوط بيزية. تحرير بسيط للعقد. استخدام عملية المسار Path Operation لإنشاء شكل جديد. تغيير تنسيق الشكل. هذا المقال مناسب للمبتدئين، لذلك إن كان بإمكانك التنقّل بين نوافذ سكريبوس الأساسية، فستستطيع اتباع الخطوات السابقة جميعها. الإعداد افتح برنامج سكريبوس وأنشئ مستندًا جديدًا (سيكون القياس A4 أو الرسالة Letter في أي اتجاه جيدًا ولكن الاتجاه الأفقي سيمنحك مساحة أكبر). الشبكة Grid يجب أولًا إنشاء شبكة، لأنها ستسهّل عليك رسم الصندوق، بعد ذلك اتبع الآتي: اختر قائمة ملف File ثم إعداد المستند Document Setup. انتقل إلى قسم "الأدلة Guides" ثم انتقل إلى تبويب الوضوح. فعّل الخيار عرض شبكة الصفحة Display Grid. انتقل إلى تبويب الموضع، ثم اضبط تباعد "الشبكة الرئيسية Major Grid" على 64 نقطة، وتباعد "الشبكة الثانوية Minor Grid" على 8 نقاط (سيفي أي تباعد في الشبكة بالغرض، ولكن يمنحك هذا الإعداد قدرًا جيدًا من التفاصيل). اضغط على تطبيق ثم موافق. اختر قائمة صفحة Page ثم اتبع الشبكة Snap to Grid. نقاط التلاشي Vanishing Points يجب الآن رسم ثلاث نقاط تلاشٍ vanishing points أو اختصارًا VPs، حيث يجب أن تكون أول نقطتي تلاشٍ على "الخط الأفقي"، وستمتد فيه خطوط المنظور الخاصة بك إذا كان الصندوق بحجم لانهائي، كما يجب أن تكون نقطة التلاشي الثالثة أسفل مجال رؤيتك. لا تقلق إذا كان كل هذا يبدو معقدًا، فسيصبح الأمر أوضح عند بدء الرسم. بعد كل هذا اتبع الخطوات الآتية: اختر نقطةً على الشبكة بالقرب من أعلى يسار الصفحة، حيث يُفضَّل استخدام نقطة تتقاطع فيها خطوط تباعد الشبكة الرئيسية، ثم استخدم قائمة إدراج Insert، ثم شكل Insert Shape، ثم أشكال افتراضية Default Shapes، ثم دائرة Circle لرسم دائرة صغيرة حول تلك النقطة. كرّر الشيء نفسه في أعلى يمين صفحتك في الموضع الرأسي نفسه للدائرة الأولى، وبذلك أنشأنا نقطتي تلاشٍ على الخط الأفقي. اختر نقطةً جديدةً أسفل الخط الأفقي وعلى مسافة متساوية بين أول نقطي تلاشٍ، وارسم دائرةً أخرى حولها (ضع هذه النقطة الثالثة على بُعد ثلاثة أو أربعة تباعدات شبكية رئيسية تحت النقطتين السابقتين). يجب أن تكون لديك الآن ثلاث نقاط تلاشٍ كما في الشكل التالي: وجه الصندوق الأيسر يجب التأكد من أنك تستخدم أداة منحنى بيزيه Bezier Curve وليس أداة الخط Line، حيث يؤدي رسم الخطوط باستخدام أداة منحنى بيزيه إلى إنشاء خطوط يعاملها برنامج سكريبوس بطريقة مختلفة قليلًا عن الخطوط التي تنشئها أداة الخط، على النحو الآتي: اختر القائمة إدراج Insert ثم منحنى بيزيه Insert Bezier Curve. انقر في مكان ما عموديًا فوق نقطة التلاشي السفلية (بحوالي 5 أو 6 تباعدات شبكية ثانوية). انقر في مكان ما عموديًا فوق المكان السابق (بحوالي 5 أو 6 تباعدات شبكية ثانوية أسفل "الخط الأفقي"). انقر على نقطة التلاشي الأولى التي رسمت دائرة حولها. انقر بزر الفأرة الأيمن لإيقاف رسم خط بيزية. اختر قائمة عنصر Item ثم تحويل لـ Convert To ثم مضلّع Polygon. وهنا يكون قد أغلقَ برنامج سكريبوس تلقائيًا الخط الذي رسمته للتو ضمن مضلّع مثلث كما في الشكل التالي المرسوم باللون الأحمر: اختر قائمة إدراج ثم منحنى بيزيه مرةً أخرى. انقر في مكان ما فوق وعلى يمين نقطة التلاشي اليسرى (على بُعد تباعد شبكة رئيسي واحد على اليمين). انقر في أي مكان تحت النقرة السابقة، بحيث ترسم خطًا عموديًا لأسفل يتقاطع مع كلا الخطين العلوي والسفلي للمثلث كما في الشكل التالي المرسوم باللون الأحمر: حدّد الخط الذي رسمته للتو ثم حدّد المثلث مع الضغط على مفتاح Shift . اختر قائمة عنصر ثم أدوات المسار Path Tools ثم قص المضلّع Cut Polygon. حدّد المثلث الأيسر - المرسوم باللون الأحمر في الشكل السابق - وانقر بزر الفأرة الأيمن، ثم اختر حذف Delete، فتشكّل بذلك بداية الصندوق وهو الوجه الأيسر. وجه الصندوق الأيمن كرّر الخطوات نفسها التي أجريتها على الوجه الأيسر ولكن اعكسها حول الخط العمودي في منتصف الرسم، بعد ذلك جرّب وضع خط "السكين" على يمين أو يسار الخط الذي يقابل خط "السكين" الأول لإظهار صندوق مختلف الجانبين مثل الخط الأحمر في الشكل التالي: يجب أن يكون لديك الآن وجه أيمن ووجه أيسر على الشكل التالي: وجه الصندوق العلوي النسخ المتكرر انسخ الأشكال الأصلية لتسهيل إنشاء الوجه العلوي على النحو الآتي: حدّد أحد الأوجه واضغط Shift مع تحديد الوجه الآخر، فتحدّد بذلك كلا الوجهين. اختر قائمة عنصر Item ثم مضاعفة/تحويل، ثم نُسخ مطابقة Multiple Duplicate. اضغط على موافق بدون إجراء أي تغييرات، لإنشاء نسخ مكرّرة من الشكلين الأصليين فوق النسخ الأصلية. تحرير العقد Node Editing حدّد الشكل الأيسر وانقر نقرًا مزدوجًا لإظهار نافذة محرّر العُقد Node Editor (حدّدت هنا في الواقع هنا نسخة الشكل الأيسر). اضغط على أيقونة "أضف عُقدًا Add Nodes"، وانقر بالقرب من منتصف خط الشكل العلوي (ليس عليك أن تكون دقيقًا كثيرًا في وضع العقدة). يجب أن تظهر عقدة جديدة في منتصف الخط مثل الشكل التالي: اضغط على أيقونة "حرّك عقدًا Move Nodes"، واسحب العقدة الجديدة إلى النقطة المحاطة بدائرة نقطة التلاشي اليمنى كما في الشكل التالي: اضغط على موافق أو إنهاء التحرير End Editing لإغلاق نافذة محرّر العقد. كرّر الآن الخطوات نفسها التي أجريتها في نافذة "تحرير العقد" ولكن على الشكل الأيمن، ثم أنشئ عقدةً جديدةً بالقرب من منتصف الخط العلوي مع سحب العقدة إلى وسط دائرة نقطة التلاشي اليسرى، حيث يوضّح الشكل التالي الشكل الجديد باللون الأزرق: اضغط على إنهاء التحرير End Editing لإغلاق محرّر العقد. حدّد الشكل الذي حرّرته للتو واضغط Shift مع تحديد الشكل الذي حرّرته سابقًا. اختر قائمة عنصر، ثم أدوات المسار، ثم عمليات المسار Path Operations. اضغط على أيقونة "تقاطع الأشكال Intersection" - الأيقونة الوسطى ضمن "العمليات"- ثم اضغط موافق. يجب أن يكون لديك الآن صندوق منظوريّ الشكل كما في الشكل التالي، ولكننا لم ننتهِ بعد. ترتيب الأشكال إذا كبّرت الجانب الأيسر من الصندوق الخاص بك، فقد ترى أن هناك شيئًا ما يبدو خاطئًا في الزاوية العلوية اليسرى كما في الشكل التالي، ويُحتمَل وجود الأمر نفسه في الزاوية العلوية اليمنى. يحدث ذلك بسبب الطريقة التي يطبّق بها سكريبوس عمليات المسار، ولكن يمكنك إصلاحها بسهولة، باتباع الخطوات الآتية: حدّد وجه العلبة العلوي. اذهب إلى نافذة خصائص Properties ثم إلى التبويب خط Line. اضغط على مفتاح Shift وحدّد الوجه الأيسر، ثم اضغط Shift وحدّد الوجه الأيمن. غيّر إعداد "الحواف Edges" إلى "وصلة مستديرة Round Join" في تبويب خط من نافذة خصائص. يجب أن تكون الآن زوايا الصندوق بالكامل على ما يرام لمعظم الأغراض (بخلاف الطباعة عالية الجودة)، لكن لا تزال الزاوية السفلية من الصندوق غير مثالية إذا كبّرتها، ولكن يمكنك زيادة عرض الخطوط لجميع الأشكال لإخفاء هذه المشكلة كما في الشكل التالي (ليس هذا إصلاحًا للمشكلة ولكنه يتحايل عليها ببساطة): يمكنك الآن حذف دوائر نقاط التلاشي، إذ لم تَعُد هناك حاجة إليها بعد الآن. اللمسات الأخيرة يعود الأمر إليك الآن فيما تريد فعله بصندوقك منظوريّ الشكل. يوضح الشكل التالي وجوه الصندوق المليئة بتظليلات مختلفة من اللون الأسود لإعطاء تأثير إضاءة بسيط: بينما يوضح الشكل التالي تحويل كل وجه إلى إطار صورة وإعطائها تأثير قماش أرجواني مع تطبيق التأثير "سطوع Brightness" لكل صورة ليكون أحد الوجوه أغمق من الوجوه الأخرى: ويوضّح الشكل التالي صندوقًا مصنوعًا من الماء، إذا أردت استخدام تأثيرات مختلفة وغريبة: تُظهِر الصورة التالية - إذا كنت مهتمًا - شيئًا يمكنك تنفيذه إن كان لديك وقت فراغ، إذ ستحتاج إلى وضع بعض أجزاء الرسم ضمن طبقة Layer حتى لا تعترض أشكال طريق أشكال الأخرى. ترجمة -وبتصرّف- للمقال How to draw a perspective box. اقرأ أيضًا كيفية بدء استخدام برنامج سكريبوس Scribus كيف تنشئ ألوانك الخاصة في برنامج سكريبوس Scribus كيفية إنشاء أشكال معقدة ذات زوايا دائرية في برنامج سكريبوس Scribus كيفية إنشاء الظلال في برنامج سكريبوس Scribus كيفية إنشاء تأثير نص مخيف في برنامج سكريبوس Scribus
  10. يقدّم هذا المقال أساسيات الألوان في برنامج سكريبوس Scribus ويوضّح كيفية: معرفة الفرق بين نمطي الألوان الرئيسيين RGB وCMYK. التنقل ضمن نافذة الألوان والتعبئة Colours. إنشاء ألوانك الخاصة. استرجاع لون من لوحة ألوان موجودة مسبقًا. نسخ أو استيراد الألوان من مستند موجود مسبقًا. إنشاء لوحاتك اللونية المخصّصة. أساسيات الألوان يمنحك سكريبوس خيار إنشاء الألوان باستخدام نمطين مختلفين من الألوان هما: RGB وCMYK، فنمط الألوان هو مجرد طريقة لاختيار هذه الألوان. نمط الألوان RGB RGB هو اختصار للألوان "الأحمر Red والأخضر Green والأزرق Blue"، وهو المعيار المستخدَم في العروض المرئية، لهذا فإن كنت غير راغبٍ في طباعة مستندك، فسيكون استخدام ألوان RBG جيدًا. نمط الألوان CMYK CMYK هو اختصار للكلمات "Cyan وMagenta وYellow وKey أو Black"، وهو المعيار المستخدم في صناعة الطباعة، فإذا أردت طباعة مستندك باحترافية، فيجب أن تحاول استخدام ألوان CMYK، حيث يجب أن تفكر في استخدام ألوان CYMK حتى إذا أردت الطباعة باستخدام طابعة منزلية أو مكتبية (انظر إلى عبوة أو عبوات الألوان في طابعتك، فإذا كانت إحداها زرقاء فاتحة، وأخرى أرجوانيةً أو زرقاء داكنة، وأخرى صفراء؛ فلا بد أنك تستخدم ألوان CMYK). إذا اعتقدت أنك قد تحتاج إلى استخدام إدارة الألوان كما ذكرنا سابقًا، فعليك استخدام ألوان CMYK من البداية، فهذا سيجعل الأمر أسهل عند الطباعة. قد تكون قادرًا على استخدام ألوان RGB، ولكن يُحتمَل أن تعمل المطبعة مع ألوان CMYK افتراضيًا، وبالتالي ستظهر مشاكل إن استخدمت ألوان RGB. اختيار نمط الألوان الذي تستخدمه هو أمر متروك لك تمامًا، ولكن إذا كنت مرتبكًا، فاستخدم هذه الإرشادات العامة الآتية: إذا أردت طباعة المستند فاستخدم ألوان CMYK. إذا كان مستندك للاستخدام على الشاشة فقط، فلا مانع من استخدام ألوان RGB. هذه الإرشادات الأساسية مبسطة للغاية ولكنها جيدة لمعظم الأغراض، فالشيء المهم الذي يجب فعله هو التمسّك بنمط ألوان واحد في المستند بأكمله دون المزج بينها، وذا كان لديك أي تساؤل، فتحقق من المطبعة أولًا، إذ سيكون الأشخاص هناك قادرين على تقديم النصح لك. الألوان الموضعية Spot Colours يتيح لك سكريبوس أيضًا إمكانية تحويل لون إلى "لون موضعي". تُعَد الألوان الموضعية أكثر تعقيدًا مما تبدو عليه، ولكن يمكنك التفكير فيها على أنها تعليمات للمطبعة لاستخدام حبر خاص، فإذا أردت طباعة لون معين باستخدام حبر معدني ليكون مثل ذهب لامع على سبيل المثال؛ فعليك أن تجعل هذا اللون لونًا موضعيًا Spot Colour. ويجب أن تكون مستعدًا أيضًا لتشرح للمطبعة ما تريده بالضبط. لكن لا تنشئ ألوانًا موضعيةً خاصةً بك إلا إذا عرفت ما تفعله. نافذة الألوان نافذة الألوان والتعبئة Colours هي المكان الذي ستدير فيه جميع الألوان المستخدَمة في مستندك. يمكن فتح نافذة الألوان باتباع الخطوات التالية: افتح برنامج سكريبوس وأنشئ مستندًا جديدًا (إن لم يكن لديك المستند مفتوحًا بالفعل). اختر قائمة تحرير Edit ثم الألوان والتعبئة Colours. ثم ستظهر نافذة كما يلي: تعرض القائمة الموجودة على الجانب الأيمن الألوان الموجودة فعليًا في مستندك، حيث يجب تحديد اللون في هذه القائمة قبل تنفيذ إجراءٍ ما عليه. وتعمل الأزرار الموجودة على اليسار بالعمليات التالية: يتيح لك زر استيراد Import نسخ كل الألوان من مستند آخر. يتيح لك زر إضافة New إنشاء لون جديد. يتيح لك زر تحرير Edit تغيير لون موجود مسبقًا. يتيح لك زر نسخ مطابق Duplicate نسخ لون موجود وتعديل هذه النسخة. يتيح لك زر حذف Delete إزالة لون من المستند (أو استبداله بلون آخر موجود). يحذف الزر "احذف غير المستخدم Remove Unused" كل الألوان التي لا يستخدمها أي شيء في المستند. يقبل الزر "موافق OK" أي تغييرات أجريتها، ويتراجع الزر "إلغاء Cancel" عنها. محرر الألوان Colour Editor إذا ضغطت على أي من أزرار تحرير أو إضافة أو نسخ مطابق، فستظهر نافذة تحرير الألوان Edit Colour كما في الشكل التالي: سترى اسم اللون الذي تعمل عليه في الجزء العلوي الأيمن من المحرر، حيث يمكنك استخدام أي اسم تريده -بما في ذلك المسافات- طالما لم يستخدمه لون آخر. يوجد تحت الاسم قائمة نمط الألوان Color Model لاختيار نمط الألوان CMYK أو RGB كما ذكرنا سابقًا. يوجد أيضًا مربعان، حيث يُظهر المربع الموجود على اليمين اللون القديم (الأصلي)، واللون الموجود على اليسار هو اللون الجديد (المتغيّر)، ويكون اللون القديم دائمًا هو اللون الأبيض عند إنشاء لون جديد. وإذا حرّرت لونًا، فإن اللون القديم هو اللون قبل إجراء أي تغييرات؛ أما إذا نسخت لونًا، فإن اللون القديم هو اللون الأصلي الذي تنسخه. اللون الجديد هو دائمًا اللون الذي سينشأ عند الضغط على زر "موافق". توجد قائمة "محدد لوحة الألوان Palette Selector" في أعلى يسار نافذة محرّر الألوان، حيث تكون مضبوطةً افتراضيًا على الخيار "خريطة الألوان HSV Color Map". يمنحك تحديد الخيار خريطة ألوان مستطيلًا متعدد الألوان مثل الشكل التالي، حيث يمكنك النقر على لونٍ ما لتحديده. توجد أسفل خريطة الألوان بعض المنزلقات Sliders التي يمكنك استخدامها لتغيير اللون الذي تعمل عليه حاليًا، كما يوجد بجوار كل منزلق حقلٌ نصي، حيث يمكنك إدخال قيمة مباشرةً. ويوجد على يمين كل حقل مجموعة من الأسهم المتحركة التي تسمح لك بزيادة أو إنقاص هذه القيمة بسرعة. إنشاء لون جديد من الصفر افتح نافذة الألوان والتعبئة -إن لم تكن مفتوحةً بالفعل- من قائمة تحرير ثم الألوان والتعبئة Colours، ثم اضغط على الزر إضافة أو جديد New. ثم ستظهر لك نافذة تحرير الألوان Edit Colour. تأكّد من ضبط نمط الألوان Color Model على CMYK لإنشاء لون CMYK جديد، وعلى القيمة RGB لإنشاء لون RGB جديد. يوصَى بإعطاء اللون اسمًا مرتبطًا بغرض استخدامه، أي إذا أردت استخدام لون أزرق داكن لخلفيّة لافتة، فيجب تسمية اللون مثل الاسم "خلفية اللافتة Banner Background" مثلًا، حيث ؤدي تسمية الألوان بهذه الطريقة إلى تجنّب الالتباس إذا قررت تغيير اللون لاحقًا، فإذا سمّيت اللون في الأصل بالاسم "أزرق داكن" على سبيل المثال ولكنك أردت تغيير خلفية اللافتة إلى اللون الأحمرعوضًا عن الأزرق الداكن، فيجب إعادة تسمية اللون مع تغييره (وقد تغير رأيك مرةً أخرى). انقر في أي مكان على خريطة الألوان لتحديد اللون الموجود أسفل المؤشر (اسحب المؤشر على الخريطة لترى تغير اللون). سيتغيّر مربع اللون "الجديد" الموجود على اليسار ليظهر لك الشكل الذي سيبدو عليه اللون الجديد، أثناء تحديد لون من خريطة الألوان. استخدم المنزلقات الموجودة أسفل خريطة الألوان لضبط اللون كما تريد، واسحب المنزلق لتغيير أحد مكونات اللون، إذ سيغيّر سحب المنزلق "C" مثلًا مقدار السماوي Cyan في اللون إذا استخدمت نمط ألوان CMYK. ويمكنك أيضًا ضبط قيم محدَّدة لكل مكون من مكونات اللون باستخدام حقول إدخال النص على يسار كل منزلق. يمكنك الضغط على زر "موافق" لإنشاء اللون الجديد إن أعجبك، أو اضغط على زر "إلغاء" إن لم تَعُد تريده. انقر على محدد لوحة الألوان، وانتقل لأسفل حتى تصل إلى لوحة الألوان "CrayonTM" مثلًا، واضغط عليها. سترى أن خريطة الألوان قد استبدِلت بقائمة من الألوان التي لها أسماء، حيث سيؤدي النقر على لونٍ من هذه القائمة -اللون "Aquamarine" الأزرق الفاتح مثلًا- إلى تغيير اللون الذي تحرّره لتظهر قيم اللون Aquamarine المخزَّنة، وقد تلاحظ أيضًا تغيّر نمط الألوان، لأن بعض اللوحات اللونية عبارة عن لوحات RGB وبعضها الآخر عبارة عن لوحات CMYK. إذا غيّرت قيم اللون الآن، فلن تغيّره في اللوحة اللونية المعيارية، إذ تتغيّر فقط نسختك الخاصة من هذا اللون. يعيد برنامج سكريبوس تسمية اللون بنفس اسم اللون في اللوحة اللونية تلقائيًا عندما تختار لونًا من إحدى اللوحات المعيارية، لذلك فقد ترغب في إعادة تسميته بنفسك إلى شيء مفيد لك. يمكن أن يؤدي انتقاء الألوان من لوحة معيارية أحيانًا إلى تسهيل الحصول على الألوان التي تتناسب مع بعضها البعض، فهناك العشرات من اللوحات اللونية الجاهزة في سكريبوس التي يمكنها أن تفيدك في تصميماتك، لذلك نوصيك بإلقاء نظرة عليها. تحرير لون موجود مسبقا حدّد لونًا من القائمة الموجودة على يمين نافذة الألوان والتعبئة Colours واضغط على زر تحرير Edit. ستظهر لك نافذة تحرير الألوان كما كانت من قبل ولكنك ستحرّر اللون الذي حدّدته. يمكنك تغيير نمط الألوان والقيم إلى أي شيء تريده، كما تفعل عند إنشاء لون جديد. يؤدّي الضغط على زر "موافق" إلى إجراء التغييرات على اللون، بينما يلغيها الزر "إلغاء". نسخ لون حدّد لونًا من القائمة الموجودة على يمين نافذة الألوان والتعبئة Colours، واضغط على زر نسخ مطابق Duplicate. ستظهر لك نافذة تحرير الألوان كما كانت من قبل ولكنك ستحرّر نسخة من اللون الذي حدّدته. لاحظ تغيُّر اسم اللون مؤقتًا إلى "نسخ من <اللون> أو Copy of <colour>‎" حيث أن <اللون> هو اسم اللون الذي حددته في الأصل، لذلك يجب تغيير هذا الاسم إلى اسم أفضل. لن يتغير اللون الأصلي الذي حدّدته، إذ سيكون أيّ تغيير تجريه هنا على النسخة الجديدة فقط. يمكنك أيضًا تعديل نمط الألوان و / أو القيم كما تريد. سينشأ لونك الجديد بمجرد الضغط على زر "موافق"، أو اضغط على زر "إلغاء" إن لم تَعُد تريده. حذف لون حدّد لونًا من القائمة الموجودة على يمين نافذة الألوان والتعبئة Colours واضغط على زر حذف Delete. ستظهر لك نافذة حذف اللون Delete Colour كما في الشكل التالي (لكن انتبه، حيث سيؤدي الضغط على زر حذف في الإصدار 1.5.7 من برنامج سكريبوس إلى حذف اللون مباشرةً دون ظهور هذه النافذة): يجب الآن تحديد اللون الموجود الآخر الذي سيُستبدَل اللون المحذوف به من القائمة، حيث سيُستبدَل لون أيّ كائن (نص أو مخطط تفصيلي أو تعبئة أو غير ذلك) له اللون الذي تحذفه بهذا باللون الذي ستختاره، فإذا حذفت اللون "الأحمر" واستبدلته باللون "الأزرق" على سبيل المثال، فسيُلوَّن أي شيء كان لونه "أحمر" باللون "الأزرق". سيؤدي تحديد الخيار "لا شيء None" على أنه اللون البديل إلى عدم وجود أي لون على الإطلاق لكل شيء ملوَّنٍ باللون الذي تحذفه. اضغط على زر "موافق" لحذف اللون، أو اضغط على زر "إلغاء" لإلغاء الحذف. حذف الألوان غير المستخدمة يمكن أن تصبح قائمة الألوان الخاصة بك فوضويةً مع الكثير من الألوان التي أنشأتها لأي سبب من الأسباب ولكنك لم تَعُد تريدها، حيث يمكنك تصفح قائمة الألوان، وتحديد كل لون تعرف أنك لا تستخدمه ثم حذفه لوحده، ولكنها قد تكون عمليةً طويلةً جدًا، وقد تحذف لونًا لا تريد حذفه عن طريق الخطأ، لهذا السبب يحتوي برنامج سكريبوس على عملية "حذف الألوان غير المستخدَمة". اضغط على الزر "احذف غير المستخدَم Remove Unused" في نافذة الألوان والتعبئة Colours. سينظر برنامج سكريبوس إلى كل لونٍ في القائمة ويتحقق لمعرفة ما إذا كان هناك أي شيء يستخدم هذا اللون بمجرد الضغط على الزر "احذف غير المستخدَم"، فإذا استخدم أي شيء في المستند لونًا ما، فسيتجاهله سكريبوس وينتقل إلى اللون التالي؛ أما إن لم يستخدم أي شيء هذا اللون، فسيحذفه سكريبوس مباشرةً دون التحقق منك أولًا، ثم سيحدّث سكريبوس القائمة لإظهار الألوان التي تستخدمها الكائنات في مستندك فقط. استيراد الألوان من مستند آخر قد يكون لديك في بعض الأحيان لون محدَّد في مستند آخر وترغب في استخدامه في المستند الحالي، كما يمكنك إعادة إنشاء هذا اللون يدويًا، ولكن عملية استيراد اللون من المستند الآخر أسرع. اضغط على الزر "استيراد Import" في نافذة الألوان والتعبئة. ستظهر لك الآن نافذة افتح ملفًا Open File (أو استورد ألوانًا)، حيث يمكنك اختيار المستند - ملف سكريبوس SLA - الذي تريد استيراد اللون منه، بعدها حدّد مستندًا واضغط على موافق لاستيراد كل الألوان من المستند المحدد، أو اضغط على "إلغاء" لإلغاء الاستيراد. يحصل الاستيراد على كل الألوان من المستند المحدّد وتُضاف إلى مستندك المفتوح، حيث يمكنك استخدام عملية "حذف الألوان غير المستخدَمة" بعد استخدام اللون الذي تريده على كائنٍ ما لإزالة الألوان الأخرى المستوردة إن أردت ذلك. اللوحات اللونية المخصصة يمكنك إنشاء لوحاتك اللونية المخصصة باستخدام العمليات المذكورة أعلاه، إذ يمكنك استخدام هذه اللوحات في أي مستند آخر على النحو الآتي: أنشئ مستندًا جديدًا. اضبط الألوان على النحو المطلوب وتأكّد منها لأنك ستستخدمها مرات متعددة. احفظ المستند باسم مناسب. أغلق المستند ثم أنشئ مستندًا جديدًا. استخدم الزر "استيراد" في نافذة الألوان والتعبئة Colours لنسخ الألوان من مستند "لوحة الألوان" الذي حفظته للتو إلى مستندك الجديد. تذكّر أن أي تغييرات تجريها على الألوان التي استوردتها لن تُطبَّق على مستند "لوحة الألوان"، وإذا غيّرت ألوان مستند "لوحة الألوان"، فستحتاج إلى إعادة استيرادها لمشاهدة التغييرات. عجلة الألوان Colour Wheel هناك طريقة أخرى يمكنك من خلالها إنشاء الألوان في برنامج سكريبوس، وهي استخدام عجلة الألوان التي تتيح لك تحديد الألوان التي تتلاءم مع بعضها البعض بسهولة على النحو الآتي: أغلق نافذة الألوان والتعبئة إذا كانت مفتوحة. اختر قائمة إضافي Extras ثم عجلة الألوان Colour Wheel. يجب أن تشاهد الآن نافذة عجلة الألوان كالشكل التالي: تنقسم هذه النافذة إلى خمسة أقسام هي: توجد عجلة الألوان في أعلى اليمين، حيث يمكنك اختيار اللون الأساسي Base Colour. يوجد تحتها قسم تحديد الطريقة Method، حيث تختار طريقة تحديد سكريبوس للألوان الأخرى. يوجد تحته قسم المعاينة Preview، حيث يمكنك أن ترى كيف ستبدو الألوان المختارة مع بعضها البعض في ظروف مختلفة. الجزء العلوي الأيسر هو القسم الذي تغيّر من خلاله قيم اللون الأساسي اللونية بدقة. وتوجد تحته قائمة بالألوان التي اخترتها أو التي اختارها برنامج سكريبوس. اللون الأساسي Base Colour ستتعامل دائمًا مع اللون الأساسي عندما تستخدم عجلة الألوان، إذ يخبر هذا اللون الأساسي برنامجَ سكريبوس باللون الذي يجب استخدامه عند اختيار ألوان أخرى، ويظهَر اللون الأساسي دائمًا في دائرة عجلة الألوان المركزية. انقر على لونٍ من عجلة الألوان لاختياره على أنه اللون الأساسي، أو اسحب المؤشر حوله مع الاستمرار في الضغط على زر الفأرة الأيسر لرؤية تغيّر اللون الأساسي. هناك عدد من الدوائر الصغيرة حول عجلة الألوان تُظهِر الأماكن التي يختار سكريبوس الألوان منها، حيث توضّح الدائرة الحمراء مكان وجود اللون الأساسي على العجلة، كما توضّح الدائرة (أو الدوائر) السوداء مكان الألوان الأخرى. طريقة مخطط الألوان Colour Scheme Method يستخدم برنامج سكريبوس مجموعةً متنوعةً من الطرق لاختيار الألوان وهي: تدرج لوني أحادي Monochromatic: يتكون من ثلاثة ألوان هي اللون الأساسي ونسخة أفتح منه ونسخة أغمق. لون متماثل Analogous: يتكون من ثلاثة ألوان هي اللون الأساسي ولونان آخران عند زاويةٍ ما من اللون الأساسي، إذ يمكنك تحديد قيمة هذه الزاوية من الحقل الموجود تحت قائمة الطرق. لون مكمّل Complementary: يتكون من لونين هما اللون الأساسي ولون آخر متباين معه. التكامل المنقسم Split Complementary: يتكون من خمسة ألوان هي مزيج من لون متماثل ولون مكمّل. التكامل الثلاثي Triadic: يتكون من ثلاثة ألوان هي اللون الأساسي ولونان آخران عند الزاوية 120 درجة منه. ثانوي (تكاملي مزودج) Tetradic: يتكون من أربعة ألوان هي اللون الأساسي ولون متماثل ولونان مكمّلان. لست بحاجة إلى أن تعرف الأسلوب الذي تختار به هذه الطرق ألوانها أو ما تعنيه هذه الطرق، فكل ما عليك فعله هو تجربة هذه الطرق واختيار الأنسب لتصميمك. الزوايا Angles يمكنك اختيار "الزاوية" من الحقل الموجود تحت قائمة الطرق لبعض منها، حيث تحدّد هذه الزاوية فقط مدى دوران العجلة - بعيدًا عن اللون الأساسي - لتحديد الألوان الأخرى عند هذه الزاوية. قسم المعاينة Preview يوجد قسم المعاينة أسفل قسم طريقة مخطط الألوان، حيث يوضح الجزء الرئيسي من هذا القسم عيّنات الألوان التي اخترتها والألوان التي اختارها برنامج سكريبوس مع نص فاتح وداكن فوقها لتتمكّن من رؤية كيفية ظهورها في المستند. وتوجد فوق هذه المعاينة قائمةٌ تمثّل نوع خلل الطيف Vision Defect Type التي تمكّنك من تغيير نوع المعاينة التي ستراها، حيث سيظهِر الخيار "بصر طبيعي Normal Vision" كيف ستبدو الألوان لشخص يتمتع ببصر طبيعي، وتُظهر الأنواع الأخرى كيف ستبدو الألوان لشخص لديه مشكلة معينة في بصره، حيث يمكنك تحديد نوع العيب من القائمة لتغيير المعاينة. اختيار اللون الأساسي يمكنك تحديد قيم اللون الأساسي بدقة من القسم الموجود في الجزء العلوي الأيسر عن طريق الكتابة في حقول النص أو استخدام أزرار التحرك لزيادة أو إنقاص القيم. الغرض من علامات التبويب CMYK وRGB وHSV واضح، ويتيح لك التبويب مستند Document اختيار أحد ألوان مستندٍ موجود مسبقًا مثل لون أساسي. الألوان الناتجة Result Colours يُظهِر قسم الألوان الناتجة Result Colors الموجود في أسفل يسار النافذة الألوان كما ستكون إذا أُضيفت إلى المستند، كما أنه يظهِر أسماءها. ولا يمكنك إجراء أي تغييرات هنا، فهي مجرد معلومات، ولكن يمكن إعادة تسمية الألوان من خلال نافذة الألوان والتعبئة Colours -كما وضّحنا سابقًا- إن أردت ذلك. انقر على لونٍ من هذه القائمة لمعرفة المزيد من المعلومات حول هذا اللون في الجدول الذي تحته. الدمج Merging والاستبدال Replacing يمكنك استخدام إما الزر "دمج Merge" أو الزر "استبدال Replace" عندما تكون جاهزًا لإضافة الألوان المحدَّدة إلى المستند الخاص بك، حيث يؤدي الضغط على الزر "إلغاء" إلى إغلاق النافذة دون إجراء أية تغييرات. إذا اخترت دمج الألوان، فسيضيف سكريبوس الألوان الجديدة إلى قائمة الألوان في المستند؛ أما إذا كان اللون موجودًا بالفعل بنفس الاسم فستتلقى تحذيرًا وستُنقَل إلى نافذة الألوان والتعبئة Colours لإعادة تسمية اللون الحالي قبل المتابعة. إذا اخترت استبدال الألوان فسيضيف سكريبوس الألوان الجديدة كما هو الحال عند اختيار دمج الألوان، ولكن سيحل هذا اللون مكان أي لون موجود مسبقًا بالاسم نفسه. يمكن أن تكون هذه الخاصية مفيدةً إذا أردت تجربة مخططات ألوان مختلفة، حيث يمكنك على سبيل المثال: إنشاء مخطط ألوان أولي باستخدام عجلة الألوان. ثم إعداد المستند الخاص بك كما تريد. ثم الرجوع إلى عجلة الألوان واختيار مخطط ألون مختلف. ثم استبدال الألوان لترى التغييرات. إرشادات مهمة إذا أردت إنشاء لون RGB جديد اسمه "Violet" له القيم 146 و110 و174، فاتبع الخطوات التالية: اختر قائمة تحرير Edit ثم الألوان والتعبئة Colours. اضغط على زر إضافة أو جديد New. غيّر اسم اللون إلى "Violet" (بدون علامات الاقتباس). تأكد من ضبط نمط الألوان Color Model على الخيار RGB. استخدم المنزلقات أو حقول الإدخال لضبط "R" على القيمة 146، ثم اضبط "G" على القيمة 110، ثم "B" على القيمة 174. اضغط على زر موافق لإنشاء اللون الجديد. اضغط على "موافق" في نافذة الألوان والتعبئة Colours للعودة إلى المستند، إلّا إذا أردت إنشاء مزيد من الألوان. أما إذا أردت إنشاء لون CMYK جديد اسمه "Goldenrod" له القيم 4% و14% و62% و 1%، فاتبع الخطوات التالية: اختر قائمة تحرير ثم الألوان والتعبئة. اضغط على زر إضافة أو جديد. غيّر اسم اللون إلى "Goldenrod" (بدون علامات الاقتباس). تأكّد من ضبط نمط الألوان على الخيار CMYK. استخدم المنزلقات أو حقول الإدخال لضبط "C" على 4%، ثم اضبط "M" على 14%، ثم "Y" على 62%، ثم "K" على 1%. اضغط على زر موافق لإنشاء اللون الجديد. اضغط على "موافق" في نافذة الألوان والتعبئة للعودة إلى المستند إلّا إذا أردت إنشاء مزيد من الألوان. حيث تُعطَى دائمًا قيم اللون بالترتيب R ثم G ثم B لألوان RGB، أو C ثم M ثم Y ثم K لألوان CMYK. ترجمة -وبتصرّف- للمقال How to create your own colours. اقرأ أيضًا كيفية إنشاء الظلال في برنامج سكريبوس Scribus كيفية إنشاء التأثير Distressing Mask في برنامج سكريبوس لإنتاج تأثيرات تعبئة جذابة كيفية إنشاء لافتة نيون Neon Sign في برنامج سكريبوس Scribus كيفية إنشاء تأثير نص مخيف في برنامج سكريبوس Scribus
  11. سنوضّح كيفية إنشاء تأثير مخيف Spooky على نص مثل الشكل التالي لوضعه فوق صورة خلفية باستخدام مجموعة من تقنيات برنامجَي جيمب GIMP وسكريبوس Scribus المختلفة. يجب معرفة كيفية تنفيذ الأشياء التالية على وجه الخصوص: إنشاء وتحرير الألوان. إنشاء إطار صورة ووضع صورة فيه. إنشاء طبقات وإعادة تسميتها. إنشاء إطار نص، وإدخال النص، وتغيير التنسيق. تحويل النص إلى مخططات تفصيلية Outlines. فك تجميع الكائنات. دمج المضلعات. تغيير ألوان التعبئة / الحدّ وأحجام الخطوط. تحويل المضلعات إلى إطارات صور. إنشاء مسارات من الخطوط Strokes. تغيير خصائص الطبقة. إن لم تعرف كيفية تنفيذ هذه الأشياء، فمن المحتمل أن تجد صعوبةً في تمكُّنك من اتباع الخطوات أدناه، إذ سنقدّم بعض التلميحات خلال الشرح ولكن يجب عليك معرفة ما تفعله، فقد شرحنا جميع التقنيات المستخدمة في مقالات أخرى سابقًا، ويُفترَض أيضًا معرفة كيفية استخدام أساسيات برنامج جيمب. الإعداد نزّل صورة الخلفية الموضَّحة في الشكل التالي، وتأكّد من تنزيل النسخة الصغيرة بحجم 640x426 بكسل: نزّل الخط Harrington الموضّح في الشكل التالي -إن لم يكن لديك-: الخطوات التي نحتاجها على برنامج جيمب GIMP افتح برنامج جيمب واضبط لون الخلفية على اللون الأسود. أنشئ صورةً جديدةً بحجم 640x400 مليئةً بلون الخلفية. استخدم قائمة المرشّحات Filters، ثم اختر Noise ثم Hurl، واقبل الإعدادات الافتراضية. استخدم قائمة ألوان Colours ثم اختر عدم التشبّع Desaturate، واقبل الإعدادات الافتراضية. استخدم قائمة طبقات Layer ثم شفافية Transparency، ثم Colour to Alpha، واختر اللون الأسود ثم اضغط موافق. صدّر الصورة بتنسيق PNG (للحفاظ على الشفافية) وسمَِ الملف بالاسم "sparkle.png". يجب الحصول الآن على صورة شبه شفّافة تتكون من الكثير من النقاط ذات التدرج الرمادي، حيث يوضّح الشكل التالي الزاوية العلوية اليسرى منها: الخطوات التي نحتاجها على برنامج سكريبوس الخلفية افتح برنامج سكريبوس وأنشئ مستندًا جديدًا بالقياس A4، أو رسالةً ويكون الاتجاه أفقيًا Landscape، (إن استخدمت القياس Portrait، فيجب عليك تنفيذ المزيد من الخطوات لاحقًا). أنشئ إطار صورة بأي حجم. ضع صورة الخلفية التي نزّلتها في إطار الصورة. انقر بزر الفأرة الأيمن واختر ضبط الإطار إلى صورة Resize Frame to Image. أنقل إطار الصورة إلى الموضع X وY لهما القيمة 50 نقطة (دوّن هذه القيم، إذ ستحتاج إليها لاحقًا). الألوان أنشئ لونًا جديدًا R,G,B = 0,255,133، حيث ستحتاج هذا اللون الجديد لاحقًا. الطبقات أنشئ 4 طبقات جديدة. أعِد تسمية هذه الطبقات من الأعلى إلى الأسفل "top" و"5" و"9" و"15" (بدون علامات الاقتباس). حدّد الطبقة "top". ستساعدك تسمية الطبقات بهذه الطريقة على التأكد من وضع الشيء الصحيح على الطبقة الصحيحة وبالترتيب الصحيح أيضًا. النص الأولي أنشئ إطار نص بنفس حجم إطار صورة الخلفية (لست بحاجة إلى الدقة، فكل ما عليك فعله هو التأكد من النص الذي تكتبه إذا كان مناسبًا للصورة). أدخِل النص "Spectre" (ربما لا يمكنك رؤيته بعد). غيّر نوع الخط إلى الخط "Harrington" وحجمه إلى 160 نقطة، حيث يجب أن تكون قادرًا على رؤيته الآن. حوّل النص إلى مخططات تفصيلية Outlines من قائمة عنصر Item ثم تحويل لـ Convert To، ثم مخططات تفصيلية Outlines. فُكّ تجميع المخططات التفصيلية من قائمة عنصر، ثم اختر التجميع ثم فَك التجميع Ungroup. ادمج المضلعات من قائمة عنصر ثم أدوات المسار، ثم ادمج المضلعات Combine Polygons. انقل النص المحدّد على الصورة إلى المكان الذي يبدو فيه أفضل، حيث يمكنك استخدام المخطط التفصيلي لمعرفة مكان وضعه. تأكد من قيم الموضع X وY لهذا "النص المحدّد" هي أعداد صحيحة، لأن هذا سيساعدك لاحقًا (دوّن قيم X وY هذه، حيث ستحتاج إليها لاحقًا). إنشاء التوهج Sparkles تأكد من أنك في الطبقة "top". حدّد النص. أنشئ نسخًا مكرَّرةً Multiple Duplicate من النص واقبل الإعدادات الافتراضية لإنشائها مباشرةً فوق النص الأصلي. حدّد النسخة الجديدة وأرسلها إلى الطبقة "5". حدّد الطبقة "5"، ثم حدد نسخة النص المكرَّرة. اضبط عرض الخط على القيمة 5 بلون أسود للخط. أنشئ مسارًا من خط Stroke من قائمة عنصر ثم أدوات المسار Path Tools ثم اختر "أنشئ مسار من خط Create "Path from Stroke. اضبط لون التعبئة والحد على "لا شيء None" (لا تنسَ ذلك وإلا فلن يعمل التأثير بصورة صحيحة، حيث ستفقد شفافية الصورة إذا احتفظت بالخلفية المملوءة). حوّل الكائن إلى إطار صورة من قائمة عنصر ثم تحويل لـ ثم إطار صورة. ضع الصورة "Sparkle" في إطار الصورة الجديد. وبهذا يكون قد بدأ التوهّج بالظهور الآن. كرّر نفس الخطوات السابقة ولكن استخدم الطبقة "9" بعرض خط 9 نقاط. ثم افعل الشيء نفسه بالنسبة للطبقة "15" بعرض خط 15 نقطة. يجب أن يبدو النص الآن مثل الشكل التالي: إنشاء التراكب Overlay حدّد الطبقة "top". حدّد النص الأصلي المحدّد. حوّله إلى إطار صورة. ضع صورة الخلفية في هذا الإطار. يبدو هذا خاطئًا ولكن عليك إجراء بعض العمليات الحسابية: اطرح الموضع X "للصورة التي تحتوي النص" من الموضع X لصورة الخلفية (105-50 = 55 مثلًا). اضبط الصورة على "تحجيم حر Free Scaling" من تبويب صورة Image في نافذة خصائص Properties، أو من نافذة خصائص الصورة في الإصدار 1.5.7 من برنامج سكريبوس التي يمكنك الوصول إليها من قائمة نوافذ ثم خصائص المحتوى. بعد ذلك أدخِل القيمة السلبية لعملية الطرح التي أجريتها للتو (‎-55 مثلًا). افعل الشيء نفسه بالنسبة للموضع Y. وبهذا تكون قد تمكّنت من إجراء هذه الحسابات المحدَّدة للمواضع من جعل الخلفية "تمر من خلال" الجزء الأوسط من "التوهّج Sparkles"، وذلك من خلال إنشاء صورة على شكل نص في الأمام، حيث يجب ظهوره وكأن هناك فراغ داخل الحروف، وانظر مكان مرور الأشجار والأرض عبر النص لترى التأثير بصورة أفضل. اللمسات الأخيرة ابقَ في الطبقة "top" وحدّد "صورة النص"، ثم أعطها لون المخطط التفصيلي الذي أنشأته مسبقًا بعرض خط يبلغ 1 نقطة. حدد الطبقة "15" واضبط التعتيم Opacity على القيمة 60%. حدّد الطبقة "9" واضبط التعتيم على القيمة 80%. حدد الطبقة "5" واضبط نمط الدمج Blend Mode على "تباين Difference" (لاحظ كيف يؤدي استخدام نمط الدمج "التباين"- في هذه الحالة - إلى زيادة الضوء بين الأشجار). فعّل "وضع المعاينة Preview Mode" لرؤية التأثير في أفضل حالاته دون إضافة برنامج سكريبوس أي مخططات. النهاية غيّر التعتيم وأنماط الدمج للطبقات الوسطى المختلفة - "5" و"9" و"15" - لتغيير التأثير واختيار ما تراه الأفضل. جرّب أيضًا استخدام صورة مختلفة ولاحظ الفرق الذي يحدث، حيث لا تحتاج إلى البدء من جديد، إذ يمكنك تغيير صورة الخلفية فقط، ثم "صورة النص" في الأمام، مع التأكد من تغيير إزاحة X وY مرةً أخرى. ترجمة -وبتصرّف- للمقال How to create some spooky text. اقرأ أيضًا كيفية إنشاء رمز RSS Feed في برنامج سكريبوس Scribus كيفية التعامل مع محرر القصص Story Editor في برنامج سكريبوس Scribus تصميم تأثير النصوص على الصور في جيمب كيفية إنشاء الظلال في برنامج سكريبوس Scribus كيفية إنشاء التأثير Distressing Mask في برنامج سكريبوس لإنتاج تأثيرات تعبئة جذابة كيفية إنشاء لافتة نيون Neon Sign في برنامج سكريبوس Scribus
  12. سنوضّح كيفية إنشاء رمز RSS Feed باستخدام الأدوات الموجودة في برنامج سكريبوس Scribus فقط، وقد لا تستخدم سكريبوس لتنفيذ ذلك نظرًا لوجود العديد من الصور الأفضل المتوفرة مجانًا للاستخدام، ولكن هذا المقال يتعلّق بشرح استخدام أدوات سكريبوس بصورة أساسية. الألوان افتح برنامج سكريبوس وأنشئ مستندًا جديدًا، حيث سيكون القياس A4 / Letter وأي اتجاه سيكون جيدًا. ستحتاج إلى لونين هما: برتقالي فاتح Light Orange بقيم CMYK التي هي: 0% و50% و100% و0%. برتقالي غامق Dark Orange بقيم CMYK التي هي: 5% و60% و90% و10%. استخدم نافذة محرّر الألوان Color Editor، من قائمة تحرير Edit، ثم الألوان والتعبئة Colors لإضافة الألوان إلى المستند. إن لم تعرف كيفية إضافة الألوان إلى المستند، فراجع دليل تعليمات سكريبوس عبر قائمة مساعدة Help ثم اختر Scribus Help، واطّلع على القسم "Documentation / Editing Colors"، ثم راجع قسم "الألوان" في مقال كيفية إنشاء لافتة نيون في برنامج سكريبوس. الخلفية ستحتاج الآن إلى إنشاء شكل مربع ذي زوايا مستديرة للخلفية كما في الشكل التالي: أنشئ مربعًا واجعل العرض والارتفاع 100 نقطة. اضبط نصف القطر لتدوير الزاوية على القيمة 16 نقطة مثلًا من تبويب شكل Shape في نافذة خصائص Properties. اضبط لون الحد Line Colour على "لا شيء None". اضبط نمط التعبئة على "متدرج خطي Diagonal Gradient". اضبط نقطة توقف التدرج اللوني في أقصى اليسار على اللون Dark Orange في الموضع 0%. اضبط نقطة توقف التدرج اللوني في أقصى اليمين على اللون Dark Orange في الموضع 100%. أنشئ نقطة توقف متدرجة جديدة عند الموضع 50%، واضبطها على اللون Light Orange. حدد المربع المستدير واختر قائمة عنصر Item، ثم مضاعفة/تحويل ثم تحويل Transform. اضغط على زر إضافة Add واختر "تحجيم Scaling" من القائمة. اضبط التحجيم الأفقي والرأسي على القيمة 90%. حدد مركز الكائن مثل نقطة أساسية Origin. اضبط عدد النسخ على القيمة "1" واضغط على موافق OK. حدد المستطيل الأصغر الجديد واضبط نمط التعبئة على "خالص Normal" ولون التعبئة على "لا شيء". اضبط لون الحد على اللون Light Orange، واضبط عرض الخط على 3 نقاط من تبويب خط في نافذة خصائص. يجب الحصول الآن على شكل مشابه للشكل السابق. الدوائر أنشئ دائرةً لتكون خارج المربع الأكبر -استخدمنا دائرة بعرض وارتفاع 140 نقطة-. اختر قائمة عنصر ثم مضاعفة/تحويل ثم تحويل. اضغط على زر إضافة Add واختر "تحجيم Scaling" من القائمة. اضبط التحجيم الأفقي والرأسي على 80%. حدد مركز الكائن ليكون نقطةً أساسية. اضبط عدد النسخ على القيمة "1" واضغط على موافق OK. حدد الدائرة الأصغر الجديدة واتبع الخطوات السابقة نفسها من اختيار القائمة عنصر إلى ضبط عدد النسخ ولكن استخدم نسبة تحجيم 76%. حدد الدائرة الأحدث الأصغر واتبع الخطوات السابقة نفسها من اختيار القائمة عنصر إلى ضبط عدد النسخ ولكن استخدم نسبة تحجيم 66%. استخدام هذه النسب المئوية يمنحك شيئًا يشبه الشكل التالي: الأشكال الحلقية يجب الآن تحويل الدوائر الأربع إلى شكلين حلقيين كما يلي: حدد أصغر دائرة داخلية ثم اضغط Shift وحدّد الدائرة التالية الأكبر. اختر قائمة عنصر، ثم أدوات المسار Path Tools، تليها عمليات المسار Path Operations. حدّد عملية "طرح Subtracts"، وبدّل الأشكال إن أردت رؤية الشكل الحلقي في مربع المعاينة العلوي الأيسر. اضغط موافق. حدد الدائرة الأكبر الخارجية ثم اضغط Shift وحدد الدائرة الأصغر التالية. كرّر الخطوات السابقة نفسها من اختيار قائمة عنصر إلى الضغط على موافق. يجب الحصول الآن على شكلان حلقيان بدلًا من أربع دوائر، بحيث يكون الشكل التالي ملوّنًا لتتمكّن من رؤية النتيجة بصورة أفضل، ولكن إن فعلت ذلك تذكّر وجوب التراجع عن التلوين قبل المتابعة. أرباع الأنابيب اختر قائمة إدراج Insert ثم منحنى بيزية Insert Bezier Curve. انقر أعلى منتصف الجزء العلوي من الحلقة الكبيرة، ثم انقر على أسفل منتصف الجزء السفلي، وانقر بزر الفأرة الأيمن لإغلاق المنحنى. يجب الانتباه ليكون الخط مستقيمًا عموديًا ولكن يمكنك استخدام نافذة حاذِ ووزّع Align & Distribute للمحاذاة مركزيًا، ولا يمكنك استخدام أداة الخط العادية لأن الخطوط العادية لا يمكنها قطع المضلعات. اختر قائمة عنصر ثم مضاعفة/تحويل ثم نسخ مطابق Multiple Duplicate، واضغط على زر موافق لإنشاء نسخة أعلى النسخة الأصلية. حدّد أحد الخطوط المستقيمة ثم اضغط Shift، وحدّد الحلقة الصغيرة. اختر قائمة عنصر ثم أدوات المسار Path Tools، ثم قصّ المضلع Cut Polygon. بهذا يكون قد اختفى خط بيزية الآن -على الرغم من وجود الخط الآخر- وانقسمت الحلقة إلى قسمين، بحيث قد تتمكن من رؤية المكان الذي انقسمت فيه الخطوط الأسمك في أماكن معينة. حدد خط بيزية الآخر، ثم اضغط على Shift وحدد الحلقة الأكبر، بعد ذلك اختر قائمة عنصر، ثم أدوات المسار، ثم قصّ المضلع مرةً أخرى. وبهذا تكون قد قُسِّمت الحلقتان إلى "أنصاف أنابيب"، حيث نقلناها قليلًا في الشكل التالي لتتمكن من رؤيتها، ولكن لا تفعل ذلك. يجب الآن تقسيمها مرةً أخرى: ارسم خط بيزية آخر كما فعلت سابقًا ولكن اجعله أفقيًا ويمر من منتصف أنصاف الأنابيب. اختر قائمة عنصر ثم مضاعفة/تحويل ثم نسخ مطابقة مرةً أخرى للحصول على خط آخر. حدّد أحد خطوط بيزية وأحد أنصاف الأنابيب اليمنى واستخدم عملية قص المضلع مرةً أخرى. افعل الشيء نفسه مع خط بيزية الآخر ونصف الأنبوب الأيمن الآخر. يمكنك محاولة إجراء عملية "القص" سريعًا عن طريق رسم شكل "L" بدلًا من استخدام خطين مستقيمين، ولكن قد تجد مع هذه الطريقة أن الحصول على محاذاة مركزية صحيحة أمر صعب، لكن يمكنك المحاولة رغم ذلك. يجب الحصول الآن على نصف أنبوب على اليسار وربع أنبوب على اليمين، حيث نقلناهم قليلًا في الشكل التالي لتتمكّن من رؤيتهم. تجميع الأجزاء مع بعضها البعض يمكنك الآن حذف أنصاف الأنابيب اليسرى والمجموعة السفلية من أرباع الأنابيب لأنها ليست ضرورية. ارسم دائرةً صغيرةً بعرض وارتفاع 16 نقطة مثلًا. حدّد الدائرة وكلًا من ربعي الأنبوب، واستخدم نافذة Align & Distribute لمحاذاتهم إلى الجانب الأيسر والأسفل. أعطِ الدائرة والأرباع لون خط "لا شيء" ولون تعبئة أبيض. اجمعهم مع بعضهم البعض ليسهل تحريكهم. حرِّك الأشكال البيضاء إلى فوق المربعات المستديرة الأصلية. يمكنك استخدام نافذة Align & Distribute للحصول على تموضع سريع أو قد ترغب في وضعها يدويًا. الخلاصة يجب الآن الحصول على الشكل التالي، وبذلك نكون قد أنهينا العمل. صحيح أن هذا قد كان ذلك عملًا كثيرًا لشيء بسيط جدًا ولكن نأمل تكوين فكرةً جيدةً لك الآن عن كيفية عمل بعض وظائف برنامج سكريبوس، وهذا هو الشيء الرئيسي. ترجمة -وبتصرّف- للمقال How to create an RSS Feed Symbol. اقرأ أيضًا كيفية بدء استخدام برنامج سكريبوس Scribus كيفية إنشاء شارة تقليدية ذات شريط في برنامج سكريبوس Scribus خطوات تطوير شعار باستخدام برنامج سكريبوس Scribus كيفية إنشاء الظلال في برنامج سكريبوس Scribus الطريقة الأساسية لترقيم العناصر تسلسليا في برنامج سكريبوس Scribus
  13. كانت معظم التطبيقات معنيّةً بنقل الملفات في الأيام الأولى من تقنيات تبديل الرزم، على الرغم من أنه في وقت مبكر من عام 1981، كانت التجارب جاريةً لنقل حركة المرور في الوقت الحقيقي، مثل عينات الصوت الرقمية. نطلق على التطبيق صفة "الوقت الحقيقي" عندما يكون لديه متطلبات قوية لتسليم المعلومات في الوقت المناسب. يُعَد بروتوكول Voice over IP أو اختصارًا VoIP مثالًا كلاسيكيًا لتطبيق الوقت الحقيقي لأنه لا يمكنك إجراء محادثة بسهولة مع شخص إذا استغرق الأمر أكثر من جزء من الثانية للحصول على رد. تفرُض تطبيقات الوقت الحقيقي بعض المتطلبات المحدَّدة على بروتوكول النقل التي لم تلبيها جيدًا البروتوكولات التي ناقشناها سابقًا. تُقسم تطبيقات الوسائط المتعددة، التي تتضمن الفيديو والصوت والبيانات، إلى فئتين: التطبيقات التفاعلية interactive applications وتطبيقات التدفق streaming applications. يظهر الشكل السابق مؤلفَي السلسلة اللذين يستخدمان نموذجًا لأداة مؤتمرات نموذجية للصف التفاعلي. هذه هي أنواع التطبيقات الأكثر صرامة في الوقت الحقيقي إلى جانب بروتوكول VoIP. تقدم تطبيقات التدفق عادةً تدفقًا صوتيًا أو تدفق فيديو من خادمٍ إلى عميل وتتميز بمُنتجات تجارية مثل Spotify. أصبح تدفق الفيديو، مثل YouTube و Netflix، أحد الأشكال السائدة لحركة المرور على الإنترنت. تضع تطبيقات التدفق متطلباتٍ في الوقت الحقيقي أقل صرامةً إلى حدٍ ما على البروتوكولات الأساسية نظرًا لأنها تفتقر إلى التفاعل بين البشر. لا يزال التوقيت مهمًا على الرغم من ذلك، فقد تريد على سبيل المثال أن يبدأ تشغيل مقطع فيديو بعد الضغط على "تشغيل play"، وبمجرد أن يبدأ التشغيل، فإن الرزم المتأخرة إما ستؤدي إلى تباطئه أو إنشاء نوع من التدهور البصري visual degradation. لذلك وعلى الرغم من أن تطبيقات التدفق ليست تمامًا في الوقت الحقيقي، ولكن لا يزال لديها ما يكفي من القواسم المشتركة مع تطبيقات الوسائط المتعددة التفاعلية لضمان النظر في بروتوكولٍ مشترك لكلا النوعين من التطبيقات. يجب أن يكون واضحًا الآن أن مصممي بروتوكول النقل لتطبيقات الوقت الحقيقي والوسائط المتعددة يواجهون تحديًا حقيقيًا في تحديد المتطلبات على نطاق واسع بما يكفي لتلبية احتياجات التطبيقات المختلفة للغاية. يجب عليهم أيضًا الانتباه إلى التفاعلات بين التطبيقات المختلفة، مثل مزامنة تدفقات الصوت والفيديو. سنرى أدناه كيف أثرت هذه المخاوف على تصميم بروتوكول النقل الأساسي في الوقت الحقيقي المُستخدم اليوم وهو: بروتوكول النقل في الوقت الحقيقي Real-time Transport Protocol أو اختصارًا RTP. يُستمد الكثير من RTP في الواقع من وظائف البروتوكول التي كانت مضمَّنةً في الأصل في التطبيق نفسه. كان اثنان من أوائل هذه التطبيقات هما تطبيقَي VIC و VAT، حيث يدعم الأول الفيديو في الوقت الحقيقي ويدعم الآخر الصوت في الوقت الحقيقي. شُغِّل كلا التطبيقين في الأصل مباشرة عبر بروتوكول UDP، بينما اكتشف المصممون الميزات اللازمة للتعامل مع طبيعة الاتصال في الوقت الحقيقي، وأدركوا لاحقًا أن هذه الميزات يمكن أن تكون مفيدة للعديد من التطبيقات الأخرى وعرّفوا بروتوكولًا بهذه الميزات، ثم جرى توحيد هذا البروتوكول في النهاية كبروتوكول RTP. يمكن تشغيل RTP عبر العديد من بروتوكولات الطبقة الدنيا، ولكنه لا يزال يعمل بشكل شائع عبر بروتوكول UDP. وهذا يؤدي إلى مكدس البروتوكول الموضح في الشكل التالي، حيث نلاحظ تشغيل بروتوكول نقل فوق بروتوكول نقل. لا توجد قاعدة مخالفة لذلك، نظرًا لأن بروتوكول UDP يوفّر مثل هذا المستوى الأدنى من الوظائف، كما أن فك تعدد الإرسال الأساسي المستند إلى أرقام المنافذ هو بالضبط ما يحتاجه بروتوكول RTP كنقطة بداية. لذلك يستعين RTP بمصادر خارجية لوظيفة فك تعدد الإرسال demultiplexing إلى UDP بدلًا من إعادة إنشاء أرقام المنافذ في RTP. متطلبات بروتوكول RTP إن أكثر المتطلبات الأساسية لبروتوكول الوسائط المتعددة للأغراض العامة هو أنه يسمح للتطبيقات المتماثلة بالتفاعل مع بعضها بعضًا. ينبغي أن يكون من الممكن لتطبيقين لعقد المؤتمرات الصوتية مطبَّقَين بصورة مستقلة التحدثَ مع بعضهما البعض على سبيل المثال. يشير هذا على الفور إلى أنه كان من الأفضل للتطبيقات استخدام نفس طريقة تشفير وضغط الصوت، وإلا فإن البيانات المرسلة من طرفٍ واحد ستكون غير مفهومة للطرف المستقبل. سيكون استخدام مخططٍ واحد فقط فكرة سيئة نظرًا لوجود عددٍ كبير من أنظمة تشفير الصوت المختلفة، ولكلٍ منها مقايضاتٌ خاصة بها بين الجودة ومتطلبات حيز النطاق التراسلي bandwidth والتكلفة الحسابية، ويجب بدلًا من ذلك أن يوفر بروتوكولنا طريقةً تمكّن المرسل من إخبار جهاز الاستقبال بنظام التشفير الذي يريد استخدامه، وربما التفاوض إلى أن يتم تحديد مخطط متاح لكلا الطرفين. هناك العديد من أنظمة ترميز الفيديو المختلفة كما هو الحال مع الصوت أيضًا، وبالتالي نرى أن الوظيفة المشتركة الأولى التي يمكن أن يوفرها RTP هي القدرة على التواصل لاختيار مخطط التشفير هذا. كما يعمل أيضًا على تحديد نوع التطبيق (الصوت أو الفيديو على سبيل المثال)، فبمجرد أن نعرف ما هي خوارزمية التشفير المستخدَمة، فإننا نعرف نوع البيانات المُشفَّرة أيضًا. تمكين مستقبل تدفق البيانات من تحديد علاقة التوقيت بين البيانات المستلمة مطلبٌ مهم آخر. حيث تحتاج تطبيقات الوقت الحقيقي إلى وضع البيانات المستلمة في مخزن تشغيلٍ مؤقت playback buffer لتخفيف الاضطراب jitter الذي قد يكون أُدخِل في تدفق البيانات أثناء النقل عبر الشبكة. وبالتالي سيكون من الضروري وجود نوعٍ من استخدام العلامات الزمنية timestamping للبيانات لتمكين المستقبل من إعادة تشغيلها في الوقت المناسب. تتعلق مسألة توقيت تدفق وسائطٍ واحد بمزامنة الوسائط المتعددة في مؤتمر، والمثال الواضح على ذلك هو مزامنة تدفق الصوت والفيديو الذي ينشأ من نفس المرسل، وهذه مشكلة أعقد قليلًا من تحديد وقت تشغيل تدفقٍ واحد كما سنرى أدناه. يجب توفير وظيفة أخرى وهي الإشارة إلى فقدان رزمة. لاحظ أن التطبيق الذي له حدود وقت استجابةٍ ضيقة لا يمكنه عمومًا استخدام وسيلة نقل موثوقة مثل TCP لأن إعادة إرسال البيانات لتصحيح الخسارة قد يتسبب في وصول الرزمة بعد فوات الأوان لتكون مفيدة. وبالتالي يجب أن يكون التطبيق قادرًا على التعامل مع الرزم المفقودة، والخطوة الأولى في التعامل معها هي ملاحظة أنها مفقودة بالفعل. قد يتخذ تطبيق الفيديو الذي يستخدم تشفير MPEG إجراءاتٍ مختلفة عند فقدان رزمة، اعتمادًا على ما إذا كانت الحزمة تأتي من إطار I أو من إطار B أو من إطار P على سبيل المثال. يُعَد فقدان الرزم أيضًا مؤشرًا محتملًا للازدحام. تفوّت تطبيقات الوسائط المتعددة أيضًا ميزات تجنب الازدحام في TCP نظرًا لأنها لا تعمل عبر TCP. ولكن العديد من تطبيقات الوسائط المتعددة قادرةٌ على الاستجابة للازدحام، مثل تغيير معاملات خوارزمية التشفير لتقليل حيز نطاق التراسلي المُستهلك. يحتاج المستقبِل، لإنجاز هذا العمل، إلى إعلام المرسل بحدوث فقدانٍ في الرزم حتى يتمكن المرسل من ضبط معاملات التشفير الخاصة به. وظيفةٌ أخرى مشتركة بين تطبيقات الوسائط المتعددة هي مفهوم بيان حدود الإطار، والإطار في هذا السياق خاصٌ بالتطبيق. فقد يكون من المفيد إعلام تطبيق فيديو أن مجموعةً معينة من الرزم تتوافق مع إطار واحد على سبيل المثال. من المفيد في تطبيقٍ صوتي تحديد بداية مجموعة من الأصوات أو الكلمات المتبوعة بالصمت والتي تُعرَف بـ "talkspurt". يمكن للمتلقي بعد ذلك تحديد فترات الصمت بين talkspurt واستخدامها كفرص لتحريك نقطة التشغيل. يتبع ذلك ملاحظة أن الاختصار الطفيف أو إطالة الفراغات بين الكلمات أمرٌ غير محسوس للمستخدمين، في حين أن تقصير أو إطالة الكلمات نفسها أمرٌ محسوس ومزعج. الوظيفة النهائية التي قد نرغب في وضعها في البروتوكول هي طريقةٌ ما لتحديد المرسلين أسهل استخدامًا من عنوان IP. فيمكن أن تعرض تطبيقات المؤتمرات الصوتية والمرئية سلاسلًا مثل تلك الموجودة على لوحات التحكم الخاصة بها، وبالتالي يجب أن يدعم بروتوكول التطبيق ارتباط هذه السلسلة بتدفق البيانات. ونلاحظ متطلبًا إضافيًا ألا وهو: يجب استخدام حيز النطاق التراسلي بكفاءة معقولة. أي لا نريد تقديم الكثير من البتات الإضافية الواجب إرسالها مع كل رزمة في هيئة ترويسةٍ طويلة، والسبب في ذلك هو أن الرزم الصوتية، والتي تعَد واحدةً من أكثر أنواع بيانات الوسائط المتعددة شيوعًا، تميل إلى أن تكون صغيرة، وذلك لتقليل الوقت المستغرق لملء هذه الرزم الصوتية بالعينات. قد تعني رزم الصوت الطويلة زمن استجابةٍ مرتفع بسبب عملية الحزم packetization، مما يؤثر سلبًا على جودة المحادثات المحسوسة (كان هذا أحد العوامل في اختيار طول خلايا ATM). تعني الترويسة الكبيرة استخدام قدرٍ كبير نسبيًا من حيز نطاق الرابط التراسلي بواسطة الترويسات نظرًا لأن رزم البيانات نفسها قصيرة، وبالتالي تقليل السعة المتاحة للبيانات المفيدة. سنرى العديد من جوانب تصميم RTP التي تأثرت بضرورة إبقاء الترويسة قصيرةً. يمكنك أن تناقش فيما إذا كانت كل ميزة وُصِفت للتو تحتاج حقًا إلى أن تكون في بروتوكول نقلٍ في الوقت الحقيقي، وربما تجد بعض الميزات الأخرى الممكن إضافتها. الفكرة الأساسية هنا هي تسهيل الحياة لمطوّري التطبيقات من خلال منحهم مجموعة مفيدة من الأفكار المجردة وتوفير لبِنات بناء تطبيقاتهم، حيث نوفّر على كل مطور تطبيق في الوقت الحقيقي من اختراع تطبيقه الخاص من خلال وضع آلية علامة زمنية في بروتوكول RTP على سبيل المثال، ونزيد أيضًا من فرص تشغيل تطبيقين مختلفين في الوقت الحقيقي. تصميم بروتوكول RTP الآن وقد رأينا القائمة الطويلة إلى حدٍ ما من متطلبات بروتوكول النقل للوسائط المتعددة، ننتقل إلى تفاصيل البروتوكول الذي حُدِّد لتلبية هذه المتطلبات. طُوِّر بروتوكول RTP في منظمة IETF وهو قيد الاستخدام على نطاق واسع. يحدد معيار RTP بالفعل زوجًا من البروتوكولات، بروتوكول RTP وبروتوكول التحكم في النقل في الوقت الحقيقي Real-time Transport Control Protocol أو اختصارًا RTCP. يُستخدَم البروتوكول الأول لتبادل بيانات الوسائط المتعددة، بينما يُستخدَم البروتوكول الأخير لإرسال معلومات التحكم المرتبطة بتدفق بياناتٍ معين دوريًا. يستخدم تدفق بيانات RTP وتدفق تحكم RTCP المرتبط منافذ طبقة النقل المتتالية عند التشغيل عبر بروتوكول UDP. تستخدم بيانات RTP رقم منفذٍ زوجي وتستخدم معلومات تحكم RTCP رقم المنفذ التالي الأعلى الفردي. إن بروتوكول RTP مصمَّمٌ لدعم مجموعةٍ متنوعة من التطبيقات، فهو يوفّر آليةً مرنة يمكن من خلالها تطوير تطبيقاتٍ جديدة دون إجراء مراجعة متكررة لبروتوكول RTP نفسه. يحدد بروتوكول RTP لكل صنفٍ من أصناف التطبيقات (الصوت مثلًا) ملفَّ تعريفٍ profile وتنسيقًا واحدًا format أو أكثر. يوفّر ملف التعريف مجموعة من المعلومات تضمن فهمًا مشتركًا للحقول الموجودة في ترويسة RTP لصنف التطبيق هذا، كما سيتضح عندما نفحص الترويسة بالتفصيل. تشرح مواصفات التنسيق كيفية تفسير البيانات التي تتبع ترويسة RTP. قد يتبع ترويسة RTP سلسلةٌ من البايتات على سبيل المثال، ويمثل كلٌّ منها عينةً صوتية واحدة مأخوذة بفاصل زمني محدد بعد الفاصل الزمني السابق. قد يكون تنسيق البيانات أعقد من ذلك، حيث يحتاج تدفق الفيديو المشفر بتنسيق MPEG، على سبيل المثال، إلى بنية كبيرة لتمثيل جميع أنواع المعلومات المختلفة. يجسّد تصميم RTP مبدأً معماريًا يُعرف باسم تأطير مستوى التطبيق Application Level Framing أو اختصارًا ALF. طرح هذا المبدأ كلٌّ من كلارك Clark وتنينهاوس Tennenhouse في عام 1990 كطريقة جديدة لتصميم بروتوكولات لتطبيقات الوسائط المتعددة الناشئة. وقد أدركا أنه من غير المرجح تقديم هذه التطبيقات الجديدة جيدًا من خلال البروتوكولات الحالية مثل بروتوكول TCP، وأنها قد لا تقدَّم جيدًا من خلال أي بروتوكول من النوع "مقاس واحد يناسب الجميع". يكمن في قلب هذا المبدأ الاعتقاد بأن التطبيق يفهم احتياجاته الخاصة بصورةٍ أفضل، حيث يعرف تطبيق فيديو MPEG على سبيل المثال أفضل السبل لاستعادة الإطارات المفقودة وكيفية الاستجابة بصورةٍ مختلفة في حالة فقدان إطار I أو إطار B. يفهم نفس التطبيق أيضًا أفضل طريقة لتقسيم البيانات من أجل إرسالها، فمن الأفضل على سبيل المثال إرسال البيانات من إطارات مختلفة في مخططات بيانات مختلفة، بحيث لا تؤدي الرزمة المفقودة إلا إلى إتلاف إطارٍ واحد، وليس إطارَين، لذلك يترك بروتوكول RTP الكثير من تفاصيل البروتوكول لملف التعريف ووثائق التنسيق الخاصة بالتطبيق. صيغة الترويسة يوضح الشكل التالي صيغة الترويسة التي يستخدمها بروتوكول RTP. تكون أول 12 بايتًا موجودةً دائمًا، بينما تُستخدَم معرّفاتُ المصدرِ المشاركة في حالات معينة فقط. قد يكون هناك ترويسات لإضافات اختيارية بعد هذه الترويسة، كما هو موضح أدناه. أخيرًا، يتبع الترويسةَ حمولةُ RTP، والتي يحدّد التطبيق صيغتها. القصد من هذه الترويسة هو أن تحتوي فقط على الحقول المحتمل أن تستخدمها عدّة تطبيقات مختلفة، نظرًا لأن أي شيء خاص جدًا بتطبيقٍ معين سيُنقَل بكفاءة أكبر في حمولة RTP لهذا التطبيق فقط. يشير أول بتين إلى معرّف الإصدار version identifier، والذي يحتوي على القيمة 2 في إصدار RTP المنشور وقت كتابة هذه السلسلة بنسختها الإنجليزية. قد تعتقد أن مصممي البروتوكول كانوا جريئين إلى حد ما للاعتقاد بأن 2 بت ستكون كافية لاحتواء جميع الإصدارات المستقبلية من RTP، لكن تذكر أن هذه البتات موجودةٌ في أعلى ترويسة RTP. إن استخدام ملفات تعريف التطبيقات المختلفة يجعل من غير المرجح أن تكون هناك حاجة إلى العديد من المراجعات لبروتوكول RTP الأساسي، ولكن إذا اتضح أن هناك حاجة إلى إصدار آخر من RTP بخلاف الإصدار 2، فمن الممكن التفكير في تغيير صيغة الترويسة بحيث يكون من الممكن وجود أكثر من إصدارٍ مستقبلي. يمكن أن تحتوي ترويسة RTP الجديدة ذات القيمة 3 في حقل الإصدار على حقل "التخريب subversion" في مكان آخر في الترويسة على سبيل المثال. البت التالي هو بت الحاشية padding أو P، والتي تُضبَط في ظروفٍ تكون فيها حمولة RTP محشوَّةً لسببٍ ما. قد تكون بيانات RTP محشوَّةً لملء كتلة بحجم معين كما هو مطلوب بواسطة خوارزمية تشفير على سبيل المثال. ففي مثل هذه الحالة، سيُنقَل الطول الكامل لترويسة RTP والبيانات والحاشية بواسطة ترويسة بروتوكول الطبقة الدنيا (ترويسة UDP مثلًا)، وسيحتوي البايت الأخير من الحاشية على عدد البايتات التي يجب تجاهلها، وهذا موضح في الشكل الآتي. لاحظ أن طريقة الحشو هذه تزيل أي حاجةٍ إلى حقل طولٍ في ترويسة RTP، وبالتالي يخدم هدف إبقاء الترويسة قصيرةً، حيث يُستنتَج الطول من بروتوكول الطبقة الدنيا في الحالة الشائعة لعدم وجود حاشية. يُستخدم بت التوسّع extension أو X للإشارة إلى وجود ترويسة توسّع، والذي سيُحدَّد لتطبيقٍ معين ويتبع الترويسة الرئيسية. نادرًا ما تُستخدم هذه الترويسات، نظرًا لأنه من الممكن عمومًا تحديد ترويسةٍ خاصة بالحمولة كجزءٍ من تعريف صيغة حمولة تطبيقٍ معين. يتبع البت X حقلٌ مؤلفٌ من 4 بتات يحسب عدد المصادر المشاركة contributing sources، إن وجدت في الترويسة. لاحظنا أعلاه الحاجة المتكررة لنوع من تحديد الإطار، حيث يُوفَّر ذلك من خلال بت العلامة، الذي له استخدامٌ خاص بالملف التعريفي، ويمكن ضبط هذا البت في بداية talkpurt بالنسبة للتطبيق الصوتي على سبيل المثال. ثم حقل نوع الحمولة المؤلف من 7 بتات، حيث يشير إلى نوع بيانات الوسائط المتعددة التي تحملها هذه الرزمة. ويتمثل أحد الاستخدامات المحتملة لهذا الحقل في تمكين التطبيق من التبديل من مخطط تشفيرٍ إلى آخر بناءً على معلوماتٍ حول توفُّر الموارد في الشبكة أو ردًا على جودة التطبيق. يُحدَّد الاستخدام الدقيق لنوع الحمولة أيضًا بواسطة ملف تعريف التطبيق. لاحظ عدم استخدام نوع الحمولة النافعة عمومُا مثل مفتاح لإزالة تعدد الإرسال لتوجيه البيانات إلى تطبيقات مختلفة، أو إلى تدفقات مختلفة داخل تطبيق واحد مثل دفق الصوت والفيديو لمؤتمرات فيديو، ويعود السبب بذلك إلى أن إزالة تعدد الإرسال تُوفَّر عادةً في طبقة سفلية بواسطة بروتوكول UDP على سبيل المثال كما هو موضح سابقًا، وبالتالي فإن دفقين للوسائط باستخدام RTP يستخدمان عادةً أرقام منافذ UDP مختلفة. يُستخدَم الرقم التسلسلي لتمكين مستقبل تدفق RTP من اكتشاف الرزم المفقودة وغير المرتبة، حيث يزيد المرسل ببساطة القيمة بمقدار واحد لكل رزمةٍ مرسلة. لاحظ أن RTP لا يفعل أي شيء عندما يكتشف رزمةً مفقودة على عكس بروتوكول TCP الذي يصحح الفقدان عن طريق إعادة الإرسال، ويفسر هذا الفقدان على أنه مؤشر ازدحام مما قد يؤدي إلى تقليل حجم النافذة، وهنا يُترك للتطبيق بدلًا من ذلك أن يقرر ما يجب فعله عند فقد الرزمة لأن هذا القرار من المرجح أن يعتمد بصورةٍ كبيرة على التطبيق، فقد يقرر تطبيق الفيديو أن أفضل ما يمكن فعله عند فقدان رزمة هو إعادة تشغيل آخر إطار اُستلِم بصورةٍ صحيحة على سبيل المثال. قد تقرر بعض التطبيقات أيضًا تعديل خوارزميات التشفير الخاصة بها لتقليل احتياجات حيز النطاق التراسلي استجابةً لهذه الخسارة، ولكن هذه ليست وظيفة بروتوكول RTP. لن يكون من المعقول أن يقرر RTP بتوجُّب تخفيض معدل الإرسال، لأن هذا قد يجعل التطبيق عديم الفائدة. تتمثل وظيفة حقل الطابع الزمني في تمكين جهاز الاستقبال من تشغيل العينات على فترات زمنية مناسبة وتمكين تزامن تدفقات الوسائط المختلفة. نظرًا لأن التطبيقات المختلفة قد تتطلب مستويات مختلفة من دقة التوقيت، فإن RTP نفسها لا تحدد الوحدات التي يُقاس فيها الوقت. بدلاً من ذلك، فإن الطابع الزمني هو مجرد عداد "لحظات الساعة ticks"، حيث يعتمد الوقت بين هذه اللحظات على الترميز المستخدم. على سبيل المثال ، يمكن لتطبيق صوتي يأخذ عينات البيانات مرة واحدة كل 125 ميكرو ثانية استخدام هذه القيمة كدِقة ساعة. دقة الساعة هي أحد التفاصيل المحددة في ملف تعريف RTP أو تنسيق الحمولة لتطبيق ما. قيمة العلامة الزمنية في الرزمة هي رقمٌ يمثل الوقت الذي جرى فيه إنشاء العينة الأولى في الرزمة. لا تمثِّل العلامة الزمنية انعكاسًا لوقت اليوم، حيث أن الاختلافات بين العلامات الزمنية ذات صلة فقط. إذا كان الفاصل الزمني لأخذ العينات هو 125 ميكرو ثانية على سبيل المثال وأُنشئَت العينة الأولى في الرزمة رقم n + 1 بعد 10 ميلي ثانية من العينة الأولى في الرزمة رقم n، فإن عدد لحظات أخذ العينات بين هاتين العينتين هو: TimeBetweenPackets الوقت بين الرزم / TimePerSample وقت كل عينة = (10 × 10-3) / (125 × 10-6) = 80 بافتراض دقة الساعة هي نفس الفاصل الزمني لأخذ العينات، فإن العلامة الزمنية في الرزمة n + 1 ستكون أكبر من تلك في الرزمة n بمقدار 80. لاحظ إمكانية إرسال أقل من 80 عينة بسبب تقنيات الضغط مثل اكتشاف فترات الصمت، ولكن العلامة الزمنية تسمح للمستقبل بإعادة تشغيل العينات بالعلاقة الزمنية الصحيحة. مصدر المزامنة synchronization source أو اختصارًا SSRC هو رقمٌ مؤلف من 32 بتًا يحدد بشكل فريد مصدرًا واحدًا لتدفق RTP. يختار كل مرسلٍ مصدر مزامنة عشوائيًا في مؤتمر وسائط متعددة معين ويتوقع منه حل التعارضات في الحدث غير المحتمل الذي يختار فيه مصدران نفس القيمة. يضمن بروتوكول RTP الاستقلال عن بروتوكول الطبقة الدنيا من خلال جعل معرّف المصدر شيئًا آخر مختلفًا عن عنوان الشبكة أو عنوان النقل الخاص بالمصدر. كما أنه يمكّن عقدةً واحدة ذات مصادر متعددة (عدة كاميرات مثلًا) من التمييز بين تلك المصادر. ليس مطلوبًا استخدام نفس SSRC في كل تدفق عندما تولد عقدة واحدة تدفقات وسائط مختلفة (الصوت والفيديو على سبيل المثال)، إذ توجد آليات في RTCP (الموضحة أدناه) للسماح بمزامنة الوسائط. يُستخدَم المصدر المشارك contributing source أو CSRC فقط عند مرور عدد من تدفقات RTP عبر مازجٍ mixer. يمكن استخدام المازج لتقليل متطلبات حيز النطاق التراسلي لمؤتمرٍ من خلال استقبال البيانات من عدة مصادر وإرسالها كتدفقٍ واحد. يمكن فك تشفير تدفقات الصوت من عدة مكبرات صوت متزامنة وإعادة تشفيرها على أنها تدفق صوتي واحد على سبيل المثال، وفي هذه الحالة، يحدّد المازج نفسه كمصدر للتزامن ولكنه يحدد أيضًا المصادر المشاركة أي قيم SSRC للمتحدثين الذين شاركوا في الرزمة المعنية. بروتوكول التحكم Control Protocol يوفر بروتوكول RTCP تدفق تحكم مرتبط بتدفق بيانات تطبيق وسائط متعددة. يوفر تدفق التحكم هذا ثلاث وظائف رئيسية: ملاحظاتٍ على أداء التطبيق والشبكة. طريقةً لربط ومزامنة تدفقات الوسائط المختلفة التي تأتي من نفس المرسل. طريقةً لنقل هوية المرسل لعرضها على واجهة المستخدم. قد تكون الوظيفة الأولى مفيدة في اكتشاف الازدحام والاستجابة له. بعض التطبيقات قادرة على العمل بمعدلات مختلفة وقد تستخدم بيانات الأداء لاتخاذ قرار باستخدام نظام ضغط أقوى لتقليل الازدحام على سبيل المثال، أو لإرسال تدفق عالي الجودة عندما يكون هناك ازدحام ضئيل. يمكن أن تكون ملاحظات الأداء مفيدة أيضًا في تشخيص مشاكل الشبكة. قد تعتقد أن الوظيفة الثانية يتم يوفّرها بالفعل معرّف مصدر المزامنة SSRC الخاص ببروتوكول RTP، ولكنها في الحقيقة ليست كذلك. قد تحتوي الكاميرات المتعددة من عقدة واحدة على قيم SSRC مختلفة، ولا يوجد شرطٌ بأن يستخدم تدفق الصوت والفيديو من نفس العقدة نفس SSRC، فقد يكون من الضروري تغيير قيمة SSRC للتدفق نظرًا لاحتمال حدوث تضارب في قيم SSRC. للتعامل مع هذه المشكلة، يستخدم بروتوكول RTCP مفهوم الاسم المتعارف عليه canonical name أو اختصارًا CNAME الذي يُسنَد لمرسل، والذي يرتبط بعد ذلك بقيم SSRC المختلفة التي يمكن أن يستخدمها هذا المرسل باتّباع آليات RTCP. ربط تدفقين هو ببساطة جزءٌ من مشكلة مزامنة الوسائط فقط. يجب أن تكون هناك طريقةٌ لمزامنة التدفقات بدقة مع بعضها بعضًا نظرًا لأن التدفقات المختلفة قد تحتوي على ساعات مختلفة تمامًا وبدّقات granularities وجودة مختلفة وحتى بمقادير مختلفة من عدم الدقة inaccuracy أو الانزياح drift. يعالج بروتوكول RTCP هذه المشكلة عن طريق نقل معلومات التوقيت التي تربط الوقت الحقيقي من اليوم بالعلامات الزمنية المعتمدة على معدل الساعة والتي تُحمَل في رزم بيانات RTP. يحدد بروتوكول RTCP عددًا من أنواع الرزم المختلفة مثل: تقارير المرسل، والتي تمكّن المرسلين النشطين في جلسة من الإبلاغ عن إحصائيات الإرسال والاستقبال. تقارير المستقبِل، والتي يستخدمها المستقبلون الذين ليسوا مرسلين للإبلاغ عن إحصائيات الاستقبال. أوصاف المصدر، والتي تتضمن ملفات CNAME ومعلومات وصف المرسل الأخرى. رزم التحكم الخاصة بالتطبيق. تُرسَل أنواع رزم RTCP المختلفة هذه عبر بروتوكول الطبقة الدنيا، والذي، كما لاحظنا، عادةً ما يكون بروتوكول UDP. يمكن وضع العديد من رزم RTCP في PDU واحد لبروتوكول المستوى الأدنى. يجب إرسال رزمتَي RTCP على الأقل في كل PDU بمستوى أدنى: رزمةٌ هي رزمة تقرير، والأخرى هي رزمة وصف المصدر. قد تُضمَّن رزمٌ أخرى حتى الوصول إلى حدود الحجم المفروضة من قِبل بروتوكولات الطبقة الدنيا. نلاحظ أن هناك مشكلة محتملة مع كل عضو في مجموعة الإرسال المتعدد الذي يرسل حركة مرور تحكمٍ دورية. إذا لم نتخذ بعض الخطوات للحد من ذلك، فمن المحتمل أن تكون حركة مرور التحكم هذه مستهلكًا مهمًا لحيز النطاق التراسلي. لا يُحتمل أن يرسل أكثر من مرسلَين أو ثلاثة بياناتٍ صوتية في أي لحظة في مؤتمر صوتي على سبيل المثال، حيث لا فائدة من تحدث الجميع في آنٍ واحد، ولكن لا يوجد مثل هذا الحد الاجتماعي على كل شخصٍ يرسل حركة مرور تحكمٍ، وقد تكون هذه مشكلة خطيرة في مؤتمر يحضره الآلاف من المشاركين. فللتعامل مع هذه المشكلة، يكون لدى بروتوكول RTCP مجموعة من الآليات التي يقلّل المشاركون من خلالها من تكرار تقاريرهم مع زيادة عدد المشاركين. هذه القواعد معقدةٌ إلى حدٍ ما، لكن الهدف الأساسي هو: حدُّ كمية حركة RTCP الإجمالية إلى نسبةٍ صغيرة (عادةً 5%) من حركة بيانات RTP. لتحقيق هذا الهدف، يجب أن يعرف المشاركون مقدار حيز نطاق البيانات التراسلي المُحتمَل استخدامه (مقدار إرسال ثلاثة تدفقات صوتية على سبيل المثال) مع معرفة عدد المشاركين. يتعلّم المشاركون حيز نطاق البيانات التراسلي المُحتمَل استخدامه من وسائل خارج RTP، والمعروفة باسم إدارة الجلسة session management التي سنناقشها لاحقًا، ويتعلمون عدد المشاركين من تقارير RTCP للمشاركين الآخرين. قد يكون من الممكن فقط الحصول على عدد تقريبي للعدد الحالي للمستقبلين نظرًا لأنه قد تُرسَل تقارير RTCP بمعدلٍ منخفض جدًا، ولكن هذا عادةً يكون كافيًا. يوصَى أيضًا بتخصيص المزيد من حيز نطاق RTCP التراسلي للمرسلين النشطين، على افتراض أن معظم المشاركين يرغبون في رؤية تقارير منهم، لمعرفة مَن يتحدث على سبيل المثال. بمجرد أن يحدّد المشارك مقدار حيز النطاق التراسلي الممكن استهلاكه مع حركة مرور RTCP، يبدأ في إرسال تقارير دورية بالمعدل المناسب. تختلف تقارير المرسل وتقارير المستقبل فقط من حيث أن الأولى تتضمن بعض المعلومات الإضافية حول المرسل. يحتوي كلا النوعين من التقارير على معلومات حول البيانات المُستقبلة من جميع المصادر في أحدث فترة إبلاغ. تتكون المعلومات الإضافية في تقرير المرسل من: علامة زمنية تحتوي على الوقت الحقيقي من اليوم الذي أُنشئ فيه هذا التقرير. علامة RTP الزمنية المقابلة للوقت الذي أُنشئ فيه هذا التقرير. الأعداد التراكمية للرزم والبايتات التي أرسلها هذا المرسل منذ أن بدأ الإرسال. نلاحظ إمكانية استخدام الكميتين الأوليتين لِتفعيل مزامنة تدفقات الوسائط المختلفة من نفس المصدر، حتى إذا كانت تلك التدفقات تستخدم مستويات مختلفة من دقة الساعة في تدفقات بيانات RTP الخاصة بها، حيث أنها تعطي المفتاح لتحويل الوقت من اليوم إلى علامات RTP الزمنية. تحتوي كلٌّ من تقارير المرسل والمستقبل على كتلة واحدة من البيانات لكل مصدرٍ سُمِع منه منذ التقرير الأخير. تحتوي كل كتلة على الإحصائيات التالية للمصدر المعني: SSRC الخاص به. جزء رزم البيانات من هذا المصدر التي فُقِدت منذ إرسال التقرير الأخير (يُحسَب بموازنة عدد الرزم المستقبَلة مع عدد الرزم المتوقعة، ويمكن تحديد هذه القيمة الأخيرة من أرقام RTP التسلسلية). إجمالي عدد الرزم المفقودة من هذا المصدر منذ أول مرة سُمِع من هذا المصدر. أعلى رقم تسلسلي اُستلِم من هذا المصدر (يتوسّع إلى 32 بتًا لحساب التفاف الرقم التسلسلي). الاضطراب jitter الداخلي التقديري للمصدر (محسوب بموازنة التباعد بين الرزم المستقبَلة مع التباعد المتوقَّع في وقت الإرسال). آخر علامة زمنية فعلية مستلمة عبر بروتوكول RTCP لهذا المصدر. التأخير منذ استقبال آخر تقرير مرسل عبر بروتوكول RTCP لهذا المصدر. يمكن لمستقبِلي هذه المعلومات أن يتعلّموا كل أنواع حالة الجلسة. فيمكنهم معرفة ما إذا كان المستقبلون الآخرون يحصلون على جودة أفضل بكثير من الجودة التي يحصلون عليها من بعض المرسلين، مما قد يكون مؤشرًا على ضرورة إجراء حجزٍ للموارد، أو أن هناك مشكلة في الشبكة تحتاج إلى الاهتمام بها. إذا لاحظ المرسل معاناة العديد من المستقبلين من خسارةٍ كبيرة في رِزمهم، فقد يقرر بوجوب تقليل معدل الإرسال أو استخدام مخطط تشفير أكثر مقاومةً للخسارة. الجانب الأخير من بروتوكول RTCP الذي سننظر فيه هو رزمة وصف المصدر. تحتوي هذه الرزمة، على الأقل، على SSRC الخاص بالمرسل وCNAME الخاص بالمرسل. يُشتق الاسم المتعارف عليه canonical name بطريقةٍ تجعل جميع التطبيقات، التي تنشئ تدفقات وسائط والممكن أن تكون بحاجةٍ إلى مزامنة (مثل تدفقات الصوت والفيديو التي أُنشئتمنفصلةً من نفس المستخدم)، تختار نفس CNAME على الرغم من أنها قد تختار قيم SSRC مختلفة، ويتيح ذلك لجهاز الاستقبال تحديدَ تدفق الوسائط الذي يأتي من نفس المرسل. صيغة CNAME الأكثر شيوعًا هي user@host، حيث يكون المضيف host هو اسم النطاق المؤهَّل الكامل لجهاز الإرسال. وبالتالي يعمل التطبيق، الذي يشغّله المستخدم الذي يكون اسم المستخدم user name الخاص به هو jdoe، على الجهاز cicada.cs.princeton.edu، ويستخدم السلسلة jdoe@cicada.cs.princeton.edu باعتبارها CNAME الخاص به. إن العدد الكبير والمتغير من البايتات المُستخدمة في هذا التمثيل سيجعل منه اختيارًا سيئًا لصيغة SSRC، حيث يُرسَل SSRC مع كل رزمة بيانات ويجب معالجتها في الوقت الحقيقي. يمكّن السماح لأسماء CNAME بالالتزام بقيم SSRC في رسائل RTCP الدورية بصيغة SSRC مضغوطة وفعالة. قد تُضمَّن عناصرٌ أخرى في رزمة وصف المصدر، مثل الاسم الحقيقي وعنوان البريد الإلكتروني للمستخدم، حيث تُستخدم في عرض واجهة المستخدم وللتواصل بالمشاركين، ولكنها أقل أهمية لتشغيل بروتوكول RTP من CNAME. RTP و RTCP هما زوجٌ معقد من البروتوكولات مثل بروتوكول TCP. يأتي هذا التعقيد في جزءٍ كبير منه من الرغبة في جعل الأمور أسهل لمصممي التطبيقات. إن التحدي في تصميم بروتوكول النقل هو جعله عامًا بما يكفي لتلبية الاحتياجات المتنوعة على نطاق واسع للعديد من التطبيقات المختلفة دون جعل البروتوكول نفسه مستحيل التطبيق نظرًا لوجود عدد لا حصر له من التطبيقات الممكنة. لقد أثبت بروتوكول RTP نجاحًا كبيرًا في هذا الصدد، حيث شكّل الأساس للعديد من تطبيقات الوسائط المتعددة في الوقت الحقيقي التي يجري تشغيلها عبر الإنترنت اليوم. يُعَد بروتوكول HTTP هو الوسط الضيق الجديد وُصِف الإنترنت على أنه ذو معماريةٍ ضيقة الوسط narrow waist، ببروتوكولٍ عالمي واحد في المنتصف IP، يتسع لدعم العديد من بروتوكولات النقل والتطبيق فوقه، مثل TCP وUDP وRTP وSunRPC وDCE-RPC وgRPC وSMTP وHTTP وSNMP، ويستطيع العمل على العديد من تقنيات الشبكة تحته، مثل شبكات Ethernet وPPP وWiFi وSONET وATM. لقد كانت هذه البنية العامة مفتاحًا لانتشار الإنترنت في كل مكان: من خلال الحفاظ على طبقة IP التي يجب على الجميع الموافقة على الحد الأدنى الملائم لها. هذه الاستراتيجية الآن مفهومة على نطاق واسع لأي منصة تحاول تحقيق التكيُّف العالمي. ولكن حدث شيء آخر خلال الثلاثين عامًا الماضية. أصبح من الضروري إدخال سلسلة من الميزات الإضافية في معمارية الإنترنت، من خلال عدم معالجة جميع المشكلات الممكن أن يواجهها الإنترنت في نهاية المطاف مع نموه، مثل الأمان والازدحام والتنقل والاستجابة في الوقت الحقيقي، وما إلى ذلك. كان وجود عناوين IP العالمية ونموذج خدمة أفضل جهد best-effort شرطًا ضروريًا للتكيف، ولكنه لم يكن أساسًا كافيًا لجميع التطبيقات التي أراد الناس إنشاءها. لم نرَ بعد بعض هذه الحلول، لكن من المفيد اغتنام هذه الفرصة للتوفيق بين قيمة الوسط أو الخصر waist الضيق العالمي والتطور الذي يحدث حتمًا في أي نظام طويل العمر: انتقلت "النقطة الثابتة" التي تتطور حولها بقية المعمارية إلى مكانٍ جديد في مكدس البرمجيات، حيث أصبح بروتوكول HTTP هو الخصر الضيق الجديد، وهو القطعة المشتركة / المفترضة من البنية التحتية العالمية التي تجعل كل شيء آخر ممكنًا. لم يحدث هذا بين عشية وضحاها، رغم أن البعض توقع حدوثه. انجرف الخصر الضيق ببطء إلى قمة مكدس البروتوكول كنتيجة للتطور (لمزج علوم الأرض والاستعارات البيولوجية). وُضعت علامة الوسط الضيق على بروتوكول HTTP للتبسيط. وهو في الواقع جهدٌ جماعي، حيث تعمل تركيبة HTTP / TLS / TCP / IP الآن مثل نظام أساسي مشتركٍ للإنترنت، حيث: يوفر بروتوكول HTTP معرفات الكائنات العالمية (مثل معرّفات URI) وواجهة GET / PUT بسيطة. يوفر بروتوكول TLS أمان اتصالات من طرفٍ إلى طرف. يوفر بروتوكول TCP إدارة الاتصال، والنقل الموثوق، والتحكم في الازدحام. يوفر بروتوكول IP عناوين مضيف عالمية وطبقة تجريد للشبكة. لكن على الرغم من أنك حر في اختراع خوارزمية التحكم في الازدحام الخاصة بك، فإن بروتوكول TCP يحل هذه المشكلة جيدًا، لذلك من المنطقي إعادة استخدام هذا الحل. وعلى الرغم من أنك حر في اختراع بروتوكول RPC خاص بك، فإن HTTP يوفر بروتوكولًا صالحًا للخدمة تمامًا (لأنه يأتي مزوَّدًا بأمان مثبَت، ولديه ميزةٌ إضافية تتمثل في عدم حظره بواسطة جدران حماية خاصة بمؤسسة)، لذا فمن المنطقي مرة أخرى إعادة استخدامه بدلًا من إعادة اختراع شيء جديد. يوفر بروتوكول HTTP أيضًا أساسًا جيدًا للتعامل مع التنقل mobility. إذا نُقل المورد الذي تريد الوصول إليه، فيستطيع HTTP أن يرجع استجابة إعادة توجيه redirect response والتي توجّه العميل إلى موقعٍ جديد. ويتيح بروتوكول HTTP حقن وكلاء التخزين المؤقت caching proxies بين العميل والخادم، مما يجعل من الممكن نسخ المحتوى الشائع في مواقع متعددة وتوفير تأخير وصول العملاء عبر الإنترنت لاسترداد بعض المعلومات. أخيرًا، اُستخدم HTTP لتوصيل الوسائط المتعددة في الوقت الحقيقي، في نهج يُعرف باسم التدفق التكيفي adaptive streaming. ترجمة -وبتصرّف- للقسم Transport for Real-Time من فصل End-to-End Protocols من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا المقال السابق: استدعاء إجراء عن بعد Remote Procedure Call في الشبكات الحاسوبية التوجيه Routing بين الأجهزة المتنقلة في الشبكات الحاسوبية النقل الموثوق Reliable Transmission في الشبكات الحاسوبية
  14. سنوضّح من خلال هذا المقال كيفية إنشاء شارة تقليدية بشريط مشابه للشكل الآتي، وذلك باستخدام الأدوات المتوفرة في برنامج سكريبوس Scribus فقط، حيث سنشرح الخطوات بالتفصيل، ولكن يجب على المبتدئين التأكد من معرفتهم الجيدة أساسيات سكريبوس قبل تجربتها، فإن كنت لم تستخدم سكريبوس من قبل، فقد تجد الأمر مربكًا بعض الشيء. التقنيات المحددة المستخدمة التقنيات التي سنستعملها هي: إنشاء المضلعات. محاذاة الكائنات. تحويل الكائنات عن طريق التحجيم Scaling والتدوير والترجمة. إضافة نص إلى مسار. دمج الأشكال. تنفيذ عمليات المسار أو الشكل. تغيير التعقب اليدوي Manual Tracking على النص. وضع مخطط Outline للنص. تحرير عقد الشكل. إنشاء عمود من الأشكال. دفع Nudging الكائنات باستخدام لوحة المفاتيح. الخط Font ستحتاج إلى تنزيل الخط Fundamental Brigade، حيث يتكون ملف التنزيل من عدة ملفات، ولكنك ستحتاج فقط الملف "Fundamental Brigade.ttf"، لهذا ثبّت الخط قبل فتح سكريبوس. الألوان افتح سكريبوس وأنشئ مستندًا جديدًا، وسيكون القياس A4 / Letter جيدًا، كما سنحتاج إلى أربعة ألوان هي: Badge لون الشارة: R 55 وG 69 وB 72. Stars لون النجوم: R 166 وG 166 وB 166. Badge Text لون نص الشارة: R 204 وG 204 وB 204. Ribbon لون الشريط: R 55 وG 200 وB 171. استخدم نافذة محرّر الألوان Color Editor، والتي يمكن الوصول إليها من قائمة تحرير Edit ثم ألوان Colors، وذلك لإضافة الألوان إلى المستند. إذا لم تعرف كيفية إضافة الألوان إلى المستند، فراجع دليل تعليمات سكريبوس عبر قائمة مساعدة Help، ثم اختر Scribus Help، واطّلع على القسم "Documentation / Editing Colors". إن لم يكن هذا الدليل مثبتًا لديك، فراجع قسم "الألوان" في مقال كيفية إنشاء لافتة نيون في برنامج سكريبوس، واستبدل CMYK بنمط الألوان RGB. خلفية الشارة سننشئ أولًا خلفية الشارة، وذلك باتباع الخطوات الآتية: اختر قائمة إدراج Insert، ثم مضلع Insert Polygon، ثم خصائص Properties لفتح نافذة خصائص المضلع Polygon Properties. اضبط "الزوايا" على القيمة 13. اترك "التدوير" على القيمة 0. حدّد مربع "طبّق المعامل Apply Factor". غيّر "المعامل" ليكون ‎-10% (سالب 10%). اضغط على موافق. انقر بالقرب من الجزء العلوي الأيسر من المستند. أدخل العرض والارتفاع 200 نقطة. تأكد من تحديد مربع "تذكر الحجم Remember Size". اضغط موافق، حيث يمكنك تعديل العرض والارتفاع في تبويب X وY وZ من نافذة الخصائص. بذلك تكون قد أنشأت الشكل الأول، والآن ستكون بحاجة إلى مثيله، لهذا كرّر الخطوات السابقة المذكورة مع التغييرات الآتية: اضبط "التدوير" على القيمة 13 في مربع حوار خصائص المضلع. انقر على يمين الشكل الأول عند النقر لرسم المضلع الثاني لتسهيل التعامل معه. يجب الآن تلوين المضلعين ونقلهما إلى موضع معين. حدّد المضلع الأول اليساري، وانتقل إلى نافذة خصائص Properties، ثم اختر تبويب ألوان Colours. اضغط على "لون الحد Line Color" وحدّد "لا شيء None" من قائمة الألوان. اضغط على "لون التعبئة Fill Color" وحدد اللون "Badge" من قائمة الألوان. حدّد المضلع الثاني اليميني، وانتقل إلى خصائص، ثم اختر ألوان مرةً أخرى. اضغط على "لون الحد" وحدّد "لا شيء" من قائمة الألوان. اضغط على "لون التعبئة" وحدّد اللون "Ribbon" من قائمة الألوان. اختر قائمة نوافذ Windows ثم الخيار "حاذِ وزّع Align & Distribute"، وذلك لفتح نافذة حاذِ ووزّع A&DP. اسحب وحدد المضلعَين، ثم اضغط على أيقونة "مَركِز على المحور الرأسي Center on Vertical"، ثم أيقونة "مَركِز على المحور الأفقي Center on Horizontal" في نافذة A&DP. ألغِ تحديد المضلعين ثم أعِد تحديد المضلع العلوي. استخدم مفاتيح المؤشرات من لوحة المفاتيح حتى تصبح محاذاة المضلعين بالشكل الذي يرضيك. حدّد المضلع العلوي وانقر بزر الفأرة الأيمن واختر المستوى Level، ثم الخيار للأسفل Lower to Bottom من القائمة. وبهذا يكون قد تشكّل شكل الشارة الأساسي كما يلي: خطوط ونص الشارة اسحب وحدّد المضلعات الخاصة بك. انقر بزر الفأرة الأيمن واختر مجموعة Group من القائمة. اسحب المجموعة إلى الجزء العلوي الأيسر من المستند لتوفير بعض المساحة. اختر قائمة إدراج Insert، ثم شكل Insert Shape، ثم أشكال افتراضية Default Shapes، ثم دائرة Circle. انقر ضمن المستند الخاص بك على يمين الشارة. أدخل عرضًا وارتفاعًا بمقدار 140 نقطة ثم اضغط موافق. انتقل إلى تبويب ألوان من نافذة خصائص، واضغط على لون الحد Line Color، وحدّد اللون "Badge Text". اختر قائمة عنصر Item، ثم "مضاعفة/تحويل"، ثم تحويل Transform. اضغط على زر إضافة Add وحدد "تحجيم Scaling" من القائمة. غيّر كل عوامل التحجيم إلى 90%. حدّد الدائرة المركزية في مربع "نقطة أساسية Origin". غيّر قيمة "النسخ" إلى 1. اضغط على موافق. حدد الدائرة الأصغر الجديدة وانتقل إلى تبويب خط Line من نافذة خصائص. حدّد نوع الخط المنقّط الثامن في قائمة "نوع الخط Type of Line". يجب أن يكون لديك الآن شيء يشبه الشكل التالي: انقر على الدائرة الداخلية التي أنشأتها للتو. اختر قائمة عنصر، ثم مضاعفة/تحويل، ثم تحويل. اضغط على زر إضافة وحدد "تحجيم Scaling" من القائمة. غيّر كلًا من عوامل التحجيم إلى القيمة 70%. حدد الدائرة المركزية في مربع "نقطة أساسية". غيّر قيمة "النسخ" إلى 1. اضغط على موافق. أنشئ إطار نص أسفل الدوائر بنفس عرض الدائرة الأكبر. أضف النص "‎100% MADE WITH" (بدون علامات الاقتباس) إلى إطار النص. انتقل إلى تبويب نص Text في نافذة خصائص، أو انتقل إلى نافذة خصائص النص من قائمة نوافذ، ثم اختر خصائص المحتوى في الإصدار 1.5.7 من برنامج سكريبوس. غيّر الخط إلى "Fundamental Brigade" وحجم الخط إلى 16 نقطة. غيّر لون الخط إلى اللون "Badge Text". اضغط على Shift من لوحة المفاتيح وحدّد الدائرة الأصغر. اختر قائمة عنصر، ثم أدوات المسار، ثم اختر "اربط النص بالمسار Attach Text to Path". يجب أن يكون لديك الآن شيء يشبه الشكل التالي، حيث يمكنك ملاحظة أن النص موجود في مكان خاطئ، ولذلك ستحتاج إلى إصلاح الأمر: حدّد كائن النص، ثم انتقل إلى نافذة خصائص النص وافتح تبويب "خصائص نص المسار Path Text Properties". قد تضطر إلى التمرير للأسفل لرؤيتها. أدخل القيمة 152 نقطة في حقل الإدخال "ابدأ الإزاحة Start Offset". يجب أن يكون النص الآن في الموضع الصحيح، لكن إذا لم يكن كذلك، فغيّر القيمة. اسحب وحدّد الدوائر والنص. انقر بزر الفأرة الأيمن واختر مجموعةً من القائمة. اضغط Shift وحدّد مجموعة المضلعات. تأكد من ضبط "متصل بـ Relative To" على القيمة "الاختيار الأخير Last Selected" في نافذة حاذِ ووزّع A&DP. اضغط على كل من الأيقونتين "مَركِز على المحور الرأسي Center on Vertical" و"مَركِز على المحور الأفقي Center on Horizontal". يجب أن يكون لديك الآن شيء يشبه الشكل التالي: إنشاء النجوم لننشئ النجوم لإضافتها إلى الشارة، وذلك باتباع ما يلي: اختر قائمة إدراج، ثم مضلع، ثم خصائص لفتح نافذة خصائص المضلع. اضبط عدد "الزوايا" على القيمة 5. اضبط "التدوير" على القيمة 0. اضبط "المعامل" على القيمة ‎-52% (ناقص 52%). اضغط موافق. انقر في مكان ما على يمين شارتك. أدخل القيمة 30 نقطة لكل من العرض والارتفاع. اضغط موافق. انتقل إلى نافذة خصائص ثم تبويب ألوان. اضغط على "لون الحدّ" وحدّد "لا شيء" من قائمة الألوان. اضغط على "لون التعبئة" وحدّد اللون "Stars" من قائمة الألوان. بهذا يكون قد تشكّلت لديك الآن النجمة الأساسية الأولى، إذًا لنشكّل نجمتين أيضًا. حدّد النجمة ثم اختر قائمة عنصر، ثم مضاعفة/تحويل، ثم تحويل. اضغط على زر إضافة وحدّد "تحجيم" من القائمة. غيّر كلًا من عوامل التحجيم إلى القيمة 70%. اضغط على زر إضافة مرةً أخرى، وحدّد "تدوير Rotation" من القائمة. غيّر "الزاوية" إلى 10 درجات. غيّر قيمة "النسخ" إلى 1. اضغط على موافق. بهذا تكون قد أنشأت الآن النجمة الصغيرة الأولى. ألغِ تحديد كل شيء ثم اسحب النجمة الأصغر الجديدة إلى يمين النجمة الأصل حتى تتمكن من رؤيتها بصورة صحيحة، وذلك باتباع ما يلي: حدّد النجمة الأصغر، ثم اختر قائمة عنصر ثم مضاعفة/تحويل، ثم نسخ مطابق Duplicate. اضغط على أيقونة "اقلب أفقيًا Flip Horizontal" في تبويب X وY وZ من نافذة خصائص. بهذا نكون قد أنشأنا الآن النجمة الأخرى الصغيرة. اسحبها إلى يسار النجمة الأكبر كما في الشكل التالي، لكن لا تقلق بشأن المحاذاة الصحيحة الآن، إذ سنفعل ذلك لاحقًا. الشريط الأمامي سننشئ جسم الشريط الرئيسي أولًا. اختر قائمة إدراج، ثم شكل، ثم أشكال افتراضية، ثم دائرة. انقر أسفل الجهة اليسرى السفلية للشارة. أدخل عرض 400 نقطة وارتفاع 100 نقطة. اضغط موافق. حدّد الدائرة المسطحة، ثم اختر قائمة عنصر، ثم مضاعفة/تحويل، ثم تحويل. اضغط على زر إضافة وحدّد "ترجمة Translation" من القائمة. غيّر قيمة رأسي Vertical إلى 50 نقطة. غيّر قيمة "النسخ" إلى 1. اضغط موافق. يجب أن يكون لديك الآن شيء يشبه الشكل التالي: اسحب وحدد الدائرتين. اختر قائمة عنصر، ثم أدوات المسار، ثم ادمج المضلعات Combine Polygons. بهذا ستكون قد أنشأت مضلعًا واحدًا من المضلعين السابقين، كما ستنشئ أيضًا شيئًا للتلاعب بهذا المضلع الجديد، باعتماد الخطوات الآتية: اختر قائمة إدراج، ثم "شكل"، ثم أشكال افتراضية، بعد ذلك اختر مثلث يشير للأسفل، والمتواجدة بالقرب من أسفل القائمة. انقر على منتصف الشارة. أدخل عرض 200 نقطة وارتفاع 600 نقطة. اضغط موافق. ألغِ تحديد كل شيء وأعد تحديد المثلث الطويل. انقر على Shift وحدّد الدوائر المدمَجة. تأكد من ضبط "متصل بـ Relative To" على القيمة "الاختيار الأخير Last Selected" في نافذة A&DP. اضغط على أيقونة "مَركِز على المحور الرأسي". اضغط على أيقونة "حاذِ الجوانب العليا Align Tops". يجب أن يكون لديك الآن شيء يشبه الشكل التالي: ألغِ تحديد كل شيء وأعِد تحديد المثلث الطويل. اضغط على Shift وحدّد الدوائر المدمَجة. اختر قائمة عنصر، ثم أدوات المسار Path Tools، ثم عمليات المسار Path Operations. اضغط على أيقونة "تقاطع الأشكال "Intersection of the Shapes" في مربع "عملية Operation". يجب أن تبدو النتيجة مثل الشكل التالي، لكن إذا لم يكن كذلك، فحدّد مربع "تبديل الأشكال Swap Shapes". اضغط موافق. حدد "المنحني المزدوج" الجديد واختر قائمة عنصر ثم أدوات المسار ثم اختر "افصل المضلعات Split Polygons". ألغِ تحديد كل شيء وأعِد تحديد المنحني السفلي. انقر بزر الفأرة الأيمن واختر حذف Delete من القائمة، لأنك لست بحاجة إليه. حدد المنحني العلوي المتبقي، واختر قائمة عنصر، ثم مضاعفة/تحويل، ثم نسخ مطابق Duplicate. اسحب النسخة المكرّرة إلى الجانب لاستخدامها لاحقًا. أنشئ إطار نص أسفل الشريط الأصلي وبعرضه تقريبًا. أضف النص "SCRIBUS" (بدون علامات الاقتباس) إلى إطار النص. انتقل إلى نافذة خصائص النص. غيّر الخط إلى Fundamental Brigade وحجم الخط إلى 40 نقطة. غيّر التتبع اليدوي Manual Tracking إلى 8% في تبويب الإعدادات المتقدمة Advanced Setting من نافذة خصائص النص. حدّد إطار النص، ثم اضغط Shift وحدّد الشريط الأصلي. اختر قائمة عنصر ثم أدوات المسار ثم اختر "اربط النص بالمسار". سيبدو النص كما في الشكل التالي، أي خاطئًا تمامًا، ولكن يمكن إصلاحه بسهولة باتباع الخطوات التالية: حدّد النص ثم انتقل إلى نافذة خصائص النص وافتح التبويب "خصائص نص المسار". أدخِل القيمة 295 نقطة في حقل الإدخال "ابدأ الإزاحة". أدخل القيمة ‎-39 نقطة (ناقص 39 نقطة) في حقل الإدخال "المسافة من المنحنى Distance from Curve". حدد مربع "أظهر المنحنى Show Curve" لمعرفة ما حدث. يجب أن يكون لديك الآن شيء يشبه الشكل التالي لكنك لم تنتهِ بعد، وإذا لم يظهر لديك الشكل نفسه، فحاول تغيير قيم "أظهر المنحنى" و"المسافة من المنحنى"). ألغِ تحديد مربع "أظهر المنحنى"، فلست بحاجة إلى رؤيته بعد الآن لأنه سيفسد التأثير. غيّر لون النص إلى "اللون الأبيض" من تبويب الألوان، والمؤثرات في نافذة خصائص النص. انقر على رمز "مخطط Outline" تحت خيارات الألوان. انقر على رمز "مخطط Outline" تحت خيارات الألوان مرةً أخرى، ولكن اضغط مطوَّلًا حتى تظهر نافذة صغيرة. غيّر "عرض الخط Linewidth" إلى 2%. حدّد الشريط المكرّر. انتقل إلى تبويب ألوان في نافذة خصائص. اضغط على "لون الحد" وحدّد اللون "Badge" من قائمة الألوان. اضغط على "لون التعبئة" وحدّد اللون "Ribbon" من قائمة الألوان. اسحب وحدّد كلًا من الشريط والنص. اضغط على كل من "مَركِز على المحور الرأسي"، و"مَركِز على المحور الأفقي" في نافذة A&DP. إذا اختفى النص فألغِ تحديد كل شيء، ثم حدّد الشريط، وانقر بزر الفأرة الأيمن، ثم اختر المستوى Level، بعد ذلك اختر الخيار للأسفل Lower to Bottom للحصول على النص أعلى الشريط. يجب أن يكون لديك الآن شيء مثل الشكل التالي: اسحب وحدّد الشريط والنص. انقر بزر الفأرة الأيمن واختر مجموعةً من القائمة. نهايات الشريط يجب الآن إنشاء نهايات الشريط،-وهذا هو الجزء الصعب بالعملية-، وذلك باتباع الخطوات الآتية: اختر قائمة إدراج، ثم شكل، ثم أشكال افتراضية، ثم مستطيل. انقر في أي مكان أسفل الشريط. أدخل عرض 40 نقطة وارتفاع 50 نقطة. اضغط موافق. انقر نقرًا مزدوجًا على المستطيل لفتح نافذة محرّر العقد Node Editor. اضغط على أيقونة "أضِف عُقد Add Nodes" في نافذة محرّر العقد. انقر على المستطيل الذي رسمته في منتصف الحافة العمودية اليمنى. اضغط على أيقونة "حرّك عقدًا Move Nodes" في نافذة محرر العقد. ارجع إلى المستطيل واسحب العقدة التي أضفتها للتو إلى اليسار، بحيث تقرأ قيم X-Pos وY-Pos في نافذة محرر العقد، بحيث تكون X مساويةً لـ 25 نقطة، وY مساوية لـ 25 نقطة كما في الشكل التالي، أو يمكنك تغيير القيم مباشرةً في حقول الإدخال. اضغط على زر إنهاء التحرير أو موافق عند الانتهاء. انتقل إلى تبويب ألوان Colors في نافذة خصائص. اضغط على "لون الحد" وحدّد اللون "Badge" من قائمة الألوان. اضغط على "لون التعبئة" وحدد اللون "Ribbon" من قائمة الألوان. لننشئ الآن بعض الرتوش، وذلك باتباع الخطوات الآتية: اختر قائمة إدراج، ثم شكل، ثم أشكال افتراضية، ثم مثلث يشير إلى اليمين. انقر في أي مكان أسفل الشكل الذي رسمته للتو. أدخل عرضًا 20 نقطة وارتفاعًا 2.5 نقطة. اضغط موافق. انتقل إلى تبويب ألوان في نافذة خصائص. اضغط على "لون الحد"، وحدد "لا شيء" من قائمة الألوان. اضغط على "لون التعبئة" وحدد اللون "Badge" من قائمة الألوان. حدّد المثلث ثم اختر قائمة عنصر، ثم مضاعفة/تحويل، ثم نسخ مطابقة Multiple Duplicate. انتقل إلى تبويب "بعدد الصفوف والأعمدة By Rows and Columns". غيّر قيمة "عدد الصفوف Number of Rows" إلى 20. اضغط على موافق. اسحب وحدد كل المثلثات. انقر بزر الفأرة الأيمن واختر مجموعةً من القائمة. انقر مع الضغط على مفتاح Shift على الشكل السابق الذي يحتوي على "ثنية" فيه. اضغط على كل من "حاذِ الجوانب اليسرى Align left sides"، و"مَركِز على المحور الأفقي Center on Horizontal" في نافذة A&DP. بهذا يكون الشريط قد أوشك على الانتهاء، بحيث لم تتبقى سوى بضع خطوات تتمثل في التالي: اختر قائمة إدراج، ثم شكل، ثم أشكال افتراضية، ثم مثلث قائم الزاوية. انقر في أي مكان أسفل المجموعة التي أنشأتها للتو. أدخل عرض 15 نقطة وارتفاع 10 نقاط. اضغط موافق. اذهب إلى تبويب X وY وZ من نافذة خصائص. اضغط على أيقونة "اقلب أفقيًا Flip Vertical". انتقل إلى تبويب ألوان من نافذة خصائص. اضغط على "لون الحد"، وحدد "لا شيء" من قائمة الألوان. اضغط على "لون التعبئة"، وحدّد اللون "Badge" من قائمة الألوان. انقر مع الضغط على مفتاح Shift على مجموعة الأشكال بما في ذلك "الرتوش". اضغط على "حاذِ الجوانب اليسرى"، و"حاذِ الجوانب السفلى Align bottoms" في نافذة A&DP. اسحب وحدّد كل الأشكال التي أنشأتها للتو. انقر بزر الفأرة الأيمن واختر مجموعةً من القائمة. اذهب إلى تبويب X وY وZ من نافذة خصائص. غيّر "التدوير" إلى 350 درجة. يجب أن يكون لديك الآن شكل مماثل للتالي: حدّد المجموعة، ثم انقر بزر الفأرة الأيمن واختر مستوى Level، ثم "للأسفل Lower to Bottom" من القائمة. اختر قائمة عنصر ثم مضاعفة/تحويل، ثم نسخ مطابق Duplicate. حدّد النسخة المكرَّرة، ثم انتقل إلى تبويب X وY وZ من نافذة خصائص. اضغط على أيقونة "اقلب أفقيًا". انقر بزر الفأرة الأيمن واختر مستوى Level ثم للأسفل Lower to Bottom من القائمة. تجميع الأجزاء مع بعضها البعض يجب الآن إنهاء الشريط ومحاذاة الشارة، ثم تحريك النجوم إلى مكانها الصحيح، فقم بسحب إحدى نهايتي الشريط إلى زاوية أحد طرفي الشريط. لا توجد طريقة لمحاذاة هذه الأشكال تلقائيًا، فكل ما عليك فعله هو تنفيذ ذلك بالنظر، ولكن عليك وضع زاوية المثلث الرمادي الداكن الصغير أسفل زاوية الشريط السفلية كما في الشكل التالي، حيث يشير السهم الأحمر: كرّر الشيء نفسه بالنسبة لنهاية الشريط الآخر في الطرف الآخر من الشريط، وذلك كما في الشكل التالي: اسحب وحدّد جميع أجزاء الشريط وانقر بزر الفأرة الأيمن على مجموعة من القائمة. انقر بزر الفأرة الأيمن على المجموعة، واختر المستوى Level، ثم أحضره للأعلى Raise to Top من القائمة. سنحاذي الآن الشريط مع الشارة. حدّد الشريط. اضغط على مفتاح Shift، وحدّد مركز الشارة، حيث ستحدد إحدى الدوائر في الحقيقة ولكن لا بأس بذلك). اضغط على كل من "مَركِز على المحور الرأسي Center on Vertical" و"مَركِز على المحور الأفقي Center on Horizontal" في نافذة A&DP. سيكون الشريط مرتفعًا جدًا عن الشارة ولكن يمكنك إصلاح ذلك بسهولة، لهذا استمر بالضغط على السهم للأسفل من لوحة المفاتيح حتى يصبح الشريط في المكان المناسب. نقترح وضع الجزء العلوي من الشريط حول مركز الدوائر أو أسفله مباشرةً، لكن الأمر متروك لك. يجب الآن وضع النجوم في مكانها الصحيح، لهذا اتبع الخطوات الموالية: اسحب وحدّد كل النجوم. انتقل إلى تبويب توزيع Distribute في نافذة A&DP. انقر على أيقونة "أنشئ فجوات أفقية بين العناصر مساوية للقيمة المحددة Make Horizontal Gaps between items equal to the value specified". ألغِ تحديد كل شيء وحدّد النجمة المركزية الكبرى. استخدم السهم للأعلى من لوحة المفاتيح لتحريك النجمة الكبيرة للأعلى، وذلك حتى تصبح في المكان الذي تريده، وسيبدو الارتفاع بحوالي 15 نقطة جيدًا. اسحب وحدّد كل النجوم. انقر بزر الفأرة الأيمن واختر مجموعةً من القائمة. انقر بزر الفأرة الأيمن فوق المجموعة واختر المستوى Level، ثم للأعلى Raise to Top من القائمة. اضغط Shift وحدّد دائرة في الشارة. ارجع إلى تبويب حاذِ Align في نافذة A&DP. تأكد من ضبط "متصل بـ Relative to" على القيمة "الاختيار الأخير Last Selected"، وإلا فستحدث فوضى. اضغط على كلٍ من أيقونات "مَركِز على المحور الرأسي" و"مَركِز على المحور الأفقي" في نافذة A&DP. بهذا تكون النجوم قد أصبحت منخفضةً جدًا، ولكن يمكنك إصلاح ذلك بسهولة أيضًا. ألغِ تحديد كل شيء وحدّد النجوم. استخدم السهم للأعلى من لوحة المفاتيح لتحريك النجوم إلى مكان تجده مناسبًا، واجعل الفجوة الموجودة بين أعلى النجمة الكبيرة وأسفل النص، مثل الفجوة الموجودة بين أسفل النجوم الصغيرة والشريط. وبهذا نكون قد أنهينا تصميم الشارة التقليدية. ترجمة -وبتصرّف- للمقال How to create a retro ribbon badge. اقرأ أيضًا كيفية إنشاء رسوم من النمط Pop Art Explosion في برنامج سكريبوس Scribus خطوات تطوير شعار باستخدام برنامج سكريبوس Scribus كيفية إنشاء التأثير Distressing Mask في برنامج سكريبوس لإنتاج تأثيرات تعبئة جذابة كيفية إنشاء الظلال في برنامج سكريبوس Scribus
  15. النمط الشائع للاتصال الذي تستخدمه برامج التطبيقات المُهيكَلة كزوج عميل / خادم client/server هو اتفاق رسائل الطلب / الرد request/reply message: يرسل العميل رسالة طلبٍ إلى الخادم، ويستجيب الخادم برسالة رد، مع تعطيل العميل (تعليق التنفيذ) انتظارًا للرد. يوضح الشكل التالي التفاعل الأساسي بين العميل والخادم في مثل هذا التبادل. إنّ بروتوكول النقل الذي يدعم نموذج الطلب / الرد أكثر بكثير من رسالة UDP تسير في اتجاه واحد متبوعةً برسالة UDP تذهب في الاتجاه الآخر، فهو يحتاج إلى التعامل مع تحديد العمليات بصورةٍ صحيحة على المضيفين البعيدين وربط الطلبات بالاستجابات. قد يحتاج أيضًا إلى التغلب على بعض أو كل قيود الشبكة الأساسية الموضحة في بيان المشكلة في بداية هذا المقال. يتغلب بروتوكول TCP على هذه القيود من خلال توفير خدمة تدفق بايتات موثوقة، ولكنه لا يتطابق تمامًا مع نموذج الطلب / الرد. يصف هذا القسم فئةً ثالثةً من بروتوكول النقل، تُسمى استدعاء الإجراء عن بُعد Remote Procedure Call أو اختصارًا RPC، والتي تتطابق بشكل وثيق مع احتياجات التطبيق المُضمَّنة في تبادل رسائل الطلب / الرد. أساسيات الإجراء عن بعد RPC بروتوكول RPC ليس بروتوكولًا تقنيًا، فمن الأفضل التفكير به كآلية عامة لبناء الأنظمة الموزعة. يُعَد RPC شائعًا لأنه يعتمد على دلالات استدعاء الإجراء المحلي، حيث يستدعي برنامج التطبيق إجراءً دون تحديد ما إذا كان محليًا أو بعيدًا ويتوقف حتى يعيد الإجراء قيمة. يمكن أن يكون مطور التطبيق غير مدرك إلى حد كبير ما إذا كان الإجراء محليًا أم بعيدًا، مما يبسط مهمته إلى حدٍ كبير. يُعرف RPC باسم استدعاء الطرائق عن بُعد remote method invocation أو اختصارًا RMI عندما تكون الإجراءات التي يتم استدعاؤها هي في الواقع طرائق methods لكائناتٍ بعيدة في لغة موجّهة بالكائنات. على الرغم من أن مفهوم RPC بسيط، إلا أن هناك مشكلتين رئيسيتين تجعله أعقد من استدعاءات الإجراءات المحلية: تملك الشبكة بين العملية المستدعية calling process والعملية المُستدعاة called process خصائصًا أعقد من اللوحة الأم المعززة backplane للحاسوب، فمن المحتمل أن تحد من أحجام الرسائل وتميل إلى فقدان الرسائل وإعادة ترتيبها على سبيل المثال. قد تحتوي الحواسيب التي تعمل عليها العمليات المستدعية والمُستدعاة على معماريات وتنسيقات تمثيل بيانات مختلفة. وبالتالي تتضمن آلية RPC الكاملة في الواقع مكونين رئيسيين: بروتوكول يدير الرسائل المرسلة بين عمليات العميل وعمليات الخادم ويتعامل مع الخصائص غير المرغوب فيها المحتملة للشبكة الأساسية. دعم لغة برمجة ومصرّف compiler لحزم الوسطاء arguments في رسالة طلب على جهاز العميل ثم ترجمة هذه الرسالة مرة أخرى إلى الوسطاء على جهاز الخادم، وبالمثل مع القيمة المُعادة. يُطلق على هذه القطعة من آلية RPC عادةً اسم مصرّف جذعي stub compiler. يوضح الشكل الآتي ما يحدث عندما يستدعي العميل إجراءً عن بُعد. أولًا، يستدعي العميل جذعًا stub محليًا للإجراء، ويمرر إليه الوسطاء التي يتطلبها هذا الإجراء. يخفي هذا الجذع حقيقة أن الإجراء بعيد عن طريق ترجمة الوسطاء إلى رسالة طلب ثم استدعاء بروتوكول RPC لإرسال رسالة الطلب إلى جهاز الخادم. يسلّم بروتوكول RPC رسالة الطلب في الخادم إلى جذع الخادم، والذي يترجمه إلى وسطاء لهذا الإجراء ثم يستدعي الإجراء المحلي. يعود إجراء الخادم بعد اكتماله في رسالة رد تُفيد بأنه يسلّم بروتوكول RPC لإرساله مرة أخرى إلى العميل. يمرر بروتوكول RPC الموجود على العميل هذه الرسالة إلى جذع العميل، والذي يترجمه إلى قيمة معادة إلى برنامج العميل. يتناول هذا القسم الجوانب المتعلقة بالبروتوكول فقط لآلية RPC، أي أنه يتجاهل الأجزاء الجذعية stubs ويركز بدلًا من ذلك على بروتوكول RPC، الذي يشار إليه أحيانًا باسم بروتوكول الطلب / الرد، الذي ينقل الرسائل بين العميل والخادم. من المهم أيضًا أن تضع في حساباتك أن برامج العميل والخادم مكتوبة في بعض لغات البرمجة، مما يعني أن آلية RPC المعينة قد تدعم Python stubs وJava stubs وGoLang stubs وما إلى ذلك، يتضمن كل منها مصطلحات خاصة باللغة عن كيفية استدعاء الإجراءات. يشير مصطلح RPC إلى نوعٍ من البروتوكولات بدلًا من معيارٍ معين مثل TCP، لذلك تختلف بروتوكولات RPC المحددة في الوظائف التي تؤديها. ولا يوجد بروتوكول RPC مهيمن واحد على عكس بروتوكول TCP، وهو بروتوكول تدفق البايتات الموثوق. وبالتالي سنتحدث في هذا القسم أكثر عن خيارات التصميم البديلة أكثر من السابق. المعرفات Identifiers في RPC يجب تأدية وظيفتين بواسطة أي بروتوكول RPC هما: وفّر مساحة اسم name space لتعريف الإجراء الذي سيُستدعى بشكل فريد. طابق كل رسالة رد برسالة الطلب المقابلة. المشكلة الأولى لها بعض أوجه التشابه مع مشكلة تحديد العقد في الشبكة، وهو شيء تفعله عناوين IP على سبيل المثال. أحد خيارات التصميم عند تحديد الأشياء هو جعل مساحة الاسم مسطحة flat أو هرمية hierarchical. تسند مساحة الاسم المسطحة ببساطة معرّفًا فريدَا غير منظم (عددًا صحيحًا مثلًا) لكل إجراء، وسيُنقَل هذا الرقم في حقلٍ واحد في رسالة طلب RPC. قد يتطلب ذلك نوعًا من التنسيق المركزي لتجنب إسناد رقم الإجراء نفسه لاثنين من الإجراءات المختلفة. ويمكن للبروتوكول تطبيق مساحة أسماء هرمية، مماثلة لتلك المستخدمة لأسماء مسار الملف، والتي تتطلب فقط أن يكون "الاسم الأساسي basename" لملفٍ ما فريدًا داخل مجلده، ومن المحتمل أن يبسط هذا النهج مهمة ضمان تفرد أسماء الإجراءات. يمكن تطبيق مساحة أسماء هرمية لآلية RPC عن طريق تحديد مجموعة من الحقول في صيغة رسالة الطلب، حقلٌ لكل مستوى من مستويات التسمية في مساحة اسماءٍ هرمية من مستويين أو ثلاثة مستويات على سبيل المثال. المفتاح لمطابقة رسالة الرد برسالة الطلب المقابلة هو تحديد أزواج الطلبات والردود بشكل فريد باستخدام حقل معرّف الرسالة. حيث يُضبَط حقل معرّف رسالة الرد على نفس قيمة رسالة الطلب. تستخدم وحدة RPC في العميل التي تتلقى الرد معرّفَ الرسالة للبحث عن الطلب المعلّق المقابل. يُوقَف المستدعي حتى استلام رسالة الرد لجعل اتفاق RPC يظهر مثل استدعاء إجراء محلي للمستدعي caller. يُحدَّد المستدعي الذي جرى وقفه عند تلقي الرد بناءً على رقم الطلب في الرد، ويتم الحصول على القيمة المعادة من الإجراء البعيد من خلال الرد reply، ويُلغى وقف المستدعي حتى يتمكن من إعادة هذه القيمة المعادة. أحد التحديات المتكررة في RPC هو التعامل مع الاستجابات غير المتوقعة، ونرى ذلك مع معرّفات الرسائل. افترض الحالة المرضيّة (ولكن الواقعية) التالية على سبيل المثال: يرسل جهاز العميل رسالة طلب بمعرف رسالة 0، ثم يتعطل ويعيد التشغيل، ثم يرسل رسالة طلب ليست ذات صلة، وأيضًا بمعرّف رسالة 0. ربما لم يكن الخادم على علم بأن العميل قد تعطل وأعيد تشغيله، عند رؤية رسالة طلب بمعرف رسالة 0، فيُقِر بها ثم يتجاهلها كونها مكررة، ولا يتلقى العميل أبدًا ردًا على الطلب. يوجد طريقةٌ واحدة للتخلص من هذه المشكلة هي استخدام معرّف إقلاع boot ID. معرف إقلاع الجهاز هو رقم يُزاد في كل مرة يعاد تشغيل الجهاز. يُقرَأ هذا الرقم من وحدة تخزين غير متطايرة (محرك أقراص أو محرك أقراص محمول)، فيُزاد ويعاد كتابته إلى جهاز التخزين أثناء إجراء بدء تشغيل الجهاز، ثم يُوضَع هذا الرقم في كل رسالة يرسلها ذلك المضيف. إذا استُلِمت رسالةٌ بمعرّف رسالة قديم ولكن مع معرف إقلاع جديد، سيجري التعرف عليها كرسالة جديدة. يتحد معرّف الرسالة ومعرّف الإقلاع لتشكيل معرّفٍ فريد لكل اتفاق. التغلب على قيود الشبكة تؤدي بروتوكولات RPC غالبًا وظائفًا إضافية للتعامل مع حقيقة أن الشبكات ليست قنوات مثالية. اثنان من هذه الوظائف هي: توفير توصيل موثوق للرسائل. دعم أحجام الرسائل الكبيرة من خلال التجزئة fragmentation وإعادة التجميع reassembly. قد يعرّف بروتوكول RPC "هذه المشكلة بعيدًا" عن طريق اختيار التشغيل فوق بروتوكول موثوق مثل بروتوكول TCP، ولكن يطبّق بروتوكول RCP في كثير من الحالات طبقة تسليم الرسائل الموثوقة الخاصة به فوق ركيزة غير موثوقة مثل UDP / IP، وبالتالي من المحتمل أن يطبّق بروتوكول RPC هذا الوثوقيةَ باستخدام الإشعارات acknowledgments والمهل الزمنية timeouts، على غرار بروتوكول TCP. الخوارزمية الأساسية واضحة ومباشرة، كما هو موضح في الجدول الزمني الوارد في الشكل التالي. حيث يرسل العميل رسالة طلب ويرسل الخادم إشعارًا بها، ثم يرسل الخادم رسالة رد ويرسل العميل إشعارًا بالرد بعد تنفيذ الإجراء. قد تضيع في الشبكة، تلك الرسالة التي تحمل بيانات (رسالة طلب أو رسالة رد) أو إشعار ACK مُرسَل للإقرار بوصول الرسالة، لذلك يحفظ كلٌّ من العميل والخادم نسخةً من كل رسالة يرسلانها حتى وصول إشعار ACK لها. يضبط كل جانب أيضًا مؤقت إعادة إرسال RETRANSMIT أي يعيد إرسال الرسالة في حالة انتهاء صلاحية هذا المؤقت، ويعيد كلا الجانبين ضبط هذا المؤقت ويحاولان مرة أخرى عددًا من المرات متفقًا عليه قبل التخلي عن الرسالة وتحريرها. إذا تلقى عميل RPC رسالةَ رد، فمن الواضح أنه يجب أن يكون الخادم قد استلم رسالة الطلب المقابلة، حيث أن رسالة الرد نفسها هي إشعارٌ ضمني implicit acknowledgment، ولن يكون أيُّ إشعارٍ إضافي من الخادم ضروريًا منطقيًا. يمكن لرسالة الطلب إرسال إشعارًا ضمنيًا لرسالة الرد السابقة على افتراض أن البروتوكول يجعل اتفاقات الطلب والرد متسلسلة، بحيث يجب إكمال اتفاقٍ واحد قبل أن يبدأ الاتفاق التالي، ولكن سيحد هذا التسلسل بشدة من أداء RPC. طريقة الخروج من هذا المأزق هي أن يطبّق بروتوكول RPC تجريد القناة channel abstraction. تكون اتفاقات الطلب / الرد متسلسلة داخل قناةٍ معينة، حيث يمكن أن يكون هناك اتفاقٌ واحد فقط نشط على قناة معينة في أي وقت معين، ولكن يمكن أن تكون هناك قنوات متعددة. يتيح تجريد القناة إمكانية تعدد اتفاقات طلب / رد RPC بين زوج العميل / الخادم. تتضمن كلُّ رسالةٍ حقلَ معرّف القناة للإشارة إلى القناة التي تنتمي إليها الرسالة. ستُقِر رسالة طلب في قناة معينة ضمنيًا بالرد السابق في تلك القناة، إذا لم يكن قد أُقِر بها بالفعل. يمكن لبرنامج التطبيق فتح قنوات متعددة إلى الخادم إذا كان يريد الحصول على أكثر من اتفاق طلب / رد بينها في نفس الوقت، ويحتاج التطبيق عندئذٍ إلى خيوطٍ threads متعددة. تُقِر رسالة الرد برسالة الطلب، ويُقِر الطلب اللاحق بالرد السابق كما هو موضح في الشكل التالي. لاحظ أننا رأينا طريقة مشابهة جدًا، تسمى القنوات المنطقية المتزامنة concurrent logical channels، في قسم سابق كطريقة لتحسين أداء آلية موثوقية التوقف والانتظار. من التعقيدات الأخرى الواجب على RPC معالجتها أن الخادم قد يستغرق وقتًا طويلًا بصورة كيفية لتحقيق النتيجة، والأسوأ من ذلك، أنه قد يتعطل قبل توليد الرد. ضع في بالك أننا نتحدث عن الفترة الزمنية بعد موافقة الخادم على الطلب ولكن قبل إرسال الرد. يمكن لعميل RPC إرسال رسالة دورية "هل أنت على قيد الحياة؟ ?Are you alive" إلى الخادم لمساعدة العميل على التمييز بين الخادم البطيء والخادم المعطَّل، ويستجيب جانب الخادم بإشعار ACK. ويمكن للخادم إرسال رسائل "ما زلت على قيد الحياة I am still alive" إلى العميل دون أن يطلبها العميل أولًا. هذا النهج أكثر قابلية للتوسع لأنه يضع المزيد من العبء (أي إدارة مؤقت المهلة الزمنية) على العملاء. قد تتضمن وثوقية RPC الخاصيةَ المعروفة باسم دلالاتٌ لمرة واحدة على الأكثر at-most-once semantics. هذا يعني أنه بالنسبة لكل رسالة طلب يرسلها العميل، تُسلَّم نسخةٌ واحدة على الأكثر من تلك الرسالة إلى الخادم. في كل مرةٍ يستدعي فيها العميلُ إجراءً بعيدًا، يُستدعى هذا الإجراء مرة واحدة على الأكثر على جهاز الخادم. نقول "مرة واحدة على الأكثر" بدلًا من "مرة واحدة تمامًا" لأنه من الممكن دائمًا فشل الشبكة أو جهاز الخادم، مما يجعل من المستحيل تسليم نسخةٍ واحدة من رسالة الطلب. يجب أن يتعّرف RPC في جانب الخادم على الطلبات المكررة ويتجاهلها لتنفيذ الدلالات مرة واحدة على الأكثر، حتى إذا كان قد استجاب بالفعل للطلب الأصلي بنجاح، ويجب أن يحتفظ ببعض معلومات الحالة التي تحدد الطلبات السابقة. تتمثل إحدى الطرق في تحديد الطلبات باستخدام الأرقام التسلسلية، لذلك يحتاج الخادم فقط إلى تذكر الرقم التسلسلي الأحدث، ولكن قد يحد ذلك من RPC وبالتالي يقتصر على طلبٍ معلق واحد إلى خادم معين في كل مرة، حيث يجب إكمال طلب واحد قبل إرسال الطلب بالرقم التسلسلي التالي. توفر القنوات الحل، فيمكن للخادم التعرّفَ على الطلبات المكررة من خلال تذكر الرقم التسلسلي الحالي لكل قناة، دون حدِّ العميل بطلب واحد في كل مرة. لا تدعم كل بروتوكولات RPC هذا السلوك، حيث يدعم البعض دلالاتٍ semantics تسمى دلالات الصفر أو أكثر zero-or-more semantics، أي أن كل استدعاء للعميل يؤدي إلى استدعاء الإجراء البعيد صفر مرةً أو أكثر. ليس من الصعب فهم كيف يمكن أن يتسبب ذلك في حدوث مشكلاتٍ لإجراءٍ بعيد قام بتغيير بعض متغيرات الحالة المحلية (زيادة عدّاد مثلًا) أو كان له بعض الآثار الجانبية المرئية خارجيًا (إطلاق صاروخ على سبيل المثال) في كل مرة يُستدعَى فيها. إذا كان الإجراء البعيد المُستدعى عديم الفعالية، سيكون للاستدعاءات المتعددة نفس تأثير استدعاءٍ واحد فقط، إذًا لا تحتاج آلية RPC إلى دعم دلالات مرة واحدة على الأكثر، ويكفي تطبيق أبسط قد يكون أسرع. يكمن السببان وراء تطبيق بروتوكول RPC تجزئة الرسالة وإعادة تجميعها كما كان الحال مع الوثوقية بعدم توفير مكدس البروتوكول الأساسي لذلك أو أنه يمكن تطبيقه بصورة أكثر كفاءة بواسطة بروتوكول RPC. ضع في اعتبارك الحالة التي يُطبَّق RPC أعلى UDP / IP ويعتمد على IP للتجزئة وإعادة التجميع. إذا فشل جزءٌ واحد فقط من الرسالة في الوصول خلال فترة زمنية معينة، فإن بروتوكول IP يتجاهل الأجزاء التي وصلت بالفعل وستضيع الرسالة فعليًا. ستنتهي مهلة بروتوكول RPC (بافتراض أنه يطبّق الوثوقية) ويعيد إرسال الرسالة. في المقابل، ضع في اعتبارك بروتوكول RPC الذي يطبّق التجزئة وإعادة التجميع الخاصة به ويرسل ACK أو NACK (إشعارًا سلبيًا) بالأجزاء الفردية. ستُكتشَف الأجزاء المفقودة ويُعاد إرسالها بسرعةٍ أكبر، وسيعاد إرسال الأجزاء المفقودة فقط، وليس الرسالة بأكملها. البروتوكولات المتزامنة مقابل البروتوكولات غير المتزامنة تتمثل إحدى طرق وصف البروتوكول في كونه متزامنًا synchronous أو غير متزامن asynchronous. يعتمد المعنى الدقيق لهذه المصطلحات على مكان استخدامها في تسلسل البروتوكول الهرمي. من الأدق في طبقة النقل التفكير فيهما على أنهما يعينان الحدود القصوى للطيف بدلًا من عدّهما بديلين متعارضين. الخاصية الرئيسية لأي نقطة على طول الطيف هي مقدار ما تعرفه عملية الإرسال بعد جواب عملية إرسال الرسالة. أي إذا افترضنا أن أحد برامج التطبيق يستدعي العملية send على بروتوكول نقل، فما الذي يعرفه التطبيق بالضبط عن نجاح العملية عند رد أو جواب العملية send؟ لا يعرف التطبيق شيئًا على الإطلاق عند عودة العملية send في الطرف غير المتزامن من الطيف، فهو لا يعرف فقط ما إذا كانت الرسالة قد استقبلها نظيرها، ولكنه لا يعرف أيضًا على وجه اليقين فيما إذا غادرت الرسالة الجهاز المحلي بنجاح أم لا. تعيد عملية send عادةً رسالةَ رد في الطرف المتزامن من الطيف، أي أن التطبيق لا يعرف فقط أن الرسالة التي أرسلها قد استلمها نظيره، ولكنه يعرف أيضًا أن النظير قد أعاد إجابة. وبالتالي تطبّق البروتوكولات المتزامنة تجريد الطلب / الرد، بينما تُستخدَم البروتوكولات غير المتزامنة إذا أراد المرسل أن يكون قادرًا على إرسال العديد من الرسائل دون الحاجة إلى انتظار الرد. تكون بروتوكولات RPC عادة بروتوكولات متزامنة باستخدام التعريف السابق. على الرغم من أننا لم نناقشها في هذا المقال، إلا أن هناك نقاطًا مثيرة للاهتمام بين هذين النقيضين. قد يطبّق بروتوكول النقل العملية send بحيث تُوقَف (أي لا تعيد قيمة) حتى تُستلَم الرسالة بنجاح على الجهاز البعيد، ولكنها تعيد قيمةً قبل أن يعالجها نظير المرسل على هذا الجهاز البعيد ويستجيب لها بالفعل. يسمى هذا أحيانًا بروتوكول مخطط بيانات موثوق reliable datagram protocol. تطبيقات وهي SunRPC وDCE وgRP لـ RPC ننتقل الآن إلى مناقشتنا لبعض أمثلة تطبيقات بروتوكولات RPC. حيث ستُبرز هذه المناقشة بعض قرارات التصميم المختلفة التي اتخذها مصممو البروتوكول. مثالنا الأول هو SunRPC، وهو بروتوكول RPC واسع الاستخدام يُعرف أيضًا باسم Open Network Computing RPC أو اختصارًا ONC RPC. المثال الثاني، الذي سنشير إليه باسم DCE-RPC، هو جزء من بيئة الحوسبة الموزعة Distributed Computing Environment أو اختصارًا DCE. بيئة DCE عبارة عن مجموعة من المعايير والبرمجيات لبناء الأنظمة الموزعة التي حددتها منظمة البرمجيات المفتوحة Open Software Foundation أو اختصارًا OSF، وهي اتحاد من شركات الحاسوب التي تضم في الأصل شركات IBM وDigital Equipment Corporation وHewlett-Packar، ويطلق على OSF اليوم اسم المجموعة المفتوحة Open Group. مثالنا الثالث هو gRPC، وهي آلية RPC شائعة جعلتها شركة Google مفتوحة المصدر، استنادًا إلى آلية RPC التي تستخدمها داخليًا لتطبيق الخدمات السحابية في مراكز البيانات الخاصة بها. تمثل هذه الأمثلة الثلاثة خيارات تصميم بديلة مثيرة للاهتمام في مساحة حلول RPC، وأقل ما قد تعتقده أنها الخيارات الوحيدة، سنشرح ثلاث آليات أخرى شبيهة بآلية RPC هي WSDL وSOAP وREST في سياق خدمات الويب لاحقًا. آلية SunRPC أصبحت آلية SunRPC معيارًا واقعيًا بفضل توزيعها الواسع مع محطات عمل Sun والدور المركزي الذي تلعبه في نظام ملفات الشبكة Network File System أو اختصارًا NFS الشهير في Sun. تبنتها منظمة IETF لاحقًا كَبروتوكول إنترنت قياسي تحت اسم ONC RPC. يمكن تطبيق آلية SunRPC عبر عدة بروتوكولات نقل مختلفة. ويوضح الشكل التالي الرسم البياني للبروتوكول عند تطبيق SunRPC على UDP. قد يستهجن أحد خبراء الطبقات الصارم فكرة تشغيل بروتوكول نقل عبر بروتوكول نقل، أو يجادل بأن RPC يجب أن يكون شيئًا آخر غير بروتوكول نقل لأنه يظهر "فوق" طبقة النقل. يُعد عمليًا قرار التصميم الخاص بتشغيل RPC على طبقة نقل حالية ذو فحوى ودلالة كبيرين، كما سيتضح في المناقشة التالية: تستخدم آلية SunRPC معرّفات من مستويين لتحديد الإجراءات البعيدة: رقم برنامج ذو 32 بت ورقم إجراء ذو 32 بت (يوجد أيضًا رقم إصدار ذو 32 بت، لكننا نتجاهل ذلك في المناقشة التالية). إذا أُسنِد رقم برنامج x00100003 على سبيل المثال لخادم NFS، ويوجد داخل هذا البرنامج الإجراء getattr هو الإجراء 1، والإجراء setattr هو الإجراء 2، والإجراء read هو الإجراء 6، والإجراء write هو الإجراء 8، وما إلى ذلك. يُرسَل رقم البرنامج ورقم الإجراء في ترويسة رسالة طلب SunRPC، والموضحة حقولها في الشكل التالي. الخادم، الذي قد يدعم عدة أرقام برامج، مسؤولٌ عن استدعاء الإجراء المحدد للبرنامج المحدد. يمثل طلب SunRPC حقًا طلبًا لاستدعاء البرنامج والإجراءات المحددة على الجهاز المعين الذي أُرسِل الطلب إليه، على الرغم من إمكانية تطبيق نفس رقم البرنامج على أجهزةٍ أخرى في نفس الشبكة. وبالتالي فإن عنوان جهاز الخادم (عنوان IP على سبيل المثال) هو طبقة ثالثة ضمنية من عنوان RPC. قد تنتمي أرقام البرامج المختلفة إلى خوادم مختلفة على نفس الجهاز. تحتوي هذه الخوادم المختلفة على مفاتيح فك تعدد إرسال demux مختلفة لطبقة النقل مثل منافذ UDP، ومعظمها أرقام غير معروفة ولكنها تُسنَد ديناميكيًا، وتسمى مفاتيح تعدد الإرسال هذه محدّدات النقل transport selectors. كيف يمكن لعميل SunRPC الذي يريد التحدث إلى برنامج معين تحديد محدّد النقل الواجب استخدامه للوصول إلى الخادم المقابل؟ الحل هو إسناد عنوانٍ معروف لبرنامجٍ واحد فقط على الجهاز البعيد والسماح لهذا البرنامج بالتعامل مع مهمة إخبار العملاء باستخدام محدّد نقل معين للوصول إلى أي برنامجٍ آخر على الجهاز. يُطلق على الإصدار الأصلي من برنامج SunRPC اسم Port Mapper، وهو يدعم فقط UDP وTCP كبروتوكولات أساسية. رقم هذا البرنامج هو x00100000، ومنفذه المعروف هو 111. يدعم برنامج RPCBIND، المُطوَّر من برنامج Port Mapper، بروتوكولات النقل الأساسية الكيفية. يستدعي كلُّ خادم SunRPC في البداية إجراءَ تسجيل RPCBIND على الجهاز الرئيسي للخادم، لتسجيل محدد النقل وأرقام البرامج التي يدعمها. يمكن للعميل البعيد استدعاء إجراء بحث RPCBIND للبحث lookup عن محدد النقل لرقم برنامجٍ معين. لجعل هذا أكثر واقعية، نفترض مثالًا باستخدام برنامج Port Mapper مع بروتوكول UDP. لإرسال رسالة طلب إلى إجراء read الخاص ببرنامج NFS، يرسل العميل أولًا رسالة طلب إلى Port Mapper على منفذ UDP المعروف 111، ويطلب العميل هذا الإجراء 3 لربط رقم البرنامج x00100003 مع منفذ UDP حيث يوجد برنامج NFS حاليًا. يرسل العميل بعد ذلك رسالة طلب SunRPC برقم البرنامج x00100003 والإجراء رقم 6 إلى منفذ UDP هذا، وتستدعي وحدة SunRPC عند ذلك المنفذ إجراء read الخاص ببرنامج NFS. يخزّن العميل أيضًا ربط رقم البرنامج إلى المنفذ تخزينًا مؤقتًا بحيث لا يحتاج للرجوع إلى Port Mapper في كل مرة يريد فيها التحدث إلى برنامج NFS. يُعَد NFS، من الناحية العملية، برنامجًا مهمًا لدرجة أنه أُعطي منفذ UDP الخاص به، ولكن نتظاهر بأن الأمر ليس كذلك لأغراض التوضيح. تشتمل ترويسات رسائل الطلب والرد على حقل XID "معرّف الاتفاق transaction ID"، كما في الشكل السابق، لمطابقة رسالة رد مع الطلب المقابل، بحيث يمكن إرجاع نتيجة استدعاء الإجراء البعيد إلى المستدعي الصحيح. XID هو معرّف الاتفاق الفريد الذي يستخدمه فقط طلبٌ واحد والرد المقابل له. لا يتذكر الخادم المعرّف XID بعد أن نجح في الرد على طلب معين. لا يستطيع SunRPC ضمان دلالات مرة واحدة على الأكثر at-most-once semantics. تعتمد تفاصيل دلالات SunRPC على بروتوكول النقل الأساسي. لا يطبق SunRPC موثوقيته الخاصة، لذلك لا يمكن الاعتماد عليه إلا إذا كان بروتوكول النقل الأساسي موثوقًا (قد يختار أي تطبيق مُشغَّل عبر SunRPC أيضًا تطبيق آليات الوثوقية الخاصة به فوق مستوى SunRPC). تعتمد القدرة على إرسال رسائل الطلب والرد التي تكون أكبر من وحدة الإرسال القصوى MTU للشبكة على النقل الأساسي. أي لا يحاول SunRPC تحسينَ النقل الأساسي عندما يتعلق الأمر بالموثوقية وحجم الرسالة. بما أن SunRPC يمكن تشغيله عبر العديد من بروتوكولات النقل المختلفة، فإن هذا يمنحه قدرًا كبيرًا من المرونة دون تعقيد تصميم بروتوكول RPC نفسه. بالعودة إلى صيغة ترويسة SunRPC بالشكل السابق، حيث تحتوي رسالة الطلب على حقول Credentials وVerifier ذات الطول المتغير، وكلاهما يستخدمه العميل بهدف استيثاق authenticate نفسه على الخادم، أي لتقديم دليل على أن العميل لديه الحق في استدعاء الخادم. تُعَد كيفية استيثاق العميل لنفسه على الخادم مشكلة عامة يجب معالجتها بواسطة أي بروتوكول يريد توفير مستوى معقول من الأمن. آلية DCE-RPC DCE-RPC هو بروتوكول RPC وهو صميم نظام DCE وكان أساس آلية RPC التي تقوم عليها Microsoft DCOM وActiveX. يمكن استخدامه مع المصرّف الجذعي stub compiler لتمثيل بيانات الشبكة Network Data Representation أو اختصارًا NDR، ولكنه يعمل أيضًا كبروتوكول RPC الأساسي لمعيار Common Object Request Broker Architecture أو اختصارًا CORBA، وهو معيار على مستوى الصناعة لبناء الأنظمة الموزعة والموجَّهة بالكائنات. يمكن تطبيق DCE-RPC، مثل SunRPC، فوق العديد من بروتوكولات النقل بما في ذلك UDP وTCP. وهو مشابه أيضًا لبروتوكول SunRPC من حيث أنه يحدد مخطط عنونة من مستويين: فك تعدد إرسال بروتوكول النقل إلى الخادم الصحيح، وإرسال DCE-RPC إلى إجراءٍ معين يصدّره هذا الخادم، ويستشير العملاء "خدمة ربط نقاط النهاية endpoint mapping service" (مماثلة لبرنامج Port Mapper الخاص ببروتوكول SunRPC) لمعرفة كيفية الوصول إلى خادمٍ معين. لكن ينفذ DCE-RPC دلالات استدعاء مرة واحدة على الأكثر at-most-once على عكس SunRPC. (يدعم DCE-RPC دلالات استدعاء متعددة، بما في ذلك الدلالات الراسخة المماثلة لدلالات SunRPC، ولكن دلالات at-most-once في معظم الأحيان هو السلوك الافتراضي). هناك بعض الاختلافات الأخرى بين المنهجين، التي سنسلط عليها الضوء في الفقرات التالية. يعطي الشكل السابق خطًا زمنيًا للتبادل النموذجي للرسائل، حيث تُسمَّى كل رسالة بنوع DCE-RPC الخاص بها. يرسل العميل رسالة طلب Request، ويرد الخادم في النهاية برسالة استجابة Response، ويرسل العميل إشعارًا Ack بالاستجابة. يرسل العميل دوريًا رسالة Ping إلى الخادم بدلًا من إقرار الخادم برسائل الطلب، والذي يستجيب برسالة Working للإشارة إلى أن الإجراء البعيد لا يزال قيد التنفيذ. إذا اُستلِم ردُّ الخادم بسرعة معقولة، فلن تُرسَل أية رسائل Ping. تُدعَم أنواع الرسائل الأخرى أيضًا على الرغم من عدم ظهورها في الشكل، حيث يمكن للعميل إرسال رسالة إنهاء Quit إلى الخادم، مطالبًا إياه بإنهاء استدعاءٍ سابق لا يزال قيد التنفيذ، فيستجيب الخادم برسالة Quack أي إشعار بالإنهاء quit acknowledgment. يمكن للخادم أيضًا الرد على رسالة طلب Request برسالة رفض Reject (تشير إلى رفض الاستدعاء)، ويمكنه الرد على رسالة Ping برسالة Nocall (تشير إلى أن الخادم لم يسمع المستدعي مطلقًا). يحدث كل اتفاق طلب / رد في DCE-RPC ضمن سياق نشاط activity. النشاط عبارة عن قناة طلب / رد منطقية بين زوج من المشاركين، ويمكن أن يكون هناك اتفاق رسالةٍ واحد فقط نشط على قناة معينة في نفس الوقت. يتعين على برامج التطبيق فتح قنوات متعددة إذا كانت تريد الحصول على أكثر من اتفاق طلب / رد فيما بينها في نفس الوقت مثل نهج القناة المنطقية المتزامنة الموصوفة أعلاه. يحدّد حقلُ ActivityId الخاص بالرسالة النشاطَ الذي تنتمي إليه الرسالة، ثم يميز حقل SequenceNum بين الاستدعاءات التي أُجريَت كجزءٍ من نفس النشاط، حيث يؤدّي هذا الحقل نفسَ الغرض من حقل XID الخاص ببروتوكول SunRPC، ولكن يتتبع DCE-RPC الرقم التسلسلي الأخير المستخدَم كجزء من نشاطٍ معين، وذلك لضمان دلالات مرة واحدة على الأكثر بخلاف SunRPC. يستخدم DCE-RPC حقل ServerBoot للاحتفاظ بمعرّف تشغيل الجهاز للتمييز بين الردود المرسلة قبل وبعد إعادة تشغيل جهاز الخادم. هناك خيار تصميم آخر أُجري في DCE-RPC مختلف عن SunRPC وهو دعم التجزئة وإعادة التجميع في بروتوكول RPC. كما هو مذكور أعلاه، حتى إذا وفّر بروتوكولٌ أساسي مثل IP التجزئة / إعادة التجميع، فإن الخوارزمية الأعقد التي تُطبَّق كجزء من RPC يمكن أن تؤدي إلى انتعاشٍ recovery أسرع وتقليلٍ في استهلاك حيز النطاق التراسلي عند فقد الأجزاء fragments. يعرّف الحقل FragmentNum بشكل فريد كل جزءٍ أو قطعة fragment تشكّل رسالة طلب أو رسالة رد معينة، ويُسنَد رقمُ جزء فريد لكل جزء DCE-RPC مثل (0 و1 و2 و3 وهكذا). يطبّق كلٌّ من العميل والخادم آلية إشعارٍ انتقائية selective acknowledgment، والتي تعمل على النحو التالي عند وصف الآلية بحيث يرسل العميل رسالة طلبٍ مجزأة إلى الخادم، وتُطبَّق نفس الآلية عندما يرسل الخادم استجابة مجزأة إلى العميل. أولًا، يحتوي كل جزءٍ fragment يشكّل رسالة طلب على FragmentNum فريد ورايةٍ flag تشير إلى ما إذا كانت هذه الرزمة packet هي جزء من استدعاء (frag) أو الجزء الأخير من استدعاء ()call، حيث تحمل رسائلُ الطلب التي تناسب رزمة واحدة رايةً. يعرف الخادم أنه تلقى رسالة الطلب كاملةً عندما يكون لديه الرزمة دون وجود فجوات في أرقام الأجزاء. ثانيًا، يرسل الخادم رسالة Fack، إشعار جزء fragment acknowledgment، إلى العميل استجابةً لكل جزءٍ قادم. يحدّد هذا الإشعار أعلى رقم للجزء الذي استلمه الخادم بنجاح، أي يكون الإشعار تراكميًا، كما هو الحال في بروتوكول TCP. ولكن يُقِر الخادم بصورة انتقائية بأي أرقام أجزاءٍ أعلى تلقاها مخالفةً للترتيب، ويفعل ذلك باستخدام متجّه بتات يحدد هذه الأجزاء المخالفة للترتيب بالنسبة لأعلى جزءٍ من الترتيب تلقاه. أخيرًا، يستجيب العميل بإعادة إرسال الأجزاء المفقودة. يوضح الشكل التالي كيفية عمل كل ذلك. لنفترض أن الخادم قد تلقى بنجاح أجزاءً fragments حتى الرقم 20، بالإضافة إلى الأجزاء 23 و25 و26. يستجيب الخادم بإشعار Fack الذي يحدد الجزء 20 على أنه أعلى جزء في الترتيب، بالإضافة إلى متجه بتات SelAck مع البت الثالث (23 = 20 + 3)، والخامس (25 = 20 + 5) ، والسادس (26 = 20 + 6) المُشغَّل. يُعطَى حجم المتجه (الذي يقاس بكلماتٍ مؤلفة من 32 بتًا) في حقل SelAckLen من أجل دعم متجه بتاتٍ طويلٍ (تقريبًا) كيفي. بما أن DCE-RPC يدعم الرسائل الكبيرة جدًا (إن طول حقل FragmentNum يبلغ 16 بتًا، مما يعني أن بإمكانه دعم 64 ألف جزء)، فليس من المناسب للبروتوكول إطلاق جميع الأجزاء التي تشكّل رسالةً بأسرع ما يمكن بما أن القيام بذلك قد يغمر جهاز الاستقبال. يطبّق DCE-RPC بدلًا من ذلك خوارزميةً للتحكم في التدفق تشبه إلى حدٍ كبير خوارزمية TCP، حيث لا تُقِر كل رسالة Fack بالأجزاء المستلَمة فحسب، بل تُعلِم المرسل أيضًا بعدد الأجزاء التي قد ترسلها الآن. هذا هو الغرض من حقل WindowSize في الشكل السابق، والذي يخدم بالضبط نفس الغرض من حقل AdvertisedWindow الخاص ببروتوكول TCP باستثناء أنه يحسب الأجزاء fragments بدلًا من البايتات. يطبّق DCE-RPC أيضًا آلية للتحكم في الازدحام مشابهة لآلية TCP. قد لا يكون من المستغرب أن تتجنب بعض بروتوكولات RPC ذلك عن طريق تجنب التجزئة نظرًا لتعقيد التحكم في الازدحام. يوجد لدى المصممين مجموعة كبيرة من الخيارات المفتوحة لهم عند تصميم بروتوكول RPC. تتخذ SunRPC نهجًا أبسط وتضيف القليل نسبيًا إلى النقل الأساسي بخلاف أساسيات تحديد الإجراء الصحيح وتحديد الرسائل. يضيف DCE-RPC المزيد من الوظائف، مع إمكانية تحسين الأداء في بعض البيئات على حساب تعقيد أكبر. آلية gRPC على الرغم من أن أصولها من Google، ولكن gRPC لا تمثل Google RPC، فيرمز الحرف "g" إلى شيء مختلف في كل إصدار. رمز الحرف "g" إلى "glamorous" في الإصدار 1.10، وأشار إلى "goose" في الإصدار 1.18.تحظى gRPC بشعبية لأنها تتيح للجميع (كمصدر مفتوح) خبرةَ عشر سنوات داخل Google من خلال استخدام RPC لإنشاء خدمات سحابية قابلة للتوسّع. هناك بعض الاختلافات الرئيسية بين gRPC والمثالين الآخرين اللذين تناولناهما للتو. الاختلاف الأكبر هو أن gRPC مصممٌ للخدمات السحابية بدلًا من نموذج العميل / الخادم الأبسط الذي سبقه، ففي عالم العميل / الخادم، يستدعي العميل طريقةً في عملية خادم معينة تعمل على جهاز خادم معين. يُفترض أن تكون إحدى عمليات الخادم كافيةً لخدمة الاستدعاءات من جميع عمليات العميل التي قد تستدعيها. يستدعي العميل باستخدام الخدمات السحابية طريقةً في خدمة service، والتي تُنفَّذ من خلال عددٍ قابلٍ للتوسّع من عمليات الخادم من أجل دعم استدعاءات عدة عملاء كيفيًا في نفس الوقت، ويعمل كلٌّ من هذه العمليات على جهاز خادم مختلف. هذا هو المكان الذي تلعب فيه السحابة: توفّر مراكز البيانات عددًا يبدو لا نهائيًا من أجهزة الخادم المتاحة لتوسيع نطاق الخدمات السحابية. نعني مصطلح "قابل للتوسع scalable" أن عدد عمليات الخادم المتطابقة التي تختار إنشائها يعتمد على ضغط العمل (أي عدد العملاء الذين يريدون الخدمة في أي وقت معين) ويمكن تعديل هذا الرقم ديناميكيًا بمرور الوقت. أحد التفاصيل الأخرى هو أن الخدمات السحابية لا تنشئ عادةً عمليةً جديدة، في حد ذاتها، ولكنها تطلق حاويةً container جديدة، وهي في الأساس عمليةٌ مغلفةٌ داخل بيئة معزولة تتضمن جميع حزم البرمجيات التي تحتاجها العملية لتعمل. تُعَد Docker اليوم المثال الأساسي لمنصة حاويات. بالعودة إلى الادعاء القائل بأن الخدمة هي أساسًا مستوىً إضافيًا من التوجّه غير المباشر فوق الخادم، وهذا يعني أن المستدعي يحدد الخدمة التي يريد استدعاءها، ويوجه موازنُ الحِمل load balancer هذا الاستدعاء إلى إحدى عمليات الخوادم العديدة المتاحة (الحاويات) التي تطبّق تلك الخدمة، كما هو موضح في الشكل السابق. يمكن تطبيق موازن الحِمل بطرقٍ مختلفة، بما في ذلك جهاز عتاد، ولكنه يُطبَّق عادةً بواسطة عملية وكيل proxy تُشغَّل في آلة افتراضية (مستضافةٌ أيضًا في سحابة) وليس كجهاز فيزيائي. هناك مجموعة من أفضل الممارسات لتطبيق شيفرة الخادم الفعلي الذي يستجيب في النهاية لهذا الطلب، وبعض الآليات السحابية الإضافية لإنشاء / إتلاف create/destroy الحاويات وطلبات موازنة الحِمل عبر تلك الحاويات. إن أفضل الممارسات في بناء الخدمات بهذه الطريقة السحابية الأصلية هي: Kubernetes وهو اليوم بمثابة المثال الأساسي لنظام إدارة الحاويات هذا، ومعمارية الخدمات الصغيرة micro-services architecture. كلا الموضوعين مثيران للاهتمام، لكنهما خارج نطاق هذه السلسلة. ما يهمنا هنا هو بروتوكول النقل في صميم gRPC. هناك خروجٌ كبير عن البروتوكولين السابقين، ليس من حيث المشاكل الأساسية التي تحتاج إلى معالجة، ولكن من حيث نهج gRPC لمعالجة هذه المشاكل. يستعين gRPC بمصادر خارجية للعديد من المشكلات التي تواجه البروتوكولات الأخرى، مما يؤدي إلى حزم gRPC لتلك القدرات في نموذجٍ سهل الاستخدام. دعنا نلقي نظرة على التفاصيل. أولًا، يعمل gRPC فوق TCP بدلًا من UDP، مما يعني أنه يستعين بمصادر خارجية لمشاكل إدارة الاتصال والنقل الموثوق لرسائل الطلب والرد ذات الحجم الكيفي. ثانيًا، يعمل gRPC فعليًا فوق نسخةٍ مؤمَّنة من بروتوكول TCP تسمى طبقة النقل الآمنة Transport Layer Security أو اختصارًا TLS، وهي طبقة رقيقة تقع فوق بروتوكول TCP في مكدس البروتوكول، مما يعني أنها تستعين بمصادر خارجية لتأمين قناة الاتصال بحيث لا يستطيع الخصوم سرقة أو التنصت على تبادل الرسائل. ثالثًا، يعمل gRPC فعليًا فوق HTTP / 2 (والذي يقع في حد ذاته فوق TCP وTLS)، مما يعني أن لدى مصادر gRPC الخارجية مشكلتان إضافيتان: (1) تشفير / ضغط البيانات الثنائية بكفاءة في رسالة، (2) تعدد إرسال عدة استدعاءات بعيدة من أجل اتصال TCP واحد. يشفّر gRPC المعرّف الخاص بالطريقة البعيدة مثل URI، ومعاملات الطلب للطريقة البعيدة كمحتوىً في رسالة HTTP، والقيمة المعادة من الطريقة البعيدة في استجابة HTTP. يوضّح الشكل التالي مكدس gRPC الكامل، والذي يتضمن أيضًا العناصر الخاصة باللغة. (تتمثل إحدى نقاط قوة gRPC في المجموعة الواسعة من لغات البرمجة التي يدعمها، ويوضح الشكل التالي مجموعة فرعية صغيرة منها فقط). نناقش TLS وHTTP في مقالات لاحقة، لكننا نجد أنفسنا في حلقة اعتمادية مثيرة للاهتمام: حيث تُعد آلية RPC تشعبًا عن بروتوكول النقل المستخدَم لتنفيذ التطبيقات الموزعة، ويُعتبر HTTP مثالًا عن بروتوكول مستوى التطبيق، إلّا أنّ gRPC يعمل فوق HTTP وليس العكس. التفسير المختصر هو أن الطبقات توفر طريقة ملائمة للبشر لفهم الأنظمة المعقدة، ولكن ما نحاول فعله حقًا هو حل مجموعة من المشكلات (مثل النقل الموثوق للرسائل ذات الحجم الكيفي وتحديد المرسلين والمستلمين، تطابق رسائل الطلب مع رسائل الرد، وما إلى ذلك) وإن الطريقة التي تجمَّع فيها هذه الحلول في البروتوكولات، ثم وضع تلك البروتوكولات فوق بعضها البعض هي نتيجةً للتغييرات المتزايدة بمرور الوقت. لو بدأ الإنترنت بآلية RPC موجودةٍ في كل مكان مثل بروتوكول TCP، فربما طُبِّق HTTP فوقها (مثل أغلب البروتوكولات الأخرى على مستوى التطبيق تقريبًا) وربما قضت Google وقتها في تحسين هذا البروتوكول بدلًا من اختراع بروتوكولٍ خاص بها (كما فعلت هي والآخرين مع بروتوكول TCP). لكن ما حدث بدلًا من ذلك أنّ الويب أصبح التطبيق القاتل للإنترنت، مما يعني أن بروتوكول التطبيق الخاص به HTTP أصبح مدعومًا عالميًا من بقية البنية التحتية للإنترنت: جدران الحماية وموازنات الحِمل والتشفير والاستيثاق والضغط وما إلى ذلك. أصبح HTTP بفعالية بروتوكولَ نقل الطلب / الرد العالمي للإنترنت، نظرًا لأن جميع عناصر الشبكة هذه قد صمِّمت للعمل جيدًا مع بروتوكول HTTP. بالعودة إلى خصائص gRPC الفريدة، فإن أكبر قيمة يقدمها هي دمج التدفق streaming في آلية RPC، أي أن gRPC يدعم أربعة أنماط طلب / رد مختلفة: RPC البسيط Simple RPC: يرسل العميل رسالة طلبٍ واحدة ويستجيب الخادم برسالة ردٍ واحدة. Server Streaming RPC: يرسل العميل رسالة طلبٍ واحدة ويستجيب الخادم بتدفقٍ من رسائل الرد. يكمل العميل عمله بمجرد حصوله على جميع استجابات الخادم. Client Streaming RPC: يرسل العميل تدفقًا من الطلبات إلى الخادم، ويرسل الخادم استجابة واحدة عادةً (ولكن ليس بالضرورة) بعد أن يتلقى جميع طلبات العميل. تدفق RPC ثنائي الاتجاه Bidirectional Streaming RPC: يبدأ العميل الاستدعاء، ولكن يمكن للعميل والخادم بعد ذلك قراءة وكتابة الطلبات والاستجابات بأي ترتيب، حيث أن التدفقات مستقلةٌ تمامًا عن بعضها. تعني هذه الحرية الإضافية في كيفية تفاعل العميل والخادم أن بروتوكول نقل gRPC يحتاج إلى إرسال بيانات وصفية metadata ورسائل تحكم إضافية، بالإضافة إلى رسائل الطلب والرد الفعلية، بين النظيرين. تتضمن الأمثلة شيفرات الخطأ Error والحالة Status (للإشارة إلى نجاح أو سبب فشل شيء ما)، وTimeouts (للإشارة إلى المدة التي يرغب العميل انتظارَ الرد فيها) ، وPING (إشعار البقاء نشطًا keep-alive للإشارة إلى أن جانبًا أو آخر لا يزال قيد التشغيل)، وEOS (إشعار نهاية التدفق end-of-stream للإشارة إلى عدم وجود المزيد من الطلبات أو الاستجابات)، وGOAWAY (إشعار من الخوادم للعملاء للإشارة إلى أنهم لن يقبلوا بعد الآن أي تدفقاتٍ جديدة). إن الطريقة التي تُمرَّر فيها معلومات التحكم هذه بين الجانبين يمليها إلى حدٍ كبير بروتوكول النقل الأساسي، الذي هو HTTP / 2 في هذه الحالة، على عكس العديد من البروتوكولات الأخرى في هذه السلسلة، حيث يتضمن HTTP بالفعل مجموعةً من حقول الترويسات وشيفرات الرد التي يستفيد منها gRPC. قد يتضمن طلب RPC البسيط (بدون تدفق) رسالة HTTP التالية من العميل إلى الخادم: HEADERS (flags = END_HEADERS) :method = POST :scheme = http :path = /google.pubsub.v2.PublisherService/CreateTopic :authority = pubsub.googleapis.com grpc-timeout = 1S content-type = application/grpc+proto grpc-encoding = gzip authorization = Bearer y235.wef315yfh138vh31hv93hv8h3v DATA (flags = END_STREAM) <Length-Prefixed Message> مما يؤدي إلى رسالة الاستجابة التالية من الخادم إلى العميل: HEADERS (flags = END_HEADERS) :status = 200 grpc-encoding = gzip content-type = application/grpc+proto DATA <Length-Prefixed Message> HEADERS (flags = END_STREAM, END_HEADERS) grpc-status = 0 # OK trace-proto-bin = jher831yy13JHy3hc تُعَد HEADERS وDATA في هذا المثال رسالتين قياسيتين للتحكم في HTTP، والتي تصف بدقة وفعالية "ترويسة الرسالة" و"حمولة الرسالة". كل سطر يتبع HEADERS (ولكن قبل DATA) هو زوج attribute = value الذي يشكّل الترويسة (فكر في كل سطر على أنه مشابه لحقل الترويسة). الأزواج التي تبدأ بنقطتين (:status = 200 على سبيل المثال) هي جزء من معيار HTTP (تشير الحالة 200 إلى النجاح مثلًا). وتلك الأزواج التي لا تبدأ بنقطتين هي تخصيصات محدّدة بالآلية gRPC (تشير grpc-encoding = gzip على سبيل المثال إلى أن البيانات في الرسالة التالية قد ضُغِطت باستخدام gzip، وتشير grpc-timeout = 1S إلى أن العميل قد ضبط مهلة زمنية مقدارها ثانية واحدة). هناك قطعة أخيرة لشرحها وهو سطر الترويسة: content-type = application/grpc+proto الذي يشير إلى أن جسم الرسالة كما حدّده سطر DATA له معنى فقط لبرنامج التطبيق، أي طريقة الخادم الذي يطلب هذا العميل الخدمة منه. تحدد سلسلة +proto أن المستلم سيكون قادرًا على تفسير البتات في الرسالة وفقًا لمواصفات واجهة مخزَن البروتوكول المؤقت Protocol Buffer أو اختصارًا proto. مخازن البروتوكول المؤقتة هي طريقة gRPC لتحديد كيفية تشفير المعاملات الممرَّرة إلى الخادم في رسالة، والتي تُستخدم بدورها لإنشاء الأجزاء الجذعية التي تقع بين آلية RPC الأساسية والوظائف الفعلية التي تُستدعى. ترجمة -وبتصرّف- للقسم Remote Procedure Call من فصل End-to-End Protocols من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا المقال السابق: بروتوكولات تدفق البايتات الموثوقة في الشبكات الحاسوبية: آلية الإرسال والبدائل تثبيت وإعداد نظام الوصول عن بعد VNC على نظام توزيعة ديبيان 10 توجيه Routing الرزم ضمن الشبكات الحاسوبية
  16. سننشئ في هذا المقال رسومًا من النمط Pop Art Explosion باستخدام برنامج سكريبوس Scribus، حيث سنستخدم التقنيات المحدَّدة المُستخدَمة التالية لإنشاء هذا التصميم: إنشاء أشكال. إنشاء مضلع. تحويل الأشكال باستخدام الدوران. إنشاء نقش أو نمط Pattern. التعبئة باستخدام نقش. تحويل النص إلى مخططات تفصيلية Outlines. سيكون ممكنًا لأي شخص لديه معرفة أساسية ببرنامج سكريبوس Scribus اتباع هذه الخطوات، ولكن الأشخاص الذين لم يستخدموا برنامج سكريبوس من قبل لا يمكنهم ذلك. الإعداد ستحتاج أولًا إلى تنزيل الخط Startling Font وتثبيته إن لم يكن لديك سابقًا، ولكن يمكنك استخدام الخط الذي تريده، لهذا افتح برنامج سكريبوس وأنشئ مستندًا جديدًا، حيث سيكون القياس A4 أو رسالة Letter Portrait جيدًا. سيحتاج هذا المشروع الصغير إلى مساحة كبيرة بعض الشيء، لذلك يُفضَّل إنشاء كل طبقة على صفحة مختلفة كالآتي: اختر قائمة صفحة Page ثم إضافة Insert. غيّر عدد الصفحات إلى 2 ثم اضغط موافق. الخلفية انتقل إلى صفحة المستند الأولى. اختر قائمة إدراج Insert، ثم شكل، بعد ذلك اختر أشكال افتراضية Default Shapes، ثم مثلث قائم الزاوية وهو الشكل الثالث في القائمة. انقر في مكان ما بالقرب من وسط الصفحة. أدخل العرض 14 نقطة والارتفاع 150 نقطة ثم اضغط موافق (أو يمكنك تعديل العرض والارتفاع من نافذة خصائص Properties). اضبط لون الحدّ Line colour على القيمة "لا شيء" في تبويب ألوان Colours من نافذة خصائص Properties. اضبط لون التعبئة على اللون "الأحمر" بدرجة ظل 60%. بهذا ستكون قد حصلت على مثلث البداية الأول كما في الشكل التالي: حدّد المثلث ثم اختر قائمة عنصر ثم مضاعفة/تحويل ثم نسخ مطابق Duplicate. حدد النسخة المكرَّرة ثم اضغط على أيقونة "اقلب أفقيًا Flip Horizontal" (السهم الأفقي ذو الرأسين) في تبويب X وY وZ، وذلك في نافذة خصائص. غيّر العرض إلى 24 نقطة. اضبط لون التعبئة على "اللون الأصفر" في تبويب ألوان Colors من نافذة خصائص. اسحب المثلث الأصفر الجديد إلى اليمين قليلًا، لتتمكّن من تحديد المثلث الآخر بسهولة أكبر. حدّد المثلث الأصفر، ثم اضغط على مفتاح Shift، مع تحديد المثلث الأحمر. اختر قائمة نوافذ Windows ثم حدّد الخيار "حاذِ ووزّع Align and Distribute". اضبط "متعلق بـ Relative To" على الخيار "الاختيار الأخير Last Selected" في نافذة "حاذِ ووزّع". اضغط على أيقونة "حاذِ الجوانب اليمنى للعناصر بالجانب الأيسر للمربط Align right sides of items to left side of anchor". اضغط على أيقونة "حاذِ الجوانب العليا Align Tops". يجب أن يظهر لديك الآن مثلثان مثل الشكل التالي: حدّد المثلث الأحمر. انتقل إلى قائمة عنصر Item ثم مضاعفة/تحويل، ثم تحويل Transform. اضغط على زر إضافة Add واختر "تدوير Rotation" من القائمة. اضبط الزاوية على القيمة 13.9 درجة، والتي يجب عليك كتابتها يدويًا. حدّد الدائرة العلوية اليسرى في مربع "نقطة أساسية Origin". اضبط عدد النسخ على القيمة 25. اضغط موافق. بهذا نكون قد أنجزنا نصف المهمة، والآن لننتقل إلى الجزء الآخر. حدّد المثلث الأصفر (قد تحتاج إلى تحديده وسحبه للتأكد من عدم تحديد أي شيء آخر). اختر قائمة عنصر ثم تحويل. اضغط على زر "إضافة" واختر "تدوير" من القائمة. اضبط الزاوية على القيمة 13.9 درجة. حدّد الدائرة العلوية اليمنى هذه المرة في مربع "نقطة أساسية Origin". اضبط عدد النسخ على القيمة 25. اضغط موافق. يجب أن تظهر لديك الآن هذه "الزهرة" الجميلة الموجودة في الشكل التالي: لا تقلق بشأن عدم تساوي الحواف، إذ سنصلح ذلك في النهاية من خلال ما يلي: حدّد كل ما رسمته على هذه الصفحة. اختر قائمة عنصر ثم تجميع ثم اختر مجموعة Group. إنشاء شكل الانفجار Explosion يجب الآن رسم "الانفجار" الذي يقع بين الخلفية والنص. انتقل للأسفل إلى الصفحة الثانية. اختر قائمة إدراج Insert، ثم إدراج مضلع Insert Polygon، بعد ذلك خصائص Properties. غيّر عدد الزوايا إلى 7. انقر على مربع الاختيار "طبّق المعامل Apply Factor" لتفعيله. اضبط "المعامل Factor" على ‎-45% (ناقص 45). اضبط "الانحناء الداخلي Curvature" على 20%. انقر بالقرب من منتصف الصفحة. أدخل العرض بقيمة 260 نقطة والارتفاع بقيمة 160 نقطة. انقر على موافق، أو اسحب الشكل إلى وسط الصفحة إن لزم الأمر. حدّد الشكل ثم اضبط التدوير Rotation على القيمة 330 درجة في تبويب X وY وZ من نافذة خصائص. يجب أن يكون لديك الآن شكل يشبه ما يلي: اضبط عرض الخط على 3 نقاط في تبويب خط Line من نافذة خصائص. اضبط لون التعبئة على اللون "الأبيض" في تبويب ألوان Colours من نافذة خصائص. اختر قائمة عنصر، ثم مضاعفة/تحويل، بعد ذلك نُسخ مطابقة Multiple Duplicate. اضغط موافق دون إجراء أي تغييرات. لنشكّل الآن نمط تعبئة منقطة كما يلي: اختر قائمة إدراج، ثم شكل، ثم أشكال افتراضية، بعدها اختر دائرة. انقر في أي مكان فارغ في الصفحة. أدخل القيمة 16 نقطة للعرض و16 نقطة للارتفاع أيضًا، ثم اضغط على موافق. اضبط لون التعبئة على اللون "الأزرق" في تبويب ألوان في نافذة خصائص. اضبط الظل Shade على القيمة 60%. اضبط لون الحد على "لا شيء None". حدّد هذه الدائرة الصغيرة، ثم اختر قائمة عنصر، ثم مضاعفة/تحويل، ثم تحويل. اضغط على زر "إضافة" واختر "ترجمة" من القائمة. اضبط القيم الأفقية والرأسية على 8 نقاط. اضبط عدد النسخ على القيمة 1. اضغط موافق. ألغِ تحديد كل شيء وأعِد تحديد الدائرة المنسوخة فقط (الموجودة على اليمين). اضبط لون التعبئة على "لا شيء" في تبويب ألوان من نافذة خصائص. اسحب وحدد كلتا الدائرتين. اختر قائمة عنصر ثم تجميع، ثم اختر مجموعة. اختر قائمة عنصر ثم "أرسل إلى"، بعد ذلك اختر نقوش Send to Patterns. أدخل الاسم "Dots" ثم اضغط موافق. حدّد الشكل الشبيه بالأشواك الذي أنشأته مسبقًا (وهو في الواقع النسخة المكرَّرة الموجودة في الأعلى). اضغط على نمط التعبئة في تبويب ألوان من نافذة خصائص، واختر "نقش Pattern" من القائمة. حدّد النقش "Dots". اضغط على خصائص أسفل النقوش، ثم اضبط كلًا من قيمة تحجيم-س X-Scale وتحجيم-ص Y-Scale على 25% في قسم "تحجيم Scaling". يجب أن يكون لديك الآن شكل مملوء بالنقاط كما يلي: اسحب وحدّد كل الأشكال ذات الأشواك. اختر قائمة "عنصر"، ثم "تجميع"، ثم "مجموعة Group". النص انتقل للأسفل إلى الصفحة الثالثة. أنشئ إطار نص يبلغ عرضه حوالي 400 نقطة وارتفاعه 160 نقطة. انقر نقرًا مزدوجًا على الإطار وأدخل الكلمة "BANG" (بدون علامات الاقتباس) كنص. انقر على خلفية الصفحة لإلغاء تحديد الإطار. أعد تحديد الإطار. اختر الخط "Startling Font" من نافذة خصائص النص، والتي يمكنك الوصول إليها من قائمة "نوافذ"، ثم "خصائص المحتوى". اضبط حجم الخط ليكون 100 نقطة. اضبط لون النص ليكون لونه أحمر، وذلك في تبويب الألوان والمؤثرات Colour & Effects من نافذة خصائص النص. اختر قائمة عنصر ثم تحويل لـ Convert To ثم اختر مخططات تفصيلية Outlines. أعد تحديد النص. اختر قائمة "عنصر"، ثم "التجميع"، ثم اختر فك التجميع Ungroup. اختر قائمة "عنصر"، ثم "أدوات المسار"، ثم اجمع المضلعات Combine Polygons. أعِد تحديد النص. اضبط لون الحد على اللون "الأسود" في تبويب ألوان من نافذة خصائص. اضبط عرض الخط على 3 نقاط في تبويب خط Line من نافذة خصائص. اختر قائمة عنصر، ثم مضاعفة/تحويل، ثم نُسخ مطابقة Multiple Duplicate. ثم اضغط على موافق دون إجراء أي تغييرات. حدد النص (النسخة العلوية). اضغط على المؤشر للأسفل مرتين من لوحة المفاتيح. اضغط على المؤشر لليمين مرتين من لوحة المفاتيح. اضبط لون التعبئة على اللون "الأسود" (في حالة رغبتك في تحريك الظل لمسافة أبعد). اختر قائمة عنصر ثم مستوى Level ثم للأسفل Lower. يجب أن يكون لديك الآن نص له ظل مثل الشكل التالي: اسحب وحدّد النص. اختر قائمة عنصر، ثم تجميع، ثم مجموعة. تجميع الأجزاء مع بعضها البعض حدّد النص. مرّر للأعلى واضغط Shift، ثم حدد الشكل الذي يشبه الأشواك. انتقل لأعلى مرةً أخرى واضغط Shift، ثم حدد "الزهرة". افتح نافذة حاذِ ووزّع Align & Distribute مرةً أخرى إن أغلقتها سابقًا، ثم تأكّد من ضبط "متصل بـ Relative To" على القيمة "الاختيار الأخير Last Selected". اضغط على أيقونة "مَركِز على المحور الرأسي Centre on vertical axis". اضغط على أيقونة "مَركِز على المحور الأفقي Centre on horizontal axis". الخطوة النهائية الخطوة الأخيرة هي ترتيب كل الأشياء مع بعضها البعض، وذلك باتباع ما يلي: اختر قائمة إدراج ثم شكل ثم أشكال افتراضية ثم دائرة. انقر في أي مكان على صفحتك. أدخل عرضًا وارتفاعًا بمقدار 300 نقطة. اضغط على موافق. اضبط لون الحد على اللون "الأبيض" من تبويب ألوان في نافذة خصائص. اضبط عرض الخط على 6 نقاط. حدّد الدائرة البيضاء، ثم اضغط مفتاح Shift، وحدّد "الزهرة". تأكّد من ضبط "متصل بـ Relative To" على القيمة "الاختيار الأخير Last Selected" من نافذة حاذِ ووزّع Align & Distribute. اضغط على أيقونة "مَركِز على المحور الرأسي Centre on vertical axis". اضغط على أيقونة "مَركِز على المحور الأفقي Centre on horizontal axis". وبهذا تكون قد أنشأت شكل Pop Art Explosion التالي: ترجمة -وبتصرّف- للمقال How to create a Pop Art Explosion. اقرأ أيضًا كيفية إنشاء لافتة نيون Neon Sign في برنامج سكريبوس Scribus كيفية إنشاء أشكال معقدة ذات زوايا دائرية في برنامج سكريبوس Scribus خطوات تطوير شعار باستخدام برنامج سكريبوس Scribus كيفية إنشاء التأثير Distressing Mask في برنامج سكريبوس لإنتاج تأثيرات تعبئة جذابة
  17. يدعم TCP تجريد تدفق البايت، أي أن برامج التطبيقات تكتب البايت في التدفق، والأمر متروك لبروتوكول TCP لاتخاذ القرار بأن لديه بايتات كافية لإرسال جزء. لكن ما هي العوامل التي تحكم هذا القرار؟ سنتابع في هذا المقال ما تحدثنا عنه في المقال السابق حول بروتوكولات تدفق البايتات الموثوقة بالاعتماد على مثال TCP، وسنكمل الحديث هنا عن هذه البروتوكولات آخذين جانب آلية الإرسال والبدائل. إذا تجاهلنا إمكانية التحكم في التدفق، أي بفرض أن النافذة مفتوحة على مصراعيها كما هو الحال عند بدء الاتصال لأول مرة، عندئذ يكون لدى بروتوكول TCP ثلاث آليات لبدء إرسال جزء. أولًا، يحتفظ بروتوكول TCP بمتغير، يسمى عادةً حجم الجزء الأقصى maximum segment size أو اختصارًا MSS، ويرسل جزءًا بمجرد أن يجمع بايتاتٍ بحجم MSS من عملية الإرسال. يُضبَط MSS على حجم أكبر جزء يمكن أن يرسله TCP دون التسبب في تجزئة عنوان IP المحلي. أي ضُبِط MSS على أقصى وحدة إرسال maximum transmission unit أو اختصارًا MTU للشبكة المتصلة مباشرة، مطروحًا منها حجم ترويستي TCP و IP. الشيء الثاني الذي ينبّه بروتوكول TCP لإرسال جزء هو أن عملية الإرسال طلبت منه صراحةً القيام بذلك. يدعم بروتوكول TCP العملية push، وتستدعي عملية الإرسال هذه العملية لتفريغ flush المخزن المؤقت للبايتات غير المرسلة بفعالية. المنبّه trigger الأخير لإرسال جزء هو إنطلاق المؤقت timer، حيث يحتوي الجزء الناتج على العديد من البايتات المخزَّنة حاليًا للإرسال. وعلى أية حال لن يكون هذا "المؤقت" كما تتوقعه بالضبط كما سنرى قريبًا. متلازمة النوافذ الساذجة Silly Window Syndrome لا يمكننا بالتأكيد تجاهل التحكم في التدفق فقط، والذي يلعب دورًا واضحًا في تقييد المرسل. فإذا كان لدى المرسل بايتات بحجم MSS من البيانات لإرسالها وكانت النافذة مفتوحة على الأقل بهذا القدر، فإن المرسل يرسل جزءًا كاملًا. افترض أن المرسل يجمّع البايتات لإرسالها، ولكن النافذة مغلقة حاليًا. لنفترض الآن وصول ACK يفتح النافذة بفعالية بما يكفي لإرسال المرسل، بحجم MSS / 2 بايت مثلًا. هل يجب على المرسل إرسال جزء نصف ممتلئ أم الانتظار حتى تفتح النافذة بحجم MSS كامل؟ لم تذكر المواصفات الأصلية شيئًا بشأن هذه النقطة، وقررت عمليات التنفيذ الأولي لبروتوكول TCP المضي قدمًا وإرسال جزء نصف كامل، ولكن ليس هناك ما يخبرنا إلى متى سيبقى بهذه الحالة قبل أن تفتح النافذة أكثر. اتضح أن استراتيجية الاستفادة الكبيرة من أية نافذةٍ متاحة تؤدي إلى حالة تُعرَف الآن باسم متلازمة النوافذ الساذجة، حيث يساعد الشكل التالي على تصور ما يحدث: إذا فكّرت في تدفق TCP على أنه حزامٌ ناقل به حاويات "ممتلئة" أو أجزاء بيانات data segments تسير في اتجاهٍ واحد وحاويات فارغة هي الإشعارات ACKs تسير في الاتجاه العكسي. فإن الأجزاء ذات الحجم MSS تتوافق مع الحاويات الكبيرة والأجزاء ذات الحجم 1 بايت تتوافق مع حاويات صغيرة جدًا. طالما أن المرسل يرسل أجزاءًا بحجم MSS ويرسل المستقبل إشعارات ACKs على الأقل بحجم MSS من البيانات في كل مرة، وبالتالي سيعمل كل شيء جيدًا (كما في القسم أ من الشكل الآتي). لكن ماذا لو اضطر المستقبل إلى تقليل النافذة بحيث لا يتمكن المرسل في وقتٍ ما من إرسال MSS كامل من البيانات؟ إذا ملأ المرسل حاويةً فارغة حجمها أصغر من MSS بمجرد وصولها، فسيرسل المستقبل إشعارًا بهذا العدد الأصغر من البايتات، وبالتالي تظل الحاوية الصغيرة المدخلة في النظام إلى أجلٍ غير مسمى فيه، أي أنها تُملَأ وتُفرَغ على الفور عند كل طرف ولا تُدمَج مطلقًا مع الحاويات المجاورة لإنشاء حاويات أكبر، كما في القسم (ب) من الشكل التالي. اُكتشِف هذا السيناريو عندما وجدت التطبيقات الأولى لبروتوكول TCP نفسها تملأ الشبكة بأجزاء صغيرة. تُعتبر متلازمة النوافذ الساذجة مشكلةً فقط عندما يرسل المرسل جزءًا صغيرًا أو يفتح جهاز الاستقبال النافذة بمقدار صغير. إذا لم يحدث أي من هذين الأمرين، فلن تُدخَل الحاوية الصغيرة مطلقًا في التدفق. من غير الممكن تحريم إرسال مقاطع صغيرة، فقد يقوم التطبيق بعملية push بعد إرسال بايت واحد على سبيل المثال، ولكن من الممكن منع جهاز الاستقبال من إدخال حاوية صغيرة (أي نافذة صغيرة مفتوحة)، حيث يجب أن ينتظر جهاز الاستقبال حيزًا يساوي حجم MSS قبل أن يعلن عن نافذة مفتوحة، وذلك بعد الإعلان عن نافذةٍ صفرية. نظرًا لإمكانية استبعاد إمكانية إدخال حاويةٍ صغيرة في التدفق، إلا أننا نحتاج أيضًا إلى آلياتٍ لدمجها. يمكن للمستقبل القيام بذلك عن طريق تأخير ACK، أي إرسال ACK واحد مدمج بدلًا من إرسال عدة رسائلٍ أصغر، ولكن هذا حل جزئي فقط لأن جهاز الاستقبال ليس لديه طريقة لمعرفة المدة التي يمكن فيها تأخير انتظار وصول جزء آخر أو انتظار التطبيق لقراءة المزيد من البيانات (وبالتالي فتح النافذة). يقع الحل النهائي على عاتق المرسل، وهو ما يعيدنا إلى مشكلتنا الأصلية: متى يقرر مرسل TCP إرسال جزءsegment؟ خوارزمية Nagle بالعودة إلى مرسل TCP، إذا كانت هناك بياناتٌ لإرسالها ولكن النافذة مفتوحة بحجمٍ أقل من حجم MSS، فقد نرغب في الانتظار بعض الوقت قبل إرسال البيانات المتاحة، ولكن السؤال هو كم طول هذه المدة؟ إذا انتظرنا وقتًا طويلًا، فإننا نُضِر بذلك التطبيقات التفاعلية مثل تطبيق Telnet. وإذا لم ننتظر طويلًا بما فيه الكفاية، فإننا نجازف بإرسال مجموعةٍ من الرزم الصغيرة والوقوع في متلازمة النوافذ الساذجة. الجواب هو إدخال مؤقت timer والإرسال عند انتهاء مدته. يمكننا استخدام مؤقت قائم على النبضات، مثل مؤقت ينطلق كل 100 ميلي ثانية. قدّم Nagle حلًا رائعًا للتوقيت الذاتي. الفكرة هي أنه طالما لدى بروتوكول TCP أي بيانات قيد الإرسال in flight، فإن المرسل سيتلقى في النهاية ACK. يمكن التعامل مع ACK كإطلاق مؤقت، ينبِّه بإرسال المزيد من البيانات. توفر خوارزمية Nagle قاعدة بسيطة وموحدة لاتخاذ قرار بشأن توقيت بدء الإرسال. When the application produces data to send if both the available data and the window >= MSS send a full segment else if there is unACKed data in flight buffer the new data until an ACK arrives else send all the new data now من المقبول دائمًا إرسال جزء كامل إذا سمحت النافذة بذلك، كما يحق لك إرسال كمية صغيرة من البيانات على الفور إذا لم يكن هناك أي أجزاء قيد النقل. ولكن إذا كان هناك أي شيء قيد الإرسال، فيجب على المرسل انتظار ACK قبل إرسال الجزء التالي. وبالتالي سيرسل تطبيقٌ تفاعلي مثل Telnet الذي يكتب باستمرار بايتًا واحدًا في المرة الواحدة البياناتِ بمعدل جزء واحد لكل RTT. ستحتوي بعض الأجزاء على بايت واحد، بينما يحتوي البعض الآخر على عدد بايتات بقدر ما كان المستخدم قادرًا على الكتابة في وقت واحد ذهابًا وإيابًا. تسمح واجهة المقبس للتطبيق بإيقاف تشغيل خوارزمية Nagel عن طريق تعيين خيار TCP_NODELAY نظرًا لأن بعض التطبيقات لا يمكنها منح مثل هذا التأخير لكل عملية كتابة تقوم بها لاتصالٍ من نوع TCP، حيث يعني ضبط هذا الخيار إرسال البيانات في أسرع وقتٍ ممكن. إعادة الإرسال التكيفي Adaptive Retransmission بما أن بروتوكول TCP يضمن التسليم الموثوق للبيانات، فإنه يعيد إرسال كل جزء إذا لم يُستلَم إشعار ACK خلال فترةٍ زمنية معينة. يضبط بروتوكول TCP هذه المهلة الزمنية كدالة لوقت RTT الذي يتوقعه بين طرفي الاتصال. إن اختيار قيمة المهلة الزمنية المناسبة ليس بهذه السهولة لسوء الحظ، نظرًا لمجال قيم RTT الممكنة بين أي زوجٍ من المضيفين في الإنترنت، بالإضافة إلى الاختلاف في RTT بين نفس المضيفين بمرور الوقت. لمعالجة هذه المشكلة، يستخدم بروتوكول TCP آلية إعادة الإرسال التكيفية. سنقوم بوصف هذه الآلية الآن وتطورها مع مرور الوقت حيث اكتسب مجتمع الإنترنت المزيد من الخبرة باستخدام TCP. الخوارزمية الأصلية نبدأ بخوارزمية بسيطة لحساب قيمة المهلة الزمنية timeout بين زوجٍ من المضيفين. هذه هي الخوارزمية التي وُصفت في الأصل في مواصفات بروتوكول TCP، ولكن يمكن استخدامها بواسطة أي بروتوكول طرفٍ إلى طرف end-to-end protocol. تكمن الفكرة في الاحتفاظ بمتوسط تشغيل RTT ثم حساب المهلة الزمنية كدالة لوقت RTT. يسجل TCP الوقت في كل مرة يرسل فيها جزء بيانات، ويقرأ بروتوكول TCP الوقت مرةً أخرى عند وصول ACK لهذا الجزء، ثم يأخذ الفرق بين هاتين المرتين على أنه SampleRTT. ثم يحسب TCP قيمة EstimatedRTT كمتوسط مرجح بين التقدير estimate السابق وهذه العينة sampleالجديدة، حيث: EstimatedRTT = alpha x EstimatedRTT + (1 - alpha) x SampleRTT يُحدَّد المعامل alpha لتنعيم EstimatedRTT. تتتبّع قيمةُ alpha الصغيرة التغييراتِ في RTT ولكن ربما تتأثر بشدة بالتقلبات المؤقتة. ومن ناحيةٍ أخرى، تكون قيمة alpha الكبيرة أكثر استقرارًا ولكن ربما لا تكون سريعة بما يكفي للتكيف مع التغييرات الحقيقية. أوصت مواصفات TCP الأصلية بإعداد قيمة alpha بين 0.8 و 0.9. يستخدم بروتوكول TCP المعامل EstimatedRTT لحساب المهلة الزمنية timeout بطريقة متحفظة إلى حدٍ ما: TimeOut = 2 x EstimatedRTT خوارزمية كارن / بارتريدج Karn/Partridge اُكتشِف عيبٌ واضح في الخوارزمية السابقة البسيطة بعد عدة سنوات من الاستخدام على الإنترنت. كانت المشكلة أن الإشعار ACK لا يُقِر حقًا بالإرسال، بل باستلام البيانات في الحقيقة، أي عندما يُعاد إرسال جزء ثم وصول ACK إلى المرسل، فمن المستحيل تحديد ما إذا كان ينبغي إرفاق هذا الإشعار بالإرسال الأول أو الثاني للجزء بغرض قياس sample RTT. من الضروري معرفة الإرسال الذي سيُربَط به لحساب العينة SampleRTT بدقة. إذا افترضت أن الإشعار ACK للإرسال الأصلي ولكنه كان في الحقيقة للثاني كما هو موضح في الشكل التالي، فإن SampleRTT كبيرةٌ جدًا كما في القسم (أ) من الشكل التالي، وإذا افترضت أن الإشعار ACK للإرسال الثاني ولكنه كان في الواقع للإرسال الأول، فإن عينة SampleRTT صغيرةٌ جدًا كما في القسم (ب) من الشكل التالي: الحل الذي جرى اقتراحه في عام 1987 بسيط جدًا: يتوقف بروتوكول TCP عن أخذ عيناتٍ من RTT عندما يعيد إرسال جزء ما، فهو يقيس SampleRTT فقط للأجزاء التي أُرسلت مرةً واحدة فقط. يُعرف هذا الحل باسم خوارزمية كارن / بارتريدج تيّمنًا بمخترعَيها. يتضمن الإصلاح المقترح أيضًا تغييرًا صغيرًا ثانيًا في آلية مهلة TCP الزمنية. يضبط بروتوكول TCP المهلة التالية لتكون ضعف آخر مهلة في كل مرة يعيد فيها الإرسال، بدلًا من إسنادها إلى آخرEstimatedRTT. اقترح كارن و بارتريدج أن يستخدم بروتوكولُ TCP تراجعًا أسيًا exponential backoff، على غرار ما يفعله إيثرنت. الدافع لاستخدام التراجع الأسي بسيط: الازدحام هو السبب الأكثر احتمالًا لفقدان الأجزاء، مما يعني أن مصدر TCP يجب ألا يتفاعل بقوة مع انقضاء المهلة الزمنية، فكلما انقضت مهلة الاتصال الزمنية، يجب أن يصبح المصدر أكثر حذرًا. سنرى هذه الفكرة مرة أخرى، مجسَّدةً في آلية أعقد لاحقًا. خوارزمية جاكوبسون / كارلس Jacobson/Karels قُدّمت خوارزمية كارن / بارتريدج في وقت كان فيه الإنترنت يعاني من مستويات عالية من ازدحام الشبكة، فصُمِّم نهج هذه الخوارزمية لإصلاح بعض أسباب هذا الازدحام، ولكن على الرغم من تقديمها تحسينًا، إلا أنه لم يتم القضاء على الازدحام. اقترح باحثان آخران (جاكوبسون وكارلس) تغييرًا جذريًا في بروتوكول TCP لمحاربة الازدحام في العام التالي (1988). سنركز على هذا الاقتراح المتعلق بتحديد انتهاء المهلة وإعادة إرسال جزء ما. يجب أن يكون ارتباط آلية المهلة الزمنية بالازدحام واضحًا، فإذا انقضت المهلة في وقت مبكرٍ جدًا، فقد تعيد إرسال جزء بدون داعٍ، والذي يضيف فقط إلى الحِمل على الشبكة. السبب الآخر للحاجة إلى قيمة مهلة دقيقة هو أن المهلة تُؤخَذ للإشارة إلى الازدحام، مما يؤدي إلى تشغيل آلية للتحكم في الازدحام. أخيرًا، لاحظ أنه لا يوجد شيء يتعلق بحساب مهلة جاكوبسون وكارلس الخاص ببروتوكول TCP. يمكن استخدامه من قبل أي بروتوكول من طرفٍ إلى طرف. تكمن المشكلة الرئيسية في حساب الخوارزمية الأصلية في أنها لا تأخذ في الاعتبار تباين عينات RTT. إذا كان الاختلاف بين العينات صغيرًا، فيمكن الوثوق في EstimatedRTT بصورةٍ أفضل ولا يوجد سبب لضرب هذا التقدير في 2 لحساب المهلة الزمنية. يشير التباين الكبير في العينات من ناحية أخرى إلى أن قيمة المهلة لا ينبغي أن تكون مرتبطة بإحكام شديد بقيمة EstimatedRTT. بينما في النهج الجديد، يقيس المرسل SampleRTT جديدًا كما كان يتم سابقًا، ثم تُطوى هذه العينة الجديدة في حساب المهلة على النحو التالي: Difference = SampleRTT - EstimatedRTT EstimatedRTT = EstimatedRTT + ( delta x Difference) Deviation = Deviation + delta (|Difference| - Deviation) حيث تقع قيمة delta بين 0 و1. أي أننا نحسب كلًا من متوسط وقت RTT والتغير في هذا المتوسط، ثم يحسب TCP قيمة المهلة كدالة لكل من EstimatedRTT وDeviation على النحو التالي: TimeOut = mu x EstimatedRTT + phi x Deviation يُعيَّن mu على القيمة 1 وphi على القيمة 4 بناءً على الخبرة. وهكذا تكون TimeOut قريبةً من EstimatedRTT عندما يكون التباين صغيرًا، حيث يؤدي التباين الكبير إلى سيطرة مصطلح الانحراف Deviation على الحساب. التطبيق Implementation هناك نقطتان جديرتان بالملاحظة فيما يتعلق بتطبيق المهلات الزمنية في بروتوكول TCP. الأولى هي إمكانية تطبيق حساب EstimatedRTT وDeviation دون استخدام حساب الأعداد العشرية. فبدلًا من ذلك، تُوسَّع العملية الحسابية بالكامل بمقدار 2n، مع اختيار delta لتكون 1/2n. يتيح لنا ذلك إجراء العمليات الحسابية الصحيحة، وتطبيق الضرب والقسمة باستخدام الإزاحات shifts، وبالتالي تحقيق أداءٍ أعلى. يُعطى الحساب الناتج عن طريق جزء الشيفرة التالية، حيث n = 3 (أي delta = 1/8). لاحظ تخزين EstimatedRTT وDeviation في نماذجهما الموسّعَين، بينما قيمة SampleRTT في بداية الشيفرة و TimeOut في النهاية هي قيمٌ حقيقية غير مُوسَّعة. إذا وجدت صعوبة في تتبع الشيفرة، فقد ترغب في محاولة إدخال بعض الأرقام الحقيقية فيها والتحقق من أنها تعطي نفس النتائج مثل المعادلات أعلاه: { SampleRTT -= (EstimatedRTT >> 3); EstimatedRTT += SampleRTT; if (SampleRTT < 0) SampleRTT = -SampleRTT; SampleRTT -= (Deviation >> 3); Deviation += SampleRTT; TimeOut = (EstimatedRTT >> 3) + (Deviation >> 1); } النقطة الثانية هي أن خوارزمية جاكوبسون / كارلس جيدة فقط مثل الساعة المستخدمة لقراءة الوقت الحالي. كانت دقة الساعة كبيرة في تطبيقات يونيكس النموذجية في ذلك الوقت حيث وصلت إلى 500 ميلي ثانية، وذلك أكبر بكثير من متوسط RTT عبر دولة في مكانٍ ما والذي يكون بين 100 و200 ميلي ثانية. لجعل الأمور أسوأ، فحص تطبيق يونيكس لبروتوكول TCP فيما إذا كان يجب أن يحدث انتهاء للمهلة في كل مرة تُحدَّد فيها الساعة 500 ميلي ثانية ولن يأخذ سوى عينةٍ من وقت الذهاب والإياب مرة واحدة لكل RTT. و قد يعني الجمع بين هذين العاملين أن المهلة ستحدث بعد ثانية واحدة من إرسال الجزء. تشتمل توسّعات TCP على آلية تجعل حساب RTT هذا أدق قليلًا. تستند جميع خوارزميات إعادة الإرسال التي ناقشناها إلى مهلات الإشعارات، والتي تشير إلى احتمال فقد جزءٍ ما. لاحظ أن المهلة لا تخبر المرسل فيما إذا اُستلِمت بنجاحٍ أي أجزاءٍ أرسلها بعد فقدان جزء، وذلك لأن إشعارات TCP تراكمية cumulative، أي أنها تحدد فقط الجزء الأخير المُستلم دون أي فجوات سابقة. ينمو استقبال الأجزاء التي تظهر بعد زيادة الفجوة بصورةٍ متكررة كما تؤدي الشبكات الأسرع إلى نوافذ أكبر. إذا أخبرت ACK المرسلَ أيضًا عن الأجزاء اللاحقة، إن وجدت، فقد يكون المرسل أذكى بشأن الأجزاء التي يعيد إرسالها، إضافةً لاستخلاص استنتاجات أفضل حول حالة الازدحام، وإجراء تقديرات RTT أفضل. حدود السجلات Record Boundaries ليس بالضرورة أن يكون عدد البايتات التي يكتبها المرسل نفس عدد البايتات التي قرأها المستقبل نظرًا لأن بروتوكول TCP هو بروتوكول تدفق بايتات، فقد يكتب التطبيق 8 بايتات، ثم 2 بايت، ثم 20 بايت إلى اتصال TCP، بينما يقرأ التطبيق على جانب الاستقبال 5 بايتات في المرة الواحدة داخل حلقة تتكرر 6 مرات. لا يقحم بروتوكول TCP حدود السجلات بين البايتين الثامن والتاسع، ولا بين البايتين العاشر والحادي عشر. هذا على عكس بروتوكول الرسائل الموّجهة، مثل بروتوكول UDP، حيث تكون الرسالة المرسَلة بنفس طول الرسالة المُستلَمة. يمتلك بروتوكول TCP، على الرغم من كونه بروتوكول تدفق بايتات، ميزتين مختلفتين يمكن للمرسل استخدامهما لإدراج حدود السجلات في تدفق البايتات هذا، وبالتالي إعلام المستقبِل بكيفية تقسيم تدفق البايتات إلى سجلات. (تُعَد القدرة على تحديد حدود السجلات أمرًا مفيدًا في العديد من تطبيقات قواعد البيانات على سبيل المثال) وضُمِّنت هاتان الميزتان في الأصل في بروتوكول TCP لأسباب مختلفة تمامًا، ثم جرى استخدامهما لهذا الغرض بمرور الوقت، وهما: الآلية الأولى هي ميزة البيانات العاجلة urgent data feature، التي طُبِّقت بواسطة الراية URG وحقل UrgPtr في ترويسة TCP. صُمِّمت آلية البيانات العاجلة في الأصل للسماح للتطبيق المرسِل بإرسال بيانات خارج النطاق إلى نظيره. نعني بعبارة خارج النطاق out-of-band البياناتِ المنفصلة عن تدفق البيانات الطبيعي (أمر مقاطعة عملية جارية بالفعل على سبيل المثال). حُدِّدت هذه البيانات خارج النطاق في الجزء segment باستخدام حقل UrgPtr وكان من المقرر تسليمها إلى عملية الاستلام بمجرد وصولها، حتى لو عنى ذلك تسليمها قبل بيانات ذات رقمٍ تسلسلي سابق. لكن، لم تُستخدَم هذه الميزة بمرور الوقت، لذلك بدلًا من الإشارة إليها ببيانات "عاجلة" ، فقد اُستخدمت للدلالة على بيانات "خاصة"، مثل علامة السجل record marker. طُوِّر هذا الاستخدام لأنه، كما هو الحال مع عملية push، يجب على TCP على الجانب المستلم إبلاغ التطبيق بوصول بيانات عاجلة، أي أن البيانات العاجلة في حد ذاتها ليست مهمة. إنها تشير إلى حقيقة أن عملية الإرسال يمكنها إرسال إشارة فعالة إلى جهاز الاستقبال بأن هناك أمرٌ مهم. الآلية الثانية لإدخال علامات نهاية السجلات في بايت هي العملية push. صُمِّمت هذه الآلية في الأصل للسماح لعملية الإرسال بإعلام بروتوكول TCP بأنه يجب عليه إرسال أو تفريغ flush أي بايتات جمَّعها لنظيره. يمكن استخدام العملية push لتطبيق حدود السجلات لأن المواصفات تنص على أن بروتوكول TCP يجب أن يرسل أي بيانات مخزَّنة مؤقتًا عند المصدر عندما يقول التطبيق push، ويُعلِم بروتوكول TCP، اختياريًا، التطبيق في الوجهة عند وجود جزء وارد يحتوي على مجموعة الراية PUSH. إذا كان جانب الاستقبال يدعم هذا الخيار (لا تدعم واجهة المقبس هذا الخيار)، فيمكن عندئذٍ استخدام العملية push لتقسيم تدفق TCP إلى سجلات. برنامج التطبيق حرٌ دائمًا بحشر حدود السجلات دون أي مساعدة من بروتوكول TCP، حيث يمكنه إرسال حقل يشير إلى طول السجل الذي يجب أن يتبعه، أو يمكنه حشر علامات حدود السجل الخاصة به في تدفق البيانات على سبيل المثال. إضافات بروتوكول TCP لقد ذكرنا أن هناك إضافات Extensions لبروتوكول TCP تساعد في التخفيف من بعض المشاكل التي واجهها حيث أصبحت الشبكة الأساسية أسرع. صُمِّمت هذه الإضافات ليكون لها تأثيرٌ ضئيل على بروتوكول TCP قدر الإمكان، حيث تُدرَك كخياراتٍ يمكن إضافتها إلى ترويسة TCP. (سبب احتواء ترويسة TCP على حقل HdrLen هو أن الترويسة يمكن أن تكون بطول متغير، يحتوي الجزء المتغير من ترويسة TCP على الخيارات المُضافة). أهمية إضافة هذه الإضافات كخيارات بدلًا من تغيير جوهر ترويسة TCP هو أن المضيفين لا يزالون قادرين على التواصل باستخدام TCP حتى لو لم يقوموا بتطبيق الخيارات، ولكن يمكن للمضيفين الذين يقومون بتطبيق الإضافات الاختيارية الاستفادة منها. يتفق الجانبان على استخدام الخيارات أثناء مرحلة إنشاء اتصال TCP. تساعد الإضافة الأولى على تحسين آلية ضبط مهلة TCP الزمنية. يمكن لبروتوكول TCP قراءة ساعة النظام الفعلية عندما يكون على وشك إرسال جزء بدلًا من قياس RTT باستخدام حدث قاسٍ coarse-grained، ووضع هذا الوقت (فكر به على أنه علامة زمنية timestamp مؤلفة من 32 بتًا) في ترويسة الجزء، ثم يُرجِع echoes المستقبل هذه العلامة الزمنية مرةً أخرى إلى المرسل في إشعاره، ويطرح المرسل هذه العلامة الزمنية من الوقت الحالي لقياس وقت RTT. يوفر خيار العلامة الزمنية مكانًا مناسبًا لبروتوكول TCP لتخزين سجل وقت إرسال جزء، أي يخزن الوقت في الجزء نفسه. لاحظ أن نقاط النهاية في الاتصال لا تحتاج إلى ساعات متزامنة، حيث تُكتَب العلامة الزمنية وتُقرَأ في نهاية الاتصال نفسها. تعالج الإضافة الثانية مشكلة التفاف wrapping around حقل SequenceNum المكون من 32 بت لبروتوكول TCP في وقت قريب جدًا على شبكة عالية السرعة. يستخدم بروتوكول TCP العلامة الزمنية المؤلفة من 32 بتًا الموصوفة للتو لتوسيع حيز الأرقام التسلسلية بفعالية بدلاً من تحديد حقل رقم تسلسلي جديد مؤلف من 64 بتًا. أي يقرر بروتوكول TCP قبول أو رفض جزء بناءً على معرّف بطول 64 بت يحتوي على حقل SequenceNum بترتيب 32 بت المنخفض والعلامة الزمنية بترتيب 32 بت العالي. بما أن العلامة الزمنية تتزايد دائمًا، فإنها تعمل على التمييز بين تجسبدَين مختلفين لنفس الرقم التسلسلي. لاحظ استخدام العلامة الزمنية في هذا الإعداد فقط للحماية من الالتفاف، حيث لا يُتعامَل معها كجزء من الرقم التسلسلي لغرض طلب البيانات أو الإشعار بوصولها. تسمح الإضافة الثالثة لبروتوكول TCP بالإعلان عن نافذةٍ أكبر، مما يسمح له بملء الأنابيب ذات جداء (التأخير × حيز النطاق التراسلي) الأكبر والتي تتيحها الشبكات عالية السرعة. تتضمن هذه الإضافة خيارًا يحدد عامل توسيع scaling factor للنافذة المعلن عنها. أي يسمح هذا الخيار لطرفي TCP بالاتفاق على أن حقل AdvertisedWindow يحسب أجزاءًا أكبر (عدد وحدات البيانات ذات 16 بايت الممكن عدم الإقرار بها من قبل المرسل على سبيل المثال) بدلًا من تفسير الرقم الذي يظهر في حقل AdvertisedWindow على أنه يشير إلى عدد البايتات المسموح للمرسل بعدم الإقرار بها. يحدد خيار توسيع النافذة عدد البتات التي يجب على كل جانبٍ إزاحة حقل AdvertisedWindow بها لليسار قبل استخدام محتوياته لحساب نافذة فعالة. تسمح الإضافة الرابعة لبروتوكول TCP بتوفير إشعاره التراكمي cumulative acknowledgment مع الإشعارات الانتقائية selective acknowledgments لأية أجزاءٍ إضافية جرى استلامها ولكنها ليست متجاورة مع جميع الأجزاء المُستلمة مسبقًا، وهذا هو خيار الإشعار الانتقائي أو SACK. يستمر جهاز الاستقبال بالإقرار أو الإشعار عن الأجزاء بشكلٍ طبيعي عند استخدام خيار SACK، أي لا يتغير معنى حقل Acknowledge، ولكنه يستخدم أيضًا حقولًا اختيارية في الترويسة لإرسال إشعارات وصول أي كتلٍ إضافية من البيانات المستلمة. يتيح ذلك للمرسل إعادة إرسال الأجزاء المفقودة فقط وفقًا للإشعار الانتقائي. هناك استراتيجيتان مقبولتان فقط للمرسل بدون SACK. تستجيب الاستراتيجية المتشائمة pessimistic لانتهاء المهلة بإعادة إرسال الجزء المنتهية مهلته، وكذلك أي أجزاء سترسَل لاحقًا أيضًا، وتفترض الإستراتيجية المتشائمة الأسوأ والذي هو فقد كل تلك الأجزاء. عيب الاستراتيجية المتشائمة هو أنها قد تعيد إرسال الأجزاء المُستلمة بنجاح في المرة الأولى دون داعٍ. الإستراتيجية الأخرى هي الإستراتيجية المتفائلة optimistic، والتي تستجيب لانتهاء المهلة بإعادة إرسال الجزء المنتهية مهلته فقط. يفترض النهج المتفائل السيناريو الأكثر تفاؤلًا والذي هو فقد جزء segment واحد فقط. عيب الإستراتيجية المتفائلة أنها بطيئة للغاية دون داعٍ، عندما تضيع سلسلة من الأجزاء المتتالية، كما يحدث عندما يكون هناك ازدحام. كما أنها بطيئة نظرًا لعدم القدرة على اكتشاف خسارة كل جزءٍ حتى يتلقى المرسل ACK لإعادة إرسال الجزء السابق، لذلك فهي تستهلك وقت RTT واحدًا لكل جزءٍ حتى يعيد إرسال جميع الأجزاء في السلسلة المفقودة. تتوفر استراتيجية أفضل للمرسل مع خيار SACK وهي: أعد إرسال الأجزاء التي تملأ الفجوات بين الأجزاء التي جرى الإقرار بها انتقائيًا. بالمناسبة، لا تمثّل هذه الإضافات القصة الكاملة. حيث سنرى بعض الإضافات الأخرى عندما ننظر في كيفية تعامل بروتوكول TCP مع الازدحام. تتعقب هيئة تخصيص أرقام الإنترنت Internet Assigned Numbers Authority أو اختصارًا IANA جميع الخيارات المحددة لبروتوكول TCP (إضافةً للعديد من بروتوكولات الإنترنت الأخرى). الأداء Performance تذكر أن في بداية السلسلة قد قدّم المقياسين الكميّين اللذين يجري من خلالِهما تقييم أداء الشبكة وهما: زمن الاستجابة latency والإنتاجية throughput. لا تتأثر هذه المقاييس فقط بالعتاد الأساسي، مثل تأخير الانتشار propagation delay وحيز نطاق الرابط التراسلي link bandwidth، كما هو مذكور في تلك المناقشة، ولكن تتأثر أيضًا بتكاليف البرمجيات الزائدة. يمكننا مناقشة كيفية قياس أداء البروتوكول القائم على البرمجيات بشكل هادف الآن بعد أن أصبح متاحًا لنا رسمًا بيانيًا كاملًا له متضمنًا بروتوكولات نقل بديلة. تكمن أهمية هذه القياسات في أنها تمثل الأداء الذي تراه برامج التطبيق. نبدأ، كما ينبغي لأي تقرير لنتائج التجارب، بوصف طريقتنا التجريبية. وهذا يشمل الجهاز المستخدم في التجارب، حيث تحتوي كل محطة عمل على زوج من معالجات Xeon لوحدة المعالجة المركزية بتردد 2.4 جيجاهرتز والتي تعمل بنظام لينوكس في هذه الحالة. يجري استخدام زوج من محوّلات إيثرنت، المسمَّى NIC بطاقة واجهة الشبكة network interface card، على كل جهاز لتمكين سرعات أعلى من 1 جيجابت في الثانية. يمتد الإيثرنت على غرفة جهاز واحدة لذا لا يمثل الانتشار مشكلة، مما يجعل هذا مقياسًا لتكاليف المعالجات / البرمجيات الزائدة. يحاول برنامجُ الاختبار الذي يعمل أعلى واجهة المقبس ببساطة نقلَ البيانات بأسرع ما يمكن من جهازٍ إلى آخر، ويوضح الشكل السابق هذا الإعداد. قد تلاحظ أن هذا الإعداد التجريبي لا يمثل ميزة خاصة من حيث العتاد أو سرعة الروابط. لا يتمثل الهدف من هذا القسم في إظهار مدى سرعة تشغيل بروتوكول معين، ولكن لتوضيح المنهجية العامة لقياس أداء البروتوكول والإبلاغ عنه. يجري اختبار الإنتاجية لمجموعة متنوعة من أحجام الرسائل باستخدام أداة قياس معيارية تسمى TTCP. يوضح الشكل التالي نتائج اختبار الإنتاجية. الشيء الرئيسي الواجب ملاحظته في هذا الرسم البياني هو أن معدل النقل يتحسن مع زيادة حجم الرسائل. وهذا أمرٌ منطقي، حيث تتضمن كل رسالة قدرًا معينًا من الحِمل الزائد، لذا فإن الرسالة الأكبر تعني أن هذا الحِمل يُستهلَك على عددٍ أكبر من البايتات. يُسطَّح منحني سرعة النقل الأعلى من 1 كيلوبايت، وعند هذه النقطة يصبح الحِمل لكل رسالة غير مهم عند مقارنته بالعدد الكبير من البايتات التي يتعين على مكدّس البروتوكول معالجتها. تجدر الإشارة إلى أن الحد الأقصى للإنتاجية أقل من 2 جيجابت في الثانية، وهي سرعة الرابط المتاحة في هذا الإعداد. ستكون هناك حاجة لمزيد من الاختبار وتحليل النتائج لمعرفة مكان الاختناق أو معرفة إذا كان هناك أكثر من عنق زجاجة أو اختناق bottleneck. قد يعطي النظر إلى حِمل وحدة المعالجة المركزية مؤشرًا على ما إذا كانت وحدة المعالجة المركزية هي مكان الاختناق أم أن اللوم يقع على حيز النطاق التراسلي للذاكرة أو أداء محوّل adaptor الشبكة أو بعض المشكلات الأخرى. نلاحظ أيضًا أن الشبكة في هذا الاختبار "مثالية" بصورةٍ أساسية. لا يوجد أي تأخير أو خسارة تقريبًا، وبالتالي فإن العوامل الوحيدة التي تؤثر على الأداء هي تطبيق بروتوكول TCP إضافةً إلى عتاد وبرمجيات محطة العمل. ولكن نتعامل في معظم الأوقات مع شبكاتٍ بعيدة عن الكمال، ولا سيما روابطنا المقيدة بحيّز النطاق التراسلي وروابط الميل الأخير والروابط اللاسلكية المعرّضة للضياع. نحتاج إلى فهم كيفية تعامل بروتوكول TCP مع الازدحام قبل أن نقّدر تمامًا كيف تؤثر هذه الروابط على أداء TCP. هدّدت سرعة روابط الشبكة المتزايدة بشكل مطرد بالتقدم على ما يمكن تسليمه إلى التطبيقات في أوقات مختلفة من تاريخ الشبكات. بدأ جهد بحثي كبير في الولايات المتحدة في عام 1989 لبناء "شبكات جيجابت gigabit networks" على سبيل المثال، حيث لم يكن الهدف فقط بناء روابط ومبدلات يمكن تشغيلها بسرعة 1 جيجابت في الثانية أو أعلى، ولكن أيضًا لإيصال هذه الإنتاجية على طول الطريق إلى عملية تطبيقٍ واحدة. كانت هناك بعض المشكلات الحقيقية (كان لابد من تصميم محولات شبكة، وبنيات محطات عمل، وأنظمة تشغيل مع مراعاة إنتاجية النقل من شبكة إلى تطبيق على سبيل المثال) وكذلك بعض المشكلات المُدرَكة التي تبين أنها ليست خطيرة للغاية. وكان على رأس قائمة مثل هذه المشاكل القلقُ من أن بروتوكولات النقل الحالية، وخاصةً بروتوكول TCP، قد لا تكون على مستوى التحدي المتمثل في عمليات الجيجابت. كما اتضح، كان أداء بروتوكول TCP جيدًا في مواكبة الطلبات المتزايدة للشبكات والتطبيقات عالية السرعة. أحد أهم العوامل هو إدخال توسيع النافذة للتعامل مع منتجات تأخير حيز النطاق التراسلي الأكبر، ولكن غالبًا ما يكون هناك فرقٌ كبير بين الأداء النظري لبروتوكول TCP وما يجري تحقيقه عمليًا. يمكن أن تؤدي المشكلات البسيطة نسبيًا مثل نسخ البيانات مرات أكثر من اللازم أثناء انتقالها من محول الشبكة إلى التطبيق إلى انخفاض الأداء، كما يمكن أن تؤدي ذاكرة التخزين المؤقت غير الكافية إلى انخفاض الأداء عندما يكون منتج تأخير حيز النطاق التراسلي كبيرًا. وديناميكيات TCP معقدة بدرجة كافية، بحيث يمكن للتفاعلات الدقيقة بين سلوك الشبكة وسلوك التطبيق وبروتوكول TCP نفسه تغيير الأداء بصورةٍ كبيرة. من الجدير بالذكر أن بروتوكول TCP يستمر في الأداء الجيد مع زيادة سرعات الشبكة، ويندفع الباحثون لإيجاد حلول عند حدوث تعارض مع بعض القيود (المرتبطة عادةً بالازدحام أو زيادة منتجات تأخير حيز النطاق التراسلي أو كليهما). خيارات التصميم البديلة SCTP وQUIC على الرغم من أن بروتوكول TCP قد أثبت أنه بروتوكول قوي يلبي احتياجات مجموعة واسعة من التطبيقات، إلا أن مساحة تصميم بروتوكولات النقل كبيرة جدًا. ليس بروتوكول TCP بأي حالٍ النقطة الصالحة الوحيدة في مساحة التصميم هذه. نختم مناقشتنا لبروتوكول TCP من خلال النظر في خيارات التصميم البديلة. بينما نقدم شرحًا حول سبب اتخاذ مصممي TCP الخيارات التي قاموا بها، فإننا نلاحظ وجود بروتوكولات أخرى اتخذت خيارات أخرى، وقد يظهر المزيد من هذه البروتوكولات في المستقبل. هناك صنفان على الأقل من بروتوكولات النقل: البروتوكولات الموجَّهة بالتدفق stream-oriented protocols مثل بروتوكول TCP وبروتوكولات الطلب / الرد request/reply protocols مثل بروتوكول RPC. قسمنا مساحة التصميم ضمنيًا إلى نصفين ووضعنا بروتوكول TCP مباشرةً في نصف عالم البروتوكولات الموجَّهة بالتدفق. يمكننا أيضًا تقسيم البروتوكولات الموجهة بالتدفق إلى مجموعتين، موثوقة reliable وغير موثوقة unreliable، مع احتواء الأولى على بروتوكول TCP والأخيرة أكثر ملاءمة لتطبيقات الفيديو التفاعلية التي تفضل إسقاط أو إهمال إطار بدلًا من تحمّل التأخير المرتبط بإعادة الإرسال. يُعَد بناء تصنيف لبروتوكول النقل أمرًا مثيرًا للاهتمام ويمكن مواصلته بتفاصيل أكثر، ولكن العالم ليس أبيض وأسود كما قد نحب. افترض ملاءمة بروتوكول TCP كبروتوكول نقل لتطبيقات الطلب / الرد على سبيل المثال. بروتوكول TCP هو بروتوكول ثنائي الاتجاه، لذلك سيكون من السهل فتح اتصال TCP بين العميل والخادم، وإرسال رسالة الطلب في اتجاه واحد، وإرسال رسالة الرد في الاتجاه الآخر، ولكن هناك نوعان من التعقيدات. الأول هو أن بروتوكول TCP هو بروتوكول موجَّهٌ بالبايت وليس بروتوكول موجَّه بالرسائل، وأن تطبيقات الطلب / الرد تتعامل دائمًا مع الرسائل. (سنكتشف مسألة البايتات مقابل الرسائل بتفصيل أكبر بعد قليل). التعقيد الثاني هو أنه في تلك المواقف التي تتلاءم فيها كل من رسالة الطلب ورسالة الرد في رزمة شبكة واحدة، يحتاج بروتوكول الطلب / الرد المصمم جيدًا رزمتان فقط لتطبيق التبادل، بينما يحتاج بروتوكول TCP إلى تسع رزم على الأقل: ثلاث لتأسيس الاتصال، واثنان لتبادل الرسائل، وأربع لإنهاء الاتصال. إذا كانت رسائل الطلب أو الرد كبيرة بما يكفي لأن تتطلب رزم شبكةٍ متعددة (قد يستغرق الأمر 100 رزمة لإرسال إستجابة بحجم 100000 بايت على سبيل المثال)، ستكون التكاليف الزائدة لإعداد الاتصال وإلغائه غير منطقية. ليس الأمر دائمًا أن بروتوكولًا معينًا لا يمكنه دعم وظيفةٍ معينة، ففي بعض الأحيان يكون هناك تصميم أكثر كفاءة من تصميم آخر في ظل ظروف معينة. ثانيًا، قد تتساءل عن سبب اختيار TCP لتقديم خدمة تدفق بايتات موثوقة بدلًا من خدمة تدفق رسائل موثوقة، حيث تُعتبر الرسائل الخيار الطبيعي لتطبيق قاعدة البيانات الذي يريد تبادل السجلات. هناك إجابتان على هذا السؤال: الأول هو أن البروتوكول الموجَّه بالرسائل يجب أن ينشئ حدًا أعلى لأحجام الرسائل، فالرسالة الطويلة التي بلا حدود هي تدفق بايتات. ستكون هناك تطبيقات تريد إرسال رسائل أكبر بالنسبة إلى أي حجم رسالة يحدده البروتوكول، مما يجعل بروتوكول النقل عديم الفائدة ويجبر التطبيق على تنفيذ خدماته الشبيهة بالنقل. السبب الثاني هو أنه على الرغم من أن البروتوكولات الموجهة بالرسائل هي بالتأكيد أكثر ملاءمة للتطبيقات التي ترغب في إرسال السجلات إلى بعضها البعض، إلا أنه يمكنك بسهولة إدخال حدود السجل في تدفق البايتات لتطبيق هذه الوظيفة. القرار الثالث الذي اُتخِذ في تصميم TCP هو أنه يسلّم البايتات بناءً على التطبيق. هذا يعني أنه قد يحتفظ بالبايتات التي استلمها مخالفةً للترتيب من الشبكة، في انتظار بعض البايتات المفقودة لملء ثغرة. هذا مفيد للغاية للعديد من التطبيقات ولكن تبين أنه غير مفيد تمامًا إذا كان التطبيق قادرًا على معالجة البيانات المخالفة للترتيب. فلا تحتاج صفحة الويب مثلًا التي تحتوي على كائنات متعددة مضمَّنة إلى تسليم جميع الكائنات بالترتيب قبل البدء في عرض الصفحة. هناك صنف من التطبيقات يفضِّل التعامل مع البيانات المخالفة للترتيب في طبقة التطبيق، مقابل الحصول على البيانات في وقت أقرب عند إسقاط الرزم أو سوء ترتيبها داخل الشبكة. أدت الرغبة في دعم مثل هذه التطبيقات إلى إنشاء بروتوكولي نقل معياريين من IETF. كان أولها بروتوكول SCTP، بروتوكول نقل التحكم في التدفق Stream Control Transmission Protocol. يوفر بروتوكول SCTP خدمة توصيل مُرتَّبة جزئيًا، بدلًا من خدمة TCP المُرتَّبة بدقة. (يتخذ بروتوكول SCTP أيضًا بعض قرارات التصميم الأخرى التي تختلف عن بروتوكول TCP، بما في ذلك اتجاه الرسالة ودعم عناوين IP المتعددة لجلسة واحدة). وحّدت منظمة IETF في الآونة الأخيرة بروتوكولًا محسَّنًا لحركة مرور الويب، يُعرف باسم QUIC. رابعًا، اختار بروتوكول TCP تطبيق مراحل إعداد / تفكيك صريحة، لكن هذا ليس مطلوبًا، حيث سيكون من الممكن إرسال جميع معاملات الاتصال الضرورية مع رسالة البيانات الأولى في حالة إعداد الاتصال. اختار TCP اتباع نهجٍ أكثر تحفظًا يمنح المتلقي الفرصة لرفض الاتصال قبل وصول أي بيانات. يمكننا إغلاق الاتصال الذي كان غير نشط لفترة طويلة من الزمن بهدوء في حالة التفكيك، ولكن هذا من شأنه أن يعقّد تطبيقات مثل تسجيل الدخول عن بُعد الذي يريد الحفاظ على الاتصال نشطًا لأسابيع في كل مرة، حيث ستُجبَر هذه التطبيقات على إرسال رسائل "keep alive" خارج النطاق للحفاظ على حالة الاتصال عند الطرف الآخر من الاختفاء. أخيرًا، بروتوكول TCP هو بروتوكول قائم على النافذة window-based، لكن هذا ليس الاحتمال الوحيد. البديل هو التصميم القائم على المعدَّل rate-based design، حيث يخبر المستلمُ المرسلَ بالمعدّل (معبرًا عنه إما بالبايتات أو بالرزم في الثانية) الذي يكون على استعداد لقبول البيانات الواردة إليه، فقد يخبر المتلقي المرسل على سبيل المثال أنه يستطيع استيعاب 100 رزمة في الثانية. هناك ازدواجية مثيرة للاهتمام بين النوافذ والمعدَّل، حيث أن عدد الرزم (البايتات) في النافذة، مقسومًا على RTT، هو المعدل بالضبط. يشير حجم النافذة المكوَّن من 10 رزم و 100 ميلي ثانية RTT على سبيل المثال إلى أنه يُسمح للمرسل بالإرسال بمعدل 100 رزمة في الثانية. يرفع جهاز الاستقبال أو يخفض المعدل الذي يمكن للمرسل الإرسال به بفعالية من خلال زيادة أو تقليل حجم النافذة المعلن عنها. تُرَد هذه المعلومات مرةً أخرى إلى المرسل في حقل AdvertisedWindow من إشعار ACK كل جزء في بروتوكول TCP. تتمثل إحدى المشكلات الرئيسية في البروتوكول المستند إلى المعدل في عدد المرات التي يُرحَّل فيها المعدل المطلوب (والذي قد يتغير بمرور الوقت) إلى المصدر: هل هو لكل رزمة أم مرة واحدة لكل RTT أم عندما يتغير المعدل فقط؟ على الرغم من أننا قد ناقشنا للتو النافذة مقابل المعدل في سياق التحكم في التدفق، إلا أنها قضية متنازع عليها بشدة في سياق التحكم في الازدحام، والتي ستُناقش لاحقًا. بروتوكول QUIC أُنشِئ بروتوكول اتصالات إنترنت بروتوكول UDP السريعة Quick UDP Internet Connections أواختصارًا QUIC في Google في عام 2012، ولا يزال يخضع للتوحيد القياسي standardization في منظمة IETF في وقت كتابة هذا الكتاب، ولقد شهد بالفعل قدرًا معتدلًا من النشر (في بعض متصفحات الويب وعدد كبير من مواقع الويب الشائعة). حقيقة أنه كان ناجحًا إلى هذه الدرجة هي في حد ذاتها جزءٌ مثير للاهتمام من قصة QUIC، وكانت قابلية النشر التزامًا رئيسيًا لمصممي البروتوكول. يأتي الدافع وراء بروتوكول QUIC مباشرةً من النقاط التي أشرنا إليها أعلاه حول بروتوكول TCP: لقد تبين أن بعض قرارات التصميم غير مثالية لمجموعة من التطبيقات التي تعمل عبر بروتوكول TCP، كحركة مرور بروتوكول HTTP (الويب). أصبحت هذه المشكلات أوضح بمرور الوقت، نظرًا لعوامل مثل ظهور الشبكات اللاسلكية ذات زمن الاستجابة العالي، وتوافر شبكات متعددة لجهاز واحد (شبكة Wi-Fi والشبكة الخلوية على سبيل المثال)، والاستخدام المتزايد للتشفير واستيثاق الاتصالات على الويب. تستحق بعض قرارات تصميم بروتوكول QUIC الرئيسية المناقشة في حين أن وصفه الكامل خارج نطاقنا. إذا كان وقت استجابة الشبكة مرتفعًا (من رتبة مئات الميلي ثانية) فيمكن أن تزيد بسرعة بعض فترات RTT إزعاجًا واضحًا للمستخدم النهائي. يستغرق عادةً إنشاء جلسة HTTP عبر بروتوكول TCP مع تأمين طبقة النقل ثلاث رحلاتٍ ذهابًا وإيابًا (واحدة لتأسيس جلسة TCP واثنتان لإعداد معاملات التشفير) قبل إرسال رسالة HTTP الأولى. أدرك مصممو QUIC أنه يمكن تقليل هذا التأخير (وهو النتيجة المباشرة لنهج متعدد الطبقات لتصميم البروتوكول) بصورةٍ كبيرة إذا دُمِج إعداد الاتصال ومصافحات الأمان المطلوبة وحُسِّن لأدنى حد من وقت الذهاب والإياب. لاحظ أيضًا كيف قد يؤثر وجود واجهات متعددة للشبكة على التصميم. إذا فقد هاتفك المحمول اتصال Wi-Fi وتحتاج إلى التبديل إلى اتصال خلوي، سيتطلب ذلك عادةً مهلة TCP على اتصالٍ واحد وسلسلة جديدة من المصافحات على الاتصال الآخر. كان جعل الاتصال شيئًا يمكنه الاستمرار عبر اتصالات طبقة الشبكة المختلفة هدفًا تصميميًا آخر لبروتوكول QUIC. أخيرًا، يُعد نموذج تدفق البايتات الموثوق لبروتوكول TCP تطابقًا ضعيفًا مع طلب صفحة الويب، عند الحاجة إلى جلب العديد من الكائنات ويمكن البدء بعرض الصفحة قبل وصولها جميعًا. أحد الحلول لذلك هو فتح اتصالات TCP متعددة على التوازي، ولكن هذا الأسلوب (الذي اُستخدِم في الأيام الأولى للويب) له مجموعة من العيوب الخاصة به، لا سيما فيما يتعلق بالتحكم في الازدحام. ومن المثير للاهتمام أنه جرى اتخاذ العديد من قرارات التصميم التي شكّلت تحدياتٍ لنشر بروتوكول نقل جديد بحلول الوقت الذي ظهر فيه QUIC. والجدير بالذكر أن العديد من "الصناديق المتوسطة middleboxes" مثل الجدران النارية firewalls وNAT لديها فهم كافٍ لبروتوكولات النقل المنتشرة على نطاق واسع (TCP وUDP) بحيث لا يمكن الاعتماد عليها لتمرير بروتوكول نقل جديد. ونتيجة لذلك يتواجد بروتوكول QUIC في الواقع فوق بروتوكول UDP، أي أنه بروتوكول نقلٍ يعمل فوق بروتوكول نقل. يطبّق بروتوكول QUIC إنشاء اتصالٍ سريع مع التشفير والاستيثاق authentication في أول RTT، ويفضّل توفير معرّف اتصال على استمراره عبر التغييرات في الشبكة الأساسية. وهو يدعم تعدد إرسال عدة تدفقات على اتصال نقل واحد، لتجنب توقف رأس الخط الذي قد ينشأ عند إسقاط رزمةٍ واحدة بينما يستمر وصول البيانات المفيدة الأخرى. ويحافظ على خصائص تجنب الازدحام لبروتوكول TCP. بروتوكول QUIC هو التطور الأكثر إثارة للاهتمام في عالم بروتوكولات النقل. العديد من قيود بروتوكول TCP معروفةٌ منذ عقود، ولكن يمثّل بروتوكول QUIC واحدًا من أنحج الجهود حتى الآن للتركيز على نقطة مختلفة في مساحة التصميم. ويقدم دراسة حالة رائعة في النتائج غير المتوقعة للتصميمات متعددة الطبقات وفي تطور الإنترنت، نظرًا لأنه مستوحى من تجربة بروتوكول HTTP والويب، والتي نشأت بعد فترة طويلة من تأسيس بروتوكول TCP بشكل جيد في الإنترنت. بروتوكول TCP متعدد المسارات Multipath TCP ليس من الضروري دائمًا تحديد بروتوكول جديد إذا وجدت أن البروتوكول الحالي لا يخدم حالة استخدام معينة بشكل كافٍ. من الممكن في بعض الأحيان إجراء تغييرات جوهرية في كيفية تطبيق بروتوكول موجود، ولكن تظل وفية للمواصفات الأصلية. يعد بروتوكول Multipath TCP مثالًا على مثل هذه الحالة. تتمثل فكرة Multipath TCP في توجيه الرزم خلال مسارات متعددة عبر الإنترنت، باستخدام عنوانَي IP مختلفين لإحدى نقاط النهاية على سبيل المثال. يمكن أن يكون هذا مفيدًا بشكل خاص عند تسليم البيانات إلى جهازٍ محمول متصل بكل من شبكة Wi-Fi والشبكة الخلوية (وبالتالي يملك عنوانين IP فريدين). يمكن أن تواجه فقدانًا كبيرًا في الرزمة نظرًا لكون كلتا الشبكتين لاسلكيتين، لذا فإن القدرة على استخدامهما لحمل الرزم يمكن أن تحسّن تجربة المستخدم بصورة كبيرة. الحل هو أن يعيد الجانب المستلم من TCP بناء تدفق البايتات الأصلي بالترتيب قبل تمرير البيانات إلى التطبيق، والذي يظل غير مدرك أنه يجلس على بروتوكول Multipath TCP. (وهذا على عكس التطبيقات التي تفتح عمدًا اتصالين أو أكثر من اتصالات TCP للحصول على أداء أفضل). يبدو بروتوكول Multipath TCP بسيطًا، ولكنه من الصعب للغاية الحصول عليه بصورةٍ صحيحة لأنه يكسر العديد من الافتراضات حول كيفية تطبيق التحكم في تدفق TCP، وإعادة تجميع الجزء segment بالترتيب، والتحكم في الازدحام. نتركه كتمرينٍ لك لاستكشاف التفاصيل الدقيقة، حيث يُعد القيام بذلك طريقةً رائعة للتأكد من أن فهمك الأساسي لبروتوكول TCP سليم. ترجمة -وبتصرّف- للقسم Reliable Byte Stream من فصل ProtocolsEnd-to-End من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا بروتوكولات طرف إلى طرف End-to-End Protocols في الشبكات الحاسوبيةالمقال السابق: تأسيس الشبكات الحاسوبية والتعرف على تطبيقاتها البرمجيات المستخدمة في بناء الشبكات الحاسوبية التوجيه Routing بين الأجهزة المتنقلة في الشبكات الحاسوبية دليل بصري لكيفية استخدام أنفاق SSH
  18. سننشئ في هذا المقال لافتة نيون بسيطة، حيث سنطبّق طريقةً بسيطة جدًا لإنشاء هذا التأثير، لكن يوصى باستخدام إما برنامج إنكسكيب Inkscape أو جيمب GIMP (أو مزيج من الاثنين معًا) للحصول على نتائج أكثر احترافية. التقنيات المحددة المستخدمة إنشاء ألوان جديدة. تحويل النص إلى مخططات تفصيلية Outlines. إنشاء وإدارة الطبقات. إنشاء نمط خط جديد وتطبيقه على شكل. تحويل Transforming الشكل عن طريق إعادة التحجيم Re-scaling. استخدام تعتيم Opacity الطبقة. يمكن لأي شخص لديه فهم جيد لأساسيات سكريبوس تطبيق هذه الخطوات بسهولة. الإعداد الخط Font ستحتاج إلى الخط Dosis Bold الذي يمكنك تنزيله مجانًا، فإذا استخدمت الخط Dosis Bold، فستجد أن الخط المستدير ذو السماكة المتوسطة أفضل. ستميل بعض الخطوط السميكة إلى إفساد التأثير، وتسبب الخطوط الرفيعة أيضًا إفساد الأشياء ولكن بطريقة مختلفة، كما تميل الخطوط ذات الزوايا إلى أن تبدو غريبةً بعض الشيء، لكن لا تتردد في تجربتها ومشاهدة الفرق. الألوان افتح برنامج سكريبوس وأنشئ مستندًا فارغًا جديدًا (استخدم القياس A4 Portrait). ستحتاج أولًا إلى إعداد ألوان اللافتة. يجب أن يكون لديك بالفعل اللونان الأبيض والأسود في لافتتك ولكننا سنحتاج إلى ثلاثة ألوان أخرى. اختر قائمة تحرير Edit ثم الألوان والتعبئة Colors. اضغط على جديد New أو إضافة. أدخل اسم اللون "Neon Red 1". حدّد "CMYK" نمطًا للألوان. اضبط قيم CMYK على النحو التالي: C 0% وM 50% وY 12% وK 0%. اضغط على "موافق OK" لإنشاء اللون الجديد. كرّر ما سبق للون "Neon Red 2" الذي قيمه هي: C 0% وM 68% وY 25% وK 0%، واللون "Neon Red 3" الذي قيمه هي: C 0% وM 95% وY 83% وK 0%. اضغط على موافق OK عند إنشاء الألوان الثلاثة الجديدة. يوضّح الشكل التالي كل الألوان التي ستحتاج إليها: الخلفية يجب الآن رسم خلفية داكنة، وهنا سنستخدم اللون الأسود الكلاسيكي، ولكن يمكنك استخدام اللون الذي تريده. اختر قائمة إدراج Insert ثم شكّل Insert Shape، ثم أشكال افتراضية Default Shapes، ثم مستطيل Rectangle. ارسم مستطيلًا من أعلى يسار الصفحة إلى منتصف الجانب الأيمن. اذهب إلى نافذة خصائص Properties ثم اختر تبويب "ألوان ‎"Colors واجعل لون التعبئة أسود. النص الأساسي أنشئ إطار نص بعرض الصفحة وحوالي ربع ارتفاع الصفحة تحت المستطيل الأسود حتى تتمكن من رؤية ما تفعله، وهذا يضمن أن الإطار كبير بما يكفي ليناسب النص الكبير. انقر نقرًا مزدوجًا على إطار النص وأدخِل كلمة "NEON" (بدون علامات الاقتباس) في الإطار. انقر في مكان ما خارج إطار النص ثم أعد تحديده. انتقل إلى نافذة خصائص Properties ثم اختر تبويب نص Text، أو من نافذة خصائص المحتوى، ثم اختر نص Text في الإصدار 1.5.7 من برنامج سكريبوس. بعد ذلك حدّد الخط "Dosis Bold" أو أيًا كان الخط الذي تستخدمه. اضبط حجم الخط على القيمة 140 نقطة أو أي حجم تريده، ولكن اجعله كبيرًا جدًا. تحويل النص اختر قائمة عنصر ثم تحويل لـ Convert To، ثم مخططات تفصيلية Outlines. أعد تحديد النص واختر قائمة عنصر ثم التجميع، ثم اختر فك التجميع Ungroup. اختر قائمة عنصر ثم أدوات المسار، بعد ذلك اختر ادمج المضلعات Combine Polygons. بهذا يكون قد أصبح النص الآن شكلًا واحدًا ويمكن تعديله بسهولة، حيث يجب أن يكون لديك شيء يشبه الشكل التالي: إضافة طبقة جديدة اختر قائمة نوافذ Windows ثم الطبقات Layers. اضغط على أيقونة "+" (أسفل مربع الحوار) لإنشاء طبقة جديدة. انقر نقرًا مزدوجًا على اسم الطبقة الجديدة وأعد تسميتها بالاسم "Sign" (بدون علامات الاقتباس). انقر على طبقة "الخلفية Background" في مربع الحوار. حدّد النص المحوَّل. انقر بزر الفأرة الأيمن واختر القائمة "أرسل إلى الطبقة ‎"Send to Layer، ثم اختر Sign. انقر على طبقة "Sign" في نافذة Layers. وبذلك سيُنقَل النص الذي ستستخدمه إلى طبقة Sign (ستعرف الغرض من هذه الخطوة لاحقًا). تأثير النيون يجب الآن إنشاء التأثير الذي ستستخدمه لتشكيل تأثير النيون، لذلك سنستخدم نمط الخط Line Style. اختر قائمة تحرير Edit ثم أنماط Styles. اضغط على جديد New وحدد "نمط الخط Line Style" من القائمة. أعِد تسمية النمط باسم "Red Neon" أو أي شيء تريده، ولكن اجعله مناسبًا لغرضه. يجب بعد ذلك إنشاء الخطوط المختلفة التي ستشكل نمط خطك الجديد، وذلك باتباع الآتي: اضغط على أيقونة "+" (أسفل اسم النمط مباشرةً)، إذ سيؤدي ذلك إلى إنشاء خط جديد داخل النمط. اضغط على رمز "+" مرتين أيضًا حتى تتشكل لديك أربعة خطوط. انقر على أعلى خط. غيّر الخيار "حرف استهلالي مسطح Flat Cap" الموجود على يسار قائمة الخطوط، إلى "مستدير Round Cap". غيّر الخيار "وصلة مائلة Mitre Join" إلى "وصلة مستديرة Round Join". زِد عرض الخط إلى 9 نقاط، ولاحظ كيف يعيد برنامج سكريبوس ترتيب الخطوط. غيّر اللون إلى "Neon Red 3" وهو اللون الأحمر الداكن. بهذا تكون قد ضبطت أحد الخطوط، وتبقّى عليك أن تطبّق الخطوات نفسها على الخطوط الأخرى كالآتي: حدد الخط العلوي مرةً أخرى (إنه مختلف عن الخط الأخير الذي عدّلناه للتو). غيّر الحرف الاستهلالي Cap والوصلة Join إلى "مستدير Round". زِد العرض إلى 7 نقاط (أصغر قليلًا من الخط الأخير). غيّر اللون إلى "Neon Red 2" (ثاني أغمق لون). حدد الخط العلوي مرةً أخرى، وغيّر الحرف الاستهلالي والوصلة إلى "مستدير"، ثم زِد العرض إلى 5 نقاط، مع تغيير اللون إلى "Neon Red 1". حدّد الخط العلوي مرةً أخرى، وغيّر الحرف الاستهلالي والوصلة إلى "مستدير"، مع زيادة العرض إلى 3 نقاط، ثم غيّر اللون إلى "اللون الأبيض White". وبذلك تكون قد أنشأت نمط الخط الجديد الخاص بك كما يوضّح الشكل التالي: اضغط على "تطبيق Apply" ثم على "اكتمل Done"، ويمكنك أيضًا إغلاق مربع حوار مدير الأنماط Style Manager. بهذا يكون قد حان الوقت الآن لتطبيق نمط الخط الجديد على النص المحوَّل. تطبيق النمط حدد النص المحوَّل. حدّد نمط الخط الجديد "Red Neon" في تبويب خط Line من نافذة خصائص Properties. سيبدو كل شيء جيدًا حتى الآن، لكننا لم تنتهِ بعد، إذ عليك اتخاذ الخطوات الموالية: اضبط لون التعبئة على "لا شيء None" في تبويب ألوان Colours من نافذة Properties، فهذا يضمن أنه يمكنك استخدام النص فوق أي خلفية، وليس فقط فوق المستطيل الأسود الذي نستخدمه حاليًا. اسحب النص إلى منتصف المستطيل الأسود الذي تستخدمه خلفيةً. إذا تساءلت عن سبب ضبط الحروف الاستهلالية والوصلات على الخيار "مستدير Round" سابقًا، فلاحظ الفرق في الشكل التالي: الانعكاس Reflection افتح نافذة الطبقات Layers من قائمة نوافذ Windows. انقر على أيقونة "+" لإنشاء طبقة جديدة أخرى. انقر نقرًا مزدوجًا على اسم الطبقة الجديد وأعد تسميتها إلى "Reflection". لاحظ أن طبقة "Reflection" الجديدة فوق طبقة "Sign"، لكننا نريدها تحتها. حدّد طبقة "Reflection"، ثم اضغط على أيقونة "السهم للأسفل Down Arrow"، حيث سيؤدي ذلك إلى تحريك الطبقة الجديدة إلى أسفل أو خلف الطبقة التي عليها اللافتة sign. حدد الطبقة "Sign". حدّد النص واختر قائمة عنصر Item ثم مضاعفة/تحويل، بعد ذلك اختر نسخ مطابق Duplicate. حدّد النسخة الجديدة، ثم انقر بزر الفأرة الأيمن واختر الخيار أرسل إلى الطبقة Send to Layer، بعدها اختر طبقة "Reflection". حدّد الطبقة "Reflection". حدد النص المكرَّر. اختر قائمة عنصر ثم مضاعفة/تحويل ثم اختر تحويل Transform. اضغط على زر إضافة Add وحدّد الخيار "تحجيم Scaling" من القائمة. تأكد من أن رمز "الارتباط linked" في الجانب الأيسر من مربع الحوار كما في الشكل التالي مفعَّل، حيث تكون روابط السلسلة مرتبطةً ببعضها البعض. وإن لم يكن مفعَّلًا، فما عليك إلّا النقر عليه. أنقِص أيًا من عاملي التحجيم إلى القيمة 93%، وسيتغير العامل الآخر تلقائيًا أيضًا. انقر على موافق OK. اسحب يدويًا النص الأصغر خلف النص الأصلي مع توسيطه عموديًا، ولكن أعلى بقليل من النص الأصلي. سيبدو الأمر غريبًا بعض الشيء حاليًا، و لكن لا بأس فهناك خطوة أخرى. اضبط "عتمة Opacity" الطبقة Reflection على القيمة 50% في نافذة الطبقات. يجب أن تكون لافتتك مكتملةً الآن مع انعكاس زجاج غير مرئي، ولكن قد تحتاج إلى تحريك بعض الأشياء حتى تحصل على التأثير الذي يناسبك. هذا كل شيء، ولكن يمكنك تجربة خطوط وألوان مختلفة. مثال تطبيقي طبّق الخطوات التالية لتحصل على الشكل التالي: نزّل الصورة التي سنستخدمها خلفيةً في هذا المثال. سنستخدم الخط "Santa Fe LET". يجب تعديل تباعد الأحرف لتفادي تداخلها. أنشئ مجموعةً من الألوان الزرقاء للدائرة. تحتاج الدائرة إلى قدر كبير من التعديل، لهذا جرّب استخدام "عمليات المسار Path Operations" مثل القص باستخدام المستطيلات بدلًا من تعديل الدائرة مباشرةً. يجب تدوير كل النص بمقدار 10 درجات، أو يمكنك تدويره قبل تعديل الدائرة. ترجمة -وبتصرّف- للمقال How to create a neon sign. اقرأ أيضًا كيفية إنشاء التأثير Distressing Mask في برنامج سكريبوس لإنتاج تأثيرات تعبئة جذابة كيفية إنشاء أشكال معقدة ذات زوايا دائرية في برنامج سكريبوس Scribus كيفية إنشاء الظلال في برنامج سكريبوس Scribus خطوات تطوير شعار باستخدام برنامج سكريبوس Scribus
  19. بروتوكول النقل الأعقد هو البروتوكول الذي يوفر خدمة تدفق بايتات موثوقة Reliable Byte Stream وموجهة نحو الاتصال، على عكس بروتوكول فك تعدد الإرسال demultiplexing البسيط كبروتوكول UDP. أثبتت هذه الخدمة أنها مفيدة لمجموعةٍ واسعة من التطبيقات لأنها تحرر التطبيق من القلق بشأن البيانات المفقودة أو المُعاد ترتيبها. ربما يكون بروتوكول التحكم في الإرسال Transmission Control Protocol عبر الإنترنت هو البروتوكول الأكثر استخدامًا من هذا النوع، كما أنه مضبوطٌ بعناية. لهذين السببين يدرس هذا القسم بروتوكول TCP بالتفصيل، على الرغم من أننا نحدد ونناقش خيارات التصميم البديلة في نهاية القسم. يضمن بروتوكول TCP التسليمَ الموثوق به والمرتّب لتدفقٍ من البايتات. إنه بروتوكول ثنائي الاتجاه full-duplex، مما يعني أن كل اتصال TCP يدعم زوجًا من تدفقات البايتات، حيث يتدفق كلٌّ منهما في اتجاه. يتضمن أيضًا آليةً للتحكم في التدفق لكل من تدفقات البايتات هذه التي تسمح للمستقبل بتحديد مقدار البيانات التي يمكن للمرسل إرسالها في وقتٍ معين. أخيرًا، يدعم بروتوكول TCP آلية فك تعدد الإرسال، مثل بروتوكول UDP، والتي تسمح لبرامج تطبيقات متعددة على أي مضيف معين بإجراء محادثة مع نظرائها في نفس الوقت. يطبّق بروتوكول TCP أيضًا، بالإضافة إلى الميزات المذكورة أعلاه، آلية التحكم في الازدحام عالية الضبط. تتمثل فكرة هذه الآلية في التحكم في مدى سرعة إرسال بروتوكول TCP للبيانات، ليس من أجل منع المرسل من الإفراط في تشغيل جهاز الاستقبال، ولكن من أجل منع المرسل من زيادة التحميل على الشبكة. يخلط العديد من الأشخاص بين التحكم في الازدحام congestion control والتحكم في التدفق flow control، لذلك سنعيد صياغة الفرق. يتضمن التحكم في التدفق منع المرسلين من تجاوز سعة أجهزة الاستقبال، بينما يتضمّن التحكم في الازدحام منع حقن الكثير من البيانات في الشبكة، مما يتسبب في زيادة تحميل المبدّلات switches أو الروابط links. وبالتالي فإن التحكم في التدفق هو مشكلة شاملة، بينما يهتم التحكم في الازدحام بكيفية تفاعل المضيفين والشبكات. قضايا طرف إلى طرف End-to-End Issues يوجد في صميم بروتوكول TCP خوارزمية النافذة المنزلقة sliding window. على الرغم من كونها نفس الخوارزمية الأساسية المُستخدمة غالبًا على مستوى الروابط، نظرًا لأن بروتوكول TCP يعمل عبر طبقة الإنترنت بدلًا من الرابط الفيزيائي نقطة لنقطة، إلا أنّ هناك العديد من الاختلافات المهمة. يحدد هذا القسم الفرعي هذه الاختلافات ويشرح كيف تعقّد بروتوكول TCP، ثم تصف الأقسام الفرعية التالية كيف يعالج بروتوكول TCP هذه التعقيدات وغيرها. أولًا، بينما تعمل خوارزمية النافذة المنزلقة على مستوى الروابط المقدمة عبر رابطٍ فيزيائي واحد يربط دائمًا نفس جهازي الحاسوب، فيدعم بروتوكول TCP الاتصالات المنطقية بين العمليات التي تعمل على أي جهازَي حاسوب على شبكة الإنترنت. هذا يعني أن بروتوكول TCP يحتاج إلى مرحلة تأسيس اتصال صريحة يتفق خلالها طرفا الاتصال على تبادل البيانات مع بعضهما بعضًا. يماثل هذا الاختلاف الاضطرار إلى الاتصال dial up بالطرف الآخر، بدلًا من امتلاك خط هاتف مخصَّص dedicated phone line. ويحتوي بروتوكول TCP أيضًا على مرحلة تفكيك اتصال صريحة. أحد الأشياء التي تحدث أثناء إنشاء الاتصال هو قيام الطرفين بإنشاء حالة مشتركة ما لتمكين خوارزمية النافذة المنزلقة من البدء. يجب فصل الاتصال حتى يعرف كل مضيف أنه لا بأس من تحرير هذه الحالة. ثانيًا، في حين أنه يوجد لدى رابط فيزيائي واحد يربط دائمًا نفس جهازي الحاسوب وقت رحلة ذهاب وإياب round-trip time أو اختصارًا RTT ثابت، فمن المحتمل أن يكون لدى اتصالات TCP أوقات ذهابٍ وإيابٍ مختلفة. قد يساوي وقت RTT من أجل اتصال TCP بين مضيفٍ في سان فرانسيسكو ومضيفٍ في بوسطن على سبيل المثال، مفصول بينهما بعدة آلاف من الكيلومترات، 100 ميلي ثانية، بينما قد يساوي وقت RTT من أجل اتصال TCP بين مضيفين في نفس الغرفة، على بعد أمتار قليلة فقط، 1 ميلي ثانية فقط. يجب أن يكون بروتوكول TCP نفسه قادرًا على دعم كلا الاتصالين. و لجعل الأمور أسوأ، فقد يبلغ وقت RTT لِاتصال TCP بين المضيفين في سان فرانسيسكو وبوسطن 100 ميلي ثانية في الساعة 3 صباحًا، ولكنّ وقت RTT يبلغ 500 ميلي ثانية في الساعة 3 مساءً. يمكن أن تكون الاختلافات في وقت RTT ممكنةً أثناء اتصال TCP الذي لا يدوم سوى بضع دقائق. ما يعنيه هذا بالنسبة لخوارزمية النافذة المنزلقة هو أن آلية المهلة الزمنية timeout التي تؤدي إلى إعادة الإرسال يجب أن تكون قابلة للتكيُّف. (بالتأكيد، يجب أن تكون المهلة الزمنية لرابط من نقطةٍ إلى نقطة معاملًا قابلًا للإعداد، ولكن ليس من الضروري تكييف هذا المؤقت مع زوجٍ معين من العقد). ثالثًا، إمكانية إعادة ترتيب الرزم أثناء عبورها للإنترنت، إنما هذا غير ممكن على رابط من نقطة إلى نقطة حيث يجب أن تكون الرزمة الأولى الموضوعة في أحد طرفي الرابط هي أول ما يظهر في الطرف الآخر. لا تسبب الرزم المخالفة قليلًا للترتيب مشاكلًا لأن خوارزمية النافذة المنزلقة يمكنها إعادة ترتيب الرزم بصورةٍ صحيحة باستخدام الرقم التسلسلي. تكمن المشكلة الحقيقية في المدى الذي يمكن أن تصل إليه رزمٌ مخالفة للترتيب، أو، كما يُقال بطريقة أخرى، مدى تأخر وصول الرزمة إلى الوجهة. يمكن أن تتأخر الرزمة في الإنترنت في أسوأ الحالات حتى انتهاء صلاحية حقل IP الذي هو العُمر time to live أو (TTL)، وفي ذلك الوقت تُهمَل الرزمة (وبالتالي لا يوجد خطر من وصولها متأخرة). يفترض بروتوكول TCP أن كل رزمة لها عمرٌ أقصى مع العلم أن بروتوكول IP يرمي الرزم بعيدًا بعد انتهاء صلاحية حقل TTL. يُعد العمر الدقيق، المعروف باسم الحد الأقصى لعمر الجزء maximum segment lifetime أو اختصارًا MSL، خيارًا هندسيًا، والإعداد الحالي الموصى به هو 120 ثانية. ضع في بالك أن بروتوكول IP لا يفرض مباشرة هذه القيمة البالغة 120 ثانية، أي أنه ببساطة تقدير تقليدي يقوم به بروتوكول TCP لطول مدة بقاء الرزمة على الإنترنت. يجب أن يكون بروتوكول TCP جاهزًا حتى تظهر الرزم القديمة جدًا فجأة في جهاز الاستقبال، مما قد يؤدي إلى إرباك خوارزمية النافذة المنزلقة. رابعًا، تُصمَّم أجهزة الحواسيب المتصلة برابط من نقطة إلى نقطة لدعم الروابط. فإذا حُسِب جداء التأخير × حيز النطاق التراسلي للرابط ليكون 8 كيلوبايت على سبيل المثال، مما يعني أن حجم النافذة حُدِّد للسماح بما يصل إلى 8 كيلوبايت من البيانات بعدم الإقرار unacknowledged في وقت معين، وعندها فمن المحتمل أن يكون لأجهزة الحاسوب في أيٍّ من طرفي الرابط القدرة على تخزين ما يصل إلى 8 كيلوبايت من البيانات. سيكون تصميم النظام بخلاف ذلك سخيفًا. يمكن توصيل أي نوع من أجهزة الحاسوب تقريبًا بالإنترنت، مما يجعل كمية الموارد المخصصة لأي اتصال TCP متغيرًا بدرجة كبيرة، لا سيما بالنظر إلى أن أي مضيف يمكنه دعم مئات اتصالات TCP في نفس الوقت. وهذا يعني أن بروتوكول TCP يجب أن يتضمن آلية يستخدمها كل جانب "لمعرفة" الموارد (مقدار مساحة المخزن المؤقت على سبيل المثال) التي يستطيع الجانب الآخر تطبيقها على الاتصال. وهذه هي مشكلة التحكم في التدفق. خامسًا، نظرًا لأن جانب الإرسال للرابط المتصل مباشرةً لا يمكنه الإرسال بصورةٍ أسرع مما يسمح به حيز نطاق الرابط التراسلي، ولأن مضيفًا واحدًا فقط يضخ البيانات في الرابط، فلا يمكن جعل الرابط مزدحمًا عن غير قصد. يكون الحِمل على الرابط مرئيًا على شكل رتل من الرزم عند المرسل، وفي المقابل، ليس لدى جانب الإرسال من اتصال TCP فكرة عن الروابط التي سيجري اجتيازها للوصول إلى الوجهة. قد يكون جهاز الإرسال متصلًا مباشرةً بشبكة إيثرنت سريعة نسبيًا على سبيل المثال، وقادرة على إرسال البيانات بمعدل 10 جيجابت في الثانية، ولكن يجب اجتياز رابطٍ بسرعة 1.5 ميجابت في الثانية في مكان ما في منتصف الشبكة. لجعل الأمور أسوأ، قد تحاول البيانات التي تنشئها العديد من المصادر المختلفة اجتياز هذا الرابط البطيء نفسه، وهذا يؤدي إلى مشكلة ازدحام الشبكة. نختم هذه المناقشة لقضايا طرفٍ إلى طرف من خلال مقارنة نهج TCP لتوفير خدمة توصيلٍ موثوقة / مرتبة مع النهج الذي تستخدمه الشبكات القائمة على الدارات الافتراضية مثل شبكة X.25 المهمة تاريخيًا. يُفترض أن شبكة IP الأساسية غير موثوقة في بروتوكول TCP وتسلّم الرسائل مخالفةً للترتيب، أي يستخدم بروتوكول TCP خوارزمية النافذة المنزلقة على أساس طرفٍ إلى طرف لتوفير تسليمٍ موثوق / مرتب. وفي المقابل، تستخدم شبكات X.25 بروتوكول النافذة المنزلقة داخل الشبكة، على أساس النقل قفزة بقفزة hop-by-hop. الافتراض الكامن وراء هذا النهج هو أنه إذا ُسلِّمت الرسائل بصورة موثوقة ومرتّبة بين كل زوج من العقد على طول المسار بين مضيف المصدر والمضيف الوجهة، فإن الخدمة من طرفٍ إلى طرف تضمن أيضًا تسليمًا موثوقًا / مرتبًا. تكمن مشكلة هذا النهج الأخير في أن سلسلةً من الضمانات السريعة المتتالية من نقل قفزة بقفزة لا تضيف بالضرورة ضمانًا شاملًا. أولًا، إذا أضيف رابطٌ غير متجانس (رابط إيثرنت مثلًا) إلى أحد طرفي المسار، فلا يوجد ضمان بأن هذه الخطوة ستحافظ على نفس الخدمة مثل الخطوات الأخرى. ثانيًا، إذا ضمِن بروتوكول النافذة المنزلقة تسليم الرسائل بصورة صحيحة من العقدة A إلى العقدة B، ومن ثم من العقدة B إلى العقدة C، فإنه لا يضمن أن العقدة B تتصرف بصفةٍ مثالية، حيث عُرفت عقد الشبكة بإدخال أخطاءٍ في الرسائل أثناء نقلها من مخزن الإدخال المؤقت إلى مخزن الإخراج المؤقت. ومن المعروف أيضًا أن عقد الشبكة تعيد ترتيب الرسائل عن طريق الخطأ. لا يزال من الضروري توفير فحوصات طرفٍ إلى طرف لضمان خدمة موثوقة / مرتبة نتيجة لأسباب الضعف البسيطة هذه، على الرغم من تطبيق المستويات الأدنى من النظام أيضًا لهذه الوظيفة. صيغة الجزء segment format بروتوكول TCP هو بروتوكول موجَّهٌ بالبايت، مما يعني أن المرسل يكتب البايت في اتصال TCP ويقرأ المتلقي البايت من خلال اتصال TCP. على الرغم من أن "تدفق البايتات" يصف الخدمة التي يقدمها بروتوكول TCP لعمليات التطبيق، فإن بروتوكول TCP نفسه لا يرسل البايتات الفردية عبر الإنترنت. وبدلًا من ذلك، يخزن بروتوكول TCP على المضيف المصدر ما يكفي من البايتات من عملية الإرسال لملء رزمةٍ بحجم معقول ثم يرسل هذه الرزمة إلى نظيره على المضيف الوجهة. يفرغ بروتوكول TCP على المضيف الوجهة بعد ذلك محتويات الرزمة في مخزن الاستلام المؤقت، وتقرأ عملية الاستلام من هذا المخزن المؤقت في أوقات فراغها. يوضح الشكل التالي هذا الموقف، حيث يُظهر تدفق البيانات في اتجاه واحد فقط بهدف التبسيط. تذكر أن اتصال TCP واحدًا يدعم عمومًا تدفقات البايتات في كلا الاتجاهين. تسمَّى الرزم المتبادلة بين نظراء بروتوكول TCP في الشكل السابق باسم الأجزاء segments، لأن كل واحد يحمل جزء من تدفق البايتات. يحتوي كل جزء TCP على العنوان الموضح في الشكل التالي. وستوضّح معظم هذه الحقول ضمن هذا القسم. يحدد حقلا SrcPort وDstPort منفذي ports المصدر والوجهة، على التوالي، تمامًا كما في بروتوكول UDP. يتحد هذان الحقلان، بالإضافة إلى عناوين IP المصدر والوجهة، لتعريف كل اتصال TCP بشكل فريد. وهذا يعني أن مفتاح فك تعدد الإرسال demux الخاص ببروتوكول TCP مُعطى بواسطة صف رباعي العناصر 4-tuple (حيث tuple هو (صف وتُجمَع إلى صفوف) هي بنية بيانات تُمثِّل سلسلةً مرتبة من العناصر غير القابلة للتبديل، وبالتالي لا يمكن تعديل القيم الموجودة فيها) وهنا هذا الصف مؤلَّف من 4 عناصر. (SrcPort, SrcIPAddr, DstPort, DstIPAddr) لاحظ أن اتصالات TCP تأتي وتذهب، وبالتالي من الممكن إنشاء اتصال بين زوجٍ معين من المنافذ، واستخدامه لإرسال البيانات واستلامها، وإغلاقه، ثم تضمين نفس زوج المنافذ في اتصال ثانٍ في وقت لاحق. نشير أحيانًا إلى هذه الحالة على أنهما تجسيدان incarnations مختلفان لنفس الاتصال. تُضمَّن جميع حقول Acknowledgement و SequenceNum و AdvertisedWindow في خوارزمية نافذة بروتوكول TCP المنزلقة. بما أن بروتوكول TCP هو بروتوكول موجهٌ بالبايت، فإن لكل بايت من البيانات رقم تسلسلي. يحتوي حقل SequenceNum على رقمٍ تسلسلي للبايت الأول من البيانات المنقولة في هذا الجزء، ويحمل حقلا Acknowledgement و AdvertisedWindow معلومات حول تدفق البيانات في الاتجاه الآخر. لتبسيط مناقشتنا، نتجاهل حقيقة أن البيانات يمكن أن تتدفق في كلا الاتجاهين، ونركز على البيانات التي لها رقم تسلسلي SequenceNum معين يتدفق في اتجاه واحد، وتتدفق قيم الحقلين Acknowledgement و AdvertisedWindow في الاتجاه المعاكس، كما هو موضح في الشكل التالي: يُستخدم حقل الرايات Flags المكوّن من 6 بتات لنقل معلومات التحكم بين نظراء بروتوكول TCP. تتضمن الرايات المحتملة رايات SYN و FIN و RESET و PUSH و URG و ACK. تُستخدَم رايتا SYN و FIN عند إنشاء اتصال TCP وإنهائه على التوالي. تُضبَط الراية ACK في أي وقت يكون حقل Acknowledgement صالحًا، مما يعني أنه يجب على المستلم الانتباه إليه. تشير الراية URG إلى أن هذا الجزء يحتوي على بياناتٍ عاجلة، فعند تعيين هذه الراية، يشير حقل UrgPtr إلى مكان بدء البيانات غير العاجلة الموجودة في هذا الجزء. يجري احتواء البيانات العاجلة في الجزء الأمامي من جسم الجزء segment body، بعدد بايتاتٍ يصل إلى قيمة الراية UrgPtr في الجزء. تشير الراية PUSH إلى أن المرسل قد استدعى عملية PUSH، مما يشير إلى الجانب المستلم من TCP بوجوب إعلام عملية الاستلام بهذه الحقيقة. أخيرًا، تشير الراية RESET إلى أن جهاز الاستقبال قد أصبح مرتبكًا، لأنه تلقى جزءًا لم يتوقع تلقيه على سبيل المثال، وبالتالي يريد إلغاء الاتصال. أخيرًا، يُستخدَم حقل المجموع الاختباري Checksum تمامًا بنفس الطريقة المستخدمة في بروتوكول UDP، أي يُحسَب عبر ترويسة TCP وبيانات TCP والترويسة الزائفة pseudoheader، والتي تتكون من عنوان المصدر وعنوان الوجهة وحقول الطول من ترويسة IP. المجموع الاختباري مطلوب لبروتوكول TCP في كلٍ من IPv4 و IPv6. بما أن ترويسة TCP متغيرة الطول (يمكن إرفاق الخيارات بعد الحقول الإلزامية)، فيُضمَّن حقل HdrLen الذي يعطي طول الترويسة بكلمات ذات حجم 32 بتًا. يُعرف هذا الحقل أيضًا باسم حقل الإزاحة Offset، لأنه يقيس الإزاحة من بداية الرزمة إلى بداية البيانات. تأسيس الاتصال وإنهاؤه يبدأ اتصال TCP عندما يقوم عميلٌ "مستدعٍ caller" بفتحٍ فعّال active open لخادم "مُستدعَى callee". وبفرض أن الخادم قد أجرى في وقتٍ سابق فتحًا سلبيًا غير فعّال passive open، فيشارك الجانبان في تبادل الرسائل لإنشاء الاتصال. (تذكر أن الطرف الذي يرغب في بدء اتصال يجري فتحًا فعالًا، بينما الطرف الذي يرغب في قبول الاتصال يجري فتحًا سلبيًا. ويسمح بروتوكول TCP بإعداد الاتصال ليكون متماثلًا symmetric، حيث يحاول كلا الجانبين فتح الاتصال في نفس الوقت، ولكن الحالة الشائعة هي أن يجري أحد الجانبين فتحًا فعّالًا والآخر يجري فتحًا سلبيًا. يبدأ الطرفان في إرسال البيانات بعد انتهاء مرحلة إنشاء الاتصال فقط. وبالمثل، فبمجرد انتهاء المشارك من إرسال البيانات، فإنه يغلق اتجاهًا واحدًا للاتصال، مما يتسبب في بدء بروتوكول TCP بجولة من رسائل إنهاء الاتصال. لاحظ أنه في حين أن إعداد الاتصال هو نشاط غير متماثل asymmetric (أحد الجانبين يجري فتحًا سلبيًا والجانب الآخر يجري فتحًا فعّالًا)، فإن تفكيك teardown الاتصال يكون متماثلًا symmetric (يجب على كل جانب إغلاق الاتصال بشكل مستقل). لذلك من الممكن أن يكون أحد الطرفين قد أنهى إغلاقًا، مما يعني أنه لم يعد بإمكانه إرسال البيانات، ولكن يجب إبقاء النصف الآخر من الاتصال ثنائي الاتجاه مفتوحًا ومواصلة إرسال البيانات بالنسبة للجانب الآخر. طريقة المصافحة الثلاثية Three-Way Handshake تسمى الخوارزمية التي يستخدمها بروتوكول TCP لإنشاء اتصال وإنهائه بمصافحة ثلاثية. نصف أولًا الخوارزمية الأساسية ثم نوضّح كيف يستخدمها بروتوكول TCP. تتضمن طريقة المصافحة الثلاثية تبادل ثلاث رسائل بين العميل والخادم، كما هو موضح في الجدول الزمني الوارد في الشكل التالي. الفكرة هي وجود طرفين يريدان الاتفاق على مجموعة من المعاملات، والتي هي أرقام البداية التسلسلية التي يخطط الجانبان لاستخدامها في تدفقات البايتات الخاصة بهما في حالة فتح اتصال TCP. قد تكون هذه المعاملات أي حقائق يريد كل جانب أن يعرفها الجانب الآخر. أولًا، يرسل العميل (المشارك الفعّال) جزءًا إلى الخادم (المشارك السلبي) يوضح الرقم التسلسلي الأولي الذي يخطط لاستخدامه (Flags=SYN,SequenceNum= x). يستجيب الخادم بعد ذلك بجزء واحد يقوم بوظيفة مزدوجة وهي الإقرار برقم العميل التسلسلي Flags = ACK وAck = x + 1، وتحديد رقم البداية التسلسلي الخاص به Flags = SYN وSequenceNum = y. وبالتالي ضُبطت بتات SYN وACK في حقل Flags في هذه الرسالة الثانية. أخيرًا، يستجيب العميل بجزء ثالث يعترف برقم الخادم التسلسلي Flags = ACK وAck = y + 1. السبب الذي يجعل كل جانب يعترف برقمٍ تسلسلي أكبر بمقدار واحد عن الرقم المرسَل هو أن حقل الإشعار Acknowledgement يحدد بالفعل "الرقم التسلسلي التالي المتوقع"، وبالتالي يُعترف ضمنيًا بجميع الأرقام التسلسلية السابقة. جرى جدولة مؤقتٍ timer لكل جزء من الجزأين الأولين على الرغم من عدم ظهوره في هذا المخطط الزمني. وعند عدم تلقي الاستجابة المتوقعة، فسيُعاد إرسال الجزء. قد تسأل نفسك لماذا يجب على العميل والخادم تبادل أرقام البداية التسلسلية مع بعضهما بعضًا في وقت إعداد الاتصال. سيكون من الأسهل إذا بدأ كل جانب ببساطة برقمٍ تسلسلي "معروف"، مثل 0. تتطلب مواصفات TCP أن يختار كل جانب من جوانب الاتصال رقم بداية تسلسليًا أوليًا عشوائيًا، والسبب في ذلك هو الحماية من وجود تجسيدين لنفس الاتصال يعيدان استخدام نفس الأرقام التسلسلية في وقتٍ قريب جدًا، أي في الوقت الذي لا يزال فيه فرصةٌ بأن يتداخل جزءٌ من تجسيد اتصالٍ سابق مع تجسيد اتصالٍ لاحق. مخطط انتقال الحالة State-Transition Diagram بروتوكول TCP معقدٌ بدرجةٍ كافية بحيث تتضمن مواصفاته مخطط انتقال الحالة. توجد نسخةٌ من هذا المخطط في الشكل الآتي. يوضح هذا المخطط فقط الحالات المشاركة في فتح اتصال (كل شيء فوق الحالة ESTABLISHED) وفي إغلاق الاتصال (كل شيء أدنى الحالة ESTABLISHED). يكون كل شيء يحدث أثناء فتح الاتصال، أي تشغيل خوارزمية النافذة المنزلقة، مخفيًا في الحالة ESTABLISHED. من السهل فهم مخطط انتقال حالة TCP، حيث يشير كل صندوقٍ إلى حالة يمكن لأحد طرفي اتصال TCP أن يجد نفسه فيها. تبدأ جميع الاتصالات في الحالة CLOSED، ومع تقدم الاتصال، ينتقل الاتصال من حالة إلى أخرى وفقًا للأقواس. يُسمَّى كل قوس بوسم tag لنموذج حدث / إجراء event/action. وبالتالي إذا كان الاتصال في حالة LISTEN مع وصول جزء SYN (أي جزء مع ضبط راية SYN على سبيل المثال)، ينتقل الاتصال إلى الحالة SYN_RCVD ويتخذ إجراء الرد بجزء ACK + SYN. لاحظ أن نوعين من الأحداث يؤديان إلى انتقال الحالة: وصول جزء من النظير (الحدث على القوس من LISTEN إلى SYNRCVD على سبيل المثال) استدعاء عملية التطبيق المحلي عمليةً على بروتوكول TCP (حدث الفتح الفعال على القوس من الحالة CLOSED إلى SYNSENT على سبيل المثال). بعبارة أخرى، يحدّد مخطط انتقال الحالة الخاص ببروتوكول TCP بفعالية دلالات semantics كلٍ من واجهة نظير لنظير peer-to-peer interface وَواجهة خدمته. تُوفَّر صيغة syntax لهاتين الواجهتين من خلال صيغة الجزء ومن خلال بعض واجهات برمجة التطبيقات على التوالي، مثل واجهة برمجة تطبيقات المقبس socket API. دعنا الآن نتتبع التحولات النموذجية المأخوذة من خلال المخطط في الشكل السابق. ضع في اعتبارك أنه في كل طرفٍ من طرفي الاتصال، يجري بروتوكول TCP انتقالات مختلفة من حالة إلى أخرى. يستدعي الخادم أولًا عملية فتحٍ سلبية على بروتوكول TCP عند فتح اتصال، مما يؤدي إلى انتقال TCP إلى حالة LISTEN. يجري العميل فتحًا فعالًا في وقت لاحق، مما يؤدي إلى إرسال نهاية الاتصال جزء SYN إلى الخادم والانتقال إلى حالة SYNSENT. ينتقل الخادم إلى حالة SYNRCVD عندما يصل جزء SYN إليه ويستجيب بجزء SYN + ACK. يؤدي وصول هذا الجزء إلى انتقال العميل إلى الحالة ESTABLISHED وإرسال ACK مرة أخرى إلى الخادم. وينتقل الخادم أخيرًا إلى الحالة ESTABLISHED عند وصول ACK. وبالتالي كأننا قد قمنا للتو بتتبع طريقة المصافحة الثلاثية. هناك ثلاثة أشياء يجب ملاحظتها حول النصف المخصص لإنشاء الاتصال في مخطط انتقال الحالة. أولًا، في حالة فقد ACK الخاص بالعميل إلى الخادم، وهو ما يتوافق مع المرحلة الثالثة من طريقة المصافحة الثلاثية، فإن الاتصال لا يزال يعمل بصورةٍ صحيحة. وذلك لأن جانب العميل موجود بالفعل في حالة ESTABLISHED، لذلك يمكن أن تبدأ عملية التطبيق المحلي في إرسال البيانات إلى الطرف الآخر. سيكون لكل جزء من أجزاء البيانات هذه مجموعة رايات ACK، والقيمة الصحيحة في حقل Acknowledgement، لذلك سينتقل الخادم إلى الحالة ESTABLISHED عند وصول جزء البيانات الأول. هذه في الواقع نقطةٌ مهمة حول بروتوكول TCP، حيث يبلّغ كل جزء عن الرقم التسلسلي الذي يتوقع المرسل رؤيته بعد ذلك، حتى إذا كان هذا يكرّر نفس الرقم التسلسلي الموجود في جزءٍ واحد أو أكثر من الأجزاء السابقة. الشيء الثاني الواجب ملاحظته حول مخطط انتقال الحالة هو أن هناك انتقالًا مضحكًا خارج حالة LISTEN عندما تستدعي العملية المحلية عملية إرسال على بروتوكول TCP. بمعنى أنه من الممكن للمشارك السلبي تحديد طرفي الاتصال (أي نفسه والمشارك البعيد الذي يرغب في الاتصال به)، ومن ثم تغيير رأيه بشأن انتظار الجانب الآخر وإنشاء اتصال فعال بدلًا من ذلك. على حد علمنا، هذه ميزة من ميزات بروتوكول TCP التي لا تستفيد منها أية عملية تطبيق. آخر شيء يجب ملاحظته بشأن المخطط هو الأقواس غير الظاهرة. تجدول معظم الحالات التي تتضمن إرسال جزءٍ إلى الجانب الآخر أيضًا مهلةً زمنية timeout تؤدي في النهاية إلى إعادة إرسال الجزء عند عدم حدوث الاستجابة المتوقعة. لا تُوصف عمليات إعادة الإرسال هذه في مخطط انتقال الحالة. في حال عدم وصول الاستجابة المتوقعة بعد عدة محاولات، يستسلم بروتوكول TCP ويعود إلى الحالة CLOSED. الشيء المهم حول عملية إنهاء الاتصال الواجب أخذه بعين الاعتبار هو أن عملية التطبيق على جانبي الاتصال يجب أن تغلق نصف الاتصال الخاص بها بشكل مستقل. إذا أغلق جانبٌ واحد فقط الاتصال، فهذا يعني أنه ليس لديه المزيد من البيانات للإرسال، ولكنه لا يزال متاحًا لتلقي البيانات من الجانب الآخر. يؤدي هذا إلى تعقيد مخطط انتقال الحالة لأنه يجب أن يأخذ في الاعتبار احتمال أن يستدعي الجانبان معامل الإغلاق في نفس الوقت، بالإضافة إلى احتمال أن يستدعي أحد الجانبين الإغلاق ثم، في وقت لاحق، يستدعي الجانب الآخر الإغلاق. وبالتالي يوجد في أي جانبٍ ثلاثُ مجموعات من الانتقالات التي تحصل على اتصال من الحالة ESTABLISHED إلى الحالة CLOSED: يجري إغلاق هذا الجانب أولًا: ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED يغلق الجانب الآخر أولًا: ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED يغلق كلا الجانبين في نفس الوقت: ESTABLISHED → FIN_WAIT_1 → CLOSING → TIME_WAIT → CLOSED يوجد في الواقع تسلسل رابع، وإن كان نادرًا، للانتقالات التي تؤدي إلى الحالة CLOSED، حيث يتبع القوس من الحالة FINWAIT1 إلى الحالة TIME_WAIT. الشيء الرئيسي الواجب معرفته حول تفكيك الاتصال هو أن الاتصال في حالة TIME_WAIT لا يمكنه الانتقال إلى حالة CLOSED حتى ينتظر ضِعف الحد الأقصى من الوقت الذي قد يبقى فيه مخطط بيانات IP على الإنترنت (أي 120 ثانية). والسبب في ذلك هو أنه بينما يرسل الجانب المحلي من الاتصال ACK كاستجابةٍ للجزء FIN الخاص بالجانب الآخر، فإنه لا يعرف أن ACK قد سُلِّم بنجاح. لذلك قد يعيد الجانب الآخر إرسال الجزء FIN الخاص به، وقد يتأخر الجزء FIN الثاني في الشبكة. إذا سُمِح للاتصال بالانتقال مباشرةً إلى الحالة CLOSED، فقد يأتي زوجٌ آخر من عمليات التطبيق ويفتح نفس الاتصال (مثل استخدم نفس زوج أرقام المنافذ)، وقد يبدأ الجزء FIN المتأخر من تجسيد الاتصال السابق على الفور في إنهاء التجسيد اللاحق لذلك الاتصال. إعادة النظر في خوارزمية النافذة المنزلقة Sliding Window Revisited نحن الآن جاهزون لمناقشة بروتوكول TCP لخوارزمية النافذة المنزلقة، والتي تخدم عدة أغراض: (1) تضمن التسليم الموثوق للبيانات، (2) تضمن تسليم البيانات بالترتيب، (3) تفرض التحكم في التدفق بين المرسل والمُستقبِل. استخدام بروتوكول TCP لخوارزمية النافذة المنزلقة هو نفسه على مستوى الرابط بالنسبة لأول وظيفتين من هذه الوظائف الثلاث، بينما يختلف بروتوكول TCP عن خوارزمية مستوى الرابط في أنه يحتوي على وظيفة التحكم في التدفق أيضًا. يعلن جهاز الاستقبال عن حجم النافذة للمرسل بدلًا من وجود نافذةٍ منزلقة ذات حجم ثابت، ويحدث ذلك باستخدام حقل AdvertisedWindow في ترويسة TCP، ويمتلك المرسل بعد ذلك على ما لا يزيد عن قيمة بايتات الحقل AdvertisedWindow من البيانات غير المعترف بها في أي وقت. يحدد جهاز الاستقبال قيمة مناسبة للحقل AdvertisedWindow بناءً على مقدار ذاكرة الاتصال المخصصة لغرض تخزين البيانات مؤقتًا. الفكرة هي منع المرسل من الإفراط في تشغيل مخزن المستقبل المؤقت (سنناقش هذا بإسهاب أدناه). التسليم الموثوق والمرتب افترض الموقف الموضح في الشكل التالي لمعرفة كيفية تفاعل جانبي الإرسال والاستقبال من بروتوكول TCP مع بعضهما بعضًا لتنفيذ تسليمٍ موثوقٍ ومرتّب. يحتفظ TCP على جانب الإرسال بمخزن إرسال مؤقت، ويُستخدم هذا المخزن المؤقت لتخزين البيانات التي أُرسلت ولكن لم يجري الاقرار بها بعد، وكذلك البيانات التي كتبها التطبيق المرسل ولكن لم تُرسل. يحتفظ TCP على جانب الاستقبال بمخزن استقبالٍ مؤقت، حيث يحتفظ هذا المخزن المؤقت بالبيانات التي تصل مخالفةً للترتيب، وكذلك البيانات ذات الترتيب الصحيح (مثل عدم وجود بايتاتٍ مفقودة في وقت سابق من التدفق) ولكن عملية التطبيق لم تتح لها الفرصة لقراءتها بعد. نتجاهل في البداية حقيقة أن كلًا من المخازن المؤقتة والأرقام التسلسلية ذات حجم محدود وبالتالي ستلتف في النهاية لجعل المناقشة التالية أسهل، ولا نفرق أيضًا بين المؤشر إلى المخزن المؤقت حيث يُخزَّن بايتٌ معين من البيانات وبين الرقم التسلسلي لذلك البايت. بالنظر أولًا إلى جانب الإرسال، يحتفظ مخزن الإرسال المؤقت بثلاث مؤشرات، لكل منها معنى واضح: LastByteAcked وLastByteSent وLastByteWritten. أي: LastByteAcked <= LastByteSent بما أن المستقبل لا يمكنه أن يقِر أو يرسل إشعارًا بوصول بايتٍ لم يُرسَل بعد، ولأن بروتوكول TCP لا يمكنه إرسال بايتٍ لم تكتبه عملية التطبيق بعد، فلاحظ أيضًا أنه ليس ضروريًا حفظ أي من البايتات الموجودة على يسار LastByteAcked في المخزن المؤقت لأنه جرى التعرف عليها بالفعل، ولا يلزم تخزين أي من البايتات الموجودة على يمين LastByteWritten لأنها لم تُنشَأ بعد. LastByteSent <= LastByteWritten يجري الاحتفاظ بمجموعة مماثلة من المؤشرات (الأرقام التسلسلية) على جانب الاستقبال: LastByteRead وNextByteExpected وLastByteRcvd، ولكن التفاوتات أقل بسبب مشكلة التسليم المخالف للترتيب. تكون العلاقة الأولى LastByteRead <NextByteExpected صحيحة لأنه لا يمكن للتطبيق قراءة البايت حتى يُستلَم ويجب استقبال جميع البايتات السابقة أيضًا. يشير NextByteExpected إلى البايت مباشرةً بعد أحدث بايت لتلبية هذا المعيار. وثانيًا عندها إذا وصلت البيانات بالترتيب، فإن NextByteExpected يشير إلى البايت بعد LastByteRcvd، بينما إذا وصلت البيانات مخالفةً للترتيب، فإن NextByteExpected يشير إلى بداية الفجوة gap الأولى في البيانات، كما في الشكل السابق. لاحظ أنه لا تحتاج البايتات الموجودة على يسار LastByteRead أن تُخزَّن مؤقتًا لأن عملية التطبيق المحلي قد قرأتها بالفعل، ولا تحتاج البايتات الموجودة على يمين LastByteRcvd إلى تخزينها مؤقتًا لأنها لم تصل بعد. NextByteExpected <= LastByteRcvd + 1 التحكم في التدفق Flow Control معظم المناقشة أعلاه مشابهة لتلك الموجودة في خوارزمية النافذة المنزلقة القياسية. الاختلاف الحقيقي الوحيد هو أننا هذه المرة أوضحنا حقيقة أن عمليات تطبيق المرسل والمستقبل تملأ وتفرّغ المخزن المؤقت المحلي، على التوالي. (أخفت المناقشة السابقة حقيقة أن البيانات الواردة من عقدة المنبع تملأ مخزن الإرسال المؤقت وأن البيانات التي تُرسَل إلى عقدة المصب تفرّغ مخزن الاستقبال المؤقت). لابد من الفهم الجيد لذلك قبل المتابعة، إذ تأتي الآن النقطة التي تختلف فيها الخوارزميتان بصورةٍ أكبر. نعيد في ما يلي تقديم حقيقة أن كلا المخزنين المؤقتين لهما حجمٌ محدد، يُشار إليهما MaxSendBuffer وMaxRcvBuffer، على الرغم من أننا لا نقلق بشأن تفاصيل كيفية تطبيقها. أي نحن مهتمون فقط بعدد البايتات التي تُخزَّن مؤقتًا وليس في المكان الذي تُخزَّن فيه هذه البايتات بالفعل. تذكر أنه في بروتوكول النافذة المنزلقة، يحدّد حجمُ النافذة مقدارَ البيانات التي يمكن إرسالها دون انتظار إشعارٍ من المستقبل. وبالتالي يخنق جهاز الاستقبال المرسل عن طريق الإعلان عن نافذة لا تزيد عن كمية البيانات التي يمكنه تخزينها مؤقتًا. لاحظ أن بروتوكول TCP على جانب الاستقبال يجب أن يحافظ على ما يلي: LastByteRcvd - LastByteRead <= MaxRcvBuffer وذلك لتجنب تجاوز المخزن المؤقت الخاص به، لذلك يعلن عن نافذة بحجم AdvertisedWindow = MaxRcvBuffer - ((NextByteExpected - 1) - LastByteRead) والذي يمثل مقدار المساحة الخالية المتبقية في المخزن المؤقت الخاص به. يُقِر المستلم بالبيانات بمجرد وصولها طالما وصلت جميع البايتات السابقة أيضًا. وينتقل LastByteRcvd إلى اليمين (أي يزداد)، مما يعني أن النافذة المعلن عنها قد تتقلص، حيث يعتمد ما إذا تقلّصت أم لا على مدى سرعة عملية التطبيق المحلي في استهلاك البيانات. إذا كانت العملية المحلية تقرأ البيانات بنفس السرعة التي تصل بها، مما يؤدي إلى زيادة LastByteRead بنفس معدل LastByteRcvd، فإن النافذة المُعلن عنها تظل مفتوحة، أي AdvertisedWindow = MaxRcvBuffer، ولكن إذا تأخرت عملية الاستلام، ربما لأنها تؤدي عمليةً مكلفة للغاية على كل بايت من البيانات التي تقرأها، فإن النافذة المُعلن عنها تصبح أصغر مع كل جزء يصل حتى تصل في النهاية إلى القيمة 0. يجب أن يلتزم بروتوكول TCP على جانب الإرسال بالنافذة المعلن عنها من جهاز الاستقبال. هذا يعني أنه في أي وقت، يجب أن يضمن أن: LastByteSent - LastByteAcked <= AdvertisedWindow أي يحسب المرسل نافذة فعالة تحد من مقدار البيانات الممكن إرسالها: EffectiveWindow = AdvertisedWindow - (LastByteSent - LastByteAcked) يجب أن يكون EffectiveWindow أكبر من 0 قبل أن يتمكن المصدر من إرسال المزيد من البيانات. لذلك من الممكن أن يصل جزءٌ ما للإقرار بـ x بايت، مما يسمح للمرسل بزيادة LastByteAcked بمقدار x، ولكن نظرًا لأن عملية الاستلام لم تكن تقرأ أي بيانات، فإن النافذة المُعلن عنها أصبحت الآن أصغر بمقدار x بايت من الوقت السابق، وبالتالي سيتمكّن المرسل من تحرير مساحة المخزن المؤقت، مع عدم إرسال أي بيانات أخرى. يجب أن يتأكد جانب الإرسال أيضًا طوال هذا الوقت من أن عملية التطبيق المحلي لا تتجاوز مخزن الإرسال المؤقت، أي: LastByteWritten - LastByteAcked <= MaxSendBuffer إذا حاولت عملية الإرسال كتابة y بايت إلى TCP، ولكن: (LastByteWritten - LastByteAcked) + y> MaxSendBuffer عندها سيوقف بروتوكول TCP عملية الإرسال ولا يسمح لها بتوليد المزيد من البيانات. أصبح من الممكن الآن فهم كيف تؤدي عملية الاستلام البطيئة إلى إيقاف عملية الإرسال السريعة في النهاية. أولًا، يمتلئ مخزن الاستقبال المؤقت، مما يعني تقلص النافذة المعلن عنها إلى 0. وتعني النافذة المعلن عنها بالقيمة 0 أن جانب الإرسال لا يمكنه نقل أي بيانات، بالرغم من الإقرار بالبيانات التي أرسلها سابقًا بنجاح. أخيرًا، يدل عدم القدرة على نقل أي بيانات على إمتلاء مخزن الإرسال المؤقت، مما يؤدي في النهاية إلى إيقاف بروتوكول TCP لعملية الإرسال. يكون بروتوكول TCP قادرًا على فتح نافذته احتياطيًا بمجرد أن تبدأ عملية الاستلام في قراءة البيانات مرةً أخرى، مما يسمح لبروتوكول TCP في طرف الإرسال بنقل البيانات من المخزن المؤقت الخاص به. ، تُزاد قيمة LastByteAcked عندما يجري الإقرار بهذه البيانات في النهاية، وتصبح مساحة المخزن المؤقت التي تحتوي على هذه البيانات المعترف بها حرة، ويُلغى إيقاف عملية الإرسال ويُسمَح لها بالمتابعة. هناك تفصيلٌ متبقٍ يجب حله، وهو كيف يعرف الجانب المرسل أن النافذة المُعلن عنها لم تعد 0؟ يرسل بروتوكول TCP دائمًا جزء segment استجابةً لجزء البيانات المستلمة، وتحتوي هذه الاستجابة على أحدث القيم للحقلين Acknowledge و AdvertisedWindow، حتى في حال عدم تغيُّر هذه القيم منذ آخر مرة أُرسلت فيها، وهذه هي المشكلة. لا يُسمَح للمرسل بإرسال أي بيانات أخرى بمجرد أن يعلن جانب الاستلام عن نافذة بحجم 0، مما يعني أنه ليس لديه طريقة لاكتشاف أن النافذة المُعلن عنها لم تعد 0 في وقت ما في المستقبل. لا يرسل بروتوكول TCP على جانب الاستقبال أجزاءًا بلا بيانات nondata تلقائيًا، إنما يرسلها فقط استجابةً لجزء بياناتٍ واصلة. يتعامل بروتوكول TCP مع هذا الوضع على النحو التالي: يستمر جانب الإرسال في إرسال جزء بحجم بايتٍ واحد من البيانات بين الحين والآخر عندما يعلن الجانب الآخر عن نافذة بحجم 0. يعلم جانب الإرسال أن هذه البيانات لن تُقبل على الأرجح، لكنه يحاول على أية حال، نظرًا لتنبيه trigger كل جزء من هذه الأجزاء المكونة من 1 بايت استجابةً تحتوي على النافذة المعلن عنها حاليًا. في النهاية، ينبّه triggers أحد هذه المسابر المكونة من 1 بايت استجابةً تبلّغ عن نافذةٍ غير صفرية معلن عنها. لاحظ أن هذه الرسائل ذات 1 بايت تسمى مسابر النافذة الصفرية Zero Window Probes وعمليًا يجري إرسالها كل 5 إلى 60 ثانية. أما بالنسبة للبايت المفرد من البيانات الذي سيُرسل في المسبار: فهو البايت التالي للبيانات الفعلية الموجودة خارج النافذة مباشرةً (يجب أن تكون بيانات حقيقية إذا قبِلها المستقبل). لاحظ أن السبب الذي يجعل الجانب المرسل يرسل جزء المسبار هذا دوريًا هو أن بروتوكول TCP مصمم لجعل جانب الاستقبال بسيطًا قدر الإمكان، فهو ببساطة يستجيب لأجزاء من المرسل، ولا يبدأ أي إجراءٍ بمفرده. هذا مثال على قاعدة تصميم بروتوكولٍ معترف بها (على الرغم من عدم تطبيقها عالميًا)، والتي نطلق عليها قاعدة المرسل الذكي / المستقبل الغبي smart sender/ dumb receiver بسبب عدم وجود اسمٍ أفضل. الحماية من الالتفاف Protecting Against Wraparound يأخذ هذا القسم والقسم التالي في الاعتبار حجم حقلي SequenceNum وAdvertisedWindow وتأثيرات أحجامهما على أداء وصحة بروتوكول TCP. يبلغ طول الحقل SequenceNum الخاص ببروتوكول TCP 32 بتًا، بينما يبلغ طول الحقل AdvertisedWindow 16 بتًا. مما يعني أن بروتوكول TCP قد استوفى بسهولة متطلبات خوارزمية النافذة المنزلقة بحيث تكون مساحة الرقم التسلسلي ضعف حجم النافذة: 232 >> 2 × 216، ومع ذلك فإن هذا المطلب ليس بالشيء المهم لهذين الحقلين، وبإمكانك افتراض كل حقلٍ على حدة. تكمن أهمية مساحة الرقم التسلسلي 32 بت في أن الرقم التسلسلي المُستخدَم في اتصالٍ معين قد يلتف، أي يمكن إرسال بايتٍ برقمٍ تسلسلي S في وقت واحد، ثم قد يرسَل بايتٌ ثانٍ بنفس الرقم التسلسلي S في وقت لاحق. نفترض أن الرزم لا يمكنها البقاء على الإنترنت لفترة أطول من MSL الموصى بها، وبالتالي نحتاج حاليًا إلى التأكد من أن الرقم التسلسلي لا يلتف خلال فترة زمنية مدتها 120 ثانية. يعتمد حدوث ذلك أم لا على مدى سرعة نقل البيانات عبر الإنترنت، أي مدى السرعة التي يمكن بها استهلاك مساحة الرقم التسلسلي 32 بت. (تفترض هذه المناقشة أننا نحاول استهلاك مساحة الرقم التسلسلي بأسرع ما يمكن، ولكن بالطبع سنكون كذلك إذا كنا نقوم بعملنا المتمثل في الحفاظ على الأنبوب ممتلئًا) يوضح الجدول التالي المدة التي يستغرقها الرقم التسلسلي للالتفاف حول الشبكات ذات أحياز النطاق التراسلي bandwidths المختلفة. table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } حيز النطاق التراسلي Bandwidth الوقت اللازم للالتفاف Time until Wraparound T1 مقداره 1.5 ميجابت في الثانية 6.4 ساعات T3 مقداره 45 ميجابت في الثانية 13 دقيقة Fast Ethernet مقداره 100 ميجابت في الثانية 6 دقائق OC-3 مقداره 155 ميجابت في الثانية 4 دقائق OC-48 مقداره 2.5 جيجابت في الثانية 14 ثانية OC-192 مقداره 10 جيجابت في الثانية 3 ثوان 10GigE مقداره 10 جيجابت في الثانية 3 ثوان كما ترى مساحة الرقم التسلسلي 32 بت كافيةٌ عند حيز نطاقٍ تراسلي متواضع، ولكن بالنظر إلى أن روابط OC-192 أصبحت شائعة الآن في الشبكات الرئيسية backbone للإنترنت، وأن معظم الخوادم تأتي الآن بواجهات 10Gig Ethernet (أو 10 جيجابت في الثانية)، فنكون قد تجاوزنا الآن هذه النقطة وسيكون 32 بتًا صغيرًا جدًا. عملت مؤسسة IETF على توسيع بروتوكول TCP الذي يوسّع بفعاليةٍ مساحة الرقم التسلسلي للحماية من التفاف الرقم التسلسلي. الحفاظ على الأنبوب ممتلئا Keeping the Pipe Full تكمن أهمية حقل AdvertisedWindow ذي 16 بتًا في أنه يجب أن يكون كبيرًا بما يكفي للسماح للمرسل بالحفاظ على الأنبوب ممتلئًا. من الواضح أن جهاز الاستقبال حر في عدم فتح النافذة بالحجم الذي يسمح به حقل AdvertisedWindow، فنحن مهتمون بالحالة التي يكون فيها لدى المستقبل مساحة تخزين كافية للتعامل مع أكبر قدرٍ ممكن من البيانات المسموح بها AdvertisedWindow. لا يُحدَّد حجم حقل AdvertisedWindow في هذه الحالة بحيز النطاق الشبكة التراسلي فقط ولكن بجداء التأخير × حيز النطاق التراسلي بدلًا من ذلك، والذي يجب فتحه بصورةٍ كافية للسماح بإرسال الجداء الكامل للتأخير × حيز النطاق التراسلي للبيانات المُراد إرسالها. بافتراض أن RTT تبلغ 100 ميلي ثانية (رقم نموذجي للاتصال عبر البلاد في الولايات المتحدة)، يعطي الجدول التالي جداء التأخير × حيز النطاق التراسلي للعديد من تقنيات الشبكة: حيز النطاق التراسلي Bandwidth جداء التأخير × حيز النطاق التراسلي Delay × Bandwidth Product T1 مقداره 1.5 ميجابت في الثانية 18 كيلوبايت T3 مقداره 45 ميجابت في الثانية 549 كيلوبايت Fast Ethernet مقداره 100 ميجابت في الثانية 1.2 ميجا بايت OC-3 مقداره 155 ميجابت في الثانية 1.8 ميجا بايت OC-48 مقداره 2.5 جيجابت في الثانية 29.6 ميجا بايت OC-192 مقداره 10 جيجابت في الثانية 118.4 ميجا بايت 10GigE مقداره 10 جيجابت في الثانية 118.4 ميجا بايت كما ترى فإن حقل AdvertisedWindow الخاص ببروتوكول TCP في حالةٍ أسوأ من حقل SequenceNum الخاص به، فهو ليس كبيرًا بما يكفي للتعامل حتى مع اتصال T3 عبر الولايات المتحدة القارية، نظرًا لأن الحقل 16 بت يسمح لنا بالإعلان عن نافذة حجمها 64 كيلو بايت فقط. يوفر توسيع TCP نفسه المذكور أعلاه آليةً لزيادة حجم النافذة المعلن عنها بفعالية. بهذا نكون قد تعرفنا على برتوكولات تدفق البايتات الموثوقة في الشبكات الحاسوبية آخذين بروتوكول TCP مثالًا في ذلك، وسنتابع بالمقال الموالي شرحها بالتخصيص في آليات الإرسال والبدائل. ترجمة -وبتصرّف- للقسم Reliable Byte Stream من فصل ProtocolsEnd-to-End من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا بروتوكولات طرف إلى طرف End-to-End Protocols في الشبكات الحاسوبيةالمقال السابق: تأسيس الشبكات الحاسوبية والتعرف على تطبيقاتها البرمجيات المستخدمة في بناء الشبكات الحاسوبية التوجيه Routing بين الأجهزة المتنقلة في الشبكات الحاسوبية دليل بصري لكيفية استخدام أنفاق SSH
  20. سنتحدث في هذا المقال مشكلة تواصل العمليات في البداية، والدور الذي يلعبه مستوى النقل transport في معمارية الشبكة، والذي يُسمى أحيانًا بروتوكول طرفٍ إلى طرف end-to-end، بعدها سنعرض الخدمات التي تحقق هذا الدور، مع شرح خدمة فك تعدد إرسال demultiplexing بسيطة من بين هذه الخدمات باستخدام بروتوكول UDP مشكلة تواصل العمليات Getting Processes to Communicate يمكن استخدام العديد من التقنيات لتوصيل مجموعة حواسيبٍ معًا، بدءًا من شبكات الإيثرنت البسيطة، والشبكات اللاسلكية، وحتى الشبكات المتشابكة ذات النطاق العالمي. وبمجرد الترابط، فستكون المشكلة التالية هي تحويل خدمة تسليم الرزمة من مضيف إلى مضيف إلى قناة اتصال بنمط عملية إلى عملية. هذا هو الدور الذي يلعبه مستوى النقل transport في معمارية الشبكة، والذي يُسمى أحيانًا بروتوكول طرفٍ إلى طرف end-to-end لأنه يدعم الاتصال بين برامج التطبيق التي تعمل في العقد النهائية. تتجسد قوة بروتوكول طرف إلى طرف بعاملين مهمين: الأول من جهة الطبقات الأعلى، حيث أن عمليات مستوى طبقة التطبيق التي تستخدم خدمات مستوى طبقة النقل لها متطلباتٌ معينة. تحدّد القائمة التالية بعض الخصائص العامة المُتوقَّع توفيرها ببروتوكول النقل: ضمان تسليم الرسالة. تسليم الرسائل بنفس ترتيب إرسالها. تسليم نسخةً واحدة على الأكثر من كل رسالة. دعم الرسائل الكبيرة العشوائية. دعم التزامن بين المرسل والمستقبل. السماح للمستلم بتطبيق التحكم في التدفق على المرسل. دعم عمليات تطبيق متعددة على كل مضيف. لاحظ أن هذه القائمة لا تتضمن جميع الوظائف التي قد تحتاجها عمليات التطبيق من الشبكة، فلا تتضمن ميزات الأمن مثل الاستيثاق أو التشفير والتي توّفرها عادةً بروتوكولاتٌ تقع فوق مستوى النقل. (سنناقش الموضوعات المتعلقة بالأمن لاحقًا). أما العامل الثاني فهو يتعلق بالطبقات السفلى، حيث أن الشبكة الأساسية التي يعمل عليها بروتوكول النقل لها قيودٌ معينة في مستوى الخدمة التي يمكن أن يوفرها. تتمثل بعض القيود الأكثر شيوعًا للشبكة في امكانية: إسقاط الرسائل. إعادة ترتيب الرسائل. تسليم نسخ مكررة من رسالة معينة. تقييد حجم الرسائل بحجمٍ محدود. تسليم الرسائل بعد تأخير طويل وعشوائي. ويقال أن مثل هذه الشبكة توفر أفضل جهدٍ best-effort من مستوى الخدمة، كما يتضح من الإنترنت. وبالتالي، يكمن التحدي في تطوير الخوارزميات التي ترقّي الخصائص الأقل من الخصائص المثالية للشبكة الأساسية إلى مستوى عالٍ من الخدمة التي تتطلبها برامج التطبيق. تستخدم بروتوكولات النقل المختلفة مجموعات مختلفة من هذه الخوارزميات. يبحث هذا المقال في هذه الخوارزميات في سياق أربع خدمات تمثيلية هي: خدمة فك تعدد إرسال demultiplexing بسيطة غير متزامنة وخدمة تدفق بايتٍ موثوقة و"خدمة طلب / رد request/reply" وخدمة تطبيقات الزمن الحقيقي. نستخدم، في حالة خدمات فك تعدد الإرسال وتدفق البايت، بروتوكول مخطط بيانات المستخدم User Datagram Protocol أو اختصارًا UDP وبروتوكول التحكم في الإرسال Transmission Control Protocol أو اختصارًا TCP على التوالي لتوضيح كيفية تقديم هذه الخدمات عمليًا. بينما نناقش، في حالة خدمة الطلب / الرد، الدور الذي تلعبه في خدمة استدعاء الإجراءات البعيدة Remote Procedure Call أو اختصارًا RPC وميزاتها. لا يحتوي الإنترنت على بروتوكول RPC واحد، لذلك قمنا بتغطية هذه المناقشة بوصفٍ لثلاثة من بروتوكولات RPC المستخدمة على نطاق واسع: SunRPC وDCE-RPC وgRPC. أخيرًا، تفرض تطبيقات الزمن الحقيقي متطلباتٍ خاصة على بروتوكول النقل، مثل الحاجة إلى نقل معلومات التوقيت التي تسمح بإعادة تشغيل عينات الصوت أو الفيديو في النقطة الزمنية المناسبة. سيتم التركيز على المتطلبات التي وضعتها التطبيقات على مثل هذا البروتوكول من خلال أكثر الأمثلة استخدامًا وهو بروتوكول النقل في الوقت الحقيقي Real-Time Transport Protocol أو اختصارًا RTP. فك تعدد الإرسال البسيط Simple Demultiplexor باستخدام بروتوكول UDP إن أبسط بروتوكول نقل ممكن هو الذي يوسّع خدمة التوصيل من مضيف إلى مضيف للشبكة الأساسية إلى خدمة اتصال عمليةٍ إلى عملية. من المحتمل أن يكون هناك العديد من العمليات التي تعمل على أي مضيفٍ معين، لذلك يحتاج البروتوكول إلى إضافة مستوىً من فك تعدد الإرسال، مما يسمح لعمليات تطبيقٍ متعددة على كل مضيف بمشاركة الشبكة. لا يضيف بروتوكول النقل أي وظيفة أخرى لخدمة أفضل جهد التي تقدمها الشبكة الأساسية بصرف النظر عن هذا المطلب. يُعد بروتوكول مخطط بيانات المستخدم UDP للإنترنت مثالًا عن بروتوكول النقل هذا. المشكلة الوحيدة المثيرة للاهتمام في مثل هذا البروتوكول هي شكل العنوان المستخدم لتحديد العملية المستهدفة. على الرغم من أنه من الممكن للعمليات تحديد بعضها بعضًا مباشرةً باستخدام معرّف العملية process id أو اختصارًا pid المخصّص لنظام التشغيل، فإن مثل هذا النهج عمليٌّ فقط في نظامٍ موزَّع مغلَقٍ يعمل فيه نظام تشغيل واحد على جميع المضيفين ويسند لكل عمليةٍ معرّفًا فريدًا. الأسلوب الأكثر شيوعًا، والذي يستخدمه بروتوكول UDP، هو للعمليات التي تحدّد بعضها بعضًا بطريقةٍ غير مباشرة باستخدام محددٍ موقع مجرد abstract locator، يسمى عادةً منفذًا port. الفكرة الأساسية هي أن ترسل عملية المصدر رسالة إلى منفذ وأن تتلقّى عملية الوجهة الرسالة من منفذ. تحتوي ترويسة بروتوكول طرفٍ إلى طرف الذي يطبّق وظيفة فك تعدد الإرسال هذه على معرّفٍ (منفذ) لكل من مرسل (مصدر) ومُستقبِل (وجهة) للرسالة. يوضح الشكل التالي ترويسة UDP على سبيل المثال. لاحظ أن حقل منفذ UDP يبلغ طوله 16 بتًا فقط، وهذا يعني أن هناك ما يصل إلى 64 ألفًا من المنافذ المحتملة، ومن الواضح أنها غير كافية لتحديد جميع العمليات على جميع الأجهزة المضيفة في الإنترنت. لحسن الحظ، لا تُفسَّر المنافذ عبر الإنترنت بالكامل، ولكن فقط على مضيفٍ واحد، أي يحدّد منفذٌ على مضيفٍ معين العملية فعليًا زوج "منفذ ومضيف". يشكّل هذا الزوج مفتاح فك تعدد الإرسال لبروتوكول UDP. المشكلة التالية هي كيفية تعرّف العملية على منفذ العملية التي تريد إرسال رسالة إليها. تبدأ عادةً عملية العميل في تبادل الرسائل مع عملية الخادم، وبمجرد اتصال العميل بالخادم، يعرف الخادم منفذ العميل (من حقل SrcPrt المضمَّن في ترويسة الرسالة) ويمكنه الرد عليه. وبالتالي فإن المشكلة الحقيقية هي بكيفية تعرّف العميل على منفذ الخادم في المقام الأول. من الأساليب الشائعة أن يقبل الخادم الرسائل على منفذٍ معروف جيدًا، أي يتلقّى كل خادم رسائله على منفذٍ ثابت منشورٍ على نطاقٍ واسع، مثل خدمة هاتف الطوارئ المتوفرة في الولايات المتحدة على رقم الهاتف المعروف 911. يتلقى خادم اسم النطاق Domain Name Server أو اختصارًا DNS في الإنترنت، على سبيل المثال، الرسائل على المنفذ المعروف جيدًا (53) على كل مضيف، وتستمع خدمة البريد للرسائل على المنفذ (25)، ويقبل برنامج يونيكس talk الرسائلَ على المنفذ المعروف (517)، وغير ذلك. يُنشَر هذا الربط mapping دوريًا في RFC وهو متاح في معظم أنظمة يونيكس في الملف /etc/services. يكون المنفذ المعروف في بعض الأحيان مجردَ نقطة بداية الاتصال: يستخدم العميل والخادم المنفذَ المعروف جيدًا للاتفاق على منفذٍ آخر سيستخدمانه في الاتصالات اللاحقة، مما يترك المنفذ المعروف متاحًا للعملاء الآخرين. تتمثل الإستراتيجية البديلة في تعميم هذه الفكرة، بحيث لا يوجد سوى منفذٍ واحد معروف جيدًا، وهو المنفذ الذي تقبل فيه خدمة رابط المنافذ port mapper الرسائل. وبالتالي يرسل العميل رسالةً إلى منفذ رابط المنافذ المعروف جيدًا طالبًا منه المنفذ الذي يجب أن يستخدمه للتحدث إلى "أية" خدمة، فيرجع رابطُ المنافذ المنفذ المناسب. تسهّل هذه الإستراتيجية تغيير المنفذ المرتبط بخدمات مختلفة بمرور الوقت وتسهّل لكل مضيفٍ استخدام منفذ مختلف لنفس الخدمة. إن المنفذ هو مجرد فكرةٍ مجردة كما ذكرنا للتو، وتختلف الطريقة التي تُطبَّق فيها بالضبط من نظامٍ إلى آخر، أو بصورةٍ أدق، من نظام تشغيل لآخر، وتُعد واجهة برمجة تطبيقات المقبس socket API مثالٌ على تطبيق المنافذ. يُطبَّق المنفذ عادةً بواسطة رتل رسائل، كما هو موضح في الشكل التالي. يلحق البروتوكول (بروتوكول UDP مثلًا) الرسالة بنهاية الرتل عند وصولها، وتُهمَل الرسالة في حالة امتلاء الرتل. لا توجد آلية للتحكم في التدفق في بروتوكول UDP لإخبار المرسل بإبطاء السرعة، حيث تُزَال رسالةٌ من مقدمة الرتل عندما تريد عملية التطبيق تلقي رسالة. وإذا كانت قائمة الانتظار فارغة، فستُوقَف العملية حتى تصبح الرسالة متاحة. أخيرًا، على الرغم من أن بروتوكول UDP لا يطبّق التحكم في التدفق أو التسليم الموثوق / المرتب، إلا أنه يوفر وظيفةً أخرى بخلاف فك تعدد إرسال الرسائل إلى بعض عمليات التطبيق، كما يضمَن صحة الرسالة باستخدام المجموع الاختباري checksum (يُعَد المجموع الاختباري لبروتوكول UDP اختياريًا في IPv4 ولكنه إلزامي في IPv6). خوارزمية المجموع الاختباري الأساسية لبروتوكول UDP هي نفسها المستخدمة في بروتوكول IP، أي أنها تضيف مجموعةً من الكلمات ذات 16 بتًا باستخدام حساب متمم الواحد ones’ complement وتحسب متمم الواحد للنتيجة. لكن بيانات الإدخال المستخدمة في المجموع الاختباري غير متوقعة بعض الشيء. يأخذ المجموع الاختباري لبروتوكول UDP ترويسة UDP ومحتويات جسم الرسالة وشيئًا يسمَّى الترويسة الزائفة pseudoheader كمدخلات. تتكون الترويسة الزائفة من ثلاثة حقولٍ من ترويسة IP، هي رقم البروتوكول protocol number وعنوان IP المصدر وعنوان IP الوجهة، بالإضافة إلى حقل طول UDP، حيث يُضمَّن حقل طول UDP مرتين في حساب المجموع الاختباري. يُعَد الدافع وراء وجود الترويسة الزائفة هو التحقق من تسليم هذه الرسالة بين نقطتي النهاية الصحيحتين. إذا عُدِّل عنوان IP الوجهة أثناء نقل الرزمة على سبيل المثال، مما يتسبب في خطأ بتسليم الرزمة، فستُكتشَف هذه الحقيقة بواسطة مجموع بروتوكول UDP الاختباري. ترجمة -وبتصرّف- للقسم Simple Demultiplexor من الفصل End-to-End Protocols من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا المقال السابق: التوجيه Routing بين الأجهزة المتنقلة في الشبكات الحاسوبية كيف تختار سياسة فعالة للجدار الناري لتأمين خواديمك - الجزء الثاني التشبيك المتقدم Advanced Internetworking في الشبكات الحاسوبية التشبيك Internetworking بين أنواع مختلفة من الشبكات الحاسوبية
  21. تُعَد عمليات التعبئة Fills المختلفة المتوفرة في برنامج سكريبوس Scribus رائعة، ولكنك قد تحتاج إلى شيئ مختلف في بعض الأحيان. لذلك يمكنك من خلال قضاء بعض الوقت في برنامج جيمب GIMP؛ إنشاء جميع أنواع التأثيرات التي يمكنك استخدامها في سكريبوس لجعل عمليات التعبئة الخاصة بك أكثر تميزًا. سنتعلّم في هذا المقال كيفية إنشاء التأثير "distressing mask" -كما في الشكل الآتي- الذي يمكنك استخدامه في جميع أنواع المشاريع، وليس للنصوص فقط، ولكن يجب أولًا تثبيت الخط Crash Scene على جهازك الذي يمكنك تنزيله مجانًا. التقنيات المحددة المستخدمة في برنامج جيمب GIMP إنشاء نمط Pattern. تطبيق المرشّح أو الفلتر Cartoon. إضافة قناع طبقة. في برنامج سكريبوس تحويل النص إلى مضلعات. تحويل المضلعات إلى إطار صورة. إنشاء التأثير Distressing Mask ستحتاج أولًا إلى إنشاء صورة أساسية، وذلك من خلال الآتي: انتقل إلى برنامج جيمب. اختر قائمة ملف File ثم جديد New. اضبط عرض الصورة الجديدة إلى 800 بكسل والارتفاع إلى 200 بكسل. افتح القائمة المنسدلة "خيارات متقدمة Advanced Options"، واضبط خيار التعبئة "Fill With" على اللون الأبيض. ثم اضغط على "موافق OK". سننشئ نمطًا بعد ذلك كما يلي: اختر قائمة Filters، ثم Render، ثم Clouds، وبعد ذلك Solid Noise. اضبط "Detail" على القيمة 3، وهذا يعطي النمط قليلًا من شكل الحبيبات Graininess. اضبط الحجم X والحجم Y على القيمة 4، وهذا يعطي تأثيرًا ممتعًا ولكن لا تتردد في تجربة قيم مختلفة. استمر في الضغط على زر "New Seed" حتى تحصل على النمط الذي يناسبك. ثم اضغط موافق OK. بهذا يكون قد أصبح لديك الآن نمط غائم، ولكن يمكنك تعديله قليلًا للحصول على تأثير أفضل. اختر القائمة Filters ثم Artistic ثم Cartoon. اضبط "نصف قطر القناع Mask radius" على القيمة 8 و"نسبة اللون الأسود Percent black" على القيمة 0.2، إذ تٌعَد هذه القيم مناسبةً لما نريده هنا، ولكن يجب عليك تجربة قيم أخرى لاحقًا. ثم اضغط موافق OK. حوّلت النمط الآن إلى شكلٍ ذو نمط جرونجي "grungy"، وهذا ما تريده لذلك ستحتاج الآن إلى تحويله إلى قناع طبقة. اختر قائمة طبقة Layer ثم قناع Mask ثم إضافة قناع طبقة Add Layer Mask. حدّد الخيار "نسخة ذات تدرج رمادي من الطبقة Grayscale copy of layer". اضغط على زر إضافة Add. وبذلك يكون قد نُسِخ النمط إلى قناع طبقة. سترى في مربع حوار "الطبقات Layers" نسختين من الصورة كما في الشكل التالي، انقر على الصورة اليسارية لتحديدها (النسخة الموجودة على اليمين هي قناع الطبقة نفسه). انقر نقرًا مزدوجًا على العينة اللونية الأمامية (الموجودة على اليسار) في مربع حوار مربع الأدوات كما في الشكل التالي: حدّد اللون الأسود من خلال أي طريقة تريدها ثم اضغط على موافق OK. اختر قائمة تحرير Edit، ثم اختر خيار التعبئة Fill with FG Color. كما يمكنك جعل نمطك أغمق أيضًا. بعد كل ما سبق احفظ الصورة الآن وانتقل إلى برنامج سكريبوس، وذلك باتباع الآتي: اختر قائمة ملف File ثم حفظ Save، وأدخِل اسمًا للملف، ثم اضغط على حفظ Save. اختر قائمة ملف File ثم تصدير Export As، ثم أعطِ الملف اسمًا، واختر "PNG" مثل نوع الملف (اخترنا النوع PNG لأننا بحاجة إلى الشفافية)، ثم اضغط على تصدير Export. اقبل كل الإعدادات الافتراضية واضغط على تصدير Export مرةً أخرى. بهذا يكون قد انتهى كل العمل الذي نريده على برنامج جيمب GIMP،وبهذا سننتقل إلى برنامج سكريبوس Scribus. إنشاء النص اذهب إلى برنامج سكريبوس. اختر قائمة ملف File ثم جديد New. اقبل الإعدادات الافتراضية ثم اضغط على موافق OK. أنشئ إطار نص كبير بعرض صفحة A4. انقر نقرًا مزدوجًا على الإطار واكتب النص (اكتب النص "CRASH" على سبيل المثال). انتقل إلى نافذة خصائص Properties ثم نص Text، أو يمكنك الانتقال إلى نافذة خصائص المحتوى من قائمة نوافذ في الإصدار 1.5.7، بعد ذلك حدّد الخط الذي تريد استخدامه (اخترنا الخط "Crash Scene" في مثالنا). اضبط حجم الخط على 120 نقطة أو الحجم الذي تريده، لكن اختره كبيرًا. افتح قائمة "الألوان والمؤثرات Color & Effects"، وحدّد اللون الذي تريد استخدامه. في مثالنا هذا اخترنا اللون الأحمر القياسي، ولكن يمكنك اختيار اللون الذي تريده. تطبيق قناع على النص حدّد إطار النص ثم اختر قائمة عنصر Item ثم "تحويل لـ Convert To"، ثم اختر مخططات تفصيلية Outlines. أعد تحديد النص وانقر بزر الفأرة الأيمن، ثم اختر فك التجميع Ungroup من القائمة. اختر قائمة عنصر Item ثم أدوات المسار، بعد ذلك ادمج المضلعات Combine Polygons. أعد تحديد النص المحوَّل وانقر بزر الفأرة الأيمن واختر تحويل إلى Convert to، ثم اختر إطار صورة Image Frame من القائمة. انقر بزر الفأرة الأيمن فوق إطار الصورة الجديد، واختر الخيار "استيراد صورة ‎"Get Image من القائمة. حدد ملف PNG الذي صدّرته من جيمب GIMP ثم اضغط على موافق. انقر بزر الفأرة الأيمن على النص واختر "اضبط الصورة إلى الإطار Resize Image to Frame" من القائمة. الخلاصة تهانينا! بهذا تكون قد أنهيت كل شيء، ويمكنك محاولة تجريب ألوان وأنماط مختلفة، وبما أن النص قد أصبح الآن شكلًا، فيمكنك أيضًا محاولة ضبط التعبئة لتكون تدرجًا لونيًا Gradient وراقب ما يحدث. يمكن أن يمنحك استخدام خطوط مختلفة وبتعبئات مختلفة جميع أنواع التأثيرات غير العادية والمفيدة، كما يمكنك استخدام تقنية مماثلة على العديد من أنواع الكائنات الأخرى في برنامج سكريبوس. يمثّل الشكل التالي مثالًا يختلف فيه الخط ويكون لون التعبئة أخضر، ولكن القناع هو نفسه. ويمثّل الشكل التالي مثالًا، حيث جرت تعبئة وجه مبتسم بتدرج لوني نصف قطري من اللون السماوي إلى الأبيض، كما جرى تغيير لون التعبئة في برنامج جيمب GIMP إلى اللون الأبيض بدلًا من الأسود. أو يمكنك استخدام مرشّح Filter مختلف -Qbist مثلًا- لإنشاء قناع الطبقة، مع استخدام تدرج لوني خطي حر Free Linear Gradient مع العديد من نقاط التوقف اللونية كما في الشكل التالي: لا يوجد حصر للاحتمالات تقريبًا، لهذا استمتع بالتجربة. ترجمة -وبتصرّف- للمقال How to create a distressing mask to make more interesting fill effects. اقرأ أيضًا خطوات تطوير شعار باستخدام برنامج سكريبوس Scribus كيفية إنشاء الظلال في برنامج سكريبوس Scribus كيفية إنشاء أشكال معقدة ذات زوايا دائرية في برنامج سكريبوس Scribus
  22. سنأخذك في هذا المقال عبر عملية إبداعية خيالية لإنشاء شعار شركة جديد من مرحلة الرسم الأولى، وصولًا إلى نموذج ثلاثي الأبعاد، كما سترى كيفية استخدام تطبيقات مختلفة مجانية ومفتوحة المصدر لإنشاء الشعار من البداية إلى النهاية. لن نوضّح كيفية إنشاء الشعار خطوةً بخطوة، فقد أنشأنا الشعار بالفعل على أمل أن يكون مصدر إلهام للأشخاص الذين قد يرغبون في إلقاء نظرة على برامج مختلفة ولكنهم لا يعرفون من أين يبدأون أو ما يمكنهم فعله بهذه البرامج؛ أما جميع التطبيقات المستخدَمة هنا فهي مجانية تمامًا للتنزيل والاستخدام دون قيود. الرسم الأولي سنكلّفك بمهمة إنشاء شعار لمشروع تجاري جديد يؤجّر اليخوت لقضاء العطلات، وهنا افترض أن العميل قد أعطاك موجزًا للتصميم مخصصًا لشعار بسيط يُظهر شيئًا قد تراه على أحد اليخوت/ ولنستخدم صورة نافذة اليخت مع إطلالة على البحر من وراء النافذة. ستحتاج أولًا إلى رسم أولي، وهو أي شيء لإعطاء العميل فكرةً عما ستنشئه، ولهذا عليك باتباع ما يأتي: افتح برنامج سكريبوس Scribus وأنشئ مستندًا فارغًا. أظهر الشبكة وتتبعها لتسهيل عملية الرسم. أنشئ ثلاثة ألوان جديدة، هي الأزرق الفاتح والأزرق المتوسط والأزرق الداكن. أنشئ دائرةً كبيرةً بداخلها دائرة أصغر قليلًا. استخدم عملية المسار Path Operation لقص الدائرة الأصغر من الدائرة الأكبر لإنشاء حلقة. املأ الحلقة باللون الأزرق الداكن وأزل الحدود الخارجية outline. أنشئ دائرةً أصغر داخل الحلقة. ارسم خطًا منحنيًا يسمى بخط بيزير عبر الدائرة وعدّله لتشكيل شكل موجة. اجعل الخط أثخن وحوّله إلى حد Stroke. اطرح الخط من الدائرة واقسمه لإنشاء شكلين جديدين. لوّن الشكل العلوي باللون الأزرق الفاتح، والشكل السفلي باللون الأزرق المتوسط (مع إزالة الحدود الخارجية أيضًا). لديك الآن الرسم الأولي الموضَّح في الشكل التالي لتريه للعميل: لنفترض أن العميل قد أحب الفكرة، ولكنه يريد جعل الشعار أكثر"ديناميكية" لإظهار الضوء عليه. هنا يمكن تنفيذ الأمر من خلال الخطوات التالية: أنشئ لونًا جديد من اللون الأزرق الفاتح (الأبيض تقريبًا). غيّر تعبئة الشكل العلوي لتكوين متجه ذو تدرج لوني حر بين اللون الأزرق الفاتح ولون الشكل الأصلي. انقل متجه التدرج اللوني إلى شكل قطري من أعلى اليسار إلى أسفل اليمين داخل حدود الحلقة الخارجية. طبّق الشيء نفسه على الشكل الآخر، ثم الشيء نفسه على الحلقة. لتتشكّل لديك نسخة "مضاءة" من الشعار كما في الشكل التالي: وبافتراض أن العميل قد توقع شيئًا ثلاثي الأبعاد، فعلينا أن نطبّق ذلك. الإصدار الثاني من الشعار أدوات رسوميات برنامج سكريبوس جيدة، لكنها لا تستطيع التعامل مع التأثيرات المعقدة بسهولة، لذلك لننتقل إلى برنامج إنكسكيب Inkscape. أنت تعلم أيضًا أن برنامج سكريبوس يمكنه حفظ الصفحات مثل ملفات SVG، والتي يمكن لبرنامج إنكسكيب التعامل معها، وبالتالي فأنت لست بحاجة إلى رسم الشعار مرةً أخرى، ويمكنك اتباع ما يأتي فقط: صدّر الشعار كملف SVG من برنامج سكريبوس. افتح برنامج إنكسكيب وحمّل الشعار. تأكد من أن كل شيء يبدو على ما يرام ولكن احتفظ بالشعار بأكمله مجموعة. طبّق المرشّح "Bevel / Button" على الشعار، وعدّل هذا المرشّح مع تغيير مصدر الإضاءة إلى بقعة ضوء Spot Light للحصول على تأثير "ثلاثي الأبعاد" جميل كما في الشكل التالي: يبدو هذا الشكل جيدًا، ولكن جرّب المرشّح "ميلان Bevel / حد بارز Raised Border" بدلًا من ذلك، إذ ستحصل على شيء يبدو جميلًا أيضًا ولكن بطريقة مختلفة مثل الشكل التالي: ثم جرّب استخدام التأثير "ظلال Shadows / وميض مقطوع Cutout Glow"، والذي يبدو أيضًا رائعًا مثل الشكل التالي: تُعَد كل الخيارات الثلاثة السابقة جيدة، ولكن لنستخدم الإصدار الذي طبّقنا عليه المرشّح "Button"، مع الحرص على جعله يبدو "ثلاثي الأبعاد". ارسم شكل شبه منحرف بحيث يكون الجانب الأيسر له أقصر من الجانب الأيمن، واستخدم المسار إضافات Extensions ثم تعديل المسار Modify Path، ثم المنظور Perspective لإعطاء الشعار منظور مثل الشكل التالي: وهنا أحب العميل ذلك، ولكنه يريد شيئًا ثلاثي الأبعاد فعليًا. الانتقال تعلم أن برنامج إنكسكيب يمكن أن ينتج بعض التأثيرات ثلاثية الأبعاد الرائعة، لكنك تدرك أن أي تغييرات أخرى قد يرغب فيها العميل ستستغرق وقتًا طويلًا لتغييرها عند رسمها في برنامج إنكسكيب، إذ سيؤدي مجرد تغيير الزاوية قليلًا إلى حدوث الكثير من المتاعب، إلا إذا طبّقت كل شيء تطبيقًا صحيحًا. إذًا لننتقل إلى برنامج بلندر Blender. بما أن برنامج بلندر يمكنه أيضًا استيراد ملفات SVG، فلن تضطر إلى إعادة رسم الشعار مرةً أخرى، ولكنك ستحتاج إلى تنظيف ملف SVG قبل الدخول إلى برنامج بلندر لتسهيل التعديل لاحقًا، لهذا اتبع ما يلي: أعِد تحميل ملف SVG الأصلي (الذي صدّرناه من برنامج سكريبوس) إلى برنامج إنكسكيب. فُك تجميع الشعار. حدّد الحلقة فقط وانتقل إلى قائمة مسار Path ثم تبسيط Simplify. كرّر الشيء نفسه مع الشكلين الآخرين. احفظ الرسم المبسَّط حديثًا كملف جديد. التطبيق ثلاثي الأبعاد 3D افتح برنامج بلندر Blender واستورد الشعار المبسَّط كملف SVG الذي حفظته من برنامج إنكسكيب. كبّر الشعار المستورَد لتتمكّن من رؤيته بصورةٍ أفضل، وانقله إلى المركز، ثم أعِد النسخة الأصل إلى مركز شبكة بلندر. حدّد كل شكل على حدة وامنح كل شكل مادة Material جديدة باللون الصحيح كما في الشكل التالي: أخرِج Extrude الحلقة بمقدار 0.004، وأعطها ميلانًا Bevel بمقدار 0.002، مع إزاحةٍ قدرها ‎-0.002 ودقة Resolution بمقدار 2. كرّر الشيء نفسه مع الشكلين الآخرين ولكن أخرِجهما بمقدار 0.003 بدلًا من ذلك، وهذا لإبقائهما "داخل" الحلقة. يُعَد الشكل السابق جيدًا، ولكن هناك مشكلة في "زوايا" الأشكال وهو ما يوضّحه الشكل التالي: بما أن البرامج Scribus وInkscape وBlender لا تتعامل مع المنحنيات بالطريقة نفسها تمامًا، فيمكن أن تكون ثمة اختلافات عند نقل الرسومات فيما بين هذه البرامج، وهذا يعني أنه يجب إصلاح هذه الزوايا الآن، إذ لن يحب عميلك الأشكال ذات الزوايا الغريبة. تذكّر أن تحفظ نموذجك قبل أن تبدأ بالتغيير لتتمكّن من العودة إلى هذا النموذج عند حدوث فوضى. سنستخدم إصلاحًا سريعًا يعمل مع هذا النموذج، لذلك يجب عليك إصلاح النماذج الخاصة بك إصلاحًا صحيحًا، وذلك باتباع الخطوات الآتية: حدد أحد الأشكال وانتقل إلى وضع التحرير Edit Mode. اسحب عقدة الرأس المحدَّد على طول الشكل لمنعها من القطع في نهاية الشكل. كرّر الشيء نفسه على الشكل الآخر. يبدو كل شيء أفضل الآن، إذًا لنُعِدّ المشهد باتباع الخطوات الموالية: غيّر المصباح Lamp ليصبح بقعة Spot، ودوّره ليشير إلى أعلى يسار الشعار. حرّك الكاميرا ودوّرها لتظهِر الجانب الأيمن من الشعار. اضبط بيئة الإضاءة Environmental Lighting على الإعداد الافتراضي 1. اضبط تظليل ألفا للمشهد على القيمة شفاف Transparent. صيّر Render المشهد واحفظ النتيجة المصيَّرة في ملف. اعرِض الشعار الجديد -الموضَّح في الشكل التالي- على العميل الذي سيعجبه العمل كثيرًا، لكنه يريد رؤيته عمليًا مع إضافة ظل له. التعديلات النهائية حان الوقت الآن لإجراء مزيد من المعالجة بعد أن حصلتَ على الصورة الأساسية، ولكننا في هذه المرة سنستخدم برنامج جيمب GIMP. انتقل إلى برنامج جيمب GIMP وحمّل الصورة التي صدّرتها للتو من برنامج بلندر. أضف تأثير الظل من خلال قائمة Filters ثم اختر Light and Shadow ثم Drop Shadow. استخدم أداة التحديد الدائرية Ellipse Select لتحديد المنطقة الموجودة حول الشعار والظل، بعد ذلك أنشئ فراغًا بين الشعار / الظل والتحديد. أنشئ مسارًا Path من التحديد. قص الصورة وفق التحديد (للتخلص من المنطقة غير الضرورية). احفظ الصورة الجديدة بتنسيق TIFF. تجربة الشعار عمليا ارجع إلى برنامج سكريبوس وأنشئ مستندًا جديدًا. أنشئ إطار صورة وضَع صورة شعارك فيه. غيّر حجم الصورة و/ أو حجم الإطار حتى يبدو كل شيء صحيح. انقر بزر الفأرة الأيمن ثم اختر "خصائص الصورة الموسّعة Extended Image Properties". اختر المسار الدائري ثم موافق. فعّل مسار القطع Clipping Path من تبويب شكل Shape في نافذة خصائص. أضف نصًا وخلفيةً حول الصورة، ثم انقل الصورة إلى الأعلى بحيث يتدفق النص حولها. وبهذا يكون قد أصبح كل شيء جاهزًا للعميل. الخاتمة لقد رأينا في هذا المقال كيف تعاملت تطبيقات مختلفة مع رسم أولي مُنشَأ في برنامج سكريبوس للحصول على نموذج ثلاثي الأبعاد مكتمل، ثم العودة إلى برنامج سكريبوس مرةً أخرى، وبذلك رأينا روعة هذه البرامج المجانية. ترجمة -وبتصرّف- للمقال Evolution of a logo. اقرأ أيضًا كيفية إنشاء الظلال في برنامج سكريبوس Scribus كيفية بدء استخدام برنامج سكريبوس Scribus كيفية إنشاء أشكال معقدة ذات زوايا دائرية في برنامج سكريبوس Scribus كيفية إنشاء مجموعة ثلاثية الأبعاد من الأحرف في Adobe Photoshop كيفية تصميم شعار شارة بيسبول باستخدام برنامج Adobe Illustrator
  23. لا يحتوي برنامج سكريبوس Scribus على طريقة لإنشاء ظلال Drop shadow مضمَّنة به، لهذا يمكنك بالتأكيد استخدام برنامج جيمب Gimp أو إنكسكيب Inkscape لإنشاء بعض التأثيرات التي تشبه الظل المسقَط Drop shadow، ثم تستورده في شكل صورة. سنعرض في هذا المقال طريقةً تُظهر الظلال كأنها منشَأةً بالكامل ضمن برنامج سكريبوس. تجدر الإشارة إلى أن الإصدار 1.5.7 الجديد والداعم للغة العربية، والذي مازال في وضع التطوير من برنامج سكريبوس؛ يحتوي على خيار تطبيق الظل للعناصر في تبويب "ظل ساقط Drop shadow" من نافذة خصائص. ولكن تعلّم طرق إضافية لتشكيل الظلال سيكون مفيدًا لإجراءات مختلفة في مشاريع مستقبلية لزيادة المهارة والمعرفة في استخدام البرنامج. المشكلة سنستخدم التدرجات اللونية Gradients لتشكيل الظلال، لكن تكمن الصعوبة في أنه إن أردنا إنشاء ظلال لكائن له شكل مستطيل، فلا يوجد تدرج مناسب يعمل بهذه الطريقة، حيث يتشكّل تلاشٍ أفقي عند الحواف الرأسية وآخر رأسي عند الحواف الأفقية كما في الشكل التالي: الحل يجب أن نذكر في البداية أن هذه الطريقة ليست مثالية، ولكن ما سنفعله هو إنشاء قالب مربّع مولَّف من عناصر ذات أشكال مثلثة، وترتيب التدرج اللوني في كل جزء حتى نحصل على تدرجات لونية في الحواف جميعها في الاتجاه الصحيح. سنحصل في النهاية على كائن مجمَّع يمكنك حفظه في سجل القصاصات الخاص بك (من قائمة عنصر ثم اختر "أرسل إلى"، بعد ذلك اختر "سجل القصاصات")، ثم إعادة استخدامه وتغيير حجمه حسب الحاجة وبالطريقة التي تريدها، حيث سننشئ الشكل التالي: يتكوّن هذا الشكل من 4 مثلثات، وهي مثلثات قائمة الزاوية لأن الشكل الناتج هو مربع، وأوتار هذه المثلثات لها نفس الطول. سنرسم مثلثين منها فقط، ثم ننسخ المثلثين الباقيين، حيث تكون خصائص المثلث الأول كما يلي: حيث يجب أن يُظهِر المثلث الآخر دورانًا بمقدار 60 درجة. ويمكنك ملاحظة أن حجم وأبعاد هذه المثلثات عشوائية. فوائد الخصائص يجب أن تكون هذه المثلثات قائمةً ومتساوية الأضلاع أيضًا، وبالتالي فإن الارتفاع يساوي نصف القاعدة بالضبط. ليس هناك داعٍ لإجراء حسابات مثلثات، لأنه يمكننا رؤية تلامس المثلثات في وسط المربع. لقد ضبطنا المثلث الأول بحيث يكون الارتفاع 250 نقطة والعرض 125 نقطة، وضبطنا المثلث الآخر بحيث يكون العرض 250 نقطة والارتفاع 125 نقطة. قد يكون وضع المثلثين في المكان الصحيح أمرًا صعبًا، ولكنه سيكون أسهل باستخدام الخصائص، لهذا اختر أرقامًا مُقرَّبةً لقيم X-Pos وY-Pos، ثم طابِق قيم المثلثين لتحصل على الشكل التالي: حدّد الإطارين السابقين، ثم انتقل إلى قائمة عنصر Item واختر "مضاعفة/تحويل"، ثم اختر نُسخ مطابقة Multiple Duplicate، وانسخ نسخةً واحدةً مع ترك المواضع للإزاحة الأفقية والرأسية عند القيمة 0. سيبدو وكأنه لم يحدث شيء، ولكن هذا بسبب وجود نسخة من كل منهما فوق النسخ الأصلية. اضغط باستمرار على مفتاح Shift، وحدّد المثلثين العلويين (نريد الطبقة العليا فقط)، بعدها اقلب أحد المثلثين أفقيًا، ثم اقلب الثاني رأسيًا أو بالعكس حتى تحصل على الشكل التالي: الألوان والتدرجات اللونية Gradients لنعمل الآن على كل مثلث واحدًا تلو الآخر. لقد تركنا اللون الافتراضي للحدود باللون الأسود حتى الآن رغم أننا لا نريدها، لذلك اجعل المثلثات بلا حدود. سيحتاج المثلثان العلوي والسفلي إلى تعبئة متدرجة رأسية، بينما يحتاج المثلثان اليميني واليساري إلى تعبئة متدرجة أفقية. سنستخدم في هذا المثال اللونين الأسود والأبيض فقط، ولكن يجب أن يكون اللون الأبيض على الجهة الخارجية للمربع النهائي. إذا تركت علامة اللون الأسود عند قمم المثلثات، فلن يكون هناك لون كافٍ عند الحافة الخارجية ليَظهر هذا التدرج اللوني، لذلك نقترح تحريك علامة اللون الأسود بنسبة 80% على الأقل عن موضع البداية، حيث ستكون الإعدادات الفعلية إما 80% أو 20% نظرًا لوجود مثلثات متقابلة، وهنا اختر القيمة التي تناسبك بحيث يكون المظهر النهائي هو دليلك لاختيار القيمة الصحيحة. استخدام برنامج سكريبوس كأداة فنية يقولون أن الخَبز علم والطبخ فن، ولكن يمكن القول أن برنامج سكريبوس هو علم وفن في آن واحد. لقد اخترنا جميع الأرقام الصحيحة مثل الارتفاع والعرض وقيم X-Pos وY-Pos، ولكن ظهر هذا التقاطع الأبيض الرفيع في المربع السابق، وهو حقيقي وسيظهر في ملفات PDF النهائية التي ستنشئها. استمر بالضغط على المفتاحَين Shift وAlt، إذ يمكنك التحرك ضمن مئات من النقاط مع تحريك كل مثلث نحو المركز. وبعد تحريك كل من المثلثات الأربعة بمقدار 0.06 نقطة (0.021 مم أو 0.001 بوصة) باتجاه المركز، يمكنك استخدام ميزة تقريب Zoom in عالية في برنامج سكريبوس على الأقل بمقدار 800 إلى 1600%، ويمكنك في النهاية التحقق بعد التصدير إلى ملف PDF من وجود هذا التقاطع الأبيض الذي قد يكون أحد أسبابه أنه كلما اقتربت من المثلثات، فستبدأ في رؤية تأثير حافة يشبه التجعّد في الزوايا. لا تنس عملية الحفظ اجمع المثلثات في مجموعة ثم احفظها في سجل القصاصات Scrapbook وستصبح بعد ذلك جاهزةً للاستخدام. بهذا نكون قد صنعنا مربعًا في النهاية، لكن يمكننا أن نمده بهذه الطريقة تلبيةً لاحتياجاتنا، لهذا ضَع ما يحلو لك من الإطارات الأخرى، لكن سيحتاج إطار النص إلى تحديد لون خلفيته. النتيجة يوضّح الشكل الآتي مثالَين عن بعض حالات الاستخدام مع إطار نص وإطار صورة، حيث تركنا سابقًا القليل من الظل في الجزء العلوي واليميني لتحديد حواف الإطار (التُقطت لقطة الشاشة هذه من برنامج Adobe Reader، لذلك فهذه ليست حواف الإطار التي يمكن رؤيتها في برنامج سكريبوس)، بحيث يبدو الظل أغمق خلف إطار النص، وقد يرجع ذلك فقط إلى التباين بين اللون الأبيض وحواف الصورة الداكنة. لاحظ أيضًا أنه يمكنك ضبط تعتيم opacity الظل لتفتيحه حسب الحاجة، مما يقلل بصريًا من تأثير تجعد الزاوية. إذا أردت استخدام ألوان أخرى، فخذ نسخةً من سجل القصاصات الخاص بك وفك تجميعها، وغيّر الألوان حسب الرغبة. وضعنا في المثال الآتي عنصر سجل القصاصات على صفحة مخصَّصة أكبر من حجم الكائن بقليل، ثم صدّرنا الصفحة كملف TIFF، واستوردناها إلى برنامج جيمب Gimp، وبعد ذلك طبّقنا تمويهًا في برنامج جيمب، وذلك من النوع Gaussian blur لتنعيم الحواف والمحتوى، ثم صدّرناه بتنسيق TIFF لتحميله في ملف صورة. يمكنك ضبط إعدادات الصور من خلال تحديد الخيار "ملائمة حجم الإطار Scale to Frame Size" من نافذة خصائص الصورة التي تصل إليها من خلال قائمة "نوافذ" ثم خصائص المحتوى، لكن اترك الخيار "نسبي Proportional" دون تحديد، حتى تتمكن من ضبط حجم إطار الصورة ومحتوياته حسب الحاجة. يمكنك حفظ هذا الإطار في سجل القصاصات الخاص بك لاستخدامه لاحقًا. يحتوي برنامج Gimp على العديد من أنواع التمويه المختلفة ولكل منها إعدادات مختلفة للحصول على الشكل الذي تريده. ترجمة -وبتصرّف- للمقال Drop Shadows. اقرأ أيضًا كيفية بدء استخدام برنامج سكريبوس Scribus كيفية إنشاء أشكال معقدة ذات زوايا دائرية في برنامج سكريبوس Scribus كيفية إنشاء مجموعة ثلاثية الأبعاد من الأحرف في Adobe Photoshop
  24. يُصنَّف هذا المقال تحت عنوان "التحوّل من التقليدية إلى الرقمية"، وسنعرض كل الخطوات التي نستخدمها للرسم والمسح الضوئي وتنظيف الخطوط التقليدية، عند استخدام هذه التقنية مع قصص الويب المصورة مثل المُستخدمة في موقع Pepper&Carrot. سنوضّح أولًا سير العمل من الرسم ثم "التحبير" ولكن بالقلم الرصاص، ثم سنمسح الخطوط ضوئيًا وننظّفها في برنامج Krita للاحتفاظ بالخطوط المرسومة بقلم الرصاص فقط، وسنوضّح بعد ذلك كيفية تلوين الخطوط، وجعلها شفافة لتكون جاهزةً لتلونيها كاملةً لاحقًا. 1. الاستعداد ابدأ برسم رسومات صغيرة عشوائية على ورقة قياسها A4، حيث سنرسم تعبيرات الوجه عادةً أولًا، ثم الحركات والصور المصغَّرة thumbnails أحيانًا، ولا يُفترَض أن يبدو الرسم جيدًا تمامًا لتضعه في كتاب، فهو رسمٌ عشوائي ومسودةٌ تحتفظ بها لنفسك، حيث سنرسم هذه المسودة من أجل ألا نشعر بالضغط عند رسم أشكالٍ سيئة على الورقة النهائية، وقد اخترنا صورةً مصغَّرة لنعمل عليها من بين جميع الرسمات العشوائية الأخرى، وحدّدناها باللون البرتقالي في الشكل التالي. قد تكون هذه الصورة المصغَّرة تركيبةً كلاسيكيةً ومبتذلةً قليلًا للركض والقفز، لكن لنراها بتفاصيل أكثر. 2. الخطوط التوجيهية Guidelines نبدأ أولًا بأخذ المكان المناسب للرسم، ثم نرسم الخطوط التوجيهية على ورقة جديدة كما في الشكل الآتي. أبقِ هذه الخطوط خفيفةً ودقيقةً للغاية، مع ضغط خفيف جدًا على القلم الأزرق. يمكنك استخدام علامة الرصاص التجارية التي تريدها، ولكن ننصحك باستخدام الرصاص Pentel Blue lead 0.5mm، كما يمكنك استخدام أقواس كبيرة في الرسم بحيث تحافظ على الأشياء دون تفاصيل، مع وجوب التعامل مع القلم أيضًا بصورةٍ مختلفة عن المعتاد، بحيث لا ترسم باستخدام الرسغ أو الإصبع، ولكن أشرِك الذراع بأكملها في رسم الخطوط. 3. الرسم باللون الأزرق Blue sketch تابع الرسم بقلم الرصاص الأزرق وأضِف التفاصيل، وابذل قصارى جهدك لبناء الخطوط الرئيسية مع إبقاء الأشكال بسيطة، إلى جانب اترك مساحة للحصول على حرية للخطوة التالية، إذ ليس الهدف الأساسي عمل رسم أزرق مثالي ثم إعادة رسم كل خط من الخطوط، فذلك سيكون مملًا. 4. المسح Erasing امسح الرسمة الزرقاء برفق باستخدام ممحاة مطاطية، إذ تُعَد عملية مسح خطوط Pentel الزرقاء أمرًا صعبًا، لذلك لا تخاطر بفقدان جزء من الرسم. يكون الغرض من هذه الخطوة هو تسهيل إزالة خط الرسم باستخدام برنامج Krita لاحقًا، لأنه سيكون داكنًا بصورة أقل، وستوفّر هذه الخطوة الحرية لعملية التحبير inking، وسيسهّل لنا الرسم الساطع عملية إخراج خطوط قلم الرصاص الداكنة. 5. التحبير Inking دون حبر حبّر رسومك باستخدام قلم رصاص 0.5mm B، فهو ناعم على الورق ويسمح باختلافات رمادية داكنة وفاتحة، وهو دقيق جدًا أيضًا. 6. مسح الرسومات ضوئيا Scan لقد استخدمنا هنا برنامج Xsane لنظام تشغيل Linux Xubuntu 14.04 من الحزمة الافتراضية، حيث يمكننا إعداد Xsane لالتقاط الصورة من الماسح الضوئي، وحفظها تلقائيًا بتنسيق PNG 300dpi مع الألوان تلقائيًا على قرص الحاسوب الصلب. 7. الانتقال إلى برنامج Krita افتح الملف في برنامج Krita، حيث أنّ التعديلات الوحيدة التي أجريناها على تثبيت برنامج Krita هي استخدام مظهر داكن واستخدام إعدادات لأحدث مجموعة من الفُرَش. يمكنك الحصول على الملف الخام الممسوح ضوئيًا من المصادر في نهاية هذا المقال. 8. القص Cropping يمكن تدوير الصورة من خلال الانتقال إلى قائمة Image، ثم تدوير Rotate، بعدها تدوير الصورة بمقدار 90 درجة إلى اليمين واختيار أداة القص، مع تفعيل الخيار Thirds Decoration من خيارات الأداة، إذ تساعد هذه الخطوط في إعداد عملية قص أفضل. وقد أضفنا الصورة تحت الخط الأخضر لإظهار خطوط التكوين التي نريدها. 9. منحنيات ضبط اللون في المرشح Filter افتح قائمة Filter ثم اختر Adjust، ثم منحنيات ضبط اللون Color Adjustement curves، وأجرِ تسويةً لقناة اللون الأحمر والأخضر كما في الشكل الآتي دون لمس قناة اللون الأزرق، وبالتالي يجب أن تحصل على صورة زرقاء كاملة، وستدمج بذلك البيانات الزرقاء للرسمة مع كل هذا اللون الأزرق، وبالتالي ستُزال الخطوط الزرقاء نوعًا ما. اضغط على تعديل الإعدادات المسبقة "Edit Presets" في الزاوية العلوية اليمنى، ثم اضغط على "Bookmark current"، حيث سيُضاف إعدادك المسبق إلى القائمة كما في الشكل الآتي، ويمكنك أيضًا إعادة تسمية العنصر بالنقر بزر الفأرة الأيمن، مثل اسم الإعداد المسبق التالي الذي هو "RGB->Blue only". 10. إزالة التشبع الأقصى Desaturate Max سنزيل الآن كل اللون الأزرق من عملنا الفني من خلال الذهاب إلى قائمة Filter ثم Adjust، وبعدها Desaturate، مع استخدام الخيار Max من القائمة. 11. تعديل القيم باستخدام المستويات Levels افتح المستويات Levels من خلال الانتقال إلى قائمة Filter ثم Adjust، وبعدها Levels، ثم حرّك مؤشر المثلث الأسود الصغير ليبدأ الرسم البياني في إظهار البيانات ونظّف جميع الضوضاء البيضاء الرمادية. ستحصل عادةً على جبل صغير في الرسم البياني على الجزء الأبيض (اليميني) الذي يجب تنظيفه عند مسح الورقة ضوئيًا، بحيث يجب قص اللون الأسود أيضًا لأننا نريد تجنب وجود بكسلات سوداء على الخطوط. 12. التنظيف اليدوي لديك الآن الوقت لتأخذ فرشاة وتختار اللون الأسود أو الأبيض، ثم تصلح عملك الفني بطريقة رقمية. لا تستخدم اللون الأسود كاملًا بل الأسود بنسبة 90%، لذلك استخدم محفوظات ألوانك في محدّد الألوان المتقدم advanced color selector لاسترداد اللون في كل مرة تحتاجه فيها، بعدها نظّف الشيء الذي لا تريده يدويًا، أو أعِد رسم الخط الذي لم يعجبك، أو شوّه الرسم بالكامل وحوّله إلى شيءٍ آخر. بهذا نكون قد رسمنا هنا باستخدام فرشاة صغيرة ونظّفنا باستخدام إعداد مسبق أكبر مثل الفرشاة الدوّارة، إذ نظّفنا باستخدام التلوين باللون الأبيض فوق كل البقع الرمادية الداكنة الصغيرة. 13. تلوين الخطوط افتح قائمة Filter ثم اختر Adjust، بعدها HSV Adjustement، وانقر على تلوين "Colorize"، بعدها يمكنك ضبط الصِبغة hue والتشبّع اللوني saturation، ولا نوصي بتعديل الإضاءة Lightness، فاللون الذي اخترناه هنا هو Burnt Sienna الداكن. احفظ الإعدادات المسبقة إذا كنت بحاجة إلى العثور على إعدادات اللون نفسها في المرة القادمة. 14. إزالة اللون الأبيض يجب الاحتفاظ بخطوط الرسمة فقط، لذلك نحتاج إلى إزالة الخلفية البيضاء، ولكن الصورة مسطحة. يمكن الوصول إلى المرشح الذي يعالج هذه المشكلة من خلال الانتقال إلى قائمة Filter ثم Colors ثم Color to Alpha، حيث يكون الإعداد الافتراضي لهذا المرشح هو إزالة الأبيض النقي، وتكون العتبة الافتراضية مثاليةً لهذه المهمة. 15. إدارة الطبقات أزلنا الخلفية البيضاء من الرسمة ثم سننشئها مرةً أخرى، ولكنها ستكون هذه المرة على طبقة منفصلة تحت الرسمة من خلال إنشاء طبقة جديدة، ووضعها تحت الرسمة. املأ هذه الطبقة باللون الأبيض من خلال تحدّد اللون الأبيض، ثم انتقل إلى قائمة Edit ثم Fill أي املأها باللون الأمامي، بعدها أعِد تسمية الطبقات ليكون مشروعك أوضح. 16. حفظ الصورة احفظ عملك الفني باسم مثل الشكل: kra.*. 17. خطوط الرسم النهائية الصورة التالية هي نسخة نهائية ذات دقة منخفضة، فإذا أردت إلقاء نظرة على الدقة الكاملة، فنزلها من خلال الرابط الموجود في نهاية هذا المقال. الملخص قد تبدو هذه الطريقة لإزالة الخطوط الزرقاء معقدةً وطويلةً لأننا فصّلنا الخطوات باستخدام ملاحظات وصور متعددة، ولكن ستكون مدة هذه المهمة 3 دقائق بمجرد إتقانها، ويمكنك تكرارها بسهولة على حزمة من عشر صفحات من رسوم الويب المصورة في أقل من 30 دقيقة، والمعلومات الرئيسية التي يجب تذكره هي: منحنيات ضبط اللون وجعل الصورة زرقاء من خلال تسوية قنوات الأحمر والأخضر بنقرتين باستخدام إعداد مسبق. إزالة التشبّع الأقصى Desaturate Max بنقرتين مع أو بدون إعداد مسبق. الأجزاء الأخرى سهلة للغاية ضمن سير العمل (القص والتباين وإزالة ألفا)، فهي هذه الطريقة هي الأسرع من بين كل الطرق المستخدمة في برنامج Gimp أو Photoshop، وتعطي أفضل النتائج وتتمحور حول برنامج واحد هو Krita. النتيجة بهذا يكون الملف قد أصبح جاهزًا لتلقّي طبقة تلوين بين طبقة الخلفية وطبقة الخطوط. الملفات المصدرية .Raw scanner (PNG, 300dpi, Xsane). .End .kra files ready to color (Krita 2.8.5, .kra). يمكن تنزيلها من sta.sh حيث حجمها 11 ميجابايت. ترجمة -وبتصرّف- للمقال Clean blue sketch traditional line-art to color it digital with in Krita لصاحبه David Revoy. اقرأ أيضًا أفضل مؤشر في برنامج كريتا Krita لإنشاءعملك الفني تحبير مسودة الرسم في كريتا استخدام الألوان في نمط التصاميم المسطحة في كريتا خطوات العمل المعتادة في كريتا
  25. لربما من غير المفاجئ أن تعلم أن الأجهزة المتنقلة تمثّل بعض التحديات لِمعمارية الإنترنت. صُمِّم الإنترنت في عصرٍ كانت فيه الحواسيب كبيرة وغير متحركة، وبينما كان لدى مصممي الإنترنت على الأرجح فكرة أن الأجهزة المتنقلة قد تظهر في المستقبل، فمن العدل أن نفترض أنها لم تكن أولويةً قصوى لاستيعابها. توجد اليوم الحواسيب المتنقّلة في كل مكان، لا سيما على شكل حواسيب محمولة laptops وهواتف ذكية smartphones، وبصورةٍ متزايدة في أشكال أخرى، مثل الطائرات بدون طيار drones. سنلقي نظرةً في هذا القسم على بعض التحديات التي يفرضها ظهور الأجهزة المتنقّلة وبعض الأساليب الحالية لاستيعابها. تحديات الشبكات المتنقلة من السهل اليوم الظهور في نقطة اتصال لاسلكية، والاتصال بالإنترنت باستخدام المعيار 802.11 أو بعض بروتوكولات الشبكات اللاسلكية الأخرى، والحصول على خدمة إنترنت جيدة جدًا. إحدى تقنيات التفعيل الرئيسية التي جعلت نقطة الاتصال hotspot ممكنة هي بروتوكول DHCP. يمكنك الاستقرار في المقهى، وفتح الحاسوب المحمول، والحصول على عنوان IP لحاسوبك المحمول الذي يتحدث إلى موجهٍ افتراضي default router وخادم نظام أسماء النطاقات Domain Name System أو اختصارًا DNS، وبالتالي لديك كل ما تحتاجه بالنسبة لفئة واسعة من التطبيقات. ولكن إذا نظرنا عن كثب قليلًا، فمن الواضح أنه بالنسبة لبعض سيناريوهات التطبيقات، فإن مجرد الحصول على عنوان IP جديد في كل مرة تتحرك فيها، وهو ما يفعله بروتوكول DHCP لك، لا يكفي دائمًا. لنفترض أنك تستخدم الحاسوب المحمول أو الهاتف الذكي لإجراء مكالمةٍ هاتفية عبر بروتوكول الإنترنت الصوتي، وتنتقل من نقطة اتصالٍ إلى أخرى أثناء التحدث على الهاتف، أو حتى التبديل من شبكة Wi-Fi إلى الشبكة الخلوية للاتصال بالإنترنت. من الواضح أنك تحتاج إلى الحصول على عنوان IP جديد عندما تنتقل من شبكة وصول إلى أخرى، وهو عنوانٌ متوافق مع الشبكة الجديدة. ولكن لا يعرف الحاسوب أو الهاتف الموجود في الطرف الآخر من محادثتك على الفور المكانَ الذي انتقلت إليه أو عنوان IP الجديد الخاص بك. وبالتالي سيستمر إرسال الرزم إلى العنوان الذي اعتدت أن تكون فيه في حالة عدم وجود آلية أخرى، وليس إلى مكان وجودك الآن. هذه المشكلة موضحة في الشكل الآتي، حيث تحتاج الرزم من عقدة التراسل المقابلة correspondent node إلى إيجاد طريقها إلى الشبكة الجديدة ثم الانتقال إلى العقدة المتنقلة، عندما تنتقل العقدة المتنقلة من شبكة 802.11 في القسم (أ) إلى الشبكة الخلوية في القسم (ب) من الشكل التالي: هناك العديد من الطرق المختلفة لمعالجة المشكلة الموضحة للتو، وسنلقي نظرةً على بعضٍ منها. بافتراض وجود طريقة ما لتمرير الرزم بحيث تصل إلى عنوانك الجديد بدلًا من عنوانك القديم، فإن المشاكل التالية الظاهرة على الفور تتعلق بالأمن. إذا كانت هناك آلية يمكنك من خلالها أن تقول، "عنوان IP الجديد الخاص بي هو X" على سبيل المثال، فكيف يمكنك منع بعض المهاجمين من إصدار مثل هذا البيان دون إذنك، وبالتالي تمكينهم إما من استلام الرزم الخاصة بك، أو تمرير رزمك إلى طرف ثالث غير مقصود؟ وبالتالي نرى أن الأمن security والتنقل mobility مرتبطان ارتباطًا وثيقًا. إحدى القضايا التي أبرزتها المناقشة أعلاه هي حقيقة أن عناوين IP تخدم مهمتين في الواقع، فهي تُستخدَم مثل معرّفٍ identifier لنقطة النهاية، كما تُستخدَم لتحديد locate موقع نقطة النهاية. فكّر في المعرّف على أنه اسم طويل العمر لنقطة النهاية، ومحدّد locator الموقع على أنه بعض المعلومات المؤقتة المحتملة حول كيفية توجيه الرزم إلى نقطة النهاية. طالما أن الأجهزة لا تتحرك، أو لا تتحرك كثيرًا، فإن استخدام عنوان واحد لكلتا الوظيفتين يبدو معقولًا جدًا. ولكن بمجرد أن تبدأ الأجهزة في التحرك، فإنك تفضل أن يكون لديك معرّف لا يتغير أثناء التنقل وهذا ما يسمى أحيانًا معرّف نقطة النهاية أو معرّف المضيف، مع محدّد موقعٍ منفصل. كانت فكرة فصل محددات المواقع عن المعرّفات موجودةً منذ وقت طويل، ومعظم أساليب التعامل مع التنقل الموصوفة أدناه توفر مثل هذا الفصل بشكلٍ ما. يُظهر الافتراض بأن عناوين IP لا تتغير في العديد من الأماكن المختلفة. حيث وضعت بروتوكولات النقل مثل بروتوكولات TCP افتراضاتٍ تاريخية حول بقاء عنوان IP ثابتًا طوال عمر الاتصال على سبيل المثال، لذلك يمكن أن يتمثل أحد الأساليب في إعادة تصميم بروتوكولات النقل بحيث يمكنها العمل مع تغيير عناوين نقطة النهاية. البديل الشائع لمحاولة تغيير بروتوكول TCP هو أن يعيد التطبيق إنشاء اتصال TCP دوريًا في حالة تغيير عنوان IP الخاص بالعميل. قد يبدو هذا غريبًا، ولكن هذا هو بالضبط ما يحدث إذا كان التطبيق قائمًا على بروتوكول HTTP (متصفح ويب مثل كرومChrome أو تطبيق تدفق مثل نتفلكس Netflix على سبيل المثال). تتمثل الإستراتيجية في أن يعمل التطبيق حول الحالات الممكن أن يكون فيها عنوان IP الخاص بالمستخدم قد تغير، بدلًا من محاولة الحفاظ على المظهر الذي لا يتغير. بينما نحن جميعًا على دراية بنقاط النهاية التي تتحرك، فإن الموجهات يمكنها أيضًا التحرك. هذا بالتأكيد أقل شيوعًا اليوم من تنقل نقط النهاية، ولكن هناك الكثير من البيئات التي قد يكون فيها الموجه المتنقل منطقيًا. أحد الأمثلة هو فريق الاستجابة للطوارئ الذي يحاول نشر شبكةٍ بعد أن تسببت بعض الكوارث الطبيعية في تدمير جميع البنية التحتية الثابتة. هناك افتراضات إضافية عندما تكون جميع العقد في الشبكة، وليس فقط نقاط النهاية، متنقلة، وهو موضوعٌ سيُناقش لاحقًا. توجد نقطتان للتوضيح قبل أن نبدأ في إلقاء نظرة على بعض الأساليب لدعم الأجهزة المتنقلة. من الشائع أن نجد الناس يخلطون بين الشبكات اللاسلكية والتنقل. فغالبًا ما يُعثَر على التنقل واللاسلكية معًا. لكن يتعلق الاتصال اللاسلكي حقًا بالحصول على البيانات من العقدة A إلى العقدة B بدون سلك، بينما يتعلق التنقل بالتعامل مع ما يحدث عندما تتحرك العقدة أثناء اتصالها. من المؤكد أن العديد من العقد التي تستخدم قنوات الاتصال اللاسلكي ليست متنقلة، وتستخدم العقد المتنقلة اتصالًا سلكيًا في بعض الأحيان (على الرغم من أن هذا أقل شيوعًا). أخيرًا، نحن مهتمون في الغالب بما يمكن أن نسميه التنقل في طبقة الشبكة. أي أننا مهتمون بكيفية التعامل مع العقد التي تنتقل من شبكةٍ إلى أخرى. يمكن التعامل مع الانتقال من نقطة وصول إلى أخرى في نفس شبكة 802.11 بآليات خاصة بمعيار 802.11، والشبكات الخلوية لديها أيضًا طرق للتعامل مع التنقل، ولكن نحتاج في الأنظمة غير المتجانسة الكبيرة مثل الإنترنت إلى دعم التنقل على نطاق أوسع عبر الشبكات. التوجيه إلى المضيفين المتنقلين باستخدام بروتوكول Mobile IP بروتوكول IP المتنقّل هو الآلية الأساسية في معمارية الإنترنت اليوم لمعالجة مشكلة توجيه الرزم إلى المضيفين المتنقلين. حيث يقدم بعض الإمكانيات الجديدة ولكنه لا يتطلب أي تغيير من المضيفين غير المتنقلين أو معظم الموجهات، مما يجعله قابلًا للانتشار بصورة متزايدة. من المفترض أن يكون للمضيف المتنقل عنوان IP دائم، يُسمى العنوان المحلي home address الخاص به، والذي يحتوي على بادئة شبكة تساوي تلك الخاصة بشبكته المحلية home network. هذا هو العنوان الذي سيستخدمه المضيفون الآخرون عندما يرسلون الرزم في البداية إلى المضيف المتنقل، نظرًا لأنه لا يتغير، ويمكن أن تستخدمه التطبيقات طويلة العمر أثناء تجوال المضيف. ويمكننا التفكير فيه كمعرّف المضيف طويل الأمد. يكتسب عادةً المضيف، عندما ينتقل إلى شبكةٍ خارجيةٍ foreign network جديدة بعيدة عن شبكته المحلية، عنوانًا جديدًا على تلك الشبكة باستخدام بعض الوسائل مثل بروتوكول DHCP. سيتغير هذا العنوان في كل مرة يتجول فيها المضيف إلى شبكة جديدة، لذلك يمكننا التفكير به على أنه أشبه بمحدّد موقع للمضيف، ولكن من المهم ملاحظة أن المضيف لا يفقد عنوانه المحلي الدائم عندما يكتسب عنوانًا جديدًا على الشبكة الخارجية. يُعَد هذا العنوان المحلي أمرًا بالغ الأهمية لقدرته على الحفاظ على الاتصالات أثناء تحرك المضيف. يتطلب دعم التنقل بعض الوظائف الجديدة في موجهٍ واحد على الأقل بينما تظل غالبية الموجّهات دون تغيير، ويُعرف هذا الموجه بالوكيل المحلي home agent للعقدة المتنقلة. ويقع هذا الموجه على الشبكة المحلية للمضيف المتنقل. يلزم أيضًا موجهٌ ثانٍ بوظيفة محسّنة في بعض الحالات، وهو الوكيل الخارجي foreign agent، ويقع هذا الموجه على شبكة تتصل بها العقدة المتنقلة عندما تكون بعيدةً عن شبكتها المحلية. سننظر أولاً في تشغيل بروتوكول Mobile IP عند استخدام وكيلٍ خارجي. يوضح الشكل التالي مثالاً لشبكة مع وكلاء محليين وخارجيين: يعلن كلٌّ من الوكلاء المحليين والخارجيين دوريًا عن وجودهم على الشبكات التي يرتبطون بها باستخدام رسائل إعلان الوكيل. قد يطلب مضيف متنقل أيضًا إعلانًا عند توصيله بشبكة جديدة. يمكّن إعلانُ الوكيل المحلي المضيفَ المتنقل من معرفة عنوان الوكيل المحلي قبل أن يغادر شبكته المحلية. يسمع المضيف المتنقل إعلانًا من وكيلٍ خارجي عندما يتصل بشبكةٍ خارجية ويسجِّل لدى الوكيل، مع توفير عنوان وكيله المحلي. يتصل الوكيل الخارجي بعد ذلك بالوكيل المحلي، ويزوده بعنوان الرعاية care-of address. عادة ما يكون هذا هو عنوان IP الخاص بالوكيل الخارجي. يمكننا أن نرى في هذه المرحلة أن أي مضيف يحاول إرسال رزمة إلى المضيف المتنقل سيرسلها بعنوان وجهة يساوي العنوان المحلي لتلك العقدة. سيؤدي تمرير IP العادي إلى وصول تلك الرزمة إلى الشبكة المحلية للعقدة المتنقلة التي يقع عليها الوكيل المحلي، وبالتالي يمكننا تقسيم مشكلة توصيل الرزمة إلى العقدة المتنقلة إلى ثلاثة أجزاء: كيف يعترض الوكيلُ المحلي رزمة مخصَّصة للعقدةِ المتنقلة؟ كيف يسلّم الوكيل المحلي بعد ذلك الرزمة إلى الوكيل الخارجي؟ كيف يسلّم الوكيل الخارجي الرزمة إلى العقدة المتنقلة؟ قد تبدو المشكلة الأولى سهلة إذا نظرت إلى الشكل السابق، حيث يكون الوكيل المحلي بوضوح هو المسار الوحيد بين المضيف المرسل والشبكة المحلية، وبالتالي يجب أن يتلقى الرزم الموجَّهة إلى العقدة المتنقلة. ولكن ماذا لو كانت عقدة الإرسال (المقابلة) على الشبكة 18، أو ماذا لو حاول موجهٌ آخر متصل بالشبكة 18 توصيلَ الرزمة دون مرورها عبر الوكيل المحلي؟ لمعالجة هذه المشكلة، ينتحل الوكيل المحلي فعليًا صفة العقدة المتنقلة، باستخدام تقنية تسمى proxy ARP. تعمل هذه التقنية تمامًا مثل بروتوكول تحليل العناوين Address Resolution Protocol أو اختصارًا ARP، باستثناء أن الوكيل المحلي يُدرج عنوان IP الخاص بالعقدة المتنقلة، بدلًا من عنوانه الخاص، في رسائل ARP، فيستخدم عنوان الجهاز الخاص به، بحيث تتعلم جميع العقد الموجودة على نفس الشبكة ربط عنوان الجهاز الخاص بالوكيل المحلي بعنوان IP الخاص بالعقدة المتنقلة. أحد الجوانب الدقيقة لهذه العملية هو حقيقة أن معلومات ARP يمكن تخزينها مؤقتًا في عقد أخرى على الشبكة. يصدر الوكيل المحلي رسالة ARP بمجرد تسجيل العقدة المتنقلة مع وكيلٍ خارجي، للتأكد من إبطال ذاكرات التخزين المؤقت هذه في الوقت المناسب. نظرًا لأن رسالة ARP ليست استجابة لطلب ARP عادي، فقد يطلق عليها اسم ARP مجاني gratuitous ARP. المشكلة الثانية هي تسليم الرزمة المُعترَضة إلى الوكيل الخارجي. هنا نستخدم تقنية الأنفاق الموضحة سابقًا. يلف الوكيل المحلي ببساطة الرزمة داخل ترويسة IP المخصصة للوكيل الخارجي وينقلها إلى الشبكة المتشابكة. ترى جميع الموجّهات المتداخلة فقط رزمة IP مخصصة لعنوان IP الخاص بالوكيل الخارجي. هناك طريقة أخرى للنظر إلى ذلك وهي أن نفق IP يُنشَأ بين الوكيل المحلي والوكيل الخارجي، ويسقط الوكيل المحلي الرزم المخصَّصة للعقدة المتنقلة في هذا النفق. يجرِّد الوكيل الخارجي ترويسة IP الإضافية للرزمة الواصلة إليه ويجد بالداخل رزمة IP المخصّصة لِعنوان العقدة المتنقلة المحلي. من الواضح أن الوكيل الخارجي لا يمكنه التعامل مع هذا مثل أية رزمة IP قديمة لأن هذا قد يتسبب في إعادته إلى الشبكة المحلية. فبدلًا من ذلك، يجب أن يتعرف على العنوان على أنه عنوان عقدة متنقلة مسجلة، ثم يسلّم الرزمة إلى عنوان الجهاز الخاص بالعقدة المتنقلة (عنوان Ethernet على سبيل المثال)، والذي يمكن التعرف عليه كجزء من عملية التسجيل registration. إحدى الملاحظات الممكن أخذها حول هذه الإجراءات هي أنه من الممكن أن يكون الوكيل الخارجي والعقدة المتنقلة في نفس الصندوق، أي يمكن للعقدة المتنقلة أداء وظيفة الوكيل الخارجي نفسها. لإنجاح هذا العمل، يجب أن تكون العقدة المتنقلة قادرة على الحصول ديناميكيًا على عنوان IP الموجود في حيز عناوين الشبكة الخارجية باستخدام DHCP مثلًا. سيُستخدَم بعد ذلك هذا العنوان كعنوان رعاية. سيكون لهذا العنوان رقم شبكة هو 12 في مثالنا. يملك هذا الأسلوب الميزة المرغوبة المتمثلة في السماح للعقد المتنقلة بالاتصال بالشبكات التي ليس لديها وكلاء خارجيين، وبالتالي يمكن تحقيق التنقل من خلال إضافة وكيل محلي وبعض البرامج الجديدة فقط على العقدة المتنقلة (بافتراض استخدام DHCP على الشبكة الخارجية). ماذا عن حركة المرور في الاتجاه الآخر (من العقدة المتنقلة إلى العقدة الثابتة على سبيل المثال)؟ تبين أن هذا أسهل بكثير. تضع العقدة المتنقلة فقط عنوان IP الخاص بالعقدة الثابتة في حقل الوجهة لرزم IP الخاصة بها بينما تضع عنوانها الدائم في حقل المصدر، وتُمرر الرزم إلى العقدة الثابتة باستخدام الوسائل العادية. إذا كانت كلتا العقدتين في المحادثة متحركتين، فستُستخدَم الإجراءات الموضحة أعلاه في كل اتجاه. تحسين المسار في بروتوكول Mobile IP هناك عيب كبير في النهج السابق: يمكن أن يكون المسار من عقدة التراسل المقابلة إلى العقدة المتنقلة دون المستوى الأمثل على نحوٍ ملحوظ. أحد الأمثلة هو عندما تكون العقدة المتنقلة والعقدة المقابلة على نفس الشبكة، لكن الشبكة المحلية للعقدة المتنقلة تقع على الجانب الآخر من الإنترنت. تعالج العقدة المقابلة المرسِلة جميع الرزم إلى الشبكة المحلية، أي تجتاز الرزم الإنترنت للوصول إلى الوكيل المحلي، الذي ينقلها بعد ذلك عبر الإنترنت للوصول إلى الوكيل الخارجي. من الواضح أنه سيكون من الجيد أن تكتشف عقدة التراسل المقابلة أن العقدة المتنقلة موجودة بالفعل على نفس الشبكة وتسلّم الرزمة مباشرة. يتمثل الهدف في الحالة الأعم في توصيل الرزم مباشرةً قدر الإمكان من العقدة المرسلة المقابلة إلى العقدة المتنقلة دون المرور عبر وكيلٍ محلي. يشار إلى هذا أحيانًا بمشكلة توجيه المثلث triangle routing problem نظرًا لأن المسار من عقدة التراسل المقابلة إلى العقدة المتنقلة عبر الوكيل المحلي يأخذ جانبين من المثلث، بدلًا من الجانب الثالث وهو المسار المباشر. الفكرة الأساسية وراء حل توجيه المثلث هي السماح للعقدة المقابلة بمعرفة عنوان الرعاية للعقدة المتنقلة. يمكن للعقدة المقابلة بعد ذلك إنشاء نفقٍ خاص بها للوكيل الخارجي. يحدث التعامل مع هذا على أنه تحسين للعملية الموضحة للتو. إذا جُهِّز المرسل بالبرمجيات اللازمة لتعلم عنوان الرعاية مع إنشاء نفقٍ خاص به، فيمكن حينئذٍ تحسين المسار. إذا لم يكن الأمر كذلك، فإن الرزم تتبع المسار دون المستوى الأمثل. إذا رأى وكيلٌ محلي رزمةً مخصصة لإحدى العقد المتنقلة التي يدعمها، يمكنه استنتاج أن المرسل لا يستخدم المسار الأمثل. لذلك فإنه يرسل رسالة "تحديث ربط" binding update إلى المصدر، بالإضافة إلى تمرير رزمة البيانات إلى الوكيل الخارجي. يستخدم المصدر، إذا كان قادرًا، هذا التحديث الملزم لإنشاء مدخلةٍ في ذاكرة الربط المخبئية binding cache، والتي تتكون من قائمة الروابط بين عناوين العقدة المتنقلة وعناوين الحماية. في المرة التالية التي يحتوي فيها هذا المصدر على رزمة بيانات لإرسالها إلى تلك العقدة المتنقلة، سيجد الرابط في الذاكرة المخبئية ويمكنه نقل الرزمة مباشرةً إلى الوكيل الخارجي عبر نفق. هناك مشكلة واضحة في هذا المخطط، وهي أن الذاكرة المخبئية الملزمة قد تصبح قديمة إذا انتقل المضيف المتنقل إلى شبكةٍ جديدة. إذا اُستخدِمت مدخلةُ مخبئية قديمة، فسيتلقى الوكيلُ الخارجي الرزم المرسَلة عبر نفقٍ لعقدة متنقلة لم تعد مُسجَّلة على شبكتها. في هذه الحالة، يرسل الوكيل الخارجي رسالة تحذير بالربط إلى المرسل لإخباره بالتوقف عن استخدام مدخلة الذاكرة المخبئية. يعمل هذا المخطط فقط في الحالة التي لا يكون فيها الوكيل الخارجي هو العقدة المتنقلة نفسها. لذلك يجب حذف مدخلات الذاكرة المخبئية بعد فترة زمنية معينة، وتُحدد هذه المدة في رسالة تحديث الرابط. يوفر التوجيهُ المتنقل بعضَ التحديات الأمنية المثيرة للاهتمام، والتي أصبحت أوضح الآن بعد أن رأينا كيف يعمل بروتوكول Mobile IP. يمكن للمهاجم الذي يرغب في اعتراض الرزم الموجهة إلى عقدة أخرى في الشبكة المتشابكة على سبيل المثال الاتصالَ بالوكيل المحلي لتلك العقدة والإعلان عن نفسه كوكيلٍ خارجي جديدٍ للعقدة، وبالتالي من الواضح أن بعض آليات المصادقة مطلوبة. التنقل في بروتوكول IPv6 هناك عدد قليل من الاختلافات المهمة بين دعم التنقل في IPv4 و IPv6. والأهم من ذلك، أنه كان من الممكن بناء دعم التنقل في معايير IPv6 إلى حدٍ كبير منذ البداية، وبالتالي التخفيف من عددٍ من مشاكل النشر الإضافية. (قد يكون من الأصح القول أن IPv6 هو مشكلة نشر تزايدي كبيرة، والتي بمجرد حلها ستوفر دعمًا للتنقل كجزء من سلسلة إجراءات). بما أن جميع المضيفين الذين لديهم إمكانية IPv6 يمكنهم الحصول على عنوان لحظة توصيلهم بشبكةٍ خارجية (باستخدام العديد من الآليات المحددة مثل جزء من مواصفات الإصدار السادس v6 الأساسية)، فإن Mobile IPv6 يلغي الوكيل الخارجي ويتضمن القدرات اللازمة للعمل كوكيلٍ خارجي في كل مضيف. أحد الجوانب الأخرى المثيرة للاهتمام في IPv6 الذي يُشغَّل مع Mobile IP هو تضمينه لمجموعة مرنة من الترويسات المتوسعة. يُستخدَم هذا في سيناريو التوجيه الأمثل الموضح أعلاه. يمكن لعقدة IPv6 إرسال رزمة IP إلى عنوان الرعاية مع العنوان المحلي المضمَّن في ترويسة التوجيه بدلًا من تمرير رزمة عبر نفق إلى العقدة المتنقلة في عنوان العناية الخاص بها. تتجاهل جميع العقد الوسيطة هذه الترويسة، ولكنها تُمكّن العقدة المتنقلة من التعامل مع الرزمة كما لو أُرسِلت إلى العنوان المحلي، وبالتالي تمكينها من مواصلة تقديم بروتوكولات الطبقة العليا مع الوهم بأن عنوان IP الخاص بها ثابت. يُعد استخدام ترويسة التوسع بدلًا من نفقٍ أكثر كفاءة من منظور استهلاك حيز النطاق التراسلي ومعالجته. أخيرًا، نلاحظ أن العديد من المشكلات المفتوحة لا تزال قائمة في الشبكات المتنقلة. تزداد أهمية إدارة استهلاك الطاقة للأجهزة المتنقلة، بحيث يمكن بناء أجهزة أصغر ذات طاقة بطارية محدودة. هناك أيضًا مشكلة الشبكات المتنقلة المخصصة، أي تمكين مجموعة من العقد المتنقلة من تشكيل شبكة في غياب أي عقدٍ ثابتة، والتي تواجه بعض التحديات الخاصة. فئةٌ صعبة خاصة من الشبكات المتنقلة هي شبكات المستشعرات sensor networks. عادةً ما تكون المستشعرات صغيرة وغير مكلفة وغالبًا ما تعمل على البطارية، مما يعني أنه يجب أيضًا مراعاة مشكلات انخفاض استهلاك الطاقة وقدرة المعالجة المحدودة. وبما أن الاتصالات اللاسلكية والتنقل يسيران جنبًا إلى جنب، ستستمر التطورات المستمرة في التقنيات اللاسلكية في إنتاج تحديات وفرص جديدة للشبكات المتنقلة. التهام السحابة للإنترنت السحابة والإنترنت أنظمة تكافلية. لقد كانا مختلفين تاريخيًا، لكن الخط الفاصل بينهما أصبح غامضًا بشكل متزايد اليوم. يوفّر الإنترنت اتصالًا شاملًا بين أي مضيفين (حاسوب محمول للعميل وجهاز خادم بعيد على سبيل المثال)، وتدعم السحابة عدة مراكز بيانات بحجم المستودع، يوفر كلٌّ منها تكلفةً فعالة لتبريد وتشغيل عددٍ كبير من أجهزة الخادم. يتصل المستخدمون النهائيون بأقرب مركز بيانات عبر الإنترنت بنفس الطريقة التي يتصلون بها بخادم في غرفة آلةٍ بعيدة. هذا وصف دقيق للعلاقة بين الإنترنت والسحابة في الأيام الأولى لمزودي خدمات السحابة التجارية، مثل: Amazon، وMicrosoft، وGoogle. كان لسحابة Amazon مثلًا في عام 2009 مركزان للبيانات، أحدهما على الساحل الشرقي للولايات المتحدة والآخر على الساحل الغربي. يشغّل كل من مزودي الخدمات السحابية الرئيسيين عشرات من مراكز البيانات المنتشرة في جميع أنحاء العالم اليوم، ولا ينبغي أن يكون مفاجئًا أنهم يقعون في موقع استراتيجي بالقرب من نقاط تبادل الإنترنت Internet Exchange Points أو اختصارًا IXP، والتي توفر كل واحدة منها اتصالًا غنيًا ببقية الإنترنت. يوجد أكثر من 150 نقطة IXP في جميع أنحاء العالم، وعلى الرغم من عدم قيام كل مزود خدمة سحابية بتكرار مركز بيانات كامل بالقرب من كل واحد (العديد من هذه المواقع عبارة عن مرافق مشتركة في الموقع)، فمن العدل أن نقول إنه من المحتمل أن يُوزَّع المحتوى السحابي الأكثر استخدامًا (أفلام نتفليكس Netflix، مثلًا، الأكثر شهرة ومقاطع فيديو يوتيوب YouTube وصور فيسبوك Facebook على العديد من المواقع. هناك نتيجتان لهذا التشتت الواسع للسحابة. الأول هو أن المسار من طرف إلى طرف من عميل إلى خادم لا يمر بالضرورة عبر الإنترنت بالكامل. من المحتمل أن يجد المستخدم المحتوى الذي يريد الوصول إليه قد نُسِخ في نقطة اتصالٍ قريبة، والتي عادة ما تكون مجرد قفزة نظام AS واحدة بدلًا من أن تكون في الجانب البعيد من الكرة الأرضية. النتيجة الثانية هي أن مزودي الخدمات السحابية الرئيسيين لا يستخدمون الإنترنت العام لربط مراكز البيانات الموزعة الخاصة بهم. من الشائع لمزودي الخدمات السحابية الحفاظ على المحتوى الخاص بهم متزامنًا عبر مراكز البيانات الموزعة، لكنهم يفعلون ذلك عادةً عبر شبكة رئيسية backbone خاصة. هذا يسمح لهم بالاستفادة من أي تحسينات يريدونها دون الحاجة إلى التفاعل الكامل مع أي شخص آخر. يتيح بروتوكول BGP إمكانية توصيل أي زوجٍ من المضيفين، ويتفاعل معظم المستخدمين عمليًا مع التطبيقات التي تعمل في السحابة، والتي تبدو أشبه بالشكل التالي. (أحد التفاصيل المهمة التي لا ينقلها الشكل هي أن مزودي الخدمات السحابية لا يقومون عادةً ببناء شبكة WAN من خلال وضع الألياف الخاصة بهم، ولكنهم بدلًا من ذلك يستأجرون الألياف من مزودي الخدمة، مما يعني أن الشبكة الرئيسية للسحابة الخاصة والشبكة الرئيسية لمزود الخدمة غالبًا ما تشتركان في نفس البنية التحتية المادية). لاحظ أنه على الرغم من إمكانية نسخ المحتوى عبر العديد من مواقع السحابة، إلا أننا لا نمتلك التقنية اللازمة لنسخ الأشخاص حتى الآن. هذا يعني أنه عندما يرغب المستخدمون المنتشرون على نطاق واسع في التحدث مع بعضهم البعض، كجزء من مكالمة جماعية عبر الفيديو على سبيل المثال، فإن شجرة البث المتعدد تُوزَّع عبر السحابة. لا يُشغَّل البث المتعدد عادةً في الموجهات الخاصة بالشبكة الرئيسية لمزود الخدمة، ولكنه يعمل بدلًا من ذلك في عمليات الخادم الموزَّعة عبر مجموعةٍ فرعية من أكثر من 150 موقعًا تعمل كنقاط اتصال الإنترنت الرئيسية. تسمى شجرة البث المتعدد المُنشأَة بهذه الطريقة باسم التراكب overlay. ترجمة -وبتصرّف- للقسم Routing Among Mobile Devices من فصل Advanced Internetworking من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا المقال السابق: تقنية تبديل التسمية متعددة البروتوكولات MPLS في الشبكات الحاسوبية توجيه Routing الرزم ضمن الشبكات الحاسوبية تطبيق مبدلات وموجهات الشبكات الحاسوبية برمجيا وعتاديا
×
×
  • أضف...