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

Sam Ahw

الأعضاء
  • المساهمات

    1388
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    16

إجابات الأسئلة

  1. إجابة Sam Ahw سؤال في laravel nova كانت الإجابة المقبولة   
    Laravel Nova هي لوحة تحكم إدارية لتطبيقات Laravel. مصنوعة من قبل نفس الشخص الذي قام بابتكار Laravel الميزة الأساسية لـ Nova هي القدرة على إدارة سجلات قاعدة البيانات الأساسية الخاصة بك باستخدام Eloquent. تحقق Nova هذا من خلال السماح لك بتعريف "مورد" Nova الذي يتوافق مع كل نموذج Eloquent في تطبيقك.
    وبذلك بدلاً من بناء لوحة تحكم خاصة بالموقع من الصفر، تسهّل Nova العمل وتختصر وقت كبير بما تحويه من خاصيات مثل: التحقق (تسجيل الدخول والصلاحيات،..) الفلترة للبيانات، إمكانية تغيير التنسيقات ضمن اللوحة، والعديد من الخصائص الأخرى. كما وتم اعتماد أفضل معايير الأداء وجودة ترتيب الكود المصدري أثناء بنائها للحصول على أفضل أداء وسرعة عند استخدامها.
    ولكنها غير مجانية. يمكنك الاطلاع على الأسعار والميزات الأخرى التي تقدمها وكيفية استخدامها وتحميلها من الموقع الرسمي لـ Laravel Nova.
  2. إجابة Sam Ahw سؤال في دورة علوم الحاسوب كانت الإجابة المقبولة   
    لا تحتاج إلى التقيد بوقت محدد لبداية أو نهاية الدورة. بانضمامك لأي دورة ستحصل على وصول لمحتوياتها كاملة مدى الحياة. دورات أكاديمية حسوب لا تستبدل أو تنتهي صلاحيتها بل تحدّث باستمرار لتواكب التطورات. وبذلك يمكنك التقدّم مع الدورة في الأوقات المناسبة لك دون الحاجة لتقيّد بجدول زمني محدد. ويمكن لكل متدرّب إنهاء الدورة حسب الوقت الذي يقضيه في التعلّم خلال اليوم.
  3. إجابة Sam Ahw سؤال في كيف يمكن إنشاء أكثر من اتصال Redis في لارافيل كانت الإجابة المقبولة   
    إن إنشاء أكثر من اتصال واحد يمكن أن يتم عن طريق استخدام عنقود من redis. بحيث يتم أولاً تعريف الاتصالات ضمن .env
    QUEUE_DRIVER=redis BROADCAST_DRIVER=redis CACHE_CONNECTION=redis REDIS_CLUSTER=true REDIS_HOST=localhost REDIS_DEFAULT_PORT=7000 REDIS_SHARD_1_HOST=localhost REDIS_SHARD_2_HOST=localhost REDIS_SHARD_3_HOST=localhost REDIS_SHARD_1_PORT=7000 REDIS_SHARD_2_PORT=7001 REDIS_SHARD_3_PORT=7002 ثم ضمن config/database.php يتم إنشاء عنقود فيه الاتصالات باستخدام predis ويتم تحديد نفس المنفذ port لكل مجموعة أو عنقود، ويمكن إنشاء عدة اتصالات مع عدة عناقيد باستخدام منفذ مختلف لكل عنقود، مع تعريف منافذ مختلفة أيضاً ضمن env
    'redis' => [ 'clustered' => [ 'client' => 'predis', 'cluster' => true, 'options' => [ 'cluster' => 'redis' ], 'clusters' => [ [ 'host' => env('REDIS_SHARD_1_HOST', '127.0.01'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_SHARD_1_PORT', 6379), 'database' => 0, ], [ 'host' => env('REDIS_SHARD_2_HOST', '127.0.01'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_SHARD_2_PORT', 6379), 'database' => 0, ], [ 'host' => env('REDIS_SHARD_3_HOST', '127.0.01'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_SHARD_3_PORT', 6379), 'database' => 0, ], ], ], 'default' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => 6379, 'database' => 0, 'cluster' => false, ], ]  
  4. إجابة Sam Ahw سؤال في فشل المصادقة عند استخدام Pusher مع Laravel خطأ 403 كانت الإجابة المقبولة   
    في نسخ لارافيل الأحدث من 5.4 أصبح يجب تغيير الكود الموجود ضمن resources/assets/js/bootstrap.js إلى الشكل التالي:
    window.Echo = new Echo({ broadcaster: 'pusher', key: 'المفتاح الخاص', cluster: ' المستخدم cluster', encrypted: true, auth: { headers: { Authorization: 'Bearer ' + YourTokenLogin }, }, }); حيث يتم تعريف token المستخدم ضمن الترويسة header.
    وأيضاً يجب التأكد من تغيير app/Providers/BroadcastServiceProvider.php إلى:
    Broadcast::routes() إلى Broadcast::routes(['middleware' => ['auth:api']]); ليتم إجبار أي وصول إلى القناة أن يتم التحقق منه، أو يمكن التحقق عن طريق JWT (Json Web Token) في حال يتم استخدامه، كالتالي:
    بدلاً من Broadcast::routes() إلى Broadcast::routes(['middleware' => ['jwt.auth']]);  
  5. إجابة Sam Ahw سؤال في كيفية تخزين البيانات المضافة حديثاً في cache ضمن Laravel كانت الإجابة المقبولة   
    يمكن تنفيذ ذلك عن طريق وضع حدث عند إنشاء المنشور بالإضافة إلى listener للكاش الموجود، بحيث يتم استدعائه عند كل عملية تعديل أو إضافة سجلات إلى الجدول المعني في قاعدة البيانات كالتالي:
    php artisan make:event PostCreated بحيث يكون PostCreated.php عند إنشاء المنشور:
    namespace App\Events; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PresenceChannel; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; class PostCreated { use Dispatchable, InteractsWithSockets, SerializesModels; public function __construct() { // } public function broadcastOn() { return []; } } وبعدها نقوم بإضافة:
    cache()->forget('posts'); والتي تقوم بمسح الكاش الخاص بال posts عند إضافة post جديد، وأيضاً نقوم بإضافة:
    cache()->forever('posts', $post); بعد استعادة البيانات ليتم حفظها من جديد على نسخة الكاش الجديدة، فيصبح ترتيب العمليات كالتالي:
    public function handle($event) { cache()->forget('posts'); // تحرير النسخة القديمة من الكاش $post = Post::all(); //جلب البيانات cache()->forever('posts', $post); // حفظهم في نسخة كاش جديدة } فعند إطلاق الحدث ، سنقوم بإزالة جميع بيانات ذاكرة التخزين المؤقت. بعد ذلك سنقوم بإحضار جميع البيانات من قاعدة البيانات ووضعها في ذاكرة التخزين المؤقت ضمن Laravel إلى الأبد. يمكنك أيضاً وضعها لبضع دقائق ، يوم ، سنة كما تريد.
    بعدها يجب تعديل مودل Post لنضيف عليه الحدث كالتالي:
    namespace App; use App\Events\PostCreated; use Illuminate\Database\Eloquent\Model; class Post extends Model { //... protected $dispatchesEvents = [ 'created' => PostCreated::class ]; بحيث يتم إطلاق هذا الحدث PostCreated عندما يتم إضافة أي منشور جديد. وبالتالي يقوم باستدعاء listener الخاص بتحديث الكاش.
    وأخيراً، يجب تسجيل الحدث في لارافيل كالتالي:
    namespace App\Providers; use App\Events\PostCreated; use App\Listeners\PostCacheListener; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Event; class EventServiceProvider extends ServiceProvider { protected $listen = [ PostCreated::class => [ PostCacheListener::class, //نفس الحدث الذي قمنا بتعريفه مسبقاً ], ]; public function boot() { parent::boot(); // } } وبذلك عند إضافة أي سجل جديد إلى قاعدة البيانات، في حال لم تحتوي نسخة الكاش هذه البيانات عند طلبها سيتم تحديث النسخة القديمة من الكاش وتخزين نسخة جديدة تحوي البيانات التي تم إضافتها مؤخراً إلى قاعدة البيانات.
  6. إجابة Sam Ahw سؤال في ما المتطلبات التي يجب علي دراستها لكي احصل على شهادة linux+ كانت الإجابة المقبولة   
    تغطي شهادة Linux+ المهام الشائعة في التوزيعات الرئيسية لنظام linux، بما في ذلك سطر الأوامر Linux Command Line والصيانة الأساسية وتثبيت محطات العمل وتكوينها وتكوين الشبكات أيضاً.
    وسأقوم بكتابة أبرز المتطلبات التي تغطيها الشهادة:
    تثبيت وتكوين نظام التشغيل Linux تنفيذ العمليات الأساسية على سطر الأوامر command line operations إنشاء وإدارة وتهيئة المستخدمين والمجموعات ضمن النظام. إدارة نظام الملفات والتنقل بين الملفات وإجراء العمليات الأساسية عليها بما فيها تعديل محتويات الملفات النصية. إنشاء الملفات وتحريرها وتحديد موقعها والعمليات الأساسية عليها (نسخ،نقل،حذف،...) ونسخها احتياطاً واستعادتها. تكوين الطابعات ووظائف الطباعة والتعامل معها عن بعد. معرفة كيفية استخدام الأوامر الرئيسية في SQL والبرامج النصية لمعالجة البيانات وكيفية الولوج إليها. فهم بروتوكولات الشبكات الأساسية والتكوينات لها. أداء مهام الأمان مثل إعطاء وتغيير الصلاحيات والتحكم بها وتغيير كلمات المرور وتشفير البيانات. ويكون فحص الشهادة مقسّم كالتالي حسب المحاور:
     Hardware and System Configuration 21%  Systems Operation and Maintenance 26%  Security 19%  Linux Troubleshooting and Diagnostics 20% Automation and Scripting 14% كما يمكنك الاطلاع على أسئلة سنوات سابقة لأخذ فكرة عن نوعية الأسئلة وتوزيعها والتدرّب عليها.
  7. إجابة Sam Ahw سؤال في العلاقات متعددة الأشكال في laravel كانت الإجابة المقبولة   
    إن العلاقات متعددة الأشكال هي أن يكون لديك نماذج يمكن أن تنتمي إلى أكثر من كيان واحد. يحتفظ هذا النوع من النماذج بالبنية نفسها التي لا تتغير بغض النظر عن النموذج الآخر المرتبط به.
    من الأمثلة الشائعة على هذا النوع من السيناريوهات هي (التعليقات). في مدونة على سبيل المثال ، يمكن أن توضع التعليقات على منشور محدد أو على صفحة مستقلة مع الحفاظ على الهيكل نفسه بغض النظر عما إذا كان منشور أو صفحة. أي بمعنى آخر ستبقى جميع الخصائص للتعليق ثابتة مثل (الاسم، تاريخ التعليق، محتوى التعليق،...).
    مع أخذ المثال المذكور أعلاه في الاعتبار ، لدينا كيانان: Post و Page. للحصول على تعليقات على كل منها ، يمكننا أن نقرر إنشاء قاعدة بياناتنا على النحو التالي:
    posts: id الرقم المعرف للمقال title عنوان المقال content محتوى المقال posts_comments: id رقم معرف فريد post_id الرقم المعرف للمقال comment التعليق date تاريخ التعليق pages: id الرقم المعرف للصفحة body محتوى الصفحة pages_comments: id رقم معرف فريد page_id الرقم المعرف للصفحة comment التعليق date تاريخ التعليق ولكن نلاحظ أنه باعتماد النهج السابق، وجب علينا إنشاء جدولين للتعليقات، جدول للتعليقات الخاص بالصفحة، وجدول آخر للتعليقات الخاصة بالمنشور أو المقال. وكليهما يقومان بنفس الدور تماماً ويحتويان نفص الخصائص، إنما الاختلاف الوحيد هو بالمكان الذي يتواجدان فيه (مرة بالمنشور ومرة أخرى بالصفحة).
    مع استخدام العلاقات المتعددة، يمكننا تبسيط البينة السابقة ومنع التكرار الذي حصل، فتصبح لدينا بنية الجداول كالتالي:
    posts: id الرقم المعرف للمنشور title عنوان المنشور content محتوى المنشور pages: id الرقم المعرف للصفحة body محتوى الصفحة comments: id الرقم المعرف للتعليق commentable_id الرقم المعرف للمكان الذي يوجد فيه التعليق (أي رقم معرف للصفحة أو رقم معرف للمنشور) commentable_type نوع المكان الهدف (صفحة أو منشور) date تاريخ التعليق body محتوى التعليق وبذلك نلاحظ لدينا عمودين جديدين مهمين يجب الانتباه إليهما: commentable_id و commentable_type. وبدورهما قاما باختصار تكرار جدول التعليق مرتين وتكرار البيانات. وهذا ببساطة هو مفهوم العلاقات المتعددة الأشكال.
    الآن لنأخذ المثال السابق ونقوم بتضمينه ضمن لارافيل:
    عند إنشاء الجداول للتهجير نقوم بالتالي:
    Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('content'); }); Schema::create('pages', function (Blueprint $table) { $table->increments('id'); $table->text('body'); }); Schema::create('comments', function (Blueprint $table) { $table->increments('id'); $table->morphs(‘comment’); //-> ستنشئ تلقائيًا عمودين باستخدام النص الذي تم تمريره إليه $table->text('body'); $table->date('date'); }); بوضع morphs سيقوم تلقائياً بإنشاء العمودين commentable_id و commentable_type.
    ثم عند إنشاء جدول التعليقات يمكننا تعريف دالة تساعدنا بالحصول على أي مودل آخر يملك تعليق (أي يمكننا مباشرة الحصول على تعليقات المنشور و تعليقات الصفحة) بدالة واحدة بدلاً من اللجوء لآليات أخرى أكثر تعقيداً، كالتالي:
    <?php namespace App; use Illuminate\Database\Eloquent\Model; class Comment extends Model { //باستخدام هذا التابع نستطيع الآن أن نحصل على أي مودل يملك تعليق أي مودل الصفحة ومودل المنشور public function commentable() { return $this->morphTo(); } } وعند إنشاء الجدول الهدف (الكيان الذي سيحوي التعليقات) على سبيل المثال جدول المنشور:
    namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { //هذه الدالة ستقوم باستعادة جميع التعليقات الموجودة على منشور محدد public function comments() { return $this->morphMany('App\Comment', 'commentable'); } } نلاحظ قمنا باستخدام morphMany للدلالة بأن المنشور قد يحوي عدة تعليقات، وبذلك نستطيع الحصول على كافة التعليقات الموجودة على هذا المنشور. وكذلك الأمر طبعاً بالنسبة (للصفحة) نكرر الخطوة السابقة morphMany.
    يمكنك أيضاً الاطلاع على باقي أشكال العلاقات وأنواع العلاقات متعددة الأشكال الأخرى من التوثيق الرسمي في لارافيل.

     
  8. إجابة Sam Ahw سؤال في هل سأستطيع بناء موقع في دورة واجهات المستخدم كانت الإجابة المقبولة   
    في الدورة يقوم المدربون بتزويدك بجميع الأدوات اللازمة لبناء الموقع الالكتروني وأماكن تحميلها مثل محرر الأكواد الذي ستقوم باستعماله أو أي أداة أخرى، ويتم فيها أيضاً شرح كافة التفاصيل اللازمة عن كيفية تحميل الأدوات اللازمة واستخدامها وأساسيات اللغات البرمجية المستخدمة في بناء المواقع.
    حيث أن عملية بناء الموقع الالكتروني هي عملية برمجية، ولا يوجد برنامج نقوم بتحميله لبناء الموقع لنا، ولكن يوجد محرر نصوص يقوم المبرمج بكتابة الشيفرة البرمجية ضمنه لبناء الموقع الالكتروني، وكذلك يوجد العديد من الأدوات الأخرى التي تساعد المبرمج في مهمته.
     
  9. إجابة Sam Ahw سؤال في مشكلة في زر الرجوع Android كانت الإجابة المقبولة   
    مرحباً @Anoir Belkahla،
    من الصعب تحديد المشكلة دون الاطلاع على الكود الخاص بالانتقال بين الأنشطة لديك،
    ولكن لحل المشكلة يكفي أن تقوم بفهم آلية عمل المكدس (Backstack) ضمن اندرويد وكيف يتم استخدام intent.

    عند الانتقال بين نشاط Activity و آخر فإنه يتم تمرير النشاط السابق إلى الخلفية ويصبح النشاط القديم في أعلى المكدّس وبذلك ستتمكن من الرجوع إليه لاحقاً عن طريق الضغط على زر العودة.
    في حال كان يتم إغلاق التطبيق نهائياً عند الضغط على زر العودة، فسبب ذلك هو عدم وجود أي نشاط آخر ضمن المكدس وبذلك يتم إغلاق التطبيق.
    لحل هذه المشكلة، تأكد من عدم وجود التعليمة التالية بعد الانتقال إلى النشاط الجديد:
    finish(); وأيضاً يمكنك استعمال: Intent.FLAG_ACTIVITY_NEW_TASK للتأكد من عدم إنهاء النشاط السابق، مثال:
    Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startMain); أتمنى لك التوفيق
  10. إجابة Sam Ahw سؤال في كيف استخدم محللات غوغل مع vuejs كانت الإجابة المقبولة   
    مرحباً تميم،
    سابقاً كان يتم استعمال مكتبة تدعى vue-analytics ولكن للأسف تم التوقف عن دعمها منذ فترة قصيرة والسبب في ذلك بأن google قد انتقلت إلى إعتمادية جديدة اسمها gtag.js ولحسن الحظ تم تطوير مكتبة جديدة لمواكبة هذا التحديث.
    يمكنك الآن استعمال vue-gtag وهي عبارة عن إطار عمل يسمح لك بإرسال بيانات الأحداث إلى Google Analytics وإعلانات Google ومنصة Google للتسويق.
    يتم تضمين google analytics ضمن تطبيق Vue Js كالتالي:
    أولاً لتحميل المكتبة نقوم بتنفيذ الأمر التالي:
     
    npm add vue-gtag ثم يمكنك تضمنيها ضمن تطبيقك كالتالي:
     
    import Vue from "vue"; import App from "./App.vue"; import VueGtag from "vue-gtag"; Vue.use(VueGtag, { config: { id: "UA-1234567-1" } }); new Vue({ render: h => h(App) }).$mount("#app"); حيث id هو رقم المعرّف الذي ستحصل عليه من حسابك على Google Analytics.
    ثم يمكنك الآن إرسال (أحداث) وتتبع حركة المستخدم عن طريق التالي:
     
    export default { name: 'MyComponent', methods: { login () { this.$gtag.event('login', { method: 'Google' }) } } } وهذا مثال بسيط عن إمكانية إرسال حدث أثناء تسجيل المستخدم للدخول إلى موقعك.
    يمكنك أيضاً الإطلاع على كافة التفاصيل والأحداث الموجودة والتي يمكنك تطبيقها على الموقع الرسمي لهذه المكتبة.
    أتمنى لك التوفيق.
  11. إجابة Sam Ahw سؤال في تخزين الإيموجي بBASE64 كانت الإجابة المقبولة   
    مرحباً @محمود رضا موسى،
    يتم استخدام Base64 بشكل شائع لترميز البيانات الثنائية (على سبيل المثال ، الصور أو ملفات الصوت) للتضمين في HTML و CSS والمستندات النصية الأخرى. بالإضافة إلى ذلك ، يتم استخدام Base64 لتشفير البيانات التي قد تكون غير مدعومة أو تالفة أثناء النقل أو التخزين أو الإخراج.

    ولكن لسوء الحظ، على الرغم من أن Base64 طريقة فعالة نسبيًا لتشفير البيانات الثنائية ، إلا أنها ستزيد في المتوسط حجم الملف لأكثر من 25٪. لا يؤدي هذا إلى زيادة النطاق Bandwidth فحسب ، بل يؤدي أيضًا إلى زيادة وقت تحميل الملفات.
    ولكن بما أنك تستخدمها فقط لأيقونات صغيرة الحجم نسبياً فذلك لن يسبب لك أي مشكلة، ولن تشعر بفارق كبير. كما وأن العديد من المواقع تستخدم حالياً Base64 أثناء التعامل مع Emojis
    أرفق لك أيضاً صورة توضيحية للمقارنة بين حجم نفس الصورة مع وبدون الترميز لتوضيح الفكرة.

    بالتوفيق

  12. إجابة Sam Ahw سؤال في ما هى مكتبات ادارة الحالة فى Angular و Vue ؟ كانت الإجابة المقبولة   
    مرحباً احمد،
    بالنسبة لـ Angular: يتم استخدام  ngrx/store وهو امتداد لإدارة الحالة مستوحى من Redux وبالتالي يمكن عن طريقه استخدام جميع الخاصيات الموجودة ضمن Redux مثل: (Store, Actions, Reducer,...).

    أما في Vue: فيتم استعمال مكتبة Vuex Store وهو بمثابة متجر مركزي لجميع المكونات ضمن التطبيق، ومن أهم أدواره بأنه يقوم بحفظ الحالة وينظم عمليات تحديث البيانات ضمنها ويجعلها تشاركية مع جميع المكونات ضمن التطبيق عن طريق بناء قواعد لها.

    أما في Flutter: فيوجد العديد من الخيارات الممكنة لإدارة الحالة ومنها:
    - عن طريق استخدام Provider وهو المرجح والمعتمد من الموقع الرسمي.
    - عن طريق استخدام setState لإدارة الحالات المؤقتة الخاصة بكل widget
    - عن طريق استخدام Redux أو Fish -redux
    - عن طريق استخدام  Bloc / Rx ويتم عبرها التعامل مع الحالة عن طريق stream
    وغيرها..

    أما بما يخص التعامل مع API، فطبعاً يمكن استخدام axios مع Angular و Vue ولكن بالنسبة لـ Flutter فالمكتبة الأساسية هي HTTP ويمكنك تحميلها وتضمينها من الموقع الرسمي.
     
  13. إجابة Sam Ahw سؤال في منع تسجيل الشاشة IOS كانت الإجابة المقبولة   
    مرحباً جوزيف،
    يمكنك تنفيذ ذلك عن طريق إضافة observer كالتالي:
    NotificationCenter.default.addObserver(self, selector: #selector(preventScreenRecording), name: NSNotification.Name.UIScreenCapturedDidChange, object: nil) ثم نقوم بإنشاء view بداخل ال main view الرئيسية للتطبيق كالتالي:
     
    (void) preventScreenRecording { if (@available(iOS 11.0, *)) { BOOL isCaptured = [[UIScreen mainScreen] isCaptured]; if (isCaptured) { self.blockView.hidden = false; } else { self.blockView.hidden = true; } } ملاحظة: أيضاً يمكنك استخدام screen.isCaptured ببساطة لاختبار في حال كانت الشاشة قيد التسجيل أو لا، ومن ثم إضافة عملية المعالجة التي ترغب بها، مثال:
     
    func isRecording() ->Bool { for screen in UIScreen.screens { if (screen.isCaptured) { print("screen is recorded") return true } } return false } بالتوفيق
  14. إجابة Sam Ahw سؤال في تحديث نسخة PHP ضمن Ubuntu كانت الإجابة المقبولة   
    يمكنك تحميل نسخة جديدة من PHP على السيرفر عن طريق التالي:
    أولاً: قم بتحميل مستودع جديد Repository على نظام التشغيل Ubuntu بالأمر التالي:
     
    sudo apt-add-repository ppa:ondrej/php ثانياً: قم بتحديث الفهرسة:
     
    sudo apt update ثالثاً: قم بتحميل نسخة PHP التي تريدها ولتكن 7.4:
     
    sudo apt install -y php7.4 php7.4-cli php7.4-common php7.4-fpm رابعاً: في حال أردت تحميل بعض الإضافات المهمة لعمل ووردبريس أو لارافيل قم بتحميل التالي:
     
    sudo apt install -y php7.4-mysql php7.4-dom php7.4-simplexml php7.4-ssh2 php7.4-xml php7.4-xmlreader php7.4-curl php7.4-exif php7.4-ftp php7.4-gd php7.4-iconv php7.4-imagick php7.4-json php7.4-mbstring php7.4-posix php7.4-sockets php7.4-tokenizer خامساً: قم بتعديل إعدادات Nginx لربط النسخة الجديدة من PHP كالتالي:
     
    location ~ .php$ { .... fastcgi_pass unix:/run/php/php7.0-fpm.sock; حذف هذا السطر fastcgi_pass unix:/run/php/php7.4-fpm.sock; وإضافة السطر التالي } وأخيراً: قم بإعادة تشغيل النظام:
     
    sudo systemctl reload nginx  
  15. إجابة Sam Ahw سؤال في إضافة نطاق فرعي جديد على اينجن ايكس كانت الإجابة المقبولة   
    أولاً يجب عليك وضع ملفات موقع الويب الخاص بك ضمن السيرفر في مكان ما داخل /var/www
    ولنفترض داخل /var/www/subdomain.test.com
    sudo nano /etc/nginx/sites-available/subdomain.test.com ثم يجب عليك ضبط إعدادات DNS للنطاق الأساسي الذي ترغب بإضافة نطاق فرعي له
    عن طريق إضافة سجل من نمط A وربطه مع النطاق الفرعي الجديد
    والآن يجب عليك ضبط إعدادات Nginx الخاص بك لاستقبال طلبات HTTP وتحويلها للمجلد الذي يحوي ملفات موقعك
     
    server { listen 80; root /var/www/subdomain.test.com; index index.html index.htm index.nginx-debian.html; server_name sub.test.com www.subdomain.test.com; location / { try_files $uri $uri/ =404; } } حيث يجب عليك تعديل root لتشير إلى ملفات الموقع وكذلك server_name باسم النطاق الجديد
    وأخيراً قم بإعادة تشغيل سيرفر الويب:
     
    service nginx restart  

  16. إجابة Sam Ahw سؤال في وسوم غريبة داخل شيفرات HTML ( روبي ) . كانت الإجابة المقبولة   
    في روبي يمكنك كتابة وتنفيذ الكود ضمن قوالب مثل ERB.
    يشبه قالب ERB مستند نصي عادي يتخلله علامات تحتوي على تعليمات برمجية Ruby. عند التقييم ، يمكن لهذه التعليمات البرمجية ذات العلامات تعديل النص في القالب. يقوم Puppet بتمرير البيانات إلى القوالب عبر كائنات ومتغيرات خاصة ، والتي يمكنك استخدامها في كود Ruby  للتحكم في إخراج القوالب.
    تستخدم على سبيل المثال الوسوم التالية، بدون طباعة:
     
    <% %> أما الوسم التالي يقوم بالتنفيذ مع طباعة أو إخراج ناتج التنفيذ:
    <%= %> مثال لطباعة خصائص كتاب ضمن جدول:
    <h1>Listing Books</h1> <table> <thead> <tr> <th>Title</th> <th>Content</th> <th colspan="3"></th> </tr> </thead> <tbody> <% @books.each do |book| %> <tr> <td><%= book.title %></td> <td><%= book.content %></td> <td><%= link_to "Show", book %></td> <td><%= link_to "Edit", edit_book_path(book) %></td> <td><%= link_to "Destroy", book, method: :delete, data: { confirm: "Are you sure?" } %></td> </tr> <% end %> </tbody> </table> <br> <%= link_to "New book", new_book_path %> حيث @books.each تقوم بدور الحلقة على مجموعة الكتب الممررة، ثم يتم إظهار كل خاصية على حدى ضمن خانات الجدول بالتعليمات: book.title , book.content، كما ويمكنك وضع روابط أو تنفيذ دوال عند الضغط أو كتابة أي كود ضمن هذه الوسوم كأي لغة أخرى مشابهة يتم تضمينها في قوالب.
×
×
  • أضف...