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

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

  1. Ail Ahmed

    Ail Ahmed

    الأعضاء


    • نقاط

      9

    • المساهمات

      1202


  2. Chihab Hedidi

    Chihab Hedidi

    الأعضاء


    • نقاط

      4

    • المساهمات

      2064


  3. Najah Alsaker

    Najah Alsaker

    الأعضاء


    • نقاط

      4

    • المساهمات

      543


  4. ايمن ميلاد

    ايمن ميلاد

    الأعضاء


    • نقاط

      4

    • المساهمات

      247


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

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

  1. هل سيأخد مكان المبرمجين وهل نكمل التعلم ام نتوقف سمعت الكتير من المبرمجون يقولون بأنه يهدد المبرمجون وسوف يأخد مكانهم؟
    3 نقاط
  2. في بعض المواقع اكواد تثبيت بصري متل العمليات الحسابيه وغيرها بدي طريقة تخطي ذالك
    3 نقاط
  3. هل يعمل Express.Js و Next.Js بشكل مضاد مثل React و Angular أطلعت على مسار Next.js و كان المشروع لا يحتوي على Express.js و كان Next.js هوا من يقوم بي ال Route وأذا كان عادتا لا يعمل Next.Js مع Express.Js متى يفضل أستخدام أحدهما لأن بكل بساطه أريد أن أقوم بي عمل تطبيق سطح مكتب قبل نهايه الدوره بأستخدام Electron.Js وسيكون تطبيق معقد من ناحيه الواجهه الخلفيه وأريد أن يقوم البرنامج على أفضل ما يمكن أن أتعلمه في هذه الدوره فأريد أن أفهم بشكل مبسط ماذا أستخدم بشكل أفضل NextJs أم ExpressJs كواجهه خلفيه
    3 نقاط
  4. السلام عليكم ممكن ممكن اعرف طريقة تغير تاريخ الامس في الجافا ستريت
    2 نقاط
  5. السلام عليكم ورحمة الله وبركاته انا مطور رياكت ناتيف وعندي خبرة ف جافاسكريبت ولما كنت بتعلم للاسف صيعت وقتي في حاجات لم اكن اعرفها ولم احتاجها .. ولا اريد ان افعل ذلك في مجال تعلم الالة هذا الطريق الذي اعرفه لاكون Machine Learning Developer - الاحصاء والتحليل - الجبر الخطي - التفاضل والتكامل - لغة بايثون ماذا احتاج بعد حتي احصل علي وظيفة ؟ وهل مجال تعلم الالة له اطر عمل مختلفة مثل الويب ( React - Angular - Vue ) ام ماذا ؟
    2 نقاط
  6. السلام عليكم ورحمة الله وبركاته تحيه طيبه للجميع استفسار تكرماً بعد عملية نشر التطبيق على google play التطبيق لا يظهر من خلال البحث عنه من خلال الاسم الا في حالة محدده على سبيل المثال اول نقطة الاسم يتكون من قسمان الأول عربي وثاني انجليزي بحيث يصبح ك مثال الاسم كالتالي اكاديمية حاسوب - academyhsoub الاسم أعلاه هو اسم التطبيق الان لو قمت بفتح تطبيق جوجل بلاي وقمت بالبحث عن التطبيق وقمت بكتابة القسم الاول من الاسم فقط ( اكاديمية حاسوب) لن يظهر التطبيق حتى لو قمت بالبحث مطول ونزول إلى اخر القائمة ولكن لو قمت بالبحث عن الاسم بشكل التالي:( اكاديمية حاسوب - academyhsoub ) بمعنى قمت بكتابته بكل احرفه وتفاصيله كامل سوف اجده وسوف يظهر لماذا تحدث هذا المشكلة هل يملك احدكم فكره عن السبب؟ طبعا انا متأكد ان السبب ليس اسم التطبيق او الفكرة عربي وانجليزي توجد تطبيقات كثيره على منصة جوجل بلاي وتظهر بدون الحاجه الى كتابة الاسم كامل قمت بتحديث التطبيق العديد من المرات وتم تحميله في حدود 52 تحميل حتى الان هل توجد قوانين او سياسة محدده لظهور الاسم او يحتاج عدد تحميلات محدده يصل اليها؟ شكرا لكم
    2 نقاط
  7. نعم يوجد وبكل بساطة هو الامر shutdown حيث انه يمكنك كتابته كالتالي: shutdown /s /t 0 s لايقاف التشغيل /t يتم تحديد الوقت بعدها 0 تعني ايقاف تشغيل الكومبيوتر على الفور ومثلا ان كنت تريد ايقاف تشغيل الكومبيوتر ولكن بعد 5 دقايق فتقوم بتحويل الدقائق الى ثواني وتكتبها مكان الرقم 0 وهنا 5 دقائق عبارة عن 300 ثانية لذلك نكتب الامر التالي shutdown /s /t 300 اما اذا كنت تريد ايقاف تشغيله في وقت معين مثلا الساعة 7 مساءا ف عليك بكتابة الامر التالي echo shutdown /s /f | at 19:00 لاحظ اننا استخدمنا نظام ال 24 ساعة بالوقت لمعرفة ان كان القصد صباحا او مساءا هذا كل ما يخص ايقاف التشغيل عبر سطر الاوامر وبالتوفيق لك
    2 نقاط
  8. السلام عليكم ممكن افهم اي هو object الموجود في لغه باثيون
    2 نقاط
  9. السلام عليكم كيف يمكن اضافة خاصية كلاس للسطر برمجي تالي echo "<script> Swal.fire( 'رسالة تأكيد', 'تم تعديل بيانات الطالب بنجاح!', 'success', ) </script>"; مثال هكدا لكي استفيد به في css Swal.fire({ title: 'هل أنت متأكد من عملية الحذف؟', text: "لن تتمكن من استعادة هذه البيانات!", icon: 'warning', customClass: 'rak', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: 'نعم, احذفها!', cancelButtonText: "الغاء", )} <style> .rak { width: 400px; height: 300px; font-size: 14px !important; } </style>
    2 نقاط
  10. السلام عليكم لدي استضافة استعمله لبعت رسائل استخدم مكتبة phpmailer لماذا عنوان رسالة عندما اغيره بدل info الي مثلا موقع كورة كلام عربي يظهر حروف عشوائية مرفق كود توجد مشكلة في لغة عربية $mail->setFrom('test@gmail.com', 'info');
    2 نقاط
  11. السلام عليكم هو المفروض اشوف النظريه الاول وبعد كده احاول اطبق انا والا المفروض اشوف النظريه والنطبيق بغله البرمجه وبعد كده اطبق انا عشان الصراح في حاجه صعب علي انا اطبق زي خورزميات ال DFS انا شوفتها كا نظريه ولكن انا معرفتيش ان اطبق
    1 نقطة
  12. ما اريد القيام به, هوا أخذ نسخه من الطباعه عند طباعه اي شيء على الطابعه عندما بحثت في StackOverflow و ChatGPT توصلت إلى التالي: 1 -أنه يوجد ملف أسمه C:\Windows\System32\spool\PRINTERS هنا يتم تخزين الملفات بشكل مؤقت عند طباعتها 2 - علي الأشتراك في أحداث الطباعه (ًWindows Management Instrumentation) 3 - بمجرد اكتشاف الملفات الجديده يمكنني أستخدام مكتبه Node.js مثل (child_process) لتشغيل اوامر للتفاعل مع Print Spooler API هذا كل ما توصلت أليه أذا بأمكانك تشرح كيف ممكن أن يتم الربط بينهم أو ماهوا Print Spooler API وكيف يتم ربطه بالمشروع أو هنالك مقاطع تعليميه تنصحني بي مشاهدتها أو مشروع مشابه لما أفلعه أو حتى نسخه مبسطه للمشروع سأكون من الشاكرين
    1 نقطة
  13. السلام عليكم هل يوجد امر اكتب في الCommand prompt يقفل الجهازه في ويندوز
    1 نقطة
  14. السلام عليكم ورحمة الله وبركاته اريد جلب 2 collection الفايربيس وعرضها باdata table باستخدام فلاتر
    1 نقطة
  15. السلام عليكوم ورحمة و بركاتة كما قراتم في العنوان انا افكر ببرمجة نظام إدارة القوالب و الستايلات مثل نظام ستايلات منتديات فبلتن الجيل الثالث كيف الطريقة و ماهي الاساسيات و ارجو عمل امثلة توضيحية #==============================================# معلومة : انا لدي خبرة في لغة XML
    1 نقطة
  16. تحيه طيبه للجميع انا اعلم ان بعض خدمات الفايربيز في البداية مجانية ويوجد لها حدود ولكن لدي سؤال لم أتأكد من أجابته خدمات تسجيل الدخول من خلال خدمة signInWithGoogle و SignInWithApple او حسابات جوجل جيميل وابل كلاود هل هيا مجانية بدون حدود او قيود لدى برمجة flutter او يوجد عدد محدد لعدد المستخدمين خلال الشهر الواحد بعدها سوف احتاج الى الانتقال الى الباقة المدفوعة ؟ لقد شاهدت نقطة Other Authentication services يوجد امامها علامة صح شكرا لكم
    1 نقطة
  17. خدمات تسجيل الدخول من خلال، signInWithGoogle، signInWithApple وحسابات جوجل جيميل وابل كلاود، مجانية بدون حدود أو قيود ولا يوجد عدد محدد لعدد المستخدمين خلال الشهر الواحد. وباستطاعتك الإعتماد على الخدمات مجانًا دون الحاجة إلى الانتقال إلى الباقة المدفوعة. بينما "Other Authentication services" تشير إلى خدمات تسجيل دخول أخرى غير مدعومة بشكل مباشر من Firebase، ومنها: تويتر فيسبوك GitHub https://firebase.google.com/docs/auth https://firebase.google.com/docs/auth/flutter/start
    1 نقطة
  18. الأمر راجع لإحتمالات مختلفة، فربما يكون اسم التطبيق طويلًا جدًا أو يحتوي على رموز خاصة أو كلمات غير متداولة، فمن الأفضل أن يكون اسم التطبيق قصير ووصفًا وسهل الفهم. أو وصف التطبيق غير كافي أو ليس ذا صلة بكلمات البحث التي يستخدمها المستخدمون، قم بوضع وصف التطبيق بشكل يحتوي بالكلمات الرئيسية ويوضح وظائف التطبيق وفوائده. وقد يكون تصنيف التطبيق مناسبًا لفئة التطبيق، فاختر تصنيف دقيق يعكس محتوى التطبيق ووظائفه. أو عدد تحميلات التطبيق كافيًا لجعله يظهر في نتائج البحث، لذلك حاول الترويج لتطبيقك من خلال قنوات مختلفة لجذب المزيد من المستخدمين. بالإضافة إلى أنّ فهرسة التطبيق بواسطة Google Play يستغرق بعض الوقت بعد نشره، فانتظر بعض الوقت.
    1 نقطة
  19. استخدام كلمة "object" في السطر class Node(object) في Python 2.x، هناك نوعان من الأصناف : الأصناف القديمة النمط و الأصناف الجديدة النمط. استخدام كلمة "object" في تعريف صنف يشير إلى أن الصنف هو صنف جديد النمط. تم تقديم الأصناف الجديدة النمط (New-style classes) في Python 2.2 وتوفر نموذج كائن أكثر وقوة مقارنة بالأصناف القديمة النمط (old-style classes ). من خلال التوريث الصريح من `object`، نضمن أن الصنف يتبع نموذج New-style classes ويورث جميع الميزات والوظائف المقدمة من قبل صنف `object`. وتشمل هذه الأمور دعم ميزات مثل super() @property descriptors والتي قد لا تعمل بشكل صحيح مع old-style classes. أما في الإصدارات Python 3.x، لم يعد استخدام كلمة "object" في تعريفات الأصناف ضروريًا، حيث أن جميع الكلاسات هي New-style classes افتراضيًا. لذا، في Python 3.x، يمكنك ببساطة كتابة `class Node:` دون التوريث الصريح من `object`.
    1 نقطة
  20. اه تمام كده انا فهمت شكرااا جداا لحضرتك
    1 نقطة
  21. في Python 2، كتابة class Node(object): يُشير إلى أن فئة Node ترث من فئة object، هذه الصيغة تعني أن الفئة Node تعتمد على فئة object كمفترضة لها، وهذا يعني أنها ترث جميع السمات والسلوكيات الأساسية من الفئة object. أما حاليا في Python 3، يمكنك كتابة class Node: دون ذكر object، لأنه حاليا تفترض تلقائياً الوراثة من object، لذا class Node: هي نفسها class Node(object):.
    1 نقطة
  22. تقريبا في بيثون يشير مصطلح Object إلى مفهوم الكائنات في البرمجة الشيئية و تتيح لك OOP تنظيم البرنامج وتقسيمه إلى كائنات تفاعلية تتفاعل مع بعضها البعض. الكائن (Object) في البرمجة الشيئية هو مثيل محدد لنوع معين من البيانات، يجمع بين البيانات والسلوكيات، مثلا يمكن أن تكون السيارة كائنا، ولكن لكل سيارة خصائص محددة مثل اللون والسرعة والنموذج وما إلى ذلك. في بايثون، كل شيء هو كائن، بما في ذلك الأنواع الأساسية مثل الأعداد والسلاسل والقوائم وغيرها، بالإضافة إلى الكائنات التي تم إنشاؤها بواسطة المستخدم مثل الكائنات التي تنشئها عن طريق تعريف فئات جديدة، و عند العمل مع الكائنات في بايثون، يمكنك استخدام الخصائص والأساليب التي يوفرها الكائن للقيام بالعديد من العمليات المختلفة. و هذا تطبيق بسيط للمثال الذي ذكرته: class Car: def __init__(self, model, color): self.model = model self.color = color self.speed = 0 self.engine_status = False # استخدام الكائن my_car = Car("Toyota", "Red") print("Model:", my_car.model) print("Color:", my_car.color) يمكنك إن تطلع أكثر على الكائنات و البرمجة الكائنية في بيثون من خلال هذه المقالات:
    1 نقطة
  23. يختلف Devin AI عن النماذج الكبيرة مثل Gemini أو ChatGPT .أن ل Devin AI يمكنه إدارة دورة حياة تطوير البرامج بالكامل، بينما تركز LLMs بشكل أساسي على إنشاء الكود. كما أنه يتمتع Devin AI بالقدرة على التعلم الذاتي وتحسين الكود وتحديث العمليات تلقائيًا من خلال تزويده بالأدوات مثل سطر الأوامر ومرر للكود ومتصفح ويب بينما تعتمد LLMs بشكل أكبر على المدخلات البشرية. لذلك يمكن لـ Devin AI اختبار الكود وتصحيح الأخطاء، بينما تتطلب LLMs عادةً تدخلًا بشريًا للتعامل مع الأخطاء. وبالتأكيد أدوات الذكاء الإصطناعي تؤثر على العديد من المجالات بما فيها البرمجة وذلك ليس جديداً ولكن استبدال المبرمج فذلك مستبعد ومع ظهور هذه الأدوات ستحتاج بالفعل تطوير مهاراتك بشكل أكبر واستخدام هذه الأدوات والإستفادة منها حتى لا تتأثر بهذه الأدوات
    1 نقطة
  24. جميل، أنصحك بمواصلة مسيرتك في التعلم وإكمال الدورة مع المدرب وإتمام المسارات الخاصة بها مع التطبيق المباشر، ستجد في نهاية الدورة مسارا خاصا بأساسيات هندسة البرمجيات أين يمكنك فهم ميكانيزمات هذا المجال، وستفهم حينها بأنه لا يمكن لديفن أن يستبدل وظيفة مهندسي البرمجيات، وأنه يمكن أن يكون مساعدا لهم. يمكنك تصفح هذه المقالات المفيدة والنقاش حولها: https://io.hsoub.com/tech/156918-أول-مهندس-برمجيات-مولد-بالذكاء-الاصطناعي-هل-سيحل-مكان-مهندسي-البرمجيات-أم-سيسهل-حياتهم
    1 نقطة
  25. انا لتو بدأت أتعلم علوم الحاسوب مع أكاديمية حسوب لكي أصبح مبرمج ويب، مارأيكم تجاه Diven
    1 نقطة
  26. السلام عليكم لقد قمت ببناء API لمعرض اعمالي كمطور واجهات خلفية و ابحت عن مراجعة لها ! https://github.com/zeffanine-aimen/amazon-api بارك الله فيكم
    1 نقطة
  27. بارك الله فيك لقد قمت بحذف الAPI
    1 نقطة
  28. الرابط لا يعمل فهو يظهر رسالة خطأ 404 وهنا قد يكون الرابط الذي قدمته خاطئا يمكنك التأكد من مراجعة الرابط بعناية وإصلاح أي أخطاء في الكتابة، ثم يمكنني مساعدتك.
    1 نقطة
  29. في البداية أود أن أوضح لك نقطة صغيرة أنه ليس هناك أي شيء من أدوات الذكاء الصناعي ممكن أن يأخذ مكان المبرمجين لانه بذات نفسه تمت برمجته بواسطة مبرمج وحتى تطويره سيكون بواسطة مبرمج أيضا إذا أن البرمجة ستبقى ولكن سيصبح الطلب على وظائف الذكاء الصناعي أعلى كما هو متوقع بسبب التطور التكنولوجي السريع أما عن سؤال حول Devin فهو عبارة عن أداة تسهل عملية التطوير لغير المبرمجين وكما أنه يستطيع أن ينشئ مواقع صغيرة وبسيطة وليس بأنكانه انشاء تلك المواقع المعقدة ولا حتى حل المشكلات البرمجية الكبيرة لذلك فنحن مازلنا بحاجة المبرمجين لذلك بالنسبة لسؤالك عن الاستمرار أو التوقف ف أنا بالفعل انصحك بالاستمرار ولكن مع تطوير وتثقيف نفسك في مجال الذكاء الصناعي وبالتوفيق لك في اختيارك
    1 نقطة
  30. الذي جعل من ديفن مطوّرا خبيرا هو تزويده بأدوات البرمجة الخاصة به، فنجد أن لديه سطر أوامر ومحرّرا للشفرة ومتصفحا للويب، أي أنه يقوم بإدارة المهام وكتابة الأكواد وإصلاح المشاكل ويجمع المعلومات من الويب ويستكشف مختلف الموارد. حل المشاكل بشكل ذاتي اليوم بالنسبة للمهندسين يتطلب جهدا واستعانة بأدوات عدة، لكن ديفن في اختبار تم إجراؤه عليه واجه خطأ غير متوقع فلم يتراجع أو يستسلم وبدلا من ذلك أضاف بيانا للتصحيح وأعاد تشغيل الشفرة واستخدم سجلات الأخطاء لتشخيص المشكلة واصلاحها. أما بخصوص استبداله لوظيفة مهندسي البرمجيات فهذا برأيي أمر مستبعد وكلام مستهلك، فديفن ليس مشاركا في القيادة فهو بمثابة عامل برمجي اصطناعي بالكامل، لهذا يمكن لفرق الهندسة والتطوير تفويض المهام إليه، ممّا سيتيح للمهندسين البشر التركيز أكثر على الأعمال الإبداعية والابتكار وترك الأعمال الروتينية ل Devin.
    1 نقطة
  31. في التعليقات السابقة تم توضيح ما هو إطار العمل nextjs وفيما يستخدم ولماذا يمكن استخدامه في ال backend وهو بالأساس إطار عمل لل frontend مبني على react وتم توضيح أن express هو إطار عمل لل backend لذلك لإنشاء تطبيق سطح المكتب باستخدام Electron فالأفضل استخدام Express.js لبناء الواجهة الخلفية بدلاً من Next.js للأسباب التالية: Express.js هو إطار عمل مخصص لبناء واجهات برمجة التطبيقات (APIs) والخدمات الخلفية. فهو الأنسب لهذا الغرض. Next.js مخصص أساسًا لبناء تطبيقات الويب . وهو يضيف بعض الميزات مثل توليد الصفحات تلقائيًا عند الطلب، وهذا غير مطلوب لتطبيق سطح المكتب. Express.js سيكون أبسط لاستخدامه لبناء واجهة برمجة التطبيقات فقط دون تعقيدات إضافية. لذلك أوصي باستخدام Express.js لبناء الواجهة الخلفية لتطبيق السطح المكتب بينما ستستخدم Electron لبناء الجانب الأمامي. سيكون أفضل لمشروعك.
    1 نقطة
  32. تمام انا هعمل بنصحت حضرتك انا شاء الله شكرااا جدااا
    1 نقطة
  33. عندما تبدأ بتعلم الخوارزميات ماعليك هو حضور الفيديو وفهم الخوارزمية أو النظرية جيدا ثم بعد ذلك حاول وضع خوارزميات بمفردلك لبرامج صغيرة جدا في البداية ثم تقوم بتطوير مستواك خطوة خطوة وبعد اتقانك ذلك يمكنك تحويل هذه الخوارزمية إلى لغة البرمجة التي تريدها حسب خبرتك بلغات البرمجة اما بالنسبة لخوارزمية DFS فحاول حضور الفيديو اكثر من مرة بتركيز كبير وبعد فهمها جيدا حاول تطبيقها بنفسك وابحث واستفسر عن أي شيء حتى لو بسيط لم تستطع فهمه حتى تفهم جميع تفاصيلها ماذا تعني وبالتالي بالتأكيد ستبدع بها وبالتوفيق لك
    1 نقطة
  34. السلام عليكم كيف اطبق الDFS بلغه الباثيون
    1 نقطة
  35. هي خوارزمية وليست بنية بيانات. يتم استخدام البنيات البيانية لتخزين البيانات وتمثيل العلاقات بينها، في حين يتم استخدام الخوارزميات لتنفيذ العمليات أو الحسابات على هذه البيانات. في هذا السياق، DFS هي خوارزمية تستخدم للتنقل والبحث في الرسوم البيانية. بالنسبة لهياكل البيانات يمكنك الإطلاع عليها من هنا:
    1 نقطة
  36. نعم يمكنك تطبيق خوارزمية البحث في العمق في لغة Python بسهولة، سـأحاول كتابة مثال بسيط لتطبيق DFS : # تعريف الرسم البياني على شكل قائمة مجاورة graph = { 'A': ['B', 'C'], 'B': ['D', 'E'], 'C': ['F'], 'D': [], 'E': ['F'], 'F': [] } # تطبيق البحث في العمق def dfs(graph, start, visited=None): if visited is None: visited = set() visited.add(start) print(start) for neighbor in graph[start]: if neighbor not in visited: dfs(graph, neighbor, visited) # بدء البحث من النقطة A dfs(graph, 'A') تذكر أن البحث في العمق قد يؤدي إلى تحديد مسارات طويلة بشكل لا نهائي في الرسم البياني إذا كان هناك دورة، لذا يجب استخدام مجموعة visited لتتبع النقاط التي تم زيارتها بالفعل وتجنب الحلقات. يمكنك أن تطلع أيضا على شرح هذه الخوازرميات لتأخذ فكرة عليها بشكل أفضل من خلال هذه المقالات:
    1 نقطة
  37. لم تحل المشكلة الى الان
    1 نقطة
  38. لدي جدول منتجات بهذه هذه الحقول اسم و معرف و صوره وكميه ولدي ملف اكثر به 3000 منتج بنفس القيم كيف يمكنني استرادا ملف الاكسل واخذ البيانات التي به و انشاء المنتجات بنائا عن هذه البيانات
    1 نقطة
  39. هل قمت بإختيار نوع المشروع مثل React، فعند تنفيذ أمر الإنشاء npm create vite@latest سيطلب منك إختيار نوع المشروع عامًة قمت بإنشاء مشروع react لك وهو يعمل بشكل سليم. إن استمرت المشكلة، من الأفضل استخدام إصدار 18.17 من node.js من خلال الرابط التالي: https://nodejs.org/dist/v18.17.0/node-v18.17.0-x64.msi vite-project.rar
    1 نقطة
  40. هذه المشكلة تحدث بسبب إصدار nodejs وهو 20.6.1 غالباً لذلك حاول تحديث إصدار nodejs ويفضل إلى أحدث إصدار LTS من خلال الرابط التالي https://nodejs.org/en/download/
    1 نقطة
  41. مرحبا في بداية تشغيل البرنامج اول مره علي xcode من الطبيعي ياخد وقت لحين مينتهي من عمليت ال build اما اذ كانت هذه المشكلة تتكرر في كل مره تعمل build من الممكن انك تستخدم packages هذه ال packages تاخد وقت في عملية build ممن تتاكد من هذا عن طريق انشاء برتامج جديد علي xcode وحاول ان تعمل له run وقارن بينه وبين الاخر وتاكد من بعض الاشياء عندك 1-تحديث Xcode: تاكد من تحديث xcode علي اخر اصدار عندك 2-تاكد من تحديث flutter علي اخر اصدار 3-تاكد من اماكنيات جهاز الماك لديك
    1 نقطة
  42. هذه المشكلة كانت تواجه العديد من المستخدمين خاصة من كانوا يستخدمون محاكيات لتشغيل ال ios 14 فواجهوا مشكلة في سرعة عملية التجميع والتشغيل في Xcode على نظام macOS، بينما لا يواجه نفس المشكلة عند استخدامه لتطوير تطبيقات Flutter على نظام Windows. لحل هذه المشكلة، يمكن بدايةً القيام بحذف المجلدات داخل هذا الإجراء يهدف إلى تخفيض أي تأثير سلبي قد يكون لهذه المجلدات على سرعة عملية التجميع، لكن في حال لم يعمل معك يمكنك تجربة هذه الخطوات: يمكن القيام بعملية إلغاء الإقتران مع الجهاز في حالة استخدام جهاز فعلي يعمل بنظام iOS 14، ومن ثم إعادة الإقتران مع Xcode. هذا الإجراء يمكن أن يساعد في تحسين التوصيل وزيادة سرعة العمل. يمكن أيضًا التحقق من إعدادات Xcode وتحسينها، والتأكد من توافق إصدار Xcode المستخدم مع إصدار Flutter، وتحسين الكود لتجنب العمليات الزائدة التي قد تؤثر على سرعة التجميع والتشغيل.
    1 نقطة
  43. تمثل الأشجار نوعًا فرعيًا لهيكل أعم من هياكل البياناتٍ التخطيطية التفرعية Node-Edge Graph Data Structure كالآتي: والشجرة هي مخطط يحقق الشرطين التاليين: غير حلقي acyclic: أي لا يحتوي أيّ دورات cycles أو حلقات loops. متصل: أي يمكن الوصول إلى كل عقدة من عقد المخطط عبر مسار معيّن. وهيكل الشجرة شائع جدًا في علوم الحاسوب، إذ يُستخدم لنمذجة العديد من هياكل البيانات الخوارزمية المختلفة، مثل الأشجار الثنائية العادية والأشجار الحمراء-السوداء red-black trees، وأشجار B وأشجار AB وأشجار 23 وأشجار الكومة Heap وكذلك أشجار Trie. وتكون الشجرة جِذريةً ‎Rooted Tree‎ في حال: اختيار خلية واحدة لتكون جذرًا للشجرة. صباغة Painting الجذر في أعلى الشجرة. إنشاء طبقة سفلية lower layer لكل خلية في المخطط تبعًا للمسافة بينها وبين الجذر، فكلما كانت المسافة أكبر، كانت الخلية أسفل كما في الصورة التوضيحية أعلاه. ويرمز عادةً للأشجار بالرمز ‎T‎. الأشجار اللانهائية anary tree نُمثّل الأشجار اللانهائية -أي الأشجار التي يمكن أن يتفرّع عدد لانهائي من الفروع من عقدها- على هيئة أشجار ثنائية binary tree، وهي أشجار يتفرع عن كل عقدة منها فرعان فقط، ويُعَد الفرع الثاني منهما شقيقًا Sibling، لاحظ أنه إذا كانت الشجرة ثنائيةً، فسينشئ التمثيل عُقدًا إضافية. ثم نكرر بعد ذلك على الأشقاء، ومن ثم على الفروع، وبما أن أغلب الأشجار ضحلة (أي لها مستويات تفرع هرمي قليلة، رغم إمكانية كثرة الفروع للمستوى الواحد)، فإن هذا ينتج عنه شيفرة ذات كفاءة عالية، لاحظ أن هذا عكس هرمية البشر، إذ يكون لنا مستويات كثيرة جدًا في هرمية الآباء وأولاد قليلون لكل مستوى موازنةً بأولئك الآباء. من الممكن حفظ المؤشرات الخلفية للسماح للشجرة أن ترتقي، لكن تلك المؤشرات صعبة في معالجتها وصيانتها. لاحظ أنه عادةً ما يكون لدينا دالة واحدة للاستدعاء على الجذر، ودالة تكرارية recursive مع معامِلات إضافية، وفي هذا المثال فهي عمق الشجرة، انظر: struct node { struct node *next; struct node *child; std::string data; } void printtree_r(struct node *node, int depth) { int i; while(node) { if(node->child) { for(i=0;i<depth*3;i++) printf(" "); printf("{\n"): printtree_r(node->child, depth +1); for(i=0;i<depth*3;i++) printf(" "); printf("{\n"): for(i=0;i<depth*3;i++) printf(" "); printf("%s\n", node->data.c_str()); node = node->next; } } } void printtree(node *root) { printree_r(root, 0); } التحقق من تساوي شجرتين ثنائيتين انظر الشجرتين التاليتين: هاتان الشجرتين متساويتان، على خلاف الشجرتين التاليتين: وفيما يلي شيفرة عامة زائفة pseudo code للتحقق من تساوي شجرتين: boolean sameTree(node root1, node root2){ if(root1 == NULL && root2 == NULL) return true; if(root1 == NULL || root2 == NULL) return false; if(root1->data == root2->data && sameTree(root1->left,root2->left) && sameTree(root1->right, root2->right)) return true; } أشجار البحث الثنائية Binary Search Trees الأشجار الثنائية هي الأشجار التي يتفرّع عن كلّ عقدة منها ابنان على الأكثر، وشجرة البحث الثنائية Binary search tree أو BST اختصارًا هي شجرة ثنائية عناصرها مُرتّبة ترتيبًا خاصًا، إذ تكون جميع القيم الموجودة في الشجيرة أو الفرع sub tree الأيسر أصغر من القيم في الشجَيرة اليمنى. إدراج عنصر في شجرة بحث ثنائية Python رسم يوضح كيفية إدراج عنصر في الشجرة هذا تنفيذ بسيط لكيفية إدراج عنصر في شجرة بحث ثنائية مكتوب بلغة Python. class Node: def __init__(self, val): self.l_child = None self.r_child = None self.data = val def insert(root, node): if root is None: root = node else: if root.data > node.data: if root.l_child is None: root.l_child = node else: insert(root.l_child, node) else: if root.r_child is None: root.r_child = node else: insert(root.r_child, node) def in_order_print(root): if not root: return in_order_print(root.l_child) print root.data in_order_print(root.r_child) def pre_order_print(root): if not root: return print root.data pre_order_print(root.l_child) pre_order_print(root.r_child) حذف عنصر من شجرة بحث ثنائية C++‎ قبل أن نبدأ، نريد أن التذكير بمفهوم شجرة البحث الثنائية BST، وهي التي يتفرّع عن كل عقدة منها عقدتان كحد أقصى (ابن أيمن وأيسر)، حيث تحتوي الشجيرة اليسرى المتفرّعة عن عقدة ما على مفتاح قيمته أصغر من أو تساوي مفتاحَ العقدة الأصلية. وتحتوي الشجيرة اليمنى للعقدة على مفتاح أكبر من مفتاح العقدة الأصلية. سنناقش في هذه الفقرة كيفية حذف عقدة من شجرة بحث ثنائية مع الحفاظ على الخاصية أعلاه. هناك ثلاث حالات يجب مراعاتها عند حذف العقدة، هي الآتية: الحالة 1: العقدة المراد حذفها هي ورقة أو عقدة طرفية leaf node، مثل العقدة ذات القيمة 22. الحالة 2: العقدة المراد حذفها لها ابن واحد، مثل العقدة ذات القيمة 26. الحالة 3: العقدة المراد حذفها لها ابنان، مثل العقدة ذات القيمة 49. شرح الحالات عندما تكون العقدة المراد حذفها ورقةً، فما عليك سوى حذف العقدة وتعيين المؤشر الفارغ ‎nullptr‎ إلى العقدة الأصلية. عندما تحتوي العقدة المراد حذفها على ابن واحد فقط، انسخ قيمة الابن إلى قيمة العقدة ثمّ احذف الابن (ستُحوّل إلى الحالة 1). عندما يكون للعقدة المراد حذفها ابنان، فيمكن نسخ القيمة الأصغر من شجيرتها اليمنى إلى العقدة، بعدها يمكن حذف القيمة الدنيا من الشجيرة اليمنى للعقدة، حيث ستُحوَّل إلى الحالة 2. انظر المثال التالي على حذف عنصر من شجرة بحث ثنائية: struct node { int data; node *left, *right; }; node* delete_node(node *root, int data) { if(root == nullptr) return root; else if(data < root->data) root->left = delete_node(root->left, data); else if(data > root->data) root->right = delete_node(root->right, data); else { if(root->left == nullptr && root->right == nullptr) // الحالة 1 { free(root); root = nullptr; } else if(root->left == nullptr) // الحالة 2 { node* temp = root; root= root->right; free(temp); } else if(root->right == nullptr) // الحالة 2 { node* temp = root; root = root->left; free(temp); } else // الحالة 3 { node* temp = root->right; while(temp->left != nullptr) temp = temp->left; root->data = temp->data; root->right = delete_node(root->right, temp->data); } } return root; } التعقيد الزمني للشيفرة أعلاه هو O(h)‎‎، حيث تمثّل h ارتفاع الشجرة. أدنى سلف مشترك في شجرة بحث ثنائية انظر شجرة البحث الثنائية التالية: أدنى سلف مشترك Lowest common ancestor لـ 22 و26 هو 24. أدنى سلف مشترك لـ 26 و49 هو 46. أدنى سلف مشترك لـ 22 و24 هو 24. تُستغل الخاصية المميّزة لأشجار البحث الثنائية للعثور على السلف الأدنى للعقد، فيما يلي شيفرة عامة للعثور على السلف المشترك الأدنى: lowestCommonAncestor(root,node1, node2){ if(root == NULL) return NULL; else if(node1->data == root->data || node2->data== root->data) return root; else if((node1->data <= root->data && node2->data > root->data) || (node2->data <= root->data && node1->data > root->data)){ return root; } else if(root->data > max(node1->data,node2->data)){ return lowestCommonAncestor(root->left, node1, node2); } else { return lowestCommonAncestor(root->right, node1, node2); } } شجرة البحث الثنائية Python انظر إلى شيفرة البايثون التالية: class Node(object): def __init__(self, val): self.l_child = None self.r_child = None self.val = val class BinarySearchTree(object): def insert(self, root, node): if root is None: return node if root.val < node.val: root.r_child = self.insert(root.r_child, node) else: root.l_child = self.insert(root.l_child, node) return root def in_order_place(self, root): if not root: return None else: self.in_order_place(root.l_child) print root.val self.in_order_place(root.r_child) def pre_order_place(self, root): if not root: return None else: print root.val self.pre_order_place(root.l_child) self.pre_order_place(root.r_child) def post_order_place(self, root): if not root: return None else: self.post_order_place(root.l_child) self.post_order_place(root.r_child) print root.val هذه شيفرة لإنشاء عقدة جديدة وإدراج البيانات فيها: r = Node(3) node = BinarySearchTree() nodeList = [1, 8, 5, 12, 14, 6, 15, 7, 16, 8] for nd in nodeList: node.insert(r, Node(nd)) print "------In order ---------" print (node.in_order_place(r)) print "------Pre order ---------" print (node.pre_order_place(r)) print "------Post order ---------" print (node.post_order_place(r)) التحقق مما إذا كانت الشجرة شجرة بحث ثنائية أم لا تكون شجرةٌ ثنائيةٌ ما "شجرةَ بحث ثنائية" إذا كانت تستوفي أيًّا من الشروط التالية: إن كانت فارغة. لا تتفرع منها أيّ شجيرات. لكلّ عقدة x في الشجرة، يجب أن تكون جميع المفاتيح (إن وجدت) في الشجيرة اليسرى أصغر من مفتاح x، أي ‏key(x)‎‎، ويتعيّن أن تكون جميع المفاتيح (إذا وجدت) في الشجيرة اليمنى أكبر من key(x)‎‎. الخوارزمية التكرارية التالية تتحقق من الشروط أعلاه: is_BST(root): if root == NULL: return true تحقق من القيم في الشجيرة اليسرى: if root->left != NULL: max_key_in_left = find_max_key(root->left) if max_key_in_left > root->key: return false تحقق من القيم في الشجيرة اليمنى: if root->right != NULL: min_key_in_right = find_min_key(root->right) if min_key_in_right < root->key: return false return is_BST(root->left) && is_BST(root->right) رغم صحة الخوارزمية أعلاه إلا أنها تفتقر إلى الكفاءة، لأنّها تمر على كلّ عقدة عدّة مرات، ولتقليل عدد مرّات زيارة كل عقدة يجب أن نتذكر القيم الدنيا والقصوى الممكنة للمفاتيح في الشجيرة التي نزورها. سنستخدم هذه الفكرة لتطوير خوازمية أكثر فعالية. ولفعل هذا، نرمز للقيمة الدنيا الممكنة لأيّ مفتاح ‎K_MIN‎، والقيمة القصوى بالرمز K_MAX. فإن بدأتَ من جذر الشجرة يكون نطاق قيم الشجرة هو ‎[ K_MIN ،K_MAX‎]‎. وإذا كان x‎ هو مفتاح عقدة الجذر فسيكون نطاق القيم في الشجيرة اليسرى هو ‎[K_MIN,x)‎، ونطاق القيم في الشجيرة اليمنى هو (x,K_MAX]. s_BST(root, min, max): if root == NULL: return true // هل مفتاح العقدة الحالية خارج النطاق؟ if root->key < min || root->key > max: return false // التحقق مما إذا كانت الشجيرتان اليسرى واليمنى أشجارَ بحث ثنائية return is_BST(root->left,min,root->key-1) && is_BST(root->right,root->key+1,max) وستُستَدعى في البداية على النحو التالي: is_BST(my_tree_root,KEY_MIN,KEY_MAX) هناك منظور آخر لحل الأمر، وهو الاجتياز المُرتّب inorder traversal للشجرة الثنائية -انظر أدناه-، فإذا نتج عن ذلك الاجتياز المُرتب تسلسلٌ مرتّب من المفاتيح، فستكون الشجرة شجرة بحث ثنائية. وللتحقق ممّا إذا كان التسلسل الناتج مُرتّبًا أم لا، فعليك تخزين قيمة العقدة المُزارة سابقًا، ثمّ موازنتها بالعقدة الحالية. النظر في ما إن كانت شجرة ما تحقق شرط أشجار البحث الثنائية انظر المثال التالي: إن كانت المدخلات كما يلي: فإن الخرج سيكون خاطئًا false، وعليه لا تكون هذه شجرة بحث ثنائية، ذلك أنّ 4 في الشجيرة اليسرى أكبر من قيمة الجذر 3. انظر الآن مثالًا على شجرة أخرى: النتيجة ستكون صحيحة وتكون شجرة بحث ثنائية. اجتيازات الأشجار الثنائية Binary Tree traversals زيارة عقدة لشجرة ثنائية بترتيب معيّن يُسمّى اجتيازَا أو عبورًا traversal، وهناك عدة أنواع من الاجتياز سنستعرض في هذه الفقرة بعضها. الاجتياز بالمستويات: التطبيق انظر الشجرة التالية: يكون الاجتياز بالمستويات على الترتيب التالي: ‪‎1‎‎‎‎‪ 2 3 4 5 6 7‪ ‎ مع طبع بيانات العُقَد مستوىً بمستوى، انظر: include<iostream> #include<queue> #include<malloc.h> using namespace std; struct node{ int data; node *left; node *right; }; void levelOrder(struct node *root){ if(root == NULL) return; queue<node *> Q; Q.push(root); while(!Q.empty()){ struct node* curr = Q.front(); cout<< curr->data <<" "; if(curr->left != NULL) Q.push(curr-> left); if(curr->right != NULL) Q.push(curr-> right); Q.pop(); } } struct node* newNode(int data) { struct node* node = (struct node*) malloc(sizeof(struct node)); node->data = data; node->left = NULL; node->right = NULL; return(node); } int main(){ struct node *root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); root->right->left = newNode(6); root->right->right = newNode(7); printf("Level Order traversal of binary tree is \n"); levelOrder(root); return 0; } تُستخدم الصفوف Queues -وهو نوع من البيانات- لتحقيق الهدف أعلاه. الاجتياز التنازلي والتصاعدي والمرتب انظر الشجرة الثنائية التالية: الاجتياز التنازلي Pre-order traversal: يبدأ هذا النوع باجتياز العقدة، ثم الشجيرة اليسرى للعقدة، ثمّ الشجيرة اليمنى لها. ويكون الاجتياز التنازلي بالترتيب التالي: 1 2 4 5 3 6 7 الاجتياز المُرتّب In-order traversal: هو اجتياز الشجيرة اليسرى للعقدة، ثمّ العقدة نفسها، ثم الشجيرة اليمنى للعقدة. يكون الاجتياز المُرتّب بالترتيب التالي: 4 2 5 1 6 3 7 الاجتياز التصاعدي Post-order traversal: هو اجتياز الشجيرة اليسرى للعقدة، ثم الشجيرة اليمنى، ثمّ العقدة، ويكون الاجتياز التصاعدي بالترتيب التالي: 4 5 2 6 7 3 1 العثور على أدنَى سلف مشترك لشجرة ثنائية السلف المشترك الأدنى للعقدتين n1 وn2 هو أدنى عقدة في الشجرة يكون كلّ من n1 وn2 أحفادًا لها. انظر الشجرة التالية: أدنى سلف مشترك للعقدتين ذواتي القيمتين 1 و4 هو 2. أدنى سلف مشترك للعقدتين ذواتي القيمتين 1 و5 هو 3. أدنى سلف مشترك للعقدتين ذواتي القيمتين 2 و4 هو 4. أدنى سلف مشترك للعقدتين ذواتي القيمتين 1 و2 هو 2. ترجمة -بتصرّف- للفصول من 4 إلى 8 من كتاب Algorithms Notes for Professionals اقرأ أيضًا المقالة السابقة: ترميز Big-O المرجع الشامل إلى: تعلم الخوارزميات للمبتدئين تعقيد الخوارزميات Algorithms Complexity مدخل إلى الخوارزميات دليل شامل عن تحليل تعقيد الخوارزمية النسخة الكاملة من كتاب مدخل إلى الذكاء الاصطناعي وتعلم الآلة
    1 نقطة
×
×
  • أضف...