-
المساهمات
19762 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
472
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Mustafa Suleiman
-
الطريقة الأولى: استخدام API في حالة استخدام API في Django، تستطيع استخدام وحدة التحكم في الاستعلامات QuerySet لإجراء عمليات المقارنة والعمليات المنطقية، والوحدة الأساسية هي filter() التي تسمح لك بتطبيق عمليات المقارنة والعمليات المنطقية. إليك مثال يوضح ذلك: from django.shortcuts import render from django.http import JsonResponse from .models import MyModel def api_view(request): # عملية مقارنة بين حقلين queryset = MyModel.objects.filter(field1__gt=10, field2__lt=20) # عملية منطقية queryset = queryset.filter(field3=True) | queryset.filter(field4=False) # إرجاع النتائج كـ JSON data = list(queryset.values()) return JsonResponse(data, safe=False) تستدعى filter() مرتين لتطبيق عمليتي المقارنة على حقلين مختلفين (field1 و field2)، ثم دمجهما باستخدام المشغل | لتطبيق عملية المنطقية (OR) بينهما، ويتم استرداد النتائج كـ JSON باستخدام JsonResponse(). الطريقة الثانية: استخدام موقع ويب عادي في حالة استخدام موقع ويب عادي في Django، بإمكانك استخدام عمليات المقارنة والعمليات المنطقية في عمليات البحث والتصفية في العرض (view) الخاص بك. مثال: from django.shortcuts import render from .models import MyModel def web_view(request): # عملية مقارنة بين حقلين queryset = MyModel.objects.filter(field1__gt=10, field2__lt=20) # عملية منطقية queryset = queryset.filter(field3=True) | queryset.filter(field4=False) # إرسال النتائج إلى القالب للعرض context = {'data': queryset} return render(request, 'template.html', context) استدعيت filter() بنفس الطريقة لتطبيق عمليات المقارنة والعمليات المنطقية على الحقول، ومن ثم تمرير النتائج إلى القالب template.html للعرض. ولاحظ أنك تستطيع استخدام المشغلات المناسبة مثل gt (أكبر من)، lt (أقل من)، gte (أكبر من أو يساوي)، lte (أقل من أو يساوي)، exact (مطابقة تمامًا)، contains (يحتوي)، startswith (يبدأ بـ)، endswith (ينتهي بـ)، والعديد من المشغلات الأخرى حسب احتياجاتك.
-
عليك أولاً إنشاء ملف PHP جديد بالامتداد .php، مثلاً patients.php، وتضمين ملف الاتصال بقاعدة البيانات الخاصة بك في بداية الملف، بعد ذلك تغيير معلومات الاتصال بالمستضيف وقاعدة البيانات واسم المستخدم وكلمة المرور بمعلومات الاتصال الصحيحة: <?php $host = 'localhost'; $db = 'database_name'; $user = 'username'; $password = 'password'; $connection = new mysqli($host, $user, $password, $db); if ($connection->connect_error) { die('Connection failed: ' . $connection->connect_error); } ?> الآن نأتي لخطوة كتابة استعلام SQL لاسترداد أسماء المرضى المسجلين عند الطبيب المعين، ويجب عليك استبدال doctor_id بالمعرف الخاص بالطبيب في جدول المرضى: <?php $doctor_id = 1; // قم بتغييره بمعرف الطبيب المعين $query = "SELECT name FROM patients WHERE doctor_id = $doctor_id"; $result = $connection->query($query); ?> أخيرً تضمين ملف HTML الذي يحتوي على الهيكل الأساسي لصفحتك، ووضع الكود التالي بعد تضمين ملف الاتصال بقاعدة البيانات: <?php // الاستعلام واسترداد النتائج // يتم وضعها هنا ?> <!DOCTYPE html> <html> <head> <title>قائمة المرضى</title> </head> <body> <h1>قائمة المرضى</h1> <table> <thead> <tr> <th>الاسم</th> </tr> </thead> <tbody> <?php while ($row = $result->fetch_assoc()) { ?> <tr> <td><?php echo $row['name']; ?></td> </tr> <?php } ?> </tbody> </table> </body> </html> <?php $connection->close(); ?> استخدمت العلامة <?php ... ?> لتضمين الكود الخاص بلغة PHP داخل صفحة HTML، والاستعلام SQL يتم تنفيذه واسترداد النتائج في الجزء المشار إليه في التعليق "الاستعلام واسترداد النتائج". وعليك بتغيير قيمة doctor_id إلى المعرف الصحيح للطبيب المعين.
-
للتوضيح، المشكلة لديك هي رسالة الخطأ Android SDK file not found: adb وتظهر لديك بالشكل التالي: Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 2.5.3, on Microsoft Windows [Version 10.0.22000.318], locale en-US) [!] Android toolchain - develop for Android devices (Android SDK version 31.0.0) ✗ Android SDK file not found: adb. [✓] Chrome - develop for the web [✓] Visual Studio - develop for Windows (Visual Studio Community 2019 16.11.0) [✓] Android Studio (version 2020.3) [✓] VS Code (version 1.62.3) [✓] Connected device (3 available) ولحل تلك المشكلة عليك بالخطوات التالية: 1- توجه إلى SDK manage في Android Studio، كما بالصورة: أو من الزر التالي: وعليك بالتأكد من أنك قمت بتثبيت Android SDK Platform-Tools وستجدها أسفل تبويب SDK Tools كما بالصورة: أي عليك تفعيل ذلك الخيار، وأيضًا تفعيل خيار Android SDK Command-line Tools كما بالصورة التالية: وفي النهاية اضغط على Ok ثم قم بتشغيل flutter doctor مرة أخرى.
-
بالإضافة إلى ما تم ذكره، عليك أن تتعلم المفاهيم الأساسية لتعلم الآلة. يشمل ذلك فهم ماهية النماذج والخوارزميات والتقنيات المستخدمة في المعالجة الإحصائية والتعلم العميق. وتستطيع البدء بقراءة الكتب المتخصصة في هذا المجال مثل "Hands-On Machine Learning with Scikit-Learn and TensorFlow" و "Pattern Recognition and Machine Learning" و "Deep Learning" لاكتساب الفهم العميق لهذه المفاهيم. والمجال يحتاج منك إلى تعلم الإنجليزية بشكل جيد حيث أن جميع المصادر والشروحات هي بالإنجليزية. بعد ذلك عليك بتعلم استخدام الأدوات والمكتبات المستخدمة في تعلم الآلة مثل TensorFlow وKeras وScikit-learn، وتلك المكتبات توفر واجهات برمجة التطبيقات (APIs) التي تسهل تنفيذ الخوارزميات وتجربتها، وبإمكانك البدء بتطبيق أمثلة الشفرة الموجودة في وثائق هذه المكتبات لفهم كيفية استخدامها. وإليك بعض المصادر التي ستفيدك: Coursera: يقدم دورات مجانية ومدفوعة في مجال الذكاء الاصطناعي وتعلم الآلة بواسطة جامعات عالمية مرموقة. edX: منصة أخرى للتعلم عبر الإنترنت توفر مجموعة واسعة من الدورات في الذكاء الاصطناعي وتعلم الآلة. Stanford University's CS229: هذه الدورة المسجلة بجامعة ستانفورد تغطي مفاهيم تعلم الآلة بشكل عميق ومفصل. TensorFlow: TensorFlow هي إطار عمل مشهور لتعلم الآلة والذكاء الاصطناعي، ويتوفر لديهم موقع وثائق شاملة ومنتدى مجتمع نشط للمساعدة وتوجيه المطورين. Kaggle: منصة تنافسية ومجتمع لعلم البيانات وتعلم الآلة، وتوفر مسابقات ومجموعات بيانات ونقاشات تقنية. Medium وTowards Data Science: يحتوي موقع Medium على العديد من المقالات والمدونات المتخصصة في تعلم الآلة والذكاء الاصطناعي، ويمكنك استعراض هذه المواقع للحصول على محتوى قيم. بودكاست وقنوات YouTube: هناك العديد من البودكاست والقنوات على YouTube التي تغطي مواضيع تعلم الآلة والذكاء الاصطناعي، بعض الأمثلة هي "Lex Fridman Podcast" و "Two Minute Papers" و "Sentdex" و "3Blue1Brown". Fast.ai : هي منصة تعليمية تقدم دورات عبر الإنترنت في مجال التعلم العميق وتطبيقاتها، وتتميز بتوفير مسارات تعلم سريعة ومناسبة للمبتدئين وتشجيع التعلم العملي والتطبيقات العملية. PyTorch: هو إطار عمل شهير لتعلم الآلة والذكاء الاصطناعي. يتميز بقوة ومرونة في تصميم النماذج وتطويرها، ويوفر واجهة سهلة الاستخدام لتنفيذ الخوارزميات والتعامل مع البيانات. AI for Everyone : دورة تدريبية تقدمها شركة Coursera ويُقدمها Andrew Ng، الذي يعتبر من أبرز الشخصيات في مجال التعلم الآلي، وتستهدف هذه الدورة الجمهور غير المتخصص في مجال البرمجة أو التقنية، وتهدف إلى تعريفهم بمفاهيم الذكاء الاصطناعي وتطبيقاتها في العالم الحقيقي.
- 7 اجابة
-
- 1
-
-
الكود الذي كتبته لا يعمل بسبب بعض الأخطاء النحوية والترتيبية: في السطر الأول، يجب أن تنتهي الجملة بعلامة النقطة المنقوطة (:) بدلاً من الفاصلة (،). في السطر الثاني، لا توجد أي تعليمة طباعة محددة. في السطر الثالث، يجب أن تضيف الفراغات اللازمة قبل كلمة for وفي بداية السطر، وأيضًا استخدام علامة الترتيب العكسي (<) في نطاق range() لأن الحلقة تحتاج إلى القيم من 1 إلى 5 فقط (للطباعة من 1 إلى 5 نجوم). في السطر الرابع، يجب أن تزود الجملة المطبوعة (print()) بالجملة الذاتية (i) بدلاً من الفاصلة. في السطر الخامس، عليك أن تضيف الفراغات اللازمة قبل كلمة print(). وهنا الكود الصحيح لطباعة الشكل المطلوب في لغة Python: for i in range(1, 6): for j in range(i): print("*", end=" ") print() عليك بتعديل الكود كما هو موضح، وهو يقوم بتكرار الطباعة لمجموعة من النجوم بناءً على قيمة المتغير i. في الدورة الأولى ستطبع نجمة واحدة، الدورة الثانية ستطبع نجمتين، وهكذا حتى الدورة الخامسة التي ستطبع خمس نجوم. وإذا قمت بتشغيل الكود، ستحصل على النتيجة التالية: * * * * * * * * * * * * * * *
- 6 اجابة
-
- 1
-
-
في البداية ذلك أمر طبيعي جدًا، لكن عليك بمعرفة الطريقة الصحيحة، وهي مشاهدة 4 فيديوهات مثلاً لو كانت صغيرة ثم التطبيق عليها، أم لو كان الفيديو كبير فعليك بمشاهدة نصفه ثم التطبيق بمفردك ثم إكمال الفيديو، ثم إعادة التطبيق مرة أخرى من البداية بمفردك. والأمر يبدوا ممل ولديك إحساس يدفعك لضرورة الإنتهاء من الدورة، لكن لا تستمع له فأنت من ستعاني، والوقت الذي تظن أنك تهدره هو من سيجنبك العودة بشكل متكرر للدراسة من جديد. أنت بحاجة إلى التكرار والتكرار هنا لا أقصد مشاهدة الفيديو أكثر من مرة، بل مرتين كافية جدًا ثم التطبيق أكثر من مرة لو احتجت إلى ذلك حتى تفهم الكود الذي تكتبه وعليك بالتغيير قليلاً أو إنشاء مشروع مختلف بنفس الفكرة مثلاً وهكذا لتجبر نفسك على التعلم وعلى تجربة أشياء جديدة ولا تخف من ذلك الجميع مر بنفس التجربة، الفارق هو من يجتهد ويصبر بشكل أكبر ولمدة أطول، لذلك تجد القليل يتحمل تجربة تعلم البرمجة. ولا مشكلة بالعودة كل فترة للمراجعة وتثبيت ما قمت بدراسته سواء بمشاهدة الفيديو أو كتابة الكود، فالتعلم عملية تكرارية على فترات متباعدة، وأنت لسة آلة بل بحاجة إلى المراجعة على فترات متباعدة والأهم هو كتابة الكود. وأنصحك بقراءة النقاشات التالية:
- 3 اجابة
-
- 1
-
-
هذا الكلام غير صحيح بالمرة، عليك أولاً بتحديد المجال الذي تريد العمل به بناءًا على المطلوب في سوق العمل لديك أي تستطيع العمل به بخبرة سنة أو مستوى Fresh، ولديك مثلاً مجال تطوير الويب أو تطبيقات الهاتف أو .NET فإذا اخترت مجال الويب فدائمًا ما أن تصبح Full-stack في البداية وذلك سيتيح لك الكثير من الفرص ثم التخصص في الواجهة الخلفية أو الأمامية بعد سنتين إلى ثلاث من الخبرة العملية. وإذا كان لديك الوقت، فأنصحك بتعلم أساسيات البرمجة عن طريق C++ ثم تعلم أساسيات بايثون بشكل سريع، ثم دراسة المسار الخاص بالمجال الذي اخترته. وإذا كان مستواك في علوم الحاسب ضعيف نسبيًا، فأنصحك بتعلم الأساسيات من خلال بايثون. وقد تم النقاش بالتفصيل عن سؤالك في النقاشات التالية:
- 4 اجابة
-
- 1
-
-
عليك بتنفيذ الأمر التالي في MySQL إذا كان هناك إمكانية لذلك: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'admin'; وهو يستخدم لتعديل حساب المستخدم 'root' على المضيف 'localhost' في قاعدة البيانات MySQL، وتحديد أنواع المصادقة المدعومة في هذا الأمر على أنها 'mysql_native_password'، و تعيين كلمة المرور الجديدة للحساب على 'admin'. ثم تنفيذ الأمر التالي: FLUSH PRIVILEGES; وهو يقوم بإعادة تحميل وإعادة تقديم قائمة الامتيازات الخاصة بالمستخدمين والأدوار، وعند تنفيذه، يتم تحميل أي تغييرات حديثة تم إجراؤها في جداول الامتيازات وإعادة تحميل الامتيازات في الذاكرة لتكون سارية المفعول.
-
أولاً أنا لا أنصحك بشراء لاب توب إلا في حالة كنتي ستتنقلين به خارج المنزل، وأنصحك بشراء PC والسبب أن الحاسوب منخفض التكلفة مقارنًة باللاب توب وأيضًا مواصفاته مرتفعة مقابل السعر المنخفض. وعلى العكس اللاب توب سعره مرتفع ومواصفاته منخفضة، مقارنًة إذا قمتي بشراء حاسوب بنفس السعر. وأيضًا الحاسوب أفضل من حيث الإنتاجية والتركيز، بسبب وجود شاشة وماوس منفصل ولوحة مفاتيح، ويتحمل العمل الشاق وعمره طويل وأعطاله أقل. وبخصوص المواصفات تم النقاش حول ذلك في النقاشات التالية:
-
الخطأ يعني أن الجدول 'posts' موجود بالفعل في قاعدة البيانات ولا يمكن إنشاؤه مرة أخرى، وذلك أمر طبيعي يحدث عندما تحاول تشغيل عملية إنشاء جدول عن طريق التهجير والجدول بالفعل موجود في قاعدة البيانات. لذلك الأمر الصحيح هو التالي: php artisan migrate:fresh --seed فهو يستخدم في Laravel لإعادة إنشاء وتحديث قاعدة البيانات بالجداول والبيانات الأولية، و يتكون من عدة أجزاء: "php artisan": يشير إلى تشغيل أمر Laravel عبر واجهة سطر الأوامر. "migrate:fresh": يعني أنه سيتم إعادة إنشاء كل الجداول في قاعدة البيانات، ويتم حذف جميع الجداول الموجودة في قاعدة البيانات وإعادة إنشائها بناءًا على ملفات الترحيل (migrations) الموجودة في مشروع Laravel. "--seed": يشير إلى أنه سيتم تشغيل ملفات بزر البيانات الأولية (seeds) بعد إعادة إنشاء الجداول، وملفات البزر تستخدم لإضافة بيانات افتراضية أو تجريبية إلى قاعدة البيانات بعد إعادة إنشاء الجداول.
- 3 اجابة
-
- 1
-
-
دالة xxxValue() في جافا تستخدم لتحويل قيمة كائن من النوع xxx إلى قيمة بدائية من النوع المناسب، حيث xxx هو نوع الكائن الأصلي. مثلاً، في الكود الخاص بك، f.longValue() يقوم بتحويل قيمة الكائن f من النوع Integer إلى قيمة بدائية من النوع long. والدالة xxxValue() توجد في العديد من أنواع الكائنات في جافا، مثل Integer, Double, Float, Long, Boolean, وغيرها، وتستخدم للتحويل بين هذه الأنواع المختلفة. أما بالنسبة للاختلاف بين استخدام الدالة xxxValue() وعدم استخدامها في الحالة التي ذكرتها، في حالة قام الكود بالتحويل المباشر مثل long g = f;، يتم تنفيذ عملية التحويل ضمن عملية التجاوز الضمني (implicit casting)، والتي تتم بشكل تلقائي من قبل جافا، وذلك لأن الكائن f من النوع Integer يمكن تحويله بشكل ضمني إلى long. بالنسبة لأيهما أسرع، فلا يوجد اختلاف كبير في الأداء بين الطريقتين، فتتم عملية التحويل في حالة استخدام الدالة xxxValue() ضمن الدالة نفسها، بينما تتم عملية التحويل بشكل ضمني في حالة استخدام عملية التجاوز الضمني. عمومًا، الفرق في الأداء بين الطريقتين غير ملحوظ وغالبًا لا يؤثر على أداء البرنامج.
- 3 اجابة
-
- 1
-
-
عليك بتحميل السكريبت بشكل Deferred حيث سيتم الإنتظار لحين تحميل الـ DOM بشكل كامل، ثم سيتم تشغيل السكريبت مما يعني أن العناصر ستكون موجودة داخل الـ DOM، وذلك باستخدام خاصية defer كالتالي: <script src="index.js" defer></script> وأيضًا هناك خاصية باسم async ويتم تنفيذ السكريبت بشكل موازي (غير متزامن)، وهذا يعني أنه يتم تنفيذ السكريبت بمجرد تحميله دون أن يتوقف تنفيذ العناصر الأخرى في الصفحة عن العمل، أي تنفيذ السكريبت في الوقت الذي يتوفر فيه. وانتبه إلى أن تنفيذ السكريبتات بشكل موازي يمكن أن يؤدي إلى ترتيب تنفيذ غير متسلسل للسكريبتات إذا كانت معتمدة على بعضها البعض. وبالطريقة العادية لاستخدام الوسم <script>، يتم تشغيل السكريبت فور تحميله، ويتوقف تنفيذ عناصر HTML الأخرى في الصفحة حتى يتم تنفيذ السكريبت بالكامل، وقد يتسبب في تأخير تجهيز وعرض المحتوى الأساسي للمستخدمين. ومن المهم ملاحظة أن تنفيذ السكريبتات بشكل مؤازر يمكن أن يؤدي إلى ترتيب تنفيذ غير متسلسل للسكريبتات إذا كانت معتمدة على بعضها البعض. أما defer فيتم تأجيل تنفيذ السكريبت حتى بعد تحميل صفحة الويب بالكامل، وتنفذ السكريبتات بترتيب الظهور في الصفحة بعد العناصر الأخرى، مما يسمح بتنفيذ السكريبت بعد استكمال تنفيذ الصفحة، ويضمن ذلك أن جميع العناصر الأخرى متاحة وجاهزة للاستخدام. فإذا كان لديك سكريبت يتطلب الوصول إلى DOM (نموذج الكائنات القابلة للوصول) أو العناصر الأخرى في الصفحة، فيفضل استخدام defer لضمان توافر هذه العناصر قبل تنفيذ السكريبت.
-
حاول القيام بالتعديلات التالية عليك بتعديل الدالة app.get() للحصول على البيانات المحدثة من Google Sheet، باستخدم googleSheets.spreadsheets.values.get للحصول على الصفوف المحدثة بدلاً من الصفوف الكاملة، وتستطيع استخدام علامة الوقت (timestamp) لتتبع آخر تحديث للبيانات. app.get('/', async (req, res) => { try { // كود الاستدعاء والتحقق من المصادقة والترخيص لخدمة Google Sheets API هنا const spreadsheetsId = "19Z6XyZSTDvGt1VwL17znI8GoRUvTP0OMwckHujP312E"; const range = "Sheet1!A:E"; // تعديل نطاق البيانات حسب الاحتياج const getRows = await googleSheets.spreadsheets.values.get({ auth: auth, spreadsheetId: spreadsheetsId, range: range, }); const updatedData = getRows.data.values; // قم بتحديث البيانات في قاعدة بيانات MongoDB هنا // يمكنك استخدام مكتبة Mongoose لتحديث البيانات في موديل User for (const data of updatedData) { const user = { userName: data[0], // تأكد من تعديل الفهرس بناءً على هيكلة البيانات في جوجل شيت // قم بتحديث المزيد من الحقول إذا لزم الأمر وفقًا لهيكل البيانات في جوجل شيت }; await User.findOneAndUpdate({ userName: user.userName }, user, { upsert: true, // إضافة السجل إذا لم يكن موجودًا }); } res.send(); } catch (error) { console.log(error); res.status(500).send(); } }); وتأكد من تعديل المدى (range) لتناسب هيكلة البيانات في Google Sheet، وفي الكود السابق، استخدمت "Sheet1!A:E" كمثال، حيث يتم افتراض وجود 5 حقول (من A إلى E) في كل صف. وفي حلقة for، قم بتحويل البيانات المستلمة من Google Sheet إلى كائنات user واستخدم findOneAndUpdate لتحديث السجلات الموجودة في قاعدة البيانات أو إضافة سجل جديد إذا كان غير موجود (upsert: true).
- 2 اجابة
-
- 1
-
-
السبب هو أنك لم تقم بإنشاء ملف باسم .gitignore والذي يتجاهل كافة الملفات والمجلدات ما عدا الكود المصدري الخاص بالمشروع، أي لا يتم رفع مجلد venv مثلاً فبه البيئة الإفتراضية الخاصة بك وأيضًا المكتبات التي تم تثبيتها. ولذلك عليك بإنشاء ملف بالاسم التالي في مجلد المشروع: .gitignore ولاحظ وجود نقطة في بداية الاسم، أي ذلك الملف يتم إنشائه بجوار مجلد venv لديك ومجلد taskaty الخاص بالمشروع. وضع به التالي: ولكن يجب التوضيح نص الملف gitignore التالي خاص ببايثون، وسأقوم بإرفاق ملف خاص بمشاريع الويب في المرفقات أي التي تستخدم HTML, CSS, JS. ### Python ### # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST .history/ # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coveage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ pytestdebug.log # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ doc/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ pythonenv* # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # pytype static type analyzer .pytype/ # profiling data .prof # Virtualenv # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ .Python [Bb]in [Ii]nclude [Ll]ib [Ll]ib64 [Ll]ocal [Ss]cripts pyvenv.cfg .venv pip-selfcheck.json ثم عليك بتنفيذ الأمر التالي: git rm -r --cached من أجل إزالة التعقب عن الملفات والمجلدات التي لا نريد تعقبها كما أشرنا إليها في الملف .gitignore وبعد ذلك قم بإعادة أوامر رفع المشروع وهي: 1- قم بإضافة كل ملفات المشروع لرفعها من خلال الأمر التالي: git add . 2- عمل commit من خلال الأمر التالي: git commit -m "Upload files" 3- إضافة العنوان البعيد (remote URL) لمستودع GitHub الخاص بك مع الأمر التالي: git remote add origin https://github.com/moazzant226/react.git أخيرًا، استخدم الأمر التالي لرفع التحديثات إلى مستودع GitHub الخاص بك: git push -u origin main .gitignore
- 1 جواب
-
- 1
-
-
ألف مبروك يا منتصر، وسنك صغير ما شاء الله عليك صراحة، واصل إجتهاد وهتحقق أكتر بكتير إن شاء الله، وركز إنك تتعلم الأساسيات كويس ومتستعجلش إنت لسة صغير وحاول تشتغل على مشاريع بعد الأساسيات ومتركزش أوي على تعلم إطارات العمل والمكتبات وتتجاهل الأساسيات. لأنها هي اللي هتخليك تتعلم وتستخدم أي لغة وإطار عمل أو مكتبة بسهولة بعد كدة، وتتعلم أسرع. حاول بناء مشروع كبير باللغات الأساسية التي تعلمتها، مثل تنفيذ تطبيق SPA باستخدام HTML, CSS, JS فقط وستتعلم الكثير من ذلك.
- 2 اجابة
-
- 1
-
-
حاول استخدام المسار التالي في متغيرات البيئة: C:\src\flutter\bin والذي بداخله ملف flutter.bat وذلك هو ما نريده، وعليك بالتوجه لذلك المسار والتأكد من وجود ذلك الملف، فإن كان في مسار آخر فعليك بتعديل المسار في متغير البيئة للمسار الصحيح للمجلد الذي يوجد به ذلك الملف. الآن قم بالحفظ، ثم تأكد من إغلاق منفذ الأوامر تمامًا وإعادة فتحه مرة أخرى وتشغيل الأمر التالي: flutter doctor ومن المفترض أن تجد لديك شكل كالتالي: وإذا لم يفلح الأمر فعليك بتحميل Flutter SDK للويندوز من الرابط التالي: https://docs.flutter.dev/get-started/install/windows ثم قم بفك الضغط عن الملف الذي قمت بتحميله، ونقل مجلد flutter الذي نتج من عملية فك الضغط إلى المسار التالي على قرص الـ C : C:\src\flutter أي أن مجلد flutter يجب أن يكون داخل مجلد باسم src داخل قرص الـ C.
-
أهلاً بك @أبو سلمان Farouk نعتذر عن أي مشكلة تواجهك، في البداية أرجو منك تفقد الدورة في حسابك عن طريق تسجيل الدخول لحسابك الذي قمت منه بشراء الدورة، ثم البحث عن خانة دوراتي كما بالصورة: وعند الضغط على دوراتي من المفترض أن تجد الدورات الخاصة بك، وإن لم تجدها أرجو منك التحدث إلى مركز المساعدة الخاص بأكاديمية حسوب، وستجد نافذة تطلب منك إدخال بريك إلكتروني. فأدخل البريد الذي قمت بشراء الدورة من خلاله أي الحساب الذي به الدورة، وسيصلك كود على بريدك الإلكتروني قم بإدخاله وستجد نافذة المحادثة أمامك وأخبرهم بتفاصيل المشكلة وأرجو الإنتظار لـ 24 ساعة.
-
مثلما أشار إليك عمر أنت بحاجة إلى التلاعب بالـ DOM من أجل عرض قيمة الزر الذي تضغط عليه على شاشة الآلة الحاسبة في المكان المخصص لها، وإليك مثال بسيط تستطيع تجربته بنفسك: <!DOCTYPE html> <html> <head> <title>آلة حاسبة</title> <style> .calculator { width: 200px; padding: 10px; border: 1px solid #ccc; } </style> </head> <body> <div class="calculator"> <input type="text" id="screen" disabled> <br> <button id="btn1">1</button> <button id="btn2">2</button> <button id="btn3">3</button> <br> <button id="btn4">4</button> <button id="btn5">5</button> <button id="btn6">6</button> <br> <button id="btn7">7</button> <button id="btn8">8</button> <button id="btn9">9</button> <br> <button id="btn0">0</button> </div> <script> const screen = document.getElementById("screen"); function appendToScreen(number) { screen.value += number; } const buttons = document.querySelectorAll("button"); buttons.forEach((button) => { button.addEventListener("click", (event) => { const number = event.target.innerHTML; appendToScreen(number); }); }); </script> </body> </html> استخدمتquerySelectorAll بدلاً من getElementsByTagName أو getElementById للحصول على جميع الأزرار، ثم استخدمت forEach للتكرار عبر كل عنصر زر وإضافة الحدث click بداخله. وعرفت المتغير number داخل الحدث للحصول على قيمة الزر، وبالمثل، عرفت الدالة المخصصة appendToScreen التي تقوم بإضافة القيمة الخاصة بالزر وعرضها على الشاشة بجانب الأرقام الأخرى التي تم إدخالها.
-
كلاً من load و with هما وظيفتان تستخدمان في التعامل مع العلاقات بين النماذج (Models) في قاعدة البيانات. 1- load تُستخدم لتحميل العلاقات المرتبطة (Eager Loading) مع نموذج محدد، وعندما تقوم بتحميل العلاقات، يتم استعادة البيانات المرتبطة مسبقًا من قاعدة البيانات وتعيينها مع النموذج الأصلي. مثلاً، لنفترض أن لدينا نموذجين User و Post، وبينهما علاقة "المستخدم لديه العديد من المنشورات" (User has many posts)، واستخدام load لتحميل المنشورات المرتبطة بمستخدم معين عند الحاجة. إليك مثالًا: $user = User::find(1); $user->load('posts'); وفيه يتم تحميل المنشورات المرتبطة بالمستخدم ذو الهوية 1 من قاعدة البيانات وتخزينها في النموذج. 2- with تُستخدم لتحميل العلاقات المرتبطة (Eager Loading) مع الاستعلام الأساسي، وتساعد في تقليل عدد استعلامات قاعدة البيانات المنفصلة التي يتم إجراؤها عند الوصول إلى العلاقات. بمعنى إذا كنت تريد استرداد قائمة المستخدمين مع منشوراتهم، تستطيع استخدام with لتحميل العلاقة في نفس الاستعلام. مثال: $users = User::with('posts')->get(); يتم استرداد قائمة المستخدمين من قاعدة البيانات مع تحميل المنشورات المرتبطة بهم. أي تستخدم load عندما تحتاج إلى تحميل العلاقات بشكل فردي لنموذج محدد، بينما يُفضل استخدام with عندما تحتاج إلى تحميل العلاقات مع الاستعلام الأساسي للاستفادة من التحميل المسبق وتقليل استعلامات قاعدة البيانات.
-
1- لربط حساب جوجل في عملية تسجيل الدخول إلى الموقع، تستطيع استخدام خدمة تسجيل الدخول باستخدام جوجل (Google Sign-In)، وتلك الخدمة توفر واجهة برمجة التطبيقات (API) التي تسمح للمستخدمين باستخدام حسابات جوجل الخاصة بهم لتسجيل الدخول إلى موقعك. وذلك من خلال الخطوات التالية: قم بإنشاء مشروع جديد في واجهة مطوري Google (Google Developers Console) وقم بتكوينه بحيث يكون لديك مفتاح API الخاص بك. استخدم واجهة برمجة التطبيقات (API) ومكتبة تطوير جوجل (Google API Client Library) المناسبة للغة البرمجة التي تستخدمها للتواصل مع خدمة تسجيل الدخول باستخدام جوجل. عليك بتضمين زر تسجيل الدخول باستخدام جوجل في واجهة المستخدم الخاصة بك وأضف الوظائف المطلوبة لمعالجة عملية تسجيل الدخول باستخدام جوجل. عندما يقوم المستخدم بالنقر على زر تسجيل الدخول باستخدام جوجل، سيتم إعادته إلى صفحة جوجل لتسجيل الدخول ومنح إذن لمشاركة معلومات حسابه. بعد ذلك، ستتلقى تطبيقك رمزًا مؤقتًا (authorization code) يمكنك استخدامه لاسترداد معلومات المستخدم الخاصة به من خلال خدمة تسجيل الدخول باستخدام جوجل. وهناك مكتبات شائعة تستخدم لإضافة ميزة إنشاء الحساب وتسجيل الدخول عن طريق جوجل وغيرها، مثل Firebase Authentication وPassport.js وauth0. 2- لإضافة المعلومات مثل الصور والعنوان والسعر إلى موقعك، بإمكانك استخدام نموذج (Form) في واجهة المستخدم الخاصة بك لجمع هذه المعلومات من المستخدمين، وتستطيع استخدام تقنيات متعددة للسماح للمستخدم بتحميل الصور وإدخال المعلومات الأخرى: رفع الصور: عن طريق عنصر إدخال نوع الملف (File Input) في نموذجك للسماح للمستخدمين بتحميل الصور، وعند تلقي النموذج، باستطاعتك استخدام لغة البرمجة التي تستخدمها للتعامل مع الملفات المرسلة وحفظها على الخادم الخاص بك. العنوان والسعر: من خلال حقول الإدخال (Input Fields) في نموذجك لجمع العنوان والسعر من المستخدم، مثل حقول نص (Text Fields) أو حقول رقمية (Numeric Fields) حسب الحاجة. بعد جمع هذه المعلومات من المستخدم، يمكنك معالجتها وتخزينها في قاعدة البيانات الخاصة بك أو تنفيذ أي إجراءات أخرى بناءًا على متطلبات موقعك. 3- عندما يتم تسجيل دخول المشرف (أو المستخدم ذو الصلاحيات الإضافية) إلى الموقع، عليك بتوفير واجهة إدارة (Admin Interface) مخصصة له، وعليك أن تقرر فإما أن تكون هذه الواجهة مستقلة عن واجهة المستخدم العادية أو جزءًا منها، حسب متطلباتك وتصميم الموقع، وهناك عدة خيارات: واجهة إدارة منفصلة: بتطوير واجهة إدارة مستقلة عن واجهة المستخدم العادية، تحتوي هذه الواجهة على العناصر والوظائف الإضافية التي يحتاجها المشرف، مثل إضافة وحذف العناصر وإضافة الأعضاء وغيرها، والوصول إلى هذه الواجهة من خلال تسجيل دخول المشرف. تعديل الواجهة الحالية: بدلاً من إنشاء واجهة إدارة منفصلة، تستطيع توسيع واجهة المستخدم الحالية لتضم الوظائف والعناصر الإضافية التي يحتاجها المشرف، وإظهار هذه العناصر والوظائف إما بشكل دائم للمشرف أو بناءً على صلاحياته للتحكم في رؤية ووصول المستخدمين. تبديل الصلاحيات: بتوفير خيار للمشرف لتبديل صلاحياته بين وضع المشرف ووضع المستخدم العادي، في حالة التبديل إلى وضع المشرف، يتم عرض الوظائف والعناصر الإضافية ويتمكن المشرف من إجراء التعديلات اللازمة، وذلك يسمح للمشرف بالتنقل بسهولة بين الأدوار المختلفة دون الحاجة إلى واجهة مستخدم منفصلة. 4- هناك إمكانية للمتاجر السماح بعمليات الشراء بدون تسجيل الدخول، ولكن العديد منها يعتبر تسجيل الدخول أمرًا مطلوبًا لأسباب الأمان والتجربة الشخصية للمستخدم. فمن خلال تسجيل الدخول، يتم التحقق من هوية المستخدم وضمان أن العمليات المتعلقة بالطلب والدفع تتم بشكل آمن وصحيح، واستخدام بيانات المستخدم لتتبع الطلبات وإرسال التحديثات والتنبيهات المتعلقة بالطلبات. أيضًا يتاح للمستخدمين الاحتفاظ بتفاصيلهم الشخصية وعناوين التوصيل بشكل مريح، مما يتيح لهم إتمام عملية الشراء بسرعة في المرات اللاحقة دون إدخال المعلومات مرة أخرى. بعد تسجيل الدخول، بإمكان المتجر تخصيص تجربة التسوق بناءً على تفضيلات المستخدم وتاريخ الطلبات السابقة، ويتاح للمستخدمين حفظ العناصر في سلة التسوق والرجوع إليها لاحقًا وتجهيز الطلب بسهولة.
- 3 اجابة
-
- 1
-
-
في دالة onSave التي قمت بتعريفها في المثال السابق في RichTextField، قم بتنفيذ الخطوات التالية لحفظ النص والصور والروابط في Firebase: استخدم Firebase Auth للتحقق من هوية المستخدم والتأكد من أنه مسجل دخوله. استخدم Firebase Firestore لإنشاء وثيقة جديدة وحفظ النص والصور والروابط في حقول مناسبة، وباستطاعتك تخزين الصور في تخزين Firebase Storage وتخزين روابطها في Firestore، وتخصيص الطريقة التي تحفظ بها البيانات في Firebase حسب طبيعة تطبيقك. مثلاً، لحفظ محتوى المحرر (النص والصور والروابط) في Firebase Firestore، من الممكن تعريف حقول كالتالي: حقل "نص" (Text field) لتخزين النص الذي يتم إدخاله أو تحريره. حقل "صورة" (Image field) لتخزين الصورة المحملة من المحرر. حقل "روابط" (Links field) لتخزين الروابط المدخلة.
