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

هشام رزق الله

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

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

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

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

    31

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

  1. هنالك عدة طرق في لغة روبي لفرز المصفوف حسب قيم معينة متعددة، فيمكنك على سبيل المثال استخدام تابع sort ومن ثم اختيار ترتيب الفرز كما يظهر في المثال التالي: a.sort { |a, B| [a['foo'], a['bab']] <=> [b['foo'], b['bab']] } أما بالنسبة للمثال الذي وضعته والذي أخذته من شبكة الإنترنت فهو يعمل لدي بدون مشاكل على نظام لينكس وعلى إصدار 1.8.7 من روبي، ربما لا يعمل على الإصدارات الجديدة للروبي فحاول تجربته على الإصدار 1.8.7.
  2. هنالك عدة طرق لتعديل أسماء الملفات في لغة روبي، فيمكنك على سبيل المثال استخدام تابع rename للتعديل، لذلك إذا قمنا بتعديل سطر rename الموجود في برنامجك ليعمل فسيكون مشابها لهذا: File.rename(f, folder_path + "/" + filename.capitalize + File.extname(f)) الخطأ في السطر الذي كتبته أنه يجب أن يكون مسار الملف والموجود في متغير folder_path جزءا من اسم الملف والموجود في متغير filename كما في المثال أعلاه.
  3. هنالك عدة طرق للحصول على أول عنصر يطابق شروط معينة في بايثون، فيمكنك على سبيل المثال استخدام دالة next() كما في المثال التالي في حالة أردت إصدار خطأ StopIteration إذا لم يكن هنالك مطابق لشروطك: next(x for x in the_iterable if x > 3) أو يمكنك استخدام هذه الطريقة التي سترجع لك default_value إذا لم تجد مطابق للشروط الذي وضعتها للبحث: next( (x for x in the_iterable if x>3), default_value) وهنالك أيضا طريقة أخرى تعتمد على حلقة تكرار for كما يظهر في المثال التالي: >>> (x for x in xrange(10) if x > 5).next() 6
  4. هنالك عدة حلول لهذه المشكلة في لغة بايثون، فيمكنك على سبيل المثال استدعاء وحدة base64 والتي هي وحدة قياسية مدمجة في لغة بايثون تحتوي على دالة b64encode والتي تقوم بترميز السلاسل النصية بترميز من نوع Base64 كما في المثال التالي: >>> import base64 >>> print base64.b64encode("password") cGFzc3dvcmQ= >>> print base64.b64decode("cGFzc3dvcmQ=") password يمكنك فك تشفير السلسلة النصية عن طريق دالة b64decode. من الحلول الأخرى التي يمكنك الاستعانة بها هي وضع كلمات المرور في ملف منفرد خارج السكربت ومن ثم استدعاء ذلك الملف عند الحاجة. المصدر
  5. لا أعرف ما إذا كان هنالك دوال قياسية في بايثون لفعل ذلك، لكن هنالك عدة طرق أخرى يمكنك استخدامها. فمثلا يمكنك التأكد من أنه تم تقريب عدد بعد قسمته على 5، وهذا سنفعله عن طريق round(float(x)/5) وبعد ذلك بما أننا قسمنا الرقم على 5 فسنقوم بضربه بخمسة أيضا، وسنحول الناتج في النهاية إلى عدد صحيح لأن دالة round() ترجع أرقام حقيقية (بالفاصل): def myround(x, base=5): return int(base * round(float(x)/base))
  6. يمكنك البحث داخل المصفوفات بطرق كثيرة في لغة روبي، فيمكنك على سبيل المثال استخدام توابع select و include? للبحث كما في المثال التالي: >> arr.select {|s| s.include? 'sa'} => ["sandra", "sam", "sabrina"] أو يمكنك استخدام تابع match مع تابع select كما في المثال التالي: arr.select {|a| a.match(/^sa/)} كما يمكنك استخدام select منفردا بدون أي تابع معها كما في المثال التالي: a.select{|x|x[/^sa/]} من الحلول المنصوح بها أيضا استخدام التعابير النمطية للبحث داخل المصفوفة عن طريق استعمال تابع grep كما يظهر في المثال التالي: arr.grep(/^sa/)
  7. هنالك عدّة طرق في لغة روبي للتأكد من تشابه محتويات مصفوفتين معا، لكن لكل طريقة عيوبها الخاصة، فمثلا يمكنك استخدام توابع uniq و sort بالإضافة إلى العامل الحساب == للتأكد من تطابق محتويات المصفوفتين: a.uniq.sort == b.uniq.sort العيب في هذه الطريقة السابقة أنها لن تعمل في حالة كانت المصفوفة تحتوي على عناصر لا يمكنك فرزها مثل hashes. يمكنك كذلك استخدام تابع blank? للتأكد من تطابق العناصر كما في المثال التالي: ((A-B) + (B-A)).blank? إلا أن المشكلة في المثال السابق أنه لن يعمل في حالة كانت المصفوفة تحتوي على عناصر متكررة. اختر بين الحلّين السابقين الأنسب لبرنامجك.
  8. إن طريقة تبديل مواقع عناصر في قائمة معينة في لغة بايثون سهلة للغاية فيكفي أن تضع العنصر الأول في موقع الثاني والعكس كما في المثال التالي: foo[i], foo[j] = foo[j], foo[i] وللحصول على المواقع الأصلية للعنصرين الأول والثاني لاستخدامهم في المثال أعلاه يمكنك استعمال دالة index ومن ثم تمرر لها العنصر لترجع لك موقعه كما في المثال التالي: i = foo.index("password2") وهذه طريقة أخرى للتبديل باستخدام التشريح كما يظهر في المثال التالي: >>> L = ['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter'] >>> i = L.index('password2') >>> L[i:i+2] = L[i+1:i-1:-1] >>> L ['title', 'email', 'password1', 'password2', 'first_name', 'last_name', 'next', 'newsletter']
  9. هنالك حلول عديدة لهذه المشكلة لكنها تختلف حسب إصدار بايثون المثبت على جهازك، فيمكنك مثلا استخدام التعليمة print بدون استدعاء sys وذلك بوضع فاصلة بعد السلسلة النصية التي تريد طباعتها في المرة الأولى كما في المثال التالي: def install(): print("Installing... "), install() print "[DONE]"فالفاصلة في نهاية تعليمة print الأول ستمنع print من الرجوع إلى السطر. أما لو كنت تستخدم الإصدار الثالث من بايثون، فيمكنك في هذه تمرير معامل end والذي ستجعله فارغا لمنع الرجوع إلى السطر كما في المثال التالي: def install(): print("Installing... ", end="") install() print("[DONE]")
  10. هنالك عدّة دوال قد تساعدك: dir() هذه الدالة ستعطيك قائمة من المتغيرات.Globals() هذه الدالة ستعطيك قاموس من المتغيرات العامة.Locals() هذه الدالة تعطيك قاموس من المتغيرات المحلية.أما في حالة ما أردت طباعة أسماء جميع المتغيرات فيمكنك في هذه الحالة استخدام حلقة تكرار for مع دوال vars() و keys() كما في المثال التالي: for name in vars().keys(): print(name) وللحصول على قيم هذه المتغيرات يمكنك استخدام دالة values() مع حلقة التكرار كما في المثال التالي: for value in vars().values(): print(value)
  11. هنالك طرق عديدة في لغة روبي لجمع الأسماء حسب العدد، لكن أغلب هذه الطرق وأسهلها موجودة في ريلز، فمثلا يمكنك استدعاء وحدة active_support/inflector في ريلز ومن ثم يمكنك جمع أي اسم عن طريق استخدام تابع pluralize كما في المثال التالي: require 'active_support/inflector' "MyString".pluralize وسيكون الناتج: "MyStrings" كما يمكنك إنشاء دالة بسيطة لجمع الأسماء بإضافة حرف s في نهايتها إذا كان العدد أكبر من 1 كما في المثال التالي والذي استخدمنا فيه الجمل الشرطية: def x(n, singular, plural=nil) if n == 1 "1 #{singular}" elsif plural "#{n} #{plural}" else "#{n} #{singular}s" end end وهذا مثال بسيط على استخدام الدالة: puts x(0, 'tree') # 0 trees puts x(1, 'tree') # 1 tree puts x(2, 'tree') # 2 trees puts x(0, 'match', 'matches') # 0 matches puts x(1, 'match', 'matches') # 1 match puts x(2, 'match', 'matches') # 2 matches
  12. هنالك عدّة طرق في لغة روبي لتحويل مصفوفة من السلاسل النصية إلى سلسلة نصية واحدة مفصولة بفواصل كما لو كانت لا تزال مصفوفة، ومن أسهل هذه الطرق استخدام توابع map و join لفعل ذلك كما في المثال التالي: ["10", "20", "50","99"].map(&:inspect).join(', ') # => '"10", "20", "50", "99"' أو يمكنك فعل ذلك باستخدام تابع join فقط مع تمرير الفاصلة كالتالي: array.join(',') وفي حالة ما لم ترغب بعلامات (“”) فيمكنك استخدام تابع to_sentence كالتالي: array.to_sentence
  13. إن هذه الرموز لا تُستخدم فقط في لغة بايثون، بل تُستخدم في جميع اللغات التي تدعم التعابير النمطية، وإن رمز الأرقام [0-9] لا يعادل رمز الأرقام \d لأن الأول يطابق الأرقام 0123456789 فقط في حين أن الآخر يطابق أرقام 0123456789 بالإضافة إلى جميع أنواع الأرقام الأخرى مثل الأرقام العربية الشرقية (والتي يُسميها البعض بالهندية) ٠١٢٣٤٥٦٧٨٩ بالنسبة لمشكلتك مع الرقم 2 فهي مشكلة في برنامجك وليس في رمز \d لأن هذا الرمز يطابق جميع الأرقام العربية بدون مشاكل.
  14. يمكنك تكرار السلسلة النصية في بايثون بعدّة طرق، فمثلا يمكنك تكرار سلسلتك النصية ثم تضعها في متغير معين وتقطع منه الطول الذي تريده فقط كما في المثال التالي: >>> 'abc' * 7 'abcabcabcabcabcabcabc' >>> a = 'abc' * 7 >>> b = a[:7] >>> b 'abcabca' >>> هذا أبسط مثال لحل مشكلتك، ورغم ذلك توجد طرق أخرى عديدة يمكنك استخدامها وهي أفضل من هذه، وبما أنك ذكرت أنك تريد إنشاء دالة فيمكنك في هذه الحالة كتابة دالة مشابهة لهذه التي ستمرر لها السلسلة النصية والطول المطلوب وسترجع لك السلسلة النصية المكررة: def repeat_to_length(string_to_expand, length): return (string_to_expand * ((length/len(string_to_expand))+1))[:length]
  15. يمكنك حل مشكلة تعدد أسطر الشيفرة البرمجية بعدة أساليب في بايثون، فيمكنك على سبيل المثال استخدام echo -e قبل السطر البرمجي و| python بعد السطر البرمجي ومن ثم تفصل الاستدعاء عن حلقة التكرار برمز \n كما في المثال التالي: echo -e "import sys\nfor r in range(10): print 'rob'" | python أو يمكنك استخدام exec ومن ثم تفصل الاستدعاء عن حلقة التكرار باستخدام رمز \\n كما في المثال التالي: python -c "exec(\"import sys\\nfor r in range(10): print 'rob'\")" كما يمكنك استخدام echo مرتين: (echo "import sys" ; echo "for r in range(10): print 'rob'") | python
  16. من أسهل الطرق في لغة روبي لحل هذه المشكلة هي استخدام تابع scan، فهذا التابع سيعطيك مصفوفة تحتوي على جميع المتطابقات أو في حالة ما مررته إلى كتلة معينة (block) فإنه سيمرر كل مطابق إلى تلك الكتلة لتنفيذ الأوامر التي تريدها. في المثال الأول سيرجع روبي مصفوفة بالمطابقات أما في المثال الثاني فسيطبع كل عنصر على حدة: "hello1 hello2".scan(/(hello\d+)/) # => [["hello1"], ["hello2"]] "hello1 hello2".scan(/(hello\d+)/).each do|m| puts m end
  17. بالمعنى الدقيق للكلمة فإنه من غير الممكن إنشاء مصفوفات متعددة الأبعاد في روبي، لكنه يمكنك وضع مصفوفة في مصفوفة أخرى، والتي تشبه مصفوفة متعددة الأبعاد. يمكنك إنشاء مصفوفة ثنائية الأبعاد في لغة روبي بسهولة كما في المثال التالي: a = [[1,2,3], [4,5,6], [7,8,9]] ويمكنك أيضا استخدام Narray لإنشاء مصفوف التي تريدها: require 'narray' b = NArray[ [1,2,3], [4,5,6], [7,8,9] ] كما يمكنك استخدام تابع new من Array كما في المثال التالي: Array.new(n) {Array.new(n,default_value)} حيث ستكون القيمة التي سترجع من الكتلة قيمة كل مؤشر في السلسلة النصية الأولى.
  18. هنالك عدّة طرق في لغة بايثون لإضافة قيم معينة إلى set، وأسهلها استخدام دالة update كما في المثال التالي: keep.update(xrange(11)) أو يمكنك إنشاء القيم عن طريق حلقات التكرار كما في المثال التالي: for ...whatever...: onemorevalue = ...whatever... keep.add(onemorevalue) كما يمكنك استعمال عامل | لدمج متغيرين من نوع set (اتحاد بمفهوم set): >>> my_set = {1} >>> my_set = my_set | {2} >>> my_set {1, 2} أو يمكنك العملية عن طريق استخدام العامل |= : >>> my_set |= {2} >>> my_set {1, 2} ملاحظة: في الإصدارات ما قبل 2.7، استخدم set([...]) بدلا من {…}.
  19. هنالك طرق كثيرة في لغة بايثون للحصول على قيمة منطقية في لغة بايثون، فمثلا يمكنك استخدام دالة choice من مكتبة random حيث ستمرر لها قائمة متكونة من True و False كما في المثال التالي: random.choice([True, False]) أو يمكنك استخدام دالة getrandbits للحصول على قيمة 1 أو 0 من نوع long ومن ثم تحول هذه القيمة إلى True أو False عن طريق دالة bool كما في المثال التالي: bool(random.getrandbits(1)) كما يمكنك استخدام هذه الطريقة: from random import random True if random() > 0.5 else False
  20. هنالك عدّة حلول في لغة بايثون للتعامل مع إعادة تجربة سطور برمجية معينة بعد الاستثناء (exception)، فيمكنك على سبيل المثال وضع حلقة تكرار While True داخل حلقة التكرار الرئيسية والتي هي في حالتك حلقة for وبعد ذلك أخرج منها فقط في حالة كانت عملية تنفيذ السطور البرمجية صحيحة كما في المثال التالي: for i in range(0,100): while True: try: # do stuff except SomeSpecificException: continue break كما يمكنك وضع عدد معين من محاولات إعادة التكرار كما يظهر في المثال التالي: for i in range(100): for attempt in range(10): try: # do thing except: # perhaps reconnect, etc. else: break else: # we failed all the attempts - deal with the consequences.
  21. يمكنك تمرير نوع الترميز الذي تريد ترميز المخرجات به عند فتح الملف مع نمط فتح الملف، فمثلا قمنا في المثال التالي بترميز الملف UTF-16LE: open("data.txt", "w:UTF-16LE") ينظر روبي دائما إلى نوع ترميز السلاسل النصية التي تكتبها وسيحوّلها عند الضرورة وستجد على شبكة الإنترنت مواضيع مفصّلة حول هذا الموضوع في حالة ما أردت التعمق فيه. مثال آخر على قراءة ملف بترميز معين: file = open(url, "r:Shift_JIS")
  22. يشير هذا الرمز في لغة روبي إلى المتغيرات العامة والتي تختلف عن المتغيرات المحلية ومتغيرات المثيل (@instance variable) ومتغيرات الصنف (@@class variable)، وهي تستخدم في العادة للبحث عن الملفات الخارجية كما يقول هذا المرجع: لذلك فإن السطر التالي: $:.unshiftيشبه من ناحية عمله هذا السطر: $LOAD_PATH.unshift
  23. هنالك طرق كثيرة في لغة بايثون يمكنك عن طريقها الحصول على ناتج تنفيذ أمر معيّن في النظام (وهو عمل رموز Backticks)، فمثلا يمكنك استخدام دوال read() و popen() من مكتبة os للحصول على ناتج الأمر في متغير معين كما في المثال التالي: foo = `cat /tmp/baz` ومن الطرق الاحترافية للحصول على ناتج أمر معين هي عن طريق استخدام دوال وحدة subprocess كما في المثال التالي: import subprocess proc = subprocess.Popen(["cat", "/tmp/baz"], stdout=subprocess.PIPE) (out, err) = proc.communicate() print "program output:", outالمصدر
  24. تقريبا، يملك كلاهما نفس الوظيفة، الفارق الرئيسي بينهما أن Qthreads موجّهة للاستخدام مع PyQt لذلك فهي الأفضل في حالة استخدامها لبرمجة تطبيقات سطح المكتب مكتوبة باستخدام مكتبات Qt، ولا تنسى أنه لا يمكنك استخدام Qt من خيط بايثون لذلك سوف تضطر في هذه الحالة إلى استخدام Qthread للقيام ببعض الأعمال. وحسب نصائح محترفي PyQt فإنه من الأفضل استخدام Qthreads مع PyQt وخيوط بايثون (Python threads) مع بقية الدوال. المصدر
  25. حسب رأيي الشخصي، أن دجانغو ظهر قبل web2py بخمسة سنوات لذلك فهو يملك مستخدمين أكثر ومنتشر بشكل أوسع من بقية إطارات بايثون، بالإضافة إلى أنه يُمكنك من التحكم بتطبيقك بشكل أكبر من web2py بسبب كثرة التخصيصات. من جانب آخر فإن web2py أسهل للتعلم والفهم، فتعابيره وصياغاته أبسط بكثير من دجانغو كما تظهر في المثال التالي: db(db.tablename.fieldname <= value).select() # web2py Tablename.objects.filter(fieldname__lt=value) # Django كما أنه يوفّر عدّة مميزات غير متوفرة في دجانغو مثل التهجيرات التلقائية (automatic migrations) وغيرها. لذلك إذا أردت تعلّم إطار لبرمجة تطبيقاتك فأنصحك في هذه الحالة بتعلم web2py أما في حالة ما أردت تعلم لغة للعمل ففي هذه الحالة يجب عليك تعلم دجانغو.
×
×
  • أضف...