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

ياسر مسكين

الأعضاء
  • المساهمات

    2939
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    6

كل منشورات العضو ياسر مسكين

  1. الجواب حول هذا التساؤل سيكون نسبيا لأبعد الحدود، فمن جهة لا يلزم أن تكون مبرمجا بالكامل لتحليل البيانات لكن معرفة أساسيات البرمجة بلغة مثل Python ستكون لازمة للقيام بمعظم الأنشطة في تحليل البيانات، مثلا يمكن استخدام مكتبات جاهزة مثل pandas و NumPy لمعالجة البيانات و matplotlib و seaborn لرسم البيانات دون الحاجة لمهارات برمجية عميقة. فمثلا باستخدام أساسيات البرمجة في Python والمكتبات المناسبة مثل pandas و NumPy، يمكن البدء في استكشاف البيانات وتحليلها باستخدام الرسوم البيانية والإحصائيات الوصفية. بعد ذلك، يمكن بتطبيق أدوات التحليل الاستكشافي والنماذج الإحصائية أو التنبؤية حسب الحاجة لفهم أفضل للبيانات وتحقيق الأهداف المحددة.
  2. لدي تجربة جيدة في العمل الحر، ويمكنني أن أوصي بموقع "مستقل" للعمل الحر، فمنصة مستقل هي إحدى المنصات الشهيرة على الإنترنت التي تُمكّن العمل الحر وتوفر فرصا للمستقلين لعرض خدماتهم ومهاراتهم والعمل مع العملاء من جميع أنحاء العالم بحيث يُمكنك كمستخدم في المنصة العمل على مشاريع مختلفة في مجالات مثل التصميم، البرمجة، التسويق الرقمي، الترجمة، كتابة المحتوى، وغيرها الكثير. فهي توفر بيئة آمنة وموثوقة للتعاملات بين العملاء والمستقلين، وتُعتبر واحدة من الوجهات الرئيسية للبحث عن مواهب مستقلة على الإنترنت مما يحقق التبادل. أما العمل بوظيفة عن بعد فمنصة "بعيد" لها باع كبير في هذا المجال والتخصص. إليك بعض المقالات التي تتناول الموضوع:
  3. يمكنك نقل تطبيقاتك من خلال فتح متجر Google Play على الجهاز الذي ترغب في نقل التطبيقات منه. ثم الضغط على القائمة الجانبية (ثلاث خطوط أفقية) الموجودة في الزاوية اليسرى العليا. تختار "حسابي" ثم تضغط على "إدارة الحسابات على هذا الجهاز". بعدها تختار الحساب الذي يحتوي على التطبيقات التي ترغب في نقلها. وعند تبويب "التطبيقات والألعاب" يمكنك أن تختارها ثم تضغط على "تثبيت" أو "اشتري مرة أخرى. وبعد الانتهاء من هذه الخطوات، ستظهر التطبيقات المختارة في قائمة "تطبيقاتي" في متجر Google Play على الحساب الجديد الذي تم تسجيل الدخول به.
  4. بالنسبة للمشكلة التي واجهتك فيجب عليك إزالة هذا العنصر من الـ XML لأنه ليس جزءا من عناصر HTML. بالتالي، يُعتبر كنص ترغب في كتابته. أما بالنسبة للصور، إذا كانت المشكلة تتعلق بتغطية الصورة للنصوص واحتلالها للصف بأكمله، فالسبب يكمن في وضعك للصورة كخلفية للصف بأكمله. والحل ممكن من خلال إنشاء عنصر جديد يحتوي على الصورة، مثلما هو موضح في الكود التالي: <td style="text-align: center; padding-bottom: 30px;"> <div style="height: 50px; width: 50px; background-image: url('images/member_image.jpg'); background-size: 90px;"></div> <h1>بطاقة عضو بعثة</h1> <div><img src="images/avatar/defaultImage.png" alt="" style="width: 100px;"></div> <h2>{{ $hajj->full_name_ar }}</h2> <h2>{{ $hajj->full_name_en }}</h2> {{-- <h4>{{ $hajj-> }}</h4> --}} <h4> رئيس اللجنة </h4> <h4> عضو </h4> <h4> عضو </h4> </td>
  5. هل يمكنك إرفاق مجلد المشروع كاملا لتصفحه ومعرفة المشكلة بالتحديد؟
  6. الأمر "ps" يعرض قائمة بالعمليات المتصلة بالمستخدم الحالي أو جميع العمليات إذا تم تشغيله بصلاحيات الجذر في نظام ويندوز، الأمر الذي يعادل "ps" في نظام UNIX هو الأمر "tasklist"، وهو يستخدم لعرض قائمة بجميع العمليات التي تعمل في النظام. بحيث أن هذا الأمر سيعرض قائمة بجميع العمليات التي تعمل في النظام مع معلومات حول كل عملية مثل اسم العملية ومعرف العملية وحالتها والذاكرة المستخدمة والمزيد.
  7. هل تستخدم PyCharm؟ إن كان نعم، يمكنك إختيار "Create New Project" من القائمة الرئيسية. ثم تبدء في تكوين بيئة العمل الخاصة بـ Flask: تختار "Flask" من قائمة القوالب. تحدد موقع المشروع واسمه. تنقر على "Create". إن كان لديك آخر تحديث فسيولّد لك التركيبة تلقائيا، سيكون لديك 3 مجلدات: venv خاص بال Virtual Environment، ومجلد Static عادة يتم وضع فيه ملفات ال CSS وغيرها. ومجلد Template أين نضع فيه ملفات ال Html. بينما كود البايثون نضعه في ملف app.py أوأي ملف آخر لا يهم التسمية، بحيث يكون في جذر المشروع أي ال root. وهذا تفصيل ومثال للهيكلة: بحيث: `app/`: يمثل الدليل ويحتوي على تطبيق Flask. `static/`: نضع فيه الملفات الثابتة مثل CSS و JavaScript والصور، إلخ. `templates/`: نضع فيه قوالب HTML. `venv/`: هذا الدليل يحتوي على البيئة الافتراضية للمشروع. يتم إنشاؤها تلقائيا بواسطة PyCharm عند إنشاء بيئة افتراضية جديدة. `app.py`: هذه عادةً نقطة الدخول لتطبيق Flask وفيها كود بايثون. أتمنى أن يكون شرحي واضحا. يمكن استخدام أي تركيبة أو هيكلة لكن هذه تعمل في حالة لم تغير في الكود الأخير لأنه يعمل عندي بشكل عادي.
  8. يمكنك ذلك، فالمساهمة في المشاريع المفتوحة المصدر تعتبر فرصة رائعة لنا كمبرمجين للمشاركة في تطوير البرمجيات والتعلم من الخبراء في المجال، يمكن ذلك من خلال العديد من الطرق، فبداية يمكنك ببساطة البدء بالبحث عن مشروع مفتوح المصدر على منصات مثل GitHub والتحقق من المشاكل المفتوحة (Issues) التي يحتاج المشروع إلى مساعدة فيها. بعد ذلك، يمكنك الشروع في تحسين الكود أو إضافة ميزات جديدة. كما يمكنك البدء بالمساهمة في المناقشات والدعم الفني بحيث يمكنك المشاركة في منتديات المشروع والمناقشات عبر البريد الإلكتروني لتقديم المساعدة للمستخدمين الآخرين والإجابة على الأسئلة التقنية. بالنسبة لنا كمبرمجين، المساهمة في مشاريع مفتوحة المصدر توفر العديد من الفوائد فهي: فرصة لتطوير مهارات البرمجة واكتساب خبرة عملية في بيئة تعاونية. فرصة للتعلم من الآخرين والعمل بشكل مشترك مع مبرمجين ذوي خبرة. فرصة لبناء سجل عمل (Portfolio) قوي يمكن استخدامه في المستقبل للحصول على وظائف أو فرص أخرى في مجال تطوير البرمجيات. فرصة للتواصل والتعرف على مجتمع واسع من المطورين والمهتمين بنفس التكنولوجيا أو المجال. يمكنك الاستفادة ومعرفة الطرقوالكيفية من خلال هذه المصادر القيمة:
  9. لقد أعدت تشغيل المشروع والمشروع يعمل عندي بشكل عادي، قم بالتأكد من أن مشروعك له نفس هذه التركيبة والهيكلة، وتأكد من وجود مجلد باسم Template في جذر المشروع، كما هو مبين في الصورة المرفقة:
  10. اختيار الحاسوب المناسب للبرمجة يخضع لعدة عوامل، من بينها تفضيلاتك واحتياجاتك، فمثلا تعلم البرمجة ليس كالعمل كمبرمج مباشرة، لأن التعلم لا يحتاج إلى قدرات كبيرة من الحاسوب، وأغلب المبرمجين حينما نقرأ أو نسمع عن بداياتهم نجدهم قد بدؤوا بمعالجات ضعيفة، ثم تدرجوا في استعمال الحواسيب ليصلوا إلى أجهزة قوية نسبيا. لكن عموما، الحاسوب المناسب للبرمجة سيحتاج إلى مجموعة مواصفات تتيح للمبرمج العمل بكفاءة وسلاسة خاصة مع بيئات التطوير المختلفة وتشغيل البرامج بسرعة ودون مشاكل.بعض المواصفات التي أراها مناسبة وضرورية هي: المعالج القوي، يمكن استخدام معالجات متطورة مثل Intel Core i5 أو i7 أو ما يعادلها من AMD، والتي توفر أداءً سريعًا وفعالا لتشغيل التطبيقات وعمليات البرمجة المتعددة. ذاكرة RAM بحيث تكون كافية، العديد من المصادر تقول بأنه يجب أن تكون على الأقل 8 جيجابايت من ذاكرة الوصول العشوائي لكن شخصيا أفضل أن تكون 16 جيغا أو أكثر لكونها تساعد في تشغيل التطبيقات بسلاسة. أيضا، ستحتاج إلى حاسوب يوفر مساحة خاصة، وإلى بطاقة رسومات جيدة، خاصة إذا كنت تعمل على تطوير التطبيقات ذات الرسوميات المتقدمة أو الألعاب أو الوسائط المتعددة، فقد تحتاج إلى بطاقة رسومات منفصلة بدلا من الرسومات المدمجة.
  11. لقد اطلعت على المشروع ووجدت أنه فيه بعض المشاكل البرمجية، بما أنك تستخدم فلاسك، استخدمت Pycharm كي أشغل المشروع لأنه يسهل العمل كثيرا وأنصح دائما باستخدامه. أولا، يجب أن تنشئ مشروعا جديدا من نوع Flask ثم تضع الكود الخاص ب index.html في مجلد Templates. لقد وضعت عليه تعديلات أيضا وهذا هو الكود الصحيح: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Prisoner's Dilemma Game</title> </head> <body> <h1>Prisoner's Dilemma Game</h1> <button id="cooperate-btn">Cooperate</button> <button id="defect-btn">Defect</button> <div id="result"></div> <script> document.getElementById('cooperate-btn').addEventListener('click', function() { playGame(1); }); document.getElementById('defect-btn').addEventListener('click', function() { playGame(0); }); function playGame(decision) { var xhr = new XMLHttpRequest(); xhr.open("POST", "/api/play", true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { var response = JSON.parse(xhr.responseText); document.getElementById('result').innerText = response.result; } }; var data = JSON.stringify({"decision": decision}); xhr.send(data); } </script> </body> </html> ثم تضيف كود pp.py مكان الكود الموجود في ملف app.py، وهو الآخر عدلت عليه بهذا الشكل: import random from distutils.util import execute from flask import Flask, jsonify, request, render_template import qiskit app = Flask(__name__) def player_decision(playername): while True: decision = input(f"{playername}, do you Cooperate (C) or Defect (D)? ").upper() if decision == 'C': return run(1) elif decision == 'D': return run(0) else: print("Invalid input, please choose 'C' for Cooperate or 'D' for Defect.") def game_outcome(player1_decision, player2_decision): if player1_decision[0] > player2_decision[0]: return (3, 3) # Both cooperate elif player1_decision[0] < player2_decision[0]: return (0, 5) # Player 1 cooperates, Player 2 defects elif player1_decision[0] == player2_decision[0]: return (5, 0) # Player 1 defects, Player 2 cooperates else: return (1, 1) # Both defect def run(s, num_bits=10): alice_key, bob_key = bb84_protocol(num_bits, s) if s == 1: return sum(alice_key), sum(bob_key) else: return 0, 0 def bb84_protocol(num_bits, s): alice_bits = [int(bit) for bit in ''.join(random.choices(['0', '1'], k=num_bits))] alice_bases = [int(bit) for bit in ''.join(random.choices(['0', '1'], k=num_bits))] alice_message = encode_message(alice_bits, alice_bases) bob_bases = [int(bit) for bit in ''.join(random.choices(['0', '1'], k=num_bits))] bob_measurements = measure_message(alice_message, bob_bases) matching_indices = compare_bases(alice_bases, bob_bases, s) if matching_indices: alice_key = [alice_bits[i] for i in matching_indices] bob_key = [bob_measurements[i] for i in matching_indices] return alice_key, bob_key return alice_bits, bob_bases def encode_message(bits, bases): message = [] for i in range(len(bits)): qc = qiskit.QuantumCircuit(1, 1) if bases[i] == 0: if bits[i] == 0: pass else: qc.x(0) else: if bits[i] == 0: qc.h(0) else: qc.x(0) qc.h(0) message.append(qc) return message def measure_message(message, bases): backend = Aer.get_backend('qasm_simulator') measurements = [] for i in range(len(message)): if bases[i] == 0: message[i].measure(0, 0) else: message[i].h(0) message[i].measure(0, 0) job = execute(message[i], backend, shots=1) result = job.result() measured_bit = int(list(result.get_counts(message[i]).keys())[0]) measurements.append(measured_bit) return measurements def compare_bases(alice_bases, bob_bases, s): indices = [] if s == 1: for i in range(len(alice_bases)): if alice_bases[i] == bob_bases[i]: indices.append(i) return indices else: return 0 @app.route('/') def index(): return render_template('index.html') @app.route('/api/play', methods=['POST']) def play_game(): data = request.get_json() player_decision = data.get('decision') player1_decision = player_decision[0] player2_decision = player_decision[1] # Your game outcome logic here result = { "result": { "Player 1's decision": "Cooperate" if player1_decision == 1 else "Defect", "Player 2's decision": "Cooperate" if player2_decision == 1 else "Defect", "Player 1's score": 0, # Replace with your calculated score "Player 2's score": 0 # Replace with your calculated score } } return jsonify(result) if __name__ == '__main__': app.run(debug=True) بحيث قمت بإضافة مسار كي يتعرف على الملف في الفرونت أند، وإضافة الدالة التي تقوم بتوليد الملف وعرضه على هذا الرابط: وهذه هي الدالة مع المسار: @app.route('/api/play', methods=['POST']) def play_game(): data = request.get_json() player_decision = data.get('decision') player1_decision = player_decision[0] player2_decision = player_decision[1] # Your game outcome logic here result = { "result": { "Player 1's decision": "Cooperate" if player1_decision == 1 else "Defect", "Player 2's decision": "Cooperate" if player2_decision == 1 else "Defect", "Player 1's score": 0, # Replace with your calculated score "Player 2's score": 0 # Replace with your calculated score } } return jsonify(result) if __name__ == '__main__': app.run(debug=True) ثم تعرض بهذا الشكل في الصورة:
  12. لتنشيط نظام التشغيل Windows على الجهاز، يجب أولا عليك العثور على مفتاح الترخيص الخاص بنسخة Windows التي اشتريتها، عادة يأتي هذا المفتاح مع النسخة أو يرسل إليك عبر البريد الإلكتروني في حالة الشراء عبر الإنترنت، ثم بمجرد وجود المفتاح، يمكنك فتح إعدادات Windows والبحث عن قسم "التنشيط". بعد ذلك، قم بإدخال مفتاح الترخيص في المكان المخصص واتبع التعليمات لإتمام عملية التنشيط.، في النهاية يجب أن تظهر رسالة تؤكد نجاح التنشيط بعد الانتهاء، ومفتاح الترخيص عادة يكون على شكل سلسلة من 25 حرفا وأرقام. على سبيل المثال: ABCDE-FGHIJ-KLMNO-PQRST-UVWXY. ويمكنك الاطلاع على المزيد من المعلومات من هنا:
  13. بما أنك تستخدم JavaScript في الفرونتأند، فستحتاج إلى تكامل الباك إند (بايثون) مع الواجهة الأمامية باستخدام نقاط النهاية (API) و AJAX، بما أنك لم ترفق ملف الفرونت أند الخاص بك، سأشرح لك عبر مثال عملي لربط الباك إند بالواجهة الأمامية (HTML) باستخدام AJAX. هنا نستخدم أجاكس من أجل إرسال الطلبات واستلام البيانات. فلنفترض أن لديك ملف بايثون اسمه `backend.py` يحتوي على الكود الخاص بالباك إند، وملف HTML اسمه `index.html` للواجهة الأمامية. أولا، تقوم بإنشاء نقطة النهاية في الباك إند، مثلا باستخدام فلاسك تكون بهذا الشكل: from flask import Flask, jsonify, request app = Flask(__name__) @app.route('/api/play', methods=['POST']) def play_game(): decision = request.json.get('decision') # Assuming JSON data is sent # Add your game logic here result = {"result": "Game result based on decision: " + decision} return jsonify(result) if __name__ == '__main__': app.run(debug=True) ثم نستخدم AJAX في ملف HTML (`index.html`)، بهذا الشكل: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Prisoner's Dilemma Game</title> </head> <body> <h1>Prisoner's Dilemma Game</h1> <button id="cooperate-btn">Cooperate</button> <button id="defect-btn">Defect</button> <div id="result"></div> <script> document.getElementById('cooperate-btn').addEventListener('click', function() { playGame(1); }); document.getElementById('defect-btn').addEventListener('click', function() { playGame(0); }); function playGame(decision) { var xhr = new XMLHttpRequest(); xhr.open("POST", "/api/play", true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { var response = JSON.parse(xhr.responseText); document.getElementById('result').innerText = response.result; } }; var data = JSON.stringify({"decision": decision}); xhr.send(data); } </script> </body> </html> هنا قمت باستخدام XMLHttpRequest في JavaScript لإرسال طلب POST إلى نقطة نهاية /api/play في الباك إند، ثم قمت بتحديث عنصر div مع النتيجة المستلمة من السيرفر.
  14. لا يوجد جواب سحري لتساؤلك حول إيجاد الفكرة، لكن يمكنني مساعدتك. إيجاد الفكرة الإبداعية قد يكون صعبا خاصة في هذا الوقت، وإنشائها من الصفر، لهذا فأول خطوة يمكنك البدء فيها هي عن طريق عمل نسخ (Clones) لتطبيقات مشهورة أو أفكار موجودة في السوق هذا يمكن أن يوفر لك العديد من الفوائد كفهم عملية التطوير فعند عمل نسخ لتطبيقات مشهورة، ستحصلين على فرصة لفهم كيفية بناء التطبيقات الناجحة وتنظيمها ويمكن أن تتمكني من اكتساب الخبرة العملية خاصة في عملية التطوير وحل المشاكل التقنية. والعديد من المبرمجين والمطورين بدؤوا بهذا الشكل، عن طريق استخدام النسخ التي قاموا بإنشائها ثم قاموا بعرضها كجزء من معرض أعمالهم الشخصي أو الاحترافي، مما عزز من فرص الحصول على عمل مستقبلي. الطريقة الأفضل لإيجاد الأفكار هي عن طريق الخروج إلى الواقع والبحث عن المشاكل التي تواجه الناس، والمؤسسات وتعيق تقدمهم فالتقنية والبرمجة أتت لهذا الغرض لتسهل حياة الناس، وتحل مشاكلهم عن طريق برمجيات نقوم ببرمجتها نحن كمبرمجين.
  15. معرض أعمالك لا يزال جديدا، ويمكنك أن تقوم بالتحسين منه كي يظهر بشكل جيد، على سبيل المثال، إذا كنت ترغب في إظهار مهاراتك في بناء واجهات برمجة التطبيقات (APIs)، يمكنك إنشاء مشروع API بسيط يقوم بإرجاع بيانات حول المستخدمين، مثل اسم المستخدم والبريد الإلكتروني، ويمكنك إنشاء مشروع لإدارة قاعدة بيانات SQLite بواجهة بسيطة تسمح بإضافة وحذف البيانات، وهذا مثال ليس للحصر، يمكنك إضافة أية مشاريع قمت بإنجازها من قبل، وإن لم تكن يمكنك إرفاق هذه المشاريع الصغيرة. النقطة الأهم هي إرفاق كل مشروع بملف README.md بحيث يكون يحتوي على تفاصيل المشروع وكيفية استخدامه. فمثلا في حالة وضع مشروع ال API، يمكن توضيح كيفية استخدام كل نقطة نهاية (endpoints) مع البيانات المتوقعة للإرجاع. اللمسة السرحية في البرمجة هي استخدام أساليب "Clean Code" لجعل الأكواد البرمجية أكثر تنظيما. الكثيرون لا يعرفون كيفية إنشاء ملف README جيد، عليك أن تضبطه بحيث تقوم بشرح كيفية تثبيت المشروع وتشغيله واستخدامه بشكل واضح ومبسط، حتى أنه يمكن إضافة صور شاشة لتوضيح كيفية عمل التطبيق. لاحظت أنك عملت عدة Commits لكن يبدو أنها غير منتظمة، لهذا الحساب الجيد يمكنك الحرص عليه من خلال عمل Commits منتظمة وواضحة مع رسائل شرح للتغييرات التي قمت بها أو تلك التي قمت بإضافتها أو أضافها زملاؤك في المشروع. وبعد أن تتمكن جيدا يمكنك نشر مشاريعك عبر منصات الاستضافة السحابية لتمكين الآخرين من تجربتها أو المساهمة فيها.
  16. أي متصفح تعمل عليه؟ العديد من المستخدمين واجهوا عدة مشاكل عند العمل ب Google Chrome ولم تكن يظهر لهم تبويب ال Keys حاول أن تغير المتصفح إلى سفاري. في حالة ذلك هذه هي الطريقة الأصح والآمنة للحصول على المفتاح: يجب أن تمتلك صلاحيات الأدمين وتكون مالك الحساب الفعلي كي تظهر لك التبويبة. يمكنك التوجه إلى تبويب: المستخدمون والوصول ثم حينما تظهر لك قائمة المفاتيح يمكنك النقر فوق الزر "+" لإنشاء المفتاح بسهولة. يمكنك إعطاؤه اسما ودورا وتحديد المهام المنوطة إليه. في حال لم يعمل معك توجد طريقة أخرى عبر التوجه مباشرة إلى تبويب: Integration ثم سيظهر لك زر طلب المفتاح وطلبه مباشرة، هي تظهر لأغلب المستخدمين في أغلب المتصفحات.
  17. بالطبع يجب أن تقوم ببعض التعديلات كي تعمل خاصية ال Height بشكل عادي، يمكنك استخدام قيمة `auto` لارتفاع العنصر الأساسي (`main`) بدلا من `max-content` أو `()minmax`، مع تعيين `height` للعنصر الأب (`wrapper`) ليكون بنفس ارتفاع العنصر الأساسي. ههذا سيؤدي إلى تحقيق الهدف أيضا يمكنك التعديل عليه بهذا الشكل: * { box-sizing: border-box; } .wrapper { display: grid; grid-template-columns: repeat(5, 1fr); grid-template-areas: "main main main aside aside"; gap: 20px; height: auto; } .main { background-color: red; grid-area: main; min-height: 400px; height: auto; } .aside-bar { background-color: blue; grid-area: aside; } بهذا التعديل، العنصر الأساسي (`main`) سيحصل على ارتفاع مرن بناء على احتياجات المحتوى، في حين يكون ارتفاع العنصر الأب (`wrapper`) متناسبا مع ارتفاع العنصر الأساسي.
  18. بالطبع، يمكنك تعريف الكلاس (Class) داخل دالة (Function) في Python فهذا يعتبر من الأمور الممكنة في لغة Python بسبب طبيعتها الديناميكية وقابليتها للتعامل مع العديد من الهياكل المرنة، وهذا مثال ممكن على ذلك: def create_class(): class MyClass: def __init__(self, name): self.name = name def greet(self): print("Hello,", self.name) return MyClass # تعريف الكلاس باستخدام الدالة MyClass1 = create_class() obj1 = MyClass1("Yasse") obj1.greet() # سيطبع: Hello, Yasser # تعريف كلاس جديدة MyClass2 = create_class() obj2 = MyClass2("Yasser") obj2.greet() # سيطبع: Hello, Yasser ففي هذا المثال، تم تعريف الفئة `MyClass` داخل الدالة `()create_class`. ثم تم إرجاع هذه الفئة من الدالة. وعند استدعاء `()create_class`، يتم إنشاء فئة جديدة في كل مرة. وهذا ما يسمح بإنشاء عدة فئات مختلفة باستخدام نفس التعريف الأساسي.
  19. المشكلة تكمن في كون TinyMCE لا يقوم بتوليد اللغة تلقائيا، لذلك يجب عليك النظر في حزم اللغات الخاصة به عبر هذا الرابط من أجل تغيير واجهة المستخدم الخاصة بـ TinyMCE للعربية: https://www.tiny.cloud/docs/configure/localization/#language بحيث يمكنك تحميلها والعمل بها في مشروعك بشكل عادي: https://www.tiny.cloud/get-tiny/language-packages/ ولأنه لا يوجد قيمة افتراضية لخيار content_langs فإذا لم يتم تحديد قيمة، فإن زر شريط الأدوات وعنصر القائمة للغة لن يكون متاحا، توفر إضافة Spell Checker Pro قيمة افتراضية لهذا الخيار. وهذا مثال على استخدام content_langs: tinymce.init({ selector: 'textarea', // قم بتغيير هذا وفقًا لـ HTML الخاص بك toolbar: 'language', content_langs: [ { title: 'الإنجليزية', code: 'en' }, { title: 'الإسبانية', code: 'es' }, { title: 'الفرنسية', code: 'fr' }, { title: 'الألمانية', code: 'de' }, { title: 'البرتغالية', code: 'pt' }, { title: 'الصينية', code: 'zh' } ] }); أما بخصوص التوجيه أو ال directionality: فيوجد خيار لهذا بالفعل، ويسمح لك بتحديد الاتجاه الأساسي للنص الذي لا يحمل توجيها محددا (أي النص الذي لا يحمل توجيها ثابتا كما هو معرف في Unicode) داخل المحرر. هذا يشبه استخدام السمة 'dir' عند استخدام عناصر قابلة للتحرير بمفردها. القيم الافتراضية: 'ltr' القيم الممكنة: 'ltr', 'rtl' وهذا مثال على استخدام ال directionality: tinymce.init({ selector: 'textarea', // قم بتغيير هذه القيمة وفقًا لـ HTML الخاص بك directionality : 'ltr' }); ويحدد هذا الخيار اللغة المستخدمة لواجهة مستخدم TinyMCE، مثل عناصر القائمة والحوارات والتلميحات. بشكل افتراضي، بحيث يتم تعيين واجهة مستخدم TinyMCE باللغة المعينة. وفي حال واجهت مشاكل أكثر يوجد بدائل تم ذكرها ومناقشتها في هذا الرابط:
  20. شكرا على إرفاقك لملفات المشروع. لقد تصفحتها، ووجدت أن المشكلة تكون بعد الضغط على أي منتج لتصفحه، هنا يظهر لك الخطأ الأول وهو عبارة عن خطأ [ERR_HTTP_HEADERS_SENT]: ويعني أنه لا يمكن تعيين الرؤوس بعد إرسالها إلى العميل في errorMiddleware.js ويحدث هذا الخطأ عادة عند محاولة إرسال أكثر من استجابة واحدة لطلب واحد، وغالبًا ما يكون السبب في ذلك هو إرسال استجابة في middleware أو معالجات الطرق ثم محاولة إرسال استجابة أخرى لاحقًا. حللت المشكلة من خلال التأكد من إرسال استجابة واحدة فقط لكل طلب، وهنا في ` ، نقوم بتجنب إرسال استجابة إذا تم بالفعل إرسال الرؤوس.من خلال إضافة هذين السطرين في برمجية errorHandler في ملف errorMiddlware.js: if (res.headersSent) { return next(err); // تمرير الخطأ إلى middleware التالي إذا تم بالفعل إرسال الرؤوس } بهذا الشكل: const errorHandler = (err, req, res, next) => { if (res.headersSent) { return next(err); // تمرير الخطأ إلى middleware التالي إذا تم بالفعل إرسال الرؤوس } let statusCode = res.statusCode === 200 ? 500 : res.statusCode; let message = err.message; res.status(statusCode).json({ message: message, stack: process.env.NODE_ENV === "production" ? null : err.stack, }); }; export { errorHandler }; بعد حل المشكل يظهر الخطأ التالي كما هو موضح في الصورة، وهو متعلق بالمورد فهو غير موجود والخطأ يكمن في ملف productController.js، ويحدث هذا الخطأ عندما يُتوقع وجود مورد (في هذه الحالة ، هو عبارة عن منتج) ولكنه لا يتم العثور عليه.لضمان التعامل الصحيح مع الأخطاء وإرجاع الاستجابات المناسبة عند عدم العثور على الموارد، يمكن تصحيح الكود من خلال استرداد المنتج باستخدام ال Id بالشكل الصحيح بهذا الشكل في ملف productController.js، import asyncHandler from "../middlewares/asyncHandler.js"; import Product from "../models/productModel.js"; /** * desc Fetch All Products * route Get /api/products * access Public */ const getProducts = asyncHandler( async(req, res) => { const products = await Product.find({}) res.json(products) }); /** * desc Fetch Product By Id * route Get /api/products/id * access Public */ const getProductById = asyncHandler(async (req, res) => { const product = await Product.findById(req.params.id); if (product) { res.json(product); return; // Add return here to exit the function after sending the response } res.status(404).json({ message: 'Resource not found' }); // Use 404 status for resource not found }); export { getProducts, getProductById }; وهكذا لن تظهر أي مشكلة.
  21. الخوارزمية التي أعددتها جيدة بشكل عام هي تقوم بعرض مكونات اللعبة الرئيسية، ثم تقوم تحديد الإجراءات بناءً على المدخلات، فيتم التحقق من الزر الذي يتم الضغط عليه وتحديد الإجراء المناسب، أما بالنسبة لتحديد الحركة فيكون ذلك اعتمادا على الزر المضغوط وبناء عليه يتم توجيه حركة الدبابة، وإذا تم الضغط على زر المسطرة، تظهر قذيفة الدبابة وتتحرك في نفس الاتجاه الذي كانت تتجه إليه الدبابة. وفي النهاية يتم التحقق مما إذا تم تدمير الدبابات الصغيرة أو لا وفقا لعدد مرات اللمس. هل هي على هذا النحو؟ بالنسبة للخوازمية بشكل عام يمكنك تحسينها من خلال إضافة مستويات صعوبة متعددة للعبة، مثل زيادة عدد الدبابات الصغيرة أو زيادة سرعة حركتها، مما يجعل اللعبة أكثر تحديًا وإثارة، يمكنك كتطوير لها مثلا أن تقوم بتصميم بيئة متعددة الأبعاد بحيث تتيح للاعب استكشاف بيئة ثلاثية الأبعاد أو بيئة أكثر تفاعلية، مما يجعل التجربة أفضل.
  22. توجد العديد من المواقع والمنصات التي يمكن التعلم منها، لكني شخصيا أفضل مقالات الأكاديمية لأنها تقدم شرحا مبسطا وشاملا وكافيا يغنيني من تشعب الدروس من موقع إلى آخر، يمكنك مثلا إيجاد ما تبحث عنه حول لغة جافا سكريبت في هذه المقالات: https://academy.hsoub.com/programming/javascript ومن خلال هذه المقالة يمكنك تعلم أساسيات البحث وخوارزميات البحث المختلفة:
  23. أتمنى إرفاق الكود كاملا لتجربته كي أفحصه جيدا. بشكل عام، الخطأ في الكود هنا نشأ عندما تمت محاولة تعيين رأس الاستجابة بعدما تم بالفعل إرسال الاستجابة إلى العميل، ففي الكود يتم استخدام دالة `()res.status().json` لإرسال الرد في `errorHandler` عند حدوث خطأ ال middleware. فالمشكلة تتضمن التالي: الموقع: يمكن تحديده من خلال المسار الذي يشير إليه الخطأ. في هذه الحالة، يتم إظهار الموقع كمسار الملف `errorMiddleware.js`. الخطأ: يتم توضيح الخطأ الذي يحدث. في هذه الحالة، يشير الخطأ إلى أنه لا يمكن تعيين رأس الاستجابة بعد إرسالها للعميل، والذي يُطلق الاستثناء `Error [ERR_HTTP_HEADERS_SENT]`. حاولت أن أشرح رسالة الخطأالتي ظهرت فعند حدوث خطأ في التطبيق، يتم استدعاء `()res.status().json` في ملف `errorMiddleware.js` لإرسال استجابة JSON. ومع ذلك، يحدث خطأ "Cannot set headers after they are sent to the client" لأن الاستجابة قد تم بالفعل إرسالها، وبالتالي يتعذر تعيين رأس الاستجابة مرة أخرى. ولتجنب هذا الخطأ، يُنصح بالتحقق مما إذا كانت الرؤوس قد تم إرسالها بالفعل قبل تعديلها. يمكن ذلك عن طريق التحقق من خاصية res.headersSent فإذا لم تكن الرؤوس قد تم إرسالها بالفعل، يمكن تعديل الاستجابة بشكل طبيعي، وإلا فإنه يُستدعى () next لتمرير التحكم إلى المنطقة التالية في سلسلة وسائط Express. وهذا هو الكود الصحيح: const errorHandler = (err, req, res, next) => { let statusCode = res.statusCode === 200 ? 500 : res.statusCode; let message = err.message; if (!res.headersSent) { res.status(statusCode).json({ message: message, stack: process.env.NODE_ENV === "production" ? null : err.stack, }); } next(); }; export { errorHandler }; ويمكنك استخدامه للتحقق مما إذا كانت الرؤوس قد تم إرسالها بالفعل قبل تعديلها، وفقط إذا لم تكن قد تم إرسالها بالفعل، وهنا يتم تعديل الاستجابة وإرسالها إلى العميل بشكل عادي.
  24. بالطبع يمكن إنشاء بوت داخل الواتساب باستخدام Python، بحيث يكون لهذا البوت القدرة على قراءة الرسائل والتفاعل معها باستخدام بعض المكتبات، مثل: pywhatkit: تُستخدم لإرسال واستقبال الرسائل عبر واتساب. twilio: تستخدم للاتصال بخدمات الرسائل النصية، بما في ذلك واتساب. whatsapp-web: تستخدم للتفاعل مع واجهة واتساب عبر الويب. selenium: تستخدم للتحكم في المتصفح وتنفيذ الإجراءات التفاعلية على واجهة واتساب عبر الويب. وهذا مثال عملي باستخدام pywhatkit بحيث سننشئ به بوتا بسيطا يقوم بالترحيب بالمستخدمين الجدد: import pywhatkit def reply_to_message(message): if message.lower() == "مرحبا": return "مرحبا! كيف يمكنني مساعدتك؟" else: return "آسف، لم أفهم ما تعنيه. يمكنك محاولة شيء آخر." def receive_and_reply(): while True: message = input("أدخل رسالتك: ") reply = reply_to_message(message) print("الرد:", reply) receive_and_reply() هذه فكرة بسيطة عن كيفية استخدام Python ومكتبة pywhatkit لإنشاء بوت بسيط يستجيب لرسائل WhatsApp. وهنا تساؤل ونقاش مفيد جدا حول كيفية إنشاء بوت واتساب باستخدام إطار دجانغو أعتقد أنه سيفيدك كثيرا:
  25. مشكلة "Travelling Salesman Problem" أو (مشكلة البائع المتجول) هي إحدى أشهر المشكلات في عالم البرمجة وعلوم الحاسوب، فهي تمثل مشكلة تحديد أقصر مسار يمر عبر مجموعة من النقاط (مثل المدن أو العقد) مرة واحدة وثم العودة إلى النقطة الأصلية، هذه المشكلة تندرج ضمن مجال الرياضيات وعلم الحاسوب، وهي مشكلة معروفة في الأمثلة التجارية والصناعية أيضا. للإجابة عن تساؤلك، يمكنني أن أقول بأن المشكلة معروفة بصعوبتها في إيجاد الحل الأمثل بسبب طبيعتها التصاعدية، حيث تزداد صعوبة حساب الحل بزيادة عدد النقاط. على سبيل المثال، عندما يكون هناك عدد صغير من النقاط، فإنه من الممكن حساب كل الطرق المحتملة واختيار الأمثل. ولكن مع زيادة عدد النقاط، يصبح عدد الطرق الممكنة كبيرا، وبالتالي يصبح من الصعب بشكل كبير حساب الحل الأمثل في وقت معقول. من الجدير بالذكر أنه لا يوجد حتى الآن خوارزمية فعالة تعطي الحل الأمثل للمشكلة في زمن معقول بغض النظر عن عدد النقاط لهذا يتم التركيز على تطوير خوارزميات تقريبية تقدم حلول جيدة بالقرب من الحل الأمثل دون الحاجة إلى استكشاف كل الطرق المحتملة. أعتقد أنني أجبت عن استفسارك.
×
×
  • أضف...