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

هشام رزق الله

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

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

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

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

    31

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

  1. هنالك عدّة طرق في بايثون لحساب معدّل قائمة معينة مثلا يمكنك استخدام دالة mean() من مكتبة numpy (التابعة للمكتبة القياسية للبايثون) للحصول على معّدل القائمة حيث تُمرّر لها القائمة فترجع لك المعدّل كما في المثال التالي: >>> import numpy >>> a = [1, 2, 4] >>> numpy.mean(a) 2.3333333333333335 أما لو كنت تستخدم إصدار حديث للبايثون مثل 3.4 فيمكنك استخدام دالة mean من وحدة statistics والتي ستمرر لها القائمة فترجع لك معدل أعداد تلك القائمة كما في المثال التالي: import statistics print(statistics.mean([1,2,4])) # 2.3333333333333335 أما بالنسبة لمستخدمي إصدارات بايثون 3.1-3.3 فالنسخة الأصلية من الوحدة موجودة في PyPi تحت اسم stats. (يجب عليك تغيير statistics إلى stats في الشيفرة البرمجية.) المصدر
  2. هنالك عدّة طرق للتكرار على عناصر قائمة معينة وعرض ترتيب كل عنصر إلى جانب العنصر، فيمكنك على سبيل المثال استخدام حلقة التكرار for مع الدالة المدمجة enumerate() للحصول على المطلوب كما في المثال التالي: >>> a = [3,4,5,6] >>> for i, val in enumerate(a): ... print i, val ... 0 3 1 4 2 5 3 6 >>> ثم يمكنك استخدام دالة list لجعل عناصر tuple كقائمة كما في المثال التالي: list(enumerate([3,7,19])) [(0, 3), (1, 7), (2, 19)]وهنالك طريقة أخرى للتكرار والحصول على ترتيب جميع عنصر قائمة معينة وهي استخدام دوال zip و range و len كما يبدو هذا في المثال التالي: >>> a = [3, 7, 19] >>> zip(range(len(a)), a) [(0, 3), (1, 7), (2, 19)] المصدر
  3. لديك خطأ بسيط في السطر الذي كتبته، يجب عليك أن تضع علامات اقتباس مزدوجة "\n" وليست مفردة كما وضعتها أنت، فهنالك فرق بينهما، فعلامات الاقتباس المزدوجة تسمح للأحرف أن تتمدد وأن تُستخدم معها تعابير مختلفة مثل استخدام محارف التحكم بالهروب كمحرف \n حتى تستخدم قيمتها الحقيقة وهي في هذه الحالة سطر جديد، وبالإضافة إلى ذلك فهي تسمح لك باستخدام تعابير #{expression} حتى تتمكن من التحكم بالمتغيرات وبالتالي وضع أي تعبير روبي في النص.
  4. نعم يمكنك عكس مجال حلقة التكرار في لغة روبي، فالمجال هو شيء محدد ببداية ونهاية وليس بمحتوياته، فالتكرار حول هذا مجال لا يعطي معنى في أغلب الحالات، فعلى سبيل المثال، كيف يمكنك التكرار حول مجال يتكون من تاريخين؟ فهل يقوم بالتكرار حسب اليوم؟ أم الشهر؟ أم السنة؟ أم الأسبوع … فهذا المجال بدايته ونهايته غير مُعرّفة. وإذا أردت التكرار عكسيا فيمكنك مثلًا استخدام downto: $ r = 10..6 => 10..6 $ (r.first).downto(r.last).each { |i| puts i } 10 9 8 7 6ويمكنك أيضا استخدام .each كما في المثال التالي: >> (-2..2).each { |n| puts -n } 2 1 0 -1 -2 => -2..2 كما يمكنك استخدام (0..1).reverse_each للتكرار.
  5. المشكلة أن codecs.BOM_UTF8 هي سلسلة نصية من نوع بايت وليست سلسلة نصية من نوع Unicode، فعلى الأغلب معالج الملف سيحاول معرفة ما الذي تريد فعله، فكأنه يقول لك "أنت تعني أنك تريد كتابة سلسلة نصية من نوع unicode مرمّزة عن طريق ترميز UTF-8 لكنك قمت بإعطائي سلسلة نصية من نوع بايت". يمكنك حل هذه المشكلة عن طريق تمرير utf-8-sig إلى codecs.open كما في المثال التالي: with codecs.open("test_output", "w", "utf-8-sig") as temp: temp.write("hi mom\n") temp.write(u"This has ♭") المصدر
  6. نعم هذا صحيح، يمكنك تقريبا القيام بأي شيء عن طريق تعلمك للغة بايثون. هنالك عدة محاولات لإنشاء مكتبات بايثون لبرمجة تطبيقات نظام أندرويد، فعلى الرغم من أن هذه المحاولات لا ترتقي إلى مستوى اللغات الأخرى مثل الجافا والسي بلس بلس وغيرها إلا أنها كافية لبرمجة تطبيقات الصغيرة والمتوسطة. يمكنك على سبيل المثال استخدام Kivy فهذه المكتبة تتطور دائما وتجد فيها العديد من الإضافات الجديدة بصفة مستمرة، ومن مميزاتها أن مطوريها قاموا بعمل إطار سهل للغاية وجميل لمدخلات المستخدم عن طريق القلم أو اللمس المتعدد. ومن المشاريع الأخرى التي تستحق الذكر كذلك Python for Android.
  7. هنالك عدة طرق للتعامل مع مشكلة ترميز النصوص في بايثون، فيمكنك مثلًا ترميز هذه النصوص إلى unicode (كما ذكرت أنت) ومن ثم إعادتهم إلى حالتهم الأصلية عند فك الترميز. إذا كانت سلسلتك النصية كائن unicode، فستحتاج إلى تحويلها إلى كائن سلسلة unicode مُرمزة قبل أن تكتبها إلى ملف كما في المثال التالي: foo = u'Δ, Й, ק, ‎ م, ๗, あ, 叶, 葉, and 말.' f = open('test', 'w') f.write(foo.encode('utf8')) f.close() وعندما تحتاج إلى قراءة الملف لاحقا، يمكنك فك ترميز هذه النصوص كما يظهر في المثال التالي: f = file('test', 'r') print f.read().decode('utf8')
  8. هنالك عدة طرق في لغة بايثون يمكنك من خلالها تحديد نوع المتغير إن كان صنف أو عدد صحيح أو سلسلة نصية أو غيره... من أسهلها وأكثرها شيوعا استخدام دالة isclass من مكتبة inspect كما يبرز هذا في المثال التالي: >>> import inspect >>> class X(object): ... pass ... >>> inspect.isclass(X) True كما يمكنك أيضا استخدام الدالة المدمجة isinstance كما في المثال التالي: isinstance(X, type) والتي سترجع True في حالة ما كان X هو صنف. المصدر
  9. إن %r{} مشابهة إلى /.../ لكنها تسمح لك بوجود رمز / في التعبير النصي الخاص بك دون الحاجة إلى تهريبه كما في المثال التالي: %r{/home/user} السطر السابق مشابهة لـ: /\\/home\\/user/ أما بالنسبة لسؤالك حول معنى التعبير النمطي، فإن معناه كالتالي: \. تعني أنه يحتوي على نقطة. (gif|jpg|jpeg|png) أي أنه يحتوي على أحد هذه الامتدادات (الموجودة في مجموعة ومفصولة برمز | ) $ أي: النهاية، لا يوجد شيء بعده. I معناه أن حالة الأحرف غير حساسة (لا يوجد فرق بين الحرف الكبير والصغير).
  10. على الرغم من أن الطريقة التي ذكرتها تعتبر أسهل طريقة لإضافة حروف أو كلمات معينة إلى سلسلة نصية موجودة بالفعل إلا أنه هنالك طرق أخرى يمكنك استخدامها، ونادرا ما تجدها في البرامج والتطبيقات المكتوبة بلغة روبي، فعل سبيل المثال يمكنك استخدام >> للتمكن من الإضافة إلى السلسة النصية: s = "foo" old_id = s.object_id s << "bab" s #=> "foobab" ويمكنك أيضا استخدام التابع المدمج concat الذي سيدمج السلسة النصية المُمررة مع السلسلة النصية الأصلية كما في المثال التالي: s.concat("world")
  11. نعم، توجد أكثر من طريقة لتحويل سلسلة نصية إلى متغير من نوع byte في بايثون 3، فيمكنك على سبيل المثال استخدام دالة bytes كما يلي: b = bytes(mystring, 'utf-8') ستقوم هذه الدالة بإرجاع مصفوفة جديدة من البايتات، وستكون هذه المصفوفة تسلسل من الأعداد الصحيحة قابلة للتغيير (mutable). يُذكر أن دالة bytes تقوم بأشياء أكثر من ترميز سلسلة نصية، لذلك يفضل البعض استخدام طرق أخرى. من هذه الطرق الأخرى استخدام دالة encode() و decode() للتحويل من وإلى byte كما في المثال التالي: my_str = "hello world" bytes = str.encode(my_str) type(bytes) # insures its bytes my_decoded_str = str.decode(bytes) type(my_decoded_str) # insures its string المصدر
  12. في بايثون لدينا دالة escape من مكتبة re والتي تسمح لك بتهريب الرموز الموجودة في السلسلة النصية التي قمت بتمريرها لها، وهذا هو تعريف الدالة في التوثيق الرسمي: مثال بسيط على استخدام هذه الدالة حيث مرّرنا سلسلة نصية فقامت بتهريبها: >>> import re >>> re.escape('^a.*$') '\\^a\\.\\*\\$' المصدر
  13. نعم، هنالك في أغلب لغات البرمجة مثل السي والسي بلس بلس وباسكال وغيرها طريقة سريعة لعمل الجمل الشرطية، فيكفي أن تكتب الشرط ثم تكتب أمامه الأوامر التي يجب تنفيذها ما إذا كان الشرط صحيح، وهذه الطريقة تسمى في باسكال بـ Case of، أي على حسب محتويات متغير معين قم بفعل أوامر معينة. هذه الطريقة تختصر الكثير من الجهد والوقت وهذا مثال بسيط لبرنامج بلغة باسكال باستخدام هذه الحلقة: Program Program1b_Lesson5; Uses Crt; Label Return; {use of the goto statement is not recommended..avoid it} Var SEL : Integer; YN : Char; Begin Return:Clrscr; Writeln('[1].PLAY GAME'); WRITELN('[2].LOAD GAME'); WRITELN('[3].MULTIPLAYER'); WRITELN('[4].EXIT GAME'); Writeln('note: Do note press anything except'); Writeln('numbers; otherwise an error occurs!'); Readln(SEL); Case SEL of 1 : Begin Writeln('Are you able to create'); Writeln('a game of yourself using pascal??'); Delay(2000); Goto Return; End; 2 : Begin Writeln('Ahhh... no saved games'); Delay(2000); Goto Return; End; 3 : Begin Writeln('networking or 2 players?'); Delay(2000); Goto Return; End; 4 : Begin Writeln('Exit?'); YN := Readkey; Case YN of {a sort of a nested case statement} 'y' : Begin Writeln('Nooooooooooooo...'); Delay(1000); Halt; End; 'n' : Goto Return; End;{End Case2} End;{Close Conditional Expression 4} End; {End Case1} End. المصدر
  14. حسب معرفتي بلغة روبي، فإنه لا توجد دالة أو تابع مدمج لتحويل السلاسل النصية إلى متغيرات من نوع متغيرات منطقية boolean وعلى الرغم من ذلك فإن هنالك طرق عديدة للتحويل، فإذا كانت السلاسل النصية تحتوي فقط على كلمة true أو false فيمكنك إنشاء تابع بسيط للتحويل عن طريق الاختبار كما في المثال التالي: def to_boolean(str) str == 'true' end وأما لو كنت تستخدم ريلز فيمكنك في هذه الحالة استخدام وحدة ActiveRecord كما في المثال التالي: def is_true?(string) ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES.include?(string) end طريقة أخرى للحل باستخدام التعابير النمطية: def to_boolean(s) s and !!s.match(/^(true|t|yes|y|1)$/i) end
  15. شرح من التوثيق الرسمي للبايثون: لذلك فإنه عندما تقوم بالمقارنة بين سلسلتين نصيّتين أو عددين صحيحين فإنه يتم ترتيبهم بطريقة متوقعة وليست عشوائية (ترتيب لكسيكوجرافيك lexicographic للسلاسل النصية، وترتيب رقمي للأعداد الصحيحة). وعندما تقوم بالمقارنة بين نوع رقمي ونوع غير رقمي، فإن النوع الرقمي يأتي أولا كما في المثال التالي: >>> 5 < 'foo' True >>> 5 < (1, 2) True >>> 5 < {} True >>> 5 < [1, 2] True وعندما تقوم بالمقارنة بين نوعين غير رقميين، فإنه سيتم ترتيبهم حسب ترتيب الأبجدية لاسم النوع: >>> [1, 2] > 'foo' # 'list' < 'str' False >>> (1, 2) > 'foo' # 'tuple' > 'str' True المصدر
  16. إن المتغيرات من نوع tuple غير قابلة للتغير، فلا يمكنك تغيير محتوياتها بعد إنشاءها، لكن يمكنك دمجها أو قطع أجزاء منها لإنشاء متغيرات أخرى. يمكنك البدء بـ tuple فارغ مثل هذا t = () ومن ثم سنضيف المتغيرات إليه عن طريق عامل الجمع + وفي هذه الحالة عليك إنشاء متغير جديد من نوع tuple، وإذا أردت إضافة عنصر وحيد فيمكنك فعل مثل هذا t = t + (element,) مثال للشرح السابق: >>> t = () >>> t = t + (1,) >>> t (1,) >>> t = t + (2,) >>> t (1, 2) >>> t = t + (3, 4, 5) >>> t (1, 2, 3, 4, 5) >>> t = t + (6, 7, 8,) >>> t (1, 2, 3, 4, 5, 6, 7, 8) المصدر
  17. نعم، هنالك دالة hashlib.md5() والتي تسمح لك بالحصول على رمز MD5 للملف الذي تمرره لها، فمثلا لو أردت طباعة رمز MD5 لملف واحد، فيمكنك كتابة سطر مشابهه لهذا السطر: print hashlib.md5(open(full_path, 'rb').read()).hexdigest() وأما لو كان لديك مجموعة من الملفات لتوليد رمز MD5 لها، فيمكنك استخدام حلقة التكرار for للحصول على رموز جميع الملفات كما في المثال التالي: import hashlib [(fname, hashlib.md5(open(fname, 'rb').read()).digest()) for fname in fnamelst] وفي حال كان الملف الذي تريد توليد الرمز له كبير للغاية (أكبر من ذاكرة الوصول العشوائي لحاسوبك) فيمكنك قرأته على أجزاء كما في المثال التالي: def md5(fname): hash = hashlib.md5() with open(fname, "rb") as f: for chunk in iter(lambda: f.read(4096), b""): hash.update(chunk) return hash.hexdigest() المصدر
  18. على الرغم من اشتراك جميع حلقات التكرار الثلاثة في إعادة مجموعة من الأوامر لعدد محدّد من المرات فهنالك بعض الفروقات البسيطة التي تميّز كل حلقة عن الأخرى، على سبيل المثال تُستخدم حلقة for عندما تعرف عدد مرات التكرارات مسبقا، في حين أن repeat و while تُستخدمان عندما لا تعرف عدد التكرارات قبل بدء التكرار، والفرق بينهما أن repeat ستكرر الأسطر البرمجية الموجودة بداخلها مرة واحدة على الأقل قبل أن تتأكد من صحة شرط الخروج في حين أن while تتأكد من الشرط أولا لذلك لن يتم تكرار هذه الأسطر ولا مرة.
  19. هنالك عدة طرق لتحويل سلسلة نصية معينة إلى تعبير نمطي في روبي، فيمكنك استخدام التابع Regexp.new للتحويل كما في المثال التالي: >> str = '[\w\s]+' => "[\\w\\s]+" >> Regexp.new str => /[\w\s]+/ كما يمكنك استخدام هذه الصياغة لتهريب جميع الحروف التي تمتلك معاني خاصة: /#{Regexp.quote(your_string_variable)}/ويمكنك أيضا استخدام gem to_regexp واستخدام تابعه to_regexp لتحويل السلاسل النصية إلى تعابير نمطية مع تهريب جميع الحروف: "/[\w\s]+/".to_regexp => /[\w\s]+/ المصدر
  20. هنالك عدّة طرق في بايثون لخلط ترتيب عناصر مصفوفة، وأسهل هذه الطرق هي عن طريق استخدام دالة shuffle من مكتبة random ومن ثم تقوم بتمرير المصفوفة كما في المثال التالي: import random random.shuffle(array) لكن على رغم من سهولة هذين السطرين فهنالك من ينزعج من أن دالة random.shuffle لا تقوم بإرجاع أي شيئ، فهي ستقوم فقط بإعادة ترتيب عناصر المصفوفة بطريقة عشوائية، ولحل هذه المشكلة يمكنك إنشاء دالة لخلط وعرض المصفوفة كما في المثال التالي: import random def my_shuffle(array): random.shuffle(array) return array ولاستخدامها يمكنك كتابة سطر مشابه لهذا: for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']): المصدر
  21. يمكنك البحث عن مفاتيح قاموس معين داخل قائمة من القواميس بطرق مختلفة، مثلا استخدم التعابير الموّلدة كما في المثال التالي: >>> dicts = [ ... { "name": "Tom", "age": 10 }, ... { "name": "Mark", "age": 5 }, ... { "name": "Pam", "age": 7 }, ... { "name": "Dick", "age": 12 } ... ] >>> (item for item in dicts if item["name"] == "Pam").next() {'age': 7, 'name': 'Pam'}لقد استخدمنا في هذا المثال حلقة التكرار for للتأكد من جميع العناصر من شرط تساوي قيمة الاسم مع الاسم الذي نبحث عنها ومن ثم يرجع لنا جميع المعلومات المتعلقة بهذا الاسم. كما يمكنك استخدام دالة filter مع lambda للبحث داخل جميع القواميس الموجودة في القائمة كما في المثال التالي: people = [ {'name': "Tom", 'age': 10}, {'name': "Mark", 'age': 5}, {'name': "Pam", 'age': 7} ] filter(lambda person: person['name'] == 'Pam', people)المصدر
  22. تعتبر لغة باسكال (إلى وقت قريب) أشهر لغات البرمجة المستعملة في التعليم بسبب بساطتها وقربها من لغة السي مما جعلها بداية جيدة للمبرمجين المبتدئين. لكن على الرغم من هذه المميزات التي تمتلكها باسكال إلا أنها تعتب لضعيفة لقلة مكتباتها وقلة استخدامها خارج التدريس، لذلك نادرا ما ستجد برامج تعمل بلغة باسكال. لا أنصح بتعلم باسكال في الوقت الحالي بل من الأفضل الاتجاه مباشرة نحو السي بلس بلس أو بايثون.
  23. يمكنك الحصول على معدل مجموعة من الأعداد الصحيحة بسهولة في بايثون خاصة وأنك ذكرت أنها موجودة في قائمة مما سيزيد الأمر سهولة، يمكنك على سبيل المثال استخدام lambda ودالة reduce للحصول على مجموع العناصر الموجودة داخل القائمة ومن ثم استخدام دالة len() للحصول على طول القائمة (عدد عناصرها) ومن ثم ببساطة تقسّم المجموع على طول القائمة كما في المثال التالي: l = [15, 18, 2, 36, 12, 78, 5, 6, 9] print reduce(lambda x, y: x + y, l) / len(l) كما يمكنك استبدال lambda و دالة reduce() بدالة sum() التي ستحسب مجموع الأعداد الموجودة داخل القائمة كما في المثال التالي: l = [15, 18, 2, 36, 12, 78, 5, 6, 9] sum(l) / float(len(l))
  24. هذا هو فهرس مواضيع كتب ردهات الرسمية وتحتوي على كل ما يجب تعلمه للحصول على الشهادة: 1- نظرة عامة على أنظمة لينكس وشهادة ردهات. 2- الوصول إلى سطر الأوامر. 3- إدارة الملفات عن طريق سطر الأوامر. 4- الحصول على المساعدة في نظام ردهات. 5- الإطلاع على الملفات النصية وإنشاؤها وتعديلها. 6- إدارة المستخدمين والمجموعات المحلية. 7- الصلاحيات في نظام لينكس. 8- مراقبة وإدارة عمليات لينكس. 9- التحكم بـ services و Daemons. 10- تكوين وتأمين خدمة OpenSSH. 11- تحليل وخزن السجلات. 12- إدارة الشبكة في نظام ردهات. 13- أرشفة ونسخ الملفات بين الأنظمة. 14- تثبيت وتحديث حزم البرامج. 15- الوصول إلى أنظمة ملفات لينكس. 16- استخدام الأنظمة الافتراضية. 17- تشغيل التثبيت بشكل آلي باستخدام Kickstart. 18- استخدام التعابير النمطية في grep. 19- إنشاء وتعديل الملفات النصية باستخدام VIM. 20- جدولة مهام لينكس المستقبلية. 21- إدارة أولوية عمليات لينكس. 22- تحكم بالوصول إلى الملفات باستخدام قوائم تحكم الوصول -Access Control Lists (ACLs)- 23- إدارة أمن SELinux. 24- الاتصال بمستخدمي ومجموعات شبكة مُعرفة. 25- إضافة أقراص وأقسام وأنظمة ملفات لنظام لينكس. 26- إدارة LVM. 27- الوصول إلى تخزينات الشبكة عن طريق استخدام نظام ملفات الشبكة (NFS). 28- الوصول إلى تخزينات الشبكة عن طريق استخدام SMB. 29- التحكم وكشف الأخطاء وإصلاحها في عملية إقلاع نظام ردهات. 30- تَقْييد اتصالات الشبكة باستخدام firewalld.
  25. هنالك عدة طريق لتحويل الوقت في ريلز من منطقة زمنية إلى أخرى، فإذا أردت تحويل الوقت الحالي إلى منطقة Eastern Time (US & Canada) مثلا فيجب عليك في هذه الحالة أن تقوم بإنشاء متغير للوقت الحالي ومن ثم تستخدم تابع in_time_zone وسيتحول الوقت بسهولة تامة كما في المثال التالي: Loading development environment (Rails 2.3.2) >> now = DateTime.now.utc => Sun, 06 Sep 2009 22:27:45 +0000 >> now.in_time_zone('Eastern Time (US & Canada)') => Sun, 06 Sep 2009 18:27:45 EDT -04:00 >> quit أو يمكنك على سبيل المثال إضافة السطر التالي الذي يحتوي على المنطقة الزمنية التي تريدها إلى ملف /config/application.rb الخاص بمشروعك: config.time_zone = 'Eastern Time (US & Canada)' ومن ثم يمكنك استخدام مايلي لتحصل على الوقت بالمنطقة الزمنية المطلوبة: Annotation.last.created_at.in_time_zone
×
×
  • أضف...