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

هشام رزق الله

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

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

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

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

    31

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

  1. هنالك طريقتين شهيرتين في البايثون لتوليد الأعداد العشوائية، الطريقة الأولى عن طريق دالة randint من مكتبة random حيث ستقوم بتمرير أصغر عدد وأكبر عدد، وستقوم الدالة بتوليد رقم عشوائي حسب المعادلة التالية a <= N <= b حيث سيكون N هو العدد الذي تم توليده. مثال على استخدام هذه الدالة: from random import randint print(randint(0,9)) الطريقة الثانية هي عن طريق دالة randrange من مكتبة random حيث هذه الدالة تشبه الدالة السابق لكن الفرق أن العدد الأكبر الذي ستمرره ليس ضمن مدى الكلمات التي يتم توليدها. مثال على استخدام الدالة: from random import randrange irand = randrange(0, 10)المصدر
  2. يقصد بهذا الرمز أنه عامل ليس-ليس، ويعمل كالتالي: !!nil #=> false !!"abc" #=> true !!false #=> false سوف يقوم بإرجاع true إذا كان الكائن على اليمين ليس nil أو false، وسيقوم بإرجاع false إذا كان ذلك الكائن nil أو false. لا يستخدم هذا العامل الحسابي كثيرا، فهو يستخدم في الغالب لتجنب استهلاك أحجام كبيرة من البيانات للتأكد من وجود شيء ما، فمثلا، أنت لا تريد استهلاك 3 ميغابايت من البيانات للتأكد من أن الصورة موجود عن طريق استخدام تابع has_image? لذلك نستخدم هذا التابع لتجنب هذا الاستهلاك الكبير للموارد.
  3. هنالك العديد من الطرق للقيام بذلك في الروبي، إذا أردت حلا سهلا وبدون استدعاء وحدات أو استخدام توابع، يمكنك حذف الحرف الأول من القائمة عن طريق الإشارة إليه بواسطة الرمز [0] الذين يشير إلى الموقع الأول في السلسلة النصية ومن ثم تغييره إلى سلسلة نصية فارغة كما في المثال التالي: asdf = "[12,23,987,43" asdf[0] = '' p asdf # >> "12,23,987,43"كما يمكنك القيام بعكس العملية السابقة فبدلا من استبدال الحرف الأول بسلسلة نصية فارغة يمكنك تحديد بقية النص فقط دون الحرف الأول كما في هذا المثال: 'Hello World'[1..-1] => "ello World"
  4. أسهل وأسرع طريقة في الروبي للقيام بالمقارنة بين سلسلتين نصيتين بغض النظر عن حالة الأحرف هي عن طريق استخدام التابع casecmp الذي يقوم بإرجاع 1 إذا كان هنالك أحرف زائدة من السلسلة الأولى عن السلسلة الثانية أو سوف يقوم بإرجاع صفر لو كانت السلسلتين النصيتين لهم نفس القيم بغض النظر عن الحالة أو سيرجع -1 لو كان هنالك أحرف زائدة في السلسلة النصية الثانية على السلسلة النصية الأولى، بعض الأمثلة على الاستخدام: "abcdef".casecmp("abcde") #=> 1 "aBcDeF".casecmp("abcdef") #=> 0 "abcdef".casecmp("abcdefg") #=> -1 "abcdef".casecmp("ABCDEF") #=> 0 للمزيد من المعلومات حول هذا التابع: التوثيق الرسمي
  5. أهم فرق بين هذين الإطارين(ميكرو إطار) هو أن Flask مبني على تكنولوجيات أخرى مثل Werkzeug وJinja2 والتي ستكون موجودة لمدة أطول ولن تقوم باختراع أي شيء جديد(لن تضيف أي شيء جديد)، في حين أن Bottle يحاول أن يكون إطار من نوع ملف واحد، فمطوري Bottle يحبذون جعل الإطار يتكون من ملف واحد فقط ولا يحاولون الخروج عن هذه الفكرة. وفيما يتعلق بالمرونة لا توجد أية أسباب تمنعك من استخدام flask مع أي محركات قوالب أخرى إذا كان هذا ما تريده، فمثلا يمكنك استخدام Flask-Genshi والتي هي ملحق لـ Flask لتسمح لك باستخدام Genshi للقولبة.
  6. هنالك عدة طرق للحصول على IP محلي عن طريق البايثون فعلى سبيل المثال يمكنك استخدام تابع gethostbyname من مكتبة socket كما في المثال التالي: import socket socket.gethostbyname(socket.gethostname()) هذا الأمر قد لا يعمل دائما، فهو يرجع 127.0.0.1 في الأجهزة التي لديها hostname ذات عنوان 127.0.0.1 في /etc/hosts. هنالك حل آخر إلا أنّه يفترض وجود إتصال بالإنترنت بدون بروكسي محلي، وهو عن طريق استخدام تابع getsockname من مكتبة socket كما في هذا المثال: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("gmail.com",80)) print(s.getsockname()[0]) s.close()المصدر
  7. تعتبر أخطاء استدعاء الملفات من أكثر الأخطاء التي تواجه المبتدئين في لغة الروبي، فعندما يقوم المبرمج المبتدئ باستدعاء ملف موجود في مسار معين أو في نفس المسار يخطئ في طريقة كتابة أمر الاستدعاء، الحل الصحيح للمشكلة السابقة هو كتابة ./ قبل اسم الملف وحذف الامتداد كما في المثال التالي: require "./tokenizer" يمكن استدعاء الملفات أيضًا عن طريق استخدام أمر الاستدعاء require_relative والذي سيبحث في نفس مجلد الملف كما في المثال التالي: require_relative 'tokenizer'المصدر
  8. إن البايثون egg هي طريقة لتوزيع حزم برمجيات البايثون وهي مشابهة لملفات .jar في الجافا، وهي بشكل مختصر ملف من نوع .zip يحتوي على ملفات البيانات الوصفية (metadata). يحتوي بايثون egg على هيكل ملفات منطقي يجب إتباعه للحصول على ملفات من نوع egg صحيحة ويجب أن يحتوي على ملفات البيانات الوصفية المناسبة له. يمكنك تثبيت أي ملف من نوع Egg عن طريق كتابة الأمر التالي (في نظام لينكس): easy_install somepackage.egg كما يمكنك تمرير رابط لأحد ملفات egg لتثبيتها واستخدامها كما في المثال التالي: easy_install http://somehost.somedomain.com/somepackage.eggللمزيد من المعلومات حول ملفات egg أنصحك بقراءة هذا المقال.
  9. كالعادة في البايثون توجد العديد من الطرق للقيام بنفس الوظيفة، بعضها صعب والآخر أسهل، وأبسط طريقة للتأكد من أن الكائن من نوع دالة هي عن طريق التأكد من أن هذا الكائن لديه سمة __call__ عن طريق استخدام التابع hasattr ومن ثم تمرير الكائن: hasattr(obj, '__call__') ويمكنك أيضا استخدام وحدة types للتأكد من أن الكائن هو دالة عن طريق استخدام التابع FunctionType مع isinstance كما يظهر في الأمثلة التالي: In [1]: import types In [2]: types.FunctionType Out[2]: <type 'function'> In [3]: def f(): pass ...: In [4]: isinstance(f, types.FunctionType) Out[4]: True In [5]: isinstance(lambda x : None, types.FunctionType) Out[5]: Trueلاحظ أن lambda تعتبر أيضا دالة. المصدر
  10. هنالك عدة طرق للتأكد من أن المعامل موجود في الريلز فيمكنك على سبيل المثال استخدام التابع blank? الذي يقوم بإرجاع true إذا كان المعامل فارغ أو nil والذي يمكنك استعماله مع unless لتنفيذ أمر ما عند تحقق الشرط كما في المثال التالي: unless params[:one].blank? && params[:two].blank? وهذا الأمر لن يعمل إذا قمت بالتحقق من قيمة منطقية (boolean) كما في هذا المثال: >> false.blank? => true وفي هذه الحالة يجب عليك أن تستخدم تابع to_s لتحويل القيمة المنطقة إلى سلسلة نصية للتعامل معها مع تابع blank? كما في المثال التالي: unless params[:one].to_s.blank? && params[:two].to_s.blank?المصدر
  11. هنالك العديد من الطرق للقيام بتحميل الملفات عن طريق HTTP باستخدام لغة الروبي وعلى جميع الأنظمة، فمثلا يمكنك استخدام وحدة net/http التي سنستخدم العديد من توابعها مثل get لتحميل الملف ومن ثم نقوم بكتابته في ملف معين عن طريق استخدام دوال فتح والكتابة على الملفات كما في المثال التالي: require 'net/http' # Must be somedomain.net instead of somedomain.net/, otherwise, it will throw exception. Net::HTTP.start("somedomain.net") do |http| resp = http.get("/flv/sample/sample.flv") open("sample.flv", "wb") do |file| file.write(resp.body) end end puts "Done." كما يمكنك أيضا تطوير الشيفرة البرمجية قليلا حتى تتمكن من حفظ الملف أثناء التحميل بدلا من انتظار تحميل الملف كاملا ومن ثم القيام بحفظه في مكان معين كما في المثال التالي: # instead of http.get f = open('sample.flv') begin http.request_get('/sample.flv') do |resp| resp.read_body do |segment| f.write(segment) end end ensure f.close() endالمصدر
  12. في الحقيقة هنالك اختلافات بسيطة بين حلقتي التكرار each و for، فعلى سبيل المثال عند استخدام حلقة التكرار for سيبقى متغير التكرار حيا (بقيمته الأخيرة) بعد الخروج من حلقة التكرار، أما لو استخدمت each فلن يبقى هذا المتغير إلا لو قمت بتعريفه كمتغير محلي قبل أن تبدأ حلقة التكرار، أنظر لهذين المثال لتفهم الفرق بشكل أفضل: irb> [1,2,3].each { |x| } => [1, 2, 3] irb> x NameError: undefined local variable or method `x' for main:Object from (irb):2 from :0 والآن نفس المثال لكن مع for: irb> for x in [1,2,3]; end => [1, 2, 3] irb> x => 3 بالإضافة إلى ذلك يعتبر for سهل الكتابة والقراءة للتابع each كما رأيت في الأمثلة السابقة. المصدر
  13. إن Linux+ هي شهادة مقدمة من CompTIA والتي تُثبت معرفة صاحبها لأساسيات استخدام أغلب أنظمة لينكس بالإضافة إلى الأوامر الأساسية للطرفية و حل المشاكل الصغيرة للنظام وتثبيت وإعداد الأنظمة بالإضافة إلى معرفة بأساسيات الشبكات، والامتحان عبارة عن أسئلة على شكل اختيارات (60 سؤال) وزمن الامتحان هو 90 دقيقة ومعدل النجاح هو 500\800 ويوجد نوعين من الشهادات LX0-103 وLX0-104. للمزيد من المعلومات حول هذه الشهادة أنصحك بمراجعة الصفحة الرسمية.
  14. لتخزين أسماء ملفات سطح المكتب باستخدام سطر أوامر لينكس يجب عليك أن تقوم أولا بالدخول إلى سطح المكتب عن طريق الأمر cd ومن ثم كتابة أمر عرض الملفات ls ثم استخدام الرمز > والذي سيحوّل ناتج هذا الأمر إلى ملف بأي اسم تختاره كما في المثال التالي: ls > filenames.txtولحساب عدد الملفات الموجودة يمكنك كتابة هذا الأمر: ls -l | grep -v ^l | wc -l > filesnum.txtكما يمكنك دمج الأمرين معا كما في المثال التالي: f.txt && ls -l | grep -v ^l | wc -l > n.txt ملاحظة: قمنا بتمرير -l إلى ls حتى لا تقوم بحساب الملفات المخفية.
  15. هناك العديد من الطرق لحذف عناصر ذات سلاسل نصية فارغة من قائمة السلاسل النصية فعلى سبيل المثال يمكنك استخدام filter لترشيح (فلترة) النتائج: str_list = filter(None, str_list) # fastest str_list = filter(bool, str_list) # fastest str_list = filter(len, str_list) # a bit of slower str_list = filter(lambda item: item, str_list) # slower than list comprehension كما يمكنك كتابة سطر به حلقة تكرار وجملة شرطية لاختيار العناصر الغير الفارغة كما يظهر في المثال التالي: strings = ["first", "", "second"] [x for x in strings if x] ستكون النتيجة: ['first', 'second'] كما يمكنك إنشاء حلقة تكرار لحذف العناصر الفارغة من القائمة عن طريق الدالة المدمجة remove حيث استخدمنا في المثال try و except لننتمكن من إيقاف البرنامج بعد الانتهاء من التكرار على كامل القائمة: l = ["1", "", "3", ""] while True: try: l.remove("") except ValueError: breakالمصدر
  16. هنالك العديد من الطرق للقيام بعملية XOR في البايثون، مثلا يمكنك أن تقوم أولا بجعل المدخلات من نوع boolean ومن ثم استخدام != لأن هذا الرمز هو عامل XOR كما في: bool(a) != bool(b) ويمكنك أيضا استخدام تعريف xor لتقوم بإنشائها من العمليات المنطقية الأخرى مثل and و not كما في المثال التالي: (a and not b) or (not a and b) لكن يبدو هذا نوعا طويلا، بالإضافة إلى أن قارئ هذه الشيفرة البرمجية لن يفهم ما الذي ستحاول فعله من النظرة الأولى لذلك هنالك طريقة أخرى للقيام بنفس وظيفة السطر السابق وهي هذه الطريقة: bool(a) ^ bool(b) كما يمكنك استدعاء دالة xor من مكتبة operator ومن ثم استخدامها كما في: from operator import xor xor(bool(a), bool(b))المصدر
  17. هنالك العديد من الطرق للقيام بذلك، فإذا أردت أن تعرف هل أن مجلدا معينا (وليس ملفا) موجود في مسار معين، فيمكنك في هذه الحالة استخدام File.directory? أو Dir.exists? فهاتين الدالتين سترجع true إذا كان المجلد موجودًا وخلافا لذلك فستقوم بإرجاع false. أيضًا، يمكنك تنفيذ ذلك بطريقة أفضل عن طريق كتابة تابع والاستفادة من حقيقة أن الروبي سيقوم بإرجاع نتيجة آخر تعبير برمجي تلقائيًا داخل التابع كما في المثال التالي: def directory_exists?(directory) File.directory?(directory) end المصادر 1 2
  18. قم باستخدام __new__ عندما تحتاج إلى التحكم بإنشاء مثيل جديد، واستخدم __init__ عندما تريد أن تتحكم بتهيئة (initialization) المثيل الجديد. إن __new__ هي أول خطوة من عملية إنشاء المثيل، حيث يتم استدعائها أولا وهي المسؤولة عن إرجاع المثيل الجديد الخاص بصنفك. في المقابل، لن تقوم __init__ بإرجاع أي شيء، فهي مسؤولة فقط عن عملية تهيئة المثيل بعد أن يتم إنشاؤه. بشكل عام، لا يجب أن تتجاوز __new__ إلا في حالة إنشاء صنف فرعي لنوع غير قابل للتغيير مثل str أو int أو unicode أو tuple. المصدر
  19. هنالك العديد من الحلول لهذه المشكلة، مثلا يمكنك استخدام دالة reversed مع حلقة التكرار for كما في هذا المثال: >>> array=[0,10,20,40] >>> for i in reversed(array): ... print i لاحظ أن دالة reversed(...) لا تقوم بإرجاع قائمة، وإذا أردت قائمة بترتيب معكوس للعناصر يمكنك استخدام list(reversed(array)). كما توجد طريقة أخرى أسهل بكثير عن طريق استخدام صياغة الشريحة الموسعة كما في هذا المثال: >>> L = [0,10,20,40] >>> L[::-1] [40, 20, 10, 0] للمزيد من المعلومات حول صياغة الشريحة الموسعة أنصحك بقراءة هذا المقال. ويمكنك أيضا استخدام الدالة reserve() لعكس ترتيب عناصر قائمة كما في هذا المثال: >>> L = [0,10,20,40] >>> L.reverse() >>> L [40, 20, 10, 0]
  20. للعامل الحسابي "علامة استفهام" العديد من الاستخدامات في لغة الروبي، لكن من أكثرها استخداماته كنمط متفق عليه للكتابة بين المبرمجين للإشارة إلى أن التابع يقوم بإرجاع قيمة منطقية من نوع Boolean، فعلامة الاستفهام هي حرف صحيح في نهاية اسم التابع. كما أنه لو وضعت علامة الاستفهام قبل أحد الأحرف فإنه سيرجع رمز آسكي ASCII للحرف فعلى سبيل المثال لو أردت رمز آسكي للحرف F: ?F # => will return 70كما لعلامة الاستفهام استخدامات أخرى كاختصار للجمل الشرطية وغيرها ...
  21. هنالك العديد من الخيارات الجيدة بدلا من eval، فبداية من الإصدار 2.6 للبايثون تمت إضافة دالة literal_eval إلى مكتبة ast والتي سهلت من عمليات التحويل للسلاسل النصية كما في المثال التالي: >>> import ast >>> ast.literal_eval("{'muffin' : 'lolz', 'foo' : 'kitty'}") {'muffin': 'lolz', 'foo': 'kitty'} وتعتبر هذه الدالة أفضل من eval حسب توثيقها الرسمي. ويمكنك أيضا حل هذه المشكلة عن طريق استخدام JSON الذي سيقوم باستبدال الرمز ' بالرمز المزدوج " كما في هذا المثال: import json s = "{'muffin' : 'lolz', 'foo' : 'kitty'}" json_acceptable_string = s.replace("'", "\"") d = json.loads(json_acceptable_string) # d = {u'muffin': u'lolz', u'foo': u'kitty'} يذكر أنه إذا كان لديك الرمز ' كجزء من المفاتيح أو القيم فسوف تفشل عملية التحويل بسبب تبديل الأحرف. المصدر
  22. تُرجع لغة الروبي عند عمليات القسمة عدد نوعه نفس نوع الأعداد التي تم تقسيمها، فمثلا لو قمت بعملية قسمة لعدد صحيح على عدد آخر صحيح فسيكون الناتج هو عدد صحيح، وفي حالة تقسيم عدد Float على عدد آخر من نفس النوع فسيكون الناتج عدد من نوع Float، وفي حالة تقسيم عدد صحيح على عدد Float فسيكون الناتج عدد من نوع Float. بالنسبة لسؤالك حول طريقة جعل ناتج القسمة عدد من نوع Float فالحل بجعل أحد العددين عدد من نوع Float عن طريق إضافة .0 كما في المثالين التاليين: 9.0 / 5 #=> 1.8 9 / 5.0 #=> 1.8 ويمكنك استخدام الدالة to_f كما في المثال التالي: 9.to_f / 5 #=> 1.8 9 / 5.to_f #=> 1.8المصدر
  23. هنالك عدة طرق لحل هذه المشكلة في الروبي اون ريلز (Ruby on Rails)، فعلى سبيل المثال يمكنك استخدام التابع number_with_delimiter كما في هذا المثال: <%= number_with_delimiter(@number, :delimiter => ',') %> وبدلا من ذلك، يمكنك استخدام تابع number_with_precision لضمان أن العدد الذي يتم عرضه بدقة منزلتين عشريتين: <%= number_with_precision(@number, :precision => 2, :delimiter => ',') %> وإذا أردت فعل ذلك خارج الريلز (ROR) فيمكنك في هذه الحالة استخدام طرق متعددة لإضافة الفواصل إلى الأرقام الكبيرة في الروبي وباستخدام وحدات ومكتبات متنوعة، وهذه أقصر الطرق: number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse كما يمكنك الاستعانة بهذا المثال أيضا الذي لا يعتمد هو الآخر على الريلز: parts = number.to_s.split('.') parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,") parts.join('.')المصادر 1 2
  24. أنصحك باستخدام حزمة Requests. إذا كنت قد استخدمت لغة أخرى غير البايثون، سوف تعتقد في الوهلة الأولى بأن urllib و urllib2 هي الأسهل استخداما لأنها لا تجعلك تستخدم العديد من الشيفرات البرمجية بالإضافة إلى أنها ذات قدرات عالية، وهذا ما اعتقدته أنا أيضا، لكن حزمة Requests أفضل منهما بكثير وبها العديد من المميزات التي تتفوق بهما على المكتبات الأخرى. فمثلا سوف تجد أن API الخاص بها مريح للغاية وسهل الفهم كما في الأمثلة التالية: import requests ... resp = requests.get('http://www.mywebsite.com/user') resp = requests.post('http://www.mywebsite.com/user') resp = requests.put('http://www.mywebsite.com/user/put') resp = requests.delete('http://www.mywebsite.com/user/delete')يذكر أن لـ urllib2 العديد من الخيارات والمميزات الرائعة، فإذا لم تعجبك Requests فسوف أنصحك باستخدام urllib2.
  25. يمكنك استخدام وحدة inspect التي توفر عدة دوال مفيدة لمساعدتك في الحصول على المعلومات عن كائنات حية (live objects) مثل الوحدات والأصناف والتوابع والدوال و شيفرات الكائنات وغيرها.. فعل سبيل المثال ستُمكنك هذه الوحدة من فحص محتويات صنف واسترداد الشيفرة المصدرية للتابع واستخراج وتهيئة (format) قائمة وسيطات (argument) للدالة وسوف تمكنك أيضا من الحصول على أية معلومات أخرى. مجموعة من الأمثلة حول طريقة الحصول على مسار وحدة ما في البايثون عن طريق inspect: >>> import os >>> import inspect >>> inspect.getfile(os) '/usr/lib64/python2.7/os.pyc' >>> inspect.getfile(inspect) '/usr/lib64/python2.7/inspect.pyc' >>> os.path.dirname(inspect.getfile(inspect)) '/usr/lib64/python2.7' للمزيد من المعلومات حول هذه الوحدة: التوثيق الرسمي
×
×
  • أضف...