-
المساهمات
15452 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
403
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Mustafa Suleiman
-
من البرامج المجانية لذلك هي Canva حيث توفر قوالب خطط عمل قابلة للتخصيص مع واجهة سهلة الاستخدام. أيضًا لديك Google Docs/Sheets/Slides لإنشاء خطة عمل احترافية باستخدام القوالب أو من البداية. نسخة الويب من Microsoft Word/Excel/PowerPoint مجانية وتستطيع تنفيذ ذلك من خلالها. لديك أيضًا LivePlan يقدم فترة تجريبية مجانية تسمح لك بإنشاء خطة عمل كاملة. بالنسبة للبرامج المدفوعة، يوجد Business Plan Pro يوفر مجموعة شاملة من الميزات لإنشاء خطط عمل احترافية، بما في ذلك القوالب والأمثلة والنصائح. بالإضافة إلى Enloop أداة سهلة الاستخدام لإنشاء خطط عمل، مع ميزة التنبؤ المالي التلقائي. و StratPad أيضًا أداة مرئية لإنشاء خطط عمل، مع التركيز على استراتيجية العمل. للمزيد لديك PlanGuru وStratPad.
- 1 جواب
-
- 1
-
-
في الإختبار يتم قياس مدى الاستيعاب لما تم شرحه ومدى الاستيعاب لما تم تنفيذه في التطبيقات العملية، بالتالي الإعتماد على جوجل غير مُصرح به. لن يتم سؤالك في جميع الأمور النظرية، بل الجانب العملي والأمور المتعلقة به لها النصيب الأكبر. في بداية تعلمك الاستيعاب والحفظ مهمين ثم التطبيق العملي لتوظيف ما تعلمتيه وتثبيته، ولا مشكلة بعد ذلك لو نسيتي بعض الأمور، ففور سؤالك عن أمر معين ستتذكري تلك الدالة لأنك قمتي بالتطبيق عليها واستوعبتي طريقة عملها وحفظتي ذلك سابقًا. ولا أقصد حفظ كل لغة البرمجة، بل أقصد استيعاب وحفظ ما ستقومين استخدامه بكثرة خاصًة الأساسيات، ولا مشكلة بعد ذلك لو نسيتي بعض الأمور، لكن هناك أساسيات لا يُعقل أن يتم نسيانها عند الإختبار. ستجدي تفصيل أكثر هنا:
-
أرجو توضيح متى تحدث معك المشكلة لمساعدتك بشكل أفضل فعند زيارة الرابط كان يعمل بشكل سليم
-
يعمل بشكل سليم، قم بحذف الكاش من خلال: php artisan optimize:clear
- 14 اجابة
-
- 1
-
-
ليست نفس المشكلة، لديك حاليًا مسار student.edit غير معرف، عليك تعريفه بنفس الكيفية التي تم شرحها سابقًا في التعليقات
-
بسبب إنشاء Promise داخل مكون عميل Client Component باستخدام fetchProperty داخل useEffect. للتوضيح، مكونات العميل و SSR في Next.js، يتم تشغيل مكونات العميل (المُعلّمة بـ "use client") في المتصفح، بينما تشغيل مكونات الخادم Server Components على الخادم. بالتالي عندما تستخدم async/await داخل مكون عميل، فأنت تحاول بشكل أساسي إيقاف تنفيذ JavaScript على الخادم أثناء انتظار اكتمال الوعد، وذلك غير ممكن لأن مكونات العميل لا يتم تنفيذها على الخادم. أيضًا تستخدم React مفهوم "Suspense" للتعامل مع الحالات غير المتزامنة (مثل جلب البيانات). إذن عند مواجهة React مكونًا في حالة "suspended" (أي في انتظار وعد)، فإنه ينتظر حتى يتم حل ذلك الوعد قبل عرض المكون، ولكن الطريقة التي تستخدم بها async/await في الكود لا تتكامل بشكل صحيح مع آلية Suspense في React. وعند إزالة async، فإن fetchPropertyData تصبح دالة عادية لا تُرجع وعدًا، وبالتالي، لا يكون هناك انتظار للوعد، ويصبح تنفيذ الكود متزامنًا. أي أنّ React لا يواجه أي مكونات في حالة "suspended"، وبالتالي لا يتم طرح أي خطأ. لذا إما حذف async من المكون وإخبار Next.js أنك تقوم بإرجاع عناصر JSX، وترك الأمر لخطاف useEffect لتولي الأمر، كالتالي: "use client" import React, { useEffect, useState } from "react"; import Link from "next/link"; import { useParams } from "next/navigation"; import { FaArrowLeft } from 'react-icons/fa'; import { fetchProperty } from "@/utils/requests"; const PropertyPage = () => { const [property, setProperty] = useState(null) const [loading, setLoading] = useState(true) const { id } = useParams() useEffect(() => { const fetchPropertyData = async () => { if (!id) return try { const property = await fetchProperty(id) setProperty(property) } catch (error) { console.error('Error fetching property', error) } finally { setLoading(false) } if (property === null) { fetchPropertyData() } } fetchPropertyData() // نقوم هنا بنداء الدالة مباشرًة }, [id, property]) return ( // باقي الكود ); }; export default PropertyPage; أو نقل جلب البيانات إلى مكون خادم بإنشاء مكون خادم (بدون "use client") لجلب البيانات باستخدام fetchProperty، ثم مرر البيانات ك props إلى مكون العميل PropertyPage.
- 2 اجابة
-
- 1
-
-
الإجابة على مثل ذلك السؤال ستضرك أكثر من نفعها، أنت لم تحدد سوق العمل الذي ترغب بالعمل به، تحديد الإجابة بشكل عام أمر غير صحيح. فهناك أسواق بحاجة إلى React Native وأخرى إلى Flutter، لذا ما هو سوق العمل الذي ترغب به، عليك تفقد الوظائف التي يتم عرضها وما هو المطلوب لتستطيع تحديد ما ستقوم بتعلمه. على مواقع العمل الحر ستجد أن Flutter أكثر طلبًا بالطبع بسبب استقرار ذلك الإطار وسهولة وسرعة تطوير المشاريع من خلاله، أيضًا تكلفة تطوير المشروع من خلاله أقل من React Native، لكن React Native أصعب في عملية التطوير بسبب مشاكل التعامل مع مكتبات مختلفة والتوافقية بينهم.
-
هناك أمر هام يجب تفهمه، وهو أنك كمطور واجهة خلفية مسؤوليتك هي إنشاء الـ API لكي يتم استخدامها من قبل مطور الواجهة الأمامية. أيضًا استخدام API's لخدمات خارجية مثل بوابات الدفع payment gateways، ومواقع التواصل مثل فيسبوك و منصة x. أو المنصات السحابية مثل AWS و Google Cloud، أو إرسال الرسائل باستخدام واجهات برمجة التطبيقات مثل Twilio أو SendGrid لإرسال رسائل SMS أو بريد إلكتروني، أو خرائط جوجل. أي مطور الواجهة الخلفية يُهيئ الـ API بإنشاء نقطة نهاية (endpoint) تتيح لواجهة المستخدم التفاعل مع خدمة خارجية مثل Twilio أو SendGrid أو Google Maps. وكل ذلك سيتم شرحه بدورة PHP بالفعل.
-
بشكل مُختصر فكر في المنحة على أنها مسابقة، لذا اجعل من نفسك شخص تنافسي مميز عن الأغلبية. أغلب المنح ستجد أنها تتطلب معدل لا يقل عن 80% من البكالوريس، مثلاً في تركيا لديك منحة علي كوشتشو للعلوم والتكنولوجيا، وكلما إرتفع المُعدل كان لك الأفضلية بالطبع ولكنه ليس العامل الوحيد. لديك العمل التطوعي، مثل العمل في جمعيات خيرية أو تطوعات في الجامعة أو المدرسة وهكذا، مثل تلك الأمور يتم النظر إليها عند التقدم، وذلك ستضعه في خطاب الدوافع أو الغرض statement، ستذكر به محاسنك مثل الجوائر التكريمية والتطوعات وخلافه مثل خطاب التوصية. أيضًا بعد ذلك مباشرًة هو إيجادتك للغة الإنجليزية بمستوى تستطيع به التحدث والكتابة بشكل جيد، أي يكون لدى المشاركين الحد الأدنى من مستوى اللغة الإنجليزية في اختبار IELTS 3.5 أو ما يعادله، وأعلى مستوى في اللغة الإنجليزية للبرنامج هو IELTS 5.0 أو ما يعادله. وسيظهر ذلك جليًا في استمارة المنحة Application التي ستقوم بكتابتها للتقدم إليها. ولزيادة فرصك في الحصول على منحة عليك التقديم على كافة المنح التي تستوفي شروطها بغض النظر عن البلد. وهناك معلومة طريفة، وهي أنّ عدد المنح الدراسية الموجودة في العالم أكثر من عدد المتقدمين لتلك المنح! وذلك راجع إما لعدم المعرفة بوجودها بسبب قلة البحث أو التكاسل وخلافه، هناك منح لا يحصل عليها أحد unclaimed لأنه لم يتم التقدم إليها! لذا لديك مواقع مثل فرصة و مرجع توفر لك تفاصيل كاملة عن المنح التي يتم الإعلان عنها، لديك أيضًا Scholarships.com.
-
الأمر يتم من خلال PHP و HTML و JavaScript معًا. أولاً نقوم بإنشاء حقل الاختيار Select للجنس: <label for="gender">الجنس:</label> <select id="gender" name="gender"> <option value="">اختر الجنس</option> <option value="male">ذكر</option> <option value="female">أنثى</option> </select> ثم إنشاء حقول الوظائف (مخفية في البداية): <div id="maleJobs" style="display: none;"> <label for="maleJob">الوظيفة (للذكور):</label> <select id="maleJob" name="maleJob"> <option value="">اختر الوظيفة</option> <option value="engineer">مهندس</option> <option value="doctor">طبيب</option> <option value="teacher">مدرس</option> </select> </div> <div id="femaleJobs" style="display: none;"> <label for="femaleJob">الوظيفة (للإناث):</label> <select id="femaleJob" name="femaleJob"> <option value="">اختر الوظيفة</option> <option value="nurse">ممرضة</option> <option value="teacher">مدرسة</option> <option value="designer">مصممة</option> </select> </div> هنا يأتي دور JavaScript لإظهار حقل الوظائف المناسب: <script> const genderSelect = document.getElementById('gender'); const maleJobsDiv = document.getElementById('maleJobs'); const femaleJobsDiv = document.getElementById('femaleJobs'); genderSelect.addEventListener('change', function() { if (this.value === 'male') { maleJobsDiv.style.display = 'block'; femaleJobsDiv.style.display = 'none'; } else if (this.value === 'female') { maleJobsDiv.style.display = 'none'; femaleJobsDiv.style.display = 'block'; } else { maleJobsDiv.style.display = 'none'; femaleJobsDiv.style.display = 'none'; } }); </script> حيث ستعمل addEventListener على تنفيذ دالة عند تغيير قيمة حقل الجنس، داخل الدالة، نتحقق من قيمة حقل الجنس ونعرض حقل الوظائف المناسب باستخدام style.display = 'block'. نخفي حقل الوظائف الآخر باستخدام style.display = 'none'. بالطبع ستحتاج إلى إرسال البيانات من خلال النموذج إلى السيرفر ثم معالجتها في PHP.
- 13 اجابة
-
- 1
-
-
توجد أكثر من طريقة، وأولهم استخدام ملفات لكل لغة. عليك أولاً إنشاء ملفات منفصلة لكل لغة تريد دعمها، مثل ar.php للغة العربية و en.php للغة الإنجليزية. داخل كل ملف لغة، قم بتخزين الترجمات كمصفوفة ترابطية، حيث يكون المفتاح هو النص الأصلي والقيمة هي الترجمة. للتوضيح: <?php return [ 'Welcome' => 'أهلاً بك', 'Login' => 'تسجيل الدخول', ]; ?> في سكربت PHP الرئيسي، قم بتحميل ملف اللغة المناسب حسب لغة المستخدم، وتستطيع الإعتماد على متغير $_SERVER['HTTP_ACCEPT_LANGUAGE'] لتحديد لغة متصفح المستخدم. <?php $lang = isset($_SESSION['lang']) ? $_SESSION['lang'] : 'en'; $translations = require_once "languages/$lang.php"; ?> ثم استخدم المفتاح من المصفوفة لعرض الترجمة المقابلة. <?php echo $translations['Welcome']; ?> وسيعرض "أهلاً بك" لو كانت لغة المستخدم هي العربية. الطريقة الثانية الإعتماد على قاعدة البيانات، بإنشاء جدول في قاعدة البيانات لتخزين الترجمات، ويجب أن يحتوي الجدول على حقول للنص الأصلي، واللغة، والترجمة. لكن الطريقة الأفضل والإحترافية هي باستخدام مكتبة Gettext الموجودة في PHP، ستعمل على إنشاء ملفات PO (Portable Object) لكل لغة تريد دعمها، حيث تحتوي ملفات PO على النص الأصلي والترجمة. ثم تحويل ملفات PO إلى ملفات MO (Machine Object) باستخدام الأمر msgfmt، بعد ذلك استخدم دوال Gettext لتحميل الترجمات من ملفات MO وعرضها.
-
ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم الأسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
- 1 جواب
-
- 1
-
-
ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم الأسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
-
خلال دورة تطوير واجهات المستخدم يتم التطرق إلى الأساسيات أولاً للتالي HTML, CSS,JS و مكتبةjQuery، ثم خلال المشاريع يتم التطرق إلى أمور متقدمة بالإضافة للأساسيات. لذا بعد الإنتهاء ستجد أنه تم شرح نسبة كبيرة من اللغات السابقة. لكن هل تكتفي بذلك؟ حقيقًة الفرق بين مبرمج متميز ومبرمج عادي هو الرغبة في تعلم المزيد وبذل مجهود وعدم الإكتفاء، لأكون صريحًا معك لا توجد دورة توفر لك كل شيء، ستحتاج إلى البحث والمشاهدة والقراءة عن المزيد والتعمق فيما يتم شرحه وليس الإكتفاء بالشرح فقط. أتفهم الرغبة في إنهاء الدورة بشكل سريع، لكن ما الفائدة؟ الفائدة تكمن في زيادة مستواك وخبراتك بما ذكرت وتوظيف ذلك في نماذج وتطبيقات عملية لفهم كيف آلية عملها وما الفرق بين الخواص المختلفة وهكذا. بالطبع لا أطلب منك فهم كل ما هو موجود في موسوعة حسوب، لكن تفقد الخواص المتاحة وماذا تفعل وتعلم البعض منها وهكذا
-
غالب الظن أنك تقوم بتعديل ملف تهجير موجود مسبقًا بدلاً من إنشاء ملف جديد، بمعنى لإنشاء جدول جديد أو تعديل جدول موجود، يجب عليك دائمًا إنشاء ملف تهجير جديد، لا تقم بتعديل ملفات التهجير الموجودة مسبقًا. وإن قمت بتعديل ملف تهجير موجود مسبقًا، فلن يتم تطبيق التغييرات، لأن لارافل تحتفظ بسجل بالتغييرات التي تم إجراؤها على قاعدة البيانات. لذا، لو قمت بتعديل ملف تهجير موجود مسبقًا، فلن يتم تطبيقه لأن لارافل تعتقد أنه تم تطبيقه بالفعل.
-
تخيل معي لو حصل المهاجم على ملف تعريف ارتباط الجلسة Cookie للمستخدم أو بيانات الاعتماد الخاصة به، سيتمكن من انتحال شخصية المستخدم وإجراء طلبات نيابة عنه وذلك هجوم Session Hijacking، بالتالي المصادقة القائمة على الرموز تجعل من الصعب على المهاجمين اختطاف الجلسة، حيث يحتاجون إلى الحصول على الرمز أيضًا. بالإضافة إلى هجمات CSRF، حيث تساعد المصادقة من خلال الـ Token منع هجمات تزوير الطلبات عبر المواقع (CSRF)، حيث يخدع المهاجم متصفح المستخدم لإجراء طلبات غير مصرح بها إلى الخادم. ويصبح من الصعب على الخادم تتبع المستخدمين النشطين وإدارة جلساتهم أيضًا من خلال الرمز، لا يحتاج الخادم إلى إعادة المصادقة على المستخدم لكل طلب، والتعامل مع المزيد من الطلبات دون الحاجة إلى إعادة المصادقة على المستخدمين، مما يقلل من الحمل على الخادم ويحسن الأداء. ولا يحتاج الخادم أيضًا إلى الاحتفاظ بمعلومات الجلسة لكل مستخدم، ويستطيع المستخدمين الوصول إلى التطبيق من أجهزة أو جلسات متعددة دون الحاجة إلى إعادة المصادقة. بجانب أنه بإمكانك إلغاء الرموز أو إنهاء صلاحيتها، مما يسمح بالتحكم الدقيق في الوصول إلى التطبيق للمساعدة يساعد في تقليل مخاطر سرقة الـ Tokens، حيث يمكن إلغاء الـ Access Token المسروق دون الحاجة إلى تسجيل خروج المستخدم. ناهيك عن استخدام الرموز لتتبع نشاط المستخدم وتوفير سجل تدقيق أكثر تفصيلاً.
-
من خلال دالة onSubmit كالتالي: import { IonMenuButton, IonHeader, IonTitle, IonToolbar, IonButtons, IonGrid, IonRow, IonCol, IonCard, IonCardHeader, IonCardTitle, IonButton, IonLoading, IonContent, IonCardSubtitle, useIonAlert, IonAlert, } from "@ionic/react"; import { IonPage } from "@ionic/react"; import "../css/event.css"; import axios from "../config/axios"; //جلب المعلومات import { CREATE_EVENT_URL, EVENTS_URL } from "../config/urls"; import { useContext, useEffect, useState } from "react"; import { AuthContext } from "../context/AuthContext"; //import { Storage } from "@capacitor/storage"; //import { useHistory } from "react-router"; import React from "react"; const Events = () => { const [showLoading, setShowLoading] = useState(false); const [posts, setPosts] = useState([]); const [title, setTitle] = useState(""); const [description, setDescription] = useState(""); const [price, setPrice] = useState(""); const [presentAlert] = useIonAlert(); const { jwt } = useContext(AuthContext); useEffect(() => { getEvent(); }, []); const onSubmit = async () => { const postData = new FormData(); postData.append("title", title); postData.append("description", description); postData.append("price", price); try { await axios .post(CREATE_EVENT_URL, postData, { headers: { Authorization: jwt, }, }) .then((res) => { console.log("Event created successfully:", res.data); setTitle(""); setDescription(""); setPrice(""); getEvent(); }); } catch (e) { console.error("Error creating event:", e.response ? e.response.data : e); } }; const getEvent = async () => { setShowLoading(true); try { await axios .get(EVENTS_URL, { headers: { Authorization: jwt, }, }) .then((res) => { console.log("Events fetched successfully:", res.data.getEvent); setPosts(res.data.getEvent); setShowLoading(false); }); } catch (e) { console.error("Error fetching events:", e.response ? e.response.data : e); setShowLoading(false); } }; return ( <IonPage id="main-content"> {showLoading && <IonLoading isOpen={showLoading} duration={1000} />} {!showLoading && ( <> <IonHeader> <IonToolbar color="primary"> <IonTitle>صفحة المناسبات</IonTitle> <IonButton fill="clear" slot="end" color="tertiary" routerLink="/login" > مرحبا </IonButton> <IonButtons slot="start"> <IonMenuButton></IonMenuButton> </IonButtons> </IonToolbar> </IonHeader> <IonContent> <IonGrid> <IonRow> <div className="col-center"> <IonCol sizeLg="4"> <IonCard className="edit-card"> <IonCardHeader> <IonCardTitle color="primary"> شارك مناسبتك الخاصة! </IonCardTitle> <IonButton id="present-alert" color="primary"> انشاء مناسبة </IonButton> <IonAlert trigger="present-alert" header="اضافة مناسبة" buttons={[ { text: "إلغاء", role: "cancel", cssClass: "secondary", }, { text: "موافق", handler: () => { onSubmit(); }, }, ]} inputs={[ { name: "title", placeholder: "العنوان", value: title, onIonChange: (e) => setTitle(e.target.value), }, { name: "price", type: "number", placeholder: "السعر", min: 1, max: 100, value: price, onIonChange: (e) => setPrice(e.target.value), }, { name: "description", type: "textarea", placeholder: "التفاصيل", value: description, onIonChange: (e) => setDescription(e.target.value), }, ]} ></IonAlert> </IonCardHeader> </IonCard> </IonCol> </div> </IonRow> </IonGrid> <IonGrid> <IonRow className="col-edit"> <IonCol> {posts.length > 0 ? ( posts.map((post) => ( <IonCard key={post.id}> <IonCardHeader> <IonCardTitle color="secondary"> {post.title} </IonCardTitle> <IonCardSubtitle>{post.price}$</IonCardSubtitle> </IonCardHeader> <IonButton color="primary" onClick={() => presentAlert({ header: "تفاصيل المناسبة", subHeader: "قم بتسجيل الدخول وسارع بالحجز", message: `${post.description}`, buttons: ["اغلاق"], }) } className="btn-edit" id="present-alert" > احجز الان </IonButton> </IonCard> )) ) : ( <IonCard> <IonCardHeader> <IonCardTitle color="secondary"> لا توجد مناسبات </IonCardTitle> </IonCardHeader> </IonCard> )} </IonCol> </IonRow> </IonGrid> </IonContent> </> )} </IonPage> ); }; export default Events; قمت بتغيير const [post, setPosts] = useState("") إلى const [posts, setPosts] = useState([]) أ] وضع مصفوفة كقيمة إفتراضية. لأن ذلك يسمح بتخزين مجموعة من الأحداث التي تم جلبها من API في متغير posts، بدلاً من تخزين حدث واحد فقط، واستخدام المصفوفة posts ضروري لعرض قائمة من الأحداث بشكل صحيح. ثم استخدمت الدالة posts.map للتكرار على عناصر المصفوفة posts وعرض IonCard لكل حدث على حدة لضمان عرض جميع الأحداث التي تم جلبها من API. بعد ذلك ضبط معالجات الأحداث onIonChange لحقول النموذج (title و price و description) بشكل صحيح، لتحديث قيم تلك الحقول في حالة تغييرها من قبل المستخدم. وبعد إنشاء حدث جديد، يتم استدعاء الدالة getEvent() مرة أخرى من أجل تحديث قائمة الأحداث المعروضة وإظهار الحدث الجديد الذي تم إنشاؤه. مع إضافة معالجة أساسية للأخطاء في الدالتين onSubmit و getEvent لعرض رسائل خطأ واضحة للمستخدم في حالة حدوث أي مشكلة. واستخدام العرض الشرطي لعرض قائمة الأحداث (posts.length > 0) أو رسالة "لا توجد مناسبات" إن لم تكن هناك أحداث.
- 2 اجابة
-
- 1
-
-
قبل تدريب النموذج، تحتاج إلى تحويل الصور إلى بيانات رقمية ليتمكن للنموذج من فهمها، وذلك عبر تحويل كل صورة إلى مصفوفة أرقام، حيث يمثل كل بكسل في الصورة قيمة رقمية. وطالما أنك قمت بتحميل الـ Data set من Kaggle إذن تلك البيانات Labeled، وتتوفر عدة طرق ونماذج يمكن استخدامها لتصنيف الصور واستخراج الـ features، لكن أشهرها وأكثرها فعالية هي الشبكات العصبية العميقة (Deep Neural Networks)، وخاصة الشبكات العصبية التلافيفية (Convolutional Neural Networks - CNNs) التي تُستخدم بكثرة في تحليل الصور. وتحتاج إلى تجهيز البيانات قبل إدخالها في النموذج، وذلك يتضمن: تغيير حجم الصور بحيث تكون كلها بنفس الأبعاد. تطبيع الصور (Normalization) لتسريع عملية التدريب. تقسيم البيانات إلى مجموعات تدريب وتحقق validation واختبار. ولو تستخدم الشبكات العصبية التلافيفية (CNNs)، فتستطيع استخدام مكتبات مثل TensorFlow أو PyTorch لبناء النموذج. للتوضيح إليك مثال مبسط لبناء نموذج CNN باستخدام Keras (واجهة برمجية لـ TensorFlow): from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense model = Sequential([ Conv2D(32, (3, 3), activation='relu', input_shape=(height, width, channels)), MaxPooling2D((2, 2)), Conv2D(64, (3, 3), activation='relu'), MaxPooling2D((2, 2)), Flatten(), Dense(128, activation='relu'), Dense(1, activation='sigmoid') # لأن لديك فئتين فقط: رجل أو امرأة ]) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) وتستطيع تدريب النموذج باستخدام بيانات التدريب: model.fit(train_images, train_labels, epochs=10, validation_data=(validation_images, validation_labels)) بعد التدريب، بإمكانك تقييم النموذج باستخدام بيانات الاختبار: test_loss, test_acc = model.evaluate(test_images, test_labels) print(f'Test accuracy: {test_acc}') وللعلم، بدلاً من البدء من الصفر تستطيع استخدام نموذج مُدرب بالفعل والبناء عليه مثل VGG16 و ResNet50 وهي شبكات عصبية ضخمة تم تدريبها على ملايين الصور لتمييز آلاف الأشياء (حيوانات، سيارات، أشكال، ألوان، ...إلخ)، وتلك الشبكات أصبحت خبيرة في استخراج الـ Features الهامة من الصور. أي نزيل الطبقات الأخيرة المسؤولة عن التصنيف النهائي، ونحتفظ بالطبقات الأولى التي تعلمت استخراج الـ Features الهامة من الصور.
- 2 اجابة
-
- 1
-
-
بالإضافة إلى الطرق السابق، هناك طريق مختلفة لتنفيذ المطلوب. مثلاً باستخدام خوارزمية "فرّق تسُد" Divide and Conquer، حيث تقوم الخوارزمية بتقسيم المصفوفة إلى نصفين بشكل متكرر، ثم إيجاد أكبر قيمة في كل نصف، ثم مقارنة القيمتين الأكبر من كل نصف لإرجاع القيمة الأكبر في المصفوفة بأكملها. وهي تعتبر أكثر كفاءة من الطرق المذكورة سالفًا، خاصةً مع المصفوفات الكبيرة، حيث أن تعقيدها الزمني هو O(n log n) بدلاً من O(n) للطرق السابقة. أولاً داخل دالة بأي اسم نضع لها ثلاث معاملات: arr: المصفوفة التي نبحث فيها عن أكبر قيمة. left: مؤشر بداية الجزء الحالي من المصفوفة. right: مؤشر نهاية الجزء الحالي من المصفوفة. و تقومين بتقسيم المصفوفة إلى نصفين بشكل متكرر حتى تصل إلى عناصر فردية ثم تقارني أكبر قيمة من النصف الأيسر والأيمن وتُرجع القيمة الأكبر. ولنضع شرط لو كان المؤشر left يساوي المؤشر right، فيعني أننا وصلنا إلى جزء من المصفوفة يحتوي على عنصر واحد فقط، وهنا نُرجع قيمة ذلك العنصر (arr[left])، لأنه أكبر قيمة في هذا الجزء. ثم حساب منتصف المصفوفة بجمع left و right ثم القسمة على 2. بعد ذلك استدعاء الدالة بشكل متكرر للنصف الأيمن، ثم مقارنة أكبر قيمة من النصف الأيسر والأيمن وإرجاع الأكبر. في الدالة main، نقوم بإنشاء مصفوفة arr تحتوي على الأرقام، وتستدعي الدالة findMaxRecursively لإيجاد أكبر قيمة في المصفوفة، بالطبع عليك تمرير arr.size() - 1 كمؤشر نهاية المصفوفة لأن arr.size() تُرجع عدد العناصر في المصفوفة، بينما تبدأ عملية فهرسة عناصر المصفوفة من الصفر.
- 3 اجابة
-
- 1
-
-
ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم الأسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
-
من الأفضل الإعتماد على async/await لتجنب مثل تلك المشاكل، أي بدلاً من استخدام setTimeout بشكل متكرر داخل دالة textTypingEffect، تقوم باستخدام Promise واحدة فقط لكل نص ونستخدم await لانتظار مرور الوقت المحدد بين كل حرف. const landingHeader = document.querySelector(".landing__header"); const landingParagraph = document.querySelector(".landing__paragraph"); const landingHeaderText = "Iam Mustapha"; const landingParagraphText = "Full Stack Developer"; async function textTypingEffect(element, text, time) { element.textContent = ""; / for (let i = 0; i < text.length; i++) { element.textContent += text[i]; await new Promise((resolve) => setTimeout(resolve, time)); } } async function startTyping() { await textTypingEffect(landingHeader, landingHeaderText, 35); await textTypingEffect(landingParagraph, landingParagraphText, 5); } startTyping(); قمت بتبسيط الأمر باستخدام حلقة for واحدة داخل textTypingEffect، وأصبح الكود أكثر وضوحًا من خلال فصل التأخير الزمني عن عملية إضافة الحروف. وتم تحسين الأداء بشكل طفيف من خلال استخدام Promise واحدة فقط لكل نص بدلاً من إنشاء Promise جديدة لكل حرف.
-
لنقم بالأمر من البداية، من خلال تحديد الجنس الحقل في نموذج HTML باستخدام قيمًا محددة لكل خيار. <select name="gender"> <option value="male">ذكر</option> <option value="female">أنثى</option> </select> في ملف PHP الذي يعالج بيانات الفورم والذي تقوم بإرسال البيانات إليه من خلال سمة action، عليك استخدام عبارة if للتحقق من قيمة حقل الجنس وتعيين القيمة المناسبة لمتغير جديد، ثم إدخال تلك البيانات في قاعدة البيانات: <?php $gender = $_POST['gender']; if ($gender == 'male') { $genderValue = 10; } elseif ($gender == 'female') { $genderValue = 5; } else { $genderValue = 0; } $sql = "INSERT INTO applicants (name, email, gender_value) VALUES ('$name', '$email', '$genderValue')"; ?> في صفحة عرض البيانات، تقوم باسترداد قيمة gender_value من قاعدة البيانات وعرضها في الجدول.
-
بالطبع يتم شرح ذلك فهي من ضمن أساسيات علوم الحاسوب، ستجد مسار كامل باسم الخوارزميات وبنى المعطيات ويتم به شرح ما يلي: بنى المعطيات: المصفوفات Arrays القوائم المترابطة Linked Lists المكادس Stacks الأرتال Queues الأشجار الثنائية Binary trees أشجار البحث الثنائية Binary search tree جدول التقطيع Hash table تحليل الخوارزميات: التعرف على الخوارزميات تحليل الخوارزميات Algorithms analysis القوة الغاشمة Brute force الخوارزميات الجشعة Greedy algorithms التعاودية Recursion والبرمجة الديناميكية خوارزميات البحث والترتيب: خوارزمية البحث الخطي Linear Search خوارزمية البحث الثنائي Binary Search خوارزمية الترتيب بالفقاعات Bubble Sort خوارزمية الترتيب بالتحديد Selection Sort خوارزمية الترتيب بالإدراج Insertion Sort خوارزمية الترتيب بالدمج Merge Sort خوارزمية الترتيب السريع Quick Sort الخوارزميات الرياضية مثل الجذر التربيعي والتكعيبي والأعداد الأولية. خوارزميات الرسوم البيانية: الرسم البياني Graph تمثيل الرسوم البيانية بطريقة المصفوفة المجاورة Adjacency Matrix تمثيل الرسوم البيانية بطريقة القائمة المجاورة Adjacency List خوارزمية كروسكال Kruskal خوارزمية ديكسترا Dijkstra خوارزمية بيلمان-فورد Bellman-Ford
-
لا يعني ذلك، سيتم الرد عليك لا تقلق بخصوص ذلك، أحيانًا يوجد ضغط على مركز المساعدة، لذا أرجو الإنتظار لبعض الوقت، شكرًا لتفهمك.