-
المساهمات
189 -
تاريخ الانضمام
-
تاريخ آخر زيارة
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Ola Abbas
-
سنوضّح من خلال هذا المقال كيفية إنشاء دواليب هوائية ملوّنة في برنامج الإليستريتور Adobe Illustrator، حيث سنتعلم أولًا كيفية إنشاء المروحة الأولى باستخدام الأدوات الأساسية وتأثير Feather، ثم ننتقل إلى إنشاء المراوح الأخرى باستخدام تأثيرات التحويل Transform مع تقنيات بناء الأشكال المتجهة vector، وسنستخدم مجموعة ألوان جديدة لإعادة تلوين المراوح الجديدة. نكرّر بعد ذلك الخطوات نفسها لإنشاء الدولابين الإضافيين، ثم سنتعلم كيفية إنشاء خلفية مناسبة. إنشاء مستند جديد شغّل برنامج الإليستريتور Illustrator، ثم اضغط على الاختصار Ctrl + N لإنشاء مستند جديد. حدّد خيار البكسلات Pixels من قائمة الوحدات Units، وأدخِل القيمة 940 في خانة العرض width، والقيمة 700 في خانة الارتفاع height، ثم انقر على خيارات متقدمة Advanced. حدّد نمط الألوان RGB والخيار Screen (72ppi)، وتأكّد من إلغاء تحديد مربع اختيار محاذاة الكائنات الجديدة إلى شبكة البكسلات Align New Objects to Pixel Grid قبل النقر على موافق OK. إنشاء الدولاب الهوائي الأول استخدم أداة المستطيل Rectangle Tool (باستخدام الاختصار M) لإنشاء مستطيل أبعاده 233×94 بكسل، ثم استخدم أداة القلم Pen Tool (باستخدام الاختصار P) لإنشاء الكائن الأسود الموضّح في الشكل الثاني أدناه. استخدم أداة التحديد المباشر Direct Selection Tool (باستخدام الاختصار A) مع مفتاح Shift، وذلك من أجل تحديد نقاط ارتكاز الكائن الأسود الثلاث العلوية، ثم انقر على أيقونة تحويل نقطة الارتكاز المحدَّدة إلى سلِسة Convert selected anchor point to smooth من شريط خصائص Properties. اختر أداة التحديد المباشر (A) واضبط مقابض نقاط الارتكاز الثلاث العلوية كما هو موضّح أدناه. اختر أداة تحويل نقاط الارتكاز Convert Anchor Point Tool باستخدام الاختصار Shift + C، وانقر على نقطة ارتكاز الكائن الأسود السفلية اليسرى، ثم اضغط على الفأرة واسحبها للأسفل، ثم حدّد المقبض السفلي لنقطة الارتكاز السفلية اليسرى واسحبه إلى اليمين. أعِد تحديد المستطيل الذي أنشأناه في الخطوة رقم 2، وأزِله بعد الانتهاء من ضبط شكل الكائن الأسود. حدّد الكائن الأسود الذي أنشأناه في الخطوة رقم 3، وأنشئ نسخةً منه (بالضغط على الاختصار Ctrl + C ثم Ctrl + F)، ثم استبدل لون حدّ هذه النسخة الحالي باللون الأحمر. اختر الآن أداة إضافة نقطة ارتكاز Add Anchor Point (+)، وانقر على النقطة المميزة باللون الأزرق لإضافة نقطة ارتكاز جديدة، ثم استخدم أداة التحديد المباشر (A) مع مفتاح Shift لتحديد نقطتي الارتكاز المميزتين باللون الأسود وأزِلهما. حدّد الآن نقطة ارتكاز الكائن الأحمر السفلية، ثم حرّكها بمقدار 10 بكسلات للأسفل و2 بكسل إلى اليسار. اختر أداة التحديد المباشر (A)، واضبط مقابض نقطة الارتكاز السفلية كما هو موضّح أدناه، ثم اختر أداة تحويل نقاط الارتكاز Convert Anchor Point Tool باستخدام الاختصار Shift + C، وحدّد المقبض الأيمن لنقطة الارتكاز اليمنى، واسحبه إلى اليسار. حدّد الكائن الأسود وأزِل حدّه، ثم املأه بالتدرج اللوني الخطي الموضّح في الشكل الأول أدناه، ثم أنشئ نسخةً منه بالضغط على Ctrl + C ثم Ctrl + F، ثم استبدل لون تعبئة النسخة الحالي بتدرج لوني خطي جديد. حدّد الشكل الناتج وانتقل إلى قائمة تأثير Effect، ثم Stylize، ثم Feather، وأدخِل نصف قطر Radius مقداره 4 بكسلات، ثم انقر على موافق. حدّد الكائن الأحمر وأزِل حدّه، ثم املأه بالتدرج اللوني الخطي الموضّح أدناه، ثم أنشئ نسخة منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم استبدل لون تعبئة هذه النسخة الحالي بتدرج لوني خطي جديد. حدّد الشكل الناتج، ثم طبّق عليه تأثير Feather بمقدار 8 بكسلات. حدّد ثم جمّع (Ctrl + G) جميع الكائنات التي أنشأناها من بداية الخطوة رقم 2 حتى الآن. أبقِ هذه المجموعة محدَّدة، واختر أداة التدوير Rotate Tool (باستخدام الاختصار R)، ثم استمر في الضغط على مفتاح Alt، وانقر على النقطة السفلية اليسرى من المجموعة، ثم أدخِل زاويةً مقدارها 90 درجة، وانقر على نسخ Copy، ثم اضغط على الاختصار Ctrl + D مرتين للحصول على النتائج الموضّحة أدناه. حدّد المروحة العلوية اليمنى، وحرّكها بمقدار 20 بكسلًا للأسفل و10 بكسلات إلى اليسار، ثم حدّد المروحة العلوية اليسرى وحرّكها بمقدار 10 بكسلات للأسفل و20 بكسلًا إلى اليمين. حدّد الآن المروحة السفلية اليسرى، ثم حرّكها بمقدار 20 بكسلًا للأعلى و10 بكسلات إلى اليمين، ثم حدّد المروحة السفلية اليمنى وحرّكها بمقدار 10 بكسلات للأعلى و20 بكسلًا إلى اليسار. حدّد المروحة العلوية اليمنى واجلبها إلى الأمام (Ctrl + Shift + Right Square)، ثم أعِد تحديد المراوح الأربع، واضغط على الاختصار Ctrl + Shift + G لفك تجميعها، بعد ذلك حدّد الأشكال الثمانية الكبيرة الخاصة بالمراوح، وأرسِلها للخلف (Ctrl + Shift + Left Square Bracket). ركّز الآن على المروحة العلوية اليسرى، وحدّد الشكل الأكبر الذي طبّقنا عليه تأثير Feather، ثم اضغط على الاختصار Ctrl +3 لإخفائه. بعد ذلك حدّد الشكل الأكبر الآخر الخاص بهذه المروحة واستبدل لون التعبئة الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه. اضغط على الاختصار Ctrl + Alt +3 لإظهار الشكل الذي أخفيناه في الخطوة الحالي، ثم استبدل لون تعبئة هذا الشكل الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه. حدّد الشكل الأصغر الذي طبّقنا عليه تأثير Feather في المروحة العلوية اليسرى، ثم اضغط على الاختصار Ctrl +3 لإخفائه، بعد ذلك حدّد الشكل الأصغر المتبقي الخاص بهذه المروحة، واستبدل لون التعبئة الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه. اضغط على الاختصار Ctrl + Alt +3 لإظهار الشكل الذي أخفيناه في الخطوة الحالية، ثم استبدل لون تعبئة هذا الشكل الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه. ركّز الآن على المروحة السفلية اليسرى، وحدّد الشكل الأكبر الذي طبّقنا عليه تطبيق Feather، واضغط على الاختصار Ctrl +3 لإخفائه. بعد ذلك حدّد الشكل الأكبر المتبقي الخاص بهذه المروحة، واستبدل لون التعبئة الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه. اضغط على الاختصار Ctrl + Alt +3 لإظهار الشكل الذي أخفيناه في الخطوة الحالية، ثم استبدل لون تعبئة هذا الشكل الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه. حدّد الآن الشكل الأصغر الذي طبّقنا عليه تأثير Feather الخاص بهذه المروحة واخفيه، ثم حدّد الشكل الأصغر المتبقي، مع استبدال لون التعبئة الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه. اضغط على الاختصار Ctrl + Alt +3 لإظهار الشكل الذي أخفيناه في الخطوة الحالية، ثم استبدل لون تعبئة هذا الشكل الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه. اتبع تسلسل الصور التالية، وكرّر الخطوات السابقة نفسها لاستبدال ألوان الأشكال الرئيسية المستخدمة في المروحة السفلية اليمنى. يجب أن يبدو الدولاب الهوائي الآن كما في الشكل التالي: حدّد جميع الكائنات التي أنشأناها من بداية الخطوة رقم 2 حتى الآن، وانقر نقرًا مزدوجًا على أيقونة أداة التدوير Rotate Tool من شريط الأدوات، ثم أدخِل زاويةً مقدارها 33 درجة، وانقر على موافق. حدّد الآن الأشكال الأربعة الأصغر التي طبّقنا عليها تأثير Feather الخاصة بالمراوح، وأنشئ نسخةً منها بالضغط على Ctrl + C ثم Ctrl + F. أبقِ هذه النسخ محدَّدةً ثم افتح لوحة مستكشف المسار Pathfinder من قائمة Window ثم Pathfinder، وانقر على زر دمج Unite. حدّد الشكل الذي أنشأناه في الخطوة رقم 15، واضغط على الاختصار Ctrl +3 لإخفائه. ركّز الآن على المروحة الزرقاء وحدّد الشكل الأصغر الذي طبّقنا عليه تأثير Feather، وأنشئ نسخةً منه بالضغط على Ctrl + C ثم Ctrl + F. حدّد هذه النسخة وافتح لوحة Appearance (من قائمة Window ثم Appearance)، ثم أزِل تأثير Feather. حدّد الشكل الناتج وانتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، واتبع البيانات الموضّحة أدناه وانقر على موافق. اضغط الآن على الاختصار Ctrl + Alt +3 لإظهار الشكل الذي أخفيناه في الخطوة الحالية، وأنشئ نسخةً منه بالضغط على Ctrl + C ثم Ctrl + F، ثم اخفِ هذه النسخة. أعِد تحديد الشكل الأصلي والشكل الذي طبّقنا عليه تأثير الظل Shadow في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم، ثم حدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة، ثم اخفِ مجموعة القطع خلف الشكلين الصغيرين الخاصين بالمروحة الزرقاء. ركّز الآن على المروحة الخضراء، وحدّد الشكل الأصغر الذي طبّقنا عليه تأثير Feather، وأنشئ نسخةً منه، وذلك بالضغط على Ctrl + C ثم Ctrl + F. حدّد هذه النسخة وافتح لوحة Appearance من قائمة Window ثم Appearance، ثم أزِل تأثير Feather. حدّد الشكل الناتج وانتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، واتبع البيانات الموضّحة أدناه، وانقر على موافق. اضغط على الاختصار Ctrl + Alt +3 لإظهار الشكل الذي أخفيناه في الخطوة رقم 16، ثم أنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم اخفِ هذه النسخة. أعِد تحديد الشكل الأصلي والشكل الذي طبّقنا عليه تأثير الظل Shadow في الخطوة الحالية، ثم انقر بزر الفأرة الأيمن على لوحة الرسم، ثم حدد خيار إنشاء قناع قطع Make Clipping Mask من القائمة، بعد ذلك اخفِ مجموعة القطع خلف الشكلين الصغيرين الخاصين بالمروحة الخضراء. ركّز الآن على المروحة الصفراء وحدّد الشكل الأصغر الذي طبّقنا عليه تأثير Feather وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم حدّد هذه النسخة وأزِل تأثير Feather. حدّد الشكل الناتج وانتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، واتبع البيانات الموضّحة أدناه وانقر على موافق. اضغط على الاختصار Ctrl + Alt +3 لإظهار الشكل الذي أخفيناه في الخطوة رقم 17، ثم حدّد هذا الشكل، واستمر في الضغط على مفتاح Shift مع النقر على الشكل الذي طبّقنا عليه تأثير الظل Shadow في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم، ثم حدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة، ثم اخفِ مجموعة القطع خلف الشكلين الصغيرين الخاصين بالمروحة الصفراء. يجب أن يبدو الدولاب الهوائي الآن مثل الشكل التالي: ركّز الآن على المروحة الزرقاء، وحدّد الشكل الأكبر الذي طبّقنا عليه تأثير Feather وأنشئ نسخةً منه بالضغط على Ctrl + C ثم Ctrl + F، ثم أحضِر هذه النسخة إلى الأمام (Ctrl + Shift + Right Square Bracket). أبقِ هذه النسخة محددةً ثم افتح لوحة Appearance (من قائمة Window ثم Appearance)، وأزِل تأثير Feather. حدّد الشكل الناتج وأزِل لون تعبئته، ثم أضِف حدًا أحمر بمقدار 2 بكسل. اختر أداة إضافة نقاط ارتكاز Add Anchor Point (+)، وانقر على النقطتين المميزتين باللون الأزرق لإضافة نقطتي ارتكاز جديدتين، ثم حدّد نقطتي الارتكاز المميزتين باللون الأسود وأزِلهما. اختر الآن أداة تحويل نقاط الارتكاز Convert Anchor Point Tool (باستخدام الاختصار Shift + C)، وحدّد المقبض الأيمن لنقطة الارتكاز العلوية اليمنى واسحبه للأسفل، ثم حدّد المقبض الأيمن لنقطة الارتكاز السفلية اليمنى واسحبه للأعلى. أعِد تحديد الكائن الأحمر الذي أنشأناه في الخطوة رقم 20، ثم أزِل حدّه واملأه باللون الأزرق (# 1a28b3). حدّد الشكل الناتج وانتقل إلى قائمة تأثير Effect، ثم Blur، ثم Gaussian Blur، وأدخِل نصف قطر مقداره 10 بكسلات، ثم انقر على موافق. حدّد الآن الشكل الأكبر الذي طبّقنا عليه تأثير Feather في المروحة الزرقاء، وأنشئ نسخةً منه بالضغط على Ctrl + C ثم Ctrl + F، ثم أحضِر هذه النسخة إلى الأمام من خلال الاختصار Ctrl + Shift + Right Square Bracket. حدّد هذه النسخة واستمر في الضغط على مفتاح Shift، ثم انقر على الشكل الذي طبّقنا عليه تأثير الضبابية Blur في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم، ثم حدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة، ثم اخفِ مجموعة القطع خلف الشكلين الصغيرين في المروحة الزرقاء. كرّر الخطوات السابقة نفسها لإنشاء الكائن الأسود الموضّح أدناه. أعِد تحديد هذا الشكل بعد إنشائه، ثم أزِل حدّه واملأه باللون البرتقالي (# e6480b)، ثم طبّق عليه تأثير Gaussian Blur بمقدار 10 بكسلات. حدد الآن الشكل الأكبر الذي طبّقنا عليه تأثير Feather في المروحة البرتقالية، وأنشئ نسخةً منه بالضغط على Ctrl + C ثم Ctrl + F، ثم أحضِر هذه النسخة إلى الأمام (Ctrl + Shift + Right Square Bracket). حدّد هذه النسخة واستمر في الضغط على مفتاح Shift، ثم انقر على الشكل الذي طبّقنا عليه تأثير الضبابية Blur في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم، ثم حدّد خيار إنشاء قناع القطع Make Clipping Mask من القائمة، ثم اخفِ مجموعة القطع خلف الشكلين الصغيرين في المروحة البرتقالية. اتبع تسلسل الصور التالية، وكرّر الخطوات السابقة نفسها لإضافة ظلال إلى المروحتين المتبقيتين: لننتقل الآن إلى المروحة الصفراء. يجب أن يبدو الدولاب الهوائي الآن كما في الشكل التالي: استخدم أداة القلم (P) لإنشاء مسارين منحنيين كما هو موضّح أدناه، وأعِد تحديد هذين المسارين بعد رسمهما، وغيّر ثُخن الحدّ إلى 3 بكسلات، مع استبدال لون الحدّ الحالي باللون البرتقالي الداكن (# a53009). حدّد المسارين الناتجين، وطبّق عليهما الخيار Width Profile 5، ثم أعِد تحديد المسار السفلي، واستبدل لون الحدّ الحالي باللون الأخضر (# 2c972a). حدّد الآن المسارين اللذين أنشأناهما في الخطوة ،وطبّق عليهما تأثير Gaussian Blur بمقدار 3 بكسلات، ثم اضبط نمط المزج Blending Mode على الخيار Multiply، وقلل التعتيم Opacity إلى 40%. أخيرًا، اخفِ هذين المسارين خلف الأشكال الصغيرة في المراوح. استخدم أداة الدائرة Ellipse Tool (باستخدام الاختصار L) لإنشاء دائرة أبعادها 22×22 بكسل، ثم ضعها في الموضع الموضّح أدناه. حدّد هذه الدائرة، ثم أزِل حدّها، واملأها بالتدرج اللوني الشعاعي radial gradient الموضّح أدناه. حدّد الدائرة الناتجة وانتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، واتبع البيانات الموضّحة أدناه وانقر على موافق. يجب أن يبدو الدولاب الهوائي الآن كما يلي: إنشاء الدولاب الهوائي الثاني حدّد جميع كائنات الدولاب الهوائي السابق وانتقل إلى قائمة كائن Object، ثم Transform، ثم Transform Each، واتبع البيانات الموضّحة أدناه وانقر على نسخ Copy، ثم انقل المروحة الجديدة إلى موضعٍ آخر. حدّد الأشكال الأربعة الكبيرة التي طبّقنا عليها تأثير Feather في المراوح الأربعة، واضغط على الاختصار Ctrl +2 لقفلها، ثم حدّد الأشكال الأربعة الكبيرة المتبقية، واجلبها إلى الأمام (Ctrl + Shift + Right Square Bracket). أعِد تحديد الشكل الأزرق، واستبدل لون التعبئة الحالي بتدرج لوني خطي جديد كما هو موضّح في الشكل الثاني أدناه، ثم غيّر ألوان التعبئة الحالية للأشكال الثلاثة المتبقية كما هو موضّح في الشكل الثالث أدناه. أخيرًا، حدّد الأشكال الأربعة التي غيّرت ألوانها وأرسلها للخلف باستخدام اختصار Ctrl + Shift + Left Square Bracket. اضغط على الاختصار Ctrl + Alt +2 لفتح الأشكال الأربعة التي قفلناها في الخطوة رقم 30، ثم بدّل ألوان تعبئة هذه الأشكال الحالية كما هو موضّح أدناه. حدّد الشكل الأزرق الذي طبّقنا عليه تأثير Feather واضغط على الاختصار Ctrl +3 لإخفائه، ثم حدّد الشكل الأزرق الآخر واستبدل لون التعبئة الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه، ثم اضغط على الاختصار Ctrl + Alt +3 لإظهار الشكل الذي أخفيناه في الخطوة الحالية. حدّد الشكل الأخضر الصغير الذي طبّقنا عليه تأثير Feather، واضغط على الاختصار Ctrl +3 لإخفائه، ثم حدّد الشكل الأخضر الصغير الآخر واستبدل لون التعبئة الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه، ثم اضغط على الاختصار Ctrl + Alt +3 لإظهار الشكل الذي أخفيناه في الخطوة الحالية. حدّد الشكلين البرتقالي والأصفر المُطبَّق عليهما تأثير Feather، واضغط على الاختصار Ctrl +3 لإخفائهما، ثم حدّد الأشكال البرتقالية والصفراء الأخرى، واستبدل ألوان التعبئة الحالية بتدرج لوني خطي جديد كما هو موضّح أدناه، ثم اضغط على الاختصار Ctrl + Alt +3 لإظهار الأشكال التي أخفيناها في الخطوة الحالية. حدّد الأشكال الأربعة الصغيرة المُطبَّق عليها تأثير Feather، ثم استبدل ألوان التعبئة الحالية بتدرج لوني خطي جديد كما هو موضّح أدناه. اختر أداة التحديد المباشر (A)، وانقر على النقطة المميزة باللون الأحمر، مما سيؤدي إلى تحديد الشكل المُطبَّق عليه تأثير الظل Shadow في المروحة العلوية، ثم استبدل لون تعبئة الشكل المُحدَّد الحالي باللون الأخضر الداكن (# 194f00). ركّز على الشكل الثاني أدناه، وكرّر الخطوات نفسها على المراوح الثلاثة المتبقية. أخيرًا، حدّد الدائرة ذات اللون البرتقالي الداكن، واستبدل لون التعبئة الحالي بتدرج لوني شعاعي جديد كما هو موضّح أدناه. يجب أن يبدو الدولاب الهوائي الثاني مثل الشكل التالي: إنشاء الدولاب الهوائي الثالث حدّد جميع كائنات الدولاب الهوائي السابق وانتقل إلى قائمة كائن Object ثم Transform ثم Transform Each، واتبع البيانات الموضّحة أدناه وانقر على نسخ Copy، ثم انقل الدولاب الهوائي الجديد إلى موضعٍ آخر. حدّد الأشكال الأربعة الخضراء الكبيرة المُطبَّق عليها تأثير Feather الخاصة بالمراوح، واضغط على الاختصار Ctrl +2 لقفلها، ثم حدّد الأشكال الأربعة الخضراء الكبيرة المتبقية، واجلبها إلى الأمام باستخدام الاختصار Ctrl + Shift + Right Square Bracket. حدّد هذه الأشكال الأربعة واستبدل لون التعبئة الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه، ثم أعِد تحديد الأشكال الأربعة التي بدّلت ألوانها وأرسلها للخلف (Ctrl + Shift + Left Square Bracket)، ثم اضغط على الاختصار Ctrl + Alt +2 لفك قفل الأشكال الخضراء الأربعة التي قفلناها في الخطوة الحالية، ثم استبدل لون التعبئة الحالي لهذه الأشكال الخضراء الأربعة بتدرج لوني خطي جديد كما هو موضّح أدناه. حدّد الشكل الأصفر المُطبَّق عليه تأثير Feather في المروحة العلوية، واضغط على الاختصار Ctrl +3 لإخفائه، ثم حدّد الشكل الأصفر الآخر في المروحة العلوية واستبدل لون التعبئة الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه، ثم اضغط على الاختصار Ctrl + Alt +3 لإظهار الشكل الذي أخفيناه في الخطوة الحالية. حدّد الأشكال الثلاثة الصفراء المُطبَّق عليها تأثير Feather الخاصة بالمراوح الثلاثة المتبقية، واضغط على الاختصار Ctrl +3 لإخفائها، ثم استبدل ألوان تعبئة الأشكال الصفراء السفلية الثلاثة المتبقية الحالية بتدرج لوني خطي جديد. بعد ذلك اضغط على الاختصار Ctrl + Alt +3 لإظهار الأشكال التي أخفيناها في الخطوة الحالية. حدّد الشكل الأصفر العلوي، واستبدل لون التعبئة الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه، ثم حدّد الأشكال الثلاثة الصفراء المتبقية، واستبدل لون التعبئة الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه. اختر أداة التحديد المباشر (A)، وانقر على النقطة المميزة باللون الأخضر، مما سيؤدي إلى تحديد الشكل المطبّق عليه تأثير الظل Shadow الخاص بالمروحة العلوية، ثم استبدل لون تعبئة الشكل المحدَّد الحالي باللون الأحمر الداكن (# 5d1020). ركّز الآن على الشكل الثاني أدناه، وكرّر الخطوات نفسها على المراوح الثلاثة المتبقية، ثم حدّد الدائرة ذات اللون الأخضر الداكن، واستبدل لون التعبئة الحالي بتدرج لوني شعاعي جديد كما هو موضّح أدناه. يجب أن يبدو الدولاب الهوائي الثالث الآن كما في الشكل الآتي. انتهينا بذلك من الدواليب الهوائية جميعها، حيث يمكنك رؤيتها جميعًا في الشكل الثاني أدناه. إنشاء عيدان الدواليب الهوائية استخدم أداة المستطيل (M) وأداة التدرج (G) لإنشاء مستطيل أبعاده 14×470 بكسل، ثم ضعه في الموضع الموضّح أدناه. حدّد هذا المستطيل وأنشئ نسخةً منه (بالضغط على الاختصار Ctrl + C ثم Ctrl + F)، ثم استبدل لون تعبئة المستطيل الحالي بالتدرج اللوني الخطي الجديد كما هو موضّح أدناه. حدّد المستطيل الناتج، ثم اضبط نمط المزج Blending Mode على الخيار Hard Light وقلّل التعتيم Opacity إلى 60%، ثم حدّد المستطيلين اللذين أنشأناهما في الخطوة الحالية، وأرسلهما للخلف باستخدام الاختصار Ctrl + Shift + Left Square Bracket. أخيرًا، حدّد وجمّع (Ctrl + G) جميع كائنات الدولاب الهوائي الأول. كرّر الخطوات السابقة نفسها لإنشاء عيدان الدواليب الهوائية المتبقية. إنشاء الخلفية استخدم أداة المستطيل (M) وأداة التدرج (G) لإنشاء مستطيل أبعاده 940×700 بكسل كما هو موضّح أدناه، ثم حدّد هذا المستطيل وانتقل إلى قائمة تأثير Effect ثم Sketch ثم Water Paper، ثم اتبع البيانات الموضّحة أدناه وانقر على موافق. حدّد المستطيل الناتج، ثم طبّق عليه تأثير Gaussian Blur بمقدار 2 بكسل. استخدم أداة الدائرة (L) لإنشاء بعض الدوائر ذات اللون الأزرق الفاتح (# b3d3f0)، ثم ضعها في المواضع الموضّحة أدناه. أعِد تحديد جميع هذه الدوائر، ثم طبّق عليها تأثير Gaussian Blur بمقدار 10 بكسلات، ثم اضبط نمط المزج Blending Mode على الخيار Hard Light وقلّل التعتيم Opacity إلى 10%. وبهذا نكون انتهينا من الخلفية، حيث يجب الآن وضع الدواليب الثلاثة في هذه الخلفية. وبذلك يكون كل شيء قد أصبح جاهزًا، وسنحصل على الشكل الآتي: ترجمة -وبتصرّف- للمقال Create the Colorful Pinwheels in Adobe Illustrator لصاحبه Bao Nguyen. اقرأ أيضًا كيفية إنشاء مصباح كهربائي في برنامج إليستريتور رسم خلفية شاطئ صيفي ببرنامج الإليستريتور كيفية رسم طائر النحام الوردي باستخدام برنامج أدوبي إليستريتور كيفية إنشاء ميزان مطبخ واقعي باستخدام إليستريتور كيفية إنشاء عربة يدوية مليئة بالرمال باستخدام إليستريتور
-
تسمح التحديدات Selections باختيار منطقة معينة من عملك الفني لتعديلها، وهذا مفيد لتحريك قسم من لوحتك أو تحويله أو الرسم فوقه دون التأثير على الأقسام الأخرى، حيث يمكنك استخدام أدوات تحديد متعددة للعمل بطرق مختلفة. تعمل معظم الأدوات ضمن تلك المنطقة بعد تحديدها، إذ يمكنك رسم أو استخدام التدرجات اللونية في هذه المنطقة للحصول بسرعة على أشكال ملونة و/أو مظلَّلة ذات حواف حادّة. لا تقتصر التحديدات في كريتا على حدود رقعة الرسم، حيث يمكنك تحديد أجزاء من لوحتك خارج حدود رقعة الرسم. إنشاء التحديدات توجد أدوات التحديد الأكثر شيوعًا في الجزء السفلي من لوحة الأدوات، حيث تحدّد كل أداة بطريقة مختلفة. 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; } أداة التحديد أيقونة الأداة عملها أداة التحديد المستطيلة تحدّد شكل مربع. أداة التحديد الدائرية تحدّد شكل دائرة. أداة التحديد المضلعية انقر حيث تريد أن تكون نقاط المضلع، ثم انقر نقرًا مزدوجًا لإنهاء المضلع وإنهاء منطقة التحديد. استخدم الاختصار Shift + Z للتراجع عن النقطة السابقة. أداة التحديد بيد حرة تُستخدَم أداة التحديد بيد حرة Freehand أوأداة التحديد الحر Lasso لإجراء تحديد تقريبي عن طريق رسم مخطط التحديد يدويًا على رقعة الرسم. أداة تحديد اللون المشابه أداة تحديد اللون المشابه Similar Color Selection Tool. أداة التحديد المجاورة تحدّد أداة التحديد المجاور Contiguous أو أداة التحديد السحرية Magic Wand حقل اللون. اضبط الضبابية Fuzziness من خيارات الأداة للسماح بمزيد من التغييرات في مجال اللون، وتقتصر هذه الأداة على الطبقة الحالية افتراضيًا. أداة تحديد المسار أو اداة التحديد بمنحنى بيزييه يحدّد المسار منطقة بناءً على مسار متجه. انقر للحصول على زوايا حادّة أو اسحب للحصول على خطوط انسيابية وأغلق المسار باستخدام مفتاح Enter من لوحة المفاتيح أو من خلال الرجوع مرة أخرى إلى النقطة الأولى. أداة التحديد المغناطيسي تنشئ أداة التحديد المغناطيسي Magnetic selection تحديدًا بيد حرة حيث ينجذب التحديد إلى التباينات الحادة في الصورة. تعديل التحديدات تمنحك خيارات الأداة لكل أداة تحديد القدرة على تعديل هذا التحديد. الإجراء مفتاح التبديل الاختصار الوصف الاستبدال Replace مفتاح Ctrl مفتاح R استبدال التحديد الحالي. التقاطع Intersect الاختصار Shift + Alt - الحصول على القسم المتداخل بين تحديدين. الإضافة Add مفتاح Shift مفتاح A إضافة التحديد الجديد إلى التحديد الحالي. الطرح Subtract مفتاح Alt مفتاح S طرح التحديد من التحديد الحالي. الفرق المتماثل Symmetric Difference - - يعطي التحديد التي يمثل مكان عدم تداخل التحديد الجديد مع التحديد الحالي. ويمكنك تغييرها من إعدادات الأدوات Tools Settings. إذا مرّرت الفأرة فوق تحديد باستخدام أداة التحديد دون تنشيطه، فيمكنك تحريك هذا التحديد. كما يمكنك الانتقال بسرعة إلى وضع التحويل من خلال النقر بزر الفأرة الأيمن ثم اختيار تعديل التحديد Edit Selection. إزالة التحديدات إذا أردت حذف التحديد بالكامل، فإن أسهل طريقة هي إلغاء تحديد كل شيء من خلال الانتقال إلى قائمة تحديد Select ثم أزِل التحديد Deselect، أو من خلال الضغط على الاختصار Ctrl + Shift + A. إذا كانت إحدى أدوات التحديد نشطة وكان وضع التحديد في حالة تقاطع أو استبدال أو فرق متماثل، فيمكنك إلغاء التحديد بمجرد النقر بزر الفأرة الأيسر في أي مكان على رقعة الرسم. أوضاع عرض التحديد يوجد زر في الزاوية اليسرى السفلية من شريط الحالة وظيفته تبديل كيفية عرض التحديد، التي لها وضعان هما: (مسير Marching) النمل Ants والقناع Mask. يمكن تغيير اللون الأحمر مع القناع من التفضيلات Preferences، إذ يمكنك تعديل اللون من قائمة إعدادات Settings ثم ضبط كريتا Configure Krita ثم العرض Display ثم Selection Overlay، وإن لم يكن هناك تحديد، فلن يفعل هذا الزر أي شيء. يُعَد وضع عرض النمل (الوضع الافتراضي كما في الشكل السابق) الأفضل، إذا أردت رؤية المناطق غير المُحدَّدة. يُعَد وضع عرض القناع الموضَّح في الشكل السابق مناسبًا لرؤية مستويات شفافية التحديد المختلفة مثل التحديد الذي لديه حواف ناعمة جدًا بسبب استخدام ميزة تنعيم الحواف Feathering. لكن يمكن تنشيط وضع القناع في إصدار كريتا 4.2 عندما يكون قناع التحديد هو الطبقة النشطة لتتمكّن من رؤية مستويات التحديد المختلفة. قناع التحديد العام Global Selection Mask (طلاء تحديد) قناع التحديد العام Global Selection Mask هو التحديد الذي يظهر على لوحة الطبقات Layers. يكون قناع التحديد العام مخفيًا افتراضيًا، لذلك ستحتاج إلى جعله مرئيًا من قائمة تحديد Select ثم إظهار قناع التحديد العام Show Global Selection Mask. يجب إنشاء تحديد بعد إظهار قناع التحديد العام، وفائدة استخدام ذلك هو أنه يمكنك الرسم على التحديد باستخدام أيِّ من أدوات الرسم العادية، بما في ذلك التحويل والتحريك، وتُحفَظ المعلومات كتدرج رمادي Grayscale. يمكنك الانتقال إلى وضع قناع التحديد العام بسرعة من أدوات التحديد عن طريق النقر بزر الفأرة الأيمن وتحديد خيار تعديل التحديد Edit Selection. التحديد من طبقة شفافية يمكنك إنشاء تحديد بناءً على شفافية الطبقة عن طريق النقر بزر الفأرة الأيمن على الطبقة في لوحة طبقات ثم تحديد الخيار تحديد المنطقة العاتمة Select Opaque من قائمة السياق. كما يمكنك في إصدار كريتا 4.2 تطبيق ذلك مع خيارات الإضافة والطرح والتقاطع بالانتقال إلى قائمة تحديد Select ثم Select Opaque، حيث يمكنك العثور على إجراءات محددة لكل منها. إذا أردت تحديد أجزاء من الطبقات بسرعة، فيمكنك الاستمرار في الضغط على مفتاح Ctrl مع النقر بزر الفأرة الأيسر على صورة الطبقة المصغَّرة Layer thumbnail. كما يمكنك إضافة تحديد من خلال الضغط على الاختصار Ctrl + Shift مع النقر على زر الفأرة الأيسر، واستخدم الاختصار Ctrl + Alt مع النقر على زر الفأرة الأيسر لإزالة تحديد، واستخدم الاختصار Ctrl + Shift + Alt مع زر الفأرة الأيسر لتطبيق التقاطع. تعمل جميع هذه الاختصارات مع أيّ قناع يحتوي على بيانات مؤلفة من بكسلات أو متجهات باستثناء أقنعة التحويل. أنواع تحديد البكسلات والمتجهات تسمح التحديدات المتجهة بتعديل تحديدك من خلال أدوات الارتكاز المتجهة Vector anchor tools، بينما تسمح تحديدات البكسلات بتعديل التحديدات باستخدام معلومات البكسلات. لكل نوع من هذين التحديدين فوائده وعيوبه، ويمكنك تحويل أحد هذين النوعين إلى النوع الآخر. يمكنك تحديد نوع التحديد الذي أنشأته من خيار الوضع Mode في خيارات أداة التحديد، حيث يمكنك إما اختيار نوع البكسلات Pixel أو النوع المتجهي Vector، ولكن يكون الخيار الافتراضي هو Vector. يمكن تعديل التحديدات المتجهة -مثل أيّ شكل متجه آخر- باستخدام أداة تحديد الشكل Shape Selection Tool. إن حاولت الرسم على قناع تحديد متجهي، فسيتحوّل إلى تحديد بكسلات. كما يمكنك تحويل الأشكال المتجهة إلى تحديد، ولكن يمكن إنشاء تحديدات متجهة من الأشكال المتجهة، ويمكن تحويل الأشكال المتجهة إلى تحديدات متجهة باستخدام الخيارات الموجودة في قائمة تحديد Selection، حيث سيضيف كريتا طبقةً متجهةً جديدةً لهذا الشكل. أحد الأسباب الأكثر شيوعًا لاستخدام التحديدات المتجهة هو أنها تمنحك القدرة على تحريك وتحويل تحديد دون الحاجة إلى أدوات تغيير الحجم التي تحصل عليها من خلال استخدام تحديد البكسلات. كما يمكنك استخدام أداة تعديل الشكل Shape Edit Tool لتغيير نقاط الارتكاز في التحديد، مما يتيح ضبط منحنيات بيزييه بدقة أو إضافة زوايا إلى التحديدات المستطيلة. إذا بدأت باستخدام تحديد بكسلات، فلا يزال بإمكانك تحويله إلى تحديد متجهي للحصول على هذه الفوائد من خلال الانتقال إلى قائمة تحديد Select ثم تحويل إلى تحديد متجهي Convert to Vector Selection. الاختصارات الشائعة أثناء استخدام التحديدات إليك الاختصارات الشائعة التي تسهل عليك عملية التحديد: نسخ: Ctrl + C أو Ctrl + Ins. لصق: Ctrl + V أو Shift + Ins. قص: Ctrl + X أو Shift + Del. نسخ من جميع الطبقات: Ctrl + Shift + C. نسخ التحديد إلى طبقة جديدة: Ctrl + Alt + J. قص التحديد إلى طبقة جديدة: Ctrl + Shift + J. عرض أو إخفاء تحديد: Ctrl + H. تحديد المنطقة العاتمة: Ctrl مع النقر بزر الفأرة الأيسر على صورة الطبقة المُصغَّرة. تحديد المنطقة العاتمة Select Opaque (إضافة): Ctrl + Shift مع النقر بزر الفأرة الأيسر على صورة الطبقة المُصغَّرة. تحديد المنطقة العاتمة (طرح): Ctrl + Alt مع النقر بزر الفأرة الأيسر على صورة الطبقة المُصغَّرة. تحديد المنطقة العاتمة (تقاطع): Ctrl + Shift + Alt مع النقر بزر الفأرة الأيسر على صورة الطبقة المُصغَّرة. ترجمة -وبتصرّف- للمقال Selections من موقع Krita. اقرأ أيضًا المقال السابق: دليل الطبقات والأقنعة في كريتا المفاهيم الأساسية لكريتا النسخة الكاملة من كتاب: أساسيات تصميم الرسوميات
-
يدعم كريتا الطبقات التي تساعد على التحكم في أجزاء وعناصر رسوماتك بطريقة أفضل، إذ تشبه الطبقات Layers إلى حدٍ ما الأوراق المكدَّسة فوق بعضها البعض بحيث تظهِر بعض الأوراق ما تحتها بينما يخفي البعض الآخر ما تحته. إذا أردت استبدال عنصر في عملك الفني، فيمكنك استبدال تلك الورقة بدلًا من رسم كل شيء مرة أخرى، حيث تعمل الطبقات بالآلية نفسها. تُعَد الطبقات جزءًا من المستند، وقد تكون شفافة أو غير شفافة، وتكون أصغر أو أكبر من المستند نفسه، ويمكنها ترتيبها فوق بعضها البعض وتسميتها وتجميعها. تمنحك الطبقات تحكمًا أفضل في عملك الفني، حيث يمكنك إعادة تلوينه من خلال العمل على طبقة ألوان منفصلة فقط على سبيل المثال، وبالتالي عدم إتلاف الرسوم الخطية التي توجد فوق طبقة الألوان هذه. يمكنك تعديل طبقات مفردة وإضافة تأثيرات خاصة إليها مثل أنماط الطبقة Layer styles وأوضاع المزج Blending modes والشفافية Transparency والمرشّحات Filters والتحويلات Transforms. يضع كريتا كل هذه الطبقات مع التأثيرات الخاصة المطبَّقة عليها في مكدس طبقاته، ثم يجمعها معًا لتشكيل الصورة النهائية، وهذه مجرد طريقة من بين طرق معالجة الصور الرقمية المتعددة التي يمتلكها كريتا. إذا وضعتَ طبقة طلاء Paint layer فوق طبقة أخرى، فستكون طبقة الطلاء العلوية مرئية بالكامل، بينما تكون الطبقة التي تحتها إما محجوبة أو مغلقة أو مرئية جزئيًا. إدارة الطبقات يفضل بعض الرسامين الرسم على عدد محدود من الطبقات، بينما يفضّل البعض الآخر أن يضع عناصر عمله الفني المختلفة على طبقات منفصلة. يمتلك كريتا بعض الميزات التي تسهّل مهمة إدارة الطبقات، إذ يمكنك تجميع الطبقات وتنظيم عناصر عملك الفني. كما يمكن تغيير ترتيب الطبقات أو نقلها داخل وخارج مجموعةٍ في مكدس الطبقات عن طريق الضغط عليها ثم سحبها وإفلاتها، ويمكن نسخ الطبقات بين المستندات في وضع النافذة الفرعية Subwindow mode عن طريق سحب هذه الطبقة وإفلاتها من مستند إلى آخر. توفّر هذه الميزات الوقت وتساعد الرسامين على تسهيل فهم مكدّس طبقات الملف للأشخاص الآخرين الذين يعملون على الملف نفسه. كما يمكن تمييز هذه الطبقات والمجموعات وتصنيفها حسب الألوان، مما يساعد الرسامين على التمييز بينها بالنظر فقط. يمكنك تخصيص لصاقة لونية لطبقة أو لمجموعة طبقات من خلال الضغط بزر الفأرة الأيمن على الطبقة واختيار أحد الألوان المحدَّدة من قائمة السياق، ويمكنك إزالتها من خلال النقر على المربع "x" المحدَّد في قائمة السياق. ويمكنك تصنيف الطبقات التي لها لصاقة لونية متشابهة من خلال النقر على لون واحد أو أكثر في القائمة الموجودة في الزاوية العلوية اليمنى من لوحة الطبقات. جديد في الإصدار رقم 5.0: يمكنك استخدام هذه القائمة لتصنيف الطبقات حسب اسمها أنواع الطبقات يوضّح الشكل السابق أنواع الطبقات المختلفة، فلكل نوع طبقة غرضٌ مختلف، حيث يمكن على سبيل المثال وضع جميع العناصر المتجهية على طبقة متجهية Vector elements، كما تكون العناصر النقطية Raster العادية على طبقة الطلاء Paint layer. كيفية تراكب الطبقات في كريتا تشكّل الطبقات المرئية في كريتا صورة مركبة تظهر على رقعة الرسم، حيث تُرتَّب هذه الطبقات من الأسفل إلى الأعلى مثل كومة من الأوراق، فإن أضفتَ مزيدًا من الطبقات، فستتغير الصورة التي نراها وفقًا لخصائص الطبقات المضافَة في الأعلى. تتراكب طبقات المجموعة بطريقة منفصلة عن الطبقات الأخرى في المكدّس، إلّا عند تنشيط وضع التمرير. تشكّل الطبقات الموجودة ضمن المجموعة أحد مركبات الصورة أولًا، ثم يُستخدَم هذا المركب أثناء تركيب مكدّس الطبقات لتشكيل صورة كاملة. إذا فعّلتَ وضع التمرير عن طريق الضغط على أيقونة مشابهة للجدار المكسور، فستُعَدّ طبقات المجموعة كما لو أنها خارج تلك المجموعة في مكدس الطبقات، ولكن يعتمد ظهور الطبقات في مجموعة على ظهور هذه المجموعة. للمجموعات الموجودة في ملف PSD المحفوظ في برنامج الفوتوشوب وضع تمرير افتراضي إن لم تُضبَط على أوضاع مزج أخرى. طبقات توريث ألفا Inherit Alpha أو طبقات القطع Clipping توجد ميزة قطع في كريتا تسمى توريث ألفا Inherit Alpha، ويُشار إليها برمز ألفا في مكدس الطبقات. تقتصر بكسلات الطبقة التي ترسم عليها على منطقة البكسلات المشتركة لجميع الطبقات الموجودة أسفلها بعد النقر على رمز توريث ألفا في مكدّس الطبقات، فإذا كانت الطبقة الأولى لديك هي طبقة الخلفية البيضاء الافتراضية، فسيبدو أن النقر على رمز توريث ألفا والرسم على أيّ طبقة فوقها دون أيّ تأثير، حيث ستمتلئ رقعة الرسم بأكملها باللون الأبيض، لذلك يُنصَح بوضع الطبقة الأساسية التي تريد أن تقطع البكسلات فيها ضمن طبقة مجموعة. تتراكب طبقات المجموعة بطريقة منفصلة كما ذكرنا سابقًا، وبالتالي تكون الطبقة الدنيا في المجموعة الطبقةَ المحيطة، ويُقطَع محتوى الطبقات الموجودة أعلى هذه الطبقة إذا جرى تفعيل خيار توريث ألفا. كما يمكنك تفعيل توريث ألفا لطبقة مجموعة. الأقنعة Masks والمرشحات Filters يدعم كريتا التعديل غير المدمّر Non-destructive editing لمحتوى الطبقة، فالتعديل غير المدمّر هو تعديل أو تغيير طبقة أو صورة دون تغيير صورة المصدر الأصلية تغييرًا دائمًا، حيث تُضاف التغييرات فقط بوصفها مرشّحات Filters أو أقنعة Masks على الصورة الأصلية مع الحفاظ على هذه الصورة سليمة دون تغيير، وهذا يساعد كثيرًا عندما يتطلب سير العمل ذهابًا وإيابًا متواصلًا، إذ يمكنك العودة إلى الصورة الأصلية بنقرة واحدة، فما عليك سوى إخفاء المرشّح أو القناع المطبَّق على صورتك الأولية. يمكنك إضافة مرشّحات متعددة إلى طبقة باستخدام قناع مرشّح Filter mask، أو إضافة طبقة مرشّح تؤثر على الصورة بأكملها. كما يمكن تحويل الطبقات تحويلًا غير مدمر باستخدام أقنعة التحويل Transformation masks، بل ويمكن إخفاء أجزاء منها مؤقتًا باستخدام قناع شفاف Transparent Mask. تُعَد هذه التأثيرات غير المدمرة مفيدة للغاية إذا غيّرت رأيك لاحقًا، أو إذا احتجت إنشاء مجموعة من نسخٍ مختلفة لصورة معينة. يمكن الوصول إلى هذه المرشّحات والأقنعة من خلال النقر بزر الفأرة الأيمن كما هو موضّح في الشكل الآتي، أو من خلال النقر على إشارة زائد في لوحة الطبقات. كما يمكنك إضافة مرشّح بوصفه قناعًا من نافذة المرشح نفسه من خلال النقر على زر أنشئ قناع ترشيح Create Filter Mask. يمكن تطبيق جميع المرشّحات والأقنعة على مجموعة أيضًا، مما يسهّل تعديل طبقات متعددة تعديلًا غير مدمر دفعةً واحدة. ترجمة -وبتصرّف- للمقال Introduction to Layers and Masks من موقع Krita. اقرأ أيضًا المقال السابق: حفظ الملفات والحفظ التلقائي والنسخ الاحتياطي في كريتا المفاهيم الأساسية لكريتا النسخة الكاملة من كتاب: أساسيات تصميم الرسوميات
-
تُستخدَم لغة معالجة البيانات Data Manipulation Language -أو DML اختصارًا- الخاصة بلغة SQL للاستعلام عن البيانات في قاعدة البيانات وتعديلها، وسنشرح في هذا المقال كيفية استخدام تعليمات أوامر لغة SQL DML والتي هي SELECT وINSERT وUPDATE، وDELETE المُعرَّفة كما يلي: SELECT: للاستعلام عن بيانات في قاعدة البيانات. INSERT: لإدخال بيانات في جدول. UPDATE: لتحديث بيانات في جدول. DELETE: لحذف بيانات من جدول. في تعليمة SQL DML: يجب بدأ كل شرط في عبارة بسطر جديد. يجب انتظام بداية كل شرط مع بداية الشروط الأخرى. إذا تألّف شرط من عدة أجزاء، فيجب توضُّع هذه الأجزاء على سطور منفصلة، كما يجب إضافة مسافة بادئة لها تحت بداية الشرط لإظهار العلاقة. تُستخدَم الأحرف الكبيرة لتمثيل الكلمات المحجوزة. تُستخدَم الحروف الصغيرة لتمثيل الكلمات التي يُعرِّفها المستخدِم. تعليمة SELECT تسمح التعليمة أو الأمر SELECT للمستخدِم باستخراج البيانات من الجداول، بناءً على معايير محدَّدة، حيث تُعالَج وفقًا للتسلسل التالي: SELECT DISTINCT اختيار عنصر أو مجموعة عناصر. FROM من جدول أو مجموعة جداول. WHERE يليها تعبير شرطي. GROUP BY يليها حقل أو مجموعة حقول. ORDER BY يليها مجموعة حقول. يمكننا استخدام تعليمة SELECT لإنشاء قائمة بهواتف الموظفين من جدول الموظفين Employees كما يلي: SELECT FirstName, LastName, phone FROM Employees ORDER BY LastName سيعرض هذا الإجراء اسم عائلة last name الموظف، واسمه الأول first name، ورقم هاتفه phone number من جدول الموظفين Employees كما في الجدول التالي: 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; } Last Name First Name Phone Number Hagans Jim 604-232-3232 Wong Bruce 604-244-2322 سنستخدم في المثال التالي جدول الناشرين Publishers table الذي يمثِّله الجدول الآتي، حيث ستلاحظ أنّ كندا Canada مكتوبة بطريقة خاطئة في حقل بلد الناشر Publisher Country المقابل لحقل اسم الناشر Example Publishing، ومدينة الناشر ABC Publishing. استخدم تعليمة UPDATE لتصحيح الأخطاء وتوحيد حقل البلد ليصبح Canada، -كما سنتكلم لاحقًا عن تعليمة UPDATE في هذا المقال. Publisher Name Publisher City Publisher Province Publisher Country Acme Publishing Vancouver BC Canada Example Publishing Edmonton AB Cnada ABC Publishing Toronto ON Canda إذا أضفتَ اسم الناشر Publisher Name، ومدينة الناشر Publisher City، فستستخدِم تعليمة SELECT، ويتبعها اسم الحقول التي يُفصَل بينها بفاصلة أجنبية comma، أي كما يلي: SELECT PubName, city FROM Publishers سيؤدي هذا الإجراء إلى عرض اسم الناشر ومدينته من جدول الناشرين. إذا أردت عرض حقل اسم الناشر باسم حقل المدينة -أي تبديل اسم الحقل PubName ليصبح city-، فاستخدِم تعليمة SELECT مع عدم وضع فاصلة أجنبية بين Pub_Name وcity، أي كما يلي: SELECT PubName city FROM Publishers سيعرض تنفيذ هذا الإجراء فقط الحقل PUB_NAME من جدول الناشرين، بحيث يكون له العنوان city. يفترض SQL Server أنك تريد وضع اسم عمود جديد للحقل PUB_NAME إذا لم تضمّن الفاصلة الأجنبية. تعليمة SELECT مع معيار WHERE قد ترغب أحيانًا في التركيز على جزء من جدول الناشرين، مثل الناشرين الموجودين في مدينة فانكوفر Vancouver فقط، إذ ستستخدم في هذه الحالة عبارة SELECT مع معيار WHERE، أي كما يلي: 'WHERE city = 'Vancouver. يوضِّح المثالان الأوليّان التاليان كيفية تحديد اختيار سجل مع المعيار WHERE باستخدام BETWEEN، إذ يعطي كل من هذين المثالَين نتائج تخزين العناصر نفسها التي عددها بين 20 و50 عنصر في المخزن. يستخدم المثال رقم 1 الكمية التي قيمتها بين 20 و50 عنصر مع تضمين العنصرين 20 و50 بالصورة التالية: qty BETWEEN 20 and 50. SELECT StorID, qty, TitleID FROM Sales WHERE qty BETWEEN 20 and 50 يستخدِم المثال رقم 2 الشرط qty >=20 and qty <=50. SELECT StorID, qty, TitleID FROM Sales WHERE qty >= 20 and qty <= 50 يوضِّح المثال رقم 3 كيفية تحديد اختيار سجل مع المعيار WHERE باستخدام NOT BETWEEN. SELECT StorID, qty, TitleID FROM Sales WHERE qty NOT BETWEEN 20 and 50 يظهر المثالان التاليان طريقتَين مختلفتَين لتحديد اختيار سجل مع المعيار WHERE باستخدام IN مع النتائج نفسها. يوضح المثال رقم 4 كيفية اختيار السجلات باستخدام حقل المقاطعة province من جدول Publishers -أي =province- على أساس جزء من تعليمة WHERE. SELECT * FROM Publishers WHERE province = 'BC' OR province = 'AB' OR province = 'ON' يوضِّح المثال رقم 5 كيفية اختيار السجلات باستخدام المقاطعة province مع IN على أساس جزء من تعليمة WHERE: SELECT * FROM Publishers WHERE province IN (‘BC’, ‘AB’, ‘ON’) يوضِّح المثالان الأخيران كيف يمكن استخدام NULL وNOT NULL لتحديد السجلات، ولكن سنستخدم في هذين المثالين جدول الكتب Books table الغير موضَّح هنا، والذي يحتوي على حقول، وهي: العنوان Title، والكمية Quantity، وسعر الكتاب Price، وكل ناشر لديه جدول كتب يعطي قائمةً بجميع كتب الناشر. يستخدِم المثال رقم 6 القيمة NULL: SELECT price, title FROM Books WHERE price IS NULL يستخدِم المثال رقم 7 القيمة NOT NULL: SELECT price, title FROM Books WHERE price IS NOT NULL استخدام محارف البدل wildcards في شرط LIKE يحدِّد الشرط LIKE الصفوف التي تحتوي على الحقول التي تطابق أجزاءً محددة من سلاسل محرفية، كما يُستخدَم LIKE مع البيانات التي من النوع char وvarchar وtext وdatetime وsmalldatetime. يسمح محرف البدل wildcard للمستخدِم بمطابقة الحقول التي تحتوي على محارف معينة، حيث سيعطي محرف البدل '%province = 'N جميع المقاطعات التي تبدأ بالمحرف N. يوضِّح الجدول التالي أربعة طرق لتحديد محارف البدل في تعليمة SELECT في صيغة التعبير المنتظم: محرف البدل wildcard نتيجة استخدامه % يمثل أيّ سلسلة تتألف من صفر أو أكثر من المحارف _ يمثل أيّ محرف واحد [ ] يمثل أيّ محرف واحد ضمن مجال محدد مثل المجال [a-f]، أو مجموعة محدَّدة مثل المجموعة [abcdef] [^] يمثل أي محرف واحد ليس ضمن مجال محدد مثل المجال [a - f^]، أو مجموعة محدَّدة مثل المجموعة [abcdef^] تبحث التعليمة '%LIKE 'Mc في المثال رقم 1 عن جميع أسماء العائلة last names التي تبدأ بالمحرفين Mc مثل McBadden: SELECT LastName FROM Employees WHERE LastName LIKE 'Mc%' تبحث التعليمة 'LIKE '%inger في المثال رقم 2 عن جميع أسماء العائلة التي تنتهي بالمحارف inger، مثل Ringer وStringer: SELECT LastName FROM Employees WHERE LastName LIKE '%inger' تبحث التعليمة '%LIKE '%en عن جميع أسماء العائلة التي تحتوي على المحرفين en، مثل Bennett وGreen وMcBadden: SELECT LastName FROM Employees WHERE LastName LIKE '%en%' تعليمة SELECT مع الشرط ORDER BY يُستخدَم الشرط ORDER BY لترتيب السجلات في القائمة الناتجة، ويمكنك استخدام ASC لترتيب النتائج تصاعديًا، وDESC لترتيب النتائج تنازليًا. يستخدِم المثال التالي ASC: SELECT * FROM Employees ORDER BY HireDate ASC يستخدم المثال التالي DESC: SELECT * FROM Books ORDER BY type, price DESC تعليمة SELECT مع الشرط GROUP BY يُستخدَم الشرط GROUP BY لإنشاء خرج هو عبارة عن صف واحد لكل مجموعة، وينتج قيمًا موجِزةً للأعمدة المحدَّدة، كما هو موضَّح أدناه: SELECT type FROM Books GROUP BY type يستخدم المثال التالي التعليمة السابقة: SELECT type AS 'Type', MIN(price) AS 'Minimum Price' FROM Books WHERE royalty > 10 GROUP BY type إذا تضمنت تعليمة SELECT معيار WHERE ليكون السعر price قيمةً غير فارغة not null كما يلي: SELECT type, price FROM Books WHERE price is not null فستكون التعليمة التي تحتوي على شرط GROUP BY كما يلي: SELECT type AS 'Type', MIN(price) AS 'Minimum Price' FROM Books WHERE price is not null GROUP BY type استخدام COUNT مع GROUP BY يمكننا استخدام COUNT لإحصاء عدد العناصر الموجودة في حاوية container، ولكن إذا أردت حساب عدد عناصر مختلفة في مجموعات منفصلة مثل رخام ذي ألوان مختلفة، فسنستخدِم دالة COUNT مع الأمر GROUP BY. توضح تعليمة SELECT أدناه كيفية حساب عدد مجموعات من البيانات باستخدام دالة COUNT مع الشرط أو الأمر GROUP BY: SELECT COUNT(*) FROM Books GROUP BY type استخدام AVG وSUM مع GROUP BY يمكننا استخدام دالة AVG لتعطينا متوسط أي مجموعة، وتُستخدَم الدالة SUM لإعطاء المجموع. يستخدِم المثال رقم 1 التالي دالة AVG مع الشرط GROUP BY type: SELECT AVG(qty) FROM Books GROUP BY type يستخدِم المثال رقم 2 التالي دالة SUM مع الشرط GROUP BY type: SELECT SUM(qty) FROM Books GROUP BY type يستخدِم المثال رقم 3 كلًا من الدالتين AVG، وSUM مع الشرط GROUP BY type في تعليمة SELECT: SELECT 'Total Sales' = SUM(qty), 'Average Sales' = AVG(qty), stor_id FROM Sales GROUP BY StorID ORDER BY 'Total Sales' تقييد الصفوف مع HAVING يمكن استخدام الشرط HAVING لتقييد الصفوف، فهو يشبه شرط WHERE باستثناء أنه يتضمّن دالة تجميع aggregate function؛ إذ لا يستطيع الشرط WHERE فعل ذلك، أي يتصرّف الشرط HAVING مثل الشرط WHERE، ولكنه قابل للتطبيق على المجموعات. نستخدم في هذا المثال الشرط HAVING لاستبعاد المجموعات التي مقاطعتها 'BC'. SELECT au_fname AS 'Author"s First Name', province as 'Province' FROM Authors GROUP BY au_fname, province HAVING province <> 'BC' تعليمة INSERT تضيف تعليمة INSERT صفوفًا إلى جدول، وأيضًا ما يلي: تحدِّد تعليمة INSERT الجدول أو العرض view التي ستُدخَل البيانات فيه. تعرض Column List قائمةً بالأعمدة التي ستتأثر بتعليمة INSERT. يجب توفير كل قيمة إذا حُذِف عمود. يمكن وضع الأعمدة في قائمة ضمن أي ترتيب إذا ضمّنتها. تحدِّد الكلمة VALUES البيانات التي تريد إدخالها في الجدول، وتكون VALUES إلزامية). يجب عدم إدراج الأعمدة ذات الخاصية IDENTITY بصورة صريحة في column_list أو value_sclause. صيغة تعليمة INSERT هي: INSERT [INTO] Table_name | view name [column_list] DEFAULT VALUES | values_list | select statement تُطبَّق القواعد التالية عند إدخال صفوف باستخدام تعليمة INSERT: يؤدي إدخال سلسلة فارغة (' ') في عمود من النوع varchar، أو text إلى إدخال مسافة واحدة. تُحشَى جميع الأعمدة ذات النوع char على اليمين right-padded حتى تصل إلى الطول المحدد. تُزال جميع المسافات الزائدة من البيانات المدرجة في أعمدة من النوع varchar، باستثناء السلاسل التي تحتوي على مسافات فقط، إذ تُختصَر هذه السلاسل إلى مسافة واحدة فقط. إذا أخلَّت تعليمة INSERT بالقيد، أو الافتراض، أو القاعدة، أو إذا كان نوع البيانات خاطئًا، فستفشل هذه التعليمة، وسيعرض خادم SQL Server رسالة خطأ. يمكن حدوث أحد الأشياء الثلاثة التالية للأعمدة التي لا تحتوي على قيم عند تحديد قيم بعض الأعمدة في column_list فقط: تُدخَل قيمة افتراضية إذا كان للعمود قيد DEFAULT، أو إذا كان الافتراض مرتبط بالعمود، أو إذا كان الافتراض مرتبط بنوع البيانات التي يعرِّفها المستخدم. تُدخَل القيمة الفارغة NULL إذا سمح العمود بالقيم الفارغة، ولا توجد قيمة افتراضية موجودة للعمود. تُعرَض رسالة خطأ ويُرفَض الصف إذا عُرَِف العمود بأنه غير فارغ NOT NULL، ولا توجد قيمة افتراضية. يستخدِم المثال التالي تعليمة INSERT لإضافة سجل إلى جدول الكتّاب Authors: INSERT INTO Authors VALUES('555-093-467', 'Martin', 'April', '281 555-5673', '816 Market St.,' , 'Vancouver', 'BC', 'V7G3P4', 0) يوضِّح المثال التالي كيفية إدخال صف جزئي partial row في جدول الناشرِين Publishers مع قائمة أعمدة. يملك عمود الدولة country قيمة افتراضية هي Canada، لذلك لا يلزمك تضمينه في قيمك. INSERT INTO Publishers (PubID, PubName, city, province) VALUES ('9900', 'Acme Publishing', 'Vancouver', 'BC') اتبع المثال التالي لإدخال صفوف في جدول مع عمود IDENTITY، ولا تعطي قيمةً للعمود IDENTITY، ولا قيمةً لاسم العمود ضمن قائمة الأعمدة. INSERT INTO jobs VALUES ('DBA', 100, 175) إدخال قيم محددة ضمن عمود IDENTITY لا يمكن إدخال البيانات مباشرة في عمود IDENTITY افتراضيًا، ولكن إذا حُذِف صف خطأً، أو إذا كانت هناك ثغرات في قيم عمود IDENTITY، فيمكنك إدخال صف وتحديد قيمة العمود IDENTITY. IDENTITY_INSERT option يمكن استخدام خيار IDENTITY_INSERT على النحو التالي للسماح بإدخال قيمة هوية identity محدَّدة: SET IDENTITY_INSERT jobs ON INSERT INTO jobs (job_id, job_desc, min_lvl, max_lvl) VALUES (19, 'DBA2', 100, 175) SET IDENTITY_INSERT jobs OFF إدخال صفوف باستخدام عبارة SELECT يمكننا أحيانًا إنشاء جدول مؤقت صغير من جدول كبير، لذلك يمكننا إدخال صفوف مع تعليمة SELECT. لا يوجد تحقق لصحة التفرد uniqueness عند استخدام هذا الأمر، وبالتالي، قد يكون هناك العديد من الصفوف بالمعرّف pub_id نفسه في المثال التالي. ينشِئ هذا المثال جدول ناشرِين Publishers مؤقت هو tmpPublishers أصغر باستخدام تعليمة إنشاء جدول CREATE TABLE، ثم تُستخدَم تعليمة INSERT مع تعليمة SELECT لإضافة سجلات إلى جدول الناشرِين المؤقت من جدول الناشرين Publishers. CREATE TABLE dbo.tmpPublishers ( PubID char (4) NOT NULL , PubName varchar (40) NULL , city varchar (20) NULL , province char (2) NULL , country varchar (30) NULL DEFAULT ('Canada') ) INSERT tmpPublishers SELECT * FROM Publishers ننسخ في هذا المثال مجموعةً فرعيةً من البيانات: INSERT tmpPublishers (pub_id, pub_name) SELECT PubID, PubName FROM Publishers تُنسَخ بيانات الناشرين في هذا المثال إلى جدول tmpPublishers ويُضبَط عمود الدولة country إلى القيمة Canada: INSERT tmpPublishers (PubID, PubName, city, province, country) SELECT PubID, PubName, city, province, ‘Canada’ FROM Publishers تعليمة UPDATE تغيّر تعليمة UPDATE البيانات في الصفوف الموجودة إما بإضافة بيانات جديدة أو بتعديل البيانات الموجودة. يستخدِم المثال التالي تعليمة UPDATE لتوحيد حقل الدولة country ليكون Canada لجميع السجلات في جدول Publishers: UPDATE Publishers SET country = 'Canada' يزيد المثال التالي مبالغ حقوق المؤلف royalty التي قيمتها بين 10 و20 بنسبة 10%: UPDATE roysched SET royalty = royalty + (royalty * .10) WHERE royalty BETWEEN 10 and 20 تضمين استعلامات فرعية subqueries ضمن عبارة UPDATE يُمنَح الموظفون في جدول الموظفين Employees الذين وظّفهم الناشر في عام 2010 ترقيةً إلى أعلى مستوى وظيفي حسب نوع عملهم كما يلي: UPDATE Employees SET job_lvl = (SELECT max_lvl FROM jobs WHERE employee.job_id = jobs.job_id) WHERE DATEPART(year, employee.hire_date) = 2010 تعليمة DELETE تزيل تعليمة DELETE صفوفًا من مجموعة سجلات، كما تحدِّد عبارة DELETE الجدول أو العرض view الذي يحوي الصفوف التي ستُحذَف، ويمكن إدراج جدول أو صف واحد فقط في الوقت نفسه. يُعَدّ الشرط WHERE المعيار الذي يحدِّد السجلات المراد حذفها، وتكون صيغة تعليمة DELETE كما يلي: DELETE [FROM] {table_name | view_name } [WHERE clause] قواعد تعليمة DELETE هي: إذا حُذِف شرط WHERE فستُزال جميع الصفوف الموجودة في الجدول باستثناء الفهارس indexes، والجدول، والقيود. لا يمكن استخدام عبارة DELETE بعرض view يحتوي على شرط FROM يسمّي أكثر من جدول واحد، فتعليمة DELETE يمكن أن تؤثر على جدول أساسي فقط في الوقت نفسه. فيما يلي ثلاث تعليمات DELETE مختلفة يمكن استخدامها: حذف جميع الصفوف من جدول: DELETE FROM Discounts حذف صفوف محدَّدة: DELETE FROM Sales WHERE stor_id = '6380' حذف صفوف بناءً على قيمة ضمن استعلام فرعي: DELETE FROM Sales WHERE title_id IN (SELECT title_id FROM Books WHERE type = 'mod_cook') الدوال المبنية مسبقا Built-in Functions يوجد العديد من الدوال المبنية مسبقًا في SQL Server، مثل: دوال التجميع Aggregate: ترجع قيمًا موجِزة summary values. دوال التحويل Conversion: تحوِّل نوع بيانات معين إلى نوع آخر. دوال التاريخ Date: تعرض معلومات عن التواريخ والأوقات. الدوال الرياضية Mathematical: تجري عمليات على البيانات العددية. الدوال المتعلِّقة بالسلاسل String: تجري عمليات على سلاسل المحارف، أو البيانات الثنائية، أو التعابير. الدوال المتعلِّقة بالنظام System: ترجع معلومات من قاعدة البيانات. الدوال المتعلِّقة بالنصوص Text، والصور image: تجري عمليات على بيانات نصية، أو على بيانات الصور. سنشرح أدناه الدوال الأربع الأولى شرحًا مفصَّلًا مع أمثلة عنها. دوال التجميع Aggregate functions تجري دوال التجميع حسابات على مجموعة من القيم، وترجع قيمةً واحدةً أو قيمةً موجِزةً. يعرض الجدول التالي هذه الدوال: الدالة FUNCTION وصفها AVG ترجع متوسط average جميع القيم، أو القيم المميزة DISTINCT فقط، ضمن التعبير COUNT ترجع عدد القيم غير الفارغة في التعبير، وإذا استخدِم التمايز DISTINCT فستجد الدالة COUNT عدد القيم غير الفارغة الفريدة (*)COUNT ترجع عدد الصفوف، ولا تأخذ الدالة (*)COUNT معاملات، كما لا يمكن استخدام التمايز DISTINCT معها MAX ترجع القيمة العليا في التعبير، ويمكن استخدام الدالة Max مع الأعمدة ذات النوع العددي، والمحرفي، والأعمدة ذات النوع datetime، ولكنها لا تُستخدَم مع الأعمدة ذات النوع bit، كما تعطي الدالة MAX مع الأعمدة المحرفية أعلى قيمة في تسلسل مرتَّب، وتتجاهل هذه الدالة القيم الفارغة MIN ترجع القيمة الدنيا في التعبير. يمكن استخدام الدالة MIN مع أعمدة عددية، ومحرفية، وذات النوع datetime، ولكنها لا تُستخدَم مع أعمدة لها النوع bit، كما تعطي الدالة MIN مع الأعمدة المحرفية أعلى قيمة في تسلسل مرتَّب، وتتجاهل هذه الدالة القيم الفارغة SUM ترجع مجموع كل القيم، أو فقط القيم المميزة DISTINCT في التعبير، ويمكن استخدام الدالة SUM مع الأعمدة العددية فقط سنعرض فيما يلي أمثلةً عن كل من دوال التجميع الموجودة في الجدول السابق. المثال الأول: الدالة AVG SELECT AVG (price) AS 'Average Title Price' FROM Books المثال الثاني: الدالة COUNT SELECT COUNT(PubID) AS 'Number of Publishers' FROM Publishers المثال الثالث: الدالة COUNT SELECT COUNT(province) AS 'Number of Publishers' FROM Publishers المثال الرابع: الدالة (*) COUNT SELECT COUNT(*) FROM Employees WHERE job_lvl = 35 المثال الخامس: الدالة MAX SELECT MAX (HireDate) FROM Employees المثال السادس: الدالة MIN SELECT MIN (price) FROM Books المثال السابع: الدالة SUM SELECT SUM(discount) AS 'Total Discounts' FROM Discounts دالة التحويل Conversion function تحوّل دالة التحويل نوع بيانات معين إلى نوع بيانات آخر. يُحوَّل السعر price الذي يحتوي ضمنه على تسعتين 99 إلى خمسة محارف في المثال الآتي، حيث تكون صيغة التعليمة بالصورة التالية: SELECT 'The date is ' + CONVERT(varchar(12), getdate()) إليك مثال: SELECT CONVERT(int, 10.6496) SELECT title_id, price FROM Books WHERE CONVERT(char(5), price) LIKE '%99%' مثال آخر عن تغيِّر دالة التحويل في المثال التالي البيانات إلى نوع بيانات بحجم مختلف: SELECT title_id, CONVERT(char(4), ytd_sales) as 'Sales' FROM Books WHERE type LIKE '%cook' دالة التاريخ Date function تُنتج دالة التاريخ تاريخًا عن طريق إضافة فاصل زمني إلى تاريخ محدَّد، والنتيجة هي قيمة لها نوع datetime، وتساوي التاريخ مضافًا إليه عدد أجزاء التاريخ date parts. إذا كان معامل دالة التاريخ قيمةً من النوع smalldatetime، فستكون النتيجة قيمةً من النوع smalldatetime أيضًا. تُستخدَم الدالة DATEADD لإضافة وزيادة قيم التاريخ، وصيغة هذه الدالة هي: (DATEADD(datepart, number, date. SELECT DATEADD(day, 3, hire_date) FROM Employees يستخدِم المثال الآتي الدالة (DATEDIFF(datepart, date1, date2، ويعيد هذا الأمر عدد أجزاء التاريخ أو الحدود boundaries المتقاطعة بين تاريخَين محددين. تجعل طريقة حساب الحدود المتقاطعة النتيجة التي أعطتها الدالة DATEDIFF متوافقة مع جميع أنواع البيانات، مثل الدقائق، والثواني، والميلي ثانية. SELECT DATEDIFF(day, HireDate, 'Nov 30 1995') FROM Employees يمكننا فحص أي جزء من تاريخ معيَّن من السنة إلى الميلي ثانية. يعرض الجدول التالي أجزاء التاريخ DATEPART، واختصاراتها، وقيمها المقبولة التي يعترف بها خادم SQL Server. جزء التاريخ DATE PART اختصاره ABBREVIATION قيمه VALUES Year yy 1753-9999 Quarter qq 1-4 Month mm 1-12 Day of year dy 1-366 Day dd 1-31 Week wk 1-53 Weekday dw 1-7 (Sun.-Sat.) Hour hh 0-23 Minute mi 0-59 Second ss 0-59 Millisecond ms 0-999 الدوال الرياضية Mathematical functions تجري الدوال الرياضية عمليات على البيانات العددية، ويعرض المثال التالي السعر الحالي لكل كتاب يبيعه الناشر، كما يعرض ما سيكون عليه الأمر إذا ارتفعت جميع الأسعار بنسبة 10%: SELECT Price, (price * 1.1) AS 'New Price', title FROM Books SELECT 'Square Root' = SQRT(81) SELECT 'Rounded' = ROUND(4567.9876,2) SELECT FLOOR (123.45) ربط الجداول Joining Tables يُعَدّ ربط جدولين أو أكثر مثل عملية موازنة بيانات ضمن أعمدة محدَّدة، واستخدام نتائج الموازنة لتشكيل جدول جديد من الصفوف المؤهلة لذلك. تقوم عبارة الربط join بما يلي: تحدِّد عمودًا من كل جدول. توازن القيم الموجودة في تلك الأعمدة صفًا صفًا. تدمج الصفوف ذات القيم المؤهلة ضمن صف جديد. تكون الموازنة عادةً مساواةً -أي القيم التي تتطابق مع بعضها البعض تمامًا-، ولكن يمكن تحديد أنواع ربط أخرى أيضًا. سنشرح جميع أنواع الربط المختلفة أدناه، مثل: الربط الداخلي inner، واليساري (الخارجي)، واليميني (الخارجي)، والربط المتقاطع cross join (التام). الربط الداخلي Inner join يربط جدولين في عمود له نفس نوع البيانات، وينتج الصفوف التي تتطابق فيها قيم العمود فقط، حيث يجري تجاهل الصفوف التي لا مثيل لها. المثال الأول: SELECT jobs.job_id, job_desc FROM jobs INNER JOIN Employees ON emp loyee.job_id = jobs.job_id WHERE jobs.job_id < 7 المثال الثاني: SELECT authors.au_fname, authors.au_lname, books.royalty, title FROM authorsINNER JOIN titleauthor ON authors.au_id=titleauthor.au_id INNER JOIN books ON titleauthor.title_id=books.title_id GROUP BY authors.au_lname, authors.au_fname, title, title.royalty ORDER BY authors.au_lname الربط اليساري الخارجي Left outer join ينتج عن الربط الخارجي اليساري كل الصفوف الخارجية اليسرى، إذ تُضمَّن جميع الصفوف من الجدول الأيسر التي لا تحقّق الشرط المحدّد في مجموعة النتائج، وتُضبَط أعمدة الخرج من الجدول الآخر على القيمة الفارغة NULL. يستخدِم المثال التالي الصيغة الجديدة للربط اليساري الخارجي: SELECT publishers.pub_name, books.title FROM Publishers LEFT OUTER JOIN Books On publishers.pub_id = books.pub_id بينما يستخدِم المثال التالي الصيغة القديمة للربط الخارجي اليساري: SELECT publishers.pub_name, books.title FROM Publishers, Books WHERE publishers.pub_id *= books.pub_id الربط الخارجي الأيمن Right outer join يتضّمن الربط الخارجي الأيمن في مجموعة النتائج الخاصة به كافة الصفوف من الجدول الأيمن التي لا تحقّق الشرط المحدّد، وتُضبَط أعمدة الخرج المقابلة من الجدول الآخر على القيمة الفارغة NULL. يستخدِم المثال التالي الصيغة الجديدة للربط الخارجي الأيمن: SELECT titleauthor.title_id, authors.au_lname, authors.au_fname FROM titleauthor RIGHT OUTER JOIN authors ON titleauthor.au_id = authors.au_id ORDERY BY au_lname بينما يوضِّح المثال التالي الصيغة القديمة المستخدَمة للربط الخارجي الأيمن: SELECT titleauthor.title_id, authors.au_lname, authors.au_fname FROM titleauthor, authors WHERE titleauthor.au_id =* authors.au_id ORDERY BY au_lname الربط الخارجي الكامل Full outer join يحدِّد الربط الخارجي الكامل أنه في حالة عدم تطابق صف من أي من الجدولين مع معايير التحديد، فسيُضمَّن الصف في مجموعة النتائج، وتُضبَط أعمدة الخرج الخاصة به التي تتوافق مع الجدول الآخر إلى القيمة الفارغة NULL. فيما يلي مثال عن ربط خارجي كامل: SELECT books.title, publishers.pub_name, publishers.province FROM Publishers FULL OUTER JOIN Books ON books.pub_id = publishers.pub_id WHERE (publishers.province <> "BC" and publishers.province <> "ON") ORDER BY books.title_id الربط المتقاطع Cross join الربط المتقاطع هو ناتج دمج جدولين، وينتج عن هذا الربط صفوف حالة عدم استخدام الشرط WHERE نفسها، أي كما يلي: SELECT au_lname, pub_name, FROM Authors CROSS JOIN Publishers للمزيد من المعلومات، انظر توثيق SQL في موسوعة حسوب. ترجمة -وبتصرّف- للمقال SQL Data Manipulation Language لصاحبَيه Adrienne Watt و Nelson Eng. اقرأ أيضًا المقال التالي: أمثلة عملية عن كيفية تصميم قواعد البيانات المقال السابق: نظرة سريعة على لغة الاستعلامات الهيكلية SQL الاعتماديات الوظيفية المستخدمة في تصميم قواعد البيانات قواعد السلامة وقيودها لضمان سلامة البيانات في قواعد البيانات الاستعلامات الفرعية والإجراءات في SQL البحث والتنقيب والترشيح في SQL معالجة الأخطاء والتعديل على قواعد البيانات في SQL النسخة العربية الكاملة لكتاب تصميم قواعد البيانات
-
لقد اعتُمدت الإنترنت منذ نشأتها على أساس نموذج نظيف، تكون فيه الموجّهات routers داخل الشبكة مسؤولةً عن تمرير الرزم من المصدر إلى الوجهة، وتُشغَّل البرامج التطبيقية على الأجهزة المضيفة المتصلة بأطراف الشبكة. يلتزم نموذج العميل / الخادم الموضح في التطبيقات التي ناقشناها سابقًا على هذا النموذج، لكن أصبح التمييز بين تمرير الرزم ومعالجة التطبيقات أقل وضوحًا في السنوات القليلة الماضية، حيث توزَّع التطبيقات الجديدة عبر الإنترنت، وفي كثيرٍ من الحالات تتخذ هذه التطبيقات قرارات التمرير الخاصة بها. يمكن أحيانًا تنفيذ هذه التطبيقات الهجينة الجديدة من خلال توسيع الموجّهات والمبدّلات التقليدية لدعم قدرٍ صغيرٍ من المعالجة الخاصة بالتطبيقات، حيث يتواجد مثلًا ما يسمى بمبدّلات المستوى 7 أمام عناقيد الخادم server clusters، وتمرر طلبات HTTP إلى خادمٍ معين بناءً على عنوان URL المطلوب، وتظهر شبكات التراكب overlay networks بسرعةٍ مثل آليةٍ مختارةٍ لإدخال وظائف جديدةٍ إلى الإنترنت. يمكنك التفكير في التراكب على أنه شبكةٌ منطقيةٌ مُطبَّقةٌ فوق بعض الشبكات الأساسية، فقد بدأت الإنترنت من خلال هذا التعريف مثل شبكة تراكبٍ على الروابط التي توفرها شبكة الهاتف القديمة. يوضح الشكل السابق تراكبًا مطبَّقًا على شبكةٍ أساسية، وكل عقدة في شبكة التراكب موجودةٌ أيضًا في الشبكة الأساسية؛ أي أن هذا التراكب يعالج ويمرر الرزم بطريقةٍ خاصةٍ بالتطبيق. تُنفَّذ الروابط التي تربط عقد التراكب مثل أنفاق tunnels عبر الشبكة الأساسية، ويمكن أن توجد شبكات تراكبٍ متعددةٍ على نفس الشبكة الأساسية، فتطبّق كل منها سلوكها الخاص بالتطبيق، ويمكن أن تتداخل التراكبات، أي تراكبٌ فوق الآخر، وتُعامِل جميعُ أمثلة شبكات التراكب التي نُوقشت في هذا القسم الإنترنت اليوم على أنه الشبكة الأساسية. رأينا بالفعل أمثلةً عن إنشاء أنفاقٍ لتنفيذ الشبكات الوهمية الخاصة VPN، حيث تعامِل العقدُ الموجودة على طرفي النفق المسارَ متعدد القفزات بينها مثل رابطٍ منطقي واحد، ولا تدركُ العقد الممرَّرة عبر نفقٍ باستخدام رزم التمرير المستندة على الترويسة الخارجية أن العقد النهائية قد أرفَقت ترويسةً داخليةً. يوضح الشكل السابق ثلاث عقد تراكب (A وB وC) متصلةً بواسطة زوجٍ من الأنفاق. قد تتخذ عقدة التراكب B في هذا المثال قرارًا بتمرير الرزم من العقدة A إلى العقدة C استنادًا إلى الترويسة الداخلية IHdr، ثم ترفِق ترويسةً خارجية OHdr تحدّد العقدة C على أنها وِجهةٌ في الشبكة الأساسية. يمكن للعقد A وB وC تفسير كلٍّ من الترويسة الداخلية والخارجية، بينما لا تفهم الموجّهات الوسيطة سوى الترويسة الخارجية، وتكون للعقد A وB وC عناوينٌ في كلٍ من شبكة التراكب والشبكة الأساسية، ولكنها ليست عناوينًا متطابقةً بالضرورة؛ فقد يكون العنوان الأساسي هو عنوان IP مؤلَّفٌ من 32 بتًا، بينما قد يكون عنوان التراكب عنوانًا تجريبيًا مؤلفًّا من 128 بتًا. لا تحتاج شبكة التراكب إلى استخدام عناوينٍ تقليديةٍ على الإطلاق، ولكنها قد توجِّه بناءً على عناوين URL، أو أسماء النطاق أو استعلامات XML، أو حتى محتوى الرزمة. توجيه شبكة التراكب أبسط نوعٍ من التراكب هو الذي يوجد فقط لدعم استراتيجية توجيهٍ بديلة؛ حيث تُجرَى معالجةٌ إضافيةٌ على مستوى التطبيق في عُقد التراكب، حيث يمكنك استخدام شبكةٍ وهميةٍ خاصة VPN بمثابة مثالٍ عن توجيه شبكات التراكب، ولكن لا يحدد هذا المثال الكثير لاستراتيجيةٍ أو خوارزميةٍ بديلة، لأنه يدخل مدخلات جدول توجيهٍ بديلة لتُعالَج بواسطة خوارزمية تمرير IP القياسية، حيث يُقال في هذه الحالة بالذات أن التراكب يستخدم أنفاق IP، وتُدعمَ القدرة على استخدام شبكات VPN هذه في العديد من الموجّهات التجارية. لنفترض أنك أردت استخدام خوارزمية توجيه لم يرغب مصنّعو الموجّهات التجارية في تضمينها في منتجاتهم. إذًا ماذا ستفعل؟ يمكنك ببساطةٍ تشغيل الخوارزمية الخاصة بك على مجموعةٍ من المضيفين النهائيين، وتشغيل النفق عبر موجّهات الإنترنت، حيث سيتصرّف هؤلاء المضيفون مثل موجهاتٍ في شبكة التراكب، أي مثل مضيفين متصلين بالإنترنت، من خلال رابطٍ فيزيائيٍ واحدٍ فقط، ويتصرفون مثل عقدةٍ في التراكب، ويُوصلون بالعديد من الجيران عبر الأنفاق. تُعَد التراكبات وسيلةٌ لإدخال تقنياتٍ جديدةٍ مستقلةٍ عن المعايير الأساسية، فلا توجد تراكباتٌ معياريةٌ يمكننا الإشارة إليها على أنها أمثلة، لذلك سنوضح الفكرة العامة لتوجيه التراكبات من خلال وصف العديد من الأنظمة التجريبية التي أنشأها باحثو الشبكات. إصدارات تجريبية من بروتوكول IP تُعَد التراكبات مثاليةً لنشر إصدارات تجريبية من بروتوكول IP التي تأمل أن تسيطر على العالم في النهاية، حيث بدأ بث IP المتعدد على سبيل المثال مثل إضافةٍ لبروتوكول IP، ولكن لم يُفعَّل في العديد من موجهات الإنترنت حتى اليوم، كما كانت شبكة MBone شبكة العمود الفقري متعدد البث multicast backbone عبارةً عن شبكة تراكب طبّقت بروتوكول IP متعدد البث على التوجيه أحادي البث الذي يوفره الإنترنت. وقد طُوِّرت أدوات المؤتمرات متعددة الوسائط ونُشِرت على شبكة Mbone، حيث بُثَّت اجتماعات منظمة IETF التي تستغرق أسبوعًا وتجذب الآلاف من المشاركين لسنواتٍ عديدة عبر شبكة MBone على سبيل المثال، ولكن حلّ التوافر الواسع لأدوات المؤتمرات التجارية محل النهج القائم على شبكة MBone. استخدمت شبكة MBone مثل شبكات VPN كلًا من أنفاق وعناوين IP، ولكنها طبّقت خوارزمية تمريرٍ مختلفةٍ عن تلك المستخدمة في شبكات VPN، حيث استخدمت تمرير الرزم إلى جميع الأجهزة الموجودة تحتها في المسار الأقصر لشجرة البث المتعدد. تمر الموجهات ذات البث المتعدد عبر نفقٍ من الموجهات القديمة مثل تراكب overlay، على أمل ألا تكون هناك يومًا ما موجهاتٌ قديمة. كانت شبكة 6-BONE شبكة تراكبٍ مشابهة، واُستخدِمت لنشر الإصدار IPv6 تدريجيًا، حيث استخدمت شبكةُ 6-BONE، مثل شبكة MBone، الأنفاقَ لتمرير الرزم عبر موجّهات IPv4، لكن لم تقدّم عقد شبكة 6-BONE تفسيرًا جديدًا لعناوين IPv4 المؤلفة من 32 بتًا على عكس شبكة MBone، حيث مررت العقد الرزم بناءً على حيز عناوين IPv6 ذات 128 بتًا، ودعمت شبكة 6-BONE أيضًا بث IPv6 المتعدد. بث النظام النهائي المتعدد End System Multicast بث بروتوكول IP المتعدد شائعٌ بين الباحثين وقطاعات معينة من مجتمع الشبكات، إلا أن نشره في الإنترنت العالمي كان محدودًا. لذلك تحوّلت التطبيقات القائمة على البث المتعدد مثل مؤتمرات الفيديو مؤخرًا إلى استراتيجيةٍ بديلةٍ، هي بث النظام النهائي المتعدد، حيث تتمثل فكرة هذه الاستراتيجية في قبول أن البث المتعدد لبروتوكول IP لن يصبح موجودًا في كل مكانٍ مطلقًا، ولذلك يُسمَح للمضيفين النهائيين المشاركين في تطبيقٍ معينٍ قائمٍ على البث المتعدد بتطبيق أشجار البث المتعدد الخاصة بهم. يجب أن نفهم أولًا أن بث النظام النهائي المتعدد، على عكس شبكات VPN وMBone، يفترض مشاركة مضيفي الإنترنت فقط دون موجهات الإنترنت في التراكب، ويتبادل هؤلاء المضيفون الرسائل مع بعضهم بعضًا من خلال أنفاق UDP، بدلًا من أنفاق IP، مما يسهّل تنفيذها مثل برامج تطبيقاتٍ عادية، ويؤدي إلى إمكانية عرض الشبكة الأساسية مثل رسمٍ بيانيٍ متصلٍ بالكامل، حيث أن كل مضيف في الإنترنت قادرٌ على إرسال رسالةٍ إلى كل مضيفٍ آخر. إذًا، يحل بث النظام النهائي المتعدد مشكلة العثور على شجرة البث المتعدد المضمَّنة التي تمتد عبر جميع أعضاء المجموعة، بدءًا من رسمٍ بيانيٍ متصلٍ بالكامل يمثّل الإنترنت. لاحظ أن هناك نسخةً أبسط من هذه المشكلة من خلال التوافر الجاهز للآلات الافتراضية VM المستضافة على السحابة حول العالم، حيث يمكن أن تعمل الأنظمة النهائية ذات البث المتعدد آلاتٍ افتراضيةٍ في مواقعٍ متعددة؛ هذه المواقع معروفةٌ جيدًا وثابتةٌ نسبيًا، لذلك يمكن إنشاء شجرةٍ ثابتةٍ متعددة البث في السحابة، ويمكن جعل المضيفين النهائيين الفعليين يتصلون ببساطةٍ بأقرب موقعٍ سحابي. بما أننا نفترض أن شبكة الإنترنت الأساسية متصلةٌ بصورةٍ كاملة، فإن الحل البسيط هو أن يكون كل مصدر متصلًا مباشرةً بكل عضوٍ في المجموعة، أي يمكن تطبيق بث النظام النهائي المتعدد من خلال إرسال كل عقدةٍ رسائل أحادية البث إلى كل عضوٍ في المجموعة. ضع في حساباتك مثال مخطط الشبكة الموضح في الشكل السابق لفهم المشكلة، حيث أن الموجهَين R1 وR2 متصلان باستخدام رابط عابرٍ للقارات بحيز نطاقٍ تراسلي منخفض، والمضيفات A وB وC وD هي مضيفاتٌ نهائية وتأخيرات الروابط مُعطاةٌ مثل أوزانٍ للأضلاع. بافتراض أن المضيف A أراد إرسال رسالةٍ متعددة البث إلى المضيفين الثلاثة الآخرين مثلما يوضح الشكل السابق كيف سيعمل البث الأحادي البسيط، لكنه غير مرغوبٍ لأن نفس الرسالة يجب أن تعبر الرابط بين المضيف A والموجّه R1 ثلاث مرات، وتعبر نسختان من الرسالة الرابط بين الموجه R1 والموجه R2. يوضح الشكل السابق أيضًا شجرة بث IP المتعدد التي أنشأها بروتوكول التوجيه متعدد البث لمُتجّه المسافات Distance Vector Multicast Routing Protocol -أو اختصارًا DVMRP. يلغي هذا الأسلوب الرسائل الزائدة، لكن بدون دعمٍ من الموجهات، فإن أفضل ما يمكن تتمناه من بث النظام النهائي المتعدد هو شجرةٌ مشابهةٌ لتلك الموضحة في الشكل السابق، حيث يحدد بث النظام النهائي المتعدد معماريةً لإنشاء هذه الشجرة. يتمثل النهج العام في دعم مستوياتٍ متعددةٍ من شبكات التراكب، حيث يَستخرج كلٌ منها رسمًا بيانيًا فرعيًا من التراكب الموجود أسفله، حتى نختار الرسم البياني الفرعي الذي يتوقعه التطبيق. يحدث هذا على مرحلتين بالنسبة إلى بث النظام النهائي المتعدد، هما: إنشاء تراكبٍ شبكيٍ بسيط على شبكة الإنترنت المتصلة بالكامل. اختيار شجرةٍ متعددة البث داخل هذه الشبكة. يوضح الشكل السابق هذه الفكرة، بافتراض وجود المضيفين النهائيين الأربعة A وB وC وD. بمجرد اختيار شبكة تراكب شبكة مناسبة، نشغّل خوارزميةَ توجيه البث المتعدد القياسية مثل بروتوكول DVMRP فوقها لبناء شجرة البث المتعدد. يمكننا أيضًا تجاهل مشكلة قابلية التوسع التي يواجهها البث المتعدد على مستوى الإنترنت، حيث يمكن تحديد الشبكة الوسيطة لتضمين فقط العقد التي ترغب في المشاركة في مجموعة بثٍ متعدد معينة. إن مفتاح إنشاء شبكة تراكبٍ وسيطة هو تحديد مخطط شبكةٍ متوافق تقريبًا مع مخطط شبكة الإنترنت الأساسي، ولكن يجب علينا فعل ذلك دون أن نعلم بما يبدو عليه الإنترنت الأساسي في الواقع، نظرًا لأننا نعمل فقط على المضيفين النهائيين وليس على الموجّهات. تتمثل الإستراتيجية العامة للمضيفين النهائيين في قياس زمن الانتقال ذهابًا وإيابًا إلى العقد الأخرى واتخاذ قرار إضافة روابطٍ إلى الشبكة فقط عندما تكون الأمور جيدةً، حيث يحصل ذلك على النحو التالي: أولًا، افترض وجود شبكةٍ بالفعل، حيث تتبادل كل عقدةٍ قائمةً list بجميع العقد الأخرى التي تعتقد أنها جزءٌ من الشبكة مع جيرانها المتصلين مباشرةً. إذا تلقّت العقدة قائمةَ العضوية من أحد الجيران، فإنها تدمج تلك المعلومات في قائمة العضوية الخاصة بها وتمرر القائمة الناتجة إلى جيرانها. تنتشر هذه المعلومات في النهاية عبر الشبكة، كما هو الحال في بروتوكول توجيه متجه المسافات. إذا أراد مضيفٌ الانضمام إلى شبكة تراكب البث المتعدد، فيجب أن يعرف عنوان IP لعقدةٍ أخرى على الأقل موجودةٍ بالفعل في شبكة التراكب، ثم يرسل رسالة الانضمام إلى الشبكة join mesh إلى هذه العقدة، وهذا يربط العقدة الجديدة بالشبكة عن طريق ضلعٍ إلى العقدة المعروفة. قد ترسل العقدة الجديدة رسالة انضمامٍ إلى عقدٍ حالية متعددة، وبالتالي تنضم إلى الشبكة عن طريق روابطٍ متعددة، وترسل العقدة الجديدة دوريًا رسائل أنها لا زالت نشطة keepalive إلى جيرانها بمجرد توصيلها بالشبكة من خلال مجموعةٍ من الروابط، لإعلام جيرانها بأنها لا تزال تريد أن تكون جزءًا من المجموعة. ترسل العقدة التي تغادر المجموعة رسالة ترك الشبكة leave mesh إلى جيرانها المتصلين مباشرةً، وتُنشَر هذه المعلومات إلى العقد الأخرى في الشبكة عبر قائمة العضوية الموضحة أعلاه. يمكن أن تفشل العقدة أو تقرر ترك المجموعة بصمت، وفي هذه الحالة يكتشف جيرانها أنها لم تَعُد ترسل رسائل keepalive. بعض حالات مغادرة العقدة لها تأثيرٌ ضئيلٌ على الشبكة، ولكن إذا اكتشفت العقدة أن الشبكة أصبحت مقسَّمةً بسبب مغادرة عقدةٍ ما، فإنها تنشئ ضلعًا جديدًا إلى عقدةٍ في القسم الآخر بإرسال رسالة انضمام إلى الشبكة. لاحظ أنه يمكن للجيران المتعددين أن يقرروا في نفس الوقت حدوث تقسيمٍ في الشبكة، مما يؤدي إلى إضافة أضلاعٍ متعددة إلى الأقسام المتقاطعة من الشبكة. ستتشكّل في النهاية شبكةٌ تمثل رسمًا فرعيًا من شبكة الإنترنت الأصلية المتصلة بالكامل، ولكن قد يكون لها أداءٌ دون المستوى الأمثل للأسباب الأربعة التالية: اختيار الجار الأولي يضيف روابطًا عشوائيةً إلى مخطط الشبكة. قد يضيف إصلاح التقسيم أضلاعًا أساسيةً في الوقت الحالي، ولكنها ليست مفيدةً على المدى الطويل. قد تتغير عضوية المجموعة بسبب عمليات الانضمام والمغادرة الديناميكية. قد تتغير ظروف الشبكة الأساسية. ما يجب أن يحدث هو أن يقيّم النظام قيمة كل ضلع، مما يؤدي إلى إضافة أضلاعٍ جديدة إلى الشبكة وإزالة الأضلاع الموجودة بمرور الوقت. لإضافة أضلاعٍ جديدة، تتحقق كل عقدةٍ i دوريًا من بعض الأعضاء العشوائية j التي لا تتصل بها حاليًا في الشبكة، وتقيس زمن انتقال الأضلاع ذهابًا وإيابًا (i,j)، ثم تقيّم فائدة إضافة هذا الضلع، حيث يُضاف الرابط (i,j) إلى الشبكة إذا كانت الفائدة أعلى من حدٍ معين. يكون تقييم فائدة إضافة الضلع (i,j) على النحو التالي: EvaluateUtility(j) utility = 0 for each member m not equal to i CL = current latency to node m along route through mesh NL = new latency to node m along mesh if edge (i,j) is added} if (NL < CL) then utility += (CL - NL)/CL return utility قرار إزالة ضلعٍ مماثلٌ لإضافة ضلع باستثناء أن كل عقدة i تحسب تكلفة كل رابطٍ إلى الجار الحالي j على النحو التالي: EvaluateCost(j) Cost[i,j] = number of members for which i uses j as next hop Cost[j,i] = number of members for which j uses i as next hop return max(Cost[i,j], Cost[j,i]) ثم تختار العقدة الجار ذا التكلفة الأقل، وتلغيه إذا انخفضت التكلفة إلى ما دون حدٍ معين. أخيرًا، بما أن الحفاظ على الشبكة يحدث باستخدام بروتوكول متجه مسافة، فلا يُعَد تشغيل بروتوكول DVMRP للعثور على شجرة البث المتعدد المناسبة في الشبكة أمرًا مفيدًا. لاحظ أنه ليس من الممكن إثبات أن البروتوكول الموصوف للتو ينتج عن شبكةٍ مثلى، مما يسمح لبروتوكول DVMRP بتحديد أفضل شجرةٍ متعددة البث ممكنة، لكن تشير كلٌ من المحاكاة والخبرة العملية الواسعة إلى أنها تعمل جيدًا. شبكات التراكب المرنة Resilient Overlay Networks يمكن أن يؤدي التراكب وظيفةً أخرى وهي إيجاد طرقٍ بديلة لتطبيقات البث الأحادي التقليدية، حيث تستغل هذه التراكباتُ الملاحَظةَ التي تفيد بأن عدم المساواة في المثلث لا ينطبق على شبكة الإنترنت. يوضح الشكل الآتي ما نعنيه بذلك، فليس غريبًا العثور على ثلاثة مواقعٍ على الإنترنت A وB وC، بحيث يكون زمن الانتقال بين الموقعين A وB أكبرُ من مجموع فترات الانتقال من الموقع A إلى الموقع C، ومن الموقع C إلى الموقع B؛ أي يُفضَّل في بعض الأحيان إرسال الرزم الخاصة بك بصورةٍ غير مباشرة عبر عقدةٍ وسيطةٍ بدلًا من إرسالها مباشرةً إلى الوِجهة. لكن كيف يمكن أن يحدث هذا؟ لم يَعِد بروتوكول البوابة الحدودية Border Gateway Protocol -أو اختصارًا BGP- أبدًا بأنه سيجد أقصر مسارٍ بين أي موقعين، فهو يحاول فقط إيجاد مسارٍ ما. تتأثر مسارات بروتوكول BGP بشدة بأمور السياسات policy، مثل سياسة من يدفع لمن ينقل حركة المرور. يحدث هذا غالبًا عند نقاط التناظر بين مزودي خدمة الإنترنت الأساسيين، فلا ينبغي أن يكون عدم وجود مساواة بمثلثٍ في شبكة الإنترنت أمرًا مفاجئًا. كيف نستغل هذه الملاحظة؟ تتمثل الخطوة الأولى في إدراك أن هناك مقايضةً أساسيةً بين قابلية التوسع والأمثلية لخوارزمية التوجيه. ويتوسّع نطاق بروتوكول BGP لشبكات كبيرة جدًا، ولكنه غالبًا لا يختار أفضل مسارٍ ممكن ويكون بطيئًا في التكيف مع انقطاعات الشبكة؛ فإذا كنت قلقًا فقط بشأن العثور على أفضل مسارٍ بين عددٍ قليلٍ من المواقع، فيمكنك التوجّه إلى عملٍ أفضل بكثير من مراقبة جودة كل مسار قد تستخدمه، مما يتيح لك تحديد أفضل مسارٍ ممكنٍ في أي لحظة. أدّى تراكبٌ تجريبي يُسمى شبكة التراكب المرنة Resilient Overlay Network -أو اختصارًا RON- ذلك بالضبط، حيث توسّعت شبكة RON إلى بضع عشراتٍ فقط من العقد، وذلك لأنها استخدمت استراتيجية N × N لمراقبة ثلاثة جوانبٍ لجودة المسار عن كثب عبر بحثٍ نشطٍ بين كل زوجٍ من المواقع، وهذه الجوانب الثلاثة هي: زمن الانتقال latency، وحيز النطاق التراسلي bandwidth المتاح، واحتمالية الخسارة loss probability. أصبحت شبكة RON بعد ذلك قادرةً على تحديد المسار الأمثل بين أي زوجٍ من العقد، وتغيير المسارات بسرعةٍ في حالة تغير ظروف الشبكة، فقد أظهرت التجربة أن شبكة RON كانت قادرةً على تقديم تحسيناتٍ متواضعة في الأداء للتطبيقات، ولكن الأهم من ذلك أنها تعافت من أعطال الشبكة بسرعةٍ أكبر. اكتشَف مثيلٌ لشبكة RON يعمل على 12 عقدةً 32 انقطاعًا استمر لأكثر من 30 دقيقةً خلال فترةٍ واحدةٍ مدتها 64 ساعةً في عام 2001 على سبيل المثال، وتمكَّن من التعافي منها جميعًا في أقل من 20 ثانيةً وسطيًا. اقترحت هذه التجربة أيضًا أن تمرير البيانات من خلال عقدةٍ وسيطةٍ واحدةٍ فقط يكون كافيًا عادةً للتعافي من حالات فشل الإنترنت. بما أن شبكة RON غير مصمَّمةٍ لتكون نهجًا قابلًا للتوسّع، فلا يمكن استخدامها لمساعدة المضيف العشوائي A على التواصل مع المضيف العشوائي B؛ أي يجب أن يعرف المضيفان A وB مسبقًا أنه من المُحتمَل أن يتواصلا، ثم ينضما إلى نفس شبكة RON. تُعَد شبكة RON فكرةً جيدةً في إعداداتٍ معينة، مثل توصيل بضع عشراتٍ من مواقع الشركات المنتشرة عبر الإنترنت أو السماح لك أنت و50 صديقٍ من أصدقائك بإنشاء شبكة تراكبٍ خاصة بك من أجل تشغيل بعض التطبيقات، حيث تطبَّق هذه الفكرة اليوم مع الاسم التسويقي Software-Defined WAN -أو اختصارًا SD-WAN-، لكن السؤال الحقيقي هو ماذا يحدث عندما يبدأ الجميع في تشغيل شبكة RON الخاصة بهم؟ وهل يؤدي حمل الملايين من شبكات RON التي تستكشف المسارات بقوة إلى إغراق الشبكة؟ وهل يرى أي شخصٍ تحسّن السلوك عندما تتنافس عدة شبكات RON على نفس المسارات؟ لا تزال هذه الأسئلة دون إجابة. توضِّح كل هذه التراكبات مفهومًا أساسيًا لشبكات الحاسوب هو الافتراضية virtualization، أي يمكن بناء شبكةٍ افتراضية من موارد مجردة أو منطقية على شبكةٍ فيزيائيةٍ مبنيةٍ من موارد فيزيائية أيضًا. يمكن تكديس هذه الشبكات الافتراضية فوق بعضها بعضًا، كما ويمكن أن تتعايش شبكاتٌ افتراضيةٌ متعددةٌ على نفس المستوى، حيث توفر كل شبكةٍ افتراضيةٍ بدورها إمكاناتٍ جديدة ذات قيمة لمجموعةٍ معينةٍ من المستخدمين، أو التطبيقات، أو الشبكات ذات المستوى الأعلى. ترجمة -وبتصرّف- للقسم Overlay Networks من فصل Applications من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا المقال السابق: تطبيقات البنية التحتية في الشبكات الحاسوبية تطبيقات الشبكات الحاسوبية: خدمات الويب تطبيق مبدلات وموجهات الشبكات الحاسوبية برمجيا وعتاديا
-
يبذل كريتا Krita قصارى جهده للحفاظ على عملك آمنًا. ولكن إذا أردت التأكّد من أنك لن تفقد عملك، فستحتاج إلى فهم كيفية الحفظ والحفظ التلقائي ونسخ الملفات الاحتياطي في كريتا. الحفظ لا يخزّن كريتا صورك في مكانٍ ما دون تدخلك، لذلك يجب أن تحفظ عملك بنفسك، وإلّا فسيضيع دون رجعة. يحفظ كريتا صورك بتنسيقات عديدة، لكن يجب عليك دائمًا حفظ عملك بتنسيق كريتا الأصلي .kra لأنه يدعم جميع ميزات كريتا. كما يمكنك تصدير عملك إلى تنسيقات أخرى للتوافق مع التطبيقات الأخرى أو النشر على الويب أو على الورق. سيعطيك كريتا تحذيرًا يوضّح فيه أيَّ جانب من جوانب عملك سيُفقَد عندما تحفظه بتنسيق آخر غير تنسيق .kra ويعرض عليك إنشاء ملف .kra. إذا حفظت عملك، فسيسألك كريتا عن المكان الذي يجب حفظ عملك فيه على حاسوبك، وهذا المكان هو مجلد الصور Pictures ضمن مجلد المستخدم User افتراضيًا في جميع أنظمة التشغيل. إذا استخدمت خيار حفظ كـ Save As، فستُحفَظ صورتك باسم جديد دون حذف الملف الأصلي الذي يحمل اسم القديم، بحيث يُحفَظ ملفك بالاسم الجديد من الآن فصاعدًا. إذا استخدمتَ خيار تصدير Export باسم ملف جديد، فسينشأ ملف جديد باسم جديد، لكن سيحتفظ الملف الذي فتحته بالاسم القديم، حيث سيُحفَظ بالاسم القديم في المرة التالية التي تحفظه فيها. يمكنك في كريتا استخدام خيار الحفظ Save والحفظ كـ Save As، والتصدير Export إلى أيّ تنسيق ملف تريده. حفظ وتصدير وفتح الملفات توجد نسخة يمكن تعديلها من الملف الذي ينشئه أو يفتحه كريتا في الذاكرة، فهذا جزء من طريقة عمل الحواسيب التي تنشئ نسخةً من ملفها في ذاكرة RAM، وبالتالي يأخذ كريتا عند الحفظ نسخته وينسخها فوق الملف الحالي. حفظ Save: يحفظ كريتا الصورة الحالية في ذاكرته في مكان محدَّد على القرص الصلب. إن لم تُحفَظ الصورة من قبل، فسيسألك كريتا عن مكان حفظها. حفظ كـ Save As: ينشئ هذا الخيار نسخة من ملفك الحالي عن طريق حفظه باسم مختلف، وسيتحول كريتا إلى الملف المُنشَأ حديثًا بوصفه المستند النشط حاليًا. فتح Open: يفتح هذا الخيار ملفًا محفوظًا. تصدير Export: يحفظ هذا الخيار ملفًا في موقع جديد دون فتحه ليكون نشطًا، وهو مفيد عندما تعمل على ملف ذي طبقات متعددة، لكنك ستحتاج إلى حفظ نسخة مسطحة flattened منه في مكان معين. فتح مستند موجود مسبقًا كمستند غير معنون Open Existing Document as Untitled Document: يفتح هذا الخيار ملفًا وينسى المكان الذي حفظته فيه، لذلك إذا ضغطتَ على "حفظ save" فسيسألك عن مكان حفظه. يسمى هذا الخيار "استيراد import" في برامج أخرى. إنشاء نسخة من الصورة الحالية Create Copy from Current Image: ينشئ نسخة جديدة من الصورة الحالية، حيث يشبه الخيار فتح مستند موجود مسبقًا كمستند غير معنون Open Existing Document as Untitled Document، ولكنه يتعامل مع الملفات المفتوحة حاليًا. حفظ نسخة تزايدية Save Incremental Version: يحفظ الصورة الحالية باسم filename_XXX.kra ويحوّل المستند الحالي إليها. حفظ نسخة احتياطية تزايدية Save Incremental Backup: ينسخ ويعيد تسمية آخر نسخة محفوظة من ملفك إلى ملف نسخة احتياطية ويحفظ المستند بالاسم الأصلي. الحفظ التلقائي الحفظ التلقائي AutoSave هو ما يحدث عندما تعمل قليلًا ولا تحفظ عملك بنفسك، فيحفظ كريتا عملك، حيث تُخفَى ملفات الحفظ التلقائي افتراضيًا ضمن مدير ملفاتك، لكن يمكنك ضبط الإصدار 4.2 والإصدارات الأحدث من كريتا لإنشاء ملفات الحفظ التلقائي المرئية في مدير الملفات. يحفظ كريتا ملفك تلقائيًا كل خمس عشرة دقيقة افتراضيًا، لكن يمكنك ضبط هذه العملية من تبويب ملف File في صفحة الإعدادات العامة General Settings من نافذة ضبط كريتا Configure Krita التي يمكنك الوصول إليها في قائمة إعدادات Settings في نظامي تشغيل ويندوز ولينكس أو من قائمة تطبيق Application في نظام ماك. إن أغلقت برنامج كريتا دون حفظ، فستفقد عملك غير المحفوظ ولا يمكن استرجاعه، كما أن إغلاق كريتا يعني إزالة ملفات الحفظ التلقائي. هناك احتمالان للحفظ التلقائي هما: لم تحفظ عملك على الإطلاق. حفظت عملك فعليًا. الحفظ التلقائي للملفات غير المحفوظة إن لم تحفظ عملك بعد، فسينشئ كريتا ملف حفظ تلقائي بدون اسم. إن استخدمت نظام لينكس أو ماك، فسيكون ملف الحفظ التلقائي ملفًا مخفيًا في شجرة الملفات الرئيسية. بينما إن استخدمت نظام ويندوز، فسيكون ملف الحفظ التلقائي ملفًا في مجلد %TEMP% الخاص بمستخدمك. يمكنك ضبط كريتا في الإصدار 4.2 والإصدارات الأحدث من كريتا لجعل ملفات الحفظ التلقائي مرئية افتراضيًا. يُسمَّى ملف الحفظ التلقائي المخفي مثل الاسم .krita-12549-document_1-autosave.kra إذا تعطّل كريتا قبل حفظ ملفك، فسترى هذا الملف في نافذة تظهر عند بدء كريتا في المرة التالية التي تشغّله بها، حيث يمكنك اختيار استعادة الملفات أو حذفها. إذا تعطّل كريتا عند استخدام نظام ويندوز ومُسِح مجلد %TEMP%، فستفقد عملك. لا يمسح ويندوز المجلد %TEMP% افتراضيًا، ولكن يمكن تفعيل هذه الميزة في الإعدادات، كما توجد بعض التطبيقات مثل Disk Cleanup أو CCleaner التي تمسح المجلد %TEMP%. تذكّر أنه إن تعطّل كريتا ولم تحفظ عملك، وجرى تفعيل شيءٍ ما يمسح مجلد %TEMP%، فستفقد عملك. إن لم يتعطل كريتا وأغلقته دون حفظ عملك، فسيزيل كريتا ملف الحفظ التلقائي، وبالتالي سيختفي عملك ولا يمكنك استعادته، وإذا حفظت عملك وتابعت العمل أو أغلقت كريتا وحفظت عملك، فسيُزال ملف الحفظ التلقائي أيضًا. الحفظ التلقائي للملفات المحفوظة إذا حفظت عملك، فسينشئ كريتا ملف حفظ تلقائي باسم، وسيكون هذا الملف المخفي بالشكل: .myimage.kra-autosave.kra. تُخفَى ملفات الحفظ التلقائي المسمَّاة افتراضيًا، وتوضَع في المجلد نفسه الموجود فيه الملف الذي تعمل عليه. إذا شغّلت كريتا مرة أخرى بعد تعطّله وحاولت فتح ملفك الأصلي، فسيظهِر كريتا الرسالة التالية التي تسألك عن فتح ملف الحفظ التلقائي بدلًا من فتح الملف الأصلي: إذا اخترت "لا"، فسيُزال ملف الحفظ التلقائي، وستفقد العمل الذي أجريته منذ آخر مرة حفظتَ فيها الملف بنفسك ولا يمكن استرجاعه. بينما إذا اخترت "نعم"، فسيفتح كريتا ملف الحفظ التلقائي ثم يزيله، حيث سيكون للملف الذي فتحته اسم ملفك الأصلي. سيُعَد الملف مُعدَّلًا، لذا سيسألك كريتا عن حفظ الملف في المرة القادمة التي تحاول فيها إغلاق كريتا، فإن لم ترِد حفظه، فسيذهب عملك بلا رجعة ولا يمكنك استعادته. إذا استخدمتَ خيار حفظ كـ Save As، فستُحفَظ صورتك باسم جديد دون حذف الملف الأصلي الذي يحمل الاسم الأصلي وملف الحفظ التلقائي الخاص به. يُحفَظ ملفك بالاسم الجديد من الآن فصاعدًا، حيث إذا حفظته مرة أخرى، فسيُنشَأ ملف حفظ تلقائي باسم الملف الجديد. إذا استخدمت خيار تصدير Export باسم ملف جديد، فسيُنشَأ ملف جديد باسم جديد، وسيحتفظ الملف الذي فتحته بالاسم الجديد، وسيُنشَأ ملف الحفظ التلقائي من آخر ملف محفوظ بالاسم الحالي في المرة التالية التي تحفظه فيها، وهو ليس الاسم الذي تختاره عند استخدام خيار تصدير Export. ملفات النسخ الاحتياطي هناك ثلاثة أنواع من ملفات النسخ الاحتياطي هي: ملفات النسخ الاحتياطي العادية Ordinary Backup التي تنشأ عند حفظ ملف مفتوح من القرص الصلب. ملفات النسخ الاحتياطي التزايدية Incremental Backup التي هي نسخ من الملف بحيث تكون هذه النسخ الاحتياطية المرقمة للملف كما هو موجود على القرص الصلب وأثناء حفظ الملف بالاسم الحالي. ملفات الإصدارات التزايدية Incremental Version التي تحفظ الملف الذي تعمل عليه برقم جديد دون المساس بالملفات الموجودة على القرص الصلب. ملفات النسخ الاحتياطي العادية يحفظ كريتا نسخة احتياطية من ملفك، إذا فتحت ملفًا وأجريت تعديلات عليه ثم حفظته أو إذا حفظت ملفًا جديدًا بعد المرة الأولى التي تحفظه فيها. يمكنك تعطيل هذه الآلية من تبويب ملف File في صفحة الإعدادات العامة General Settings من نافذة ضبط كريتا Configure Krita التي يمكنك الوصول إليها من قائمة إعدادات Settings في نظامي ويندوز ولينكس أو من قائمة تطبيق Application في نظام ماك، إذ تكون ملفات النسخ الاحتياطي مفعَّلة افتراضيًا. يكون ملف النسخ الاحتياطي في مجلد الملف الأصلي افتراضيًا، ويمكنك اختيار حفظ ملفات النسخ الاحتياطي في مجلد المستخدم User أو مجلد %TEMP%، حيث لا يُعَد ذلك آمنًا لأنك إذا عدّلتَ ملفين بالاسم نفسه في مجلدين مختلفين، فستحل النسخ الاحتياطية الخاصة بهما محل بعضهما البعض. يكون لملف النسخ الاحتياطي اللاحقة ~ افتراضيًا، لتمييزه عن الملف العادي. يجب تفعيل خيار إظهار امتدادات الملفات show file extensions في مستكشف ويندوز عند استخدام نظام ويندوز لرؤية الامتداد. إذا أردت فتح ملف النسخ الاحتياطي، فيجب عليك إعادة تسميته في مدير الملفات والتأكّد من أن الامتداد ينتهي بـ .kra. تُنسَخ آخر نسخة من ملفك بدون اللاحقة ~ في كل مرة تحفظه فيها إلى النسخة التي تحمل اللاحقة ~، وستختفي محتويات الملف الأصلي، حيث لا يمكنك استعادة هذه النسخة. ملفات النسخ الاحتياطي التزايدية تشبه ملفاتُ النسخ الاحتياطي التزايدية ملفاتَ النسخ الاحتياطي العادية، إذ تُنسَخ الحالة المحفوظة الأخيرة إلى ملف آخر قبل الحفظ مباشرة، ولكن تُرقَّم ملفات النسخ الاحتياطي بدلًا من استبدال ملف النسخ الاحتياطي. يمكنك استخدام ملفات النسخ الاحتياطي التزايدية عندما تريد الاحتفاظ بمجموعة من حالات صورتك الجيدة خلال عملية الرسم، ولكن سيستهلك ذلك مساحة أكبر على القرص الصلب بالطبع. لا يحفظ كريتا حالة عملك الحالية في أحدث ملف تزايدي، ولكنه ينسخ آخر ملف محفوظ إلى ملف نسخ احتياطي ثم يحفظ صورتك باسم الملف الأصلي. ملفات الإصدارات التزايدية يشبه الإصدار التزايدي النسخَ الاحتياطي التزايدي بعض الشيء ولكن دون المساس بالملفات الأصلية، إذ يحفظ ملفًا جديدًا برقم ملف. ترجمة -وبتصرّف- للمقال Saving, AutoSave and Backup Files من موقع Krita. اقرأ أيضًا المقال السابق: دليل الصور والقوالب في كريتا المفاهيم الأساسية لكريتا النسخة الكاملة من كتاب: أساسيات تصميم الرسوميات
-
لغة الاستعلامات الهيكلية Structured Query Language -أو SQL اختصارًا- هي لغة قاعدة بيانات مصمَّمة لإدارة البيانات الموجودة في نظام إدارة قواعد البيانات العلائقية. طوّرت شركة IBM لغة SQL في أوائل السبعينات -عُرِفت بالإصدار 1986-، حيث صُمِّم الإصدار الأولي المسمَّى بلغة الاستعلامات الهيكلية الإنجليزية SEQUEL -اختصارًا للعبارة Structured English Query Language- لمعالجة واسترداد البيانات المخزَّنة في نظام خاص بشركة IBM وشبه علائقي لإدارة قواعد البيانات، ويُسمَّى نظام R. قدّمت بعد ذلك شركة Relational Software Inc -والتي أصبحت الآن شركة Oracle Corporation- أول تطبيق متاح تجاريًا للغة SQL والمسمَّى بـ Oracle V2 لحواسيب VAX في أواخر السبعينات. تُستخدَم العديد من أنظمة DBMS العلائقية المتاحة حاليًا، مثل: Oracle Database، وMicrosoft SQL Server -الموضَّح في الشكل التالي-، وMySQL، وIBM DB2، وIBM Informix، وMicrosoft Access، لغة SQL. تُستخدَم لغة قاعدة بيانات SQL في نظام DBMS من أجل: إنشاء بنى قواعد البيانات والجداول. إجراء الأعمال الأساسية لإدارة البيانات، مثل الإضافة والحذف والتعديل. إجراء استعلامات معقَّدة لتحويل البيانات الأولية إلى معلومات مفيدة. سوف نركز في هذا المقال على استخدام لغة SQL لإنشاء بنى قواعد البيانات والجداول، باستخدام لغة SQL على أساس لغة تعريف بيانات data definition language -أو DDL اختصارًا- بصورة أساسية. سنستخدم لغة SQL في مقال لاحق على أساس لغة معالجة بيانات data manipulation language -أو DML اختصارًا- لإدخال البيانات، وحذفها، واختيارها، وتحديثها في جداول قاعدة البيانات. إنشاء قاعدة بيانات Create Database تتكوّن عبارات لغة SQL DDL الرئيسية من: CREATE DATABASE وCREATE/DROP/ALTER TABLE، إذ تُستخدَم عبارة CREATE في لغة SQL لإنشاء بنى قواعد البيانات والجداول. إنشاء قاعدة بيانات تُنشَأ قاعدة بيانات جديدة تسمَّى SW باستخدام العبارة CREATE DATABASE SW بلغة SQL. الخطوة التالية بعد إنشاء قاعدة البيانات هي إنشاء جداول قاعدة البيانات. التنسيق العام للأمر CREATE TABLE هو: CREATE TABLE <tablename> ( ColumnName, Datatype, Optional Column Constraint, ColumnName, Datatype, Optional Column Constraint, Optional table Constraints ); يكون Tablename اسم جدول قاعدة البيانات مثل جدول الموظف Employee، كما يتكون كل حقل من الأمر CREATE TABLE من ثلاثة أجزا، هي: اسم العمود ColumnName. نوع البيانات Data type. قيد عمود اختياري Optional Column Constraint. يجب أن يكون اسم العمود ColumnName فريدًا في الجدول، وبعض الأمثلة على أسماء الأعمدة هي FirstName وLastName. أما نوع البيانات Data Type، فيجب أن يكون نوع بيانات نظام أو نوع بيانات يعرِّفه المستخدِم، كما تملك العديد من أنواع البيانات حجمًا، مثل (CHAR(35 أو (Numeric(8,2 وإليك قائمة بأشهر أنواع البيانات: النوع Bit: بيانات أعداد صحيحة Integer لها قيمة 1 أو 0. النوع Int: بيانات أعداد صحيحة Integer لها القيم من -2^31 أي (-2,147,483,648) حتى 2^31 – 1، أي (2,147,483,647). النوع Smallint: بيانات أعداد صحيحة Integer لها القيم من (-32,768) 2^15 أي حتى 2^15 – 1أي 32,767. النوع Tinyint: بيانات أعداد صحيحة Integer لها القيم من 0 حتى 255. النوع Decimal: بيانات ذات دقة ثابتة وقياس رقمي لها القيم من -10^38 -1 إلى 10^38. النوع Numeric: مرادف للنوع decimal. النوع Timestamp: رقم فريد على مستوى قاعدة البيانات. النوع Uniqueidentifier: معرَّف فريد عالميًا globally unique identifier -أو GUID اختصارًا-. النوع Money: تتراوح قيم البيانات النقدية من -2^63 أي -922,337,203,685,477.5808 حتى 2^63 – 1 أي 922,337,203,685,477.5807 بدقة تصل إلى واحد من عشرة آلاف من الوحدة النقدية. النوع Smallmoney: تتراوح قيم البيانات النقدية من -214,748.3648إلى +214,748.3647 بدقة تصل إلى واحد من عشرة آلاف من الوحدة النقدية. النوع Float: بيانات أرقام ذات دقة عشرية تتراوح قيمها بين -1.79E + 308و 1.79E + 308. النوع Real: بيانات أرقام ذات دقة عشرية قيمها تتراوح من -3.40E + 38 حتى 3.40E + 38. النوع Datetime: بيانات التاريخ والوقت تتراوح قيمها من January 1, 1753 إلى December 31, 9999 بدقة تبلغ واحد إلى ثلاثة أجزاء من مئة من الثانية، أو 3.33 ميلي ثانية. النوع Smalldatetime: بيانات التاريخ والوقت تتراوح قيمها من January 1, 1900 حتى June 6, 2079 بدقة تبلغ دقيقة واحدة. النوع Char: بيانات محارف ثابتة الطول وليست يونيكود بطول أقصى 8000 محرف. النوع Varchar: بيانات متغيرة الطول وليست يونيكود بحد أقصى 8000 محرف. النوع Text: بيانات متغيرة الطول وليست يونيكود بطول أقصى يبلغ 2^31 – 1 أي 2,147,483,647 محرفًا. النوع Binary: بيانات ثنائية ذات طول ثابت بطول أقصى 8000 بايت. النوع Varbinary: بيانات ثنائية متغيرة الطول بطول أقصى يبلغ 8000 بايت. النوع Image: بيانات ثنائية متغيرة الطول بطول أقصى 2^31 – 1 أي 2,147,483,647بايت. أخيرًا في ما يتعلق بقيود العمود الاختيارية Optional Column Constraints، فهي الآتي: NULL. NOT NULL. UNIQUE. PRIMARY KEY. DEFAULT. وتُستخدَم لتهيئة قيمة لسجل جديد. يشير قيد العمود NULL إلى أن القيمة الفارغة null مسموح بها، مما يعني أنه يمكن إنشاء صف بدون قيمة لهذا العمود؛ كما يشير قيد العمود NOT NULL إلى وجوب توفير قيمة عند إنشاء صف جديد. سنستخدم تعليمة لغة SQL للتوضيح والتي هي CREATE TABLE EMPLOYEES لإنشاء جدول موظفين يحتوي على 16 سمة attributes أو حقل fields. USE SW CREATE TABLE EMPLOYEES ( EmployeeNo CHAR(10) NOT NULL UNIQUE, DepartmentName CHAR(30) NOT NULL DEFAULT "Human Resources", FirstName CHAR(25) NOT NULL, LastName CHAR(25) NOT NULL, Category CHAR(20) NOT NULL, HourlyRate CURRENCY NOT NULL, TimeCard LOGICAL NOT NULL, HourlySalaried CHAR(1) NOT NULL, EmpType CHAR(1) NOT NULL, Terminated LOGICAL NOT NULL, ExemptCode CHAR(2) NOT NULL, Supervisor LOGICAL NOT NULL, SupervisorName CHAR(50) NOT NULL, BirthDate DATE NOT NULL, CollegeDegree CHAR(5) NOT NULL, CONSTRAINT Employee_PK PRIMARY KEY(EmployeeNo) ); الحقل الأول هو EmployeeNo من النوع CHAR، ويبلغ طول هذا الحقل 10 محارف، ولا يمكن للمستخدِم ترك هذا الحقل فارغًا NOT NULL، والحقل الثاني هو DepartmentName من النوع CHAR بطول 30. يُستخدَم قيد الجدول المعرَّف بواسطة الكلمة CONSTRAINT لإنشاء المفتاح الأساسي primary key، وذلك بعد تعريف جميع أعمدة الجدول، أي كما يلي: CONSTRAINT EmployeePK PRIMARY KEY(EmployeeNo) يمكننا إنشاء جدول أقسام Department، وجدول مشاريع Project، وجدول مهام Assignment باستخدام الأمر CREATE TABLE بلغة SQL DDL، كما هو موضَّح في المثال التالي: USE SW CREATE TABLE DEPARTMENT ( DepartmentName Char(35) NOT NULL, BudgetCode Char(30) NOT NULL, OfficeNumber Char(15) NOT NULL, Phone Char(15) NOT NULL, CONSTRAINT DEPARTMENT_PK PRIMARY KEY(DepartmentName) ); أُنشِئ جدول المشاريع project التالي بسبعة حقول هي: معرِّف المشروع ProjectID، واسم المشروع ProjectName، والقسم Department، والحد الأقصى للساعات MaxHours، وتاريخ البدء StartDate، وتاريخ الانتهاء EndDate. USE SW CREATE TABLE PROJECT ( ProjectID Int NOT NULL IDENTITY (1000,100), ProjectName Char(50) NOT NULL, Department Char(35) NOT NULL, MaxHours Numeric(8,2) NOT NULL DEFAULT 100, StartDate DateTime NULL, EndDate DateTime NULL, CONSTRAINT ASSIGNMENT_PK PRIMARY KEY(ProjectID) ); بينما أُنشِئ جدول المهام assignment بثلاثة حقول، هي: معرِّف المشروع ProjectID، ورقم الموظف EmployeeNumber، وساعات العمل HoursWorked. يُستخدَم جدول المهام لتسجيل الموظف باستخدام الحقل EmployeeNumber، ومقدار الوقت باستخدام الحقل HoursWorked الذي عمل فيه الموظف في مشروع معين باستخدام الحقل ProjectID، أي كما يلي: USE SW CREATE TABLE ASSIGNMENT ( ProjectID Int NOT NULL, EmployeeNumber Int NOT NULL, HoursWorked Numeric(6,2) NULL, ); قيود الجدول Table Constraints تُعرَّف قيود الجدول بواسطة الكلمة المفتاحية CONSTRAINT ويمكن استخدامها لتطبيق العديد من القيود الموضَّحة أدناه. القيد IDENTITY يمكننا استخدام قيد العمود الاختياري IDENTITY لتوفير قيمة فريدة تزايدية لهذا العمود، إذ تُستخدَم أعمدة الهوية Identity مع قيود المفتاح الرئيسي PRIMARY KEY لتكون بمثابة معرِّف صف فريد للجدول، كما يمكن إسناد الخاصية IDENTITY إلى عمود له نوع بيانات tinyint، أو smallint، أو int، أو decimal، أو numeric، وهذا القيد: يولِّد أرقامًا متسلسلةً. لا يفرض سلامة الكيان entity integrity. يمكن أن يحتوي عمود واحد فقط على الخاصية IDENTITY. يجب تعريفه على أساس نوع بيانات integer أو numeric أو decimal. لا يمكن تحديث عمود له الخاصية IDENTITY. لا يمكن أن يحتوي على قيم فارغة NULL. لا يمكنه ربط الافتراضات والقيود الافتراضية بالعمود. بالنسبة للقيد [(IDENTITY[(seed, increment: Seed: هي القيمة الأولية لعمود الهوية identity. Increment: هي القيمة المطلوب إضافتها إلى عمود الزيادة increment الأخير. سنستخدم مثال قاعدة بيانات آخر لتوضيح عبارات لغة SQL DDL بصورة أكبر من خلال إنشاء الجدول tblHotel في قاعدة بيانات الفندق HOTEL كما يلي: CREATE TABLE tblHotel ( HotelNo Int IDENTITY (1,1), Name Char(50) NOT NULL, Address Char(50) NULL, City Char(25) NULL, ) القيد UNIQUE يمنع القيد UNIQUE من إدخال قيم مكررة في عمود، حيث: يُستخدَم القيدان PK، و UNIQUE لفرض سلامة الكيان. يمكن تعريف قيود UNIQUE متعددة للجدول. يجري دائمًا التحقق من صحة البيانات الموجودة عند إضافة قيد UNIQUE إلى جدول موجود. يمكن وضع القيد UNIQUE على الأعمدة التي تقبل القيم الفارغة، حيث يمكن أن يكون صفٌ واحد فقط NULL. ينشِئ القيد UNIQUE دليلًا فريدًا للعمود المُختار تلقائيًا. الصيغة التالية هي الصيغة العامة للقيد UNIQUE: [CONSTRAINT constraint_name] UNIQUE [CLUSTERED | NONCLUSTERED] (col_name [, col_name2 […, col_name16]]) [ON segment_name] يستخدم المثال التالي القيد UNIQUE كما يلي: CREATE TABLE EMPLOYEES ( EmployeeNo CHAR(10) NOT NULL UNIQUE, ) القيد FOREIGN KEY المفتاح الخارجي يعرِّف القيد FOREIGN KEY -أو FK اختصارًا- عمودًا، أو مجموعة من الأعمدة التي تتطابق قيمها مع المفتاح الرئيسي PRIMARY KEY -أو PK اختصارًا- لجدول آخر، بحيث: تُحدَّث القيم في المفتاح الخارجي FK تلقائيًا عند تحديث أو تغيير قيم المفتاح الرئيسي PK في الجدول المرتبط. يجب أن تشير قيود المفتاح الخارجي FK إلى القيد المفتاح الرئيسي PK، أو القيد UNIQUE لجدول آخر. يجب أن يكون عدد أعمدة المفتاح الخارجي FK هو نفسه قيد المفتاح الرئيسي PK، أو قيد UNIQUE. إذا اُستخدِم الخيار WITH NOCHECK، فلن يتحقق قيد المفتاح الخارجي FK من صحة البيانات الموجودة في الجدول. لا يوجد دليل index للأعمدة التي تشارك في قيد المفتاح الخارجي FK. الصيغة التالية هي الصيغة العامة لقيد المفتاح الخارجي FOREIGN KEY: [CONSTRAINT constraint_name] [FOREIGN KEY (col_name [, col_name2 […, col_name16]])] REFERENCES [owner.]ref_table [(ref_col [, ref_col2 […, ref_col16]])] يكون الحقل HotelNo في المثال التالي في الجدول tblRoom مفتاحًا خارجيًا FK للحقل HotelNo في الجدول tblHotel الموضَّح سابقًا: USE HOTEL GO CREATE TABLE tblRoom ( HotelNo Int NOT NULL , RoomNo Int NOT NULL, Type Char(50) NULL, Price Money NULL, PRIMARY KEY (HotelNo, RoomNo), FOREIGN KEY (HotelNo) REFERENCES tblHotel ) القيد CHECK يقيِّد القيد CHECK القيم التي يمكن إدخالها في جدول، بحيث: يمكن أن يحتوي على شروط بحث مشابهة لعبارة WHERE. يمكنه الربط بين الأعمدة في نفس الجدول. يجب تقييم قاعدة التحقق من صحة البيانات للقيد CHECK من خلال تعبير بولياني boolean expression. يمكن تعريفه لعمود له قاعدة مرتبطة به. الصيغة التالية هي الصيغة العامة للقيد CHECK: [CONSTRAINT constraint_name] CHECK [NOT FOR REPLICATION] (expression) يقتصر حقل النوع Type في المثال التالي على الأنواع "Single"، أو "Double"، أو "Suite"، أو "Executive". USE HOTEL GO CREATE TABLE tblRoom ( HotelNo Int NOT NULL, RoomNo Int NOT NULL, Type Char(50) NULL, Price Money NULL, PRIMARY KEY (HotelNo, RoomNo), FOREIGN KEY (HotelNo) REFERENCES tblHotel CONSTRAINT Valid_Type CHECK (Type IN ('Single', 'Double', 'Suite', 'Executive')) ) يجب في المثال التالي أن يكون تاريخ تعيين الموظف قبل January 1, 2004، أو يجب أن يكون الحد الأقصى للراتب 300 ألف دولار: GO CREATE TABLE SALESREPS ( Empl_num Int Not Null CHECK (Empl_num BETWEEN 101 and 199), Name Char (15), Age Int CHECK (Age >= 21), Quota Money CHECK (Quota >= 0.0), HireDate DateTime, CONSTRAINT QuotaCap CHECK ((HireDate < "01-01-2004") OR (Quota <=300000)) ) القيد DEFAULT يُستخدَم القيد DEFAULT لتوفير قيمة تُضاف تلقائيًا لعمود ما إذا لم يوفّرها المستخدم، بحيث: يمكن احتواء العمود على قيد DEFAULT واحد فقط. لا يمكن استخدام القيد DEFAULT في الأعمدة التي لها نوع البيانات timestamp، أو الخاصية identity. ترتبط القيود DEFAULT تلقائيًا بعمود عند إنشائها. الصيغة العامة للقيد DEFAULT هي: [CONSTRAINT constraint_name] DEFAULT {constant_expression | niladic-function | NULL} [FOR col_name] يضبط المثال التالي القيمة الافتراضية default لحقل المدينة city field على القيمة "Vancouver": USE HOTEL ALTER TABLE tblHotel Add CONSTRAINT df_city DEFAULT ‘Vancouver’ FOR City الأنواع التي يعرفها المستخدم User Defined Types تعتمد الأنواع التي يعرِّفها المستخدِم دائمًا على نوع البيانات التي يوفرها النظام، فيمكن لهذه الأنواع فرض سلامة البيانات والسماح بالقيم الفارغة nulls. اختر الأنواع التي تكون تحت الكلمة "Programmability" في قاعدة البيانات الخاصة بك، لإنشاء نوع بيانات يعرِّفه المستخدِم في خادم SQL Server، ثم انقر بزر الماوس الأيمن واختر المسار New’ –>‘User-defined data type’، أو نفّذ إجراء النظام sp_addtype المخزّن system stored procedure، ثم اكتب ما يلي: sp_addtype ssn, 'varchar(11)', 'NOT NULL' سيؤدي هذا إلى إضافة نوع بيانات جديد عرّفه المستخدم يسمى SIN بتسعة محارف. يستخدم الحقل EmployeeSIN نوع البيانات SIN الذي عرّفه المستخدم في المثال التالي: CREATE TABLE SINTable ( EmployeeID INT Primary Key, EmployeeSIN SIN, CONSTRAINT CheckSIN CHECK (EmployeeSIN LIKE ' [0-9][0-9][0-9] – [0-9][0-9] [0-9] – [0-9][0-9][0-9] ') ) التعليمة ALTER TABLE يمكن استخدام تعليمات ALTER TABLE لإضافة وحذف القيود، بحيث: تسمح تعليمة ALTER TABLE بإزالة الأعمدة. يُتحقق من جميع البيانات الموجودة عند إضافة قيد للتأكد من عدم وجود انتهاكات. نستخدم في المثال التالي تعليمة ALTER TABLE للخاصية IDENTITY في الحقل ColumnName: USE HOTEL GO ALTER TABLE tblHotel ADD CONSTRAINT unqName UNIQUE (Name) استخدم تعليمة ALTER TABLE لإضافة عمود مع الخاصية IDENTITY مثل التعليمة ALTER TABLE TableName. ADD ColumnName int IDENTITY(seed, increment) التعليمة DROP TABLE تزيل التعليمة DROP TABLE جدولًا من قاعدة البيانات، لذلك تأكد من تحديد قاعدة البيانات الصحيحة. DROP TABLE tblHotel سيؤدي تنفيذ عبارة DROP TABLE السابقة بلغة SQL إلى إزالة الجدول tblHotel من قاعدة البيانات. تمارين باستخدام المعلومات الخاصة بالتمرين الموجود في المقال قواعد السلامة والقيود المُطبَّقة عند تصميم قواعد البيانات، طبّق التخطيط باستخدام لغة Transact SQL -أي اعرض تعليمات SQL لكل جدول-، وطبّق القيود أيضًا. أنشئ الجدول الموضَّح أدناه في خاوم SQL Server، واعرض التعليمات التي استخدمتها. الجدول: Employee 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; } ATTRIBUTE (FIELD) NAME DATA DECLARATION EMP_NUM CHAR(3) EMP_LNAME VARCHAR(15) EMP_FNAME VARCHAR(15) EMP_INITIAL CHAR(1) EMP_HIREDATE DATE JOB_CODE CHAR(3) اكتب شيفرة لغة SQL لإدخال صفوف الجدول السابق، بعد إنشاء بنيته. استخدم الشكل السابق للإجابة على الأسئلة من 4 إلى 10. اكتب شيفرة لغة SQL لتغيير رمز الوظيفة job code إلى 501 للموظف الذي رقمه 107، وافحص النتائج بعد الانتهاء من المهمة، ثم أعد ضبط رمز الوظيفة إلى قيمته الأصلية. اكتب شيفرة لغة SQL لإعطاء قائمة بجميع السمات الخاصة برمز الوظيفة 502، بافتراض إدخال البيانات الموضَّحة في جدول الموظف Employee. اكتب شيفرة لغة SQL لحذف الصف الخاص بالشخص الذي اسمه "William Smithfield"، والذي وُظِّف في June 22, 2004، والذي تصنيف رمز وظيفته هو 500. أضف السمتين EMP_PCT، وPROJ_NUM إلى جدول الموظف، بحيث تكون السمة EMP_PCT هي نسبة المكافأة المدفوعة لكل موظف. اكتب شيفرة لغة SQL باستخدام أمر واحد لإدخال رقم المشروع PROJ_NUM = 18 لجميع الموظفين الذين تصنيف الوظيفة JOB_CODE الخاص بهم هو 500. اكتب شيفرة لغة SQL باستخدام أمر واحد لإدخال رقم المشروع PROJ_NUM = 25 لجميع الموظفين الذين تصنيف الوظيفة JOB_CODE الخاص بهم يساوي 502 أو أعلى. اكتب شيفرة لغة SQL لتغيير رقم المشروع PROJ_NUM إلى 14 للموظفين الذين تعيّنوا قبل January 1, 1994، ورمز الوظيفة الخاصة بهم يساوي 501 على الأقل. (قد تفترض أن الجدول سيعاد إلى حالته الأصلية التي سبقت هذا السؤال). ترجمة -وبتصرّف- للمقال SQL Structured Query Language لصاحبَيه Adrienne Watt وNelson Eng. اقرأ أيضًا المقال التالي: لغة معالجة البيانات DML الخاصة بلغة SQL المقال السابق: عملية تطوير قواعد البيانات Database Development النسحة الكاملة من كتاب ملاحظات للعاملين بلغة SQL الاستعلامات الفرعية والإجراءات في SQL قواعد السلامة وقيودها لضمان سلامة البيانات في قواعد البيانات الاعتماديات الوظيفية المستخدمة في تصميم قواعد البيانات
-
يتعامل برنامج الرسم كريتا مع الصور بوصفها نوع الملف الذي ينشئه ويعالجه. مكونات الصور يحتوي المستند النصي على أحرف مرتبة ترتيبًا صحيحًا، لذلك يحمّلها الحاسوب كجمل متماسكة، وكذلك في الصور التي تتكون من بيانات بأنواع متعددة. البيانات النقطية Raster Data هي البيانات الرئيسية الموجودة على طبقات الطلاء التي تنشئها، فهي آثار فرشاة الطلاء التي تبدو مؤلفة من بكسلات إذا نظرت إليها عن قرب. يحتوي الملف متعدد الطبقات على طبقات متعددة من هذا النوع، حيث تتراكب هذه الطبقات فوق بعضها البعض مؤلفةً الصورة النهائية، بينما يحتوي الملف المؤلَّف من طبقة واحدة على بيانات نقطية فقط. البيانات المتجهية Vector Data هي عمليات حسابية تطلب من الحاسوب رسم بكسلات في بقعة معينة، مما يجعلها أكثر قابلية للتوسع من خلال الطلب من هذه العملية الحسابية أن تكبّر الإحداثيات بمقدار 4 مرات لتوسيعها مثلًا. تُعَد البيانات المتجهية أكثر قابلية للتعديل وأخف وزنًا، ولكنها تتطلب معالجة أكبر في وحدة المعالجة المركزية. بيانات التشغيل Operation Data تشبه هذه البيانات طبقات المرشّح Filter layers حيث تطلب من كريتا أن يغير ألوان طبقة، ولكن تُحفَظ أقنعة الشفافية Transparency masks وطبقة المجموعة وأقنعة التحويل في ملفات متعددة الطبقات. تعتمد القدرة على تحميل هذه البيانات على البرنامج الذي أنشأ الملف في البداية، لذلك يمكن لكريتا تحميل وحفظ المجموعات وأقنعة الشفافية وتأثيرات الطبقات من ملف PSD، ولكن لا يمكن تحميل أقنعة التحويل أو حفظها. بيانات الصورة الوصفية Metadata البيانات الوصفية هي معلومات مثل تاريخ الإنشاء والمؤلف والوصف ومعلومات أخرى مثل DPI. حجم الصورة حجم الصورة هو أبعاد ودقة رقعة الرسم canvas. لحجم الصورة تأثير مباشر على حجم ملف مستند كريتا، إذ يزيد حجم الملف الناتج كلما زاد عدد البكسلات وكلما زاد عمق اللون. DPI/PPI تشير DPI إلى عدد النقاط في الإنش الواحد Dots per Inch وتشير PPI إلى عدد البكسلات في الإنش الواحد Pixels per Inch. افترض أن طابعتك تطبع بدقة 300 نقطة في الإنش (DPI)، أي أنها تضع 300 نقطة من الألوان في مساحة مقدارها إنش واحد، وهذا يمثّل عدد البكسلات التي يحتويها عملك الفني في مساحة نسبية تُقدَّر بإنش واحد. تهتم الطابعات بالوحدة DPI، ولكن يجب على الرسامين أثناء إنشاء عمل فني أن يضعوا الوحدة PPI في الحسبان أيضًا، بحيث يمكن للطابعات تحديد الحجم الذي يجب أن تكون عليه صورتك على الورقة. بعض المعايير التي يمكنك استخدامها: 72 PPI: هو PPI الافتراضي للشاشات الذي تعتمده جميع البرامج، ولكن تعتمد معظم الشاشات هذه الأيام أيضًا المعيار 125 PPI أو 300 PPI لأجهزة رتينا retina devices ذات الدقة العالية. لكن المعيار 72 PPI هو الافتراضي عند إنشاء صورة مناسبة لاستخدامها على الحاسوب. 120 PPI: هو معيار للملصقات منخفضة الجودة. 300 PPI: هو الحد الأدنى الذي يجب عليك استخدامه للحصول على مطبوعات عالية الجودة. 600 PPI: الجودة المُستخدَمة في الرسومات الخطية line art الخاصة بالقصص المصوَّرة. عمق اللون يحتوي كريتا على فضاء لوني خاص بالصورة، فضاء لوني خاص بالطبقة يمكنه تقليل استهلاك الذاكرة إذا اُستخدِم بالطريقة الصحيحة، إذ يمكن أن يؤدي وجود طبقة رسومات خطية ذات تدرج رمادي إلى تقليل استهلاك الذاكرة إلى النصف على سبيل المثال. يختلف فضاء الصورة اللوني عن فضاء الطبقة اللوني، لذلك يمكنك تغيير فضاء الصورة اللوني فقط من قائمة صورة Image ثم خصائص Properties. لكن إذا أردت تغيير فضاء لون الملف مع جميع طبقاته، فيمكنك تطبيق ذلك من خلال الانتقال إلى قائمة صورة Image ثم تحويل فضاء الصورة اللوني Convert Image Color Space، مما سيؤدي إلى تحويل الفضاء اللوني لجميع الطبقات. المؤلف والوصف يحفظ كريتا تلقائيًا مَن أنشأ الصورة في بياناتها الوصفية إلى جانب البيانات الأخرى مثل وقت وتاريخ الإنشاء والتعديل. كما يعرض وقت تحرير المستند في نافذة معلومات المستند، وهو مفيد للرسامين المحترفين والسريعين لتتبّع الوقت الذي عملوا فيه على العمل الفني لتقدير الفاتورة، حيث يعطي الوقت الذي لم يحدث فيه أي إجراء بدقة تبلغ ±60 ثانية، ويمكنك إفراغ هذا الوقت في نافذة معلومات المستند وعن طريق فك ضغط ملف .kra وتعديل البيانات الوصفية هناك. يمكن تعديل هذه المعلومات من قائمة ملف File ثم معلومات المستند Document Information، ويمكن تعديل معلومات المؤلف من قائمة إعدادات Settings ثم ضبط كريتا Configure Krita ثم المؤلف Author. يمكن تبديل بين ملفات التعريف Profiles من قائمة الإعدادات Settings ثم ملف تعريف المؤلف النشط Active Author Profile. ضبط لون خلفية رقعة الرسم يمكنك ضبط لون خلفية رقعة الرسم من قائمة صورة Image، ثم لون خلفية الصورة وشفافيتها Image Background Color and Transparency، مما يسمح بتفعيل لون الخلفية غير الشفاف وتغيير اللون، وهذا مفيد لبعض تنسيقات الملفات التي تفرض استخدام لون خلفية بدلًا من الشفافية. يستخدم تصدير ملف PNG و JPG هذا اللون كلون افتراضي لتعبئة الشفافية إن لم ترغب في تصدير الشفافية. إذا أتيت من برنامج مثل برنامج Paint Tool SAI، فسيسمح استخدام هذا الخيار أو استخدام خيار "كلون رقعة الرسم As canvas color" في قسم الخلفية Background ضمن خيارات إنشاء ملف جديد بالعمل في بيئة مريحة، حيث لن تُمثَّل الشفافية باستخدام المربعات البيضاء والسوداء التي تشبه رقعة الشطرنج. التحويلات الأساسية هناك بعض التحويلات الأساسية المتاحة في قائمة صورة Image. قص الصورة Shear Image: يؤدي هذا الخيار إلى تشويه الصورة بأكملها مع طبقاتها. التدوير Rotate: يعرض هذا الخيار قائمة فرعية تسمح لك بتدوير الصورة وجميع طبقاتها بسرعة. عكس الصورة أفقيًا/رأسيًا Mirror Image Horizontally/Vertically: يسمح هذا الخيار بعكس الصورة بأكملها مع جميع طبقاتها. قص رقعة الرسم يمكنك استخدام أداة الاقتصاص Crop Tool لقص المساحة الزائدة وتحسين تكوين الصورة. الاقتصاص Trimming يستخدم كريتا قائمة صورة Image ثم اقتصاص إلى الطبقة الحالية Trim to Current Layer لتغيير حجم الصورة إلى أبعاد الطبقة المُحدَّدة، وهذا مفيد عندما تريد لصق صورة كبيرة جدًا في الطبقة وتغيير حجم رقعة الرسم وتوسيعها لتناسب حجم هذه الطبقة. يشبه الخيار اقتصاص إلى التحديد Trim to Selection من قائمة صورة أداةَ القص ولكنه أسرع منها، حيث يساعدنا هذا الخيار في تغيير حجم رقعة الرسم إلى أبعاد التحديد النشط حاليًا. يفيدنا هذا الخيار عند النقر بزر الفأرة الأيمن على طبقة من مكدس الطبقات واختيار خيار تحديد الجزء العاتم Select Opaque، إذ يؤدي خيار اقتصاص إلى التحديد Trim to Selection إلى قص رقعة الرسم إلى المربع المحيط بهذا التحديد. يُستخدَم الخيار اقتصاص إلى مقاس الصورة Trim to Image Size من قائمة صورة مع الطبقات، حيث يقص كل الطبقات وفقًا لحجم الصورة، مما يجعل ملفاتك أخف من خلال التخلص من البيانات غير المرئية. تغيير مقاس رقعة الرسم يمكنك تغيير مقاس رقعة الرسم من قائمة صورة Image ثم تغيير مقاس رقعة الرسم Resize Canvas أو باستخدام الاختصار Ctrl + Alt + C، حيث ستظهر النافذة التالية: يتأكد مربع الاختيار "أجبر النسب Constrain proportions" من بقاء الارتفاع والعرض متناسبين مع بعضهما البعض أثناء تغييرهما. تشير الإزاحة Offset إلى مكان إضافة مساحة رقعة الرسم الجديدة حول الصورة الحالية، فأنت مَن تقرّر مكان وضع الصورة الحالية (إذا ضغطت على الزر الأيسر، فستنتقل إلى منتصف اليسار، وستُضاف مساحة رقعة الرسم الجديدة إلى يمين الصورة). كما يمكنك تغيير مقاس رقعة الرسم حسب الحاجة أثناء عملية الرسم من خلال التمرير إلى ما بعد نهاية رقعة الرسم كما في الشكل الآتي حيث يمكنك رؤية شريط فيه سهم كما في الشكل الآتي، إذ سيؤدي النقر على هذا السهم إلى تمديد رقعة الرسم في ذلك الاتجاه. يمكنك رؤية السهم باللون الأرجواني في المثال التالي: تغيير مقاس الصورة يسمح الخيار "حجّم الصورة إلى المقاس الجديد Scale Image to New Size" بتغيير مقاس الصورة بأكملها وتغيير الدقة أو تحسين صورتك، فإذا استخدمتَ من البداية الدقة 72 PPI مع أشكال وألوان وصور كبيرة على سبيل المثال، ولكنك تريد الآن إجراء بعض التفاصيل باستخدام الدقة 300 PPI أو 400 PPI، فهذا هو المكان الذي يمكنك إجراء هذا التغيير فيه. يمكن الحفاظ على نسبة العرض إلى الارتفاع عند ربط السلسلة مثل جميع النوافذ الأخرى التي يظهر فيها رابط السلسلة، ويمكنك فصل هذه السلسلة من خلال النقر عليها. تقسيم الصورة تتيح ميزة معالجة الصور هذه تقسيم الصورة إلى مكوناتها أو قنواتها المختلفة، مما يفيد الأشخاص الذين يعملون في الطباعة، أو الذين يعدّلون الخامات، حيث يمكنك ضبط قناتين على أوضاع المزج Blending Modes ذات النوع addition في حالة استخدام الخرج الملوَّن. كما يمكنك استخدام أوضاع المزج Copy Red و Copy Green و Copy Blue في الصور ذات التدرج الرمادي في نمط RGB من خلال استخدام الوضع الأحمر مع قناة الصورة الحمراء والوضع الأخضر مع قناة الصورة الخضراء وهكذا. القوالب Templates القوالب هي ملفات .kra محفوظة في موقع خاص، لذلك يمكن سحبها إلى كريتا بسرعة، حيث يشبه القالب فتح مستند موجود مسبقًا كمستند غير معنون Open Existing Document as Untitled Document. يمكنك إنشاء ملف قالبك من أي ملف .kra من قائمة ملف File ثم إنشاء قالب من الصورة Create Template from Image، إذ سيؤدي ذلك إلى إضافة المستند الحالي بوصفه قالبًا جديدًا مع جميع خصائصه والطبقات ومحتوياتها. يتضمن كريتا أربعة أنواع افتراضية من القوالب سنتحدّث عنها الآن. قوالب الهزليات Comic Templates صُمِّمت هذه القوالب خصيصًا لتبدأ في رسم الرسوم الهزلية، حيث يعتمد القالب الهزلي على نظام متجهات vectors ونُسخ من تلك الطبقات المتجهية تعكس تلقائيًا التغييرات التي تُجرَى على تلك الطبقات، بحيث يمكنك رسم صورتك دون الخوف من الرسم خارج اللوحة. كما يمكنك استخدام الخيار وراثة ألفا Inherit Alpha لقص رسوماتك لتناسب اللوحة. لهذه القوالب الأنواع التالية: نموذج Bande Desinée الأوروبي European Bande Desinée Template: يذكرنا هذا القالب بالنظام المستخدَم في قصص مثل تان تان TinTin أو سبيرو وفانتازيو Spirou et Fantasio المصوَّرة. تركّز هذه القوالب على الصور الواسعة والقطع الأفقي horizontal cuts. قالب الهزليات بنمط أمريكي US-style comics Template: يذكّرنا هذا القالب بقصص DC ومارفل المصوَّرة القديمة مثل باتمان أو كابتن أمريكا، حيث يستخدم هذا القالب تسع صور تمثّل تقدم القصة السريع. قالب مانغا Manga Template: يستند هذا القالب إلى القصص المصورة اليابانية، ويركّز على وجود فاصل رأسي رفيع وفاصل أفقي ثخين، مما يضمن أن ينهي القارئ السطر قبل الانتقال إلى السطر التالي. شبكة الوافل الحديدية Waffle Iron Grid: يتألف هذا القالب من 12 لوحة صغيرة لاستخدامها. قوالب التصميم Design Templates هي قوالب مُخصَّصة للتصميم ولديها إعدادات افتراضية متعددة مع معدّل النقاط في كل إنش PPI المناسب لك، وهي: التصميم السينمائي 16:10. التصميم السينمائي 2.93:1. العرض التقديمي Presentation بالاتجاه الأفقي A3-Landscape. العرض التقديمي Presentation بالاتجاه الرأسي A4 portrait. الشاشة Screen بالقياس 4:3. تصميم الويب Web Design. قوالب DSLR لهذه القوالب بعض أحجام الصور الافتراضية وهي: Canon 55D. Canon 5DMK3. Nikon D3000. Nikon D5000. Nikon D7000. قوالب الخامات Texture Templates هذه القوالب مخصَّصة لعمل خامات ثلاثية الأبعاد، وتتراوح بين 1024 و4092. ترجمة -وبتصرّف- للمقالين Working with Images وTemplates من موقع Krita. اقرأ أيضًا المقال السابق: الرسم باستخدام الأدوات المساعدة في كريتا المفاهيم الأساسية لكريتا تحميل وحفظ الفرش في كريتا Krita خطوات العمل المعتادة في كريتا النسخة الكاملة من كتاب: أساسيات تصميم الرسوميات
-
يتمثل أحد الجوانب الأساسية لهندسة البرمجيات في تقسيم عملية التطوير إلى سلسلة من المراحل أو الخطوات، حيث تركِّز كل مرحلة منها على جانب واحد من جوانب التطوير. يشار أحيانًا إلى مجموعة هذه الخطوات بدورة حياة تطوير البرمجيات software development life cycle -أو SDLC اختصارًا-، حيث ينتقل المنتج البرمجي عبر مراحل دورة الحياة هذه -في بعض الأحيان بصورة متكررة أثناء ضبطه أو إعادة تطويره- حتى يتوقف استخدامه في النهاية، كما يمكن التحقق من كل مرحلة في دورة الحياة للتأكد من صحتها قبل الانتقال إلى المرحلة التالية في الحالة المثالية. دورة حياة تطوير البرمجيات: نموذج الشلال Waterfall لنبدأ بإلقاء نظرة عامة على نموذج الشلال waterfall model الذي هو أحد نماذج تمثيل دورة حياة عملية تطوير البرمجيات Software Development Life Cycle كما ستجده في معظم كتب هندسة البرمجيات. يوضح هذا الشكل الشلالي الموجود في الشكل الآتي نموذج شلال عام يمكن تطبيقه على أية عملية تطوير لنظام حاسوبي، حيث يُظهِر هذا النموذج العملية على أساس تسلسل صارم من الخطوات بأن يكون خرج خطوة واحدة دخلًا للخطوة التالية، كما يجب إكمال كل خطوة قبل الانتقال إلى الخطوة التالية. يمكننا استخدام عملية نموذج الشلال على أساس وسيلة لتحديد المهام المطلوبة مع دخل وخرج كل نشاط activity. المهم هنا هو مجالات الأنشطة التي يمكن تلخيصها على النحو التالي: تتضمن مرحلة إنشاء المتطلبات Establishing requirements التشاور والاتفاق مع أصحاب المصلحة حول ما يريدونه من النظام، ويُعبَّر عنها بما يسمَّى وثيقة المتطلبات statement of requirements. تبدأ مرحلة التحليل Analysis بالنظر في وثيقة المتطلبات وتنتهي من خلال إنتاج مواصفات النظام system specification، حيث تُعَدّ المواصفات تمثيلًا رسميًا لما يجب على النظام فعله، ويُعبَّر عنها بعبارات مستقلة عن كيفية تطبيقها. تبدأ مرحلة التصميم Design بمواصفات النظام وينتج عنها وثائق التصميم، كما تقدِّم هذه المرحلة وصفًا تفصيليًا لكيفية بناء النظام. مرحلة التطبيق Implementation هي بناء نظام حاسوبي وفقًا لوثيقة تصميم معينة مع مراعاة البيئة التي سيعمل فيها النظام، مثل العتاد، والبرمجيات المتاحة للتطوير؛ كما قد تُنفَّذ مرحلة التطبيق على مراحل باستخدام نظام أولي يمكن التحقق من صحته واختباره قبل إصدار النظام النهائي للاستخدام. توازن مرحلة الاختبار Testing النظام المُطبَّق مع وثائق التصميم ومواصفات المتطلبات، وتنتج هذه المرحلة تقرير قبول، أو قائمةً بالأخطاء والزلات البرمجية bugs التي تتطلب مراجعة عمليات التحليل، والتصميم، والتطبيق لتصحيحها، أي تُعَدّ مرحلة الاختبار عادةً المَهمة التي تؤدي إلى تكرار نموذج الشلال خلال دورة الحياة. تتضمن مرحلة الصيانة Maintenance التعامل مع تغيرات المتطلبات، أو بيئة التطبيق، أو إصلاح الزلات البرمجية، أو نقل النظام إلى بيئات جديدة مثل ترحيل نظام من حاسوب مستقل إلى محطة عمل يونكس أو بيئة متصلة بالشبكة، كما سيعاد النظر في دورة حياة الشلال بصورة متكررة بسبب احتواء مرحلة الصيانة على تحليل التغيرات المطلوبة، وتصميم حل، وتطبيقه، واختباره على مدى حياة نظام برمجي جرت صيانته. دورة حياة قاعدة البيانات Database Life Cycle يمكننا استخدام دورة الشلال مثل أساس لنموذج تطوير قاعدة البيانات الذي يتضمن ثلاثة افتراضات، هي: يمكننا فصل تطوير قاعدة البيانات عن عمليات المستخدم التي تستخدم قاعدة البيانات، أي تحديد وإنشاء تخطيط schema لتعريف البيانات في قاعدة البيانات. يمكننا استخدام معمارية التخطيطات الثلاثة three-schema architecture مثل أساس لتمييز الأنشطة المرتبطة بالتخطيط. يمكننا تمثيل القيود constraints لفرض دلالات semantics البيانات مرةً واحدةً في قاعدة البيانات عوضًا عن فرضها على كل عملية مستخدِم تستخدِم البيانات. يمكننا باستخدام هذه الافتراضات والشكل السابق رؤية أنّ هذا المخطط يمثِّل نموذجًا للأنشطة وخرجها لتطوير قاعدة البيانات، فهذا المخطط ليس قابلًا للتطبيق على النهج العلائقي فقط وإنما يُطبَّق على أية صنف class من نظم إدارة قواعد البيانات DBMS أيضًا. يُعَدّ تطوير تطبيقات قواعد البيانات عمليةً للحصول على متطلبات العالم الحقيقي real-world، وتحليل المتطلبات، وتصميم البيانات ووظائف النظام، ثم تطبيق العمليات في النظام. جمع المتطلبات Requirements Gathering تُعَدّ مرحلة جمع المتطلبات requirements gathering الخطوة الأولى في نموذج الشلال، ويجب على مصممي قاعدة البيانات خلال هذه الخطوة إجراء مقابلات مع العملاء -أي مستخدمي قاعدة البيانات- لفهم النظام المقترح والحصول على البيانات والمتطلبات الوظيفية، وتوثيقها، كما تكون نتيجة هذه الخطوة وثيقةً تتضمن المتطلبات التفصيلية التي قدمها المستخدِمون. تتضمن مرحلة إنشاء المتطلبات Establishing requirements التشاور والاتفاق بين جميع المستخدِمين بشأن البيانات الثابتة persistent data التي يرغبون في تخزينها مع الاتفاق على معنى عناصر البيانات وتفسيرها، كما يلعب مسؤول البيانات دورًا رئيسيًا في هذه العملية لأنه يستعرِض القضايا التجارية، والقانونية، والأخلاقية داخل المؤسسة التي تؤثِّر على متطلبات البيانات. تُستخدَم وثيقة متطلبات البيانات data requirements document لتأكيد فهم المتطلبات مع المستخدِمين، فلا ينبغي أن تكون رسميةً أو مشفرةً بمستوى عالٍ لضمان سهولة فهمها. يجب أن تقدِّم هذه الوثيقة ملخصًا موجزًا لمتطلبات جميع المستخدِمين -أي ليس مجرد مجموعة من الأفراد فقط-، وذلك لأنّ الهدف هو تطوير قاعدة بيانات مشتركة واحدة. يجب ألا تصِف المتطلبات كيفية معالجة البيانات، بل تصف عناصر البيانات، والسِمات attributes التي تمتلكها، والقيود المطبَّقة، والعلاقات التي تربط بين عناصر البيانات. التحليل Analysis تبدأ مرحلة تحليل البيانات Data analysis بوثيقة متطلبات البيانات، ثم ينتج عنها نموذج بيانات مفاهيمي conceptual data model. الهدف من التحليل هو الحصول على وصف تفصيلي للبيانات التي ستناسب متطلبات المستخدِم، بحيث يجري التعامل مع خصائص البيانات ذات المستوى العالي والمنخفض واستخدامها. تتضمن هذه الخصائص المجال المحتمل من القيم التي يمكن السماح بها للسمات، مثل: رمز مقررات الطالب student course code، وعنوان المقرر course title، ونقاط الائتمان credit points في قاعدة بيانات المدرسة على سبيل المثال. يوفِّر نموذج البيانات المفاهيمي تمثيلًا رسميًا مشتركًا لما يجري توصيله بين العملاء والمطورين أثناء تطوير قاعدة البيانات، فهذا النموذج يركز على البيانات في قاعدة البيانات، بغض النظر عن الاستخدام النهائي لتلك البيانات في عمليات المستخدِم، أو تطبيق البيانات في بيئات حاسوبية محدَّدة، لذلك يهتم نموذج البيانات المفاهيمي بمعنى البيانات وبنيتها، وليس بالتفاصيل التي تؤثر على كيفية تطبيقها. إذًا يُعَدّ نموذج البيانات المفاهيمي تمثيلًا رسميًا للبيانات التي يجب أن تحتويها قاعدة البيانات، والقيود التي يجب على البيانات تلبيتها، كما يجب التعبير عن ذلك بمصطلحات مستقلة عن كيفية تنفيذ النموذج، لذلك يركِّز التحليل على الأسئلة التي تحتوي عبارات مثل عبارة "ما هو المطلوب؟" وليس على الأسئلة التي تحتوي عبارات مثل عبارة "كيف يتحقق ذلك؟". التصميم المنطقي Logical Design تبدأ مرحلة تصميم قاعدة البيانات بنموذج بيانات مفاهيمي وينتج عنها مواصفات التخطيط المنطقي logical schema الذي سيحدِّد نوع نظام قاعدة البيانات المطلوب -أي نوع شبكي، أو علائقي، أو كائني التوجه-. لا يزال التمثيل العلائقي relational representation مستقلًا عن أي نظام إدارة قواعد البيانات DBMS، فهو نموذج بيانات مفاهيمي آخر. يمكننا استخدام التمثيل العلائقي لنموذج البيانات المفاهيمي على أساس دخلٍ لعملية التصميم المنطقي، وخرج هذه المرحلة هو مواصفات علائقية مفصَّلة أي تخطيط منطقي لجميع الجداول والقيود اللازمة لتلبية وصف البيانات في نموذج البيانات المفاهيمي. تُختار الجداول الأكثر ملاءمة أثناء نشاط التصميم لتمثيل البيانات في قاعدة بيانات، ولكن يجب أخذ هذه الاختيارات في الحسبان معايير التصميم المختلفة بما في ذلك على سبيل المثال مرونة التغيير، والتحكم في التضاعف أو الاستنساخ duplication، وأفضل طريقة لتمثيل القيود. تحدِّد الجداول المحدَّدة بالتخطيط المنطقي البيانات المخزَّنة وكيفية معالجتها في قاعدة البيانات. يتجه مصممو قواعد البيانات الملمّون بقواعد البيانات العلائقية ولغة الاستعلامات الهيكلية SQL للذهاب مباشرةً إلى مرحلة التطبيق بعد إنتاج نموذج البيانات المفاهيمي، لكن لا يؤدي مثل هذا التحول المباشر للتمثيل العلائقي إلى جداول SQL بالضرورة إلى قاعدة بيانات تحتوي على جميع الخصائص المرغوبة، مثل: الكمال completeness، والسلامة integrity، والمرونة flexibility، والكفاءة efficiency، وقابلية الاستخدام usability. يُعَدّ نموذج البيانات المفاهيمي الجيد خطوةً أولى أساسية نحو قاعدة بيانات لها هذه الخصائص، لكن لا يعني هذا أنّ التحول المباشر إلى جداول SQL ينتج قاعدة بيانات جيدة تلقائيًا. ستمثل هذه الخطوة الأولى بدقة الجداول والقيود اللازمة لتلبية وصف نموذج البيانات المفاهيمي، وبالتالي ستلبي متطلبات الكمال والسلامة، ولكنها قد تكون غير مرنة، أو قد تقدِّم قابلية استخدام ضعيفة، يُثنَى flexed التصميم الأول بعد ذلك لتحسين جودة تصميم قاعدة البيانات، ويهدف مصطلح الثني Flexing إلى أخذ الأفكار المتزامنة من شيء مثني لغرض مختلف وتشذيب جوانب من هذا الشيء- أي الوصول إلى الغاية نفسها بطريقة وفكرة أخرى تحقق المقصود-. يلخص الشكل الآتي الخطوات التكرارية الموجودة في تصميم قاعدة البيانات بناءً على النظرة العامة المقدَّمة، كما يكون الغرض الرئيسي من هذا الشكل هو التمييز بين الهدف العام للجداول التي يجب استخدامها عن التعريف المفصَّل للأجزاء المكوِّنة لكل جدول، حيث تُدرَس هذه الجداول واحدًا تلو الآخر رغم أنها ليست مستقِلةً عن بعضها البعض، كما سيؤدي كل تكرار يتضمّن مراجعةً للجداول إلى تصميم جديد، ويشار إلى هذه التصاميم الجديدة معًا باسم تصاميم القطع الثاني second-cut designs حتى لو تكررت العملية لأكثر من حلقةٍ واحدة. أولًا، ليس من الضروري تلبية جميع متطلبات المستخدم التي يمثلها نموذج بيانات مفاهيمي معين بواسطة قاعدة بيانات واحدة، كما يوجد أسباب مختلفة لتطوير أكثر من قاعدة بيانات، مثل: الحاجة إلى عملية مستقِلة في مواقع مختلفة، أو التحكم الإداري ببيانات قواعد البيانات، لكن إذا احتوت مجموعة قواعد البيانات على بيانات مضاعَفة وكان المستخدِمون بحاجة للوصول إلى البيانات في أكثر من قاعدة بيانات، فهناك أسباب محتملة لتلبِّي قاعدة بيانات واحدة متطلبات متعددة، وإلا فيجب فحص المشاكل المتعلقة بمضاعَفة البيانات وتوزيعها. ثانيًا، أحد الافتراضات حول تطوير قاعدة البيانات هو أنه يمكننا فصل تطوير قاعدة البيانات عن تطوير عمليات المستخدم التي تستفيد منها، ويستند ذلك إلى توقّع تحديد جميع البيانات المطلوبة بواسطة عمليات المستخدِم المحدَّدة حاليًا، وإمكانية الوصول إليها بمجرد تطبيق قاعدة البيانات، لكننا نطلب أيضًا المرونة للسماح بتلبية تغيرات المتطلبات المستقبلية، كما يمكن التنبؤ بالطلبات الشائعة التي ستُقدَّم إلى قاعدة البيانات عند تطوير قاعدة بيانات لبعض التطبيقات، وبالتالي يمكننا تحسين تصميمنا للطلبات الأكثر شيوعًا. ثالثًا، تعتمد العديد من جوانب تصميم قاعدة البيانات وتطبيقها في المستوى التفصيلي على نظام إدارة قاعدة البيانات DBMS المستخدَم، فإذا كان اختيار نظام إدارة قواعد البيانات ثابتًا أو أُجرِي قبل مهمة التصميم، فيمكن استخدام هذا الاختيار لتحديد معايير التصميم بدلًا من الانتظار حتى مرحلة التطبيق، أي يمكن دمج قرارات التصميم لنظام إدارة قاعدة البيانات DBMS معين عوضًا عن إنتاج تصميم عام، ثم تكييفه مع نظام إدارة قاعدة البيانات DBMS أثناء التطبيق. ليس غريبًا العثور على تصميم مفرد لا يمكنه تلبية جميع خصائص قاعدة البيانات الجيدة في الوقت نفسه، لذلك من المهم أن يعطي المصمم الأولوية لهذه الخصائص، ويكون ذلك عادةً باستخدام معلومات من مواصفات المتطلبات، مثل: تحديد ما إذا كانت السلامة أهم من الكفاءة، وما إذا كانت قابلية الاستخدام أهم من المرونة في تطوير معيَّن. ستحدِّد تعليمات لغة تعريف البيانات data definition language -أو DDL اختصارًا- الخاصة بلغة SQL التخطيط المنطقي في نهاية مرحلة التصميم، حيث تصف لغة DDL قاعدة البيانات التي يجب تطبيقها لتلبية متطلبات المستخدِم. التطبيق Implementation تتضمن مرحلة التنفيذ أو التطبيق Implementation بناء قاعدة بيانات وفقًا لمواصفات التخطيط المنطقي، والذي سيتضمّن مواصفات تخطيط التخزين storage schema المناسب، وفرض الأمان، والتخطيط الخارجي، وما إلى ذلك، كما يتأثر التطبيق بشدة باختيار نظم إدارة قواعد البيانات المتاحة، وأدوات قواعد البيانات، وبيئة التشغيل. هناك مهام إضافية تتجاوز مجرد إنشاء تخطيط قاعدة بيانات database schema وتطبيق القيود، إذ يجب إدخال البيانات في الجداول، ومعالجة القضايا المتعلقة بالمستخدِمين وعمليات المستخدِم، كما يجب دعم الأنشطة الإدارية المرتبطة بالجوانب الأوسع لإدارة بيانات الشركة. نريد معالجة أكبر عدد ممكن من هذه القضايا الموضَّحة أدناه داخل نظام إدارة قواعد البيانات تماشيًا مع نهج نظم إدارة قواعد البيانات. يتطلب تطبيق التخطيط المنطقي عمليًا في نظام إدارة قواعد البيانات DBMS معرفةً مفصلةً للغاية بالميزات والفوائد المحددة التي يجب تقديمها من قِبَل نظام إدارة قواعد البيانات. ستشمل المرحلة الأولى من التطبيق انسجامَ متطلبات التصميم مع أفضل أدوات التطبيق المتاحة ثم استخدام تلك الأدوات للتطبيق، وذلك مثاليًا وتماشيًا مع الممارسة الجيدة لهندسة البرمجيات، كما قد يتضمن ذلك في قواعد البيانات على اختيار منتجات البائعِين ذات متغيرات من نظام إدارة قواعد البيانات DBMS ولغة SQL الأكثر ملاءمة لقاعدة البيانات التي نحتاج إلى تطبيقها، لكننا لا نعيش في عالم مثالي، كما ستُتخَذ في كثير من الأحيان قرارات اختيار العتاد والقرارات المتعلقة بنظام إدارة قواعد البيانات DBMS قبل النظر في تصميم قاعدة البيانات بوقت طويل، وبالتالي، يمكن أن يتضمن التطبيق ثنيًا إضافيًا للتصميم للتغلب على محدوديات البرمجيات أو العتاد. تحقيق التصميم Realizing the Design نحتاج إلى إنشاء قاعدة بياناتنا بعد إنشاء التصميم المنطقي وفقًا للتعريفات التي أنتجناها، كما يُحتمَل أن يتضمن التطبيق مع نظام إدارة قواعد البيانات DBMS العلائقي استخدام لغة SQL لإنشاء جداول وقيود تلبي وصف التخطيط المنطقي واختيار تخطيط التخزين المناسب -إذا كان نظام إدارة قواعد البيانات DBMS يسمح بهذا المستوى من التحكم-. تتمثل إحدى طرق تحقيق ذلك في كتابة تعليمات لغة SQL DDL المناسبة في ملف يمكن لنظام إدارة قواعد البيانات DBMS تنفيذه، بحيث يكون هناك سجل مستقل أو ملف نصي من تعليمات لغة SQL التي تعرِّف قاعدة البيانات؛ أما الطريقة الأخرى فهي العمل تفاعليًا باستخدام أداة قاعدة بيانات مثل الأداتين SQL Server Management Studio أو Microsoft Access. مهما كانت الآلية المستخدَمة لتطبيق التخطيط المنطقي، فالنتيجة هي أن قاعدة البيانات -مع الجداول والقيود- معرَّفة ولكنها لن تحتوي على بيانات لعمليات المستخدِم. ملء قاعدة البيانات Populating the Database يوجد طريقتان لملء الجداول بعد إنشاء قاعدة البيانات؛ إما من بيانات موجودة أو من خلال استخدام تطبيقات المستخدِم المطوَّرة لقاعدة البيانات. قد تكون هناك بيانات موجودة من قاعدة بيانات أخرى أو من ملفات بيانات وذلك بالنسبة لبعض الجداول، فمثلًا، نتوقع عند إنشاء قاعدة بيانات لمستشفى وجود بعض السجلات بالفعل لجميع الموظفين الذين يجب تضمينهم في قاعدة البيانات، كما يمكن أيضًا إحضار البيانات من وكالة خارجية مثل قوائم العناوين التي تُجلَب بصورة متكررة من شركات خارجية، أو يمكن إنتاجها أثناء مهمة إدخال بيانات كبيرة -أي يمكن إجراء تحويل السجلات اليدوية المطبوعة إلى ملفات حاسوبية بواسطة وكالة إدخال بيانات-، ويُعَدّ استخدام وسائل الاستيراد والتصدير الموجودة في نظام إدارة قواعد البيانات DBMS أبسط طريقة لملء قاعدة البيانات في مثل هذه الحالات. تتوفر عادةً وسائل لاستيراد وتصدير البيانات بتنسيقات قياسية مختلفة، وتُعرَف هذه الوظائف أيضًا في بعض الأنظمة باسم تحميل loading البيانات وتفريغها unloading، كما يتيح الاستيراد إمكانية نسخ ملف البيانات مباشرةً إلى جدول. إذا جرى الاحتفاظ بالبيانات بتنسيق ملف غير مناسب لاستخدام عملية الاستيراد، فيجب إعداد برنامج تطبيقي يقرأ البيانات القديمة، ويحوّلها حسب الضرورة، ثم يدخلها في قاعدة البيانات باستخدام شيفرة لغة SQL الذي أُنتجِت خصيصًا من أجل هذا الهدف. يُسمّى نقل كميات كبيرة من البيانات الموجودة إلى قاعدة بيانات بالتحميل المجمَّع bulk load، وقد يتضمن التحميل المجمَّع للبيانات كميات كبيرةً جدًا من البيانات المُحمَّلة أي تحميل جدول في نفس الوقت، لذلك قد تجد وسائل في نظام إدارة قواعد البيانات DBMS لتأجيل فحص قيد حتى نهاية التحميل المجمَّع. إرشادات لتطوير مخطط ER ملاحظة: ستساعد هذه الإرشادات العامة في تطوير أساس قوي لتصميم قاعدة البيانات الفعلية أي النموذج المنطقي: وثّق جميع الكيانات المكتشَفة خلال مرحلة جمع المعلومات. وثّق جميع السمات التي تنتمي إلى كل كيان، وحدّد المفاتيح المرشَّحة candidate keys، والمفاتيح الرئيسية primary keys، كما تأكد من اعتمادية جميع السمات التي ليست مفاتيحًا non-key attributes لكل كيان بصورة كاملة على المفتاح الرئيسي. طوِّر مخطط ER الأولي وراجعه مع الأشخاص المناسبين، وتذكَّر أن هذه عملية تكرارية. أنشِئ كيانات -أي جداول- جديدة للسمات متعددة القيم والمجموعات المكرَّرة، ثم ضمِّن هذه الكيانات- أي الجداول- الجديدة في مخطط ER، وراجع ذلك مع الأشخاص المناسبين. تحقَّق من نمذجة الكيان العلائقي ER عن طريق تطبيق عملية التوحيد normalizing على الجداول. ترجمة -وبتصرّف- للمقال Database Development Process لصاحبته Adrienne Watt. اقرأ أيضًا المقال التالي: نظرة سريعة على لغة الاستعلامات الهيكلية SQL المقال السابق: فهم عملية التوحيد Normalization المستخدمة عند تصميم قاعدة البيانات الاعتماديات الوظيفية المستخدمة في تصميم قواعد البيانات قواعد السلامة وقيودها لضمان سلامة البيانات في قواعد البيانات الاستعلامات الفرعية والإجراءات في SQL النسحة الكاملة من كتاب الدليل العملي إلى قواعد بيانات PostgreSQL
-
سنتعرّف من خلال هذا المقال على كيفية إنشاء ميزان مطبخ واقعي باستخدام بعض الأدوات والتقنيات الأساسية في برنامج الإليستريتور Adobe Illustrator، كما سنتعلّم مجموعةً من الحيل المفيدة لتسريع عملية الرسم. إنشاء مستند جديد شغّل برنامج الإليستريتور Illustrator، ثم اضغط على الاختصار Ctrl + N لإنشاء مستند جديد. حدّد خيار البكسلات Pixels من قائمة الوحدات Units، وأدخِل القيمة 864 في خانة العرض width والقيمة 736 في خانة الارتفاع height، ثم انقر على خيارات متقدمة Advanced، وحدّد نمط الألوان RGB والخيار Screen (72ppi)، وتأكّد من إلغاء تحديد مربع اختيار محاذاة الكائنات الجديدة إلى شبكة البكسلات Align New Objects to Pixel Grid قبل النقر على موافق OK. إنشاء شكل ميزان المطبخ الرئيسي استخدم أداة المستطيل Rectangle Tool (باستخدام الاختصار M) لإنشاء مستطيل أبعاده 338×78 بكسل باللون الأسود. واستخدم أداة التحديد المباشر Direct Selection Tool (باستخدام الاختصار A) لتحديد نقطة ارتكاز هذا المستطيل العلوية اليسرى، وحرّكها بمقدار 28 بكسلًا إلى اليمين، ثم حدّد نقطة الارتكاز العلوية اليمنى وحرّكها بمقدار 28 بكسلًا إلى اليسار. أعِد تحديد هذا المستطيل بعد ضبطه، وانتقل إلى قائمة تأثير Effect ثم Stylize ثم زوايا مستديرة Round Corners، بعد ذلك أدخِل نصف قطر Radius بمقدار 5 بكسلات، وانقر على موافق. حدّد الكائن الأسود الذي أنشأناه في الخطوة رقم 2، وانتقل إلى قائمة كائن Object ثم تحويل Transform ثم Scale، بعد ذلك حدّد الخيار غير موحّد Non-Uniform، وأدخِل القيمة 102% في خانة أفقي Horizontal والقيمة 101% في خانة رأسي Vertical، ثم انقر على نسخ Copy. استبدل لون حدّ stroke النسخة الحالي باللون الأحمر، ثم انقله بمقدار 12 بكسلًا للأسفل. أبقِ هذا الكائن الأحمر محدَّدًا، ثم افتح لوحة Appearance (من قائمة Window ثم Appearance)، وانقر على خيار زوايا مستديرة Round Corners، ثم أدخِل نصف قطر بمقدار 19 بكسلًا وانقر على موافق. حدّد الكائنين اللذين أنشأناهما في الخطوتين السابقتين، وانتقل إلى قائمة كائن Object، ثم توسيع المظهر Expand Appearance. حدّد الآن الكائن الأسود، وأزِل حدّه واملأه بالتدرج اللوني الخطي linear gradient الموضّح أدناه. حدّد الكائن الأحمر وأزِل حدّه، ثم املأه بالتدرج اللوني الخطي الموضّح أدناه، بعد ذلك حدّد الشكل الناتج واضغط على الاختصار Ctrl + Left Square Bracket لإخفائه خلف الشكل الأول. حدّد الشكل الأول الذي أنشأناه في الخطوة رقم 4 وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F). أبقِ هذه النسخة محدَّدة، وبدّل بين لوني التعبئة والحدّ، وذلك عن طريق النقر على السهم المنحني ذي الرأسين بجوار حاملَي ألوان التعبئة والحدّ في لوحة الأدوات. غيّر ثُخن حدّ الكائن الناتج إلى 2 بكسل، ثم استبدل لون هذا الحد الحالي بالتدرج اللوني الشعاعي radial gradient الموضّح أدناه. حدّد الشكل الثاني الذي أنشأناه في الخطوة رقم 4، وانتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، واتبع البيانات الموضّحة أدناه ثم انقر على موافق OK. استخدم أداة المستطيل (M) لإنشاء مستطيل أبعاده 262×278 بكسل باللون الأسود، ثم ضعه في الموضع الموضّح أدناه. استخدم أداة التحديد المباشر (A) لتحديد نقطة ارتكاز هذا المستطيل العلوية اليسرى، وحرّكها بمقدار 30 بكسلًا إلى اليمين. حدّد نقطة الارتكاز العلوية اليمنى وحرّكها بمقدار 30 بكسلًا إلى اليسار. أعِد تحديد هذا الكائن الأسود الناتج، وانتقل إلى قائمة تأثير Effect، ثم Stylize، ثم زوايا مستديرة Round Corners، ثم أدخِل نصف قطر مقداره 7 بكسلات وانقر على موافق. حدّد الكائن الأسود الذي أنشأناه في الخطوة رقم 6، وانتقل إلى قائمة كائن Object ثم Transform ثم Scale، وحدّد خيار Non-Uniform، مع إدخال القيمة 98% في خانة أفقي Horizontal والقيمة 103% في خانة رأسي Vertical. بعد ذلك انقر على نسخ Copy، واستبدل لون حدّ النسخة الحالي باللون الأحمر، ثم حرّكها بمقدار 14 بكسلًا للأعلى. أبقِ الكائن الأحمر الناتج محدّدًا، وافتح لوحة Appearance (من قائمة Window ثم Appearance)، ثم انقر على خيار الزوايا المستديرة Round Corners، بعد ذلك أدخِل نصف قطر بمقدار 12 بكسلًا وانقر على موافق. حدّد الكائنين اللذين لهما زوايا مستديرة المُنشَآن في الخطوات السابقة، وانتقل إلى قائمة كائن Object ثم توسيع المظهر Expand Appearance. حدّد الكائن الأسود، وأزِل حدّه واملأه بالتدرج اللوني الخطي الموضّح في الشكل الأول أدناه. حدّد الكائن الأحمر وأزِل حدّه، ثم املأه بالتدرج اللوني الشعاعي الموضّح في الشكل الثاني أدناه، بعدها حدّد هذا الشكل الناتج، واضغط على الاختصار Ctrl + Left Square Bracket لإخفائه خلف الشكل الأول الذي أنشأناه في الخطوة الحالية. حدد الشكل الأول الذي أنشأناه في الخطوة رقم 8 وانتقل إلى قائمة كائن Object، ثم مسار Path، ثم إزاحة المسار Offset Path، وأدخِل نصف قطر مقداره -3 بكسل، مع النقر على موافق. أبقِ هذا الشكل الناتج محدَّدًا، ثم بدّل لوني التعبئة والحدّ عن طريق النقر على السهم المنحني ذي الرأسين بجوار حاملَي ألوان التعبئة والحدّ في لوحة الأدوات. غيّر ثُخن حدّ هذا الكائن الناتج إلى 2 بكسل، ثم استبدل لون الحدّ الحالي باللون الأسود (#070d0a)، بعدها طبّق على هذا الكائن تأثير Feather بمقدار 1 بكسل، وحدّد الخيار Width Profile 2. حدّد الشكل الأول الذي أنشأناه في الخطوة رقم 8 مرةً أخرى، وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F). أبقِ هذه النسخة محدَّدةً وبدّل بين لوني التعبئة والحدّ، وذلك عن طريق النقر على السهم المنحني ذي الرأسين بجوار حاملَي ألوان التعبئة والحد في لوحة الأدوات. غيّر ثُخن حدّ هذا الكائن الناتج إلى 2 بكسل، واستبدل لون الحدّ الحالي بالتدرج اللوني الشعاعي الموضّح في الشكل الثالث أدناه، بعدها طبّق الخيار Width Profile 1 على الكائن الناتج. حدّد نقطتي الارتكاز المميزتين باللون الأصفر، وانقر على أيقونة قص المسار عند نقاط الارتكاز المحدَّدة Cut path at selected anchor points من شريط الخصائص Properties، ممّا يجعل هذا الكائن مؤلَّفًا من مسارين، ثم حدّد المسار العلوي وأزِله. إنشاء وعاء ميزان المطبخ استخدم أداة الدائرة Ellipse Tool (باستخدام الاختصار L) لإنشاء شكلين دائريين أبعادهما 317×63 بكسل و317×188 بكسل. حدّد هذين الشكلين، وافتح لوحة محاذاة Align (من قائمة Window ثم Align)، وانقر على زر المحاذاة المركزية أفقيًا Horizontal Align Center، ثم انقر على زر المحاذاة المركزية رأسيًا Vertical Align Center. استخدم أداة التحديد المباشر (A) لتحديد نقطة ارتكاز الدائرة السوداء العلوية وأزِلها. اختر أداة تحويل نقطة الارتكاز Convert Anchor Point Tool (باستخدام الاختصار Shift + C)، وانقر على المقبضين العلويين لنقطتي ارتكاز الكائن الأسود اليسرى واليمنى، ممّا سيؤدي إلى إزالة هذه المقابض العلوية. حدّد الدائرة الحمراء الذي أنشأناه في الخطوة رقم 10، وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F). أبقِ هذه النسخة محدَّدة، وأزِل حدّها، ثم املأها بالتدرج اللوني الشعاعي الموضّح في الشكل الأول أدناه. حدّد الكائن الأسود الذي أنشأناه في الخطوة رقم 10، وأزِل حدّه واملأه بالتدرج اللوني الشعاعي الموضّح في الشكل الثاني أدناه، وفي الأخير، أخفِ الشكل الناتج خلف الدائرة التي ملأناها للتو بألوان التدرج الرمادي الداكن. حدّد الدائرة الحمراء الأخرى واجلبها إلى الأمام (باستخدام الاختصار Ctrl + Shift + Right Square Bracket). أبقِ هذه الدائرة محدَّدة، وانتقل إلى قائمة كائن Object ثم Transform ثم Scale**، ثم حدّد خيار Non-Uniform، وأدخِل القيمة 104% في خانة أفقي Horizontal والقيمة 116% في خانة رأسي Vertical، ثم انقر على نسخ Copy، بعدها حرّك هذه النسخة بمقدار 3 بكسلات للأسفل. أعِد تحديد الدائرتين الحمراوتين، وافتح لوحة مستكشف المسار Pathfinder (من قائمة *Window* ثم Pathfinder)، وانقر على زر Minus Back. أزِل حدّ المسار المركَّب الناتج، ثم املأه بالتدرج اللوني الخطي الموضّح في الشكل الثاني أدناه. تأكّد من أن المسار المركَّب الناتج لا يزال محدَّدًا، وأنشئ نسخةً منه بالضغط على Ctrl + C ثم Ctrl + F. أبقِ هذه النسخة محدّّدةً وانتقل إلى قائمة تأثير Effect، ثم Stylize، ثم ظل ساقط Drop Shadow، واتبع البيانات الموضَّحة في الشكل الثالث أدناه، مع النقر على موافق OK. حدّد الشكل الثاني الذي أنشأناه في الخطوة رقم 11 وأنشئ نسخةً منه، ثم أحضر هذه النسخة إلى الأمام (Ctrl + Shift + Right Square Bracket). أبقِ هذه النسخة محدَّدةً، ثم استمر في الضغط على مفتاح Shift، وانقر على المسار المركّب الذي طبّقنا عليه تأثير الظل في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم، ثم حدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة، ثم أخفِ مجموعة القطع خلف المسار المركّب الأول الذي أنشأناه في الخطوة الحالية. استخدم أداة الدائرة (L) لإنشاء شكل دائري أبعاده 324×66 بكسل، وبحدّ مقداره 2 بكسل باللون الأبيض (#ffffff) وبلا تعبئة، ثم ضعه في الموضع الموضّح في الشكل الأول أدناه. أبقِ هذه الدائرة محدّدةً وانتقل إلى قائمة تأثير Effect، ثم ضبابية Blur، ثم Gaussian Blur، وأدخِل نصف قطر مقداره 2 بكسل وانقر على موافق. حدّد المسار المركّب الأول الذي أنشأناه في الخطوة رقم 12 وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم أحضر هذه النسخة إلى الأمام (Ctrl + Shift + Right Square Bracket). أبقِ هذه النسخة محدَّدةً، واستمر في الضغط على مفتاح Shift، بعده انقر على الدائرة التي طبّقنا عليها تأثير الضبابية blur في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم، ثم حدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة. سنضيف الآن بعض الإضاءة والظلال إلى الوعاء لإعطائه مظهرًا ثلاثي الأبعاد، واستخدم أداة الدائرة (L) وأداة القلم Pen Tool (باستخدام الاختصار P) لإنشاء شكلين باللون الأبيض كما هو موضّح في الشكل الأول أدناه. أعِد تحديد هذين الشكلين بعد رسمهما، واضغط على الاختصار Ctrl + G لتجميعهما. أبقِ هذه المجموعة محدَّدةً وطبّق تأثير Gaussian Blur بمقدار 5 بكسلات عليها. حدّد الآن الدائرة التي أنشأناها في الخطوة رقم 11 وأنشئ نسخةً منها (بالضغط على Ctrl + C ثم Ctrl + F)، ثم أحضِر هذه النسخة إلى الأمام (Ctrl + Shift + Right Square Bracket). تأكّد من أن هذه النسخة لا تزال محدَّدة، واستمر في الضغط على مفتاح Shift وانقر على المجموعة التي طبّقنا عليها تأثير الضبابية blur في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم، ثم حدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة، بعدها حدّد وجمّع (Ctrl + G) جميع الكائنات التي أنشأناها من بداية الخطوة رقم 10 إلى الخطوة الحالية، وبذلك ننتهي من وعاء الميزان. استخدم أداة المستطيل (M) لإنشاء مستطيل أخضر أبعاده 22×7 بكسل، ثم ضعه في الموضع الموضّح في الشكل الأول أدناه. استخدم أداة التحديد المباشر (A) لتحديد نقطة ارتكاز المستطيل الأخضر العلوية اليسرى، وحرّكها بمقدار 1 بكسل إلى اليمين، ثم أزِل حدّ الشكل الأخضر واملأه باللون الأسود (#000001). تأكّد من أن هذا الشكل الأسود الناتج لا يزال محدّدًا، وانتقل إلى قائمة كائن Object ثم تحويل Transform ثم انعكاس Reflect، وحدّد الخيار أفقي Vertical ثم انقر على نسخ Copy. اسحب النسخة إلى اليمين وضعها في الموضع الموضّح أدناه. لا تنسى الاستمرار في الضغط على مفتاح Shift من لوحة المفاتيح للسحب السويّ. استخدم أداة المستطيل (M) لإنشاء مستطيل أحمر أبعاده 146×89 بكسل، ثم ضعه في الموضع الموضّح في الشكل الأول أدناه. أبقِ هذا المستطيل محدَّدًا، وانتقل إلى قائمة تأثير Effect، ثم Stylize، ثم زوايا مستديرة Round Corners؛ بعدها أدخِل نصف قطر مقداره 23 بكسلًا وانقر على موافق. حدّد المستطيل الناتج وانتقل إلى قائمة كائن Object، ثم Path، ثم إزاحة المسار Offset Path، وأدخِل إزاحةً بمقدار -9 بكسل وانقر على موافق. تأكّد من أن هذا المستطيل لا يزال محدَّدًا، ثم افتح لوحة Appearance (من قائمة Window ثم Appearance) وانقر على خيار الزوايا المستديرة Round Corners، بعدها أدخِل نصف قطر مقداره 11 بكسلًا وانقر على موافق. أخيرًا، حدّد المستطيلين اللذين أنشأناهما في الخطوة الحالية، وانتقل إلى قائمة كائن Object ثم Expand Appearance. استخدم أداة الخط Line Segment Tool (\) لإنشاء خط أفقي بحدٍّ أصفر وبلا تعبئة، وحدّد المستطيلين الأحمرين اللذين أنشأناهما في الخطوة رقم 16، ثم افتح لوحة مستكشف المسار Pathfinder (من قائمة Window ثم Pathfinder) وانقر على زر Minus Front. أبقِ المسار الناتج محدَّدًا، واستمر في الضغط على مفتاح Shift، مع النقر على الخط الأفقي الذي أنشأناه في الخطوة الحالية. بعد ذلك انقر على زر تقسيم Divide من لوحة مستكشف المسار Pathfinder، وتأكّد من أن المجموعة الناتجة لا تزال محدَّدة، ثم اضغط على الاختصار Ctrl + Shift + G لفك تجميعها، ثم حدّد الكائن الأحمر السفلي وأزِله. حدّد الكائن الأحمر الذي أنشأناه في الخطوة رقم 17 وأزِل حدّه، ثم املأه بالتدرج اللوني الخطي الموضّح في الشكل الأول أدناه. أبقِ الشكل الناتج محدَّدًا وأنشئ نسخةً منه (Ctrl + C ثم Ctrl + F)، ثم حرّك هذه النسخة بمقدار 8 بكسلات للأعلى، ثم استبدل لون التعبئة الحالي بالتدرج اللوني الشعاعي الموضّح في الشكل الثاني أدناه. أخفِ بعد ذلك الشكل الناتج خلف الشكل الأول الذي أنشأناه في الخطوة الحالية. ضع الوعاء في الموضع الذي تراه في الشكل الأول أدناه، ثم استخدم أداة المستطيل (M) لإنشاء مستطيل أسود أبعاده 32×25 بكسل، ثم ضعه في الموضع الموضّح في الشكل الثاني أدناه. اختر أداة إضافة نقاط ارتكاز Add Anchor Point Tool (+)، ثم انقر على النقطة المميزة باللون الأحمر لإضافة نقطة ارتكاز جديدة للمستطيل الأسود، وحرّكها بمقدار 15 بكسلًا للأعلى. اختر أداة تحويل نقاط الارتكاز Convert Anchor Point Tool (باستخدام الاختصار Shift + C)، ثم انقر على نقطة الارتكاز التي حرّكتها للتو، واضغط بالفأرة واسحبها إلى اليسار أثناء الضغط على مفتاح Shift. أنشئ نسخةً من الكائن الأسود (بالضغط على Cttrl + C ثم Ctrl + F) بعد ضبطه، ثم استبدل لون حدّ هذه النسخة الحالي باللون الأحمر، بعد ذلك حدّد نقاط الارتكاز الثلاث المميزة باللون الأزرق، وحرّكها بمقدار 4 بكسلات للأسفل. حدّد الكائنين اللذين أنشأناهما في الخطوة رقم 19، وأزِل حدّيهما ثم املأهما بالتدرجات اللونية الخطية الموضحة أدناه. أعِد تحديد الشكل الأكبر الذي أنشاناه في الخطوة الحالية وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم انتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، واتبع البيانات الموضّحة أدناه وانقر على موافق. حدّد الشكل الناتج ثم اضغط على الاختصار Ctrl + X لقصه، ثم اختر أداة التحديد Selection Tool (باستخدام الاختصار V)، وانقر نقرًا مزدوجًا على مجموعة القطع التي أنشأناها في الخطوة رقم 12، مع الضغط على الاختصار Ctrl + F للصق الشكل الذي قصصناه في الخطوة الحالية، ثم انقر نقرًا مزدوجًا في أيّ مكان خارج مجموعة القطع. استخدم أداة القلم (P) وأداة التدرج اللوني Gradient Tool (باستخدام الاختصار G) لإنشاء شكلين كما هو موضّح أدناه، ثم أعِد تحديد هذين الشكلين بعد رسمهما واضغط على الاختصار Ctrl + G لتجميعهما، ثم انتقل إلى قائمة كائن Object ثم Transform ثم انعكاس Reflect، بعدها حدّد الخيار رأسي Vertical، وانقر على نسخ Copy. اسحب هذه المجموعة إلى اليمين وضعها في المكان الموضّح أدناه، ولا تنسَ الاستمرار في الضغط على مفتاح Shift من لوحة المفاتيح للسحب السويّ. أخيرًا، أخفِ المجموعتين اللتين أنشأناهما في الخطوة الحالية خلف الوعاء. يجب أن يبدو ميزان مطبخك الآن كما يلي: إنشاء قرص ميزان المطبخ المدرج استخدم أداة الدائرة (L) لإنشاء دائرة حمراء أبعادها 222×222 بكسل، ثم أنشئ نسخةً منها (بالضغط على Ctrl + C ثم Ctrl + F). أزِل حدّ هذه النسخة واملأها باللون الأبيض (#ffffff)، ثم أخفِ الدائرة الناتجة خلف الدائرة الحمراء. حدّد الدائرة الحمراء الذي أنشأناها في الخطوة الحالية، وانتقل إلى قائمة كائن Object، ثم Path، ثم إزاحة المسار Offset Path، وأدخل نصف قطر مقداره 17 بكسلًا، مع النقر على موافق. حدّد الآن الدائرتين الملوّنتين باللون الأحمر، ثم افتح لوحة مستكشف المسار Pathfinder (من قائمة Window ثم Pathfinder)، وانقر على زر Minus Front. أزِل حدّ المسار المركّب الناتج، ثم املأه بالتدرج اللوني الخطي الموضّح أدناه. حدّد الدائرة البيضاء التي أنشأناها في الخطوة رقم 23 وانتقل إلى قائمة كائن Object ثم مسار Path ثم إزاحة المسار Offset Path، وأدخِل إزاحة بمقدار 8 بكسلات وانقر على موافق. أبقِ هذه النسخة محدَّدة، وبدّل بين لوني التعبئة والحدّ عن طريق النقر على السهم المنحني ذي الرأسين بجوار حاملَي ألوان الحدّ والتعبئة في لوحة الأدوات، ثم غيّر ثُخن حد الدائرة الناتجة إلى 3 بكسلات، ثم طبّق على هذه الدائرة تأثير Gaussian Blur بمقدار 2 بكسل. يمكنك إظهار المساطر Rulers من قائمة عرض View ثم عرض المساطر View Rulers ثم إظهار المسطرة Show Ruler أو باستخدام الاختصار Ctrl + R، ثم اسحب دليلًا أفقيًا وعموديًا من المساطر (إذا كانت الأدلة مقفلة، فانتقل إلى قائمة عرض View، ثم الأدلة Guides، ثم قفل الأدلة Lock Guides) أو باستخدام الاختصار Ctrl + Alt + ;. حدّد الآن الدائرة البيضاء التي أنشأناها في الخطوة رقم 23، واستمر في الضغط على مفتاح Shift، ثم انقر على الدليلين اللذين أنشأناهما للتو، بعدها حرّر مفتاح Shift وانقر على الدائرة التي أنشأناها في الخطوة رقم 23 مرةً أخرى (لتثبيت موضعها). افتح لوحة المحاذاة Align (من قائمة Window ثم Align)، وانقر على زر المحاذاة المركزية أفقيًا Horizontal Align Center، وعلى زر المحاذاة المركزية رأسيًا Vertical Align Center. استخدم أداة الخط Line Segment Tool (\) لإنشاء خط رأسي بطول 6 بكسلات، وبحدِّ أحمر داكن (#231f20) مقداره 1 بكسل وبلا تعبئة، ثم ضع هذا الخط في الموضع الموضّح في الشكل الثاني أدناه. أبقِ هذا الخط محدَّدًا، واختر أداة التدوير Rotate Tool (باستخدام الاختصار R)، ثم استمر في الضغط على مفتاح Alt وانقر على نقطة تقاطع الدليلين، بعدها دخِل زاويةً مقدارها 1.44 درجة، وانقر على نسخ، ثم كرّر ذلك بالضغط على الاختصار Ctrl + D لتحصل على النتائج الموضّحة أدناه. حدّد الخط الأول الذي أنشأناه في الخطوة الحالية، واضغط على الاختصار Ctrl + C لنسخه، ثم حدّد جميع الخطوط التي أنشأناها في الخطوة الحالية وجمّعها (Ctrl + G). اضغط على الاختصار Ctrl + F للصق الخط الذي نسخناه في الخطوة رقم 26، ثم افتح لوحة التحويل Transform (من قائمة Window ثم Transform). اضبط نقطة التحويل المرجعية على المركز العلوي، وغيّر الخيار H إلى 9 بكسلات. أبقِ الخط الناتج محدَّدًا، واختر أداة التدوير (R)، ثم استمر في الضغط على المفتاح Alt وانقر على نقطة تقاطع الدليلين، ثم أدخِل زاويةً مقدارها 14.4 درجة، وانقر على نسخ Copy، ثم كرّر ذلك بالضغط على الاختصار Ctrl + D لتحصل على النتائج الموضَّحة أدناه. حدّد الخط الأول الذي أنشأناه في الخطوة الحالية، واضغط على الاختصار Ctrl + C لنسخه، ثم حدّد جميع الخطوط التي أنشأناها في الخطوة الحالية وجمّعها (Ctrl + G). تأكّد من أن المجموعة التي أنشأناها للتو لا تزال محدَّدة، وانقر نقرًا مزدوجًا على أيقونة أداة التدوير Rotate Tool من لوحة الأدوات، ثم أدخِل زاوية مقدارها 7.2 درجة وانقر على موافق. اضغط على الاختصار Ctrl + F للصق الخط الذي نسخناه في الخطوة رقم 27. حدّد هذا الخط وافتح لوحة Transform (من قائمة Window ثم Transform)، ثم اضبط نقطة التحويل المرجعية على المركز العلوي، وغيّر الخيار H إلى القيمة 12.5 بكسل، ثم حدّد الخط الناتج وغيّر ثُخن حدّه إلى 1.5 بكسل، ثم اختر أداة التدوير (R) واستمر في الضغط على مفتاح Alt، مع النقر على نقطة تقاطع الدليلين. بعد ذلك أدخِل زاويةً مقدارها 14.4 درجة، وانقر على نسخ Copy، ثم كرّر ذلك بالضغط على الاختصار Ctrl + D لتحصل على النتائج الموضّحة أدناه. أخيرًا، حدّد جميع الخطوط التي أنشأناها في الخطوة الحالية وجمّعها (Ctrl + G). افتح لوحة Character (من قائمة Window، ثم Type، ثم Character)، وحدّد الخط Palatino Linotype، واجعله من النوع العادي Regular، واضبط حجمه على 8 بكسلات. اختر أداة الكتابة Type Tool (باستخدام الاختصار T) وانقر على لوحة الرسم، ثم أضف النص "0" واضبط لونه على اللون الأسود (#000000). حدّد النص "0" وافتح لوحة فقرة Paragraph (من قائمة Window ثم Type ثم Paragraph)، وانقر على أيقونة محاذاة مركزية Align Center، ثم ضع النص في الموضع الصحيح الموضّح في الشكل الثاني أدناه. اختر أداة التدوير (R)، ثم استمر في الضغط على مفتاح Alt، وانقر على نقطة تقاطع الدليلين، ثم أدخِل زاوية مقدارها 14.4 درجة، وانقر على نسخ Copy، ثم كرّر ذلك بالضغط على الاختصار Ctrl + D لتحصل على النتائج الموضّحة أدناه. يجب الآن تدوير جميع الأصفار بحيث تكون بالاتجاه الصحيح. حدّد الرقم "0" الموضّح في الشكل الأول أدناه وانتقل إلى قائمة كائن Object ثم Transform ثم تدوير Rotate، وأدخِل زاويةً مقدارها 14.4 درجة، مع النقر على موافق. حدّد الرقم "0" الموضّح في الشكل الثالث أدناه واضغط على الاختصار Ctrl + D مرتين لتدوير هذا الرقم بزاوية تبلغ حوالي 28.8 درجة. كرّر الخطوات نفسها على الأصفار المتبقية من الجزء الأيمن من القرص المدرَّج. حدد الرقم "0" الموضّح في الشكل الأول أدناه، وانتقل إلى قائمة كائن Object، ثم Transform، ثم تدوير Rotate، وأدخِل زاويةً مقدارها -14.4 درجة وانقر على موافق. حدّد الرقم "0" الموضّح في الشكل الثالث أدناه واضغط على الاختصار Ctrl + D مرتين لتدوير هذا الرقم بزاوية تبلغ حوالي -28.8 درجة، ثم كرر الخطوات نفسها على الأصفار المتبقية من الجزء الأيسر من القرص المدرَّج. حدد جميع الأصفار التي أنشأناها في الخطوات السابقة، وانتقل إلى قائمة كائن Object ثم Transform ثم Scale، وحدّد الخيار موحّد Uniform. بعد ذلك أدخِل القيمة 104% في قسم Scale، ثم انقر على موافق OK. أبقِ الأصفار الناتجة محدَّدة، ثم حرّكها بمقدار 3 بكسلات للأسفل. استخدم أداة الكتابة (T) لتغيير الأصفار إلى الأرقام والحروف الصحيحة كما هو موضّح في الشكل التالي: حدّد النصوص 2 و3 و4 و1kg، ثم افتح لوحة Character (من قائمة Window ثم Type ثم Character). غيّر حجم الخط إلى 20 بكسلًا واضبط لونه على اللون الأحمر (#ff2100)، ثم استخدم أداة الكتابة (T) لتحديد كلمة kg، وغيّر حجم الخط إلى 10 بكسلات. حدّد النص "1kg"، وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم ضع هذه النسخة في الموضع الموضّح في الشكل الثالث أدناه. اختر بعد ذلك أداة الكتابة (T)، وحدّد الرقم "1" وغيّره إلى الرقم "5". يجب أن يبدو قرص ميزان المطبخ المدرَّج مثل الشكل التالي: لنرسم الآن إبرة المؤشر. استخدم أداة الدائرة (L) لإنشاء دائرة سوداء أبعادها 24×24 بكسل، ثم استخدم أداة المستطيل (M) لإنشاء مستطيل أحمر أبعاده 50×64 بكسل. أعِد تحديد الكائنين اللذين أنشأناهما في الخطوة الحالية، وافتح لوحة المحاذاة Align (من قائمة Window ثم Align)، وانقر على زر المحاذاة المركزية أفقيًا Horizontal Align Center، ثم انقر على زر المحاذاة العلوية رأسيًا Vertical Align Top. استخدم أداة التحديد المباشر (A) لتحديد نقطة ارتكاز المستطيل الأحمر العلوية اليمنى ثم أزِلها، ثم حدّد نقطة الارتكاز العلوية اليسرى وحرّكها بمقدار 25 بكسلًا إلى اليمين. حدد الدائرة السوداء التي أنشأناها في الخطوة رقم 36، وانتقل إلى قائمة كائن Object ثم Path ثم Offset Path، بعدها أدخِل إزاحةً مقدارها 32 بكسلًا وانقر على موافق. أبقِ هذه الدائرة الناتجة محدَّدةً، ثم استمر في الضغط على مفتاح Shift، وانقر على الكائن الأحمر الذي أنشأناه في الخطوة رقم 36. افتح لوحة مستكشف المسار Pathfinder (من قائمة Window ثم Pathfinder)، وانقر على زر التقاطع Intersect. حدّد الدائرة السوداء التي أنشأناها في الخطوة رقم 36 وأنشئ نسخةً منها (بالضغط على Ctrl + C ثم Ctrl + F). حدّد هذه النسخة، ثم استمر في الضغط على مفتاح Shift وانقر على الكائن الأحمر، ثم انقر على زر الدمج Unite من لوحة مستكشف المسار Pathfinder. استخدم أداة المستطيل (M) لإنشاء مستطيل أزرق أبعاده 9×66 بكسل، ثم ضعه في الموضع الموضّح في الشكل الأول أدناه. استخدم أداة التحديد المباشر (A) لتحديد نقطة ارتكاز المستطيل الأزرق العلوية اليسرى، وحرّكها بمقدار 3 بكسلات إلى اليمين، ثم حدّد نقطة الارتكاز العلوية اليمنى وحرّكها بمقدار 3 بكسلات إلى اليسار. أبقِ الكائن الأزرق محدَّدًا، وانتقل إلى قائمة تأثير Effect ثم Stylize ثم زوايا مستديرة Round Corners، وأدخِل نصف قطر مقداره 2 بكسل، ثم انقر على موافق. حدّد الكائن الناتج وانتقل إلى قائمة كائن Object ثم Expand Appearance. تأكّد من أن الكائن الأزرق لا يزال محدَّدًا، واستمر في الضغط على مفتاح Shift، بعدها انقر على الكائن الأحمر الذي أنشأناه في الخطوة رقم 37، ثم افتح لوحة Pathfinder (من قائمة Window ثم Pathfinder)، وانقر على زر الدمج Unite. أزِل حدّ الكائن الناتج واملأه بالتدرج اللوني الخطي الموضّح أدناه، ثم أخفِ الكائن الناتج خلف الدائرة السوداء التي أنشأناها في الخطوة رقم 36. استخدم أداة الخط Line Segment Tool (\) لإنشاء خط رأسي بطول 21 بكسلًا، وبحدّ مقداره 1 بكسل وبلون أحمر (#b3382c) وبلا تعبئة، ثم ضع هذا الخط في الموضع الصحيح الموضّح أدناه. حدّد الدائرة السوداء وانتقل إلى قائمة كائن Object ثم Transform ثم Scale، وحدّد الخيار Uniform، بعدها أدخِل القيمة 80% في قسم Scale وانقر على موافق. أزِل حدّ الدائرة الناتجة واملأها بالتدرج اللوني الخطي الموضح أدناه. أبقِ هذه الدائرة محدَّدةً وانتقل إلى قائمة كائن Object ثم Path ثم Offset Path، ثم أدخِل إزاحةً مقدارها -3 بكسل، وانقر على موافق، بعدها استبدل لون تعبئة الدائرة الحالي باللون البرتقالي الداكن (#77623e). اختر أداة المضلع Polygon Tool من لوحة الأدوات، وانقر على لوحة الرسم، ثم أدخِل القيمة 4.5 بكسل في خانة نصف القطر Radius، والقيمة 6 في خانة الأضلاع Sides، ثم انقر على موافق. ضع هذا الشكل السداسي في الموضع الموضّح في الشكل الأول أدناه، ثم أزِل حدّه واملأه بالتدرج اللوني الخطي الموضح أدناه. أبقِ الشكل السداسي الناتج محدّدًا وانتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، واتبع البيانات الموضّحة وانقر على موافق. حدّد الآن الدائرة الأصغر التي أنشأناها في الخطوة رقم 39، وانتقل إلى قائمة كائن Object ثم Path ثم Offset Path، بعد ذلك أدخِل إزاحةً مقدارها -4.5 بكسل وانقر على موافق، ثم أحضر هذه الدائرة إلى الأمام Ctrl + Shift + Right Square Bracket. أخيرًا، استبدل لون تعبئة هذه الدائرة الحالي باللون الأرجواني المائل إلى الرمادي الفاتح #dad5da. حدّد وجمّع (Ctrl + G) جميع الكائنات التي أنشأناها من بداية الخطوة رقم 36 إلى الآن، وبذلك تنتهي إبرة المؤشر التي يجب وضعها في الموضع الموضّح في الشكل الأول أدناه. اختر أداة التحديد (V) وانقر نقرًا مزدوجًا على إبرة المؤشر، ثم حدّد الشكل الأحمر الداكن وانتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، واتبع البيانات الموضّحة في الشكل الثاني أدناه وانقر على موافق، ثم انقر نقرًا مزدوجًا في أي مكان خارج المجموعة التي طبّقنا عليها ظلًا للتو. سننشئ البراغي الآن. استخدم أداة الدائرة (L) وأداة التدرج (G) لإنشاء دائرة كما هو موضّح في الشكل الأول أدناه، ثم أنشئ نسخةً منها (بالضغط على Ctrl + C ثم Ctrl + F)، واستبدل لون تعبئة هذه النسخة الحالي باللون الأصفر المائل إلى الرمادي (#b4b5ac). حرّك الدائرة الناتجة بمقدار 1 بكسل للأسفل، ثم ضعها خلف الدائرة الأولى التي أنشأناها في الخطوة الحالية. حدد أول دائرة أنشأناها في الخطوة رقم 42، وانتقل إلى قائمة كائن Object ثم Path ثم Offset Path، وأدخِل إزاحةً مقدارها -3 بكسل وانقر على موافق، بعدها استبدل لون تعبئة هذه الدائرة الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه. أبقِ الدائرة الناتجة محدَّدة، وافتح نافذة إزاحة المسار Offset Path مرةً أخرى، ثم أدخِل إزاحةً مقدارها -2 بكسل .وانقر على موافق، ثم استبدل لون تعبئة هذه الدائرة الحالي بالتدرج اللوني الشعاعي كما هو موضّح أدناه. حدّد الدائرة الأصغر الذي أنشأناها في الخطوة رقم 43 وأنشئ نسخةً منها (بالضغط على Ctrl + C ثم Ctrl + F)، ثم استبدل لون تعبئة هذه النسخة الحالي باللون الأزرق المائل إلى الرمادي الداكن (#808285). أبقِ الدائرة الناتجة محددةً وانتقل إلى قائمة تأثير Effect ثم Artistic ثم Colored Pencil، واتبع البيانات الموضّحة أدناه وانقر على موافق، ثم طبّق تأثير Feather بمقدار 2 بكسل على الدائرة الناتجة، ثم قلّل التعتيم Opacity إلى 30%. استخدم أداة المستطيل (M) لإنشاء مستطيل أبعاده 8×2 بكسل باللون الأزرق، ثم انتقل إلى قائمة كائن Object ثم Transform ثم Rotate، وأدخِل زاويةً مقدارها 90 درجة وانقر على نسخ Copy. أعِد تحديد المستطيلين الملوّنين باللون الأرزق، وانتقل إلى قائمة تأثير Effect، ثم Stylize، ثم زوايا مستديرة Round Corners، وأدخِل نصف قطر مقداره 1 بكسل وانقر على موافق. أبقِ المستطيلات الناتجة محدَّدةً وانتقل إلى قائمة كائن Object ثم **Expand **Appearance، ثم افتح لوحة مستكشف المسار Pathfinder (من قائمة Window ثم Pathfinder)، وانقر على زر دمج Unite. ضع الكائن الناتج في الموضع الموضّح أدناه، ثم أزِل حدّ هذا الكائن الأزرق، ثم املأه بالتدرج اللوني الشعاعي كما هو موضّح أدناه. حدّد الشكل الذي أنشأناه في الخطوة رقم 45 وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F). احتفظ بهذه النسخة محددة، ثم بدّل بين لوني التعبئة والحدّ عن طريق النقر على السهم المنحني ذي الرأسين بجوار حاملَي ألوان التعبئة والحدّ في لوحة الأدوات، ثم غيّر ثُخن حدّ الكائن الناتج إلى 0.5 بكسل، واستبدل لون الحدّ الحالي باللون الأخضر المائل إلى اللون الرمادي الداكن (#41463c)، ثم طبّق تأثير Feather بمقدار 1 بكسل. أعِد تحديد الكائنين اللذين أنشأناهما من الخطوة رقم 45 إلى الخطوة الحالية، وانتقل إلى قائمة كائن Object ثم Transform ثم Rotate، وأدخِل زاويةً مقدارها 12 درجة وانقر على موافق. حدّد وجمّع (Ctrl + G) جميع الكائنات التي أنشأناها من بداية الخطوة رقم 42 إلى الخطوة الحالية، وبذلك يكون البرغي قد أصبح جاهزًا. كرّر الخطوات السابقة نفسها لرسم البرغي الثاني، ثم ضع هذه البراغي في المواضع الموضّحة أدناه. حدّد جميع الكائنات التي أنشأناها من بداية الخطوة رقم 23 إلى الآن وجمّعها (Ctrl + G)، وبذلك يكون قرص ميزان المطبخ المدرَّج قد أصبح جاهزًا، حيث يجب أن تضعه في الموضع الموضّح في الشكل التالي: اختر أداة التحديد (V) وانقر نقرًا مزدوجًا على القرص المدرَّج، ثم حدّد المسار المركب كما هو موضّح أدناه، واضغط على الاختصار Ctrl + C لنسخه، ثم انقر نقرًا مزدوجًا في أيّ مكان خارج القرص المدرَّج واضغط على الاختصار Ctrl + F للصق المسار المركب الذي نسخناه في الخطوة الحالية. أبقِ هذا الكائن محدّدًا وانتقل إلى قائمة تأثير Effect ثم Stylize ثم **ظل ساقط Drop Shadow، واتّبع البيانات الموضّحة أدناه، مع النقر على موافق. حدّد الشكل الأول الذي أنشأناه في الخطوة رقم 8 وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم أحضر هذه النسخة إلى الأمام (Ctrl + Shift + Right Square Bracket). أبقِ هذه النسخة محدّدةً، ثم استمر في الضغط على مفتاح Shift، وانقر على المسار المركّب التي طبّقنا عليه تأثير الظل في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم، ثم حدّد خيار إنشاء قناع القطع Make Clipping Mask من القائمة. أخيرًا، أخفِ مجموعة القطع خلف قرص ميزان المطبخ المدرّج. حدّد جميع الكائنات التي أنشأناها من بداية الخطوة رقم 2 حتى الآن وجمّعها (Ctrl + G)، وبذلك يكون ميزان المطبخ قد أصبح جاهزًا. لننشئ الخلفية الآن، وهنا استخدم أداة المستطيل (M) وأداة التدرج (G) لإنشاء مستطيل أبعاده 864×736 بكسل، ثم ضع ميزان المطبخ ضمن هذه الخلفية. وبهذا نتحصل على الشكل النهائي الآتي: ترجمة -وبتصرّف- للمقال Learn to create a Realistic Kitchen Scale in Adobe Illustrator لصاحبه Bao Nguyen. اقرأ أيضًا كيفية إنشاء عربة يدوية مليئة بالرمال باستخدام إليستريتور كيفية رسم حافظة ورقية Clipboard باستخدام إليستريتور كيفية رسم شخصية القطة السوداء المخيفة باستخدام إليستريتور كيفية رسم شخصية الكنغر الملاكم باستخدام إليستريتور إنشاء ساعة كاسيو Casio في الإليستريتور كيفية تصميم قبعة ساحر باستخدام برنامج Adobe Illustrator
-
يقدّم النظام المساعد المساعدة أثناء رسم الخطوط أو الدوائر المنتظمة. يمكن أن تعمل أداة المساعد بوصفها شكل معاينة، أو يمكنك الانجذاب Snap إليها باستخدام أداة الفرشاة بيد حرة Freehand brush. يمكنك تحديد خيار الانجذاب إلى أداة المساعد Snap to Assistants في خيارات الأداة الخاصة بالفرشاة بيد حرة لتفعيل هذا الانجذاب. نقاط التلاشي المساعدة أثناء العمل في كريتا أنواع الأدوات المساعدة المتاحة في كريتا يمكنك تحديد نوع أداة المساعِد من خلال خيارات الأداة. النوع الإهليجي Ellipse مساعد لرسم الأشكال الإهليجية والدائرية. يتكون هذا المساعد من ثلاث نقاط: تُشكّل أول نقطتين محور الشكل الإهليجي، وتُستخدَم النقطة الثالثة لتحديد عرضه. كما يوجد النوع الإهليجي المركزي Concentric Ellipse الذي هو النوع الإهليجي نفسه، ولكنه يسمح بإنشاء أشكال إهليجية متحدة المركز مع بعضها البعض. إذا ضغطت على مفتاح Shift أثناء الضغط على المقبضين الأوليين، فسينجذبان إلى الخطوط الأفقية أو الرأسية تمامًا، وإذا ضغطت على مفتاح Shift أثناء الضغط على المقبض الثالث، فسينجذب إلى دائرة مثالية. النوع المنظوري Perspective تتيح هذه المسطرة رسم شبكات على رقعة الرسم ومعالجتها والتي يمكن أن تكون بمثابة أدلة رسم منظورية، حيث يمكن إضافة شبكة إلى رقعة الرسم عن طريق النقر أولًا على أداة المساعد الموجودة في شريط الأدوات ثم النقر على أربع نقاط من رقعة الرسم والتي ستكون بمثابة زوايا شبكتك الأربعة. يمكن استخدام هذه الشبكة مع مستشعر "المنظور perspective" الذي يمكن أن يؤثر على الفُرش. يمكن تعديل الشبكة عن طريق سحب أيّ من زواياها الأربعة، ويمكن تمديد الشبكة عن طريق النقر والسحب لنقطةٍ ما في منتصف إحدى أطرافها، مما يسمح بتوسيع الشبكة من زوايا أخرى. يمكن تكرار هذه العملية على أيّ شبكة لاحقة أو قسم منها. إذا ضغطت على مفتاح Shift أثناء الضغط على أي من المقابض الموجودة في الزوايا، فستنجذب هذه المقابض إلى أحد مقابض الزوايا الأخرى، ويمكنك حذف أي شبكة من خلال النقر على زر إلغاء Cancel في مركزها. يمكن استخدام هذه الأداة لإنشاء مرجع لرسم المشاهد المعقدة. المسطرة Ruler هناك ثلاثة أدوات مساعدة في هذه المجموعة هي: المسطرة Ruler: يساعد في إنشاء خط مستقيم بين نقطتين. المسطرة اللانهائية Infinite Ruler: يستكمل خطًا مستقيمًا خارج النقطتين المرئيتين على رقعة الرسم. المسطرة المتوازية Parallel Ruler: تتيح هذه المسطرة رسم خط موازٍ للخط الفاصل بين النقطتين في أيّ مكان على رقعة الرسم. إذا ضغطت على مفتاح Shift أثناء الضغط على المقبضين الأوليين، فسينجذبان إلى الخطوط الأفقية أو الرأسية تمامًا. النوع المنحني Spline يتيح هذا المساعد وضع أربع نقاط وضبطها لإنشاء منحنى بيزييه مكعّب، ثم يمكنك الرسم على طول المنحنى مع انجذاب أثر الفرشاة مباشرة إلى الخط المنحني، وبالتالي ستنشئ منحنيات مثالية دائمًا. إذا ضغطت على مفتاح Shift أثناء الضغط على المقبضين الأوليين، فسينجذبان إلى الخطوط الأفقية أو الرأسية تمامًا، وإذا ضغطت على مفتاح Shift أثناء الضغط على المقبض الثالث أو الرابع، فسينجذبان اعتمادًا على المقبض المرتبطين به. نقطة التلاشي Vanishing Point يتيح هذا المساعد إنشاء نقطة تلاشي، وتُستخدَم عادةً مع خط أفقي، حيث يُرسَم خط المعاينة وجميع الخطوط المنجذبة إلى هذا الخط. نقطة التلاشي هي نقطة واحدة مع أربع نقاط مساعدة لمحاذاة خطوط المنظور المُنشَأة مسبقًا. تُنشَأ نقطة التلاشي وتُعدَّل باستخدام أداة المساعد. إذا ضغطت على مفتاح Shift أثناء الضغط على المقبض المركزي، فسينجذب إلى الخطوط الأفقية أو الرأسية تمامًا اعتمادًا على المكان الذي كان فيه سابقًا. كما يعرض مساعد نقطة التلاشي خطوطًا عامة متعددة. سيُحدَّد مساعد نقطة التلاشي مباشرةً عندما تنتهي من إنشائه أو تحريكه، وبالتالي يمكنك تعديل عدد الخطوط المعروضة في خيارات أداة المساعد. النقطة واسعة الزاوية Fish Eye Point تشبه مساعد نقطة التلاشي، حيث يكون هذا المساعد مخصَّصًا لكل مجموعة من الخطوط المتوازية في مساحة ثلاثية الأبعاد. يمكنك استخدامها بفعالية من خلال استخدام نقطتين واسعتي الزاوية، بحيث تكون النقطة الثانية تبعد بمقدار 90 درجة عن النقطة الأولى، ثم إضافة نقطة تلاشي لمركز كل منهما، أو يمكنك دمج إحدى النقطتين مع مسطرة متوازية ونقطة تلاشي، أو دمج هذه النقطة مع نقطتي تلاشي. لن يؤمّن هذا المساعد الاستجابة أو الانجذاب بين نقاط التلاشي فحسب، بل سيعطي استجابة إلى يسار ويمين المساعد، حيث يمكنك استخدامه في حالات خاصة مثل الصور البانورامية شاملة الرؤية Panoramas بسهولة نسبيًا. إذا ضغطت على مفتاح Shift أثناء الضغط على المقبضين الأوليين، فسينجذبان إلى الخطوط الأفقية أو الرأسية تمامًا، وإذا ضغطت على مفتاح Shift أثناء الضغط على المقبض الثالث، وسينجذب إلى دائرة مثالية. منظور من نقطتين 2 Point Perspective (خاص بالإصدار 5.0) يبسّط هذا المساعد إعداد نقطتين منظوريتين عن طريق وضع نقطتي التلاشي والمسطرة الرأسية المتوازية ضمن مساعد واحد، مما يسمح برسم شبكة من المربعات. يتطلب هذا المساعد ثلاث نقاط كحد أدنى هي: نقطتان للمنظور، وثالثة لنقطة عند منتصف نقاط التلاشي التي تتحكم في كيفية رسم الشبكة. كما يوجد خيار إضافي في خيارات الأداة هو الكثافة Density التي تتحكم في مدى كثافة الشبكة. يتيح خيار Enable Vertical Ruler تعطيل المسطرة الرأسية، بحيث يتألف المساعد من نقطتي تلاشي وشبكة فقط. يكفي منظور مكوّن من نقطتين مع محدّد منطقة لرسم منطقة داخلية (المساعد ملوّن باللون الأزرق هنا) إعداد كريتا لمنظورات الرسم الهندسي إليك مثال على كيفية استخدام أدوات مساعِد الرسم بعد أن تعرّفتَ على مجموعة واسعة منها في كريتا، حيث يمكنك استخدام هذه الأدوات لإعداد كريتا للرسم الهندسي. سنقدّم فكرة عن كيفية إعداد أدوات المساعد لأنواع معينة من طرق العرض الهندسية، إذ لن نشرح كيفية تطبيق الإسقاط الحقيقي true projection. المنظور العمودي Orthographic المنظور العمودي Orthographic هو نمط رسم تحاول فيه النظر إلى شيء ما من اليسار أو من الأمام، وتحاول الحفاظ على كل شيء بمقياس دقيق على عكس تشويه المنظور perspective deformation. المساعد الرئيسي الذي يستخدمه هذا النوع هو المسطرة المتوازية Parallel Ruler، إذ يمكنك إعدادها أفقيًا أو رأسيًا لتتمكّن دائمًا من الوصول إلى الشبكة. المنظور المحوري Axonometric يمكن إعداد هذا المنظور باستخدام ثلاثة مساطر متوازية. المنظور المائل Oblique اضبط مسطرتين متوازيتين أفقيًا ورأسيًا، واضبط المسطرة الثالثة بمقدار زاوية تمثل العمق depth. المنظور الثنائي Dimetric ومتساوي القياس Isometric تُضبَط جميع مساطر المنظور متساوي القياس Isometric perspective الثلاثة عند 120 درجة من بعضها البعض باستثناء الحالة التي يكون فيها منظور ألعاب متساوي القياس game isometric، وهو نوع من الإسقاط الثنائي dimetric projection، حيث تكون القيم القطرية بمقدار 116.565 درجة من المحور الرئيسي. يمكن إعداد المنظور الثنائي dimetric projection بسهولة عن طريق انجذاب الأدوات المساعدة لشبكة. المنظور الثلاثي Trimetric تكون فيه الزوايا مختلفة عن بعضها البعض قليلًا، ويشبه المنظور متساوي القياس مع انحراف بمقدار زاوية بسيطة. المنظور الخطي Linear Perspective له ثلاثة أنواع هي: منظور من نقطة واحدة 1 Point Perspective: يمكن إعداد هذا المنظور باستخدام نقطة تلاشي واحدة ومسطرتين متقاطعتين ومتعامدتين من المساطر المتوازية. منظور من نقطتين 2 Point Perspective: يمكن إعداد هذا المنظور باستخدام نقطتي تلاشي ومسطرة متوازية رأسية واحدة. يمكن في بعض الأحيان أن يؤدي وضع نقاط التلاشي خارج الإطار قليلًا إلى تقليل تأثير هذا المنظور. كما يمكنك استخدام مسطرة منظور ذات نقطتين 2 Point Perspective لإعداد هذا المنظور بسرعة كبيرة. منظور من ثلاث نقاط 3 Point Perspective: يمكن إعداد هذا المنظور باستخدام ثلاث مساطر نقاط تلاشي. منطق نقطة التلاشي نقطة التلاشي هي النقطة التي يلتقي فيها أي خطين متوازيين، وهذا يعني أن المنظور من نقطة واحدة والمنظور من نقطتين متماثلان افتراضيًا. يمكننا إثبات ذلك من خلال تجربة صغيرة هي مسألة رسم طريق السكك الحديدية drawing a rail-road. قد تكون على دراية بهذه المسألة، وهي كيفية تحديد مكان الشعاع التالي، حيث سيجعل إسقاط المنظور الأشعة تبدو أقرب من بعضها البعض. الحل هو رسم خط في المنتصف ثم رسم خطوط قطريًا، فهذه الخطوط متوازية، مما يعني استخدام المسافة نفسها بالضبط. لكن يمكننا استخدام مساعد نقطة التلاشي بدلًا من ذلك بما أنها متوازية، ويمكننا استخدام مقابض المحاذاة لمحاذاتها مع قطر الشعاع ومع المحور الأفقي (المميز هنا باللون الأحمر). يمكن بعد ذلك استخدام هذا القطر بدوره لتحديد موضع حزمة الأشعة كما يلي: يمكن أن يكون هناك عدد لا نهائي من نقاط التلاشي في منظور خطي، بما أن أيّ مجموعة من الخطوط لها نقطة تلاشي (خارج الخطوط المسطحة على مستوى العرض). لذلك يسمح لك كريتا بضبط نقاط التلاشي بنفسك بدلًا من إجبارك على استخدام القليل منها فقط. المنظور واسع الزاوية Fish Eye perspective يعمل المنظور واسع الزاوية بطريقة مشابهة للمنظور الخطي، ولكن الفرق الكبير بينهما هو أن أيّ مجموعة متوازية من الخطوط في المنظور واسع الزاوية لها نقطتا تلاشي، حيث يكون لكل جانب نقطة تلاشٍ. أسهل طريقة لإعداد هذا المنظور هي استخدام منظور واسع الزاوية أفقي وآخر رأسي في المكان نفسه، واستخدام مساعد نقطة تلاشٍ في المنتصف. ولكن يمكنك إنشاء منظور واسع الزاوية أفقي مع آخر أفقي بالحجم نفسه، ووضعه في المنتصف كما يلي: أدوات العكس Mirror Tools يمكنك الرسم على جانب واحد من خط العكس، ثم ستنسخ أداة العكس Mirror Tools النتائج على جانب الخط الآخر، يمكنك تحريك موقع خط العكس عن طريق الإمساك بالمقبض. يمكنك الوصول إلى أدوات العكس من شريط الأدوات. تعطي أدوات العكس نتيجة مماثلة للأداة متعددة الفُرش Multibrush، ولكن تتبع الأداة متعددة الفُرش آثار الفرشاة التي تنشئها أدوات مثل أداة الفرشاة Freehand Brush على عكس أدوات المرآة التي يمكنك استخدامها مع أي أداة أخرى، حيث تتبع آثار الفرشاة التي تنشئها أدوات مثل أداة رسم الخطوط وأداة منحنى بيزييه Bezier Curve Tool والأداة متعددة الفُرش Multibrush. لأداة العكس نوعان هما: أداة العكس الأفقي Horizontal Mirror: تعكس النتائج على طول المحور الأفقي. أداة العكس الرأسي Vertical Mirror: تعكس النتائج على طول المحور الرأسي. هناك خيارات إضافية لكل أداة، ويمكنك الوصول إليها عن طريق النقر على سهم القائمة الموجودة على يمين كل أداة هي: أخفِ خط العكس السيني/الصادي Hide Mirror X/Y Line: يقفل محور العكس ويخفي خط هذا المحور. اقفل الخط السيني/الصادي Lock X/Y Line: يخفي أيقونة التحريك على خط المحور. انقل إلى منتصف رقعة الرسم السيني/الصادي Move to Canvas Center X/Y: ينقل خط المحور إلى مركز رقعة الرسم. العكس على طول خط مائل يمكن لأداة العكس أن تعكس الأشكال بالنسبة لخط رأسي أو أفقي فقط، ولكن يمكنك العكس على طول خط بزاوية دوران من خلال استخدام الأداة متعددة الفُرش Multibrush ومعاملاتها المختلفة، إذ تحتوي هذه الأداة على خيارات أكثر تقدمًا إضافة إلى استخدامها إلى التناظر الأساسي. ترجمة -وبتصرّف- للمقالين Painting with Assistants وMirror Tools من موقع Krita. اقرأ أيضًا كيفية تنظيف الخطوط الزرقاء التقليدية وتلوينها رقميا في برنامج Krita أفضل مؤشر في برنامج كريتا Krita لإنشاء عملك الفني رسم أزهار الأزاليا باستخدام أقنعة التحول في برنامج كريتا
-
هناك بعض البروتوكولات الضرورية للتشغيل السلس للإنترنت، ولكنها لا تتناسب تمامًا مع نموذج الطبقات الصارمة، وأحد هذه البروتوكولات هو نظام أسماء النطاقات Domain Name System -أو اختصارًا DNS-، وهو ليس تطبيقًا يستدعيه المستخدمون مباشرةً، ولكنه خدمةٌ تعتمد عليها جميع التطبيقات الأخرى تقريبًا، وذلك لاستخدام خدمة الأسماء لترجمة أسماء المضيفين إلى عناوين مضيفين؛ حيث يَسمح وجود مثل هذا التطبيق لمستخدمي التطبيقات الأخرى بالإشارة إلى المضيفين البعيدين بالاسم بدلًا من العنوان، أي تُستخدم خدمة الأسماء عادةً بواسطة تطبيقاتٍ أخرى بدلًا من البشر. الوظيفة المهمة الثانية هي إدارة الشبكة، والتي على الرغم من أنها ليست مألوفةً للمستخدم العادي، إلا أنها تُطبَّق من قِبل الأشخاص الذين يشغلون الشبكة نيابةً عن المستخدمين غالبًا. تُعَد إدارة الشبكات على نطاقٍ واسع مشكلةً من المشاكل الصعبة للشبكات ولا تزال محور الكثير من الابتكارات. سنلقي نظرةً على بعض القضايا والأساليب لحل هذه المشكلة أدناه. خدمة الأسماء باستخدام نظام DNS استخدمنا في معظم هذا الكتاب العناوين لتحديد المضيفين، إلا أن العناوين ليست سهلة الاستخدام تمامًا، على الرغم من أنها مناسبة للمعالجة بواسطة الموجّهات routers، ولهذا السبب يُخصَّص أيضًا اسمٌ فريد لكل مضيفٍ في الشبكة، ولقد رأينا فعليًا في هذا القسم بروتوكولات تطبيق مثل بروتوكول HTTP تستخدم أسماءً مثل www.princeton.edu. نشرح الآن كيفية تطوير خدمة التسمية لربط أسماءٍ سهلة الاستخدام مع عناوينٍ سهلة التوجيه. تسمى خدمات الأسماء أحيانًا برمجيات وسيطة middleware لأنها تملأ الفجوة بين التطبيقات والشبكة الأساسية. تختلف أسماء المضيفين عن عناوينهم بطريقتين مهمتين. أولهما، تكون الأسماء متغيرة الطول وذاتيةً مما يسهّل على البشر تذكرها، بينما تكون العناوين الرقمية ذات طولٍ ثابت مما يسهّل على الموجّهات معالجتها. ثانيًا، لا تحتوي الأسماء عادةً على معلوماتٍ تساعد الشبكة في تحديد موقع المضيف أو توجيه الرزم نحوه، بينما تحتوي العناوين في بعض الأحيان على معلومات توجيهٍ مضمَّنةٍ فيها، لكن العناوين المسطحة التي لا يمكن تقسيمها إلى أجزاء هي الاستثناء. سنقدم في البداية بعض المصطلحات الأساسية قبل الدخول في تفاصيل كيفية تسمية المضيفين في الشبكة. أولًا، تحدّد مساحة الأسماء name space مجموعة الأسماء المحتملة، حيث يمكن أن تكون مساحة الأسماء إما مسطحةً flat أي أن الأسماء غير قابلة لتقسيمها إلى مكونات، أو هرميةً hierarchical مثل أسماء ملفات يونيكس. ثانيًا، يحتفظ نظام التسمية بمجموعةٍ من ارتباطات bindings الأسماء بالقيم، إذ من الممكن أن تكون القيمة أي شيءٍ نريد أن يرجعه نظام التسمية عند تقديمه مع اسم، وهي عنوانٌ في كثير من الحالات. أخيرًا، آلية التحليل resolution mechanism وهي إجراءٌ يرجع القيمة المقابلة عند استدعائه باسم. وخادم الأسماء name server هو تطبيقٌ محددٌ لآلية تحليلٍ متوفرةٍ على الشبكة ويمكن الاستعلام عنها بإرسال رسالةٍ إليها. للإنترنت نظام تسميةٍ متطورٍ خاص نظرًا لحجمه الكبير هو نظام أسماء النطاقات Domain Name System -أو اختصارًا DNS-، لذلك نستخدم نظام DNS مثل إطار عملٍ لمناقشة مشكلة تسمية المضيفين. لاحظ أن الإنترنت لا يستخدم نظام DNS دائمًا، حيث احتفظت سلطةٌ مركزيةٌ تُسمى مركز معلومات الشبكة Network Information Center -أو اختصارًا NIC- بجدولٍ مسطحٍ لارتباطات الأسماء بالعناوين في وقتٍ مبكرٍ من تاريخ الإنترنت، عندما لم يكن هناك سوى بضع مئاتٍ من المضيفين على الإنترنت، وسُمِّي هذا الجدول HOSTS.TXT. صدّق أو لا تصدق، أنه كان هناك أيضًا كتاب ورقي مثل دفتر الهاتف يُنشر دوريًا ويعطي قائمةً بجميع الأجهزة المتصلة بالإنترنت وجميع الأشخاص الذين لديهم حساب بريدٍ إلكتروني على الإنترنت، وكلما أراد أحد المواقع إضافة مضيفٍ جديد إلى الإنترنت، أرسل مسؤول الموقع بريدًا إلكترونيًا إلى مركز NIC الذي يعطي زوج اسم / عنوان المضيف الجديد. وكانت تُدخل هذه المعلومات يدويًا في الجدول، ويُرسَل الجدول المعدّل بالبريد إلى المواقع المختلفة كل بضعة أيام، ويثبّت مسؤول النظام في كل موقع الجدولَ على كل مضيفٍ في الموقع. طُبِّق بعد ذلك تحليل الأسماء ببساطة من خلال إجراء بحثٍ عن اسم المضيف في النسخة المحلية من الجدول وإرجاع العنوان المقابل. لا ينبغي أن يكون مفاجئًا هنا عدم نجاح نهج التسمية عندما بدأ عدد المضيفين في الإنترنت في النمو، لذلك وُضِع نظام تسمية النطاقات في منتصف الثمانينات. يستخدم نظام DNS مساحة أسماءٍ هرميةٍ بدلًا من مساحة أسماءٍ مسطحة، ويُقسَّم "جدول" الارتباطات الذي يطبّق مساحة الأسماء هذه إلى أجزاءٍ منفصلةٍ وتُوزَّع عبر الإنترنت؛ وتوفَّر هذه الجداول الفرعية في خوادم الأسماء التي يمكن الاستعلام عنها عبر الشبكة. ما يحدث في الإنترنت هو أن المستخدم يقدّم اسم مضيفٍ لبرنامجٍ تطبيقي قد يكون مضمَّنًا في اسمٍ مركبٍ، مثل عنوان بريدٍ إلكتروني أو محدّد URL، ويشرك هذا البرنامج نظام التسمية لترجمة هذا الاسم إلى عنوان مضيفٍ host address. يفتح التطبيق بعد ذلك اتصالًا بهذا المضيف من خلال استخدام بعض بروتوكولات النقل مثل بروتوكول TCP مع عنوان IP الخاص بالمضيف. يُوضّح الشكل التالي هذا الموقف في حالة إرسال بريدٍ إلكتروني. تسلسل النطاقات الهرمي يطبّق نظام DNS مساحة أسماءٍ هرميةٍ لكائنات الإنترنت، حيث تُعالَج أسماء ملفات يونيكس Unix من اليسار إلى اليمين مع فصل مكونات التسمية بشرطةٍ مائلة slashes، بينما تُعالَج أسماء DNS من اليمين إلى اليسار وتُستخدم الفترات مثل فواصل، ولا يزال البشر يقرؤون أسماء النطاقات من اليسار إلى اليمين، على الرغم من معالجتها من اليمين إلى اليسار، فمثلًا اسم cicada.cs.princeton.edu هو اسمٍ نطاقٍ لمضيف. لاحظ أننا قلنا أن أسماء النطاقات تُستخدم لتسمية كائنات الإنترنت، وما نعنيه بهذا هو عدم استخدام نظام DNS لربط أسماء المضيفين مع عناوينهم، وإنما الأدق أن نقول أن نظام DNS يربط أسماء النطاقات مع قيم، ونفترض في الوقت الحالي أن هذه القيم هي عناوين IP. يمكن تصور التسلسل الهرمي لنظام DNS مثل شجرة بصورةٍ مشابهة لتسلسل ملفات يونيكس الهرمي، حيث تتوافق كل عقدةٍ في الشجرة مع نطاق، وتتوافق الأوراق الموجودة في الشجرة مع المضيفين الذين نسمّيهم. يوضّح الشكل السابق مثالًا عن تسلسل النطاق الهرمي، ويمكنك ملاحظة أنه لا ينبغي إسناد أي دلالاتٍ لمصطلح النطاق domain بخلاف أنه مجرد سياقٍ يمكن من خلاله تعريف أسماءٍ إضافية. يُعَد استخدام كلمة نطاق أيضًا في توجيه الإنترنت أمرًا مربكًا، حيث تعني شيئًا مختلفًا عما هو عليه في نظام DNS، فتكون مكافئةً تقريبًا لمصطلح نظامٍ مستقل autonomous system. لقد دار نقاشٌ طويلٌ عند تطوير تسلسل أسماء النطاق الهرمي لأول مرةٍ حول الاتفاقيات التي ستحكُم الأسماء التي ستوزَّع بالقرب من قمة التسلسل الهرمي، رغم أن التسلسل الهرمي ليس واسعًا جدًا في المستوى الأول، فهناك نطاقٌ لكل بلد، بالإضافة إلى النطاقات "الستة الكبار big six"، وهي edu. وcom. وgov. وmil. وorg. وnet.، وقد كان مقر جميع هذه النطاقات الستة في الأصل في الولايات المتحدة (في مكان اختراع الإنترنت ونظام DNS)، وبالتالي يمكن فقط للمؤسسات التعليمية المعتمَدة من الولايات المتحدة تسجيل اسم نطاق edu. على سبيل المثال. وسِّع عدد نطاقات المستوى الأعلى في السنوات الأخيرة جزئيًا للتعامل مع ارتفاع الطلب على أسماء نطاقات com.، وتتضمّن نطاقات المستوى الأعلى الأحدث biz. وcoop. وinfo.، ويوجد الآن أكثر من 1200 نطاقٍ عالي المستوى. خوادم الأسماء سنشرح الآن كيفية تطبيق هذا التسلسل الهرمي. تتمثل الخطوة الأولى في تقسيم التسلسل الهرمي إلى أشجارٍ فرعيةٍ تُسمى مناطق zones. يوضح الشكل الآتي كيفية تقسيم التسلسل الهرمي الوارد في الشكل السابق إلى مناطق، ويمكن التفكير في كل منطقةٍ على أنها متوافقةً مع بعض السلطات الإدارية المسؤولة عن هذا الجزء من التسلسل الهرمي. يشكّل المستوى الأعلى من التسلسل الهرمي على سبيل المثال، منطقةً تديرها شركة الإنترنت للأسماء والأرقام المخصَّصة Internet Corporation for Assigned Names and Numbers -أو اختصارًا ICANN-؛ ويوجد أسفل المستوى الأعلى منطقةٌ تمثّل جامعة برينستون Princeton؛ كما توجد ضمن هذه المنطقة بعض الأقسام التي لا تتحمّل مسؤولية إدارة التسلسل الهرمي، وبالتالي تظل في المنطقة على مستوى الجامعة؛ بينما تدير أقسامٌ أخرى مثل قسم علوم الحاسوب cs المنطقةَ الخاصة بها على مستوى القسم. تكمن أهمية المنطقة في أنها تتوافق مع وحدة التطبيق الأساسية في نظام DNS التي هي خادم الأسماء name server، حيث تُطبَّق المعلومات الواردة في كل منطقة في اثنين أو أكثر من خوادم الأسماء، وكل خادم أسماءٍ هو برنامجٌ يمكن الوصول إليه عبر الإنترنت. يرسل العملاء استعلاماتٍ إلى خوادم الأسماء التي تستجيب بالمعلومات المطلوبة، حيث تحتوي الاستجابة أحيانًا على الإجابة النهائية التي يريدها العميل، وتحتوي أحيانًا على مؤشرٍ لخادمٍ آخر يجب على العميل الاستعلام عنه بعد ذلك، وبالتالي يجب عدّ نظام DNS على أنه ممثَّلٌ بتسلسلٍ هرمي لخوادم الأسماء بدلًا من تسلسلٍ هرمي للنطاقات كما هو موضّح في الشكل التالي. تُطبَّق كل منطقةٍ ضمن اثنين أو أكثر من خوادم الأسماء بقصد الإستفادة من التكرار، أي أن المعلومات تبقى متاحةً حتى في حالة فشل خادم أسماءٍ واحد، وعلى الجانب الآخر لدى خادم الأسماء المحدد الحرية لتطبيق أكثر من منطقةٍ واحدة. يطبّق كل خادم أسماء معلومات المنطقة بمجموعةٍ من سجلات الموارد resource records. ويُعَد سجل المورد ارتباطًا بين اسم وقيمة أو بمعنى أخر مجموعةٌ مكونةٌ من 5 قيم تحتوي على الحقول التالية: (Name, Value, Type, Class, TTL) يمثّل حقلا الاسم Name والقيمة Value ما تتوقعه، بينما يحدد حقل النوع Type كيفية تفسير حقل القيمة Value، حيث يشير النوع Type=A إلى أن القيمة Value هي عنوان IP، وبالتالي فإن سجلات A تطبّق ربط الاسم بالعنوان، وتشمل أنواع السجلات الأخرى ما يلي: NS: يعطي حقلُ القيمة Value اسمَ النطاق لمضيفٍ يشغّل خادم أسماءٍ يعرف كيفية تحليل الأسماء داخل النطاق المحدد. CNAME: يعطي حقل القيمة Value الاسم المُتعارَف عليه canonical name لمضيفٍ معين والذي يُستخدَم لتحديد الأسماء المستعارة aliases. MX: يعطي حقل القيمة Value اسم النطاق لمضيفٍ يشغّل خادم البريد الذي يقبل رسائل نطاقٍ معيّن. يوجد أيضًا حقل الصنف Class للسماح للكيانات التي ليست من الصنف NIC بتحديد أنواع السجلات المفيدة. يُعَد حقل الصنف Class هو الوحيد المستخدَم على نطاقٍ واسع حتى الآن هو الذي يستخدمه الإنترنت والذي يشار إليه IN. أخيرًا، يُظهر حقل مدة البقاء time-to-live أو العمر TTL مدة صلاحية سجل المورد هذا، وتستخدمه الخوادم التي تخزن مؤقتًا سجلات الموارد من الخوادم الأخرى، بحيث يتوجب على الخادم عند انتهاء مدة البقاء TTL إخراج السجل من ذاكرته المخبئية. افترض الأمثلة التالية المستمدَّة من تسلسل النطاق الهرمي الوارد في الشكل الآتي لفهم كيفية تمثيل سجلات الموارد للمعلومات الموجودة في تسلسل النطاق الهرمي بصورةٍ أفضل، حيث سنتجاهل حقل TTL للتبسيط، ونُعطي المعلومات ذات الصلة فقط إلى أحد خوادم الأسماء المُطبّقة في كل منطقة. أولًا، يحتوي خادم الأسماء الجذر Root name server على سجل NS لكل خادم أسماء نطاق المستوى الأعلى top-level domain -أو اختصارًا TLD-، والذي يحدّد الخادم الذي يمكنه تحليل الاستعلامات لهذا الجزء من التسلسل الهرمي لنظام أسماء النطاقات وهي edu. وcom. في هذا المثال. ويحتوي خادم الأسماء الجذر أيضًا على سجلات A التي تترجم هذه الأسماء إلى عناوين IP المقابلة. يطبّق هذان السجلان معًا بفعالية مؤشّرًا من خادم الأسماء الجذر إلى أحد خوادم TLD. (edu, a3.nstld.com, NS, IN) (a3.nstld.com, 192.5.6.32, A, IN) (com, a.gtld-servers.net, NS, IN) (a.gtld-servers.net, 192.5.6.30, A, IN) ... بالانتقال نزولًا إلى المستوى التالي من التسلسل الهرمي، نجد امتلاك الخادم سجلات نطاقات على النحو التالي: (princeton.edu, dns.princeton.edu, NS, IN) (dns.princeton.edu, 128.112.129.15, A, IN) ... نحصل على سجل NS وسجل A في هذه الحالة لخادم الأسماء المسؤول عن الجزء princeton.edu من التسلسل الهرمي، وقد يكون هذا الخادم قادرًا على تحليل بعض الاستعلامات مباشرةً مثل email.princeton.edu، بينما يمرر الاستعلامات الأخرى إلى خادمٍ في طبقة أخرى في التسلسل الهرمي، مثل الاستعلام عن penguins.cs.princeton.edu. (email.princeton.edu, 128.112.198.35, A, IN) (penguins.cs.princeton.edu, dns1.cs.princeton.edu, NS, IN) (dns1.cs.princeton.edu, 128.112.136.10, A, IN) ... أخيرًا، يحتوي خادم الأسماء من المستوى الثالث، مثل الخادوم الذي يديره النطاق cs.princeton.edu، على سجلات A لجميع مضيفيه، وقد يحدّد أيضًا مجموعةً من الأسماء المستعارة أي سجلات CNAME لكلٍ من هؤلاء المضيفين. تكون الأسماء المستعارة أحيانًا مجرد أسماءٍ مناسبة (كأن تكون أقصر) للأجهزة، ولكن يمكن استخدامها أيضًا لتوفير مستوىً من المراوغة indirection، فمثلًا www.cs.princeton.edu هو اسمٌ مستعارٌ للمضيف المسمى coreweb.cs.princeton.edu، وهذا ما يسمح لخادم الويب الخاص بالموقع بالانتقال إلى جهازٍ آخر دون التأثير على المستخدمين البعيدين، حيث يستمرون ببساطة في استخدام الاسم المستعار بغض النظر عن الجهاز الذي يشغّل حاليًا خادم الويب الخاص بالنطاق. تخدّم سجلات تبادل البريد MX نفس الغرض لتطبيق البريد الإلكتروني؛ فهي تسمح للمسؤول بتغيير المضيف الذي يتلقى البريد نيابةً عن النطاق دون الحاجة إلى تغيير عنوان البريد الإلكتروني للجميع. (penguins.cs.princeton.edu, 128.112.155.166, A, IN) (www.cs.princeton.edu, coreweb.cs.princeton.edu, CNAME, IN) coreweb.cs.princeton.edu, 128.112.136.35, A, IN) (cs.princeton.edu, mail.cs.princeton.edu, MX, IN) (mail.cs.princeton.edu, 128.112.136.72, A, IN) ... لاحظ أنه على الرغم من إمكانية تعريف سجلات الموارد لأي نوعٍ تقريبًا من الكائنات، إلا أن نظام DNS يُستخدم عادةً لتسمية المضيفين بما في ذلك الخوادم والمواقع، ولا يُستخدَم لتسمية الأفراد أو الكائنات الأخرى مثل الملفات أو الأدلة، حيث تُستخدم أنظمة التسمية الأخرى عادةً لتحديد مثل هذه الكائنات، فنظام X.500 مثلًا هو نظام تسمية ISO مصمَّمٌ لتسهيل التعرف على الأشخاص، ويسمح لك بتسمية شخصٍ من خلال إعطاء مجموعةٍ من السمات مثل الاسم والمسمّى الوظيفي ورقم الهاتف والعنوان البريدي وما إلى ذلك. لقد أثبت نظام X.500 أنه ثقيلٌ للغاية، ولهذا انتزعته محركات البحث القوية المتاحة الآن على الويب في بعض النواحي، لكنه تطور في النهاية إلى بروتوكول الوصول إلى الدليل الخفيف Lightweight Directory Access Protocol -أو اختصارًا LDAP-، الذي يمثل مجموعةً فرعيةً من نظام X.500، والمُصمَّمٌ في الأصل على أنه واجهة حاسوبٍ أمامية لنظام X.500، ويُستخدَم اليوم على نطاقٍ واسع وغالبًا على مستوى المؤسسة مثل نظامٍ لتعلّم المعلومات حول المستخدمين. تحليل الأسماء سنشرح الآن كيفية إشراك العميل هذه الخوادم لتحليل أسماء النطاقات. افترض أن العميل يريد تحليل الاسم penguins.cs.princeton.edu المتعلق بمجموعة الخوادم الواردة في القسم السابق. يمكن للعميل أولًا إرسال استعلامٍ يحتوي على هذا الاسم إلى أحد الخوادم الجذر، وكما سنرى أدناه، فمن النادر حدوث هذا عمليًا، ولكنه كافٍ لتوضيح العملية الأساسية في الوقت الحالي. الخادم الجذر غير قادرٍ على مطابقة الاسم بالكامل، لذلك يرجع أفضل تطابق لديه؛ الذي هو سجل NS للاسم edu الذي يشير إلى خادم TLD المُسمَّى a3.nstld.com، ويرجع الخادم أيضًا جميع السجلات المرتبطة بهذا السجل؛ أي يرجع في هذه الحالة السجل A للخادم a3.nstld.com، ويرسل العميل نفس الاستعلام إلى خادم الأسماء على مضيف IP ذي العنوان 192.5.6.32 إذا لم يتلقَ إجابة. لا يمكن لهذا الخادم أيضًا مطابقة الاسم بالكامل لذلك يرجع سجل NS وسجل A المقابل للنطاق princeton.edu. يرسل العميل مرةً أخرى نفس الاستعلام السابق إلى الخادم على مضيف IP ذي العنوان 128.112.129.15، فيستعيد هذه المرة سجل NS وسجل A المقابل للنطاق cs.princeton.edu، ولكن تمّ الوصول هذه المرة إلى الخادم الذي يمكنه تحليل الاستعلام بالكامل. ينتج عن الاستعلام النهائي للخادم على 128.112.136.10 سجل A للاسم penguins.cs.princeton.edu، ويتعلم العميل أن عنوان IP المقابل هو 128.112.155.166. لا يزال هذا المثال يترك بضعة أسئلةٍ حول عملية التحليل التي لم يُرَد عليها. يدور السؤال الأول حول كيفية تحديد العميل موقع الخادم الجذر، أو بعبارةٍ أخرى، كيف يمكنك تحليل اسم الخادم الذي يعرف كيفية تحليل الأسماء؟ هذه مشكلةٌ أساسية في أي نظام تسمية، والإجابة هي أنه يجب تمهيد bootstrapped النظام بطريقةٍ ما، فربط الاسم بالعنوان في هذه الحالة لخادمٍ جذرٍ أو أكثر معروفٌ جيدًا، أي أنه يُنشَر من خلال بعض الوسائل خارج نظام التسمية نفسه. لا يعرف جميع العملاء خوادم الجذر عمليًا، لذلك يُهيَّأ برنامج العميل الذي يعمل على كل مضيف إنترنت بعنوان خادم أسماءٍ محلي، حيث يعرف جميع المضيفين في قسم علوم الحاسوب في جامعة برينستون الخادم الموجود على dns1.cs.princeton.edu على سبيل المثال. يحتوي خادم الأسماء المحلي على سجلات مواردٍ لخادمٍ أو أكثر من خوادم الجذر على النحو التالي: ('root', a.root-servers.net, NS, IN) (a.root-servers.net, 198.41.0.4, A, IN) وبالتالي ينطوي تحليل الأسماء في الواقع على عميلٍ يستعلم من الخادم المحلي، الذي يعمل بدوره مثل عميلٍ يستعلم من الخوادم البعيدة نيابةً عن العميل الأصلي، فتنتج عن ذلك تفاعلات العميل / الخادم الموضحة في الشكل الآتي. إحدى مزايا هذا النموذج هي أن جميع المضيفين في الإنترنت لا يجب أن يكونوا على إطلاعٍ دائم بمكان وجود خوادم الجذر الحالية؛ أي يجب أن تعرف فقط الخوادم الجذر. تتمثل الميزة الثانية في إمكانية رؤية الخادم المحلي للإجابات العائدة من الاستعلامات التي نشرها جميع العملاء المحليين. يضع الخادم المحلي هذه الاستجابات في الذاكرة المخبئية ويكون قادرًا في بعض الأحيان على تحليل الاستعلامات المستقبلية دون الحاجة إلى الخروج عبر الشبكة. ويشير حقل TTL في سجلات الموارد التي تُرجعها الخوادم البعيدة إلى المدة التي يمكن فيها تخزين كل سجلٍ في الذاكرة المخبئية بأمان، وهنا يمكن استخدام آلية التخبئة هذه بصورةٍ أكبر في التسلسل الهرمي، مما يقلل الحمل على الجذر وخوادم TLD. يدور السؤال الثاني حول كيفية عمل النظام عندما يقدّم المستخدم اسمًا جزئيًا، مثل penguins بدلًا من اسم نطاقٍ كامل، مثل penguins.cs.princeton.edu. يكمن الجواب بضبط برنامج العميل بالنطاق المحلي الموجود فيه المضيف، مثل cs.princeton.edu، وإلحاق البرنامج لهذه السلسلة بأي أسماءٍ بسيطةٍ قبل إرسال استعلام. رأينا حتى الآن ثلاثة مستوياتٍ مختلفةٍ من المعرّفات هي أسماء النطاقات وعناوين IP وعناوين الشبكة الحقيقية، ويحدث ربطٌ للمعرّفات الموجودة على مستوٍ ما بالمعرّفات الموجودة على مستوٍ آخر في نقاطٍ مختلفةٍ من معمارية الشبكة، حيث يحدد المستخدمون أولًا أسماء النطاقات عند التفاعل مع التطبيق، ثم يشرِك التطبيق نظام DNS لترجمة هذا الاسم إلى عنوان IP؛ وهو عنوان IP الذي يُوضَع في كل مخطط بيانات وليس اسم النطاق. وتتضمن عملية الترجمة هذه مخططات بيانات IP مُرسَلةً عبر الإنترنت، ولكن مخططات البيانات هذه موجّهةٌ إلى مضيفٍ يشغّل خادم أسماء، وليست موجَّهةً إلى الوجهة النهائية. بعد ذلك، يعيد بروتوكول IP التوجيه في كل موجّه، وهذا يعني غالبًا أنه يربط عنوان IP مع عنوان IP آخر؛ أي أنه يحدد عنوان الوجهة النهائية في عنوان الموجّه التالي. أخيرًا، يشرك بروتوكولُ IP بروتوكولَ تحليل العنوان Address Resolution Protocol -أو اختصارًا ARP- لترجمة عنوان IP للعقدة التوجيهية التالية إلى عنوان هذا الجهاز الحقيقي؛ فقد تكون العقدة التوجيهية التالية هي الوجهة النهائية أو قد تكون موجّهًا وسيطًا. تحتوي الإطارات المرسَلة عبر الشبكة الفيزيائية على هذه العناوين الحقيقية في ترويساتها. إدارة الشبكة باستخدام البروتوكولين SNMP و OpenConfig الشبكةُ نظامٌ معقدٌ من حيث عدد العقد ومجموعة البروتوكولات الممكن تشغيلها على أية عقدة، فقد تكون هناك العشرات من الموجّهات والمئات أو حتى الآلاف من المضيفين لتتبّعهم، فإذا فكرت في جميع الحالات التي يجري الاحتفاظ بها ومعالجتها في أيٍّ من هذه العقد، مثل جداول ترجمة العناوين وجداول التوجيه وحالة اتصال TCP وما إلى ذلك، فسيتراكم عليك الاضطرار إلى إدارة جميع هذه المعلومات. من السهل تخيُّل الرغبة في معرفة حالة البروتوكولات المختلفة على العقد المختلفة، فقد ترغب مثلًا في مراقبة عدد عمليات إعادة تجميع مخطط بيانات IP المُلغاة، وذلك لتحديد إذا كنت بحاجةٍ لتعديل المهلة الزمنية لمهملات مخططات البيانات المُجمَّعة جزئيًا، وقد ترغب أيضًا على سبيل المثال في تتبع الحِمل على العقد المختلفة أي عدد الرزم المرسَلة أو المستلَمة، وذلك لتحديد ما إذا كانت هناك حاجةٌ لإضافة موجّهٍ أو روابطٍ جديدةٍ إلى الشبكة. يجب عليك أيضًا أن تكون متيقظًا للعثور على أدلةٍ عن وجود خللٍ في العتاد وسوء تصرّفٍ في البرمجيات. ما وصفناه للتو هو مشكلة إدارة الشبكة، وهي مشكلةٌ عامةٌ في معمارية الشبكة بالكامل. وبما أن العقد التي نريد تتبّعها موزعة، فإن خيارنا الحقيقي الوحيد هو استخدام الشبكة لإدارتها؛ وهذا يعني أننا بحاجةٍ إلى بروتوكول يسمح لنا بقراءة وكتابة أجزاءٍ مختلفةٍ من معلومات الحالة على عقد الشبكة المختلفة. بروتوكول SNMP بروتوكول إدارة الشبكة البسيط Simple Network Management Protocol -أو اختصارًا SNMP- هو بروتوكولٌ مُستخدمٌ على نطاقٍ واسع لإدارة الشبكة، وهو في الأساس بروتوكول طلب / رد request/reply متخصص يدعم نوعين من رسائل الطلب، هما GET وSET؛ حيث تُستخدَم رسالة GET لاسترداد جزءٍ من الحالة من بعض العقد؛ وتُستخدَم رسالة SET لتخزين جزءٍ جديد من الحالة في بعض العقد. يدعم بروتوكول SNMP أيضًا عمليةً ثالثة هي GET-NEXT والتي سنوضّحها أدناه. تركز المناقشة التالية على عملية GET، نظرًا لأنها الأكثر استخدامًا. يُستخدم SNMP بطريقةٍ واضحة، حيث يتفاعل مشغِّلٌ مع برنامج العميل الذي يعرض معلوماتٍ حول الشبكة، ويكون لهذا البرنامج عادةً واجهةٌ رسومية، ويمكنك التفكير في هذه الواجهة على أنها تلعب نفس دور متصفح الويب، فعندما يختار المشغِّل المعلومات التي يريد أن يراها، فسيستخدم برنامج العميل بروتوكول SNMP لطلب جزءٍ معينٍ من تلك المعلومات من عقدةٍ ما، وهنا سيتلقى خادم SNMP الذي يعمل على تلك العقدة الطلبَ، ويحدد موقع المعلومات المناسبة ويعيدها إلى برنامج العميل، الذي يعرضها بعد ذلك للمستخدم. يُشغَّل بروتوكول SNMP على بروتوكول UDP. هناك تعقيدٌ واحدٌ فقط لهذا السيناريو البسيط، وهو: كيف يشير العميل بالضبط إلى أي جزءٍ من المعلومات يريد استرداده، وكيف يعرف الخادم أي متغيرٍ في الذاكرة يجب قراءته لتلبية الطلب؟ الجواب هو أن بروتوكول SNMP يعتمد على مواصفاتٍ مرافِقة تسمّى *قاعدة معلومات الإدارة management information base -أو اختصارًا MIB-؛ والتي تحدد أجزاءً معينةً من المعلومات، مثل متغيرات MIB التي يمكنك استردادها من عقدة الشبكة. ينظّم الإصدار الحالي من قاعدة معلومات الإدارة MIB المُسمّى MIB-II المتغيرات في مجموعاتٍ مختلفة، وستدرك أن معظم هذه المجموعات تتوافق مع أحد البروتوكولات الموصوفة في هذا الكتاب. فمثلًا: مجموعة النظام System: تحتوي معاملات النظام (العقدة) العامة إجمالًا، بما في ذلك مكان وجود العقدة ومدة استمرار وجودها واسم النظام. مجموعة الواجهات Interfaces: تحتوي معلوماتٍ حول جميع واجهات الشبكة أو محوّلات الشبكة المرتبطة بهذه العقدة، مثل العنوان الحقيقي لكل واجهة وعدد الرزم المُرسَلة والمُستقبَلة على كل واجهة. مجموعة ترجمة العناوين Address translation: تحتوي معلوماتٍ حول بروتوكول تحليل العناوين Address Resolution Protocol، وعلى وجه الخصوص محتويات جدول ترجمة العناوين الخاص به. مجموعة IP: تحتوي المتغيرات المتعلقة ببروتوكول IP، بما في ذلك جدول التوجيه الخاص به، وعدد كتل البيانات التي مرّرها بنجاح، وإحصائيات حول إعادة تجميع مخطط البيانات؛ والتي تتضمن عدد المرات التي يسقِط فيها بروتوكول IP مخطط بيانات لسببٍ أو لآخر. مجموعة TCP: تحتوي معلوماتٍ حول اتصالات TCP، مثل عدد عمليات الفتح الخاملة والنشطة، وعدد عمليات إعادة الضبط، وعدد المُهلات الزمنية، وإعدادات المُهلات الافتراضية وغير ذلك، حيث تستمر معلومات الاتصال فقط طالما كان الاتصال موجودًا. مجموعة UDP: تحتوي معلوماتٍ حول حركة مرور UDP، بما في ذلك العدد الإجمالي لمخططات بيانات UDP المُرسَلة والمستلَمة. توجد أيضًا مجموعاتٍ لبروتوكول رسائل التحكم في الإنترنت Internet Control Message Protocol -أو اختصارًا ICMP-، وبروتوكول SNMP نفسه. بالعودة إلى مسألة العميل الذي يذكر بالضبط ما هي المعلومات التي يريد استردادها من عقدةٍ ما، فإن وجود قائمةٍ بمتغيرات MIB هو نصف المشكلة فقط، وبالتالي تبقى مشكلتان هما: 1- نحتاج إلى صياغةٍ دقيقة للعميل ليستخدمها من أجل تحديد متغيرات MIB التي يريد جلبها. 2- نحتاج إلى تمثيلٍ دقيقٍ للقيم التي يرجعها الخادم. وتُعالَج كلتا المشكلتين باستخدام صيغة السياق المجرد الأول Abstract Syntax Notation One -أو اختصارًا ASN.1-. لنبدأ بالمشكلة الثانية أولًا، حيث يعرّف ترميز ASN.1 وقواعد التشفير الأساسية Basic Encoding Rules -أو اختصارًا BER- تمثيلًا لأنواع البيانات المختلفة، مثل الأعداد الصحيحة integers. تحدد قاعدة MIB نوع كل متغيٍر، ثم تستخدم ترميزَ ASN.1 وقواعد BER لتشفير القيمة الموجودة في هذا المتغير أثناء نقله عبر الشبكة. يتعلق الأمر أيضًا بالمشكلة الأولى، فيحدد ترميز ASN.1 أيضًا مخطط تحديد الكائنات، وتستخدم قاعدة MIB نظام التعريف هذا لإسناد معرّفٍ فريدٍ عالميًا لكل متغير MIB. تُقدَّم هذه المعرّفات في صيغة "نقطة dot" مثل المعرّف 1.3.6.1.2.1.4.3 الذي هو معرّف ASN.1 الفريد لمتغير MIB المتعلق بعنوان IP، والذي هو ipInReceives؛ حيث يحسب هذا المتغير عدد مخططات بيانات IP التي استلمتها هذه العقدة. تحدد البادئة 1.3.6.1.2.1 في هذا المثال قاعدة بيانات MIB، ويتوافق الرقم 4 مع مجموعة IP، ويشير رقم 3 الأخير إلى المتغير الثالث في هذه المجموعة. تذكر أن معرفّات كائنات ASN.1 مخصصةٌ لجميع الكائنات الممكنة في العالم، وبالتالي تعمل إدارة الشبكة على النحو التالي: يضع عميل SNMP معرّف ASN.1 لمتغير MIB الذي يريده في رسالة الطلب، ويرسل هذه الرسالة إلى الخادم، يربط الخادم بعد ذلك هذا المعرّف بمتغيرٍ محلي أي موقع الذاكرة التي تُخزَّن قيمة هذا المتغير على سبيل المثال، ويسترد القيمة الحالية المحتفَظ بها في هذا المتغير، ويستخدم ترميز ASN.1 وقواعد BER لتشفير القيمة التي يرسلها مرةً أخرى إلى العميل. العديد من متغيرات MIB هي إما جداولٌ أو بنى، حيث تشرح هذه المتغيرات المركبة سبب عملية GET-NEXT الخاصة ببروتوكول SNMP، وتُرجَع قيمة متغيرٍ ما بالإضافة إلى معرّف المتغير التالي ID، مثل العنصر التالي في الجدول أو الحقل التالي في البنية عند تطبيق هذه العملية على معرّف هذا المتغير، ويساعد هذا العميل في العبور عبر عناصر الجدول أو البنية. بروتوكول OpenConfig لا يزال بروتوكول SNMP مستخدمًا على نطاقٍ واسع وكان قديمًا بروتوكولَ إدارة المبدّلات والموجّهات management protocol for switches and routers، ولكن هناك اهتمامٌ متزايد مؤخرًا بطرقٍ أكثر مرونةً وقوةً لإدارة الشبكات، ومع ذلك لا يوجد اتفاقٌ كاملٌ حتى الآن على معيارٍ على مستوى الصناعة، ولكن بدأ ظهور إجماعٍ حول النهج العام، حيث يوضّح أحد الأمثلة المُسمَّى بروتوكول OpenConfig العديد من الأفكار الرئيسية. تتمثل الإستراتيجية العامة في أتمتة إدارة الشبكة قدر الإمكان بهدف إخراج الإنسان المعرَّض للخطأ من إدارة الشبكة، ويسمى هذا أحيانًا إدارة اللمسة الصفرية zero-touch التي تشمل حدوث شيئين: أولًا، في حين استخدم المشغّلون قديمًا أدواتٍ مثل بروتوكول SNMP لمراقبة الشبكة، ولكن كان عليهم تسجيل الدخول إلى أي جهاز شبكة لا يعمل جيدًا واستخدام واجهة سطر أوامر CLI لإصلاح المشكلة، حيث تعني إدارة zero-touch أننا نحتاج أيضًا إلى ضبط الشبكة برمجيًا. تُعَد إدارة الشبكة عبارةً عن أجزاء متساوية تقرأ معلومات الحالة وتكتب معلومات الضبط؛ فالهدف هو بناء حلقة تحكمٍ مغلقة، على الرغم من أنه ستكون هناك دائمًا سيناريوهات تحتّم تنبيه المشغّل بأن التدخل اليدوي مطلوب. ثانيًا، توجّبَ على المشغّل قديمًا ضبط كل جهاز شبكة على حدة، لكن يجب الآن ضبط جميع الأجهزة بطريقةٍ مستقرة إذا أرادت العمل بصورةٍ صحيحةٍ مثل شبكة. ونتيجةً لذلك؛ تشير إدارة اللمسة الصفرية zero-touch أيضًا إلى أن المشغّل يجب أن يكون قادرًا على الإعلان عن نيته على مستوى الشبكة، مع وجود أداة إدارةٍ ذكيةٍ بما يكفي لإصدار توجيهات الضبط الضرورية لكل جهازٍ بطريقةٍ مستقرةٍ عالميًا. يعطي الشكل السابق وصفًا عالي المستوى لهذا النهج المثالي لإدارة الشبكة، حيث نقول "مثالي" لأن تحقيق إدارة zero-touch حقيقيةٍ لا يزال أكثر طموحًا من الواقع، ولكن يجري إحراز تقدمٍ حاليًا، حيث بدأت أدوات الإدارة الجديدة مثلًا في الاستفادة من البروتوكولات المعيارية مثل بروتوكولات HTTP لمراقبة وضبط أجهزة الشبكة. تُعَد هذه خطوةً إيجابيةً لأنها تخرجنا من إنشاء بروتوكول طلب / رد آخر، ويتيح لنا التركيز على إنشاء أدوات إدارةٍ أكثر ذكاءً، ربما من خلال الاستفادة من خوارزميات التعلم الآلي لتحديد ما إذا كان هناك شيءٌ خاطئ. بالطريقة نفسها التي بدأ بها بروتوكول HTTP في استبدال بروتوكول SNMP للتحدث إلى أجهزة الشبكة، هناك جهدٌ موازٍ لاستبدال قاعدة MIB بمعيارٍ جديدٍ لمعلومات الحالة التي يمكن لأنواعٍ مختلفةٍ من الأجهزة الإبلاغ عنها، بالإضافة إلى معلومات الضبط التي تستطيع هذه الأجهزة نفسها الاستجابة لها. ويُعَد الاتفاق على معيارٍ واحد للضبط أمرًا صعبًا بطبيعته لأن كل بائع يدّعي أن أجهزته خاصة على عكس الأجهزة التي يبيعها منافسيهم، وهذا يعني أن التحدي ليس تقنيًا بالكامل. تتمثل الطريقة العامة في السماح لكل مصنّع جهازٍ بنشر نموذج بياناتٍ يحدد مقابض الضبط configuration knobs وبيانات المراقبة المتاحة لمنتجه، ويحد من توحيد لغة النمذجة. المرشح الرئيسي هو نموذج YANG، الذي يرمز إلى جيلٍ جديدٍ من الجيل التالي Yet Another Next Generation، وقد اختير هذا الاسم للسخرية من عدد المرات التي يثبت فيها أن التمرين ضروري. يمكن النظر إلى نموذج YANG مثل إصدارٍ مقيَّد من لغة XSD؛ وهي لغةٌ لتعريف مخطط (نموذج) للغة XML. غير أن نموذج YANG يحدد بنية البيانات، ولكنه ليس نموذجًا خاصًا بلغة XML على عكس لغة XSD، حيث يمكن بدلًا من ذلك استخدامه مع صيغٍ مختلفةٍ للرسائل عبر الأسلاك، بما في ذلك XML وProtobufs وJSON. المهم في هذا النهج هو أن نموذج البيانات يحدد دلالات المتغيرات المتاحة للقراءة والكتابة في نموذجٍ برمجي، أي أنه ليس مجرد نص من مواصفات المعايير. ليس هذا النهج مجانيًا للجميع، حيث يحدد كل بائعٍ نموذجًا فريدًا، نظرًا لأن مشغلي الشبكات الذين يشترون أجهزة الشبكة لديهم حافزٌ قويٌ لتكون نماذج الأجهزة المماثلة متقاربة. يؤدي نموذج YANG إلى أن تكون عملية إنشاء النماذج واستخدامها وتعديلها أكثر قابليةً للبرمجة، وبالتالي فهو قابلٌ للتكيف مع هذه العملية. هذا هو المكان الذي يأتي فيه بروتوكول OpenConfig الذي يستخدم نموذج YANG مثل لغة نمذجة، ولكنه أنشأ أيضًا عمليةً لقيادة الصناعة نحو نماذجٍ مشتركة. يُعَد بروتوكول OpenConfig غير معروفٍ رسميًا فيما يتعلق بآلية RPC المستخدمة للتواصل مع أجهزة الشبكة، ويُسمى أحد الأساليب التي يتبّعها gNMI (واجهة إدارة شبكة gRPC). وكما قد تتخيل من اسمها، تستخدم واجهة gNMI آلية gRPC، التي تعمل على بروتوكول HTTP؛ وهذا يعني أن واجهة gNMI تتبنّى أيضًا آلية Protobufs مثل طريقةٍ تحدد بها البيانات التي تتواصل فعليًا عبر اتصال HTTP. وبالتالي، كما هو موضحٌ في الشكل السابق، فإن الغرض من واجهة gNMI هو الحصول على واجهة إدارةٍ معيارية لأجهزة الشبكة، ولكن لم توحَّد قدرة أداة الإدارة على الأتمتة، أو الشكل الدقيق للواجهة المواجهة للمشغّل، كما لا يزال هناك مجالٌ كبيرٌ للابتكار في أدوات إدارة الشبكة مثل أي تطبيقٍ يحاول تلبية حاجة ودعم ميزاتٍ أكثر من البدائل. نلاحظ أيضًا أن بروتوكولات NETCONF هي بروتوكولات أخرى بعد بروتوكول SNMP لتوصيل معلومات الضبط إلى أجهزة الشبكة، حيث يعمل بروتوكول OpenConfig مع بروتوكول NETCONF، لكن الواقع يشير إلى أن المستقبَل سيكون لواجهة gNMI. نختم مناقشتنا بالتأكيد على أن عملية التغيير جارية، حيث يشير إدراج بروتوكولي SNMP وOpenConfig ضمن عنوان إدارة الشبكة إلى أنهما متكافئان، لكنهما مختلفان تمامًا، حيث يُعَد SNMP مجرد بروتوكول نقلٍ مشابهٍ لواجهة gNMI في عالم OpenConfig. وقد مكّن بروتوكول SNMP من مراقبة الأجهزة، ولكن لم يكن لديه ما يقوله تقريبًا عن ضبط الأجهزة، حيث تطلب ضبط الأجهزة تدخلًا يدويًا قديمًا؛ أما بروتوكول OpenConfig هو في الأساس محاولةٌ لتحديد مجموعةٍ مشتركةٍ من نماذج البيانات لأجهزة الشبكة، على غرار الدور الذي تلعبه قاعدة MIB في عالم SNMP، باستثناء اعتماد بروتوكول OpenConfig على نموذج YANG، وتركيزه على المراقبة والضبط بصورةٍ متساوية. ترجمة -وبتصرّف- للقسم Infrastructure Applications من فصل Applications من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا المقال السابق: تطبيقات الوسائط المتعددة في الشبكات الحاسوبية تطبيقات الشبكات الحاسوبية: خدمات الويب تعرف على بروتوكول TCP/IP وبعض من خدماته مدخل إلى HTTP: شرح التخاطب بين العميل والخادم
-
يجب أن يكون التوحيد Normalization جزءًا من عملية تصميم قاعدة البيانات، ولكن من الصعب فصل عملية التوحيد عن عملية نمذجة الكيان العلائقي ER modelling، لذلك يجب استخدام الطريقتين بصورةٍ متزامنة. يُستخدَم مخطط الكيان والعلاقة entity relation diagram -أو ERD اختصارًا- لتوفير الرؤية الكبيرة أو الشاملة لمتطلبات بيانات المؤسسة وعملياتها، إذ يَنشأ ذلك من خلال عملية تكرارية تتضمن تحديد الكيانات المرتبطة، وسماتها، وعلاقاتها؛ بينما يركِّز إجراء التوحيد على خصائص كيانات محددَّة، كما يمثِّل رؤيةً مُصغَّرةً للكيانات داخل مخطط ERD. ما هو التوحيد Normalization؟ التوحيد هو فرع من فروع النظرية العلائقية الذي يوفر رؤى التصميم، وهو عملية تحديد مقدار التكرار redundancy الموجود في الجدول. أهداف التوحيد هي: القدرة على وصف مستوى التكرار في مخطط علائقي. توفير آليات لتغيير المخططات بهدف إزالة التكرار. تعتمد نظرية التوحيد على نظرية الاعتماديات الوظيفية اعتمادًا كبيرًا، وتحدِّد هذه النظرية ستة نماذج موحَّدة normal forms -أو NF اختصارًا-، حيث يتضمن كل نموذج موحَّد مجموعةً من خصائص الاعتمادية التي يجب أن يفي المخطط بها، كما يعطي كل نموذج موحَّد ضمانات حول وجود / أو عدم وجود حالات تحديث شاذة update anomalies، وهذا يعني احتواء النماذج الموحدة الأعلى على عدد أقل من التكرار، وبالتالي، مشاكل تحديث أقل. النماذج الموحدة Normal Forms يمكن أن تكون جميع الجداول الموجودة في قواعد البيانات ضمن أحد النماذج الموحَّدة التي سنناقشها الآن. نريد الحد الأدنى من التكرار بين المفتاح الرئيسي PK، والمفتاح الخارجي FK من الناحية المثالية، كما يجب اشتقاق كل شيء آخر من جداول أخرى. هناك ستة نماذج موحَّدة، ولكننا سنلقي نظرة على النماذج الأربعة الأولى فقط، وهي: النموذج الموحَّد الأول First normal form، أو 1NF اختصارًا. النموذج الموحَّد الثاني Second normal form، أو 2NF اختصارًا. النموذج الموحَّد الثالث Third normal form، أو 3NF اختصارًا. نموذج بويس-كود الموحَّد Boyce-Codd normal form، أو BCNF اختصارًا، وهو نادر الاستخدام. النموذج الموحد الأول 1NF يُسمَح فقط بقيم غير مكرَّرة في النموذج الموحد الأول عند تقاطع كل صف وعمود، وهذا يؤدي إلى عدم وجود مجموعات مكرَّرة repeating group، حيث يجب إزالة المجموعة المكرَّرة، وتشكيل علاقتين جديدتين لتوحيد علاقة تحتوي على مجموعة مكرَّرة، ويكون المفتاح الرئيسي PK للعلاقة الجديدة هو تركيب من المفتاح الرئيسي PK للعلاقة الأصلية بالإضافة إلى سمة من العلاقة المنشَأة حديثًا للحصول على تعريف فريد. عملية نموذج 1NF سنستخدم جدول تقرير درجات الطالب Student_Grade_Report أدناه، من قاعدة بيانات المدرسة School على أساس مثال لشرح عملية نموذج 1NF. Student_Grade_Report (StudentNo, StudentName, Major, CourseNo, CourseName, InstructorNo, InstructorName, InstructorLocation, Grade) تكون المجموعة المكرَّرة في جدول تقرير درجات الطالب Student Grade Report هي معلومات المقرر الدراسي course، إذ يمكن للطالب أخذ مقررات متعددة. أزِل المجموعة المكررَّة، حيث تكون المجموعة المكرَّرة في هذه الحالة هي معلومات المقرر لكل طالب. حدِّد المفتاح الرئيسي PK لجدولك الجديد. يجب أن يحدِّد المفتاح الرئيسي PK قيمةَ السمة StudentNo وCourseNo تحديدًا فريدًا. يتبقى لك جدول مقررات الطلاب StudentCourse بعد إزالة جميع السمات المتعلِّقة بالمقرر والطالب. أصبح جدول الطالب Student الآن بصيغة النموذج الموحَّد الأول مع إزالة المجموعة المكرَّرة. الجدولان الجديدان موضَّحان كما يلي: Student (StudentNo, StudentName, Major) StudentCourse (StudentNo, CourseNo, CourseName, InstructorNo, InstructorName, InstructorLocation, Grade) تحديث حالات نموذج 1NF الشاذة بالنظر إلى الجدول السابق والذي يسبقه: نحتاج طالبًا لإضافة مقرَّر جديد. قد يكون لدينا تناقضات عندما تحتاج معلومات المقرَّر إلى تحديث. قد نحذف أيضًا معلومات هامة حول مقرر عند حذف طالب. النموذج الموحد الثاني 2NF يجب أن تكون العلاقة أولًا بصيغة نموذج 1NF للانتقال إلى النموذج الموحَّد الثاني 2NF، حيث تكون العلاقة تلقائيًا بصيغة نموذج 2NF إذا وفقط إذا اشتمل المفتاح الرئيسي PK على سمة واحدة. إذا احتوت العلاقة على مفتاح رئيسي مركّب composite PK، فيجب أن تعتمد كل سمةٍ ليست مفتاحًا على المفتاح الرئيسي PK بأكمله اعتمادًا كاملًا، ولا تعتمد على مجموعة فرعية من المفتاح الرئيسي PK، أي لا يجب وجود اعتمادية جزئية partial dependency، أو ما يُسمَّى بالزيادة augmentation. عملية نموذج 2NF يجب أولًا أن يكون الجدول بصيغة نموذج 1NF للانتقال إلى النموذج 2NF. جدول الطالب Student موجود بالفعل بصيغة نموذج 2NF لأنه يحتوي على عمود مفتاح رئيسي واحد. ليست كل السمات -وتحديدًا جميع معلومات المقرر course information- معتمدةً بالكامل على المفتاح الرئيسي عند فحص جدول مقررات الطلاب Student Course، إذ تكون السمة الوحيدة المعتمدة بالكامل على المفتاح الرئيسي هي الدرجة grade. عرِّف الجدول الجديد الذي يحتوي على معلومات المقرَّر. عرِّف المفتاح الرئيسي PK للجدول الجديد. الجداول الثلاثة الجديدة موضَّحة أدناه. Student (StudentNo, StudentName, Major) CourseGrade (StudentNo, CourseNo, Grade) CourseInstructor (CourseNo, CourseName, InstructorNo, InstructorName, InstructorLocation) تحديث حالات نموذج 2NF الشاذة بالنظر إلى الجداول السابقة: نحتاج إلى مقرَّر course عند إضافة مدرِّس جديد. قد يؤدي تحديث معلومات المقرر إلى وجود تناقضات في معلومات المدرِّس. قد يؤدي حذف المقرر أيضًا إلى حذف معلومات المدرِّس. النموذج الموحد الثالث 3NF يجب أن تكون العلاقة بصيغة النموذج الموحَّد الثاني 2NF للانتقال إلى النموذج الموحَّد الثالث 3NF، كما يجب إزالة جميع الاعتماديات المتعدية transitive dependencies أيضًا، فقد لا تعتمد السمة التي ليست مفتاحًا اعتمادًا وظيفيًا على سمة أخرى ليست مفتاحًا. عملية نموذج 3NF أزِل كافة السمات الاعتمادية dependent attributes في العلاقة، أو في العلاقات المتعدية من كل جدول من الجداول التي لها علاقة متعدية. أنشِئ جدولًا، أو جداولًا جديدةً مع إزالة الاعتمادية. تحقق من الجدول، أو الجداول الجديدة، كما تحقق من الجدول، أو الجداول المعدَّلة أيضًا، وذلك للتأكد من احتواء كل جدول على محدِّد determinant، ومن عدم وجود جدول يحتوي على اعتماديات غير مناسبة. الجداول الأربعة الجديدة موضَّحة أدناه. Student (StudentNo, StudentName, Major) CourseGrade (StudentNo, CourseNo, Grade) Course (CourseNo, CourseName, InstructorNo) Instructor (InstructorNo, InstructorName, InstructorLocation) يجب ألا تكون هناك حالات شاذة في النموذج الموحَّد الثالث في هذه المرحلة. لنلقِ نظرةً على مخطط الاعتمادية الموضَّح في الشكل الآتي لهذا المثال، حيث تتمثل الخطوة الأولى في إزالة المجموعات المكرَّرة. Student (StudentNo, StudentName, Major) StudentCourse (StudentNo, CourseNo, CourseName, InstructorNo, InstructorName, InstructorLocation, Grade) تلخِّص الاعتماديات الموضَّحة في الشكل التالي عملية توحيد normalization قاعدة بيانات المدرسة School database: الاختصارات المستخدمة في الشكل السابق هي كما يلي: PD: الاعتمادية الجزئية partial dependency. TD: الاعتمادية المتعدية transitive dependency. FD: الاعتمادية الكاملة full dependency، إذ يشير الاختصار FD إلى الاعتمادية الوظيفية functional dependency عادةً، ولكن استخدمنا الاختصار FD على أساس اختصار للاعتمادية الكاملة full dependency في الشكل السابق فقط. نموذج بويس-كود الموحد BCNF قد تنتج حالات شاذة عندما يحتوي الجدول على أكثر من مفتاح مرشَّح candidate key على الرغم من أن العلاقة بصيغة نموذج 3NF، حيث يُعَدّ نموذج بويس-كود الموحَّد حالةً خاصةً من النموذج 3NF، وتكون العلاقة ضمن نموذج BCNF إذا وفقط إذا كان كل محدّد determinant مفتاحًا مرشَحًا candidate key. المثال الأول عن نموذج BCNF ضع في بالك الجدول التالي St_Maj_Adv: 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; } Student_id Major Advisor 111 Physics Smith 111 Music Chan 320 Math Dobbs 671 Physics White 803 Physics Smith تكون القواعد الدلالية semantic rules -أي قواعد العمل المطبَّقة على قاعدة البيانات- لهذا الجدول هي: يجوز لكل طالب Student التخصص في عدة مواد. يكون لكل طالب معين مدرِّسًا واحدًا فقط لكل تخصص Major. لكل تخصص عدة مدرِّسين. يدرِّس كل مدرِّس تخصصًا واحدًا فقط. يدرِّس كل مدرِّس عدة طلاب في تخصص واحد. الاعتماديات الوظيفية لهذا الجدول مذكورة أدناه، فالأولى هي مفتاح مرشَّح candidate key، والثانية ليست كذلك. Student_id, Major ——> Advisor Advisor ——> Major تشمل الحالات الشاذة لهذا الجدول ما يلي: الحذف Delete: مثل حالة حذف الطالب معلومات المدرِّس. الإدخال Insert: مثل حالة احتياج المدرِّس الجديد إلى وجود طالب. التحديث Update: مثل الحالات المتناقضة. ملاحظة: ليست السمة المُفرَدة single attribute مفتاحًا مرشَحًا. يمكن أن يكون المفتاح الرئيسي PK هو Student_id, Major، أو Student_id, Advisor. يمكنك إنشاء جدولين جديدين، لتقليل العلاقة St_Maj_Adv إلى النموذج BCNF كما يلي: St_Adv (Student_id, Advisor) Adv_Maj (Advisor, Major) جدول St_Adv: Student_id Advisor 111 Smith 111 Chan 320 Dobbs 671 White 803 Smith جدول Adv_Maj: Advisor Major Smith Physics Chan Music Dobbs Math White Physics المثال الثاني عن نموذج BCNF انظر الجدول التالي Client_Interview: ClientNo InterviewDate InterviewTime StaffNo RoomNo CR76 13-May-02 10.30 SG5 G101 CR56 13-May-02 12.00 SG5 G101 CR74 13-May-02 12.00 SG37 G102 CR56 1-July-02 10.30 SG5 G102 FD1 – ClientNo, InterviewDate –> InterviewTime, StaffNo, RoomNo (PK) FD2 – staffNo, interviewDate, interviewTime –> clientNO (candidate key: CK) FD3 – roomNo, interviewDate, interviewTime –> staffNo, clientNo (CK) FD4 – staffNo, interviewDate –> roomNo تكون العلاقة بصيغة نموذج BCNF إذا وفقط إذا كان كل محدّد determinant مفتاحًا مرشَّحًا. نحن بحاجة إلى إنشاء جدول يتضمن أول ثلاثة اعتماديات كاملة FD -أي جدول Client_Interview2-، وإنشاء جدول آخر -أي جدول StaffRoom- للاعتمادية الكاملة FD الرابعة. جدول Client_Interview2: ClientNo InterviewDate InterViewTime StaffNo CR76 13-May-02 10.30 SG5 CR56 13-May-02 12.00 SG5 CR74 13-May-02 12.00 SG37 CR56 1-July-02 10.30 SG5 جدول StaffRoom: StaffNo StaffNo RoomNo SG5 13-May-02 G101 SG37 13-May-02 G102 SG5 1-July-02 G102 التوحيد وتصميم قواعد البيانات تأكَّد أثناء عملية توحيد تصميم قاعدة البيانات من توافق الكيانات المقترحة للنموذج الموحَّد المطلوب قبل إنشاء بُنى الجدول. صُمِّمت العديد من قواعد البيانات واقعيًا بصورة غير سليمة، أو أُثقِل كاهلها بحالات شاذة عند تعديلها بصورة غير سليمة خلال فترة زمنية، وقد يُطلب منك إعادة تصميم قواعد البيانات الحالية، وتعديلها، كما يمكن أن يكون ذلك مهمةً كبيرةً إذا أجريت عملية التوحيد على الجداول بصورةٍ غير صحيحة. تمارين ما هو التوحيد normalization؟ متى يكون جدول ما في نموذج 1NF؟ 3.متى يكون جدول ما في نموذج 2NF؟ متى يكون جدول ما في نموذج 3NF؟ عرِّف وناقش كل من الاعتماديات المشار إليها في مخطط الاعتمادية الموضَّح في الشكل التالي: تستخدم كليّة جامعية college جديدة بنية الجدول الموضَّحة في الشكل التالي، وذلك لتتبع الطلاب والمقرَّرات، وبالتالي، ارسم مخطط الاعتمادية لهذا الجدول. 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; } Attribute Name Sample Value Sample Value Sample Value StudentID 1 2 3 StudentName John Smith Sandy Law Sue Rogers CourselD 2 2 3 CourseName Programming Level 1 Programming Level 1 Business Grade 75% 61% 81% CourseDate Jan 5th, 2014 Jan 5th, 2014 Jan 7th, 2014 اعرض الجداول بصيغة النموذج الموحَّد الثالث التي ستنشئها لإصلاح المشكلات التي واجهتها باستخدام مخطط الاعتمادية الذي رسمته للتو، ثم ارسم مخطط الاعتمادية للجدول الثابت. توفر الوكالة التي تسمى Instant Cover موظفِين بدوام جزئي / مؤقت للفنادق في اسكتلندا، إذ يوضِّح الشكل الآتي الوقت الذي يقضيه موظفو الوكالة في العمل في فنادق مختلفة، حيث يكون رقم التأمين الوطني NIN -أي national insurance number- فريدًا لكل موظف. استخدم الشكل التالي للإجابة على السؤالين الآتيين: NIN ContractNo Hours eName hNo hLoc 1135 C1024 16 Smith J. H25 East Killbride 1057 C1024 24 Hocine D. H25 East Killbride 1068 C1025 28 White T. H4 Glasgow 1135 C1025 15 Smith J. H4 Glasgow هذا الجدول عرضة لحالات تحديث شاذة، لذلك قدّم أمثلةً على حالات شاذة للإدخال، والحذف، والتحديث. طَبّق عملية التوحيد على هذا الجدول ليصبح له صيغة النموذج الموحّد الثالث، مع ذكر أي افتراضات. إملأ الفراغات: ينتج عن __ نموذجًا موحّدًا أقل. تسمى السمة التي تحدِّد قيمتها قيمًا أخرى داخل صف __. السمة التي لا يمكن تقسيمها توصف بأنها ___. يشير __ إلى مستوى التفاصيل الذي تمثِّله القيم المخزَّنة في صف الجدول. يجب ألا يحتوي الجدول العلائقي على مجموعات ___. ترجمة -وبتصرف- للمقال Normalization لصاحبته Adrienne Watt. اقرأ أيضًا المقال التالي: عملية تطوير قواعد البيانات Database Development المقال السابق: الاعتماديات الوظيفية المستخدمة في تصميم قواعد البيانات نموذج الكيان والعلاقة ER لتمثيل البيانات وتخزينها في قاعدة البيانات المفاهيم الأساسية في قواعد البيانات وتصميمها نموذج الكيان والعلاقة ER لتمثيل البيانات وتخزينها في قاعدة البيانات النسخة العربية الكاملة لكتاب تصميم قواعد البيانات
-
سننشئ في هذا المقال عربةً يدويةً Wheelbarrow باستخدام الأشكال والأدوات الأساسية المُستخدَمة في برنامج إليستريتور، وسنستخدم لوحة مستكشف المسار Pathfinder وخيارات التحويل Transform وتقنية قناع القطع Clipping Mask وبعض التأثيرات الأساسية التي يمكنك الاستفادة منها في مشاريعك المستقبلية. إنشاء مستند جديد شغّل برنامج الإليستريتور Illustrator، ثم اضغط على الاختصار Ctrl + N لإنشاء مستند جديد. حدّد خيار البكسلات Pixels من قائمة الوحدات Units، وأدخِل القيمة 970 في خانة العرض width، والقيمة 760 في خانة الارتفاع height، ثم انقر على خيارات متقدمة Advanced. حدّد نمط الألوان RGB والخيار Screen (72ppi)، وتأكّد من إلغاء تحديد مربع اختيار محاذاة الكائنات الجديدة إلى شبكة البكسلات Align New Objects to Pixel Grid قبل النقر على موافق OK. إنشاء درج العربة اختر أداة المستطيل Rectangle (باستخدام الاختصار M) وأنشئ مستطيلًا أبعاده 484×157 بكسل باللون الأسود، ثم اختر أداة القلم Pen (باستخدام الاختصار P) وأنشئ كائنًا أزرق كما في الشكل الثاني أدناه. أنشئ نسخةً (باستخدام Ctrl + C ثم Ctrl + F) من الكائن الأزرق، ثم استبدل لون حدّ stroke النسخة الحالي باللون الأحمر. أبقِ الكائن الأحمر محدَّدًا وانتقل إلى قائمة تأثير Effect ثم Stylize ثم زوايا مستديرة Round Corners، وأدخِل نصف قطر Radius بمقدار 15 بكسلًا وانقر على موافق، ثم انتقل إلى خيار توسيع المظهر Expand Appearance. أبقِ الكائن الناتج محدَّدًا وأنشئ نسخة منه (باستخدام Ctrl + C ثم Ctrl + F)، ثم استبدل لون حدّ النسخة الحالي باللون الأزرق. أبقِ الكائن الأزرق محدّدًا، ثم اضغط على الاختصار Ctrl +3 لإخفائه. ركّز على الجانب الأيسر من الكائن الأحمر، واختر أداة التحديد المباشر Direct Selection (باستخدام الاختصار A)، وانقر على نقطة الارتكاز السوداء العلوية، واستمر في الضغط على الفأرة مع سحبها إلى النقطة العلوية المميزة باللون الأزرق. انقر بعد ذلك على نقطة الارتكاز السوداء السفلية، واستمر في الضغط على الفأرة واسحبها إلى النقطة السفلية المميزة باللون الأزرق. كرّر الخطوات نفسها على الجانب الأيمن من الكائن الأحمر، حيث يجب أن يبدو الكائن الأحمر مثل الشكل أدناه. حدّد المستطيل الأسود والكائن الأزرق اللذين أنشأناهما في الخطوة رقم 2 وأزِلهما. اضغط على الاختصار Ctrl + Alt +3 لإظهار الكائن الأزرق الذي أخفيناه في الخطوة رقم 2، وأبقِ هذا الكائن محدَّدًا، ثم انتقل إلى قائمة كائن Object ثم Transform ثمScale. حدّد الخيار غير موحَّد Non-Uniform، ثم أدخِل القيمة 83 في خانة أفقي Horizontal والقيمة 79 في خانة رأسي Vertical، ثم انقر على موافق. حدّد الكائن الناتج، ثم حرّكه بمقدار 5 بكسلات للأعلى. استخدم أداة التحديد المباشر (A) مع مفتاح Shift لتحديد نقطتي الارتكاز الموجودتين على يسار الكائن الأزرق وحرّكهما بمقدار 2 بكسل للأسفل، ثم حدّد نقطتي الارتكاز الموجودتين على يمينه وحرّكهما بمقدار 6 بكسلات للأسفل. استخدم أداة القلم (P) لإنشاء كائن أسود كما تراه في الشكل الأول الآتي، ثم أزِل حدّه واملأه بالتدرج اللوني الخطي linear gradient كما هو موضّح في الصورة الثانية أدناه. حدّد الشكل الذي أنشأناه في الخطوة السابقة، وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F). استخدم أداة التحديد المباشر (A) مع مفتاح Shift لتحديد نقطتي الارتكاز المميزتين باللون الأحمر، ثم انقر على أيقونة "قص المسار عند نقاط الارتكاز المحدَّدة Cut path at selected anchor points" من شريط الخصائص Properties، مما يجعل هذا الشكل مؤلفًا من جزأين. حدّد الجزء الأيسر، وانقر بزر الفأرة الأيمن على لوحة الرسم، ثم حدّد خيار الضم Join من القائمة، بعدها كرّر العملية نفسها على الجزء الآخر لربط نقطتي نهاية هذا الكائن ببعضهما البعض. حدّد الشكل الأيسر الذي أنشأناه في الخطوة رقم السابقة وانتقل إلى قائمة تأثير Effect ثم Stylize ثم Feather. أدخِل نصف قطر بمقدار 15 بكسلًا وانقر على موافق. انتقل الآن إلى الشكل الآخر الذي أنشأناه في الخطوة رقم 5، واختر أداة إضافة نقطة ارتكاز جديدة Add Anchor Point Tool (+)، مع الانقر على النقطة المميزة باللون الأحمر لإضافة نقطة ارتكاز جديدة. أعِد تحديد نقطة الارتكاز الجديدة وحرّكها بمقدار 22 بكسلًا للأعلى، ثم استخدم أداة التحديد المباشر (A) لضبط مقابضها كما هو موضّح أدناه، ثم طبّق تأثير Feather بمقدار 15 بكسلًا على هذا الشكل الأيمن. حدد الكائنين اللذين أنشأناهما في الخطوة رقم 2 والخطوة رقم 3، ثم أحضرهما إلى الأمام باستخدام الاختصار Ctrl + Shift + Right Square Bracket. حدّد الكائن الأزرق وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم اضغط على الاختصار Ctrl +2 لقفل هذه النسخة. أعِد تحديد الكائنين اللذين أنشأناهما في الخطوة رقم 2 والخطوة رقم 3، ثم افتح لوحة مستكشف المسار Pathfinder (من قائمة Window ثم Pathfinder) وانقر على زر التقاطع Intersect. أبقِ الكائن الناتج محدَّدًا، ثم أزِل حدّه واملأه باللون الأزرق الداكن (# 1a4c7c). حدّد الشكل الأزرق الداكن الذي أنشأناه في الخطوة السابقة، وأنشئ نسخةً منه بالضغط على Ctrl + C ثم Ctrl + F. حدّد النسخة وانتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، واتبع البيانات الموضَّحة أدناه، ثم انقر على موافق OK. حدّد الشكل الذي أنشأناه في الخطوة رقم 4 وأنشئ نسخةً منه، ثم أحضر هذه النسخة إلى الأمام Ctrl + Shift + Right Square Bracket. أبقِ هذه النسخة محدَّدةً، ثم استمر في الضغط على مفتاح Shift، وانقر على الشكل الذي طبّقنا عليه تأثير الظل في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم ثم حدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة، ثم أخفِ مجموعة القطع خلف الشكل الأزرق الداكن الذي أنشأناه في الخطوة رقم 7. حدّد الشكل الأزرق الداكن الذي أنشأناه في الخطوة رقم 8 مرةً أخرى وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم استبدل لون النسخة الحالي باللون الأزرق الفاتح (# 498ab9). حدّد النسخة التي أنشأناها للتو وانتقل إلى قائمة تأثير Effect ثم Stylize ثم Feather، ثم أدخِل نصف قطر بمقدار 8 بكسلات وانقر على موافق. استخدم أداة القلم (P) لإنشاء شكل باللون الأزرق الفاتح (# 73adf8) كما هو موضَّح أدناه، ثم طبّق تأثير Feather بمقدار 3 بكسلات على هذا الشكل. اضغط على الاختصار Ctrl + Alt +2 لفتح الكائن الأزرق الذي قفلناه في الخطوة رقم 7، ثم حدّده وأزِل حدّه واملأه باللون الأزرق الداكن (# 074f7f). أبقِ هذا الشكل الأزرق الداكن محدَّدًا وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F). استبدل لون هذه النسخة الحالي باللون الأزرق الداكن (# 07294f)، ثم طبّق تأثير Feather بمقدار 11 بكسلًا، وبذلك يكون درج العربة قد أصبح جاهزًا. إنشاء مقابض ومسكات العربة اليدوية ارسم شكلين باللون الأزرق الداكن (# 171c27) باستخدام أداة القلم (P) كما في الشكل أدناه. حدّد هذين الشكلين وأنشئ نسخةً منهما (بالضعط على Ctrl + C ثم Ctrl + F). استبدل لون هذه النسخ الحالي باللون الأزرق الفاتح (# 496c86)، ثم طبّق تأثير Feather بمقدار 10 بكسلات على الأشكال الناتجة. استخدم أداة القلم (P) وأداة التدرج اللوني Gradient Tool (باستخدام الاختصار G) لإنشاء شكلين مثل الشكلين الموضَّحين أدناه، ثم حدّدهما وطبّق تأثير Gaussian Blur بمقدار 3 بكسلات عليهما. حدّد الآن الشكل الأيسر الذي طبّقنا عليه تأثير Feather في الخطوة السابقة وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم أحضر هذه النسخة إلى الأمام (باستخدام الاختصار Ctrl + Shift + Right Square Bracket). أبقِ هذه النسخة محدَّدةً، واستمر في الضغط على مفتاح Shift ثم انقر على الشكل الأيسر الذي طبّقنا عليه تطبيق تأثير Blur في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم ثم حدد خيار إنشاء قناع القطع Make Clipping Mask من القائمة. كرّر العملية نفسها على المقبض الأيمن، ثم حدّد جميع الكائنات التي أنشأناها من بداية الخطوة رقم 12 إلى الخطوة الحالية، ثم ضعها خلف درج العربة. لننشئ الآن المسكات اليدوية. استخدم أداة الدائرة Ellipse Tool (باستخدام الاختصار L) وأداة القلم (P) و أداة التدرج اللوني (G) لإنشاء كائنين كما هو موضَّح أدناه، ثم أعِد تحديد هذه الدائرة وأرسلها إلى الأمام (باستخدام الاختصار Ctrl + Right Square Bracket). حدّد الدائرة التي أنشأناها في الخطوة السابقة وأنشئ نسخةً منها (بالضغط على Ctrl + C ثم Ctrl + F). أبقِ هذه النسخة محدَّدةً وانتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، واتبع البيانات الموضَّحة في الشكل الأول أدناه، ثم انقر على موافق OK. حدد الشكل الآخر الذي أنشأناه في الخطوة رقم 3 وأنشئ نسخةً منه، ثم أحضر هذه النسخة إلى الأمام (Ctrl + Shift + Right Square Bracket)، ثم استمر في الضغط على مفتاح Shift وانقر على الدائرة التي طبّقنا عليها تأثير الظل في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم ثم حدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة، ثم أخفِ مجموعة القطع خلف الدائرة التي أنشأناها في الخطوة رقم 3. حدّد وجمّع (باستخدام الاختصار Ctrl + G) جميع الكائنات التي أنشأناها من بداية الخطوة رقم 3 إلى الخطوة الحالية، وبذلك تصبح المسكة اليدوية جاهزة. أعِد تحديد هذه المسكة اليدوية وأرسلها للخلف (Ctrl + Shift + Left Square Bracket). كرّر الخطوات السابقة لرسم المسكة اليدوية الأخرى. إنشاء رجل العربة لننشئ الآن رجل العربة الداعمة. استخدم أداة القلم (P) لإنشاء كائنين كما هو موضَّح أدناه، ثم حدّدهما وانقر بزر الفأرة الأيمن على لوحة الرسم ثم حدّد خيار الضم Join من القائمة. انقر بزر الفأرة الأيمن على لوحة الرسم ثم حدّد خيار الضم Join مرةً أخرى. استخدم أداة التحديد المباشر (A) مع مفتاح Shift لتحديد نقاط ارتكاز الكائن الذي أنشأناه للتو الأربعة المميزة باللون الأحمر، ثم انقر على أيقونة "قص المسار عند نقاط الارتكاز المحدَّدة Cut path at selected anchor points" من شريط الخصائص، مما يجعل هذا الكائن مؤلفًا من أربعة مسارات. أعِد تحديد المسار الأيسر الذي أنشأناه في الخطوة الحالية، وانقر بزر الفأرة الأيمن على لوحة الرسم، مع تحديد خيار الضم Join من القائمة، ثم كرّر العملية نفسها على المسار الأيمن لربط نقطتي نهاية هذا الكائن كما هو موضَّح أدناه. حدّد بعد ذلك المسارين القصيرين الآخرين، وانقر بزر الفأرة الأيمن على لوحة الرسم وحدّد خيار الضم Join من القائمة، ثم انقر بزر الفأرة الأيمن على لوحة الرسم وحدّد خيار الضم Join مرةً أخرى. حدّد الكائنات الثلاثة التي أنشأناها في الخطوة السابقة، ثم أزِل حدودها واملأها باللون الأزرق الداكن (# 171c27). أبقِ الأشكال الناتجة محدَّدة وأنشئ نسخةً منها (بالضغط على Ctrl + C ثم Ctrl + F)، ثم استبدل لون هذه النسخ الحالي باللون الأزرق الفاتح (# 496c86)، ثم طبّق عليها تأثير Feather بمقدار 10 بكسلات. حدّد الشكلين الموجودين على اليسار كما هو موضح أدناه وأرسلهما للخلف (Ctrl + Shift + Left Square Bracket). سنضيف إضاءةً وظلالًا على بعض الأماكن الرئيسية لإعطاء مظهر أكثر واقعية. ارسم مسارًا منحنيًا باستخدام أداة القلم (P) وامنحه حدًا باللون الأزرق الفاتح (# bbdbed) بمقدار 3 بكسلات، ثم طبّق الخيار Width Profile 1 على هذا المسار، بعد ذلك أنشئ مسارًا آخر باستخدام أداة القلم (P) كما هو موضَّح أدناه. أعِد تحديد المسارين اللذين أنشأناهما للتو، وطبّق عليهما تأثير Gaussian Blur بمقدار 3 بكسلات. أنشئ مسارًا منحنيًا باللون الأصفر باستخدام أداة القلم (P)، ثم استبدل لون حدّ هذا الكائن باللون الأزرق الداكن (# 0a2542)، ثم غيّر ثُخن هذا الحدّ إلى 5 بكسلات. حدّد المسار الناتج ثم طبّق عليه الخيار Width Profile 1 وتأثير Gaussian Blur بمقدار 3 بكسلات، ثم أخفِ هذا المسار الناتج خلف رجل العربة الداعمة. يجب أن تبدو عربتك اليدوية الآن كما في الشكل التالي: إنشاء العجلة استخدم أداة الدائرة (L) لإنشاء شكل دائري أبعاده 131×187 بكسل. حدّد هذه الدائرة وانقر نقرًا مزدوجًا على أيقونة أداة التدوير Rotate Tool من شريط الأدوات. أدخِل زاوية بمقدار 8 درجات وانقر على موافق، ثم ضع الدائرة الناتجة في الموضع الموضّح أدناه. تأكّد من أن الشكل الدائري الذي أنشأناه للتو لا يزال محدَّدًا ثم انتقل إلى قائمة كائن Object ثم Transform ثم Scale، ثم حدّد مربع الاختيار غير موحَّد Non-Uniform، وأدخِل القيمة 75 في خانة أفقي Horizontal والقيمة 87 في خانة رأسي Vertical، ثم انقر على زر النسخ Copy. استبدل لون حدّ النسخة الحالي باللون الأحمر، ثم حرّكها بمقدار 3 بكسلات للأسفل و 13 بكسلًا إلى اليسار. أعِد تحديد الشكلين الدائريين اللذين أنشأناهما في الخطوة الحالية وأنشئ نسخةً منها بالضغط على Ctrl + C ثم Ctrl + F. أبقِ هذه النسخ محدَّدةً، ثم افتح لوحة مستكشف المسار Pathfinder (من قائمة Window ثم Pathfinder) وانقر على زر Minus Front. حدّد الكائن الناتج واضغط على الاختصار Ctrl +3 لإخفائه. حدّد الدائرة الزرقاء التي أنشأناها في الخطوة رقم السابقة، ثم أزِل حدّها واملأها باللون الرمادي الداكن (# 373434)، ثم حدّد الدائرة الزرقاء وأزِل حدّها واملأها بالتدرج اللوني الشعاعي radial gradient كما هو موضَّح أدناه، وطبّق تأثير Feather بمقدار 3 بكسلات على الدائرة الناتجة. استخدم أداة القلم (P) لإنشاء مسارين بحدٍّ قدره 2 بكسل وبلون رمادي داكن (# 414042)، ثم أنشئ مسارًا أخضر منحنيًا كما هو موضَّح أدناه. أعِد تحديد المسارين اللذين لونهما رمادي داكن وانتقل إلى قائمة كائن Object ثم مزج Blend ثم خيارات المزج Blend Options، واتبع البيانات الموضَحة وانقر على موافق OK، ثم انتقل إلى قائمة كائن Object ثم Blend ثم Make (أو استخدم الاختصار Ctrl + Alt + B). أبقِ الكائن الذي طبّقنا عليه المزج محدَّدًا، واستمر في الضغط على مفتاح Shift، وانقر على المسار المنحني الأخضر، ثم انتقل إلى قائمة كائن Object ثم مزج Blend ثم استبدال المحور المركزي Replace Spine. اضغط على الاختصار Ctrl + Alt +3 لإظهار الكائن الأزرق الذي أخفيناه في الخطوة رقم 1، ثم أحضر هذا الكائن إلى الأمام (Ctrl + Shift + Right Square Bracket). أبقِ هذا الكائن الأزرق محدَّدًا، واستمر في الضغط على مفتاح Shift ثم انقر على الكائن الذي طبّقنا عليه المزج في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم، ثم حدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة، ثم طبّق تأثير Feather بمقدار 2 بكسل على مجموعة القطع. حدد الشكل الدائري الأصغر الذي أنشأناه في الخطوة رقم 2 وانتقل إلى قائمة كائن Object ثم تحويل Transform ثم Scale، ثم حدّد الخيار غير موحّد Non-Uniform وأدخِل القيمة 81 في خانة أفقي Horizontal والقيمة 76 في خانة رأسي Vertical، ثم انقر على نسخ Copy. أبقِ هذه النسخة محدَّدة وافتح لوحة Appearance (من قائمة Window ثم Appearance)، ثم أزِل تأثير Feather. استبدل لون الدائرة الناتجة الحالي باللون الأزرق الداكن (# 12161a)، ثم حرّك هذه الدائرة بمقدار 1 بكسل للأسفل و3 بكسلات إلى اليسار، ثم انتقل إلى قائمة كائن Object ثم Transform ثم Scale، بعد ذلك حدّد الخيار Non-Uniform وأدخِل القيمة 88 في خانة أفقي Horizontal والقيمة 92 في خانة رأسي Vertical، ثم انقر على نسخ Copy، ثم استبدل لون الدائرة الحالي بالتدرج اللوني الخطي الموضّح أدناه. حدّد الدائرة الأخيرة التي أنشأناها في الخطوة رقم 4 وانتقل إلى قائمة كائن Object ثم تحويل Transform ثم Scale، ثم حدّد الخيار Non-Uniform وأدخِل القيمة 79 في خانة أفقي Horizontal والقيمة 84 في خانة رأسي Vertical، ثم انقر على نسخ Copy، ثم حرّكها بمقدار 1 بكسل للأعلى و 2 بكسل إلى اليمين، ثم استبدل لون هذه الدائرة الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه. حدّد الدائرة الناتجة وانتقل إلى قائمة كائن Object ثم Transform ثم Scale، ثم حدّد الخيار Non-Uniform وأدخِل القيمة 88 في خانة رأسي Vertical، ثم انقر على نسخ Copy. حرّك هذه النسخة بمقدار 3 بكسلات للأعلى و 11 بكسلًا إلى اليمين، واستبدل لونها الحالي بتدرج لوني خطي جديد كما هو موضّح أدناه. أعِد تحديد الدائرة التي أنشأناها للتو وأنشئ نسخة منها (بالضغط على Ctrl + C ثم Ctrl + F)، ثم اضغط على الاختصار Ctrl +3 لإخفاء هذه النسخة. أعِد تحديد الدائرة الأولى التي أنشأناها في الخطوة الحالية وأنشئ نسخة منها (بالضغط على Ctrl + C ثم Ctrl + F)، ثم أحضر النسخة للأمام (Ctrl + Right Square Bracket). حدّد هذه النسخة ثم استمر في الضغط على مفتاح Shift وانقر على الدائرة الثانية التي أنشأناها في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم ثم حدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة. اضغط على الاختصار Ctrl + Alt +3 لإظهار الدائرة التي أخفيناها في الخطوة السابقة، ثم انتقل إلى قائمة كائن Object ثم Transform ثم Scale، بعد ذلك حدّد الخيار "موحّد Uniform"، وأدخِل القيمة 50 ثم انقر على موافق OK. استبدل لون الدائرة الناتجة الحالي بالتدرج اللوني الشعاعي radial gradient كما هو موضَّح أدناه. يجب أن تبدو عربتك الآن كما يلي: إنشاء رباط العربة الأمامي اختر أداة القلم (P) وأنشئ شكلًا أزرق داكن (# 171c27) كما هو موضّح أدناه، ثم أعِد تحديده وأنشئ نسخةً منه بالضغط على Ctrl + C ثم Ctrl + F، ثم استبدل لون النسخة الحالي باللون الأزرق الفاتح (# 496c86)، ثم طبّق تأثير Feather بمقدار 10 بكسلات على الشكل الناتج. استخدم أداة القلم (P) لإنشاء مسار منحنٍ ثم أعطِه حدًّا بمقدار 2 بكسل باللون الأزرق المائل إلى الرمادي (# bbc9d4)، ثم طبّق الخيار Width Profile 1 وتأثير Gaussian Blur بمقدار 3 بكسلات على هذا المسار. حدّد الشكل الذي طبّقنا عليه تأثير Feather في الخطوة الأولى، وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم أحضِر النسخة إلى الأمام Ctrl + Shift + Right Square Bracket. حدّد هذه النسخة واستمر في الضغط على مفتاح Shift وانقر على المسار المنحني الذي أنشأناه في الخطوة الحالية، ثم انقر بزر الفأرة الأيمن على لوحة الرسم وحدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة. حدّد وجمّع (بالضغط على Ctrl + G) جميع الكائنات التي أنشأناها من بداية الخطوة رقم 1إلى الخطوة الحالية. استخدم أداة القلم (P) لإنشاء شكل أزرق داكن (#171c27) كما هو موضح أدناه. أعِد تحديد هذا الشكل ثم أنشئ نسخةً منه بالضغط على Ctrl + C ثم Ctrl + F، ثم استبدل لون هذه النسخة الحالي باللون الأزرق الفاتح (#496c86)، ثم طبّق تأثير Feather بمقدار 10 بكسلات على الشكل الناتج. استخدم أداة القلم (P) لإنشاء مسار كما هو موضح أدناه، ثم أعطِه حدًا بمقدار 2 بكسل باللون الأزرق المائل إلى الرمادي (#bbc9d4)، ثم طبّق الخيار Width Profile 1 وتأثير Gaussian Blur بمقدار 3 بكسلات على هذا المسار. حدّد الشكل الذي طبّقنا عليه تأثير Feather في الخطوة رقم 3 وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم أحضِر هذه النسخة إلى الأمام (Ctrl + Shift + Right Square Bracket). أبقِ هذه النسخة محدَّدةً واستمر في الضغط على مفتاح Shift وانقر على المسار الذي أنشأناه في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم وحدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة. حدّد وجمّع (Ctrl + G) جميع الكائنات التي أنشأناها من بداية الخطوة رقم 3 إلى الخطوة الحالية، ثم أخفِ هذه المجموعة خلف عجلة العربة. يجب أن تبدو العربة الآن كما في الشكل التالي: استخدم أداة القلم (P) لإنشاء مسار كما هو موضَّح أدناه، ثم أعطِه حدًا بمقدار 3 بكسلات باللون السماوي الداكن (#0b1611). أبقِ هذا المسار محدَّدًا، وافتح لوحة Stroke من قائمة Window ثم Stroke، وانقر على أيقونة زوايا مستديرة Round Cap، ثم أنشئ نسختين من هذا المسار بالضغط على Ctrl + C ثم Ctrl + F ثم Ctrl + F. تأكّد من تحديد إحدى النسخ واضغط على الاختصار Ctrl +3 لإخفائها، ثم حدّد النسخة الأخرى وحرّكها بمقدار 4 بكسلات للأسفل و 6 بكسلات إلى اليمين، ثم اضغط على الاختصار Ctrl + Left Square Bracket لإخفائها خلف المسار الأصلي. أعِد تحديد المسارين اللذين أنشأناهما في الخطوة الحالية وانتقل إلى قائمة كائن Object ثم مزج Blend ثم خيارات المزج Blend Options، واتبع البيانات الموضَّحة أدناه وانقر على موافق OK، ثم انتقل إلى قائمة كائن Object ثم Blend ثم Make (أو اضغط على Ctrl + Alt + B) . اضغط على الاختصار Ctrl + Alt +3 لإظهار المسار الذي أخفيناه في الخطوة الحالية، ثم حدّده واستبدل لون حدّه الحالي باللون الأزرق (# 357a9c). حدّد جميع الكائنات التي أنشأناها في الخطوة الحالية وجمّعها (بالضغط على الاختصار Ctrl + G)، ثم أخفِ هذه المجموعة خلف المجموعة التي أنشأناها في الخطوة رقم 2. لننشئ البراغي الآن، ولفعل ذلك استخدم أداة الدائرة (L) وأداة التدرج اللوني (G) لإنشاء دائرة كما هو موضَّح أدناه. أعِد تحديد هذه الدائرة وانتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، واتبع البيانات الموضَّحة أدناه، مع النقر على موافق OK. ارسم بعد ذلك مسارين باستخدام أداة القلم (P) وامنحهما حدًا حجمه 1.5 بكسلًا باللون الأحمر الداكن (#231f20)، ثم طبّق الخيار Width Profile 3 على هذين المسارين، وبذلك أنهينا إنشاء البرغي الأول. كرّر الخطوات السابقة لرسم مزيد من البراغي كما يلي: أصبحت العربة اليدوية جاهزةً ويجب أن تبدو كما يلي: إنشاء الرمال استخدم أداة القلم (P) لإنشاء مسار كما في الشكل أدناه. أعِد تحديد هذا المسار وانتقل إلى قائمة تأثير Effect ثم Distort & Transform ثم تخشين Roughen، واتبع البيانات الموضَّحة أدناه وانقر على موافق OK، ثم انتقل إلى قائمة كائن Object ثم Expand Appearance. أبقِ المسار الناتج محدَّدًا، وانقر بزر الفأرة الأيمن على لوحة الرسم وحدّد خيار الضم Join من القائمة. اختر أداة إضافة نقطة ارتكاز Add Anchor Point (+) وانقر على النقطة المميزة باللون الأصفر، ثم أعِد تحديد هذه النقطة وحرّكها إلى الأسفل بمقدار 62 بكسلًا. كرّر الخطوات نفسها لرسم كائن آخر كما يلي: حدّد الشكل الأحمر الذي أنشأناه في الخطوة رقم 1، ثم أزِل حدّه واملأه بلون برتقالي فاتح (#e3bd81)، ثم طبّق عليه تأثير Feather بمقدار 10 بكسلات. حدّد الكائن الأخضر الذي أنشأناه في الخطوة رقم 2، وأزِل حدّه واملأه بلون برتقالي فاتح (#deb46a)، ثم طبّق عليه تأثير Feather بمقدار 12 بكسلًا. حدّد الشكل الذي طبّقنا عليه تأثير Feather في الخطوة رقم 10 من جزئية إنشاء درج العربة، وأنشئ نسخةً منه بالضغط على Ctrl + C ثم Ctrl + F، ثم أحضرها إلى الأمام (Ctrl + Shift + Right Square Bracket)، بعد ذلك حدّد نقطتي ارتكاز هذه النسخة العلويتين وحرّكهما بمقدار 90 بكسلًا للأعلى. حدّد الشكل الأكبر الذي أنشأناه في الخطوة رقم 3 وأنشئ نسخةً منه بالضغط على Ctrl + C ثم Ctrl + F، ثم أحضر هذه النسخة إلى الأمام. أبقِ هذه النسخة محدَّدة، واستمر في الضغط على مفتاح Shift وانقر على الشكل الأول الذي أنشأناه في الخطوة الحالية. افتح لوحة مستكشف المسار Pathfinder (من قائمة Window ثم Pathfinder) وانقر على زر التقاطع Intersect، وتأكّد من أن الشكل الذي أنشأناه حديثًا لا يزال محدَّدًا، ثم افتح لوحة المظهر Appearance من قائمة Window ثم Appearance، وأزِل تأثير Feather. حدّد الشكل الناتج ثم استبدل لونه الحالي بالتدرج اللوني الخطي كما هو موضّح أدناه، ثم انتقل إلى قائمة تأثير Effect ثم Sketch ثم Reticulation، واتبع البيانات الموضَّحة أدناه وانقر على موافق OK، ثم طبّق تأثير Feather بمقدار 10 بكسلات على اللشكل الناتج، واضبط نمط المزج Blending Mode على الخيار Overlay وقلّل التعتيم إلى 70%. حدّد الشكل الذي أنشأناه في الخطوة رقم 40 وأنشئ نسخة منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم اضغط على الاختصار Ctrl +3 لإخفاء هذه النسخة. حدّد وجمّع (Ctrl + G) جميع الكائنات التي أنشأناها من بداية الخطوة رقم 37 إلى الخطوة الحالية، ثم اضغط على الاختصار Ctrl + Alt +3 لإظهار الشكل الذي أخفيناه في الخطوة الحالية. أبقِ هذا الشكل محدَّدًا، واستمر في الضغط على مفتاح Shift وانقر على المجموعة التي أنشأناها للتو، ثم انقر بزر الفأرة الأيمن على لوحة الرسم وحدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة. ارسم مسارًا منحنيًا باستخدام أداة القلم (P) وامنحه حدًا أسود (# 000000) بمقدار 5 بكسلات، ثم طبّق الخيار Width Profile 1 وتأثير Gaussian Blur بمقدار 6 بكسلات على هذا المسار. حدّد المسار الناتج ثم اضغط على الاختصار Ctrl + X لقصّه. اختر أداة التحديد Selection Tool (باستخدام الاختصار V) وانقر نقرًا مزدوجًا على مجموعة القطع التي أنشأناها في الخطوة رقم 41 واضغط على الاختصار Ctrl + F للصق المسار الذي قصصناه في الخطوة الحالية، ثم انقر نقرًا مزدوجًا في أيّ مكان خارج مجموعة القطع. حدد وجمّع (Ctrl + G) جميع الكائنات التي أنشأناها من بداية الخطوة رقم 1 من جزئية إنشاء درج العلبة إلى الخطوة الحالية. أصبحت العربة جاهزة ويجب أن تبدو كما يلي: إنشاء الخلفية استخدم أداة المستطيل (M) وأداة التدرج اللوني (G) لإنشاء مستطيل أبعاده 970×760 بكسل كما هو موضّح أدناه، ثم ضع العربة في هذه الخلفية. سنضيف ظلالًا على بعض الأماكن الرئيسية لإعطاء مظهر أكثر واقعية. استخدم أداة القلم (P) لإنشاء ثلاثة كائنات كما هو موضَّح أدناه. أعِد تحديد الكائن الأحمر وأزلِ حدّه، ثم املأه بالتدرج اللوني الخطي كما هو موضّح أدناه. أبقِ الشكل الناتج محدَّدًا، ثم طبّق عليه تأثير Gaussian Blur بمقدار 12 بكسلًا. حدّد المسارين اللذين أنشأناهما في الخطوة الحالية، واستبدل لون الحدّ الحالي باللون الأسود (#000000) وغيّر ثُخن الحد إلى 10 بكسلات. حدّد المسارين الناتجين، ثم طبّق عليهما الخيار Width Profile 1 وتأثير Gaussian Blur بمقدار 5 بكسلات، ثم قلّل تعتيم هذين المسارين إلى 10%. أعِد تحديد الكائنات الثلاثة التي أنشأناها في الخطوة الحالية وضعها خلف العربة. استخدم أداة القلم (P) لإنشاء أربعة مسارات كما هو موضَّح أدناه، ثم أعِد تحديد المسارين الملوّنين باللون الأحمر، واستبدل لون الحد الحالي باللون الأسود (#000000) وغيّر ثُخن هذا الحد إلى 10 بكسلات. أبقِ المسارات الناتجة محدَّدة، ثم طبّق عليها الخيار Width Profile 1 وتأثير Gaussian Blur بمقدار 7 بكسلات. حدّد المسارين الملوّنين باللون الأخضر، واستبدل لون الحد الحالي باللون الأسود (#000000) مع تغيير ثُخن الحد إلى 10 بكسلات. أبقِ المسارات الناتجة محدَّدة، ثم طبّق عليها الخيار Width Profile 3 وتأثير Gaussian Blur بمقدار 5 بكسلات. حدّد جميع المسارات الأربعة التي أنشأناها في الخطوة الحالية، ثم ضعها خلف العربة. استخدم أداة القلم (P) وأداة الدائرة (L) لإنشاء كائنين كما هو موضَّح أدناه. أعِد تحديد الكائن الأصفر وأزِل حدّه، ثم املأه بالتدرج اللوني الخطي كما هو موضّح أدناه. حدّد الكائن الآخر وأزِل حدّه، ثم املأه باللون الأسود (#000000). حدّد الشكلين اللذين أنشأناهما في الخطوة الحالية، ثم طبّق عليهما تأثير Gaussian Blur بمقدار 7 بكسلات، بعدها أخفِ الأشكال الناتجة خلف العربة. يجب أن تبدو العربة الآن كما يلي: وبذلك يكون كل شيء قد أصبح جاهزًا، ويفترض أن يكون الشكل المتحصل عليها مشابهًا للآتي: ترجمة -وبتصرّف- للمقال Learn how to create a Wheelbarrow full of Sand لصاحبه Bao Nguyen. اقرأ أيضًا كيفية رسم حافظة ورقية Clipboard باستخدام إليستريتور كيفية رسم شخصية القطة السوداء المخيفة باستخدام إليستريتور كيفية رسم شخصية الكنغر الملاكم باستخدام إليستريتور إنشاء ساعة كاسيو Casio في الإليستريتور كيفية تصميم قبعة ساحر باستخدام برنامج Adobe Illustrator
-
الاعتمادية الوظيفية functional dependency -أو FD اختصارًا- هي علاقة بين سمتَين attributes، حيث تكون عادةً بين المفتاح الرئيسي PK والسمات الأخرى التي ليست مفاتيحًا non-key attributes داخل الجدول، إذ تعتمد السمة Y وظيفيًا على السمة X -والتي تُعَد مفتاحًا رئيسيًا PK- في علاقة R إذا حدّدت قيمةُ السمة X قيمةَ السمة Y بصورةٍ فريدة لكل نسخةٍ صالحة من السمة X، ويشار إلى هذه العلاقة من خلال التمثيل التالي: X ———–> Y يسمى الجانب الأيسر من مخطط الاعتمادية الوظيفية FD السابق بالمحدِّد determinant، ويسمى الجانب الأيمن بالاعتمادي dependent، وفيما يلي بعض الأمثلة على ذلك. تحدِّد السمة SIN الاسم Name، والعنوان Address، وتاريخ الميلاد Birthdate في المثال الأول أدناه، حيث يمكننا تحديد أي من السمات الأخرى داخل الجدول باستخدام السمة SIN. SIN ———–> Name, Address, Birthdate تحدِّد السمتان SIN، وCourse تاريخ الانتهاء DateCompleted في المثال الثاني، حيث يجب أن يعمل هذا أيضًا مع مفتاح رئيسي مركّّب composite PK. SIN, Course ———–> DateCompleted يشير المثال الثالث إلى أن السمة ISBN تحدّد العنوان Title. ISBN ———–> Title قواعد الاعتماديات الوظيفية انظر إلى جدول البيانات (r(R لمخطط العلاقة (R(ABCDE الموضَّح في الشكل التالي: قد تسأل نفسك عند النظر إلى هذا الجدول: ما نوع الاعتماديات التي يمكننا ملاحظتها بين السمات في الجدول R؟ بما أنّ قيم السمة A فريدة (a1, a2, a3, etc)، فيمكن القول اعتمادًا على تعريف الاعتمادية الوظيفية FD أنّ: A → B, A → C, A → D, A → E ويترتب على ذلك أيضًا أن A → BC، أو أي مجموعة فرعية أخرى من المجموعة ABCDE. يمكن تلخيص ذلك على أساس A → BCDE. تُعَدّ السمة A مفتاحًا رئيسيًا. بما أن قيم السمة E هي نفسها دائمًا أي كلها لها القيمة e1، فهذا يعني أنّ: A → E, B → E, C → E, D → E ولكن لا يمكننا تلخيص ما سبق باستخدام ABCD → E، وذلك لأنّ: A → E, B → E, AB → E ملاحظات أخرى: تركيبات BC فريدة، لذلك BC → ADE. تركيبات BD فريدة، لذلك BD → ACE. إذا كانت قيم السمة C متطابقة، فإن قيم السمة D متطابقة كذلك. لذلك C → D. ولكن لا تحدِّد قيم السمة D قيم السمة C. لذلك لا تحدّد السمة C السمة D، ولا تحدِّد السمة D السمة C. يمكن مساعدة النظر إلى البيانات الفعلية في توضيح السمات التي هي سمات اعتمادية dependent، والسمات التي هي سمات محدِّدة determinant. قواعد الاستدلال Inference Rules تُعَدّ بديهيات أرمسترونغ Armstrong’s axioms مجموعةً من قواعد الاستدلال المستخدَمة لاستنتاج جميع الاعتماديات الوظيفية في قاعدة بيانات علائقية، حيث طوَّر ويليام أرمسترونغ William W. Armstrong هذه البديهيات. لنفترض أنّ (R(U هو مخطط علاقة لمجموعة سمات U، حيث سنستخدم الأحرف X، وY، وZ لتمثيل أي مجموعة فرعية، أو اتحاد union مجموعتين من السمات اختصارًا، بدلًا من استخدام X U Y. بديهية الانعكاس Axiom of reflexivity تنص هذه البديهية على أنه إذا كانت Y مجموعة فرعية subset من X، فإنّ X تحدِّد Y، كما في الشكل التالي: افترض الاعتمادية الوظيفية PartNo —> NT123 على سبيل المثال، حيث تتركّب (X (PartNo من معلومات متعددة، وهي: (Y (NT، و(partID (123. بديهية الزيادة Axiom of augmentation تنص بديهية الزيادة -والمعروفة باسم الاعتمادية الجزئية partial dependency أيضًا- على أنه إذا كانت X تحدِّد Y، فإنّ XZ تحدد YZ مهما كانت Z، أي كما في الشكل التالي: تنص بديهية الزيادة على أن يجب على كل سمة ليست مفتاحًا non-key attribute الاعتماد على المفتاح الرئيسي PK بصورة كاملة، فمثلًا، تعتمد السمات التالية: اسم الطالب StudentName، والعنوان Address، والمدينة City، وProv، وPC -أي الرمز البريدي postal code- على سمة رقم الطالب StudentNo فقط، ولا تعتمد على السمتين StudentNo، وGrade معًا. StudentNo, Course —> StudentName, Address, City, Prov, PC, Grade, DateCompleted هذا الوضع غير مرغوب به لأنه يجب على كل سمة ليست مفتاحًا الاعتماد على المفتاح PK بصورةٍ كاملة، ولكن تعتمد معلومات الطلاب في هذه الحالة جزئيًا فقط على المفتاح الرئيسي PK أي StudentNo. يجب إصلاح هذه المشكلة من خلال تقسيم الجدول الأصلي إلى جدولين على النحو التالي: الجدول الأول 1: يحوي الحقول التالية: StudentNo. Course. Grade. DateCompleted. الجدول الثاني 2: ويحوي الحقول التالية: StudentNo. StudentName. Address. City. Prov. PC. البديهية المتعدية Axiom of transitivity تنص البديهية المتعدِّية على أنه إذا كانت X تحدِّد Y، وY تحدِّد Z، فإنّ X تحدِّد Z أيضًا، أي كما في الشكل التالي: يحتوي الجدول أدناه على معلومات غير مرتبطة مباشرةً بالطالب، فيجب أن يكون لمعرِّف البرنامج ProgramID، واسم البرنامج ProgramName جدولًا خاصًا بهما، حيث لا يعتمد اسم البرنامج على رقم الطالب، وإنما يعتمد على معرِّف البرنامج. StudentNo —> StudentName, Address, City, Prov, PC, ProgramID, ProgramName هذه الحالة غير مرغوب بها بسبب اعتماد السمة التي ليست مفتاحًا -أي ProgramName- على سمة أخرى ليست مفتاحًا أيضًا -أي ProgramID-. نحل هذه المشكلة من خلال تقسيم هذا الجدول إلى جدولين: جدول لمعلومات الطالب، والآخر لمعلومات البرنامج، أي كما يلي: الجدول 1: StudentNo —> StudentName, Address, City, Prov, PC, ProgramID الجدول 2: ProgramID —> ProgramName لكن لا نزال بحاجة إلى مفتاح خارجي FK في جدول الطالب لنتمكن من تحديد البرنامج الذي سُجِّل الطالب به. الاتحاد Union تشير هذه القاعدة إلى أنه إذا كان جدولان منفصلان، والمفتاح الرئيسي PK هو نفسه، فقد ترغب في وضع الجدولين معًا، حيث تنص هذه القاعدة على أنه إذا كانت X تحدِّد Y، وX تحدِّد Z، فيجب على X أن تحدِّد Y وZ أيضًا، أي كما في الشكل التالي: افترض على سبيل المثال أنّ: SIN —> EmpName SIN —> SpouseName قد ترغب في ضم هذين الجدولين في جدول واحد على النحو التالي: SIN –> EmpName, SpouseName قد يختار بعض مسؤولي قاعدة البيانات database administrators -أو DBA اختصارًا- الاحتفاظ بهذه الجداول مفصولةً لسببين، هما: السبب الأول هو أنّ كل جدول يصِف كيانًا مختلفًا، لذلك يجب إبقاء الكيانات منفصلةً عن بعضها البعض، والسبب الثاني هو إذا تُرِك اسم الزوج/ـة SpouseName فارغًا NULL في معظم الأوقات، فلا حاجة إلى تضمينه في نفس جدول اسم الموظّف EmpName. التفكك Decomposition التفكُّك Decomposition هو عكس قاعدة الاتحاد Union، فإذا كان لديك جدولًا يبدو أنه يحتوي على كيانين يحدِّدهما المفتاح الرئيسي PK نفسه، فستفكِّر في تقسيمه إلى جدولين، حيث تنص هذه القاعدة على أنه إذا كانت X تحدِّد Y وZ، فستكون X تحدِّد Y، وX تحدِّد Z بصورةٍ منفصلة، أي كما في الشكل التالي: مخطط الاعتمادية Dependency Diagram يوضِّح مخطط الاعتمادية والمبيَّن في الشكل الآتي العديد من الاعتماديات المختلفة التي قد تكون موجودةً في جدول لم تطبَّقٍ عليه عملية التوحيد non-normalized table، أي الجدول الذي يحتوي على تكرار بيانات. تُحدَّد الاعتماديات التالية في هذا الجدول كما يلي: يتألف المفتاح الأساسي من مجموع ProjectNo وEmpNo. الاعتماديات الجزئية PDs: ProjName <— ProjectNo. EmpName, DeptNo <— EmpNo. HrsWork <— ProjectNo, EmpNo. الاعتمادية المتعددية Transitive Dependency: DeptName <—DeptNo. ترجمة -وبتصرف- للمقال Functional Dependencies لصاحبته Adrienne Watt. اقرأ أيضًا المقال التالي: فهم عملية التوحيد Normalization المستخدمة عند تصميم قاعدة البيانات المقال السابق: نمذجة الكيان العلاقي ER عند تصميم قواعد البيانات قواعد السلامة وقيودها لضمان سلامة البيانات في قواعد البيانات المفاهيم الأساسية في قواعد البيانات وتصميمها النسخة العربية الكاملة لكتاب تصميم قواعد البيانات
-
تحتاج تطبيقات الوسائط المتعددة مثل الاتصالات الهاتفية وعقد المؤتمرات عبر الفيديو إلى بروتوكولاتها الخاصة، تمامًا مثل التطبيقات التقليدية الموضحة سابقًا، وقد جاءت الخبرة الأولية في تصميم بروتوكولات تطبيقات الوسائط المتعددة من أدوات شبكة MBone، مثل تطبيقات vat وvic التي طُوِّرت للاستخدام على شبكة MBone؛ وهي شبكة تراكب overlay network تدعم البث المتعدد multicast عبر بروتوكول الإنترنت للتمكّن من عقد المؤتمرات متعددة الأطراف. طبّق كل تطبيقٍ في البداية البروتوكول أو البروتوكولات الخاصة به، ولكن أصبح من الواضح أن العديد من تطبيقات الوسائط المتعددة لها متطلباتٌ مشتركة، وأدى هذا في النهاية إلى تطوير عددٍ من بروتوكولات الأغراض العامة لاستخدامها بواسطة تطبيقات الوسائط المتعددة. لقد رأينا عددًا من البروتوكولات التي تستخدمها تطبيقات الوسائط المتعددة مثل بروتوكول النقل في الوقت الحقيقي Real-Time Transport Protocol أو اختصارًا RTP الذي يوفّر العديد من الوظائف الشائعة لتطبيقات الوسائط المتعددة مثل نقل معلومات التوقيت وتحديد أنظمة التشفير وأنواع وسائط التطبيق. يمكن استخدام بروتوكول حجز الموارد Resource Reservation Protocol أو اختصارًا RSVP لطلب تخصيص الموارد في الشبكة، بحيث يمكن توفير جودة الخدمة المطلوبة QoS لأحد التطبيقات. سنرى كيف يتفاعل تخصيص الموارد مع الجوانب الأخرى لتطبيقات الوسائط المتعددة لاحقًا في هذا القسم. تحتاج العديد من تطبيقات الوسائط المتعددة بالإضافة إلى هذه البروتوكولات الخاصة بنقل الوسائط المتعددة وتخصيص الموارد إلى بروتوكول إصدار إشارات signalling أو بروتوكول التحكم في الجلسة. افترض مثلًا أننا أردنا أن نكون قادرين على إجراء مكالماتٍ هاتفية عبر الإنترنت Voice over IP لنقل الصوت عبر بروتوكول IP أو اختصارًا VoIP، هنا سنحتاج إلى آليةٍ ما لإعلام المستلم المقصود بمثل هذه المكالمة مثل إرسال رسالةٍ إلى بعض أجهزة الوسائط المتعددة التي من شأنها أن تصدر صوت رنين. نود أيضًا أن نكون قادرين على دعم ميزات مثل تمرير المكالمات، والاتصال ثلاثي الاتجاهات وغير ذلك. يُعَد بروتوكول بدء الجلسة Session Initiation Protocol أو اختصارًا SIP وبروتوكول H.323 أمثلةً على البروتوكولات التي تتناول قضايا التحكم في الجلسة. التحكم في الجلسة والتحكم في المكالمات باستخدام البروتوكولات SDP وSIP وH.323 ضع في بالك المشكلة التالية لفهم بعض مشكلات التحكم في الجلسة. لنفترض مثلًا أنك تريد عقد مؤتمر فيديو في وقتٍ معين وتريد إتاحته لعددٍ كبيرٍ من المشاركين. لربما قررت تشفير تدفق الفيديو باستخدام معيار MPEG-2، واستخدام عنوان IP متعدد البث 224.1.1.1 لنقل البيانات، وإرسال تدفق الفيديو باستخدام بروتوكول RTP عبر منفذ UDP رقم 4000. تتمثل إحدى الطرق لإتاحة كل هذه المعلومات للمشاركين المقصودين في وضعها ضمن رسالة بريدٍ إلكتروني وإرسالها، ولكن يجب من الناحية المثالية أن يكون هناك صيغةً وبروتوكولًا قياسيًا لنشر هذا النوع من المعلومات. لقد حددت منظمة IETF بروتوكولات لهذا الغرض فقط، حيث تشمل البروتوكولات التالية: بروتوكول وصف الجلسة Session Description Protocol أو اختصارًا SDP. بروتوكول إعلان الجلسة Session Announcement Protocol أو اختصارًا SAP. بروتوكول بدء الجلسة Session Initiation Protocol أو اختصارًا SIP. بروتوكول التحكم في المؤتمر البسيط Simple Conference Control Protocol أو اختصارًا SCCP. قد تعتقد أن هذا عددٌ كبير من البروتوكولات من أجل مهمةٍ بسيطة، ولكن هناك العديد من المشاكل والمواقف المختلفة الواجب معالجتها، فمثلًا هناك فرقٌ بين الإعلان عن حقيقة توفير جلسة مؤتمرٍ معينة على شبكة MBone؛ الذي سيُحقق باستخدام بروتوكولَي SDP وSAP وبين محاولة إجراء مكالمةٍ هاتفية عبر الإنترنت مع مستخدمٍ في وقتٍ معين؛ والذي يمكن تحقيقه باستخدام بروتوكولَي SDP وSIP. يمكنك التفكير في أن مهمتك في الحالة الأولى قد أُنجزت بمجرد إرسال جميع معلومات الجلسة بصيغةٍ قياسية إلى عنوانٍ متعدد البث معروف، أما في الحالة الثانية فستحتاج إلى تحديد موقع مستخدمٍ أو أكثر، وإرسال رسالةٍ إليهم تعلن فيها عن رغبتك في التحدث مثل رنين هواتفهم، وربما التفاوض على تشفيرٍ صوتيٍ مناسب لجميع الأطراف. سنشرح أولًا بروتوكول SDP الشائع في العديد من التطبيقات، ثم سنشرح بروتوكول SIP المُستخدم على نطاقٍ واسع لعددٍ من التطبيقات التفاعلية مثل الاتصال الهاتفي عبر الإنترنت Internet telephony. بروتوكول وصف الجلسة Session Description Protocol أو اختصارا SDP بروتوكول SDP هو بروتوكولٌ عام إلى حدٍ ما ويمكن استخدامه ضمن مجموعةٍ متنوعة من المواقف ويستخدم عادةً بالاقتران مع بروتوكولٍ أو أكثر من البروتوكولات الأخرى مثل بروتوكول SIP، وينقل المعلومات التالية: اسم الجلسة والغرض منها. أوقات بدء وانتهاء للجلسة. أنواع الوسائط مثل الصوت والفيديو التي تتألف منها الجلسة. المعلومات التفصيلية المطلوبة لتلّقي الجلسة، مثل العنوان متعدد البث multicast address الذي ستُرسَل البيانات إليه وبروتوكول النقل المُستخدَم وأرقام المنافذ ونظام التشفير. يوفّر بروتوكول SDP هذه المعلومات بتنسيق ASCII باستخدام سلسلةٍ من السطور النصية، ويوضّح المثال التالي نموذج رسالة SDP: v=0 o=Ali 2890844526 2890842807 IN IP4 128.112.136.10 s=Networking 101 i=A class on computer networking u=http://www.cs.princeton.edu/ e=Ali@cs.princeton.edu c=IN IP4 224.2.17.12/127 t=2873397496 2873404696 m=audio 49170 RTP/AVP 0 m=video 51372 RTP/AVP 31 m=application 32416 udp wb لاحظ أن بروتوكول SDP مثل بروتوكول HTML، فهو يسهّل على الإنسان القراءة إلى حدٍ ما، لكن لديه قواعد تنسيقٍ صارمة تمكّن الأجهزة من تفسير البيانات بصورةٍ لا لبس فيها؛ حيث تحدّد مواصفات بروتوكول SDP جميع أنواع المعلومات الممكنة والمسموح لها بالظهور، والترتيب الذي يجب أن تظهر به، والتنسيق والكلمات المحجوزة لكل نوعٍ محدَّد. يُحدَّد كل نوعٍ من أنواع المعلومات بحرفٍ واحد، حيث يخبرنا السطر الأول أن قيمة الإصدار version تساوي صفر؛ أي أن هذه الرسالة منسَّقةً وفقًا للإصدار صفر من بروتوكول SDP. ويوفّر السطر التالي "أصل origin" الجلسة التي تحتوي على معلوماتٍ كافية لتعريف الجلسة بصورةٍ فريدة. يشير الاسم Ali إلى اسم مستخدم مُنشئ الجلسة مع عنوان IP لحاسوبه؛ أما الرقم الذي يلي Ali فهو معرّف جلسةٍ اختير ليكون فريدًا لهذا الجهاز. يتبع ذلك رقم الإصدار version إعلان SDP؛ فإذا جرى تحديث معلومات الجلسة برسالةٍ لاحقة، فسيُزاد رقم الإصدار. توفّر الأسطر الثلاثة التالية i وs وu اسم الجلسة ووصف الجلسة ومعرّف الموارد الموحد للجلسة Uniform Resource Identifier أو اختصارًا URI، وهي معلوماتٌ من شأنها أن تكون مفيدةً للمستخدم في تقرير المشاركة في هذه الجلسة. يمكن عرض هذه المعلومات في واجهة المستخدم الخاصة بأداة دليل الجلسة التي تعرض الأحداث الحالية والقادمة التي أُعلِن عنها باستخدام بروتوكول SDP. يحتوي السطر التالي e على عنوان البريد الإلكتروني لشخصٍ ما للاتصال به بخصوص الجلسة، ويظهر الشكل الآتي لقطة شاشة لأداة دليل جلسة (والتي أصبحت قديمةً الآن)، حيث تُسمى sdr جنبًا إلى جنب مع أوصاف عدة جلساتٍ أُعلِن عنها في وقت التقاط هذه الصورة. نصل بعد ذلك إلى التفاصيل التقنية التي من شأنها تمكين برنامج التطبيق من المشاركة في الجلسة، حيث يوفّر السطر c عنوان IP متعدد البث الذي ستُرسَل بيانات هذه الجلسة إليه، لأن المستخدم بحاجةٍ إلى الانضمام إلى مجموعة البث المتعدد هذه لاستقبال الجلسة. نرى بعد ذلك أوقات بدء وانتهاء الجلسة المشفّرة بصورة أعدادٍ صحيحة وفقًا لبروتوكول وقت الشبكة Network Time Protocol. وأخيرًا، نصل إلى معلومات وسائط هذه الجلسة، حيث تحتوي هذه الجلسة على ثلاثة أنواع وسائط متوفرة هي الصوت والفيديو وتطبيق لوح المعلومات المشترك المعروف باسم wb. ويوجد سطرٌ من المعلومات لكل نوع وسائط له التنسيقٍ التالي: m=<media> <port> <transport> <format> أرقام المنافذ في كل حالةٍ هي منافذ UDP، فعندما ننظر إلى حقل النقل transport، يمكننا أن نرى أن تطبيق wb يعمل مباشرةً عبر بروتوكول UDP، بينما يُنقَل الصوت والفيديو باستخدام بروتوكول RTP / AVP، وهذا يعني أن الصوت والفيديو يعملان عبر بروتوكول RTP، ويستخدمان ملف تعريف التطبيق application profile المعروف باسم AVP. يحدد ملف تعريف التطبيق هذا عددًا من مخططات التشفير المختلفة للصوت والفيديو؛ حيث يمكننا أن نرى في هذه الحالة أن الصوت يستخدم الترميز 0، وهو ترميزُ يستخدم معدل أخذ عينات قيمته 8 كيلوهرتز وكل عينةٍ حجمها 8 بتات، ويستخدم الفيديو ترميز 31 الذي يمثل مخطط ترميز H.261. هذه الأرقام السحرية لأنظمة التشفير محددةٌ في وثائق RFC التي تحدد ملف تعريف AVP، ويمكن أيضًا وصف مخططات التشفير غير القياسية في بروتوكول SDP. أخيرًا، نرى وصفًا لنوع الوسائط wb، حيث أن جميع معلومات الترميز لهذه البيانات خاصةٌ بتطبيق wb، ولذلك يكفي فقط توفير اسم التطبيق في حقل الصيغة format، وهذا مشابهٌ لوضع النوع application/wb في رسالة MIME. يمكننا الآن الانتقال إلى كيفية بدء الجلسات بعد أن عرفنا كيفية وصفها، حيث تتمثل إحدى طرق استخدام بروتوكول SDP في الإعلان عن مؤتمرات الوسائط المتعددة عن طريق إرسال رسائل SDP إلى عنوانٍ متعدد البث معروف. ستعمل أداة دليل الجلسة الموضحة في الشكل السابق من خلال الانضمام إلى مجموعة البث المتعدد وعرض المعلومات التي تحصل عليها من رسائل SDP المستلمة. يُستخدَم بروتوكول SDP أيضًا في توصيل الفيديوهات الترفيهي عبر IP،ـ والمُسمى غالبًا IPTV لتوفير معلوماتٍ حول محتوى الفيديو على كل قناةٍ تلفزيونية. يلعب بروتوكول SDP أيضًا دورًا مهمًا بالاقتران مع بروتوكول بدء الجلسة SIP، حيث أصبح بروتوكول SIP الآن أحد الأعضاء المهمين في مجموعة بروتوكولات الإنترنت مع التبني الواسع لبروتوكول Voice over IP أي دعم التطبيقات الشبيهة بالهاتف عبر شبكات IP ومؤتمرات الفيديو القائمة على IP. بروتوكول SIP بروتوكول SIP هو بروتوكول طبقة تطبيق يشبه بروتوكول HTTP من خلال استناده إلى نموذج طلب / استجابة request/response model مشابه، لكنه صُمِّم مع وضع أنواعٍ مختلفة من التطبيقات في الحسبان، وبالتالي فإنه يوفر إمكاناتٍ مختلفةً تمامًا عن بروتوكول HTTP. يمكن تجميع القدرات التي يوفرها بروتوكول SIP في خمس فئات هي: موقع المستخدم User location: لتحديد الجهاز الصحيح الذي يجري الاتصال به للوصول إلى مستخدمٍ معين. توافرية المستخدم User availability: لتحديد ما إذا كان المستخدم مستعدًا أو قادرًا على المشاركة في جلسة اتصالٍ معينة. قدرات المستخدم User capabilities: لتحديد عناصر مثل اختيار الوسائط ونظام الترميز المُراد استخدامه. إعداد الجلسة Session setup: لإنشاء معامِلات الجلسة مثل أرقام المنافذ التي يستخدمها الأطراف المتصلون. إدارة الجلسة Session management: وهي مجموعةٌ من الوظائف تتضمن نقل الجلسات لتطبيق "تمرير المكالمات" مثلًا وتعديل معاملات الجلسة. معظم هذه الوظائف سهلة الفهم، لكن مسألة الموقع تتطلب مزيدًا من النقاش. أحد الاختلافات المهمة بين بروتوكولَي SIP وHTTP مثلًا، هو أن بروتوكول SIP يُستخدم للتواصل بين البشر بصورةٍ أساسية، وبالتالي يجب أن تكون قادرًا على تحديد المستخدمين وليس الأجهزة فقط. وعلى عكس البريد الإلكتروني، فلا يُعد تحديد موقع خادمٍ سيتحقق المستخدم منه في وقتٍ لاحق وتفريغ الرسالة هناك أمرًا جيدًا، حيث سنحتاج إلى معرفة مكان المستخدم الآن إذا أردنا أن نكون قادرين على التواصل معه في الوقت الحقيقي، ومما يزيد الأمر تعقيدًا، هو حقيقة أن المستخدم قد يختار الاتصال باستخدام مجموعةٍ من الأجهزة المختلفة مثل استخدام حاسوبه عندما يكون في المكتب، واستخدام جهازٍ محمول باليد أثناء السفر. قد تكون العديد من الأجهزة نشطةً في نفس الوقت، كما قد تكون لها قدراتٌ مختلفة على نطاقٍ واسع مثل جهاز مناداةٍ أبجدي رقمي alphanumeric pager و"هاتف" فيديو قائمٌ على الحاسوب مثلًا. ينبغي أن يكون بإمكان المستخدمين الآخرين تحديد موقع الجهاز المناسب والتواصل معه في أي وقتٍ في الحالة المثالية، ويجب أن يكون المستخدم قادرًا على التحكم في من يتلقى المكالمات ومتى وأين يتلقاها. يقدّم بروتوكول SIP مفهوم الوسيط proxy لتمكين المستخدم من ممارسة المستوى المناسب من التحكم في مكالماته، ويمكن عد وكيل بروتوكول SIP مثل نقطة اتصال لمستخدمٍ تُرسَل إليه الطلبات الأولية للتواصل معه، كما يؤدي الوكلاء أيضًا وظائفًا نيابةً عن المتصلين. ويمكننا أن نرى كيف يعمل الوكلاء بصورةٍ أفضل من خلال المثال الآتي: ضع في بالك المستخدمين الاثنين الموجودين في الشكل السابق. لاحظ أن لكل مُستخدمٍ اسمًا وفق الصيغة user @ domain الذي يشبه إلى حدٍ كبير عنوان البريد الإلكتروني، فإذا أراد المستخدم أحمد ahmad مثلًا بدء جلسةٍ مع سارة sara، فإنه سيرسل رسالة SIP الأولية الخاصة به إلى الوكيل المحلي لنطاقه الذي هو cisco.com، وتحتوي هذه الرسالة الأولية على معرّف SIP URI الذي هو أحد نماذج معرّف المورد الموحد، والذي يكون على النحو التالي: SIP:sara@princeton.edu يوفر معرّف SIP URI تعريفًا كاملًا للمستخدم بدون موقعه على عكس محدّد URL، لأنه يتغير مع مرور الوقت، وسنرى لاحقًا كيفية تحديد موقع المستخدم. ينظر الوكيل إلى معرّف SIP URI عند تلقي الرسالة الأولية من أحمد، ويستنتج أنه يجب إرسال هذه الرسالة إلى الوكيل. نفترض في الوقت الحالي أن الوكيل لديه حقٌ الوصول إلى بعض قواعد البيانات التي تمكنه من الحصول على ربطٍ من الاسم إلى عنوان IP لجهازٍ أو أكثر ترغب سارة حاليًا في تلقي الرسائل عليه، وبالتالي يمكن للوكيل تمرير الرسالة إلى الجهاز أو الأجهزة التي اختارتها سارة. يُطلَق على إرسال الرسالة إلى أكثر من جهاز بالاشتقاق forking، ويمكن إجراؤه إما بالتوازي أو على التسلسل، مثل إرسال الرسالة إلى هاتف سارة المحمول إذا لم ترد على الهاتف في مكتبها. يمكن أن تكون الرسالة الأولية من أحمد إلى سارة رسالة invite دعوة SIP، والتي تكون على النحو التالي: INVITE sip:sara@princeton.edu SIP/2.0 Via: SIP/2.0/UDP bsd-pc.cisco.com;branch=z9hG4bK433yte4 To: Larry <sip:sara@princeton.edu> From: Bruce <sip:ahmad@cisco.com>;tag=55123 Call-ID: xy745jj210re3@bsd-pc.cisco.com CSeq: 271828 INVITE Contact: <sip:ahmad@bsd-pc.cisco.com> Content-Type: application/sdp Content-Length: 142 يحدد السطر الأول نوع الوظيفة المراد تطبيقها invite، والمصدر الذي ستُطبّق الوظيفة عليه، والطرف المُستدعَى sip: sara@princeton.edu، وإصدار البروتوكول 2.0. يمكن أن تكون سطور الترويسة اللاحقة مألوفةً إلى حدٍ ما بسبب تشابهها مع سطور الترويسة ضمن رسالة بريدٍ إلكتروني. يحدّد بروتوكول SIP عددًا كبيرًا من حقول الترويسة والتي سنشرح بعضها هنا، حيث تحدّد الترويسة Via: في هذا المثال الجهاز الذي نشأت منه هذه الرسالة، وتصِف الترويستان Content-Type: وContent-Length: محتويات الرسالة التي تلي الترويسة، تمامًا كما هو الحال في رسالة البريد الإلكتروني المشفرة باستخدام تقنية MIME؛ حيث يكون المحتوى في هذه الحالة رسالة SDP. تصف هذه الرسالة أمورًا مثل نوع الوسائط (الصوت والفيديو وغير ذلك) التي يرغب أحمد في تبادلها مع سارة، وخصائصًا أخرى للجلسة، مثل أنواع برامج الترميز التي يدعمها، ويوفّر الحقل في بروتوكول SIP القدرة على استخدام أي بروتوكولٍ لهذا الغرض، على الرغم من أن بروتوكول SDP هو الأكثر شيوعًا. لا يُمرر الوكيل فقط رسالة الدعوة invite إلى princeton.edu عندما تصل هذه الرسالة إلى الوكيل، ولكنه يستجيب أيضًا لمرسل رسالة invite، حيث تحتوي جميع الاستجابات على رمز استجابة تمامًا كما هو الحال في بروتوكول HTTP، وتنظيم الرموز مشابهٌ لتنظيم بروتوكول HTTP. يمكننا أن نرى في الشكل التالي سلسلةً من رسائل واستجابات SIP. أول رسالة استجابةٍ في هذا الشكل هي الاستجابة المؤقتة 100 trying، التي تُشير إلى استلام وكيل المتصل الرسالة دون خطأ، حيث ينبّه الهاتف "سارة" بمجرد تسليم رسالة invite إليها ويستجيب برسالة 180 ringing. يُعد وصول هذه الرسالة إلى حاسوب أحمد علامةً على أنه يمكن أن يولد "نغمة رنين". لنفترض أن سارة مستعدةً وقادرةً على التواصل مع أحمد، وبالتالي يمكنها التقاط هاتفها، مما يتسبب في إرسال الرسالة 200 OK. سيستجيب حاسوب أحمد هنا باستخدام ACK، ويمكن للوسائط مثل تدفق صوتي مغلَّف ببروتوكول RTP أن تبدأ الآن في التدفق بين الطرفين. تعرّف الأطراف في هذه المرحلة عناوين بعضها البعض، لذلك يمكن إرسال إشعار ACK مباشرةً وتجاوز الوكلاء، ولم يعد يشارك الوكلاء الآن في المكالمة. لاحظ أن الوسائط تأخذ مسارًا مختلفًا عبر الشبكة عن مسار رسائل إصدار الإشارات الأصلية، حيث يمكن أن تستمر المكالمة بصورةٍ طبيعية حتى إذا تعطل أحد الوكلاء أو كليهما في هذه المرحلة. أخيرًا، يرسل أحد الأطراف رسالة BYE عندما يرغب في إنهاء الجلسة، وتؤدي هذه الرسالة إلى استجابة 200 OK في الظروف العادية. هناك بعض التفاصيل الأخرى مثل التفاوض على خصائص الجلسة، فقد يرغب أحمد بالتواصل باستخدام الصوت والفيديو، لكن هاتف سارة يدعم الصوت فقط، وبالتالي سيرسل هاتف لاري رسالة SDP وهي 200 OK، التي تصف خصائص الجلسة التي ستقبلها سارة والجهاز، مع الأخذ في الحسبان الخيارات المقترَحة في رسالة invite الخاصة بأحمد. إذًا، يجري الاتفاق على معاملات الجلسة المقبولة للطرفين قبل بدء تدفق الوسائط. المشكلة الكبيرة الأخرى التي تجاهلناها هي تحديد موقع جهاز سارة الصحيح، حيث كان على حاسوب أحمد أولًا إرسال دعوته invite إلى الوكيل cisco.com، والذي قد يكون جزءًا من المعلومات المضبوطة في الحاسوب أو المُتعلَّمة بواسطة بروتوكول DHCP، ثم يجب على وكيل cisco.com العثور على الوكيل princeton.edu، ويمكن فعل ذلك باستخدام نوعٍ خاص من بحث DNS الذي سيعيد عنوان IP لوكيل SIP للنطاق. أخيرًا، يجب على وكيل princeton.edu العثور على جهازٍ يمكن الاتصال بسارة من خلاله. يكون للخادم الوكيل حق الوصول إلى قاعدة بيانات الموقع المُمكن ملؤها بعدّة طرق، ويُعد الضبط اليدوي Manual configuration أحد الخيارات، ولكن الخيار الأكثر مرونةً هو استخدام إمكانات التسجيل الخاصة ببروتوكول SIP. يمكن للمستخدم التسجيل في خدمة الموقع عن طريق إرسال رسالة register تسجيل SIP إلى مسجّل registrar نطاقه. تنشئ هذه الرسالة ارتباطًا بين "عنوان السجل" و"عنوان جهة الاتصال". يُحتمَل أن يكون "عنوان السجل" معرّف SIP URI، وهو العنوان المعروف للمستخدم مثل sip: sara@princeton.edu، وسيكون عنوان جهة الاتصال هو العنوان الذي يمكن العثور على المستخدم عليه حاليًا مثل sip: sara@llp-ph.cs.princeton.edu، وهذا هو بالضبط الارتباط الذي طلبه الوكيل princeton.edu في مثالنا. لاحظ أنه يجوز للمستخدم التسجيل في عدّة مواقع ويجوز لعدّة مستخدمين التسجيل على جهازٍ واحد. يمكنك أن تتخيل مثلًا مجموعةً من الأشخاص يدخلون غرفة اجتماعات مجهزةً بهاتف IP وجميعهم يسجّلون فيه ليتمكنوا من تلّقي المكالمات على هذا الهاتف. بروتوكول SIP هو بروتوكولٌ غنيٌ جدًا ومرن، إذ يمكنه دعم مجموعةٍ واسعةٍ من سيناريوهات الاتصال المعقدة بالإضافة إلى التطبيقات التي تستطيع التعامل مع الاتصالات الهاتفية قليلًا، أو التي ليس لها علاقة بالاتصالات الهاتفية، حيث يدعم بروتوكول SIP مثلًا العمليات التي تتيح توجيه المكالمة إلى خادم الموسيقى قيد الانتظار music-on-hold، أو خادم البريد الصوتي. يمكن أيضًا معرفة كيفية استخدام بروتوكول SIP مع تطبيقاتٍ مثل المراسلة الفورية، كما أن توحيد إضافات بروتوكول SIP لهذه الأغراض مستمر. بروتوكول H.323 كان الاتحاد الدولي للاتصالات International Telecommunication Union أو اختصارًا ITU نشطًا جدًا أيضًا في مجال التحكم في المكالمات، وهو أمرٌ لا يثير الدهشة، نظرًا لارتباطه بالهاتف، وهو المجال التقليدي لتلك الهيئة. كان هناك تنسيقٌ كبيرٌ بين منظمة IETF والاتحاد الدولي للاتصالات في هذه الحالة، بحيث تكون البروتوكولات المختلفة قابلةً للتشغيل البيني إلى حدٍ ما. تُعرَف التوصية الرئيسية الصادرة عن الاتحاد الدولي للاتصالات ITU من أجل الاتصالات متعددة الوسائط عبر شبكات الرزم باسم H.323، وهي تربط بين العديد من التوصيات الأخرى بما في ذلك H.225 للتحكم في المكالمات. تصل مجموعةٌ كاملة من التوصيات التي يغطيها بروتوكول H.323 إلى عدة مئاتٍ من الصفحات، وبما أن البروتوكولات معروفةٌ بتعقيدها، فسنقدّم فقط لمحةً موجزةً عنه هنا. يُعَد بروتوكول H.323 شائعًا في مجال الاتصالات الهاتفية عبر الإنترنت، بما في ذلك مكالمات الفيديو، حيث يُعرف الجهاز الذي يصدر أو ينهي المكالمات باسم طرفية H.323؛ فقد تشغّل محطة عمل تطبيقًا للاتصالات الهاتفية عبر الإنترنت، أو قد تكون جهازًا مصممًا بصورةٍ خاصة مثل جهاز يشبه الهاتف مع برمجياتٍ شبكية ومنفذ ايثرنت على سبيل المثال. يمكن لطرفيات H.323 التحدث مع بعضها البعض مباشرةً، ولكن غالبًا يتوسّط جهازٌ في المكالمات يُعرَف باسم حارس البوابة gatekeeper. يطبّق حارس البوابة عددًا من الوظائف مثل الترجمة بين صيغ العناوين المختلفة المستخدمة للمكالمات الهاتفية والتحكم في عدد المكالمات الممكن إجراؤها في وقتٍ معين للحد من حيز النطاق التراسلي bandwidth المُستخدم من قِبل تطبيقات H.323. يتضمن بروتوكول H.323 أيضًا مفهوم البوابة gateway التي تربط شبكة H.323 بأنواعٍ أخرى من الشبكات، ويُعَد الاستخدام الأكثر شيوعًا للبوابة هو توصيل شبكة H.323 بشبكة تبديل الهاتف العامة public switched telephone network أو اختصارًا PSTN كما هو موضحُ في الشكل الآتي، وهذا يمكّن المستخدم الذي يشغل تطبيق H.323 على حاسوبٍ من التحدث إلى شخصٍ يستخدم هاتفًا تقليديًا على شبكة الهاتف العامة. تتمثل إحدى الوظائف المفيدة التي يؤديها حارس البوابة في مساعدة الطرفيات في العثور على بوابة، وربما الاختيار من بين عدة خياراتٍ للعثور على بوابةٍ قريبة نسبيًا من وجهة المكالمة النهائية، ومن الواضح أن هذا مفيدٌ في عالمٍ يفوق فيه عددُ الهواتف التقليدية عددَ الهواتف القائمة على الحاسوب. تصبح البوابة هي نقطة النهاية الفعالة لمكالمة H.323 عندما تجري طرفية H.323 مكالمةً إلى نقطة نهاية، والتي هي هاتفٌ تقليدي، وتكون مسؤولةً عن إجراء الترجمة المناسبة لكلًّ من معلومات إصدار الإشارات وتدفق الوسائط الذي يجب أن تُنقَل عبر شبكة الهاتف. بروتوكول H.245 هو جزءٌ مهم من بروتوكول H.323، ويُستخدَم للتفاوض على خصائص المكالمة بصورةٍ مشابهة إلى حدٍ ما لاستخدام بروتوكول SDP الموصوف أعلاه. قد تعطي رسائل H.245 قائمةً بعددٍ من معايير ترميز الصوت المختلفة التي يمكن أن تدعمها؛ حيث ستعطي نقطة نهاية المكالمة البعيدة قائمةً ببرامج الترميز المدعومة الخاصة بها، ويمكن للطرفين اختيار معيار ترميزٍ يمكن لكليهما التأقلم معه، كما يمكن أيضًا استخدام بروتوكول H.245 للإشارة إلى أرقام منافذ UDP التي سيستخدمها بروتوكول RTP وبروتوكول التحكم في الوقت الحقيقي Real-Time Control Protocol أو اختصارًا RTCP، لتدفق الوسائط (أو التدفقات، فقد تتضمن المكالمة كلًا من الصوت والفيديو على سبيل المثال) لهذه المكالمة. ويمكن أن تستمر المكالمة بمجرد الانتهاء من ذلك، مع استخدام بروتوكول RTP لنقل تدفقات الوسائط ويحمل بروتوكول RTCP معلومات التحكم ذات الصلة. تخصيص الموارد لتطبيقات الوسائط المتعددة يمكن استخدام بروتوكولات التحكم في الجلسة مثل بروتوكولَي SIP وH.323 لبدء الاتصال والتحكم فيه في تطبيقات الوسائط المتعددة، بينما يوفر بروتوكول RTP وظائفًا على مستوى النقل لتدفقات بيانات التطبيقات. يجب التأكد أيضًا من تخصيص الموارد المناسبة داخل الشبكة لضمان تلبية احتياجات جودة خدمة التطبيق، وقد قدّمنا عددًا من الأساليب لتخصيص الموارد في مقال سابق. لقد كان الدافع وراء تطوير هذه التقنيات إلى حدٍ كبير هو دعم تطبيقات الوسائط المتعددة. إذًا، كيف تستفيد التطبيقات من إمكانات تخصيص موارد الشبكة الأساسية؟ تجدر الإشارة إلى أن العديد من تطبيقات الوسائط المتعددة تعمل بنجاح ضمن شبكات أفضل جهد best-effort، مثل الإنترنت العام، وتُعَد المجموعة الواسعة من خدمات VoIP التجارية مثل Skype برهانًا على حقيقة أنه لا داعي للقلق إلا بشأن تخصيص الموارد عندما لا تكون الموارد وفيرة. يمكن لبروتوكولٍ مثل بروتوكول RTCP مساعدة التطبيقات في الشبكات ذات الجهد الأفضل، وذلك من خلال إعطاء التطبيق معلوماتٍ مفصلةٍ حول جودة الخدمة التي تقدمها الشبكة. تذكر أن بروتوكول RTCP يحمل معلومات حول معدل الخسارة وخصائص التأخير بين المشاركين في تطبيق الوسائط المتعددة، ويمكن لتطبيقٍ ما استخدام هذه المعلومات لتغيير مخطط التشفير الخاص به، مثل التغيير إلى برنامج ترميز ذي معدل بت منخفض عندما يكون حيز النطاق التراسلي ضئيلًا. لاحظ أنه قد يكون من المغري التغيير إلى برنامج ترميزٍ يرسل معلوماتٍ إضافيةً زائدةً عندما تكون معدلات الخسارة عالية، إلا أن هذا أمر غير محبَّذ، فذلك مشابهٌ لزيادة حجم نافذة TCP في حالة وجود خسارة، وهو عكس ما هو مطلوب تمامًا لتجنب انهيار الازدحام. يمكن استخدام الخدمات المميزة Differentiated Services أو اختصارًا DiffServ لتوفير تخصيصٍ أساسي إلى حدٍ ما وقابلٍ للتطوير لموارد التطبيقات، كما يمكن لتطبيق الوسائط المتعددة ضبط نقطة رمز الخدمات المتميزة differentiated services code point أو اختصارًا DSCP في ترويسة IP للرزم التي يولّدها في محاولةٍ لضمان حصول كل من رزم الوسائط ورزم التحكم على جودة الخدمة المناسبة. يمكن وضع علامةٍ على رزم الوسائط الصوتية على أنها EF للدلالة على تمرير سريع expedited forwarding على سبيل المثال، لكي تُوضَع في رتلٍ ذو زمن انتقالٍ منخفض أو ذو أولويةٍ منخفضة في الموجهات على طول المسار، بينما تُوضَع علامةٌ على رزم إصدار إشارات الاتصال مثل رزم SIP مثلًا على أنها من النوع AF للدلالة على تمريرٍ مضمون assured forwarding، لتمكينها من البقاء في الرتل بصورةٍ منفصلة عن حركة مرور الأفضل جهدًا، وبالتالي تقليل مخاطر الخسارة. يُعَد وضع علامةٍ على الرزم داخل مضيف الإرسال أو الجهاز أمرًا منطقيًا إذا اهتمت أجهزة الشبكة مثل الموجّهات بنقطة DSCP التي تتجاهلها في الإنترنت العام وتوفر أفضل خدمةٍ لجميع الرزم. تمتلك شبكات المؤسسات أو الشركات القدرة على استخدام خدمات DiffServ لحركة مرور الوسائط المتعددة الداخلية الخاصة بها، وتفعل ذلك بصورةٍ متكررة، حيث يمكن لمستخدمي الإنترنت الداخليين في كثيرٍ من الأحيان تحسين جودة VoIP أو تطبيقات الوسائط المتعددة الأخرى فقط عن طريق استخدام خدمات DiffServ في الاتجاه الخارجي لاتصالات الإنترنت الخاصة بهم، كما هو موضحٌ في الشكل الآتي، وهذا فعالٌ بسبب عدم تناسق العديد من اتصالات الإنترنت ذات النطاق العريض، فإذا كان الرابط الخارج أبطأ إلى حدٍ كبير أي بموارد محدودةٍ أكثر من الرابط الوارد، فإن تخصيص الموارد باستخدام خدمات DiffServ على هذا الرابط قد يكون كافيًا لإحداث فارقٍ كبير في جودة التطبيقات الحساسة لزمن الاستجابة والخسارة. خدمات DiffServ جذابةٌ لبساطتها، لكنها لا تستطيع تلبية احتياجات التطبيقات في جميع الظروف. افترض مثلًا أن حيز نطاق المنبع التراسلي في الشكل السابق هو 100 كيلو بت في الثانية فقط، ويحاول العميل إجراء مكالمتَي VoIP؛ كلٌ منهما باستخدام برنامج ترميز 64 كيلو بت في الثانية، وبالتالي فإن الرابط الصاعد مُحمَّلٌ الآن بنسبة تزيد عن 100%، مما سيؤدي إلى تأخيرٍ كبير في الرتل وفقدانٍ للرزم، ولا يمكن لأي قدرٍ من الانتظار الذكي في رتل موجّه العميل إصلاح ذلك. خصائص العديد من تطبيقات الوسائط المتعددة هي من نفس القبيل، فبدلًا من محاولة ضغط الكثير من المكالمات في أنبوبٍ ضيقٍ للغاية، سيكون من الأفضل حظر مكالمةٍ واحدة، مع السماح لمكالمةٍ أخرى بالمتابعة؛ أي يُفضَّل أن يكون هناك شخصٌ ما يجري محادثةً بنجاح بينما يسمع شخصٌ آخر إشارة مشغول بدلًا من جعل كلا المتصلين يختبران جودة صوت غير مقبولةٍ في نفس الوقت. نشير في بعض الأحيان إلى مثل هذه التطبيقات على أنها ذات منحنى استخداميةٍ حاد steep utility curve، مما يعني انخفاض استخدامية أو فائدة التطبيق بسرعةٍ، مع تدهور جودة الخدمة التي تقدمها الشبكة. تحتوي تطبيقات الوسائط المتعددة على هذه الخاصية، في حين لا تمتلكها العديد من التطبيقات التقليدية، ويستمر البريد الإلكتروني مثلًا في العمل جيدًا حتى لو وصلت التأخيرات إلى ساعات. تكون التطبيقات ذات منحنيات الاستخدامية شديدة الانحدار مناسبةً تمامًا لبعض أشكال التحكم في القبول؛ فإذا لم تكن متأكدًا من توفر الموارد الكافية دائمًا لدعم الحِمل المقدَّم للتطبيقات، فإن التحكم في القبول يوفر طريقةً لقول "لا" لبعض التطبيقات مع السماح للآخرين بالحصول على الموارد التي تحتاجها. رأينا طريقةً للتحكم في القبول باستخدام بروتوكول RSVP في مقال سابق، وسنعود إلى ذلك قريبًا، ولكن توفّر تطبيقات الوسائط المتعددة التي تستخدم بروتوكولات التحكم في الجلسة بعضَ خيارات التحكم في القبول الأخرى؛ أما النقطة الأساسية الواجب ملاحظتها هنا، فهي أن بروتوكولات التحكم في الجلسة مثل بروتوكولي SIP أو H.323، أي أنها تتضمن غالبًا نوعًا من تبادل الرسائل بين نقطة نهاية وكيانٍ آخر مثل وكيل SIP أو حارس بوابة H.323 في بداية مكالمةٍ أو جلسة، ويمكن أن يوفر هذا وسيلةً سهلةً لقول "لا" لمكالمةٍ جديدة لا تتوفر لها مواردٌ كافية. ضع في حساباتك الشبكة في الشكل الآتي على سبيل المثال، وافترض أن الرابط الواسع من المكتب الفرعي إلى المكتب الرئيسي لديه حيز نطاقٍ تراسلي كافٍ لاستيعاب ثلاثة مكالمات VoIP في وقتٍ واحد باستخدام برامج ترميز 64 كيلوبت في الثانية. يحتاج كل هاتفٍ إلى الاتصال بوكيل SIP المحلي أو حارس بوابة H.323 عندما يبدأ في إجراء مكالمة، لذلك من السهل على الوكيل / حارس البوابة إرسال رسالةٍ تخبر هاتف IP بتشغيل إشارة مشغول إذا حمِّل هذا الرابط بالكامل، ويمكن كذلك للوكيل أو حارس البوابة التعامل مع احتمال إجراء هاتف IP معين مكالماتٍ متعددة في نفس الوقت واستخدام سرعاتٍ مختلفة لبرنامج الترميز، ولكن لن يعمل هذا المخطط إلا إذا لم يتمكن أي جهازٍ آخر من زيادة التحميل على الرابط دون التحدث أولًا إلى حارس البوابة أو الوكيل. يمكن استخدام رتل خدمة DiffServ للتأكد من عدم تداخل الحاسوب المشارك في نقل الملفات مع مكالمات VoIP على سبيل المثال، ولنفترض أن بعض تطبيقات VoIP التي لا تتحدث أولًا إلى حارس البوابة أو الوكيل مفعَّلةٌ في المكتب البعيد؛ فإذا استطاع مثل هذا التطبيق وضع علامةٍ على رزمه بصورةٍ مناسبة وفي نفس رتل حركة مرور VoIP الحالية، فيمكن أن يقود الرابط إلى نقطة التحميل دون أي استجابةٍ من الوكيل أو حارس البوابة. يشير اعتماد النهج الموصوف للتو، على أن حارس البوابة أو الوكيل لديه معرفةٌ بالمسار الذي سيستخدمه كل تطبيق مشكلةً، لكنها ليست كبيرةً في مخطط الشبكة البسيط الموضح في الشكل السابق، بينما يمكن أن تصبح متسارعةً وغير قابلةٍ للإدارة في الشبكات الأكثر تعقيدًا. نحتاج فقط إلى تخيُّل الحالة التي يكون فيها للمكتب البعيد اتصالين مختلفين بالعالم الخارجي لنرى أننا نطلب من الوكيل أو حارس البوابة فهم التوجيه وفشل الروابط وظروف الشبكة الحالية، إضافةً لفهم بروتوكول SIP أو H.323، ويمكن أن يصبح هذا أيضًا غير قابل للإدارة بسرعة. نشير إلى نوع التحكم في القبول الموصوف للتو على أنه بعيدٌ عن المسار off-path؛ بمعنى أن الجهاز الذي يتخذ قرارات التحكم في القبول غير موجودٍ على مسار البيانات، حيث يلزم تخصيص الموارد. البديل الواضح هو التحكم في القبول على المسار، والمثال القياسي للبروتوكول الذي يتحكم في القبول على المسار في شبكات IP هو بروتوكول حجز الموارد RSVP. لقد رأينا في مقال سابق كيفية استخدام بروتوكول RSVP لضمان تخصيص مواردٍ كافية على طول المسار، ويُعَد استخدام بروتوكول RSVP في تطبيقات مثل التطبيقات الموضحة في هذا القسم أمرًا سهلًا. لا يُعَد تنسيق إجراءات بروتوكول التحكم في القبول أو حجز الموارد وبروتوكول التحكم في الجلسة أمرًا صعبًا، ولكنه يتطلب بعض الاهتمام بالتفاصيل. ضع في حساباتك على سبيل المثال مكالمةً هاتفيةً بسيطةً بين طرفين، حيث تحتاج إلى معرفة مقدار حيز النطاق التراسلي الذي ستستخدمه المكالمة قبل التمكُّن من إجراء حجز، مما يعني أنك بحاجةٍ إلى معرفة برامج الترميز الواجب استخدامها، وهذا يعني أنك بحاجةٍ إلى التحكم في الجلسة أولًا لتبادل المعلومات حول برامج الترميز التي يدعمها الهاتفان. لا يمكنك إجراء جميع عناصر التحكم في الجلسة أولًا، لأنك لا تريد أن يرن الهاتف قبل اتخاذ قرار التحكم في القبول الذي من الممكن أن يفشل. ويوضح الشكل السابق هذا الموقف، حيث يُستخدَم بروتوكول SIP للتحكم في الجلسة ويُستخدَم بروتوكول RSVP لاتخاذ قرار التحكم في القبول بنجاحٍ في هذه الحالة. تمثل الخطوط المتصلة في الشكل السابق رسائل SIP، بينما تمثل الخطوط المتقطعة رسائل RSVP. لاحظ أن رسائل SIP تنتقل بالاتجاه من هاتفٍ إلى آخر في هذا المثال (لم نُظهِر وكلاء SIP)، بينما تُعالَج رسائل RSVP أيضًا بواسطة الموجّهات للتحقق من وجود الموارد الكافية لقبول المكالمة، حيث نبدأ بتبادلٍ أوَّلي لمعلومات الترميز في أول رسالتين من SIP مع التذكير بأن بروتوكول SDP يُستخدم لإعطاء قائمةٍ ببرامج الترميز المتاحة. الإشعار PRACK هو إشعارٌ مؤقت provisional acknowledgment، ويمكن إرسال رسائل RSVPPATH، التي تحتوي على وصفٍ لمقدار الموارد المطلوبة في الخطوة الأولى في حجز الموارد في كلا اتجاهي المكالمة، ويمكن بعد ذلك إرسال رسائل RESV مرةً أخرى لحجز الموارد. يستطيع هاتف البدء بمجرد استلامه لرسالة RESV إرسال رسالة SDP محدثة تبلّغ عن حقيقة أن الموارد قد حُجزِت في اتجاهٍ واحد. إذا استقبل الهاتف المُتَّصل به هذه الرسالة واستقبل رسالة RESV من الهاتف الآخر، فيمكنه البدء في الرنين وإخبار الهاتف الآخر بأن الموارد محجوزةً الآن في كلا الاتجاهين مع رسالة SDP، وإعلام الهاتف المتصل أيضًا بأنه يرن، ويستمر إصدار إشارات SIP العادية وتدفق الوسائط من الآن فصاعدًا. نرى مرةً أخرى كيف يتطلب إنشاء التطبيقات منا فهم التفاعل بين وحدات البناء المختلفة مثل بروتوكولي SIP وRSVP في هذه الحالة. لقد أجرى مصممو بروتوكول SIP بالفعل بعض التغييرات على البروتوكول، ومن هنا جاء تأكيدنا المتكرر في هذا الكتاب على التركيز على الأنظمة الكاملة بدلًا من مجرد النظر إلى طبقةٍ أو مكونٍ واحدٍ بمعزلٍ عن أجزاء النظام الأخرى. ترجمة -وبتصرّف- للقسم Multimedia Applications من فصل Applications من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا المقال السابق: تطبيقات الشبكات الحاسوبية: خدمات الويب الإصدار السادس من بروتوكول IP الشبكات الفرعية والعناوين والأخطاء في بروتوكول IP النقل الموثوق (Reliable Transmission) في الشبكات الحاسوبية
-
نستخدم أدوات متعددة عند الرسم أو التلوين في العالم الحقيقي مثل قلم الرصاص والممحاة وفرشاة التلوين وأنواع مختلفة من الألوان والأحبار وأقلام التلوين وغيرها من الأدوات. يوجد شيء مشابه في برامج الرسم الرقمية مثل برنامج كريتا Krita يُسمَّى مولّد الفُرش Brush engine الذي يشبه إلى حد كبير محرّكات السيارات المختلفة التي تعطي إحساسًا مختلفًا عند القيادة، أو أقلام الرصاص التي يختلف أثرها تمامًا عن أقلام الحبر، إذ يعطي كل مولد فُرش إحساسًا مختلفًا عن الآخر عند الرسم. كما تحتوي مولدات الفُرش على إعدادات مختلفة، لذلك يمكنك حفظ هذه الإعدادات ضمن إعدادات مُسبقَة Presets. يفرّق كريتا -على عكس الفوتوشوب Photoshop- بين رؤوس الفُرش Brush-tips وإعدادات الفُرش المسبقَة Brush-presets. ليس رأس الفرشاة سوى ختم من نوع ما، بينما يستخدم الإعداد المسبق رأس الفرشاة مع إعدادات أخرى لإنشاء الفرشاة الكاملة. قائمة إعدادات الفرشاة يمكنك الوصول إلى لوحة محرّر إعدادات الفرشاة Brush Settings Editor من شريط الأدوات بين زر اختيار إعداد الفرشاة المسبَق Choose brush preset وزر أنماط التعبئة Fill Patterns، أو باستخدام مفتاح F5 من لوحة المفاتيح. سترى النافذة التالية عند فتح لوحة محرّر إعدادات الفرشاة Brush Settings Editor التي تنقسم إلى ستة مناطق (سنوضّحها لاحقًا): القسم أ - معلومات عامة General Information يحتوي هذا القسم على أيقونة الإعداد المسبق Preset Icon ومعاينة حية للفرشاة Live Brush Preview واسم الإعداد المسبق Preset Name واسم المولّد Engine Name وأزرار للحفظ وإعادة التسمية وإعادة التحميل. تُخزَّن إعدادات فُرش كريتا في البيانات الوصفية metadata الخاصة بملف PNG الذي أبعاده 200×200 (أو ملف KPP)، حيث تصبح الصورة في ملف PNG أيقونةَ الإعداد المسبق. تُستخدَم هذه الأيقونة في كل مكان ضمن كريتا، وهي مفيدة للتمييز بين الفُرش بطرق لا تستطيع المعاينة الحية تطبيقها. تُظهِر المعاينة الحية أثر الفرشاة الحالي كخط منحنٍ صغير يشبه الحرف S، مع عدم وجود ضغط من جهة اليسار ثم زيادة الضغط أثناء الانتقال إلى جهة اليمين، وبالتالي يظهَر تأثير مستشعرات الضغط Pressure وزاوية الرسم Drawing Angle والمسافة Distance والتلاشي Fade وضبابية أثر الفرشاة الخفيف Fuzzy Dab، ولكن لا تظهَر المستشعرات الأخرى. لا تظهِر بعض مولدات الفُرش أي شيء، بينما تظهِر أدوات مزج الألوان Color smudge وفرشاة المرشحات Filter brush وأداة النسخ Clone نمط خطوط بديل لأن مولدات الفُرش هذه تستخدم البكسلات الموجودة مسبقًا على لوحة الرسم لتغيير تأثيرها. يوجد بعد اسم الإعداد المسبق زرٌ لإعادة تسمية الفرشاة، مما يؤدي إلى حفظ الفرشاة بوصفها فرشاة جديدة وإلغاء تفعيل الفرشاة السابقة. مولّد الفرشاة هو البرمجة الأساسية التي تولّد أثر الفرشاة، فلمولدات الفُرش المختلفة خيارات ونتائج مختلفة مثل الفرق بين استخدام أقلام التلوين وأقلام الرصاص والحبر، ولكن تنتج معظم هذه المولدات أشياء مختلفة باستخدام معادلات رياضية، لأن الحواسيب أجهزة تعتمد على الرياضيات. لا يهتم معظم الرسامين بالطبيعة الرياضية بقدر اهتمامهم بالخامات والعلامات المختلفة لكل مولد فرشاة. لكل مولد فرشاة أثره واستخدامه المميز، ويمكن تخصيصه أكثر عن طريق تعديل خياراته. إذا غيّرت إعدادًا مسبقًا، فستظهر أيقونة خلف اسم المولد هي زر إعادة تحميل إعداد الفرشاة المسبق Reload the brush preset الذي يمكنك استخدامه للعودة إلى إعدادات الفرشاة الأصلية. كما يوجد زر حفظ إعدادات فرشاة الجديد Save New Brush Preset وزر الكتابة فوق الفرشاة Overwrite Brush. يأخذ زر الحفظ "Save New Brush Preset" الإعدادَ المسبق الحالي مع جميع تعديلاته ويحفظه بوصفه إعدادًا مسبقًا جديدًا، وإن لم يتغير أي شيء، فستنشأ نسخة من الإعداد المسبق الحالي. بينما يُفعَّل زر الكتابة فوق الفرشاة Overwrite Brush فقط في حالة عدم وجود أيّ تغييرات، حيث سيؤدي الضغط عليه إلى استبدال الإعداد المسبق الحالي بالإعدادات الجديدة مع الحفاظ على الاسم والأيقونة كما هي، وسينشِئ نسخة احتياطية ذات علامة زمنية في مجلد الموارد. سيؤدي حفظ الإعداد المسبق الجديد إلى استدعاء النافذة التالية، مع مفكّرة Scratch pad وجميع الخيارات اللازمة لتغيير أيقونة الإعداد المسبق: الصورة على اليسار هي عبارة عن مفكرة صغيرة يمكنك الرسم عليها باستخدام الفرشاة الحالية، مما يسمح بإجراء تعديلات بسيطة بسرعة. اسم الفرشاة Brush Name: وهو اسم فرشاتك الخاصة، ويُستخدم لملف KPP. إذا كانت هناك فرشاة بهذا الاسم مسبقًا، فستُستبدَل بالفرشاة الجديدة بفعالية. حمّل مصغَّرة موجودة Load Existing Thumbnail: سيؤدي هذا الخيار إلى تحميل الصورة المصغرة الموجودة ضمن الإعداد المسبق. حمل مصغَّرة المفكرة Load Scratch Pad Thumbnail: سيؤدي هذا الخيار إلى تحميل المنطقة المُخطَّطة من المفكرة الكبيرة (القسم ج) إلى المنطقة المصغَّرة. حمّل صورة Load Image: يمكّنك هذا الخيار من اختيار صورة من القرص الصلب لتحميلها كصورة مصغَّرة. حمّل من مكتبة الأيقونات Load from Icon Library: يفتح مكتبة الأيقونات. امسح المصغرة Clear Thumbnail: يجعل هذا الخيار المفكرة الصغيرة بيضاء. كما يستخدم كريتا مكتبة أيقونات لإنشاء أيقونات الإعدادات المسبقة بسرعة. تسمح لك مكتبة الأيقونات بتحديد أيقونات الأدوات مع رمز صغير اختياري. إذا ضغطت على "حسنًا"، فستُحمَّل المجموعة الناتجة في المفكرة الصغيرة، ثم يمكنك رسم أثر الفرشاة. إذا انتقلت إلى مجلد الموارد، فستجد مجلدًا يسمى preset\_icons، كما ستجد المجلدين tool\_icons و emblem\_icons، ويمكنك إضافة ملفات PNG شبه شفافة، وسيحمّلها كريتا في مكتبة الأيقونات أيضًا لتتمكّن من تخصيص أيقوناتك. توجد ثلاثة أشرطة تمرير في الجزء العلوي الأيمن من مكتبة الأيقونات، إذ تسمح هذه الأشرطة بضبط أيقونة الأداة، فأعلى شريطين هما الصِبغة اللونية Hue والتشبع اللوني Saturation نفسهما الموجودين في ضبط HSL، وشريط التمرير الأخير هو درجة اللون الرمادي levels filter التي تسمح بتطبيق أغمق الظلال وأسطع الإضاءات على أيقونة الأداة، مما يجعلها أفضل بكثير لإجراء تعديلات سريعة. إذا انتهيت من كل الإعدادت، فيمكنك الضغط على حفظ Save في نافذة حفظ إعدادات فرشاة جديدة Save New Brush Preset، ثم سيحفظ كريتا الفرشاة الجديدة. القسم ب - منتقي مسبق الضبط The Preset Chooser يشبه منتقي مسبقات الضبط Preset chooser إلى حد كبير لوحة الفُرش مسبقة الضبط Preset docker وقائمة الإعداد المسبق التي تظهر باستخدام المفتاح F6، ولكنه يُعَدّ فريدًا من نوعه لأنه يسمح لك بالترشيح حسب المولد وهو المكان الذي يمكنك إنشاء فُرش لمولّد من نقطة الصفر فيه. تكون قائمة منتقي مسبقات الضبط مخفية افتراضيًا، لذلك ستحتاج إلى الضغط على السهم الموجود أعلى محرك الفرشاة لإظهارها. تُضبَط هذه القائمة العلوية على "الكل all" افتراضيًا، مما يعني أنها تعرض جميع المولدات، ثم تعرض قسم الوسم tag حيث يمكنك اختيار الوسوم وقائمة الإعداد المسبق وشريط البحث. يوجد أسفل ذلك إشارة زائد، حيث يمنحك الضغط عليها قائمةَ مولدات كريتا الكاملة، وسيؤدي اختيار مولد من القائمة إلى إظهار الفُرش الخاصة به. تنفّذ أيقونة سلة المهملات الشيء نفسه الذي تنفّذه في لوحة الفُرش مسبقة الضبط، وهو حذف أو بالأحرى إلغاء تفعيل إعداد مسبق، وبالتالي لن يظهر في القائمة. القسم ج - المفكرة The Scratch pad يجب التحقق من عمل كل إعداد عندما تعدّل فرشك، وهذا سبب وجود المفكرة على يمين قائمة الإعدادات. تكون هذه المفكرة مطوية افتراضيًا، لذلك يجب الضغط على السهم الموجود أعلى إعدادات الفرشاة لإظهارها. يمكنك عند حفظ إعداد مسبق جديد اختيار الأيقونة من المفكرة، وسيؤدي ذلك إلى تحميل المنطقة المخطّطة في المفكرة الصغيرة في نافذة حفظ إعدادات فرشاة جديدة Save New Brush Preset. يحتوي قسم المفكرة على خمسة أزرار في الأسفل هي: املأ المنطقة بأيقونة الفرشاة مسبقة الضبط Fill area with brush preset icon. املأ المنطقة بالصورة الحالية Fill area with current image. املأ المنطقة بتدرج لوني Fill area with gradient (مفيدة لفرش مزج الألوان smudge). املأ المنطقة بلون الخلفية Fill area with background color. أعد ضبط المنطقة إلى الأبيض Reset area to white. القسم د - قائمة الخيارات The Options List تختلف الخيارات حسب مولّد الفرشاة، حيث تمثّل هذه الخيارات المعاملات والمفاتيح والمقابض المختلفة التي يمكنك تشغيلها لجعل الفرشاة مسبقة الضبط فريدة. الأمور الرئيسية التي يجب تغييرها لبعض الخيارات هي أشرطة التمرير ومربعات الاختيار، ولكن تستخدم خيارات متعددة منحنياتٍ بدلًا من ذلك. يمكن تبديل بعض الخيارات على حسب ما هو مذكور في مربعات الاختيار المجاورة لها، لكن البعض الآخر مثل التدفق Flow والعتامة Opacity أساسيان لعمل الفرشاة، لذلك هما دائما التفعيل. يُستخدَم رمز القفل الصغير الموجود بجوار الخيارات لقفل الفرشاة. القسم هـ - منطقة ضبط الخيارات Option Configuration Widget يمثّل القسم "هـ" قائمة الخيارات، بينما يمثل القسم "و" المنطقة التي يمكنك تغيير ضبط هذه الخيارات فيها. أحد أهم الأشياء التي تميّز الفن المُبتكَر عن غيره هو أسلوب رسم أثر الفرشاة، إذ يختلف هذا الأثر باختلاف السرعة والدوران والاتجاه ومقدار الضغط المُطبَّق على القلم. بما أن هذه القيم مهمة جدًا، لذلك يجب فهمها بالتفصيل، وأفضل طريقة لذلك هي استخدام المنحنيات Curves. تظهر المنحنيات مع خيار الحجم مثلًا، حيث يجب ربط الحجم Size مع الضغط Pressure لفرشاة التحبير من خلال تحديد خيار الحجم من قائمة الخيارات. لكن الأشخاص لديهم أيادٍ مختلفة، وبالتالي سيضغطون بطريقة مختلفة على أقلامهم، إذ يميل الشخص الذي يضغط برفق إلى أن يجد أن أثر الفرشاة الرفيع أسهل من أثر الفرشاة الثخين. بينما يجد الشخص الذي يضغط بشدة على قلمه صعوبة في إنشاء أثر رفيع، ويجد إنشاء أثر ثخين أسهل. يمكن تحسين مثل هذا الموقف من خلال المنحنيات لربط الضغط مع خرج الخطوط الرفيعة أو الخطوط الثخينة. تحتوي منحنيات إعدادات الفرشاة على أزرار خاصة بهذا المنحني، حيث يجب على الشخص الذي يواجه صعوبة في إنشاء أثر فرشاة صغير أن يجرب الزر الثاني أو الزر الأخير المقعر، بينما يجب على الشخص الذي يواجه صعوبة في إنشاء أثر فرشاة ثخين أن يجرب الزر الثالث الذي له شكل الحرف S. يوجد خياران آخران أسفل منطقة المنحني هما: مشاركة المنحني عبر جميع الإعدادات Share curve across all settings: يُسخدم هذا الخيار مع قائمة المستشعرات sensors، وسيؤدي اختياره إلى استخدام جميع المستشعرات، بينما سيكون للمستشعرات منحنيات منفصلة عند عدم اختياره. نمط حساب المنحنيات Curves calculation mode: يشير هذا الخيار إلى كيفية استخدام القيم المتعددة لمنحنيات المستشعرات، حيث تتراوح قيم المنحنيات دائمًا بين القيمتين 0 و 1.0، لذلك إذا نتج عن أحد المنحنيات القيمة 0.5 ونتج عن منحنٍ آخر القيمة 0.7، فسيحدث ما يلي: Multiply: نضرب القيمتين أي 0.5*0.7 = 0.35. Addition: نجمع القيمتين مع قبول القيمة 1.0 كحد أقصى لنتيجة الجمع، أي إذا كان 0.5+0.7 = 1.2، فسنحدّد النتيجة على القيمة 1.0. Maximum: نختار القيمة الأكبر، أي تكون النتيجة في هذه الحالة 0.7. Minimum: نختار القيمة الأصغر، أي تكون النتيجة في هذه الحالة 0.5. Difference: نطرح القيمة الأصغر من القيمة الأكبر، لذا فإن 0.7-0.5 = 0.2. لاحظ المثال التالي: أثر الفرشاة الأولى والثانية منتظم، وأثر الفُرش الباقية له أنواع مختلفة. هي فرشاة ذات حجم مضبوط على مستشعر المسافة distance sensor. هي فرشاة ذات حجم مضبوط على مستشعر التلاشي fade sensor. يُحسَب الحجم من جداء مستشعر التلاشي ومستشعر المسافة. يُحسَب الحجم من جمع مستشعرَي التلاشي والمسافة (لاحظ أن أثر الفرشاة ثخين). يأخذ الحجم أقصى قيمة من قيم مستشعرَي التلاشي والمسافة. يأخذ الحجم أدنى قيمة من قيم مستشعرَي التلاشي والمسافة. يُحسَب الحجم من خلال طرح القيمة الصغرى من القيمة الكبرى. القسم و - خيارات متنوعة يتكون هذا القسم من الخيارات التالية: تبديل حجم الممحاة Eraser switch size: يؤدي هذا الخيار إلى تبديل الفرشاة إلى حجم مخزَّن منفصل عند استخدام المفتاح E. تبديل شفافية الممحاة Eraser switch opacity: يؤدي هذا الخيار إلى تبديل الفرشاة إلى شفافية مخزَّنة منفصلة عند استخدام المفتاح E. حفظ تعديلات الإعداد المسبَق مؤقتًا Temporarily save tweaks to preset: يفعّل الإعدادات المسبقة الملوثة Dirty presets التي تخزّن التعديلات التي تجريها طوال فترة تنشيط جلسة كريتا الحالية ثم تعود إلى الإعدادت الافتراضية. يمكن التعرف على الإعدادات المسبقة الملوثة من خلال الرمز الموجود في أعلى يسار الإعداد المسبق. يشير الرمز الموجود في الجزء العلوي الأيسر إلى أنها "إعدادات مسبقة ملوّثة"، مما يعني أن هناك تعديلات أُجريت على هذا الإعداد المسبق. المعاينة اللحظية Instant preview: يسمح هذا الخيار بتطبيق المعاينة اللحظية على الفرشاة التي تتميز المعاينة بميزة فائقة السرية، حيث يظهَر شريط تمرير العتبة Threshold عند النقر بزر الفأرة الأيمن على المعاينة اللحظية فقط. يحدّد شريط التمرير حجم الفرشاة الذي تُنشَّط عنده معاينة الفرشاة اللحظية، وهذا مفيد لأن الفُرش الصغيرة يمكن أن تكون أبطأ مع المعاينة اللحظية، لذلك تضمن العتبة تنشيطه هذ المعاينة عند الضرورة فقط. إعدادات فرشاة رقعة الرسم يوجد محرّر فرشاة على رقعة الرسم On-Canvas Brush Editor أو فرشاة HUD في كريتا، حيث إذا فتحت لوحة الألوان المنبثقة من خلال النقر بزر الفأرة اليمين على رقعة الرسم، فيجب أن ترى أيقونة أسفل يمين لوحة الألوان. اضغط على تلك الأيقونة لإظهار إعدادات فرشاة رقعة الرسم، حيث سترى أشرطة تمرير متعددة لإجراء تغييرات بسيطة بسرعة. يمكنك تغيير مقدار الإعدادات المرئية وترتيبها بالنقر على أيقونة الإعدادات الموجودة بجوار اسم الفرشاة. يظهر الإعداد المسبق النشط حاليًا في الجزء العلوي، ويوجد زر إعدادات بجانبه، انقر عليه للحصول على قائمة بالإعدادات التي يمكن عرضها وتنظيمها لمولد الفرشاة المحدد. توجد جميع الإعدادات غير المستخدمة على اليسار وجميع الإعدادات المستخدَمة على اليمين، حيث يمكنك استخدام الزرين > و < لتحريك الإعداد من عمود إلى آخر. يسمح لك الزران للأعلى وللأسفل بضبط ترتيب الإعدادات المستخدمة، إذا كان التدفق أكثر أهمية من الحجم على سبيل المثال. هذه الإعدادات خاصة بكل مولد فرشاة، لذلك يمكن أن يكون لمولدات الفرشاة المختلفة إعدادات مختلفة. إنشاء فرشاة مسبقة الضبط لننشئ فرشاة بسيطة ونختبرها. الحصول على مولد فرشاة افتراضي افتح أولًا الإعدادات باستخدام المفتاح F5. اضغط بعد ذلك على السهم الموجود أعلى اليسار لفتح منتقي مسبقات الضبط Preset chooser (القسم ب)، ثم اضغط على الرمز "+" للحصول على قائمة المولدات. سننشئ في مثالنا فرشاة بكسل pixel. إنشاء فرشاة تحبير مثالًا ارسم على المفكرة لترى كيف تبدو الفرشاة الحالية، حيث يجب أن يكون لديك فرشاة بعرض 5 بكسلات مع خيار الضغط Pressure للشفافية Opacity. لنلغِ تفعيل الشفافية أولًا. انقر على خيار الشفافية في القائمة اليسرى، ثم يجب تغيير الإعدادات إلى منحنٍ كبير هو منحني المستشعر. ألغِ تحديد مربع اختيار تفعيل إعدادات القلم Enable Pen Settings. اختبر ما سبق على المفكرة، حيث ستجد أنه لا يزال هناك شيء يؤثر على الشفافية، وهذا يرجع إلى خيار التدفق Flow. حدّد خيار التدفق من القائمة. يشبه التدفق الشفافية، باستثناء أن التدفق يكون لكل أثر فرشاة خفيف dab، والشفافية لكل أثر فرشاة ثقيل stroke. ألغِ تحديد مربع اختيار تفعيل إعدادات القلم Enable Pen Settings لخيار التدفق واختبر كل شيء مرة أخرى. يجب أن تختار فرشاة تحبير inking brush، حيث ستجدها لا تزال صغيرة جدًا ومظهرها محبب نوعًا ما. انقر بعد ذلك على رأس الفرشاة Brush Tip من خيارات مولد الفرشاة. القطر Diameter هو حجم رأس الفرشاة، حيث يمكنك النقر على شريط التمرير لتغيير الحجم، أو النقر بزر الفأرة الأيمن فوقه ثم كتابة قيمة. اضبطه على القيمة 25 واختبره مرة أخرى، إذ يجب أن يكون أفضل بكثير. يمكنك جعل الفرشاة أنعم من خلال تقليل معامل التلاشي Fade إلى حوالي 0.9، إذ سيعطي ذلك قناع الفرشاة حافة أنعم. إذا اختبرت الفرشاة مرة أخرى، فستلاحظ أن التلاشي ليس له تأثير كبير، فالتأثير الأكبر متعلق بالتباعد spacing بين آثار الفرشاة، حيث يصبح الخط أحدّ كلما اقتربت هذه الآثار من بعضها البعض. قيمة التباعد الافتراضية هي 0.1، وهي منخفضة بعض الشيء. إذا ضبطت التباعد على القيمة 10 واختبرت الفرشاة، فسترى نوع تأثير التباعد. يغيّر مربع الاختيار "آلي Auto" طريقة حساب التباعد، ويكون التباعد الآلي بقيمة 0.8 هو أفضل قيمة لفُرش التحبير (لا تنسَ أنه يمكنك استخدام النقر بزر الفأرة الأيمن لكتابة قيمة). يبدو أن للتلاشي تأثير بسيط عند اختبار الفرشاة الآن، باستثناء أن الحجم صغير، وبالتالي تبدو آثار الفرشاة متعرجة. لكن يمكنك التخلص من ذلك من خلال تحديد مربع اختيار التنعيم anti-aliasing. اختبر الفرشاة مرة أخرى، حيث يجب أن تكون الخطوط أجمل بكثير الآن. حفظ الفرشاة الجديدة انتقل إلى الجزء العلوي الأيمن وحدّد الزر حفظ إعدادات فرشاة جديدة Save New Brush Preset، ثم ستظهر نافذة حفظ إعدادات فرشاة جديدة. غيّر اسم الفرشاة إلى اسم مناسب، ثم اضغط على زر حمّل من مكتبة الأيقونات Load from Icon Library للحصول على مكتبة الأيقونات، ثم اختر أيقونة أداة مناسبة واضغط على موافق. ستُحمَّل الأيقونة في المفكرة الصغيرة الموجودة على اليسار. خربش عليها، وإذا شعرت بشيء خاطئ، فارجع إلى مكتبة الأيقونات لتحميل أيقونة جديدة. اضغط أخيرًا على حفظ Save، وتنتهي بذلك من الفرشاة. يمكنك تعديل فرشاة التحبير أكثر باستخدام طريقتين هما: تغيير مقدار الضغط على الفرشاة الذي تحتاجه لجعلها بالحجم الكامل: حدّد خيار الحجم size، واضغط على مستشعر الضغط من القائمة بجوار المنحنى الذي يجب أن يكون خطًا مستقيمًا. إذا أردت فرشاة تكبر مع ضغط قليل، فيجب أن تضع علامة على المنحني لتكوين نقطة، ثم اسحب النقطة إلى أعلى اليسار، حيث يكون التأثير أشد كلما زادت النقطة إلى أعلى اليمين. بينما إذا أردت فرشاة تريد الضغط عليها بشدة للوصول إلى الحجم الكامل، فاسحب النقطة إلى أسفل اليمين، إذ تكون هذه الفرشاة مفيدة للتفاصيل الدقيقة (لا تنسَ حفظ التغييرات المُطبَّقة على الفرشاة عند الانتهاء). تنعيم الخطوط الدقيقة باستخدام خيار التدفق: حدّد خيار التدفق Flow، وأعِد تفعيل مربع اختيار تفعيل إعدادات القلم Enable Pen Settings. إذا اختبرت الفرشاة، فستجدها أنعم ولكن أكثر من اللازم. انقر على المنحني لإنشاء نقطة، واسحب تلك النقطة إلى أعلى اليسار في منتصف الاتجاه الأفقي للمربع الأول من الشبكة. إذا اختبرت ذلك، فستكون الخطوط الرفيعة أنعم، ولكن تصبح آثار الفرشاة أحدّ كلما زاد الضغط عليها. مشاركة الفُرش هناك عدة طرق لمشاركة الفرشاة مسبقة الضبط بعد إنشائها، ولكن الطريقة الموصَى بها لمشاركة الفرش والإعدادات المسبقة هي باستخدام نظام حزم الموارد Resource Bundle. هناك طرق قديمة متعددة لمشاركة الفرش التي يمكن أن تكون مفيدة عند استيراد حزم قديمة جدًا وتحميلها (سنتحدث عنها فيما يلي). مشاركة إعداد مسبق وحيد هناك ثلاثة أنواع من الموارد يمكن أن يأخذها إعداد مسبق: ملف paintoppreset: هو الإعداد المسبَق الصحيح مع تخزين الأيقونة والمنحنيات بداخله. ملف الفرشاة Brush file: هو رأس الفرشاة، وله نوعان عند استخدام الفرش المقنعة Masked brushes. ملف النمط Pattern file: عند استخدام الخامات Textures. لذلك إذا كان لديك فرشاة تستخدم رؤوسًا فريدة محدَّدة مسبقًا لرأس فرشاة أو لفرشاة مقنعة أو لخامات فريدة، فستحتاج إلى مشاركة هذه الموارد أيضًا مع شخص آخر. يمكنك العثور على هذه الموارد من خلال الانتقال إلى قائمة إعدادات Settings ثم إدارة الموارد Manage Resources ثم فتح مجلد الموارد، حيث سيكون ملف الإعداد المسبق ضمن ملف paintoppresets، ورؤوس الفرشاة داخل ملف brushes والخامات ضمن ملف patterns. إذا أردت استخدام الإعداد المسبق الوحيد، فيجب عليك الانتقال إلى منتقي مسبقات الضبط preset chooser من خلال الضغط على المفتاح F6 ثم الضغط على أيقونة المجلد هناك، مما يؤدي إلى فتح نافذة. انتقل إلى ملف KPP وافتحه لاستيراده. إذا احتوى الملف على رؤوس وأنماط للفرشاة، فطبّق الشيء نفسه مع النمط عبر لوحة الأنماط. بالنسبة لرأس الفرشاة، انتقل إلى قائمة الإعدادات (بالضغط على مفتاح F5) ثم انتقل إلى خيار رأس الفرشاة، ثم حدّد الفرشاة المعرَّفة مسبقًا، ثم اضغط على زر الاستيراد لاستدعاء نافذة الملف. كما يمكنك استخدام زر الاستيراد import من قائمة إعدادات ثم إدارة الموارد. المشاركة عبر ملف مضغوط ZIP (الطراز القديم) يجب استبدال المشاركة عبر ملف ZIP بحزم الموارد، ولكن تُخزَّن حزم الفُرش القديمة في ملفات مضغوطة ZIP. يمكنك استخدام ملف مضغوط ZIP مع الملفات ذات الصلة كما يلي: انتقل إلى قائمة الإعدادات ثم إدارة الموارد ثم اختر فتح مجلد الموارد لفتحه. ثم افتح ملف ZIP. انسخ مجلدات brushes و paintoppresets و patterns من ملف ZIP إلى مجلد الموارد. يجب أن يُطلَب منك دمج المجلدات، لذلك وافق على ذلك. ثم أعِد تشغيل كريتا واستمتع بفُرشك! ترجمة -وبتصرّف- للمقالين Loading and Saving Brushes و On-Canvas Brush Editor من موقع Krita. اقرأ أيضًا تلميحات مختلفة حول استخدام الفرش في كريتا تحبير مسودة الرسم في كريتا كيفية تنظيف الخطوط الزرقاء التقليدية وتلوينها رقميا في برنامج Krita المفاهيم الأساسية لكريتا
-
تتضمن إحدى النظريات المهمة التي طُوِّرت لنموذج الكيان العلاقي entity relational -واختصارًا ER- فكرة الاعتمادية الوظيفية functional dependency -أو FD اختصارًا-، والهدف من دراستها هو تحسين فهمك للعلاقات بين البيانات، واكتساب المنهجية الكافية للمساعدة في التصميم العملي لقاعدة البيانات. تُستخلَص الاعتماديات الوظيفية FD من دلالات semantics نطاق التطبيق، أي مثل القيود constraints التي شرحناها في المقال السابق، وتصِف كيفية ارتباط السمات المنفصلة individual attributes ببعضها البعض، كما تُعَدّ الاعتماديات الوظيفية FD نوعًا من القيود بين السمات داخل علاقة، وتساهم في تصميم مخطط علاقي جيد، حيث سنلقي في هذا المقال نظرةً على: نظرية الاعتمادية الوظيفية الأساسية وتعريفها. منهجية تحسين تصميمات المخططات، وتسمى أيضًا التوحيد normalization. التصميم العلاقي Relational Design والتكرار Redundancy يجب احتواء التصميم الجيد لقاعدة البيانات العلاقية على جميع السمات والارتباطات الضرورية، حيث يجب أن يقوم التصميم بذلك بأقل قدرٍ ممكن من المعلومات المخزَّنة مع عدم وجود بيانات مكرَّرة redundant. يُعَدّ التكرار أمرًا غير مرغوب فيه في تصميم قاعدة البيانات، وذلك لأنه يسبب مشاكلًا في الحفاظ على التناسق بعد التحديثات، لكن يمكن أن يؤدي التكرار إلى تحسينات في الأداء في بعض الأحيان مثل إمكانية استخدام التكرار بدلًا من عملية الضم join لربط البيانات، حيث تُستخدَم عملية الضم join عند الحاجة إلى الحصول على معلومات تستند إلى جدولين مرتبطين. ضع في بالك الشكل الآتي الذي يوضِّح مثالًا عن التكرار المُستخدَم في الحسابات المصرفية Bank Accounts، وفروع المصرف Branches، حيث يَظهر العميل رقم 1313131 مرتين، أي مرةً للحساب ذو الرقم A-101، ومرةً أخرى للحساب رقم A-102؛ إذ لا يكون رقم العميل زائدًا في هذه الحالة على الرغم من وجود حالات حذفٍ شاذة deletion anomalies في الجدول، وسيحل هذه المشكلة وجود جدول منفصل للعملاء. إذا تغير عنوان الفرع branch address، فيجب تحديثه في أماكن متعددة، وإذا تُرِك رقم العميل في الجدول كما هو، فلن تحتاج إلى جدول للفرع branch، ولن تكون هناك حاجة إلى عملية ضم، وبالتالي، سيتحسّن الأداء. 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; } accountNo blance customer branch address assets A-101 500 1313131 Downtown Brooklyn 9000000 A-102 400 1313131 Perryridge Horseneck 1700000 A-113 600 9876543 Round Hill Horseneck 8000000 A-201 900 9676543 brighton Brooklyn 7100000 A-215 700 1111111 Manus Horseneck 400000 A-222 700 1111111 Redwood Palo Alto 2100000 A-305 350 1234567 Round Hill Horseneck 8000000 التعديلات الشاذة على جداول قاعدة البيانات سنعرض أشهر الحالات الشاذة التي تحدث نتيجة إجراء تعديلات من إدخل أو تعديل أو حذف على قاعدة البيانات كما سنضرب مثالًا لذلك. حالة الإدخال الشاذة Insertion Anomaly تحدث هذه الحالة عند إدخال معلومات متضاربة في جدول، حيث نحتاج إلى التحقق من أن بيانات الفرع branch متوافقة مع الصفوف الموجودة عندما ندخل سجلًا جديدًا مثل رقم الحساب A-306، كما في الشكل التالي: accountNo blance customer branch address assets A-101 500 1313131 Downtown Brooklyn 9000000 A-102 400 1313131 Perryridge Horseneck 1700000 A-113 600 9876543 Round Hill Horseneck 8000000 A-201 900 9676543 brighton Brooklyn 7100000 A-215 700 1111111 Manus Horseneck 400000 A-222 700 1111111 Redwood Palo Alto 2100000 A-305 350 1234567 Round Hill Horseneck 8000000 حالة التحديث الشاذة Update Anomaly إذا غيّر أحد فروع المصرف عنوانه مثل الفرع راوند هيل Round Hill في الشكل الآتي، فنحن بحاجة إلى تحديث جميع الصفوف التي تشير إلى هذا الفرع، حيث يسمّى تغيير المعلومات الموجودة بصورة غير صحيحة بحالة تحديث شاذة. accountNo blance customer branch address assets A-101 500 1313131 Downtown Brooklyn 9000000 A-102 400 1313131 Perryridge Horseneck 1700000 A-113 600 9876543 Round Hill Horseneck 8000000 A-201 900 9676543 brighton Brooklyn 7100000 A-215 700 1111111 Manus Horseneck 400000 A-222 700 1111111 Redwood Palo Alto 2100000 A-305 350 1234567 Round Hill Horseneck 8000000 A-306 800 1111111 Round Hill Horseneck 8000800 حالة الحذف الشاذة Deletion Anomaly تحدث هذه الحالة عند حذف سجل قد يحتوي على سمات لا ينبغي حذفها، إذا أزلنا معلومات حول الحساب الأخير في أحد الفروع، مثل الحساب رقم A-101 في الفرع داون تاون Downtown في الشكل التالي على سبيل المثال، فستختفي جميع معلومات ذلك الفرع. accountNo blance customer branch address assets A-101 500 1313131 Downtown Brooklyn 9000000 A-102 400 1313131 Perryridge Horseneck 1700000 A-113 600 9876543 Round Hill Horseneck 8000000 A-201 900 9676543 brighton Brooklyn 7100000 A-215 700 1111111 Manus Horseneck 400000 A-222 700 1111111 Redwood Palo Alto 2100000 A-305 350 1234567 Round Hill Horseneck 8000000 مشكلة حذف الصف A-101 هي عدم معرفتنا مكان الفرع Downtown، وأننا سنفقد جميع المعلومات المتعلقة بالعميل 1313131. نحتاج إلى تفكيك الجدول الأصلي إلى جداول أصغر متعددة بحيث يكون لكل جدول حدًا أدنى من التداخل مع الجداول الأخرى، وذلك لتجنب هذه الأنواع من مشاكل التحديث أو الحذف. يجب احتواء كل جدول حساب مصرفي على معلومات حول كيان entity واحد فقط، مثل: الفرع Branch، أو العميل Customer، كما هو موضح في الشكل التالي: سيضمن اتباع هذه العملية أن إضافة معلومات الفرع أو تحديثها سيؤثر على سجل واحد فقط، لذلك لن تعدَّل معلومات الفرع عن طريق الخطأ، ولن تُسجَّل بصورة غير صحيحة، عند إضافة معلومات العميل أو حذفها. مثال تطبيقي عن جدول مشروع-موظف والحالات الشاذة يوضِّح الشكل الآتي مثالًا لجدول مشروع-موظف employee project table، كما يمكننا الافتراض من هذا الجدول أن: معرِّف الموظف EmpID، ومعرِّف المشروع ProjectID هما مفتاح رئيسي مركَّب composite PK. يحدد معرِّف المشروع الميزانية Budget، أي أنّ للمشروع P1 ميزانيةً لفترة 32 ساعة. EmpID Budget ProjectID Hours S75 32 P1 7 S75 40 P2 3 S79 32 P1 4 S79 27 P3 1 S80 40 P2 5 17 P4 فيما يلي بعض الحالات الشاذة anomalies المحتملة التي قد تحدث مع هذا الجدول خلال الخطوات التالية: الإجراء: إضافة الصف Add row الذي هو {S85,35,P1,9}. المشكلة: هناك صفان tuples بميزانيات متضاربة. الإجراء: حذف الصف Delete tuple الذي هو {S79, 27, P3, 1}. المشكلة: الخطوة رقم 3 تحذف ميزانية المشروع P3. الإجراء: تحديث الصف Update tuple من {S75, 32, P1, 7} إلى {S75, 35, P1, 7}. المشكلة: تُنشِئ الخطوة رقم 5 صفَّين بقيم مختلفة لميزانية المشروع P1. الحل: إنشاء جدول منفصل separate table لكل من المشاريع Projects والموظفين Employees، أي كما هو موضَّح في الشكل التالي: كيفية تجنب الحالات الشاذة أفضل طريقة لإنشاء جداول بدون حالات شاذة هي التأكد من توحيد الجداول، ويتحقق ذلك من خلال فهم الاعتماديات الوظيفية، حيث تضمن الاعتمادية الوظيفية FD في جدول انتماء جميع السمات attributes إلى هذا الجدول، أي ستزيل التكرار والحالات الشاذة. مثال تطبيقي: جدولا المشاريع والموظفين المنفصلان ProjectID Budeget P1 32 P2 40 P3 27 P4 17 جدول المشروع Project Emp ID Project ID Hours S75 P1 7 S75 P2 3 S79 P1 4 S79 P3 1 S80 P2 5 جدول الموظف Employee يكون من خلال الاحتفاظ بالبيانات منفصلة باستخدام جدول مشاريع وجدول موظفين ما يلي: لن تُنشَأ حالات شاذة إذا تغيرت الميزانية. ليست هناك حاجة إلى قيم وهمية للمشاريع التي لم يُعيَّن لها موظفون. إذا حُذِفت مساهمة موظف ما، فلن تُفقَد بيانات مهمة. لن تُنشَأ حالات شاذة إذا أُضيفت مساهمة موظف. تمارين أولًا، طبِّق التوحيد normalization على الشكل التالي: Attribute Name Sample Value Sample Value Sample Value StudentID 1 2 3 StudentName John Smith Sandy Law Sue Rogers CourselD 2 2 3 CourseName Programming Level 1 Programming Level 1 Business Grade 75% 61% 81% CourseDate Jan 5th, 2014 Jan 5th, 2014 Jan 7th, 2014 ثانيًا، أنشِئ مخطط ERD منطقي لخدمة تأجير الأفلام عبر الإنترنت، حيث لا توجد علاقات من النوع متعدد إلى متعدد many to many، واستخدم الوصف التالي للعمليات التي يجب أن تستند عليها قواعد عملك: تُصنِّف خدمة تأجير الأفلام عبر الإنترنت عناوين الأفلام وفقًا لنوعها إلى: الأفلام الكوميدية comedy، وأفلام الغرب الأمريكي western، والأفلام الكلاسيكية classical، وأفلام الخيال العلمي science fiction، وأفلام الرسوم المتحركة cartoon، وأفلام الحركة action، والأفلام الموسيقية musical، والأفلام المصدرة حديثًا new release. يحتوي كل نوع على العديد من العناوين المحتملة، وتتوفر نسخ copies متعددة لمعظم العناوين داخل النوع، فمثلًا، لاحظ الملخَّص التالي: TYPE TITLE Musical My Fair Lady (Copy 1) My Fair Lady (Copy 2) Oklahoma (Copy 1) Oklahoma (Copy 2) Oklahoma (Copy 3) ثالثًا، ما هي الحالات الشاذة الثلاثة للبيانات التي من المحتمل تَشكّلها نتيجةً لتكرار البيانات؟ وكيف يمكن القضاء على مثل هذه الحالات الشاذة؟ وسنتطرق في مقال لاحق لمثال عملي حول تصميم قاعدة بيانات كاملة من الصفر مثل تدريب عملي. ترجمة -وبتصرف- للمقال ER Modelling لصاحبته Adrienne Watt من كتاب Database Design. اقرأ أيضًا المقال التالي: الاعتماديات الوظيفية المستخدمة في تصميم قواعد البيانات المقال السابق: قواعد السلامة وقيودها لضمان سلامة البيانات في قواعد البيانات نموذج الكيان والعلاقة ER لتمثيل البيانات وتخزينها في قاعدة البيانات المفاهيم الأساسية في قواعد البيانات وتصميمها النسخة العربية الكاملة لكتاب تصميم قواعد البيانات
-
ركزنا حتى الآن على التفاعلات بين الإنسان وخادم الويب، حيث يستخدم الإنسان متصفح الويب للتفاعل مع الخادم، ويستمر التفاعل استجابةً لمدخلاتٍ من قِبل المستخدم من خلال النقر على الروابط مثلًا، لكن هناك طلبٌ متزايد على التفاعل المباشر بين حاسوبٍ وحاسوبٍ آخر؛ كما تحتاج التطبيقات التي تتواصل مباشرةً مع بعضها بعضًا مثل التطبيقات الموصوفة أعلاه إلى بروتوكولات. نختم هذا القسم من خلال مناقشة تحديات بناء أعدادٍ كبيرة من بروتوكولات تطبيقٍ إلى تطبيق وبعض الحلول المقترحة. تأتي الكثير من الدوافع لتمكين الاتصال المباشر من تطبيقٍ إلى تطبيق من عالم الأعمال، حيث تضمنت التفاعلات بين المؤسسات (الشركات أو المنظمات الأخرى) قديمًا بعض الخطوات اليدوية مثل ملء نموذج طلب أو إجراء مكالمةٍ هاتفية لتحديد ما إذا كانت بعض المنتجات في المخزن. من الشائع وجود خطواتٍ يدوية حتى داخل مؤسسةٍ واحدة بين الأنظمة البرمجية التي لا يمكن أن تتفاعل مباشرةً لأنها مُطوَّرة بصورةٍ مستقلة، ولكن يجري حاليًا استبدال هذه التفاعلات اليدوية بالتفاعل المباشر من تطبيقٍ إلى تطبيق. قد يرسل تطبيق الطلب في المؤسسة A رسالةً إلى تطبيق تنفيذ الطلب في المؤسسة B، والذي سيستجيب على الفور مشيرًا إلى إمكانية تنفيذ الطلب من عدمها، وإذا لم تكن المؤسسة B قادرةً على ملء الطلب، فسيطلُب التطبيق في المؤسسة A مباشرةً من موّردٍ آخر أو يطلب عروضًا من مجموعة من الموّردين. فيما يلي مثالٌ بسيط لما نتحدث عنه. لنفترض أنك اشتريت كتابًا من بائع تجزئة عبر الإنترنت مثل أمازون. يمكن أن ترسل لك أمازون مثلًا رقم التتبّع في رسالة بريد إلكتروني بمجرد شحن كتابك، وبعد ذلك يمكنك التوجه إلى موقع شركة الشحن الإلكتروني fedex مثلًا، وتتبّع الطرد، لكن يمكنك أيضًا تتبّع الطرد الخاص بك مباشرةً من موقع Amazon.com الإلكتروني. يجب أن تكون أمازون قادرةً على إرسال استعلامٍ إلى شركة الشحن فيديكس وبتنسيقٍ تفهمه لتحقيق ذلك، وتفسير النتيجة وعرضها في صفحة ويب قد تحتوي على معلوماتٍ أخرى حول طلبك، كما يجب أن يكون لشركتي لأمازون وفيديكس بروتوكولًا لتبادل المعلومات اللازمة لتتبّع الطرود يُطلق عليه اسم بروتوكول تتبّع الطرود Package Tracking Protocol. هناك العديد من البروتوكولات المحتملة من هذا النوع ويُفضَّل أن تكون لدينا بعض الأدوات لتبسيط مهمة تحديدها وبنائها. ليست التطبيقات الشبكية جديدةً حتى تلك التطبيقات التي تتخطى حدود المؤسسة، حيث يتجاوز البريد الإلكتروني وتصفح الويب هذه الحدود، ولكن الجديد في هذه المشكلة هو التوسّع، ولا نقصد التوسّع في حجم الشبكة، إنما في عدد الأنواع المختلفة لتطبيقات الشبكة. لقد طوّرت مجموعةٌ صغيرة من خبراء الشبكات مواصفاتِ البروتوكولات وعمليات تطبيقها الخاصة بالتطبيقات التقليدية، مثل البريد الإلكتروني ونقل الملفات، وكان الخروج ببعض التقنيات التي تبسِّط وتؤتمت مهمة تصميم بروتوكول التطبيق وتنفيذه أمرًا ضروريًا للتمكّن من التطوير السريع لعددٍ كبير من تطبيقات الشبكة المحتملة. دُعِمت معماريتان لحل لهذه المشكلة، أُطلق عليهما اسم خدمات الويب Web Services، حيث أُخِذ هذا الاسم من مصطلح التطبيقات التي تقدّم خدمة الوصول عن بُعد إلى تطبيقات العميل من أجل تشكيل التطبيقات الشبكية، وتُعَد المصطلحات المستخدمة بمثابة اختصارٍ غير رسمي للتمييز بين معماريتَي خدمات الويب هما SOAP وREST. يتمثل نهج معمارية SOAP في حل المشكلة من خلال إنشاء بروتوكولاتٍ مخصَّصة لكل تطبيقٍ شبكي من الناحية النظرية على الأقل. تتمثل العناصر الرئيسية لهذا النهج في إطار عملٍ لمواصفات البروتوكول، ومجموعات أدواتٍ برمجية لإنشاء تطبيقات البروتوكول تلقائيًا من المواصفات والمواصفات الجزئية المعيارية الممكن إعادة استخدامها عبر البروتوكولات. يتمثل نهج معمارية REST في معالجة المشكلة في عدِّ خدمات الويب مثل موارد شبكة الويب العالمية، والتي تُحدَّد بواسطة معرّفات URIs، ويجري الوصول إليها عبر بروتوكول HTTP. تُعَد معمارية REST مجرد معمارية ويب، حيث تشمل نقاط القوة في معمارية الويب الاستقرارَ وقابلية التوسع المثبتة أي توسّع حجم الشبكة. يُعَد عدم ملاءمة بروتوكول HTTP للأسلوب الإجرائي المعتاد أو الأسلوب الموجَّه بالعمليات لاستدعاء خدمة بعيدة نقطةَ ضعف، ولكن يجادل مؤيدو معمارية REST بأنه يمكن مع ذلك الكشف عن الخدمات المهمة باستخدام أسلوبٍ أكثر توجّهًا نحو البيانات، أو باستخدام أسلوب تمرير المستندات الذي يكون بروتوكول HTTP مناسبًا له. بروتوكولات التطبيقات المخصصة باستخدام معياري WSDL وSOAP تعتمد المعمارية التي يشار إليها بصورةٍ غير رسمية باسم معمارية SOAP على معيار لغة وصف خدمات الويب Web Services Description Language أو اختصارًا WSDL، ومعيار SOAP الذي نشأ اسمه مثل اختصار، إلا أنه لم يَعُد يمثل أي شيءٍ رسميًا. لقد أصدر اتحاد شبكة الويب العالمية World Wide Web Consortium أو اختصارًا W3C هذين المعيارين، وهذه هي المعمارية التي نقصدها عادةً عند استخدامنا لمصطلح Web Services بدون أي وصفٍ سابق. لا تزال هذه المعايير قيد التطوير، لذلك ستكون مناقشتنا هنا مختصرة. إن معيارا WSDL وSOAP هما إطارا عملٍ لتحديد وتنفيذ بروتوكولات التطبيق وبروتوكولات النقل على التوالي، حيث تُستخدمان معًا، لكن هذا ليس مطلوبًا؛ حيث يُستخدَم معيار WSDL لتحديد التفاصيل الخاصة بالتطبيق مثل العمليات المدعومة، وتنسيقات بيانات التطبيق لاستدعاء هذه العمليات أو الاستجابة لها، وما إذا كانت العملية متضمنةً استجابة أم لا؛ بينما يتمثل دور معيار SOAP في تسهيل تحديد بروتوكول النقل مع الدلالات المرغوبة فيما يتعلق بخصائص البروتوكول مثل الوثوقية والأمن. يتكون كل من معياري WSDL وSOAP من لغة مواصفات البروتوكول المعتمدة على لغة XML مع التركيز على توفير مواصفات الأدوات البرمجية مثل المصرّفات الجذعية stub compilers وخدمات الدليل directory services. ويُعَد دعم إنشاء التطبيقات تلقائيًا أمرًا بالغ الأهمية في عالمٍ مليء بالعديد من البروتوكولات المخصَّصة لتجنب الجهد المبذول لتطبيق كل بروتوكول يدويًا. يأخذ دعم البرمجيات نموذج مجموعات الأدوات وخوادم التطبيقات التي طوّرها الموّردون التابعون لجهةٍ خارجية، مما يسمح لمطوري خدمات الويب االتركيزَ أكثر على مشكلة الأعمال التي يحتاجون إلى حلها، مثل تتبّع الطرد الذي اشتراه العميل. تعريف بروتوكولات التطبيق اختار معيار WSDL نموذج تشغيل إجرائي لبروتوكولات التطبيق، وتتكون واجهة خدمة الويب المجردة من مجموعة من العمليات التي تملك اسمًا، وتمثل كل عمليةٍ تفاعلًا بسيطًا بين العميل وخدمة الويب، وتشبه هذه العملية إجراءً يمكن استدعاءه عن بعد في نظام RPC، مثل خدمة WSDL Primer من اتحاد W3C التي هي خدمة ويب لحجز الفنادق مع وجود عمليتين هما التحقق من التوافرية CheckAvailability والحجز MakeReservation. تحدّد كلُّ عمليةٍ نمطَ تبادل الرسائل Message Exchange Pattern أو اختصارًا MEP الذي يعطي التسلسل الذي ستُرسَل هذه الرسائل وفقًا له، بما في ذلك رسائل الخطأ المُرسَلة عند حدوث خطأٍ ما يعطّل تدفق الرسائل. لقد حُدِّدت العديد من أنماط MEP مسبقًا، ويمكن تحديد أنماط MEP مخصَّصة جديدة، لكن سيُستخدَم نمطان فقط من أنماط MEP عمليًا هما: نمط In-Only المتمثل برسالةٍ واحدة من العميل إلى الخدمة، ونمط In-Out المتمثل بطلبٍ من العميل وردٍّ مقابلٍ من الخدمة. قد تفوق تكاليف دعم مرونة نمط MEP فوائده. تُعَد أنماط MEP قوالبًا تمتلك عناصر نائبة placeholders عوضًا عن أنواع أو صيغ رسائلٍ محددة، لذلك يتضمن جزءٌ من تعريف العملية تحديدَ صيغ الرسائل التي ستُربَط مع العناصر النائبة في النمط. لم تُعرَّف صيغ الرسائل على مستوى البت، والتي تُعَد نموذجيةً للبروتوكولات التي ناقشناها، حيث تُعرَّف بدلًا من ذلك مثل نموذج بيانات مجردة باستخدام لغة XML. ويوفر مخطط XML مجموعةً من أنواع البيانات الأولية وطرقًا لتعريف أنواع البيانات المركبة، حيث يمكن تمثيل البيانات المتوافقة مع صيغة معرّف مخطط XML أو نموذج البيانات المجرد الخاص به بصورةٍ ملموسة باستخدام لغة XML، أو باستخدام تمثيلٍ آخر مشابه لتمثيل الثنائي لمعيار Fast Infoset. يفصل معيار WSDL أجزاء البروتوكول التي يمكن تحديدها تجريديًا، والتي هي العمليات وأنماط MEP وصيغ الرسائل المجردة، عن الأجزاء التي يجب أن تكون ملموسة. يحدّد الجزء الملموس من معيار WSDL البروتوكولَ الأساسي، وكيفية ربط أنماط MEP به، وما هو التمثيل المُستخدم على مستوى البت لتمثيل الرسائل الموجودة فعليًا، كما يُعرف هذا الجزء من المواصفات باسم الارتباط binding. على الرغم من أنه يُفضَّل وصفه بأنه تطبيق أو ربطٌ بتطبيق؛ يحتوي معيار WSDL على ارتباطات محدَّدة مسبقًا ببروتوكول HTTP والبروتوكولات المعتمدة على معيار SOAP مع معامِلاتٍ تسمح لمصمم البروتوكول بضبط الربط بتلك البروتوكولات. تتمثّل إحدى جوانب تخفيف معيار WSDL لمشكلة تحديد عددٍ كبير من البروتوكولات، في إعادة استخدام ما يُعَد أساسًا وحدات مواصفات specification modules. قد تتكون مواصفات معيار WSDL لخدمة الويب من عدة مستندات WSDL، كما يمكن أيضًا استخدام وثائق WSDL في مواصفات خدمة الويب الأخرى، وتسهّل هذه التركيبة النمطية modularity تطوير المواصفات والتأكد من احتواء مواصفتين من تلك المواصفات على بعض العناصر المتطابقة، مثل إمكانية دعم نفس الأداة لهما. تساعد هذه التركيبة النمطية، مع قواعد معيار WSDL الافتراضية، أيضًا في الحفاظ على المواصفات من أن تصبح مُسهَبة بصورةٍ كبيرة بالنسبة لمصممي البروتوكول، ويجب أن تكون التركيبة النمطية لمعيار WSDL مألوفةً لأي شخص طوَّر أجزاءً برمجيةً كبيرة، وليس ضروريًا أن تكون وثيقة معيار WSDL مواصفاتٍ كاملة، حيث يمكنها مثلًا تحديد صيغة رسالةٍ واحدة. تحدَّد المواصفات الجزئية بصورةٍ فريدة باستخدام مساحات أسماء XML؛ حيث تحدد كل وثيقة WSDL معرّفَ URI لمساحة الأسماء الهدف، وتُسمَّى التعريفات الجديدة في الوثيقة في سياق مساحة الأسماء تلك، ويمكن أن تتضمن إحدى وثائق WSDL مكوناتٍ من وثيقة أخرى من خلال تضمين including الوثيقة الأخرى، إذا اشتركت كلتا الوثيقتين في نفس مساحة الأسماء الهدف أو من خلال استيراد importing الوثيقة الثانية إذا اختلفت مساحات الأسماء الهدف. تعريف بروتوكولات النقل يطلَق على معيار SOAP أحيانًا بروتوكول، إلا أنه من الأفضل التفكير فيه على أنه إطار عملٍ لتحديد البروتوكولات، كما توضح مواصفات الإصدار 1.2 من معيار SOAP، أنه يوفّر معيار SOAP إطار عملٍ بسيط للمراسلة التي تهتم وظيفته الأساسية بتوفير قابلية التوسّع. يستخدم معيار SOAP عدة استراتيجيات مستخدَمة أيضًا مع معيار WSDL، بما في ذلك صيغ الرسائل المحدَّدة باستخدام مخطط لغة XML، والارتباطات بالبروتوكولات الأساسية وأنماط تبادل الرسائل وعناصر المواصفات القابلة لإعادة الاستخدام المحددة باستخدام مساحات أسماء XML. يُستخدَم معيار SOAP لتعريف بروتوكولات النقل بالخصائص المطلوبة لدعم بروتوكول تطبيقٍ معين، ويهدف إلى تسهيل تحديد العديد من هذه البروتوكولات باستخدام مكوناتٍ قابلة لإعادة الاستخدام، حيث يملك كل مكونٍ معلومات الترويسة والمنطق الذي يدخل في تطبيق ميزةٍ معينة؛ فمن أجل تعريف بروتوكولٍ بمجموعةٍ معينة من الميزات، فما عليك سوى تشكيل المكونات المقابلة. دعنا نلقي نظرةً عن كثب على هذا الجانب من معيار SOAP. لقد قدّم الإصدار 1.2 من معيار SOAP ميزةً تجريدية تشرحها المواصفات على النحو التالي: يجب أن تتضمن مواصفات ميزة معيار SOAP ما يلي: معرّف URI الذي يعرّف الميزة. معلومات الحالة والمعالجة الموصوفة تجريديًا والمطلوبة في كل عقدة SOAP لتطبيق الميزة. المعلومات التي ستنتقل إلى العقدة التالية. إذا كانت الميزة من نمط MEP، فسيجري تبادل رسائل دورة الحياة والعلاقات المؤقتة أو السببية، مثل أن تتبَع الاستجاباتُ الطلبات وتُرسل الاستجابات إلى منشئ الطلب. يُعَد إضفاء الطابع الرسمي على مفهوم ميزة البروتوكول مستوىً منخفضًا نوعًا ما، حيث يكاد أن يكون تصميمًا. هناك استراتيجيتان لتحديد بروتوكول SOAP الذي سيطبّق الميزات. تعتمد الاستراتيجية الأولى على استخدام الطبقات، أي ربط بروتوكول معيار SOAP ببروتوكول أساسي بطريقةٍ نستطيع اشتقاق الميزات منها، حيث يمكننا الحصول على بروتوكول طلب / استجابة عن طريق ربط بروتوكول معيار SOAP ببروتوكول HTTP، مع وضع طلب SOAP ضمن طلب HTTP ورد SOAP ضمن استجابة HTTP. يمكن أن يكون لدى بروتوكول معيار SOAP ارتباطًا ببروتوكول HTTP محددًا مسبقًا، أي يمكن تعريف الارتباطات الجديدة باستخدام إطار عمل ارتباطات بروتوكول SOAP. تتضمن الاستراتيجيةُ الثانية الأكثر مرونةً لتنفيذ الميزات كتلَ ترويسات header blocks، حيث تتكون رسالة SOAP من مُغلَّفٍ Envelope، ويحتوي ترويسةً Header تحتوي بدورها على كتل ترويسة، وجسمًا يحتوي على الحمولة الموجَّهة للمستقبل النهائي. يوضّح الشكل التالي بنية هذه الرسالة. تتوافق معلومات ترويسةٍ معينة مع ميزاتٍ معينة، مثل استخدام توقيعٍ رقمي لتطبيق الاستيثاق authentication ورقمٍ تسلسلي من أجل الوثوقية، ومجموعٍ اختباري لاكتشاف تلف الرسالة. تهدف كتلة ترويسة SOAP إلى تغليف معلومات الترويسة المتوافقة مع ميزةٍ معينة، ولا تكون المراسلات دائمًا واحدًا لواحد، وذلك نظرًا لامكانية تضمين كتل ترويسة متعددةٍ في ميزةٍ واحدة، أو استخدام كتلة ترويسةٍ واحدة في ميزاتٍ متعددة. تُعَد وحدة module من إطار عمل SOAP مواصفات صياغة ودلالات كتلةٍ أو أكثر من كتل الترويسة، وتهدف كل وحدةٍ إلى توفير ميزةٍ أو أكثر ويجب عليها الإعلان عن الميزات التي تطبّقها. إن الهدف من وحدات SOAP هو التمكّن من تشكيل بروتوكولٍ بمجموعة من الميزات ببساطة عن طريق تضمين كلٍّ من مواصفات الوحدة المقابلة؛ فإذا كان يتوجب على البروتوكول الخاص بك أن يحتوي على دلالاتٍ واستيثاقٍ مرةً واحدةً على الأكثر، فيجب تضمين الوحدات المقابلة في المواصفات الخاصة بك. يمثل هذا نهجًا جديدًا لتقسيم خدمات البروتوكول، وهو بديلٌ لطبقات البروتوكول التي رأيناها طوال هذا الكتاب، وهو يشبه إلى حدٍ ما تسوية سلسلةٍ من طبقات البروتوكول في بروتوكولٍ واحد، ولكن بطريقةٍ منظَّمة. يبقى أن نرى كيف ستعمل ميزات ووحدات SOAP المقدّمة في الإصدار 1.2 من معيار SOAP عمليًا، حيث تتمثل نقطة الضعف الرئيسية لهذا المخطط في امكانية تداخل الوحدات مع بعضها بعضًا، لذلك يجب وجود مواصفاتٍ للوحدات لتحديد أي تفاعلاتٍ معروفة مع وحدات SOAP الأخرى، ولكن من الواضح أن هذا لا يخفف كثيرًا من المشكلة. من ناحيةٍ أخرى، قد تكون مجموعة الميزات والوحدات الأساسية التي توفر أهم الخصائص صغيرةً بما يكفي لتكون معروفةً ومفهومةً جيدًا. توحيد معايير بروتوكولات خدمات الويب لا يُعَد معيارَا WSDL وSOAP بروتوكولات، وإنما معاييرٌ لتحديد البروتوكولات. لا تكفي الموافقة على استخدام معيارَي WSDL وSOAP بالنسبة للمؤسسات المختلفة المعنية بتطبيق خدمات الويب المتفاعلة مع بعضها بعضًا لتحديد بروتوكولاتها؛ إذ يجب أن توافق أيضًا على توحيد standardize بروتوكولاتٍ محددة. ويمكنك أن تتخيل مثلًا رغبة تجار التجزئة وشركات الشحن عبر الإنترنت في توحيد بروتوكولٍ يتبادلون المعلومات من خلاله، على غرار مثال تتبّع الطرد البسيط في بداية هذا القسم. يُعَد هذا التوحيد ضروريًا لدعم الأدوات، بالإضافة إلى إمكانية التشغيل البيني interoperability، ولكن يجب أن تختلف تطبيقات الشبكة المختلفة في هذه المعمارية عن صيغ الرسائل والعمليات التي تستخدمها على الأقل. يُعالَج هذا التوتر بين التوحيد القياسي والتخصيص من خلال إنشاء معاييرٍ جزئية تسمى ملفات التعريف profiles، وهي مجموعةٌ من الإرشادات التي تضيّق أو تقيّد الخيارات المتاحة في معيارَي WSDL وSOAP، والمعايير الأخرى الممكن الرجوع إليها في تعريف البروتوكول، حيث يمكن في نفس الوقت حل الغموض أو الثغرات في تلك المعايير. يضفي ملف التعريف عمليًا الطابع الرسمي على معيارٍ عملي ناشئ، ويُعرف ملف التعريف الأوسع والأكثر اعتمادًا باسم WS-I Basic Profile الذي اقترحته منظمة Web Services Interoperability Organization أو اختصارًا WS-I، وهي اتحادٌ صناعي، بينما حدّد اتحاد شبكة الويب العالمية W3C معياري WSDL وSOAP. يحل ملف التعريف الأساسي بعضًا من الخيارات الأساسية التي واجهناها في تعريف خدمة الويب، والجدير بالذكر أنه يتطلب أن يكون معيار WSDL مرتبطًا حصريًا بمعيار SOAP وأن يكون معيار SOAP مرتبطًا حصريًا ببروتوكول HTTP، إضافةً إلى وجوب استخدام طريقة HTTP POST. كما يحدد ملف التعريف أيضًا إصدارات معياري WSDL وSOAP الواجب استخدامها. يضيف ملف تعريف WS-I Basic Security Profile قيود أمانٍ إلى ملف التعريف الأساسي عن طريق تحديد كيفية استخدام طبقة SSL / TLS والمطالبة بالتوافق مع أمن خدمات الويب WS-Security؛ الذي يحدد كيفية استخدام العديد من التقنيات الموجودة، مثل شهادات المفتاح العام لتقنية X.509 ونظام كيربيروس لتوفير ميزات أمن بروتوكولات معيار SOAP. أمن WS-Security هو أول مجموعةٍ متناميةٍ من المعايير التي بمستوى معيار SOAP، والتي وضعها الاتحاد الصناعي للنهوض بمعايير المعلومات المنظَّمة Organization for the Advancement of Structured Information Standards أو اختصارًا OASIS، حيث تتضمن المعايير المعروفة مجتمعةً باسم WS-* الوثوقية WS-Reliability وإرسال الرسائل الموثوق WS-ConfidenceMessaging، والتنسيق WS-Coordination، والمعامَلات الذرية الصغيرة WS-AtomicTransaction. بروتوكول التطبيق المعمم مثل بروتوكول REST تعتمد معمارية خدمات الويب WSDL / SOAP على افتراض أن أفضل طريقةٍ لدمج التطبيقات عبر الشبكات هي عن طريق البروتوكولات المخصَّصة لكل تطبيق، حيث صُمِّمت هذه المعمارية لتحديد وتطبيق كل تلك البروتوكولات عمليًا؛ بينما تعتمد معمارية خدمات الويب REST على افتراض أن أفضل طريقة لدمج التطبيقات عبر الشبكات هي عن طريق إعادة تطبيق النموذج الأساسي لمعمارية الويب العالمية. يُعرف هذا النموذج الذي صاغه مهندس الويب روي فيلدينغ Roy Fielding، باسم نقل الحالة التمثيلية REpresentational State Transfer أو اختصارًا REST. ليست هناك حاجةً إلى معمارية REST جديدة لخدمات الويب، لأن المعمارية الحالية كافية، على الرغم من أن بعض الإضافات قد تكون ضرورية، وتُعَد خدمات الويب في معمارية الويب بمثابة موارد تحدّدها معرّفات URI، ويجري الوصول إليها عبر بروتوكول HTTP، وهو بروتوكول تطبيقات مُعمّمِة generic مع نظام عنونة معمّم. يملك معيار WSDL عملياتٍ يعرّفها المستخدم، بينما يستخدم معيار REST مجموعةً صغيرةً من طرق بروتوكول HTTP المتاحة، مثل عمليتي GET وPOST. إذًا كيف يمكن لهذه الأساليب البسيطة توفير واجهةٍ لخدمة ويب غنية؟ من خلال استخدام نموذج REST، حيث يُحوَّل التعقيد من البروتوكول إلى الحمولة payload التي هي تمثيلٌ لحالة المورد المجرَّد، حيث يمكن لعملية GET أن تعيد تمثيلًا لحالة المورد الحالية، كما يمكن لعملية POST إرسال تمثيلٍ لحالة المورد المرغوبة على سبيل المثال. تمثيل حالة المورد مجردٌ؛ أي لا يحتاج إلى أن يشبه كيفية تطبيق المورد فعليًا بواسطة نسخة خدمة ويب معينة، وليس من الضروري إرسال حالة مواردٍ كاملة في كل رسالة. يمكن تقليل حجم الرسائل عن طريق نقل أجزاء الحالة التي تهمنا فقط مثل الأجزاء المعدَّلة فقط. تشترك خدمات الويب في بروتوكولٍ وحيز عناوين مع موارد الويب الأخرى، لذلك يمكن تمرير أجزاءٍ من الحالات عن طريق دليلٍ معرّف URI حتى عند استخدام خدمات ويب أخرى. يُفضَّل تلخيص هذا النهج على أنه أسلوبٌ موجَّهٌ بالبيانات أو أسلوب تمرير مستندات بدلًا من عدّه أسلوبًا إجرائيًا، ويتألف تحديد بروتوكول التطبيق في هذه المعمارية من تحديد بنية المستند أي تمثيل الحالة. تُعَد لغة XML ولغة ترميز الكائنات باستعمال جافاسكربت JavaScript Object Notation أو اختصارًا JSON ذات الوزن الخفيف، من أكثر لغات العرض استخدامًا لهذه الحالة. وتعتمد إمكانية التشغيل البيني على الاتفاق بين خدمة الويب وعملائها على تمثيل الحالة، ويُطبَّق بالطبع نفس الشيء في معمارية SOAP؛ حيث يجب أن تكون خدمة الويب وعميلها متفقين على صيغة الحمولة، ويتمثل الفرق بينهما في اعتماد التشغيل البيني أيضًا في معمارية SOAP على الاتفاق على البروتوكول؛ أما في معمارية REST، يكون البروتوكول دائمًا هو بروتوكول HTTP، لذلك تتخلّص من مصدر مشاكل التشغيل البيني. تتمثل إحدى ميزات ترويج معيار REST في تعزيز البنية التحتية التي نُشرت لدعم الويب، حيث يمكن لوكلاء الويب مثلًا فرض الأمن أو تخزين المعلومات في ذاكرةٍ مخبئية، واستخدام شبكات توزيع المحتوى CDN الموجودة لدعم تطبيقات RESTful. كان لدى الويب وقتٌ لاستقرار المعايير وإثبات أنها تتّسع جيدًا على النقيض من معمارية WSDL / SOAP، كما أنه يأتي مع بعض الأمن على هيئة Secure Socket Layer / Transport Layer Security أو اختصارًا SSL / TLS، وقد يكون للويب ومعيار REST أيضًا ميزةً في قابلية التطور. أُتُعَد طرُ عمل معيارَي WSDL وSOAP مرنةً للغاية فيما يتعلق بالميزات والارتباطات الجديدة التي يمكن أن تدخل في تعريف البروتوكول، ولكن تختفي هذه المرونة بمجرد تعريف البروتوكول. لقد صُمِّمت البروتوكولات المعيارية مثل بروتوكولHTTP مع توفير التوسع بطريقةٍ متوافقة مع الإصدارات السابقة، حيث تأخذ قابلية توسع بروتوكول HTTP الخاصة نموذج ترويساتٍ وطرقٍ جديدة وأنواع محتوى جديدة، لكن يحتاج مصممو البروتوكول الذين يستخدمون معمارية WSDL / SOAP إلى تصميم قابلية التوسع هذه في كل من البروتوكولات المخصَّصة لهم، ويجب على مصممي تمثيلات الحالة في معمارية REST أيضًا التصميم من أجل قابلية التطور. من المجالات التي قد يكون فيها وجود معيار WSDL / SOAP ميزةً، هو مجال تكييف أو تغليف التطبيقات القديمة المكتوبة مسبقًا، لتتوافق مع خدمات الويب. تُعَد هذه نقطةً مهمة، لأن معظم خدمات الويب ستعتمد على التطبيقات القديمة في المستقبل القريب على الأقل، حيث تحتوي هذه التطبيقات عادةً على واجهةٍ إجرائية ترتبط مع عمليات معيار WSDL بصورةٍ أسهل من ارتباطها مع حالات معيار REST. قد تتوقف منافسة معيار REST ومعيار WSDL / SOAP على مدى سهولة أو صعوبة ابتكار واجهاتٍ بأسلوب REST لكل خدمة ويب، وقد نجد أن بعض خدمات الويب مُقدَّمةٌ بصورةٍ أفضل بواسطة معيار WSDL / SOAP والبعض الآخر أفضلُ بواسطة معيار REST. لقد كان البيع بالتجزئة عبر الإنترنت في أمازون من أوائل المتبنين لخدمات الويب في عام 2002، حيث أتاحت أمازون نظامها للجميع باستخدام كلٍّ من معماريتَي خدمات الويب، ولكن يستخدم غالبية المطورين واجهة REST وفقًا لبعض التقارير. من خدمات الويب إلى الخدمات السحابية إذا كانت خدمات الويب هي أن يرسل خادم الويب الذي ينفّذ تطبيقي طلبًا إلى خادم الويب الذي ينفّذ تطبيقك، فماذا نسمّي الخدمات التي نستخدمها لوضع تطبيقاتنا في السحابة لتصبح قابلةً للتطوير؟ يمكننا أن نطلق عليهما الخدمات السحابية Cloud Services إذا أردنا ذلك، ولكن هل هذا تمييزٌ فقط بدون فوارقٍ بينهما؟ الإجابة هي أنه الأمر يتوقف على عدّة أشياء. يؤدي نقل عملية خادمٍ من جهازٍ حقيقي يعمل في غرفتك إلى جهازٍ افتراضي يعمل في مركز بيانات مزود السحابة، إلى نقل مسؤولية الحفاظ على تشغيل الجهاز من مسؤول النظام إلى فريق عمليات مزود السحابة، ولكن التطبيق لا يزال مُصممًا وفقًا لمعمارية خدمات الويب؛ أما إذا صُمِّم التطبيق من البداية لتشغيله على نظامٍ سحابيٍ أساسي قابلٍ للتطوير من خلال الالتزام بمعمارية الخدمات الصغيرة micro-services architecture على سبيل المثال، فإننا نقول أن التطبيق سحابيٌ أصلي cloud native، لذا فإن الفارق المهم هو بين الخدمات السحابية الأصلية مقابل خدمات الويب القديمة المنتشرة في السحابة. من الصعب الإعلان بصورةٍ قاطعة عن تفوق الخدمات الصغيرة على خدمات الويب، إلا أن الاتجاه الحالي في الصناعة يفضّل بالتأكيد الخدمات الصغيرة. والأمر الأهم هنا هو النقاش الدائر حول استخدام آلية REST + Json مقابل آلية gRPC + Protbufs على أنها آلية RPC المفضلة لتطبيق الخدمات الصغيرة، مع الأخذ في الحسبان أن كليهما يعملان على ترويسة HTTP. ترجمة -وبتصرّف- للقسم Traditional Applications من فصل Applications من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا تطبيقات الشبكات الحاسوبية: البريد الإلكتروني ضغط الفيديو والصوت في شبكات طرف إلى طرف الحاسوبية بيانات الوسائط المتعددة في شبكات طرف إلى طرف الحاسوبية
-
سنتعلم من خلال هذا المقال كيفية رسم حافظة ورقية باستخدام الأدوات الأساسية وتقنيات إنشاء الأشكال المتجهة vector وبعض تأثيرات إليستريتور Adobe Illustrator. إنشاء مستند جديد شغّل برنامج الإليستريتور ثم اضغط على الاختصار Ctrl + N لإنشاء مستند جديد، بعدها حدّد خيار البكسلات Pixels من قائمة الوحدات Units، وأدخِل القيمة 714 في خانة العرض width والقيمة 700 في خانة الارتفاع height، ثم انقر على زر خيارات متقدمة Advanced. حدّد نمط الألوان RGB والخيار Screen (72ppi)، وتأكّد من إلغاء تحديد مربع محاذاة الكائنات الجديدة إلى شبكة البكسلات Align New Objects to Pixel Grid قبل النقر على موافق OK. إنشاء حامل الأوراق اختر أداة المستطيل ذي الزوايا المستديرة Rounded Rectangle من لوحة الأدوات Tools، ثم انقر على لوحة الرسم لتظهر نافذة Rounded Rectangle، ثم أدخِل البيانات الموضَّحة أدناه وانقر على موافق OK. تأكّد من أن المستطيل الذي أنشأناه للتو لا يزال محدَّدًا وانتقل إلى قائمة كائن Object ثم مسار Path ثم إزاحة المسار Offset Path، وأدخِل إزاحةً بمقدار -5 بكسل وانقر على موافق OK، ثم استبدل لون حدّ stroke المستطيل الحالي الذي أنشأناه للتو باللون الأحمر. حدّد المستطيل الأسود الذي أنشأناه في الخطوة رقم 2، وأزِل حدّه واملأه بالتدرج اللوني الخطي linear gradient الموضَّح أدناه، بعدها أنشِئ نسخةً من المستطيل الناتج (بالضغط على Ctrl + C ثم Ctrl + F)، ثم استبدل لون تعبئة هذه النسخة الحالي باللون الأزرق الداكن (# 216b9d). أبقِ المستطيل الناتج محدَّدًا وانتقل إلى قائمة تأثير Effect ثمStylize، ثم Feather، وأدخِل نصف قطر Radius بمقدار 8 بكسلات وانقر على موافق. حدّد المستطيل الأحمر الذي أنشأناه في الخطوة رقم 2 واستبدل لون الحدّ الحالي باللون البرتقالي الفاتح (# e0c4a1). أبقِ المستطيل محدَّدًا وافتح لوحة Stroke (من قائمة Window ثم اختر Stroke). بعد ذلك حدّد مربع اختيار الخط المتقطع Dashed Line، ثم أدخِل القيمة 5 بكسلات في خانة dash. أبقِ المستطيل الناتج محدَّدًا وانتقل إلى قائمة تأثير Effect ثم Stylize، ثم ظل ساقط Drop Shadow، واتبع البيانات الموضَّحة ادناه وانقر على موافق OK. حدّد الشكل الأول الذي أنشأناه في الخطوة رقم 3 وانتقل إلى قائمة تأثير Effect ثم Stylize، ثم ظل ساقط Drop Shadow، واتبع البيانات الموضَّحة أدناه وانقر على موافق OK. استخدم أداة الخط Line Segment (باستخدام الاختصار \) لإنشاء خط أفقي بطول 350 بكسلًا بحد بمقدار 2 بكسل وبلون أحمر داكن (# 231f20) وبلا تعبئة، ثم ضع هذا الخط في الموضع الصحيح كما هو موضّح أدناه. أبقِ هذا الخط محدَّدًا وانتقل إلى قائمة تأثير Effect ثم ضابية Blur، ثم Gaussian Blur، وأدخِل نصف قطر بمقدار 2 بكسل، مع النقر على موافق، بعد ذلك أرسِل الخط الناتج إلى الخلف، وذلك باستخدام الاختصار Ctrl + Shift + Left Square Bracket. حدّد كل الكائنات التي أنشأناها من بداية الخطوة رقم 2 إلى الخطوة الحالية وجمّعها (باستخدام الاختصار Ctrl + G)، وبهذا يكون حامل الأوراق قد أصبح جاهزًا، حيث يجب أن يبدو كما يلي: إنشاء صفحات الأوراق البيضاء استخدم أداة المستطيل Rectangle (باستخدام الاختصار M) وأنشئ مستطيلًا باللون الأسود أبعاده 310×380 بكسل. أبقِ المستطيل الذي أنشأناه للتو محدَّدًا وانقر نقرًا مزدوجًا على أيقونة أداة التدوير Rotate من لوحة الأدوات، ثم أدخِل زاوية مقدارها 1.5 درجة وانقر على نسخ Copy، ثم استبدل لون حد هذه النسخة الحالي باللون الأحمر. حدّد المستطيل الأسود الذي أنشأناه في الخطوة رقم 1 من هذه الجزئية، وأزل حدّه واملأه بالتدرج اللوني الخطي الموضَّح أدناه. حدّد المستطيل الناتج وانتقل إلى قائمة تأثير Effect ثم Stylize، ثم Drop Shadow، واتبع البيانات الموضَّحة أدناه، ثم انقر على موافق OK. لننتقل الآن لإنشاء زاوية الصفحة المطوية. استخدم أداة القلم Pen (باستخدام الاختصار P) لإنشاء كائن أسود كما في الشكل الآتي، واستخدم أداة التحديد المباشر Direct Selection (باستخدام الاختصار A) مع مفتاح Shift لتحديد ثلاث نقاط ارتكاز من الكائن الأسود ملوَّنة باللون الأزرق، ثم انقر على أيقونة "تحويل نقاط الارتكاز المحدَّدة إلى سلِسة Convert selected anchor points to smooth" من شريط الخصائص Properties، حيث يجب أن يبدو الكائن الناتج مثل الشكل أدناه. اختر أداة تحويل نقطة الارتكاز Convert Anchor Point (باستخدام الاختصار Shift + C)، ثم انقر على المقبض العلوي لنقطة ارتكاز الكائن الأسود العلوية، ثم اضغط بالفأرة واسحبه للأسفل. انقر بعد ذلك على المقبض الآخر لنقطة الارتكاز العلوية، واضغط بالفأرة واسحبه إلى اليمين. ركّز على الصورة الثالثة الآتية، وانقر على المقبض العلوي لنقطة الارتكاز السفلية، ثم اسحبه إلى اليسار باستخدام أداة تحويل نقطة الارتكاز Convert Anchor Point، ثم حدّد المقبض الآخر لنقطة الارتكاز السفلية واسحبه للأعلى. أعِد تحديد شكل الكائن الأسود بعد أن تنتهي من ضبطه، وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F)، ثم استبدل لون حد النسخة الحالي باللون الأزرق. استخدم أداة التحديد المباشر A لتحديد نقطة الارتكاز المميزة باللون الأرجواني، واسحب الفأرة إلى اتجاه السهم. حدّد المقبض الأطول لنقطة الارتكاز العلوية المميزة باللون الأرجواني باستخدام أداة التحديد المباشر واسحبه إلى اليسار، ثم حدّد المقبض الأطول لنقطة الارتكاز السفلية المميزة باللون الأرجواني واسحبه للأسفل. يجب أن يبدو الكائن الناتج مثل الشكل الثاني أدناه. حدّد المستطيل الأحمر الذي أنشأناه في الخطوة رقم 7، وأنشئ نسخةً منه باستخدام Ctrl + C ثم Ctrl + F، ثم استبدل لون حد النسخة الحالي باللون الأرجواني. أبقِ المستطيل الأرجواني محدّدًا، واستمر في الضغط على مفتاح Shift ثم انقر على الكائن الأزرق الذي أنشأناه في الخطوة السابقة. افتح لوحة مستكشف المسار Pathfinder من قائمة نوافذ Window ثم مستكشف المسار Pathfinder، وانقر على زر Minus Front. يجب أن يبدو الكائن الناتج مثل الشكل الثالث أدناه. حدّد المستطيل الأحمر ثم اختر أداة القطّارة Eyedropper (باستخدام الاختصار I)، وانقر على المستطيل الذي طبّقنا عليه تأثير الظل في الخطوة رقم 8، مما يؤدي إلى أخذ عينات من جميع سمات مظهر هذا المستطيل وتطبيقها على المستطيل الأحمر. حدّد الكائن الأرجواني الذي أنشأناه في الخطوة رقم 12، وأزِل حدّه واملأه بالتدرج اللوني الخطي الموضَّح أدناه. حدّد الشكل الأخير الذي أنشأناه في الخطوة السابقة وأنشئ نسخةً منه (بالضغط على Ctrl + C ثم Ctrl + F). أبقِ هذه النسخة محدَّدةً وانتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، واتبع البيانات الموضّحة في الشكل الأول أدناه وانقر على موافق OK. حدّد الشكل الأول الذي أنشأناه في الخطوة 7 وأنشئ نسخةً منه، ثم أحضر النسخة إلى الأمام، وذلك باستخدام الاختصار Ctrl + Shift + Right Square Bracket. أبقِ هذه النسخة محدَّدة، ثم استمر في الضغط على مفتاح Shift، وانقر على الشكل الذي طبّقنا عليه تأثير الظل في الخطوة الحالية. انقر بزر الفأرة الأيمن على لوحة الرسم ثم حدّد خيار إنشاء قناع قطع Make Clipping Mask من القائمة. أخفِ مجموعة القطع خلف الشكل الأخير الذي أنشأناه في الخطوة رقم 7. حدد الكائن الأسود الذي أنشأناه في الخطوة رقم 4، وأزِل حدّه واملأه بالتدرج اللوني الخطي الموضّح في الشكل الأول أدناه، وبذلك ننتهي من صفحات الأوراق البيضاء. ضع الصفحات الورقية في حامل الأوراق كما يلي: اختر أداة الكتابة Type Tool (باستخدام الاختصار T)، وافتح لوحة Character (من قائمة نوافذ Window ثم Type ثمCharacter)، واستخدم البيانات الموضَّحة أدناه. انقر بعد ذلك على لوحة الرسم وأضِف النص "To do list"، ثم اضبط لونه على اللون البنفسجي المائل إلى الرمادي الغامق (# 414042)، ثم ضع هذا النص في الصفحات البيضاء. استخدم أداة القلم (P) لإنشاء أربعة خطوط أفقية لها حد أحمر داكن (# 231f20) وبلا تعبئة، ثم أخفِ هذه الخطوط خلف زاوية الصفحة المطوية. إنشاء المشبك المعدني اختر أداة المستطيل ذي الزوايا المستديرة Rounded Rectangle من شريط الأدوات ثم انقر على لوحة الرسم، ثم أدخِل البيانات الموضَّحة في الشكل الأول أدناه وانقر على موافق. اختر أداة المستطيل (M) وأنشئ مستطيلين أبعادهما 300×14 بكسل و300×12 بكسل، ثم ضع هذين المستطيلين في المواضع الموضَّحة في الشكل الثالث أدناه. أعِد تحديد المستطيل الأسود ذي الزوايا المستديرة الذي أنشأناه في الخطوة الحالية، وأنشئ نسختين منه (باستخدام Ctrl + C ثم Ctrl + F ثم Ctrl + F). وأبقِ نسخةً من المستطيل الأسود ذي الزوايا المستديرة محدَّدةً، مع الاستمرار في الضغط على مفتاح Shift، بعدها انقر على المستطيل الأحمر، وافتح لوحة مستكشف المسار Pathfinder من قائمة نوافذ Window ثم مستكشف المسار Pathfinder، وانقر على زر التقاطع Intersect. حدد بعد ذلك النسخة الأخرى من المستطيل الأسود ذي الزوايا المستديرة، ثم استمر في الضغط على مفتاح Shift وانقر على المستطيل الأزرق، ثم انقر على زر التقاطع Intersect من لوحة مستكشف المسار Pathfinder. حدّد المستطيل الأسود ذي الزوايا المستديرة الذي أنشأناه في الخطوة السابقة ، وأزِل حدّه واملأه بالتدرج اللوني الخطي الموضّح في الشكل الأول الآتي. حدّد الكائنين الآخرين اللذين أنشأناهما في الخطوة 1 من هذه الجزئية، وأزل حدّهما واملأهما بالتدرجات اللونية الخطية الموضَّحة في الشكل الثاني أدناه. حدّد الشكل الأول الذي أنشأناه في الخطوة السابقة وأنشئ نسخةً منه (باستخدام Ctrl + C ثم Ctrl + F)، ثم أحضر هذه النسخة إلى الأمام (باستخدام الاختصار Ctrl + Shift + Right Square Bracket). أبقِ الكائن الذي أنشأناه للتو محدَّدًا، وبدّل بين لوني التعبئة والحد عن طريق النقر على السهم المنحني ذي الرأسين بجوار حاملَي ألوان التعبئة والحدّ في لوحة الأدوات. بعد ذلك استبدل لون الحد الحالي بتدرج خطي جديد كما هو موضّح في الشكل الأول أدناه. غيّر ثُخن حدّ الكائن الناتج إلى 2 بكسل وطبّق عليه الخيار Width Profile 3. ركّز على الشكل الثاني أدناه، واختر أداة إضافة نقطة ارتكاز Add Anchor Point (+)، وأضِف نقطتي ارتكاز عند النقاط المميزة باللون الأزرق، ثم حدّد نقاط الارتكاز الأربع المميزة باللون الأحمر، مع النقر على أيقونة "قص المسار عند نقاط الارتكاز المحدَّدة Cut path at selected anchor points" من شريط الخصائص، مما يؤدي إلى جعل هذا الكائن مؤلفًا من أربعة مسارات، ثم حدّد المسارين الأفقيين وأزلهما. استخدم أداة المستطيل ذي الزوايا المستديرة Rounded Rectangle لإنشاء مستطيل ذي زوايا مستديرة باللون الأزرق كما هو موضَّح في الشكل الأول أدناه. استخدم أداة التحديد المباشر (A) مع مفتاح Shift لتحديد وإزالة أربع نقاط ارتكاز مميزة باللون الأحمر، وحدّد نقطة ارتكاز الكائن الأزرق السفلية اليسرى، مع تحريكها بمقدار 35 بكسلًا إلى اليسار، ثم اختر أداة تحويل نقطة الارتكاز Convert Anchor Point (باستخدام الاختصار Shift + C)، بعد ذلك انقر على المقبض الأيسر لنقطة الارتكاز السفلية اليسرى، ثم اضغط بالفأرة واسحبه إلى اليمين أثناء الضغط على مفتاح Shift. اختر بعد ذلك أداة التحديد المباشر (A) وحدّد المقبض الأيسر لنقطة الارتكاز العلوية اليسرى واسحبه إلى اليسار. لا تنسَ الاستمرار في الضغط على مفتاح Shift من لوحة المفاتيح للسحب السويّ. أعِد تحديد الكائن الأزرق الذي أنشأناه في الخطوة السابقة وانقر نقرًا مزدوجًا على أيقونة أداة الانعكاس Reflect Tool من لوحة الأدوات، ثم حدّد الخيار رأسي Vertical وانقر على نسخ Copy، ثم حرّك الكائن الذي أنشأناه للتو بمقدار 32 بكسلًا إلى اليمين. حدد الآن الكائنين الأزرقين اللذين أنشأناهما من بداية الخطوة رقم 4 من هذه الجزئية إلى الخطوة الحالية، ثم افتح لوحة مستكشف المسار Pathfinder (من قائمة نوافذ Window ثم مستكشف المسار Pathfinder)، وانقر على زر دمج Unite، ثم ضع الكائن الناتج في الموضع الصحيح الموضّح أدناه. اختر أداة الدائرة Ellipse Tool (باستخدام الاختصار L) وأنشئ شكلًا دائريًا أرجوانيًا أبعاده 45×45 بكسل. أبقِ هذه الدائرة محدَّدة واستمر في الضغط على مفتاح Shift ثم انقر على الكائن الأزرق الذي أنشأناه في الخطوة رقم 23. حرّر مفتاح Shift وانقر على الكائن الأزرق مرة أخرى (لتثبيت موضعه)، ثم افتح لوحة محاذاة Align من قائمة Window ثم Align، وانقر على زر المحاذاة المركزية أفقيًا Horizontal Align Center، ثم على زر المحاذاة العلوية رأسيًا Vertical Align Top. أعِد تحديد الدائرة الأرجوانية وحرّكها بمقدار 25 بكسلًا للأعلى، ثم انتقل إلى قائمة كائن Object ثم مسار Path ثم إزاحة المسار Offset Path، ثم أدخِل إزاحةً قدرها -14 بكسل وانقر على موافق، وحدّد الشكل الدائري الأرجواني الأكبر والكائن الأزرق، ثم افتح لوحة مستكشف المسار Pathfinder (من قائمة Window ثم Pathfinder) وانقر على زر الدمج Unite. حدد الكائن الأزرق الذي أنشأناه في الخطوة السابقة، وانتقل إلى قائمة Object ثم Path ثم Offset Path، بعدها أدخِل إزاحةً مقدارها -2 بكسل وانقر على موافق، ثم استبدل لون حدّ الكائن الذي أنشأناه للتو الحالي باللون الأحمر. اختر أداة إضافة نقطة ارتكاز Add Anchor Point (+) وانقر على النقاط الست المميزة باللون الأسود، مما يؤدي إلى إضافة ست نقاط ارتكاز جديدة للكائن الأحمر. استخدم أداة التحديد المباشر (A) ومفتاح Shift لتحديد النقاط الست التي أضفناها للتو، ثم انقر على أيقونة "قص المسار عند نقاط الارتكاز المحدَّدة Cut path at selected anchor points" من شريط الخصائص، مما يجعل الكائن الأحمر مؤلفًا من ستة مسارات. حدّد المسارات الثلاثة الموضَّحة في الشكل الأخير أدناه ثم أزِلها. حدّد الكائن الأزرق والدائرة الأرجوانية، ثم أنشئ نسخةً منهما باستخدام Ctrl + C ثم Ctrl + F. أبقِ هذه النسخ محدَّدةً، ثم افتح لوحة مستكشف المسار Pathfinder باستخدام قائمة Window ثم Pathfinder، وانقر على زر Minus Front. حدّد الكائن الناتج، ثم أزِل حدّه واملأه بالتدرج اللوني الخطي الموضَّح أدناه، ثم أرسِل الشكل الناتج للخلف باستخدام الاختصار Ctrl + Shift + Left Square Bracket. حدد الدائرة الأرجوانية وغيّر ثُخن حدّها إلى 2 بكسل، ثم استبدل لون الحد الحالي بالتدرج اللوني الخطي الموضّح أدناه ضمن الحد. حدّد نقطتي ارتكاز الكائن الأزرق المميزتين باللون الأسود، ثم انقر على أيقونة "قص المسار عند نقاط الارتكاز المحدَّدة Cut path at selected anchor points" من شريط الخصائص، مما يجعل الكائن الأزرق مؤلفًا من مسارين. حدّد المسار الأفقي وأزله، ثم حدّد المسار الأزرق الآخر وغيّر ثُخن حدّه إلى 2 بكسل، واملأه بالتدرج اللوني الخطي الموضّح أدناه ضمن الحد. حدّد المسارات الثلاثة الحمراء، واستبدل لون الحد الحالي باللون الأبيض (#ffffff)، ثم طبّق الخيار Width Profile 1 على المسارات الناتجة. أعِد تحديد المسار المنحني كما هو موضح في الصورة الأخيرة أدناه وغيّر ثُخن الحد إلى 2 بكسل. يمكنك إعطاء مظهر أكثر واقعية من خلال إضافة الظلال على بعض الأماكن الرئيسية. حدّد الشكل الذي أنشأناه في الخطوة رقم 8 من هذه الجزئية، وانتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، واتبع البيانات الموضَّحة في الشكل الأول أدناه، وانقر على موافق OK. حدّد الشكل الأول الذي أنشأناه في الخطوة رقم 2 من هذه الجزئية، وطبّق تأثير الظل كما هو موضَّح في الشكل الثاني أدناه. استخدم أداة الخط Line Segment Tool (\) لإنشاء خط أفقي بطول 244 بكسلًا وبحدٍّ أحمر داكن (#231f20) مقداره 3 بكسلات وبلا تعبئة، ثم ضع هذا الخط في الموضع الصحيح الموضَّح في الشكل الثالث أدناه. أخيرًا، طبّق تأثير Gaussian Blur بمقدار 3 بكسلات على الخط الذي أنشأناه للتو، ثم أخفِ الخط الناتج خلف المشبك المعدني. حدّد كل الكائنات التي أنشأناها من بداية الخطوة الأولى إلى الخطوة الحالية وجمّعها (باستخدام الاختصار Ctrl + G)، وبذلك نكون قد انتهينا من المشبك المعدني. ضع هذا المشبك في الموضع الذي تراه في الشكل التالي: استخدم أداة المستطيل Rectangle Tool (باستخدام الاختصار M) وأداة التدرج اللوني Gradient Tool (باستخدام الاختصار G) لإنشاء مستطيل أزرق مائل إلى الرمادي أبعاده 714×700 بكسل كما هو موضح أدناه، ثم ضع الحافظة الورقية في الخلفية التي أنشأناها للتو. وبذلك أصبح كل شيء جاهزًا. ترجمة -وبتصرّف- للمقال Create a Clipboard in Adobe Illustrator لصاحبه Bao Nguyen. اقرأ أيضًا مقدمة إلى برنامج أدوبي إليستريتور Adobe Illustrator والتعرف على واجهته كيفية رسم شخصية القطة السوداء المخيفة باستخدام إليستريتور كيفية رسم شخصية الكنغر الملاكم باستخدام إليستريتور إنشاء ساعة كاسيو Casio في الإليستريتور كيفية تصميم قبعة ساحر باستخدام برنامج Adobe Illustrator
-
تُعَدّ القيود Constraints ميزةً مهمةً جدًا في النموذج العلائقي relational model الذي يدعم نظريةً محددةً للقيود المُطبَّقة على السِمات attributes أو الجداول tables، كما تُعَدّ هذه القيود مفيدةً بسبب سماحها لمصمم قواعد البيانات بتحديد دلالات semantics البيانات، فهذه القيود هي القواعد التي تجبر نظم إدارة قواعد البيانات Database management systems -أو DBMSs اختصارًا- على التحقق من توافق البيانات مع هذه الدلالات. سلامة النطاق Domain Integrity يُعَدّ النطاق قيدًا من قيود النموذج العلائقي، حيث يُقيّد قيم السمات في العلاقة، لكن هناك دلالات واقعية للبيانات التي لا يمكن تحديدها إذا اُستخدِمت مع قيود النطاق فقط، لذلك نحتاج إلى طرقٍ أكثر تحديدًا لبيان قيم البيانات المسموح بها أو غير المسموح بها والتنسيق المناسب لكل سمة، فمثلًا، يجب أن يكون معرّف الموظف Employee ID -أو EID اختصارًا- في قاعدة البيانات فريدًا، أو يجب أن يكون تاريخ ميلاد الموظف Birthdate ضمن المجال [Jan 1, 1950, Jan 1, 2000]، حيث توفَّر هذه المعلومات ضمن تعليمات منطقية تسمى قيود السلامة integrity constraints، ويوجد عدة أنواع من قيود السلامة كما هو موضَّح أدناه. سلامة الكيان Entity integrity يجب احتواء كل جدول على مفتاح رئيسي primary key لضمان سلامة الكيان، ولا يمكن احتواء المفتاح الرئيسي PK أو أي جزء منه على قيم فارغة null، حيث لا يمكننا تحديد بعض الصفوف rows عندما تكون قيم المفتاح الرئيسي فارغة، فمثلًا، لا يمكن أن يكون الهاتف Phone في جدول الموظف EMPLOYEE مفتاحًا رئيسيًا نظرًا لعدم امتلاك بعض الأشخاص أيّ هاتف. السلامة المرجعية Referential integrity تتطلب السلامة المرجعية وجود مفتاح رئيسي مقابل للمفتاح الخارجي foreign key، وإلا فيجب أن يكون فارغًا. يُحدَّد هذا القيد بين جدولين أي الجدول الأب والجدول الابن؛ حيث يحافِظ على المطابقة بين الصفوف في هذين الجدولَين، وهذا يعني أن المرجع من صفٍ في جدول إلى جدول آخر يجب أن يكون صالحًا، وفيما يلي مثال على قيود السلامة المرجعية في قاعدة بيانات العملاء/الطلبات Customer/Order الخاصة بالشركة Company: جدول العميل Customer يحوي الحقلين التاليين: CustID رقم العميل. CustName اسم العميل. جدول الطلب Order يحوي الحقول التالية: OrderID رقم الطلب. CustID رقم العميل. Date تاريخ الطلب. يجب فرض السلامة المرجعية لضمان عدم وجود سجلات معزولة أو يتيمة orphan records، فالسجل المعزول هو السجل الذي تكون قيمة مفتاحه الخارجي FK غير موجودة في الكيان المقابل -أي الكيان الذي يحوي المفتاح الرئيسي PK، وتذكّر أنّ عملية الضم join تكون بين المفتاحَين الرئيسي PK والخارجي FK. ينص قيد السلامة المرجعية في المثال السابق على وجوب تطابق CustID في جدول الطلبات Order مع CustID صالح في جدول العملاء Customer. تملك معظم قواعد البيانات العلائقية سلامة مرجعية تصريحية declarative referential integrity، أي يجري إعداد قيود السلامة المرجعية عند إنشاء الجداول. وفيما يلي مثال آخر على قاعدة بيانات صفوف دراسية/مقرَّرات Course/Class: جدول الدورة التدريبية Course يحوي الحقول التالي: CrsCode رمز الدورة. DeptCode رمز القسم. Description وصف الدورة. جدول الصف Class يحوي الحقول التالية: CrsCode رمز الدورة. Section القسم. ClassTime وقت الصف. ينص قيد السلامة المرجعية هنا على وجوب تطابق المفتاح الخارجي CrsCode في جدول Class مع مفتاح رئيسي CrsCode صالح في جدول Course، حيث لا يكفي في هذه الحالة أن تشكِّل السمتان CrsCode و Section في جدول Class المفتاح الرئيسي PK، إذ يجب علينا فرض السلامة المرجعية أيضًا. يجب امتلاك المفتاح الرئيسي PK والمفتاح الخارجي FK أنواع البيانات نفسها، كما يجب أن يأتيا من نفس النطاق عند إعداد السلامة المرجعية، وإلا فلن يسمح نظام إدارة قاعدة البيانات العلائقية RDBMS بعملية الضم join. يُعَدّ نظام RDBMS نظام قاعدة بيانات شائع، حيث يعتمد على النموذج العلائقي الذي قدمه إدجار كود E.F. Codd من مختبر أبحاث سان خوسيه San Jose التابع لشركة IBM، كما تُعَدّ أنظمة قواعد البيانات العلائقية أسهل في الاستخدام والفهم من أنظمة قواعد البيانات الأخرى. السلامة المرجعية في نظام مايكروسوفت أكسس Microsoft Access يجري إعداد السلامة المرجعية في نظام مايكروسوفت أكسس MS Acces من خلال ضم المفتاح الرئيسي PK الذي هو معرّف العميل CustID في جدول العملاء إلى معرّف العميل CustID في جدول الطلبات Order، ويوضِّح الشكل التالي طريقة عمل ذلك على شاشة تحرير العلاقات Edit Relationships في نظام مايكروسوفت أكسس: السلامة المرجعية باستخدام الإصدار Transact-SQL من لغة SQL تُضبَط السلامة المرجعية في الإصدار Transact-SQL (اختصارها T-SQL) المستخدمة في خادم MS SQL Server عند إنشاء جدول الطلبات Order باستخدام المفتاح الخارجي FK، حيث تُظهِر التعليمات المدرجة أدناه المفتاح الخارجي FK في جدول الطلبات Order الذي يكون مرجعًا إلى المفتاح الرئيسي PK في جدول العملاء Customer: CREATE TABLE Customer ( CustID INTEGER PRIMARY KEY, CustName CHAR(35) ) CREATE TABLE Orders ( OrderID INTEGER PRIMARY KEY, CustID INTEGER REFERENCES Customer(CustID), OrderDate DATETIME ) قواعد المفاتيح الخارجية يمكن إضافة قواعد مفاتيح خارجية إضافية عند ضبط السلامة المرجعية مثل ما نفعله بالصفوف الأبناء -في جدول Orders- عندما يُحذَف أو يُغيَّر -أي يُحدَّث- السجل وهو جزء من الجدول الأب -Customer- والذي يملك مفتاحًا رئيسيًا PK، فمثلًا، تَعرض نافذة تحرير العلاقات في MS Access في الشكل السابق خيارين إضافيين لقواعد المفتاح الخارجي FK، هما: التحديث المتسلسل أو التعاقبي Cascade Update، والحذف المتسلسل Cascade Delete، فإذا لم يُحدَّد هذان الخياران، فسيمنع النظام حذف أو تحديث قيم المفتاح الرئيسي PK في جدول الأب -أي جدول العملاء Customer- في حالة وجود سجل ابن، فالسجل الابن هو أي سجل مع مفتاح رئيسي PK مطابق. يوجد خيار إضافي في بعض قواعد البيانات عند تحديد خيار الحذف ويسمى Set to Null، حيث يُحذَف صف المفتاح الرئيسي PK في هذا الاختيار، ولكن يُضبَط المفتاح الخارجي FK في الجدول الابن على القيمة الفارغة NULL، فعلى الرغم من أنّ هذا يؤدي إلى إنشاء صف يتيم، إلا أنه أمر مقبول. قيود المؤسسة Enterprise Constraints يشار إلى قيود المؤسسة أحيانًا بالقيود الدلالية semantic constraints، وهي قواعد إضافية يحددها المستخدمون أو مسؤولو قاعدة البيانات، كما يمكنها الاستناد إلى جداول متعددة، وفيما يلي بعض الأمثلة عنها: يمكن للصف الدراسي class ضم ثلاثين طالبًا على أساس حد أقصى. يمكن للمدرّس teacher تدريس أربعة صفوف في الفصل الواحد على أساس حد أقصى. لا يمكن للموظف employee المشاركة في أكثر من خمسة مشاريع. لا يمكن لراتب الموظف تجاوز راتب مديره. قواعد العمل Business Rules نحصل على قواعد العمل من المستخدِمين عند جمع المتطلبات gathering requirements، كما تُعَدّ عملية جمع المتطلبات عمليةً مهمةً للغاية، ويجب على المستخدِم أن يتحقق من نتائجها قبل بناء تصميم قاعدة البيانات، فإذا كانت قواعد العمل غير صحيحة، فسيكون التصميم غير صحيح، وفي النهاية لن يعمل التطبيق على النحو الذي توقّعه المستخدِمون، وفيما يلي بعض الأمثلة عن قواعد العمل، وهي: يمكن للمدرّس تدريس طلاب متعددين. يمكن للصف الدراسي امتلاك 35 طالبًا على أساس حد أقصى. يمكن تدريس المُقرَّر course عدة مرات، ولكن يدرِّسه مدرِّس واحد فقط. لا يدرّس جميع المدرِّسين صفوفًا دراسية. تعددية العلاقة Cardinality والارتباط connectivity تُستخدَم قواعد العمل لتحديد عددية العلاقة والارتباط، حيث تصف نعددية العلاقة Cardinality العلاقة بين جدولي بيانات من خلال التعبير عن الحد الأدنى والحد الأقصى لعدد مرات حدوث الكيان المرتبط بحدوث كيانٍ آخر ذي صلة، ويمكّنك الشكل التالي من رؤية أن عددية العلاقة ممثَّلة من خلال العلامات الداخلية على رمز العلاقة، حيث تكون درجة العلاقة Cardinality هي 0 على اليمين و1 على اليسار. يمثل الرمز الخارجي لرمز العلاقة الارتباط Connectivity بين الجدولين، فالارتباط هو العلاقة بين جدولين مثل علاقة واحد إلى واحد one to one، أو واحد إلى متعدد one to many؛ والمرة الوحيدة التي يكون فيها الارتباط صفرًا هي عندما يكون للمفتاح الخارجي FK قيمة فارغة null. يوجد ثلاثة خيارات للعلاقة بين هذه الكيانات عندما يتعلق الأمر بالمشاركة، وهي: 0، أو 1، أو متعدد many، فمثلًا، قيمة الارتباط Connectivity هي 1 في الشكل السابق على الجانب الخارجي الأيسر من هذا الخط، ومتعدد على الجانب الخارجي الأيمن. يظهر الشكل التالي الرمز الذي يمثل علاقة واحد إلى متعدد one to many: يعرض الشكل الآتي كلًا من العلامات الداخلية -التي تمثل عددية العلاقة Cardinality -والعلامات الخارجية -التي تمثل الارتباط Connectivity-، حيث يُقرأ الجانب الأيسر من هذا الرمز على أن الحد الأدنى 1 والحد الأقصى 1، بينما يُقرأ الجانب الأيمن على النحو التالي: الحد الأدنى 1 والحد الأقصى متعدد. أنواع العلاقات يشير السطر الذي يربط جدولين في مخطط الكيان والعلاقة entity relationship diagram -أو ERD اختصارًا- إلى نوع العلاقة بين الجدولين؛ فهي إما وثيقة أو معرَّفة identifying أو غير وثيقة non-identifying. العلاقة الوثيقة هي خط متصل بحيث يحتوي المفتاح الرئيسي PK على المفتاح الخارجي FK، كما يشار إلى العلاقة الغير وثيقة بخط متقطع مع عدم وجود المفتاح الخارجي FK ضمن المفتاح الرئيسي PK. العلاقات الاختيارية يمكن أن يكون للمفتاح الخارجي FK قيمةً فارغةً في العلاقة الاختيارية أو لا يحتاج الجدول الأب إلى وجود جدول ابن مطابق. يوضح الرمز المبيَّن في الشكل نوعًا مكوَّنًا من صفر وثلاث بروزات -تشير إلى متعدد- والذي يُفسَّر على أنه علاقة صفر أو متعدد zero OR many، وإذا نظرت إلى جدول الطلبات Order table على الجانب الأيمن من الشكل الآتي على سبيل المثال، فستلاحظ عدم حاجة العميل customer إلى تقديم طلب ليكون عميلًا، أي أن الجانب المتعدد اختياري، ويوضِّح الشكل التالي المثال السابق عن كيفية استخدام رمز العلاقة الاختيارية صفر إلى متعدد zero to many: يمكن أيضًا قراءة رمز العلاقة في الشكل السابق على النحو التالي: الجانب الأيسر: يجب احتواء كيان الطلب order entity على كيان واحد مرتبط على أساس حد أدنى في جدول العميل Customer table، وكيان واحد مرتبط على أساس حد أقصى. الجانب الأيمن: يمكن للعميل عدم تقديم طلبات (أي صفر طلب) على أساس حد أدنى، أو تقديم طلبات متعددة على أساس حد أقصى. يوضِّح الشكل نوعًا آخرًا من رموز العلاقة الاختيارية بصفر وواحد، أي علاقة صفر أو واحد zero OR one، حيث جانب الواحد اختياري، ويوضِّح الشكل التالي مثالًا عن كيفية استخدام رمز العلاقة الاختيارية صفر إلى واحد zero to one: العلاقات الإلزامية Mandatory relationships يتطلب حدوث كيان واحد حدوث كيان مقابل في العلاقة الإلزامية. يُظهِر رمز هذه العلاقة علاقة واحد فقط one and only one كما هو موضح في الشكل ، أي أن الجانب واحد one side إلزامي، ويوضِّح الشكل التالي مثالًا عن كيفية استخدام رمز العلاقة الإلزامية واحد فقط one and only one: يوضِّح الشكل رمز علاقة واحد إلى متعدد one to many حيث يكون الجانب المتعدد many side إلزاميًا. ويوضِّح الشكل التالي مثالًا عن كيفية استخدام رمز العلاقة الإلزامية واحد إلى متعدد: رأينا حتى الآن أن الجانب الداخلي من رمز العلاقة الموضَّح على الجانب الأيسر من الرمز في الشكل الآتي يمكن أن يكون له تعددية العلاقة cardinality قيمتها 0 وارتباط connectivity متعدد كما هو موضَّح على الجانب الأيمن من الرمز في الشكل ، أو ارتباط قيمته واحد وهو غير موضَّح في الشكل. لا يمكن أن يكون لديه ارتباط قيمته 0، كما هو موضَّح في الشكل ، حيث يمكن أن يكون الارتباط 1 فقط. تُظهِر رموز الارتباط الحدود القصوى، فإذا أظهر رمز الارتباط على الجانب الأيسر القيمة 0، فلن يكون هناك ارتباط بين الجداول، وفيما يلي طريقة قراءة رمز العلاقة مثل الرمز الموجود في الشكل الآتي: يجب العثور على معرِّف العميل CustID في جدول الطلبات Order table وفي جدول العملاء Customer table أيضًا بحد أدنى 0 وبحد أقصى 1 مرة. تعني القيمة 0 أن معرِّف العميل CustID في جدول الطلبات Order table قد تكون قيمته فارغة null. تشير القيمة 1 الموجودة أقصى اليسار -أي قبل القيمة 0 مباشرةً التي تمثل الارتباط- إلى أنه إذا كان هناك معرِّف عميل CustID في جدول الطلبات Order table، فيمكن وجود هذا المعرِّف في جدول العملاء Customer table مرةً واحدةً فقط. يمكنك افتراض شيئين عندما ترى الرمز 0 لتعددية العلاقة cardinality: يسمح المفتاح الخارجي FK في جدول الطلبات Order table بوجود القيم الفارغة. ليس المفتاح الخارجي FK جزءًا من المفتاح الرئيسي PK، لأنه يجب ألا تحتوي المفاتيح الرئيسية على قيم فارغة null. تمارين اقرأ الوصف التالي ثم أجب عن الأسئلة: صُمِّمت قاعدة بيانات نادي السباحة في الشكل الآتي لتحتوي على معلومات حول الطلاب students المسجَلين enrolled في صفوف السباحة، حيث خُزِّنت المعلومات التالية: الطلاب students، والتسجيل enrollment، وصفوف السباحة swim classes، والمسابح pools التي تقام فيها الصفوف، ومدربو instructors صفوف السباحة، والمستويات levels المختلفة من صفوف السباحة. استخدم الشكل التالي للإجابة على الأسئلة: حُدِّدت المفاتيح الرئيسية primary keys أدناه، وعُرِّفت أنواع البيانات التالية في خادم SQL Server. **tblLevels** Level – Identity PK ClassName – text 20 – nulls are not allowed **tblPool** Pool – Identity PK PoolName – text 20 – nulls are not allowed Location – text 30 **tblStaff** StaffID – Identity PK FirstName – text 20 MiddleInitial – text 3 LastName – text 30 Suffix – text 3 Salaried – Bit PayAmount – money **tblClasses** LessonIndex – Identity PK Level – Integer FK SectionID – Integer Semester – TinyInt Days – text 20 Time – datetime (formatted for time) Pool – Integer FK Instructor – Integer FK Limit – TinyInt Enrolled – TinyInt Price – money **tblEnrollment** LessonIndex – Integer FK SID – Integer FK (LessonIndex and SID) Primary Key Status – text 30 Charged – bit AmountPaid – money DateEnrolled – datetime **tblStudents** SID – Identity PK FirstName – text 20 MiddleInitial – text 3 LastName – text 30 Suffix – text 3 Birthday – datetime LocalStreet – text 30 LocalCity – text 20 LocalPostalCode – text 6 LocalPhone – text 10 طبّق هذا المخطط في خادم SQL Server، أو باستخدام نظام access وعندها ستحتاج إلى اختيار أنواع بيانات قابلة للموازنة. اشرح قواعد العلاقة relationship rules لكل علاقة مثل العلاقة بين الجدولين tblEnrollment وtblStudents التي تمثِّل إمكانية تسجيل الطالب في صفوف سباحة متعددة. حدّد عددية cardinality كل علاقة بافتراض القواعد التالية: قد يكون أو لا يكون للمسبح pool صفًا class للسباحة. يجب ارتباط جدول المستويات levels table دائمًا بصف سباحة واحد على الأقل. قد لا يدرِّس جدول فريق التدريب staff table أيَّ صف سباحة. يجب تسجيل جميع الطلاب في صف سباحة واحد على الأقل. يجب احتواء صف السباحة على طلاب مسجلين فيه. يجب امتلاك صف السباحة على مسبح صالح. قد لا يُعيَّن مدرب لصف السباحة. يجب ارتباط صف السباحة دائمًا بمستوى موجود. حدّد الجداول الضعيفة، والجداول القوية التي شرحناها في مقالٍ سابق. حدّد الجداول المُعرَّفة identifying، والجداول غير المُعرَّفة non-identifying. ترجمة -وبتصرف- للفصل Integrity Rules and Constraints لصاحبَيه Adrienne Watt و Nelson Eng من كتاب Database Design. اقرأ أيضًا المقال التالي: نمذجة الكيان العلاقي ER عند تصميم قواعد البيانات المقال السابق: نموذج الكيان والعلاقة ER لتمثيل البيانات وتخزينها في قاعدة البيانات النسخة العربية الكاملة لكتاب تصميم قواعد البيانات خصائص قواعد البيانات والمزايا التي تقدمها
-
لقد حققت شبكة الويب العالمية نجاحًا كبيرًا وجعلت الإنترنت في متناول العديد من الأشخاص، بحيث تظهر أحيانًا أنها مرادفٌ للإنترنت. لقد بدأ تصميم النظام الذي أصبح الويب لاحقًا حوالي عام 1989، أي بعد فترةٍ طويلةٍ من انتشار الإنترنت على نطاقٍ واسع، وكان الهدف الأصلي للويب هو إيجاد طريقةٍ لتنظيم واسترجاع المعلومات بالاعتماد على أفكارٍ حول النص الترابطي hypertext، أو الوثائق المترابطة interlinked documents التي كانت موجودة منذ الستينيات على الأقل. وترجع جذور تاريخٍ قصيرٍ من الويب الذي قدّمه اتحاد شبكة الويب العالمية إلى مقالٍ صادرٍ في عام 1945 شرح الروابط بين مستندات البطاقات المجهرية التي تُعرَف بالميكروفيش microfiche. تتمحور فكرة النص الترابطي حول امكانية ربط مستندٍ بمستند آخر، وقد صُمِّم بروتوكول HTTP ولغة المستند التي هي لغة HTML لتحقيق هذا الهدف. من بين الطرق المفيدة للتفكير في الويب؛ وجود مجموعةٍ من العملاء والخوادم المتعاونة، التي تتحدث جميعها نفس اللغة، وهي بروتوكول HTTP. يُعرض الويب على معظم الأشخاص من خلال برنامج عميٍل رسومي أو متصفح ويب، مثل Safari أو Chrome أو Firefox أو Internet Explorer. يوضح الشكل التالي متصفح Safari قيد الاستخدام، ويعرض صفحة معلومات من جامعة برينستون. إذا أردت تنظيم المعلومات في نظامٍ من المستندات أو الكائنات المرتبطة، فيجب أن تكون قادرًا على استرداد مستندٍ واحدٍ للبدء، كما أن أي متصفح ويب لديه وظيفةٌ تسمح للمستخدم بالحصول على كائنٍ ما عن طريق فتح محدِّد موقع URL، حيث أصبحت محددات مواقع الموارد الموحَّدة Uniform Resource Locators أو اختصارًا URLs مألوفةً جدًا لمعظمنا، وتوفّر معلوماتٍ تسمح بتحديد موقع الكائنات على الويب، وتكون كما يلي: http://www.cs.princeton.edu/index.html إذا فتحت محدّد URL هذا، فسيفتح متصفح الويب اتصال TCP بخادم الويب على جهاز يسمى www.cs.princeton.edu، ثم يَسترد ويعرض الملف المسمّى index.html على الفور. تحتوي معظم الملفات الموجودة على الويب على صورٍ ونصوص، ويحتوي العديد منها على كائناتٍ أخرى مثل مقاطع الصوت والفيديو، وأجزاءٍ من شيفرة وغير ذلك، كما تشتمل أيضًا على محدّدات URL التي تشير إلى ملفاتٍ أخرى قد تكون موجودةً على أجهزةٍ أخرى، والتي تُعَد جوهر مصطلح النص الترابطي hypertext الموجود ضمن بروتوكول HTTP ولغة HTML. يحتوي متصفح الويب على طريقةٍ يمكنك من خلالها التعرف على محدّدات URL وتكون غالبًا عن طريق إبراز بعض النصوص أو وضع خطٍ تحتها، ويمكنك مطالبة المتصفح بفتحها، حيث تسمَّى محدّدات URL المضمَّنة هذه روابط النصوص الترابطية hypertext links. وإذا طلبت من متصفح الويب فتح أحد محدّدات URL المضمَّنة من خلال التأشير والنقر عليه بالفأرة على سبيل المثال، فسيفتح المتصفح اتصالًا جديدًا ويسترجع ملفًا جديدًا ويعرضه، ويُسمى هذا متابعة الرابط following a link، وبالتالي سيصبح التنقل من جهازٍ إلى آخر على الشبكة أمرًا سهلًا جدًا من خلال متابعة الروابط لجميع أنواع المعلومات. يمكنك تكوين أساسٍ لنظام النص الترابطي، بمجرد أن يكون لديك وسيلةٌ لتضمين رابطٍ في مستند والسماح للمستخدم بمتابعة هذا الرابط للحصول على مستندٍ آخر. إذا طلبت من متصفحكَ عرض صفحة، فسيجلب المتصفح أو العميل الصفحة من الخادم باستخدام بروتوكول HTTP الذي يعمل عبر بروتوكول TCP. ويُعَد بروتوكول HTTP بروتوكولًا موجّهًا بالنصوص مثل SMTP. وHTTP في جوهره هو بروتوكول طلب / استجابة request/response، حيث يكون لكل رسالةٍ الشكل العام التالي: START_LINE <CRLF> MESSAGE_HEADER <CRLF> <CRLF> MESSAGE_BODY <CRLF> يشير الرمز <CRLF> إلى carriage-return+line-feed كما ذكرنا سابقًا، ويحدّد السطر الأول START_LINE ما إذا كانت هذه الرسالة رسالة طلبٍ أو استجابة، كما يحدّد أيضًا الإجراءَ البعيد remote procedure الذي سيُنفَّذ إذا كانت رسالة طلب، أو حالة status الطلب إذا كانت رسالة استجابة. وتحدد مجموعة الأسطر الأخرى مجموعةً من الخيارات والمعامِلات المُؤهلة للطلب أو الاستجابة. لا تتواجد سطور MESSAGE_HEADER إطلاقًا أو يمكن أن يتواجد سطرٌ أو أكثر منتهٍ بسطرٍ فارغ، حيث يظهر كل سطرٍ منها كأنه سطر ترويسة header في رسالة البريد الإلكتروني. يُعرِّف بروتوكول HTTP العديد من أنواع الترويسات المحتملة، حيث يتعلّق بعضها برسائل الطلب، والبعض الآخر برسائل الاستجابة؛ اما البعض الآخر، فيتعلق بالبيانات المنقولة في جسم الرسالة. سنقدّم فقط عددًا قليلًا من الأمثلة، بدلًا من إعطاء المجموعة الكاملة لأنواع الترويسات الممكنة. أخيرًا، تأتي بعد السطر الفارغ محتويات الرسالة المطلوبة MESSAGE_BODY؛ فهذا الجزء من الرسالة هو المكان الذي يضع فيه الخادم الصفحة المطلوبة عند الاستجابة لطلبٍ ما، ويكون عادةً فارغًا في رسائل الطلب. لماذا يعمل بروتوكول HTTP عبر بروتوكول TCP؟ لم يكن على المصممين فعل ذلك بهذه الطريقة، لكن بروتوكول TCP يوفر تطابقًا جيدًا مع احتياجات بروتوكول HTTP، لا سيما من خلال توفير توصيلٍ موثوق، حيث لا يريد أحدٌ صفحة ويب بها بياناتٌ مفقودة، وكذلك التحكم في التدفق والازدحام، لكن كما سنرى أدناه، هناك بعض المشاكل التي يمكن أن تحدث من إنشاء بروتوكول طلب / استجابة فوق بروتوكول TCP، خاصةً إذا تجاهلت التفاصيل الدقيقة للتفاعلات بين بروتوكولات طبقتَي التطبيق والنقل. رسائل الطلب Request Messages يحدّد السطر الأول من رسالة طلب HTTP ثلاثة أشياء هي العملية المُراد تنفيذها، وصفحة الويب التي يجب تنفيذ العملية عليها، وإصدار بروتوكول HTTP المُستخدَم. يحدّد بروتوكول HTTP مجموعةً متنوعةً من عمليات الطلب الممكنة، بما في ذلك عمليات الكتابة التي تسمح بنشر صفحة ويب على الخادم، لكن العمليتين الأكثر شيوعًا، هما عملية GET لجلب صفحة الويب المحدَّدة، والعملية HEAD لجلب معلومات الحالة حول صفحة الويب المحدّدة؛ حيث تُستخدَم العملية GET عندما يريد متصفحك استرداد صفحة ويب وعرضها؛ أما العملية HEAD فهي لاختبار صلاحية رابط النص الترابطي، أو لمعرفة ما إذا عُدِّلت صفحةٌ معينة منذ آخر مرةٍ جلبها المتصفح. يلخّص الجدول الآتي المجموعة الكاملة من العمليات، ويسبب الأمر POST الكثير من الضرر على الإنترنت بما في ذلك البريد المزعج spam. 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; } العملية Operation وصفها العملية OPTIONS طلب معلومات عن الخيارات المتاحة العملية GET استرداد المستند المعرّف في محدّد URL العملية HEAD استرداد المعلومات الوصفية للمستند المعرّف في محدّد URL العملية POST إعطاء الخادم معلومات مثل التعليق التوضيحي العملية PUT تخزين المستند استنادًا إلى محدّد URL العملية DELETE حذف محّد URL معيّن العملية TRACE استرجاع Loopback رسالة الطلب العملية CONNECT لاستخدام الوكلاء proxies يخبرنا سطر START_LINE التالي على سبيل المثال بأن العميل يريد من الخادم إعادة الصفحة المسمّاة index.html. GET http://www.cs.princeton.edu/index.html HTTP/1.1 يستخدم هذا المثال محدّد URL مطلق absolute، ويمكن أيضًا استخدام معرّف نسبي relative وتحديد اسم المضيف في أحد سطور MESSAGE_HEADER كما في السطر التالي: GET index.html HTTP/1.1 Host: www.cs.princeton.edu حقل المضيف Host هنا هو أحد حقول ترويسة الرسالة MESSAGE_HEADER الممكنة، وأهم حقلٍ هو الحقل If-Modified-Since الذي يمنح العميل طريقةً لطلب صفحة ويب بصورةٍ مشروطة، حيث لا يرجع الخادم الصفحة إلا إذا كانت مُعدَّلة منذ الوقت المحدد في سطر الترويسة. رسائل الاستجابة تبدأ رسائل الاستجابة بسطر START_LINE مثل رسائل الطلب، حيث يحدد السطر في هذه الحالة إصدار بروتوكول HTTP المُستخدَم، ورمزًا مكونًا من ثلاثة أرقام للإشارة إلى ما إذا كان الطلب ناجحًا أم لا، وسلسلةً نصية توضح سبب الاستجابة. يحدّد سطر START_LINE التالي على سبيل المثال أن الخادم كان قادرًا على تلبية الطلب. HTTP/1.1 202 Accepted بينما يشير السطر التالي إلى أن الخادم لم يكن قادرًا على تلبية الطلب لأنه لم يعثر على الصفحة. HTTP/1.1 404 Not Found توجد خمسة أنواعٍ عامة من رموز الاستجابة، حيث يشير الرقم الأول من الرمز إلى نوعه. يلخّص الجدول التالي الأنواع الخمسة لهذه الرموز: الرمز Code نوعه أمثلة عنه الرمز 1xx لغرض المعلومات Informational استلام طلب واستمرار عملية الرمز 2xx عند النجاح Success استلام إجراء وفهمه وقبوله بنجاح الرمز 3xx عند إعادة التوجيه Redirection عندما يجب اتخاذ مزيدٍ من الإجراءات لإكمال الطلب الرمز 4xx عند وجود خطأ في العميل Client Error احتواء الطلب على صياغةٍ غير صحيحة أو عندما لا يمكن تنفيذ الطلب الرمز 5xx عند وجود خطأ في الخادم Server Error فشل الخادم في تلبية طلبٍ صالح بوضوح تكون كيفية استخدام رسائل الاستجابة المختلفة عمليًا أمرًا غير متوقَّع، كما هو الحال مع العواقب غير المتوقعة لرسالة طلب POST، حيث تبيّن أن إعادة توجيه الطلب (الرمز 302 تحديدًا) على سبيل المثال، يُعَد آليةً فعالةً تلعب دورًا كبيرًا في شبكات توزيع المحتوى Content Distribution Networks، أو اختصارًا CDNs من خلال إعادة توجيه الطلبات إلى ذاكرة مخبئية cache قريبة. يمكن أن تحتوي رسائل الاستجابة على سطرٍ واحد أو أكثر من سطور MESSAGE_HEADER كما هو الحال مع رسائل الطلب، حيث تنقل هذه الأسطر معلوماتٍ إضافية إلى العميل. يحدّد سطر ترويسة الموقع Location على سبيل المثال بأن محدّد URL المطلوب متاحٌ في موقع آخر، وبالتالي إذا نُقلت صفحة الويب الخاصة بقسم علوم الحاسوب CS في جامعة برينستون من العنوان http://www.cs.princeton.edu/index.html إلى العنوان الآتي: http://www.princeton.edu/cs/index.html على سبيل المثال، فقد يستجيب الخادم صاحب العنوان الأصلي بما يلي: HTTP/1.1 301 Moved Permanently Location: http://www.princeton.edu/cs/index.html ستحمل رسالة الاستجابة أيضًا الصفحة المطلوبة، وهذه الصفحة هي مستند HTML، ولكن قد تحتوي على بياناتٍ غير نصية مثل صورة GIF، لذلك تُشفَّر باستخدام معيار MIME. تعطي بعض أسطر MESSAGE_HEADER سمات محتويات الصفحة بما في ذلك عدد بايتات المحتويات، والسمة Expires للدلالة الوقت الذي تُعَد فيه المحتويات قديمة، ووقت تعديل المحتويات آخر مرةٍ على الخادم. معرفات الموارد الموحدة Uniform Resource Identifiers تُعَد محدّدات URL التي يستخدمها بروتوكول HTTP مثل عناوين، نوعًا من معرّفات الموارد الموحَّدة Uniform Resource Identifier أو اختصارًا URI؛ وهي سلسلة أحرف تحدد موردًا، ومن الممكن أن يكون المورد أي شيء له هوية مثل مستندٍ أو صورةٍ أو خدمة. تسمح صيغة معرّفات URI بأنواعٍ مختلفة أكثر تخصصًا من معرّفات الموارد لتُدمَج ضمن حيّز معرّفات URI. يكون الجزء الأول من معرّف URI واصفًا scheme يسمّي طريقةً معينة لتحديد نوعٍ معين من الموارد، مثل واصف mailto لعناوين البريد الإلكتروني أو واصفfile لأسماء الملفات؛ أما الجزء الثاني من معرّف URI المفصول عن الجزء الأول بنقطتين، فهو الجزء الخاص بالواصِف scheme-specific part، وهو معرّف موردٍ متوافق مع الواصف في الجزء الأول، كما هو الحال في المعرّفَين الآتيين: mailto:santa@northpole.org. file:///C:/foo.html. يجب أن يكون المورد غير قابلٍ للاسترداد أو الوصول إليه، فلقد رأينا مثالًا سابقًا تحدِّد فيه معرّفاتُ URI مساحاتِ أسماء لغة التوصيف الموسّعة extensible markup language أو اختصارًا XML، حيث تشبه معرّفات URI كثيرًا محدّدات URL، ولكنها بالمعنى الدقيق للكلمة؛ ليست محدّدات مواقع لأنها لا تخبرك بكيفية تحديد موقع شيء ما؛ حيث توفّر فقط معرّفًا فريدًا عالميًا لمساحة الأسماء. لا يوجد أي أمرٍ يمكّنك من استرداد شيءٍ من معرّف URI المُعطَى على أنه مساحة أسماء الهدف لمستند XML. سنرى مثالًا آخر لمعرّف URI، ولكنه ليس بمحدّد URL لاحقًا. اتصالات TCP أنشأ الإصدار الأصلي رقم 1.0 من بروتوكول HTTP اتصال TCP منفصل لكل عنصر بياناتٍ يُسترَد من الخادم. من السهل أن نرى أن هذه الآلية غير فعالةٍ للغاية، حيث يجب تبادل رسائل إعداد الاتصال ورسائل تفكيكه بين العميل والخادم حتى لو كان كل ما يريده العميل هو التحقق من أن لديه أحدث نسخةٍ من الصفحة، وبالتالي فإن استرداد صفحةٍ تحتوي على بعض النصوص وعشرات الأيقونات أو غيرها من الرسوم البيانية الصغيرة سيؤدي إلى إنشاء 13 اتصال TCP منفصلٍ وإغلاقها. يوضح الشكل الآتي تسلسل الأحداث لجلب صفحةٍ تحتوي على كائنٍ واحدٍ فقط؛ فتشير الخطوط الملونة إلى رسائل TCP، بينما تشير الخطوط السوداء إلى طلبات واستجابات HTTP، ولا تظهر بعض إشعارات TCP لتجنب ازدحام الصورة. هنا يمكنك أن ترى الحاجة إلى وقتين ذهابًا وإيابًا من أجل إعداد اتصالات TCP، بينما نحتاج إلى وقتين آخرين على الأقل للحصول على الصفحة والصورة. بالإضافة إلى تأثير زمن الاستجابة، هناك أيضًا تكلفةُ المعالجة على الخادم للتعامل مع إنشاء اتصال TCP الإضافي وإنهائه. لقد قدّم الإصدار رقم 1.1 من بروتوكول HTTP مفهوم الاتصالات الدائمة persistent connections للتغلب على الموقف السابق، حيث يمكن للعميل والخادم تبادل رسائل طلب / استجابة متعددة عبر نفس اتصال TCP. للاتصالات الدائمة مزايا عديدة، فهي أولًا تزيل حِمل إعداد الاتصال، وبالتالي تقلل الحِمل على الخادم وكذلك الحمل على الشبكة الناجم عن رزم TCP الإضافية، كما تقلل أيضًا التأخير الذي يراه المستخدم. ثانيًا، بما أن العميل يمكنه إرسال رسائل طلب متعددة عبر اتصال TCP واحد، فإن آلية نافذة الازدحام في بروتوكول TCP قادرةٌ على العمل بصفةٍ أكثر كفاءةً، لأنه ليس ضروريًا المرور بمرحلة البداية البطيئة لكل صفحة. يوضح الشكل التالي المعامَلة من الشكل السابق باستخدام اتصالٍ دائم في الحالة التي يكون فيها الاتصال مفتوحًا، والمُرجَّح أن يكون ذلك بسبب الوصول المُسبَق لنفس الخادم. لا تأتي الاتصالات الدائمة بدون ثمن، حيث تكمن المشكلة في عدم معرفة العميل والخادم بالضرورة المدة التي يجب إبقاء اتصال TCP معين مفتوحًا خلالها. يَُعد هذا أمرًا بالغ الأهمية خاصةً على الخادم، والذي قد يُطلَب منه إبقاء الاتصالات مفتوحةً نيابةً عن آلاف العملاء. الحل هنا هو أن ينهي الخادم مهلة الاتصال ويغلقه إذا لم يتلقى أي طلبات اتصالٍ لفترةٍ من الوقت، كما يجب أيضًا أن يراقب كلٌ من العميل والخادم بعضهما لمعرفة ما إذا اختار الطرف الآخر إغلاق الاتصال، كما يجب عليهما استخدام هذه المعلومات مثل إشارةٍ إلى أنه يجب إغلاق جانبهما من الاتصال أيضًا. تذكر أنه يجب على كلا الجانبين إغلاق اتصال TCP قبل إنهائه بالكامل، وقد تكون المخاوف بشأن هذا التعقيد الإضافي أحد أسباب عدم استخدام الاتصالات الدائمة منذ البداية، ولكن أصبح مقبولًا اليوم على نطاقٍ واسع أن تكون فوائد الاتصالات الدائمة أكثر من عيوبها. لا يزال الإصدار 1.1 مدعومًا على نطاقٍ واسع، ولكن وافقت منظمة IETF رسميًا على إصدارٍ جديد هو 2.0 في عام 2015. يُعرف الإصدار الجديد باسم HTTP / 2، وهو متوافقٌ مع الإصدار السابق 1.1، حيث يعتمد نفس صياغة حقول الترويسة ورموز الحالة ومعرّفات URI، لكنه يضيف ميزتين جديدتين. الميزة الأولى هي تقديم التسهيلات لخوادم الويب بتقليل المعلومات التي تُرسَل مرةً أخرى إلى متصفحات الويب، فإذا نظرت عن كثبٍ إلى تركيبة لغة HTML في صفحة ويب نموذجية، فستجد عددًا كبيرًا من الإشارات إلى بتاتٍ وأجزاءٍ أخرى مثل الصور والنصوص وملفات الأنماط التي يحتاجها المتصفح لعرض الصفحة. فبدلًا من إجبار العميل على طلب هذه البتات والأجزاء المعروفة تقنيًا باسم الموارد resources في الطلبات اللاحقة، يوفر الإصدار HTTP / 2 وسيلةً للخادم لتجميع الموارد المطلوبة ودفعها استباقيًا إلى العميل دون تكبد تأخير الرحلة ذهابًا وإيابًا بسبب إجبار العميل على طلبها. تقترن هذه الميزة بآلية ضغط تقلل من عدد البايتات الواجب دفعها، والهدف منها هو تقليل وقت الاستجابة الذي يواجهه المستخدم النهائي من اللحظة التي ينقر فيها على رابطٍ ترابطي حتى عرض الصفحة بالكامل. ميزة إصدار HTTP / 2 الثانية هي دمج عدة طلباتٍ على اتصال TCP واحد، وهذا يتجاوز ما يدعمه الإصدار 1.1 الذي يسمح بسلسلةٍ من الطلبات لإعادة استخدام اتصال TCP، من خلال السماح لهذه الطلبات بالتداخل مع بعضها بعضًا. يجب أن تكون الطريقة التي يؤدي بها الإصدار HTTP / 2 هذا الأمر مألوفة؛ حيث تحدّد هذه الطريقة تجريد القناة channel وتسمَّى القنوات تدفقات streams من الناحية التقنية، وتسمح بأن تكون التدفقات المتزامنة المتعددة نشطةً في وقتٍ معين، حيث يُعطى كلٌّ منها معرّف تدفقٍ stream id فريد، وتقيّد هذه الطريقة كل تدفقٍ fاستخدام تبادل طلب / رد نشط واحدٍ في كل مرة. التخبئة Caching استراتيجية التطبيق المهمة التي تمكّن الويب من أن يكون أكثر قابليةً للاستخدام هي تخبئة cache صفحات الويب، والتي لها فوائد عديدة، حيث يمكن من وجهة نظر العميل عرض الصفحة التي يمكن استردادها من ذاكرة مخبئية قريبة بسرعةٍ أكبر بكثير مما لو جُلِبت من جميع أنحاء العالم؛ بينما من وجهة نظر الخادم، يؤدي استخدام الذاكرة المخبئية وتلبية الطلب إلى تقليل الحِمل على الخادم. يمكن تطبيق التخبئة في العديد من الأماكن المختلفة، فيمكن لمتصفح المستخدم مثلًا تخزين الصفحات التي جرى الوصول إليها مؤخرًا في الذاكرة المخبئية، وعرض هذه النسخة المُخزنة إذا زار المستخدم نفس الصفحة مرةً أخرى، كما يمكن أن يدعم الموقع ذاكرةً مخبئية واحدةً على مستوى الموقع، ويتيح ذلك للمستخدمين الاستفادة من الصفحات التي نزّلها مسبقًا مستخدمون آخرون. يمكن لمزودي خدمة الإنترنت ISP أيضًا تخبئة الصفحات، ولكن هناك عددٌ من المشاكل المتعلقة بهذا النوع من التخبئة، بدءًا من المشاكل التقنية إلى المشاكل التنظيمية، فأحد الأمثلة على التحدي التقني هو تأثير المسارات غير المتماثلة asymmetric paths عندما لا يتّبع الطلب من الخادم ولا الاستجابة للعميل نفس تسلسل قفزات الموجّهات. يُرجَّح في الحالة التي يدعم الموقع فيها ذاكرةً مخبئية واحدةً على مستوى الموقع أن يعرف المستخدمون داخل الموقع الجهازَ الذي يخزّن الصفحات ضمن ذاكرةٍ مخبئية نيابةً عن الموقع، فيضبطون متصفحاتهم للاتصال مباشرةً بمضيف التخبئة، وتسمَّى هذه العقدة أحيانًا وكيلًا proxy؛ بينما قد لا تدرك المواقع التي تتصل بمزود خدمة الإنترنت أنه يخزّن الصفحات ضمن ذاكرةٍ مخبئية، فتمر طلبات HTTP الصادرة من مواقع مختلفة عبر موجّه ISP مشترك، حيث يمكن لهذا الموجّه إلقاء نظرةٍ خاطفةٍ على رسالة الطلب وعلى محدّد URL للصفحة المطلوبة. إذا احتوى هذا الموجّه على الصفحة في ذاكرته المخبئية، فسيعيدُها؛ أما إذا لم يكن الأمر كذلك، فسيُمرِّر الطلب إلى الخادم ويراقب الاستجابة في الاتجاه الآخر، وعند حدوث ذلك، سيحفظ الموجّه نسخةً على أمل أن يتمكن من استخدامها لتلبية طلبٍ في المستقبل. تُعَد القدرة على تخبئة صفحات الويب مهمةً بما يكفي بغض النظر عن مكان تخبئتها، وذلك لأن بروتوكول HTTP قد صُمِّم لتسهيل الأمور. تحتاج الذاكرة المخبئية إلى التأكد من أنها لا تستجيب مع إصدارٍ قديم من الصفحة، حيث يمكن أن يسند الخادم مثلًا تاريخ انتهاء صلاحية في حقل الترويسة Expires لكل صفحةٍ يرسلها مرةً أخرى إلى العميل أو إلى الذاكرة المخبئية بين الخادم والعميل. ستتذكّر الذاكرة المخبئية هذا التاريخ وتعلم أنها لا تحتاج إلى إعادة التحقق من الصفحة في كل مرةٍ تُطلَب إلا بعد مرور تاريخ انتهاء الصلاحية. يمكن للذاكرة المخبئية بعد ذلك الوقت أو إذا لم يُضبَط حقل الترويسة Expires استخدامَ عملية HEAD أو عملية GET الشرطية، أي عملية GET مع سطر ترويسة للتحقق من أن لديها أحدث نسخةٍ من الصفحة. هناك مجموعةٌ من توجيهات الذاكرة المخبئية cache directives التي يجب أن تلتزم بها جميع آليات التخبئة على طول سلسلة الطلب / الاستجابة، حيث تحدّد هذه التوجيهات ما إذا كان يمكن تخبئة المستند أم لا، ومدة تخبئته، ومدى حداثة المستند وغير ذلك. وسنلقي نظرةً على المشكلة ذات الصلة بشبكات CDN الموزَّعة بصورةٍ فعالة في قسمٍ لاحق. ترجمة -وبتصرّف- للقسم Traditional Applications من فصل Applications من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا الخدمات المميزة لتطبيق جودة الخدمة ضمن الشبكات الحاسوبية بيانات شبكات طرف إلى طرف الحاسوبية أمثلة عن أنظمة أمن الشبكات الحاسوبية
-
سنتعلم من خلال هذا المقال كيفية رسم شخصية القطة السوداء المخيفة باستخدام برنامج الإليستريتور Adobe Illustrator، إذ سنتعرّف على كيفية استخدام الإضاءة لإضافة بُعد لشخصيتك، وسنضيف عظامًا لها وسننشئ فرشاة نمط Pattern Brush مخصَّصة للذيل والعمود الفقري، وستكون قادرًا على تطبيق هذه التقنيات في مشاريع أخرى مستقبلًا. ستحصل في النهاية على رسم مشابه للشكل التالي: إنشاء مستند جديد شغّل برنامج الإليستريتور وافتح مستندًا جديدًا، ثم اكتب اسمًا مناسبًا واضبط الأبعاد وحدّد البكسلات Pixels بوصفها الوحدات Units المستخدَمة واستخدم نمط الألوان RGB. انتقل بعد ذلك إلى قائمة تحرير Edit ثم تفضيلات Preferences ثم عام General، واضبط الخيار زيادة لوحة المفاتيح Keyboard Increment على 1 بكسل ثم تحقق من الوحدات، إذ ستساعدك هذه الإعدادات طوال عملية الرسم. رسم وجه القطة السوداء سنبدأ بالرأس من خلال استخدام أداة الدائرة Ellipse Tool (باستخدام الاختصار L)، حيث سنرسم دائرةً أبعادها 225 x 128 بكسل ونلوّنها باللون الأسود. انتقل بعد ذلك إلى قائمة تأثير Effect ثم Stylize ثم إضاءة داخلية Inner Glow وطبّق الإعدادات الموضَّحة أدناه لإنشاء إضاءة في المنتصف. ارسم العين اليمنى باستخدام أداة القلم Pen Tool (باستخدام الاختصار P) لرسم شكلٍ مثل الشكل أدناه ولوّنه باللون البرتقالي. ارسم شكلًا مشابهًا، ولكن أصغر منه فوقه ولوّنه بدرجة لونية برتقالية أدكن. حدّد كلا الشكلين وانتقل إلى قائمة كائن Object ثم Blend ثم خيارات المزج Blend Options. اضبط خيار الخطوات المحدَّدة Specified Steps على القيمة 20، ثم ارجع إلى قائمة كائن Object، بعدها Blend ثم Make (أو استخدم الاختصار Alt+Control+B). استخدم أداة القلم (P) لرسم مثلث ولوّنه باللون الأرجواني المُحمّر (بورجوندي burgundy)، ثم ارسم مثلثًا أصغر ولوّنه باللون الأسود فوق المثلث السابق. حدّد كلا المثلثين وانتقل إلى قائمة كائن Object ثم Blend ثم خيارات المزج Blend Options. اضبط خيار الخطوات المحدَّدة Specified Steps على القيمة 15 ثم ارجع إلى قائمة كائن Object ثم Blend ثم Make، أو استخدم الاختصار Alt+Control+B. استخدم أداة التحديد المباشر Direct Selection باستخدام الاختصار A لتحديد الشكل الأكبر في العين فقط من المجموعة الناتجة عن المزج، ثم انسخه والصق النسخة في المكان نفسه باستخدام الاختصار Shift+Control+V. انتقل إلى قائمة تأثير Effect ثم Stylize ثم ظل ساقط Drop Shadow، وطبّق الإعدادات الموضّحة أدناه لإنشاء ظل، ثم أرسِل هذا الشكل خلف العين في لوحة طبقات Layers. استخدم أداة القلم (P) لرسم مسار مستقيم بين نقطتي الزاوية العلويتين، وطبّق حدًا Stroke أسود بمقدار 1 نقطة واستخدم الخيار Width Profile 1 في لوحة Stroke. أصبحت العين اليمنى جاهزة ويمكنك تجميع Group (باستخدام الاختصار Control+G) جميع الأشكال. انتقل إلى قائمة كائن Object ثم تحويل Transform ثم انعكاس Reflect، ثم حدّد الخيار رأسي Vertical واضغط على نسخ Copy. ستحصل في النهاية على العين اليسرى وستحتاج إلى تحريكها إلى مكانها الصحيح. لنرسم الآن فم القطة السوداء. استخدم أداة القلم (P) لرسم شكل يشبه الهلال ولوّنه باللون الأسود، ثم طبّق حدًا بمقدار 1 نقطة وحدّد الخيار Width Profile 1 في لوحة Stroke والتدرج اللوني الخطي linear gradient الموضّح أدناه بزاوية 90 درجة. لنرسم الأنف الآن. ارسم مسارًا مستقيمًا فوق الفم وطبّق حدًا بمقدار 2 نقطة واستخدم الخيار Width Profile 5 والتدرج اللوني الخطي الموضّح أدناه بزاوية 90 درجة. انتقل إلى لوحة Appearance وأضِف حدًا جديدًا New Stroke تحت الحد الأول، ولوّنه باللون الأسود وحدّد الخيار Width Profile 5 مرةً أخرى، ثم انتقل إلى قائمة تأثير Effect ثم ضبابية Blur ثم Gaussian Blur وطبّق نصف قطر Radius بمقدار 3 بكسلات، مما يؤدي إلى إنشاء ظل حول الأنف. يمكنك إضافة إضاءة إلى الوجه من خلال رسم شكل مثلث باستخدام أداة القلم (P). لوّن هذا المثلث باللون الأبيض، ثم طبّق تأثير Feather وتأثير Gaussian Blur باستخدام الإعدادات الموضّحة أدناه، واضبط نمط المزج Blending Mode على الخيار Soft Light. رسم أذني القطة السوداء استخدم أداة القلم (P) لرسم شكل مثلث ليكون الأذن اليمنى ولوّنه باللون الأسود، ثم ارسم مثلثًا صغيرًا آخر في منتصفه ولوّنه باللون الأزرق، وارسم بعد ذلك مثلثًا ثالثًا أصغر في قاعدة الأذن ولوّنه بالتدرج اللوني الخطي الموضّح أدناه. اضبط زاوية التدرج اللوني، بحيث يكون اللون الأسود هو قاعدة المثلث واللون الأزرق عند رأسه. حدّد المثلثين الثاني والثالث فقط وانتقل إلى قائمة كائن Object ثم Blend ثم خيارات المزج Blend Options. اضبط خيار الخطوات المحدَّدة Specified Steps على القيمة 15 ثم ارجع إلى قائمة كائن Object ثم Blend ثم Make (أو استخدم الاختصار Alt+Control+B). أصبحت الأذن اليمنى جاهزة ويمكنك تجميع (Control+G) جميع الأشكال. انتقل بعد ذلك إلى قائمة كائن Object ثم تحويل Transform ثم انعكاس Reflect، ثم حدّد الخيار رأسي Vertical واضغط على نسخ Copy، وبالتالي ستحصل على الأذن اليسرى وستحتاج إلى تحريكها إلى مكانها الصحيح. رسم جسم وأرجل القطة السوداء استخدم أداة القلم (P) لرسم شكل الجسم كما في الشكل التالي من خلال رسم شكل الرِجل اليسرى ومخلبها معًا وتلوينهما باللون الأسود. سنضيف الآن إضاءةً إلى الساق لإبرازها. استخدم أداة القلم (P) وارسم مسارًا يتبع حافة الرجل اليسرى، ثم طبّق حدًا بمقدار 3 نقاط واستخدم الخيار Width Profile 1 في لوحة Stroke، ثم طبّق تأثير Gaussian Blur بمقدار 3 بكسلات. ارسم مسارًا يتبع حافة الرجل اليمنى، وطبّق حدًا بمقدار 1 نقطة واستخدم الخيار Width Profile 1 في لوحة Stroke، ثم طبق تأثير Gaussian Blur بمقدار 3 بكسلات. حدد شكل الرجل ثم انسخه والصق النسخة في المكان نفسه (باستخدام الاختصار Shift+Control+V)، ثم اضبط لون حدّ وتعبئة هذه النسخة على لا شيء. حدّد مساري الإضاءة مع نسخة الرجل وانتقل إلى قائمة كائن Object ثم قناع القطع Clipping Mask ثم Make (أو استخدم الاختصار Control+7). لنرسم الآن مخالب القطة السوداء. استخدم أداة القلم (P) وارسم شكل المخلب كما في الشكل التالي ولوّنه باللون الأسود. ارسم شكل مخلب مشابه ولكن أصغر من المخلب السابق في المنتصف ولوّنه باللون الأزرق الداكن. حدّد كلا الشكلين وامزجهما من خلال ضبط خيار الخطوات المحدَّدة Specified Steps على القيمة 8، بهذا سيكون المخلب الأول جاهزًا، ويمكنك إنشاء نسخ منه للأصابع الأخرى. الرجل اليسرى ومخالبها جاهزة ويمكنك تجميع (باستخدام الاختصار Control+G) جميع هذه الأشكال. انتقل إلى قائمة كائن Object** ثم Transform ثم Reflect، ثم حدّد الخيار رأسي Vertical واضغط على نسخ Copy. ستحصل في النهاية على الرجل اليمنى وستحتاج إلى تحريكها إلى مكانها الصحيح. ارسم شكل الأرجل الخلفية باستخدام أداة القلم (P)، ثم لوّنها باللون الأسود. انتقل إلى قائمة تأثير Effect ثم Styliz، ثم إضاءة داخلية Inner Glow وطبّق الإعدادات الموضّحة أدناه لإضافة بعض الأبعاد. رسم ذيل القطة السوداء ارسم شكل الذيل باستخدام أداة القلم (P)، ثم طبّق حدًا باللون الأسود بمقدار 20 نقطة وحدّد الخيار زوايا مستديرة Round Cap في لوحة Stroke للحصول على نهاية مستديرة. حدّد الخيارين توسيع Expand وفك تجميع Ungroup (باستخدام الاختصار Shift+Control+G) من قائمة كائن Object لتحويل الحدّ إلى تعبئة، ثم لوّن شكل الذيل باللون الأسود. استخدم أداة القلم P لرسم مسار جديد يمر من منتصف الذيل، ثم طبّق حدًا باللون الأزرق بمقدار 0.75 نقطة وحدّد الخيار Width Profile 1 في لوحة Stroke. طبّق تأثير Gaussian Blur بمقدار 2 بكسل، وبالتالي ستحصل على إضاءة على الذيل. رسم عظام أرجل القطة السوداء استخدم أداة المستطيل Rectangle Tool (باستخدام الاختصار M) وأداة الدائرة Ellipse Tool (باستخدام الاختصار L) لرسم مستطيل ودائرتين عند كل طرف، ثم رتّب هذه الأشكال كما هو موضَّح في الشكل أدناه لإنشاء شكل العظام. حدّد هذه الأشكال واضغط على دمج Unite في لوحة مستكشف المسار Pathfinder لدمجها في شكل واحد. رتب عظمتين كما في الشكل أدناه، حيث يجب أن تضعهما أمام الأرجل الخلفية وتحت الأرجل الأمامية في لوحة طبقات Layers. لوّن العظمتين باللون البيج الفاتح، ثم طبّق تأثير الإضاءة الداخلية Inner Glow والظل الساقط Drop Shadow باستخدام الإعدادات الموضّحة أدناه. استخدم الآلية نفسها لإضافة عظمتين أخريين على الأرجل الخلفية. رسم عظام ذيل القطة السوداء وعمودها الفقري استخدم أداة القلم (P) لرسم شكل مشابه للشكل الآتي، حيث يكون هذا الشكل صغيرًا جدًا ويناسب مستطيلًا أبعاده 10 x 7 بكسل، ولوّنه باللون الأبيض ثم اسحبه إلى لوحة الفُرش Brushes لحفظه بوصفه فرشاة نمط جديد. اكتب اسمًا مناسبًا مثل الاسم "Bones Pattern Brush" في نافذة خيارات نمط الفرشاة Pattern Brush Options وأبقِ بقية الإعدادات كما هي. استخدم أداة القلم (P) وارسم مسارًا على الذيل باستخدام الفرشاة Bones Pattern Brush المحفوظة حديثًا، ثم افتح نافذة خيارات الحدّ Stroke Options من لوحة Appearance. اكتب 20% في حقل التباعد Spacing ويمكنك تقليل قيمة التحجيم Scale إن لزم الأمر، ثم اضغط على موافق. حدّد المسار الذي له حدود، الذي رسمناه في الخطوة السابقة، واختر توسيع المظهر Expand Appearance من قائمة كائن Object، ثم اختر فك التجميع Ungroup (باستخدام الاختصار Shift+Control+G) مرتين للحصول على القطع المُفرَدة. حدّد آخر قطعة من العظام فقط وانتقل إلى قائمة كائن Object، ثم تحويل Transform ثم تحجيم Scale، واكتب القيمة 90% في حقل التحجيم الموحَّد Scale Uniform واضغط على نسخ Copy، وبالتالي ستحصل على شكل عظام أصغر قليلًا في الطرف العلوي. حدّد هذه العظمة الصغيرة وحدّد قيمة التحجيم بمقدار 90% مرةً أخرى لتصغير قطعة جديدة، ثم استمر في تطبيق ذلك عدة مرات مع محاذاة العظام الأصغر التي حصلتَ عليها مع الذيل. حدّد كل عظام الذيل واملأها بالتدرج اللوني الشعاعي radial gradient الموضَّح أدناه، وجمّعها باستخدام الاختصار Control+G، ثم انتقل إلى قائمة تأثير Effect ثم Stylize ثم Outer Glow، وطبّق الإعدادات الموضَّحة أدناه للحصول على إضاءة زرقاء حول العظام. اتبع الآلية نفسها لإنشاء العمود الفقري، ثم طبّق تأثير الإضاءة الخارجية Outer Glow على مجموعة العظام بأكملها للحصول على إضاءة زرقاء. رسم صدر وأضلاع القطة السوداء ارسم شكلًا فوق العمود الفقري كما في الشكل التالي ثم ارسم شكلًا مشابهًا ولكن أصغر في المنتصف. استخدم الألوان الموضَّحة أدناه ثم امزجها من خلال تطبيق خيار الخطوات المحدَّدة Specified Steps بمقدار 8. ارسم ثلاثة مسارات منحنية في جانب الصدر الأيمن باستخدام أداة القلم (P). طبّق حدًا بمقدار 5 نقاط واضغط على الخيار زوايا مستديرة Round Cap في لوحة Stroke للحصول على نهايات مستديرة. لوّن هذه الأشكال بالتدرج اللوني الخطي الموضَّح أدناه وجمّعها (باستخدام الاختصار Control+G). اعكس هذه الأضلاع الثلاثة عموديًا وستحصل على الأضلاع الموجودة في الجانب الأيسر. وأرسل مجموعة الأضلاع تحت الصدر وتحت الأرجل الأمامية في لوحة طبقات Layers. رسم عظام ورك القطة السوداء استخدم أداة القلم (P) لرسم شكل عظم الورك كما هو موضَّح أدناه، ثم أرسله خلف الأرجل الأمامية، ولوّنه باللون البيج وطبّق تأثير الإضاءة الداخلية Inner Glow، ثم ارسم دائرتين صغيرتين باللون الأسود تشبهان الثقوب. رسم شوارب وشعر القطة السوداء ارسم ثلاثة مسارات منحنية تشبه الشوارب وطبّق حدًا بمقدار 5 و6 و7 نقاط باللون الأسود وحدّد الخيار Width Profile 4 في لوحة Stroke، ثم طبّق الشيء نفسه في الجانب الأيسر. ارسم ثلاثة مسارات أخرى عند طرف كل أذن، وطبّق حدًا بمقدار 3 نقاط باللون الأسود وحدّد الخيار Width Profile 4 في لوحة Stroke. استخدم أداة القلم (P) أو أداة قلم الرصاص Pencil باستخدام الاختصار N، لرسم مجموعة من المسارات القصيرة على طرف الذيل والعنق. طبّق حدًا بمقدار 4 و6 و8 نقاط باللون الأسود، وحدّد الخيار Width Profile 4 للحصول على بعض الشعر. يمكنك تطبيق الأمر نفسه على الأذنين باستخدام أداة قلم الرصاص (N) لرسم مجموعة من المسارات القصيرة، ثم طبّق حدًا بمقدار 3 نقاط باللون الأسود، وحدّد الخيار Width Profile 4 في لوحة Stroke، ثم أرسِل كل الشعر إلى الخلف. ترجمة -وبتصرّف- للمقال How to Draw a Spooky Black Cat Character in Adobe Illustrator لصاحبه Mihaly Varga. اقرأ أيضًا كيفية رسم شخصية الكنغر الملاكم باستخدام إليستريتور إنشاء ساعة كاسيو Casio في الإليستريتور كيفية تصميم قبعة ساحر باستخدام برنامج Adobe Illustrator كيف تصمم حوض أسماك باستخدام برنامج Adobe Illustrator
-
بدأنا هذه السلسلة بالحديث عن البرامج التطبيقية التي يريد الأشخاص تشغيلها عبر الشبكات الحاسوبية، أي كل شيء من متصفحات الويب وصولًا إلى أدوات مؤتمرات الفيديو، وتحدّثنا عن تطوير بنية الشبكات التحتية اللازمة لجعل مثل هذه التطبيقات ممكنة. جزءٌ من هذه التطبيقات هو بروتوكول شبكة؛ أي تلك التي تتبادل الرسائل مع نظرائها على أجهزةٍ أخرى، والجزء الآخر هي برامج تطبيقية تقليدية؛ أي تتفاعل مع نظام النوافذ ونظام الملفات والمستخدم النهائي. وسيتناول هذا المقال أحد تطبيقات الشبكة الشائعة المتاحة اليوم، التي تتمثل بالدرجة الأولى في البريد الإلكتروني. نهج الأنظمة الذي أكدنا عليه خلال هذه السلسلة مُقادٌ بالتطبيقات؛ أي أن أفضل طريقةٍ لبناء تطبيقات شبكية فعالة هي فهم كتل البناء الأساسية التي يمكن أن توفّرها الشبكة وكيفية تفاعل هذه الكتل مع بعضها بعضًا، وبالتالي قد يحتاج تطبيقٌ شبكيٌ معين مثلًا إلى استخدام بروتوكول نقل موثوق وآليات استيثاق authentication، وخصوصية وقدرات تخصيص موارد الشبكة الأساسية. تعمل التطبيقات بصورةٍ أفضل عندما يعرف مطوّر التطبيق كيفية تحقيق أقصى استفادة من هذه الوسائل، وهناك أيضًا الكثير من الأمثلة العكسية للتطبيقات التي تستخدم إمكانات الشبكات المتاحة بصورةٍ سيئة. تحتاج التطبيقات عادةً إلى بروتوكولاتها الخاصة أيضًا في كثير من الحالات باستخدام نفس مبادئ بروتوكولات الطبقة الدنيا التي رأيناها سابقًا. وينصب تركيزنا في هذا المقال على كيفية تجميع الأفكار والتقنيات التي وصفناها بالفعل لبناء تطبيقات شبكية فعالة، فإذا تخيلت نفسك تكتب تطبيقًا على الشبكة، فستصبح أيضًا مصمِّمًا للبروتوكول ومطبِّقًا implementer له أيضًا. ننتقل بعد ذلك إلى اختبار مجموعةٍ متنوعة من تطبيقات الشبكة المألوفة وغير المألوفة، حيث تتراوح التطبيقات من تبادل البريد الإلكتروني وتصفح الويب، إلى دمج التطبيقات عبر الشركات وتطبيقات الوسائط المتعددة، مثل مؤتمرات الفيديو وإدارة مجموعة من عناصر الشبكة، وكذلك شبكات الند للند الناشئة وشبكات توزيع المحتوى. هذه القائمة ليست شاملةً بأي حال من الأحوال، لكنها تعمل على توضيح العديد من المبادئ الأساسية لتصميم وبناء التطبيقات، حيث تحتاج التطبيقات إلى انتقاء واختيار لبنات البناء المناسبة والمتوفرة في طبقاتٍ أخرى، إما داخل الشبكة أو في مكدسات بروتوكولات المضيف، ثم تحسين تلك الخدمات الأساسية لتوفير خدمة الاتصال الدقيقة التي يتطلبها التطبيق. التطبيقات التقليدية نبدأ مناقشتنا حول التطبيقات، من خلال التركيز على اثنين من أكثر التطبيقات شيوعًا، وهما شبكة الويب العالمية World Wide Web والبريد الإلكتروني email. يستخدم كلا التطبيقين نموذج الطلب / الرد request/reply paradigm، حيث يرسل المستخدمون الطلبات إلى الخوادم التي تستجيب وفقًا لذلك، ونشير إلى هذه التطبيقات بأنها تقليدية Traditional لأنها تمثّل نوع التطبيقات التي كانت موجودةً منذ الأيام الأولى للشبكات الحاسوبية، حيث تعود جذور الويب إلى عمليات نقل الملفات التي سبقته، على الرغم من أن الويب أحدث من البريد الإلكتروني بكثير. تتحدث الأقسام اللاحقة عن فئةٍ من التطبيقات التي أصبحت شائعةً مؤخرًا، وهي تطبيقات البث streaming applications مثل تطبيقات الوسائط المتعددة، مثل الفيديو والصوت والعديد من التطبيقات القائمة على التراكب overlay. لاحظ أن هناك بعض الغموض بين هذه الفئات، حيث يمكنك بالطبع الوصول إلى بيانات بث الوسائط المتعددة عبر الويب، ولكن سنركز في الوقت الحالي على الاستخدام العام للويب لطلب الصفحات والصور وغير ذلك. هناك ثلاث نقاط عامة نحتاج إلى توضيحها قبل إلقاء نظرةٍ على كل من هذه التطبيقات، حيث تتمحور النقطة الأولى حول أهمية التمييز بين برامج programs التطبيق وبروتوكولات protocols التطبيق، فبروتوكول نقل النصوص الترابطية HyperText Transport Protocol -أو اختصارًا HTTP- مثلًا، هو بروتوكول تطبيق يُستخدم لاسترداد صفحات الويب من الخوادم البعيدة. توفّر العديدُ من برامج التطبيقات المختلفة أي عملاء الويب، مثل برامج Internet Explorer وChrome وFirefox وSafari للمستخدمين مظهرًا وأسلوبًا مختلفًا، ولكنها تستخدم جميعًا نفس بروتوكول HTTP للاتصال بخوادم الويب عبر الإنترنت. تمكّن حقيقة أن البروتوكول منشورٌ وموحَّدٌ برامجَ التطبيقات التي طوّرتها العديد من الشركات والأفراد المختلفين من التعامل مع بعضها بعضًا، وهذه هي الطريقة التي يستطيع بها العديد من المتصفحات التعامل مع جميع خوادم الويب والتي يوجد منها عدة أنواع أيضًا. يبحث هذا القسم في بروتوكولي تطبيقين معياريين ومستخدَمَين على نطاقٍ واسع هما: بروتوكول نقل البريد البسيط Simple Mail Transfer Protocol -أو اختصارًا SMTP- المُستخدَم لتبادل البريد الإلكتروني. بروتوكول نقل النصوص الترابطية HyperText Transport Protocol -أو اختصارًا HTTP- المُستخدَم للتواصل بين متصفحات وخوادم الويب. النقطة الثانية هي أن العديد من بروتوكولات طبقة التطبيق بما في ذلك بروتوكولَي HTTP وSMTP، لها بروتوكولٌ مصاحبٌ لها يحدد صيغة البيانات الممكن تبادلها، وهذا هو أحد الأسباب التي تجعل هذه البروتوكولات بسيطةً نسبيًا، حيث يُدار الكثير من التعقيد ضمن هذا المعيار المصاحِب. يُعَد بروتوكول SMTP مثلًا بروتوكولًا لتبادل رسائل البريد الإلكتروني، ولكن يحدّد معيار RFC 822 وإضافات بريد الإنترنت متعدد الأغراض Multipurpose Internet Mail Extensions -أو اختصارًا MIME- صيغة رسائل البريد الإلكتروني. وبالمثل، يُعَد بروتوكول HTTP بروتوكولًا جالبًا لصفحات الويب، ولكن لغة توصيف النصوص الترابطية HyperText Markup Language -أو اختصارًا HTML- هي توصيفٌ مصاحبٌ لتحديد الشكل الأساسي لتلك الصفحات. تتمثل النقطة الثالثة في أن بروتوكولات التطبيق الموضَّحة في هذا القسم تتّبع نفس نمط اتصال الطلب / الرد request/reply، لذلك قد تُبنَى فوق بروتوكول نقل استدعاء الإجراء البعيد Remote Procedure Call أو اختصارًا RPC، ولكن ليس هذا هو الحال، حيث تُطبَّق عوضًا عن ذلك فوق بروتوكول TCP. يعيد كلُ بروتوكول إنشاءَ آليةٍ بسيطة تشبه آلية RPC على بروتوكول نقلٍ موثوق مثل بروتوكول TCP. ونقول هنا آليةً بسيطة، لأنه ليس كل بروتوكولٍ مصمَّمًا لدعم استدعاءات الإجراءات البعيدة العشوائية ذات النوع الذي ناقشناه سابقًا، ولكنه مصممٌ لإرسال مجموعةٍ محددة من رسائل الطلب والرد عليها. لقد أثبت النهج الذي اتبعه بروتوكول HTTP فعاليته، لذلك اعتمدته معمارية خدمات الويب Web Services architecture على نطاقٍ واسع مع إنشاء آليات RPC العامة فوق بروتوكول HTTP وليس العكس، وسنتحدث عن هذا الموضوع في نهاية هذا القسم. البريد الإلكتروني باستخدام بروتوكولات SMTP وMIME وIMAP يُعَد البريد الإلكتروني أحد أقدم التطبيقات الشبكية، فما الذي قد ترغب فيه أكثر من إرسال رسالةٍ إلى مستخدمٍٍ على الطرف الآخر من رابطٍ يعبر البلاد؟ كان ذلك بمثابة نسخة القرن العشرين من القول "سيد واتسون، تعال إلى هنا أريد أن أراك". لم يتصوَّر روّادُ شبكة أربانت ARPANET البريدَ الإلكتروني على أنه تطبيقٍ رئيسي عندما جرى إنشاء الشبكة، حيث كان الوصول إلى موارد الحوسبة عن بُعد هو الهدف الرئيسي لتصميم الشبكات، ولكن اتضح أنه التطبيق الذي أحدث ضجةً كبيرةً عند ظهوره، أو كما يُقال عنه "التطبيق القاتل killer app" الأصلي للإنترنت. وكما هو مذكورٌ أعلاه، يجب أولًا التمييز بين واجهة المستخدم مثل قارئ بريدك وبين بروتوكولات نقل الرسائل الأساسية مثل بروتوكول SMTP أو بروتوكول IMAP، كما يجب ثانيًا التمييز بين بروتوكول النقل والمعيار المصاحب، مثل معيارَي RFC 822 وMIME الذي يحدد صيغة الرسائل المُتبادَلة. وسنبدأ بالحديث عن صيغة الرسالة في ما يلي. صيغة الرسالة يحدّد معيار RFC 822 الرسائل بحيث تتكون من جزأين هما الترويسة header والجسم body، ويُمثَّل كلا الجزأين مثل نص ASCII. لقد كان جسم الرسالة بسيطًا، ولا يزال هذا هو الحال على الرغم من إضافة معيار MIME على معيار RFC 822 للسماح لجسم الرسالة بحمل جميع أنواع البيانات؛ كما لا تزال هذه البيانات ممثَّلةً مثل نص ASCII، ولكن نظرًا لأنها قد تكون نسخةً مشفَّرةً من صورة JPEG على سبيل المثال، فقد لا يستطيع المستخدم البشري قراءتها بالضرورة. أما ترويسة الرسالة فهي سلسلةٌ من الأسطر المنتهية بالرمز <CRLF> الذي يرمز إلى carriage-return plus line-feed، وهما زوجان من أحرف تحكم نظام ASCII يُستخدمان غالبًا للإشارة إلى نهاية سطرٍ من النص؛ حيث يعني الجزء carriage-return العودة إلى بداية السطر الحالي دون النزول إلى السطر التالي، ويعني الجزء line-feed النزول إلى السطر التالي. تُفصَل الترويسة عن جسم الرسالة بسطرٍ فارغ، ويحتوي كل سطر ترويسة على نوعٍ وقيمةٍ مفصولين بنقطتين. العديد من سطور الترويسة هذه مألوفةٌ للمستخدمين، حيث يُطلب منهم تعبئتها عند إنشاء رسالة بريد إلكتروني، وتحدد الترويسة مستلم الرسالة وتوضّح شيئًا عن الغرض من هذه الرسالة. تُملَأ الترويسات الأخرى بواسطة نظام تسليم البريد الأساسي، مثل وقت إرسال الرسالة والمستخدم الذي أرسل الرسالة وخوادم البريد التي تعاملت مع هذه الرسالة، وهناك العديد من سطور الترويسة الأخرى مثل القارئ المهتم الذي يُحال إلى معيار RFC 822. لقد توسَّع معيار RFC 822 في عام 1993 وجرى تحديثه عدة مراتٍ منذ ذلك الحين للسماح لرسائل البريد الإلكتروني بحمل العديد من أنواع البيانات المختلفة، مثل الصوت والفيديو والصور ومستندات PDF وما إلى ذلك. يتكون معيار MIME من ثلاثة أجزاء أساسية؛ حيث يتمثل الجزء الأول بمجموعةٍ من سطور الترويسة التي تُضاف على المجموعة الأصلية المحددة بواسطة معيار RFC 822، حيث تدل سطور الترويسة هذه على البيانات المنقولة في جسم الرسالة بطرقٍ مختلفة، وتشمل هذه السطور إصدارَ معيار MIME المستخدَم، ووصفًا لما هو موجود في الرسالة يشبه السطر ويمكن أن يقرأه الإنسان، ونوع البيانات الموجودة في الرسالة، وكيف تُشفَّر البيانات الموجودة في جسم الرسالة. يتضمّن الجزء الثاني تعريفات لمجموعةٍ من أنواع المحتويات والأنواع الفرعية، حيث يحدّد معيار MIME على سبيل المثال العديد من أنواع الصور المختلفة، بما في ذلك image/gif وimage/jpeg، ولكلٍ منها معنىً واضح. يشير النوع text/plane مثلًا إلى نصٍ بسيط قد تجده في رسالة بنمط vanilla 822-style، بينما يشير النوع text/richtext إلى رسالةٍ تحتوي على نصٍ "مرمَّز marked up"، أي نصٍ يستخدم خطوطًا خاصة وخطوطًا مائلة وغير ذلك. يحدد المعيار MIME أيضًا نوع التطبيق application على سبيل المثال، حيث تتوافق الأنواع الفرعية مع خرج برامج التطبيق المختلفة مثل النوع application/postscript والنوع application/msword. ويعرّف المعيار MIME أيضًا نوعًا متعدد الأجزاء multipart، يوضّح كيفية هيكلة الرسالة التي تحمل أكثر من نوع بياناتٍ واحد، وهذا يشبه لغة البرمجة التي تحدد كلًا من الأنواع الأساسية مثل الأعداد الصحيحة والعشرية، والأنواع المركبة مثل البُنى والمصفوفات. هناك نوعٌ فرعي متعدد الأجزاء multipart محتمل هو النوع mixed، والذي يشير إلى احتواء الرسالة على مجموعةٍ من أجزاء البيانات المستقلة بترتيبٍ محدّد، وكل جزءٍ له سطر ترويسة خاصٍ به يصِف نوع ذلك الجزء. يحوي الجزء الثالث طريقةَ تشفير أنواع البيانات المختلفة، بحيث يمكن حملها ضمن رسالة البريد الإلكتروني التي تستخدم نظام ASCII. تكمن المشكلة في أنه قد يحتوي أي بايتٍ مؤلفٍ من 8 بتات في الصورة على قيمةٍ من بين 256 قيمةٍ مختلفة ضمن بعض أنواع البيانات مثل صورة JPEG، وتحتوي مجموعة ٌفرعيةٌ واحدة فقط من هذه القيم على أحرف ASCII صالحة. يجب أن تحتوي رسائل البريد الإلكتروني على أحرف ASCII فقط، لأنها قد تمر عبر عددٍ من الأنظمة الوسيطة مثل البوابات التي تفترض أن جميع رسائل البريد الإلكتروني هي رسائل ASCII وقد تُفسِد الرسالة إذا كانت تحتوي على أحرف ليست أحرف ASCII. لمعالجة هذه المشكلة، يستخدم معيار MIME ترميزًا مباشرًا للبيانات الثنائية في مجموعة أحرف ASCII، ويُطلق على هذا الترميز اسم base64، الذي تتمحور فكرته على ربط كل ثلاثة بايتات من البيانات الثنائية الأصلية مع أربعة أحرف ASCII عن طريق تجميع البيانات الثنائية في وحداتٍ مؤلفة من 24 بتًا، وتقسيم كل وحدةٍ إلى أربعة أجزاء، بحيث يتألف كل جزءٍ من 6 بتات، ثم يُربَط كل جزءٍ مؤلفٍ من 6 بتات مع حرفٍ من بين 64 حرف ASCII صالح؛ فمثلًا يُربَط العدد 0 مع الحرف A، والعدد 1 مع الحرف B، وهلم جرًا. إذا نظرت إلى رسالة مشفَّرةٍ باستخدام نظام التشفير base64، فستلاحظ فقط الأحرف الكبيرة والصغيرة التي عددها 52، والأرقام العشرة من 0 إلى 9، والأحرف الخاصة + و/، وتلك هي أول 64 قيمةً في مجموعة أحرف ASCII. يمكن تشفير رسالة MIME المكونة من نصٍ عادي فقط باستخدام نظام ASCII ذو 7 بتات من أجل تسهيل قراءة البريد قدر الإمكان لأولئك الذين ما زالوا يصرّون على استخدام قارئات البريد النصية فقط. تظهر الرسالة التي تحتوي على نصٍ أصلي وصورة JPEG وملف PostScript بجمع كل ما سبق معًا على النحو التالي: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="-------417CA6E2DE4ABCAFBC5" From: Reem Haddad <Reem@cisco.com> To: Anas@cs.Princeton.edu Subject: promised material Date: Mon, 07 Sep 1998 19:45:19 -0400 ---------417CA6E2DE4ABCAFBC5 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Anas,, Here are the jpeg image and draft report I promised. --Reem ---------417CA6E2DE4ABCAFBC5 Content-Type: image/jpeg Content-Transfer-Encoding: base64 ... unreadable encoding of a jpeg figure ---------417CA6E2DE4ABCAFBC5 Content-Type: application/postscript; name="draft.ps" Content-Transfer-Encoding: 7bit ... readable encoding of a PostScript document يشير السطر الموجود في ترويسة الرسالة في هذا المثال إلى احتواء الرسالة على أجزاءٍ مختلفة، يُشار إلى كلٍ منها بسلسلة أحرف لا تظهر في البيانات نفسها، وكل جزءٍ له أسطر Content-Type وContent-Transfer-Encoding الخاصة به. نقل الرسالة نُقِلت غالبية البريد الإلكتروني من مضيفٍ إلى مضيف باستخدام بروتوكول SMTP فقط لسنواتٍ عديدة، حيث يلعب هذا البروتوكول دورًا مركزيًا، ولكنه الآن مجرد بروتوكول بريد إلكتروني واحدٍ من بين عدة بروتوكولات؛ فبروتوكول الوصول إلى الرسائل عبر الإنترنت Internet Message Access Protocol -أو اختصارًا IMAP-، وبروتوكول مكتب البريد Post Office Protocol -أو اختصارًا POP-؛ هما بروتوكولان مُهمان آخران لاسترداد رسائل البريد. سنبدأ مناقشتنا ببروتوكول SMTP، ثم ننتقل إلى بروتوكول IMAP. يتفاعل المستخدمون مع قارئ البريد mail reader عند كتابة رسائل البريد الإلكتروني وحفظها والبحث عنها وقراءتها، حيث تتوفر قارئات بريدٍ لا حصر لها للاختيار من بينها، تمامًا مثل العديد من متصفحات الويب. لقد سجّل المستخدمون في الأيام الأولى للإنترنت الدخولَ إلى الجهاز الذي توجد عليه علبة بريدهم mailbox، وكان قارئ البريد الذي استدعوه برنامجًا تطبيقيًا محليًا يستخرج الرسائل من نظام الملفات؛ بينما يصل المستخدمون اليوم عن بُعد إلى صندوق بريدهم من الحواسيب المحمولة أو الهواتف الذكية ولا يسجلون الدخول أولًا إلى المضيف الذي يخزّن بريدهم (خادم بريد mail server)، ويُستخدَم بروتوكول نقل البريد الثاني، مثل بروتوكولَي POP أو IMAP، لتنزيل البريد الإلكتروني عن بُعد من خادم بريدٍ إلى جهاز المستخدم. يوجد برنامج بريد خفي mail daemon، يُسمى عمليةً process أيضًا، والذي يعمل على كل مضيفٍ يحتوي صندوق بريد. يمكنك التفكير في هذه العملية المُسماة أيضًا وكيل نقل الرسائل message transfer agent أو اختصارًا MTA بأنها تلعب دور مكتب البريد؛ حيث يَمنح المستخدمون أو قرّاء البريد الخاص بهم الرسائل التي يريدون إرسالها للمستخدمين آخرين إلى البرنامج الخفي daemon، والذي يُشغّل بدوره بروتوكول SMTP عبر بروتوكول TCP لنقل الرسالة إلى برنامجٍ خفي يعمل على جهاز آخر، كما يضع الرسائل الواردة في صندوق بريد المستخدم ليتمكن قارئ البريد الخاص بالمستخدم من العثور عليها لاحقًا. يُعَد بروتوكول SMTP بروتوكولًا لتمكين أي شخصٍ من تنفيذه، لذلك يمكن نظريًا أن يكون هناك العديد من التطبيقات المختلفة لبرنامج البريد الخفي، ولكن اتضح أنه لا يوجد سوى عدد قليل من التطبيقات الشائعة مثل برنامج sendmail القديم من نظام Berkeley Unix وبرنامج postfix. يمكن بالتأكيد أن ينشئ وكيل MTA على جهاز المرسل اتصال SMTP / TCP بوكيل MTA على خادم بريد المستلم، ولكن سيمر البريد في كثيرٍ من الحالات ببوابةٍ أو أكثر من بوابات بريد gateways mail في مساره من مضيف المرسل إلى مضيف المستلم، كما ستشغِّل هذه البوابات مثل المضيفين النهائيين أيضًا عملية وكيل نقل الرسائل. ليس من الصدفة تسمية هذه العُقد الوسيطة بالبوابات، لأن وظيفتها هي تخزين وتمرير رسائل البريد الإلكتروني تمامًا مثل بوابة IP التي أشرنا إليها باسم موجّه router، الذي يخزّن ويمرر مخططات بيانات IP، والاختلاف الوحيد هو تخزين بوابة البريد الرسائل عادةً بصورةٍ مؤقتة على القرص التي تكون مستعدةً لمحاولة إعادة إرسال هذه الرسائل إلى الجهاز التالي ضمن مدة عدة أيام، بينما يخزّن موجّه IP مخططات البيانات مؤقتًا في الذاكرة، وهو على استعداد فقط لإعادة محاولة إرسالها ضمن مدة جزءٍ من الثانية. يوضّح الشكل السابق مسارًا من خطوتين من المرسل إلى المستقبل. قد تتساءل، لماذا تُعَد بوابات البريد ضرورية؟ ولماذا لا يستطيع مضيف المرسل إرسال الرسالة إلى مضيف المستقبل؟ إن أحد الأسباب هو أن المستقبل لا يريد تضمين المضيف الذي يقرأ البريد الإلكتروني عليه ضمن عنوانه، والسبب الآخر هو التوسّع، حيث يوجد في المؤسسات الكبيرة عددٌ من الأجهزة المختلفة التي تحتوي على صناديق بريد للمؤسسة. يُرسَل البريد المُسلّم إلى المستخدم Anas@cs.princeton.edu على سبيل المثال أولًا إلى بوابة بريدٍ في قسم علوم الحاسوب CS في جامعة برينستون، أي إلى المضيف المسمّى cs.princeton.edu، ثم يُمرر مُتضمنًا اتصالًا ثانيًا إلى الجهاز الذي يمتلك أنس صندوق بريد عليه. تحتفظ بوابة التمرير بقاعدة بياناتٍ تربط المستخدمين بالجهاز الذي توجد عليه علبة بريدهم؛ فلا يلزم أن يكون المرسل على علمٍ بهذا الاسم المحدد. ستساعدك قائمة سطور الترويسة في الرسالة على تتبّع بوابات البريد التي اجتازتها رسالةٌ معينة، وهناك سببٌ آخر وراء الحاجة إلى بوابات البريد، خاصةً في الأيام الأولى للبريد الإلكتروني، وهو أنه قد لا نستطيع الوصول دائمًا إلى الجهاز الذي يستضيف صندوق بريدِ أيّ مستخدم، وفي هذه الحالة تحتفظ بوابة البريد بالرسالة حتى تسليمها. يُستخدَم اتصال SMTP مستقلًا بين كل مضيفَين لنقل الرسالة إلى مكانٍ أقرب من المستقبل، وذلك بغض النظر عن عدد بوابات البريد الموجودة في المسار. تتضمن كل جلسة SMTP حوارًا بين برنامجي البريد الخفيين mail daemons، حيث يعمل أحدهما مثل عميل والآخر يعمل خادمًا، وقد تُنقل رسائلٌ متعددة بين المضيفين خلال جلسةٍ واحدة. بما أن معيار RFC 822 يعرّف الرسائل باستخدام نظام ASCII بتمثيلٍ أساسي، فلا ينبغي أن يكون مفاجئًا معرفة أن بروتوكول SMTP يعتمد أيضًا على نظام ASCII، وهذا يعني أنه من الممكن أن يتظاهر إنسانٌ على لوحة مفاتيح بأنه برنامج عميل SMTP. يمكن فهم بروتوكول SMTP بصورةٍ أفضل من خلال مثالٍ بسيط. نوضح فيما يلي تبادلًا بين المضيف المرسِل cs.princeton.edu والمضيف المستلِم cisco.com، حيث يحاول المستخدم أنس في جامعة برينستون في هذه الحالة إرسال بريدٍ إلى المستخدمَين ريم وجاد في سيسكو. أُضفيت أسطرٌ فارغة إضافية ليصبح الحوار أكثر قابليةٍ للقراءة. HELO cs.princeton.edu 250 Hello daemon@mail.cs.princeton.edu [128.12.169.24] MAIL FROM:<Anas@cs.princeton.edu> 250 OK RCPT TO:<Reem@cisco.com> 250 OK RCPT TO:<Jad@cisco.com> 550 No such user here DATA 354 Start mail input; end with <CRLF>.<CRLF> Blah blah blah... ...etc. etc. etc. <CRLF>.<CRLF> 250 OK QUIT 221 Closing connection كما ترى، يتضمن بروتوكول SMTP سلسلةً من التبادلات بين العميل والخادم، حيث ينشر العميل أمرًا مثل الأمر QUIT في كل تبادلٍ ويستجيب الخادم برمزٍ مثل 250 و550 و354 و221، كما يعرض الخادم أيضًا شرحًا لهذا الرمز الذي يمكن أن يقرأه الإنسان مثل No such user here. يعرّف العميل أولًا في هذا المثال نفسَه للخادم باستخدام الأمر HELO، الذي يعطي اسم النطاق مثل وسيط، ثم يتحقق الخادم من أن هذا الاسم متوافق مع عنوان IP الذي يستخدمه اتصال TCP؛ حيث ستلاحظ أن الخادم يبيّن عنوان IP هذا مرةً أخرى إلى العميل، ثم يسأل العميلُ الخادمَ عما إذا كان على استعدادٍ لقُبول البريد لمستخدمَين مختلفَين؛ فيستجيب الخادم بالقول "نعم" لأحدهما و"لا" للآخر، ثم يرسل العميل الرسالة التي تنتهي بسطر ونقطةٍ واحدة (".")، وينهي العميل الاتصال أخيرًا. هناك بالطبع العديد من الأوامر ورموز الإرجاع الأخرى، حيث يمكن للخادم الاستجابة لأمر العميل RCPT بالرمز 251، والذي يشير إلى أن المستخدم ليس لديه صندوق بريد على هذا المضيف، ولكن الخادم يَعِد بتمرير الرسالة إلى برنامج بريدٍ خفيٍ آخر، أي يعمل المضيف مثل بوابة بريد، حيث يمكن للعميل مثلًا إصدار عملية VRFY للتحقق من عنوان بريد المستخدم الإلكتروني، ولكن دون إرسال رسالةٍ إلى المستخدم. وسطاء عمليات MAIL وRCPT مثل الوسيطين FROM:<Anas@cs.princeton.edu> وTO:<Reem@cisco.com> على التوالي اللذين يبدوان مثل حقول ترويسة 822. يحلّل برنامج البريد الخفي الرسالةَ لاستخراج المعلومات التي يحتاجها لتشغيل بروتوكول SMTP، حيث يقال بأن المعلومات المُستخرَجة تشكّل مغلّفًا envelope للرسالة، كما يستخدم عميل SMTP هذا المُغلّف لتحديد معامِلات التبادل مع خادم SMTP. إن السبب الذي جعل إرسال البريد sendmail شائعًا للغاية، هو عدم الرغبة في إعادة تطبيق وظيفة تحليل الرسائل. تبدو عناوين البريد الإلكتروني اليوم رديئة جدًا مثل العنوان Anas@cs.princeton.edu، لكنها لم تكن على هذه الحال منذ ظهورها، حيث كانت رؤية عناوين البريد الإلكتروني بالنموذج user%host@site!neighbor أمرًا مألوفًا في الأيام التي سبقت اتصال الجميع بالإنترنت. قارئ البريد تتمثل الخطوة الأخيرة في استرداد المستخدم لرسائله من صندوق البريد فعليًا، وقراءتها والرد عليها، وربما حفظ نسخةٍ منها للرجوع إليها في المستقبل. ويطبّق المستخدم كل هذه الإجراءات من خلال التفاعل مع قارئ البريد mail reader. لقد كان هذا القارئ في الأصل مجرد برنامجٍ يعمل على نفس الجهاز مثل صندوق بريد المستخدم، وفي هذه الحالة يمكنه ببساطة قراءة وكتابة الملف الذي يطبّق صندوق البريد، كما كانت هذه هي الحالة الشائعة في عصر ما قبل الحاسوب المحمول، بينما يصل المستخدم اليوم إلى صندوق بريده من جهازٍ بعيد باستخدام بروتوكول آخر، مثل بروتوكولَي POP أو IMAP. تُعَد مناقشة جوانب واجهة مستخدم قارئ البريد خارج نطاق هذه السلسلة، ولكنه ضمن نطاق الحديث عن بروتوكول الوصول، حيث سنركّز على مناقشة بروتوكول IMAP على وجه الخصوص. يشبه بروتوكولُ IMAP بروتوكولَ SMTP من نواحٍ عديدة، فهو بروتوكول عميل / خادم client/server يعمل عبر بروتوكول TCP، حيث يصدر العميل الذي يعمل على جهاز سطح المكتب أوامرًا للمستخدم على شكل أسطر نصوص ASCII منتهيةً بالرمز <CRLF>، كما يستجيب خادم البريد العامل على الجهاز المُحتفِظ بصندوق بريد المستخدم بالمثل. يبدأ التبادل باستيثاق العميل لنفسه وتحديد صندوق البريد الذي يريد الوصول إليه، ويمكن تمثيل ذلك من خلال مخطط انتقال الحالة البسيط الموضَّح في الشكل الآتي، حيث يُعَد الأمران LOGIN وLOGOUT مثالَين عن الأوامر الممكن للعميل إصدارها، بينما تُعَد الاستجابة OK استجابة خادمٍ محتملة. تتضمن الأوامر الشائعة الأخرى الأمر EXPUNGE؛ الذي يعني إزالة جميع الرسائل المحذوفة، كما تتضمن استجابات الخادم الإضافية الاستجابة NO؛ أي ليس لدى العميل إذنٌ لتنفيذ هذه العملية والاستجابة BAD؛ أي أن الأمر غير صحيح. يعيد الخادم رسالةً بتنسيق MIME ويفك قارئ البريد تشفيرها عندما يطلب المستخدم جلب FETCH هذه الرسالة، كما يحدّد بروتوكول IMAP أيضًا مجموعةً من سمات الرسالة التي يجري تبادلها كأنها جزءٌ من أوامر أخرى، وذلك بغض النظر عن نقل الرسالة نفسها. تتضمن سِمات attributes الرسالة معلوماتٍ مثل حجم الرسالة، وعدة رايات flags مرتبطة بالرسالة مثل الرايات Seen وAnswered وDeleted وRecent، حيث تُستخدَم هذه الرايات للحفاظ على تزامن العميل والخادم؛ أي إذا حذف المستخدم رسالةً في قارئ البريد، فسيحتاج العميل إلى إبلاغ خادم البريد بهذه الحقيقة، وإذا قرّر المستخدم في وقتٍ لاحق إزالة expunge جميع الرسائل المحذوفة، فسيصدر العميل الأمر EXPUNGE إلى الخادم، والذي يفهم أنه يجب إزالة جميع الرسائل المحذوفة مسبقًا من صندوق البريد. أخيرًا، لاحظ أنه عندما يرد المستخدم على رسالةٍ، أو يرسل رسالةً جديدة، فلا يمرر قارئ البريد الرسالة من العميل إلى خادم البريد باستخدام بروتوكول IMAP، ولكنه يستخدم بروتوكول SMTP بدلًا من ذلك؛ وهذا يعني أن خادم بريد المستخدم هو فعليًا أول بوابة بريد يجري اجتيازها على طول المسار من سطح المكتب إلى صندوق بريد المستلم. ترجمة -وبتصرّف- للقسم Traditional Applications من فصل Applications من كتاب Computer Networks: A Systems Approach. اقرأ أيضًا المقال السابق: أمثلة عن أنظمة أمن الشبكات الحاسوبية التحكم في الازدحام المعتمد على المساواة وهندسة حركة المرور المعرفة بالبرمجيات تنصيب وإعداد خدمة البريدالإلكتروني Postfix على أوبنتو استقبال رسائل البريد الإلكتروني على خواديم Ubuntu /Debian وتمريرها إلى عناوين أخرى باستخدام Postfix
-
سنتعلم من خلال هذا المقال كيفية رسم شخصية الكنغر الملاكم اللطيفة باستخدام برنامج الإليستريتور Adobe Illustrator، حيث سنتدرّب على الرسم باستخدام أداة القلم Pen، كما سنستخدم أداة المزج Blend والتأثيرات والفُرش لإضافة أبعاد وتفاصيل إلى رسوماتك، حيث سنصل في النهاية إلى رسم قريب من الشكل التالي: إنشاء مستند جديد شغّل برنامج الإليسريتور وافتح مستندًا جديدًا، ثم اكتب اسمًا مناسبًا واضبط الأبعاد وحدّد البكسلات Pixels، مثل وحدات Units واستخدم نمط الألوان RGB. انتقل بعد ذلك إلى قائمة تحرير Edit ثم تفضيلات Preferences، ثم عام General، واضبط زيادة لوحة المفاتيح Keyboard Increment على 1 بكسل، مع التحقق من الوحدات، إذ ستساعدك هذه الإعدادات طوال عملية الرسم. رسم رأس الكنغر سنبدأ بالرأس من خلال استخدام أداة القلم (P)، حيث سنرسم شكلًا مشابهًا للشكل الموجود أدناه، والذي يكون مليئًا باللون ذي القيم التالية R=227 وG=157 و B=71، بعد ذلك انتقل إلى قائمة تأثيرات Effect ثم Stylize، ثم إضاءة داخلية Inner Glow، وطبّق الإعدادات الموضَّحة في الشكل التالي: رسم عيون الكنغر اختر أداة الدائرة Ellipse Tool (باستخدام الاختصار L) وارسم شكلين دائريين بحيث يبلغ حجم العيون حوالي 17 x 30 بكسل، ولوّنهما باللون الرمادي الفاتح وطبّق تأثير Inner Glow مرةً أخرى. ارسم شكلين دائريين جديدين على العيون واملأهما باللون الأسود. حدّد العيون ثم انسخ والصق في الخلف (باستخدام الاختصار Control+B). احذف المظاهر Appearances الحالية واختر تعبئةً سوداء، ثم حرّك هذه النسخ للأسفل قليلًا بالضغط على مفتاح السهم للأسفل من لوحة المفاتيح. اضبط نمط المزج Blending Mode على الخيار Multiply والتعتيم Opacity على 30%. يمكنك إضافة بريق في العين باستخدام أداة الدائرة Ellipse Tool (باستخدام الاختصار L) وارسم دائرتين على كل عين، بعد ذلك املأهما بتدرج لوني شعاعي radial gradient من الأبيض إلى الأسود، ثم غيّر نمط المزج Blending Mode إلى الخيار Screen. سننشئ الحاجبين من خلال استخدام أداة القلم (P) لرسم مسارين، ثم حدّد حدًا Stroke بمقدار 3 نقاط، واضغط على الخيار Width Profile 5 في لوحة Stroke. وسّع Expand المسارات بالانتقال إلى قائمة كائن Object ثم Expand Appearance، ثم استخدم تدرجًا لونيًا خطيًا من البني إلى الأسود لتلوين الحاجبين. رسم أنف الكنغر يكون الأنف عبارةً عن دائرة أبعادها 30 x 13 بكسل مملوءة بالتدرج اللوني الشعاعي الموضَّح أدناه. انتقل بعدها إلى قائمة تأثير Effect ثم Stylize وطبّق تأثير الظل الساقط Drop Shadow لإنشاء ظل خفيف تحت الأنف. ارسم دائرةً أصغر في منتصف الأنف واملأها باللون ذي القيم التالية R = 213 وG = 113 وB = 28، ثم انتقل إلى قائمة تأثير Effect ثم الضبابية Blur ثم Gaussian Blur، وطبّق نصف قطر Radius بمقدار 2 بكسل، وقلّل التعتيم Opacity إلى 50%، عندها ستحصل على ضوء على الأنف. استخدم أداة القلم (P) مرةً أخرى وارسم مسارًا فوق الأنف، ثم حدّد حدًا بمقدار 5 نقاط باللون R = 213 وG = 113 وB = 26، وحدّد الخيار Width Profile 1 في لوحة Stroke، ثم طبّق التأثير Gaussian Blur بمقدار 6 بكسلات وقلّل التعتيم Opacity إلى 80%. ارسم دائرةً أبعادها 30 x 15 بكسل أكبر قليلًا من الأنف وضعها خلفه، ثم املأها باللون R = 103 وG = 16 وB = 12 واضبط نمط المزج Blending Mode على الخيار Soft Light والتعتيم Opacity على 75%. رسم فم الكنغر استخدم أداة القلم (P) لرسم شكل الفم كما في الشكل التالي، واملأه باللون R = 103 وG = 16 وB = 12، ثم طبّق تأثير Inner Glow. يمكنك إضافة بعض التفاصيل حول الفم من خلال استخدام أداة القلم (P) لرسم بعض الخطوط كما هو موضّح في الشكل الآتي. أعطِ هذه الخطوط حدًا مقداره 0.5 نقطة باللون الأسود وحدّد الخيار Width Profile 1، ثم قلّل التعتيم Opacity إلى 50% للمسار تحت الفم فقط. ارسم شكل اللسان باستخدام أداة القلم (P) واملأه بالتدرج اللوني الخطي الموضّح أدناه، ثم طبّق تأثير Inner Glow. رسم أذني الكنغر استخدم أداة القلم (P) لرسم شكل الأذن اليمنى ولوّنها باللون R = 220 وG = 161 وB = 67، ثم طبّق تأثير Inner Glow لمنحه بعض الأبعاد. ارسم شكلًا مشابهًا للشكل السابق ولكن أصغر منه، وذلك في منتصف الأذن، ثم لوّنه باللون الوردي. حدّد الشكل الوردي ثم انسخه، والصق النسخة في المقدمة (باستخدام الاختصار Control+F). صغّر حجم هذه النسخة واحتفظ باللون الوردي نفسه، وضعها في المكان الموضّح أدناه. أنشئ نسخةً أخرى أصغر واملأها بالتدرج اللوني الخطي الموضّح أدناه، ثم اضبط التدرج اللوني، بحيث يكون اللون الأحمر الداكن في الزاوية الداخلية والأحمر الفاتح في الزاوية الخارجية. حدّد هاتين النسختين وانتقل إلى قائمة كائن Object ثم Blend ثم خيارات المزج Blend Options، ثم اضبط خيار الخطوات المحدَّدة Specified Steps على القيمة 20 ثم ارجع إلى قائمة كائن Object ثم Blend، ثم Make، أو استخدم الاختصار Alt+Control+B. ارسم أذن الكنغر اليسرى باستخدام الآلية نفسها التي رسمنا بها الأذن اليمنى، وبذلك أصبح رأس الكنغر جاهزًا. رسم جسم وذراعي الكنغر سنبدأ في رسم الجسم في الخطوة الحالية. استخدم أداة القلم (P) لرسم شكل مشابه للشكل التالي الذي يمثّل العنق والظهر معًا، ولوّنه باللون R = 227 وG = 157 وB = 73، ثم طبّق تأثير Inner Glow. ارسم الشكل أدناه الذي يمثّل العنق والبطن معًا، واملأه بالتدرج اللوني الخطي الموضَّح واضبط زاوية التدرج اللوني، بحيث يكون اللون الأحمر في الجانب الأيسر السفلي من البطن (يمثّل ظل قفّازات الملاكمة)، ثم طبّق تأثير Inner Glow. ارسم شكلًا صغيرًا مثل الذراع في الخلف ولوّنه باللون ذي القيم التالية R = 227 وG = 157 وB = 71، ثم طبّق تأثير Inner Glow مرةً أخرى. سنرسم الآن الذراع أمام الجسم، وسنلوّنها باللون ذي القيم R = 227 وG = 157 وB = 73، ثم سنطبّق تأثير Inner Glow. لن تبدو المنطقة الموجودة أعلى الذراع جيدةً هنا، ولكننا سنصلحها باستخدام قناع التعتيم Opacity mask لاحقًا. حدّد شكل الذراع ثم انسخه والصق النسخة في الخلف باستخدام الاختصار Control+B. حدّد هذه النسخة مع شكل الذي خلفها، ثم اضغط على دمج Unite في لوحة مستكشف المسار Pathfinder للحصول على شكل جديد، وحافظ على المظهر نفسه. حدّد شكل الذراع ثم انسخه والصق النسخة في الأمام باستخدام الاختصار Control+F، ثم املأ هذه النسخة بتدرج لوني خطي من الأبيض إلى الأسود. اضبط التدرج اللوني، بحيث يكون اللون الأسود في الأعلى، وهنا سيصبح هذا الجزء غير مرئي، كما سيكون اللون الأبيض في الأسفل، بحيث يبقى باقي الذراع مرئيًا بعد تطبيق قناع التعتيم. حدّد شكل الذراع الأصلي مع النسخة المملوءة بالتدرج اللوني من الأبيض إلى الأسود وانتقل إلى لوحة الشفافية Transparency، ثم افتح القائمة وحدد خيار إنشاء قناع التعتيم Make Opacity Mask، مما يؤدي إلى تحسين شكل منطقة الذراع العلوية. استخدم أداة القلم (P) لرسم مسار قصير فوق الكتف، وأعطِه حدًا بمقدار 1 نقطة باستخدام تدرج لوني خطي من الأبيض إلى البني، وحدّد الخيار Width Profile 1، ثم طبّق التأثير Gaussian Blur بمقدار 2 بكسل واضبط نمط المزج على الخيار Multiply. رسم قفازات الملاكمة ارسم شكل القفاز باستخدام أداة القلم (P)، ولوّنها باللون R = 227 وG = 6 وB = 7، ثم طبّق تأثير Inner Glow لمنحه بعض الأبعاد. ارسم مسارًا قصيرًا في جزء القفاز العلوي لإنشاء ثنية فيه، وامنحه حدًا بمقدار 1 نقطة باستخدام تدرج لوني خطي من الأبيض إلى البني وحدّد الخيار Width Profile 1، ثم طبّق تأثير Gaussian Blur بمقدار 2 بكسل واضبط نمط المزج على الخيار Multiply. يمكنك إضافة بعض اللمعان باستخدام أداة الدائرة Ellipse Tool وذلك باعتماد الاختصار L، وهنا ارسم شكلين دائريين بأحجام مختلفة على القفاز، ثم لوّنهما باللون الأبيض وطبّق تأثير Gaussian Blur وتأثير Feather باستخدام الإعدادات الموضَّحة أدناه وقلّل التعتيم إلى 50%. ارسم قفاز الملاكمة الآخر بالطريقة والإعدادات نفسها. رسم أرجل الكنغر ارسم شكل الرِجل الأمامية كما في الشكل أدناه، ولوّنها باللون R = 227 وG = 157 وB = 73 وطبّق تأثير Inner Glow. استخدم أداة القلم (P) لرسم مسار في جزء الرجل العلوي لإنشاء ثنية فيه، وامنحه حدًا بمقدار 6 نقاط باستخدام تدرج لوني خطي من البني إلى الأبيض، وحدّد الخيار Width Profile 4. يجب أن يتجه رأس الفرشاة إلى الأسفل، وإلّا فيجب الضغط على خيار اقلب أفقيًا Flip Along في لوحة Stroke. طبّق تأثير Gaussian Blur بمقدار 10 بكسلات، ثم اضبط نمط المزج على الخيار Multiply والتعتيم على 50%. حدّد شكل رجل الكنغر ثم انسخه والصق النسخة في المكان نفسه باستخدام الاختصار Shift+Control+V، واضبط لون حد وتعبئة هذه النسخة على لا شيء. حدّد مسار الثنية مع نسخة الرجل وانتقل إلى قائمة كائن Object ثم قناع القطع Clipping Mask، ثم Make، أو استخدم الاختصار Control+7. ارسم شكل الرجل الخلفية كما في الشكل أدناه ولوّنه باللون ذي القيم R = 204 وG = 131 وB = 41، ثم طبّق تأثير Inner Glow. رسم قدم الكنغر ارسم شكل القدم الأمامية ثم ارسم مسارًا في الأعلى كما هو مبين أدناه. حدّد القدم والمسار واضغط على تقسيم Divide في لوحة مستكشف المسار Pathfinder، ثم فك التجميع Ungroup باستخدام الاختصار Shift+Control+G، وعندها ستحصل على شكلين منفصلين. لوّن الشكل الأرجواني الذي حصلتَ عليه في الخطوة السابقة باستخدام اللون R = 227 وG = 157 وB = 73، وطبّق تأثير Inner Glow. لوّن الشكل الأزرق باللون R = 186 وG = 60 وB = 9، ثم استخدم أداة الدائرة (L) لرسم ثلاثة أشكال دائرية ولوّنها باللون الوردي الفاتح. انسخ هذه الأشكال الدائرية والصقها في الخلف باستخدام الاختصار Control+B، ثم حرّك هذه النسخ بمقدار 1 بكسل إلى اليسار و1 بكسل للأسفل باستخدام مفاتيح الأسهم على لوحة المفاتيح، بعد ذلك غيّر لونها إلى اللون الأسود، وغيّر نمط المزج إلى الخيار Multiply مع تقليل التعتيم إلى 40%. جمّع Group باستخدام الاختصار Control+G جميع الأشكال التي تتكون منها القدم، وأنشئ نسخةً منها، ثم أرسلها إلى الرِجل الخلفية. هنا يمكنك جعل الدوائر الثلاث أصغر حجمًا اختياريًا. رسم ذيل الكنغر ارسم شكل الذيل باستخدام أداة القلم (P) ثم ارسم مسارًا في منتصفه. حدّد كلا الشكلين واضغط على الخيار تقسيم Divide في لوحة مستكشف المسار Pathfinder، ثم فك التجميع عن طريق الاختصار Shift+Control+G، عندها ستحصل على شكلين منفصلين. لوّن الشكل الأرجواني الذي حصلت عليه في الخطوة السابقة باللون R = 227 وG = 157 وB = 73، ثم طبّق تأثير Inner Glow. لوّن الشكل الأزرق باللون R = 239 وG = 208 وB = 196، ثم طبّق تأثير Inner Glow. إنشاء الظلال النهائية استخدم أداة الدائرة (L) لرسم شكلين دائريين بأحجام مختلفة على طرف الذيل. لوّن الدائرة الصغيرة باللون الأسود مع تعتيم 100%، ولوّن الشكل الدائري الأكبر باللون الأسود مع تعتيم 0%. حدّد كلا الشكلين وانتقل قائمة كائن إلى Object ثم Blend، ثم خيارات المزج Blend Options. اضبط خيار الخطوات المحدَّدة Specified Steps على القيمة 20، ثم ارجع إلى قائمة كائن Object ثم مزج Blend، بعدها Make باستخدام الاختصارAlt+Control+B، ثم أرسِل المجموعة الناتجة عن المزج خلف الذيل. استخدم أداة القلم (P) لرسم شكل مثل الشكل أدناه أسفل الذقن، ولوّنه باللون R = 103 وG = 16 وB = 12، ثم اضبط نمط المزج Blending Mode على الخيار Soft Light وقلل التعتيم إلى 75%، وعندها ستحصل على ظل تحت الذقن. حرّك هذا الشكل خلف الرأس، ولكن أمام العنق في لوحة الطبقات Layers. بهكذا أصبح الكنغر جاهزًا كما يلي: ترجمة -وبتصرّف- للمقال How to Draw a Boxing Kangaroo Character in Adobe Illustrator لصاحبه Mihaly Varga. اقرأ أيضًا إنشاء ساعة كاسيو Casio في الإليستريتور مقدمة إلى برنامج أدوبي إليستريتور Adobe Illustrator والتعرف على واجهته كيفية تصميم قبعة ساحر باستخدام برنامج Adobe Illustrator كيف تصمم حوض أسماك باستخدام برنامج Adobe Illustrator