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

كل الأنشطة

تحدث تلقائيًا

  1. الساعة الماضية
  2. اليوم
  3. بالتأكيد استخدام القوالب الجاهزة يمكن أن يكون مفيدًا في بعض الأحيان مثلاً يكون مفيداً للعملاء استخدام القوالب الجاهزة حيث يقلل من تكاليف تطوير الموقع ووقت الإنجاز بشكل كبير، خاصة إذا كان الموقع ذو طبيعة بسيطة أو إذا كان الميزانية محدودة. وأيضاً في فترة التعلم يكون مفيداً في بعض الأحيان مثل فهم كيفية ترتيب العناصر على الصفحة، وكيفية استخدام الألوان والأنماط. فهم هيكل الصفحات الويب المختلفة، مثل الهيدر والقائمة والمحتوى الرئيسي والفوتر، وكيفية تنظيمها بشكل منطقي. والعديد من الحالات الأخرى التي تفيدك القوالب الجاهزة بالطبع يمكنك الإطلاع على الرابط المرفق في التعليق السابق وستجد الكثير من المصادر للحصول على قوالب جاهزة
  4. يعتبر إتقان HTML وBootstrap والعمل بعدها على مشاريع لإنشاء مواقع تعريفية هو خطوة ممتازة لتطوير مهاراتك في مجال تصميم وتطوير الواجهات الأمامية للمواقع وبالطبع سيصبح لك خبرة في هذه المشاريع ولكن سيظل بالنسبة لمطور واجها أمامية الكثير لتتعلمه مثل تعلم CSS بشكل إحترافي وبالطبع Bootstrap يسهل العديد من الأمور، ولكن فهم CSS بعمق يمكنك من تخصيص التصميمات بشكل أفضل وحل المشكلات التي قد لا تتمكن من حلها باستخدام Bootstrap وحده. تعلم كيفية إنشاء تصميمات معقدة ومتجاوبة بدون الاعتماد الكلي على Bootstrap. هذا يتضمن استخدام تقنيات مثل Flexbox وGrid. وثانياً والأهم تعلم JavaScript حيث يعتبر لا غنى عن هذه اللغة في مجال الويب .وبعدها تعلم مكتبات مثل jQuery أو إطار عمل مثل React.js . وبالطبه هناك العديد من المهارات التي تحتاجها لتصل لمستوى جيد في مجال تطوير واجهات المستخدم
  5. كإجابة عامة فإني اقول لك نعم ابدأ ببرمجة لوحة التحكم في البداية، وذلك لأنك لن تستطيع تجريب وربط التطبيق و الموقع قبل ان يكون لديك لوحة تحكم. ولكن قد تختلف هذه القاعدة بحسب كل موقع و نوع الفريق الذي يعمل على المشروع وكون المشروع موثق بشكل جيد او لا.
  6. بعد تصميم واجهة المستخدم ( تطبيق و موقع ) هل أبدأ في تصميم وبرمجة لوحة التحكم قبل برمجة التطبيق والموقع ؟
  7. إذا كنت تقصد تعلم العلوم اللازمة أو أساسيات البرمجة بدون التركيز على لغة برمجة محددة يمكنك فهم الأساسيات العامة للبرمجة مثل المفاهيم الأساسية: مثل المتغيرات، الأنواع، الهياكل الشرطية، الحلقات، والدوال. المنطق البرمجي: فهم كيفية حل المشاكل من خلال التفكير المنطقي . ثانياً حاول تعلم الخوارزميات وهياكل البيانات: تعلم كيفية كتابة خوارزميات لحل مشاكل معينة بكفاءة. دراسة الهياكل مثل المصفوفات، القوائم، الأشجار، الجداول، وغيرها. ومهم أيضاً فهم أساسيات علوم الحاسوب مثل نظم التشغيل: فهم كيفية عمل نظم التشغيل مثل إدارة الذاكرة، العمليات، وأنظمة الملفات. الشبكات: تعلم المبادئ الأساسية للشبكات مثل البروتوكولات، التوجيه، والتشفير. قواعد البيانات: فهم كيفية تصميم وإدارة قواعد البيانات. ولكن إذا كنت تقصد شيئاً آخر يرجى إخبارنا به
  8. أرجو تجربة المشاهدة من خلال تطبيق متصفح جوجل كروم مباشرًة على الهاتف. إن استمرت المشكلة، حاول تجربة متصفح آخر مثل فايرفوكس. وإن لم يتم حل المشكلة قم بتحميل تطبيق WARP الخاص بـ Cloudflare وهو أشبه بـ VPN. أما على الحاسوب فأرجو قراءة التالي:
  9. حاول تجربة فتح الموقع على متصفح آخر مثل edge أو فتح الموقع على جهاز مختلف أو يمكنك تجربة الحلول في الإجابات التالية وإذا لم تعمل الحلول السابقة يرجى التواصل مع الدعم من هنا
  10. حسب ما فهمت انك تريد تعلم علوم البرمجة اي الاساسيات التي يمكنك من خلالها تعلم اي لغة برمجة بسهولة جدا وتعلم التفكير البرمجي ان كان كذلك فعليك اتباع التالي : تعلم مادة تدعى Data Structure : فهي ليست لغة برمجة بل لغة تكتب بها اساسيات البرنامج وتقوم بتحليله ثم هذا التحيل تقوم بتحويله لاي لغة برمجة لاحقا تعلم الخوارزميات : ايضا كما شرحت لك سابقة تعلم Data Base : والتي هي قواعد البيانات ان اي لغة برمجة بحاجة للتعامل مع قواعد البيانات لذلك من المهم جدا اتقانها تعلم تحليل البيانات : data analysis قبل البدء باي مشروع برمجي يجب عليك اولا تحليله وتحديد ماهي متطلبات مشروعك وهناك طريقة مشهورة في ذلك تدعى merise وان كنت تريد تعلم لغات التصميم لاحقا يمكنك البدء بتعلم تصميم واجهات المستخدم عبر برامج adobe xd او غيره وتعلم ايضا UI UX D ان كنت تقصد شيء اخر يمكنك اخبارنا لمساعدتك بالتوفيق ان شاء الله ...
  11. I want ask how to learn science for programming no language too
  12. تقدم لنا الواجهات الرسومية أو GUI تجربةً بصرية بديهية، وسهلة الاستخدام للتعامل مع الحواسيب والهواتف الذكية، والأجهزة اللوحية، فتجدنا ننتقل بين التطبيقات وصفحات الويب والمستندات والصور بنقرات بسيطة على الأيقونات والقوائم المنسدلة وبقية عناصر سطح المكتب التي توفرها نظم التشغيل المختلفة، مثل: ويندوز وماك ولينكس. وعلى الرغم من سهولة استخدامها من قبل المستخدم العادي إلّا أن واجهات المستخدم الرسومية تبقى قاصرة نوعًا ما عن منحنا التحكم الإداري الكامل بالأجهزة بالكيفية التي نريدها، فقد تمنعنا من عمليات التثبيت أو التعديل أو الحذف لبعض البرامج والميزات والملفات، وهنا يبرز دور واجهة سطر الأوامر. يشار لها بالرمز CLI وهو اختصار command-line interface، ويُعدّ إتقانها والتعود على استخدامها عبر الطرفية Terminal من أهم طرق التنقل بين حاسوبك الشخصي والخوادم السحابية، بغرض الوصول إليها والتحكم بها عن بعد بدون الحاجة للواجهات الرسومية. توجد الواجهات الطرفية (التي تكتب ضمنها الأوامر) في معظم نظم التشغيل الحاسوبية، وتتوفر لها محاكيات خاصة بهيئة تطبيقات تُثبّت على الهواتف الذكية والأجهزة اللوحية. وهي تمنح المستخدمين تحكمًا أكبر بأجهزتهم عبر تعزيز صلاحيات الوصول المتاحة لمدير النظام administrator، وزيادة قدرة المستخدم على تخصيص بيئات العمل، وأتمتة العمليات التي يحتاجها، وإعطائه إمكانية الوصول إلى الأجهزة البعيدة، مثل الخوادم السحابية. إذا كنت من مستخدمي واجهة سطر الأوامر الجدد، فسيعطيك هذا التمهيد فكرةً جيدة عن أساسيات استخدامها عبر الطرفية، وستكون في نهايته قادرًا على تطبيقها مع لينكس وماك، سواء على حاسوبك الشخصي أو على الخوادم. لمعلومات أكثر يمكنك أيضًا الاطلاع على مقال مقدمة إلى طرفية لينكس، ومقال دليل استخدام سطر الأوامر في عملية تطوير الويب من طرف العميل. فهم النافذة الطرفية عندما تستخدم حاسوبًا أو أي هاتف محمول لأول مرة عبر الواجهات الرسومية، ستبدأ رحلة التعرف عليه باستعراض التطبيقات الموجودة، وأماكن توضع الأشياء، لتتمكن من تخصيصه حسب احتياجاتك، والحالة نفسها لاستكشافه مع الطرفية، وهو ما سنتعرف عليه تباعًا ضمن المقال. الطرفية المستخدمة هنا هي طرفية أوبنتو 20.04، إحدى أشهر توزيعات لينكس، المبني أساسًا على يونيكس، فإذا كان نظام التشغيل على حاسوبك هو لينكس أو ماك يمكنك تطبيق الأمثلة الواردة هنا بحرفيتها، فطرفية النظامين مشابهة لطرفية أوبنتو المعتمدة في المقال، وكليهما مبني على يونيكس. وإذا كنت تستخدم ويندوز يمكنك الاستعانة بمقال تثبيت نظام لينكس داخل نظام ويندوز في بيئة وهمية لتهيئة بيئة لينكس على حاسوبك نفسه. افتح الآن الطرفية على حاسوبك أو استخدام أحد المواقع التي توفر طرفيات تفاعلية للتجربة مثل Glitch.com، وستحصل على نافذة شبيهة بهذه الصورة. لاحظ رمز الدولار $ والمؤشر الوامض هنا ستبدأ الكتابة. تدّل الرموز الموجودة في نهاية محث الأوامر prompt على مستوى مستخدم الطرفية، وفق التالي، وهي تنطبق على معظم نظم التشغيل المعتمدة على يونيكس أو التي تسمى nix*: رمز الدولار $ للمستخدم العادي أي أنك سجلت دخول بحساب مستخدم عادي. رمز المربع# للمستخدم صاحب أعلى الامتيازات. يُعرف المستخدم ذو الرمز # بأنه مستخدم الجذر Root، ويُعدّ مستخدمًا مميزًا أو مدير النظام الافتراضي. ستجد الرمز $ في جميع الأمثلة هنا فقد طبقت بواسطة مستخدم عادي، لكنه يستطيع الحصول على امتيازات الجذر باستعمال الأمر sudo. افتح الطرفية على حاسوبك لنبدأ بالأمثلة العملية. التآلف مع المجلدات الأوامر التي نكتبها في سطر الأوامر هي تعليمات تخبر حاسوبك بما تريد تنفيذه، تكتب الأمر، ثم تضغط على زر ENTER أو RETURN ليبدأ التنفيذ. اكتب مثلًا الأمر التالي في الطرفية، واضغط ENTER: $ pwd نفذ الأمر، وستحصل على الخرج التالي: /home/sammy يرمز الأمر pwd إلى مجلد العمل الحالي، وهو اختصار للعبارة present working directory، ويساعدك على معرفة مكان وجودك الحالي ضمن نظام الملفات أي المجلد الذي تُنفذ منه الأوامر. مجلد العمل الحالي في مثالنا هو home/sammy/، وsammy هو اسم المستخدم، قد يكون أي اسم آخر، فإذا سجلت دخولًا بحساب مستخدم الجذر root صاحب أعلى الامتيازات، فسيكون مجلد العمل الحالي root/، وعلى حاسوبك الشخصي سيسمى المجلد باسم المستخدم الذي تستعمله، غالبًا ما يطلق مالك الحاسوب اسمه على المستخدم فتجد المجلد باسمه أيضًا. مجلد العمل الحالي فارغ الآن، لذا سننشئ ضمنه مجلدًا جديدًا اسمه الملفات أو files مثلًا، نخزن فيه الملفات التي ستطبق عليها أمثلة المقال. تُنشَأ المجلدات بواسطة الأمر mkdir، وهو اختصار لعبارة make directory، ثم نكتب اسم المجلد الذي نود إنشائه بعد الأمر mkdir، يلعب اسم المجلد هنا دور الوسيط، لأنه يمرر القيمة المدخلة إلى الأمر حتى يأخذ بها عند التنفيذ. يشبه الوسيط المفعول به في القواعد النحوية، فهو يمثل ما يتصرف به الفعل أو الأمر البرمجي في حالتنا. اكتب السطر التالي في الطرفية لديك، يبدأ السطر بالأمر mkdir، ويليه الوسيط files وهو اسم المجلد الذي ننشئه: $ mkdir files اضغط Enter ونفذ الأمر، وفور ظهور المؤشر الوامض في السطر التالي سيكون مجلدك الجديد قد أُنشئ، وتكون جاهزًا لكتابة الأوامر التالية، لن تحصل على خرج يخبرك بإتمام عملية الإنشاء، فقط المؤشر الوامض. عرض محتويات المجلدات وفهم صلاحيات العمل عليها سنستخدم الأمر ls المستوحى من كلمة list، لإظهار محتويات مجلد العمل الحالي (حيث أنشأنا مجلدنا الجديد)، يمكنك بهذه الطريقة التثبت من صحة إنشائه بما أنك لم تحصل على خرج صريح يؤكد ذلك. $ ls انظر الخرج، أنه يؤكد وجود المجلد files: files يعطيك هذا الأمر معلومات عامة عن محتويات مجلد العمل الحالي، وتستطيع الحصول على معلومات تفصيلية أكثر باستعمال الرايات Flags. تكتب الرايات في لينكس بشكل شرطة - متبوعة بحرف. تُمرِر الرايات للأمر الأساسي خياراتٍ إضافية أو وسطاء إضافيين. فعلى سبيل المثال يمكنك إضافة الراية l- للأمر السابق ليظهر خرجه بتنسيق قائمة طويلة فيها معلومات مفصلة عن محتويات المجلد. جرب كتابة الأمر مع الراية كما يلي: $ ls -l اضغط زر ENTER للتنفيذ، وستحصل على الخرج الآتي: total 4 drwxr-xr-x 2 sammy sammy 4096 Nov 13 18:06 files يشير السطر الأول من الخرج إلى عدد الكتل blocks المحجوزة للمجلد في ذاكرة الحاسوب، عددها هنا 4، أما السطر الثاني فيتضمن صلاحيات المستخدم على المجلد وبعض التفاصيل الأخرى. يمكنك أيضًا استعمال الراية h- أو human-readable-- لتحصل على خرج أكثر مقروئية، فيظهر الحجم المخصص للمجلد في الذاكرة مقدرًا بالكيلو بايت مثلًا أي بصيغة أسهل للقراءة والفهم، كما هو موضح أدناه. ستلاحظ عند تعاملك مع الرايات: أن الشرطة الوحيدة - تشير إلى راية يُعبر عنها بحرف وحيد، والشرطتان -- إلى الرايات التي تكتب بالكلمات، وتستخدم بعض الرايات الصيغتين فقد تكتب بحرف وحيد أو بالكلمات، يمكنك أيضًا كتابة أمر متعدد الرايات أو متعدد الوسطاء بتجميع رموز عدة رايات معًا مثل lh-. انظر الأمرين أدناه لهما المعنى نفسه تمامًا، لكن كل منهما مكتوب بطريقة: $ ls -lh $ ls -l --human-readable سيعطي كلاهما الخرج نفسه، وهو مشابه لما حصلنا عليه سابقًا مع فارقٍ وحيد، إذ سيظهر الحجم بتنسيق سهل القراءة بسبب الراية الخاصة بالمقروئية: total 4.0K drwxr-xr-x 2 sammy sammy 4.0K Nov 13 18:06 files يبين الخرج السابق مجموعة معلومات عن المجلد، مثل: حجمه في الذاكرة 4K، وصلاحيات المستخدمين عليه وغير ذلك، انظر الجدول التالي للتوضيح: نوع الملف الصلاحيات عدد الوصلات اسم المالك مجموعة العمل حجم الملف تاريخ آخر تعديل اسم الملف d rwxr-xr-x 2 sammy sammy 4.0K Nov 13 18:06 files يتضمن الجدول سطرًا واحدًا فقط، لأننا نملك مجلدًا واحدًا files في مجلد العمل الحالي home/sammy/، ولو كان لدينا عدة مجلدات أو ملفات كنت ستجد سطورًا بعددها. لنوضح الآن الرموز الموجودة في بداية السطر الثاني من الخرج: المحرف الوصف d أي مجلد أو directory، والمجلد في علم الحاسوب هو العنصر التنظيمي الذي يحتوي عدة ملفات، وإذا لم يكن العنصر مجلدًا فستجد شرطة - بدل الحرف d r تعني صلاحية القراءة read، وتسمح للمستخدم بفتح الملف وقراءته، أو باستعراض محتويات المجلد w صلاحية الكتابة write، تتيح تعديل محتويات الملف، وإضافة ملفات إلى المجلد أو حذف بعض من ملفاته أو تغيير أسمائها x صلاحية تنفيذ ملف execute أو تشغيله كبرنامج، ومن جهة المجلدات تعني الصلاحية الدخول إلى المجلد والوصول إلى ملفاته حاول الآن قراءة الخرج السابق مجددًا، فلنبدأ بسلسلة المحارف drwx، يعني المحرف الأول d أن العنصر الموصوف هو مجلد، فلو كان نوعًا آخر، لبدأت السلسلة بالشرطة - بدلًا منه على هذا الشكل rwx-، أما المحارف الثلاثة التالية مخصصة لأذونات مالك المجلد، وتعني أن المالك لديه صلاحيات القراءة والكتابة والتنفيذ على مجلده المجلد files، وإن استبدل أي محرف منها بالشرطة - فسيفقد المالك الصلاحية التي يمثلها هذا المحرف. وتمثل المحارف الثلاثة التي تليها صلاحيات مجموعة العمل، وهي r-x في حالتنا، وتعني أن لدى المستخدمين المنتمين للمجموعة صلاحيات القراءة والتنفيذ على هذا المجلد، لكن لا يمكنهم التعديل عليه أبدًا فلا يملكون صلاحية الكتابة، إذ إن المحرف w مستبدل بالشرطة -. أما المحارف الثلاثة الأخيرة r-x فيقصد بها صلاحيات مجموعات العمل الأخرى على المجلد، وكما ترى تنحصر صلاحياتهم في القراءة والتنفيذ، ولا يملكون صلاحية الكتابة على المجلد. يشير الرقم 2 (الذي يلي سلسلة المحارف) إلى عدد روابط المجلد، تشبه الروابط Links في لينكس الاختصارات التي تسهل على المستخدمين الوصول إلى نظام الملفات. وعند تنشئ أي ملف أو مجلد سيبني له لينكس تلقائيًا رابطين، رابط مطلق، ورابط ذاتي المرجع يتيح الوصول إليه عبر مسار نسبي، سيتضح لك معنى النسبي والمطلق في القسم التالي من المقال. ويمكنك معرفة المزيد عن روابط لينكس بمراجعة المقال دليل المستخدم للروابط في نظام ملفات لينكس. ستجد بعد الرقم 2 كلمة sammy مكررة مرتين، تشير الأولى منها إلى اسم مالك المجلد، وقد تعرفنا على صلاحياته قبل قليل وهيrwx، أما لماذا sammy هو المالك فالسبب أننا أنشأنا المجلد files من حسابه. يفيدك دائمًا معرفة اسم المستخدم مالك الملفات في بيئة العمل الفعلية. وتدّل كلمة sammy الثانية على اسم مجموعة العمل المستفيدة من المجلد files أي التي تملك حق الوصول إليه، وصلاحياتها كما رأينا r-x، يتطابق اسم المستخدم هنا مع اسم مجموعة العمل، لكنه ليس أمرًا إلزاميًا، فستصادف في بيئات العمل الفعلية مجموعات عمل مختلفة، مثل: مجموعة الموظفين العاديين وقد يكون اسمها staff، ومجموعة مدراء النظام باسم admin مثلًا أو غير ذلك. أما بقية المعلومات الموجودة في الخرج فهي: الحجم المخصص للمجلد في الذاكرة، وقدره 4 كيلو بايت، بالإضافة إلى تاريخ آخر تعديل أجري عليه قبل تنفيذ التعليمة. أصبح لدينا الآن أرضية ننطلق منها لقسمنا التالي المتعلق بالتنقل عبر نظام الملفات. التنقل ضمن نظام الملفات تعلمت كيف تحدد موقعك الحالي في نظام الملفات، وكيف تنشئ مجلدًا جديدًا، وتستعرض محتوياته، وتحدد صلاحيات الوصول إليه والتحكم به. سنجرب الآن التنقل بين مجلدات نظام الملفات، أنشأنا المجلد files في المجلد الأساسي للمستخدم sammy وهو home/sammy/، فما طريقة الانتقال من home/sammy/ إلى home/sammy/files/؟ يمكنك الانتقال باستعمال الأمر cd، وهو اختصار للعبارة change directory التي تعني تغيير المجلد، اكتب إذًا السطر التالي في واجهة الطرفية لديك: $ cd files لن تحصل على رسالة أو خرج يؤكد لك صحة تنفيذ الأمر، وأنك في المسار home/sammy/files/، كما هو الحال مع أمر إنشاء المجلد في القسم السابق، ستتلقى فقط المؤشر الوامض، لذا استعمل الأمر pwd لتتأكد من ذلك: $ pwd سيظهر الخرج التالي: /home/sammy/files يؤكد الخرج السابق وجودك في المجلد home/sammy/files/ الذي يقع ضمن مجلد المستخدم home/sammy/، تبدو هذه المسارات المفصولة بالشرطات المائلة مألوفة بالنسبة لك؟ ملاحظتك صحيحة لأنها تشبه عناوين URL لمواقع الويب، فهذه المواقع في نهاية الأمر تتوضع ضمن مجلدات على خوادم الويب. يساعدك الأمر / cd على الوصول إلى المجلد الرئيسي للخادم من أي مكان في نظام الملفات: $ cd / نفذ الآن الأمر التالي لتستعرض محتويات المجلد الرئيسي: $ ls ستحصل على هذا الخرج: bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run s sbin srv sys tmp usr var هذه هي محتويات المجلد الرئيسي / لنظام لينكس، ويسمى أيضًا مجلد الجذر، وهو يختلف تمامًا عن مستخدم الجذر الافتراضي root، ويتمتع بأهمية كبيرة في نظام لينكس إذ يتضمن كل المجلدات الضرورية لعمل نظام التشغيل، فعلى سبيل المثال: يحتوي المجلد الفرعي sys على نواة النظام kernel، ومعلومات النظام عن نظام الملفات الافتراضي، يمكنك معرفة المزيد عن محتويات مجلد الجذر بمراجعة توثيقات لينكس الرسمية. لاحظ أن المجلد home/ الخاص بالمستخدمين موجودٌ هنا أيضًا، ويمكنك الانتقال إليه من مجلد الجذر / ثم الانتقال إلى المجلد files، أو استخدام الأمر cd والانتقال إلى files مباشرةً من مجلد الجذر / وفق التالي: $ cd /home/sammy/files نفذ الآن الأمر pwd وستحصل على home/sammy/files/ في الخرج. سنعرض الآن المسارات في لينكس، مسار الملف File Path هو توصيف لمكان وجود الملف أو المجلد على حاسوبك أو على الخادم، المسارات نوعان نسبي ومطلق، النسبي هو الذي يحدد موقع الملف أو المجلد الهدف نسبةً إلى مجلد العمل الحالي، يشبه طريقة انتقالنا إلى داخل المجلد /files عندما كنا في مجلد العمل الحالي home/sammy/. أما المسار المطلق فهو موقع الملف انطلاقًا من مجلد الجذر، كما فعلنا في الأمر أعلاه باستخدام home/sammy/files/، فقد بدأنا بمجلد الجذر /، ثم استدعينا home/sammy/، وبعدها /files الموجود بداخله، إذًأ فالمسار المطلق يبدأ دائمًا بإشارة الجذر /. النقط dot أيضًا هي أسلوب للتنقل عبر المسارات النسبية في لينكس. تشير النقطة الوحيدة . إلى مجلد العمل الحالي، والنقطتان .. إلى المجلد الأب، فمثلًا لو كنت في المجلد home/sammy/files/ يمكنك استخدام النقطتين للوصول إلى المجلد الأب home/sammy/، وفق التالي: $ cd .. يمكنك اختبار صحة التنفيذ باستخدام pwd لعرض مجلد العمل الحالي، ستحصل عندها على home/sammy/، وتستطيع أيضًا تنفيذ ls لعرض المحتويات فسيظهر لك المجلد files. يوجد رمزٌ آخر يفيدك في التنقل هو الرمز ~، ينقلك مباشرةً من أي مكان في نظام الملفات إلى المجلد الأساسي home للمستخدم الذي سجلت دخولًا باسمه، في مثالنا المسخدم هو sammy والمجلد الأساسي له يدعى home/sammy/، على حاسوبك سيكون باسم المستخدم الذي تنفذ الأوامر من حسابه. جرب الأمر التالي على الطرفية لديك، وسيأخذك بنقلة واحدة إلى المجلد الأساسي لمستخدمك: $ cd ~ سنتعلم في القسم التالي كيفية التعامل مع الملفات النصية. إنشاء الملفات النصية وتعديلها تأكد في البداية من وجدوك في المجلد /files، لديك طريقتين للقيام بذلك، إما الاستعلام عن مسار العمل الحالي بواسطة الأمر pwd، أو الانتقال مباشرة إلى المجلد بواسطة مساره المطلق وفق التالي: $ cd /home/sammy/files سننشئ الآن ملفًا نصيًا بلاحقة txt. وهي لاحقة قياسية يقرأها نظام التشغيل بدون أي برامج إضافية كما هو الحال مع ملفات doc. مثلًا. والنصوص المكتوبة ضمن الملفات من نوع txt. هي نصوص غير منسقة، يمكن استخدامها بسهولة داخل نافذة سطر الأوامر، أو عند التعامل مع النصوص برمجيًا، مثل: التحليل الآلي للنص، أو سحب المعلومات من نص معين، أو غير ذلك. سننشئ الملف بكتابة الأمر touch، المخصص لإنشاء الملفات النصية وتعديلها، ثم تمرير اسم الملف النصي بصفته وسيطًا له، وفق التالي: $ touch ocean.txt بمجرد الضغط على زر ENTER ستنتقل لسطر جديد في نافذة سطر الأوامر بدون أي رسالة تؤكد إنشاء الملف النصي، لذا يمكنك استعراض محتويات المجلد /files للتأكد من وجود الملف بداخله. $ ls وسيكون الخرج: ocean.txt أنشأنا إذًا الملف النصي ocean.txt لكنه فارغ، ولو أردنا إنشاء ملف نصي مجهز ببعض الكلمات فسيفيدنا في ذلك الأمر echo المخصص لعرض السلاسل النصية في نافذة سطر أوامر لينكس. يعمل الأمر echo على ترديد ما تكتبه بعده في نافذة سطر الأوامر. لنجرب ذلك بالعبارة المعتادة !Hello, World: $ echo Hello, World! وهذا هو الخرج: Hello, World! يأتي اسم echo أو الصدى من إيكو حورية الجبل التي تردد ما يقال لها فقط دون أي قدرة على حديث نابع من نفسها، حسب الأسطورة اليونانية القديمة في كتاب التحولات لأوفيد، والأمر echo هنا يكرر ما يكتب بعده فقط دون اجتهاد، وفي مثالنا أظهر العبارة !Hello, World كما هي في نافذة سطر الأوامر. أما لو رغبت باستخدامه لتخزين هذه العبارة أو غيرها في ملف نصي ما، فيتعين عليك كتابته بهذه الطريقة: $ echo "Sammy the Shark" > sammy.txt يبدأ السطر السابق بالأمر echo، يليه العبارة النصية التي نريد كتابتها في الملف، وبعده سهم إعادة التوجيه <، ثم اسم الملف النصي الجديد sammy.txt. تفحص الآن وجود الملف sammy.txt بواسطة الأمر ls وفق التالي: $ ls وسيكون الخرج: ocean.txt sammy.txt يظهر الخرج السابق وجود ملفين في المجلد home/sammy/files/، يمكنك استعراض الملف sammy.txt للتأكد من وجود العبارة النصية التي خزنتها فيه، وذلك باستخدام الأمر cat، وهو من أشهر أوامر لينكس، ويستعمل لعرض مضمون الملفات النصية ووظائف أخرى تتعلق بها: $ cat sammy.txt نفذ الأمر وستحصل على الخرج التالي: Sammy the Shark جرب استخدام cat مع الملف ocean.txt، لن تحصل على شيء لأنه فارغ من أي محتوى، أضف إليه أي عبارة تريدها بواسطة الأمر echo كما شرحنا سابقًا، سنضيف مثلًا اقتباسًا شهيرًا للكاتبة زورا نيل هيرستون، انظر للأمر التالي: $ echo "Some people could look at a mud puddle and see an ocean with ships." > ocean.txt استخدم cat معه مجددًا ولاحظ الفرق في الخرج: Some people could look at a mud puddle and see an ocean with ships. سنتعرف الآن على طريقة تعديل محتوى الملف النصي، ستحتاج لهذا العمل محرر نصوص يعمل مع سطر الأوامر، الخيارات متنوعة أبرزها: vim و Emacs و nano. سنستخدم هنا nano. يمكنك استدعائه بالأمر nano وتمرير اسم الملف الذي تريده تعديله بصفته وسيطًا له، انظر التالي: $ nano sammy.txt سيفتح الآن الملف sammy.txt، وتجد فيه المحتوى التالي: Sammy the Shark حرك المؤشرة باستعمال أسهم لوحة المفاتيح لتصل إلى نهاية العبارة الموجودة في الملف، واكتب ما تريده بعدها. لنفترض أنك أضفت التعديلات التالية إلى الملف: Sammy the Shark Hello, I am Sammy. I am studying computer science. Nice to meet you! حان الآن موعد الحفظ، فكيف تحفظ التعديلات؟ لاحظ الكلمات الموجودة في أسفل النافذة الطرفية لديك، تبدو مثل هذا: ^G Get Help ^O WriteOut ^R Read File ^Y Prev Page ^K Cut Text ^C Cur Pos ^X Exit ^J Justify ^W Where Is ^V Next Page ^U UnCut Text ^T To Spell هي تشرح نفسها نوعًا ما، فبجانب كل رمز كلمة توضح وظيفته. أو ما ينبغي معرفته أن الرمز ^ يشير لزر CTRL أو Control على لوحة المفاتيح. وما دام أننا أنهينا التعديلات سنضغط CTRL مع حرف X معًا لنحصل على مفعول Exit، ونغلق الملف، وانتبه لكتابة الحرف x حرف صغير أي بدون استخدام الزر Shift. CTRL x ستجدها في التوثيقات مكتوبة بصيغة CTRL + X أو Ctrl+x، وهي تعني الضغط على الزرين في الوقت نفسه. اضغط الزرين الآن، وستحصل مباشرةً على الرسالة التالية: Save modified buffer? Y Yes N No ^C Cancel اضغط الزر Y لحفظ التغييرات. Y وسيؤكد لك النظام عملية الحفظ بإظهار الخرج التالي: File Name to Write: sammy.txt تتضمن الرسالة خيارات إضافية مثل الضغط على CTRL + C للإلغاء، لكن إذا كنت واثقًا من رغبتك بالخروج من الملف اضغط على ENTER لحفظ التغييرات على الملف والخروج منه. لنفترض على سبيل المثال أنك تريد إنشاء عدد من الملفات النصية لطلبة أكاديمية حسوب، ملف لكل طالب، وسامي sammy هو أحد الطلاب، ستنشئ في البداية مجلدًا جديدًا يدعى الطلاب students مثلًا ضمن المجلد /files، ثم تنقل الملف sammy.txt إليه. أولًا تعليمة إنشاء المجلد: $ mkdir students والآن تعليمة النقل بواسطة الأمر mv (المستوحى من كلمة move)، يأخذ هذا الأمر وسيطين، الوسيط الأول هو الملف المراد نقله، والوسيط الثاني هو موقعه الجديد، انظر التعليمتين التاليتين فلهما النتيجة نفسها: $ mv sammy.txt students $ mv sammy.txt students/sammy.txt تعمل mv في التعليمة الأولى على نقل الملف مع الحفاظ على اسمه، أما في الثانية فيمكنك تغيير اسم الملف عند نقله إذا رغبت بذلك، تستطيع مثلًا كتابتها على الشكل التالي: mv sammy.txt students/sammy-the-shark.txt إذا استعرضت محتويات المجلد /files باستخدام الأمر ls، ستجد ضمنه الملف ocean.txt، والمجلد الجديد students، انتقل إلى المجلد /students، وفق الآتي: $ cd students أنت الآن ضمن المجلد /students، فلنفترض أنك تحتاج لاستخدام الملف sammy.txt على أنه قالب يسهل عليك إنشاء ملفات بقية الطلاب، فأول ما يتبادر إلى ذهنك هو نسخ الملف sammy.txt إلى عدة نسخ ثم التعديل عليها حسب بيانات كل طالب، تجري عملية النسخ باستخدام الأمرcp وهو اختصار لكلمة copy. وعلى غرار mv فإنه يأخذ وسيطين، الوسيط الأول اسم الملف الأصلي أي المطلوب نسخه، والوسيط الثاني اسم الملف الجديد، انظر التعليمة التالية لإنشاء نسخة من ملف الطالب سامي sammy.txt وتسميتها باسم جديد لتمثل طالب آخر أليكس alex.txt مثلًا: $ cp sammy.txt alex.txt افتح الآن الملف alex.txt باستخدام محرر النصوص، ستجد محتواه مطابق تمامًا لمحتوى الملف sammy.txt، عدّل البيانات التي تحتاج لتعديلها، ليصبح مثلًا كما هو مبين أدناه، ونود لفت انتباهك إلى قدرتك على حذف سطر كامل من الملف بخطوة واحدة، عبر الضغط على CTRL + K معًا: Alex the Leafy Seadragon Hello, I am Alex. I am studying oceanography. Nice to meet you! أغلق الملف الجديد الآن واحفظ التغييرات، بالضغط على CTRL + x ثم Y ثم ENTER. حاول إنشاء ملفات نصية أخرى للتدريب، وعندما تصبح جاهزًا انتقل معنا للقسم التالي لنتعرف على أوامر ومميزات جديدة. الإكمال التلقائي وسجل الأوامر المحفوظة توفر معظم واجهات سطر الأوامر مميزات، مثل: الإكمال التلقائي للأوامر، وإعادة استخدام الأوامر السابقة، تسهل عمل المستخدمين عليها، وتسرّع وتيرته. جرب بنفسك، حاول مثلًا كتابة الأمر cat مع الأحرف الأولى من أحد الملفات التي عملنا عليها نحو cat sa قبل أن تكمل اسم الملف sammy.txt بالكامل، اضغط على زر TAB من لوحة المفاتيح ولاحظ ميزة الإكمال التلقائي، فالطرفية ستكمل اسم الملف تلقائيًا وتظهره لك دون أن تكمل أنت كتابته، كما هو مبين أدناه: $ cat sammy.txt والآن إذا ضغطت ENTER ستنفذ التعليمة بطريقة طبيعية، ويظهر محتوى الملف النصي. حاول بعدها الضغط على السهم الأعلى UP من أسهم التمرير في لوحة المفاتيح، وشاهد ما سيظهر، ستجد أن الطرفية تعرض عليك آخر أمر نفذته، اضغط السهم UP بوتيرة أسرع وسترى الأوامر التي نفذتها مؤخرًا، يمكنك بذلك الوصول إلى الأمر الذي تريد إعادة تنفيذه دون كتابته من جديد. تستطيع أيضًا استعراض كافة الأوامر المستخدمة سابقًا في هذه الجلسة، باستخدام الأمر history: $ history ستحصل في الخرج على سجل يتضمن جميع الأوامر المحفوظة، مثل التالي: 1 pwd 2 mkdir files 3 ls 4 ls -l ... تفيدك هذه الاختصارات في رفع إنتاجيتك عند العمل مع واجهة سطر الأوامر. العمل مع الملفات عبر الويب تتيح لك واجهة سطر الأوامر، الموجودة على حاسوب متصل بالإنترنت، الوصول إلى جميع الموارد المتاحة على الويب، يمكنك مثلًا: الاتصال بخادم سحابي عن طريقها إذا كنت تعرف بيانات الاعتماد الخاصة به، أو إدارة البنية التحتية السحابية لشركتك، أو القيام بأنشطتك الخاصة بتطوير تطبيقات الويب أو غير ذلك. وما دام أنك تعلمت طريقة التعامل مع الملفات النصية، فستكون خطوتنا الأولى التعرف على كيفية سحب ملف نصي من الويب ليكون متاحًا على حاسوبك الشخصي. انتقل للمجلد /files: $ cd /home/sammy/files سنستخدم الآن الأمر crul، والذي يرمز إلى client URL، لجلب البيانات من الويب إلى طرفيتك. رفعنا -يقول كاتب المقال- ملف نصيًا لغرض التجربة يتضمن مقطعًا قصيرًا من رواية على خادم سحابي، وسنستخدم عنوان URL الخاص به في تعليمة crul التالية: $ curl https://assets.digitalocean.com/articles/command-line-intro/verne_twenty-thousand-leagues.txt ما إن تضغط على زر ENTER ستتلقى محتوى الملف النصي في واجهة الطرفية، وهو في حالتنا مقطعًا من رواية، وفق التالي: "You like the sea, Captain?" "Yes; I love it! The sea is everything. It covers seven tenths of the terrestrial globe. ... "Captain Nemo," said I to my host, who had just thrown himself on one of the divans, "this is a library which would do honor to more than one of the continental palaces, and I am absolutely astounded when I consider that it can follow you to the bottom of the seas." ظهر محتوى الملف النصي على واجهتك الطرفية، لكنه في الواقع لم يخزن على حاسوبك المحلي حتى الآن، يمكنك التأكد من ذلك بواسطة الأمر ls، فما طريقة تخزينه إذًا؟ الحل هو استخدام الخيار أو الراية O- مع الأمر curl، وعندها سيُخَزَّن الملف محليًا باسم الملف البعيد نفسه. $ curl -O https://assets.digitalocean.com/articles/command-line-intro/verne_twenty-thousand-leagues.txt وستحصل على رسالة في واجهة الطرفية، تخبرك بنجاح عملية التنزيل، تشبه صيغتها التالي: % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2671 100 2671 0 0 68487 0 --:--:-- --:--:-- --:--:-- 68487 يمكنك أيضًا تنزيل الملف من الويب وحفظه على الحاسب باسم مختلف عن اسمه الأصلي، بالاسم jules.txt مثلًا، وذلك بتمرير الاسم الجديد بصفة وسيط إضافي للأمر crul مع الخيار o-، وفق التالي: $ curl -o jules.txt https://assets.digitalocean.com/articles/command-line-intro/verne_twenty-thousand-leagues.txt تستطيع الآن عرض الملف بواسطة cat، أو تحرير عبر nano. يفيدك أيضًا مراجعة المقال دليل استخدام سطر الأوامر في عملية تطوير الويب من طرف العميل لمزيد من الأمثلة من المعلومات المفيدة. يتناول القسم الأخير من المقال طرق حذف الملفات وإنهاء تنفيذ الأوامر. حذف الملفات وإنهاء تنفيذ الأوامر ستتعرض بالتأكيد لحالات تحتاج فيها لحذف ملف أو مجلد، أو لإنهاء تنفيذ أمر معين، أو الخروج من تطبيق تستخدمه، سنتعلم ذلك. بالعودة إلى مثال طلاب الأكاديمية، فلنفترض أنك تحتاج لحذف ملفات بعض الطلاب لأنهم تخرجوا مثلًا. تأكد أولًا من وجودك في المجلد /students، يمكنك تنفيذ الأمر التالي للانتقال إليه: $ cd /home/sammy/files/students نفذ الآن الأمر ls لاستعراض محتويات المجلد، وبما أننا أنشأنا عددًا من الملفات مسبقًا، فستحصل على الخرج التالي: alex.txt drew.txt jamie.txt jesse.txt sammy.txt taylor.txt يمكنك حذف الملفات المفردة من مجلد الطلاب /students باستخدام الأمر rm. لنحذف مثلًا الملف sammy.txt وفق الآتي: $ rm sammy.txt استعرض مجددًا محتويات المجلد باستخدام ls، ولاحظ عدم وجود الملف sammy.txt بينها: alex.txt drew.txt jamie.txt jesse.txt taylor.txt إذا رغبت بحذف المجلد /students كاملًا مع كافة محتوياته، فستحتاج للأمر rmdir الذي يختصر العبارة remove directory. انتقل في البداية إلى المجلد الأب files ونفذ أمر حذف المجلد /students من هناك، فلا يمكنك حذف أي مجلد طالما أنك تعمل ضمنه. $ cd .. نحن الآن في المجلد /home/sammy/files/، وحاول حذف مجلد الطلاب students من هنا باستخدام rmdir، وفق التالي: $ rmdir students وستحصل على رسالة الخطأ التالية في الخرج: rmdir: failed to remove 'students': Directory not empty تفيد الرسالة بعدم إمكانية حذف المجلد لأنه غير فارغ، يمكنك بالتأكيد معالجة الموضوع بحذف الملفات الفردية من المجلد students واحدًا تلو الآخر، ثم حذف المجلد، لكنها ليست بالطريقة الأمثل وخاصة إذا كان عدد الملفات كبير. بالمناسبة يمكنك إنشاء مجلد فارغ ومحاولة حذفه باستخدام الأمر rmdir والتأكد من فعاليته مع المجلدات الفارغة. أما حذف المجلدات الممتلئة، فيتطلب استخدام الأمر rm مع الراية أو الخيار r-، ترمز هذه الراية إلى الكلمة الإنكليزية recursion أو العودية التي تصف الدوال أو العمليات الحاسوبية التي تستدعي نفسها ذاتيًا مرارًا وتكرارًا، فبالتالي عند استخدامها مع أمر الحذف سيُحذَف العنصر مع كل محتوياته. اكتب إذًا الأمر التالي، ومرر اسم المجلد students بعد أمر الحذف: $ rm -r students تأكد من صحة حذف المجلد /students مع جميع ملفاته، بتنفيذ الأمر ls. أنهيت أعمالك في الطرفية سواء كنت تعمل على حاسوبك الشخصي أو تتصل بخادم بعيد وتريد الخروج منها؟ اكتب إذًا الأمر exit وفي حال كنت متيقنًا من كل شيء اضغط على زر ENTER، فمجرد مغادرتك لجلسة العمل لن تتمكن من استعادتها مجددًا. $ exit ستحصل على الخرج التالي بعد الضغط على زر إنتر، ليؤكد لك إنتهاء جلسة العمل وخروجك منها. Session ended الخلاصة قدم المقال بداية تعريفية لكل راغب ببدء العمل مع الواجهة الطرفية وسطر الأوامر، سواء لإدارة الحواسيب أو الخوادم السحابية البعيدة. يوجد العديد من المقالات المفيدة في هذا المجال على أكاديمية حسوب، استعرض قسم لينكس وقسم الحوسبة السحابية، واقرأ ما يناسبك منها. ترجمة -وبتصرف- للمقال A Linux Command Line Primer لصاحبته Lisa Tagliaferri. اقرأ أيضًا ما هو سطر الأوامر؟ مرجع إلى أشهر أوامر لينكس التعامل مع واجهة سطر الأوامر (CLI) في PHP إعداد البيئة وواجهة سطر الأوامر في بايثون
  13. النصوص هي أكثر أنواع البيانات التي ستتعامل معها في برنامجك. لقد تعلمت كيفية جمع سلسلتين نصيتين مع بعضها عبر العامل +، لكنك تستطيع أكثر من ذلك بكثير؛ إذ تستطيع استخراج سلاسل نصية فرعية، وإضافة وحذف الفراغات، وتحويل الأحرف إلى أحرف كبيرة أو صغيرة، والتحقق من تنسيق السلاسل تنسيقًا صحيحًا؛ وتستطيع أيضًا كتابة برنامج بايثون للوصول إلى الحافظة في حاسوبك لنسخ ولصق النصوص. كل ما سبق ستتعلمه في هذا المقال وسنزيد على ذلك؛ وسنرى مشروعين عمليين: حافظة بسيطة التي تخزن عدة سلاسل نصية من النصوص، وبرنامج لأتمتة العملية المملة لتنسيق النصوص يدويًا. التعامل مع السلاسل النصية لنلقِ نظرةً على الطرائق التي تسمح لنا فيها بايثون بالكتابة والطباعة والوصول إلى السلاسل النصية في برامجنا. السلاسل النصية المجردة كتابة القيم النصية في شيفرة بايثون هو أمر بالغ السهولة: نبدأ وننتهي بعلامة اقتباس مفردة. لكن ماذا سيحدث لو أردنا استخدام علامة اقتباس داخل السلسلة النصية؟ إذا كتبنا ‎'That is Alice's cat.'‎ فسيحدث خطأ لأن بايثون ستظن أن السلسلة النصية قد انتهت بعد Alice وبقية السطر s cat.'‎ هي شيفرة غير صالحة في بايثون. لحسن الحظ هنالك عدة طرائق لكتابة السلاسل النصية. علامات الاقتباس المزدوجة يمكن أن تبدأ السلاسل النصية وتنتهي عبر كتابة علامتي اقتباس مزدوجتين، وهي تعمل كما في علامات الاقتباس المفردة. إحدى فوائد استخدام علامات الاقتباس المزدوجة هي إمكانية كتابة علامة الاقتباس الفردية داخلها: >>> spam = "That is Alice's cat." ولأن السلسلة النصية تبدأ بعلامة اقتباس مزدوجة، فستعلم بايثون أن علامة الاقتباس المفردة هي جزء من السلسلة النصية ولا تمثل نهايتها. لكن ماذا لو احتجنا إلى استخدام علامات الاقتباس المفردة والمزدوجة معًا في السلسلة النصية؟ سنحتاج هنا إلى محارف التهريب. محارف التهريب تسمح لنا محارف التهريب escape characters باستخدام محارف ليس من الممكن إدراجها مباشرةً في السلسلة النصية. يتألف محرف التهريب من خط مائل خلفي backslash \ متبوعًا بأحد المحارف التي نريد إضافتها إلى السلسلة النصية؛ وصحيحٌ أن اسمه هو «محرف» التهريب، لكن يتألف من محرفين ويشار إليه عادةً بصيغة المفرد escape character. فمثلًا محرف التهريب لعلامة الاقتباس المفردة هو ‎\'‎ وذب الشيفرة الآتية: >>> spam = 'Say hi to Bob\'s brother.' ولأننا وضعنا خط مائل خلفي قبل علامة الاقتباس المفردة في Bob\'s فستعلم بايثون أننا لا نقصد أن ننهي السلسلة النصية. تسمح لنا محارف التهريب\' و \" بوضع علامات الاقتباس داخل السلاسل النصية المحاطة بعلامات اقتباس مفردة ومزدوجة على الترتيب. الجدول 6-1 يوضح بعض محارف التهريب التي تستطيع استخدامها. فيما يلي محارف التهريب: ‎\'‎: علامة اقتباس مفردة ‎\"‎: علامة اقتباس مزدوجة ‎\t: علامة الجدولة tab ‎\n: سطر جديد newline \\: خط مائل خلفي جرب السلسلة النصية الآتية: >>> print("Hello there!\nHow are you?\nI\'m doing fine.") Hello there! How are you? I'm doing fine. السلاسل النصية الخام يمكنك وضع الحرف r قبل علامة الاقتباس في بداية السلسلة النصية لجعلها سلسلة نصية خام. السلسلة النصية الخام raw string تتجاهل جميع محارف التهريب وتظهر جميع الخطوط المائلة الخلفية كما هي: >>> print(r'That is Carol\'s cat.') That is Carol\'s cat. ولأنها سلسلة نصية خام فستعدّ بايثون الخط الخلفي المائل على أنه جزء من السلسلة النصية وليس جزءًا من محرف التهريب. يمكن أن تكون السلاسل النصية الخام مفيدةً إن كانت تكتب سلاسل نصية فيها عدد من الخطوط المائلة الخلفية، مثل مسارات الملفات في نظام ويندوز r'C:\Users\Al\Desktop'‎ أو التعابير النمطية regular expressions المشروحة في المقال القادم. السلاسل النصية متعددة الأسطر بعلامات اقتباس ثلاثية صحيحٌ أن بإمكاننا استخدام محرف التهريب ‎\n لطابعة سطر جديد داخل سلسلة نصية، لكن من الأسهل استخدام السلاسل النصية متعددة الأسطر. تبدأ السلسلة النصية متعددة الأسطر في بايثون بثلاث علامات اقتباس مفردة أو مزدوجة، وستعد جميع علامات الاقتباس ومسافات الجدولة tabs والأسطر الجديدة على أنها جزءٌ من السلسلة النصية المحاطة بعلامات اقتباس ثلاثية. لاحظ أن قواعد تنسيق بايثون الخاصة بالمسافات البادئة في الكتل البرمجية لا تنطبق على السلاسل النصية متعددة الأسطر. print('''Dear Alice, Eve's cat has been arrested for catnapping, cat burglary, and extortion. Sincerely, Bob''') احفظ ما سبق في ملف باسم catnapping.py وشغله: Dear Alice, Eve's cat has been arrested for catnapping, cat burglary, and extortion. Sincerely, Bob لاحظ أن علامة الاقتباس المفردة في Eve's لا تحتاج إلى تهريب، فتهريب علامات الاقتباس المفردة والمزدوجة هو أمرٌ اختياري حين استخدام السلاسل النصية متعددة الأسطر. السلسلة النصية الموجودة في دالة print()‎ الآتية تكافئ المثال السابق دون استخدام السلاسل النصية متعددة الأسطر: print('Dear Alice,\n\nEve\'s cat has been arrested for catnapping, cat burglary, and extortion.\n\nSincerely,\nBob') التعليقات متعددة الأسطر صحيحٌ أن رمز المربع # يرمز إلى بداية تعليق حتى نهاية السطر، لكن من الشائع استخدام سلسلة نصية متعددة الأسطر للتعليقات التي تمتد لأكثر من سطر. الشيفرات الآتية صالحة تمامًا في بايثون: """This is a test Python program. Written by Al Sweigart al@inventwithpython.com This program was designed for Python 3, not Python 2. """ def spam(): """This is a multiline comment to help explain what the spam() function does.""" print('Hello!') فهرسة وتقسيم السلاسل النصية تستعمل السلاسل النصية الفهارس ويمكن تقسيمها كما في القوائم lists. يمكنك أن تعدّ السلسلة النصية ‎'Hello, world!'‎ على أنها قائمة وكل حرف فيها يمثل عنصرًا في تلك القائمة مع فهرس مرتبط به. ' H e l l o , w o r l d ! ' 0 1 2 3 4 5 6 7 8 9 10 11 12 لاحظ تضمين الفراغ وإشارة التعجب، وسيكون عدد الأحرف هو 13، بدءًا من الحرف H في الفهرس 0 إلى الحرف ! في الفهرس 12. >>> spam = 'Hello, world!' >>> spam[0] 'H' >>> spam[4] 'o' >>> spam[-1] '!' >>> spam[0:5] 'Hello' >>> spam[:5] 'Hello' >>> spam[7:] 'world!' إذا حددت فهرسًا فستحصل على المحرف الموجود في ذاك الموضع في السلسلة النصية، وإذا حددت مجالًا من فهرسٍ ما إلى آخر فسيُضمَّن المحرف الموجود في فهرس البداية ولن يضمن المحرف الموجود في فهرس النهاية، ولذا إذا كان لدينا المتغير spam الذي فيه ‎'Hello, world!'‎ فإن spam[0:5]‎ هو 'Hello'؛ فالسلسلة النصية الجزئية التي ستحصل عليها من spam[0:5]‎ ستتضمن كل محرف موجود في المجال spam[0]‎ حتى spam[4]‎ ولن تحتوي الفاصلة الموجودة في الفهرس 5 ولا الفراغ في المحرف 6. هذا السلوك يشبه سلوك الدالة range(5)‎ التي ستؤدي -حين استعمالها مع for- إلى المرور على الأرقام حتى الرقم 5 دون تضمينه. لاحظ أن تقسيم السلاسل النصية لا يغير السلسلة النصية الأصلية، ويمكننا حفظ القيمة الناتجة في متغير منفصل: >>> spam = 'Hello, world!' >>> fizz = spam[0:5] >>> fizz 'Hello' بتقسيم السلسلة النصية ثم تخزينها في متغير آخر فسنتمكن من الوصول إلى السلسلة النصية الأصلية والسلسلة النصية المقتطعة بسهولة. العوامل in و not in مع السلاسل النصية يمكن استخدام العاملين in و not in مع السلاسل النصية كما في القوائم lists. التعبير البرمجي الذي فيه سلسلتين نصيتين مجموعٌ بينها بالعامل in أو not in سينتج القيمة المنطقية True أو False: >>> 'Hello' in 'Hello, World' True >>> 'Hello' in 'Hello' True >>> 'HELLO' in 'Hello, World' False >>> '' in 'spam' True >>> 'cats' not in 'cats and dogs' False تختبر التعابير البرمجية السابقة إن كانت السلسلة النصية الأولى (كما هي بحذافيرها، مع حالة الأحرف فيها) موجودةً في السلسلة النصية الثانية. وضع السلاسل النصية داخل سلاسل نصية أخرى من الشائع في البرمجة وضع سلسلة نصية داخل سلسلة نصية أخرى، واستعملنا حتى الآن العامل + لجمع السلاسل النصية كما يلي: >>> name = 'Al' >>> age = 4000 >>> 'Hello, my name is ' + name + '. I am ' + str(age) + ' years old.' 'Hello, my name is Al. I am 4000 years old.' لكن ذلك يتطلب كتابةً كثيرة، ومن الأسهل أن ندس السلاسل النصية داخل بعضها string interpolation، وبهذه الطريقة نستعمل العامل ‎%s داخل السلاسل النصية كمؤشر لكي يستبدل مسبقًا إلى القيم التي تلي السلسلة النصية. إحدى ميزات استخدام هذه الطريقة هو عدم حاجتنا إلى استدعاء الدالة str()‎ لتحويل القيم إلى سلاسل نصية: >>> name = 'Al' >>> age = 4000 >>> 'My name is %s. I am %s years old.' % (name, age) 'My name is Al. I am 4000 years old.' أضافت بايثون 3.6 ما يسمى بالسلاسل النصية المنسقة f-strings، وهي تشبه دس السلاسل النصية لكنها تتيح إضافة التعابير البرمجية بين قوسين مجعدين مباشرةً؛ تذكر أن تضيف الحرف f قبل علامة الاقتباس الابتدائية في السلسلة النصية المنسقة: >>> name = 'Al' >>> age = 4000 >>> f'My name is {name}. Next year I will be {age + 1}.' 'My name is Al. Next year I will be 4001.' إذا لم تتذكر تضمين الحرف f قبل علامة الاقتباس فستعامل الأقواس على أنها جزء من السلسلة النصية: >>> 'My name is {name}. Next year I will be {age + 1}.' 'My name is {name}. Next year I will be {age + 1}.' توابع مفيدة للتعامل مع السلاسل النصية يشرح هذا القسم أكثر التوابع شيوعًا التي تحلل السلاسل النصية وتعالجها وتنتج سلاسل نصية معدلة. التوابع upper()‎ و lower()‎ و isupper()‎ و islower()‎ يعيد التابعان upper()‎ و lower()‎ سلسلةً نصيةً جديدةً تحوَّل فيها أحرف السلسلة النصية الأصلية إلى حالة الأحرف الكبيرة أو الصغيرة على التوالي. أما المحارف غير النصية أو غير اللاتينية فتبقى كما هي: >>> spam = 'Hello, world!' >>> spam = spam.upper() >>> spam 'HELLO, WORLD!' >>> spam = spam.lower() >>> spam 'hello, world!' لاحظ أن هذان التابعان لا يغيران السلسلة النصية الأصلية وإنما يعيدان سلسلةً نصيةً جديدةً. إذا أردت تعديل السلسلة النصية الأصلية فعليك استدعاء التابع upper()‎ أو lower()‎ على السلسلة النصية ثم إسناد الناتج مباشرةً إلى المتغير الذي يحتوي على السلسلة النصية الأصلية؛ أي أننا سنكتب شيئًا يشبه spam = spam.upper()‎ لتعديل السلسلة النصية المخزنة في المتغير spam بدلًا من كتابة spam.upper()‎ فقط، وهذا يشبه حالة وجود متغير اسمه eggs يحتوي القيمة 10، فكتابة التعبير البرمجي eggs + 3 لا يؤدي إلى تغيير القيمة المخزنة في المتغير eggs مباشرة، وإنما علينا كتابة eggs = eggs + 3. التابعان upper()‎ و lower()‎ مفيدان إن أردنا مقارنة سلسلتين نصيتين مقارنةً غير حساسةٍ لحالة الأحرف. فمثلًا السلسلتان النصيتان 'great' و 'GREat' غير متساويتين؛ لكن قد لا يهمنا في بعض الحالات التي نطلب فيها مدخلات المستخدم إن كان قد كتب Great أم GREAT أم gREAt. انظر المثال الآتي الذي نحول فيه السلسلة النصية إلى حالة الأحرف الصغيرة: print('How are you?') feeling = input() if feeling.lower() == 'great': print('I feel great too.') else: print('I hope the rest of your day is good.') حينما تشغل البرنامج السابق فسيظهر لك سؤال، وإذا أدخلت الكلمة great بأي شكل من الأشكال فستظهر لك العبارة ‎'I feel great too.'‎. من المفيد جدًا إضافة آلية للتعامل مع اختلاف حالات الأحرف في مدخلات المستخدم في برامجك، إذ سيسهل ذلك استخدامها كثيرًا. How are you? GREat I feel great too. يعيد التابعان isupper()‎ و islower()‎ قيمةً منطقية True إن كانت السلسلة النصية تحتوي على حرف واحد على الأقل وكان ذاك الحرف كبيرًا أو صغيرًا على التوالي وبالترتيب؛ وإلا فستعيد القيمة False: >>> spam = 'Hello, world!' >>> spam.islower() False >>> spam.isupper() False >>> 'HELLO'.isupper() True >>> 'abc12345'.islower() True >>> '12345'.islower() False >>> '12345'.isupper() False ولأن القيمة المعادة من التابعين upper()‎ و lower()‎ هي سلاسل نصية، فيمكننا استدعاء توابع التعامل مع السلاسل النصية على القيم المعادة من تلك التوابع مباشرةً، وتبدو هذه التعابير البرمجية على أنها سلسلة من التوابع وراء بعضها كما في المثال الآتي: >>> 'Hello'.upper() 'HELLO' >>> 'Hello'.upper().lower() 'hello' >>> 'Hello'.upper().lower().upper() 'HELLO' >>> 'HELLO'.lower() 'hello' >>> 'HELLO'.lower().islower() True مجموعة توابع isX()‎ بالإضافة إلى التابعين islower()‎ و isupper()‎ هنالك عدد من التوابع التي يبدأ اسمها بالكلمة is، وتعيد تلك التوابع قيمةً منطقية التي تشرح طبيعة السلسلة النصية. هذه بعض تلك التوابع: isalpha()‎ يعيد True إذا احتوت السلسلة النصية على أحرف عادية فقط ولم تكن فارغة. isalnum()‎ يعيد True إذا احتوت السلسلة النصية على أحرف عادية وأرقام فقط ولم تكن فارغة. isdecimal()‎ يعيد True إذا احتوت السلسلة النصية على أرقام فقط ولم تكن فارغة. isspace()‎ يعيد True إذا احتوت السلسلة النصية على فراغات عادية ومسافات جدولة tabs وأسطر جديدة newlines فقط ولم تكن فارغة. istitle()‎ يعيد True إذا بدأت السلسلة النصية بحرف كبير متبوعٌ بمجموعة من الأحرف الصغيرة. لنجرب تلك التوابع عمليًا: >>> 'hello'.isalpha() True >>> 'hello123'.isalpha() False >>> 'hello123'.isalnum() True >>> 'hello'.isalnum() True >>> '123'.isdecimal() True >>> ' '.isspace() True >>> 'This Is Title Case'.istitle() True >>> 'This Is Title Case 123'.istitle() True >>> 'This Is not Title Case'.istitle() False >>> 'This Is NOT Title Case Either'.istitle() False تفيد توابع السلاسل النصية isX()‎ حينما نريد التحقق من مدخلات المستخدم، فالبرنامج الآتي يطلب من المستخدم إدخال عمره وكلمة مرور صالحة: while True: print('Enter your age:') age = input() if age.isdecimal(): break print('Please enter a number for your age.') while True: print('Select a new password (letters and numbers only):') password = input() if password.isalnum(): break print('Passwords can only have letters and numbers.') طلبنا من المستخدم في أول حلقة while أن يدخل عمره، ونخزنه في المتغير age. إذا كانت قيمة age هي قيمة عددية صحيحة، فسنخرج من أول حلقة while وندخل في الثانية التي تسأله عن كلمة المرور. وإلا فسنسأل المستخدم عن عمره مجددًا. في حلقة while الثانية طلبنا كلمة المرور وخزناها في المتغير password، وسنخرج من الحلقة إن كانت كلمة المرور تتألف من أرقام أو أحرف، وإلا فسنطلب من المستخدم إدخال كلمة مرور صالحة مجددًا. Enter your age: forty two Please enter a number for your age. Enter your age: 42 Select a new password (letters and numbers only): secr3t! Passwords can only have letters and numbers. Select a new password (letters and numbers only): secr3t تمكّنا من التحقق من صلاحية مدخلات المستخدم في المثال السابق باستخدام التابعين isdecimal()‎ و isalnum()‎، ولم نقبل كتابة forty two بل قبلنا 42، ولم نقبل secr3t!‎ بل قبلنا secr3t. التابعان startswith()‎ و endswith()‎ يعيد التابعان startswith()‎ و endswith()‎ القيمة True إن بدأت أو انتهت السلسلة النصية التي استدعت عليها (على التوالي) بالسلسلة النصية الممررة إلى التابع؛ وإلا فستعيد False: >>> 'Hello, world!'.startswith('Hello') True >>> 'Hello, world!'.endswith('world!') True >>> 'abc123'.startswith('abcdef') False >>> 'abc123'.endswith('12') False >>> 'Hello, world!'.startswith('Hello, world!') True >>> 'Hello, world!'.endswith('Hello, world!') True هذه التوابع هي بديل مفيد لعامل المساواة == إذا أردنا التحقق من الجزء الأول أو الأخير من السلسلة النصية فقط، بدلًا من مقارنتها كلها. التابعان join()‎ و split()‎ يفيد التابع join()‎ حينما يكون لدينا قائمة فيها سلاسل نصية ونريد أن نجمعها كلها مع بعضها بعضًا في سلسلة نصية واحدة؛ ويستدعى التابع join()‎ على سلسلة نصية، ويقبل معاملًا هو قائمة list فيها سلاسل نصية، ويعيد سلسلةً نصيةً تساوي دمج السلاسل النصية كلها: >>> ', '.join(['cats', 'rats', 'bats']) 'cats, rats, bats' >>> ' '.join(['My', 'name', 'is', 'Simon']) 'My name is Simon' >>> 'ABC'.join(['My', 'name', 'is', 'Simon']) 'MyABCnameABCisABCSimon' لاحظ أن السلسلة النصية التي استدعينا عليها التابع join()‎ أصبحت موجودة بين كل سلسلتين نصيتين في القائمة الممررة كوسيط. فمثلًا حين استدعاء join(['cats', 'rats', 'bats'])‎ على السلسلة النصية ‎', '‎ فيكون الناتج هو ‎'cats, rats, bats'‎. تذكر أن التابع join()‎ يستدعى على سلسلة نصية ونمرر إليه قائمة، وليس العكس. يفعل التابع split()‎ عكس فعل التابع join()‎ تمامًا: يستدعى على سلسلة نصية وتعيد قائمةً من السلاسل النصية: >>> 'My name is Simon'.split() ['My', 'name', 'is', 'Simon'] ستُقسَم السلسلة النصية 'My name is Simon' افتراضيًا عند كل محرف يمثل فراغًا (سواءً كان فراغًا عاديًا ' ' أو محرف جدولة tab أو سطرًا جديدًا newline)، ولن تضمن الفراغات في السلاسل النصية الموجودة في القائمة المعادة من استدعاء هذا التابع. يمكننا تمرير محرف الفصل إلى التابع split()‎ لتحديد محرف آخر غير محارف الفراغات: >>> 'MyABCnameABCisABCSimon'.split('ABC') ['My', 'name', 'is', 'Simon'] >>> 'My name is Simon'.split('m') ['My na', 'e is Si', 'on'] من الشائع استدعاء التابع split()‎ لتقسيم سلسلة نصية متعددة الأسطر في مكان وقوع محرف السطر الجديد: >>> spam = '''Dear Alice, How have you been? I am fine. There is a container in the fridge that is labeled "Milk Experiment." Please do not drink it. Sincerely, Bob''' >>> spam.split('\n') ['Dear Alice,', 'How have you been? I am fine.', 'There is a container in the fridge', 'that is labeled "Milk Experiment."', '', 'Please do not drink it.', 'Sincerely,', 'Bob'] يسمح لنا استدعاء التابع split()‎ مع تمرير محرف السطر الجديد '‎\n' إلى تقسيم سلسلة نصية متعددة الأسطر إلى قائمة يمثل فيها كل عنصر سطرًا من الأسطر. تقسيم السلاسل النصية باستخدام التابع partition()‎ يمكن أن يقسم التابع partition()‎ سلسلةً نصية إلى أقسام، ويعمل بتمرير سلسلة نصية إليه كفاصل، التي سيبحث عنها في السلسلة النصية التي استدعي عليها، ويعيد صفًا tuple فيه السلسلة النصية التي تسبق الفاصل، والفاصل، والسلسلة النصية التي تلي الفاصل: >>> 'Hello, world!'.partition('w') ('Hello, ', 'w', 'orld!') >>> 'Hello, world!'.partition('world') ('Hello, ', 'world', '!') إذا احتوت السلسلة النصية التي تستدعي التابع partition()‎ عليها على أكثر من تكرار للفاصل، فستقسم السلسلة النصية عند أول وقوع له فقط: >>> 'Hello, world!'.partition('o') ('Hell', 'o', ', world!') وإن لم يعثر على الفاصل في السلسلة النصية، فستعاد السلسلة النصية التي استدعي عليها التابع كأول عنصر في الصف، وستكون السلسلتان النصيتان الباقيتان فارغتين: >>> 'Hello, world!'.partition('XYZ') ('Hello, world!', '', '') يمكننا استخدام نشر المتغيرات بالإسناد الجماعي لإسناد السلاسل النصية المعادة إلى ثلاثة متغيرات: >>> before, sep, after = 'Hello, world!'.partition(' ') >>> before 'Hello,' >>> after 'world!' يفيد التابع partition()‎ إن كنت تحتاج إلى الحصول على السلسلة النصية التي تسبق فاصلًا محددًا، والفاصل نفسه، والسلسلة النصية التي تلي ذاك الفاصل. محاذاة النصوص عبر rjust()‎ و ljust()‎ و center()‎ يعيد التابعان rjust()‎ و ljust()‎ سلسلةً نصية محاطة بفراغات افتراضيًا. يمثل أول وسيط يمرر إلى تلك التوابع قيمةً لعدد الفراغات المحيطة بالسلسلة النصية: >>> 'Hello'.rjust(10) ' Hello' >>> 'Hello'.rjust(20) ' Hello' >>> 'Hello, World'.rjust(20) ' Hello, World' >>> 'Hello'.ljust(10) 'Hello ' التابع 'Hello'.rjust(10)‎ يعني أننا نريد محاذاة السلسلة النصية 'Hello' إلى اليمين ويكون طول السلسلة النصية الكاملة هو 10. ولما كانت 'Hello' هي 5 محارف، فستضاف 5 فراغات على يسارها، مما يؤدي إلى إعادة سلسلة نصية طولها 10 محارف وتكون فيها محاذاة 'Hello' على اليمين. وسيطٌ اختياري للتابعين rjust()‎ و ljust()‎ يحدد محرفًا للملء بخلاف الفراغ: >>> 'Hello'.rjust(20, '*') '***************Hello' >>> 'Hello'.ljust(20, '-') 'Hello---------------' التابع center()‎ يعمل مثل التابعين ljust()‎ و rjust()‎ لكنه يوسِّط النص بدلًا من محاذاته إلى اليسار أو اليمين: >>> 'Hello'.center(20) ' Hello ' >>> 'Hello'.center(20, '=') '=======Hello========' تفيد هذه التوابع حينما نريد طباعة جداول من البيانات ويكون لها تباعد صحيح. اكتب البرنامج الآتي واحفظه في الملف picnicTable.py: def printPicnic(itemsDict, leftWidth, rightWidth): print('PICNIC ITEMS'.center(leftWidth + rightWidth, '-')) for k, v in itemsDict.items(): print(k.ljust(leftWidth, '.') + str(v).rjust(rightWidth)) picnicItems = {'sandwiches': 4, 'apples': 12, 'cups': 4, 'cookies': 8000} printPicnic(picnicItems, 12, 5) printPicnic(picnicItems, 20, 6) عرفنا الدالة printPicnic()‎ التي تأخذ قاموسًا كمعامل لها، واستخدمنا التوابع center()‎ و ljust()‎ و rjust()‎ لطباعة المعلومات بصيغة جميلة تشبه الجدول. القاموس الذي سنمرره إلى الدالة printPicnic()‎ هو picnicItems، ولدينا في القاموس picnicItems 4 صندويشات و 12 تفاحة و 4 كاسات و 8,000 كعكة (نعم ثمانية آلاف!). نرغب بتنظيم هذه المعلومات في عمودين، ونضع اسم العنصر على اليسار والكمية على اليمين. لفعل ذلك نحتاج إلى أن نقرر كم سيكون عرض العمودين الأيسر والأيمن؛ لذا نحتاج إلى تمرير هاتين القيمتين مع القاموس إلى الدالة printPicnic()‎ عبر المعاملين leftWidth لعرض العمود الأيسر من الجدول و rightWidth لعرض العمود الأيمن من الجدول. ستطبع الدالة printPicnic()‎ عنوانًا متوسطًا فوق العنصر PICNIC ITEMS، ثم ستمر على عناصر القاموس وتطبع كل زوج من القيم في سطر وتحاذي المفتاح على اليسار وله حاشية متألفة من فواصل، والقيمة على اليمين ولها حاشية متألف من فراغات. بعد تعريف الدالة printPicnic()‎ سنعرف القاموس picnicItems ونستدعي الدالة printPicnic()‎ مرتين، مع تمرير عرض مختلف للعمودين الأيسر والأيمن؛ يكون فيها عرض العمود الأيسر 12 والأيمن 5 في المرة الأولى، ثم 20 و 6 في المرة الثانية. ---PICNIC ITEMS-- sandwiches.. 4 apples...... 12 cups........ 4 cookies..... 8000 -------PICNIC ITEMS------- sandwiches.......... 4 apples.............. 12 cups................ 4 cookies............. 8000 رأينا كيف استفدنا من rjust()‎ و ljust()‎ و center()‎ لطباعة سلاسل نصية منسقة تنسيقًا جميلًا، حتى لو لم نكن نعرف كم سيكون العدد الدقيق لمحارف السلسلة النصية التي سنطبعها. حذف الفراغات عبر strip()‎ و rstrip()‎ و lstrip()‎ نحتاج أحيانًا إلى حذف الفراغات البيضاء (التي هي محارف الفراغ العادي ومسافة الجدولة tab والسطر الجديد newline) من الطرف الأيسر أو الأيمن أو من كلا طرفي السلسلة النصية. سيعيد التابع strip()‎ سلسلةً نصيةً جديدةً لا تحتوي على أي فراغات في بدايتها أو نهايتها، بينما يحذف التابعان lstrip()‎ و rstrip()‎ الفراغات البيضان من الطرف الأيسر أو الأيمن على التوالي: >>> spam = ' Hello, World ' >>> spam.strip() 'Hello, World' >>> spam.lstrip() 'Hello, World ' >>> spam.rstrip() ' Hello, World' يمكننا تمرير وسيط اختياري يحتوي على المحارف التي نريد حذفها بدلًا من الفراغات: >>> spam = 'SpamSpamOliveSpamEggsSpamSpam' >>> spam.strip('ampS') 'OliveSpamEggs' تمرير الوسيط 'ampS' إلى التابع strip()‎ سيؤدي إلى حذف جميع تكرارات المحارف a و m و p و S من بداية ونهاية السلسلة النصية spam. لاحظ أن ترتيب الأحرف في السلسلة النصية الممررة إلى التابع strip()‎ لا يهم، فكتابة strip('ampS')‎ تكافئ كتابة strip('mapS')‎ أو strip('Spam')‎. القيم العددية للأحرف مع الدالتين ord()‎ و chr()‎ تخزن الحواسيب البيانات على هيئة بايتات، وهي سلاسل من البتات بنظام العد الثنائي، وهذا يعني أننا نحتاج إلى تحويل النصوص إلى أرقام لكي نستطيع تخزينها؛ ولهذا يكون لكل محرف character قيمة رقمية مرتبطة به تسمى Unicode code point. فمثلًا القيمة الرقمية 65 تمثل 'A'، والقيمة 52 تمثل '4'، والقيمة 33 تمثل '!'. يمكننا استخدام الدالة ord()‎ للحصول على القيمة الرقمية لسلسلة نصية تحتوي محرفًا واحدًا، والدالة chr()‎ للحصول على المحرف الذي وفرنا قيمته الرقمية: >>> ord('A') 65 >>> ord('4') 52 >>> ord('!') 33 >>> chr(65) 'A' تفيد هذه الدوال حينما نحتاج إلى ترتيب المحارف أو إجراء عمليات رياضية عليها: >>> ord('B') 66 >>> ord('A') < ord('B') True >>> chr(ord('A')) 'A' >>> chr(ord('A') + 1) 'B' هنالك تفاصيل كثيرة عن يونيكود وأرقام المحارف، لكنها خارجة عن سياق هذه السلسلة. نسخ ولصق السلاسل النصية باستخدام الوحدة pyperclip تمتلك الوحدة pyperclip الدالتين copy()‎ و paste()‎ التي يمكنها إرسال واستقبال النص من حافظة نظام التشغيل الذي تستعمله. إذ يسهل عليك إرسال ناتج برنامجك إلى الحافظة أن تلصقه في رسالةٍ بريدية أو في محرر النصوص أو غيره من البرمجيات. تشغيل سكربتات بايثون خارج محرر Mu شغلنا كل سكربتات بايثون التي كتبناها حتى الآن باستخدام الصدفة التفاعلية ومحرر الشيفرات Mu؛ لكننا لسنا بحاجة إلى فتح محرر Mu في كل مرة نريد فيها تنفيذ سكربتات بايثون التي كتبناها. لحسن الحظ هنالك طرائق تسهل علينا تشغيل سكربتات بايثون، لكن هذه الطرائق تختلف من نظام ويندوز إلى MacOS ولينكس، وهي مشروحة في المقال الأول من هذه السلسلة، لذا أنصحك بالانتقال إلى المقال الأول لتعرف كيف تشغل سكربتات بايثون بسهولة على نظامك، وكيف تمرر خيارات سطر الأوامر command line arguments إليها، لاحظ أنك لا تستطيع تمرير خيارات سطر الأوامر باستخدام محرر Mu. الوحدة pyperclip غير مضمنة في بايثون، لذا عليك تثبيتها باتباع التعليمات المذكورة في المقال الأول من السلسلة أيضًا. يمكنك أن تدخل ما يلي في الصدفية التفاعلية بعد تثبيت الوحدة pyperclip: >>> import pyperclip >>> pyperclip.copy('Hello, world!') >>> pyperclip.paste() 'Hello, world!' إذا غيّر أحد البرامج محتويات الحافظة فستعيدها الدالة paste()‎، فانسخ مثلًا عبارةً من المتصفح أو من محرر الشيفرات ثم استدعِ الدالة paste()‎: >>> pyperclip.paste() 'For example, if I copied this sentence to the clipboard and then called paste(), it would look like this:' مشروع: حافظة فيها رسائل تلقائية إذا سبق وأن رددت على عدد كبير من رسائل البريد الإلكتروني بعبارات متشابهة فمن المرجح أنك قد قضيت وقتًا طويلًا في الكتابة على الحاسوب، ومن المرجح أن لديك ملف نصي فيه تلك العبارات ليسهل عليك نسخها ولصقها من الحافظة؛ لكن يمكن لحافظة نظام تشغيلك الاحتفاظ برسالة واحدة فقط في آن واحد وهذا ليس مريحًا في العمل. لنحاول سويةً تسهيل هذه المهمة بكتابة برنامج يخزن عددًا من العبارات. الخطوة 1: تصميم البرنامج وبنى المعطيات نرغب أن نشغل هذا البرنامج من سطر الأوامر مع تمرير وسيط إليه الذي يحتوي على كلمة مفتاحية واحدة مثل «موافق» agree أو «مشغول» busy. وستُنسَخ الرسالة المرتبطة بتلك الكلمة المفتاحية إلى الحافظة لكي يستطيع المستخدم لصقها مباشرةً في الردود، وبهذا يمكن أن نستعمل عبارات طويلة دون الحاجة إلى إعادة كتابتها كل مرة. مشاريع الفصول هذا هو أول «مشروع» في هذه السلسلة ومن الآن فصاعدًا ستجد في كل مقال عددًا من المشاريع التي تستعمل المفاهيم المشروحة في ذاك المقال وتبدأ هذه المشاريع من الصفر حتى الحصول على برنامج يعمل تمامًا، وأنصحك وبشدة أن تطبق أولًا بأول ولا تكتفي بالقراءة فقط. افتح نافذة محرر جديدة واحفظ البرنامج الآتي باسم mclip.py، ستحتاج إلى بدء البرنامج مع الرمز ‎#!‎ (الذي يسمى shebang، راجع المقال الأول من هذه السلسلة)، ثم كتابة تعليق يشرح باختصار ما يفعله البرنامج. لمّا كنّا نريد أن نربط كل جملة نصية بمفتاح، فمن المنطقي أن نخزنها في قاموس، والذي سيكون هو بنية المعطيات الأساسية في برنامجنا: #! python3 # mclip.py - A multi-clipboard program. TEXT = {'agree': """Yes, I agree. That sounds fine to me.""", 'busy': """Sorry, can we do this later this week or next week?""", 'upsell': """Would you consider making this a monthly donation?"""} الخطوة 2: التعامل مع وسائط سطر الأوامر تخزن الوسائط الممررة من سطر الأوامر command line arguments في المتغير sys.argv (راجع المقال الأول من هذه السلسلة لمزيدٍ من المعلومات حول استخدام وسائط سطر الأوامر في نظامك). يجب أن يكون أول عنصر في القائمة sys.argv هو سلسلة نصية تمثل اسم الملف 'mclip.py' أما العنصر الثاني في القائمة فهو قيمة الوسيط الأول الممرر عبر سطر الأوامر. سيمثل الوسيط الأول قيمة مفتاح العبارة التي نريد نسخها، ولأننا نريد إجبار المستخدم على تمرير وسيط في سطر الأوامر، فستعرض رسالةً إلى المستخدم إن نسي توفيره للبرنامج (إذا كانت القائمة sys.argv تحتوي على أقل من قيمتين): #! python3 # mclip.py - A multi-clipboard program. TEXT = {'agree': """Yes, I agree. That sounds fine to me.""", 'busy': """Sorry, can we do this later this week or next week?""", 'upsell': """Would you consider making this a monthly donation?"""} import sys if len(sys.argv) < 2: print('Usage: python mclip.py [keyphrase] - copy phrase text') sys.exit() keyphrase = sys.argv[1] # أول وسيط في سطر الأوامر هو مفتاح العبارة التي نريد نسخها الخطوة 3: نسخ العبارة الصحيحة أصبح لدينا مفتاح العبارة مخزنًا في المتغير keyphrase، لذا ستحتاج إلى التحقق إن كان هذا المفتاح موجودًا في القاموس TEXT، فإن كان موجودًا فسننسخ العبارة المرتبطة بهذا المفتاح إلى الحافظة باستخدام الدالة pyperclip.copy()‎، ولمّا كنّا نستعمل الوحدة pyperclip فسنحتاج إلى استيرادها أيضًا. لاحظ أننا لسنا بحاجة إلى إنشاء المتغير keyphrase، إذ نستطيع استخدام sys.argv[1]‎ في أي مكان استعملنا فيه keyphrase لكن وجود متغير باسم keyphrase سيسهل قراءة الشيفرة كثيرًا: #! python3 # mclip.py - A multi-clipboard program. TEXT = {'agree': """Yes, I agree. That sounds fine to me.""", 'busy': """Sorry, can we do this later this week or next week?""", 'upsell': """Would you consider making this a monthly donation?"""} import sys, pyperclip if len(sys.argv) < 2: print('Usage: py mclip.py [keyphrase] - copy phrase text') sys.exit() keyphrase = sys.argv[1] # first command line arg is the keyphrase if keyphrase in TEXT: pyperclip.copy(TEXT[keyphrase]) print('Text for ' + keyphrase + ' copied to clipboard.') else: print('There is no text for ' + keyphrase) ستبحث الشيفرة في القاموس TEXT عن المفتاح، وإن وجدت فسنحصل على العبارة المرتبطة بذاك المفتاح، ثم ننسخها إلى الحافظة، ونطبع رسالة فيها العبارة المنسوخة، وإن لم نعثر على المفتاح فستظهر رسالة للمستخدم تخبره بعدم وجود هكذا مفتاح. السكربت السابق كامل، ويمكننا اتباع التعليمات الموجودة في المقال الأول لتشغيل البرامج السطرية بسهولة، وأصبح لدينا الآن طريقة سريعة لنسخ الرسائل الطويلة إلى الحافظة بسهولة. لا تنسَ أن تعدل قيمة القاموس TEXT في كل مرة تحتاج فيها إلى إضافة عبارة جديدة. إذا كنت على نظام ويندوز فيمكنك إنشاء ملف دفعي batch file لتشغيل البرنامج باستخدام نافذة تشغيل البرامج Run (بالضغط على Win+R). أدخل ما يلي في محرر النصوص واحفظه باسم mclip.bat في مجلد C:\Windows: @py.exe C:\path_to_file\mclip.py %* @pause يمكننا بعد إنشاء الملف الدفعي أن نشغل برنامجنا بالضغط على Win+R ثم كتابة mclip key_phrase. مشروع: إضافة قائمة منقطة إلى ويكيبيديا حينما تعدل مقالًا في ويكيبيديا، فيمكنك إنشاء قائمة منقطة بوضع كل عنصر من عناصر القائمة في سطر خاص به ووضع نجمة قبله؛ لكن لنقل أن لدينا قائمة طويلة جدًا من العناصر التي تريد تحويلها إلى قائمة منقطة، هنا يمكنك أن تقضي بعض الوقت بإضافة رمز النجمة في بداية كل سطر يدويًا أو تكتب سكربتًا يؤتمت هذه العملية. يأخذ السكربت bulletPointAdder.py النص الموجود في الحافظة ويضيف نجمة وفراغًا إلى بداية كل سطر فيه، ثم يحفظ النص الناتج إلى الحافظة. فمثلًا إذا نسخت النص الآتي من صفحة ويكيبيديا المسماة «قائمة القوائم» List of Lists of Lists إلى الحافظة: Lists of animals Lists of aquarium life Lists of biologists by author abbreviation Lists of cultivars ثم شغلت البرنامج bulletPointAdder.py فستصبح محتويات الحافظة كما يلي: * Lists of animals * Lists of aquarium life * Lists of biologists by author abbreviation * Lists of cultivars ونستطيع الآن لصق النص الناتج إلى ويكيبيديا كقائمة منقطة. الخطوة 1: النسخ واللصق من وإلى الحافظة نريد من برنامج bulletPointAdder.py أن يفعل ما يلي: يأخذ النص الموجود في الحافظة يجري عليه عمليات يحفظ الناتج في الحافظة الخطوة الثانية صعبة بعض الشيء، لكن الخطوات 1 و 3 سهلة جدًا: كل ما علينا فعله هو استدعاء الدالتين pyperclip.copy()‎ و pyperclip.paste()‎. لننشِئ برنامجًا ينفذ الخطوات 1 و 3: #! python3 # bulletPointAdder.py - Adds Wikipedia bullet points to the start # of each line of text on the clipboard. import pyperclip text = pyperclip.paste() # TODO: فصل الأسطر وإضافة رمز النجمة pyperclip.copy(text) التعليق الذي يبدأ بالكلمة TODO هو تذكير لنا أن علينا إكمال هذا الجزء من البرنامج، لذا ستكون الخطوة القادمة هي برمجة هذا الجزء. الخطوة 2: فصل الأسطر وإضافة النجمة ناتج استدعاء pyperclip.paste()‎ يعيد النص الموجود في الحافظة كسلسة نصية واحدة، إذ سيبدو مثال «قائمة القوائم» الذي نسخناه على الشكل الآتي: 'Lists of animals\nLists of aquarium life\nLists of biologists by author abbreviation\nLists of cultivars' يوجد المحرف ‎\n في السلسلة النصية السابقة لعرضها على عدة أسطر حين لصقها من الحافظة، لاحظ أن السلسلة النصية السابقة «متعددة» الأسطر لوجود محرف التهريب ‎\n. ستحتاج إلى إضافة نجمة إلى بداية كل سطر من الأسطر السابقة. يمكنك أن تكتب شيفرة تبحث عن المحرف ‎\n وتضيف نجمةً قبله، أو أن تستعمل التابع split()‎ لإعادة قائمة من السلاسل النصية يمثل كل عنصر فيها سطرًا من السلسلة النصية الأصلية، وبعد ذلك تضيف النجمة قبل كل عنصر: #! python3 # bulletPointAdder.py - Adds Wikipedia bullet points to the start # of each line of text on the clipboard. import pyperclip text = pyperclip.paste() # فصل الأسطر وإضافة النجمة lines = text.split('\n') for i in range(len(lines)): # المرور على جميع عناصر القائمة lines[i] = '* ' + lines[i] # إضافة نجمة وفراغ قبل كل عنصر pyperclip.copy(text) قسمنا النص في مكان السطر الجديد ليمثل كل عنصر في القائمة سطرًا واحدًا، وخزّنا الناتج في المتغير lines، ثم مررنا على عناصر القائمة lines، ولكل عنصر أضفنا نجمة وفراغًا في بداية السطر. أصبحت لدينا الآن قائمة باسم lines فيها عناصر القائمة وقبل كل عنصر رمزُ النجمة. الخطوة 3: دمج الأسطر المعدلة تحتوي القائمة lines على الأسطر المعدلة التي تبدأ بالنجمة، لكن الدالة pyperclip.copy()‎ تتعامل مع السلاسل النصية وليس مع القوائم، لذا نحتاج إلى تحويل القائمة إلى سلسلة نصية، وذلك بجمع عناصر مع بعضها بعضًا عبر التابع join()‎: #! python3 # bulletPointAdder.py - Adds Wikipedia bullet points to the start # of each line of text on the clipboard. import pyperclip text = pyperclip.paste() # فصل الأسطر وإضافة النجمة lines = text.split('\n') for i in range(len(lines)): # المرور على جميع عناصر القائمة lines[i] = '* ' + lines[i] # إضافة نجمة وفراغ قبل كل عنصر text = '\n'.join(lines) pyperclip.copy(text) حين تشغيل البرنامج السابق فسيبدل محتويات الحافظة ويضيف نجمةً قبل كل سطر موجود فيها. أصبح البرنامج جاهزًا للتجربة. حتى لو لم تكن بحاجة إلى أتمتة هذه المهمة البسيطة (فهنالك محرر مرئي لويكيبيديا مثلًا) لكن قد تستفيد من برامج مشابهة لأتمتة عمليات بسيطة لمعالجة النصوص، مثل إزالة الفراغات، أو تحويل حالة الأحرف، أو أيًّا كان غرضك من تعديل محتويات الحافظة. برنامج قصير: اللغة السرية " أين الحلقة السابقة؟ يحتاج المثال إلى إعادة صياغة كليًا" هنالك لغة سرية يلعب الأطفال ويستعملونها اسمها Pig Latin، وهي تحريف للكلمات الإنكليزية بقواعد بسيطة. فلو بدأت الكلمة بحرف متحرك فتضاف الكلمة yay إلى نهايتها، وإذا بدأت الكلمة بحرف ساكن أو تركيب ساكن (مثل ch أو gr) فسينقل ذاك الساكن إلى نهاية البرنامج مع إلحاق ay. لنكتب برنامجًا للتحويل إلى اللغة السرية يطبع شيئًا يشبه المثال الآتي: Enter the English message to translate into Pig Latin: My name is AL SWEIGART and I am 4,000 years old. Ymay amenay isyay ALYAY EIGARTSWAY andyay Iyay amyay 4,000 yearsyay oldyay. يستعمل برنامجنا التوابع التي تعرفنا عليها في هذا المقال احفظ السكربت الآتي في ملف باسم pigLat.py: # English to Pig Latin print('Enter the English message to translate into Pig Latin:') message = input() VOWELS = ('a', 'e', 'i', 'o', 'u', 'y') pigLatin = [] # قائمة الكلمات في اللغة السرية for word in message.split(): # فصل الكلمات التي لا تبدأ بأحرف prefixNonLetters = '' while len(word) > 0 and not word[0].isalpha(): prefixNonLetters += word[0] word = word[1:] if len(word) == 0: pigLatin.append(prefixNonLetters) continue # فصل الكلمات التي لا تنتهي بحرف suffixNonLetters = '' while not word[-1].isalpha(): suffixNonLetters += word[-1] word = word[:-1] # تذكر حالة الأحرف wasUpper = word.isupper() wasTitle = word.istitle() word = word.lower() # تحويل الكلمة إلى الحالة الصغيرة لتحويلها # فصل الأحرف الساكنة في بداية الكلمة prefixConsonants = '' while len(word) > 0 and not word[0] in VOWELS: prefixConsonants += word[0] word = word[1:] # إضافة اللاحقة الخاصة باللغة السرية إلى نهاية الكلمة if prefixConsonants != '': word += prefixConsonants + 'ay' else: word += 'yay' # إعادة الكلمة إلى حالتها الأصلية if wasUpper: word = word.upper() if wasTitle: word = word.title() # إضافة الرموز التي استخرجناها سابقًا pigLatin.append(prefixNonLetters + word + suffixNonLetters) # جمع الكلمات مع بعضها إلى سلسلة نصية print(' '.join(pigLatin)) لنلقِ نظرةً على الشيفرة من بدايتها: # English to Pig Latin print('Enter the English message to translate into Pig Latin:') message = input() VOWELS = ('a', 'e', 'i', 'o', 'u', 'y') طلبنا في البداية من المستخدم أن يدخل نصًا إنكليزيًا لتحويله إلى اللغة السرية، وأنشأنا أيضًا ثابتًا يحتوي على الأحرف الصوتية في الإنكليزية (بالإضافة إلى الحرف y) في صف tuple من السلاسل النصية. أنشأنا بعد ذلك المتغير pigLatin لتخزين الكلمات بعد تحويلها إلى اللغة السرية: pigLatin = [] # قائمة الكلمات في اللغة السرية for word in message.split(): # فصل الكلمات التي لا تبدأ بأحرف prefixNonLetters = '' while len(word) > 0 and not word[0].isalpha(): prefixNonLetters += word[0] word = word[1:] if len(word) == 0: pigLatin.append(prefixNonLetters) continue نريد أن نعالج كل كلمة بمفردها، لذا استعملنا التابع message.split()‎ للحصول على قائمة بالكلمات، فالسلسلة النصية ‎'My name is AL SWEIGART and I am 4,000 years old.'‎ مع التابع split()‎ سيعيد الناتج. ‎['My', 'name', 'is', 'AL', 'SWEIGART', 'and', 'I', 'am', '4,000', 'years', 'old.']‎. سنحتاج إلى الاحتفاظ بأي رموز في بداية ونهاية كل كلمة، فلو كانت لدينا الكلمة 'old.‎' فستحول إلى 'oldyay.‎' بدلًا من 'old.yay'. سنحتفظ بهذه الرموز في متغير باسم prefixNonLetters. # فصل الكلمات التي لا تنتهي بحرف suffixNonLetters = '' while not word[-1].isalpha(): suffixNonLetters += word[-1] word = word[:-1] سنبدأ حلقة تكرار تستدعي التابع isalpha()‎ على أول حرف من الكلمة لتتأكد إن كان علينا إزالة حرف من الكلمة وإضافته إلى نهاية السلسلة النصية prefixNonLetters، وإذا كانت الكلمة كلها تتألف من رموز أو أرقام مثل '4,000' فسنضيفها كما هي إلى القائمة pigLatin وننتقل إلى الكلمة التالية لنحولها إلى اللغة السرية. سنحتفظ بالرموز في نهاية السلسلة النصية word، وهذا يشبه الحلقة السابقة. نرغب أن يتذكر البرنامج حالة الأحرف للكلمة لكي نستطيع استعادتها بعد عملية التحويل: # تذكر حالة الأحرف wasUpper = word.isupper() wasTitle = word.istitle() word = word.lower() # تحويل الكلمة إلى الحالة الصغيرة لتحويلها سنستخدم الكلمة المخزنة في المتغير word بحالتها الصغيرة حتى نهاية دورة حلقة for. لتحويل إحدى الكلمات مثل sweigart إلى eigart-sway فسنتحتاج إلى إزالة جميع الأحرف الساكنة من بداية الكلمة word: # فصل الأحرف الساكنة في بداية الكلمة prefixConsonants = '' while len(word) > 0 and not word[0] in VOWELS: prefixConsonants += word[0] word = word[1:] استخدمنا حلقة تكرار تشبه الحلقة التي أزالت الرموز من بداية الكلمة word، لكننا الآن نزيد الأحرف الساكنة ونخزنها في متغير باسم prefixConsonants. إذا لم يبقَ أي حرف ساكن في بداية الكلمة، فهذا يعني أنها أصبحت كلها في المتغير prefixConsonants، ويمكننا الآن جمع قيمة ذاك المتغير مع السلسلة النصية 'ay' في نهاية المتغير word. أما خلاف ذلك فهذا يعني أن word تبدأ بحرف صوتي، وسنحتاج إلى إضافة 'yay': # إضافة اللاحقة الخاصة باللغة السرية إلى نهاية الكلمة if prefixConsonants != '': word += prefixConsonants + 'ay' else: word += 'yay' تذكر أننا جعلنا الكلمة بحالة الأحرف الصغيرة word = word.lower()‎. أما إذا كانت القيمة word بحالة الأحرف الكبيرة أو نسق العناوين Title case فعلينا تحويلها إلى حالتها الأصلية: # إعادة الكلمة إلى حالتها الأصلية if wasUpper: word = word.upper() if wasTitle: word = word.title() وفي نهاية دورة حلقة for سنضيف الكلمة مع أي رموز سابقة أو لاحقة إلى القائمة pigLatin: # إضافة الرموز التي استخرجناها سابقًا pigLatin.append(prefixNonLetters + word + suffixNonLetters) # جمع الكلمات مع بعضها إلى سلسلة نصية print(' '.join(pigLatin)) بعد نهاية حلقة التكرار فسنجمع عناصر القائمة pigLatin مع بعضها باستخدام التابع join()‎، وستمرر سلسلة نصية واحدة إلى الدالة print()‎ لطباعة الجملة السرية. الخلاصة النصوص هي أكثر أنواع البيانات شيوعًا، وتأتي بايثون مع مجموعة من توابع معالجة النصوص المفيدة. ستستخدم الفهرسة والتقسيم وتوابع السلاسل النصية في كل برنامج بايثون تكتبه تقريبًا. صحيحٌ أن البرامج التي تكتبها الآن لا تبدو معقدة جدًا، فهي لا تحتوي على واجهات مستخدم رسومية فيها صور ونصوص ملونة، فكل ما نستعمله هو الدالة print()‎ لطباعة النصوص و input()‎ لقبول مدخلات المستخدم؛ لكن يستطيع المستخدم إدخال مجموعة كبيرة من النصوص عبر نسخها إلى الحافظة، مما يفيد كثيرًا في معالجة كميات كبيرة من النصوص. وصحيحٌ أن هذه البرامج لا تملك واجهات رسومية جميلة لكنها تفعل الكثير بجهدٍ قليل. طريقة أخرى لمعالجة كمية كبيرة من النصوص هي كتابة الملفات وقراءتها من نظام الملفات المحلي مباشرةً، وسنتعلم كيفية فعل ذلك في مقال لاحق. لقد شرحنا حتى الآن المفاهيم الأساسية في برمجة بايثون! ستتعلم مفاهيم جديدة في بقية هذه السلسلة، لكن يفترض أنك تعرف ما يكيفك لكتابة برامج مفيدة تستطيع عبرها أتمتة المهام. قد تظن أنك لا تمتلك المعرفة الكافية في بايثون لتنزيل صفحات الويب أو تحديث جداول البيانات أو إرسال الرسائل البريدية، لكن هنا يأتي دور الوحدات الخارجية في بايثون، التي توفر لك ما تحتاج إليه لفعل كل ذلك وأكثر منه، والتي سنتعلمها سويةً في المقالات القادمة. مشاريع تدريبية لكي تتدرب، اكتب برامج لتنفيذ المهام الآتية. طابع جداول اكتب دالةً اسمها printTable()‎ تقبل قائمةً فيها قوائم تحتوي على سلاسل نصية، وتعرضها في جدول منسق تكون فيه محاذاة الأعمدة إلى اليمين. افترض أن لكل القوائم الداخلية العدد نفسه من السلاسل النصية، فمثلًا: tableData = [['apples', 'oranges', 'cherries', 'banana'], ['Alice', 'Bob', 'Carol', 'David'], ['dogs', 'cats', 'moose', 'goose']] يجب أن تطبع الدالة printTable()‎ ما يلي: apples Alice dogs oranges Bob cats cherries Carol moose banana David goose تلميح: يجب أن تبحث عن أطول سلسلة نصية في كل قائمة داخلية، كي يتسع العمود لجميع السلاسل النصية. يمكنك تخزين العرض الأقصى لكل عمود في قائمة من الأرقام. يمكن أن تبدأ الدالة printTable()‎ بالسطر colWidths = [0] * len(tableData)‎ الذي سينشِئ قائمةً تحتوي على الرقم 0 يساوي عدد القوائم الداخلية الموجودة في القائمة tableData، وبالتالي ستخزن عرض أطول سلسلة نصية في tableData[0] في العنصر colWidths[0]‎، وعرض أطول سلسلة نصية في القائمة tableData[1] في العنصر colWidths[1] وهلم جرًا… ثم يمكنك الحصول على أكبر قيمة في القائمة colWidths لتعرف القيمة التي ستمررها كعرض إلى التابع rjust()‎. ترجمة -بتصرف- للفصل Manipulating Strings من كتاب Automate the Boring Stuff with Python. اقرأ أيضًا المقال السابق: القواميس وهيكلة البيانات في بايثون python القوائم Lists في لغة بايثون تهيئة بيئة العمل في بايثون Python
  14. عليك تفقد ما هي دقة الشاشة لديك بالبحث عن اسم الشاشة على جوجل بمعنى موديل الشاشة. وعامة ذلك المقاس ستجد أن دقته ما بين 4K و 1080P. لكن ذلك لا بعني لا تستيطع تشغيل فيديو بجودة أقل مثل 720P لكن سيظهر بصورة غير جيدة نسبيا على الشاشة، فالدقة الأفضل 1080P لتوازن ما بين حجم الفيديو المناسب والدقة الجيدة. لأن 4K يتطلب مساحة كبيرة وقوة معالجة أقوى أيضا.
  15. بخصوص إضافة الدورات هنا ، فالأمر يعتمد على عدّة عوامل منها مدى الإحتياج لها والطلب عليها وهل محتوى الدورة مناسب لسوق العمل أم الطلب عليه ضعيف وهكذا، لذا الأمر راجع لإدارةالأكاديمية في تلك النقطة. ويمكنك قراءة الأجوبة التالية حيث ستضع لك خارطة طريق لمجال الأمن السيراني . وأيضا سأوصل إقتراحك إلى إدارة الأكاديمية لتوفير هذه الدورة.
  16. المقاسات المناسبة بالبكسل لشاشة 55 بوصة: - الدقة العادية (HD): 1920 × 1080 بكسل - الدقة العالية (Full HD): 1920 × 1080 بكسل - الدقة فائقة الوضوح (Ultra HD 4K): 3840 × 2160 بكسل حيث أن الدقة العادية والدقة العالية تعتبران مناسبتين لشاشة 55 بوصة، بينما الدقة فائقة الوضوح 4K هي الأفضل لهذا المقاس لتوفير أعلى جودة للصورة. يمكن حساب المقاسات بالبكسل لأي شاشة بمعرفة نسبة أبعادها، حيث أن معظم الشاشات الحديثة تأتي بنسبة أبعاد 16:9 و الشاشة 55 بوصة تأتي بنسبة 16:9.
  17. لدية شاشة مقاس ٥٥ بوصة واريد تصميم مقطع فيديو لكي اعرضه عليها ولا أعلم كم المقاسات المناسبة ماهو المقاس المناسب لها بالبكسل
  18. اغلب الدورات متوفره ما عدا الامن السيبراني شو السبب؟؟؟
  19. استخدم الأمر التالي لتثبيت retroarch: sudo add-apt-repository ppa:libretro/stable && sudo apt-get update && sudo apt-get install retroarch
  20. ابي تكون برمج تشتغلى على لينكس منت منصه Batocera كى برنمج يشتغل
  21. ما هو النظام الذي تريد تثبيت المنصة عليه؟ لديك مثلاً retroarch تستطيع تحميلها وتثبيتها على الويندوز مباشرًة. وتتوفر منها نسخة للينكس أيضًا.
  22. الدورات بالأكاديمية مصممة لتبدأ معك من نقطة البداية أي لا تحتاج إلى خبرة برمجية بلغات أخرى للبدء بدورة معينة. لذا تستطيع أن تبدأ بأي دورة تريد لا مشكلة، لكن عليك تحديد المجال الذي تريد التخصص به والعمل به في سوق العمل وليس إختيار عشوائي. في دورة PHP لا تحتاج إلى لغة برمجية إضافية، لكن ستحتاج إلى لغتي HTML و CSS وهما أساسيتان لتطوير الويب، وبعدما تصل لمستوى متقدم نسبيًا تستطيع تعلم لغة جافاسكريبت لكونها لغة أساسية للويب أيضًا. وتعلم لغة برمجية أخرى يصبح أسهل بمراحل بعد تعلم اللغة الأولى والتعمق بها. وبخصوص بايثون، فستجد في الدورة أنه يوجد مسارات مخصصة لتطوير الويب من خلال إطاري Flask و Django. لكن كنصيحة إذا أردت التخصص في مجال الويب، عليك إذن تعلم PHP وليس بايثون فهي ليست من ضمن اللغات الأفضل في ذلك المجال.
  23. ابيه صيغه ايزو على تسعدني في تخصيص RetroArch وتنزيل محكي بيلستشان 3 وشكران لكى
  24. قمت بإرفاق رابط التحميل أرجو الضغط على اسم التوزيعة وسيتم تحويلك لصفحة التحميل.
  1. عرض المزيد
×
×
  • أضف...