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

Kais Hasan

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

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

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

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

    24

كل منشورات العضو Kais Hasan

  1. إنك لا تقوم باختبار فيما إذا كان ال head يشير إلى ال NULL، يحدث أول خطأ في هذا المقطع: void swapFirstLast() { node *temp = head; int value = head->data; // هنا الخطأ while(temp!=NULL) { if(temp->next == NULL) { head->data = temp->data ; temp->data = value; } temp = temp->next; } }; يجب عليك دائما التحقق فيما إذا كان مؤشر ما يشير إلى ال NULL قبل الوصول إلى بياناته. بالإضافة إلى ذلك يجب عليك استعمال nullptr فقط بدل من NULL لأن هذا الموصى به، أو على الأقل لا تخلط بينهما في الاستعمال.
  2. في حال كنت على علم بإحدى لغات البرمجة و تقوم بالإنتقال لتعلم لغة جديدة و تريد معرفة أهم المكتبات، فإنه من المفترض أنك كتبت برامج في تلك اللغة و احتجت إلى وظائف معينة تؤديها لك تلك اللغة، على سبيل المثال التعامل مع الملفات على القرص الصلب، و بالتالي تقوم بالبحث عن ما يؤدي تلك المهمة في تلك اللغة. في حال لم تكن على علم بأي لغة فإنه من المفيد أن تقوم بأخذ دورة تتعلق بتلك اللغة، حيث أن الدورات بشكل عام تحتوي على أهم المكتبات الضرورية للعمل باللغة، يمكنك مثلاً الإطلاع على دورات حسوب من هنا. كما يمكنك أن تقوم بالبحث في مواقع الأسئلة و فلترة النتائج حسب اللغة التي تريدها و بالتالي يمكنك أن ترى ما الذي يقوم المبرمجون الآخرون بالسؤال عنه و بالتالي معرفة بعض المكتبات المهمة.
  3. لا علاقة لل version control بتكامل المكتبات، حيث أنها كما يوحي اسمها تقوم بأرشفة الكود و تخزين نسخ منه في لحظات زمنية معينة. لفهم فائدتها بشكل أساسي من ناحية تخزين النسخ، لنفترض أنه لدينا كود لموقع يعمل و نريد التعديل عليه، من غير المحبذ التعديل مباشرة على الكود الرئيسي، حيث أننا قد نفقد القدرة على إعادته إلى شكله الأساسي (قد ننسى ما قمنا بالقيام به)، و بالتالي بإمكاننا باستعمال ال version control القيام بإنشاء ما يسمى بالفرع، و هو نسخة عن الكود الأساسي، يمكننا التعديل فيه بدون التأثير على الكود الأساسي، و عندما نتأكد من أن تعديلاتنا صحيحة و تعمل بشكل صحيح يمكننا إعادة دمج هذا الفرع بالكود الأساسي لإضافة التعديلات إليه. بالطبع يمكن لأكثر من شخص استعماله في نفس الوقت، و هو يعتبر وسيلة أساسية لتنظيم العمل، حيث أنه مثلاً لدينا ال git و هو version control يمكننا استعماله للقيام بكافة العمليات التي نريدها، و حتى يمكننا التواصل مع الآخرين يجب أن تكون هناك نسخة موجودة على سيرفر خارجي حتى يستطيع الآخرون رؤيتها، مثلاً يمكن استعمال github لذلك، بالطبع توجد بروتوكولات معينة للعمل لضمان عدم التعارض بين ما تقوم بتعديله و ما يقوم شخص آخر بتعديله.
  4. لا توجد واحدة منهما أفضل من الأخرى في كل شيء، كل منهما له محاسنه و مساوئه و يجب علينا معرفتها و من ثم معرفة متطلبات التطبيق الذي نريد بناءه حتى نعرف ما الذي يجب علينا استعماله. ال SQL تستطيع أن تستعلم بشكل مهيكل بينما ال nosql ليست كذلك، و بالتالي في حال كان هناك هيكلية معينة للبيانات فستكون ال sql أفضل. يمكنك بسهولة توسعة ال nosql من ناحية ال attributes فهي ديناميكية أكثر من ال sql، و بالتالي في حال كان لديك تطبيق فيه كيانات ستتغير بشكل كثير فيفضل استعمال ال nosql. هذه هي الميزات الأساسية لكل منهما و التي يجب أن تكون كافية لتحديد ما الذي تريده.
  5. ما الذي قمت بتجريبه و لم ينجح؟ لا يجب علينا إعطاءك الحل مباشرة فعندها لن تتحسن في اللغة. في حالك حدث خطأ و لم تستطع معرفة لماذا يمكنك السؤال عنه، و لكن عليك المحاولة.
  6. يمكنك حل المشكلة عن طريق تحديد حجم الذاكرة المسموح باستعماله، مثلاً كما يلي: ini_set('memory_limit', '64M'); حيث نقوم بذلك في بداية الكود.
  7. مرحباً يوسف، هل هذا السؤال يخص إحدى الدروس من الدورات؟
  8. يمكن استعمال الإضافة uglifyjs-webpack-plugin و التي يمكن استعمالها بالشكل التالي: const webpack = require("webpack"); const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); module.exports = { // ... optimization: { minimize: true, minimizer: [new UglifyJsPlugin({ include: /\.min\.js$/ })] } }; حيث هنا قمنا بتضمين الإضافة الخاصة بالعملية التي نريدها، ثم قمنا بإضافة خيارات التحسين و التي هي هنا أننا نريد عمل minimize و ذلك باستعمال الإضافة التي قمنا بتضمينها. من أجل ال css يمكن استعمال شيء مشابه كما يلي: const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); module.exports = { module: { ... }, optimization: { minimizer: [ new CssMinimizerPlugin(), ], }, }; و يمكن دمج الطريقتين كما يلي: const webpack = require("webpack"); const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); module.exports = { // ... optimization: { minimize: true, minimizer: [ new UglifyJsPlugin({ include: /\.min\.js$/}), new CssMinimizerPlugin() ] } };
  9. إن الخاصية value تمثل القيمة التي سيتم إرسالها عند القيام ب submit، أي سيتلقاها السيرفر و يعالجها بالطريقة المناسبة، هذا هو الأمر في ال radio-button و ال checkbox. بينما في الأزرار العادية فهي تعرف النص الموجود على الزر، أما في الإدخال النصي فهي تعرف القيمة الأولية الافتراضية للدخل. أما ال name فهي مجرد اسم لهذه القيمة، أي يمكن استعماله لجلب القيمة في السيرفر مثلاً. كأنك تعرفين متحول له name و قيمته هي value.
  10. هناك عدة أنماط من الموصلات أشهرها: نقطة لنقطة و الذي كما يوحيه الاسم، يعبر عن اتصال مباشر بين طرفيتين. البث، و الذي يعبر عن ربط بين نقطتين أو أكثر مع السماح لنقطة بالإرسال إلى جميع النقاط. متعدد النقاط، يشبه البث من ناحية أنه يربط عدة نقاط مع بعضها البعض، و لكن هنا لا توجد طريقة لإرسال إلى الجميع، حيث يتوجب إرسال الرسالة إلى كل نقطة على حدا. فيما يخص الشبكات، أيضاً يوجد العديد من الأنواع أشهرها: شبكة المنطقة الشخصية PAN و هي تعتبر شبكة ضيقة النطاق جداً لتشمل محيط العمل الخاص بشخص ما، مثلاً عندما تريد ربط الموبايل باللابتوب أو عند ربط الموبايل بجهاز تكبير صوت عن طريق البلوتوث. شبكة المنطقة المحلية LAN و هي تعتبر ضيقة النطاق أيضاً و لكن أوسع من الشبكة السابقة، يمكن ربط عدة أجهزة عن طريقها و التقنيات الأساسية المستعملة هي ال WiFi و ال Ethernet، يمكنك رؤية هكذا شبكات في الشركات الصغيرة، حيث يمكن ربط أجهزة العمل عبرها. شبكة المنطقة الواسعة WAN و هي شبكة واسعة النطاق بشكل كبير لتشمل مناطق جغرافية متباعدة جداً، أهم مثال على هذه الشبكة هو الانترنيت.
  11. إن المقارنة بينهم غير ممكنة، حيث أن الاختصاصات التي يختص بها كل من الذي ذكرته يختلف بعض الشيء عن الآخر، سأقوم بشرح مبسط عن كل واحدة حتى يمكنك فهم الموضوع بشكل أفضل: bootstrap هو فريم وورك مفتوحة المصدر لل css موجهة للعمل من أجل المواقع التي تؤمن واجهة مستخدم تفاعلية و مصممة للعمل على أجهزة الموبايل. jquery هي مكتبة جافا سكربت صممت لتسهل التعامل و الوصول إلى العناصر في ال html dom بالإضافة إلى معالجة الأحداث و التحريك باستعمال ال css و ال ajax. sass هي عبارة عن لغة scripting تقوم بالمعالجة المسبقة لإنشاء ملفات css . gulp هو مجموعة أدوات في الجافا سكربت و التي تستعمل للقيام بعمليات بناء المشروع بمختلف مراحلها في تطبيقات واجهة المستخدم. react هي مكتبة لتطوير واجهة المستخدم مبنية بالجافا سكربت و هي مفتوحة المصدر تعتمد على مكونات واجهة المستخدم في عملها. angular هي فريم وورك تعتمد على ال TypeScript مفتوحة المصدر و تستعمل لتطوير واجهة التطبيقات. vue هي فريم وورك مبنية بالجافا سكربت و تعتمد على نموذج model–view–viewmodel و تستعمل لتطوير تطبيقات واجهة المستخدم و هي مفتوحة المصدر.
  12. من فضلك هل يمكنك إرفاق صور توضح المشكلة؟ بذلك نستطيع مساعدتك بشكل أكبر و أدق.
  13. جرب إضافة ما يلي أيضاً: -moz-transition: transform 2s ease-in-out; transition: transform 2s ease-in-out; تعديل: كما يجب عليك أن تضع scale لل opacity.
  14. في قواعد ال css، نفس القواعد التي أرفقتها أنت في الصورة، أضف إليها هذه القاعدة.
  15. عليك القيام بذلك بشكل تدريجي، أنت تقوم بذلك بشكل مباشر. جرب إضافة ما يلي: -webkit-transition: transform 2s ease-in-out;
  16. يمكنك مثلاً عند عملية الحذف أن تقوم بتصغير الذي يحوي على المهمة التي يتم حذفها و ذلك تدريجياً، فيظهر لك إحساس بأنها ترتفع بشكل تدريجي و ليس بشكل مباشر. أي أنك في عملية الحذف يتم استدعاء تابع يقوم بالحذف مع ال animation الذي يظهر في الفيديو الخاص بك، في نفس هذا التابع يمكنك بدل ان تحذف المكون بشكل مباشر ( و الذي سيؤدي إلى ارتفاع مباشر للمهمة التي في الأسفل) أن تقوم بتصغير حجم المكون الذي يحويه بشكل تدريجي مما سيؤدي إلى المطلوب. يوجد طرق عديدة أخرى و لكن الطريقة التي تحدثت عنها عامة بغض النظر عما تقوم باستعماله.
  17. توجد الحزمة django-subdomains، حيث يمكنها القيام بما تريد. لتنزيل هذه الحزمة نقوم بتنفيذ التعليمة: pip install django-subdomains لجعل هذه المكتبة تعمل يجب ضبط بعض الإعدادات كما يلي: إضافة الطبقة الوسطية middleware الخاصة بهذه المكتبة ضمن الملف settings في القائمة الخاصة بالطبقات الوسطية، و ذلك بالاسم التالي: subdomains.middleware.SubdomainURLRoutingMiddleware و يجب أن تأتي هذه الطبقة قبل طبقة ال CommonMiddleware في حال وجدت. ضبط إعدادات SUBDOMAIN_URLCONFS في ملف ال settings. التأكد من أن SITE_ID قد تم تعريفه و أن الخاصية Site.domain لذلك الموقع تتعلق باسم الدومين الذي سيقوم المستخدمون بالوصول للموقع من خلاله. إذا أردت استعمال ذلك في ال template مع التاغ {% url %} فيجب وضع subdomains في قائمة التطبيقات في ال settings. مثال على إعدادات لذلك: ROOT_URLCONF = 'myproject.urls.account' # في هذا القاموس إن المفتاح يمثل الدومين الفرعي SUBDOMAIN_URLCONFS = { None: 'myproject.urls.frontend', # هنا لا يوجد دومين فرعي 'www': 'myproject.urls.frontend', 'api': 'myproject.urls.api', }
  18. يمكنك استعمال الخاصية border-radius للقيام بتغيير شكل الصندوق، عند قيمة معينة لهذه الخاصية سيصبح الشكل دائري، يمكنك تجريب القيم حتى الحصول على الشكل المطلوب، حيث أنه بتغيير القيمة تصبح الحواف أنعم و عند قيمة معينة سيصبح الشكل دائري. يمكنك استعمال الخاصية accent-color لتغيير اللون، كمثال على ذلك: #cb1 { accent-color: #ffffff; } يوجد أيضاً الكثير من الأشكال الجاهزة التي يمكنك استعمالها و التي قام مطورون آخرون بتطويرها، و يمكنك إيجادهم هنا.
  19. ما الذي تحاولين تثبيته من خلال الأمر التالي: pip install virtualenv ؟ إن هذا الأمر يقوم بتثبيت أداة تسمح لك بإنشاء بيئات افتراضية و لكن المشكلة هنا أنه لا يرى ال django، هل كنتي تستعملين بيئة افتراضية من قبل؟ و هل يمكنك مشاركة الكود الخاص بالمشروع أو على أقل تقدير الملف الخاص بالبيئة في حال وجوده؟
  20. في حال وجدت طريقة للقيام بإيجاد روابط المواقع فإن ذلك يعني أنك استطعت الحصول على عدد من المقاطع المشفرة و ما يقابلها من المقاطع بعد فك تشفيرها، و هذا سيجعل هناك نقطة ضعف في التشفير. فبالتالي من غير المنطقي وجود هكذا أمر، في حال كان الكود يخصك و تمتلك مفتاح فك التشفير فإن ذلك ممكن، حتى من دون فك التشفير بشكل مباشر، حيث أن فك التشفير و تخزين الكود بشكل غير مشفر قد يسبب مشاكل أمنية، هناك طرق تقوم بالتعامل مع الكود المشفر بشكل مباشر و لكنها طرق معقدة و قد لا تنجح مع جميع خوارزميات التشفير و جميع المعدات الحاسوبية.
  21. من أفضل المواقع التي تعتبر جيدة للبداية حيث أنها سهلة نسبياً هي: HackerRank HackerEarth أنصحك بقضاء بعض الوقت عليهما و لكن الانتقال بعدها إلى مواقع أفضل، حالياً أفضل موقعين في هذا المجال هما: CodeForces AtCoder في هذين الموقعين يمكنك ترتيب المسائل حسب الصعوبة كما يمكنك فرز المسائل حسب نمط المسألة، و هناك الكثير من الأنماط مثل graph theory, greedy, dynamic programming, math و الكثير من المواضيع الأخرى، كما يوفر موقع codeforces الكثير من المحتوى التعليمي في قسم Edu ضمن الموقع، حيث أنه يعطيك بعض المعلومات عن طريق فيديوهات ثم يعطيك مجموعة من المسائل مرتبطة بالمحتوى المقدم. كما أن كل مسألة في codeforces لها شرح مرافق لحلها في حال لم تستطع حلها بمفردك.
  22. إن المعرفة الجيدة بأنظمة التشغيل هو شيء ضروري ﻷي مطور محترف خاصة ال backend، حيث أنك ستحتاج إلى معرفة كيفية التعامل مع السيرفر و الذي في الغالب يكون linux و ستستعمل سطر الأوامر لذلك، بالإضافة إلى المشاكل التي ستواجهك و التي لها علاقة مثلاً بإعدادات الأمان و ما إلى هنالك. سأعطيك مثال عن ذلك من تجربة شخصية لي لكي تتوضح أهمية هذه الأمور، لقد قمت من فترة ببناء موقع و أردت رفعه على أمازون، إن كافة العمليات التي ستقوم بها ستكون عبر سطر الأوامر من عمليات الرفع إلى عمليات التشغيل و ما إلى هنالك، بالإضافة إذا أردت جدولة مهمة ما أيضاً. بالإضافة عند تعاملك مع الملفات على سبيل المثال، قد تحدث الكثير من الأخطاء التي لها علاقة بأنظمة التشغيل و التي بدون معرفة بذلك سيكون من الصعب حلها. أضف إلى ما سبق أنه في حال أردت التعامل مع توابع يتم تنفيذها على التفرع فإن هذه المعرفة أيضاً ستساعدك.
  23. في لغة جافا يتم التمرير دائماً بالقيمة، أي أن نسخة من البيانات هي التي يتم تمريرها، لكن ما الذي يتم تمريره هو الذي يجعل فكرة التعديل ممكنة. حيث أنه في جافا عند التعامل مع متحول يحتوي على كائن فإننا فعلياً نتعامل مع ما يسمى object-handler و هو مثل مرجع للغرض، أي أن المتحول بحد ذاته يحمل قيمة مرجع للغرض، و بالتالي عند تمريره بالقيمة سنمرر قيمته و التي هي بحد ذاتها مرجع للغرض. و هذا ما يسمح لنا بالتعديل على الغرض في تابع ما، و لكن لا يمكننا إعادة إسناد المتحول مثل التمرير العادي بالمرجع، حيث أن إعادة الإسناد سوف تعطي قيمة أخرى للمرجع و بالتالي سنصبح نتعامل مع كائن آخر. باختصار يمكنك تغيير القيمة باستعمال توابع الكائن، و لكن لا يمكنك تغيير ما يؤشر إليه الكائن الذي قمت بتمريره، أي أنه سيبقى يحوي على نفس الكائن و لكن يمكن تغيير خصائصه.
  24. يمكنك حماية الفيديوهات من السرقة (عن طريق تنزيل الفيديو أو نسخه أو تسجيل فيديو للشاشة) عن طريق استعمال إحدى إضافات ال wordpress و هي CopySafe Video Protection بعض ميزات هذه الإضافة هي: سهلة التنزيل و الاستخدام. يمكنك تضمين الفيديوهات بشكل ديناميكي باستعمال الجافاسكريبت. يمكنك تشفير الفيديوهات. تمنع حفظ أو عرض الفيديو في مكان آخر غير موقعك. تمنع تسجيل لقطات للشاشة عند عرض الفيديو (حيث أنه بإمكان أحدهم أن يقوم بتشغيل الفيديو و تسجيل الشاشة الخاصة به، و لكن هذه الإضافة تحميك من ذلك). يمكنك إضافة علامة مائية على الفيديوهات الخاصة بك.
  25. بعض الميزات التي توضح الفرق بين الطريقتين: من أجل fetch: لا يوجد بها طريقة مضمنة للتعامل مع الوثائق. لا توجد طريقة لكي نضع مؤقت. لا يمكن تعديل نوع المحتوى في ترويسة الاستجابة. إذا كان طول المحتوى متوافر و لكن مخفي فإنه من غير الممكن معرفة طول جسم الاستجابة. سوف تقوم باستدعاء ال handler المسؤول عن إجهاض الإشارة حتى لو أن الطلب قد تم بنجاح. لا يوجد مؤشر للتقدم في عملية رفع الملفات. من أجل XHR: لا يوجد طريقة لعدم إرسال ال cookies بشكل قياسي. لا يمكنها أن تعيد أغراض من FormData. لا تحتوي على مكافئ لنمط no-cors الموجود في fetch. دائماً تتبع إعادة التوجيه redirect.
×
×
  • أضف...