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



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

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

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

نوع المُحتوى


التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

أسئلة وأجوبة

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

التصنيفات

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

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

  1. مقدمة النص عبارة عن سلسلة تحتوي على حرف واحد أو أكثر وقد تحتوي على حروف أبجدية، أرقام ورموز. النصوص في لغة البرمجة روبي عبارة عن كائنات (Objects)، وعلى عكس لغات البرمجة الأخرى، فإن النصوص قابلة للتغيير (Mutable) والتي تعني أننا نستطيع تعديل النصوص بدلًا من إنشاء نصوص جديدة. ستستخدم النصوص في أغلب البرامج التي تكتبها، وتتيح لك النصوص عرض ما تريده للمستخدمين والتواصل معهم عبر نقل المعلومات لهم عبر الشاشة. في الحقيقة، إن النص الذي تقوم بقراءته الأن يتكون من مجموعة من النصوص المعروضة على الشاشة من خلال المتصفح. النصوص أحد أهم الأساسيات في البرمجة. في هذا الدرس، سوف تتعلم كيفية التعامل مع النصوص بلغة الروبي. سوف تُنشئ النصوص، تعرضها على الشاشة، تحفظها في متغيرات، تدمج النصوص ببعضها وستتعلم في الدرس التالي كيفية التعامل مع الرموز الخاصة مثل السطر الجديد، الفواصل وعلامات التنصيص المزدوجة. إنشاء وطباعة النصوص تُحاط النصوص بعلامتي تنصيص مزدوجة ” أو علامتي تنصيص منفردة ’ في لغة الروبي، لذلك لإنشاء نص، لابد أن تحيط مجموعة الحروف بأحد علامتي التنصيص: 'This is a string in single quotes.' "This is a string in double quotes." تستطيع أن تختار أي نوع من علامات التنصيص، وفي أغلب الحالات لا يهم أيهما تختار ما دمت ثابتًا على أحدهما. على الرغم من ذلك، فإن استخدام علامتي التنصيص المزدوجة يتيح لك إجراء ما يسمى استيفاء النص (String Interpolation) والذي سوف تتعلمه في هذا المقال. لعرض نص في برنامجك، تستطيع استخدام الوظيفة print والتي تعرض النص كما تم كتابته: print "Let's print out this string." قم بإنشاء برنامج روبي وأعطه الإسم print.rb ومن خلال محرر النصوص الخاص بك قم باستخدام الوظيفة print ثلاث مرات لطباعة نص: print.rb print 'This is the first string.' print 'This is the second string.' print 'This is the third string.' قم بحفظ الملف وتشغيله باستخدام الأمر التالي: ruby print.rb وسوف تحصل على النتيجة التالية: Output This is the first string.This is the second string.This is the third string. في الناتج الذي سبق، بدلًا من طباعة النصوص الثلاثة كلٌ في سطره، تم طباعة جميع النصوص في سطر واحد. إذا أردت أن يُطبع كل نص في سطر، يجب عليك أن تُضيف هذا السطر بنفسك وستتعلم ذلك تحت عنوان النصوص الطويلة والأسطر الجديدة، أو أن تستخدم الوظيفة put بدلًا من الوظيفة print. قم بتعديل البرنامج ومن ثم احفظ التعديل وفقا لما يلي: print.rb puts 'This is the first string.' puts 'This is the second string.' puts 'This is the third string.' الان قم بتشغيل البرنامج مرة أخرى وستحصل على النتيجة التالية: Output This is the first string. This is the second string. This is the third string. الوظيفة puts تطبع النص الذي تحدده لها وتطبع أيضا سطر جديد مع نهاية النص المُدخل. حفظ النصوص في متغيرات المتغيرات عبارة عن مؤشر لمكان في ذاكرة الحاسوب وتُستخدم لحفظ البيانات والرجوع إليها لاحقا. لحفظ نص في متغير، نُعرف اسم المتغير ونعطيه قيمة النص الذي نريده: my_string = 'This is my string' لاسترجاع القيمة النصية نستخدم اسم المتغير: print my_string لتجربة ذلك، نُنشئ ملف جديد باسم string_variables.rb باستخدام محرر النصوص ونضيف الشيفرة التالية: string_variables.rb my_name = "Sammy the Shark" my_age = "none of your business" puts my_name puts my_age يقوم البرنامج بتعرف مُتغيرين my_name و my_age وكل متغير منهما تم إعطاءه قيمة نصية. بعد ذلك نقوم باستخدام الوظيفة put لطباعة كل منهما في سطر. نحفظ الملف ونقوم بتشغيله باستخدام الأمر التالي: ruby string_variables.rb ونحصل على النتيجة التالية: Output Sammy the Shark none of your business بإعطاء المتغيرات القيم النصية تستطيع تفادى إعادة كتابة النص نفسه كلَ مرة تحتاجه فيها مما يجعل العمل مع النصوص أسهل في برامجك. في العنوان التالي من المقال سنتحدث عن دمج النصوص ببعضها وإنشاء نصوص جديدة منها. دمج النصوص الدمج يعني ربط نصين أو أكثر ببعضهم لإنشاء نص جديد، ويتم باستخدام عملية الدمج التي يُشار لها بالرمز + ، ويُستخدم نفس الرمز في عملية جمع الأرقام خلال العمليات الرياضية. لدمج النصين “sammy” و “shark” نكتب ما يلي: "sammy" + "shark" وسوف نحصل على النتيجة التالية: Output sammyshark الدمج يقوم بربط النصوص من النهاية للنهاية منتجًا نصًا جديدًا. إذا أردت أن يكون هناك فراغ بين النصين فعليك أن تُضيف هذا الفراغ لأحد النصوص: "sammy " + "shark" من الأغلب أنك لن تكتب شيفرة برمجية بهذا الشكل، ولكنك ستحتاج إلى استعمال النصوص مع المتغيرات وهنا يأتي دور الدمج. انظر المثال التالي: color = "Blue" print "My favorite color is " + color الشيفرة السابقة سينتج عنها النص My favorite color is blue. لاحظ أننا تركنا فراغا بعد الكلمة is بحيث يكون الناتج يحتوي على فراغ بين اخر كلمتين. تستطيع دمج نصوص عديدة بنفس الطريقة. أنشئ ملف باسم concatenation.rb وأضف فيه الشيفرة التالية: concatenation.rb my_name = "Sammy the Shark" my_age = "none of your business" puts "My name is " + my_name + " and my age is " + my_age + "." في الشيفرة السابقة قمنا بتعريف متغيرين my_name و my_age وكل منهما له قيمته النصية وطبعنا عدة نصوص ومتغيرات باستخدام عملية الدمج. عند تشغيل الشيفرة السابقة ستحصل على النتيجة التالية: Output My name is Sammy the Shark and my age is none of your business. عند استخدام عملية الدمج مع أكثر من نص فإن النتيجة هي نص جديد. هذا النص الجديد نستطيع أن نحفظه في متغير لإعادة استخدامه مرة أخرى: concatenation.rb my_name = "Sammy the Shark" my_age = "none of your business" # assign concatenated string to variable output = "My name is " + my_name + " and my age is " + my_age + "." # Print the output. puts output في مثال صغير مثل هذا لن تحتاج للمتغير output غالبًا، ولكن في برامج أكبر، من المحتمل أنك ستنشئ نص باستخدام عملية الدمج وتحفظه في متغير خاص وتستخدم هذا المتغير في أماكن متعددة. من الجيد أيضًا أن تتعود على فصل معالجة البيانات –مثل دمج النصوص والعمليات الرياضية– عن المخرجات كلما زاد حجم برنامجك، وكلما زاد حجم البرامج لديك أكثر ستحتاج لفصل العمليات المنطقية عن عمليات الإخراج في ملفات منفصلة ليسهل عليك إدارتها. تأكد من عدم استخدام عملية الدمج + بين نوعي بيانات مختلفين، فمثلًا، لن تستطيع دمج نص مع رقم بطريقة مباشرة. لتتعرف أكثر على هذه الحالة، أنشئ ملف باسم string_and_integers.rb وأضف له الشيفرة التالية: strings_and_integers.rb my_name = "Sammy the Shark" my_number = 27 print my_name + my_number لاحظ أن المتغير my_number يحمل القيمة العددية الصحيحة 27. بعد تشغيل البرنامج ستحصل على الخطأ التالي: Output strings_and_ints.rb:4:in `+': no implicit conversion of Integer into String (TypeError) from strings_and_ints.rb:4:in `<main>' الخطأ السابق يعني أننا لا نستطيع دمج متغير يحمل قيمة رقمية مع متغير آخر يحمل قيمة نصية. في نسخة الروبي 2.3 وما قبل، سيظهر لك رسالة الخطأ التالية: strings_and_ints.rb:4:in `+': no implicit conversion of Fixnum into String (TypeError) from strings_and_ints.rb:4:in `<main>' النوع Fixnum تم استبداله بالنوع Integer في نُسخ الروبي الجديدة. نستطيع تعديل البرنامج ليصبح المتغير my_number يحمل القيمة النصية “27” أو نقوم بتحويل القيمة الرقمية إلى نصية بالطريقة التالية: strings_and_integers.rb my_name = "Sammy the Shark" my_number = 27 print my_name + my_number.to_s الوظيفة .to_s تقوم بتحويل الرقم إلى نص. هذه الطريقة أفضل لأنها تُحافظ على نوع المتغير my_number كما هو دون تغيير، حيث قد نحتاج أن نتعامل معه كرقم في أماكن أخرى من البرنامج. قم بتشغيل البرنامج مرة أخرى وستحصل على النتيجة التالية: Sammy the Shark27. دمج الأرقام مع النصوص عملية ستتكرر معك دائما عند تعاملك مع العملات، أرقام الهواتف، الرموز البريدية وغيرها من البيانات التي تحتوي على أرقام، وعند حاجتك لعرض هذه البيانات على الشاشة كنصوص. الدمج عملية قوية ولكن لديها بعض القيود. فمثلا، إذا أزلت عملية الدمج + بشكل غير مقصود سينتج لديك خطأ، وكذلك لدمج متغير يحتوي على نوع رقم فستحتاج لتحويله لنص أولًا. تُقدم الروبي طريقة أخرى لدمج المتغيرات مع النصوص وتُسمى هذه الطريقة بـ استيفاء النصوص والتي تعالج المشكلتين السابقتين. استيفاء النصوص عند دمج النصوص والمتغيرات يكون المُخرج صعبًا في القراءة والتنقيح. طريقة استيفاء النصوص تحل لك ذلك وتسمح بتضمين العبارات في النصوص المحاطة بعلامتي تنصيص مزدوجتين. فبدلًا من كتابة ما يلي: "My name is " + my_name + "!" تستطيع كتابته بالطريقة التالية: "My name is #{my_name}!" بدلًا من استخدام العملية +، نستطيع تضمين المتغير الذي نريده باستخدام الرموز #{ } والتي تجعل روبي تقوم بتفسير التعبير وتُضمن النص الناتج عنه في النص الأصلي. البرنامج التالي يقوم بنفس عمل البرنامج السابق ولكن بطريقة استيفاء النص: interpolation.rb my_name = "Sammy the Shark" my_age = "none of your business" output = "My name is #{my_name} and my age is #{my_age}." puts output نستطيع استخدام طريقة استيفاء النص في دمج نص مع رقم بطريقة تلقائية. لنقم بتعديل البرنامج strings_and_integers.rb ليصبح كالتالي: strings_and_integers.rb my_name = "Sammy the Shark" my_number = 27 # use interpolation instead of concatenation print "My name is #{my_name} and my favorite number is #{my_number}." ستقوم الروبي بتحويل المتغير my_number إلى نص بشكل تلقائي وعند تشغيل البرنامج ستحصل على النتيجة التالية: Output My name is Sammy the Shark and my favorite number is 27. استيفاء النصوص طريقة قوية ومناسبة وهي مفضلة في دمج النصوص والمتغيرات. خاتمة تعلمنا في هذا الدرس كيفية التعامل مع النصوص في لغة البرمجة روبي. وسنتابع في الدرس التالي ماهية القيم الحرفية للنصوص وكيفية تكرارها بالإضافة إلى كيفية إضافة أسطر جديدة ضمن النصوص الطويلة. ترجمة -وبتصرّف- للمقال How to Work with Strings in Ruby لصاحبه Brian Hogan
  2. يشرح هذا المقال طريقة كتابة تعليمات تحوي متغيرات تخزن فيها قيمًا مختلفة، كالأرقام والكلمات، وتحوي أيضًا عوامل حسابية (operators)، وهي رموز تمثل عمليات حسابية. ثم يُعرّج على فكرة التركيب (أي استخدام مزايا اللغة التي تعرفنا عليها سابقاً مع بعضها)، كما يتحدث عن ثلاثة أنواع من الأخطاء البرمجية ونذكر فيه المزيد من النصائح عن تنقيح البرامج من الأخطاء. التصريح عن المتغيرات أحد أقوى المزايا لأي لغة برمجة هي القدرة على تعريف ومعالجة المتغيرات (variables). المتغير هو منطقة ذات اسم تخزّن قيمة (value). قد تكون القيم أرقامًا، أو نصوصًا، أو صورًا، أو مقاطع صوتية، وغيرها من أنواع البيانات. عليك أولًا التصريح عن متغير ثم تخزين القيم فيه. String message; هذا النوع من التعليمات يدعى تصريح (declaration)، لأنها تصرح أن نوع المتغير المدعو message هو String. لكل متغير نوع (type) يحدد نوع القيم التي يمكنه تخزينها. مثلًا، النوع int يخزن الأعداد الصحيحة، والنوع String يخزن السلاسل المحرفية. بعض الأنواع تبدأ بحرف كبير وبعضها الآخر يبدأ بحرف صغير. سنعرف معنى هذا التمييز لاحقًا، لكن الآن عليك الانتباه لكتابتها بشكل صحيح. ليس هناك نوع Int ولا string. لإنشاء متغير من النوع الصحيح، التعليمة هي: int x; حيث x هو اسم كيفي اخترناه للمتغير. بشكل عام، عليك اختيار أسماء المتغيرات بحيث تدل على دور المتغير في البرنامج. مثلًا، عندما ترى التصريحات التالية عن المتغيرات: String firstName; String lastName; int hour, minute; هذا المثال يصرح عن متغيرين من نوع String ومتغيرين من نوع int. عندما يتكون اسم المتغير من كلمتين أو أكثر، مثل المتغير firstName، جرت العادة على جعل الحرف الأول من كل كلمة حرفًا كبيرًا عدا الكلمة الأولى. أسماء المتغيرات حساسة لحالة الأحرف، ولذلك فالمتغير firstName مختلف عن المتغير firstName أو FirstName. يوضح هذا المثال أيضًا صيغة التصريح عن عدة متغيرات من نفس النوع في سطر واحد: كلًا من hour و minute هو عدد صحيح (متغير من النوع int). لاحظ أن كل تعليمة تصريح تنتهي بفاصلة منقوطة. يمكنك تسمية متغيراتك كما تشاء. لكن هناك حوالي 50 كلمة محجوزة، تدعى الكلمات المفتاحية (keywords)، ولا يسمح لك باستخدامها كأسماء لمتغيراتك. هذه الكلمات تشمل public، وclass، وstatic، وvoid، وint، التي يستخدمها المترجم لتحليل بنية البرنامج. هناك قائمة كاملة بالكلمات المفتاحية موجودة، لكن لا حاجة لحفظها. معظم المحررات المستخدمة في البرمجة توفر ميزة "تلوين الشفرة" (syntax highlighting)، التي تجعل الأجزاء المختلفة من البرنامج تظهر بألوان مختلفة. الإسناد بعد أن صرحنا عن بعض المتغيرات، سنستخدمها لتخزين بعض القيم فيها. يمكننا عمل ذلك باستخدام تعليمة الإسناد (assignment). message = "Hello!"; // give message the value "Hello!" hour = 11; // assign the value 11 to hour minute = 59; // set minute to 59 يبين هذا المثال ثلاث تعليمات إسناد، والتعليقات تظهر ثلاثة أساليب يستخدمها الناس أحيانًا عندما يقرؤون تعليمات الإسناد. قد تكون المفردات مربكة هنا، لكن الفكرة واضحة : عندما تصرح عن متغير، أنت تنشئ منطقة تخزينية لها اسم. عندما تطبق تعليمة الإسناد على متغير، فأنت تغير القيمة التي يحويها. كقاعدة عامة، يجب أن يكون نوع المتغير من نفس نوع القيمة التي تسندها إليه. مثلًا، لا يمكنك تخزين سلسلة محرفية في المتغير minute أو عددًا صحيحًا في message. من ناحية أخرى، هذه القاعدة قد تكون مصدرًا للإرباك أحيانًا، بسبب وجود العديد من الطرق التي تسمح لك بتحويل القيم من نوع لآخر، وأحيانًا تحول Java الأشياء تلقائيًا. لكن الآن عليك فقط أن تتذكر القاعدة العامة بأن المتغيرات والقيم يجب أن تكون من نفس النوع، وسنتحدث عن الحالات الخاصة لاحقًا. أحد مصادر الإرباك هو أن بعض السلاسل المحرفية تبدو مثل الأرقام، لكنها ليست كذلك. مثلًا، يمكن أن يخزن المتغير message السلسلة المحرفية "123"، المكونة من المحارف '1' و '2' و '3'، لكنها ليست مثل العدد الصحيح 123. message = "123"; // legal message = 123; // not legal يجب تهيئة المتغيرات (initialize)، أي إسناد قيمة لها أول مرة، قبل أن تستخدمها. يمكنك التصريح عن متغير ثم إسناد قيمة له لاحقًا، كما في المثال السابق. كما يمكنك أيضًا التصريح عن المتغير وتهيئته بسطر واحد: String message = "Hello!"; int hour = 11; int minute = 59; مخططات الحالة قد تظن أن تعليمة a = b هي تعليمة مساواة لأن Java تستخدم الرمز = لعملية الإسناد. لكنها ليست مساواة! المساواة عملية تبديلية، أما الإسناد فلا. على سبيل المثال، في الرياضيات إذا كان a = 7 إذًا 7 = a. لكن في Java ‏a = 7;‎ تعليمة إسناد مشروعة، لكن 7 = a‎ غير مشروعة. يجب أن يكون الطرف الأيسر من تعليمة الإسناد متغيرًا (اسمًا لموقع تخزيني). في الرياضيات أيضًا، جملة المساواة صحيحة دائمًا. إذا كان a = b الآن، فإن a سيبقى مساويًا لـ b دائمًا. أما في Java، فتعليمة الإسناد قد تجعل قيمتي متغيرين متساويتان، لكن قد لا يستمران على هذه الحال. int a = 5; int b = a; // a and b are now equal a = 3; // a and b are no longer equal في السطر الثالث تغيرت قيمة a، لكن قيمة b لم تتغير، وبالتالي لم يبق المتغيران متساويان. المتغيرات في البرنامج مع قيمها الحالية تشكل حالة البرنامج (state). يُظهِر الشكل 2.1 حالة البرنامج بعد تنفيذ هذه التعليمات. تدعى هذه المخططات التي تظهر حالة البرنامج بمخططات الحالة (state diagrams). يُمثَّل كل متغير بصندوق يظهر اسم المتغير خارجه وقيمة المتغير داخله. أثناء تنفيذ البرنامج تتغير الحالة، لذلك عليك اعتبار مخططات الحالة كتمثيل لحظي لنقطة محددة في مسار التنفيذ. طباعة المتغيرات يمكنك عرض قيمة متغير باستخدام println أو print. في التعليمات التالية صرحنا عن متغير اسمه firstLine، وأسندنا له القيمة "!Hello, again"، وعرضنا تلك القيمة. String firstLine = "Hello, again!"; System.out.println(firstLine); عندما نتحدث عن عرض متغير فنحن نقصد قيمة المتغير عمومًا. أما لعرض اسمالمتغير، فعليك أن تضعه بين علامتي اقتباس. مثلًا: System.out.print("The value of firstLine is "); System.out.println(firstLine); خرج هذا البرنامج هو: The value of firstLine is Hello, again! بنية تعليمة عرض المتغير هي نفسها بغض النظر عن نوع المتغير. مثلًا: int hour = 11; int minute = 59; System.out.print("The current time is "); System.out.print(hour); System.out.print(":"); System.out.print(minute); System.out.println("."); خرج هذا البرنامج هو: The current time is 11:59. لوضع عدة قيم على نفس السطر، من الشائع استخدام عدة تعليمات print ثم تتبعها تعليمة println في النهاية. لكن لا تنسَ تعليمة println على العديد من الحواسيب، يتم تخزين خرج تعليمات print دون عرضه على الشاشة حتى استدعاء println؛ وعندها يظهر السطر كله دفعة واحدة. إذا أغفلت تعليمة println، فقد يعرض البرنامج الخرج المخزن في أوقات غير متوقعة أو ربما انتهى البرنامج دون طباعة أي شيء. العوامل الحسابية العوامل (operators) هي رموز تمثل حسابات بسيطة. مثلًا، عامل الجمع هو +، وعامل لطرح -، والضرب *، والقسمة /. يحول البرنامج التالي الوقت إلى دقائق: int hour = 11; int minute = 59; System.out.print("Number of minutes since midnight: "); System.out.println(hour * 60 + minute); في هذا المثال، لدينا التعبير (expression) التالي: hour * 60 + minute، الذي يمثل قيمة وحيدة بعد الحساب. عند تنفيذ البرنامج، يستبدل كل متغير بقيمته الحالية، ثم تطبق العوامل عليها. تدعى القيم التي تعمل العوامل عليها بالمعاملات (operands). نتيجة المثال السابق هي: Number of minutes since midnight: 719 التعابير هي تراكيب تتألف بشكل عام من أرقام، ومتغيرات، وعوامل. عند ترجمة وتنفيذ التعابير ستنتج لدينا قيمة وحيدة. مثلًا، التعبير 1 + 1 قيمته 2. وفي التعبير hour - 1 تستبدل Java المتغير بقيمته، وبذلك ينتج ‎11 - 1، الذي قيمته 1. أما في التعبير hour * 60 + minute فيستبدل المتغيران بقيمتيهما، وهذا يعطي ‎11 * 60 + 59. تنفذ عملية الضرب أولًا، معطية التعبير ‎660 + 59. بعد ذلك تجرى عملية الجمع التي تنتج 719. عمليات الجمع والطرح والضرب كلها تعمل كما تتوقع منها تمامًا، لكن عملية القسمة قد تفاجئك. مثلًا، نحاول في التعليمتين التاليتين حساب الجزء الذي مضى من الساعة: System.out.print("Fraction of the hour that has passed: "); System.out.println(minute / 60); الخرج هو: Fraction of the hour that has passed: 0 هذه النتيجة تحير الناس عادة. قيمة minute هي 59، وناتج قسمة 59 على 60 هو 0.98333، وليس 0. المشكلة هي أن Java تنفذ عملية "القسمة الصحيحة" عندما يكون المعاملين عددين صحيحين. عملية القسمة الصحيحة تقرب الناتج دومًا إلى العدد الصحيح السابق، حتى في الحالات التي يكون العدد الصحيح التالي أقرب مثل حالتنا هذه. يمكننا كحل بديل حساب النسبة المئوية بدلًا من العدد العشري: System.out.print("Percent of the hour that has passed: "); System.out.println(minute * 100 / 60); الخرج الجديد هو: Percent of the hour that has passed: 98 لقد قربت النتيجة للأسفل هنا أيضًا، لكن النتيجة الآن صحيحة تقريبًا على الأقل. النقطة العائمة هناك حل مناسب أكثر وهو استخدام أعداد النقطة العائمة (floating-point)، التي تمثل الأعداد العشرية كما تمثل الأعداد الصحيحة أيضًا. في Java، يستخدم النوع double (اختصارًا لعبارة double-precision) افتراضيًا لأعداد النقطة العائمة. يمكنك إنشاء المتغيرات من نوع double وإسناد القيم لها باستخدام نفس الصيغ التي استخدمناها للأنواع الأخرى: double pi; pi = 3.14159; تنفذ Java عملية "قسمة النقطة العائمة" (floating-point division) إذا كان أحد المعاملات أو كلاهما من النوع double. وهكذا يمكننا حل المشكلة التي واجهتنا في القسم السابق: double minute = 59.0; System.out.print("Fraction of the hour that has passed: "); System.out.println(minute / 60.0); الخرج هو: Fraction of the hour that has passed: 0.9833333333333333 ورغم فائدة أعداد النقطة العائمة، إلا أنها قد تسبب الإرباك. مثلًا، Java تفرّق بين القيمة الصحيحة 1 وبين القيمة العشرية 1.0، حتى لو بدا أنهما نفس العدد، فهما يختلفان بالنوع، وعلى وجه الدقة، لا يسمح لك بتنفيذ عمليات إسناد بين النوعين. مثلًا، ما يلي ليس مسموحًا لأن المتغير على الطرف الأيسر من النوع int أما القيمة المسندة له على الطرف الأيمن هي double: int x = 1.1; // compiler error من السهل نسيان هذه القاعدة لأن هناك حالات عديدة تحول فيها Java أحد الأنواع إلى النوع الآخر تلقائيًا. مثلًا: double y = 1; // legal, but bad style من المفترض ألا تكون التعليمة السابقة مشروعة، لكن Java تسمح بها عن طريق التحويل القيمة الصحيحة 1 إلى القيمة العشرية 1.0 تلقائيًا. هذا التساهل مريح، لكنه يسبب المشاكل للمبتدئين غالبًا. مثلًا: double y = 1 / 3; // common mistake قد تتوقع أن يعطى المتغير y القيمة 0.333333، وهي قيمة عشرية مشروعة، لكنه في الواقع سيعطى القيمة 0.0. السبب هو أن العبارة على اليمين هي نسبة بين عددين صحيحين، لذلك تجري Java عملية قسمة صحيحة، والتي تنتج القيمة الصحيحة 0. ثم يتم تحويلها إلى قيمة عشرية، الناتج هو 0.0. إحدى الطرق لحل هذه المشكلة (بعد أن تكتشف أن هذه هي المشكلة) هو جعل الطرف الأيمن عبارة عشرية. التعليمة التالية ستعطي y القيمة 0.333333، كما هو متوقع. double y = 1.0 / 3.0; عليك دائمًا إسناد قيم عشرية لمتغيرات النقطة العائمة في كتابتك. لن يجبرك المترجم على ذلك، لكنك لا تعرف أبدًا متى تظهر لك غلطة بسيطة وتعود عليك وبالًا. أخطاء التقريب معظم أرقام النقطة العائمة صحيحة تقريبيًا. يمكن تمثيل بعض الأرقام بدقة، مثل القيم الصحيحة ذات الأحجام المعقولة. أما الكسور الدورية، مثل 1/3، أو الأرقام غير النسبية، مثل π، فلا يمكن تمثيلها بدقة. الفرق بين العدد الذي نريد والعدد الذي نحصل عليه يدعى خطأ التقريب (rounding error). مثلًا، يجب أن تكون التعليمتان التاليتان متكافئتين: System.out.println(0.1 * 10); System.out.println(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1); لكن الخرج سيكون كما يلي على معظم الحواسيب: 1.0 0.9999999999999999 المشكلة هي أن 0.1، وهو عدد عشري منته في الأساس 10، هو كسر دوري في الأساس 2، ولذلك يكون تمثيله في النقطة العائمة تقريبي حتمًا. وعندما نجمع الأعداد التقريبية معًا تتراكم أخطاء التقريب. الحساب بالنقطة العائمة له مزايا تفوق عيوبه في العديد من التطبيقات، كالرسوميات الحاسوبية، والتشفير، والتحليل الإحصائي، وإظهار (rendering) الوسائط المتعددة. لكن إذا أردت دقة مطلقة، عليك استخدام الأعداد الصحيحة بدلًا منها. خذ على سبيل المثال حساب بنك فيه رصيد قيمته 123.45$: double balance = 123.45; // potential rounding error في هذا المثال، ستصبح الأرصدة غير دقيقة مع الوقت واستخدام المتغير في العمليات الحسابية كالسحب والإيداع. ستكون النتيجة سخط العملاء أو دعاوى قضائية. يمكنك تفادي المشكلة بتمثيل الرصيد كعدد صحيح: int balance = 12345; // total number of cents هذا الحل صحيح طالما أن عدد السنتات لا يتجاوز أكبر قيمة صحيحة يمكن تخزينها، وهي حوالي 2 مليار. العمليات على السلاسل المحرفية بشكل عام، لا يمكنك تطبيق العمليات الرياضية على السلاسل المحرفية، حتى لو كانت السلاسل المحرفية تبدو وكأنها أرقام. التعابير التالية غير مشروعة: "Hello" - 1 "World" / 123 "Hello" * "World" العامل + يعمل مع السلاسل المحرفية، لكنه قد لا ينتج ما تتوقعه. يجري عامل + عملية ربط السلاسل (concatenation) أي دمج المعاملين بوصلهما معًا. وهكذا فإن "Hello" + "World" ستعطي السلسلة "Hello World". أو إذا كان لديك متغير اسمه name من النوع String، فسوف يدمج التعبير "Hello" + "Name" قيمة name مع كلمة الترحيب. بما أن عملية الجمع معرفة للأرقام والسلاسل المحرفية أيضًا، فإن Java تجري عمليات تحويل تلقائية قد لا تتوقعها: System.out.println(1 + 2 + "Hello"); // the output is 3Hello System.out.println("Hello" + 1 + 2); // the output is Hello12 تنفذ Java هذه العمليات من اليسار إلى اليمين. في السطر الأول، 1 + 2 يساوي 3، و 3 + "Hello" يساوي "3Hello". أما في السطر الثاني، Hello" + 1" يساوي "Hello1"، و Hello1" + 2" يعطي "Hello12". ترتيب الحساب عندما يظهر أكثر من عامل في تعبير حسابي فسوف تنفذ حسب ترتيب العمليات (order of operation). بشكل عام، تنفذ Java العمليات حسب ترتيب ورودها من اليسار إلى اليمين (كما رأينا في القسم السابق). لكن Java تتبع قواعد الرياضيات في العمليات الحسابية: عمليتي الضرب والقسمة لهما ”أولوية“ (precedence) على الجمع والطرح. لذا فإن 3 * 2 + 1 سيعطي 7، وليس 9، كما أن 2 / 4 + 2 تعطي 4، وليس 3. إذا كان للعوامل نفس الأولوية فسوف تنفذ بالترتيب من اليسار إلى اليمين. ففي التعبير الحسابي minute * 100 / 60، يتم تنفيذ عملية الضرب أولًا، وإذا كانت قيمة minute هي 59 فسوف ينتج لدينا 60 / 5900، والذي بدوره يعطي 98. لو أن تنفيذ العملية الحسابية جرى من اليمين لليسار، ستكون النتيجة 1 * 59 والذي هو 59، وهو جواب خاطئ. في أي وقت ترغب فيه بتجاوز قواعد الأولوية (أو أنك لم تكن واثقًا من تلك القواعد) يمكنك استعمال الأقواس. يتم تنفيذ العمليات ضمن الأقواس أولًا، لهذا فإن 3 * (2 + 1) يعطي 9. يمكنك استعمال الأقواس أيضًا لجعل العبارات الحسابية أسهل للقراءة، كما في 60 / (minute * 100)، مع أنها لا تغير النتيجة. لا تجهد نفسك في حفظ ترتيب تنفيذ العمليات، خصوصًا مع العوامل الأخرى. إذا لم يكن ترتيب التنفيذ واضحًا عند النظر إلى التعبير، فاستخدم الأقواس لجعله واضحًا. التركيب في الأجزاء السابقة كنا نتعرف على مكونات لغة البرمجة: المتغيرات، والتعابير، والتعليمات بشكل مستقل، دون أن نناقش طريقة استخدامها معاً. أحد أهم ميزات لغات البرمجة هي قدرتها على تركيب (compose) الأجزاء الصغيرة مع بعضها. مثلاً، نحن نعرف كيف نضرب الأرقام ونعرف كيف نعرض القيم. يمكننا دمج هاتين العمليتين في تعليمة واحدة: System.out.println(17 * 3); يمكن استخدام أي تعبير حسابي داخل تعليمات الطباعة. لقد شاهدنا مثالاً على هذا من قبل: System.out.println(hour * 60 + minute); يمكنك أيضاً وضع تعابير حسابية متنوعة على الطرف الأيمن لعملية الإسناد: int percentage; percentage = (minute * 100) / 60; لكن الطرف الأيسر لا بد أن يكون اسم متغير، وليس تعبيراً. ذلك لأن الطرف الأيسر يدل على موقع تخزين النتيجة، والتعابير لا تمثل مواقع تخزينية. hour = minute + 1; // correct minute + 1 = hour; // compiler error قد لا تبهرك القدرة على تركيب العمليات الآن، لكننا سنرى لاحقاً أمثلة تسمح لنا بكتابة حسابات معقدة بشكل مرتب وأنيق. لكن لا تبالغ كثيراً، فالتعابير الكبيرة المعقدة قد تصعب قراءتها وتنقيحها من الأخطاء. أنواع الأخطاء هناك ثلاثة أنواع يحتمل أن تحدث في البرنامج: أخطاء الترجمة، أخطاء التنفيذ، الأخطاء المنطقية من المفيد التمييز بينها في سبيل تتبعها بشكل أسرع. تحدث أخطاء الترجمة (compile-time errors) عندما تخالف التراكيب النحوية (syntax) للغة Java. مثلاً، يجب أن تكون أزواج الأقواس متناظرة. ولذلك فإن (2 + 1) صيغة مقبولة أما (8 ليست كذلك. في الحالة الثانية، لن تتمكن من ترجمة البرنامج، وسيعرض المترجم رسالة خطأ. تدل رسائل الخطأ التي يعرضها المترجم على موقع حدوث الخطأ في البرنامج عادة، وأحياناً تخبرك بطبيعة الخطأ بدقة. على سبيل المثال، لنعد إلى برنامج hello world: public class Hello { public static void main(String[] args) { // generate some simple output System.out.println("Hello, World!"); } } إذا نسيت الفاصلة المنقوطة في نهاية تعليمة الطباعة، فقد تظهر لك رسالة خطأ كما يلي: File: Hello.java [line: 5] Error: ‘;’ expected هذا جيد جداً: موقع الخطأ صحيح، ورسالة الخطأ تخبرك بالمشكلة. لكن رسائل الأخطاء ليست يسيرة الفهم دوماً. أحياناً يعطي المترجم مكان اكتشاف الخطأ في البرنامج، وليس مكان حدوثه حقاً. وأحياناً يكون وصف المشكلة محيراً أكثر مما هو مفيد. مثلاً، إذا نسيت قوس الإغلاق المعقوف في نهاية main (سطر 6)، قد تحصل على رسالة تشبة الرسالة التالية: File: Hello.java [line: 7] Error: reached end of file while parsing هناك مشكلتان هنا. أولاً، رسالة الخطأ مكتوبة من وجهة نظر المترجم، وليس وجهة نظرك أنت. عملية الإعراب (parsing) هي عملية قراءة البرنامج قبل الترجمة؛ فإذا وصل المترجم لنهاية الملف قبل انتهاء الإعراب، فهذا يدل على نقصان شيء ما. لكن المترجم لا يعرف ما هو. كما أنه لا يعرف أين. يكتشف المترجم الخطأ عند نهاية البرنامج (سطر 7)، لكن القوس الناقص يجب أن يكون على السطر السابق. تحوي رسائل الأخطاء معلومات مفيدة، لذلك عليك محاولة قراءتها وفهمها. لكن لا تأخذها بشكل حرفي تماماً. ستمضي غالباً وقتاً طويلاً خلال الأسابيع الأولى في سيرتك البرمجية وأنت تتابع أخطاء الترجمة. لكن مع زيادة خبرتك، سوف ترتكب أخطاءً أقل وستعثر عليها أسرع. النوع الثاني من الأخطاء هي أخطاء التنفيذ (run-time errors)، وقد سمّيت كذلك لأنها لا تظهر قبل تنفيذ البرنامج. في Java، تظهر هذه الأخطاء عندما ينفذ المفسر شفرة بايت ويحدث خطأ ما. تدعى هذه الأخطاء "استثناءات" (exceptions) لأنها تدل عادة على حدوث شيء استثنائي (وسيء). أخطاء التنفيذ نادرة في البرامج البسيطة التي ستراها في الفصول القليلة الأولى، لذلك قد لا ترى واحداً إلا بعد حين. عند حدوث خطأ تنفيذي، يعرض المفسر رسالة خطأ تحوي معلومات تشرح ما حدث وتحدد مكان حدوثه. مثلاً، إذا أجريت عملية قسمة على صفر عن غير قصد فسوف تظهر رسالة تشبه ما يلي: Exception in thread “main” java.lang.ArithmeticException: / by zero at Hello.main(Hello.java:5) بعض هذه المعلومات مفيد في تنقيح البرنامج من الأخطاء. يتضمن السطر الأول اسم الاستثناء java.lang.ArithmeticException ورسالة تبين ما حدث بدقة أكبر "by zero /". يظهر السطر التالي العملية التي حدث فيها الخطأ؛ حيث يقصد بعبارة Hello.main العملية main في الصنف Hello. كما أنه يذكر أيضاً اسم الملف الذي عرفت فيه العملية (Hello.java) ورقم السطر الذي حدث فيه الخطأ (5). أحياناً تحوي رسائل الأخطاء معلومات إضافية لن تفهم معناها الآن. لذلك سيكون أحد التحديات معرفة الأجزاء المفيدة دون أن تغرق بالمعلومات الإضافية. وعليك أن تنتبه أيضاً أن السطر الذي سبب انهيار تنفيذ البرنامج قد لا يكون السطر الذي يحتاج للتصحيح. النوع الثالث من الأخطاء هو الأخطاء المنطقية (logic error). إذا كان هناك خطأ منطقي في برنامجك، فستتم ترجمته وتشغيله دون تولد أي رسالة خطأ، لكنه لن يعطي الناتج الصحيح المطلوب، بل سينفذ ما طلبته منه حرفياً. مثلاً، هذا برنامج hello world فيه خطأ منطقي: public class Hello { public static void main(String[] args) { System.out.println("Hello, "); System.out.println("World!"); } } هذا البرنامج يترجم وينفذ بشكل سليم، لكن الخرج هو: Hello, World! على فرض أننا أردنا أن يكون الخرج على سطر واحد، فهذا الناتج غير صحيح. المشكلة هي أن السطر الأول يستخدم println، بينما نحن أرنا غالباً استخدام print. قد يصعب التعرف على الأخطاء المنطقية لأنك ستضطر للعمل بالمقلوب: تنظر إلى مخرجات البرنامج وتحاول استنتاج السبب الذي يجعله يعطي هذه النتائج الخاطئة، وكيف تجعله يعطي النتائج الصحيحة. عادة لا يستطيع المترجم ولا المفسر مساعدتك هنا، لأنهما لا يعرفان ما هو الشيء الصحيح المطلوب. ترجمة -وبتصرف- للفصل Variables and operators من كتاب Think Java: How to Think Like a Computer Scientist لكاتبيه Allen B. Downey و Chris Mayfield.
  3. كانت البرامج التي اطلعنا عليها لحد الآن تعرض رسائل على الشاشة فقط، الذي لا يشتمل على حسابات حقيقية كثيرة. سيبين لك هذا الفصل طريقة قراءة الدخل من لوحة المفاتيح، واستخدام ذلك الدخل لحساب نتائج معينة، ثم تنسيق تلك النتائج وعرضها على الخرج. صنف System لقد استخدمنا System.out.println كثيرًا، لكن ربما لم تنتبه لمعناها. System هو صنف يوفر توابع متعلقة "بالنظام" (system) أو البيئة التي تعمل فيها البرامج. كما أنه يوفر أيضًا System.out، وهي قيمة خاصة توفر توابع لعرض الخرج، ومنها تابع println. في الواقع، يمكنك استخدام System.out.println لعرض قيمة System.out: System.out.println(System.out); النتيجة هي: java.io.PrintStream@685d72cd يدل هذا الخرج على أن System.out هو PrintStream، معرف ضمن حزمة تدعى java.io. الحزمة (package) هي مجموعة من الأصناف المتعلقة ببعضها؛ تحوي حزمة java.io الأصناف المتعلقة بالدخل والخرج اللذان يرمز لهما بالحرفين I/O والتي تعني Input and Output. أما الأرقام والأحرف بعد علامة @ فهي تمثل عنوان (address) الكائن System.out بشكل رقم ست عشري (في الأساس 16). عنوان القيمة هو موقعها في ذاكرة الحاسوب، وهذا الموقع قد يختلف بين الحواسيب المختلفة (أو عند تشغيل البرنامج في المرات التالية). كان العنوان في هذا المثال 685d72cd، لكن إذا شغلت البرنامج نفسه ثانية فقد تحصل على عنوان مختلف. كما يبين الشكل التالي، الصنف System معرفٌ في ملف اسمه System.java، وهناك ملف آخر يعرف فيه الصنف PrintStream اسمه PrintStream.java. هذه الملفات تابعة لمكتبة (library) لغة Java، وهي عبارة عن مجموعة ضخمة من الأصناف التي تستطيع استخدامها في برامجك. تشير تعليمة System.out.println إلى المتغير out ضمن الصنف System، وهو كائن من النوع PrintStream يوفر تابعًا يدعى println. صنف Scanner يحوي الصنف System أيضًا القيمة الخاصة System.in، وهي InputStream يوفر توابع لقراءة الدخل من لوحة المفاتيح. استخدام هذه التوابع ليس سهلًا؛ لكن لحسن الحظ أن Java توفر أصنافًا أخرى تسهل مهام الإدخال الشائعة. مثلًا، يوفر الصنف Scanner توابع لإدخال الكلمات، والأرقام، وغيرها من البيانات. يتوفر Scanner في الحزمة java.util، التي تحوي أصنافًا مفيدة جدًا تدعى "utility classes" (أصناف المرافق). قبل أن تتمكن من استخدام Scanner، عليك استيراده كالتالي: import java.util.Scanner; توضح تعليمة الاستيراد (import statement) للمترجم أنك عندما تقول Scanner فأنت تقصد أحد الأصناف المعرفة في java.util. هذه التعليمة ضرورية لأنه يحتمل وجود أصناف أخرى اسمها Scanner في حزم أخرى. استخدام تعليمة الاستيراد يجعل الكود واضحًا. لا يمكن استخدام تعليمات الاستيراد داخل تعريف صنف. تقليديًا، توضع تعليمات الاستيراد في بداية الملف. بعد ذلك عليك إنشاء Scanner: Scanner in = new Scanner(System.in); يصرح هذا السطر عن متغير من نوع Scanner ويسميه in وينشئ كائنًا جديدًا من نوع Scanner الذي يستقبل المدخلات من System.in. يوفر Scanner تابعًا يدعى nextLine الذي يقرأ الدخل من لوحة المفاتيح وترجع String. في المثال التالي نقرأ سطرين ونعيد إخراجهما للمستخدم: import java.util.Scanner; public class Echo { public static void main(String[] args) { String line; Scanner in = new Scanner(System.in); System.out.print("Type something: "); line = in.nextLine(); System.out.println("You said: " + line); System.out.print("Type something else: "); line = in.nextLine(); System.out.println("You also said: " + line); } } إذا أغفلت تعليمة الاستيراد ثم استخدمت Scanner سوف يعطي المترجم خطأ يشبه "Cannot find symbol" (لا يمكن العثور على الرمز). هذا يعني أن المترجم لا يعرف ماذا تعني عندما تقول Scanner. لعلك تتساءل لم يمكننا استخدام الصنف System دون استيراده؟ السبب هو أن الصنف System ينتمي لحزمة java.lang، التي تستورد آليًا في جميع البرامج. حسب وثائق اللغة فإن java.lang "توفر أصنافًا جوهرية في تصميم لغة البرمجة Java". صنف String ينتمي أيضًا لحزمة java.lang. بنية البرنامج لقد تعرفنا الآن على كافة العناصر التي تتكون منها برامج Java. يوضح الشكل التالي هذه العناصر التنظيمية. عناصر لغة Java، من الأكبر إلى الأصغر كمراجعة سريعة، الحزمة هي مجموعة أصناف، والأصناف تعرف فيها توابع. التوابع تحوي تعليمات، والتعليمات قد تحوي تعابير. تتكون التعابير من علامات (tokens)، وهي العناصر الأساسية للبرنامج، وتشمل الأرقام، وأسماء المتغيرات، والعوامل الحسابية، والكلمات المفتاحية، والرموز مثل الأقواس والفواصل المنقوطة. تأتي النسخة القياسية من Java مزودة بعدة آلاف من الأصناف التي يمكنك استيرادها، وهذا مثير جدًا ومخيف في نفس الوقت. يمكنك تصفح مكتبة جافا حيث أنها نفسها مكتوبة بلغة Java. لاحظ أن هناك فرق كبير بين لغة Java، التي تُعرّف التراكيب النحوية ومعاني العناصر المبينة في الشكل السابق، وبين مكتبة Java، التي توفر الأصناف المرفقة مع اللغة. التحويل من إنش إلى سنتيمتر دعنا نلق نظرة على مثال مفيد قليلًا. رغم أن معظم دول العالم اعتمدت النظام المتري للأوزان والمقاييس، إلا أن بعض الدول لا تزال عالقة مع الواحدات الإنكليزية. مثلًا، عندما يتحدث الأمريكان مع أصدقائهم من أوربا عن الطقس، قد يحتاجون للتحويل بين الدرجات المئوية والفهرنهايت. أو قد يرغبون بتحويل الأطوال من واحدة الإنش إلى السنتيمتر. يمكننا كتابة برنامج يساعد في ذلك. سنستخدم Scanner لإدخال القياسات بالإنش، ثم نحولها إلى سنتيمتر، ثم نعرض النتائج. تصرح السطور التالية عن المتغيرات وتنشئ Scanner: int inch; double cm; Scanner in = new Scanner(System.in); الخطوة التالية هي طلب المدخلات من المستخدم. سنستخدم تعليمة print بدلًا من println حتى يتمكن من كتابة المدخلات على نفس السطر. وسنستخدم تابع nextInt من الصنف Scanner، التي تقرأ الدخل من لوحة المفاتيح وتحوله إلى عدد صحيح: System.out.print("How many inches? "); inch = in.nextInt(); بعد ذلك، سوف نضرب الرقم المدخل بالقيمة 2.54، بما أننا نعرف أن كل إنش هو 2.54 سنتيمتر، ثم نعرض النتيجة: cm = inch * 2.54; System.out.print(inch + " in = "); System.out.println(cm + " cm"); هذه الأكواد تعمل بشكل صحيح، لكن هناك مشكلة صغيرة. إذا قرأ مبرمج آخر هذا الكود، فقد يتساءل من أين أتت القيمة 2.54. من أجل مصلحة الآخرين (ومصلحتك المستقبلية) يفضل إسناد هذه القيمة إلى متغير له اسم واضح. سنوضح ذلك في القسم التالي. القيم الحرفية والثوابت تدعى القيم التي تكتب في البرنامج، مثل 2.54، بالقيم الحرفية (literals). بشكل عام، ليس هناك مشكلة باستخدام القيم الحرفية. لكن عندما تظهر أرقام مثل 2.54 في التعابير دون أي تفسير، سوف تجعل الكود أصعب على القراءة. وإذا ظهرت القيمة نفسها مرات عديدة، وكانت هناك احتمال أن تتغير هذه القيمة في المستقبل، فهذا يجعل الكود أصعب على الصيانة والتجديد. هذه القيم تدعى أحيانًا الأرقام السحرية (magic numbers) (مع العلم أن الأشياء "السحرية" ليست جيدة هنا). من الممارسات الجيدة إسناد هذه القيم السحرية إلى متغيرات لها أسماء معبرة، كما يلي: double cmPerInch = 2.54; cm = inch * cmPerInch; هذه النسخة أسهل للقراءة وأقل عرضة للخطأ، لكن لا يزال هناك مشكلة. المتغيرات تتغير، لكن عدد السنتيمترات في الإنش الواحد لا يتغير. يجب ألا تتغير قيمة cmPerInch بعد إسناد قيمته أول مرة. توفر Java الكلمة المفتاحية final لفرض هذا الشرط. final double CM_PER_INCH = 2.54; التصريح عن متغير بكلمة final يعني أنه لا يمكن إسناد قيم جديدة له بعد نهيئته أول مرة. إذا حاولت تغيير قيمته، سوف يعطيك المترجم خطأ. تدعى المتغيرات التي يصرح عنها بكلمة final بالثوابت (constants). حسب التقاليد، تكتب أسماء الثوابت بحروف كبيرة، وتستخدم الشرطة المنخفضة (_) للفصل بين الكلمات. ترجمة -وبتصرف- للفصل Input and output من كتاب Think Java: How to Think Like a Computer Scientist لكاتبيه Allen B. Downey و Chris Mayfield.
  4. تقليديًا، البرنامج الأول الذي يكتبه الناس عندما يتعلمون لغة برمجة جديدة يسمى برنامج hello world (مرحبًا بالعالم). كل ما يفعله هذا البرنامج هو طباعة العبارة "!Hello, World" على الشاشة. في لغة Java، يبدو هذا البرنامج كما يلي: public class Hello { public static void main(String[] args) { // generate some simple output System.out.println("Hello, World!"); } } عند تشغيل هذا البرنامج سيعرض ما يلي: Hello, World! لاحظ أن الخرج لا يحوي علامات الاقتباس. تتكون برامج Java من صنف (class) وتعريفات توابع (methods)، وتتكون التوابع منتعليمات (statements). التعليمة هي سطر من الكود ينفذ عملية بسيطة. في برنامج hello world، هذا السطر هو تعليمة طباعة التي تعرض رسالة على الشاشة: System.out.println("Hello, World!"); يعرض تابع System.out.println النتائج على الشاشة؛ يرمز اسم التّابع println للعبارة "print line" (اطبع سطرًا). من المحيّر أن كلمة اطبع قد تعني "اعرضها على الشاشة" وقد تعني "أرسلها إلى الطابعة". في سلسلتنا هذه، سنحاول عندما نقصد الإخراج على الشاشة أن نقول: "عرض". تنتهي تعليمة الطباعة بفاصلة منقوطة (;) مثل معظم التعليمات. لغة Java "حساسة لحالة الأحرف" (case-sensitive)، وهذا يعني أن الحروف الكبيرة تعتبر مختلفة عن الحروف الصغيرة. في هذا المثال، يجب أن تبدأ كلمة System بحرف كبير؛ وإذا كتبت system أو SYSTEM فلن يعمل. التّابع (method) هو سلسلة تعليمات تحمل اسمًا. هذا البرنامج يعرف تابعًا وحيدًا اسمه main: public static void main(String[] args) اسم التّابع main وشكله خاصين: عند تشغيل البرنامج، يبدأ التنفيذ عند أول تعليمة في main وينتهي عند إنهاء آخر تعليمة فيها. سنرى لاحقًا برامج تعرف فيها أكثر من تابع واحد. الصنف (class) هو مجموعة عمليات. يعرف هذا البرنامج صنفًا اسمه Hello. يمكنك تسمية الصنف بأي اسم تشاء، لكن جرت العادة أن يبدأ اسم الصنف بحرف كبير. يجب أن يطابق اسم الصنف اسم الملف الذي يحويه، ولذلك يجب أن تحفظ هذا الصنف في ملف اسمه Hello.java. تستخدم Java الحاضنات ( { و } ) لتجميع الأشياء مع بعضها. في ملف Hello.java: تضم الحاضنات الخارجية تعريف الصنف، أما الحاضنات الداخلية فتضم تعريف التّابع. السطر الذي يبدأ بشرطتين مائلتين (//) هو تعليق (comment)، وهو عبارة عن نص يوضع لتوضيح الشفرة المصدرية. عندما يرى المترجم علامة // يتجاهل كل شي يليها حتى نهاية السطر. لا تؤثر التعليقات على تنفيذ البرنامج، لكنها تسهل فهم المقصود من التعليمات للمبرمجين الآخرين (ولك أنت في الأوقات اللاحقة). عرض السلاسل المحرفية يمكنك وضع أي عدد من التعليمات داخل main. مثلًا، حتى تعرض أكثر من سطر واحد على الخرج: public class Hello { public static void main(String[] args) { // generate some simple output System.out.println("Hello, World!"); // first line System.out.println("How are you?"); // another line } } كما يبين هذا المثال، يمكنك وضع التعليقات في نهاية السطور كما يمكنك وضعها على سطور كاملة وحدها. تدعى العبارات التي تحيط بها علامات الاقتباس بالسلاسل المحرفية (strings)، لأنها تحوي سلسلة من "المحارف" (characters) المتتابعة. قد يكون المحرف رقمًا، أو حرفًا، أو علامة ترقيم، أو رمزًا، أو فراغًا (space)، أو علامة جدولة (tab)، الخ. تلحق تعليمة System.out.println محرفًا خاصًا بالسلسلة المحرفية، وهو محرف السطر الجديد (newline)، الذي يحرك مؤشر الطباعة إلى بداية السطر التالي. إذا لم ترغب بمحرف السطر الجديد في نهاية العبارة، يمكنك استخدام print بدلًا من println. public class Goodbye { public static void main(String[] args) { System.out.print("Goodbye, "); System.out.println("cruel world"); } } في هذا المثال، لا تضيف التعليمة الأولى محرف السطر الجديد، لذلك يظهر الخرج على سطر واحد كالتالي: Goodbye, cruel world. لاحظ أن هناك فراغًا في نهاية السلسلة المحرفية الأولى، والذي يظهر في خرج البرنامج. سلاسل الهروب يمكنك أن تعرض عدة سطور على الخرج بسطر كود واحد. عليك فقط أن تخبر Java بمواضع فواصل السطور. public class Hello { public static void main(String[] args) { System.out.print("Hello!\nHow are you doing?\n"); } } الخرج هنا سطرين، وكل منهما ينتهي بمحرف السطر الجديد: Hello! How are you doing? المحرفين n\ هما سلسلة هروب (escape sequence)، وهذه السلاسل عبارة عن عدة محارف تعبر عن محرف خاص واحد. تسمح لك الشرطة الخلفية (\) بالهروب من التفسير الحرفي للسلسلة. لاحظ عدم وجود فراغ يفصل بين n\ وبين How. إذا أضفت فراغًا بينهما، سيظهر الفراغ في بداية السطر الثاني. تستخدم سلاسل الهروب أيضًا لطباعة علامات الاقتباس داخل السلاسل المحرفية. بما أن علامات الاقتباس تحدد بدايات السلاسل المحرفية ونهاياتها، فلا يمكنك وضعها في نص السلسلة دون استخدام علامة الشرطة الخلفية. System.out.println("She said \"Hello!\" to me."); سلسلة الهروب المحرف الناتج n\ سطر جديد t\ علامة جدولة؛ تعادل ثمانية فراغات أفقية عادة "\ علامة اقتباس \\ شرطة مائلة خلفية الجدول 1.1: بعض سلاسل الهروب الشائعة الناتج هو: She said "Hello!" to me. تنسيق الكود بعض الفراغات إلزامية في برامج Java. فلا بد، على سبيل المثال، من فصل الكلمات عن بعضها بفراغ واحد على الأقل؛ أي أن البرنامج التالي غير صالح: publicclassGoodbye{ publicstaticvoidmain(String[] args) { System.out.print("Goodbye, "); System.out.println("cruel world"); } } لكن معظم الفراغات الأخرى اختيارية. مثلًا، هذا البرنامج صالح: public class Goodbye { public static void main(String[] args) { System.out.print("Goodbye, "); System.out.println("cruel world"); } } كما أن فصل التعليمات على سطور مختلفة اختياري أيضًا. بالتالي يمكننا كتابة البرنامج السابق هكذا: public class Goodbye{public static void main(String[] args){System.out.print("Goodbye, "); System.out.println("cruel world");}} سيعمل البرنامج، لكن قراءته ازدادت صعوبة في كل مرة. استخدام الفراغات وتوزيع التعليمات على سطور منفصلة مهمان جدًا لتنظيم برنامجك بصريًا، لتسهيل فهمه وتسهيل العثور على الأخطاء فيه عند حدوثها. في العادة، تجد في المنظمات التي تعمل كثيرًا في تطوير البرمجيات شروطًا صارمة تحدد طريقة ترتيب الشفرات المصدرية. مثلًا، تنشر Google معاييرها الخاصة حول كتابة أكواد Java للاستخدام في المشاريع مفتوحة المصدر:http://google.github.io/styleguide/javaguide.html. قد لا تستوعب هذه المعايير الآن، لأنها تذكر بعض مزايا لغة Java التي لما تتعرف عليها. لكنك قد ترغب بزيارتها بين الحين والآخر أثناء قراءة هذه السلسلة. تنقيح الكود كلما أردت اختبار ميزة جديدة، عليك تجربة ارتكاب بعض الأخطاء عن عمد. على سبيل المثال، في برنامج hello world، ماذا يحدث لو أسقطت إحدى علامات الاقتباس؟ ماذا لو أسقطت العلامتين معًا؟ وماذا لو أخطأت بكتابة println؟ هذه التجارب تساعدك على تذكر ما تقرؤه. كما تساعدك في تنقيح الكود، لأنك تتعلم معنى رسائل الأخطاء المختلفة. من الأفضل أن ترتكب الأخطاء الآن عمدًا بدلًا من أن تقع بها لاحقًا دون قصد. تصحيح الأخطاء يشبه العلوم التجريبية أيضًا: بمجرد أن تظن أنك عرفت ما هو الخطأ، تعدل برنامجك وتجرب ثانية. إذا كانت فرضيتك صحيحة، عندئذ ستتمكن من التنبؤ بنتيجة التعديل، وتقترب خطوة من البرنامج الصحيح المطلوب. أما إذا كانت فرضيتك خاطئة، عليك أن تجد حلًا آخر. يجب أن تتلازم البرمجة مع تنقيح الكود من الأخطاء. لا تكتب سطورًا كثيرة وبعدها تنتقل إلى عملية تصحيح معتمدًا على التجربة والخطأ حتى تصل للنتيجة المطلوبة. بل عليك أن تبدأ ببرنامج يعمل قادر على تنفيذ شيء ما، ثم عمل تعديلات صغيرة، وتنقيحها أولًا بأول، حتى تصل إلى برنامج يعطيك النتيجة المطلوبة. بهذا الأسلوب، سيبقى برنامجك يعمل دائمًا، وسيسهل عليك عزل الأخطاء. من الأمثلة الممتازة على هذا المبدأ نظام التشغيل لينكس (Linux)، الذي يحوي ملايين السطور البرمجية. بدأ لينكس كبرنامج بسيط استعمله لينوس تورفالدز (Linus Torvalds) ليستكشف رقاقة إنتل 80386. وعلى حد قول لاري غرينفيلد (Larry Greenfield) في دليل مستخدم لينكس (The Linux Users’ Guide)، ”أحد أولى مشاريع لينوس كان برنامجًا يبدل بين طباعة AAAA و BBBB. ثم تطور هذا إلى لينكس“. أخيرًا، قد تثير البرمجة أحاسيس قوية. إذا كنت تسارع علة صعبة، قد تشعر بالغضب، أو القنوط، أو الحرج. تذكر أنك لست وحدك، وإن جُلّ المبرمجين إن لم يكن كلهم عانوا من حالات مشابهة. لا تتردد في طرح الأسئلة على أحد الأصدقاء! أدوات التطوير تعتمد خطوات ترجمة وتنفيذ وتنقيح أكواد Java على بيئة التطوير لديك ونظام التشغيل الذي تستخدمه. الجزء التّالي هو مقدمة مختصرة لبيئة DrJava وهي بيئة تطوير متكاملة (Integrated Development Environment أو IDE اختصارًا) مناسبة للمبتدئين. تثبيت DrJava أسهل طريقة لبدء البرمجة بلغة Java هي استخدام موقع يترجم لك شفرات Java وينفذها في المتصفح. هناك على سبيل المثال jdoodle.com، و compilejava.net، و tutorialspoint.com، وغيرها. إذا لم تكن قادرًا على تثبيت برامج جديدة على حاسوبك (وهذه هي الحال غالبًا في المدارس العامة ومقاهي الإنترنت)، يمكنك استخدام بيئات التطوير هذه المتاحة عبر الإنترنت لتنفيذ معظم البرامج في هذا الكتاب. لكن إذا أردت ترجمة وتشغيل برامج Java على حاسوبك، سوف تحتاج: عدة تطوير Java‏ (Java Development Kit أو JDK)، التي تتضمن المترجم، وآلة Java الافتراضية (Java Virtual Machine أو JVM) التي تفسر شفرات بايت الناتجة عن الترجمة، وغيرها من الأدوات مثل Javadoc. محرر نصوص بسيط مثل Notepad++‎ أو Sublime Text، أو بيئة تطوير مثل DrJava، أو Eclipse، أو jGrasp، أو NetBeans. بالنسبة لعدة التطوير (JDK) ننصحك باستخدام Java SE (النسخة القياسية Standard Edition)، التي توفرها Oracle مجانًا. ننصحك أيضًا باستخدام DrJava، وهي بيئة تطوير متكاملة (IDE) مفتوحة المصدر ومكتوبة بلغة Java (انظر الشكل أ.1). لتثبيت JDK، ابحث في الوب عن "download JDK" ويجب أن توصلك النتائج إلى موقع Oracle. انزل لأسفل حتى تصل إلى"Java Platform, Standard Edition" وانقر زر تنزيل JDK. ثم اقبل اتفاقية الترخيص واختر المثبت المناسب لنظام تشغيلك. لا تنسَ تشغيل برنامج التثبيت بعد تنزيله! لثبيت DrJava، اذهب إلى http://drjava.org ونزّل ملف JAR. ننصحك بحفظه على سطح المكتب أو مكان مناسب آخر. فقط انقر على ملف JAR نقرة مزدوجة لتشغيل DrJava. ننصحك عند تشغيل DrJava أول مرة بتغيير ثلاثة خيارات يمكنك الوصول إليها من قائمة: Edit > Preferences في قسم Miscellaneous: عدل Indent Level (المسافة البادئة) إلى 4، وفعّل خيار Automatically Close Block Comments، وألغِ تفعيل خيار Keep Emacs-style Backup Files. الوضع التفاعلي في DrJava إحدى أهم ميزات DrJava هي "لوحة التفاعل" أسفل النافذة. يمكنك تجربة الشفرات فيها بسرعة، دون كتابة تعريف صنف ودون المرور بمراحل حفظ وترجمة وتنفيذ البرنامج. يظهر الشكل التالي مثالًا. هناك ملاحظة دقيقة وحيدة عليك الانتباه لها عند استخدام ميزة التفاعل. إذا لم تضع فاصلة منقوطة في نهاية التعبير الحسابي أو التعليمة، سوف يعرض DrJava النتيجة تلقائيًا. لاحظ في الشكل السابق إنهاء سطور التصريح عن المتغيرات بفواصل منقوطة، بينما لا توجد فواصل في نهايات التعابير المنطقية في السطور التي تليها. توفر عليك هذه الميزة طباعة System.out.println كل مرة. الجميل في هذه الميزة هو أنك لا تحتاج لتعريف صنف جديد، ثم تعريف عملية main، ثم كتابة تعابير عشوائية ضمن تعليمات System.out.println، ثم حفظ الملف المصدري، وبعدها ترجمة الشفرات المصدرية كلها بشكل سليم قبل رؤية النتائج. كما يمكنك أيضًا استخدام السهمين العلوي والسفلي من لوحة المفاتيح لتكرار الأوامر السابقة وتجربة اختلافات متعددة. ترجمة -وبتصرف- لجزء من الفصل الأول من كتاب Think Java: How to Think Like a Computer Scientist لكاتبيه Allen B. Downey و Chris Mayfield.
  5. لقد تعرّفنا في الجزء الأول من هذا الدرس على Microsoft Publisher وعلى الوظائف التي يقوم بها والخصائص التي يوفرها. وتعلّمنا بعض أساسيات الاستخدام كإنشاء المنشورات الجديدة، تحريرها وحفظها. سنكمل الشرح في هذا الجزء وسنتعرف على كيفيّة تنظيم العمل على المنشور وتخصيص هوامشه ومن ثم تهيئته للطباعة. كيف تسهل عملك باستخدام منطقة التسويد Scratch Area وأوامر الترتيب Arrange لقد تطرقنا بلمحة بسيطة إلى منطقة التسويد في الجزء السابق، وذكرنا أنّها المنطقة الرمادية المحيطة بالصفحة والتي يمكن استخدامها لتحضير وخزن مختلف العناصر (الصور، الأشكال، النصوص) التي ننوي استخدامها لاحقا في المنشور. وهذي المنطقة هي نفسها لجميع الصفحات (أي لا تتغير محتوياتها بتغيّر الصفحة). لإدراج الصور من الجهاز داخل منطقة التسويد، قم بتحديد الصور في المجلد ثم اسحبها إلى هذه المنطقة. يمكنك إضافة عناصر أخرى، تعديلها، وتنسيقها وهي في هذه المنطقة. وعندما يحين وقت استخدامها قم بسحبها إلى الصفحة. كما يمكنك تبديل الصور بين منطقة التسويد والصفحة. حدد الصورة التي تريد إدراجها (بدلا من صورة أخرى موجودة في الصفحة) ثم انقر على المربع الأبيض الذي سيظهر في وسط الصورة واسحبها فوق الصورة الأخرى. عندما يظهر إطار ورديّ اللون قم بإفلات زر الفأرة: سيتم تغيير حجم الصورة الثانية ليناسب حجم الصورة الأصلية تلقائيًا، وستُنقل الصورة الأصلية إلى منطقة التسويد (كما تلاحظ في الصورة أعلاه). يمكنك تطبيق نفس العملية بالعكس (أي تبديل الصور من الورقة إلى منطقة التسويد). من الأدوات الأخرى المفيدة عند العمل على المنشورات هي التجميع Grouping. تسهل هذه الأداة العمل لأنّ المنشور يمكن أن يتكون من العديد من العناصر، وأحيانًا من الأفضل جمع عنصرين أو أكثر معًا لاختصار خطوات تنسيقها ونقلها من موضع إلى آخر. على سبيل المثال، سيكون من السهل تحريك الصورة الموضّحة أدناه مع تسميتها التوضيحية أو تحجيمها عندما تتعامل معها كعنصر واحد. انقر على الصورة لتحديدها، اضغط على مفتاح CTRL، ثم انقر على مربع النص لتحديده وبذلك سيتحدد العنصران معا. سيظهر تبويب تنسيق Format السياقي الخاص بأدوات الرسم Drawing Tools. من هذا التبويب انقر على تجميع Group: سيتحول مربعا التحديد إلى مربع واحد، وبذلك أصبح بإمكانك التعامل مع الصورة ومربع النص كعنصر واحد. وإذا قمت بتطبيق أي تنسيق، سيُطبّق على العنصرين معا. إذا رغبت لاحقا في تنسيق الصورة بشكل مستقل، يمكنك فك التجميع وتنسيقها، ثم إعادة التجميع. لفك التجميع حدد العنصر المجمّع، وانقر على أمر Ungoup من نفس التبويب: أمر آخر سيفيدك عند ترتيب العناصر المتراكبة هو الإحضار إلى الأمام Bring Forward أو الإرسال إلى الخلف Send Backward. على سبيل المثال، إذا رغبت في أن تكون الصورة الأخيرة المحددة أدناه هي الصورة الأمامية انقر على أمر إحضار إلى الأمام Bring Forward: لكن هذا الأمر سينقل الصورة مستوى واحد إلى الأمام (أي سيكون ترتيبها وسطي وليس أمامي في هذا المثال): لإحضارها في مقدمة جميع العناصر استخدم أمر إحضار إلى المقدمة Bring to Front بدلا من أمر Bring Forward: الشيء نفسه ينطبق على أمري الإرسال إلى الخلف Send Backward وإرسال إلى الخلفية Send to Back. الأول يقوم بتحريك العنصر مستوى واحد إلى الخلف، والثاني يقوم بتحريك العنصر إلى خلف جميع العناصر الموجودة خلفه. إعداد هوامش المنشور وخطوط الإرشاد تحتوي المنشورات بصورة عامة على هوامش Margins، وعند إعداد هذه الهوامش بصورة صحيحة ستتجنّب المشاكل التي قد تحصل عند طباعة المنشور. إذ تتطلب بعض أنواع الطابعات هوامش بأبعاد محددة لكي يُطبع المنشور بشكل صحيح. الهوامش هي المساحة الفارغة حول الورقة، ويمكن تغيير الهوامش بالذهاب إلى تبويب: تصميم الصفحة Page Design > هوامش Margins هناك ثلاثة أنواع من الهوامش القياسية، العريض Wide، المتوسط Moderate، والضيق Narrow. يمكنك اختيار أحد هذه الأنواع الثلاثة أو تعيين هوامش بأبعاد مخصصة Custom Margins: في مربع الحوار Layout Guides قم بإدخال أبعاد الهوامش المرغوبة في حقولها المخصصة، ويمكنك الاستدلال بمربع المعاينة لمعرفة كيف ستبدو الهوامش قبل أن تغلق مربع الحوار. بالرغم من أنّ الكثير من الطابعات التجارية تتيح إمكانية طباعة كافة محتويات الصفحة من الحافة إلى الحافة، إلّا أنّ هناك بعض الطابعات، وخصوصا المكتبية، لا توفر هذه الخاصية. لذلك من الأفضل إعداد هوامش الصفحة لكي تضمن طباعة المنشور بصورة صحيحة وعدم اقتطاع شيء من محتوياته مهما كان نوع الطابعة التي ستستخدمها. ولتتأكد من عدم خروج محتويات الصفحة عن الهوامش، استفد من خطوط إرشاد الهامش Guides وقم بمحاذاة العناصر داخله. لاحظ أنّه عندما تقوم بتحريك أي عنصر بالقرب من خط الهامش سيتغير لونه إلى أزرق غامق، وهو بذلك يخبرك أنّك قد وصلت إلى حد الهامش وأن أي حركة إضافية ستُخرج العنصر خارج الحد: بإمكانك إضافة خطوط إرشاد قياسية وبتخطيطات مختلفة من قائمة Guides في تبويب تصميم الصفحة Page Design: كما يمكنك إضافة خطوط إرشاد أفقية أو عمودية يدويا بتمرير المؤشر فوق حافة المسطرة إلى أن يتحول شكله إلى سهمين صغيرين، ثم السحب باتجاه الورقة إلى الموضع الذي تريد وضع خط الإرشاد فيه (استخدم المسطرة لضبط الأبعاد): هاتان الأداتان (المسطرة وخطوط الإرشاد) مفيدتان جدا في محاذاة العناصر وضبطها بصورة قياسية. إن لم تكن المسطرة وخطوط الإرشاد ظاهرة، اذهب إلى تبويب عرض View وتأكد من تأشير الخيارين Rulers و Guides: استخدام الصفحات الرئيسية Master Pages تشابه الصفحات الرئيسية القوالب، إلّا أنّ محتوياتها تكون غير قابلة للحذف أو التعديل. ومهما كان نوع وعدد العناصر المضافة إلى الصفحة الرئيسية، ستتكرر هذه العناصر عن إنشاء صفحة جديدة تندرج تحت تلك الصفحة الرئيسية. يُستفاد من الصفحات الرئيسية في توفير الوقت، إذ أنّك لن تضطر إلى إعادة إنشاء بعض العناصر التي تحتاج إلى تكرارها في كل صفحة، كالهوامش، أو أرقام الصفحات. كما أنّها وسيلة للحفاظ على تناسق مظهر المستند ككل كلما قمت بإضافة صفحات جديدة. يمكن أن يحتوي المنشور على صفحة رئيسية واحدة أو أكثر، وحسب الحاجة، وليتوضح لك المقصود من ذلك افتح قالبا فارغا واذهب إلى تبويب عرض View ثم انقر على الصفحة الرئيسية Master Page: ستلاحظ وجود صفحة رئيسية واحدة (A) بتخطيط بسيط جدا ولا تحتوي على أي عنصر (وذلك لأنّك قمت بفتح القالب الفارغ): قم بإغلاق القالب الفارغ وافتح قالبا آخر، وليكن Baby Photo Album مثلا: ستلاحظ أنّ هذا القالب يحتوي على عناصر مختلفة، مثل الأشكال، الإطارات، إلخ. لكن عندما تحاول تحديد أي من هذه العناصر (ما عدا العناصر النائبة للصور)، لتغيير حجمها أو تعديلها مثلا، لن تتمكن من ذلك. والسبب هو أنّها مضافة على الصفحة الرئيسية وليس على الصفحات العادية. بنفس الطريقة اذهب إلى تبويب: عرض View > الصفحة الرئيسية Master Page ستجد أنّ هذا القالب مكوّن من 6 صفحات رئيسية، ومن طريقة العرض هذه ستتمكن من تحديد العناصر وتعديلها: من الصفحة الرئيسية يمكنك إدراج مختلف العناصر وإجراء العديد من التنسيقات. وكما ذكرنا، كلّ ما يتم إضافته إليها لا يمكن التعديل عليه لاحقا من الصفحات العادية. لنفترض أنّك تريد إضافة شعار، أو علامة مائية، وتريد تكرارها على جميع الصفحات التي ستقوم بإضافتها لاحقا. اذهب إلى طريقة العرض الصفحة الرئيسية Master Page وقم بإدراج الصورة من تبويب إدراج ونسّقها حسب الرغبة. ثم أغلق الصفحة الرئيسية بالنقر على Close Master Page: بعد ذلك، عندما تقوم بإدراج صفحات جديدة لاحقا، سيتكرر كل ما قمت بإضافته في الصفحة الرئيسية: لإضافة صفحة رئيسية ثانية، اذهب إلى طريقة العرض Master Page وانقر على إضافة صفحة رئيسية Add Master Page: يمكنك مثلا إضافة رأس Heard كرقم الصفحة، التاريخ، أو عنوان مخصص: لإنشاء صفحة اعتيادية جديدة بنفس نمط الصفحة الرئيسية الجديدة (B في هذا المثال)، اذهب إلى تبويب: إدراج Insert > صفحة Page > إدراج صفحة Insert Page في مربع الحوار Insert Page، حدد عدد الصفحات التي تريد إدراجها وفيما إذا كانت قبل أو بعد الصفحة المحددة حاليا، ثم حدد الصفحة الرئيسية B (وهي الصفحة الرئيسية الثانية التي قمنا بإنشائها): استخدام مدقق التصميم Design Checker كما هو واضح من الاسم، مدقق التصميم هو أداة تُستخدم للبحث عن أية مشاكل محتملة في تصميم المنشور قبل أن تقوم بطباعته أو مشاركته مع الآخرين. لتشغيل مدقق التصميم اذهب إلى تبويب File ثم انقر على Run Design Checker: سيتم فحص المستند وتدقيق التصميم بشكل عام (وهو الخيار الافتراضي)، وستُعرض العناصر التي تحتوي على مشاكل إن وجدت: إذا كان منشورك موجهًا للطباعة، وهو الغالب، قم بتأشير خيار Run Final Publishing Checks. انقر على السهم بجانب كل عنصر يحتوي على مشكلة واختر أحد خيارات القائمة. يمكنك الانتقال إلى ذلك العنصر Go to this Item، تصحيحه Fix (إن وجد تصحيح تلقائي)، عدم تشغيل عملية التحقق هذه مجددا Never Run this Check Again، أو الحصول على تفسير لهذه المشكلة Explain (هذا الخيار سينقلك إلى نافذة المساعدة): يمكنك التحكم أكثر بخيارات المدقق بالنقر على Design Checker Options. يمكنك مثلا التحكم في الصفحات التي سيتم تدقيقها (كافة الصفحات All أو الصفحة الحالية فقط Current Page) من تبويب General: ومن تبويب Checks يمكنك تحديد عمليات التدقيق التي يجريها البرنامج، والتي يتم تنبيهك بها إن وجدت مشكلة (كافة عمليات التدقيق محددة بشكل افتراضي). إذا كانت هناك عملية تدقيق ترى أنّها غير ضرورية يمكنك إلغاء تأشيرها: بعد تصحيح جميع المشاكل يمكنك إغلاق المدقق بالنقر على Close Design Checker، وبذلك يُعتبر منشورك جاهزا للطباعة أو المشاركة. تهيئة المنشورات للطباعة بواسطة الطابعات التجارية في بعض الأحيان تحتاج إلى استخدام الطابعات التجارية لطباعة منشورك. قد يكون السبب هو أنّ طابعتك المكتبية لا تطبع المنشور بالحجم الذي تريده، أو أنّ كفاءتها في طباعة منشورات بجودة وكمية محددة غير جيّدة. في هذه الحالة يجب أن تقوم بتصدير منشورك بصيغة ملائمة قبل الذهاب إلى مكتب الطباعة. بعض المكاتب تفضّل طباعة المنشورات بصيغة PDF، والبعض الآخر تفضل صيغ الصور (مثل JPEG أو TIFF). لتهيئة المنشور للطباعة اذهب إلى تبويب: File > Export > Save for Commercial Printer يمكنك تصدير المنشور بصيغة PDF مباشرة كما وضّحنا في الجزء السابق من هذا الدرس، لكنّ خيار الحفظ لطابعة تجارية يتيح لك التحكم في خيارات إضافية. حيث يمكنك تحديد جودة الطباعة (الخيار Commercial Press هو الخيار الافتراضي، وهو الأعلى جودة). بالإضافة إلى ذلك يمكنك تصدير ملفي PDF وPub معا، ملف PDF فقط، أو ملف Pub فقط: بعد تحديد الخيارات المرغوبة انقر على زر Pack and Go Wizard، حدّد مجلد الحفظ ثم Next، وسيقوم البرنامج بتصدير الملف إلى المجلد المحدد (عند الانتهاء يمكنك طباعة تدقيق مركب Print Composite Proof أو عدم طباعته). يعتبر هذا الخيار (Save for Commercial Printer) ملائما إذا كان المنشور يحتوي على نصوص بالدرجة الأكبر. أما إذا كانت العناصر الجرافيكية هي الغالبة في تصميم المنشور فالخيار الملائم هو حفظ لطباعة الصور Save for Photo Printing. حدّد صيغة الصور، ثم انقر على Save Image Set: إن اخترت الخيار الأول ستجد في مجلد الحفظ مجلد مضغوط يحتوي على ملف Pub وآخر PDF (في حالة الخيار الافتراضي): وإن اخترت الخيار الثاني، ستجد في مجلد الحفظ عدد من الصور (حسب صفحات المنشور): وبهذا يكون درسنا حول أساسيات Publisher قد انتهى. تعليقاتكم واستفساراتكم مرحب بها.
  6. بعد الانتهاء من إنشاء جداول البيانات الخاصة بك، تنسيقها، وإجراء كافة التغييرات المرغوبة، ربما تحتاج إلى طباعة نسخه منه لأي غرض من الأغراض. لكنّ أوراق اكسل ليست كصفحات وورد مُعدّة لتتناسب مع ورقة الطباعة. فقد يتجاوز عرض جدول بياناتك أو طوله حجم ورقة الطباعة بحكم العدد الهائل من الصفوف والأعمدة التي يمكن العمل عليها في ورقة العمل. سنقوم في هذا الدرس بشرح كيفية إعداد أوراق العمل في اكسل وتخصيص الخيارات لتبدو منظمة بشكل جيّد عند طباعتها. تخصيص خيارات الورقة يوجد في خانة إعداد الصفحة Page Setup في تبويب تخطيط الصفحة Page Layout العديد من الأوامر التي يمكنك استخدامها لتخصيص حجم الورقة، اتجاهها، أبعاد الهوامش وغيرها من الخيارات. يمكنك تغيير هوامش الصفحة الاعتيادية واختيار هوامش بأبعاد قليلة إذا كان محتوى الورقة يحتاج إلى المزيد من المساحة ليتناسب وحجم ورقة الطباعة. ففي المثال أدناه نلاحظ خروج أحد أعمدة الجدول عن حدود الطباعة (الخطوط المتقطعة) بسبب اختيار الهامش العادي Normal: لكن عند اختيار هامش ضيّق Narrow سيتناسب مع حدود الطباعة تماما: كما يمكنك إعداد هوامش بالأبعاد التي تناسبك من خيار هوامش مخصص Custom Margins: استدل بحدود الصفحة المتقطعة لمعرفة فيما إذا كان محتوى ورقة العمل يتناسب مع ورقة الطباعة: قد يفيدك اختيار الاتجاه الأفقي للصفحة Landscape من أمر الاتجاه Orientation إن كان المحتوى يميل ليأخذ مساحة بالعرض وليس بالطول: أما أمر الحجم Size فيوفر العديد من الأحجام القياسية، اختر الحجم الذي يُناسب حجم أوراق الطباعة التي تستخدمها: وكذلك، لديك خيار طباعة جزء من محتوى ورقة العمل. حدد أولا الجزء الذي ترغب في طباعته ثم انقر تعيين ناحية الطباعة Set Print Area من أمر ناحية الطباعة Print Area: بعد طباعتك لهذا الجزء يمكنك إزالة ناحية الطباعة من أمر مسح ناحية الطباعة Clear Print Area، علما أنّ هذا الأمر سيقوم بحذف جميع نواحي الطباعة إذا كانت ورقة العمل تحتوي على أكثر من واحدة. ولإضافة طابع شخصي إلى ورقة العمل، يمكنك إضافة خلفية للورقة من أمر خلفية Background: لكن تجنّب اختيار الخلفيات التي تؤثر على قابلية القراءة. اختر خلفية بتفاصيل باهتة أو لون فاتح جدا. لمسح الخلفية انقر فوق أمر إزالة الخلفية Delete Background: تحجيم أبعاد الصفحة عندما يكون محتوى ورقة العمل كبيرا بحيث يتجاوز حجم ورقة الطباعة حتى لو استخدمنا الهوامش الضيقة، يمكننا أن نجعل ورقة العمل تتناسب مع حجم صفحة واحدة أو أكثر يدويا. لنأخذ جدول البيانات أدناه كمثال، نلاحظ من خلال حدود الصفحة المتقطعة أنه يتجاوز طول وعرض صفحة واحدة. ولنجعل الجدول يُطبع في صفحة (أو صفحتين، حسب حجم الجدول) سنذهب إلى خانة تغيير الحجم لملائمة الصفحة Scale to fit ثم نختار صفحة واحدة من حقل الطول Width وصفحة واحدة من حقل الارتفاع Height (لا يُشترط تغيير الإثنين معا، وإنما حسب الحاجة): سنلاحظ اختفاء حدود الطباعة، وتغيّر الرقم في حقل المقياس scale إلى 80%. وعند الطباعة، سيُطبع الجدول في صفحة واحدة. يمكننا العودة إلى الطول والارتفاع التلقائي وبدلا من ذلك نغيّر القيمة في حقل المقياس يدويا وحسب ما يُلائم ورقة العمل. لكن تجنّب تقليص حجم ورقة العمل بدرجة كبيرة، فقد يؤثر ذلك على قابلية القراءة. لأنّ البرنامج سيقوم بتقليل أحجام النصوص لتتناسب مع الصفحة. والأولى أن تقوم بإجراء تعديلات على ورقة العمل بدلا من جعلها تلائم صفحة الطباعة إن تطلب الأمر. من الطرق الأخرى المفضلة لمعرفة حدود الصفحات وتعديلها هي طريقة العرض معاينة فواصل الصفحات Page Break Preview التي يمكن الوصول إليها من تبويب عرض View: نلاحظ في طريقة العرض هذه وجود خطوط متقطعة، وهي تمثل حدود الصفحة التلقائية، وخطوط متصلة، وهي حدود الصفحة التي نقوم بإعدادها يدويا. كما تُعرض فيها أرقام الصفحات Page1 ،Page2، إلخ. لتحجيم ورقة العمل يدويا، نقوم بسحب الخطوط المتقطعة العمودية إلى حد آخر عمود نريد إظهاره في الصفحة الواحدة. وبنفس الطريقة نسحب الخطوط المتقطعة الأفقية إلى الأسفل إلى حد آخر صف نريد إظهاره في الصفحة الواحدة. مثلا، لطباعة الجدول أعلاه في صفحة واحدة قمنا بسحب الخطوط المتقطعة لتحتوي أعمدة وصفوف الجدول، وبذلك أصبح عدد الصفحات 1: ولطباعة الجدول على صفحتين قمنا بتحريك الخط المتقطع الأفقي إلى المنتصف، وبذلك أصبح عدد الصفحات 2: يمكننا التراجع، عند الحاجة، عن جميع الفواصل اليدوية التي قمنا بإنشائها والعودة إلى الفواصل التلقائية بالنقر فوق فواصل Breaks من تبويب تخطيط الصفحة Page Layout ثم اختيار إعادة تعيين كافة فواصل الصفحات Reset All Page Breaks: للعودة إلى طريقة العرض العادية سننقر فوق عادي Normal من تبويب عرض View. طباعة خطوط الشبكة وعناوين الصفوف والأعمدة إذا كنت ممن يعملون على جداول البيانات كثيرا في اكسل، لا بدّ من أنّك تقضي وقتا أيضا في إضافة حدود Borders للخلايا لجعلها واضحة عند الطباعة، فكما نعلم، الخطوط التي تظهر على الشاشة في الورقة وهمية ولا تظهر عند الطباعة. يمكنك الاستغناء عن هذه الخطوة وتوفير وقتك بواسطة تفعيل خيار طباعة خطوط الشبكة. من تبويب تخطيط الصفحة نذهب إلى خانة خيارات الورقة Sheet Options ثم نؤشّر الخيار طباعة Print في قسم خطوط الشبكة Gridlines: وكذلك الحال بالنسبة لعناوين الأعمدة (A ،B ،C، ...) وعناوين الصفوف (1، 2، 3،...)، حيث تحتاج إلى طباعتها أحيانا لتسهيل الإشارة إلى أحد الحقول داخل الجدول بتسميته باسمه (الناتج من تقاطع حرف العمود ورقم الصف) إذا كنت تعرضه على زميلك أو رئيسك. من نفس التبويب نؤشر الخيار طباعة Print في قسم العناوين Headings: يتيح لك اكسل كذلك خيار إزالة خطوط الشبكة أو العناوين عند العمل على البرنامج إن كنت تفضل الكثير من المساحات البيضاء عند العمل. علما أنّ الورقة ستبقى مقسمة إلى خلايا، ما سيتغير هو اختفاء خطوط الشبكة فقط. لإخفاء خطوط الشبكة أو العناوين نقوم بإلغاء تأشير الخيار عرض View في قسم خطوط الشبكة Gridlines أو العناوين Headings من تبويب تخطيط الصفحة: إضافة رأس وتذييل بإمكانك إضافة رأس وتذييل وتخصيصها تماما كما تفعل في مستندات وورد. فقد تحتاج أحيانا إلى إضافة اسم شركتك في الرأس، أو أرقام الصفحات في التذييل، أو غيرها من التنسيقات. للقيام بذلك نذهب إلى تبويب عرض View ثم ننقر فوق طريقة العرض تخطيط الصفحة Page Layout: سنلاحظ وجود عبارة انقر لإضافة رأس Click to add header في الجزء العلوي من الصفحة وعبارة انقر لإضافة تذييل Click to add footer في الجزء السفلي من الصفحة. عند النقر على منطقة الرأس سيظهر تبويب تصميم Design السياقي: يحتوي هذا التبويب على الأوامر والخيارات المتعلقة بإنشاء الرأس والتذييل. لكن قبل إنشاء الرأس/التذييل، يمكننا استخدام أحد النماذج الجاهزة من أمري رأس Header أو تذييل Footer. إذ بإمكاننا إضافة رقم الصفحة فقط، رقم الصفحة والتاريخ وحالة المنصف (مسودة أو سرّي)، اسم المصنف، وغيرها من النماذج: في المثال أدناه قمنا باختيار نموذج الرأس الذي يعرض حالة المصنف، التاريخ، ورقم الصفحة. وسيتكرر هذا النموذج على بقية الصفحات: أما إذا رغبنا في إنشاء رأس/تذييل مخصص، يمكننا استخدام الأوامر في خانة عناصر الرأس والتذييل Header & Footer Elements. يمكننا إضافة رقم الصفحة Page Number، عدد الصفحات Number of Pages، اسم الورقة Sheet Name، صورة Picture، إلخ. في المثال أدناه قمنا بإضافة صورة، رقم الصفحة/عدد الصفحات، مع التاريخ: للانتقال إلى منطقة التذييل ننقر فوق الانتقال إلى التذييل Go to footer: وبإمكاننا استخدام الخيارات الأخرى، كإضافة رأس/تذييل مختلف للصفحة الأولى Different First Page، أو تغيير الخيارات المتعلّقة بالتحجيم والمحاذاة. لاحظ أنّه يمكنك العمل على الورقة وتغيير محتوياتها من طريقة العرض هذه دون الرجوع إلى طريقة العرض القياسية. وإذا كنت تفضل استخدام طريقة العرض العادية انقر فوق عادي Normal من تبويب عرض: طباعة العناوين عندما تعمل على جداول كبيرة جدا بحيث يكون من غير المناسب طباعتها على صفحة واحدة، تجد نفسك مضطرا إلى طباعته على عدة صفحات. من الخصائص الرائعة التي تساعدك في هذه الحالة هي طباعة العناوين، ولا نقصد بها عناوين صفوف وأعمدة الورقة الافتراضية، وإنما عناوين الصفوف والأعمدة الخاصة بجدولك. وطباعة العناوين تعني تكرارها على كافة الصفحات عند الطباعة. وهذا يسهل معرفة إلى أي من الأعمدة/الصفوف تنتمي بيانات الجدول. للقيام بذلك، نذهب إلى تبويب تخطيط الصفحة Page Layout وننقر فوق طباعة العناوين Print Titles: في حقل الصفوف المكررة إلى الأعلى Rows to repeat at top سنحدد الصف الذي نرغب في طباعته في أعلى كل صفحة، وهو الصف 3 في هذا المثال: وفي حقل الأعمدة المكررة في اتجاه اليسار Columns to repeat at left سنحدد العمود الذي نرغب في طباعته على جهة اليمين (لأننا نعمل على ورقة باتجاه من اليمين إلى اليسار) في كل صفحة، وهو العمود A في هذا المثال: بعدها ننقر موافق OK ثم نستخدم طريقة العرض تخطيط الصفحة Page Layout من تبويب عرض View لمعاينة النتيجة (أو يمكننا معاينتها من معاينة الطباعة): ملاحظة: يمكنك طباعة عناوين الأعمدة فقط أو عناوين الصفوف فقط. كما بالإمكان تكرار أكثر من صف أو أكثر من عمود على جميع الصفحات. خيارات الطباعة بعد الانتهاء من كل إعدادات الورقة، حان الوقت لطباعتها. من تبويب ملف File ننقر طباعة Print (ومنه نصل إلى معاينة الطباعة أيضا): في نافذة الطباعة سنتمكن من معاينة الورقة وكيف ستبدو عند طباعتها، سنستخدم الأسهم السفلية للتنقل بين الصفحات لمعاينتها: من نفس النافذة يمكننا تغيير اتجاه الصفحة (أفقي أو عمودي)، تغيير حجم الصفحة، أو الهوامش، وبنفس الطريقة التي ذكرناها سابقا في هذا المقال. بالإمكان تعديل هذه الخيارات من هذه النافذة أو من تبويب تخطيط الصفحة. وبإمكاننا أيضا تحجيم الورقة من هذه النافذة. سنقوم بطباعة جميع الأعمدة في صفحة واحدة بدلا من تقسيمها على صفحتين بتحديد الخيار Fit All Columns on One Page: وكذلك، نستطيع طباعة الورقة الحالية Print Active Sheet، الجزء المحدد في الورقة فقط Print Selection (وهذا يشبه أمر تحديد ناحية الطباعة)، أو طباعة كامل المصنف Print Entire Workbook، وبذلك لن تحتاج إلى الرجوع إلى كل ورقة وطباعتها كل على حدة إذا كان المصنف يحتوي على أكثر من ورقة: وإذا رغبنا في طباعة أكثر من نسخة من الورقة، يمكننا طباعتها بطريقة مرتبة Collated (الصفحة 1 النسخة 1 تليها الصفحة 2 النسخة 1، وهكذا) أو بطريقة غير مرتبة Uncollated (جميع النسخ للصفحة الأولى، تليها جميع النسخ للصفحة الثانية، وهكذا): ولطباعة نطاق محدد من الصفحات ندخل أرقام الصفحات في حقلي Pages وTo: بعد الانتهاء من تعديل كافة الخيارات نحدد نوع الطابعة التي نستخدمها ثم ننقر طباعة Print:
  7. CUPS هي الآلية الرئيسية للطباعة وخدمات الطباعة في أوبنتو وهي «النظام الشائع للطباعة في يونكس» (Common UNIX Printing System اختصارًا CUPS)، نظام الطباعة هذا هو طبقة محمولة متوفرة مجانًا التي أصبحت المعيار القياسي الجديد للطباعة في غالبية توزيعات لينُكس. يدير CUPS مهام الطباعة والطلبيات ويوفر خدمات طباعة عبر الشبكة باستخدام «بروتوكول الطباعة عبر الإنترنت» (Internet Printing Protocol اختصارًا IPP)، بينما يوفر CUPS دعمًا لمجالٍ واسعٍ جدًا من الطابعات، بدءًا من طابعات مصفوفة النقط (dot-matrix) إلى الطابعات الليزرية وما بينهما؛ ويدعم CUPS أيضًا «PostScript Printer ‎Description»‏‎‏ (PPD) والاكتشاف التلقائي لطابعات الشبكة، ويوفر واجهة ويب بسيطة كأداة للضبط والإدارة. التثبيتأدخل الأمر الآتي في الطرفية لتثبيت CUPS: sudo apt-get install cupsسيعمل خادوم CUPS تلقائيًا بعد نجاح التثبيت. ولاستكشاف الأخطاء، يمكنك الوصول إلى أخطاء خادوم CUPS عبر ملف سجل في ‎/var/log/cups ‎/error_log؛ إذا لم يُظهِر سجل الأخطاء معلوماتٍ كافيةً لحل المشاكل التي تواجهك، فيمكن زيادة درجة «الإسهاب» لسجل CUPS بتغيير التعليمة LogLevel في ملف الضبط إلى "debug" أو حتى إلى "debug2"، مما يؤدي إلى تسجيل كل شيء؛ تأكد من إعادة القيمة الافتراضية "info" بعد حل مشكلتك لتفادي زيادة حجم السجل زيادةً كبيرةً جدًا. الضبطيُضبَط سلوك خادوم CUPS عبر تعليمات موجودة في ملف ‎/etc/cups/cupsd.conf؛ يتبِّع ملف ضبط CUPS نفس الصيغة العامة لملف الضبط الرئيسي لخادوم أباتشي؛ سنذكر هنا بعض الأمثلة عن الإعدادات التي يمكن تغييرها. تنويه: عليك إنشاء نسخة من الملف الأصلي قبل تعديل ملف الضبط، وعليك حماية تلك النسخة من الكتابة، لذلك ستكون لديك الإعدادات الافتراضية كمرجع أو لإعادة استخدامها وقت الحاجة. انسخ الملف ‎/etc/cups/cupsd.conf واحمهِ من الكتابة بالأوامر الآتية: sudo cp /etc/cups/cupsd.conf /etc/cups/cupsd.conf.original sudo chmod a-w /etc/cups/cupsd.conf.originalالتعليمة ServerAdmin: لضبط عنوان البريد الإلكتروني لمدير خادوم CUPS، عليك أن تُحرِّر ملف الضبط ‎/etc/cups/cupsd.conf، ثم أضف أو عدِّل سطر ServerAdmin بما يلائمك؛ فمثلًا إن كنت أنت مدير خادوم CUPS، وكان بريدك الإلكتروني هو user@example.com، فعليك تعديل سطر ServerAdmin ليبدو كما يلي: ServerAdmin user@example.comالتعليمة Listen: يستمع خادوم CUPS في أوبنتو افتراضيًا على بطاقة loopback فقط على عنوان IP 127.0.0.1؛ ولكي تجعل خادوم CUPS يستمع على عنوان IP لبطاقة شبكية، فعليك تحديد إما اسم مضيف، أو عنوان IP، أو اختيارًا، عنوان IP ومنفذ؛ وذلك بإضافة التعليمة Listen؛ على سبيل المثال، لو كان خادوم CUPS يقبع على شبكة محلية بعنوان IP هو 192.168.10.250 وتريد أن تجعله متاحًا لبقية الأنظمة على هذه الشبكة الفرعية؛ فعليك تعديل ‎/etc/cups/cupsd.conf؛ وإضافة التعليمة Listen، كما يلي: Listen 127.0.0.1:631 # existing loopback Listen Listen /var/run/cups/cups.sock # existing socket Listen Listen 192.168.10.250:631 # Listen on the LAN interface, Port 631 (IPP)قد تحذف أو تضع تعليقًا قبل الإشارة إلى عنوان loopback‏ (127.0.0.1) إذا لم ترغب في أن يستمع cupsd إلى هذه البطاقة لكنك تريده أن يستمع فقط إلى بطاقة إيثرنت للشبكة المحلية LAN؛ لتفعيل الاستماع لكل منافذ الشبكة بما فيها loopback لمضيف معيّن، فتستطيع إنشاء قيد Listen لاسم المضيف (socrates) كما يلي: Listen socrates:631 # Listen on all interfaces for the hostname 'socrates'أو بحذف التعليمة Listen واستخدام Port عوضًا عنها: Port 631 # Listen on port 631 on all interfacesللمزيد من الأمثلة عن تعليمات الضبط لخادوم CUPS، راجع صفحة الدليل الخاصة بملف الضبط بإدخال الأمر الآتي: man cupsd.confملاحظة: في كل مرة تُعدِّل فيها على ملف الضبط ‎/etc/cups/cupsd.conf؛ فستحتاج إلى إعادة تشغيل خادوم CUPS بكتابة الأمر التالي في الطرفية: sudo service cups restartواجهة الويبملاحظة: يمكن أن يُضبَط ويُراقَب CUPS باستخدام واجهة ويب، التي تتوفر افتراضيًا على http://localhost:631/admin؛ يمكن استخدام واجهة الويب لإجراء كل مهام إدارة الطابعة. لكي تنفذ المهام الإدارية عبر واجهة الويب، فعليك إما تفعيل حساب الجذر على خادومك، أو الاستيثاق كمستخدم في المجموعة lpadmin؛ ولأسبابٍ أمنية، لن يستوثق CUPS من مستخدم لا يملك كلمة مرور. لإضافة مستخدم إلى المجموعة lpadmin، فعليك تنفيذ الأمر الآتي في الطرفية: sudo usermod -aG lpadmin usernameيتوفر توثيق في لسان Documentation/Help في واجهة الويب. مصادرموقع CUPS الإلكتروني. ترجمة -وبتصرف- للمقال Ubuntu Server Guide: CUPS - Print Server.