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

لوحة المتصدرين

  1. سامح أشرف

    سامح أشرف

    الأعضاء


    • نقاط

      9

    • المساهمات

      2934


  2. Mohssen A Mohssen

    Mohssen A Mohssen

    الأعضاء


    • نقاط

      3

    • المساهمات

      317


  3. Adnane Kadri

    Adnane Kadri

    الأعضاء


    • نقاط

      2

    • المساهمات

      5196


  4. ابراهيم الخليل سماني

    • نقاط

      2

    • المساهمات

      505


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 08/28/22 في كل الموقع

  1. لنفترض أن لدي كائن بسيط بالشكل التالي: const myObj = { a: 1, b: 2, c: 3 }; هل توجد حلقة مثل foreach للمرور على كل مفتاح key وقيمة value في الكائن السابق، لطباعتهما معًا؟ أريد أن تكون النتيجة بالشكل التالي: a 1 b 2 c 3
    2 نقاط
  2. أريد أن أقوم بإرسال بعض الطلبات من خلال مكتبة requests، وأريد أن أوقف أي طلب يتم إرساله بعد وقت محدد من إرساله (في حالة لم ينتهي الطلب بالفعل)، على سبيل المثال بعد 3 ثوانٍ من بدء الطلب يتم إيقافه في حالة تأخر الخادم في الرد. بعد ذلك يجب أن أقوم بإعادة إرسال نفس الطلب مرة أخرى. هل توفر مكتبة requests وسيلة لتحديد timeout للطلب؟
    1 نقطة
  3. ما هي الطريقة الموصى بها لملء قيمة رقمية بأصفار صفرية في JavaScript؟ على سبيل المثال إن كان لدي الرقم 43 فأريد أن يتم إضافة صفرين إلى اليسار ليصبح 0043 هل توجد دالة مخصصة لتركيب الأصفار على قيمة رقمية؟ أم يجب كتابة دالة تقوم بهذا الأمر؟
    1 نقطة
  4. أرغب فى تحرير تعليق بداخل الصفحة باستخدام اجاكس؛ يتم التعديل فى قاعدة البيانات بنجاح ولكن القيمة الراجعه عند استخدام $(this).parents('.inputEditTex').nextAll('.p-comment-homepage').html(data); لا تظهر الا بعد اعادة تحميل الصفحة فى حين عند استخدامها بدونها هكذا $/*(this).parents('.inputEditTex').nextAll*/('.p-comment-homepage').html(data); تظهر فى الحال ولكن على كل الحقول المشابهة.... كيف أظهر القيمة فى مكان النقر فقط: هذا هو الكود: <div class="div-comm-2"> <div class="result dotted"> <div id="inputEditText"> <input type="text" class="text" value="<?php echo $com['c_text']?>"> <input type="hidden" class="comID" value="<?php echo $com['c_id']?>"> <button class="sendEdit">send</button> </div> <p class="p-comment-homepage"><span><?php echo $com['c_text']?></span></p> </div> </div> ==================== $(".sendEdit").on("click", function(){ var ComEdit=$(this).prevAll('.comID').val(); var Text=$(this).prevAll('.text').val(); $.ajax({ url:"thumb.php", data:{ed:ComEdit,text:Text}, success:function(data){ $(this).parents('.inputEditTex').nextAll('.p-comment-homepage').html(data); } }); }); =================== if (isset($_GET['ed']) && isset($_GET['text'])) { $comNum=$_GET['ed']; $text=$_GET['text']; $stmt=$conn->prepare(" UPDATE comments set c_text=? where c_id=? "); $stmt->execute(array($text,$comNum)); if ($stmt) { $stmt=$conn->prepare(" SELECT * from comments where c_id=? "); $stmt->execute(array($comNum)); $com=$stmt->fetch(); if (!empty($com)) { ?> <span><?php echo $com['c_text'] ?></span> <?php } } }
    1 نقطة
  5. السلام عليكم بعد تهيئة مشروع بواسطة npm npm init كيف يمكن دمج كل من vitejs و tailwind شكرا
    1 نقطة
  6. أنا طالبة في الصف الثاني الإعدادي ، عمري ثلاثة عشر عاما ، و اريد بشدة تعلم البرمجة ، هل يمكنني ذلك ؟ ، لأنه و بناء على ما قرأت فإن الطلبة الجامعيين في مجال البرمجة هم القادرون على دراستها ... فهمت أن لغة البرمجة تحتاج لفراغ لدراستها و تركيز عالي ، و طبعا أملك هذه المقومات ، ففي ظل الجائحة السابقة صارت الدراسة لمدة أربع ساعات في اليوم و الوقت الباقي كافي لأتعلم البرمجة ولو فقط الأساسيات ،
    1 نقطة
  7. لا علاقة بالسن في هذا المجال، ويمكن لأي شخص أن يبدأ بتعلم البرمجة وليس هناك أي متطلبات للبدء سوى الحصول على حاسوب بمواصفات متوسطة وإتصال بالإنترنت، ويمكن البدء في تعلم البرمجة على الفور، ومع ذلك يجب تحديد الهدف من تعلم البرمجة وذلك بسبب وجود الكثير من التفرعات والتخصصات في البرمجة ويصعب على شخص واحد أن يتعلم أكثر من مجال في وقت واحد. من ضمن مجالات البرمجة المعروفة يوجد: تطوير تطبيقات الجوال Android / iOS تطوير واجهات المستخدم Frontend تطوير الواجهات الخلفية Backend تطوير الألعاب Games Development تطوير الأنظمة المدمجة Embedded Systems تطوير تطبيقات سطح المكتب Desktop Apps في هذه المقالة يوجد شرح لأشهر التخصصات البرمجة وأشهر التقنيات ولغات البرمجة المستعملة في كل مجال، وكيفية اختيار لغة البرمجة التي تناسبك، مع بعض المصادر لتبدأ في التعلم:
    1 نقطة
  8. السلام عليكم, لتطبيق قائمة جانبية تتوسع بالضغط على زر معيين وتعود بالضغط عليه مرة أخرى قمت بالتالي : const toggleBtn = document.getElementById("toggle"); const navMenu = document.querySelector('aside'); const container = document.getElementById('container'); function toggleOn(){ if(toggleBtn.classList.contains('toggle-on')){ toggleBtn.classList.remove('toggle-on'); toggleBtn.classList.add('toggle-off'); navMenu.classList.remove('w-[75px]'); navMenu.classList.remove('rounded-[40px]'); navMenu.classList.add('w-[250px]'); navMenu.classList.add('rounded-[20px]'); container.classList.remove('left-[70px]'); container.classList.add('left-[250px]'); }else{ toggleBtn.classList.remove('toggle-off'); toggleBtn.classList.add('toggle-on'); navMenu.classList.remove('w-[250px]'); navMenu.classList.add('w-[75px]'); navMenu.classList.remove('rounded-[20px]'); navMenu.classList.add('rounded-[40px]'); container.classList.remove('left-[250px]'); container.classList.add('left-[70px]'); } لاحظوا أنني أكثرت الإستعلامات هل هاذا يؤدي إلى بطئ الموقع وهل هناك فكرة أخرى بديلة لتطبيقها ولاحظوا أيضا أنني قمت بغيير عرض الحاوية من left-[70px] عندما تكون القائمة الجانبية غير موسعة أي تبدأ الحاوية من 70px يسار أما عندما تتوسع القائمة الجانبية وتاخد 250px جعلتها جعلت الحاوية تبدأ من اليسار ب250px left-[250] container.classList.remove('left-[70px]'); container.classList.add('left-[250px]');
    1 نقطة
  9. بداية، يمكنك اختصار الشيفرات التالية: function toggleOn(){ if(toggleBtn.classList.contains('toggle-on')){ toggleBtn.classList.remove('toggle-on'); toggleBtn.classList.add('toggle-off'); navMenu.classList.remove('w-[75px]'); navMenu.classList.remove('rounded-[40px]'); navMenu.classList.add('w-[250px]'); navMenu.classList.add('rounded-[20px]'); container.classList.remove('left-[70px]'); container.classList.add('left-[250px]'); }else{ toggleBtn.classList.remove('toggle-off'); toggleBtn.classList.add('toggle-on'); navMenu.classList.remove('w-[250px]'); navMenu.classList.add('w-[75px]'); navMenu.classList.remove('rounded-[20px]'); navMenu.classList.add('rounded-[40px]'); container.classList.remove('left-[250px]'); container.classList.add('left-[70px]'); } لتصبح: function toggleOn(){ if(toggleBtn.classList.contains('toggle-on')){ toggleBtn.classList.remove('toggle-on'); toggleBtn.classList.add('toggle-off'); navMenu.classList.remove('w-[75px]' ,'rounded-[40px]'); navMenu.classList.add('w-[250px]' ,'rounded-[20px]'); container.classList.remove('left-[70px]'); container.classList.add('left-[250px]'); }else{ toggleBtn.classList.remove('toggle-off'); toggleBtn.classList.add('toggle-on'); navMenu.classList.remove('w-[250px]' ,'rounded-[20px]'); navMenu.classList.add('w-[75px]' ,'rounded-[40px]'); container.classList.remove('left-[250px]'); container.classList.add('left-[70px]'); } ثم ما الحاجة من كل هاته التلاعبات بشجرة الوثيقة؟ لما لا يكفي تغيير صنف واحد وليكن هو حاوي قائمة التصفح. قم بتبديل صنف واحد مثلا وليكن is-enabled function toggleOn(){ if(toggleBtn.classList.contains('toggle-on')){ navMenu.classList.add('is-enabled') }else{ navMenu.classList.remove('is-enabled') } أو حتى: function toggleOn(){ navMenu.classList.toggle('is-enabled') ثم تعامل مع الباقي عن طريق الـ css و tailwindCSS: .nav-menu { // اي تنسيقات } .nav-menu .toggle-btn{ // اي تنسيقات } .nav-menu .container{ // اي تنسيقات } .nav-menu.is-enabled { // اي تنسيقات } .nav-menu.is-enabled .toggle-btn{ // اي تنسيقات } .nav-menu.is-enabled .container{ // اي تنسيقات } او عن طريق sass: .nav-menu { // اي تنسيقات .toggle-btn{ // اي تنسيقات } .container{ // اي تنسيقات } &.is-enabled { // اي تنسيقات .toggle-btn{ // اي تنسيقات } .container{ // اي تنسيقات } } } يوجد قاعدة تسعى لتحسين تجربة الاستخدام تسمى Less Javascript, more HTML and CSS أي "اقل جافاسكربت ، اكثر HTML و CSS". حاول التقليل من الاعتماد على جافاسكربت كليا في اشياء يمكن القيام بها عن طريق css (رغم انها قادرة).
    1 نقطة
  10. بحسب الموقع الرسمي فإن هذه الخاصية غير مدعومة حتى الآن و لكن يتم دراسة إمكانية إضافتها في المستقبل، بدلاً عن ذلك يمكنك تحديد ميزانية معينة بحيث يتم تنبيهك عند الوصول إلى حد الميزانية الذي قمت بتحديده. يمكنك الوصول إلى ذلك من قسم الدفع Billing و من ثم القيام بإضافة ميزانية جديدة (في حال لم يكن لديك واحدة مسبقاً) و يمكنك من الخيارات تحديد حد معين عن الوصول إليه سيتم تنبيهك. بحسب الموقع فإن بعض المناطق يحدث فيها تأخر في إرسال التنبيه قد يصل إلى بضعة أيام.
    1 نقطة
  11. لدي مشكلة في معرفة العلامات التي اوضع للكود يعني قصدي اني لا استطيع حفظ متي تضع مثلا(,)او(:)مع اني فاهم الكود ولاكن في اغلب الاوقات يكون الخطأ من هذا فهل هذا عادي ام هناك خطأ في طريقة المذاكرة
    1 نقطة
  12. how to remove char from string with out using functions in لقد حاولت ان اقوم بأزالة char من ال string في سي بلس بلس و لم ينفع هذا هو كودي : string sss = " "; for (int i = 0; i <= 4; i++) { sss[i] = ''; cout << endl; } cout << sss;
    1 نقطة
  13. لا يتم الطباعة الى الconsole لعدم تحقق شرط المساواة ايضا بما انك تريد مقارنة متغيرين يحملان نفس نوع البيانات ( في هذه الحالة string ) لذا يفضل استعمال "===" بدل "==" بعد فحص الكود تبين ان المتغير pshirt يحتوي على مسافة بالاضافة الى القيمة المستحصلة عن طريق .innerText مثال: "Blue T-shirt" === " Blue T-shirt" هنا تكون نتيجة الشرط الذي وضعته false بالتالي لا يتم تنفيذ السطر 87 لحل المشكلة استعمل trim للتخلص من اي مسافات ملتصقة بالنص , فيكون كالتالي if( pshirt.trim() === ite ){ console.log("eee"); }
    1 نقطة
  14. تحيه طيبه للجميع هل يمكن تحديد سقف ميزانية الفايربيز من هلال برمجة تطبيقات flutter بحيث لو وصل السقف الفلاني يتم وقف النت عن التطبيق او شي من هذا القبيل؟في الخطه المدفوعه وهل الفاير بيز يعتبر خيار جيد لتطبيقات مثل تطبيق مستعمل واولكس والسوق المفتوح ؟
    1 نقطة
  15. كيفية نسخ عنصر div عند الضغط عليه يتحول الى نسخه اخرى وباالوان عشوائية وتتغير الخليفة عند الضغط عليه اريد فهم وتوضيج هذه الجزء
    1 نقطة
  16. بداية تحتاج كتابة كل الأشياء التي تتعلق بإستفسارك، ضع محاولتك، ضع شيء في السؤال يُمكن لأي مدرب أو من سيُجيب على سؤالك البدأ منه. يُمكن تقسيم سؤالك إلى 3 أجزاء: كتابة دالة تقوم بجلب سلسلة نصية تُمثل لون عشوائي، من خلال البحث في النت يمكن الوصول لهذه الدالة: function randColor() { return "#" + Math.floor(Math.random()*16777215).toString(16).padStart(6, '0').toUpperCase(); } console.log(randColor()) // #AF4229 كل مرة يتم إستدعاء الدالة تقوم بإرجاع لون جديد. بناء نقطة البدأ من تجهيز عُنصر div و إعطائه بعض التنسيقات المبدئية، تحديد العُنصر من خلال جافاسكربت و التسمع لحدث click لمُعالجته: Html: <div class="original"> </div> Css: div.original{ background-color: pink; height: 50px; border: 1px solid #333; margin-bottom: 10px; } JS: var originalDiv = document.getElementsByClassName('original')[0]; // تحديد العُنصر الاصلي originalDiv.addEventListener("click", cloneDiv); // التسمع لحدث الضغط على العُنصر /* دالة مُعالجة الحدث */ function cloneDiv() { console.log('cloned'); } الآن إذا ضغطت على العُنصر في كل مرة ستجد في القنصل عبارة cloned، المفروض هذا الجزء أنت من يقوم به، و ترفقه مع السؤال. كتابة منطق الدالة cloneDiv لمُعالجة حدث الضغط على الdiv الأصلي، سنستخدم التابع cloneNode لنسخ العُنصر، و الدالة randColor التي أنشأناها في الخطوة الأولى لتغيير اللون، و في الأخير نضيف العُنصر المنسوخ إلى ال body بإستخدام التابع appendChild : function cloneDiv() { let clonedDiv = originalDiv.cloneNode(true); // نسخ العُنصر الأصلي و الإحتفاظ به في متغير محلي clonedDiv.style.backgroundColor = randColor(); // تغيير لون الخلفية للعُنصر المنسوخ document.body.appendChild(clonedDiv); // إضافته لجسم الصفحة } يُمكنك تجربة المثال من خلال codepen على الرابط التالي:
    1 نقطة
  17. لا أتوقع أنه يوجد مثل ما تريد في فيربيز يمكنك الإطلاع على صفحة الأسعار للفيربيز من هنا
    1 نقطة
  18. في كل مرة تقوم باستدعاء باني الصفحة Page1 سيتم تهيئتها ببيانات جديدة، أي لايوجد ربط بين ما تم تمريره مسبقاً وما تقوم به الآن، الحل هو حفظ PID في Shared Preference وجلبه في الدخول الثاني للصفحة في حال تمرير اسم، وتعديله لكل مرة يتم الدخول ل PID أي تحديث القيمة القديمة
    1 نقطة
  19. في حال إمتلك المهارات التي تؤهلك لدخول سوق العمل جيداً ولديك احترافية عالية في المهارات ، بالطبع يمكنك البدء في البحث عن مشاريع والعمل عليها ، لكن كنصيحة لك لا تتسرع في دخول سوف العمل كون المنافسين كثر لذلك حاول بناء معرض أعمال جيد لك يساعدك في إيجاد عمل بشكل أسرع وليأخذ العميل فكرة جيدة عنك . أما بخصوص اللغة حسب طبيعة اللعمل هل يتطلب لغة إنجليزية أو لا ، لكن بكل الاحول يجب أن تكون لديك معلومات كافية اللغة الإنجليزية لتساعدك على التواصل وفهم العميل جيداً . هذه المقالات سوف تساعدك على فهم سوق العمل جيداً :-
    1 نقطة
  20. استخدام الخاصية loading قد يكون حلا كافيا في بعض المتصفحات الحديثة ولكن رغم هذا الا انه يفضل عمل مقاربة تشمل كامل المتصفحات. يمكنك تخزين الرابط المصدري للصورة في خاصية مخصصة ولتكن data-source ثم عن طريق الجافاسكربت تحديد كامل عناصر الصور في الوثيقة وحقن القيمة المخزنة بـ source داخل src حتى يتم تفسيرها من المتصفح بشكل عادي. وبالطبع فان هذا يكون بعد عرضها في الوثيقة او بالاستماع لحدث ما. <img src="" data-source="./path/to/img.png" alt="image title" /> يتم الاستعانة بمفهوم مراقبات التقاطع Intersection observers لخدمة هذا الغرض في الغالب. يمكنك بها التعرف ما ان كانت الصورة معروضة او لم يتم الانزلاق اليها بعد. يمكنك كطريقة تنظيمية انشاء اكثر من ملف نعم، ولكن يفضل استعمال محددات عناصر سليلة للتعرف على تلك الخاصة باللغة العربية وتلك الخاصة بلغات اخرى. مثال: @tailwind base; @tailwind components; @tailwind utilities; body { // تنسيقات عامة } body.rtl { // تنسيقات مخصصة عربية }
    1 نقطة
  21. لكي يتم إضافة التدوينات في الأقسام المحددة، تحتاج إلى تعديل الدالة lastPosts و الدالة createLastPosts وكذلك تحتاج إلى إنشاء مصفوفة عامة global بالشكل التالي: var IDs = []; function lastPosts(json) { var ID = IDs.shift(); // للحصول على أول عنصر في المصفوفة وحذفه من المصفوفة الأصلية // ... var printall = document.getElementById(ID); printall.innerHTML += printArticle; } function createLastPosts(url, count, printId) { IDs.push(printId); // لإضافة عنصر جديد إلى المصفوفة // ... } الآن يمكنك أن تقوم بتشغيل الدالة createLastPosts أكثر من مرة وسوف يتم إضافة التدوينات في الأماكن المحددة: <div class="container"> <div class="wrapper"> <div class="content"> <div id="demo1" class="show-sidebar grid grid-3"></div> <div id="demo2" class="show-sidebar grid grid-3"></div> <div id="demo3" class="show-sidebar grid grid-3"></div> </div> </div> </div> <script> createLastPosts('https://mo-222.blogspot.com', '1', 'demo1'); createLastPosts('https://mo-222.blogspot.com', '2', 'demo2'); createLastPosts('https://mo-222.blogspot.com', '3', 'demo3'); </script> طريقة أفضل لكن الطريقة السابقة متوقفة على ترتيب تنفيذ السكريبتات في المتصفح ولا يمكننا أن نضمن أن يتم تنفيذهم بالترتيب (قد يقوم المتصفح بتنفيذ السكريبتات حسب سرعة تحميل كل سكريبت) وبالتالي يمكن أن نجد أن التدوينات يتم إضافتها في أماكن عشوائية، ولحل هذه المشكلة يمكن أن تقوم بتجربة طريقة مختلفة عن إستخدام مصفوفة عامة، حيث نقوم بإضافة خاصية باسم data-position في كل عنصر script وتحمل id الخاص بالعنصر الذي سيتم إضافة التدوينات فيه، بالشكل التالي: function lastPosts(json) { // للحصول على الخاصية data-position من السكريبت الحالي (الذي قام بإستدعاء هذه الدالة) var ID = document.currentScript.getAttribute('data-position') // ... var printall = document.getElementById(ID); printall.innerHTML += printArticle; } } function createLastPosts(url, count, printId) { // ... ثم يتم إستدعاء الدالة createLastPosts بنفس الطريقة: <div class="container"> <div class="wrapper"> <div class="content"> <div id="demo1" class="show-sidebar grid grid-3"></div> <div id="demo2" class="show-sidebar grid grid-3"></div> <div id="demo3" class="show-sidebar grid grid-3"></div> </div> </div> </div> <script> createLastPosts('https://mo-222.blogspot.com', '1', 'demo1'); createLastPosts('https://mo-222.blogspot.com', '2', 'demo2'); createLastPosts('https://mo-222.blogspot.com', '3', 'demo3'); </script> الملف بعد تعديله: last-post.html
    1 نقطة
  22. يمكنك أن تستعمل الحزمة django-settings-export، حيث تمكنك من إستخدام متغيرات معينه من ملف settings.py داخل أي قالب template بشكل سهل للغاية. اولًا عليك تثبيت الحزمة من خلال الأمر التالي: pip install django-settings-export بعد ذلك يجب أن تقوم بإعداد ملف settings.py ليشمل الكود التالي: # هنا تخبر Django بأن يقوم بتشغيل هذه الحزمة في القوالب TEMPLATES = [ { 'OPTIONS': { 'context_processors': [ 'django_settings_export.settings_export', ], }, }, ] # هذا مثال لمتغير وسوف نستخدمه في القوالب MY_TEST_DATA = 'any content goes here'; # في هذا الجزء تقوم بكتابة المتغيرات التي تريد إستخدامها في القوالب # لاحظ ان المتغيرات تكتب بشكل نص SETTINGS_EXPORT = [ 'MY_TEST_DATA', ] بعد ذلك يمكنك ان تستخدم المتغير MY_TEST_DATA، كالتالي: <script>var customVar = '{{ settings.MY_TEST_DATA }}';</script> ويمكنك تغير كلمة settings لأي شيء آخر (في حالة حدوث تعارض مع حزمة أخرى)، من خلال عمل متغير SETTINGS_EXPORT_VARIABLE_NAME في ملف settings.py، كالتالي: # نقوم بإعطاء المتغير أي قيمة نصية # يجب ألا تحتوي على مسافات، فقط حروف لاتينية وعلامة _ SETTINGS_EXPORT_VARIABLE_NAME = 'my_config' # في القالب {{ my_config.MY_TEST_DATA }} في حالة كنت تستخدم Django بإصدار اقدم من 1.8 فيجب أن تستخدم الكود التالي لإعداد الحزمة: TEMPLATE_CONTEXT_PROCESSORS = [ 'django_settings_export.settings_export', ]
    1 نقطة
  23. يوجد مجموعة من الكتب الإنجليزية لتعلم بايثون ومنها: كتاب Think Python: كتاب مجاني ومناسب للمبتدئين، هو عبارة عن مقدمة لبرمجة Python للمبتدئين. يبدأ بالمفاهيم الأساسية للبرمجة، وهو مصمم بعناية لتحديد جميع المصطلحات عند استخدامها لأول مرة ولتطوير كل مفهوم جديد في تقدم منطقي. يتم تقسيم الأجزاء الأكبر حجمًا، مثل البرمجة الموجهة والكائنات العودية recursion إلى سلسلة من الخطوات الأصغر ويتم تقديمها على مدار عدة فصول. كتاب How to Code in Python: كتاب مجاني أيضًا، كتاب مقدم من شركة DigitalOcean (شركة مختصة في الإستضافة والتخزين السحابي)، تم تصميم هذا الكتاب ليتم استخدامه بطريقة منطقية بالنسبة للمبتدئ. بمجرد أن تتعرف على المفاهيم الأساسية المشروحة في الكتاب، يمكنك الاستمرار في استخدام الكتاب كمصدر مرجعي. كتاب Python for Everybody: الهدف من هذا الكتاب المجاني هو تقديم مقدمة في البرمجة. في هذا الكتاب يتم التركيز بشكل أكبر على استخدام Python لحل مشكلات تحليل البيانات الشائعة في عالم المعلوماتية. ملاحظة: تحتوي الأكاديمة على كتاب البرمجة بلغة بايثون، وهو كتاب مترجم إلى العربية مبني على كتاب «How to code in Python» ويأتي شارحًا المفاهيم البرمجية الأساسية بلغة بايثون، رُبط هذا الكتاب مع توثيق لغة بايثون في موسوعة حسوب لتسهيل عملية الاطلاع على أي جزء من اللغة مباشرة وقراءة التفاصيل باللغة العربية. كما يوجد مجموعة ضخمة من المقالات في Python يمكنك الإطلاع عليها من هنا (مقالات بايثون).
    1 نقطة
  24. يمكنك أن تقوم بعمل تجميع aggregation من خلال التابع count كالتالي: # يجب إستدعاؤ التابع أولًا # في حالة تم إستدعاء models مسبقًا فيمكنك أن تستخدمه أيضًا from django.db.models import Count result = (User.objects .values('role') .annotate(dcount=Count('role')).order_by() ) الكود السابق يقوم بتنفيذ جملة SQL التالية: SELECT role, COUNT(role) AS dcount FROM users GROUP BY role وسوف تكون النتيجة كالتالي: [{'role': 'Admin', 'dcount': 2}, {'role': 'User', 'dcount': 2}] إن أردت أن تحتوي النتيجة على أكثر من حقل، فيجب أن تقوم بإضافتهم إلى values كالتالي: .values('role', 'name', 'age') وهناك دائمًا حل آخر بديل وهو أن تقوم بتنفيذ جملة SQL فقط كالتالي: result = User.objects.raw('''SELECT * FROM users GROUP BY role''') لكن لا ينصح إستخدام هذا الحل، لأن جمل SQL المباشرة قد تؤدي إلى حدوث مشاكل أمنية وأخطاء غير متوقعه في كثير من الأحيان.
    1 نقطة
  25. في البداية يجب التفريق بين تحيليل البيانات Data analysis وعلم البيانات Data science، والواضح هو أن علم البيانات أشمل وأعم، ويمكن تعريف كل منهما كالتالي: علم البيانات Data science: هو التعامل مع البيانات الغير المنظمة، فهو مزيج من الإحصاءات، والرياضيات، والبرمجة، وحل المشكلات، وجمع البيانات بطرق مختلفة (مثل سحب البيانات web scraping أو الإقتراعات polls .. إلخ)، أي أنّه علم يضم جميع التقنيات التي تقوم بإستخلاص كل المعلومات من البيانات، وهو مفهوم يستخدم للتعامل مع البيانات الكبيرة Big Data، يغطي هذا المفهوم جوانب إعداد البيانات وتنظيفها وتحليلها. تحليل البيانات Data analysis: هو عملية فحص للبيانات الموجودة بهدف إستخلاص معلومات مفيدة، يمكن أن تكون لمعرفة أسباب أو تفسير لشيء من الماضي من أجل أهداف حاضرة أو مستقبلية، ويستلزم تحليل البيانات الخروج بإحصائيات للوصول إلى نتيجة معينة، يحتاج محلل البيانات لمعرفة كيفية العمل مع الأرقام، يُنظر إلى تحليلات البيانات على أنها أهم فرع في علوم البيانات. البيانات الضخمة Big Data: تُعتبَر البيانات الضخمة أنها كميات هائلة جدًا من البيانات تتزايد وتكبر بإستمرار، وليس من الممكن معالجة هذه البيانات أو حتى التعامل معها، وجمعها استنادًا على الطرق التقليدية بسبب كبر حجمها، حيث يتطلب هذا النوع من البيانات أساليب مُبتكرة لمعالجتها. وفي العادة يتم إستعمال هياكل البيانات Data Structure والخوارزميات Algorithms للتعامل معها. يجب أن يكون عالم البيانات على دراية بالأمور التالية: الرياضيات المتقدمة، مثل الجبر الخطي، والمصفوفات، والإحصاء. لغات البرمجة: بالطبع سيحتاج عالم البيانات أن يكون على دراية واسعة بأحد لغات البرمجة مثل Python و matlab أو R أو C++ إدارة البيانات: يجب أن يكون بإمكان كل عالم بيانات أن يدير البيانات وينظمها أو حتى أن يقوم بتجميعها من خلال العديد من الطرق، مثل سحب البيانات web scraping أو عمل إستطلاعات/إقتراعات Polls، حيث لن يكون تجميع البيانات بشكل يدوي وفردي عملي على الإطلاق. الخوارزميات وهياكل البيانات: من الضروري تعلم الخوارزميات وكيفية عملها وأشهرها مثل خوارزميات البحث والترتيب، وكذلك هياكل البيانات، لأن بدونها سيكون التعامل مع البيانات الضخمة Big Data أمرًا بطيئًا للغاية وغير عملي بالمرة. يتم تدريس الأمور السابقة في شكل مواد متعددة وتختلف تسمية وعدد المواد من جامعة إلى أخرى. إن لم يكن لديك معرفة مسبقة في البرمجة، فأنصحك بأن تبدأ بأحد الدورات التي تهيء لك الأمر في البداية، ويوجد العديد من الدورات التي تقدم هذا المحتوى منها المجاني والمدفوع، مثل دورة CS50 (دورة مجانية، تعد بداية جيدة لمن لا يتقن أي لغة برمجة) أو دورة علوم الحاسوب مقدمة من حسوب (دورة مدفوعة، تحتوي على أغلب التقنيات السابقة، مثل أساسيات البرمجة ولغة JavaScript و Python والخوارزميات وهياكل البيانات وغيرها). بعد ذلك يجب أن تتعمق أكثر في لغة برمجة مثل Python (الأكثر إستعمالًا في الوقت الحالي في علوم البيانات)، كما يجب أن تتقن الرياضيات مثل الجبر الخطي والإحصاء والتعامل مع المصفوفات (يوجد مجموعة المكتبات التي تساعدك في هذا الأمر مثل Numpy لبايثون). يمكنك أيضًا أن تبحث عن مشاريع مفتوحة المصدر على GitHub لقراءة الكود المصدر Source Code لمشاريع عديدة وكبيرة، مما يعطيك فكرة ممتازة عن كيفية عمل مشاريع من الصفر وكيف يتم تطويرها، كما قد تحصل على بعض أفكار لمشاريع مستقبلية من هذه الخطوة.
    1 نقطة
  26. لكي يعمل Django مع MySQL يجب تثبيت حزمة إضافةي وهي mysqlclient (لـ بايثون 3) أو mysql-python (لـ بايثون 2)، ويمكنك أن تقوم بتثبيتها من خلال الأمر التالي: pip install mysql-python # (python 2) pip install mysqlclient # (python 3) وإن كنت تستعمل نظام التشغيل لينكس (مبني على توزيعة Debian مثل Ubuntu أو Mint) فيمكنك أن تستخدم الأمر التالي: apt-get install python-mysqldb كما يجب عليك تعديل إعدادات المشروع لكي يستخدم MySQL من خلال ملف settings.py، كالتالي: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # تخبر Django بأن يستعمل محرك MySQL 'NAME': 'django', 'HOST': '', # نص فارغ يعني localhost 'PORT': '3306', 'USER': 'root', 'PASSWORD': '', } } ملاحظة: يمكنك حفظ معلومات المستخدم الخاص بقاعدة البيانات في ملف my.cnf على سبيل المثال، كالتالي: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'OPTIONS': { 'read_default_file': '/path/to/my.cnf', }, } }
    1 نقطة
  27. لتعلم برمجة تطبيقات الهواتف الذكية يجب عليك تحديد نظام التشغيل الذي ستقوم بإنشاء التطبيقات له (أندرويد أم iOS أم كلاهما معًا)، ولكل من الإختيارات الثلاثة السابقة لها لغات وتقنيات خاصة بها، كالتالي: أندرويد: ستحتاج إلى تعلم لغة مثل Java أو Kotlin لإنشاء تطبيقات أندرويد، وكذلك ستحتاج حساب مطور في متجر جوجل للتطبيقات (إن كنت تريد نشر تطبيقاتك في متجر Play) والذي يكلف 25$ تدفع مرة واحدة. iOS: اللغة الأكثر إستعمالًا لعمل تطبيقات iOS هي Swift ويمكنك أن تستعمل لغة object-c أيضًا، ولرفع تطبيقك على apple store ستحتاج إلى إنشاء حساب مطور بتكلفة 99$ سنويًا. Cross Platform: تطبيقات متعددة المنصات، أي أنه يمكنك أن تقوم بإنشاء تطبيق بلغة معينة وإطار عمل معين ومن ثم إستخدام التطبيق على كلا المنصتين (Android و iOS) وهذا الأمر يقلل تكلفة إنشاء التطبيقات، لأنك سوف تكتب كود واحد فقط، وسوف يعمل على كلا النظامين. تتزايد شعبية Flutter وReact Native حاليًا في إنشاء تطبيقات cross platform كما يمكنك أن تقوم بإنشاء تطبيقات هجينة عبر تقنيات الويب من خلال إستخدام لغات مثل HTML, CSS, Javascript وهي نوع من أنواع cross platform أي أنك تكتب كود واحد ويعمل على أكثر من نظام تشغيل، ويستخدم إطار العمل Cordova كثيرًا في هذا المجال. يمكنك التعرف أكثر حول الفرق بين أنواع التطبيقات من خلال هذا الفيديو: كما تحتوي الأكاديمية على الكثير من المقالات في كل مجال من المجالات السابقة، مثل مقالات حول لغة Java، ولغة kotlin، وبرمجة الأندرويد بشكل عام. أما بالنسبة للأمن السيبراني cyber security فسوف تحتاج إلى تعلم كل أساسيات البرمجة وكيفية إستخدام لغات مثل Python لإنشاء الأداوات المناسبة التي سوف تساعدك في إختبار الإختراق، كما أنه عليك تحديد المجال الذي تريد التخصص فيه (إختبار إختراق المواقع، أو أنظمة التشغيل أم إختبار إختراق شبكات .. إلخ)، بعد ذلك عليك دراسة كيف تعمل الأهداف التي تحاول حمايتها (مواقع، برامج، تطبيقات، ألعاب .. إلخ) حسب المجال الذي حددته. عليك أيضًا تعلم كيفية إستخدام نظام التشغيل Linux حيث أنه النظام الأكثر إستعمالًا في إختبار الإختراق، وأغلب خوادم الويب والشركات الكبيرة في العالم تستخدمه. تحتوي الأكاديمية على بعض الكتب التي قد تساعدك كثيرًا في مرحلة التعلم، مثل كتاب "البرمجة بلغة بايثون" و كتاب "دليل إدارة خواديم أوبنتو" (في حالة أردت أن تتخصص في مجال الويب)، بالإضافة إلى كثير من المواضيع المتقدمة في شكل مقالات في لغة Python.
    1 نقطة
  28. يمكن تطبيق البحث الثنائي في بايثون كالتالي: نقوم بعمل دالة search ونمرر لها القائمة ومن أين يبدء البحث وأين ينتهي وكذلك العنصر الذي نبحث عنه def search (lst, l, r, x): # نتحقق من القيمة الأولية # المتغير r يجب أن يكون أكبر من l if r >= l: # نستعمل علامة القسمة المزدوجة لجلب القيمة الصحيحة فقط mid = l + (r - l)//2 # نادرًا ما يكون العنصر في وسط القائمة لكن إن وجد نقوم بإرجاعه مباشرة if lst[mid] == x: return mid # إن كان العنصر المعطى أصغر من العنصر الموجود في وسط القائمة # فإنه سيكون موجودًا في الجزء الأيسر من القائمة elif lst[mid] > x: return search(lst, l, mid-1, x) else: # العنصر موجود في الجزء الأيمن return search(lst, mid + 1, r, x) else: # إن لم يكن العنصر موجود في القائمة من البداية نقوم بإرجاع -1 return -1 myList = [ 1, 2, 3, 4, 5, 6, 7, 8 ] x = 6 result = search(myList, 0, len(myList)-1, x) if result != -1: print (f"The Element is at {result}") else: print ("The List doesn't contain the element") لاحظي أن القائمة التي نقوم بتمريرها إلى دالة search يجب أن تكون مرتبة تصاعديًا لكي تعمل الدالة بشكل سليم، ويمكن ترتيب أي قائمة من خلال التابع sort كالتالي: cars = ['Ford', 'BMW', 'Volvo'] cars.sort() print(cars) # Output: ['BMW', 'Ford', 'Volvo']
    1 نقطة
  29. قدّمنا في الدرس السابق جافاسكريبت وذكرنا تموضعها في الوِب بالنسبة لـHTML وCSS، كما تحدّثنا عن واجهات برمجة التطبيقات الخاصّة بالمتصفّح وتلك القادمة من طرف ثالث. سنبدأ في هذا الجزء من الدرس النظر في بعض التعليمات البرمجية، وأثناء ذلك، يمكنك استكشاف ما يحدث فعليًا عند تشغيل شفرة جافاسكريبت في صفحتك. ما الذي تفعله جافاسكريبت على صفحتك؟ لنلخص بإيجاز قصة ما يحدث عند تنزيل صفحة وِب في المتصفح. عندما يُنزّل المتصفّح الشفرة التي كتبتها، والمكوّنة من وسوم HTML، أنماط CSS وتعليمات جافاسكريبت فإنه يشغّلها داخل بيئة تنفيذ (علامة تبويب Tab في المتصفح). تشبه هذه العملية المصنع الذي يأخذ المواد الخام (الشفرة) ويُخرج المنتح (صفحة وِب). يُنفّذ معالج جافاسكريبت JavaScript engine الموجود في المتصفّح تعليمات جافاسكريبت بعد أن تُجمَّع HTML وCSS وتوضعان في صفحة وِب. يضمن انتظار التجميع أنّ بنية الصفحة وتنسيقها موجودان بالفعل عند بدء تشغيل جافاسكريبت، أي أنه عند تشغيل جافاسكريبت تكون جميع تعليمات HTML وCSS موجودة ونفّذها المتصفّح. يعدّ هذا الأمر جيّدًا، إذ أن استخدام جافاسكريبت الشائع هو تعديل HTML و CSS ديناميكًيا لتحديث واجهة المستخدم، من خلال واجهة برمجة التطبيقات DOM التي تحدّثنا عنها في الدرس السابق؛ فإن نُزِّلت تعليمات جافاسكريبت وحاول المتصفّح تشغيلها قبل أن يكون هناك HTML و CSS فستحدث أخطاء. أمان المتصفح تعدّ كل علامة تبويب Tab في المتصفح دلوًا منفصلًا لتشغيل الشفرة (تسمى هذه الدلاء “بيئات التنفيذ” Execution environments من الناحية التقنية). يعني هذا أنه في معظم الحالات تُشغَّل الشفرة في كل علامة تبويب منفصلة عن الشفرات في بقية التبويبات، ولا يمكن للتعليمات البرمجية في علامة تبويب واحدة أن تؤثر مباشرة على التعليمات البرمجية في علامة تبويب أخرى - أو على موقع وِب آخر. هذا إجراء أمني جيد. لو لم يكن هذا هو الحال، لكان بإمكان القراصنة كتابة صفحات وِب مهمّتها سرقة المعلومات من المواقع الأخرى التي يزورها المتصفّح، وغيرها من هذه الأشياء السيئة. ملاحظة: هناك طرق لإرسال التعليمات البرمجية والبيانات بين مواقع وِب / علامات تبويب مختلفة بطريقة آمنة، ولكن هذه تقنيات متقدمة لن نغطيها في هذا الدرس. جافاسكريبت قيد التشغيل عندما يواجه المتصفح كتلة تعليمات برمجية من جافاسكريبت، فإنه يعمل بالترتيب، من أعلى إلى أسفل. وهذا يعني أنك تحتاج إلى توخي الحذر في الترتيب الذي تضعه فيه. على سبيل المثال، في شفرة جافاسكريبت التي شاهدناها في المثال الأول: var para = document.querySelector('p'); para.addEventListener('click', updateName); function updateName() { var name = prompt('Enter a new name'); para.textContent = 'Player 1: ' + name; } قمنا باختيار فقرة نصية (السطر 1)، ثم استدعينا مستمع الحدث Event listener بتطبيق التابعaddEventListener على الفقرة النصية المُخزَّنة في المتغيّر para (السطر 3)؛ لذا عندما يُنقر على النص تُشغَّل كتلة التعليمات البرمجية في الدالة updateName(). تُسمّى كُتلة التعليمات البرمجية القابلة لإعادة الاستخدام باستدعاء اسمها “وظائف” أو “دوال” Functions. يُطلب من المستخدم اسم جديد ثم يُدرَج هذا الاسم في الفقرة لتحديث العرض. إذا بدّلت ترتيب أول سطرين من التعليمات البرمجية، فإن الشفرة البرمجية لن تعمل . ستحصُل بدلا من ذلك خطأ في وحدة تحكم المتصفح الخاصة بالمطورين Console: -TypeError: para is undefined. وهذا يعني أن الكائن para غير موجود بعد، لذلك لا يمكننا إضافة مستمع الحدث إليه. ملاحظة: هذا خطأ شائع جدًا. يجب أن تكون حذرًا أن الكائنات Objects المشار إليها في التعليمات البرمجية موجودة قبل محاولة استخدامها. الفرق بين التعليمات البرمجية المفسَّرة Interpreted و المُترجَمة Compiled لابد وأنك سمعت في سياق البرمجة بمصطلحيْ التفسير Interpretation و الترجمة Compilation. جافاسكريبت هي لغة مفسَّرة. تُشغَّل تعليمات جافاسكريبت البرمجية من أعلى إلى أسفل وتُرجَع نتيجة تشغيل التعليمات البرمجية على الفور. لست بحاجة لتحويل التعليمات البرمجية إلى شكل مختلف قبل أن يقوم المتصفح بتشغيلها. من ناحية أخرى، تُحوَّل الشفرة البرمجية للغات المترجمة إلى شكل آخر قبل أن يشغّلها الحاسوب. على سبيل المثال تُجمَّع C / C ++ في لغة Assembly التي يُشغّلها الحاسوب. لكلّ من المنهجيْن ميزات، لكنّها خارج نطاق هذا الدرس. جانب الخادوم Server Side و جانب العميل Client Side لابد وأنك سمعت بمصطلحي من جانب الخادوم وجانب العميل، خاصة في سياق تطوير الوِب: الشفرة من جانب العميل Client side هي شفرة تُشغَّل على حاسوب المستخدم. يُنزّل العميل التعليمات البرمجية التي ينفّذها المتصفّح ليعرض صفحة الوٍب. سنتحدّث في هذا الدرس عن جافاسكريبت من جانب العميل. من ناحية أخرى تُنفَّذ شفرة جانب الخادوم على الخادوم، ثم تُرسَل نتيجة التنفيذ إلى المتصفّح ليعرضها. مثال على لغات الوِب الشائعة من جانب الخادوم PHP وبايثون وروبي و ASP.NET. وجافاسكريبت! يمكن أيضا استخدام جافاسكريبت كلغة من جانب الخادوم، على سبيل المثال في بيئة Node.js الشائعة. يُستخدم مصطلح ديناميكي Dynamic لوصف كل من جافاسكريبت من جانب العميل واللغات من جانب الخادوم. تشير كلمة ديناميكي إلى القدرة على تحديث عرض صفحة الوِب أو التطبيق لإظهار أشياء مختلفة في ظروف مختلفة، وتوليد محتوى جديد حسب الطلب. تُنشِئ الشفرة من جانب الخادوم ديناميكيا محتوى جديدًا على الخادوم، سحب بيانات من قاعدة بيانات على سبيل المثال؛ في حين أن جافاسكريبت من جانب العميل تُنشِئ ديناميكيا محتوى جديدًا داخل المتصفح (العميل)، على سبيل المثال إنشاء جدول HTML جديد، وإدراج البيانات المطلوبة من الخادوم في ذلك الجدول، ثم عرض الجدول في صفحة وِب للمستخدم. يعمل المنهجان معًا عادة. يشار إلى صفحة الوِب التي لا يوجد بها محتوى ديناميكي بأنها ثابتة Static، حيث يظهر دائما نفس المحتوى بغضّ النظر عن الزائر. كيف تضيف جافاسكريبت إلى صفحتك؟ يتم تطبيق جافاسكريبت على صفحة HTML بطريقة مشابهة لـ CSS. في حين تستخدم CSS عناصر <link> لتطبيق الأنماط الخارجية وعناصر <style> لتطبيق الأنماط الداخلية على HTML، تحتاج جافاسكريبت إلى صديق واحد فقط في عالم HTML، العنصر <script>. دعونا نتعلم كيفية العمل. جافاسكريبت داخلي أنشئ مستند HTML بالمحتوى التالي <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <title>مثال تطبيقي لجافاسكريبت</title> </head> <body> <button>انقر هنا</button> </body> </html> </html> استعرض الملف في متصفح الوِب وفي محرر النصوص. سترى أن HTML أنشأت صفحة وِب بسيطة تحتوي على زر قابل للنقر. بعد ذلك، انتقل إلى محرر النصوص وأضف ما يلي مباشرة قبل وسم الإغلاق <body/>: <script> // سنضع تعليمات جافاسكريبت هنا </script> سنضيف الآن بعض جافاسكريبت داخل عنصر <script> لجعل الصفحة تفعل شيئا أكثر إثارة للاهتمام. أضف الشفرة التالية أسفل السطر // سنضع تعليمات جافاسكريبت هنا مباشرة: function createParagraph() { var para = document.createElement('p'); para.textContent = 'لقد نقرت على الزرّ!'; document.body.appendChild(para); } var buttons = document.querySelectorAll('button'); for (var i = 0; i < buttons.length ; i++) { buttons[i].addEventListener('click', createParagraph); } احفظ الملف في محرّر النصوص ثم حدّث الصفحة على المتصفح. يجب أن الآن أن تظهر فقرة جديدة أسفل الزّر عند النقر عليه. ملاحظة: إذا لم يعمل المثال الخاص بك، راجع الخطوات مرة أخرى وتحقق من أنك فعلت كل شيء بشكل صحيح. هل حفظت الملف بامتداد html (مثلا lesson1.html)؟ هل أضفت العنصر <script> بعد علامة <body/> مباشرة؟ هل أدخلت جافاسكريبت تماما كما هو موضح؟ جافاسكريبت حساسة لحالة الأحرف +(صغيرة Lowercase أو كبيرة Uppercase)، لذلك تحتاج إلى إدخال الشفرة تماما كما هو مبين، وإلا فلن تعمل. جافاسكريبت خارجي ماذا لو أردنا وضع جافاسكريبت لدينا في ملف خارجي؟ دعونا نستكشف هذا الآن. أولا، أنشئ ملفًا جديدا في نفس المجلّد الذي يوجد به ملف HTML وسمّه script.js. تأكد من أنه يحتوي على امتداد اسم الملفjs، وهذه هي الطريقة التي يُتعرَّف بها على أننا أمام ملف يحوي شفرات برمجية مكتوبة بجافاسكريبت. بعد ذلك، انسخ كل النص البرمجي من الوسم <script> في ملف HTML (تلك التعليمات الموجودة في الخطوة 4 من الفقرة السابقة) وألصقه في الملف script.js ثم احفظ هذا الملف. الآن استبدل العنصر الحالي <script> بما يلي. <script src="script.js"></script> يصبح محتوى الملف HTML على النحو التالي: <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <title>مثال تطبيقي لجافاسكريبت</title> </head> <body> <button>انقر هنا</button> <script src="script.js"></script> </body> </html> احفظ الملفّ ثم حدّث صفحة الوِب في المتصفح. ويجب أن تحصُل على نفس النتيجة تمامًا! ولكن الآن لدينا جافاسكريبت في ملف خارجي. يعدّ هذا عموما أمرا جيّدًا من حيث تنظيم التعليمات البرمجية الخاصة بك، وجعلها قابلة لإعادة الاستخدام عبر ملفات HTML متعددة. بالإضافة إلى HTML تصبح أسهل للقراءة دون وجود قطع ضخمة من السكربت ملقاة فيها. شفرات جافاسكريبت المضمنة في وسوم HTML تُكتَب شفرة جافاسكريبت أحيانا داخل HTML على النحو التالي: function createParagraph() { var para = document.createElement('p'); para.textContent = 'You clicked the button!'; document.body.appendChild(para); } <button onclick="createParagraph()">Click me!</button> استعرض المثال على Jsfiddle لهذا العرض التوضيحي نفس الوظائف التي عرضناها في الحالتيْن أعلاه، إلا أن عنصر <button> يتضمن خاصيّة onclick مضمنة لتشغيل وظيفة الدالة عند الضغط على زر. رجاءً لا تضمّن شفرات جافاسكريبت في وسوم HTML فهذه الطريقة من الممارسات السيئة (خلط HTML مع جافاسكريبت)، كما أنها غير فعالة لأن عليك أن تدرج الخاصيّة onclick="createParagraph()" على كل زر تريد تطبيق جافاسكريبت عليه. أما باستخدام شفرة جافاسكريبت منفصلة عن HTML فيمكنك تحديد كافة الأزرار باستخدام تعليمة واحدة. الشفرة التي استخدمناها أعلاه لهذا الغرض تبدو كما يلي: var buttons = document.querySelectorAll('button'); for (var i = 0; i < buttons.length ; i++) { buttons[i].addEventListener('click', createParagraph); } قد يبدو هذا الأمر أطول قليلا من الخاصيّة onclick، ولكنه سيعمل على جميع الأزرار بغض النظر عن عدد الأزرار الموجودة في الصفحة وعدد العناصر التي أُضيفت أو أزيلت، فلا يلزم تغيير جافاسكريبت. ملاحظة: جرب تعديل ملف HTML وإضافة بضعة أزرار أخرى في الملف. عند إعادة التحميل، يجب أن تجد أن جميع الأزرار عند النقر عليها سوف تُظهر فقرة. هذا رائع أليس كذلك؟ التعليقات Comments كما هو الحال مع HTML و CSS، يمكنك كتابة تعليقات في شفرة جافاسكريبت وسيتجاهلها المتصفح. تُستخدم التعليقات لتقديم توضيحات لزملائك المطورين عن كيفية عمل الشفرة، كذلك تمثل مرجعًا لك عن التعليمات البرمجية التي كتبتها عندما تعود مثلًا بعد 6 أشهر لتتذكر مالذي فعلته. التعليقات مفيدة جدًا، ويجب عليك استخدامها في كثير من الأحيان، وخاصة بالنسبة للتطبيقات الكبيرة. هناك نوعان من التعليقات: تعليقات من سطر واحد، وتُكتَب بعد عموديْن مائليْن؛ مثلا: // هذا تعليق تعليق متعدّد الأسطر. يُكتَب بين المحارف / * و * / على النحو التالي: /* هذا تعليق هو الآخر */ تطبيق التعليقات على تعليمات جافاسكريبت السابقة: // دالة تنشئ فقرة جديدة وتضيفها إلى نهاية متن الصفحة function createParagraph() { var para = document.createElement('p'); para.textContent = 'You clicked the button!'; document.body.appendChild(para); } /* 1. نحصُل على مراجع بجميع الأزرار الموجودة في الصفحة ونضعها في مصفوفة 2. نمرّ على جميع الأزرار ونضيف إلى كلّ منها مستمعًا لحدث النقر تُنفَّذ الدالة ()createParagraph عندما ينقر على زرّ في الصفحة. */ var buttons = document.querySelectorAll('button'); for (var i = 0; i < buttons.length ; i++) { buttons[i].addEventListener('click', createParagraph); } كانت هذه خطوتك الأولى في عالم جافاسكريبت. لقد بدأنا بالمفاهيم النظرية فقط لجعلك تفهم لماذا تُستخدم جافاسكربت وما الأشياء التي يمكنك القيام بها باستخدام هذه اللغة. تعرّفت في هذا المقال على بضعة أمثلة من التعليمات البرمجية وتعلّمت كيفية تتفاهم لغةُ جافاسكريبت مع بقية التعليمات البرمجية على موقع الوِب. قد تبدو الآن جافاسكريبت شاقة بعض الشيء، ولكن لا تقلق - في هذه السلسلة من الدروس سوف نأخذك في خطوات بسيطة تمكّنك من المضي قدمًا في عالم جافاسكربت. ترجمة - بتصرف - للمقال What is JavaScript? الذي اشترك في كتابته مساهمو موزيللا.
    1 نقطة
  30. سيكون عليك تعلم جافاسكربت في البداية، ففهم المبادئ فيها أمر أساسي جدا. المرحلة الثانية هي تقدير كم من الوقت تملك وماهي قدرتك على التعلم. حاليا يوجد العديد من المصادر لـ AngularJS وهي أكثر بكثير من مصادر ReactJS هذا لأنه قبل سنة لم يكترث الكثير من الناس إلى ReactJS أما الآن فمطوروا ReactJS المحترفيين هم عملة نادرة. إن لم تكن تملك مشكلة في مصادر التعلم، بمعنى طالما لا تمانع قراءة الكتب وتوثيق اللغات لتعلم لغة ما فأنت للآن في مكان جيد لاختيار ReactJS لكن سيكون عليك لاحقا التضحية بالشعبية الحالية لـ angularJS مقابل الشعبية المتزاية لإطار ReactJS في وقت كتابة هذا الجواب، Angular تملك 42 ألف نجمة في github أما بالنسبة لReact فهي 28 ألف لكن شعبية React في تزايد مع الوقت، ومع وقت انتهائك من التعلم سيكونان في نفس المرتبة، لذا لا مشكلة هنا، الفرق سيكون كما قلنا من مصادر التعلم والإضافات. نقطة أخرى وهي، إن كانت لك خبرة في أيّ مكتبات أخرى مثل backbone أو ember أو knockout فتعلم React سيكون سهلا، والعكس صحيح، فهي شبيهة لهذه المكتبات، على عكس Angular التي تختلف عنهم في الكثير من الأمور، لذا الانتقال صعب في تلك الحالة. نقطة أخيرة أحب التنويه لها هي أنّ react تشكل جزء view فحسب من mvc بمعنى أنه إذا أردت التعامل مع بيانات خارجية فيجب عليك الاستعانة بمكتبات خارجية، مثل Flux. لكن React في حالة تقدم ممتاز مؤخرا، فـ facebook قدمت مؤخرا React Developer Tools وهي أداة رائعة لمساعدة التطوير ب React عبر المتصفح. ملاحظة أخيرة وهي أن react تكتب بواسطة JSX وهي نسخة مطورة قليلا من JS وسيكون عليك الاستعانة بمترجم لاستخدامها من المتصفح مباشرة. لا أحب أن يكون ردي حياديا، فالحيادية ليست مفيدة دوما، أنا أقترح عليك تعلم React ولكن أنصحك بقوة بإلقاء نظرة على كل من الإطارين وتجربة بناء شيء بسيط بهما (todo list) حتى تعرف أي واحد منهم سيساعدك أكثر
    1 نقطة
×
×
  • أضف...