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

محمد أيت لعرايك

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

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

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

أجوبة بواسطة محمد أيت لعرايك

  1. يحتوي Ant Media Server على حزم SDK محمولة أصلية (IOS و Android) لـ WebRTC. يمكنك استخدام مرافق WebRTC في نظام Android الأساسي بمساعدة Ant Media Server's Native Android WebRTC SDK.

    يمكن تنزيل WebRTC لنظامي التشغيل iOS و Android SDK مجانًا. يمكنك الوصول إليهم من خلال هذا الرابط. بعد تنزيل SDK ، يمكنك فقط فك ضغط الملف. يمكنك أيضًا الحصول على نسخة تجريبية من Ant Media Server Enterprise Edition من هنا

    عند الإنتهاء من التطبيق يمكنك رفعه على متجر google play أو متجر appstore التطبيق لا يتم رفعه في إستضافة المواقع . أما بخصوص إدارة الإتصالات فإن  Ant Media Server   يتكلف بذلك من خلال sdk مجاني أو مدفوع حسب الحاجة.

  2. لغة javascript تفرق بين الكتابة بالحروف الصغيرة والكبيرة فمثلا

    pic.addEventListner('click',changeCounter);
    
    // و
    
    pic.addEventListner('click',changecounter);

    كل مستمع يقوم بالنداء على دالة مختلفة عند النقر على الصورة  الدالة changeCounter  ليست هي الدالة changecounter 

    يجب عليك دائما النتباه للكيفية كتابة الدوال و المتغيرات في  javascript

  3. لإعداد نطاق مخصص  في laravel ، تحتاج إلى تهيئة مضيف apache . ولكي تقوم بذلك فأنت تحتاج إلى تحرير ملف “httpd-vhosts.conf”  الموجود بالمسار

    C:\wamp\bin\apache\apache2.4.23\conf\extra\httpd-vhosts.conf

    إدا كنت تستخدم wamp أو

     C:\xampp\apache\conf\extra\httpd-vhosts.conf

    إدا كنت تستخدم xamp .

    إفتح الملف وضع الشيفرة التالية:

    <VirtualHost *:80>
    DocumentRoot “C:/xampp/htdocs/project-name/public”
    ServerName blog.test
    </VirtualHost>

    أيضًا ، نحتاج إلى تعديل ملف "hosts". الخاص بنظام التشغل ,  إفتح الملف

    C:\Windows\System32\drivers\etc\hosts

    ثم ضع هذا السطر في نهايته ثم إحفظه

    127.0.0.1 blog.test

    الآن ، افتح WAMP (XAMPP) وأعد تشغيل خادم Apache. في متصفحك ، انتقل إلى blog.test هذه هي الطريقة التي يمكنك بها إعداد مضيف افتراضي في خادم xampp أو wamp لـ laravel.

    • أعجبني 1
  4. في حالة تريدين عمل LiveReload للسكريت الخاص بك دون إعادة تحديث المتصفح أنصحك بإستخدام هذه الإضافة

    فهذه الإضافة تمكنك من :

    - تحميل صفحات الويب عند إنشاء أي ملف أو إزالته أو تعديله.
    - تطبيق التغييرات بدون إعادة التحميل عند تغيير أي CSS أو صورة.
    - تعمل مع امتداد LiveReload.

  5. لإستخدام Zoom API. أولاً ، عليك إنشاء تطبيق في Zoom marketplace.

    اذهب إلى هذا الرابط

    إذا لم يكن لديك أي حساب في zoom، فيجب عليك إنشاء حساب في zoom. من هنا

    بعد ذلك أنشئ تطبيق OAuth  يجب الحصول على id العميل و كلمة السر لتطبيقك. و تعيين النطاقات للتطبيق. ما النطاقات التي يجب عليك تحديدها لتطبيقك.

    النطاقات تعني نوع بيانات المستخدمة التي يمكنها الوصول إلى تطبيقك. كلما قام مستخدم بتسجيل الدخول في تطبيقك ، يمكنه رؤية هذه النطاقات أو الوصول إلى بيانات هذا التطبيق.

    بعد ذلك يمكنك إستخدام مكتبة guzzlehttp/guzzle   في حالة تستخدم  لغة php

    composer require guzzlehttp/guzzle

    سنقوم بتخزين رمز الوصول في قاعدة البيانات لاستخدامه لاحقًا. رمز الوصول صالح لفترة قصيرة من الزمن. في الكود الخاص بنا ، سنقوم بإعادة إنشاء رمز الوصول في الخلفية بحيث لا يحتاج المستخدم إلى إجراء عملية التفويض مرة أخرى. قم بتشغيل استعلام SQL أدناه لإنشاء جدول قاعدة بيانات يحتوي على رمز الوصول.

    
    CREATE TABLE `token` (
     `id` int(11) NOT NULL AUTO_INCREMENT,
     `access_token` text NOT NULL,
     PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

    كما قلت سابقًا في Zoom APIs ، هناك الكثير من الخيارات التي يمكنك دمجها في تطبيقك. يمكنك التحقق من توثيق Zoom APIs هنا

    • أعجبني 2
  6. الدالة هي كتلة من التعليمات البرمجية مصممة لأداء وظيفة معينة و نستعملها عندما نقوم  بالنداء عليها بإسمها مثال :

    function  getSum(number1, number2) {  //  number2   و   number1  تقوم بأخد رقمين   getSum  إسم الدالة
      
      return number1 +  number1;   //  بعد ذلك تقوم بجمع العديدن وإسترجاع القيمة
      
    }
    
    //  النداء على الدالة
     getSum(1,3)
    
    
    // النتيجة 
    >   4

     

  7. ببساطة يمكنك عرض جميع المكتبات بإستخدام npm ls

    في المكون الخاص بك أكتب مايلي.

    const dependancies = [];
    require('child_process').exec('npm ls --json', function(err, stdout, stderr) {
        if (err) return cb(err)
        dependancies.push(JSON.parse(stdout))
      });

    عرض المصفوفة  dependencies

    console.log(dependencies);
    
    //   النتيجة
    /*
    
    [
     { name: 'aws-amplify', version: '^5.10.2' },
     { name: 'classnames', version: '^2.2.6' },
     { name: 'lodash', version: '^4.17.15' }
    ]
    
    */

     

  8. يمكن إستعمال عدت طرق للعمل  delete في بيانات الخادم ,  وينصح بإستخدام الطريقة الأخيرة فهي أكثر إحترافية و أمان

    deleteRequest: function (id, index) {
      axios.post('/admin/posts/' + id, {
        _method: 'DELETE'
      })
        .then((response) => {
    
      }).catch((error) => {
    
      });
      
     //  يعادل
      deleteRequest: function (id, index) {
      axios.delete('/admin/posts/' + id)
        .then((response) => {
    
      }).catch((error) => {
    
      });
        
     //  ويمكن كتابة الكود السابق على الشكل  التالي
     //    لإرسال البيانات للطلب  body   التي نستعمل   PUT  و   POST  عكس  data  في الكائن    parameter  مع إرسال   
     const res = await axios.delete('/admin/posts',{ data: { id: 42 } });
      res.status; // 200

     

    في post و put نرسل البيانات عبر body وفي delete نرسلها عبر data

  9. يمكن إنشاء دالتين, واحدة تقوم بالتحقق من النصوص , وواحدة تتحقق من الصور

    دالة التحقق من النصوص:

    function validation_input($data) {  //    للنص و العنوان  validation لعمل
      $data = trim($data);
      $data = stripslashes($data);
      $data = htmlspecialchars($data);
      
      if(!empty($data){
        // هنا يمكن عمل تحقق من عدد الحروف إن أردت ذلك
        return  true;
      }     
    }

        دالة التحقق من الصور:

    function validation_image($image) { 
       $errors= array();
          $file_name = $image['name'];
          $file_size = $image['size'];
          $file_tmp = $image['tmp_name'];
          $file_type = $image['type'];
          $file_ext=strtolower(end(explode('.',$image['name'])));
          
          $expensions= array("jpeg","jpg","png");  //  نتحقق من الصيغ المسموح بها
          
          if(in_array($file_ext,$expensions)=== false){
             $errors[]="extension not allowed, please choose a JPEG or PNG file.";
          }
          
          if($file_size > 2097152) {  // نتحقق من حجم الصورة
             $errors[]='File size must be excately 2 MB';
          }
          
          if(empty($errors)==true) {
             return true;
          }    
    }

     

  10. يمكن أيضا عمل custom validation rule إذا كانت checkbox  تحتاج إلى تحقق متطور.

    قم بإنشاء قاعدة مخصصة داخل app / Providers / AppServiceProvider.php في الدالة boot أضف مايلي :

    use Illuminate\Support\Facades\Validator;
    
    ...
    
    public function boot() {
    
        Validator::extend('validate_checkboxes', function ($attribute, $values, $parameters, $validator) {
    
            foreach( $values as $value ) {
                if (!in_array($value, [0, 1])) {
                    return false;
                }
                return true;
            }
    
        });
    
    }

    في المتحكم الخاص بك أكتب مايلي:

    $this->validate($request, [
          'record_checkbox' => 'validate_checkboxes',
    ]);

     

  11.  وللإضافة ينصح دائما بإستخدام الإتصال عن طريق PDO

    استخدام PDO أسهل من mysqli.
     PDO يستخدم طرقًا أقل لتنفيذ استعلام مقارنةً بـ mysqli. بالإضافة إلى ذلك ، أثناء الاستعلامات المعدة ، فإنه يعطي إمكانية تسمية المعلمات وهو أمر عملي لسهولة القراءة ولتجنب أخطاء تحديد موضع المعلمات. parametres

    ويكون الإتصال عن طريق PDO كالتالي:

    <?php
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    ?>

    بعد ذلك يمكنك إنشاء الإستعلام على النحو التالي:

    <?php
    try {
        $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
        foreach($dbh->query('SELECT * from FOO') as $row) {
            print_r($row);
        }
        $dbh = null;
    } catch (PDOException $e) {
        print "Erreur !: " . $e->getMessage() . "<br/>";
        die();
    }
    ?>

    إذا لم يلتقط التطبيق الخاص بك الاستثناءات التي تم إلقاؤها من مُنشئ PDO ، فإن الإجراء الافتراضي لمحرك zend هو إنهاء البرنامج النصي وعرض التتبع. يجب أن يكشف هذا التتبع عن التفاصيل الكاملة لاتصال قاعدة البيانات ، بما في ذلك اسم المستخدم وكلمة المرور. لذلك ، تقع على عاتقك مسؤولية التقاط هذا الاستثناء عبر تعليمة catch try

  12. في حالة العناوين الديناميكية (h1 ، h2 ...) ، يمكن للمكون إرجاع React.createElement على هذا النحو.

    const Heading = ({level, children, ...props}) => {
        return React.createElement(`h${level}`, props , children)
    }

    ويمكن تمرير كل من الدعائم والأطفال.

    <div>
    	<Heading level={1}>Heading 1</Heading>
        <Heading level={2}>Heading 2</Heading>
        <Heading level={3}>Heading 3</Heading>
    </div>
          

    النتيجة 

    Heading 1  <!-- بخط كبير -->
    Heading 2  <!-- بخط متوسط-->
    Heading 3  <!-- بخط صغر -->

     

    • أعجبني 1
  13. يتم حل تمثيل العلاقات في قواعد البيانات غير العلائقية أو noSQL ، بشكل عام ، إما من خلال تضمين المستندات (صيغة noSQL للصفوف) أو من خلال مراجع المستندات (document references)

    يحتوي موقع MongoDB على بعض المقالات اللائقة التي تنطبق في الغالب على جميع قواعد البيانات غير العلائقية بما في ذلك نموذج العلاقات الفردية مع مراجع المستندات ، والتي أعتقد أنها الأكثر صلة بمشكلتك

    فيما يتعلق بالمفتاح المرجعي ، من الأفضل عادةً استخدام المعرفات التي تم إنشاؤها حيث يمكنك التأكد من أنها فريدة.

    • أعجبني 1
  14. تتيح لك سمات الألوان تعديل الألوان في واجهة مستخدم Visual Studio Code لتناسب تفضيلاتك وبيئة العمل.

    لإختيار theme إتبع الخطوات التالية:

    1- في VS Code ، افتح Color Theme Picker باستخدام ملف> تفضيلات> سمة اللون.
    2- يمكنك أيضًا استخدام اختصار لوحة المفاتيح Ctrl + K Ctrl + T لعرض themes.
    3- استخدم مفاتيح المؤشرات لمعاينة الأوان و theme اللذي تريده.
    4- عندما تستقر على الtheme الذي تريده اضغط على Enter.

    بعد ذلك يمكنك العمل ب theme الجديد.

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

    و عندما يقرأ أحد المطورين جزءًا من التعليمات البرمجية والتي لا يفهمونها ولا يزالون يعبثون بالأكواد على أمل إصلاح بعض المشكلات ، فإنهم يبرمجون بطريقة خاطئة أيضا.

    المشكلة ، في هذه الحالة ، ليست أن المطور ينسخ شيئًا ما. يمكن لأي شخص نسخ مقتطف من التعليمات البرمجية ، وفهمها ، والتعلم منها ، واستخدامها ، لكن المشكلة الحقيقية هي أن المبرمج لا يتعلم شيئا مادام لا يفهم ما يقوم به,

    فلا عيب في نسخ و لصق الأكواد ما دمت تعلم جيدا ماللذي تفعله ولتصل إلى درجة المبرمج المحترف فليس لديك حل سوى التعلم ثم التعلم ثم التعلم.

    ولكي تتعلم يجب عليك بناء مواقع و تطبيقات و صغيرة ومتوسطة الحجم و تمرن نفسك يوميا وتحسن من مهاراتك ومع الوقت ستتمكن من كتابة الأكواد مباشرة دون الحاجة للنسخ واللصق

    • أعجبني 1
  16. سيكون عليك إنشاء مفتاح للتوقيع على apk. استخدمي  الأمر أدناه لإنشاء مفتاحك:

     keytool -genkey -v -keystore my-app-key.keystore -alias my-app-alias -keyalg RSA -keysize 2048 -validity 10000

    بمجرد إنشاء المفتاح ، استخدميه لإنشاء البنية القابلة للتثبيت:

    react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

    إنشاء البناء باستخدام Gradle

    cd android && ./gradlew assembleRelease

    بعد ذلك قومي بتحميل APK على هاتفك. ستحل العلامة -r محل التطبيق الحالي (إن وجد) 

    adb install -r ./app/build/outputs/apk/app-release-unsigned.apk

    وستجدين أيضا ملف APK الخاص بالتطبيق في مجلد /android/app/build/outputs/apk/release

    يمكنك بعد ذلك  إرساله إلى إلى شخصٍ ما ليتمكن من اختباره،

    • أعجبني 2
  17. يمكن عمل ذلك بهذه الطريقة:

    mylist = ["a", "b", "a", "c", "c","b","b"] #  بهذه الطريقة list  إنشاء
    mylist = list(dict.fromkeys(mylist))    #  أخرى بعناصر غير مكررة list  بهذه الدالة نقوم بإنشاء   
    print(mylist)  #  list بعد ذلك نطبع 

    تجدين المزيد من التفاصيل حول الموضوع في  هذا الرابط

  18. و للإضافة فالدالة  

    Auth()

    لا  تعمل إلا إذا كانت داخل middleware  web يعني في ملف routes الخاصة بك يكفي إضافة الكود التالي:

    Route::group(['middleware' => 'web'], function () {
        //   routes هنا تكتب جميع 
        //  ستقوم بإرجاع المستخدم اللذي سجل دخوله Auth::user() أي متحكم يكتب هنا الدالة 
    });

     

  19. قومي بتعيين تركيز  emailInput الثاني ، عند تشغيل  passwordInput السابق للدالةـ onSubmitEditing

    أولا  قومي بإضافة Ref للحقل الثاني 

    <TextInput
       ref={(input) => { this.passwordInput = input; }}
       style = {styles.passwordInput}          
       maxLength = {10}
       placeholder = "كلمة المرور"
    />

    بعد ذلك إستخدمي الدالة onSubmitEditing للتنصت على حدث الضغط على next في الحقل الأول:

    <TextInput
        placeholder = "البريد الالكتروني"
        returnKeyType="next"
        onSubmitEditing={() => { this.passwordInput.focus(); }}
        blurOnSubmit={false}
        style = {styles.emailInput}
        autoFocus = {true}
       
    />

     

  20. لنفترض أن لديك متغير  var$  تم إرساله من طرف controller إلى view و تريد إظهار في الصفحة الخاصة بك

    $var  =  "<h1> أكادمية حسوب </h1>" ;

     إذا تمت كتابة {{ var$ }}  في ال view فسوف تكون النتيجة على الشكل التالي:

    <h1> أكادمية حسوب </h1>  <!-- ستظر النتيجة كماهي دون إي تغيير  -->

      أما إذا تمت كتابة {!!var$ !!}  في ال view فسوف تكون النتيجة :

     أكادمية حسوب 
    
    <!-- h1 ستظهر النتيحة كعنوان كبير وسيقرأ المتصفح عنصر  --->

    دائما ينصح بإستعمال {{ }} هذه الطرقة لإظهار المتغيرات لتجنب إختراقات XSS,  ولمزيد من التفاصيل حول الموضوع يمكنك زيارة الموقع الرسمي ل Laravel  من هنا

  21. لديك عنصرين أساسيين في القالب  template الخاص بك.

    <template>
            <div class="form-group">
                <label for="avatar" class="control-label">Avatar</label>
                <input type="file" v-on:change="fileChange" id="avatar">
                <div class="help-block">
                    Help block here updated 4 🍸 ...
                </div>
            </div>
    
            <div class="col-md-6">
                <input type="hidden" name="avatar_id">
                <img class="avatar" title="Current avatar">
            </div>
    </template>

    و هدا خطا القالب template يجب أن يكون عنصر واحد, ولحل هذه المشكلة يكفي وضع <div> يحتوي جميع العناصر ,  على الشكل التالي:

    <template>
       <div>  <!--إضافة عنصر جديد هنا -->
         
           <div class="form-group">
                <label for="avatar" class="control-label">Avatar</label>
                <input type="file" v-on:change="fileChange" id="avatar">
                <div class="help-block">
                    Help block here updated 4 🍸 ...
                </div>
            </div>
    
            <div class="col-md-6">
                <input type="hidden" name="avatar_id">
                <img class="avatar" title="Current avatar">
            </div> 
         
      </div>  
    </template>

     

  22. بإمكانك إنشاء تابع جديد في النموذج User بهذا الشكل:

    public function commentsSorted()
    {
        return $this->hasMany('Comment')->orderBy('post_id');
    }

    و عند عرض التعليقات تقوم بالتالي:

    foreach($post->user->ommentsSorted as $comment)
    {
      echo "<li>" . $comment->title . " (" . $comment->post->id . ")</li>";
    }

    أو تعرض المعلومات بالطريقة التالية:

    @foreach($comments as $comment)
      <li>{{ $comment->title }} ({{ $comment->post_id }})</li> 
    @endforeach

     

×
×
  • أضف...