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

Mustafa Suleiman

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

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

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

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

    335

إجابات الأسئلة

  1. إجابة Mustafa Suleiman سؤال في بحث متعدد الأشكال في قاعدة بيانات SQL باستخدام Laravel Eloquent كانت الإجابة المقبولة   
    استخدم قيمة ذلك الحقل لتنفيذ البحث في قاعدة البيانات، كالتالي:
    في ملف العرض (View) الخاص بك، أنشئ نموذج (Form) بحث بالشكل التالي:
    <form method="GET" action="/search"> <input type="text" name="query" placeholder="ابحث عن الاسم"> <button type="submit">ابحث</button> </form> ثم، في ملف التوجيه (Routes)، حدد مسار للبحث وربطه بوظيفة في وحدة التحكم (Controller)، كالتالي:
    Route::get('/search', 'SearchController@search'); وفي وحدة التحكم (Controller) الخاصة بالبحث، تستطيع استقبال الاستعلام (query) المدخل من الحقل واستخدامه في جملة البحث، كالتالي:
    use Illuminate\Http\Request; use App\Models\Table; class SearchController extends Controller { public function search(Request $request) { $query = $request->input('query'); $results = Table::where('name', 'LIKE', '%' . $query . '%')->get(); // عرض النتائج أو قم بالإجراءات المناسبة return view('search_results', ['results' => $results]); } } بحيث تستقبل الاستعلام (query) من الحقل بواسطة كائن Request، ثم استخدامه في جملة البحث للبحث عن السجلات التي تحتوي على الاستعلام في حقل الاسم، وتُرسل النتائج إلى عرض (View) المستخدم لعرضها بطريقة مناسبة.
    واستبدل Table بالاسم الصحيح للنموذج لديك، واستبدال search_results بعرض النتائج أيضًا.
  2. إجابة Mustafa Suleiman سؤال في ماذا بعد دورة علوم الحاسوب كانت الإجابة المقبولة   
    السؤال الصحيح هو، هل لديك الوقت الكافي؟ 
    عليك بتحديد الوقت المتاح لك ثم التخطيط على أساسه، وأيضًا تحديد الدورات بناءًا على الهدف والمجال الذي تنوي التخصص به، فلو أردت التأسيس في مجال البرمجة بشكل جيد ولديك الوقت الكافي، فعليك بتعلم C++ أولاً لكن البعض قد يجدها صعبة ويصاب بالإحباط بدون داعي، ولذلك ستجد أغلب دورات أساسيات البرمجة تقوم بتدريس لغة بايثون لكونها لغة قوية وشائعة الاستخدام ومطلوبة وسهلة، أي أن الأمر راجع لك وتستطيع التجربة والحكم ولا مشكلة في ذلك أبدًا لكن بشرط المحاولة.
    وقد ذكرت أنك درست CS50 ولن تحتاج إلى أكثر من ذلك حاليًا في البداية، عليك فقط بإختيار لغة البرمجة الأولى لك والتمسك بها والتعمق فيها من خلال تنفيذ المشاريع بعد دراسة الأساسيات والتطبيق عليها، وإذا أردت دراسة جافاسكريبت كلغة برمجة أولى فلا مشكلة في ذلك، لكن الصحيح هو C أو C++ ثم بايثون ثم جافاسكريبت رغم أني أفضل C++ ثم بايثون ثم جافاسكريبت، هل أنا تعلمت بتلك الطريقة؟ 
    لا، الوقت لدي كان محدود، لذلك تعلمت أساسيات البرمجة من خلال بايثون لقلة الوقت لدي ولسهولة تعلم بايثون، ثم انتقلت إلى الواجهة الأمامية وتعمقت في جافاسكريبت، ثم تعلمت إطار خاص بالواجهة الأمامية وهو React ثم تعلمت الواجهة الخلفية من خلال node.js وذلك خلال فترة 6 أشهر وبمعدل 10 ساعات يوميًا وربما أكثر، فالأمر ليس بالهين أبدًا.
    وإذا أردت نصيحة واحدة فقط، ركز على الأساسيات ما استطعت وبشدة ثم طبق عليها بأكثر من مشروع حتى تشعر أنك استوعبتها تمامًا وأصبح الأمر سهل من خلال التكرار.
    وأنت لديك الوقت كما أظن، فتعلم بالطريقة الصحيحة كما أشرت لك، ثم انتقل للغة الخاصة بالمجال الذي تنوي التخصص به.
  3. إجابة Mustafa Suleiman سؤال في ما الفرق بين auth()->user() و Auth::user() في Laravel؟ كانت الإجابة المقبولة   
    الفرق هو أن auth()->user() يرجع الكائن User الحالي بينما Auth::user() يرجع الكائن User الحالي أو null إذا لم يكن هناك مستخدم محدد.
    وتستطيع استخدام auth()->user() في المواقف التي تحتاج فيها إلى التأكد من وجود مستخدم محدد، مثلاً في حال كنت تريد عرض معلومات المستخدم الحالي ، فاستخدم:
    auth()->user()->name بينما نستخدم Auth::user() في المواقف التي لا تحتاج فيها إلى التأكد من وجود مستخدم محدد. كمثل معرفة ما إذا كان هناك مستخدم محدد متصل.
    وإليك مثال:
    // استخدام auth()->user() $user = auth()->user(); // طباعة اسم المستخدم الحالي echo $user->name; // استخدام Auth::user() if (Auth::check()) { // هناك مستخدم متصل } else { // لا يوجد مستخدم متصل }
  4. إجابة Mustafa Suleiman سؤال في شرح للكلمة المحجوزة "this" في جافاسكريبت وكيفية استخدامها بشكل مفصل كانت الإجابة المقبولة   
    لأكون واضحًا معك، لن تفهم الأمر بشكل واضح إلا إذا قمت بدراسة الدالة البانية Constructor  والسياق والنطاق Context and Scope وPrototype والتعرف على الطرق المختلفة لاستدعاء الدوال في جافاسكريبت، مثل استدعاء الدوال من كائنات، واستدعاءها كدوال عادية، واستدعاءها باستخدام الدوال السهمية، واستدعاءها باستخدام الـapply والـcall والـbind.
    و "this" ببساطة هي كلمة محجوزة تشير إلى الكائن الحالي الذي يتم تنفيذ الكود فيه، ونستخدم "this" داخل الوظائف والأساليب والأحداث للإشارة إلى الكائن الحالي الذي تم استدعاء الوظيفة أو الأسلوب منه.
    أما فائدة "this"  تكمن في القدرة على الوصول إلى الخصائص والأساليب الخاصة بالكائن الحالي، فعندما تستدعى الوظيفة أو الأسلوب باستخدام "this"، يتم تمرير الكائن الحالي كوسيط للعمليات التي يجريها الكود.
    مثلاً لنفترض أن لدينا كائنًا يُمثل سيارة، ولديه خاصية "السرعة" وأسلوب "تشغيل"، وعند استدعاء أسلوب "تشغيل"، تستخدم "this" للإشارة إلى الكائن الحالي (السيارة) وتغيير خاصية "السرعة" بناءًا على الإجراء المناسب.
    وفي جافاسكريبت، قيمة "this" تختلف بين الدوال العادية (Regular Functions) والدوال السهمية (Arrow Functions):
    الدوال العادية:
    قيمة "this" تشير إلى الكائن الذي يتم استدعاء الدالة منه، أو الكائن الذي يحتوي على الدالة، أي تعتمد قيمة "this" في الدوال العادية على سياق الاستدعاء وطريقة استدعاء الدالة.
    والتوضيح من خلال الكود أفضل، ولنبدأ باستخدام "this" في الوظائف المنفصلة:
    const person = { name: "John", age: 30, greet: function() { console.log("Hello, my name is " + this.name); } }; person.greet(); // الناتج: "Hello, my name is John" قمت بتعريف دالة greet داخل كائن person، وعند استدعاء الدالة باستخدام person.greet()، تستخدم "this" للإشارة إلى الكائن الحالي (person) والوصول إلى خاصية name لطباعة رسالة تحتوي على اسم الشخص.
    الدوال السهمية:
     قيمة "this" ليست مرتبطة بسياق الاستدعاء ولا تتأثر بطريقة الاستدعاء، ولكنها  تستمد قيمتها من النطاق الذي تم تعريف الدالة فيه كالتالي:
    const person = { name: "John", age: 30, greet: () => { console.log("Hello, my name is " + this.name); } }; person.greet(); // الناتج: "Hello, my name is undefined" وكما ترى بغض النظر عن كيفية استدعاء الدالة person.greet()، قيمة "this" في الدالة السهمية تشير إلى النطاق العلوي (lexical scope) الذي تم تعريف الدالة فيه، وفي هذه الحالة قيمة this.name ستكون غير معرفة (undefined).
    2- استخدام "this" في الأحداث (Events)
    const button = document.getElementById("myButton"); button.addEventListener("click", function() { console.log("Button clicked by " + this.textContent); }); تم تعيين حدث النقر (click event) لزر HTML بواسطة addEventListener. عند حدوث النقر، تستدعى الوظيفة المنفذة، وهنا يتم استخدام "this" للإشارة إلى العنصر الذي تم النقر عليه (الزر) وطباعة نص الزر في الكونسول.
    3- استخدام "this" في الأشياء الموروثة (Inheritance)
    والمثال التالي يفترض أنك على دراسة بالـ prototype.
    function Animal(name) { this.name = name; } Animal.prototype.greet = function() { console.log("Hello, I'm " + this.name); }; function Dog(name, breed) { Animal.call(this, name); this.breed = breed; } Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog; const myDog = new Dog("Max", "Labrador"); myDog.greet(); // الناتج: "Hello, I'm Max" عرفت الدالة Animal وتأخذ معلمة name، ثم قمت بإنشاء دالة greet باستخدام النمط الأساسي للوظائف الموروثة (prototype inheritance).
    بالمثل، تعريف الدالة Dog التي ترث من Animal وتضيف خاصية breed، وعند إنشاء كائن Dog واستدعاء الدالة greet، تستخدم"this" للإشارة إلى الكائن الحالي (myDog) واستدعاء greet من النمط الأساسي.
  5. إجابة Mustafa Suleiman سؤال في مشكلة استخدام includes و indexOf مع قيمة prompt النصية ومصفوفة من الأرقام كانت الإجابة المقبولة   
    يجب تحويل قيمة الـ prompt إلى رقم حيث أن القيمة العائدة منه هي نص، وهناك أكثر من طريقة لفعل ذلك، الأولى هي بوضع علامة + بجانب prompt أي كالتالي:
    let x = +prompt('أدخل رقم من المصفوفة') وسيتم تحويل القيمة المدخلة إلى رقم.
    والطريقة الثانية هي باستخدام دالة parseInt كالتالي:
    let x = parseInt(prompt('أدخل رقم من المصفوفة')); والطريقة الثالثة هي باستخدام دالة Number وانتبه إلى أن حرف الـ N كبير لكونها constructor أي دالة بانية  ولكننا نستخدمها كدالة هنا لتحويل النص إلى الرقم كالتالي:
    let x = Number(prompt('أدخل رقم من المصفوفة')); الكائن Number في JavaScript
  6. إجابة Mustafa Suleiman سؤال في هل دورة بايثون مجانية؟ كانت الإجابة المقبولة   
    في الوقت الحالي، دورات أكاديمية حسوب مدفوعة وهي غير مجانية لكون الدورة تم إعدادها بعناية واستغرقت الكثير من الوقت من قبل فريق عمل لإخراجها بجودة تستحق وتليق بمشتركي أكاديمية حسوب من خلال 416 فيديو لشرح أساسيات بايثون  والتطبيق عليها ثم إطار العمل جانغو Django وFlask وتطوير تطبيقات أودو Odoo وأيضًا تحليل البيانات وأساسيات تعلم الآلة Machine Learning.
    في بعض الأوقات يوجد خصومات في المناسبات مثل شهر رمضان والجمعة البيضاء، وكوبونات في أوقات متفرقة من العام، تستطيع سؤال مركز المساعدة عن وجود خصومات حاليًا أم لا.
    وبخصوص لغة بايثون هناك دروس ومقالات في موسوعة حسوب وأكاديمية حسوب وأيضًا كتابة لتعلم بايثون:
    دروس بايثون في أكاديمية حسوب شرح لغة بايثون Python في موسوعة حسوب
  7. إجابة Mustafa Suleiman سؤال في مشكل في التنسيق كانت الإجابة المقبولة   
    أرجو منك طرح السؤال أسفل فيديو الدورة الخاص بالسؤال ليتم مساعدتك بشكل أفضل، وطرح الأسئلة العامة هنا.
  8. إجابة Mustafa Suleiman سؤال في هل من الآمن الكتابة على مجلد Windows/Temp أم يجب تركه Read-only؟ كانت الإجابة المقبولة   
    لا مشكلة في الكتابة على مجلد Windows/Temp، فهو مخصص لكي تقوم التطبيقات بكتابة الملفات المؤقتة فيه، والملفات المؤقتة هي ملفات يتم إنشاؤها بواسطة التطبيقات وتستخدم لفترة قصيرة من الزمن، ثم يتم حذفها من قبل التطبيق أو من قبل نظام التشغيل.
    وإذا أردت تغيير مكان الملفات المؤقتة إذا كنت تستخدم لاراجون قم بفتح ملف php.ini الخاص بتكوين PHP، ثم ابحث عن سطر يحتوي على "upload_tmp_dir" في ملف php.ini وقم بإلغاء تعليقه عن طريق إزالة علامة التعليق "#" في بداية السطر.
    ثم تعيين قيمة "C:/laragon/tmp" لـ "upload_tmp_dir"، ويعني ذلك أن الملفات المؤقتة التي تم رفعها ستخزن في المجلد "C:/laragon/tmp".
  9. إجابة Mustafa Suleiman سؤال في كيف ابدأ بنشر محتوى تعليمي كانت الإجابة المقبولة   
    المنصات التعليمية المشابهة لـ Udemy وغيرها قليلة في المحتوى العربي، ولذلك أمامك خيارين، الأول هو إنشاء موقع خاص بك ونشر الكورس الخاص بك عليه مع نظام إشتراك تحدده أنت في حال كنت قادر على التسويق للكورس الخاص بك ولديك متابعين أو معروف في مجالك.
    أو استخدام المنصات التي لديها مستخدمين بالفعل مثل Udemy وAlmentor و Skillshare وبالتالي سيتم العثور على الكورس الخاص بك ولكن بشرط أن توفر جودة منافسة للكورسات الموجودة بالفعل وميزة تنافسية عنهم، مثل شرح أحدث الإصدارات بطريقة عملية واستخدام السلايدات والإنفوجرافيك لتوضيح الأمر، وغيرها من الأمور التي تستطيع تحديدها بنفسك، وقد يفيدك قراءة التالي:
    وربما عليك في البداية إنشاء كورس مجاني على اليوتيوب بجودة جيدة، من أجل بناء قاعدة متابعين لك مهتمين بالكورسات التي تقدمها.
  10. إجابة Mustafa Suleiman سؤال في مشكلة "Path cannot be empty" عند استخدام دالة store() لحفظ الصورة كانت الإجابة المقبولة   
    سبب المشكلة هو أن المسار الذي تحاول استخدامه فارغ، أي عدم تعيين المسار الصحيح لحفظ الصورة المرفوعة، وأنت تستخدم الدالة store() لحفظ الصورة، وتحدد المجلد "posts" وتستخدم القرص المحلي "public".
    وللتأكد من أن المشكلة ليست بسبب خطأ في المسار، هل تحققت من وجود المجلد "posts" في القرص المحلي "public" في مشروعك؟ وإذا كان المجلد غير موجود، فتستطيع إنشائه يدويًا.
    وإذا كان المجلد موجودًا ولا تزال تواجه المشكلة، فربما هناك خطأ آخر في الطريقة التي ترفع بها الصورة، ومن الأفضل التحقق من قيمة $request['image'] والتأكد من أنها صحيحة وتحتوي على الصورة المطلوبة.
    وربما لديك مشكلة في الكتابة إلى مجلد temp في  C:\Windows\Temp عليك بالضغط بزر الفأرة الأيمن على مجلد temp ثم اختيار properties  ثم ستجد خيار باسم read-only قم بإزالة العلامة ثم ok للحفظ.

    وأيضًا تستطيع استخدام دالة dd لمعرفة المسار كالتالي:
    dd($request['image']); وسيتم عرض معلومات المتغير $request['image'] بشكل مفصل، بما في ذلك المسار وأي بيانات أخرى متعلقة بالصورة.

  11. إجابة Mustafa Suleiman سؤال في حل سؤال Problem Solving كم عدد الرصاص الذي يحتاجه البطل لهزيمة التنانين في القلعة؟ كانت الإجابة المقبولة   
    المطلوب هو إنشاء دالة تستقبل عدد الرصاصات التي يحملها البطل (bullets) وعدد التنانين المحيطة بالقلعة (dragons)، وتقوم بإرجاع قيمة True إذا كان البطل قادرًا على الفوز على جميع التنانين والبقاء على قيد الحياة، وإلا فإنها ترجع قيمة False.
    والكود لديك لا يحقق الشروط المطلوبة لحل السؤال بشكل صحيح، فأنت  نفذت الشرط (bullets >= 2) ولكنك لم تقدم الشرط الثاني (dragons == 2) بشكل صحيح.
    وبناءًا على المطلوب، ليس هناك حاجة محددة لعدد الرصاص المطلوب أن يكون 2 فقط، بل يمكن أن يكون أي عدد من الرصاصات المتاحة، أيضًا يجب أن تكون قادرًا على معالجة عدد أكبر من 2 تنين.
    أي تعديل الكود ليصبح كالتالي:
    def can_defeat_dragons(num_dragons, num_bullets): return num_dragons <= num_bullets // 2 وباستدعاء الدالة can_defeat_dragons(4, 8 ), سترجع القيمة True لأن البطل يحمل 8 رصاصات وهناك 4 تنانين، وبما أن 8 // 2 = 4، فإن الشرط يتحقق ويمكن للبطل الفوز على جميع التنانين، كالتالي:
    print(can_defeat_dragons(4, 8))
  12. إجابة Mustafa Suleiman سؤال في ماهي أفضل مواقع ومنصات عربية لتسويق الخدمات الرقمية كانت الإجابة المقبولة   
    السؤال عام جدًا، ما هي الخدمات الرقمية التي تحتاج إلى تسويقها؟ فإذا كان لديك خدمات تقدمها فإما عليك بإنشاء موقع شخصي وعرض تلك الخدمات عليه مع توفير إمكانية لشراء تلك الخدمات أو رابط لموقع آخر تعمل عليه لحجز الخدمة مثلاً.
    أما إذا كنت تريد التسويق لخدمة تقدمها، فعليك بتعلم المهارات الخاصة بالتسويق وبناء العلامة الشخصية، وكيفية بناء متابعين لك عن طريق نشر معرفتك في المكان الصحيح بغرض الإفادة فعلاً لفترة وتعريف الناس بنفسك.
    أما إذا كنت تريد العمل في مواقع العمل الحر وعرض خدماتك، فلديك مواقع مثل مستقل وخمسات وموقع بعيد.
    وبخصوص عرض المنتجات الرقمية للبيع والتربح منها، فلديك منصة بيكاليكا.
    قسم مقالات التسويق والمبيعات في أكاديمية حسوب قسم مقالات التسويق الذاتي في أكاديمية حسوب  
  13. إجابة Mustafa Suleiman سؤال في معمارية RESTful API: مفهومها وكيفية استخدامها في تطوير الواجهات البرمجية كانت الإجابة المقبولة   
    ببساطة مهارة REST API أو RESTful API تعني قدرتك على تصميم وتطوير وتفهم واجهات برمجة التطبيقات (API) باستخدام نمط REST (Representational State Transfer). REST هو نمط معماري يستخدم في تطوير الويب للتواصل بين العميل (Client) والخادم (Server) من خلال استخدام مجموعة من الأساليب المحددة مثل GET وPOST وPUT وDELETE.
    ويستند REST إلى مجموعة من المبادئ والقيود التي تسهل الاتصال والتفاعل بين العميل والخادم:
    تمثيل الموارد (Resources): يتم تمثيل البيانات والموارد في النظام عن طريق معرفات فريدة (مثل عناوين URL) ويتم الوصول إليها والتعامل معها عن طريق طلبات HTTP. واجهات معيارية (Standardized Interfaces): يستخدم REST مجموعة من طرق الطلبات المعيارية في HTTP مثل GET وPOST وPUT وDELETE للتفاعل مع الموارد. إنعدام الحالة (Stateless): كل طلب منفصل بذاته ولا يتم تخزين حالة العميل على الخادم بين الطلبات، وترسل كافة المعلومات اللازمة للخادم في كل طلب. التفاعل المستقل (Self-contained Interactions): تشمل طلبات REST كل المعلومات اللازمة لإجراء العملية المطلوبة، بما في ذلك أي بيانات إضافية أو تعليمات مطلوبة. التوجيه المحدود (Limited Coupling): يعتمد REST على فصل العميل والخادم بشكل مستقل، ولا يعتمد على المعرفة المسبقة للعميل بشأن تفاصيل الخادم، وبالعكس. أي من يمتلك مهارة REST API قادر على العمل في كلا الجانبين: جانب العميل وجانب الخادم. وفيما يلي توضيح للدورين:
    1- جانب العميل (Client-side)
    يطور تطبيق أو موقع ويب يتفاعل مع API الخادم. يستخدم طلبات HTTP المختلفة مثل GET وPOST للتواصل مع الخادم. يقوم ببناء واجهة المستخدم (UI) لعرض البيانات المستردة من الخادم باستخدام بيانات المستجيبة التي تم تلقيها عبر API. 2- جانب الخادم (Server-side)
    ينشئ API باستخدام تقنيات RESTful للسماح للعملاء بالتواصل مع البيانات والخدمات التي يقدمها الخادم. يعمل على تصميم وتطوير واجهات البرمجة API التي توفر الوصول إلى مجموعة محددة من البيانات أو العمليات. ينشئ نماذج البيانات ويحدد طرق الوصول إلى هذه البيانات بما يتوافق مع مبادئ REST. وفي العمل، يمكن للمبرمجين أن يكونوا متخصصين في جانب واحد من REST API، مثل مطوري الواجهة الأمامية (Front-end Developers) الذين يتعاملون بشكل رئيسي مع API الخادم على الطرف العميل، أو مطوري الخادم (Back-end Developers) الذين ينشئون ويديرون ال API نفسها على الطرف الخادم. 
    وإليك مثال لكود JavaScript يوضح كيفية تنفيذ REST API لمصادر المستخدمين باستخدام إطار عمل Express.js أي في الواجهة الخلفية:
    const express = require('express'); const app = express(); // بيانات المستخدمين المؤقتة let users = [ { id: 1, name: 'John' }, { id: 2, name: 'Jane' } ]; // استرداد جميع المستخدمين app.get('/users', (req, res) => { res.json(users); }); // إنشاء مستخدم جديد app.post('/users', (req, res) => { const newUser = { id: users.length + 1, name: req.body.name }; users.push(newUser); res.status(201).json(newUser); }); // تشغيل الخادم app.listen(3000, () => { console.log('Server started on port 3000'); }); أما التعامل مع REST API في الواجهة الأمامية فهو كالتالي:
    // استدعاء API لاسترداد جميع المستخدمين async function getUsers() { try { const response = await fetch('/users'); const data = await response.json(); // استخدام البيانات المستلمة console.log(data); // يتم طباعة المستخدمين في وحدة التحكم } catch (error) { console.error('Error:', error); } } // استدعاء API لإنشاء مستخدم جديد async function createUser() { const newUser = { name: 'Alice' }; try { const response = await fetch('/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(newUser) }); const data = await response.json(); // استخدام البيانات المستلمة console.log(data); // يتم طباعة المستخدم الجديد في وحدة التحكم } catch (error) { console.error('Error:', error); } } // استدعاء الدوال المحددة getUsers(); createUser(); وبالإضافة إلى REST، هناك عدة معماريات أخرى تستخدم في تطوير وتصميم واجهات برمجة التطبيقات، مثل:
    معمارية SOAP (Simple Object Access Protocol): تستخدم في تطوير واجهات برمجة التطبيقات المبنية على نمط XML وتتطلب بروتوكولات معقدة للتواصل. معمارية GraphQL: تسمح للعميل بتحديد البيانات المحددة التي يُرغب في استردادها، مما يزيد من كفاءة استرداد البيانات ويقلل من حمولة الشبكة. معمارية gRPC: تعتمد على نمط RPC (Remote Procedure Call) للتواصل بين العميل والخادم، وتستخدم تسلسل البيانات بتنسيق Protocol Buffers.  
  14. إجابة Mustafa Suleiman سؤال في تحويل السيشن الى كوكيز session to cookies php كانت الإجابة المقبولة   
    الكود بعد التعديل سيصبح كالتالي:
    <?php $passwords = array('123456', 'xxxx', '7777', '8888', '9999'); if (isset($_POST['password'])) { if (in_array($_POST['password'], $passwords)) { setcookie('loggedIn', true, time() + (30 * 24 * 60 * 60)); // تعيين الكوكيز header('Location: ' . $_SERVER['PHP_SELF']); // إعادة توجيه الصفحة بعد تعيين الكوكيز exit(); } else { die ('Incorrect password'); } } if (!isset($_COOKIE['loggedIn']) || !$_COOKIE['loggedIn']): ?> <html> <head> <title>Login</title> </head> <body> <p>You need to login</p> <form method="post"> Password: <input type="password" name="password"> <br /> <input type="submit" name="submit" value="Login"> </form> </body> </html> <?php exit(); endif; echo '<h1>Hello world... Logged in successfully.</h1>'; ?> وما تم هو تعيين قيمة الكوكيز "loggedIn" إلى true باستخدام الدالة setcookie() عند تسجيل الدخول بكلمة المرور الصحيحة، ثم تحديد صلاحية الكوكيز لمدة 30 يومًا باستخدام time() + (30 * 24 * 60 * 60)، حيث يتم ضرب 30 (عدد الأيام) في 24 (عدد الساعات في اليوم) في 60 (عدد الدقائق في الساعة) في 60 (عدد الثواني في الدقيقة) للحصول على الوقت المستقبلي الذي ينتهي فيه صلاحية الكوكيز.
    وفي حالة عدم وجود قيمة الكوكيز "loggedIn" أو إذا كانت قيمتها false، فسيعرض نموذج تسجيل الدخول، وعند تسجيل الدخول الصحيح، سيتم تعيين الكوكيز وإعادة توجيه الصفحة لعرض رسالة تأكيد تسجيل الدخول بنجاح.
    وعليك بتأمين الاتصال باستخدام SSL والتحقق من صحة البيانات المرسلة قبل تعيين الكوكيز.
  15. إجابة Mustafa Suleiman سؤال في ما هو ASCII وكيف يتم تمثيل الحروف والأرقام فيه؟ كانت الإجابة المقبولة   
    ASCII ببساطة هو اختصار لـ "American Standard Code for Information Interchange" ويشير إلى مجموعة محددة من الرموز المستخدمة لتمثيل الحروف والأرقام والرموز الأخرى في الحواسيب وأنظمة الاتصالات.
    تم تطوير ASCII في الأصل في عام 1963 كمعيار لتبادل البيانات بين أجهزة الكمبيوتر المختلفة والشبكات.
    وتتضمن مجموعة ASCII الأصلية 128 رمزًا، حيث يمثل  كل حرف بواحد من هذه الرموز، وتتضمن الرموز الأساسية الأبجدية اللاتينية الكبيرة والصغيرة، والأرقام من 0 إلى 9، ورموز ترقيم ورموز تحكم مثل المسافة والترقيم والعلامات القوسية والأقواس.
    ومع مرور الوقت، تطورت مجموعة ASCII لتشمل مجموعة أوسع من الرموز تسمح بتمثيل الأحرف والرموز الإضافية بما في ذلك الحروف غير اللاتينية والرموز الخاصة. يتكون ASCII الموسع من 8 بت، مما يعني وجود 256 رمزًا ممكنًا.
    وحاليًا تُستخدم ASCII بشكل واسع في البرمجة وعند نقل البيانات بين الأجهزة المختلفة، حيث يمكن تمثيل النصوص والرموز باستخدام تلك المجموعة المحددة من الأرقام والحروف.
    مثال للتوضيح:
    حرف "A" بالأحرف الكبيرة: يتم تمثيله بالرقم 65 في ASCII. حرف "a" بالأحرف الصغيرة: يتم تمثيله بالرقم 97 في ASCII. الرقم "5": يتم تمثيله بالرقم 53 في ASCII. الرمز "$": يتم تمثيله بالرقم 36 في ASCII. الرمز التحكم للمسافة الفارغة: يتم تمثيله بالرقم 32 في ASCII. والغرض هو توحيد تلك التمثيلات في جميع أنحاء الأنظمة التي تدعم ASCII لضمان التوافق وتبادل البيانات بسهولة.
    وتفقد النقاش التالي لمزيد من المعلومات:
  16. إجابة Mustafa Suleiman سؤال في 08. تسجيل الدخول والخروج كانت الإجابة المقبولة   
    أرجو منك طرح السؤال أسفل فيديو الدورة الخاص بالسؤال ليتم مساعدتك بشكل أفضل، وطرح الأسئلة العامة هنا.
  17. إجابة Mustafa Suleiman سؤال في هل يمكن معرفة mac address للزائر بلغة php كانت الإجابة المقبولة   
    لن تستطيع الحصول على عنوان MAC للزائر باستخدام لغة PHP، فعناوين MAC تكون مرتبطة بالأجهزة المادية مثل بطاقات الشبكة والراوترات، ولا يتم إرسالها عبر الإنترنت في طبقة التطبيق، وتُستخدم عناوين MAC في الشبكات المحلية فقط لتوجيه حركة البيانات بين الأجهزة المتصلة في الشبكة المحلية.
    وستجد على الإنترنت كود مثل التالي:
    <?php // PHP code to get the MAC address of Server $MAC = exec('getmac'); // Storing 'getmac' value in $MAC $MAC = strtok($MAC, ' '); // Updating $MAC value using strtok function, // strtok is used to split the string into tokens // split character of strtok is defined as a space // because getmac returns transport name after // MAC address echo "MAC address of Server is: $MAC"; ?> لكنه يستخدم للحصول على عنوان MAC للسيرفر الذي يقوم بتشغيل كود PHP، وليس للزائر، أو المستخدمين على نفس الشبكة المحلية لديك.
    وبإمكانك فقط الحصول على عنوان IP للزائر باستخدام PHP من خلال استخدام المتغير المدمج:
    $_SERVER['REMOTE_ADDR'] ويعيد هذا المتغير عنوان IP للزائر الحالي الذي يقوم بالوصول إلى صفحة الويب، ويجب أن تكون مدركًا أن عناوين IP متغيرة وغير دائمة بطبيعتها، ويمكن تغييرها أو تخطيها باستخدام بروكسي أو شبكات VPN، وبالتالي قد لا تكون دقيقة بنسبة 100% لتحديد هوية الزائر.
  18. إجابة Mustafa Suleiman سؤال في فوائد تعلم النظامين الثنائي والسداسي عشري وتمثيل ASCII للمبرمجين كانت الإجابة المقبولة   
    بعض الاستخدامات الشائعة للنظامين الثنائي والسداسي عشري، بالإضافة إلى ASCII هي كالتالي:
    1- بخصوص النظام الثنائي (Binary)
    يستخدم في تمثيل البيانات والمعلومات في الحواسيب والأجهزة الإلكترونية، ويعمل الحاسوب الحديث بنظام ثنائي حيث يستخدم الصفر والواحد لتمثيل البتات (Bits) التي تشكل البيانات والتعليمات. يستخدم في عمليات الحساب الثنائي والمنطق المعالجات المنطقية الرقمية والأبواب المنطقية والدوائر المنطقية، وهو مفيد في تصميم الدوائر الإلكترونية والشبكات الرقمية. 2- النظام السداسي عشري (Hexadecimal)
    يستخدم في تمثيل الأرقام والبيانات في الحواسيب وأنظمة التشغيل والبرمجة. يسهل استخدام الأرقام من 0 إلى 9 والأحرف من A إلى F لتمثيل القيم الثنائية بطريقة مدمجة وقصيرة.
    يسهل تمثيل عناوين الذاكرة والعناصر في الذاكرة الحاسوبية. على سبيل المثال، في برمجة الحواسيب، يمكن استخدام الأرقام السداسية عند التعامل مع العناوين الذاكرة أو تمثيل الألوان في الرسومات الحاسوبية.
    3- ASCII (American Standard Code for Information Interchange)
    يستخدم لتمثيل الأحرف والرموز المستخدمة في الكمبيوتر والاتصالات، ويعطي كل حرف رمزًا فريدًا في النظام الثنائي (مكون من 8 بت) يمكن تفسيره واستخدامه من قبل الحواسيب. يستخدم في برمجة الحواسيب لتمثيل النصوص والبيانات النصية، وتحويل الحروف والرموز إلى أكواد ASCII يسهل عملية تخزين ومعالجة النصوص في الحواسيب. هل هناك فائدة من تعلم ما سبق كمبرمج؟
    ستحتاج إلى تعلم ذلك إذا كنت تريد التخصص في مجال الـ Embedded system أي مجال برمجة الأجهزة المضمنة، وإليك بعض الفوائد:
    تعلم النظامين الثنائي والسداسي عشري يمكن أن يساعدك في فهم كيفية تمثيل البيانات والأرقام في الحواسيب، ويعتبر النظام الثنائي الأساسي في التعامل مع البيانات الرقمية، ومعرفة كيفية تمثيله قد يفيدك في فهم عمليات الحساب والتخزين والمعالجة داخل الحاسوب. ربما  تتعامل مع النظام الثنائي وتمثيل البيانات بشكل مباشر، وفهم النظام الثنائي يساعدك في فهم بنية البيانات وتنسيقها والتعامل معها بشكل صحيح. في حالة وجود مشكلات في البرامج أو الأنظمة، قد تحتاج احيانًأ إلى تحليل البيانات والتعامل معها على مستوى البتات أو الأرقام السداسية عشرية، وتعلم تلك النظم يمكن أن يمكنك من تحليل الأخطاء وتصحيحها بشكل أكثر فعالية. في مجال برمجة الأجهزة المضمنة، قد تحتاج إلى التعامل مع المعالجات والمكونات الإلكترونية المنخفضة المستوى، وفهم النظام الثنائي والسداسي عشري يمكن أن يسهل عليك تطوير وبرمجة هذه الأجهزة بشكل أفضل. قد تحتاج أحيانًا للتعامل مع بيانات أو أجهزة تستخدم تمثيل ثنائي أو سداسي عشري، مثل قراءة وكتابة بيانات في ملفات ثنائية أو التواصل مع الأجهزة الخارجية عبر منافذ التسلسلية (Serial ports) أو بروتوكولات الاتصال المبنية على النظام الثنائي.
  19. إجابة Mustafa Suleiman سؤال في حل مشكلة عدم طباعة قيمة x في الحلقة التكرارية كانت الإجابة المقبولة   
    بالشكل التالي:
    const mm = ['ahmed', 'mete', 'sahlab']; for (let i = mm.length - 1; i >= 0; i--) { console.log(i, mm[i]); } let x = mm.length - 1; while (x >= 0) { console.log('WHILE: ', x, mm[x]); x--; }  
  20. إجابة Mustafa Suleiman سؤال في ما هي المواقع العربية الأخرى للعمل الحر عبر الإنترنت بخلاف مستقل وخمسات؟ كانت الإجابة المقبولة   
    بخصوص المواقع العربية، لا يوجد سوى مستقل وخمسات وموقع بعيد، أما بقيةالمواقع العربية إن وجدت فهى غير إحترافية بكل صراحة وليست مصدر ثقة للعمل عليها وبذل وقت وجهد بها.
    وإذا كنتي واجهتي صعوبة في قبول عرضك على تلك المواقع، فعليك بالتوقف قليلاً والبحث في سبب المشكلة، هل طريقة كتابة عرضي غير إحترافية؟ هل معرض الأعمال الخاص بي غير جيد وغير متخصص ويوحي بأني شخص مبتدأ؟ هل طريقة عرض نفسي في ملفي الشخصي غير جيدة؟
    ولكي تتمكني من معرفة الإجابة على تلك الأسئلة، عليك بمعرفة الطريقة الصحيحة لفعل ذلك، وستجدي في مدونة مستقل مقالات رائعة بخصوص ذلك.
    دليلك الشامل إلى العمل الحر عبر الإنترنت نصائح للمستقلين  
  21. إجابة Mustafa Suleiman سؤال في ربط ملف جافاسكريبت في HTML وتشغيل السكريبت بشكل صحيح كانت الإجابة المقبولة   
    عليك أولاً بحفظ التغييرات، ثانيًا تأكد من أنك قمت بربط ملف index.js في ملف index.html بشكل صحيح وذلك عن طريق عنصر script كالتالي:
    <script defer src="index.js"></script> ويتم وضع ذلك الجزء داخل عنصر header أو في نهاية عنصر body لكن لا حاجة إلى ذلك حيث أنني قمت بوضع defer من أجل تحميل السكريبت بعد إنتهاء تحميل أكواد HTML وستجد شرح لذلك هنا:
    الآن داخل ملف السكريبت حاول تجنب كتابة اسم المتغير باسم name لكونه تابع لخاصية في الكائن Window وهي window.name ولكن تلك الخاصية أصبحت deprecated أي لم تصبح مدعومة بعد الآن وسيتم إزالتها بعد فترة، وستجد خط كما لو أنه شطب على اسم المتغير كما ترى في الكود لديك.
    ولطباعة اسم المتغير بعد تغييره سنقوم بكتابة السكريبت كالتالي:
    'use strict'; let personName; personName = 'mohamed'; console.log(personName); وسيتم طباعة الاسم في الكونسول.
    ولاحظ أنني قمت بكتابة 'use strict' أو الوضع الصارم  في البداية وأنصحك باستخدامها عند كتابة سكريبت عادي وليس module حيث يتم تفعيله بشكل إفتراضي في الـ modules وفائدتها كالتالي:
    في الوضع الصارم، يجب عليك تعريف المتغيرات قبل استخدامها، فإذا قمت بتعيين قيمة لمتغير غير معرف، سيتم إلقاء استثناء. ولا يمكنك استخدام مفاتيح الكلمات المحجوزة كمعرفات، مما يحميك من تعديل قيمة المفاتيح الداخلية للغة. يجبرك على اتباع بعض الممارسات الأفضل في البرمجة، مما يساعد في تجنب بعض الأخطاء الأمنية الشائعة. يتم منع الوصول إلى خصائص الكائنات غير المعرفة، مما يساعد في تجنب الأخطاء الناتجة عن التعامل مع كائنات لا تحتوي على الخصائص المطلوبة. في بعض الحالات، الوضع الصارم يساعد في تحسين أداء الكود، حيث يمكن للمترجم أن يقوم بتنفيذ بعض الأمور بشكل أسرع وأكثر فعالية. أيضًا ستتم معالجة بعض الأخطاء التي تكون صامتة في الوضع العادي Silent Errors، مثلاً ستحصل على أخطاء عند استخدام المتغيرات غير المعرفة بدلاً من إنشاء متغيرات عالمية ضمن نطاق Global. وهناك أمور أخرى لكن لا تشغل بالك بها حاليًا.
  22. إجابة Mustafa Suleiman سؤال في مقارنة بين بيئة العمل على الحاسوب الشخصي وGoogle Colab لتعلم الآلة وتحليل البيانات كانت الإجابة المقبولة   
    ببساطة إذا كانت مواصفات حاسوبك غير كافية بالنسبة للمشروع الذي تعمل عليه، فتستطيع استخدام Google Colab،  حيث  المستخدمين المجانيين على Google Colab يحصلون على وصول مجاني إلى وحدات المعالجة الرسومية (GPU) ووحدات المعالجة الرسومية المتخصصة (TPU) لمدة تصل إلى 12 ساعة.
    ويتم توفير GPU runtime في Colab مع المواصفات التالية: وحدة المعالجة المركزية Intel Xeon @2.20 جيجاهرتز، 13 جيجابايت من ذاكرة الوصول العشوائي (RAM)، وحدة Tesla K80 للتسريع، و 12 جيجابايت من ذاكرة الوصول العشوائي GDDR5 VRAM.
    أما TPU runtime في Colab، فهو يتألف من وحدة المعالجة المركزية Intel Xeon @2.30 جيجاهرتز، 13 جيجابايت من ذاكرة الوصول العشوائي (RAM)، وحدة TPU سحابية بقوة حوسبة تصل إلى 180 تيرافلوبس.
    باختصار، يعني ذلك أنه يمكنك الاستفادة من قدرات GPU و TPU القوية لتنفيذ العمليات الحسابية المكثفة والمتقدمة في مجال التعلم الآلي وتحليل البيانات.
    وتتوفر موارد الحاسوب هذه مجانًا لمدة تصل إلى 12 ساعة، والتي يمكن استخدامها لتشغيل النماذج وتدريبها وتحليل البيانات بشكل فعال.
    بعد انتهاء الـ 12 ساعة على Google Colab، يتم إلغاء جلسة العمل الحالية ويتعين عليك إعادة تشغيلها، ويعني ذلك أن أي عمل غير محفوظ سيتم فقده، بما في ذلك البيانات والنماذج والتعديلات التي تم إجراؤها خلال الجلسة.
    وتستطيع يمكنك حفظ النتائج والملفات الضرورية قبل انتهاء الجلسة الحالية، عن طريق حفظ البيانات في حساب Google Drive الخاص بك أو تنزيلها إلى جهاز الكمبيوتر الشخصي الخاص بك.
     أيضًا استخدام الوظيفة "Save a copy in Drive" في Google Colab لحفظ الدفتر الحالي في Google Drive قبل انتهاء الوقت المحدد.
    معالجات m مصممة بواسطة Apple ومبنية على تقنية ARM، تتميز بأداء مذهل وكفاءة عالية في استخدام الطاقة.
    فمع معالج M2،  ستستفيد من أداء محسّن وتسارع لعمليات التعلم الآلي، ويحتوي المعالج M2 على مجموعة متنوعة من وحدات المعالجة المركزية ووحدات المعالجة الرسومية المتكاملة، مما يسمح بتنفيذ عمليات التعلم العميق بسرعة وكفاءة. بالإضافة إلى ذلك، يشتمل على وحدة Neural Engine التي توفر قدرات تسريع متقدمة لعمليات التعلم الآلي.
    ومن المهم أيضًا أن تنظر إلى الذاكرة والتخزين في الجهاز، حيث توفر MacBook الجديدة غالبًا ذواكر وتخزين فائقة السرعة، مما يساعد على تسريع عمليات التعلم الآلي وتحليل البيانات.
    ولكن إذا كان لديك كرت شاشة قوي على نظام الويندوز فستحصل على أداء مشابه حيث أن العامل الأساسي هو كرت الشاشة، يأتي بعده المعالج ثم الرامات.
     
  23. إجابة Mustafa Suleiman سؤال في تخزين البيانات في متصفح الويب باستخدام JavaScript و localStorage كانت الإجابة المقبولة   
    عليك باستخدام localStorage لحفظ القيم المدخلة في حقول الإدخال، وذلك بتعديل السكريبت لديك بالشكل التالي:
    let submit = document.getElementById('submit'); let text = document.getElementById('text'); let password = document.getElementById('password'); // عرض البيانات المحفوظة عند تحميل الصفحة window.onload = function() { let savedText = localStorage.getItem('text'); if (savedText) { text.value = savedText; } let savedPassword = localStorage.getItem('password'); if (savedPassword) { password.value = savedPassword; } }; submit.onclick = function () { if (text.value === 'محمد عماد احمد' && password.value === '10203') { alert('نعم'); // حفظ القيم في localStorage localStorage.setItem('text', text.value); localStorage.setItem('password', password.value); } else { alert('لا'); } let screenWidth = screen.availWidth; if (screenWidth > 1000) { alert('فقط الهواتف المحمولة، من فضلك'); } else { alert('الهاتف المحمول المناسب'); } }; يستخدم localStorage.setItem(key, value) لحفظ القيم في ذاكرة التخزين المحلية للمتصفح.
    وعند تحميل الصفحة، يستخدم localStorage.getItem(key) لاسترداد القيم المحفوظة وتعيينها في حقول الإدخال، وستظل القيمة محفوظة حتى بعد تحديث الصفحة.
     
  24. إجابة Mustafa Suleiman سؤال في كيفية العمل على مواقع العمل الحر كمبرمج فلاتر وتحديد السعر المناسب للساعة والمشروع كانت الإجابة المقبولة   
    إذا كنت قد تعلمت فلاتر بالفعل وتريد العمل على موقع العمل الحر، فأمامك مساحة واسعة للإختيار من بينها، ومنها مواقع مثل مستقل وخمسات وبعيد، وعلى تلك الموقع يتم العمل بتكلفة ثابتة Fixed للمشروع قابلة للزيادة والتعديل في حالة وجود ميزات إضافية لم يتم الإتفاق عليها.
    أما عن نظام الساعة، فعليك بتفقد الأسعار لمبرمجي فلاتر من حيث سعر الساعة، ثم ضع احسب متوسط السعر وضع سعر ساعة منخفض قليلاً عن المتوسط في البداية وقدم جودة عمل جيدة أعلى من المطلوب ولكن لا تفرض على نفسك ذلك أي التزم بالمطلوب وقم بتقديم أكثر منه وهناك مبدأ دائمًا أحب الإلتزام به في العمل الحر، ألا وهوUnder Promise And Over Deliver بمعنى أن الجميع يسرد أشعار للعميل وسيفعل وسيفعل وذلك خطأ.
    بل التزم بما هو مطلوب منك أو أعلى قليلاً للمنافسة في البداية، ثم وفر أكثر مما هو ممطلوب وستجد أن العميل سعيد جدًا بذلك وأيضًا لم تفرض على نفسك أي شيء.
    وبخصوص كيفية حساب الساعة فإليك بعض النقاط التي ستساعدك:
    قم بتحديد ما هي نوعية العمل التي ستقدمها؟ هل تعمل على تطوير تطبيقات بسيطة أو معقدة؟ ما هو مستوى الخبرة المطلوبة؟ إجراء بحث عن أسعار الساعة المعتادة لمبرمجي فلاتر على منصات العمل الحر، وتستطيع الاطلاع على مشاريع مماثلة والتحقق من الأسعار المقدمة من قبل المطورين الآخرين. احتسب سنوات الخبرة التي تمتلكها كمبرمج فلاتر، فستتمكن من تحقيق سعر أعلى إذا كنت تمتلك خبرة واسعة ومشاريع ناجحة في معرض أعمالك. تحديد تكاليف العمل الخاصة بك، وتشمل هذه العناصر تكاليف المعدات والبرمجيات والوقت الذي ستستغرقه في إكمال المشروع. مع الوقت سيكون لديك فكرة تقريبية عن الوقت المستغرق لإكمال مشروع معين، فقم بتحديد عدد الساعات المتوقعة للعمل على المشروع. تحديد المبلغ الذي ترغب في كسبه من العمل الحر، فيمكن أن يكون المبلغ مبنيًا على احتساب قيمة ساعة العمل الأساسية وإضافة الربح المرغوب. ولكن عدد الساعات لا يعني أبدًا التكلفة الحقيقية للمشروع، فمثلاً بعد سنوات خبرة، ستستطيع إنهاء مشروع في وقت أقل وبجودة أعلى فهل ذلك يعني أنك تتقاضى مبلغ أقل، بالطبع لا، هنا عليك إما بحساب تكلفة ثابتة للمشروع أو وضع عدد ساعات مناسب ومرضي لك.
    وأنصحك بقراءة التالي:
     
  25. إجابة Mustafa Suleiman سؤال في أشهر البوتات في Discord ووظائفها المفيدة كانت الإجابة المقبولة   
    هناك كم هائل من الوظائف التي بإمكان تلك الروبوتات القيام بها ومنها:
     إنشاء وحذف وتحرير القنوات، وتعيين الأذونات اللازمة للأعضاء.  تتبع نشاط المستخدمين ومنحهم مستويات وأدوار مخصصة بناءً على تفاعلهم في الخادم.  تشغيل الموسيقى في قنوات الصوت من مصادر مثل YouTube أو Spotify، ويمكنها التحكم في مستوى الصوت وتشغيل قوائم التشغيل. إرسال إشعارات وتذكيرات للأعضاء في الخادم، مثل تذكير بالأحداث المهمة أو مواعيد الاجتماعات.  تقديم ألعاب تفاعلية للأعضاء، مثل ألعاب الكلمات المتقاطعة أو ألعاب الأدوار البسيطة. البحث عن معلومات عبر الإنترنت وتقديمها للأعضاء، مثل الأخبار أو توقعات الطقس أو معلومات عامة.  الترحيب بالأعضاء الجدد في الخادم وتوديع الأعضاء الذين يغادرون. مراقبة النشاط في الخادم والكشف عن المخالفات والسلوك غير الملائم، وتنفيذ تدابير الأمان المطلوبة مثل حظر الأعضاء المخالفين.  تنظيم مسابقات وألعاب تفاعلية للأعضاء، مثل ألعاب الألغاز أو ألعاب الأدوار المتقدمة.  توفير الدعم الفني والإجابة على الأسئلة الشائعة للأعضاء، وتقديم التوجيه والمساعدة في استخدام الخادم.  الاتصال بمنصات أخرى مثل Twitter أو Reddit وتقديم تحديثات مباشرة للأعضاء. توفير أوامر خاصة بتخصيص واجهة الخادم، مثل تغيير الألوان والخلفيات وإضافة الرموز التعبيرية المخصصة. بالنسبة لأشهر البوتات في Discord، فهناك العديد من البوتات المشهورة ومنها:
    Dyno: بوت متعدد الاستخدامات يوفر ميزات إدارة الخادم ونظام المستويات والموسيقى والأدوار. MEE6: يوفر نظام المستويات والأدوار والموسيقى والترحيب والإشعارات والمسابقات. Tatsumaki: يقدم نظام المستويات والأدوار والألعاب والإحصائيات والترحيب والتوديع. Dank Memer: للترفيه يقدم ألعاب الكلمات والميمات والنكات والصور المضحكة. Rythm: لتشغيل الموسيقى من مصادر مثل YouTube وSpotify وSoundCloud.
×
×
  • أضف...