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

Khaled Osama3

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

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

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

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

    1

كل منشورات العضو Khaled Osama3

  1. حسنا في هذه الحاله يجب ان تجعل ال div الاعلي يأخذ كلاس col-6 فقط وفي هذه الحاله الصفحه ستأخذ اتنين inputs في نفس الصف: <div class="col-6 row">
  2. نعم بالظبط هكذا
  3. المشكلة هنا في طريقة تفسير escape characters \r و \b في مخرج cout. طريقة عمل escape characters تختلف باختلاف البرنامج أو اللغة. في سي++ escape character: - \r يعيد توضع المؤشر إلى بداية السطر. - \b يعيد حذف الحرف الأخير. لكن cout لا يدعمهما بالشكل المتوقع. فاذا جربت اكثر من برنامج او كومبيلر (يمكنك تجربه online complier) ستجد البعض يتعامل مع escape characters والبعض الاخر لا يتعامل معه. فالاختلاف من الممكن ان يكون في الاعتماد على نظام التشغيل المستخدم في بعض الحالات. ولكن لا تتوقف هنا فيمكنك الرجوع لتوثيق اللغة/المكتبة لمعرفة طريقة عملها, او تجنب استخدام escape واستعمال حلول برمجية محلية بدلا منها.
  4. سأوضح الفرق بين localStorage و sessionStorage و cookies: localStorage: يستخدم لتخزين البيانات بشكل دائم حتى بعد إغلاق المتصفح. مفيد جداً لتخزين البيانات الشخصية للمستخدم مثل الإعدادات. يفضل استخدامه عندما تحتاج إلى الاحتفاظ بالبيانات لفترة طويلة، وترغب في الوصول إليها حتى بعد إعادة فتح المتصفح. لا يفضل استخدامه عندما لا ينصح بتخزين كميات كبيرة من البيانات غير الضرورية حيث تبقى مخزنة بشكل دائم, وتجنب تخزين معلومات حساسة مثل البيانات المالية أو الصحية بسبب عدم أمانها. - مثال: حفظ إعدادات التفضيلات في تطبيق. - عندما يقوم المستخدم بتغيير خلفية التطبيق أو اللغة المفضلة، يمكن حفظ هذه التفضيلات باستخدام `localStorage` لكي يظلوا سارين حتى بعد إعادة فتح المتصفح. sessionStorage: يخزن البيانات فقط أثناء فترة عمل الجلسة (tab) في المتصفح. يستخدم عادة لحفظ حالة التطبيق أثناء تصفح المستخدم للصفحات. يفضل استخدامه عندما تحتاج إلى تخزين بيانات تكون ذات فائدة فقط خلال جلسة التصفح الحالية، ولا تحتاج إليها بعد إغلاق المتصفح. لا يفضل استخدامه عند تخزين به معلومات لابد من بقائها بعد انتهاء الجلسة مثل تفضيلات المستخدم. - مثال: تخزين استبيان أثناء جلسة التصفح الحالية. - عندما يقوم بملء استبيان، يمكن استخدام `sessionStorage` لتخزين الإجابات خلال جلسة التصفح الحالية عند رجوعه لها ولم يغلق المتصفح سيجد اجاباته ويكمل عليها. cookies: تخزن بيانات على جهاز المستخدم وترسل مع كل طلب. يمكن استخدامها لتتبع أنشطة المستخدم أو تسجيل الدخول. له تاريخ انتهاء فيمكن تحديد تاريخ انتهاء لـ `cookies`، حيث يُمكن أن تبقى البيانات حتى هذا التاريخ أو حتى يتم حذفها يدوياً. متى يفضل استخدامه عندما تحتاج إلى تخزين البيانات على الجهاز العميل مع تحديد مدة صلاحيتها, او عند الحاجة إلى مشاركة البيانات بين المتصفح والخادم في كل طلب. - مثال: حفظ معرف الجلسة لتحقيق تسجيل الدخول الآمن. - عند تسجيل الدخول، يُمكن حفظ معرف الجلسة في `cookies` مع تحديد فترة صلاحيته لضمان بقاء المستخدم مسجلًا حتى بعد إعادة فتح المتصفح. و تذكر المستخدم وتسجيله تلقائيا عند زيارته للموقع مرة أخرى.
  5. يمكنك وضع كل input في هذا السياق حتي تكون نفس حجم وتحت بعض <div class="col-12 row"> <label for="fname" class="col-sm-2 col-form-label"> الرقم الوطني:</label> <div class="col-sm-10"> <input type="text" id="fname" name="fname" class="form-control"><br><br> </div> </div> فهنا جعلنا كل input مع ال label سياخذون صف كامل (حسب col-12) وكل input ('col-sm-10') له نفس الحجم وكذلك الlabel ('col-sm-2') واستخدمنا كلاسات اخري في البوستراب لتحسين الشكل وتنسيقه (col-form-label و form-control)
  6. في صفحة الاجازات، يمكنك عرض قائمة تحتوي أسماء الموظفين لاختيار أحدهم. عند عمل صفحة إضافة/تعديل إجازة، قم بإضافة خيار لإختيار اسم الموظف من قائمة تحتوي على أسماء الموظفين. عند الحفظ، قم بإختيار رقم الموظف المقابل للاسم المختار وحفظه في حقل employee_id. <select name="employee_id"> // for loop <option value="1">أحمد</option> <option value="2">علي</option> </select> هذا سيمكنك من تخصيص بيانات الإجازة لكل موظف على حدى.
  7. نعم تعلم الداتا ستركتشر مهم جدا أثناء تعلم البرمجة بشكل عام. الداتا ستركتشر أو هياكل البيانات هي الطريقة التي نخزن وننظم المعلومات في البرنامج. تعتبر أحد المفاهيم الأساسية في البرمجة. بعض أهم أنواع الداتا ستركتشر التي سيكون من المفيد أن تتعرف عليها: - القوائم (Arrays) - القواميس (Objects) - الصفوف (Linked Lists) - الأشجار (Trees) - الطوابير (Queues) - المكامل (Stacks) فهم هذه الأنواع بشكل جيد سيساعدك كثيرا في اختيار أفضل تمثيل لبيانات تطبيقك والعمل عليها بشكل فعال. كما أن تعلم الداتا ستركتشر ضروري لفهم الخوارزميات والبرمجة الحسابية بشكل أعمق. إذا كنت تعلم هياكل البيانات، يمكنك تحسين قدراتك في تصميم الخوارزميات وتحليل الأداء، مما يساعد في بناء تطبيقات أفضل وأكثر فعالية. يمكنك البدء بفهم الهياكل الأساسية مثل القوائم، الطوابير، الأشجار، والجرافات، ثم توسيع فهمك لتشمل الهياكل المتقدمة وتطبيقاتها العملية. بالإضافة إلى ذلك، يمكن أن يكون تعلم هياكل البيانات مفيدًا عند التعامل مع بعض الإطارات (Frameworks) ومكتبات Node.js التي قد تستخدم هياكل البيانات في واجهة برمجة التطبيقات (API) الخاصة بها. في الخلاصة، تعلم الداتا ستركتشر مهم جدا للمبرمجين ولن يضرك بالتأكيد. أنصحك بتخصيص بعض الوقت له.
  8. نعم، يجب ان توجد علاقة بين جدول الموظفين و جدول الاجازات. كمثال يمكنك تصميم الجداول: جدول الموظفين: مفتاح رئيسي: id بيانات الموظف (الاسم، الوظيفة، تاريخ الميلاد، الرقم الوطني، الخ) وجدول الاجازات: مفتاح رئيسي: id employee_id - مفتاح أجنبي يربط بجدول الموظفين نوع الاجازة (اجازة سنوية، مرضية، ولادة، خاصة) تاريخ بداية الاجازة تاريخ نهاية الاجازة عدد أيام الاجازة هذا سيسمح لك بتتبع اجازات كل موظف عبر employee_id.
  9. من الممكن الخطأ في الكود في استخدام المتغير `i` في التعبير lambda. يمكنك تجربه تعديل جزء الكود ليبدو كما يلي: Table['3أكبر_قيمة'] = Table.apply(lambda row: col1_values[row.name] if col2_values[row.name]==0 else col2_values[row.name] if 0 < col2_values[row.name] <= 50 else None, axis=1) تم استبدال `i` بـ `row.name` لضمان استخدام الفهرس الصحيح للصفوف. يرجى تجربة هذا التعديل والتحقق مما إذا كان يحل المشكلة.
  10. لا داعي لإنشاء متغيرات A و B، بما أننا سنقوم بدمج selected_column_1 و selected_column_2 مباشرة, يفضل إعادة تعيين الفهرس مرة واحدة بعد الدمج لتجنب أي مشاكل. selected_column_1 = df.iloc[8::2, [0,1,2,cl3,cl4,cl5,cl6]] selected_column_2 = df.iloc[9::2, [2,cl3,cl4,cl5,cl6]] self.Table = pd.concat([selected_column_1, selected_column_2], axis=1, ignore_index=True) self.Table.reset_index(drop=True, inplace=True)
  11. يبدو انك تضع في الكود فهل يواجهك نفس الخطأ المسبق ام خطأ اخر ؟
  12. وعليكم السلام الخطأ هنا يقول أن إطارات البيانات التي تم توحيدها (a1, a2, a3) لديها مؤشرات مكررة. فيجب تعيين الفهرس مجددًا بشكل فريد لكل إطار بيانات قبل الدمج: a1 = a1.reset_index(drop=True) a2 = a2.reset_index(drop=True) a3 = a3.reset_index(drop=True) self.Table = pd.concat([a1, a2, a3], axis=0) يجب استخدام `ignore_index=True` أثناء عملية الدمج: باستخدام ignore_index=True سيقوم pandas بإعادة تعيين الأرقام بشكل متلاحق دون تكرار، حتى لو كانت مكررة في الأصل. فهذا سيؤدي لدمج البيانات بشكل صحيح دون أخطاء. self.Table = pd.concat([a1, a2, a3], axis=0, ignore_index=True) تأكد من أن المؤشرات فريدة لكل إطار بيانات قبل الدمج لتجنب هذه المشكلة.
  13. الفرق بين الطريقتين هو: الطريقة الأولى تستخدم طريقة GET لإرسال الطلب. الطريقة الثانية تستخدم طريقة POST لإرسال الطلب. الطريقة الأولى أبسط وأسهل للتطبيقات غير الحساسة, الطريقة الثانية أكثر أمانًا لأنها تمنع الحذف عن طريق الخطأ عبر GET. كما تدعم CSRF protection. أما بالنسبة لـ @method فهو تابع لارافل يُستخدم لتغيير طريقة الطلب عند استخدام POST، فمثلاً للحذف لابد من إرسال DELETE request. يُستخدم في البرمجة على الويب عدة أنواع من طرق HTTP (HTTP methods) لتحديد نوع العملية التي يجب أن يقوم بها الخادم على الموارد. فهؤلاء أهم طرق بروتوكول HTTP: - GET: يستخدم لجلب (استرجاع) معلومات من الخادم. مثل قراءة محتوى صفحة. - POST: يستخدم لإرسال معلومات جديدة إلى الخادم لإنشاء مورد جديد. مثل إنشاء تسجيل جديد في قاعدة البيانات. - PUT: يستخدم لتحديث معلومات مورد معين بالكامل. مثل تعديل بيانات تسجيل كاملة. - PATCH: كPUT ولكن يسمح بتعديل جزء من المورد فقط. - DELETE: يستخدم لحذف مورد معين. مثل حذف تسجيل من قاعدة البيانات. فبشكل عام الطريقة الثانية أفضل لأنها أكثر أمانًا وهي الطريقة المتبعة عمومًا في لارافل.
  14. المشكلة هنا أن auth()->user() سيعيد مستخدم متصل بشكل مباشر وليس موديل مستخدم. لكي تستدعي الدالة rated من الموديل يجب أن تحول المستخدم المتصل إلى موديل: $user = auth()->user(); if($user->rated($book)) { // code.. } أو استدعاء الدالة مباشرة على موديل المستخدم: if(auth()->user()->load('ratings')->rated($book)) { // code.. } حيث تقوم بتحميل علاقة التقييمات ratings لكي تتمكن من استدعاء الدالة rated. المهم هو أن تحول المستخدم المتصل إلى موديل قبل استدعاء أي دالة من موديل المستخدم.
  15. المشكلة هنا أن b لا يتم تفريغها بعد كل مرة تتم مقارنة الحروف وتحديد أطول سلسلة. لذلك عند الانتقال لحرف التالي لا يزال b يحتوي على الحروف السابقة، مما يؤدي دائما إلى تجاوز السلسلة الطول 2. الحل هو تفريغ b في نهاية كل دورة للمقارنة: var lengthOfLongestSubstring = function(s) { var max = 0, dd = 0, a = s.split(''), b = []; for (let i = 0; i < a.length; i++) { b.push(a[i]); for (let j = 0; j < b.length; j++) { if (b[j] === a[i + 1] || i === a.length - 1) { dd = b.length; if (dd > max) { max = dd; } b = []; } } } return max; }; console.log(lengthOfLongestSubstring('aab')); بهذا ستتم مقارنة السلسلة بشكل صحيح وسترجع القيمة 2 لسلسلة aab.
  16. هناك عده خطوات يجب اتباعها: 1. تأكد من توافر Python مع إصدار 3.6 فأعلى على جهازك. python --version 2. افتح terminal (cmd) وقم بتنصيب virtualenv بأمر: pip install virtualenv 3. قم بإنشاء بيئة افتراضية لمشروع Django بأمر: virtualenv myprojectenv 4. تفعيل البيئة الافتراضية بأمر: myprojectenv\Scripts\activate 5. تأكد من تنصيب Django بأمر: pip install django 6. قم بإنشاء مشروع Django الأول بأمر: django-admin startproject myproject الدخول لمجلد المشروع بأمر: cd myproject 7. أنشئ تطبيق الويب بأمر: python manage.py startapp webapp 8. تشغيل الخادم التطويري بأمر: python manage.py runserver 9. افتح عنوان localhost:8000 لرؤية صفحة Django. http://127.0.0.1:8000/
  17. يبدو أن المشكلة في الكود هي وجود علامة الدولار ($) قبل متغير task_id في السطر: $_GET['$task_id'] فعلامة الدولار تجعل من task_id اسم متغير بدلاً من قيمته. الكود الصحيح هو: <?php require "config.php"; if(!empty($_GET['task_id'])) { $connection->query("UPDATE tasks SET done=1 WHERE id=".$_GET['task_id']." AND user_id=".$_SESSION['user_id'].""); } header("location: ../index.php"); ?> الآن، يجب أن يعمل الكود بشكل صحيح. يمكنك تعديل الكود والتجربه مره اخري.
  18. Khaled Osama3

    Django

    ارجو السؤال اسفل الدرس لمساعدتك بشكل افضل
  19. يمكنك استخدام أمر prepared statements في MySQLi أو PDO. فهي تفصل البيانات عن الاستعلام مما يمنع حقن الSQL. // افتراضًا أن $mysqli هو الاتصال بقاعدة البيانات $unsafe_variable = $_POST['user_input']; // استخدام استعلام معد مسبقًا $stmt = $mysqli->prepare("INSERT INTO `table` (`column`) VALUES (?)"); // ربط القيمة بشكل آمن $stmt->bind_param("s", $unsafe_variable); // تنفيذ الاستعلام $stmt->execute(); // إغلاق الاستعلام $stmt->close(); او تعديل الإدخالات قبل إدراجها في الاستعلام. مثل إزالة الرموز خاصة وتحويل الأقواس إلى نص. $user_input = strip_tags($unsafe_variable); $user_input = mysqli_real_escape_string($conn, $user_input); $query = "INSERT INTO table (column) VALUES ('$user_input')"; بعد استخدام strip_tags، يتم إزالة أي علامات HTML (إذا كانت موجودة). مثلا المستخدم أدخل النص التالي: $user_input = '<script>alert("Hello, this is a malicious script!");</script><p>This is some text.</p>'; سيتم إزالة جميع العلامات HTML وPHP، وبالتالي، ستكون قيمة $user_input بعد استخدام strip_tags هي: $user_input = 'alert("Hello, this is a malicious script!");This is some text.'; بعد استخدام mysqli_real_escape_string، تصبح الرموز الخاصة معتبرة جزءًا من البيانات وليست جزءًا من الكود SQL، مما يمنع حقن الشيفرة SQL ويحافظ على سلامة الاستعلام وقاعدة البيانات. فمثلا الاستعلام قبل استخدام `mysqli_real_escape_string`: $user_input = "'; DROP TABLE users; --"; $query = "INSERT INTO table (column) VALUES ('$user_input')"; إذا تم تمرير هذا الاستعلام إلى قاعدة البيانات كما هو، فإنه يتضمن توجيه إضافي لحقن الشيفرة SQL، ويحاول حذف جدول المستخدمين (`DROP TABLE users`)، مما يسبب فقدان البيانات. الآن، إذا تم استخدام `mysqli_real_escape_string`: $user_input = "'; DROP TABLE users; --"; $user_input = mysqli_real_escape_string($conn, $user_input); $query = "INSERT INTO table (column) VALUES ('$user_input')"; فإن `mysqli_real_escape_string` سيقوم بتهيئة `$user_input` بحيث تتم معالجة الرموز الخاصة في النص بشكل صحيح. النتيجة ستكون: $user_input = "\'; DROP TABLE users; --"; $query = "INSERT INTO table (column) VALUES ('$user_input')"; ويفضل ان تحقق من نوع البيانات: if(is_int($user_input)) { $user_input = (int) $user_input; } $query = "INSERT... $user_input"; الأفضل دائما استخدام طرق موثوقة للتعامل مع البيانات مثل prepared statements.
  20. السبب في أن البرنامج يعطي دائما نفس النتيجة لأول كود هو أنه ينفذ دائما الكود الأول الموجود في الملف المصدري. لعرض نتائج مختلفة، يجب إضافة الكود الجديد وحفظ الملف ثم التنفيذ, يمكن أن تستخدم اختصارات لحفظ الكود، مثل Ctrl + S في Windows أو Cmd + S في macOS. اما بالنسبه لملف test.exe هو ملف التنفيذي الناتج عن ترجمة المصدر test.c++. أما ملف json فربما يكون ملف إعدادات المشروع. هذا طبيعي في لغة سي++. يمكنك قراءة المزيد عن دورة حياة برنامج سي++ من الترجمة إلى التنفيذ لفهم هذه الأمور بشكل أفضل. لا تقلق كونك مبتدئًا. مع الممارسة ستتعود على هذه الأشياء.
  21. الفرق بين import numpy as np و import Numpy as np: numpy هي الطريقة الصحيحة والمتعارف عليها لاستيراد مكتبة NumPy. Numpy بحرف كبير في البداية ليست طريقة صحيحة لأن اسم المكتبة الفعلي هو numpy. فإذا كتبت Numpy ، فمن الممكن Python لن تتعرف على هذا الاسم وسيعطي خطأ. عند استيرادها على شكل Numpy فهذا سيقوم باستيراد متغير باسم Numpy لكنه لن يحتوي على دوال وميزات numpy. ولهذا السبب عدم دعم بعض الدوال مثل mod, deg2rad والدوال المثلثية. لأنه لم يتم استيراد المكتبة الحقيقية ولكن استرد متغير.
  22. المشكلة هنا ناتجة عن أن بعض المكتبات التي تستخدمها المشروع لا تدعم الإصدار 8 من PHP حاليًا. عندما تتضمن مكتبة ملف composer.json تحديدًا لإصدارات PHP المدعومة، فسوف يرفض composer تثبيتها إذا لم تتوافق الإصدارات. لحل هذه المشكلة يمكنك تجربة الخطوات التالية: البحث عن إصدارات حديثة من تلك المكتبات تدعم PHP 8. تحديث composer.json لتحديد إصدار أقل حتى PHP 7. استخدام flag `--ignore-platform-reqs` مع أمر composer install لتجاهل متطلبات PHP.
  23. حسنا يمكنك تجربه الحل التالي: import DatePicker from "react-datepicker"; import TailwindDatePicker from "react-tailwindcss-datepicker"; عادة ليس مطلوبا تغيير أسماء المتغيرات عند استيراد مكونات من مكتبات مختلفة. لكن في حالة التعارض، يجوز تغيير الاسم دون مشكلة لأن الاسم المستخدم مجرد متغير محلي للإشارة إلى المكون المستوردو المكتبة نفسها لا تعتمد على هذا الاسم، بل على طريقة استدعاء المكون, فمثلا لو استدعينا DatePicker باسم آخر مثل MyDatePicker لن يحدث أي تأثير على المكتبة.
  24. سبب المشكلة هو أنه عند استيراد مكتبتين أو أكثر يحتويان على مكون (Component) بنفس الاسم، فإن ذلك يؤدي إلى تضارب (Conflict) بين المكونات. والسبب في ذلك هو: - في كل مكتبة يتم تصدير/تعريف المكونات تحت أسمائها الأصلية في المستند الرسمي. - لكن عند استيراد المكتبتين مع بعض فإنه يحدث تداخل بين الأسماء. - فالمترجم (Compiler) لن يستطيع التمييز بين المكون الأول والثاني لأنهما يحملان نفس الاسم. - لذلك يحدث خطأ أثناء التجميع. أما عند استخدام أسماء مختلفة عند الاستيراد فإن ذلك يجعل المترجم قادراً على التمييز بين كل مكون على حدة، فلا يحدث تداخل. وبالتالي فإن تغيير الأسماء عند الاستيراد هو الحل لتفادي المشكلة، على الرغم من أن الأسماء الأصلية في المستندات ستظل كما هي.
  25. المشكلة هنا تظهر عند استخدام استيرادين يحتويان على نفس اسم المكتبة (`DatePicker`)، مما يؤدي إلى تداخل في أسماء المكونات عند الاستخدام. لحل هذه المشكلة يمكنك استخدام الاستيراد بطريقة التسمية المختلفة لكل مكتبة يمكنك تجربه الحل التالي: import DatePicker from "react-datepicker"; import { Datepicker } from "react-tailwindcss-datepicker"; بهذه الطريقة ستقوم باستيراد كل مكتبة تحت اسم مختلف، حيث: - DatePicker سيكون اسم المكون من مكتبة react-datepicker - {Datepicker} سيكون اسم المكون من مكتبة react-tailwindcss-datepicker هذا سيمنع حدوث أي تداخل بين الاسمين داخل المشروع. يمكنك بعدها استخدام كل مكون باسمه الجديد دون مشاكل.
×
×
  • أضف...