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

هشام رزق الله

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

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

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

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

    31

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

  1. إن أسهل طريقة بايثونية للتأكد من متغيّر معين موجود داخل متغير آخر هي عن طريق استخدام دالة any(): ويمكنك استخدام هذه الدالة في برنامج بسهولة كما في المثال التالي: if any(s in x for s in (a,b,c,d,e,f,g)): لاحظ أنني استخدمت tuple بدلا من القوائم، وهذه الطريقة مفضّلة لدى المبرمجين وهي أفضل وأسرع من استخدام القوائم في هذه الحالة.
  2. لا يمكنك تعيين قيم لقائمة عن طريق lst = something، إذ أنت بحاجة إلى إضافة تلك القيم إلى القائمة عن طريق استخدام دالة append. أمثلة على إنشاء القوائم: إذا أردت إنشاء قائمة تحتوي على عناصر فارغة (None) فأسهل طريقة لفعل ذلك هي عن طريق استخدام عملية ضرب بسيطة: >>> l = [None] * 10 >>> l [None, None, None, None, None, None, None, None, None, None] إذا أردت إنشاء قائمة من مجال معيّن من الأرقام، فيمكنك استخدام دالة range كما في المثال التالي: # 2.X only. Use list(range(10)) in 3.X. >>> l = range(10) >>> l [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] أو يمكنك استخدام دالة لإنشاء قائمة كما في المثال التالي: >>> def display(): ... s1 = [] ... for i in range(9): # This is just to tell you how to create a list. ... s1.append(i) ... return s1 ... >>> print display() [0, 1, 2, 3, 4, 5, 6, 7, 8]
  3. يمكنك الحصول على تاريخ الأمس أو حتى قبل عدّة أيام عن طريق دوال في روبي وريلز، فمثلا يمكنك الحصول على تاريخ يوم أمس عن طريق استخدام تابع yesterday لكائن date كما يظهر في المثال التالي: Date.yesterday أو يمكنك الحصول على تاريخ يوم أمس أو قبل بضعة أيام من كائن time كما يظهر في المثال التالي: 1.day.ago أما في روبي (بدون استخدام ريلز) فيمكنك استخدام تابع prev_day كما في المثال التالي: Date.today.prev_day
  4. هنالك عدّة بدائل لصنف نوع tuples في روبي، فيمكنك على سبيل لمثال استخدام OpenStruct والتي تعتبر البديل الأفضل والأسهل لـ tuples في روبي، ويمكنك استخدامها بسهولة بعد استدعائها كما في المثال التالي: require 'ostruct' person = OpenStruct.new person.name = "John Smith" person.age = 70 person.pension = 300 puts person.name # -> "John Smith" puts person.age # -> 70 puts person.address # -> nilوبالاعتماد على ما ذكرته عن النقطة وغيرها، سأفترض أنك تعني نوعًا مختلفا من tuple، فربما تبحث عن صنف Struct، أنظر إلى الأمثلة التالية وستفهم قصدي: Person = Struct.new(:name, :age) me = Person.new me.name = "Guy" me.age = 30 ومن المشاريع التي أنصحك بالإطلاع عليها هذا المشروع الذي أنشئ نوع tuple للروبي.
  5. هنالك الكثير من الطرق لإنشاء قائمة تحتوي على عنصر متكرر، وجميع هذه الطرق قصيرة وسهلة، فعلى سبيل المثال يمكنك إنشاء أحد عناصر القائمة وضربه في عدد مرات التكرار داخل القائمة كما في المثال التالي: #add code here to figure out the number of 0's you need, naming the variable n. listofzeros = [0] * n وإذا رغبت فيمكنك وضع هذا السطر في دالة وتضيف return listofzeros في النهاية لإرجاع القائمة كما في المثال التالي: def zerolistmaker(n): listofzeros = [0] * n return listofzeros حيث ستمرر لهذه الدالة عدد مرات التكرار وسترجع لك القائمة، أنظر لهذه الأمثلة: >>> zerolistmaker(4) [0, 0, 0, 0] >>> zerolistmaker(5) [0, 0, 0, 0, 0] >>> zerolistmaker(15) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] >>> أما في بايثون 3، فيمكنك استخدام هذه الطريقة أيضا: $ python3 >>> from itertools import repeat >>> list(repeat(0, 7)) [0, 0, 0, 0, 0, 0, 0]
  6. هنالك عدّة طرق لاستخدام معامل استبدال واحد أكثر من مرة داخل السلسلة النصية، فيمكنك على سبيل المثال جعل المعامل قاموس ومن ثم وضع اسم لكل موقع تريد تغيير الكلمة فيه كما في المثال التالي: print '<a href="%(url)s">%(url)s</a>' % {'url': my_url} في بايثون3، قد تختار استخدام طريقة تنسيق السلسلة النصية الجديدة عن طريق دالة format كما في المثال التالي: print('<a href="{0}">{0}</a>'.format(my_url)) والذي سيوفر عليك إعادة كتابة المعامل أو يمكنك أيضا استخدام الدالة بهذه الطريقة: print('<a href="{url}">{url}</a>'.format(url=my_url))
  7. هنالك عدّة طرق لاستبدال مجموعة من سلاسل نصية موجودة في سلسلة نصية معينة في بايثون، فيمكنك على سبيل المثال الاستعانة بالتعابير النمطية عن طريق استخدام دوال compile و iteritems و escape وغيرها من مكتبة re كما في المثال التالي: import re rep = {"condition1": "", "condition2": "text"} # define desired replacements here # use these three lines to do the replacement rep = dict((re.escape(k), v) for k, v in rep.iteritems()) pattern = re.compile("|".join(rep.keys())) text = pattern.sub(lambda m: rep[re.escape(m.group(0))], text)مثال على استخدام الشيفرة البرمجية السابقة: >>> pattern.sub(lambda m: rep[re.escape(m.group(0))], "(condition1) and --condition2--") '() and --text--' أو يمكنك فعل ذلك بطريقة أسهل عن طريق حلقة التكرار: def replace_all(text, dic): for i, j in dic.iteritems(): text = text.replace(i, j) return text حيث أن text هي السلسلة النصية الكاملة و dic هي قاموس يحتوي على السلاسل النصية التي تريد استبدالها. ملاحظة: تم استبدال دالة iteritems() بدالة items() في بايثون 3.
  8. سأحاول شرح الفروقات الرئيسية باختصار: أولا File.open("file").each_line { |line| puts line }، يقوم هذا الأمر بفتح ملف محلي وإرجاء ملف كائن، وبعد تنفيذ الأوامر الموجودة في السطر سيظل الملف مفتوح حتى تغلقه أنت بنفسك. وبالنسبة إلى open("file").each_line { |line| puts line } فهو يشبه السطر السابق من ناحية بقاء الملف مفتوح، لكن الفرق البسيط الذي بينه وبين السطر السابق أنه يدعم كائن StringIO، ولفهم هذه النقطة أكثر أنصحك بالنظر إلى هذا المثال: open(".irbrc").class # => File open("http://google.com/").class # => StringIO File.open("http://google.com/") # => Errno::ENOENT: No such file or directory - http://google.com/ أما IO.foreach("file") { |line| puts line } فهي تفتح الملف وتنفّذ الأوامر الموجودة في الكتلة على كل الأسطر ومن ثم تغلق الملف بعد الانتهاء من تنفيذ الأوامر.
  9. هنالك عدّة حلول بسيطة للحصول على تقاطع عدة مصفوفات في الروبي أو في ريلز، فمثلا يمكنك استخدام طريقة الرمز & والذي يرمز إلى التقاطع كما في المثال التالي: > [1,2,3] & [2,3,4] & [0,2,6] => [2] لاحظ أننا كررنا استخدام الرمز & حسب المصفوفات. أو يمكنك دمج السلاسل النصية مع بعض ومن ثم استخدام inject، أو إذا كنت تستخدم الإصدار 1.9 من روبي استعمل inject أيضا بطريقة مختصرة أكثر كما في المثال التالي: > arrays = [code1,code2,code3] > arrays.inject(:&) # Ruby 1.9 shorthand => [2] > arrays.inject{|codes,x| codes & x } # Full syntax works with 1.8 and 1.9 => [2]
  10. أفضل الحلول لقفل ملف -حسب رأيي- هي استخدام وحدة Portalocker والتي تعمل على جميع الأنظمة. من الحلول الأخرى الجيدة، استخدام مكتبة filelock حيث ستتمكن من قفل أي ملف عن طريق تمرير اسم الملف إليه كما في المثال التالي: from filelock import FileLock with FileLock("myfile.txt"): # work with the file as it is now locked print("Lock acquired.")بالمناسبة، لا أنصح بالكتابة على نفس الملف من عمليات مختلفة في نفس الوقت، لذلك حاول تجنب الأمر قدر الإمكان بدلا من قفل الملف.
  11. يوجد العديد من مكتبات معالجة الصور في بايثون، والإجابة على سؤالك تعتمد على ماذا تعنيه بـ "معالجة الصور"، لكن أعتقد أن أفضل اختيار هو استخدام المكتبات التي تعتمد على numpy مثل mahotas أو scikits.image أو scipy.ndimage ... وجميع هذه المكتبات تعتمد على مصفوفات numpy لذلك يمكنك الخلط بينها واستخدام دوال مختلفة فيما بينهم. يذكر أن أشهر مكتبات معالجة الصور في بايثون هي PIL لكن إذا أردت القيام بمعالجة بسيطة للصورة فأنصحك في هذه الحالة باستخدام وحدة ImageMagick.
  12. هنالك عدّة أسباب لهذه المشكلة في بايثون، ومن أبرزها معمارية نظام التشغيل الذي تستخدمه، فهل تستخدم نظام 64 بت وقمت بتثبيت إصدار 64 بت من بايثون؟ حاول أن تثبت نسخة 32 بت لكل من بايثون ومكتبة pygame، في بعض الأحيان ينجح هذا الأمر. في بعض الأحيان لن يعمل الحل أعلاه وفي هذه الحالة أنصحك بتثبيت PyWin32 وأتوقع أن تعمل لعبتك بدون مشاكل.
  13. لتوليد رمز MD5 لسلسلة نصية معينة في روبي (أو في ريلز) يمكنك الاستعانة بوحدة Digest::MD5 الموجودة في المكتبات القياسية للروبي، فهي تملك عدّة توابع يمكنها مساعدتك في عملية التوليد والتي من بينها تابع hexdigest الذي يمكن استخدامه بسهولة عن طريق تمرير السلسلة النصية التي تريد الحصول على MD5 الخاص بها كما في المثال التالي: irb(main):001:0> require 'digest/md5' => true irb(main):002:0> Digest::MD5.hexdigest('foobar') => "3858f62230ac3c915f300c664312c63f" بالمناسبة تُعتبر خوارزمية MD5 شبه مكسورة (بمعنى التشفير) ولا يُنصح باستخدامها لتشفير كلمات سر، لذلك أنصحك باستخدام عدة بدائل قوية مثل SHA512 أو bcrypt.
  14. للوصول إلى قيم hash الموجودة داخل hash معين في روبي، ستحتاج إلى التكرار على قيم hash وإلا ستحصل على القيم فقط كما حدث في المثال الذي وضعته أنت، ويمكنك فعل ذلك عن طريق فصل القيم والمفاتيح باستخدام حلقة each ومن ثم التكرار بنفس الحلقة على القيم واستخراج المفتاح والقيمة للـ hash الموجود داخل hash كما في المثال التالي: h.each do |key, value| puts key value.each do |k,v| puts k puts v end end ويمكنك كتابة المثال السابق بطريقة أخرى على طريق الشيفرة البرمجية التالية: h.each do |key, value| puts key value.values.each do |v| puts v end end
  15. سبب هذا الخطأ هو تغييرات في إصدارات إطار دجانغو، فقد تم حذف django.conf.urls.defaults من الإصدار 1.6، فإذا كان هذا الخطأ موجود في تطبيق قمت أنت بكتابته (وليس تطبيق قمت بتحميله أو ما شابه) يمكنك إصلاحه بتغيير أمر الاستدعاء إلى التالي: from django.conf.urls import patterns, url, include على أي حال، فإن سبب المشكلة هي تطبيق graphite، وسيتم إصلاح هذه المشكلة في الإصدار الجديد، وفي انتظار النسخة الجديدة المتوافقة مع دجانغو 1.6، فإنه من الأفضل استخدام دجانغو 1.5.
  16. مرحبا صديقي لإنجاز ذلك استخدم دالة next مع حلقة التكرار for للتكرار على بقية الأسطر بالإضافة إلى أنه يجب فتح الملف باستخدام عبارة with open(fname) as f: كما في المثال التالي: with open(fname) as f: next(f) for line in f: #do something أو يمكنك الاستفادة من دالة readlines ومن ثم البدء بالقراءة من السطر الثاني عن طريق استخدام هذه الطريقة: f = open(fname,'r') lines = f.readlines()[1:] f.close() وإذا لم تكن بحاجة إلى السطر الأول فيمكنك حذفه وقراءة الملف بشكل عادي كما في المثال التالي: f = open(fname).readlines() firstLine = f.pop(0) #removes the first line for line in f: ...
  17. هنالك عدّة طرق للتأكد من مساواة قائمتين في بايثون، فبايثون يمتلك نوع بيانات مدمجة تدعى set تم إنشاؤها خصيصا للمجموعات غير المرتبة، لذلك إذا حوّلت كلتا القائمتين إلى set فستتمكن من المقارنة من دون مشاكل لأن النوع set هو نوع غير مرتّب كما في المثال التالي: set(x) == set(y) أو يمكنك ببساطة ترتيب هاتين القائمتين ومن ثم المقارنة بشكل عادي عن طريق استخدام دالة sort() أو sorted() كما في المثال التالي: >>> a = [1,1,2] >>> b = [1,2,2] >>> a.sort() >>> b.sort() >>> a == b False يمكنك اختصار الشيفرة البرمجية السابقة إلى هذه: sorted(a) == sorted(b) ملاحظة: إذا لم ترغب بتغيير مواقع عناصر القائمة لكنك تريد عمل ترتيب خيالي فاستخدم sorted. المصدر
  18. هنالك عدّة طرق في روبي للتأكد من أن المصفوفة بها عناصر متكررة أم لا، يمكنك مثلا استدعاء تابع uniq والذي سيرجع مصفوفة جديدة مشابهة للمصفوفة القديمة لكن بدون تكرارات وبعد ذلك يمكنك التأكد هل أن المصفوفة الجديدة تمتلك نفس عدد عناصر المصفوفة الأولى أم لا، فإذا كانت تمتلك نفس العدد فهذا يعني أنه ليس هنالك عناصر متكررة في مصفوفة: if a.uniq.length == a.length puts "a does not contain duplicates" else puts "a does contain duplicates" end ولمعرفة العناصر المتكرّرة يمكن استخدام ما يلي: array = [1, 2, 1, 3, 5, 4, 5, 5] => [1, 2, 1, 3, 5, 4, 5, 5] dup = array.select{|element| array.count(element) > 1 } => [1, 1, 5, 5, 5] dup.uniq => [1, 5]
  19. أعتقد أن أفضل طريقة لضم مصفوفتين لبعض مع الانتباه إلى الفواصل؛ هي عن طريق استخدام map و split. أولا حوّل السلاسل النصية المتكونة من أكثر من جزء (المفصولة بفاصل) إلى مصفوفات كما في المثال التالي: instruments.map {|i| i.include?(',') ? (i.split /, /) : i} ومن ثم استخدم Hash[] وzip لدمج مصفوفة members مع مصفوفة instruments لتصبح الشيفرة البرمجية الكاملة (بعد إضافة المثال السابق) كما في المثال التالي: Hash[members.zip(instruments.map {|i| i.include?(',') ? (i.split /, /) : i})] وسوف تحصل في النهاية على هذه النتيجة: {"Jeremy London"=>"drums", "Matt Anderson"=>["guitar", "vocals"], "Jordan Luff"=>"bass", "Justin Biltonen"=>"guitar"} أو يمكنك تحويل جميع النتائج إلى قوائم عن طريق استخدام السطر التالي: Hash[members.zip(instruments.map {|i| i.split /, /})] والذي سوف يعطيك: {"Jeremy London"=>["drums"], "Matt Anderson"=>["guitar", "vocals"], "Jordan Luff"=>["bass"], "Justin Biltonen"=>["guitar"]}
  20. هنالك عدّة طرق لتنزيل صورة عن طريق بايثون، فيمكنك على سبيل المثال استخدام دالة urlretrieve من مكتبة urllib حيث ستمرر لها رابط الصورة مع اسم الملف كما في المثال التالي: import urllib urllib.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg") أو يمكنك استخدام دالة urlopen من نفس المكتبة ومن ثم فتح الملف الذي ترغب في تثبيت البيانات فيه (أو إنشاؤه) وقراءة (حفظ) بيانات تلك الصور على ذلك الملف كما في المثال التالي: import urllib f = open('00000001.jpg','wb') f.write(urllib.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read()) f.close() يذكر أنه يمكنك القيام بنفس الشيء عن طريق استخدام مكتبة requests ودالة get كما في المثال التالي: import requests f = open('00000001.jpg','wb') f.write(requests.get('http://www.gunnerkrigg.com//comics/00000001.jpg').content) f.close() المصدر
  21. يمكنك استخدام دالة max وهي إحدى الدوال المدمجة وتقوم بإرجاع السلسلة النصية صاحبة أطول عدد عندما تمرر لها قائمة ومفتاح (وسيكون في هذه الحالة len) كما يظهر في المثال التالي: >>> mylist = ['123','123456','1234'] >>> print max(mylist, key=len) 123456 ملاحظة: تُرجع الدالة النتيجة الأولى فقط وليس جميع النتائج، فلو كتبتا مثلا: print(max(["this", "does", "work"], key=len)) فسترجع فقط "this” على الرغم من أن بقية السلاسل النصية لديها نفس الطول. المصدر
  22. تستطيع استخدام وحدة hashlib في بايثون لتشفير سلسلة نصية باستخدام MD5، فمثلا لو كنت تستخدم بايثون 2 وتريد طباعة MD5 الخاص بسلسلة نصية معينة فيمكنك في هذه الحالة استخدام دوال md5 وhexdigest كما في المثال التالي: import hashlib print hashlib.md5("whatever your string is").hexdigest() طريق أخرى للحل حيث قسّمنا السطر السابق إلى عدة سطور لفهم الشيفرة البرمجية بشكل أفضل: import hashlib m = hashlib.md5() m.update("000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite") print m.hexdigest() أما في البايثون 3 فسنضيف ترميز السلسلة النصية (في حالتنا utf-8) عن طريق دالة encode كما في المثال التالي: import hashlib print(hashlib.md5("whatever your string is".encode('utf-8')).hexdigest()) المصدر
  23. للحصول على جميع الأحرف (الحروف الإنجليزية الصغيرة) في بايثون، يمكنك استخدام وحدة string التي تحتوي على عدة متغيرات تهتم بالسلاسل النصية والتي من بينها ascii_lowercase كما يظهر لنا في المثال التالي: >>> import string >>> string.ascii_lowercase 'abcdefghijklmnopqrstuvwxyz' والآن سنحوّل السلسلة النصية السابقة إلى قائمة كما أردت أنت: >>> list(string.ascii_lowercase) ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] كما يمكنك فعل نفس الشيء عن طريق استخدام مجال أحرف آسكي من 97 إلى 123 ومن ثم تحويلهم إلى أحرف كما في المثال التالي: >>> list(map(chr, range(97, 123))) #or list(map(chr, range(ord('a'), ord('z')+1))) ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] بعض متغيرات وحدة string والتي يمكنك استخدامها في برامجك: >>> help(string) # on Python 3 .... DATA ascii_letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz' ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' digits = '0123456789' hexdigits = '0123456789abcdefABCDEF' octdigits = '01234567' printable = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c' punctuation = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' whitespace = ' \t\n\r\x0b\x0c'
  24. هنالك عدّة طرق في لغة روبي لاستبدال مجموعة من السلاسل النصية بسلاسل نصية أخرى، ومن أشهرها استخدام تابع gsub حيث تمرر له السلسلة النصية التي تريد استبدالها بالسلسلة النصية التي تريد وضعها، فمثلا سيكون سطر الاستبدال في السلسلة النصية التي تريد وضعتها كالتالي: str.gsub("☺", ":)").gsub("☹", ":(") في حالة كان عدد الاستبدالات كبير فيمكنك في هذه الحالة استخدام قائمة لتضع فيها جميع الاستبدالات ومن ثم استخدام تابع gsub كما في المثال التالي: replacements = [ ["☺", ":)"], ["☹", ":("] ] replacements.each {|replacement| str.gsub!(replacement[0], replacement[1])}
  25. على الرغم من أنني لا أنصحك ببرمجة تطبيقات أيفون باستخدام بايثون إلا أنه هنالك عدة طرق ومكتبات تُمكنك من فعل ذلك في الوقت الحالي، فهناك من يستخدم PyObjC للبرمجة على الآيفون أيضا بفضل العمل الذي قام به جاي فريمان، إقرأ هذا الموضوع للمزيد من المعلومات. أنصحك أيضا بالإطلاع على هذه المشاريع Pythonista Kivy Pyzia بالنسبة للغة البرمجة المستخدمة في تطبيقات أيفون فهي السي والسي بلس بلس و Objective C و Swift في الغالب.
×
×
  • أضف...