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

هشام رزق الله

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

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

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

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

    31

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

  1. يوجد في روبي الكثير من الطرق لفعل ذلك، فيمكنك مثلا استخدام reject وحدها والتي سترجع لك في هذه الحالة مصفوفة جديدة خاليا من العناصر التي حققت شرط الحذف كما في المثال التالي: new_array = array.reject {|x| x < 3} أو يمكنك أيضا استخدام reject! لحذف العناصر مباشرة في المصفوفة كما في المثال التالي: array.reject! {|x| x < 3} ويمكنك كذلك القيام بعملية عكسية، فبدلا من حذف العناصر القديمة التي تحقق شرط الحذف يمكنك إنشاء مصفوفة جديدة تحتوي على العناصر التي تحقق شرط البقاء (عكس شرط الحذف) عن طريق استخدام select كما في المثال التالي: new_array = array.select {|x| x >= 3}
  2. نعم يوجد فرق بسيط بين استخدام del وremove وpop لحذف العناصر، وستلحظ الفرق عند تجربة قائمة أطول وتحتوي على عناصر متكررة، فمثلا remove سيحذف أول قيمة مطابقة فقط (وليس موقع معين) كما يظهر في المثال التالي: >>> a = [0, 2, 2, 3] >>> a.remove(2) >>> a [0, 2, 3] أما del فيتم استخدامها لحذف قيمة موقع معين كما في المثال التالي: >>> a = [3, 2, 2, 1] >>> del a[1] [3, 2, 1] وبالنسبة إلى pop فهي تحذف العنصر الذي مرّرت موقعه كما ترجع لك العنصر المحذوف كما تظهر في المثال التالي: >>> a = [4, 3, 5] >>> a.pop(1) 3 >>> a [4, 5]
  3. يوجد في بايثون عدة طرق لتنفيذ ما تريده، فالكوكيز هو مجرد رئسية HTTP (HTTP header) أي يمكنك التعامل معها باستخدام دوال HTTP مثل addheaders.append وغيرها كما في المثال التالي: import urllib2 opener = urllib2.build_opener() opener.addheaders.append(('Cookie', 'cookiename=cookievalue')) f = opener.open("http://example.com/") للمزيد من المعلومات حول كيفية إضافة رؤوس HTTP إلى طلبك أنصحك بالإطلاع على هذه الأمثلة. ويمكنك أيضا استخدام طرق أخرى لا تعتمد على urllib2 للتعامل مع الكوكيز كاستخدام وحدة cookielib وغيرها.
  4. يوجد في بايثون العديد من الطرق لفعل ذلك، كاستخدام دالة enumerate مع حلقة التكرار for للدوران حول عناصر الحلقة وسنضيف إليها الجملة الشرطية if للتأكد من رقم العنصر ما إذا كان مطابق للرقم الذي نبحث عنه، فإذا تطابق سيتم إرجاع موقعه كالتالي: [i for i, v in enumerate(L) if v[0] == 53] ويمكنك استخدام طريقة أخرى أبسط وهي تعتمد على استخراج أرقام كل عنصر ووضعهم في قائمة ومن ثم البحث داخل القائمة الجديدة التي تحتوي على أرقام فقط عن موقع الرقم المطابق باستخدام دالة index() كما يظهر في المثال التالي: >>> a = [(1,"juca"),(22,"james"),(53,"xuxa"),(44,"delicia")] >>> [x[0] for x in a] [1, 22, 53, 44] >>> [x[0] for x in a].index(53) 2
  5. يوجد العديد من الطرق في روبي لفعل ذلك، إذ يمكنك على سبيل المثال استخدام دالة grep مع دالة فتح الملف ومن ثم تمرر السلسلة النصية المراد البحث عنها بعد أن تضعها بين خطين مائلين كما يظهر في المثال التالي: open('some.txt').grep(/string/) أو يمكنك فعل نفس الأمر مع دالة read حيث سننفذ دالة معين (دالة whatever في مثالنا) في حالة وجود هذه السلسلة النصية كما في المثال التالي: whatever(x) if File.read("file.txt") =~ /regex/
  6. إن then هي تعليمة مُحدِدة تساعد روبي على تعريف الشرط والجزء الصحيح من التعبير حسب الصياغة التالية: if الشرط then الجزء الصحيح else الجزء الخاطئ endأما استعمال then من عدمه فهي مسألة اختيارية تختلف حسب المبرمج، فبعض المبرمجين يضعونها والبعض الآخر لا، لكن يجب وضع then فقط في حالة كتابة تعبير if في سطر واحد كما يظهر في المثالين التاليين: # can't use newline as delimiter, need keywords puts if (val == 1) then '1' else 'Not 1' end # can use newline as delimiter puts if (val == 1) '1' else 'Not 1' end
  7. يمكنك فعل ذلك بطرق متعددة في لغة بايثون، لكن في أغلب الأحيان لا يجب عليك استخدام التعابير النمطية من أجل فعل ذلك، فمثلا يمكنك استخدام دالة splitext من وحدة os.path ومن ثم تحصل على العنصر الأول فقط، وستتعامل هذه الطريقة أيضا مع أسماء الملفات المختلفة مثل .bashrc طريقة استعمال الدالة كالتالي: os.path.splitext(filename)[0] وإذا رغبت بفعل ذلك بالتعابير النمطية وكانت جميع الملفات تنتهي بـ .jpg فيمكنك كتابة سطر مشابه لهذا: s = re.sub(r'\.jpg$', '', s)
  8. يوجد عدة طرق في لغة بايثون لتنظيف السلسلة النصية، فمثلا يمكنك استخدام BeautifulSoup وإنشاء قائمة بها السمات التي تريد حذفها لإنشاء دالة لتنفيذ ما تريده كما في المثال التالي: from bs4 import BeautifulSoup VALID_TAGS = ['strong', 'em', 'p', 'ul', 'li', 'br'] def sanitize_html(value): soup = BeautifulSoup(value) for tag in soup.findAll(True): if tag.name not in VALID_TAGS: tag.hidden = True return soup.renderContents()إذا أردت حذف محتويات السمات استبدل tag.hidden بـ tag.extract(). أو يمكنك استخدام دالة clean_html من وحدة lxml.html.clean حيث تملك العديد من الخيارات والتخصيصات. مثال على استخدام هذه الدالة: from lxml.html.clean import clean_html print clean_html(html)
  9. يوجد الكثير من الطرق لحل هذه المشكلة، فأنت في الغالب ستحصل على خطا TypeError لأنك تحتاج إلى وضع علامتي اقتباس حول قيمة عمود التاريخ كما في المثال التالي: now = datetime.datetime(2009, 5, 5) cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, '%s')", ("name", 4, now))وبالنسبة للتنسيق المستعمل في صياغة التاريخ فقد استعملت الأمر التالي واختفى الخطأ: now.strftime('%Y-%m-%d %H:%M:%S') وإذا لم تعمل الطريقة السابقة، فيمكنك استعمال دالة strftime من وحدة time وسيعمل المثال الذي وضعته بدون مشاكل.
  10. هنالك العديد من الطرق التي يمكنك من خلالها فك ضغط ملف في ريلز، وأعتقد أن استخدام rubyzip gem هي أفضل طريقة لفعل ذلك، فهي فتنشئ نظام ملفات اصطناعي في الذاكرة لتخزن محتويات ملف zip، وهذا مثال على استخدام هذا gem لفك ضغط ملف: require 'zip' Zip::File.open("my.zip") do |zipfile| zipfile.each do |file| # do something with file end endعند استخدام هذه الشيفرة البرمجية استبدل my.zip باسم الملف الذي تريد استبداله، وستلاحظ أنه يمكنك الدوران على المحتويات والقيام بما تريده عليهم.
  11. تقنيا، هذا ليس مهم، فالتعليمة require تقوم فقط باستدعاء التوابع بشكل عادي، والمكان التي تم استدعاؤها منها لا يؤثر على طريقة عملها، الفرق الوحيد يكمن في أن موقع التعليمة سيؤثر على وقت استدعائها سواء كان في البداية أو النهاية أو عند استدعاء دالة معينة. إن المكان التقليدي لوضع require هو في بداية الملف حتى يتمكن الناس من رؤية متطلبات الملف قبل تشغيله وبنظرة واحد ولكي لا يضطروا إلى قراءة كامل الشيفرة البرمجية.
  12. يوجد في بايثون العديد من الطرق لتنفيذ ما تريد، كاستخدام الدالة المدمجة split والتي استعملتها أنت في مثالك ولم تقم بالعمل المطلوب لسبب بسيط وهو عدم وضع الأقواس في المعامل الأول حيث ستصبح '\W' في المعامل الأول والتي ترمز للرموز (وليس للحروف) بين أقواس كالتالي '(\W)' ويصبح السطر الكامل كهذا: >>> re.split('(\W)', 'foo/bab spam\neggs') ['foo', '/', 'bab', ' ', 'spam', '\n', 'eggs']
  13. يوجد العديد من الطرق في بايثون يمكن من خلالها تنفيذ دالة كل مدة معينة تحددها أنت مسبقا، فيمكنك مثلا في نهاية دالة foo() أن تنشئ Timer والذي سيستدعي foo() نفسها كل 10 ثواني لأن دالة Timer ستنشئ خيط جديد لاستدعاء foo() وفي هذه الحالة يمكنك القيام بأشياء الأخرى في نفس الوقت. مثال على كيفية استخدام دالة Timer من وحدة threading (لاحظ أن الوقت الذي مررناه بالثواني): >>> import time, threading >>> def foo(): ... print(time.ctime()) ... threading.Timer(10, foo).start() ... >>> foo() Thu Dec 22 14:46:08 2011 >>> Thu Dec 22 14:46:18 2011 Thu Dec 22 14:46:28 2011 Thu Dec 22 14:46:38 2011
  14. هنالك العديد من الطرق في لغة بايثون لإرجاع أكثر من قيمة من دالة، والطريقة الصحيحة والأسهل لفعل ذلك هي التي ذكرتها return (i, card) فهذه الطريقة تُرجع لك tuple ويمكنك فكّه فيما بعد كما هي الحال مع القوائم والقواميس كما في المثال التالي: def select_choice(): ... return (i, card) my_i, my_card = select_choice()حيث عند الاستدعاء سنضع أسماء المتغيرات التي نرغب في أن نحصل على قيمها التي تم إرجاعها كما لاحظنا في المثال السابق.
  15. يمكنك التأكد ما إذا كان المتغير رقم أو سلسلة نصية بعدة طرق في لغة روبي، فيمكنك على سبيل المثال استخدام التابع class الذي سيرجع Fixnum في حالة كان المتغير يحتوي على رقم أو String في حالة كان المتغير يحتوي على سلسلة نصية كما في المثال التالي: >> 1.class #=> Fixnum >> "foo".class #=> String أو يمكنك استخدام تابع is_a? ومن ثم تكتب نوع المتغير وسيرجع لك قيمة منطقية، فمثلا لو كتبت Numeric لمتغير من نوع رقم فسيرجع true وإذا كتبت String لمتغير من نوع سلسلة نصية فسيرجع true والعكس صحيح كما في المثال التالي: >> 1.is_a? Numeric #=> true >> "foo".is_a? String #=> true
  16. هنالك العديد من الطرق في روبي يمكنك من خلال التأكد ما إذا كان المتغير مثيل للصنف أو لا، فمثلا يمكنك استخدام تابع instance_of? للكائن وهو يشبه طريقة دالة instanceof في جافا بشكل كبير كما تلاحظ في المثال التالي: "a".instance_of? String # => true "a".instance_of? Object # => false كما تمتلك روبي توابع is_a? وkind_of? (هما مثيلين ويعملان بالضبط كبعضهما) والتي ترجع true في حالة التطابق كما يظهر في المثال التالي: "a".is_a? String # => true "a".is_a? Object # => true
  17. هنالك العديد من الطرق السهلة التي يمكنك استخدامها لإرسال الملفات باستخدام POST من خلال سكربت بايثون، فيمكنك على سبيل المثال فعل ذلك باستعمال دالة post من وحدة requests بكل سهولة كما في المثال التالي: >>> r = requests.post('http://httpbin.org/post', files={'report.xls': open('report.xls', 'rb')}) لاحظ أن الحل يتكون من سطر واحد فقط! فهذه الطريقة هي الأسهل، وللمزيد من المعلومات حولها أنصحك بقراءة هذا التوثيق. كما يمكنك استخدام وحدة poster التي تدعم ميزة تدفق الملفات بشكل مباشر (streaming uploads) وبذلك لن تضطر إلى تحميل كامل الملف إلى الذاكرة قبل الإرسال.
  18. عند تعلمك للغة جديدة ستتعلم معها الكثير من الطرق البرمجية الجديدة وستكتشف العديد من اختصارات برمجية لم يكن باستطاعتك القيام بها سابقا في لغات أخرى، فالميزة الرئيسية في لغات بايثون وروبي وبيرل أنها أقصر عند الكتابة من لغات أخرى مثل السي والجافا فببضعة أسطر فقط يمكنك توفير كتابة عشرات من الأسطر في لغات أخرى، ففي بعض الأحيان تحتاج إلى القيام بشيء بسيط مثل تعديل على مجموعة من الملفات وسيكون فعل ذلك عن طريق لغات سكربتية (بايثون، روبي، بيرل...) أسهل بكثير.
  19. يوجد في بايثون الكثير من الطرق التي يمكنك من خلالها تحويل سلسلة نصية تحتوي على حروف آسكي تم ترميزها بـ hex إلى سلسلة نصية عادية تحتوي على أحرف عادية وأسهل هذه الطرق هي عن طريق استخدام دالة decode() التي تفك ترميز حيث سنمرر لها كلمة "hex” وستفك ترميز السلسلة النصية المطلوبة كما في المثال التالي: >>> "7061756c".decode("hex") 'paul' ومن الطرق الأخرى استخدام عدة دوال مثل join وzip بالإضافة إلى حلقة التكرار for كما في المثال التالي: >>> txt = '7061756c' >>> ''.join([chr(int(''.join(c), 16)) for c in zip(txt[0::2],txt[1::2])]) 'paul'
  20. إن إنشاء سكربت php لرفع ملفات الفيديو وعرضها يحتاج إلى الكثير من العمل والشرح ولا تكفي إجابة هنا على شرح كل التفاصيل. لكن كفكرة عامة على إنشاء هذا السكربت، أنصحك بأن تنشئ سكربت عادي لرفع الملفات ومن ثم تستخدم HTML5 لعرض هذه الفيديوات وذلك عن طريق وسم <video> كما في المثال التالي: <video width="320" height="240" controls> <source src="movie.mp4" type="video/mp4"> <source src="movie.ogg" type="video/ogg"> Your browser does not support the video tag. </video> أرجو أن تكون الفكرة قد وصلتك. للمزيد من المعلومات حول وسم <video> أنصحك بالإطلاع على هذا الدرس. ملاحظة: موقع يوتيوب أصبح يستخدم HTML5 منذ فترة بدلا من فلاش بلاير.
  21. هنالك عدّة طرق في لغة روبي يمكنك من خلالها معرفة الوقت بين تاريخين مختلفين، فعلى سبيل المثال إذا قمت بعملية طرح بين كائنين من نوع Date أو DateTime فستحصل على ناتج الفرق بين التاريخين بالأيام ويكفي في هذه الحالة أن تضرب الناتج في 24 ثم في 60 للحصول على عدد الدقائق بين هذين التاريخين كما في المثال التالي: a = Date.new(2009, 10, 13) - Date.new(2009, 10, 11) (a * 24 * 60).to_i # 2880 minutes ويمكنك فعل نفس الشيء على كائنين من نوع DateTime كما في هذا المثال: a = DateTime.new(2009, 10, 13, 12, 0, 0) - DateTime.new(2009, 10, 11, 0, 0, 0) (a * 24 * 60).to_i # 3600 minutes
  22. هنالك الكثير من الحلول التي تمكنك من تثبيت إصداري 2 و3 للبايثون دون مشاكل، والحل الرسمي لهذه المشكلة هي عن طريق استخدام Python Launcher for Windows والذي هو موجود في الإصدار 3.3 من بايثون، وإن تثبيت هذه الحزمة سيضع py.exe و pyw.exe إلى %SYSTEMROOT% (C:\Windows) والذي سيرتبط بسكربتات py و pyw على التوالي. وعند تشغيل السكربتات باستدعائهم مباشرة عن طريق سطر الأوامر سيجعل launcher يبحث عن رمز # والذي سيحدد إصدار بايثون الذي سيتم استخدامه، فجميع هذه الطرق ستعمل بدون مشاكل: #!C:\Python33\python.exe #!python3 #!/usr/bin/env python3
  23. هنالك طرق مختلفة في لغة روبي يمكنك من خلالها الحصول على اليوم الأخير من الشهر، فعلى سبيل المثال يمكنك استخدام تابع Date.Civil حيث ستمرر له السنة والشهر واليوم، والميزة التي سنستخدمها هنا والتي ستجعلنا نحصل على اليوم الأخير من الشهر أنه قيم معامل اليوم يمكن أن تكون سالبة والتي ستمكننا من العد بطريقة عكسية (من الخلف) كما في المثال التالي: => Date.civil(2010, 02, -1) => Sun, 28 Feb 2010 >> Date.civil(2010, -1, -5) => Mon, 27 Dec 2010 أما لو كنت تستخدم ريلز فيمكنك في هذه الحالة استخدام تابع end_of_month كما في المثال التالي: # Require extensions explicitly if you are not in a Rails environment require 'active_support/core_ext' p Time.now.utc.end_of_month # => 2013-01-31 23:59:59 UTC p Date.today.end_of_month # => Thu, 31 Jan 2013
  24. يوجد في بايثون الكثير من الطرق التي يمكنك استخدامها لوضع قيمة متغير معين داخل السلسة النصية، فيمكنك على سبيل المثال استخدام طريقة الدمج حيث ستدمج السلسلة/السلاسل النصية مع بعضها باستعمال رمز الجمع + كما في المثال التالي: plot.savefig('hanning' + str(num) + '.pdf') أو يمكنك فعل ذلك باستخدام تنسيق السلسلة النصية كما يظهر في المثال التالي: plot.savefig('hanning%s.pdf' % num) أيضًا يمكننا استخدام أسماء المتغيرات المحلية كالتالي: plot.savefig('hanning%(num)s.pdf' % locals()) # Neat trick أو باستخدام دالة format كما في المثال التالي: plot.savefig('hanning{0}.pdf'.format(num)) # Note: This is the new preferred way وأخيرا يمكنك فعل ذلك باستعمال دالة string.Template كما في المثال التالي: plot.savefig(string.Template('hanning${num}.pdf').substitute(locals()))
  25. يمكنك الاستغناء عن المتغير I بعدة طرق في لغة بايثون، فيمكنك على سبيل المثال استخدام المتغير "_” (خط سفلي) في موقع المتغير I من حلقة التكرار وبذلك لن تحتاج إلى المتغير I ويمكنك أيضا استبدال دالة xrange كذلك بدالة repeat من وحدة itertools حيث ستمرر لها None والمتغير N كما يظهر في المثال التالي: import itertools for _ in itertools.repeat(None, N): do_something()أو لو فرضنا أنك قمت بتعريف دالة do_something وتريد تكرارها N مرة، فيمكنك كتابة مشابه لهذا: todos = [do_something] * N for doit in todos: doit()
×
×
  • أضف...