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

Mustafa Suleiman

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

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

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

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

    472

كل منشورات العضو Mustafa Suleiman

  1. لا تكن حبيس أفكارك، ما تقوم به غير عملي وغير واقعي، فحتى الشركات الكبيرة لا تقوم بما تفعله، أحيانًا كثيرة يتم نشر ميزة ليست كاملة وبها أخطاء ويتم إصلاحها بعد النشر. المهم هو إخراج نتيجة بجودة مقبولة ثم التحسين، فلو لاقت قبول ومفيدة فعلاً يتم تطويرها لتجنب إضاعة الوقت والمجهود في أمر لا عائد منه عند إختباره في الواقع. وعامًة المشكلة شائعة جداً جداً بين المبرمجين، خصوصاً في البدايات، ويسمى شلل التحليل Analysis Paralysis أو السعي للكمال المضر. اعتمد منهجية MVP وابدأ دائماً بأبسط نسخة تعمل وتحقق الهدف الأساسي المطلوب، ولديك الهدف الأساسي هو إدخال بيانات لتقرير واحد بطريقة ثابتة ربما اجعل ذلك يعمل أولاً، أي ركز على أن يعمل الكود بشكل صحيح مبدئياً، حتى لو كان غير أنيق أو غير قابل للتوسع بسهولة وبعد أن يعمل، تستطيع العودة لتحسينه وعمل Refactoring، وجعله يتعامل مع حالات أكثر تعقيداً. وبدلاً من التفكير في المشروع ككتلة واحدة ضخمة تتطلب حلاً مثالياً لكل شيء، قسّمه إلى مهام صغيرة جداً يمكن إنجازها في فترة قصيرة. وستواجهك مشكلة ماذا لو؟ فقم بكتابة ما تفكر به جانبياً وامضِ قدماً، بأي طريقة تريدها تحت عنوان تحسينات مستقبلية أو مشاكل محتملة، ثم انسَها في الوقت الحالي وركز على المهمة التي بين يديك وستتعامل مع ذلك لاحقاً عندما يحين وقتها.
  2. الإضافة تعمل بشكل سليم، ربما قمت بتثبيتها بشكل غير صحيح، كل ما تحتاجه هو التوجه للرابط التالي: https://marketplace.visualstudio.com/items?itemName=qiuqiu-xt.css-flex وستظهر لك صفحة الإضافة في vscode اضغط على install وستظهر لك رسالة اختر trust وسيتم التثبيت، ثم توجه إلى ملف CSS واكتب: body { display: flex; } وستجد أنّ أيقونة الإضافة قد ظهرت بجانب flex
  3. يوجد مشكلة في تهيئة .htaccess أدى إلى الخطأ 500، وليس عملية إعادة الكتابة بحد ذاتها، فاختصار الروابط من خلال RewriteRule لا يؤدي إلى إيقاق الاستدعاء، ما يفعله عند وصول طلب بمسار معين /Admin/dir/update/123 إلى الخادم، تقوم قاعدة RewriteRule بإعادة كتابة المسار داخلياً إلى مسار آخر Admin/dir/update.php?t=123 قبل أن يقوم الخادم بتحديد الملف الذي سيقوم بتشغيله. قم بإرفاق ملف htaccess لتفقده وتحديد ما تريد فعله بالضبط بشكل واضح.
  4. RewriteBase الهدف منه تحديد المسار الأساسي الذي تُطبق عليه قواعد RewriteRule، ومن المفترض أن يكون مجلد وليس ملف. بمعنى لو ملف .htaccess موجود في المسار public_html/Admin/dir/، فـ RewriteBase الصحيح سيكون /Admin/dir/. وتستطيع دمج القاعدتين في قاعدة واحدة: RewriteEngine On RewriteBase /Admin/dir/ RewriteRule ^update/([0-9a-zA-Z_]+)$ update.php?t=$1 [NC,L] وسيتم توجيه مسارات مثل update/123 و update/abc و update/ID_456 بغض النظر عن حالة الأحرف إلى update.php?t=قيمة هنا
  5. الأمر ليست بتلك السهولة، ستحتاج إلى تعلم لغة برمجة وإطار عمل وذلك يستغرق وقت ما بين 3 أشهر حتى 6 أشهر، لذا هل ستتعلم من الصفر أم تعلمت لغة برمجة بالفعل أو تنوي تعلم لغة برمجة جديدة؟ في حال ما زلت في مرحلة التعلم، الأسهل لك تعلم لغة PHP ثم تعلم إطار لارافل لتطوير المشروع، وبه نظام مدمج لإدارة المستخدمين والمصادقة وميزة Laravel Task Scheduling لجدولة المهام اليومية لخصم النقاط تلقائياً ومكتبات QR منها SimpleSoftwareIO/simple-qrcode. وذلك لتطوير تطبيق ويب أي سيعمل من خلال المتصفح، أما لو تريد تطبيق هاتف فستحتاج إلى استخدام Flutter أو React Native.
  6. طالما تعمل من خلال PHP الأسهل لك استخدام إطار NativePHP وسيوفر لك تحويل مشاريع PHP ولارافل إلى برامج سطح مكتب لمنصات ويندوز، ماك ولينكس وذلك في الوقت الحالي، وفي الإصدارات القادمة سيتم دعم التحويل لتطبيقات هواتف لمنصتي أندرويد وiOS. لتطبيقات الهواتف أنصحك باستخدام React Native لكونها تعتمد على مكتبة React والتي بدورها تعتمد على جافاسكريبت، وتعلم ما سبق يقع ضمن إختصاصك كمطور ويب وسيعود عليك بالفائدة في تطوير مهاراتك.
  7. هناك مقاسات ثابتة لمقاسات الشاشات أي تعتبر قياسية standard، لكن الأمر يعتمد على التصميم، فأحيانًا نقوم بكتابة قيم قريبة من تلك المقاسات لكي تتناسب مع التصميم الخاص بالموقع الذي نعمل عليه، فعند اختبار الموقع عن طريق أدوات المطور في المتصفح حيث يوجد أداة لإختبار التجاوبية responsive، نتفقد النقاط التي ينكسر عندها التصميم بمعنى يصبح غير سليم، ثم نكتب media query بمقاس الشاشة بالـ px الذي انكسر عنده التصميم ونقطة الإنكسار تُعرف باسم break point.
  8. يحمل قيمة العنصر في كل دورة تكرار، بمعنى الحلقة تقوم بالتكرار على عناصر المصفوفة وعددهم 4، في الدورة الأولى ستكون قيمة i تساوي العنصر الأول في المصفوفة وهو meshal وهكذا في باقي الدورات، بالتالي في كل دورة تستطيع استخدام تلك القيمة لتنفيذ أمر معين كالطباعة.
  9. صحيح، وذلك لنسخ مستودع بعيد على منصة GitHub وإنشاء نسخة محلية منه على حاسوبك حيث ستجد مجلد جديد باسم المستودع وذلك في نفس المسار الذي قمت به بتنفيذ الأمر في منفذ الأوامر، تكتب الأمر وتضع بعده رابط المستودع لإنشاء نسخة منه. git clone https://github.com/username/repository.git وللعلم تستطيع تغيير اسم المجلد بكتابة اسم بعد رابط المستودع: git clone https://github.com/username/repository.git اسم المجلد الجديد
  10. الحد الأدنى هو 4 مسارات وليس 4 دورات فكل دورة مقسمة إلى مسارات، وسيتم إختبارك في تلك المسارات فقط، لكن الأفضل إنهاء الدورة بالكامل لتحقيق استفادة في حال كانت تلك المرة الأولى لك في دراسة ذلك التخصص. وكل دورة لها شهادة خاصة بها لذا أرجو التقدم بطلب الإختبار بالتحدث لمركز المساعدة وتوفير روابطgithub للمشاريع العملية على التي قمت بإنهائها في تلك المسارات
  11. ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
  12. توجه للمسار التالي على حاسوبك: C:\Users\Alamir Bn Talal\AppData\Local\Android\sdk\ndk قم بحذف جميع ما بداخل ذلك المجلد، ثم تشغيل مشروع flutter لتحميل وإنشاء ملف NDK مُجددًا، وذلك من خلال الأوامر التالية: flutter clean flutter pub get cd android && ./gradlew clean && cd .. flutter run في حال استمرت المشكلة، قم بحذف المجلد مجددًا ثم توجه إلى إعدادات android studio وابحث عن sdk واختر Android SDK ثم من تبويب SDK Tools ستجد NDK تفقد الإصدار 26.3.11579264 وتأكد من تفعيله بالضغط على المربع الذي بجانبه وستظهر أيقونة التحميل اضغط عليها بجانبه، ثم اضغط على APPLY، وفي حال لم تجد ذلك الإصدار قم بإختيار أحدث إصدار متوفر أو إصدار قريب منه: ثم توجه إلى android/app/build.gradle.kts في مشروعك ثم في جزء android ستجد خاصية باسم  ndkVersion قم بوضع رقم الإصدار الذي قمت بتحميله: ثم تشغيل المشروع من خلال الأوامر التالية: flutter clean flutter pub get cd android && ./gradlew clean && cd .. flutter run
  13. هل تريد تعلم ذلك من خلال الأكاديمية؟ يوجد دروس خاصة بذلك هنا: https://academy.hsoub.com/marketing/core-concepts-of-marketing/ https://academy.hsoub.com/marketing/?show=categories ويوجد كتب لتعلم التسويق:
  14. ما الذي قمت بفعله بالضبط لتفقد المشكلة، وأين وضعت الكود المسؤول عن التوجيه لصفحة الصيانة
  15. يدعم التصدير لمنصات الحواسيب والتي تعمل بأنظمة ويندوز، ماك ولينكس، وأيضًا منصات الهواتف وهما أندرويد و iOS، بالإضافة إلى الويب لتعمل اللعبة من خلال HTML5. أما منصات الكونسول وهي البلايستيشن وإكس بوكس فلا يدعمها بشكل مباشر، ستحتاج إلى الإعتماد على منصات خارجية لتصدير اللعبة لتلك المنصات. ويدعم تطوير ألعاب 2D ويبرع في ذلك، أما ألعاب 3D فيوفر أدوات لتطويرها لكن وبالطبع لا يوجد مقارنة بينه وبين المحركات الرائدة كـ Unity أو Unreal في ذلك، بالتالي مناسب في حال ستقوم بتطوير لعبة بمفردك أو من خلال فريق صغير بسبب سهولة استخدامه وبدون تكلفة.
  16. يجب تهيئة قاعدة البيانات لتخزين حالة الموقع مفتوح أو مغلق من خلال جدول بسيط، عليك تنفيذ الاستعلام التالي لإنشائه من خلال phpMyAdmin: CREATE TABLE IF NOT EXISTS settings ( setting_key VARCHAR(100) PRIMARY KEY, setting_value TEXT ); ثم أضف صفًا لتحديد حالة الصيانة، بقيمة on لتفعيل الإغلاق أو off لإلغاء الإغلاق: INSERT INTO settings (setting_key, setting_value) VALUES ('maintenance_mode', 'off') ON DUPLICATE KEY UPDATE setting_value = VALUES(setting_value); بالطبع من المفترض أن لديك صفحة صفحة الإغلاق maintenance.php أو offline.php، لعرض رسالة للزوار، وفي حال لم يكن لديك، أنشيء الملف البسيط التالي: <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>الموقع تحت الصيانة</title> <style> body { font-family: 'Arial', sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; background-color: #f8f9fa; text-align: center; direction: rtl; } .container { padding: 30px; background-color: #fff; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); } h1 { color: #dc3545; } p { color: #6c757d; } </style> </head> <body> <div class="container"> <h1>عذراً، الموقع تحت الصيانة حالياً</h1> <p>نحن نقوم ببعض التحديثات الضرورية لتحسين تجربتكم. سنعود قريباً!</p> <p>شكراً لتفهمكم.</p> </div> </body> </html> بعد ذلك أنشئ ملف PHP جديد باسم maintenance_check.php في المجلد الرئيسي أو مجلد الإعدادات مثلاً، وسنكتب به سيتصل بقاعدة البيانات ويتحقق من الحالة، ثم يوجه الزائر حسب الحالة: <?php require_once __DIR__ . 'db_connection.php'; //أضف مسار ملف الإتصال بقاعدة البيانات $maintenance_page_url = '/maintenance.php'; if (!isset($pdo) || !$pdo instanceof PDO) { http_response_code(503); header('Location: ' . $maintenance_page_url); exit; } $current_page_url = $_SERVER['REQUEST_URI'] ?? ''; if (strpos($current_page_url, basename($maintenance_page_url)) !== false) { return; } try { $stmt = $pdo->prepare("SELECT setting_value FROM settings WHERE setting_key = 'maintenance_mode' LIMIT 1"); $stmt->execute(); $maintenance_mode_status = $stmt->fetchColumn() ?: 'off'; if ($maintenance_mode_status === 'on') { http_response_code(503); header('Location: ' . $maintenance_page_url); exit; } } catch (PDOException $e) { http_response_code(503); header('Location: ' . $maintenance_page_url); exit; } ?> والآن نحتاج إلى أن يتم تنفيذ maintenance_check.php في بداية كل طلب قبل أي كود HTML أو PHP آخر. أضف السطر التالي في أعلى الملف الرئيسي index.php أي يجب أن يكون أول شيء يتم تنفيذه: <?php require_once __DIR__ . '/maintenance_check.php'; ?>
  17. هل يتم استقبال البيانات من id أم من t ؟ سأفترض أنه الـ id. عامًة لا يتم استخدام PDO، بل دوال mysqli_* القديمة، والأهم يوجد ثغرة SQL Injection واضحة. تستقبل القيمة مباشرًة من المستخدم هنا دون تحويله إلى INT أي رقم صحيح ولا تتحقق من جوده: $id = $_GET['id']; ثم تضع المتغير $id مباشرة في نص الاستعلام، بالتالي أي أحد يستطيع إرسال قيمة مثل 1 OR 1=1 في باراميتر id لسحب كل المحتوى، أو أسوأ من ذلك. $Record = mysqli_query($conn,"SELECT * FROMcontentWHERE id= $id"); أيضًا يتم جلب البيانات إلى المتغير $data باستخدام mysqli_fetch_array($Record), لكن لا يقوم بطباعة أو استخدام أي عمود من البيانات، لذا لا يتم ظهور أي شيء في المتصفح حتى لو نجح الاستعلام. بالإضافة إلى إخفاء الأخطاء في error_reporting(0); ini_set('display_errors', 0) ولن تتمكن من معرفة سبب عدم عمل الكود أثناء التطوير. <?php //تمكين عرض الأخطاء مؤقتاً للتطوير فقط ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); include_once('config.php'); $id = null; $t_is_valid = false; if (isset($_GET['id']) && filter_var($_GET['id'], FILTER_VALIDATE_INT) && $_GET['id'] > 0) { $id = (int)$_GET['id']; } if (isset($_GET['t']) && is_numeric($_GET['t'])) { $t_is_valid = true; } if ($id !== null && $t_is_valid) { if ($conn && $conn instanceof mysqli) { $sql = "SELECT title, content, image_path FROM `content` WHERE id = ?"; $stmt = $conn->prepare($sql); if ($stmt) { $stmt->bind_param("i", $id); $stmt->execute(); $result = $stmt->get_result(); $data = $result->fetch_assoc(); if ($data) { echo "<h1>" . htmlspecialchars($data['title']) . "</h1>"; echo "<div>" . htmlspecialchars($data['content']) . "</div>"; if (!empty($data['image_path'])) { echo "<img src='" . htmlspecialchars($data['image_path']) . "' alt='" . htmlspecialchars($data['title']) . "'>"; } } else { echo "لم يتم العثور على محتوى بالمعرف (ID) المحدد."; } $stmt->close(); } else { echo "خطأ في إعداد الاستعلام: " . htmlspecialchars($conn->error); } $conn->close(); } else { echo "خطأ: مشكلة في الاتصال بقاعدة البيانات."; } } else { header("Location: index.php"); exit; } ?> أضفت htmlspecialchars لحماية مخرجات HTML لمنع ثغرات XSS.
  18. الأمر غير واضح سببه، قم بإرفاق كود الاستعلام لتفقد سبب المشكلة. عامًة استخدم قيمة id صالحة من قاعدة البيانات لديك، وقم بتشغيل الاستعلام التالي مباشرة في أداة مثل phpMyAdmin أو أي عميل SQL آخر، وفي حال لم يقم الاستعلام بإعادة البيانات المتوقعة، فالمشكلة في الاستعلام نفسه أو البيانات في قاعدة البيانات. أو بعد سطر $row = $stmt->fetch(PDO::FETCH_ASSOC) أضف التالي: echo "<pre>"; print_r($row); echo "</pre>"; لعرض محتويات المتغير $row بالضبط، ولو طبع bool(false)، فيعني أنه لم يتم العثور على صف. ولو طبع مصفوفة، فسترى أسماء الأعمدة الفعلية وقيمها، تفقد هل هي مطابقة لقاعدة البيانات أم لا؟
  19. هل أنت مشترك بأحد الدورات، أم تتساءل عن خارطة طريق لتعلم بايثون بمفردك؟ عامًة ستجد مصادر هنا:
  20. ما هي الدورة التي اشتركت بها؟ وهي لديك هاتف فقط؟ وهل تنوي شراء حاسوب أو لابتوب عما قريب؟ عامًة ستجد هنا تفصيل بخصوص طريقة دراسة الدورة: وبخصوص الحفظ ستجد تفصيل هنا:
  21. في حال الدرس خاص بأحد الدروس في الدورات، ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل. إن لم يكن كذلك أرجو التوضيح.
  22. لم يتم فتح التسجيل بعد، سيتم الإعلان عن رابط المنصة من خلال الروابط التي ذكرتها.
  23. الرواد الرقميون Digilians من المفترض أن يتم الإعلان عنها الأسبوع الحال، تابع ذلك من الصفحة الرسمية: https://web.facebook.com/digilians ومن الجروب التالي: https://web.facebook.com/groups/713877594386347/ وسيتم توضيح طريقة التسجيل في المبادرة.
  24. الأساسيات التي أنت بحاجة إلى معرفتها في البداية، أولاً يوجد طريقتين، الأحدث هي استخدام كائنات DateTime, DateTimeImmutable, DateTimeZone, و DateInterval وهي متوفرة منذ إصدار PHP 5.2 وما بعده. وهي الطريقة كائنية التوجه وتتميز بالأفضلية والمرونة خاصًة عند التعامل مع المناطق الزمنية والعمليات المعقدة. أما الطريقة القديمة عن طريق الدوال، date(), time(), strtotime(), mktime(), getdate() فلا تزال تعمل ولكنها أقل مرونة ومربكة في بعض الأحيان مع المناطق الزمنية والتحويلات. أولاً الحصول على التاريخ والوقت الحالي وذلك من خلال واجهة التاريخ DateTime في PHP: <?php $now = new DateTime(); echo $now->format('Y-m-d'); ?> فبشكل إفتراضي يتم إنشاء تاريخ الوقت الحالي، وميثود format نقوم من خلالها بعرض التاريخ. ولو أردت إنشاء تاريخ ووقت محدد: <?php $specificDate = new DateTime('2024-01-15'); $specificDateTime = new DateTime('2023-10-26 14:30:00'); ?> ولو أردنا عرض وتنسيق التاريخ نستخدم ميثود format كما أشرت وتوفر تنسيقات مختلفة قم بتجربة الكود لتتفهم: <?php $date = new DateTime('2025-10-26 15:05:10'); echo $date->format('Y-m-d'); echo $date->format('d/m/Y'); echo $date->format('Y-m-d H:i:s'); echo $date->format('l'); echo $date->format('h:i a'); ?> عامًة إليك شرح للرموز: Y: سنة (4 أرقام) m: شهر (01-12) d: يوم (01-31) H: ساعة (00-23) i: دقيقة (00-59) s: ثانية (00-59) l: اسم اليوم الكامل h: ساعة (01-12) a: صباحاً/مساءً (am/pm) ولو أردت تعديل التاريخ والوقت استخدم ميثود modify: <?php $date = new DateTime('2023-10-26'); $date->modify('+1 day'); echo $date->format('Y-m-d'); $date->modify('-1 month'); echo $date->format('Y-m-d'); ?> ستجد تفصيل هنا في الدرس التالي:
  25. من الممكن تشفير أي شيء بواسطة برامج الفدية، الفكرة هو النظام والفئة المستهدفة، وبخصوص طرق الإختراق فمنها استغلال ثغرات التطبيقات ، حيث العديد منها خاصة تلك التي ليست من مطورين كبار أو غير محدثة تحتوي على ثغرات أمنية. الهندسة الاجتماعية من خلال التصيد الاحتيالي Phishing أو إنشاء تطبيقات تبدو مفيدة أو ألعاب، ولكنها تحتوي على كود خبيث. يتم نشرها غالبًا خارج متجر Google Play وتتطلب إقناع المستخدم بتثبيتها يدويًا وتفعيل صلاحية مصادر غير معروفة في النظام للتثبيت، أو إرسال رسائل تحتوي على روابط تؤدي إلى تحميل برمجيات خبيثة أو مواقع تصيد. هجمات الشبكة بتنفيذ منهجية الوسيط Man-in-the-Middle - MitM على شبكات Wi-Fi غير الآمنة، لإعتراض وتعديل حركة المرور من وإلى الجهاز في حال لم تكن مشفرة بشكل صحيح بواسطة بروتكول HTTPS، أو هجوم التسميم DNS (DNS Spoofing) بتوجيه المستخدم إلى خوادم خبيثة عند محاولته الوصول إلى مواقع معينة. تطوير حمولات مخصصة Custom Payloads بكتابة برمجيات خبيثة أو حمولات مخصصة تتجنب الكشف من قبل برامج الحماية، أو استخدام تقنيات التشفير، التعتيم Obfuscation، والحقن في تطبيقات شرعية لجعل الكشف أصعب. والأسهل لو لديك وصول مادي للجهاز، ستستخدم أدوات مثل ADB في حال خاصية تصحيح USB مفعلة، أو محاولة استغلال ثغرات في شاشة القفل، أو استخدام أدوات الاسترداد الجنائي للبيانات. تلك الطرق المعروفة فقط والتي تم اكتشافها من قبل باحثين أمنين ولا يعني جميعها، ولو بحثت عن أداة (Pegasus (spyware التي طورتها شركة NSO Group الإسرائيلية ستجد أنها تُعتبر واحدة من أكثر أدوات التجسس السيبراني تقدمًا، وهدفها الإختراق والتجسس على أشخاص ذو قيمة مرتفعة وهم رؤساء دول وغيرهم كسياسيين، صحفيين، ونشطاء. وتعتمد على اختراق الأجهزة دون الحاجة إلى تفاعل المستخدم وذلك ما يُعرف بـ zero-click exploits فبمجرد اختراق الجهاز، يمكنها جمع البيانات مثل الرسائل، المكالمات، الصور، وتفعيل الميكروفون أو الكاميرا عن بُعد.
×
×
  • أضف...