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

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

  1. Khaled Osama3

    Khaled Osama3

    الأعضاء


    • نقاط

      7

    • المساهمات

      1580


  2. Rol Ian

    Rol Ian

    الأعضاء


    • نقاط

      6

    • المساهمات

      26


  3. Areej Suliman

    Areej Suliman

    الأعضاء


    • نقاط

      6

    • المساهمات

      108


  4. Mustafa Suleiman

    Mustafa Suleiman

    الأعضاء


    • نقاط

      4

    • المساهمات

      13209


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

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

  1. السلام عليكم ورحمة الله وبركاتة اعمل على موقع عربي واريد ترجمته للإنجليزية عند الضغط على الأيقونة الخاصة كيف ؟
    2 نقاط
  2. ايه المقصود من higher order function
    2 نقاط
  3. تمام , يعني MySQL افضل من حيث حجم البيانات
    2 نقاط
  4. جزاك الله خير استاذي الغالي المشكلة كانت في اني لم احدد الvalue الخاصة بالكود الان يعمل بارك الله فيك جزاك الله خير استاذي الغالي فعلا هذه كانت المشكلة بارك الله فيك
    2 نقاط
  5. <?php require_once('database.php'); if ($_SERVER["REQUEST_METHOD"] == "POST") { $fullname = $_POST["FName"]; $email = $_POST["Email"]; $feedback = $_POST["feedback"]; if (empty($fullname) || empty($email) || empty($feedback)) { echo "Please fill in all required fields."; return; } $sql = "INSERT INTO feedback (full_name, email, feedback) VALUES ($fullname, $email, $feedback)"; $stmt = $conn->prepare($sql); $stmt->bindParam(":fullname", $fullname); $stmt->bindParam(":Email", $email); $stmt->bindParam(":feedback", $feedback); try { $stmt->execute(); echo "Feedback submitted successfully!"; } catch(PDOException $e) { echo "Error submitting feedback: " . $e->getMessage(); } } ?> feedback.php <?php $hostName = "localhost"; $dbUser = "root"; $dbPassword = ""; $dbName = "feedBack"; $conn = mysqli_connect($hostName, $dbUser, $dbPassword, $dbName); if (!$conn) { die("Something went wrong;"); } ?> database.php وظيفة صفحة feedback.php تجعل المستخدم يدخل بيانات وتضاف في جدول في قاعد البيانات ولكن عندما يضغط إرسال ذلك لا يعمل
    2 نقاط
  6. انا اتعلم لارافل جديد اريد معرفة كيف انشئ المصادقه بواسطة sanctum مثل تسجيل الدخول و انشاء الحساب وما الي ذالك
    2 نقاط
  7. في كل مرة أسمع فيها عن أهمية ريادة الأعمال و كيف أنها تمكنك من تحصيل مدخول محترم يتبادر إلى ذهني هذا السؤال : كيف أصبح رائد أعمال ؟
    1 نقطة
  8. السلام عليكم اي الفرق بين مكتبه MySQL و مكتبه sqlite3 واي الفرق بين ان اكتب اومر SQL في لغة Python وبين اكتب اومر SQL في صفحت الويب اي افضل او اي الابيستخدم في المشاريع اي كان ويب وتعلم الاله وهكذ
    1 نقطة
  9. نغم تفيد كل ما عليكى هو فهم كيفية إنشاءها ومن ثم عملها بأى لغة برمجة.
    1 نقطة
  10. نعم الموقع كبير فكيف استعمل الحزم ؟
    1 نقطة
  11. لكن لم ناخذ لغة php في دورة تطوير واجهة المستخدم فأنا اعمل على html & css & js فهل تفيد هذه الطريقة ؟
    1 نقطة
  12. بالاضافة لتعليقات الأصدقاء ال higher order function هى الfunction التى تأخذ function أخري أو أكثر كمعاملات لها أو ترجع function function greaterThan(n) { return m => m > n; } let greaterThan10 = greaterThan(10); console.log(greaterThan10(11)); // → true ويوجد functions في الجافسكربت هى higher order function جاهزة لحل مشكلات متكررة مثل ال 1 - ()map // جمع 10 على كل عنصر فى المصفوفة const arr = [1, 2, 3, 4, 5]; const output = arr.map((num) => num += 10) console.log(arr); // [1, 2, 3, 4, 5] console.log(output); // [11, 12, 13, 14, 15] 2 - ()filter const users = [ {firstName: 'John', lastName: 'Doe', age: 25}, {firstName: 'Jane', lastName: 'Doe', age: 30}, {firstName: 'Jack', lastName: 'Doe', age: 35}, {firstName: 'Jill', lastName: 'Doe', age: 40}, {firstName: 'Joe', lastName: 'Doe', age: 45}, ] // ايجاد المستخدمين أعمارهم فوق 30 const output = users.filter(({age}) => age > 30) console.log(output); // [{firstName: 'Jack', lastName: 'Doe', age: 35}, {firstName: 'Jill', lastName: 'Doe', age: 40}, {firstName: 'Joe', lastName: 'Doe', age: 45}]
    1 نقطة
  13. سوف اقوم بشرحها لك عن طريق مثال: تخيل أن الدوال هي مثل الأدوات في علبة أدوات البرمجة. لكن في حالة الدوال ذات النظام العالي، يمكنك أن تتعامل مع هذه الأدوات بطريقة أكثر مرونة وقوة. بدلاً من أن تكون مقيدًا بطريقة معينة لاستخدام الأدوات، يمكنك استخدام هذه الأدوات لبناء أدوات أخرى أو حتى تمريرها إلى أدوات أخرى لتفعيل مهام معينة. لنفهم ذلك بمثال بسيط. لنفترض أن لديك دالة تُسمى "ضرب_في_اثنين" تأخذ عددًا وتضربه في 2 وترجع الناتج. في البرمجة التقليدية، ستبدو الدالة بهذا الشكل: def multiply_by_two(number): return number * 2 def apply_operation(number, operation): # هذه هى high oreder function return operation(number) result = apply_operation(5, multiply_by_two) print(result) #الناتج سيكون 10 هنا ايضا تم تمرير الدالة multiply_by_two كمدخل لدالة apply_operation، والتي قامت بتنفيذ الضرب على الرقم 5.
    1 نقطة
  14. مصطلح يطلق على دوال تاخذ دوال أخرى كمعاملات parameters او ترجعها كقيمة // دالة تأخذ دالة أخرى كمعامل function operate(func, x, y) { return func(x, y); } function add(x, y) { return x + y; } const resultAdd = operate(add, 3, 4); // Adds 3 and 4 // دالة ترجع دالة أخرى كقيمة function multiplier(factor) { return function (number) { return number * factor; }; } const double = multiplier(2); const resultDouble = double(5); //return 10
    1 نقطة
  15. هل يوجد في المنصة درس عن التوطين او خارجها ؟ احتاج رابط ومصدر فضلا لا امراً لاني باشد الحاجة اليه ؟ وهل التوطين يدخل من مهام مطور واجهة المستخدم ام لا ؟
    1 نقطة
  16. استخدم bootstrap فأي من الطرق ينفع ؟
    1 نقطة
  17. صنعت برنامج بمكتبة pyqt5 و انشأت قاعدة بيانات بمكتبة sqlite3 صنعت حقل ادخال و زر وصنعت اداة للزر وظيفتها انه عند الضغط على الزر الحصول على القيمة من حقل الادخال و اضافتها فى الجدول المشكلة هى عند الضغط على الزر ينطفئ البرنامج ها هو الكود ارجو الحل و الشكر لم ساعدنى #استدعاء المكتبات from PyQt5 import QtCore, QtGui, QtWidgets import sys import sqlite3 #انشاء البرنامج app = QtWidgets.QApplication(sys.argv) #انشاء النافذة w = QtWidgets.QWidget() #حقول الادخال e1 = QtWidgets.QLineEdit(w) e1.move(200,150) e1.resize(400,40) e1.setStyleSheet("background-color: white ;font-size: 20px") #الازرار b1 = QtWidgets.QPushButton("اضافة", w) b1.move(40,40) b1.resize(400,50) b1.setStyleSheet("background-color: yellow ;font-size: 24px") # انشاء قاعدة بيانات db = sqlite3.connect("name.db") c = db.cursor() c.execute("CREATE TABLE names(name TEXT)") #الحصول على القيمة من حقول الادخال def add(): a1 = e1.text() e1.clear() cute("INSERT INTO names(name, age, add, ph) VALUES(?)",(a1)) db.commit() b1.clicked.connect(add) db.close() w.show() app.exec_()
    1 نقطة
  18. الفرق الرئيسى بينهم أن MySQL عبارة عن قاعدة بيانات و SQLite3 عبارة عن مكتبة يتم تضمنها فى ال تطبيق لديك وهذا مقارنة تفصيلية بينهم نوع الخادم: MySQL: يتم تشغيل MySQL كخادم قاعدة بيانات مستقل يستجيب للاتصالات من عملاء متعددين. SQLite3: يتم تضمين SQLite3 كمكتبة داخلية في التطبيق ويتم الوصول إليها مباشرة دون الحاجة إلى خادم قاعدة بيانات منفصل. المتطلبات والتثبيت: MySQL: يتطلب تثبيت وتكوين خادم MySQL منفصل، ويحتاج إلى مساحة وذاكرة كبيرة. SQLite3: لا يتطلب تثبيت منفصل، حيث يمكن استخدام ملف SQLite3 بسهولة داخل التطبيق بدون أي تكوينات معقدة. الاداء: MySQL: يمكن أن تكون قواعد البيانات الكبيرة ومعالجة العمليات المتعددة تحت ضغط متزايد. SQLite3: تكون الأداء أسرع وأبسط بشكل عام، ولكن قد تظهر بعض القيود في الأداء عند التعامل مع قواعد بيانات كبيرة أو العمليات المتعددة. الدعم والمجتمع: MySQL: يتمتع MySQL بدعم كبير ومجتمع نشط، مما يعني وجود العديد من المصادر والموارد المتاحة للمستخدمين. SQLite3: يحظى SQLite3 أيضًا بدعم واسع النطاق، ولكن قد يكون أقل بعض الشيء من MySQL نظرًا لطبيعته الخفيفة والموجهة نحو التطبيقات الصغيرة. الوظائف والقدرات: MySQL: يوفر MySQL مجموعة واسعة من الوظائف والميزات مثل التعقيد العالي والتنمية الجماعية والتحكم في النسخ الاحتياطي. SQLite3: تكون ميزات SQLite3 أقل قليلاً من MySQL، حيث يركز SQLite3 على توفير وظائف أساسية لإدارة قواعد البيانات بشكل بسيط وفعال.
    1 نقطة
  19. عندما اكتب index.jsعلي لا يتحول لملف جافا
    1 نقطة
  20. مرحبا قمت بالخطأ بالضغط على تحديد الموقع كمقروء ظناً مني ان هذا الخيار خاص بالمحتوى فقط وليس الدروس هل يمكنني التراجع عن هذا الامر ام انه امر غير متاح بالمنصة؟
    1 نقطة
  21. للأسف الأمر غير متاح من خلال إعدادات الحساب، لكن يمكنك تفقد هل هناك إمكانية للتراجع عن ذلك من خلال مركز المساعدة أي من قبلهم، تواصل عبر الرابط التالي: https://support.academy.hsoub.com/conversations
    1 نقطة
  22. السلام عليكم عملت هذا الكود لزيادة عدد المنتجات ما الخطا فيه .؟؟؟؟ $(document).ready(function(){ let $qty__up = $(".qty-up"); let $qty__down = $(".qty-down"); let $input = $(".qty_input"); //click on qty up button $qty__up.click(function(e){ if($input.val() >=1 && $input.val() <=9){ $input.val(function(i,oldval){ return ++oldval; }) } }) $qty__down.click(function(e){ if($input.val()>1 && $input.val()<=10){ $input.val(function(i,oldval){ return --oldval; }) } }) }); <button class="qty-up border bg-light" ><i class="fa fa-angle-up" aria-hidden="true"></i></button> <input type="text" class="qty_input bg-light w-50 text-center" disabled > <button class="qty-down border bg-light"><i class="fa fa-angle-down" aria-hidden="true" ></i></button>
    1 نقطة
  23. إنه بالفعل يعمل
    1 نقطة
  24. يرجي ملاحظه ان الكود المرسل لا يحتوي علي إغلاق تعليمة if بقافلة } يجب ان تضع علامه } بعد هذا السطر mysqli_stmt_close($stmt); وقبل هذا السطر ?>.
    1 نقطة
  25. <?php require_once('database.php'); if ($_SERVER["REQUEST_METHOD"] == "POST") { $fullname = $_POST["FName"]; $email = $_POST["Email"]; $feedback = $_POST["feedback"]; if (empty($fullname) || empty($email) || empty($feedback)) { echo "Please fill in all required fields."; return; } $sql = "INSERT INTO feedback (full_name, email, feedback) VALUES (?, ?, ?)"; $stmt = mysqli_prepare($conn, $sql); if (!$stmt) { die("Something went wrong: " . mysqli_error($conn)); } mysqli_stmt_bind_param($stmt, "sss", $fullname, $email, $feedback); if (mysqli_stmt_execute($stmt)) { echo "<div class='alert alert-success'>Feedback submitted successfully.</div>"; } else { echo "<div class='alert alert-danger'>Error submitting feedback: " . mysqli_stmt_error($stmt) . "</div>"; } mysqli_stmt_close($stmt); ?> لازال لايعمل
    1 نقطة
  26. نعم، إذا أردت استخدام mysqli بدلاً من PDO، فهذه هي الطريقة الصحيحة لتحضير الاستعلام وتنفيذه بشكل آمن لمنع هجمات الحقن الـ SQL. ومع ذلك، يمكن تحسين الكود قليلاً لجعله أكثر وضوحًا وفعالية. إليك النسخة المحسنة: // الاستعلام مع العلامات الاستفهام كعناصر نائبة للقيم $sql = "INSERT INTO feedback (full_name, email, feedback) VALUES (?, ?, ?)"; // تحضير الاستعلام $stmt = mysqli_prepare($conn, $sql); // التحقق من تحضير الاستعلام بشكل صحيح if (!$stmt) { die("Something went wrong: " . mysqli_error($conn)); } // ربط القيم المدخلة بالعناصر النائبة في الاستعلام mysqli_stmt_bind_param($stmt, "sss", $fullname, $email, $feedback); // تنفيذ الاستعلام if (mysqli_stmt_execute($stmt)) { echo "<div class='alert alert-success'>Feedback submitted successfully.</div>"; } else { echo "<div class='alert alert-danger'>Error submitting feedback: " . mysqli_stmt_error($stmt) . "</div>"; } // إغلاق البيان mysqli_stmt_close($stmt); لاحظ أنني استخدمت mysqli_error($conn) لطباعة الخطأ مباشرة إذا فشلت عملية التحضير، وmysqli_stmt_error($stmt) لطباعة الخطأ إذا فشلت عملية التنفيذ هذا يساعدك لتتمكن من تشخيص المشكلات بدقة وفعالية. بالإضافة إلى ذلك، يجب دائما إغلاق البيان بعد الانتهاء منه باستخدام mysqli_stmt_close($stmt) لتضمن أن تطبيقك لا يستهلك موارد أكثر مما يحتاج ويبقى خادمك أو جهازك يعمل بسلاسة وفعالية، مما يساعد على تجنب المشاكل المحتملة المتعلقة بالأداء أو الذاكرة.
    1 نقطة
  27. وإذا أردت استخدام mysqli هل تكون التعديلات هكذا؟ لأن الصفحات الأخرى كتبتها بطريقة mysqli $sql = "INSERT INTO feedback (full_name, email, feedBack) VALUES (?, ?, ?)"; $stmt = mysqli_stmt_init($conn); $prepareStmt = mysqli_stmt_prepare($stmt,$sql); if ($prepareStmt) { mysqli_stmt_bind_param($stmt,"sss",$fullName, $email, $feedback); mysqli_stmt_execute($stmt); echo "<div class='alert alert-success'> successfully.</div>"; }else{ die("Something went wrong"); } }
    1 نقطة
  28. أنت لم تقم بتضمين القيم المراد إدخالها في استعلام SQL بشكل صحيح، هناك أيضًا بعض الأخطاء الأخرى: استخدم اقتباسات للقيم النصية في استعلام SQL. لاحظ أنه يجب عليك استخدام اسماء الاعمدة المراد إدخال البيانات فيها بين قوسين في INSERT INTO. استخدم اسماء المتغيرات بشكل صحيح مع استعلام الإدخال. استخدم اسماء المتغيرات الصحيحة مع bindParam(). <?php require_once('database.php'); if ($_SERVER["REQUEST_METHOD"] == "POST") { $fullname = $_POST["FName"]; $email = $_POST["Email"]; $feedback = $_POST["feedback"]; if (empty($fullname) || empty($email) || empty($feedback)) { echo "Please fill in all required fields."; return; } // تحسين استعلام SQL لتضمين قيم النص داخل اقتباسات $sql = "INSERT INTO feedback (full_name, email, feedback) VALUES (:fullname, :email, :feedback)"; $stmt = $conn->prepare($sql); // ربط القيم المستخدمة مع معلمات الاستعلام باستخدام bindParam() $stmt->bindParam(":fullname", $fullname); $stmt->bindParam(":email", $email); $stmt->bindParam(":feedback", $feedback); try { $stmt->execute(); echo "Feedback submitted successfully!"; } catch(PDOException $e) { echo "Error submitting feedback: " . $e->getMessage(); } } ?> بالطبع من المهم التأكد من أن متغيرات النموذج (مثل "FName" و "Email" و "feedback") تتطابق بالضبط مع الأسماء المستخدمة في نموذج HTML.
    1 نقطة
  29. يوجد بعض الاخطاء: في ملف الاتصال بقاعدة البيانات، يبدو أن هناك بعض التباس بين استخدام mysqli وPDO. كلاهما طريقتين ممتازتين للتفاعل مع قاعدة البيانات، لكن عليك ان تختار واحده فقط من بينهم؛ اختر إما mysqli أو PDO واستخدمها consistent في جميع أنحاء مشروعك. عند كتابة استعلامات SQL، من المهم جدًا تجنب الحقن لكود خبيث في قاعدة بياناتك. تخيل أنك تكتب رسالة سرية وتريد التأكد من أن الشخص الوحيد الذي يمكنه فهمها هو الشخص المقصود. استخدام العلامات الاستفهام (?) أو الأسماء المستعارة (:placeholder) في استعلاماتك يشبه استخدام رموز سرية تضمن أن الرسالة (البيانات) تصل بأمان وبالطريقة التي تريدها. لحماية قاعدة البيانات من اللصوص الرقميين الذين يحاولون "حقن" كود خبيث لسرقة البيانات أو التسبب في الفوضى، من الضروري استخدام طرق الربط مثل bindParam أو bindValue. هذا يشبه وضع قفل إلكتروني متطور على باب منزلك يتطلب مفاتيح رقمية خاصة للدخول. بهذه الطريقة، تضمن أن تطبيقك يتحدث مع قاعدة البيانات بلغة مشفرة وآمنة، مما يحمي معلوماتك ويجعل تجربة المستخدم أكثر أمانًا واستقرارًا. إذا قررت الاستمرار باستخدام PDO، إليك كيفية تحديث الكود: في feedback.php: // تأكد من أن الاستعلام يستخدم الأسماء المستعارة $sql = "INSERT INTO feedback (full_name, email, feedback) VALUES (:fullname, :email, :feedback)"; $stmt = $conn->prepare($sql); // ربط القيم بالأسماء المستعارة باستخدام bindParam $stmt->bindParam(":fullname", $fullname); $stmt->bindParam(":email", $email); $stmt->bindParam(":feedback", $feedback); try { $stmt->execute(); echo "Feedback submitted successfully!"; } catch(PDOException $e) { echo "Error submitting feedback: " . $e->getMessage(); } وفي database.php، إذا كنت تريد استخدام PDO بدلاً من mysqli: $hostName = "localhost"; $dbUser = "root"; $dbPassword = ""; $dbName = "feedBack"; // استخدام PDO للاتصال بقاعدة البيانات try { $conn = new PDO("mysql:host=$hostName;dbname=$dbName", $dbUser, $dbPassword); // تعيين وضع الخطأ PDO ليكون exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die("Something went wrong: " . $e->getMessage()); } بعد فعل هذه التغييرات، يمكنك ان تجرب مره اخري ان تدخل بيانات وستسجل في قاعده البيانات.
    1 نقطة
  30. SQL تعتبر اللغة القياسية أو الرسمية للتعامل مع قواعد البيانات، فهي لغة يتم تطويرها منذ عقود من أجل ذلك الغرض، والمكتبات وبرامج إدارة قواعد البيانات تعتمد عليها. وطالما أننا نتحدث عن قواعد البيانات العلائقية، حاليًا البديل الوحيد هي لغة PRQL والتي ما زالت قيد التطوير وتم بنائها بواسطة لغة Rust حيث يتم تحويل الكود الخاص باللغة إلى لغة SQL في النهاية لذا البحث عن بديل يعني استخدام لغة أو إطار يتم به التعامل مع قواعد البيانات بطريقة مختلفة أي عن كتابة لغة مختلفة عن SQL سواء من أجل تسهيل العملية أو إضافة مزايا أخرى، لكن في النهاية يتم تحويل الكود إلى SQL بواسطة مترجم transpiler. وكمثال Language-Integrated Query (LINQ) هي جزء من لغة C# و.NET Framework ويسمح بالتفاعل مع مصادر البيانات المختلفة باستخدام بنية اللغة السهلة للتعامل مع قواعد البيانات العلاقية بطريقة مشابهة لاستخدام SQL، بالإضافة إلى التفاعل مع مصادر البيانات الأخرى مثل الكولكشنز والمصفوفات. أيضًا SPARQL هي لغة استعلام تستخدم لقواعد البيانات الرسومية وربط البيانات على الويب (RDF)، وتستخدم على نطاق واسع في Semantic Web وLinked Data.
    1 نقطة
  31. السلام عليكم هل إن قرأت الكتب + شاهدت الكورسات + حللت المشاكل على leetcode ثم بنيت مشاريع بمساعدة chatgpt هل سأصل الاحتراف هاكذا ؟
    1 نقطة
  32. أولاً قراءة الكتب في البداية لن تحقق لك الاستفادة المطلوبة، أنت بحاجة إلى المشاهدة والمحاكاة والاستيعاب من خلال شرح عملي حيث تستطيع قراءة الكتب بعد الإنتهاء من مسارك البرمجي وتنفيذ مشاريع. لكن هل تكتفي بما تم شرحه بأي دورة بأي مكان؟ بالطبع لا، عليك التطبيق على جزء بالدورة بالبحث عن تمارين، تطبيقات وتحديات لتوظيف ما تعلمته بها، ثم بعد الإنتهاء من الدورة عليك تنفيذ مشروع كامل آخر غير الذي قمت به بالدورة، وفي حال لم تكن تشعر بأريحية في استيعاب ما قمت به بالمشروع بالدورة عليك إعادته بمفردك مرة أخرى لحين الشعور بأريحية أنك مستوعب لما تقوم به. بعد ذلك تستطيع حل مسائل leetcode، بشكل متدرج، رغم أنه من الأفضل حل مسائل أثناء تعلمك للدورة من خلال موقع أسهل مثل Codewars. بغض النظر عن الأدوات التي تعتمد عليها في بناء مشاريع، يجب أن تكون مستوعب لما يحدث وما سبب قيامك بالأمر بهذا الشكل وليس غيره وما فائدته، وليس نسخ ولصق وبناء مشروع لا يحقق لك إفادة على مستواك البرمجي ومهاراتك، كل تلك الأمور تؤهلك لحل المشاكل بشكل أسهل عند مواجهتها فبدون المعرفة والاستيعاب لن تتمكن من الوصول بعيدًا. عليك البحث عن متطلبات الوظيفة التي تريدها على مواقع مثل LinkedIn وIndeed ثم وضع قائمة بالتقنيات والمهارات المطلوبة ثم تعلمها والوصل إلى مستوى جيد بها وبناء معرض أعمال يثبت ذلك.
    1 نقطة
  33. وعليكم السلام ورحمة الله وبركاته، لوصول إلى مستوى الاحتراف كلمه نسبيه قد تختلف من مكان لأخر ومن مجال لأخر ولكن دعنا نبدلها بكلمه مؤهل لسوق العمل, لتصبح مؤهل لسوق العمل في البرمجة يعتمد على عدة عوامل. الأنشطة التي ذكرتها مثل قراءة الكتب ومشاهدة الدورات التدريبية وحل التمارين على مواقع مثل ليت كود ستساعدك كثيرا في فهم شامل للمفاهيم البرمجية والاساسيات وتطوير مهارة حل المشكلات والتفكير الحسابي وفهم الخوارزميات وهياكل البيانات. بناء مشاريع حقيقية أيضًا مهم لتطبيق ما تعلمته وفهم كيفية عمل الأكواد في الواقع. وإن كنت تواجه أي صعوبة، فمواقع مثل تشات جي بي تي قد تساعد بتقديم بعض الحلول والنصائح. لكن لتصبح مؤهل لسوق العمل بالفعل، يجب أن تستمر بالممارسة والتطبيق العملي الكثير، وتحليل أي أخطاء وتعلم منها. العمل أيضا ضمن فريق قد يساعدك على تحسين قدرتك على التعاون والمتابعة مع شخص لديه خبره اكثر منك للأستشاره قد يفيدك كثيرا. والحصول على خبرة عملية سواء من خلال العمل في مشاريع حقيقية أو تدريبات ميدانية فبالرغم من أهمية ما ذكرته إلا أن الخبرة العملية هي الأفضل للوصول لمرحلة الاحتراف. والحصول على شهادات معتمدة في مجال البرمجة لزيادة فرص العمل. ولا تنسى دائما تحديث مهاراتك بمتابعة التطورات الجديدة لان مجال البرمجة يتطور سريعا. باتباع هذه النصائح والمثابرة، ستصبح بالتأكيد مؤهلا لسوق العمل في مجال البرمجة.
    1 نقطة
  34. صممت صفحه بسيطه بواسطة html , css تعمل جيد جدا في هواتف الاندرويد و الويندوز ولاكن الاهمالمشكله تظهر في متصفحات ios عند فتح الصفحه من ios تظهر بشكل مختلف تماما ولاكان انه تم حذف الاكواد لا اعرف لماذا مع ان الاتنين متصفحات جوجل كروم اقصد اني استخدم جوجل كروم علي ابل و اندرويد ولاكن النتيجه مختلفه علي ابل الصوره ستوضح المشكله الصوره الاولي لنسخة ios النسخه الثانيه للاندرويد كود html <!DOCTYPE html> <html lang="ar"> {{-- // 720 --}} <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Friends</title> <link rel="stylesheet" href="{{ URL::asset('css/bootstrap.css') }}"> <link rel="stylesheet" href="{{ URL::asset('css/main.css') }}"> </head> <body> <div class="fixed-bottom floating-button bg-priamry"> <a href="javascript:void(0);" onclick="window.print();"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"> <path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3" /> </svg> </a> </div> <div class="container"> <div class="row align-items-center"> <div class="xmarg"></div> <div class="col-lg-5 col-12 my-3"> {!! $qrQode !!} </div> <div class="col-lg-7 col-12 image-container text-center"> <a href="#" class="xog"> <img src="{{ URL::asset('logo_l.png') }}" alt="logo(wasal)"> </a> </div> </div> <div class="container trip-info mt-4"> <div class="allocate"> <span class="taken-no">رقم الحجز</span> <input class="taken-value" type="text" name="taken-value" placeholder="244" value="{{ $data['clientData']['reservationNumber'] }}"> </div> {{-- $data['userData'] --}} <div class="passngers"> <span class="passngers-span">كشف الركاب</span> </div> <div class="datex"> <div class="day"> <span class="taken-no">اليوم</span> <input class="taken-value" type="text" name="taken-value" placeholder="{{ \Carbon\Carbon::now()->locale('ar')->dayName }}"> </div> <div class="xmarg"></div> <div class="date"> <span class="taken-no">التاريخ</span> <input class="taken-value" type="text" name="taken-value" placeholder="{{ now()->format('d/m/Y') }}"> </div> </div> </div> </div> {{-- ===============> {{ $data }} --}} <div class="container m-auto row"> {{-- <div class="col-12 driver-info"> <h3 class="text-center">بيانات السائق</h3> <div class="table-responsive"> <table class="table table-bordered main-table text-center"> <tr> <td>اسم السائق</td> <td>رقم الهوية</td> <td>رقم الجوال</td> <td>نوع السيارة</td> <td>رقم اللوحة</td> </tr> <tr> <td>{{ $data['userData']['driversName'] }}</td> <td>{{ $data['userData']['driversID'] }}</td> <td>{{ $data['userData']['driversCellPhone'] }}</td> <td>{{ $data['userData']['typeOfCar'] }}</td> <td>{{ $data['userData']['carNumber'] }}</td> </tr> </table> </div> </div> --}} <div class="col-12 client-info"> <h3 class="text-center">بيانات السائق</h3> <div class="table-responsive"> <table class="table table-bordered main-table text-center customer-details"> <tr> <td>اسم السائق</td> <td>رقم الهوية</td> <td>رقم الجوال</td> <td>نوع السيارة</td> <td>رقم اللوحة</td> </tr> <tr> <td>{{ $data['userData']['driversName'] }}</td> <td>{{ $data['userData']['driversID'] }}</td> <td>{{ $data['userData']['driversCellPhone'] }}</td> <td>{{ $data['userData']['typeOfCar'] }}</td> <td>{{ $data['userData']['carNumber'] }}</td> </tr> </table> </div> </div> <div class="col-12 client-info"> <h3 class="text-center">بيانات العميل</h3> <div class="table-responsive"> <table class="table table-bordered main-table text-center customer-details"> <tr> <th style="background-color: rgba(192,192,192,255);">اسم العميل</th> <td style="background-color: rgba(192,192,192,255);" colspan="2"> {{ $data['clientData']['customerName'] }}</td> {{-- <td style="background-color: rgba(192,192,192,255);">رقم العميل</td> --}} <td style="background-color: rgba(192,192,192,255);" colspan="3"> {{-- {{ $data['clientData']['customerMobileNumber'] }} --}} </td> </tr> <tr> <td>جهة القدوم</td> {{-- <td>الرحلة</td> --}} <td>جهة الوصول</td> {{-- <td>جهة المغادرة</td> --}} <td>رقم العميل</td> <td colspan="1">الرحلة</td> {{-- <td>رقم رحلة المغادرة</td> --}} <td colspan="1" class="">ملاحظات</td> {{-- <td>ساعة المغادرة</td> --}} </tr> <tr> <td>{{ $data['clientData']['destinationArrival'] }}</td> <td>{{ $data['clientData']['destination'] }}</td> <td>{{ $data['clientData']['customerMobileNumber'] }}</td> <td>{{ $data['clientData']['flight'] }}</td> <td>{{ $data['clientData']['note'] }}</td> </tr> </table> </div> </div> {{-- <div class="col-lg-5 col"> --}} {{-- <div class="client-info"> <h6 class="text-right">بيانات المرافقين</h6> <div class="table-responsive"> <table class="table table-bordered main-table text-center"> <tr> <th style="background-color: rgb(177, 172, 172);">#</th> <td style="background-color: rgba(192,192,192,255);">اسم المرافق</td> <td style="background-color: rgba(192,192,192,255);">الجنسية</td> <td style="background-color: rgba(192,192,192,255);">رقم الجواز / الهويه</td> </tr> @foreach ($data['morafksData'] as $index => $morafk) <tr> <td>{{ $index + 1 }}</td> <td>{{ $morafk['passengerName'] }}</td> <td>{{ $morafk['nationality'] }}</td> <td>{{ $morafk['identity'] }}</td> </tr> @endforeach </table> </div> </div> --}} <div class="col-12 client-info"> <div class="test"> <div class="table-responsive"> <h3 class="text-center" style="margin-right: 160px">بيانات المرافقين</h3> <table class="table table-bordered main-table text-center customer-details"> <tr> <th style="background-color: rgb(177, 172, 172); width: 5%;">#</th> <td style="background-color: rgba(192,192,192,255); width: 32%;">اسم المرافق</td> <td style="background-color: rgba(192,192,192,255); width: 30%;">الجنسية</td> <td style="background-color: rgba(192,192,192,255); width: 30%;">الجواز / الهويه</td> </tr> @foreach ($data['morafksData'] as $index => $morafk) <tr> <td>{{ $index + 1 }}</td> <td style="white-space: nowrap;">{{ $morafk['passengerName'] }}</td> <td>{{ $morafk['nationality'] }}</td> <td>{{ $morafk['identity'] }}</td> </tr> @endforeach </table> </div> </div> </div> {{-- </div> --}} <div class="row"> <div class="col-lg-6"> <div class="text"> <h4>*** ملاحظة هامة ***</h4> <p>في حالة عدم تطابق بيانات الضيف مع الاثبات تكن عرضة للجزاء وهذاء تعهد منا بذلك</p> <p>شاكرين لكم حسن تعاونكم معنا</p> </div> </div> <div class="col-lg-6 text-start logo-footer"> <img src="{{ URL::asset('ll.png') }}" style="width: 250px margin-top: 70px;" class="img-fluid" alt="logo(wasal)"></a> </div> </div> </div> </body> <script> // استدعاء دالة window.print() عند تحميل الصفحة window.onload = function() { window.print(); } if (window.flutter_inappwebview) { // Send a message to the Flutter side window.flutter_inappwebview.callHandler('printPage'); } if (window.flutter_inappwebview) { window.flutter_inappwebview.callHandler('printPage', 'your arguments here').then(function(result) { // You can optionally handle a response back from Flutter here }); } </script> </html> كود css body { direction: rtl; } .upper-part { display: flex; justify-content: space-between; } .logo-barcode { margin-top: 10px; } .logo-barcode a { background-color: white; text-decoration: none; } .logo-barcode img { width: 100px; height: 100px; } .driver-info { /* margin: 20px; */ } .trip-info { display: flex; justify-content: space-between; } .trip-info div span { color: rgb(255, 165, 0); background-color: black; opacity: 0.8; border-radius: 5px; padding: 5px 4px; text-align: center; font-size: 17px; width: 95px; display: inline-block; } .passngers-span { padding: 15px 30px; } .trip-info div input { max-width: 110px; padding: 3px; font-size: 17px; border-radius: 5px; outline: none; margin: 0px 5px; text-align: center; } @media screen and (max-width: 767px) { .passngers { margin-top: 4px; } .passngers-span { padding: 10px; } .taken-value { max-width: 100px; } .allocate, .date { display: flex; flex-direction: column; width: 30%; } .trip-info div span { margin-bottom: 3px; } } Friends (3).pdf dd.pdf
    1 نقطة
  35. ربما يتم تشغيل في ios على نسخة قديمة من متصفح جوجل كروم لا تدعم خواص css الجديدة 1 - تحديث المتصفح فى الios 2 - اضافة الprefix لخواص css الجديدة تتم كالأتى display: flex; تصبح display: -webkit-flex; وهذا لكل الخواص الجديدة لcss وهذ أكواد الcss الخاصة بك بعد التعديل body { direction: rtl; } .upper-part { display: -webkit-box; /* iOS 6-, Safari 3.1-6 */ display: -moz-box; /* Firefox 19- (buggy but mostly works) */ display: -ms-flexbox; /* IE 10 */ display: -webkit-flex; /* Chrome */ display: flex; justify-content: space-between; } .logo-barcode { margin-top: 10px; } .logo-barcode a { background-color: white; text-decoration: none; } .logo-barcode img { width: 100px; height: 100px; } .driver-info { /* margin: 20px; */ } .trip-info { display: -webkit-box; /* iOS 6-, Safari 3.1-6 */ display: -moz-box; /* Firefox 19- (buggy but mostly works) */ display: -ms-flexbox; /* IE 10 */ display: -webkit-flex; /* Chrome */ display: flex; justify-content: space-between; } .trip-info div span { color: rgb(255, 165, 0); background-color: black; opacity: 0.8; border-radius: 5px; padding: 5px 4px; text-align: center; font-size: 17px; width: 95px; display: inline-block; } .passngers-span { padding: 15px 30px; } .trip-info div input { max-width: 110px; padding: 3px; font-size: 17px; border-radius: 5px; outline: none; margin: 0px 5px; text-align: center; } @media screen and (max-width: 767px) { .passngers { margin-top: 4px; } .passngers-span { padding: 10px; } .taken-value { max-width: 100px; } .allocate, .date { display: -webkit-box; /* iOS 6-, Safari 3.1-6 */ display: -moz-box; /* Firefox 19- (buggy but mostly works) */ display: -ms-flexbox; /* IE 10 */ display: -webkit-flex; /* Chrome */ display: flex; flex-direction: column; width: 30%; } .trip-info div span { margin-bottom: 3px; } }
    1 نقطة
  36. ساحاول تبسيط الشرح علي قدر المستطاع اولا حفظ بيانات مستخدمينا واحد من أهم الأشياء التي نحتاجها في تطوير الويب ، وهذا يمكن أن يوضع تحت مظلة "الأمان". هناك طرق مختلفة لتحقيق ذلك ولاكن بطبع ساشرح بتفاصيل علي حزمة sanctum ما هو sanctum ؟ sanctum هو حزمة بسيطة تستخدم لتنفيذ المصادقة لواجهة برمجة التطبيقات API تم تصميمها لتأمين مسارات واجهة برمجة التطبيقات في تطبيقات لارافيل. sanctum حزمة خفيفة لتثبيتها في المشروع، مما يعني أنه سهل التنفيذ وبسيط. تثبيت الحزمه والتعرف عليها عليك تثبيت الحزمه بواسطة الأمر التالي composer require laravel/sanctum ثما عليك تنفيذ الامر التالي لكي تعمل بدون مشاكل php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" اخر شئ في تثبيت الحزمه php artisan migrate مثال علي استخدام Sanctum يجب عليك إنشاء وحدة التحكم بهذه الطريقه php artisan make:controller UserAuthController كيفية انشاء المصادقه مثل , انشاء الحساب, تسجيل الدخول , تسجيل الخروج عليك الاتجاه لهذه المسار routes\api.php ثم خذه هذه الكود نسخ ثما الصقه بداخل هذه الملف use App\Http\Controllers\AuthController; Route::post('register',[UserAuthController::class,'register']); Route::post('login',[UserAuthController::class,'login']); Route::post('logout',[UserAuthController::class,'logout']) ->middleware('auth:sanctum'); هذا الكود يوضح كيفية تعريف مسارات (Routes) في إطار عمل Laravel للتعامل مع عمليات المصادقة (Authentication). يتم استخدام Sanctum، لتأمين بعض العمليات. المسار 'register' يقوم بتنفيذ الدالة 'register' في AuthController عندما يتم إرسال طلب POST إلى 'register'. المسار 'login' يقوم بتنفيذ الدالة 'login' في AuthController عندما يتم إرسال طلب POST إلى 'login'. المسار 'logout' يقوم بتنفيذ الدالة 'logout' في AuthController عندما يتم إرسال طلب POST إلى 'logout'. ويتم تطبيق مرشح (Middleware) بإسم 'auth:sanctum' على هذا المسار، وهذا يعني أنه يجب أن يكون المستخدم مصادقاً (مسجلاً الدخول) باستخدام Sanctum قبل أن يتمكن من تنفيذ عملية 'logout'. إضافة وظيفة انشاء الحساب انتقل إلى app\http\controllers\UserAuthController وأضف هذه الدوال public function register(Request $request){ $registerUserData = $request->validate([ 'name'=>'required|string', 'email'=>'required|string|email|unique:users', 'password'=>'required|min:8' ]); $user = User::create([ 'name' => $registerUserData['name'], 'email' => $registerUserData['email'], 'password' => Hash::make($registerUserData['password']), ]); return response()->json([ 'message' => 'User Created ', ]); } ضع هذه الكود في الملف هذه وظيفة مختصه في انشاء الحساب , نقوم بالتحقق من صحة البيانات الواردة للتأكد من أن جميع البيانات واضحة وتطابق القاعدة، إذا كانت جميعها جيدة، فتقم بإنشاء مستخدم. إضافة وظيفة تسجيل الدخول public function login(Request $request){ $loginUserData = $request->validate([ 'email'=>'required|string|email', 'password'=>'required|min:8' ]); $user = User::where('email',$loginUserData['email'])->first(); if(!$user || !Hash::check($loginUserData['password'],$user->password)){ return response()->json([ 'message' => 'Invalid Credentials' ],401); } $token = $user->createToken($user->name.'-AuthToken')->plainTextToken; return response()->json([ 'access_token' => $token, ]); } نحن نقوم بالتحقق من صحة الطلب والتأكد من وجود مستخدم بهذه المعلومات، ثم نقوم باستدعاء الدالة createToken() لإنشاء رمز مميز (Token) للمستخدم المسجل عن طريق تمرير اسمه أو أي معلومة ترغب فيها. بعد ذلك، نقوم بالوصول إلى خاصية plainTextToken بتسلسل الوصول للحصول على قيمة الرمز كنص عادي. في النهاية، نقوم بإرجاع استجابة JSON تحتوي على الرمز. في النهايه إضافة وظيفة تسجيل الخروج public function logout(){ auth()->user()->tokens()->delete(); return response()->json([ "message"=>"logged out" ]); } الآن نحصل فقط على المستخدم الذي تمت مصادقته ونحذف الرموز الخاصة به
    1 نقطة
  37. دليل بسيط للاختلافات بينSQL و MySQL تعد SQL وMySQL من أكثر أدوات إدارة البيانات شيوعًا في العالم. ولكن بالنسبة للمبتدئين، أو حتى شخص لديه خبرة أكبر، فإن الفرق بين الاثنين يمكن أن يكون مربكا. ساحاول شرح وتحديد ماهية SQL وMySQL، ونتحقق من الاختلافات بينهما ونتعمق في بعض البدائل الاخري المتوفرة. ما هو SQL؟ SQL تعني "Structured Query Language" وتنطق "إس كيو إل" أو "سيكويل". إنها نوع خاص من لغات البرمجة تُستخدم للتواصل مع قواعد البيانات. إذا كنت ترغب في إضافة البيانات، أو استرجاعها، أو تحديثها في قاعدة البيانات، يمكنك استخدام SQL للقيام بذلك. هذا مهم لأن معظم الشركات تخزن بياناتها في قواعد بيانات. هناك العديد من أنواع قواعد البيانات، ومعظمها يدعم استخدام SQL. سنناقش اثنين من هذه الأنواع في هذا المقال (MySQL و SQL Server)، ولكن هناك العديد من الأنواع الأخرى مثل PostgreSQL و IBM Db2 و Amazon Aurora، لذا يُمكن أن يكون تعلم أساسيات SQL مفيدًا بالنسبة لك بغض النظر عن نوع قاعدة البيانات التي تستخدمها أنت أو شركتك. حقائق ممتعة: أصبحت SQL المعيار الرسمي للمعهد الوطني للمعايير الأمريكي (ANSI) في عام 1986، وللمنظمة الدولية للتوحيد (ISO) في عام 1987. على الرغم من وجودها لعقود، إلا أنها ما زالت تستخدم على نطاق واسع ومطلوبة جدًا في الوقت الحالي! ما هو MySQL ؟ MySQL هو نظام إدارة قواعد البيانات العلاقية مفتوح المصدر (RDBMS) يمتلكه Oracle. إنه أداة شديدة الشهرة لعدة أسباب. أولاً، حالته كمفتوح المصدر تعني أنه يمكن استخدامه بالكامل مجانًا. يمكن للمطورين المحترفين حتى الانغماس مباشرةً وتغيير شفرته المصدرية لتلبية احتياجاتهم إذا كانوا يرغبون في ذلك. على الرغم من أن MySQL مجاني للاستخدام، إلا أن Oracle تقدم خدمات دعم ممتازة يمكن شراؤها من خلال ترخيص تجاري. يتمتع MySQL أيضًا بدعم كبير، ويمكن للمستخدمين تشغيل البرنامج على مجموعة متنوعة من المنصات وأنظمة التشغيل بما في ذلك Windows و Linux و UNIX وغيرها. توفر MySQL محركات تخزين متعددة لجداولها مثل MyISAM و InnoDB و Merge و MEMORY (HEAP) و ARCHIVE و CSV و FEDERATED. على سبيل المثال، يقوم محرك CSV بتخزين البيانات في تنسيق ملف CSV. يمكن استخدام ذلك لنقل البيانات إلى تطبيقات بديلة غير SQL مثل برامج جداول البيانات. لكل من هذه المحركات مزاياها وعيوبها الخاصة. قبل إنشاء قاعدة البيانات الخاصة بك، من المهم فهم كل واحدة منها واختيار الأنسب لجداولك لتعظيم أداء قاعدة البيانات. لقد تناولنا فقط سطح ما يمكن أن يقدمه MySQL. ومع ذلك، يجب أن يكون هذا كافيًا لفهم الاختلافات بين SQL و MySQL. يعود اسم MySQL إلى أحد مؤسسيها - مايكل "مونتي" ويدينيوس - الذي أطلق عليها اسم ابنته "ماي". ما هو الفرق بين SQL و MySQL ؟ باختصار، SQL هي لغة الاستعلام عن قواعد البيانات وMySQL هو منتج قاعدة بيانات مفتوح المصدر. يتم استخدام SQL للوصول إلى البيانات وتحديثها والحفاظ عليها في قاعدة البيانات، وMySQL عبارة عن نظام RDBMS يسمح للمستخدمين بالاحتفاظ بالبيانات الموجودة في قاعدة بيانات منظمة. SQL لا تتغير (كثيرًا)، لأنها لغة. يتم تحديث MySQL بشكل متكرر لأنه جزء من البرنامج. بعباراة الشخص العادي، يمكن اعتبار SQL بمثابة صراف بنك ويمكن اعتبار MySQL بمثابة البنك. تحتاج إلى صراف البنك (SQL) للتواصل مع البنك (MySQL) وتحتاج إلى البنك لإدارة الأموال (البيانات). إنهم يعملون جنبًا إلى جنب لكنهم مختلفون تمامًا. يوجد ايضا بعض المصطلحات التي يجب ان تعرفها ؟ قاعدة البيانات قاعدة البيانات هي مجموعة من البيانات المخزنة في جهاز الكمبيوتر وعادة ما يتم تنظيمها بطريقة تجعل الوصول إلى البيانات سهلاً. نظام إدارة قواعد البيانات المرتبطة قاعدة البيانات العلائقية هي نوع من قواعد البيانات التي تسمح لنا بتحديد البيانات والوصول إليها فيما يتعلق بجزء آخر من البيانات في قاعدة البيانات. يقوم بتخزين البيانات في صفوف وأعمدة في سلسلة من الجداول لجعل المعالجة والاستعلام فعالين. مثال بسيط لقاعدة بيانات علائقية: تخيل شركة صغيرة، الشركة X، التي تتلقى الطلبات من العملاء. يقوم بإعداد جدولين في قاعدة البيانات الخاصة به: جدول_معلومات_العملاء (الذي يحتوي على حقول لمعرف_الزبون، والعنوان، ورقم_الهاتف، وما إلى ذلك...) Customer_orders_table (الذي يحتوي على حقول لمعرف_الزبون، والمنتج، والكمية، وما إلى ذلك...) هناك علاقة بين الجدولين (يشتركان في حقل customer_id). وهذا ما يجعل هذه قاعدة بيانات علائقية. في مستودع الشركة X، يقومون بمعالجة الطلبات من خلال مراجعة السجلات الموجودة في جدول طلبات العملاء. ولكن يمكنهم أيضًا استخدام customer_id في جدول الطلبات للحصول على مزيد من المعلومات حول العميل من جدول معلومات العميل. لا تعتبر هذه طريقة أكثر فعالية لتخزين البيانات فحسب، بل تعني أنه إذا كنت بحاجة إلى تحديث معلومات العميل، فيمكنك القيام بذلك في مكان واحد (جدول معلومات العميل)، بدلاً من الاضطرار إلى تحديث جداول متعددة بمعلومات زائدة عن الحاجة. اكاديمية حسوب تناولت هذه المواضيع بطريقه قويه يمكنك زيارة هذه الرابط للتعمق اكثر في موضوعك هنا
    1 نقطة
  38. شكرا لكم جميعا على. هذه المعلومات القيمة انا فعلا ممتن لكن
    1 نقطة
  39. في عالمنا المتغير بسرعة، يعد الذكاء الاصطناعي أحد أكثر التكنولوجيات انتشارًا وتأثيرًا في حياتنا. فالذكاء الاصطناعي يُعدّ من أكثر التطورات المثيرة والمهمة في عصرنا، إذ يوفر فرصًا جديدة لتطوير حياتنا وأعمالنا بطرق لم نكن نتخيلها من قبل. ومن بين تطبيقات الذكاء الاصطناعي، تأتي العديد من التطبيقات المميزة، مثل التعرف على الصوت والصور والترجمة الفورية، وحتى الروبوتات التي تستطيع العمل بدلاً من الإنسان في بعض المهام. فالذكاء الاصطناعي يوفر العديد من المزايا والفرص لتحسين حياتنا وأعمالنا بشكل كبير. وبالنظر إلى الذكاء الاصطناعي في نطاق الشركات، فهو يتيح لها الفرصة للتحسين من كفاءة عملياتها وتقليل الأخطاء، إلى جانب توفير تحليلات وإحصاءات دقيقة عن البيانات المخزنة والمعالجة. ومن بين أفضل التطبيقات على الذكاء الاصطناعي هي تطبيقات معالجة اللغات الطبيعية و التي انبثقت منها أدوات مثل ChatGPT التي تتيح للمستخدمين التفاعل مع النظام والحصول على إجابات دقيقة وفعالة عن الأسئلة المختلفة التي تتعلق بالمواضيع المختلفة. ChatGPT المقدم من openAI هو مثالٌ على كيف يمكن للذكاء الاصطناعي أن يساعد في التواصل بين الناس، فهو يوفر فرصة للتفاعل الفعال والدقيق بين المستخدمين والنظام. وبفضل تقنيات الذكاء الاصطناعي الحديثة، يستطيع ChatGPT التعرف على مواضيع وأسئلة مختلفة وتقديم إجابات دقيقة ومفيد ما هي OpenAI API هل تريد تطوير تطبيقات وأدوات تعتمد على تقنيات الذكاء الاصطناعي بسهولة وبدون الحاجة إلى دراسة عميقة في هذا المجال؟ هذا بالضبط ما يوفره OpenAI API، حيث يمكن للمطورين الاستفادة من الأدوات المتطورة لتطوير التطبيقات التي تستند إلى الذكاء الاصطناعي. يعد OpenAI API من أكثر الواجهات البرمجية شيوعًا في مجال الذكاء الاصطناعي، حيث يوفر للمطورين الوصول إلى النماذج الأكثر تطورًا للتعلم الآلي والتي تدعم العديد من التطبيقات والأدوات. فباستخدام هذه الواجهة البرمجية، يمكن للمطورين إنشاء تطبيقات متطورة تعتمد على الذكاء الاصطناعي في مجالات مختلفة مثل التسويق والتعليم والصحة والإدارة والمالية وغيرها. ومن بين أهم التطبيقات التي يمكن استخدام OpenAI API فيها هي التحدث مع الآلة والتعرف على الصور والنصوص والتحكم في الأجهزة الذكية. كما يمكن استخدامها في مجالات مختلفة مثل الروبوتات والألعاب والتصميم والترجمة والعديد من التطبيقات الأخرى. وبفضل تقنياتها المتطورة، تمكّن OpenAI API المستخدمين من الوصول إلى أدوات ونماذج التعلم الآلي الأكثر تطورًا، مما يجعلها خيارًا جيدًا للمطورين الذين يبحثون عن الحلول الفعالة لتطوير التطبيقات التي تعتمد على الذكاء الاصطناعي. نتعلم في هذا المقال كيفية الاستفادة من واجهة OpenAI API والاتصال بخدمة ChatGPT واستعمالها في تطبيق عملي بسيط، ويمكنك أنت بعد ذلك استعمالها في أي تطبيق تريده. فكرة المشروع ومتطلباته في هذا المقال، سنستكشف كيفية إنشاء مساعد شخصي باستخدام ChatGPT API بطريقة فعالة ومبتكرة، وكيفية تخصيص تجربة المستخدم لتلبية احتياجاتهم الفردية، سنتحدث أيضًا عن أهمية هذه التقنية في عالمنا الرقمي الحديث، وكيف يمكن أن يكون بناء مساعد شخصي باستخدام ChatGPT API استثمارًا قيماً و لكن قبل الشروع في التنفيذ علينا أن نلقي نظرة خاطفة على التقنيات المستخدمة لربط ChatGpt برمجيًا باستخدام Node.js. المتطلبات المسبقة لبناء المشروع: تثبيت بيئة Nodejs: لمن لا يعرفها، هي بيئة تشغيل JavaScript خارج المتصفح. إطار العمل Express.js: لتطوير تطبيقات الويب باستخدام Node.js، وارجع إلى مقال إعداد بيئة تطوير Node مع Express من أجل تثبيته مع Node.js. واجهة OpenAI API: توفر خدمات وأدوات للمطورين لإنشاء تطبيقات وأنظمة تعتمد على تقنيات الذكاء الاصطناعي. وتشمل خدمات OpenAI API العديد من الأدوات والتقنيات مثل GPT-3 وDALL-E ومنصة الاستكشاف للتحليلات اللغوية وتطبيقات الروبوتات والعديد من الخدمات الأخرى. الآن سنقوم بكتابة الكود البرمجي خطوة بخطوة، بدءًا من إعداد بيانات الواجهة API وصولاً إلى بناء بوت دردشة يمكنه فهم استفسارات المستخدمين والرد عليها بلغة طبيعية. تهيئة المشروع ننشئ مجلدًا جديدًا عن طريق إدخال التعليمات التالية في الطرفية terminal ونطلق عليه اسم خاص بالمشروع: $ mkdir chatgpt-api-bot $ cd chatgpt-api-bot ننشئ ملف package.json عبر الأمر التالي: $ npm init -y نضيف الحزم التالية: openai: توفر مكتبة OpenAI Node.js وصولاً إلى واجهة OpenAI API من تطبيقات Node.js readline-sync: توفر قراءة متزامنة إدخالات المستخدم من سطر الأوامر Dotenv: تسمح لنا بادارة المتغيرات في الملف ‎.env داخل بيئة المشروع إطار العمل Expressjs body-parser: تسمح لك بمعالجة الطلبات بتنسيقات مختلفة مثل JSON و XML. $ npm i openai@4.20.0 readline-sync@1.4.10 dotenv@16.3.1 express@4.18.2 body-parser إنشاء مفتاح api من OpenAI لكي نتمكن من استخدام واجهة OpenAI API داخل تطبيق Node.js، نحتاج أولاً إلى إنشاء مفتاح API من لوحة تحكم OpenAI. لإنشاء المفتاح، نتحتاج إلى إنشاء حساب مستخدم على https://openai.com والوصول إلى قسم مفاتيح واجهة برمجة التطبيقات في لوحة تحكم OpenAI ثم إنشاء مفتاح جديد. هذا المفتاح سري ويجب ألا يتم مشاركته مع أي شخص آخر، سنحتاج إلى استخدام هذا المفتاح لاحقًا عند تنفيذ برنامج Node.js للوصول إلى OpenAI API. نضيف هذا المفتاح إلى متغير البيئة في المشروع الخاص بنا، حيث ننشئ ملفًا جديدًا: touch .env نضيف في هذا الملف المتغير OPENAI_API_KEY ونسند له قيمة المفتاح api الذي نسخناه للتو: OPENAI_API_KEY="YOUR OPEN AI API KEY" بناء الواجهة الخلفية backEnd الخاص بالمشروع ننشئ ملف المشروع و ليكن اسمه index.js: $ touch index.js داخل ملف index.js نبدأ في كتابة الكود ونقوم أولا باستدعاء الحزم التي قمنا بتحميلها داخل المشروع: const express = require("express"); const bodyParser = require("body-parser"); const OpenAI = require("openai"); require("dotenv").config(); Configuration و OpenAIApi هي كائنات من حزمة OpenAI، والتي تستخدم للاتصال بواجهة OpenAI API واستخدامها dotenv لتحميل متغيرات بيئة المشروع من ملف ‎.env ننشئ بعد ذلك خادم المشروع عبر Express: const app = express(); const port = 3000; app.listen(port, () => { console.log(`Server is listening on port ${port}`); }); بناء كود الربط بين openAI api والتطبيق نضبط مكتبة openai بتمرير قيمة المفتاح الموجود في ملف بيئة المشروع: const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); ننشئ الآن مصفوفة فارغة لتخزين سجل المحادثة ضمنها والتي من شأنها توفير سياق المحادثة للذكاء الاصطناعي لتوليد الإجابات المناسبة: const history = []; ننشئ مصفوفة للرسائل ثم نستخدم حلقة for لتكرار سجل المحادثة وإنشاء قائمة بالرسائل بالتنسيق المناسب لبوت الدردشة ChatGPT الخاص بـ OpenAI. و إعطاء كل رسالة دور role (إما "مستخدم" أو "مساعد ") والمحتوى (نص الرسالة)، ولمزيد من التفصيل يمكن الإطلاع على صفحة Text generation models من openAI. نضيف بعد ذلك مدخلات المستخدم user_input ودوره الحالي إلى نهاية مصفوفة الرسائل: const messages = []; for (const [input_text, completion_text] of history) { messages.push({ role: "user", content: input_text }); messages.push({ role: "assistant", content: completion_text }); } messages.push({ role: "user", content: user_input }); الآن نستخدم openai.createChatCompletion لتوليد رد من OpenAI API وندخل معامل نموذج الذكاء الاصطناعي الخاص بتوليد الرد وهو نموذج gpt-3.5-turbo: const completion = await openai.createChatCompletion({ model: "gpt-3.5-turbo", messages: messages, }); يوجد أكثر من معامل ويمكنك زيارة صفحة models لمعرفة المعاملات المتوفرة واختلافها ومعامل الرسائل messages أيضًا. نستخدم بعد ذلك التابع createChatCompletion لتوليد الاجابة من خلال الواجهة openAi API، ويتم استخراج الاستجابة التي تم إنشاؤها من نموذج ذكاء اصطناعي AI من الكائن completion ونخزنها في المتغير completion_text، ثم نطبع الاجابة في الطرفية. const completion_text = completion.choices[0].message.content; console.log(completion_text); ندخل البيانات التالية إلى مصفوفة سجل المحادثة: النص الحالي الذي أدخله المستخدم user_input والرد الذي تم إنشاؤه من قبل نموذج الذكاء الاصطناعي completion_text: history.push([user_input, completion_text]); ثم نعالج الأخطاء التي يمكن أن تحدث أثناء تنفيذ الطلب بطباعة كود الخطأ ومعلومات عن الخطأ عن طريق استخدام try/catch في JavaScript: try{ // code here } catch (error) { if (error.response) { console.log(error.response.status); console.log(error.response.data); } else { console.log(error.message); } } ما هي عمليات CRUD؟ عمليات CRUD هي اختصار للعمليات الأربعة الأساسية التي يتم استخدامها في إدارة البيانات وهي الإنشاء Create والقراءة Read والتحديث Update والحذف Delete، ويتم استخدام هذه العمليات في العادة في تطوير تطبيقات الويب والبرمجيات المختلفة التي تتعامل مع قواعد البيانات. ويوفر إطار العمل Express وظائف مختلفة لتسهيل عمليات الإنشاء والقراءة والتحديث والحذف والتي تتماشى مع عمليات CRUD. على سبيل المثال، يوفر Express وظائف لمعالجة طلبات http مثل: app.post()‎ للإنشاء app.get()‎ للقراءة app.put()‎ للتحديث app.delete()‎ للحذف ويمكن استخدام هذه الوظائف لتنفيذ عمليات CRUD بسهولة في تطبيقات Express، مما يساعد في إدارة البيانات بشكل فعال. بناء نقاط الوصول الخاصة بالمشروع سنستخدم في مشروعنا عمليتين فقط لإدارة البيانات وهما عملية الإنشاء وعملية القراءة حاليًا. نقوم بقراءة ملف index.html الذي سننشئه لاحقًا لعرض الواجهة الأمامية للتطبيق: // Serve the index.html file app.get('/', (req, res) => { res.sendFile(__dirname + '/index.html'); }); لمعالجة الرسائل القادمة من المستخدم نستخدم app.post ونقوم بكتابة كود الربط بين واجهة openAi APi والتطبيق داخل الدالة ونضيف الاستجابة اللي سوف تعود لنا من openAi APi: … app.post('/message', async (req, res) => { const message = req.body.message; // If there is a previous message, include it in the prompt const user_input = history.length > 0 ? `سجل المحادثة:\n${history.join('\n')}\nأنت: ${message}\n` : `أنت: ${message}\n`; const messages = []; for (const [input_text, completion_text] of history) { messages.push({ role: "user", content: input_text }); messages.push({ role: "assistant", content: completion_text }); } messages.push({ role: "user", content: user_input }); try { const completion = await openai.chat.completions.create({ model: "gpt-3.5-turbo", messages: messages, }); const completion_text = completion.choices[0].message.content; console.log(completion_text); history.push([user_input, completion_text]); res.json({ message: completion_text }); } catch (error) { if (error.response) { console.log(error.response.status); console.log(error.response.data); res.status(500).json({ error: 'Something went wrong' }); } else { console.log(error.message); res.status(500).json({ error: 'Something went wrong' }); } } }); لاحظ أننا قمنا بتخزين الرسائل القادمة من طلب http المرسل من المستخدم داخل المتغير message: message = req.body.message; وأعدنا الاستجابة التي نحصل عليها عبر: res.json({ message: completion_text }); انتهينا الآن من بناء الواجهة الخلفية للتطبيق وهي جاهزة للعمل، وكخطوة إضافية تُطلب عادة في اختبار الواجهات الخلفية، يمكنك تجربة نقاط الوصول عبر تطبيق postman أو Insomnia والتأكد من أن كل شيء يعمل بشكل صحيح. بناء الواجهة التفاعلية للتطبيق سنبدأ الآن بناء الواجهة الأمامية للتطبيق وهي صفحة HTML بسيطة تمكن من التفاعل مع خدمة ChatGPT ورؤية النتيجة مباشرةً. إنشاء الصفحة الرئيسية ننشئ ملف index.html الذي يمثل واجهة التطبيق الذي نعمل على بنائه: $ touch index.html نضيف كود HTML الأساسي ونضع ضمن وسم title عنوان الصفحة ولتكن دردش مع البوت chatbot: <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <title>دردش مع البوت chatbot</title> </head> <body> </body> </html> الآن نكتب كود الصفحة داخل وسم body: <div id="container"> <h1>دردش مع البوت chatbot</h1> <div id="conversation"></div> <form> <input type="text" id="message" placeholder="اكتب رسالتك هنا" /> <button type="submit">إرسال</button> </form> </div> هنا قمنا بإضافة عنوان يظهر بأعلى الصفحة واستمارة form تحوي قسمًا لإدخال استفسارات المستخدم وزر الإرسال، ثم نعرض المحادثة داخل العنصر <div id="conversation"></div>. تنسيق الصفحة الرئيسية نقوم بوضع الكود التالي ضمن وسم <head> وهو تنسيق جاهز بسيط أضفناه للصفحة ويمكنك تعديله أو كتابة التنسيق الخاص بك: <style> body { font-family: Arial, sans-serif; margin: 0; padding: 0; } #container { padding: 8rem 16rem; } h1 { text-align: center; margin: 2rem 0; } form { display: flex; justify-content: space-between; align-items: center; margin: 2rem 0; } input[type="text"] { height: 2rem; flex: 1; padding: 1rem; font-size: 1.2rem; border-radius: 0.5rem; border: none; box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); } button[type="submit"] { height: 4rem; padding: 0 1.2rem; margin-right: 1rem; font-size: 1.2rem; border-radius: 0.5rem; border: none; background-color: #007bff; color: white; cursor: pointer; } #conversation { margin: 2rem; } p { margin: 0.5rem 0; } .user { color: #007bff; font-weight: bold; } .chatbot { color: #333; font-weight: bold; width: 50%; } </style> الصفحة بسيطة وستظهر بالشكل التالي: سنعمل بعدها على تركيب أجزاء المشروع مع بعضها بربط الواجهة الأمامية مع الخلفية وتجربة خصائصه. ربط الواجهة الأمامية مع الواجهة الخلفية الآن نكتب الكود الخاص بربط الواجهة الخلفية مع الواجهة التفاعلية الأمامية ونضيفه ضمن وسم body: <script> const conversationElem = document.getElementById('conversation'); const messageInput = document.getElementById('message'); // Send message to chatbot on form submit document.querySelector('form').addEventListener('submit', async (event) => { event.preventDefault(); const message = messageInput.value; messageInput.value = ''; // Send message to server and wait for response const response = await fetch('/message', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message }) }).then(res => res.json()); // Add user message and chatbot response to conversation conversationElem.innerHTML += `<p class="user">أنت: ${message}</p>`; conversationElem.innerHTML += `<p class="chatbot">البوت: ${response.message}</p>`; console.log(response.message) }); </script> قمنا بتعريف متغيرين الأول هو conversationElem لقسم المحادثة والثاني messageInput لمدخلات المستخدم ثم قمنا باختيار النموذج الذي انشأناه في ملف index.html لمعالجة البيانات المدخلة وإرسالها إلى الواجهة الخلفية، ونستخدم لذلك الغرض دالة fetch من خلال عملية post التي قمنا بشرحها سابقًا. ثم نقوم باضافة رسالة المستخدم واستجابة بوت المحادثة المرسلة من الواجهة الخلفية للتطبيق من خلال استخدام الدالة innerHTML ونضيف العناصر ضمن وسم النص <p> ونكون بذلك قد انتهينا من المشروع النموذجي. الكود النهائي للمشروع ملف index.js: const express = require("express"); const bodyParser = require("body-parser"); const OpenAI = require("openai"); require("dotenv").config(); const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); const app = express(); const port = 3000; // Array to store previous messages const history = []; // Middleware to parse JSON in the request body app.use(bodyParser.json()); // Serve the index.html file app.get("/", (req, res) => { res.sendFile(__dirname + "/index.html"); }); // Handle incoming messages app.post("/message", async (req, res) => { const message = req.body.message; // If there is a previous message, include it in the prompt const user_input = history.length > 0 ? `سجل المحادثة:\n${history.join("\n")}\nأنت: ${message}\n` : `أنت: ${message}\n`; const messages = []; for (const [input_text, completion_text] of history) { messages.push({ role: "user", content: input_text }); messages.push({ role: "assistant", content: completion_text }); } messages.push({ role: "user", content: user_input }); try { const completion = await openai.chat.completions.create({ model: "gpt-3.5-turbo", messages: messages, }); const completion_text = completion.data.choices[0].message.content; console.log(completion_text); history.push([user_input, completion_text]); res.json({ message: completion_text }); } catch (error) { if (error.response) { console.log(error.response.status); console.log(error.response.data); res.status(500).json({ error: "Something went wrong" }); } else { console.log(error.message); res.status(500).json({ error: "Something went wrong" }); } } }); // Start the server app.listen(port, () => { console.log(`Server is listening on port ${port}`); }); ملف index.html: <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <style> body { font-family: Arial, sans-serif; margin: 0; padding: 0; } #container { padding: 8rem 16rem; } h1 { text-align: center; margin: 2rem 0; } form { display: flex; justify-content: space-between; align-items: center; margin: 2rem 0; } input[type="text"] { height: 2rem; flex: 1; padding: 1rem; font-size: 1.2rem; border-radius: 0.5rem; border: none; box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); } button[type="submit"] { height: 4rem; padding: 0 1.2rem; margin-right: 1rem; font-size: 1.2rem; border-radius: 0.5rem; border: none; background-color: #007bff; color: white; cursor: pointer; } #conversation { margin: 2rem; } p { margin: 0.5rem 0; } .user { color: #007bff; font-weight: bold; } .chatbot { color: #333; font-weight: bold; width: 50%; } </style> <title>دردش مع البوت chatbot</title> </head> <body> <div id="container"> <h1>دردش مع البوت chatbot</h1> <div id="conversation"></div> <form> <input type="text" id="message" placeholder="اكتب رسالتك هنا" /> <button type="submit">إرسال</button> </form> </div> <script> const conversationElem = document.getElementById("conversation"); const messageInput = document.getElementById("message"); // Send message to chatbot on form submit document .querySelector("form") .addEventListener("submit", async (event) => { event.preventDefault(); const message = messageInput.value; messageInput.value = ""; // Send message to server and wait for response const response = await fetch("/message", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ message }), }).then((res) => res.json()); // Add user message and chatbot response to conversation conversationElem.innerHTML += `<p class="user">أنت: ${message}</p>`; conversationElem.innerHTML += `<p class="chatbot">البوت: ${response.message}</p>`; console.log(response.message); }); </script> </body> </html> تجربة التطبيق ندخل الأمر التالي بالطرفية لتشغيل التطبيق: $ node index.js ثم نذهب للمتصفح ونقوم بإدخال العنوان التالي localhost:3000 لتظهر لنا واجهة التطبيق، ندخل أي سؤال وليكن كتابة قصة قصيرة وننتظر الرد من التطبيق كما في الصورة التالية: يمكنك تحميل كود التطبيق من هنا chatgpt-api-bot.zip تطويرات يمكن إضافتها للمشروع يمكننا تطوير المشروع السابق بالعديد من الطرق، ومنها: إضافة ميزات لبوت الدردشة: يمكنك إضافة ميزات جديدة مثل إضافة قائمة من الخيارات للمستخدم للاختيار من بينها مثل إضافة طريقة رد البوت هل هي بطريقة جدية أو بطريقة مضحكة أو بسخرية …إلخ، أو تمكين البوت من إجراء بعض العمليات الرياضية أو توفير إجابات علمية أو حتى إنشاء بوت لتعلم شيء جديد مثل تعلم البرمجة أو تعلم الإنجليزية وهكذا. تحسين واجهة المستخدم: يمكنك تحسين واجهة المستخدم لتبدو أكثر جاذبية وسهولة في الاستخدام، ويمكنك استخدام مكتبات CSS المختلفة لتحسين التصميم والإضاءة على المكونات المهمة في الصفحة. تخزين المحادثات: يمكنك إضافة القدرة على تخزين المحادثات السابقة بين المستخدم والشات بوت، وعرضها للمستخدم عند الضرورة. إضافة تحليلات: يمكنك إضافة تحليلات للمحادثات، مثل عدد المحادثات الناجحة والمحادثات التي تم إنهاؤها بشكل مبكر التي قام المستخدم باغلاقها، وعرضها بشكل رسومي لمساعدتك في تحسين أداء البوت. استخدام مكتبة React أو Vue لتصميم واجهة أمامية تفاعلية أكثر وأداء أفضل. ربط البوت مع خدمات openAI الأخرى المختلفة مثل استعمال رده في توليد صورة من خدمة DALL·E هذه بعض الأفكار التي يمكن تطبيقها لتطوير مشروع الدردشة ويمكنك استخدامها كنقطة انطلاق لمشاريعك المستقبلية، ويمكنك أن تطلع على صفحة الأمثلة من openAI التي تحوي على عشرات الأمثلة والتطبيقات التي يمكن الاستلهام منها والبناء عليها. الخلاصة بهذا نكون قد انتهينا من هذا المقال الذي شرحنا فيه كيفية ربط واجهة برمجة تطبيقات OpenAI API عبر خدمة ChatGPT مع Node.js لإنشاء بوت دردشة بسيط. وباستخدام هذه التقنيات يمكن للمطورين إضافة قيمة كبيرة لتطبيقاتهم على الويب، وتوفير تجربة مميزة للمستخدمين، وكما رأينا، فإن استخدام OpenAI's ChatGPT في Node.js ليس صعبًا بقدر ما يبدو، ويمكن لأي مطور أن يبدأ في تجربتها والاستفادة منها. ومن المؤكد أننا سنشهد مزيدًا من التطورات والتحسينات في مجال الذكاء الاصطناعي والبوتات الذكية في المستقبل، ولذلك يجب أن نستعد لمواكبة هذه التحولات والتطورات بالاستمرار في تعلم وتحسين مهاراتنا في هذا المجال، فلا شك أنه بالعمل الجاد والاستمرار في الابتكار، يمكن للجميع أن يحققوا نجاحات كبيرة في هذا المجال الواعد. اقرأ أيضًا دليل استخدام ChatGPT API لتحسين خدماتك عبر الإنترنت تطوير تطبيق 'وصفة' لاقتراح الوجبات باستخدام ChatGPT و DALL-E في PHP تطوير تطبيق 'علمني' لاستكشاف المواضيع باستخدام جافا سكريبت و ChatGPT
    1 نقطة
  40. قواعد البيانات DataBase هي بحر واسع وأساس ضروري، فكل ما تراه من أنظمة كبيرة ومتطورة تتعامل مع البيانات فتخزنها وتسترجعها عبر قواعد البيانات، إذ تُعدُّ إحدى أهم البنى التحتية لأي نظام إلكتروني؛ ولكن ما هي قاعد البيانات؟ وما أهميتها؟ وما أنواعها؟ وماذا نحتاج لتصميمها؟ كل هذه الأسئلة سنجيب عنها في هذا المقال بالإضافة إلى معلومات أخرى ستفيدك في تكوين فكرة مبدئية عنها فسيساعدك المقال في الدخول إلى هذا العالم الشيق. مفهوم قواعد البيانات تُعَدّ قواعدة البيانات -أو قاعدة المعطيات- وسيلةً من وسائل تجميع وحفظ البيانات في مكان واحد ومنظم يساعد على إدارتها والتعامل معها والاستفادة منها، فهي تشبه الوعاء الجامع للبيانات وخزانة الملابس التي تخزن الملابس بطريقة منظمة مرتبة تسهل استخراج أي لباس بسهولة وسرعة. تخزن قاعد البيانات البيانات فيها بطريقة تسمح الوصول إليها وتعديلها واسترجاعها وإدارتها بطريقة ذكية وسريعة، وغالبًا ما تُحفَظ البيانات في مجموعة من الكيانات التي تعبِّر عن نوع معيَّن مثل كيان المعلومات الشخصية عن الموظفين وبداخل كل كيان مجموعة من الواصفات التي تمثَّل بأعمدة الكيان مثل اسم الموظف وتاريخ ميلاده، …إلخ، ويمكن النظر إلى قاعدة البيانات على أنها مخزن مركزي للبيانات يمكن للجميع الوصول إليه والنهل منه. يُرمَز إلى قاعدة البيانات عمومًا بمجسّم أسطواني يشبه الخزان لأنه يُقصد بها خزّان للبيانات، وقد ابتُكرت أداة جديدة مع تطور قاعد البيانات لتسهيل إدارتها في منتصف القرن الماضي تقريبًا من خلال نظام برمجي خاص يدعى نظام إدارة قواعد البيانات DataBase Management System أو DBMS اختصارًا. مفهوم نظام إدارة قاعدة البيانات يمكِّن نظام إدارة قواعد البيانات Database management system -وتختصر إلى DBMS- المستخدِمين من إنشاء قاعدة البيانات وإدارتها وصيانتها والتحكم في الوصول إليها فلا يمكن التعامل معها مباشرةً ويكون نظام إدارة قاعد البيانات وسيطًا بين المستخدمين وبين قاعدة البيانات، كما يساعدهم على توفير بيئة ملائمة لهم ليتمكنوا من تخزين البيانات فيها واسترجاعها وتعديلها وحذفها منها، بالإضافة إلى أنه يساعد في عمليات التسجيل loging والمراقبة monitoring. ومن أشهر أنظمة إدارة قواعد البيانات DBMS: مايكروسوفت أكسس Microsoft Access: نظام إدارة قواعد بيانات خفيف وبسيط ذو واجهة سهلة الاستخدام لغير المختصين يُستعمل في حالات بسيطة أو متوسطة متعلقة غالبًا بأمور مكتبية ويأتي مدمجًا مع حزمة مايكروسوفت أوفيس. نظام أوراكل Oracle: وهو نظام إدارة قواعد البيانات العلائقية. SQL Server: نظام إدارة قواعد البيانات العلائقية مدفوع من مايكروسوفت وهو قادر على التعامل مع كم بيانات ضخم ما يجعله مناسبًا للشركات الكبيرة. IBM Db2: نظام DBMS متطور من شركة IBM يوفر الكثير من الخيارات والتخصيصات التي تناسب مختلف المشاريع (المتوسطة والكبيرة عادةً). MySQL: نظام DBMS مفتوح المصدر تديره شركة أوراكل. MariaDB: نظام DBMS مفتوح المصدر يعد نظامًا مشتقًا من MySQL مع بعض التحسينات والتعديلات المضافة عليه. PostgreSQL: نظام DBMS مفتوح المصدر يتصف بالمرونة والشمولية ويناسب أغلب المشاريع. ملاحظة: إذا كانت قاعدة البيانات علائقيةً بمعنى أنها تتألف من عدة جداول ترتبط فيما بينها بعلاقات كما سنرى لاحقًا، فعندئذ سيطلق على هذا النظام اسم نظام إدارة قواعد البيانات العلائقية. تعتمد نظم إدارة قواعد البيانات لغات برمجة خاصة تدعى لغات الاستعلام Query Language يستطيع المستخدِم من خلالها التعامل مع البيانات، وفي حال البيانات الهيكلية تكون لغة البرمجة المستخدَمة هي لغة الاستعلام البنيوية Structured Query Language أو SQL اختصارًا. ويدير النظام كل من البيانات وتخطيط قاعدة البيانات Database Schema بالإضافة إلى محرّك قاعدة البيانات الذي يسمح بالوصول إلى البيانات أو تعديلها أو منع الوصول إليها، إذ تهدف كل هذه الأمور إلى تحقيق عدة خصائص سنتعرف عليها في الفقرة التالية. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن أهمية قواعد البيانات تكمن أهميتها بامتلاكها الكثير من الخصائص التي تميزها عن النظام القائم على إدارة الملفات file-based system وطرق التخزين التقليدية الأخرى، ومن أهمها: تحقيق أمن البيانات والسرية، إذ لا يمكن الوصول إلى إليها إلا عن طريق أشخاص محددين وبصلاحيات مقيدة، بحيث لا يمتلك جميع مستخدِمي قاعدة البيانات الصلاحيات ذاتها للوصول إليها مثل صلاحيات القراءة والكتابة والإدارة وغيرها. تحقيق سلامة البيانات data integrity، إذ يمكن إضافة قيود على القاعدة تجبر المستخدِم على إدخال البيانات وفق نمط ونوع معيّن، بحيث لا يمكن إضافة سلسلة نصية مكان عمر المستخدِم على سبيل المثال، كما يمكن إضافة قيود تمنع إضافة قيمة موجودة مسبقًا. تأمين الوصول المتزامن، بحيث تسمح لأكثر من مستخدِم لديه صلاحية الوصول من الوصول إلى البيانات نفسها وبالوقت نفسه دون التأثير السلبي عليها. تمكنك من إضافة أنواع متنوعة من البيانات، أي يمكن إضافة اسم الشخص مع عمره مع تاريخ ميلاده على سبيل المثال على الرغم من أنّ كل قيمة تعود إلى نمط معيّن، أي يمكن إضافة سلسلة نصية مع عدد مع تاريخ دون وجود أية مشاكل. منع تكرار البيانات وتسهيل التعديل عليها من مكان واحد بإضافة شروط خاصة على بنية قاعدة البيانات أو بتقسيمها إلى عدة جداول وربطها ببعضها مثل إنشاء جدول للمؤلفين وجدول للمدونات يضم تفاصيل المدونة مع عمود يحدد مُعرِّف ID كل مؤلف ويُربط بينهما بعلاقة تشكل جدول رابط بسهولة بحيث يسهل التعديل على جدول البيانات والمؤلفين بشكل منفصل. تنسيق وتنظيم البيانات، وبالتالي عرضها بصورة منظمة والوصول إليها باستعلام برمجي معيّن وواضح وصريح. الوصول إلى بيانات محددة بسرعة كبيرة، ويتحقق ذلك من خلال لغات الاستعلام وتعليمات وبُنى برمجية مخصصة لهذا الغرض، وخاصةً في حال استخدام الفهارس indexes. تسهيل عملية التعديل والتحديث على البيانات، بالإضافة إلى عمليات الحذف والإضافة، مما يضمن لك الدقة في تلك العمليات. تقليل المساحات المستخدَمة، إذ تُوفَّر المساحات الهائلة على مكاتب الأرشفة عند استخدام قواعد البيانات بدلًا من وسائل التخزين الورقية. حماية البيانات من الضياع والقدرة على استرجاعها في حال تعرضت للتلف من خلال النسخ الاحتياطي backup. استخدامات قاعدة البيانات تُستخدَم قاعدة البيانات في كل نظام برمجي تراه اليوم أمامك خلف الشاشة مثل وسائل التواصل الاجتماعي والمدونات وتطبيقات الويب والبرامج والتطبيقات الخدمية مثل إدارة المستشفيات وغيرها لأهداف عديدة منها: تحسين العمليات التجارية، إذ تجمع الشركات بيانات حول العمليات التجارية مثل المبيعات ومعالجة الطلبات وخدمة العملاء ثم تحلل هذه البيانات لتحسين العمليات وتوسيع أعمالهم وزيادة الإيرادات. تتبع العملاء وكل بياناتهم، إذ تُخزّن معلومات المستخدِمين والعملاء ضمن القاعدة، مما يساعد على معالجة هذه المعلومات وعرضها واستخدامها بعدة أشكال مفيدة. تأمين المعلومات الصحية الشخصية، إذ تخزن البيانات ضمن جداول لمعالجتها واستخدامها لاحقًا في مراقبة المرضى وتحسين رعايتهم بل حتى في إجراء تحليلات للتنبؤ بحالات مرضية أو إيجاد علاج لحالات مرضية أخرى. تخزين البيانات الشخصية مثل التخزين السحابي المستخدَم لتخزين الوسائط مثل الصور. هل ترغب في برمجة قواعد بيانات وإدارتها بكفاءة وفاعلية؟ وظّف مبرمج قواعد بيانات محترف من مستقل أضف مشروعك الآن أنواع قواعد البيانات تختلف وتتعدد أنواع قواعد البيانات، وهذا الاختلاف ينبع بالدرجة الأولى من التقدم بالزمن وما صاحبه من تقدم في العلوم والتقنيات، ومن ثم بالدرجة الثانية ينبع من التقنيات والخصائص المتعددة لها وما تقدمه من خدمات، ومن بين هذه الأنواع ما يلي: قواعد البيانات العلائقية Relational Database قواعد البيانات غير العلائقية Non-relational Database قواعد البيانات الهرمية Hierarchy Database قواعد البيانات الشبكية Network Database قواعد البيانات السحابية Cloud Database قواعد البيانات العلائقية Relational Database هي مجموعة من الجداول المرتبطة فيما بينها بعلاقات تضبط المعلومات في تلك الجداول وتسهل الوصول إلى المعلومات المطلوبة، ويتميز هذا النوع بالمرونة وهي إمكانية التعديل على الجداول والعلاقات بينها من إضافة وحذف في أيّ وقت، كما ترتبط الجداول فيما بينها بعدة علاقات والتي تعطي قواعد البيانات العلائقية اسمها. يتألف الجدول من مجموعة من الأسطر -أو السجلات records- ومجموعة من الأعمدة -أو السمات attributes-، وتكون مجموعة الأعمدة ثابتة ولكل منها نمط معيّن بحيث يكون خاص بالأعداد أو السلاسل النصية أو التاريخ …إلخ؛ أما الأسطر فعددها غير محدود تبعًا للبيانات المراد تخزينها، كما ينبغي عدم تكرار السطر للحفاظ على جودتها، ويتحقق ذلك بوضع شروط خاصة على الأعمدة بأن يكون فريدًا unique مثلًا. من الجدير بالذكر أنّ قاعدة البيانات هذه تتميز أيضًا باحتوائها على علاقات تربط جداولها ببعضها بعضًا ولذلك سميت بالعلائقية وتسمى أيضًا بنموذج الكيان والعلاقة entity relationship أو ER اختصارًا، أي نربط البيانات بعلاقات تسهل علينا الوصول إليها وتعديلها وتجنبنا تكرارها في عدة مواضع، وبالتالي توجد عدة أنواع للعلاقة أهمها علاقة واحد إلى واحد وعلاقة واحد إلى متعدد، فإذا كان لدينا جدولًا يمثِّل الصفوف الدراسية وجدولًا يمثِّل الطلاب على سبيل المثال، فكل صف دراسي يحتوي على عدة طلاب، في حين ينتمي الطالب إلى صف واحد خلال العام الدراسي، فالعلاقة هنا بين جدولَي الطلاب والصفوف الدراسية هي علاقة واحد إلى متعدد؛ أما علاقة واحد إلى واحد فتكون بين جدولَي المديرين وجدول المدارس، إذ يدير المدرسة مدير وحيد كما يشرف المدير على مدرسة واحدة لا أكثر، وهكذا. قواعد البيانات غير العلائقية Non-relational Database يسمح هذا النوع بحفظ بيانات غير مرتبة Unstructured Data ويطلق عليه أيضًا No-SQL Database، وقد ظهر هذا النوع في عصر تضخم البيانات وزيادة حجمها، وبالطبع يُعَدّ هذا النوع نوعًا سيئًا لإمكانية تكرار البيانات بكثرة، مما يؤدي إلى زيادة حجم مكان التخزين بسرعة وزيادة كلفة التعديل في حال أردت إجراء تعديل على اسم المستخدِم على سبيل المثال والمكرر عشرات المرات، في حين يُعَدّ ممتازًا من أجل التطبيقات البسيطة التي تحتاج إلى حجم كبير من التخزين وزمن وصول منخفض ولا تحتاج إلى قواعد بيانات علائقية، ومن الأمثلة على ذلك ملفات الإكسل والكتب والمدونات. ينقسم تنظيم هذا النوع إلى أربعة أقسام حسب النموذج المستخدَم وهي كما يلي: نموذج الجدول الكبير Big Table أو عمودي التوجه Column-oriented database: إذ يُنشَأ في هذا النوع جدول كبير يحتوي على جميع البيانات، أي مثل وجود كل المعلومات التي تمتلكها على ورقة واحدة، ويطلق عليه أحيانًا اسم نموذج الأعمدة الموسَّعة. نموذج المستند الموجّه Document-oriented Database، وتكون صيغة المستند XML أو JSON أو غيرها، أي أنّ ملف JSON هو قاعدة بيانات من النمط، ويُعَدّ هذا النوع مشابهًا لنمط تخزين مفتاح قيمة، إذ يوفِّر مفتاح وقيمة أيضًا لكن بصورة موسّعة قليلًا. نموذج الرسم البياني Graph NoSQL Database، يعتمد هذا النوع على تخزين البيانات المترابطة على صورة رسم بياني. نموذج مفتاح-قيمة Key-Value NoSQL Database: إذ يُسنَد مفتاح فريد غير متكرر لكل قيمة وتحفظ البيانات على صورة جدول من عمودَين هما القيمة والمفتاح، أي عند طلب المفتاح سنحصل على قيمته، ويستخدَم هذا النوع من أجل البيانات الضخمة مع استعلامات بحث بسيطة. قواعد البيانات الهرمية Hierarchy Database يعتمد هذا النوع على مبدأ التسلسل الهرمي في العمل والذي يجري تسلسلًا من الجذر أو الأصل بنموذج يشبه الشجرة، إذ تمثَّل البيانات فيه باستخدام علاقات الأصل والتابع، فقد يكون لكل أصل عدة توابع، في حين يكون لكل تابع أصل وحيد فقط، وبالتالي تكون العلاقات في النموذج من النواع واحد إلى متعدد، ويعبِّر التابع عن سجل له عدة سمات. اعتمِد هذا النوع قبل وجود قواعد البيانات العلائقية، وبالتالي فقد أصبح الآن نادر الاستخدام، ويعمل على الوصول إلى البيانات بطريقة متفرعة ومتسلسلة وتكون إما من الأسفل إلى الأعلى بدءًا من التابع أو من الأعلى إلى الأسفل. يوضح الشكل السابق مثالًا عن قاعدة البيانات الهرمية، إذ يمثِّل المستوى الأول سجلات تحتوي على ثلاثة أنواع من السمات وهي المعرِّف S_id والاسم S_name والعمر S_age، ويتبع هذا المستوى سجلات -أو توابع- جديدة تتألف من سمتَين هما معرِّف دورة البرمجة C_id واسم دورة البرمجة C_Name، أي نلاحظ أنّ الأصل يحتوي على ثلاثة توابع وكل تابع يرتبط بتابع ما عدا السجل ذو المعرِّف 151 الذي بتابعَين اثنين. قواعد البيانات الشبكية Network Database تُعَدّ امتدادًا لقاعد البيانات الهرمية، إذ يمكن أن يكون لدى الابن الواحد أكثر من أب، وبالتالي فإنها تسمح للمصممين بتصميم أكثر مرونةً، وإنّ ما يميّيز هذا النوع هو وجود الأسهم بين العقد. قواعد البيانات السحابية Cloud Database هذا النوع مبني في سحابة cloud عامة أو خاصة، إذ تُفرَض رسوم على المستخدِمين بناءً على سعة التخزين والنطاق الترددي الذي سيستخدمونه، كما يمكنهم التوسع عن الطلب. مكونات قواعد البيانات تتكون قاعدة البيانات من المكونات التالية مهما كان نوعها: العتاد hardware: هو الجهاز الفعلي الذي يعمل عليه برنامج قواعد البيانات، ويشمل أجهزة الحاسوب والخوادم ومحركات الأقراص الصلبة. البرمجية software: يمنح تطبيق أو برمجية قاعدة البيانات المستخدِمين إمكانية التحكم والتعامل مع قاعدة البيانات عن طريق احتوائه على نظام إدارة قواعد البيانات، كما تتنوع البرامج التي تحقق ذلك، ومن بينها أوراكل Oracle و Microsoft Access و Microsoft Excel و Microsoft SQL و PostgreSQL و TeamDesk و knack و TablePlus وغيرها الكثير. البيانات Data: وهي المعلومات الأولية التي تخزنها قواعد البيانات، إذ ينظمها المسؤولون لجعلها أكثر وضوحًا. لغة الوصول إلى البيانات Data access language: وهي لغة البرمجة التي تتحكم في قاعدة البيانات، إذ يجب على لغة البرمجة هذه العمل مع نظام إدارة قواعد البيانات، كما تُعَدّ لغة الاستعلام الهيكلية Structured Query Language أو SQL اختصارًا اللغة الأكثر شيوعًا في إدارة قاعدة البيانات العلائقية. الإجرائيات procedures: وهي قواعد تحدد كيفية عمل القاعدة وكيفية معالجتها للبيانات. من الجدير بالذكر أنّ أيّ قاعدة بيانات تحتاج إلى موارد مالية دائمة ومستمرة، كما يجب تأمين الحماية الخارجية لها لتجنب اختراقها أو تخريبها، بالإضافة إلى أنّ تطويرها يُعَدّ معقدًا لأنه يحتاج إلى مصممين بخبرات عالية. تصميم قاعدة البيانات سنتعرف فيما يلي على تصميم قواعد البيانات العلائقية بما أنّ هذا النوع هو الأكثر شيوعًا والأكثر استخدامًا، إذ تتألف عملية التصميم هذه من الخطوات التالية: تحديد الهدف من قاعدة البيانات: إذ سيساعدك ذلك في تحقيق الخطوات التالية، مثل بناء قاعدة بيانات خاصة بمستشفى ما. تقسيم المعلومات في جداول: وذلك من خلال تقسيم المعلومات إلى وحدات أساسية أو عناوين، بحيث يعبِّر كل عنوان عن جدول فيما بعد مثل جدول الأطباء وجدول المرضى وجدول الاختصاص، …إلخ. تحويل عناصر المعلومات إلى أعمدة: وذلك من خلال تحديد المعلومات التي تريد تخزينها في كل جدول، وهذه المعلومات ستمثِّل الأعمدة الخاصة بكل جدول، إذ تكون المعلومات الخاصة بجدول الأطباء مثلًا هي رقم الطبيب واسم الطبيب واختصاص الطبيب، …إلخ، وبالتالي ستمثِّل المعلومات السابقة أعمدةً لجدول الأطباء. تحديد المفاتيح الأساسية primary keys لكل جدول: والتي ستكون عمودًا أو مجموعة من الأعمدة تشكل قيمة فريدة في كل الجدول، ويُعَدّ المفتاح الأساسي ضروريًا من أجل بناء العلاقات بين الجداول. تعيين العلاقات بين الجداول: وذلك من خلال تحديد ارتباط البيانات في الجداول مع بعضها، فالعلاقة التي تربط جدول الاختصاص مع جدول الأطباء على سبيل المثال هي علاقة واحد إلى متعدد، إذ يمكن أن يحتوي الاختصاص على مجموعة من الأطباء في حين ينتمي الطبيب إلى اختصاص واحد فقط. تحسين التصميم الخاص بك: وذلك عن طريق مراجعة التصميم وإجراء تعديلات إذا دعت الحاجة لذلك بأن يكون هناك جدولًا لا داع له، أو توجد معلومات ناقصة لا يستوفيها التصميم الحالي. أنشئ وصمم قواعد البيانات التي تحتاجها لأعمالك استعن بأفضل مقدمي خدمات قواعد البيانات على خمسات اطلب خدمتك الآن تعلم قواعد البيانات أصبح الانترنت مليئًا بالمحتوى التعليمي والتثقيفي حول أيّ مجال وخاصةً حول قواعد البيانات، إذ تتولى الكثير من المواقع هذه العملية التعليمية وتوفر دروس ومقالات وبصورة مجانية مثل أكاديمية حسوب، بالإضافة إلى وجود العديد من القنوات التعليمية على اليوتيوب، فضلًا عن تعلّمها في المرحلة الجامعية، كما تقدّم أكاديمية حسوب دورة مميزة في علوم الحاسوب تغطي كل المفاهيم الأساسية المهمة في هذا المجال ومنها بالطبع التعريف بقاعد البيانات والتعامل معها. الخطوة الأهم في تعلمها هو تعلم لغة SQL وإتقانها جيدًا إذ هي الأساس في التعامل مع قواعد البيانات كما تقوم عليها كل أنظمة إدارة قواعد البيانات مهما اختلفت بالإضافة إلى توسيعها بتعليمات جديدة يمكن تعلمها بسهولة بعد معرفة نظام إدارة قواعد البيانات المراد استخدامه. وبعد تلك الخطوة من المهم فهم قواعد البيانات العلائقية فهي الأكثر استخدامًا وشيوعًا في الأنظمة ثم تعلم كيفية تصميمها وبعدها يمكنك الدخول إلى مجال أنظمة الإدارة DBMS وتعلمها وبذلك تكون مؤهلًا للعمل في مجال إدارة أنظمة قواعد البيانات DBMS Admin. نرشح لك بالإضافة لدورة علوم الحاسوب مراجع داعمة لها يمكنك التعلم منها: كتاب ملاحظات للعاملين بلغة SQL كتاب تصميم قواعد البيانات كتاب الدليل العملي إلى ostgreSQL مقالات عن قواعد البيانات وإدارتها مقالات عن لغة SQL توثيق لغة SQL العربي فرص العمل في مجال قواعد البيانات تمتد الوظائف الرئيسية للعمل مع قواعد البيانات إلى عدة مجالات مهنية، فإذا وفرت لنفسك التدريب والخبرة المناسبتَين، فسيوفِّر هذا فرصًا وظيفية مجزية وذات دخل عالي، ومن المسميات الوظيفية التي يمكن التخصص فيها في هذا المجال هي: مدير قواعد بيانات database administrator محلل قواعد بيانات database analyst مطور قواعد بيانات database developer مدير قواعد بيانات database manager مهندس قواعد بيانات database engineer أخصائي قواعد بيانات Database Specialist والعديد من المسميات الوظيفية التي يُدرج في متطلباتها المعرفة والخبرة بالعمل مع قاعدة البيانات وأنظمة محددة من أنظمة DBMS مثلًا ستجد مثل Oracle Database Administrator أو MS SQL Server Database Administrator وإليك قائمة بالمسميات الوظيفية المتعلقة بقواعد البيانات ومتطلباتها على موقع indeed. كما يمكن العمل عن بعد أي عبر الانترنت بأحد التخصصات السابقة، وبالتالي التواجد الفيزيائي في موقع العمل غير مطلوب بناءً على قرار من الجهة المسؤولة عن العمل. يُتوقَّع أن ينمو التوظيف في هذا التخصص بنسبة 9 بالمئة بين عامَي 2021 و 2030 بصورة أسرع من متوسط المهن الأخرى، كما يُتوقَّع حوالي 11500 فرصة عمل لمديرِي ومهندسِي قواعد البيانات في كل عام، وقد بلغ متوسط الأجر السنوي لمديرِي قواعد البيانات حوال 96710 دولار أمريكي في شهر 5 من عام 2021 في الولايات المتحدة الأمريكية حسب مكتب الولايات المتحدة الأمريكية لإحصاءات العمالة U.S. BUREAU OF LABOR STATISTICS أو BLS اختصارًا. لا غنى لأي نظام إلكتروني اليوم عن قاعدة بيانات تخزن بيانات التطبيق وتدير معلوماته، وبالتالي تتعدد المجالات والمؤسسات التي تتطلب المعرفة التامة بقواعد البيانات وكيفية التعامل معها، ومن بين هذه المؤسسات البنوك وشركات الطيران وشركات الاتصال والمستشفيات بالإضافة إلى مجال التعليم والاقتصاد والمالية والمبيعات والتسويق والموارد البشرية، كما أنّ كل برنامج حاسوبي أو موقع ويب أو تطبيق على الهاتف المحمول يتطلب وجود قاعدة بيانات مهما كانت بنيتها وتزداد الحاجة إلى أخصائي قواعد بيانات لإدارتها كلما كبر حجم قواعد البيانات للنظام وقد تجد في الشركات المتوسطة والكبيرة قسم كامل لإدارتها. وفّر الموقع الأكبر في التوظيف عن بعد في العالم العربي وهو موقع بعيد عدة وظائف تتعلق في قواعد البيانات بمختلف مجالاتها مثل التصميم والتطوير، …إلخ. يمكنك متابعته والتقدم للشواغر الوظيفية المتاحة في هذا تخصص. الخاتمة تناول هذا المقال لمحةً عامةً حول قواعد البيانات ليكون بذلك بمثابة حجر أساس في طريقك نحو التعمق فيها، كما بيّن أهمية هذا الموضوع في العديد من المجالات، مع التطرق إلى أنواعها لتختار بدورك ما يناسبك حسب التطبيق الذي تود التعامل معه، بالإضافة إلى ذكر مكوناته وخطوات تصميم قواعد البيانات العلائقية كونها الأكثر استخدامًا، وختامًا ذكرنا مصادر تعلم هذا المجال للتخصص فيها وتطرقنا إلى فرص العمل في هذا التخصص لتكون على بينة قبل دخول سوق العمل. اقرأ أيضًا المدخل الشامل لتعلم علوم الحاسوب مقارنة بين MySQL و MongoDB كيف تثبّت MySQL Workbench وتستخدمه للاتصال بقواعد بيانات MySQL تعلم أساسيات MySQL علم البيانات Data science: الدليل الشامل خصائص قواعد البيانات تطوير قواعد البيانات أساسيّات لغة SQL أهمية قواعد البيانات
    1 نقطة
  41. منذ زمن سحيق، كانت الذاكرةُ أكثر وظيفة نحتاجها ونعتمد عليها في الحاسوب. ورغم اختلاف التقنيات وأساليب التنفيذ الكامنة وراءها، إلّا أنّ معظم الحواسيب تأتي بالعتاد الضروريّ لمعالجة المعلومات وحفظها بأمان لاستخدامها في المستقبل متى احتجنا لها. لقد صار من المستحيل في عالمنا الحديث تخيل أيّ عمل لا يستفيد من هذه القدرة في الأجهزة، سواء كانت خواديم أو حواسيب شخصية أو كفّيّة. تُعالَج البيانات وتُسجَّل وتُسترجَع مع كل عملية، وفي كل مكان من الألعاب إلى الأدوات المتعلقة بالأعمال، بما فيها المواقع. أنظمة إدارة قواعد البيانات (DataBase Management Systems – DBMS) هي برمجيات عالية المستوى تعمل مع واجهات برمجة تطبيقات (APIs) أدنى منها في المستوى، وتلك الواجهات بدورها تهتم بهذه العمليات. لقد تم تطوير العديد من أنظمة إدارة قواعد البيانات (كقواعد البيانات العلائقيّة relational databases، وnoSQL، وغيرها) لعقود من الزمن للمساعدة على حلّ المشكلات المختلفة، إضافة إلى برامج لها (مثل MySQL ,PostgreSQL ,MongoDB ,Redis، إلخ). سنقوم في هذا المقال بالمرور على أساسيّات قواعد البيانات وأنظمة إدارة قواعد البيانات. وسنتعرف من خلالها على المنطق الذي تعمل به قواعد البيانات المختلفة، وكيفية التفرقة بينها. أنظمة إدارة قواعد البياناتإن مفهوم نظام إدارة قاعدة البيانات مظلّةٌ تندرج تحتها كلّ الأدوات المختلفة أنواعها (كبرامج الحاسوب والمكتبات المضمّنة)، والتي غالبًا تعمل بطرق مختلفة وفريدة جدًّا. تتعامل هذه التطبيقات مع مجموعات من المعلومات، أو تساعد بكثرة في التعامل معها. وحيث أن المعلومات (أو البيانات) يُمكِن إن تأتي بأشكال وأحجام مختلفة، فقد تم تطوير العشرات من أنظمة قواعد البيانات، ومعها أعداد هائلة من تطبيقات قواعد البيانات منذ بداية النصف الثاني من القرن الحادي والعشرين، وذلك من أجل تلبية الاحتياجات الحوسبيّة والبرمجية المختلفة. تُبنى أنظمة إدارة قواعد البيانات على نماذج لقواعد البيانات: وهي بُنى محدّدة للتعامل مع البيانات. وكل تطبيق ونظام إدارة محتوى جديد أنشئ لتطبيق أساليبها يعمل بطريقة مختلفة فيما يتعلق بالتعريفات وعمليات التخزين والاسترجاع للمعلومات المُعطاة. ورغم أنّ هناك عددًا كبيرًا من الحلول التي تُنشئ أنظمة إدارة قواعد بيانات مختلفة، إلّا أنّ كلّ مدة زمنية تضمّنت خيارات محدودة صارت شائعة جدًّا وبقيت قيد الاستخدام لمدة أطول، والغالب أنّ أكثرها هيمنة على هذه الساحة خلال العقدين الأخيرين (وربما أكثر من ذلك) هي أنظمة إدارة قواعد البيانات العلائقيّة (Relational Database Management Systems – RDBMS). أنواع قواعد البياناتيستخدم كلُّ نظام إدارة بياناتٍ نموذجًا لقواعد البيانات لترتيب البيانات التي يديرها منطقيًّا. هذه النماذج (أو الأنواع) هي الخطوة الأولى والمحدّد الأهم لكيفية عمل تطبيق قواعد البيانات وكيفية تعامله مع المعلومات وتصرفه بها. هناك بعض الأنواع المختلفة لنماذج لقواعد البيانات التي تعرض بوضوع ودقّة معنى هيكلة البيانات، والغالب أن أكثر هذه الأنواع شهرةً قواعدُ البيانات العلائقيّة. ورغم أنّ النموذج العلائقيّ وقواعد البيانات العلائقيّة (relational databases) مرنة وقويّة للغاية –عندما يعلم المبرمج كيف يستخدمها–، إلّا أنّ هناك بعض المشكلات التي واجهات عديدين، وبعض المزايا التي لم تقدمها هذه الحلول. لقد بدأت حديثًا مجموعة من التطبيقات والأنظمة المختلفة المدعوّة بقواعد بيانات NoSQL بالاشتهار بسرعة كبيرة، والتي قدمت وعودًا لحل هذه المشكلات وتقديم بعض الوظائف المثيرة للاهتمام بشدّة. بالتخلص من البيانات المهيكلة بطريقة متصلّبة (بإبقاء النمط المعرّف في النموذج العلائقيّ (relational model))، تعمل هذه الأنظمة بتقديم طريقة حرّة أكثر في التعامل مع المعلومات، وبهذا توفّر سهولة ومرونة عاليتين جدًّا؛ رغم أنّها تأتي بمشاكل خاصة بها –والتي تكون بعضها جدّيّة– فيما يتعلق بطبيعة البيانات الهامّة والتي لا غنى عنها. النموذج العلائقيّيقدّم النظام العلائقيّ الذي ظهر في تسعينات القرن الماضي طريقة مناسبة للرياضيات في هيكلة وحفظ واستخدام البيانات. توسّع هذه الطريقة من التصاميم القديمة، كالنموذج المسطّح (flat)، والشبكيّ، وغيرها، وذلك بتقديمها مفهوم "العلاقات". تقدّم العلاقات فوائد تتعلق بتجميع البيانات كمجموعات مقيّدة، تربط فيها جداول البيانات –المحتوية على معلومات بطريقة منظمة (كاسم شخص وعنوانه مثلاً)– كل المدخلات بإعطاء قيم للصفات (كرقم هوية الشخص مثلًا). وبفضل عقود من البحث والتطوير، تعمل أنظمة قواعد البيانات التي تستخدم النموذج العلائقيّ بكفاءة وموثوقيّة عاليتين جدًّا. أضف إلى ذلك الخبرة الطويلة للمبرمجين ومديري قواعد البيانات في التعامل مع هذه الأدوات؛ لقد أدّى هذا إلى أن يصبح استخدام تطبيقات قواعد البيانات العلائقيّة الخيار الأمثل للتطبيقات ذات المهام الحرجة، والتي لا يمكنها احتمال فقدان أيّة بيانات تحت أيّ ظرف، وخاصة كنتيجة لخلل ما أو لطبيعة التطبيق نفسه الذي قد يكون أكثر عرضة للأخطاء. ورغم طبيعتها الصارمة المتعلقة بتشكيل والتعامل مع البيانات، يمكن لقواعد البيانات العلائقيّة أن تكون مرنة للغاية وأن تقدم الكثير، وذلك بتقديم قدر ضئيل من المجهود. التوجّه عديم النموذج (Model-less) أو NoSQLتعتمد طريقة NoSQL في هيكلة البيانات على التخلص من هذه القيود، حيث تحرر أساليب حفظ، واستعلام، واستخدام المعلومات. تسعى قواعد بيانات NoSQL إلى التخلص من العلائقات المعقدة، وتقدم أنواع عديدة من الطرق للحفاظ على البيانات والعمل عليها لحالات استخدام معينة بكفاءة (كتخزين مستندات كاملة النصوص)، وذلك من خلال استخدامها توجّها غير منظم (أو الهيكلة على الطريق / أثناء العمل). أنظمة إدارة قواعد بيانات شائعةهدفنا في هذا المقال هو أن نقدم لك نماذج عن بعض أشهر حلول قواعد البيانات وأكثرها استخدامًا. ورغم صعوبة الوصول إلى نتيجة بخصوص نسبة الاستخدام، يمكننا بوضوح افتراض أنّه بالنسبة لغالب الناس، تقع الاختيارات بين محرّكات قواعد البيانات العلائقيّة، أو محرك NoSQL أحدث. لكن قبل البدء بشرح الفروقات بين التطبيقات المختلفة لكل منهما، دعنا نرى ما يجري خلف الستار. أنظمة إدارة قواعد البيانات العلائقيّةلقد حصلت أنظمة إدارة قواعد البيانات العلائقيّة على اسمها من النموذج الذي تعتمد عليه، وهو النموذج العلائقيّ الذي ناقشناه أعلاه. إنّ هذه الأنظمة –الآن، وستبقى لمدة من الزمن في المستقبل– الخيار المفضّل للحفاظ على البيانات موثوقة وآمنة؛ وهي كذلك كفؤة. تتطلب أنظمة إدارة قواعد البيانات العلائقيّة مخططات معرفة ومحددة جيدًا –ولا يجب أن يختلط الأمر مع تعريف PostgreSQL الخاص بهذه الأنظمة– لقبول هذه البيانات. تشكّل هذه الهيئات التي يحددها المستخدم كيفية حفظ واستخدام البيانات. إنّ هذه المخططات شبيهة جدًّا بالجداول، وفيها أعمدة تمثّل عدد ونوع المعلومات التي تنتمي لكل سجل، والصفوف التي تمثّل المدخلات. من أنظمة إدارة قواعد البيانات الشائعة نذكر: SQLite: نظام إدارة قواعد بيانات علائقيّة مضمّن قويّ جدًّا.MySQL: نظام إدارة قواعد بيانات علائقيّة الأكثر شهرة والشائع استخدامه.PostgreSQL: أكثر نظام إدارة قواعد بيانات علائقيّة كيانيّ (objective-RDBMS) متقدم وهو متوافق مع SQL ومفتوح المصدر.ملاحظة: لمعرفة المزيد عن أنظمة إدارة قواعد بيانات NoSQL، راجع المقالة التالية عن الموضوع: A Comparison Of NoSQL Database Management Systems. أنظمة قواعد بيانات NoSQL (أو NewSQL)لا تأتي أنظمة قواعد بيانات NoSQL بنموذج كالمستخدم في (أو الذي تحتاجه) الحلول العلائقيّة المهيكلة. هناك العديد من التطبيقات، وكلّ منها تعمل بطريقة مختلفة كليًّا، وتخدم احتياجات محدّدة. هذه الحلول عديمة المخططات (schema-less) إمّا تسمح تشكيلات غير محدودة للمدخلات، أو –على العكس– بسيطة جدًّا ولكنها كفؤة للغاية كمخازن قيم معتمد على المفاتيح (key based value stores) مفيدة. على خلاف قواعد البيانات العلائقيّة التقليديّة، يمكن تجميع مجموعات من البينات معًا باستخدام قواعد بيانات NoSQL، كـ MongoDB مثلًا. تُبقي مخازن المستندات هذه كل قطعة من البيانات مع بعضها كمجموعة واحدة (أي كملف) في قاعدة البيانات. يمكن تمثيل هذه المستندات ككيانات بيانات منفردة، مثلها في ذلك كمثل JSON، ومع ذلك تبقى كراسات، وذلك يعتمد على خصائصها. ليس لقواعد بيانات NoSQL طريقة موحدة للاستعلام عن البيانات (مثل SQL لقواعد البيانات العلائقيّة) ويقدم كلّ من الحلول طريقته الخاصّة للاستعلام. ملاحظة: لمعرفة المزيد عن أنظمة إدارة قواعد البيانات العلائقيّة، ألق نظرة على هذه المقالة المتعلقة بالموضوع: A Comparison Of Relational Database Management Systems. مقارنة بين أنظمة إدارة قواعد بيانات SQL و NoSQLمن أجل الوصول إلى نتيجة بسيطة ومفهومة، لنحلّل أولًا الاختلافات بين أنظمة إدارة قواعد البيانات: هيكلية ونوع البيانات المحتفظ بها:تتطلب قواعد البيانات العلائقيّة SQL هيكلة ذات خصائص محدّدة للحفاظ على البيانات، على خلاف قواعد بيانات NoSQL التي تسمح بعمليات انسياب حُرّ (free-flow operations). الاستعلام: وبغضّ النظر عن تراخيصها، تستخدم كلّ قواعد البيانات العلائقيّة معيار SQL إلى حدّ ما، ولهذا يمكن الاستعلام فيها بلغة SQL (أي Structured Query Language). أما قواعد بيانات NoSQL فلا تستخدم طريقة محدّدة للعمل على البيانات التي تديرها. التحجيم: يمكن تحجيم كلي الحلين عموديًّا (أي بزيادة موارد النظام). لكن لكون حلول NoSQL تطبيقات أحدث (وأبسط)، فهذا يجعلها تقدّم وسائل أسهل بكثير لتحجيمها أفقيًّا (أي بإنشاء شبكة عنقودية cluster من أجهزة متعدّدة). المتانة Reliability: عندما يتعلق الأمر بالمتانة والثقة الآمنة بالقَيد المنفّذ، تبقى قواعد بيانات SQL الخيار الأفضل. الدعم: لأنظمة إدارة قواعد البيانات العلائقيّة تاريخ طويل استمر لعقود من الزمن. إنها شائعة جدًّا، ومن السهل إيجاد دعم سواء مجانيّ أو مدفوع. إذا حدثت مشكلة، فمن الأسهل حلّها عليها من قواعد بيانات NoSQL التي شاعت حديثًا، وخاصة إذا كان الحلّ موضع السؤال ذا طبيعة معقّدة (مثل MongoDB). احتياجات حفظ واستعلام البيانات المعقدة: إنّ قواعد البيانات العلائقيّة بطبيعتها الخيار الأمثل لاحتياجات حفظ البيانات والاستعلامات المعقّدة. إنها أكثر كفاءة وتتفوق في هذا المجال. ترجمة -وبتصرّف- للمقال Understanding SQL And NoSQL Databases And Different Database Models لصاحبه O.S. Tezer.
    1 نقطة
×
×
  • أضف...