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

هشام رزق الله

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

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

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

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

    31

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

  1. يوجد العديد من الطرق لفعل ذلك في بايثون، فلو أردت فقط التأكد من وجود سلسلة نصية معينة في عناصر القائمة لتنفيذ عدة سطور برمجية فيمكنك في هذه الحالة استخدام الجملة الشرطية if كما في المثال التالي: some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456'] if any("abc" in s for s in some_list): # whatever أما في حالة أردت الحصول على جميع العناصر التي تحتوي على السلسلة النصية abc فيمكنك استخدام التالي: matching = [s for s in some_list if "abc" in s] أو يمكنك استخدام دالة filter مع lambda كما في المثال التالي: >>> lst = ['abc-123', 'def-456', 'ghi-789', 'abc-456'] >>> print filter(lambda x: 'abc' in x, lst) ['abc-123', 'abc-456']
  2. هذا الخطأ تسببت به تعليمة print الأخيرة وهنالك عدة حلول لهذه المشكلة في بايثون، الطريقة الأسهل لحل هذه المشكلة هي عن طريق فصل العدد الصحيح الموجود في متغير c عن السلسلة النصية عن طريق استبدال عامل الجمع إلى فاصلة كما في المثال التالي: print "a + b as integers: ", c # note the comma here أما الطريقة الثانية لحل هذه المشكلة فهي عن طريق تحويل العدد الصحيح إلى سلسلة نصية وذلك باستخدام دالة str كما في المثال التالي: str(c)
  3. تُعتبر هذه الشهادة من أشهر الشهادات في المجال الأمني ويُنصح بها لمن يريد أن يصبح خبير أو مستشار أمني أو حتى محلل أمني وهذه الشهادة معترف بها في الكثير من بلدان العالم ويبلغ زمن الامتحان 6 ساعات يحتوي على 250 سؤال متعدد الاختيارات ويجب عليك أن تحصل على 700 نقطة من 1000 نقطة حتى تنجح في الامتحان ويختلف سعر الامتحان من دولة لأخرى لكنه لا يتجاوز 600 دولار. الموقع الرسمي للشهادة
  4. تعتبر تطبيقات GUI متعددة المنصات (تعمل على أكثر من نظام) من أقدم المشاكل للكثير من لغات البرمجية مثل روبي، فكل من Qt وGTK وwxWindows وJava AWT …. تعاني من نفس هذه المشكلة، فالتطبيق يختلف منظره وفي أحيانا أخرى طريقة عمله حسب النظام وستضطر للكثير من العمل لإنتاج نسخ من نفس التطبيق لتعمل على جميع الأنظمة ناهيك عن المكتبات التي يجب على المستخدم تثبيتها ليعمل البرنامج بدون مشاكل (كما هي الحال لدي مستخدمي ويندوز).
  5. يوجد العديد من الطرق في لغة بايثون لفعل ذلك، فيمكنك على سبيل المثال استخدام دوال join وsplit المدمجين لحذف الفراغات والأسطر الجديد والمسافات كما في المثال التالي: >>> s = " \t foo \n bab " >>> "".join(s.split()) 'foobab' وإذا أردت حذف الفراغات فقط فيمكنك فعل ذلك عن طريق استخدام دالة replace كما في المثال التالي: >>> s.replace(" ", "") '\tfoo\nbar' ومن الطرق الأخرى أيضا لفعل ذلك يمكنك استخدام التعابير النمطية كما في المثال التالي: >>> import re >>> re.sub(r'\s+', '', 'strip my spaces') 'stripmyspaces'
  6. يوجد العديد من الفروقات بين وحدتي datetime وtime في بايثون، فوحدة time تعمل بشكل أساسي مع يونكس time stamps الذي يتم التعبير عنه كرقم حقيقي (به فاصلة) مأخوذ ليكون عدد الثواني منذ عصر اليونكس، أما بالنسبة إلى وحدة datetime فهي تدعم الكثير من العميات المشابهة، ولديها أيضا دعم محدود للمناطق الزمنية (time zones).
  7. نعم، يوجد عدة طرق في بايثون لفعل ذلك، فيمكنك على سبيل المثال استخدام دالة escape من وحدة re المتخصصة بالتعابير النمطية لتهريب المحارف كما في الأمثلة التالية: re.escape(string) >>> re.escape('\ a.*$') '\\\\\\ a\\.\\*\\$' >>> print(re.escape('\ a.*$')) \\\ a\.\*\$ >>> re.escape('www.stackoverflow.com') 'www\\.stackoverflow\\.com' >>> print(re.escape('www.stackoverflow.com')) www\.stackoverflow\.com التوثيق الرسمي يُعرف الدالة كتالي: أو يمكنك فعل نفس الشيء عن طريق استخدام دالة sub من نفس المكتبة وبطرق متعددة كما في المثال التالي: import re print re.sub(r'([\"])', r'\\\1', 'it\'s "this"') # it's \"this\" print re.sub(r"([\'])", r'\\\1', 'it\'s "this"') # it\'s "this" print re.sub(r'([\" \'])', r'\\\1', 'it\'s "this"') # it\'s\ \"this\"
  8. هذه الشهادة من أشهر شهادات لينكس وتتكون من 3 شهادات و 6 اختبارات، فلكل مستوى شهادة واختبارين، وتبلغ كلفة الاختبار 188$ والشهادة صالحة لمدة 5 سنوات. بالنسبة للمستوى الأول فيتضمن أساسيات النظام والأوامر الأساسية لإدارته والتحكم فيه ويحتوي الاختبار على 60 سؤال متعدد الاختيار في 90 دقيقة. بالنسبة للمستوى الثانية فسيهتم أكثر بالشبكات ونواة لينكس وأنظمة الملفات وكما في الاختبارات المستوى الأول يحتوي الاختبار على 60 سؤال متعدد الاختيار في 90 دقيقة. وأما المستوى الثالث فسيهتم بأمن الأنظمة وبالبيئات الافتراضية (Virtualization). الموقع الرسمي للشهادة.
  9. يوجد العديد من الطرق في لغة روبي لفعل ذلك، فيمكنك على سبيل المثال استخدام هذه الطريقة حيث أن f هي الدالة التي تريد تطبيقها على قيم الهاش و hash هو الهاش الخاص بك: hash.update(hash){|key,v1| f(v1)} المثال السابق يعتبر أفضل طريقة وتعمل على أغلب إصدارات روبي، وفي حالة كنت تستخدم إصدار أقدم من 1.8 وتريد طريقة أخرى لفعل ذلك فيمكنك استخدام هذه الطريقة: new_hash = Hash[old_hash.map {|key, value| key, foo(value)}]
  10. إن خيار استخدام دوال system() و popen() هو خيار جيد بالاعتماد على ما ستفعله. استخدم system() إذا لم يكن لسكربت بايثون أية مخرجات أو إذا كنت تريد أن تذهب مخرجات سكربت بايثون مباشرة إلى المتصفح، واستخدم popen() إذا كنت تريد كتابة بيانات إلى المدخل القياسي لسكربت بايثون أو إذا أردت قراءة البيانات من المخرجات القياسية لسكربت بايثون في php. ملاحظة: ستسمح لك popen() بالقراءة أو الكتابة فقط وليس الإثنين معا، فإذا أردت فعل الأمرين معا فأنصحك باستخدام proc_open().
  11. يوجد طرق عديدة لنقل عناصر القوائم بهذا الشكل، ويمكنك استخدام zip أيضا لفعل ذلك بطريقة أخرى وذلك عن طريق استخدام دالة حلقة التكرار map معها كما في المثال التالي: map(list, zip(*l)) --> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] وبالنسبة لمستخدم الإصدار الثالث من بايثون فيمكنهم استخدام هذا السطر: list(map(list, zip(*l))) أما إذا لم ترد استخدام zip نهائيا فهنالك حلول أخرى، مثل استخدام numpy مع دوال أخرى كما في المثال التالي: >>> numpy.asarray(l).T.tolist() [[1, 4, 7], [2, 5, 8], [3, 6, 9]] أو يمكنك استخدام دالتي map كما في المثال التالي: >>> map(list,map(None,*l)) [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
  12. تعتمد الإجابة على سؤالك حول ما الذي تريد فعله بهذا الهيكل، فـ Set أسرع من القوائم في بعض الحالات مثلا إذا أردت التأكد من وجود كائن معين في set (عن طريق x in s مثلا)، ولكنها ستكون أبطئ من القوائم في حالات أخرى مثل الدوران حول العناصر عن طريق حلقة التكرار. أمثلة حول سرعة الدوران: >>> def iter_test(iterable): ... for i in iterable: ... pass ... >>> from timeit import timeit >>> timeit( ... "iter_test(iterable)", ... setup="from __main__ import iter_test; iterable = set(range(10000))", ... number=100000) 12.666952133178711 >>> timeit( ... "iter_test(iterable)", ... setup="from __main__ import iter_test; iterable = list(range(10000))", ... number=100000) 9.917098999023438 >>> timeit( ... "iter_test(iterable)", ... setup="from __main__ import iter_test; iterable = tuple(range(10000))", ... number=100000) 9.865639209747314 أمثلة حول التأكد من وجود كائن: >>> def in_test(iterable): ... for i in range(1000): ... if i in iterable: ... pass ... >>> timeit( ... "in_test(iterable)", ... setup="from __main__ import in_test; iterable = set(range(1000))", ... number=10000) 0.5591847896575928 >>> timeit( ... "in_test(iterable)", ... setup="from __main__ import in_test; iterable = list(range(1000))", ... number=10000) 50.18339991569519 >>> timeit( ... "in_test(iterable)", ... setup="from __main__ import in_test; iterable = tuple(range(1000))", ... number=10000) 51.597304821014404
  13. نعم هنالك شهادات كثيرة للغة PHP، لكن أشهرها – حسب علمي – شهادة w3schools والتي تبلغ تكلفتها 95 دولار. تتطلب الشهادة معرفة بالـ PHP و SQL(MySQL) وتحتوي على 70 سؤال متنوع بين أسئلة الاختيارات المتعددة وأسئلة صح/خطأ ويجب الإجابة عليهم في زمن لا يتجاوز 70 دقيقة. ولاجتياز هذا الاختبار يجب أن تكون 75% من إجاباتك صحيحة وفي حالة تجاوزت نسبة الإجابات الصحيحة 95% فستحصل على شهادة امتياز.
  14. سبب هذه المشكلة بسيط للغاية، ففي الروبي، علامة الاقتباس المفردة (single quotes) حول السلسلة النصية معناها أن لا يتم ترجمة تهريب الحروف، فعلى عكس السي التي تدل فيها علامة الاقتباس المفردة على حرف واحد، فإن في هذه الحال ستكون '\n' مشابهة إلى "\\n". لذلك إذا أردت فصل السلسلة النصية حسب \n فستحتاج إلى تغيير شيفرتك البرمجية واستخدام علامة الاقتباس المدمجة كالتالي: .split("\n")
  15. نعم يوجد فرق كبير بين الإثنين فكل واحد منهم هو نوع من أنواع المتغيرات، فالأول والذي استخدمت فيه المعقفين هو قائمة ولديها مميزاتها الخاصة والتي تختلف فيها عن النوع الثاني والتي من أبرزها أن القوائم كائنات يمكن تغيير وتعديل محتواها كما في المثال التالي: >>> x = [1,2] >>> x.append(3) >>> x [1, 2, 3] أما المثال الثاني الذي وضعَته فهو مثال لـ tuple ويختلف في مميزاته عن القوائم فهو كائن غير قابل للتعديل كما يظهر في المثال التالي: >>> x = (1,2) >>> x (1, 2) >>> x.append(3) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'tuple' object has no attribute 'append'
  16. يوجد العديد من الطرق لفعل ذلك في بايثون، فيمكنك على سبيل المثال استخدام التعابير النمطية وفعل ذلك في سطر واحد فقط كما في المثال التالي(هذا أقصر وأبسط مثال): import re ... if re.match("^[A-Za-z0-9_-]*$", my_little_string): # do something hereأو يمكنك استخدام هذا المثال الذي سيتأكد من محتويات السلسلة النصية وإرجاع قيمة منطقية حسب النتيجة: import string allowed = string.letters + string.digits + '_' + '-' def check_naive(mystring): return all(c in allowed for c in mystring)طريقة أخرى لفعل ذلك باستخدام التعابير النمطية كالتالي: CHECK_INV_RE = re.compile('[^a-zA-Z0-9_-]') def check_inv_re(mystring): return not CHECK_INV_RE.search(mystring)
  17. في أغلب الأحيان أنصحك بإرجاع None، فإذا لم تكن هنالك نتيجة فلماذا ترجع شيء مشابه للنتيجة؟ وفي حالات كانت إحدى القيم فقط مفقودة ففي هذه الحالة أنصحك بإرجاع tuple يحتوي على قيمة واحدة فقط مثل هذه ('Boston', None). هنالك بعض الحالات التي يجب أن يتم إرجاع فيها tuple يحتوي على (None, None) كما في هذه الحالة: city, state = getCityStateTuple("something") حيث أنه إذا قمت بإرجاع None فسيتم إصدار خطأ كالتالي: TypeError: 'NoneType' object is not iterable
  18. جميع هذه الكلاسات تتبع حزمة java.io والتي وظيفتها قراءة وكتابة البيانات الخام من وإلى الملفات والشبكات والذاكر المؤقتة وغيرها... بالنسبة إلى BufferedInputStream فهي تقرأ مجموعة من البيانات (كتلة) في كل مرة لتسريع عملية القراءة بدلا من القراءة بايت واحد، وتخزن البيانات بشكل مؤقت في ذاكرة مؤقتة لنفس السبب ويمكنك استخدامها بهذه الطريقة: InputStream input = new BufferedInputStream( new FileInputStream("c:\\data\\input-file.txt"), 8 * 1024 ); أما بالنسبة إلى BufferedOutputStream فهي تشبه في عملها BufferedInputStream لكن الفرق أن هذه تستخدم للكتابة. مثال على استخدامها: OutputStream output = new BufferedOutputStream( new FileOutputStream("c:\\data\\output-file.txt"), 8 * 1024 );
  19. يوجد العديد من الطرق في روبي لفعل ذلك، فيمكنك على سبيل المثال إنشاء دالة لتعمل كمرشح (فلتر) للتأكد من وجود جزء http وإضافته في حالة عدم وجوده كما في المثال التالي: before_validation :smart_add_url_protocol protected def smart_add_url_protocol unless self.url[/\Ahttp:\/\//] || self.url[/\Ahttps:\/\//] self.url = "http://#{self.url}" end endوإذا أردت تجنب التعابير النمطية فيمكنك في هذه الحالة استخدام URI.parse كما في المثال التالي: u = URI.parse('/pancakes') if(!u.scheme) # prepend http:// and try again elsif(%w{http https}.include?(u.scheme)) # you're okay else # you've been give some other kind of # URL and might want to complain about it end ومن الطرق الأخرى أيضا: def link=(_link) u=URI.parse(_link) if (!u.scheme) link = "http://" + _link else link = _link end super(link) end
  20. الحل الذي توصلتَ إليه قريب من الحل الصحيح، تأكد من نوع صنف params[:uploaded_file] والذي سيكون في العادة إما كائن StringIO أو Tempfile وكلاهما يتصرف كالملفات يمكنك قراءتهم عن طريق استخدام توابع read ألخاصة بهم. وللتأكد من نوع الصنف (نوع صنف params[:uploaded_file] حسب ما تستخدم من Mongrel أو Passenger أو Webrick) يمكنك استخدام هذه الشيفرة البرمجية: # Note: use form validation to ensure that # params[:uploaded_file] is not null file_data = params[:uploaded_file] if file_data.respond_to?(:read) xml_contents = file_data.read elsif file_data.respond_to?(:path) xml_contents = File.read(file_data.path) else logger.error "Bad file_data: #{file_data.class.name}: #{file_data.inspect}" end
  21. هنالك طرق مختلفة لفعل ذلك في بايثون، فيمكنك على سبيل المثال استخدام مكتبة PyPNG، فهي مكتبة مفتوحة المصدر لترميز وفك ترميز PNG وتدعم الصور على شكل NumPy وستجد على موقعها الرسمي العديد من الأمثلة. وإذا لم تعجبك هذه المكتبة فيمكنك استخدام دوال misc.imsave من مكتبة scipy حيث ستمرر اسم الصورة والمصفوفة كما في المثال التالي: import scipy scipy.misc.imsave('outfile.jpg', image_array) ومن الطرق الأخرى، يمكنك استخدام وحدة Image كما في المثال التالي: import Image im = Image.fromarray(A) im.save("your_file.jpeg")
  22. يوجد عدة طرق في لغة بايثون لفعل ذلك، بعضها باستخدام التعابير النمطية والآخر فبدونها، فمثلا يمكنك استخدام دوال مكتبة التعابير النمطية للبحث عن AAA و ZZZ واستخراج ما بينها كما في المثال التالي: import re text = 'gfgfdAAA1234ZZZuijjk' m = re.search('AAA(.+?)ZZZ', text) if m: found = m.group(1) # found: 1234أو يمكنك تطوير المثال السابق قليلا باستخدام try except كما في المثال التالي: import re text = 'gfgfdAAA1234ZZZuijjk' try: found = re.search('AAA(.+?)ZZZ', text).group(1) except AttributeError: # AAA, ZZZ not found in the original string found = '' # apply your error handling # found: 1234وإذا لم ترغب باستخدام التعابير النمطية فيمكنك في هذه الحالة استخدام دوال المدمج في بايثون مثل دالة find كما في المثال التالي: >>> s = 'gfgfdAAA1234ZZZuijjk' >>> start = s.find('AAA') + 3 >>> end = s.find('ZZZ', start) >>> s[start:end] '1234'
  23. يوجد العديد من الطرق لفعل هذا في بايثون، بعضها طويلا ومعقد للغاية وبعضها قصيرا، فيمكنك على سبيل المثال إنشاء دالة بسطر واحد تحتوي على دوال مدمجة متنوعة مثل max وset كما يظهر في هذه الدالة: def most_common(lst): return max(set(lst), key=lst.count) وإذا كنت تستخدم الإصدار 2.7 من بايثون فيمكنك في هذه الحالة استخدام دالة Counter من مكتبة collections لإنشاء دالة قصيرة جدا وسريعة جدا (أسرع بكثير من المثال السابق) كما في المثال التالي: from collections import Counter def Most_Common(lst): data = Counter(lst) return data.most_common(1)[0][0
  24. تعتبر هذه الشهادة من أشهر شهادات لينكس وأقواها بعد شهادات ردهات وتتطلب الكثير من المعرفة في نظام لينكس توزيعة سوسي (SUSE). تشمل هذه الشهادة الكثير من المواضيع مثل تثبيت النظام والتعامل مع الحزم وGRUB وVI وأنظمة الملفات والتقسيمات القرص الصلب بالإضافة إلى الأوامر الأساسية في النظام وإصلاح المشاكل الأساسية وإدارة المستخدمين والصلاحيات وضمان أمن النظام وغيرها من المواضيع والتي يمكنك الإطلاع عليها من الموقع الرسمي للشهادة. يختلف سعر الشهادة من دولة لأخرى لكنها أرخص من اختبارات ردهات.
  25. تحتوي ملفات .pyc على نسخة مترجمة بـ "البايتكود" من الشيفرة البرمجية لبرنامجك، ويُحمّل بايثون ملفات .pyc قبل .py لذلك إذا كانت هذه الملفات موجودة فإنها ستوفر عليك بعض الوقت لأن بايثون لن يقوم بإعادة ترجمة الشيفرة البرمجية الخاصة بك مرة أخرى. إذا تخلصت من ملفات .pyc فلن تحصل أية أخطاء أو مشاكل، وفي الغالب حجم هذه الملفات ليس كبيرا، وقد تلاحظ توفيرها للوقت عند تشغيلك لبرامج كبيرة.
×
×
  • أضف...