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

هشام رزق الله

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

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

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

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

    31

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

  1. هنالك العديد من الطرق في لغة روبي (وبالتحديد ريلز) لإرسال رسالة بدون استخدام نموذج، وأسهلها استدعاء تابع mail بدلا من ActionMailer::Base ومن ثم نتبعه مباشرة بتابع deliver. على سبيل المثال سيرسل السطر التالي نص تجريبي باستخدام الطريقة التي شرحناها أعلاه: ActionMailer::Base.mail(:from => "me@example.com", :to => "you@example.com", :subject => "test", :body => "test").deliver يمكنك زيارة التوثيق الرسمي للمزيد من المعلومات حيث سيعطيك جميع خيارات الرأس وأفكار أخرى حول كيفية إرسال رسائل متعددة/بديلة مع نص كامل أو نص Html.
  2. على الرغم من أن هاتين الطريقتين لإضافة عنصر/عناصر إلى مصفوفة معينة في لغة روبي متشابهتين للغاية من ناحية الوظيفة إلا أن هنالك بعض الاختلاف بينهما فـ << تقبل فقط معامل واحدة وستدفعه إلى نهاية المصفوفة في حين أن push من جهة أخرى، تقبل معامل واحد أو أكثر وستدفعهم جميعا إلى نهاية المصفوفة ويمكن استخدمها كالتالي (لاحظ أننا وضعنا رمز * قبل اسم المصفوفة الثانية): a = [1,2,3] b = [4,5,6] a.push *b => [1,2,3,4,5,6]
  3. في بايثون طرق عديدة للتأكد من صياغة سكربت بايثون عبر تجميعه وبدون تشغيله فعلى سبيل المثال يمكنك فعل ذلك من داخل سكربت بايثون آخر عن طريق دالة compile من مكتبة py_compile حيث ستمرر لها اسم الملف (أو مساره في حالة ما كان في مجلد آخر مختلف عن الحالي) ومن ثم ستتمكن من التأكد من صياغته كما في المثال التالي: import py_compile py_compile.compile('my_script.py') أو يمكنك فعل ذلك مباشرة من خارج سكربت البايثون وعبر الطرفية عن طريق تمرير خيار -m py_compile قبل اسم الملف للبايثون كما في المثال التالي: python -m py_compile script.py
  4. على الرغم من أن pass و continue قد تشابها في الوظيفة في الأمثلة التي وضعتها إلا أن كل واحدة منها تقوم بوظيفتها الخاصة، فببساطة pass لا تقوم بأي شيئ في حين أن continue تذهب مباشرة إلى الدورة التالية لحلقة التكرار. في الأمثلة التي وضعتها سيظهر الفرق إذا أضفت سطر آخر بعد جملة الشرطية if بعد تنفيذ pass وسيتم تنفيذ هذه الجملة في حين أنها بعد continue لن تُنفذ كما في الأمثلة التالية: >>> a = [0, 1, 2] >>> for element in a: ... if not element: ... pass ... print element ... 0 1 2 >>> for element in a: ... if not element: ... continue ... print element ... 1 2
  5. في لغة بايثون عدة حلول لمشكلة قسمة الأعداد الصحيحة، فإذا كنت تستخدم الإصدار الثاني فإن عمليات قسمة الأعداد الصحيحة سيتم تقريبها بدلا من أن تتحول إلى أرقام حقيقية كما في المثال التالي: >>> 1 / 2 0 ولحل هذه المشكلة تحتاج إلى جعل أحد أجزاء المعادلة كأعداد حقيقية عن طريق دالة float كما في المثال التالي: >>> float(10 - 20) / (100 - 10) -0.1111111111111111 أو يمكنك استدعاء عملية القسمة من بايثون 3 والتي ستُرجع عند الضرورة عددا حقيقيا كما في المثال التالي: >>> from __future__ import division >>> (10 - 20) / (100 - 10) -0.1111111111111111
  6. في هذه الحالة التي استخدمت فيها الأرقام لن يظهر أي اختلاف وذلك لأن الأرقام هي كائنات غير قابلة للتغيير لكنك ستلاحظ الفرق عند استخدامك لكائنات أخرى مثل السلاسل النصية والمصفوفات وhashes وأي كائنات ما عدا الأرقام لأنه عن إنشائك عدّة مراجع لنفس الكائن فستحصل على نتائج غير متوقعة وفي الغالب خاطئة كما يظهر في المثال التالي الذي استخدمنا فيه السلاسل النصية: a = b = c = d = "test" b << "x" => "testx" a => "testx" والطريقة الصحيحة لإنشاء عدّة متغيرات تملك قيمة شبيهة هي عن طريق التالي: a,b,c,d = "test","test","test","test" => ["test", "test", "test", "test"] b << "x" => "testx" a => "test"
  7. هنالك العديد من الطرق التي ستمكنك من حساب عدد الأسطر الموجودة في ملف معين، فإذا كنت على بيئة يونكس يمكنك ببساطة استخدام الأمر wc -l والذي لن يُحمّل كامل الملف إلى الذاكرة ويمكنك استخدامه داخل روبي كما في المثال التالي حيث أن المتغير filename يحتوي على مسار الملف المطلوب: filename = 'a_file/somewhere.txt' line_count = `wc -l "#{filename}"`.strip.split(' ')[0].to_i p line_count أو يمكنك استخدام دوال foreach و inject لقراءة الملف سطر سطر وتجنب قراءة كامل الملف مرة واحدة كما في المثال التالي: count = File.foreach(filename).inject(0) {|c, line| c+1}
  8. هنالك عدّة طرق في بايثون لترتيب سلسلة ذات نمط معين من الأرقام (كالتواريخ والأوقات) بترتيب مُحدّد سواء أكان تصاعدي أو تنازلي، فمثلا يمكنك استخدام دالة sort وستمرر لها مفتاح الدالة lambda الذي يحتوي على التشكيل الصحيح للتاريخ كما في المثال التالي: timestamp.sort(key=lambda x: time.strptime(x, '%Y-%m-%d %H:%M:%S')[0:6], reverse=True) أو بما أن القائمة مرتبة بترتيب تصاعدي بالفعل فيمكنك ببساطة عكس ترتيب القائمة لتحصل على الترتيب التنازلي وذلك عن طريق دالة reverse() كما في المثال التالي: >>> timestamp.reverse() >>> timestamp ['2010-04-20 10:25:38', '2010-04-20 10:12:13', '2010-04-20 10:12:13', '2010-04-20 10:11:50', '2010-04-20 10:10:58', '2010-04-20 10:10:37', '2010-04-20 10:09:46', '2010-04-20 10:08:22', '2010-04-20 10:08:22', '2010-04-20 10:07:52', '2010-04-20 10:07:38', '2010-04-20 10:07:30']
  9. بالنسبة لسؤالك حول هل يتم إعادة استدعاء الدالة في كل مرة يتم تشغيلها فالجواب لا، فبايثون يخفي بشكل تلقائي الوحدات التي يتم استدعاءها، ولذلك فإن استدعاء الوحدة للمرة الثانية (أو الثالثة أو …) لن تتم بنفس المراحل التي تمت بها في المرة الأولى. وأما عن سؤالك حول هل يتم استدعاؤها في بداية البرنامج أو عند تشغيل الدالة فالجواب هو أن بايثون يستدعي الوحدة فقط في حالة تم تشغيل الدالة.
  10. في بايثون كما في أغلب اللغات من الأفضل جعل الشيفرات البرمجية سهلة وقابلة للقراءة ومختصرة بطريقة مفهومة، فإذا كان كل ما تحتاجه من وحدة os موجود في os.path ففي هذه الحالة سيكون استعمال جملة import os.path أفضل بكثير لأنها مفهومة ومختصرة وستُسهّل على الناس معرفة ما الذي تريده بالضبط، أما في حالة ما أردت الحصول على الدوال الموجود في وحدة os وخارج os.path ففي هذه الحالة يجب عليك استعمال import os
  11. على الرغم من وجود عدّة طريق في روبي تمكنك من بتر أجزاء من سلسلة نصية تحتوي على شيفرة برمجية بلغة HTML بطريقة آمنة إلا أنه من الأفضل استخدام لغة CSS لفعل ذلك مباشرة بدلا من الاعتماد على روبي. بكل الأحوال وكإجابة على سال يمكنك استخدام تابع truncate_html حيث تمرر له السلسلة النصية والطول الذي تريده كما في المثال التالي: <%= truncate_html post.title, :length => 15 %>
  12. هنالك عدّة طرق في روبي يمكنك استخدامها كتوابع للتأكد من وجود أية بيانات أو معلومات داخل متغير معين، فيمكنك على سبيل المثال استخدام تابع any? الذي سيعمل في جميع الحالات ما عدا المصفوفة التي تحتوي على قيمة nil أو false. أما لو كنت تستخدم مكتبة ActiveSupport فيمكنك في هذه الحالة استعمل تابع present? والذي سيرجع false في حالات nil و false و '' و {} و [] وعدا ذلك سيرجع true (بما في ذلك 0). المصدر
  13. للأسف لا توجد طريقة رسمية في بايثون للقيام بجمل شرطية حسب الحالة، ففي بايثون يعتبر أفضل حل لحالات الجمل الشرطية هي if/elif/else مهما كان حجمها، وعلى الرغم من ذلك فإنه هنالك العديد من البدائل لهذا النوع من الجمل الشرطية والتي يمكنك استخدمها في برامجك، فمثلا يمكنك استخدام طريقة القاموس حيث ستصنع قاموس وتضع فيه جميع الاختيارات المطلوبة ومن ثم تنشئ لكل خيار دالة معينة له تضع فيه الأوامر التي تريد تطبيقها كما في المثال التالي: # define the function blocks def zero(): print "You typed zero.\n" def sqr(): print "n is a perfect square\n" def even(): print "n is an even number\n" def prime(): print "n is a prime number\n" # map the inputs to the function blocks options = {0 : zero, 1 : sqr, 4 : sqr, 9 : sqr, 2 : even, 3 : prime, 5 : prime, 7 : prime, }وستتمكن من اختيار الحالة الشرط الصحيحة عن طريق السطر التالي: options[num]()
  14. حسب التوثق الرسمي لتعليمة الاستدعاء import يجب عليك استخدام النقطتين داخل التسلسل الهرمي للحزمة:
  15. هنالك عدّة طرق في لغة بايثون لتحويل None إلى سلسلة نصية كما طلبت فمثلا يمكنك استخدام دوال مدمجة كدالة str() والتي ستُمكنك من إرجاع سلسلة نصية فارغة في حالة كان المعامل هو None كما يظهر في المثال التالي: def xstr(s): if s is None: return '' return str(s) أو يمكنك اختصار المثال السابق أكثر وجعل محتوى الدالة في سطر واحد فقط عن طريق استخدام الجمل الشرطية بطريقة مختصرة كما تظهر في المثال التالي: def xstr(s): return '' if s is None else str(s) ومن الطرق الأخرى التي يمكنك استخدامها هي عن طريق استعمال دالة lambda كما في الأمثلة التالية: xstr = lambda s: s or "" print xstr("a") + xstr("b") # -> 'ab' print xstr("a") + xstr(None) # -> 'a' print xstr(None) + xstr("b") # -> 'b' print xstr(None) + xstr(None) # -> ''
  16. هنالك عدة طرق سهلة في لغة روبي للحصول على حرف واحد دون طباعة زر الإدخال (Enter)، فمنذ الإصدار 2 من روبي أصبح هنالك وحدة io/console والتي تحتوي على getc من STDIN للقيام بهذه الوظيفة فيكفي أن تسندها إلى متغير للحصول على الرمز الذي تريده: #!/usr/bin/ruby begin system("stty raw -echo") str = STDIN.getc ensure system("stty -raw echo") end p str.chrلاحظ أننا استخدمنا تابع chr لتحويل المدخل من عدد إلى حرف آسكي لتتمكن من التعامل معه في برنامجك.
  17. هنالك عدة طرق في لغة روبي للدوران على مدى وقت معين، ففي الإصدارات السابقة للروبي (ما قبل الإصدار 1.9) يمكنك استخدام تابع step كما في المثال التالي: (start_time..end_time).step(3600) do |hour| # ... end ومع ذلك، فإن هذه الإستراتيجية بطيئة نوعا ما، لأنها ستستدعي تابع succ 3600 مرة، وبدلا من ذلك يمكنك استخدام هذه الطريقة التي استعملنا فيها حلقة التكرار while: hour = start_time while hour < end_time # ... hour += 3600 end إذا كنت تستخدم ريلز فيمكنك استبدال 3600 بـ 1.hour والذي سيكون أكثر قابلية للقراءة.
  18. لا أعتقد أن هنالك فائدة من ذلك، فحتى لو استطعت التأكد من أن البريد الإلكتروني صحيح نحويا، ستحتاج إلى التأكد من أن المستخدم لم يخطئ في كتابته، وهذا الأمر لا يمكنك فعله، فالطريقة الوحيدة للتأكد من البريد الإلكتروني هي عن طريق إرسال رسالة تحتوي على رابط للتأكد من البريد الإلكتروني. ولذلك يمكنك استخدام التحقق الأساسي من البريد الإلكتروني أي التأكد من وجود رمز @ واحد وهنالك على الأقل نقطة واحدة بعد رمز @ فيمكنك فعل ذلك عن طريق التعبير النمطي التالي: [^@]+@[^@]+\.[^@]+ويمكنك استخدامه عبر الشيفرة التالية: import re if not re.match(r"... regex here ...", email): # whatever
  19. حسب ما فهمته أنك تبحث عن دالة chr. يبدو أنك تخلط بين التمثيل العشري للأعداد الصحيحة وبين التمثيل السداسي العشري (hex) للأعداد الصحية، لذلك لم أفهم بالضبط ما الذي تريده بالضبط، فحسب السؤال الذي وضعته أعتقد أنك ستحتاج إلى واحدة من هذه الدوال الموجودة هنا: >>> chr(0x65) == '\x65' True >>> hex(65) '0x41' >>> chr(65) == '\x41' Trueلاحظ أن هذا مختلف قليلا عن السلسلة النصية التي تحتوي على عدد صحيح كعدد سداسي عشري، فإذا أردت ذلك، استخدم دالة hex المدمجة كما في المثال.
  20. هنالك عدة طرق في لغة بايثون لتمرير محتويات القاموس إلى سلسلة نصية، فيمكنك على سبيل المثال فك تحزيم القاموس عبر استخدام رمز النجمتين "**” مباشرة قبل اسم القاموس كما يظهر في المثال التالي: geopoint = {'latitude':41.123,'longitude':71.091} print('{latitude} {longitude}'.format(**geopoint)) أو يمكنك أيضا استخدام نمط التنسيق الجديد والذي يدعم الإشارة إلى سمات كائن وعناصر الدواران وذلك عن طريق دالة format كما في المثال التالي: '{0[latitude]} {0[longitude]}'.format(geopoint) 'The title is {0.title}s'.format(a) # the a from your first example كما يمكنك استخدام دالة format_map في الإصدار الثالث من بايثون وستعمل بدون مشاكل.
  21. يمكنك استخدام تابع singleton_class للوصول إلى كائن singleton لأي صنف (والذي ظهر في الإصدار 1.9 من لغة روبي)، وبهذه الطريقة يمكنك الوصول إلى تابع alias_method، وبما أن التابع خاص (private) لذلك سوف نحتاج إلى استدعائه أولا باستخدام تابع send ومن ثم تمرير بقية التوابع وستكون الشيفرة البرمجية النهاية متكونة من سطر واحد كما في المثال التالي: singleton_class.send(:alias_method, :generate, :new) لا تنسى أن alias لن يعمل هنا.
  22. هنالك فرق كبيرة وواضح بين الإثنين، فأهم مميزات gem: يمكن نشر gem على أنها إضافات.فالجيم (gem) هو تطبيق روبي محزم باستخدام نظام التحزيم المعرف بواسطة RubyGems.إطار ريلز هو gem.أما بالنسبة للإضافات فهي تتميز بـ: الإضافة هي ملحق لإطار ريلز.تملك ملف install.rbلا يمكن نشر الإضافة كـ gemلا يمكنك ترقية الإضافة عن طريق استخدام أمر معين، للترقية يجب عليك حذف الإضافة ومن ثم تثبيت النسخة الجديدة.
  23. دائما في حالة ما أردت الحصول على أية معلومات حول أي تنسيق معين يتبعه مبرمجي بايثون فأنصحك بالإطلاع على PEP8 فهو أفضل مكان لإيجاد هذه المعلومات. وإجابة سؤالك في PEP8 هي كالتالي: المصدر
  24. لا توجد دالة في لغة بايثون للدوران حول القيم في القاموس، لكن أسهل طريقة لفعل ذلك هي استخدام طريقة "تفهيم القاموس" (dict comprehension) كما في المثال التالي: my_dictionary = {k: f(v) for k, v in my_dictionary.items()} في الإصدار 2.7 من بايثون استخدم iteritems() بدلا من items() لتوفير الذاكرة، كما أن صياغة "تفهيم القاموس" لم تعرف حتى الإصدار 2.7 من بايثون. لا توجد كذلك دالة في لغة بايثون للدوران في القائمة لذلك يمكنك في هذه الحالة استخدام map(). مثال لاستخدام map() مع المثال السابق: my_dictionary = dict(map(lambda (k,v): (k, f(v)), my_dictionary.iteritems()))
  25. إن وحدة pprint تمتلك العديد من الدوال المفيدة ومن بينها دالة pformat التي ستقوم بإرجاع سلسلة نصية للمتغير الذي ستمرره لها، وحسب التوثيق الرسمي فالدالة تقوم بالتالي: إرجاع تمثيل منسق للكائن كسلسلة نصية، ويمكنك تمرير البادئة والعرض والعمق إلى منشئ PrettyPrinter كمعاملات للتنسيق. مثال على استخدام هذه الدالة مع قائمة تحتوي على قواميس، لاحظ أننا مررنا البادئة: >>> import pprint >>> people = [ ... {"first": "Brian", "last": "Kernighan"}, ... {"first": "Dennis", "last": "Richie"}, ... ] >>> pprint.pformat(people, indent=4) "[ { 'first': 'Brian', 'last': 'Kernighan'},\n { 'first': 'Dennis', 'last': 'Richie'}]"
×
×
  • أضف...