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

شرف الدين حفني

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

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

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

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

    2

كل منشورات العضو شرف الدين حفني

  1. بالنسبة للماك أدرس لا يمكن معرفته وذلك لأن جافاسكريبت لا يمكنها الولوج إلى تلك البيانات لأن هذا يُعد ثغرة بالنسبة إلى كلمة سر الراوتر فأيضًا لا يمكن معرفته سواء بالجافاسكريبت أو غيرها لأن تلك المعلومات لا يتم توفيرها مباشرةً
  2. الشفرة جيدة, من الممكن تحسينها عبر وضع بعض الcomments بها لشرح ما تفعله الدوال + عبر تغيير اسامي الدوال ليُصبح إسمها يُعبر عن ما تفعله بالظبط
  3. في كل الأحوال الدالة قصيرة ولن يظهر مشكلة في الكود الخاص بها, بالنسبة لباقي الكود من الممكن وضعه في تعليق حتى نراه بشكلٍ جيد
  4. معنى هذا الخطأ أنك تحاول قراءة الخاصية classList لعنصر غير مُعرف وهذا يحدث بسبب أنك تحاول قراءة العنصر cercles[i-1] وفي أول لفة يكون قيمة i بصفر وبالتالي i-1 يساوي -1 وبالتالي يُعطيك غير معرف, قم بوضع شرط أن يتأكد أن الi أكبر من صفر قبل القيام بتلك العملية عبر الشفرة التالية if(i>0) cercles[i-1].classList.remove("active-cercle")
  5. يمكنك إستخدام الدالة base64_encode الموجودة في لغة php والتي تقوم بإستقبال الملف وإرجاع ناتج التشفير , كالمثال التالي $image = file_get_contents("path/to/my/image.png"); $base64 = base64_encode($image);
  6. مرحبًا مصطفى من الواضح أن telnet معطل لديك برجاء الذهاب إلى لوحة التحكم control panel ومن ثم الإنتقال إلى Programs & features ومن ثم بعدها ستجد على اليسار كلمة Turn Windows features on or off إضغط عليها وإبحث عن كلمة telnet client إضغط عليها ومن ثم قم بالنقر على ok بالتوفيق
  7. بالإضافة إلى إجابة وائل, فإن الدالة querySelectorAll تُعيد نوعًا خاص من القوائم شبيه بالمصفوفة(array) يُدعى NodeList , ذلك النوع مُشابه لل array ولكن يوجد عدة فروق بينهما أهمها أن NodeList لا يمتلك أغلب دوال array المشهورة مثل push, pop, slice, join لتحويل NodeList إلى array يمكنك إستخدام الدالة Array.from كما في المثال التالي elements = document.querySelectorAll('#deck li'); const elements_arr = Array.from(elements);
  8. redux toolkit تُعد نسخة مُبسطة من الredux , على سبيل المثال في redux لتغيير الstate نقوم بكتابة التالي return{ ...state, counter:state.counter+1; } حيث نقوم بإرجاع كائن جديد يحتوي جميع خصائص الstate القديمة مع القيمة الجديدة, بينما في redux toolkit يمكننا فقط إرجاع الخصائص المُعدلة في state وتقوم redux toolkit بشكلٍ أوتوماتيكي بالتعامل مع الأمر return{ counter:state.counter+1; } على سبيل المثال أيضًا الredux-devtools يجب تفعيله في redux const store = createStore( reducer, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__() ); بينما في redux toolkit لا تحتاج أن تقوم بتعريف الredux-devtools حيث يتم إنشاؤها تلقائيًا const store = configureStore( reducer:rootReducer );
  9. مازال jquery إستخدامها موجود, قد يكون قد قلَ بسبب ظهور أطر العمل والمكاتب مثل react js ولكن هذا لا يعني أنها لن يتم إستخدامها, فمازال هناك العديد من مواقع الويب القائمة بالفعل على jquery بالإضافة إلى أن أي مشروع لن يستخدم أطر عمل مثل react أو angular سيكون بالتأكيد من اللازم إستخدام jquery بسبب المميزات والدوال الجاهزة التي تُوفرها والبساطة في معالجة الdom , بوجهٍ عام المكتبة سهل تعلمها لذا يمكنك تعلمها وإستخدامها في المشاريع المناسبة
  10. كما أجاب حسن فإن النمط المضاد هو نمط يخلق مشاكل أو يزيد تعقيد التصميم, ويمكننا تحديد ما كان النمط مفيد أو مضاد عبر بعض النقاط هل النمط يقوم بمخالفة أحد مبادئ solid? (مبدأ المسؤلية الواحدة, مبدأ مفتوح للإمتداد مغلق للتعديل, مبدأ إلإستبدال لليسكوف, مبدأ فصل الواجهة, مبدأ التبعية) إن كان النمط يقوم بمخالفة تلك المبادئ إذًا يمكننا إعتباره مبدأ مضاد هل النمط يقوم بإحداث code smells ؟ بالنسبة لمصطلح code smells هو يُعبر عن بعض المشاكل التي عندما تجدها في الشفرة يُعد ذلك إشارة عن سوء التصميم , بعض علامات الcode smells data clumbs : عندما يكون لدينا مجموعة من المتغيرات يتم تمريرها عادةً سويًا , على سبيل المثال public int doSomeThingWithPoint(int x, int y, int z) تلك الدالة تقوم بإستقبال الإخداثيات الثلاثة الخاصة بنقطة ما ومن ثم تقوم بعملية ما على تلك النقطة, هذا يُعد إشارة لتصميم سيئ, يمكننا تعديل التصميم ونضع المتغيرات الثلاثة في صنف يُعبر عن النقطة كما يتضح public class Point{ public setX(){ //set x} public setY(){ //set y} public setZ(){ //set y} ///getters } data classes : في المثال السابق عالجنا مشكلة الdata clumps ولكن تسببنا في ظهور مشكلة جديدة وهي data classes أي أصناف لا يوجد بها إلا getters , setters لا يوجد بها دوال فعلية, يمكننا معالجة تلك المشكلة عبر نقل دالة doSomeThing إلى الصنف point public class Point{ public setX(){ //set x} public setY(){ //set y} public setZ(){ //set y} ///getters public doSomeThing(){ //do something with point } } shotgun surgery: عندما تقوم بعمل تعديل على دالة ما وتتسبب في جعلك تحتاج تعديل على دوال واماكن اخرى كثيرة غيرها, هذا علامة على التصميم السيئ حيث من علامات التصميم الجيد أن التغيير في أحد الدوال أو الأصناف لا يؤثر على باقي البرنامج: ويمكنك القراءة عن مبادئ SOLID عبر المقالات في هذا الرابط
  11. هل يمكنك إرفاق الشفرة التي تقوم من خلالها بإستدعاء تلك الcomponent?
  12. الخاصية border-radius:50% تجعل الصورة دائرة في حالة فقط كانت الصورة لها نفس العرض ونفس الإرتفاع , عدا ذلك تجعلها شبه دائرية, لتصبح دائرية يجب أن يكون للصورة نفس العرض والإرتفاع, على سبيل المثال يكون عرضها 200بيكسل وإرتفاعها 200 بيكسل, أو أي رقمين متساويين
  13. بالإضافة إلى إجابة حسن , تلك الطريقة ستجعلك تحذف جميع الملفات الظاهرة, لحذف الملفات المخفية يمكنك كتابة نفس الشفرة البرمجية مع إضافة علامة {,.} لتصبح كالتالي <?php $files = glob('path/to/all_images/{,.}*'); // جميع الملفات ضمن ذلك الملف foreach($files as $file){ unlink($file); // حذف الملف }
  14. من المفترض عندما يكون queue ممتلئ , يقوم الproducer بالإنتظار حتى يتم تفريغ بعض البيانات منه, وعندما يكون فارغًا ينتظر الconsumer حتى يتم إضافة بيانات فيه, ولكن يمكنك تنفيذ كل ذلك تلقائيًا عبر إستخدام الصنف BlockingQueue والذي يُوفر التكنيك الذي تم ذكره بشكلٍ أوتوماتيكي ويمكن توضيح الأمر عبر المثال التالي class Producer implements Runnable { protected BlockingQueue<Object> queue; Producer(BlockingQueue<Object> theQueue) { this.queue = theQueue; } public void run() { try { while (true) { Object data = readData(); queue.put(justProduced); } } catch (InterruptedException ex) { System.out.println("Producer INTERRUPTED"); } } } إن لاحظت فلم نقوم هنا بوضع أي شروط للتأكد من أن الqueue ليس متتلئ, وذلك لأن عند محاولة نداء الدالة put في حالة إمتلاء الqueue سيتم إرغام الthread على الإنتظار حتى يتوفر مساحة في queue وبعدها يتم تنفيذ الدالة put وذلك مثال على الconsumer class Consumer implements Runnable { protected BlockingQueue<Object> queue; Consumer(BlockingQueue<Object> theQueue) { this.queue = theQueue; } public void run() { try { while (true) { Object obj = queue.take(); } } catch (InterruptedException ex) { System.out.println("CONSUMER INTERRUPTED"); } } } إن لاحظت أيضًا هنا لم نقم بوضع شروط عن ما إذا كان الqueue فارغ وذلك لأن بالمثل عند نداء الدالة get في حالة الqueue الفارغ يتم إرغام الthread على الإنتظار حتى يتم وضع بيانات في الqueue
  15. يخبرك السؤال بأن تسمح للمستخدم بإدخال الارقام وطباعة إن كان الرقم فرديًا أم زوجيًا , ويتم إستقبال الأرقام من المُستخدم بشكلٍ مستمر حتى يقوم بكتابة -1 وقتها يتم الخروج من البرنامج
  16. يبدو أنك قد نسيت إرفاق الملف. + أرجو بدلًا من وضع الملف وضع الشفرة البرمجية في تعليق
  17. خاصية inline-block تقوم بجعل العنصر inline بمعنى أنه لا يأخذ سطر جديد ولكن في نفس الوقت يأخذ خواص الblock مثل العرض والإرتفاع, حيث أن العناصر الinline يكون عرضها بقدر المحتوى بداخلها ولا يمكن وضع إرتفاع لها , عند إعطاء عنصر الخاصية inline-block يمكنك إعطاء خواص طول وإرتفاع للعنصر , إن كنت لا تحتاج مثل تلك المميزات بالتالي يمكنك إزالة الخاصية بدون مشاكل
  18. برجاء إرفاق الشفرة البرمجية التي يوجد بها المشكلة في تعليق حتى نتمكن من معاينتها
  19. برجاء وضع الشفرة البرمجية التي فيها مشكلة في تعليق بدلًا من إرفاق الملفات
  20. من الأفضل أن تتابع دورة الجافاسكريبت حتى تزيد مهاراتك وخبرتك في جافاسكريبت والتي تستخدمها بشكل مباشر في برمجة تطبيقات الجوال, بالإضافة إلى أنك ستأخذ خبرة في مواضيع أخرى غير الionic مثل react native التي هي من التقنيات الحديثة أيضًا في برمجة تطبيقات الجوال
  21. لقد تم حذف الدورة ونقل بعض مساراتها إلى دورة تطوير التطبيقات بإستخدام الجافاسكريبت
  22. هل يمكن وصف المشكلة بشكلٍ أكبر؟
  23. هل يمكنك توضيح ما الأخطاء التي تظهر لك؟
  24. لا يوجد طريقة ثابتة لحساب التعقيد الوقتي, حيث أنه يتم إثباته أكثر مما يتم حسابه ولكن بوجهٍ عام التعقيد الوقتي هو كمية التعليمات التي يتم تنفيذها في الخوارزمية بالنسبة إلى عدد العناصر يوجد بعض النقاط التي يمكننا إتباعها عند محاولتنا لتحليل الخوارزمية بغرض إيجاد التعقيد الوقتي يمكننا تحويل الحلقات التكرارية من رقم ثابت إلى n إلى مجموع حسابي summation, على سبيل المثال يمكننا تحويل for(int i=a;i<n;i++) doSomeCalculation(); إلى summation من a حيث a عدد ثابت إلى n ,والتي تساوي (n-a)*c حيث c أيضًا عدد ثابت وبالتالي يمكننا إختزال الثوابت ليصبح التعقيد الوقتي على شاكلة O(n) إن كانت الحلفة التكرارية تزيد بمقدار ضرب أو قسمة وليس جمع أو طرح على سبيل المثال for(int i = a; i<n; i*=2) doSomeThing(); يكون هنا الsummation من a إلى log2n وبالتالي يصبح التعقيد الوقتي O(n) إن كان لدينا أكثر من حلقة تكرارية نقوم بفك الحلقة الداخلية ثم الأكبر ثم الأكبر , على سبيل المثال for(int i=0;i<n;i++) for(int j=0;j<n;j++) doSomeThing(); نقوم بفك الحلقة الداخلية التي تعطينا n والخارجية التي تعطينا n*n = n^2 ويصبح بالتالي التعقيد O(n^2) في حالة ظهور recursion نقوم بتحويله إلى حلقة تكرارية وتطبيق السابق عليه
×
×
  • أضف...