لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 10/09/23 في كل الموقع
-
السلام عليكم اسمي محسين انا جديد في اكادمية حسوب اود ان اشكر استاذ خالد السعداني على شرحه المميزللغة html و اتمنى تعطوني نصيحة كمبتدئ2 نقاط
-
<body> <h3> click the play button </h3> <audio id="myAudio" controls> <source src="straykids.mp3" type="audio/mpeg"> </audio> <h4> click the play button to watch the video </h4> <video width="640" height="360" controls> <source src="straykids.mp4" type="video/mp4"> your browser does not support the video tag </video> </body>1 نقطة
-
1 نقطة
-
السلام عليكم. هل يمكن إستعمال أدوات لم يقع التطرق إليها في الدورة كredux أو tailwind (للذكر لا للحصر) شكرا1 نقطة
-
أهلا محمود، لا الإمتحان يتمحور حول ما درسته في الدورة فقط، لن تجد فيه أشياء لم تتطرق لها الدورة أو أشياء لم تُشرح فقط ما تم شرحه خلال المسارات. ستجد في صفحة الامتحان والحصول على الشهادة كل شيء يتعلق بهذا الموضوع.1 نقطة
-
الخطوة الأولى هي فهم السبب وراء فقدانك للحماس. يمكن أن يكون هذا صعبًا أحيانًا، حيث قد يكون هناك أسباب متعددة. ومع ذلك، من المهم تحديد السبب الأساسي حتى تتمكن من إيجاد حل. بعض النصائح التي قد تساعدك: ركز على الجوانب الإيجابية للمشروع. تذكر سبب انضمامك إلى المشروع في البداية. قم بتقييم تقدمك. انظر إلى كل ما حققته حتى الآن. اجعل المشروع ممتعًا. ابحث عن طرق لجعل العمل على المشروع أكثر متعة. ابحث عن دعم من الآخرين. تحدث إلى أصدقائك أو عائلتك أو زملائك في العمل عن مشاعرك. خذ استراحة من المشروع قد تحتاج إلى أخذ استراحة من المشروع لبعض الوقت حتى تتمكن من العودة إليه بعقل متجدد ابحث عن طرق جديدة للتحفيز قد يكون من المفيد التحدث إلى مستشار1 نقطة
-
إليك بعض النصائح أثناء تعلمك من دورات أكاديمية حسوب: تأكد من الفهم السليم للأساسيات (محتوى الدرس أو الموضوع الأساسي للدرس) لا تكتفي فقط بمشاهدة الدرس و الإستماع، و إنما عليك بالتطبيق و كتابة الكود بنفسك حتى تتعود، ستجد في البداية صعوبة لكن كلما تعودت على هذه الممارسة كلما تطورت أكثر. يُمكنك تدوين المعلومات المهمة على شكل رؤوس أقلام او مخططات حتى تعود لها في حالة النسيان أو عند المراجعة لتذكر تلك المعلومات. لديك عدد كبير من المقالات منشورة على أكاديمية حسوب في شتى المجالات و التقنيات ستساعدك كثيراً في زيادة معلوماتك التي خرجت بها من الدرس و للتوسع أكثر، إستخدم محرك البحث أو حقل البحث في موقع الأكاديمية. لديك أيضاً موسوعة حسوب فهي تحتوي على توثيق لمعظم اللغات و التقنيات باللغة العربية يُمكنك الإستفادة منها سواء في المراجعة أو زيادة الفهم. توفر أكاديمية حسوب عدد من المدربين المحترفين الذين يمكنهم مساعدتك في أي وقت، لذلك إن وجدت صعوبة في فهم درس ما أو جزء مُعين يُمكنك الإستفسار عنه و سيجيب عليك أحد المدربين و يوضح لك الجزء الذي تسأل عنه، الصفحة التالية توضح لك طريقة الإستفسار حتى تحصل على أجوبة أفضل كيف أتواصل مع المدرّبين ستجد بعض النصائح في هذا المقال: و هنا مساهمات مشابهة لما تسأل عنه:1 نقطة
-
وعليك السلام يا محسن، بخصوص نصائح للدراسة بشكل جيد، فهي ألا تستعجل وعليك بالاستيعاب والفهم ثم البحث وقراءة أو مشاهدة المزيد ولا تكتفي في حال احتجت لتوضيح أمرًا ما، ثم تستطيع السؤال أسفل فيديو الدرس لمساعدتك، وعليك التركيز على الأساسيات وتنفيذ أكثر من مشروع عليها. ولا تنسى كتابة الكود بيديك وبمفردك لا المشاهدة فقط، حيث أنك ستخطيء وستتعلم من ذلك الكثير، فعقلك يخدعك وتظن أنك قادر على تنفيذ ما يتم شرحه أو مستوعب لما يحدث وعند التنفيذ بمفردك تجد أنك بحاجة إلى التركيز والممارسة لفهم الأمر. وستجد هنا نصائح وشرح مفصل أكثر:1 نقطة
-
السلام عليكم. أواجه مشكل في إرسال البيانات إلى الخادم الكود const handleSubmit = (e) => { e.preventDefault() axios .post("http://127.0.0.1:8000/api/users/register", formData) .then((res) => console.log(res.data)) .catch((err) => console.log(err)); } package.json "proxy": "http://127.0.0.1:8000" رسالة الخطأ Access to XMLHttpRequest at 'http://127.0.0.1:8000/api/users/register' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. AxiosError {message: 'Network Error', name: 'AxiosError', code: 'ERR_NETWORK', config: {…}, request: XMLHttpRequest, …} شكرا على المساعدة1 نقطة
-
مشكلة cors -وتعني "Cross-Origin Resource Sharing"- هي مشكلة شائعة، أين يتم حظر الطلبات من نطاق مختلف. لتلافي هاته المشكلة في تطبيقات NodeJS يقترح استخدام المكتبة cors عادة، قم بتتثبيتها: npm install -S cors ثم في ملف الخادم الرئيسي قم باستيرادها: import cors from 'cors'; وقم باستعمالها من طرف التطبيق: app.use(cors()); أعد تشغيل الخادم وانظر ما ان اختفت المشكلة.1 نقطة
-
السلام عليكم. قد ننسي أحيانا كلمة المرور لحساب معين بسبب من الأسباب. كذلك الشأن لmongo db atlas. لذلك كيف يمكن تغيير كلمة المرور لقاعدة بيانات محددة. شكرا.1 نقطة
-
1 نقطة
-
عندما تقوم بتطوير نموذج ذكاء صنعي مثل توقع اسعار التداول اليومي للبورصة أو تمثل ارتفاع اسعار البترول أو مثلا بيانات عن المشتريات وقيمتها المالية أو بيانات طبية وهكذا، كل هذه البيانات يصعب الحصول عليها لتدريب نموذج ذكاء صنعي إما بسبب أن المنظمة لا تعطي معلومات لمنافسيها أو أن حقوق المرضى محفوظة بالتالي لن تستطيع الحصول عليها، بالتالي تستطيع استخدام مكتبة faker في إنشاء هذه الانواع من البيانات وكأنها بيانات حقيقة وتدريب نماذج الذكاء الصنعي عليها وتستطيع الاستثمار بهذه النماذج1 نقطة
-
اريد شراكة شخص لديه معمل حياكة البسة في مصر راس ماله 100الف دولار واريد ان ادفع نفس راس ماله ليصبح كل شي متساوي انا لن اعمل معه الان ممكن ان انضم للعمل في السنة التانية السؤال كم هي نسبة اتعابه من الأرباح وهل اذا ياخذ اتعاب من الأرباح يكون له راتب شهري أيضا وشكرآ1 نقطة
-
وجزاك الله الخير سيد احمد . يمكنك فعل ذلك بوضع حدث click لnewInput قبل إضافته الى الinputs , أي سوف يكون ملف javascript كالتالي : const inputs = document.querySelectorAll(".input"); const menus = document.querySelectorAll(".menu"); inputs.forEach((input, index) => { input.addEventListener("click", function() { menus[index].classList.toggle("active"); }); }); const addRowButton = document.querySelector("#add-row"); addRowButton.addEventListener("click", function() { const newRow = document.createElement("tr"); const newCell = document.createElement("td"); const newDropdown = document.createElement("div"); const newSearchInput = document.createElement("div"); const newInput = document.createElement("input"); const newMenu = document.createElement("div"); newDropdown.className = "dropdown"; newSearchInput.className = "search_input"; newInput.className = "input"; newInput.type = "text"; newInput.placeholder = "search"; newMenu.className = "menu"; newMenu.innerHTML = ` <p>html</p> <p>CSS</p> <p>js</p> `; newDropdown.appendChild(newSearchInput); newSearchInput.appendChild(newInput); newDropdown.appendChild(newMenu); newCell.appendChild(newDropdown); newRow.appendChild(newCell); newInput.addEventListener("click", function() { newMenu.classList.toggle("active"); }); const tbody = document.querySelector("tbody"); tbody.appendChild(newRow); inputs.push(newInput); menus.push(newMenu); });1 نقطة
-
يمكنك فعل ذلك مثل ما قال استاذ سمير , لكن يجب عليك اضافة ذلك عند اضافة سطر جديد , الكود التالي يوضح ذلك : ملف HTML : <!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"> <style> .dropdown { width: 180px; position: relative; margin: 5px; } .menu { position: absolute; width: 100%; display: none; border: blue; background-color: lightgray; z-index: 1; } .active { display: block; } </style> </head> <body> <table> <thead></thead> <tbody> <tr> <td> <div class="dropdown"> <div class="search_input"> <input class="input" type="text" placeholder="search"> </div> <div class="menu"> <p>html</p> <p>CSS</p> <p>js</p> </div> </div> </td> </tr> <tr> <td> <div class="dropdown"> <div class="search_input"> <input class="input" type="text" placeholder="search"> </div> <div class="menu"> <p>html</p> <p>CSS</p> <p>js</p> </div> </div> </td> </tr> </tbody> <tfoot></tfoot> </table> <button id="add-row">add new row</button> <script src="main.js"></script> </body> </html> ملف main.js : // main.js const inputs = document.querySelectorAll(".input"); const menus = document.querySelectorAll(".menu"); inputs.forEach((input, index) => { input.addEventListener("click", function() { menus[index].classList.toggle("active"); }); }); const addRowButton = document.querySelector("#add-row"); addRowButton.addEventListener("click", function() { const newRow = document.createElement("tr"); const newCell = document.createElement("td"); const newDropdown = document.createElement("div"); const newSearchInput = document.createElement("div"); const newInput = document.createElement("input"); const newMenu = document.createElement("div"); newDropdown.className = "dropdown"; newSearchInput.className = "search_input"; newInput.className = "input"; newInput.type = "text"; newInput.placeholder = "search"; newMenu.className = "menu"; newMenu.innerHTML = ` <p>html</p> <p>CSS</p> <p>js</p> `; newDropdown.appendChild(newSearchInput); newSearchInput.appendChild(newInput); newDropdown.appendChild(newMenu); newCell.appendChild(newDropdown); newRow.appendChild(newCell); const tbody = document.querySelector("tbody"); tbody.appendChild(newRow); inputs.push(newInput); menus.push(newMenu); newInput.addEventListener("click", function() { newMenu.classList.toggle("active"); }); }); تمت إضافة زر "add new row" لإضافة صف جديد إلى الجدول، وعند النقر على الزر، سيتم إنشاء عناصر HTML جديدة وإضافتها إلى الجدول، مع تعيين استماع الحدث على المدخل الجديد المنشئ لتبديل الفئة النشطة على القائمة الجديدة.1 نقطة
-
1 نقطة
-
شاع في السنوات الماضية مع تطوّر التقنية في حياتنا ودخولها لكل جوانبها مصطلح الأمن السيبراني Cybersecurity، كما أن الطلب تزايد عليه بالنظر إلى أنّ أي مؤسسة تستخدم تقنيات الحاسوب بحاجة لحماية بنيتها التحتية ضدّ الهجمات الخبيثة والمخترقين. تُشير بعض الإحصاءات التي أجرتها الجمعية الدولية للضمان الاجتماعي ISSA عام 2021 آنذاك إلى أن 57 بالمئة من المؤسسات تعاني من نقص بخصوص مختصّي الأمن السيبراني، وإن دلّت هذه الأرقام على شيء فهي تدلّ على نموّ هذا المجال وتزايد الطلب عليه. فما هو اختصاص الأمن السيبراني؟ وما هي مهام مختص الأمن السيبراني؟ وكيف يمكنك البدء بتعلم هذا المجال؟ هذا ما سنناقشه ضمن هذا المقال. تاريخ الأمن السيبراني كانت الحاجة للأمن السيبراني واضحة منذ ظهور شبكة الإنترنت وانتشارها في ثمانينيات القرن الماضي، إذ شهدنا ظهور مصطلحات متعلقة بهذا المجال مثل الفايروس Virus ومضاد الفيروسات Anti-virus وغيرها، إلا أن التهديدات السيبرانية لم تكن بالتعقيد والصعوبة التي هي عليه الآن. أولى ظهور لبرمجية خبيثة malware كان في عام 1971 باسم كريبر Creeper إذ كان برنامجًا تجريبيًا كُتب بواسطة بوب توماس في شركة BBN، تلاه بعد ذلك ظهور أول مضاد فيروسات في عام 1972 باسم ريبر Reaper الذي أنشئ بواسطة راي توملنسون بهدف القضاء على البرمجية الخبيثة كريبر. مع وصول شبكة الإنترنت إلى كافة بقاع العالم ومع التحول الرقمي الحاصل في كافة قطاعات الحياة اليوم أهمها قطاعات البنى التحتية المدنية من أنظمة تحكم وأنظمة الطاقة والاتصالات والمياه وقطاع الصحة والقطاعات المالية والمصرفية وقطاع النقل والطيران وغيرها، بدأت الهجمات السيبرانية تأخذ بعدًا آخر، فتخيل ماذا سيحصل إن حصل هجوم سيبراني على أحد تلك الخدمات المهمة المفصلية أو تخيل حصول هجوم سيبراني على أحد أنظمة إدارة السدود أو الطاقة في بلد ما، هذا لا يقاس مع حصول هجمات على أفراد التي تكون دائرة الضرر فيها صغيرة جدًا، إذ ممكن أن تؤدي إلى شلل في الحياة وهنالك الكثير من أمثلة تلك الهجمات لا يسع المقال لذكرها هنا. أذكر مرة أنه حصل خلل في التراسل الشبكي في أنظمة إحدى المباني الخدمية مما أوقف العمل بشكل كامل في ذلك المبنى لتتراكم أعداد الناس وتشكل طوابير طويلة منتظرين عودة النظام للعمل أو ستتوقف معاملاتهم بالكامل، وأذكر مرة حصل خلل في نظام شبكة محطات الوقود لتخرج مجموعة كبيرة من المحطات عن العمل في المدينة وتصطف طوابير من السيارات منتظرة عودة الخدمة للعمل، وهذان مثالان عن عطل غير مقصود فما بالك لو كان مقصودًا وناجمًا عن هجوم سيبراني منظم؟ تخيل ماذا سيحصل، لذا كانت أهمية الأمن السيبراني بأهمية الحاجة إليه والضرر الحاصل دونه. ما هو الأمن السيبراني؟ يُعرف الأمن السيبراني Cybersecurity بأنه عملية تأمين وحماية الأنظمة الرقمية والشبكات الإلكترونية وكل ما يتعلق بالأجهزة الرقمية وتكنولوجيا المعلومات الرقمية ضدّ أي هجمات رقمية أو تسمى هجمات سيبرانية Cyber Attacks. تستهدف الهجمات السيبرانية تخريب أو تعطيل أو سرقة شبكة أو نظام حاسوبي، أو دخولًا غير مصرّح به إليهما، وقد يكون الهدف من هذه الهجمات الوصول إلى بيانات ما لتعديلها أو تخريبها، أو ابتزاز الفرد أو المؤسسة مقابل هذه البيانات، أو أن تكون ذات هدف تخريبي تهدف لإيقاف عمل المؤسسة. تأتي هنا مهمّة الأمن السيبراني ألا وهي وقف هذه الهجمات السيبرانية عن طريق الكشف عن الفيروسات الرقمية وتعطيلها وتأمين وسائل اتصال مشفّرة وآمنة تضمن تبادل البيانات الحساسة دون خطر تسريبها أو قدرة الوصول إليها من المخترقين. يستخدم مختصّ الأمن السيبراني لتحقيق ذلك مجموعة من الأدوات والتقنيات مثل جدران الحماية (النارية) Firewalls وأنظمة كشف التسلل Intrusion Detection Systems أو اختصارًا IDS، بالإضافة إلى إجراء اختبارات الأمان وتعريف حدود واضحة (صلاحيات المستخدم، أماكن تخزين البيانات الحساسة، …إلخ). فوائد الأمن السيبراني يستند الأمن السيبراني على ثلاث مبادئ وهي الخصوصية Confidentiality والسلامة Integrity والتوفر Availability، ويرمز إلى هذه المبادئ بشكل كامل بالاختصار CIA: الخصوصية: ضمان الوصول إلى الأنظمة والبيانات فقط للأشخاص المُصرَّح بهم، بإجراء عمليات التعديل البيانات واستعادتها والاطّلاع عليها. السلامة: ويُقصد بها سلامة البيانات وهي ضمان أن البيانات يمكن الاعتماد عليها بشكل دقيق وصحيح، دون أن تُغيَّر من قبل أطراف أخرى غير مصرّح لها بالتغيير (وهو ما يضمنه المبدأ السابق). التوفر: ضمان أن الأطراف المُصرّح لها بالوصول إلى البيانات تستطيع الوصول إليها بأي وقت دون مشاكل وبشكل مستمرّ، وهذا يتطلب المحافظة على سلامة التجهيزات (العتاد الصلب) وسلامة البنية التحتية والنظام الذي يحتوي على البيانات ويعرضها. التطبيق الصحيح للمبادئ الثلاث السابقة يضمن لنا حماية بياناتنا الشخصية ويوفّر بيئة عمل مريحة وآمنة في المؤسسات التي تعتمد على التقنيات والأنظمة الحاسوبية، مما ينعكس بالإيجاب على سمعة المؤسسة وأدائها. أضِف إلى ذلك تفادي الخسارات في حال وقوع هجوم سيبراني على المؤسسة، سواءً أكانت ماديّة (تعطّل بنى تحتية أو سرقة بيانات أو ابتزاز) أو معنويّة (خسارة المؤسسة سمعتها وثقة جمهورها). إذ تُشير إحصاءات أجرتها مجلة Cybercrime المختصة بمجال الأمن السيبراني في عام 2021 إلى أن الجرائم السيبرانية تسببت بخسائر قيمتها 6 تريليون دولار أمريكي، دعونا نقارن هذا الرقم لفهم ضخامته، إذ أنه سيأتي ثالثًا إذا أردنا وضعه ضمن الناتج المحلي الإجمالي لدول العالم بعد الولايات المتحدة الأمريكية والصين! ومن المقدّر أن تزداد الخسائر باستمرار بحلول عام 2025 إلى 10.5 تريليون دولار أمريكي. دعنا لا ننسى أيضًا مهمة مميزة للأمن السيبراني ألا وهي استرداد البيانات واسترجاعها إن حصلت عملية اختراق أو تخريب، إذ تُعدّ مهمة استعادة البيانات بسرعة من أهم مهام مختص الأمن السيبراني. وجود فريق أمن سيبراني مختص لصدّ الهجمات والتعرّف عليها أمر لا غنى عنه، خصوصًا في القطاعات الحساسة مثل المؤسسات الحكومية والبنوك وشركات الطيران. لكن هل تحتاج جميع المؤسسات إلى الأمن السيبراني بقدر متساوٍ من الأهمية؟ في الحقيقة لا، فأهمية الأمن السيبراني بالنسبة لمدوّنة أو موقع شخصي ليست بقدرٍ مساوٍ لشركة طيران أو مؤسسة مصرفيّة. ألا أن هنالك قواعد عامّة يجب اتّباعها بغض النظر عن غرض المؤسسة وطبيعة نشاطها كإدارة البيانات الحساسة وحمايتها مثل كلمات المرور والمحافظة على آخر إصدار مستقر من العتاد البرمجي المُستخدم وأخذ نُسخ احتياطية من البيانات بشكل دوري. ما هو الفرق بين أمن المعلومات والأمن السيبراني؟ قد تتساءل ما الفرق بين أمن المعلومات والأمن السيبراني؟ إذ كثيرًا ما يُطرح هذا السؤال وهو ما سنجيب عليه في هذه الفقرة. يهتمّ الأمن السيبراني كما ذكرنا سابقًا بحماية الأنظمة والأجهزة الحاسوبيّة، ويتضمن ذلك أمن الشبكات والتطبيقات والسحابة cloud والبنية التحتية، وذلك بمنع الوصول غير المصرّح له لهذه الأنظمة بهدف التحكم بها أو الحصول على البيانات التي تحتويها. يركّز مجال أمن المعلومات على المعلومات بذات نفسها وكيفية حمايتها بغض النظر عن الوسيط الذي يحتويها بخلاف الأمن السيبراني (النظام أو العتاد الصلب)، ويُعدّ مجال أمن المعلومات خط الدفاع الثاني في حال التعرض لهجوم سيبراني واختراقه بحيث لا يستفيد المخترق من البيانات حتى وإن كانت بحوزته (إذ أن خط الدفاع الأول هنا هو الأمن السيبراني). مصطلحات شائعة في مجال الأمن السيبراني نذكر هنا بعض أكثر المصطلحات شيوعًا في مجال الأمن السيبراني ومعناها بشرح مقتضب: الجريمة السيبرانية Cybercrime: هي أي هجوم يقوم بها شخص أو مجموعة من الأشخاص ويكون الهدف فيها نظام حاسوبي بهدف التحكم به أو الحصول على بيانات بشكل غير مُصرَّح به، إما بهدف التخريب أو الابتزاز. شبكة روبوتات Robot Network: تُعرف اختصارًا باسم Botnet وهي شبكة تتكون من آلاف أو ملايين الأجهزة المتصلة مع بعضها البعض والمصابة ببرمجية خبيثة malware، ويستخدم المخترقون هذه الشبكة لتنفيذ هجماتهم مثل هجمات الحرمان من الخدمة الموزّع DDoS attacks أو إرسال الرسائل المزعجة Spam. ** خرق بيانات Data Breach**: هي الحادثة التي يحصل بها المخترق على بيانات ما بعد نجاح هجمة سيبرانية، وعادةً ما تكون هذه البيانات بيانات شخصية حساسة مثل كلمات المرور أو بيانات مصرفية وغيرها. المخترق ذو القبعة البيضاء White hat وذو القبعة السوداء Black hat: يُقصد بهذين المصطلحين نيّة كل مخترق من عملية الاختراق إذ أن للمخترق ذو القبعة السوداء نيّة سيئة باستخدام البيانات التي يحصل عليها أو الثغرات الأمنية بالابتزاز المالي أو التخريب بينما يكون هدف المخترق ذو القبعة البيضاء الكشف عن هذه الثغرات وسدّها لحماية النظام بشكل أكبر وغالبًا ما تُدعى هذه الفئة من المخترقين بالمخترقين الأخلاقيين Ethical Hackers. أنواع تهديدات الأمن السيبراني على الرغم من تطوّر الهجمات السيبرانية مع مرور الوقت وزيادة تعقيدها إلا أن هناك العديد من أنواع التهديدات الشائعة التي يجب أن يكون مختصّ الأمن السيبراني ملمًّا بها وبطريقة تحصين النظام ضدها. نذكر من أشهر أنواع تهديدات الأمن السيبراني ما يلي: التصيّد الاحتيالي Phishing: هي محاولة المخترق لخداع الضحية الهدف باتخاذ إجراءات غير آمنة وخاطئة، مثل إرسال رابط لصفحة دخول إلى موقع معيّن ومطالبتهم بتسجيل الدخول بحساباتهم في هذا الموقع، إلا أن الصفحة مُستنسخة وعملية التسجيل مزيّفة مما يسمح للمخترق بالحصول على بيانات حساب الضحية. هجمات الحرمان من الخدمة الموزّعة Distributed Denial of Service: تُعرَف اختصارًا بهجمات DDoS، وهي هجمات تتمّ عن طريق إغراق خادم النظام بسيل من المعلومات غير اللازمة باستخدام مجموعة من الأجهزة Botnet وذلك بهدف تعطيل الخدمة أو إبطائها، مما يتسبب بحرمان استخدام الخدمة للمستخدم أو حجبها. البرمجيات الخبيثة malware: هي برمجية يزرعها المهاجم في النظام الضحية بحيث تُنفّذ مجموعة من الأوامر والمهام غير المصرّح بها على جهاز الضحية، نذكر من هذه البرمجيات برمجيات الفدية ransomware التي تشفّر بيانات جهاز الضحية وتمنعه من الدخول إليها بهدف الحصول على مبلغ مالي، وبرمجيات التجسس spyware التي تراقب نشاط المستخدم على حاسبه بشكل سرّي وتسرق بيانات حساسة مثل كلمات السر. هجمات كلمة المرور password attacks: هجوم يحاول فيه المخترق تخمين كلمة المرور لملفات أو نظام، وتتم عملية التخمين عادةً بمساعدة أدوات مخصصة وليس يدويًا. لذا يُنصح على الدوام بالابتعاد عن كلمات السر القصيرة والمُستخدمة بكثرة مثل password123 أو qwerty، والكلمات الموجودة في القاموس دون إضافة رموز وأرقام بينها (لأن هذه الأدوات تجرّب الكلمات الموجودة في القواميس). هجوم الوسيط man-in-the-middle attack: هجوم يستطيع المخترق عن طريقه الوصول إلى البيانات المُرسلة بين المُرسل والمُستقبل عن طريق التنصّت إلى الاتصال ما بينهما، وتتضمّن معظم بروتوكولات نقل البيانات نوعًا من التشفير والمصادقة للحماية من هذا النوع من الهجمات مثل شهادة SSL في بروتوكول HTTPS. أنواع الأمن السيبراني ينقسم مجال الأمن السيبراني إلى عدّة مجالات فرعية أخرى، إذ يختص كل مجال بعيّن بجانب من الفضاء السيبراني. نذكر من هذه المجالات ما يلي: أمن الشبكات Network Security: يُعنى هذا المجال بحماية شبكات الحاسوب ويُحقَّق ذلك عن طريق بعض التقنيات مثل منع فقدان البيانات Data Loss Prevention اختصارًا DLP وإدارة الوصول إلى الهوية Identitiy Access Managment اختصارًا IAM وغيرها من التقنيات التي تجعل من الشبكات فضاءً آمنًا لمشاركة البيانات. أمن الهواتف المحمولة Mobile Security: عادةً ما يكون لهواتف موظّفي المؤسسة أو طاقمها وصول كامل لنظام المؤسسة وبياناتها، وبالنظر إلى أن الهواتف المحمولة هي الجهاز الأكثر استخدامًا عادةً لكل فرد فهذا يُضيف أهميّة زائدة على هذا المجال، إذ يجب تأمين هذه الأجهزة ضد الهجمات الخبيثة باستخدام مختلف التطبيقات (مثل تطبيقات المراسلة وغيرها). أمن السحابة Cloud Security: بدأت كافة المؤسسات بتبني تقنيات السحابة مؤخرًا، مما جعل أمن السحابة مجالًا مهمًا. تتضمن عملية حماية السحابة شروط التحكم بها والوصول إليها وكيفية توزيع بياناتها وهيكلة البنية التحتية ويندرج كل ذلك فيما يدعى باستراتيجية أمن السحابة cloud security strategy. أمن إنترنت الأشياء IoT Security: يُقصد بإنترنت الأشياء مجموعة الأجهزة التي تتواصل مع بعضها البعض وتراقب بيئتها المحيطة باستخدام الحساسات بالإضافة إلى إمكانية التحكم بها عبر الإنترنت. يحمي أمن إنترنت الأشياء هذه الأجهزة من استغلالها من طرف المخترقين عن طريق استخدام ثغرات في الأجهزة بذات نفسها أو وسيط الاتصال فيما بينها. أمن التطبيقات Application Security: التطبيقات التي تستخدم اتصال الإنترنت معرّضة لخطر الاختراق كأي نظام آخر يستخدم شبكات الإنترنت. يعمل أمن التطبيقات على حمايتها عن طريق منع التفاعلات الخبيثة مع التطبيقات الأخرى أو الواجهات البرمجية API. مجالات الأمن السيبراني يحتوي مجال الأمن السيبراني على عدّة مسميات وظيفية فرعيّة مخصصة عنه، ولكل من هذه المسميات مهامها المحدّدة ومتطلباتها، نذكر منها أهم مجالات الأمن السيبراني مع شرح بسيط لكل منها. كبير موظفي أمن المعلومات كبير موظفي أمن المعلومات Chief Information Security Officer اختصارًا CISO هو موظف ذو خبرة كبيرة مسؤول عن أمان المعلومات ضمن المؤسسة بشكل كامل، وتضمن مهامه تطوير طرق حماية البيانات وصيانتها وإدارة برامج المخاطرة، وعادةً ما يشغل هذا المنصب شخصٌ له باعٌ طويل في مجال أمن المعلومات وعمل في واحدة أو أكثر من وظائف أمن المعلومات بحيث يمتلك على خبرة كافية تمكّنه من قيادة فريق الأمن السيبراني في المؤسسة. مهندس الأمن تتضمّن مهام مهندس الأمن Security Architect تصميم نظم الأمان المُستخدمة في الدفاع عن المؤسسة من هجمات البرمجيات الخبيثة، إذ يُجري مهندس الأمن اختبارات لكشف الثغرات ونقاط الضعف في النظام بالإضافة لتزويد المعلومات المهمة إلى أعضاء الفريق الأمني الآخرين. يتطلّب هذا العمل خبرة في مجال هندسة المعلومات والشبكات وإدارة المخاطر بالإضافة إلى بروتوكولات الأمن وتشفير المعلومات. مهندس الأمن السيبراني يعمل مهندس الأمن السيبراني Cybersecurity Engineer على الإجراءات اللازمة التي تمنع نجاح هجوم سيبراني على أنظمة المؤسسة من شبكات وأجهزة، إذ يعمل على تطوير أنظمة دفاع سيبرانية ويعمل بشكل وثيق مع باقي أقسام المؤسسة للحفاظ على أمنها العام. يتطلّب هذا المنصب فهمًا جيدًا لكيفية عمل الشبكات وإدارة نظم التشغيل وهيكلتها بالإضافة إلى إتقان لغة البرمجة C (لأن لغة C تتعامل مع الحاسوب بمستوى منخفض مما يمنحك أريحية التعامل مع نظام التشغيل ومكوناته مقارنةً بلغات البرمجة عالية المستوى الأخرى مثل جافاسكربت وبايثون). محلل البرمجيات الخبيثة يعمل محلل البرمجيات الخبيثة Malware Analyst على فحص وتحليل التهديدات السيبرانية مثل الفيروسات وأحصنة طروادة Trojan horses والروبوتات bots لفهم طبيعتها وتطوير أدوات حماية للمدافعة ضدها، بالإضافة إلى توثيق طرق الحماية ضد البرمجيات الخبيثة وتجنبها. يتطلب هذا المنصب فهمًا لكل من نظام ويندوز ولينكس بالإضافة إلى معرفة بلغة البرمجة C/C++، واستخدام بعض الأدوات مثل IDA Pro وRegShot وTCP View. مختبر الاختراق أو المخترق الأخلاقي يُعرف مختبر الاختراق Penetration Tester بالمخترق الأخلاقي Ethical Hacker أيضًا، وهو مستشار أمني تتمثل مهامه باستغلال الثغرات الأمنية ونقاط الضعف في النظام بطريقة مماثلة لما سيفعله المخترق ذو النية السيئة التخريبية، إلا أن مختبر الاختراق يُطلِع فريق الأمان السيبراني في المؤسسة على الثغرات لتصحيحها، كما أنه يصمّم أدوات الاختراق ويوثّق نتائج الاختبار. المحلل الجنائي الرقمي يعمل المحلل الجنائي الرقمي Computer Forensics Analyst بعد حدوث هجوم سيبراني، إذ يجمع الأدلة الرقمية ويحاول استعادة البيانات المحذوفة أو المُعدَّل عليها أو المسروقة. يتطلّب هذا العمل معرفة بالشبكات والأمن السيبراني وفهم لقوانين الجرائم السيبرانية بالإضافة إلى مهارات تحليلية والانتباه للتفاصيل الدقيقة. كيف أبدأ بتعلم تخصص الأمن السيبراني؟ إن أردت البدء بتعلم الأمن السيبراني، فهذا يعني أنه عليك أن تبدأ بتعلم بعض المفاهيم والأدوات الأساسية في هذا المجال ألا وهي: تعلم أساسيات البرمجة، وذلك باختيار لغة برمجة معيّنة (يُفضّل البدء بلغة C أو C++ إن أردت دخول مجال الأمن السيبراني لأن اللغتين تتعامل مع الحاسوب على مستوى منخفض مما يمنحك أريحية التحكم بنظام التشغيل وأجزاء النظام الأخرى). فهم كيفية عمل أنظمة التشغيل وبنيتها، ننصحُك هنا بقراءة كتاب أنظمة التشغيل للمبرمجين كيفية عمل قواعد البيانات التي تخزّن بيانات أي نظام حاسوبي وعمليّة تصميمها، يمكنك الاطّلاع على كتاب تصميم قواعد البيانات للحصول على فهم أوّلي حول هذا الموضوع. إتقان التعامل مع سطر الأوامر command line بمختلف أوامره البسيطة والمتقدمة. فهم كيفية عمل الشبكات وكيف تتواصل الأجهزة مع بعضها البعض وتتبادل البيانات باستخدام بروتوكولات الاتصال المختلفة. التعامل مع أحد توزيعات لينكس الموجهة للأمن السيبراني والاختراقات بتمرّس، ونذكر منها توزيعة ريدهات Redhat لإدارة الخوادم (التي ستمكنك من الحصول على شهادة RHCSA وشهادة RHCE) ولينكس كالي Kali Linux، إذ تحتوي هذه التوزيعات على أدوات أساسية للتعامل مع الشبكات ومهام الأمن السيبراني. ماذا بعد؟ اختر مجالًا لتركّز عليه من المجالات السابقة التي ذكرناها، إذ أنّ مسار التعلم الخاص بك سيختلف بحسب توجهك، وهناك بعض الشهادات التي يجب أن تمتلكها لتزيد من فرصك في الحصول على عمل بحسب المجال الذي تختاره. على سبيل المثال تُعدّ شهادة CEH هامة لمختبر الاختراق -أو المخترق الأخلاقي- وشهادة CHFI هامة للمحلل الجنائي الرقمي. نرشّح لك أيضًا كتاب دليل الأمان الرقمي للاستزادة وتعلّم المزيد بخصوص الأمن السيبراني والاختراق. المصادر: What is Cybersecurity? Everything You Need to Know | TechTarget Top 20 Cybersecurity Terms You Need to Know (simplilearn.com) What Is Cybersecurity | Types and Threats Defined | Cybersecurity | CompTIA How To Learn Cybersecurity on Your Own A Basic Guide On Cyber Security For Beginners 2022 Edition | Simplilearn The Life and Times of Cybersecurity Professionals 2021 - Volume V - ISSA اقرأ أيضًا الهجمات الأمنية Security Attacks في الشبكات الحاسوبية تأمين الشبكات اللاسلكية كيف نخفف من هجمات DDoS ضد موقعنا باستخدام CloudFlare 7 تدابير أمنية لحماية خواديمك1 نقطة
-
سنعمل في هذا المقال على إنشاء لعبة متاهة مرئية باستخدام محرك الألعاب الشهير يونيتي Unity، بحيث تكون الشخصية الرئيسية هي روبوت نتحكم بحركته، وسنتعلم الأدوات اللازمة لتطوير اللعبة. سنتعلم في هذا المشروع ما يلي: كيفية إنشاء أشكال ثلاثية الأبعاد. كيفية تغيير لون وحجم وموضع الكائنات. كيفية تعديل طريقة عرض اللعبة بحيث تتبع حركة اللاعب. كيفية إضافة شيفرة برمجية إلى الكائنات للتحكُّم في حركتها وتصرفاتها. ستحتاج في هذا المشروع إلى: عتاد: حاسوب يعمل بنظام ويندوز أو ماك، قادر على تشغيل يونيتي. برمجيات: محرر يونيتي، ويفضل تنصيبه مع تطبيق Unity Hub، الذي يتيح لك تثبيت عدة إصدارات من محرر يونيتي وإدارة الإضافات extensions. قد تستغرق عملية التنزيل وقتًا طويلًا نظرًا لحجم البرنامج الكبير نسبيًا، لذلك ننصحك بتنزيله وتنصيبه قبل بدء المشروع. إعداد المشروع أولًا، افتح محرر يونتي وانقر علىNew لإنشاء مشروع جديد: ثانيًا، سمِّ المشروع "Beginner Unity Sushi"، أو أي اسمٍ آخر تفضله، ثم انقر على خيار إنشاء المشروع Create Project وانتظر إلى أن يظهر مشروعك على الشاشة. ثالثًا، انقر على قائمة تخطيط الصفحة Layout الموجودة أعلى الزاوية اليمنى للشاشة، ثم اختر الوضع الافتراضي Default. رابعًا، تأكد من وجود مجلد المشاهد "scenes" في نافذة الممتلكات Assets؛ وفي حال عدم وجوده، أنشِئه عن طريق النقر على شريط القائمة menu الموجود أعلى القائمة، ثم النقر على شريط الممتلكات Assets الموجود في اليسار. انقر بعدها على خيار إنشاء Create، ثم على مجلد Folder، وسمّ المجلد "scenes". خامسًا، حان الآن وقت حفظ المشهد الأولي المرفق مع المشروع وذلك من القائمة العلوية بالنقر على ملف File، ثم احفظ المشهد باسم Save Scene as وسمّه "MazeRoboBegins" واحفظه في مجلد المشاهد "scenes" ضمن مجلد "Assets". ننصحك بحفظ المشروع بعد كل تعديلٍ تجريه عليه، وذلك بالنقر على File من القائمة أعلى الشاشة، ثم النقر على خيار Save Scenes، كما يمكنك اختصارًا النقر على مفتاحي Ctrl و S في أجهزة الويندوز، ومفتاحي Cmd و S في أجهزة ماك. إنشاء الشخصية الرئيسية ستكون الشخصية الرئيسية في لعبتنا عبارة عن رجل آلي نتحكم في حركته ضمن المتاهة، ولكن علينا تصميمه أولًا! أولًا، اصنع جسم الرجل الآلي بحيث يكون له شكل الكبسولة، وذلك بالنقر على الخيارات التالية بالترتيب: GameObject > 3D Object > Capsule. ثانيًا، انقر على جسم الرجل الآلي، وستظهر لك نافذة وحدة المراقب Inspector، حيث يمكنك إعداد الكائنات وتغيير خصائصها. سمِّ الكبسولة "MazeRobo" بكتابة اسم الكائن أعلى نافذة المراقب inspector كما هو موضح أدناه: ثالثًا، انقر على رمز المسنن في مربع التحويل Transform في نافذة وحدة المراقب، ثم اختر إعادة الضبط Reset وذلك لوضع الكائن في منتصف منصة العرض. رابعًا، لا زلنا بحاجةٍ إلى مزيد من الأشكال لتكوين رجلنا الآلي. لذلك، أضف مكعبًا Cube بالنقر على الخيارات التالية GameObject > 3D Object > Cube ثم أضف كرةً على النحو التالي: GameObject > 3D Object > Sphere، ثم غيِّر اسم المكعب إلى "Shades" والكرة إلى "Nose". خامسًا، لاحظ ظهور الكائنات الثلاثة ضمن قائمة على يسار الشاشة، انقر على الكائن "Nose" واسحبه ثم أفلته فوق "MazeRobo" كي يتحرك بحركته، وافعل المثل مع الكائن "Shades"، كما هو موضح أدناه: وبهذه الطريقة يمكننا تجميع الاشكال والحصول على شخصيات متكاملة من أشكال بسيطة. سادسًا، انقر على الكائن "Shades" ولاحظ وجود ثلاث إحداثيات (X, Y, Z) في نافذة المراقب inspector في قسم Transform تتحكم بموضع الكائن. غَيّر قيم الإحداثيات وشاهد ما الذي سيحدث، وضَع الرمز ~ أمام بعض القيم، ثم اعتمد القيم التالية: X = 0 Y = 0.64 Z = 0.42 سابعًا، أسند قيم الإحداثيات التالية للكائن "Nose": X = 0 Y = 0.5 Z = 0.5 الآن، يجب علينا تعديل شكل الكائنين لنحصل على شكلٍ مشابهٍ للرجل الآلي، وذلك بتعديل الحجم Scale وفقًا للقيم التالية للكائن "Shades": X = 0.64 Y = 0.16 Z = 0.16 والقيم التالية للكائن "Nose": X = 0.16 Y = 0.16 Z = 0.16 ليصبح لدينا الرجل الآلي التالي: تلوين الرجل الآلي أولًا، أنشئ مجلدًا جديدًا بالنقر على الخيارات التالية بالترتيب: Assets > Create > Folder، انقر بالزر الأيمن للفأرة عليه ثم انقر على خيار إعادة التسمية Rename وسمّه "Materials". ثانيًا، أنشئ مادتين جديدتين بالنقر على Assets > Create > Material وسمّهما "EyeBlack" و "NoseRed". لاحظ ظهور المادتين اللتين أنشأتهما في مجلد المواد "Materials" في نافذة المشروع Project أسفل الشاشة، وفي حال وجدتهما خارجه، فاسحبهما إلى داخل المجلد "Materials". يمكن تغيير لون مادة ما عن طريقة تغيير قيمة بياضها albedo في نافذة المراقب inspector، بالنقر على المستطيل الأبيض بجانب أداة اختيار اللون، ثم انتقاء اللون المناسب. ثالثًا، اختر اللون الأسود لمادة العين "EyeBlack" والأحمر لأنف الرجل الآلي "NoseRed". رابعًا، انقر على الكائن "Shades" ثم انقر على خيار the Materials في قسم Mesh Renderer، وانقر بعدها على الدائرة الصغيرة بجانب العنصر "0 Element" واختر منها "EyeBlack". الآن، أصبح لدى الرجل الآلي نظارات شمسية سوداء. خامسًا، كرِّر الخطوة السابقة واختر "NoseRed". الآن، أصبح لدى الرجل الآلي نظارات شمسية وأنف أحمر. التحكم بالرجل الآلي يجب عليك إضافة مكوّن الجسم الصلب RigidBody لتتمكن من تحريك الرجل الآلي. أولًا، انقر على الرجل الآلي، ثم على Component > Physics > Rigidbody للتحكم بالرجل الآلي في اللعبة. لاحظ أنه عند النقر على الرجل الآلي سيظهر قسم الجسم الصلب RigidBody في نافذة المراقب Inspector. انقر على قسم القيود Constraints لفتحه، ثم فعّل خيار تثبيت الدوران Freeze Rotation على محاور الإحداثيات الثلاث، وفعّل تثبيت الموقع Freeze Position على محور Y فقط. أصبحت الآن الشخصية الرئيسية للعبة جاهزة، لكن بإمكانك إضفاء طابع شخصي عليها عن طريق تغيير الألوان أو إضافة مزيدٍ من الأشكال إليها باستخدام خيار الكائنات ثلاثية 3D Objects الأبعاد كما في الخطوة السابقة، وحين تصبح راضيًا عن هيئة الرجل الآلي، انتقل إلى الخطوة التالية. إنشاء عالم اللعبة سنعمل في هذه الخطوة على إنشاء عالم اللعبة، أو المنصة التي سيتحرك عليها الرجل الآلي. أولًا، أضف الكائن Quad ليكون بمثابة الأرضية للعبة، وذلك بالنقر على الخيارات التالية: GameObject > 3D Object > Quad، وسمِّ الكائن "Ground" أي أرضية. ثانيًا، اضبط قيمة الدوران على محور X على القيمة 90 في مربع التحويل Transform في نافذة المراقب ثم عدّل الحجم للكائن Scale وفق القيم التالية: X = 40.96 Y = 40.96 Z = 1 لاحظ أن وضعية الرجل الآلي تحتاج إلى تعديل، إذ يظهر منتصفه عالقًا في الأرضية. ثالثًا، عدّل إحداثيات الموضع للرجل الآلي من نافذة التحويل Transform وفقًا لما يلي: X = 0 Y = 1 Z = 0 رابعًا، أضف مكعبًا Cube بالنقر على الخيارات التالية GameObject > 3D Object > Cube ليكون بمثابة حائطٍ في المتاهة، ثم أسند إليه إحداثيات الموضع التالية: X = -2 Y = 1.5 Z = 0 خامسًا، غيّر مقياس الحجم Y Scale للكائن الجديد إلى القيمة 3، ثم سمِّ الكائن "Wall". سادسًا، أنشئ مادةً جديدةً للحائط Assets > Create > Materials وغيّر قيمة البياض albedo لإعطائها اللون الأزرق، ثم سمّها "WallBlue". سابعًا، أسند المادة الزرقاء "WallBlue" للحائط "Wall" عن طريق سحبها وإفلاتها فوق الحائط، أو من خيار MeshRender > Materials من نافذة المراقب. سنعمل في الخطوات التالية على تحويل هذا الحائط إلى متاهة. تحريك الرجل الآلي سنكتب، في هذه الخطوة، الشيفرة اللازمة لتحريك الرجل الآلي. أولًا، أنشئ مجلدًا جديدًا من نافذة المشروع Project بالنقر على Assets > Create > Folder، وسمِّ المجلد "Scripts". ثانيًا، أنشئ مجلدًا داخل مجلد Scripts لكتابة الشيفرة بلغة #C بالنقر على Assets > Create > C# Script وسمّه "RoboMover". ثالثًا، انقر مزدوجًا على مجلد RoboMover لفتحه في المحرر ولاحظ أنك ستحصل على الشيفرة التالية: using System.Collections; using System.Collections.Generic; using UnityEngine; public class RoboMover : MonoBehaviour { // تُستخدم هذه الدالة للتهيئة void Start () { } //تُستدعى دالة التعديل مرةً واحدةً عند تصيير كل إطار void Update () { } } لنلقي نظرةً معمقةً على الشيفرة لنفهم آلية عملها: تهيئ الأسطر الثلاثة الأولى البرنامج للعمل. using System.Collections; using System.Collections.Generic; using UnityEngine; يُعّرف السطر التالي الصنف RoboMover من النوع العام public وتُكتب محتويات الصف داخل القوسين { }. public class RoboMover : MonoBehaviour { صرّحنا بعدها عن دالتين هما دالة البدء Start ودالة التعديل Update، ولاحظ أنهما فارغتان الآن، إذ سنُعدّلهما فيما بعد: void Update() { } الدالة Function: هي مجموعةٌ من التعليمات موجهةٌ للحاسوب ليُنفذ أمرًا ما، وتُسمى باسمٍ يدل على عملها. فعلى سبيل المثال، كثيرًا ما نستخدم الأمر "أعّد لي كوبًا من الشاي" في حياتنا اليومية والذي يماثل الدالة، إذ يعلم هنا الشخص الخطوات اللازمة لتحضير كوب الشاي وليس علينا تذكيره بها في كل مرة، فقط علينا ذكر الأمر؛ وكذلك الأمر بالنسبة للحاسوب، يكفي ذكر الأمر أو الدالة مع خطوات التنفيذ مرةً واحدةً، ثم نكتفي بعدها باستدعاء الدالة عن طريق ذكر اسمها فقط. لاحظ أن الدالة هنا من النوع الفارغ void أي أنها لا تعيد قيمةً بعد تنفيذها، على عكس مثال إعداد كوب الشاي، ولكن لو طلبنا إضافة الحليب على الشاي، هنا يكون نوع الدالة فارغًا لأنها تغيّر من خواص كوب الشاي فقط ولا تعيد لنا شيئًا. بعد التصريح عن نوع الدالة، يجب أن نذكر اسمها متبوعًا بقوسين دائريين () ولنا أن نتركهما فارغين أو نمرّر فيهما معاملات أو وسطاء الدالة، كأن نقول "حضّر لي كوبًا من الشاي (مع مكعبين من السكر)"، ثم نضع بعد ذلك التعليمات التي يجب أن تنفذها الدالة داخل القوسين {}، مثل اِغلِ الماء، ضع الماء في إبريق الشاي، أضِف أكياس الشاي، وهكذا. رابعًا، أضف الأسطر التالية على الشيفرة داخل الصنف، واحذف دالة البدء () void Start لأننا لن نحتاجها: public class RoboMover : MonoBehaviour { public float moveSpeed = 4.0f; public Rigidbody rb; public Transform tf; أضفنا ثلاثة متغيرات variables على الشيفرة لتسهيل استدعاء ما تدل عليه، إليك شرحًا موجزًا لعملها: المتغير moveSpeed: يدل على سرعة الحركة وهو رقم عشري من النوع العائم Float (عدد عشري). المتغير rb: يدل هذا المتغير إلى مركبة الجسم الصلب للرجل الآلي. المتغير tf: يشير هذا المتغير إلى مكون التحويل Transform. خامسًا، أضف الأسطر التالية إلى دالة التعديل Update: // تُستدعى دالة التعديل مرةً واحدةً عند لكل إطار void Update () { Vector3 desiredDirection = new Vector3 (Input.GetAxis ("Horizontal"), 0.0f, Input.GetAxis ("Vertical")); desiredDirection = moveSpeed * desiredDirection; desiredDirection = Time.deltaTime * desiredDirection; rb.MovePosition (rb.position + desiredDirection); } يُنشئ السطر الأول شعاعًا للمسافة المطلوبة desiredDirection، وهو مكونٌ من ثلاث مركبات للإحداثيات، اثنتان منهما للاتجاهات التي يدخلها اللاعب Input، والمركبة الثالثة هي العمق depth وقيمتها ثابتة 0.0. بعدها نضرب المسافة desiredDirection بمتغير السرعة moveSpeed، ثم نضرب المسافة desiredDirection بالمتغير Time.deltaTime والذي يشير للزمن منذ آخر عملية تعديل، ما يضمن أن الإحداثيات تتغير بدقة مهما كان نوع الجهاز الذي يُشغِّل اللعبة. إذًا، سيتحرك الرجل الآلي "MazeRobo" من خلال القيمة المحسوبة والمُخزنة في desiredDirection بالإتجاه الذي نحدّده وبخطوات صغيرة، عند كل تحديثٍ للشاشة. لا تنسى حفظ الشيفرة بالنقر على قائمة ملف File، ثم على حفظ Save. سادسًا، اسحب ملف الشيفرة RoboMover وأفلته فوق كائن MazeRobo في القائمة التسلسلية Hierarchy، كما هو موضح أدناه: سيظهر قسم خاص بالشيفرة "RoboMover" في نافذة المراقب أسفل قسم الجسم الصلب "Rigidbody": لاحظ وجود حقلين فارغين في قسم "RoboMover" هما rb و tf الذين يشيران إلى الجسم الصلب Rigidbody والتحويل Transform على الترتيب. انقر عليهما واسحبهما إلى الحقلين الفارغين كي تحصل على القيم المطلوبة لتحريك الرجل الآلي: أصبحت الآن جاهزًا للعب. انقر على زر اللعب Play الموجود في منتصف واجهة يونيتي، واستخدم مفاتيح الأسهم لتحريك الرجل الآلي، وانقر على زر Play مرةً أخرى لإيقاف اللعبة. تحسين الحركة سنعمل في هذه الخطوة على تحسين حركة الرجل الآلي، إذ أنه يمشي مستقيمًا ولا يستدير أو يلتفت حوله. أولًا، أضف السطر التالي على الشيفرة تحت دالة rb.MovePosition: rb.MoveRotation (Quaternion.LookRotation (desiredDirection, Vector3.up)); إذ يجعل هذا السطر الرجل الآلي MazeRobo ينظر إلى وجهته. ثانيًا، شغّل اللعبة وتحقق من حركة الرجل الآلي. لاحظ أنه أصبح يستدير باتجاه حركته، لكن سرعان ما يعود إلى الاتجاه الأصلي عند توقفه عن الحركة. سنعمل على إصلاح ذلك فيما يلي، ولكن علينا أولًا فهم سبب حدوث ذلك؟ تعتمد يونيتي القيمة 0 إتجاهًا افتراضيًا، لذلك عندما لا يُدخل اللاعب قيمةً، أي عندما لا يحرك الرجل الآلي، تكون قيمة الإدخال 0 ويتجه الرجل الآلي بالإتجاه الافتراضي، لذلك يجب علينا تعديل الشيفرة بحيث يستدير الرجل الآلي فقط وفقًا لمدخلات اللاعب. إذًا، سنعدل على الشيفرة بحيث نجعل الرجل الآلي يتحرك ويستدير فقط إذا كانت قيمة الإدخال من اللاعب أكبر من القيمة 0.01. ثالثًا، ضع جزء الشيفرة المتعلق بالإتجاه داخل تعليمة if ليُنفَّذ عند تحقق الشرط. سنغير الشرط فيما بعد، لكن اجعله الآن محققًا دائمًا بتمرير القيمة true مكان الشرط: // تُستدعى دالة التعديل مرةً واحدةً لكل إطار void Update () { if (true) { Vector3 desiredDirection = new Vector3 (Input.GetAxis ("Horizontal"), 0.0f, Input.GetAxis ("Vertical")); desiredDirection = moveSpeed * desiredDirection; desiredDirection = Time.deltaTime * desiredDirection; rb.MovePosition (rb.position + desiredDirection); rb.MoveRotation (Quaternion.LookRotation (desiredDirection, Vector3.up)); } } الآن، شغّل اللعبة مرةً أخرى وتحقق من حركة الرجل الآلي. رابعًا، أضف الأسطر التالية على دالة التعديل Update للحصول على القيمة المطلقة absolute value لمدخلات اللاعب، أي قيمة الرقم دون إشارته: void Update () { float inputHorizontal = Mathf.Abs (Input.GetAxis ("Horizontal")); float inputVertical = Mathf.Abs (Input.GetAxis ("Vertical")); if (true) { عندما تعطي الكائن أمرًا بالحركة للأمام فإن يونيتي يفسر هذا الأمر على أنه رقم موجب (1)، أما عندما تعطي أمرًا بالحركة للخلف فإن يونيتي يفسره على أنه رقم سالب (1-)، ولأننا نريد فقط تريد حجم الرقم، بغض النظر عن إشارته، استخدمنا القيمة المطلقة للرقم، إذ أن القيمة المطلقة لرقمٍ ما هي القيمة الموجبة للرقم أو الصفر. الآن، علينا تعديل شروط تعليمة if بحيث تتحقق فيما إذا كانت قيمة inputHorizontal أكبر من 0.01 أو إذا كانت قيمة inputVertical أكبر من 0.01، وسنحتاج إلى استخدام العامل أو orوالذي نمثله باستخدام شرطتين عموديتين || في لغة سي شارب #C، إذ تُوضع الشرطتين بين الحالتين اللتين نود التحقق منهما، كما يلي: condition A || condition B أما للعامل و فنستخدم الرمز التالي "&&". عدّل تعليمة if لتبدو كما يلي: if (inputHorizontal > 0.01f || inputVertical > 0.01f) { بعد هذا التعديل، يجب أن يستدير الرجل الآلي باتجاه حركته ويبقى كذلك، وإليك شيفرة دالة التعديل كاملةً كي تتحقق منها: void Update () { float inputHorizontal = Mathf.Abs (Input.GetAxis ("Horizontal")); float inputVertical = Mathf.Abs (Input.GetAxis ("Vertical")); if (inputHorizontal > 0.01f || inputVertical > 0.01f) { Vector3 desiredDirection = new Vector3 (Input.GetAxis ("Horizontal"), 0.0f, Input.GetAxis ("Vertical")); desiredDirection = moveSpeed * desiredDirection; desiredDirection = Time.deltaTime * desiredDirection; rb.MovePosition (rb.position + desiredDirection); rb.MoveRotation (Quaternion.LookRotation (desiredDirection, Vector3.up)); } ملاحقة الكاميرا سنعمل في هذه الخطوة على تعديل نطاق عرض الكاميرا بحيث تلاحق حركة الرجل الآلي. أولًا، انقر على الكاميرا الرئيسية Main Camera في نافذة القائمة التسلسلية Hierarchy من نافذة المراقب inspector، وأسند القيم التالية لمركبة الموضع، والدوران، والحجم، بالترتيب: الموضع: X: 0 Y: 9 Z: -5 الدوران: X: 60 Y: 0 Z: 0 الحجم: X: 1 Y: 1 Z: 1 شغّل اللعبة لتتحقق من حركة الكاميرا، وستلاحظ أنها لا تتبع حركة الرجل الآلي بعد، ولتحقيق ذلك يجب عليك تحديث موضع الكاميرا في كل إطار، بإضافة الشيفرة التي سنوردها أدناه. ثانيًا، أنشئ مجلدًا جديدًا لحفظ الشيفرة داخل مجلد Scripts بالنقر على Assets > Create > C# Script وسمّه "CameraMover". أضف المتغيرات الثلاث التالية داخل الصنف CameraMover: public class CameraMover : MonoBehaviour { public Transform tf; public Transform playerTransform; public Vector3 distanceBetweenPlayerAndCam; تتبِّع الأسطر السابقة التي أضفناها حركة ما يلي: موضع الكاميرا tf. موضع الرجل الآلي playerTransform. إحداثيات الموضع بين الكاميرا والرجل الآلي distanceBetweenPlayerAndCam. ثالثًا، حدِّد المسافة الابتدائية بين الكاميرا والرجل الآلي بإضافة السطر التالية على دالة البدء Start: void Start () { distanceBetweenPlayerAndCam = tf.position - playerTransform.position; } رابعًا، أضف السطر التالي لدالة Update للحفاظ على المسافة ذاتها في كل الإطارات: void Update () { tf.position = playerTransform.position + distanceBetweenPlayerAndCam; } خامسًا، أضف الشيفرة للكاميرا، وذلك بالنقر على خيار الكاميرا الأساسية Main Camera من القائمة، ثم اسحب شيفرة الصنف CameraMover وأفلتها فوق الكاميرا، ثم انقر على خيار الكاميرا الأساسية Main Camera من القائمة واسحبه إلى الحقل "Tf" في نافذة المراقب، واسحب MazeRobo إلى الحقل "Player Transform"، كما هو موضح أدناه: والآن، شغّل اللعبة ولاحظ كيف تلاحق الكاميرا حركة الرجل الآلي. إضافة مزيد من العناصر سنضيف الآن كرةً على المتاهة ليلعب بها الرجل الآلي. أولًا، أنشئ كرةً بالنقر على GameObject > 3D Object > Sphere وسمّها "Ball". ثانيًا، أسند القيم التالية لموضع الكرة: X: 0 Y: 1 Z: 2 ثالثًا، أنشئ مادةً لونها أخضر وسمّها "BallGreen"، ثم طبِّقها على الكرة بسحبها وإفلاتها عليها. شغّل اللعبة، وستلاحظ أن الكرة لا تتحرك عندما يلامسها الرجل الآلي. سنعمل على إصلاح ذلك فيما يلي. رابعًا، انقر على الكرة وفعّل خيار الجسم الصلب Rigidbody وذلك من Component > Physics > Rigidbody. الآن، شغّل اللعبة واختبر حركة الكرة. الفوز بعد أن أصبحت لدينا العناصر الرئيسية للعبة جاهزةً، علينا أن نحدد طريقةً للفوز. أولًا، أضف مكعبًا وسمّه "WinZone" ولوّنه بلونٍ مناسب، ثم حدِّده من القائمة التسلسلية وانقر لتحديد خيار Is Trigger من قسم Box Collider من نافذة المراقب: ثانيًا، أسند القيم التالية لموضع المكعب الجديد: X: -5 Y: 1 Z: -2 الآن سنكتب شيفرةً تتيح للمكعب "WinZone" التحسُّس للكرة عندما تلمسه، لذلك يجب علينا وضع علامة على الكرة. ثالثًا، انقر على الكرة في القائمة التسلسلية، ثم انقر على خيار الوسم Tag في نافذة المراقب: رابعًا، انقر على خيار إضافة وسم Add Tag ثم انقر على الرمز + لإضافة وسمٍ جديد وسمّه "Ball". خامسًا، انقر مرةً ثانيةً على الكرة في القائمة التسلسلية، ثم انقر على حقل الوسم Tag في نافذة المراقب مرةً ثانية واِختر الوسم الجديد الذي أضفناه. الآن، سنضيف بعض المؤثرات للاحتفال بفوز اللاعب. سادسًا، أنشئ Particle System بالنقر على GameObject > Effects > Particle System وسمّه "Fireworks" أي ألعاب نارية. سابعًا، انقر على كائن الألعاب النارية وألغِ تحديد المربع بجانب اسمه في نافذة المراقب، وذلك لإخفاء الكائن. ثامنًا، اختر اللون الأولي Start Color للألعاب النارية من نافذة المراقب، ثم أسند لإحداثيات الموضع قيمًا مطابقةً لقيم المكعب "WinZone". تاسعًا، أنشئ مجلدًا داخل مجلد Scripts لكتابة الشيفرة بلغة #C وسمّه WinZone، ثم امسح منه دالتي Start و Update وأضف عليه الشيفرة التالية: public GameObject fireworks; void OnTriggerEnter (Collider col) { if (col.transform.CompareTag ("Ball")) { fireworks.SetActive (true); } } تتحقق الشيفرة المُضافة من ملامسة أي جسم صلب للمكعب "WinZone" وتسند المتغير col للجسم الصلب، أما إذا كان الجسم الصلب هو الكرة، فسيظهر الكائن fireworks لتنطلق الألعاب النارية. عاشرًا، احفظ ملف الشيفرة ثم اسحبه وأفلته فوق WinZone في القائمة التسلسلية، ثم انقر على WinZone واسحب كائن الالعاب النارية الموجود أدناه إلى قسم الألعاب النارية "fireworks" في نافذة المراقب، كما هو موضح: أخيرًا، احفظ اللعبة ثم شغّلها واستمتع بتجربة اللعبة التي أنشأتها. ترقية اللعبة لاحظ أن المتاهة التي أنشأناها ليست مكتملة، ومهمتك الآن هي العمل على إكمالها وإضافة مزيدٍ من المكعبات وتعديل مركبات الحجم والموضع لتكون بمثابة جدران للمتاهة، ووضع مكعب الفوز في مكان يصعُب الوصول إليه. لا تنسى مشاركة اللعبة مع أصدقائك. خاتمة بهذا تكون قد أنشأت لعبتك الأولى على محرك الألعاب الشهير يونتي، تهانينا. ننصحك بالاستمرار والإطلاع على دروس صناعة الألعاب باستخدام يونيتي الموجودة على أكاديمية حسوب. إذا واجهت مشاكل مع يونيتي فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب ترجمة -وبتصرف- للمقال Robot maze من الموقع الرسمي لراسبيري باي. اقرأ أيضًا برمجة لعبة اختبار ذهني باستخدام سكراتش برمجة لعبة تفاعلية باستخدام سكراتش تصميم وبرمجة لعبة قفز باستخدام سكراتش لغات برمجة الألعاب تعرف على أشهر محركات الألعاب Game Engines1 نقطة