عن تلك القصة التي بطلها: أنت ! (الجزء الأول)


حتى تنتهي القصة ب "وعاش في سلام" لابد أن يترك البطل ذراعه في الحرب، وهل كنت فعلا تظن أن الحظ يحالف الهوى؟ بل خذها يقينا مني أنه يخالف الهوى، ولا تسألني عن الدليل..
فإن السماء لا تمطر ذهبا..
كما أن الدنانير تتساقط بقدر قطرات العرق..
وهل بعد قول المولى تبارك وتعالى ﴿ وَأَن لَّيْسَ لِلْإِنسَانِ إِلَّا مَا سَعَىٰ ﴾ قول آخر؟!
خليلي..
مَنَّ الله عليك أن صَيَّرَكَ مبرمجا، فأنت في نعمة لو أمعنت النظر..
فإن كُنتَ متعثرا في تحصيل ثمار حِرْفَتِكَ فلأنك أَحَدُ اثنين:
لم تتمكن بعد من تخصصك في البرمجة..
أو أنك متمكن حقا، لكنك لم تجد مرشدا..
إن كنت من الصنف الأول فَاصْغِ إلي جيدا، واعمل بكلامي، فإنني أحببتك منذ أن جلست تقرأ كلامي هذا، ولست ببخيل حتى أحرم حبيبي سبيل التقويم..
لكن قبل أن أدلك على سبيل التقويم، هلا دللتك على سبيل التقييم؟
بلى، فإن التقويم بلا تقييم تنويم، ولن ترقى إلى ما تصبو إليه إن أسأت التقويم، وهل يصلح العلاج إلا بعد التشخيص؟!
ركز معي..
خذ ساعة من وقتك، تتفرغ فيها لنفسك، ثم فكر مَلِيًّا في تخصصك البرمجي الذي قررت أن تزاوله، ولا تشتت بالك بكثرة التخصصات، فإن الكثرة تدفع إلى الانتقائية، والانتقائية مدعاة إلى القبوع في ذيل التخصص.
حدد تخصصا وحيدا فقط، أ تريد احتراف برمجة الويب؟ برمجة سطح المكتب؟ برمجة تطبيقات الموبايل؟ أم ماذا تريد؟
ولا تسألني عن أيها أكثر مردودية، وأشدها طلبا؟ لأن الحال ما يزال مبكرا..
بعد أن تضرب الأخماس للأسداس، وتقدر المصالح والفوائد، حدد تخصصك واصنع قصتك، ولا تُدخل أحدا في قرارك، حتى أنا لا تشركني فقد أخذلك، لأنني مستغرق في تخصصي..
قَرِّرْ واصنع قصتك، ثم انتقل إلى مرحلة تحديد النقص..
بصيغة أخرى: ما الذي تستصعبه في تخصصك؟ ما الذي تهرب منه دوما؟ مالذي ينغص عليك عيشك إن مَرَّ طيفه ببالك؟
قد يكون واحدا أو أكثر، اجمعهم وسجلهم في دفترك..
ثم ابدأ بهم واحدا واحدا، لا تغادر منهم أحدا حتى يستحيل في ذهنك كالعصا في يد الأعمى..
ثم بين الفينة والأخرى راجع مرحلة تحديد النقص، حتى يستقيم حالك في تخصصك، ثم انتقل إلى مرحلة النسخ البَنَّاء..
أَ وَ تدري ما النسخ البناء؟
أن تأخذ مشروعا أعجبك، وتنسج على غراره مشروعا آخر من صنعك..
تريد مثالا: أعجبتك لعبة Flappy Bird، لما لا تصنع مثلها بنفسك؟
ستكون تجربة فريدة صدقني، لأنك ستدخل في تَحَدٍّ مع نفسك، وستواجه صعوبات وإكراهات، وهي مسألة طبيعية جدا، فلا تستسلم يا خليلي، فأنت بطل، وهذه قصتك، ولا أحد سواك سيصنعها، فاصنعها ولو كلفك ذلك أن تشتري سورس كود اللعبة وتنقب فيه، فَلِسُمُوِّ الهدف تَذِلُّ الوسائل..
ها قد ساويتك يا خليلي بثاني الاثنين: ذاك الذي يملك الأدوات لكنه لم يجد مرشدا يدله على سبيل الربح..
فتنفس بعمق، وتعال معي لنواصل في الجزء الثاني من هذه المقالة، سُبُلَ الربح من البرمجة، على أن تعدني بشيء واحد، أو بشيئين، بل بثلاثة !
أما الأول: أن تضع في اعتباراتك معاني الحرام والحلال، فلا تطاوع نفسك في توظيف ما حباك الله من معارف في الحرام وإن زينته لك نفسك، فإن الدنيا غمضة عين.
وأما الثاني: أن تدرك يقينا أن الله عز وجل كرمك بالعقل، فلا تصدق من يقول لك: أن هذا الأمر أو ذاك صعب ولا يمكنك بلوغه، فهو كاذب، وبعون الله أنت قادر على تحقيق كل ما تريد، فقط: ثق أنك قادر، ثم بادر !
وأما الثالث: ألا تفشل في مراحل التعلم، وخذ كامل وقتك في المدارسة والممارسة، ولا تزدري حالك بالمقارنة مع غيرك، فإنك نسيج وحدك، وليس ببعيد أن تتجاوزنا جميعا.
فاصنع قصتك يا خليلي، دام لكم البشر والفرح!

يسألونك عن: ASP.NET Routing


حول سلسلة "يسألونك عن"
سلسلة "يسألونك عن": عبارة عن مجموعة من المقالات التقنية الرامية إلى شرح بعض المسائل البرمجية التي لم يتناولها القلم العربي

المقدمة:

جرت العادة أن تؤشر عناوين URL إلى ملفات موجودة على السيرڤر، وكل ملف يمكن الوصول إليه عبر عنوان واحد يبرز مساره الفعلي Physical Path في مجلدات السيرڤر، كما يوضح الرابط التالي، الذي يحيل إلى صفحة اسمها Login.aspx:
Http://www.Website.com/Login.aspx
هذا التوجيه المعتمد من طرف نمط Web Forms، كان معتمدا قبل ذلك في Classic ASP، وكذلك في أغلب لغات برمجة الويب، قبل أن يظهر نمط MVC ويأتي معه بطريقة جديدة لتوجيه العناوين، وهي ما يعرف ب URL Routing، فماذا تكون؟ وكيف نستطيع استخدامها في مشاريع ASP.Net؟

في العمق:

بداية، ينبغي أن نعلم أن توجيه العناوين (وهي الترجمة التي سنعتمدها في هذه المقالة للتدليل على Routing) عبارة عن آلية تسمح باعتماد شكل أو عدة أشكال لعناوين URL، ومن ثم تسهيل عملية الوصول إلى محتويات المشروع دون الحاجة إلى التأشير إلى ملف فعلي Physical File وإنما يكون التأشير إلى Action داخل Controller.
في تقنية ASP.Net، نستطيع التحكم في نمط التوجيه Routing Pattern، عبر الذهاب إلى الكلاس RouteConfig الموجودة داخل المجلد App_Start، لكن قبل أن نغوص في أعماق الكود، تعالوا بنا نطالع الخطاطة التالية التي تبين لنا كيف تتم عملية التوجيه:
في الأول يأتي الطلب من المتصفح لعنوان ما، فيقوم محرك التوجيه Routing Engine داخل الويب سيرڤر، بمعالجة الطلب، ومقارنته بالأنماط المسجلة في جدول التوجيه Routing Table، فإن توافق العنوان المطلوب مع أحدها تم إستدعاء Action المطلوبة، وإلا فإنه يتم إرجاع الخطأ 404 دلالة على أن المورد المطلوب غير موجود.
افتراضيا في ASP.NET MVC يتم اعتماد نمط التوجيه التالي:

Http://www.Website.com/Controller/Action/1

بحيث Action تمثل اسم Action، و Controller تمثل اسم Controller، و Id يمثل البرامتر المراد تمريره إلى الصفحة المتوجه إليها، وغالبا ما يكون هذا البرامتر اختياريا حتى لا يتم إلزام بعض Actions التي لا تستعمل برامترات به.
لو دخلنا إلى الكلاس RouteConfig الموجودة داخل المجلد App_Start، سوف نجد بداخلها وظيفة اسمها RegisterRouters تستقبل برامتر اسمه routes من نوع RouteCollection، وهذا هو محتواها:

        public static void RegisterRoutes(RouteCollection routes)

        {

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");



            routes.MapRoute(

                name: "Default",

                url: "{controller}/{action}/{id}",

                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

            );

        }

هذه الوظيفة هي التي تسمح لنا بتعريف أنماط التوجيه، وافتراضيا تحتوي على نمط جاهز، يستقبل عدة برامترات، يظهر منها في الكود أعلاه ما يلي:
  • البرامتر name: من خلاله نعطي لنمط التوجيه اسما، حتى نميزه عن غيره من الأنماط التي نود تعريفها.
  • البرامتر url: من خلاله نحدد شكل نمط التوجيه، وهو هنا بنفس الكيفية التي تحدثنا عنها آنفا.
  • البرامتر default: من خلاله نعطي العناصر الافتراضية الموافقة للنموذج الذي تم تعريفه، بحيث ستتم إحالتنا عند تصفح المشروع إلى الرابط التالي:
Http//www.Website.com/Home/Index
بحيث Home هو اسم Controller الافتراضي المعرف في جدول أنماط التوجيه، و Index هو اسم Action الافتراضي، ولأن id اختياري Optional، فلن يحدث خطأ عند استدعاء الرابط أعلاه.
قبل تعريف نمط التوجيه داخل الوظيفة، ستلاحظون وجود السطر التالي قبلها:


            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

الوظيفة IgnoreRoute دورها هو منع الوصول إلى المسار أو الملف الممرر لها، في هذه الحالة، ستمنع الطلبات التي تريد ملفات بامتداد axd، بالمثل يمكننا منع الوصول إلى ملف معين أو Action ما، كما يلي:

public static void RegisterRoutes(RouteCollection routes)

        {

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");



            routes.IgnoreRoute("Books/Display");



            routes.MapRoute(

                name: "Default",

                url: "{controller}/{action}/{id}",

                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

            );

        }

في المثال أعلاه، لن يستطيع المستخدم الوصول إلى Action المسماة Display والموجودة داخل Controller المسمى Books، لأننا استثنيناها في Routing عبر استدعاء الوظيفة IgnoreRoute.

حتى يكون Routing شغالا لا بد من تسجيله عند انطلاق التطبيق داخل الحدث Application_Start التابع للملف (المخضرم) Global.asax، الذي لو انتقلنا إليه سنجد أنه بالفعل يحتوي مسبقا على السطر التالي الذي يقوم بتسجيل جدول أنماط التوجيه:

RouteConfig.RegisterRoutes(RouteTable.Routes);

داخل الوظيفة RegisterRoutes يمكننا التحكم في شكل عنوان url عبر تغييره من قيمة البرامتر url، وكذلك يمكننا تغيير Action و Controller الافتراضيين من البرامتر default، كما يبين المثال التالي:

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.IgnoreRoute("Books/Display");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Books", action = "List", id = UrlParameter.Optional }
            );
        }

خاتمة

إلى هنا أحبتي في الله، ينتهي الشطر الأول من مقالتنا حول توجيه العناوين في تقنية ASP.Net، نلتقي في المقالة الثانية إن شاء الله لشرح بعض الأمور المتعلقة بالتوجيه دائما، والتي سيكون موضوعها هو تمرير البرامترات بين Actions ودور جدول التوجيه Routing Table في ذلك.
دام لكم البشر والفرح.