-
المساهمات
2593 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
26
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Kais Hasan
-
في أغلب الأحيان يمكن تحويل نفس الفكرة الخاصة بالتابع الذي يستدعي نفسه إلى حلقة تكرارية. يمكننا أن نقوم بالعمليات مستوى مستوى، أي أن نقوم في البداية بفك أول مستوى ثم ثاني مستوى و هكذا حتى النهاية. كيف سنعلم أننا انتهينا؟ يمكننا تخزين ذلك في متحول في حال قمنا بفك أي شيء نقوم بإسناد قيمة معينة إليه تدلنا على ذلك، و في حال انتهينا و لم نسند له شيء فهذا يدل على أننا لم نقم بفك أي مصفوفة و بالتالي انتهينا من فك كل المستويات. أحد الطرق لكتابة الكود السابق هو كالتالي: 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
-
-
إن الطريقة __new__ تقوم بإنشاء غرض جديد من الصنف المطلوب بينما الطريقة __init__ تقوم بتهيئته بالقيم المطلوبة و بالتالي فإن __new__ تقوم بإعادة غرض من هذا الصنف بينما __init__ لا ترجع شيئاً. عندما نقوم بتعريف كائن من صف فإننا نستعمل الباني، و هو فعلياً يقوم في البداية باستعمال __new__ لإنشاء غرض جديد ثم يستدعي __init__ على هذا الغرض بالبارامترات التي قمنا بتمريرها. في غالب الأحيان لن تضطر إلى تعريف __new__ بنفسك، حيث أن استعمالها يعتبر متقدم نوعاً ما، بشكل عام أنت تريدها لضبط عملية صنع الأغراض، مثلا في حال كنت تريد تصميم صنف يتبع نمط التصميم singleton فإنه يمكن استعمالها لتقييد ألا يتم صنع أكثر من غرض واحد، بالشكل التالي: class SingletonClass(object): def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = super(SingletonClass, cls).__new__(cls) return cls.instance بينما __init__ نقوم باستعمالها بشكل طبيعي مثل الباني، حيث أنها تقوم بتهيئة جميع البيانات التابعة للغرض المنشئ.
- 2 اجابة
-
- 1
-
-
لا تحتاج إلى دورة لتعلمه، في حال كنت تعلم كيفية التعامل مع git فلا يلزمك غير أن تتعلم كيفية تخزين ما يخزنه ال git محلياً على سيرفر على الانرنيت، يمكنك ال github من مشاركة الكود الخاص بك مع العالم، حيث في حال قمت بتحديد أنك تريده عام فإن أي مطور آخر سيستطيع استعمال الكود الخاص بك و التطوير عليه مثلاً، بالطبع يمكنك وضع حقوق ملكية معينة. يمكنك إنشاء حساب عليه و اتباع التعليمات التي تقدم لك في البداية و ستجد نفسك قادراً على التعامل معه بسرعة كبيرة. بالطبع هو يوفر أكثر بكثير من مهمة تخزين فقط، فباستعماله يمكنك التعاون مع العديد من المطورين على مشروع واحد و تنظيم العمل، كما يمكنك إنشاء أكواد تقوم بالتنفيذ بشكل تلقائي في حال حدوث أحداث معينة، مثلاً عندما يقوم أحد المطورين بإضافة كود يمكنك أن تقوم بتنفيذ الاختبارات التي قمت بكتابتها سابقاً للتأكد من أن كل شيء يعمل كما تريد. أنصحك بالتسجيل بالموقع و إتباع ال get started حتى تتكون لديك تجربة عن كيفية استعماله.
-
إن التوابع السهمية لا تملك خاصية ربط للمؤشر this لوحدها، حيث أنها تأخذ ذلك من المحيط التي هي فيه على شكل closure. أي في حال قمنا بوضعها ضمن class فإنها ستأخذ ال this الخاص بهذا ال class بشكل دقيق سوف تأخذ ال this كغرض من هذا ال class في حال كانت الطريقة عادية أو ستكون this تدل على ال class نفسه في حال كانت الطريقة static و لكن بما أنها تقوم بذلك على شكل closure فإن ذلك سيكون غير قابل للتعديل، أي أنه في حال أخذنا التابع من هذا الصف فإن this ستظل مرتبطة به، لفهم هذه الخاصية هذا مثال يوضح ذلك: class C { a = 1; autoBoundMethod = () => { console.log(this.a); } } const c = new C(); c.autoBoundMethod(); // 1 const { autoBoundMethod } = c; autoBoundMethod(); // 1 // If it were a normal method, it should be undefined in this case
- 4 اجابة
-
- 1
-
-
هناك العديد من المكونات المهمة في قسم meta من ال html لتحسين ظهورك. أحد أهم هذه المكونات هو title، عليك اختيار هذا بشكل فريد و أن يكون مرتبط ارتباطاً وثيقاً بالمحتوى الخاص بالصفحة، و هو النص الذي يظهر كعنوان لموقعك في نتائج محرك البحث. ثاني أهم مكون هو ال description و هو التفاصيل التي تظهر تحت ال title عند ظهور الموقع في نتائج محرك البحث، و هو مهم جداً حيث أنه من الممكن أن يقرر المستخدم دخول موقعك أو لا تبعاً لهذا الوصف فقط. هناك الكثير من المكونات الأخرى المهمة ك robots و الذي يسمح لك بإعلام محرك البحث بأن بعض الصفحات لا تحتوي على معلومات مهمة جداً و هذا يساعد على عدم تخفيض جودة موقعك بسبب هذه الصفحات فقط. كما أن المكون viewport مهم لإعلام محرك البحث أن موقعك يدعم ال mobile و هو من أهم الأمور حالياً.
- 2 اجابة
-
- 1
-