تجربة مطور ويب: من تصميم لغة برمجة وحتى Ruby وRails
السلام عليكم ورحمة الله تعالى وبركاته..
أهلًا ومرحبًا بأعضاء سوالف سوفت، أهنئكم بالشهر الكريم، ثم أتحدث في موضوعي هذا عن تجربتي البسيطة والمتواضعة كمطور للويب (مبرمج ومصمم مواقع وتطبيقات ويب) من PHP، إلى تطوير لغتي الخاصة، ثم التعرف على لغة Ruby، ثم تطوير إطار عمل خاص بي، وحتى إستعمال إطار عمل Ruby on Rails بإذن الله..
------------------
ملاحظة هامة: هذا الموضوع من كتابتي - نسخة معدلة تعديلات بسيطة جدًا، كتبته باسم sitesmaker في الفريق العربي للبرمجة (رابط الموضوع). التوثيق: في نهاية الموضوع في الفريق العربي للبرمجة ذكرت أني سأنقله إلى سوالف سوفت وترايدنت. لذا رجاءً عند نقل الموضوع الإشارة للموضوع الأصلي في الفريق العربي للبرمجة. وجزاكم الله خيرًا.
------------------
مقدمة:
كنت ولازلت – والحمد لله – مطورًا متواضع الحال للويب، بدأت مشواري بلغة PHP، واستعملتها لمدة من الزمن حتى لاحظت عدم إرتياحي. كان أمامي إما التعود على PHP، وإما أن أجد بديلًا! من المعلوم لدى أي مطور ويب الانتشارية الكبيرة للغة PHP، فتجدها في غالبية خوادم الويب، مما كان يعني بالنسبة لي أن البديل لا يمكن أن يكون لغة أخرى لصعوبة استعمال أي لغة أخرى على الويب – مقارنة بلغة PHP. وهنا ههمت مباشرة بتطوير لغتي الخاصة – نعم تطوير لغة بـPHP نفسها! كانت تجربة ممتعة حقًا وفاشلة أيضًا في محاولة تطوير لغة برمجة، ورغم ذلك تعلمت منها كثيرًا بفضل الله.
أثناء تطوير للغة، توقفت عن المعاندة، وتعرفت أكثر وأكثر على OOP (البرمجة كائنية التوجه)، وعلى Functional Programming (البرمجة الوظيفية)، وأضفت منهما إلى لغتي. كان ذلك بتعرفي على لغات أخرى مثل Python وRuby ولغات أخرى – في ظل التطوير للغتي كذلك. مع مرور الوقت، ومع تأكدي من فشل لغتي بسبب البطء الشديد، كنت قد أعجبني النظام في Python، وظهرت لي لغة Ruby. كانت بالنسبة لي Python ولكن بخصائص عجيبة! في المراحل الأخيرة من تطوير اللغة، بدأت أنقل الكثير من خصائص Ruby بتغييرات بسيطة إلى لغتي، مما سهل علي عند تأكدي من فشل اللغة التحويل إلى Ruby سريعًا بعد ذلك – عازمًا على تطوير إطار عمل بها إذن!
تعريف بلغة Ruby:
ماتت لغتي، وانتقلت لتعلم Ruby بشكل منظم بدلًا من القراءات المتفرقة السابقة، اختلف تصوري عنها إلى حد ما، خصائصها العجيبة اتضح بأن لها فوائد عجيبة أيضًا! لغة Ruby باختصار عبارة عن مزيج ممتع من التوجه الكائني، والتوجه الوظيفي. قمت بتلخيص أفضل خصائص اللغة في الآتي:
1- كل شيء عبارة عن كائن: في Ruby كل شيء – تقريبًا – يعتبر كائنًا، الفئة (class) كائن يرث من الفئة Class، وأنواع البيانات (الأرقام والنصوص والمصفوفات...) عبارة عن كائنات. هكذا تستمتع بسلاسة وتوحد ونظام في كل شيء. بل وضمن هذا يمكنني ذكر أن كل شيء تقريبًا تتعامل فيه مع كائن هو عبارة عن نداء لدالة (method)، حتى الجمع والطرح وغير ذلك، إلا تقريبًا نداء الدوال لا يمكن أن يكون كذلك في حد ذاته.
2- كل شيء مفتوح للتعديلات: في Ruby يمكنك على سبيل المثال أن تضيف دالة للفئة Object، وبالتالي تجد تلك الدالة في كل الكائنات (بشكل أدق كل الكائنات التي ترث من Object)، أو أن تضيف لفئة Fixnum الخاصة ببعض الأرقام دالة خاصة بضرب الرقم في اثنين ثم جمعه بواحد مثلًا، ثم تجد تلك الدالة موجودة عندك في أي رقم ينتمي لتلك الفئة. هذه التعديلات يمكن أن تحدث "بعد" إنشاء الفئة أصلًا!
3- Ruby Blocks: توظيف واستعمال أنيق وسلس للبرمجة الوظيفية، تخيل تمرير دالة إلى دالة الدوران على أعضاء مصفوفة، لتقوم بتحديد ما تفعله دالة الدوران كل مرة. أو أن تمرر إعدادات خادم الويب، أو تبحث في مصفوفة، أو تمرر محتوى إلى دالة تقوم بطباعة كودHTML بهذه الطريقة.
4- Ruby Gems: تنصيب أي إمكانية أو خاصية أو برمجية في لحظات بسهولة، واستعماله ضمن مشروعك. مثلًا أحتاج إطار العمل الفلاني، أنصب "الجوهرة" الخاصة به، كذلك مع تقريبًا كل شيء من نظام قواعد بيانات إلى محرك قوالب! Ruby Gems تشبه إلى حد ما على ما أذكر PEAR في PHP، لكن الفرق شاسع في سهولة الاستعمال وعدد المشاريع وأنواعها – لم أنصب مشروع أو برمجية واحدة من قبل من PEAR، لكن نصبت الكثير – ربما عشرات – الجواهر من Ruby Gems.
5- الخصائص النحوية للكود: الكود حقيقة شكله جذاب إلى حد كبير، وكأنه أيضًا يشرح نفسه، ويقوم على تبسيط أشياء كثيرة، فلا تجد تلك الأقواس الكثيرة المعهودة في لغات أخرى، وتجد مثلًا أن الدالة عندما ينتهي إسمها بعلامة إستفهام (مثل "nil?”) فهي تعيد إما true و إما false، والدالة آخرها علامة تعجب تختلف عن نفس الدالة بغير علامة تعجب أنها تقوم بالأمر بشكل أخطر، مثال: ترفع exception لو حدث خطأ، أو تعدل مباشرة على الكائن بدلًا من إعادة القيمة.
6- إطار عمل Ruby on Rails.
7- التكامل (بينما الكمال لله وحده) بين المشاريع المتعددة بسهولة كبيرة جدًا، على سبيل المثال تكامل بين إطار عمل من اختيارك، ونظام قوالب من اختيارك، وقاعدة بيانات من اختيارك، وإطار عمل JavaScript من اختيارك، و إطار عمل CSS من اختيارك.. ولجواهر Ruby Gems دور كبير هنا أيضًا!
وفيما يلي تفصيل آخر نقطتين..
إطار العمل Rails وفكرة التكامل في Ruby:
إذن تعلمت Ruby بفضل الله، و أثناء ذلك أو بعده كنت قد حولت إلى Ubuntu بدلًا من الويندوز، وبدأت عازمًا على أمر واحد فقط، وهو تطوير إطار عمل بها يعوض إمكانيات اللغة. فلغتي – تمامًا مثل PHP – كانت عبارة عن لغة + إمكانيات إطار عمل، أو نصف إطار عمل. بدأت بالعمل جاهدًا، وتعلمت أكثر أثناء البناء، وبعد أسابيع راجعت نفسي، واصلًا لأنه لا داع لتطوير إطار عمل الآن، PHP لم تكن تكفني، لكن ربما أحد أطر العمل الموجودة فعلًا في Ruby تكفيني، وعلى الرغم من أني لم أكن من المعجبين بفلسفة الـMVC، إلا أني "أجبرت" نفسي على تعلم إطار عمل Ruby on Rails (يختصر Rails). وهكذا مرارًا وتكرارًا مصارعًا ما كان يعجبني وما كان لا يعجبني مسبقًا – إلا PHP لا أظن يمكنني العودة، هههه!
لكن.. صبرًا! أنت قلت أنك حولت إلى Ubuntu بدلًا من الويندوز أعلاه، أليس كذلك؟ بلى! لماذا تحول في وسط تعلمك لأمور جديدة وإنشغالك تحويلًا كبيرًا كهذا؟! الواقع أني في Windows كنت أواجه مشاكلًا كبيرة منها بطء حاسبي، أو كون الإصدار هو Windows Vista، ومشاكل متكررة مع Rails وبعض "الجواهر" من Ruby Gems. بالإضافة إلى أني تكاملت بشكل أفضل مع Ubuntu ووجدته أكثر أناقة وسرعة ويشعرك بسيطرة أكبر على الجهاز، وتتعامل فيه مع Terminal كثيرًا (يسميه أهل ويندوز Command Line – سطر الأوامر). قد تسأل وما علاقتي أنا هنا كقارئ باستعمالك لسطر الأوامر من عدمه؟! فأجيبك بأنك تحتاجه كثيرًا من أجل Ruby وRails (الواقع وربما أيضًا مع Ubuntu إن كنت تستعمله). لا تقلق إن كنت "تخاف منه"، ستعتاد سريعًا إن شاء الله.
نعود لموضوعنا، إذن الآن ها قد تعلمت مبادئ وفلسفيات Rails، لكن كيف أبدأ مشروعًا جديدًا؟ كنت أحب أن أكتب مشروعي بنفسي من البداية للنهاية، لكن الواقع، بعد أن جربت طريقة Rails - وهي إستخدام سطر الأوامر لتوليد المشروع (التطبيق) وملفاته - لأقل من أسبوع، أيضًا أعجبتني (ههههه، في البداية لم يكن يعجبني أي شيء إلا Ruby فقط – حتى ربما Ruby Gems لا!). الآن عندما تبحث عن شيء في التطبيق تعرف بفضل الله أين تذهب، ولو كان مشروع غيرك. كيف؟ لأن تقريبًا كل تطبيقات Rails لها نفس النظام، بسبب التوليد الآلي!
من ضمن ما قد يعجبك في Rails أن أغلب الأشياء لها دوال وسهلة الاستعمال على سبيل المثال تضيف عدد بسيط من الحروف إلى نموذج HTML تجعله يعمل بـAJAX. أيضًا تلاحظ سهولة كبيرة في التعامل مع فلسفة MVC (باختصار فصل التصميم عن مصدر البيانات (مثل قاعدة بيانات) و الربط بينهما) مع Rails أو أي إطار عمل استعمل نفس طرق Rails! كذلك تدير لك Rails الجلسات (sessions)، والاتصال بقاعدة البيانات، و تقدم لك ما يسمى بالـActive Record، و الذي هو عبارة عن فئة، تقدم لك وسيلة بسيطة للتعامل مع جدول في قاعدة البيانات، على شكل فئة، يخرج منها عدد من الكائنات، كل كائن منهم يمثل صف في الجدول مع إمكانيات كبيرة بديلة عن جزء غير صغير من SQL.
يمكنك أيضًا أن تبحث عن "جوهرة" في Ruby Gems، توفر لك التعامل مع Twitter Bootstrap مثلًا (ما يشبه إطار عمل لـCSS) حتى تستطيع في دقائق التعامل معه ضمن تطبيقك. تريد إستعمال Backbone.js أو jQuery أو Prototype أو محرك القوالب المفضل عندك أو غير ذلك؟ بسيطة ابحث عن الجوهرة المناسبة لدمج ما تريد بـRails وادمج كل ما تريد بـRails بيسر إن شاء الله. تريد أن تتابع آداء تطبيقك؟ تضيف سطرًا واحدًا لملف يسمى Gemfile، وتنفذ أمر واحد فقط في سطر الأوامر، وتشغل خادم الويب الذي يأتي مع Rails على جهازك بأمر واحد فقط في سطر الأوامر، ثم تفتح التطبيق في المتصفح، وتجد أمامك التطبيق ومعه حساب للآداء كما أردت!
كذلك تفرق Rails بين خادم التطوير، وخادم التشغيل الحقيقي في الإعدادات وغيرها .وأيضًا باستعمال سطر الأوامر يمكنك توليد التطبيق آليًا، ثم توليد أجزاء جاهزة منه أيضًا بعدد بسيط من الأوامر! باختصار، تحاول Rails القيام بما لا وقت لك أنت للقيام به، مع إمكانية التخصيص بنفسك إن شئت، بإذن الله.
أمثلة وأكواد بلغة Ruby:
أعلم أني أطلت جدًا جدًا جدًا، فتقبلوا اعتذاري، فيما يلي مثال بلغة Ruby سأشرحه بتعليقات بسيطة بإذن الله (تبدأ بـ#).
كود:module Html def self.insertParagraph returned = '<p>' # A variable named returned. content = yield # yield is a method (same as yield()) that executes the block given (code between do...end). returned << content # Add content to the end of the variable returned. returned << '</p>' # Now returned = '<p>' + yield + '</p> puts returned # Print the value of returned. end end Html.insertParagraph do 'ABCDEFGHIJK..' end # Prints: '<p>ABCDEFGHIJK..</p>' puts 5 + 2 # Prints 7. class Fixnum # The class of numbers (some numbers!). alias_method :add, :+ def +(x) # Redefine the adding method (ex. '2+3' => '2.+(3)') if (1..10).include? x # If x is between 1 and 10: self - x # Subtract! What? The addition will subtract! else self.add x # This uses the 'alias_method :add, :+' line to use the old +. end end end puts 5 + 2 # Prints only 3 (not 7!). See the method '+' above. puts 15 + 2 # Prints only 17 (adds, so not 13!). See the else in the method '+' above.
حقًا أعتذر عن كتابة التعليقات بالانجليزية – هل يمكن بالعربية؟! ستكون غربية حقًا لأن العربية كما تعلمون من اليمين إلى اليسار....الخ. إذا كان الكود غير واضحًا أرجو الاستفسار..
لمزيد من الأمثلة، وللتعرف على الفرق بين Ruby واللغات الأخرى: يمكنكم زيارة هذه الصفحة من موقع Ruby الرسمي.
أمثلة وأكواد باستعمال إطار عمل Rails:
بالطبع الكود في Rails مقسم بشكل كبير بين ملفات ومجلدات، وسأحاول تبسيط ذلك في المثال التالي:
محتوى ملف posts_controller.rb:
كود:class PostsController def index @posts = Post.all # Make @posts instance variable = An array of all posts. end end
محتوى ملف posts.rb:
كود:class Post < ActiveRecord::Base attr_accessible :id, :cotent, :title # Allow access to mypost.id, mypost.content and mypost.title. end
محتوى ملف index.html.erb:
كود:<% @posts.each do |post| %> Post <% post.id %>: <% post.title %> <% end %>
هذه الأسطر كافية بإذن الله (مع باقي الملفات الجاهزة) لكتابة الآتي في الصفحة – في حال وجود تلك البيانات في قاعدة البيانات أساسًا بكل تأكيد، كمثال فقط:
كود:Post 1: My post title Post 2: Ruby programming language Post 3: AJAX on Rails Post ….......
*ملاحظة: يمكن بكل تأكيد إستعمال مولدات Rails الآلية للكود لتوليد كود أفضل كثيرًا من هذا وبشكل آلي ثم التعديل عليه بإذن الله.
ملاحظة مرة أخرى: هذا الموضوع من كتابتي - نسخة معدلة تعديلات بسيطة جدًا، كتبته باسم sitesmaker في الفريق العربي للبرمجة (رابط الموضوع). التوثيق: في نهاية الموضوع في الفريق العربي للبرمجة ذكرت أني سأنقله إلى سوالف سوفت وترايدنت. لذا رجاءً عند نقل الموضوع الإشارة للموضوع الأصلي في الفريق العربي للبرمجة. وجزاكم الله خيرًا.
أعتذر مرة أخرى على الإطالة.. وجزاكم الله خيرًا، و السلام عليكم ورحمة الله تعالى وبركاته.