Hello our valued visitor, We present you the best web solutions and high quality graphic designs with a lot of features. just login to your account and enjoy ...
Hello our valued visitor, We present you the best web solutions and high quality graphic designs with a lot of features. just login to your account and enjoy ...
رقم الخبر | عنوان الخبر | التفاصيل |
---|---|---|
72,568 | ما الفرق بين التنسيق والأتمتة؟ |
لفترة طويلة، بدا أن الأتمتة automation هي جلّ اهتمام أي مدير نظم لكن يبدو مؤخرًا أن التوجه يتغير من الأتمتة إلى التنسيق orchestration، مما أثار تساؤل العديد من مدراء النظم المتحيرين: "ما الفرق بينهما؟". يكمن الفارق الرئيسي بين الأتمتة والتنسيق في الغاية من كل منهما والأدوات المستخدمة لكل منهما. تقنيًا يمكن أن نعد الأتمتة فرعًا من التنسيق. فبينما يشير التنسيق إلى العديد من الأجزاء المتحركة، تشير الأتمتة عادةً إلى مهمة واحدة أو عدد قليل من المهمات المرتبطة ببعضها ارتباطًا وثيقًا. يعمل التنسيق على مستوى أعلى ويتوقع منه أن يبني قراراته حسب الحالات والمتطلبات المتغيرة. مع ذلك، لا يجب أن يؤخذ هذا المنظور حرفيًا لأن لكل من المصطلحين - الأتمتة والتنسيق- تأثيرات عند استخدامهما. تتطابق نتائج كل منهما من الناحية الوظيفية: تنفَّذ الأمور دون تدخلك المباشر، لكن تختلف طريقة تحقيقك هذه النتيجة والأدوات التي تستخدمها لتحقيقها، أو على الأقل تختلف طريقة استخدام المصطلحين حسب الأدوات التي تستخدمها. فمثلًا، تتضمن الأتمتة عادةً كتابة النصوص البرمجية scripting، وغالبًا تكون بلغة باش Bash أو بايثون Python أو لغة مشابهة، وتدل غالبًا على جدولة تنفيذ شيء ما إما بوقت محدد أو عند وقوع حدث محدد. أما التنسيق يبدأ غالبًا ببرنامج مخصص لهذا الغرض لتنفيذ مجموعة مهام قد تحدث بصورة غير منتظمة، أو عند الطلب أو نتيجة وقوع أي عدد من الأحداث المحفزة، وقد تعتمد النتائج الدقيقة على مجموعة متنوعة من الحالات. صنع القرار والتنسيق في تكنولوجيا المعلوماتتدل الأتمتة على ابتكار مدير النظم لنظام يجعل الحاسوب ينفذ شيئًا كان ينفَّذ يدويًا. في الأتمتة يكون مدير النظم قد اتخذ أصلًا معظم القرارات حول ما يجب تنفيذه، فلا يجب على الحاسوب إلا أن ينفذ "وصفة" recipe المهمات. يدل التنسيق أن مدير النظم أعد نظامًا لينفذ شيئًا ما من تلقاء نفسه بناءً على مجموعة قواعد rules ومعامِلات parameters وعمليات رصد observations. في التنسيق يعلم مدير النظم النتيجة النهائية المرجوة لكن يترك أمر اتخاذ قرار كيفية الوصول إلى هذه النتيجة للحاسوب. لنتفكر في Ansible وباش؛ إن باش هي لغة الصدفة shell وكتابة النصوص البرمجية، يستخدمها مدراء النظم لتنفيذ جميع الأمور التي يقومون بها تقريبًا خلال أي يوم عمل. تعد الأتمتة بواسطة باش واضحة: بدل أن تكتب الأوامر في جلسة session تفاعلية، تكتبها ضمن مستند نصي وتحفظ هذا الملف كملف برمجي للصدفة shell script. تشغل باش هذا الملف منفذةً الأمر تلو الآخر. وهي تتيح مجالًا لصنع القرار المشروط، لكنه عادةً بسيط لا يتجاوز في تعقيده تعليمة if-then، اللتان يجب أن تكتبا ضمن نص برمجي. من ناحية أخرى، تستخدم Ansible تعليمات أو أدلة أنظمة النشر playbooks يوضح فيها مدير النظم حالة الحاسوب المنشودة، إذ تدرج الشروط التي يجب أن تتحقق قبل أن تعد Ansible العمل منفذًا. عندما تعمل Ansible تتخذ إجراءً حسب الحالة الحالية للحاسوب مقارنةً بالحالة المنشودة، بناءً على نظام تشغيل الحاسوب وغير ذلك. لا يتضمن نظام النشر playbook أوامر محددة، بل يترك هذه القرارات إلى Ansible. طبعًا من الواضح أنه يشار إلى Ansible بأنها أداة أتمتة وليست أداة تنسيق. قد يكون الفارق طفيفًا، ولا بد من تداخل المصطلحين. التنسيق والحوسبة السحابيةلنفترض أنك تريد تحويل نوع ملف يرفعه المستخدمون دوريًا إلى خادمك. سيكون الحل اليدوي أن تتحقق من وجود محتويات مرفوعة على المجلد كل صباح، ثم تفتح الملف، ثم تحفظه بتنسيق مختلف. هذا حل بطيء وغير فعال وغالبًا لن تنفذه إلا مرةً كل 24 ساعةً لأنك شخص مشغول. تستطيع أتمتة هذه المهمة. إذا كنت ستفعل ذلك، قد تكتب نصًا برمجيًا بلغة PHP أو Node.js يرصد الملفات عندما ترفَع، وينفذ التحويل ويرسل تنبيهًا أو يضيف مدخلًا في سجل log entry لتأكيد نجاح عملية التحويل. يمكنك تطوير النص البرمجي مع الوقت ليتيح للمستخدمين التفاعل مع عملية الرفع والتحويل. أما إذا أردت اتباع أسلوب التنسيق في هذه العملية، قد تبدأ ببرنامج، سيكون برنامجك المخصص مصممًا لقبول الملفات وتحويلها. قد تشغل هذا البرنامج على حاوية container موجودة على سحابتك cloud، وتستطيع باستخدام OpenShift إطلاق نسخًا إضافيةً من برنامجك عندما تتجاوز حركة البيانات traffic أو الحِمل عتبةً محددةً. تعلم الأتمتة والتنسيقلا يوجد تخصص واحد فقط للأتمتة أو التنسيق، فهما ممارستان مجال استخدامهما واسع ومطبَّقتان على العديد من المهام المختلفة في قطاعات مختلفة. لكن تتمثل أول خطوة لتعلمهما في أن تتقن التكنولوجيا التي تنوي أتمتتها وتنسيقها. فمن الصعب تنسيق (تنسيقًا سليمًا) عملية توسع سلسلة من خوادم الويب إذا لم تكن تفهم كيف يعمل خادم الويب، أو ما هي المنافذ التي يجب أن تفتحها أو تغلقها، أو ما هو المنفذ. عمليًا ربما لن تكون الشخص الذي يفتح المنافذ أو يضبط إعدادات الخادم، وقد تسند إليك مهمة إدارة OpenShift دون أن تعرف ما هو محتوى الحاوية أو تهتم به أصلًا. لكن المفاهيم الأساسية مهمة لأنها تطبَّق على نطاق واسع على سهولة الاستخدام وعملية استكشاف الأخطاء وإصلاحها وعلى الأمان. كما عليك أن تألَف استخدام أكثر الأدوات الشائعة في عالم التنسيق والأتمتة، تعلم مبادئ لغة Bash، وابدأ بالعمل على Git وصمم بعض خطافات Git، وتعلم مبادئ لغة بايثون، واعتد العمل على YAML و Ansible، وجرب العمل على Minikube و OKD و OpenShift. يعد التنسيق والأتمتة مهارتين مهمتين، إذ تزيدان كفاءة عملك وتعدان إضافتين نافعتين إلى فريقك. استثمر فيهما اليوم وضاعف العمل الذي تنجزه في المستقبل. ترجمة -وبتصرف- للمقال What's the difference between orchestration and automation? لصاحبه Seth Kenlon. اقرأ أيضًا
|
72,567 | كيفية إصلاح الخطأ 405 Method Not Allowed في ووردبريس |
لا يُقدم الخطأ 405 الكثير من المعلومات لتعلم من أين يجب عليك البحث وحل المشكلة، ويظهر هذا الخطأ عندما يرفض الخادم طلب HTTP، وتوجد عدة أسباب لهذا الأمر، ولذا يتطلب إصلاح الخطأ 405 عدة خطوات لاكتشاف المشكلة وإصلاحها. سوف نشرح بالتفصيل ما هو الخطأ 405 وما أسبابه، ثم سنتحدث عن 5 طرق لإصلاح هذا الخطأ ضمن موقع ووردبريس. ما هو الخطأ 405يظهر الخطأ 405 أو 405 Not Allowed عندما تحاول الوصول لموقع ويرفض الخادم طلبك، وعلى عكس بقية أخطاء HTTP، يعني الخطأ 405 أن الخادم يعمل ويستطيع التعرف على طلبك، لكنه يرفض هذا الطلب لسبب ما. تختلف رسالة الخطأ التي سوف تظهر لك حسب المتصفح المُستخدَم، واحتمالات هذه الرسالة هي:
يرتبط سبب رموز الخطأ 4XX بمشاكل من جهة العميل غالبًا، ويُمكن أن يكون السبب هو الخادم كذلك، وبما أن رمز الخطأ لا يُفصح عن الكثير من المعلومات، فيتوجب عليك تجريب عدة حلول مُمكنة. 5 طرق ممكنة لإصلاح الخطأ 405 Method Not Allowed في ووردبريسيُنصح بأخذ نسخة احتياطية كاملة عن الموقع، لأنك سوف تُجري بعض التعديلات على إعدادات الموقع في الخطوات التالية، وهذه قاعدة عامة يجب عليك اتباعها قبل البدء بإصلاح أي مشكلة ضمن الموقع، وذلك لتكون على بر الأمان في حال سارت الأمور على عكس المتوقع. تحقق من الرابط الذي تحاول الوصول لهيُعَد ارتكاب خطأ في كتابة الرابط من أكثر المشاكل التي يقع فيها الزوار والتي تُسبب الخطأ 405، وبسبب هذا الخطأ يُمكن أن يكون الرابط الذي تحاول دخوله غير مُتاح للعامة، لذلك سوف يُجيب الخادم بالخطأ 405 وعدم إمكانية وصولك لهذا الرابط، ويستغرق الأمر منك دقيقةً واحدةً للتحقق من الرابط الذي تحاول زيارته، وبما أنك مالك الموقع، فيجب أن تتمكن من معرفة إن كان الرابط الذي تستخدمه خاطئًا أم لا، فإن كان صحيحًا، فعليك الانتقال للخطوة التالية. استعد نسخة احتياطية حديثة للموقعيُمكن أن يُسبب تحديث ووردبريس أو الإضافات أو القالب مشاكل توافقيةً تؤدي لظهور أخطاء HTTP، ولا يعني هذا أن تحديث أجزاء موقعك أمر سيئ، بل على العكس تمامًا، فهو أمر نحثك عليه، لكن تتضمن عملية التحديث احتمالية ظهور هذه المشاكل، ويُمكن أن يظهر الخطأ 405 بعض الأحيان بسبب مشاكل توافقية ناتجة عن تحديث أحد عناصر موقعك، وفي هذه الحالة سوف تُحل المشكلة من خلال استعادة نسخة احتياطية حديثة لموقعك. تحقق مما إذا كان الخطأ قد اختفى بعد استعادة أقرب نسخة احتياطية، فإن استمر بالظهور، فتستطيع الجزم أن التحديثات ليست هي سبب هذا الخطأ وعليك الانتقال للخطوة التالية، لكن إن حُلت المشكلة، فعليك الانتباه إلى أن إبقاء عناصر الموقع بدون تحديث ليس تصرفًا ذكيًا، حيث يعرّض هذا موقعك لمخاطر أخرى، لذلك ألقِ نظرةً على العناصر التي تحتاج تحديثًا، وحدِّث كل عنصر على حدة إلى أن يعود الخطأ للظهور، وذلك لتتمكن من حصر السبب في مكان واحد سواءً كان إضافةً أو قالبًا، وتستطيع الاتصال بمطور القالب أو الإضافة أو ربما استبدالها بخيار آخر. تعطيل الإضافات والقالبيُمكن أن يكون سبب الخطأ هو إحدى الإضافات المُستخدمة أو القالب المُستخدم حتى لو لم تتلقَّ أي تحديث مؤخرًا، ولاكتشاف أي من عناصر الموقع هذه هو السبب، يجب علينا تعطيلها مؤقتًا، وتوجد طريقتان لتعطيل إضافات وقالب ووردبريس؛ الأولى من خلال لوحة التحكم والتوجه إلى "إضافات منصبة" ضمن قسم "إضافات"، أما الثانية فمن خلال "قوالب" الموجودة ضمن قسم "المظهر"، ثم استخدام خيار "تعطيل". عطّل إضافةً أو قالبًا في كل مرة، وتحقق من الموقع إن عاد للعمل، حيث يُشير اختفاء الخطأ إلى أنّ القالب أو الإضافة التي عُطلت قبل عودة الموقع للعمل هي سبب ظهور الخطأ، وتعمل هذه الطريقة فقط في حال كنت تستطيع الولوج للوحة تحكم ووردبريس؛ أما إن كنت لا تستطيع، فعليك الدخول للاستضافة من خلال برنامج FTP مثل FileZilla. توجه إلى مجلد /wp-content/plugins حالما تتصل بالموقع لتجد مجلدًا خاصًا بكل إضافة مُثبتة على الموقع. تستطيع اختيار أي مجلد من المجلدات الموجودة وتغيير اسمه ليُسبب هذا تعطيل الإضافة، وهكذا تستطيع اختبار كل إضافة على حدة إلى أن يختفي الخطأ 405. تستطيع أيضًا تعطيل القالب النشط بنفس الطريقة، لكن من خلال المجلد /wp-content/themes. يوجد لديك خياران عند تحديد سبب المشكلة سواءً كان إضافةً أم قالبًا، وهما استبدال هذا القالب أو هذه الإضافة، أو التواصل مع المطور لمساعدتك على حل المشكلة. تحقق من ملف htaccess. وقواعد Rewriteتستطيع إضافة قواعد إعادة التوجيه لخادمك من خلال تعديل ملف htaccess. وفي حال لم تكن الشخص الوحيد الذي يمتلك الوصول لهذا الملف، فمن المحتمل أن يكون شخص آخر قد أضاف قاعدة rewrite التي سببت ظهور الخطأ 405، ويُمكن التحقق من سبب المشكلة باستخدام اتصال FTP، والتوجه للمسار الرئيسي لتثبيت ووردبريس، ثم الضغط على ملف htaccess. بزر الفأرة الأيمن واختيار View/Edit لفتحه. تستطيع إلقاء نظرة على محتوى ملف htaccess. الافتراضي في ووردبريس من خلال زيارة توثيق ووردبريس، حيث يتضمن هذا الملف عدة سطور برمجية تبدأ بعبارة RewriteCond لكن عليك البحث عن سطر يتضمن الرقم 405، فإذا رأيت قاعدةً تتضمن شيفرةً مُشابهةً لما يلي فتستطيع تغييرها أو حذفها. [R=405, L]انتبه إلى أن تعديل ملف htaccess. يُمكن أن يؤدي لأخطاء مُشابهة للخطأ الذي تحاول إصلاحه الآن، لذلك إن كنت غير واثق مما تفعله، فعليك طلب المساعدة من مطور أو شخص ذي خبرة. احفظ التغييرات التي أجريتها على الملف، ثم حاول الدخول للموقع مرةً ثانيةً لترى هل اختفت رسالة الخطأ أم لا. تفعيل نمط إصلاح الأخطاء والتحقق من سجل أخطاء ووردبريسإن لم تعمل أي من الطرق السابقة، فعليك البحث بعمق أكبر ضمن سجلات أخطاء ووردبريس، وذلك لمعرفة ما يحصل ضمن موقعك. وتستطيع تفعيل نمط إصلاح الأخطاء ليولد ووردبريس سجلات تستطيع التحقق منها في أي وقت. عليك إعادة تنفيذ الخطوات التي تظهر من خلالها رسالة الخطأ قبل التحقق من سجل أخطاء ووردبريس، وذلك ليكون هذا الخطأ بين آخر الأخطاء المُسجلة ضمن الملف، حيث يُسهل هذا عليك العثور عليه بسرعة، ومعرفة سبب الخطأ. الخلاصةتستغرق عملية إصلاح الخطأ 405 بعض الوقت، حيث لا يوفر أي معلومات عن سبب ظهوره، لكن إن كنت تستخدم ووردبريس، فتوجد بعض الحلول الشائعة التي تستطيع تجريبها لإصلاح هذا الخطأ، والتي تتضمن حلولًا من كلا الطرفين، الزوار والخادم. يجب عليك اتباع المنهجية التالية عند ظهور الخطأ 405 في ووردبريس:
ترجمة -وبتصرّف- للمقال How to Fix the 405 Method Not Allowed Error in WordPress لصاحبه Will Morris. اقرأ أيضًا |
72,529 | هل يحتل البشر قمة السلسلة الغذائية بين باقي الكائنات؟ | تحدثت دراسات سابقة عن أن الإنسان أصبح هو المفترس الأكبر في كوكبنا وأنه يحتل قمة السلسلة الغذائية. لكن هل هذا التوصيف دقيق؟ وما الفارق بين الإنسان والقرش الأبيض الكبير والأسود والذئاب الرمادية؟ |
72,518 | تويتر تختبر آلية مختلفة للإبلاغ عن التغريدات وخيارات لتحديد المحتوى الحساس قبل نشره |
تعمل منصة تويتر على توفير طريقة جديدة لإجراءات الإبلاغ عن التغريدات الضارة أو التي تقدم محتوى غير صحي على المنصة، حيث بدأت في اختبار هذه الطريقة لبعض المستخدمين. ستشمل الطريقة الجديدة 4 خطوات من الخيارات، بحيث يتم تحديد الشخص الذي يمكن أن تكون التغريدة مضرة أو مهاجمة له، ومن ثم في ثاني مرحلة اختيار نوع التغريدة إذا كانت تهاجم شخصًا مباشرة أو تحوي أي شيء يتعلق بزيادة الكراهية بين المستخدمين، أو إذا كانت تضم محتوى وهمي، أو محتوى ضار آخر، أو حتى محتوى حساس لا يتلاءم مع المنصة. بعدها سينتقل المستخدم لخطوة جديدة لبحث كيف يقوم الشخص المبلغ عنه بهذه الأشياء غير الصحية أو الضارة، سواء كان يهاجم مباشرة أو يتمنى السوء لشخص أو مجموعة ما، أو يقلل من الناس، أو ينشر الخوف بين بعض المستخدمين، أو حتى تحريض البعض على نشر العنف والكراهية، وغيرها من الخيارات. بعد ذلك، سيصل المستخدم للمرحلة الرابعة والأخيرة لمراجعة الإبلاغ وتأكيد العملية، حيث يظهر فيها جميع خيارات المستخدم ومثال على التغريدات من هذا النوع للتأكد أنها تتشابه مع هدف الإبلاغ من عدمه. ستساعد هذه الخطوة تويتر في تحسين طريقة الإبلاغ عن التغريدة وتحسين بيئة الاستخدام حسب وصفها، وهو أمر تحتاج إليه بشدة خاصة مع المشاكل الكثيرة التي تظهر على السطح بين المستخدمين وتتعلق بموضوعات حساسة، كذلك يمكن لهذه الطريقة تقليل البلاغات الخاطئة حول الأشخاص، حيث تنتشر بين العديد من المستخدمين ظاهرة للإبلاغ عن البعض بمجرد اختلاف الرأي دون حتى طرح أي محتوى ضار أو انتهاك سياسة تويتر. طريقة جديدة لتحديد المحتوى الحساس على تويتر قبل نشرهعلى الجهة الأخرى، بدأت تويتر اختبار طريقة جديدة لنشر المحتوى الحساس من خلال تحذير المتابعين من نوعية هذا المحتوى قبل نشره، ما يعني أن هناك تحذيرات ستظهر عند وجود الصور أو الفيديو على الخط الزمني على الصور والفيديو، وفي حال أراد المتابع الإكمال سيتوجب عليه الضغط على أيقونة عرض المحتوى لرؤيته. وستكون طريقة ظهور التغريدات مع الصور ومقاطع الفيديو الحساسة أشبه بطريقة ظهور المحتوى الحساس على انستجرام أو فيس بوك إلى حد ما. People use Twitter to discuss what’s happening in the world, which sometimes means sharing unsettling or sensitive content. We’re testing an option for some of you to add one-time warnings to photos and videos you Tweet out, to help those who might want the warning. pic.twitter.com/LCUA5QCoOV — Twitter Safety (@TwitterSafety) December 7, 2021المصدر: التدوينة تويتر تختبر آلية مختلفة للإبلاغ عن التغريدات وخيارات لتحديد المحتوى الحساس قبل نشره ظهرت أولاً على عالم التقنية. |
72,517 | أمازون تطرح أليكسا بخيار اللغة العربية بلهجة خليجية وتطلق أجهزة إيكو في السعودية |
أعلنت شركة أمازون عن إطلاق مساعدها الصوتي، أليكسا ، في المملكة العربية السعودية وطرح عدد من أجهزة إيكو معها لتقدّم للعملاء تجربة محلية جديدة باللغة العربية بلهجة الخليجية وخصائص جديدة صممت خصيصًا للعملاء السعوديين وعمليات دمج جديدة مع الأجهزة المتوافقة في المنزل الذكي مع أكثر من 200 مهارة مختلفة. سيتيح المساعد أليكسا بالإجابة على الأسئلة، تشغيل الموسيقى، قراءة الأخبار، وتلاوة القرآن بصوت القارئ المفضل لديك، وضبط المؤقتات والمنبهات، وإعطاء النتائج الرياضية، والتحكّم في إنارة المنزل أو تكييف الهواء في المنزل والكثير غيرها. ومع التحكم الصوتي بعيد المدى في أجهزة إيكو، يمكن القيام بكل ذلك في جميع أنحاء الغرفة. ستقدم أليكسا في المملكة العربية تجربة محلية، بما في ذلك صوت يتحدث بلهجة عربية مع أكثر من 200 مهارة من مهارات Alexa Skills ابتكرها مطورين سعوديين وعلامات اقليمية، بما في ذلك أنغامي والعربية و MBC وسبق وكريم وفتافيت والبيك وغيرها. وبهذا الشأن، صرح توم تايلور ، نائب رئيس الأول، أمازون أليكسا: “نحن متحمسون للغاية لطرح أليكسا ومجموعة أجهزة Echo في المملكة العربية السعودية. فقد عمل الفريق بجهد لابتكار تجربة جديدة بالكامل مصممة بحرفية لعملائنا في المملكة العربية السعودية، بشكل يعكس تاريخ المملكة وتقاليدها وثقافتها العريقة، مع الاحتفاء بكينونة اللغة العربية.” بدوره، علق نواف الهوشان، نائب الوزير للتقنية بوزارة الاتصالات وتقنية المعلومات في المملكة العربية السعودية بقوله: ” تبني المملكة العربية السعودية بنية تحتية بمعايير دولية من شأنها أن تمهد الطريق لجعلها دولة رقمية رائدة وتكون من بين أفضل 20 اقتصادًا رقميًا ومركزًا للاستثمارات التقنية في المنطقة. اعتبارًا من اليوم ، ستساهم أمازون أليكسا في تحقيق أهدافنا وتساعد في دفع تبني إنترنت الأشياء والذكاء الاصطناعي في المملكة.” فيما صرّح إيلي حبيب، الشريك المؤسس والرئيس التنفيذي في أنغامي: “بصفتنا المنصّة الموسيقية الرائدة في المنطقة، يسعدنا أن نتعاون مع أليكسا لمنح عملائنا الوصول إلى ملايين الأغاني والبودكاست العالمية والعربية. وباستخدام صوتهم فقط، يمكن للعملاء أن يطلبوا من أليكسا تشغيل أي أغنية من أكبر كتالوج موسيقي في المنطقة باللغة العربية، وهو أمرٌ يضيف بعدًا جديدًا إلى تجربة عملائنا.” أمازون إيكو Echo – صوت دولبي ستيريو ومركز المنزل الذكي المدمج من Zigbeeإيكون Echo هو جهاز يتم التحكم فيه عن طريق الصوت ويغني عن استخدام اليدين مع سماعة مدمجة، وهو يجمع الصوت المدمج من Zigbee. يحتوي الجهاز على مضخم صوت قياس 3 بوصات وسماعة مزدوجة ومعالجة بتقنية دولبي، وهو بالتالي يوفر ارتفاعات واضحة، ووسطًا ديناميكيًا، وجهيرًا عميقًا للحصول على صوت غني يتكيف تلقائيًا مع أي غرفة عبر استشعار الأصوات في المكان الذي تجلس فيه بحسب الشركة. أجهزة أمازون إيكو Echo Dot وEcho Dot مع ساعة (الجيل الرابع)– تصميم مدمج وتجربة صوتية مع أليسكايُعد جهاز Echo Dot السماعة الذكية الأكثر شهرة من أجهزة إيكو حول العالم، وهو يتميز بتصميم كروي مدمج ويوفر تجربة صوتية متكاملة مع سماعة أمامية قوية قياس 1.6 بوصة. ويضم كل جهاز Echo مع ساعة المزايا ذاتها التي يضمها Echo Dot، فضلًا على شاشة LED بسيطة لكي تلقي نظرة على الوقت والحرارة والمؤقتات والمنبهات. Echo Show 5 – شاشة عرض ذكية مع أليكساEcho Show 5 مجهّز بكاميرا عالية الدقة بقدرة 2 ميجابكسل. يمكنك تخصيص خاصية routine لتستيقظ على تشغيل الأضواء ومنبه يُشغل أغنيتك المفضلة. ويمكنك إلقاء نظرة على قائمة المهام أو مشاهدة الأخبار، وعرض مواقيت الصلاة، وضبط المؤقتات، وبث الموسيقى والفيديوهات، وكل ذلك باستخدام صوتك فقط. Echo Show 8 – شاشة عرض ذكية عالية الدقة من أمازونجهاز Echo Show 8 مجهّز بكاميرا عريضة الزاوية بدقة 13 ميجابكسل وشاشة لمسية عالية الدقة قياس 8 بوصة. وتمّ تجهيز Echo Show 8 بسمّاعات مزدوجة مدمجة لتوفير تجربة صوتية رائعة سواء كان ذلك للاستماع إلى الموسيقى من أنغامي أو Spotify أم مشاهدة البرامج التلفزيونية أو الأفلام من Prime Video وNetflix وغير ذلك. Echo Show 10 – شاشة عرض ذكية عالية الدقة مزودة بخاصية الحركة بدعم أليكساجهاز Echo Show 10 مصمم للتحرك معك، إذ ستتجه الشاشة عالية الدقة الرائعة مقاس 10 بوصات نحوك تلقائياً حتى تتمكن من التركيز على ما تشاهده على الشاشة. ويمكنك إلقاء نظرة على حال الطقس أو الأخبار، أو بث الموسيقى أو الفيديوهات، أو اتباع الوصفات، أو الاطلاع على الكاميرات المتوافقة ولعب الألعاب وغير ذلك. أليكسا – العقل المدبر لجهاز أمازون إيكويزداد ذكاء أليكسا باستمرار من خلال الدعم المستمر للعديد من المطورين حول العالم، ويمكن استخدام الصوت فقط للقيام بأوامر مثل: الاستماع إلى الأخباربإمكان أليكسا قراءة الأخبار وتقديم تحديثات مخصصة وفقًا لتفضيلات المستخدم، واختيار الوكالات المفضلة للحصول على الأخبار أو النتائج الرياضية، بما ذلك قناة العربية وCNBC عربية والرياضية وSports 360 وهارفرد بيزنس ريفيو العربية وسبق وغير ذلك. ما عليك سوى القول: “أليكسا، ايش الأخبار اليوم؟” وعند الإطلاق، ستكون المحطات الإذاعية التالية متاحة: ام بي سي أف أم وراديو بانوراما أف أم ، و وروتانا أف أم و UFM. تعيين مواقيت الصلاة وتلاوة القرآنيمكن لأليكسا تلاوة القرآن بصوت القارئ المفضل من السورة أو الجزء الذي تختاره ، وكل ذلك عن طريق الصوت. فما عليك سوى القول: “أليكسا، شغلي القرآن”، “أليكسا شغلي سورة الكهف”. وسيتمكن العملاء أيضًا من ضبط مواقيت الصلاة ما عليك سوى القول، “أليكسا، اضبطي تذكير الصلاة.” وقريبًا، سيتمكن العملاء من التحقق من التقويم الهجري. الاستماع إلى الموسيقى في كل مكانتقدم أليكسا تجربة سلسة في الاستماع إلى الموسيقى مع خدمات تشمل أنغامي وسبوتيفاي وغيرها، ويمكن تشغيل ملايين الأغاني عبر القول: “أليكسا، شغلي موسيقى البوب” أو “أليكسا، تخطّي هذه الأغنية.” يمكنك أيضاً جمع عدة أجهزة Echo وجعلها متزامنة عبر إطلاق اسم على المجموعة. استيقظ على أغانيك المفضلة كل صباح، ما عليك سوى القول: “أليكسا، صحيني على موسيقى البوب.” التحكم في منزلك الذكييمكنك استخدام جهاز إيكو لتشغيل الإضاءة قبل النهوض من السرير أو تخفيف الإضاءة، كذلك يمكنك الحرص على أمان منزلك بغنى عن استخدام اليدين مع نظام مراقبة Ring، الذي يتميز بكاميرات وأجراس للباب مع فيديو وأنظمة تنبيه متوافقة كلها مع أليكسا، وما عليك سوى القول: “أليكسا، تفقدي غرفة الحضانة” لمشاهدة ما تسجله الكاميرا على جهاز Echo Show. وسيعمل المساعد الصوتي كذلك مع الأجهزة المنزلية الذكية المتوافقة التي تعرضها علامات تجارية متعددة منها Philips Hue و Xiaomiو TP Link وغيرها. طرح الأسئلةيمكنك طرح أسئلة على المساعد الصوتي حول مشاهير وتواريخ وأماكن وحسابات وحوارات والكثير غيرها. مثلًا، بالقول: “أليكسا، متى صلاة المغرب في مكة؟”، أو “أليكسا، متى تم بناء جسر الملك فهد؟”، أو يمكن طلب نكتة بالقول: “أليكسا، قولي لي نكتة.” متابعة الفرق الرياضية المفضلة لديكيمكنك أن تطلب من أليكسا أن تعطيك النتائج المباشرة أو نتائج مباريات منتهية أو أن تخبرك متى سيلعب فريقك المفضل مباراته التالية. ما عليك سوى القول: “أليكسا، كم نتيجة الهلال؟” مصممّة لحماية خصوصيتكصممت كل أجهزة إيكو مع مستويات متعددة لحماية الخصوصية حسب أمازون، بما في ذلك ضوابط للتحكم في الميكروفون والكاميرا، وتتيح للعملاء التحكم الكامل في بياناتهم. كما تتيح اختيار حذف التسجيلات الصوتية الخاصةبعدة طرق عن طريق الصوت أو من خلال تطبيق أليكسا عبر القول “أليكسا، احذفي آخر شيء سمعتيه”. ويمكن حذف تسجيلاتك الصوتية كلها مرة واحدة، أو حذف التسجيلات الصوتية تلقائيًا بعد ثلاثة أو ثمانية عشر شهرًا بشكل مستمر، أو اختيار عدم حفظها نهائيًا. فضلًا على ذلك، تضم أجهزة Echo Show مزايا دعم سهولة الوصول يستفيد منها كل العملاء، بينها القدرة على التفاعل مع أليكسا بواسطة اللمس عوضًا عن الصوت، ومشاهدة الترجمة النصية على شاشة الجهاز، وغير ذلك. Skills من المطورينعند الطرح، سيتمكن العملاء من الاستفادة من ما يقارب 200 مهارة ستتاح في المملكة العربية السعودية، من بينها خدمات حجز سيارات الأجرة من خلال skill كريم وصفات وإرشادات للطهو من خلال فتافيت skill، ومتابعة وصول الطلبية من خلال البيك أو دومينوز أو جاهز skill، ومعرفة الفعاليات والنشاطات الجارية من خلال Riyadh Season skill التي ابتكرتها هيئة السياحة السعودية، اللعب مع الأصدقاء”سؤال اليوم”، وخدمات الكتب المسموعة من خلال Storytel، وغير ذلك. الأسعار والأنواع المتوفرةستكون كل الأجهزة التي تم الإعلان عنها اليوم متاحة على Amazon.sa. سيبدأ الشحن في الرابع عشر من ديسمبر للاحتفال بوصول أليكسا إلى المنطقة ولفترة محدودة فقط سيتوفر أي جهاز من Echo بسعر مخفض كعرض تمهيدي.
التدوينة أمازون تطرح أليكسا بخيار اللغة العربية بلهجة خليجية وتطلق أجهزة إيكو في السعودية ظهرت أولاً على عالم التقنية. |
72,500 | خبر سار.. بإمكانك الآن إجراء مكالمات صوت وصورة عبر "جيميل" |
أعلنت مدونة موقع البحث العملاق، "غوغل"، أن مستخدمي تطبيق "جيميل" على نظامي أندرويد و"أي أو أس"، سيكونون قادرين على إجراء مكالمات صوتية ومرئية بين شخصين بدءا من الآن. وكان من الممكن في السابق بدء مكالمات من داخل تطبيق "جيميل"، ولكن كان يتطلب ذلك إرسال دعوة لإجراء مكالمة صوتية أو فيديو بين شخصين من خلال "اللقاء عبر غوغل" "Google Meet"، لكن أصبح الأمر أسهل الآن ولا يحتاج المستخدم إرسال دعوة في البداية، بحسب ما أفاد موقع "ذا فيرج". ومن الآن فصاعدا، ستكون هناك علامات بسيطة في الجزء العلوي الأيمن من كل محادثة فردية يمكن استخدامها لإجراء المكالمات الصوتية أو الفيديو. وتقول غوغل: "لإجراء مكالمة، اختر الشخص، وافتح الدردشة معه ثم اختر رمز المكالمة الصوتية أو الفيديو"، مشيرا إلى أن مدة المكالمة وتوقيتها سيكون ظاهرا في السجل، وحتى المكالمات الفائتة. كما ستسمح هذه الميزة بالتبديل بسلاسة بين الدردشة إلى مكالمة فيديو، أو إلى مكالمة صوتية عند الحاجة، بحسب "غوغل". وتم الإعلان عن هذه الميزة لأول مرة في سبتمبر، ولكن اعتبارا من الاثنين، بدأ طرحها لأي شخص لديه حسابات على غوغل. |
72,487 | مقدمة إلى البرمجة الوظيفية Functional Programming |
سننظر في كيفية دعم بايثون لأسلوب آخر من أساليب البرمجة، ألا وهو البرمجية الوظيفية Functional Programming، واختصارًا FP، وهو موضوع متقدم بالنسبة للمبتدئين في البرمجة، كما ذكرنا في شأن التعاودية في المقال السابق، وربما تصرف نظرك عنه الآن إلى أن تقطع شوطًا في البرمجة بنفسك. يعتقد المؤيدون للبرمجة الوظيفية أنها الأسلوب الأمثل لتطوير البرمجيات. سنغطي في هذا المقال ما يلي:
ينبغي ألا نخلط بين البرمجية الوظيفية والأسلوب الإلزامي أو الإجرائي في البرمجة imperative style، وهو الذي كنا نستخدمه في أغلب الفصول حتى الآن، كما أنها تختلف عن البرمجة كائنية التوجه قليلًا بما أن المفاهيم التي سنراها هنا هي مفاهيم برمجية مألوفة لكننا نعبّر عنها تعبيرًا مختلفًا نوعًا ما، كما أن الفلسفة التي تقوم عليها البرمجية الوظيفية في حل المشاكل مختلفة عن باقي الأساليب أيضًا. وتدور البرمجية الوظيفية حول التعابير، بل يمكن القول إن البرمجية الوظيفية هي البرمجة تعبيرية التوجه expression oriented programming، لأن كل شيء فيها يؤول إلى تعبير في النهاية، وقد ذكرنا أن التعبير هو تجميعة من العمليات والمتغيرات التي ينتج عنها قيمة واحدة، فيكون x == 5 تعبيرًا بوليانيًا boolean، و5 + (7-Y) تعبيرًا حسابيًا، و"Hello world".uppercase() تعبيرًا نصيًا، وهذا التعبير الأخير هو استدعاء دالة function أيضًا، أو استدعاء تابع method بالأحرى، على كائن السلسلة النصية "Hello world"، وسنرى أهمية الدوال في البرمجية الوظيفية، كما هو واضح من الاسم. تُستخدم الدوال في البرمجية الوظيفية مثل كائنات، أي أنها تُمرَّر من مكان لآخر داخل البرنامج بنفس طريقة تمرير المتغيرات، وقد رأينا أمثلةً على ذلك في برامج الواجهة الرسومية التي أنشأناها من قبل، حيث أسندنا اسم الدالة إلى سمة command الخاصة بمتحكم الزر، وعاملنا دالة معالج الحدث على أنها كائن وأسندنا إلى الزر مرجعًا إلى الدالة، وهذا المفهوم الخاص بتمرير الدوال في البرامج أمر أساسي في البرمجية الوظيفية، كما تميل البرامج الوظيفية إلى أن تكون قائمية التوجه List Oriented. تحاول البرمجية الوظيفية التركيز على ماهية المشاكل وليس كيفية حلها، أي أنها تصف المشكلة التي نريد حلها، بدلًا من التركيز على آلية الحل نفسها، وتوجد عدة لغات برمجة تميل إلى التصرف بهذه الطريقة، لعل أوسعها انتشارًا هي Haskell، ويحتوي موقع Haskell على أوراق عديدة تصف فلسفة البرمجية الوظيفية، إضافةً إلى لغة Haskell نفسها، رغم أننا نرى أن مؤيدي هذا النمط من البرمجة يبالغون في ذلك الهدف. ويهَيكل البرنامج الوظيفي بتعريف تعبير يلتقط الهدف من البرنامج، وكل شرط term في التعبير هو تعليمة لخاصية من خصائص المشكلة -وربما يوضع الشرط نفسه في تعبير آخر-، ونحصل على الحل من خلال تقييم كل شرط من هذه الشروط. لكن هل هذا الأسلوب ناجح؟ الجواب: أحيانًا نعم وبكفاءة، لكننا للأسف نحتاج في كثير من المشاكل الأخرى إلى أسلوب تفكير أكثر تجريدًا abstract، ويتأثر كثيرًا بالمفاهيم الرياضية، وتصعب قراءة الشيفرة الناتجة من قبل المبرمج العادي، وتكون عادةً أقصر من الشيفرة الإلزامية المكافئة لها، وأكثر موثوقيةً منها، وقد دفعت هذه المزايا الأخيرة -من الاختصار والموثوقية- الكثير من المبرمجين الذين يستخدمون الأسلوب الكائني أو الإلزامي إلى النظر في البرمجية الوظيفية، إذ توجد العديد من الأدوات القوية التي يمكن استخدامها، حتى لو لم ينتقل المبرمج إلى اتباع هذا النمط كليًا. اقتباس موثوقية البرمجية الوظيفيةتأتي موثوقية البرامج الوظيفية من العلاقة الوطيدة بين البنى الخاصة بالبرمجية الوظيفية والمواصفات الاصطلاحية formal specification languages مثل: Z أو VDM، فإذا حُددت مشكلة في لغة رسمية فمن البديهي أن نترجم التحديد إلى لغة وظيفية التوجه مثل Haskell، لكن إذا كان التحديد خاطئًا فسيكون البرنامج الناتج مرآة لذلك الخطأ! يُعرف هذا المبدأ في علوم الحاسوب باسم "Garbage In, Garbage Out" أو "قمامة داخلة، قمامة ناتجة"، ولا تزال هذه الصعوبة في التعبير عن متطلبات النظام بأسلوب موجز لا لبس فيه من أعظم التحديات في هندسة البرمجيات. كيف تنفذ بايثون البرمجية الوظيفيةتوفر بايثون دوالًا عديدة تمكننا من استخدام منظور البرمجية الوظيفية، وتمتلئ الدوال بالمزايا السهلة، أي يمكن كتابتها في بايثون بسهولة، أما ما يجب النظر إليه فهو الغرض المضمَّن في توفير تلك الدوال، وهو السماح لمبرمج بايثون بالعمل بأسلوب البرمجية الوظيفية إذا شاء. سننظر الآن في بعض الدوال المتوفرة في بايثون ونرى كيف تعمل على بعض أمثلة هياكل البيانات التي نعرّفها على النحو التالي: choices = ['eggs','chips','spam'] numbers = [1,2,3,4,5] def spam(item): return "Spam & " + item الدالة map(aFunction, aSequence)تطبق الدالة aFunction الخاصة ببايثون على كل عضو من aSequence، ويكون التعبير كما يلي: L = map(spam, choices) print( list(L) )ينتج عن هذا إعادة قائمة جديدة في L، مع السابقة Spam & في حالتنا قبل كل عنصر، ونلاحظ كيف مررنا الدالة spam() إلى دالة map() مثل قيمة، أي أننا لم نستخدم الأقواس لتنفيذ شيفرة الدالة، بل استخدمنا اسمها مرجعًا إلى الدالة، ولعلك تذكر أننا فعلنا هذا مع معالجات الأحداث في مقال برمجة الواجهات الرسومية، وهذه الخاصية في معاملة الدوال مثل قيم هي إحدى المزايا الرئيسية في البرمجية الوظيفية. يمكن تحقيق نفس النتيجة بكتابة ما يلي: L = [] for i in choices: L.append( spam(i) ) print( L )لكن نلاحظ أن دالة map تسمح لنا بإلغاء الحاجة إلى كتلة شيفرة متشعبة، مما يقلل تعقيد البرنامج، وسنرى أن هذه سمة متتكررة في البرمجية الوظيفية، حيث يقلل استخدام الدوال التعقيد النسبي للشيفرة بالتخلص من الكتل البرمجية. الدالة (filter(aFunction, aSequenceتستخلص filter كل عنصر في التسلسل aSequence تعيد له الدالة aFunction القيمة True، وإذا عدنا إلى قائمة الأعداد الخاصة بنا فيمكن أن ننشئ قائمةً جديدةً من الأعداد الفردية فقط: def isOdd(n): return (n%2 != 0) # mod استخدم العامل L = filter(isOdd, numbers) print( list(L) )نلاحظ مرةً أخرى أننا نمرر اسم الدالة isodd إلى filter قيمة وسيط، بدلًا من استدعاء isodd() مثل دالة، وعلى أي حال نستطيع كتابة الأسلوب البديل التالي: def isOdd(n): return (n%2 != 0) L = [] for i in numbers: if isOdd(i): L.append(i) print( L )ونلاحظ هنا أيضًا أن الأسلوب التقليدي يحتاج إلى مستويين إضافيين من الإزاحات لتحقيق نفس النتيجة، وهذه الزيادة في مستويات الإزاحة دليل على زيادة التعقيد. توجد عدة أدوات أخرى للبرمجة الوظيفية في وحدة اسمها functools يمكن استيرادها وتصفحها في محث بايثون، ويُرجع إلى dir() وhelp() عند الحاجة. الدالة لامدا Lambdaإحدى الخصائص الواضحة في الأمثلة السابقة هو أن الدوال التي مُرِّرت إلى دوال البرمجية الوظيفية كانت قصيرة جدًا، وغالبًا ما كانت سطرًا واحدًا فقط، وتوفر بايثون دعمًا جديدًا للبرمجة الوظيفية لتوفير الجهد المبذول لتعريف هذه الدوال الصغيرة، وهي دالة لامدا lambda، والتي يأتي اسمها من فرع في الرياضيات هو حسابات لامدا Lambda Calculus، الذي يستخدم حرف لامدا الإغريقي λ لتمثيل مفهوم قريب من هذا. ويُستخدم مصطلح لامدا في البرمجية الوظيفية للإشارة إلى دالة مجهولة تمثل كتلةً برمجيةً يمكن تنفيذها كما لو كانت دالةً لكن دون اسم، ويمكن تعريف دوال لامدا في أي مكان داخل البرنامج يمكن أن يحدث فيه تعبير بايثون، وهذا يعني أننا نستطيع استخدامها داخل دوال البرمجية الوظيفية الخاصة بنا. وتبدو الدالة لامدا بالشكل التالي: lambda <aParameterList> : <a Python expression using the parameters>وعلى ذلك يمكن كتابة دالة isodd سالفة الذكر كما يلي: isOdd = lambda j: j%2 != 0ونتجنب هنا تعريف السطر بالكامل من خلال إنشاء الدالة لامدا داخل الاستدعاء على filter كما يلي: L = filter(lambda j: j%2 != 0, numbers) print( list(L) )ويُنفَّذ الاستدعاء إلى map باستخدام ما يلي: L = map(lambda s: "Spam & " + s, choices) print( list(L) )ونلاحظ هنا أننا كنا نحول نتائج map() وfilter() إلى قوائم، لأنهما صنفان يعيدان نسخًا من شيء يدعى المتكرر itreable، وهو يتصرف مثل التسلسل أو التجميعة إذا استُخدم على حلقة تكرارية، ويمكن تحويله إلى قائمة، لكن كفاءته تظهر في استخدام الذاكرة، وصديقتنا القديمة range() قابلة للتكرار كذلك، وتسمح بايثون بإنشاء أنواع قابلة للتكرار خاصة بنا، لكننا لن نشرحها. استيعاب القوائماستيعاب القوائم list comprehension هي تقنية لبناء قوائم جديدة، مستوردة من لغة Haskell وأُدخلت إلى بايثون في الإصدار الثاني، وبنيتها غريبة قليلًا وتشبه الصياغة الرياضية، مثلًا: [<expression> for <value> in <collection> if <condition>]والتي تكافئ ما يلي: L = [] for value in collection: if condition: L.append(expression)مما يوفر علينا كتابة بعض الأسطر كما في بقية البنى في البرمجية الوظيفية، ومستويين من الإزاحة كذلك، لننظر في بعض الأمثلة العملية، حيث سننشئ أولًا قائمةً من جميع الأعداد الزوجية الأصغر من 10: >>> [n for n in range(10) if n % 2 == 0 ] [0, 2, 4, 6, 8]والذي يقول إننا نريد قائمةً من القيم n التي تُختار من المجال 0-9، وتكون زوجيةً (n % 2 == 0)، ويمكن استبدال دالةٍ بالشرط الأخير لا شك، شرط أن تعيد الدالة قيمةً تستطيع بايثون أن تفسرها مثل قيمة بوليانية، وعليه يمكن إعادة كتابة المثال السابق كما يلي: >>>def isEven(n): return ((n%2) == 0) >>> [ n for n in range(10) if isEven(n) ] [0, 2, 4, 6, 8]والآن لننشئ قائمةً من تربيعات أول 5 أعداد: >>> [n*n for n in range(5)] [0, 1, 4, 9, 16]نلاحظ أن تعليمة if الأخيرة لم تكن ضروريةً لكل حالة، فالتعبير الابتدائي هنا هو n*n، حيث نستخدم جميع قيم المجال، لنستخدم الآن تجميعةً موجودةً مسبقًا بدلًا من دالة المجال: >>> values = [1, 13, 25, 7] >>> [x for x in values if x < 10] [1, 7]يمكن استخدام ذلك لاستبدال دالة المرشح التالية: >>> print( list(filter(lambda x: x < 10, values)) ) [1, 7]لا يقتصر استيعاب القوائم على متغير واحد أو اختبار واحد، لكن سيزداد تعقيد الشيفرة كلما زادت المتغيرات والاختبارات، ويعود إليك الاختيار بين استيعاب القوائم أو الدوال التقليدية بحسب ما تراه أسهل، إذ تستطيع استخدام دوال البرمجية الوظيفية السابقة أو استيعابات القوائم الجديدة عند إنشاء تجميعة جديدة مبنية على واحدة موجودة مسبقًا، لكن الأسهل في إنشاء التجميعات الجديدة هو الاستيعاب. ورغم أن هذه البُنى تبدو مغريةً إلا أن التعابير اللازمة للحصول على النتيجة التي نريدها قد تصبح معقدةً للغاية بحيث يسهل توسيعها إلى مكافئاتها التقليدية في بايثون، ولا عيب في هذا إذ إن سهولة القراءة أفضل من غموض الشيفرة، خاصةً إذا كان ذلك الغموض لمجرد التذاكي. بنى أخرىرغم أن هذه الدوال مفيدة في ذاتها إلا أنها لا تكفي للسماح بنمط برمجة وظيفية كامل داخل بايثون، إذ يجب تغيير هياكل التحكم أو على الأقل استبدالها بمنظور وظيفية، ويمكن تنفيذ هذا بتطبيق أثر جانبي لكيفية تقييم بايثون للتعابير البوليانية. التقييم المقصور أو تقييم الدارة المقصورةلعلك تذكر من مقال مقدمة في البرمجة الشرطية أن بايثون تستخدم التقييم المقصور للتعابير البوليانية، ويمكن استغلال بعض خصائص هذه التعابير في توفير أسلوب وظيفية للتحكم في البرامج، والتقييم المقصور باختصار هو بدء تقييم التعبير البولياني من التعبير الأيسر إلى الأيمن، ويتوقف التقييم عند عدم الحاجة إلى تقييم أكثر لتحديد النتيجة النهائية، لننظر في بعض الأمثلة لنرى كيف يعمل هذا التقييم: >>> def TRUE(): ... print( 'TRUE' ) ... return True ... >>> def FALSE(): ... print( 'FALSE' ) ... return False ...نعرِّف أولًا دالتين تخبراننا متى تُنفَّذان وتعيدان قيمة أسمائهما، ونستخدم ذلك لنرى كيفية تقييم التعابير البوليانية، لاحظ أن الخرج بالأحرف الكبيرة ناتج عن الدوال، والخرج بالأحرف مختلطة الحالة ناتج عن التعبير: >>> print( TRUE() and FALSE() ) TRUE FALSE False >>> print( TRUE() and TRUE() ) TRUE TRUE True >>> print( FALSE() and TRUE() ) FALSE False >>> print( TRUE() or FALSE() ) TRUE True >>> print( FALSE() or TRUE() ) FALSE TRUE True >>> print( FALSE() or FALSE() ) FALSE FALSE Falseنلاحظ أنه إذا تحقق الجزء الأول من تعبير AND -أي كان True- وفقط إذا تحقق؛ فسيقيَّم الجزء الثاني، أما إذا لم يتحقق الجزء الأول -كان False- فلن يُقيَّم الجزء الثاني بما أن التعبير ككل لا يمكن أن يتحقق. وبالمثل ففي التعبير المبني على OR، إذا كان الجزء الأول True فلا توجد حاجة إلى تقييم الجزء الثاني، لأن التعبير الكلي يجب أن يكون True، وذاك يتحقق بأحد الجزئين فقط. هناك ميزة أخرى في تقييم بايثون للتعابير البوليانية يمكن استغلالها، وهي أنها لا تعيد -عند تقييم تعبير ما- True أو False فقط، بل تعيد القيمة الحقيقية للتعبير، لذا ستعيد بايثون السلسلة النصية نفسها إذا تحققنا من سلسلة فارغة -والتي يجب أن تُعد False- كما يلي: if "This string is not empty": print( "Not Empty" ) else: print( "No string there" )يمكن استخدام هذه الخصائص لإعادة إنتاج سلوك شبيه بالتفريع branching، لنفترض مثلًا أن لدينا جزءًا من شيفرة كما يلي: if TRUE(): print( "It is True" ) else: print( "It is False" )يمكن استبدال بنية وظيفية دالية بها: V = (TRUE() and "It is True") or ("It is False") print( V )جرب العمل على هذا المثال واستبدل استدعاءً إلى FALSE() بالاستدعاء إلى TRUE(). وهكذا نكون قد وجدنا طريقةً للتخلص من تعليمات if/else الشرطية في برامجنا باستخدام التقييم المقصور للتعابير البوليانية، وقد ترى هذه الأساليب في البرامج القديمة، لكنها قد تأتي بنتائج عكسية، لهذا توجد بنية أُدخلت حديثًا إلى بايثون تسمى بالتعبير الشرطي تسمح لنا بكتابة شرط if/else مثل تعبير، كما يلي: result = <True expression> if <test condition> else <False expression>وسيبدو مثال حقيقي بها كما يلي: >>> print( "This is True" if TRUE() else "This is not printed" ) TRUE This is Trueوإذا استخدمنا else: >>> print( "This is True" if FALSE() else "We see it this time" ) FALSE We see it this timeوقد ذكرنا في المقال السابق حول مفهوم التعاودية في البرمجة، أنه يمكن استخدام التعاودية لاستبدال بنية الحلقة التكرارية، فإذا جمعنا التعاودية مع التعابير الشرطية فيمكننا التخلص من بنى التحكم القديمة كلها من برنامجنا، ونستبدل بها تعابير صرفةً، وهذه خطوة كبيرة نحو تفعيل حلول البرمجية الوظيفية. ولنضع هذا في تدريب عملي سنكتب برنامج المضروب factorial بأسلوب وظيفية كليًا، باستخدام lambda بدلًا من def، والتعاودية بدلًا من الحلقات التكرارية، والتعابير الشرطية بدلًا من if/else المعتادة: >>> factorial = lambda n: ( None if n < 0 else 1 if (n == 0) else factorial(n-1) * n ) >>> print( factorial(5) ) 120وهذا كل ما في الأمر، وقد لا تكون هذه الشيفرة سهلة القراءة مثل شيفرة بايثون العادية لكنها تعمل، وهي دالة بنمط البرمجية الوظيفية كليًا لأنها تعبير خالص، ونلاحظ أننا استخدمنا مجموعةً من الأقواس حول التعبير كله، وهو ما يسمح لنا بتوزيعه على عدة أسطر لتحسين قراءته، ثم حاذينا قيم الإعادة المحتملة الثلاثة رأسيًا في أسطر منفصلة، وهذا اصطلاح شائع مستورد من لغات Lisp التي تميل إلى استخدام التعاودية بكثرة. استنتاجاتلعل السؤال الذي يطرح نفسه الآن هو الجدوى من كل ذلك، فرغم أن البرمجية الوظيفية تروق لكثير من الأكاديميين في مجال علوم الحاسوب وعلماء الرياضيات كذلك؛ إلا أن أغلب المبرمجين العاملين يقتصدون في استخدام تقنيات البرمجية الوظيفية، ويدمجونها مع الأساليب الإلزامية التقليدية وفق ما يرونه مناسبًا. وعند الحاجة إلى تطبيق عمليات على عناصر في قائمة مثل map أو filter تكون البرمجية الوظيفية هي المثلى للتعبير عن الحل، وبالمثل قد نجد أحيانًا أن التعاودية أفضل من الحلقات التكرارية، كما قد نجد استخدامًا للتقييم المقصور أو التعبير الشرطي بدلًا من تعابير if/else الشرطية، خاصةً داخل تعبير ما، والمهم أنه يجب على المتعلم ألا يتحمس كثيرًا لتقنية أو فلسفة برمجية بعينها، وإنما يستخدم الأداة المناسبة للمهمة التي بين يديه، ويكفيه حينئذ أن يعلم بوجود حلول بديلة. لدينا أمر أخير حول الدالة lambda، إذ يمكن استخدامها خارج مجال البرمجية الوظيفية، وهي تعريف معالجات الأحداث في برمجة الواجهات الرسومية، حيث تكون معالجات الأحداث دوالًا قصيرةً في الغالب، أو تستدعي دوالًا أكبر منها بقيم وسائط مدمجة فيها، وفي كلا الحالتين يمكن استخدام دالة لامدا مثل معالج حدث يتجنب الحاجة إلى تعريف الكثير من الدوال المنفردة وشغل فضاء الاسم بأسماء لن تُستخدم إلا مرةً واحدةً فقط، ويجب تذكر أن تعليمة لامدا تعيد كائن دالة يُمرَّر إلى الودجِت widget ويُستدعى في وقت وقوع الحدث، وقد عرَّفنا ودجت الزر في Tkinter من قبل، لذا ستبدو لامدا كما يلي: b = Button(parent, text="Press Me", command = lambda : print("I got pressed!")) b.pack()نلاحظ أنه رغم عدم السماح لمعالج الحدث بامتلاك معامِل إلا أننا نسمح بتحديد سلسلة داخل متن لامدا، ونستطيع الآن إضافة زر ثانٍ بسلسلة مختلفة كليًا: b2 = Button(parent, text="Or Me", command = lambda : print("I got pressed too!")) b2.pack()كما نستطيع توظيف lambda عند استخدام تقنية الربط bind technique التي ترسل كائن حدث مثل وسيط: b3 = Button(parent, text="Press me as well") b3.bind(<Button-1>, lambda ev : write("Pressed")) البرمجية الوظيفية في جافاسكربتلا نريد الخوض في تفاصيل البرمجية الوظيفية هنا، لكن من المهم أن ندرك أن جافاسكربت متأثرة كثيرًا بمفاهيم البرمجية الوظيفية، بل إن الاستخدام الحديث لها يشجع استخدام البرمجية الوظيفية أكثر من البرمجة الكائنية، ومفتاح البرمجية الوظيفية فيها هو أن إمكانية كتابة تعريفات الدوال بأسلوب مشابه لتعابير لامدا، فلا تتطلب إلا تغييرًا بسيطًا في الأسلوب والبنية اللغوية لتعريف الدالة، انظر هذا المثال من مقال البرمجة باستخدام الوحدات: <script type="text/javascript"> var i, values; function times(m) { var results = new Array(); for (i = 1; i <= 12; i++) { results[i] = i * m; } return results; } // استخدم الدالة values = times(8); for (i=1;i<=12;i++){ document.write(values[i] + "<br />"); } </script>لاحظ أننا عرّفنا الدالة بوضع الاسم times بعد الكلمة المفتاحية function، لكن جافاسكربت تسمح لنا بتسمية الدالة من خلال الإسناد، كما في أسلوب لامدا الخاص ببايثون أعلاه: times = function(m) { var results = new Array(); for (i = 1; i <= 12; i++) { results[i] = i * m; } return results; }لذا يكون times الآن متغيرًا يحمل مرجعًا إلى كائن الدالة، ويمكن استدعاؤه كما فعلنا من قبل: values = times(8); for (i=1;i<=12;i++){ document.write(values[i] + "<br />"); }بل يمكن استخدام function() لإنشاء دوال مجهولة كما في لامدا، باستثناء أنه ليس لجافاسكربت قيود على أنواع الدوال التي ننشئها، فيمكن أن تكون بأي طول وتعقيد نريده، مما يؤدي إلى نمط في برمجة جافاسكربت ستقابله غالبًا في صفحات الويب، ولذا سنسرد مثالًا مختصرًا له هنا، وهو يتضمن استخدام دوال جافاسكربت التي تأخذ دوالًا أخرى معامِلات لها، وقد رأينا هذا في برامج الواجهة الرسومية من قبل وسميناه رد النداء callback، لأن العديد من مكتبات جافاسكربت تستخدم رد النداء ذاك، ويكون عادةً من دالة رد نداء تُحدَّد على أنها المعامِل الأخير، وهنا مثال من رد نداء مُستخدَم في صفحة ويب بسيطة، وهي مثال كامل، لذا يمكن تحميله وتجربته في المتصفح: <html> <head> <title>Callback test</title> <script type="text/javascript"> window.setTimeout( function() { document.write("رأيتني الآن!"); }, 3000); </script> </head> <body> <p>انتظر نهاية الوقت....<p> </body> </html>نلاحظ أن الدالة التي نفذها الوقت المستقطع لي لها اسم، فقد أُنشئت وسيطًا أول في استدعاء setTimeout نفسه، ثم أضيف زمن الانتظار الذي هو 3000 مللي ثانية وسيطًا ثانيًا، فإذا حملته في المتصفح لديك فسترى وقت الانتظار يحل محل الرسالة الأولى بعد ثلاث ثوانٍ. صار هذا الأسلوب من تعريف الدوال المضمَّنة شائعًا للغاية في مجتمع جافاسكربت، وما هو إلا برمجة وظيفية خالصة، وتحتوي JQuery وهي إحدى أشهر مكتبات الويب لجافاسكربت، على دوال كثيرة تأخذ دوالًا أخرى مثل معامِلات، لنحصل على أسلوب برمجي وظيفي للغاية. أما VBScript فليس فيها دعم مباشر للبرمجة الوظيفية، لكن يمكن استخدامها بأسلوب وظيفي إذا كان لدى المبرمج صبر على ذلك، بهيكلة البرامج مثل تعابير وعدم السماح للآثار الجانبية بتعديل متغيرات البرنامج. خاتمةنرجو في نهاية هذا المقال أن تكون تعلمت ما يلي:
ترجمة -بتصرف- للفصل الحادي والعشرين: Functional Programming من كتاب Learn To Program لصاحبه Alan Gauld. اقرأ أيضًا |
72,486 | معالجة محتويات خلايا ليبرأوفيس كالك باستخدام الماكرو |
تتكون تطبيقات جداول البيانات مثل كالك Calc من مصنفات workbooks وأوراق عمل worksheets وخلايا Cells يجب معالجتها باستخدام ماكرو Macro لأتمتة المهام المختلفة. سنشرح فيما يلي المعالجة الأساسية لأوراق العمل والخلايا ومحتوياتها التي تُعَد أساسًا للعديد من الماكرو المعقّد. هذا المقال جزء من سلسلة مقالات حول إنشاء ماكرو في ليبرأوفيس كالك، فهرس السلسلة:
سنقرأ جدول بيانات كالك مكوَّن من 3 أوراق وسنقرأ محتوياته، ثم سنعرض محتويات القراءة المنسَّقة في نافذة الرسالة. تحتوي الورقة 1 و الورقة 2 و الورقة 3 على البيانات التالية: تفاصيل الشيفرةسنصرّح أولًا عن 3 كائنات لتعريف مصنف كالك ومجموعة الأوراق والخلية. لمعرفة كيفية البدء بالعمل وكتابة شيفرات الماكرو منذ البداية راجع المقال السابق، المشار إليه ببداية المقال. dim my_doc as object Dim my_sheets as object Dim my_cell as objectاضبط my_doc باستخدام ThisComponent الذي يشير إلى أن مصنف كالك الحالي مفتوح، ثم يمكنك إسناد مجموعة الأوراق إلى كائن my_sheets للوصول إلى جميع أوراق المصنف، وتُسنَد جميع الأوراق إلى كائن my_sheets بوصفها مصفوفة، حيث يمكن الوصول إليها من خلال استخدام الدليل السفلي subscript مثل Sheets(0) و Sheets(1) وما إلى ذلك (لاحظ أن الدليل السفلي subscript يبدأ من الصفر). my_doc = ThisComponent my_sheets = my_doc.Sheets sheet_count = my_sheets.Countيمكننا الوصول إلى كل خلية باستخدام التابع getCellByPosition بمجرد أن نحصل على مقبض إلى الورقة باستخدام Sheets(subscript). الطريقة النموذجية للوصول إلى خلية هي على النحو التالي: my_cell = ThisComponent.Sheets(i).getCellByPosition(col,row)لاحظ أن وسطاء التابع getCellByPosition هي عمود column ثم صف row. يجب الوصول إلى محتويات كائن الخلية my_cell بعد ضبطه، ولكن لدى ليبرأوفيس نظرة مختلفة إليها، حيث تُعرَّف كل خلية بنوع محتواها. إذا وضعت عددًا في خلية، فسيصبح نوع هذه الخلية عدديًا، وإذا وضعت محارفًا فيه، فسيصبح من النوع النصي. يوفّر ليبرأوفيس قائمة تعدادية enums لنوع الخلية Cell.Type كما يلي: com.sun.star.table.CellContentType.VALUE ' Used for cells containing numbers com.sun.star.table.CellContentType.TEXT ' Used for cells containing characters com.sun.star.table.CellContentType.EMPTY ' Used for empty cells com.sun.star.table.CellContentType.FORMULA ' Used for cells containing formulaاستخدم جزء الشيفرة التالي للوصول إلى قيم الخلية في مثالنا: Select Case my_cell.Type Case com.sun.star.table.CellContentType.VALUE cell_value = my_cell.Value Case com.sun.star.table.CellContentType.TEXT cell_value = my_cell.String End Select تشغيل الشيفرةسنربط قيم كل خلية بطريقة منسَّقة ونعرضها في مربع رسالة، ثم تظهر جميع قيم الخلايا من جميع الأوراق على النحو التالي بعد تشغيل الشيفرة (راجع فقرة "الشيفرة الكاملة" أدناه): الشيفرة الكاملة Sub processing_sheets_cells dim my_doc as object Dim my_sheets as object Dim my_cell as object Dim sheet_count, i, row, col, cell_value, str my_doc = ThisComponent my_sheets = my_doc.Sheets sheet_count = my_sheets.Count for i = 0 to sheet_count - 1 str = str & chr(13) & "--------" & chr(13) for row=1 to 4 for col=0 to 1 my_cell = ThisComponent.Sheets(i).getCellByPosition(col,row) Select Case my_cell.Type Case com.sun.star.table.CellContentType.VALUE cell_value = my_cell.Value Case com.sun.star.table.CellContentType.TEXT cell_value = my_cell.String End Select str = str & " " & cell_value next col str = str & Chr(13) next row next i msgbox str End Sub معالجة السلاسل النصية String في ماكرو ليبرأوفيس كالك مع أمثلة عنهاسنوضّح كيفية معالجة سلسلة نصية مشتركة باستخدام الماكرو في ليبرأوفيس LibreOffice، حيث سنستخدم خلايا ليبرأوفيس كالك لاستخدام السلاسل النصية، فعمليات المعالجة هذه ضرورية لتطوير أيّ ماكرو. لنضع 3 سلاسل نصية في ورقة ليبرأوفيس كالك ونضمّها كما هو موضّح أدناه: ضم Joining السلاسل في كالكاستخدم المعامل "&" لضم سلسلتين أو نصين، حيث سنستخدم هذا المعامل لضم ثلاثة أعمدة من السلاسل النصية ووضع النتائج في عمود آخر كما يلي: Sub String_join() part1 = ThisComponent.Sheets(0).getCellByPosition(0,1) part2 = ThisComponent.Sheets(0).getCellByPosition(1,1) part3 = ThisComponent.Sheets(0).getCellByPosition(2,1) result_cell = ThisComponent.Sheets(0).getCellByPosition(3,1) result_cell.String = part1.String & "." & part2.String & "." & part3.String End Subماكرو ليبرأوفيس كالك - الضم Join لنضع بعض السلاسل النصية في العمود A كما هو موضّح أدناه في ليبرأوفيس، حيث سنستخدم هذه السلاسل الثلاثة لعمليات المعالجة المتبقية في مثالنا. الدالة Leftتعيد الدالة Left عدد المحارف من جانب السلسلة النصية الأيسر، حيث يمكن تحديد عدد المحارف في وسيط الدالة. ضع السلسلة "www.google.com" في الخلية A1 وشغّل الدالة على الخلية A1 على النحو التالي، حيث ستعيد هذه الدالة السلسلة الفرعية "www". Sub left_demo() part1 = ThisComponent.Sheets(0).getCellByPosition(0,0) result = ThisComponent.Sheets(0).getCellByPosition(2,0) result.String = left(part1.String,3) End Subماكرو ليبرأوفيس كالك - مثال Left الدالة Rightتعيد الدالة Right عدد المحارف المُعطَى من الجانب الأيمن، حيث ستعيد هذه الدالة أدناه السلسلة النصية "com" مع المثال السابق نفسه. Sub right_demo() part1 = ThisComponent.Sheets(0).getCellByPosition(0,0) result = ThisComponent.Sheets(0).getCellByPosition(2,0) result.String = right(part1.String,3) End Subماكرو ليبرأوفيس كالك - مثال Right الدالة Midتعيد الدالة Mid حجم سلسلة فرعية من سلسلة نصية معينة. وسطاء الدالة Mid هي (السلسلة النصية string، وموضع البداية start position، وطول السلسلة الفرعية length of the sub-string). ضع سلاسلًا نصية في عمود ضمن ليبرأوفيس كالك، ثم شغّل الدالة Mid، حيث تُحوَّل السلاسل من العمود A إلى سلسلة فرعية موجودة في العمود B في المثال أدناه، إذ تبدأ السلسلة الفرعية من المحرف رقم 4 من السلسلة ويبلغ الطول 6 محارف. Sub mid_demo() part1 = ThisComponent.Sheets(0).getCellByPosition(0,1) result = ThisComponent.Sheets(0).getCellByPosition(1,1) result.String = mid(part1.String,5,6) part2 = ThisComponent.Sheets(0).getCellByPosition(0,2) result = ThisComponent.Sheets(0).getCellByPosition(1,2) result.String= mid(part2.String,5,6) part3 = ThisComponent.Sheets(0).getCellByPosition(0,3) result = ThisComponent.Sheets(0).getCellByPosition(1,3) result.String = mid(part3.String,5,6) End Subماكرو ليبرأوفيس كالك - مثال Mid الدالة Trimتُستخدَم الدالة Trim لإزالة المسافات البادئة واللاحقة من سلسلة نصية، حيث يمكن استخدام هذه الدالة كما يلي: Trim(your_string_here). الدالة Lenتعيد الدالة Len عدد محارف السلسلة، أي طول السلسلة، حيث تُستخدَم كما يلي: Len(string). الدالة Instrتُستخدَم الدالة Instr للبحث عن سلسلة ضمن سلسلة أخرى. إذا عُثِر على تطابق، فستعيد الدالة Instr رقم موضع بداية السلسلة التي يجري البحث عنها، وإن لم يُعثَر عليها، فستُعاد القيمة 0. Sub instr_demo() part1 = ThisComponent.Sheets(0).getCellByPosition(0,1) result = ThisComponent.Sheets(0).getCellByPosition(1,1) result.Value = instr(part1.String,"oogl") part2 = ThisComponent.Sheets(0).getCellByPosition(0,2) result = ThisComponent.Sheets(0).getCellByPosition(1,2) result.Value = instr(part2.String,"dd") part3 = ThisComponent.Sheets(0).getCellByPosition(0,3) result = ThisComponent.Sheets(0).getCellByPosition(1,3) result.Value = instr(part3.String,"untu") End Subماكرو ليبرأوفيس كالك - مثال Instr معالجة التاريخ والوقت في ليبرأوفيس كالك باستخدام الماكروالتاريخ هو نوع بيانات يُستخدم لتخزين قيم التاريخ والوقت، ويحتفظ بقيمة منتصف الليل من 1 يناير عام 0001 افتراضيًا، ولكن يمكن أن نختار أيّ تاريخ نريده ونعالجه بطرق مختلفة. إضافة أيام وشهور إلى تاريخيمكن التصريح عن متغير التاريخ كما يلي: Dim my_date As Dateسنستخدم بعد ذلك الدالة DateValue التي تساعد في تحويل التاريخ من تنسيق نص إلى تنسيق تاريخ، حيث سنضع هذا التاريخ في خلية ليبرأوفيس كالك. my_date = DateValue("Nov 20, 2014") my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,1) my_cell.String = my_dateيمكن إضافة 3 أيام إلى التاريخ السابق باستخدم الدالة DateAdd(). يحدّد وسيط هذه الدالة الأول أيّ جزء من التاريخ يجب زيادته. إذا مرّرت الحرف "d"، فسيُزاد جزء اليوم من التاريخ، وإذا استخدمتَ الحرف "m"، فسيؤدي ذلك إلى زيادة جزء الأشهر في التاريخ. يمكن زيادة التاريخ بمقدار 3 أيام كما يلي: my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,3) my_cell.String = DateAdd("d", 3, my_date)يمكن زيادة التاريخ بمقدار 3 أشهر كما يلي: my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,5) my_cell.String = DateAdd("m", 3, my_date) تنسيق التاريخيكون تنسيق التاريخ ضروريًا دائمًا لعمليات حسابية مختلفة ومعالجات ماكرو خاصة عندما تحتاج إلى استخراج اليوم والشهر والسنة ويوم الأسبوع وغير ذلك من أجزاء التاريخ. سنستخدم فيما يلي طرقًا مختلفة لتنسيق التاريخ، حيث يمكن استخدام كل من هذه الطرق مع تاريخ صالح بوصفه وسيطًا.
يمكن استخراج وقت النظام باستخدام الماكرو، حيث سنعرض فيما يلي بعض دوال الوقت وخصائصها.
إذا وضعنا جميع شيفرات معالجة التاريخ والوقت السابقة في ماكرو، فسيكون الخرج كما يلي في كالك: خرج مثال معالجة الوقت والتاريخ حذف محتويات مجال من الخلايا في كالك باستخدام الماكرويمكنك مسح محتويات خلية أو مجال من الخلايا باستخدام الماكرو، حيث سنمسح كل نوع من أنواع المحتويات من هذا المجال. لنعرّف دالة باستخدام Sub تمسح محتويات مجال من الخلايا كما يلي: Sub ClearRangeContents() End Subلنحصل على مجال من الخلايا في الورقة 1. تعيد الدالة getCellRangeByName كائن المجال المقابل للمجال المُمرَّر عبر الوسيط. Dim oDoc As Object Dim oSheet As Object Dim oCell As Object Dim oRange As Object oDoc = ThisComponent oSheet = oDoc.Sheets(0) ' Refers to Sheet1 as in 0, 1, 2 etc oRange = oSheet.getCellRangeByName("A3:B10")المجال A3:B10 مع أنواع مختلفة من القيم يمكن استخدام دالة المجال clearContents(flags) لمسح محتويات هذا المجال، فالرايات flags هي أنواع القيم التي يمكن أن توجد في خلية، حيث يمكن أن تكون عبارة عن سلسلة نصية أو أرقام أو صيغ أو أنماط وغير ذلك، إذ يمكنك تحديد الأنواع التي تريد مسحها من هذا المجال. تُعَد رايات وسيط الدالة ClearContents من نوع البيانات long، ويمكن أن تأخذ رايات متعددة كدخل. توجد الرايات في مجموعة أوبن أوفيس / ليبرأوفيس الثابتة CellFlags التي تُعَد جزءًا من com.sun.star.sheet. قائمة الرايات الموجودة ضمن com.sun.star.sheet.CellFlags table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } الراية وصفها قيمتها VALUE تحدد القيم العددية الثابتة التي ليس تنسيقها تاريخ أو وقت. 1 DATETIME تحدد القيم العددية الثابتة التي لها تنسيق التاريخ أو الوقت. 2 STRING تحدد سلاسلًا نصية ثابتة. 4 ANNOTATION تحدد تعليقات الخلايا التوضيحية. 8 FORMULA تحدّد الصيغ. 16 HARDATTR تحدد كل التنسيقات الصريحة، لكنها لا تحدد التنسيق المطبق ضمنيًا من خلال نمط الأوراق. 32 STYLES تحدد أنماط الخلية. 64 OBJECTS تحدد الكائنات الرسومية. 128 EDITATTR تحدد التنسيق ضمن أجزاء من محتويات الخلية. 256 FORMATTED تحدد الخلايا ذات التنسيق ضمن الخلايا أو الخلايا التي تحتوي على أكثر من فقرة واحدة في الخلايا. 512ضع كل الثوابت السابقة ضمن متغير ومرّره إلى الدالة clearContents كما يلي: Dim oFlags As Long oFlags = com.sun.star.sheet.CellFlags.VALUE + _ com.sun.star.sheet.CellFlags.DATETIME + _ com.sun.star.sheet.CellFlags.STRING + _ com.sun.star.sheet.CellFlags.ANNOTATION + _ com.sun.star.sheet.CellFlags.FORMULA + _ com.sun.star.sheet.CellFlags.HARDATTR + _ com.sun.star.sheet.CellFlags.STYLES + _ com.sun.star.sheet.CellFlags.OBJECTS + _ com.sun.star.sheet.CellFlags.EDITATTR oRange.clearContents(oFlags) تشغيل الشيفرةضع الشيفرة الكاملة الآتية في جدول بيانات كالك الذي يحتوي على قيم مختلفة ضمن مجال، وشغّل الماكرو عن طريق استدعاء الدالة. قد يكون الخرج هو مسح جميع القيم والتنسيق وغير ذلك. شيفرة الماكرو الكاملة Sub ClearRangeContents() Dim oDoc As Object Dim oSheet As Object Dim oCell As Object Dim oRange As Object Dim oFlags As Long oDoc = ThisComponent oSheet = oDoc.Sheets(0) ' Refers to Sheet1 as in 0, 1, 2 etc oRange = oSheet.getCellRangeByName("A3:B10") oFlags = com.sun.star.sheet.CellFlags.VALUE + _ com.sun.star.sheet.CellFlags.DATETIME + _ com.sun.star.sheet.CellFlags.STRING + _ com.sun.star.sheet.CellFlags.ANNOTATION + _ com.sun.star.sheet.CellFlags.FORMULA + _ com.sun.star.sheet.CellFlags.HARDATTR + _ com.sun.star.sheet.CellFlags.STYLES + _ com.sun.star.sheet.CellFlags.OBJECTS + _ com.sun.star.sheet.CellFlags.EDITATTR oRange.clearContents(oFlags) End Sub معالجة الملفات والمجلدات باستخدام ماكرو ليبرأوفيس كالكسنوضّح كيفية معالجة أو قراءة الملفات والمجلدات في نظام ملفات يونيكس باستخدام لغة بيسيك Basic وماكرو ليبرأوفيس كالك، ووضع أسماء الملفات أو المجلدات في خلايا ليبرأوفيس كالك. يجب معرفة معالجات نظام الملفات والمجلدات، حيث سنعتمد على نظام ملفات يونيكس الذي يختلف عن نظام ويندوز، إذ سيقرأ الماكرو محتويات مجلد ويستخرج الملفات والمجلدات ويدرجها في خلايا كالك. لنفترض أن بنية نظام الملفات تشبه ما يلي في نظام أبونتو Ubuntu المعياري في المسار /usr/include: هناك الكثير من المجلدات والملفات، حيث نريد أن ندرج هذه المحتويات الكاملة ضمن خلايا كالك. توفّر لغة بيسيك Basic الدالة Dir التي يمكن استخدامها لقراءة محتويات مجلد، وتكون هذه الدالة بالشكل التالي: Dir (path, attributes) As Stringوسيط دالة Dir الأول هو سلسلة المسار النصية المراد قراءتها، ويخبر الوسيط الثاني الدالة Dir بنوع عناصر هذا المسار المراد إعادتها. مرّر القيمة "0" للملف والقيمة "16" للمجلدات في الوسيط الثاني، حيث يكون الوسيطان اختياريين. إذا استدعيت الدالة Dir لأول مرة بنجاح، فاستدعِ الدالة مرة أخرى بدون وسيط داخل حلقة للحصول على نفس العناصر من الدالة الناتجة عن إدراج محتويات المجلد الكامل. شيفرة الماكرو الكاملةأنشئ ملف كالك جديد وانسخ والصق الشيفرة التالية في محرّر الماكرو Macro Editor ضمن ليبرأوفيس وشغّلها: Sub list_files() Dim i, strFile path ="/usr/include/" strFile = Dir(path,0) i = 1 while strFile <> "" my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,i) my_cell.String = strFile strFile = Dir ' returns next entry i = i + 1 wend End Sub Sub list_directory() Dim i, strDir path ="/usr/include/" strDir = Dir(path, 16) i = 1 while strDir <> "" my_cell = ThisComponent.Sheets(0).getCellbyPosition(2,i) my_cell.String = strDir strDir = Dir ' returns next entry i = i + 1 wend End Sub الخرجستظهر محتويات المسار /usr/include في كالك بعد تشغيل الشيفرة، حيث سيحتوي العمود الأول على الملفات وسيحتوي العمود الثاني على المجلدات. قائمة الملفات والمجلدات باستخدام ماكرو كالك مرجع الدالة Dir Dir (path, attributes)
ترجمة -وبتصرُّف- لمجموعة المقالات LibreOffice Workbook Worksheet and Cell Processing using Macro و String Processing in LibreOffice Calc Macro with Examples و Date and Time Processing in LibreOffice Calc using Macro و Deleting All Types of Contents from Calc Range using Macro و Files and Directory Processing Using LibreOffice Calc Macro using Basic لصاحبها Arindam. اقرأ أيضًا |
72,485 | مدخل إلى كتابة ماكرو Macro في ليبرأوفيس كالك LibreOffice Calc |
يوفّر ليبرأوفيس LibreOffice طريقة لكتابة الماكرو Macro الذي تحتاجه لأتمتة المهام المتكررة في تطبيقك المكتبي، إذ يمكنك استخدام لغتي بايثون Python أو بيسك Basic لتطوير هذا الماكرو. سنتعلّم في هذا المقال كيفية كتابة ماكرو في ليبرأوفيس باستخدام ماكرو "Hello World" بلغة بيسك، حيث سننشئ ماكرو يضع السلسلة النصية "Hello World" في الخلية الأولى من برنامج ليبرأوفيس كالك Calc، أي خلية الصف 1 والعمود A وأيضًا سنتطرق إلى موضوع تنظيم الماكرو وكيفية تصديره واستيراده كمكتبة مستقلة. هذا المقال جزء من سلسلة مقالات حول إنشاء ماكرو في ليبرأوفيس كالك، فهرس السلسلة:
افتح برنامج ليبرأوفيس كالك من قائمة ابدأ ثم كافة البرامج ثم اختر ليبرأوفيس LibreOffice ثم ليبرأوفيس كالك LibreOffice Calc في نظام ويندوز أو من تطبيقات Applications ثم اختر Office ثم ليبرأوفيس كالك LibreOffice Calc في نظام لينكس. انتقل إلى قائمة أدوات Tools ثم ماكرو Macros ثم نظّم وحدات الماكرو Organize Macros ثم LibreOffice Basic، حيث ستفتح نافذة "ماكروهات أساسية LibreOffice basic macros". أدخِل الاسم الذي تريده في خانة اسم الماكرو وانقر على جديد. استخدمنا الاسم hello_world، ولكن يمكنك استخدام الاسم الذي تريده. سيفتح محرر الماكرو macro editor بعد النقر على زر "جديد"، وهذا المحرّر هو المكان الذي يجب أن تكتب فيه شيفرتك وتنقّح الأخطاء debugging الموجودة فيها وغير ذلك الكثير، حيث يمكنك أن ترى أن اسم الماكرو أصبح اسمًا لدالة الماكرو المكتوبة بلغة بيسك. لنكتب الآن شيفرة الماكرو الأول من خلال التصريح عن متغيرين من النوع كائن object كما يلي: dim document as object dim dispatcher as objectثم نسند قيمتين للمتغيرين السابقين كما يلي: document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")يشير ThisComponent إلى المستند الحالي. يكون كل شيء في ليبرأوفيس -مثل الكتابة والتلوين والإدراج- مراقبًا باستخدام متحكم controller، حيث يرسل هذا المتحكم التغييرات إلى إطار المستند، أي منطقة نافذة كالك الرئيسية. لذلك يشير المتغير document إلى منطقة كالك الرئيسية. يُنشِئ التابع createUnoService نسخةً من خدمة DispatchHelper التي تساعد في إرسال المهام من الماكرو إلى الإطار، حيث يمكن تنفيذ جميع مهام ماكرو في ليبرأوفيس تقريبًا باستخدام المرسل dispatcher. سنصرّح الآن عن مجموعة من الخاصيات التي تتكوّن من الزوج اسم/قيمة name/value، وبالتالي يحتوي الاسم name على اسم الخاصية وتحتوي القيمة value على قيمة تلك الخاصية. dim args1(0) as new com.sun.star.beans.PropertyValue dim args2(0) as new com.sun.star.beans.PropertyValueهدفنا هو وضع النص "Hello World" في الخلية الأولى، حيث يمكن الإشارة إلى الخلية الأولى A1 ثم وضع نص فيها من خلال استخدام الخاصيتين ToPoint و StringName. args1(0).Name = "ToPoint" args1(0).Value = "$A$1" args2(0).Name = "StringName" args2(0).Value = "Hello World!"يجب بعد ضبط الخاصيات استدعاء المرسل لإرسالها إلى المستند، لذلك استدعِ الحدث executeDispatch الخاص بالمرسل باستخدام أمرين هما: .uno:GoToCell و .uno:EnterString، حيث يخبر هذان الأمران الإطارَ بما يجب تنفيذه، ويمرّران مصفوفة الخاصيات بأكملها مع القيم. ضع الآن مربع رسالة message box لإعلامك باكتمال التنفيذ كما يلي: تشغيل الماكرويمكن تشغيل الماكرو بالضغط على مفتاح F5 أو بالنقر على زر تشغيل الماكرو Run Macro من شريط الأدوات، ثم يظهر مربع الرسالة بعد التنفيذ. إذا تحققت من جدول بيانات كالك، فيجب أن ترى النص "Hello World!" مكتوبًا في الخلية الأولى. الشيفرة الكاملة REM ***** BASIC ***** sub hello_world dim document as object dim dispatcher as object document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") dim args1(0) as new com.sun.star.beans.PropertyValue dim args2(0) as new com.sun.star.beans.PropertyValue args1(0).Name = "ToPoint" args1(0).Value = "$A$1" dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1()) args2(0).Name = "StringName" args2(0).Value = "Hello World!" dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args2()) msgbox "Completed!" end sub تنقيح أخطاء الماكرو باستخدام نقطة التوقف والمراقبةسنتعلّم الآن تقنية تنقيح أخطاء debugging ماكرو بيسك في ليبرأوفيس باستخدام نقطة التوقف breakpoint والمراقبة watch، حيث بُنيَت هذه التقنية على نظام أبونتو Ubuntu 14.04LTS وبرنامج ليبرأوفيس الذي يستخدم لغة بيسك، وتُطبَّق على جميع لغات البرمجة تقريبًا مع ليبرأوفيس. تعريف المتغيراتلنعرّف 3 متغيرات سنستخدمها في مثالنا كما يلي: dim i, j, cntعرّف حلقة for التي ستنفّذ من القيمة 1 إلى 10، ثم زِد متغيرين داخل هذه الحلقة على النحو التالي: for cnt = 1 to 10 i = i + 1 j = i + 1 next cnt إضافة نقطة توقف Breakpointنريد وضع نقطتي توقف للعبارتين for cnt = 1 to 10 و j = i + 1، حيث تُشغَّل نقطة التوقف عند وضعها ضمن برنامجك في وضع تنقيح الأخطاء ويتوقف التنفيذ عند هذه النقطة. يمكنك وضع نقطة توقف من خلال وضع المؤشر عند العبارة، ثم الضغط على مفتاح F9 أو الضغط على الزر التالي من شريط الأدوات: سترى بعد ذلك دائرة حمراء بجانب العبارة مما يعني إضافة نقطة توقف كما يلي: إذا أردت إزالة نقطة توقف من عبارة، فاضغط على مفتاح F9 مرةً أخرى عند هذه العبارة أو يمكنك النقر نقرًا مزدوجًا على الدائرة الحمراء. إضافة مراقبة Watchسنضيف الآن مراقبة watch إلى المتغير cnt. تساعد هذه المراقبة عندما ينفّذ البرنامج في وضع تنقيح الأخطاء في مراقبة قيمة المتغير خلال خطوات البرنامج، حيث يمكنك إضافة مراقبة إلى المتغير cnt من خلال تحديد المتغير والضغط على مفتاح F7 أو النقر على أيقونة النظارات في شريط الأدوات. ستلاحظ بعد ذلك إضافة المتغير إلى قائمة المراقبة أسفل المحرر. تنفيذ خطوة تلو الأخرىشغّل البرنامج بالضغط على مفتاح F5، وبما أننا أضفنا نقطة توقف سابقًا، فسترى توقف التنفيذ عند نقطة التوقف الأولى حيث يظهر سهم برتقالي صغير. لديك الآن خياران هما:
لنضغط على مفتاح F8، حيث يمكنك أن ترى السهم البرتقالي ينتقل إلى العبارة التالية وينتظر. إذا ألقيت نظرة على نافذة المراقبة، فيمكنك رؤية قيمة المتغير cnt هي 1. ويمكنك بهذه الطريقة تنقيح الأخطاء وإضافة نقطة توقف وإضافة مراقبة لأيّ ماكرو في ليبرأوفيس أو أوبن أوفيس OpenOffice باستخدام محرّره الخاص. تنظيم الماكرو في ليبرأوفيسإذا كنت معتادًا على استخدام البرمجة بلغة فيجوال بيسك Visual Basic for Applications -اختصارًا VBA- في مايكروسوفت إكسل Excel، فلا بدّ أنك تعرف أن شيفرات فيجوال بيسك VB الخاصة بالماكرو موجودة في مشروع VB، وإذا أردت تضمين الماكرو ضمن ملف إكسل Excel مثلًا، فيجب أن تحفظه بالتنسيق .xlsm الذي يوضّح احتواء الملف على ماكرو. البنى الافتراضية لملف الماكرو في ليبرأوفيسينشئ ليبرأوفيس افتراضيًا الماكرو ضمن المسار ماكروهاتي My Macros ثم Standard ثم Module1 عند إنشائه لأول مرة، إذ توجد جميع دوال الماكرو الخاصة بك ضمن الوحدة Module1، حيث أنشأنا في مثالنا الدالة my_macro ضمن الوحدة Module1. يحتفظ ليبرأوفيس بجميع شيفرات الماكرو التي أُنشئت ضمن الوحدة Module1 الافتراضية في المسار الآتي: /home/[user name]/.config/libreoffice/4/user/basic/Standardيجب أن يوجد ضمن المسار ملف يسمى Module1.xba يحتوي على دوال الماكرو الافتراضية، حيث يجب أن تكون دالة الاختبار my_macro ومحتوياتها داخل هذا الملف. كيفية إنشاء الماكرو بوصفه جزءا من ملف مكتبيإذا كتبت سابقًا كثيرًا من وحدات الماكرو والدوال باستخدام بنية الملفات الافتراضية السابقة وحفظت الملف، فلن تُحفَظ وحدات الماكرو مع الملف. إذا وزّعتَ هذا الملف أو أرسلته إلى شخص آخر، فلن يتمكن من رؤية وحدات الماكرو عند فتح الملف، لأن محتويات الماكرو تبقى في القرص الصلب حيث كُتِبت أو طُوِّرت شيفرتها. إذا أردت توزيع أو إرسال ملف ليبرأوفيس مثل كالك Calc أو إمبرس Impress أو غيرها مع دوال الماكرو، فيجب عليك إنشاء وحدات الماكرو بطريقة مختلفة، إذ يجب إنشاء الماكرو داخل الملف أثناء إنشاء وحدات الماكرو ومربع الحوار الذي تريد توزيعه بوصفه جزءًا من ملف ليبرأوفيس. افتح مربع الحوار من قائمة أدوات Tools ثم ماكرو Macros ثم تنظيم الماكرو Organize Macros ثم بيسك LibreOffice Basic. حدّد اسم الملف من قائمة "الماكرو من Macro From" داخل مربع الحوار، ثم اضغط "جديد New"، حيث سيطلب ليبرأوفيس كتابة اسم الوحدة Module. يستخدم ليبرأوفيس الوحدة "Module1" افتراضيًا، لذلك اكتب أي اسم تريده واضغط على "موافق" (استخدمنا اسم الوحدةdebugpoint_demo_module). سيفتح بعد ذلك محرّر الماكرو الذي يحتوي الوحدة الجديدة والماكرو ضمن ملف عملك. يمكنك الآن كتابة العديد من وحدات الماكرو التي تريدها ضمن الوحدة الحالية وحفظ ملف ليبرأوفيس الحالي، ثم ستُحفَظ جميع وحدات الماكرو ومحتوياتها مع الملف ويمكنك بسهولة مشاركة الملف أو توزيعه على المستخدمين. تُخزَّن وحدات الماكرو Macros ضمن الوحدات Modules في ليبرأوفيس، والوحدات هي جزء من المكتبات Libraries والمكتبات هي جزء من الحاويات Containers كما هو موضح أدناه: تحميل الوحدة التي يعرفها المستخدميفترض ليبرأوفيس أن جميع مربعات الحوار والمتغيرات موجودة في الوحدة "Module1" وفقًا للتنظيم الافتراضي، لكننا أنشأنا وحدة جديدة بالاسم "debugpointdemomodule" التي تبقى مع الملف، حيث يجب تحميل الوحدة قبل البدء في كتابة شيفرات الماكرو. يمكنك تحميل الوحدات التي يعرّفها المستخدم باستخدام التابع التالي: ThisComponent.BasicLibraries.LoadLibrary("debugpoint_demo_module")إذا أنشأتَ مربع حوار -"my_dialog" مثلًا- أسفل ملف العمل نفسه، فيمكنك إنشاء كائن الحوار Dialog باستخدام ما يلي: Dim oDialog1 As Object oDialog1 = CreateUnoDialog(DialogLibraries.Standard.my_dialog) تفعيل الماكرو في ملفات ليبرأوفيسقد يواجه المستخدم الخطأ الموضح أدناه عند فتح الملف على نظام آخر بعد توزيع ملف ليبرأوفيس أو مشاركته مع الماكرو الموجود فيه، حيث يُعطَّل تنفيذ الماكرو افتراضيًا في ليبرأوفيس لأسباب أمنية. انتقل إلى قائمة أدوات Tools ثم خيارات Options ثم ليبرأوفيس LibreOffice ثم الأمن Security ثم أمان الماكرو Macro Security، حيث يُضبَط أمان الماكرو على الخيار "عالٍ high"، ولكن يمكنك تغييره إلى الخيار "منخفض low" إذا كنت واثقًا من مصدر الماكرو، ثم يمكنك إعادة محاولة تنفيذ الماكرو. ترجمة -وبتصرُّف- للمقالات Writing a Macro in LibreOffice Calc – Getting Started و Debugging LibreOffice Macro Basic using Breakpoint and Watch و LibreOffice Macro Organization لصاحبهما Arindam. اقرأ أيضًا |
72,468 | لماذا يتخلى الرجل عن المرأة التي أحبها ويرحل بصمت؟ | تتفاجأ العديد من النساء بإنهاء الشريك للعلاقة دون سابق إنذار. وتسأل المرأة: لماذا رحل بصمت ودون أن ينطق بشيء. دراسة علمية على مر عد سنوات توضح هذا التصرف. |