-
المساهمات
5226 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
52
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Adnane Kadri
-
أظنك تقصد Laravel pennant فهي الحزمة التي توفرها لارافيل لدعم فكرة feature flags أو رايات الميزة أو تدعى أحيانا تبديلات الميزة feature toggls. وهي ببساطة طريقة لتضمين ميزات معينة ضمن التطبيق لمجموعة محددة من الجمهور دون الحاجة لتغييرها فعليا لكامل جمهور التطبيق. مثال: تريد نشر تصميم معين للتطبيق وتريد من فئة معينة فقط اختباره وتجربته. تكون هاته الفكرية عملية في التطبيقات التي تتوقع توسعا كبيرا، أين يتم التوسع في الميزات تدريجيا .. خصوصا في التطبيقات التي تنتهج فلسفات Agile لتقديم نسخ مصغرة MVPs من الميزات التي تنشرها تباعا .. أين يتم نشر النموذج الأولي من الميزة لمجموعة معينة ضمن الجمهور المستهدف، ثم بعد اختبار تجارب الاستخدام او الحصول على التقييمات والآراء feedback يتم نشر وتعميم هاته الميزة بشكل نهائي. مثال جيد آخر هو ما تستعمله المواقع الكبيرة من مثل فيسبوك، فحينما تقوم -مثلا- بنشر طريقة تفاعل جديدة تقوم بتقديمها لجمهور معين ثم تقوم بعد ذلك بالتوسع في نشرها. في لارافيل، توجد هاته الحزمة لتقدم حلا استثنائيا بميزات عدة لمقاربة هاته الفكرة والتحكم فيها. بالنسبة لتطبيقك، فسيمكن نعم دعم هاته الفكرة بغض النظر عما تكونه هاته الميزات، سيمكن لصنف المستخدم الأول نشر وانشاء الميزات وللثاني تعميمها على كامل أصناف مستخدمي التطبيق.
- 3 اجابة
-
- 1
-
-
حاول تجاوز الخاصية white-space لعنصر الفقرة التي تحتوي النص. <section class="price"> @foreach (HomePageHelper::x() as $u) <p style="text-align: center; white-space: normal;">{{ $u->price }}</p> @endforeach </section> هذا هو السلوك الافتراضي غالبا، ولكن الذي يحدث يعني أنه يتم تجاوز هاته الخاصية بمكان ما.
- 12 اجابة
-
- 1
-
-
ممتاز، اذن كل شيء يعمل بشكل صحيح، يبدوا أن القيم المخزنة هي يالفعل المعروضة. يبدوا أيضا أنك تستعمل حزمة laravel-translatble من spatie ولذلك يتم مباشرة إعادة الترجمة الموافقة للغة الحالية. الناتج: قم بتعديل هاته القيم بما يليق في قاعدة البيانات وستظهر لك بشكل عادي. لا يوجد أي مشكلة في الشيفرة والنتيجة.
- 12 اجابة
-
- 1
-
-
حاول طباعة خرج التابع x داخل ملف العرض: @php dd(HomePageHelper::x()); @endphp <section class="price"> @foreach (HomePageHelper::x() as $u) <p style="text-align: center">{{ $u->price }}</p> @endforeach </section> التقط لنا صورة للنتيجة. كيف هو خرج هذا التابع؟
- 12 اجابة
-
- 1
-
-
قم أولا بترتيب الشيفرة لديك: <section class="price"> @foreach (HomePageHelper::x() as $u) <p style="text-align: center">{{ $u->price }}</p> @endforeach </section> ثانيا قم بإصلاح عائد التابع x من المساعد HomePageHelper فأنت تقوم بذلك بشكل خاطئ: public static function x(){ return University::all() }
- 12 اجابة
-
- 1
-
-
طيب، هل يمكن الاطلاع على النتيجة في المتصفح والشيفرة المصدرية ل HomePageHelper؟
- 12 اجابة
-
- 1
-
-
هل يمكن القاء نظرة عن الشيفرة التي تقصدها؟ أيضا شيفرة الدالة المساعدة التي تستعملها
- 12 اجابة
-
- 1
-
-
يرجح أنه يتم ارسال الطلبية أكثر من مرة أين يفشل الطلب بعد المرة الأولى لسبب ما، حاول تمرير مصفوفة فارغة للخطاف useHook كمعامل ثان وسوف يتم ارسال الطلبية عند التصيير الابتدائي initial render فقط. لاجتناب تكرار تنفيذ الشيفرة عند كل تغير لمتغير الحالة الممرر كمعامل ثان.
- 9 اجابة
-
- 1
-
-
حاول طباعة الرد من الخادم، هل يتم استقبال أي شيء؟ try { const res = await axios.get(`/api/auth/allusers/${currentUser?._id}`) console.log(res) // setUsers(res.data) } catch (error) { console.log(error.message) }
- 9 اجابة
-
- 1
-
-
يشير الخطأ الذي تواجهه إلى أن id الذي تحاول استخدامه في البحث غير معرف. مما يشير إلى مشكلة إلى استقباله في الطلب أساسا، أي في استخدام req.params.id وتفتقد قيمة id في الطلب أو تكون قيمتها غير معرفة (undefined). حاول أولا التحقق مما إذا كان req.params.id معرفا أم لا قبل استخدامه: const getUsers = async (req, res) => { const userId = req.params.id; if (!userId) { return res.status(400).send("لا يوجد هنالك معرف في الطلب"); } try { const users = await User.find({ _id: { $ne: userId } }).select([ "name", "username", ]); res.json(users); } catch (error) { console.log(error); res.status(500).send("Server error"); } }
-
لا، أغلب العملاء لا يملكون أدنى فكرة عما هو غيتهب أصلا. الأفضل هو الاعتماد على معارض الأعمال التي توفرها مواقع العمل الحر، أو الاعتماد على موقع شخصي. بالنسبة لتصاميم ui/ux قد يكون من العملي أيضا تجميعها في حسابك على behance.
- 4 اجابة
-
- 1
-
-
غالبا ما تكون معارض الأعمال معروضة بشكل مباشر ومتاح وسهل للوصول ولا يتم طلبها منك نظرا لأن الأمر قد يأخذ منك أو من العميل وقتا اضافيا هو لن يفيده في التوصل إلى الموظف الصحيح بشكل سريع، ولذلك نجد أغلب مواقع العمل الحر تتوفر بالفعل على هاته الميزة وتوفر للمستقلين والعاملين بها على طريقة لإضافة اعمالهم، صورها وتفاصيلها وروابطها بشكل مباشر. ولذلك فإنك سوف تمتلكين معرض أعمال بالمواقع التي تشتركين بها وتنشطين فيها يمكنك فيه عرض عدد من الأعمال، وقد يتعدى الأمر ذلك حتى امتلاك موقع شخصي تقومين فيه بتجميع بعض عينات أعمالك وتقومين بعرضها في صفحة خاصة.
- 4 اجابة
-
- 1
-
-
للغة العربية، سيمكنك الاستفادة من المحتوى المكتوب والمترجم المنشور على أكاديمية حسوب في قسم دروس ومقالات - قسم PHP. كما يمكنك الاطلاع على توثيق لغة PHP في ويكي حسوب وتوثيق PHP الرسمي. أما عن اقتراحات كتب، فمن بين الأشهر في المجال يوجد: PHP & MySQL: Novice to Ninja PHP Design Pattern Essentials Modern PHP: New Features and Good Practices Clean Code in PHP : Expert Tips and Best Practices to Write Beautiful, Human-Friendly, and Maintainable PHP أما بالنسبة للمحتوى العربي، يوجد: الشامل في لغة بي اتش بي للمهندس حامد محمد حامد
- 2 اجابة
-
- 1
-
-
لن يمكن لأحد حسم إجابة هذا السؤال لك إلا أنت، فالذي أنت مطالب به هو الإطلاع على كلا المجالين الذي رشحتهما وفرص العمل فيهما ومن ثم اختيار المجال الذي تجد نفسك أقرب إليه. قد يمكنك أيضا استكشاف الفرص الوظيفية في السوق المستهدفة التي تريد أن تنشط فيها، الأمر الذي يمكن أن يلعب دورا في اتخاذ القرار. استعمل محركات البحث أو استكشف المجتمعات التقنية القريبة منك. فيما يلي مقارنة بسيطة بين المجالين: الذكاء الاصطناعي (AI): هو مجال يهتم بالتركيز على تطوير الأنظمة والبرمجيات التي تتيح للأجهزة والبرامج محاكاة الذكاء البشري واتخاذ قرارات ذكية. يشمل تقنيات مثل تعلم الآلة، وشبكات العصب الاصطناعي، ومعالجة اللغة الطبيعية. يمكن من عليه بناء وتطوير نماذج توقعية، وتحليل البيانات الضخمة، والتعرف على الصوت والصور. تطوير الويب (Web Development): هو مجال يركز على بناء تطبيقات ومواقع الويب باستخدام تقنيات البرمجة وتصميم واجهات المستخدم والنظم الخلفية. يشمل يشمل لغات برمجة مثل HTML، CSS، JavaScript، وأيضا إطارات عمل مثل React، Angular، وVue.js ولغات مثل PHP,NodeJS, Python. يمكنك من تطوير مواقع الويب، تطبيقات الويب، التجارة الإلكترونية، تطبيقات الواجهة الأمامية والخلفية.
- 4 اجابة
-
- 1
-
-
موضوع قراءة الكتب واحد من المواضيع الأكثر ترددا في المجال، وكل الإجابات غالبا ما تشير إلى نفس الشيء: المعلومات المتواجدة في الكتب غالبا ما تكون معلومات قد تم تحديثها بالفعل، فالوقت الذي قد يأخذه كتابة ونشر وتوزيع الكتاب قد تكون أطول من المدة التي يتم فيه إطلاق إصدارات جديدة وتحديث المادة العلمية التي يتناولها الكتاب أصلا. لنأخذ المثال الذي طرحته مثلا: منذ 2019 تم إطلاق النسخ والاصدارات 7.4 حتى 8.2 من PHP تناول بعضها تحديثات كبيرة، ومن لارافيل منذ 2019 تم اطلاق النسخ من 5.8 حتى 10 والتحديثات في لارافيل كانت ضخمة بعد النسخة 7 وبعد النسخة 9 .. وهذا ان سلمنا جدلا أن المواد العلمية التي تم تناولها هي الخاصة بعام 2019 فقط، أي بتقدير الوقت المستغرق في كتابة الكتب ستكون المواد العلمية المطروحة تخص ما قبل 2018 وهو وقت بعيد جدا. أظن أن الكتب التي تتناول مثل هاته المواضيع سوف لن يكون من المجدي الاعتماد عليها بشكل كلي. من جانب آخر، تتوفر دوما هنالك تحديثات للمحتوى الرقمي الذي يهتم بتناول هاته الجزئيات. هذا لا يعني طبعا أن قراءة كتب المجال شيء غير جيد، ولكن يجب تمييز المواد العلمية التي يجري عليها تحديث من تلك الثابتة نسبيا من مثل كتب مبادئ الهندسة والخوارزميات والشيفرة النظيفة وبنى البيانات وما نحوها مقابل كتب اللغات وأطر العمل والمكتبات ..
- 1 جواب
-
- 1
-
-
طبعا فإن الموضوع يخضع لعدة متغيرات، قد يمكنك إيجاد بعض عروض العمل الخاصة بمشاريع من مثل: مشاريع الاستشارة مشاريع الكتابة التقنية مشاريع التعليم والكورسات وما نحوها من مجالات رغم ندرتها .. أما ان كنت تستهدف المشاريع التنفيذية من مثل العمل أو الإشراف على مشاريع برمجية فقد لا يكون من الكافي تعلم c++ وحدها. ستحتاج في ذلك لغات أخرى يمكن توظيفها في مجالات أخرى. كما أنه قد يمكنك تعلم إطار عمل لها في مجال معين، من مثل crow في مجال الويب، إلا أن هذا يبقى متعلقا بمتطلبات السوق المستهدفة وما ان كان مشارا إليه في عروض المشاريع أو لا. رغم هذا، إلا أنه من النادر وجود مشاريع تتطلبها في مجالات العمل الحر.
- 4 اجابة
-
- 1
-
-
مرحبا محمود، انتبه إلى أن المسار التالي: // /api/auth router.get('/', protect, getCurrentUser) محمي بالطبقة الوسيطة protect التي يتم استيرادها من ملف authMiddleware والمعبر عنها بالشيفرة التالية: const jwt = require("jsonwebtoken") const protect = (req, res, next) => { // Get token from header const token = req.header('x-auth-token') // Check if no token if (!token) { return res.status(401).json({msg: 'No token, authorization denied!'}) } // Verify token try { const decoded = jwt.verify(token, process.env.JWT_SECRET) req.user = decoded.user next() } catch (err) { res.status(401).json({msg: 'Token is not valid'}) } } module.exports = protect يتم هاهنا فحص الترويسة x-auth-header من الطلب، والتي تعبر عن رمز توكن الذي يتم به مصادقة الطلب. يتطلب هذا أن يقوم العميل بإرسال قيمة رمز توكن مرتبطة بهاته الترويسة، ولذلك يمكنك استخدام الكود الذي اقترحه المدرب مصطفى لذات الغرض، غير أنك تحتاج هاته المرة وصف ترويسة بذات الاسم:
-
لا أجد أن الكود الذي لديك به مشكلة ما، يفترض أن يتم طباعة الجمل مرة واحدة ما لم يكن هنالك تأثير من خلال كود آخر. يجب الإشارة أن خطاف useEffect يستقبل كمعامل ثان سلسلة متغيرات يتم تنفيذه كل مرة تتغير قيمة هاته المتغيرات، في مثل الحالة التي هو المعامل والمتغير name، فكل مرة يتم تصيير قيمة جديدة لـ name يتم إعادة تنفيذ الكود والنتيجة: طباعة الجملة مرتين. أما في الحالة الأولى، فالذي يتم تمريره هو سلسلة متغيرات فارغة، بمعنى أنه لن يتم تنفيذ الكود إلا مرة واحدة وهي خلال التصيير الابتدائي initial render. قد لا يمكن تحديد السبب بدقة، ولكن انظر ما ان كنت تقوم بتحديث قيمة name بمكان ما بالشيفرة التي لديك.
-
ان كنت تقصد الأمر كزائر للموقع فسوف تحتاج في هذا أن يقوم الموقع المستهدف بتزويدك بهاته الميزة - توفر بعض المواقع هاته الخدمة غالبا، أما في حالة تعذر ذلك، فسوف لن يمكن ذلك إلا بتوظيف بعض تقنيات تجريف الويب web scraping لمقاربة نتيجة مماثلة. ولكن ان كنت تقصد أنك مدير الموقع ، فستحتاج في هذا غالبا التعامل مع الاشعارات كانموذج بيانات منفصل تماما، ولذلك فأنك ستحتاج إنشاء جدول للإشعارات يحمل أعمدة من مثل: seen: يعبر عن حالة رؤية أو قراءة الاشعار. content: يعبر عن المحتوى النصي للإشعار. الآن سوف تحتاج إدراج صف إشعار جديد بجدول الإشعارات كل مرة يتم فيها إنشاء منتج جديد. من جهة أخرى، سوف يتم بصفحة مدير الموقع الاستعلام عن كامل الإشعارات غير المقروءة وعرضها. بهذا السناريو البسيط سيمكنك القيام بهاته الجزئية. لا أظن أنه يمكن القيام بذلك بإستخدام جافاسكربت فقط، سوف يتكامل في هذا تطبيق عميل + تطبيق خادم. أي أنك ستحتاج سناريو ويب شامل، وليس على مستوى العميل أو الخادم فقط. أما ان كنت تقصد الإشعار في الوقت الفعلي - أي دون الحاجة إلى تحديث الصفحة أو الدخول إلى صفحة الإشعارات - فأنت غالبا ستحتاج التعامل مع مفهوم الويب السوكيت وبيانات الوقت الفعلي. يمكنك الاستزادة بقراءة الأجوبة على السؤال التالي:
- 2 اجابة
-
- 1
-
-
سيمكنك استخدام بعض الأفكار التي تمكنك من فك ترجمة decompile ملف APK ثم ترجمة recompile الناتج مجددا. وأفضل من ذلك بالطبع، يمكنك القيام بتعديلاتك على تطبيق فلاتر بشكل عادي، ثم إعادة بناء نسخة APK من التطبيق. كما أن الأمر قد يخضع لطبيعة التعديلات التي ستقوم بها وحجمها، فإذا كنت تقصد تعديل الشيفرة المصدرية للتطبيق (مثل تغيير الأكواد أو إضافة ميزات جديدة)، فيجب عليك القيام بالتعديلات وإعادة بناء التطبيق ثم استخراج نسخة APK جديدة. أما إذا كنت تقصد تغيير محتوى التطبيق أو النصوص أو الصور دون التدخل في الشيفرة المصدرية، فيمكنك فعل ذلك بسهولة دون الحاجة إلى إعادة بناء التطبيق أو استخراج APK جديدة. ستتغير هذه التغييرات مباشرة على النسخة المثبتة من التطبيق. -رغم أن الفكرة غير منصوح بها وغير عملية، نظرا لأنه سيكون هنالك فارق بين نسخة التطوير ونسخة الإنتاج-.
- 3 اجابة
-
- 1
-
-
سوف تحتاج تهيئة حالة تعبر عما ان كان المستخدم معجبا بالفعل بالمنشور أو لا، ولتسمها مثلا: const (isLiked, setIsLiked) = useState(() => checkLiked()) const checkLiked = () => { /** * أي شيفرة يمكنك انطلاقا منها فحص ما ان كان المستخدم معجبا بالمنشور أو لا */ return someBooleanValue; // أعد true أو false } بحيث تقوم الوظيفة checkLiked بفحص الإعجاب (سواءا بطلبية من الباك أند أو من خلال فحص كائن معين أو أي طريقة كانت). فالقيمة الافتراضية لمتغير الحالة isLiked تتغير هي الأخرى. الآن سيسهل استخدام هذا المتغير في التصيير الشرطي لزر الإعجاب ووظيفته: <ToggleLikeButton onClick={isLiked ? removeLike : addLike} /> const addLike = () => { // وظيفة اضافة الإعجاب } const removeLike = () => { // وظيفة الغاء الإعجاب }
-
يرجح أن تكون المشكلة متعلقة بإعداد الرابط الجذر Base url لموقعك على الاستضافة، اذ أن livewire تستعمل هذا الإعداد غالبا للتعامل مع طلبيات أجاكس، والتي تستعمل في أحداث مثل wire:click. افتحي console التطبيق بعد استهداف حدث الضغط على الزر مثلا وانظري تفاصيل المشكلة التي تحدث. كحل للمشكلة يقترح اتباع التالي: افتحي ملف env. وقومي بوضع الرابط الجذر لموقعك في APP_URL: APP_URL=https://domain.co/ احفظي الملف، وقومي بتشغيل الأمر php artisan cache:clear لمحو التخزين المؤقت للملفات. في حال ما كان لديك وصول ssh إلى الاستضافة أو إلى تارمنل الاستضافة يمكنك تشغيلها بشكل مباشر عن طريق التصفح إلى مجلد المشروع، أما في حالة التعذر يمكنك استخدام الواجهة Artisan لتشغيل أوامر artisan في داخل التطبيق: نعرف مسارا جديد بملف web.php: use Artisan; .. Route::get('/clear-cache', function(){ Artisan::call('cache:clear'); }); ثم قومي بالتصفح إلى /https://domain.co/clear-cache
- 5 اجابة
-
- 1
-