المحتوى عن 'نمط'.



مزيد من الخيارات

  • ابحث بالكلمات المفتاحية

    أضف وسومًا وافصل بينها بفواصل ","
  • ابحث باسم الكاتب

نوع المُحتوى


التصنيفات

  • التخطيط وسير العمل
  • التمويل
  • فريق العمل
  • دراسة حالات
  • نصائح وإرشادات
  • التعامل مع العملاء
  • التعهيد الخارجي
  • التجارة الإلكترونية
  • الإدارة والقيادة
  • مقالات ريادة أعمال عامة

التصنيفات

  • PHP
    • Laravel
    • ووردبريس
  • جافاسكريبت
    • Node.js
    • jQuery
    • AngularJS
    • Cordova
  • HTML
    • HTML5
  • CSS
  • SQL
  • سي شارب #C
    • منصة Xamarin
  • بايثون
    • Flask
    • Django
  • لغة روبي
    • Sass
    • إطار عمل Bootstrap
    • إطار العمل Ruby on Rails
  • لغة Go
  • لغة جافا
  • لغة Kotlin
  • برمجة أندرويد
  • لغة Swift
  • لغة R
  • لغة TypeScript
  • سير العمل
    • Git
  • صناعة الألعاب
    • Unity3D
  • مقالات برمجة عامة

التصنيفات

  • تجربة المستخدم
  • الرسوميات
    • إنكسكيب
    • أدوبي إليستريتور
    • كوريل درو
  • التصميم الجرافيكي
    • أدوبي فوتوشوب
    • أدوبي إن ديزاين
    • جيمب
  • التصميم ثلاثي الأبعاد
    • 3Ds Max
    • Blender
  • نصائح وإرشادات
  • مقالات تصميم عامة

التصنيفات

  • خواديم
    • الويب HTTP
    • قواعد البيانات
    • البريد الإلكتروني
    • DNS
    • Samba
  • الحوسبة السّحابية
    • Docker
  • إدارة الإعدادات والنّشر
    • Chef
    • Puppet
    • Ansible
  • لينكس
  • FreeBSD
  • حماية
    • الجدران النارية
    • VPN
    • SSH
  • مقالات DevOps عامة

التصنيفات

  • التسويق بالأداء
    • أدوات تحليل الزوار
  • تهيئة محركات البحث SEO
  • الشبكات الاجتماعية
  • التسويق بالبريد الالكتروني
  • التسويق الضمني
  • التسويق بالرسائل النصية القصيرة
  • استسراع النمو
  • المبيعات
  • تجارب ونصائح

التصنيفات

  • إدارة مالية
  • الإنتاجية
  • تجارب
  • مشاريع جانبية
  • التعامل مع العملاء
  • الحفاظ على الصحة
  • التسويق الذاتي
  • مقالات عمل حر عامة

التصنيفات

  • الإنتاجية وسير العمل
    • مايكروسوفت أوفيس
    • ليبر أوفيس
    • جوجل درايف
    • شيربوينت
    • Evernote
    • Trello
  • تطبيقات الويب
    • ووردبريس
    • ماجنتو
  • أندرويد
  • iOS
  • macOS
  • ويندوز

التصنيفات

  • شهادات سيسكو
    • CCNA
  • شهادات مايكروسوفت
  • شهادات Amazon Web Services
  • شهادات ريدهات
    • RHCSA
  • شهادات CompTIA
  • مقالات عامة

أسئلة وأجوبة

  • الأقسام
    • أسئلة ريادة الأعمال
    • أسئلة العمل الحر
    • أسئلة التسويق والمبيعات
    • أسئلة البرمجة
    • أسئلة التصميم
    • أسئلة DevOps
    • أسئلة البرامج والتطبيقات
    • أسئلة الشهادات المتخصصة

التصنيفات

  • ريادة الأعمال
  • العمل الحر
  • التسويق والمبيعات
  • البرمجة
  • التصميم
  • DevOps

تمّ العثور على 10 نتائج

  1. هذا هو دليل Airbnb لنمط روبي. مستوحى من دليل GitHub ودليل Bozhidar Batsov. المسافات البيضاء المسافة الفارغة استخدم علامات التبويب (tabs) ذات المسافتين. يكون عمق when بقدر عمق case. case when song.name == 'Misty' puts 'Not again!' when song.duration > 120 puts 'Too long!' when Time.now.hour > 21 puts "It's too late" else song.play end kind = case year when 1850..1889 then 'Blues' when 1890..1909 then 'Ragtime' when 1910..1929 then 'New Orleans Jazz' when 1930..1939 then 'Swing' when 1940..1950 then 'Bebop' else 'Jazz' end ترصيف معاملات الدالة إما على نفس السطر أو سطر واحد لكل واحدة. # bad def self.create_translation(phrase_id, phrase_key, target_locale, value, user_id, do_xss_check, allow_verification) ... end # good def self.create_translation(phrase_id, phrase_key, target_locale, value, user_id, do_xss_check, allow_verification) ... end # good def self.create_translation( phrase_id, phrase_key, target_locale, value, user_id, do_xss_check, allow_verification ) ... end ضع علامة التبويب في التعبيرات المنطقية متعددة السطور. # bad def is_eligible?(user) Trebuchet.current.launch?(ProgramEligibilityHelper::PROGRAM_TREBUCHET_FLAG) && is_in_program?(user) && program_not_expired end # good def is_eligible?(user) Trebuchet.current.launch?(ProgramEligibilityHelper::PROGRAM_TREBUCHET_FLAG) && is_in_program?(user) && program_not_expired end على السطر لا تترك مسافة فارغة زائدة. عند تضمين التعليقات في السطر، اترك مسافة واحدة بين نهاية الشيفرة البرمجية وبداية تعليقك. # bad result = func(a, b)# we might want to change b to c # good result = func(a, b) # we might want to change b to c استخدم المسافات حول العوامل (operators)، أي بعد الفواصل، بعد النقطتين، الفاصلة المنقوطة، وبعد { وقبل }. sum = 1 + 2 a, b = 1, 2 1 > 2 ? true : false; puts 'Hi' [1, 2, 3].each { |e| puts e } لا تضع مسافة قبل الفاصلة. result = func(a, b) لا تضع مسافة دخل أنابيب (pipe) كتلة المعاملات، بل ضع واحد بين المعاملات في الكتلة وواحدة خارج أنابيب كتلة المعاملات. # bad {}.each { | x, y |puts x } # good {}.each { |x, y| puts x } لا تضع فراغات بين ! ومعاملاتها. !something لا تترك فارغات بعد (، [ وقبل )، ]. some(arg).other [1, 2, 3].length تجنب وضع المسافات عند استيفاء السلاسل النصية. # bad var = "This #{ foobar } is interpolated." # good var = "This #{foobar} is interpolated." لا تستخدم مسافة إضافية في النطاق الحرفي. # bad (0 ... coll).each do |item| # good (0...coll).each do |item| أسطر جديدة أضف سطر جديد بعد شروط if لكي تكون في عدة أسطر ولتساعد في التفريق بين الشروط والجسم. if @reservation_alteration.checkin == @reservation.start_date && @reservation_alteration.checkout == (@reservation.start_date + @reservation.nights) redirect_to_alteration @reservation_alteration end أضف سطر جديد بعد الشروط، الكتل، البيانات، إلخ… if robot.is_awesome? send_robot_present end robot.add_trait(:human_like_intelligence) لا تضع أسطر جديدة بين مناطق مسافات البادئة المختلفة (مثلا حول أجزاء الصنف أو الوحدة). # bad class Foo def bar # body omitted end end # good class Foo def bar # body omitted end end أضف سطر جديد واحد فقط بين الأساليب. def a end def b end استخدم سطر فارغ واحد للكسر بين البيانات لتقسيم الأساليب إلى فقرات منطقية داخليًا. def transformorize_car car = manufacture(options) t = transformer(robot, disguise) car.after_market_mod! t.transform(car) car.assign_cool_name! fleet.add(car) car end ضع سطر فارغ في نهاية كل ملف، ولا تضع أكثر من سطر فارغ. طول السطر اجعل كل سطر قابل للقراءة، ما لم يكن لديك سبب معين، ابقي طول الأسطر أقل من 100 حرف (أساس منطقي). التعليقات على الرغم من أن التعليقات متعبة عند كتابتها، إلا أنها مفيدة للغاية لإبقاء شيفرتك البرمجية قابلة للقراءة، وتصف القواعد التالية ما يجب التعليق عليه وأين، لكن تذكر: على الرغم أن التعليقات مهمة جدًا إلا أن أفضل شيفرة برمجية هي التي توثق ذاتها، فإعطاء أسماء معقولة للأنواع والمتغيرات أفضل بكثير من استخدام أسماء غامضة يجب عليك شرحها من خلال التعليقات. عند كتابة تعليقاتك، اكتب للجمهور: المساهم التالي سيحتاج إلى فهم شيفرتك البرمجية، كن سخيًا، فالتالي قد يكون أنت! تعليقات ملف/مستوى الصنف يجب أن يكون لكل تعريف صنف تعليق مصاحب يصف ما هو وكيف يُستخدم. يجب أن يملك الملف الذي لا يحتوي على أصناف أو يحتوي على أكثر من صنف واحد على تعليق في أعلاه يصف محتوياته. # Automatic conversion of one locale to another where it is possible, like # American to British English. module Translation # Class for converting between text between similar locales. # Right now only conversion between American English -> British, Canadian, # Australian, New Zealand variations is provided. class PrimAndProper def initialize @converters = { :en => { :"en-AU" => AmericanToAustralian.new, :"en-CA" => AmericanToCanadian.new, :"en-GB" => AmericanToBritish.new, :"en-NZ" => AmericanToKiwi.new, } } end ... # Applies transforms to American English that are common to # variants of all other English colonies. class AmericanToColonial ... end # Converts American to British English. # In addition to general Colonial English variations, changes "apartment" # to "flat". class AmericanToBritish < AmericanToColonial ... end يجب أن تملك جميع الملفات بما في ذلك ملفات البيانات والتهيئة، على تعليقات على مستوى الملف. # List of American-to-British spelling variants. # # This list is made with # lib/tasks/list_american_to_british_spelling_variants.rake. # # It contains words with general spelling variation patterns: # [trave]led/lled, [real]ize/ise, [flav]or/our, [cent]er/re, plus # and these extras: # learned/learnt, practices/practises, airplane/aeroplane, ... sectarianizes: sectarianises neutralization: neutralisation … تعليقات الدالة يجب أن يكون لكل إعلان دالة تعليقات تسبقها مباشرة تصف ما تقوم به الدالة وكيفية استخدامها، ويجب أن تكون هذه الملفات وصفية (‘تفتح الملف’) بدلا من أمرية (‘افتح الملف’). التعليقات التي تصف الدالة، لا تقول ما تقوم به الدالة، بشكل عام، هذه التعليقات لا تصف كيفية عمل الدالة، وبدلا من ذلك، يجب ترك هذه للتعليقات التي تتخلل الشيفرة البرمجية للدالة. يجب أن تذكر كل دالة ما هي المدخلات وما هي المخرجات، ما لم تستوف جميع المعايير التالية: غير مرئية من الخارج قصيرة جدا واضحة يمكنك استخدام أي تنسيق تريده، في الروبي، يوجد مخططين لتوثيق الدالة وهما TomDoc وYARD. يمكنك كتابة الأشياء بشكل موجز: # Returns the fallback locales for the_locale. # If opts[:exclude_default] is set, the default locale, which is otherwise # always the last one in the returned list, will be excluded. # # For example: # fallbacks_for(:"pt-BR") # => [:"pt-BR", :pt, :en] # fallbacks_for(:"pt-BR", :exclude_default => true) # => [:"pt-BR", :pt] def fallbacks_for(the_locale, opts = {}) ... end الكتلة والتعليقات المضمّنة المكان النهائي للتعليقات هو في الأجزاء الصعبة من التعليمات البرمجية، فعّلق عليها الآن إذا كان يجب عليك شرحها عند مراجعة الشيفرة البرمجية. يجب أن تحصل العمليات المعقدة على بضعة أسطر من التعليقات قبل بدء العمليات، بالنسبة للأجزاء الغير واضحة تحصل على تعليقات في نهاية السطر. def fallbacks_for(the_locale, opts = {}) # dup() to produce an array that we can mutate. ret = @fallbacks[the_locale].dup # We make two assumptions here: # 1) There is only one default locale (that is, it has no less-specific # children). # 2) The default locale is just a language. (Like :en, and not :"en-US".) if opts[:exclude_default] && ret.last == default_locale && ret.last != language_from_locale(the_locale) ret.pop end ret end من ناحية أخرى، لا تصف شيفرتك البرمجية، افترض أن الشخص الذي يقرأ شيفرتك البرمجية يعرف لغة البرمجة (وإن لم يكن ما تحاول القيام به) أفضل منك. وعلى سياق متصل: لا تستخدم كتل التعليقات، فلا يمكن أن تسبقها بمسافة وليس من السهل رؤيتها كالتعليقات المنتظمة. # bad =begin comment line another comment line =end # good # comment line # another comment line علامات الترقيم، الإملاء والنحو اهتم بعلامات الترقيم، الإملاء والنحو، فمن السهل قراءة التعليقات المكتوبة بشكل جيد من تلك المكتوبة بشكل سيء. ينبغي أن تكون التعليقات قابلة للقراءة كنص سردي، مع وجود الأحرف الكبيرة وعلامات الترقيم. في حالات كثيرة، الجمل الكاملة هي الأكثر قابلية للقراءة من جمل القصيرة. يمكن للتعليقات القصيرة، كالتعليقات في نهاية سطر شيفرة برمجية، أن تكون أقل رسمية، لكن يجب أن تكون متسقة مع نمطك. على الرغم من أنه من المحبط أن يشير مُراجِع شيفرتك البرمجية إلى أنك تستخدم فاصلة في مكان الفاصلة المنقوطة، لذا من المهم أن تحافظ شيفرتك البرمجية على مستوى عال من الوضوح وقابلية القراءة، وتساعد علامة الترقيم، الإملاء والنحو في تحقيق هذا الهدف. تعليقات TODO استخدم تعليقات TODO للشيفرات البرمجية المؤقتة، حل قصير الأجل أو جيد بما يكفي ولكن ليس مثال. يجب أن تتضمن TODO كلمة TODO بالأحرف الكبيرة متبوعة باسم الكامل للشخص الذي يمكنه توفير أفضل سياق حول المشكلة المشار إليها من قبل TODO بين قوسين. يمكنك إضافة النقطتين ومن ثم ضع تعليق يشرح ما يجب القيام به، فالغرض الرئيسي و أن يكون تنسيق TODO قابل للبحث لإيجاد الشخص الذي يمكنه توفير المزيد من التفاصيل عند الطلب، فـ TODO ليس التزاما من الشخص المشار إليه لإصلاح المشكلة، وبالتالي عند إنشاء TODO، تكتب في الغالب اسمك. # bad # TODO(RS): Use proper namespacing for this constant. # bad # TODO(drumm3rz4lyfe): Use proper namespacing for this constant. # good # TODO(Ringo Starr): Use proper namespacing for this constant. شيفرات برمجية بدون تعليقات لا تترك شيفرات برمجية بدون تعليقات في قاعدة الشيفرات البرمجية الخاصة بنا. الأساليب تعريف الأساليب استخدم def مع الأقواس عند وجود معاملات، واحذف الأقواس عندما لا يقبل الأسلوب المعاملات. def some_method # body omitted end def some_method_with_parameters(arg1, arg2) # body omitted end لا تستخدم المعاملات الموضعية الافتراضية، بل استخدم معاملات الكلمات الرئيسية (keyword) – إذا كانت موجودة، في الإصدار 2 من روبي أو أحدث - أو hash من الخيارات. # bad def obliterate(things, gently = true, except = [], at = Time.now) ... end # good def obliterate(things, gently: true, except: [], at: Time.now) ... end # good def obliterate(things, options = {}) options = { :gently => true, # obliterate with soft-delete :except => [], # skip obliterating these things :at => Time.now, # don't obliterate them until later }.merge(options) ... end تجنب الأساليب المتكونة من سطر واحد، على الرغم من انتشارها، إلا أنه توجد بعض الخصوصيات حول صياغتها تجعل استخدامها غير مرغوب فيه. # bad def too_much; something; something_else; end # good def some_method # body end دوال الاستدعاء استخدم الأقواس لدالة الاستدعاء: • إذا كانت الدالة ترجع قيمة. # bad @current_user = User.find_by_id 1964192 # good @current_user = User.find_by_id(1964192) إذا كان المعامل الأول إلى الدالة يستخدم الأقواس. # bad put! (x + y) % len, value # good put!((x + y) % len, value) لا تضع أبدًا مسافة بين اسم الدالة والقوس الأول. # bad f (3 + 2) + 1 # good f(3 + 2) + 1 تجنب الأقواس عند استدعاء الدالة إذا لم يكن يقبل أية معاملات. # bad nil?() # good nil? ستكون الأقواس اختيارية إذا لم تكن الدالة ترجع قيمة (أو لا نهتم بما ترجعه)، خاصة إذا كانت المعاملات في عدة أسطر، فالأقواس ستزيد من قابلية القراءة. # okay render(:partial => 'foo') # okay render :partial => 'foo' في كلا الحالتين: في حالة قبول الدالة لـ hash من الخيارات كمعامل أخير، لا تستخدم { } أثناء الاستدعاء. # bad get '/v1/reservations', { :id => 54875 } # good get '/v1/reservations', :id => 54875 التعبيرات الشرطيّة الكلمات الرئيسية المشروطة لا تستخدم then لـ if/unless متعددة الأسطر. # bad if some_condition then ... end # good if some_condition ... end لا تستخدم do لـ while أو until متعددة الأسطر. # bad while x > 5 do ... end until x > 5 do ... end # good while x > 5 ... end until x > 5 ... end إن الكلمات الرئيسية and وor وnot محظورة، فهي لا تستحق العناء، استخدم && و || و ! بدلا منها. يمكنك استخدام المعدِل if/unless عندما يكون الجسم بسيط، الشرط بسيط وكل شيء في سطر واحد، وخلافًا لذلك، تجنب استخدام if/unless. # bad - this doesn't fit on one line add_trebuchet_experiments_on_page(request_opts[:trebuchet_experiments_on_page]) if request_opts[:trebuchet_experiments_on_page] && !request_opts[:trebuchet_experiments_on_page].empty? # okay if request_opts[:trebuchet_experiments_on_page] && !request_opts[:trebuchet_experiments_on_page].empty? add_trebuchet_experiments_on_page(request_opts[:trebuchet_experiments_on_page]) end # bad - this is complex and deserves multiple lines and a comment parts[i] = part.to_i(INTEGER_BASE) if !part.nil? && [0, 2, 3].include?(i) # okay return if reconciled? لا تستخدم أبدًا unless مع else، أعد كتابتها مع الحالة الصحيحة الأولى أولًا. # bad unless success? puts 'failure' else puts 'success' end # good if success? puts 'success' else puts 'failure' end تجنب unless مع شروط متعددة. # bad unless foo? && bar? ... end # okay if !(foo? && bar?) ... end تجنب استخدام unless مع عامل مقارنة إذا كان يمكنك استخدام if مع عامل المقارنة المعاكس. # bad unless x == 10 ... end # good if x != 10 ... end # bad unless x < 10 ... end # good if x >= 10 ... end # ok unless x === 10 ... end لا تستخدم أقواس حول شرط if/unless/while. # bad if (x > 10) ... end # good if x > 10 ... end العامل الثلاثي تجنب استخدام العامل الثلاثي (?:) إلا في الحالات التي تكون فيها جميع التعبيرات بسيطة، ومع ذلك لا تستخدمه بدلا من if/then/else/end في الشروط المتكونة من سطر واحد. # bad result = if some_condition then something else something_else end # good result = some_condition ? something : something_else استخدم تعبير واحد لكل فرع في العامل الثلاثي، كذلك لا يجب أن يكون العامل الثلاثي متداخِلا، حيث يُفضّل استخدام بنية if/else في هذه الحالات. # bad some_condition ? (nested_condition ? nested_something : nested_something_else) : something_else # good if some_condition nested_condition ? nested_something : nested_something_else else something_else end تجنب الشروط المتعدّدة في العامل الثلاثي حيثُ يُفضّل استخدام الأخير مع الشروط الفردية. تجنب الأسطر المتعدّدة ?: (العامل الثلاثي)، واستخدم if/then/else/end بدلا منه. # bad some_really_long_condition_that_might_make_you_want_to_split_lines ? something : something_else # good if some_really_long_condition_that_might_make_you_want_to_split_lines something else something_else end الشروط المتداخلة تجنب استخدام الشروط المتداخلة لتدفق السيطرة. يُفضّل استخدام شرط الحراسة (guard clause) عندما يمكنك تأكيد بيانات غير صالحة، فشرط الحراسة هو عبارة مشروطة في أعلى الدالة التي ترّجع في أسرع ما يمكن. المبادئ العامة هي: إرجاع الفوري بمجرد معرفة أن الدالة لا يمكنها أن تفعل أي شيء أكثر من الذي فعلته. تقليل التداخل ومسافة البادئة في الشيفرة البرمجة عن طريق الإرجاع في وقت مبكّر. وهذا يجعل الشيفرات برمجية أسهل للقراءة وتطلّب أقل جهد عقلي في الجزء القراءة عند تتبّع فروع أخرى. ينبغي أن تكون التدفقات الجوهرية أو الأكثر أهمية هي الأقل مسافات البادئة. # bad def compute server = find_server if server client = server.client if client request = client.make_request if request process_request(request) end end end end # good def compute server = find_server return unless server client = server.client return unless client request = client.make_request return unless request process_request(request) end يُفضّل استخدام next في الحلقات بدلا من الكتل الشرطيّة. # bad [0, 1, 2, 3].each do |item| if item > 1 puts item end end # good [0, 1, 2, 3].each do |item| next unless item > 1 puts item end الصياغة لا تستخدم for إلا إذا كنت تعرّف السبب بالضبط، ففي أغلب الأحيان، يجب استخدام التكرارات (iterator) بدلا منها، فتعمل for بنفس شروط each (أي أنك ستضيف مستوى من المراوغة) لكن مع عيب صغير، فلا تُعرّف for نطاق جديد (على عكس each) وستظهر المتغيرات المعرّفة في كتلتها خارجها. arr = [1, 2, 3] # bad for elem in arr do puts elem end # good arr.each { |elem| puts elem } يفضل استخدام {...} بدلا من do...end للكتل المتكونة من سطر واحد، وتجنّب استخدام {...} للكتل المتكونة من عدة أسطر (فسلسلة عدة أسطر هو شيء قبيح)، واستخدم do...end دائما للتحكم في التدفّق وتعريف الأساليب (على سبيل المثال في Rakefile وفي بعض DSL) وتجنب استخدام do...end عند السلّسلة. names = ["Bozhidar", "Steve", "Sarah"] # good names.each { |name| puts name } # bad names.each do |name| puts name end # good names.each do |name| puts name puts 'yay!' end # bad names.each { |name| puts name puts 'yay!' } # good names.select { |name| name.start_with?("S") }.map { |name| name.upcase } # bad names.select do |name| name.start_with?("S") end.map { |name| name.upcase } سيجادلنا البعض ويقول أن السلّسلة للأسطر المتعددة تبدوا جيّدة عند استخدام {...}، لكن هل سُئلوا أنفسهم هل أن هذه الشيفرة البرمجية قابلة للقراءة حقا وما إذا كان يمكن استخلاص محتوى الكتلة إلى أساليب فعّالة. استخدام عوامل التعيين المختصرة كلما كان ذلك ممكنا. # bad x = x + y x = x * y x = x**y x = x / y x = x || y x = x && y # good x += y x *= y x **= y x /= y x ||= y x &&= y تجنب الفواصل المنقوطة باستثناء للتعريفات صنف السطر الواحد، وعندما يكون من الملائم استخدام فاصلة منقوطة، ينبغي أن تكون متاخمة مباشرةً للبيان الذي تنهيه: لا يجب أن يكون هنالك مسافة قبل الفاصلة المنقوطة. # bad puts 'foobar'; # superfluous semicolon puts 'foo'; puts 'bar' # two expressions on the same line # good puts 'foobar' puts 'foo' puts 'bar' puts 'foo', 'bar' # this applies to puts in particular استخدم :: للثوابت المرجعيّة فقط(ويشمل هذا الأصناف والوحدات) والبنائين (مثل Array() أو Nokogiri::HTML()) ولا تستخدم :: لاستدعاء الأسلوب العادي. # bad SomeClass::some_method some_object::some_method # good SomeClass.some_method some_object.some_method SomeModule::SomeClass::SOME_CONST SomeModule::SomeClass() تجنب استخدام return عندما تكون غير مطلوبة. # bad def some_method(some_arr) return some_arr.size end # good def some_method(some_arr) some_arr.size end لا تستخدم القيمة المُرجّعة من = في الجمل الشرطيّة. # bad - shows intended use of assignment if (v = array.grep(/foo/)) ... end # bad if v = array.grep(/foo/) ... end # good v = array.grep(/foo/) if v ... end استخدم ||= كما تريد لتهيئة المتغيرات. # set name to Bozhidar, only if it's nil or false name ||= 'Bozhidar' لا تستخدم ||= لتهيئة المتغيرات المنطقيّة، (فكر في ما سيحدث إذا كانت القيمة الحالية تساوي false). # bad - would set enabled to true even if it was false enabled ||= true # good enabled = true if enabled.nil? استخدم .call الصريحة عند استدعاء lambda. # bad lambda.(x, y) # good lambda.call(x, y) تجنب استخدام متغيرات الخاصة على نمط بيرل (مثل $0-9، KaTeX parse error: Expected 'EOF', got '،' at position 1: ،̲ الخ)، فهي مشفّ…PROGRAM_NAME`. استخدم الاختصار &: عندما تأخذ كتلة الأسلوب معامل واحد فقط ويعمل الجسم على قراءة سمة أو استدعاء أسلوب دون معاملات. # bad bluths.map { |bluth| bluth.occupation } bluths.select { |bluth| bluth.blue_self? } # good bluths.map(&:occupation) bluths.select(&:blue_self?) يفضل استخدام some_method على self.some_method عند استدعاء دالة في المثيل الحالي. # bad def end_date self.start_date + self.nights end # good def end_date start_date + nights end في هذه الحالات الثلاثة، يجب عليك استخدام self. : عند تعريف أسلوب صنف: def self.some_method. عندما تكون self هي نموذج ActiveRecord ويكون الجانب الأيسر هو استدعاء أسلوب تعيين بما في ذلك تعيين سمة: self.guest = user. الإشارة إلى صنف مثيل الحالي: self.class. عند تعريف كائن من أي نوع قابل للتحويل وتريده أن يكون ثابت، تأكد من استدعاء freeze عليه، ومن الأمثلة الشائعة على ذلك هي السلاسل النصية، المصفوفات، وhash. سبب ذلك أن ثوابت روبي هي أنواع قابلة للتحويل، وستتأكد من عدم قابليتهم للتحويل عند استدعاء freeze عليهم لأنه سيصدر استثناء عند محاولة تعديلهم ، وبالنسبة إلى السلاسل النصية، سيسمح هذا بالتعامل معهم لنسخ روبي الأقدم من 2.2. # bad class Color RED = 'red' BLUE = 'blue' GREEN = 'green' ALL_COLORS = [ RED, BLUE, GREEN, ] COLOR_TO_RGB = { RED => 0xFF0000, BLUE => 0x0000FF, GREEN => 0x00FF00, } end # good class Color RED = 'red'.freeze BLUE = 'blue'.freeze GREEN = 'green'.freeze ALL_COLORS = [ RED, BLUE, GREEN, ].freeze COLOR_TO_RGB = { RED => 0xFF0000, BLUE => 0x0000FF, GREEN => 0x00FF00, }.freeze end التسمية استخدم snake_case للأساليب والمتغيرات. استخدم حالة الجمل (CamelCase) للأصناف والوحدات. (احتفظ بالاختصارات مثل HTTP وRFC وXML بحالة أحرف كبيرة). استخدم SCREAMING_SNAKE_CASE للثوابت الأخرى. يجب أن تنتهي الأساليب الإسنادية (التي ترجع قيمة منطقية) بعلامة استفهام. (على سبيل المثال Array#empty?). يجب أن تنتهي أسماء الأساليب التي يُحتمل أن تكون خطرة (مثل الأساليب التي تعدل self أو المعاملات، exit!، الخ) بعلامة تعجب، ويجب أن تتواجد الأساليب الخطرة (bang) إذا لم تتواجد الأساليب غير الخطرة (non-bang) - للمزيد من المعلومات -. سمّي متغيرات الرمي (throwaway) _. version = '3.2.1' major_version, minor_version, _ = version.split('.') الأصناف تجنب استخدام متغيرات (@@) بسبب سلوكهم السيئ في الميراث. class Parent @@class_var = 'parent' def self.print_class_var puts @@class_var end end class Child < Parent @@class_var = 'child' end Parent.print_class_var # => will print "child" كما ترى أنه جميع الأصناف في التسلسل الهرمي للصنف تتشارك في متغير صنف واحد، ويجب أن تُفضّل متغيرات مثيل الصنف على متغيرات الصنف. استخدم def self.method لتعريف الأساليب المنفردة، وسيجعل هذا الأساليب أكثر مقاومة لتغييرات إعادة الهيكلة. class TestClass # bad def TestClass.some_method ... end # good def self.some_other_method ... end • تجنب استخدام `class << self` إلا عند الضرورة، على سبيل المثال، موصول مفرد (`single accessors`) وسمات مستعارة (`aliased attributes`). class TestClass # bad class << self def first_method ... end def second_method_etc ... end end # good class << self attr_accessor :per_page alias_method :nwo, :find_by_name_with_owner end def self.first_method ... end def self.second_method_etc ... end end ضع مسافة البادئة للأساليب public، protected وprivate بقدر تعريف الأسلوب الذي ينتمون إليه، واترك سطر فارغ واحد أعلاهم وأسفلهم. class SomeClass def public_method # ... end private def private_method # ... end end الاستثناءات لا تستخدم الاستثناءات لتدفق التحكم. # bad begin n / d rescue ZeroDivisionError puts "Cannot divide by 0!" end # good if d.zero? puts "Cannot divide by 0!" else n / d end تجنب إنقاذ (rescue) صنف Exception. # bad begin # an exception occurs here rescue Exception # exception handling end # good begin # an exception occurs here rescue StandardError # exception handling end # acceptable begin # an exception occurs here rescue # exception handling end لا تحدد RuntimeError في نسخة المعاملين من raise، ومن الأفضل استخدام خطأ الأصناف الفرعية من أجل الوضوح وشرح خطأ بشكل أفضل. # bad raise RuntimeError, 'message' # better - RuntimeError is implicit here raise 'message' # best class MyExplicitError < RuntimeError; end raise MyExplicitError يُفضّل توفير صنف استثناء والرسالة كمعاملين إلى raise بدلا من مثيل استثناء. # bad raise SomeException.new('message') # Note that there is no way to do `raise SomeException.new('message'), backtrace`. # good raise SomeException, 'message' # Consistent with `raise SomeException, 'message', backtrace`. تجنب استخدام rescue في شكل المُعدّل. # bad read_file rescue handle_error($!) # good begin read_file rescue Errno:ENOENT => ex handle_error(ex) end المجموعات Collections يفضّل استخدام map على collect. يفضّل استخدام detect على find، فاستخدام find غامض بسبب أسلوب find الخاصة بـ ActiveRecord وسيُظهر detect على أنك تعمل مع مجموعة روبي وليس كائن AR. يُفضّل استخدام reduce على inject. يُفضّل استخدام size على length و count لأسباب تتعلّق بالأداء. يفّضل استخدام تدوين الإنشاء (creation notation) للمصفوفة الحرفيّة وللـ hash إلا إذا كنت بحاجة إلى تمرير معاملات إلى منشئيها. # bad arr = Array.new hash = Hash.new # good arr = [] hash = {} # good because constructor requires parameters x = Hash.new { |h, k| h[k] = {} } يُفضّل استخدام Array#join على Array#* لأسباب تتعلّق بالوضوح. # bad %w(one two three) * ', ' # => 'one, two, three' # good %w(one two three).join(', ') # => 'one, two, three' استخدم الرموز (symbols) بدلا من السلاسل النصية كمفاتيح للـ Hash. # bad hash = { 'one' => 1, 'two' => 2, 'three' => 3 } # good hash = { :one => 1, :two => 2, :three => 3 } على نحو مماثل، استخدم رموز واضحة بدلا من رموز السلاسل النصية عندما يكون ذلك ممكنًا. # bad :"symbol" # good :symbol استخدم Hash#key? بدلا من Hash#has_key? وHash#value? بدلا من Hash#has_value?.فوفقًا لماتز (Matz)، تعتبر الأشكال الأطول مُهملة. # bad hash.has_key?(:test) hash.has_value?(value) # good hash.key?(:test) hash.value?(value) استخدم hash متعدّد الأسطر لأنه يجعل التعليمات البرمجية أكثر قابليّة للقراءة واستخدم الفواصل الزائدة للتأكد من أن تغييرات المعامل لا تتسبب بأسطر diff الغريبة عندما لم يتغيّر المنطق خلاف ذلك. hash = { :protocol => 'https', :only_path => false, :controller => :users, :action => :set_password, :redirect => @redirect_url, :secret => @secret, } استخدم الفاصلة الزائدة في المصفوفة التي تمتد لأكثر من سطر واحد. # good array = [1, 2, 3] # good array = [ "car", "bear", "plane", "zoo", ] السلاسل النصية يُفضّل استخدام استيفاء السلسلة النصية (string interpolation) بدلا من سلّسلة السلسلة النصية: # bad email_with_name = user.name + ' <' + user.email + '>' # good email_with_name = "#{user.name} <#{user.email}>" وعلاوة على ذلك، لا تنسى استيفاء نمط روبي 1.9، لنفترض أنك تُنشئ مفاتيح ذاكرة التخزين المؤقت كالتالي: CACHE_KEY = '_store' cache.write(@user.id + CACHE_KEY) يُفضّل استخدام استيفاء السلسلة النصية (string interpolation) بدلا من سَلسلة السِلسلة النصية: CACHE_KEY = '%d_store' cache.write(CACHE_KEY % @user.id) تجنب استخدام String#+ عندما تحتاج إلى إنشاء قطع بيانات كبيرة، واستخدم بدلا من ذلك String#<<. تحور السَلْسلة مثيل السِلسلة النصية في مكانها وهي أسرع دائما من String#+، والذي ينشئ مجموعة من كائنات السلسلة النصية الجديدة. # good and also fast html = '' html << '<h1>Page title</h1>' paragraphs.each do |paragraph| html << "<p>#{paragraph}</p>" end استخدم \ في نهاية السطر بدلا من + أو << لسَلسلة السلاسل النصية متعددة الأسطر. # bad "Some string is really long and " + "spans multiple lines." "Some string is really long and " << "spans multiple lines." # good "Some string is really long and " \ "spans multiple lines." التعبيرات العادية تجنب استخدام $1-9 لأنه من الصعب متابعة ما يحتويه، واستخدم بدلا منه المجموعات المسماة. # bad /(regexp)/ =~ string ... process $1 # good /(?<meaningful_var>regexp)/ =~ string ... process meaningful_var كن حذرا مع ^ و $ لأنها تطابق بداية/نهاية السطر وليس نهايات السلسلة النصية، فإذا أردت مطابقة كامل السلسلة النصية فاستخدم: \A و\z. string = "some injection\nusername" string[/^username$/] # matches string[/\Ausername\z/] # don't match استخدم المُُعدّل x لتعبيرات (regexps) المعقدة، فهذا سيجعلها أكثر قابلية للقراءة ويمكنك إضافة بعض التعليقات المفيدة، فقط كن حذرا لأنه سيتجاهل الفراغات. regexp = %r{ start # some text \s # white space char (group) # first group (?:alt1|alt2) # some alternation end }x محارف النسبة المئوية يفضل استخدام الأقواس على الأقواس المجعدة، الأقواس المربّعة، أو الأنابيب (pipes) عند استخدم محددات محرف % للتناسق ولأن سلوك محارف % أقرب إلى استدعاء الأسلوب منه إلى البدائل. # bad %w[date locale] %w{date locale} %w|date locale| # good %w(date locale) استخدم %w بحريّة. STATES = %w(draft open closed) استخدم %() للسلاسل النصية المتكونة من سطر واحد والتي تتطلّب الاستيفاء (interpolation) وعلامات الاقتباس المزدوجة المضمّنة ، وبالنسبة للسلاسل النصية المتكونة من عدة أسطر، يُفضل استخدام heredocs. # bad - no interpolation needed %(<div class="text">Some text</div>) # should be '<div class="text">Some text</div>' # bad - no double-quotes %(This is #{quality} style) # should be "This is #{quality} style" # bad - multiple lines %(<div>\n<span class="big">#{exclamation}</span>\n</div>) # should be a heredoc. # good - requires interpolation, has quotes, single line %(<tr><td class="name">#{name}</td>) استخدم ٪ r فقط للتعبيرات العادية التي تتطابق مع أكثر من حرف /. # bad %r(\s+) # still bad %r(^/(.*)$) # should be /^\/(.*)$/ # good %r(^/blog/2011/(.*)$) تجنب استخدام %x إلا إذا أردت استدعاء أمر مع علامة الاقتباس الخلفية (`) - وهو أمر مستبعد إلى حد ما -. # bad date = %x(date) # good date = `date` echo = %x(echo `date`) ريلز عند الرجوع فورا بعد استدعاء render أو redirect_to، ضع return في السطر التالي وليس في نفس السطر. # bad render :text => 'Howdy' and return # good render :text => 'Howdy' return # still bad render :text => 'Howdy' and return if foo.present? # good if foo.present? render :text => 'Howdy' return end نطاقات عند تعريف نطاقات نموذج ActiveRecord، لِفْ العلاقة بـ lambda، وخلافًا لذلك ستفرض العلاقة اتصال قاعدة بيانات في وقت تحميل الصنف (مثيل بدء التشغيل). # bad scope :foo, where(:bar => 1) # good scope :foo, -> { where(:bar => 1) } كن منسجمًا إذا كنت تعدل شيفرة برمجية، فخذ بضعة دقائق لإلقاء نظرة على الشيفرة البرمجية الموجودة وحدد أسلوبها، فإذا كانوا يستخدمون مساحات فارغة حول جميع عواملها الرياضية، فقم بذلك أيضا، وإذا كانت تمتلك التعليقات صناديق صغيرة من علامات hash حولها، فاجعل تعليقاتك كذلك أيضا. الهدف من امتلاك مبادئ توجيهية للنمط هي الحصول على مفردات مشتركة من الشيفرات البرمجية حتى يتمكن الناس من فهم الذي تريد قوله بدلا من كيف تقوله، ونحن نعرض هنا قواعد النمط العالمية حتى يعرف الناس المفردات، لكن النمط المحلي مهم أيضا، فإذا كانت الشيفرة البرمجية التي تضيفها تختلف بشكل كبيرا عن الشيفرات البرمجية التي حولها فستجعل قراءة الشيفرة البرمجية صعبة لذلك تجنب ذلك. ترجمة لدليل Ruby Style Guide من Airbnb على GitHub
  2. في هذا الدرس سنتعلم كيفية تصميم نقش ثمرة الفراولة في كوريل درو باستخدام الأدوات الأساسية كالأشكال الأساسية، أداة المضلعات ، أداة المستطيل، وتكرار النمط. الخطوة الأولى افتح مستند ملف جديد في كوريل درو ولنبدأ بورقة جديدة بحجم 600×600 بكسل. الخطوة الثانية في شريط الأدوات انقر على أداة الشكل الأساسي واختر شكل قطرة ماء من قائمة الأشكال المثالية ثم اسحب الشكل إلى مساحة العمل. انقر على على أيقونة الانعكاس العمودي في شريط الخصائص. اذهب إلى قائمة Arrange>Convert to Curve أو اضغط على الاختصار Ctrl+Q. ثم انقر على الاختصار F10 لتفعيل أدوات الأشكال ثم حدّد النقطة السفلية واختر أيقونة Made Node Symmetrical لجعل النقطة متناظرة. حرّك النقطة للأسفل حتى يظهر الشكل كما في الصورة. الخطوة الثالثة انقر على مفتاح F10 لتفعيل أدوات الأشكال. اختر النقطة العلوية وانقر على أيقونة Make Node A Cusp في شريط الخصائص. اذهب إلى القائمة Window>Color Palletes>Default CMYK Pallete في لوحة الألوان اختر اللون الأرجواني لتعبئة الشكل بهذا اللون وانقر بالزر الأيمن على المربع الأبيض لإزالة الخطوط الخارجية. الخطوة الرابعة اختر أداة المضلعات ضمن مجموعة أدوات Freehand لرسم ورقة الثمرة. الخطوة الخامسة اذهب إلى أدوات الأشكال مرة أخرى واختر أيقونة Convert Line to Curve من شريط الخصائص. لون الشكل باللون الأخضر. أزل لون الخطوط الخارجية. وأنشئ الورقة كما في الصورة. الخطوة السادسة اختر أداة المستطيلات بالنقر على مفتاح F6 وارسم ساق النبتة كما في الصورة. لوّنه باللون الأخضر. والخطوط الخارجية بلا لون. اختر أداة التحديد Pick وحدّد الورقة والساق ثم انقر على أيقونة Weld من شريط الخصائص لتوحيد العنصرين. الخطوة السابعة سنقوم برسم البذار الآن. انقر على أدوات الأشكال الأساسية ثم اختر شكل قطرة الماء من القائمة واصنع نسخًا مختلفة من البذار. وباستخدام أداة التحديد حدّد جميع العناصر. اجمعهم معًا في مجموعة واحدة عبر الاختصار Ctrl+G. الخطوة الثامنة انقر نقرًا مزدوجًا على أيقونة أداة المستطيل لإنشاء خلفية بناءً على حدود الصفحة. لوّنها باللون C= 2, M= 41, Y= 13, K= 0 وأزِل الحدود الخارجية. اختر أداة الشفافية التفاعلية Interactive Transparency ثم اختر الخيار Uniform من القائمة. الخطوة التاسعة باستخدام أداة التحديد ضع الشكل النهائي لثمرة الفراولة في الموقع x= 0 px, y= 600 px. الخطوة العاشرة اذهب إلى القائمة Edit>Step and Repeat أو من خلال الاختصار Ctrl+Shift+D. حدّد المسافة الأفقية عند 600 بكسل والعمودية عند 0. عدد النسخ 1. انقر على زر Apply. حدّد ثمرتي الفراولة بأداة التحديد. وكرّر الخطوة الأخيرة. ضع حجمًا مختلفًا ودوّرها أو قم بتغيير الألوان. واملأ المساحة الفارغة قدر الإمكان. الخطوة الحاديةعشرة افتح لوحة إدارة العناصر من خلال القائمة Window>Dockers>Object Manager حدّد جميع ثمرات الفراولة باستخدام أداة التحديد ثم اضغط الاختصار Ctrl+G. الخطوة الثانيةعشرة اذهب إلى القائمة Effects>PowerClip >Place Inside Container استخدم السهم السميك للنقر على الخلفية. جميع العناصر يجب أن توضع داخل الخلفية. الخطوة الثالثةعشر افتح لوحة تحويل المواقع Transformation Position. وسيكون نقش الفراولة كما يلي. ترجمة -وبتصرف- لمقال How to Make Strawberry Pattern in CorelDRAW لصاحبته Yessi Jie
  3. سأعلمكم في هذا الدرس كيفية تصميم نمط تكراري ملكي إبداعي باستخدام برنامج أدوبي إليستريتور. الخطوة 1 افتح برنامج الإليسريتور ثم افتح ملفًّا جديدًا عبر الاختصار Ctrl+N أو من القائمة File > New اختر أبعاد لوح الرسم بالقيم التالية 612× 792. أو كما تريد. الخطوة 2 اختر أداة القلم Pen Tool بالمفتاح P أو من شريط الأدوات وارسم الشكل التالي. الخطوة 3 أزِل لون الحدود واختر أداة التدرج اللوني Gradient Tool بالاختصار G وقم بإعداد الألوان كما يلي. الخطوة 4 حدّد هذا الشكل وقم بنسخه بالاختصار Ctrl+C وألصقه في المقدمة Ctrl+F. ثم قم بإعداد ألوان التدرج اللوني كما يلي. الخطوة 5 الآن ضع الشكلين بجانب بعضهما كما يلي. الخطوة 6 حدّد كلا الشكلين ثم اذهب إلى القائمة Object >Pattern>Make ستظهر لك لوحة الخيارات. قم بتعديل هذه الخيارات وتجهيزها كما يلي. احفظها بالضغط على زر Done من الشريط العلوي. الخطوة 7 أخيرًا. اختر أداة المستطيلات Rectangle Tool من الاختصار M أو من شريط الأدوات ثم ارسم مستطيلًا. حدّد المستطيل الجديد ثم طبّق النمط (النقش) الذي صممناه للتو من لوحة الحوامل Swatches. خطوة إضافية من الممكن زيادة العمق على ألوان التصميم لجعلها أكثر حيوية عبر نسخ شكل التدرج الخطي ووضعه فوق الشكل الملوّن ثم فتح لوحة الشفافية من خلال الاختصار Ctrl+Shift+F10 وتغيير خصائص المزج إلى Overlay ما يضيف المزيد من العمق للألوان. وهذه هي النتيجة النهائية. ترجمة -وبتصرّف- للمقال: How to Create A Captivating Royal Pattern in Adobe Illustrator لصاحبه: Bijutoha
  4. سأعلمكم في هذا الدرس كيفية تصميم نقوش وأنماط متموجة باستخدام برنامج الإليستريتور. 1. أنشئ شبكة باستخدام أداة Rectangular Grid Tool. والنتيجة ستكون كما يلي. 2. حدّد الشبكة وأنشئ غلاف شبكي من خلال القائمة Object > Envelope Distort > Make with Mesh اختر نفس عدد الأعمدة والصفوف. النتيجة. 3. استخدم أداة التحديد المباشر Direct Selection Tool وحدّد نقاط العمود الأيمن لشبكة التغطية. ثم حرّكها وحدّد نقاط العمود التالي وحرّكها وهكذا حتى تحصل على الشكل التالي. 4. مجدّدًا استخدم أداة التحديد المباشر لتحديد نقاط أحد الصفوف من شبكة التغطية. وقم بذات العملية لتحصل على الشكل التالي. 5. والآن حدّدها جميعًا وأنشئ نقشًا من خلال القائمة Object > Pattern > Make ثم احفظه. 6. أخيرًا طبّق هذا النقش على أي شكل من لوحة الحوامل Swatches Panel. مبروك حصلت على نقش متميز متموج. ترجمة -وبتصرّف- للمقال: How to Create Wave or Moire Pattern in Illustrator لصاحبه: Bijutoha
  5. نستطيع الولوج إلى نمط القناع السريع Quick Mask عبر النقر على أيقونته الموجودة أسفل شريط الأدوات على يسار شاشة البرنامج. يمكنك تحديد أي جزء من الصورة بسهولة كبيرة لمسحها أو تعديلها عبر استخدام نمط القناع السريع. يمكننا البدء باستخدام هذا النمط عبر النقر على الأيقونة في شريط الأدوات أو بالضغط على حرف Q من لوحة المفاتيح. الآن اختر أداة الفرشاة Brush Tool أو اضغط على الاختصار Shift+B في لوحة المفاتيح واجعل حجم وقساوة الفرشاة 90% أو كما يناسبك فإذا اخترت قساوة الفرشاة 100% فإن الحواف ستكون قاسية جدًّا. أما إذا اخترت قساوة الفرشاة 0% فإن الحواف ستبدو متلاشية Fade Out ومتداخلة مع المحيط. أخيرًا حدّد لون المقدمة اللون الأسود لأن هذا اللون سيسمح بتحديد القناع على المساحات المطلوبة بينما اللون الأبيض سيمسح ميزة القناع من على المساحات لذلك اجعل لون المقدمة اللون الأسود ثم ابدأ بالرسم كما في الصورة التالية. يمكن تعديل مساحات القناع التي رسمتها باستخدام أدوات الفرشاة، سطل الدهان أو أية أداة تحديد. انظر في الصورة التالية حيث قمتُ بتعديل أو مسح مساحة من القناع الأحمر التي وضعتها ضمن نمط القناع السريع. هنا استخدمت أداة الممحاة Eraser Tool ولاحظ أن اللون الأمامي مازال اللون الأسود. يمكنك أيضًا تعديل أو إضافة مساحات قناع إضافية باستخدام أداة الممحاة أيضًا عبر جعل اللون الأمامي اللون الأبيض. فكما تشاهد في الصورة التالية قمتُ بإضافة مساحات إضافية باستخدام الممحاة مع جعل اللون الأمامي اللون الأبيض ضمن نمط القناع السريع. وبعد الانتهاء من رسم القناع المطلوب عليك بالعودة إلى الوضع الطبيعي عبر النقر على زر أيقونة القناع السريع مجدّدًا أو بالضغط على مفتاح Q في لوحة المفاتيح. ما سنراه في الصورة في الأعلى هو وجود تحديد ظاهر حول جميع المناطق التي لم نشملها بالقناع ضمن نمط القناع السريع. بما أننا نريد تحديد الأجزاء الأخرى بالعكس سنقوم بعكس التحديد عبر الاختصار Ctrl/Cmd+Shift+I أو من القائمة Select > Inverse والآن امسح ما هو مُحدّد لوضع لون أو خلفية جديدة. ملاحظة: كمحرّر صور أعلم كم أن ميزة نمط القناع السريع أساسية جدًّا لكل محرري الصور حيث يستخدمها معظمهم للتحقق من عملية الرسم الصحيح للمسار باستخدام أداة القلم أو غيرها من الأدوات للحصول على نتائج مثالية وبدون أية أخطاء. يمكنك تعديل اللون الأحمر الخاص بنمط القناع السريع إلى لون آخر. انقر نقرًا مزدوجًا على أيقونة نمط القناع السريع ليظهر لك صندوق أدوات هذا النمط. جرّب تغيير اللون والتعتيم وانظر للنتيجة. ترجمة -وبتصرّف- للمقال: About Quick Mask Mode in Photoshop لصاحبه: Bijutoha
  6. قبل أن نذهب إلى الموضوع الرئيسيّ للمقال، سأعطيك لمحة قصيرة عن مشاكل التصميم التي قد تواجهها. لقد اشتكى لي أحد زبائني بأن بعض الصفحات تفتح ببطء شديد. وعندما أقول ببطء شديد، فإنني أعني ذلك! فقررت أن أصحح تلك الصفحة (بعمل debugging)، وما رأيته قد صدمني. لقد أظهر لي قسم الاستعلامات (queries) أن تلك الصفحة كانت تنفَّذ بعد القيام بكم هائل من الاستعلامات تعدّى 16500 استعلامًا!! لقد وجدت أن جزءًا من النصّ البرمجي هو سبب تلك المشكلة. لقد كانت هناك ثلاث حلقات foreach تستعلم عن خاصيّة والخواص الفرعيّة التابعة لها. لقد كانت تعمل جيدًا إلى أن صار في قاعدة البيانات 5500 عنصرًا. وفيما يلي ما كان يحدث: $main_object = MainObject::all(); foreach($main_object as $object) { echo $object->some_property; foreach($object->related_object as $related) { echo $related->some_property; echo $related->another_property; } foreach($object->another_related as $another) { echo $another->some_property; echo $another->another_property; } }إذا كان الاستعلام ;()main_object = MainObject::all$ يعيد 5500 نتيجة، فستعيد حلقة foreach الأولى ذلك القدر أيضًا، وكذلك بالنسبة للثانية والثالثة. باستخدام ORM، كثيرًا ما يقع المبرمجون في فخّ كتابة استعلامات قواعد بيانات غير كفؤة، وتجعلها ORM أكثر صعوبة في الاكتشاف. تُسمّى هذه المشكلة بمشكلة N+1 (بالإنجليزيّة N+1 problem). وأظن المطور السابق لم يكن على علم بذلك. ولتفادي هذه المشكلة، نستخدم التحميل الحثيث (eager loading). ما هو التحميل الحثيث؟لتبسيط الأمر، التحميل الحثيث طريقة تُعنى بعمل كل شيء عند الطلب. وهذه الطريقة أيضًا على العكس تمامًا من التحميل الكسول (lazy loading) عندما ننفذ المهام عند الحاجة. يساعدنا التحميل الحثيث على تجنب مشكلات الأداء، كما رأيت في مثالي أعلاه. ستفهم الأمر أكثر من خلال مثال، لذا لنتخيل الوضع التالي: لدينا نموذج علاقة هيئة محسّنة (بالإنجليزيّة: Enhanced Entity Relationship، واختصارًا EER)، بثلاث هيئات، كلّ منها مرتبطة بالأخرى. يمكنك أن تقرأ EER كما يلي: يمكن لكل عضو أن يملك العديد من المحلات، ولكن المحل الواحد ملك لعضو واحد فقط. يمكن للمحل الواحد أن يحوي العديد من المنتجات، ولكن المنتج الواحد لا يكون إلّا في محل واحد. الخطوة التالية هي إنشاء نماذج Eloquent لهذه الهيئات: العضو: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Member extends Model { protected $fillable = ['username', 'email', 'first_name', 'last_name']; public function stores() { return $this->hasMany('App\\Store'); } }المحلّ: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Store extends Model { protected $fillable = ['name', 'slug', 'site', 'member_id']; public function member() { return $this->belongsTo('App\\Member'); } public function products() { return $this->hasMany('App\\Product'); } }المُنتَج: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Product extends Model { protected $fillable = ['name', 'short_desc', 'long_desc', 'price', 'store_id', 'member_id']; public function store() { return $this->belongsTo('App\\Store'); } }تخيّل أنك تبني تطبيقًا يسمح لمستخدميك أن يُنشئوا محالّهم التجاريّة الخاصّة. يمكن للمستخدمين –كما هو الحال بالنسبة للمحال الأخرى كلها طبعًا– أن يُنشئوا منتَجات عديدة. وأيضًا، يمكننا أن ننشئ صفحة واحدة تعرض كل المحلات وأفضل المنتجات لكل محلّ. شيء من قبيل هذا: يمكن أن ينتهي بك المطاف إلى الحصول على شيء كهذا في المتحكّم لديك: <?php namespace App\Http\Controllers; use App\Repositories\StoreRepository; class StoresController extends Controller { protected $stores; function __construct(StoreRepository $stores) { $this->stores = $stores; } public function index() { $stores = $this->stores->all(); return \View::make('stores.index')->with('stores', $stores); } }وفي العرض الذي ستقدم فيه تلك البيانات: @foreach($stores as $store) <h1>{{ $store->name }}</h1> <span>Owner: {{ $store->member->first_name . ' ' . $store->member->last_name }}</span><br> <h2>Products:</h2> @foreach($store->products as $product) <h3>{{$product->name}}</h3> <span>{{$product->short_desc}}</span><br/><br/> <span>Price: {{$product->price}}</span><br/> <?php Debugbar::info('Product displayed'); ?> @endforeach <br/>========================<br/> @endforeachوالنتيجة كالتالي: ومن اجل هذا المثال، زوّدت قاعدة البيانات بخمس مستخدمين، وثلاثة محالّ، وأربعة منتَجات. يقوم الاستعلام الأول باستدعاء كل المحال من قاعدة البيانات، وهذا هو الجزء +1 من مشكلة N+1. في هذا المثال تحديدًا، حرف N يمثّل عدد المحلات التي أرجعها لنا الاستعلام الأول، حيث أنها تمثل عدد المرات التي سنقوم فيها بالاستعلام select * from على جدولي products و members. وبما أن لدينا 3 محلات، فسنستعلم 3 مرات على جدول المستخدمين، وثلاث مرات على جدول المنتجات. وفي النهاية، قمنا بتنفيذ الاستعلامات بعدد مرات قدره 3+3+1. تخيل الآن ما الذي يمكن أن يحدث لو كان لديك 5000 أو 10000 محل؟ سيكون لديك في تلك الحالة عشرة آلاف إلى عشرين ألف استعلام في كل مرة يقوم فيها أحد المستخدمين بزيارة الصفحة. وماذا لو كانت لديك عشرة آلاف أو مئة ألف زيارة كلّ أربع وعشرين ساعة؟ هذا كابوس! من الواضح الآن أن هذا التوجّه مدمّر للأداء. وبغض النظر عن نوع قاعدة البيانات التي تستخدمها، وعن مدى قوة الخادم الذي لديك، فستصل دائمًا إل تلك النقطة التي يقف فيها العتاد القوي لديك عاجزًا. يمكنك أن تحسّن الأداء بعمل cache لهذه الاستعلامات، باستخدام Redis على سبيل المثال. سيؤدي هذا الغرض، ولكن لبعض الوقت فقط. وبتلك الطريقة، أنت فقط تؤجل النهاية الحتميّة التي ستكلّفك الكثير من المال والوقت، وفي الغالب ستفقد بعض الزبائن، أو أنّ قاعدة بياناتك ستضعف كثيرًا. وهنا يأتي التحميل الحثيث لينقذك من هذه الورطة. استخدام التحميل الحثيث في Laravel بسيط للغاية. العلاقات التي ترغب أن يتم تحميلها بشكل حثيث تحددها في طريقة with كما يلي: $stores = Store::with('member','products')->get();الآن، بدل استخدام 7 استعلامات، قلّلنا باستخدام التحميل الحثيث عدد الاستعلامات إلى 3 فقط: وستكون ثلاثة استعلامات حتى ولو كانت لديك عشرة آلاف مدخلة في جدول المحلات. وكما ترى، فإن الاستخدام السليم للتحميل الحثيث يمكن أن يؤدي إلى تحسين أداء تطبيقك بقدر هائل. ولكي نحصل على تحسن للأداء بالفعل، فعلينا أن نوجد فهرسًا لحقل الهويّة id في جدولي members و products. ومع وجود كمّ هائل من السجلات، فإن تنفيذ (... ,'in( '1', '2 على حقل غير مفهرس سيأخذ وقتًا طويلًا. وبعد هذه المقدمة عن التحميل الحثيث، هيا بنا نرى كيف يمكننا أن نستخدم العلاقات مع المستودعات. تمديد فئة المستودعسأريك طريقة واحدة يمكنك فيها أن تستخدم العلاقات في فئات مستودعات concrete. وهنا مثال عن النتيجة النهائيّة: function __construct(StoreRepository $stores) { $this->stores = $stores; } public function index() { $stores = $this->stores->with('member', 'products')->all(); .... }وكما ترى هنا، لدينا طريقة with يمكنك أن تسلسل فيها نموذج العلاقات. ستكون هذه الطريقة شبيهة بطريقة with في Laravel’s Query Builder. public function with($relations) { if (is_string($relations)) $relations = func_get_args(); $this->with = $relations; return $this; }نحتاج الآن لأن نربط كلّ علاقة من العلاقات التي قمنا بتقديمها بالنموذج: protected function eagerLoadRelations() { if(!is_null($this->with)) { foreach ($this->with as $relation) { $this->model->with($relation); } } return $this; }وها هو ذا، والشيء الوحيد الذي تبقّى هو أن نحدّث طريقة مستودع ()all (وأي شيء آخر ترغب بتحديثه) لاستخدام التحميل الحثيث: public function all($columns = array('*')) { $this->applyCriteria(); $this->newQuery()->eagerLoadRelations(); return $this->model->get($columns); }وكما سبق وذكرت، فيمكنك أن تضيف عدّة علاقات ضمن طريقة ()with. وفيما يلي مثال على StoresControler: <?php namespace App\Http\Controllers; use App\Repositories\StoreRepository; class StoresController extends Controller { protected $stores; function __construct(StoreRepository $stores) { $this->stores = $stores; } public function index() { $stores = $this->stores->with('member', 'products')->all(); return \View::make('stores.index')->with('stores', $stores); } }وفي العرض يمكنك أن تعرض البيانات بالطريقة التي تريدها، ولغرض التجربة يكفي هذا: @foreach($stores as $store) <h1>{{ $store->name }}</h1> <span>Owner: {{ $store->member->first_name . ' ' . $store->member->last_name }}</span><br> <h2>Products:</h2> @foreach($store->products as $product) <h3>{{$product->name}}</h3> <span>{{$product->short_desc}}</span><br/><br/> <span>Price: {{$product->price}}</span><br/> <?php Debugbar::info('Product displayed'); ?> @endforeach <br/>========================<br/> @endforeachوكما هو متوقع، لدينا الآن هذه الاستعلامات الثلاثة فقط: الخلاصةيمكنك باستخدام التحميل الحثيث أن تحسّن أداء تطبيقك. وأحيانًا، عندما يكبر التطبيق، حتى التحميل الحثيث ليس كافيًا للحفاظ على أعلى أداء. في الدرس التالي سأريك كيف يمكنك تجميل مستودعاتك لتقوم بعمل cache للاستعلامات من أجل أداء أفضل. ترجمة -وبتصرف- للمقال: Using Repository Pattern in Laravel 5 - Eloquent Relations and Eager Loading.
  7. باتباعك لخطوات هذا الدرس ستتمكن من عمل تصميم جميل لملصق باستخدام النمط Trendy Retro Cityscape والذي يعتبر من التأثيرات الشائعة جدا في وقتنا الحالي. سنعتمد على مجموعة من الخامات بالإضافة إلى تقنيات برنامج فوتوشوب Photoshop لجعله يظهر بشكل جميل وإرجاعه إلى حقبة زمنية أخرى. يتميز عملنا الفني باستخدامنا لصورة سماوية لمدينة، والتي سنقوم بعمل تغييرات على ألوانها وأيضا استخدام خامة texture لنحصل على تصميم لملصق أو مجلة يظهر وكأنه من حقبة السبعينيات. بداية سنحتاج إلى صورة تكون أساس تصميمنا. صور المناظر الطبيعية أو الخاصة بالمدن تعتبر من أشهر الصور المستخدمة في هذا النمط من التصاميم الفنية. بالنسبة لي فقد اخترت صورة لمدنية لوس أنجلس في فترة المساء. نُحدد خاصية التعديل على مستويات الطبقة Adjust the levels ونقوم بضبط المنحنى كما هو موضح في الصورة وذلك حتى نضيف بعض التباين لها. نضغط على الاختصار CMD+A لتحديد الصورة كاملة، ثم ننقر على CMD+Shift+C لنسخها ووضعها في طبقة جديدة، ونتبع المسار التالي: Filter > Other > High Pass نعدل قيمة radius إلى أن تصبح تفاصيل الصورة مرئية على الخلفية الرمادية. نُغيّر نمط الطبقة من high pass إلى Linear Light لجعل الصورة أكثر وضوحا. ستجد أن الفرق رائع بين النتيجة التي تحصلنا عليها والصورة الأصلية. في هذه الخطوة نقوم بتعديل منحنيات الطبقة باختيار الخاصية Curves adjustment وذلك للتعديل على ألوان الصورة وخلق تأثيرات عليها تجعلها تبدو قديمة. نعدل على المنحنى الأحمر ليظهر لنا على شكل حرف s، نعدل أيضا على المنحنى الأخضر قليلا أما المنحنى الأزرق فنحاول زيادة الظلال عليه. نستخدم الأداة Elliptical Marquee tool لرسم تحديد حول الأفق الرئيسي للصورة، بعدها ننسخ ونلصق الجزء الذي قمنا بتحديده ونضعه في طبقة جديدة. نستخدم الخطوط التوجيهية لتحديد مركز الصورة ثم نحرك الدائرة التي قمنا بتحديدها سابقا لتغطية جزء من الخلفية. نضغط على المفتاح Ctrl) CMD لمستخدمي ويندوز) ثم على الرمز المصغر للدائرة الموجود على الطبقة لإظهار الخيارات. نضيف خاصية التعديل على الطبقات Curves adjustment layer ونُعدّل على المنحنى أكثر لنحصل على ظلال حمراء تبرز على الدائرة والخلفية. نستخدم فرشاة كبيرة ناعمة لتوزيع بعض النقاط الحمراء على حواف التصميم في طبقة جديدة، ثم نخفض قيمة الشفافية إلى 50% لعمل بعض التأثيرات الضوئية وخلق النمط trendy retro. نضيف قناع Mask لطبقة الدائرة ثم نستخدم فرشاة صغيرة لحذف بعض الأجزاء الخارجة عن الصورة وبهذا نكون أنهينا أول تأثير يجعل الصورة تبدو قديمة. نقوم بتحميل الخامة التالية: ونضعها في طبقة جديدة تكون في الأعلى مع تغيير نمطها إلى Color Burn. نضيف طبقة جديدة نضعها أعلى طبقة High Pass ونملأها باللون الأبيض ثم نغير نمطها إلى Soft Light لزيادة إضاءة الخلفية وخلق تأثير باهت washed out effect عليها. نحمل الخامة noise texture التالية: ونضعها في طبقة أعلى باقي الطبقات ثم نغير من نمطها إلى Screen لجعل الجزء الأسود شفافًا. نقوم بملأ طبقة جديدة بلون أزرق خفيف نحدده من صورة الخلفية، ثم نغير نمطه إلى Pin Light لإضافة اللون إلى مجموعة الظلال. نضيف قليلا من اللون الأزرق إلى الأجزاء السوداء لخلق تأثيرات على التصميم تجعله يبدو قديما. نستخدم الأداة Polygonal Lasso tool لرسم تحديد مثلثي على التصميم ثم ننسخه (CMD+Shift+C) ونلصقه مع تحريكه قليلا من مكانه الأصلي. نكرر نفس العملية لخلق تصاميم أخرى وبشكل عشوائي. ننهي تصميما بإضافة رقم وسط الدائرة، ثم نختار له الأزرق الغامق نحدده من الجزء الأسود من تصميمنا. نضيف قناعًا layer mask للطبقة الموجود عليها الرقم ثم نستخدم الفرشاة لحذف أجزاء منه حتى يتناسب مع المظهر القديم للتصميم. وهذه هي الصورة النهائية لهذا الدرس: ترجمة وبتصرف للمقال Create a Trendy Retro Cityscape Design in Photoshop لصاحبه Chris Spooner.
  8. كل واحد منّا بحاجة لأن يؤمّن هاتفه لأسباب عديدة وأهمها هو أن يحمي جهازه من التطفّل، فنقوم بوضع كلمة سر لمنع الآخرين من الولوج إليه، هناك طرق تقليدية ضمن نظام الأندرويد توفّر الحماية عبر وضع كلمة سر لشاشة القفل أو نمط معيّن، بالإضافة إلى إمكانية تشفير الهواتف بحيث يتم تأمين الحماية القصوى للهاتف وللبيانات الموجودة ضمنه، كما يوجد تقنيات حماية أخرى مختلفة كنمط الضيف، وتحوي بعض الهواتف على ميزات إضافية كمسح الوجه وبصمة الإصبع، وأخيرًا هناك تطبيقات تساعد على تأمين الهواتف بطرق مختلفة. وسنقوم هنا بالتعرّف على أساليب قفل الشاشة لحماية هاتف الأندرويد. لحماية الهاتف ببساطة سيكون علينا أن نقفل الشاشة بمعنى أنه إذا ما أطفأت الشاشة بنفسك أو انطفأت تلقائيًّا بعد مدة زمنية محددة (عادة ما تكون 10-15 ثانية) فيجب أن يكون هناك قفل للسماح للدخول مجدّدًا إلى الهاتف عند محاولة تشغيل الشاشة مجدّدًا كالضغط على الزر الأوسط الرئيسي أو زر التشغيل بنقرة واحدة ولتحقيق ذلك سيكون علينا القيام بما يلي. أولًا ادخل إلى قائمة التطبيقات بالضغط على زر المربعات أسفل الشاشة: وبعض إصدارات الأندرويد يكون شكل هذا الرمز هكذا: ثم ادخل إلى الضبط (الإعدادات): ثم ابحث في قوائم هذه الإعدادات عن خيار قفل الشاشة (حيث أن هذه القوائم تختلف من جهاز لآخر ومن إصدار أندرويد آخر): سيظهر لك خيار تأمين الشاشة وقد يكون الخيار موضوعًا على (السحب) أو (بلا) بكل الأحوال اضغط على الخيار في السطر الأول ذاته. ستحصل على مجموعة من الخيارات وهي: السحب، النمط، رمز PIN، كلمة المرور و "بلا" وستجد بأنه هناك شرح بجانب كل واحدة من هذه الخيارات تدل على مستوى الأمن الذي ستحصل عليه في حال اخترت أيًّا منها. الآن سنقوم بتجربتها جميعًا لتتعرّف عليها. وسنبدأ بخيار النمط. كما ترى هنا فالنمط يعني رسم توصيل معيّن خاص بك بين النقاط الواضحة في الصورة، يمكنك رسم أية طريقة توصيل تريدها المهم هو أن تحفظ طريقة التوصيل هذه حتى تتمكن من الدخول إلى الهاتف عند قفله. فعند إطفاء الشاشة ومحاولة الدخول إلى الهاتف مجدّدًا سوف تضطر إلى رسم ذات النمط الذي اخترته لتتمكن من الدخول إلى الهاتف ولذلك عليك حفظ النمط الذي ستختاره جيدًا وكلما كان معقّدًا أكثر كان أصعب على المتطفلين رسمه ذاته والدخول إلى الهاتف. وستلاحظ عند رسم النمط أنه لا يمكنك المرور على النقطة ذاتها مرتين ولكن يمكنك رسم أنماط متقاطعة صعبة التقليد إلا أنها ستكون أيضًا صعبة الحفظ للبعض وسيعتاد عليها البعض عند التكرار وهذه عينة. قد تعتقد للوهلة الأولى بأنني رسمت فوق النقطة المركزية أكثر مرة وأنا قلت لا يمكن الرسم على النقطة ذاتها مرتين ولكن الحقيقة أن ما تراه هو تقاطع خطوط ليس إلا فأن لم أرسم على النقطة ذاتها أكثر من مرة. وبعد رسم النمط للمرة الأولى اضغط على خيار المتابعة ثم ارسم النمط للمرة الثانية ثم اختر الخيار تأكيد لتظهر بعدها شاشة تطلب منك تعيين رقم PIN احتياطي وهذا ضروري في حال نسيت هذا النمط حتى تستطيع فتح القفل. أدخل رمز PIN وهو عبارة عن أربعة أرقام على الأقل ولكن ليس أكثر من ثمانية ثم اضغط متابعة وبعدها سيطلب منك تأكيد الرمز فقم بإعادة كتابته مجدّدًا واضغط موافق. هناك عدة خيارات للتحكم بمظهر شاشة القفل في كل حالة من الحالات والنمط واحدة منها كأن تجعل رسم النمط مخفي وهذا سيجعل من معرفة هذا النمط أمرًا شبه مستحيل خصوصًا إذا كام معقّدًا بالإضافة إلى خيارات أخرى يمكنك اكتشافها بنفسك منها وضع عبارة معينة على الشاشة ووضع ساعة أو غيرها. أو يمكنك اختيار رمز PIN وهو عبارة عن أرقام عددها بين الأربعة والثمانية تختارها بنفسك وبها تقفل شاشة الهاتف وللدخول مجدّدًا إليه سيتوجب عليك إدخال هذا الرمز. ويمكنك اختيار نفس الرقم مرتين، ذلك سيرفع من الحماية لأنه من سيشاهد آثار الأصابع على الشاشة لن يعرف أي رقم يجب أن يُكرّر. والأمر ذاته ينطبق على خيارات شاشة القفل وتخصيصها كما في النمط. وأخيرًا أهم وأقوى هذه الخيارات هو إدخال كلمة المرور والتي سيكون من الصعب جدًّا على المتطفلين معرفتها وإدخالها حتى لو كانوا بقربك في حال أدخلت كلمة طويلة ومتنوعة ما بين أرقام وحروف وبسرعة الإدخال بأصابعك عندها سيكون من الصعب جدًّا إيجاد هذه الكلمة. ماذا لو نسيت كلمة المرور أو رمز PIN أو نمط القفل فكيف سنتمكن عندها من فتح الهاتف؟ بعد عدّة محاولات فاشلة لفك القفل بما أنك نسيت الرمز أيًّا كان فسوف تظهر لك رسالة تخبرك بأنك أدخل الرمز أو النمط بشكل خاطئ عدّة مرات خلال فترة زمنية قصيرة لذلك حاول مجدّدًا بعد ثلاثين ثانية. ثم ستظهر لك ثلاثة خيارات إضافية في الأسفل. الأولى هي (رقم PIN للنسخ الاحتياطي) وهنا يمكنك إدخال رمز PIN الذي أدخلته عند رسم النمط. ماذا لو نسيته أيضًا، عندها نحتار الخيار الأوسط (نسيت النقش) وفيه نقوم بإدخال بريدنا الإلكتروني على GMAIL مع كلمة المرور ليتم إلغاء قفل الهاتف وتستطيع الدخول وتغيير رمز القفل مجدّدًا. أمّا إذا نسيت كلمة المرور لحسابك على GOOGLE فعليك بالتوجه إلى الحاسوب ومحاولة استعادة كلمة المرور ثم العودة مجدّدًا لفتح قفل الهاتف. ولو لم تكن قد ربطت هاتفك بحساب GOOGLE أو لا تتوفر أية شبكة إنترنت لأي سبب كان فهناك طرق عدة كربط الهاتف بالحاسوب واستخدام برامج معقّدة لفتح القفل أو استخدام ملفات الريكفري (الاستعادة) أو طرق أخرى ولكن هذه الطرق في معظمها ستفقد بياناتك على الهاتف بالكامل وجميعها معقد وقد يسبب التلف والأعطال للهاتف في حال لم تتقن القيام بها بالشكل الصحيح لذلك أنصحك وبشدّة باللجوء إلى أقرب مركز لصيانة الهواتف المحمولة أو إلى مركز الصيانة المعتمد لهاتفك وسيقوم بفتح قفل هاتفك بسهولة وسرعة وبدون التسبب بالأضرار للهاتف أو للبيانات التي عليها. ويجب التنبُّه في النهاية إلى مسألة زمن قفل الهاتف، فالهاتف لا يقفل خلال لحظة بعد بعد مدّة زمنية محدّدة وهي زمن تُحدّده أنتَ بعد توقف الشاشة عن العمل. بالنسبة إلى زمن توقّف الشاشة عن العمل فيمكن تحديده عبر الدخول إلى قائمة الضبط مجدّدًا ثم الدخول إلى قائمة (الشاشة). بعدها ندخل إلى قائمة (زمن توقف الشاشة). ثم نختار أحد الأزمنة المحدّدة بالقائمة. وبذلك ستتوقف الشاشة عن العمل وتنطفئ تلقائيًّا بعد المهلة الزمنية التي ستحدّدها في القائمة السابقة. والآن سنحدّد زمن قفل الهاتف وذلك بعد الدخول إلى قائمة الضبط مجدّدًا واختيار قائمة (قفل الشاشة). ثم الدخول إلى قائمة (القفل التلقائي). ثم نقوم بتحديد الزمن المطلوب ليتم قفل الهاتف بعده وذلك بعد توقف الشاشة عن العمل. أي بمعنى، هناك زمن تبقى فيه الشاشة مُضاءة وتعمل في حال لم تلمس الهاتف أو تعمل عليه سيتم توقف الشاشة عن العمل وتنطفئ بعد هذه المهلة المحدّدة ثم سيبدأ عدّاد زمني آخر بعد توقف الشاشة عن العمل في حال لم تلمس الهاتف أو لم تعمل عليه فسوف يتم بعدها قفل الهاتف بطريقة القفل التي اخترتها سابقًا كالنمط أو كلمة المرور مثلًا. هذا الأمر سيكون مطلوبًا في حالات خاصة، كأن تقوم مثلًا بالتجوّل باستخدام برنامج الخرائط في مكان ما وتحتاج في كل بضع دقائق أن تنظر إلى الخريطة مجدّدًا وتتأكّد من أنّك في الاتجاه الصحيح، عندها سيكون مُزعجًا فك القفل في كل مرّة خصوصًا إذا كانت كلمة مرور طويلة ومعقّدة أو نمطًا صعبًا، لذلك يمكننا تأخير قفل الهاتف بشكل لا نضطّر فيه إلى فتح الهاتف في كل مرّة في هذه الحالة. خاتمة البعض قد يختار طريقة النمط لسهولتها وسهولة حفظها نظرًا لأن طبيعة العقل تحفظ الرسوم أكثر من الكلمات والرموز والبعض الآخر يختار طريقة رمز PIN لأنها أسرع وأقصر ولكن الأفضل هو اختيار كلمة المرور لأنها الأقوى والأكثر أمانًا مما سبق. في كل الأحوال يبقى المهم هو تأمين الحماية للهاتف في حال وقع بأيدي أي شخص حتى لا يتمكن من فتح الهاتف وتصفح المحتوى الخاص بك بدون إذنك. هناك طرق أكثر قوة للحماية وطرق حماية أخرى تتعلق بنوع هذه الحماية والحالة التي نحتاج فيها إلى هذه الأنواع، سنتطرق إليها في دروس قادمة.
  9. ما يميز أنماط الخلفيات المتكررة السلسة هو إمكانية استخدامها على الفور في مختلف التصاميم وبشكل متكرر ورائع. ألواح التزلج، الملابس الخاصة، حزمة التصاميم وخلفيات مواقع الإنترنت جميعها تستخدم هذا النمط من الخلفيات. اتبع الخطوات في هذا الدرس لتتعلم كيفية إنشاء فكتور مبني على قاعدة أنماط متكررة خاصة بك، ويتضمن هذا التصميم رسومات رائعة لجماجم ونجوم وصواعق البرق وغيرها. هذا النّمط الذي ننوي تصميمه يتكوّن من لون أحادي رمادي مع الأبيض والأسود ويحتوي على مجموعة من الرسومات الرائعة. فقاعات النص، جماجم، العظام المتقاطعة، نجوم، قطرات، رذاذ وصواعق البرق كل هذا يساعد على تقديم تصميم شعبي مدني نابض بالحياة. افتح برنامج أدوبي إليستريتور. الشكل الأول الذي سنرسمه هو فقاعة النص. ارسم دائرة مثالية (مع الضغط على Shift) ولوّن هذا الشكل باللون الأسود. استخدم أداة القلم Pen Tool وارسم الشكل المنبثق عن الدائرة للدلالة على فقاعة النص ولا تنسَ مداخلة هذا الشكل مع الدائرة ثم أدمجهما معًا بتحديدهما واختيار Unite من لوحة Pathfinder. استخدم أداة النص Type Tool لإضافة شكل رمز نصّي. استخدمت هنا إشارة الاستفهام بخط من نوع VAG Rounded. وسّط هذه العلامة وسط نظريًّا الشكل الخارجي ثم اجمع هذه الأشكال Group معًا. الآن سنبدأ برسم شكل جمجمة بسيطة. ارسم شكل بيضوي بلون أسود ودوّره قليلًا. استخدم أداة القلم Pen Tool لرسم فك الجمجمة جاعلًا الحافة السفلية منحنية. وحّد الشكلين معًا من الخيار Unite من لوحة Pathfinder. ارسم شكلين بيضويين لتشكيل العينين ودوّر كلًّا منهما قليلًا. ثم ارسم مثلّثًا كأنف الجمجمة عبر استخدام أداة المضلعات Polygon Tool ثم اضغط بشكل متكرر على السهم السفلي من لوحة المفاتيح لتخفيف عدد نقاط الشكل المضلع إلى أن تحصل على شكل المثلث وذلك أثناء سحب الشكل باستخدام الفأرة. حدّد الجمجمة السوداء ثم اذهب إلى القائمة: Object > Path > Offset Path أدخل 1mm في الخيارات ثم اضغط OK. الشكل الجديد الذي تم إنشاؤه وُضِعَ فوق باقي الأشكال لذلك اضغط على الاختصار ]+CMD+Shift لإرساله للأسفل. بدّل لون الشكل الأسود إلى اللون الأبيض مع حدود سوداء. زِد حجم الحدود إلى 2pt وحاذِه للخارج. اجمع Group جميع العناصر معًا. ارسم خطًّا قُطريًّا وزِد سماكة الحدود إلى 7pt. استخدم دائرتين صغيرتين متداخلتين مع نهاية الخط لرسم العظمة الأولى من شكل العظمتين المتقاطعتين. أدمج الأشكال معًا بالخيار Merge من لوحة Pathfinder ثم انسخ CMD+C ثم ألصق في المقدمة CMD+F ثم دوّرها لتشكيل العظمتين المتقاطعتين. حدّد كل عظمة بدورها وأضِف لها مسار تعويض عبر الذهاب إلى القائمة: Object > Path > Offset Path اضغط الاختصار ]+CMD لإرسال المسار الجديد تحت الشكل الداخلي ثم أضِف اللون الأبيض للتعبئة والأسود للحدود بقيمة 2pt كما في شكل الجمجمة. قم بمداخلة عدد من الدوائر لتشكيل شكل رذاذ بسيط. استخدم أداة المستطيل مستدير الزوايا Rounded Rectangles مع أقصى قيمة لنصف قطر زوايا المستطيل لتشكيل قطرة سائلة. أدمج هذه الأشكال معًا من خلال الخيار Merge من لوحة Pathfinder. ارسم بعض الأشكال الأساسية لحشو تصميمك. يمكن أن نرسم صاعقة البرق باستخدام أداة القلم Pen tool، أمّا الدوائر فنرسمها بسهولة من خلال أداة Ellipse tool، والنجوم من خلال أداة Star tool. أنشئ مستندًا جديدًا بقياس 100x100mm ثم ارسم مستطيل رمادي كبير يمتد خلف حواف لوح الرسم. ابدأ بلصق الأشكال التي رسمتها للتو وضَعها داخل المربع. عندما يبدأ التصميم بالتَشَكُّل ارسم تحديدًا فوق جميع العناصر وحرّكهم قطريًّا للأعلى للتمدد خارج لوح الرسم. انسخ CMD+C ثم ألصق في المقدمة CMD+F نسخةً عن عناصرك ثم انقر على مفتاح Enter لإظهار نافذة التحريك. أدخل بدايةً 100mm في الحقل الأفقي ثم كرّر العملية للعمودي ولكن بقيمة -100mm هذه المرّة. كرّر العملية للمرّة الثالثة ولكن بقيمة 100mm و 100mm- للحقلين الأفقي والعمودي. تفقّد المساحات حول لوح الرسم حيث النقش يكرّر الفجوات. قم بلصق المزيد من العناصر لملء الفجوات ولكن مع المحافظة على هذه الأشكال خارج حدود لوح الرسم. اختر أداة المستطيل ثم انقر على لوح الرسم لتظهر نافذة خيارات الأداة. أدخل القيمة 100x100mm لإنشاء مربع، امسح لون التعبئة والحدود ثم حاذِ العناصر إلى لوح الرسم. حدّد الكل من الاختصار CMD+A ثم اذهب إلى القائمة: Object > Expand فعّل خيار الحدود Stroke فقط، هذا ما سيحوّل جميع الحدود إلى أشكال جامدة. اضغط باستمرار على المفتاح Shift وانقر على المربع الجديد الموجود فوق جميع عناصر التصميم وأزِله من التحديد. ثم اجمعها بالاختصار CMD+G. حدّد المربع مع مجموعة الأشكال واختر الخيار Crop من لوحة Pathfinder. التصميم أصبح جاهزًا. لنتمكن من استخدامه كخلفية أو كنقش داخل برنامج إليستريتور بإمكاننا سحب الشكل النهائي إلى لوحة Swatches. أضِف هذا التصميم كلون تعبئة إلى أي شكل تقوم برسمه لإنشاء تعبئة بنمط مستمر. ترجمة -وبتصرّف- للمقال How To Create a Trendy Seamless Pattern in Illustrator لصاحبه Chris Spooner.
  10. قررت اليوم أن أكتب درسا تعليميا عن كيفية إنشاء نمط خريفي بسيط في برنامج Illustrator. يمكنك بسهولة تغيير بعض الألوان والمحتويات لتجعل النمط يبدو صيفياً، ولكنني أعتقد أن البرتقالي المحروق والبني المائل للخمري ألوان تتماشى مع الخريف، إنها ألوان جميلة بجمال تلك الألوان النابضة بالحياة التي تشاهدها في فصل الصيف. هذا هو الشكل النهائي للنمط البسيط الذي سنحاول إنشاؤه، وكما ترون فهو كامل مع مجموعة من الأشياء المقترنة بالخريف: التوت، البندق، الأوراق، الفطر، وحتى وجود بومة صغيرة لطيفة يضفي على التصميم بعض الحياة. وكما جرت العادة في الدروس الأخرى، سوف أُضمن الأبعاد التي استخدمتها، ولكن لا تتردد في استخدام الأبعاد التي تُرضيك. دعونا نبدأ مع البومة لتكوين هذا النمط الخريفي الفريد، وهي المفضلة لدي، لنقم بإنشاء مستند جديد في Illustrator، ونرسم شكلاً بيضوياً بأبعاد 150x190px، ثم باستخدام Direct Selection نسحب نقطة الربط السفلى بمقدار 20px للأعلى، ثم نرسم دائرة بقطر 95px، ونقوم بمحاذاة مركزها عموديًا وأفقياً مع مركز الشكل البيضوي باستخدام لوحة المحاذاة Align . نقوم بسحب الدائرة للأعلى بمقدار 55px ، ثم نقوم بطرحها من الشكل البيضوي باستخدام الزر Minus Front. وبهذا نكون قد أنشأنا جسم البومة. لنقم في الخطوة التالية بإنشاء وجه البومة، سنبدأ بالعينين، لنرسم ثلاثة دوائر بقطر 5،20،40 على الترتيب، بحيث تتطابق مراكز الدوائر الثلاثة، ثم نسحب الدائرة الصغيرة صعدواً لليمين بنحو 6px ، ثم نطرحها من الدائرة الوسطى باستخدام الزر Minus Front. نقوم بإنشاء نسخة من العين باستخدام المفاتيح المختصرة (CTRL+C ثم CTRL+F) أو (CMD+C ثم CMD+F) إذا كنت تستخدم نظام ماكنتوش، ونضع النسخة بجانب العين الأصلية على مسافة 15px منها. نحدد الدائرتين الخارجيتين ونختار من القائمة: Object > Path > Offset Path ثم نضبط الإزاحة Offset على القيمة 15 ونضغط موافق، قبل دمجهم بواسطة الزر Unite، وإرسالها إلى الجزء الخلفي من الملف بالضغط على (SHIFT+CTRL+[) من لوحة المفاتيح. نقوم الآن بتحديد أجزاء العيون والجمع بينها بالضغط على (CTRL+G) من لوحة المفاتيح. لننتقل إلى المنقار، نرسم دائرة بقطر 10px، نضغط على (SHIFT+C) من لوحة المفاتيح للوصول إلى Convert Anchor Point وننقر على نقطة الربط في الأسفل لجعلها حادة، ثم بأداة التحديد المباشر Direct Selection نقوم بسحبها بمقدار 5px للأسفل، ونقوم بمحاذاة المنقار أفقياً ورأسياً إلى أسفل العينين، ثم وضع الوجه بحيث يكون مركزياً بالنسبة لجسم البومة، حوالي 30px أسفل وأعلى الأذن. ولإنشاء أجنحة البومة، نرسم دائرة بقطر 60px ونقوم بمحاذاتها إلى أسفل ويسار جسم البومة، نسحب الدائرة إلى اليسار بمقدار 30px وإلى الأعلى بمقدار 5px أو حتى تكون مقتنع بموقعها. نحدد الآن جسم البومة والدائرة الممثلة للجناح، وإذا كان لديك CS5 أو أعلى يمكنك استخدام أداة البناء Shape Builder من شريط الأدوات أو الضغط على (SHIFT+M) والاستمرار بالضغط على المفتاح ALT من لوحة المفاتيح وتحديد القسم من الدائرة الواقع خارج جسم البومة، وحذفه. أو بدلاً من ذلك يمكنك أخذ نسخة من جسم البومة مع الجناحين الذين لا يزالان محددين (CTRL+C) واختيار الزر Intersect من لوحة Pathfinder، ثم لصق الجسم مرة أخرى في مكانه (CTRL+F)، وإرساله للجزء الخلفي من المستند بالضغط على (SHIFT+CTRL+[) من لوحة المفاتيح. كرر هذه العملية للحصول على الجناح الثاني. الخطوة التالية إنشاء قدكي البومة، نرسم ثلاثة أشكال بيضوية بأبعاد 10x20 px، ونضعها بجوار بعضها البعض متداخلة بمقدار 2px فيما بينها، ثم نجمع بينهم بعد التحديد بواسطة الزر Unite. الآن القدم الأولى كاملة، نقوم بعمل نسخة منها للقدم الثانية ونضعهما جنباً إلى جنب بمسافة 30 نقطة فيما بينهما. نقوم الآن بمحاذاة القدمين مركزياً مع الجزء السفلي للبومة، ونسحبهما للأعلى بمقدار 2px، أو بحيث نكن راضين عن موقعهما. وبقي علينا لإنهاء البومة منحها بعض الريش والألوان، نرسم دائرتين بقطر 10px ونطابق مركزهما معاً، ثم نسحب الدائرة العلوية بمقدار نقطتين للأعلى ونطرحها من الدائرة السفلية Minus Front. ننشئ أربعة نسخ من الريش بحيث نضع ثلاثة منها في الجزء العلوي واثنتين في الجزء السفلي كما في الشكل، بمسافة 10px فيما بينها، والآن يمكننا تلوين البومة باستخدام لوح الألوان الخاص بي أو اختيار واحد خاص بك. هذا كل شيء، لدينا الآن بومة كاملة. لماذا لا يكون التالي هو إنشاء غصن توت خريفي؟ لنرسم دائرة بقطر 30 وشكلاً بيضوياً بأبعاد 10x5 px ومحاذاة الشكلين أفقياً وعمودياً إلى المركز قبل سحب الشكل البيضوي للأعلى بمقدار 3 نقاط تقريباً، نقوم بعدها برسم مستطيل بأبعاد 5x100px ليُشكل الساق ونضعه وراء حبة التوت ونسحبه للأعلى بنحو 10 نقاط قبل إرساله إلى الجزء الخلفي من المستند. نُنشئ الآن مستطيلًا أخر 50x5px، ونضعه بحيث يكون مركزه على الساق ويقع أسفل حبة التوت بحوالي 10px. ننتقل مع المستطيل الأخير المحدد إلى القائمة: Effect > Warp > Arc ونعين Bend إلى القيمة 50% ثم ننقر على زر OK، أصبح المستطيل يمثل جذع غصن التوت، ويمكنك إزالة مظهر الجذعية من خلال القائمة: Object > Expand Appearance عن طريق النقر بزر الفأرة الأيمن على الجذع ونختار فك التجميع Ungroup من القائمة المنبثقة وحذف المسار بعدها. إذا ظهرت لك رسالة الخطأ التالية: "The filter produced no results"، فيجب عليك اختيار اثنين من المسارات المتقاطعة عند محاولة استخدام الزر Minus Front من لوح Pathfinder في المرة القادمة. قمّ بعمل نسخة من حبة التوت، وحركها للأسفل بمقدار 25px وإلى اليسار بمقدار 30px. ثم أنقر على حبة التوت التي لا تزال محددة بزر الفأرة الأيمن واختار من Transform الأمر Rotate وعيّن زاوية الدوران angle على القيمة 45 درجة ثم موافق. كرر العملية ولكن بزاوية -45 درجة لحبة التوت في الجهة المقابلة. نقوم بنسخ ولصق حبات التوت والساق بالضغط على (CTRL+C ثم CTRL+F) من لوحة المفاتيح، ومن ثم أنزل النسخة للأسفل 40px. ولحذف الجزء غير المرغوب فيه من الساق، نحدد الجذع و الساق وننقر على الزر Divide من لوحة Pathfinder، ونحذف الجزء غير المرغوب فيه من الساق، ثم نقوم بتحديد سيقان حبات التوت والجذع وننقر الزر Unite من لوحة Pathfinder، ونرسل الشكل إلى خلفية المستند بالضغط على (SHIFT+CTRL+[) من لوحة المفاتيح. كل ما علينا القيام به الآن للانتهاء من غصن التوت هو إضافة ورقة وبعض الألوان. نرسم دائرتين بقطر 50px ونضعهما جنباً إلى جنب مع تداخل 30px فيما بينهما. نحدد كلا الدائرتين وننقر على الزر Intersect من لوحة Pathfinder، أصبح لدينا شكل الورقة كاملاً وبقي علينا تدويرها بزاوية 30 درجة ووضعها على يسار وأسفل الغصن، بفاصل 5px لليسار و10px فوق الجزء السفلي من الساق. والآن لتُعطي لغصن التوت الألوان التي تراها مناسبة. الخطوة التالية إنشاء غصن عليه بعض أوراق الخريف، لإنشاء الأوراق نستخدم نفس الطريقة التي استخدمناها للأوراق في غصن التوت. نرسم دائرتين بقطر 50px مع تداخل 30px ونقاطعهما باستخدام لوحة Pathfinder. نرسم مستطيلا بأبعاد 5x100 px ونضعه أسفل الورقة التي رسمناها آنفاً، ونتأكد من أن الشكلين يتمحوران شاقولياً، نأخذ نسخة من الورقة وندورها بزاوية 90 درجة ونضعها على مسافة 5 نقاط يسار وأسفل المستطيل. نقوم بنسخ الورقة نسختين ونجعل كل واحدة فوق الأخرى بمسافة فاصلة 10px بين كل ورقة وأخرى. نحدد الورقة العليا و ندورها بزاوية -30 درجة، وندوّر الورقة التي في المنتصف بزاوية -15 درجة،ثم نقوم بنسخ ولصق الأوراق الثلاثة بعد تحديدها ونأخذها ليسار المستطيل ونعكسها عمودياً بالنقر عليها بزر الفأرة اليمين ونختار من Transform الأمر Reflect ونحصر على تحديد الخيار Vertical ثم موافق. نضيف لغصن الأوراق بعض الألوان استعداداً للانتقال لرسم الفطر. لنبدأ بغطاء حبة الفطر من خلال رسم دائرة بقطر 50px ، ونسحب نقطة الربط السفلى للأعلى باستخدام أداة التحديد المباشر Direct Selection بمقدار 15px أو بشكل تكون مقتنعًا بمكانها. ونرسم دائرة أصغر لتشكيل ساق حبة الفطر بقطر 20px، ونسحب نقطة الربط العليا للأعلى نحو 30px، نضبط محاذاة غطاء وساق حبة الفطر شاقولياً وأفقياً بواسطة لوحة المحاذاة Align ثم نقوم بسحب الساق للأسفل بمقدار 15px. أعتقد أن ساق الفطر تحتاج بعض اللمسات، نختار ساق الفطر وننقله إلى الجزء الخلفي للمستند، ثم من القائمة: Effect > Warp نحدد شكل الانحناء Style على الشكل Squeeze ونضبط قيمة Bend على 40% ثم موافق. نضيف الآن بعض الدوائر بأقطار متفاوتة، ونضيف الألوان المناسبة لحبة الفطر استعداداً للانتقال للعنصر الخريفي الأخير وهو حبة البلوط. بالنسبة لحبة البلوط، نبدأ برسم دائرة بقطر 30px، نضغط على Shift+C من لوحة المفاتيح ثم ننقر على نقطة الربط السفلية لتحويلها إلى نقطة حادة، أو نختار الزر Convert Anchor Point من لوح الأدوات وننقر على نقطة الربط، وباستخدام أداة التحديد المباشر Direct Selection نسحب النقطة السفلية بمقدار 20px. ونضيف للدائرة المحددة انتفاخ أفقي Bend بمقدار -80% ثم موافق. وبذلك نكون قد أنشأنا القسم السفلي من حبة البلوط. لننتقل الآن إلى تصميم كأس (قبعة) حبة البلوط، نرسم شكلاً بيضوياً بأبعاد 20x34 px، ثم نسحب نقطة الربط السفلى بمقدار 10px للأعلى باستخدام أداة Direct Selection. لنرسم مستطيلًا مُستدير الزوايا بأبعاد 10x3 px، ونطبق عليه انحناء بشكل قوس Arch بنسبة 25%، ثم محاذاة الشكل الجديد أفقياً إلى مركز كأس البلوط وعمودياً إلى أعلاه، ونسحبه 5 نقاط تقريباً للأعلى ونقوم بتحديده مع الكأس و الجمع بينهما بالنقر على الزر Unite. وأخيراً محاذاة كأس البلوط مركزياً مع حبة البلوط ثم سحبه 10 نقاط للأعلى قبل إضافة الألوان التي نريدها. حسناً، لقد شكلنا كل عناصر الخريف ونحن في طريقنا لاستخدامها في نمط خريفي بسيط. وكل ما علينا فعله الآن هو تشكيل النمط البسيط. ونأتي الآن للجزء الممتع من العمل، نرسم مُربعًا بطول 600px ونملأه بالأشكال الخريفية التي قمنا للتو بإنشائها، لا تتردد في تغيير الأحجام، التعتيم، الدوران، أو أي شيء تريده. يمكنك في هذه المرحلة الحصول على بعض المرح، الشيء الوحيد الذي أود اقتراحه هو أن يكون لديك التصور الكافي للكيفية التي سيتم تكرار النمط فيما بعد في حال كنت قد ذهبت ببعض الأشكال خارج حواف المربع، هذا إذا كنت لا تريد أي تداخل غير مقصود. وعندما تكون سعيداً ومقتنعاً بالتصميم يمكنك تجميع group كل العناصر باستثناء الخلفية بالضغط على (CTRL+G) من لوحة المفاتيح بعد تحديدهم. نحدد العناصر المجمعة، ونقوم بإنشاء نسخة منها، ثم ننقر بزر الفأرة الأيمن ونختار من Transform ثم تحريك Move من القائمة المنبثقة، أو نضغط على (SHIFT +CTRL+M). ومن مربع الحوار Move نضبط الموضع الأفقي Horizontal على 600px والرأسي Vertical على القيمة 0، وزاوية الدوران Angle على القيمة 0. وبهذا ننسخ كل شيء إلى اليمين، نكرر العملية حتى يتم نسخ جميع العناصر إلى كل الحواف الأربعة. العلوي / أفقي: 0، عمودي: -600، المسافة: 600 ، زاوية: 90 درجة.اليسار / أفقي: -600، عمودي: 0، المسافة: 600، زاوية: 180 درجة.السفلي / أفقي: 0، عمودي: 600 ل، المسافة: 600 ل، زاوية: -90 درجة. نفك تجميع العناصر الخريفية في المربعات الخمسة ثم نحدد كل شيء، ما عدا الخلفية، ونقوم بتجميعها ككائن واحد عملاق، نقوم بعمل نسخة من الخلفية ووضعها في الأمام بالضغط على المفاتيح (CTRL+C ثم CTRL+F) ثم (SHIFT+CTRL+]) لإحضارها للمقدمة. نحدد كلاً من الخلفية والعناصر الخريفية وننقر على الزر اقتصاص Crop من لوحة Pathfinder. هذا كل ما في الأمر. انتهيت من نمطك الخريفي البسيط الآن، قمّ بسحبه إلى لوحة Swatches واستخدامه كيفما تشاء. فعلا، تُساعد ألوان الذهبي والبرتقالي والبني على استحضار تلك الذكريات من الأمسيات الباردة، مع القفازات والأوشحة، ومع قدح دافئ من الشوكولاتة الساخنة. ترجمة -وبتصرف- للمقال Create a seamless autumnaal pattern in Illustrator لصاحبته Liz Canning.