-
المساهمات
2358 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
24
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Kais Hasan
-
يمكنك إضافة خاصية إلى الغرض الذي تريده فيها الوقت الذي تم إنشاءه، و من ثم يمكن القيام بكتابة مهمة دورية تقوم بالتحقق فيما إذا كان هنالك غرض قد تجاوز المدة أم لا. مثلاُ في حالتك نضع للغرض الذي يمثل الستوري وقت الإنشاء و نقوم بكتابة مهمة دورية مثلاً كل 10 دقائق أو حسب الرغبة تقوم بالمرور على الستوريات لل users و تحذفها في حال تجاوزت الوقت المحدد. يمكن القيام بذلك عن طريق مكتبة تسمى cron و هي مشابهة في العمل لل cron في نظام linux يمكن كتابتها بالشكل التالي: var cronJob = require("cron").CronJob; // هذه المهمة ستقوم بالتنفيذ كل 10 دقائق new cronJob("* /10 * * * *", function() { // نقوم بوضع الكود الذي نريد تنفيذه هنا }, null, true); يمكنك الإطلاع على تفاصيل هذه المكتبة هنا.
- 4 اجابة
-
- 1
-
يمكننا استعمال التابع setInterval و هو أحد توابع ال javascript يقوم هذا التابع باستدعاء تابع معين بعد وقت محدد. هذا التابع يقوم بتنفيذ التابع الذي نريده بشكل دوري، أي مثلاً في حال وضعنا له ثانيتين فسيقوم بتنفيذ التابع الذي نعطيه له كل ثانيتين. في حال أردنا التنفيذ مرة واحدة فيمكننا استعمال التابع setTimeout و هو مشابه للتابع السابق ما عدا أنه يقوم بالاستدعاء مرة واحدة فقط. يمكن كتابة التوابع السابقة بالشكل التالي: setInterval( function(){ alert("Hello") }, 3000 ); setTimeout( function(){ alert("Hello") }, 3000 ); في حال أردنا حذف تابع من غرض فيمكننا تزويد هذه التوابع بتابع يقوم بذلك و هي ستقوم باستدعاءه.
- 4 اجابة
-
- 1
-
في حال كنت على علم بإحدى لغات البرمجة و تقوم بالإنتقال لتعلم لغة جديدة و تريد معرفة أهم المكتبات، فإنه من المفترض أنك كتبت برامج في تلك اللغة و احتجت إلى وظائف معينة تؤديها لك تلك اللغة، على سبيل المثال التعامل مع الملفات على القرص الصلب، و بالتالي تقوم بالبحث عن ما يؤدي تلك المهمة في تلك اللغة. في حال لم تكن على علم بأي لغة فإنه من المفيد أن تقوم بأخذ دورة تتعلق بتلك اللغة، حيث أن الدورات بشكل عام تحتوي على أهم المكتبات الضرورية للعمل باللغة، يمكنك مثلاً الإطلاع على دورات حسوب من هنا. كما يمكنك أن تقوم بالبحث في مواقع الأسئلة و فلترة النتائج حسب اللغة التي تريدها و بالتالي يمكنك أن ترى ما الذي يقوم المبرمجون الآخرون بالسؤال عنه و بالتالي معرفة بعض المكتبات المهمة.
-
بما أنه لدينا إشعارات و مستخدمين، و هناك إشعارات تصل إلى عدة عملاء و عملاء يتلقون أكثر من إشعار، فإنه لدينا هنا علاقة متعدد لمتعدد. بالتالي أفضل طريقة للقيام بذلك هو إنشاء جدول لهذه العلاقة بحيث تحوي على المفتاح الرئيسي الذي يمثل العميل (أي المفتاح الرئيسي لجدول العملاء) بالإضافة للمفتاح الرئيسي لجدول الإشعارات، و بالتالي يمكننا في هذا الجدول تخزين هذه المعلومات. يمكن مثلاً في حال رأى مستخدم إشعاراً ما أن تضيف البيانات المطلوبة إلى هذا الجدول، أي المفتاح الرئيسي لهذا المستخدم بالإضافة إلى المفتاح الرئيسي للإشعار. بذلك عندما تريد تنبيه أي مستخدم يمكن في البداية البحث في هذا الجدول و استثناء أي إشعارات مرتبطة بهذا المستخدم في هذا الجدول. طريقة أخرى أن تخزن في هذا الجدول كافة الإشعارات، و عندما يرى مستخدم إشعار ما، تقوم بحذف السطر الذي يوافق المفتاح الرئيسي للمستخدم و المفتاح الرئيسي للإشعار. في كلتا الطريقتين الجدول الذي ستقوم بإنشاءه سيكون المفتاح الرئيسي له مركب من العمود الذي يمثل المفتاح الرئيسي للمستخدم و العمود الذي يمثل المفتاح الرئيسي للإشعار.
- 3 اجابة
-
- 1
-
في أغلب الأحيان يمكن تحويل نفس الفكرة الخاصة بالتابع الذي يستدعي نفسه إلى حلقة تكرارية. يمكننا أن نقوم بالعمليات مستوى مستوى، أي أن نقوم في البداية بفك أول مستوى ثم ثاني مستوى و هكذا حتى النهاية. كيف سنعلم أننا انتهينا؟ يمكننا تخزين ذلك في متحول في حال قمنا بفك أي شيء نقوم بإسناد قيمة معينة إليه تدلنا على ذلك، و في حال انتهينا و لم نسند له شيء فهذا يدل على أننا لم نقم بفك أي مصفوفة و بالتالي انتهينا من فك كل المستويات. أحد الطرق لكتابة الكود السابق هو كالتالي: a = [[1, 2], [3, 4, [5, 6, [7]], 8], 9, [10, 11, [12, [13, [14], 15], 16], 17]] while True: flg = True new_a = [] for item in a: if type(item) is list: flg = False new_item = item else: new_item = [item] new_a.extend(new_item) a = new_a if flg: break print(a) هنا نقوم بكتابة حلفة لا نهائية أي أنها ستظل تكرر نفسها، و لكن سنستعمل break لإيقافها عند تحقق شرط ما. في البداية نقوم بتخزين قيمة True في متحول للدلالة على أننا انتهينا، و في حال قمنا بأي تعديل سنعدل قيمته إلى False أي أننا لم ننته. أيضاً نقوم بتعريف مصفوفة جديدة لتخزين الناتج فيها. بعد ذلك من أجل كل عنصر في المصفوفة الأصلية، في حال كان النمط الخاص بهذا العنصر هو list نقوم بتعديل قيمة flg إلى False للدلالة على أننا سنحتاج إلى فك عنصر و نترك العنصر كما هو (سنرى لماذا بعد قليل). في حال لم يكن list فنقوم بوضعه في list. لقد قمنا بالعملية السابقة لتسهيل كيفية الإضافة إلى المصفوفة الجديدة، حيث يمكننا الآن استدعاء التابع extend فقط، و هو سيضيف كافة العناصر إلى المصفوفة الجديدة، أي في حال كان العنصر بالأصل list سيقوم بإضافة العناصر داخل هذه ال list و في حال لم يكن كذلك سيضيف العنصر كما هو. في النهاية نقوم بتحديث المصفوفة a إلى المصفوفة الجديدة, و نختبر فيما إذا كان يجب علينا إنهاء الحلقة أم لا. بالطبع يمكننا تحسين الكود السابق ليصبح أسرع، سأترك لك هذه المهمة لتحاول فيها و يمكنك السؤال مجدداً في حال لم تستطع ذلك.
- 2 اجابة
-
- 1
-
إن موقع codewars مبني على فكرة تطوير مهارة ال problem solving أي حل المشكلات، و هي مهارة عامة لا ترتبط بلغة برمجة محددة و لكن يتم تقييمها عن طريق لغات البرمجة، فنفس المسألة يمكنك حلها باللغة التي تريد بشكل عام. حتى تستطيع حل المشاكل في مثل هذه مواقع عليك التدرب على هذه المهارة، و أفضل طريقة للقيام بذلك هي متابعة المحاولة في حل المسائل، و المسألة التي لا تعرف حلها يمكنك النظر إلى حلها (عن طريق ال tutorial). و في غضون اسابيع ستجد نفسك قادراً على حل المشاكل البسيطة و إذا تابعت التدريب ستصبح قادراً على حل مشاكل أصعب بكثير. بضع نصائح قد تساعدك أيضاً في هذه العملية: اقرأ المسألة جيداً في البداية و تأكد أنك فهمتها تماماً، يفضل أن تقرأها مرتين لضمان ذلك. ابتعد عن شاشة الحاسوب و أمسك قلماً و ورقة و حاول كتابة بعض الأمثلة و حلها بطريقة عادية كأنها لغز لا أكثر. حاول التفكير بالكثير من الأفكار في البداية ثم اختار واحدة منها، لا تذهب إلى فكرة واحدة مباشرة. بعد أن تكون قد اخترت فكرة و تعتقد أنها صحيحة، فكر لمدة دقيقة في الطريقة التي ستكتب بها الكود، أي فكر في هيكيلية الكود، و عندما يصبح الهيكل العام واضحاً في مخيلتك اذهب و اكتب الكود. في حال أنك لم توفق في إيجاد فكرة الحل، حاول تبسيط المسألة قليلاً و فكر هل يمكن لحل مسألة أبسط أن يعطيك فكرة عن كيفية حل المسألة الأصلية، أيضاً حاول إيجاد ملاحظات معينة في المسألة مثلاً عندما يكون كذا و كذا فإنه كذا، و لو أن ذلك لا يشكل الحل الكلي و لكن ذلك سيساعدك في عملية التفكير. بالتوفيق، و أنصحك بالمتابعة بالحل على هذا الموقع، فمهارة ال problem solving من أهم المهارات في مجالنا، و عندما تصبح جيداً فيها ستجد نفسك أسرع و أفضل في كتابة أي كود أو تعلم أي شيء.
- 2 اجابة
-
- 1
-
إن كل من المبرمج و مهندس البرمجيات يعمل في تطوير البرامج و هما مكملان لبعضهما. كل منهما له واجبات مهمة في عملية بناء و تطوير و اختبار البرمجيات و لكن تختلف طرق الإسهام لكل منهما في هذه العملية. في العادة مهندس البرمجيات تكون مهامه تتطلب معرفة متقدمة في علوم الحاسب و المهارات الهندسية بما يتضمن البرمجة، على عكس المبرمج الذي يكفي أن يملك معرفة بالبرمجة. بشكل أدق يمكن تحديد بعض مهام مهندس البرمجيات كالتالي: تحليل متطلبات العميل و تحديد كيف من الممكن للبرمجية التي سيتم تطويرها أن تلبي هذه المتطلبات. التواصل مع العملاء و رؤوس الأموال و إطلاعهم على سير العمل و التطورات الحاصلة. توجيه المبرمجين للتقنيات التي يجب استعمالها و الميزات التي يجب إضافتها إلى البرنامج. اختبار البرنامج للتأكد من خلوه من الأخطاء و أنه يعمل بالكفاءة المطلوبة. بينما يمكن تحديد بعض مهام المبرمج كما يلي: فهم و كتابة الأكواد بعدة لغات برمجية. تحديث و بناء البرامج. اختبار الكود بشكل بسيط (أي أنه يعمل) قبل إرساله إلى مهندس البرمجيات لاختباره بشكل أكثر شمولية. إصلاح الأخطاء في البرامج. توثيق العمل الذي يقوم به حتى يمكن لمهندس البرمجيات الإطلاع على العملية بشكل أسرع.
-
أين وضعت الاستعلام؟ في الخانة الموجودة في الصورة التي أرفقتها يجب وضع رابط فقط، و أنت (أو صاحب الخدمة أو أي شخص مسؤول عن ال backend للموقع) يجب أن تقوم بإنشاء endpoint على هذا الرابط تقوم بالمهمة المطلوبة، و وضع الرابط فقط في هذه الخانة. أعتقد أنه يجب عليك التواصل مع صاحب الاستضافة لإضافة هذا الرابط بالمهمة التي تريدها.
- 5 اجابة
-
- 1
-
لقد قمت بالإطلاع على الموقع، و يبدو أن هذا المجدول لا يقوم إلا باستدعاء رابط كل فترة زمنية محددة (و التي أنت تقوم بتحديدها)، أي في تصميم الموقع يجب وضع رابط يمثل endpoint استدعاءها يؤدي إلى تنفيذ مهمة معينة تقوم بكتابتها بال php. لا أعلم إن كنت تستطيع الوصول إلى ذلك و لكن هذا ما يوفره المجدول في هذه الخدمة التي تستعملها، فقط رابط يتم استدعاءه.
- 5 اجابة
-
- 1
-
يمكن استعمال crontab للقيام بذلك. ذلك عن طريق ملف فيه المهام المجدولة، نضع المعلومات الزمنية الخاصة بالجدولة (متى نريد لهذه المهمة أن تتنفذ) و هذه المهام قابلة للتكرار أو يمكن أن تكون لمرة واحدة (سأوضح كيف في النهاية). هذا الملف له قالب معين و هو كالتالي: * * * * * command إن أول نجمة نضع فيها الدقيقة و الثانية تدل على الساعة و الثالثة على اليوم في الشهر (أي مثلاً نريدها أن تقوم بالتنفيذ في أول الشهر فنضع القيمة 1 هنا) و الرابعة على الشهر و الخامسة على اليوم في الأسبوع (بحيث يكون الرقم 0 يعبر عن يوم الأحد). يمكن أن نترك قيمة إحداها ك * و هكذا نقول أننا نريد التنفيذ بغض النظر عن قيمة هذا المتغير. و command هي التعليمة التي نريدها، مثلاً يمكن كتابة التعليمات التي نريدها في ملف sh و تنفيذ هذا الملف هنا. مثلاً في حال كنا نريد مهمة أن تتنفذ كل يوم في الساعة 12 يمكننا وضع التالي: 0 12 * * * command يمكن الدخول إلى هذا الملف (الذي نضع فيه المهام المجدولة) باستعمال التعليمة: crontab -e حيث أنها تقوم بفتح الملف للتعديل في حال وجوده أو إنشاء ملف جديد و فتحه في حال لم يكن موجود من الأصل.
- 5 اجابة
-
- 1
-
إن تغيير الكود لوحده لا يغير عمل الموقع، حتى عند العمل على جهازك، عندما تقوم بتعديلات معينة في الكود فإن الموقع لن يتغير حتى تقوم بإعادة تشغيل السيرفر. بعض التغييرات لا تحتاج ذلك (مثل بعض التعديلات على ال templates) و لكن أغلب التغييرات تحتاج عملية إعادة التشغيل. أيضاً ينصح باستعمال ال containers باستعمال ال docker لتجنب مشاكل الاختلافات بين بيئة التطوير و بيئة ال production، حيث أنه في تلك الحالة تقوم فقط برفع ال image و كل شيء سيعمل كما عمل في بيئة التطوير. استعمال ال docker سهل و ليس صعب، حيث أن أغلب التعليمات التي تقوم بكتابتها كل مرة ستقوم بكتابتها في ملف اسمه Dockerfile و في كل مرة يتم فيها إعادة بناء ال image سيتم تنفيذ هذه التعليمات تلقائياً، هذا يضمن أيضاً أن بيئتك هي نفسها في كل مرة و أنك لم تنسى أي شيء لم تقم بتنفيذه. كما أن ذلك يسرع عملية ال deploy بشكل كبير.
- 1 جواب
-
- 1
-
إن العمل على github أو أي مخزن لل repositories يتوجب عليك اتباع خطة معينة للعمل و إلا فإنه سيحدث الكثير من التعارضات. بشكل أساسي فإنه من المستحسن القيام بما يلي: في البداية يجب أن يكون هناك كود أساسي أو حتى repository فارغة لا مشكلة، المهم هناك شيء للعمل عليه. نقوم بعمل clone لهذه ال repo لأخذ نسخة منها على الجهاز لدينا. نقوم بإضافة branch، أي ميزة نريد إضافتها يجب أن نضيف branch لها، هذا المستحسن. نقوم بالعمل على الميزة التي نريدها و طبعاً لا ننسى القيام بال commit لكما أصبح لدينا شيء يعمل. بعد النهاية من الميزة و التي نريد الآن إضافتها إلى الكود الرئيسي نقوم بالعودة إلى الفرع الرئيسي. نقوم بسحب البيانات من ال repo ﻷنه من الممكن أن أحداً عدل عليها بينما نحن نعمل على الميزة الخاصة بنا في الفرع الجديد الذي أنشأناه من أجل الميزة التي أردنا إضافتها. نقوم الآن بالعودة إلى الفرع الذي يخص الميزة، و نقوم بعمل merge للفرع الرئيسي في الفرع الخاص بالميزة. بعد عملية ال merge أصبح لدينا الكود الجديد على ال repo و لكن خلال هذه العملية قد يكون هناك تعارضات، نقوم بحلها و عمل commit للتغييرات. الآن كل شيء جاهز، نقوم بعمل push للفرع إلى ال repo. نذهب إلى ال repo و نقوم بعمل ما يسمى pull request لطلب أن نقوم بعملية merge للفرع الذي قمنا بعمل push له إلى ال repo مع الفرع الرئيسي. إن المسؤول عن المشروع يجب عليه الموافقة على هذه ال pull request للقيام بدمج الكود في الفرع الرئيسي. أي عملية يجب أن تتم بهذا الشكل، هناك أساليب أخرى للعمل و لكن هذا الأسلوب منصوح به بشكل عام، طبعا نقوم بحذف الفرع الخاص بالميزة في حال تم دمج الميزة في الفرع الرئيسي ﻷنه لا حاجة له بعد الآن.
- 2 اجابة
-
- 1
-
يمكنك القيام بذلك عن طريق كتابة دالة تقوم بتنفيذ الملف باستعمال توابع المكتبة os. لنفترض أنه لديك ملفين كل منهما يحوي على window و لديك كود أساسي تريد منه تنفيذ window معينة. يمكن القيام بذلك عن طريق كتابة التابع التالي: def open(filename): os.chdir("موقع الملفات التي تحوي النوافذ") os.system('python '+filename) # هنا سنقوم بتنفيذ الملف ثم يمكن القيام بالاستدعاءات المناسبة، على سبيل المثال يمكن وضع زر لكل نافذة ليفتحها بالشكل التالي: from tkinter import * # لا تقم بهذا بشكل اعتيادي main= Tk() btn_w1 = Button(main,text="open w1",command=lambda: open("w1.py")).pack() btn_w2 = Button(main,text="open w2",command=lambda: open("w2.py")).pack() main.mainloop() أي أننا قمنا باستعمال البارامتر command لنمرر ما يجب القيام به، فهو هنا عند كبس الزر سيقوم بتشغيل التعليمة التي تقوم باستدعاء التابع open و الذي يقوم بتنفيذ النافذة المطلوبة.
-
كلامك صحيح و بالطبع هذه الميزة مهمة حتى لا يضطر المستخدم إلى كتابة كلمة السر في كل مرة، و لكن لا يتم تخزين كلمة السر في ال cookie إنما يتم تخزين token مولد بشكل عشوائي هو عبارة عن مفتاح يمكن من خلاله الوصول إلى معلومات معينة في السيرفر و هذا طبعاً كله في السيرفر، أي أن المستخدم لن يتم تخزين كلمة السر لديه فقط على السيرفر و بطريقة مشفرة أيضاً لضمان الأمان. يمكنك الإطلاع على هذا الرابط لمزيد من المعلومات عن هذه الأمور.
-
لا يجب تخزين كلمة السر في ال cookie أنها طريقة غير جيدة. يجب عليك تخزين ال sessionId بشكل عام، و لكن هناك حالات خاصة أخرى، لا أستطيع التحديد بدون معرفة كامل تفاصيل الموقع، و لكن يبدو أنك لم تقم بالتعديل على شيء فيفترض أن تخزين ال sessionId كاف.
-
يجب أن تكون معلومات الجلسة موجودة لديك في هذه ال cookie و تقوم باستعمالها للقيام بتسجيل الدخول بشكل تلقائي للمستخدم. هذا يعتمد على طريقة تسجيل الدخول التي تقوم بها، و لكن يفترض أنه يجب عليك تخزين token معينة تدل على جلسة المستخدم.
-
هل تقصد ما الذي يجب تنفيذه في قسم ال else ؟
-
لا فرق من الناحية الظاهرية كما تحدثت حيث أن كلاهما يقوم بطباعة سطر جديد. و لكن الفرق في طريقة العمل، لفهم ذلك علينا في البداية فهم كيفية الطباعة في ال c++. في البداية يتم تخزين ما ينبغي طباعته في مخزن مؤقت buffer و من ثم القيام بنقل البيانات إلى الجهاز المطلوب (الشاشة أو ملف على القرص الخ..) و خلال ذلك يتم القيام بعملية flush لل buffer لإفراغه. ال endl تقوم بذلك في كل مرة أي أن كل استدعاء لعملية ال endl سيقوم بنقل البيانات و القيام ب flush. بينما n\ تقوم فقط بالتخزين بال buffer بدون أي نقل و فقط عند نهاية البرنامج (أو عند القيام ب flush بشكل يدوي) فإن البيانات تنقل و تتم عملية flush لل buffer. و بالتالي ستكون n\ أسرع بكثير من endl و لا ينصح باستعمال endl لتلك الأسباب.
- 2 اجابة
-
- 1
-
يمكنك القيام بإنشاء cookie تساعد على القيام بذلك، عندما يقوم المستخدم بالدخول لأول مرة تقوم بإنشاءها و وضع مدة زمينة طويلة جداً. و كلما قام المستخدم بعمليات معينة تقوم بتجديد ال cookie، يمكن القيام بذلك بالشكل التالي: setcookie( "CookieName", "CookieValue", time() + (10 * 365 * 24 * 60 * 60) ); و في كل مرة تتحقق بأن ال cookie موجودة، في حال كانت موجودة تقوم بتسجيل الدخول بشكل تلقائي و تحديث المدة الزمنية مرة أخرى، أما في حال كانت غير موجودة تقوم بتوجيه المستخدم إلى صفحة تسجيل الدخول. يمكن القيام بذلك بالشكل التالي: if(isset($_COOKIE['CookieName'])){ $cookie = $_COOKIE['CookieName']; } else{ // No Cookie found - Redirect to Login }
- 13 اجابة
-
- 1
-
إن الخطأ هو في التابع الذي تقوم بتمريره إلى ال addEventListener حيث أنك تقوم باستدعاء التابع و ليس القيام بتمرير اسمه فقط. عليك فقط القيام بتمرير التابع. أي أننا في هذه الطريقة نقوم بتمرير اسم التابع حتى يعرف ما الذي يجب تنفيذه عند حدوث ال event و هو يقوم بتنفيذ التابع عند حدوثه و بالتالي تكون القيمة المناسبة موجودة في مكون ال html. بينما في حال استدعينا التابع فوراً فسيأخذ القيمة الافتراضية تلقائياً و لن يقوم بتحديث شيء.
- 8 اجابة
-
- 1
-
إن هذا المفهوم يدعى ال closure و هو عبارة عن فضاء اسماء يضاف إلى فضاء الأسماء المحلي الخاص بالتابع، عندما تقوم بكتابة تابع داخل تابع فإن التابع الداخلي يستطيع الوصول إلى كافة المتحولات المعرفة (و الممررة) في التابع الخارجي، و بالتالي هذه المتحولات ستكون ضمن فضاء الاسماء الخاص به. عند إرجاع هذا التابع فإن فضاء الأسماء الخاص به سيكون يحتوي على هذه المتحولات و بالتالي ستأخذ القيمة الصحيحة لها. بشكل دقيق هنا في مثالك هذا، فإن التابع say_hello هو تابع داخلي بينما التابع f هو تابع خارجي. التابع say_hello يستطيع الوصول إلى المتحول name بشكل طبيعي حيث أنه معرف داخل التابع f، و عند تمرير اسمك (أي قيمة محددة) للتابع f فإن هذا المتحول أخذ قيمة هي اسمك، و هذا القيمة أصبحت مرتبطة بالمتحول في فضاء الاسماء و بالتالي الأمر ذاته بالنسبة للتابع say_hello و عند إرجاع هذا التابع ستكون القيمة لا تزال في فضاء اسماءه و هذا ما ظهر من خلال المثال عندما قام بطباعة القيمة المطلوبة للمتحول name.
- 1 جواب
-
- 1
-
إن && تسمى short circuit و هي ليست ك &، الفرق بينهما هو كما يلي: && هي عملية منطقية و هي ال and و تكون بين عنصرين، كما أنها لا تحتاج إلى معالجة كل الحدود لإيجاد النتيجة النهائية، أي مثلاً في حال وجدت عبارة false ستتوقف ﻷنه من الواضح أن العبارة الكلية ستكون false ﻷنه لدينا شرط and، كما أنه في حال وضعنا أرقام عادية فإن أي رقم غير الصفر سيكون true بالنسبة لها و بالتالي: int x = 10; int y = 5; x && y // true & تعبر عن عملية ال and على مستوى ال bit أي أنها تقوم بعملية and بين بتات طرفيها (بالتالي طرفيها يجب أن يكونا أرقام)، و بالتالي سيتم معالجة كافة الحدود لإيجاد الناتج النهائي و لن تتوقف في حال وجدت false. كما أننا في حال استعملناها في المثال السابق فسوف تعطي 0 و بالتالي ستعتبر false و ذلك ﻷن: 10 -> 1010 في النظام الثنائي 5 -> 0101 في النظام الثنائي 10 & 5 = 1010 & 0101 = 0 الآن ما الذي يمكن أن نستفيده من خاصية short circuit، هناك فائدتان أساسيتان هما: تسريع العملية، حيث أنه من الممكن أن تكون أطراف الشرط عبارة عن توابع من المكلف حسابها و بالتالي في حال كان بالإمكان التوقف مبكراً فهذا جيد. القيام بوضع شرط لاحق يعتمد على نتيجة شرط سابق بأن تكون true حتى يكون قابل للتفيذ بلا أخطاء، كمثال على ذلك لنفترض أن لديك دليل معين و تريد الوصول إلى العنصر الموافق لهذا الدليل في مصفوفة، يمكنك اختبار أن هذا الدليل ضمن حدود المصفوفة و من ثم اختبار العنصر في ذلك الدليل، لولا خاصية short circuit لم يكن بإمكاننا اختبار العنصر في الدليل المطلوب ﻷنه من الممكن أن الدليل خارج حدود المصفوفة و بالتالي سيعطي خطأ.
- 3 اجابة
-
- 1
-
لا تحتاج إلى سيرفر خارجي، هناك سيرفر بسيط يمكنك تشغيله. في حال كنت تقوم باستعمال create-react فقط قم بتنفيذ التعليمات التي قمت بذكرها و سيبدأ السيرفر بالعمل. إنه سيرفر محلي، ليس من الضروري أن يكون السيرفر خارجي.
- 4 اجابة
-
- 1
-
يرجى توضيح المقصود بشكل أوضح. أعتقد أنك نسيت أن تشغل السيرفر عندما قمت بإطفاء الحاسوب و إعادة تشغيله. بالإضافة إلى ذلك فتح صفحة ال html وحدها لن يقوم بفتح الموقع و ذلك ﻷنك تحتاج إلى سيرفر يقوم بتشغيل المكتبات التي تقوم باستعمالها مثل react. تذكر ملف ال html مجرد هيكل لا أكثر. يمكنك تشغيل السيرفر باستعمال npm start أو في حال كنت تستعمل yarn يمكنك استعمال yarn start
- 4 اجابة
-
- 1