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

لوحة المتصدرين

  1. Omer Amad

    Omer Amad

    الأعضاء


    • نقاط

      12

    • المساهمات

      191


  2. Ail Ahmed

    Ail Ahmed

    الأعضاء


    • نقاط

      5

    • المساهمات

      1202


  3. سمير عبود

    سمير عبود

    الأعضاء


    • نقاط

      5

    • المساهمات

      3552


  4. ياسر مسكين

    ياسر مسكين

    الأعضاء


    • نقاط

      5

    • المساهمات

      1071


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 08/13/24 في كل الموقع

  1. السلام عليكم كيف ادمج بين ملفين من البيانات بلغه باثيون الاستخدم في مجال تعلم الاله ؟ مثلان انا عندي الملفين دول ازي اخلهم ملف واحد heart_disease.csv Heart_Disease_Prediction.csv والا مش شرط ادمج مابينهم ؟
    2 نقاط
  2. السلام عليكم ورحمة الله وبركاته انا احتاج الى موقع يقدم خدمة الاستبيان مثل google Forms (نماذج قوقل) فيه لوحة تحكم تظهر ويمكن تصدير المدخلات الى ملف اكسل ويمكن إضافة فلتر بحث(قائمة منسدلة) بالمعلومات في شرح تنصحوني اتابعه
    2 نقاط
  3. السلام عليكم اقوم بانشاء تطبيق عباره عن اخذ فديوهات بودكاست متنوعه من قنوات يوتيوب مختلفه ووضعها في تطبيق و عرضها فقط دون تنزيل او اي شئ هل هذه ملحوظه الفديوهات ليس لدي حقوق ملكيه لها هل جوجل بلاي تقبل مثل هذه التطبيقات
    2 نقاط
  4. عملت نفس الخطوات ولكن لم يتشكل معي package.json ماعرفت شو السبب ؟؟؟؟
    2 نقاط
  5. قمت برفع الأربع مشروعات المطلوبة بمسار دورة تطوير التطبيقات باستخدام JavaScript https://github.com/abdulrahmanalmalki/Hsoub-academy-projects/tree/main/JavaScript path/Chat_App https://github.com/abdulrahmanalmalki/Hsoub-academy-projects/tree/main/JavaScript path/event-booking-app https://github.com/abdulrahmanalmalki/Hsoub-academy-projects/tree/main/JavaScript path/mydoctor https://github.com/abdulrahmanalmalki/Hsoub-academy-projects/tree/main/JavaScript path/todo-list و أرغب بتحديد موعد للاختبار في أسرع وقت ممكن اذ ان اجتياز الاختبار و الحصول على شهادة الدورة من المتطلبات الاساسية للحصول على شهادتي الجامعية و انا في أمس الحاجة لدخول الاختبار قبل نهاية الأسبوع الحالي
    2 نقاط
  6. شكرا جزيلا تمت عملية register بنجاح ولكن ظهرت لي مشكلة في login لم افهم السبب؟ fin_pr.zip
    2 نقاط
  7. تمام جدا جدا الف شكراا لحضرتك بس سوال هل ممكن استخدمهم كده من غير ما ادمجهم صح ؟
    2 نقاط
  8. كيفكم يا أصدقاء... لديه هذا الكود بدي يختفي لما يتم اختيار ذكر.... ولما يتم اختيار أنثى بدي يختفي.... اسم عامود الجنس هو Y1 <img src="<?php echo $imagePath; ?>" alt="Profile Picture" style="width: 100px;"><br> <input type="file" name="new_image" accept="image/*"><br>
    1 نقطة
  9. <?php session_start(); if (isset($_SESSION['id']) && isset($_SESSION['fname'])) { if(isset($_POST['fname']) && isset($_POST['uname'])){ include "../db_conn.php"; $fname = $_POST['fname']; $uname = $_POST['uname']; $old_pp = $_POST['old_pp']; $id = $_SESSION['id']; if (empty($fname)) { $em = "Full name is required"; header("Location: ../edit.php?error=$em"); exit; }else if(empty($uname)){ $em = "User name is required"; header("Location: ../edit.php?error=$em"); exit; }else { if (isset($_FILES['pp']['name']) AND !empty($_FILES['pp']['name'])) { $img_name = $_FILES['pp']['name']; $tmp_name = $_FILES['pp']['tmp_name']; $error = $_FILES['pp']['error']; if($error === 0){ $img_ex = pathinfo($img_name, PATHINFO_EXTENSION); $img_ex_to_lc = strtolower($img_ex); $allowed_exs = array('jpg', 'jpeg', 'png'); if(in_array($img_ex_to_lc, $allowed_exs)){ $new_img_name = uniqid($uname, true).'.'.$img_ex_to_lc; $img_upload_path = '../upload/'.$new_img_name; // Delete old profile pic $old_pp_des = "../upload/$old_pp"; if(unlink($old_pp_des)){ // just deleted move_uploaded_file($tmp_name, $img_upload_path); }else { // error or already deleted move_uploaded_file($tmp_name, $img_upload_path); } // update the Database $sql = "UPDATE users SET fname=?, username=?, pp=? WHERE id=?"; $stmt = $conn->prepare($sql); $stmt->execute([$fname, $uname, $new_img_name, $id]); $_SESSION['fname'] = $fname; header("Location: ../edit.php?success=Your account has been updated successfully"); exit; }else { $em = "You can't upload files of this type"; header("Location: ../edit.php?error=$em&$data"); exit; } }else { $em = "unknown error occurred!"; header("Location: ../edit.php?error=$em&$data"); exit; } }else { $sql = "UPDATE users SET fname=?, username=? WHERE id=?"; $stmt = $conn->prepare($sql); $stmt->execute([$fname, $uname, $id]); header("Location: ../edit.php?success=Your account has been updated successfully"); exit; } } }else { header("Location: ../edit.php?error=error"); exit; } }else { header("Location: login.php"); exit; } <?php session_start(); if (isset($_SESSION['id']) && isset($_SESSION['fname'])) { include "db_conn.php"; include 'php/User.php'; $user = getUserById($_SESSION['id'], $conn); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Edit Profile</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> <link rel="stylesheet" type="text/css" href="css/style.css"> </head> <body> <?php if ($user) { ?> <div class="d-flex justify-content-center align-items-center vh-100"> <form class="shadow w-450 p-3" action="php/edit.php" method="post" enctype="multipart/form-data"> <h4 class="display-4 fs-1">Edit Profile</h4><br> <!-- error --> <?php if(isset($_GET['error'])){ ?> <div class="alert alert-danger" role="alert"> <?php echo $_GET['error']; ?> </div> <?php } ?> <!-- success --> <?php if(isset($_GET['success'])){ ?> <div class="alert alert-success" role="alert"> <?php echo $_GET['success']; ?> </div> <?php } ?> <div class="mb-3"> <label class="form-label">Full Name</label> <input type="text" class="form-control" name="fname" value="<?php echo $user['fname']?>"> </div> <div class="mb-3"> <label class="form-label">User name</label> <input type="text" class="form-control" name="uname" value="<?php echo $user['username']?>"> </div> <div class="mb-3"> <label class="form-label">Profile Picture</label> <input type="file" class="form-control" name="pp"> <img src="upload/<?=$user['pp']?>" class="rounded-circle" style="width: 70px"> <input type="text" hidden="hidden" name="old_pp" value="<?=$user['pp']?>" > </div> <button type="submit" class="btn btn-primary">Update</button> <a href="home.php" class="link-secondary">Home</a> </form> </div> <?php }else{ header("Location: home.php"); exit; } ?> </body> </html> <?php }else { header("Location: login.php"); exit; } ?> كيفكم يا اصدقاء فيه عندي هذا الكود ممكن حدا يفهمنا ويقدر يفصل بين كود تسجيل الدخول وكود تعديل البيانات بدي استخرج كود تعديل البيانات من هون ومش عارف وبدي اعرف اين اسماء الاعمدة يلي بدي اضعها في الكود
    1 نقطة
  10. واين ينتهي لو سمحت اين اضع ال form وال input كيف ستكون اسماء الاعمده هي d1 / d2 / d3 صفحة updet ماهو الكود الذي سيكون فيها صفحة ال edit ماهو الكود الذي سيكون فيها انا لديه بيانات نصية ايضا ليس فقط صور ارجو الشرح
    1 نقطة
  11. صحيح جزء ملف التعديل مثلا يبدأ من هنا: <?php // في ملف update_profile.php if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['new_image'])) {
    1 نقطة
  12. سيكون لديه صفحتين php.... صفحة updata.php وصفحة edit.php.... صح؟ لو كان لديه 3 اعمده فيها صور كيف سيكون اين اضع اسماء الاعمده
    1 نقطة
  13. بالطبع لا مشكلة، سأقدم نموذجا لكل جزئية بما يقابلها من شيفرة لتفهم أفضل ثم يمكنك ربط الأفكار بناء على مشروعك الخاص، أولا بالنسبة لاسترجاع معلومات المستخدم فهذه الدالة تسترجع معلومات المستخدم، بما في ذلك امتداد الصورة من قاعدة البيانات الذي يجب أن يكون مخزنا في إحدى الأعمدة في قاعدة البيانات فقد استخدمت image_extension هنا في المثال وهو عمود مفترض في جدول users في قاعدة البيانات أين يخزن امتداد ملف الصورة الخاص بكل مستخدم. function getUserInfo($userId, $conn) { $sql = "SELECT id, username, image_extension FROM users WHERE id = ?"; $stmt = $conn->prepare($sql); $stmt->execute([$userId]); return $stmt->fetch(PDO::FETCH_ASSOC); } بالنسبة لبناء مسار الصورة هنا نبني المسار باستخدام معرف المستخدم والامتداد المخزن في قاعدة البيانات كما قلنا سابقا كالتالي: $imagePath = "k4/" . $userInfo['id'] . "." . $userInfo['image_extension']; أما هذا النموذج فيعرض الصورة الحالية ويسمح بتحميل صورة جديدة بحيث يتحقق من وجود صورة جديدة مُحمّلة ويعالجها. if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['new_image'])) { $userId = $_SESSION['user_id']; $currentExtension = $_POST['current_extension']; $newImage = $_FILES['new_image']; if ($newImage['error'] == 0) { $newExtension = pathinfo($newImage['name'], PATHINFO_EXTENSION); $newPath = "k4/" . $userId . "." . $newExtension; // حذف الصورة القديمة إذا كانت موجودة $oldPath = "k4/" . $userId . "." . $currentExtension; if (file_exists($oldPath)) { unlink($oldPath); } // حفظ الصورة الجديدة move_uploaded_file($newImage['tmp_name'], $newPath); // تحديث الامتداد في قاعدة البيانات $sql = "UPDATE users SET image_extension = ? WHERE id = ?"; $stmt = $conn->prepare($sql); $stmt->execute([$newExtension, $userId]); echo "Profile picture updated successfully."; } else { echo "Error uploading new image."; } } ثم هنا نقوم بتحديث الصورة وقاعدة البيانات: move_uploaded_file($newImage['tmp_name'], $newPath); $sql = "UPDATE users SET image_extension = ? WHERE id = ?"; $stmt = $conn->prepare($sql); $stmt->execute([$newExtension, $userId]);
    1 نقطة
  14. لو سمحت تكتبلي الكود ك مثال لهذه الفقرة
    1 نقطة
  15. بما أن الصور محفوظة في ذلك المجلد، فأكيد أنه يوجد عمود يحتوي على امتداد الصورة لذا لجلب الصورة من المجلد k4 يجب استخدام معرف المستخدم كاسم للملف ثم نقوم بجلب امتداد الصورة من قاعدة البيانات مع بناء مسار الصورة كالتالي: "k4/[user_id].[image_extension]" ثم لعرض الصورة في نموذج التعديل، استخدم المسار الذي بنيته وعند التعديل، يمكنك استخدام هذه المعلومات للوصول إلى الصورة الحالية وتحديثها إذا لزم الأمر.
    1 نقطة
  16. طيب لوفرضنا الصور موجودة في مجلد اسمه k4... كيف نقدر يجلب الصوره من الملف... و يجلب امتداد الصوره من قاعدة بيانات لغرض التعديل
    1 نقطة
  17. حسنا، لنبدأ بكود تسجيل الدخول أولا وهو الذي حسب تصفحي له ففي البداية فهو يقوم بالتحقق من وجود جلسة نشطة للمستخدم: <?php session_start(); if (isset($_SESSION['id']) && isset($_SESSION['fname'])) { // باقي الكود هنا } else { header("Location: login.php"); exit; } أما الجزء الرئيسي لتعديل البيانات فيبدأ بعد التحقق من وجود البيانات المرسلة وهو كالتالي: if(isset($_POST['fname']) && isset($_POST['uname'])){ include "../db_conn.php"; $fname = $_POST['fname']; $uname = $_POST['uname']; $old_pp = $_POST['old_pp']; $id = $_SESSION['id']; // التحقق من البيانات وتحديثها // ... } أما بخصوص أسماء الأعمدة المستخدمة في قاعدة البيانات فهي على النحو التالي: id: معرف المستخدم fname: الاسم الكامل username: اسم المستخدم pp: صورة الملف الشخصي فالكود يقوم بتحديث هذه البيانات في جدول users في قاعدة البيانات أما بخصوص تحديث البيانات بدون تغيير الصورة فهذا الجزء هو الذي يقوم بهذا الأمر: $sql = "UPDATE users SET fname=?, username=? WHERE id=?"; $stmt = $conn->prepare($sql); $stmt->execute([$fname, $uname, $id]); أما الجزء الذي يقوم بتحديث البيانات مع تغيير الصورة: $sql = "UPDATE users SET fname=?, username=?, pp=? WHERE id=?"; $stmt = $conn->prepare($sql); $stmt->execute([$fname, $uname, $new_img_name, $id]); فالكود يتحقق من وجود ملف صورة جديد، ويقوم بتحميله وحذف الصورة القديمة إذا وجدت. أما لاستخراج كود تعديل البيانات، يمكنك استخدام الجزء الذي يبدأ من: if(isset($_POST['fname']) && isset($_POST['uname'])){ وينتهي قبل القوس } الأخير في الملف.
    1 نقطة
  18. طالما قمت بإنهاء 4 مسارات على الأقل، ورفعت المشاريع العملية تستطيع التقدم للإختبار، عليك التحدث لمركز المساعدة لكن عليك ذكر أنك في حاجة للإختبار في أقرب وقت أي إرسال نفس الرسالة وسيتم الرد عليك بخصوص ذلك، لكن غالبًا الأمر ليس ممكن، للسبب التالي: ستحتاج إلى الإنتظار لبعض الوقت لحين مراجعة المشاريع وسيتم الرد عليك، وتحديد موعد لإجراء مقابلة، وبها يتم: إجراء محادثة صوتيّة لمدة 30 دقيقة يطرح المدرّب عليك أسئلة متعلّقة بالدورة والأمور التي نفّذتها خلالها. يحدد لك المدرّب مشروعًا مرتبطًا بما قمت به أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع إلى أسبوعين. إجراء محادثة صوتيّة أخرى لمدّة 30 دقيقة يناقش بها مشروعك وما نفذته وتطرح أسئلة خلالها. إن سارت على جميع الخطوات السابقة بشكل صحيح، تحصل على الشهادة أو يرشدك المدرّب لأماكن القصور ويطلب منك تداركها ثم التواصل معنا من جديد.
    1 نقطة
  19. هذا الخطأ يشير أنه عند الإتصال لا يوجد رابط قاعدة بيانات للإتصال بها في الدالة ()mongoose.connect من الممكن أن يكون السبب أنه تقومي بتشغيل ملف app.js عن طريق nodemon ولا يتم قراء المتغيرات من الملف env. بصورة صحيحة mongoose.connect(process.env.DB_URL) لذا قومي بتشغيل المشروع من خلال الملف bin\www كالأتي nodemon ./bin/www وإذا لم يكن nodemon مثبت يمكنك تثبيته علي الجهاز كالأتي npm install -g nodemon ثم التشغيل من جديد nodemon ./bin/www وسيعمل الخادم معك. ويمكنك وضع سكربت في في ملف package.json وتعديل هذا الأمر "scripts": { "start": "node ./bin/www" }, ليصبح كالأتي "scripts": { "start": "nodemon ./bin/www" }, وتشغيل المشروع عبر الأمر npm start
    1 نقطة
  20. كيفكم ياصدقاء لديه صفحة تعديل فيها form ولديه هذا input بدي يعرضلي الصورة الموجدة في قاعدة البيانات والمخزونة في مجلد folder اسمه hg .....بدي تظهر الصورة كما موضح في الشكل <input type="file" name="fil" id="file" required style="display: value='<?php echo $row['fil']; ?>'">
    1 نقطة
  21. يُمكنك إستخدام الدالة unlink في php لحذف أي ملف، وتمرير مسار الملف الذي تريد حذفه كوسيط أول للدالة.
    1 نقطة
  22. ايوه... انا غيرت كود الاستعلام... كيف حذف الصوره لكي لاتتكدس الصور؟
    1 نقطة
  23. نعم بإمكانك ذلك، لكن ستنسخ بعض الأكواد فقط جزء التحقق من المدخلات و التي من بينها الصورة، أما الإستعلام سيتغير لأنك في هذه الحالة ستقوم بإستعلام تعديل أيضاً قد تحتاج إلى حذف الصورة السابقة في حالة تعديل الصورة كي لا تتكدس الصور لديك في مجلد التخزين بدون حاجة لها
    1 نقطة
  24. طيب... لو سمحت انا لديه فورم ارسال البيانات في ملف index.... ولديه بعض شررط الخاصة ب ارسال الصور مثلاً نوع الصوره وحجمها... هل يمكنني نقل كود الشروط ووضعها مع كود الخاص ب ارسال التعديل؟
    1 نقطة
  25. اريد فهم هذه النقطه لاني لم استطع استيعابها: اولا تعلمت لغه html,وcss واصمم بها اشكال ومواقع صغيرة تصميم فقط الان ادرس php كمبتدي اي ليس لدي خلفيه شاملة عنها طلب مني انشاء مكتبه الكترونية مقروءة وصوتيه قمت بتصميمها بhtml,css,js السوال: اولا هل هناك فرق بين التصميم وقواعد البيانات ثانيا كيف يمكنني استخدام php في مشروعي ثالثا هل هناك اختلاف جوهري بين هذه اللغات ككل وبشكل عام ماهي وظيفه php هنا؟
    1 نقطة
  26. بالنسبة لمشروعك يمكنك إستخدام PHP حيث تعمل على الخادم وتستخدم بشكل رئيسي للتفاعل مع قواعد البيانات وإنشاء صفحات ويب ديناميكية. في مشروعك، يمكنك استخدام PHP بدلا من استخدام HTML ثابت، يمكنك استخدام PHP لجعل صفحات الويب تتفاعل مع قاعدة البيانات، مثل عرض قائمة الكتب أو تشغيل ملفات الصوت بناء على طلب المستخدم، و أيضا يمكنك استخدام PHP للتواصل مع قاعدة البيانات، مثل إضافة كتب جديدة أو استرداد معلومات كتاب معين. بالنسبة للإختلاف نعم هناك اختلافات جوهرية بين هذه اللغات مثل HTML, CSS, JavaScript تعمل على الجانب الأمامي للبنية، CSS للتصميم والتنسيق، وJavaScript لإضافة التفاعل. بينما تعمل PHP على الجانب الخلفي و تستخدم لمعالجة البيانات وتوليد المحتوى الديناميكي والتواصل مع قواعد البيانات، حيث مثلا إذا أراد المستخدم البحث عن كتاب معين في مكتبتك الإلكترونية، سيقوم بإدخال اسم الكتاب في نموذج بحث، باستخدام PHP ستقوم بكتابة كود يتصل بقاعدة البيانات للبحث عن الكتب المتوافقة مع اسم الكتاب المدخل، ثم تعرض النتائج باستخدام HTML.
    1 نقطة
  27. إذا كان قصدك الخاصية alt و القيمة التي وضعتها فهي قيمة إختيارية فقط، أما الخاصية فهي تعني النص البديل وهذا النص يظهر في حالة تعذر الوصول إلى الصورة.
    1 نقطة
  28. لا يمكنك وضع الصورة من خلال حقل file عليك وضعها من خلال عُنصر الصورة (img) أي أن كود php ستضعه من خلال الخاصية src في عُنصر الصورة (img)، يعني ستقوم بتعديل التالي: <img width="180" height="150" src="https://placehold.co/180x150" alt="image preview" id="preview"> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ بوضع مسار الصورة عن طريق php: <img width="180" height="150" src="<?php echo 'مسار الصورة' ?>" alt="image preview" id="preview"> أنا لا أعلم إسم الحقل الذي تخزن فيه مسار الصورة ولا كيف تقوم بتخزينها لكن أنت ملم بهذه المعطيات، فقط ستُعدل على ال 'مسار الصورة' بما يوافقها بعد جلبك للبيانات.
    1 نقطة
  29. لماذا لمم تستخدم كودد php لغرض جللب اللبيانات style="display: value='<?php echo $row['fil']; ?>'"
    1 نقطة
  30. لا يُمكنك وضع القيمة من خلال حقل الإدخال (input file) مباشرةً، تحتاج إلى إضافة عُنصر صورة (img) تحت الحقل file تعرض به الصورة من خلال المسار الخاص بها، ثم من خلال جافاسكربت يُمكنك إذا قام المستخدم بتغيير الصورة إلتقاط الحدث و التغيير على الصورة بحيث تظهر الجديدة التي اختارها، بعد ذلك إذا تم الضغط على زر التعديل ترسل الإستمارة إلى الخادم وتحفظ الصورة الجديدة: هنا شرح بسيط للعملية: <form action="" enctype="multipart/form-data"> <input type="file" id="file" name="file" accept="image/*" onchange="loadImage(event)"> <br><br> <img width="180" height="150" src="https://placehold.co/180x150" alt="image preview" id="preview"> </form> لاحظ العُنصر img (هو الذي نستخدمه لعرض الصورة، يُمكنك التعديل على الخاصية src بوضع مسار الصورة الخاصة بالسجل الذي تقوم بالتعديل عليه) أيضاً لاحظ عُنصر الإدخال استخدمنا الخاصية onchange لإلتقاط حدث التغيير وتنفيذ الدالة loadImage التي سنقوم بإنشائها عبر JavaScript: const loadImage = (event) => { const output = document.getElementById('preview'); output.src = URL.createObjectURL(event.target.files[0]); output.onload = function() { URL.revokeObjectURL(output.src) } } فقط نقوم بتحديد عُنصر الصورة من DOM ثم نُغير على الخاصية src بوضع الصورة الجديدة. المثال موجود على CodePen من هنا، هذه الفكرة بإختصار يُمكنك التعديل عليها حسب الحالة وإضافة التنسيقات المناسبة لك.
    1 نقطة
  31. عند تشغيل المشروع بي nodemon تظهر لي هذه الرسالة C:\Users\HP\Downloads\fin_pr\node_modules\mongoose\lib\drivers\node-mongodb-native\connection.js:219 throw new MongooseError('The `uri` parameter to `openUri()` must be a ' + ^ MongooseError: The `uri` parameter to `openUri()` must be a string, got "undefined". Make sure the first parameter to `mongoose.connect()` or `mongoose.createConnection()` is a string. at NativeConnection.createClient (C:\Users\HP\Downloads\fin_pr\node_modules\mongoose\lib\drivers\node-mongodb-native\connection.js:219:11) at NativeConnection.openUri (C:\Users\HP\Downloads\fin_pr\node_modules\mongoose\lib\connection.js:823:34) at Mongoose.connect (C:\Users\HP\Downloads\fin_pr\node_modules\mongoose\lib\mongoose.js:448:15) at Object.<anonymous> (C:\Users\HP\Downloads\fin_pr\app.js:22:10) at Module._compile (node:internal/modules/cjs/loader:1358:14) at Module._extensions..js (node:internal/modules/cjs/loader:1416:10) at Module.load (node:internal/modules/cjs/loader:1208:32) at Module._load (node:internal/modules/cjs/loader:1024:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12) at node:internal/main/run_main_module:28:49 Node.js v20.14.0 وكانه يوجد خطا في قاعدة البيانات ولكن لم افهم السبب؟ fin_pr.zip
    1 نقطة
  32. الصورة من بوست مان تشير أن الخادم لا يعمل قومي بتشغيله عن طريق الأمر npm start ويوجد مشكلة في ملف routes\auth.js حيث كل المسارات توجه إلى المتحكم login router.post('/login', authController.login) ^^^^^ router.post('/register', authController.login) ^^^^^ router.post('/logout', authController.login) ^^^^^ نقوم بالتعديل ليكن كل مسار يوجه للمتحكم الخاص به ليصبح كالأتي router.post('/login', authController.login) router.post('/register', authController.register) router.post('/logout', authController.logout) يوجد أيضا تكرار في ملف controllers\authcontoller.js للمتحكم register exports.register = async (req, res) => { try { const newUser = new User(req.body); await newUser.save(); res.status(201).json(newUser); } catch (err) { res.status(400).json({ error: err.message }); } } exports.register =async (req, res) => { res.json({ success:true }) }; نقوم بمسح المتحكم الثاني المكرر ليتم إنشاء المستخدم بصورة صحيحة. بعد هذه التعديلات قومي بعملية الحفظ للملفات عن طريق الضغط علي Ctrl + s في لوحة المفاتيح، وإعادة تشغيل الخادم من جديد عن طريق الأمر npm start ويمكنك إرسال الطلبات من بوست مان سيتم إنشاء المستخدم.
    1 نقطة
  33. نعم، يمكنك استخدام الملفات بدون دمجها في ملف واحد ففي مجال تعلم الآلة، يمكن تحميل البيانات من الملفات المختلفة والعمل عليها بشكل مستقل أو بشكل متكامل وفقا لاحتياجات كل مشروع لكن في النهاية سيتوجب عليك دمجهما في مرحلة معينة من مراحل التدريب لأنك ستعمل على تدريب نموذج بواسطة هاته الملفات فمن الطبيعي أن تتم عملية الدمج. وأعرض عليك فيما يلي بعض الطرق التي يمكنك استخدامها للعمل مع الملفات بدون دمجها: العمل على كل ملف بشكل منفصل: بحيث يمكنك تدريب نموذج على كل ملف بشكل مستقل أو استخدام البيانات من ملف واحد للتحليل والنمذجة. دمج البيانات أثناء التدريب: يمكن تحميل كل ملف على حدة والعمل عليهما معا أثناء عملية التدريب باستخدام دمج بيانات معين عند الحاجة، مثل دمج البيانات فقط في مرحلة معينة من التحليل أو النمذجة. تقديم البيانات من الملفات المختلفة إلى النموذج: في بعض الحالات، قد تقوم بتدريب النموذج باستخدام البيانات من الملفين بشكل متواز أو تستخدم أحد الملفات كمدخلات والآخر كإخراجات.
    1 نقطة
  34. هذا يعتمد على الاستعمال نفسه. في حال كنت تريد تدريب نموذج واحد فقط على كلا الملفين فيجب دمجهما. و هذا هو الاستعمال الشائع. في حال كان لديك استعمال آخر يمكنك ذكره حتى يمكنني إعطاءك جواب دقيق. تحياتي.
    1 نقطة
  35. مرحبًا، حتى يمكنك الحصول على بيانات من عدة مصادر (هنا ملفين مثلًا) فيجب أن تكون البيانات لها نفس الخصائص في كل المصادر أو تقوم بأخذ المشترك بينها حتى تتجنب الحصول على أعمدة فارغة كثيرة. في حالتك هذه و بإطلاع سريع على الملفين يبدو أن الملفين لهما نفس الأعمدة و لكن مع اختلاف بتسمية العمود بشكل بسيط، لذلك تكون الخطوة الأولى هي تحميل كل ملف على حدى و توحيد الأسماء، مثال بسيط هناك عمود اسمه ST slope في أحد الملفات و لكن في الملف الآخر اسمه Slope of ST، بالتالي وضوحًا يجب تعديل أحدهما إلى الآخر أو تعديل كليهما إلى اسم مشترك آخر. و هذا ينطبق على بقية الأعمدة، أما في حال وجود أعمدة غير مشتركة فيجب حذفها. أمر آخر يجب القيام به هو توحيد شكل القيم و نمطها، مثلًا في أحد الملفات كان يتم وضع قيم نصية للدلالة على أن الشخص معه مرض أم لا، بينما في الملف الآخر يتم وضع 0 أو 1، بالتالي عليك تحويل القيم النصية إلى 0 و 1 أيضًا. بعد القيام بهذه العمليات و بافتراض أنك قمت بذلك باستعمال Pandas و أصبح لديك غرضين DataFrame يمثلان البيانات و لكن مع أعمدة متوافقة في الاسم و النوع، يمكنك استعمال الدالة concat لدمجهما. تحياتي.
    1 نقطة
  36. ما قمتي به بمفردك مجهود جيد جدا من طريقة التقسيم والهيكلية للمجلدات وفصل كل شئ لكي تقوم كل مجموعة من الملفات بالقيام بشئ مخصص بها من أن يكون تعريف مجموعة النماذج في مجلد خاص بها والمسارات أيضا نفس الشئ. قمت بالإختبار لإنشاء مستخدم جديد في ملف models\user.js يبدو أنه نسيتي الإستيراد للحزمة bcrypt بالإضافة أنه وضعتي في تعريف النموذج أن يكون الاسم unique : true أي لا يتم تكرار نفس الاسم لأي مستخدم أخر في مجموعة المستخدمين ولكن الأفضل أن يتم تكرار الاسم لا مشكلة في ذلك فقط نريد الاميل أن يكون مميز وفريد غير قابل للتكرار ليكون ملف models\user.js نقوم بإضافة تعريف المكتبة أعلي الملف كالأتي ونمسح ,unique: true من الاسم const bcrypt = require('bcrypt'); أيضا عند عملية التسجيل نريد أن نضع مسار له ليصبح في ملف routes\users.js بداية سطر 10 كالأتي router.post('/register', async (req, res) => { try { const newUser = new User(req.body); await newUser.save(); res.status(201).json(newUser); } catch (err) { res.status(400).json({ error: err.message }); } }); لأنه سوف نقوم بعمل متحكم أخر لتسجيل الدخول بعد هذه التعديلات يمكنك إرسال طلب من برنامج بوست مات لتسجيل مستخدم جديد يكون نوع الطلب POST والمسار له. http://localhost:3000/api/users/register وجسم الطلب في بوست مان يكون كالأتي { "name": "mostafa", "email": "mostafa@gmail.com", "password": "123456", "role":"customer" } ستجدي أنه تم تسجيل مستخدم جديد بدون مشكلة يمكنك تجربة طريقة أفضل ولكن سنقوم ببعض التعديلات، الأفضل بدلا من تعريف المتحكم مباشرة بعد المسار يمكنك نقل كود المتحكم داخل المتحكم reigister بداخل ملف المتحكمات controllers\authcontoller.js ليصبح المتحكم register كالأتي exports.register = async (req, res) => { try { const newUser = new User(req.body); await newUser.save(); res.status(201).json(newUser); } catch (err) { res.status(400).json({ error: err.message }); } } إذا اخترتي الاستمرار في هذه الطريقة يمكنك المتابعة بعد ذلك في ملف routes\auth.js يوجد خطأ في التوجيه وكتبتي نقطة ( . )بدلا ( , ) وتم كتابة أسماء المتحكمات في كل الحالات login // مسارات التسجيل وتسجيل الدخول router.post('/login'.authController.login) ^ ^^^^^^ router.post('/register'.authController.login) ^ ^^^^^ router.post('/logout'.authController.login) ^ ^^^^^ نقوم بالتعديل ليصبح بهذا الشكل // مسارات التسجيل وتسجيل الدخول router.post('/login', authController.login) router.post('/register', authController.register) router.post('/logout', authController.logout) وفي ملف app.js نقوم بتعريف authRouter وطلب الملف const authRouter = require('./routes/auth'); ثم التوجيه له في سطر 27 بدلا من التوجيه إلي usersRouter نقوم بالتوجيه إلى authRouter كالأتي app.use('/api/users', authRouter); كلا الطريقتين متاحتين يمكنك إنشاء متحكمات منفصلة لكل مسار له متحكمات خاصة به أو بعد كتابة المسار كتابة كود المتحكم بصورة مباشرة كما في الطريقة الأولى. إذا واجهتك أي مشكلة أخرى يمكنك السؤال بها مع توضيحها بشكل مفصل لكي يتم مساعدتك بصورة أسرع وأفضل.
    1 نقطة
  37. دعنا نشرح الكود خطوخ خطوه الجزء الأول: جدول البيانات (HTML) <table> <thead> <tr> <th>Name</th> <th>Address</th> <th>Photo</th> <th>Action</th> </tr> </thead> <tbody> <?php // Fetch data from your database foreach ($rows as $row) { echo "<tr>"; echo "<td>{$row['name']}</td>"; echo "<td>{$row['address']}</td>"; echo "<td><img src='uploads/{$row['photo']}' width='100'></td>"; echo "<td><button class='edit-btn' data-id='{$row['id']}' data-name='{$row['name']}' data-address='{$row['address']}' data-photo='{$row['photo']}'>Edit</button></td>"; echo "</tr>"; } ?> </tbody> </table> جدول البيانات (<table>): يحتوي على جدول لعرض البيانات. العنوان (<thead>): يحتوي على صف العناوين للأعمدة: الاسم، العنوان، الصورة، والإجراء. الجسم (<tbody>): يحتوي على الصفوف التي يتم إنشاؤها باستخدام حلقة PHP. هذه الحلقة تمر عبر مصفوفة $rows التي تحتوي على بيانات من قاعدة البيانات. PHP Loop: يتم عرض كل صف من البيانات باستخدام foreach. يتم طباعة كل قيمة من القيم ضمن خلايا الجدول (<td>). يتم استخدام زر تحرير (Edit) مع بعض البيانات المخصصة التي ستمكنك من التعرف على العنصر عند الضغط عليه. الجزء الثاني: نموذج التعديل (HTML وCSS) <!-- Modal for editing --> <div id="editModal" style="display:none;"> <form id="editForm" method="POST" enctype="multipart/form-data"> <input type="hidden" name="id" id="edit-id"> <label for="edit-name">Name:</label> <input type="text" name="name" id="edit-name"> <label for="edit-address">Address:</label> <input type="text" name="address" id="edit-address"> <label for="edit-photo">Photo:</label> <input type="file" name="photo" id="edit-photo"> <img id="current-photo" src="" width="100"> <button type="submit" name="update">Update</button> </form> </div> النموذج (<div id="editModal">): نافذة منبثقة (modal) تظهر عند الحاجة لتعديل البيانات. في البداية تكون مخفية (display:none). نموذج التعديل (<form>): يحتوي على عناصر إدخال لتحديث البيانات: حقل مخفي (<input type="hidden">): لتخزين معرّف العنصر الذي سيتم تعديله. حقول الإدخال (<input type="text">): لاسم والعنوان. حقل رفع الصور (<input type="file">): لتحميل صورة جديدة. صورة الحالية (<img>): لعرض الصورة الحالية حتى يمكن تغييرها إذا لزم الأمر. زر التحديث (<button>): لتقديم النموذج وتحديث البيانات. طريقة العمل: عندما يضغط المستخدم على زر "Edit" في الجدول، يتم عرض النموذج المنبثق مع تعبئة الحقول بالمعلومات الحالية للعنصر. يمكن للمستخدم تعديل المعلومات ثم تقديم النموذج لتحديث البيانات. الجزء الثالث: ;كود (Java script) هذا الكود يستخدم JavaScript لإدارة عرض نموذج التعديل (modal) وتعبئته بالبيانات المناسبة عند الضغط على زر "Edit". كما يتعامل مع إغلاق النموذج عند النقر على زر الإغلاق أو النقر خارج النموذج. دعنا نشرح كل جزء من الكود
    1 نقطة
  38. وعليكم السلام ورحمة الله وبركاته . الهدف من المشروع فقط أثناء تعلمك هو التمرين وتوظيف ما قمت بتعلمه حتي الآن . فبدون التطبيق العملي لن تستطيع الإلمام بجميع الأمور فقط من خلال المذاكرة النظرية لذلك يجب عليك تمرين نفسك علي تطبيق وتنفيذ مشاريع . ومعظم البيانات التي تقوم بالتعلم عيلها هي ليست حقيقية أو ليست بالبيانات الكبيرة لذلك إذا وضعت هدف فمن الممكن أنه لن يعمل علي البيانات الأخري الحقيقية حيث ستختلف البيانات بما لديك. ولكن مستقبلا حين العمل علي مشاريع حقيقية لتحديد الهدف من المشروع هو البحث عن مشكلة تحاول حلها . فالبرمجة عموما و تعلم الآلة بشكل خاص نقوم بعمل المشروع لحل مشكلة لدينا تواجهنا . فمثلا لو البيانات التي لديك بخصوص مرض القلب يمكنك إستخدامها في معرفة السبب الرئيسي لمعرفة المرض ومن هم الأعمار التي لديها أكثر أمراض القلب أكثر ومحاولة إكتشاف السبب لحل تلك المشكلة ومساعدة المرضي . لذلك الهدف الرئيسي الذى يجب تحديده هو ما هي المشكلة التي تنوي حلها بالنموذج الذي تقوم بإنشاءه.
    1 نقطة
  39. 1 نقطة
  40. الصفوف Tuple الصّفوف نوع من البيانات التسلسليّة تماما مثل القوائم، لكنّ الصفوف غير قابلة للتغيير، يتألّف صفّ من مجموعة من القيّم نفصل بينها بفاصلة "," ولإنشاء صفّ نقوم بإسناد مجموعة من القيّم إلى متغيّر حيث نفصل بين القيم بفاصلة كما في المثال التّالي: >>> a = (1, 2, 3) >>> a[0] 1 ويُمكن أيضاً إنشاء صفّ بدون أقواس: >>> a = 1, 2, 3 >>> a[0] 1 خاصيّة قياس عدد العناصر len وتشريح الصّف ممكن أيضا، وتُطبّق هذه الخاصيّات كما فعلنا مع القوائم في الدّرس السّابق. >>> len(a) 3 >>> a[1:] 2, 3 وبما أن الأقواس تُستعمل للجمع كذلك، فيجب أن تنشئ صفّا من قيمة واحدة مع فاصلة زائدة. >>> a = (1) >> a 1 >>> b = (1,) >>> b (1,) >>> b[0] 1 ويُمكن جمع صفّين في صفّ واحد بحيث يحتوي الصّفّ الجديد على كلّ من عناصر الصفّ الأول والثّاني، فمثلا في البرنامج التّالي قُمنا بالجمع بين الصّف a و الصف b وأسندنا قيمهما إلى الصف c: >>> a = (1,2,3) >>> a (1,2,3) >>> b = ('Hsoub Academy', 'Abdelhadi') >>> b ('Hsoub Academy', 'Abdelhadi') >>> c = a+b >>> c (1, 2, 3, 'Hsoub Academy', 'Abdelhadi') يُمكن أن تحتوي الصفوف على مُختلف أنواع البيانات كذلك (الأرقام، السّلاسل النّصيّة، القيم المنطقيّة…)، ويُمكن -كما الحال مع القوائم- للعناصر النّصيّة أن تكون بين علامتي تنصيص مزدوجتين. انظر المثال: # هذا مثال على إمكانية إسناد قيم من أنواع مختلفة >>> a = ('Hsoub Academy', 'Python', 3, 10, True) >>> a ('Hsoub Academy', 'Python', 3, 10, True) # يمكنك كذلك إنشاء قائمة تحتوي على سلاسل نصيّة بين علامتي تنصيص مُزدوجتين >>> a = ("Hsoub Academy", "Python", 3, 10, True) >>> a ('Hsoub Academy', 'Python', 3, 10, True) إذا أردت إنشاء صفّ يحتوي على قيمة مُكرّرة عدّة مرّات فيُمكنك إنشاء صف من عنصر واحد ثمّ إجراء عمليّة ضرب بعدد المرّات الذي تريده: >>> ('Academy',) * 5 ('Academy', 'Academy', 'Academy', 'Academy', 'Academy') عند كتابة عدّة قيم والفصل بينها بفاصلة دون إحاطة العناصر بأي علامات تجميع كالأقواس وعلامتي []، فإنّها تكون صفوفا بشكل افتراضي، انظر المثال: >>> print 'Hsoub academy', 5, False, 'Abdelhadi' Hsoub academy 5 False Abdelhadi >>> a, b = 1, 2; >>> print "Value of a and b : ", a,b Value of a and b : 1 2 العمليات على الصفوف تُوفّر لنا بايثون عدّة دوال للتّعامل مع الصّفوف وقد ذكرنا الدّالة len وكيفية استخدامها أعلاه. وقد حان الوقت للحديث عن بعض الدوال الأخرى المُساعدة في التّعامل مع الصّفوف: دالة cmp للمُقارنة بين صفين، إذا كان الصّفان مُتساويان فالنّتيجة تكون 0 أمّا إذا كانا مُختلفين فالنّتيجة تطبع القيمة 1 أو القيمة -1 حسب الاختلاف: >>> a = (1, 2, 3) >>> b = (1, 2, 3) >>> cmp(a, b) 0 >>> a = (1, 2, 3) >>> b = (1, 2) >>> cmp(a, b) 1 >>> a = (1, 2, 3) >>> b = (1, 2) >>> cmp(b, a) -1 دالة max لإرجاع أكبر قيمة في صفّ: >>> a = ('Hsoub Academy', 'Abdelhadi') >>> max(a) 'Hsoub Academy' >>> b = (1, 2, 3) >>> max(b) 3 دالة min لإرجاع أصغر قيمة في صفّ: >>> a = ('Hsoub Academy', 'Abdelhadi') >>> min(a) 'Abdelhadi' >>> b = (1,2, 3) >>> min(b) 1 المجموعات Sets المجموعات عبارة عن جمع غير منظّم لقيّم فريدة، بحيث لا تُكرّر قيمة أكثر من مرّة. يُمكن إنشاء مجموعة فارغة وإضافة العناصر لها بالتّابع add، مع مُلاحظة أنّ التّابع add لا يقبل سوى عنصر واحد في كلّ مرة: >>> x = set() >>> x.add(1) >>> x set([1]) >>> x.add(2) >>> x set([1, 2]) >>> x.add("Hsoub Academy") >>> x set(['Hsoub Academy', 1, 2]) ولإضافة عدّة عناصر مرّة واحدة فعليك الاعتماد على التّابع update مع ملاحظة أنّ العناصر المُضافة يجب أن تكون داخل علامتي []: >>> x = set() >>> x.update([1, 3, 5, "Hsoub Academy"]) >>> x set(['Hsoub Academy', 1, 3, 5]) ولحذف عنصر من مجموعة ما، فيُمكنك الاستعانة بالتّابع remove بحيث تُمرّر العنصر الذي ترغب بحذفه: >>> x = set(['Hsoub Academy', 1, 3, 5]) >>> x.remove("Hsoub Academy") >>> x set([1, 3, 5]) أمّا إذا كنت ترغب بحذف جميع عناصر مجموعة ما، فالتّابع clear سيتكفّل بالأمر: >>> x = set(['Hsoub Academy', 1, 3, 5]) >>> x set(['Hsoub Academy', 1, 3, 5]) >>> x.clear() >>> x set([]) ويُمكنك نسخ مجموعة وإسناد المنسوخ إلى مجموعة أخرى بالتّابع copy، في المثال التّالي قمنا بنسخ المجموعة x وأسندنا المنسوخ إلى المجموعة y : >>> x = set(['Hsoub Academy', 1, 3, 5]) >>> x set(['Hsoub Academy', 1, 3, 5]) >>> y = x.copy() >>> y set(['Hsoub Academy', 1, 3, 5]) ويُمكن إنشاء مجموعة بقيّم مُتعدّدة، لاحظ في المثال التّالي أنّ النّاتج مجموعة تحتوي على عناصر فريدة (حُذِف العنصر 1 لأنّه مُكرّر): >>> x = set([3, 1, 2, 1]) set([1, 2, 3]) وهناك طريقة جديدة لإنشاء المجموعات في بايثون 2.7: >>> x = {3, 1, 2, 1} set([1, 2, 3]) ويُمكن أن تُضيف قيمة إلى مجموعة، وذلك بالدّالة add. >>> x = set([1, 2, 3]) >>> x.add(4) >>> x set([1, 2, 3, 4]) يُمكن الجمع بين مجموعتين بالمُعامل | بحيث تكون المجموعة الجديدة مُحتويّة على كلّ من عناصر المجموعتين، في المثال التّالي ننشئ أولا المجموعة x ثمّ ننشئ المجموعة y وبعد ذلك نقوم بتوحيد المجموعتين ونُسند النّتيجة إلى المجموعة x_y : >>> x = set(['Hsoub Academy', 1, 3, 5]) >>> x set(['Hsoub Academy', 1, 3, 5]) >>> y = set(["Dyouri", "Abdelhadi"]) >>> y set(['Dyouri', 'Abdelhadi']) >>> x_y = x | y >>> x_y set([1, 3, 5, 'Abdelhadi', 'Hsoub Academy', 'Dyouri']) وكما في القوائم، يُمكنك أن تتحقّق من وجود قيمة من عدمه بالعامل in، وهذه العمليّة تكون أسرع في المجموعات من القوائم ولكنك لن تستطيع أن ترى فرقا كبيرا إلّا إذا كان عدد العناصر كبيرًا. >>> x = set([1, 2, 3]) >>> 1 in x True >>> 5 in x False القواميس القواميس تُشبه القوائم، الفرق أنّك تستطيع فهرسة العناصر داخل القواميس بأي نوع من القيم، ففي القوائم يُمكنك الوصول إلى القيم فقط عبر الأعداد الصّحيحة مثل []x أما في القواميس فتستطيع الوصول إلى قيّم عبر المفاتيح كالتّالي: أولا ننشئ قاموسا، بحيث تملك كلّ قيمة مفتاحا معيّنا، كمثال المفتاح x يحمل القيمة 1: >>> a = {'x': 1, 'y': 2, 'z': 3} ويُمكنك الوصول إلى القيّم عبر المفاتيح (عوضا عن الأرقام في كما في القوائم): >>> a['x'] 1 >>> a['z'] 3 يُمكنك كذلك إنشاء قاموس فارغ وإسناد المفاتيح والقيّم بعد ذلك: >>> b = {} >>> b['x'] = 2 >>> b[2] = 'foo' >>> b[(1, 2)] = 3 >>> b {(1, 2): 3, 'x': 2, 2: 'foo'} يُمكن تعديل قيمة مفتاح بالطّريقة التّالية: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> a {'y': 2, 'x': 1, 'z': 3} >>> a['y'] = 'Hsoub Academy' >>> a {'y': 'Hsoub Academy', 'x': 1, 'z': 3} في المثال أعلاه غيّرنا قيمة المفتاح y من القيمة 2 إلى القيمة Hsoub Academy. ويُمكن إضافة مفاتيح وقيم جديدة كذلك: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> a {'y': 2, 'x': 1, 'z': 3} >>> a['w'] = 'Hsoub Academy' >>> a {'y': 2, 'x': 1, 'z': 3, 'w': 'Hsoub Academy'} يُمكنك حذف العناصر باستخدام del كالتّالي: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> del a['x'] >>> a {'y': 2, 'z': 3} ويُمكنك حذف جميع مُكوّنات قاموس بالتّابع clear كالتّالي: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> a {'y': 2, 'x': 1, 'z': 3} >>> a.clear() >>> a {} ويُمكن كذلك حذف القاموس بأكمله: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> a {'y': 2, 'x': 1, 'z': 3} >>> del a >>> a Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'a' is not defined في المثال أعلاه، حاولنا أن نصل إلى القاموس a بعد حذفه لذلك أرجع المُفسّرُ خطأ مفاده بأنّ a غير موجود. الدّالة keys تُرجع جميع المفاتيح الموجودة في قاموس، وبالطّريقة نفسها يُمكن إرجاع جميع قيّم قاموس ما باستعمال values ، أمّا إن أردت إرجاع القيم والمفاتيح الموجودة في قاموس فيُمكنك استعمال items : >>> a.keys() ['x', 'y', 'z'] >>> a.values() [1, 2, 3] >>> a.items() [('x', 1), ('y', 2), ('z', 3)] ويُمكن استعمال حلقة for للتّقدّم في القاموس واستخراج القيّم والمفاتيح: >>> for key in a: ... print key ... x y z >>> for key, value in a.items(): ... print key, value ... x 1 y 2 z 3 يُمكن التحقق من تواجد مفتاح على قاموس باستخدام عامل in أو دالة has_key. >>> 'x' in a True >>> 'p' in a False >>> a.has_key('x') True >>> a.has_key('p') False يُمكن كذلك الاعتماد على كلّ من get و setdefault بحيث الأولى تقوم بعرض قيمة مفتاح إذا كان موجودا وإذا لم يكن موجودا فترجع القيمة الافتراضيّة والتّي توضع كعامل Parameter ثان. انظر المثال لتفهم قصدي: >>> d = {'x': 1, 'y': 2, 'z': 3} >>> d.get('x', 5) 1 لقد أرجع السّطر السّابق القيمة (1) رغم أنّنا حدّدنا قيمة افتراضيّة (5) وذلك لأن المفتاح موجود ويحمل قيمة مُسبقا. >>> d.get('p', 5) 5 في المثال أعلاه، أرجعت الدّالة get القيمة (5) وذلك لأنّ المفتاح p غير موجود أصلاً. و setdefaul تقوم بوضع قيمة افتراضيّة لمفتاح إذا لم يكن موجودا. >>> d.setdefault('x', 0) 1 >>> d {'x': 1, 'y': 2, 'z': 3} >>> d.setdefault('p', 0) 0 >>> d {'y': 2, 'x': 1, 'z': 3, 'p': 0} يُمكن استخدام القواميس لتمثيل السّلاسل النّصيّة عبر المفاتيح، حيث يُستبدَلُ المفتاح بقيمته: >>> 'hello %(name)s' % {'name': 'python'} 'hello python' >>> 'Chapter %(index)d: %(name)s' % {'index': 2, 'name': 'Data Structures'} 'Chapter 2: Data Structures' ملاحظة حول المفاتيح لا يمكن أن تُسند لمفتاح واحد أكثر من قيمة، إذا حاولت أن تُسند قيمتين لأكثر من مفتاح، فإنّ آخر قيمة تكون قيمة المفتاح في النّهاية: >>> a = {'FirstName': 'Abd', 'LastName':'Dyouri', 'Job':'Writer', 'FirstName':'Abdelhadi'} >>> a {'LastName': 'Dyouri', 'Job': 'Writer', 'FirstName': 'Abdelhadi'} >>> a['FirstName'] 'Abdelhadi' يُمكن الجمع بين قاموسين في قاموس واحد بالتّابع update، مع تمرير القاموس الثّاني، في المثال التّالي، أنشأنا قاموسا a ثمّ أنشأنا القاموس b، بعد ذلك حدّثنا القاموس a واضعين فيه مُكونات القاموس b فأصبح في الأخير يحمل جميع مكونات القاموسين : >>> a = {'FirstName': 'Abd', 'LastName':'Dyouri', 'Job':'Writer', 'FirstName':'Abdelhadi'} >>> a {'LastName': 'Dyouri', 'Job': 'Writer', 'FirstName': 'Abdelhadi'} >>> b = {'Website':'Hsoub Academy', 'Language':'Arabic'} >>> b {'Website': 'Hsoub Academy', 'Language': 'Arabic'} >>> a.update(b) >>> a {'Website': 'Hsoub Academy', 'LastName': 'Dyouri', 'Job': 'Writer', 'Language': 'Arabic', 'FirstName': 'Abdelhadi'} تطبيق حول القواميس لننشئ تطبيقا بسيطا لتحويل الأرقام إلى كلمات في لغة بايثون، بحيث يكون لكلّ رقم كلمة تُقابله، افتح ملفّا واحفظه باسم dict.py واكتب فيه الشيفرات التّالية، اقرأ التّعليقات لتفهم الشّيفرة: # -*- coding: utf-8 -*- # طباعة اسم التّطبيق print 'Dictionary Version 1.0.0' # تعريف القاموس وتعيين القيم له dict = { 1:'One', 2:'Two', 3:'Three', 4:'Four', 5:'Five' } # الدّوران حول قيم ومفاتيح القاموس وطباعتها for key in dict: print key , 'in English is :' , dict[key] مُخرجات التطبيق (بعد حفظ الملفّ وتنفيذه) ستكون كالتّالي: Dictionary Version 1.0.0 1 in English is : One 2 in English is : Two 3 in English is : Three 4 in English is : Four 5 in English is : Five يُمكنك أن تعدّل في الشّيفرة كما تشاء، ويُمكنك إضافة المزيد من القيم، الأمر يعود لك. تمارين تمرين 1 اجمع قيم الصّفين التّاليين وضعها في صفّ باسم c: a = ('One','Two','Three') b = ('Hsoub Academy', 'Abdelhadi') تمرين 2 أحذف القيمة HTML من المجموعة x في الشّيفرة التّاليّة: x = set(['Ruby', 'Python', 'HTML', 'Perl']) تمرين 3 قم بتطبيق تعلّماتك لتنشئ برنامجا يعرض كلّ دولة عربية واختصارها، مثلا دولة المغرب اختصارها MA ومصر اختصارها EGY. بحيث تكون نتيجة البرنامج شيئا يبدو كالتّالي: Morocco: MA Egypt: EGY ترجمة -وبتصرف- للكتاب Python Practice Book لصاحبه Anand Chitipothu.
    1 نقطة
  41. يحتاج لينكس، مثل غيره من أنظمة التشغيل متعدّدة المستخدمين Multi-user system إلى طريقة للتحكّم في وصول المستخدمين إلى مختلف الملفات. ليس من المحبّذ مثلا أن يعدّل مستخدم آخر على ملفات الإعداد التي أخذ ضبطها كثيرا من وقتك. يُطبَّق مبدأُ الفصلِ هذا على نظام تشغيل لينكس بآلية الأذونات Permissions. كيف تعمل الأذونات يُخزَّن كلّ ملف على النظام بأذوناته الخاصّة. كيف تُمثَّل؟ من الراجح أنك صادفتها أثناء عملك على نظام لينكس: drwxr-xr-x -r-w-rwrw- -rwxr--r-- تظهر الأذونات عند تنفيذ أوامر مثل ls -l. تخبر سلسلة المحارف Charcters بمعلومات الملف؛ يمكن تقسيم سلسلة المحارف الخاصّة بمعلومات الملف إلى أربعة أقسام: القسم الأول: هو المِحرف الأول الذي يدلّ على نوع الملفّ. القسم الثاني: يحوي المحارف من 2 إلى 4؛ وهي أذونات المستخدِم مالك الملف؛ أي ما يحقّ لهذا المستخدم فعله على الملف. القسم الثالث: المحارف من 5 إلى 7؛ وهي أذونات المجموعة مالكة الملف. القسم الرابع: المحارف من 8 إلى 10؛ وهي أذونات بقية المستخدمين (ليسوا مالك الملف ولا ينتمون للمجموعة مالكة الملف). يمكن للمحرف الأول أن يكون أحد المحارف التالية: - للملفات العادية. d: للمجلّدات. l: للوصلات الرمزية Symbolic link. s: لمقابس Socket يونكس. p: لأنابيب الاتّصال. c: للأجهزة الطرفيّة المحرفيّة Character device file. b: للأجهزة الطرفيّة الكتليّة Block device file. توضّح المحارف التسعة التالية لنوع الملف الأذونات في ثلاثة أقسام من ثلاثة محارف (القسم الثاني، الثالث والرابع المذكورة أعلاه): تعرض المحارف الثلاثة الأولى أذونات القراءة، الكتابة والتنفيذ بالنسبة لمالك الملف. تعرض المحارف الثلاثة الموالية نفس الأذونات ولكن بالنسبة للمجموعة مالكة الملف؛ والمحارف الثلاثة الأخيرة الأذونات بالنسبة لبقية المستخدمين. يعني المحرف الأول من كل قسم من إذن القراءة (r)، المحرف الثاني إذن الكتابة (w) والمحرف الثالث إذن التنفيذ (x). يدلّ ذكر المحرف (w، r وx) على وجود الإذن أما غياب الإذن فيُشار إليه بعارضة -. يعني وجود عارضة مكان إذن القراءة (أو الكتابة أو التنفيذ) أن المعني (المالك، المجموعة أو الآخرين) ليس لديه هذا الإذن. بالعودة إلى المثال: drwxr-xr-x يعني هذا السطر أننا أمام مجلّد (المحرف الأول d)، لدى مالك الملف (المحارف من 2 إلى 4) جميع الأذونات (rwx)، لدى المجموعة المالكة (المحارف من 5 إلى 7) إذنا القراءة والتنفيذ ولكن ليس لديها إذن الكتابة (r-x)، ونفس الشيء بالنسبة لبقية المستخدمين. تعديل الأذونات يُستخدَم أمر chmod لتعديل الأذونات. توجد طريقتان لذلك: الأولى باستخدام الأحرف المذكورة أعلاه (w، r وx)، والثانية باستخدام أرقام. سنشرح الطريقة الأخيرة هنا لأنها أسرع كثيرا. chmod 775 ~/my/file نلقي نظرة على القائمة التالية لفهم معنى الأرقام: 4 = r 2 = w 1 = w = إذن غير موجود نجمع الأرقام للحصول على الأذونات. بالنسبة لإذن rwx فيجب أن يكون 4+2+1=7؛ إذن r-x يجب أن يكون 4+0+1=5 وهكذا. بما أن لدينا ثلاثة أقسام من الأذونات (المستخدِم المالك، المجموعة المالكة وبقية المستخدمين) فسنحتاج إلى ثلاثة أرقام، رقم لكلّ قسم. أي أننا نجمع الأرقام المقابلة لأذونات كل قسم ونضعها جنبا إلى جنب في عدد من ثلاثة أرقام: الرّقم على اليسار لأذونات المستخدم المالك، الرقم في الوسط للمجموعة المالكة والرقم على اليمين لبقية المستخدمين. نعرف، بتنفيذ المبدأ أعلاه ، أن الأمر السابق يعدّل أذونات الملف /my/file/~ لتصبح كالتالي (طبقنا الأمر على ملف عادي، وبالتالي تظهر - في معلومات الملف تليها الأذونات): -rwxrwxr-x تعديل ملكية ملف يوجد أمران لتعديل ملكية الملف، الأول وهو chown يغيّر المستخدم المالك والثاني chgrp ويغيّر المجموعة المالكة. تغيير المستخدم المالك (المالك الجديد للملف /my/file/~ هو user): chown user ~/my/file تغيير المجموعة المالكة (المجموعة الجديدة هي group): chgrp group ~/my/file إن لم تكن مالكَ الملف أو تنفذ الأمرين أعلاه بصلاحيات المستخدم الأعلى root فلن ينجح تنفيذ الأمر. ترجمة -وبتصرّف- للمقال Linux File Permissions Explained لصاحبه Radek Pazdera.
    1 نقطة
    الكتاب قدم لي المعرفة التي كنت أحتاجها، فرغم انضمامي لمجال التصميم منذ بضعة أشهر إلا أنني اكتفيت بتقليد بعض التصاميم، وبعد قِراءة الكتاب حاولت بناء تصميم من الصفر كتطبيق عملي لما قرات ونجحت في ذلك أشكر الأستاذ محمد زاهر على جهوده المباركة وكتبت ملخص للكتاب ونشرته في مدونتي على الرابط أدناه https://salwa569540860.wordpress.com/2021/08/22/كيف-تحترف-التصميم-الجرافيكي-دون-موهبة/
    0 نقاط
×
×
  • أضف...