Mustafa Suleiman

244 نقاط السمعة
16.7 ألف مشاهدات المحتوى
عضو منذ
بشكل بديهي في البداية ستحتاج إلى تعلم بايثون والتعمق في اللغة نفسها وبناء مشاريع من خلالها قبل استخدام أي مكتبة أو إطار، وخاصًة تعلم الـ OOP. بعد ذلك عليك تعلم إطار أو مكتبة خاصة بتطوير الـ GUI أي واجهة المستخدم لتطبيقات سطح المكتب، ومنها: Tkinter وهي مكتبة قياسية مع بايثون، أي مدمجة في بايثون لكنها ليست متقدمة. PyQt أو PySide توفر أدوات غنية لتطوير واجهات مستخدم متقدمة. Kivy و wxPython مناسبة لتطوير تطبيقات تعمل على منصات متعددة. تعلم الأساسيات من
ذلك ممكن، الفكرة هي الإعتماد على موازن تحميل Load Balancer أو خوادم بروكسي عكسية Reverse Proxy Servers لتوجيه الطلبات إلى السيرفرات المختلفة حسب المسار في الرابط. فموازن التحميل يقوم بتوزيع الطلبات على الخوادم المختلفة من خلال قواعد تحددها، وتتوفر أدوات مثل NGINX أو HAProxy كموازن تحميل. بحيث تقوم بإعداد موازن التحميل لتوجيه الطلبات إلى السيرفرات المختلفة حسب المسار: الطلبات إلى a.com/m تذهب إلى سيرفر المجلة. الطلبات إلى a.com/q تذهب إلى سيرفر المتجر. الطلبات إلى a.com تذهب إلى السيرفر الرئيسي. أو
هل قمت بتعديل القيم التالية في ملف php.ini؟: upload_max_filesize = 2G post_max_size = 2G max_execution_time = 300 max_input_time = 300 أيضًا إعدادات .htaccess في حال تستخدم Apache: php_value upload_max_filesize 2G php_value post_max_size 2G php_value max_execution_time 300 php_value max_input_time 300 أما في حال استخدام خادم Nginx، فعليك تعديل إعدادات nginx.conf: client_max_body_size 2G; ثم قم بتعديل ملف wp-config.phpلإضافة القيم التالية إذا لم تكن مضافة: @ini_set('upload_max_filesize', '2G'); @ini_set('post_max_size', '2G'); @ini_set('max_execution_time', '300'); @ini_set('max_input_time', '300');
هل تظهر لديك عند تسجيل الدخول بحسابك كـ Admin؟ أم لا تظهر على الإطلاق. وهل عند تصفح الموقع من جهاز آخر تظهر الصفحة؟ حاول تعطيل الكاش أثناء عملية التطوير ثم تشغيله بعد الإنتهاء. بعد تعديل القالب بواسطة Elementor عليك النشر بالضغط على Publish، ثم من إعدادات ووردبريس، اختر المظهر appearance ثم تخصيص customize ثم اضغط على home page settings ثم اختر statice page ثم من القائمة المنسدلة Home page اختر اسم الصفحة التي تريد تعيينها للصفحة الرئيسية.
هل قمت بتكوين تفاصيل خادم SMTP بشكل صحيح؟ وهم: مضيف SMTP منفذ SMTP اسم المستخدم وكلمة المرور نوع التشفير (TLS/SSL) أيضًا تستطيع ضبط SMTPDebug بقيمة 2 للحصول على تفاصيل أكثر عن الخطأ. للتوضيح تلك هي الإعدادات التي يجب عليك ضبطها: $mail = new PHPMailer\PHPMailer\PHPMailer(); $mail->isSMTP(); $mail->SMTPDebug = 2; $mail->Host = 'smtp.host.com'; $mail->SMTPAuth = true; $mail->Username = 'username'; $mail->Password = 'password'; $mail->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS; // أو PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_SMTPS $mail->Port = 587; // أو 465 لـ SSL، أو 25 لغير المشفر $mail->setFrom('from@gmail.com', 'Mailer');
ٌقم بتطبيق rate limiter مع ميكانيزم cache في الذاكرة in-memory. أي استخدم متغيرًا في الذاكرة لتخزين آخر وقت رفع صورة لكل مستخدم وقبل السماح للمستخدم برفع صورة جديدة، تحقق مما إن كان قد مر وقت كافٍ (مثل دقيقة واحدة) منذ آخر عملية رفع. أي نقوم بإنشاء متغير خارج الدالة كالتالي: const userLastUploadTime = {}; ثم داخل دالة الرفع نقوم بتخزين الوقت وأيضًا التحقق من مرور وقت معين مثل دقيقة: const currentTime = Date.now(); const lastUploadTime = userLastUploadTime[userId] || 0; if
من خلال PHPMailer عليك توليد توكن عند تسجيل الحساب من قبل المستخدم، وتخزين التوكن بجانب الإيميل الخاص به في قاعدة البيانات. ثم إرسال بريد تحقق إلى إيميل المستخدم به رابط يحتوي على ذلك التوكن، وعند الضغط عليه يتم التحقق من الإيميل. وإليك توضيح: require 'PHPMailer/PHPMailer.php'; $mail = new PHPMailer\PHPMailer\PHPMailer(true); $mail->setFrom('your_email@example.com', 'Your Name'); $mail->addAddress($user_email, $user_name); $mail->Subject = 'Verify Your Email Address'; $token = bin2hex(random_bytes(16)); // عليك كتابة كود لحفظ التوكن في قاعدة البيانات $verify_link = 'https://example.com/verify-email?token=' . $token; $mail->Body = 'Please
بخصوص PHP عليك الإعتماد على استضافات حديثة وليس الاستضافات القديمة، حيث يوجد لديك التالي فيما يخص توفير باقات مجانية: https://www.infinityfree.com/ https://fly.io/ https://vercel.com/ و Vercel للمشاريع الصغيرة فقط فهي غير مهيئة لمشاريع PHP بشكل خاص.
في البداية كلما زاد عدد المواضيع والمشاركات والملفات المرفقة، زادت صعوبة النقل، وربما لديك تختلف بنية قاعدة بيانات vBulletin عن WordPress، مما يتطلب تحويل البيانات وتنظيمها. وفي حال كان منتدى vBulletin يحتوي على ميزات إضافية مثل الإضافات أو التعديلات المخصصة، فقد تحتاج إلى إيجاد بدائل لها في WordPress. لذا ستحتاج إلى تصدير قاعدة البيانات إلى ملف CSV أو XML من خلال PHPmyadmin ثم استيرادها من خلال إضافة مثل Import any XML or CSV File to WordPress حيث ستمكنك من إختيار
وما الحاجة إلى تلك الاستضافة، تستطيع الإعتماد على الاستضافات التالية وبها خطة مجانية وهي أفضل بمراحل: https://pages.cloudflare.com https://vercel.com/ https://www.netlify.com/
للتخصيص أكثر ستحتاج إلى كتابة أكواد PHP، أي يجب تعلم أساسيات PHP لفعل ما تريد.
الأمر غير واضح من الصورة، اضغط على CTRL + SHIFT + J لفتح الكونسول بالمتصفح ورؤية الأخطاء التي تسبب عدم ظهور الصور.
حاول تعريف حالة في العميل لتتبع حالة الاتصال، مثل isConnected، وتحديث الحالة بناءًا على الأحداث connect و disconnect. وبدلاً من استخدام setTimeout لإعادة تحميل الصفحة مباشرة، قم بتعيين عدد محدد من محاولات إعادة الاتصال قبل إظهار رسالة الفشل وتحديث الصفحة. وإن كانت محاولات إعادة الاتصال تفشل، قم بتأخير إعادة تحميل الصفحة لبضع ثوانٍ لإعطاء المستخدم وقتًا لرؤية رسالة الفشل، وقبل تنفيذ location.reload(), تحقق من حالة isConnected للتأكد من أن الاتصال لم يُستعاد بالفعل. والإعتماد على الأحداث connect_error, connect_timeout, و error
هناك إضافة توفر ذلك منها mbstring وIntl لكن يجب تفعيلهم في PHP لكي تتمكن من استخدامهم. واستخدام دالة transliterate من mbstring كالتالي: <?php mb_internal_encoding('UTF-8'); echo transliterate('كلام عربي', 'ar-latin'); ?> أو دالة transliterate من Intl كالتالي: $text = 'كلام عربي'; $transliterated_text = transliterate($text, 'Any-Latin; Latin-ASCII; [^a-zA-Z]* remove'); echo $transliterated_text; // Output: kalam arabi أو استخدام مكتبة خارجية مثل ar-php https://github.com/khaled-alshamaa/ar-php او الإعتماد على دالة برمجية مُخصصة تؤدي تلك الوظيفة كالتالي: function arabic_to_latin($text) { $mapping = array( 'أ' => 'a', 'إ' =>
لتنفيذ ما تريد عليك بوضع الأداء الجيد في الإعتبار. فبدلاً من استخدام $("#lonline > div") لاختيار جميع عناصر الـ div داخل #lonline، استخدم استعلام CSS أكثر كفاءة مثل $("#lonline > div:nth-child(n+51)") لتحديد العناصر التي تبدأ من العنصر رقم 51. ثم استخدام دالة each لتطبيق الحذف على كل عنصر في xdel، لأن xdel سيعود لنا بكائن. <!DOCTYPE html> <html lang="ar"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>حذف عناصر div</title> <style> #lonline { display: flex; flex-wrap: wrap; } #lonline
ما ذكره صحيح، فليس من مهمته تضمين الـ API في الواجهة الأمامية، فتلك مهمة مطور الواجهة الأمامية حيث يستخدم نقطة النهاية أو الـ API من أجل إرسال واستقبال البيانات من الواجهة الخلفية. أي من ضمن مهام مطور الواجهة الأمامية استهلاك أو استخدام الـ API الذي قام بإنشائه مطور الواجهة الخلفية. مثلاً يستخدم هو رابط مثل https://example.com/products ليحصل على البيانات التالية في الواجهة الأمامية: [ { "id": 1, "name": "منتج 1", "price": 10.00 }, { "id": 2, "name": "منتج 2", "price":
أفضل طريقة حاليًا هي استخدام performance.getEntriesByType مع PerformanceElementTiming كالتالي: window.addEventListener('load', function () { if (window.PerformanceNavigationTiming) { const navigationEntries = performance.getEntriesByType('navigation'); if (navigationEntries.length > 0) { var navigationEntryType = navigationEntries[0].type; if (navigationEntryType === 'back_forward') { alert('back_forward triggered'); } } } }); https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEventTiming https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByType
من خلال كائن location تستطيع تغيير عنوان الصفحة كالتالي: window.location.href = https://www.google.com/;: ويوجد بذلك الكائن ميثود باسم next: window.location.next() نستخدمها للانتقال إلى الصفحة التالية في سجل المتصفح history. والعكس صحيح يوجد ميثود باسم back: window.location.back() للعودة إلى الصفحة السابقة في سجل المتصفح. وللعلم يوجد History API من خلال تستطيع التنقل إلى صفحتين سابقتين مثلاً في سجل المتصفح كالتالي: https://developer.mozilla.org/en-US/docs/Web/API/History_API window.history.go(-2) أو تحديث الصفحة الحالية: window.history.go() أيضًا إعادة التحديث يوجد لها ميثود باسم reload في كائن location: window.location.reload() نستخدمها لإعادة تحميل
الأمر يتم مثل الموقع، حيث تقوم ببرمجة واجهة التحكم كوسيط بين الموقع والواجهة الخلفية، بحيث تصل لواجهة التحكم من خلال مسار معين مثل التالي: test.com/admin ونقوم بحماية ذلك المسار بحيث لا يصل إليه إلا عن طريق تسجيل الدخول من خلال مستخدم له صلاحية admin، وفي لوحة التحكم ذلك المستخدم له صلاحية التعديل والإضافة والحذف، وتتحدث لوحة التحكم إلى الواجهة الخلفية من خلال API. الأمر مُربك في البداية وبحاجة إلى رؤية شرح لفهم الأمر، ابحث عن "مشروع React Admin Dashboard Full
عند مشاركة كود على الإنترنت أرجو منك نسخ الكود ولصقه بشكل نصي وليس صورة، بذلك تمكن الآخرين من مساعدتك وإختبار الكود بشكل سريع، ولا أرى في كود HTML لديك أي سمة باسم data-source أو data-type
هل يظهر لك خطأ أثناء ذلك؟ عامًة تأكد من أنّك تستخدم أحدث إصدار من الوورد بريس، فقد لا تعمل بعض الميزات مع الإصدارات القديمة، وتستطيع التحقق من إصدار الوورد بريس الحالي من خلال الانتقال إلى لوحة التحكم > التحديثات. ثم جرّب إعادة تنشيط الثيم فذلك يحل بعض المشكلات المؤقتة، من خلال الانتقال إلى المظهر > السمات > مثبتة. إن استمرت المشكلة حاول حذف الثيم ثم إعادة رفعه. وتأكد من أنّك لا تستخدم أي إضافات أخرى تتسبب في تعارض مع ثيمة
في الإصدار الحديث من المكتبة عليك استخدام ميثود find_element للعثور على عنصر في صفحة الويب بالشكل التالي: driver.find_elements(By.XPATH, '//button') ولتحديد أكثر دقة استخدم: driver.find_element(By.XPATH, '//button[text()="Some text"]') حيث أنّ [text()="Some text"] هو شرط يحدد أننا نريد العثور على زر يحتوي على النص "Some text" في داخله. وبالطبع كما تعلم // يشير إلى أننا نريد البحث عن العنصر في أي مكان في شجرة DOM (Document Object Model) لصفحة الويب. وستجد تفصيل أكثر هنا عند محدد By.XPATH وعند المُحددات الأخرى: https://selenium-python.readthedocs.io/locating-elements.html حيث ستجد
المشكلة هي أن dataset.sourceربما لا تكون موجودة دائمًا، حيث أنّ dataset عبارة عن خاصية في JavaScript تسمح لك بالوصول إلى خصائص HTML مخصصة محددة باستخدام أسماء خصائص HTML مخصصة كمفاتيح. لذا عليك التحقق من وجود خاصية source: if (element.parentNode.dataset.source) { myUrl = element.parentNode.dataset.source; } else { console.error("لا توجد خاصية `source` محددة في `dataset`"); } أو الإعتماد على خاصية getAttribute للوصول إلى قيمة الخاصية المخصصة، مع التحقق من وجودها أولاً: const sourceAttribute = element.parentNode.getAttribute("data-source"); if (sourceAttribute) { myUrl = sourceAttribute; }
تستطيع ذلك وستجد تفصيل في المستند الرسمي: https://flutter.dev/multi-platform/web وبإمكانك مشاركة الكود بين تطبيق الهاتف وبين تطبيق الويب. وستجد هنا أمثلة حية: https://flutter.github.io/samples/#?platform=web لكن الإطار ليس الأمثل لإنشاء تطبيق ويب، فهو مخصص أكثر لتطبيقات الهاتف، ولن تستطيع بناء تطبيق ويب معقد أو ذو أداء أفضل من مكتبات أو إطارات مخصصة للويب مثل React و Angular أو Vue.js. أيضًا يوجد مشكلة الـ SEO، فالإطار غير متوافق مع معايير الـ SEO لكونه ليس للويب.
لديك الـ API الخاص بموقع 365scores ويمكنك تفقد الكود الخاص بالمكتبة التالية لفهم آلية استخدام الـ API: https://github.com/kkristof200/py_365scores/tree/main ولديك أيضًا api-football.com. بالإضافة إلى goal.com-score-api: https://github.com/j-a-h-i-r/goal.com-score-api ويوجد الـ bwin API: https://sportsapi.bwin.com/restapi/glossary.html