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

ياسر مسكين

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

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

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

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

    2

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

  1. بما أن هذا هو قسم الأسئلة العامة، أرجو أن يتم طرح السؤال أسفل الفيديو في قسم الدورة المخصص بذلك، في قسم التعليقات. ليتم إجابتك بشكل واضح.
  2. Express.js و Next.js هما إطاري عمل مختلفان يتم استخدامهما لأغراض مختلفة في تطوير تطبيقات الويب، كما يمكن أن يعملا بشكل متكامل، لكن بشكل تفصيلي فإن Express.js يعتبر إطار عمل للجانب الخادم (backend) في تطبيقات الويب، كما يمكن استخدامه مع أي إطار عمل أمامي مثل React أو Angular أو Vue.js وهو مناسب لبناء تطبيقات ويب تقليدية التي تتطلب تنفيذ الخوارزميات والمنطق على الخادم. أما Next.js هو إطار عمل لكلا الجانبين أي الخادم والجانب العميل (server-side rendering) في تطبيقات رياكت بحيث يقدم جربة تطوير متقدمة لتطبيقات رياكت مع دعم للتقديم الديناميكي للصفحات كتوفيره لتقنيات مثل الإعادة التلقائية للصفحة (automatic page prefetching) والتقديم الثابت (static rendering) لتحسين أداء التطبيق. كما يمكن استخدام Next.js مع أو بدون Express.js لكونه يتيح لنا بناء خوادم متكاملة بشكل داخلي. يمكنك الاطلاع على المزيد من هنا:
  3. يمكنك استخدام مكتبة "Maatwebsite/Laravel-Excel" في Laravel لاستيراد ملف Excel وإنشاء المنتجات بناء على البيانات الموجودة في الملف. بداية، يمكنك أولا البدء في استرداد ملف إكسل في لارافل من خلال استخدام مكتبة maatwebsite/excel لرفع الملف عبر هذا الأمر: composer require maatwebsite/excel بعدها تقوم بإنشاء وسيط تحكم لاستقبال الملف: Route::post('/import-products', 'ProductController@import'); ثم تستطيع بعدها إعداد دالة التحكم وإضافة خاصية التحقق من أن الملف يحتوي على نفس أسماء الأعمدة مثل النموذج بالشكل التالي: public function import(Request $request) { $file = $request->file('file'); // التأكد من أن ملف إكسل يحتوي على نفس أسماء الأعمدة مثل نموذج Product. $validator = Validator::make($request->all(), [ 'file' => 'required|mimes:xlsx,xls', ]); if ($validator->fails()) { return back()->withErrors($validator); } $import = new Importer; $products = $import->import($file); // معالجة البيانات و إنشاء المنتجات... } لقراءة ملف إكسل نستخدم ()Excel::load: $excel = Excel::load($file); .للحصول على بيانات ورقة العمل نستخدم ()getSheetData: $data = $excel->getSheetData('products'); ونستخدم حلقة foreach للوصول إلى بيانات كل منتج مع التأكد من صحة البيانات: foreach ($data as $row) { // تأكد من صحة البيانات في ملف إكسل. $validator = Validator::make($row, [ 'name' => 'required|string', 'id' => 'required|integer', 'image' => 'required|string', 'quantity' => 'required|integer', ]); if ($validator->fails()) { continue; } $product = new Product; $product->name = $row['name']; $product->id = $row['id']; $product->image = $row['image']; $product->quantity = $row['quantity']; $product->save(); } ويمكنك تصفح هذه المصادر للاستفادة أكثر: وهنا نقاش حول تصدير البيانات للفائدة العامة:
  4. الأسئلة الاختبارية لا نجيب عنها، لكن يمكنني مساعدتك كي تبدأ، يمكنك البدء من خلال عمل مخطط Use Case أين يبدأ التصميم بتحديد الوظائف التي سيقوم بها المستخدمون في التطبيق، ويتم ذلك من خلال مخطط Use Case الذي يوضح أنواع المستخدمين والأنشطة التي يمكنهم القيام بها. على سبيل المثال: المستخدم يمكنه طلب توصيل. المستخدم يمكنه تتبع الطلبات الحالية. المستخدم يمكنه إلغاء طلب التوصيل. بعدها يمكنك من عمل مخطط Sequence وهو ضروري لوصف تفاعل المستخدم مع التطبيق وتفاعل التطبيق مع النظام أين يوضح هذا المخطط كيفية تبادل البيانات بين الأجزاء المختلفة في التطبيق، مثل تطبيق العميل ونظام الطلبات وموفري الخدمة. بعد ذلك، يتم إنشاء مخطط Class وهو أهم من ضروري لانشاء التطبيق أين تقوم فيه بتحديد الكائنات والعلاقات بينها في التطبيق يشمل ذلك تحديد الخصائص والأساليب لكل كائن وكيفية تفاعلها مع بعضها البعض. يمكن عمل مخطط State أيضا وذلك لوصف حالات الكائنات في التطبيق وكيفية تغيرها من حالة إلى أخرى بناء على الأحداث التي تحدث. ويمكنك تصميمها باستخدام أدوات رسم خاصة لتطبيقات تحرير النماذج مثل: drawio أو Visual Paradigm. يمكنك تصفح هذه المصادر القيمة أين ستفيدك كثيرا في مرحلة عمل مخططات UML:
  5. لعمل ذلك أولا يجب التسجيل في مركز المعلومات الوطني للحصول على مفتاح API الذي سيسمح لك بالوصول إلى بيانات المستخدمين عبر خدمة نفاذ ثانيا، إعداد موقع ووردبرس، من خلال تحميل وتثبيت إضافة (plugin) تتيح استخدام ال API في ووردبرس. ثالثا، ربط الخدمة بووردبرس من خلال إدخال مفتاح API الذي تحصلت عليه من مركز المعلومات الوطني في الإعدادات المناسبة في ووردبريس عادة ستجد هذا الخيار في قسم الإعدادات الخاص بالإضافة التي قمت بتثبيتها. رابعا، يمكنك استخدام ميزة إنشاء النماذج في ووردبريس أو إضافة نموذج تسجيل مستخدم جديد يدعم الاتصال بخدمة نفاذ وهنا يمكنك تصميم النموذج ليتضمن الحقول التي تريد جمع بياناتها من خدمة نفاذ مثل الاسم، رقم الجوال، والعنوان الوطني وما إلى ذلك. بعدها يمكنك برمجة النموذج للاتصال بخدمة نفاذ باستخدام الواجهة البرمجية (API) المقدمة، عبر استخدام مفتاح API الخاص بك للمصادقة وجلب بيانات المستخدم الجديد. وبعد استلام بيانات المستخدم الجديد من خدمة نفاذ، يمكنك استخدامها لإنشاء حساب جديد في موقعك التجاري، لكن يجب أولا التحقق من صحة البيانات المستلمة وتنسيقها بشكل مناسب قبل إدخالها في قاعدة البيانات لديك.
  6. لإضافة مكتبة SweetAlert2 يجب أن تبدأ بتضمينها في الصفحة، يمكنك القيام بذلك عن طريق إضافة الرابط إلى الـ `<head>` في قسم الهيدر: <head> <!-- مكتبة SweetAlert2 --> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> </head> بعدها تقوم بتعديل رابط حذف الطالب في الجدول لاستدعاء دالة تقوم بعرض رسالة تأكيد باستخدام SweetAlert2. يجب أن يكون لديك سكربت خاص يقوم بإدارة عملية الحذف. بعدها تقوم بتغيير الرابط في الجدول إلى ما يلي: <td style="padding: 10px;"> <a href="#" class="btn-delete" onclick="confirmDelete(<?php echo $rows['id_std']; ?>)"> <span class="glyphicon glyphicon-trash"></span> حذف </a> </td> ثم تضيف السكربت التالي في الجزء السفلي من صفحتك لإنشاء دالة `()confirmDelete` التي تعرض رسالة تأكيد الحذف. <script> function confirmDelete(studentId) { Swal.fire({ title: 'هل أنت متأكد؟', text: "لن تتمكن من استعادة هذه البيانات!", icon: 'warning', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: 'نعم, احذفها!' }).then((result) => { if (result.isConfirmed) { // إذا تم الضغط على زر التأكيد، يقوم بإعادة توجيه المستخدم إلى صفحة حذف الطالب window.location.href = 'delete-student.php?id=' + studentId; } }); } </script> وهذا الكود الكامل بعد التعديلات: <?php include('header.php'); ?> <!DOCTYPE html> <html lang="ar"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>عرض الطلاب</title> <!-- مكتبة SweetAlert2 --> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> </head> <body> <div class="col-md-9 pan1"> <ol class="breadcrumb" style="background-color: #fff;padding-top:8px;padding-bottom:8px;color:#000;font-size:16px;"> <li>الطلبة</li> </ol> </div> </div> <div class="row"> <div class="col-md-9 pan1"> <div class="panel" style="color:#000;"> <div class="panel-body" style="font-size:14px; padding-left:40px;padding-right:40px;padding-bottom:25px;padding-top:25px;"> <p style="margin-bottom: 20px;"> <a class="btn-add" href="add-student.php"> إضافة <span class="ion-android-add"></span></a> </p> <?php // استدعاء البيانات من قاعدة البيانات if (!isset($_GET['page'])) { $page = 1; } else { $page = (int)$_GET['page']; } $post_at_page = 10; $query_post_count = mysqli_query($con, "SELECT * FROM `std_show_adm`"); $query_count = mysqli_num_rows($query_post_count); mysqli_free_result($query_post_count); $query_count = (int)ceil($query_count / $post_at_page); if (($page > $query_count) || ($page <= 0)) { echo '<div class="alert alert-danger" role="alert">خطأ لم يتم العثور على صفحة</div>'; echo '<meta http-equiv="refresh" content="2;url=student.php" />'; } $start = ($page - 1) * $post_at_page; $end = $post_at_page; $querypost = "SELECT * FROM std_show_adm ORDER BY id_std DESC LIMIT $start,$end"; $result = mysqli_query($con, $querypost); echo '<div class="table-responsive"> <table class="table table-bordered table-hover"> <tr> <td> رقم القيد </td> <td> أسم الطالب </td> <td> التخصص </td> <td> تعديل </td> <td> حذف </td> </tr>'; while ($rows = @mysqli_fetch_array($result)) { echo '<tr> <td>' . $rows['id_std'] . ' </td> <td>' . $rows['Name_std'] . '</td> <td>' . $rows['Name_dept'] . '</td> <td style="padding: 10px;"><a href="edit-student.php?id=' . $rows['id_std'] . '" class="btn-edit"><span class="glyphicon glyphicon-pencil"></span> تعديل </a></td> <td style="padding: 10px;"><a href="#" class="btn-delete" onclick="confirmDelete(' . $rows['id_std'] . ')"><span class="glyphicon glyphicon-trash"></span> حذف </a></td> </tr>'; } echo "</table>"; ?> <nav> <ul class="pager"> <li><a href="student.php?page=<?php echo ($page - 1); ?>" style="color:#000;">الصفحة السابقة</a></li> <li><a href="student.php?page=<?php echo ($page + 1); ?>" style="color:#000;">الصفحة التالية </a></li> </ul> </nav> </div> </div> </div> </div> </body> </html>
  7. إطار العمل TensorFlow يعتبر واحدا من الأطر الشهيرة والقوية في مجال تعلم الآلة والذكاء الاصطناعي ومن الممكن استخدامه من قبل المبتدئين، ولكن قد يكون هناك بعض التحديات للمبتدئين في التعامل معه بسبب مستوى تعقيده النسبي. فبما أنك مبتدئ في تعلم الآلة يمكنك البدء ببعض أطر العمل الأسهل منها للبدء بها وفهمها جيدا ك: Scikit-learn: هو إطار عمل بسيط وسهل الاستخدام لتعلم الآلة بحيث يوفر مجموعة واسعة من الخوارزميات المتوفرة ويسمح بتنفيذ العديد من العمليات الأساسية في تعلم الآلة بشكل سهل وسلس. Keras: ويعتبر Keras إطار عمل عالي المستوى يوفر واجهة برمجة التطبيقات (API) بسيطة وسهلة الاستخدام، ويمكن استخدامه لبناء النماذج بسرعة دون الحاجة إلى التعامل مع التفاصيل الداخلية للعمليات في TensorFlow. PyTorch: بالرغم من أنه يتطلب قليلا من المعرفة بالبرمجة، إلا أن PyTorch يعتبر أحد الأطر العمل الشهيرة والمناسبة للمبتدئين بحيث يتميز ببنية بسيطة ومرونة عالية، ويحظى بمجتمع نشط للمستخدمين والمساهمين. لذلك يمكنك البدء بإحدى هاته الأطر ومع مرور الوقت واكتساب المزيد من المهارات، يمكنك استكشاف وتعلم TensorFlow والاستفادة من قوته في تطبيقات تعلم الآلة والذكاء الاصطناعي، ويمكنك معرفة المزيد من المعلومات من خلال هذه المقالة:
  8. يمكن عمل ذلك مثلما تعمل العديد من تطبيقات التجارة الإلكترونية وأنظمة الحجوزات وغيرها، بحيث تستخدم العديد من مواقع الحجوزات نفس النهج لإلغاء الحجوزات غير المدفوعة في حال عدم تأكيد الدفع في فترة زمنية محددة. يمكنك استخدام نظام المهام الدورية لإلغاء الطلبيات غير المدفوعة بعد مرور فترة زمنية معينة بحيث تكون الطلبيات التي لم يتم دفعها في الوقت المناسب سيتم إلغاؤها تلقائيا، وهذا ما سيقلل من احتمالية حدوث مشاكل مثل حجز المخزون دون دفع أو تأخيرات غير مرغوب فيها. وإن كنت ترغب في تجاوز كل هذا، يمكنك إضافة طريقة دفع عبر API، فإنه يمكن أن يساعد في حل المشكلة بطريقة مختلفة. فبدلا من انتظار الفترة المحددة لإلغاء الطلبيات غير المدفوعة، يمكنك تحديث حالة الطلبية على الفور بعد نجاح عملية الدفع عبر الـ API. في هذا الحال، عندما يتم توجيه المستخدم إلى بوابة الدفع ويتم دفع الطلب، يمكنك استخدام الاستجابة المتلقاة من ال API لتحديث حالة الطلبية إلى "تم الدفع" مباشرة. هذا سيضمن أن العناصر في عربة التسوق لن تحجز إلا بعد تأكيد الدفع بنجاح. هذا الحل يحسن من تجربة المستخدم ويزيل الحاجة إلى تنفيذ مهمة مجدولة لإلغاء الطلبيات غير المدفوعة، ويعطي استجابة فورية بعد عملية الدفع الناجحة.
  9. تصفحت الفيديوهات وهي تسير بشكل جيد، هل تظهر أية رسائل خطأ على مشغل الفيديو؟ في حالة لم تكن تظهر، حاول تجربة متصفح آخر، فقد تكون المشكلة متعلقة بالمتصفح الذي تستخدمه، أو يمكنك القيام بتحديث الصفحة مع حذف الكاش من خلال هذا الاختصار: Ctrl + Shift + R فبالضغط عليه سيقوم بتحديث الصفحة مع حذف الملفات المؤقتة مباشرة، عادة هذا الإجراء قد يساعد في حل المشكلات التي تنجم عن البيانات المخزنة بشكل غير صحيح. الاحتمال الآخر، وهو أن تكون المشكلة متعلقة باتصالك بالأنترنت وهذا الأمر وارد، يمكنك التحقق منه ومعاودة المحاولة. في حالة لم تنجح معك جميع الطرق، تواصل مع مركز المساعدة وسيساعدونك في حل المشكلة إذا كان الأمر متعلقا بحسابك.
  10. معظم المواقع التي تعتمد على طريقة جمع النقاط والتبادل تستخدم ال API المقدم من المنصات الاجتماعية مثل فيسبوك للسماح لتطبيقها بالوصول إلى معلومات الحسابات وتنفيذ الأنشطة مثل المتابعة وإلغاء المتابعة. بحيث تقوم هذه المواقع بتوفير واجهة مستخدم تسمح للمستخدمين بتسجيل الدخول باستخدام حساباتهم على المنصات الاجتماعية، مثل فيسبوك. وعند تسجيل الدخول، يتم منح التطبيق أو الموقع إذن للوصول إلى بعض معلومات الحساب مثل اسم المستخدم والبريد الإلكتروني وقائمة المتابعين والمتابعة، باستخدام هذه المعلومات، يمكن للتطبيق التفاعل مع حسابات المستخدمين الآخرين بما في ذلك متابعة الحسابات المطلوبة لجمع النقاط، ولعمل ذلك يجب أن يقوم المستخدم ب: تسجيل الدخول: يجب على المستخدم تسجيل الدخول إلى حسابه على الموقع الذي يوفر خدمة جمع النقاط والتبادل باستخدام حسابه على منصة التواصل الاجتماعي. الموافقة على الوصول: بمجرد تسجيل الدخول، يتم عرض صفحة تأكيد تطلب الموافقة على منح التطبيق أو الموقع الوصول إلى بعض معلومات الحساب. القيام بالأنشطة المطلوبة: بعد الموافقة، يمكن للمستخدم البدء في القيام بالأنشطة المطلوبة مثل متابعة حسابات أخرى لجمع النقاط. استبدال النقاط: بعد تجميع عدد كاف من النقاط، يمكن للمستخدم استخدامها لطلب المتابعة من قبل مستخدمين آخرين. لكني لا أنصح بتاتا باستخدام هاته الطرق لزيادة المتابعين لأنها طرق لا تعكس قيمة المحتوى الهادف والنافع ولا تساهم في الترويج إليه، فهاته الطرق ليس غير آمنة فقط، بل غير أخلاقية ومخالفة لسياسات منصات التواصل الاجتماعي ويمكن أن تتسبّب في حظر الحسابات.
  11. يمكنك استخدام التوريث لإنشاء فئات فرعية من الصنف User بهذا الشكل: from django.contrib.auth.models import AbstractUser from django.db import models class User(AbstractUser): # خيارات نوع المستخدم USER_TYPE_CHOICES = ( ('vendor', 'Vendor'), ('customer', 'Customer'), ) # حقل نوع المستخدم user_type = models.CharField(max_length=20, choices=USER_TYPE_CHOICES) # فئة فرعية لبائع class Vendor(User): # خاصية خاصة بالبائع vendor_specific_property = models.CharField(max_length=100) # فئة فرعية للعميل class Customer(User): # خاصية خاصة بالعميل customer_specific_property = models.CharField(max_length=100) حيث بداية تقوم بتعريف فئة User التي تمثل المستخدم الأساسي وتحتوي على خيارات نوع المستخدم وحقل لتحديد نوع المستخدم. ثم ننشئ فئات فرعية (Vendor وCustomer) ترث من الفئة الأساسية User ونضيف الخصائص الخاصة لكل فئة. هذا الحل يسمح لنا بإنشاء مستخدمين من نوعين مختلفين (بائع وعميل) وتخصيص الخصائص الخاصة بهم بسهولة.
  12. نعم، يمكن تحقيق هذه الفكرة باستخدام جافا سكريبت وزيادة حجم الصفحة قد يؤثر على عملية الأرشفة، إلا أنه يمكن التعامل مع هذا الأمر بتحسين هيكلية الصفحة واستخدام تقنيات الضغط والتحسين، هذا مثال لتتضح الصورة فقط: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>موقع مجمع</title> <script> window.onload = function() { // استخراج قيمة الاستعلام من عنوان URL const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); const content = urlParams.get('type'); // اظهار الصفحة المناسبة بناءً على قيمة الاستعلام showContent(content); }; function showContent(content) { // إخفاء جميع العناصر ذات الهوية content وإظهار فقط العنصر المناسب const contents = document.querySelectorAll('.content'); contents.forEach(function(element) { element.style.display = 'none'; }); const selectedContent = document.getElementById(content); if (selectedContent) { selectedContent.style.display = 'block'; } } </script> </head> <body> <div class="content" id="page1"> <h2>صفحة 1</h2> <p>محتوى الصفحة الأولى.</p> </div> <div class="content" id="page2"> <h2>صفحة 2</h2> <p>محتوى الصفحة الثانية.</p> </div> <!-- وهكذا يمكنك اضافة المزيد من الصفحات --> </body> </html> وفيه يتم استخدام استعلام في عنوان URL (?type=اسم_الصفحة) لتحديد أي صفحة يجب عرضها على الصفحة الرئيسية. وباستخدام السكريبت المدمج، يتم عرض المحتوى المناسب عند تحميل الصفحة استنادا إلى القيمة المحددة في استعلام العنوان.
  13. تقسيم برمجة التطبيق كاملة إلى قسمين فقط قد لا يكون كافيا برأيي، شخصيا أفضل استخدام منهجية أجايل سكرام في تقسيم وتنظيم العمل في مختلف مشاريعي البرمجية، فمنهجية أجايل سكرام هي منهجية لإدارة المشاريع تعتمد على تقسيم العمل إلى دورات قصيرة (عادة ما تكون أسبوعين) تسمى "سبرينت". في كل سبرينت، يتم تحديد مجموعة من المهام التي يجب إنجازها، ويقوم الفريق بالعمل عليها بشكل تعاوني. ومن مميزاتها أنها: مرنة أكثر: لكونها تسمح بإجراء تغييرات على المهام بسهولة أكبر لأنها تعتمد على التقييمات المتكررة والتكيف مع التغييرات. تركيز أكبر على التعاون: لأنها تشجع على التعاون بين أعضاء الفريق، مما يساهم في تحسين جودة العمل. تسليم أسرع: تساعد على تسليم نتائج العمل بشكل أسرع لاعتمادها على تقسيم العمل إلى دورات قصيرة. تحسين التواصل: تشجع على التواصل الفعال بين أعضاء الفريق من أجل تجنب المشاكل وتقليل المخاطر. أعتقد أن استخدام منهجية أجايل سكرام في تقسيم العمل في برمجة التطبيقات الكبيرة يمكن أن يساهم بشكل كبير في تحسين كفاءة العمل وسرعة التسليم وتحسين جودة التطبيق، وهذه بعض المصادر المهمة التي يمكنها أن تساعدك على اختيار المنهجية المناسبة:
  14. في دالة print، لا يوجد فرق جوهري بين استخدام ' و " لعرض النص فكلاهما يستخدم لعرض سلسلة نصية بين علامتي اقتباس. لكن يمكن دمج المتغيرات داخل السلسلة النصية باستخدام f-strings أو طريقة التنسيق القديمة كاستخدام علامات التنصيص الخاصة مثل \n و \t للتحكم بترتيب السطور و المسافات. الاختلافات البسيطة بينهما تتجلى من خلال الاقتباسات المزدوجة (") فهي تستخدم بشكل أكثر شيوعا. وبشكل عام يمكن استخدام ' و " بشكل متبادل في دالة print لعرض النص، أما عن كيفية استخدامي شخصيا لهما فأنا أستخدم هذه " بشكل افتراضي، أما الأخرى فأستخدمها إذا كنت بحاجة إلى عرض نص يحتوي على علامات اقتباس مزدوجة. لكن من الأفضل أن نكون متسقين بالحفاظ على نمط ونوع واحد في أكوادنا البرمجية.
  15. في العموم لغة PHP آمنة بطبيعتها، لكن أمنها يعتمد على كيفية استخدامها، من النقاط الإيجابية التي أذكرها أنها لغة مفتوحة المصدر مما يسمح للمجتمع الذي يعمل بها بمراجعة الكود وإصلاح الثغرات الأمنية بسرعة. لغة PHP لها ميزات أمان مدمجة مثل تصفية الإدخال والتحقق من صحة البيانات، وهذا ما يساعد في الظاهر على منع هجمات حقن البيانات. لديها كذلك مكتبة hashlib لتشفير البيانات، ومكتبة password_hash لتخزين كلمات المرور بشكل آمن. لكن النقطة السلبية تكمن في كونها لغة قديمة فقد تم إنشاؤها في عام 1994، مما يعني أن بعض ميزاتها قد تكون غير آمنة لهذا يجب على المبرمج استخدام ميزات الأمان بشكل صحيح لضمان أمان تطبيقاته، لأنه كلما زاد عمر اللغة كلما كانت أكثر عرضة للاختراق وكانت لقمة سائغة للمخترقين. لهذا أنصح دوما باستخدام أحدث إصدار من PHP لكن بشكل عام، لغة PHP آمنة إذا تم استخدامها بشكل صحيح، لكن ينبغي أن ندرك بأنه لا توجد لغة برمجة آمنة بنسبة 100٪: حتى مع اتباع جميع ممارسات البرمجة الآمنة، فدوما يبقى هناك خطر من تعرض التطبيق للاختراق. كما يمكنك الاستفادة من النقاش حول هذا السؤال:
  16. رمضان مبارك علينا وعليكم أخي، وفقنا الله لصيامه وقيامه بعون الله.
  17. مكتبة packaging في بايثون هي عبارة عن حزمة برمجية قياسية تستخدم لإنشاء وتوزيع حزم البايثون بحيث تسهل هذه المكتبة على المطورين مشاركة الأكواد البرمجية مع غيرهم، وتثبيت الحزم من مصادر خارجية، وإدارة إصدارات الحزم كذلك. تبرز أهمية هذه المكتبة في كونها تتيح عملية إنشاء حزم بايثون قابلة للتثبيت بسهولة وتعرف في العادة باسم "بيضة" (Egg) أو "عجلة" (Wheel). هذه الأخيرة تتضمن جميع الملفات اللازمة لتشغيل الكود، مثل ملفات المصدر، والوثائق، والاختبارات، وملفات البيانات بحيث تسهل نشر حزم بايثون على مستودعات مثل PyPI وهو عبارة عن (مؤشر بايثون للبرامج) أو Anaconda Cloud. ومن أهم ميزات هذه المكتبة أن لديها دعما واسعا لكونها تدعم جميع أنظمة التشغيل الرئيسية، مثل Windows و macOS و Linux، كذلك بالنسبة لسهولة الاستخدام فلديها واجهة برمجة تطبيقات بسيطة وسهلة الاستخدام. والنقطة الأهم تكمن في قابلية التوسع أين يمكن توسيع مكتبة packaging باستخدام أدوات خارجية مثل setuptools و Poetry.
  18. لأشرح الأمر سأقدم لك مثالا لتشفير أكواد ال HTML و CSS باستخدام Base64 و Hex، أولا نقوم بانشاء ملف CSS يحتوي على النصوص المشفرة، ثم ربطه بصفحة HTML لعرضها. هذا كود ال Html: <!DOCTYPE html> <html> <head> <title>تشفير</title> <link rel="stylesheet" type="text/css" href="encoded.css"> </head> <body> <div class="encoded-text"> <p id="rights"> محتوى </p> </div> </body> </html> والآن يجب إنشاء ملف CSS المشفر encoded.css: /* ملف CSS المشفر */ .encoded-text:before { /* النص المشفر بواسطة Base64 */ content: "2KfZhNmH2YbYsA=="; /* النص المشفر بواسطة Hex */ content: attr(data-hex); } /* إلغاء عرض النص الأصلي */ #rights { display: none; } يمكنك استخدام أي موقع أو أداة لتشفير النصوص.
  19. في المقام الأول، يعتبر Next.js أساسا لتطوير واجهات المستخدم، وهو يركز بشكل أساسي على الفرونت أند لهذا ليس من الضروري بالضرورة أن تتعلم مهارات الـ Mongoose و Express.js إذا كنت ترغب بالتمركز على الجزء الأمامي فقط، لكن برأيي أن زيادة الخير خيرين في حال ما تعلمتهما، لأن فهم بعض المفاهيم الأساسية للـباكند لأنه يمكن أن يكون مفيدا خاصة لفهم كيف يسير الكود في حال كنت تعمل مع فريق، حتى تفهم كيفية تفاعل الجزء الأمامي مع الخوادم وقواعد البيانات. ولكن يمكنك تجنب التفصيلات العميقة لـ Mongoose و Express.js إذا لم تكن تخطط للعمل في مجال تطوير الخوادم كما أشرت. أما بالنسبة لبحثك عن مشاريع باستخدام Next.js، فهناك العديد من الفرص الممكنة دون الحاجة إلى الباكند، بالنسبة لـ NextAuth، فهي أداة تستخدم لإضافة ميزات المصادقة والتسجيل داخل التطبيق. يمكنك استخدامها في مشروعك دون الحاجة إلى كتابة باكند بنفسك حيث أنها تدعم العديد من مزودي خدمات المصادقة الشهيرة مثل Google و Facebook و GitHub وغيرها.
  20. لتشفير حقوق التصميم في ملفات HTML وCSS، يمكنك استخدام تقنيات مختلفة لجعل الكود أكثر صعوبة في القراءة والتعديل، لكن يجب أن تعلم أنه لا يمكن تشفير هذه الملفات بالكامل بطريقة تمنع القراءة أو التعديل بشكل نهائي، لأن المتصفحات تحتاج إلى قراءة الكود لعرض الموقع بشكل صحيح. لهذا لتشفير النصوص باستخدام Base64 في HTML، يمكن عمله بهذا الشكل: <!-- قبل التشفير --> <div> حقوق التصميم محفوظة </div> <!-- بعد التشفير --> <div> data:text/plain;base64,aHDEs9mE2YjYp9mE2KfYqSDZhdmGINin2YTYudmK2YQ= </div> وبالنسبة لتشفير CSS باستخدام Hex encoding، يمكن عمله بهذا الشكل: /* قبل التشفير */ .selector { content: "حقوق التصميم محفوظة"; } /* بعد التشفير */ .selector { content: "\062D\0642\0648\0642 \0627\0644\062A\0635\0645\064A\0645 \0645\062D\0641\0648\0638\0629"; } لكن يجب أن تعلم بأن هذه الطرق تزيد من صعوبة قراءة الكود لكنها لا تمنع التعديل بشكل كامل، لأنه يمكن لأي شخص لديه المعرفة الكافية بتقنيات الويب والتشفير أن يقوم بفك التشفير وتعديل الكود. توجد طرق أخرى في مجال التشفير تعتبر بدائل لتشفير Base64 من بينها: تشفير AES (Advanced Encryption Standard): وهو معيار تشفير يستخدم في العديد من التطبيقات والبروتوكولات الأمنية. تشفير RSA: يستخدم نظام مفتاح عام وخاص لتأمين البيانات، وهو شائع في تبادل المفاتيح والتوقيعات الرقمية. تشفير ECC (Elliptic Curve Cryptography): يوفر مستوى أمان مماثل لـ RSA ولكن بمفاتيح أصغر حجما. تشفير Blowfish و Twofish: وهي عبارة عن خوارزميات تشفير بمفتاح متماثل تستخدم لتأمين البيانات. كل هذه الخوارزميات توفر مستويات مختلفة من الأمان ويمكن استخدامها بطرق متنوعة حسب حاجتنا لها. ستجد المزيد من المعلومات القيمة في هذه المقالة:
  21. العرض يبدو لي جيدا، لكن يمكنك تحسينه من الناحية اللغوية وترتيب الأفكار وتناسقها، مثلا: "السلام عليكم أستاذ أحمد، لقد قرأت تفاصيل المشروع وفهمتها، يمكنني مساعدتك بإنجازه باستخدام التقنيات التالية: HTML، CSS، وJS، سأبني لك موقعا تعريفيا متجاوبا مع جميع أحجام الشاشات، وسريعا في التصفح مع تأثيرات animation لتوفير تجربة مستخدم ممتازة، سأقوم بربط الموقع بواتساب لتيسير التواصل معك ومع العملاء بكل يسر وفعالية. أنا هنا للإجابة على أي استفسارات تتعلق بالمشروع، ويسعدني البدء في العمل معك. بانتظار ردك، شكرا لك." لكن يجب أن أنوه بأن الأمر ليس سحريا، فهو متعلق بعوامل كثير كما أجبت في الإجابة السابقة، لهذا ينبغي أن لا تيأس وأن تتقدم للمشاريع التي تراها مناسبة لك وأن تهتم أيضا بمعرض أعمالك، تحياتي.
  22. فهمت أنك تريد الانتقال بين حقول متعددة ديناميكيا، ثم الانتظار عند حقل الشهر لحين الدّوس على زر Tab للانتقال إلى حقل العام، الجنس وهكذا! أرجو الإشارة في حالة لم يكن هذا ما كنت تقصده. لتطبيق ذلك، يمكننا البدء باستخدام JavaScript مثلا عبر استخدام الأحداث للتفاعل مع العناصر في واجهة المستخدم والتحكم في التنقل بين الحقول، بهذا الشكل: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Registration Form</title> </head> <body> <form id="registrationForm"> <!-- حقول التسجيل --> <label for="email">Email:</label> <input type="email" id="email" name="email" required><br><br> <label for="phone">Phone:</label> <input type="tel" id="phone" name="phone" required><br><br> <label for="day">Day:</label> <input type="text" id="day" name="day" required><br><br> <label for="month">Month:</label> <input type="text" id="month" name="month" required><br><br> <label for="year">Year:</label> <input type="text" id="year" name="year" required><br><br> <button type="submit">Submit</button> </form> <script> // عندما يتم فقدان التركيز عن حقل البريد، التركيز على حقل الهاتف document.getElementById('email').addEventListener('blur', function() { document.getElementById('phone').focus(); }); // عندما يتم فقدان التركيز عن حقل الهاتف، التركيز على حقل اليوم document.getElementById('phone').addEventListener('blur', function() { document.getElementById('day').focus(); }); // عندما يتم فقدان التركيز عن حقل اليوم، التركيز على حقل الشهر document.getElementById('day').addEventListener('blur', function() { document.getElementById('month').focus(); }); // عندما يتم فقدان التركيز عن حقل الشهر، التركيز على حقل السنة document.getElementById('month').addEventListener('blur', function() { // انتظار الضغط على "Tab" للانتقال إلى السنة document.getElementById('year').addEventListener('keydown', function(event) { if (event.key === 'Tab') { event.preventDefault(); // تجنب التحرك التلقائي إلى الحقل التالي document.getElementById('year').focus(); // التركيز على حقل السنة } }); }); </script> </body> </html> الكود الذي أرفقته أعلاه يقدم نموذج تسجيل بسيط يحتوي على حقول لإدخال البريد الإلكتروني، رقم الهاتف، وتاريخ الميلاد (اليوم، الشهر، السنة)، بحيث ينتقل من حقل الهاتف إلى حقل البريد، ثم إلى حقل اليوم، ومن ثم إلى حقل الشهر، وأخيرا إلى حقل السنة بعد الضغط فقط على زر "Tab". باستخدام الجافا سكريبت بحيث حينما: يتم فقدان التركيز عن حقل البريد الإلكتروني، ينتقل التركيز تلقائيا إلى حقل رقم الهاتف. وعندما يتم فقدانه عن حقل رقم الهاتف، ينتقل تلقائيا إلى حقل اليوم ثم إلى الشهر. وعندما يتم فقدانه عن حقل الشهر ينتظر الضغط على الزر.
  23. تقديم العروض على مختلف المشاريع البرمجية على منصة مستقل يعتمد على أساس كل مشروع على حدى، أي أن لكل مشروع وطريقة التقدّم إليه، بصراحة هذا الأمر يزداد تعقيدا لأن المشكلة ليست في طريقة التقديم فقط، بل في طبيعة العميل صاحب المشروع فليس كل العملاء لهم نفس التفكير ونفس الأهداف كي نضبط إيقاعا موحّدا للتقدّم على مشاريعهم. لهذا سأخبرك بطريقتي الشخصية لعلها تنفعك، أحاول مع رؤية كل مشروع تم فتحه أن أقرأ جميع التفاصيل ووصف المشروع وأحلله، فإن كنت قادرا على الإنجاز، انتقلت إلى الخطوة التالية. وهي رؤية ما إذا كان هنالك العديد من العروض التي تم التقديم عليها، في الغالب لا أتقدم على المشاريع التي فاقت التقديم عليها بعشرة عروض لأن احتمال الوصول إلى عرضي سيكون ضئيلا، فمن النادر أن تجد من يتفاوض مع أكثر من 10 ولا يجد من ينجز له المشروع إلا نادرا، وهذا لأني أحاول أ، أحتفظ بعدد التقديمات المحدودة التي لدي. بعدها، أنتقي الكلمات المناسبة وأكون خفيفا ظريفا، لا أبالغ ولا أكذب، ولا أطيل ولا أقصّر، فيكون العرض في حدود الميزانية ولا يفوق المتوسط، ومن جهة أشير إلى إمكانية تقديمي لنماذج عمل جاهزة، أو اختبار تقييمي، أو الإشارة إلى وجود معرض أعمال خاص بي، هكذا يمكن أن تلفت انتباه العميل إليك فيقوم بالتفاوض معك. في حالة ما قام بالتواصل معك ستظهر معلوماته الشخصية ومشاريعه المفتوحة والمنجزة، ومعلومات تتعلق بمعدل التوظيف، الكثيرون يقومون بتحليلها ومن هناك يعرفون إن كانت العميل جادّا في مشروعه أم لا، أتمنى أن أكون قد أفدتك، بالتوفيق.
  24. المشكلة حسب الصورة التي أرفقتها تكمن في أن المتغير `notes` ليس مصفوفة بشكل صحيح، وبالتالي لا يمكن استخدام الميثود `map` عليه. للتحقق من ذلك، يمكنك إضافة بعض التحققات في الكود للتأكد من أن `notes` هو مصفوفة قبل استخدام `map` عليها، يمكنك فعل ذلك عن طريق إضافة شرط قبل استخدام `map` كما يلي: <NoteList> {Array.isArray(notes) && notes.map((note) => ( <NoteItems key={note.id} title={note.title} noteClicked={() => selectedNoteHandler(note.id)} active={selectedNote === note.id} /> ))} </NoteList> وهكذا سيتأكد أن `notes` فعلا مصفوفة قبل استخدام `map`، وإلا فسيتم تجاهل استخدام `map`، وهذا سيمنع ظهور الخطأ `map is not a function` في حال كان `notes` ليس مصفوفة. أرجو رفع ملفات المشروع كاملة، كي أساعدك على حل المشكلة بشكل صحيح.
  25. حسنا، سأحاول شرح المسؤولية، ودورها، بداية مدير الموقع الإلكتروني يعتبر الشخص المسؤول الرئيسي عن تنظيم وإدارة كافة جوانب عمل الموقع. بحيث يتولى هذا الدور مجموعة واسعة من المسؤوليات التي تهدف إلى ضمان سلامة وفاعلية العمليات على الموقع، يشمل ذلك مراقبة أداء الموقع بانتظام لضمان عمله السلس والصحيح، بالإضافة إلى تحليل أدائه واتخاذ الإجراءات الضرورية لتحسينه. كما يتولى معالجة مشاكل المستخدمين وإصلاح الأعطال التقنية بسرعة وفعالية، بالإضافة إلى تحديث محتوى الموقع وتنظيمه بانتظام لضمان جاذبيته وملاءمته لاحتياجات الجمهور المستهدف. ومن أجل حماية المعلومات والبيانات، يقوم المدير أيضا بمراجعة وتعزيز إجراءات الأمان على الموقع. ويضمن توافق الموقع مع مختلف المتصفحات والأجهزة ويعمل على تحسين أدائه وتجربة المستخدم عبر استجابة لملاحظات واحتياجات المستخدمين وتقديم الدعم الفني والمساعدة اللازمة.
×
×
  • أضف...