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

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

  1. Mustafa Suleiman

    Mustafa Suleiman

    الأعضاء


    • نقاط

      3

    • المساهمات

      13209


  2. Ahmad Alharbi2

    Ahmad Alharbi2

    الأعضاء


    • نقاط

      1

    • المساهمات

      33


  3. عمار هبه

    عمار هبه

    الأعضاء


    • نقاط

      1

    • المساهمات

      19


  4. Ali Ahmed6

    Ali Ahmed6

    الأعضاء


    • نقاط

      1

    • المساهمات

      85


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

المحتوى الأعلى تقييمًا في 10/04/23 في كل الموقع

  1. من أين احصل على رامات خارجيه دون التغير بالابتوب لرفع رامات الجهاز
    1 نقطة
  2. لو سمحت لسه مبتدىء محتاج اعمل جدول الجدول فيه Dropdown محتاج لما ادوس على ال input يفتح معايا الى menue محتاج اعمل دا بشكل اوتماتيك فى كل dropdown عندى ليها نفس ال calss <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="style.css"> </head> <body> <table> <thead></thead> <tbody> <td> <tr> <div class="dropdown"> <div class="search_input"> <input id="input" type="text" placeholder="search" onclick=""> </div> <div class="menue"> <p>html</p> <p>CSS</p> <p>js</p> </div> </div> </tr> </td> <td> <tr> <div class="dropdown"> <div class="search_input" > <input id="input" type="text" placeholder="search"> </div> <div class="menue"> <p>html</p> <p>CSS</p> <p>js</p> </div> </div> </tr> </td> </tbody> <tfoot></tfoot> </table> <button>add new row</button> <script src="/main.js"></script> </body> </html> .dropdown{ width: 180px; position: relative; margin: 5px; } .menue{ position: absolute; width: 100%; display: none; border: blue; background-color: lightgray; z-index: 1; } .active{ display: block; } هنا كود ال جافاسكريبت const input = document.querySelector("#input"); const menue = document.querySelector(".menue"); input.addEventListener("click", function(){ menue.classList.toggle('active') }) انا محتاج اعمل الجدول فى كل صف فية dropdown وهضيف صفوف كتير عايز لما ادوس على ال input يفتح معايا ال dropdown
    1 نقطة
  3. السلام عليكم ورحمة الله وبركاته كنت أريد الاستفسار عن خطوات اضافة بوابة دفع من نوع مدى bay (وهي بطاقة دفع محلية مشهورة في المملكة العربية السعودية ) باستخدام php
    1 نقطة
  4. السلام عليكم ما هي اهميه تعلم انظمة الشغيل كمبرمج ؟
    1 نقطة
  5. اعمل على هدا المشروع واستخدم فيه تقنيات html css javascript وارغب ان اقوم بعمل بطاقات بجانب بعضها وتتحرك باستخدام javascript slider ولكن عندما كتبت الكود لم يعمل بالشكل الدي اريد هل يمكن مساعدتي لحل هده المشكلة test.rar
    1 نقطة
  6. انا جديد على بايثون...فالمعذرة منكم جميعا لماذا عند عملية الضرب في بايثون يكون الناتج غير صحيح مثلا 9*0.01*10 يكون الناتج 0.8999999999999999 والاصل يكون الناتج 0.9 كيف اتخلص من هذه المشكله
    1 نقطة
  7. لأن بايثون تستخدم عددًا عشريًا مزدوجًا لتمثيل الأعداد العشرية، والأعداد العشرية المزدوجة هي أعداد عشرية تقريبية، مما يعني أنها لا يمكنها تمثيل جميع الأعداد العشرية بدقة. ففي العملية 9 * 0.01 * 10 الناتج يساوي 0.8999999999999999 لأن 0.01 هو رقم عشري مزدوج غير دقيق، وإن كنت تريد الحصول على الناتج الصحيح، فعليك استخدام عدد عشري دقيق، أي: استخدم نوعًا عشريًا دقيقًا، مثل Decimal. import decimal result = decimal.Decimal(9) * decimal.Decimal(0.01) * decimal.Decimal(10) print(result) #0.9000000000000000187350135405 أو تقريب الرقم العشري المزدوج. result = round(9 * 0.01 * 10, 4) print(result) #0.9
    1 نقطة
  8. يا استاذ لقد فعلت كما قلت ما المشكله OUTPUT يظهر لي هنا الكونسل للصفحه لايظهر فيه output مثل المدرب
    1 نقطة
  9. كل ما يمكنك فعله هو زيادة المساحة المخصصة للذاكرة العشوائية الوهمية على حاسوبك، حيث إنشاء ملف باسم Paging file، وهو ملف مخفي على محرك الأقراص الثابتة في نظام التشغيل Windows، ويستخدمه الـ Windows لتخزين البيانات التي لا يمكن وضعها في ذاكرة الوصول العشوائي (RAM)، وتسمى تلك العملية بالترحيل، مما يسمح بالتالي: يسمح لـ Windows بتشغيل تطبيقات أو برامج تتطلب أكثر من ذاكرة الوصول العشوائي المتوفرة. يمنع Windows من التوقف عن العمل أو الانهيار بسبب نقص الذاكرة. يساعد في تحسين أداء Windows. قم بالبحث على اليوتيوب عن كيفية زيادة مساحة الرامات للكمبيوتر وستجد نتائج توضح كيفية تفعيل الـ Virtual memory من خلال ملف Pagefile.sys.
    1 نقطة
  10. لا اعتقد ان مدى تقدم هذه الخدمة حيث انه لا يوجد اي قسم للمطورين في موقعهم الرسمي، ولكن خلال البحث لاحظت ان هنالك شركات وسيطة تمكنك من الربط مع كل بوابات الدفع بما فيها مدى مثل خدمة tap وغيرها. كذلك الامر فلا ضرر من التواصل مع الدعم الفني في شركة مدى من هنا.
    1 نقطة
  11. أرجو التعليق أسفل فيديو الدورة لمساعدتك بشكل أفضل، وطرح الأسئلة العامة هنا. نستخدم الخاصية root في خيارات sendFile() لتحديد الدليل الذي سيتم البحث فيه عن الملف الذي سيتم إرساله، وبدون تلك الخاصية، سيبحث Node.js عن الملف في الدليل الحالي، والذي قد لا يكون هو المكان الذي توجد فيه الملف. و__dirname هي دالة داخلية في Node.js تُرجع اسم الدليل الذي تم تحميل الملف الحالي منه. لذلك ستبحث Node.js عن الملف server.html في الدليل الذي تم تحميل ملف الكود الحالي منه أي ملف جافاسكريبت الذي به الكود. بمعنى آخر فائدة __dirname هي أنها تسمح لتطبيق Node.js بإرجاع الملف server.html بغض النظر عن مكان وجوده في النظام، وذلك مفيد بشكل خاص عند العمل مع تطبيقات متعددة الصفحات أو عند الحاجة إلى إرجاع ملف من دليل مختلف عن الدليل الحالي. وإليك مثال على كيفية استخدام root لتحديد الدليل الذي سيتم البحث فيه عن الملف الذي سيتم إرساله من دليل مختلف: const express = require('express'); const app = express(); app.get('/', (req, res) => { res.sendFile('public/index.html', { root: 'public' }); }); app.listen(3000); هنا نستخدم root: 'public' لتحديد الدليل public كدليل الجذر، مما يعني أن Node.js سيبحث عن الملف index.html في الدليل public.
    1 نقطة
  12. لدى كل الشيفرات البرمجية التي ناقشناها حتى الآن ضمانات لأمان الذاكرة في رست وتُفرض هذه الضمانات وقت التصريف، ومع ذلك فإن رست تحتوى على لغة ثانية مخبأة داخلها لا تفرض ضمانات أمان الذاكرة هذه، ويطلق عليها اسم رست غير الآمنة وتعمل تمامًا مثل رست العادية ولكنها تمنحنا قوى خارقة إضافية. توجد رست غير الآمنة لأن التحليل الساكن بطبيعته متحفظ، أي عندما يحاول المصرّف تحديد ما إذا كانت الشيفرة البرمجية تدعم الضمانات أم لا، فمن الأفضل له رفض بعض البرامج الصالحة بدلًا من قبول بعض البرامج غير الصالحة. يمكن أن تكون الشيفرة البرمجية تكون جيدة، إلا أن مصرف رست سيرفض تصريف الشيفرة البرمجية إن لم يكن لديه معلومات كافية ليكون واثقًا، ويمكنك في هذه الحالات استعمال شيفرة غير آمنة لإخبار المصرف "صدقني، أعرف ما أفعله"، ومع ذلك كن حذرًا من استعمال رست غير الآمنة على مسؤوليتك الخاصة: إذا استعملت شيفرة غير آمنة على نحوٍ غير صحيح فقد تحدث بعض المشاكل بسبب عدم أمان الذاكرة مثل تحصيل dereferencing مؤشر فارغ. السبب الآخر لوجود لغة رست غير آمنة هو أن عتاد الحاسب الأساسي غير آمن بطبيعته، فإذا لم تسمح لك رست بإنجاز عمليات غير آمنة فلن يمكنك إنجاز مهام معينة. تحتاج رست إلى السماح لك ببرمجة الأنظمة منخفضة المستوى مثل التفاعل المباشر مع نظام التشغيل أو حتى كتابة نظام التشغيل الخاص بك. يُعد العمل مع برمجة الأنظمة منخفضة المستوى أحد أهداف اللغة. لنكتشف ما يمكننا فعله مع رست غير الآمنة وكيفية إنجاز ذلك. القوى الخارقة غير الآمنة unsafe superpowers استخدم الكلمة المفتاحية unsafe للتبديل إلى رست غير الآمنة، ثم ابدأ كتلة جديدة تحتوي على الشيفرة غير الآمنة. يمكنك اتخاذ خمسة إجراءات في رست غير الآمنة لا يمكنك فعلها في رست الآمنة ونسميها القوى الخارقة غير الآمنة؛ تتضمن هذه القوى الخارقة القدرة على: تحصيل مؤشر خام raw pointer. استدعاء تابع أو دالة غير آمنين. الوصول أو التعديل على متغير ساكن static متغيّر mutable. تطبيق سمة trait غير آمنة. حقول الوصول الخاصة بـ union. من المهم أن نفهم أن unsafe لا توقف تشغيل مدقق الاستعارة أو تعطل أي من فحوصات أمان رست الأخرى؛ وإذا كنت تستخدم مرجعًا في شيفرة غير آمنة فسيظل التحقق منه جاريًا. تمنحك الكلمة المفتاحية unsafe فقط الوصول إلى هذه الميزات الخمس التي لم يجري التحقق منها بعد ذلك من المصرف من أجل سلامة الذاكرة، وستظل تتمتع بدرجة من الأمان داخل كتلة غير آمنة. لا تعني unsafe أن الشيفرة الموجودة داخل الكتلة هي بالضرورة خطيرة أو أنها ستواجه بالتأكيد مشكلات تتعلق بسلامة الذاكرة، القصد هو أنه بصفتك مبرمجًا ستضمن أن الشيفرة الموجودة داخل كتلة unsafe ستصل إلى الذاكرة بطريقة صالحة. ليس البشر معصومين والأخطاء تحصل، ويمكنك من خلال إجبار وجود هذه العمليات الخمس غير الآمنة داخل كتل موصّفة unsafe أن تضمن بقاء أي أخطاء متعلقة بأمان الذاكرة داخل كتلة unsafe. اجعل كتل unsafe صغيرة، ستقدر ذلك لاحقًا عندما تفتش عن أخطاء الذاكرة. لعزل الشيفرة غير الآمنة قدر الإمكان، يُفضّل تضمين الشيفرة غير الآمنة في عملية تجريد آمنة وتوفير واجهة برمجة تطبيقات آمنة التي سنناقشها لاحقًا في هذا الفصل عندما نتحدث عن الدوال والتوابع غير الآمنة. تُطبَّق أجزاء من المكتبة القياسية مثل تجريدات آمنة على الشيفرات البرمجية غير الآمنة التي قد جرى تدقيقها. يمنع تغليف الشيفرة غير الآمنة في عملية تجريد آمنة استخدامات unsafe من التسرب إلى جميع الأماكن التي قد ترغب أنت أو المستخدمين لديك في استخدام الوظيفة المطبقة بشيفرة unsafe لأن استخدام التجريد الآمن آمن. لنلقي نظرةً على كل من القوى الخارقة الخمس غير الآمنة بالترتيب، سنلقي نظرةً أيضًا على بعض الأفكار المجردة التي تقدم واجهةً آمنةً للشيفرات البرمجية غير الآمنة. تحصيل مرجع مؤشر خام ذكرنا سابقًا في الفصل المراجع References والاستعارة Borrowing والشرائح Slices في لغة رست في قسم "المراجع المعلقة" أن المصرّف يضمن صلاحية المراجع دائمًا. تحتوي رست غير الآمنة على نوعين جديدين يدعيان المؤشرات الخام التي تشبه المراجع، فكما هو الحال مع المراجع يمكن أن تكون المؤشرات الخام ثابتة immutable أو متغيّرة mmutable وتُكتب بالطريقة const T* و mut T* على التوالي. لا تمثّل علامة النجمة عامل التحصيل وإنما هي جزءٌ من اسم النوع. يُقصد بمصطلح الثابت في سياق المؤشرات الخام أنه لا يمكن تعيين المؤشر مباشرةً بعد تحصيله. تختلف المؤشرات الأولية عن المراجع والمؤشرات الذكية بما يلي: يُسمح بتجاهل قواعد الاستعارة من خلال وجود مؤشرات ثابتة أو متغيّرة أو مؤشرات متعددة متغيّرة إلى الموقع ذاته. ليست مضمونة للإشارة إلى ذاكرة صالحة. من المسموح أن تكون فارغة. لا تطبق أي تحرير ذاكرة تلقائي. يمكنك التخلي عن الأمان المضمون من خلال تجاهل الضمانات التي تقدمها رست وذلك مقابل أداء أفضل أو القدرة على التفاعل مع لغة أو عتاد آخر لا تنطبق عليه ضمانات رست. توضح الشيفرة 1 كيفية إنشاء مؤشر خام ثابت ومتغيّر من المراجع. let mut num = 5; let r1 = &num as *const i32; let r2 = &mut num as *mut i32; [الشيفرة 1: إنشاء مؤشرات خام من المراجع] لاحظ أننا لا نضمّن الكلمة المفتاحية unsafe في هذه الشيفرة. يمكننا إنشاء مؤشرات خام في شيفرة آمنة، ولا يمكننا تحصيل المؤشرات الخام خارج كتلة غير آمنة كما سترى بعد قليل. أنشأنا مؤشرات خام باستعمال as لتحويل مرجع ثابت ومتغيّر إلى أنواع المؤشرات الخام الخاصة بهما، ونظرًا إلى أننا أنشأناها مباشرةً من مراجع مضمونة لتكون صالحة فنحن نعلم أن هذه المؤشرات الخام المعنيّة صالحة لكن لا يمكننا افتراض هذا حول أي مؤشر خام. لإثبات ذلك سننشئ مؤشر خام لا يمكننا التأكد من صحته. تظهر الشيفرة 2 كيفية إنشاء مؤشر خام يشير إلى موقع عشوائي في الذاكرة. محاولة استخدام الذاكرة العشوائية هي عملية غير معرّفة، إذ قد توجد بيانات في ذلك العنوان أو قد لا تكون موجودة، ومن الممكن للمصرّف أن يحسن الشيفرة بحيث لا يكون هناك وصول للذاكرة أو قد يخطئ البرنامج في وجود خطأ في التجزئة segmentation. لا يوجد عادةً سببٌ جيد لكتابة شيفرة مثل هذه، لكن هذا ممكن. let address = 0x012345usize; let r = address as *const i32; [الشيفرة 2: إنشاء مؤشر خام إلى عنوان ذاكرة عشوائي] تذكر أنه يمكننا إنشاء مؤشرات خام في شيفرة آمنة لكن لا يمكننا تحصيل المؤشرات الخام وقراءة البيانات التي يُشار إليها، ونستخدم في الشيفرة 3 عامل التحصيل * على مؤشر خام يتطلب كتلة unsafe. let mut num = 5; let r1 = &num as *const i32; let r2 = &mut num as *mut i32; unsafe { println!("r1 is: {}", *r1); println!("r2 is: {}", *r2); } [الشيفرة 3: تحصيل المؤشرات الخام ضمن كتلة unsafe] لا يضرّ إنشاء مؤشر؛ إذ يكمن الضرر فقط عندما نحاول الوصول إلى القيمة التي تشير إليها، فقد ينتهي بنا الأمر بالتعامل مع قيمة غير صالحة. لاحظ أيضًا أننا أنشأنا في الشيفرة 1 و3 مؤشرات خام من النوع const i32* و mut i32* التي أشارت كلتاهما إلى موقع الذاكرة ذاته، حيث يُخزَّن num. إذا حاولنا إنشاء مرجع ثابت ومتغيّر إلى num بدلًا من ذلك، فلن تُصرّف الشيفرة لأن قواعد ملكية رست لا تسمح بمرجع متغيّر في الوقت ذاته كما هو الحال مع أي مراجع ثابتة. يمكننا باستخدام المؤشرات الخام إنشاء مؤشر متغيّر ومؤشر ثابت للموقع ذاته وتغيير البيانات من خلال المؤشر المتغيّر مما قد يؤدي إلى إنشاء سباق بيانات data race. كن حذرًا. مع كل هذه المخاطر، لماذا قد تستخدم المؤشرات الخام؟ إحدى حالات الاستخدام الرئيسية هي عند التفاعل مع شيفرة سي C كما سترى لاحقًا في القسم "استدعاء دالة أو تابع غير آمنين"، وهناك حالة أخرى عند بناء تجريدات آمنة لا يفهمها مدقق الاستعارة. سنقدم دالات غير آمنة، ثم سنلقي نظرةً على مثال على التجريد الآمن الذي يستعمل شيفرةً غير آمنة. استدعاء تابع أو دالة غير آمنين النوع الثاني من العمليات التي يمكنك إجراؤها في كتلة غير آمنة هو استدعاء دالات غير آمنة، إذ تبدو الدالات والتوابع غير الآمنة تمامًا مثل الدالات والتوابع العادية ولكنها تحتوي على unsafe إضافية قبل بقية التعريف. تشير الكلمة المفتاحية unsafe في هذا السياق إلى أن الدالة لها متطلبات نحتاج إلى دعمها عند استدعاء هذه الدالة لأن رست لا يمكن أن تضمن أننا استوفينا هذه المتطلبات؛ فمن خلال استدعاء دالة غير آمنة داخل كتلة unsafe، فإننا نقول إننا قد قرأنا توثيق هذه الدالة ونتحمل مسؤولية دعم مواصفات الدالة هذه. فيما يلي دالة غير آمنة تدعى dangerous لا تنفّذ أي شيء داخلها: unsafe fn dangerous() {} unsafe { dangerous(); } يجب علينا استدعاء دالة dangerous داخل كتلة unsafe منفصلة، وإذا حاولنا استدعاء dangerous دون unsafe سنحصل على خطأ: $ cargo run Compiling unsafe-example v0.1.0 (file:///projects/unsafe-example) error[E0133]: call to unsafe function is unsafe and requires unsafe function or block --> src/main.rs:4:5 | 4 | dangerous(); | ^^^^^^^^^^^ call to unsafe function | = note: consult the function's documentation for information on how to avoid undefined behavior For more information about this error, try `rustc --explain E0133`. error: could not compile `unsafe-example` due to previous error نؤكد لرست مع الكتلة unsafe أننا قرأنا توثيق الدالة ونفهم كيفية استخدامها صحيحًا وتحققنا من أننا نفي بمواصفات الدالة. يعدّ محتوى الدالات غير الآمنة بمثابة كتل unsafe، لذا لا نحتاج إلى إضافة كتلة unsafe أخرى لأداء عمليات أخرى غير آمنة ضمن دالة غير آمنة. إنشاء تجريد آمن على شيفرة غير آمنة لا يعني احتواء الدالة على شيفرة غير آمنة أننا بحاجة إلى وضع علامة بأن كامل الدالة غير آمنة، إذ يُعد تغليف الشيفرات البرمجية غير الآمنة في دالة آمنة تجريدًا شائعًا. وكمثال دعنا ننظر إلى الدالة split_at_mut الموجودة في المكتبة القياسية التي تتطلب بعض الشيفرات البرمجية غير الآمنة. سنكتشف كيف يمكننا تنفيذها. يُعرَّف هذا التابع الآمن على الشرائح المتغيّرة، فهو يأخذ شريحةً واحدة ويحوّلها لشريحتين عن طريق تقسيم الشريحة في الدليل المعطى مثل وسيط. توضح الشيفرة 4 كيفية استخدام split_at_mut. let mut v = vec![1, 2, 3, 4, 5, 6]; let r = &mut v[..]; let (a, b) = r.split_at_mut(3); assert_eq!(a, &mut [1, 2, 3]); assert_eq!(b, &mut [4, 5, 6]); [الشيفرة 4: استعمال الدالة الآمنة split_at_mut] لا يمكننا تنفيذ هذه الدالة باستعمال رست الآمنة فقط، وقد تبدو المحاولة السابقة مثل الشيفرة 5 التي لن تصرف. سننفّذ split_at_mut مثل دالة للتبسيط بدلًا من تابع لشرائح قيم i32 فقط بدلًا من النوع العام T. fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) { let len = values.len(); assert!(mid <= len); (&mut values[..mid], &mut values[mid..]) } [الشيفرة 5: محاولة تنفيذ split_at_mut فقط باستعمال رست الآمنة] تحصل هذه الدالة أولًا على الطول الكلي للشريحة، ثم تؤكد أن الدليل المعطى على أنه معامل موجود داخل الشريحة عن طريق التحقق مما إذا كان أقل أو يساوي الطول. يعني هذا التأكيد أنه إذا مررنا دليلًا أكبر من الطول لتقسيم الشريحة عنده، ستهلع الدالة قبل أن تحاول استعمال هذا الدليل. نعيد بعد ذلك شريحتين متغيّرتين في الصف، واحدة من بداية الشريحة الأصلية إلى الدليل mid والأخرى من mid إلى نهاية الشريحة. عندما نحاول تصريف الشيفرة البرمجية في الشيفرة 5 سنحصل على خطأ. $ cargo run Compiling unsafe-example v0.1.0 (file:///projects/unsafe-example) error[E0499]: cannot borrow `*values` as mutable more than once at a time --> src/main.rs:6:31 | 1 | fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) { | - let's call the lifetime of this reference `'1` ... 6 | (&mut values[..mid], &mut values[mid..]) | --------------------------^^^^^^-------- | | | | | | | second mutable borrow occurs here | | first mutable borrow occurs here | returning this value requires that `*values` is borrowed for `'1` For more information about this error, try `rustc --explain E0499`. error: could not compile `unsafe-example` due to previous error لا يستطيع مدقق الاستعارة في رست أن يفهم أننا نستعير أجزاءً مختلفةً من الشريحة، إذ أنه يعرف فقط أننا نستعير من الشريحة نفسها مرتين. تعد عملية استعارة أجزاء مختلفة من الشريحة أمرًا مقبولًا بصورةٍ أساسية لأن الشريحتين غير متداخلتين لكن رست ليست ذكية بما يكفي لمعرفة ذلك. عندما نعلم أن الشيفرة على ما يرام لكن رست لا تعلم ذلك فهذا يعني أن الوقت قد حان لاستخدام شيفرة غير آمنة. توضح الشيفرة 6 كيفية استخدام كتلة unsafe ومؤشر خام وبعض الاستدعاءات للدالات غير الآمنة لجعل تنفيذ split_at_mut يعمل. use std::slice; fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) { let len = values.len(); let ptr = values.as_mut_ptr(); assert!(mid <= len); unsafe { ( slice::from_raw_parts_mut(ptr, mid), slice::from_raw_parts_mut(ptr.add(mid), len - mid), ) } } [الشيفرة 6: استعمال شيفرة غير آمنة في تنفيذ دالة split_at_mut] تذكر سابقًا من قسم "نوع الشريحة" في الفصل المراجع References والاستعارة Borrowing والشرائح Slices في لغة رست أن الشرائح هي مؤشرات لبعض البيانات وطول الشريحة. نستعمل تابع len للحصول على طول الشريحة وتابع as_mut_ptr للوصول إلى المؤشر الخام للشريحة، وفي هذه الحالة نظرًا لأن لدينا شريحة متغيّرة لقيم i32 فإن as_mut_ptr تُعيد مؤشرًا خامًا من النوع mut i32* وهو الذي خزّناه في المتغير ptr. نحافظ على التأكيد على أن الدليل mid يقع داخل الشريحة، ثم نبدأ بكتابة الشيفرة غير الآمنة: تأخذ الدالة slice::from_raw_parts_mut مؤشرًا خامًا وطولًا وتنشئ شريحة. نستخدم هذه الدالة لإنشاء شريحة تبدأ من ptr وتكون عناصرها بطول mid، ثم نستدعي التابع add على ptr مع الوسيط mid للحصول على مؤشر خام يبدأ من mid وننشئ شريحةً باستخدام هذا المؤشر والعدد المتبقي من العناصر بعد mid ليكون طول الشريحة. الدالة slice::from_raw_parts_mut غير آمنة لأنها تأخذ مؤشرًا خامًا ويجب أن تثق في أن هذا المؤشر صالح، كما يعد التابع add في المؤشرات الخام غير آمن أيضًا لأنه يجب أن تثق في أن موقع الإزاحة هو أيضًا مؤشر صالح، لذلك كان علينا وضع كتلة unsafe حول استدعاءات slice::from_raw_parts_mut و addحتى نتمكن من استدعائها. من خلال النظر إلى الشيفرة وإضافة التأكيد على أن mid يجب أن يكون أقل من أو يساوي len يمكننا أن نقول أن جميع المؤشرات الخام المستخدمة داخل الكتلة unsafe ستكون مؤشرات صالحة للبيانات داخل الشريحة، وهذا استخدام مقبول ومناسب للكتلة unsafe. لاحظ أننا لسنا بحاجة إلى وضع علامة على الدالة split_at_mut الناتجة بكونها unsafe، ويمكننا استدعاء هذه الدالة من رست الآمنة. أنشأنا تجريدًا آمنًا للشيفرة غير الآمنة من خلال تنفيذ الدالة التي تستعمل شيفرة unsafe بطريقة آمنة لأنها تُنشئ مؤشرات صالحة فقط من البيانات التي يمكن لهذه الدالة الوصول إليها. في المقابل، من المحتمل أن يتعطل استخدام slice::from_raw_parts_mut في الشيفرة 7 عند استعمال الشريحة. تأخذ هذه الشيفرة موقعًا عشوائيًا للذاكرة وتنشئ شريحة يبلغ طولها 10000 عنصر. use std::slice; let address = 0x01234usize; let r = address as *mut i32; let values: &[i32] = unsafe { slice::from_raw_parts_mut(r, 10000) }; [الشيفرة 7: إنشاء شريحة من مكان ذاكرة عشوائي] لا نمتلك الذاكرة في هذا الموقع العشوائي وليس هناك ما يضمن أن الشريحة التي تنشئها هذه الشيفرة تحتوي على قيم i32 صالحة، كما تؤدي محاولة استخدام values كما لو كانت شريحة صالحة إلى سلوك غير معرّف. استعمال دوال extern لاستدعاء شيفرة خارجية قد تحتاج شيفرة رست الخاصة بك أحيانًا إلى التفاعل مع شيفرة مكتوبة بلغة برمجية أخرى، لهذا تحتوي رست على الكلمة المفتاحية extern التي تسهل إنشاء واستخدام واجهة الدالة الخارجية Foreign Function interface‎ -أو اختصارًا FFI، وهي طريقة للغة البرمجة لتعريف الدوال وتمكين لغة برمجة (خارجية) مختلفة لاستدعاء هذه الدوال. توضح الشيفرة 8 التكامل مع دالة abs من مكتبة سي القياسية، وغالبًا ما تكون الدوال المعلنة داخل الكتل extern غير آمنة لاستدعائها من شيفرة رست، والسبب هو أن اللغات الأخرى لا تفرض قواعد وضمانات رست ولا يمكن لرست التحقق منها لذلك تقع مسؤولية ضمان سلامتها على عاتق المبرمج. اسم الملف: src/main.rs extern "C" { fn abs(input: i32) -> i32; } fn main() { unsafe { println!("Absolute value of -3 according to C: {}", abs(-3)); } } [الشيفرة 8: التصريح عن الدالة extern واستدعاؤها في لغة أخرى] نُدرج ضمن كتلة ''extern ''C أسماء وبصمات signature الدوال الخارجية من لغة أخرى نريد استدعائها، إذ يحدد الجزء "C" واجهة التطبيق الثنائية application binary interface‎ -أو اختصارًا ABI- التي تستخدمها الدالة الخارجية. تعرّف واجهة التطبيق الثنائية ABI كيفية استدعاء الدالة على مستوى التجميع assembly، وتعد واجهة التطبيق الثنائية للغة ''C'' الأكثر شيوعًا وتتبع واجهة التطبيق الثنائية للغة البرمجة سي. استدعاء دوال رست من لغات أخرى يمكننا أيضًا استخدام extern لإنشاء واجهة تسمح للغات الأخرى باستدعاء دوال رست، وبدلًا من إنشاء كتلة extern كاملة نضيف الكلمة المفتاحية extern ونحدد واجهة التطبيق الثنائية ABI لاستخدامها قبل الكلمة المفتاحية fn للدالة ذات الصلة. نحتاج أيضًا إلى إضافة تعليق توضيحي [no_mangle]# لإخبار مصرّف رست بعدم تشويه mangle اسم هذه الدالة؛ إذ يحدث التشويه عندما يغير المصرف الاسم الذي أعطيناه للدالة لاسم مختلف يحتوي على مزيد من المعلومات لأجزاء أخرى من عملية التصريف لاستهلاكها ولكنها أقل قابلية للقراءة من قبل الإنسان. يشكّل كل مصرف لغة برمجية الأسماء على نحوٍ مختلف قليلًا، لذلك لكي تكون دالة رست قابلة للتسمية من اللغات الأخرى، يجب علينا تعطيل تشويه الاسم في مصرف رست. في المثال التالي نجعل دالة call_from_c قابلة للوصول من شيفرة مكتوبة بلغة سي بعد تصريفها في مكتبة مشتركة وربطها من لغة سي: #[no_mangle] pub extern "C" fn call_from_c() { println!("Just called a Rust function from C!"); } لا يتطلب استعمال extern الكتلة unsafe. الوصول أو تعديل متغير ساكن قابل للتغيير mutable لم نتحدث بعد عن المتغيرات العامة global التي تدعمها رست، إلا أنها قد تسبب مشكلةً مع قواعد ملكية رست. إذا كان هناك خيطان thread يصلان إلى نفس المتغير العام المتغيّر فقد يتسبب ذلك في حدوث سباق بيانات data race. تسمى المتغيرات العامة في رست بالمتغيرات الساكنة، وتظهر الشيفرة 9 مثالًا للتصريح عن متغير ساكن واستخدامه مع شريحة سلسلة نصية مثل قيمة. اسم الملف: src/main.rs static HELLO_WORLD: &str = "Hello, world!"; fn main() { println!("name is: {}", HELLO_WORLD); } [الشيفرة 9: تعريف واستعمال متغير ساكن ثابت] تشبه المتغيرات الساكنة الثوابت التي ناقشناها سابقًا في الفصل المتغيرات والتعديل عليها في لغة رست. أسماء المتغيرات الثابتة موجودة في SCREAMING_SNAKE_CASE اصطلاحًا، ويمكن للمتغيرات الساكنة فقط تخزين المراجع مع دورة حياة ساكنة static'، ما يعني أن مصرف رست يمكنه معرفة دورة الحياة الخاصة دون الحاجة لتحديده صراحةً، ويعد الوصول إلى متغير ساكن آمنًا. الفرق الدقيق بين الثوابت والمتغيرات الساكنة الثابتة immutable هو أن القيم في متغير ساكن لها عنوان ثابت في الذاكرة، كما سيؤدي استعمال القيمة دائمًا إلى الوصول إلى البيانات ذاتها. من ناحية أخرى، يُسمح للثوابت بتكرار بياناتها في أي وقت تُستخدم، الفرق الآخر هو أن المتغيرات الساكنة يمكن أن تكون متغيّرة. الوصول إلى المتغيرات الساكنة القابلة للتغيير وتعديلها غير آمن. توضح الشيفرة 10 كيفية التصريح عن متغير ساكن قابل للتغيير يسمى COUNTER والوصول إليه وتعديله. اسم الملف: src/main.rs static mut COUNTER: u32 = 0; fn add_to_count(inc: u32) { unsafe { COUNTER += inc; } } fn main() { add_to_count(3); unsafe { println!("COUNTER: {}", COUNTER); } } [الشيفرة 10: القراءة من أو الكتابة على متغير ساكن قابل للتغيير غير آمن] كما هو الحال مع المتغيرات العادية نحدد قابلية التغيير باستخدام الكلمة المفتاحية mut، ويجب أن تكون أي شيفرة تقرأ أو تكتب من COUNTER ضمن كتلة unsafe. تُصرَّف هذه الشيفرة وتطبع COUNTER: 3 كما نتوقع لأنها تستخدم خيطًا واحدًا، إذ من المحتمل أن يؤدي وصول خيوط متعددة إلى COUNTER إلى سباق البيانات. يصعب ضمان عدم وجود سباقات بيانات مع البيانات المتغيّرة التي يمكن الوصول إليها بصورةٍعامة، ولهذا السبب تنظر رست إلى المتغيرات الساكنة المتغيّرة بكونها غير آمنة. يُفضّل استخدام تقنيات التزامن والمؤشرات الذكية ذات الخيوط الآمنة التي ناقشناها سابقًا في الفصل استخدام الخيوط Threads لتنفيذ شيفرات رست بصورة متزامنة آنيًا حيثما أمكن حتى يتحقق المصرف من أن البيانات التي يجري الوصول إليها من الخيوط المختلفة آمنة. تنفيذ سمة غير آمنة يمكننا استعمال unsafe لتطبيق سمة غير آمنة؛ وتكون السمة غير آمنة عندما يحتوي أحد توابعها على الأقل على بعض اللامتغايرات invariant التي لا يستطيع المصرف التحقق منها. نصرّح بأن السمة unsafe عن طريق إضافة الكلمة المفتاحية unsafe قبل trait ووضع علامة على أن تنفيذ السمة unsafe أيضًا كما هو موضح في الشيفرة 11. unsafe trait Foo { // methods go here } unsafe impl Foo for i32 { // method implementations go here } fn main() {} [الشيفرة 11: تعريف وتنفيذ سمة غير آمنة] نعد بأننا سنلتزم باللا متغايرات التي لا يمكن للمصرف التحقق منها باستخدام unsafe impl. على سبيل المثال، تذكر سمات العلامة Sync و Send التي ناقشناها سابقًا في قسم "التزامن الموسع مع السمة Sync والسمة Send" في الفصل تزامن الحالة المشتركة Shared-State Concurrency في لغة رست وتوسيع التزامن مع Send و Sync، يطبّق المصرف هذه السمات تلقائيًا إذا كانت أنواعنا تتكون كاملًا من النوعين Sync و Send. إذا طبقنا نوعًا يحتوي على نوع ليس Sync و Send مثل المؤشرات الخام ونريد وضع علامة على هذا النوع على أنه Sync و Send فيجب علينا استخدام unsafe. لا تستطيع رست التحقق من أن النوع الخاص بنا يدعم الضمانات التي يمكن إرسالها بأمان عبر الخيوط أو الوصول إليها من خيوط متعددة، لذلك نحتاج إلى إجراء تلك الفحوصات يدويًا والإشارة إلى ذلك باستخدام unsafe. الوصول لحقول الاتحاد Union الإجراء الأخير الذي يعمل فقط مع unsafe هو الوصول إلى حقول الاتحاد؛ ويعد union مشابهًا للبنية struct ولكن يُستخدم فيه حقل مصرح واحد فقط في نسخة معينة في وقت واحد، وتُستخدم الاتحادات بصورةٍ أساسية للتفاعل مع الاتحادات في شيفرة لغة سي. يعد الوصول إلى حقول الاتحاد غير آمن لأن رست لا يمكنها ضمان نوع البيانات المخزنة حاليًا في نسخة الاتحاد. يمكنك معرفة المزيد عن الاتحادات في توثيق رست Rust Reference. متى تستعمل شيفرة غير آمنة؟ لا يُعد استعمال unsafe لفعل أحد الأفعال الخمسة (القوى الخارقة) التي ناقشناها للتو أمرًا خاطئًا أو غير مرغوب إلا أنه من الأصعب الحصول على شيفرة unsafe صحيحة لأن المصرف لا يستطيع المساعدة بدعم آمان الذاكرة. عندما يكون لديك سببًا لاستخدام شيفرة unsafe تستطيع ذلك، ويسهّل وجود تعليق توضيحي unsafe صريح تعقب مصدر المشكلات عند حدوثها. ترجمة -وبتصرف- لقسم من الفصل Advanced Features من كتاب The Rust Programming Language. اقرأ أيضًا المقال التالي: مفاهيم متقدمة عن السمات Trait في لغة رست المقال السابق: صياغة أنماط التصميم الصحيحة Pattern Syntax في لغة رست البرمجة بلغة رست استخدام ميزة تمرير الرسائل Message Passing لنقل البيانات بين الخيوط Threads في لغة رست برمجة لعبة تخمين الأرقام بلغة رست
    1 نقطة
  13. قواعد البيانات 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 نقطة
×
×
  • أضف...