-
المساهمات
6975 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
218
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Wael Aljamal
-
لكل حاسوب متصل على شبكة الانترنت 2 من IP address الأول محلي local IP على مستوى شبكة المنزل مثلاً 192.168.1.7 الثاني عام على مستوى الانترنت global / public مثلا 145.149.95.90 حيث أن كلاً من هذه العناوين قابل للتغير من فترة لأخرى. أما عند حجز استضافة عامة سيكون لها static IP وهو عنوان ثابت لا يتغير، من النوع public IP. يمكنك التواصل مع شركة الاتصالات لديك للاشتراك بخدمة static IP وبهذا يصبح للراوتر المنزلي الخاص بك عنوان ثابت على الانترنت و يصبح بقدرتك مشاركة مشاريعك على حاسوبك الذي سيعمل ك Server ولكن لا أنصح بذلك. حيث أن أي خدمة مجانية للاستضافة أسهل و أوفر وتكون متوفرة طيلة الوقت
- 2 اجابة
-
- 1
-
التطبيق على ما تتعلمه ضروري جدا، لانه حتى لو كان إحساسك انك تفهم html css فعند تطبيق المشاريع الحقيقية ستواجه صعوبات في تنسيق الصفحات و تصميمها و لكي تثبت لنفسك أنه لديك المهارات الكافية لذلك، عليك ببناء مشروع كبير تستخدم فيه ماتعلمته من هذه التقنيات. أفكار مشاريع html css هي في تقليد أي موقع أو جزء من موقع تراه على الانترنت لفكرة جيدة تعجبك و تريد تطبيقها بنفسك. يمكنك تصفح مواقع العمل الحر و قراءة متطلبات أحد مشاريع التصميم والقيام بتنفيذه كتدريب لك. ليس عليك تنفيذ عشرات المشاريع لتثبت انك أتقنت ماتتعلمه، بل يكفي بحدود 5 مشاريع متوسطة و تبذل فيها مجهود مناسب و ترى نتيجة جيدة لما تعلمته.
- 1 جواب
-
- 1
-
يمكنك مشاركة البرنامج الخاص بك الذي كتبته و سوف نعمل على إصلاح الأخطاء
-
تعتبر دورة علوم الحاسب هي الدورة العامة التي تعطيك فكرة عن جميع تخصصات علوم الحاسب، و تدرس بها لغتي جافاسكربت و بايثون كل منها في مسار. وتتعرف على قواعد البيانات و سطر نظام لينكس وغيره تجده في وصف الدورة. و سوف تتعلم مبادئ البرمجة و الأحداث وفي مسار سكراتش ايضاً وهي لغة برمجة مبسطة تقويك في الخوارزميات وإن شراء دورة واحدة يفتح لك أول مسار من باقي الدورات، حينها ستتمكن من تحديد التخصص الذي ستجده مناسبا لك، بالتوفيق
- 3 اجابة
-
- 1
-
لتعرف من المسبب، عليك إزالة قواعد النحملات التعلقة بالصور مثل file loader مؤقتا، وإن اختفت المشكلة تكون هي السبب وانسخ رسالة الخطأ الى غوغل و اقرأ الشروحات، و حاول الحلول المتاحة و أخبرنا بما فهمته من المشكلة و ماسبل الحل لأن هذا ما يفيدك كمطور في المستقبل، النقاش و البحث
- 3 اجابة
-
- 1
-
يوجد تضارب بين اثنين من المحملات يكتبون على نفس الملف الخاص بالصورة.
- 3 اجابة
-
- 1
-
أجبتك في سؤال سابق أنها مفيدة لتفادي حدوث خطا في حال كان لديك صورتين مثلا بنفس الاسم، وسوف تلاحظ أن ملف html في dist قام بتضمين الصور بشكل صحيح بالاسم المعدل، حيث أن ويباك ستعمل على تحزيم الملفات و تضمينهم بالشكل الصحيح وأنت لا علاقة لك بما في داخل dist ولا يفرق اسماء ملفات الصور. هذه ليست صور عشوائية، بل يتم عمل Hashing لأسماء الملفات لكي لا تتكرر اثنين بنفس الاسم، كما تلاحظ جميعهم بنفس المجلد (توليد سلسلة نصية مميزة لكل ملف، بالاعتماد على تقطيع الاسم) يمكنك تجريب تثبيت html_loader بالإصدار 1 npm i html_loader@1.3.2 وهذه الميزة قادمة من تحديث الميزات، فلن يضعوها لتسبب مشكلة، بل لحل مشكلة (يمكن أن المشكلة واجت المطورين وليس بالضرورة واجهتك أنت) فالتحديث لحل مشاكل عامة و خاصة يمكنك تجريب تعديل ملف إعداد ويباك بإضاقة hashFilenames: false module.exports = { webpack: { hashFilenames: false } } وتجريب ضبط اسم الملف الناتج ليكون بلا تهشير { test: /.*\.(gif|png|jpe?g|svg)$/i, use: [ { loader: 'file-loader', options: { name: '/images/[name].[ext]', // المسار المراد رفع الصور عليه } }, ] } طالما استخدمنا file_loader لرفع الملفات، لا نستخدم html_loader بإصدار جديد بل 1 وعلى كل حال، ويب باك ترفع الملفات من تلقاء نفسها وفي آخر تحديث لويب باك يمكنك تعديل الخاصية assetModuleFilename بما يلي: output: { filename: 'main.js', path: path.resolve(__dirname, 'dist'), assetModuleFilename: 'images/[name][ext]' }, إقرأ عن Webpack 5 - Asset Modules
- 3 اجابة
-
- 1
-
عرض title عند عمل hover على عنصر p هو شيء افتراضي مسؤول عنه المتصفح ولا يمكن التعديل عليه مباشرة. يمكنك محاكاة هذه النافذة من خلال pseudo element مع إعطاءه التنسيقات المطلوبة <p title="Hello world!"> Hover over me </p> و التحكم بظهوره كما ترغب في CSS p { position: relative; display: inline-block; margin-top: 20px; } p[title]:hover::after { content: attr(title); position: absolute; top: 100%; left: 50%; }
- 2 اجابة
-
- 1
-
يمكنك تبديل معامل التشابه like ب ilike ليصبح case-insensitive فيتم تجاهل حالة الأحرف User::where('name', 'iLIKE', '%' . $value . '%' ); وهي الطريقة الأبسط، يمكن أيضاً بطريقة كلاسيكية تحويل جميع المحارف للحالة الكبيرة capital | Upper وعمل البحث Model::whereRaw("UPPER('{$column}') LIKE '%'". strtoupper($value)."'%'");
- 1 جواب
-
- 1
-
يمكن استخدام المعامل الثلاثي لفحص قيمة المتغير البولياني ومن ثم طباعة سلسلة نصية موافقة echo $bool_val ? 'true' : 'false'; كما يمكن استخدام دالة json_encode $bool = false; echo json_encode($bool); // 'false' $bool = true; echo json_encode($bool); // 'true'
- 2 اجابة
-
- 2
-
يقوم المطورين برفع مشاريعهم على منصات مثل github لعدد من الأسباب، إما لصنع معرض أعمال ليتطلع عليه من يريدون توظيف هذا الشخص للتأكد من سلامة بناء المشاريع و كتابته لشيفرات نظيفة ومايتعلق بأمور التوظيف، و السبب الثاني هو ربط مستودع المشروع مع خدمات عرض ونشر المشروع، مثل خدمةgithub pages لاستضافة مشاريع الواجهات الأمامية frontend حيث يكون الموقع ساكن بدون backend ومثلا خدمة Heroku للمشاريع عامة. عند رفع مشروع جافاسكربت، نرفع جميع الملفات وو المجلدات عدا مجلد node_modiule في حال استخدام حزم npm NodeJS لأنه يمكن لأي أحد تحميل المشروع وتثبيت المكتبات و تشغيله.
-
استخدم هذا #include <iostream> using namespace std; int main(){ int value; cout <<"Enter the sales value: " << endl; cin >> value; if (value >=9000){ cout << "Excellent" << endl; cout << " :)" << endl; }else if (value >=7000){ cout << "Very Good" << endl; cout << " :)" << endl; } else if (value >=5000){ cout << "Good" << endl; cout << " :)" << endl; } else { cout << "Need improvement" << endl; cout << " :)" << endl; } return 0; }
- 5 اجابة
-
- 1
-
أعتقد و لتقليل التعقيد لأن الأيقونات في مكان و العناصر التي نريد التنقل بينها في مكان آخر (لأب آخر) ضع يمكنك تكرار data-id لا مشكلة بما أنه يحل المسألة
- 6 اجابة
-
- 1
-
شكرا لك ابراهيم، عند تجريب المشروع المرفق، والضغط على الأيقونة فهو يعمل في الجزء الثاني controlls ولا يعمل في main حيث أضاف btn-active وهو مختلف عن الفيديو المرفق للشرح
- 6 اجابة
-
- 1
-
أحسنت عمل جيد، ينقص توضيح بشأن الشروط المتعاقبة if else if else سأصحح واحدة و عليك بالبقية #include <iostream> using namespace std; int main(){ int Excellent; cout <<"Enter the sales: " << endl; cin >> Excellent; if (Excellent >=9000){ cout << "Excellent" << endl; cout << " :)" << endl; }else if (Excellent >=7000 cout << "Very Good" << endl; } else if (..) { } ... else { } } ملاحظة: ليس من المحبذ استخدام كلمة Excellent كمتغير، بل مثلاً كلمة value أو mony لتدل على ما يعبر نعنه المتغير أكمل على نفس المنوال، نضع else لوحدها كآخر شرط حيث لن نستخدم if أما الشروط التي بين أول و آخر شرطين نستخدم if else
- 5 اجابة
-
- 1
-
التعليق السابق معدل أرجو تحديث الصفحة، وأرجو إرفاق الملف لديك لنجرب تعديله وإصلاح المشكلة من غير المحبذ استخدام نفس id أكثر من مرة أعط الأيقونة أبعاد 100% و قم بإلغاء الحواشي و الهوامش لتطابق الأب
- 6 اجابة
-
- 1
-
يمكنك تطبيق دالة closets على ال collection التي قمت بعمل استعلام لها وهي allSections. أي parents = allSections.closest('div'); ثم parents.forEach(function(element) { element.addEventListener('click', (e) =>{ console.log(e.target.dataset.id); } });
- 6 اجابة
-
- 1
-
عند مراجعة الشيفرة تبين أنك تقوم ببناء اثنين من Controllerphone وهما غير مرتبطين ببعضهم لم أفهم سبب ذلك. مرة ضمن الصنف و مرة ضمن Build.
- 8 اجابة
-
- 1
-
هل يمكنك إرفاق شيفرة Controllerphone? أي بعد تعريفه سنتمكن من تطبيق الدوال عليه، تأكد من تطبيق الشيفرة السابقة بعد تحميل البيانات class _MyCustomFormState extends State<MyCustomForm> { final myController = TextEditingController(); @override void initState() { super.initState(); // تهئية myController.addListener(_myListener); } @override void dispose() { // تنظيف myController.dispose(); super.dispose(); } void _myListener() { controller.selection = TextSelection.fromPosition(TextPosition(offset: controller.text.length)); } } كما يمكن نقلع عند النقر عليه onTap TextField( controller: _controller, onTap: () => _controller.selection = TextSelection(baseOffset: 0, extentOffset: _controller.value.text.length), ) أو TextField( controller: _controller, onTap: () => _controller.selection = TextSelection.fromPosition(TextPosition(offset: controller.text.length)); )
- 8 اجابة
-
- 2
-
يمكننا إضافة الدوال accessor methods للنموذج لديك وهو post لتعديل قيم الخواص من النموذج قبل قراءتهم وكتابتهم get - set. حيث نعتمد على الدالة formate لتطبيق تنسيق الوقت المطلوب public function getCreatedAtAttribute($date) { return Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $date)->format('Y-m-d'); } public function getUpdatedAtAttribute($date) { return Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $date)->format('Y-m-d'); } سيظهر التاريخ بالشكل التالي: $post = Post::find(1); echo $post->created_at; // only Y-m-d مع الانتباه أنه عند تعريف الجداول في ملفات التهجير نستخدم الصنف date $table->date('created_at'); $table->date('updated_at'); إن اقتصر استخدامك للتحويل (صيغة التاريخ) في مكان محدد ضمن ملف العرض يمكن استخدام الدالة مباشرة باستدعاء الدالة format('Y-m-d') {{ $post->created_at->format('Y-m-d') }} كما يمكننا استخدام القصر cast في ملف النموذج protected $casts = [ 'created_at' => "datetime:Y-m-d\TH:iPZ", ];
- 1 جواب
-
- 2
-
يبدو أنها عبارة عن خطأ أو سهوة برمجية في المكتبة Big بسيطة. سوف نحاول نقل مؤشر الكتابة عن طريق الكود التالي: بعد إسناد النص في شيفرة المتحكم نقوم بنقل مؤشر الكتابة لنهاية النص fromPosition تحدد بداية النص مكان الكتابة تم تحديد طول النص من خلال controller.text.length يمكنك وضعه بأي قيمة مثلاً من طول السلسة التي تستخدمها controller.text = '...'; النص controller.selection = TextSelection.fromPosition(TextPosition(offset: controller.text.length));
- 8 اجابة
-
- 2
-
أرجو وضع الشيفرة كنص ضمن التعليق وليس كصورة و يمكنك استخدام محرر الأكواد <> لتنسيقها. لحل المشكلة عليك الاحتفاظ بقيمة أكبر تكرار موجود ضمن السلسلة و قيمة العنصر الموافقة له و لكل تكرار في الحلقة نقارن، هل تكرار هذا العدد اكبر من اكبر تكرار؟ فنقوم بتعديل اكبر تكرار و قيمة العدد الموافقة له. يمكنك إضافة متغيرين mostFrequent نحفظ فيه أكبر تكرار لقيمة. و القيمة mostFrequentValue و حاول عمل البرنامج بهذه الطريقة List = [2, 1, 2, 2, 1, 3] counter = 0 # نفرض أكبر تكرار بقيمة 0 num = List[0] # نفرض أن العدد الأول له أكبر تكرار أو قيمة افتراضية للمسألة for i in List: curr_frequency = List.count(i) # حساب التكرار للعنصر الحالي if(curr_frequency> counter): # هل تكرار العنصر الحالي هو أكبر من جميع العناصر السابقة counter = curr_frequency # تعديل أكبر تكرار num = i # تعديل الرقم ذو صاحب أكبر تكرار print(num)
- 3 اجابة
-
- 2