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



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

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

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

نوع المُحتوى


التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

التصنيفات

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

أسئلة وأجوبة

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

التصنيفات

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

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

  1. مقدمة إنّ azk عبارة عن أداة خفيفة مفتوحة المصدر، تستطيع استخدامها لتنسيق بيئات التطبيقات. هل سبق أن كان لديك تطبيق يعمل على محطة العمل المحليّة الخاصة بك، ووجدت أنّ الإعدادات تختلف كليًا عندما تقوم بنشر التطبيق على مخدّم إنّتاج. تُقدّم هذه المقالة أداة تنسيق، تُدعى azk، والتي يتم استخدامها حاليًا من قبل هذه التطبيقات، وهي قابلة للاستخدام لأكثر من ذلك بكثير. عندما تقوم بنشر تطبيق جاهز للعمل مع azk، فإنّه يمكنك بسهولة إنّ تشغلّه محليًا أو في مخدّم إنّتاج. لا يجعل azk تشغيل التطبيق فقط سهلًا و سريعًا بل كل تبعياته أيضًا، بما فيها نظام التشغيل المطلوب، اللغات، أطر العمل، قواعد البيانات و التبعيات الأخرى (المهام الثقيلة، الطويلة، التكرارية، الأكثر عرضة للخطأ)، سواء كنت تعمل في بيئة محلية أو على مخدم. إنّ غرض هذه المقالة، هو إظهار كيف يعمل azk كأداة تنسيق، باستخدام تطبيق Rails بسيط يُدعى Stringer كمثال. يهتم azk بالعديد من التفاصيل خلف الكواليس، لجعل عملية التنسيق أسهل. لهذا، تحوي هذه المقالة على العديد من الخطوات الاختيارية، التي ليست بضرورية لإعداد التطبيق المثال، ولكنها تشرح آلية عمل azk. سوف نقوم بتشغيل التطبيق من شفرة المصدر على جهاز حاسوب محلي، ثم نشره على مخدّم، و من ثم سنقوم ببعض التغييرات المحليّة، وبعدها نقوم بنشر هذه التغييرات، و من ثم سنقوم بعميلة الإرجاع. بعد إتمام هذه المقالة، سوق تحصل على فكرة جيدة حول كيفية عمل azk كأداة تنسيق سير عملية التطوير والنشر الخاصة بك. كيف يعمل؟ بدايةً، يُنسق azk بيئة التطبيق على جهاز الحاسب المحلي الخاص بك. حالما يعمل التطبيق لديك محليًا، سيقوم azk أيضًا بتنسيق نشره إلى المخدّم Droplet الخاص بك. طالما يُشغل azk التطبيقات من شفرة المصدر، فإنّك تستطيع أن تعمل مع التطبيق محليًا (إذا كنت ترغب بذلك)، و من ثم تقوم بنشره أو استرجاعه مرة ثانية بدون أيّة خطوات إضافية خاصة. يعزل azk البيئات التي تستخدم الحاويات، ولهذا فمن الآمن تشغيل التطبيقات على جهاز الحاسب المحلي الخاص بك. يعمل azk مع كل من المشاريع الجديدة، تلك التي تبدأ منذ الصفر، أو مع الشيفرات الموجودة سابقًا. استخدام azk مع تطبيقات مخصّصة باستخدام القائمة الحالية من التطبيقات التي تم تشكيلها مسبقًا للعمل مع azk كأمثلة، و مع قليل من العمل الإضافي ستستطيع إعداد أي مشروع للعمل مع azk. للقيام بهذا أضف الملف Azkfile إلى مشروعك. Azkfile عبارة عن ملف رئيسي manifest، يحتوي العناصر الضرورية لتشغيل التطبيق، و يقوم بتلخيص علاقاتها فيما بينها (نظام التشغيل، اللغات، قواعد البيانات، … ). فوائد إضافة الملف Azkfile إلى مشروعك: استخدام azk لأتمته إعداد البيئة لمشروعك محليًا و عند النشر. يستطيع الأشخاص الأخرين، الذين يرغبون بنشر تطبيقك، القيام بهذا باستخدام azk. المتطلبات الأساسية للمتابعة مع هذه المقالة، فإنّك ستحتاج إلى جهاز حاسوب يقوم بتشغيل أية من أنظمة التشغيل التالية(64 - بت) للبيئة المحليّة الخاصة بك: Mac OS X 10.6 (Snow Leopard) أو أي إصدار لاحق. Ubuntu 12.04، 14.04 or 15.10 Fedora 21 or 22 أيضاً ستحتاج إلى إنّ تكون قادر على تشكيل git commits. يحتاج جهاز حاسوبك إلى تثبيت Git. إنّظر إلى هذه السلسلة لاستخدام Git من أجل التعليمات الخاصة لأنظمة التشغيل Linux، أو قم بزيارة صفحة تحميل Git. تأكّد من قيامك بتشغيل الأوامر المقترحة : git config --global user.email "you@example.com" git config --global user.name "Your Name" وذلك قبل القيام بقراءة المقالة، انظر الروابط السابقة للحصول على التفاصيل حول Git. لاحظ أنّه لا يوجد ضرورة للحصول على مخدّم فعّال Droplet في هذا الدرس. سيقوم azk بتشكيل واحد باستخدام واجهة التطبيق DigitalOcean’s API. يُكلف نشر مخدم Droplet المال، ومن أجل هذا الدرس ستقوم بنشر مخدم Droplet، يحوي افتراضيًا فقط واحد جيجابايت. مستخدمي Linux : تثبيت الـ Docker: إذا كنت تستخدم نظام تشغيل ( Linux Ubuntu أو Fedora)، ستحتاج لتثبيت الـ 1.8.1 Docker أو أي اصدار لاحق، وذلك لاستخدامه كبرمجية حاويّة. إنّ تشغيل سكريبت تثبيت Docker، هي إحدى طرق تثبيته. (بشكل عام، كُن متأكد من فهمك ماذا يفعل السكريبت، وذلك قبل القيام بتشغيله): $ wget -nv https://get.docker.com/ -O- -t 2 -T 10 | bash إذا كنت ترغب بتعلّم المزيد حول تثبيت Docker في نظام التشغيل Linux، تفحّص تعليمات التثبيت المتاحة في ملفات التوثيق الرسمية. مستخدمي Mac OS X : تثبيت الـ VirtualBox: ستحتاج إلى VirtualBox 4.3.6 أو أي اصدار لاحق، وذلك لاستخدامه كبرمجيّة حاويّة. لتثبيت VirtualBox، حمّل رزمة تثبيت Virtualbox المناسبة من صفحة التحميل الرسميّة. الخطوة الأولى: تثبيت azk محليًا سنقوم بتثبيت azk، باستخدام سكريبت تثبيت المشروع. تأكد من فهمك ماذا يفعل أي سكريبت، قبل تنفيذه في نظامك. إذا كان لديك للتو نسخة قديمة مثبتة من azk، فإنّك تستطيع استخدام سكريبت التثبيت لتحديث الـ azk. وإلا قُم بتفحص إرشادات تثبيت الحزم لنظم التشغيل المدعومة. تثبيت azk على Linux: إذا كنت تستخدم نظام التشغيل (Linux Ubuntu أوFedora)، قُم بتشغيل هذا الأمر في الوحدة الطرفية، وذلك لتثبيت azk باستخدام سكريبت المشروع. نحن ننصح بتدقيق أي سكريبت قبل تشغيله على نظامك: $ wget -nv http://azk.io/install.sh -O- -t 2 -T 10 | bash بعد إتمام التثبيت، قُم بتسجيل الخروج، ومن ثم تسجيل الدخول مرة أخرى، وذلك لجعل كل التعديلات فعّالة. يتجلى سبب تسجيل الخروج، في أنّه خلال عملية التثبيت، سيتم إضافة مستخدمك إلى مجموعة الـ docker. تُعد هذه الخطوة مطلوبة، وبذلك نستطيع استخدام الـ Docker بدون أن تكون المستخدم الأساسي (root). أي عليك الخروج من الجلسة الحالية، لتحصل على كل التعديلات المضافة. إذا كنت ترغب بتعلم المزيد حول مجموعة الـ Docker، فإنّك تستطيع تفحص التوثيق الرسمي لـ Docker. تثبيت azk على Mac OS X: قُم بتشغيل الأمر التالي في الوحدة الطرفية، وذلك لتثبيت azk باستخدام سكريبت المشروع. نحن ننصح بتدقيق أي سكريبت قبل تشغيله على نظامك: $ curl -sSL http://www.azk.io/install.sh | bash الخطوة الثانية: التحقق من تثبيت azk حالما يصبح تثبيت azk كامل، قُم بتشغيل الأمر الذي في الأسفل، وذلك للتحقق من نجاح عملية التثبيت: $ azk version يتحقق هذا الأمر من نسخة الـ azk المثبّتة. إذا أعاد هذا الأمر رقم النسخة (على سبيل المثال azk 0.17.0 أو أي إصدار لاحق)، فالوضع جيد و تستطيع الانتقال إلى الخطوة التالية. تهانينا لك على تثبيت azk في البيئة المحليّة الخاصة بك. إذا لم يكن الأمر كذلك، فاقرأ أدناه أحد أقسام تحرّي الأخطاء وإصلاحها للحصول على المساعدة. استكشاف الأخطاء وإصلاحها في عملية تثبيت azk في Linux: دعونا نتفحص نسخة الـ Docker المثبّتة، وذلك عن طريق تشغيل الأمر: $ docker version ستحتاج إلى الإصدار 1.8.1 أو أحدث. على كل حال، إذا حصلت على رسالة خطأ، فهذا يعني لم تحصل حتى الآن على تثبيت Docker، تتبع إرشادات التثبيت الخاصة بنظام التشغيل في ملفات توثيق Docker. بعد قيامك من التأكد من حصولك على النسخة المثبّتة المناسبة من Docker، قُم بتشغيل الأمر التالي كمستخدم sudo و ذلك للتأكد من أنّ مستخدمك في مجموعة docker: $ id -Gn إذا كانت قائمة المجموعات تتضمن docker، هذا يعني أنه تم إعداده بشكل صحيح. و إلا، إذا لم تحصل على الكلمة docker في قائمة المجموعات، قُم بتشغيل هذا الأمر لإضافة مستخدمك إلى المجموعة: $ sudo usermod -aG docker $USER ومن ثم قُم بتسجيل الخروج، و تسجل الدخول مرة أخرى. تحقق من الأمر id –Gn مرة أخرى للتأكد من أنّه يُعيد قائمة المجموعات مع كلمة docker بينهم. إذا كانت هذه الإرشادات غير كافية لجعل الـ Docker يعمل بالشكل المناسب (على سبيل المثال، لا تزال غير قادر على تشغيل أمر docker version بشكل صحيح)، يّرجى الرجوع إلى تعليمات تثبيت Docker. استكشاف الأخطاء وإصلاحها في عملية تثبيت azk في Mac OS X: تأكّد من تثبيت VirtualBox $ which VBoxManage إذا كان هذا يُعيد مسار ملف (مثل، usr/local/bin/VboxManage/)، فنستطيع المضي قُدمًا. و إلا، إذا كان يُعيد رسالة " not found "، هذا يعني ليس لديك تثبيت VirtualBox. في هذه الحالة، قُم بتحميل و تثبيت رزمة تثبيت VirtualBox من الموقع الرسمي لهم. الخطوة الثالثة (اختيارية): التعلّم حول التطبيق التجريبي Stringer لقد قُمنا باختيار Stringer كتطبيق تجريبي لهذه المقالة، وذلك لأنه تطبيق بسيط، وتم إعداده للعمل مع azk. وهو عبارة عن تطبيق Rails مع حالة استخدام محددة جيدًا: قارئ RSS أساسي. المزيد حول Stringer تُقدم بعض مواقع الأخبار أيضًا محتواها في صيغة تغذية RSS. هذه عبارة عن صيغة ملف XML قياسية، تُمكن الناشرين من نشر المعطيات بشكل اتوماتيكي. قارئ RSS هو عبارة عن برنامج مُستخدم للاشتراك، وتقديم محتوى الـ RSS. تُزيل عملية الاشتراك في تغذية RSS لموقع ما، حاجة المستخدمين للتفحص اليدوي للموقع للحصول على المحتوى الجديد. حيث يستطيع المستخدمين تشكيل قائمة بالتغذيات المُشترك فيها، وتخصيص محتواهم على قارئ RSS (عادةً على شكل قائمة مرتبة ترتيبًا زمنيًا) الخطوة الرابعة (اختيارية): إعداد تطبيق مُخصّص لاستخدام azk طالما أنّ التركيز الأساسي لهذه المقالة هو على إظهار كيفية عمل azk للتطبيقات، التي تملك للتو تفاصيل البيئة المنصوص عليها للعمل مع azk، فعلى المدى الطويل هذه الأداة، هي أكثر فائدة عندما يمكنك استخدامها لنشر أي تطبيق. لهذا، خُذ نظرة عن كيفية مقارنة هذه النسخة من Stringer مع النسخة الأساسية من Stringer في المستودع. تملك نسخة azk فقط إضافتين اثنتين إلى نسخة Stringer الأصلية: ملف Azkfile، الذي يزّود بمعلومات البيئة لـ azk زر azk لتشغيل المشروع Run Project يمكن تعلم المزيد حول جعل azk يعمل مع تطبيقات أخرى، وذلك عن طريق ملفات توثيق azk حول ملف Azkfile و زر تشغيل المشروع Run Project. تالياً، سوف نرى كيف يبدو التطبيق الصديق لـ azk في GitHub. الخطوة الخامسة (اختيارية): استخدام زر تشغيل المشروع لـ azk على GitHub إنّ جزء الممارسات الأفضل من azk من أجل مشاريع GitHub، هو التوضيح الجيد لكيفيّة عمل هذا المشروع مع azk. لهذا، بدلاً من إظهار فقط أمر الـ azk في وسط ملف readme للمشروع، فإنّ المشروع الذي يستخدم azk يستطيع استخدام زر تشغيل المشروع، وذلك للعزل البصري لأمر الـ azk. يستخدم Stringer هذا الزر. قُم بزيارة قسم التشغيل المحلي لنسخة azk المتشعبة من Stringer. أضغط زر تشغيل المشروع Run Project. في أول مرة تضغط فيها زر تشغيل المشروع، سوف ترى شرح بسيط عن ماذا يجري. عندما تصبح جاهزا للمضي قُدماً، انقر على الزر OK، DISMISS في أسفل الشرح. بعدها سيتم توجيهك إلى صفحة مع أمر azk لمشروع Stringer. $ azk start -o run-project/stringer يمكنك دائماً أنّ تنقر على إشارة ما هذا؟ على الزاوية العليا اليُمنى، وذلك لترى الشرح مرّة أخرى. في مركز الشاشة، يوجد صندوق أوامر مع ثلاث علامات تبويب: curl، wget، azk. طالما لدينا للتو مُثبت azk فتستطيع استخدام علامة التبويب azk. هذا هو الأمر، الذي سنستخدمه في الخطوة التالية للتشغيل الفعلي لـ Stringer. الخطوة السادسة: تشغيل Stringer محليًا في هذا القسم سنستخدم azk لتشغيل Stringer على محطّة العمل المحليّة. دعونا نتأكد أنّنا في المسار الرئيسي home على جهاز حاسوبنا المحلي (إذا قمت باستخدام مجلد تثبيت مختلف، تذكر فقط تغيير الأوامر إلى مسارك المختار): $ cd ~ أمضي قُدمًا، و قم بتشغيل الأمر التالي على حاسوبك المحلي، وذلك لتشغيل Stringer: $ azk start -o run-project/stringer طالما هذه هي أول مره تقوم بها بتشغيل azk، سيطلب منك قبول بنود الخدمة. و يجب أنّ تظهر رسالة كالتالية: ? ========================================================================= Thank you for using azk! Welcome! Before we start، we need to ask: do you accept our Terms of Use? http://docs.azk.io/en/terms-of-use ========================================================================= (Y/n) اضغط على Y إذا كنت موافق أو N إذا كنت غير موافق. و من ثم اضغط على ENTER لتأكيد جوابك. في حالة عدم موافقتك، فلن تتمكن من استخدام azk. و اخيراً، سيقوم azk أوتوماتيكيًا بتحميل الشفرة المصدر لـ Stringer، إضافة إلى أنّ الملف المسند Azkfile سيقوم بتشغيل هذا الشفرة في بيئة معزولة و آمنة في حاسوبك المحلي. ومن ثم سيتم سؤالك فيما إذا كنت ترغب ببداية تشغيل عميل الـ azk. ? The agent is not running، would you like to start it? (Y/n) العميل هو عبارة عن مُركب azk، الذي يقوم بإعداد Docker (على نظام التشغيل Linux )، أو بإعداد الآلة الافتراضيّة VirtualBox (على نظام التشغيل Mac OS X). اضغط ENTER للجواب “Yes” (الخيار الافتراضي). في أول مرة تُشغل فيها العميل، سيقوم azk بتشغيل إعداداته. يقوم الإعداد بالعديد من الأشياء وراء الكواليس، بما في ذلك توليد الملف /etc/resolver/dev.azk.io، الذي يحوي إعدادات نظام أسماء النطاقات DNS، لتصميم العناوين التي تنتهي باللاحقة dev.azk.io. يستخدم azk هذه اللاحقة عند تشغيل التطبيقات لاستخدام العناوين القابلة للقراءة بدلاً من الاستخدام اليدوي للعناوين من الشكل http://localhost:PORT_NUMBER . أيضاً هذا يقوم بتجنب تعارض أرقام المنافذ بين التطبيقات المختلفة. بشكل أساسي يقوم هذا بنفس الشيء عند تحرير ملفك /etc/hosts لإعادة توجيه اسم نطاق محليًا. إذا حصلت على رسالة من الشكل التالي: ? Enter the vm ip: (192.168.50.4) فإنّك تستطيع إدخال أي عنون IP محلي، ترغب بتشغيل التطبيق عليه. يجب أن تكون الحالة الافتراضية مناسبة لجميع الحالات. للموافقة على هذا، فقط اضغط ENTER. لإتمام إعدادات عميل الـ azk، سيتم سؤالك عن كلمة المرور الخاصة بالمستخدم sudo (لمستخدمي نظام التشغيل Mac OS X، هي عبارة عن كلمة مرور المُشرف admin). الآن سيبدأ azk بالعمل. سوف ترى أنّ azk يُحمّل العناصر المُسردة في الملف Azkfile (على صيغة صور Docker ). من الممكن أن يستغرق تحميل هذه الصور أول مرة عدة دقائق (حوالي 10 دقائق أو أقل). حالما يُكمل azk الإعداد، سيقوم مُتصفحك بشكل أتوماتيكي بتحميل شاشة البدء لـ Stringer على حاسوبك المحلي. كما تستطيع إنّ ترى، أنّه يستخدم اسم نطاق محلي DNS، و هذا التطبيق مرئي على http://stringer.dev.azk.io. و تستطيع الوصول إلى التطبيق بشكل يدوي عبر الذهاب إلى http://stringer.dev.azk.io . إذا كنت ترغب بإعداد كلمة المرور و بداية التشغيل باستخدام التطبيق، فإنّك تستطيع فعل ذلك. نحن نرغب فقط برؤية أنّ azk يستطيع تشغيل Stringer محلياً. والآن طالما لديك Stringer يعمل على الحاسوب المحلي، فتستطيع نشره من جهاز الحاسوب لديك إلى المخدّم Droplet. الخطوة السابعة: الحصول على الرمز DigitalOcean API Token قبل أن نتمكن من نشر Droplet من azk، فإنّنا نحتاج إلى رمز API token. يُعطي هذا الرمز الإذن لـ azk لنشر مخدّم جديد على حسابك. في أول مرّة تقوم بها بتشغيل azk من هذه البيئة باستخدام هذا الرمز، سيتم نشر واحد جيجابايت مخدّم جديد Ubuntu 14.04 Droplet . و ستستخدم عمليات النشر اللاحقة من نفس البيئة المحليّة، نفس المخدّم المفرد Droplet. اتّبع الإرشادات من قسم المراجع المرتبطة بالمقالة حول كيفية تشكيل رمز الوصول الشخصي. و يجب أن يمتلك الرمز المُشكّل تصاريح الكتابة القراءة. قُم بنسخ المحارف الأربعة و الستين بالترميز الست عشري لرمزك، بشكل مشابه للتالي: Example API Token A17d6a72566200ad1a8f4e090209fe1841d77d7c85223f769e8c5de47475a726 سوف ترى هذا الرمز النصيّ فقط مرة واحدة، لذلك قُم بنسخه إلى مكان آمن. (تذكّر، إذا تم اختراق هذا الرمز، فإنّه يمكن استخدامه للدخول إلى حسابك، لذلك حافظ عليه خاصًا). من أجل الإرشادات أسفلا، تذكر استبدال الرمز المثال بالرمز الحقيقي الخاص بك. اذهب إلى مجلد Stringer: $ cd ~/stringer احفظ رمز الوصول الشخصي في ملف ستدعوه env. للقيام بهذا، قُم بتشغيل أمر تشكيل ملف (لا تنسى استبدال الرمز): $ echo "DEPLOY_API_TOKEN=a17d6a72566200ad1a8f4e090209fe1841d77d7c85223f769e8c5de47475a726" >> .env يجب إنّ يبدو محتوى الملف env. بالشكل التالي: DEPLOY_API_TOKEN=a17d6a72566200ad1a8f4e090209fe1841d77d7c85223f769e8c5de47475a726 الخطوة الثامنة (اختيارية): التعلم حول مفاتيح SSH ليس عليك إنّ تقوم بأي شيء لإعداد مفتاح SSH من أجل azk، ولكن من المفيد معرفة الكيفية التي يستخدم فيها azk هذا المفتاح. يستخدم azk مفتاح SSH للوصول إلى المخدّم Droplet. إذا كان لديك للتو مفتاح SSH، فإنّ azk سيستخدمه. لرؤية فيما إذا كان لديك مفتاح SSH على جهاز الحاسوب لديك، شغّل: $ ls ~/.ssh/*.pub إذا قام بإرجاع رسالة “not found”، فهذا يعني إنّه ليس لديك أيّة مفاتيح SSH على جهاز الحاسوب. في هذه الحالة، سيولّد azk بشكل أتوماتيكي مفتاح SSH جديد، ليتم استخدامه حصريًا لنشر أي تطبيق جديد من جهاز الحاسوب لديك. سيقوم azk بتوليد مفتاحه في الذاكرة المحجوزة له، ولن يقوم بأيّة تعديلات على مسارك ~/.ssh. إذا كنت ترغب بتفحص المفتاح العام المولّد، يمكنك تشغيل الأمر التالي بعد نشر التطبيق الأول: $ azk deploy shell -c "cat /azk/deploy/.config/ssh/*.pub" الخطوة التاسعة: النشر مع azk بشكل افتراضي، سيولد azk مخدّم DigitalOcean Droplet واحد جيجابايت، يُشغّل النظام Ubuntu 14.04، وذلك من أجل نشر تطبيقك. إذا كنت ترغب بنشر Droplet بمواصفات مختلفة، فيمكنك تغيير الإعدادات في خصائص envs لنظام deploy في الملف Azkfile.js . من أجل الإرشادات الإضافية أشر إلى ملفات توثيق حول نشر azk . أولاً، اذهب إلى مسار Stringer ( أو إلى مسار تطبيقك): $ cd ~/stringer ومن ثم، ابدأ عملية النشر، فقط قُم بتشغيل: $ azk deploy إنّ الأمر azk deploy، هو الأمر الذي ستقوم بتشغيله معظم الأوقات، عندما تستخدم azk لتنسيق تطبيقك. من الممكن أن تستغرق أول عملية نشر فترة معينة (حوالي عشر دقائق)، حتى يقوم azk بكل العمل. بشكل مخصص، على azk القيام بما يلي: تحميل عناصر الدعم ( صورة Docker للنشر) تشكيل و إعداد الـ Droplet رفع شفرة المصدر للتطبيق إلى المخدّم Droplet تشغيل التطبيق بعدها ستستغرق كل عملية نشر جديده لهذا التطبيق من جهاز الحاسوب لديك مدة زمنية قليلة (حوالي 30 ثانية أو أقل)، هذا لان معظم الخطوات الطويلة جاهزة للتو. إذا كان مفتاحك SSH محمي بكلمة مرور، فسيكون مطلوباً وقت أكبر لعملية النشر. فقط قُم بكتابة كلمة المرور للمفتاح SSH، و أضغط زر ENTER في كل مرة تظهر رسالة كالتالية: Output Enter passphrase for ~/.ssh/id_rsa: سيظهر خرج الوحدة الطرفية بعض الإجراءات المُتخذة على النظام البعيد، تنتهي برسالة النشر الناجحة App successfully deployed at http://your_server_ip. قُم بزيارة الموقع http://your_server_ip لعرض التطبيق المُستضاف على الخادم الخاص بك. من الآن، يُمكنك تغيير شفرة التطبيق على جهاز الحاسوب الخاص بك، و يمكنك اختباره محلياً، و يمكنك نشر التغييرات على المخدّم Droplet بواسطة الأمر azk deploy. الخطوة العاشرة: تعديل Stringer لتوضيح سهولة استخدام azk لنشر تطبيق، للتخصيص، أو للتحكم في النسخة، دعونا نقوم بعدد من التغييرات على صفحة الاشتراك Stringer، و من ثم نقوم بإعادة نشر التطبيق. تأكد من كونك على مسار Stringer: $ cd ~/stringer دعونا نقوم بتعديل الملف app/views/first_run/password.erb، الذي هو عبارة عن الصفحة الحاوية على النص لصفحة الاشتراك الأولى. استخدم nano أو محرر النصوص المفضل لديك: $ nano ~/stringer/app/views/first_run/password.erb هنا نقوم بإضافة السطر الإضافي، الذي يقول "! It’s easy with azk ": app/views/first_run/password.erb <div class="setup" id="password-setup"> <h1><%= t('first_run.password.title') %> <span class="orange"> <%= t('first_run.password.anti_social') %></span>.</h1> <h2><%= t('first_run.password.subtitle') %></h2> <h2>It's easy with azk!</h2> <hr /> . . . </div> قُم بالحفظ و الخروج من محرر النصوص. إذا كنت تستخدم nano، اضغط CTRL+O للحفظ، و CTRL+X للخروج. طالما إنّ Stringer مُعد افتراضياً للعمل في وضع الانتاج، لذلك فإنّ إعادة تحديث صفحة المتصفح ليس بكافٍ لتشغيل التغييرات. بل قُم بإعادة تشغيل التطبيق من azk: $ azk restart stringer -o يجب على علامة التبويب الجديدة للمتصفح أن تفتح النسخة الجديدة من Stringer. أسفل النص الافتراضي مباشرةً “There is only one user: you”، يجب الآن أن يكتب “!It’s easy with azk”. الخطوة الحادية عشر: إعادة نشر Stringer الآن، دعونا نُودع (commit) التغييرات داخل نسخة نظام التحكم، من أجل أن نستطيع نشرها. $ git add app/views/first_run/password.erb $ git commit . سيظهر لك محرر نصوص (على الأرجح nano أو vim). أدخل رسالة إيداع commit، مثل It is easy with azk. سيتم استخدام هذه الرسالة commit لتسمية الإصدارات من تطبيقك داخل azk، لذلك اختر الرسالة التي من شأنها تحفيز ذاكرتك، إذا كنت بحاجة إلى الرجوع إليها في وقت لاحق. احفظ و أغلق رسالة الـ commit. إذا حصلت على الخطأ : fatal: empty ident name (for <sammy@azk.(none)>) not allowed عندها قُم بتشغيل أوامر الإعدادات المقترحة من أجل Git لإعداد عنوان إيميل و اسم (المزيد من التفاصيل في قسم المتطلبات الأساسية). لنشر تغييراتك و رفع تشغيل التطبيق على Droplet، قُم بتشغيل: $ azk deploy بعد الانتهاء من ذلك، قُم بالوصول إلى عنوان IP لـ Droplet من متصفحك (مثلاً http://your_server_ip) .عندها يجب أن ترى أيضاً هنا السطر الجديد !It’s easy with azk سيقوم هذا النشر الجديد بتشكيل نسخة جديدة من التطبيق على Droplet. إنّ كل نسخ التطبيق مخزنة، لذلك يمكنك العودة إلى نسخة سابقة ومن ثم إلى الأمام مرّة أخرى. الخطوة الثانية عشر: الرجوع إلى خطوة سابقة للحصول على كل النسخ المتاحة من تطبيقنا على Droplet، شغّل الأمر التالي محليًا: $ azk deploy versions يجب إنّ تكون النتيجة بقائمة من الشكل: Output ⇲ Retrieving deployed versions... ➜ v2 It is easy with azk v1 Merge branch 'master' of https://github.com/swanson/stringer لإرجاع التطبيق إلى نسخة أقدم، فقط قوم بتشغيل: $ azk deploy rollback v1 إنّ المعامل v1 عبارة عن رقم النسخة، الذي يظهر على خرج الأمر azk deploy versions. إذا قمت بتشغيل الأمر بدون هذا المعامل (مثلاً، . azk deploy rollback )، سيرجع عندها التطبيق إلى نسخة سابقة تماماً قبل النسخة الحالية. لتفحص إتمام عملية الرجوع، فقط قُم بتحديث علامة تبويب المتصفح، التي تظهر نسخة المخدم. الآن عليك إنّ ترى التطبيق بدون النص الذي قمنا بإدخاله، أي يجب أن ترى النسخة الأصليّة من التطبيق. وإذا كنت ترغب بالرجوع للأمام، يمكنك اختيار النسخة الأحدث: $ azk deploy rollback v2 أتت التسمية لهذه النسخ من رسائل الـ git commit في الخطوة السابقة. الخاتمة في هذا الدليل التعليمي، لقد استخدمنا تطبيق Rails بسيط، لتوضيح كيف يقوم azk بأتمتة مهام إعداد بيئة تطبيقنا. يجعل هذا من السهل نشر التطبيق نفسه في عدة بيئات. إذا أعجبت بعملية النشر من azk، خُذ بعين الاعتبار استخدامه لمشروعك الخاص، أو إضافة الملف Azkfile إلى fork مشروع أخر مفتوح المصدر. يدعم azk بالإضافة إلى عملية rollback و versions، غيرها من الأوامر الفرعيّة المساعدة، التي تسمح لنا بإنّجاز بعض الإجرائيات الإضافية (مثلاً، الوصول إلى Droplet’s shell عن طريق المفتاح SSH ). ترجمة -وبتصرّف- للمقال How To Deploy a Rails App with azk لصاحبه Felipe Arenales
  2. يشهد الوِب أزهى فتراته هذه الأيام، وأعتقد أنه قد يشهد إعادة هيكلة كلية على امتداد العقد القادم لينقلب من النموذج المبني على رد فعل المستخدم - أي أننا نحن من نزور المواقع ونبحث عن التطبيقات ونثبتّها - إلى نموذج قائم على الحثّ، -أي أن الوِب هو من سيأتي إلينا ليدفعنا إلى اتخاذ إجراء-، وقد يتراجع الوِب إلى الخلفية مثل الخدمات الأساسية كالكهرباء والماء. سيكون الاتجاه العام للمحتوى والخدمات والمنتجات أن تبحث هي عنك وتجدك حين تحتاج إليها وليس العكس، فتنبهك شركة مثل Puma بميعاد شراء حذاء جديد، وتعرض عليك Mariott خيارات للغرف المتاحة حين تفوتك رحلتك، وهكذا سترسل إليك المواقع إشعارات بما يهمك وتطلب منك اتخاذ إجراء. قد تكون شركات مثل فيس بوك وFlipboard أمثلة على بوادر هذا التحول، فهي تخبرك بما تريد أن تعرفه بدلًا من محاولتها تخمين ذلك، ففيس بوك يدفع إليك سيلًا من المعلومات المفصّلة لك خاصةً، تخبرك بما يحدث مع أصدقائك وعائلتك كي تظلّ على اتصال بهم. ويجعلك Flipboard تتصفح المحتوى مرشّحًا في مكان واحد، بدلًا من بحثك أنت في مصادر متعددة بطريقة يدوية. كذلك فإن التبني المتزايد لتجارب الاستخدام المرتكزة على الإشعارات هو أحد الأمثلة على بوادر ذلك الانقلاب في نموذج الوِب الجديد، فمركز الإشعارات في هاتفك يزوّدك بسيل من المعلومات التي تهمّك، وقد صارت تفاعلية مؤخرًا بحيث قد تحجز تذكرة طائرة دون الدخول إلى تطبيق السفر، أو تشتري منتجًا دون زيارة الموقع. إن ما يحتاجه الناس في الواقع هو أن يتلقوا المعلومات بدلًا من البحث عنها بأنفسهم، فهذا يوفر عليهم وقتًا وجهدًا، وبهذا تنجح تجربة الاستخدام المحسّنة على المدى الطويل، فإن “أرني ما أحتاج إلى رؤيته” أفضل من “دعني أبحث كي أرى ما يمكنني إيجاده”، بل وأكثر فائدة أيضًا. ليس من الصعب تخيّل كيف ستمتد إلى مناطق أخرى في الوِب، فطريقة عمل التجارة الإلكترونية لا تختلف هذه الأيام عن زيارة متاجر حقيقية أو استعراض مئات المنتجات في أحد أقسام المتاجر، فليس الافتراضي أن يكون علينا البحث طويلًا عما نريد، بل سيكون الأمر أشبه بمشاهدة عرض أزياء، باستثناء أن هذا العرض كل شيء فيه مفصّل على مقاسنا وتفضيلاتنا الشخصية. أريدك أن تراقب خدمات تجارية مثل Trunk Club أو Stitch Fix، فقد تكون نهاية مراكز التسوق والمتاجر التقليدية على يد الانقلاب الذي أتوقعه للوِب. فقد تمضي بنا عشر سنين ثم ننظر إلى هذا اليوم وندرك أن اكتشاف المحتوى عن طريق البحث قد توقف، وقد لا تختفي تجارب الاستخدام المبنيّة على ترقّب فعل المستخدم على نحو كامل، لكن تجارب الاستخدام الجديدة المبنية على الحثّ ستثبت كفاءتها. إني أعلم أن البعض لن يعجبه الأمر في البداية، لكن اعلم أن مجالات مثل الرعاية الصّحية تخوض تحوّلًا مشابهًا إلى الحثّ، فبدلًا من الذهاب إلى الطبيب ستكون لدينا أنظمة متصلة بالشبكة وقادرة على التشخيص الذاتي، وما التطبيقات التي تتابع بها نشاط جسدك في ساعتك الذكية إلا بوادر هذا التحوّل الذي سيفتح فرصًا للإبداع في الرعاية الصحية. وكذلك فإن التعليم قد خطا أشواطًا واسعة في التحوّل إلى نموذج الحثّ، فلم تبحث بنفسك عن مدرسة وعن فصل دراسي في حين أن التدريب والعلم يأتيان إليك؟ فما أراه الآن هو بداية تحول يصل بين نوعين من الاقتصاد، الأول هو اقتصاد يحاول توقّع طلبات المستهلك ويبني منتجات عامة أو وفق معايير محددة، وبكميات كبيرة، ويدفع تلك المنتجات إلى السوق عبر قنوات توزيع عالمية. بينما يبني الاقتصاد الثاني منتجات عالية التخصص بناء على طلب المستهلك، وتُسَلَّم إلى المستهلكين من خلال علاقات ثنائية وتجارب شخصية حقيقية. إن هذا النموذج الجديد تحول كبير يشوّش على نماذج ربحية قائمة في الإعلانات ومحركات البحث ومتاجر التطبيقات، إضافة إلى المتاجر الحقيقية أو الافتراضية، أولئك الذين يواجهون خطر التخلّي عنهم كوسطاء في ظلة انحسار جدوى سلسلة التوزيع الحالية، وهذا مؤشر على تحوّل قوي قد يُخرج الكثيرين من ساحة الوِب قريبًا إن لم يتكيفوا مع الجديد. ترجمة - بتصرف - للمقال The Big Reverse of the Web لصاحبه Dries Buytaert. حقوق الصورة البارزة محفوظة لـ Freepik
  3. Android هو نظام تشغيل مفتوح المصدر مبني على نواة لينكس مع إضافة بعض التعديلات عليها ليعمل النظام على الهواتف المحمولة والحواسيب اللوحية، وغيرهما من الأجهزة الذكية المختلفة، ويتم تطوير إصدارات النظام بواسطة شركة جوجل. الطبقات الرئيسية المكونة لنظام أندرويد الصورة التالية توضح الهيكل الداخلي للأندرويد والطبقات الرئيسية المكونة لنظام التشغيل. ينقسم نظام التشغيل إلى خمس طبقات وظيفتها كالآتي: طبقة التطبيقات Application Layer (الطبقة العلوية) وهي الطبقة التي نتعامل معها دائمًا كمستخدمين لنظام التشغيل، فهي تحتوي على تطبيقات النظام والتطبيقات التي نقوم بتحميلها من المتجر -وهي الطبقة التي سيعمل فيها تطبيقك في آخر هذا الدرس-، أمثلة على ذلك تطبيق الاتصال وتطبيق البريد الإلكتروني وتطبيق المتصفح. الطبقة الخاصة ببيئة عمل التطبيقات Application Framework Layer تحتوي تلك الطبقة على مكتبات بُنيت بلغة الجافا خصّيصًا لنظام تشغيل أندرويد وتوفر هذه المكتبات طرق الوصول إلى الموارد الخاصة بالهاتف مما يجعل تطوير التطبيقات أسهل -وهي الطبقة التي سنتعامل معها كمطوري تطبيقات للأندرويد- وأمثلة على ذلك: View System: وهي مكتبة تحتوي على العناصر اللازمة لإنشاء واجهة المستخدم مثل TextViews و Buttons و Checkboxes و غيرها من العناصر الخاصة بواجهة المستخدم. Notification Manager: تحتوي هذه المكتبة على العناصر اللازمة لإنشاء و إرسال الإشعارات للمستخدم الخاصة بتطبيقك. Telephony Manager: وهي المكتبة المسؤولة عن استقبال و إرسال المكالمات الهاتفية من داخل تطبيقك. Location Manager: وهي المكتبة المسؤولة عن تحديد المواقع باستخدام GPS Sensors المتواجدة بالهاتف. أسفل هذه الطبقة سنجد طبقة خاصة تنقسم إلى جزئين: طبقة المكتبات المطورة بلغة C و ++C (المعروفة باسم Libraries Layer) وتحتوي هذه الطبقة على مكتبات مكتوبة بلغة C لقدرة لغة C على القيام بالمهام القوية بشكل كفء دون إهدار لموارد النظام. أمثلة على ذلك: SQLite: تستخدم للتعامل مع قواعد البيانات. OpenGL|ES: تستخدم للتعامل مع الرسوميات ثنائية و ثلاثية الأبعاد و تستخدم بشكل أكبر مع ثلاثية الأبعاد. FreeType: تستخدم للتعامل مع أنواع الخطوط المختلفة. Media FrameWork: تستخدم للتعامل مع الصيغ المختلفة لملفات الفيديو. Android Runtime و تحتوى هذه الطبقة على مجموعة من المكتبات والتي تجعل المطور قادر على برمجة التطبيقات باستخدام لغة الجافا. كما تحتوى على الآلة الافتراضية (Virtual Machine) المسؤولة عن تشغيل التطبيقات والتي تم تطويرها لكي تعمل على الهواتف المحمولة وتتميز باستهلاكها القليل للموارد من الذاكرة العشوائية والمعالج وبطارية الهاتف وتسمى بـ Dalvik Virtual machine. ويعمل كل تطبيق داخل نسخة خاصة به من الآلة الافتراضية مما يميزها بالأمان فالتطبيق لا يستطيع أن يرى باقي التطبيقات ولا يستطيع الوصول إلى بيانات من داخل الهاتف دون علم المستخدم ومنحه الصلاحيات اللازمة لذلك - تلك الصلاحيات التي يتم منحها للتطبيق عند تحميله من المتجر- لذلك ينصح بالتدقيق فيما يحتاجه التطبيق من صلاحيات وألا تقوم بتحميل تطبيقات ذات صلاحيات زائدة عن حاجة التطبيق لكي يعمل ، وصُممت الآلة الافتراضية بطريقة تجعل أكثر من نسخة من الآلة الافتراضية تعمل معًا بسلاسة وذلك لكي يصبح المستخدم قادراً على تشغيل واستخدام أكثر من تطبيق معًا دون الشعور باختلاف في الأداء. طبقة النواة (Kernel) وهي الطبقة المسؤولة عن التعامل مع العتاد المختلف للهواتف فتحتوي على التعريفات الأساسية الخاصة بهذا العتاد كما توفر طريقة أبسط للطبقة العلوية للوصول لمميزات العتاد وهي نفس نواة لينكس. تعتبر كل طبقة هي حلقة الوصل بينها وبين ما فوقها أو تحتها من طبقات، وكلما أتجهنا للأسفل كلما استُخدمت لغات وطرق أقرب في تعاملها مع العتاد كلغة C أو الأسمبلي مثلاً وكلما صعدنا للأعلى كلما استُخدمت لغات وطرق أسهل للمستخدم وتقدم خدمات غنية له كالجافا مثلاً. إصدارات أندرويد قبل البدء بتطوير التطبيقات ينبغي علينا معرفة ما هي إصدارات أندرويد، سأقوم سريعًا بذكر كافة إصدارات أندرويد المختلفة ورقم الإصدار ورقم الـ API الخاص بها. Cupcake 1.5 API 3 Dount 1.6 API 4 Eclair 2.0 API 5 Froyo 2.2 API 8 Gingerbread 2.3.3 API 10 Honeycomb 3.0 API 11 Ice Cream sandwich 4.0 API 14 Jellybean 4.1 API 16 Kitkat 4.4 API 19 Lollipop 5.0 API 22 Marshmallow 6.0 API 23 بعد أن تعرفنا على إصدارات أندرويد تبقى علينا معرفة عدد مستخدمي كل إصدار منهم لأنه ليس بالضرورة أن يكون أحدث إصدار هو الأفضل لتطوير التطبيقات من أجله، فعدد المستخدمين لهذا الإصدار أحد العوامل المحددة لذلك. تقوم جوجل شهرياً بنشر إحصائيات عن عدد مستخدمي كل إصدار من إصدارات أندرويد ويمكنك معرفتها عن طريق الرسم البياني التالي. لكل إصدار من إصدارات أندرويد مزايا خاصة أُضيفت له لم تكن متوافرة في الإصدارات الأقدم، ولكي تستطيع بناء هذه المزايا في تطبيقك ينبغي اختيار الإصدار الأدنى المناسب لمزايا تطبيقك لأنك تستطيع دعم المزايا الخاصة بالإصدار الأدنى فقط، لذا كلما قمنا بدعم إصدارات أقدم كلما فقدنا المزايا الحديثة وفي المقابل نحصل على عدد مستخدمين أكثر وإذا قمنا بدعم أحدث الإصدارات سوف نحصل على مزايا أكثر وعدد مستخدمين أقل. لذا سنختار الحد الأدنى الذي سنحتاجه من المزايا دون خسارة عدد المستخدمين، وإصدار Jellybean يتيح لك مزايا جيدة واستهداف عدد مستخدمين أكبر لأن تطبيقك سيعمل على كل من Jellybean و kitkat و lollipop و marshmallow وما سيأتي بعد ذلك من إصدارات أحدث وهو كما يتضح في الرسم البياني السابق أكثر من 90% من مستخدمي أندرويد، ولكنه لن يعمل على أي هاتف يعمل بإصدار أقدم من Jellybean. المتطلبات للبدء ببرمجة تطبيقات أندرويد كل ما تحتاجه هو حاسوب يعمل بأي نظام من أنظمة التشغيل الرئيسية -ويندوز أو لينكس أو ماك- لتبدأ معنا هذه الدروس. لا يوجد حاجة لمعرفة سابقة بلغة برمجة فسنتعلم معاً ما نحتاج إليه. هذه الدروس موجهة بشكل أساسي للمبتدئين. البرامج التي سنعمل عليها خلال الدروس القادمة: JDK Android Studio قم بتحميل هذه البرامج وبتثبيتها على جهازك. ملاحظة: ينبغي تثبيت JDK أولاً قبل البدء في تثبيت Android Studio حيث أنه يحتاج إليه عند التثبيت. إنشاء مشروع جديد الآن بعد الانتهاء من تثبيت البرامج اللازمة لتطوير تطبيقات أندرويد دعنا نُنشئ مشروعنا الأول وهو مشروع "أهلاً بالعالم Hello World". قم بفتح برنامج Android Studio واختر Start a new android studio project من القائمة. قم باختيار اسم التطبيق الخاص بك ثم اكتب نطاق موقعك – إن وجد – أو قم بكتابة الاسم كما هو موجود في الصورة وسيتم شرح فائدة هذا الاسم لاحقاً. اختر تطوير التطبيق من أجل Phone and Tablet ثم اختر إصدار Jellybean كإصدار أدنى كما ذكرنا سابقًا. اختر Blank Activity ثم أضغط Next. سنبقي هذه الخانات على حالتها الافتراضية حيث يمكننا تغييرها فيما بعد وأضغط Finish. تم إنشاء أول مشروع لك بنجاح. ملفات ومجلدات المشروع دعنا الآن نستعرض بيئة التطوير وما توفره لنا كمطورين من مزايا. على اليسار هناك ثلاثة ملفات / مُجلّدات رئيسية تكونت تلقائياً بداخل app وهي: manifests java res مجلد manifest والذي يحتوي على ملف AndroidManifest.xml ويعتبر هذا الملف مهم جداً لنظام أندرويد لما يقدمه من معلومات أساسية للنظام قبل أن يقوم بتشغيله، أبرز هذه المعلومات: يحتوي على اسم الحزمة Package Name: وهو اسم مميز للتطبيق لتمييزه عن باقي التطبيقات المتواجدة على الهاتف ، فمثلاً إن كان اسم تطبيقك Gallery و هناك تطبيق آخر على الهاتف يسمى Gallery كيف يستطيع النظام التفرقة بين صلاحيات كل منهما و معلوماتهما الخاصة؟ يقوم النظام بتمييزهما عن طريق Package Name لذا فهو يعتبر اسمًا مُميّزًا لتطبيقك لا ينبغي أن يتشابه مع Package Name لأي تطبيق آخر ، من أجل ذلك وضعت قواعد لتسمية الـ Package أهمها هو أن تجعل تطبيقك على هيئة اسم نطاق لموقعك - إن وجد – فمثلا نجد شركة Google عند تسمية حزم تطبيقاتها تستخدم com.google.appName فيكون لها اسم حزمة Package Name فريد لا يتكرر. ملحوظة: يتم تحديد Package Name عند إنشاء التطبيق في الخانة الخاصة بالـ Company Domain. يقوم بتعريف المكونات الأساسية التي يتكون منها التطبيق الخاص بك: سوف نتعرف على هذه المكونات في الدرس التالي، ويتكون التطبيق من أحد هذه المكونات أو أكثر على حسب حاجة التطبيق. يحتوي الإصدار الأدنى الذي يعمل التطبيق معه وهو ما قمنا بتحديده مسبقا عند إنشاء للمشروع. يحتوي على الصلاحيات التي سيعطيها النظام للتطبيق –إن وجدت-. يحتوي على الصلاحيات التي يجب على التطبيقات الأخرى أن تطلبها إن أرادت أن تتبادل معلومات مع تطبيقك. لذا يعتبر هذا الملف من الملفات الأساسية التي يعتمد عليها النظام في تحديد كيفية التعامل مع التطبيق وإذا لم يتم تحديد كل شيء بشكل صحيح فذلك يعرض تطبيقك إلى ألا يعمل. مجلد java يختص هذا المُجلّد بالشيفرة التى سنكتبها للتطبيق و هي الشيفرة الذى يحدد وظيفة التطبيق و استجابة الواجهة و تنفيذها للأوامر. مجلد res و يهتم هذا المُجلّد بكل الموارد التي يتعامل معها التطبيق من صور و عناصر مكونة لواجهة المستخدم و عناصر مكونة للقوائم ويتكون من مجموعة من المجلّدات المرتبة كالآتي: drawable ويخص هذا المُجلد كافة الصور التي سيتم استخدامها في التطبيق. layout ويخص هذا المجلد بالتصميم الخاص بواجهة المستخدم و ما تحتويه من عناصر مختلفة. menu ويخص هذا المجلد بالقوائم و ما تحتويه من عناصر. mipmap ويخص هذا المجلد بالأيقونة الخاصة بالتطبيق فقط. values ويحتوى هذا المجلد على ملفات أخرى لكل منها وظيفة مختلفة و لكنها تشترك في فكرة عامة واحدة وهي جعل التطبيق أكثر مرونة لدعم دقة الشاشات المختلفة و الأحجام المختلفة ودعم اللغات المختلفة كما سنرى لاحقا في الدروس القادمة. المحاكي Simulator كما تتميز بيئة تطوير Android Studio بأنها بيئة تطوير متكاملة وتحتوي على ما يحتاجه المطور من أدوات لصنع تطبيق أندرويد فكما رأينا فهي تحتوي على مستعرض للمشروع وملفاته وتحتوي على المترجم الخاص والذي يحول الشيفرة إلى صيغته التنفيذية والتي تعمل على الهواتف وأيضاً تحتوي على محاكي للهواتف والحواسيب اللوحية ونستطيع تجربته عن طريق الضغط على (AVD (Android Virtual Device من داخل Android Studio في شريط القوائم وسنجد أنه تلقائياُ لديه هاتف جاهز للعمل. كما يمكنك أن تقوم بصنع محاكي آخر عن طريق الضغط على Create Virtual Device. الآن قم بتشغيل المحاكي و انتظر حتى يعمل كالتالي. قد يأخذ المحاكي بعض الوقت خاصة عند تشغيله أول مرة لذا ينصح دائما أن تقوم بتشغيل المحاكي قبل أن تقوم بتجربة التطبيق بفترة كافية. لتجربة التطبيق الذي قمنا بإنشائه على المحاكي من داخل android studio اضغط على الأيقونة Run ثم انتظر حتى تظهر أمامك شاشة يظهر فيها اسم المحاكي. ثم اختر المحاكي وأضغط ok. ستجد التطبيق يعمل الآن على المحاكي. ملحوظة: عند إنشاء أي مشروع داخل بيئة عمل Android Studio يقوم تلقائياً بإنشاء مشروع يعرض فقط كلمة !Hello World أمام المستخدم وهو الذي شاهدناه في الصورة السابقة حيث أننا لم نقوم بتغيير أي شيء في المشروع الأصلي. بهذا نكون قد وصلنا إلى نهاية أول دروسنا من هذه السلسة وإلى لقاء قريب بإذن الله، في انتظار تجربتكم وما مررتم به من مشاكل إن وجدت.
  4. سنبدأ في هذا الدرس من سلسلة برمجة تطبيقات الأجهزة المحمولة باستخدام Xamarin بالتعرّف على بنية التطبيق ضمن الحل Solution في Visual Studio 2015، بالإضافة إلى إنشائنا لتطبيق بسيط نتعرّف من خلاله على آلية عمل التطبيقات المبنية بواسطة Xamarin والتي تشبه في العديد من الجوانب مثيلاتها المنشأة باستخدام التقنيّات الأساسيّة المعتمدة في إنشاء تطبيقات أندرويد (لغة جافا مع Android Studio). بنية التطبيق المنشأ باستخدام Xamarin شغّل برنامج Visual Studio 2015، وبعد ظهور النافذة الرئيسيّة انتقل إلى القائمة File ومنها إلى New ثم اختر من القائمة الفرعيّة التي ستظهر الخيار Project. وكما فعلنا في الدرس السابق، اختر من الجهة اليسرى للنافذة التي ستظهر Cross-Platform، ثمّ اختر المشروع (Blank App (Xamarin.Forms Portable من القسم الأوسط للنافذة. امنح هذا المشروع الاسم SimpleTextApp ثم انقر الزر OK. سنبني تطبيقًا بسيطًا يوضّح كيفيّة استخدام لُصيقة Label وحيدة في إظهار النص في التطبيقات المبنيّة باستخدام Xamarin. من مستكشف الحل Solution Explorer الذي يوجد عادةً في الجهة اليمنى لنافذة بيئة التطوير Visual Studio، أبقِ فقط على المشروعين SimpleTextApp.Droid و (SimpleTextApp (Portable لأنّنا سنتعامل مع تطبيقات أندرويد فحسب (كما اتفقنا أيضًا من الدرس السابق). احذف باقي المشاريع الإضافيّة، يجب أن تحصل على شكل شبيه بما يلي: يحتوي المشروع (SimpleTextApp (Portable على معظم الشيفرة البرمجيّة، وهذا سلوك عام في المشاريع ذات النمط PCL. حيث تُعتبر الشيفرة الموجودة ضمن المشروع (الذي يحمل المقطع Portable بالإضافة لاسمه) مشتركة لجميع أنواع التطبيقات العاملة على أيّ نظام تشغيل بما فيه أندرويد. نلاحظ الملف App.cs الأساسي الذي سيكون موجودًا في أيّ تطبيق Xamarin وقد تحدثنا عنه في الدرس السابق ورأينا كيف يحتوي على الصنف App الذي يرث من الصنف Application، وكيف أنّ بانية هذا الصنف هي المسؤولة عن إنشاء الصفحة الرئيسيّة للتطبيق. انشر العقدة References لترى المراجع الخاصّة بهذا المشروع. ستلاحظ وجود عدّة مكتبات يهمّنا منها: Xamarin.Forms.Core و Xamarin.Forms.Platform و Xamarin.Forms.Xaml هذه هي المكتبات الرئيسيّة المشكّلة لـ Xamarin.Forms. بالنسبة للمشروع SimpleTextApp.Droid فهو يحتوي على مجلّدين هما: Assets و Resources. بالنسبة للمجلّد Resources فيحتوي على ملفات الصور وملفات معلومات التخطيطات layouts descriptions وغيرها من الملفات التي تُعتبر بمثابة المصادر resources لتطبيقك. انشر المجلّد Resources لترى بنيته. أمّا بالنسبة للمجلّد Assets فتُوضَع ضمنه الملفات العامّة الأخرى التي ترغب بتضمينها مع تطبيقك. يحتوي هذا المشروع أيضًا على الملف MainActivity.cs الذي يحوي ضمنه صنف له نفس الاسم MainActivity وهو يمثّل الفعاليّة Activity الأساسيّة لتطبيق أندرويد. افتح هذا الملف لتجد أنّ هذا الصنف يحتوي على التابع OnCreate الذي يُنفَّذ عند بدء تشغيل تطبيق أندرويد. لاحظ العبارة البرمجيّة التالية ضمن هذا التابع: LoadApplication(new App()); من الواضح أنّها تنشئ كائنًا جديدًا من الصنف App الموجود ضمن المشروع (SimpleTextApp (Portable، ثم تمرّره إلى التابع LoadApplication مباشرةً ليعمل على تحميل التطبيق وإظهاره للمستخدم. إذًا فعند تشغيل تطبيق أندرويد، سينفّذ التابع OnCreate الموجود في الصنف MainActivity أولًا، حيث يعمل هذا التابع على إنشاء كائن جديد من الصنف App فينفّذ بانيته وهي المسؤولة عن إنشاء الصفحة الرئيسيّة للتطبيق كما أشرنا. على أيّة حال ستتوضّح الفكرة بشكل جيّد بعد أن نبدأ بكتابة الشيفرة البرمجيّة. كتابة الشيفرة البرمجية انقر بزر الفأرة الأيمن على اسم المشروع (SimpleTextApp (Portable في مستكشف الحل Solution Explorer لتظهر قائمة سياق، اختر منها Add ثمّ من القائمة الفرعيّة اختر Class. ستظهر النافذة الخاصّة بإضافة صنف جديد. من حقل الاسم Name من الأسفل اكتب الاسم التالي لهذا الصنف الجديد وهو MainPage، ثم انقر Add. سيعمل Visual Studio على إضافة ملف جديد إلى المشروع اسمه MainPage.cs يحتوي على صنف بنفس اسمه ومحتواه شبيه بما يلي: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SimpleTextApp { class MainPage { } } لن نحتاج إلى معظم نطاقات الأسماء الموجودة في الشيفرة السابقة في هذا البرنامج، سنحتاج حاليًا إلى نطاق الاسم Xamarin.Forms. وسنجعل الصنف MainPage يرث من الصنف ContentPage كما سنضيف البانية إليه. عدّل الشيفرة السابقة لتصبح على الشكل التالي: using Xamarin.Forms; namespace SimpleTextApp { class MainPage : ContentPage { public MainPage() { } } } لاحظ أنّني تخلصت من جميع نطاقات الأسماء غير الضرورية (على أية حال سيظهر أي نطاق اسم غير مُستَخدَم في الشيفرة البرمجيّة بلون باهت في بيئة التطوير Visual Studio 2015). سيلعب الصنف MainPage دور صفحة محتوى content page رئيسيّة للتطبيق SimpleTextApp. سنضع ضمن بانية هذا الصنف الشيفرة البرمجيّة اللازمة لإنشاء لُصيقة واحدة Label تحوي نصًّا بسيطًا. ثم سنجري بعض التجارب البسيطة على هذه اللُّصيقة. يُعتبر هذا البرنامج بسيطًا في الواقع، ومهمته جعلك أكثر تآلفًا مع Xamarin. سنبدأ بإنشاء لُصيقة من الصنف Label وذلك ضمن بانية الصنف MainPage. تُستخدم اللُصيقات عادةً لعرض النصوص إلى المستخدم. انظر إلى الشيفرة البسيطة التالية: Label lblMain = new Label(); lblMain.Text = "Welcome to Hsoub Academy!"; ننشئ لُصيقة كما ننشئ أيّ كائن من صنف ما. أنشأنا في الشيفرة السابقة كائنًا جديدًا من الصنف Label وأسندناه إلى المتغيّر lblMain. ثم أسندنا النص "!Welcome to Hsoub Academy" إلى الخاصيّة Text من المتغيّر lblMain. تُستَخدم الخاصية Text لضبط وقراءة المحتوى النصيّ للُّصيقة. كي نستطيع عرض اللُّصيقة السابقة على الصفحة الرئيسيّة للتطبيق، علينا إسناد المتغيّر lblMain إلى الخاصيّة Content من الصنف ContentPage. وبما أنّ الصنف MainPage يرث من ContentPage فستكون الخاصيّة Content موجودة تلقائيًّا ضمنه أيضًا. ستكون عمليّة الإسناد على الشكل التالي: this.Content = lblMain; تكون عمليّة الإسناد السابقة ممكنة لأنّ الصنف Label يرث من الصنف View الذي يمثّل واجهة عرض view بمفهومها العام. وبما أنّ الخاصيّة Content هي من النوع View أيضًا فتكون عمليّة الإسناد هذه ممكنة. ستكون محتويات الملف MainPage.cs شبيهة بما يلي: using Xamarin.Forms; namespace SimpleTextApp { class MainPage:ContentPage { public MainPage() { Label lblMain = new Label(); lblMain.Text = "Welcome to Hsoub Academy!"; this.Content = lblMain; } } } هذا كلّ شيء! علينا الآن القيام بخطوة صغيرة أخيرة، وهي في جعل تطبيقنا يُنشئ كائن من صنفنا الجديد MainPage وذلك ضمن الملف App.cs. انتقل إلى هذا الملف (موجود ضمن المشروع (SimpleTextApp (Portable واحرص على أن تكون بانية الصنف App على الشكل التالي: public App() { // The root page of your application MainPage = new MainPage(); } اضغط الآن المفتاح F5 لتنفيذ التطبيق، لتحصل على شكل شبيه بما يلي: ملاحظة يمكنك وصل جهازك المحمول الذي يعمل بنظام أندرويد إلى الحاسوب لتجريب تشغيل التطبيق عليه مباشرةً. ولكن في هذه الحالة ينبغي أن تتوفّر واجهة برمجيّة API منصّبة على حاسوبك مناسبة لنسخة أندرويد الموجودة على الجهاز المحمول. على أية حال يمكنك تنصيب هذه الواجهة في حال عدم وجودها من خلال Android SDK Manager كما أشرنا في الدرس السابق. كما أنصح بوصل الجوال قبل تشغيل بيئة التطوير Visual Studio، أو أن تعيد تشغيلها إذا كانت تعمل من قبل. تنسيق الشيفرة البرمجية بشكل أفضل في الحقيقة لا تُعتبر الشيفرة البرمجيّة الموجودة ضمن الملف MainPage.cs مثاليّةً رغم بساطتها. ربما لا تشعر بمشكلة الآن، ولكن عندما تصبح برامجك أكبر، ستقع في مشاكل حقيقيّة لأنّ الأسلوب السابق بكتابة الشيفرة يجعلها كبيرة جدًّا. سأستخدم ميّزة الإسناد المباشر للخصائص أثناء إنشاء الكائنات. تفيد هذه الميزة في الاستغناء عن معظم المتغيّرات في البرنامج، التي ينحصر دورها في لعب دور الوسيط المؤقّت. سنعيد صياغة الشيفرة الموجودة في الملف MainPage.cs بشكل أنيق وعمليّ أكثر: using Xamarin.Forms; namespace SimpleTextApp { class MainPage : ContentPage { public MainPage() { this.Content = new Label{ Text = "Welcome to Hsoub Academy!" }; } } } لاحظ أنّني استغنيت عن المتغيّر lblMain لأنّنا أسندنا كائن اللُّصيقة مباشرةً إلى الخاصيّة Content. مزايا إضافية على التطبيق ستلاحظ من التطبيق السابق أنّ اللُّصيقة تظهر في الزاوية اليسرى العليا من النافذة. سنجعلها تظهر في مركز الشاشة. ينبغي ضبط خاصيّتين من خصائص اللُّصيقة لهذا الغرض، وهما HorizontalOptions (لخيارات المحاذاة الأفقيّة) و VerticalOptions (لخيارات المحاذاة الرأسيّة). كل من هاتين الخاصيّتين من النوع LayoutOptions، وهي بنية struct موجودة ضمن نطاق الاسم Xamarin.Forms. تحتوي هذه البنية على عدّة حقول جاهزة تُفيد في خيارات التموضع الأفقيّة والرأسيّة للُّصيقة، وهي خيارات مهمّة للغاية كما سنرى لاحقًا في هذه السلسلة. لنجري الآن التعديل المطلوب على اللُّصيقة الموجودة ضمن بانية الصنف MainPage. ستصبح محتويات الملف MainPage.cs على الشكل التالي: using Xamarin.Forms; namespace SimpleTextApp { class MainPage : ContentPage { public MainPage() { this.Content = new Label{ Text = "Welcome to Hsoub Academy!", HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center }; } } } لاحظ إسناد القيمة LayoutOptions.Center لكل من الخاصّتين HorizontalOptions و VerticalOptions وذلك للتوسيط الأفقي والرأسي على الترتيب. نفّذ البرنامج مرّة أخرى ستلاحظ أنّ اللُّصيقة أصبحت في مركز الشاشة كما هو واضح من الشكل التالي: أمّا إذا أحببت أن يكون النص ضمن اللُّصيقة بلون آخر، وليكن الأحمر مثلًا، فعليك في هذه الحالة إسناد القيمة Color.Red للخاصيّة TextColor لكائن اللُّصيقة، علمًا أنّ Color هو بنية موجودة ضمن نطاق الاسم Xamarin.Forms أيضًا. انظر كيف نفعل ذلك في الشيفرة: this.Content = new Label{ Text = "Welcome to Hsoub Academy!", HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center, TextColor = Color.Red }; نفّذ البرنامج مرّة أخرى، لترى النص وقد أصبح لونه أحمر. الخلاصة تعرّفنا في هذا الدرس على البنية العامة لتطبيق Xamarin ضمن بيئة التطوير Visual Studio 2015. كما قمنا ببناء تطبيق بسيط للغاية أسميناه SimpleTextApp. تنحصر وظيفة هذا التطبيق في التّعرف أكثر على Xamarin. سنبدأ اعتبارًا من الدرس القادم ببناء تطبيقات متدرّجة في الصعوبة، وذات مزايا إضافيّة من الممكن أن تستفيد منها كمبرمج تطبيقات محمولة في حياتك العمليّة.
  5. ثبّتنا في الدرس السابق من هذه السلسلة إطار Laravel وأعددناه. سنستخدم تلك الإعدادات كقاعدة لبناء تطبيق صغير عليها؛ ونرى العناصر الأساسية لتطبيق يعمل على إطار العمل Laravel. هذا الدرس جزء من سلسلة تعلم Laravel والتي تنتهج مبدأ "أفضل وسيلة للتعلم هي الممارسة"، حيث ستكون ممارستنا عبارة عن إنشاء تطبيق ويب للتسوق مع ميزة سلة المشتريات. يتكون فهرس السلسلة من التالي: مدخل إلى Laravel 5.تثبيت Laravel وإعداده على كلّ من Windows وUbuntu.أساسيات بناء تطبيق باستخدام Laravel. (هذا الدرس)إنشاء روابط محسنة لمحركات البحث (SEO) في إطار عمل Laravel. نظام Blade للقوالب.تهجير قواعد البيانات في Laravel.استخدام Eloquent ORM لإدخال البيانات في قاعدة البيانات، تحديثها أو حذفها.إنشاء سلة مشتريات في Laravel.الاستيثاق في Laravel.إنشاء واجهة لبرمجة التطبيقات API في Laravel.إنشاء مدوّنة باستخدام Laravel.استخدام AngularJS واجهةً أمامية Front end لتطبيق Laravel.الدوّال المساعدة المخصّصة في Laravel.استخدام مكتبة Faker في تطبيق Laravel لتوليد بيانات وهمية قصدَ الاختبار. يشمل الدرس المواضيع التالية: مفهوم التوجيه Routing وآلية عمله.أداة Artisan التي تعمل على سطر الأوامر.استخدام أداة Artisan لتوليد شفرة مصدرية نمطية للمتحكّمات Controllers (وهي المسؤولة عن الإجابة على الطّلبات التي تردها Requests).إنشاء نداء لمتحكّم في مسار Route.تمرير المتغيّرات من متحكّم إلى عرض View.أساسيات التوجيه في Laravelعند وصول طلب إلى تطبيق Laravel تتلقى آلية التوجيه الطلب ثم تختار طريقة التعامل معه. سنرى في هذه الفقرة كيفية عمل هذه الآلية. أول ما سنفعله هو إنشاء مسار جديد؛ لذا افتح ملف routes.php الموجود على المسار app\Http بمحرّر النصوص المفضّل لديك. ملحوظة1: جميع المسارات المذكورة في الدرس هي بالنسبة لمجلد تطبيق Laravel. يعني هذا أن المقصود بالمسار (على افتراض أنك اتبعت خطوات الإعداد في الدرس السابق) app/Http هو المسار C:\laragon\www\larashop\app\Http على وندوز و /var/www/html/larashop/ على لينكس. ملحوظة2: انتبه لحالة الأحرف، كبيرة أو صغيرة. أضف المحتوى التالي إلى الملف routes.php : Route::get('/hello',function(){ return 'Hello World!'; });تعرّف الشفرة السابقة مسارًا لتلقي الطلبات من نوع GET (الدّالة get الموجودة في الصنف Route). المعطى الأول للدّالة هو الرابط المعني بالمسار (أي /hello) أما الثاني فهو دالة مجهولة الاسم Anonymous function تعرّف طريقة التعامل مع الطلب. يعني هذا أنه عند تلقي طلب على العنوان http://larashop.dev/hello فإن التطبيق ينفذ الدالة مجهولة الاسم والتي تُرجِع العبارة: Hello World!. احفظ الملف ثم اذهب إلى المتصفح وأدخل العنوان: http://larashop.dev/helloيجب أن تظهر صفحة بيضاء مطبوعة عليها عبارة: Hello World!. ربما تكون لاحظت وجود الشفرة التالية في الملف routes.php: Route::get('/', function () { return view('welcome'); });تتبع هذه الشفرة نفس المبدأ حيث تعرّف مسارا للطلبات الآتية على الرابط / أي رابط الصفحة الرئيسية (http://larashop.dev) وتحيلها إلى عرض باسمwelcome بدلا من طباعة عبارة مباشرةً (سنرى في ما بعد كيفية ذلك). أداة ArtisanArtisan عبارة عن أداة تُستدعى من سطر الأوامر لأتممة تنفيذ أنشطة اعتيادية على Laravel. يمكن استخدام أداة Artisan لتنفيذ الأنشطة التالية من بين أخرى: توليد شفرة نمطية: إنشاء المتحكّمات، النماذج Models، وغيرها بيُسر.تهجير قواعد البيانات Database migrations: وهو نظام لإدارة الإصدارات الخاصة بقواعد البيانات يجعل من التعامل مع الكائنات في قواعد البيانات (إنشاء جداول أو حذفها مثلا) أسهل عبر وصفها دون الحاجة للتعديل عليها مباشرةً.بذر قواعد البيانات Database seeding: وهو مصطلح يشير إلى إضافة بيانات وهمية للتسجيلات Records في جداول قاعدة البيانات لأغراض الاختبار.التوجيه: وهي الآليّة المسؤولة عن تلقي الطلبات ثم اختيار طريقة التعامل معها (عادةً بإرسالها إلى متحكّم).ضبط التطبيق.تشغيل الاختبارات الأحاديّة Unit tests.كيف تستخدم أداة Artisanافتح سطر الأوامر ثم انتقل إلى مجلد التطبيق. على افتراض أنك موجود في أصل المستند (C:\laragon\www على وندوز أو /var/www/html/ على لينكس): cd larashopثم نفّذ الأمر التالي: php artisan listملحوظة: تأكّد من وجودك في مجلّد التطبيق (أي المجلّد larashp) قبل تنفيذ الأمر artisan. تظهر أوامر artisan المتاحة للتنفيذ. مثال على النتيجة: Laravel Framework version 5.1.26 (LTS) Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question --env[=ENV] The environment the command should run under. -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands: clear-compiled Remove the compiled class file down Put the application into maintenance mode env Display the current framework environment help Displays help for a command inspire Display an inspiring quote list Lists commands migrate Run the database migrations optimize Optimize the framework for better performance serve Serve the application on the PHP development server tinker Interact with your application up Bring the application out of maintenance mode أمر Artisan لتوليد شفرة متحكمسنستخدم Artisan لتوليد متحكم بسيط يجيب على طلب Http ويحمّل عرضا باسم hello. افتح سطر الأوامر ونفذ الأمر التالي (تأكد من وجودك في مجلّد التطبيق قبل تنفيذ الأمر): php artisan make:controller Helloاستخدمنا أمر make:controller الذي توفره أداة Artisan لتوليد شفرةِ متحكّم ومررنا له اسم المتحكم الذي نريد توليده Hello. يُنشئ الأمر أعلاه ملفا باسم Hello.php على المسار app/Http/Controllers. يجب أن تظهر رسالة في سطر الأوامر تفيد بنجاح توليد المتحكم. نفتح ملف Hello.php لرؤية محتواه: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; class Hello2 extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { // } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // } /** * Display the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function show($id) { // } /** * Show the form for editing the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { // } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { // } /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { // } }يعرف الملف فضاء اسم Namespace خاصًّا بالمتحكم: namespace App\Http\Controllers.تستورد التعليمات التالية (use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller;) الأصناف Classes المطلوبة لتشغيل المتحكم.الصنف Hello هو تمديد للصنف Controller الذي يعرّفه إطار العمل.بالنسبة للدوال التي يعرفها المتحكم فاستخدامها يكون كالآتي: الدالة index هي الدالة الافتراضية للمتحكم: تتعامل مع الطلبات الموجهة للرابط الجذر الذي يجيب عنه المتحكم.الدالة create: إنشاء موارد جديدة مثل تسجيلة في جدول قاعدة البيانات.الدالة store: تخزين مورد جديد مُنشَأ بالدالة السابقة.الدالة show: العثور على مورد اعتمادا على المعرِّف ID الممرَّر للدالة.الدالة edit: تتيح إمكانية التعديل على المورد الممرّر للدالة.الدالة update: تحديث مورد مخزّن.الدالة destroy: حذف مورد مخزَّن.سنأتي تباعا لتفصيل استخدام هذه الدوال في الوقت المناسب. توجيه طلب إلى متحكمفي المسار الذي عرفناه سابقا تُطبع العبارة مباشرة من داخل دالة التوجيه، وهذا خلط بين عناصر نموذج MVC، لذا سنضع المسار بين علامات تعليق لتجاهله: /* Route::get('/hello',function(){ return 'Hello World!'; }); */ثم نضيف شفرة مصدرية جديدة تنشئ مسارا لنفس الرابط hello/ ولكنها بدلا من طبع سلسلة محارف ترسل نداءً إلى المتحكم Hello وبالتحديد دالة index: Route::get('hello', 'Hello@index');نفتح ملف المتحكم لتحرير الدالة index لتأخذ المحتوى التالي: public function index() { return 'hello world from controller : )'; }احفظ الملف. افتح الآن الرابط http://larashop.dev/hello، وستجد أن الرسالة التالية تظهر في الصفحة: hello world from controller :)ما حدث هنا هو أن المسار الخاص بالرابط hello تلقى الطلب من المتصفح ثم أحاله إلى المتحكم Hello الذي طبع سلسلة محارف على الشاشة. تحميل عرض View انطلاقا من متحكماحترام مبادئ MVC يقضي بألا يتداخل عمل المتحكمات والعروض؛ فتنسيق ما يراه الزائر من مسؤولية العروض، ولذا فعلى المتحكم توكيل عرض بهذه المهمة مع إمداده بما يحتاجه من متغيرات. وهو ما سنفعله في الفقرات التالية. سيتلخص عملنا في ثلاث نقاط: إنشاء مسار لتلقي الطلب على الرابط hello/ وإرساله إلى المتحكم المناسب (تم هذا الأمر).إنشاء متحكم للإجابة عن الطلب (تم).إنشاء عرض لتنسيق ما سيظهر على شاشة الزائر.تغيير المتحكم لإرسال نداء إلى العرض وتمرير المتغيرات المناسبة إليه.أنشئ ملفا باسم hello.blade.php في المسار resources/views/ وأضف إليه المحتوى التالي: <!DOCTYPE html> <html> <head> <title>Laravel</title> <link href="//fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css"> <style> html, body { height: 100%; } body { margin: 0; padding: 0; width: 100%; display: table; font-weight: 100; font-family: 'Lato'; } .container { text-align: center; display: table-cell; vertical-align: middle; } .content { text-align: center; display: inline-block; } .title { font-size: 96px; } </style> </head> <body> <div class="container"> <div class="content"> <div class="title">Hello {{$name}}, welcome to Laraland! : )</div> </div> </div> </body> </html>يحوي الملف كما يظهر شيفرة HTML عادية مع تغييرين أساسيين، هما لاحقة اسم الملف (blade.php) واستخدام المتغير name في الملف. تشير اللاحقة إلى أن العرض يستخدم نظام Blade للقوالب الذي يأتي مضمّنا في Laravel (سنخصص درسا للعروض والقوالب). نكتفي الآن بالقول إن {{$name}} تطبع قيمة المتغير name. افتح الملف app/Http/routes.php وأضف الشفرة التالية: Route::get('/hello/{name}', 'Hello@show');يعمل هذا السطر على إنشاء مسار للروابط ذات الصيغة /hello/value حيث value قيمة ما، تخزن هذه القيمة في المتغير name ثم تمرّر إلى الدالة show الموجودة في المتحكم Hello. نفتح ملف المتحكم Hello ونعدّل الدالة show($id) لتصبح على النحو التالي: public function show($name) { return view('hello',array('name' => $name)); }نعرف الدالة show التي تقبل المعطى name.تحمِّل الدالة عرضا باسم hello.blade.php (يُكتفى بذكر اسم العرض دون اللاحقة blade.php) ثم تمرر له مصفوفة تحوي متغيراتٍ وقيمَها. في حالتنا يوجد متغير واحد باسم name وقيمته هي المعطى الممرَّر للدالة show.احفظ التعديلات التي أجريناها في الفقرات السابقة ثم افتح الرابط http://larashop.dev/hello/HsoubAcademy في المتصفح. يمكن أن نلاحظ هنا أن HsoubAcademy هي قيمة المتغير name الموجود في تعريف المسار التالي: Route::get('/hello/{name}', 'Hello@show');إذن: طلب الزائر العنوان http://larashop.dev/hello/HsoubAcademy في المتصفح.وجد التطبيق أن المسار الموافق لهذا الرابط هو المسار /hello/{name{ وأعطى القيمة HsoubAcademy للمتغير name ثم وجّه الطلب إلى الدالة show في المتحكم Hello.تلقت الدالة show الطلب ثم أرسلته إلى العرض hello مع إنشاء متغير جديد بنفس الاسم المستخدم في العرض وحددت قيمته بالمعطى الذي تلقته من المسار. كان بإمكان الدالة show إجراء عمليات على المعطى قبل تمريره.بدأ نظام القوالب العمل ووجد أن العرض hello يحوي متغيرا باسم name وأن قيمة هذا المتغير كما مررها له المتحكم هي HsoubAcademy، فوضعها مكان المتغير وأرسل النتيجة إلى المتصفح.خاتمةتعرفنا في هذا الدرس على الآلية الأساسية التي تعمل بها تطبيقات Laravel. من المهم جدّا فهم محتويات هذا الدرس قبل الانتقال إلى الدروس الموالية. ترجمة -وبتصرّف- لمقال Laravel 5 Hello World لصاحبه Rodrick Kazembe.
  6. يوفّر تطبيق التقويم Calendar على هواتف iPhone بعض الخصائص المفيدة التي تساعدك على إدارة جدولك وتنظيمه، حيث يمكنك إنشاء مختلف الأحداث عليه كالاجتماعات، المواعيد، وغيرها وإضافة التنبيهات لتلك الأحداث. سنتعرّف في هذا المقال على بعض أساسيات استخدام تطبيق التقويم المثبت بشكل افتراضي على جميع هواتف iPhone. إضافة حدث وتحريره لإضافة حدث في يوم وتاريخ محدّدين على التقويم، افتح تطبيق التقويم ثم انقر على أيقونة +: قم بإدخال تفاصيل الحدث، كالعنوان، الموقع، والأهم من ذلك تحديد وقته وتاريخه. إذا كان الحدث يستمر طوال اليوم قم بتفعيل الخيار طوال اليوم All-day وستلاحظ اختفاء حقول تحديد الوقت. بإمكانك أيضًا تعديل خيار التكرار Repeat إذا كان الحدث يتكرر كل يوم، كل أسبوع، إلخ. وإذا رغبت في أن يتم تذكيرك عندما يحين وقت الحدث، قم بتعيين تنبيه Alert في وقته، أو قبل وقته بزمن معيّن. بعد الانتهاء من تعديل التفاصيل انقر على إضافة Add: ستظهر دائرة صغيرة تحت الأيام التي تحتوي على أحداث عند عرض التقويم بطريقة العرض الشهري. وعند النقر على تاريخ محدد، ستظهر الأحداث المختلفة في ذلك اليوم مميزة بألوان مختلفة: إذا طرأ أي تغيير على الحدث، كتغيّر وقته مثلًا، انقر عليه من طريقة العرض اليومي ثم انقر على تحرير Edit: قم بإجراء التعديلات المرغوبة ثم انقر على تم Done في الأعلى. إضافة حدث من تطبيق آخر عندما تصلك رسالة نصية على تطبيق الرسائل أو غيره وتحتوي على نص مكتوب بصيغة وقت أو تاريخ، سيتعرّف عليه هاتفك ويحوّله إلى نص قابل للنقر. وبإمكانك إضافة ذلك الوقت أو التاريخ كحدث على التقويم بالنقر عليه واختيار إنشاء حدث Create Event: إضافة تقاويم بإمكانك تنظيم جداولك الزمنية أكثر بإضافة أكثر من تقويم وتخصيصها حسب نوع الأحداث/المواعيد. على سبيل المثال بإمكانك تخصيص تقويم للمواعيد الشخصية، وآخر لمواعيد العمل، وهكذا، وسيكون لكل تقويم لونه الذي يميّزه. لإضافة تقويم جديد، انقر على: التقويمات Calendars > تحرير Edit > إضافة تقويم Add Calendar قم بتسمية التقويم الجديد واختر لونه من الألوان المتوفرة، ثم انقر على تم Done: ستتم إضافة التقويم الجديد إلى قائمة تقاويمك على الهاتف. وبإمكانك تحديد هذا التقويم من قائمة التقاويم عندما تقوم لاحقًا بإنشاء حدث جديد: إذا رغبت في حذف تقويم قمت بإنشائه سابقًا، افتح تطبيق التقاويم، ثم اذهب إلى: التقويمات Calendars > تحرير Edit انقر على التقويم الذي تريد حذفه ثم انقر على حذف التقويم Delete Calendar: مزامنة تقويم iPhone مع تقاويم أخرى إذا كنت تستخدم خدمات أخرى لتنظيم جداولك، مثل تقاويم جوجل، Outlook، إلخ، بإمكانك مزامنة تلك التقاويم مع تطبيق التقويم على هاتفك مما يتيح لك إدارتها وتحريرها من على هاتفك مباشرة. لعمل المزامنة اذهب إلى: إعدادات Settings > البريد، جهات الاتصال، التقويمات Mail, Contacts, Calendars > إضافة حساب Add Account اختر نوع الحساب واتبع إرشادات الإضافة. بعد ذلك انقر على إعدادات الحساب الذي قمت بإضافته للتو من صفحة البريد، جهات الاتصال، التقويمات نفسها وتأكد من تفعيل الخيار التقويمات Calendars لكي تتم مزامنة بيانات التقويم مع تطبيق التقويم: مشاركة التقويم إذا كنت تستخدم خدمة iCloud، بإمكانك إضافة التقاويم عليها لكي تستفيد من خاصية مشاركتها مع أشخاص آخرين لتسهيل التعاون على تنظيمها. توجد طريقتان لمشاركة التقويم على iCloud، أما بشكل عام مع كل شخص يستطيع الوصول إلى التقويم، أو مشاركته بشكل خاص مع مستخدمي iCloud محددين. مشاركة التقويم بشكل عام يستطيع كل شخص يملك الرابط العام الوصول إلى التقويم وقراءته، لكن لا يمكن تحريره سوى من قبل مالكه، أي الشخص الذي قام بإنشائه. ويمكن عرض هذا التقويم من قبل الآخرين على أي تطبيق يدعم صيغة تقاويم iCalendar. لمشاركة التقويم بشكل عام اتبع الخطوات التالية: افتح تطبيق التقويم وانقر على التقويمات Calendars. انقر على أيقونة المعلومات (i) المقابلة لتقويم iCloud الذي تريد مشاركته. قم بتشغيل الخيار تقويم عام Public Calendar ثم انقر على مشاركة الرابط Share Link. اختر وسيلة إرسال الرابط، عبر البريد الإلكتروني، رسالة نصية، إلخ، وأرسله إلى شخص أو مجموعة أشخاص، أو انسخ الرابط بالنقر على Copy وألصقه في المكان المرغوب. انقر على تم Done للعودة إلى تقاويمك. في حال رغبت لاحقًا في إلغاء مشاركة التقويم بشكل عام، كرر الخطوات أعلاه وقم بتعطيل الخيار تقويم عام. مشاركة التقويم بشكل خاص عند مشاركة التقويم بشكل خاص مع أحدهم، سيتم أولًا إرسال دعوة اشتراك في التقويم إلى المستلم، ويجب أن يكون لديه حساب iCloud ليتمكّن من قبول الدعوة ويصبح مشتركًا في التقويم. يستطيع المستلم بعد قبول الدعوة عرض التقويم على تطبيق التقويم على أجهزة iPhone ،iPod ،iPad ،Mac، أو في برنامج Microsoft Outlook على نظام تشغيل Windows. وهناك مستويان للترخيص الذي يُمنح للمشترك في التقويم؛ إما إمكانية القراءة والتحرير، أو القراءة فقط. لمشاركة التقويم بشكل خاص اتبع الخطوات التالية: افتح تطبيق التقويم وانقر على التقويمات Calendars. انقر على أيقونة المعلومات (i) المقابلة لتقويم iCloud الذي تريد مشاركته. انقر على إضافة شخص Add Person تحت عبارة مشترك مع Shared with. أدخل عنوان/عناوين البريد الإلكتروني للأشخاص الذين تريد دعوتهم إلى المشاركة في التقويم ثم انقر على إضافة Add. بعد أن يقبل المستلم دعوة الاشتراك، ستظهر عبارة تحت اسم التقويم تشير إلى أسماء الأشخاص المشتركين فيه. وبشكل افتراضي، سيكون المشترك في التقويم قادرًا على تحرير التقويم كإضافة وحذف أحداث، أو تغيير تفاصيل الأحداث، كالعنوان، التاريخ، الموقع، إلخ. إذا رغبت في تغيير الترخيص وجعل المشتركين قادرين على قراءة التقويم فقط، انقر على أيقونة المعلومات (i) للتقويم الذي قمت بمشاركته، ثم انقر على عرض وتحرير View & Edit أمام اسم المشترك: قم بتعطيل خيار السماح بالتحرير Allow Editing: وإذا رغبت في إلغاء المشاركة مع مشترك محدد، انقر على إيقاف المشاركة Stop Sharing. تطبيقات بديلة للتقويم القياسي إذا كان تطبيق التقويم القياسي لا يلبي احتياجاتك وتبحث عن بديل لاستخدامه في تنظيم جداولك، هناك العديد من الخيارات المجانية أو المدفوعة التي يمكنك تنزيلها من متجر التطبيقات. سنستعرض أدناه بعض التطبيقات التي يمكنك يمكنك استخدامها بدلًا من التقويم القياسي: Fantastical 2 من التطبيقات المرنة، السريعة وسهلة الاستخدام. يوفّر طريقتين لعرض الأحداث: العرض الأسبوعي أو الشهري. تُعرض الأحداث في طريقة العرض الشهري بشكل نقاط تحت كل تاريخ، وعند النقر على تاريخ معيّن، ستعرض في النصف السفلي من الشاشة قائمة التذكيرات اليومية. كما يوفّر خاصيّة عرض خرائط مواقع الأحداث على خرائط جوجل وفتح الروابط (إن وجدت) في متصفّح Chrome. يدعم Fantastical 2 خدمات التقويم الأخرى كتطبيق التقويم القياسي، تقاويم جوجل، وغيرها. ويتكامل مع تطبيق التذكيرات Reminders على هواتف iPhone ومع أحداث فيس بوك. بإمكانك شراء التطبيق من متجر iTunes بـ 5$. Calendars 5 يوفّر هذا التطبيق 4 طرق لعرض الأحداث: العرض الشهري، الأسبوعي، اليومي، أو بشكل قائمة. ويمكن إضافة الأحداث وجدولتها باستخدام خاصية السحب والإفلات. وعلى غرار Fantastical 2، يتكامل Calendars 5 مع تقويم جوجل ومع تطبيق التذكيرات أيضًا. كما يوفّر مدير للمهام يساعدك على إضافة مهامك اليومية وتتبّعها بسهولة. بإمكانك شراء التطبيق من متجر iTunes بـ 7$. Cal من التطبيقات ذات الواجهة الجميلة والبسيطة. يمكن مزامنته مع العديد من خدمات التقاويم كتقويم جوجل، iCloud، Exchange، وغيرها وبذلك لا تضطر إلى إعادة إنشاء الأحداث التي قمت بإضافتها إلى التقاويم الأخرى. كما يمكن إدارة مهامك عبر هذا التطبيق بربطه بتطبيق المهام التابع لنفس الشركة؛ Any.Do. ما يميّز Cal أنّه يتكامل مع الشبكات الاجتماعية وجهات الاتصال، وبذلك يسهّل عليك جدولة التقاويم مع الزملاء/الأصدقاء أو إرسال الرسائل إليهم من التطبيق نفسه. التطبيق مجاني ويمكنك تنزيله من متجر iTunes. iCalender إذا كنت من الأشخاص الذين يفضّلون التنظيم البصري، فهذا من الخيارات الجيّدة لك. يوفّر iCalendar خاصيّة تمييز الأحداث بألوان مخصصة لتسهيل تتبّعها. يمكنك اختيار الألوان من المجموعة الافتراضية أو إضافة ألوانك المفضّلة. يتزامن التطبيق مع تقاويم iCloud، جوجل، Yahoo! و Exchange. كما يتكامل مع تطبيق التذكيرات القياسي. من الخصائص التي يوفّرها: تنظيم الأحداث بالسحب والإفلات، نسخ ولصق الأحداث، تصدير بيانات التقويم كملف PDF، إنشاء قوالب للأحداث المتكررة، وغيرها. بإمكانك شراء التطبيق من متجر iTunes بـ 3$. Google Calendar التطبيق الرسمي من شركة جوجل. يتزامن مع تقويم جوجل ومع خدمات جوجل الأخرى مثل Gmail ليقوم بكشف الرسائل التي تحتوي على أحداث (كالحجوزات مثلا) وتحويلها تلقائيًا إلى أحداث على التقويم. كما يعمل مع جميع التقاويم الأخرى على هاتفك. يتوفّر بعدّة لغات، من ضمنها اللغة العربية، ويتيح أكثر من طريقة لعرض المواعيد والأحداث. التطبيق مجاني ويمكنك تنزيله من متجر iTunes.
  7. إن العمل الحر، على عكس الوظائف الحكومية، بيئة لها صفة التغير المستمر والتنافس الشديد، لذا يخشى العديد من الناس دخول تلك البيئة، لخوفهم من الفشل في مواكبة السباق، في حين يجاهد البعض الآخر لكي يشقوا طريقهم فيها. ومن المثير للاهتمام أن هناك عوامل أخرى تقتل مسيرات العمل الحر في مهدها غير ما يشيع بين الناس من التأخر في تسليم الأعمال أو تسليمها بجودة سيئة، وسنفصّل الآن سبعة من تلك العوامل وكيف تتجنب الوقوع في شراكها. الفشل في التنظيم تملك المؤسسات والشركات لوائح وقوانين تنظم سير العمل فيها، وحين تعمل في إحدى تلك الهيئات فإنك تنخرط دون وعي منك في نظامها القائم، وتلائم ظروفك وِفقَه دون تفكير، فالنظام موجود بالفعل هناك وما عليك من شيء إلا اتباعه. أما حين تتحول إلى العمل الحر فإن هذا النظام يختفي فجأة، ويزيد احتمال سقوطك في فخ الفوضى، ما يعني أنك لن تستطيع إخراج عملك بالجودة المطلوبة. ولكي تحافظ على إطار عمل منظم أثناء عملك الحر كمستقل، فإن الحلول الإلكترونية والسحابية هي خيارك الأمثل. إن برنامجاً لحساب وتنظيم الفواتير مثل FreshBooks يريحك من أحد أسباب الصداع الرئيسية في العمل الحر، وهناك أيضاً بعض أدوات لتنظيم الوقت مثل TeuxDeux و RescueTime، اللتان تساعدانك على تحليل الوقت الذي تقضيه على الحاسوب، كما تمنع عنك المواقع التي تشتتك عن العمل. وإذا لم تكن تلك التطبيقات كافية لتنظيم وقتك، فجرب تطبيق focus booster، وهو مؤقت سحابي يستخدم تقنية بومودورو Pomodoro (تقنية لتقسيم الوقت إلى فترات لتحسين جودة الإنتاج الذهني، اشتق اسم التقنية من كلمة طماطم بالإيطالية، بسبب أن مطور هذه التقنية كان يستخدم مؤقتاً على شكل ثمرة طماطم). ويقسم ذلك التطبيق يومك إلى فترات كل منها 25 دقيقة، متبوعة بخمس دقائق للراحة، كوسيلة لمساعدتك على تقسيم يومك بكفاءة. وإذا كنت في حاجة إلى البقاء على اطلاع بكم الوقت الذي قضيته في مهمة بعينها، فإن تطبيقاً مثل Toggl قد يكون مفيداً للغاية. الاستسلام للضغوط ستجد دائمًا تطبيقات وبرامج تقدم خدمات أساسية في أي مجال قد تتخيله، بما في ذلك مجال عملك أنت نفسك، وسيكون هناك دائماً تطبيقات وخدمات أرخص. بل زد على هذا أن المنافسة قد تكون شديدة، خاصة إن لم تفكر في مكان يلائمك جيداً. لكن على أي حال فلا يمكنك السماح للخوف أن يتحكم فيك تحت أي ظرف كان. بعبارة أخرى، عليك أن تصبر وتجاهد كي تنجح كمستقل، وتنظر لما وراء ذلك الخوف، وتصرف انتباهك وطاقتك إلى شغفك بعملك، والذي ستجد له منبعًا من دافعك الشخصي للعمل في هذا المجال أو ذاك. سيكون عليك بالطبع أن تبحث في السوق الذي تستهدفه لتحدد عملاءك بدقة. وانظر بإنصاف إلى نقاط قوتك وضعفك كي تعرف ما عليك التركيز عليه بالضبط سواءً في الأعمال التي تقبلها أو المهارات التي تطورها، وإذا شعرت أنك لا تستطيع وضع يدك على تلك النقاط بنفسك، فجرب أن تسأل أحد العملاء أو المدراء السابقين عن ملاحظاتهم وتوصياتهم، كي تستفيد منها وترى نفسك بعين غيرك. الفشل في التميز كما قلت في أول المقال أن العمل كمستقل يختلف عن العمل لدى شركة أو مؤسسة، فالشركة تملك فريقاً أو أكثر يعمل على صنع هويتها المميزة في السوق ويسوق لها، أما أنت فلا تملك إلا نفسك، لكن هذا لا يعني ألا تصنع لك هوية تميزك عن غيرك أيضاً، لئلا يضيع صوتك (وعملك) في الزحام بسهولة. فلتبدأ بإعداد قائمة لإنجازاتك وأعمالك لتستخدمها في عروض تقديمية. وستضع فيها، إضافةً إلى المؤهلات والإنجازات الأكاديمية، مهاراتٍ أخرى مثل القدرة على التنظيم أو الإدارة، مدعومة بإظهار مواضع ذلك في مناصب قيادية في أي نوادي أو تجمعات أخرى مشابهة. إن وجودك في موضع متميز قد يعني أنك ستترك بعض الأعمال والفرص العامة تمر دون أن تقتنصها، فإن أعداد العروض على تلك المشاريع والأعمال على أي حال سيكون عاليًا وستكون فرص الفوز بها ضئيلة، أما تخصصك وتحديدك لفئة بعينها يعطيك ميزة لاختيار مشاريع تناسبك بشكل أفضل. الفشل في قياس الوقت اللازم لتنفيذ المشاريع أو تحديد التسعير المناسب لدى كل مستقل ناجح معدل أدنى لقبول الأعمال التي تعرض عليه، كما أن لديه أيضًا قدرة على تقدير الوقت المتوقع لإنهاء المشروع بجودة مقبولة. إن كلا الأمرين يقعان في نفس مستوى الأهمية، فإذا أخطأت في تحديد السعر الأدنى الذي تعمل به أو تقدير الزمن الذي تستغرقه لإنهاء العمل، فإنك ستتسبب لنفسك في خسارة بعض المال. هناك معادلة أساسية لتحسب السعر لكل ساعة، تتضمن حساب كل النفقات المتعلقة بإنهاء العمل (بما في ذلك أساسيات مثل طعامك والكهرباء وإيجار سكنك، إلخ)، والأيام والساعات التي تنوي العمل فيها (بدون حساب أيام العطلة، إضافة إلى سماحية صغيرة لاحتمالات المرض)، إضافة إلى تخصيص جزء لتقاعدك المستقبلي، والربح الذي تود تحقيقه. ثم عليك إضافة الوقت الذي تقدر أن المشروع سيستغرقه إذا كنت تعمل بنظام الأجر على دفعة واحدة، على خلاف العمل بالساعة. هناك خلاف كبير حول أيهما أفضل، للمزيد حول الأمر ألق نظرة على هذا المقال: "كيف تُسعّر مشاريع الويب". تحسب تطبيقات مثل Motiv تلك العملية بشكل آلي، املأ الحقول الموجودة به وسيقوم هو بحساب معدلك بالساعة وراتبك السنوي، هكذا فقط!. تذكر أن سعرك قد يختلف باختلاف العميل، فإن التسعير للعملاء التجاريين مثلاً سيكون أعلى مقارنة بالعملاء الذين يمثلون هيئات غير ربحية. كما أن عليك تذكر أن عليك زيادة سعرك كلما زادت خبرتك. الفشل في دراسة النفقات تحدث مشكلة النفقات بشكل متكرر حين ينسى العديد من المستقلين شيئاً من نفقاتهم في بداية مشوارهم المهني، سواءٌ كان ذلك النسيان لفواتير قديمة أو لنفقات لم يضعوها في حسابهم أصلاً. ولحل هذا الأمر، فإن تطبيقاً مثل Expensify سيلتقط صورًا من الفواتير على هاتفك ويحولها إلى تقرير أنيق، وهو متاح مجانًا للاستخدام الشخصي. أما على مقياس أكبر، فإن منصة سحابية مثل inDinero تتيح لك متابعة نفقاتك، وتسحب بياناتك من حساباتك البنكية وبطاقاتك الائتمانية، لتوفر نسخة من بيانات أموالك ونفقاتك المتوقعة مستقبلاً. لديك أيضاً خدمة الفواتير السحابية المجانية Hiveage وهي خدمة تستقبل المدفوعات وتصدر الفواتير بشكل آلي. كما يوفر عملاق الدفع الإلكتروني PayPal خدمة فواتير أيضاً. أخيرًا عندما تغلق صفقة ما، فإن تطبيق Shack لديه مكتبة من قوالب العقود التجارية الموجهة للمستقلين، حيث يمكنك استخدامها لإنشاء مستندات قانونية. كراهية التغيير عليك أن تعود نفسك المرونة كونك مستقلاً، عليك أن تطارد العمل، إذ أنه لن يطرق بابك دائماً، وهذا يعني بقاؤك على اطلاع دائم بكل جديد في مجالك وتأكدك أنك تواكب ما يستجد في مجالك إن لم تستطع سبقه. يجب أن لا تغالط نفسك وأن لا تعتقد بأن الخبرة تغنيك عن مُتابعة المُستجدّات. فإذا أردت مواكبة الأحداث الجارية فهناك مواقع عديدة (كـ Hacker news مثلًا) تبقيك على اطّلاع بكل التطورات في مجال تخصّصك. الحاجة إلى الصحبة إن العمل الحر مجال قد يشعرك بالوحدة، فمن الوارد أن تمضي أسابيع إذا كنت مشغولاً دون أن ترى مخلوقاً سوى قطتك. قد لا يتحمل هذا النظام القاسي بعضُ الناس الذين لا يستطيعون العمل دون صحبة. لكن على أي حال يمكنك الالتفاف حول الأمر عن طريق العمل في مساحات العمل المُشترك أو في الأماكن والمكتبات العمومية. خاتمة لا شك أن العمل الحر طريقة رائعة لكسب المال، لكن عليك تجنب بعض المشاكل والفخاخ التي قد تتسبب بفشلك. ومن الناحية الأخرى، فإن هذه المشاكل لها الكثير من الحلول والحيل التي تبقيك بعيداً عن شراكها، ويمكنك تلخيصها فيما يلي: الفشل في التنظيم: هناك الكثير من التطبيقات التي يمكنها مساعدتك. الاستسلام للضغوط: المنافسة حتمية، تجاوزها لتستطيع التركيز على نقاط قوتك. الفشل في التميز: ابحث عن مشاريع تميزك عن غيرك وتلائمك. الفشل في تحديد المعدل المناسب أو المقياس الزمني: ادرس الأمر بعناية. الفشل في دراسة النفقات: استخدم برامج سحابية للقيام بالأمر عنك. كراهية التغيير: ابق على إطلاع بمستجدات عملك عبر مواقع الإنترنت في مجال تخصصك. الحاجة إلى الصحبة: جرب مساحات العمل المشتركة. هل ترى من أسباب أخرى لفشل المستقل في عمله؟ وكيف تتجنبها؟ دعنا نسمع منك في التعليقات! ترجمة -وبتصرّف- للمقال (Common Reasons Freelancers Fail (And How to Avoid Them لصاحبه Tom Ewer.
  8. الهاتف المحمول هو جهاز مختلف جدّا عن الحاسوب المكتبي أو الحاسوب المحمول بالتأكيد كلّها تتحدّث نفس اللّغة الثنائية لغة الصفر والواحد ولكن كيفية تفاعلنا معها واستخدامنا لها، بل وحتى علاقتنا مع كل واحد منها تختلف عن الآخر. التصميم للمحمول يتطلّب عقلية مختلفة بعض الشيء عن التصميم للحاسوب. يتطلّب مهارات مختلفة وبالتأكيد إلى قواعد أخرى. لستَ مضطرا إلى التخلّي عمّا توّصل إليه العلم من قواعد تتعلّق بتجربة المستخدم خلال الثلاثين سنة الماضية. لكن الكثير ممّا يصلح على الحاسوب لن يصلح -بكل بساطة- على المحمول. بعد أخذ كلّ ما قيل بعين الاعتبار، نقدّم هنا عشرة مبادئ للتصميم والتّي أعتقد أنّها رئيسية لإعداد تجارب استخدام ناجحة. من الواضح أنّه يجب التفكير في أكثر من هذه المبادئ العشرة ولكن كبداية فهي مفيدة جدّا. 1. ركز على الأهداف الرئيسية للمستخدم إذا كنت كبيرا بالسّن مثلي فربّما تتذكّر جهاز المساعد الرقمي الشخصي لشركة Palm (أنظر الصّورة أدناه). جهاز المساعد الرقمي الشخصي لبالم كان سابقًا للهاتف الذّكي الذي نعرفه اليوم. جهاز المساعد الرقمي الشخصي لبالم، السابق للهاتف الذكي الحديث بالم كان واحدا من روّاد الحوسبة المحمولة، وكانت هذه الشركة تتحكم بشكل جيّد في مبادئ التصاميم المحمولة. لقد ساعدت في كتابة السطور الأولى من قواعد تصميم تجربة المستخدم، وأحثّك على أن تُلقي نظرة على كُتيّب Zen of Palm الرقمي الذي يقدّم توجيهات حول تصميم تطبيقات المساعد الرقمي الشخصي لبالم. ربّما يكون عمر هذا الكُتيّب الآن أكثر من عشر سنوات ولكنّه يحمل نصائح لا تزال قيّمة إلى يومنا هذا. أوضحت بالم وجوب التركيز على أهداف المستخدم الرئيسية. في دليلهم للتصميم شبّهوا الحاسوب بالسيارة الرّباعية الدفع، والمحمول بالسيّارة الرياضية الخفيفة والرشيقة. كالسيّارة الرياضيّة التطبيق أو موقع الويب المحمول يجب أن يكون خفيفا. يجب أن يكون سريعا، رشيقا، مركَّزا ومقتصِرا على الأساسيات. لا يجب أن يُملأ بالميزات غير الضرورية التي لا تتناسب مع صغر الأجهزة المحمولة وتعقيداتها. فظرف استخدامها قصير ولا يسمح بالتركيز ومحاولة الكثير فكّر فيما يرغب المستخدمون بإنجازه وركّز على أهدافهم. مثلا ربّما يحتاج المستخدمون إلى البحث عن فندق محّلي، معرفة ساعة انطلاق القطار القادم أو الإطّلاع على حالة الطقس اليوم. ركّز على الأهداف الرئيسية التي حددتها (من خلال بحث المستخدم) ولا تشتت أفكارك بمحاولة تصميم وإضافة ميزات من المستبعد أن تستخدم على المحمول. التطبيق المحمول يجب أن يكون كالسيّارة الرياضيّة -سريع، رشيق، مُرَكَّزًا ومُقتصِرا على الأساسيات. 2. لا تنقل أفكارا ومبادئ من الحاسوب هل يبدو لك هذا مألوفا؟ "بسرعة، نحتاج [تطبيقا /موقع ويب]، ونحتاجه الآن. خذ تصميمنا الحالي وقم بتشغيله على المحمول. ليس الأمر في غاية الصعوبة؟" حسنا...، الأمر بسيط جدا، تعديل بسيط على CSS، غيّر بعض الأمور هنا وأمورًا أخرى هناك وانتهى كلّ شيء، النتيجة تصميم محمول رديء لأنه لم يأخذ بعين الاعتبار خصوصيّات الأجهزة المحمولة. لا يمكنك ببساطة نقل تصميم موجّهة للحواسيب إلى تصميم محمول، ليس الأمر بهذه السهولة. الفرق شاسع بين الجهازين. التفاعل مع الجهازين مختلف (الفأرة مقابل اللمس) حجم الشاشة مختلف (كبير مقابل صغير) مدّة الاستخدام مختلفة (طويلة مقابل قصير ومكثّف) ظروف الاستخدام مختلفة (داخلي مقابل خارجي وفي الهواء الطلق) والقائمة تطول. إن كنت لا تصدّق قولي بأّن نقل تصميم حاسوبي إلى تصميم محمول ليس بالفكرة المثلى فقط ألقِ نظرة على واجهات حاسوب ميكروسوفت الكفّي الأوّلي وويندوز موبايل. الحاسوب الكفّي، برهنة لما سيحدث في حال نقل تصميم حاسوبيّ إلى تصميمٍ محمول بدلا من محاولة نقل تصميم حاسوبيّ إلى تصميمٍ محمول، سيكون من الأفضل أخذ خطوة إلى الوراء والبحث في كيفية إنجاز تصميم محمول جديد. ماهي الأهداف الرئيسية التّي تحتاج أن تركّز عليها؟ ماهي الميزات التي يمكن حذفها؟ بماذا ستتميّز رحلة مستخدم المحمول عن رحلة مستخدم الحاسوب؟ كيف ستغيّر واجهة المستخدم حتى تدعم اللمس وتتناسب مع شاشة أصغر بكثير؟ أظّن أن الكثير من التصاميم المتجاوبة تُخفق هنا. كان يُفترض بك أن تقوم ببعض التعديلات البسيطة على تصميم موجّه للحواسيب حتى يعمل على المحمول. رغم أن هذا يمكن أن يكون مقبولا في التفاعلات البسيطة كقراءة مقال، لكن هذا غير ممكن في التفاعلات المعقدّة. بدلا من محاولة النقل ببساطة من تصميم مُعدّ للحواسيب إلى تصميم محمول، من الواجب حقّا أن تعيد التفكير في تصميمك الخاص بالحواسيب. لا تحتاج أن تبدأ مجددا من الصفر ولكن من المؤكد أنك ستفكّر في تصميم يأخذ بعين الاعتبار نقاط الاختلاف الرئيسية بين الحاسوب والمحمول. 3. تخلص من الفوضى الفوضى هي أحد أعداء للتصميم الجيّد. الفوضى سيّئة بما فيه الكفاية في الحاسوب أو في موقع الويب ولكن على المحمول هي أسوأ بمئات المرات. نصوص وعناصر غير ضرورية تبعثر واجهة المستخدم، ميزات غير ضرورية تشوّش تجربة المستخدم. من المهّم التخلّص من كلّ ما هو غير ضروري في التصميم المحمول. استخدم الأيقونات بدلا من النصّ، ولكن لا تزال تحتاج إلى الاستعانة بإضافة وصف إن كانت الأيقونة غير واضحة. استخدم الكشف التدريجي progressive disclosure لإظهار عناصر التحكم الرئيسيّة والمحتوى، مع إضافة خيار لعرض المزيد. باختصار، ما يمكن التخلّص منه في التصميم المحمول يجب أن تتخلص منه. في الحقيقة إن كان بإمكانك أن تتخلّص من كامل الواجهة فلتفعل ذلك. هل قرأت مقال قولدن كريشنا المحفّز أفضل واجهة على الإطلاق هي عدم وجود واجهة والكتاب الذي يحمل نفس العنوان لتعرف لماذا تكون أفضل تجارب المستخدم المحمولة غالبا دون تفاعل، أو على الأقل تتطلّب القليل من التفاعل مع الواجهة. 4. قسم المهام إلى أجزاء صغيرة تقسيم المهّام إلى أجزاء صغيرة هو مبدأ ثابت من مبادئ تصميم تجربة المستخدم، كتقسيم مراحل الدّفع (على المتاجر الإلكترونية) Checkout مثلا. هذا المبدأ مهّم بدرجة أكبر في التصاميم المحمولة لأنّك لا تريد أن تعقّد المهّام الصغيرة. لا تكرر نفس المراحل من موقع أو تطبيق على الحواسيب، لأن الأمر سيكون معقّدا على المحمول لكن اجعل كل خطوة بسيطة بقدر الإمكان وتركز على مهّمة واحدة. يمكن أن يزيد هذا في عدد الخطوات ولكن سيحسّن من تجربة المستخدم. 5. اجعل كل شيء أكبر مما هو عليه في الحاسوب أَعلم أن رغبة ما تشدّك إلى تصغير كل شيء في التصميم المحمول لكن قاوم هذه الرغبة قاوم، قاوم، قاوم. عندما تبتكر تصميما محمولا تحتاج إلى تكبير كل شيء عمّا هو عليه في الحاسوب خط أكبر، أزرار أكبر مسافة بين السطور أطول، أزرار تحكم أكبر، كلّ شيء أكبر. لماذا، لأن تصميمك يجب أن يراعي أصحاب الأصابع الخشنة، وضعاف النظر. من الوارد جدًا أن يُستخدم المحمول في الهواء الطلق حيث تكون القراءة أصعب، وارد أيضا أن يستخدموا الهاتف وهم يمشون حيث تكون قراءة الخطّ الصّغير معضلة. سيستخدمون إبهامهم للضغط على الأزرار وعناصر التحكم. ستتفاجأ أيضا حين تعلم أنّ ليس كلّ الهواتف المحمولة تملك شاشات دقيقة كما تعتقد. حاول أن تكون الأزرار وعناصر واجهة المستخدم على الأقّل بحجم 1سم x 1سم (حوالي 44 بكسل X 44 بكسل) فستكون بذلك قابلة للمس إذا لم يكن ذلك ممكنا فيمكنك التنازل قليلا عن الارتفاع لكن لا يجب أن يكون أقل من 44 بكسل X 30 بكسل. أيضا تأكد من أنّ هناك مسافة معقولة بين الأزرار وزِد في كلٍ من حجم النصّ وتباعد الأسطر. وكنقطة انطلاق، اجعل حجم الخطّ الأصلي 16 بكسل وارتفاع الخطّ % 200 . تجد في موقع Vary.com برنامجا صغيرا للتحقق من حجم الخطّ على موقع محمول. 6. قلل من الحاجة إلى الكتابة بحكم أننا لا نملك أقلامًا على أطراف أصابعنا، فإن الكتابة على الهاتف المحمول عملية بطيئة وشاقّة. لذلك من الأفضل التقليل دائما من معدّل الكتابة اللاّزمة في التصميم المحمول. أعط المجال للمستخدمين دائما للّمس بدلا من الكتابة، إذا كان ذلك ممكنا. اجعل الاستمارات قصيرة وبسيطة بقدر الإمكان وأزِل أيّة حقول لا لزوم لها. استخدم الميزات الذّكية كالإكمال التلقائي والبحث عن الرمز البريدي حتى يتسنّى للمستخدمين إدخال الحد الأدنى من المعلومات فقط. احفظ العناوين والتفاصيل الشخصية حتى لا يجد المستخدم عناءًا في إدخالها أكثر من مرّة، وإذا كان من الواجب إدخال المستخدم لكلمة المرور فالأفضل السماح له برؤية كلمة المرور التّي قام بإدخالها من خلال توفير خيار إظهار كلمة المرور. الكتابة بطيئة وشاقّة أثناء الحركة، حتى مع وجود القلم، لذلك تجنّب الحاجة إلى كتابة حيثما كان ذلك ممكنا 7. موضع اليدين يجب أن يؤثر على مكان عناصر التحكم إذا كنت تقرأ هذا المقال على جهازك المحمول فلاحظ كيف تمسكه، إذا كنت لا تقرأه على جهازك المحمول ولكن لديك جهاز بجانبك تناوله ولاحظ مكان أصابعك وإبهامك، أين يمكنك اللمس بسهولة، أي الأجزاء يمكنك الوصول إليها لو كنت تمسك المحمول بيد واحدة، إذا كان كلّ ذلك فهذا يعني أنّ لديك يدان كبيرتان جدّا أو هاتفا ضئيل الحجم. قبضة اليد ومكانها يجب أن يؤثرا على تموضع عناصر التحكم في التصميم المحمول. الصورة أدناه (المأخوذة من هذا المقال). تبيّن أيُّ المساحات على الشاشة الأسهل للّمس على محمول ذي حجم عادّي. حاول أن تضع الإجراءات الشاسعة في المساحة الخضراء السهلة الوصول، وضع أزرار التعديل والحذف التي لا تريد أن يلمسها المستخدم عن طريق الخطأ في المساحة الحمراء الصعبة الوصول مع هذا يجب دائما طلب تأكيد أو إلغاء أمر الحذف من المستخدم. من المهّم أيضا اختبار التصميم المحمول على بعض الأجهزة المحمولة ومدى ملائمته مع مجموعة من الأشخاص. يجب عليك أن تراقب كيف يتفاعل الأفراد مع تصميمك عندما يستخدمونه على جهازهم المحمول أو جهاز شبيه بجهازهم. مساحات اللمس على المحمول 8. استغل إمكانيات الهاتف الجوّلات الحديثة حقا هي معجزة العصر التكنولوجية. بلا شك هاتفك الذكي يحوي نظام التموضع العالمي الذي يمكنّك من معرفة مكانك في أي بقعة في العالم. ربّما يحوي على مقياس التسارع وجهاز تحديد الاتّجاه. ويحوي أيضا على كاميرا رقمية وميكروفون وهزّاز لمسي. حاول أن تستغّل هذه القدرات عندما يكون الأمر متاحا حتى تحسّن من تجربة المستخدم. مثلا يمكنك استخدام الكاميرا الرقمية لقراءة أرقام البطاقة الائتمانية بصفة آلية، يمكنك استخدام نظام التموضع العالمي للكشف عن المكان المحلّي وضبطه تلقائيا. يمكنك استعمال حركة هز المحمول وحركات أخرى في تصميمك. 9. اختبر، اختبر، اختبر على المحمول ثم اختبر مجددا في الكثير من الأحيان يبدو التصميم المحمول رائعا على شاشة كبيرة ولكن عندما يوضع على المحمول يفقد أكثر من نصف قيمته. لو أردّت أن تأخذ مبدأ رئيسيا واحدا فقط من هذا المقال فسيكون اختبار التصاميم المحمولة على الأجهزة المحمولة. وعندما أقول اختبار لا أعني بذلك اختبار التصميم على جهازك الخاص لترى إن كان يعمل دون أن ينهار. أعني اختبارا مع مستخدمين حقيقيّن على عدّة أجهزة مختلفة. بالطّبع يجب عليك أن تقوم بتجربته بمفردك أوّلا، ولكن فقط عندما تطلب من المستخدمين القيام بمهّام حقيقيّة حينها سترى الأداء الفعلّي لتصميمك. باستخدام آخر وسائل النمذجة المبدئية مثل InVision ،Axure و Proto.io من السهل جدّا اليوم ابتكار نموذج مبدأي تفاعلي محمول. الخدمات المتاحة مثل Usertesting.com و UX recorder و InVision تسمح لك بتسجيل حصص الاختبارات فلا يوجد حقيقة عذر لعدم تجربتها ،وصدق قول القائل "ليس الخبر كالعيان" وعندما نتحدّث عن تجربة المستخدم فلا بدّ أن تكون المعاينة مع اختبار جيّد. 10. ابتكر تجربة سلسة ماهي أوجه الشبه بين فيسبوك، أمازون و سبوتيفاي؟ بغض النظر عن كونها شركات رائدة في السوق، فهي شركات تعرف جيّدًا أهمّية تقديم تجربة سلسة لمستخدميه. خذ تطبيق سبوتيفاي على سبيل المثال يمكنك إعداد قائمة الأغاني على حاسوبك الشخصي وعلى الفور ستكون القائمة متاحة على المحمول. هم يقدّرون أن تصميم التطبيق المحمول أمر هام، ولكن تصميم تجربة سلسة بين الحاسوب الشخصي، الجوّال والحاسب اللوحي بالنسبة للمستخدم أمر لا يقل أهميّة. لا تنعزل بالتفكير في تصميم التطبيق المحمول، يجب الأخذ بعين الاعتبار الصورة كاملة. مع أي محطة من محطات الاستخدام يتناسب استخدام الهاتف الذكي. هل ستبدأ الرحلة على الأرجح بالهاتف الذكي؟ أين تقع نقاط الانتقال المحتملة بين القنوات، من الجوّال إلى الحاسب مثلا؟ حاول أن تصممّ تجربة سلسة بدلا من تصميم تجربة محمولة، تجربة رائعة عندما تُقَدّم بشكل منعزل ولكن فاقدة لقيمتها عندما تنضّم إلى سائر أجزاء الأحجية المكوّنة لتجربة المستخدم الشاملة. ترجمة -وبتصرّف- للمقال 10key mobile UX design principles لصاحبه Neil Turner.
  9. هنالك العديد من البرمجيات المفيدة جدًا المطورة من فريق خادوم أوبنتو وغيرهم التي تندمج اندماجًا جيدًا مع نسخة خادوم أوبنتو، لكن ربما لا تكون معروفةً جدًا؛ سيعرض هذا الدرس بعض التطبيقات المفيدة التي تسهِّل إدارة خادوم، أو عدِّة خواديم أوبنتو. pam_motd عندما تسجل دخولك إلى خادوم أوبنتو، ربما تلاحظ "رسالة اليوم" (Message Of The Day اختصارًا MOTD)؛ تأتي هذه المعلومات وتُعرَض من حزمتين: 1. الحزمة landscape-common: توفر المكتبات الأساسية لبرمجية landscape-client، التي يمكن أن تُستخدَم لإدارة الأنظمة باستخدام تطبيق الويب Landscape؛ تتضمن هذه الحزمة الأداة ‎/usr/bin/landscape-sysinfo التي تُستخدَم لجمع المعلومات التي تُعرَض في MOTD، مثل المعالج، والذاكرة، والمساحة التخزينية للقرص الصلب ...إلخ. على سبيل المثال: System load: 0.0 Processes: 76 Usage of /: 30.2% of 3.11GB Users logged in: 1 Memory usage: 20% IP address for eth0: 10.153.107.115 Swap usage: 0% Graph this data and manage this system at https://landscape.canonical.com/ ملاحظة: يمكنك تشغيل الأمر landscape-sysinfo في أي وقت يدويًا. 2. حزمة update-notifier-common: التي توفر معلومات عن التحديثات المتوفرة للحزم، والتحققات من أنظمة الملفات (fsck)، ومتى يجب إعادة الإقلاع (مثلًا، بعد تحديث النواة). تنفِّذ pam_motd السكربتات في ‎/etc/update-motd.d في ترتيبٍ مبنيّ على الرقم الذي يسبق اسم السكربت؛ يُكتَب ناتج السكربتات إلى ‎/‎var/run/motd، بترتيبٍ رقمي، ثم تُجمَّع مع ‎/etc/motd.tail. يمكنك إضافة البيانات الديناميكية إلى رسالة اليوم؛ فمثلًا، لإضافة معلومات الطقس المحلي: أولًا، ثبِّت حزمة weather-util: sudo apt-get install weather-util تستخدم أداة الطقس بيانات METAR من National Oceanic and Atmospheric Administration and Forecast من National Weather Service؛ وللعثور على المعلومات المحلية، فستحتاج إلى رمز ICAO من أربعة محارف؛ الذي يمكن تحديده بتصفح موقع http://www.weather.gov/tg/siteloc.shtml. وعلى الرغم من أن National Weather Service هي وكالة حكومية تابعة للولايات المتحدة، لكن هنالك محطات طقس متوفرة في جميع أنحاء العالم، لكن ربما لا تتوفر معلومات الطقس لجميع المناطق خارج الولايات المتحدة. أنشِئ الملف ‎/usr/local/bin/local-weather، الذي هو سكربت شِل بسيط للحصول على الطقس لمنطقتك المحلية: #!/bin/sh # # # Prints the local weather information for the MOTD. # # # Replace KINT with your local weather station. # Local stations can be found here: http://www.weather.gov/tg/siteloc.shtml echo weather -i KINT echo اجعل السكربت قابلًا للتنفيذ: sudo chmod 755 /usr/local/bin/local-weather ثم أنشِئ وصلةً رمزيةً إلى ‎/etc/update-motd.d/98-local-weather: sudo ln -s /usr/local/bin/local-weather /etc/update-motd.d/98-local-weather في النهاية، أغلق جلستك الحالية، وأعد تشغيل الدخول لمشاهدة رسالة اليوم الجديدة. يجب أن يُرحَّب بك الآن ببعض المعلومات المفيدة؛ لكن بعض المعلومات حول الطقس المحلي قد لا تكون مفيدةً جدًا! لكن هذا المثال يشرح مرونة pam_motd. etckeeper يسمح etckeeper بتخزين محتويات ‎/etc/‎ بسهولة في مستودع نظام تحكم بالإصدارات (VCS)؛ حيث يندمج مع apt لكي يودع التغيرات الحاصلة على ‎/etc تلقائيًّا عندما تُثبَّت أو تُحدَّث الحزم. وضع ‎/etc ضمن مستودع للتحكم بالإصدارات هو أفضل ممارسة يُنصَح بها في مجال العمل، وهدف etckeeper هو جعل هذه المهمة أسهل ما يمكن. أدخِل الأمر الآتي في الطرفية لتثبيت etckeeper: sudo apt-get install etckeeper ملف الضبط الافتراضي ‎/etc/etckeeper/etckeeper.conf هو بسيط جدًا؛ الخيار الرئيسي يكون لضبط أي متحكم بالإصدارات ليُستخدَم؛ افتراضيًا، يكون etckeeper مضبوط لاستخدام Bazaar للتحكم بالإصدارات؛ ويُهيَّأ المستودع تلقائيًّا (ويُودَع فيه لأول مرة) أثناء عملية تثبيت الحزمة؛ من الممكن التراجع عن هذه الخطوة بإدخال الأمر: sudo etckeeper uninit سيودع etckeeper التغيرات غير المودعة التي حصلت على ‎/etc يوميًا افتراضيًا؛ يمكن تعطيل هذا باستخدام خيار الضبط AVOID_DAILY_AUTOCOMMITS؛ وستودع أيضًا التغيرات تلقائيًا قبل وبعد تثبيت الحزم؛ للمزيد من القدرة على التحكم بالتغيرات، من المستحسن أن تودع التغيرات يدويًا مع رسالة الإيداع كما يلي: sudo etckeeper commit "..Reason for configuration change.." يمكنك باستخدام أوامر VCS مشاهدة سجل المعلومات حول الملفات في ‎/etc: sudo bzr log /etc/passwd لشرح طريقة الاندماج مع نظام إدارة الحزم، جرِّب تثبيت الحزمة postfix: sudo apt-get install postfix بعد انتهاء التثبيت، ستودَع كل ملفات ضبط postfix إلى المستودع: Committing to: /etc/ added aliases.db modified group modified group- modified gshadow modified gshadow- modified passwd modified passwd- added postfix added resolvconf added rsyslog.d modified shadow modified shadow- added init.d/postfix added network/if-down.d/postfix added network/if-up.d/postfix added postfix/dynamicmaps.cf added postfix/main.cf added postfix/master.cf added postfix/post-install added postfix/postfix-files added postfix/postfix-script added postfix/sasl added ppp/ip-down.d added ppp/ip-down.d/postfix added ppp/ip-up.d/postfix added rc0.d/K20postfix added rc1.d/K20postfix added rc2.d/S20postfix added rc3.d/S20postfix added rc4.d/S20postfix added rc5.d/S20postfix added rc6.d/K20postfix added resolvconf/update-libc.d added resolvconf/update-libc.d/postfix added rsyslog.d/postfix.conf added ufw/applications.d/postfix Committed revision 2. وكمثال عن طريقة تتبع etckeeper للتغيرات اليدوية، أضف مضيفًا جديدًا إلى ملف ‎/etc/hosts؛ ثم استخدام bzr لمشاهدة أي ملفات قد عُدِّلَت: sudo bzr status /etc/ modified: hosts يمكنك إيداع التغيرات الآن: sudo etckeeper commit "new host" للمزيد من المعلومات حول bzr، راجع درس نظرة سريعة على Bazaar، نظام التحكم في الإصدارات على أوبنتو. Byobu أحد أكثر البرامج فائدةً لأي مدير أنظمة هو screen، حيث يسمح بتنفيذ عدِّة صدفات (shells) في طرفية واحدة؛ ولجعل بعض ميزات screen المتقدمة أكثر قربًا من المستخدم، ولتوفير بعض المعلومات المفيدة عن النظام؛ أنشِئت الحزمة byobu. عند تنفيذ byobu، سيُظهِر الضغط على زر F9 قائمةَ الضبط التي تسمح لك بما يلي: عرض قائمة المساعدة. تغيير لون خلفية Byobu. تغيير لون أمامية Byobu. تبديل ظهور شريط الإشعارات. تغيير ربط المفاتيح. تغيير سلسلة الخروج. إنشاء نوافذ جديدة. إدارة النوافذ الافتراضية. «لا يبدأ Byobu عند تسجيل الدخول (تفعيل ذاك الخيار)". ربط المفاتيح يحدد بعض الأمور مثل سلسلة الخروج (escape sequence)، وإنشاء نافذة جديدة، وتغيير النافذة ...إلخ. هنالك مجموعتا ربط للمفاتيح يمكن الاختيار بينها، واحدة باسم f-keys، والأخرى screen-escape-keys؛ إذا أردت استخدام الربط الافتراضي، فاختر none. يوفر byobu قائمةً تُظهِر إصدارة أوبنتو، ومعلومات المعالج، ومعلومات الذاكرة، والوقت والتاريخ؛ مما يجعلها تبدو كقائمة سطح مكتب. تفعيل خيار "لا يبدأ Byobu عند تسجيل الدخول" سيجعل byobu يبدأ عند فتح أي طرفية؛ التغيرات التي تحصل على byobu تكون خاصة بالمستخدم، ولن تؤثر على بقية مستخدمي النظام. أحد الميزات في byobu هو نمط scrollback، اضغط على زر F7 للدخول بوضع scrollback، الذي يسمح لك بالتنقل إلى المخرجات السابقة باستخدام أوامر شبيهة بأوامر محرر vi؛ هذه قائمة سريعة بأوامر الحركة: h: تحريك المؤشر إلى اليسار محرفًا واحدًا. j: تحريك المؤشر إلى الأسفل سطرًا واحدًا. k: تحريك المؤشر إلى الأعلى سطرًا واحدًا. l: تحريك المؤشر إلى اليمين محرفًا واحدًا. : تحريك المؤشر إلى بداية السطر الحالي. $: تحريك المؤشر إلى نهاية السطر الحالي. G: تحريك المؤشر إلى سطر محدد (افتراضيًا إلى النهاية). ?: البحث إلى الخلف. n: الانتقال إلى المطابقة التالية إما إلى الأمام أو إلى الخلف. مصادر راجع صفحة الدليل man update-motd للمزيد من الخيارات المتوفرة لحزمة update-motd. راجع موقع etckeeper لمزيدٍ من التفاصيل حول استخدامه. راجع أيضًا صفحة ويكي أوبنتو "etckeeper". لآخر الأخبار عن bzr، انظر إلى موقع bzr الرسمي. لمزيد من المعلومات حول screen، راجع موقعه الرسمي. وأيضًا صفحة ويكي أوبنتو "Screen". راجع صفحة مشروع Byobu لمزيدٍ من المعلومات. ترجمة -وبتصرف- للمقال Ubuntu Server Guide: Other Useful Applications.
  10. مدخل إلى لغة r

    تعد لغة R من اللغات التي صعد نجمها حديثا وبشكل سريع بمجال البرمجة العلمية في قطاعي الإحصاء والمعلوماتية الحيوية (bioinformatics) حيث باتت معتمدة على نطاق واسع في كثير من الجامعات ومراكز البحث العلمية، وأصبحنا نرى استخدامها والإشارة إليها في المقالات المنشورة بالمجلات العلمية المحكّمة يزداد بشكل طردي ومتسارع، هذا عدى عن حقيقة كونها لغة حرة مفتوحة المصدر يخضع توزيعها لترخيص GPL الشهير. كل ذلك أدى إلى تزايد ما هو متوفر ومتاح على الشابكة (الإنترنت) من مصادر لها على توزع طيف تلك المصادر، فهناك الكتب الإلكترونية والدروس التعليمية وحتى المناهج الأكاديمية والدورات التدريبية إضافة إلى البرامج الجاهزة والمكتوبة بلغة R لتنفيذ هذه المهمة أو تلك، حتى أنها باتت تحظى ببعض الامتياز مقارنة بالعديد من العمالقة في قطاع البرمجة الرياضياتية العلمية والإحصائية مثل SAS و SPSS خصوصا في مجال توافر الجديد من الطرق والخوارزميات الحديثة، حيث يقاد هذا التوجه في معظمه من طرف الجامعات ممثلة بطلاب الدراسات العليا يحفّزهم على ذلك سهولة بناء الإضافات لهذه اللغة، ويعتبر هذا الأسلوب رغم ما قد يشوبه من نقاط ضعف تتعلق بموثوقية وجودة وغزارة تلك الإضافات الجديدة، والتي تتبع خبرة ومهارة مطوريها وناشريها، لكنها تبقى في القطاع العلمي والأكاديمي أفضل كثيرا من البدائل التجارية التي يعيبها ارتفاع ثمنها من جهة، ومن جهة أخرى بطئ إضافة التحديثات التي تعكس تطور القطاعات العلمية المختلفة، حيث أنها عادة ما تتبع دورة تجارية تتحكم بها الشركات المنتجة. سنحاول في هذه المقالة أن نقدم مدخلا مبسطا ومختصرا لأساسيات هذه اللغة ونستكشف بعضا من إمكانياتها واستخداماتها، والتي أتمنى أن أراها تدرّس في جامعاتنا يوما ما، بحيث تستخدم كأداة للاختبار والتجربة والتطوير ضمن الجلسات العملية لبعض المقررات العلمية في الكليات ذات الاختصاص. هذا هو الجزء الأخير في سلسة مؤلفة من أربع مقالات تهدف إلى التعريف بلغة R حيث قدم الجزء الأول مدخل عام إلى هذه اللغة بما فيها الإحصائيات الوصفية، أما الجزء الثاني فتحدث عن كيفية توليد بعض المخططات البيانية الإحصائية بلغة R، أما الجزء الثالث فتحدثنا فيه عن طريقة إجراء بعض التحاليل الإحصائية باستخدام هذه اللغة. للتذكير فقط، تستطيع أن تقوم بتحميل لغة R من الموقع الرسمي لها على الرابط http://www.r-project.org، وعملية تنصيب هذه اللغة تخلو من التعقيدات وبانتهاءها يمكنك تشغيل سطر الأوامر الخاص بها من خلال النقر على أيقونة اللغة على سطح المكتبة، وكل مانكتبه تاليا يكون داخل سطر الأوامر هذا، علما أننا نستخدم في كل أمثلتنا إطار البيانات المدعو mtcars والذي يأتي محزوما مع اللغة بشكل إفتراضي، وللحصول على معلومات إضافية عن طبيعة محتوى هذه البيانات يمكنك كتابة الأمر التالي في سطر الأوامر mtcars? ولاختصار طريقة الوصول إلى المعلومات ضمن إطار البيانات ننفذ الأمر (attach(mtcars فنصبح قادرين على استخدام التسمية mpg بدلا من استخدام الطريقة المفصلة mtcars$mpg للدلالة على عدد الأميال المقطوعة بغالون البنزين الواحد. عندما لا تكون المقادير المراد إختبارها كميّة متدرجة كما سبق وأن شاهدنا في تحاليل سابقة مثل إختبار t، بل هي قيم نوعية كحالة أنواع محركات السيارات من حيث عدد الإسطوانات cyl وارتباطها بنوع ناقل الحركة am هل هو أوتوماتيكي أم عادي، طبعا الغاية هي معرفة هل هناك فروق معنوية ما بين الفئات المختلفة للحركات من حيث عدد إسطواناتها، لمثل هكذا حالات عليك استخدام اختبار إحصائي يدعى باختبار chi-squared والمثال التالي يوضح كيفية تحضير بياناتك لهذا النوع من التحليل مستخدمين الدالة table حيث عرضنا في التعليمة التالية كيف سيظهر ناتج تنفيذ تلك الدالة على بياناتنا فقط لتوضيح شكل الجدول المطلوب تمريره للدالة chisq.test التالي والذي يقوم بتنفيذ الاختبار المقصود. كما جرت العادة فإن ما يهمنا من هذا الخرج هو قيمة p-value والتي تشير إلى إحتمال المصادفة (بمعنى أنه لاتوجد فروقات معنوية ما بين الفئات المختلفة وما يظهر لدينا من فروقات هي في هامش خطأ التجربة)، في المثال السابق قيمة p-value هي 0.01265 أي ضمن الحد المسموح به عادة للقبول بوجود فروق معنوية وهو 5% (أي 0.05)، وبالتالي فالفروق الملاحظة معنوية وموجودة، بمعنى أن نسبة السيارات ذات ناقل الحركة الأوتوماتيكي am=1 هي أكبر في حالة السيارات ذات عدد الإسطوانات الكبير مقارنة بتلك التي لديها محركات تحتوي على أربع اسطوانات فقط. ولمعرفة كم سيكون عدد السيارات ذات علبة التروس اليدوية أو الأوتوماتيكية في كل فئة من فئات المحركات الثلاث المصنفة بحسب عدد الإسطوانات وذلك في حال كان التوزع متساويا والفروقات غير موجودة نستخدم الدالة التالية: chisq.test(myTable)$expectedلننتقل إلى أداة أخرى تتيح لنا استكشاف جملة البيانات التي بين أيدينا وما فيها من علاقات وارتباطات وذلك من خلال شكل واحد يتضمن خريطة حرارية مضاف لها شجرتي عنقدة هرمية لكل من أعمدة البيانات التي لدينا (الصفات المدروسة مثل الوزن wt وعدد إسطوانات المحرك cyl وعدد الأميال المقطوعة بغالون البنزين الواحد mpg) وأسطر البيانات (وهي في حالتنا تمثل أنواع السيارات المدروسة مثل Toyota Corona و Honda Civic وغيرهما)، إن التعليمة التي نتحدث عنها هنا هي تعليمة heatmap لكن العقبة التي تقف في طريقنا هي نوع بيانات الدخل لهذه التعليمة، فهي لا تقبل إطار البيانات إنما هي بحاجة إلى بيانات محزومة على شكل مصفوفة! لا تقلق من هكذا عقبة، فهناك طيف كامل من التعليمات بلغة R مهمتها التحويل فيما بين صيغ وتنسيقات البيانات المختلفة، ولجميعها الصيغة التالية: y <- as.*(x)حيث x هي البيانات بتنسيقها الأصلي و y هي ذات البيانات بعد تحويلها إلى التنسيق المطلوب حيث يستعاض عن رمز النجمة * (في الصيغة الموضحة أعلاه) بالتنسيق الهدف والمطلوب التحويل إليه، فمثلا نجد مجموعة التعليمات التالية: (as.null(x و (as.numeric(x و (as.character(x و (as.factor(x الخ... وفق ذات الأسلوب، لدينا طقم آخر من التعليمات غايته التحقق إن كانت صيغة متحول ما تتبع تنسيقا بعينه أم لا، وتلك التعليمات تعيد القيمة المنطقية true إن كان المتحول يطابق التنسيق الخاص بالتعليمة فيما تعيد القيمة المنطقية false في بقية الحالات، حيث تجد على سبيل المثال مجموعة التعليمات التالية متاحة لك للاستخدام وهي: (is.null(x و(is.numeric(x و(is.character(x و (is.factor(x الخ... حسنا، لكن كيف سنستفيد من كل هذه المعلومات في حالة مثالنا المتعلق باستخدام تعليمة heatmap والتي تحتاج كدخل لها بيانات بتنسيق matrix وليس data.frame كما سبق وأن ذكرنا، للقيام بذلك سنستخدم التعليمة التالية لتحويل إطار بيانات mtcars الذي نستخدمه في مثالنا إلى تنسيق المصفوفة ونحفظه ضمن متحول جديد أسميناه للسهولة x وبعدها مررنا تلك المصفوفة x إلى تعليمة heatmap لنحصل على النتيجة الموضحة في الشكل التالي: x <- as.matrix(mtcars); heatmap(x, scale=”column”); من البديهي في الخريطة الحرارية الاستنتاج بأن النقاط التي تتقارب ألوانها في هذا المخطط تعود إلى قراءات متقاربة في القيمة ضمن البيانات التي استخدمت في توليد ذلك المخطط، كذلك فإن الأغصان التي تتلاقى مبكرا ضمن كل من شجرتي العنقدة الهرمية سواء للصفات (أعلى الرسم) أو السيارات (على يسار الرسم) تشير إلى تشابه أكبر من تلك التي تتلاقى في أماكن أبعد. نستطيع في لغة R كما في أي لغة برمجة أخرى أن نعرف توابعنا الخاصة ومن ثم نستدعيها، والمثال التالي يوضح حالة نموذجية بسيطة سنشرحها سطرا بسطر وبشكل مقتضب، حيث سنقوم بتعريف تابع جديد سندعوه SEM لحساب الخطأ المعياري المرتكب في حساب قيمة المتوسط، وهو للمصادفة الغريبة تابع غير موجود ضمن مجموعة توابع لغة R الأساسية! إن حساب تلك القيمة الإحصائية بسيط نسبيا فهي ناتج تقسيم الإنحراف المعياري على جذر عدد القراءات منقوصا منه واحد، لنلقي نظرة الآن على الشيفرة البرمجية التي نقوم من خلالها بتعريف هذا التابع: SEM <- function(x, na.rm = TRUE) { if (na.rm == TRUE) VAR <- x[!is.na(x)] else VAR <- x; SD <- sd(VAR); N <- length(VAR); SE <- SD/sqrt(N - 1); return(SE); }كما نلاحظ في السطر الأول فقد قمنا بتحديد اسم التابع قبل رمز الإسناد، أما ما يتلو رمز الإسناد فهو تصريح بأن ما نقوم بتعريفه هنا ما هو إلا تابع له وسيطين دعونا الأول x والذي يفترض به أن يتضمن شعاع القيم التي نرغب بحساب الخطأ المعياري المرتكب في حساب متوسطها، أما الثاني فدعوناه na.rm وهو وسيط اختياري بحسب الصيغة الموضحة أعلاه وقيمته الافتراضية هي TRUE وسنستخدمه لمعرفة إن كان المستخدم يريد تضمين أم حذف القيم غير المحددة أي القيم المفقودة، ومن ثم نرى القوس الكبير قد فتح ليقوم بحزم مجموعة التعليمات التي تنتمي إلى هذا التابع. السطر التالي مباشرة يتأكد من اختيار المستخدم بالنسبة لطريقة التعامل مع القيم المفقودة، فإن كان يرغب بحذفها نقلنا إلى المتحول الداخلي VAR فقط تلك القيم من x والتي ليست غير محددة أو مفقودة، وإلا فإن قيمة المتحول الداخلي VAR ستتضمن كامل قيم الشعاع x (وضعنا الأمر بهذه الصيغة لتوضيح آلية استخدام العبارات الشرطية والوسطاء ذات القيم الاختيارية، لكن الصواب في هذه الحالة بالذات هو أننا نقوم دوما باستثناء القيم الغير محددة فحساب قيمتنا غير ممكن بوجودها). بعد ذلك نقوم بحساب الانحراف المعياري للقيم التي باتت موجودة الآن في المتحول VAR وذلك من خلال استخدامنا للتابع sd ونحفظ الجواب الناتج بمتحول جديد ندعوه SD (تذكر أن لغة R حساسة لحالة الأحرف كبيرة كانت أم صغيرة بمعنى أنها تميز فيما بينها). أما في السطر التالي فنقوم بإيجاد عدد العناصر الموجودة بشعاع القيم VAR ومن ثم نحفظ ذلك العدد ضمن متحول جديد ندعوه N. وهكذا أصبحنا جاهزين لحساب قيمة الخطأ المعياري المرتكب في حساب متوسط مجموعة القيم هذه وذلك من خلال إجراء عملية القسمة لقيمة الانحراف المعياري على الجذر التربيعي لعدد القراءات بعد أن أنقصناه بمقدار 1، حينها نحفظ الجواب الناتج في متحول جديد دعوناه في مثالنا SE، لتأتي بعدها الخطوة الأخيرة باستخدامنا للأمر return ليعيد الجواب الناتج إلى من استدعى هذا التابع، ونختم أخيرا بإغلاق القوس الكبير الذي استخدم لحزم مجموعة التعليمات هذه رابطا إياها باسم التابع الذي صرحنا عنها بداية في السطر الأول. إن لغة R هي لغة مفتوحة المصدر إلى حد بعيد، فأي تابع تقوم بتعريفه مثل تابعنا الذي دعوناه SEM الوارد أعلاه، يستطيع المستخدم الاطلاع على شيفرته المصدرية كاملة بمجرد كتابة اسمه دون أي زيادة أو إضافات ومن ثم النقر على زر الإدخال، ليس هذا فحسب، بل حتى أنك تستطيع الإطلاع على كيفية كتابة التوابع الخاصة بلغة R نفسها دون كثير عناء، فعلى سبيل المثال إن كان لديك فضول لمعرفة طبيعة وتفاصيل الخوارزمية التي استخدمت في التابع cor لحساب قيمة معامل الارتباط أو التابع lm لحساب علاقة الانحدار وسواهما من التوابع الأخرى، فكل ما عليك القيام به هو كتابة اسم ذلك التابع دون أي إضافات أخرى ومن ثم النقر على زر الإدخال، لتقوم لغة R بعرض الشيفرة المصدرية الداخلية لذلك التابع كاملة أمامك. إن إحدى نقاط قوة لغة R هي سهولة توسعتها من خلال مجموعة الإضافات الهائلة المتاحة لها والتي قام بتطويرها الآلاف من الجامعات والمراكز العلمية وحتى الباحثين المستقلين وطلاب الدراسات العليا، يعينهم في ذلك السهولة النسبية في آلية بناء مثل تلك المكتبات أو الإضافة الجديدة لهذه اللغة، فهي لاتحتاج في أغلب الحالات إلى أي خبرات أو معارف خارج نطاق لغة R نفسها وهو أمر ممتع ومميز بحق، للإطلاع على لائحة الإضافات الرسمية المنشورة على موقع لغة R نفسها يمكنكم التحقق من هذا الرابط (ملاحظة: لقد اخترنا مخدم موجود في روسيا الاتحادية لضمان الوصول إليه بسهولة دون أي حجب!): أما لمن لديه فضول التعرف على آلية بناء مكتبته أو إضافته الخاصة فأحيله إلى هذا المرجع السهل والمميز. من الإضافات المميزة التي أنصحك قارئي العزيز بالإطلاع عليها هناك الإضافة ggplot2 والتي تفتح أمام مستخدمي لغة R آفاقا واسعة لتحسين وإثراء نوعية المخططات البيانية التي يمكن توليدها والحصول عليها، وهذه الإضافة هي إضافة ذائعة الصيت حتى أن هنالك كتب كاملة تتحدث عنها وعن مزاياها وإمكانياتها، كذلك نذكر الإضافة doSMP على سبيل المثال والتي قد تكون واحدة من الإضافات الأولى التي ترغب بالتعرف عليها إن كنت تطمح لقرع باب الحوسبة التفرعية، فهي أداة بسيطة تستطيع من خلالها تحويل بنى الحلقات البسيطة إلى نسخة تفرعية تستثمر كامل طاقة نوى المعالج أو المعالجات التي لديك (حيث أن المعالجات الثنائية والرباعية النوى أصبحت شائعة في الأسواق هذه الأيام، والتوجه العام هو نحو زيادة عدد النوى المتاحة على شريحة معالج واحد). أخيرا وليس آخرا، تجدر الإشارة إلى أداة مميزة أخرى تدعى RExcel والتي تسمح للغة R أن تعمل بالتكامل مع تطبيق Microsoft Excel ذائع الصيت وواسع الانتشار للجداول الممتدة، فهي تمكن المستخدم من نقل البيانات من برنامج Excel إلى لغة R وبالعكس، هذا عدى عن تمكين مستخدمي برنامج Excel من استدعاء توابع لغة R المختلفة وتنفيذها على ما لديهم من بيانات مباشرة كما لو كان التعامل يتم مع أي تابع معتاد ضمن برنامج Excel، حيث سيتم تنفيذ التحليل باستخدام لغة R ومن ثم إعادة النتيجة إلي برنامج Excel بشكل مباشر وشفاف ليتم عرضها في إحدى الخلايا دون كثير عناء من قبل المستخدم. لا يخلو تنصيب هذه الأداة يدويا من بعض التعقيد لكثرة ما فيها من مكونات وما تحتاج إليه من ضبط وإعداد، لكن أسهل طريقة للحصول عليها جاهزة للعمل هي من خلال تنصيب RAndFriendsSetup والتي تستطيع الحصول عليها من خلال هذا الرابط: http://rcom.univie.ac.at. في ختام هذه السلسلة من المقالات، نحن نعي تماما أن ما قمنا به لا يتجاوز خدشنا لسطح المعرفة العميق بهذا المجال من العلوم سواء على صعيد الإحصاء أو لغة R ذاتها، لكنها مقدمة متواضعة نضعها بين أيدي المهتمين لينطلقوا منها ويبنوا عليها وصولا إلى نضج أعمق وإغناء أفضل لهذا الموضوع، وقد تجاوزنا في هذه السلسلة من المقالات عن تناول بعض المواضيع الشيقة التي ترتبط بهذا السياق وذلك سعيا منا وراء التبسيط والسهولة نظرا لأن هدفنا الأصلي كان تقديم مجموعة من المقالات التي تمثل مدخلا للغة R، وبالتالي فإن مناقشة أي موضوع يتسم بالتعقيد قد يضر بهذا الهدف والغاية، لكني قد أعود لاحقا للكتابة عن بعضها وأخص بالذكر هنا مناقشة موضوع تحليل التباين ANOVA شائع الصيت بين كل من خاض بمزيد من التفصيل في علم التحليل الإحصائي، لذا ترقبوا منا كل جديد. لائحة المراجع: http://www.r-project.orghttp://www.statmethods.nethttp://www.r-tutor.com
  11. إنّ كل مكتبات بايثون (مثل حزم التّطبيقات application packages) التي نقوم بتنزيلها باستخدام مدير الحزم package manager (مثل pip) يتمّ توزيعها باستخدام أداة مساعدة مُخصصة لهذا العمل، تقوم هذه الأدوات المساعدة بإنشاء توزيعات بايثون Python distributions والتي هي أساسا عبارة عن ملفات أرشيف مرقمة بإصدار ومضغوطة، تحتوي هذه الملفّات على جميع العناصر المتعلقة بما يتم توزيعه، مثل ملفات المصادر source files وملفات الموارد resource files. سنقوم في هذا الدرس بالتحدث عن الأدوات الضرورية للتوزيع، وسنتطرق إلى الخطوات الأساسية التي تسمح لنا بحزم المكتبات المفيدة الخاصة بنا، الوحدات modules، أو حتى التطبيقات applications والتي ستكون مفيدة لنا عند توزيع المشروع الخاص بنا على خادوم أو مشاركته على الإنترنت. توزيعات وحزم بايثونحتى ولو كنا قد عملنا قليلًا فقط مع بايثون، فنحن متآلفون مع مفهوم استخدام مدير الحزم (مثل pip ،easy_install) لتنزيل الوحدات والمكتبات (مثل هياكل تطوير التطبيقات application development frameworks) والتي يتم بعدها استيرادها واستخدامها لإنشاء واحدة جديدة. تقوم أدوات إدارة الحِزَم هذه -والتي تعمل محليا- بالاتصال إلى مصدر بعيد source (مثل دليل حزم بايثون Python Package Index – PyPI) وتنفيذ الإجراء المطلوب (كالبحث والتنصيب). تتكوّن طريقة توزيع تطبيق ما من تغليف الدليل directory الخاص به ببعض الملفّات الضّروريّة (مع القليل من الملفّات المُوصى بها)، تحديد العناصر المرتبطة (كالموارد resources والاعتماديات dependencies، إلخ) وإصدارها أو استخدامها في مكان آخر ببساطة. ملاحظة: نشجعك بشدة على العمل على بيئات افتراضيّة لعزل تنزيلات بايثون، الوحدات والتطبيقات التي تعمل عليها. 1. حزم بايثونالحزمة في بايثون هي تقنيا عبارة عن دليل قابل للاستيراد (باستخدام init__.py__ ) يحتوي على ملفات المصادر (كالوحدات)، ولا يجب الخلط بينها وبين حزم نظام التشغيل والتي هي تقنيًّا تطبيقات فعلية (مثل حزمة Debian)، ومع ذلك يجب أن نُلاحظ أنّ توزيعات بايثون في الواقع تدعى أيضًا بالحزم. مثال على بنية الحِزمة: package | |-- __init__.py2. تطبيقات بايثونعلى الرّغم من أنّه يُمكننا اعتبار أي شيء في بايثون كتطبيق وذلك ابتداء من ملف واحد وحتى مئات الملفات المُبعثرة عبر الحزم المُختلفة، فإنّ التطبيق في أغلب الحالات الواقعيّة يتكوّن من العديد من الوحدات والبعض من الاستيرادات الخارجيّة (من المكتبات). مثال على بنية التّطبيق: myapp | |-- __init__.py |-- amodule.py |-- anothermod.py |__ tests | | | |-- __init__.py | |-- .. | |-- . | ..3. مكتبات وأدوات توزيع بايثوننظرا لطبيعة شعبية لغة بايثون ووجود كميّة وافرة من مكتبات وتطبيقات الطرف الثالث third-party المكتوبة لأجلها فقد كان من الضّروري دوما إيجاد طريقة مُوحّدة وأبسط لتوزيعها، تُوجد العديد من المكتبات والأدوات المختلفة المُستخدمة لإنشاء توزيعات بايثون. تمّ إنشاء مجموعة الأدوات المساعدة لتوزيع بايثون والتي تدعى distutils من أجل التعامل مع مهام التوزيع. 4. دليل حزم بايثون (Python Package Index (PyPIدليل حزم بايثون أو PyPI هو مستودع مركزي (على الإنترنت Online) للمشاريع (توزيعات بايثون)، حيث تستخدم أدوات إدارة الحِزم مثل pip هذا المستودع من أجل استضافة، إيجاد وتثبيت الحِزَم. البدءفلنقم في البداية بإنشاء تطبيق بايثون بسيط وعام باستخدام إطار العمل المصغّر flask (إنشاء البنية) والذي يُمكننا لاحقًا تحزيمه. التطبيق عبارة عن تطبيق ويب بسيط جدا، ﻷن الهدف من الدرس هو كيفية التحزيم وليس التطبيق في حد ذاته. إنشاء بنية التطبيقنهدف إلى إنشاء مثال يشابه معظم مشاريع العالم الحقيقي، ولهذا من الأفضل أن نتخيّل حالة تحتوي على وحدات. بُنية المثال: /MyApplication |-- run.py |-- config.py |__ /app |-- __init__.py |-- /module_one |-- __init__.py |-- controllers.py |-- models.py |__ /templates |-- module_one |-- hello.html |__ /static |__ .. |__ .1. إنشاء المجلدات:/MyApplication |-- run.py |-- config.py |__ /app |-- __init__.py |-- /module_one |-- __init__.py |-- controllers.py |-- models.py |__ /templates |-- module_one |-- hello.html |__ /static |__ .. |__ .2. تعديل الملف run.py باستخدام برنامج nano:nano ~/MyApplication/run.pyنضع المحتويات التّالية بداخله: # Run a test server. from app import app app.run(debug=True)نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y. 3. تعديل الملف config.py باستخدام برنامج nano:nano ~/MyApplication/config.pyنضع المحتويات التّالية بداخله: DEBUG = True THREADS_PER_PAGE = 4 CSRF_ENABLED = True CSRF_SESSION_KEY = "secret"نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y. 4. تعديل الملف app/init.py باستخدام برنامج nano:nano ~/MyApplication/app/__init__.pyنضع المحتويات التّالية بداخله: from flask import Flask, render_template app = Flask(__name__) app.config.from_object("config") from app.module_one.controllers import module_one app.register_blueprint(module_one) نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y. 5. تعديل الملف app/module_one/controllers.py باستخدام برنامج nano:nano app/module_one/controllers.pyنضع المحتويات التّالية بداخله: from flask import Blueprint, request, render_template module_one = Blueprint("auth", __name__, url_prefix="/auth") @module_one.route("/hello") def hello(): return render_template("module_one/hello.html")نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y. 6. تعديل الملف app/templates/module_one/hello.html باستخدام برنامج nano:nano app/templates/module_one/hello.htmlنضع المحتويات التّالية بداخله: <DOCTYPE html> <html lang="en"> <head> <title>{% block title %}My Site{% endblock %}</title> {% block css %} {% endblock %} <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> Hello, world! </body> </html>نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y. البدء بتوزيع وحزم التطبيقبعد إنشاء بنية التطبيق المثالية لموقع ويب يستخدم flask، نستطيع المتابعة بالقيام بالخطوة الأولى في إعداد التوزيعة. 1. تبديل بنية المجلدمن أجل حَزْم تطبيقنا بشكل جيّد نحتاج للقيام ببعض الإضافات لبُنية مجلّدنا. /MyApplication |-- run.py |__ /app |-- __init__.py |-- /module_one |-- __init__.py |-- controllers.py |-- models.py |__ /templates |-- module_one |-- hello.html |__ /static |__ .. |__ . |-- setup.py # Distribution setup file |-- README.txt # Read-me file |-- MANIFEST.in # Distribution manifest file |-- CHANGES.txt # Changes logفلنقم بتبديل بنية المجلد لإنشاء الملفات الضروريّة: touch ~/MyApplication/setup.py touch ~/MyApplication/README.py touch ~/MyApplication/MANIFEST.py touch ~/MyApplication/CHANGES.py mv ~/MyApplication/run.py ~/MyApplication/bin/run2. إنشاء الملف setup.pynano ~/MyApplication/setup.pyنضع المحتويات التّالية بداخله: from distutils.core import setup setup( # Application name: name="MyApplication", # Version number (initial): version="0.1.0", # Application author details: author="name surname", author_email="name@addr.ess", # Packages packages=["app"], # Include additional files into the package include_package_data=True, # Details url="http://pypi.python.org/pypi/MyApplication_v010/", # # license="LICENSE.txt", description="Useful towel-related stuff.", # long_description=open("README.txt").read(), # Dependent packages (distributions) install_requires=[ "flask", ], )نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y. 3. إنشاء الملف MANIFEST.inإن كنا نحتاج إلى شحن دلائل إضافية (ثابتة static أو قوالب templates) يجب علينا التصريح عنها في manifest لكي يتمّ حَزْمها، سنقوم بفعل هذا في MANIFEST.in. nano ~/MyApplication/MANIFEST.inنضع المحتويات التّالية بداخله: recursive-include app/templates * recursive-include app/static *نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y. هذا هو كل ما نحتاجه ، الآن حِزمة توزيعة بايثون جاهزة ليتمّ تثبيتها وشحنها. 4. ملفات إضافيةيجب دومًا أن نتذكّر أنّه من أجل الحصول على توزيعة كاملة يجب أن يكون الملف/الدليل محتويًا على الملفّات التالية ومربوطًا بها: README.txtMANIFEST.inLICENSE.txtالتعامل مع التطبيق الجاهز للتوزيعبعد أن انتهينا من إنشاء تطبيقنا ومن ثم أجرينا التبديلات الضرورية لبنية الملف لتحضيره لبناء توزيعة لا تحتوي على أيّة أخطاء، نستطيع الآن البدء بالمرور على عمليّات الحَزْم. 1. كيف نقوم بإنشاء ملف التوزيعمن أجل توليد نسخة ملف التوزيع، نقوم بتنفيذ الأمر التالي: cd ~/MyApplication python setup.py sdistسيذهب هذا الأمر إلى إعداداتنا، يطبع العمليات التي يتمّ تنفيذها ويُوَلِّد ملف أرشيف tar داخل الدليل الجديد diet، مشابهًا لما يلي: # root@hostname:~/MyApplication# ls dist # MyApplication-0.1.0.tar.gzملاحظة: بما أنّنا لم نقم بتأهيل جميع المجلدات الفرعية (مثل static) وتعاملنا مع ملفات إضافية (مثل README.txt)، فقد نحصل على بعض التحذيرات أثناء عمليّة الإنشاء. 2. كيفية تثبيت التطبيقيستطيع الآخرون من الآن فصاعدًا تثبيت واستخدام التّطبيق باستخدام ملف setup.py الذي أنشأناه. من أجل تثبيت التطبيق نقوم بتنفيذ الأوامر التالية: python setup.py installإن كان هذا التثبيت من أجل التطوير وأردنا تثبيت المُتطلّبات سنقوم بتنفيذ ما يلي: python setup.py develop3. كيفية مشاركة التطبيقإن أردنا مشاركة الشيفرة على دليل حِزَم بايثون، نستطيع فعل ذلك عن طريق بدء الإجراء register كما يلي: python setup.py registerنستطيع إكمال هذا الإجراء عبر اتّباع التّعليمات التي تظهر على الشّاشة. وإن كنّا نملك تسجيل دخول مسجل registered login من أجل الرفع Upload فقط نستطيع استخدام الأمر التالي: python setup.py sdist upload4. كيفية إنشاء حزم من الإصدارات الجديدة للتطبيقنقوم بتحرير الملف setup.py عن طريق مُحرّر نصوص (مثل nano) وتعيين رقم الإصدار الجديد "version="0.1.1.نقوم بتحرير الملف CHANGES.txt لنعكس التغييرات.نقوم بإجراء التّعديلات الضّروريّة على الملفين LICENSE.txt و README.txt.رفع الشّيفرة بعد الخطوة السّابقة.ترجمة -وبتصرّف- لـلمقال How To Package And Distribute Python Applications لصاحبه O.S. Tezer. حقوق الصورة البارزة: Designed by Freepik.
  12. الوقت = المال، لن يفهم هذه المعادلة موظف عاديّ له وقت ثابت، براتب ثابت، أمّا بالنّسبة لمدوّن مستقلّ، فهذه المعادلة هي كلّ شيء، فكلّما استطعت القيام بعمل أكثر في وقت أقلّ ستحصل على المزيد من المال، وهذا ما يدفع الكثير منّا إلى إرهاق نفسه بالعمل الكثير، فالمستقلّ هو المسؤول الوحيد عن المبلغ الّذي سيجنيه كلّ شهر، ممّا يجعلنا نضغط الكثير من الأعمال معًا كلّ يوم، ونندفع للبحث عن نصائح وأنظمة إدارة الوقت ظانّين بأنه بإمكاننا إنجاز المزيد والمزيد والمزيد إن استطعنا بذل القليل من الجهد الإضافيّ. للأسف، فإن عقليّة "المزيد والمزيد والمزيد" سترمي بنا بعد فترة عاجزين يملؤنا الفراغ النّاتج عن الفشل، مع مستوى إنتاجيّة 0%، ويمكنك تخيّل كم سيكسب مستقلّ إنتاجيّته 0%. إذا كنت تريد بالفعل أن تزيد إنتاجيّتك، وأعني بها كمّية العمل ذا الجودة المرتفعة الّذي تقدّمه يوميًّا، فعليك التّوقّف عن الاستماع إلى النّصائح والإرشادات الّتي تزيّن لك الأوهام، وتَعِدُك بالحصول على السّر العظيم الّذي سيجعلك تنتج 50 ساعة في اليوم، دون أن ترهق نفسك وبدون أيّ شعور بالتّعب. ركّز بدلًا من ذلك على تطبيق نظامٍ شخصيّ خاصّ بك، لتقوم بأفضل ما يمكنك القيام به كلّ يوم، وتحافظ على هذه الوتيرة على المدى الطّويل، و سيساعدك هذا المقال لتصل إلى أفضل العادات الّتي تزيد إنتاجيّتك، وتحصل على أفضل النّتائج (والدّخل المادّي) كما لم تفعل من قبل. 1. توقف عن "إدارة الوقت" وابدأ بـ"إدارة الطاقة"لا تعني زيادة الإنتاجيّة أن تحشو أكبر قدر ممكن من النّشاطات في ساعات قليلة، بل تعني العثور على السّاعات الّتي تكون فيها متنبّهًا، صاحيًا، وتملؤك الطّاقة والحيويّة ثم تستخدم هذه السّاعات بحكمة. من الطّبيعيّ أن يكون للإنسان أوقات ذروة وأوقات انحسار في النّشاط، وربّما تسمع العديد من أصدقائك يتكلّمون عن الخمول الّذي يحصل في السّاعة 3:00 ظهرًا، فهذه طبيعة بشريّة، وليس بإمكاننا أن نبقى على نفس المستوى العقليّ والعاطفيّ والنّفسيّ طوال اليوم، فعليك أن تتعلّم التكيّف مع نمط تقلّبات طاقتك، وتنظّم أعمالك لتوافق أوقات الذّروة في النّشاط، فإن لم تفعل ذلك، وظللت تعاكس طبيعة جسمك فأنت تعرّض نفسك للإرهاق الشّديد وتعرّض جودة أعمالك للتّدنّي، وستكون بعيدًا كلّ البعد عن المال الّذي تطمح إليه. عليك معرفة أوقات الذّروة في يومك واستغلالها للأعمال الأكثر أهمّيّة، ومن ثمّ ادّخار الأوقات الّتي تقلّ فيها طاقتك واستغلالها للأعمال الأقلّ أهمّيّة، فلا بدّ من إدارة الطّاقة بالنّسبة للمدوّن المستقلّ، وذلك لأنّ عمله فكريٌّ وإبداعيّ، وعندما تكون متوافقا مع إيقاعك الطّبيعي ستكون أقرب للوصول إلى انسياب الأفكار السّلس إلى أناملك بدلًا من استجرارها بصعوبة حرفًا حرفًا من دماغٍ مقفل أصلًا. هل مررت من قبل بحالة خرقت فيها جدار الكسل والركود عندما اقترب موعد تسليم عملك كثيرا، ألم تتمكّن من إنجاز الكثير من العمل بجودة أفضل بكثير من المعتاد؟ هذا ما يحدث عندما تكون في قمّة طاقتك الفكريّة، هل ترغب في احتراف إدارة طاقتك؟ أولا: راقب مستوى طاقتك على مدار عدة أسابيعلاحظ الأوقات الّتي تنشط فيها، وتلك الّتي تفقد فيها التّركيز، متى يمكنك كتابة عشرات السّطور بسهولة، ومتى تفقد كلّ أفكارك لكتابة سطر واحد، ومتى تصل إلى تلك المرحلة الّتي توجب عليك شرب فنجان كبير جدًا من القهوة المركّزة لتعمل. ثانيًا: اجعل أعمالك متلائمة مع مستويات طاقتكبعد أن تتمكن من معرفة أوقات نشاطك وخمولك، قم بتنظيم أوقات العمل بحيث توافق أوقات النّشاط والإنتاجيّة الأعلى، فعلى سبيل المثال، أجد شخصيًّا أنّ وقت الفجر وما بعده يكون فيه ذهني متّقدا (رغم أنّه أكثر الأوقات الّتي أرغب فيها بالنّوم) فعندما أتمكّن من مقاومة نفسي والاستيقاظ في هذا الوقت أتمكّن من كتابة الكثير بأعلى جودة ممكنة، وفي المقابل، عندما أستسلم للنّعاس وأنام في هذا الوقت أصل إلى وقت التّسليم وقد تراكم عليّ الكثير من العمل، لذلك تعلّمت بأنّ عليّ الحفاظ على هذا الوقت الثّمين. سأقدّم فيما يلي مثالًا يبيّن جدول الأعمال الّذي يعتمد إدارة الطّاقة: صباحًا (مستوى عالٍ من الإبداع) = العمل على أكثر المشاريع صعوبة وتحدّيًا، سواء كان البدء بمسوّدة ذلك المقال الّذي طالما أجّلت البدء فيه لصعوبته، أو تحرير تدوينتي الّتي لن تجد لنفسها وقتًا بين انشغالاتي الأخرى.قبيل الظّهر(طاقة متوسّطة، لا يزال بإمكاني التّركيز ولكنّني لست في أفضل حالاتي) = أعمال إداريّة كالحسابات الماليّة، الرّد على رسائل البريد الإلكتروني وجدولة بعض المنشورات على مواقع التّواصل الاجتماعي.وقت العصر (في أضعف حالاتي، مشوّش وبائس) = شراء بعض حاجيات المنزل، قراءة بعض المقالات، إجراء بعض المكالمات الهاتفيّة، الاستمتاع قليلًا وإعادة الشّحن.المساء (موجة طاقة ثانية) = تحرير ما كتبته في الصّباح، إجراء بعض البحث والقراءة لما سأكتبه في صباح الغد، تحضير كتابات جديدة.عندما تتعلّم التّوافق مع إيقاع الطّاقة الخاصّ بك بدلًا من معاكسته، لن تهتمّ بالمدّة الّتي تقضيها خلال العمل، 4 ساعات أو 12 ساعة أو حتّى ساعتان، سيكون بإمكانك زيادة إنتاجيّتك باستمرار مع جودةٍ عالية، وستبقى مرتاحًا وزبائنك سعداء، ونقودك ستزيد وفوق ذلك كلّه فإنك ستنقذ نفسك من الإرهاق الشّديد الّذي طالما تسبّب بالفشل للكثير من المستقلّين. 2. احترم قاعدة الرقم 3لدى المدوّن المستقل عدد لا يُحصى من الاحتمالات لما يمكنه القيام به كل ساعة، فبإمكانك كتابة كتاب إلكتروني، كتابة بعض الدّروس، مراسلة الزّوار والرّدّ على تعليقاتهم، مراسلة زبائن جدد، وكلّ الأمور الأخرى الّتي تزيد دخلك المادّي، وفي كلّ لحظة لا تقوم بها بجميع هذه الأشياء معًا توبّخ نفسك وتتّهمها بالكسل وتعتبر بأنّك تؤدّي أقلّ مما عليك القيام به بكثير. ولكنّ محاولة القيام بألف أمرٍ معًا سيؤدّي إلى إنتاج الكثير من المقالات الرّديئة في أفضل الحالات، أمّا في أسوأ الحالات فيمكن أن تنتج محتوى بشعًا ومتدنّي الجودة إلى حد كبير، أو ربّما ستستسلم كلّيّا ولن تنتج شيئًا بسبب تشتّتك الكبير، وهذا ما لا يرغب بالوصول إليه أحد منّا، لذلك انتقِ أولويّاتك الثلاثة الأولى وناضل للالتزام بها فقط. قد يبدو الأمر مخالفًا للمنطق في البداية، فما أطلبه منك هو إنقاص الأمور التي ترغب بالقيام بها في اليوم الواحد لتزيد إنتاجيّتك، لكن لا تنسَ أنّها ستدفعك إلى الجنون لو أردت القيام بها حقًّا. ثلاثة أعمال يوميًّا رقم قابل للتحقيق، كبير بما يكفي ليمنعك من المماطلة، وصغير بما يكفي ليمنعك من الاستسلام، إن تمكّنت من الانتهاء من الأمور الثلاثة الأولى على قائمة أولويّاتك فسيكون ذلك رائعًا، وستتمكّن من القيام بأمور أخرى، ولكنّ ذلك لن يكون ممكنًا لو لم تصبّ كامل تركيزك على تلك الأمور الثّلاثة، وبذلك تنجز الأهمّ ثمّ المهمّ ولن تخلط الأولويّات لمجرّد أنك ترغب بإنهاء كلّ شيء في يوم واحد، وستستثمر وقتك لتقوم بما يعود عليك بأكبر نفع مادّي بدلًا من الاقتراب من الحدّ الأدنى الّذي كنت تتمنّاه بخطًى بطيئة. ربّما ترغب في جعل الأولويّات متعلّقة بوقت التّسليم، فتختار الأعمال الّتي لها أقرب موعد تسليم لتبدأ بإنجازها، وربّما تفضّل في أيام أخرى أن تبدأ بمشاريعك طويلة الأمد الّتي تحتاج إلى الكثير من العمل، حتّى لو كنت ستمشي خطوات صغيرة. بالنّسبة لي، أحبّ أن أقوم في اليوم الواحد بخليطٍ من بعض الأعمال الخاصّة بزبائني وبعض الأعمال الشّخصيّة، فقد أقوم بتأليف بعض الصّفحات لكتابي الإلكتروني، إنهاء تحرير مقالٍ لأحد زبائني وتحسين صفحة "أعمالي" في مستقلّ، وأيًّا كانت أولويّاتك الثّلاث، قم بكتابتها وجدولتها في المكان المناسب في اليوم حسب جدول الطّاقة الخاصّ بك، وقاتل من أجل البقاء ضمن هذه الأمور الثّلاث وإنهائها. 3. صادِق بعض التطبيقات المفيدةيُقال أن 20% من العمل الّذي ننجزه يعطي 80% من الأرباح الّتي نحصل عليها، وهذا يعني بأنك تصرف 80% المتبقّية من وقتك على أمور أخرى تعود بأرباح قليلة عليك، فكيف ستنقص من هذه النّسبة؟ تكمن الإجابة في الاستعانة بالمصادر الخارجيّة للقيام بهذه الأعمال بدلًا منك، والإنترنت مكان رائع بانتظارك ليسهّل عليك حياتك، عليك اعتبار البرامج الّتي تزيد الإنتاجيّة مساعديك الافتراضيّين الّذين ليس عليك دفع رواتبهم في آخر الشّهر (فالكثير من هذه التطبيقات مجّانيّة أو كلفتها منخفضة جدّا). استخدم كلّ الأدوات المنتشرة على الإنترنت لأتمتة العمل الّذي لا يحتاج إلى التّفكير، وبذلك توفّر طاقة دماغك للأمور الّتي تحتاجها بالفعل، وقد انتقيت لك بعض هذه الأدوات، وستجد العديد منها في كلّ مجالٍ من المجالات فاختر منها ما يناسبك: إدارة قائمة الواجباتTodoistTeuxdeuxToodledoDo It TomorrowWunderlistVitalistGet It DoneProducteevRemember the Milkتخزين الخواطر والأفكارEvernoteSimplenoteMicrosoft OneNoteMindjetSpringpadNotational Velocityالحفاظ على الوقتRescueTimeKlokTogglTickالمساعدة على التركيزConcentrateAnti-SocialTime OutFocus BoosterFocusWriter4. لا تنس إعادة الشحننحتاج إلى إعادة شحن أدمغتنا وأجسامنا وأرواحنا باستمرار، فالكاتب المحترف ينشغل طوال الوقت بالعمل الفكريّ، العاطفيّ والإبداعيّ، وبدون إعادة الشّحن ستجفّ قريحة الكاتب، ولذا يتوجّب عليك وضع وقت للرّاحة والاسترخاء ضمن برنامجك اليوميّ، ليس لملء الفراغ بين الأعمال، ولكن لأنّ الرّاحة ضروريّة لذاتها، وللأسف فإنّ العديد من المدوّنين المستقلّين ينزعجون ويشعرون بالذّنب إن اضطروا لأخذ يوم عطلة أو إجازة مَرَضيّة، أو حتّى لغفوة لربع ساعة لاستعادة النّشاط، ويظنّ أولئك بأنّ هناك الكثير ممّا كان بإمكانهم القيام به بدلًا من تلك الاستراحة، يمكنهم النّقاش، التّرويج، الكتابة والتّنقيح، وبطبيعتنا نشعر بأنّه إن كان بإمكاننا القيام بذلك، فعلينا القيام بذلك. ولكن إن أرهقت نفسك فقد تتوقّف عن العمل لأيّام، وربّما لأسابيع طويلة، وهذا أكثر بكثير من مجرّد ربع ساعة تغفو فيها على أريكة مريحة، أقول ذلك الكلام عن تجربة مريرة اضطررت على إثرها للتّخلّي عن كلّ أعمالي (عدا الأعمال ذات الأهمّيّة البالغة)، إنتاجك سيكون مساويًا لطاقتك لذلك حافظ عليها، وتأكّد من أن تقوم ببعض الأعمال يوميًّا فقط لتكون سعيدًا، لتحصل على الإلهام وتعيد شحن مدّخراتك. أرشّح لك بعض الأعمال الّتي يمكنك القيام بها يوميًّا لـ: إلهامك (كقراءة سيرة حياة شخصيّة تحبّها).جعلك تفكّر (كتعلّم مهارة جديدة أو مشاهدة TED talk).إثارة روح التّحدّي (كلعب بعض الألعاب على الحاسوب أو الجوّال).تسليتك (ربّما تحبّ مشاهدة قناة رسوم متحرّكة، أو اللعب مع ابنك ذي الخمس سنوات).قرأتُ أحد الأقوال الّذي أثار إعجابي مؤخّرًا للمدوّن ورائد الأعمال Ash Ambirge حيث قال: لذلك لا تنس أن تترك بعض الوقت لـتعيش كلّ يوم، ليس فقط لأنّ هذا سيرفّه عنك، بل لتزيد إنتاجيّتك وإبداعك. 5. ماذا تفعل عندما تشعر بالعجزلا مفرّ من أن يأتي يوم تصاب فيه بالزّكام أو وجع شديد في الرّأس، أو أن تصل إلى مرحلة "الانصهار الوشيك" لدماغك من الضّغط والتّعب، من البديهيّ عندها بأنّه لا يجب أن تعامل نفسك في هذه الحالات كما لو كان كلّ شيءٍ على ما يرام، إلّا أنّ زبائنك لن يتنازلوا عن الحصول على طلباتهم في الوقت المحدد، ولن تتمكّن للأسف من إيقاف جميع خدماتك في الوقت الّذي تكون فيه في أشدّ الحاجة للقيام بذلك، وفي حين لن تتمكّن من كتابة مقالة رائعة سيكون عليك البحث عن طرق لكتابة شيءٍ ما، أيّ شيء، لتنقذ نفسك من السّقوط. إليك بعض طرقي المفضّلة لإنجاز العمل حتّى عندما أكون في "وضع حفظ الطّاقة": اعمل بنبضات صغيرةسواء كنت تقوم بتدوين مقال أو تكتب كتابًا كاملًا فأنت تلعب لعبة طويلة الأمد تتضمّن الكثير من القرارات والمراجعات وإعادة الهيكلة بين حين وآخر، يمكنك تخيّل نفسك في سباق جري وقد أصابك التّعب الشّديد، عندها سيكون التّفكير في إنهاء السّباق ضربًا من الجنون، وبدلًا من ذلك عليك التّفكير في إنهاء مسافات قصيرة، ضع لنفسك أهدافًا أصغر وأكثر واقعيّة. حدّد لنفسك ساعة أو نصف ساعة، أو حتى 15 دقيقة تقوم فيها بالتّركيز على عمل بسيط يمكنك إنهاؤه في هذه المدّة، ربّما ستقوم بوضع رؤوس أقلام فقط بدلًا من عبارات كاملة، وربّما ستتمكن من كتابة سطر أو سطرين بدلًا من صفحة كاملة، المهمّ أن تبقي العمل مستمرًا وخذ أوقات استراحة بين هذه المهمّات الصغيرة، وفكّر بأنّك ستتمكّن من العودة في وقت آخر إلى الشّيء الّذي أنجزته في هذه المهمّات الصّغيرة، وستصقله لتنتج مقالًا يستحقّ النّشر، فكّر بأنّك الآن تحاول عبور بعض الأمتار فقط في السّباق، إلّا أنّ ذلك سيقرّبك حتمًا من خطّ النّهاية. استخدم نظام المكافآتعندما يكون آخر شيء ترغب بالقيام به هو إنجاز عملك فليس من العيب أبدًا أن تقدّم لنفسك بعض المحفّزات، كافئ نفسك على كلّ عمل عليك القيام به، إذا قمت بالعمل الفلانيّ، سأحصل على المكافأة اللذيذة الفلانيّة، طريقة بسيطة وبدائيّة، إلّا أنّها تعمل. على سبيل المثال: إن تمكّنت من كتابة مسوّدة لهذا المقال فسأسمح لنفسي بمشاهدة حلقة من (ضع هنا اسم مسلسل الأنمي الّذي تتابعه دون معرفة أحد من أصدقائك).إن قضيت 10 دقائق في عصف ذهني لعنوان أفضل لهذا المقال، فسأسمح لنفسي بتناول الشّوكولا المفضّلة عندي.إذا جلست الآن وقمت بإعادة صياغة هذا المقال فسأدعو نفسي على العشاء في المطعم المفضّل عندي.وهكذا، إيّاك أن تستخفّ بقوّة المحفّزات، أعط المكافأة الأعلى قيمة للعمل الأكثر أهمّيّة. 6. أنشئ نظامك الخاص"الإنتاجيّة" بعبارة أخرى هي "التّوازن بين العمل والحياة" والجميع يسعى للوصول إليها، ولكلّ شخص آراؤه الخاصّة وطريقته الخاصّة في ذلك، إلّا أنّ أفضل نظام يمكنك اتّباعه للوصول إلى الإنتاجيّة هو الّذي تبنيه بنفسك، لذا قم بتعديل ما قرأته في هذه المقالة كما تريد واختر ما يناسبك منها، فإن كان عليك الإقلاع عن فتح بريدك الإلكتروني لعشر ثوان كلّ دقيقتين لأنّ ذلك يلهيك ويستهلك منك الكثير من الطّاقة الدّماغيّة، أقلع عن ذلك فورًا، وإن لم يكن بإمكانك التّركيز على الكتابة صباحًا دون أن تتسلّل إلى بريدك الإلكتروني بضع دقائق لتتأكّد من أنّه لم يحدث شيء مريع أثناء نومك البارحة، تفضّل وافتح بريدك وتخلّص ممّا يعيقك عن التّركيز، وابدأ بالعمل بعد ذلك. جرّب هذا الأسلوب في الحياة، وأعد تقييم نفسك كلّ فترة، وخلال مدّةٍ وجيزة ستتمكّن من تفصيل نظام على مقاسك، وجعله مثاليًّا ليثمر عليك أفضل النّتائج، بالتّوفيق يا صاح. ترجمة -وبتصرّف- للمقال Freelance Blogging Productivity: The Only Guide You’ll Ever Need لكاتبته Kelly Gurnett. حقوق الصورة البارزة: Designed by Freepik.
  13. إن الهدف من إعداد وتجهيز المخططات الهيكلية (Wireframes) لمواقع الإنترنت هو حلّ مشاكل التصميم المُرتبطة بتخطيط وتصميم الصّفحة، وترتيب عناصرها، وذلك عبر ابتداع تصوّر للموقع قبل تطويره، وذلك باستخدام جملة من المُمارسات والمبادئ. إن تطبيق مبادئ جشطلت (Gestalt) على العناصر، سيُساعد على تحضير الأفكار بسرعة، فالفكرة من الأساس من العمل على هذا المُستوى من الجودة هو السرعة الّتي تُمكن المُصمّم من اكتشاف الأفكار بدرجة معقولة من الدقّة. تعلّمتُ بعض الطُرق المُفيدة في السنوات الأخيرة، جعلت مني أعمل بإنتاجيّة أكبر مع الحفاظ على الجودة، وبطبعي أكره كتابة عناوين من نوع" أفضل الحيل مع تصاميم المخططات الهيكلية" ولكن بعد عملي مع مُصممين قليلي الخبرة، وجدت أنّ بعض هذه المواضيع تحدث بشكل متكرّر ومن الضروري الإشارة إليها. 1. كل شيء مهم وذو معنى كل تلوين، كل خطّ، كل ظل، كل تدرّج لوني، كل شيء يَهم وله معنى، فاستخدام حواف وإطارات غير متقطّعة (solid)، وخلفيّة ملوّنة، وظلالًا، قد يكون أمرًا لا لزوم لها، خاصّة أنّ هذه العناصر يُمكن أنّ تنتقل إلى مرحلة التصميم والتطوير، وبدون أنّ يُفكّر بها مليًّا، فيجب على كل شيء أنّ يكون له معنى، وأنّ لا تُدرج العناصر والرسومات هنا وهناك اعتباطيًّا. الانسجام يُساعد يجدر الانتباه عند استخدام الرسم التمهيدي (sketching) هو أنّ التلوين والخطّ موحد في كامل الرسم (يعني، وجوب تبديل القلم المُستخدم، أو تغيير خطّ اليد من أجل إبراز الاختلاف)، بالإضافة إلى تتكرّر مُشكلة مع المخططات الهيكلية وهي الاختلاف في تدرجات الألوان وعمق السطور والخطّ المُستخدم، جميعها يُدرج ويُستخدم بدون تفكير، الأمر الّذي يجعل من المخطط الهيكلي صعب الفهم والقراءة، ويجعل مني أتساءل في معظم الأحيان: هل التغيير من الخط المُستخدم هنا متعمّد؟ هل هذه الرقعة (label) هي أكبر حجمًا لأنّها أكثر أهميّة؟ وغيره من هذه الأسئلة، ولتجنب هذه المشكلة، من المُستحسن استخدام مجموعة محدّدة من الألوان، (ربّما من 3-5 من اللون الرمادي) ونوعين من الخطوط، واستخدام عناصر HTML الافتراضيّة، مع العلم أنّ هذا قد يؤدي إلى مخططات هيكلية باهتة، ولكن يجب أنّ يُعلم أنّ جميع المخططات الهيكلية ينتهي الأمر بها إلى سهلة المهملات، فليس الغرض منها إبهار الزوّار، إنما الغرض هو تصميم برمجيّة قابلة للاستخدام، أمّا المخطط الهيكلي الخلّاب فهو مضيعة للوقت. إن من الأمور المُهمّة الّتي يجب التركيز عليها هي نقطة الانطلاق، فالبدء مع خطّ أسود، يعني إمكانيّة تكبير وتعريض الخط فقط، الأمر الّذي قد يؤدي إلى جعل المخطط الهيكلي صارخ وحاد بالنسبة لبقيّة الأجزاء، ولكن البدء مع خطّ رمادي، يسمح للمُصمّم بزيادة العمق اللوني وتخفيفه بطبيعة الحال. السرعة والاستكشاف إن الغرض من التصميم ذو الدقّة المُنخفضة ليس التلوين والتحسين، ولكن الغرض هو استكشاف الحلّ الأنسب، حيثُ سيظهر العديد من الحلول، وفقط عن طريق استكشاف بعضها، وصفهم أمام الأعين سيمكّن المُصمّم من التقرير أيها سيَعمل بالشكل الأمثل للمشروع، لقد شرح كانيد بولز كيف يواجه لاعبي الشطرنج تحديًّا مُشابهًا، حيثُ في بداية اللعب، يوجد الكثير من الخيارات، بعضها يُمكن استبعاده عن طريق الغريزة أو عبر الخبرة والممارسة، وتُستكشف باقي الحلول ذهنيًّا، ولذلك سيُعجب المُصمّمون المبتدؤون بفكرتهم الأولى، ويتعلّقون بها ويبذلون جهدًا كبيرًا في تنفيذها مهما تتطلّب الأمر، ولقد وصفَ آندي روتلدج هذه الظاهرة بظاهرة "ملك الخواتم" وذلك في مقالة أكثر من رائعة بعنوان "كنزي العزيز". إن لم يكن بالإمكان تنفيذ التصوّر بسرعة، إذًا فإن التنفيذ يتمّ على الدقّة الخاطئة، فإن كان المخطط الهيكلي يعمل على تقديم نسخة ذات التدرّج الرمادي (grayscale) فقط مما قد تقرّر بناؤه بالفعل، فذلك مضيعة للوقت. النسخة المُطابقة تعطي نتائج أكثر واقعيّة تصدر الأخطاء عادةً من المُصممين الذين ليس لديهم تصوّر مُسبق للمحتوى، فإن كان المشروع يتضمّن معرضًا للصور، فمن المفترض رؤية الصور قبل اتخاذ القرار في إدراجها، والاهتمام بها كميّزة رئيسيّة أو عدم إبرازها لعدم أهميتها، وبشكل مُشابه، إن كان التصميم مبني بالأساس لعرض البيانات، فيجب معرفة ماهيّة هذه البيانات، مع العلم أنّ استخدام البيانات الوهميّة في التصميم الأوّلي تَدفع بالمُصمّم إلى تصاميم مخططات هيكلية تكون فيها العناوين والنصوص مُتناسقة بمثاليّة كبيرة، والصور مُتجاوبة مع التصميم ككل، والأرقام مُلائمة داخل صناديق صغيرة لا تتخطاها، طبعًا هذا أبعد ما يكون عن الواقع، بعبارة أخرى، إن هلاك واجهة المُستخدم يبدأ بالعنوان "لوريم أيبسزم". يجب إتقان التقنيّة المُستخدمة يُمكن للتصميم الخلّاب أنّ يُقدّم حلًّا سيّئًا للمشروع، فإن كان التصميم يتضمّن عناصر HTML مخصّصة، وأزرارًا جذّابة وقوائم مُنسدلة، وحقل بحث ديناميكي بتقنيّة أجاكس، فمن الضروري على المُصمّم أنّ يدرك أنّ لكل مشروع ميزانيّة مُختلفة عن الآخر، وخاصّة إن كان المُصمّم يعرف أساسيّات HTML و CSS و جافا سكريبت، فهو بالتأكيد يعرف ما يُتطلّب لاختبار هذه العناصر على المُتصفحات، وبالتالي على المُصمم أنّ يفكّر مليًّا فيما يُدرج في المخطط الهيكلي، طبعًا قد لا يكون هذا العنصر بذلك التعقيد، وقد يكون متوفّرًا في مكتبة jQuery، ولكن على المصمم أنّ يدرك أنّه لا يوجد شيء يدعى "مجرّد تعديل بسيط"، طبعًا هذا لا يعني عدم إدراج عناصر تفاعليّة في المخطط الهيكلي، ولكن يجب على المُصمم دائمًا معرفة تكلفة كل عنصر يُدرج في التصميم، فبعض المواقع قد تتطلّب هذا النوع من التعقيد، فمثلًا الاهتمام في عنصر اختيار التاريخ قد يكون أمرًا جوهريًا ومطلب أساسي في بعض المواقع، ومن المنطقي جدًا التركيز عليه، ولكن عندما يكون عنصر اختيار التاريخ من أجل "تاريخ الميلاد"، فمن الأفضل استغلال هذا الوقت على أمرٍ أكثر أهميّة فليعمل ما يعمل إن الهدف الرئيسي هو تقديم شيء عمليّ، وليس شيء مثالي، فلا يُبهر بالجماليّات سوء مُصمّمي تجربة المُستخدم UI، بمعنى إن تمّ الرسم والتخطيط باستخدام الورق فقط وبخط اليد، وكان المُصمّم واثقًا من تقديم الحلّ المطلوب، وذلك بتوافق تصميمه مع البيانات المعُطاة من قبل العميل، وكان هذا الرسم رسمًا واضحًا لجميع فريق العمل، فإذًا لا قيمة من إعادة تمثيل هذا الرسم باستخدام المخطط الهيكلي، بمعنى آخر على المُصمّم أنّ يكون عمليًّا، وأن يهتم بتقديم المطلوب وأن يَبتعد عن تصميم تصميمات مثاليّة . مصادر إضافيّةإن جميع المواضيع السابقة هي من واقع الخبرة ونتاج طويل من والتجربة والخطأ، ولتكتمل الصورة، هذه بعض المقالات الهامّة، والّتي ترتبط بالموضوع بشكل مُباشر وغير مُباشر: هيكلة وتوزيع محتوى صفحات الويب.ما هو النّظام اللّوني.أساسيات الوزن البصري في التّصميم الجرافيكي.الاختلافات ما بين التصاميم المسطّحة (flat design) و التصاميم المادية (material design).مدخل إلى عالم الخُطوط.مصادر أجنبية: Gestalt Principles – Andy Rutledge.Good design faster – Leah Buley.Sketching User Experiences – Bill Buxton.ترجمة وبتصرّف للمقال Wireframing for Web Apps.