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

هشام رزق الله

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

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

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

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

    31

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

  1. الفرق بينهم هو أن Vagrant يدير الآلة الافتراضية ويسمح لك بتكوين سكربت الإعدادات في الآلة الافتراضية، لكن من سلبياته أنه يعتمد على Virtual Box أو على أية آلة افتراضية أخرى بالإضافة إلى أنه يستهلك الكثير من موارد الجهاز، فهو يحتاج إلى مساحة كبيرة بالإضافة إلى أنه يستهلك أغلب موارد ذاكرة الوصول العشوائي. أما Docker فهو يستخدم kernel cgroup و namespacing عن طريق lxc أي أنه يستخدم نفس النواة التي تستخدمها بالإضافة إلى نفس نظام الملفات، لذلك فهو يستهلك أقل من Vagrant.
  2. لا ترى بايثون أهميّة لهذه العوامل، فمثلا بدل كتابة x++ يمكنك ببساطة كتابة x += 1 وكلتا البرمجيتين يؤدّيان ذات الوظيفة. أما لو أردت معرفة السبب الحقيقي وراء عدم إدراج عامل الزيادة والنقصان في البايثون فإن هذا السؤال قد طُرح قبل سنوات في القوائم البريدية للبايثون وكان الجواب كالتالي: هذا ببساطة لأن ليس هنالك حاجة لهذه العوامل في البايثون كما في بقية اللغات ففي لغة السي بلس بلس مثلا ستقوم بكتابة مثل هذه التعليمة البرمجية: for(int i = 0; i < 10; ++i)أما في البايثون فإنك ستقوم بكتابة تعليمة برمجية مشابهة لهذه بدون عامل الزيادة: for i in range(0, 10)
  3. في حالة استخدام time.sleep() في البايثون فإنه سيتم إيقاف الخيط (thread) الحالي مؤقتًا وستبقى العملية (process) تعمل بدون مشاكل. ففي تطبيقات الخيط الواحد يوقف كامل التطبيق عند استخدام هذه الدالة لكن في برامج متعددة الخيوط فإنه يتم إيقاف الخيط الذي قمنا بتطبيق دالة sleep عليه فقط أما بقية الخيوط فستبقى تعمل داخل العملية (process) بدون مشاكل. للمزيد من المعلومات أنصحك بمراجعة التوثيق الرسمي.
  4. عندما تتعامل مع نصوص بترميز UTF-8 من مصادر غير موثوقة مثل نماذج الويب، فإنه من الجيد أن تقوم بإصلاح أي تسلسل من البايتات غير الصحيحة حتى تتجنب كسر خطوات المعالجة التي تعتمد على المدخلات الصالحة، لذلك في مثل هذه الحالة، يُنصح بأن يتم باستخدام UTF-8//IGNORE والتي تُخبر مفسر روبي بأن يتجاهل البايتات التي لا يمكن تحويلها كما في المثال التالي: ic = Iconv.new('UTF-8//IGNORE', 'UTF-8') valid_string = ic.iconv(untrusted_string) حيث ستستبدل untrusted_string بالسلسلة النصية التي حصلت عليها من مصدر غير موثوق. المصدر
  5. هنالك عدة طرق في روبي لتغيير حالة الحرف الأول من كل كلمة إلى حرف كبير، على سبيل المثال استخدم التابع titleize كما في المثال التالي: "hIcHeM RaZgAllAh".titleize => "Hichem Razgallah" ملاحظة: هذا التابع موجود في روبي أون ريلز. كما يمكنك استخدام توابع split و map وjoin لفصل الكلمات من السلسلة النصية ومن ثم تغيير حالة الحرف الأول إلى كبير وتغيير حالة بقية الأحرف إلى أحرف صغيرة وبعد ذلك نقوم بدمج الكلمات ونضع بينها فراغات كما في المثال التالي: puts 'one TWO three foUR'.split.map(&:capitalize).join(' ') #=> One Two Three Fourمثال آخر استخدمنا فيه الرمز * بدلا من تابع join : puts 'one TWO three foUR'.split.map(&:capitalize)*' 'المصدر
  6. يُستخدم الرمز ^ لمطابقة بداية السطر. يُستخدم الرمز $ لمطابقة نهاية السطر. يُستخدم الرمز \A لمطابقة بداية السلسلة النصية. يُستخدم الرمز \z (حرف صغير) لمطابقة نهاية السلسلة النصية. يُستخدم الرمز \Z (حرف كبير) لمطابقة نهاية السلسلة النصية إلا في حالة أن السلسلة النصية تنتهي بـ \n ففي هذه الحالة سيقوم بمطابقة الحرف الذي يأتي قبل \n مباشرة. مثال: سيتطابق /^foo$/ مع جميع الأمثلة التالية على عكس /\Afoo\z/ فلن يتطابق مع أي مثال: whatever1 foo whatever2foo whatever2whatever1 foo المصدر
  7. لحذف عنصر في أول ظهور له في القائمة يمكنك استخدام الدالة list.remove مع تمرير قيمة هذا العنصر ليتم حذفه كما في المثال التالي: >>> a = [1, 2, 3, 4] >>> a.remove(2) # 2 is not the position! >>> print a [1, 3, 4] وفي حالة ما احتجت إلى حذف جميع التكرارات ذات نفس القيمة في قائمة معينة فيمكنك في هذه الحالة استخدام عبارات مفهومة مثل for وin وif لعملية التكرار لجميع العناصر في القائمة. مثال على استخدام العبارات المفهومة: >>> a = [1, 2, 3, 4, 2, 3, 4, 2, 7, 2] >>> a = [x for x in a if x != 2] >>> print a [1, 3, 4, 3, 4, 7] كما يمكنك إضافة شرط قبل عملية البحث والحذف كما في المثال التالي: a=[1,2,3,4] if 6 in a: a.remove(6)المصدر
  8. لأسباب تتعلق بأمن التطبيق في ريلز فإنه لا يتم اعتبار السلسلة النصية المكتوب بها شيفرة HTML كشيفرة برمجية مكتوبة بلغة HTML، إذ يقوم ريلز بتهريب (escaping) السلسلة النصية لك لأنه قد يكون بها شيفرات برمجية ضارة، لكن يمكنك أن تخبر ريلز بأن السلسلة النصية آمنة عن طريق تابع html_safe وسوف يتم تنفيذ الشيفرة البرمجية المكتوبة بلغة HTML بداخلها دون مشاكل كما في المثال التالي: @str = "<b>Hi</b>".html_safe<%= @str %>يمكنك أيضا استخدام تابع raw لكنه سحوّل السلسلة النصية إلى سلسلة نصية أخرى ومن ثم سيقوم باستدعاء تابع html_safe لذلك من الأفضل أن نستدعي تابع html_safe مباشرة.
  9. هنالك العديد من الطرق في لغة الروبي لتحويل مصفوفة إلى سلسلة نصية ومن أسهلها استخدام الدالة المدمجة join() وتمرير "فاصل" حتى تقوم بإنشاء سلسلة نصية من الأرقام مفصولة بفواصل كما في المثال التالي: ['12','34','35','231'].join(",")وستكون نتيجة هذا السطر: "12,34,35,231"وبما أننا أردنا أن نقوم بتحويل المصفوفة كما هي (بفواصلها وعلامات الاقتباس الخاصة بها ...) إلى سلسلة نصية فسنقوم بتمرير ',' إلى دالة join() ومن ثم سنضع علامة اقتباس في بداية السلسلة النصية وفي نهايتها كما في المثال التالي: "'#{['12','34','35','231'].join("','")}'"
  10. هنالك عدة طرق لضم مسار معين في روبي، أشهرها استخدام الدالة المدمجة File.join() حيث ندمج مسار مفصول بفواصل وبعد ذلك سنحوله إلى مسار كامل كما في المثال التالي: >> File.join("path", "to", "join")=> "path/to/join"ملاحظة: يستخدم روبي "/” لفصل المسارات في جميع المنصات وأنظمة التشغيل بما في ذلك ويندوز وغيرها، لذلك فانك لن تحتاج إلى استخدام شيفرة برمجية مختلفة لدمج المسارات لكل نظام على حدة، فالمسار "C:/tmp/1.text" سوف يعمل لك بدون مشاكل في أي منصة. المصدر
  11. هنالك طرق عديدة في البايثون لعرض ترتيب معكوس لعناصر القائمة، أسهلها استخدام حلقة التكرار for مع دالة المدمجة reversed() حيث تعكس هذه الدالة ترتيب القائمة وتطبع حلقة التكرار كل عنصر فيها كما في المثال التالي: >>> a = ["foo", "bar", "baz"] >>> for i in reversed(a): ... print i ... baz bar foo وبما أنك أردت أن تطبع موقع كل عنصر من القائمة ففي هذه الحالة سنضيف متغير آخر يحمل موقع العنصر (المتغير e) وسنستخدم الدوال المدمجة list() و enumerate() حتى نتمكّن من الحصول على موقع العنصر وكما في المثال الأول نستخدم حلقة التكرار for لطباعة العنصر وموقعه: >>> for i, e in reversed(list(enumerate(a))): ... print i, e ... 2 baz 1 bar 0 foo
  12. هنالك خلاف في الرأي حول ما هي أفضل طريقة لترشيح القائمة، فكل مبرمج ولديه طريقته للبرمجة وأسبابها، لكن بالنسبة للمبرمجين المبتدئين يمكن استخدام التعليمات البرمجية المفهومة مثل for و if أسهل من استخدام lambda و filter فالطريقة الأخيرة تعتبر من طرق البرمجة المتقدمة. أما من ناحية السرعة فإن استخدام filter قد يصبح أبطئ (في بعض الأحيان) عند استخدامه مع دالة (أي نوع من الدوال سواء كانت عادية أو lambda) لذلك في الحالة الأولى قد تكون أبطأ من الحالة الثانية التي استخدمت فيها for وif.
  13. هنالك عدة طرق للحصول على hostname للجهاز عن طريق بايثون أسهلها استخدام الدالة gethostname() من مكتبة socket، فهي ترجع hostname للحاسوب الذي يعمل فيه مفسر بايثون، مثال على استخدام الدالة: import socket print(socket.gethostname()) هنالك حل آخر باستخدام الدالة node() من مكتبة platform كما في المثال التالي: import platform platform.node() أيضًا لدينا حلول أخرى باستخدام دوال getenv وenviron من مكتبة os لكن هذه الحلول قد لا تعمل دائما لذلك لا ينصح باستخدامها، بكل الأحوال يمكنك استعمالها كالتالي: os.getenv('HOSTNAME') os.environ['HOSTNAME'] المصدر
  14. هنالك العديد من الطرق السهلة لحفظ صورة من رابط باستخدام paperclip في الريلز خاصة مع إصدار Paperclip 3.1.4 الذي قام بتسهيل الأمر أكثر وأصبحت الشيفرة البرمجية أقصر كما في المثال التالي: def picture_from_url(url) self.picture = URI.parse(url) end وهذا الأمر أفضل قليلا من استخدام open(url) لأنه لو قمت باستخدام open(url) فسوف تحصل على "stringio.txt" كاسم ملف، لكن مع الشيفرة البرمجية التي كتبناها سوف نحصل على الاسم الصحيح للملف الموجود في الرابط بالإضافة إلى جميع معلوماته الأخرى كما في المثال التالي: self.picture = URI.parse("http://something.com/blah/avatar.png") self.picture_file_name # => "avatar.png" self.picture_content_type # => "image/png"المصدر
  15. هنالك عدّة طرق في روبي لاستبدال كلمات ضمن سلسلة نصية، أسهلها استخدام sub! كما في المثال التالي: sentence.sub! 'Robert', 'Joe' باستخدام هذا التابع لن تظهر رسالة خطأ إذا كانت الكلمة غير موجودة. لكن المثال في الأعلى سيقوم فقط باستبدال أول كلمة، فلو أردنا أن نقوم باستبدال جميع الكلمات الموجودة في سلسلة نصية ففي هذه الحالة سوف نستخدم تابع gsub! الذي يقوم باستبدال جميع أجزاء السلسلة النصية. مثال على استخدامه: sentence.gsub! 'Robert', 'Joe'المصدر
  16. هنالك حلول مختلفة لحل هذه المشكلة في لغة الروبي، فمثلا يمكنك طرح السنة الحالية من سنة ميلاد الشخص الذي تريده ومن ثم تقوم باختبار هل فات يوم ميلاده أم لا Kلتعرف عمره بالضبط كما في المثال التالي: age = Date.today.year - birthday.year age -= 1 if Date.today < birthday + age.years #for days before birthday هذا الحل سهل ولا تحتاج إلى القلق من التعامل مع السنوات الكبيسة. وإذا كنت تستخدم ريلز (ROR) فيمكنك في هذه الحالة حل هذه المشكلة بسهولة دون مشاكل ودون التفكير في السنوات الكبيسة كما في المثال التالي: def age(birthday) (Time.now.to_s(:number).to_i - birthday.to_time.to_s(:number).to_i)/10e9.to_i end
  17. هنالك عدة طريق يمكنك أن تقوم بتغيير التاريخ إلى تاريخ سابق(تاريخ قبل ساعات أو أيام أو حتى سنوات)فعلى سبيل المثال يمكنك استخدام دوال timedelta وdate من مكتبة datetime لطرح عدد معين من الأيام من تاريخ معين (مثلا تاريخ اليوم) كما في هذا المثال: from datetime import date, timedelta d = date.today() - timedelta(days=days_to_subtract)حيث ستضع بدلا من days_to_subtract عدد الأيام التي تريدها طرحها من التاريخ الحالي. كما يمكنك استخدام هاتين الدالتين بطريقة أخرى كما في المثال التالي: from datetime import datetime, timedelta print datetime.now() + timedelta(days=5, hours=-5) وهذه سوف تحتاجها في حالة ما أردت (حسب المثال السابق) إضافة خمسة أيام وطرح 5 ساعات من تاريخ اليوم(الإضافة والطرح في نفس الوقت). المصدر
  18. تعتبر شهادات توزيعة لينكس ردهات من أقوى وأشهر الشهادات في العالم نظرا لقوتها في إدارة الشركات والخوادم الكبرى، فالكثير من وظائف الشركات التي تعتمد على نظام لينكس تطلب شهادات ردهات حتى تقبل توظيفك. توجد 6 شهادات لردهات لكن أشهرها Red Hat Certified System Administrator (RHCSA) وهي شهادة إدارة النظام بالإضافة إلى شهادة Red Hat Certified Engineer (RHCE) وهي شهادة مهندس بأنظمة ردهات. كما توجد شهادات أخرى من شركات عديدة مثل شهادة CompTIA Linux+ وشهادة Novell Certified Linux Engineer... ملاحظة: تختلف أسعار دراسة واجتياز هذه الامتحانات وهي تعتبر دورات مكلفة نوعا ما فبعضها يتجاوز 1500 دولار.
  19. هنالك طرق مختلفة للحصول على اسم الدالة دون الحاجة إلى كتابة دالة مخصصة لذلك، يمكننا مثلا الاستعانة بتابع __name__، فهو التابع الأفضل للحصول على اسم الدالة ويُستخدم بشكل موحد على نطاق واسع، وخلافا لتابع func_name فهو يعمل على التوابع المدمجة في نفس الوقت. مثال على استخدام __name__: my_function.__name__ كما يمكنك أيضا استخدام التابع func_name كما ذكرنا سابقا، مع التأكيد على أنّه لا يدعم الدوال المدمجة كما في المثال التالي: >>> import time >>> time.time.func_name Traceback (most recent call last): File "<stdin>", line 1, in ? AttributeError: 'builtin_function_or_method' object has no attribute 'func_name' >>> time.time.__name__ 'time' مثال على استخدامه: my_function.func_nameالمصدر
  20. حسب رأيي أن سبب عدم وجود عامل الزيادة في الروبي أن هذا العامل لن تكون هنالك له حاجة كما في اللغات الأخرى مثل السي والسي بلس بلس، وسبب وجود هذه العوامل في تلك اللغات أنها تحتاج إليها في بعض التعليمات البرمجية مثل حلقة التكرار for، فبينما هي ضرورية في السي فإنها في الغالب لا لزوم لها في الروبي، فمعظم التكرار في الروبي(الذي يقابل for في السي) يتم من خلال توابع قابلة للإحصاء (Enumerable) مثل each و map.
  21. الفرق بين هاتين الحالتين هو السماح بالوصول إلى مميزات علامة الاقتباس الواحدة (quote) والمزدوجة، ففي حال استخدمنا علامة الاقتباس الواحدة مع %w لن نتمكن من إقحام شيفرة برمجية (code interpolation) مثل #{someCode} وستحصل على مجموعة محدودة من أحرف الهروب (escape characters) مثل \n ولكن إذا قمنا باستخدام علامة الاقتباس المزدوجة مع %W فإننا سنحصل على جميع المميزات التي نريدها.
  22. إذا افترضنا أن الأسماء لا تحتوي على أية رموز غريبة ولا توجد أية مشاكل أخرى فيمكنك في هذه الحالة أن تقوم بحلقة تكرار for لمتغير ما (مثلا w) على */work كما في المثال التالي: MY_DIR=/tmp/swan cd $MY_DIR for w in */work do find $w -path "*work*" -iname "*.txt" -type f -execdir mv '{}' $MY_DIR/$w/completed \; doneقمت بتجربة هذا المثال وقد عمل على الملفات في المستوى الرابع. هنالك حل آخر والذي يستخدم حلقة التكرار while للتكرار على جميع الملفات الموجودة في المجلد الرئيسي بالإضافة إلى مجلداته الفرعية. مثال الحل الآخر باستخدام while: MY_DIR=/tmp/swan cd $MY_DIR find $MY_DIR -type d -name \*work\* -print | while read w do find $w -path "*work*" -iname "*.txt" -type f -execdir mv '{}' $MY_DIR/$w/completed \; done
  23. الموضوع معقد نوعا ما لأن به العديد من المصطلحات الصعبة لغير التقنيين لكن سأحاول تفسيره قدر المستطاع. أنظمة تشغيل الوقت الحقيقي (real-time operating system) هي نوع من أنواع أنظمة التشغيل تهدف لخدمة بيانات عمليات الوقت الحقيقي ودون التأخير التي تحدث بسبب التخزين المؤقت. يتم قياس متطلبات الوقت المعالجة (بما في ذلك أي تأخيرات نظام التشغيل) في أجزاء من الثانية أو حتى أقل. تُستخدم هذه الأنظمة في الأغلب في الروبوتات وسفن الفضاء ومعدات البحث العلمي وغيرها. من أشهر هذه الأنظمة Windows CE و QNX Neutrino و TI-RTOS Kernel .
  24. الموضوع مُعقّد قليلا لكن سأحاول تبسيطه قدر المستطاع. kernel module أو وحدة النواة هي شيفرة برمجية معقدة تُحقّق وظيفة ما، ويمكن أن يتم إدراجها إلى النواة عند وقت التشغيل، وتوجد أمثلة كثيرة عنها مثل insmod وmodprobe. أما Kernel drivers فهي شيفرة البرمجية التي تعمل في النواة للتحدث مع بعض الأجهزة، فهي تقود الجهاز. تقريبا جميع أجزاء حاسوبك لديها تعريف driver مرتبط بها، فجزء كبير من النواة التي تعمل هي شيفرات برمجية لتعريفات الأجهزة.
  25. هنالك العديد من الطرق لتحويل تاريخ من نوع unix timestamp إلى تاريخ قابل للقراءة، فيمكنك على سبيل المثال استخدام دالة datetime.fromtimestamp من مكتبة datetime ومن ثم تحويل الناتج إلى سلسلة نصية لعرض التاريخ عن طريق دالة strftime كما في المثال التالي: import datetime print( datetime.datetime.fromtimestamp( int("1284101485") ).strftime('%Y-%m-%d %H:%M:%S') ) ملاحظة: يبدو datetime.datetime غريبا نوعا ما، لكن في الحقيقة datetime الأولى هي اسم الوحدة أما datetime الثانية فهي لاسم الصنف. كما يمكنك أيضا استخدام مكتبة time لتحويل التاريخ والوقت كما في المثال التالي: >>> import time >>> time.ctime(int("1284101485")) 'Fri Sep 10 16:51:25 2010' >>> time.strftime("%D %H:%M", time.localtime(int("1284101485"))) '09/10/10 16:51' المصدر
×
×
  • أضف...