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

هشام رزق الله

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

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

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

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

    31

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

  1. بالإضافة إلى طريقة تابع index يوجد في روبي توابع خاصة بإيجاد عناصر في مصفوفة معينة والتي ستمكنك من فعل ما تريده، ومن هذه التوابع يمكنك استخدام تابع find كما في المثال التالي: arr.find{|x| x.testing_cond } أو يمكنك فعل ذلك بشكل أقصر عن طريق استخدام &: كما في المثال التالي: arr.find(&:testing_cond) وتوجد طريقة أخرى لفعل ذلك وهي عن طريق تابع detect وهي مناسبة في حالة تعاملك مع كائنات active record.
  2. يعتبر هذا في روبي literal، حيث أن % يعبر عن تعبير نصي (مع r) أو مصفوفة (مع w كما في حالتك) أو سلسلة نصية (مع q) وغيرها... حيث سيرجع لك هذا الحرفي literal مصفوفة بالعناصر التي قمت بتمريرها كما في المثال التالي: > %w[h i c h e m] => ["h", "i", "c", "h", "e", "m"] ويمكنك استبدال المعقفين بأي رمز آخر مثل {} !! ?? @@ كما في الأمثلة التالية: > %w@h i c h e m@ => ["h", "i", "c", "h", "e", "m"] > %w!h i c h e m! => ["h", "i", "c", "h", "e", "m"] > %w?h i c h e m? => ["h", "i", "c", "h", "e", "m"]
  3. تحتاج إلى إعادة تشغيل الخادم عندما تريد أن يتم إعادة تحميل ريلز مرة أخرى من البداية، فمثلا عند إضافة أو حذف gem فستحتاج في هذه الحالة إلى إعادة تشغيل الخادم. أو إذا قمت بتغيير إصدار لغة روبي أو قمت بتغييرات في gemfile أو بإحدى الأصناف الداخلية لريلز لأنه قد تحدث أخطاء عند استمرارك بالعمل. أعتقد أن هذه هي أهم حالات التي تحتاج فيها إلى إعادة تشغيل الخادم.
  4. يوجد عدة طرق لفعل ذلك في بايثون، والطريقة التي ذكرتها صحيحة لكن يوجد خطأ واحد صغير حيث عند استخدام دالة chmod يجب عليك تمرير الصلاحيات القديمة قبل تمرير الجديدة ويجب الفصل بين هاتين الصلاحيتين عن طريق رمز | ويمكنك الحصول على الصلاحيات القديمة للملف عن طريق دالة stat من os وبذلك ستكون الشيفرة الجديدة لمثالك كالتالي: import os import stat statfile = os.stat('myfile.txt') os.chmod('myfile.txt', statfile.st_mode | stat.S_IEXEC)
  5. يوجد عدة طرق لفعل ذلك في بايثون، إذا أرد طريقة سريعة وسهلة فيمكنك في هذه الحالة استخدام دالة add مع حلقة التكرار for حيث سيتم الدوران على عناصر الكائن ومن ثم ستتم إضافتهم كما في المثال التالي: for i in ite: a.add(i) حيث أن a هي set و ite هو كائن القابل للتكرار. أو يمكنك استخدام دالة update وهذه الطريقة أقصر عند الكتابة لكنها أبطئ بكثير من الطريقة الأولى: a.update(ite) ومن الطرق الأخرى أيضا، يمكنك استخدام المعامل |= لإضافة القيم الفريدة(unique) إلى set كما في المثال التالي: a |= set(b)
  6. السبب بسيط للغاية، إن دالة join من وحدة string تربط العناصر داخل قائمة من سلاسل نصية وليس من أعداد صحيحة، ولحل هذه المشكلة توجد العديد من الطرق في لغة بايثون، فيمكنك على سبيل المثال استخدام التعبير المولد (generator expression) كما في المثال التالي: val = ','.join(str(u) for u in mylist) أو يمكنك استخدام دالة str مع دالة join كما في المثال التالي: val = ','.join(str(mylist)[1:-1])
  7. يوجد عدة حلول لهذه المشكلة، وأبسط حل هو أن تنتقل لاستخدام نسخة أحدث من روبي، فلقد تم حل هذه المشكلة منذ الإصدار 1.8.7 حيث أصبحت uniq ترجع العناصر الفريدة في المصفوفة. أو يمكنك استخدام توابع inject و include مع حلقة unless لفعل ذلك كما في المثال التالي: a = [{:a => 1},{:a => 2}, {:a => 1}] a.inject([]) { |result,h| result << h unless result.include?(h); result }
  8. يوجد عدة طرق في لغة روبي لفعل ذلك فيمكنك على سبيل المثال استخدام تابع product مع حلقة التكرار map لتكوين القائمة التي ترغب بتشكيلها كما في المثال التالي: a = [['1','2'],['a','b'],['x','y']] a.first.product(*a[1..-1]).map(&:join) وهنالك طريق أخرى لفعل ذلك وهي أطول وأعقد قليلا وتتكون من عدة توابع مثل reduce و map و product وغيرها كما في المثال التالي: a = [['1','2'],['a','b'],['x','y']] a.reduce() { |acc, n| acc.product(n).map(&:flatten) }.map(&:join)
  9. يوجد عدة طرق لفعل ذلك فيمكنك على سبيل المثال -كما قال الأخ سامر- استخدام دالة ord للحصول على رقم الحرف ومن ثم يمكنك إضافة إلى رقم إليه لتحصل بعد استخدامك لدالة chr على حرف جديد ويمكنك جعل كل هذه الخطوات في سطر واحد فقط كما في المثال التالي: >>> chr(ord('a') + 3) 'd' ملاحظة: في بايثون 3 أصبحت السلسلة النصية Unicode لذلك ستستقبل ord حروف Unicode وستنتجهم chr كذلك، وليس في الإصدار الثاني.
  10. يوجد عدة طرق في لغة بايثون لفعل ذلك، فيمكنك على سبيل المثال استخدام دالة choice من وحدة random الخاص بالأعداد العشوائية على مفاتيح القاموس وذلك باستعمال دالة keys كما في المثال التالي: import random d = {'a':'b', 'c':'d'} random.choice(d.keys()) أما لو كنت تستخدم الإصدار الثالث من بايثون فيجب عليك استخدام دالة list وخلافا لذلك سيحدث خطأ عند تنفيذ الأسطر السابقة: import random d = {'a':'b', 'c':'d'} random.choice(listd.keys())) وإذا لم تكن بحاجة إلى القيم هذا القاموس فيمكنك في هذه الحالة استخدام دالة popitem التي سترجع لك قيم بترتيب معين (لكنه ليس عشوائي) كما في المثال التالي: d = {'a':'b', 'c':'d', 'e':'f'} d.popitem() #('a':'b') d.popitem() #('e':'f') ملاحظة: الدالة ستحذف العناصر.
  11. يوجد عدة طرق في دجانغو لفعل ذلك، لكن أشهر هذه الطرق هي عن طريق تمرير ID إلى دالة filter ومن ثم حذف السجل عن طريق دالة delete كما في المثال التالي: SomeModel.objects.filter(id=id).delete() أو يمكنك حذفه السجل عن طريق مثيله وذلك مباشرة باستخدام دالة delete للمثيل والذي يمكننا الحصول عن طريق دالة get كما في المثال التالي: instance = SomeModel.objects.get(id=id) instance.delete()
  12. يوجد عدة طرق في روبي لهذه المشكلة، فيمكنك على سبيل المثال استخدام طريق dup على المتغير الأول عند نسخه للمتغير الثاني كما في المثال التالي: sent2 = sent1.dup أو يمكنك فعل نفس الشيء وذلك باستخدام clone بدلا من dup كما في المثال التالي: sent2 = sent1.clone ملاحظة: يمكنك الحصول على نفس قيمة متغير معين وتجنب النسخ عن طريق استخدام الطريقة التالية: sent2 = sent1.gsub("Hello","Hi")
  13. يوجد عدة طرق في ريلز لفعل ذلك، فيمكنك على سبيل المثال استخدام تايع new من Datetime ومن ثم تمرير السنة والشهر واليوم مع params حسب صيغة params[:smth] حيث ستستبدل smth بالسنة والشهر واليوم كما في المثال التالي: DateTime.new(params[:year], params[:month], params[:day]) أو يمكنك استخدام طريقة أخرى وهي عن طريق تابع civil من وحدة Datetime باستخدام تابع *params.values_at كما في المثال التالي: require 'date' date = DateTime.civil( *params.values_at( :year, :month, :day ) )
  14. يوجد عدة طرق لفعل ذلك في بايثون، فإذا أردت الحصول على قائمة من tuples فيمكنك فعل ذلك بكل سهولة عن طريق استخدام دالة zip مع تمرير * إلى جانب اسم متغير القائمة كما في المثال التالي: >>> zip(*l) [(1, 3, 8), (2, 4, 9)] ولتحويل هذه القائمة إلى قائمة من قوائم يمكنك استخدام دالة list مع حلقة التكرار for على جميع عناصر القائمة الأولى كما في المثال التالي: >>> [list(t) for t in zip(*l)] [[1, 3, 8], [2, 4, 9]]
  15. يوجد عدة طرق في بايثون لفعل ذلك، فيمكنك على سبيل المثال استخدام xrange حيث ستمرر أولا العدد الأكبر ومن ثم العدد الأصغر وفي النهاية ستمرر الخطوة والتي ستكون في هذه الحالة -1 حتى يتم الدوران بشكل عكسي كما في المثال التالي: xrange(10, 0, -1) أو يمكنك استخدام دالة reversed للقيام بعملية معاكسة (عكس المعطيات) مع حلقة التكرار for كما في المثال التالي: for x in reversed(whatever): some_code()
  16. يوجد عدة طرق في بايثون لفعل ذلك، فيمكنك على سبيل المثال استخدام دالة urlretrieve من وحدة urllib لتحميل الملفات حيث ستمرر الرابط واسم الملف في حالة أردت تغيير اسم الملف المحفوظ كما في المثال التالي: import urllib urllib.urlretrieve("http://example.com/file.zip", "file.zip") أو يمكنك استخدام دالة download من مكتبة wget حيث تدعم هذه الوحدة الإصدار الثاني والثالث من بايثون وتتميز بسهولة تحميل الملفات عن طريقها كما في المثال التالي: import wget file_name = wget.download('http://example.com/file.zip')
  17. يوجد عدة طرق في لغة روبي لفعل ذلك، لكن الطريقة الأكثر استعمالا هي عن طريق استخدام تابع encode للترميز و decode لفك الترميز من مكتبة uri والذي يمكنك استخدامه بكل سهولة كما في المثال التالي: require 'uri' URI.encode("Hello bro") # "Hello%20bro" ويمكنك دمج هذه السلسلة النصية مع الرابط عن طريق استخدام عدة توابع أخرى وهي parse و query و encode_www_form كما في المثال التالي: require 'uri' uri = URI.parse('http://example.com') uri.query = URI.encode_www_form( 'h' => "Hello bro" ) uri.to_s # => "http://example.com?h=Hello+bro"
  18. يوجد العديد من الطرق في روبي للتأكد من ذلك، فيمكنك استخدام تابع valid? من مكتبة ipaddress حيث ستمرر له عنوان IP وسيرجع لك إجابة على شكل قيمة منطقية كما في المثال التالي: require "ipaddress" IPAddress.valid? "192.128.0.11" > true وهذه الطريقة تدعم IPv6 أيضا، ويمكنك تثبيت هذه المكتبة بسهولة عن طريق gem وبالاستعمال السطر التالي: gem install ipaddress كما يمكنك استخدام توابع مكتبة resolv كما في الأمثلة التالية: require "resolv" "192.168.1.11" =~ Resolv::IPv4::Regex ? true : false #=> true "ff02::2" =~ Resolv::IPv6::Regex ? true : false #=> true
  19. يوجد في لغة بايثون العديد من الطرق للتأكد من ذلك فيمكنك على سبيل المثال استخدام تابع endswith ومن ثم تمرر tuple بها جميع الامتدادات التي تريد التأكد منها وسيتم إرجاع قيمة منطقية حسب الشرط كما في المثال التالي: >>> 'example.txt'.endswith(('.txt', '.doc', '.pdf')) True وتوجد طريقة أخرى لفعل ذلك وهي أطول وأكثر تفصيلا من الطريقة الأولى وذلك عن طريق فصل السلسلة النصية أولا ومن ثم مقارنة الجزء الأخير منها مع القائمة كما في المثال التالي: >>> import os >>> extensions = set(['.txt', '.doc', '.pdf']) >>> file_name = 'example.txt' >>> extension = os.path.splitext(file_name)[1] >>> extension in extensions True
  20. يوجد عدة طرق في لغة بايثون لفعل ذلك، فيمكنك على سبيل المثال استخدام دالة filter مع Lambda كما في المثال التالي: lists = filter(lambda text: text[-3:] != "abc", lists) أو يمكنك فعل نفس الشيء عن طريق استخدام طريقة "تفهيم القائمة" واستخدام حلقة تكرار for و الجملية الشرطية if: lists = [text for text in lists if text[-3:] != "abc"] ملاحظة للتوضيح: بعد تنفيذ هذه الأوامر سيتم إنشاء قائمة جديدة تحتوي على العناصر التي لا تنتهي بـ abc.
  21. لا، لا يتم تخزين السلاسل النصية في نفس المكان في ذاكرة إلا في بضعة حالات محددة، ففي بايثون (كما في لغات جافا و سي وسي بلس بلس و.NET) يتم الجمع بين السلاسل النصية المتشابهة ويتم وضعها في مكان واحدة، فالمترجم سيعرف أن "test” هي "test” وسيخزنهما في نفس المكان في ذاكرة. كما أنه ناتج هذه الاختبار صحيح أيضا: "tes"+"t" is "test".
  22. يوجد عدة طرق في لغة روبي لفعل ذلك، فيمكنك على سبيل المثال استخدام تابع mtime للحصول على آخر وقت تعديل الملف ومن ثم استخدام sort_by لترتيبها من الأقدم إلى الأحدث كما في المثال التالي: files = Dir['*'].sort_by{ |f| File.mtime(f) } أو يمكنك استخدام دالة ctim مع sort لترتيب جميع الملفات الموجودة في المجلد كما في المثال التالي لكن هذه الطريقة أطول قليلا من الطريقة الأولى: Dir.glob("*").sort {|a,b| File.ctime(a) <=> File.ctime(b) }
  23. يوجد عدة طرق لفعل ذلك في بايثون، فإذا كان الرابط ينتهي باسم الملف فقط (دون الأرقام عكس مثالك) فيمكنك في هذه الحالة استخدام توابع parse و path و split و last كما في المثال التالي: url_object = URI.parse(url) url_path = url_object.path the_file = url_path.split("/").last أما في حالة وجود معاملات وأرقام بعد اسم الملف (كما في مثالك) فيمكنك في هذه الحالة استخدام دوال parse و basename كما في المثال التالي: require 'uri' urli = URI.parse(url) the_file File.basename(urli.path)
  24. بالنسبة للخط السفلي الواحد الموجود في الأسماء (في الأصناف) فهو ببساطة للإشارة لبقية المبرمجين أن هذا التابع أو السمة يقصد به أن يكون خاصا، ومع ذلك، فإنه لن يتم فعل أي شيء مع الاسم نفسه. وبالنسبة للأسماء التي تحتوي على خطين سفليين فإنه يشيران ببساطة إلى التوابع والمتغيرات الأمثلة الخاصة (private instance variables and methods) أي لا يمكنك استخدامها خارج الصنف.
×
×
  • أضف...