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

هشام رزق الله

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

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

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

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

    31

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

  1. هنالك عدّة طرق سهلة في بايثون للدوران بشكل معكوس على مجال معين، ومن أسهلها استخدام دالة range مع تمرير معامل ثالث يحسب الخطوات والتي سنجعلها -1 حتى يدور بالعكس، كالتالي 100 99 98 … كما في المثال التالي: range(100,-1,-1) كما يمكنك استخدام دالة reversed مع دالة xrange في حلقة تكرار for حيث أن دالة reversed ستقوم بعكس المجال كما يظهر في المثال التالي: for i in reversed(xrange(101)): print i, المصدر
  2. إن raise تُستخدم لإحداث استثناء على خطأ معين، وقد يُستخدم مصطلح throw بدلا منه في اللغات الأخرى. وأبسط استعمال لـ raise هي عن طريق استخدامها لإصدار أخطائك الخاصة (تصنع أسبابها بنفسك) كما في المثال التالي: if something: raise Exception('My error!') ومن الاستعمالات الأخرى لـ raise هي لإعادة إصدار الاستثناء الحالي في متعامل للاستثناء (exception handler) حتى تتمكن من التعامل منه أكثر. لتفهم قصدي أنظر إلى المثال التالي: try: generate_exception() except SomeException, e: if not can_handle(e): raise handle_exception(e)
  3. هنالك طرق متعددة في لغة روبي لتحويل سلسلة نصية مفصولة بفاصل معين (أي رمز مثل . , \ - إلخ) إلى مصفوفة أسهلها استخدام التابع المدمج split حيث تمرر له الفاصلة الموجودة في السلسلة النصية ويُرجع مصفوفة تحتوي على العناصر المفصولة كما في المثال التالي: "one,two,three,four".split(',') من الطرق السهلة الأخرى استخدام تابع parse_line من مكتبة CSV للتحويل عن طريق تمرير السلسلة النصية كما في المثال التالي: require 'csv' CSV.parse_line('one,two,three,four') #=> ["one", "two", "three", "four"]
  4. حسب رأيي أن أفضل طريقة لتعريف صنف جديد في تطبيقك هي وضعه في ملف lib/ext/string.rb ومن ثم وضع محتوياته كما في المثال التالي: class String def to_magic "magic" end end بعد ذلك وعندما تريد تحميل هذا الصنف ستحتاج إلى استدعائه في ملف config/application.rb أو في المهيئ (initializer) وبعد ذلك ستكون عملية تحميله بسيطة للغاية كما في الأمثلة التالية: require 'ext/string' الآن سيكون تابع to_magic متوفرا في أمثلة (instances) لصنف String داخل تطبيقك/الكونسول كالتالي: >> "not magic".to_magic => "magic"
  5. الكثير من مبرمجي بايثون يستخدمون pip و easy_install و virtualenv ولا يعرفون غيرها، لكن هذه الأدوات قد لا تلبي جميع متطلباتنا، فالمشكلة الأساسية فيها أن جميعها تركّز حول بايثون وتهمل اعتماديات مكتبات غير بايثونية، مثل HDF5 وMKL وLLVM التي لا تملك ملف setup.py في شيفرتها المصدرية. لذلك فإن conda هي أداة تحزيم وتثبيت تهدف إلى القيام بأعمال لا تقوم بها pip مثل التعامل مع اعتماديات المكتبات خارج أحزمة بايثون، بالإضافة إلى ذلك فإن conda تصنع بيئة افتراضية بطريقة مشابهة لـ virtualenv. ملخّص الكلام: تقوم conda بأشياء أكثر من pip لذلك تجد أن بعض البرامج يجب تثبيتها عبر conda.
  6. هنالك طرق متنوعة للحصول على "id” بعد أن تُضيف معلومات إلى قاعدة بيانات MySQL في لغة بايثون، ولكن أشهرخا استخدام دالة cursor.lastrowid والتي سترجع آخر id للسطر الذي قمت بإضافته إلى كائن المؤشر (cursor)، أو يمكنك أيضا استخدام دالة connection.insert_id() الذي سوف تُرجع id من آخر عملية إضافة تمّت في ذلك الاتصال. أمثلة على استخدام الدوال: id = cursor.lastrowid connection.insert_id()
  7. يمكنك تنظيف شاشة الطرفية بطرق متعدّدة في لغة بايثون، فعلى سبيل المثال يمكنك طباعة رمز تنظيف شاشة الطرفية كما في المثال التالي الذي يعمل على الإصدار الثالث من بايثون: print(chr(27) + "[2J") ملاحظة: قد لا يعمل المثال السابق على جميع أنواع الطرفيات. أو يمكنك ببساطة تنفيذ أمر الحذف والذي هو cls في نظام ويندوز وclear في أنظمة لينكس كما في المثال التالي الذي يجمع بين النظامين: import os os.system('cls' if os.name == 'nt' else 'clear')
  8. يمكنك استعمال طرق متعددة لدمج عدّة سلاسل نصية مع بعضها في لغة روبي، فمثلا يمكنك استخدام تابع flatten على المصفوفة التي تحتوي على بقية المصفوفات وسيُرجع لك المصفوفة النهائية كما في المثال التالي: concatenated = array_of_arrays.flatten وإذا كنت تستخدم الإصدار 1.8.7 من روبي أو أحدث فيمكنك تمرير معامل إضافي لتحديد عمق مستوى المصفوفة، وهذا يفيدك في حالة لو أردت تحديد عمق معين في داخل المصفوفة. أنظر إلى المثال التالي وستفهم قصدي: a = [ 1, 2, [3, [4, 5] ] ] a.flatten(1) #=> [1, 2, 3, [4, 5]] ومن الطرق الأخرى لدمج المصفوفة: array_of_arrays.reduce(:concat)المصدر
  9. ستجد في لغة روبي مثل العديد من لغات البرمجة الأخرى (كالبايثون) طرق لا نهائية لترميز ملف بترميز معين، فأي تعليق في السطر الأول من ملف المصدري لتطبيق روبي يحتوي على coding: سوف يُفعّل الترميز بدون مشاكل. اقتباس من موقع grayproductions.net: إن أفضل طريق لترميز شيفرتك البرمجية هي ما يسمى بالتعليق السحري، فإذا كان السطر الأول من التعليق يحتوي على كلمة coding متبوعا بنقطتين و فراغ ومن ثم اسم ترميز معين فإن ترميز الملف المصدري الذي يحتوي على هذا السطر سيتحول إلى ذلك الترميز. بعض الأمثلة: # coding: UTF-8 # encoding: UTF-8 # zencoding: UTF-8 # vocoding: UTF-8 # fun coding: UTF-8 # decoding: UTF-8 # 863280148705622662 coding: UTF-8 0072364213
  10. في إصدارات بايثون ما قبل الإصدار الثالث يوجد نوعين من السلاسل النصية وهما plain strings وunicode strings. إن السلسلة النصية من نوع plain strings (str) لا يمكنها استعراض حروف من خارج الأبجدية اللاتينية في حين أن السلسلة النصية من نوع Unicode strings (unicode) يمكنها استعراض حروف من أي أبجدية والتي من بينها لغات وأبجديات خيالية مثل Klingon. هذا هو التسلسل الهرمي للسلاسل النصية في إصدارات بايثون ما قبل الإصدار 3: object | | basestring / \ / \ str unicode لذلك في حالات مقارنة سلسلتين نصيتين عادية وunicode ستظهر عدة فروقات كما في المثال التالي: >>> string1 = "I am a plain string" >>> string2 = u"I am a unicode string" >>> isinstance(string1, str) True >>> isinstance(string2, str) False >>> isinstance(string1, unicode) False >>> isinstance(string2, unicode) True >>> isinstance(string1, basestring) True >>> isinstance(string2, basestring) True
  11. تستخدم الإصدارات القديمة للبايثون (مثل الإصدار الثاني) ترميز آسكي كترميز افتراضي لملفات المصدر، وهذا يعني أنه يجب عليك في هذه الحالة تغيير الترميز في أعلى الملف حتى تستطيع استخدام حروف غير آسكي في ملفك. أما في الإصدار الثالث للبايثون فلقد تم حل هذه المشكلة عن طريق استخدام ترميز utf-8 كترميز افتراضي لملفات المصدر. لتفعيل ترميز utf-8 في ملفات المصدر لمشروعك بلغة بايثون أضف هذا السطر في أول أو ثاني سطر من ملف المصدر: # -*- coding: utf-8 -*-
  12. يُعتبر هذا الخطأ من الأخطاء الشائعة في لغة بايثون، فالمشكلة الأساسية هي أنك تدور داخل السلسلة وفي نفس الوقت تُغير ترتيب أحرفها عن طريق حذف أحرف العلة، والنتيجة ستكون كما قلتَ أخطاء في التكرار في السلسلة النصية. ولذلك لحل هذه المشكلة أنصحك أولا بإنشاء نسخة من القائمة حتى لا تحذف العناصر التي تدور عليها حلقة التكرار، كما في المثال التالي: for char in textlist[:]: #shallow copy of the list # etc ويمكنك أيضا الاستغناء عن حلقة التكرار لحذف حروف العلة عن طريق استعمال دالة translate() كما تظهر في المثال التالي: vowels = 'aeiou' vowels += vowels.upper() text.translate(None, vowels) المصدر
  13. هنالك طريقتين لمعرفة ما إذا كانت عملية معينة موجودة من روبي أما لا، وهي عن طريق استخدام توابع Process.getpgid وprocess::kill. الفرق بين التابعين هو ماذا سيحدث عندما يكون pid معيّن موجود لكنه مملوك بواسطة مستخدم آخر، فتابع Process.getpgid سيرجع لك إجابة في حين أن تابع Process::kill سيرجع لك استثناء. لذلك أنا أنصحك باستخدام Process.getpgid للتأكد من عمل عملية معينة في روبي كما في المثال التالي: begin Process.getpgid( pid ) true rescue Errno::ESRCH false end
  14. نعم يمكنك أن تقول ذلك، فالروبي تعمل داخل مترجم مبني على لغة السي في حين أن Jruby تعمل داخل آلة الافتراضية للجافا، وهنالك الكثير من gems والإضافات التي قد لا تعمل داخل Jruby خاصة تلك التي لها ملحقات مكتوبة بلغة سي، إلا لو تمّت إعادة كتابتهم للعمل في جافا. الفرق الأهم يأتي عندما تريد نشر تطبيقك، فإذا أردت نشر إلى خادم ويب جافا ففي هذه الحالة سيكون Jruby هو خيارك الأفضل لبرمجة تطبيقك وخلافا لذلك -في أغلب بقية الحالات- فأنصحك باستخدام روبي.
  15. أسهل طريقة لتنسيق الأرقام في قالب دجانغو حسب الطريقة التي ذكرتها هي استخدام humanize كما في المثال التالي: {% load humanize %} {{ my_num|intcomma }} لتعمل الأسطر في الأعلى تأكد من إضافة 'django.contrib.humanize' إلى قائمة INSTALLED_APPS في ملف settings.py. هنالك حل آخر مع إضافة رقمين بعد الفاصل بالإضافة إلى علامة دولار (الطريقة بالأساس موجهة إلى الأموال والأسعار): from django.contrib.humanize.templatetags.humanize import intcomma def currency(dollars): dollars = round(float(dollars), 2) return "$%s%s" % (intcomma(int(dollars)), ("%0.2f" % dollars)[-3:])وبعد ذلك يمكنك استدعاء الدالة التي صنعتها بسهولة كما في المثال التالي: {{my_dollars | currency}}
  16. هنالك عدّة أسباب لجعل النهاية في دالة المدى أقل بواحد من المجال الموجود، وأهمها شيوع كتابة range(0, 10) والتي سترجع القائمة التالية [0,1,2,3,4,5,6,7,8,9] الحاوية على 10 عناصر وهي توافق len(range(0, 10)). تذكّر أن المبرمجين يفضلون استخدام الفهرسة التي يكون فيها أول عنصر هو 0. أي أن إذا كان المعامل الأول صفر فالمعامل الثاني سيكون طول هذه القائمة. في حالة ما أردت أن يكون المجال بين 1 وأي رقم تريده (يكون ضمن المجال) فيمكنك في هذه الحالة إنشاء دالتك الخاصة كما في المثال التالي: >>> range1 = lambda start, end: range(start, end+1) >>> range1(1, 10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  17. هنالك طرق مختلف لمقارنة نوع كائن معين في بايثون، فيمكنك على سبيل المثال استخدام دالة isinstance حيث ستمرر لها في المرة الأولى الكائن الذي تريد مقارنته ومن ثم تمرر لها النوع الذي تريد مقارنته وبعد ذلك سترجع لك الدالة true إذا نوع الكائن والنوع المقدم متطابقان والعكس صحيح كما في المثال التالي: isinstance("this is a string", str) وستكون النتيجة: True ويمكنك أيضا استخدام دالة type مع العامل is للمقارنة كما في الأمثلة التالية وهذه الطريقة أسهل عند القراءة من الطريقة الأولى: type(9) is int type(2.5) is float type('x') is str type(u'x') is unicode
  18. في الحقيقة ليس لهذه الرموز معنى رسمي في لغة روبي، لكن أغلب المبرمجين المحترفين يستخدمون الرمز ! للتحذير بأن التابع سيقوم بتغييرات دائمة أو أن هنالك احتمالية لخطر معين أثناء الاستخدام مثل تابع Enumerable#sort! أما بالنسبة إلى رمز ? فيُستخدم للتعبير عن التوابع التي سترجع قيمة صحيحة والتي ستجعل الشيفرة البرمجية قابلة للقراءة بشكل أفضل، فمثلا هذا السطر if number.zero? ستتم قراءته كـ if the number is zero وبهذا سيتمكن مبرمجو اللغات الأخرى من فهم السطر بشكل أفضل.
  19. هنالك طرق متعددة لقراءة السطر الأول فقط من ملف معين في روبي، فمثلا يمكنك استخدام تابع readline مع تابع فتح الملفات open كما في المثال التالي: File.open('somefile.txt') {|f| f.readline} أو يمكنك كتابة هذا السطر في حالة استخدامك الإصدار 1.8.7 من روبي أو إصدار أحدث منه: File.open('somefile.txt', &:readline) أما إذا أردت طريقة أفضل تفتح الملف لقراءة لسطر الأول ومن ثم تغلقه بشكل تلقائي فيمكنك استخدام تابع gets: File.open('path.txt', &:gets) ومن الطرق المفيدة أيضا: File.foreach('path_to_file').first
  20. هنالك عدّة طرق لفرز المصفوفات في numpy حسب عمود معين في بايثون، فمثلا يمكننك استخدام دالة view() مع دوال sort وغيرها لترتيب المصفوفة حسب المطلوب كما في المثال التالي: In [1]: import numpy as np In [2]: a = np.array([[1,2,3],[4,5,6],[0,0,1]]) In [3]: np.sort(a.view('i8,i8,i8'), order=['f1'], axis=0).view(np.int) Out[3]: array([[0, 0, 1], [1, 2, 3], [4, 5, 6]])أو يمكنك القيام بذلك بطريقة أقصر عن طريق استخدام دالة argsort: a[a[:,1].argsort()] ومن الطرق المفيدة أيضا، استخدام دالة sorted() مع جعل المفاتح دالة lambda كما تظهر في المثال التالي: a = ([[1,2,3],[4,5,6],[0,0,1]]); a = sorted(a, key=lambda a_entry: a_entry[1]) print a وسيكون الناتج: [[[0, 0, 1], [1, 2, 3], [4, 5, 6]]]المصدر
  21. تم إضافة نوع بيانات جديد لتخزين بيانات النصوص في الإصدار الثاني من بايثون وهو كائن unicode والذي يمكنك استخدامه لتخزن بيانات Unicode والتعامل معها، وتم جعله متكاملًا مع كائنات السلسلة النصية الموجودة حتى تتمكن من التحويل عند الضرورة. أما في الإصدار الثالث للبايثون فلقد أصبحت السلاسل النصية تستخدم Unicode بشكل افتراضي لذلك لن تعد هنالك أية حاجة إلى u للتعبير عنها. المصدر
  22. هنالك عدّة طرق يمكنك من خلالها ترتيب سلسلة unicode النصية، لكن حسب رأيي فأفضلها استخدام مكتبة ICU التابعة لـ IBM، والتي تسمى نسختها في بايثون بـ PyICU. ملاحظة: الفرق الرئيسي بين ICU و دالة locale.strcoll هو أن الأولى تستخدم Unicode Collation Algorithm بينما الثانية تستخدم ISO 14651. هذا مثال بسيط لاستخدام مكتبة icu (التي يجب أن تُثبتها أولا) لفرز سلسلة نصية معينة: >>> import icu # pip install PyICU >>> sorted(['a','b','c','ä']) ['a', 'b', 'c', 'ä'] >>> collator = icu.Collator.createInstance(icu.Locale('de_DE.UTF-8')) >>> sorted(['a','b','c','ä'], key=collator.getSortKey) ['a', 'ä', 'b', 'c']
  23. هنالك فرق بسيط بين هاتين الطريقتين في التكرار في روبي فـ each تأخذ المصفوفة وتطبّق عليها الكتلة المقدمة لها على جميع العناصر دون أن تنشئ أي كائن جديد، فهي فقط تكرر على العناصر ومن ثم تُرجع نفسها. أما بالنسبة إلى collect فهي تشبه map كثيرا وتطبّق الكتلة المقدمة التي تحتوي على الأوامر على جميع عناصر المصفوفة ومن ثم تُرجع مصفوفة جديدة. لتفهم بشكل أفضل أنظر للمثال التالي: a = ["L","Z","J"].collect{|x| puts x.succ} #=> M AA K بعد تنفيذ هذا السطر ستبقى a مصفوفة لكنها ستحتوي على [nil,nil,nil] على الرغم من أنها طبعت المطلوب. أما في هذا المثال: b = ["L","Z","J"].each{|x| puts x.succ} #=> M AA K فستحتفظ b بقيمتها الابتدائية.
  24. هنالك عدّة طرق لحساب عدد التواريخ الفريدة داخل سجل معين، فمثلا يمكنك فعل ذلك مباشرة عن طريق SQL باستخدام DISTINCT لتحديد التواريخ الفريدة وCOUT لحساب عددها كما في المثال التالي: SELECT COUNT(DISTINCT date) FROM records أما في ريلز، فهنالك طريقتين لفعل ذلك حسب الإصدار الذي تستخدمه، فإذا كنت تستخدم إصدار قديم (أصغر من 4) فيمكنك استخدام تابع count مع :distinct => true كما في المثال التالي: Record.count('date', :distinct => true) أما في الإصدار الرابع لريلز فيمكنك استخدام تابع distinct مع تابع count كما في المثال التالي: Record.distinct.count('date')
  25. يمكنك ببساطة استخدام دالة split للفصل بين محتويات السلسلة النصية، وهذا هو تعريف هذه الدالة من التوثيق الرسمي للبايثون: ولذلك لفصل السلسلة النصية حسب أول ظهور لكلمة mango سوف نستخدم الشيفرة التالية، لاحظ أننا استخدمنا [1] وذلك للحصول على الجزء الثاني من عملية الفصل (حذف الأحرف ما قبل الكلمة): s.split('mango', 1)[1]
×
×
  • أضف...