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

هشام رزق الله

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

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

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

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

    31

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

  1. حدثت في الإصدار 3 من بايثون العديد من التغييرات والتي جعلت من بايثون أكثر منطقية من الناحية البرمجية، ومن بين هذه التغييرات تم تغيير اسم تابع g.next() إلى g.__next__() كي يتطابق مع بقية التوابع الخاصة مثل __init__() و __del__ والتي تمتلك جميعها خطوط سفلية وكانت next() هي الاستثناء الوحيد لهذه القاعدة وتم إصلاح ذلك في الإصدار 3 من بايثون. وكنصيحة، استخدم في الإصدار 3 من بايثون next(g) بدلا من g.__next__()
  2. يمكنك استخدام دالة حلقة التكرار map بالإضافة إلى تابع التحويل إلى السلسلة النصية to_s كالتالي للتحويل: str_array = int_array.map(&:to_s) كما يمكنك استخدام نفس التوابع لكن بطريقة أخرى كالتالي: int_array = [1, 2, 3] str_array = int_array.map { |i| i.to_s } => str_array = ['1', '2', '3']أيضا استخدام تابع حلقة التكرار collect وتابع to_s للتحويل إلى سلسلة نصية يعطينا نفس النتيجة كما في المثال التالي: str_array = int_array.collect{|i| i.to_s}
  3. يمكنك استخدام وحدة FileUtils بطرق مختلف لنقل الملفات بسطر واحد فقط. الطريقة الأبسط هي باستعمال تابع cp_r وإضافة /. إلى نهاية معامل مجلد المصدر كما في المثال التالي: FileUtils.cp_r 'src/.', 'dest' أو يمكنك استخدام نفس التابع بطريقة مختلف لنقل الملفات وذلك عن طريق استخدام رمز /* كما في المثال التالي: FileUtils.cp_r(Dir['A/*'],'B') من الطرق الأخرى أيضا: FileUtils.cp_r(Dir.glob('A/*'), 'B')
  4. أزرار ctrl و c سينهيان الخيط (thread) الرئيسي فقط لأن الخيوط الموجودة في تطبيقك ليست موجودة في وضع العفريت (daemon mode) لذلك ستبقى تعمل، وهذا ما يوجب جعل قيمة daemon تساوي True كما في المثال التالي: f = FirstThread() f.daemon = True f.start() s = SecondThread() s.daemon = True s.start() وبهذا ستتمكن من إنهاء كامل السكربت عن طريق الضغط على أزرار Ctrl و c كالمعتاد.
  5. هنالك عدّة طرق في لغة بايثون يمكنك من خلالها طباعة القوائم على شكل جداول، فعلى سبيل المثال يمكن استخدام هذه الطريقة والتي ستنشئ الجدول المطلوب: row_format ="{:>15}" * (len(teams_list) + 1) print row_format.format("", *teams_list) for team, row in zip(teams_list, data): print row_format.format(team, *row) كما يمكنك استخدام حزم خارجية لإنشاء الجداول بسهولة أكبر، باستخدام حزمة tabulate كما في المثال التالي: >>> from tabulate import tabulate >>> print tabulate([['Alice', 24], ['Bob', 19]], headers=['Name', 'Age']) Name Age ------ ----- Alice 24 Bob 19 أو يمكنك استخدام حزمة PrettyTable على الرغم من أنها أعقد قليلا من الأولى، إلا أن هذه الحزمة تنشئ الجدول بطريقة أجمل كما في المثال التالي: >>> from prettytable import PrettyTable >>> t = PrettyTable(['Name', 'Age']) >>> t.add_row(['Alice', 24]) >>> t.add_row(['Bob', 19]) >>> print t +-------+-----+ | Name | Age | +-------+-----+ | Alice | 24 | | Bob | 19 | +-------+-----+
  6. الحل لهذه المشكلة هي عن طريق وضع رمز الخط الأوسط "-”في بداية check_in للإشارة إلى أن الترتيب تنازلي حيث القيمة الافتراضية للترتيب تصاعدية كما في المثال التالي: Reserved.objects.filter(client=client_id).order_by('-check_in') ملاحظة: لا يجب إضافة all() قبل filter()، فهذا سيعمل حتى لو لم تضيفه لكنك ستحتاج إلى all() عندما تريد أن تحصل على جميع الكائنات من جذر QuerySet. للمزيد من المعلومات حول هذا الموضوع قُم بزيارة التوثيق الرسمي.
  7. يمكنك تحويل حالة الأحرف غير الإنجليزية في سلسلة نصية بعدّة طرق في لغة روبي باستخدام توابع to_s و downcase و mb_chars للتحويل إلى حالة الأحرف الصغيرة كما يظهر في المثال التالي الذي استخدمنا فيه الأبجدية الروسية: str = "Привет" str.mb_chars.downcase.to_s #=> "привет" من الطرق الأخرى استخدام gem unicode_utils فهذا gem يمتلك تابع downcase والذي يتعامل مع جميع الأبجديات كما يظهر في المثال التالي: UnicodeUtils.downcase('Привет') #=> 'привет'
  8. هنالك طريقين مختلفتين يمكنك من خلالها تعديل gem في لغة روبي، الطريقة الأولى باستخدام gem unpack لفك الحزمة عن ملف gem ومن ثم تضيف التعديلات التي تريدها ثم تجعلها على ملف gemspec إذا كان الأمر ضروريا ومن ثم تعيد بناء الحزمة مرة أخرى عن طريق gem build. أما الطريقة الثانية فهي بتحميل الشيفرة البرمجية للملف إلى مجلد منفصل (مثلا github) وبعد ذلك تعدل على Gemfile للإشارة إلى المصدر مباشرة حتى تتمكن من تعديلها وتجربة التغييرات مباشرة. فعلى سبيل المثال، فلو فرضنا أنك تريد تعديل secure_headers gem وقد قمت بنسخه (clone) إلى ~/workspace/secureheaders فيمكنك في هذه الحالة استخدام السطر التالي في Gemfile: gem 'secure_headers', :path => "~/workspace/secureheaders" بعد ذلك، قم بتعديل ملفات المصدر داخل شجرة المصدر وستتمكن من رؤية التغييرات المطبقة مباشرة.
  9. هنالك العديد من الطرق في بايثون للحصول على ما إذا كان الموقع يرجع خطأ من نوع 404 أو 200 عن طريق وحدة urllib، فيمكنك على سبيل المثال استخدام تابع getcode() (تمت إضافته إلى بايثون 2.6) والذي يرجع رمز حالة HTTP التي تم إرسالها مع الإجابة أو None في حال كان الرابط ليس من نوع HTTP URL كما في المثال التالي: >>> a=urllib.urlopen('http://www.google.com/asdfsf') >>> a.getcode() 404 >>> a=urllib.urlopen('http://www.google.com/') >>> a.getcode() 200 كما يمكنك استخدام الإصدار الثاني من urllib لفعل ذلك أيضا كما في المثال التالي: import urllib2 req = urllib2.Request('http://www.python.org/fish.html') try: resp = urllib2.urlopen(req) except urllib2.HTTPError as e: if e.code == 404: # do something... else: # ... except urllib2.URLError as e: # Not an HTTP-specific error (e.g. connection refused) # ... else: # 200 body = resp.read()
  10. هنالك العديد من الطرق في بايثون يمكنك من خلالها تشغيل البرامج للقيام بوظائف محددة، وطريقة os.system غير منصوح بها، فهذه الطريقة تفيد في حالات الأوامر السريعة للنظام وليس لتشغيل برنامج كامل يقوم بعمليات متنوعة، ولذلك أنصحك باستخدام وحدةsubprocess فهي أكثر مرونة وأفضل عند الاستخدام من os.system، وكمثال على استخدام هذه وحدة يمكنك تشغيل أمر ls -l عليها عن طريق السطور التالية: import subprocess subprocess.check_output(['ls', '-l'])
  11. يمكنك استخدام متغيرين date1 وdate2 اللذان يحتويان على مدى الوقت بالإضافة إلى تابع rand للعشوائيات وستحصل في النهاية على كائن الوقت المطلوب كما في المثال التالي: Time.at((date2.to_f - date1.to_f)*rand + date1.to_f) أو يمكنك استعمال طريقة أخرى أبسط عن طريق استخدام تابع rand مباشرةً وتمرر له التاريخين كما في المثال التالي: now = Time.now a_day_ago = now - 60 * 60 * 24 random_time = rand(a_day_ago..now) # with activesupport required up_to_a_year_ago = rand(1.year.ago..Time.now)
  12. هنالك العديد من الطرق في لغة روبي (أو تحديدا في ريلز) لكتابة شيفرة برمجية بلغة HTML داخل الأزرار، والطريق الأفضل استخدام button_tag حيث نمرر له نوع الزر والصنف ومن ثم نكتب الشيفرة البرمجية التي نريدها ثم ننهي الوسم عن طريق <% end %> كما في المثال التالي: <%= button_tag(type: 'submit', class: "btn btn-primary") do %> <i class="icon-ok icon-white"></i> Save <% end %> وفي simple_form 3.0rc يمكنك استخدام نوع زر :button فهو يمرر الكتلة الخاصة بك إلى مساعد زر ActiveView الأصلي كما في المثال التالي: <%= f.button :button do %> <i class="icon-save"></i> Commit <% end %>
  13. يمكنك استخدام دالة unpack من وحدة struct حيث ستمرر لها "<L" كمعامل أول و السلسلة النصية كمعامل ثاني ومن ثم يجب عليك الحصول على العنصر الأول من المصفوفة عن طريق [0] كما في المثال التالي: >>> struct.unpack("<L", "y\xcc\xa6\xbb")[0] 3148270713L أما لو كنت تستخدم الإصدار 3.2 من بايثون أو أحدث، فيمكنك استخدام دالة int.from_bytes كما في المثال التالي: >>> int.from_bytes(b'y\xcc\xa6\xbb', byteorder='big') 2043455163
  14. برأيي فإن أفضل طريقة لصياغة قاموس متعدد الأسطر في لغة بايثون هي أن تجعل كافة مفاتيح القاموس موجودة في أسطر متعدد وجعل المعقفين بمفرديهما، لأن هذه الطريقة تفيد في حالات السلاسل الطويلة وtuples، إذ لا تتطلب إضافة أية مساحات أخرى بعد مسافة البادئة كما تظهر في الأمثلة التالية: mydict = { "key1": 1, "key2": 2, "key3": 3, } mylist = [ (1, 'hello'), (2, 'world'), ] nested = { a: [ (1, 'a'), (2, 'b'), ], b: [ (3, 'c'), (4, 'd'), ], }وهذه هي طريقتي المفضلة لتضمين سلاسل نصية كبيرة بدون إضافة أية مساحات: data = ( "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABG" "l0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEN" "xBRpFYmctaKCfwrBSCrRLuL3iEW6+EEUG8XvIVjYWNgJdhFjIX" "rz6pKtPB5e5rmq7tmxk+hqO34e1or0yXTGrj9sXGs1Ib73efh1" "AAAABJRU5ErkJggg==" )
  15. هنالك عدة خيارات أخرى بدلا من pygame يمكنك استخدامها لتشغيل الملفات الصوتية عن طريق بايثون، فيمكنك مثلا استخدام أداة Snack Sound لتشغيل ملفات mp3 و wav وتعمل على عدة أنظمة تشغيل إذ تقرأ الملف الصوتي عن طريق دالة read() ومن ثم تشغيله عن طريق دالة play() كما في المثال التالي: s = Sound() s.read('sound.wav') s.play() في نظام ويندوز يمكنك استخدام مكتبة winsound كما في المثال التالي: import winsound, sys def beep(sound): winsound.PlaySound('%s.wav' % sound, winsound.SND_FILENAME) if __name__ == '__main__': beep(sys.argv[1])ويمكنك استخدام ossaudiodev في لينكس كما في المثال التالي: from wave import open as waveOpen from ossaudiodev import open as ossOpen s = waveOpen('tada.wav','rb') (nc,sw,fr,nf,comptype, compname) = s.getparams( ) dsp = ossOpen('/dev/dsp','w') try: from ossaudiodev import AFMT_S16_NE except ImportError: if byteorder == "little": AFMT_S16_NE = ossaudiodev.AFMT_S16_LE else: AFMT_S16_NE = ossaudiodev.AFMT_S16_BE dsp.setparameters(AFMT_S16_NE, nc, fr) data = s.readframes(nf) s.close() dsp.write(data) dsp.close()
  16. هنالك العديد من الطرق في روبي لمعرفة ما إذا كانت عناصر المصفوفة متشابهة أو لا، فيمكنك على سبيل المثال استخدام دالة uniq لحذف لتكرارات من المصفوفة ودالة length لمعرفة الطول الجديد لهذه المصفوفة، فإذا كان الناتج 1 فهذا يعني أن المصفوفة تملك نفس العناصر وسيتم إرجاع true وخلافا لذلك سيتم إرجاع false كما في المثال التالي: class Array def same_values? self.uniq.length == 1 end end [1, 1, 1, 1].same_values? [1, 2, 3, 4].same_values?ملاحظة: سيتم إرجاع false في حالة كانت المصفوفة فارغة فإذا لم ترغب بذلك فيمكنك تغيير <= 1 وسيتم إرجاع true.
  17. في ريلز لدينا الكثير من الطرق للحصول على اسم الشهر وتعتمد كلها على الصيغة تاريخ اليوم، فمثلا يمكنك استخدام الدالة strftime وتمرير"%B” لها في حالة كان التاريخ بالصيغة التالية: @date >> Fri, 11 Jun 2010 أي للحصول على اسم الشهر يمكنك كتابة الدالة strftime كما في المثال التالي وسيتم استخراج الشهر من كائن @date والذي يحتوي على تاريخ اليوم كما في المثال التالي: <% @date = Date.today %> <%= @date.strftime("%B")%>
  18. نعم هذا ممكن في بايثون، بل إن هنالك العديد من الطرق لتحويل السلسلة النصية إلى timestamp فيمكنك على سبيل المثال استعمال مكتبة time و datetime ودوال mktime وdatetime.strptime وtimetuple للتحويل بسطر واحد فقط كما في المثال التالي: >>> import time >>> import datetime >>> s = "01/12/2011" >>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple()) 1322697600.0 ويمكنك أيضا استخدام دالة int لحذف الفاصل ولتكون النتيجة أوضح كما في المثال التالي: >>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s")) 1322683200
  19. هنالك العديد من الطرق في بايثون للحصول على عنوان ماك للجهاز، بعضها معقد والآخر بسيط كاستخدام الدالة getnode من مكتبة uuid حيث سترجع لنا عنوان ماك بطول عدد صحيح 48 بت كما في المثال التالي: from uuid import getnode as get_mac mac = get_mac() أما الطريقة الصحيحة لأخذ عنوان ماك على أنظمة لينكس فهي الحصول عليه من واجهة محلية خاصة كما في المثال التالي: #!/usr/bin/python import fcntl, socket, struct def getHwAddr(ifname): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', ifname[:15])) return ':'.join(['%02x' % ord(char) for char in info[18:24]]) print getHwAddr('eth0')
  20. هنالك العديد من الطرق في بايثون يمكنك من خلالها عمل ping لموقع معين، وأسهلها استدعاء مكتبة ping واستخدام دوال verbose_ping و Ping.do وتمرير الخيارات الضرورية (عدد مرات، الوقت...) لعمل ping كما في المثال التالي: import ping, socket try: ping.verbose_ping('www.google.com', count=3) delay = ping.Ping('www.wikipedia.org', timeout=2000).do() except socket.error, e: print "Ping Error:", e أو يمكنك استخدام وحدة subprocess للقيام بـ ping حيث سنستخدم أمر ping الخاص بالنظام كما في المثال التالي: import subprocess host = "www.google.com" ping = subprocess.Popen( ["ping", "-c", "4", host], stdout = subprocess.PIPE, stderr = subprocess.PIPE ) out, error = ping.communicate() print outملاحظة: يختلف هذا الأمر من نظام لآخر.
  21. هنالك العديد من الطرق التي يمكنك استخدامها لفصل السلاسل النصية حسب فاصل معين (مثل أول مسافة في مثالك)، وأسهلها استخدام تابع split() المدمج والذي يفصل حسب فاصل معين، وسنمرر له بالإضافة إلى الفاصل الحد الأعلى للفصل أي عدد أجزاء التي يمكننا فصلها وسنجعلها 2 فقط كما في المثال التالي: str.split(' ', 2) كما يمكنك استخدام عدة توابع مثل match و pre_match و post_match للحصول على ما تريده كما في المثال التالي: first= s.match(" ").pre_match rest = s.match(" ").post_match
  22. هنالك طرق عديدة في لغة روبي للخروج من حلقة تكرار each فيمكنك على سبيل المثال استخدام do و end في تعريف حلقة التكرار ومن ثم وضع شرط الخروج باستخدام break والجملة الشرطية if كما في المثال التالي: c = 0 items.each do |i| puts i.to_s break if c > 9 c += 1 end أو يمكنك اختصار السطور السابقة إلى التالي: items.each_with_index do |i, c| puts i.to_s break if c > 9 end أو يمكنك أيضا اختصارها إلى سطر واحد فقط وذلك عن طريق استخدام take حيث ستأخذ أول 10 عناصر فقط: items.take(10).each { |i| puts i.to_s }ملاحظة: لا يوجد عامل ++ في روبي ويمكنك كتابة c += 1 بدلا من ذلك.
  23. هنالك الكثير من الحلول في دجانغو للتحكم في عرض حقل الحروف والنصوص، لكن الطريقة الرسمية والصحيحة لفعل ذلك هي عن طريق استخدام ModelAdmin.formfield_overrides وهذه الطريقة سهلة للغاية فيكفي أن تُعرّف في admin.py العرض المطلوب لحقل الحروف CharField عن طريق سمة size وحقل النصوص TextField عن طريق سمات الأعمدة والصفوف rows و cols كما في المثال التالي: class YourModelAdmin(admin.ModelAdmin): formfield_overrides = { models.CharField: {'widget': TextInput(attrs={'size':'20'})}, models.TextField: {'widget': Textarea(attrs={'rows':4, 'cols':40})}, } admin.site.register(YourModel, YourModelAdmin)لا تنس أنه يجب عليك استدعاء الأصناف الصحيحة، ففي المثال السابق سيكون الاستدعاء كالتالي: from django.forms import TextInput, Textarea from django.db import models
  24. هنالك عدّة طرق في بايثون تُمكنك من الحصول على عمر الشخص من خلال تاريخ اليوم وتاريخ ولادة ذلك الشخص، فيمكنك على سبيل المثال إذا أخذت بعين الاعتبار أن int(True) يساوي 1 و int(False) يساوي 0 كتابة أسطر مشابهة لهذه: from datetime import date days_in_year = 365.2425 age = int((date.today() - birth_date).days / days_in_year)في بايثون 3، يمكنك استخدام القسمة على دالة timedelta من مكتبة datetime كما في المثال التالي: from datetime import date, timedelta age = (date.today() - birth_date) // timedelta(days=365.2425)ومن الطرق الأخرى للحصول على العمر يمكنك استخدام هذه (والتي أعتبرها الأفضل): from datetime import date def calculate_age(born): today = date.today() return today.year - born.year - ((today.month, today.day) < (born.month, born.day))
  25. هنالك عدّة طرق لتفعيل وتعطيل تسجيل الكونسول في لغة بايثون، وهذه الطرق تتباين من ناحية آلية عملها فيمكنك على سبيل المثال استخدام متغير propagate وجعله False حيث سيمنع هذا إرسال التسجيلات إلى السجلات الأعلى والتي تتضمن تسجيلات الكونسول كما في المثال التالي: logger = logging.getLogger('my-logger') logger.propagate = False # now if you use logger it will not log to console. أو يمكنك تعطيل خاصية disabled لدالة getlogger() من وحدة logging وجعلها true لتعطيل التسجيل وfalse لتفعيله مرة أخرى كما في المثال التالي: logger = logging.getLogger() logger.disabled = True ... whatever you want ... logger.disabled = False
×
×
  • أضف...