لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 04/13/21 في كل الموقع
-
الذكاء الصنعي وخوارزميات تعلم الآلة AI/ML تتفق جميع التقنيات والخوارزميات التي تندرج تحت مسمى الذكاء الصنعي Artificial Intelligence وتعلم الآلة Machine Learning باختلاف أطيافها على البدء بتحليل البيانات الخام والبحث فيها (بطرق خوارزمية ممنهجة) لاستكشاف ما تحتويه من أنماط وعلاقات في داخلها وبين كياناتها. إن معرفة مثل تلك الأنماط والعلاقات ستساعدنا على بناء نماذج قادرة على استقراء الجوهر العام المشترك الذي يجمع ويصنف تلك الكتل من البيانات على الرغم من الاختلافات في التفاصيل الهامشية والتي قد تكون كبيرة ظاهريا ومربكة في عين من لا يتمتع بالخبرة في مجال الدراسة. لقد أثبتت مثل هذه النظم فعاليتها في حوسبة العديد من المهام التي كان يعتقد حتى وقت قريب أنها عصية على عالم البرمجيات، ساعد على ذلك الطفرة التي شهدتها عتاديات الحواسيب في العقد الأخير والتقدم الهائل في إمكانيات الحوسبة المتوازية لوحدات المعالجة الرسومية GPU، وكذلك توافر حلول الحوسبة السحابية لشريحة أكبر من فرق التطوير البرمجية التي كان يصعب عليها في الماضي الحصول على حواسيب فائقة بسهولة. إننا نشهد في الفترة الحالية انتقالا وتحولا جذريا في مفاهيم علم البرمجة مقارنة بما سبق وبما تعلمناه أو استخدمناه خلال القرن الماضي (كالبرمجة الوظيفية ومخططات سير العمل، أو حتى البرمجة الغرضية التوجه بكائناتها وطرائقها)، فالمبرمج هو من كان يضع منطق العمل وخوارزميته ليحدد أسلوب معالجة المدخلات وتوليد المخرجات، وقد امتازت فترة ثمانينيات وتسعينيات القرن الماضي بوفرة القدرة الحاسوبية مقارنة بكمية البيانات المتوافرة للمعالجة أصلا، لكن ما نشهده الآن في القرن الحادي والعشرين قد قلب هذه المعادلة رأسا على عقب، فقد أصبح لدينا فائض كبير من البيانات التي تجمع من كل حدب وصوب على مدار الساعة بدءا من جوالاتنا (التي ما عادت وسيلة للاتصال فقط) وصولا إلى الأقمار الاصطناعية في مداراتها حول الأرض. إن هذا المستوى العالي من الأتمتة في حياتنا ومجتمعاتنا نتج عنه كم هائل من البيانات التي تجاوزت بمراحل القدرة على تحليلها واستخلاص المعلومات منها بالطرق التقليدية، وهو ما أعاد فتح الأبواب مجددا لتقنيات الذكاء الصنعي التي كان لها مجد سابق منتصف القرن الماضي لكنه زال بعد أن عجزت القدرات العتادية في ذلك الحين عن مواكبة شطحات المتنورين من رواد هذا الحقل من العلوم، لكننا اليوم وبتضافر جهود الباحثين في مجالات شتى مثل علم البيانات والإحصاء والحواسيب بلا شك، أصبحنا قادرين على تنفيذ ما كانوا يتحدثون عنه ضمن طيف واسع من التطبيقات ربما بات يتجاوز أقصى طموحاتهم. الشبكات العصبية Neural Networks في جزء من لوحة رافائييل الجصيّة "مدرسة أثينا" تم رسم أفلاطون وأرسطو بشكل يعبّر عن نظريّة كل منهما في المعرفة، فأرسطو يومئ نحو الأرض فيما يشير أفلاطون بإصبعه نحو السماء، حيث كان ينظر أرسطو إلى الطبيعة بحثا عن إجابات في حين أن أفلاطون يبحث عن المثالي. وها نحن ننتقل في عالم البرمجة من فلسفة أفلاطون التي كنا نتّبعها في أدوات بناء تطبيقاتنا من لغات برمجة وما تحويه من متغيرات وتوابع وعبارات شرطية وحلقات وسواها، إلى فلسفة أرسطو حيث نبحث في كيفية عمل أدمغتنا ونحاول محاكاتها في بنيتها وطريقة عملها، وهكذا تماما ولد مجال الشبكات العصبية ضمن علوم الذكاء الصنعي. حيث ابتدأت المحاكاة على مستوى الخلية العصبية (العصبون)، فالعصبونات هي خلايا تتألف من جسم مركزي يتضمن نواة الخلية ويمتد منه استطالة وحيدة تكوّن ليف عصبي طويل يقوم مقام السلك الناقل للإشارة الخارجة من الخلية عند نهايته تفرعات كثيرة تنتهي بعقد مشبكية صغيرة، أما في الطرف الآخر من جسم الخلية العصبية فتبرز تفرّعات تخرج في كافة الاتجاهات والتي عن طريقها ترد إلى جسم الخلية البيانات الداخلة، ولابد للإشارات لكي تمر من عصبون إلى آخر أن تجتاز الفجوة الضيقة ما بين عقدة المشبك والجسم أو التفرّع للعصبون التالي. تتلقى الخلية العصبية عدة تنبيهات من الخلايا المجاورة تؤدي إلى شحنها، فإذا وصلت تلك الشحنة إلى عتبة معينة ينبثق كمون كهربائي عند قاعدة المحور وينتشر دفعة واحدة على طوله. لا تستجيب العصبونات لمختلف التنبيهات بشكل متشابه، فلكل منبه درجة أهمية تزيد أو تنقص، كما أن خرج العصبون لا يمتاز بالتدرج، فإما أن تكون هناك نبضة عصبية تنتشر عبر المحور إلى الخلايا المجاورة أو لن يكون هنالك شيء على الإطلاق. طبعا هذا الوصف لبنية العصبون وطريقة عمله فيه تبسيط شديد لحقيقة الأمر، لكن هذا المستوى من الشرح يفي بالغرض. على الرغم من أننا عندما نحاكي عمل العصبون (بفرض أننا نعلم طريقة عمله تماما) لن نحصل على عصبون حقيقي، لكننا سنحصل على معالجة حقيقية للمعلومات كما لو كان العصبون هو من قام بها، وهذا هو بيت القصيد. إن التمثيل الرياضي للعصبون يفترض أن لدينا n إشارة دخل سنرمز إليها بالمقادير X1, X2, …, Xn يرتبط كل منها بوزن أو تثقيل للتعبير عن دور المشابك العصبية كون العصبونات لا تستجيب بشكل متشابه لمختلف التنبيهات كما اتفقنا سابقا. سنرمز إلى تلك الأوزان بالمقادير W1, W2, …, Wn والتي قد تكون قيما موجبة أو حتى سالبة تكبر أو تصغر بحسب طبيعة ودور إشارة الدخل المرتبطة بها سواء كانت محفّزة أم مثبّطة وإلى أي قدر هي كذلك. وهكذا يمكننا التعبير عن مجمل الدخل الآتي إلى العصبون المفرد بالشكل الرياضي التالي: من جهة أخرى، لتمثيل إشارة خرج العصبون نحتاج إلى دالة رياضية تستطيع توصيف عمل قانون الكل أو لا شيء تبعا لعتبة معيّنة، وهناك عدّة خيارات رياضية شائعة قد يتم تفضيل إحداها على الأخرى بحسب طبيعة البيانات التي نتعامل معها نذكر منها على سبيل المثال لا الحصر: Sigmoid (للقيم الثنائية 0/1 أو نعم/لا أو حتى ذكر/أنثى)، TanH (للفئات أو التصنيفات المتقطعة مثل الأعراق: عربي، أوروبي، أفريقي، آسيوي، هندي، الخ.)، وكذلك ReLU (للقيم المتصلة كالعمر مثلا). يوضح الشكل التالي الصيغة الرياضية والتمثيل البياني الذي يظهر العلاقة فيما بين الدخل والخرج لكل منها: بعد أن قمنا بتوصيف العصبون بشكل رياضي مبسّط، علينا الانتقال للحديث عن بنية الشبكات التي تنتظم بها تلك العصبونات وطرق ارتباطها بعضها ببعض، سنتناول بالشرح شكلا واحدا من أشكال بناء الشبكات العصبية، لكن ذلك لا يعني عدم وجود معماريات أخرى لبناء تلك الشبكات. سنفترض أن العصبونات تنتظم في طبقات ولكل طبقة عدد من العصبونات بحيث أن خرج أي عصبون من هذه الطبقة يتم إيصاله إلى كل عصبونات الطبقة التالية. يمكن تمييز الطبقة الأولى على أنـها طبقة الإدخال والتي تتلقى بياناتها من الوسط الخارجي للشبكة العصبية، كذلك نعرّف طبقة الإخراج على أنـها الطبقة الأخيرة والتي ترسل ناتج معالجة البيانات ثانية إلى الوسط الخارجي، في حين يسمّى كل ما عدى ذلك من طبقات بين هاتين الطبقتين بالطبقات الخفية. كما نلاحظ فإن عدد العصبونات في كل من طبقتي الإدخال والإخراج محدد بحسب طبيعة الوظيفة المناطة بالشبكة العصبية (مثلا عدد العنصورات Pixels الإجمالي في الصورة لكل قناة لونية RGB في الدخل، وعدد الفئات المراد تصنيفها في الخرج)، أمّا عدد الطبقات الخفية وعدد العصبونات في كل منها فلا توجد قواعد ضابطة وواضحة لذلك. مكتبة TensorFlow من Google مكتبة TensorFlow هي منصة متكاملة لتدريب وبناء تطبيقات الذكاء الصنعي وتعلم الآلة بالاعتماد على تقنية الشبكات العصبية طورتها شركة Google باستخدام لغة Python ونشرتها تحت ترخيص البرمجيات الحرة والمفتوحة المصدر، وهي تعد في الوقت الراهن واحدة من أكثر المكتبات شهرة واستخداما في هذا المجال (رغم أنها ليست الوحيدة قطعا)، وذلك نظرا لغزارة وتنوع المصادر والأدوات المتوافرة لها والتي تتيح للباحثين القدرة على بناء واستخدام تطبيقات الذكاء الصنعي في أعمالهم. للمزيد حول TensorFlow يمكنكم الإطلاع على الموقع الرسمي لها على الرابط التالي: https://www.tensorflow.org دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن مكنز TensorFlow Hub للنماذج إحدى أهم التحديات في عالم الذكاء الصنعي بشكل خاص، وعلوم البيانات بشكل عام، هي القدرة على إعادة استخدام ما سبق وما توصل إليه فريق تطوير آخر سابقًا، لذا قدمت Google هذا المكنز لوضع طريقة معيارية في مشاركة نماذج الشبكات العصبية بحيث تتضمن كافة المعلومات المطلوبة لإعادة استخدامها سواء كانت بنية الشبكة العصبية ذاتها (من حيث عدد الطبقات، ونوعها، وعدد العصبونات في كل منها، ونوع الروابط فيما بينها، الخ.)، إضافة إلى قيم الوسطاء والأوزان المختلفة في تلك الشبكة العصبية بعد إتمام عملية تدريبها. يمكن أخذ هذه النماذج وإعادة استخدامها في مهام مختلفة أو حتى إعادة تدريبها بسهولة مستخدمين تقنية تدعى نقل التعلم والتي سنتحدث عنها لاحقا في هذا الدرس. لمزيد من المعلومات حول هذا المكنز يمكنكم زيارة الموقع الرسمي له على الرابط التالي: https://www.tensorflow.org/hub. نموذج MobileNet V2 للرؤية الحاسوبية تم تصميم هذه العائلة من نماذج الشبكات العصبية المخصصة لمهام الرؤية الحاسوبية عامة الأغراض مثل التصنيف وتحديد الأجزاء والعناصر في الصورة وسواها من الوظائف مع مراعاة المصادر المحدودة التي قد تكون متوافرة على الأجهزة المحمولة. إن القدرة على تشغيل تطبيقات التعلم العميق على أجهزة الجوال الشخصية ستحسن من تجربة المستخدم نظرا لأنها ستكون متاحة في أي زمان ومكان بغض النظر عن الحاجة إلى الاتصال بمصادر خارجية على الإنترنت، وهو ما سيترافق مع فوائد إضافية لجهة الأمان والخصوصية والاقتصاد في استهلاك الطاقة. لمزيد من المعلومات يمكنك الإطلاع على الرابط المدرج ضمن قسم المراجع1. تقنية نقل التعلم Transfer Learning إن النماذج الحديثة للتعرف على الصور تحتوي على الملايين من الوسطاء (من أوزان للروابط ما بين الآلاف من العصبونات المرصوفة في العشرات من الطبقات الخفية) والتي يتطلب تدريبها من الصفر كما كبيرا من بيانات التدريب من جهة، والكثير من الطاقة الحاسوبية من جهة أخرى (تقدّر بالمئات من ساعات الحساب على وحدات المعالجة الرسومية GPU أو حتى أكثر بكثير). إن تقنية نقل التعلم تعتمد على حيلة ذكية لاختصار كم المصادر الكبير الذي نحتاجه لتطوير نموذج رؤية حاسوبية جديد تخصص مهاراته في التعرف على نمط مختلف من الصور (مثلا صور الأشعة السينية لتشخيص وجود أورام سرطانية محتملة عوض التعرف على الأنواع المختلفة من الأزهار البرية). تقوم الفكرة على استبدال الطبقة الأخيرة فقط من شبكة عصبية سبق وأن تم تدريبها بشكل جيد على تصنيف الصور ولو لغايات مختلفة، مستفيدين بذلك من كم المهارات التي اكتسبتها بنية الطبقات الخفية في ذلك النموذج، ابتداء من التعرف على أنماط النسج والأشكال وترابط الأجزاء وعلاقات الألوان وغيرها مما هو مشترك بالعموم بين كافة نظم الرؤية الحاسوبية، والتي يمكن إعادة استخدامها ومشاركتها بين النماذج المختلفة. وحدها الطبقة الأخيرة فقط الخاصة بالأصناف تتغير بتغير الغاية والهدف من النموذج الذي يجري تطويره وتخصيصه، لذا هي وحدها التي سيتم تدريبها فعليا عند استخدام تقنية نقل التعلم هذه. لمزيد من المعلومات حول هذه التقنية في التعليم يمكنكم الإطلاع على رابط ورقة البحث العلمي المدرجة ضمن قسم المراجع أدناه2. تجهيز بيئة العمل سنستخدم منصة Docker المخصصة لتطوير ونشر وإدارة التطبيقات باستخدام فكرة الحاويات وذلك لتسهيل بناء بيئة العمل لدينا من أجل تنفيذ التطبيق العملي في هذه الجلسة، حيث أن الحاويات هي عبارة عن حزم تنفيذية خفيفة وقائمة بذاتها لتطبيق ما، تحوي كل المكتبات وملفات الإمداد والاعتماديات والأجزاء الأخرى الضرورية ليعمل التطبيق ضمن بيئة معزولة، هذا عدى عن أنها خفيفة لأنها لا تتطلب حملا إضافيا كالأجهزة الافتراضية كونها تعمل ضمن نواة النظام المضيف مباشرة دون الحاجة إلى نظام ضيف، وبذلك نزيل عن كاهلنا في هذه المرحلة أي تعقيدات تختص بالتنصيب والربط والإعداد لمختلف مكونات بيئة التطوير الخاصة بمكتبة TensorFlow وهي مهمة ليست باليسيرة على المبتدئ، لذا عليك القيام بتثبيت Docker على حاسوبك الشخصي من الموقع الرسمي https://www.docker.com/ قبل الانتقال إلى الخطوة التالية. اطلع على مقال «التعامل مع حاويات Docker» في قسم دوكر في أكاديمية حسوب. تطبيق عملي يقوم بتحديد جنس الشخص من صورة وجهه بداية نقوم بتنصيب TensorFlow على Docker ضمن حاوية تحت تسمية hsoub-ft، قد تتطلب هذه الخطوة بعض الوقت نظرا لكون حجم صورة الحاوية التي سيتم سحبها وتنزيلها عبر الإنترنت يتجاوز 1GB: docker pull tensorflow/tensorflow docker run --name hsoub-tf -it -d tensorflow/tensorflow:latest بعد ذلك نقوم بالدخول إلى سطر الأوامر ضمن الحاوية ونقوم بتنصيب الإصدار 2.0 على الأقل من مكتبة TensorFlow وكذلك الإصدار 0.6 على الأقل من نموذج تصنيف الصور3 الذي سنستخدمه والمستضاف في مكنز TensorFlow Hub، و بعد إتمام هذه الخطوات نخرج باستخدام الأمر exit في سطر الأوامر للعودة إلى الجهاز المضيف: docker exec -it hsoub-tf bash pip install "tensorflow~=2.0" pip install "tensorflow-hub[make_image_classifier]~=0.6" exit الخطوة التالية هي تحضير بيانات التدريب وذلك من خلال الحصول على الصور التي سيتم تدريب الشبكة عليها، في مثالنا هذا استخدمنا مجموعة جزئية تتكون من حوالي 2000 صورة مقسمة إلى فئتين ذكور وإناث وهي مقتطعة من مجموعة بيانات أكبر تدعى UTKFace4 المتاحة للاستخدامات غير التجارية والتي تتضمن بالأساس ما يزيد عن 20 ألف صورة وجه. تم اختيار الصور التي سوف نستخدمها في عملية التدريب بحيث تكون متوازنة من حيث الجنس (أي أن عدد الصور الخاصة بالذكور يساوي تقريبا عددها للإناث) والعرقيات (أي تقارب عدد الأشخاص من ذوي الأصول الأوروبية والأفريقية والهندية الخ.) وذلك لضمان عدم التحيز، إضافة إلى أن الصور تخص أشخاصا تتراوح أعمارهم ما بين 20 إلى 40 سنة. للمتابعة عليك تحميل الملف المضغوط المرفق مع هذا المحتوى، ثم قم بفك ضغطه على حاسوبك وستحصل على مجلد باسم training داخله ثلاث مجلدات هي images و output وكذلك test. ستلاحظ ضمن مجلد images أن هنالك مجلد فرعي لك تصنيف تريد من شبكتك العصبية أن تتعرف عليه (في حالتنا هذه هناك مجلدان فقط بتسمية Male و Female) داخل كل منهما مجموعة الصور التي تنتمي إلى ذلك التصنيف. من جهة أخرى فإن مجلد output هو فارغ حاليا لكنه المكان الذي سيتم فيه حفظ الشبكة العصبية بعد إتمام عملية تدريبها (أي حيث سنخزن النموذج الناتج)، أخيرا ستجد في المجلد الثالث test شيفرة برمجية بسيطة لاختبار النموذج الناتج وبعض الصور التي لم يسبق له أن رآها من قبل (أي أنها لم تكن موجودة أصلا ضمن صور وبيانات التدريب). نحن بحاجة إلى نقل كل هذه المجلدات وما فيها من ملفات إلى داخل الحاوية hsoub-tf وذلك باستخدام الأمر التالي على الجهاز المضيف: docker cp .\training hsoub-tf:/training الآن نستطيع الانتقال مجددا إلى سطر الأوامر ضمن الحاوية باستخدام الأمر التالي: docker exec -it hsoub-tf bash وبعد ذلك يمكننا بدء عملية التدريب باستخدام الأمر التالي: make_image_classifier \ --image_dir training/images dir \ --tfhub_module https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4 \ --image_size 224 \ --saved_model_dir training/output/model \ --labels_output_file training/output/class_labels.txt \ --tflite_output_file training/output/mobile_model.tflite إن وسطاء الأمر التنفيذي السابق تحدد المسار الذي يحتوي على مجلدات الصور التي سيتم استخدامها في عملية التدريب (أي مسار المجلد ضمن الحاوية وليس على الجهاز المضيف)، وكذلك مصدر النموذج الأصلي الذي ستطبق عليه تقنية نقل التعلم باستبدال طبقته الأخيرة، بعد ذلك نحدد الأبعاد المطلوبة للصور ليتم تحجيمها تلقائيا لتلائم هذه الأبعاد (فهذا محدد ومرتبط بطبقة الإدخال في نموذج الشبكة العصبية المستخدمة)، في حالتنا نحن نستخدم نموذج MobileNet V2 والذي يفترض أبعاد الصورة هي 224 عنصورة/بيكسل للطول والعرض، بعد ذلك نحدد المكان الذي سيتم فيه حفظ النموذج المدرّب الناتج، وكذلك أين سيتم حفظ التسميات المرافقة لعصبونات الخرج من شبكتنا العصبية بالترتيب، وأخيرا أين سيتم تصدير هذا النموذج بصيغة tflite المحزومة والموضبة لتطبيقات الجوال. في نهاية عملية التدريب (والتي قد تطول تبعا لعدد الصور من جهة، ولسرعة الحاسوب الذي تتم عليه عملية التدريب من جهة أخرى)، سنجد أننا حصلنا على نموذج شبكة عصبية يستطيع تمييز جنس الشخص من صورته بدقة تتعدى 80% وذلك بمجهود بسيط جدا دون الحاجة إلى عمليات ضبط ومعايرة فائقة التخصص لوسطاء بناء وتدريب الشبكة العصبية، ودون الحاجة كذلك إلى ساعات وساعات من التدريب ولا إلى آلاف وآلاف من الصورة للتدرب عليها! إنها بحق نتيجة مرضية لأوائل مغامراتك مع الشبكات العصبية، لكنها مجرد البداية. ها قد حان الوقت لتجربة النموذج الذي قمنا بتدريبه على صور لم يسبق له أن رآها من قبل، للقيام بذلك سوف نستخدم برنامج معد مسبقا لهذه الغاية5 وهو مكتوب بلغة Python وموجود داخل المجلد training/test صحبة بضعة صور كأمثلة للتجريب (ويمكن أن تستخدم صورك الخاصة في هذه المرحلة)، حيث ستتم عملية الاختبار لكل صورة من خلال الأمر التالي (وفيه نشير إلى مسار الشبكة العصبية التي سيتم تحميلها واستخدامها، والملف النصي الذي يتضمن اسم التصنيف الخاص بكل عصبون خرج ضمن هذه الشبكة بالترتيب، وأخيرا مسار الصورة المراد تصنيفها): python training/test/label_image.py \ --input_mean 0 --input_std 255 \ --model_file training/output/mobile_model.tflite \ --label_file training/output/class_labels.txt \ --image training/test/Ahmed_Zewail.jpg بعد إتمام تدريبنا واختبارنا للشبكة العصبية حان الوقت للخروج من بيئة التدريب هذه باستخدام الأمر exit للعودة إلى سطر الأوامر على الجهاز المضيف، ومن ثم سنرغب طبعا باستخراج النموذج الذي قمنا بتعليمه خلال هذه الجلسة من داخل حاوية Docker وهو ما نستطيع القيام به باستخدام الأمر التالي: docker cp hsoub-tf:/training/output .\training نقاط تستحق التأمل قد يرى البعض في تقنيات الذكاء الصنعي حلا لجميع المشكلات، لكنها في حقيقة الأمر لا تأتي خالية من المخاطر التي قد ترقى إلى حد اعتبارها نقاط ضعف أو عيوب يجب أن تؤخذ بعين الاعتبار، نذكر منها: باعتبار أن النماذج في الشبكات العصبية تبنى انطلاقا من بيانات التدريب، لذا فإنها غير قادرة على حل أي مشاكل كانت موجودة أصلا في تلك البيانات كالأخطاء أو الانحياز أو عدم التكامل والشمول لمختلف الحالات المراد التعامل معها. يصعب في الشبكات العصبية تفسير المنطق الذي استخدمه النموذج لإعطاء إجابته، فالتعامل معه أقرب ما يكون للصندوق الأسود الذي لا نعلم كمستخدمين آلية عمله الدقيقة في الداخل، بل نؤمن بأن ما نحصل عليه من إجابات هو أفضل المتاح، ولهذه الفكرة تداعياتها الفلسفية والاجتماعية التي تصعّب من استخدام هكذا أدوات في الحالات التي تتطلب تقديم تبرير (مثلا عند تطبيق عقوبة أو حرمان من مكافأة). تطوير نماذج الشبكات العصبية يتطلب قدرا كبيرا من بيانات التدريب المشروحة والمجهزة بشكل جيد وملائم، وهو ما قد يعني الكثير من الجهد لتوفير مثل هكذا مصادر للتدريب. عملية تدريب الشبكات العصبية هي عملية متطلّبة من ناحية قدرات المعالجة الحسابية المتوفّرة للعتاد المستخدم، وذلك على عكس عملية استخدامها في التطبيقات عقب إتمام التدريب، لذا قد يجد المطور في الحوسبة السحابية فرصا متاحة بميزانيات في المتناول. إن بناء النماذج باستخدام خوارزميات تعلم الآلة يتطلب مطورين أذكياء وموهوبين، فعلى الرغم من أن تطبيق المثال الذي قمنا بعرضه يبدو سهلا ويسيرا، إلا أن نظرة أكثر تعمقا ستكشف لك الكثير من التفاصيل التي بحاجة إلى معايرة وضبط، منها على سبيل المثال لا الحصر: معمارية الشبكة، وطريقة توصيف تابع تفعيل العصبونات فيها، وعدد طبقاتها الخفية، وعدد العصبونات في كل منها، وطريقة ربطها بعضها ببعض، وكيفية حساب الخطأ ما بين النتيجة المحسوبة والمطلوبة، ومعدل سرعة التعلم، وعدد مرات تكرار عرض الأمثلة على الشبكة العصبية أثناء التدريب، وغيرها الكثير. إن انتقاء التوليفة الأكثر ملائمة لجملة معايير الضبط هذه يؤثر بشكل حاسم على جودة ودقة النموذج الناتج. مراجع أجنبية للاستزادة MobileNetV2: The Next Generation of On-Device Computer Vision Networks DeCAF: A Deep Convolutional Activation Feature for Generic Visual Recognition Making your own TensorFlow model for image classification UTKFace: Large Scale Face Dataset TensorFlow Lite Python image classification demo اقرأ أيضًا تعلم الذكاء الاصطناعي الذكاء الاصطناعي: دليلك الشامل المقال التالي: إعداد شبكة عصبية صنعية وتدريبها للتعرف على الوجوه الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها1 نقطة
-
يوجد عدة طرق لذلك: a[start:stop] # 1-من البداية المحددة الى النهاية a[start:] # من البداية المحددة وحتى النهاية a[:stop] # من البداية و حتى النهاية المحددة ناقص واحد a[:] # نسخ كامل المصفوفة a[start:stop:step] # من البداية المحددة الى النهاية المحددة بخطوة محددة a[-1] # آخر عنصر من المصفوفة a[-2:] # آخر عنصرين من المصفوفة a[:-2] # جميع العناصر ما عدا آخر عنصرين a[::-1] # جميع عناصر المصفوفة بترتيب معاكس a[1::-1] # اول عنصرين بترتيب معاكس a[:-3:-1] # آخر عنسرين بترتيب معاكس a[-3::-1] # جميع العناصر ما عدا آخر عنصرين بترتيب معاكس1 نقطة
-
بعد تناول مفهوم قنوات التوزيع، ومساراتها، ومهامها، وأهدافها في المقال السابق، يتطرق المقال الحالي إلى إدارة قنوات التوزيع وفق آليات سليمة، وهيكليّات إدارية واضحة. إدارة قناة التوزيع سواء بُنيت قناة التوزيع وفق خطّة محددة، أو تطورت تطورًا عفويًّا؛ يجب أن تعبّر عن هيكليّة إداريّة واضحة، ومن أشهر أنواع قنوات التوزيع: القنوات التقليديّة، والقنوات العموديّة، والقنوات الأفقيّة. القنوات التقليديّة يمكن وصف قناة التوزيع التقليديّة بأنها: مجموعة من الشركات المستقلة، التي تسعى -جميعها- إلى تحقيق الربح دون أي اهتمام بالشركات الأخرى، ويفتقر هذا النوع من القنوات إلى وجود أهداف مشتركة، أما عمليّة التقييم، وتوزيع المهام، فيُمكن وصفها بأنها غير رسميّة في أغلب الحالات، وبالتالي، فإن الشركات في هذا النوع من القنوات، قد تعمل ضد بعضها، كما أن كثيرًا من المهام قد تبقى غير مكتملة، وقد تستمر هذه العلاقات غير الفعالة بين الأعضاء في قناة التوزيع لسنوات طويلة، وعلى الرغم من هذه العيوب الجليّة، إلا أن هذا النوع من قنوات التوزيع، مازال الأكثر شيوعًا، واستخدامًا من بين القنوات الأخرى. قنوات التوزيع العموديّة لقد نشأت قنوات التوزيع العموديّة لتكون حلًا للمشاكل التي تعاني منها قنوات التوزيع التقليديّة، ففي هذا النوع من القنوات، يتولى أحد أعضاء القناة (وهو المصنع في الغالب) زمام القيادة، ويحاول أن ينسق جهود التوزيع في القناة، بما يحقق أهداف الجميع، ويوجد ضمن هذا النوع من قنوات التوزيع ثلاثة أشكال أساسيّة: التوزيع الرأسي المُدار يشبه التوزيع الرأسي المُدار التوزيع التقليدي كثيرًا، لكنه يُدار بصورة غير رسميّة، من خلال أهداف، وبرامج شركة واحدة، أو عدد محدود من الشركات، في قناة التوزيع، وفي كثير من الأحيان يكون المحرك الرئيس لهذه القناة هو فرد واحد -فقط- وذلك بسبب ما يتمتع به من نفوذ، ومهارات إداريّة، وفي أغلب الأحيان، تتمتع العلامات التجاريّة القويّة، مثل زيروكس (Xerox) وبروكتر أند غامبل (Procter & Gamble) بالقدرة على تحقيق هذا النوع من التعاون. وفي ظل وجود قائد للقناة، فإن القناة تعمل على نحو أفضل، وتزداد مبيعاتها، وأرباحها، ويتحسن تسويق المنتجات فيها، كما يصبح من الممكن العمل باستخدام أنظمة إدارة المخازن، والتنسيق بين الأنشطة الترويجيّة المختلفة، ومع ذلك، لا يخلو التوزيع الرأسي المدار من العيوب، إذ إن مسؤولية إدارة قناة التوزيع تقع على عاتق شخص واحد -فقط- يُضاف إلى ذلك الخلافات المحتملة بين أعضاء القناة الواحدة، فبعض الشركات قد تقبل أن تصبح جزءًا من قناة التوزيع الرأسي المدار، وبعضها الآخر قد يتمسك باستقلاليته، وفي النهاية، قد تجد الشركات المستقلة نفسها خارج المنافسة، وذلك بسبب حرمانها من الفوائد العديدة، التي تحظى بها الشركات المشاركة في قناة التوزيع. التوزيع الرأسي التعاقدي في بعض الحالات، يرغب أعضاء قناة التوزيع بتحويل العلاقة بينهم إلى علاقة رسميّة، من خلال اتفاق أو عقد، وهو ما يُعرف بالتوزيع الرأسي التعاقدي، ويتيح هذا العقد قدرةً أكبر على إدارة قناة التوزيع، كما أنه يوضح بصورة علنيّة، أو ضمنيّة، المهام التسويقيّة الموكلة لجميع الأعضاء في القناة، ويُعد هذا النوع من التوزيع، أشهر أنواع التوزيع الرأسي. التوزيع الرأسي المؤسسي يحدث التوزيع الرأسي المؤسسي عندما تكون ملكيّة أعضاء القناة في مستوياتها المختلفة، عائدة لشركة واحدة -فقط- وقد يحدث ذلك من خلال التكامل الأمامي، أو التكامل الخلفي، فإذا كان المصنع يمتلك عددًا من الوسطاء في قناة التوزيع، فإن هذا النوع من التكامل يُسمى التكامل الأمامي، أمّا إذا كان تاجر التجزئة يحاول تولي مهام الجملة، والتصنيع، فإن التكامل في هذه الحالة يُسمى التكامل الخلفي، وقد تقتضي عمليّة التكامل أن تشتري الشركة مؤسسات أخرى في قناة التوزيع، أو تنشئ مؤسساتها الخاصّة، التابعة لها، وعلى الرغم من أن التكامل الجزئي أكثر شيوعًا، إلا أن التكامل الكلي بدأ ينتشر -أيضًا- وتُعد دانون يوغارت (Dannon Yogurt) وبلو بل آيس كريم (Blue Bell Ice Cream) وبيبريدج فارمز (Pepperidge Farms) من أمثلة المصانع التي نجحت مؤخرًا في تحقيق التكامل الأمامي مع مستوى التجزئة، في المقابل، نجح كل من متجر سيرز (Sears) وسيفوي (Safeway)؛ وهما متجرا تجزئة، في تحقيق التكامل الخلفي، كما تُعد شركة أمريكان هوسبتال سبلاي كوربريشن (American Hospital Supply Corporation) من شركات الجملة التي نجحت في تحقيق التكامل الأمامي، والخلفي على حد سواء. قنوات التوزيع الأفقيّة قد تعجز بعض الشركات عن تحصيل رأس المال، أو المعرفة التقنيّة اللازمة للإنتاج، أو تسويق المنتجات بفاعليّة، وفي هذه الحال، تضطر الشركة إلى الدخول في علاقة مؤقتة، أو شبه دائمة، مع شركة أخرى، تمر بظروف مشابهة، وذلك بهدف إنشاء آلية توزيع تساعد كلتا الشركتين على تحقيق أهدافهما التسويقيّة، ويُطلق على هذا الترتيب اسم قناة التوزيع الأفقيّة، فعلى سبيل المثال: قد تلجأ شركتان صغيرتان إلى شحن منتجاتهما -معًا- وذلك بهدف تقليص تكاليف النقل، أو قد تلجأ شركة تجزئة كبيرة، إلى الاستحواذ على عدد من شركات التجزئة الصغيرة المنافسة، وذلك بهدف الوصول إلى أسواق بعينها، أو زبائن محددين. عمليّة إدارة قناة التوزيع تشير الدلائل إلى ضرورة معاملة التوزيع تمامًا مثلما يُعامل المنتَج، والترويج، والتسعير، وبالتالي فإن إدارة قناة التوزيع تتكون من خمس خطوات: تحليل الزبائن تبدأ عمليّة إدارة قناة التوزيع بالإجابة عن سؤالين أساسين، وهما: من هو الزبون المباشر لهذه المنتجات؟ ومن هو المستخدم، أو المشتري النهائي لها؟ علمًا بأن الزبون المباشر، والزبون النهائي، قد يكونان متطابقين، أو مختلفين، وذلك تبعًا لجملة من العوامل، مثل: نوع المنتج، وطبيعة المهام في قناة التوزيع، وموقع قناة التوزيع، وفي كلتا الحالتين، يجب معرفة ما هي احتياجات الزبائن، ومن أين يشترون، ومتى يشترون، ولماذا يشترون من متاجر بعينها، وكيف يشترون. ومن الأفضل البدء بتحديد مواصفات المستخدم النهائي، ومن ثم تحديد مؤسسات التوزيع الأخرى في القناة، بما يلائم احتياجات هذا المستخدم، فعلى سبيل المثال، يمكن القول: إن مواصفات الزبائن في حالة مسجلات الكاسيت، تتطلب مراعاة الأمور الآتية: بيع المسجلات من خلال موزعين موثوقين، ومعتمدين. الزبائن يقضون وقتًا كبيرًا في التسوّق، والموازنة بين أسعار المنتجات المختلفة، ومواصفاتها. الزبائن مستعدون للتضحية بالوقت، والجهد من أجل العثور على أفضل علامة تجاريّة. عمليّة البيع تتطلب إجراء نقاشات مطوّلة بين جميع الأطراف المعنيّة، بما في ذلك الموزعين، والمستخدمين، والمشترين. عمليّة الشراء قد تؤجل. بيع المسجلات من خلال موزع قادر على تقديم خدمات سريعة، ومقبولة. ويُظهر المثال الموضح أعلاه، بعض متطلبات البيع التي يجب على المصنع أن يكتشفها، وفي معظم الحالات، يتسم تحديد هذه المتطلبات بالسهولة والوضوح، ولكن يصعب في بعضها الآخر ملاحظته، أو التعرّف عليه، فعلى سبيل المثال: يميل بعض الزبائن للتسوّق من المتاجر التي تحمل منتجاتها مواصفات عرقيّة معيّنة، ومع ذلك، يمكن تحديد معظم العوامل المهمة التي تؤثر على سلوك الشراء لدى المستهلكين، من خلال إجراء دراسات متأنيّة، وإبداعيّة. إن معرفة مواصفات المستهلكين تمكّن المسؤول عن تخطيط قناة التوزيع، من تحديد نوع شركات الجملة، والتجزئة، التي يجب عليه أن يبيع المنتج من خلالها، وذلك يتطلب بالطبع أن يكون المصنع على معرفة بأنواع شركات التجزئة، وأماكنها، وقدراتها، قبل اختيار واحدة منها. وبالطريقة ذاتها، التي حدد المصنع من خلالها متطلبات الشراء، لدى المستخدمين النهائيين للمنتج، يجب عليه -أيضًا- أن يحدد متطلبات الشراء لدى تجار التجزئة، ولعل السؤال الأهم هنا هو: "ممن يفضل تجار التجزئة أن يشتروا" وتحدد إجابة هذا السؤال أنواع تجار الجملة الذين يجب على المصنع أن يتعامل معهم، وعلى الرغم من أن كثيرًا من تجار التجزئة يفضلون الشراء من المصنع مباشرة، إلا أن الحال ليس كذلك دومًا، إذ تفرض المصانع متطلبات صارمة (مثل: تنفيذ زيارات مفاجئة، واشتراط طلب كميات كبيرة، وتشديد شروط الائتمان)، لذلك يفضل بعض تجار التجزئة الشراء من الموزعين المحليين الذين يفرضون شروطًا ميسرة للائتمان، بالإضافة إلى مجموعة واسعة من المنتجات المختلفة. تحديد أهداف قناة التوزيع تستند خطة قناة التوزيع إلى أهداف القناة، التي تعتمد بدورها على عدد من العوامل، منها: متطلبات الزبائن، والمستخدمين، واستراتيجيّة التسويق العامة، وأهداف الشركة على المدى البعيد، ومع ذلك، فقد تصبح أهداف قناة التوزيع هي أبرز أهداف الشركة بشكل عام، وخصوصًا عندما تكون الشركة حديثة العهد بالسوق، أو شركة قديمة، ولكنها تحاول الدخول إلى سوق جديد، فعلى سبيل المثال: إذا أراد مصنع صغير التوسع خارج السوق المحلي، فإنه سوف يواجه عائقًا فوريًا، يتمثل بمحدوديّة المساحة المتوفرة على الأرفف في المتاجر، علمًا بأن إضافة منتج جديد إلى رفوف المتاجر يعني الحصول على مساحة كانت مخصصة في السابق للمنتجات المنافسة، وبدون تحقيق هذا الهدف، فإن المنتج سوف يكون محكومًا عليه بالفشل. تتسم أهداف قناة التوزيع بالتنوّع، وهي تغطي المجالات الرئيسة الآتية: تحقيق النمو في المبيعات من خلال الدخول إلى أسواق جديدة، أو زيادة المبيعات في الأسواق الحاليّة. تحسين الحصة السوقيّة، أو الحفاظ عليها، وذلك من خلال توجيه أعضاء القناة، ومساعدتهم في جهودهم الراميّة إلى زيادة كميّة المنتجات التي يستطيعون التعامل معها. تحقيق نمط توزيع معيّن، يمكّن القناة من توزيع المنتجات في الوقت، والمكان، والشكل المحدد. بناء قنوات توزيع فعّالة، وتحسين أداء القنوات الحاليّة، من خلال تطوير آليات نقل المنتجات. تحديد مهام التوزيع بعد تحديد أهداف التوزيع، يصبح بالإمكان تحديد مهام قناة التوزيع بدقة، ويجب على مدير قناة التوزيع أن يكون دقيقًا للغاية في توصيف المهام، والتغيرات التي قد تطرأ عليها بحسب الوضع، ولتحقيق ذلك، يجب عليه أولًا أن يدرس جميع مراحل التوزيع، وأن يحدد المهام بالكامل، وأن يوزع التكاليف على هذه المهام، وعلى سبيل المثال: قد يقرر المصنع منح الأولويّة للمهام الآتية، من أجل الوصول إلى السوق المستهدف، وتحقيق الأرباح: التسليم بعد أقل من 48 ساعة من طلب المنتج. توفير مساحة تخزين كافية. توفير خدمات الائتمان للوسطاء. تسهيل عمل قنوات إعادة المنتج. توفير مخزون متكامل كمًّا، ونوعًا. التعامل مع تقادم المنتجات كمًّا، ونوعًا. تقييم قنوات التوزيع المختلفة، والاختيار من بينها يُعد تحديد مهام قنوات التوزيع شرطًا أساسًا لنجاح عمليّة الاختيار، والتقييم بعد ذلك، والتي تستند إلى أربعة أسس، وهي: عدد المستويات في القناة. كثافة هذه المستويات. نوع الوسطاء في كل مستوى. تطبيق معايير الاختيار المحددة على القنوات المختلفة. عدد المستويات يتراوح عدد المستويات في قناة التوزيع بين مستويين، ومستويات عدة، علمًا بأن قناة التوزيع تتكون -عادةً- من خمسة مستويات، أمّا القناة التي تتكون من مستويين -فقط- (المنتج والمستهلك) فهي قناة مباشرة، وهي ليست ممكنة ما لم يكن المنتِج، أو المستهلك مستعدًا لتولي جزء من مهام الوسطاء، وفي بعض المجالات، قد يكون عدد المستويات تقليديًّا، وثابتًا لدى جميع الشركات، بينما قد يتسم عدد المستويات في مجالات أخرى بالمرونة، وسرعة التغيّر. كثافة كل مستوى بعد تحديد عدد المستويات في قناة التوزيع، يجب على مدير القناة أن يحدد العدد الفعلي لمكونات كل مستوى، كم عدد تجار التجزئة والجملة في قناة التوزيع؟ ورغم أنه لا حدَّ للاحتمالات الممكنة، إلا أن القائمة التالي تظهر أبرز الخيارات. ويُعد تحديد كثافة كل مستوى قرارًا في غاية الأهميّة، والحساسيّة، وذلك لأنه يمثل جزءًا مهمًّا من استراتيجيّة التسويق العامة، ولقد استطاعت بعض الشركات مثل: كوكا كولا (Coca-Cola)، وتايمكس للساعات (Timex) أن تحقق نجاحًا كبيرًا من خلال استراتيجيّة التوزيع المكثّف. كثافة المستويات في قناة التوزيع: التوزيع الحصري (مثل شركة إيثان ألين "Ethan Allen" ودريكسيل هيريتج فورنتشر "Drexel Heritage Furniture") يعتمد على متجر واحد، أو بضعة متاجر. يخلق مستوى مرتفعًا من الولاء لدى الموزعين، ويقدّم قدرًا كبيرًا من خدمات الدعم. يوفر قدرًا أكبر من الرقابة، والسيطرة. يحدُّ من حجم المبيعات المحتملة. نجاح المنتج يعتمد -فقط- على قدرة وسيط واحد. التوزيع المكثّف (كما هو الحال في الحلوى) وفي هذا النوع من التوزيع، يحاول المصنع إقناع أكبر عدد ممكن من الوسطاء في مجال معيّن، ببيع المنتج. يساعد على زيادة حجم المبيعات، وكذلك شهرة المنتج في أوساط المستهلكين. يتضمن في الغالب أسعارًا منخفضة، وطلبات صغيرة، وهامشًا ضيقًا من الأرباح. يتسم بصعوبة تحفيز هذا العدد الكبير من الوسطاء، أو السيطرة عليهم. التوزيع الانتقائي (كما هو الحال في باسكن روبنز "Baskin-Robbins") وفي هذه الحالة يعتمد عدد المتاجر على الفرص المتاحة في السوق، والكثافة السكانيّة، وتوزع المبيعات، وسياسات التوزيع لدى المنافسين. يتضمن نقاط القوة، والضعف ذاتها في الاستراتيجيتين السابقتين. يصعب تحديد العدد الأمثل من الوسطاء في كل سوق. أنواع الوسطاء يمكن لقناة التوزيع -كما تعلم- أن تضم أنواعًا مختلفة من الوسطاء، لذلك يجب على مدير القناة أن يجمع ما يكفي من المعلومات لفهم مهام كل وسيط، وبناءً على هذه المعلومات، يستطيع أن يستبعد كثيرًا من الخيارات غير الملائمة. معايير الاختيار بعد التعرّف على جميع أشكال قنوات التوزيع المتاحة، يستطيع مدير القناة أن يقيّم البدائل المختلفة وفق مجموعة من المعايير المحددة، مثل: الاتجاهات البيئيّة، وسمعة البائعين، وخبرتهم، وغيرها من المعايير، والمحددات لدى الشركة. من يجب أن يتولى زمام القيادة بصرف النظر عن شكل قناة التوزيع المختارة، يمكن القول: إن أداء قناة التوزيع يصبح أفضل، عندما يكون هناك شخص يقود هذه القناة، ويتلخص دور القيادة بشكل أساس في تنسيق أهداف مؤسسات التوزيع، وجهودها، ويتراوح مستوى القيادة بين السلبيّة الشديدة، والفاعليّة الشديدة، وقد يقترب من التسلط، والديكتاتوريّة، كما قد يكون نمط القيادة سلبيًا، أي يستند على الخوف والعقاب، وقد يكون إيجابيًا، ومستندًا إلى التشجيع، والمكافآت، وتجدر الإشارة هنا إلى أن جميع أنماط القيادة قد تكون فعّالة في أوضاع معيّنة. ولكن السؤال الملح هنا هو: "من يجب أن يقود قناة التوزيع؟" وللإجابة على هذا السؤال، لابدّ من الإشارة إلى اتجاهين مهميّن: الاتجاه الأول: إذا نظرت إلى سنوات التسويق المبكرة، أي ما قبل عام 1920، فسوف تجد أن تاجر التجزئة كان يلعب الدور الأساس (وهو جمع المنتج، والمستهلك معًا)، وبالتالي فقد كان تجار التجزئة يقودون معظم قنوات التوزيع في تلك الفترة، ولكن ذلك لم يعد جيّدًا في الوقت الحالي. الاتجاه الثاني: هو محاولة كل من المصانع، وتجار التجزئة، منافسة بعضهما في الحجم، سعيًا لزيادة النفوذ، والسيطرة على قنوات التوزيع. متى يجب أن يقود المصنع؟ أو تاجر الجملة؟ أو تاجر التجزئة؟ على الرغم من أن الإجابة عن هذا السؤال تعتمد على كثير من العوامل، إلا إنه بصفة عامة، يجب على المصنع أن يقود، إذا كانت السيطرة على المنتج ضرورية لنجاح قناة التوزيع، أو كان المصنع هو الجهة الأقدر على تصميم القناة، وإعادة تصميمها إذا اقتضت الحاجة، أمّا تاجر الجملة فيجب أن يقود إذا كانت المصانع، وتجار التجزئة صغارًا في الحجم، كثيرين في العدد، مشتتين جغرافيًا، ضعفاء ماليًا، ويفتقرون إلى الخبرة التسويقيّة، وأمّا تاجر التجزئة، فيجب أن يتولى زمام القيادة عندما يكون تطوير المنتج، أو تحفيز الطلب، غير مهم نسبيًا، بينما يحتل الاهتمام بالزبون القدر الأكبر من الأهميّة. تقييم أداء أعضاء القناة إن تقييم أداء كل مستوى، وكل عضو في قناة التوزيع، لا يقل أهميّة عن تقييم مهام التسويق الأخرى، إذ من الواضح أن المزيج التسويقي يتسم بالتداخل، وأن فشل أحد مكوناته قد يؤدي إلى فشله بالكامل، ومع ذلك تجدر الإشارة إلى أن قنوات التوزيع تتكون -عادةً- من شركات مستقلة، باستثناء التوزيع الرأسي المؤسسي، أي أن الموظفين، وأنشطتهم، لا يخضعون مباشرة لسيطرة مدير قناة التوزيع، وبالتالي فإنهم قد لا يكونون مستعدين دومًا للقبول بالتغيير. وتُعد المبيعات أشهر معيار لقياس أداء قنوات التوزيع، ويُمكن استخدامها بأكثر من طريقة، إذ يمكن الموازنة بين المبيعات الحاليّة، والمبيعات الماضية، أو الموازنة بين مبيعات الأعضاء في قناة التوزيع، وبين مبيعات الأعضاء، والحصص المحددة مسبقًا. ومن معايير قياس الأداء -أيضًا- الحفاظ على مخزون كافٍ من المنتجات، والقدرة على البيع، وموقف الوسطاء في القناة من المنتَج، والمنافسة بين الوسطاء، وخطوط المنتجات في قناة التوزيع ذاتها. تصحيح قناة التوزيع، أو تعديلها قد يصبح إدخال تعديلات على قناة التوزيع أمرًا ضروريًا، نتيجة عملية التقييم المستمرة، أو بسبب عوامل أخرى، مثل ظهور منافسين جُدد، وتقنيات حديثة، أو تغيّر السوق، ولأن العلاقات في قناة التوزيع بعيدة المدى -في أغلب الأحيان- فيجب التفكير مليًا قبل اتخاذ أي قرار بتغيير القناة الحالية، وذلك بسبب التأثير الكبير، الذي قد يتركه هذا القرار على الشركة بأكملها. في المقابل، يجب عدم اللجوء إلى طرد الأعضاء الذين يعجزون عن تحقيق الحد الأدنى من معايير الأداء، إلا عند فشل جميع الحلول الأخرى، ويجب على مدير القناة أن يعي سبب الأداء السيئ لهؤلاء الأعضاء، وأن يبني استراتيجيّة لإصلاح العيوب لديهم، وأن يحافظ على العلاقات الجيّدة بين الأعضاء في قناة التوزيع بالمجمل. أحيانًا قد يقرر المنتِج إضافة قناة توزيع جديدة بالكامل، أو إلغاء قناة موجودة، وأحيانًا أخرى، قد يقرر استخدام أكثر من قناة توزيع، فعلى سبيل المثال: قد ترغب شركة متخصصة في إنتاج معدّات التصوير، بالوصول إلى سوق هواة التصوير، وكذلك سوق المصورين المحترفين، وهو ما يتطلب تصميم قناتي توزيع مختلفتين تمامًا، والاستعانة -كذلك- بوسطاء مختلفين. الجانب الإنساني من عمليّة التوزيع تتكون قناة التوزيع بطبيعتها من أشخاص، وبالتالي يجب على كل فرد أن يعمل على تنسيق جهوده مع الأفراد الآخرين، من أجل تحسين الأداء الكلي للقناة، ولكن ذلك نادرًا ما يحدث، ولعل من أسباب ذلك: هيكليّة قناة التوزيع ذاتها، والتي تشجع الأفراد على الاهتمام -فقط- بالأفراد القريبين منهم في هيكليّة القناة، أو بمعنى آخر، الأفراد الذين يبيعون لهم، ويشترون منهم، ويرجع ضعف التنسيق -أيضًا- إلى ميل الشركات المكوّنة لقناة التوزيع نحو العمل بصورة مستقلة، ويمكن دراسة سلوك قنوات التوزيع من خلال أربعة أبعاد إنسانيّة، وهي: الأدوار، والتواصل، والصراع، والنفوذ، وتجدر الإشارة إلى أن فهم هذه السمات السلوكيّة، يساعد على زيادة فاعليّة قناة التوزيع. الأدوار تشارك معظم الشركات في أكثر من قناة توزيع، لذلك لابدّ من تعريف دور كل عضو في القناة بدقة، وذلك يعني، وصف السلوك الأمثل لكل عضو في القناة، فعلى سبيل المثال: يمكن وصف الدور الأساس للمصنع في قناة التوزيع، بأنه زيادة مبيعات منتَجِهِ، أو علامته التجاريّة، أي أنه يجب على المصنع ترويج علامته التجاريّة بقوّة، ومنافسة الآخرين من أجل الحصول على حصّة من السوق، أما دور تجار الجملة، فهو مختلف قليلًا، ولأن تجار الجملة عادةً ما يمثلون عددًا من المصانع المتنافسة، فإن دورهم يقتصر على زيادة مبيعات العلامات التجاريّة، التي يكثر الإقبال عليها من تجار التجزئة، ويمكن القول: إن تحديد أدوار المشاركين في قناة التوزيع، يمثل جزءًا أساسًا من عمليّة إدارة القناة، كما أنه يساعد على تحقيق النتائج المرجوّة، ولكن ذلك لا يتحقق إلا من خلال التقييم الدقيق لمهام كل عضو، وفهم كل عضو للمهام المنوطة به. التواصل يُقصد بالتواصل هنا: إرسال، واستقبال، المعلومات المتعلقة بعمل قناة التوزيع، وهو أمر ضروري لنجاح القناة، وأعضائها، لذلك يجب على مدير القناة أن يسعى لاكتشاف أي مشاكل سلوكيّة، تحول دون تدفق المعلومات بفاعليّة، وأن يحاول حلها قبل أن تصبح عمليّة التواصل معطّلة تمامًا. الصراع يجب على الأفراد، والشركات، أن يعملوا -معًا- من أجل تحقيق النجاح، ولكن الصراع أمرٌ حتمي، وعلى خلاف المنافسة الوديّة، يتسم الصراع بأنه صدام شخصي، ومباشر، وبسبب كثرة وقوع الصراعات في قنوات التوزيع، أُجريت كثير من الدراسات للتعرّف على أسبابها، ونتائجها، وسُبل حلها. ولذلك يجب وضع آليّة لإدارة الصراع في قنوات التوزيع، وذلك يشمل: (1) بناء آلية لاكتشاف الصراع. (2) تقدير آثار الصراع، ونتائجه. (3) حل الصراع. وتُعد الخطوة الثالثة أصعب الخطوات، ويستخدم فيها كثير من الأساليب، مثل: تأسيس لجنة خاصة بالقناة، وتحديد أهداف مشتركة، أو الاستعانة بجهة تحكيم خارجيّة، وفي بعض الأحيان تكون الصراعات ضرورة لابدّ منها، إذ يشير إريك شميدت (Eric Schmidt) رئيس شركة جوجل، ومديرها التنفيذي: "لقد وجدت من واقع خبرتي، أن أنجح الشركات هي تلك التي تشهد قدرًا أكبر من الصراعات، والصراع لا يعني أن يقتل أحدنا الآخر، بل يعني وجود كثير من الآراء، ووجهات النظر المختلفة، والتي تقود في نهاية المطاف إلى اتخاذ القرار الصحيح." النفوذ يعبّر النفوذ عن قدرة أحد الأطراف على فرض سيطرته، وتأثيره على سلوك طرف آخر، أمّا في سياق قنوات التوزيع، فيشير مصطلح النفوذ إلى قدرة أحد أعضاء قناة التوزيع، على فرض سيطرته، وتأثيره على عضو آخر في القناة ذاتها، فعلى سبيل المثال: قد تحاول شركة تجزئة كبيرة أن تدفع المصنع إلى تعديل تصميم المنتج، أو ترفض تخزين كميّات كبيرة من المنتج لديها، وفي هذه الحالة يمارس كل طرف نفوذه على الطرف الآخر، في محاولة للتأثير على سلوكه، فيما تعتمد النتيجة النهائيّة على حجم النفوذ الذي يتمتع به كل طرف. ترجمة -وبتصرف- لأجزاء من الفصل (Channel concepts: distributing the product) من كتاب Core Concepts of Marketing اقرأ أيضًا المقال السابق: قنوات توزيع المنتج: مهامها وأبرز مؤسساتها النسخة العربية الكاملة لكتاب مدخل إلى التسويق1 نقطة
-
هذا طبيعي بسبب عدم موجود دالة print تطبع أي شيء، ولكي تظهر النتيجة في موجهة الأوامر يجب أن نقوم بطباعتها أولًا من خلال السطر التالي: print(mobiles)1 نقطة
-
لطباعة درجة الطالب في مادة معينة نستخدم طريقة index لجلب النتيجة المطلوبة بالضبط: print(sampleDict['class']['student']['marks']['physics']) # Output: 70 print(sampleDict['class']['student']['marks']['history']) # Output: 80 أما لطباعة كل درجات الطالب نستخدم التابع items لجلب كل الدرجات لكل المواد في شكل أزواج من الكائن Tuple: print(sampleDict['class']['student']['marks']['physics']) # Output: 70 print(sampleDict['class']['student']['marks']['history']) # Output: 80 for subject, degree in sampleDict['class']['student']['marks'].items(): print(subject, degree) """ OutPut: physics 70 history 80 """1 نقطة
-
لديك خطأ بسيط في السطر رقم 4 حيث قمت بكتابة "sally" بدلا من "salary" ولطباعة الناتج تحتاج إلى كتابة print(sampleDict)1 نقطة
-
يمكنك تعديل Model ليصبح class ImageModel { int id; String src; ImageModel({ this.id, this.src, }); factory ImageModel.fromJson(Map<String, dynamic> json) => ImageModel( id: json["id"], src: json["src"], ); Map<String, dynamic> toJson() => { "id": id, "src": src, }; } ثم تعديل دالة _gotoSingleImage _gotoSingleImage(imageModel, context);1 نقطة
-
يبدو أنك اخطأت في وضع بعض الأكواد, هل ممكن ترفق كود الملف كاملاً بشكل مضغوط؟1 نقطة
-
لم تقم بإستدعاء model ImageModel يجب استدعاءه في الأعلى final List<ImageModel> imageModel;1 نقطة
-
يمكنك من صنع دالة يكون استخدامها عند الضغط على الصورة void _gotoSingleImage(ImageModel imageModel, BuildContext context) { Navigator.push( context, MaterialPageRoute(builder: (context) => SingleImage(imageModel)), ); } ثم في دالة onPressed تضع التالي _gotoSingleImage(imageModel[index], context); ثم في الواجهة الثانية وليكن مثلا اسم الكلاس هو class ImageCategory extends StatefulWidget { // باقي كود الواجهة } قم بإنشاء متغير وليكن هكذا final ImageModel imageModel; ثم constructor يكون بهذا الشكل ImageCategory(this.imageModel); أي يكون الكلاس بهذا الشكل class SingleImage extends StatefulWidget { final ImageModel imageModel; SingleImage(this.imageModel); @override _SingleImageState createState() => _SingleImageState(); } class _SingleImageState extends State<SingleImage> { @override void initState() { // TODO: implement initState super.initState(); } @override Widget build(BuildContext context) { return Scaffold( // باقي كود الواجهة ); } } ثم باستخدام widget. يمكنك الوصول إلى المتغير imageModel وجلب محتوياته. ثم يكون ImageModel بهذا الشكل class ImageModel { ImageModel({ this.id, this.images, }); int id; List<ImageUrl> images; factory ImageModel.fromJson(Map<String, dynamic> json) => ImageModel( id: json["id"], images: List<ImageUrl>.from(json["images"].map((x) => ImageUrl.fromJson(x))), ); Map<String, dynamic> toJson() => { "id": id, "images": List<dynamic>.from(images.map((x) => x.toJson())), }; } class ImageUrl { ImageUrl({ this.id, this.src, this.name, this.alt, }); int id; String src; String name; String alt; factory ImageUrl.fromJson(Map<String, dynamic> json) => ImageUrl( id: json["id"], src: json["src"], name: json["name"], alt: json["alt"], ); Map<String, dynamic> toJson() => { "id": id, "src": src, "name": name, "alt": alt, }; }1 نقطة
-
العفو, يمكنك طرح أي سؤال وسنعمل على حله.1 نقطة
-
تستخدم للتجربة فقط, حتى نتأكد من طباعة الحرف إذا كان هناك ضعط على الزر submit وعند الأنتهاء يتم حذفه.1 نقطة
-
لديكي عدة اخطاء وهي أولاً: عدم تعريف خاصية name="submit" للزر و سيصبح بعد وضع الخاصية بهذا الشكل <input type="submit" name="submit" value="Login" class="btn float-right login_btn"> ثم يجب وضع الأستعلامات بداخل الشرط بهذا الشكل <?php include('connect.php'); error_reporting(E_ALL^E_NOTICE); if(isset($_POST['submit'])){ echo 'd'; $username=$_POST['username']; $password=$_POST['password']; $sql="SELECT * FROM xuser WHERE wUserName='".$username."' AND wPassWord='".$password."' "; $result = $conn->query($sql); //while ($row=$result->fetch_assoc()){ $count=$result->num_rows; //} if($count > 0){ header('Location: indexx.php'); } else{ header('Location: login.php'); } } ?> ثم تغيير توجيه الصفحة إلى صفحة أخرى عن طريق دالة header و يرجى التعديل وستنجح بالعمل معكِ.1 نقطة
-
تمام، من خلال ال id يمكن الوصول للرابط عن طريق الدليل أي imgList[id] ضع الرابط مباشرة في shared_preference واستخدمه في الشاشة التالية1 نقطة
-
يمكنك ملاحظة وجود قوس الإغلاق للشرط في سطر خطأ: $password=$_POST['Password']; } ^^^ التعديل أيضا في الشرط وحلقة while غير ضرورية: <?php include('connect.php'); error_reporting(E_ALL^E_NOTICE); if(isset($_POST['submit'])){ $username=$_POST['username']; $password=$_POST['Password']; $sql="SELECT * FROM xuser WHERE wUserName='".$username."' AND wPassWord='".$password."'"; $result = $conn->query($sql); $count=$result->num_rows; if($count >0){ header('location:http://localhost/Artree/index.php'); } else{ header('location:http://localhost/Artree/login.php'); } } ?> كما قمت بحذف فراغ إضافي بعد كلمة السر وهي تسبب مشكلة أيضا.1 نقطة
-
الإصدار 1.0.0
18390 تنزيل
لا يخفى على أحد شهرة لغة SQL أو لغة الاستعلامات البنيوية (Structured Query Language) سواءً للمبرمجين أو الداخلين الجدد إلى عالم البرمجة وعلوم الحاسوب، فهي لغة برمجة متُخصِّصة في مجال واحد وهو معالجة وإدارة قواعد البيانات، وتعد اللغة القياسية لأنظمة إدارة قواعد البيانات (RDBMS)؛ وتُستخدم تعليمات وأوامر SQL -لمن لا يعرفها- لإجراء عمليات مباشرة على البيانات، مثل تخزينها في قاعدة بيانات، وجلبها منها والتعديل عليها بالإضافة إلى إنجاز مهام إدارية على قواعد البيانات من تأمين ونسخ احتياطي وإدارة للمستخدمين. ونظرًا لأهمية SQL سواءً للمبرمجين، وحتى لغير المبرمجين من العاملين في القطاعات التقنية أو للمهتمين بقواعد البيانات عمومًا، نضع بين يديك هذا الكتاب المبني على أحد أفضل الكتب الإنجليزية المتقدمة عن SQL، وهو كتاب "SQL Notes For Professionals" من موقع GoalKicker المبني بدوره على توثيق موقع StackOverflow وقد ساهم في إعداده عدد كبير من المساهمين على شبكة StackOverflow الشهيرة (إن أردت الاطلاع على قائمة المساهمين الكاملة، ارجع إلى قسم "Credits" في نهاية الكتاب الأصلي، SQL Notes For Professionals). يغطِّي هذا الكتاب المفاهيم الأساسية للغة SQL، مثل العمليات الأولية، وإدراج البيانات وحذفها واستخلاصها وتحديثها، وأنواع البيانات، وتصميم الجداول وتنفيذ الاستعلامات، إضافة إلى مفاهيم متقدمة، مثل المعارض views والدوال، وإدارة المستخدمين، وكيفية تأمين الشيفرة وغيرها من المواضيع. كما أنّ الكتاب غني بالأمثلة التطبيقية التي تشرح كل هذه المواضيع لترسيخ فهمها. هذا الكتاب ليس مثل غيره من الكتب والشروحات التي تشرح لغة SQL من البداية شرحًا مُبسَّطًا ومتسلسلًا وإنَّما يعتمد على مبدأ خير الكلام ما قل ودل في الشرح وترك الشيفرة تشرح نفسها بنفسها، فيحوي على كم كبير من الشيفرات والأمثلة العملية بالموازنة مع الشرح النظري ووُجِّه لمن يريد اتقان لغة SQL وصقل مهاراته فيها إذ سيساهم هذا الكتاب في رفع مستواك في لغة SQL وسيُملِّكك مهارات متقدمة في استعمال لغة SQL بالإضافة إلى بعض الخدع والالتفافات المتقدمة أيضًا. هذا الكتاب مرخص بموجب رخصة المشاع الإبداعي Creative Commons «نسب المُصنَّف - غير تجاري - الترخيص بالمثل 4.0». أنشئ العمل الأصلي من هذا الكتاب لأغراض تعليمية ولا يتبع إلى أي شركة أو مجموعة رسمية متعلقة بلغة SQL ولا حتى شبكة Stack Overflow، كما أن جميع العلامات التجارية المذكورة في هذا الكتاب تتبع إلى الشركات المالكة لها. يمكنك قراءة فصول الكتاب على شكل مقالات من هذه الصفحة، «المرجع المتقدم إلى لغة SQL»، أو مباشرة مما يلي: المقال الأول: مدخل إلى SQL المقال الثاني: جلب الاستعلامات عبر SELECT في SQL المقال الثالث: التجميع والترتيب في SQL المقال الرابع: تنفيذ تعليمات شرطية عبر CASE في SQL المقال الخامس: البحث والتنقيب والترشيح في SQL المقال السادس: الدمج بين الجداول في SQL المقال السابع: تحديث الجداول في SQL المقال الثامن: معالجة الأخطاء والتعديل على قواعد البيانات في SQL المقال التاسع: حذف الجداول وقواعد البيانات في SQL المقال العاشر: مواضيع متقدمة في SQL المقال الحادي عشر: دوال التعامل مع البيانات في SQL المقال الثاني عشر: دوال التعامل مع النصوص في SQL المقال الثالث عشر: التعبيرات الجدولية الشائعة Common Table Expressions المقال الرابع عشر: مواضيع متفرقة في SQL المقال الخامس عشر: الاستعلامات الفرعية والإجراءات في SQL المقال السادس عشر: تصميم الجداول وترتيب تنفيذ الاستعلامات ومعلومات المخطط في SQL المقال السابع عشر: تنظيم وتأمين شيفرات SQL1 نقطة -
إن فك ترميز سلسلة نصية بصيغة JSON باستخدام الدالة json_decode أسرع كثيرا في التنفيذ من فك ترميز سلسلة نصية بصيغة XML باستخدام الدالة SimpleXML وذلك نظرا لأن صيغة JSON تصف فقط تسلسل من النصوص المتداخلة دون الحاجة إلى توفير واجهة DOM أو تحليل للسمات. لذا إن كان الأداء عنصرا حرجا في تصميمك (كالحاجة للتعامل مع كم كبير من البيانات) فقد يكون من المفيد الاعتماد على صيغة JSON لتبادل البيانات بدلا من XML إن كان بإمكانك الاختيار فيما بينهما.1 نقطة
-
شكرا على هذه المقالة الجميلة والممتعة في قراءتها. أرغب في هذا السياق أن أشير إلى النسخ العربية من دوال date و mktime و strtotime والمتاحة ضمن مكتبة Ar-PHP التي تتيح للمطور التعامل التواريخ الهجرية والأسماء العربية للأيام والأشهر بأكثر من صيغة شائعة في المشرق أو المغرب العربي.1 نقطة