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

Sam Ahw

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

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

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

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

    16

كل منشورات العضو Sam Ahw

  1. Sam Ahw

    laravel nova

    Laravel Nova هي لوحة تحكم إدارية لتطبيقات Laravel. مصنوعة من قبل نفس الشخص الذي قام بابتكار Laravel الميزة الأساسية لـ Nova هي القدرة على إدارة سجلات قاعدة البيانات الأساسية الخاصة بك باستخدام Eloquent. تحقق Nova هذا من خلال السماح لك بتعريف "مورد" Nova الذي يتوافق مع كل نموذج Eloquent في تطبيقك. وبذلك بدلاً من بناء لوحة تحكم خاصة بالموقع من الصفر، تسهّل Nova العمل وتختصر وقت كبير بما تحويه من خاصيات مثل: التحقق (تسجيل الدخول والصلاحيات،..) الفلترة للبيانات، إمكانية تغيير التنسيقات ضمن اللوحة، والعديد من الخصائص الأخرى. كما وتم اعتماد أفضل معايير الأداء وجودة ترتيب الكود المصدري أثناء بنائها للحصول على أفضل أداء وسرعة عند استخدامها. ولكنها غير مجانية. يمكنك الاطلاع على الأسعار والميزات الأخرى التي تقدمها وكيفية استخدامها وتحميلها من الموقع الرسمي لـ Laravel Nova.
  2. إن إنشاء الموقع لا يعتمد على عدد المستخدمين أو عدد الصفحات، بالطبع سيشكلان معاً عاملاً مهماً لتنفيذ الموقع، ولكن الإجرائيات والخصائص التي سيتم تنفيذها أثناء عملية البرمجة هي نفسها سواء ل 5 مستخدمين أو 1000. وربما تكون بحاجة عناية أكبر في المواقع الكبيرة في حالات خاصة. لن تقوم بإضاعة الوقت في حال كنت تتعلم لغة البرمجة التي ستقوم عن طريقها بتنفيذ الموقع، على العكس تماماً إن ذلك سيساعدك لبناء الموقع بنفسك وحل المشكلات التي قد تواجهك مستقبلاً ضمن الموقع أو حتى العمل على تطويره. ففي حال قمت بنسخ ولصق نص برمجي ما، عند حدوث أي مشكلة لن تتمكن من حلّها بنفسك في حال لم يكن لديك أي معرفة فيها. أما لإنشاء الصفحات المذكورة بشكل كامل وآمن (أي كامل الموقع الذي تعنيه) بأي لغة برمجة تختارها يجب عليك أيضاً الإنتباه إلى وجود عمليات تطوير أخرى تشمل واجهات الموقع أولاً من تصميم وتنسيق HTML, CSS, Javascript وأيضاً تهيئة قاعدة البيانات بالشكل الملائم مع الأخذ بعين الاعتبار الخصائص التي ترغب بتضمينها ضمن الموقع. وكذلك الأمر بالنسبة لأمور التحقق (تسجيل الدخول) والانتقال بين الصفحات ونقل البيانات ورفع الصور وتخزينها،...إلخ. لذلك أعتقد من الصعب كتابة كافة الأمور السابقة في تعليق بسيط أو كود واحد. إن ووردبريس سيسهّل عليك بعضاً من الأمور السابقة وممكن أن يختصر عليك وقت كبير للحصول على الموقع الذي ترغب به. لذلك في حال كنت تريد بناء الموقع بنفسك أقترح عليك البدء في الخيار الأنسب لك، وفي حال واجهتك مشكلة ما أثناء عملية التطوير ستتمكن من حلها أثناء التعلم عن طريق البحث على الانترنت.
  3. لا تحتاج إلى التقيد بوقت محدد لبداية أو نهاية الدورة. بانضمامك لأي دورة ستحصل على وصول لمحتوياتها كاملة مدى الحياة. دورات أكاديمية حسوب لا تستبدل أو تنتهي صلاحيتها بل تحدّث باستمرار لتواكب التطورات. وبذلك يمكنك التقدّم مع الدورة في الأوقات المناسبة لك دون الحاجة لتقيّد بجدول زمني محدد. ويمكن لكل متدرّب إنهاء الدورة حسب الوقت الذي يقضيه في التعلّم خلال اليوم.
  4. للتحقق من إصدار جافا يجب فصل الكلمتين على الشكل التالي: java -version أما الخطأ الذي يظهر لك لأنه لا يتم التعرف على الأمر java-version ككلمة واحدة.
  5. يمكنك استخدام الدالة Count والتي تعيد لك مجموع السجلات في جدول ما كالتالي: SELECT COUNT(customer_id) AS NumberOfCustomers FROM customers; حيث يتم هنا عدّ المفاتيح الفريدة الموجودة ضمن الجدول (وبذلك يتم عدّ السجلات) ونقوم بإسنادها إلى متغيّر باسم: NumberOfCustomers ونحصل على النتيجة كالتالي: NumberOfCustomers 20 ويمكنك أيضاً إضافة الشروط لها تبعاً للمطلوب مثل: إعادة مجموع عدد العملاء الذين يحققون شرط معيّن. على سبيل المثال: عدد العملاء الذين أعمارهم أكبر من 18: Select COUNT(customer_id) AS NumberOfCustomers from customers where age > 18; ملاحظة: لماذا اخترنا حقل المفتاح الفريد COUNT(customer_id) بدلاً من أي حقل آخر؟ لأن دالة COUNT لا تقوم بعدّ القيم الفارغة NULL، وبالتالي في حال اخترت حقل آخر ضمن الجدول وكانت قيمته في سجل معيّن NULL لن يتم عدّه.
  6. إن إنشاء أكثر من اتصال واحد يمكن أن يتم عن طريق استخدام عنقود من 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, ], ]
  7. في نسخ لارافيل الأحدث من 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']]);
  8. يمكن تنفيذ ذلك عن طريق وضع حدث عند إنشاء المنشور بالإضافة إلى 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(); // } } وبذلك عند إضافة أي سجل جديد إلى قاعدة البيانات، في حال لم تحتوي نسخة الكاش هذه البيانات عند طلبها سيتم تحديث النسخة القديمة من الكاش وتخزين نسخة جديدة تحوي البيانات التي تم إضافتها مؤخراً إلى قاعدة البيانات.
  9. إن الطريقتين صحيحتين، ولكن يختلف التطبيق بين مبرمج وآخر كما تختلف بعض المتطلبات حسب المشروع الذي يتم العمل عليه. فلذلك المدرّب يقوم باتباع الطريقة التي يراها مناسبة للأمور التي سيتم تنفيذها خلال المشروع بحيث لديه نظرة عن كافة الخصائص التي سيتم تطبيقها ضمن المشروع. وفي دورات حسوب، يتم دوماً اختيار الطرق المناسبة والبسيطة والتي تلبي كافة احتياجات المتدربين بعيداً عن التعقيد لتكون واضحة ومفهومة ويستطيع المتدرّب استخدامها مباشرةً. أما بالنسبة للأمور المتعلقة في إنشاء وتصنيف الجداول والنماذج، فهو جزء كامل من تنفيذ المشروع ويدعى (مرحلة تحليل النظام) وفيه يتم النظر بآلية استخدام الكائنات والبيانات خلال المشروع والعلاقات المتبادلة فيما بينهم، كمدى ارتباط الكيانات ببعضها، وأيضاً الحاجة للتعديل واسترجاع البيانات مع بعضها البعض أو بشكل منفصل. وكثير من الأسئلة الأخرى التي تساعدنا في فهم آلية عمل المشروع لنستطيع اختيار الطريقة الأسهل. يمكنك دوماً اختيار الطريقة التي ترتاح بالعمل بها، فكتابة الكود البرمجي وتنسيقه أو اختيار الاستراتيجية المناسبة للعمل تختلف من شخص لآخر ولا يوجد قاعدة موحّدة تجبر المبرمجين على العمل بها.
  10. Java Keytool هو أداة مساعدة لإدارة المفاتيح والشهادات. يسمح للمستخدمين بإدارة أزواج وشهادات المفاتيح العامة والخاصة بهم. كما يسمح للمستخدمين بتخزين الشهادات مؤقتًا. يخزن Java Keytool المفاتيح والشهادات كملفات ويدعى أيضاً (بالمخزن) أو Java Keystore. ويتم حماية المفاتيح الخاصة بكلمة مرور. يحتوي Keystore على المفتاح الخاص وأي شهادات ضرورية لإثبات مصداقية الشهادة الأساسية. وترتبط كل شهادة في Java keystore باسم مستعار فريد يدعى alias. لإنشاء ملف تخزين مفاتيح Java ، يجب أن نقوم أولاً بإنشاء ملف .jks الذي سيحتوي في البداية فقط على المفتاح الخاص. ثم يجب بعد ذلك إنشاء CSR والحصول على شهادة يتم إنشاؤها منه. ثم يجب علينا القيام باستيراد الشهادة إلى ملف تخزين المفاتيح. كما يوجد أيضًا العديد من الوظائف الأخرى التي تتيح لك عرض تفاصيل الشهادة أو سرد الشهادات الموجودة في مخزن المفاتيح أو تصدير شهادة. ومن أشهر الأوامر التي يتم استخدامها عند التعامل مع Keytool في جافا هي: لإنشاء مخزن keysore وزوج مفاتيح: keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -keysize 2048 لإنشاء طلب شهادة توثيق لمخزن موجود: keytool -certreq -alias mydomain -keystore keystore.jks -file mydomain.csr لاستيراد جذر root أو شهادة CA وسيطة إلى مخزن مفاتيح Java موجود: keytool -import -trustcacerts -alias root -file Thawte.crt -keystore keystore.jks لحذف شهادة من مخزن Java keystore: keytool -delete -alias mydomain -keystore keystore.jks وغالبًا ما تستخدمه التطبيقات المستندة إلى Java للتشفير والمصادقة والعرض عبر HTTPS. كما يمكنك الإطلاع على بقية الأوامر التي يمكن استخدامها أثناء التعامل مع المفاتيح والشهادات في جافا حسب حاجتك لها عبر التوثيق الرسمي.
  11. إن الفرق بين الطريقتين هو كالتالي: أولاً: عن طريق تطبيق الواجهة Runnable Interface: public class DemoRunnable implements Runnable { public void run() { //نضع هنا الكود الخاص بالعملية } } ثانياً: عن طريق استخدام الصف Thread: public class DemoThread extends Thread { public DemoThread() { super("DemoThread"); } public void run() { //نضع هنا الكود الخاص بالعملية } } وإن كلا الطريقتين متشابهتين ولا يوجد طريقة جيدة وأخرى سيئة، وأيضاً يوجد العديد من النقاشات حول استخدامات كل منها، ولكن من أهم الفروقات أو النقاط التي يجب عليك الانتباه لها لاختيار الطريقة المناسبة هي: 1- في استخدام Runnable أنت لا تخصص حقًا سلوك المسالك أو تعدلها. أنت فقط تعطي المسلك شيئًا لتشغيله. هذا يعني أن الترتيب في الكود سيكون أفضل. 2- لغة جافا تدعم فقط الوراثة وحيدة الدرجة، لذلك لا يمكنك إنشاء extend لأكثر من صف. 3- إن إنشاء واجهة تعطي interface تسمح لك بفصل المكونات عن بعضها ضمن الكود، وبذلك يصبح الكود الخاص بك أكثر مرونة ويمكنك ذلك من فصله عن العمليات المستخدمة ضمن المسلك thread. 4- في استخدام Runnable تجعل الصف الذي يقوم باستدعائها أكثر مرونة، أما إذا استخدمت Thread فإن الحدث الذي سيقوم به سيبقى دوماً ضمن الـ thread، أما في الحالة الأخرى أي Runnable فليس من الضرورة أن يبقى ضمن المسلك thread حيث يمكنك أيضاً تمرير البيانات إلى خدمات وصفوف أخرى. 5- وأخيراً، في حال قررت استخدام Thread فيجب عليك الانتباه إلى وجود خطأ بسيط Bug في نسخ JDK 4 أو الأقدم يتعلّق بالتوقيت بين بناء المسلك contruction و بدء عمله start، حيث قامت شركة Sun بإصلاح الخطأ بدءً من نسخ Java 1.5 ولذلك يجب عليك الانتباه للنسخة التي تقوم باستخدامها من جافا. وإذا نظرنا إلى جميع النقاط السابقة يمكن أن نلاحظ أن استخدام runnable مناسب أكثر لمعظم الحالات. ولكن هذا لا يعني عدم استخدام الصف Thread فكل مبرمج يفضّل الطريقة التي تناسب عمله ويرتاح بالعمل فيها.
  12. في حال كان يوجد مشكلة ما في الكود، أرجو منك إرفاقه هنا حتى نتمكن من تحديد المشكلة به ومساعدتك بشكل أفضل، أما في حال قد قمت عن طريق الخطأ بحذف الكود ضمن برنامج one note يمكنك استعادة الملف عن طريق فتح الملف الذي يحوي الكود سابقاً، ثم بالضغط على Notebooks ومن قائمة Deleted Notes نختار Show Deleted Notes. وأقترح عليك استخدام محرر أكواد متخصص مثل VS code أو Atom أو غيره لأنه سيسهل عليك الكثير من العمل وستتجنب مثل هذه المشاكل في المستقبل. أما فيما يخص بنسخ ولصق الأكواد فهي تماماً كما تتعامل عادةً مع أي محتوى نصي، يمكنك تحديد الجزء الخاص من الكود والذي تريد نسخه واستخدام زر الفأرة الأيمن واختيار نسخ ولصق وكذلك عن طريق اختصارات لوحة المفاتيح Ctrl-C و Ctrl-V.
  13. إن الإمكانيات المطلوب توافرها في جهاز الحاسوب يختلف حسب المهمّات التي ستقوم بالعمل عليها. فإن بعض التخصصات مثل برمجة الألعاب أو بعض الأدوات التي يمكن أن تستعملها مثل برامج معالجة الصور والتصميم في حال كانت طبيعة عملك في تصميم الواجهات أو الصور بشكل عام، وأيضاً عمليات معالجة البيانات وما يعرف ب Data Analysis..إلخ قد تتطلب موارد عالية من المعالج CPU والذاكرة العشوائية RAM ضمن جهازك، أيضاً في حال كنت متجه لبرمجة تطبيقات الموبايل باستخدام Android Studio قد يتطلب أيضاً ذاكرة RAM أكثر من غيره، أما في حال كنت متجه لبرمجة الويب والمواقع الالكترونية وبما أنك مبتدئ فذلك يمكن القيام به تقريباً على أي جهاز ذو إمكانيات متوسطة، حيث أنك مبدئياً ستقوم باستعمال محرر نصوص مثل VS Code أو غيره من الأدوات البسيطة لكتابة الأكواد وبذلك لا يتطلب أي موارد أخرى إضافية من الجهاز. ولديك مثال بسيط فيه معدّل وسطي لمواصفات جهاز الحاسوب: quad core i5 with 6MB cache, 2.8GHz. Memory; at minimum 8GB. 16GB . Hard drive; a hybrid or SSD. وطبعاً يمكنك اختيار مواصفات أكثر أو أقل من ذلك حسب الحاجة والميزانية. إن تحديد إمكانيات الجهاز المطلوب تعتمد بشكل مباشر على نوع العمل الذي ستقوم به، وتبعاً لذلك يمكنك وضع مجال محدد لمكونات الجهاز بحيث تحقق أقل المواصفات المطلوبة لإنجاز هذا العمل. ولكن في النهاية لا داعي للقلق حول إمكانيات ومواصفات الجهاز فلن تشعر بفارق كبير في الأداء في حال كنت تستعمل فقط برامج معالجة النصوص ومتصفح ويب. كما وأنه يمكنك في أي وقت الاستفادة من التقنيات السحابية من تخزين ومعالجة وبقية الوظائف التي تقدمها.
  14. تعد المصادقة المتعددة مهمة جدًا إذا كنت تعمل على تطبيق ويب كبير الحجم، فتمكنك من استخدام صلاحيات مختلفة تابعة لجداول مختلفة للمستخدمين مثل جدول "المستخدمين" لتسجيل مستخدم الموقع وجدول "المشرفين" للمستخدم المسؤول أو للدخول إلى لوحة التحكم على سبيل المثال. وبهذه الطريقة توفر أمانًا وقوةً حيث يمكنك الفصل بين المستخدمين وإعطاء صلاحيات وصول مختلفة لكل نوع. مثال عن تطبيقها: أولاً نقوم بإنشاء مصادقة في حال لم تكن موجودة كالتالي: php artisan make:auth نقوم بإنشاء مودل للمدراء كالتالي، ونقوم بملء الحقول اللازمة ضمنه: php artisan make:model Admin ثم نقوم بإنشاء المتحكم الخاص بالمدراء: php artisan make:controller AdminController class AdminController extends Controller { public function __construct() { $this->middleware('auth:admin'); } public function index() { return view('admin'); } } ونلاحظ هنا أنه تم استخدام middleware وهو admin، ولكن لمستخدمي الموقع يجب أن نستخدم مصادقة أخرى، حيث لا يجب على المستخدمين العاديين الدخول إلى لوحة التحكم للموقع، فنقوم أولاً بمعالجة عملية المصادقة وتسجيل الدخول للمدراء عن طريق إنشاء متحكّم خاص بذلك كالتالي: php artisan make:controller Auth/AdminLoginController أما للمستخدمين العاديين فسيتم التحقق والمصادقة بشكل منفصل كالتالي: public function showLoginForm() { return view('auth.login'); } وأخيراً لا ننسى تعديل ملف config/auth.php وإضافة الجزئية الخاصة بمصادقة المدراء كالتالي: //المصادقة الافتراضية 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], //مصادقة المدراء أو المشرفين التي قمنا بإنشائها 'admins' => [ 'driver' => 'eloquent', 'model' => App\Admin::class, ], // // 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ], // // 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Admin::class, ], ], // وهنا يمكننا ملاحظة أنه تمكّنا من فصل كيان المستخدم المدير عن كيان المستخدم العادي، عن طريق استخدام جدولين مختلفين في قاعدة البيانات واستخدام guard مختلف وجلسات مختلفة لكل منهما. وبنفس الطريقة يمكن إضافة نوع جديد آخر ينتمى أيضاً لجدول آخر في قاعدة البيانات وله صلاحيات وصول مختلفة.
  15. في الحذف الناعم أو soft delete عند حذف نموذج ما ، لا تتم إزالته بالفعل من قاعدة البيانات الخاصة بك. بدلاً من ذلك ، يتم تعيين الطابع الزمني delete_at على السجل. وبذلك تمكّنك لارافيل من استعادة البيانات فيما بعد. لتمكين عمليات الحذف الناعمة لنموذج ، حدد خاصية softDelete على النموذج، مثال: عند كتابة ملفات التهجير، نضيف الحقل softDeletes كالتالي: use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateItemsTable extends Migration { public function up() { Schema::create('items', function(Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('description'); $table->softDeletes(); $table->timestamps(); }); } public function down() { Schema::drop("items"); } } ثم عند تعريف المودل item نقوم باستخادم use softDeletes كالتالي: namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Item extends Model { use SoftDeletes; public $fillable = ['title','description']; protected $dates = ['deleted_at']; } والآن، عند استرجاع بيانات محددة، ستقوم لارافيل بإعادة السجلات فقط التي تحوي القيمة null ضمن العمود deleted_at، أي بمعنى آخر سيتم إهمال أي سجلات تحوي قيم ضمن الحقل deleted_at وكأنها غير موجودة، ولكن يمكنك بأي وقت الرجوع إلى قاعدة البيانات ورؤيتها حيث لن يتم حذفها بشكل نهائي: مثلاً عند تنفيذ الأمر التالي: $data = Item::get(); ستعيد كافة الحقول التي قيمة deleted_at فيها هي null أما لاستعادة كافة السجلات (المحذوفة والغير محذوفة) عندها يجب أن تستعمل الأمر التالي: $data = Item::withTrashed()->get(); إذاً، الفائدة هنا هي عند وجود بعض السجلات التي ترغب بعدم حذفها نهائياً من قاعدة البيانات وحتى لا يتم استرجاعها عند كل عملية جلب للبيانات من القاعدة يمكنك استخدام تقنية الحذف الناعم وبالتالي ستبقى ضمن قاعدة البيانات ويمكنك الرجوع إليها عند الضرورة ولكن لن يتم استرجاعها إلا عندما ترغب بذلك. وهذا مفيد جداً لأنه يحسّن من الأداء والسرعة.
  16. Sam Ahw

    admin panel in laravel

    نعم من الأفضل فصل المتحكمات controllers تبعاً للوظائف التي تقوم بها، لأن جمع عدّة وظائف أو وجود توابع كثيرة ضمن متحكم controller واحد سيجعل من الصعب على المبرمج العودة إلى الكود وصيانته أو تحسينه أو ملاحقة الأخطاء فيما بعد. لذلك يفضّل دوماً فصل المتحكمات عن بعضها. بحيث يتم تجميع الخصائص التي ترتبط بكيان واحد في المتحكّم المستقل لها. وذلك يتيح لك أيضاً أريحية في إضافة الوسائط middlewares بشكل منفصل بدلاً من دمجها في متحكّم واحد. أيضاً، وكلما زادت عملية التفصيل هذه زادت سرعة تحديد الخطأ وصيانة الكود مما يتيح لك في حال حدوث خطأ معيّن يمكنك بسهولة التوجه إلى المتحكّم المسؤول عن هذه الوظيفة ومعالجتها ، لذلك ينصح أيضاً بفصل حتى (العمليات) على عدة متحكمات، على سبيل المثال (متحكم خاص بعملية تسجيل الدخول والتحقق ونسميه: AuthenticationController،... وهكذا). حيث أن النمط المتّبع لفصل المتحكّمات الخاصة بالمدراء admins عن مستخدمي الموقع يمكن أن يكون على الشكل التالي: app http controllers Admin //نضع ضمن هذا المجلد جميع المتحكمات الخاصة بلوحة التحكم AuthenticationController AnotherController ..... MainController // باقي المتحكمات التابعة للموقع ... ولكن في النهاية، أي نمط متّبع سيعمل بالتأكيد ولن يسبب أخطاء، ولكن هذه النصائح فقط لجعل الكود مرن وقابل للقراءة أكثر.
  17. حاول إنشاء تطبيقك لمنصة واحدة محددة فقط. Fat APK يعني أن تطبيقك يتم إنشاؤه للعديد من الأنظمة الأساسية. جرب بناؤه مرة واحدة ولكن لمنصة محددة فقط وكما يقترح عليك ضمن رسالة الخطأ يمكنك تجربة إحدى الأوامر: flutter build appbundle --target-platform android-arm,android-arm64,android-x64 حيث تقوم بتحديد المنصة التي تريد البناء عليها. مثلاً android-x64 يمكنك أيضاً أن تقوم ببناء التطبيق مباشرةً من Android Studio أو Xcode وبذلك سيتم بناؤه لمنصة واحدة. وأيضاً لاحظت وجود خطأ آخر وهو: Plugin project :firebase_core_web not found. Please update settings.gradle. ولمعالجة هذه المشكلة يجب أن تقوم بتحديث ملف android/app/build.gradle كالتالي: من: android { // ... defaultConfig { // ... minSdkVersion 16 } } إلى: android { // ... defaultConfig { // ... minSdkVersion 23 } } لأنه عند استخدام flutter يجب أن تكون قيمة minSdkVersion 23
  18. في HTML يوجد عدّة عناصر لها علامات إغلاق ذاتي (Self-closing Tags) ومنها: سابقاً في النسخة الأقدم من HTML أي في نسخة HTML4 كان من الضروري وضع إشارة الإغلاق لهذه العناصر. أما في النسخة الحديثة من HTML أي HTML5 أصبح وضعها اختيارياً ولايسبب أي خطأ في حال عدم وضعها. ولكن يفضّل دوماً وضعها لأنها توضّح للمبرمج أن هذا الوسم ينتهي هنا وأنه لم يقم بكاتبة وسم إغلاق له في مكانٍ آخر، وذلك مفيد جداً عندما تزداد عدد العناصر المتداخلة في الكود ويتيح للمبرمج أريحية في فهم وقراءة الكود.
  19. نعم يمكنك العودة إلى الأسئلة السابقة من خلال صفحتك الشخصية. ولا يتم حذف الأسئلة حتى لو أصبحت قديمة بالتاريخ يمكنك العودة إليها بأي وقت.
  20. تغطي شهادة 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% كما يمكنك الاطلاع على أسئلة سنوات سابقة لأخذ فكرة عن نوعية الأسئلة وتوزيعها والتدرّب عليها.
  21. السبب يعود لنوع الأقواس المستخدمة، فإذا لاحظنا أن المدرّب قام باستعمال أقواس متعرّجة عند استخدام المتغيّر total عند تغييرها إلى أقواس متعرّجة سيتم طباعة محتوى المتغيّر total كالتالي: alert(`Your total is ${total}`); وسبب ذلك في أن علامات التنصيص المستخدمة (`) تسمح بكتابة محتوى نصي بداخلها وأيضاً يمكن إضافة متغيرات تحوي قيم، وعند الحاجة لاستخدام المتغيرات بداخلها يجب وضعها بداخل أقواس متعرجة مع وضع الإشارة $ قبلها أي بالشكل التالي: ${variable} وعندها لا يتم طباعة كلمة variable وإنما يتم طباعة محتواها التي تدل عليه. مثال: var text = 'Hello'; console.log(`this is text`); سيطبع النص التالي: this is text أما الأمر: console.log(`this is ${text}); سيطبع النص التالي: this is Hello // ونلاحظ هنا أنه تم استبدال المتغيّر بالمحتوى المخزّن ضمنه
  22. المشكلة هي بوجود width: 400 ، فقط قم بإزالتها وسيعود العرض الطبيعي للعنصر
  23. في حال كنت تقوم بإضافة تغييرات أخرى على هذا العنصر وتظهر، وفقط عند تغيير العرض لا يتأثر، فإن ذلك يعود حتماً لوجود خاصية أخرى تتحكم بالعرض. لأنه بالكود الذي أرفقته لا يوجد خصائص تتحكم بالعرض سوى width، كما وأنه يمكنك التجريب بتغيير قيم الهوامش الموجودة: margin:0 auto 10px auto والتي تقوم هنا بإضافة هامش على اليمين واليسار بشكل تلقائي auto، ربما يمكنك التجربة بوضعها 0px. ولكن لا يوجد مشكلة بباقي التنسيقات الموجودة ضمن هذا الجزء. لذلك أقترح عليك كما ذكرت سابقاً مراقبة الحاوية لهذا العنصر أو باقي عناصر الصفحة في حال كانت تؤثر على عرض العناصر التي بداخلها وأيضاً يجب الأخذ بعين الاعتبار أن خاصيات التموضع position و flex والكثير من أساسيات البنية قد يسبب هذا الأمر
  24. من الصعب تحديد الخطأ بجزء صغير من الكود، حيث يمكن أن تكون المشكلة بعنصر آخر موجود ضمن الصفحة ويسبب تلك المشكلة في العرض، ولكن بملاحظة الكود الذي أرفقته ألاحظ أنه يوجد قيمتين مختلفتين للعرض: width:400px; ثم width: 100% !important وبسبب وجود الخاصية !important سيتم تطبيق العرض 100% أي (كامل عرض العنصر) بدلاً من 400px. لا أعلم إذا كانت ستحل المشكلة، ولكن باعتبار المشكلة ضمن هذا الجزء من الكود يمكنك فقط إزالة هذا التكرار واعتماد عرض واحد ثم عليك بالتجريب لرؤية إذا كانت ستحل المشكلة. وبما أنك تقوم بالفحص على المتصفح Inspect، يمكنك التأكد بتحديد العنصر الذي يسبب المشكلة (أي العنصر ذو العرض الكبير) ورؤية التنسيقات التي يتم تطبيقها عليه في حال كان مطبّق عليه أي خاصية تسبب هذه المشكلة في العرض.
  25. لا يوجد قيمة نهائية عظمى ثابتة لعدد السجلات في الجدول، فذلك يعتمد على حجم البيانات المخزنة ضمن كل سجل وفي الجدول بشكل عام، ولكن بشكل تقريبي وباعتبار الحد الأقصى لحجم الجدول هو 64 تيرابايت، وبما أن الحد الأعظمى لسعة السجل الواحد الافتراضية هي 65,535 فبشكل تقريبي يكون عدد السجلات الأعظمى حوالي 1073.741.824 سجلاً. ومع ذلك ، يمكن إضافة المزيد من السجلات إذا كان حجم السجل الواحد أصغر. لا يتم النظر عادةً إلى العدد الأقصى للسجلات في الجدول أو العدد الأقصى لعدد الجداول في القاعدة، فإن MySql مصمم للتعامل مع بيانات بأعداد هائلة كما وأنه قابل للتوسع والنشر على عدة مخدّمات في حال تطلب الأمر ذلك. ويجب أيضاً لفت الانتباه إلى الاطلاع على قدرات مخدّم الويب الذي يحوي قاعدة البيانات، لأن سعته التخزينية ومواصفاته أيضاً ستكون عامل رئيسي في التخزين.
×
×
  • أضف...