-
المساهمات
2691 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
13
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Chihab Hedidi
-
الكود الذي كتبته لك مجرد مثال و يجب عليك تطبيقه على حسب طريقة برمجتك المستخدمة، يمكنك إلقاء نظرة على كيف قمت بدمجها هناك و يمكنك التعديل عليها على حسب متطلباتك. App (1).js
- 7 اجابة
-
- 1
-
-
الإستخدامات دائما تعود على حسب إحتياجات المشروع و طريقة تفكير المبرمج، frozen_sets لا يمكن تغييرها بعد إنشائها، بينما يمكن تغيير الأزواج أو tuples. هذا يجعل المجموعات المجمدة أكثر أمانا في بعض الحالات عندما نحتاج إلى بيانات ثابتة. في العادة نستخدم frozen_sets في الحالات التي نحتاج فيها إلى مجموعة من العناصر غير المتكررة والغير متغيرة، مثل مفاتيح القاموس أو القيم المتميزة (distinct values)، في حين أن الأزواج تستخدم عادة للعناصر المرتبطة ببعضها. و يمكنك الإطلاع على طريقة إستخدامها أكثر من خلال هذا المقال: الدالة frozenset() في بايثون
-
يمكنك القيام بذلك في كل مسار يتطلب التحقق من الهوية، يمكنك استخدام useEffect للتحقق من وجود AccessToken في الكوكيز عندما يتم تحميل المكون الخاص بالمسار.فيما يلي كيفية تحقق من وجود AccessToken وتوجيه المستخدم إلى صفحة تسجيل الدخول إذا لم يكن متاحًا: import React, { useEffect } from 'react'; import { Route, Navigate } from 'react-router-dom'; import Cookies from 'js-cookie'; // Define a protected route component const ProtectedRoute = ({ element, ...rest }) => { const accessToken = Cookies.get('accessToken'); useEffect(() => { if (!accessToken) { // If no accessToken, redirect to login page // You can also add some additional logic here, like displaying a message to the user window.location.replace('/login'); } }, [accessToken]); // Render the requested component if accessToken is available return <Route {...rest} element={accessToken ? element : <Navigate to="/login" />} />; }; // Example usage const App = () => { return ( <Routes> {/* Protected routes */} <ProtectedRoute path="/protected-route" element={<ProtectedComponent />} /> {/* Non-protected routes */} <Route path="/login" element={<Login />} /> </Routes> ); }; export default App; مثلا هنا يتم استخدام useEffect للتحقق من وجود AccessToken في الكوكيز و إذا لم يكن متاحًا، سيتم توجيه المستخدم إلى صفحة تسجيل الدخول.
- 7 اجابة
-
- 1
-
-
يمكنك حماية المسارات وجعلها متاحة فقط عند وجود AccessToken في الكوكيز، يمكنك استخدام middleware في جانب الخادم للتحقق من وجود AccessToken وصحته قبل السماح بالوصول إلى المسارات المحمية، فيما يلي مثال لكيفية تنفيذ ذلك باستخدام Express.js // وسيط لحماية المسارات const protectRoute = (req, res, next) => { const accessToken = req.cookies.accessToken; // التحقق مما إذا كان AccessToken موجودًا if (!accessToken) { return res.status(401).json({ message: "الرمز المميز مطلوب" }); } // يمكنك هنا إضافة المزيد من التحققات، مثل انتهاء صلاحية الرمز المميز، الخ. // إذا كان كل شيء على ما يرام، فمتابعة إلى الوسيط التالي next(); }; // مثال على مسار محمي app.get("/protected-route", protectRoute, (req, res) => { res.json({ message: "هذا المسار محمي" }); }); هنا قمت بإنشاء وسيط يدعى protectRoute يتحقق من وجود AccessToken في الكوكيز، إذا لم يكن هناك AccessToken، فسيتم إرجاع استجابة 401 غير مصرح بها، وإذا كان الAccessToken موجودا، فسيتم استدعاء الوسيط التالي باستخدام next(). يجب تسجيل هذا الوسيط للمسارات التي تحتاج إلى حماية، يمكنك فعل ذلك عن طريق إرفاقه بالطريق المناسب مثل ما هو موضح في المثال أعلاه، و يجب عليك تثبيت حزمة cookie-parser لاستخدام req.cookies.
- 7 اجابة
-
- 1
-
-
لا نجيب على الأسئلة الإمتحانية و لكن سأشرح الخطوات التي يمكن اتباعها لكتابة الكود لحل هذه المشكلة، قم بتعريف متغيرين لتتبع العدد الأصغر والعدد الثاني الأصغر. يمكنك استخدام smallest و second_smallest على سبيل المثال، استخدم حلقتين تكرار، واحدة داخل الأخرى، للانتقال عبر العناصر في المصفوفة، ضمن الحلقات، قم بفحص الشرط المعطى. إذا تم تحقيقه، قم بمقارنة العدد الحالي مع smallest و second_smallest عند الانتهاء من المرور عبر المصفوفة، قم بإرجاع العدد الثاني الأصغر. إذا لم يتم العثور على قيمة مطابقة، يمكنك إرجاع None أو قيمة مناسبة أخرى تشير إلى عدم وجود قيمة. أسهل لغة يمكنك كتابة هذه الخوازمية بها هي بايثون، و لكن بالتأكيد يمكنك كتابتها بأي لغة برمجة تتقنها.
-
نعم يمكنك ذلك و يعتمد هذا على استخدام نماذج تنبؤ الطقس الحالية وتحليل البيانات الجوية لتدريب نموذج تنبؤ، و يمكنك القيام بذلك بعد تعمقك قليلا في مجال الذكاء الإصطناعي و خصوصا مجال التنبؤ. و يمكنك أن تطلع أكثر على الموضوع من خلال هذا المقالات: https://academy.hsoub.com/programming/artificial-intelligence/الذكاء-الاصطناعي/
-
مرحبا يوسف، في المرة القادمة أرجوا وضع سؤالك أسفل الفيديو الخاص بالدورة و الذي واجهت فيه المشكلة، بالنسبة للتعليمة فهي صحيحة بشكل عام، ولكن هناك خطأ صغير في الصياغة، بدلا من استخدام "value" يجب استخدام "values"، والذي يفصل بين القيم بفاصلة، إليك الصياغة الصحيحة: insert into film (title, language_id) values ('pirates of the caribbean', (select language_id from language where language_id = 1)); بعد هذا التعديل يجب أن تعمل التعليمة بشكل صحيح. بالتوفيق إن شاء الله.
-
المسألة تطلب منك أن تبحث عن سلسلة نصية حيث في بعض الحالات الخاصة، يمكن أن يكون طول السلسلة المحولة أكبر من السلسلة الأصلية بعد تطبيق عمليات تحويل الحالة الأبجدية (uppercase/lowercase)، أي تحويل الحروف الكبيرة إلى حروف صغيرة أو العكس. بمعنى آخر نحتاج إلى إيجاد سلسلة نصية يكون طولها بعد تحويلها للحالة الكبيرة ومن ثم الحالة الصغيرة أكبر من طول السلسلة الأصلية.
- 18 اجابة
-
- 1
-
-
نعم يمكن عرض البيانات بتنسيق شجري في HTML باستخدام عدة وسائل، أحد الطرق الشائعة هي إنشاء قائمة متدرجة، يمكن تدوين هذه القوائم بشكل متداخل لتمثيل الهيكل الشجري بالطريقة التالية: <ul> <li>عنصر رئيسي <ul> <li>عنصر فرعي 1 <ul> <li>عنصر فرعي 1.1</li> <li>عنصر فرعي 1.2</li> </ul> </li> <li>عنصر فرعي 2</li> </ul> </li> </ul> هذا التعبير الخطي للبيانات يمكن أن يمثل هيكل شجري، يمكنك أيضا استخدام CSS لتخصيص المظهر الخاص بك، و يمكنك أن تجد هذا في دورة تطوير واجهات المستخدم، فيها جزء يتحدث حول أساسيات تطوير الواب، و تم التفصيل في أغلب النقاط هناك.
- 1 جواب
-
- 1
-
-
الأمر clear لا يتم فهمه في نافذة موجه الأوامر في نظام Windows، الأمر عادة ما يستخدم في نظام التشغيل Unix وأنظمة Linux لمسح الشاشة، أما في نظام Windows، يجب استخدام الأمر cls بدلا من ذلك لمسح الشاشة.
- 6 اجابة
-
- 1
-
-
بعد اتمامك للدورة، سيكون عليك التواصل مع مركز مساعدة حسوب لتحديد موعد امتحان وسيكون على الشكل التالي: اجراء محادثة صوتيّة لمدة 30 دقيقة يطرح المدرّب عليك أسئلة متعلّقة بالدورة والأمور التي نفّذتها خلالها. يحدد لك المدرّب مشروعًا مرتبطًا بما قمت به أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع الى أسبوعين. اجراء محادثة صوتيّة أخرى لمدّة 30 دقيقة يناقش بها مشروعك وما نفذته وتطرح أسئلة خلالها. ان سارت على جميع الخطوات السابقة بشكل صحيح، تحصل على الشهادة أو يرشدك المدرب لأماكن القصور ويطلب منك تداركها ثم التواصل من جديد. بالنسبة لسؤالك حوال إتمام أربع مسارات فقط، نعم يمكنك ذلك و إن إجتزت الإمتحان بشكل ناجح ستحصل على الشهادة، و يمكنك أن تطلع على شروط المشاركة و المعلومات الأخرى الخاصة بالإختبار من هنا.
-
أنت تقوم بكتابة الأوامر البرمجية لنظام التشغيل بشكل عام، و نظام التشغيل هو الوسيط بين البرمجيات والهاردوير في الحاسوب، يتعامل مع إدارة الموارد مثل المعالج والذاكرة والتخزين، ويوفر واجهة لتشغيل التطبيقات وتنفيذ البرامج، فعندما تقوم بكتابة برنامج، فإنك تكتبه بطريقة تفاعلية مع نظام التشغيل، و عندما تقوم بتشغيل التطبيق، يتم إرسال أوامر من قبل نظام التشغيل إلى الهاردوير لتنفيذها. عندما تقوم بعمل event معين في التطبيق، فإن البرنامج يرسل إشارة (signal) إلى نظام التشغيل ليتعامل معها، بعدها يمكن لنظام التشغيل أن يتفاعل مع هذا الحدث على النحو المناسب، مثل تحديث واجهة المستخدم أو التفاعل مع الأجهزة الخارجية، إذا لم يكن هناك نظام تشغيل، فإن البرامج والتطبيقات لن تتمكن من العمل. يعتبر نظام التشغيل جزءا أساسيا من عملية تشغيل البرامج على الحاسوب. و في السنوات الأولى لتطوير أنظمة التشغيل، كانت تعتمد على واجهات نصية وتشتغل بالأوامر، حيث يتم التفاعل مع النظام عبر إدخال الأوامر مباشرة في سطر الأوامر، في ذلك الوقت كانت التطبيقات محدودة وغير متطورة مقارنة بما نراه اليوم. وكانت غالبا ما تكون تطبيقات مخصصة لأغراض محددة مثل معالجة النصوص أو إدارة البيانات و فقط. و يمكنك أن تطلع أكثر على مهام أنظمة التشغيل من خلال المقالة التالية:
-
المشكلة مع مرور الوقت ستنسى كيفية كتابة الكود لوحدك و في حالة حدث خلل في أدوات الذكاء الإصطناعي ستجد صعوبة في العودة لما كنت عليه، يمكنك إستخدامه بين الحين و الآخر بشرط أن تكون قادرا على فهم كل سطر تقوم بكتابته، و أيضا فليس دائما تكون النتيجة من الذكاء الإصطناعي صحيحة، فهو يستخدم إصدارات قديمة لذا يجب عليك تحديثها لما يتناسب مع مشروعك.
- 3 اجابة
-
- 1
-
-
أنت شغال على الكونسول الخاص بالبيثون لتحصل على زر run، قم بإنشاء ملف من هنا : قم بكتابة الكود الخاص بك بداخله و ستجد زر run في الأعلى :
-
على حسب ما فهمت فأنت تستخدم تيليجرام لاستقبال الرسائل وتعالجها، يمكنك استخدام Telegram Bot API التي توفرها تيليجرام لتحقيق هذا الغرض، يجب عليك تطوير بوت في تيليجرام واستخدام API التي توفرها تيليجرام للتفاعل مع الرسائل التي يتلقاها البوت، من ثم يمكنك استخدام هذا البوت لاستقبال الرسائل من العملاء والتعامل معها بالشكل المطلوب. لإرسال الموقع، يمكنك استخدام الأمر sendLocation المتاح في بروتوكول البوت الخاص بتيليجرام، عندما يرسل العميل موقعه، يمكنك استخدام هذا الأمر لتلقي الموقع وتعديله أو استخدامه كما تشاء. بخصوص سؤالك حول وجود طريقة أخرى لإرسال الموقع دون استخدام مفتاح Google Cloud، يمكنك استخدام خدمات مشابهة مثل Mapbox أو OpenStreetMap للحصول على خدمات خرائط وتحديد الموقع، ولكن سيكون لديك عادة متطلبات لاستخدام الخدمة، وقد تتطلب بعض الخدمات استخدام مفاتيح API كما في حالة Google Cloud.
-
الأمر هنا يختلف على حسب لغة البرمجة التي تستخدمها و لكن خوازرمية المشكلة تكون مشابهة و يمكنك ترجمتها إلى لغة البرمجة التي تستعملها، و تتضمن العملية إنشاء جدول في قاعدة البيانات لتخزين بيانات المستخدمين أثناء الاستبيان، وإنشاء نموذج يجمع هذه البيانات ويخزنها في قاعدة البيانات، ثم يجب ربط صفحة الاستبيان بالنموذج المناسب لجمع البيانات وتخزينها، و عند اكتمال المستخدم للاستبيان، يمكن استخدام البرمجة النصية للتحقق من الإجابات وتخزينها في قاعدة البيانات لاستخدامها فيما بعد، مثل إنشاء كوبون خصم مخصص للمستخدم. و لإعطاء المستخدم كوبون خصم مخصص له فقط، يمكنك اتباع الخطوات التالية: قم بإنشاء كوبون خصم جديد في قاعدة البيانات وربطه بمعرف المستخدم الذي أكمل الاستبيان. قم بإظهار صفحة أخرى للمستخدم بعد اكتمال الاستبيان تحتوي على كوبون الخصم، و عند إدخاله للكوبون تأكد من معرف المستخدم و تطابقه مع الكود. تنفيذ هذه الخطوات يتطلب المهارات اللازمة في تطوير الويب وقواعد البيانات، ويمكنك استخدام لغة البرمجة التي تتقنها.
- 2 اجابة
-
- 1
-
-
إذا كنت تريد أن تعرف معلومات على الكمبيوتر يمكنك أن تبحث على dxdiag و ستجد كل المعلومات الخاصة بالكمبيوتر هناك، أو يمكنك تحميل برنامج CPU-z فهو مختص بعرض كل تفاصيل الجهاز الخاص بك.
- 5 اجابة
-
- 1
-
-
هذه الخوارزميات أساسية جدا في علم الحوسبة وتطبيقاتها العملية، و بالفعل تُستخدم في العديد من مشاريع البرمجة الحقيقية بشكل شائع. فهي توفر طرقا فعّالة لحل مجموعة واسعة من المشاكل التقنية. عندما تبدأ في تعلم علم الحاسوب أو تطبيقاته العملية، فإن فهم الخوارزميات والهياكل البيانية الأساسية يُعتبر أمرا ضروريا، فعلى سبيل المثال، البحث الثنائي مثال جيد على كيفية تطبيق مفهوم الـ "تقسيم وتغلب" أو Divide and Conquer في حل مشكلة بطريقة فعّالة، ويظهر لنا البحث الخطي كيف يمكننا حل مشاكل بطريقة بسيطة ولكنها غير فعالة بالنسبة لبعض الحالات، و بالتأكيد من تسميتها يمكنك أن تستنتج أننا نستخدمها كثيرا في خوارزميات البحث فهي تكون سريعة و الفرق كبير جدا بينها و الطرق التقليدية. و هناك العديد من الخوارزميات الأخرى التي يمكن أن تكون مفيدة في مشاريع الحوسبة الحقيقية، مثل خوارزميات الفرز مثل Quick Sort وMerge Sort، وخوارزميات البحث مثل Depth-First Search وBreadth-First Search، والعديد من الخوارزميات الأخرى التي تستخدم لحل مشاكل معينة في مجالات مختلفة مثل التشفير والتحليل البياني وغيرها. و أنصح بالإطلاع عليها لأنك بالتأكيد ستحتاجها في أحد مشاريعك المستقبلية، و يمكنك فهمها أكثر من خلال هذه المقالات:
- 4 اجابة
-
- 1
-
-
يمكنك ببساطة تغيير مكان إيقاف تشغيل التطبيق بشكل فوري ليتم بعد اختيار النظام المناسب. from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QRadioButton, QPushButton, QMessageBox, QLineEdit import sys class MyWidget(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): layout = QVBoxLayout() self.radioButton_analog = QRadioButton("Analog") self.radioButton_digital = QRadioButton("Digital") self.lineEdit = QLineEdit() self.lineEdit_2 = QLineEdit() button = QPushButton("Submit") button.clicked.connect(self.user_data) layout.addWidget(self.radioButton_analog) layout.addWidget(self.radioButton_digital) layout.addWidget(self.lineEdit) layout.addWidget(self.lineEdit_2) layout.addWidget(button) self.setLayout(layout) def user_data(self): if self.radioButton_analog.isChecked() or self.radioButton_digital.isChecked(): # هنا يتم استمرار العمليات الأخرى بعد اختيار النظام المناسب print("Continue processing...") else: msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText("Please choose a system (Analog or Digital).") msg.setWindowTitle("Warning") msg.setStandardButtons(QMessageBox.Ok) msg.exec_() if __name__ == '__main__': app = QApplication(sys.argv) widget = MyWidget() widget.show() sys.exit(app.exec_()) بهذا التغيير، عندما يقوم المستخدم بالنقر على الزر Submit، سيتم التحقق مما إذا كان قد قام بتحديد أحد الخيارات (Analog أو Digital)، وفي حالة عدم اختيار أي منهما، سيتم عرض رسالة تحذير ولكن التطبيق لن يتوقف، بل سيستمر في الانتظار حتى يتم اختيار أحد الخيارات.
- 5 اجابة
-
- 1
-
-
مثل ما أخبرتك لإيقاف تشغيل البرنامج بشكل فوري بعد عرض رسالة الخطأ، يمكنك استخدام sys.exit() بالشكل التالي: import sys from PyQt5.QtWidgets import QMessageBox # بعد عرض رسالة الخطأ if not self.radioButton.isChecked() or not self.radioButton_2.isChecked(): msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText("Please choose a system (Analog or Digital).") msg.setWindowTitle("Warning") msg.setStandardButtons(QMessageBox.Ok) msg.exec_() # إيقاف تشغيل التطبيق بشكل فوري sys.exit() بهذه الطريقة عندما يتم عرض رسالة الخطأ، سيتم إيقاف تشغيل التطبيق بشكل فوري.
-
لحل هذه المشكلة يمكنك استخدام QMessageBox لعرض رسالة تحذير في حالة إدخال بيانات خاطئة ومن ثم توقف تشغيل البرنامج بشكل لحظي، و الأفضل أن تضع جزء من الكود الخاص بك حتى يمكنني الإطلاع عليه بشكل أفضل، سأحاول كتابة كود بسيط يمثل المشكلة مع إستخدام sys.exit(app.exec_()) لتوقيف البرنامج: import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLineEdit, QMessageBox class LoginWidget(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): layout = QVBoxLayout() self.username_input = QLineEdit() self.password_input = QLineEdit() self.password_input.setEchoMode(QLineEdit.Password) login_button = QPushButton('Login') login_button.clicked.connect(self.check_login) layout.addWidget(self.username_input) layout.addWidget(self.password_input) layout.addWidget(login_button) self.setLayout(layout) self.setWindowTitle('Login') def check_login(self): username = self.username_input.text() password = self.password_input.text() # Replace this with your login logic if username == 'admin' and password == 'password': print('Login successful!') else: QMessageBox.warning(self, 'Login Failed', 'Invalid username or password. Please try again.') sys.exit(app.exec_()) # توقف البرنامج في حالة فشل تسجيل الدخول if __name__ == '__main__': app = QApplication(sys.argv) login_widget = LoginWidget() login_widget.show() sys.exit(app.exec_()) لتوقيف البرنامج بشكل فوري بعد عرض رسالة الخطأ، استخدمت الأمر sys.exit(app.exec_()) لإيقاف تشغيل التطبيق داخل دالة check_login بعد عرض الرسالة.
-
هذه المشكلة قد تحدث عندما لا يتم تكييف الصورة الخلفية بشكل صحيح مع أبعاد الشاشة على الجوال. الحل هو إعادة تصميم الموقع بما يتناسب مع كافة قياسات الشاشات المختلفة وهو ما يعرف بالتصميم المتجاوب responsive design. يمكنك تجربة حله باستخدام css: body { background-size: cover; } هذه الخاصية تجعل الصورة تمتد لتغطي خلفية ال body بالكامل بحيث تحافظ على نسبة الارتفاع إلى العرض وتكون مركبة بشكل صحيح على أي حجم شاشة. يمكنك أيضا تجربة contain بدلا من cover إذا كنت ترغب في ضمان ظهور الصورة بالكامل دون قطع، ولكن قد يتسبب ذلك في ظهور بعض الفراغات الفارغة في بعض الأحيان. body { background-size: contain; } باستخدام إحدى هذه الخيارات، ستتمكن من حل مشكلة عرض الصورة الخلفية بشكل صحيح على الأجهزة المحمولة. ولكى تقوم بالتعديل على موقعك حتى يصبح متجاوب استخدم هذا الكود: @media screen and (max-width:992px){ /* ضع هنا أكواد css */ } @media screen and (max-width:768px){ } @media screen and (max-width:640px){ } @media screen and (max-width:320px){ } و يمكنك أن تطلع أكثر على الموضوع من خلال هذه المقالات:
-
(\D+.*) يتحقق لأنو القيمة تحتوي على حروف وليس شرط أن تكون الحروف في البداية، لكن إذا كنت تريد أن تضمن أنه لا يجب أن تكون الأرقام في البداية يمكنك تغييره هكذا: /^[^0-9].*@(\D+.*)\.(\w{2,})/i أو تضيف ^ في النمط الخاص بك لأن هذا الرمز يشير إلى البداية، أي بهذه الطريقة نضمن أن البداية تكون حرف: /^(\D+.*).*@(\D+.*)\.(\w{2,})/i
-
السبب في الاختلاف في النتائج بين النمطين هو الاختلاف في النمط الذي يتم تحديد البريد الإلكتروني به. النمط الأول يحتوي على هذا الجزء (^[0-9].*) و يعني أن النص يجب أن يبدأ برقم، لذلك يتطابق مع الأرقام فقط، و هذا ما يحتويه الإيمايل الذي وضعته لذلك يرجع لك true. بينما النمط الثاني يبدأ ب (\D+.*) و يعني أنه يتوقع أي حرف غير رقمي متبوعا بأي شيء (أي حرف غير رقمي متكرر)، لهذا يتم إرجاع قيمة false. يعني الفرق الرئيسي بين النمطين هو استخدام [0-9] في النمط الأول للتطابق مع الأرقام فقط، بينما يستخدم \D في النمط الثاني للتطابق مع أي حرف غير رقمي. و لفهم التعابير النمطية أكثر يمكنك الإطلاع على هذه المقالة التي ستساعدك بشكل أفضل:
-
قم بدراسة النماذج والخوارزميات المستخدمة في تعلم الآلة، مثل الشبكات العصبية الاصطناعية والتعلم العميق وغيرها، و أيضا ركز على لغة بايثون فهي لغة البرمجة الأكثر استخداما في تطبيقات تعلم الآلة بسبب مجموعة واسعة من المكتبات المتاحة مثل TensorFlow وPyTorch و غيرهت، لذا تأكد من أنك تتقن بايثون جيدا. بالنسبة لسؤالك عن الاختلاف بين مجال تعلم الآلة ومجال تطوير الويب (React، Angular، Vue)، فهما مجالان مختلفان تماما، مجال تعلم الآلة يركز على تطوير نماذج وخوارزميات لفهم البيانات وتحليلها واستخدامها للتنبؤ والتصنيف والتكيف مع المعطيات، بينما مجال تطوير الويب يركز على بناء وتطوير تطبيقات الويب والمواقع باستخدام تقنيات مثل React، Angular، وVue. بمجرد أن تكتسب المهارات اللازمة في تعلم الآلة، يمكنك العثور على وظيفة في مجال تطوير البرمجيات مع تركيزك على تطبيقات تعلم الآلة، و أنصحك بقراءة هذا المقال، ففيه معلومات ممتازة تسهل لك طريقك في هذا المجال: