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

ياسر مسكين

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

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

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

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

    2

كل منشورات العضو ياسر مسكين

  1. المشكلة في الكود السابق هي أنه تم استخدام قيم مختلفة في الـ "attribute " name لعناصر الـ radio button، مما أدى إلى عدم تكونها جزءا من نفس المجموعة، يجب أن يكون لجميع الـ radio buttons نفس القيمة في الـ "attribute "name لتحقيق السلوك المطلوب. وهذا هو الكود المصحح: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Registration Form</title> </head> <body> <h1>Registration Form</h1> <form> <table> <tr> <td> <label for="username">Username</label> </td> <td> <input type="text" id="username"><br> </td> </tr> <tr> <td> <label for="pwd">Password</label> </td> <td> <input type="password" id="pwd" name="pwd"><br> </td> </tr> <tr> <td> <label>Registration Plan</label> </td> <td> <div> <input type="radio" id="starter" name="plan" value="starter"> <label for="starter">Starter</label> </div> <div> <input type="radio" id="business" name="plan" value="business"> <label for="business">Business</label> </div> <div> <input type="radio" id="premium" name="plan" value="premium"> <label for="premium">Premium</label> </div> </td> </tr> <tr> <td> <label for="description">Description</label> </td> <td> <textarea name="description" id="description" cols="30" rows="10"></textarea> </td> </tr> <tr> <td> <label for="agree">Agree</label> </td> <td> <input type="checkbox" id="agree" name="agree"> <label for="agree">I agree to terms and conditions</label> </td> </tr> <tr> <td colspan="2"> <input type="submit" value="Register"> <input type="button" value="Clear"> </td> </tr> </table> </form> </body> </html> وفيه تم تصحيح الكود بحيث تم توحيد قيم الـ "attribute "name لعناصر الـ radio button لتكون "plan" لجميع العناصر، مما جعلها جزءا من نفس المجموعة كما قمت بإضافة عناصر <tr> لكل صف في الجدول لتوضيح هيكل البيانات بشكل أفضل.
  2. بعد تحميلك للمشروع من غيتهاب، يمكنك فتح المجلد في Visual Studio Code، تضغط على Open File ثم اختر المجلد المطلوب، بعد ذلك، تقوم بفتح ال Terminal ثم تقوم بتثبيت ال Packages التي يعمل بها المشروع، من خلال هذا ال Command: npm install يجب أن تتأكد من أنك ضمن المشروع المحدد كما في الصورة. ثم يمكنك تشغيل المشروع من خلال هذا ال Command: npm start في حالة ما واجهتك أي مشكلة بعد هذه الخطوة، اترك لي تعليق هنا وسأساعدك في حله.
  3. من أجل تحميل البيانات من قاعدة البيانات إلى ListBox في التطبيق، يمكن استخدام دورة للحلقة (loop) على البيانات التي تريد عرضها في ListBox وإضافتها واحدة تلو الأخرى. هناك عدة طرق لفعل ذلك، لو نتحدث عن الطريقة التي تستخدم الحلقة foreach فسيكون الكود كالتالي: lbx_work_history.Items.Clear(); // يجب مسح العناصر الحالية أولاً لتحديثها foreach(var item in p.SPECIALIST_WORKED_BEFORE) { lbx_work_history.Items.Add(item); // إضافة كل بند من البيانات إلى ListBox } وهنا يفترض أن `p.SPECIALIST_WORKED_BEFORE` هو مصفوفة أو قائمة تحتوي على البيانات التي تريد عرضها في ListBox، لكن هنا يجب أن نقوم بتعديل هذا الجزء من الكود بناء على كيفية تنظيم البيانات في قاعدة البيانات الخاصة بك وبعد تطبيق هذا التغيير، من المفترض أنه سنتمكن من عرض البيانات في ListBox بعد تحديد سجل معين في DataGridView.
  4. الكود الذي قدمته ناقص قليلا، وذلك لأنه يبدو أنك نسيت توجيه الليست بوكس إلى القيم التي تريد إضافتها إلى حقل `SPECIALIST_WORKED_BEFORE`. لهذا يمكنك استخدام حلقة `foreach` لتكرار عناصر الليست بوكس وإضافتها إلى الحقل المناسب. بهذه الطريقة: formes.DB.TBL_SPECIALIST p = new formes.DB.TBL_SPECIALIST(); p.SPECIALIST_DATE = DateTime.Now; p.SPECIALIST_NAME = edt_name.Text; p.SPECIALIST_BIRTHDATE = edt_brith_date.Value; p.SPECIALIST_AGE_NOW = edt_age.Text; p.SPECIALIST_EDUCATION = edt_education.Text; p.SPECIALIST_ID_NUMBER = edt_id_num.Text; p.SPECIALIST_PHONE = edt_phone.Text; p.SPECIALIST_ADDRESS = edt_address.Text; p.SPECIALIST_ACTIVE = edt_active.Text; فهنا قد استخدمت حلقة foreach لإضافة عناصر الليست بوكس إلى الحقل المناسب: foreach (var item in lbx_work_history.Items) { p.SPECIALIST_WORKED_BEFORE += item.ToString() + ", "; } // الآن يمكن إضافة الكائن p إلى الداتا تابل ويجب التأكد من تغيير "SPECIALIST_WORKED_BEFORE" بناءً على نوع البيانات في الداتا تابل. لكن تبقى هذه الطريقة تقليدية، فبالطبع، يمكن تحسين الكود ببعض الطرق، منها استخدام StringBuilder بدلاً من الانضمام المتكرر للنصوص، وكذلك تجنب استخدام foreach إذا كنت تستخدم LINQ وبناء النص بطريقة أكثر إتقانًا. بهذا الشكل: formes.DB.TBL_SPECIALIST p = new formes.DB.TBL_SPECIALIST() { SPECIALIST_DATE = DateTime.Now, SPECIALIST_NAME = edt_name.Text, SPECIALIST_BIRTHDATE = edt_brith_date.Value, SPECIALIST_AGE_NOW = edt_age.Text, SPECIALIST_EDUCATION = edt_education.Text, SPECIALIST_ID_NUMBER = edt_id_num.Text, SPECIALIST_PHONE = edt_phone.Text, SPECIALIST_ADDRESS = edt_address.Text, SPECIALIST_ACTIVE = edt_active.Text, SPECIALIST_WORKED_BEFORE = string.Join(", ", lbx_work_history.Items.Cast<object>()) }; هنا هذا الكود يستخدم مباشرة LINQ لتجنب استخدام حلقة foreach، ويستخدم StringBuilder ضمن ()string.Join تحت الغطاء للأداء الأفضل في حالة وجود عدد كبير من العناصر.
  5. بالطبع يمكن تحقيق ذلك في لغة JavaScript كما فعلت أنت: let arry = ['****', '***', '**', '*']; for (let value of arry) { console.log(value); } فهذا الكود ينشئ مصفوفة `arry` تحتوي على سلسلات نجوم، ثم يستخدم حلقة `for...of` للتكرار عبر العناصر في المصفوفة ويقوم بطباعة كل قيمة في المصفوفة.
  6. حسنا، توجد عدة مكتبات للترجمة في Vue.js، وتختلف في الميزات والاستخدام لهذا فالاختيار يعتمد على احتياجات مشروعك ومستوى التكامل المطلوب، بعض المكتبات الشهيرة: Vue I18n: وهي المكتبة الرسمية للترجمة في Vue.js. VeeValidate: بالإضافة إلى التحقق من البيانات، توفر VeeValidate أيضا دعما للترجمة لرسائل التحقق. Vue-Translate: تقدم وظائف بسيطة للترجمة. Vue-Multilanguage: توفر طريقة بسيطة لإضافة دعم للغات متعددة داخل التطبيق. ولتضمين أيٍ من هذه المكتبات في مشاريعنا، يمكن اتباع هذه الخطوات: تثبيت المكتبة: من خلال استخدام npm أو yarn لتثبيت المكتبة التي نرغب في استخدامها. على سبيل المثال:، `npm install vue-i18n` من أجل تثبيت Vue I18n. ولاستيرادها في المشروع: نتوجه إلى ملف الدخول الرئيسي للتطبيق (مثل main.js)، ثم نقوم بتضمين المكتبة عن طريق استيرادها. استخدامها في مكونات Vue: نقوم بتكوين واستخدام مكتبة الترجمة وفقا للتوثيقات والأمثلة المقدمة من قِبل المكتبة. هذا مثال على كيفية استيرادها في المشروع: import Vue from 'vue'; import VueI18n from 'vue-i18n'; Vue.use(VueI18n); وهذا مثال آخر على كيفية استخدامها في مكونات Vue: على سبيل المثال نقوم بإنشاء ملف للرسائل المترجمة مثل `messages.js` ونملؤه بالرسائل لكل لغة: // messages.js export default { en: { greeting: 'Hello!', welcome: 'Welcome to my Vue.js app.' }, ar: { greeting: 'مرحبًا!', welcome: 'مرحباً بك في تطبيقي Vue.js.' } }; بعدها نباشر في تكوين الترجمة، في ملف `main.js`، نقوم بتكوين VueI18n وتحميل الرسائل المترجمة: import Vue from 'vue'; import VueI18n from 'vue-i18n'; import messages from './messages'; Vue.use(VueI18n); const i18n = new VueI18n({ locale: 'en', // اللغة الافتراضية fallbackLocale: 'en', // اللغة الاحتياطية messages, // الرسائل المترجمة }); new Vue({ i18n, render: h => h(App) }).$mount('#app'); كما يمكن استخدام الترجمة في مكونات Vue الخاصة بنا عن طريق فلاتر معينة (filters) أو دوال خاصة بالترجمة. وهنا مثال على استخدامها في قالب: <template> <div> <p>{{ $t('greeting') }}</p> <p>{{ $t('welcome') }}</p> </div> </template>
  7. المشكلة في الكود الخاص بك أنه عند الضغط على زر فتح المقالات عشوائيا، يتم فتح المقالة بشكل عشوائي من الموقع، لضبط الأمر، يجب تعديل الكود الحالي بحيث يقوم بإضافة الكلمة المطلوبة في نهاية رابط المقالة المفتوحة. هذا يمكن تحقيقه من خلال تعديل الدالة التي تفتح المقالة عشوائيا، بحيث تقوم بإضافة الكلمة المحددة في نهاية الرابط قبل توجيه المتصفح إليه. هناك طريقتين للقيام بذلك: استخدام الدالة `replace`: من خلال استبدال الرابط الحالي برابط جديد يحتوي على الكلمة المطلوبة في نهاية الرابط. استخدام العمليات النصية: بحيث يتم إضافة الكلمة المطلوبة بشكل مباشر إلى نهاية الرابط. بعد تحديد الطريقة المرغوبة، يمكن تطبيق التغييرات على الكود بحيث يقوم بإضافة الكلمة المطلوبة في نهاية الرابط بعد فتح المقالة عشوائيا. مثلا لو استخدمنا الطريقة الأولى، يمكن استخدام الدالة replace لتحويل الرابط الموجود بحيث تضيف الكلمة المطلوبة في نهاية الرابط. في هذه الحالة، سنقوم بإضافة الكلمة "abdo?" في نهاية الرابط بهذا الشكل: function showLucky(e) { var t = e.feed; var n = t.entry || []; var r = t.entry[0]; for (var i = 0; i < r.link.length; ++i) { if (r.link[i].rel == "alternate") { var href = r.link[i].href; href = href.replace(/\?$/, "?abdo?"); window.location = href; } } }
  8. نعم، يمكنك طباعة الفورم ككل بما في ذلك التكس بوكس والجروب بوكس وجميع المحتويات باستخدام الأدوات المتاحة في C#، فمثلا يمكنك استخدام PrintDocument Class أو أدوات التقارير المتاحة في Visual Studio أو حتى استخدام ()Console.WriteLine لطباعة البيانات على الشاشة أو في ملف نصي. كما يمكن استخدام مكتبات الطباعة الخارجية مثل iTextSharp أو DevExpress لإنشاء ملفات PDF أو XPS تحتوي على محتوى الفورم. وكمثال فقط للشرح سأستخدم PrintDocument Class لشرح كيفية طباعة الفورم ككل. هذا المثال سيشمل إنشاء فورم ببعض العناصر مثل التكس بوكس والجروب بوكس، وسنقوم بطباعة محتويات الفورم على ورقة. سيكون بهذا الشكل: using System; using System.Drawing; using System.Drawing.Printing; using System.Windows.Forms; public class PrintFormExample : Form { private TextBox textBox; private GroupBox groupBox; private Button printButton; private PrintDocument printDocument; public PrintFormExample() { textBox = new TextBox(); textBox.Text = "This is a TextBox"; groupBox = new GroupBox(); groupBox.Text = "This is a GroupBox"; groupBox.Controls.Add(new Label { Text = "Label inside GroupBox", Location = new Point(10, 20) }); printButton = new Button(); printButton.Text = "Print Form"; printButton.Click += new EventHandler(PrintButton_Click); printDocument = new PrintDocument(); printDocument.PrintPage += new PrintPageEventHandler(PrintDocument_PrintPage); Controls.Add(textBox); Controls.Add(groupBox); Controls.Add(printButton); } private void PrintButton_Click(object sender, EventArgs e) { PrintDialog printDialog = new PrintDialog(); printDialog.Document = printDocument; if (printDialog.ShowDialog() == DialogResult.OK) { printDocument.Print(); } } private void PrintDocument_PrintPage(object sender, PrintPageEventArgs e) { Bitmap bitmap = new Bitmap(ClientSize.Width, ClientSize.Height); DrawToBitmap(bitmap, new Rectangle(0, 0, ClientSize.Width, ClientSize.Height)); e.Graphics.DrawImage(bitmap, 0, 0); } [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new PrintFormExample()); } } هنا قد قمت بإنشاء فورم بسيط يحتوي على TextBox و GroupBox وزر Print Button. عند النقر على زر "Print Form"، يتم فتح مربع حوار الطباعة لاختيار الطابعة، ثم يتم طباعة محتويات الفورم على الورقة. داخل PrintDocument_PrintPage event handler، نقوم برسم محتويات الفورم على Graphics كما لو كانت على الشاشة ويتم هذا الأمر باستخدام DrawToBitmap لتحويل محتويات الفورم إلى Bitmap ثم رسمها على ورقة الطباعة المحددة.
  9. دالة التابع أو splice في جافاسكريبت تستخدم لتعديل محتوى المصفوفة عن طريق إضافة، إزالة أو استبدال العناصر في مواقع محددة هذا هو شكلها: array.splice(start, deleteCount, item1, item2, ...); حيث أن: - `start`: يمثل المؤشر الذي يحدد موضع بداية التعديل. - `deleteCount`: يشير إلى عدد العناصر التي يجب حذفها ابتداء من الموضع المحدد فمثلا إذا تركنا القيمة فارغة، فلن يتم حذف أي عنصر. - `item1`, `item2`, ...: تمثل العناصر التي يجب إضافتها في الموضع المحدد. وكملحوظة فقط فإن دالة splice تعمل على المصفوفة الأصلية وتقوم بتعديلها مباشرة، بمعنى أنها لا تنشئ مصفوفة جديدة. تحتوي هذه الدالة على قدر كبير من المرونة حيث يمكن استخدامها لإضافة عناصر جديدة إلى المصفوفة، حذف عناصر محددة، استبدال عناصر موجودة، أو حتى حذف كل العناصر من المصفوفة. هذا هو شرح بسيط لكيفية عمل التابع: مثلا يمكن استخدامه لاستخراج جزء من المصفوفة من دون تعديل المصفوفة الأصلية. على سبيل المثال: let array = [1, 2, 3, 4, 5]; let extracted = array.splice(2, 2); console.log(extracted); // Output: [3, 4] console.log(array); // Output: [1, 2, 5] ففي هذا المثال، تم استخراج العناصر 3 و 4 من المصفوفة الأصلية. وتستخدم أيضا لإعادة ترتيب العناصر بهذا الشكل: let array = [3, 1, 4, 2, 5]; array.splice(0, array.length, ...array.sort()); console.log(array); // Output: [1, 2, 3, 4, 5] هنا تم فرز العناصر في المصفوفة وتم إعادة تعيينها باستخدام splice مما أدى إلى إعادة ترتيبها. يمكن أيضا تحويل المصفوفة إلى سلسلة نصية عن طريق حذف العناصر وإضافة عناصر جديدة. على سبيل المثال: let array = [1, 2, 3]; array.splice(0, array.length, array.join(', ')); console.log(array); // Output: ["1, 2, 3"] ففي هذا المثال مثلا، تم دمج جميع العناصر في المصفوفة إلى سلسلة نصية وتم إعادة تعيين المصفوفة باستخدام هذه السلسلة.
  10. حقيقة الفارق بين No-Code أو Low-Code يكمن في درجة التخصيص والتعديل التي تتيحها كل منصة للمستخدم فمثلا: No-Code Platforms: تسمح للمستخدمين بإنشاء تطبيقات الويب أو التطبيقات دون الحاجة إلى كتابة أي كود بأنفسهم لهذا تبدو عملية التصميم وكأنها بسيطة وسلسة، وغالبا ما تتضمن أدوات السحب والإفلات والضغط والإفلات فقط. أي أنها لا تتطلب خبرة برمجية مسبقة ويمكن استخدامها لإنشاء تطبيقات بسيطة وسريعة. في حين أن ال Low-Code Platforms: تمنح المستخدمين درجة أعلى من التخصيص والتحكم بالتطبيقات، حيث يمكنهم كتابة بعض الكود لتخصيص وتعديل المنصة بشكل أكبر وعادة ما تكون هذه المنصات تقدم مكونات جاهزة وواجهات برمجية تسهل عملية توصيل الأنظمة وإدارة البيانات. أما بالنسبة لاستخدامها في تطبيقات React.js وElectron.js، فهذا يعتمد على مدى توافق المنصة مع هذه التقنيات وقابلية تكاملها معها. لكن في العموم، يمكن استخدام منصات No-Code و Low-Code لإنشاء واجهات المستخدم لتطبيقات React.js وElectron.js، ولكن قد تحتاج إلى بعض التعديلات لجعلها تتوافق بشكل كامل مع متطلبات تلك التقنيات. يمكنك الاستفادة من هذه المقالة أيضا في نفس المجال: والاستفادة أيضا من هذه المساهمة على حسوب i/o والتعليقات التي تناقش الموضوع من هنا: https://io.hsoub.com/webdev/83740-ماذا-عن-استخدام-منصة-webflow-لتصميم-المواقع-دون-كتابة-ولا-كود
  11. برنامج هماتشي (Hamachi) هو برنامج افتراضي خاص يسمح للمستخدمين بإنشاء شبكات افتراضية خاصة (VPN) عبر الإنترنت. يُستخدم عادة لربط أجهزة الكمبيوتر المختلفة ببعضها البعض بشكل آمن عبر الإنترنت، مما يتيح للمستخدمين الوصول إلى الملفات والموارد المشتركة والأجهزة عبر الشبكة الافتراضية. بالنسبة لكيفية الوصول إلى الأجهزة الأخرى باستخدامه فهذا ممكن، على سبيل المثال، إذا كنا نرغب في مشاركة ملفاتنا مع صديق عن بُعد، يمكن إنشاء شبكة هماتشي ودعوته للانضمام وبمجرد انضمامه، يمكن فتح مستعرض الملفات على جهازنا والوصول إلى ملفاته كما لو كانت على جهازنا. بالنسبة للخطوات الأساسية لاستخدام هماتشي هي: - تثبيت برنامج هماتشي على أجهزتنا. - إنشاء شبكة هماتشي ودعوة الأشخاص الذين نرغب في الاتصال بهم. - بمجرد انضمامهم، يمكننا بسهولة مشاركة الملفات أو الوصول إلى ملفاتهم عبر الشبكة الافتراضية التي أشأناها. يمكنك الاستفادة أكثر من المقالات والأسئلة المطروحة هنا.
  12. في هذه الحالة، يجب استخدام إدخالات مؤشر الفأرة لتغيير اتجاه اللاعب والكاميرا. using UnityEngine; using UnityEngine.InputSystem; public class PlayerMovement : MonoBehaviour { public float speed = 5f; private Vector2 movementInput; private Vector2 mouseInput; private Transform mainCameraTransform; void Start() { // الحصول على مكون التحويل للكاميرا الرئيسية mainCameraTransform = Camera.main.transform; } // استدعاء الإدخال لتحريك اللاعب private void OnMove(InputValue value) { movementInput = value.Get<Vector2>(); } // استدعاء الإدخال لتحديث اتجاه الفأرة private void OnLook(InputValue value) { mouseInput = value.Get<Vector2>(); } void FixedUpdate() { // حساب الحركة الجديدة بناءً على الإدخالات Vector3 movement = new Vector3(movementInput.x, 0f, movementInput.y) * speed * Time.fixedDeltaTime; // تحريك اللاعب transform.Translate(movement); // تحديث اتجاه الكاميرا بناءً على حركة المؤشر Vector3 rotatePlayer = new Vector3(0f, mouseInput.x, 0f) * Time.fixedDeltaTime * 100f; transform.Rotate(rotatePlayer); // تحديث اتجاه الكاميرا بناءً على حركة المؤشر الرأسي Vector3 rotateCamera = new Vector3(-mouseInput.y, 0f, 0f) * Time.fixedDeltaTime * 100f; mainCameraTransform.Rotate(rotateCamera); } } هنا تمت إضافة دالة جديدة `OnLook` للتعامل مع إدخالات حركة المؤشر بحيث تقوم هذه الدالة بتحديث قيمة `mouseInput` التي تستخدم لتحديث اتجاه اللاعب والكاميرا، هذا الكود يستخدم `Camera.main` للوصول إلى مكون التحويل الخاص بالكاميرا.
  13. نظام الإدخال الجديد Input System في Unity هو عبارة عن أداة تستخدم للتحكم في حركة اللاعب في اللعبة، ويتيح هذا النظام لنا قراءة الإدخالات مثل الضغط على الأزرار أو حركة الفأرة بطريقة بسيطة وفعالة. لتهيئة نظام الإدخال الجديد بشكل صحيح، نقوم ب: بتحميل وتثبيت حزمة الإدخال الجديدة من متجر الأصول في Unity، ثم تثبيت نظام الإدخال الجديد. بعدها نقوم بإنشاء ملف إعدادات الإدخال وهو عبارة عن ملف ScriptableObjec خاص بإعدادات الإدخال بعدها يمكن إضافة إجراءات الإدخال مثل التحرك والقفز وأي إجراءات أخرى نرغب في إدخالها. بعدها يجب ربط الإدخال بحركة اللاعب، هذا ممكن من خلال القيام بإنشاء سكريبت لتحريك اللاعب باستخدام إدخالات نظام الإدخال الجديد. عبر استخدام API مثل `PlayerInput` ثم يمكن بعدها تحريك اللاعب وفقا للإدخالات. نقوم بربط الكاميرا واللاعب، باستخدام Cinemachine لتحديد زاوية وموقع الكاميرا بشكل مناسب وفقا لحركة اللاعب، ثم نختار اللعبة ونتأكد من أن حركة اللاعب تستجيب لإدخالات اللاعب وأن الكاميرا تتحرك بشكل مناسب. كمثال بسيط فقط ب C# يمكن ذلك من خلال: using UnityEngine; using UnityEngine.InputSystem; public class PlayerMovement : MonoBehaviour { // تعيين المتغيرات public float speed = 5f; private Vector2 movementInput; // استدعاء الإدخال private void OnMove(InputValue value) { movementInput = value.Get<Vector2>(); } private void FixedUpdate() { // حساب الحركة الجديدة بناءً على الإدخال Vector3 movement = new Vector3(movementInput.x, 0f, movementInput.y) * speed * Time.fixedDeltaTime; // تحريك اللاعب transform.Translate(movement); } } ففي هذا المثال، يتم تحريك اللاعب في الفضاء بناء على إدخالات اللاعب باستخدام الدالة OnMove التي تستدعى عندما يتم تغيير الإدخال (مثل تحريك السهم الأيسر). ويتم أيضا استخدام المتغير movementInput لتخزين الإدخالات، ثم يتم تحويلها إلى حركة فعلية وتطبيقها على مكان اللاعب في دالة FixedUpdate.
  14. تعلم الآلة هو مجال في علم الحاسوب يهتم بتطوير الأنظمة والبرامج التي تمكّن الحواسيب من تعلم الأنماط والاستدلال من البيانات بدون الحاجة إلى برمجة صريحة بحيث تعتمد تقنيات تعلم الآلة على استخدام البيانات لتدريب النماذج والخوارزميات لأداء مهام محددة أو تحقيق أهداف معينة، توجد العديد من المسائل الشائعة في تعلم الآلة: كالتصنيف، ويتعلق الأمر بتصنيف البيانات إلى فئات مختلفة، مثل التعرف على الأشياء في الصور أو التصنيف الآلي للبريد الإلكتروني إلى الرسائل المزعجة وغيرها. والتنبؤ، من خلال توقع القيم المستقبلية بناءً على البيانات السابقة، مثل توقع الطقس أو تحليل البيانات المالية لتوقع الاتجاهات في الأسواق المالية. توجد أيضا مسألة التجميع بحيث يتم تقسيم البيانات إلى مجموعات تشترك في سمات معينة، مثل تجميع العملاء حسب سلوكياتهم لتحسين استراتيجيات التسويق. مسألة التحسين، بحيث يتم تحسين وظائف معينة باستخدام البيانات، مثل تحسين أداء الأنظمة الذكية أو تحسين استراتيجيات الإنتاج في الصناعة. التكيف والتعلم المستمر، من خلال تطوير نماذج قادرة على التكيف مع التغييرات في البيانات واستمرارية التعلم من خلال التفاعل مع البيئة. ويمكنك الاطلاع على المزيد من المعلومات حول تعلم الآلة من خلال هذا الرابط:
  15. كتاب "أنظمة التشغيل للمبرمجين" الموجود في قسم الكتب في أكاديمية حسوب. أعتبره بمثابة كنز يضم مجموعة من المفاهيم الأساسية في علم أنظمة التشغيل، وهو موجه للمبرمجين الذين يرغبون في فهم كيفية عمل أنظمة التشغيل وكيفية التفاعل معها بصورة أفضل، يتمثل الهدف الأساسي للكتاب في توفير فهم عميق للطلاب حول مفاهيم مثل عمليات البرمجة، وإدارة الذاكرة، وأنظمة الملفات، وغيرها من الأساسيات التي تتعلق بأنظمة التشغيل. يبدأ الكتاب بشرح مفاهيم أساسية مثل التصريف (Compilation) والفرق بين اللغات المُصرفة والمُفسَّرة، مع التركيز على كيفية عمل المترجمات (Compilers) وأثرها على البرمجيات. ثم ينتقل الكتاب إلى شرح مفهوم العمليات (Processes) في أنظمة التشغيل، بما في ذلك كيفية إدارة وتنظيم العمليات وتخصيص الموارد لها، ويتناول العديد من النقاط والمفاهيم التي يمكن أن تتعرف عليها من خلال الرابط. للاستفادة من هذا الكتاب أنصح دوما بقراءة قراءة متأنية وتركيز جيد مع تطبيق الفصول العملية لأنه بمجرد قراءة فصل معين، يجب محاولة تطبيق ما تعلمته عمليا يمكن مثلا القيام بكتابة برامج صغيرة تستفيد من المفاهيم التي تعلمتها، مثلا، برنامج لإدارة عمليات متعددة أو للتعامل مع الذاكرة الوهمية. قد تستفيد من المناقشة والتبادل خاصة في قسم الأسئلة العامة، ويمكنك القيام ببحث إضافي لترسيخ المعلومات وتوطيدها في ذاكرتك. يمكنك المشاركة في المجتمعات البرمجية والانضمام إلى منتديات أو مجموعات على الإنترنت حيث يتم مناقشة مواضيع تتعلق بأنظمة التشغيل، والمشاركة في النقاش الاستفادة من تجارب الآخرين، لهذا فأفضل طريقة هي التطبيق والمشاركة.
  16. المشكلة في هذا الكود حسب تصفحي إياه هو أنه لا يقوم بجلب اسم الموقع المحدد على الخريطة وبدلا من ذلك يقوم فقط بجلب خطوط الطول والعرض أي الإحداثيات فقط. لهذا يجب استخدام خدمات Google Places API بدلا من مكتبة Google Maps JavaScript API. للقيام بذلك يمكنك أولا، استخدام Google Places API: من خلال تحميله والحصول على مفتاح API الخاص بك، ثم تحديد الموقع بواسطة الإحداثيات، فعند النقر على الخريطة، نقوم بتحديد الموقع باستخدام الإحداثيات واستخدامها لجلب معلومات الموقع. ثم من خلال استخدام طلب تفاصيل المكان من خلال الإحداثيات المحددة، نرسل طلبا للحصول على تفاصيل المكان باستخدام خدمات Google Places API. ولعرض اسم الموقع بمجرد الحصول على رد ناجح، نستخرج اسم الموقع من الرد ويتم عرضه في العنصر المناسب في واجهة المستخدم. وهذا تحديث للكود الخاص بك من خلال توضيح كيفية تحقيق الهدف وجلب اسم الموقع المحدد على الخريطة: let map; let placesService; function initMap() { map = new google.maps.Map(document.getElementById("map"), { center: { lat: -34.397, lng: 150.644 }, zoom: 8, scrollwheel: true, }); placesService = new google.maps.places.PlacesService(map); const marker = new google.maps.Marker({ position: { lat: -34.397, lng: 150.644 }, map: map, draggable: true }); google.maps.event.addListener(marker, 'position_changed', function () { let lat = marker.position.lat(); let lng = marker.position.lng(); $('#latitude').val(lat); $('#longitude').val(lng); document.getElementById('latitude').dispatchEvent(new Event('input')); document.getElementById('longitude').dispatchEvent(new Event('input')); // Get place details and update location input getPlaceName(marker.getPosition()); }); google.maps.event.addListener(map, 'click', function (event) { marker.setPosition(event.latLng); }); } function getPlaceName(location) { const request = { location: location, radius: '50', // Define the radius to search for places around the marker }; placesService.nearbySearch(request, function (results, status) { if (status === google.maps.places.PlacesServiceStatus.OK && results.length > 0) { const placeName = results[0].name; $('#location').val(placeName); document.getElementById('location').dispatchEvent(new Event('input')); } }); } فهذا الكود يقوم بتحديد الموقع على الخريطة وجلب اسم الموقع باستخدام Google Places API وعرضه في حقل الإدخال المخصص للعنوان.
  17. لقد حملت المشروع وهو يعمل معي بشكل عادي، كما هو موضح في الصورة المرفقة. المشكلة تكمن في كونك لم تضبط إعدادات دجانغو ولم تهيّئ المشروع كما ينبغي يمكنك اتباع هذه الخطوات لتثبيت المشروع بشكل جيد: أولا، عليك بالتحقق من إعدادات Python Interpreter بما أنك تستخدم Pycharm يمكنك الذهاب إلى File > Settings ثم في نافذة الإعدادات، انتقل إلى Project: تجد اسم مشروعك myfirstproject ثم تجد Python Interpreter ثم اختر ال Interpreter المناسب عادة يكون نسخة البايثون التي قمت بتثبيتها على جهازك. بعد ذلك تنتقل إلى Languages and Framework ثم اختر دجانغو، وقم بإضافة المطلوب كما في الصورة الثانية المرفقة. ثم تأكد من أنك ثمت بإعدادات المشروع كي يتم تشغيله مباشرة عند النقر على Run من خلال تثبيتك لموديل دجانغو كما في الصورة الثالثة.
  18. هل يمكنك التوضيح لي أكثر بخصوص المشكلة التي واجهتك، كي يتسنى لي فهم المشكلة وتقديم الحل المناسب لها.
  19. هنا يقوم بعملية الطرح n - 1، وفي هذه الحالة يكون n هو 6، لذلك ستكون العملية كالتالي: s = 6 - 1 وبالتالي، قيمة s تكون 5 وليس -1 كما ذكرت. لأنه عندما نقول s = n - 1، فإننا نخصم القيمة 1 من القيمة المخزنة في المتغير n، ولتصحيح الخطأ والحصول على النتيجة الصحيحة (التي يجب أن تكون 5 بدلا من -1)، يمكن استخدام القيمة المحسوبة بشكل ثابت بهذا الشكل: n = 6 s = n - 1 # هنا نقوم بطرح 1 من 6 print(s)
  20. أرى أن المشكلة تكمن في استخدام list-style-image لتعيين صورة كخلفية لعناصر القائمة ul (الغير مرتبة)، فقد يحدث أن الصورة تأخذ مساحة كبيرة جدا وتصبح غير مناسبة للتصميم المطلوب. لحل المشكلة، ولتغيير حجم الصورة وتنسيقها بشكل أفضل، يجب استخدام الخصائص الصحيحة في CSS. بدءا بإزالة التباعد الافتراضي للقائمة: ul { padding: 0; } ثم تعيين صورة القائمة وتحديد حجمها: ul { list-style-image: url(images/book.jpg); /* تعيين صورة القائمة */ background-size: 30px 30px; /* تحديد حجم الصورة */ background-repeat: no-repeat; /* تأكيد عدم تكرار الصورة */ } وتحديد التباعد بين الصورة والنص: ul li { padding-left: 40px; /* تعيين التباعد الأيسر لكل عنصر */ } ويمكنني تفسير الخطوات التي قمنا بها، فإزالة التباعد الافتراضي للقائمة ul نقوم به لتجنب أي تأثير غير مرغوب فيه على التصميم ونقوم بتعيين صورة القائمة وتحديد حجمها باستخدام background-size، مما يسمح لنا بتحكم دقيق في الحجم ومنع الصورة من التكبير أو التصغير بشكل غير مرغوب فيه. ونقوم بتحديد التباعد بين الصورة والنص لكل عنصر في القائمة، وذلك باستخدام padding-left لتجنب اختلاط النص بالصورة، أعتقد أن الإجابة مشروحة بشكل مفصل.
  21. أفهم أنك تريد أن يتم عرض الخريطة من خلال إرسال قيم خط الطول والعرض عند النقر على زر فتح ال modal، لتحقيق ذلك، يمكنك تعديل ملف show_maps.js لتمرير قيم خط الطول والعرض عند النقر على زر "فتح ال modal" واستخدامها لعرض الخريطة داخل ال modal. بهذا الشكل: document.querySelectorAll(".show-map-modal").forEach((item) => { item.addEventListener("click", (e) => { var lat = parseFloat(item.dataset.latitude); // الحصول على قيمة خط العرض var long = parseFloat(item.dataset.longitude); // الحصول على قيمة خط الطول function showMap(lat, long){ var coord = { lat: lat, lng: long }; map = new google.maps.Map(document.getElementById("map"), { center: coord, zoom: 8, scrollwheel: true, }); } showMap(lat, long); // عرض الخريطة بالقيم المحددة $("#map_modal").modal("show"); }); }); ثم، في جدول العرض، يجب عليك تحديد قيم خط الطول والعرض لكل صف وتمريرها كقيم لزر "فتح ال modal". بهذه الطريقة المبينة: <td> <button type="button" class="show-map-modal dropdown-item" data-latitude="{{ $tent->latitude }}" data-longitude="{{ $tent->longitude }}"> <i class="fa fa-image text-secondary" style="font-size: 20px"></i> </button> </td> ويجب التأكد من أن $tent->latitude و $tent->longitude تحتوي على قيم خط الطول والعرض الصحيحة لكل صف ومع هذه التغييرات، سيتم تمرير القيم المحددة لخط الطول والعرض إلى وظيفة JavaScript، وستظهر الخريطة المتعلقة بتلك القيم داخل ال modal مباشرة.
  22. يبدو أن هنالك بضعة أخطاء في الكود الذي أرفقته، فيجب استخدام طريقة ()execute لتنفيذ استعلام SQL لإدخال القيم إلى الجدول، وعند استخدامها للإدخال يجب توفير قائمة من القيم التي تريد إدخالها، واستخدامها يكون مع إستعلام SQL لإنشاء الجدول. لقد قمت بتصحيحه وهذا هو الكود الصحيح: #استدعاء المكتبات from PyQt5 import QtCore, QtGui, QtWidgets import sys import sqlite3 #انشاء البرنامج app = QtWidgets.QApplication(sys.argv) #انشاء النافذة w = QtWidgets.QWidget() #حقول الادخال e1 = QtWidgets.QLineEdit(w) e1.move(200, 150) e1.resize(400, 40) e1.setStyleSheet("background-color: white ;font-size: 20px") #الازرار b1 = QtWidgets.QPushButton("اضافة", w) b1.move(40, 40) b1.resize(400, 50) b1.setStyleSheet("background-color: yellow ;font-size: 24px") # انشاء قاعدة بيانات والجدول db = sqlite3.connect("name.db") c = db.cursor() c.execute("CREATE TABLE IF NOT EXISTS names(name TEXT)") #الحصول على القيمة من حقول الادخال واضافتها الى الجدول def add(): a1 = e1.text() e1.clear() c.execute("INSERT INTO names(name) VALUES(?)", (a1,)) db.commit() b1.clicked.connect(add) db.close() w.show() app.exec_() بحيث قمت بتعديل الجزء الذي يضيف القيمة إلى الجدول بحيث يكون في الشكل الصحيح، كما قمت للتأكد من أن الجدول موجود بإضافة جملة: 'CREATE TABLE IF NOT EXISTS' أو يتم إنشاؤه إذا لم يكن موجودا بالفعل.
  23. MySQL وSQLite3 يعتبران اثنين من أبرز أنظمة قواعد البيانات في عالم تطوير البرمجيات، وعلى الرغم من أن كلاهما يقدم وظائف مشابهة، إلا أنهما يختلفان في الاستخدامات والمميزات التي يقدمانها. فمثلا نجد أن MySQL تعتبر قاعدة بيانات متقدمة متعددة المستخدمين، مصممة للتطبيقات التي تحتاج إلى معالجة كميات كبيرة من البيانات والتعامل مع العمليات المتعددة بفعالية. ول MySQL إمكانية توزيع البيانات عبر عدة خوادم، مما يجعلها مثالية للتطبيقات ذات الحمولة العالية والتطبيقات التي تتطلب مرونة في التوسع. بالمقابل، SQLite3 تعتبر قاعدة بيانات خفيفة الوزن ومدمجة داخل التطبيق، مما يجعلها سهلة الاستخدام ومناسبة للتطبيقات الصغيرة والمحمولة. بفضل بساطتها وقابليتها للتضمين، تستخدم SQLite3 في تطوير التطبيقات البسيطة التي لا تتطلب مستويات عالية من التعقيد. من حيث الأداء، تتفوق MySQL في معالجة الحمولات الكبيرة والعمليات المتعددة، بينما تُعتبر SQLite3 أكثر فعالية في تخزين البيانات والتعامل مع الحمولات الصغيرة. في النهاية، الاختيار بين MySQL وSQLite3 يعتمد على احتياجات مشروعك ومتطلباته. فمثلا إذا كنت بحاجة إلى قاعدة بيانات متقدمة مع قدرات توزيع البيانات وتكامل متقدم، فإن MySQL هي الخيار الأمثل. أما إذا كنت تبحث عن حل بسيط ومدمج داخل التطبيق، فإن SQLite3 يمكن أن يكون الخيار المثالي والأنسب.
  24. يمكن شرح مبدأ عمل Virtual DOM على أنها تلعب دور حاجز بين تطبيق React والـ DOM الفعلي، مما يتيح للتطبيق التفاعل مع نسخة افتراضية من الواجهة بدلاً من التفاعل المباشر مع الـ DOM. وهذا ما يسهم في تحسين أداء التطبيق عند تحديث الواجهة. فعند تحديث الـ Virtual DOM، يتم إجراء عمليات مقارنة فعالة لتحديد الفروق بين النسخة الجديدة والنسخة السابقة. يعتمد هذا التحليل على خوارزميات فعالة مثل "خوارزمية الفرق الذكية"، مثلما يساعد في تقليل الوقت والموارد المستهلكة. يعمل تحديث الـ Virtual DOM بشكل ذكي، حيث يتم تحديث فقط العناصر التي تحتاج إلى تغيير دون الحاجة إلى إعادة رسم الواجهة بأكملها. هذا يحسن كفاءة التحديثات ويقلل من الأثر السلبي على أداء التطبيق. بفضل هذه التقنية، يصبح إعادة تقديم الواجهة أكثر فعالية، ويتيح الـ Virtual DOM لمطوري React الاستفادة من تحسينات الأداء دون الحاجة إلى التعامل مباشرة مع التفاصيل الداخلية للـ DOM الفعلي. ولتوضيح ذلك أكثر هذا مثال بسيط لشرح كيفية عملها: import React, { useState } from 'react'; const App = () => { const [items, setItems] = useState(['عنصر 1', 'عنصر 2', 'عنصر 3']); const addItem = () => { // نقوم بنسخ قائمة العناصر باستخدام ال spread operator const newItems = [...items, `عنصر ${items.length + 1}`]; setItems(newItems); }; return ( <div> <h1>قائمة العناصر</h1> <ul> {items.map((item, index) => ( <li key={index}>{item}</li> ))} </ul> <button onClick={addItem}>إضافة عنصر جديد</button> </div> ); }; export default App;
  25. بخصوص هذا الخطأ الذي ظهر لك، فهو بسبب استخدام دالة ()mysql_fetch_assoc التي لا تزال تستخدم للتعامل مع قاعدة بيانات MySQL، لحل هذا المشكل يمكن البدء بتغيير دوال الاتصال فبدلا من الدوال التي تستخدم لقواعد البيانات MySQL يمكنك استخدام دالة ()fetch بدلا من ()mysql_fetch_assoc لهذا في ملف home.php يمكنك تحديث الجزء المتعلق باستعلام الدالة: while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // استخدام البيانات المستردة }
×
×
  • أضف...