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

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

  1. Zen Eddin Allaham

    Zen Eddin Allaham

    الأعضاء


    • نقاط

      16

    • المساهمات

      893


  2. Mustafa Suleiman

    Mustafa Suleiman

    الأعضاء


    • نقاط

      10

    • المساهمات

      19410


  3. محمد_عاطف

    محمد_عاطف

    الأعضاء


    • نقاط

      10

    • المساهمات

      8978


  4. Ali Ahmed55

    Ali Ahmed55

    الأعضاء


    • نقاط

      5

    • المساهمات

      2064


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

عرض المحتوى الحاصل على سمعة أكبر منذ 10/07/25 في كل الموقع

  1. السلام عليكم ده الكود class ConditionalProbability: def __int__(self,col1,col2): self.column_name1 = col1 self.column_name2 = col2 def average(self): condition = data_train[self.col1] > data_train[self.col1].mean() subset = data_train[condition][self.column_name2] self.mu,self.sigma = np.mean(subset),np.std(subset) return self.mu,self.sigma def distribution_values(self): x = np.linspace(self.mu - 4*self.sigma, self.mu + 4 *self.sigma,100) pdf = scipy.stats.norm.pdf(x,self.mu,self.sigma) p_conditional = 1 - scipy.stats.norm.cdf return x,pdf,p_conditional def plot(self): x,pdf,p_conditional = self.distribution_values() plt.figure(figsize=(8,5)) plt.plot(x, pdf, label=f'Distribution of {self.col2} (given {self.col1} > mean)') plt.fill_between(x, pdf, where=(x > 0), color='orange', alpha=0.4, label=f'Area where returns > 0\nP = {p_conditional:.3f}') plt.axvline(0, color='red', linestyle='--', label='return = 0') plt.title('Conditional Probability Visualization') plt.xlabel('Forward Returns') plt.ylabel('Density') plt.legend() plt.show() وده الخطاء --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) /tmp/ipykernel_36/4033021502.py in <cell line: 0>() 1 v1 = ConditionalProbability('V1','forward_returns') ----> 2 v1.plot() /tmp/ipykernel_36/3439074975.py in plot(self) 20 21 def plot(self): ---> 22 x,pdf,p_conditional = self.distribution_values() 23 plt.figure(figsize=(8,5)) 24 plt.plot(x, pdf, label=f'Distribution of {self.col2} (given {self.col1} > mean)') /tmp/ipykernel_36/3439074975.py in distribution_values(self) 13 14 def distribution_values(self): ---> 15 x = np.linspace(self.mu - 4*self.sigma, self.mu + 4 *self.sigma,100) 16 pdf = scipy.stats.norm.pdf(x,self.mu,self.sigma) 17 p_conditional = 1 - scipy.stats.norm.cdf(0,self.mu,self.sigma) AttributeError: 'ConditionalProbability' object has no attribute 'mu'
    3 نقاط
  2. اشتغل علي colab ولا jupyter ولا VS code ولا براحتي
    3 نقاط
  3. السلام عليكم عند مشكله في Kaggle Notebook وهي عدم الحفظ التلقائي الحاجات الجديد وكمان مش رضي ينحفظ يدوي فا اي حل المشكله دي وكمان لو Google Chrome بيحصل الUpdating فا دي ممكن يكون السيب؟
    2 نقاط
  4. حسنا الان قمت بتقدم للامتحان لكن توجد خانة textarea لم افهم ما يجب علي ادخاله في خانة " يرجى مشاركة أي شيء من شأنه أن يساعد في التحضير لاجتماعنا."
    2 نقاط
  5. هل علي ان انزله بنفس تحديث جودوت الذي في الدورة ام اجدد تحديث
    2 نقاط
  6. ستجد أسفل فيديو الدرس صندوق للتعليقات كما هنا يرجى طرح سؤالك أسفل الدرس وليس هنا حيث هنا قسم الأسئلة العامة ولا نقوم بإجابة الأسئلة الخاصة بمحتوى الدورة أو الدرس، وذلك لمعرفة الدرس الذي توجد به مشكلتك و لمساعدتك بشكل أفضل.
    2 نقاط
  7. في تقدم للاختبار هل انا مطالب ب شرح مشاريع التي قمت بها في دورة حسب المسارات التي حددتها لاختبار من الف الى ياء لتأكد اني قمت بفهم مشروع
    2 نقاط
  8. بإمكانك التقدم للإختبار الآن لا داعي للقلق.
    2 نقاط
  9. من شروط الامتحان واخذ الشهادة، اتمام اربعة مسارات على الاقل، بمعنى ان لدى دورة علوم الحاسوب 10 مسارات، انتهائي من 4 منها يؤهلني الى الامتحان واخذ الشهادة. سؤالي هو: الأربعة مسارات سأختارها انا حسب اهميتها بالنسبة لي, ولكن هل المدرب الذي سيسألني عن الدورة سيسألني خارج المسارات التي درستها ؟ وسيطلب مني مشروع تخرج خارج المسارات التي درستها؟ لأن الجامعة على الابواب واريد التعلم والدراسة من الدورة ماقد يفيدني بالجامعة والتحضير لها، لذلك اريد تحديد اهم اربعة مسارات بالنسبة لي في الجامعة، علما بأنها دورة علمية اكثر من انها مهارية. تحياتي لكم.
    2 نقاط
  10. هل Power BI مهم في تحليل البينات ولو مهم في طريقه للِتثبيت علي الماك او بديل
    1 نقطة
  11. السلام عليكم ورحمة الله وبركاته أنشأت موقع تعليمي عبر اضافة ليرنبريس https://first-leader-center-academy.com/allcourse/ لكن اضافة ليرن بريس لدي لا تقوم بعملية التسجيل للطالب ولا تقوم بعملية الشراء لكن لو تم تسجيل عضو من داخل لوحة التحكم بالموقع يمكن للاضافة ادخاله على الدورة التي يريد طالما تم تخصيصها له فما هو الحل لهذه المشكلة؟؟؟ ارجوكم ساعدوني في حلها وجزاكم الله كل خير
    1 نقطة
  12. شكرًا على إهتمامك وإقتراحك شادي، سيتم إرساله لقسم التطوير بالأكاديمية، في الوقت الحالي، أرجو تثبيت الإضافة التالية: Scroll To Top وسيظهر لك الزر التالي في الصفحة بعد إعادة التحديث: وعند الضغط عليه سيتم الصعود لأعلى الصفحة، وكذلك يوفر إمكانية النزول لأسفل الصفحة مباشرًة في حال كنت بالأعلى.
    1 نقطة
  13. السلام عليكم, انا عندي مشروع علم بيانات على google colab ومحفوظ بصيغة ال jupyter فلما اجي ارفعه على قيت هب اسوي مستودع وبعدها اضيف الملف على طول من خانة اضافة الملفات ولما اجي اشغله يعطيني خطأ وما يشتغل الملف ولا يظهر الكود, هل في شخص واجهته هذه المشكلة سابقا؟
    1 نقطة
  14. أين يتم تشغيل الملف، فلا يوجد طريقة لتشغيله من خلال github مباشرًة، فهي منصة لعرض وتخزين الكود ونظام تحكم في الإصدارات، ولا تقوم بمهمة تشغيل الكود. ما تقصده هو فتح الملف لرؤية الكود أي عرضه، لكن بالنسبة لملفات jupyter فالمشكلة عند حفظك للملف على جهازك، يتم تخزين معلومات عن الـ Widgets أي الخلايا بطريقة قديمة أو غير مكتملة، ونظام العرض في GitHub يتوقع وجود معلومة محددة اسمها state أي الحالة لكل Widget، ولكنه لم يجدها. أسهل حل هو فتح الملف على حاسوبك من خلال VS Code، ثم من القائمة العلوية، اختار Kernel ثم اختار Restart and Clear Output لإعادة التشغيل ومسح المخرجات التي تظهر نتيجة تشغيل الخلايا. واحفظي الملف مرة أخرى، ورفع الملف الجديد إلى GitHub مرة أخرى.
    1 نقطة
  15. تلك المشكلة تحدث أحيانًا بالفعل، حيث ستجد رسالة خطأ unable to save your notebook because it may have been modified in another location والحل لتجاوزها هو من خلال تحميل الملف بالضغط على file أعلى اليسار ثم اختر download notebook، ثم أنشيء ملف جديد من خلال استيراد الملف الذي قمت بتحميله للتو وذلك بالضغط على file ثم import notebook.
    1 نقطة
  16. وعليكم السلام ورحمة الله وبركاته، في Kaggle Notebooks يوجد حفظ تلقائي، لكنه لا يحفظ كل شيء. ما يتم حفظه تلقائيًا: الأكواد تُحفظ أثناء الكتابة كـ "مسودة" (Draft). يظهر بجانب اسم المشروع "Draft saved" لتأكيد الحفظ. ما لا يتم حفظه: نتائج الأكواد لا تُحفظ، ويجب تشغيلها من جديد عند الفتح. الملفات داخل مجلد /kaggle/working/ مؤقتة وتُحذف بعد إغلاق الجلسة. إذا لم يعمل الحفظ التلقائي، جرّب إعادة تحميل الصفحة أو تسجيل الخروج والدخول مرة أخرى. للحفاظ على عملك بشكل دائم: اضغط على "Save Version" في الأعلى. Quick Save: يحفظ الحالة الحالية فقط. Save & Run All (Commit): يشغل كل الأكواد من البداية ويحفظ النسخة النهائية.
    1 نقطة
  17. عند مدة تنفيذ مشروع تخرج وليكن اسبوع هل يوجد مانع اذا تأخرت قليلاً لان لا اعلم ماذا سيحدث معي خلال فترة محددة لتنفيذ مشروع
    1 نقطة
  18. سيحدد لك المدرب مشروعًا مرتبطًا بما تعلمته أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع الى أسبوعين. في حال تتوقع تأخير أو تريد مدة أطول، أرجو مناقشة ذلك مع المُدرب المُختص بإختبارك، وسيتم إرشادك، وذلك من خلال مركز المساعدة.
    1 نقطة
  19. المتغيرين self.mu و self.sigma غير موجودين داخل الكائن وقت استدعاء plot()، في الكود الدالة distribution_values() تعتمد على: self.mu, self.sigma لكن هذان المتغيران لا يتم إنشاؤهما إلا داخل الدالة average()، أي أنّك لم تستدع average() قبل أن تستدعي plot()، ولهذا السبب لم يتم تعريف self.mu و self.sigma. و أيضا في الـ constructor عندك خطأ مطبعي: def __int__(self, col1, col2): يجب أن تكون: def __init__(self, col1, col2): لأنّ __int__ تستخدم للتحويل إلى عدد صحيح، بينما __init__ هي دالة التهيئة. و أيضا في بعض الأماكن كتبت self.col1، وفي أخرى self.column_name1. يجب أن توحدها.
    1 نقطة
  20. في دالة distribution_values تستخدم المتغير self.mu لكن لم يتم إنشاؤه أو تعيين قيمة له بعد في الكائن v1، فعند تنفيذ v1.plot() يتم استدعاء دالة self.distribution_values() كأول خطوة. ثم دالة distribution_values تعمل على تنفيذ x = np.linspace(self.mu - 4*self.sigma وهي هنا تحتاج إلى قيمة للمتغيرين self.mu و self.sigma. والمكان الوحيد الذي يتم فيه إنشاء هذين المتغيرين هو داخل دالة average()، لكن لم تقم باستدعاء دالة average() قبل استدعاء دالة plot()، يجب استدعائها. كذلك يوجد خطأ إملائي في الدالة البانية __init__ حيث كتبت __int__ وبالتالي لن تعمل ولن يتم تعيين self.column_name1 و self.column_name2. وفي دالة average استخدمت self.col1 بينما في الدالة البانية استخدمت self.column_name1، فيجب توحيد الاسم. وحساب الاحتمال الشرطي غير مكتمل، فهنا p_conditional = 1 - scipy.stats.norm.cdf غير صحيح، فلم تقم باستدعاء الدالة cdf مع معاملاتها، يجب أن تكون p_conditional = 1 - scipy.stats.norm.cdf(0, self.mu, self.sigma ويوجد عدم تطابق أسماء المتغيرات في دالة plot حيث تستخدم self.col1 و self.col2 بينما يجب أن تكون self.column_name1 و self.column_name2. import numpy as np import scipy.stats import matplotlib.pyplot as plt import pandas as pd data_train = pd.DataFrame({ 'V1': np.random.randn(1000), 'forward_returns': np.random.randn(1000) * 0.02 }) class ConditionalProbability: def __init__(self, col1, col2): self.column_name1 = col1 self.column_name2 = col2 def average(self): condition = data_train[self.column_name1] > data_train[self.column_name1].mean() subset = data_train[condition][self.column_name2] self.mu, self.sigma = np.mean(subset), np.std(subset) return self.mu, self.sigma def distribution_values(self): x = np.linspace(self.mu - 4 * self.sigma, self.mu + 4 * self.sigma, 100) pdf = scipy.stats.norm.pdf(x, self.mu, self.sigma) p_conditional = 1 - scipy.stats.norm.cdf(0, self.mu, self.sigma) return x, pdf, p_conditional def plot(self): self.average() x, pdf, p_conditional = self.distribution_values() plt.figure(figsize=(8, 5)) plt.plot(x, pdf, label=f'Distribution of {self.column_name2} (given {self.column_name1} > mean)') plt.fill_between(x, pdf, where=(x > 0), color='orange', alpha=0.4, label=f'Area where returns > 0\nP = {p_conditional:.3f}') plt.axvline(0, color='red', linestyle='--', label='return = 0') plt.title('Conditional Probability Visualization') plt.xlabel('Forward Returns') plt.ylabel('Density') plt.legend() plt.show()
    1 نقطة
  21. لديك خطأ في كتابة __init__ حيث كتبت __int__ بدلا من __init__، وهذا يعني أن الـ constructor لم يتم تنفيذه أبداً، و أيضا لم تستدع الدالة average() التي تحسب قيم mu و sigma، لذلك هذه الـ attributes غير موجودة عند استدعاء distribution_values(). و أيضا استخدمت self.col1 و self.col2 في بعض الأماكن بينما عرفت self.column_name1 و self.column_name2. لذا أرجوا تصحيح هذه الأخطاء و التجربة مرة أخرى.
    1 نقطة
  22. كيف يتم تنسيق القائمة المنسدله بحيث يطهر كل رابط كامل في سطر ولا يأخد سطرين Website.rar
    1 نقطة
  23. السلام عليكم ورحمة الله وبركاته واجهت مشكلة مؤخرًا في جهازي أثناء العمل على مشاريع البرمجة. الجهاز أصبح يعلّق بشكل متكرر، خاصة عند تنفيذ أوامر مثل: npm install أحيانًا يستغرق التنفيذ أكثر من 10 دقائق، وأثناء التنقّل بين الصفحات أو البرامج يتجمّد النظام فجأة ويظهر لي تنبيه “البرنامج لا يستجيب – انتظار أو خروج”. ومع مرور الوقت أشعر أن البطء يزداد أكثر. فيما يلي مواصفات جهازي الحالية: 🔹 اسم الجهاز: HP EliteBook 8570p 🔹 نظام التشغيل: Windows 10 Pro (64-bit) – الإصدار 10.0.19045 🔹 المعالج (CPU): Intel® Core™ i5-3360M @ 2.80 GHz (ثنائي النواة / 4 خيوط) 🔹 الذاكرة (RAM): 4.00 GB 🔹 كرت الشاشة (GPU): AMD Radeon HD 7570M بحسب هذه المواصفات، هل تنصحونني بترقية مكونات معينة لتحسين الأداء في البرمجة؟ وشكرًا جزيلًا لكم على دعمكم وتوجيهكم الدائم 🌷
    1 نقطة
  24. لا اعرف كيف انسقه VENUES محتوي القائمةWebsite.rar
    1 نقطة
  25. السلام عليكم ورحمة الله وبركاته احتاج الى مبرمج لتصميم بوتات رد الي داخل تطبيق التيلجرام بحيث يتم الرد بشكل الي على أعضاء القروب مثلا من بداية الدخول للمحادثة يظهر خيارات اللغة بعد ذلك الأقسام المتاحة و اظهار رسالة كل قسم للموظف المختص بالقسم . فاذا يوجد شخص سبق له العمل على ذلك وله الخبرة في هذا العمل يتواصل معي للاتفاق على قيمة هذا التعاون . وشكرا
    1 نقطة
  26. هل مواصفات هذا الجهاز مناسبة لدزرة الذكاء الاصطناعي
    1 نقطة
  27. هو ليه ماعندكمش دوره ل تعليم flutter
    1 نقطة
  28. سؤال بالنسبة للمشروع تخرج الخاص ب امتحان هل يوجد ايضأ مساعدة من قبل مدربين ام لا
    1 نقطة
  29. السلام عليكم ....سجلت في دورة علوم الحاسب والبايثون ....لا شك بافادة الفيدوات لكن سؤالي هل هناك منهج أو مقرر لمتابعة المنهج ؟ ثانيا يا ليت هناك شاشة منبثقة أثناء الشرح تظهر فيها كتابة المصطلحات ..ودمتم
    1 نقطة
  30. هل هذا مناسب لدورة الذكاء الصناعي والعمل فيما بعد الدورة MSI Thin 15 B12UCX CPU i5 12450H RAM 8GB DDR4 SSD 512GB NVME PCIE G4 Display 15.6 FHD 144Hz GPU RTX 2050 4GB Windows 11 الجيل ١٢
    1 نقطة
  31. نعم الجهاز ممتاز ولكن هناك بعض العيوب فيه . أولا يجب عليك زيادة مساحة ال RAM حيث يجب أن تكون أقل ذاكرة مناسبة هي 16 GB ولو أكبر من ذلك سيكون أفضل للتدريب على النماذج الكبيرة . وكارت الشاشة لديه ذاكرة 4GB VRAM محدودة للنماذج كبيرة مثل GPT-like أو التدريب على مجموعات بيانات ضخمة وسيساعدك للعمل بعد الدورة ولكن ليس في الأمور المتقدمة جدا . أيضا الجهاز خفيف ورفيع لذلك مع الإستخدام المتقدم من الممكن أن يسخن كثيرا وهذا سيسبب بطئ في الأداء لذلك يمكنك البحث عن إصدار هذا الجهاز وانظر مستوى التبريد الخاص به و الحرارة التي يصل إليها عند إستعمال كارت الشاشة بأقصى قوته. وهذه هي العيوب الموجودة به يمكنك البحث عن بدائل أفضل من حيث كارت الشاشة ومن حيث سخونة الجهاز ولكن لو لم تعثر على جهاز فيمكنك الحصول على هذا الجهاز لا مشكلة ولكن يجب تكبير حجم ال RAM.
    1 نقطة
  32. هل هذا مناسب اكثر ؟ MSI Thin 15 B12UCX CPU i5 12450H RAM 8GB DDR4 SSD 512GB NVME PCIE G4 Display 15.6 FHD 144Hz GPU RTX 2050 4GB Windows 11
    1 نقطة
  33. كلما اشغل اي برنامج تظهر لي هذه الرسالة Unable to create process using 'C:\Users\hp\Desktop\python\.venv\Scripts\python.exe C:\Users\hp\PyCharmMiscProject\.venv\Include\python\.venv\gpt.py': The system cannot find the path specified.
    1 نقطة
  34. الاختيار بين هذه الأدوات يعتمد بشكل أساسي على طبيعة مشروعك ولذلك يفضل طرح السؤال إذا كان خاص بأحد الدورات أسفل الفيديو حتى يتم ساعدتك بشكل أفضل . وعموماً Google Colab بيئة تطوير تعمل بالكامل على خوادم (سيرفرات) شركة جوجل السحابية. ولذلك يفضل استخدامها عندما يكون جهاز الحاسوب الخاص بك ذا مواصفات محدودة، أو إذا كنت لا ترغب في استهلاك موارده. إذا كنت تعمل على مشاريع الذكاء الاصطناعي (AI) أو تعلم الآلة (Machine Learning)، حيث يوفر لك وحدات معالجة رسوميات (GPUs) و وحدات معالجة الموترات (TPUs) عالية الأداء مجانًا. أما محلياً فيمكن استخدام Jupyter أو VS Code ولكن محدودة بقدرات جهازك
    1 نقطة
  35. نعم هذا الجهاز مناسب للدورة حاليا حبق هو مناسب للمبتدئين في هذا المجال والتعلم عموما وخاصة في المشاريع الصغيرة والمشاريع المتوسطة. حيث يمكنه تدريب شبكات عصبية صغيرة و يمكنه تشغيل واستخدام النماذج المدربة مسبقا ولكن ذات الحجم الصغير والمستخدمة في الدورة. ولكنه غير مناسب لتدريب نماذج الذكاء الاصطناعي المعقدة أو الكبيرة لهذا هو مناسب للدورة ولكن ليس بعد إنهائها . وعملية التدريب ستكون بطيئة في بعض النماذج ولكن لا مشكلة تستطيع إستخدام google colab وإستخدام الموارد المجانية التي تقدمها.
    1 نقطة
  36. لقد انتهيت من مشروع وانه يعمل بشكل كامل لكن عند رفعه على vercel توقف خادم عن عمل ماهي مشكلة https://to-do-list-app-full-stack.vercel.app/ To-Do-list full-stack.zip
    1 نقطة
  37. الان انتهيت من 4 مسارات وهم اساسيات js و react و nodejs و typescript ونفذت مشاريع ورفعتهم على جيت هب وانا جونيور باك اند اما فرونت اند انا قوي فيه لكني اعرف كيف اربط مشروع باك اند مع فرونت اند واجعله يعمل هل اذا كنت junior full stack لح كون ضعيف ب امتحان؟
    1 نقطة
  38. هل يمكن ان تخبرني مثل ما نوع مشروع المتوقع
    1 نقطة
  39. مشروع عادي بناء على المسارات التي أنهيتها.
    1 نقطة
  40. السلام عليكم حياكم الله، المرجو المساعدة في التعامل مع موقع github، إن كان هناك من فيديوها أو مقالات أو نصائح في التعامل معه.
    1 نقطة
  41. ستحتاج إلى استخدام دوال PyTorch فقط في حال المعالجة جزء من الرسم البياني ويجب أن يدخل في حساب الـ back-prop كـ RandomCrop يُطبق داخل النموذج نفسه. أو لو تريد أن تتم العملية على الـ GPU مباشرةً، فحينها يجب أن تكون الدوال من مكتبة تورش أو تدعم CUDA. لكن PyTorch قائمة على مبدأ المرونة، بمعنى لا تهتم بكيفية وصول البيانات بل فقط بالشكل النهائي، فالبيانات الخام من أي مصدر وأي شكل، تستطيع معالجتها بأي مكتبة تريد سواء PIL أو panadas ثم تحويلها إلى تحويل إلى torch.Tensor و التدريب في PyTorch. القيد الوحيد هو أن ما يدخل إلى الشبكة في النهاية يجب أن يكون torch.Tensor، أما كل ما يسبق ذلك من قراءة الملفات، المعالجة، الـ augmentation، دمج بيانات إضافية وخلافه فتستطيع إنجازه بأي مكتبة في بايثون. وذلك لأنّ PyTorch مجرد إطار للحوسبة التفاضلية، والـ Autograd يحتاج إلى Tensor لكي يتتبع التدرجات، ولا يهتم بكيفية وصول البيانات إلى الـ Tensor. وجميع التحويلات خارج الرسم البياني كقراءة الصورة أو قصها لا تحتاج إلى أن تكون عمليات torch أصلاً.
    1 نقطة
  42. كما تم الشرح في التعليقات السابقة فإنه يمكنك الحصول على الصور التي تريدها من خلال مواقع الصور المجانية فتحتوي على صور احترافية مثل. Unsplash Pexels Pixabay وابحث عن "MacBook" أو "Laptop on desk" وستجد نتائج جيدة. أما بالنسبة ل Gemini Pro فيقوم بإنتاج صور احترافية ولكن تحتاج تحسين طريقة كتابة "الأمر" أو الـ (Prompt). للحصول على صور احترافية، عليك أن تكون محدداً جداً. لا تكتب: "صورة جهاز ماك بوك" (A picture of a MacBook) بل اكتب وصفاً تفصيلياً كأنك تصف الصورة لمصور محترف: مثال على Prompt احترافي: "صورة واقعية لمنتج، أحدث جهاز MacBook Pro باللون الرمادي الفلكي، موضوع على مكتب خشبي بسيط ونظيف، إضاءة استوديو احترافية ناعمة من الجانب، خلفية بيضاء تماماً، زاوية تصوير منخفضة قليلاً لإظهار فخامة الجهاز، دقة عالية 8K، تفاصيل دقيقة."
    1 نقطة
  43. لا ادري ما سبب مشكلة مع ان مسار صحيح To-Do-List-Fullstack.zip
    1 نقطة
  44. انا حليت مشكلة url لكن توجد مشكلة لم افهمها والتي هي ان دالة PATCH ترجع null بدل من تعديل اما دالة DELETE ترجع استجابة خاظئة ولم افهم ما مشكلة import { connectDB } from "@/app/libs/connectDB"; import { NextRequest, NextResponse } from "next/server"; import Todos from "@/app/models/Todos"; import { authenticate } from "@/app/libs/authenticate"; import mongoose from "mongoose"; type Params = { id: mongoose.Types.ObjectId; } export async function GET(request:NextRequest, {params} : {params: Params }){ try{ await connectDB(); const userId = await authenticate(request); const task = await Todos.findOne({_id: params.id , userId}); return NextResponse.json({task}) }catch(e:any){ return NextResponse.json({error: e.message}, {status:500}) } } export async function PATCH(request:NextRequest , params:Params){ try{ await connectDB(); const {title , content} = await request.json(); const userId = await authenticate(request); const taskUpdate = await Todos.findOneAndUpdate({_id: params.id , userId}, { title , content }, {new: true}); return NextResponse.json(taskUpdate); }catch(e:any){ return NextResponse.json({error: e.message}, {status:500}) } } export async function DELETE(request:NextRequest , params:Params){ try{ await connectDB(); const userId = await authenticate(request); const taskDelete = await Todos.findOneAndDelete({_id: params.id, userId}); if(!taskDelete){ return NextResponse.json({error: "Task not found"}, {status: 404}); } return NextResponse.json(taskDelete); }catch(e:any){ return NextResponse.json({error: e.message}, {status:500}) } }
    1 نقطة
  45. tabibi.انا سويت نفس الفيديو وكل شيء تمام ولكن في اخر الحلقة اصبح لا يظهر عندي اي شيء لما اضغط على زر تسجيل مستخدم جديد ارجوا المساعدة جزاكم الله خير
    1 نقطة
  46. الان اصبحت جاهز لتقدم للأمتحان لكن اريد نصائح قبل استعجال ودخول للامتحان كي اطلع ب استفادة
    1 نقطة
  47. السؤال كيف احول الموقع من RTL الي LTR انا قمت بتغير اللغة و الاتجاة من <html lang="en"dir="ltr"> ولم اغير لينك البوتستراب فتغيرت ولاكن اريد تغير لينك البوتستراب تحدث مشاكل في تنسيق الصفحة Agency project.rar
    1 نقطة
  48. ربما حجم الصورة كبير، فالصو الملتقطة بالكاميرا أو المختارة من المعرض، دقتها عالية جداً مثلاً 4000x3000 بكسل، وعند تحميلها في الذاكرة كـ Bitmap، تستهلك مساحة كبيرة. أو تمرر الصورة كـ Bitmap كامل بين صفحة 2 وصفحة 3 عبر Intent Extras، فتواجه خطأ TransactionTooLargeException. لذا قبل إرسال الصورة إلى Gemini API، يجب تصغير حجمها وضغطها، فنماذج Gemini لا تحتاج إلى صور بدقة 4K للتعرف عليها، يكفي دقة 720p أو 1080p. وإليك مثال: import android.graphics.Bitmap import android.graphics.BitmapFactory import java.io.ByteArrayOutputStream fun resizeAndCompressImage(bitmap: Bitmap, maxDimension: Int = 1024, quality: Int = 80): Bitmap { val originalWidth = bitmap.width val originalHeight = bitmap.height var resizedWidth = originalWidth var resizedHeight = originalHeight // Resize the image (تصغير الأبعاد) if (originalHeight > maxDimension || originalWidth > maxDimension) { if (originalWidth > originalHeight) { resizedWidth = maxDimension resizedHeight = (resizedWidth * originalHeight / originalWidth.toFloat()).toInt() } else { resizedHeight = maxDimension resizedWidth = (resizedHeight * originalWidth / originalHeight.toFloat()).toInt() } } val resizedBitmap = Bitmap.createScaledBitmap(bitmap, resizedWidth, resizedHeight, false) // Compress the image (ضغط الجودة) val outputStream = ByteArrayOutputStream() resizedBitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream) val compressedBytes = outputStream.toByteArray() return BitmapFactory.decodeByteArray(compressedBytes, 0, compressedBytes.size) } val originalBitmap: Bitmap = // الصورة الأصلية val optimizedBitmap = resizeAndCompressImage(originalBitmap) كذلك يجب أن تتم كل عمليات معالجة الصورة والاتصال بالـ API في thread خلفي لتجنب تجميد واجهة المستخدم، وأفضل طريقة للقيام بذلك في أندرويد هي بواسطة Coroutines import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.ai.client.generativeai.GenerativeModel import com.google.ai.client.generativeai.type.content import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import android.graphics.Bitmap class ChatViewModel : ViewModel() { private val generativeModel: GenerativeModel = // تهيئة النموذج هنا fun analyzeImage(prompt: String, image: Bitmap) { viewModelScope.launch { try { val optimizedImage = withContext(Dispatchers.Default) { resizeAndCompressImage(image, maxDimension = 768, quality = 75) } val inputContent = content { image(optimizedImage) text(prompt) } val response = generativeModel.generateContent(inputContent) withContext(Dispatchers.Main) { _chatResponse.value = response.text } } catch (e: Exception) { withContext(Dispatchers.Main) { } } } } } ولا تقم بتمرير الـ Bitmap مباشرة، بل تمرير مسار URI للصورة كـ String من صفحة 1 إلى 2 ثم إلى 3، وفي صفحة 3، قم بقراءة الـ Bitmap من الـ URI ثم قم بمعالجته وإرساله. وبعد التصنيف في صفحة 1، قم بحفظ النسخة المصغرة في ذاكرة التخزين المؤقت للتطبيق ومرر مسار الملف الجديد إلى الصفحات التالية. النموذج المحلي سيعمل على جهاز المستخدم للتصنيف الأولي، لكن مهمة الشات مع Gemini تستطيع نقلها إلى الخادم باستخدام Cloud Functions for Firebase والتي هي أساس Firebase AI Extensions و Genkit. أي في التطبيق سيقوم المستخدم بتصنيف الصورة باستخدام النموذج المحلي، وعند الانتقال لصفحة الشات، ثم يعمل التطبيق على رفع الصورة المُصغّرة إلى Cloud Storage for Firebase. وعند كتابة المستخدم لسؤال، سيقوم التطبيق بإرساله ورابط الصورة في Cloud Storage إلى Cloud Function. وفي الخادم Firebase Cloud Function سيتم تفعيل الـ Function عند استدعائها من التطبيق، سواء مكتوبة بـ Node.js وTypeScript أو Python لتستقبل السؤال ورابط الصورة. ثم تقوم باستدعاء Gemini API من الخادم وذلك أفضل من حيث الأمان، ثم تستقبل الرد من Gemini، ثم إرسال الرد مرة أخرى إلى التطبيق، إما مباشرة كرد على الاستدعاء أو عن طريق كتابته في Firestore أو Realtime Database حيث يستمع التطبيق للتحديثات.
    1 نقطة
  49. أضاف الإصدار ES6 من معايير ECMAScript الصادر عام 2015 ميزة قالب النص Template Literals إلى لغة جافاسكربت والتي تعد شكلًا جديدًا لصياغة السلاسل النصية Strings في جافاسكربت مُضيفًا العديد من الإمكانيات الجديدة الفعّالة، كإمكانية إنشاء سلاسل نصية متعدّدة السطور بطريقة سهلة، وإمكانية استخدام المواضع المؤقتة placeholder لتضمين قيم التعابير البرمجية Expressions في السلاسل النصية. إضافة لوجود ميزة متقدمة تدعى قوالب النصوص الموسومة Tagged Template Literals والتي تسمح لك بإجراء العمليات على التعابير في السلاسل النصية. تزيد كل هذه الإمكانات من خياراتك كمطور لكتابة السلاسل النصية ببراعة واحترافية، جاعلة إياك قادرًا على إنشاء سلاسل نصية ديناميكية يمكن توظيفها في عناوين الويب URLs أو في الإجراءات التي تعدّل عناصر صفحات HTML. ستتعرف في هذا المقال على الاختلافات ما بين السلاسل النصية المحصورة بين علامتي اقتباس مفردة أو مزدوجة وقوالب النصوص، كما ستتعرف على الطرق المتعدّدة للتصريح عن سلاسل نصية من أشكال مختلفة بما يتضمن السلاسل الممتدّة على أكثر من سطر والديناميكية منها التي تتغير تبعًا لقيمة متحول أو تعبير ما. ومن ثمّ ستتعلم عن قوالب النصوص الموسومة وسترى بعض الأمثلة الواقعية لمشاريع باستخدام هذه القوالب. التصريح عن السلاسل النصية سنستعرض في هذا القسم كيفية التصريح عن السلاسل النصية باستخدام علامات الاقتباس المفردة والمزدوجة، ومن ثم سننتقل لاستعراض كيفية إجراء ذلك في حالة استخدام قوالب النصوص. يمكنك كتابة سلسلة المحارف في جافاسكربت باستخدام علامات اقتباس مفردة ' ': const single = 'Every day is a good day when you paint.' كما يمكن كتابة سلسلة المحارف باستخدام علامات اقتباس مزدوجة " ": const double = "Be so very light. Be a gentle whisper." وإجمالًا لا يوجد اختلافات جوهرية ما بين استخدام علامات الاقتباس المفردة أو المزدوجة في جافاسكربت، وذلك على خلاف بعض لغات البرمجة والتي تتيح إمكانية التضمين Interpolation باستخدام إحدى الطريقتين حصرًا، والمقصود بالتضمين التعامل مع المواضع المؤقتة كجزء ديناميكي من سلسلة المحارف. ويعد استخدام علامات الاقتباس المفردة والمزدوجة خيارًا شخصيًا، كما يمكن استخدامهما معًا بشرط إغلاق أيًا منها بنفس نوع البدء: // الإغلاق هنا باستخدام علامة اقتباس مفردة لأننا بدأنا بمثلها const single = '"We don\'t make mistakes. We just have happy accidents." - Bob Ross' // الإغلاق هنا باستخدام علامة اقتباس مزدوجة لأننا بدأنا بمثلها const double = "\"We don't make mistakes. We just have happy accidents.\" - Bob Ross" console.log(single); console.log(double); وسيقوم الإجراء log( )‎ بالنتيجة بطباعة نفس سلسلة المحارف على الخرج: "We don't make mistakes. We just have happy accidents." - Bob Ross "We don't make mistakes. We just have happy accidents." - Bob Ross في حين أنّه تكتب قوالب النصوص عبر حصر السلسة النصية بين علامتي اقتباس مائلتين (`) : const template = `Find freedom on this canvas.` وهي لا تحتاج للإغلاق بعلامة اقتباس مفردة أو مزدوجة: const template = `"We don't make mistakes. We just have happy accidents." - Bob Ross` ولكن لا بدّ من إغلاقها بعلامة اقتباس مائلة كما بدأت: const template = `Template literals use the \` character.` وتؤدّي قوالب النصوص كافّة الوظائف التي تؤديها السلاسل النصية العادية، وبالتالي يمكنك استبدال كافّة السلاسل النصية في مشروعك بقوالب نصوص، إلّا أنّ القواعد الأساسية الشائعة في كتابة الشيفرات البرمجية تنص على استخدام قوالب النصوص فقط عند الحاجة الفعلية لها لما تقدمه من إمكانات إضافية عن السلاسل النصية العادية، وبالتالي يفضّل استخدام علامات التنصيص المفردة أو المزدوجة فقط لحصر السلاسل النصية البسيطة، وهذا ما سيجعل قراءة واختبار شيفرتك البرمجية أسهل لأي مطوّر آخر. الآن وبعد معرفتك لكيفية التصريح عن السلاسل النصية باستخدام علامات الاقتباس المفردة والمزدوجة وعلامات الاقتباس المائلة، سننتقل للتعرّف على أول فوائد قوالب النصوص وهي الكتابة على عدّة أسطر. كتابة السلاسل النصية على عدّة أسطر سنرى بدايةً كيفية التصريح عن السلاسل النصية متعددة الأسطر ما قبل ES6، ثمّ سننتقل لنلاحظ كيف سهّل استخدام قوالب النصوص من هذا الأمر. فسابقًا، وفي حال رغبت بكتابة سلسلة نصية على عدة أسطر في محرر النصوص، كان لا بدّ من استخدام عملية ربط سلاسل (+) والتي لا تمثّل دائمًا الطريقة الأفضل. فمثلًا وعلى خلاف الواقع، يبدو أنّ السلسلة النصية التالية ستظهر عند التنفيذ على عدّة أسطر: const address = 'Homer J. Simpson' + '742 Evergreen Terrace' + 'Springfield' ولكن في الواقع الإجراء السابق سيسمح لك بتقسيم السلسلة النصية إلى أجزاء أصغر وكتابتها على عدّة أسطر في محرر النصوص فقط، دون حدوث أي أثر على نتيجة الخرج، بمعنى أن السلسلة ستظهر على الخرج في سطر واحد وبدون مسافة فاصلة (رغم استخدام مسافات بادئة في بداية كل جزء من السلسلة في محرّر النصوص) بين جزء وآخر منها، ويكون ناتج تنفيذ الإجراء الإجراء log( )‎ عند تمرير المتغير address بالشّكل: Homer J. Simpson742 Evergreen TerraceSpringfield كما يمكنك استخدام الخط المائل العكسي \ لكتابة السلسلة النصية على عدّة أسطر في محرر النصوص كالتالي: const address = 'Homer J. Simpson\ 742 Evergreen Terrace\ Springfield' والميزة هنا أنّ المسافات البادئة ستظهر فعلًا كمسافات فارغة في السلسة النصية الناتجة، إلّا أنّها ستظهر أيضًا على سطر واحد بالشّكل : Homer J. Simpson 742 Evergreen Terrace Springfield والحل الوحيد لإنشاء سلاسل نصية على عدّة أسطر عند التنفيذ هو استخدام محرف الانتقال لسطر جديد ‎\n أثناء كتابة الرمز، مثلًا: const address = 'Homer J. Simpson\n' + '742 Evergreen Terrace\n' + 'Springfield' وسيظهر الخرج عند التنفيذ بالشّكل: Homer J. Simpson\n 742 Evergreen Terrace\n Springfield إلّا أنّ استخدام محرف الانتقال لسطر جديد (‎\n) يمكن ألا يكون أمرًا بديهيًا، فيمكن أن يظن المبرمج أنّ الانتقال لسطر جديد أثناء كتابة الرمز في محرّر النصوص كافيًا لتظهر النتيجة المطلوبة في الخرج، وهذا ما توفره قوالب النصوص؛ فمع استخدامها لن تحتاج لإضافة علامة ربط السلاسل النصية أو محرف انتقال لسطر جديد ولا حتّى خط مائل عكسي، كل ما تحتاجه هو مجرّد الضغط على زر Enter وستظهر السلسلة النصية على عدّة أسطر افتراضيًا، مثلًا: const address = `Homer J. Simpson 742 Evergreen Terrace Springfield` وبذلك سيكون خرج السلسة النصية تمامًا كما كُتبت، أي في مثالنا بالشّكل: Homer J. Simpson 742 Evergreen Terrace Springfield كما أنّ استخدام قوالب النصوص سيحتفظ أثناء التنفيذ بأي مسافات بادئة وضعتها، لذا تجنّب استخدام أي مسافات إلّا في موضعها المطلوب، فمثلًا لدى كتابة الترميز التالي: const address = `Homer J. Simpson 742 Evergreen Terrace Springfield` فبالرغم من كون طريقة الكتابة السابقة أسهل وأنسب للقراءة، إلّا أنّ الخرج لن يكون كذلك، بل سيكون بالشّكل: Homer J. Simpson 742 Evergreen Terrace Springfield بعد التعرّف على السلاسل متعدّدة الأسطر، فيما يلي سنستعرض كيفية تضمين قيم التعابير البرمجية لحالات التصريح عن السلاسل النصية المختلفة. تضمين قيم التعابير البرمجية في السابق وقبل إصدار ES6 كان يستخدم علامة ربط السلاسل النصية لإنشاء سلاسل نصية ديناميكية باستخدام المتحولات أو التعابير البرمجية (سلاسل نصية ذات قيم متغيرة تبعًا لقيم هذه المتحولات أو التعابير البرمجية)، مثلًا: const method = 'concatenation' const dynamicString = 'This string is using ' + method + '.' فعند تمرير dynamicString إلى الإجراء log( )‎، نحصل في الخرج عند التنفيذ على النتيجة: This string is using concatenation. يمكنك تضمين التعابير البرمجية في المواضع المؤقتة مع استخدام قوالب النصوص، ويعبّر عن المواضع المؤقتة برمجيّا باستخدام الرمز ‎${}‎، فيصبح التعامل مع مضمون الأقواس على أنّه جافاسكربت وكل ما هو خارج الأقواس على أنّه سلسلة نصية، كما في المثال: const method = 'interpolation' const dynamicString = `This string is using ${method}.` وعند تمرير dynamicString إلى التابع log( )‎، نحصل في الخرج عند التنفيذ على النتيجة: This string is using interpolation. ويعدّ تضمين القيم في السلاسل النصية لإنشاء عناوين ويب ديناميكية Dynamic URLs من أكثر الأمثلة شيوعًا، لأنّ تنفيذ ذلك باستخدام علامات ربط السلاسل النصية لن يكون بالأمر السهل، فمثلًا الإجراء التالي يعرّف تابعًا لإنشاء السلسلة اللازمة لمنح الوصول لبروتوكول التوثيق OAuth: function createOAuthString(host, clientId, scope) { return host + '/login/oauth/authorize?client_id=' + clientId + '&scope=' + scope } createOAuthString('https://github.com', 'abc123', 'repo,user') وبتمرير هذا التابع إلى تابع log( )‎ نحصل في الخرج على عنوان الويب التالي: https://github.com/login/oauth/authorize?client_id=abc123&scope=repo,user ولكن ومع استخدام ميزة التضمين في السلاسل النصية التي تقدمها قوالب النصوص، لن تكون مضطرًا لاستخدام علامات الربط أو تتّبع أماكن بدء وانتهاء السلاسل، وفيما يلي نستعرض نفس المثال السابق ولكن عند بناءه باستخدام قوالب النصوص: function createOAuthString(host, clientId, scope) { return `${host}/login/oauth/authorize?client_id=${clientId}&scope=${scope}` } createOAuthString('https://github.com', 'abc123', 'repo,user') وهذا ما سيعطي نفس الخرج كما في حالة استخدام علامات ربط السلاسل النصية: https://github.com/login/oauth/authorize?client_id=abc123&scope=repo,user كما يمكنك تطبيق الإجراء trim()‎ على أي قالب محرفي للتخلص من الفراغات في طرفي السلسلة النصية، في المثال التالي استخدامنا البناء المختصر لتابع يُنشئ عنصر قوائم في HTML برابط مخصّص: const menuItem = (url, link) => ` <li> <a href="${url}">${link}</a> </li> `.trim() menuItem('https://google.com', 'Google') ومع استخدام الإجراء trim()‎ ستُقتص الفراغات من على جانبي القالب المحرفي مما يضمن عرض العنصر بطريقة صحيحة، كالتالي: <li> <a href="https://google.com">Google</a> </li> ولا يقتصر التضمين على المتحولات فقط، بل من الممكن تضمين أي تعبير برمجي، كما في مثال إيجاد ناتج جمع عددين التالي: const sum = (x, y) => x + y const x = 5 const y = 100 const string = `The sum of ${x} and ${y} is ${sum(x, y)}.` console.log(string) يعرّف هذا الترميز البرمجي التابع sum، والمتحولين x وy، ومن ثمّ يستخدم كلًا من التابع والمتحولين في سلسلة نصية، وتكون نتيجة التنفيذ على الخرج بالشّكل: The sum of 5 and 100 is 105. ولهذا فائدة كبيرة خاصّة عند استخدام عمليات اتخاذ قرار Ternary Operators، إذ تسمح بتضمين الشروط في السلاسل النصية، مثلًا: const age = 19 const message = `You can ${age < 21 ? 'not' : ''} view this page` console.log(message) وفي هذه الحالة ستتغير الرسالة في الخرج تبعًا لقيم المتحول age هل هو أعلى أم أقل من 21، وبما أنّ قيمة هذا المتحول في مثالنا هي 19، نحصل على الخرج التالي: You can not view this page وبذلك تكون كوّنت فكرة حول فوائد قوالب النصوص في تضمين التعابير البرمجية. وفيما يلي سنتفحّص قدرة قوالب النصوص الموسومة على التعامل مع التعابير البرمجية الممررّة إلى المواضع المؤقتة. قوالب النصوص الموسومة يعد استخدام قوالب النصوص الموسومة ميزة جيدة متطورّة لقوالب النصوص، والتي تسمّى أيضًا بالقوالب الموسومة. ويبدأ القالب الموسوم بتابع وسم يضيف الوسم للقالب المحرفي، مقدمّاً لك المزيد من التحكّم في عمليات التضمين للحصول على سلاسل نصية ديناميكية. في المثال التالي، ستُنشئ تابع وسم يعمل باستخدام القوالب الموسومة، يتضمّن هذا التابع عاملين، سميّ الأوّل string ويتضمّن السلسلة النصية المجردّة، والثاني هو عامل يستخدم مفهوم Rest Parameters والذي يمكن أن يتضمّن عددًا غير محدّدًا من الوسطاء تمثّل التعابير البرمجية المراد تضمينها في السلسلة النصية. يمكنك التحكّم بهذين العاملين والتنفيذ لرؤية ما سينتج عن تعديل كل منهما، بالشّكل: function tag(strings, ...expressions) { console.log(strings) console.log(expressions) } استخدم التابع tag كتابع القالب الموسوم ونفذ عملية التحويل على السلسلة النصية كالتالي: const string = tag`This is a string with ${true} and ${false} and ${100} interpolated inside.` وبما أنّ الترميز يتضمن إخراج كل من العاملين strings وexpressions، يكون الخرج بالشّكل: (4) ["This is a string with ", " and ", " and ", " interpolated inside." (3) [true, false, 100] العامل الأوّل strings عبارة عن شعاع يتضمّن كافّة قوالب النصوص التالية: * "This is a string with " * " and " * " and " * " interpolated inside." كما أنّ الخاصيّة raw متوفرة لهذا الوسيط من خلال استخدام strings.raw، والتي تتعامل مع السلسلة دون أخذ أي سلسلة هروب بالحسبان، فمثلًا يكون التعامل مع ‎/n على أنّه محرف عادي ولن يفسر على أنه انتقال لسطر جديد. العامل الثاني …expressions وهو شعاع rest، ويحوي كافّة التعابير وهي: * true * false * 100 وتمرر السلاسل النصية المجرّدة والتعابير كعوامل لتابع القالب الموسوم tag، ومن الجدير بالملاحظة أنّه ليس من الضروري أن يعيد القالب الموسوم قيم من النوع سلاسل نصية حصرًا، فهو قادر على التعامل معها إلّا أنّه يعيد أي نوع من أنواع المعطيات، فعلى سبيل المثال يمكننا جعل التابع يتجاهل كل شيء ويعيد قيمة خالية null كما في التابع returnsNull التالي: function returnsNull(strings, ...expressions) { return null } const string = returnsNull`Does this work?` console.log(string) وبتمرير المتحول strings إلى الإجراء log( )‎ تكون القيمة المعادة في الخرج: null ويعد تغيير جانبي كل تعبير مضمّن مثالًا على الإجراءات الممكن تنفيذها في القوالب الموسومة، كما في حال رغبتك بإحاطة كل التعابير بأحد وسوم HTML. مثلًا من الممكن بناء التابع bold الذي يقوم بإضافة <strong> و<‎/strong`> إلى جانبي كل تعبير: function bold(strings, ...expressions) { let finalString = '' //التكرار على كافّة التعابير المضمّنة في السلسة expressions.forEach((value, i) => { finalString += `${strings[i]}<strong>${value}</strong>` }) // إضافة السلسلة المجرّدة النهائية finalString += strings[strings.length - 1] return finalString } const string = bold`This is a string with ${true} and ${false} and ${100} interpolated inside.` console.log(string) يستخدم هذا الترميز الحلقة forEach للمرور على كافّة عناصر الشعاع expressions مضيفًا لكل منها عناصر جعل الخط غامقًا، ويكون الخرج الناتج بالشكل: This is a string with <strong>true</strong> and <strong>false</strong> and <strong>100</strong> interpolated inside. ولا يوجد سوى عدد قليل من الأمثلة على قوالب النصوص الموسومة في المكتبات الشائعة من جافاسكربت، فمثلَا تستخدم المكتبة graphq1-tag القالب الموسوم gq1 لتحويل السلاسل النصية من نتائج الاستعلام GraphQL إلى نمط شجرة البنية المجرّدة the abstract syntax tree (AST)‎ وهو النمط الذي يفهمه GraphQL: import gql from 'graphql-tag' // سجل يقوم بالحصول على اسم وكنية المستخدم ذو الترتيب 5 const query = gql` { user(id: 5) { firstName lastName } } ومن المكتبات التي تستخدم توابع القوالب الموسومة أيضًا هي styled-components، والتي تمكنّك من إنشاء عناصر تفاعلية جديدة من عناصر DOM العادية عبر تطبيق تنسيقات CSS عليها: import styled from 'styled-components' const Button = styled.button` color: magenta; ` ومن الآن وصاعدًا يمكن استخدام الثابت Button كمكوّن مخصّص custom component// ولضمان عدم التعامل مع سلسلة نصية على أنّها سلسلة هروب، يمكنك استخدام الإجراء string.raw في قوالب النصوص الموسومة بالشّكل: const rawString = String.raw`I want to write /n without it being escaped.` console.log(rawString) وهذا ما سيعطي الخرج التالي: I want to write /n without it being escaped. الخلاصة راجعت في هذا المقال طريقة استخدام كل من علامات الاقتباس المفردة والمزدوجة في السلاسل النصية، كما تعلمّت عن قوالب النصوص العادية منها والموسومة، إذ تؤدي قوالب النصوص الكثير من المهام الشائعة المتعلقة بالسلاسل النصية بسهولة كبيرة عبر إمكانية تضمين التعابير البرمجية أو الكتابة على عدّة أسطر دون استخدام أي علامة ربط للسلاسل النصية أو استخدام سلاسل الهروب. كما أنّ القوالب المحرفية الموسومة تمثّل ميزة جديدة متطورة والتي قامت العديد من المكتبات الشائعة باستخدامها، مثل GraphQL و styled-components. ترجمة -وبتصرف- للمقال Understanding Template Literals in JavaScript لصاحبه Tania Rascia. اقرأ أيضًا السلاسل النصية (strings) في جافاسكربت كيفية التعامل مع النصوص في البرمجة ترميز النصوص والتعامل مع كائنات الملفات في جافاسكربت
    1 نقطة
×
×
  • أضف...