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

هشام رزق الله

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

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

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

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

    31

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

  1. هنالك العديد من الدول في المكتبات القياسية للبايثون تُمكنك من الحصول على آخر يوم من الشهر فيمكنك على سبيل المثال استخدام دالة monthrange من وحدة calendar والتي تعريفها كما يلي من موقعها الرسمي: تقوم دالة monthrange(year, month) بإرجاع رقم اليوم الأول من كل شهر ورقم عدد أيام شهر معين في سنة معينة حسب ما يتم تمريره. مثال على الاستخدام: >>> import calendar >>> calendar.monthrange(2002,1) (1, 31) >>> calendar.monthrange(2008,2) (4, 29) >>> calendar.monthrange(2100,2) (0, 28) وإذا أردت الحصول فقط على اليوم الأخير (والذي هو نفسه عدد أيام الشهر): calendar.monthrange(year, month)[1]المصدر
  2. هنالك العديد من الحلول، فيمكنك على سبيل المثال استخدام هذه الطريقة التي استعملنا فيها التعابير العادية: import re DATA = "Hey, you - what are you doing here!?" print re.findall(r"[\w']+", DATA) # Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here'] كما أنه يوجد حل باستخدام دالة split التي سنقوم فيها بتمرير W+ بطرق مختلفة كمعامل أول، أنظر إلى المثال التالي لتفهم قصدي: >>> re.split('\W+', 'Words, words, words.') ['Words', 'words', 'words', ''] >>> re.split('(\W+)', 'Words, words, words.') ['Words', ', ', 'words', ', ', 'words', '.', ''] >>> re.split('\W+', 'Words, words, words.', 1) ['Words', 'words, words.'] ويمكنك أيضا استخدام طرق سهلة وتقليدية وغير معقدة لتقسيم السلسلة النصية، فمثلا يمكنك استخدام دالة split() لفصل رموز معينة من السلسلة النصية: >>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split() ['a', 'bcd', 'ef', 'g'] وفي النهاية يمكنك استخدام هذا الحل بدون regex حيث استخدمنا فيه دوال من مكتبة string كما في المثال: import string punc = string.punctuation thestring = "Hey, you - what are you doing here!?" s = list(thestring) ''.join([o for o in s if not o in punc]).split() المصدر
  3. العامل الحسابي نجمة واحدة * تُستخدم لفك حزمة مجموعة من القيم أو المتغيرات لتمريرها إلى دالة معينة كما في هذا المثال: def sum(a, b): return a + b values = (1, 2) s = sum(*values)ستجد أن النجمة قامت بفك الحزمة من نوع tuple وقامت بتمريرها إلى دالة sum ، أي أننا يمكننا تعويض السطر الأخير بهذا السطر: s = sum(1, 2)أما العامل الحسابي النجمتين فهي تقوم بنفس الوظيفة لكنها تُستخدم فقط من أجل القاموس كما في هذا المثال: values = { 'a': 1, 'b': 2 } s = sum(**values) ويمكنك أيضا دمج العاملين الحسابيين لتمريرهم إلى دالة معينة كما في هذا المثال: def sum(a, b, c, d): return a + b + c + d values1 = (1, 2) values2 = { 'c': 10, 'd': 15 } s = sum(*values1, **values2)والذي لديه نفس وظيفة السطر التالي: s = sum(1, 2, c=10, d=15)المصدر
  4. في الحقيقة لا توجد أية طريقة لإنشاء ثابت في لغة البايثون، وأعتقد أن هذا بسبب أن البايثون تم صنعها لتجنب التعقيدات البرمجية خاصة للمبتدئين في البرمجة، لذلك نجد الكثير من التسهيلات فيها فعلى سبيل المثال يمكنك إنشاء المتغيرات في البايثون دون الحاجة إلى تعريف نوعها وسيقوم مفسر البايثون بتعريف نوعها بشكل تلقائيا. إذا احتجت في برنامج لثابت ما قم بإنشاء متغير ومن ثم لا تقم بتغيير قيمته في جميع أجزاء البرنامج وإذا أردت توضيح المتغير أنه ثابت فيمكنك كتابته بأحرف كبيرة كما في هذا المثال: CONST_NAME = "Name"
  5. هنالك العديد من الطرق لحساب معدل ما من مجموعة من الأعداد في مصفوفة معينة في الروبي، فمثلا يمكنك استخدام التابع inject لحساب مجموع الأعداد ومن ثم استخدام التابع size لحساب عدد الأعداد لتقسيم مجموع الأعداد على عددها كالمثال التالي: arr = [5, 6, 7, 8] arr.inject{ |sum, el| sum + el }.to_f / arr.size => 6.5 لاحظ أننا قمنا باستخدام .to_f والتي سوف تجعلك تتجنب مشاكل عمليات تقسيم الأعداد الصحيحة، ويمكنك أيضا القيام بذلك بطريقة أخرى دون استخدام .to_f كما في هذا المثال: arr = [5, 6, 7, 8] arr.inject(0.0) { |sum, el| sum + el } / arr.size => 6.5 كما توجد طريقة أقصر لفعل ذلك عن طريق استخدام التوابع instance_eval و reduce لحساب المعدل كما في هذا المثال: a = [0,4,8,2,5,0,2,6] a.instance_eval { reduce(:+) / size.to_f } #=> 3.375 المصدر
  6. موضوع jruby معقد نوعا ما لكن سأحاول تفسيره أكثر ما يمكن. تعمل Jruby على Java VM و يتم ترجمتها أو تفسيرها إلى Java byte code.يمكنك دمج Jruby مع الشيفرات البرمجية المكتوبة بالجافا، فإذا كان لديك مكتبة صنف جافا (.jar)، يمكنك الإشارة إليهم واستخدامهم من داخل الشيفرة البرمجية بلغة الروبي مع Jruby، ويمكنك أيضا في نفس الوقت استدعاء شيفرة برمجية مكتوبة بـ Jruby من داخل الجافا.في الغالب يتم استضافة Jruby داخل خوادم تطبيقات جافا مثل glassfish و Tomcat.على الرغم من أنه لا يمكنك استخدام جيمات (gems) روبي مع Jruby إلا أنه توجد العديد من التعليمات البرمجية لأغلب مكتبات الروبي.فإذا لم ترغب باستخدام الجافا في برمجة تطبيقات الويب فسيكون خيارك في هذه الحالة هي ROR. المصادر 1 2
  7. هنالك عدة طرق للقيام بذلك، فيمكنك على سبيل المثال استخدام collections.Counter كما في المثال التالي: >>> from collections import Counter >>> A = Counter({'a':1, 'b':2, 'c':3}) >>> B = Counter({'b':3, 'c':4, 'd':5}) >>> A + B Counter({'c': 7, 'b': 5, 'd': 5, 'a': 1}) Counter هي صنف فرعي لـ dict، فيمكنك القيام بأي شيء كنت تفعله مع ذلك الصنف الفرعي، مثل التكرار على المفاتيح والقيم. كما يمكنك استخدام هذا الحل أيضا الذي يعتمد العمليات البسيطة والتكرار، فهذا أحل أفضل وأكثر عمومية والذي يعمل على القيم غير الرقميّة أيضا: a = {'a': 'foo', 'b':'bar', 'c': 'baz'} b = {'a': 'spam', 'c':'ham', 'x': 'blah'} r = dict(a.items() + b.items() + [(k, a[k] + b[k]) for k in set(b) & set(a)])وإذا أردت مثال أبسط فيمكنك في هذه الحالة استخدام هذا المثال، فهو من أفضل النتائج والأكثر قابلية للتفسير: class MyDict(dict): def __add__(self, oth): r = self.copy() try: for key, val in oth.items(): if key in r: r[key] += val # You can custom it here else: r[key] = val except AttributeError: # In case oth isn't a dict return NotImplemented # The convention when a case isn't handled return r a = MyDict({'a':1, 'b':2, 'c':3}) b = MyDict({'b':3, 'c':4, 'd':5}) print(a+b) # Output {'a':1, 'b': 5, 'c': 7, 'd': 5}المصدر
  8. بعض الأصناف (مثل صنف المكتبة القياسية socket) تقوم بتعريف تابع send الخاص بها، وهذا لا يشبه Object#send، فإذا أردت أن تتعامل مع كائنات من أي صنف، سوف تحتاج إلى استخدام __send__ حتى لا تسبب لك بمشاكل لاحقا. الآن قد تتسائل؛ لماذا يوجد send وليس فقط __send__، فإذا كانت __send__ فقط موجودة فسيصبح بالإمكان استخدام send من أية صنف أخرى بدون أي خلط، والسبب هو أن send قد وجدت أولا ولم يُعرف إلا لاحقا أن send يمكن أن يتم استخدامها في النصوص أخرى، لذلك تمت إضافة __send__ (وهذا نفس الشيء حدث مع id و object_id). المصدر
  9. هنالك العديد من الطرق التي سوف تمكنك من التحقق من أن قيمة المتغير لا تساوي صفر أو nil فعلى سبيل المثال يمكنك استخدام unless لتنفيذ الشيفرات البرمجية إذا كان نتيجة التحقيق إيجابية: unless discount.nil? || discount == 0 # ... end كما يمكنك استخدامها مع include حيث سنصنع قائمة صغيرة بها nil وصفر ونتأكد من عدم مطابقة عناصرها لمتغير معين حتى نتمكن من تطبيق الشيفرات البرمجية التي نريدها في حالة عدم المطابقة: unless [nil, 0].include?(discount) # ... end ويمكنك أيضا استخدام هذه الطريقة المفيدة أيضا: if (discount||0) != 0 #... end المصدر
  10. في أغلب الأوقات ستكون time.clock() هي الأفضل أما لو كنت تستخدم التوقيت لبعض الأجهزة (مثلا خوارزمية سوف تضعها في GPU)، فسوف تكون time.time() هي الحل الوحيد في هذه الحالة. ملاحظة: مهما كانت الطريقة (time.clock() أو time.time()) التي سوف تستخدمها سيعتمد الوقت على عوامل لا يمكنك التحكم بها، وهذا الأمر سيكون سيئا مع time.time() لكنه موجود أيضا في time.clock()، لذلك يجب عليك أن لا تقوم فقط بتجربة توقيت واحد لمرة واحدة، بل يجب عليك دائما أن تقوم بتجربة سلسلة من التجارب على الأوقات واختيار معدلات هذه الأوقات لتعرف الأفضل. مصدر
  11. هنالك عدة طرق لفرز العناصر المصفوفة تنازليا حسب قيمة معينة في الروبي، فيمكنك على سبيل المثال استخدام التابع sort حسب المعطيات التالية حتى تتمكن من الفرز: a.sort{|a,b| b[:bab] <=> a[:bab]}أو يمكنك أيضا استخدام التابع sort_by لترتيب عناصر المصفوفة تصاعديا ومن ثم تقوم باستخدام .reverse! لإعادة ترتيبها بشكل تنازلي كما في المثال التالي: a.sort_by { |h| h[:bab] }.reverse!كما يمكنك أيضا استخدام هذه الطريقة السهلة لترتيب العناصر بشكل تنازلي كما في المثال التالي: a.sort {|x,y| y[:bab]<=>x[:bab]} حيث ستكون النتيجة بعد تنفيذ هذا السطر شبيه بهذه: irb >> a = [ ?> { :foo => 'foo', :bar => 2 }, ?> { :foo => 'foo', :bar => 3 }, ?> { :foo => 'foo', :bar => 5 }, ?> ] => [{:bar=>2, :foo=>"foo"}, {:bar=>3, :foo=>"foo"}, {:bar=>5, :foo=>"foo"}] >> a.sort {|x,y| y[:bar]<=>x[:bar]} => [{:bar=>5, :foo=>"foo"}, {:bar=>3, :foo=>"foo"}, {:bar=>2, :foo=>"foo"}]المصدر
  12. هنالك العديد من الطرق لحذف هذه العناصر الصفرية، فمثلا يمكنك استخدام تابع compact للحذف كما في المثال التالي: [1, nil, 3, nil, nil].compact => [1, 3] بالطبع compact تعتبر أفضل وأسهل طريقة، لكن لا يزال هنالك طرق أخرى، فمثلا يمكنك حذف العناصر الصفرية من القائمة باستخدام عملية طرح بسيطة للغاية كما في المثال التالي: [1, nil, 3, nil, nil] - [nil] => [1, 3] يمكنك أيضا استخدام reject التي ستقوم برفض العناصر الصفرية والسلاسل النصية الفارغة من القائمة، أي أنها ستحذف العناصر التي ليس لها قيمة كما في المثال التالي: [1, nil, 3, 0, ''].reject(&:blank?) => [1, 3, 0]المصدر
  13. أنصحك بعد إنهاء برمجة موقعك أن تقوم بالتأكد من عمل الموقع بشكل كامل عن طريق تجربته لمدة من الوقت وبعد ذلك أنصحك بإصداره بنسخة تجريبية لبعض المستخدمين خاصة إذا كانوا أصدقائك ولديهم خبرة كافية في البرمجة حتى يخبروك بأهم المشاكل والصعوبات التي واجهتهم عندما قاموا باستخدام الموقع. ولا تنسى أيضا اختبار موقعك من ناحية الثغرات الأمنية خاصة الشهيرة منها مثل XSS و SQL Injection حيث يجب عليك تأمين الموقع بالكامل قبل إصداره. وبعد ذلك يمكنك رفع موقعك للمستخدم نهائي. هذه هي حسب رأيي الخطوات الضرورية التي يتوجب على كل مبرمج ويب فعلها.
  14. بالنسبة للأداء، خاصة عندما تقوم بالتكرار على مدى كبير يُنصح باستخدام xrange()، لكن توجد عدة حالات يجب عليك أن تقوم باختيار range() بدلا من ذلك: في البايثون 3 تقوم range() بنفس وظيفة xrange() ولقد تم حذف xrange() نهائيا من هذا الإصدار فإذا رغبت بكتابة شيفرة برمجية تعمل على الإصدارين فيجب عليك في هذه الحالة استخدام range().سنكون range() أسرع في العديد من الحالات، مثل التكرار على نفس التسلسل عدة مرات.لا تدعم xrange() أية توابع للقائمة مثل slice وغيرها.المصدر
  15. حسب معرفتي في البايثون لا يمكنك إيقاف وحدة أو مكتبة معينة بعد استدعاءها لكن يمكنك بسهولة إعادة تحميلها عن طريق استخدام reload ومن ثم تقوم بتمرير اسم المكتبة التي تريد إعادة تحميلها بكل سهولة كما في المثال التالي: import foo while True: # Do some things. if is_changed(foo): foo = reload(foo)هذا هو ما طلبته، مطوري خوادم دجانغو (Django) يستخدمون هذه الطريقة حتى تتمكن من رؤية تأثيرات الشيفرة البرمجية الخاصة بك من دون أن تقوم بإعادة تشغيل الخادم من جديد، ففي هذه الطريقة سيقوم الخادم بإعادة تحميل الملفات الجديدة. المصدر
  16. كالعادة في الروبي هنالك دائما العديد من الطرق للقيام بنفس العمل، لكن سأقوم بشرح أسهل طريقة. لفصل السلسلة النصية إلى أجزاء في القائمة يمكنك الاستعانة بتابع split الذي يقوم بفصل السلسلة النصية حسب الفاصل(الفارزة) كما في المثال التالي: >> "1,2,3,4".split(",") => ["1", "2", "3", "4"] وبما أنك سألت عن طريقة تحويلها إلى سلسلة نصية من الأعداد الصحيحة سنقوم بعمل حلقة تكرار صغيرة map لتحويل كل عنصر من عناصر القائمة إلى عدد صحيح عن طريق التابع to_i كما في هذا المثال: >> "1,2,3,4".split(",").map { |s| s.to_i } => [1, 2, 3, 4] وإذا كنت تستخدم نسخة حديثة من الروبي (أحدث من 1.9) فيمكنك في هذه الحالة استخدام هذه الطريقة: >> "1,2,3,4".split(",").map(&:to_i) => [1, 2, 3, 4] المصدر
  17. هنالك العديد من الحلول لإيجاد التكرار في سلسلة نصية، فيمكنك على سبيل المثال استعمال هذا الحل لأنه يتجنب التعابير العادية (regular expressions) والبطء في حلقات التكرار في البايثون: def principal_period(s): i = (s+s).find(s, 1, -1) return None if i == -1 else s[:i] وهذا حل آخر لكن باستخدام التعابير العادية: import re REPEATER = re.compile(r"(.+?)\1+$") def repeated(s): match = REPEATER.match(s) return match.group(1) if match else Noneسأقوم بشرح التعبير (.+?)\1+$ لذلك قمت بتقسيمه إلى ثلاثة أجزاء: (.+?) سوف يقوم بمقارنة مجموعة تحتوي على الأقل على واحد من أي حرف.\1+ سوف يتأكد من تكرار واحد في مجموعة المطابقة في الجزء الأول.$ سوف يتأكد من نهاية السلسلة النصية ولقد وضعناه للتأكد من أنه لا يوجد أي إضافات.أرجو أن يكون الشرح سهلا. المصدر
  18. هنالك العديد من الطرق للتخلص من أول عنصر في المصفوفة فعلى سبيل المثال يمكنك استخدام التابع shift كما في الأمثلة التالية: >> x = [4,5,6] => [4, 5, 6] >> x.shift => 4 >> x => [5, 6] وإذا رغبت في حذف عنصر معين يمكنك استخدام الصيغة التالية x.shift(n) كما يمكنك استخدام drop لإزالة العناصر الأولى من المصفوفة حيث يقوم هذا التابع بحذف العناصر الأولى حسب العدد الذي تمرره من العناصر كما في الأمثلة التالية: a = [0,1,2,3] a.drop(1) # => [1, 2, 3] a # => [0,1,2,3] [0,1,2,3].drop(2) => [2, 3] [0,1,2,3].drop(3) => [3]ويمكنك أيضا استخدام هذه الطريقة البسيطة التي تعتمد على head و tail للحصول على مصفوفة دون العنصر الأول كما في هذا المثال: head, *tail = [1, 2, 3, 4, 5] #==> head = 1, tail = [2, 3, 4, 5] المصدر
  19. هنالك العديد من الخيارات لمكتبات واجهة المستخدم يمكنك البدء بها، فمثلا يمكنك استخدام روبي شوز (Ruby Shoes) فأنا أعتبرها من أبسط أطر واجهة المستخدم بالإضافة إلى وجود العديد من الدروس والأمثلة لها، وهذه المكتبة تعمل على أنظمة ويندوز ولينكس وماك. كما يمكنك أيضا البدء بتعلم واجهة QT فهذه الواجهة تعتبر من أفضل الواجهات وأشهرها على الإطلاق وسوف تجدها في الكثير من اللغات الأخرى كالبايثون والسي بلس بلس، ولها نصيب الأسد من الدروس والدورات. سوف تجد الكثير من الخيارات الأخرى في المصدر المصدر
  20. هنالك عدة طرق لفعل ذلك، فيمكنك استخدام HTMLEntities كما في المثال التالي: : jmglov@laurana; sudo gem install htmlentities Successfully installed htmlentities-4.2.4 : jmglov@laurana; irb irb(main):001:0> require 'htmlentities' => [] irb(main):002:0> HTMLEntities.new.decode "&iexcl;I&#39;m highly&nbsp;annoyed with character references!" => "¡I'm highly annoyed with character references!" طبعا افترضت أنك تستخدم نظام لينكس لتثبيت الحزمة، لأن هذه الحزمة يجب تثبيتها من gem قبل أن تتمكن من استخدامها. ويمكنك أيضا استخدام CGI.escapeHTML لتشفير الحروف كما في المثال التالي: string = CGI.escapeHTML('test "escaping" <characters>') ولفك التشفير يمكنك استخدام CGI.unescapeHTML: CGI.unescapeHTML("test &quot;unescaping&quot; &lt;characters&gt;") طبعا ستحتاج إلى استدعاء مكتبة CGI قبل أن تستخدم الشيفرتين في الأعلى: require 'cgi' وإذا كنت تستخدم ريلز (ROR) فلن تحتاج في هذه الحالة إلى CGI فيمكنك تشفير النصوص باستخدام طريقة h كما في المثال التالي: <%= h 'escaping <html>' %>المصدر
  21. في الحقيقة أسهل طريقة لحذف مفتاح معين من القاموس هي عن طريق استخدام تابع pop كما في المثال التالي: my_dict.pop("key", None) لقد تطلب مني بعض الوقت لأفهم ماذا يفعل هذا السطر بالضبط، لذلك سأختصر عليك الوقت لأشرح لك وظيفته: pop(key[, default]) إذا كان المفتاح في القاموس، سيتم إزالته ومن ثم سيقوم بإرجاع قيمته، خلافا لذلك سيقوم بإرجاع default، وإذا لم يتم تمرير default ولم يكن المفتاح في القاموس فسيحدث خطأ من نوع KeyError. كما يمكنك استخدام هذه الطريقة المختصر للحذف: if 'key' in myDict: del myDict['key']المصدر
  22. هذا المتغير يحتوي على قائمة من الكائنات العامة لتلك الوحدة، فتعتبر __all__ هي مجموعة من السلاسل النصية التي تحتوي على اسماء المتغيرات في الوحدة التي سيتم تصديرها عندما يتم استخدام from <module> import * في الوحدة. فعلى سبيل المثال، الشيفرة البرمجية التالية في foo.py ستقوم بتصدير bab و baz: __all__ = ['bab', 'baz'] waz = 5 bab = 10 def baz(): return 'baz'ويمكنك استدعاء هذه المتغيرات مثل التالي: from foo import * print bab print baz # The following will trigger an exception, as "waz" is not exported by the module print wazيذكر أنه لا تعمل __all__ إلا عندما يتم استدعاؤها عن طريق from xxx import * المصدر
  23. هنالك العديد من الطرق لاكتشاف حالة وجود المتغير حسب مكان وجوده، ففي حالة ما أردت التأكد من وجود متغير معين في المتغيرات المحلية (local variable) فيمكنك في هذه الحالة التأكد من وجود هذا المتغير في locals() في المثال التالي: if 'myVar' in locals(): # myVar exists. أما في حالة ما لو أردت التأكد من وجود متغير ما في متغيرات العامة (global variable) فيمكنك في هذه الحالة التأكد من وجود هذا المتغير في globals() كما في المثال التالي: if 'myVar' in globals(): # myVar exists. أما لو أردت التأكد من أن كائن معين لديه سمة معينة فيمكنك القيام بذلك عن طريق الشيفرة التالي: if hasattr(obj, 'attr_name'): # obj.attr_name exists. المصدر
  24. هنالك العديد من الطرق للحصول على أسماء جميع الملفات في مجلدات معينة فمثلا يمكنك استخدام Dir كما في المثال التالي: Dir["/path/to/search/*"] تعني النجمة * جميع الملفات في ذلك المسار. وإذا أردت أن تجد جميع الملفات من نوع معين في مسار ما، فيمكنك في هذه الحالة أن تكتب نجمة * ومن ثم قم بكتابة الامتداد المعين الذي تريده كما في هذا المثال: Dir["/path/to/search/**/*.rb"] كما يمكنك أيضا استخدام entries لعرض أسماء جميع الملفات كما في هذا المثال: Dir.entries(folder) المصدر
  25. هنالك العديد من الطرق لتحويل البايتات إلى سلاسل نصية في البايثون، ومن أسهل هذه الطرق استخدام التابع decode لفك تشفير حسب ترميز معين مثل utf-8 حيث سيتم تحويل البايتات إلى سلسلة نصية بترميز utf-8 كما في المثال التالي: >>> b"abcde" b'abcde' # utf-8 is used here because it is a very common encoding, but you # need to use the encoding your data is actually in. >>> b"abcde".decode("utf-8") 'abcde'كما يمكنك فك شيفرة البايتات لتحويلها إلى سلسلة نصية عن طريق الأمر التالي: str(b'hello', encoding) كما يمكنك استخدام هذه الطريقة التي تقوم بالتكرار على جميع البايتات وبعد ذلك تقوم بتحويلهم إلى حروف ثم ستقوم بإضافتها إلى سلسلة نصية: bytes = [112, 52, 52] "".join(map(chr, bytes)) >> p44 المصدر
×
×
  • أضف...