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

Mustafa Suleiman

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

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

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

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

    296

أجوبة بواسطة Mustafa Suleiman

  1. إما أنك لم تقم بحفظ الكود ثم تحديث الصفحة لتظهر التحديثات، أو هناك مشكلة في الكود مثل عدم توافق أسماء الكلاسات مع هيكل HTML لديك.

    إليك كود متوافق مع التنسيقات التي لديك مع بعض التحسينات:

    Snag_4d2cb3d.thumb.png.4b5c23bd37db8de94ae591496b086a06.png

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Enhanced NavBar</title>
        <style>
            header .navbar nav {
                display: flex;
                justify-content: space-between;
                align-items: center;
                max-width: 1100px;
                margin: auto;
                padding: 10px;
                background-color: #f8f9fa;
                border-bottom: 1px solid #ddd;
            }
    
            header .navbar nav ul {
                display: flex;
                justify-content: center;
                align-items: center;
                list-style: none;
                padding: 0;
                margin: 0;
            }
    
            header .navbar nav ul li {
                margin: 0 15px;
            }
    
            header .navbar nav ul li a {
                text-decoration: none;
                color: #333;
                font-weight: bold;
            }
    
            header .navbar .logo {
                font-size: 1.5em;
                font-weight: bold;
                color: #333;
            }
    
            header .navbar .search-bar {
                display: flex;
                align-items: center;
            }
    
            header .navbar .search-bar input[type="text"] {
                padding: 5px;
                border: 1px solid #ccc;
                border-radius: 3px;
            }
    
            header .navbar .search-bar button {
                padding: 5px 10px;
                border: none;
                background-color: #007bff;
                color: white;
                border-radius: 3px;
                margin-left: 5px;
            }
        </style>
    </head>
    <body>
    
    <header>
        <div class="navbar">
            <nav>
                <div class="logo">MyLogo</div>
                <ul>
                    <li><a href="#">Home</a></li>
                    <li><a href="#">About</a></li>
                    <li><a href="#">Services</a></li>
                    <li><a href="#">Contact</a></li>
                </ul>
                <div class="search-bar">
                    <input type="text" placeholder="Search...">
                    <button type="button">Search</button>
                </div>
            </nav>
        </div>
    </header>
    
    </body>
    </html>

     

  2. ستحتاج إلى مكتبات بايثون المتخصصة في معالجة الصور ومطابقتها، وواحدة من المكتبات الشائعة والمناسبة للغرض هي مكتبة OpenCV  ومكتبة scikit-image.

    بعد تثبيت المكتبات:

    pip install opencv-python
    pip install scikit-image

    عليك كتابة سكريبت يقوم بتحميل الصور من مجموعة البيانات dataset، واستخدام تقنيات مثل استخراج الميزات (feature extraction) لمقارنة الصور.

    للتوضيح بمثال بسيط حول كيفية مقارنة الصور باستخدام OpenCV:

    import cv2
    import os
    import numpy as np
    from sklearn.metrics.pairwise import cosine_similarity
    
    def load_images_from_folder(folder):
        images = []
        for filename in os.listdir(folder):
            img = cv2.imread(os.path.join(folder, filename))
            if img is not None:
                images.append((filename, img))
        return images
    
    def extract_features(image):
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        sift = cv2.SIFT_create()
        keypoints, descriptors = sift.detectAndCompute(gray, None)
        return descriptors
    
    def find_similar_images(image_path, dataset_folder, top_n=5):
        input_image = cv2.imread(image_path)
        input_features = extract_features(input_image)
    
        dataset_images = load_images_from_folder(dataset_folder)
        similarities = []
    
        for filename, dataset_image in dataset_images:
            dataset_features = extract_features(dataset_image)
            if dataset_features is not None and input_features is not None:
                similarity = cosine_similarity(input_features, dataset_features)
                similarities.append((filename, np.mean(similarity)))
    
        similarities.sort(key=lambda x: x[1], reverse=True)
        return similarities[:top_n]
    
    if __name__ == "__main__":
        dataset_folder = 'path/to/dataset'
        input_image_path = 'path/to/input/image.jpg'
        
        similar_images = find_similar_images(input_image_path, dataset_folder)
        print("Similar Images:")
        for filename, similarity in similar_images:
            print(f"Filename: {filename}, Similarity: {similarity}")

    بعد ذلك تأتي خطوة دمج بايثون مع PHP، مثلاً من خلال استخدام shell_exec لتنفيذ سكريبت بايثون وإرجاع النتائج أو من خلال API بايثون أو subprocess في PHP اختر ما تريد، وللتوضيح ساستخدم shell_exec  كالتالي:

    <?php
    $input_image_path = 'path/to/input/image.jpg';
    $output = shell_exec("python3 path/to/your/script.py $input_image_path");
    echo "<pre>$output</pre>";
    ?>

    بعد أن تحصل على قائمة الصور المشابهة من سكريبت بايثون، تستطيع عرض الصور باستخدام PHP، كالتالي:

    <?php
    $similar_images = json_decode($output, true);
    
    echo "<h1>Similar Images:</h1>";
    foreach ($similar_images as $image) {
        echo "<div>";
        echo "<img src='path/to/dataset/{$image['filename']}' alt='{$image['filename']}'>";
        echo "<p>Similarity: {$image['similarity']}</p>";
        echo "</div>";
    }
    ?>

     

  3. للتحقق من المستخدم، هناك عدة استراتيجيات، منها JWT عبارة عن معيار مفتوح يستخدم لنقل البيانات بين الأطراف ككائن JSON مضغوط وآمن، بحيث تستخدم JWT لتأمين API ةيحصل المستخدم على رمز JWT بعد تسجيل الدخول، ويجب عليه إرسال هذا الرمز مع كل طلب لاحق.

    بعد ذلك يوجد الكوكيز هي ملفات صغيرة تُخزن على جهاز المستخدم وتُستخدم لتخزين معلومات الجلسة، وعند تسجيل الدخول، يمكن تخزين معرف الجلسة في الكوكيز، ويتم إرسال الكوكيز مع كل طلب إلى الخادم للتحقق من الجلسة.

    ويتوفر UUID هو معرف فريد يمكن استخدامه لتعريف المستخدمين بشكل آمن وفريد، وتُخزن UUID في قاعدة البيانات ويُستخدم لتعريف المستخدمين في التطبيقات.

    أما CSRF هو نوع من الهجمات التي تُجبر المستخدم على تنفيذ إجراءات غير مرغوب فيها على موقع ويب آخر يتمتع فيه المستخدم بالتصديق، والإعتماد على CSRF tokens هو آلية شائعة لمنع تلك الهجمات.

    وDevise هو حل كامل لمصادقة المستخدمين في تطبيقات Rails، بحيث يوفر Devise العديد من الميزات الجاهزة مثل التسجيل، تسجيل الدخول، استعادة كلمة المرور، تأكيد الحساب، وغيرها، تستطيع تثبيته كالتالي:

    إضافته إلى ملف gem:

    gem 'devise'

    ثم تثبيت Devise:

    rails generate devise:install

    بعد التثبيت، ستحتاج إلى اتباع التعليمات التي تظهر على الشاشة لتكوين Devise وإعداد البريد الإلكتروني لإرسال روابط تأكيد الحساب واستعادة كلمة المرور.

    وفي حال تقوم بإنشاء تطبيق جديد، فتستطيع إنشاء نموذج المستخدم باستخدام Devise:

    rails generate devise User

    ثم ترحيل قاعدة البيانات:

    rails db:migrate

     

    بعد ذلك إضافة مصادقة إلى عناصر التحكم من خلال before_action لحماية مساراتك:

    class ApplicationController < ActionController::Base
      before_action :authenticate_user!
    end

    و Rails يوفر حماية مدمجة ضد هجمات CSRF، لأنه يتم تضمين CSRF tokens تلقائيًا في النماذج والطلبات AJAX.

    ولو تحتاج استخدام JWT مع Devise، فهناك gem مثل devise-jwt ستوفر لك JWT مع Devise.

  4. في بدايات تعلمك، لا أنصحك بنسخ الكود لتوفير الوقت والمجهود، بل ما أنتِ بحاجة إليه هو العكس، فكتابة الكود بيديكِ هو تمرين مطلوب للتعود على الطريقة الصحيحة ومعرفة الفرق بين كتابة بعض الأمور والتي لن تلاحظيها في حال قمتي بنسخ الكود.

    الأمر أشبه بتعلم الكتابة لكن نتعلم البرمجة في تلك الحالة.

  5. بتاريخ 16 دقائق مضت قال Mohammad Jamal3:

    افهمت عليك بس اسؤال ليش قبل يومين كان يتعامل مع name على انها اسم var بدون مشاكل وهسى صار لازم اختار اسم ثاني 

      ربما استخدمت let أو const في تعريف اسم المتغير، فلهما نطاق كتلة block scope أي أنهما يكونان مرئيين فقط داخل الكتلة التي تم تعريفهما فيها.

    بينما تعريف متغير باستخدام var خارج أي كتلة كود { } يتم اعتباره متغيرًا عالميًا global، بمعنى يمكن الوصول إليه من أي مكان في الكود (سواء داخل دوال أو خارجها) ويصبح جزءًا من كائن window في المتصفحات window.name

    والمشكلة أنه يوجد خاصية باسم name في الكائن العالمي window ولم يعد يتم دعمها في المتصفحات حاليًا.

    على العكس بتعريف متغير باستخدام const أو let في النطاق العالمي، فإنه لا يصبح جزءًا من كائن window، ويتم تعريفه في نطاق الكتلة block scope الخاص بالوحدة النمطية module scope أو النص البرمجي script scope.

    • شكرًا 1
  6. تفهمت ما تقصد، المشكلة في استخدامك لاسم المتغير name حيث يتم الخلط بينه وبين خاصية name في الكائن العالمي window ما يسبب طباعة التكرار على الأسماء في المصفوفة بالشكل التالي :

    Y
    a
    r
    o
    b
    ,
    K
    h
    a
    l
    e
    d
    ,
    O
    m
    e
    r

    لذا لو قمت بتغيير اسم المتغير إلى names مثلاً سيتم حل المشكلة ويتم طباعة yes أو قم باستخدام const بدلاً من var 

    <body>
        <div style="text-align: center;">
            <input class="input-btn" type="text">
            <button class="submit-btn">submit</button>
            <h3 class="result-one"></h3>
            <h3 class="result-two"></h3>
        </div>
    
    
    </body>
    
        <script>
            var names = ["Yarob", "Khaled", "Omer"]
            document.getElementsByClassName("result-one")[0].innerHTML = names
            document.getElementsByClassName("submit-btn")[0].addEventListener("click", function(){
                var school = document.getElementsByClassName("input-btn")[0].value
                for(var student of names){
                  console.log(student)
                    if(student === school){
                        document.getElementsByClassName("result-two")[0].innerHTML = `${school} yas`
                       break
                    }
                    document.getElementsByClassName("result-two")[0].innerHTML = `${school} no`
                }
            })
        </script>

     

  7. بتاريخ 8 دقائق مضت قال Mohammad Jamal3:

    صديقي على الفاضي هي فيديو توضيحي واذا انتبهت لما اغير اسم var من name لاي اسم ثاني وما اغير document الخاص في بضل محتوى var ظاهر على المتصف حتى لو عملت ctrl+s لل vs code وعملت ctrl +r للمتصفح

    الكود الذي ارفقته لك يعمل بشكل سليم، لم ألحظ في الصورة الأولى لديك أنك كتبت كود جافاسكريبت خارج وسم body فعليك كتابة جافاسكريبت في عنصر script ونضعه في body أو head

  8. الكود يعمل بدون مشكلة ما الخطأ الذي يظهر لك ؟ غالبًا أنت نسيت حفظ الكود عليك الضغط على CTRL + S ثم إعادة تحديث الصفحة في المتصفح.

    <body>
        <div style="text-align: center;">
            <input class="input-btn" type="text">
            <button class="submit-btn">submit</button>
            <h3 class="result-one"></h3>
            <h3 class="result-two"></h3>
        </div>
    
        <script>
            var name = ["Yarob", "Khaled", "Omer"]
            document.getElementsByClassName("result-one")[0].innerHTML = name
            document.getElementsByClassName("submit-btn")[0].addEventListener("click", function(){
                var school = document.getElementsByClassName("input-btn")[0].value
                for(var student of name){
                    if(student == school){
                        document.getElementsByClassName("result-two")[0].innerHTML = `${school} yas`
                        break
                    }
                    document.getElementsByClassName("result-two")[0].innerHTML = `${school} no`
                }
            })
        </script>
    </body>
  9. يجب وجود collection في قاعدة البيانات لحفظ رقم الهاتف وكود التأكيد وحالة التأكيد أي الحقول كالتالي:

    • phone لتخزين رقم هاتف المستخدم ويجب أن يكون الحقل فريدًا لكل مستخدم.
    • verificationCode لتخزين رمز التحقق الذي يتم إرساله إلى المستخدم عبر SMS.
    • verified لتحديد هل رقم الهاتف قد تم التحقق منه أم لا، وتستطيع جعل الحقل عبارة عن قيمة منطقية (true أو false).

    ثم ستحتاج إلى منطق خاص لتنفيذ ذلك، من خلال إنشاء api وليكن /send-code لإرسال كود التحقق لرقم الهاتف ولديك خدمات مثل Twilio و auth0 و Firebase لفعل ذلك.

    بالطبع ستقوم بحفظ الـ OTP أو الكود في قاعدة البيانات لكي تتمكن من التحقق منه، وهناك طرق مختلفة لتوليده أحدها توليده باستخدام دالة random كالتالي:

        const verificationCode = Math.floor(100000 + Math.random() * 900000).toString();

    للتوضيح إليك مثال باستخدام Twilio:

    app.post('/send-code', async (req, res) => {
        const { phone } = req.body;
    
        const verificationCode = Math.floor(100000 + Math.random() * 900000).toString();
    
        let user = await User.findOne({ phone });
        if (!user) {
            user = new User({ phone, verificationCode, verified: false });
        } else {
            user.verificationCode = verificationCode;
        }
        await user.save();
    
        client.messages.create({
            body: `Your verification code is ${verificationCode}`,
            to: phone,
            from: 'رقمك على Twilio ',
        }).then((message) => {
            console.log(message.sid);
            res.send('Verification code sent.');
        }).catch((error) => {
            console.error(error);
            res.status(500).send('Failed to send verification code.');
        });
    });

    بعد إرسال الكود لرقم الهاتف سيقوم هو بإدخاله عليك إذن إنشاء api آخر باسم /verify-code لاستقبال الطلب ومعالجته والتأكد من صحة الرقم.

    
    app.post('/verify-code', async (req, res) => {
        const { phone, code } = req.body;
    
        const user = await User.findOne({ phone, verificationCode: code });
        if (!user) {
            return res.status(400).send('Invalid verification code.');
        }
    
        user.verified = true;
        await user.save();
    
        res.send('Phone number verified successfully.');
    });

     

    • شكرًا 1
  10. المشكلة في ميثود __str__  حيث لم تقم باستخدام دالة join لربط النص بشكل صحيح ولا تحدث القيمة board_str بشكل صحيح.

    أولاً عليك تحويل الصف إلى سلسلة نصية مع وضع مسافة بين الأرقام، واستبدال الأصفار بالنجوم، ثم إضافة السلسلة النصية للصف إلى السلسلة النهائية مع إضافة سطر جديد n\

    كالتالي:

    def __str__(self):
        board_str = ''
        for row in self.board:
            row_str = [str(i) if i else '*' for i in row]
            board_str += ' '.join(row_str) + '\n'
        return board_str

     

    • أعجبني 1
  11. تلك قائمة من القواميس (dictionaries)، لا تستطيع الوصول إلى عنصر بشكله مباشرة باستخدام مفتاح كما فعلت، بل تحتاج إلى تحديد العنصر في القائمة أولاً ثم الوصول إلى القيمة باستخدام المفتاح المناسب.

    arr = [
        {'4': 'bog'},
        {'2': 'took'},
        {'3': 'his'},
        {'-2': 'Vatsan'},
        {'5': 'for'},
        {'6': 'a'},
        {'12': 'spin'}
    ]
    
    for dictionary in arr:
        if '2' in dictionary:
            print(dictionary['2'])
            break

    لاحظ  البحث عن القاموس الذي يحتوي على المفتاح '2' ثم طبع القيمة المرتبطة به، وفي حال أنك متأكد أن المفتاح موجود في القاموس الثاني، فنصل إليه مباشرة هكذا:

    print(arr[1]['2'])

     

    • أعجبني 1
  12. أولاً ستحتاج إلى شراء رخصة للمحتوى غير ذلك يعتبر أمر غير قانوني.

    وستحتاج إلى مناقشة التكلفة مع مبرمج لديه معرض أعمال جيد وتجنب من لديه معرض أعمال ضعيف، عامًة لو احتسبنا الأمر على سعر ساعة 10 دولار، والتطبيق يحتاج تطويره كتقدير مبدئي لمدة 3-6 أشهر، أي 600 ساعة في 10 يصبح السعر 6000 دولار.

    لكن عامًة تستطيع الحصول على سعر جيد في حال قمت بعرض مشروعك على موقع العمل الحر مثل مستقل، وستستقبل العروض ويمكنك الإختيار من بينها بناءًا على السعر وجودة معرض الأعمال، مثل تكلفة 1500 إلى 3000 دولار.

  13. بتاريخ 15 ساعة قال Justice Academy:

    أرغب في كود خصم لدورة الذكاء الاصطناعي

    حاليًا لا تتوفر عروض، لكن أحيانًا يوجد كوبونات خصم متوفرة أرجو التحدث لمركز المساعدة والسؤال عن ما إن كانت متوفرة أم لا.

    وعامًة من وقت لآخر يوجد عروض مثل اشتري دورتين بسعر دورة واحدة.

    ويتم توفير عروض في المناسبات مثل رمضان وأحيانًا في فترة الإجازات الصيفية وأحيانًا في فترة التخفيضات السنوية الخاصة بالجمعة البيضاء، وفي بعض الأحيان يتم توفير كوبونات.

  14. بتاريخ 12 ساعة قال عمر نعيم العبد الرحمن العبد الرحمن:

    انا طالب حاسوب في الثانوية واريد ان اتعلم البرمجة 

    لديك الوقت الكافي إذن، تعلم الأساسيات أولاً ابحث عن دورة علوم الحاسوب ويوجد بالأكاديمية هنا دورة مخصصة لذلك، بعد ذلك تعلم لغة برمجة قوية مثل C++ أو جافا أو C#.

    وإن كانت تلك اللغات صعبة تستطيع تعلم بايثون، لكن لا تبدأ بلغة جافاسكريبت.

    بعد ذلك عليك تحديد ما المجال البرمجي الذي تريد التخصص به، وتعلم المهارات المطلوبة به، وستجد تفصيل هنا:

     

  15. بتاريخ 1 دقيقة مضت قال Ahmed Malek:

    شكرا لك تم حل المشكلة ولكنى عندى سؤال اخر لو تكرمت

    ظهرت مشكلة اخرى عن اضافة عنوان جديد والضغط هنا يحولنى لصفحة بيضاء

    وهنا الخطأ فى inspect انا لا افهمة صرحة 

    لا يتم إعادة مصفوفة في خاصية data، قم بطباعة data وتفقد ما الذي يتم إعادته، فأنت حاليًا تحاول استخدام ميثود map على مصفوفة لكن data ليست مصفوفة، لذا map غير متاحة.

  16. تلك أمور بنكية، لذا أنت بحاجة إلى إختيار بنك به شروط تناسبك في بلدك، ثم التوجه لأقرب فرع منه إليك، ثم التحدث إلى خدمة العملاء في الفرع وسيتم فتح حساب وإنشاء بطاقة إئتمانية إن كانت الشروط متوافقة معك.

    وتستطيع التحدث إلى خدمة العملاء عبر الهاتف لمعرفة الشروط المطلوبة أو تصفح موقع البنك عبر الإنترنت.

  17. بتاريخ الآن قال Ail Ahmed:

    تمام بس هنا علي colab الملفات امتدادها ipynb فا برد الفرق بينها وبين امتداد py

    .py هي ملفات بايثون تحتوي على أكواد بايثون فقط، بينما .ipynb هي ملفات Jupyter Notebook وبداخلها ستجد أنه يوجد نتائج التنفيذ للكود والرسومات البيانية وإعدادات الملف.

    • أعجبني 1
×
×
  • أضف...