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

Mustafa Suleiman

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

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

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

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

    303

كل منشورات العضو Mustafa Suleiman

  1. تستطيع الاستزادة من مصادر مختلفة سواء عبر موسوعة حسوب أو الدروس والمقالات في أكاديمية حسوب، حيث يوجد قسم خاص بمقالات ودروس CSS وقسم أيضًا للغة HTML ونفس الأمر للغة جافاسكريبت. عليك بالقراءة والبحث عما تريد فهمه من المصادر السابقة، ولديك يوتيوب أيضًا فبه شروحات كثيرة أيضًا في حال كنت تريد فهم أمر معين، وتستطيع السؤال أسفل فيديو الدورة بعد البحث وسيتم شرحه لك باستفاضة مع أمثلة للتوضيح. وعليك بالبحث عن مشاريع للمبتدأين على يوتيوب ومحاولة التطبيق على ما تعلمته وذلك من خلال لغات HTML,CSS, JS وبدون استخدام أي مكتبة من أجل تقوية الأساسيات لديك والتعلم بشكل أسهل فيما بعد لكون الأساسيات لديك جيدة. وما أحاول توصيله لك، هو ألا تكتفي بأي دورة مهما كانت، عليك دائمًا بالبحث والقراءة والاستزادة والتطبيق من مصادر أخرى والسؤال بعد المحاولة والتفكير، وستجد في النقاش التالي معلومات مفيدة ومواقع للحصول على تصاميم للتطبيق على ما تعلمته.
  2. لا يوجد دورة متخصصة في الأمن السيبراني في أكاديمية حسوب، والدورة الأقرب المناسبة لك في أكاديمية حسوب هي دورة علوم الحاسوب وقد تم ذكرها لك، حيث أنك بحاجة أولاً إلى دراسة الأساسيات قبل إختيار أي مجال في البرمجة من أجل تحديد المجال على دراية وليس مجرد معلومات سطحية أو حماس زائد. أنت حاليًا في سن صغير، تستطيع تعلم ما تريد ولا علاقة بسوق العمل بإختيارك وأنا أتكلم على الشركات، فالأمر راجع للسن القانوني وهو 18وأحيانًا 20 و21 في بلدان أخرى، وأيضًا أنت بحاجة إلى شهادة جامعية للعمل في شركة وأنا أتكلم على الشركات المعروفة التي لديها قواعد ونظام. ولكن يوجد شركات أخرى وبها رواتب جيدة، تستطيع العمل بها بدون شهادة وبمهاراتك وخبرتك فقط وفي سن 18 عام لا مشكلة، فأنا أعرف أشخاص في كلية حاسبات ومعلومات ولم يتخرجوا بعد، ويعملون في شركات في السوق المحلي ولكن بالطبع بشكل غير رسمي. وهنا أنت بحاجة إلى إتخاذ قرار، هل تريد وظيفة لدعم نفسك ماديًا في الوقت الحالي؟ ففي تلك الحالة يجب تعلم المطلوب في سوق العمل لديك وليس ما تريده، وفي حال كان ما تريده مطلوب فقد يتم طلب سنوات خبرة كسنة أو سنتين كحد أدنى مثلاً، لذلك عليك بتفقد الوظائف المطلوبة في مجال البرمجة في السوق المحلي لديك والحد الأدنى للخبرة المطلوبة وقد أوضحت ذلك هنا: لكن على مواقع العمل الحر، تستطيع العمل في أي سن طالما تمتلك المهارة اللازمة لتنفيذ المشاريع المطلوبة بإحترافية، لكن في المواقع العربية لن تجد مشاريع خاصة بمجال الأمن السيبراني مطلوبة بكثرة. وهناك سؤال مماثل لسؤالك، ستجد به إجابات مفيدة لك:
  3. سأشرح لك الطريقة باستخدام خدمة Firebase Cloud Messaging (FCM) بدلاً من خدمة Pusher. أولاً عليك تثبيت مكتبة FCM في مشروع Laravel، وتتوفر حزمة مثل "brozot/laravel-fcm" للقيام بذلك عن طريق تشغيل الأمر التالي: composer require brozot/laravel-fcm بمجرد تثبيت الحزمة، قم بتعديل ملف .env الخاص بتطبيق Laravel لتعيين الإعدادات الخاصة بـ FCM، ثم إضافة معلمة FCM_SERVER_KEY واستخدم قيمة مفتاح الخادم الخاص بك كقيمة لها. FCM_SERVER_KEY=YOUR_FCM_SERVER_KEY ثم تعديل ملف config/broadcasting.php لتكوين خادم البث الخاص بك بتعيين قيمة driver إلى 'fcm' واستبدل قيم المعلمات الأخرى بما يتناسب مع احتياجاتك، وهناك معلمات مثل fcm_options و log_enabled و http_options التي يمكنك ضبطها كما تشاء، كالتالي: 'fcm' => [ 'driver' => 'fcm', 'log_enabled' => true, 'http_options' => [ // تعديل هذه القيم حسب احتياجاتك 'timeout' => 30, 'proxy' => null, ], 'fcm_options' => [ // تعديل هذه القيم حسب احتياجاتك 'priority' => 'normal', 'time_to_live' => 60, ], ], والآن حددد FCM كقيمة لمفتاح BROADCAST_DRIVER في ملف .env لديك عن طريق إضافة السطر التالي: BROADCAST_DRIVER=fcm وأخيرًا تحديث ملف config/app.php لاستخدام مزود الخدمة المناسب، وإضافة السطر التالي إلى مصفوفة providers: Brozot\LaravelFcm\LaravelFcmServiceProvider::class,
  4. أرجو منك التعليق أسفل فيديو الدورة المتعلق بالسؤال لمساعدتك بشكل أفضل، وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة. وبخصوص سؤالك، فهو يتعلق بإطار لارافيل، ونستخدم ذلك الكود في عملية إنشاء جدول في قاعدة البيانات باستخدام ميزات مولد الكود الخاص بلارافيل (Laravel's code generator)، لتعريف حقل 'username' كحقل نصي (string) في جدول قاعدة البيانات. وبدون معرفة المشروع أو المطلوب، فعامًة السبب هو: 1- مرونة في استخدام الحقل، فعندما تقوم بتعريف الحقل 'username' دون تحديد الخاصية unique، تستطيع استخدامه بأكثر من سجل في الجدول. قد يكون هذا مفيدًا في بعض الحالات، مثل السماح للمستخدمين بتكرار أسماء المستخدمين في حالات محددة. 2- التحقق من الحقل المميز عند الحاجة بدلاً من إجبار الحقل على أن يكون فريدًا في تعريف الجدول، وبإمكانك التحقق من فرادة القيمة المدخلة عند عملية الإدخال أو التحديث، واستخدام القيود أو التحقق من الفرادة في طبقة التطبيق أو قاعدة البيانات نفسها. 3- الحاجة إلى مزيد من الخصائصالأخرى للحقل 'username' بجانب فرادته، مثل الحد الأقصى لعدد الأحرف المسموح بها أو قواعد التحقق الأخرى، وربما من الأفضل تحديد تلك الخصائص في مكان منفصل لتحقيق أقصى قدر من المرونة وإعادة الاستخدام. أي يعتمد استخدام خاصية unique على احتياجات المشروع وتصميم قاعدة البيانات، فقد تحتاج في بعض الحالات إلى تحديد الحقل كفريد في تعريف الجدول، في حين أن في حالات أخرى يمكن التحقق من فرادة القيمة في وقت لاحق أو استخدام خصائص إضافية.
  5. لا يوجد فرق، فكلاهما يوفران لك نفس الشهادة طبقًا لقرار المجلس الأعلى للجامعات، وبالتالي الأمر يعتمد على مجموعك في ثالثة ثانوي والتنسيق الخاص بك، ولكن بالطبع الكلية أفضل من حيث مستوى الطلبة والطموح لديهم، فغالبًا في المعاهد ستجد أن أغلب من دخلها يرغب في الحصول على الشهادة فقط. وأيضًا مستوى الدراسة في الكلية أصعب من المعاهد، ووبغض النظر عن التكاليف، فالكلية تكاليفها منخفضة مقارنًة بالمعاهد التي تعتبر كل ورقة بها لها ثمن. وانتبه إلى أن معهد حاسبات ومعلومات يقبل القسم العلمي (رياضة وعلوم) للثانوية العامة وليس أدبي أو ثانوي أزهري أي مثله مثل الكلية، وأيضًا قد يختلط الأمر على البعض ويظن أن معد نظم إدارية هو نفسه معهد حاسبات ومعلومات ولكن ذلك غير صحيح، فتخصص معهد نظم إدارة هو المحاسبة.
  6. سبب المشكلة هو أن المسار الذي تحاول استخدامه فارغ، أي عدم تعيين المسار الصحيح لحفظ الصورة المرفوعة، وأنت تستخدم الدالة store() لحفظ الصورة، وتحدد المجلد "posts" وتستخدم القرص المحلي "public". وللتأكد من أن المشكلة ليست بسبب خطأ في المسار، هل تحققت من وجود المجلد "posts" في القرص المحلي "public" في مشروعك؟ وإذا كان المجلد غير موجود، فتستطيع إنشائه يدويًا. وإذا كان المجلد موجودًا ولا تزال تواجه المشكلة، فربما هناك خطأ آخر في الطريقة التي ترفع بها الصورة، ومن الأفضل التحقق من قيمة $request['image'] والتأكد من أنها صحيحة وتحتوي على الصورة المطلوبة. وربما لديك مشكلة في الكتابة إلى مجلد temp في C:\Windows\Temp عليك بالضغط بزر الفأرة الأيمن على مجلد temp ثم اختيار properties ثم ستجد خيار باسم read-only قم بإزالة العلامة ثم ok للحفظ. وأيضًا تستطيع استخدام دالة dd لمعرفة المسار كالتالي: dd($request['image']); وسيتم عرض معلومات المتغير $request['image'] بشكل مفصل، بما في ذلك المسار وأي بيانات أخرى متعلقة بالصورة.
  7. المطلوب هو إنشاء دالة تستقبل عدد الرصاصات التي يحملها البطل (bullets) وعدد التنانين المحيطة بالقلعة (dragons)، وتقوم بإرجاع قيمة True إذا كان البطل قادرًا على الفوز على جميع التنانين والبقاء على قيد الحياة، وإلا فإنها ترجع قيمة False. والكود لديك لا يحقق الشروط المطلوبة لحل السؤال بشكل صحيح، فأنت نفذت الشرط (bullets >= 2) ولكنك لم تقدم الشرط الثاني (dragons == 2) بشكل صحيح. وبناءًا على المطلوب، ليس هناك حاجة محددة لعدد الرصاص المطلوب أن يكون 2 فقط، بل يمكن أن يكون أي عدد من الرصاصات المتاحة، أيضًا يجب أن تكون قادرًا على معالجة عدد أكبر من 2 تنين. أي تعديل الكود ليصبح كالتالي: def can_defeat_dragons(num_dragons, num_bullets): return num_dragons <= num_bullets // 2 وباستدعاء الدالة can_defeat_dragons(4, 8 ), سترجع القيمة True لأن البطل يحمل 8 رصاصات وهناك 4 تنانين، وبما أن 8 // 2 = 4، فإن الشرط يتحقق ويمكن للبطل الفوز على جميع التنانين، كالتالي: print(can_defeat_dragons(4, 8))
  8. ما فهمته هو أنك تريد منع تحديث الصفحة عند التحقق من الإجابة وعرض السؤال التالي، وذلك ممكن بالشكل التالي: أولاً عليك تجهيز ملف PHP الذي يقوم بالتحقق من الإجابة وجلب السؤال التالي، ويجب أن يكون الملف قادرًا على استقبال طلبات AJAX وإرجاع البيانات في تنسيق مناسب مثل JSON. وفي صفحة الويب الخاصة بك، قم بإنشاء وظيفة JavaScript لإرسال طلب AJAX إلى الملف PHP والتحقق من الإجابة. وهناك مكتبات مثل Axios أو jQuery لتبسيط عملية إرسال الطلب AJAX. مثلاً لو استخدمنا jQuery سيكون الكود لديك بالشكل التالي: $.ajax({ url: 'تعيين-المسار-إلى-ملف-ال-PHP.php', method: 'POST', data: { إجابة: الإجابة_المدخلة }, dataType: 'json', success: function(response) { // هنا يمكنك التعامل مع الاستجابة المستلمة من الملف PHP // على سبيل المثال، يمكنك التحقق من صحة الإجابة وإظهار رسالة للمستخدم أو إظهار السؤال التالي }, error: function() { // في حالة حدوث خطأ أثناء إرسال الطلب } }); وعليك استبدال 'تعيين-المسار-إلى-ملف-ال-PHP.php' بالمسار الصحيح إلى ملف PHP الذي يقوم بالتحقق من الإجابة وجلب السؤال التالي، و'الإجابة_المدخلة' تمثل الإجابة التي يقوم المستخدم بإدخالها. ثم في ملف PHP، قم بمعالجة الطلب الوارد وتنفيذ العمليات المطلوبة، وتستطيع التحقق من الإجابة المدخلة والقيام بأي عمليات أخرى مثل استعلام قاعدة البيانات واسترداد السؤال التالي، ثم، قم بإرجاع البيانات في تنسيق JSON. وباستطاعتك استخدام الدالة json_encode() في PHP لتحويل بياناتك إلى تنسيق JSON كالتالي: // قم بمعالجة البيانات وجلب السؤال التالي $nextQuestion = // احصل على السؤال التالي من قاعدة البيانات أو من أي مصدر آخر // قم بتشكيل البيانات في صيغة JSON $response = array('question' => $nextQuestion); echo json_encode($response); وستعمل دالة json_encode() على تحويل المصفوفة $response إلى صيغة JSON وإرجاعها للواجهة. وعندما تستقبل الاستجابة في وظيفة success في الجزء الخاص بالJavaScript، بإمكانك التحقق من البيانات المستلمة والتعامل معها وفقًا لمتطلبات التطبيق لديك، وتحديث الواجهة لعرض السؤال التالي أو عرض رسالة للمستخدم بناءًا على البيانات المستلمة. أي في الواجهة سيكون لديك كود JavaScript يشبه التالي: success: function(response) { // هنا يمكنك التعامل مع الاستجابة المستلمة من الملف PHP // على سبيل المثال، يمكنك التحقق من صحة الإجابة وإظهار رسالة للمستخدم أو إظهار السؤال التالي if (response.question) { // عرض السؤال التالي } else { // عرض رسالة للمستخدم } } وذلك في حالة استخدام jQuery أما إذا أردت استخدام جافاسكريبت النقية بدون مكتبة، فسيكون الكود كالتالي: async function fetchData() { try { const response = await fetch('تعيين-المسار-إلى-ملف-ال-PHP.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ إجابة: الإجابة_المدخلة }) }); if (response.ok) { const data = await response.json(); // هنا يمكنك التعامل مع البيانات المستلمة if (data.question) { // عرض السؤال التالي } else { // عرض رسالة للمستخدم } } else { // في حالة حدوث خطأ في الاستجابة throw new Error('حدث خطأ أثناء استدعاء الخادم'); } } catch (error) { // في حالة حدوث خطأ أثناء الطلب console.error(error); } } fetchData(); حيث تستخدم fetch لإجراء طلب POST إلى الملف PHP المحدد، وتعيين رأس المحتوى لـ 'application/json' لإرسال بيانات الطلب في تنسيق JSON باستخدام JSON.stringify(). وبعد الحصول على الاستجابة من الخادم، نتحقق من صحة الاستجابة (response.ok) وفحصها باستخدام response.json() لتحويل الاستجابة إلى كائن JSON. أما في حالة حدوث أخطاء، ستتم معالجتها في قسم الـ catch، ومن خلالها تستطيع تنفيذ الإجراءات المناسبة مثل عرض رسالة الخطأ أو تسجيلها في وحدة التحكم. أما في حالة استخدام مكتبة Axios فسيكون الكود كالتالي: import axios from 'axios'; async function fetchData() { try { const response = await axios.post('تعيين-المسار-إلى-ملف-ال-PHP.php', { إجابة: الإجابة_المدخلة }); // هنا يمكنك التعامل مع البيانات المستلمة if (response.data.question) { // عرض السؤال التالي } else { // عرض رسالة للمستخدم } } catch (error) { // في حالة حدوث خطأ أثناء الطلب console.error(error); } } fetchData(); أولاً استيراد Axios في الكود باستخدام import، ثم استخدام axios.post لإرسال طلب POST إلى الملف PHP المحدد، وتمرير البيانات في الجسم (body) للطلب كما هو موضح.
  9. أهلاً بك رائد وكل عام وأنت بخير، أولاً ستجد الكثير من الإجابات على أسئلتك بخصوص أكاديمية حسوب في صفحة مركز المساعدة والتي تستطيع الوصول إليها من الروابط أسفل الموقع. وبها مثلاً ستجد شرح لكيفية الوصول للدورات التي اشتركت بها، وذلك من خلال الضغط على تبويب دوراتي وستجد الدورات المشترك بها كما بالصورة: وأيضًا من نفس التبويب ستجد كل الدورات الأخرى المتاحة، وتستطيع دراسة المسار الأول من كل الدورات بشكل مجاني. وبخصوص طرح الأسئلة، فلا تقلق ستجد مساعدة من قبل الجميع هنا، ما عليك سوى طرح سؤالك أسفل الفيديو في الدورة ستجد قسم تعليقات أضف السؤال المتعلق بالفيديو أسفله، وسيتم الإجابة عليك في أسرع وقت. ولكن الأسئلة العامة الغير متعلقة بالدورة أرجو منك طرحها في قسم أسئلة البرمجة كما فعلت هنا. وستجد أيضًا في مركز المساعدة شرح لكيفية طرح السؤال والتواصل مع المدربين. وكنصيحة حاول أن تشرح ما الذي تريد فعله وما المشكلة التي واجهتك بشكل واضح أو ما وقت الفيديو الذي لديك سؤال حوله، مثال: "في الدقيقة 4.10 أريد فهم كذا أو لدي مشكلة كذا"، او ذكر رقم التمرين وهكذا. وسيتم إرشادك لحل لكيفية حل المشكلة بنفسك أولاً لكي تستفيد، ثم تفقد المشكلة وتوفير الحل إذا واجهت صعوبة. وأيضًا تستطيع تفقد مستودع المشروع والذي به الكود النهائي وستجد الرابط الخاص به في المدخل او في مقدمة المسار. وأنصحك بالإطلاع على النقاش التالي والنقاشات المرفقة به وستجد به استفادة كبيرة لك:
  10. أولاً عليك بإنشاء الإتصال بقاعدة بيانات MySQL: <?php $servername = "اسم_خادم_قاعدة_البيانات"; $username = "اسم_مستخدم"; $password = "كلمة_المرور"; $dbname = "اسم_قاعدة_البيانات"; // إنشاء الاتصال $conn = new mysqli($servername, $username, $password, $dbname); // التحقق من نجاح الاتصال if ($conn->connect_error) { die("فشل الاتصال بقاعدة البيانات: " . $conn->connect_error); } ?> ثم قم إجراء استعلام لجلب دوام كل دكتور من جدول الدوام كالتالي: <?php // استعلام لجلب دوام كل الأطباء $sql = "SELECT * FROM جدول_الدوام"; $result = $conn->query($sql); if ($result->num_rows > 0) { // عرض البيانات while ($row = $result->fetch_assoc()) { echo "اسم الدكتور: " . $row["اسم_الدكتور"] . "<br>"; echo "دوام الدكتور: " . $row["دوام_الدكتور"] . "<br>"; echo "<br>"; } } else { echo "لا توجد نتائج"; } // إغلاق الاتصال $conn->close(); ?> وبيانات قاعدة البيانات التالية "اسم_خادم_قاعدة_البيانات" و "اسم_مستخدم" و "كلمة_المرور" و "اسم_قاعدة_البيانات" عليك بتغييرها إلى قيم فعلية تتناسب مع معلومات قاعدة البيانات الخاصة بك. أيضًا تعديل "جدول_الدوام" و "اسم_الدكتور" و "دوام_الدكتور" بحسب اسم الجدول وأسماء الأعمدة الخاصة بجدول الدوام لديك. والمثال يفترض أن لديك جدول يحتوي على حقلين هما "اسم_الدكتور" و "دوام_الدكتور" لتخزين اسماء الأطباء ودوامهم على التوالي، ويتم عرض النتائج باستخدام حلقة while لعرض كل سجل من جدول الدوام.
  11. إذا كان سؤالك خاص بأحد الدورات، فأرجو منك السؤال أسفل فيديو الدورة الخاص بالسؤال، وإذا كان السؤال غير متعلق بالدورة، فعليك توضيح ما الذي تريد فعله بالضبط.
  12. تستخدم خوارزميات البحث الثنائي (Binary Search) للبحث في البيانات المرتبة، وتُنفذ تلك الخوارزميات بشكل أكثر شيوعًا في القوائم المرتبة (lists)، لكن باستطاعتك تنفيذها في القواميس (dictionaries) في لغة Python. فعند استخدام البحث الثنائي في القواميس، يتم البحث عن القيمة المطلوبة باستخدام المفتاح (key) بدلاً من الموضع (index) كما هو الحال في القوائم، ويجب أن يكون للقاموس ترتيب معين للمفاتيح لضمان عمل البحث الثنائي بشكل صحيح. ولنفترض أن لدينا مفاتيح في القاموس مرتبة تصاعديًا، فيمكن استخدام البحث الثنائي للعثور على قيمة معينة بناءً على المفتاح. وإليك مثال لتوضيح تنفيذ خوارزمية البحث الثنائي في قاموس (dictionary): def binary_search_dict(dictionary, target): keys = sorted(dictionary.keys()) # ترتيب المفاتيح بشكل صحيح left = 0 right = len(keys) - 1 while left <= right: mid = (left + right) // 2 mid_key = keys[mid] if mid_key == target: return dictionary[mid_key] elif mid_key < target: left = mid + 1 else: right = mid - 1 return None # في حالة عدم العثور على القيمة المطلوبة # مثال لاستخدام البحث الثنائي في قاموس my_dict = {'apple': 5, 'banana': 2, 'cherry': 8, 'orange': 3, 'pear': 1} result = binary_search_dict(my_dict, 'cherry') if result is not None: print("تم العثور على القيمة:", result) else: print("لم يتم العثور على القيمة") بالنسبة لسؤالك الثاني، فتستطيع تنفيذ خوارزميات البحث الثنائي في البحث عن أسماء أو أرقام، وذلك بغض النظر عن نوع البيانات المستخدمة، وتعتمد الخوارزمية على ترتيب البيانات بحيث يمكن تحديد الموضع المناسب للبحث بناءًا على القيمة المطلوبة. وانتبه إلى أن البيانات المستخدمة في البحث الثنائي يجب أن تكون مرتبة بشكل صحيح لضمان الحصول على نتائج صحيحة، فإذا تم تغيير البيانات بعد ترتيبها، فقد يؤدي ذلك إلى نتائج غير صحيحة عند استخدام البحث الثنائي. وفيما يلي مثال على تنفيذ خوارزمية البحث الثنائي للبحث عن رقم في قائمة (list): def binary_search_list(nums, target): left = 0 right = len(nums) - 1 while left <= right: mid = (left + right) // 2 mid_num = nums[mid] if mid_num == target: return mid elif mid_num < target: left = mid + 1 else: right = mid - 1 return -1 # في حالة عدم العثور على الرقم # مثال لاستخدام البحث الثنائي في قائمة my_list = [1, 3, 5, 7, 9, 11, 13, 15] index = binary_search_list(my_list, 7) if index != -1: print("تم العثور على الرقم في الموضع:", index) else: print("لم يتم العثور على الرقم") ولتوضيح الأمر سأذكر لك مثال للبحث عن اسم في قائمة (list): def binary_search_names(names, target): left = 0 right = len(names) - 1 while left <= right: mid = (left + right) // 2 mid_name = names[mid] if mid_name == target: return mid elif mid_name < target: left = mid + 1 else: right = mid - 1 return -1 # في حالة عدم العثور على الاسم # مثال لاستخدام البحث الثنائي في قائمة الأسماء name_list = ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace'] index = binary_search_names(name_list, 'David') if index != -1: print("تم العثور على الاسم في الموضع:", index) else: print("لم يتم العثور على الاسم")
  13. هناك علاقة "واحد إلى كثير" بين الجدول الأول وكل من الجدول الثاني والجدول الثالث والجدول الرابع، حيث يمكن لطالب واحد أن يرتبط بعدة سجلات في الجداول الثلاثة الأخرى، كالتالي: 1- العلاقة بين الجدول الأول والجدول الثاني: المفتاح الأساسي في الجدول الأول (كود الطالب) يعتبر مفتاح أجنبي في الجدول الثاني (كود الطالب)، وتلك العلاقة تعني أن الجدول الثاني يحتوي على معلومات الدفع والتاريخ لكل طالب. 2- العلاقة بين الجدول الأول والجدول الثالث: المفتاح الأساسي في الجدول الأول (كود الطالب) يعتبر مفتاح أجنبي في الجدول الثالث (كود الطالب)، وتعني أن الجدول الثالث يحتوي على معلومات الاختبار والتقييم لكل طالب. 3- العلاقة بين الجدول الأول والجدول الرابع: المفتاح الأساسي في الجدول الأول (كود الطالب) يعتبر مفتاح أجنبي في الجدول الرابع (كود الطالب)، أي أن الجدول الرابع يحتوي على معلومات الغياب والملاحظات لكل طالب.
  14. السؤال عام جدًا، ما هي الخدمات الرقمية التي تحتاج إلى تسويقها؟ فإذا كان لديك خدمات تقدمها فإما عليك بإنشاء موقع شخصي وعرض تلك الخدمات عليه مع توفير إمكانية لشراء تلك الخدمات أو رابط لموقع آخر تعمل عليه لحجز الخدمة مثلاً. أما إذا كنت تريد التسويق لخدمة تقدمها، فعليك بتعلم المهارات الخاصة بالتسويق وبناء العلامة الشخصية، وكيفية بناء متابعين لك عن طريق نشر معرفتك في المكان الصحيح بغرض الإفادة فعلاً لفترة وتعريف الناس بنفسك. أما إذا كنت تريد العمل في مواقع العمل الحر وعرض خدماتك، فلديك مواقع مثل مستقل وخمسات وموقع بعيد. وبخصوص عرض المنتجات الرقمية للبيع والتربح منها، فلديك منصة بيكاليكا. قسم مقالات التسويق والمبيعات في أكاديمية حسوب قسم مقالات التسويق الذاتي في أكاديمية حسوب
  15. المنصات التعليمية المشابهة لـ Udemy وغيرها قليلة في المحتوى العربي، ولذلك أمامك خيارين، الأول هو إنشاء موقع خاص بك ونشر الكورس الخاص بك عليه مع نظام إشتراك تحدده أنت في حال كنت قادر على التسويق للكورس الخاص بك ولديك متابعين أو معروف في مجالك. أو استخدام المنصات التي لديها مستخدمين بالفعل مثل Udemy وAlmentor و Skillshare وبالتالي سيتم العثور على الكورس الخاص بك ولكن بشرط أن توفر جودة منافسة للكورسات الموجودة بالفعل وميزة تنافسية عنهم، مثل شرح أحدث الإصدارات بطريقة عملية واستخدام السلايدات والإنفوجرافيك لتوضيح الأمر، وغيرها من الأمور التي تستطيع تحديدها بنفسك، وقد يفيدك قراءة التالي: وربما عليك في البداية إنشاء كورس مجاني على اليوتيوب بجودة جيدة، من أجل بناء قاعدة متابعين لك مهتمين بالكورسات التي تقدمها.
  16. عليك بإعداد بيانات حسابك على GitHub وذلك من خلال الأوامر التالية: git config --global user.name "hanan" git config --global user.email hanan@gmail.com عليك باستبدال الاسم ولإيميل باسم المستخدم الخاص بك على GitHub ثم استبدال الإيميل بالبريد الذي قمتي بالتسجيل به على GitHub. وعند عمل push سيتم سؤالك عن تسجيل الدخول سواء من خلال المتصفح Sign in with your browser أو طرق أخرى مثل token أو code، والأسهل لك Sign in with your browser وسيتم فتح نافذة لكتابة كلمة المرور واسم المستخدم او الإيميل، وبعدها تستطيعي عمل push. وإذا واجهتك مشكلة أرجو توفير صورة للمشكلة لتوضيح الأمر. وأيضًا من الأفضل لك مشاهدة الفيديو التالي، وستوفري على نفسك الكثير من العناء الغيرضروري عند التعامل مع Git:
  17. ببساطة مهارة REST API أو RESTful API تعني قدرتك على تصميم وتطوير وتفهم واجهات برمجة التطبيقات (API) باستخدام نمط REST (Representational State Transfer). REST هو نمط معماري يستخدم في تطوير الويب للتواصل بين العميل (Client) والخادم (Server) من خلال استخدام مجموعة من الأساليب المحددة مثل GET وPOST وPUT وDELETE. ويستند REST إلى مجموعة من المبادئ والقيود التي تسهل الاتصال والتفاعل بين العميل والخادم: تمثيل الموارد (Resources): يتم تمثيل البيانات والموارد في النظام عن طريق معرفات فريدة (مثل عناوين URL) ويتم الوصول إليها والتعامل معها عن طريق طلبات HTTP. واجهات معيارية (Standardized Interfaces): يستخدم REST مجموعة من طرق الطلبات المعيارية في HTTP مثل GET وPOST وPUT وDELETE للتفاعل مع الموارد. إنعدام الحالة (Stateless): كل طلب منفصل بذاته ولا يتم تخزين حالة العميل على الخادم بين الطلبات، وترسل كافة المعلومات اللازمة للخادم في كل طلب. التفاعل المستقل (Self-contained Interactions): تشمل طلبات REST كل المعلومات اللازمة لإجراء العملية المطلوبة، بما في ذلك أي بيانات إضافية أو تعليمات مطلوبة. التوجيه المحدود (Limited Coupling): يعتمد REST على فصل العميل والخادم بشكل مستقل، ولا يعتمد على المعرفة المسبقة للعميل بشأن تفاصيل الخادم، وبالعكس. أي من يمتلك مهارة REST API قادر على العمل في كلا الجانبين: جانب العميل وجانب الخادم. وفيما يلي توضيح للدورين: 1- جانب العميل (Client-side) يطور تطبيق أو موقع ويب يتفاعل مع API الخادم. يستخدم طلبات HTTP المختلفة مثل GET وPOST للتواصل مع الخادم. يقوم ببناء واجهة المستخدم (UI) لعرض البيانات المستردة من الخادم باستخدام بيانات المستجيبة التي تم تلقيها عبر API. 2- جانب الخادم (Server-side) ينشئ API باستخدام تقنيات RESTful للسماح للعملاء بالتواصل مع البيانات والخدمات التي يقدمها الخادم. يعمل على تصميم وتطوير واجهات البرمجة API التي توفر الوصول إلى مجموعة محددة من البيانات أو العمليات. ينشئ نماذج البيانات ويحدد طرق الوصول إلى هذه البيانات بما يتوافق مع مبادئ REST. وفي العمل، يمكن للمبرمجين أن يكونوا متخصصين في جانب واحد من REST API، مثل مطوري الواجهة الأمامية (Front-end Developers) الذين يتعاملون بشكل رئيسي مع API الخادم على الطرف العميل، أو مطوري الخادم (Back-end Developers) الذين ينشئون ويديرون ال API نفسها على الطرف الخادم. وإليك مثال لكود JavaScript يوضح كيفية تنفيذ REST API لمصادر المستخدمين باستخدام إطار عمل Express.js أي في الواجهة الخلفية: const express = require('express'); const app = express(); // بيانات المستخدمين المؤقتة let users = [ { id: 1, name: 'John' }, { id: 2, name: 'Jane' } ]; // استرداد جميع المستخدمين app.get('/users', (req, res) => { res.json(users); }); // إنشاء مستخدم جديد app.post('/users', (req, res) => { const newUser = { id: users.length + 1, name: req.body.name }; users.push(newUser); res.status(201).json(newUser); }); // تشغيل الخادم app.listen(3000, () => { console.log('Server started on port 3000'); }); أما التعامل مع REST API في الواجهة الأمامية فهو كالتالي: // استدعاء API لاسترداد جميع المستخدمين async function getUsers() { try { const response = await fetch('/users'); const data = await response.json(); // استخدام البيانات المستلمة console.log(data); // يتم طباعة المستخدمين في وحدة التحكم } catch (error) { console.error('Error:', error); } } // استدعاء API لإنشاء مستخدم جديد async function createUser() { const newUser = { name: 'Alice' }; try { const response = await fetch('/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(newUser) }); const data = await response.json(); // استخدام البيانات المستلمة console.log(data); // يتم طباعة المستخدم الجديد في وحدة التحكم } catch (error) { console.error('Error:', error); } } // استدعاء الدوال المحددة getUsers(); createUser(); وبالإضافة إلى REST، هناك عدة معماريات أخرى تستخدم في تطوير وتصميم واجهات برمجة التطبيقات، مثل: معمارية SOAP (Simple Object Access Protocol): تستخدم في تطوير واجهات برمجة التطبيقات المبنية على نمط XML وتتطلب بروتوكولات معقدة للتواصل. معمارية GraphQL: تسمح للعميل بتحديد البيانات المحددة التي يُرغب في استردادها، مما يزيد من كفاءة استرداد البيانات ويقلل من حمولة الشبكة. معمارية gRPC: تعتمد على نمط RPC (Remote Procedure Call) للتواصل بين العميل والخادم، وتستخدم تسلسل البيانات بتنسيق Protocol Buffers.
  18. ليس لك علاقة بـ CSS من قريب أو بعيد، لكن عليك بتعلم الأساسيات فقط في حال أردت تنسيق أو تعديل أمرًا ما في الصفحة لديك، أو إذا أردت بناء مشروع خاص بك، فسيتعين عليك بناء واجهة أمامية بالطبع في حال كنت تعمل بمفردك على المشروع. وبالطبع لن تحتاج إلى التعمق في CSS مجرد فهم اللغة لا أكثر، وستجد أن أغلب مطوري الواجهة الخلفية الذين يتعاملون مع الواجهة الأمامية يستخدمون إطار للواجهة الأمامية وكلٌ يفضل إطار مختلف، ومنها Bootstrap أو Tailwind أو Martial UI وغيرهم. لذلك عليك بالإعتماد على إطار خاص بـ CSS من أجل التعامل مع الواجهة الأمامية إن احتجت لذلك في مشروعك، قم بتجربة تعلم كل إطار واختر ما يناسبك وتجد إرتياح في استخدامه، وإذا أردت إمكانية تخصيص الواجهة الأمامية بشكل حر أكثر عليك بتعلم Tailwind، أما بخصوص مكونات الواجهة الأمامية الجاهزة والتي تستطيع استخدامها لإنشاء واجهة أمامية جميلة في وقت قصير فعليك بتعلم Bootstrap وMartial UI. وذلك لا يعني أن Tailwind لا يتوفر لها مكونات واجهة جاهزة UI components، بل يوجد وإليك مثال: https://daisyui.com https://www.hyperui.dev/ https://tailwindcomponents.com/ لكن البعض قد يجد أن Bootstrap وMartial UI أسهل في الاستخدام بالإضافة إلى أن تخصص تلك الإطارات هو مكونات جاهزة للواجهة الأمامية، لذلك ذكرت لك أن تحاول تعلم وتجربة تلك الإطارات وإختيار المريح لك من بينهم، مثلاً استخدم كل إطار لمدة أسبوع وقرر بناءًا على ذلك.
  19. ستحتاج أولاً لتعلم علوم الحاسب، وستجد دورة علوم الحاسوب عونًا لك على ذلك: حيث ستتعلم بها التالي: أساسيات الحاسوب وعلومه والتفكير المنطقي وما هي الخوارزميات وكيف تفيد في البرمجة تطبيقات عملية على أساسيات التفكير المنطقي باستخدام بيئة سكراتش Scratch التفاعلية أساسيات لغة البرمجة JavaScript وتطبيق المفاهيم التي تم شرحها باستخدامها، والتوسع في شرح التطبيقات العملية للغات البرمجة أساسيات أنظمة التشغيل المختلفة وكيفية تثبيت البرمجيات اللازمة للبرمجة عليها أساسيات سطر الأوامر في نظام لينكس، وشرح الأسس التي بني عليها النظام مع تطبيقها عمليًا أنظمة قواعد البيانات المختلفة، مع شرح تفصيلي للغة SQL للتعامل معها مبادئ أساسية في أنظمة قواعد البيانات NoSQL المفاهيم الأساسية التي تبنى فيها صفحات الويب مفاهيم أساسية في الشبكات والخوادم، وكيف يتم استقبال الطلبيات إلى الخادم والرد عليها مبادئ الحماية والأمان في الويب وبأي حال من الأحوال ستحتاج إلى تعلم لغة برمجة، وفي الدورة السابقة سيتم تعلم أساسيات جافاسكريبت وبايثون. وبالتي ستتمكن من بناء معرفة واسعة وتجهيز نفسك لمجال الأمن السيبراني، أو قد تقرر التخصص في مجال آخر وذلك بناءًا على المعرفة التي اكتسبتها. وكنصيحة لا تقرر التخصص في مجال لأنك تريد أو تفضله، بل ابحث عن المطلوب في سوق العمل لديك وذلك بالتأكد من مواقع التوظيف مثل LinkedIn وغيرها. أما عن وجود دورة متخصصة في الأمن السيبراني، فهي غير متاحة، وبخصوص مسار الأمن السيبراني والـ Roadmap الخاصة به، فقد تم توضيح ذلك من قبل هنا:
  20. أهلاً بك ماجد، أرجو منك دراسة الدورة كما هي بالترتيب، طالما أنك مبتدأ في البرمجة فعليك بالدراسة من البداية إلى النهاية، وأيضًا لا تحاول إنهاء الدورة بشكل سريع، بل خذ وقتك ولا تقلق إذا كان الأمر صعب في البداية ومع الوقت سيصبح أسهل، وعليك بقراءة النقاش التالي والنقاشات المرفقة به وستجد الكثير من الإجابات للأسئلة لديك:
  21. ذلك غير متاح، ولديك خياران عندما يتعلق الأمر بتحويل كود أو ملف بايثون إلى ملف تنفيذي EXE في ويندوز، أو صيغ أخرى لأنظمة لينكس وماك. وهما PyInstaller (يدعم ويندوز ولينكس وماك) وAuto-Py-to-EXE (يدعم ويندوز فقط) وقد تم شرح ذلك في أول تعليق بشكل وافي.
  22. أنت لم تقم بتحديد ما هي الميزانية الخاصة بك، وما هو عدد الزيارات بالفعل شهريًا، وما هي المنصة الخاصة بموقعك هل هي وورد بريس، أم تستخدم برمجة خاصة مثل MERN STACK؟ وهل لديك قدرة على إدارة إعدادات الاستضافة أم تريد استضافة مدارة؟ على أي حال سأعتبر أن الميزانية لديك متوسطة، وإليك بعض الترشيحات: DigitalOcean يقدم العديد من الخدمات مثل Droplets وSpaces وDomains، وتبدأ أسعار DigitalOcean من 5 دولارات شهريًا. Linode توفر منصة Linode خدمات مثل Linode Cloud Compute وLinode Object Storage وLinode DNS، وتبدأ أسعار Linode من 5 دولارات شهريًا. Vultr مثل SSD VPS Cloud Servers و Vultr Cloud Compute وVultr Storage وVultr DNS، وتبدأ أسعار Vultr من 5 دولارات شهريًا.
  23. أولاً يجب كتابة الكود الخاص بالاستمارة ويحتوي على عناصر الإدخال التي ترغبين في جمع بياناتها كالتالي: <form action="process.php" method="POST"> <label for="name">الاسم:</label> <input type="text" id="name" name="name" required><br><br> <label for="gender">الجنس:</label> <input type="radio" id="male" name="gender" value="ذكر" required> <label for="male">ذكر</label> <input type="radio" id="female" name="gender" value="أنثى" required> <label for="female">أنثى</label><br><br> <label for="hobbies">الهوايات:</label> <input type="checkbox" id="hobby1" name="hobbies[]" value="رياضة"> <label for="hobby1">رياضة</label> <input type="checkbox" id="hobby2" name="hobbies[]" value="قراءة"> <label for="hobby2">قراءة</label><br><br> <label for="country">الدولة:</label> <select id="country" name="country" required> <option value="مصر">مصر</option> <option value="السعودية">السعودية</option> <option value="الإمارات">الإمارات</option> </select><br><br> <input type="submit" value="إرسال"> </form> ثم كتابة الكود الخاص بخادم PHP مثلاً في ملف باسم process لمعالجة البيانات المرسلة من النموذج ويقوم بإضافتها إلى قاعدة البيانات، واستخدمي MySQL أو أي نظام إدارة قاعدة بيانات آخر، كالتالي: <?php // استقبال البيانات من النموذج $name = $_POST['name']; $gender = $_POST['gender']; $hobbies = $_POST['hobbies']; $country = $_POST['country']; // تأسيس اتصال قاعدة البيانات $servername = "localhost"; $username = "اسم_المستخدم"; $password = "كلمة_المرور"; $dbname = "اسم_قاعدة_البيانات"; $conn = new mysqli($servername, $username, $password, $dbname); // التحقق من وجود أخطاء في الاتصال بقاعدة البيانات if ($conn->connect_error) { die("فشل الاتصال بقاعدة البيانات: " . $conn->connect_error); } // إدخال البيانات إلى الجداول $sql = "INSERT INTO table1 (name, gender, country) VALUES ('$name', '$gender', '$country')"; if ($conn->query($sql) === TRUE) { $table1_id = $conn->insert_id; // إدخال الهوايات إلى جدول آخر foreach ($hobbies as $hobby) { $sql = "INSERT INTO table2 (table1_id, hobby) VALUES ('$table1_id', '$hobby')"; $conn->query($sql); } echo "تمت إضافة البيانات بنجاح"; } else { echo "حدث خطأ أثناء إضافة البيانات: " . $conn->error; } // إغلاق اتصال قاعدة البيانات $conn->close(); ?> ونوع البيانات الذي يتم تخزينه في قاعدة البيانات يتوقف على التعريف الذي قمت به لجداولك، وفي الكود السابق استخدمت أنواع البيانات التالية: table1: name: VARCHAR أو TEXT (اسم العمود حسب التعريف) gender: VARCHAR أو TEXT country: VARCHAR أو TEXT table2: table1_id: INT (الرقم المميز للصف في جدول 1) hobby: VARCHAR أو TEXT وعليك استبدال "اسم_المستخدم" و"كلمة_المرور" و"اسم_قاعدة_البيانات" بمعلومات اتصال قاعدة البيانات لديك.
  24. أولاً عليك إنشاء دالة كالتالي: تعريف الدالة باسم calculate_average وهي تأخذ قائمة من الأرقام كمدخل. التحقق من طول القائمة باستخدام len(numbers) لمعرفة عدد العناصر في القائمة. إذا كان طول القائمة يساوي صفر، فهذا يعني أن القائمة فارغة. وفي هذه الحالة، تعود الدالة بقيمة صفر لأنه لا يمكن حساب المتوسط في قائمة فارغة. إذا كانت القائمة غير فارغة، يتم حساب مجموع جميع الأرقام في القائمة باستخدام الدالة sum(numbers) التي تقوم بجمع جميع الأعداد. ثم يتم قسم مجموع الأرقام على طول القائمة len(numbers) للحصول على المتوسط الحسابي. يتم إرجاع القيمة المحسوبة كناتج للدالة. def calculate_average(numbers): if len(numbers) == 0: return 0 else: return sum(numbers) / len(numbers) ثم استخدامها لحساب المتوسط كالتالي: my_list = [1, 2, 3, 4, 5] result = calculate_average(my_list) print(result) # الناتج: 3.0 empty_list = [] result = calculate_average(empty_list) print(result) # الناتج: 0 حيث تعمل الدالة calculate_average على التحقق مما إذا كانت القائمة المعطاة فارغة، وإذا كانت فارغة، فإنها تقوم بإرجاع القيمة صفر، وإذا لم تكن فارغة، فستوم بحساب مجموع جميع الأرقام في القائمة باستخدام دالة sum()، وتقسمها على طول القائمة للحصول على المتوسط الحسابي.
×
×
  • أضف...