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

Mustafa Suleiman

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

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

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

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

    296

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

  1. لا داعي لذكر مدة زمنية محددة وإلزام نفسك بها، بل اطرح ما تستطيع فعله وذكر المهارات التي تمتلكها وما الفائدة التي ستعود على العميل من تلك المهارات فهو لا يدري ما معنى Full-Stack.

    ويجب أن تظهر بمظهر إحترافي ومنظم وعدم الإنجراف وراء ما يطرحه الآخرين.

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

    يمكنك ذكر مثلاً أن تطبيق بسيط مكون من 5 صفحات يستغرق مدة زمنية تساوي كذا

    • أعجبني 1
  2. قم بتثبيت مديز الحزم snap من خلال تنفيذ الأوامر التالية بالترتيب:

    sudo mv /etc/apt/preferences.d/nosnap.pref ~/Documents/nosnap.backup
    
    sudo apt update
    
    sudo apt install snapd

    ثم قم بتسجيل الخروج من حسابك وتسجيل الدخول مجددًا في النظام أو أعد تشغيل النظام.

    ثم تثبيت البرنامج من خلال:

    sudo snap install gabutdm

     

  3. لا يوجد بديل مماثل تمامًا، لكن لتحميل الفيديوهات من اليوتيوب يوجد أداة stacher توجه إلى موقع stacher.io لتحميلها.

    أما بالنسبة لبرامج تحميل ملفات مشابهة لبرنامج IDM، فيوجد:

     

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

    https://www.instagram.com/hacked/

    ثم اختاري my account was hacked ثم اضغطي على next، بعد ذلك عليك إدخال اسم المستخدم أو رقم الهاتف أو البريد للبحث عن حسابك ثم اضغطي على next.

    وسيتم سؤالك عن رفع صور للتعرف عليك وإثبات أنك صاحبة الحساب عليك الضغط على yes i have photos ثم سيطلب منك بريد إلكتروني أدخليه للتواصل معك وإرسال رابط إليه.

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

    والآن انتظري يوم إلى يومين وسيتم إرسال بريد على الإيميل الذي أدخلتيه به رابط لاسترجاع الحساب.

  5. أولاً لديك خطأ في حساب متوسط التقييمات في السطر الذي يحسب فيه المتوسط النهائي finalRate.

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

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

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

    إليك التعديلات مع تعليقات لتوضيح أماكن التعديل.

    تعديل في bookController.js:

    const addReview = asyncHandler(async(req, res) => {
        const { id } = req.params
        const { comment, rate } = req.body
        const book = await Book.findById(id)
        const user = await User.findById(req.userId)
    
        // التحقق من وجود الكتاب
        if (!book) {
            return res.status(404).json({ message: "Book Not Found" })
        }
    
        // التحقق من أن المستخدم لم يقيم الكتاب مسبقاً
        const isRated = book.reviews.findIndex(m => m.user == req.userId)
        if (isRated > -1){
            return res.status(403).send({ message: "Review Is Already Added" });
        }
    
        // تحويل تقييم المستخدم إلى رقم صحيح والتحقق من صحته
        const numericRate = parseInt(rate, 10);
        if (isNaN(numericRate) || numericRate < 1 || numericRate > 5) {
            return res.status(400).send({ message: "Invalid rating value" });
        }
    
        // حساب التقييم النهائي
        const totalRate = book.reviews.reduce((sum, review) => sum + review.rate ,0)  
        const finalRate = (totalRate + numericRate) / (book.reviews.length + 1)
    
        // تحديث بيانات الكتاب بإضافة المراجعة الجديدة وتحديث التقييم
        await Book.updateOne(
            { _id: id },
            {
                $push: {
                    reviews: {
                        user: req.userId,
                        username: user.name,
                        comment,
                        rate: numericRate
                    }
                },
                $set: {
                    rate: finalRate
                }
            }
        )
    
        // إعادة بيانات الكتاب المحدثة بعد الإضافة
        const updatedBook = await Book.findById(id);
        res.status(201).json(updatedBook)
    })

    تحديث الدالة postReview في apiCall:

    export function postReview(bookId, review) {
      return async (dispatch, getState) => {
        try {
          dispatch(bookActions.setLoading())
          const {data} = await axios.post(`${BOOK_URL}/${bookId}/reviews`, review, {
            headers: {
              "authorization": getState().auth.user.accessToken
            }
          });
          // عرض رسالة نجاح باستخدام toast
          toast.success(data?.message)
          // تحديث بيانات الكتاب المحدثة في الحالة
          dispatch(bookActions.updateBook(data));
          dispatch(bookActions.clearLoading());
        } catch (error) {
          // عرض رسالة خطأ باستخدام toast
          toast.error(error?.response?.data.message);
          dispatch(bookActions.clearLoading());
        }
      };
    }

    تعديل في الواجهة الأمامية Modal.js

    const Modal = ({ showModal, handleClose, book }) => {
        const [rate, setRating] = useState(0);
        const [comment, setComment] = useState("");
    
        const dispatch = useDispatch();
        const navigate = useNavigate();
      
        const submitReview = (e) => {
          e.preventDefault();
          if (comment === "") {
            // التحقق من وجود تعليق وعرض رسالة خطأ في حال عدم وجوده
            return toast.error("Comment is required")
          }
          // تحويل تقييم المستخدم إلى رقم صحيح والتحقق من صحته
          const numericRate = parseInt(rate, 10);
          if (isNaN(numericRate) || numericRate < 1 || numericRate > 5) {
            return toast.error("Invalid rating value");
          }
          // إرسال المراجعة باستخدام الدالة postReview
          dispatch(postReview(book._id, { rate: numericRate, comment }))
        };
      
        return (
          <div className={`modal ${showModal ? "show" : ""}`}>
            <div className="modal-content">
              <span className="close" onClick={handleClose}>&times;</span>
              <h2>Submit Your Review</h2>
              <form onSubmit={submitReview}>
                <div className="rating-input">
                  <label>Rating:</label>
                  <select value={rate} onChange={(e) => setRating(e.target.value)} required>
                    <option value="" disabled>Select a rating</option>
                    <option value="1">1</option>
                    <option value="2">2</option>
                    <option value="3">3</option>
                    <option value="4">4</option>
                    <option value="5">5</option>
                  </select>
                </div>
                <div className="comment">
                  <label>Comment:</label>
                  <textarea value={comment} onChange={(e) => setComment(e.target.value)} required />
                </div>
                <button className='modal-btn' type="submit">Submit</button>
              </form>
            </div>
          </div>
        );
    };
    
    export default Modal;

    تحديث bookSlice لتضمين الدالة updateBook:

    const bookSlice = createSlice({
        name: "book",
        initialState: {
            books: [],
            error: false,
            loading: false,
        },
        reducers: {
            getBooks(state, action) {
                state.books = action.payload;
            },
            findBook(state, action) {
                state.books = action.payload;
            },
            addReviews(state, action) {
                state.books = action.payload;
            },
            updateBook(state, action) {
                // البحث عن الكتاب المحدث وتحديثه
                const updatedBook = action.payload;
                const index = state.books.findIndex(book => book._id === updatedBook._id);
                if (index !== -1) {
                    state.books[index] = updatedBook;
                }
            },
            setLoading(state) {
                state.loading = true;
            },
            clearLoading(state) {
                state.loading = false;
            },
            setError(state) {
                state.error = true;
            },
            clearError(state) {
                state.error = false;
            },
        }
    });
    
    export const bookActions = bookSlice.actions;
    export default bookSlice.reducer;

     

    • أعجبني 1
  6. في البداية بدون دراية برمجية لن تتمكن من التعديل والتطوير، يجب الإلمام بلغة PHP لفعل ذلك بجانب لغات الويب HTML, CSS, JS.

    أولاً، عليك تثبيت Smarty:

    composer require smarty/smarty

    ثم قم بتهيئة Smarty في ملف PHP الرئيسي، ولنفترض أن ملفك الرئيسي هو index.php.

    <?php
    require_once 'vendor/autoload.php';
    
    $smarty = new Smarty();
    
    $smarty->setTemplateDir(__DIR__ . '/template');
    $smarty->setCompileDir(__DIR__ . '/template_c');
    $smarty->setCacheDir(__DIR__ . '/cache');
    $smarty->setConfigDir(__DIR__ . '/configs');

    ثم لنقم بكتابة كود PHP لقراءة القوالب المتاحة في مجلد القوالب.

    <?php
    // تابع للخطوة 2
    $templateDir = __DIR__ . '/template';
    $templateFolders = array_filter(glob($templateDir . '/*'), 'is_dir');
    
    $templates = [];
    foreach ($templateFolders as $folder) {
        $templateName = basename($folder);
        $templates[] = $templateName;
    }
    
    $smarty->assign('templates', $templates);
    $smarty->display('admin.tpl');

    بعد ذلك إنشاء ملف قالب Smarty يسمى admin.tpl لعرض القوالب في جدول.

    <!-- admin.tpl -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Admin Panel - Templates</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
    </head>
    <body>
    <div class="container">
        <h1>Available Templates</h1>
        <table class="table table-bordered">
            <thead>
            <tr>
                <th>Template Name</th>
                <th>Action</th>
            </tr>
            </thead>
            <tbody>
            {foreach from=$templates item=template}
            <tr>
                <td>{$template}</td>
                <td>
                    <form method="post" action="install_template.php">
                        <input type="hidden" name="template_name" value="{$template}">
                        <button type="submit" class="btn btn-primary">Install Template</button>
                    </form>
                </td>
            </tr>
            {/foreach}
            </tbody>
        </table>
    </div>
    </body>
    </html>

    ثم إنشاء ملف PHP يسمى install_template.php لتنفيذ عملية تركيب القالب.

    <?php
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $templateName = $_POST['template_name'];
    
        // نفذ عملية تركيب القالب هنا
        // تستطيع نسخ الملفات إلى مجلد آخر أو تحديث إعدادات قاعدة البيانات
    
        echo "Template '{$templateName}' has been installed!";
    } else {
        echo "Invalid request.";
    }

    بذلك ستتمكن من عرض القوالب المتاحة في مجلد template على شكل جدول في صفحة لوحة التحكم، مع زر لتركيب كل قالب، وعند النقر على زر "تركيب القالب"، سيتم إرسال طلب POST إلى install_template.php لتنفيذ عملية التركيب، تستطيع تعديل عملية التركيب حسب متطلباتك.

  7. في البداية ستحتاج بالطبع إلى إنشاء حساب مطور على Google Cloud Vision API أو 

    Amazon Rekognition.

    ثم ضبط إعدادات متغيرات البيئة في المشروع في ملف .env وأهما مفاتيح الـ API، عليك إضافة إعدادات Google Cloud Vision API أو Amazon Rekognition فقط، وإليك كلاهما:

    GOOGLE_CLOUD_VISION_API_KEY=google_api_key
    AWS_ACCESS_KEY_ID=aws_access_key
    AWS_SECRET_ACCESS_KEY=aws_secret_key
    AWS_REGION=aws_region

    ثم أنشئ نموذج وقاعدة بيانات لتخزين بيانات الصور:

    php artisan make:model Image -m

    في ملف التهجير:

    Schema::create('images', function (Blueprint $table) {
        $table->id();
        $table->string('image_path');
        $table->json('features'); // لتخزين بيانات الميزات (features)
        $table->timestamps();
    });

    أيضًا اعتمد على مكتبة مثل intervention/image لمعالجة الصور وضغط حجمها قبل إرسالها.

    ثم استخدام مكتبة google/cloud-vision أو aws/aws-sdk-php للتواصل مع المنصة.

    وإليك مثال لكلاهما اختر ما تريد:

    // ImageController.php
    use Illuminate\Http\Request;
    use Intervention\Image\Facades\Image;
    use Google\Cloud\Vision\V1\ImageAnnotatorClient; // or Aws\Rekognition\RekognitionClient;
    
    public function uploadImage(Request $request)
    {
        $image = $request->file('image');
        // Process and resize the image
        $image->resize(300, 300);
        // Analyze the image using Google Cloud Vision API or Amazon Rekognition
        $visionClient = new ImageAnnotatorClient(); // or $rekognitionClient = new RekognitionClient();
        $response = $visionClient->annotateImage(file_get_contents($image->getPathname()), ['LABEL_DETECTION']); // or $rekognitionClient->detectLabels(['Image' => ['Bytes' => file_get_contents($image->getPathname())]]);
        $features = $response->getLabelAnnotations(); // or $response->getLabels();
        // Store the features in the database
        $imageFeatures = new ImageFeatures();
        $imageFeatures->features = json_encode($features);
        $imageFeatures->save();
        return response()->json(['message' => 'Image uploaded and analyzed successfully']);
    }

    بعد ذلك اعتمد على مكتبة doctrine/dbal للتفاعل مع قاعدة البيانات، حيث تتوفر cosine similarity أو Euclidean distance لقياس التشابه بين ميزات الصور.

    use App\ImageFeatures;
    use Illuminate\Http\Request;
    
    public function searchByImage(Request $request)
    {
        $searchImage = $request->file('image');
        $searchFeatures = $this->analyzeImage($searchImage);
        
        // Query the database to find similar images
        $similarImages = ImageFeatures::all()->filter(function ($imageFeature) use ($searchFeatures) {
            $storedFeatures = json_decode($imageFeature->features, true);
            return $this->cosineSimilarity($searchFeatures, $storedFeatures) > 0.5;
        });
    
        return response()->json(['similar_images' => $similarImages]);
    }
    
    private function analyzeImage($image)
    {
        // هنا يجب أن تضع الكود الخاص بتحليل الصورة والحصول على الميزات
        // سأضع مثال بسيط لتحليل الصورة
        return [/* array of features */];
    }
    
    private function cosineSimilarity($features1, $features2)
    {
        $dotProduct = 0;
        $magnitude1 = 0;
        $magnitude2 = 0;
        foreach ($features1 as $index => $feature1) {
            $dotProduct += $feature1 * $features2[$index];
            $magnitude1 += $feature1 * $feature1;
            $magnitude2 += $features2[$index] * $features2[$index];
        }
        $magnitude1 = sqrt($magnitude1);
        $magnitude2 = sqrt($magnitude2);
    
        if ($magnitude1 * $magnitude2 == 0) {
            return 0;
        }
    
        return $dotProduct / ($magnitude1 * $magnitude2);
    }

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

  8. بتاريخ On 6‏/6‏/2024 at 15:37 قال Sara Mohammed9:

    كيف ممكن اصدرة export as library من اي مكان؟

    افتحي مشروع Unity الذي تريدين تصديره كمكتبة، وانتقلي إلى File > Build Settings، وفي نافذة Build Settings، اختاري المنصة المستهدفة (Android أو iOS).

    وفي حال تستهدفي Android، اختاري Android من القائمة.

    ثم اضغطي على Player Settings في الزاوية السفلية اليسرى من نافذة Build Settings، وضبط الإعدادات اللازمة مثل اسم الحزمة (Package Name) وغيرها.

    وفي نافذة Build Settings، تأكدي من اختيار المنصة الصحيحة ثم اضغطي على Export في الزاوية اليمنى السفلى.

    وعندما تظهر نافذة التصدير، عليك تحديد خيار Export as a Library (أو خيار مشابه يعبر عن تصدير كمكتبة)، ثم اختيار مكان حفظ المجلد الذي سيحتوي على مكتبة Unity والضغط على Export لبدء عملية التصدير.

    بعد اكتمال التصدير، ستجدي مجلد يحتوي على مكتبة Unity في المسار الذي اخترتيه، باستطاعتك الآن دمج تلك المكتبة في مشروع Flutter كما هو موضح في الخطوات التي شرحها سابقًا.

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

    ليس المطلوب منك حل جميع المشاكل، بل المطلوب هو بذل جهدك ومحاولة اكتشاف ما المشكلة وفهم السبب، وإن تعذر ذلك عليك بالسؤال فمن لا يسأل لا يصل وتلك خصلة ليست جيدة فالسؤال بعد أن إتمام جانبك من المجهود هو الصحيح.

    المقال التالي سيفيدك:

     

    • أعجبني 1
  10. تعلم الآلة يعد مجالًا واسعًا ومعقدًا، ولكنه بالطبع أكثر سهولة عند البدء بالمفاهيم الأساسية وتتقدم بشكل تدريجي، وبما أنك تدرس حاليًا الـ Regression الانحدار، فتلك  نقطة جيدة للبدء.

    وتتوفر العديد من المكتبات والأدوات مثل Scikit-Learn، TensorFlow، و PyTorch التي تسهل عملية بناء نماذج تعلم الآلة، فتلك المكتبات توفر واجهات برمجية سهلة الاستخدام وأدوات جاهزة للانحدار، التصنيف، التجميع، وغيرها.

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

    فلا تنظر للأمر بصورته الكلية فتحبط، بل حاول تخطي جزء جزء لتصل، فمع تقدمك في تعلم الآلة ومحاولتك لحل مشكلات أكثر تعقيدًا، فإن تعقيد الكود  يزيد بشكل كبير، وسيتطلب منك ذلك القيام بالعديد من المهام الإضافية، مثل:

    • معالجة البيانات Preprocessing وتشمل تنظيف البيانات، معالجة القيم الناقصة، تحويل البيانات النصية إلى رقمية، وغيرها، وذلك أمرًا مرهقًا ويستغرق وقتًا طويلًا.
    • هندسة الميزات Feature Engineering من خلال إنشاء ميزات جديدة من البيانات الحالية بشكل إبداعي لزيادة دقة النموذج، وتلك العملية تتطلب تفكيرًا إبداعيًا وفهمًا عميقًا للبيانات.
    • أعجبني 1
  11. هل إصدار Gradle المستخدم في مشروعك متوافق مع إصدار Android Gradle Plugin (AGP) المذكور في الخطأ (7.3.0)، عليك العثور على ملف gradle-wrapper.properties وتحققي من تعيين إصدار Gradle بشكل صحيح.

    distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.0-all.zip

    أيضًا هل مشروع Unity تم تصديره بشكل صحيح كـ Android Library، عليك القيام بذلك من خلال الذهاب إلى File > Build Settings وتحديد Android كمنصة الهدف، ثم التأكد من تمكين خيار Export Project إذا كان موجودًا.

    وفي مشروع Flutter، تأكدي من أن لديك إعدادات Gradle الصحيحة لاستيراد مشروع Unity، من خلال فتح ملف settings.gradle في مشروع Flutter وتأكد من إضافة مشروع Unity بشكل صحيح.

    include ':app'
    include ':unityLibrary'
    project(':unityLibrary').projectDir = new File('../UnityExport/unityLibrary')

    ثم افتحي ملف build.gradle لمشروع Flutter  وإضافة تبعية مشروع Unity بشكل صحيح.

    dependencies {
        implementation project(':unityLibrary')
    }

    ثم تفقد هل إعدادات Kotlin متوافقة مع إصدارات الأدوات الأخرى، توجهي إلى ملف build.gradle وتفقدي هل تم إضافة الإعدادات الصحيحة.

    buildscript {
        ext.kotlin_version = '1.5.31'
        repositories {
            google()
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:7.3.0'
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        }
    }

    بعد تطبيق جميع التعديلات، قومي بإعادة مزامنة المشروع من خلال Android Studio أو استخدام أمر flutter pub get لإعادة جلب الحزم والتبعيات.

  12. بتاريخ 4 ساعة قال برسوم ظريف:

    أرغب في كود خصم لدورة تطوير واجهات المستخدم 

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

    وأرجو قراءة التعليق التالي:

     

  13. الفارق الأساسي هو كيفية التعامل مع حالة التحميل loading state.

    tفي الكود الأول، تقوم بالتحقق من حالة التحميل loading ولكنك لم تقم بإرجاع الـLoader كجزء من الـJSX، أي الكود داخل الشرط if (loading) لا يعتبر جزءًا من النتيجة المرجعة من الدالة Books.

    بينما في الكود الثاني، تقوم باستخدام تعبير ثلاثي للتحقق من حالة التحميل loading، وإن كانت الحالة loading، يتم إرجاع الـLoader كجزء من الـJSX، وإذا لم تكن الحالة loading يتم عرض الكتب.

    لذا الكود الثاني يعيد الـLoader كجزء من النتيجة المرجعة من الدالة Books، بينما الكود الأول لا يعيد أي شيء في حالة التحميل، مما يعني أن العنصر Oval لن يتم عرضه.

    إذن في الكود الأول عليك تعديل الجزء الخاص بحالة التحميل ليعيد الـLoader كجزء من النتيجة المرجعة من الدالة Books:

    if (loading) {
      return (
        <Oval
          height={120}
          width={120}
          color="rgb(247, 96, 14)"
          wrapperStyle={{
            height: "70vh",
            display: "flex",
            alignItems: "center",
            justifyContent: "center",
          }}
          wrapperClass=""
          visible={true}
          ariaLabel="oval-loading"
          secondaryColor="#E2E2E2"
          strokeWidth={3}
          strokeWidthSecondary={3}
        /> 
      );
    }

    من أجل عرض الـLoader عندما تكون الحالة loading هي true.

    • أعجبني 1
  14. بتاريخ On 5‏/6‏/2024 at 12:18 قال NAIF:

    هل يمكنك عمل مثال للتجريب

    أضف عمودًا جديدًا في جدول الإعدادات ( في حال لديك جدول للإعدادات العامة للموقع) ليخزن خيار شكل الرابط.

    ALTER TABLE settings ADD COLUMN link_format VARCHAR(255) DEFAULT 'category';

    ثم إضافة خيار في لوحة التحكم للسماح للمستخدم بتحديد شكل الرابط،  كإضافة قائمة منسدلة dropdown في لوحة التحكم لاختيار شكل الرابط.

    وعند اختيار المستخدم شكل الرابط من لوحة التحكم، قم بتحديث قيمة إعدادات الرابط في قاعدة البيانات.

    وللتوضيح إليك مثال على كود PHP لتحديث الإعداد:

    // افترض أن لديك اتصال بقاعدة البيانات بالفعل
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $link_format = $_POST['link_format']; // احصل على القيمة من نموذج لوحة التحكم
        $stmt = $conn->prepare("UPDATE settings SET link_format = ?");
        $stmt->bind_param("s", $link_format);
        $stmt->execute();
        $stmt->close();
    }

    وتستطيع إنشاء أو تعديل ملف .htaccess ديناميكيًا بناءً على الإعداد المحدد من لوحة التحكم.

    // احصل على إعداد الرابط الحالي من قاعدة البيانات
    $stmt = $conn->prepare("SELECT link_format FROM settings");
    $stmt->execute();
    $stmt->bind_result($link_format);
    $stmt->fetch();
    $stmt->close();
    
    // إعداد محتوى ملف .htaccess بناءً على اختيار المستخدم
    $htaccessContent = "RewriteEngine On\n";
    
    if ($link_format === 'category') {
        $htaccessContent .= "RewriteRule ^category/c-([0-9]+)\.html$ /cat.php?c=$1 [L,QSA]\n";
    } else {
        $htaccessContent .= "RewriteRule ^c-([0-9]+)\.html$ /cat.php?c=$1 [L,QSA]\n";
    }
    
    // كتابة المحتوى إلى ملف .htaccess
    file_put_contents('.htaccess', $htaccessContent);

    و إليك مثال على نموذج HTML لإضافة الخيار في لوحة التحكم:

    <form method="POST" action="path_to_your_php_script.php">
        <label for="link_format">اختر شكل الرابط:</label>
        <select id="link_format" name="link_format">
            <option value="category">www.example.com/category/c-رقم التصنيف.html</option>
            <option value="short">www.example.com/c-رقم التصنيف.html</option>
        </select>
        <input type="submit" value="حفظ">
    </form>

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

    ومن الأفضل إضافة بعض التحقق والتدقيق للتأكد من أن القيم المدخلة صحيحة وتجنب أي أخطاء محتملة.

    • أعجبني 1
  15. ذلك تخوف طبيعي، ومع ما نشهده من تطورات، فكتابة الكود وحدها لا تكفي، عليك فهم ما تقوم به، فالبعض يقوم بالنسخ واللصق أو كتابة الأكواد بدون فهم لما يحدث في الخلفية أي ليس متعمق في اللغة والأساسيات، بالتالي ما الفرق بينه وبين نموذج تعلم آلي قادر على كتابة الكود؟

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

    أي في الوقت الحالي أصبح الجميع بحاجة إلى بذل جهد إضافي للتعلم والوصول لمستوى متقدم وليس الإكتفاء بكتابة الكود فقط.

    • شكرًا 1
  16. مجال جيد ولكن ليس من السهل تعلمه فهو بحاجة إلى وقت ومجهود أطول مقارنًة بتخصصات أخرى، في حال لا يوجد لديكِ دراية بأساسيات البرمجة وعلوم الحاسوب، فستحاجين إلى دراسة ذلك من خلال دورة علوم الحاسوب بالأكاديمية.

    حيث ستتعلمين بها التالي:

    • أساسيات الحاسوب وعلومه والتفكير المنطقي وما هي الخوارزميات وكيف تفيد في البرمجة
    • تطبيقات عملية على أساسيات التفكير المنطقي باستخدام بيئة سكراتش Scratch التفاعلية
    • أساسيات لغة البرمجة JavaScript وتطبيق المفاهيم التي تم شرحها باستخدامها، والتوسع في شرح التطبيقات العملية للغات البرمجة
    • أساسيات أنظمة التشغيل المختلفة وكيفية تثبيت البرمجيات اللازمة للبرمجة عليها
    • أساسيات سطر الأوامر في نظام لينكس، وشرح الأسس التي بني عليها النظام مع تطبيقها عمليًا
    • أنظمة قواعد البيانات المختلفة، مع شرح تفصيلي للغة SQL للتعامل معها
    • مبادئ أساسية في أنظمة قواعد البيانات NoSQL
    • المفاهيم الأساسية التي تبنى فيها صفحات الويب
    • مفاهيم أساسية في الشبكات والخوادم، وكيف يتم استقبال الطلبيات إلى الخادم والرد عليها
    • مبادئ الحماية والأمان في الويب

    بعد ذلك ستحتاجين إلى دورة متخصصة في الـ blockchain حيث لا يوجد دورة مخصصة لذلك بالأكاديمية.

  17. عبارة عن نوعان من مهام التعلم الآلي التي تستخدم لبناء نماذج تنبؤية، والفرق الرئيسي بينهما يكمن في طبيعة المتغير الهدف Target Variable الذي نحاول التنبؤ به.

    فالتصنيف Classification الهدف منه هو التنبؤ بفئة أو مجموعة معينة ينتمي إليها المتغير الهدف، وذلك لتصنيف البيانات إلى فئات محددة.

    تكون المخرجات عادة فئات غير مرتبة Categorical, مثل "نعم" أو "لا"، "سبام" أو "غير سبام"، أنواع الحيوانات، إلخ.

    وكأمثلة على الخوارزميات المستخدمة، فمنها الشبكات العصبية Neural Networks ودعم آلات المتجهات Support Vector Machines.

    بينما الانحدار Regression الهدف منه هو التنبؤ بقيمة مستمرة للمتغير الهدف، أي نحاول تقدير كمية معينة.

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

    وكأمثلة على الخوارزميات المستخدمة، فمنها الانحدار الخطي Linear Regression  والانحدار المتعدد Multiple Regression.

    • أعجبني 1
  18. تلك ،المفاهيم مهمة، لكنها متقدمة قليلاً في البداية، من الأفضل البدء بالأساسيات ثم التقدم تدريجياً إلى المواضيع الأكثر تخصصًا.

    فبعض تعلم الأساسيات تعتبر المرحلة الثالثة هي ما تشمل تعلم تلك الخوارزميات بالترتيب التالي:

    1.  دراسة التقسيم الهرمي وتطبيقه على مجموعات البيانات،  لتجميعها في مجموعات بناءًا على التشابه بينها، للمساعدة في فهم العلاقات بين البيانات المعقدة.
    2.  فهم تطبيقات خوارزميات الأبريوري في تحليل قواعد الترابط، للعثور على الأنماط والقواعد المترابطة في بيانات كبيرة، مثل اكتشاف العلاقات بين المنتجات في سلة المشتريات.
    3. دراسة LDA واستخدامه في تقليل الأبعاد وتحسين التصنيف، لتصنيف البيانات إلى فئات مختلفة، وهو مهم في تطبيقات مثل تعرف الوجه وتصنيف النصوص.
    4.  التعرف على MDA وتطبيقه على البيانات متعددة الأبعاد، وهو مفيد في التعامل مع البيانات التي تحتوي على العديد من المتغيرات، مما يساعد في تصنيف البيانات وتمييز الفئات بشكل أكثر دقة.
    5. فهم كيفية بناء الشبكات العصبية العميقة باستخدام طبقات متعددة، وسيساعدك ذلك في تطوير نماذج قادرة على فهم الأنماط المعقدة في البيانات.
    6. تعلم تحليل السلاسل الزمنية وتطبيقها في التنبؤ، للتنبؤ بالاتجاهات المستقبلية بناءً على البيانات التاريخية، مما يفيد في مجالات مثل التنبؤ بالأسواق المالية والتنبؤ بالطقس.

     

    • أعجبني 1
  19. قم بفتح الطرفية (التيرمنال) من قائمة التطبيقات أو بالضغط على Ctrl + Alt + T.

    ثم استخدم الأمر add-apt-repository لإضافة المستودع الجديد:

    sudo add-apt-repository repository/name

    عليك تبديل repository/name بعنوان المستودع الذي تريد إضافته.

    بعد إضافة المستودع، تحتاج إلى تحديث قائمة الحزم:

    sudo apt update

    ويوجد طريقة الثانية من خلال واجهة المستخدم، افتح "إدارة التحديثات" (Update Manager) وتستطيع العثور عليها في قائمة التطبيقات.

     

    افتح الإعدادات Settings في نافذة "إدارة التحديثات"، ثم انتقل إلى علامة التبويب "المستودعات الأخرى" (Other Software).

    ثم اضغط على زر "إضافة" Add وأدخل عنوان المستودع الذي تريد إضافته، وبعد إضافة المستودع، ستحتاج إلى تحديث قائمة الحزم. يمكنك القيام بذلك من خلال الضغط على زر "تحديث" (Refresh) أو باستخدام الطرفية:

    sudo apt update

     

  20. اختيار النموذج المناسب يعتمد على العديد من العوامل بما في ذلك طبيعة البيانات، الهدف من النموذج، والأداء المطلوب.

    بالتالي القول بأن نموذجًا معينًا مثل RandomForestClassifier هو دائمًا أفضل من LinearRegression غير دقيق،  لأن كل منهما يخدم أغراضًا مختلفة ويعمل بشكل أفضل في ظروف معينة.

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

    بينما RandomForestClassifier نموذج أكثر تعقيدًا يستخدم للأغراض التصنيفية، ويعمل بشكل جيد عندما تكون البيانات معقدة وتحتوي على العديد من الميزات التي قد تتفاعل مع بعضها بطرق غير خطية، ويتميز بأنه يستخدم مجموعة من الأشجار decision trees ويجمع نتائجها للحصول على تصنيف أكثر دقة.

    واستخدم التحقق المتبادل لتقييم أداء النموذج على مجموعة من البيانات غير المرئية للنموذج، وقد تحتاج إلى ضبط الباراميترات للنماذج المعقدة لتحسين أدائها.

    • أعجبني 2
  21. بالضبط، ففي مكتبة scikit-learn، باراميتر normalize لم يعد موجودًا في الإصدار 0.24.0 وما بعده من النموذج LinearRegression.

    في الإصدارات الأحدث من المكتبة، عليك استخدام StandardScaler أو Normalizer من مكتبة sklearn.preprocessing لتطبيع البيانات قبل تمريرها إلى النموذج.

    للتوضيح:

    from sklearn.linear_model import LinearRegression
    from sklearn.preprocessing import StandardScaler
    import numpy as np
    
    X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
    y = np.array([1, 2, 3, 4])
    
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)
    
    model = LinearRegression()
    model.fit(X_scaled, y)
    
    predictions = model.predict(X_scaled)
    print(predictions)

    لاحظ تطبيع البيانات باستخدام StandardScaler قبل استخدامها في تدريب النموذج LinearRegression، وذلك يحقق نفس النتيجة التي كان يحققها استخدام الباراميتر normalize=True في الإصدارات الأقدم.

    • أعجبني 2
  22. الأمر محوره الأساسي هو قاعدة البيانات، اي عليك إنشاء مُخطط لقاعدة البيانات لحفظ بيانات العملاء من ضمنها طرق الدفع الخاصة بهم والتعاملات السابقة والمحفظة، أي يشمل التالي:

    جدول العملاء Customers Table:

    • مُعرف العميل ID
    • الاسم
    • البريد
    • كلمة المرور في شكل hash بالطبع
    • ... (أي أعمدة إضافية تحتاجها مثل عنوان العميل، رقم الهاتف، إلخ).

    جدول طرق الدفع Payment Methods Table:

    • Payment Method ID (المفتاح الأساسي): معرّف فريد لكل طريقة دفع.
    • Customer ID (مفتاح خارجي): معرّف العميل المرتبط بطريقة الدفع.
    • Payment Method Type: نوع طريقة الدفع (مثل بطاقة الائتمان، PayPal).
    • Payment Method Details: تفاصيل طريقة الدفع (مثل رقم البطاقة، تاريخ الانتهاء).

    جدول المعاملات Transactions Table:

    • Transaction ID (المفتاح الأساسي): معرّف فريد لكل معاملة.
    • Customer ID (مفتاح خارجي): معرّف العميل المرتبط بالمعاملة.
    • Transaction Date: تاريخ المعاملة.
    • Transaction Amount: مبلغ المعاملة.
    • Transaction Status: حالة المعاملة (مثل معلقة، ناجحة، فاشلة).

    جدول المحفظة Wallet Table:

    • Wallet ID (المفتاح الأساسي): معرّف فريد لكل محفظة.
    • Customer ID (مفتاح خارجي): معرّف العميل المرتبط بالمحفظة.
    • Wallet Balance: رصيد المحفظة.

    و عندما يضيف العميل طريقة دفع جديدة، يتم إنشاء سجل جديد في جدول طرق الدفع، وعندما يقوم العميل ببدء معاملة، يتم إنشاء سجل جديد في جدول المعاملات.

    إن كانت المعاملة ناجحة، يتم تحديث رصيد المحفظة في جدول المحفظة وفقًا لذلك.

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

    وكنصيحة، اعتمد على الـ Tokenization لتخزين تفاصيل طرق الدفع بدلاً من تخزين المعلومات الفعلية لطرق الدفع، فالتوكنيزاشن هو عملية استبدال معلومات الدفع الحساسة برمز فريد (Token) لا يمكن استخدامه إلا في سياق محدد.

    • أعجبني 1
  23. ليس خاصًا بمجال معين؛ بل محرك بحث شامل للأدبيات الأكاديمية في مجموعة واسعة من التخصصات والمجالات.

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

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

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

    وإذا أردت مصادر جيدة للمتابعة بأحدث التطورات، فإليك التالي:

    • ArXiv: منصة مفتوحة للأبحاث الأكاديمية في مختلف المجالات، بما في ذلك الذكاء الاصطناعي، حيث يمكن للباحثين نشر أوراقهم قبل مراجعتها من قبل الأقران.
    • NeurIPS: مؤتمر سنوي بارز في مجال التعلم الآلي والذكاء الاصطناعي، يجمع الباحثين لتقديم أحدث الأبحاث والتطورات في هذه المجالات.
    • alignmentforum.org: منتدى متخصص لمناقشة قضايا مواءمة الذكاء الاصطناعي مع القيم البشرية، ويركز على الأبحاث حول كيفية جعل الذكاء الاصطناعي آمنًا وموثوقًا.
    • ijcai.org: الموقع الرسمي للمؤتمر الدولي للمشاريع المشتركة في الذكاء الاصطناعي (IJCAI)، وهو مؤتمر سنوي يعرض أحدث الأبحاث في مجالات متعددة من الذكاء الاصطناعي.
    • icml.cc: الموقع الرسمي للمؤتمر الدولي للتعلم الآلي (ICML)، وهو أحد أهم المؤتمرات السنوية في مجال التعلم الآلي حيث يتم تقديم أبحاث جديدة ومبتكرة.
    • nips.cc: الموقع الرسمي لمؤتمر NeurIPS (المعروف سابقًا بـ NIPS)، وهو مؤتمر رئيسي في مجالات التعلم الآلي والشبكات العصبية، يجمع الأبحاث والتطورات الحديثة في هذه المجالات.
    • أعجبني 1
×
×
  • أضف...