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

Hassan Hedr

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

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

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

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

    38

كل منشورات العضو Hassan Hedr

  1. يوجد عدة معايير تدخل في حساب التكلفة أهمها طبيعة المشروع والجهد والوقت المطلوبين لإتمامه، ومستواك كمطور وعلاقتك بالزبون ومصاريفك الشخصية كلها تدخل في حساب تكلفة المشروع ولا يوجد معيار ثابت لتحديد الكلفة، يمكنك المقارنة مع أعمال مماثلة في السوق إن أردت لمعرفة متوسط الأسعار التي تطلب، ويمكنك تحديد هامش عليها بحسب المعايير السابقة لطلب السعر الذي يناسبك، وفي حال كان ضمن ميزانية العميل يمكنك طلب السعر المناسب لك، يمكنك الاستفادة والتعرف على طرق التسعير من المقالات التالية:
  2. بعد إتمام الدورة سيتم إرشادك ومساعدتك لتحسين سيرتك الذاتية وملفاتك الشخصية على مواقع العمل الحر وتقديم عدة نصائح لزيادة فرصك في الحصول على أول مشروع لك، قد يفيدك ذلك في الحصول إما على مشروع كعمل حر عن بعد أو حتى قد يفيدك ذلك للحصول على وظيفة، وللمعاملات المالية في مواقع العمل الحر مثل مستقل وخمسات إذا كان لديك حساب على PayPal يكون ذلك كافيًا لسحب أرباحك من المشاريع التي تنجزها، إذا كان لديك أي استفسار آخر عن تفاصيل تلك المساعدة يمكنك التواصل مع مركز المساعدة
  3. إذا كنتي تقصدين ذلك في توابع معالجة الأحداث 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 }); يمكنك الاستفادة من قراءة المقال التالي:
  4. حاول تنفيذ أمر التهجير من طرفية cmd عادية الخاصة بنظام ويندوز، تأكد قبلها من تغيير المسار الحالي إلى مسار مجلد المشروع لديك، في حال لم ينجح الأمر حاول إلغاء تثبيت XAMPP وإعادة تثبيته مجددًا حتى تتأكد من وجود ملفات إضافات PHP كاملة
  5. هل حاولت ذلك ونجح الأمر؟ فالغرض من كون الحقل المشار إليه مفتاحًا أوليًا هو ضمان أن القيمة التي نشير إليها تابعة لسجل واحد فقط، بينما في حال أشرنا لأي حقل آخر قد يكون هناك عدة سجلات تملك قيمته وهنا سيحدث خطأ لأن علاقة belongsTo تفترض ضمنيًا وجود سجل واحد فقط من الجدول المقابل، بغض النظر عن استعمال unique فلارافل لا يتطلع على خصائص الجدول قبل الاستعلام ليتأكد من ذلك، ويعتمد على المطور في تحديد وتمرير أسماء حقول صحيحة
  6. في حال كان السجل من جدول النموذج 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'); }
  7. حتى في Python قد توجد مكتبات لا تدعم إصدارات حديثة من اللغة وستحتاج تطوير لتتمكن استخدامها، الحل في أي لغة برمجة عند الاعتماد على المكتبات محاولة اختيار المدعومة والمشهورة منها، فمطوريها سيحدثونها باستمرار وستتمكن من الحصول على النسخة التي تناسبك دون القلق حول التوافق مع إصدار اللغة
  8. في كل لغات البرمجة تعتمد المكتبات فيها على الواجهات البرمجية API التي توفرها بيئة التشغيل، وهذه الواجهات تختلف بين إصدار وآخر من بيئة التشغيل، مثلًا في PHP قد تعتمد المكتبة على ميزة في إصدار PHP رقم 5.6، لكن تم تغييرها في إصدارات PHP اللاحقة، لذا لاستعمال تلك المكتبة تحتاج إلى إصدار PHP يتوافق معها، وكذلك الأمر لجميع المكتبات وأطر العمل، لا يعتبر ذلك عيبًا بس هو الطريقة الطبيعية في تطوير البرمجيات، كل مكتبة أو وحدة برمجية تعتمد على مزايا اللغة في إصدار معين منه وعلى مكتبات أخرى في بعض الأحيان، الحل لمشكلتك هو أن يتم تطوير المكتبة التي تريد استخدامها لتدعم إصدارات اللغة الأحدث وتستطيع استخدامها في إصدار اللغة الذي تعتمد عليه، وأحيانًا قد يكون صاحب المكتبة قد هجرها وتوقف عن تطويرها هنا أنت مضطر للبحث عن بديل لها مدعوم جيدًا، أو إذا لم تجد بديل ولديك القدرة على تحمل تكلفة تطوير المكتبة بنفسك يمكنك أخذ نسخة منها وتحديثها بنفسك لتتناسب مع الإصدارات الحديثة من اللغة، عمومًا حاول دومًا البحث عن المكتبات المستخدمة بشكل كبير والمدعومة بشكل جيد قبل الاعتماد عليها في مشاريعك لتجنب تلك المشاكل،
  9. أنصحك بالقراءة عن ما تتعامل معه فقط، وحاول فهمه وطريقة عمله ولماذا يستخدم، لأن مجال إدارة الخوادم و DevOps واسع ومتشعب، مثلًا إبدأ بالقراءة عن DNS بشكل عام وما هي وظيفته وما هي أنواع السجلات Records ضمنه، يمكنك الاستفادة من قراءة المقالات: ثم تعرف على خوادم الويب مثل Apache وما هي وظيفتها الأساسية دون التعمق في ذلك، وتعرف على ملف الإعدادات الفرعي الذي يستخدمه htacess. وما هي الأوامر الأساسية الممكن إعدادها ضمنه لمختلف الحالات، لهذا الملف بالذات أنصحك بالرجوع للتوثيق الرسمي لكل أمر تستخدمه والقراءة عنه أكثر، ويمكنك الاستفادة من قراءة المقالات: مع الممارسة ومواجهة مشاكل جديدة في كل مرة ستزيد خبرتك، المهارة الأساسية التي تحتاجها هي البحث عن حلول للمشاكل والقراءة ضمن المراجع والتوثيقات أو الحلول المقترحة، بالتوفيق لك
  10. يجب تمرير العنصر المخزن ضمن الثابت hhart ليتم إضافته وليس تمرير سلسلة نصية تحمل نفس اسم الثابت، فبذلك سيتم إضافة نص داخل ذلك العنصر، لحل المشكلة يجب تعديل شيفرة الإضافة لتصبح كالتالي: contenerheart.append(hhart);
  11. في حال كنت تستخدم Bootstrap لتنسيق الموقع تأكد من توجيه المتصفح Paginator لاستخدام تنسيقات Bootstrap وذلك باستدعاء useBoostrap ضمن أحد مزودات الخدمة المسجلة في التطبيق، مثل AppServiceProvider كالتالي: use Illuminate\Pagination\Paginator; class AppServiceProvider extends ServiceProvider { public function boot() { Paginator::useBootstrap(); } } يمكنك الاستفادة من قراءة المقال التالي:
  12. حاول إنشاء وعرض النافذة عبر استدعاءها مباشرة ضمن تابع رد النداء callback للحدث open-newWindow كالتالي: ipcMain.on("open-newWindow", function(event,arg){ creatnewWin(); });
  13. في جافاسكربت حلقة 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"
  14. علوم الحاسب ستتعرف خلالها على أساسيات عمل الحاسوب بشكل عام، ومختلف الأمور والمفاهيم المتعلقة به، سواء من العتاد إلى بنيته الداخلية إلى أساسيات البرمجة وتطوير الخوارزميات وحل المشاكل، مرورًا بقواعد البيانات والشبكات الحاسوبية واستخدام أنظمة التشغيل مثل لينكس، خبير الأمن السيبراني في مجال ما يجب أن يتعرف بداية على مجاله بشكل معمق، مثلًا خبير أمن الشبكات يجب أن يكون لديك فهم واسع عن الشبكات وطريقة عملها حتى يتمكن من حمايتها من المخاطر المحتملة، كمبتدئ يفضل البدء بدورة علوم الحاسب وأخذ نظرة شاملة عن هذا المجال، لتتمكن لاحقًا من تحديد الاختصاص الذي ترغب به ودراسة المفاهيم الأمنية له، يمكنك الاستفادة والاطلاع على المقالات التالية:
  15. يجب أولًا طلب تسجيل الصوت من المستخدم وذلك باستدعاء التابع 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(); });
  16. أولًا يجب أن تتواجد خدمة توفر البيانات التي تحتاجها ضمن تطبيقك عن طريقة واجهة برمجية API، بعد العثور على تلك الخدمة يجب قراءة توثيقها ومعرفة طريقة جلب البيانات منها سواء المسارات المتوفرة Endpoints أو حدود استخدام الخدمة أو عملية الاستيثاق اللازمة للتخاطب مع تلك الواجهة، عن طريق إنشاء حساب على تلك الخدمة مثلًا والحصول على مفتاح API Key يمكنك من التواصل معها، بعد تحديد الواجهة البرمجية API وتحضير المستلزمات هنا تبني تطبيقك ليستفيد من البيانات من تلك الخدمة، والتواصل يكون عبر إرسال طلبات HTTP لتلك الواجهة مع إرفاق الترويسات المناسبة (مثلًا مفتاح API Key) ومعالجة البيانات الواردة وعرضها ضمن التطبيق، مثلًا يمكن عند كل فتح للتطبيق من قبل المستخدم تحديث تلك البيانات وعرضها، أو ممكن تحديث تلك البيانات دوريًا خلال فواصل زمنية مثلًا كل دقيقة وتحديث الواجهة لعرض البيانات هذا الأمر يعتمد على نوع البيانات وتردد تحديثها وضرورة ذلك، يمكنك الاستفادة من قراءة المقالات التالية:
  17. مكدس الاستدعاءات Call Stack هو طريقة لتتبع استدعاءات التوابع لبعضها البعض، بداية كلمة مكدس تشير إلى طريقة الترتيب من يدخل أخيرًا يخرج أولًا أو LIFO، أي يمكن وضع العناصر ضمن المكدس من الأعلى فقط، وحذف العناصر أيضًا من الأعلى فقط، تستخدم في لغات البرمجة وجافاسكربت عندما يستدعي تابع تابعًا آخر كالتالي: function A() { B() } function B() { C() } A() فعند كل تنفيذ لتابع ما يضاف استدعاءه إلى المكدس، لذا في المثال السابق وخلال تنفيذ التابع C يكون المكدس يحوي التالي: C <- آخر استدعاء B A وهو يفيد عند انتهاء تنفيذ كل تابع لمعرفة التعليمات الواجب إكمال تنفيذها ضمن التابع الأب، يمكنك الاستفادة من قراءة فقرة "مكدس الاستدعاء" من المقال التالي:
  18. نعم أحسنت لقد حصرت المشكلة، تأكد من إرفاق تنسيقات CSS للمكتبة ضمن ملف جافاسكربت في حال كنت تستخدم محزم مثل webpack كالتالي: import 'swiper/css'; import 'swiper/css/navigation'; import 'swiper/css/pagination';
  19. هل عاينت هيكلية العناصر ضمن الصفحة بعد اكتمال تحميلها، قد تكون دوائر التنقل موجودة وظاهرة لكن لها لون مماثل للخلفية ما يجعلها غير مرئية، أيضًا تأكد من تحميل شيفرات جافاسكربت ضمن الصفحة بشكل سليم عبر إضافة رسالة تطبعها إلى console مثلًا باستخدام console.log، وأمر آخر أن تتأكد من أنك تعاين ضمن الصفحة العنصر صاحب الصنف swiper-pagination، وتتأكد من أنه يحوي على عدة شرائح slides من البيانات وليس واحدة فقط
  20. حاول إضافة الخواص التالية عند تهيئة Swiper واختبر مجددًا: new Swiper(.., { .. observer: true, observeParents: true, })
  21. ركز على الأساسيات بدايةً وتمرن عليها كثيرًا وحاول فهمها، الأساسيات ستتعلمها لمرة واحدة وستستخدمها دومًا مهما كان مجال عملك وتخصصك ضمن اللغة، يمكنك البدء بقراءة المقالات التالية ومتابعة سلسلة مقالات دليل تعلم جافاسكربت بالتدريج: بعد الأساسيات حدد توجهك الأساسي، هل تريد تعلم تطوير الواجهات الأمامية أم الخلفية، وبحسب ذلك يمكنك تحديد الواجهات البرمجية API والمكاتب أو بيئات العمل الواجب عليك تعلمها وابدأ بها أيضًا من الأساسيات، يمكنك الاستفادة من الدليل الشامل التالي لتكون فكرة عامة عن مجالات تطوير الويب: وكلما تعرفت على شيء جديد في اللغة أو إحدى المكاتب حاول الرجوع إلى التوثيق الرسمي لها، أو لتوثيق لغة جافاسكربت في موسوعة حسوب، لا تتشعب في دراسة كل شيء فالمجال واسع ولا ينتهي وليس المطلوب منك حفظ كل شيء، بل على العكس من أهم المهارات التي يجب أن تمتلكها هي البحث والقراءة ضمن المراجع لتعلم استخدام أي شيء جديد، ومع التكرار لاستخدام نفس الأشياء ستحفظها دون الحاجة للرجوع لمراجعها، ركز على التمرين المستمر فهو الأساس، بالتوفيق لك في تعلمك
  22. نعم تمامًا هو مسار الوصول إلى API للتخاطب معها
  23. baseURL تعني رابط الوصول إلى واجهة التطبيقات البرمجية API، ويتألف من اسم النطاق والمسار لها مثال: https://api.domain.com/v1 يمكنك معرفته من التوثيق الرسمي للواجهة API التي تحاولين استخدامها
  24. حاول إعداد ميزة التصفح كالتالي قبل استخدام Swiper على العناصر التي تريدها: import Swiper, { Navigation, Pagination } from 'swiper'; //.. Swiper.use([Navigation, Pagination]); var swiper = new Swiper(...); وتأكد من عدم وجود رسائل خطأ ضمن console، وتأكد أيضًا أن ملف جافاسكربت يتم تحميله في نهاية الصفحة، وذلك حتى تكون العناصر ضمن الصفحة قد تم تحميلها وجهزت وتستطيع التعديل عليها
  25. حاول فتح طرفية جديدة بصلاحية مسؤول أو Run as administrator ونفذ الأمر التالي: Set-ExecutionPolicy RemoteSigned ثم حاول تنفيذ النص البرمجي مجددًا لحل تلك المشكلة
×
×
  • أضف...