اذهب إلى المحتوى

هشام رزق الله

الأعضاء
  • المساهمات

    1442
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    31

كل منشورات العضو هشام رزق الله

  1. سأخبرك بطريقتين سهلتين للتأكد من نوع متغير فيما إذا كان عددًا صحيحًا أم لا بحيث يتم إرجاع true أو false، الأولى استخدام التابع is_a? ومن ثم تمرير نوع المتغير المراد التحقق من نوعه كما في المثال التالي: >> 1.is_a? Integer => true أما الطريقة الثانية فهي عن طريق استخدام التعابير النمطية، فعلى سبيل المثال قمتُ في هذا المثال بإنشاء دالة جديد باسم is_numeric? وظيفتها التأكد من نوع المتغير: def is_numeric?(obj) obj.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true end مثال على الاستخدام: is_numeric? "545" #true is_numeric? "2aa" #false
  2. هنالك فرق بسيط بين هذين التابعين لكن دعنا نشرح وظيفة التابع sub أولا. إن التابع sub هو من التوابع المدمجة في روبي ويُستخدم مع السلاسل النصية حيث يأخذ السلسلة النصية ويقوم باستبدال الحرف/الحروف التي تمررها أولا بالحرف/الحروف التي تم تمررها بعد ذلك كما في المثال التالي: >> "hello".sub('l', '*') => "he*lo" أما بالنسبة إلى gsub فهو يشبه sub إذ يقوم بنفس وظيفته، لكن الفرق بين التابعين أن sub يستبدل أول حرف/حروف التي يصادفها فقط أما gsub فهو يستبدل جميع الحروف الموجودة في السلسلة النصية كما في المثال التالي: >> "hello".gsub('l', '*') => "he**o" المصدر
  3. يُسمى ملف بايثون الذي يحتوي على أصناف بـ "الوحدة" أما لو كانت عدة ملفات بايثون تحتوي على أصناف موجودة في مجلد معين فسيسمى ذلك المجلد بـ "الحزمة”. قد تحتوي الوحدة على عدة أصناف، حيث يتم استدعائها في البرامج لقراءتها واستخدام الأصناف والدوال الموجود فيها. بما أنه لا يوجد عدد محدد من الأصناف التي يمكنك إنشاؤها، فيمكنك أن تنشئ العدد الذي تريده من الأصناف في الوحدات، لكن أنصحك بأن تضع كل صنف في ملف مستقل حتى تستطيع استخدامها وتعديلها بدون مشاكل.
  4. سأحاول شرحها بأبسط ما يمكن: إن render() هي اختصار جديد لـ render_to_response أي كأنك تستدعيها مع معامل context_instance الذي سيفرض استخدام RequestContext. الصيغة العامة للدالة: render(request, template[, dictionary][, context_instance][, content_type][, status][, current_app])أما render_to_response فهي دالة التَصْيير (render) العادية التي تُستخدم في الفيديوهات والشروحات التعليمية. الصيغة العاملة للدالة: render_to_response(template[, dictionary][, context_instance][, mimetype]) أما بالنسبة إلى direct_to_template فهو عرض (view) عام الذي أستخدمه في عروضي (ليس في روابطي (url)) لأنه مشابه للدالة الجديدة render()، فهو يستخدم بشكل تقائي RequestContext مع جميع context_processor التابعة لها. المصدر
  5. يمكنك استخدام سكربت reindent.py الذي ستجده في مجلد Tools/scripts/ بعد تثبيت بايثون. نبذة تعريفية عن البرنامج: يُغير البرنامج ملفات .py لتصبح مسافة البادئة فيها بمقدار 4 مسافات وسيتم حذف جميع حروف tab، وبالإضافة إلى ذلك سيتم حذف المسافات ومحارف tab من نهايات الأسطر ومن نهاية الملف (سيتم حذف الأسطر الزائدة)، وفي النهاية سيتأكد السكربت من أن السطر الأخير سوف ينتهي بسطر جديد واحد فقط. المصدر
  6. شرح مبسط لكل واحدة: تُستخدم r لفتح الملف للقراءة منه فقط.تُستخدم r+ لفتح الملف للقراءة والكتابة.تُستخدم w لمسح محتويات الملف للكتابة فيه أو لإنشاء ملف جديد.تُستخدم w+ للقراءة والكتابة في الملف دون حذف محتوياته وسيتم إنشاء الملف إذا لم يكن موجودا.تُستخدم a للكتابة في الملف وسيتم إنشاء الملف إذا لم يكن موجودا.تُستخدم a+ للقراءة والكتابة في الملف وسيتم إنشاء الملف إذا لم يكن موجودا.المصدر
  7. على الرغم من أنه يبدو أن للنوعين نفس الوظيفة إلا أنه لكل واحد منهم وظيفة خاصة تختلف عن الآخر، فالتوابع المحمية (protected) هي التوابع التي يمكن أن يتم استدعائها عن طريق أي مثيل من الصنف المُعرف أو من أصنافه الفرعية، أما التوابع الخاصة (private) فلا يمكن أن يتم استدعائها إلا من داخل كائن الاستدعاء، فلا يمكنك الوصول إلى توابع مثيل خاص آخر بشكل مباشر.
  8. يمكنك فعل ذلك بسهولة في ريلز أو في روبي (يجب عليك في حالة عدم وجود ريلز تثبيت مكتبة ActiveSupport قبل تنفيذ الشرح)، فيكفي أن تستخدم تابع in_time_zone ومن ثم تُمرر له المنطقة الزمنية التي تريدها بمساعدة تابع TimeZone.new كما في المثال التالي: zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)") Time.now.in_time_zone(zone) أو يمكنك اختصار السطرين السابقين إلى هذا السطر فقط: Time.now.in_time_zone("Central Time (US & Canada)") يمكنك إيجاد جميع أسماء مناطق الزمنية الموجودة في ActiveSupport عن طريق كتابة السطر التالي: ActiveSupport::TimeZone.all.map(&:name)المصدر
  9. في لغة الروبي يسمى الرمز <- الذي يتكون من خط أعلى السطر ومن رمز علامة "أكبر من" بلامبدا حرفيّة (lambda literal) ويجب تمرير معاملات لها في الإصدار الثاني للروبي على عكس الإصدارات القديمة التي تكون بدون معاملات. مثال على استخدام العامل <-: ->(x) { x * 2 } وسيكون المثال السبق مشابه لهذا المثال في روبي: lambda { |x| x * 2 } كما يجب أن لا تخلط بين هذا الرمز وبين الرمز <= فالكثير من المبتدئين يقعون في هذا الخطأ.
  10. هنالك طرق مختلفة لحذف مجموعة من الأحرف الموجودة في قائمة معينة فيمكنك أن تستخدم الدالة المدمجة translate كما يظهر في المثال التالي: >>> chars_to_remove = ['.', '!', '?'] >>> subj = 'A.B!C?' >>> subj.translate(None, ''.join(chars_to_remove)) 'ABC' حيث أن subj هي السلسلة النصية التي تريد حذف الأحرف منها. أما الطريقة الثانية فهي عن طريق التكرار على جميع الأحرف الموجودة في سلسلة نصية معينة ومن ثم حذف الحرف إذا كان موجود في قائمة الحروف التي يجب حذفها كما في المثال التالي: >>> sc = set(chars_to_remove) >>> ''.join([c for c in subj if c not in sc]) 'ABC' كما يمكنك أيضا إنشاء تعبير نمطي عن طريق استخدام دالة sub من مكتبة re كما في هذا المثال: >>> import re >>> rx = '[' + re.escape(''.join(chars_to_remove)) + ']' >>> re.sub(rx, '', subj) 'ABC' المصدر
  11. إن exec كانت تعليمة برمجية في الإصدار الثاني من البايثون وأصبحت دالة في الإصدار الثالث منه، وهي تجمع (compiles) بشكل فوري المعادل للتعليمة برمجية أو مجموعة من التعليمات الموجودة في سلسلة نصية معينة، مثال لاستخدام exec: exec('print(5)') # prints 5. # exec 'print 5' if you use Python 2.x, nor the exec neither the print is a function there exec('print(5)\nprint(6)') # prints 5{newline}6. exec('if True: print(6)') # prints 6. exec('5') # does nothing and returns nothing. أما بالنسبة إلى eval فهي دالة مدمجة (وليست تعليمة برمجية)، وتقوم بمعادلة التعبير ومن ثم ستُرجع القيمة التي قام ذلك التعبير بإنتاجها كما يظهر في المثال التالي: x = eval('5') # x <- 5 x = eval('%d + 6' % x) # x <- 11 x = eval('abs(%d)' % -100) # x <- 100 x = eval('x = 5') # INVALID; assignment is not an expression. x = eval('if 1: x = 4') # INVALID; if is a statement, not an expression. المصدر
  12. هنالك حلّين بسيطين لمعرفة عدد وحدات العالجة المركزية (CPU) التي تستخدم بايثون في جهازك، الأولى هي عن طريق دالة cpu_count من مكتبة multiprocessing حيث تقوم بطلب هذه الدالة بدون تمرير أي شيء لها كما في المثال التالي: import multiprocessing multiprocessing.cpu_count()أما الطريقة الثانية فهي عن طريق دالة cpu_count من مكتبة psutil وكما في الدالة الأولى فلن تقوم بتمرير أي شيء لهذه الدالة لكي تعمل وإنما يجب عليك ببساطة أن تقوم بطلبها فقط كما في المثال التالي: >>> import psutil >>> psutil.cpu_count() 2 المصدر
  13. هنالك عدة طرق للتأكد من وجود سلسلة نصية معينة داخل السلاسل النصية في قائمة في بايثون، فإذا أردت فقط التأكد من وجود abc في أي سلسلة نصية في القائمة دون عرضها أو معرفة عدد تكرارها فيمكنك استخدام هذه التعليمات البرمجية لفعل ذلك: some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456'] if any("abc" in s for s in some_list): # whatever وإذا أردت الحصول على جميع العناصر التي تحتوي على abc لعرضها أو للقيام بعمليات عليها أو استخدامها لأغراض أخرى فيمكنك الاستعانة بهذا السطر الذي سيجمع جميع السلاسل النصية التي تحتوي على الكلمة المطلوبة ومن ثم سيضعها في المتغير matching: matching = [s for s in some_list if "abc" in s]
  14. هنالك طريقتين لحل هذه المشكلة حسب إصدار روبي المثبت على جهازك، فإذا كنت تستخدم الإصدارات الجديدة للروبي فيمكنك في هذه الحالة استخدام تابع escape من مكتبة cgi لترميز السلسلة النصية كما في المثال التالي: str = "\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a" require 'cgi' CGI.escape(str) # => "%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A" وهنالك طريقة أخرى تعمل على الإصدارات الأقدم من روبي (تم إزالتها في الإصدارات الجديدة) وهي عن طريق استخدام تابع encode من وحدة open-uri للترميز كما في المثال التالي: require 'open-uri' str = "\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a".force_encoding('ASCII-8BIT') puts URI::encode(str) كما يمكنك استخدام ERB::Util.url_encode للترميز كما في المثال التالي: >> ERB::Util.url_encode("foo/bar? baz&") => "foo%2Fbar%3F%20baz%26" المصدر
  15. هنالك طريقتين بسيطتين لحذف العنصر الأخير من قائمة معينة في روبي، فيمكنك على سبيل المثال استخدام التابعين المدمجين first و size لحذف العنصر الأخير كما في المثال التالي: a.first a.size - 1أو يمكنك استخدام التابع drop لحذف العنصر الأول مع عكس اتجاه المصفوفة ومن ثم إعادة عكس اتجاه المصفوفة مرة أخرى لتعود إلى وضعها الطبيعي مع حذف العنصر الأخير كما في المثال التالي: a.reverse.drop(1).reverse ملاحظة: اسند السطور السابقة إلى متغير إذا أردت الاحتفاظ بالنتيجة. المصدر
  16. تختلف طرق حساب المدة الزمنية في بايثون، لكن أسهلها هي عن طريق استخدام مكتبة time، فكل ما يجب عليك فعله هو تشغيل دالة time من المكتبة في البداية وعند تنفيذ شيفرات برمجية معينة أو عند إغلاق البرنامج ستقوم بطرح وقت التشغيل من الوقت الحالي لتحصل على وقت التنفيذ بدقة أجزاء من الثانية كما يظهر في المثال التالي: import time start_time = time.time() main() print("--- %s seconds ---" % (time.time() - start_time)) وسوف تكون النتيجة مشابهة لهذه: --- 0.764891862869 seconds ---ملاحظة: تختلف المدة الزمنية من حاسوب لآخر حسب قدرات كل حاسوب. المصدر
  17. أفضل جواب لهذا السؤال هو أن جويدو (Guido مخترع البايثون) يعتقد أنه لا حاجة للتعليقات متعددة الأسطر، فلقد قام منذ بضعة سنوات بكتابة تغريدة حول كتابة تعليقات متعددة الأسطر وقال فيها أنه يمكنك استخدام السلاسل النصية متعددة الأسطر عن طريق استخدام الرموز "”” بين التعليقات، فهي حسب رأيه إذا لم تُستخدم كسلاسل نصية للتوثيق فإنها لن تقوم بتوليد أي شيفرة برمجية. لذا أنصحك باستخدام الرمز # للتعليق بشكل عادي أو يمكنك كما قال جويدو أن تستخدم طريقة السلاسل النصية متعدد الأسطر على الرغم من أنه من المستحسن تجنب استخدامها لغير التوثيق(docstrings)
  18. المشكلة الرئيسية في كتابة except: pass هي أن هذا السطر سيتجاهل جميع أنواع الأخطاء مهما كانت مثل امتلاء الذاكرة أو رغبة المستخدم بإيقاف البرنامج أو مشكلة في إيقاف البرنامج... فكاتب هذا السطر يريد أن يوقف فقط خطأ معين مثل خطأ في الشبكة، والمشكلة أنه إذا حدث أي خطأ غير متوقع، فإن البرنامج سيستمر بصمت وسوف تحدث مشاكل كثيرة أخرى غير متوقعة ولن تتمكن من تنقيح البرنامج بسهولة (إلا لو غيرت سطر except: pass لتعرف مصدر الخطأ).
  19. في العادة لا يستخدم مثل هذا السطر في لغة روبي كثيرا فأغلب الأحيان تكون الوحدات والسكربتات في روبي منفصلة، لكن هنالك طريقة تشبه هذا السطر في روبي وهي عن طريق استخدام السطر if __FILE__ == $0 كما في المثال التالي: if __FILE__ == $0 foo() bar() end لكن تبقى هذه الطريقة غير شائعة وأنصحك أن تبقي الوحدات والسكربتات في روبي منفصلة، لأن هذا السطر يستخدم في حالة تم تشغيل وحدة معينة كسكربت وهو غير ضروري. المصدر
  20. بشكل عام من الأفضل استخدام رموز {} عندما تقوم بعمليات بسيطة مثل استدعاء تابع أو مقارنة... كما في المثال التالي: some_collection.each { |element| puts element } أما لو احتجت إلى القيام بعمليات وأعمال متعددة الأسطر وأكثر تعقيدا ففي هذه الحالة يُنصح باستخدام كتلة do كما في هذا المثال: 1.upto(10) do |x| add_some_num = x + rand(10) puts '*' * add_some_num end ملاحظة: إن رموز {} لديها أسبقية أعلى من do..end، وهذا قد يساعدك بالقيام بأشياء في بعض الأحيان وقد بسبب لك أخطاء ومشاكل في أحيان أخرى كما في المثالين التاليين: 1.upto 3 do |x| puts x end 1.upto 3 { |x| puts x } # SyntaxError: compile errorفالمثال الثاني لن يعمل إلا لو وضعت أقواس كالتالي: 1.upto(3) { |x| puts x } المصدر: كتاب Ruby Cookbook
  21. أسهل وأسرع طريقة لتحويل قائمة من الحروف إلى سلسلة نصية هي استخدام تابع join مع سلسلة نصية فارغة حتى نجمع كافة عناصر القائمة دون ربطهم بأي رابط مع تمرير القائمة التي نريد تحويلها إلى سلسلة نصية كما في المثال التالي: >>> a = ['a', 'b', 'c', 'd'] >>> ''.join(a) 'abcd' في بعض الإصدارات القديم من بايثون (أغلبها موجود في الإصدارات القديمة من لينكس) يجب عليك استخدام مكتبة string بدلا من التوابع المدمجة كما في المثال التالي: a = ['a','b','c','d'] try: b = ''.join(a) except AttributeError: import string b = string.join(a,'')لاحظ أننا وضعناه كحل ثاني إذا فشل الحل العادي.
  22. هنالك عدة طرق لإيجاد عدد الأيام بين كائنين من نوع Date، أبسطها كما يلي؛ (تعمل هذه الطريقة على الإصدار 1.8 من روبي وقد تختلف في الإصدار الجديد (الإصدار 2+)). بعد أن نعين القيم للكائنين سوف نطرح الكائن الأول من الكائن الثاني كما في المثال التالي: 2.0.0-p195 :005 > require 'date' => true 2.0.0-p195 :006 > a_date = Date.parse("25/12/2013") => #<Date: 2013-12-25 ((2456652j,0s,0n),+0s,2299161j)> 2.0.0-p195 :007 > b_date = Date.parse("10/12/2013") => #<Date: 2013-12-10 ((2456637j,0s,0n),+0s,2299161j)> 2.0.0-p195 :008 > a_date-b_date => (15/1) لاحظ أننا حصلنا على عدد كسري، ويمكنك تحويله إلى عدد صحيح عن طريق التابع to_i كما في المثال التالي: 2.0.0-p195 :009 > (a_date-b_date).to_i => 15 وهذه الطريقة تعمل أيضا على كائنات DateTime كما في المثال التالي: 2.0.0-p195 :017 > a_date_time = DateTime.now => #<DateTime: 2013-12-31T12:23:03-08:00 ((2456658j,73383s,725757000n),-28800s,2299161j)> 2.0.0-p195 :018 > b_date_time = DateTime.now-20 => #<DateTime: 2013-12-11T12:23:06-08:00 ((2456638j,73386s,69998000n),-28800s,2299161j)> 2.0.0-p195 :019 > a_date_time - b_date_time => (1727997655759/86400000000) 2.0.0-p195 :020 > (a_date_time - b_date_time).to_i => 19 2.0.0-p195 :021 > c_date_time = a_date_time-20 => #<DateTime: 2013-12-11T12:23:03-08:00 ((2456638j,73383s,725757000n),-28800s,2299161j)> 2.0.0-p195 :022 > a_date_time - c_date_time => (20/1) 2.0.0-p195 :023 > (a_date_time - c_date_time).to_i => 20 المصدر
  23. الشيفرة التي كتبتها شبه صحيحة، فقط تحتاج إلى استخدام اسم تابع مختلف، فإذا كنت تستخدم ريلز 3.1 أو أحدث، يمكنك تعريف تابع change بدلا من change_table كما في المثال التالي: class AddTimestampsToUser < ActiveRecord::Migration def change add_timestamps(:users) end end وإذا كنت تستخدم نسخة أقدم فستحتاج إلى تعريف توابع up وdown بدلا من change_table: class AddTimestampsToUser < ActiveRecord::Migration def up add_timestamps(:users) end def down remove_timestamps(:users) end endهنالك حل آخر، يمكنك إضافة هذه الأعمدة عن طريق تحديد أنواع الأعمدة يدويا كما في الأمثلة التالية: class AddTimestampsToUser < ActiveRecord::Migration def change_table add_column(:users, :created_at, :datetime) add_column(:users, :updated_at, :datetime) end end سوف يتعامل ريلز مع هذه الأعمدة كأعمدة timestamp وسَيُحدّث قيمتها كالعادة. المصدر
  24. لهذه التعليمة أهمية كبيرة وهي موجودة تقريبا في جميع لغات البرمجة، وصيغتها العامة: assert condition بهذه الطريقة نطلب من البرنامج التأكّد من ذلك الشرط، وسيقوم البرنامج بإصدار خطأ إذا كانت نتيجة الشرط سلبية. تشبه تعليمة assert هذه التعليمات البرمجية في بايثون: if not condition: raise AssertionError() يمكنك تجربة assert في بايثون كما يلي: >>> assert True >>> assert False Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError تستطيع استخدام هذه التعليمة البرمجية كرسالة اختيارية للمساعدة عند برمجتك، وبعد الانتهاء من تنقيح البرنامج من الأخطاء يمكنك إزالة الأسطر التي تحتوي على التعليمة assert. المصدر
  25. هنالك عدة طرق للحصول على موقع عنصر في مصفوفة معينة في الروبي، فكل مبرمج يحل هذه المشكلة بأسلوبه، فالبعض يحوّل المصفوفة إلى hash حتى يتمكن من الحصول على موقع أي عنصر في المصفوفة بناءا على موقعه في hash كما في المثال التالي: array = ['a', 'b', 'c'] hash = Hash[array.map.with_index.to_a] # => {"a"=>0, "b"=>1, "c"=>2} hash['b'] # => 1 كما أن بعض المبرمجين يستخدمون تابعي index وrindex لحل هذه المشكلة كما في الأمثلة التالية: array = %w( a b c d e) # get FIRST index of element searched puts array.index('a') # get LAST index of element searched puts array.rindex('a') وهذا الحل يفيد في حال تكرار العنصر حيث سُيرجع أول موقع أو آخر موقع حسب الحاجة. المصدر
×
×
  • أضف...