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

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

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

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

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

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

    2

أجوبة بواسطة شرف الدين حفني

  1. بتاريخ 1 دقيقة مضت قال Ahmed Yehia2:

    لغه سي شارب

    تلك العلامة تُسمى compliment bitwise ,ما معنى ذلك؟

    إن إفترضنا لدينا الرقم الثنائي   0110110 فإن الcompliment يقوم بتحويل جميع الأصفار إلى أحاد وجميع الأحاد إلى أصفار فيصبح الرقم  1001001 

    يمكن تطبيق ذلك بنفس الطريقة على الأرقام العشرية إن إفترضنا قمنا بكتابة الشفرة التالية 

    int number = 16;
    int result = ~number;

    الرقم 16 في النظام الثنائي يساوي 10000 , إن قمنا بإستخدام المعامل ~ سيتم تحويله إلى 01111 أي يصبح المتغير result يساوي 15 

    • أعجبني 1
  2. بتاريخ 5 ساعات قال Salih Othman:

    هل استكشاف الاخطاء فيها اسهل..لاني سمعت ان اكتشاف الاخطاء بلغة مثل البي اتش بي متعب بعض الشي، ورغم ذلك البي اتش بي لغة مشهورة ...ماهي مميزات وعيوب وايهما تفضل بين النود والبي اتش بي  او بصيغة اخرى هل هناك ما يميز PHP  على النود كلغة في الباك اند ؟

     php تتميز بشهرتها الواسعة وإنتشارها مما يؤدي إلى فرص عمل أكبر بالphp ومجتمع أكبر في حالة واجهتك مشكلة أثناء التعلم سيكون الدعم في php أكبر من نظيره في node js 

  3. النص بالفعل موضوع في منتصف ال.content المشكلة نفسها أن ال.content غير موضوعة في المنتصف, يمكنك زيادة العرض إلى 100% وحينها سيصبح الكلام النصي في منتصف الصفحة أو يمكنك إستخدام flex-box وإعطاء الصنف الأعلى من ال.content الخاصية display:flex ومن ثم عمل justify-content:center للصنف الأعلى ووقتها سيصبح الكلام في المنتصف

    إن لم تفلح معك الحلول بالأعلى برجاء نسخ الشفرة البرمجية لصفحة الhtml ولصقها في تعليق

  4. بتاريخ 1 دقيقة مضت قال Salih Othman:

    هذا يعني ان اقصر طريق للتعلم الباك اند هو النود لانك ستكون قد تعلمت الجافا سكربت مسبقا...هل ممكن استخدام النود مع كل قواعد البيانات سواء علا ئقية وغير علائقية وهل تكامل النود مع قواعد البيانات ممتاز ام هناك عجز مع بعض قواعد البيانات؟

    هذا يعني ان اقصر طريق للتعلم الباك اند هو النود لانك ستكون قد تعلمت الجافا سكربت مسبقا...هل ممكن استخدام النود مع كل قواعد البيانات سواء علا ئقية وغير علائقية وهل تكامل النود مع قواعد البيانات ممتاز ام هناك عجز مع بعض قواعد البيانات؟

    لكل تقنية مميزاتها ولكن صحيح من ضمن مميزات نود أن من السهل تعلمها أو كما قلت أنت طريقها أقصر نسبيًا, ونود تعمل مع جميع قواعد البيانات لا يوجد مشكلة 

  5. النود ليست إطار عمل للجافاسكريبت وإنما هي بيئة عمل للجافا سكريبت

    ما المقصود ببيئة عمل؟

    في العادي لا يمكن تشغيل شفرات الجافاسكريبت خارج المتصفح, حيث أن لغة جافاسكريبت تعمل على المتصفحات فقط , بيئة عمل نود تقوم بتوفير المكاتب اللازمة والأدوات اللازمة من خلال ما يُعرف بمحرك v8 وهو الذي يقوم بتشغيل شفرة الجافاسكريبت خارج المتصفح سواء كان على الحاسب الشخصي لإنشاء تطبيقات سطح مكتب أو على الخوادم لبرمجة الواجهات الخلفية 

  6. مبدأ 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;
        }
    }

     

    • أعجبني 2
  7. إختيار اللغة لن يؤثر بشكلٍ كبير على أداء التطبيق حيث يوجد عوامل أهم يجب أخذها في الحسبان

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

     

    • أعجبني 1
  8. بالإضافة إلى المقالات والأسئلة التي أشار إليها أسامة يوجد أيضًا موسوعة حسوب, وهي موسوعة غنية بالمعلومات والتوثيقات عن مختلف التقنيات واللغات البرمجية

    ستلاحظ عند دخولك إلى الموسوعة أن المواضيع مقسمة حسب اللغة أو التقنية, ويوجد خانة إدخال البحث, من خلالها يمكنك كتابة ما تبحث عنه وستظهر لك مواضيع ذات علاقة بموضوع البحث, على سبيل المثال إن أردت قراءة التوثيق الخاص بالتابع promise.all يمكنك كتابة promise.all في خانة البحث وستظهر لك في النتائج التوثيقات المتعلقة بتلك الكلمة البحثية, ويمكنك تصفح الموسوعة عبر النقر هنا

  9. لكلٍ منهما مميزاته وعيوبه وحالات يُفضل الإستخدام فيها 

    بالنسبة للeager loading

    1. ميزته أنك لا تحتاج لعمل أكثر من إستعلامة لقاعدة البيانات حيث تكتب إستعلامة واحدة تحصل فيها على البيانات جميعها
    2. عيبه أن في حالة كان هناك كثير من البيانات من الممكن أن لا تكون تحتاجها كلها وبالتالي ستشغل الذاكرة ببيانات لا فائدة لها

    ما الحالات التي يُفضل إستخدامه  فيها؟

    إن إفترضنا وجود علاقة one-to-many نقوم بإستخدام الeager لل many أي إن مثلًا كنا نتعامل مع علاقة مؤلف مع المقالات, وأردنا الحصول على مقالة ما , في تلك الحالة نستخدم الeager loading لنحصل معها على المؤلف

    بالنسبة للlazy loading

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

    الحالات التي يُفضل إستخدامه فيها

    إن إفترضنا وجود  نفس علاقة الone-to-many التي تحدثنا عنها بالأعلى فنقوم بإستخدام الlazy من طرف الone أي إن مثلًا كنا نتعامل مع علاقة المؤلف مع المقالات ولكننا هنا نستعلم عن المؤلف, في تلك الحالة نستخدم الlazy loading حتى لا نحصل على المقالات الخاصة بالمؤلف بل نحصل على المؤلف فقط إلى حين إحتياجنا للمقالات

    • أعجبني 1
  10. بتاريخ 2 دقائق مضت قال Samer Alashqar:

    هذا ما اقوم به :

    
    res.cookie('access-token' , accessToken)

     

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

    res.cookie('token', 'bla bla', { expires: new Date(Date.now() + 1000*60*60) })

    بالمثال الأعلى يكون عمر الcookie ساعة, لأننا نقوم بتزويد تاريخ الإنتهاء بالmillesecond وبالتالي نقوم بكتابة 1000(أي ثانية واحدة) ونضربها في 60(لتصبح دقيقة) ونضربها في 60 لتصبح ساعة

    • أعجبني 1
  11. بالإضافة إلى إجابة حسن يمكننا توضيح تعددية الأوجه عبر المثال التالي

    نفترض أننا أردنا إنشاء دالة تقوم بوظيفة ما على جهاز التحكم 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 

    • أعجبني 1
  12. الفرق أن الطريقة الأولى مثل التي في المثال 

    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 فلا نحتاج إلا إلى إستعلامة واحدة فقط 

  13. لمعرفة عدد الخانات في عددٍ ما في لغة جافا يوجد عدة طرق مثلًأ

    1. تحويل العدد إلى نص من خلال الدالة String.valueOf ومن ثم الحصول على طول النص كما يظهر لنا في المثال 
      int length = String.valueOf(number).length();

        

    2. أخذ لوغاريتم العدد للأساس عشرة مع إضافة 1 , فإن كان مثلًا العدد 5520 , فإن اللوغاريتم للأساس عشرة بعد التقريب سيكون 3, نضيف 1 يصبح 4 وهو عدد الخانات 

      int length = (int) (Math.log10(number) + 1);

       

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

    • أعجبني 1
  14. بالنسبة لل triggers يمكنك إنشاؤها من خلال طريقتين

    1. عبر كتابتها ك 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;')

       

    2. ومن الممكن أيضًا إنشاؤها من خلال ال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 حسب الحدث الذي تريد تنفيذ الشفرة البرمجية بعده

    بالنسبة إلى الشق الثاني من السؤال غير واضح هل يمكنك رجاءًا توضيحه بشكلٍ أكبر؟

  15. إطار عمل flask يُطلق عليه لفظ microframework ليس بسبب ضعفه, وإنما في الحقيقة بسبب أنه يأتي بالقليل من المميزات والتي يمكنك لاحقًا الحصول عليها عبر الإضافات, حيث يأتي إطار عمل flask بخصائص بسيطة مثل الrouting ومعالجة الطلبات(request handling) بينما مميزات أخرى مثل الtemplate engine و ORM و caching جميعها يجب إضافتها من قِبل مكتبات خارجية بنفسك, على عكس إطار عمل مثل django الذي يحتوي على كل تلك المميزات, لهذا السبب يتم إطلاق لفظ microframework على flask , ولكنها في النهاية يُمكنك إنشاء مشاريع كبيرة بها حيث المشكلة عادةً لا تكون في إطار العمل وإنما تكون في كتابتك لإستعلامات فعالة لقاعدة البيانات وتطبيق تقنيات مثل caching 

    • أعجبني 1
  16. يمكنك توليد رمز uuid (Universally unique identifier) وهو عبارة عن رمز مكون من 128 بيت , مما يعني أنه إن قمنا بتوليد 10تريليون رمز سيكون إحتمالية وجود رمزين متشابهين هي 0.00006 

    ولتوليد رموز uuid في flutter يمكننا إتباع الخطوات التالية

    1. تثبيت مكتبة uuid 
      flutter pub add uuid

       

    2. عمل import للمكتبة 

      import 'package:uuid/uuid.dart';

       

    3. نقوم بإنشاء كائن من الصنف  uuid 

      var uuid = Uuid();

       

    4. نقوم بعد ذلك بتوليد الرمز عبر مناداة الدالة v4 والتي تقوم بتوليد رمز من الإصدار الرابع وهو أخر إصدار موجود حاليًا للuuid ويعتبر أكثرهم أمانًا وأقلهم عرضةً للتكرار 

      uuid.v4()

       

    • أعجبني 1
  17. تلك المشكلة تحدث بسبب أنك قمت بإغلاق قوس الwhile بعد إغلاق وسم table, بالإضافة أنك بدأت الحلقة قبل بدأ الوسم tbody وبالتالي يتم إغلاق الجدول وكتابة باقي الحقول خارجه, الحل أن تقوم بوضع الحلقة التكررية داخل tbody وتقوم بإغلاقها قبل إغلاق الجدول ليكون شكل الشفرة البرمجية لديك كالتالي 

    <tbody>
      <?php
      	while($row=fetch_data($query)){
          ?>
      <tr>
        <td><?php echo $row['FirstName'].$row['LastName'?></td>
        ////باقي الحقول
      </tr>
      <?php
             }
       ?>
                                              
    </tbody>

     

    • أعجبني 1
  18. يوجد لديك مشكلتان 

    1. قمت بوضع مسار ملف الجافا سكريبت بشكلٍ خاطئ حيث قمت بكتابة 
      <script src="../New folder (7)/main.js"></script>

      وهذا المسار غير موجود حيث أنك قد وضعت ملف الجافاسكريبت في نفس مجلد ملف الhtml مما يعني أن يجب أن يكون وسم الإستيراد كالتالي 

      <script src="main.js"></script>

       

      1. في ملف جافا سكريبت قمت بكتابة 

        var inp = document.getElementById("input");

          ولا يوجد في ملف html عنصر يحمل id بإسم input بل يحمل class بهذا الإسم فبرجاء تغيير العنصر في ملف html ووضع الid  بقيمة input ليصبح شكل العنصر في صفحة الhtml كالتالي 

        <input type="text" id="input">

         

  19. تحتاج أولًا إلى تثبيت المكتبة التالية , pbkdf2 عبر إستخدام أداة pip 

    pip install pbkdf2

    ومن ثم نقوم بعمل إستيراد لهم 

    import  pbkdf2,  os

    ومن ثم نقوم بإضافة salt وهو عبارة عن كلمة يتم إضافتها للشفرة لتزويد صعوبتها وتعقيدها ونقوم بتوليدها عبر توليد رموز عشوائية كما بالشفرة التالية 

    passwordSalt = os.urandom(16)

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

    key = pbkdf2.PBKDF2(password, passwordSalt).read(32)

    لتصبح في النهاية شفرتنا البرمجية شبيهة بتلك الشفرة 

    import  pbkdf2, os
    
    password = "sharafeldeen"
    passwordSalt = os.urandom(16)
    key = pbkdf2.PBKDF2(password, passwordSalt).read(32)

     

  20. يمكنك تنفيذ المطلوب عبر إستخدام الدالة COUNT , حيث في حالتنا هنا نريد الحصول على عدد المُعجبين والذي يمكن تنفيذه كالتالي بإستخدام sql 

    select COUNT(UserLikes.PostId) from Post left join UserLikes on Post.id = UserLikes.PostId

    وفي حالة أردنا عرض المنشور وبجانبه عدد المعجبين يمكننا إستخدام الدالة count مع الدالة group by لأن بدون إستخدام group by سيتم عرض فقط المنشورات التي لديها معجبين, ويمكننا تمثيل ذلك بكود sql كالتالي 

    select Post.*, COUNT(UserLikes.PostId) from Post left join UserLikes on Post.id = UserLikes.PostId group by Post.id

    حيث يتم عرض جميع المنشورات حسب الid الخاص بهم بالإضافة إلى عدد المُعجبين, ويمكننا تنفيذ الشفرات السابقة إلى أكواد sequelize كالتالي

    1. const posts = await Post.findAll({
      
               attributes:[
                  [Sequelize.fn("COUNT", Sequelize.col("UserLikes.id")), "likes"]
               ],
               include:{model:User,as:"UserLikes" , attributes:[]},
      
               group: ['Post.id'],
               subQuery: false,
                  
                  limit: limit,
                  offset: limit * pageNo
              })

      كما تلاحظ قمنا في خانة attributes بوضع attribute واحد فقط وهو مجموع الحقل UserLikes.id لنعلم كم إعجاب لكل منشور حسب ظهور المُعرف الخاص بالمُعجب, كما إستخدمنا أيضًا subQuery ب false حتى نجعل الشفرة تعمل كما بالأعلى حتى لا يتم إستبدال الjoin  ب subquery 

    2. const posts = await Post.findAll({
      
               attributes:{
                  include:[[Sequelize.fn("COUNT", Sequelize.col("UserLikes.id")), "likes"]]
               },
               include:{model:User,as:"UserLikes" , attributes:[]},
      
               group: ['Post.id'],
               subQuery: false,
                  
                  limit: limit,
                  offset: limit * pageNo
              })

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

×
×
  • أضف...