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

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

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

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

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

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

    2

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

  1. أنت محق ليس من المنطقي أن نقوم بإنشاء صفحة لكل منتج عادةً ما يحدث أننا نقوم بإستخدام أحد تقنيات تطوير الواجهات الخلفية back-end لنقوم بإنشاء قاعدة بيانات ويتم وضع فيها جميع المنتجات لدينا ومن ثم نقوم بإنشاء api وهي عبارة عن طريقة للتخاطب بين الواجهة الخلفية والواجهة الأمامية, ونقوم بإنشاء صفحة واحدة للمنتج ونقوم بإستخدام جافاسكريبت بجلب البيانات من الواجهة الخلفية إلى الواجهة الأمامية بشكل ديناميكي حسب عنوان الurl المطلوب, على سبيل المثال إن كان عنوان الurl http://store/product/1 نقوم بجلب بيانات المنتج ذو المُعرف 1 إلى الصفحة , إن كان العنوان http://store/product/2 نقوم بجلب بيانات المنتج ذو المُعرف 2, أي نقوم بإنشاء صفحة واحدة للمنتج ونقوم بجلب المنتج بشكلٍ ديناميكي من الواجهة الخلفية
  2. يمكنك تنفيذ ذلك عبر إستخدام ميديا كويري media query وهي عبارة عن تنسيقات بالcss يتم تنفيذها عندما يكون للشاشة مقاسًا معينًا , على سبيل المثال /* For desktop: */ .col-1 {width: 8.33%;} .col-2 {width: 16.66%;} .col-3 {width: 25%;} .col-4 {width: 33.33%;} .col-5 {width: 41.66%;} .col-6 {width: 50%;} .col-7 {width: 58.33%;} .col-8 {width: 66.66%;} .col-9 {width: 75%;} .col-10 {width: 83.33%;} .col-11 {width: 91.66%;} .col-12 {width: 100%;} @media only screen and (max-width: 768px) { /* For mobile phones: */ [class*="col-"] { width: 100%; } } تقوم الشفرة بالأعلى بتقسيم الشاشة إلى 12 عمود, لذا يمكن وجود عنصرين من الصنف col-6 في نفس المستوي الأفقي, أو ثلاث عناصر من الصنف col-4 , بينما عندما تصل الشاشة إلى العرض 768 يُصبح كل عنصر في سطر وحده حتى تتناسب مع الشاشات الصغيرة
  3. يمكنك تنفيذ المطلوب بالخطوات التالية إستخدام دالة some والتي تقوم بإرجاع true إن كانت تحتوي على القيمة المطلوبة إن قامت الدالة بإرجاع false يعني أن القيمة غير موجودة بالتالي نقوم بإضافتها ويمكن توضيح ذلك عبر الشفرة البرمجية القادمة const isExist = arr.some(el => el.id === new_element.id); if (!found) arr.push(new_element);
  4. هذا لأن class من النوع reference type بينما struct من النوع value type ما الفرق بينهما؟ لنفهم الفرق نحتاج أولًا أن نفهم أنه يوجد ما يُسمى بالstack memory وال heap memory , الstack memory تمتلك مساحة أقل ولكنها أسرع في الوصول, بينما الheap memory تمتلك مساحة أكبر ولكن أبطأ في الوصول الstruct بما أنه value type لذا يتم تخزينه في الstack, فيتم الوصول إليه بشكلٍ سريع, ولكن إن كان حجمه كبير سيتسبب ذلك بمشاكل لأن مساحة الstack محدودة وبالتالي قد يتسبب ذلك في خطأ يُسمى stack over flow يحدث عندما يتم ملأ الstack بينما الclass بما أنه من النوع reference type فلا يتم تخزينه في الstack وإنما يتم تخزينه في الheap ويتم تخزين عنوانه في الstack وذلك العنوان يكون مساحته صغيرة نسبيًا 4bytes , لذا يُفضل تخزين البيانات كبير الحجم في الclass حتى لا يتسبب ذلك بمشكلة stack over flow
  5. تلك العلامة تُسمى compliment bitwise ,ما معنى ذلك؟ إن إفترضنا لدينا الرقم الثنائي 0110110 فإن الcompliment يقوم بتحويل جميع الأصفار إلى أحاد وجميع الأحاد إلى أصفار فيصبح الرقم 1001001 يمكن تطبيق ذلك بنفس الطريقة على الأرقام العشرية إن إفترضنا قمنا بكتابة الشفرة التالية int number = 16; int result = ~number; الرقم 16 في النظام الثنائي يساوي 10000 , إن قمنا بإستخدام المعامل ~ سيتم تحويله إلى 01111 أي يصبح المتغير result يساوي 15
  6. مرحبًا احمد من اين مصدر هذا السطر؟ هل هذا سطر في شفرة برمجية؟ إن كانت الإجابة بنعم برجاء تحديد اللغة
  7. php تتميز بشهرتها الواسعة وإنتشارها مما يؤدي إلى فرص عمل أكبر بالphp ومجتمع أكبر في حالة واجهتك مشكلة أثناء التعلم سيكون الدعم في php أكبر من نظيره في node js
  8. النص بالفعل موضوع في منتصف ال.content المشكلة نفسها أن ال.content غير موضوعة في المنتصف, يمكنك زيادة العرض إلى 100% وحينها سيصبح الكلام النصي في منتصف الصفحة أو يمكنك إستخدام flex-box وإعطاء الصنف الأعلى من ال.content الخاصية display:flex ومن ثم عمل justify-content:center للصنف الأعلى ووقتها سيصبح الكلام في المنتصف إن لم تفلح معك الحلول بالأعلى برجاء نسخ الشفرة البرمجية لصفحة الhtml ولصقها في تعليق
  9. لكل تقنية مميزاتها ولكن صحيح من ضمن مميزات نود أن من السهل تعلمها أو كما قلت أنت طريقها أقصر نسبيًا, ونود تعمل مع جميع قواعد البيانات لا يوجد مشكلة
  10. النود ليست إطار عمل للجافاسكريبت وإنما هي بيئة عمل للجافا سكريبت ما المقصود ببيئة عمل؟ في العادي لا يمكن تشغيل شفرات الجافاسكريبت خارج المتصفح, حيث أن لغة جافاسكريبت تعمل على المتصفحات فقط , بيئة عمل نود تقوم بتوفير المكاتب اللازمة والأدوات اللازمة من خلال ما يُعرف بمحرك v8 وهو الذي يقوم بتشغيل شفرة الجافاسكريبت خارج المتصفح سواء كان على الحاسب الشخصي لإنشاء تطبيقات سطح مكتب أو على الخوادم لبرمجة الواجهات الخلفية
  11. مبدأ open-closed أو (مفتوح للإمتداد - مغلق للتعديل) هو ثاني مبدأ من مبادي SOLID وهي المبادئ الخمسة الأساسية لتصميم نظام كائني التوجه بشكلٍ سليم, لنفهم المبدأ من خلال المثال التالي: نفترض أن لدينا واجهة تُسمى Shape ويقوم بعمل implement لها أصناف مثل Square, Circle ولدينا صنف يُسمى AreaCalculator يحتوي على دالة تُسمى sum مسؤلة عن أخذ مجموعة من الأشكال وحساب مساحتها كما يتضح لنا في الشفرة التالية interface ShapeInterface { public function area(); } class Square implements ShapeInterface { public int length; public function Square(int length) { this.length = length; } public function area() { return Math.pow(this.length, 2); } } class Circle implements ShapeInterface { public int radius; public function Circle(int radius) { this.radius = radius; } public function area() { return Math.pow(this.length, 2); } } class AreaCalculator { protected ShapeInterface[] shapes; public function AreaCalculator() { this.shapes = []; } public function sum() { foreach (this.shapes : shape) { if (shape instanceof Square) { area+ = Math.pow(shape.length, 2); } elseif (shape instanceof Circle) { area+ = Math.pi * Math.pow(shape.radius, 2); } } return area; } } الأن لدينا مشكلة في تلك الشفرة, إن أردنا مثلًا إضافة شكل أخر مثل المثلث أو المستطيل أو أي شكل سنحتاج إلى الرجوع والتعديل مرة أخرى في الدالة sum وهذا سيؤدي إلى شفرة برمجية أكثر تعقيدًا وأكثر عرضة للأخطاء, لذا من الأفضل أن نجعل دالة المساحة موجودة في الأصناف المتوارثة من ShapeInterface وتقوم الدالة sum بنداء الدالة المسؤلة عن المساحة مباشرةً ليُصبح الشكل النهائي لشفرتنا كالتالي interface ShapeInterface { public function area(); } class Square implements ShapeInterface { public int length; public function Square(int length) { this.length = length; } public function area() { return Math.pow(this.length, 2); } } class Circle implements ShapeInterface { public int radius; public function Circle(int radius) { this.radius = radius; } public function area() { return Math.pow(this.length, 2); } } class AreaCalculator { protected ShapeInterface[] shapes; public function AreaCalculator() { this.shapes = []; } public function sum() { foreach (this.shapes : shape) { area+=shape.area(); } return area; } }
  12. إختيار اللغة لن يؤثر بشكلٍ كبير على أداء التطبيق حيث يوجد عوامل أهم يجب أخذها في الحسبان الإستعلامات التي يتم إستخدامها في قاعدة البيانات, فإن قاعدة البيانات من أكبر مشاكل الأداء فيجب تنفيذ إستعلامات سريعة كثرة الإستعلامات إلى قاعدة البيانات كثرة البيانات الغير مفيدة والتي يمكن الإستغناء عنها كثرة الطلبات التي تقوم بها الصفحة, كلما زادت الطلبات التي ترسلها الصفحة في نفس ذات الوقت أثر على أداء التطبيق حجم الملفات , حاول بقدر المستطاع ضغط الصور والملفات بوجهٍ عام حتى يقل حجم البيانات التي يستقبلها العميل تخزين البيانات في هياكل بيانات مناسبة عدم القيام بأي عمليات حسابية حساسة عند العميل وإستبدالها عند الخادم
  13. برجاء وضع الشفرة البرمجية التي تظهر بها المشكلة في تعليق بدلًا من إرفاق المشروع حتى يكون من السهل توفير إجابة على سؤالك
  14. بالإضافة إلى المقالات والأسئلة التي أشار إليها أسامة يوجد أيضًا موسوعة حسوب, وهي موسوعة غنية بالمعلومات والتوثيقات عن مختلف التقنيات واللغات البرمجية ستلاحظ عند دخولك إلى الموسوعة أن المواضيع مقسمة حسب اللغة أو التقنية, ويوجد خانة إدخال البحث, من خلالها يمكنك كتابة ما تبحث عنه وستظهر لك مواضيع ذات علاقة بموضوع البحث, على سبيل المثال إن أردت قراءة التوثيق الخاص بالتابع promise.all يمكنك كتابة promise.all في خانة البحث وستظهر لك في النتائج التوثيقات المتعلقة بتلك الكلمة البحثية, ويمكنك تصفح الموسوعة عبر النقر هنا
  15. لكلٍ منهما مميزاته وعيوبه وحالات يُفضل الإستخدام فيها بالنسبة للeager loading ميزته أنك لا تحتاج لعمل أكثر من إستعلامة لقاعدة البيانات حيث تكتب إستعلامة واحدة تحصل فيها على البيانات جميعها عيبه أن في حالة كان هناك كثير من البيانات من الممكن أن لا تكون تحتاجها كلها وبالتالي ستشغل الذاكرة ببيانات لا فائدة لها ما الحالات التي يُفضل إستخدامه فيها؟ إن إفترضنا وجود علاقة one-to-many نقوم بإستخدام الeager لل many أي إن مثلًا كنا نتعامل مع علاقة مؤلف مع المقالات, وأردنا الحصول على مقالة ما , في تلك الحالة نستخدم الeager loading لنحصل معها على المؤلف بالنسبة للlazy loading ميزته أنه يقوم بجلب عدد قليل من البيانات وبالتالي يشغل مكانًا أقل في الذاكرة وفي حالة إحتجنا لباقي البيانات يمكننا الإتيان بها في وقتٍ أخر عيبه أنه في حالة كان تواجد البيانات الأخرى ضروري وأمر محتوم أننا سنقوم بجلبها فحينئذ سنكون هنا د إضطررنا إلى عمل إستعلامين إلى قاعدة البيانات وكان من الممكن إختصارهما في إستعلامة واحدة الحالات التي يُفضل إستخدامه فيها إن إفترضنا وجود نفس علاقة الone-to-many التي تحدثنا عنها بالأعلى فنقوم بإستخدام الlazy من طرف الone أي إن مثلًا كنا نتعامل مع علاقة المؤلف مع المقالات ولكننا هنا نستعلم عن المؤلف, في تلك الحالة نستخدم الlazy loading حتى لا نحصل على المقالات الخاصة بالمؤلف بل نحصل على المؤلف فقط إلى حين إحتياجنا للمقالات
  16. تلك المشكلة تحدث لك لأنك لا تقوم بتحديد عمر الcookie وبالتالي يتم تحديده بشكلٍ إفتراضي أن تنتهي مع إنتهاء الجلسة, الحل أن تقوم بتزويد الدالة بعمر الcookie كما بالمثال التالي res.cookie('token', 'bla bla', { expires: new Date(Date.now() + 1000*60*60) }) بالمثال الأعلى يكون عمر الcookie ساعة, لأننا نقوم بتزويد تاريخ الإنتهاء بالmillesecond وبالتالي نقوم بكتابة 1000(أي ثانية واحدة) ونضربها في 60(لتصبح دقيقة) ونضربها في 60 لتصبح ساعة
  17. هل يمكنك أن ترينا الشفرة البرمجية التي تحاول من خلالها تخزين الcookies ?
  18. بالإضافة إلى إجابة حسن يمكننا توضيح تعددية الأوجه عبر المثال التالي نفترض أننا أردنا إنشاء دالة تقوم بوظيفة ما على جهاز التحكم remote_control أيًا كان نوع هذا الجهاز سواء كان reciever_remote او tv_remote أو حتى نوع ثالث, وبغض النظر عن الشركة المصنعة لهذا الجهاز على سبيل المثال دالة تقوم بحساب أقصى مدى يستطيع الوصول إليه هذا الجهاز, بدون تعددية الأوجه سنحتاج إلى إنشاء دالة لكل جهاز function getTvRemoteHealth(TV_REMOTE $remote){ echo $remote->getHealth() } function getRecieverRemoteHealth(RECIEVER_REMOTE $remote){ echo $remote->getHealth() } بينما عبر تعددية الأوجه يمكننا كتابة دالة أكثر عمومية كالأتية function getRemoteHealth(remotecontroll $remote){ echo $remote->getHealth() } بما أن جميع أجهزة التحكم تقوم بعمل implement للواجهة البرمجية remotecontrol لذا بالتالي يمكننا كتابة دالة واحدة كالسابقة تقوم بإستقبال كائن من نوع remotecontrol بغض النظر عن صنفه ومن ثم مناداة الدالة الخاصة بالوظيفة التي نريدها أيًا كان نوع جهاز التحكم tv_remote, reciever_remote, etc
  19. الفرق أن الطريقة الأولى مثل التي في المثال const user = await User.findOne({ where: { name: "Sharaf eldeen" } }); const books = await user.getBooks(); عبارة عن lazy loading أي أن يتم أولًا كتابة إستعلام للحصول على المستخدم ومن ثم نقوم في وقتٍ أخر عندما نحتاج الكتب بإرسال إستعلامة أخرى للحصول على الكتب بينما الطريقة الثانية كاللتي في المثال const user = await User.findOne({ where: { name: "sharaf" }, include: Book }); عبارة عن Eager loading أي يتم كتابة إستعلامة واحدة فقط من خلالها نحصل على كلٍ من المُستخدم والكتب الخاصة به عن طريق الربط بإستعلامة join فلا نحتاج إلا إلى إستعلامة واحدة فقط
  20. لمعرفة عدد الخانات في عددٍ ما في لغة جافا يوجد عدة طرق مثلًأ تحويل العدد إلى نص من خلال الدالة String.valueOf ومن ثم الحصول على طول النص كما يظهر لنا في المثال int length = String.valueOf(number).length(); أخذ لوغاريتم العدد للأساس عشرة مع إضافة 1 , فإن كان مثلًا العدد 5520 , فإن اللوغاريتم للأساس عشرة بعد التقريب سيكون 3, نضيف 1 يصبح 4 وهو عدد الخانات int length = (int) (Math.log10(number) + 1); بالنسبة لتمثيل الأعداد فيمكنك تمثيلها في مصفوفة أو قائمة حسب الرغبة, المصفوفة أسرع في الوصول بينما القائمة تمكنك من إضافة العناصر دون تحديد الطول, حيث في المصفوفة تكون محكومًا بطول المصفوفة فإن إفترضنا المصفوفة طولها 5 لا يمكنك إضافة أكثر من 5 عناصر, بينما القائمة غير محكومة بطولٍ معين ولكنها على الجانب الأخر أبطأ من المصفوفة
  21. بالنسبة لل triggers يمكنك إنشاؤها من خلال طريقتين عبر كتابتها ك raw query كالتالي import { Sequelize } from "sequelize"; const sequelize = new Sequelize({ host: "localhost", port: 3306, dialect: "MySQL", username: "username", password: "password", database: "dbname", logging: false,}); sequelize.query('CREATE TRIGGER test AFTER INSERT ON users' + ' FOR EACH ROW' + ' BEGIN' + ' insert into logs (UserId) values(new.id);' + 'END;') ومن الممكن أيضًا إنشاؤها من خلال الhooks كما يظهر في المثال التالي حيث نقوم بإنشاء trigger عند إنشاء مُستخدم جديد(insert query) module.exports = function(sequelize, DataTypes) { var User = sequelize.define('User', { name : DataTypes.STRING(255), email : DataTypes.STRING(255), username : DataTypes.STRING(45), password : DataTypes.STRING(100), }, { classMethods : { associate : function(models) { User.hasOne(models.Config) } }, hooks: { afterCreate: function(user, options) { models.Config.create({ UserId: user.id }) } } }); return User; }; ويمكن إستبدال afterCreate بأي hook أخر حيث يتوفر العديد من الhooks مثل afterUpdate, afterDestroy , beforeUpdate, beforeCreate, beforeDestroy فيمكنك إذًا وضع hook حسب الحدث الذي تريد تنفيذ الشفرة البرمجية بعده بالنسبة إلى الشق الثاني من السؤال غير واضح هل يمكنك رجاءًا توضيحه بشكلٍ أكبر؟
  22. ماهي المشكلة التي تقابلك تحديدًا؟ برجاء إرفاق رسالة الخطأ التي تظهر لكِ ووصف المشكلة بوضوح
  23. إطار عمل flask يُطلق عليه لفظ microframework ليس بسبب ضعفه, وإنما في الحقيقة بسبب أنه يأتي بالقليل من المميزات والتي يمكنك لاحقًا الحصول عليها عبر الإضافات, حيث يأتي إطار عمل flask بخصائص بسيطة مثل الrouting ومعالجة الطلبات(request handling) بينما مميزات أخرى مثل الtemplate engine و ORM و caching جميعها يجب إضافتها من قِبل مكتبات خارجية بنفسك, على عكس إطار عمل مثل django الذي يحتوي على كل تلك المميزات, لهذا السبب يتم إطلاق لفظ microframework على flask , ولكنها في النهاية يُمكنك إنشاء مشاريع كبيرة بها حيث المشكلة عادةً لا تكون في إطار العمل وإنما تكون في كتابتك لإستعلامات فعالة لقاعدة البيانات وتطبيق تقنيات مثل caching
  24. يمكنك توليد رمز uuid (Universally unique identifier) وهو عبارة عن رمز مكون من 128 بيت , مما يعني أنه إن قمنا بتوليد 10تريليون رمز سيكون إحتمالية وجود رمزين متشابهين هي 0.00006 ولتوليد رموز uuid في flutter يمكننا إتباع الخطوات التالية تثبيت مكتبة uuid flutter pub add uuid عمل import للمكتبة import 'package:uuid/uuid.dart'; نقوم بإنشاء كائن من الصنف uuid var uuid = Uuid(); نقوم بعد ذلك بتوليد الرمز عبر مناداة الدالة v4 والتي تقوم بتوليد رمز من الإصدار الرابع وهو أخر إصدار موجود حاليًا للuuid ويعتبر أكثرهم أمانًا وأقلهم عرضةً للتكرار uuid.v4()
  25. تلك المشكلة تحدث بسبب أنك قمت بإغلاق قوس الwhile بعد إغلاق وسم table, بالإضافة أنك بدأت الحلقة قبل بدأ الوسم tbody وبالتالي يتم إغلاق الجدول وكتابة باقي الحقول خارجه, الحل أن تقوم بوضع الحلقة التكررية داخل tbody وتقوم بإغلاقها قبل إغلاق الجدول ليكون شكل الشفرة البرمجية لديك كالتالي <tbody> <?php while($row=fetch_data($query)){ ?> <tr> <td><?php echo $row['FirstName'].$row['LastName'?></td> ////باقي الحقول </tr> <?php } ?> </tbody>
×
×
  • أضف...