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

هشام رزق الله

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

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

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

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

    31

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

  1. هنالك عدة طرق للقيام بذلك، فأفضل طريقة للحصول على جميع أسماء الملفات والمجلدات داخل مسار معين عن طريق البايثون هي هذه: import os for dirname, dirnames, filenames in os.walk('.'): # print path to all subdirectories first. for subdirname in dirnames: print(os.path.join(dirname, subdirname)) # print path to all filenames. for filename in filenames: print(os.path.join(dirname, filename)) # Advanced usage: # editing the 'dirnames' list will stop os.walk() from recursing into there. if '.git' in dirnames: # don't go into any .git directories. dirnames.remove('.git')وإذا كنت تريد طريقة سهلة ومختصرة ففي هذه الحالة يمكنك استخدام دالة listdir من مكتبة os كما في المثال التالي: os.listdir(path)كما يمكنك إنشاء دالة صغيرة للحصول على أسماء الملفات والمجلدات على شكل قائمة منظمة كما في المثال التالي: import os def listdir_fullpath(d): return [os.path.join(d, f) for f in os.listdir(d)]ويمكنك أيضا استخدام هذه الطريقة البسيطة على نظام ويندوز (وأيضا يمكنك تنفيذه على لينكس بعد تغيير المسار): import os for filename in os.listdir("C:\\temp"): print filename المصدر
  2. هنالك عدة طرق للقيام بذلك، فيمكنك استدعاء .name في صنف الكائن كما في المثال التالي للحصول على اسم الصنف: result.class.nameوإذا كنت تستخدم ROR(Ruby On Rail) أو مكتبة ActiveSupport فيمكنك أيضا الحصول على اسم الصنف عن طريق الشيفرة التالية: result.class.name.demodulizeومن الطرق الأخرى للحصول على اسم الصنف، يمكنك استخدام POR (plain-ol-Ruby) كما في المثال التالي: result.class.name.split('::').lastملاحظة: الطريقتين الأخيرتين تعطيك فقط الاسم وهذا هو ما طلبته. المصدر
  3. تقوم extend بإضافة توابع (methods) الوحدة وثوابتها إلى صنف ميتا (metaclass) المستهدف فعلى سبيل المثال إذا قمت باستدعاء obj.extend(Mod) سوف يأخذ obj توابع Mod (كتوابع المثيل) لكن لن يتم إضافة مثيل آخر لـ obj.class لديه هذه التوابع. فـ extend هي تابع عام. أما include فهي تقوم بشكل افتراضي بخلط توابع وحدة محددة كمثيل توابع إلى الوحدة\الصنف المستهدف، فإذا قمت باستدعاء class Klazz; include Mod; end;, سوف يكون لدى جميع مثيلات Klazz إمكانية الوصول إلى توابع Mod (كتوابع المثيل). فـ include هي تابع خاص لأن الغرض منه أن يتم استدعاؤه من داخل الصنف\الوحدة. المصدر
  4. سأحاول شرح معاني مصطلحات المؤشرات بطريقة بسيطة: *int : مؤشر إلى int.* int const : مؤشر إلى int ثابتة.int * const : مؤشر ثابت إلى int.int const * const : مؤشر ثابت إلى int ثابتة.الثابت الأول يمكنك تغيير اتجاهه وسيبقى نفسه كالتالي: * const int * == int constconst int * const == int const * constهنالك أشياء أخرى يمكنك القيام بها وهي: ** int : مؤشر إلى مؤشر إلى int.int ** const : مؤشر ثابت إلى مؤشر إلى int.* int * const : مؤشر إلى مؤشر ثابت إلى int.** int const : مؤشر إلى مؤشر إلى int ثابتة.int * const * const : مؤشر ثابت إلى مؤشر ثابت إلى int.المصدر
  5. هنالك عدة طرق لحذف الملفات والمجلدات في البايثون، فيمكنك استخدام دالة remove من مكتبة os لحذف الملفات، وإذا حاولت حذف المجلدات عن طريق هذه الدالة فسوف تحصل على رسالة خطأ. os.remove(h.txt) الدالة الثانية هي دالة rmdir من مكتبة os والتي تقوم بحذف مجلد فارغ وإذا حاولت حذف مجلد ممتلئ بهذه الدالة فسوف تحصل على رسالة خطأ. os.rmdir(hello) أما لو أردت حذف مجلد ممتلئ (به مجلدات وملفات) فيمكنك في هذه الحالة استخدام دالة rmtree من مكتبة shutil والتي ستقوم بحذف كامل المجلد بمحتوياته. shutil.rmtree(hello2)المصدر 1 2
  6. أولا، يجب عليك أن تقوم بفتح الملف كملف ثنائي، ثم يمكنك قراءة كامل النص الموجود في الملف عن طريق أمر واحد كما في المثال التالي: file = File.open("path-to-file.tar.gz", "rb") contents = file.readسوف تحصل الآن على كامل النص الموجود في الملف في متغير يدعى contents. بعد ذلك، يجب عليك إغلاق الملف عن طريق file.close لأنك إذا لم تقم بإغلاق الملف فلن يتم إغلاقه حتى إعادة التشغيل وسوف يستهلك موارد النظام بهذه الطريقة مما يجعله أبطء في بعض الحالات. المصدر
  7. هنالك عدة طرق للحصول على معلومات الإنشاء والتعديل لملف معين في البايثون، فعلى سبيل المثال يمكنك استخدام دالتي getmtime و getctime من مكتبة os مع دالة ctime من مكتبة time للحصول على هذه المعلومات كما في المثال التالي: import os.path, time print "last modified: %s" % time.ctime(os.path.getmtime(file)) print "created: %s" % time.ctime(os.path.getctime(file))ويمكنك أيضا استخدام دالة stat من مكتبة os على عدة معلومات حول الملف كما في المثال التالي(اخترنا فقط آخر تعديل): import os, time (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(file) print "last modified: %s" % time.ctime(mtime)كما أنه يمكنك إنشاء دالة للحصول على معلومات آخر تعديل باستخدام مكتبتي os و datetime كما في المثال التالي: import os import datetime def modification_date(filename): t = os.path.getmtime(filename) return datetime.datetime.fromtimestamp(t)المصدر
  8. هنالك عدة طرق لإيجاد أعلى وأقل قيمة، فيمكنك على سبيل المثال استخدام min لإيجاد اصغر قيمة كما في المثال التالي: [5, 10].minوبنفس الطريقة يمكنك استخدام max لإيجاد أعلى قيمة في المصفوفة كما في المثال التالي: [4, 7].maxوفي حالة ما كان لديك مصفوفة كبيرة وتريد إيجاد أعلى واصغر قيمة في نفس الوقت فيمكنك استخدام minmax كما في هذا المثال: [4, 5, 7, 10].minmax => [4, 10] أو يمكنك استخدام min_by و max_by لإيجاد القيم الأكبر والأصغر في الهاش (hash) فمثلا لو لديك قائمة أسماء الأشخاص والأعمار فيمكنك عرض اسم وعمر أصغر شخص بالإضافة إلى اسم وعمر أكبر شخص كما في المثال التالي: people = {'joe' => 21, 'bill' => 35, 'sally' => 24} people.min_by { |name, age| age } #=> ["joe", 21] people.max_by { |name, age| age } #=> ["bill", 35] المصدر
  9. يمكنك الحصول على نتيجة تنفيذ أحد أوامر النظام من دون أن تقوم باستخدام تابع system() عن طريق استخدام backticks، فهذه الطريقة تقوم بتنفيذ الأمر وتقوم بإرجاع النتيجة على شكل سلسلة نصية، والتي يمكنك تعيينها إلى متغير كما في المثال التالي: output = `ls` p output وإذا كنت بحاجة إلى تمرير شيء إلى هذا المتغير مثل تنفيذ هذا الأمر عن طريق تابع system مع تمرير اسم الملف كما في المثال التالي: system("ls " + filename) فيمكنك أن تقوم بذلك عن طريق استخدام إضافات السلسلة النصية القياسية كما في المثال التالي: ls #{filename} المصدر
  10. من أبرز الأخطاء التي تصادف مبرمجي البايثون (خاصة المبتدئين) هي أولوية العوامل الحسابية، فإن in دائما تسبق not في التنفيذ في لغة البايثون لذلك يتم تنفيذ in قبل not، ولذلك ستكون الشيفرة البرمجية التي قمت بكتابتها مشابهة لهذا: >>> not (True in [False, True]) Falseولقد قصدت هذا: >>> (not True) in [False, True] True حاول أن لا تكتب في البايثون Not(true) حاول على الأقل كتابتها not true لأن الأولى تجعلها مشابهة لاستدعاء دالة والتي هي في الأصل عامل حسابي not وليس دالة وهذا الأمر سوف يربك الشخص الذي يقوم بقراءة شيفرتك البرمجية. المصدر
  11. أنصحك باستخدام الخصائص (properties)، لأن جميع السمات (attributes) عامة في البايثون، لذلك إذا قمت بإضافة خط سفلي (_) إلى الأسماء فهو سيبقى مجرد تفصيل محدد لتلك السمة والتي قد لا تبقى نفسها في الإصدارات التالية من الشيفرة البرمجية، وهو لا يمنعك من الحصول على معلومات (getting) أو تعيين (setting) لتلك السمة، ولذلك فإن سمات الوصول القياسية (standard attribute access) هي الطريقة العادية (في البايثون) للوصول إلى السمات (أقصد طريقة المثال الثاني). ومن المميزات الأخرى للخصائص أنها متطابقة صياغيا مع سمات الوصول، لذلك يمكنك تغييرها دون أن تقوم بأي تعديلات على الشيفرة البرمجية للعميل. المصدر
  12. إذا كنت تستخدم إصدار 1.8.7 أو 1.9 من الروبي، فيمكنك الاستفادة من حقيقة أن التوابع التكرارية مثل each_with_index عندما تقوم باستدعائها من دون كتلة(block)، سوف تقوم بإرجاع كائن Enumerator والذي يمكنك في هذه الحالة استدعاء توابع Enumerable مثل map للتكرار والتعديل كما في المثال التالي: arr.each_with_index.map { |x,i| [x, i+2] }أما لو كنت تستخدم إصدار روبي قديم (أقدم من 1.8.7) فيمكنك استدعاء enumerator ومن ثم تقوم بتكرار والتعديل كما في المثال التالي: require 'enumerator' arr.enum_for(:each_with_index).map { |x,i| [x, i+2] }في الإصدار الثاني من الروبي 2.x هنالك تابع متسلسل يدعى with_index والذي يمكنك ربطه إلى map واستخدامه كما في المثال التالي: array.map.with_index { |item, index| ... }المصدر
  13. هذه النقاط الأربعة :: هي عامل أحادي تسمح بالوصول إلى الثوابت ومثيل التوابع (instance methods) وأصناف التوابع التي تم تعريفها داخل الصنف أو الوحدة من أي مكان خارج الصنف أو الوحدة. فعلى سبيل المثال لنفترض أنه لديك ثابت يدعى CONSTANT موجود داخل صنف ووحدتين كما في المثال التالي: module SomeModule module InnerModule class MyClass CONSTANT = 4 end end endفإذا رغبت بالوصول إلى هذا الثابت فيمكنك الوصول إليه عن طريق استخدام هذه النقاط الأربعة كما في المثال التالي: SomeModule::InnerModule::MyClass::CONSTANT يذكر أنه يمكنك أيضا تغيير القيم الموجودة في هذه الوحدات والأصناف بنفس الطريقة. المصدر
  14. بعض الوظائف والأعمال تتطلب معرفة بلغة بيرل كما أن لغة بيرل تستخدم في العديد من المواقع مثل موقع محرك البحث duckduckgo و BBC و Amazon و LiveJournal وفي أجزاء مواقع شهيرة أخرى. على الرغم من أن استخدام بيرل قد قل في السنوات الماضية لصالح البايثون والروبي إلا أنه لا يزال يعتبر من اللغات القوية والتي ينصح بتعلمها. وإذا أردت تعلم لغة برمجة فأنصحك بتعلم البايثون والروبي أولا قبل البيرل لأنهم الأكثر انتشارا حاليا.
  15. map و collect لديهما نفس الوظيفة، فسيكون السؤال هنا لماذا توجد دالتين map و collect في الروبي إذا كان لديهم نفس الوظيفة ؟ والجواب هو أن دالة map موجودة في العديد من اللغات البرمجية الأخرى بأسماء متعددة، فمثلا تسمى في لغة السي بلس بلس بـ transform أما في لغات البيرل والبايثون والروبي فتسمى map أما بالنسبة للمبرمجين بلغة Smalltalk فتسمى collect، لذلك فإن collect هي مثيل دالة map وقد وضعت لمبرمجين القادمين من لغة Smalltalk. وسوف تجد في وثائق الروبي أن map و collect لديهما نفس الوظيفة وبنفس طريقة الاستعمال.
  16. توجد العديد من أنواع الحلقات التكرارية في لغة الروبي، فلغة الروبي تتميز بالعديد من الحلقاتها وجملها الشرطية والتي قد تتكون من سطر واحد فقط. سوف تجد في الروبي حلقة تكرارية مشابهة لحلقة "do..while” وهي حلقة "do..break if” كما في المثال التالي: loop do # some code here break if <condition> end كما توجد أيضا حلقة "until” والتي تقوم بالتكرار حتى تحقيق الشرط (يتم تنفيذ الحلقة مرة واحدة على الأقل حتى تحقيق الشرط) كما في المثال التالي: val = 0 begin val += 1 puts val end until val % 6 == 0 للمزيد من المعلومات أنصحك بمراجعة المصدر. المصدر
  17. يمكنك فعل هذا بسهولة عن طريق الروبي، فهنالك في الروبي دالة مشابهة لدالة trim() في PHP وهي strip والتي تقوم بحذف جميع الفراغات الزائدة في السلسلة النصية كما في المثال التالي: s = " I have leading and trailing white space ".stripوإذا كنت قد قمت بتثبيت ROR (Ruby On Rails) أو على الأقل وحدة ActiveSupport فيمكنك أيضا استخدام squish كما في المثال التالي: require 'active_support/core_ext/string/filters' " a b c ".squishوستكون النتيجة: "a b c"وفي حالة ما أردت أن تقوم بحذف جميع الفراغات فيمكنك في هذه الحالة استخدام: gsub(/\s+/, "")المصدر
  18. slug هي طريقة لإنشاء روابط صحيحة وسهلة الفهم، وهي تَستخدم في العادة البيانات التي تحصلت عليها من خلال الموقع، فعلى سبيل المثال عن طريق استخدام عنوان المقال لإنشاء الرابط، وأنصحك بإنشاء slug عن طريق استخدام دالة (تقوم بإنشائها) تأخذ عنوان المقال كمعامل ثم تقوم بإنشاء الرابط عن طريق هذا العنوان، فعلى سبيل المثال لو كان العنوان What is a slug فيكون الرابط http://www.example.com/article/what-is-a-slug وهذا سيكون أفضل من لو كان العنوان http://www.example.com/index.php?cat=8&id=41. يذكر أن أكاديمة حسوب تستخدم أيضا slug في روابطها. المصدر
  19. في الحقيقة لا توجد أية إحصائيات دقيقة حول عدد الزوار للمواقع لكن سأذكر أكبر المواقع المبرمجة باستخدام لغة البايثون مع إطار دجانغو (مصدر هذه المواقع تجده في المصدر في الأسفل): انتساغرام: وهو أشهر مواقع الاجتماعية للصور والذي قامت فيسبوك بشراءه قبل مدة. Pinterest شبكة اجتماعية مشهورة لنشر الصور على شكل ملاحظات، حصلت على المرتبة 37 عالميا في المواقع الأكثر زيارة حسب ألكسا. Bitbucket من أشهر المواقع لاستضافة المشاريع البرمجية، يبلغ حجم الموقع أكثر من 200 تيرابايت ويملك أكثر من 2 مليون ونصف مستخدم نشط.من خلال المواقع في الأعلى يمكنك معرفة أن دجانغو قوي للغاية ويمكنه تحمل المئات ألألاف من المستخدمين. المصادر: 1 2
  20. هنالك فرق بين الإثنين، فـ == تُستخدم للمقارنة بين القيم أما is فهي تستخدم لاختبار تعريف الكائن، فإذا قمت باستخدام is، فستكون النتيجة true إذا كان الكائن هو نفس الكائن وستكون false إذا لم يكن نفس الكائن أما == فهي ستكون true في جميع الحالات التي تكون فيها قيم الكائنين هي نفسها. حتى تفهم الفرق بين الإثنين بشكل أفضل، ألق نظرة على الشيفرة البرمجية التالية: >>> a = 'pub' >>> b = ''.join(['p', 'u', 'b']) >>> a == b True >>> a is b False أي بكلمات أخرى is هي id(a) == id(b) . المصدر
  21. هنالك فرق بين هؤلاء الأربعة فـ == و === تقريبا لديهم نفس الوظيفة فهم يقومون بالتحقق من المساواة كما في المثال التالي: "test" == "test" #=> true "test" === "test" #=> true لكن الفرق أن === تقوم بمساواة الحالة أي أنها تتأكد من الحالة الأولى للمتغير كما في المثال التالي: String === "test" #=> true String == "test" #=> falseأما eql? فهي تقوم بالتحقق من القيم بين كائنين أي أن هل للكائن الأولى نفس قيمة الثاني أم لا وهي في الغالب تستخدم مع الهاشات (Hash) كما في المثال التالي: class Equ attr_accessor :val alias_method :initialize, :val= def hash() self.val % 2 end def eql?(other) self.hash == other.hash end end h = {Equ.new(3) => 3, Equ.new(8) => 8, Equ.new(15) => 15} #3 entries, but 2 are :eql? h.size # => 2 h[Equ.new(27)] # => 15وفي النهاية تستخدم equal? للتحقق من الكائن أي أن في المثال التالي هل أن a و b يشيران لنفس الكائن أم لا: a = b = '5' a.equal?(b) # => true للمزيد من المعلومات أنصحك بقراءة هذا المقال.
  22. الفرق الرئيسي بين القوائم و tuples أن tuples ثابتة أي أنك لا تستطيع تغيير القيم الموجودة في tuple بعد أن تقوم بإنشائها، فإذا كنت تحتاج إلى تغيير القيم أنصحك باستخدام القوائم. والفرق الثاني بين القوائم والـ tuples أنه القوائم تكون في العادة متجانسة وأما tuples فهي غير متجانسة. لكن للـ tuples عدة مميزات تتميز بها عن القوائم والتي من بينها أن أداءها أفضل من أداء القوائم وبما أنها ثابتة فيمكنك استخدامها كمفتاح في القواميس. للمزيد من المعلومات أنصحك بقراءة هذا المقال.
  23. هنالك عدة طرق للتأكد من وجود متغير ما في الروبي، فيمكنك مثلا استخدام defined? والتي ستقوم بإرجاع سلسلة نصية بنوع العنصر إذا كان موجودا أو ستقوم بإرجاع nil إذا لم يكن المتغير موجود كما في المثال التالي: >> a = 1 => 1 >> defined? a => "local-variable" >> defined? b => nil >> defined? nil => "nil" >> defined? String => "constant" >> defined? 1 => "expression"كما يمكنك تطوير المثال السابق ليقوم بأمر ما عندما يجد أن المتغير تم تعريفه أو لا، فمثلا سيقوم بطباعة رسالة باللون الأحمر إذا لم يكن المتغير موجود ورسالة باللون الأخضر إذا كان المتغير موجود كما في المثال التالي: if (defined?(var)).nil? # will now return true or false print "var is not defined\n".color(:red) else print "var is defined\n".color(:green) endالمصدر
  24. هنالك عدة طرق لجمع محتويات مصفوفة من الأعداد، فيمكنك مثلا استخدام التابع inject الذي سيقوم بجلب جميع قيم المصفوفة ثم يقوم بجمع الواحدة مع الأخرى كما في المثال التالي: array.inject{|sum,x| sum + x }أو إذا كنت تستخدم روبي 1.9+ فيمكنك في هذه الحالة اختصار السطر السابق بهذا السطر: array.inject(:+)وإذا كنت تستخدم ROR (Ruby On Rails) أو على الأقل وحدة ActiveSupport فيمكنك استدعاء هذه الوحدة ومن ثم استخدام التابع sum الذي سيقوم بجمع الأعداد في المصفوفة بشكل تلقائي كما في المثال التالي: require 'activesupport' array.sumالمصدر
  25. include و require هما شيئان مختلفان في الروبي. فـ require تقوم بنفس الوظيفة التي تقوم بهما include في أغلب اللغات الأخرى، وهي تشغيل ملف آخر، بالإضافة إلى أنها تقوم بالتأكد مما قد قمت باستدعائه سابقا لكي لا تقوم باستدعاء نفس الملف مرتين، وإذا أردت تشغيل ملف آخر بدون أن تقوم بالتأكد فيمكنك في هذه الحالة استخدام load لاستدعاء الملف. أما include فهي تقوم بأخذ جميع الدوال من وحدة أخرى ثم تقوم بإرفاقهم إلى الوحدة الحالية، فالهدف الرئيسي من include هو توسيع الفئات (classes) بوحدات أخرى. فإذا أدرت فقط استخدام وحدة بدون أن تقوم بتوسيع فئاتك فيجب عليك في هذه الحالة استخدام require. إن require تشبه include في لغة السي أما include في الروبي فهي تقريبا لا تشبه include في السي. المصدر
×
×
  • أضف...