عن تلك القصة التي بطلها: أنت !


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


على مائدة أَكْوَادٍ دسمة !

استدعى مدير الشركة أفضل أربعة مبرمجين عنده، وقال لهم: لقد أَبْهَرْتُمُونِي بما تحققونه من نجاح منقطع النظير في كل ما أكلفكم به، ولا أملك إلا أن أقف لكم وقفة إجلال وإكبار لَعَلِّيَ بها أُوَفِّيكُمْ بعض أفضالكم، وما أحوجني - وأنا مديركم - أن أجالسكم على هذه المائدة وأستفيد من خبراتكم وتجاربكم، لعلي أصطنع بها يدا جديدة في البرمجة، أو أُزِيحَ بها ركام الجهل الذي يعوقني على أن أكون مثلكم!
ابتسم أكبر المبرمجين سنا في خجل وهو يقول:
هذا تواضع منك يا حضرة المدير، وما دام جلوسنا معك على هذه المائدة سيضفي عليك بهجة وسرورا فَلْيَطِبْ خاطرك إذا، فإن لك عندنا أياد بيضاء، ونتودد إليك برد بعض جمائلك!
أطرق المدير برأسه، ثم رفعه مبتسما وهو يقول:
على مائدة أكواد دسمة إذن!
فجلسوا أربعتهم، خامسهم مديرهم، وَخَيَّمَ على القاعة صمت طويل قبل أن يكسره أصغر المبرمجين قائلا:
إن كنت ذاكرا سببا من أسباب تطويع الكود في يدي، فلن أغفل عن سبب الحفظ، ولست أعني بالحفظ كتابة الكود على ورق واستظهاره، أبدا..
فإن الكود يُحفظ بالممارسة، وكثرة المدارسة..
وإذا تحقق رسوخ الكود في الذهن، كان حل المعضلات المتعلقة به أو القريبة منه من أيسر ما يكون، ألا ترى معي قدرة الحلاق على قص الشعر والمقص في يده؟ فكذلك حيازة الكود في الذهن، فهو أداة المبرمج، ووسيلته لبلوغ غايته..
ولا أزيد على سبب الممارسة في ترسيخ الحفظ إلا سبب البحث والتنقيب، فإنني كلما واجهت مشكلة بحثت عنها، وما خذلتني محركات البحث أبدا ما دمت أكتب المشكلة على الوجه الذي ينبغي!
هذا سر براعتي: ترسيخ الكود عبر الممارسة، وتجاوز المشكلات عبر آليات البحث!
ابتسم المدير في إعجاب، ثم التفت إلى المبرمج الثاني آذنا له بالكلام، فقال بهدوء:
أما أنا يا حضرة المدير، فقد طَوَّعْتُ الكود عبر حيازتي للأساس المعرفي المتين، فما خضت غمار مشروع إلا وقدمت له بالدراسة والاجتهاد، وأذكر جَلِيًّا أنك حينما كلفتني بمشروع ويب بتقنية ASP.NET MVC، وكان من ضمن مكونات المشروع مجزوءة متعلقة بالمراسلات السريعة بين الدعم الفني وبين زوار الموقع، وأبلغتك حينها أنني أمام خيارين:
1. إن كنا في حرج وضيق من الوقت، اعتمدت على المراسلات بواسطة قاعدة بيانات، وهو أمر سهل لكنه غير فعال!
2. وإن كان أمامنا وقت فاسمح لي بالبحث عن الحل الأنسب!
وقد أذنت لي حينها بالبحث عن الحل الأنسب، فوجدت مكتبة تسمى SignalR، لم أكن قد سمعت بها، لكنني وسعت صدري، ودرستها من كتاب، حتى فهمتها، فأقحمتها في المشروع فكانت النتيجة كما رأيتها، عمل مشرف وبالتقنية المناسبة!
ولا أزيد على سبب القراءة والدراسة في تطويع الكود وبلوغ المساعي إلا سبب تقليل الموارد، فلو حملت أكثر من كتاب، ما كنت لأنجز شيئا، لأن الكثرة تدفع إلى الانتقائية، والانتقائية مدعاة إلى المماطلة!
حملت كتابا واحدا فقط يا سيدي، فالتهمته وأسقطت ما جاء فيه على المشروع فكان على ما كان عليه!
وإنني لأذكر نصيحتك جيدا حينما قلت لي مؤكدا:
أصعب من بدئك من الصفر: شعورك بأنك صفر!
ابتسم المدير من جديد مفتخرا، وأدار وجهه ناحية المبرمج الثالث وأومأ له بالكلام، فقال بصوت دافئ:
أما أنا فقد نفعتني لما صفعتني!
كنتُ مبرمجا محترفا، حُزْتُ طَرَفَيْ البرمجة: تنظيرا وتطبيقا..
لكنني كنت متهاونا، لا أعير للوقت بالا، أنغمس في المشروع غير جاد، فيمضي الوقت ويغضب العميل...
فأترنح أنا وأميل!
أذكر جيدا حينما صفعتني بكلام قاس، قلت لي حينها:
كن أنت وكفى، فإذا بدر الخطأ قل: مني، وإن برز الخلل قل: أنا السبب!
كفاك تهربا، وتحميلا للجن الأزرق مسؤولية تقصيرك، فتكون بذلك كتلك التي "خانها ذراعها فقالت مسحورة" على حد تعبير إخوتنا في ليبيا..
وذكرتني بمقولة نابليون بونابرت المؤلمة: "لا تفسر بالفأل السيء قلة كفاءتك"!
كان كلامك جارحا حينها لكنه كان بصدق وسيلة نجاة، علمت يومها أنها قسوة كقسوة الأب، وإنما جنحتَ إليها لمصلحتي..
فَغَيَّرْتُ من حالي، وبدأت أُقَسِّمُ عملي على الوقت المتاح، واشتغلت بجد واجتهاد، فكان من نجاحي ما رأيت يا حضرة المدير..
وأعود وأقول:
نَفَعْتَنِي لما صَفَعْتَنِي!
حرك المدير ثغره بابتسامة عريضة، ثم أومأ للمبرمج الرابع وكان أكبرهم سنا مشيرا إليه بالكلام فقال:
حضرة المدير، لقد وظفتني عندك وأنا كبير السن..
قد اشْتَدَّ عودي، وَضَعُفَ كودي..
كنت أبرمج بلغات أكل الدهر عليها وشرب، لكن مع ذلك وضعتَ ثقتك فِيَّ، وقلت لي:
كن نوحا، واجعل أعداء نجاحك قومه.. ولسوف تنجح وسيغرقون!
زرعت كلماتُك فِيَّ حماسا رهيبا، فكنت أصل الليل بالنهار من أجل تحصيل مستجدات التقنية، لكنني كنت لا أتقدم قيد أنملة..
فبدأت أفقد الثقة في نفسي، وصرت ألجأ إلى زملائي في البرمجة، كلما وقعت في مشكلة اعتمدت عليهم وأتيت إليهم..
فَكَثُرَ زَلِّي وَتَقَلَّصَ ظِلِّي..
لأن كثرة السؤال مذلة، وماذا لدى فاقد الأداة إلا السؤال؟!
نسيت أنني مبرمج وفقدت ثقتي في نفسي، فكان كل العمل الذي أقوم به قوامه دعم زملائي، بل إنني كنت في كثير من الأحيان أكتب الكود على ورق، وأمضي في الباحة جيئة وذهابا مستظهرا..
فلما يئست وقررت ترك البرمجة..
جاءت كلمتك الباعثة..
كلمتك التي انتشلتني من براثن الفشل، ووضعت على رأسي تاج الثقة..
أ تذكر حينما وجدتني أعتمد على أحد الزملاء في عملي فقلت لي باقتضاب:
لا تعتمد على أحد، اعتمد على الأحد!
بهذه الكلمة صنعتني، وأردفتها بكلمة أخرى قائلا:
إنْ تاجُك قَل، إنتاجُك قَل..
فسألتك عن معناها، فأجبتني: إذا قَلَّتْ ثقتك بنفسك قل إنتاجك!
فحددتُ حينها حقل تخصصي، وانكببتُ عليه متعلما، لا يذعرني عن هدفي شيء حتى بلغته، وما بلغته إلا باعتمادي على الحي الذي لا يموت، ثم بثقتي في نفسي وإيماني بمقدرتي على بلوغ الرغاب وتذليل الصعاب..
وكذلك كان!
فإن كنت في القمة فَلِأَنَّ كلماتك كانت سلالم..
وطوبى لمن وجد من يغرس في سويداء قلبه معاني التعلق بالله واليقين التام أَنْ لا غايةَ تُنْشَد إلا بمشيئته ولا تُبْلَغ إلا بإرادته ولا تُدْرَك إلا بتوفيقه..
ولن أنسى كلماتك ما حييت:
لا تعتمد على أحد، اعتمد على الأحد..
وإن تاجك قل..
إنتاجك قل!
فَلِلَّهِ دَرُّكَ مِنْ مُديرٍ، فإن قضينا مساعيك فنحن صنائعك، وما توفيقنا إلا بالله!

الفرق بين الواجهات Interfaces وبين الفئات المجردة Abstract Classes

الفئات المجردة Abstract Classes

الفئات المجردة Abstract Classes هي تمثيل مجرد لنوع معين، ومن مقتضيات هذا التمثيل ألا يكون له وجود واقعيا إذ يبقى في جيز التجريد والاصطلاح فقط، مما يترتب على هذا المعنى من إلغاء لعملية الاستنساخ  Instanciation، إذ من المعلوم أن الفئات المجردة في البرمجة الكائنية التوجه لا تسمح باستنساخ كائنات منها ويبقى دورها محصورا في عملية تعريف العناصر الأساسية للفئات بغرض توريثها إلى الفئات المشتقة.
ويمكن للفئة المجردة أن تشتمل على وظائف مجردة abstract methods قابلة لإعادة التعريف على مستوى الفئات المشتقة، كما يمكنها أيضا ألا تشتمل على أية وظيفة مجردة، والوظائف المجردة هي وظائف لا تحتوي على أية أوامر برمجية Implementation، بل تعرض فقط تعريف الوظيفة أو ما يعرف بالتوقيع Signature كما يوضح المثال التالي:

    abstract class Person
    {
        string _name;
        public Person (string name)
        {
            _name = name;
        }
        abstract public void Work();
    }
الفئة Person فئة مجردة وعلامة ذلك أمر التعريف abstract الذي تقدمها، وهي تحتوي على حقل من نوع نصي اسمه _name يأخذ قيمته في مشيد الفئة Constructor (علما أن المشيد في الفئات المجردة لا معنى له، بيد أن دور المشيد هو تشييد الكائنات في زمن الاستنساخ، ومادام الاستنساخ غير ممكن من الفئات المجردة فلا قيمة لوضع المشيد هنا، لكن يتم وضعه لتحديد قيم بدئية للحقول المشتركة بين جميع الفئات المشتقة التي ترث من الفئة المجردة، ويمكن تغيير قيمة الحقل في المشيدات الفرعية عبر الكلمة base  كما سيأتي معنا).
بعد ذلك قمنا بتعريف وظيفة مجردة abstract method أسميناها Work، هاته الوظيفة سنقوم بإعادة تعريفها في الفئات المشتقة عبر استخدام الأمر Override كما يعرض الكود التالي:
    class Programmer:Person
    {
        string _speciality;

        public Programmer(string speciality, string name) : base(name)
        {
            _speciality = speciality;
        }

        public override void Work()
        {
            Console.WriteLine("I am Programmer :) ");
        }
    }
في الكود أعلاه، قمنا بإنشاء فئة اسمها Programmer مشتقة من الفئة الرئيسية المجردة Person، داخل هاته الفئة المشتقة قمنا بإسناد قيمة بدئية للحقل _name من جديد عبر الأمر base الذي يحيل إلى الفئة الأصلية، كما قمنا بإعطاء قيمة بدئية لحقل جديد أسميناه Speciality.
ثم في الجزء الأهم، قمنا بإعادة تعريف الوظيفة المجردة Work من خلال الأمر Override، وبالتالي عند استدعاء هاته الوظيفة عبر كائن مستنسخ من الفئة Programmer  سيتم تنفيذ الكود الموافق لها، كما يوضح الكود التالي:
class TestProg
    {
        static void main()
        {
            //Create new instance from Programmer Class
            Programmer programmer = new Programmer("Desktop", "Khalid ESSAADANI");

            //Call Work method from derived class
            programmer.Work(); //Print: I am Programmer
        }
    }
إذن كخلاصة، فالفئات المجردة هي عبارة عن فئات تقوم بتعريف العناصر العامة لنوع معين، ولا تسمح بعملية الاستنساخ المباشر منها بل تسمح بذلك فقط عبر آلية التوريث /  الاشتقاق Inheritance بحيث يمكننا استنساخ كائنات فقط من الفئات الفرعية المشتقة من هذه الفئات المجردة.

الواجهات Interfaces:

تقوم الواجهة Interface بتعريف الوظائف التي على الفئات - التي ستقوم بتطبيقها – إعادة تعريفها، وكما هو الحال في الوظائف المجردة فإن الواجهات لا تحتوي على أية أوامر برمجية Implementation، بل تحتوي فقط على تعريف لتوقيعات الوظائف الواجب إعادة تعريفها على مستوى الفئات التي ستستخدم هاته الواجهة.
ولعل سؤالا ملحا ينخر في ذهنك الآن: إذن لماذا تصلح الواجهات مادامت تؤدي تقريبا نفس الدور الذي تؤديه الفئات المجردة؟
سؤال وجيه و حق له أن يطرح، وكجواب مبدئي يمكننا القول، أن الواجهات في اللغات الحديثة مثل سي شارب وجافا وفيجوال بيسك دوت نيت، أتت كحل حاسم لأزمة الوراثة المتعددة Multiple inheritance، إذ من المعلوم أن هذه اللغات الثلاثة التي ذكرناها لا تسمح بالوراثة المتعددة، بمعنى أن فئة معينة لا تستطيع أن ترث من أكثر من فئة رئيسية، بيد أن التسلسل المسموح به هو فئة فرعية ترث من فئة رئيسية واحدة.
فلما كان الأمر كذلك، قامت هذه اللغات بتقديم بديل للوراثة المتعددة متمثلا في الواجهات، حيث صار للفئة الواحدة أن تطبق واجهة أو عدة واجهات في الوقت عينه وبالتالي يكفي أن ننشئ الواجهات التي سنحتاجها ونضع فيها ما نشاء من تعريفات للوظائف Specification، شريطة ألا يتعدى التعريف حدود التوقيع Signature لأن الواجهات لا تحتوي على أوامر برمجية Implementation، ثم بعد ذلك نأتي إلى الفئة المستهدفة ونعيد تعريف عناصر الواجهات عليها بكيفية قريبة جدا من طريقة الوراثة، حيث في لغة الفيجوال بيسك دوت نيت نقوم بتطبيق الواجهة في فئة ما من خلال الكلمة المحجوزة Implements وكذلك في لغة جافا تتم عملية التطبيق عبر استخدام الكلمة المحجوزة implements، بينما في لغة سي شارب، يبقى رمز تطبيق الواجهات هو نفسه رمز الوراثة (نقطتان هكذا : ).
وهذا مثال على إنشاء واجهة في لغة سي شارب:
public interface IVehicle
    {
        string Model { get; set; }
        DateTime ManuFacturedDate { get; set; }
        byte Age();
    }
الواجهة أعلاه اسمها IVehicle / المركبات، تحتوي على تعريف لخاصيتين وهما موديل المركبة Model و تاريخ التصنيع ManuFacturedDate، وعلى وظيفة اسمها Age، لو لاحظت معي فإننا اكتفنيا في تعريف الخصائص بذكر get و set  فقط دون تحديد التفاصيل، لأن الواجهات كما ذكرنا تشمل التعريف Specification وليس الكود Implementation.
إذا أردنا تطبيق هاته الواجهة في فئة ما، فالمسألة بسيطة وصيغتها كما تقدم شبيهة بصيغة الوراثة أي كما يلي:
    class Car : IVehicle
    {
        public string Model { get; set; }
        public DateTime ManuFacturedDate { get; set; }


        public byte Age()
        {
            return (byte)(DateTime.Now.Year - ManuFacturedDate.Year);
        }
    }
جدير بالذكر أن تطبيق واجهة ما في إحدى الفئات يستلزم إعادة تعريف جميع العناصر التي قامت الواجهة بتعريفها، كما هو الحال في المثال أعلاه، فقد قمنا بتعريف الخصائص Model و ManuFacturedDate وكذلك الوظيفة Age التي تسمح لنا بالحصول على عمر السيارة من خلال طرح تاريخ التصنيع من التاريخ الحالي سنويا.
ويمكن للفئة الواحدة أن تطبق عدة واجهات كما يعرض المثال الآتي:
public interface IVehicle
    {
        string Model { get; set; }
        DateTime ManuFacturedDate { get; set; }
        byte Age();
    }

    public interface IColor
    {
        string Color { get; set; }

        bool CompareColors(string color);
    }

    class Car : IVehicle, IColor
    {
        //IVehicle
        public string Model { get; set; }
        public DateTime ManuFacturedDate { get; set; }


        public byte Age()
        {
            return (byte)(DateTime.Now.Year - ManuFacturedDate.Year);
        }


        //IColor
        public string Color { get; set; }

        public bool CompareColors(string color)
        {
            if (Color.Equals(color))
                return true;
            else return false;
        }


    }

في المثال أعلاه، قامت الفئة Car بتطبيق واجهتين هما IVehicle و IColor، وأعادت تعريف جميع عناصرهما.
كخلاصة، الواجهات تقوم بتعريف وظائف وخصائص الفئات فقط دون كتابة الأوامر البرمجية، والغرض من استخدام الواجهات أساسا هو تعويض مفهوم الوراثة المتعددة، إذ لا يمكن للفئة الواحدة الوراثة من أكثر من فئة رئيسية، بينما يمكنها تطبيق أكثر من واجهة.
كما تسمح الواجهات بتوصيف شامل لجميع عناصر الفئات التي تستخدمها، إذ تحتوي على تعريف جميع الوظائف والخصائص.

الفروق بين الفئات المجردة والواجهات:

1. الفئات المجردة يمكنها أن تحتوي على وظائف بأوامر برمجية Implementation، بينما الواجهات لا تسمح بذلك وتكتفي فقط بتقديم تعريفات للعناصر.
2. يمكن للفئات المجردة أن تحتوي على ما تحتويه الفئات العادية كالمشيدات Constructors  والمهدمات Destructors بينما بنية الواجهات لا تسمح بذلك.
3. يمكن للفئة الواحدة أن ترث من فئة مجردة واحدة، بينما يمكنها أن تطبق أكثر من واجهة.
4. الفئات المجردة تبدأ بالكلمة abstract بينما تبدأ الواجهات بالكلمة interface.
5. على الفئة التي تستخدم واجهة ما، إعادة تعريف جميع عناصرها، بينما في حال الوراثة من فئة مجردة فهي ليست ملزمة بذلك.
6. يستحسن استخدام الفئات المجردة حينما نحتاج إلى إعادة تعريف بعض عناصر الفئة الرئيسية فقط على مستوى الفئات البنات، بينما يستحسن استخدام الواجهات حينما نحتاج إلى إعادة تعريف جميع العناصر على مستوى الفئة.

لهذه الأسباب يفشل الناس في البرمجة !

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

أولا: العجلة


لقد رأيتك وأنت تنتقل من لغة إلى لغة مسرعا وفي عجلة من أمرك، فلا يكاد يهنأ لك بال مع لغة جافا حتى تقفز إلى لغة بايتون، ولا يكاد يستقيم حالك مع برمجة قواعد البيانات في سي شارب حتى تنط إلى برمجة الألعاب في سي بلس بلس، لم تستوعب فريموورك سامفوني فتركته مستهترا وتوجهت إلى لارافيل فأنت ملول عجول، تبرمج لتتباهى أمام الأقران فتتناهى كحطب الأفران، وتتعلم لتماري نفسك فتداري نقصك، أما بلغك أن في التأني السلامة وفي العجلة الندامة، أما وقد أدركت الآن أصل الخلل فاعزم على ترك العجلة في البرمجة فإنها مدعاة إلى الفشل.

ثانيا: كثرة الموارد


فلما نهجت للبرمجة نهج المستعجل، أكثرت من جمع الدورات والمحاضرات والدروس والكتب والمقالات، ولو سألتك الآن كم كتابا قرأت في البرمجة لأجبتني أنك لم تكمل كتابا واحدا، ولو سألتك كم دورة برمجية تابعتها من بدايتها حتى نهايتها ودونت ماجاء فيها من معلومات نظرية وأنجزت ما ورد فيها من تطبيقات وأمثلة وتوسعت فيها بالبحث والتنقيب لكان جوابك صفرا، لأنك تفتح المحاضرة وتمرر شريط القراءة لتسمع فقط ما تحب سماعه وما يغص به حلقك من معلومات مهمة تتجاهلها أو ترجئها إلى حين فتحرم نفسك من خير كثير لو صبرت عليه لبلغت ما تصبو إليه، تريد مثالا: تدرس لغة سي شارب وتشاهد فقط دروس برمجة الواجهات وتهرب من المفوضات Delegates و تقنية Linq وتعدد المسارات Multi-Threading هروب السليم من الأجرب، ولو أدركت مافي هذه المفاهيم - وغيرها مما تهرب منه - من الخير لعضضت عليها بالنواجذ.
قم بحذف جميع الكتب والدوارت والموارد المعرفية من حاسوبك واحتفظ بمصدر واحد فقط لأن الوفرة تدفع إلى الانتقائية، والانتقائية تدفع إلى المماطلة.

ثالثا: غياب الخطة والرؤية الواضحة


لعل غياب التخطيط يعد من أعظم أسباب الفشل في البرمجة، لما له من أثر سريع على أداء المبرمج، لأن غياب التخطيط يعني عدم الجدية في العمل، فكيف تكون جادا في تعلم جافا وأنت لم تخصص لها وقتا؟ بل كيف تكون جادا في برمجة ألعاب الأندرويد وأنت لم تضع مخططا يوضح لك من أين تبدأ وإلى أين تنتهي؟ وقياسا على قول المفكر الأمريكي بنيامين فرانكلين: “إذا فشلت في التخطيط فقد خططت للفشل” يمكننا القول: “إذا غاب عنك التخطيط فقد غاب عنك النجاح”.
اكتب أهدافك دائما، وقم بالتخطيط لكل هدف عبر كتابة الخطوات المفضية إليه لكي تتضح الرؤية وإلا فإنك ستبقى تضحك على نفسك.

رابعا: السعي إلى الربح السريع


قد تلتزم بالأناة في التعلم، وقد تحتفظ بمصدر معرفي مكتمل، وقد تضع مخططا سليما يشمل مختلف خطوات بلوغ الهدف الذي حددته، لكن بمجرد ما تفتح صفحتك على الفيسبوك تطالعك صورة أمين رغيب وهو يتوشح وساما من حاكم دبي أو صورة لسيمو لايف وهو ينشر شيكا وصله من كليك بانك قيمته آلاف الدولارات أو غيرهم، حتى تختل موازينك وترمي ما كان في يدك وتركض إلى غير هدف وتنسى كل ما عاهدت نفسك بملازمته لأن الطيش يجري فيك مجرى الدم في عروقك، فتبدأ بالبحث عن كيفية الربح من التسويق الالكتروني ثم تدخل في دوامة جديدة لن تخرج منها بطائل ولو أنك تمهلت قليلا وواصلت سيرك لتفوقت على كل من تراهم قد بلغوا ذروة النجاح، ولكنه الطيش يأبى إلا أن يلازم صاحبه حتى يحيله إلى فاشل محبط.

خامسا: النقاشات الجانبية


لا تشغل بالك بالنقاشات الجانبية التي لن تضفي إلى صرحك المعرفي لبنة واحدة، ركز في هدفك وثق في الأدوات التي تستخدمها ولا تدافع عنها بعصبية أمام خصومها لأنك لن تقنعهم بأي حال من الأحوال، فهم أيضا متعصبون إلى أدواتهم ويرونها أبهى من ضفائر بثينة.
إن كنت تبرمج بلغة سي شارب فلا تنتقص لغة جافا، لأن ذلك سفاهة منك و سوء تقدير بل تصرف صبياني سيفتح عليك باب الويلات، خلاص أنت مقتنع بلغتك؟ طيب واصل سيرك ولا تلتفت إلى أي نقاش جانبي لأن ذلك من خوارم المروءة قبل أن يكون من خوارم البرمجة.

سادسا: التقليد


في درب النجاح لا مكان للنسخ المكررة، إما أن تكون نفسك أو تترك سبيل النجاح وتنهج سبيل المقلدة الذين لن يضيفوا شيئا جديدا، وأقصى ما يستطيعون تقديمه لن يتجاوز بأي حال من الأحوال سقف ما قدمه من سبقوهم، لأن التقليد يقتل الإبداع، وإذا مات فيك الإبداع فلا تفكر في النجاح أبدا.
استفد من الكل ولا تقلد أحدا، حتى يجتمع فيك ما تفرق في غيرك.

تخفيضات بنسبة 50% في الحقيبة البرمجية إلى غاية شهر يونيو القادم


مقدمة

بسبب توقف الموقع في الفترة الأخيرة تم تمديد فترة التخفيض إلى غاية نهاية شهر يونيو القادم إن شاء الله.
السلام عليكم ورحمة الله وبركاته،
تسعد أكاديمية المبرمجين العرب بتخفيض سعر الحقيبة البرمجية بنسبة كبيرة تصل إلى 50 بالمئة، بغرض تشجيع الجميع على تعلم البرمجة، وتحفيزهم على إنتاج مشاريع برمجية قوية ومتنوعة.

ماهي الحقيبة البرمجية لاحتراف لغة الفيجوال بسيك 2015؟


الحقيبة البرمجية لاحتراف لغة الفيجوال بسيك دوت نيت هي مجموعة من المحاضرات المرئية التي تمتد إلى 180 محاضرة، باللغة العربية الفصحى وبأسلوب علمي متدرج يجمع بين الشرح النظري العميق والتطبيق العملي السليم.

أنا مبتدىء، هل تناسبني الحقيبة البرمجية؟


نعم، الحقيبة البرمجية موجهة إلى كافة المستويات، لأنها تبدأ من الصفر عبر شرح أساسيات البرمجة وكيفية تحميل وتثبيت الأدوات اللازمة، انتهاء بصناعة برامج قوية متصلة بقواعد البيانات.

ما الذي سأستفيده من الحقيبة البرمجية؟


تحتوي الحقيبة البرمجية على عشرات المحاضرات القوية والمتنوعة، والتي ستعلمك العديد من التقنيات البرمجية نذكر منها على سبيل المثال لا الحصر:
  • محاضرات كافية لأساسيات البرمجية بلغة الفيجوال بسيك 2015 من الصفر
  • محاضرات كافية  للبرمجة الكائنية التوجه Object Oriented Programming
  • محاضرات كافية  لبرمجة الواجهات وشرح أهم الأدوات
  • محاضرات كافية في أساسيات التعامل مع MS SQL Server 2014
  • محاضرات كافية في برمجة قواعد البيانات بالوضع المتصل Connected Mode
  • محاضرات كافية في برمجة قواعد البيانات بالوضع المنفصل Disconnected Mode
  • محاضرات كافية في برمجة قواعد البيانات باستخدام الإجراء ات المخزنة Stored Procedures
  • محاضرات كافية في التعامل مع البيانات المحفوظة في ملفات XML
  • محاضرات كافية في العديد من التقنيات والآليات التي ستحتاجها في برمجة المشاريع
  • محاضرات كافية في التحزيم و الإعدادات وحماية البيانات من SQL Injection
  • إنشاء مشروع إدارة الطلبة من الصفر بقاعدة بيانات من نوع MySQL
  • إنشاء مشروع إدارة المبيعات من الصفر بقاعدة بيانات من نوع MS Access

ما هو سعر الحقيبة البرمجية كاملة؟


قبل هذا التخفيض، كان سعر الجزء الأول من الحقيبة هو 70 دولارا أمريكيا، والجزء الثاني كان سعره 100 دولارا أمريكيا.
أما الآن فالسعر الشامل للحقيبة البرمجية كاملة بجزأيها الأول والثاني هو 85 دولار أمريكي، وهذا التخفيض محدود ابتداء من التاريخ الحالي إلى غاية نهاية شهر يونيو القادم إن شاء الله (30/06/2016).

أريد شراء الحقيبة البرمجية كيف أتصرف؟


توجه إلى أقرب وكالة لتحويل الأموال مثل وكالات ويسترن يونيون Western Union، وقم بتحويل المبلغ إلى المعلومات الآتية:
Full name: Khalid ESSAADANI
Identification card number: IB191359
Country: Morocco
City: Beni Mellal
بعد القيام بالتحويل، قم بأخذ صورة لوصل الحوالة، وأرسلها إلى البريد التالي:
mobarmijoun@gmail.com
و ستتم مراسلتك بجميع الدروس عبر بريدك الالكتروني.


تتقدم أكاديمية المبرمجين العرب بالشكر الجزيل إلى كل من قام بدعمها بشراء الحقيبة البرمجية، وتعدكم بمزيد من الإنتاج والعطاء إن شاء الله.

في حفظ الله ورعايته.

حول شراء ميكروسوفت لمنصة Xamarin


قبل أيام قليلة أعلنت شركة ميكروسوفت شراءها لمنصة Xamarin الشهيرة، ولمن لا يعرف هذه الأخيرة فهي عبارة عن بيئة لتطوير تطبيقات الموبايل الموجهة لمختلف أنظمة التشغيل (أندرويد، ويندوز، iOS).
هذه المنصة تم بناؤها من طرف نات فريدمان و المبرمج المكسيكي ميغيل ديكازا سنة 2011، وكمعلومة إضافية فإن ميغيل هوأحد المشاركين في بناء مشروع مونو Mono Project، الذي مكن مبرمجي الدوت نيت من بناء برامجهم على نظام لينكس و ماك OS.
عموما لنعود إلى منصة Xamarin، قلنا أنها ظهرت عام 2011، وهي تسمح للمبرمجين ببناء تطبيقات موبايل قابلة للاشتغال على مختلف أنظمة الموبايل الشهيرة (أندرويد، iOS، ويندوز).
لغة البرمجة الأساسية المعتمدة في منصة Xamarin هي لغة سي شارب، وقد تم تضمين Xamarin في الفيجوال ستوديو منذ الإصدار 2013، ولأنه لقي قبولا لدى مبرمجي الدوت نيت ارتأت شركة ميكروسوفت أن تقوم بشرائه.
ربما ستجعل ميكروسوفت منصة Xamarin مجانية لكي تشجع مبرمجي الدوت نيت على إنتاج أكبر عدد ممكن من البرمجيات لنظام الويندوز فون والويندوز 10، لكن ما قد يحدث فعليا هو أن هؤلاء المبرمجين سيتجهون بمنصة Xamarin لبناء تطبيقات أندرويد وiOS، فتكون ميكروسوفت بذلك قد دقت آخر مسمار في نعش الويندوز فون.
لا أظن أن شركة بحجم ميكروسوفت ستغفل هذا الأمر من حسابها، لذلك قد تجنح إلى جعل منصة Xamarin مجانية لتطوير تطبيقات ويندوز فون، ومدفوعة لتطوير تطبيقات أندرويد و iOS، وكلها مجرد تخمينات شخصية في انتظار ما ستكشفه الأيام القادمة، ولعل ندوة Build التي ستعقد من تاريخ 31 مارس إلى 1 أبريل من العام الحالي 2016 ستحمل أجوبة شافية لهذه التساؤلات، على الأقل هذا ما صرحت به ميكروسوف عبر المنشور التالي، و "يا خبر بفلوس، بكرة ببلاش :)" على رأي إخوتنا في مصر.

البرمجة، ذلك الوحش !


أرهقوك بالمصطلحات الغامضة، ضَغَطْتَ على أعصابك فوق وُسْعِكَ لتظفر منهم ولو بشظية أمل..
لكنهم خذلوك…
صَوَّرُوهَا لك كالوحش الضاري ذي الأنياب الذَّرِبَة..
فَخِفْتَ إن أنتَ دَنَوْتَ منه أن ينهش ما بقي لديك من صبر، وجئت هنا كمحاولة أخيرة لتقول لهؤلاء القوم: هذه آخر فرصة لديكم لتقنعوني أن البرمجة ليست وحشا كما تصورت !
أُبَشِّرُكْ، قد وضعت قدميك في المكان الصحيح، في هذه المقالة سترى البرمجة ـ ذلك الوحش الضاري ـ أرنبا ورديا لطيفا، لكن مقابل ذلك أعرني تركيزك لدقائق يسيرة، وأعدك بإرجاع الثقة إليك بعون الله تبارك وتعالى.
خليلي...
سأفترض مسبقا أن علاقتك بالبرمجة كعلاقة الفلاَّح بموسيقى الروك...
ليس من باب تقليص ظلك، وإنما من باب التبسيط، فلا تُلْقِ علي العتب إن أنا أفرطت في التسهيل، لأن وراء الأكمة ما وراءها، وما تراه أنت تافها، كان السبب المباشر لغيرك في رؤية البرمجة وحشا كاسرا..
جاهز؟ فَلْنَمْضِ على بركةٍ من الله إذن...
مبدئيا، لنتفق أن البرمجة لا تعدو أن تكون طريقة للتواصل مع جهاز الحاسوب، نقول له مثلا: قم بتعديل الصورة التالية، أو شغل الملف الصوتي التالي، أو قم بترجمة الكلمات التي سأكتبها لك إلى لغة أجنبية ما...
هذه الأوامر بيننا نحن البشر عادية جدا، سأفهمك إذا خاطبتني بهذه اللغة، وَسَأُنَفِّذُ لك طلباتك إذا كنتُ قادرا عليها، لكن تخيل معي أن هذا الحاسوب لا يفهم لغاتنا البشرية، هذا الكلام لو رددناه له إلى الصبح لن يفقه منه شيئا، لأن للحاسوب لغته الخاصة، التي علينا الإلمام بها إذا أردنا أن نتواصل معه.
أ تدري ما اسم تلك اللغة يا خليلي؟ اسمها لغة الآلة Machine Language، لأن آلة الحاسوب تفهمها..
بعض الناس يسمونها اللغة الثنائية Binary Language، وقد تنظر إلي الآن بنظرات شزراوات وتسألني: وما معنى اللغة الثنائية؟
هدىء من روعك يا خليلي فالمسألة أبسط بكثير مما تتصوره..
السر وراء هذه التسمية، هو أن لغة الحاسوب قائمة بالأساس على وحدتين اثنتين، هما صفر و واحد، ومنهما جاءت هذه التسمية: اللغة الثنائية...
ستبستم حتما، لكنك سرعان ما ستستعيد تجهمك وتسألني من جديد: ما معنى أن لغة الحاسوب قائمة على الصفر و الواحد؟
سأقول لك بكل بساطة: الحاسوب جهاز الكتروني، مكون من أجهزة فرعية متصلة به، بعضها خاص بالإدخال وبعضها خاص بالإخراج، والبعض الآخر يقوم بمعالجة البيانات المدخلة ويقوم بإخراجها.
البيانات التي تدخل إلى الحاسوب ليعالجها (بمعنى أوضح ليتعرف عليها ويقوم بتنفيذها) تدخل على شكل بيانات ثنائية، على شكل سلاسل من الأصفار والآحاد، حينما تدخل تخزن في ذاكرة الحاسوب، فيقوم المعالج Processor بأخذ هذه البيانات وقراءتها وتنفيذها ومن ثم إرسالها إلى أجهزة الإخراج المعدة لها.
سأزيد المسألة تبسيطا وتفكيكا، عبر الصور التالية: التي أتمنى أن تتأملها بحب:
عملية معالجة البيانات من الإدخال إلى الإخراج

سنعطي مثالا للعملية التي توضحها الصورة أعلاه:
وأنت تنوي الدخول إلى حاسوبك الشخصي، ستطالعك واجهة إدخال كلمة السر (ليس في كل الحالات، لكن أنا متأكد أنك تعرف تلك الواجهة)
هل استحضرت صورتها في ذهنك الآن؟
ممتاز، لنواصل إذن..
هذه الواجهة تنتظر منك أن تدخل كلمة السر، أول خطوة ستقوم بها هي الضغط على حروف لوحة المفاتيح لكتابة كلمة السر..
هذه هي عملية إدخال البيانات، لوحة المفاتيح هي جهاز الإدخال، و كلمة السر التي ستكتبها هي البيانات المدخلة..
هذه البيانات حينما تدخل إلى جهاز الحاسوب يتم تخزينها في الذاكرة، والذاكرة يا خليلي مكونة من خانات لاستقبال البيانات الثنائية، هذه الخانات لها عناوين لكي يتعرف المعالج على عنوان كل قيمة مخزنة...
بعد أن يتم تخزين هذه البيانات في الذاكرة، يأتي دور وحدة المعالجة أو المعالج لقراءتها، ومقارنتها بكلمة السر الخاصة بالحاسوب، إن حصل تطابق، يتم فتح الحاسوب، وإلا فإنه يعرض لك رسالة خطأ مفادها أن كلمة السر المدخلة غير صحيحة، وفي الحالتين معا النتيجة المرجعة يتم إخراجها إليك عبر الشاشة، إذن فالشاشة جهاز إخراج، والرسالة المرجعة هي بيانات مخرجة..
اتضحت الصورة الآن يا خليلي؟
إن كان كذلك، فعد إلى الصورة من جديد، وتخيل أحد السيناريوهات التي تقوم بها عادةً، وارسم على ورقة مختلف المراحل التي تقطعها لإنجازه مرورا بالإدخال وانتهاء بالإخراج..
بعد أن تقوم بذلك، وستقوم به بعون الله...أنا أعرفك جيدا، وأقرأُ رسائل النصر في عينيك !
بعد ذلك تعال معي لنتفقد أنفسنا أين نحن..
تعرفنا على جهاز الحاسوب وعلى اللغة التي يفهمها، وعلى الأجهزة الفرعية المتدخلة في عمليات إدخال ومعالجة وإخراج البيانات.
لنا عودة مع لغة الآلة يا خليلي...فأعرني انتباهك يرحمك الله !
ستقرأ عن هذه اللغة في كتاب سأهديه إليك، وسترى أنها لغة سهلة التعلم، لكن لو طلبت منك كتابة برنامج بها، قد لا تتمالك أعصابك وستبحث عن أقرب شيء منك، لتتلقفه في غياب وعي وترسله على رأسي لتشجني، لكنني سأزيغ برأسي وأعود لأقول لك:
خليلي...
لستَ مطالبا بكتابة البرامج بلغة الآلة، فقد وُجِدَتْ بدائل رائعة جدا تسهل عليك ذلك، أ تدري ما اسمها؟
اسمها لغات البرمجة Programming Languages..
إنها لغات وسيطة، قريبة من لغاتنا البشرية، ومن السهل على الحاسوب تحويلها إلى لغته الثنائية.
هذه اللغات سهلت عليك المهمة بشكل رهيب، لكنها كثيرة جدا يا خليلي، فكيف تختار لغتك؟
لن أخذلك يا صديقي وأتركك هنا...
سأدلك على كتاب مختصر، يمكنك قراءته في أسبوع واحد، وبعد مطالعة الكتاب وتطبيق ما جاء فيه، سأدلك على مقطع فيديو يريك كيف تختار لغتك ومن أين تبدأ.
في هذا الكتاب، ستتعلم ماهي اللغة الثنائية، وماهي أنظمة تمثيل البيانات الأخرى المتوفرة، وستتعلم كيف تكتب البرامج على شكل خوارزميات.
الجميل في هذا الكتاب، أنه يأخذ بيدك من الصفر..
والأجمل من ذلك أنه يعلمك البرمجة باللغة العربية، وبل ويترجم لك الخوارزميات باللغة الانجليزية حتى لا تجد صعوبة في تحويلها إلى برامج حقيقية بعد ذلك..
لا أشكر لك الكتاب يا خليلي لأنه من تأليفي، معاذ الله ! وإنما أصف لك ما فيه حقا، وسترى صدق ما أقول بعد أن تختمه..


بعد الكتاب شاهد المقطع المصور التالي:

ففيه ستعرف ماهي لغة البرمجة التي تناسبك...
بعد أن تقوم باختيارها، اشتغل عليها بجد واجتهاد، وحينما تبرمج أول برنامج لك بها...
افتح باب غرفتك، ونادي أمك بهدوء وخضوع..
أو أقول لك: من الأفضل أن تذهب أنت إليها..
بل اذهب أنت إليها..
ثم قبل رأسها ثلاثا وقل لها:
لقد طلب مني ذلك خالد من المغرب الأقصى !

كتاب جديد: المختصر المفيد في تقنية WCF بلغة سي شارب

مقدمة الكتاب:

شهدت بنيات الأنظمة المعلوماتية تطورا ملحوظا مع مرور الزمن، بدء من البنية التقليدية التي كانت تقدم للمستخدمين أنظمة أحادية الخدمة، عبارة عن تطبيقات انفرادية يشتغل عليها مستخدم واحد، بل ولا تقدم له كل ما يحتاجه في عمله، إذ يضطر أن يوزع مهامه بين عدة برامج، فيقوم بإدخال المعطيات في برنامج خاص بقواعد البيانات، ثم بعد ذلك يقوم بالاستعلام عن هذه البيانات من خلال برنامج آخر مخصص لهذا الغرض، فإذا أراد أن ينشىء التقارير Reports توجه إلى برنامج آخر وهكذا دواليك.
أمام هذه التعقيدات، كان لزاما على المعلوميات أن ترقى بمجال الأنظمة، فظهر جيل جديد من البرمجيات يعتمد على الشبكات Networking platforms، بحيث تسمح هذه البنية الجديدة بتقسيم المهام بين الأجهزة والربط فيما بينها عبر الوسيط الشبكي، فعلى سبيل المثال لو أردنا نظاما متصلا بقاعدة بيانات، نقوم بإعداد جهاز سيرڤر نضع عليه برنامج إدارة قواعد البيانات، ثم نقوم بتثبيت التطبيق على مختلف الحواسيب العميلة التي نريدها أن تتعامل معه، ومنه سميت هذه البنية ببنية خادم / عميل Client /Server -.
وظهرت كذلك بنيات أخرى، لعل أبرزها بنية الأنظمة الموجهة خدميا Service Oriented Architecture والمعروفة اختصارا ب SOA، هذه الأنظمة التي تكون عادة في حاجة إلى الاتصال بخدمات الويب بغرض الاستفادة منها عبر الوصول إلى الوظائف Methods التي تقدمها فتستخدمها.
واعتمدت الأنظمة الموجهة خدميا على تقنيات عديدة تسمح بنقل البيانات البرمجية (الكائنات Objects) بين مختلف مكونات النظام عبر الانترنت أو الشبكات المحلية، لأنه ليس لزاما في هذه البنية أن تكون مكونات نظام معين موجودة على نفس الجهاز، إذ أن هذه البنية معدة خصوصا للأنظمة التي تتميز بتباعد مكوناتها جغرافيا، وتسمى هذه الأنظمة بالأنظمة الموزعة Distributed Systems.
من غير شك سبق لك وأن سمعت بالأنظمة الموزعة أو التطبيقات الموزعة Distributed Applications، فهي بكل بساطة أنظمة مركبة وعناصرها متفرقة مكانيا، وتتواصل هاته العناصر فيما بينها عبر الآليات الشبكية، إما عبر الانترنت أو عبر الشبكة المحلية للمؤسسة.
عملية تبادل الكائنات بين مختلف مكونات النظام الموزع تحتاج إلى بعض التقنيات المتقدمة، مثل تقنية خدمات الويب Web Services، تقنية .net remoting، تقنية RMI في لغة جافا، تقنية COM (Component Object Model) التي تسمح بالتواصل بين التطبيقات والمكونات الموجودة على نفس الجهاز، وتقنية DCOM (Distributed COM) التي تعتبر النسخة الموزعة من تقنية COM بحيث تسمح بالتواصل بين التطبيقات والمكونات الموجودة على عدة أجهزة عبر استخدام الشبكات، ويوجد ماهو أحدث منها كتقنية COM+، وتقنيات أخرى كثيرة إلا أننا سنغض الطرف عنهم كلها ونركز فقط على صديقتنا الغالية WCF، وسوف نتناولها بإذن الله في هذا الكتيب المختصر، فما هي تقنية WCF؟ ومتى ظهرت؟ ولماذا سنحتاجها؟ وإذا احتجناها كيف نستخدمها ؟
بداية، فإن تقنية WCF تعد اختصارا ل Windows Communication Foundation، وقد صاحبت إصدار الدوت نيت فريموورك 3.5، وطرحتها ميكروسوفت كتقنية بديلة للتقنيات المستخدمة في الأنظمة الموزعة لإنهاء مشاكل عدم التوافقية بين مكونات النظام.
الجميل في التطبيقات الموزعة أن مكوناتها قابلة لإعادة الاستخدام، إضافة إلى كونها مهيأة للاستخدام المتعدد من طرف عدة تطبيقات في نفس الوقت، والأجمل من هذا وذاك أن هذه المكونات مخفية عن عين المستخدم النهائي End User الذي لا يعلم ما الذي يجري في خفايا النظام الذي يستعمله، إذ كل ما تقع عليه عيناه يتمثل في واجهات الاستخدام، إما نماذج ويندوز Windows Forms أو صفحات ويب Web Forms.
الهدف الرئيسي من تقنية WCF هو السماح بنقل الكائنات Objects عبر الشبكات المحلية للمؤسسات أو عبر الانترنت من أجل تمكين التطبيقات التي تحتاج هذه الكائنات من الوصول إلى وظائفها واستعمالها.
لعمل ذلك، لابد من استضافة خدمات WCF على جهاز سيرڤر، وإعداده بكيفية تجعله قادرا على التجاوب مع استعلامات العملاء Clients.
من جهة العميل Client Side، ونتحدث هنا عن التطبيق المثبت على الأجهزة العميلة التي ستستخدم خدمات WCF المرفوعة على سيرڤر، فلا بد أن نوفر لهذا التطبيق العميل جميع المعلومات الأساسية التي تسمح له بالاتصال بخدمات WCF واستعمالها بشكل سليم.

رابط تحميل الكتاب:

اضغط هنا لتحميل الكتاب بصيغة PDF





لست طبيبا أنا مريض مثلكم


أنا مريض، وأنتم الأطباء

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

أنا طبيب، وأنتم المرضى

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

لست طبيبا أنا مريض مثلكم !


"كلنا مرضى" أهون علي من أن أكون مريضا دون العالمين، أو طبيبا على عيادة من المرضى تمتد من القطب الشمالي إلى القطب الجنوبي.
ما لي وللناس؟ سأحيى حياتي وفق الخط المحمدي، وَأَعْظِمْ به من خط !
أما خوفي من المجهول فقتلته بالإيمان بالقضاء والقدر..

وغروري وتكبري قهرتهما بالتواضع وخشية الرحمن وخفض جناح الذل من الرحمة لوالدي، وألا أمشي في الأرض مرحا.

هكذا علمني الإسلام، وهكذا انتشلتني أنامل الرحمة من براثين العذاب، فالحمد لله رب العالمين !