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

Hassan Hedr

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

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

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

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

    38

أجوبة بواسطة Hassan Hedr

  1. يحب أولًا التأكد من تثبيت الإضافات sqlsrv و pdo_sqlsrv في PHP على بيئة الخادم، بعدها ضمن ملف متغيرات البيئة env. للتطبيق أو حسب الطريقة التي يمكن تعيين متغيرات البيئة للتطبيق على الخادم يجب تعيين القيم التي تبدأ ب "_DB" بقيمها الصحيحة لتعيين عنوان ومنفذ قاعدة البيانات، واسم المستخدم وكلمة المرور له للتواصل معها، وأهم متغير هو نوع قاعدة البيانات المستخدمة كالتالي:

    DB_CONNECTION=sqlsrv
    DB_HOST=127.0.0.1 # عنوان قاعدة البيانات
    DB_PORT=1433 # منفذ قاعدة البيانات
    DB_DATABASE=database_name # اسم قاعدة البيانات للتطبيق
    DB_USERNAME=user # اسم المستخدم لقاعدة البيانات
    DB_PASSWORD=password # كلمة السر لحساب المستخدم

    يمكن بعدها تشغيل التطبيق وسيتواصل مع قاعدة البيانات المشار إليها ضمن تلك المتغيرات والتعامل معها بشكل طبيعي

  2. يوجد عدة طرق للتواصل مع التطبيق أي القناة التي تمر عبرها بيانات الدخل وتصل بيانات الخرج إلى المستخدم، حيث نُعرّف داخل الملفات ضمن مجلد routes الطرق بأنواعها العديدة المؤدية إلى التطبيق وكيفية توجيه الطلبات القادمة عبر أي نوع من القنوات والملفات لتلك القنوات هي:

    • ملف web.php للتواصل عبر الويب وطلبات HTTP عن طريق المتصفح.
    • ملف api.php للتواصل عبر الواجهة البرمجية للتطبيق بطلبات مثل AJAX لطلب صيغ مثل JSON.
    • ملف console.php للتواصل عبر الطرفية وسطر الأوامر باستخدام artisan.
    • ملف channels.php للتواصل عبر قنوات الاتصال الحية مثل مقابس الويب WebSockets.

    استخدم كل ملف منها لتعريف التوجيه لكل نوع من أنواع التواصل مع تطبيقك التي ترغب بها، ومن الشائع عند تطوير الويب تعريف التوجيه ضمن مسارات web.php وإذا دعت الحاجة لتعريف بعض المسارات للواجهة البرمجية للتطبيق API ضمن ملف api.php وذلك لدعم بعض الواجهات التي تُصيّر Renders بطرف العميل 

  3. قيمة أقدم تاريخ تسجيل يجب أن تكون أول يوم من السنة الحالية، ما تمرره هو تاريخ اليوم الحالي لذا يجب استخدام التابع startOfYear لتمرير قيمة أول يوم من السنة الحالية كالتالي:

    $users = User::select('email')->whereDate('created_at', '>', now()->startOfYear())->count();

    أو يمكن الاستفادة مباشرة من تابع الاستعلام whereYear وتمرير السنة التي نريد الاستعلام عنها لتصبح الشيفرة أوضح عند قراءتها كالتالي: 

    $users = User::select('email')->whereYear('created_at', '=', now()->year)->count();

     

    • أعجبني 1
  4. بتاريخ منذ ساعة مضت قال Mohammmed Mahmoud:

    طيب انا استطيع كتابة Date() بدون new ما الفرق

    عند استدعاء Date كتابع فإن الناتج من تلك العملية سيكون سلسلة نصية تعبر عن التاريخ الحالي، كلمة new تفيد في بناء كائنات من صنف أو تابع يعامل معاملة التابع الباني، وعند استدعاء نفس التابع مسبوقًا بكلمة new، سيُنشئ جافاسكربت كائن فارغ جديد object ويربطه bind بعملية تنفيذ ثم يربط ال prototype لذلك التابع بهذا الكائن ويعيد ذلك الكائن كناتج من تلك العملية،

    الفائدة من ذلك أن كل التوابع المعرفة ضمن prototype التابع الباني سيتم تعيينها ضمن الكائن الجديد، وأن أي متغيرات يتم تعيينها ضمن التابع على الكلمة this سيتم تعيينها ضمن الكائن أيضًا، أي الهدف من الكلمة new هي إنشاء نسخة كائن جديدة تحمل صفات التابع الباني، أو ما يشبه في لغات البرمجة كائنية التوجة الأخرى عملية إنشاء كائن جديد من صنف class، يمكنك الاستفادة من قراءة المقالات التالية:

     

  5. حاول الرجوع إلى مسار الأساسيات وتدرب عليها وادرسها أكثر، التقدم إلى الدروس اللاحقة دون تمكين الأساسيات كلها أو إهمال بعضها سيعرضك لمشاكل في فهم الدروس اللاحقة وتشعر أنك لا تستطيع التطبيق أو فهم الدروس، ركز على التطبيق العملي لتلك الأساسيات وطور برامج بسيطة تستخدم فيها ما تعلمت، من ضمنها التمارين ضمن مسار الأساسيات ولا تتجاوز أي فكرة لا تفهمها، يمكنك الاستفادة من قراءة المقال التالي:

     

    • أعجبني 1
  6. يوجد عدة معايير تدخل في حساب التكلفة أهمها طبيعة المشروع والجهد والوقت المطلوبين لإتمامه، ومستواك كمطور وعلاقتك بالزبون ومصاريفك الشخصية كلها تدخل في حساب تكلفة المشروع ولا يوجد معيار ثابت لتحديد الكلفة، يمكنك المقارنة مع أعمال مماثلة في السوق إن أردت لمعرفة متوسط الأسعار التي تطلب، ويمكنك تحديد هامش عليها بحسب المعايير السابقة لطلب السعر الذي يناسبك، وفي حال كان ضمن ميزانية العميل يمكنك طلب السعر المناسب لك، يمكنك الاستفادة والتعرف على طرق التسعير من المقالات التالية:

     

  7. بعد إتمام الدورة سيتم إرشادك ومساعدتك لتحسين سيرتك الذاتية وملفاتك الشخصية على مواقع العمل الحر وتقديم عدة نصائح لزيادة فرصك في الحصول على أول مشروع لك، قد يفيدك ذلك في الحصول إما على مشروع كعمل حر عن بعد أو حتى قد يفيدك ذلك للحصول على وظيفة، وللمعاملات المالية في مواقع العمل الحر مثل مستقل وخمسات إذا كان لديك حساب على PayPal يكون ذلك كافيًا لسحب أرباحك من المشاريع التي تنجزها، إذا كان لديك أي استفسار آخر عن تفاصيل تلك المساعدة يمكنك التواصل مع مركز المساعدة

  8. إذا كنتي تقصدين ذلك في توابع معالجة الأحداث Event Handlers كلاهما يشير إلى العنصر ضمن مستند HTML الذي استهدفه الحدث الحالي (عنصر الزر مثلًا عند الضغط عليه):

    button.addEventListener('click', function(e){
      e.target // button
    });
    
    button.addEventListener('click', function(e){
      this // button
    });

    الفرق بين الوصول إلى العنصر بالطريقتين أن الوصول إليه عن طريق this لا يعمل عند تمرير تابع سهمي لمعالجة الحدث، وهنا يمكن استخدام e.target بدلًا من ذلك: 

    button.addEventListener('click', e => {
      this // لا يشير إلى العنصر
      e.target // button
    });
    
    button.addEventListener('click', function(e){
      this // button
    });

    يمكنك الاستفادة من قراءة المقال التالي:

     

    • أعجبني 1
  9. حاول تنفيذ أمر التهجير من طرفية cmd عادية الخاصة بنظام ويندوز، تأكد قبلها من تغيير المسار الحالي إلى مسار مجلد المشروع لديك، في حال لم ينجح الأمر حاول إلغاء تثبيت XAMPP وإعادة تثبيته مجددًا حتى تتأكد من وجود ملفات إضافات PHP كاملة

  10. بتاريخ الآن قال Brahim Semmani:

    أعرف كل ما قلته أخي حسان لكن سؤالي كان حول ما الذي يؤثر على القيمة المرجعة من دالة العلاقة (Phone::find($id)->user)في حال مررت عمود آخر مثل ماورد في التوثيق,

    أعرف أن لارافل تلقائيا تفترض من خلال أسم اميثود أن المفتاح الرئيسي هو methodName_id وهاذي القيمة الأفتراضية للمعامل الثاني في حال إتبعنا العرف ,لكن الشيء الذي دعاني لطرح السؤال العبارة 

    
    If the parent model does not use id as its primary key,// or you wish to find the associated model using a different column//

    يقول لك إذا كان الصنف الأب لا يستخدم id كمفتاح رئيسي    أو    أو ترغب في العثور على النموذج المرتبط باستخدام عمود مختلف  

    هنا لم أفهم جيدا مثلا مررت كمعامل ثالت عمود البريد الإلكتروني ('email'), و صنف المستخدمين في هذه الحالة يستخدم id كمفتاح رئيسي بشكل عادي معناه أنا الآن أرغي في العثور على النمودج المرتبط (User) بإستخدام عمود مختلف وهو email 

    أرجوا أن تكون فهمتني
     

    هل حاولت ذلك ونجح الأمر؟ فالغرض من كون الحقل المشار إليه مفتاحًا أوليًا هو ضمان أن القيمة التي نشير إليها تابعة لسجل واحد فقط، بينما في حال أشرنا لأي حقل آخر قد يكون هناك عدة سجلات تملك قيمته وهنا سيحدث خطأ لأن علاقة belongsTo تفترض ضمنيًا وجود سجل واحد فقط من الجدول المقابل، بغض النظر عن استعمال unique فلارافل لا يتطلع على خصائص الجدول قبل الاستعلام ليتأكد من ذلك، ويعتمد على المطور في تحديد وتمرير أسماء حقول صحيحة

    • أعجبني 1
  11. في حال كان السجل من جدول النموذج Phone ينتمي لمستخدم واحد من جدول النموذج User، فطريقة الربط بين جدولين تكون بذكر المفتاح الأولي PK للمستخدم ضمن كل سجل من Phone لتكون الجداول كالتالي:

    |  users  |             |   phones   |
    -----------  يشير إلى   -------------
    |   id    |    <--      |  user_id  |

    المعامل الأول للتابع belongsTo هو اسم صنف النموذج الذي سيرتبط به النموذج الحالي، المعامل الثاني هو اسم المفتاح الخارجي FK من النموذج الحالي وهو user_id، أما المعامل الثالث هو المفتاح الأولي PK للجدول الذي نريد الربط معه، وآخر معاملين اختياريين عند عدم تمريرهما يمكن للارافل توقع اسماء تلك المفاتيح من اسم النموذج User، 

    ما يشير إليه التوثيق هو الحالة التي يستخدم فيها الجدول الذي نريد الربط معه مفتاح أولي باسم مختلف عن id وهو ما يفترضه لارافل تلقائيًا عادةً، هنا يمكنك تمرير اسم المفتاح يدويًا حتى يعلم لارافل كيف يمكنه الاستعلام عن ذلك النموذج واتمام الربط بشكل صحيح :

    |       users        |             |        phones        |
    ----------------------  يشير إلى   -----------------------
    |   serial_number    |    <--      |  user_serial_number  |

    فتمرر أسماء المفاتيح تلك يدويًا كالتالي:

    public function user()
    {
        return $this->belongsTo(User::class, 'user_serial_number', 'serial_number');
    }

     

    • أعجبني 1
  12. بتاريخ On 7/27/2022 at 22:06 قال Sheikh El Moctar:

    حسنا، لكن الامر مختلف في بقة اللغات البرمجية، فمثلا بايثون وجافا وجافا سكربت عندما تطور مكتبة في اصدار قديم من اللغة، فانه يمكنك استعماله في اصدارات الاحدث منه فمافوق،

    تخيل معي انك تعمل على مشروع في بي اتش بي واحتجت 10 مكتبات في المشروع ولكن كل واحدة منهم تبين انها تعدم اصدارا خاص عن الاخريات من اللغة مثلا 8.1, 7.5.5, 5.5.4, 6.4.5, ..

    فما الحل من وجهة نظرك؟؟😂

    حتى في Python قد توجد مكتبات لا تدعم إصدارات حديثة من اللغة وستحتاج تطوير لتتمكن استخدامها، الحل في أي لغة برمجة عند الاعتماد على المكتبات محاولة اختيار المدعومة والمشهورة منها، فمطوريها سيحدثونها باستمرار وستتمكن من الحصول على النسخة التي تناسبك دون القلق حول التوافق مع إصدار اللغة

    • أعجبني 1
  13. في كل لغات البرمجة تعتمد المكتبات فيها على الواجهات البرمجية API التي توفرها بيئة التشغيل، وهذه الواجهات تختلف بين إصدار وآخر من بيئة التشغيل، مثلًا في PHP قد تعتمد المكتبة على ميزة في إصدار PHP رقم 5.6، لكن تم تغييرها في إصدارات PHP اللاحقة، لذا لاستعمال تلك المكتبة تحتاج إلى إصدار PHP يتوافق معها، وكذلك الأمر لجميع المكتبات وأطر العمل، لا يعتبر ذلك عيبًا بس هو الطريقة الطبيعية في تطوير البرمجيات، كل مكتبة أو وحدة برمجية تعتمد على مزايا اللغة في إصدار معين منه وعلى مكتبات أخرى في بعض الأحيان،

    الحل لمشكلتك هو أن يتم تطوير المكتبة التي تريد استخدامها لتدعم إصدارات اللغة الأحدث وتستطيع استخدامها في إصدار اللغة الذي تعتمد عليه، وأحيانًا قد يكون صاحب المكتبة قد هجرها وتوقف عن تطويرها هنا أنت مضطر للبحث عن بديل لها مدعوم جيدًا، أو إذا لم تجد بديل ولديك القدرة على تحمل تكلفة تطوير المكتبة بنفسك يمكنك أخذ نسخة منها وتحديثها بنفسك لتتناسب مع الإصدارات الحديثة من اللغة،

    عمومًا حاول دومًا البحث عن المكتبات المستخدمة بشكل كبير والمدعومة بشكل جيد قبل الاعتماد عليها في مشاريعك لتجنب تلك المشاكل،

    • أعجبني 1
  14. أنصحك بالقراءة عن ما تتعامل معه فقط، وحاول فهمه وطريقة عمله ولماذا يستخدم، لأن مجال إدارة الخوادم و DevOps واسع ومتشعب، مثلًا إبدأ بالقراءة عن DNS بشكل عام وما هي وظيفته وما هي أنواع السجلات Records ضمنه، يمكنك الاستفادة من قراءة المقالات:

    ثم تعرف على خوادم الويب مثل Apache وما هي وظيفتها الأساسية دون التعمق في ذلك، وتعرف على ملف الإعدادات الفرعي الذي يستخدمه htacess. وما هي الأوامر الأساسية الممكن إعدادها ضمنه لمختلف الحالات، لهذا الملف بالذات أنصحك بالرجوع للتوثيق الرسمي لكل أمر تستخدمه والقراءة عنه أكثر، ويمكنك الاستفادة من قراءة المقالات:

    مع الممارسة ومواجهة مشاكل جديدة في كل مرة ستزيد خبرتك، المهارة الأساسية التي تحتاجها هي البحث عن حلول للمشاكل والقراءة ضمن المراجع والتوثيقات أو الحلول المقترحة،

    بالتوفيق لك 

    • أعجبني 1
  15. يجب تمرير العنصر المخزن ضمن الثابت hhart ليتم إضافته وليس تمرير سلسلة نصية تحمل نفس اسم الثابت، فبذلك سيتم إضافة نص داخل ذلك العنصر، لحل المشكلة يجب تعديل شيفرة الإضافة لتصبح كالتالي:

    contenerheart.append(hhart);

     

    • أعجبني 1
  16. في حال كنت تستخدم Bootstrap لتنسيق الموقع تأكد من توجيه المتصفح Paginator لاستخدام تنسيقات Bootstrap وذلك باستدعاء useBoostrap ضمن أحد مزودات الخدمة المسجلة في التطبيق، مثل AppServiceProvider كالتالي:

    use Illuminate\Pagination\Paginator;
    
    class AppServiceProvider extends ServiceProvider {
    
      public function boot()
      {
        Paginator::useBootstrap();
      }
    }

    يمكنك الاستفادة من قراءة المقال التالي:

     

    • أعجبني 1
  17. في جافاسكربت حلقة for in تستخدم للمرور على خواص كائن ما، وتتألف الحلقة من قسمين:

    • قسم رأس الحلقة وفيه نعين المتغير الذي سنمر على خصائصه، واسم المتغير الذي سيعبر عن الخاصية الحالية.
    • جسم الحلقة، وفيه تنفذ التعليمات البرمجية داخله مرة لكل خاصية من الكائن.

    مثلًا إذا كان لدينا كائن يحوي عدة خواص يمكن المرور عليها وطباعتها إلى console كالتالي:

    const person = { name: 'Ahmad', age: 25 };
    
    for (const property in person) {
      const value = person[property] // قيمة الخاصية الحالية
      console.log(property, ': ', value);
    }
    
    // ناتج الطباعة
    // "name: Ahmad"
    // "age: 25"

     

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

    يمكنك الاستفادة والاطلاع على المقالات التالية:

     

  19. يجب أولًا طلب تسجيل الصوت من المستخدم وذلك باستدعاء التابع getUserMedia وطلب الصوت فقط كالتالي:

    navigator.mediaDevices.getUserMedia({ audio: true })

    سيعيد الاستدعاء السابق وعد Promise عند نجاحه يكون المستخدم قد وافق على السماحية بالوصول للمايكروفون، والآن يمكن الاستعانة بالصنف MediaRecorder لتسجيل الصوت، حيث نمرر له المجرى stream الناتج عن طلب الوصول السابق كالتالي:

    navigator.mediaDevices.getUserMedia({ audio: true })
      .then(stream => {
        const mediaRecorder = new MediaRecorder(stream);
        mediaRecorder.start(); // بدء التسجيل
      });

    ونستفيد من الحدث dataavailable لتخزين بيانات الصوت ضمن مصفوفة مثلًا كالتالي:

    const audioChunks = []; // بيانات الصوت
    mediaRecorder.addEventListener("dataavailable", event => {
      audioChunks.push(event.data);
    });

    ولإنهاء تسجيل الصوت يمكن استدعاء التابع stop سواء عند ضغط المستخدم على زر ما أو بحسب حالة تطبيقك كالتالي:

    mediaRecorder.stop();

    نستفيد من الحدث stop الذي سيطلق بعد إنتهاء التسجيل لتحويل بيانات الصوت التي خزناها مسبقًا إلى ملف وحفظه كالتالي:

    mediaRecorder.addEventListener("stop", () => {
      const audioBlob = new Blob(audioChunks, { type: mediaRecorder.mimeType });
      const audioUrl = URL.createObjectURL(audioBlob);
      
      // تحميل ملف الصوت
      var a = document.getElementById("a");
      a.href = audioUrl;
      a.download = "recording.webm";
      document.body.appendChild(a);
      a.click();
    });

     

  20. أولًا يجب أن تتواجد خدمة توفر البيانات التي تحتاجها ضمن تطبيقك عن طريقة واجهة برمجية API، بعد العثور على تلك الخدمة يجب قراءة توثيقها ومعرفة طريقة جلب البيانات منها سواء المسارات المتوفرة Endpoints أو حدود استخدام الخدمة أو عملية الاستيثاق اللازمة للتخاطب مع تلك الواجهة، عن طريق إنشاء حساب على تلك الخدمة مثلًا والحصول على مفتاح API Key يمكنك من التواصل معها،

    بعد تحديد الواجهة البرمجية API وتحضير المستلزمات هنا تبني تطبيقك ليستفيد من البيانات من تلك الخدمة، والتواصل يكون عبر إرسال طلبات HTTP لتلك الواجهة مع إرفاق الترويسات المناسبة (مثلًا مفتاح API Key) ومعالجة البيانات الواردة وعرضها ضمن التطبيق، مثلًا يمكن عند كل فتح للتطبيق من قبل المستخدم تحديث تلك البيانات وعرضها، أو ممكن تحديث تلك البيانات دوريًا خلال فواصل زمنية مثلًا كل دقيقة وتحديث الواجهة لعرض البيانات هذا الأمر يعتمد على نوع البيانات وتردد تحديثها وضرورة ذلك،

    يمكنك الاستفادة من قراءة المقالات التالية:

     

  21. مكدس الاستدعاءات Call Stack هو طريقة لتتبع استدعاءات التوابع لبعضها البعض، بداية كلمة مكدس تشير إلى طريقة الترتيب من يدخل أخيرًا يخرج أولًا أو LIFO، أي يمكن وضع العناصر ضمن المكدس من الأعلى فقط، وحذف العناصر أيضًا من الأعلى فقط، تستخدم في لغات البرمجة وجافاسكربت عندما يستدعي تابع تابعًا آخر كالتالي:

    function A() {
     B()
    }
    
    function B() {
     C()
    }
    
    A()

     فعند كل تنفيذ لتابع ما يضاف استدعاءه إلى المكدس، لذا في المثال السابق وخلال تنفيذ التابع C يكون المكدس يحوي التالي:

    C <- آخر استدعاء
    B
    A

     وهو يفيد عند انتهاء تنفيذ كل تابع لمعرفة التعليمات الواجب إكمال تنفيذها ضمن التابع الأب، يمكنك الاستفادة من قراءة فقرة "مكدس الاستدعاء" من المقال التالي:

     

    • أعجبني 1
  22. بتاريخ 4 دقائق مضت قال Brahim Semmani:

    قلت أجرب سلايدر آخر يحتوي على Next & Prev و أيضا لم يظهر في البداية لكن بعد أن حددت العنصر في وضع المطور و أضفت له بعض التنسيقات ظهر ويعمل هل هذا يعني أن تنسيقات المكتة الخاصة به لم يتم إدراجها ؟

    نعم أحسنت لقد حصرت المشكلة، تأكد من إرفاق تنسيقات CSS للمكتبة ضمن ملف جافاسكربت في حال كنت تستخدم محزم مثل webpack كالتالي:

    import 'swiper/css';
    import 'swiper/css/navigation';
    import 'swiper/css/pagination';

     

    • أعجبني 1
  23. بتاريخ 3 دقائق مضت قال Brahim Semmani:

    نفس الشيء لم تعمل 

    إصدار المكتبة 

    
        "dependencies": {
            "swiper": "^8.3.1"
        }

     

    هل عاينت هيكلية العناصر ضمن الصفحة بعد اكتمال تحميلها، قد تكون دوائر التنقل موجودة وظاهرة لكن لها لون مماثل للخلفية ما يجعلها غير مرئية، أيضًا تأكد من تحميل شيفرات جافاسكربت ضمن الصفحة بشكل سليم عبر إضافة رسالة تطبعها إلى console مثلًا باستخدام console.log، وأمر آخر أن تتأكد من أنك تعاين ضمن الصفحة العنصر صاحب الصنف swiper-pagination، وتتأكد من أنه يحوي على عدة شرائح slides من البيانات وليس واحدة فقط

    • أعجبني 1
  24. بتاريخ 2 دقائق مضت قال Brahim Semmani:

    لايوجد أي خطأ في الكونسل متعلق بالحزمة

    جربت فعلت تماما مثل ماقلتم لكن لاشيء جديد

    والنتيجو كل شيء يعمل غير أن المتحكمات لاتعمل

    حاول إضافة الخواص التالية عند تهيئة Swiper واختبر مجددًا:

    new Swiper(.., {
      ..
      observer: true,
      observeParents: true,
    })

     

    • أعجبني 1
×
×
  • أضف...