-
المساهمات
2852 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
38
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Hassan Hedr
-
يوجد تعليق بصيغة خاطئة ستجد محارف زائدة خارج مجال التعليق بجانب الشيفرة المضافة <!-- داخل مجال التعليق --> خارج مجال التعليق محارف زائدة <-- قم بحذفها لحل المشكلة، اذا ما زلت تواجه المشكلة من فضلك قم بارفاق الشيفرة المصدرية للصفحة لأقوم بمساعدتك
- 3 اجابة
-
- 1
-
-
يمكن تصفية الروابط حسب وجود الصور باختبارها مسبقًا، بفرض أن imagesUrls هي مصفوفة روابط الصور imagesUrls = imagesUrls.filter(url => { var http = new XMLHttpRequest() http.open('HEAD', url, false) http.send() return http.status != 404) }) تصفية جميع الروابط دفعة واحدة قد يستغرق وقتا، لذلك نقوم فقط بتصفية الروابط التي نحتاج عرضها حاليا داخل المكون نفسه
- 3 اجابة
-
- 1
-
-
عند تشكيل جداول البيانات بأبسط شكل نبدأ بوضع كل البيانات في جدول واحد، مثال جدول الموظفين وكل موظف يتبع لقسم يخطط الجدول كالتالي جدول الموظفين: employee | department | department_number ------------------------------------------------------------------- khaled | department 1 | 575 ahmad | department 2 | 322 mohammad | department 1 | 575 Hasan | department 3 | 446 نلاحظ تكرار بعض القيم في حقل اسم القسم هذا يخلق بعض المشاكل زيادة حجم قاعدة البيانات مع الوقت عند تحديث أو حذف قيمة (اسم القسم مثلا) يجب التأكد تغيير كل تكرارات هذه القيمة كل المعلومات الاخرى المتعلقة بالقسم (رقم القسم) يجب تكرارها بشكل صحيح في كل مرة نضيف موظف جديد لتجنب هذه المشاكل نقوم بعملية تسمى normalization وهي فصل القيم المكررة الى جدول منفصل وربطها بالجدول الأساسي فيصبح لدينا جدول للموظفين وجدول للأقسام وبياناتها جدول الموظفين: employee | department_id ---------------------------------------- khaled | 1 ahmad | 2 mohammad | 1 Hasan | 3 جدول الأقسام: id | department | department_number ----------------------------------------------------------- 1 | department 1 | 575 2 | department 2 | 322 3 | department 3 | 446
-
يمكنك تجاوز هذا الخطأ أيضا بتعديل ملف package.json لتطبيق React وإضافة عنونا الوجهة التي ترسل اليها الطلبات كالتالي { ... "proxy": "http://localhost:4000", //رابط لعنوان الوجهة التي ترسل اليها الطلبات } ومن ثم اعادة تشغيل التطبيق، سيقوم React بإنشاء مخدم محلي يستقبل جميع طلبات تطبيقك ومن ثم اعادة ارسالها لعنوان الوجهة السابق (نقوم بهذا الحل فقط في طور التطوير) يفيد بتجاوز منع المتصفح تطبيقك من ارسال طلبات لنطاق مختلف عن نطاقك المحلي
-
composition هي علاقة قوية بين مكونين، أي أحد المكونين لا وجود له (أو لا معنى له) ضمن النظام دون وجود مكون يحتويه، ودورة حياة مكون هي نفسها دورة حياة المكون المالك له في مخطط ال UML يرمز لهذه العلاقة بمعين الداكن مثال: مكون المحرك يرتبط بعلاقة قوية بمكون السيارة، تنتهي دورة حياة المحرك بانتهاء دورة حياة السيارة aggregation علاقة ولكن ضعيفة بين مكونين، أي كل مكون مستقل بذاته ويمكن أي يتواجد (وله معنى) ضمن النظام بمفرده، وكل مكون ضمن هذه العلاقة يملك دورة حياة مستقلة عن الآخر في مخطط ال UML يرمز لهذه العلاقة بمعين مفرغ مثال: مكون الفرد يرتبط بعلاقة ضعيفة بمكون المؤسسة، اذا انتهت دورة حياة المؤسسة يبقى لمكون الفرد وجود ومعنى مستقل
-
يمكنك التواصل مع مركز الدعم وطرح أي استفسار بخصوص الدورات أو عملية الدفع وسيقومون بالتوضيح
-
نعم يمكنك الاستعلام عن البيانات عن طريق أي حقل أو مجموعة من الحقول الأخرى التي تريدها دون الحاجة لوجود مفتاح أساسي، لكن قد تواجهك المشاكل التالية: التأكد أن توليفة الحقول التي ستستعلم بها مميزة لكل عنصر داخل الجدول (يمكن للخاصية Unique أن تساعدك على ضمان ذلك) مع الوقت قد يطرأ تغيير على قيمة الحقل، الحقول التي ستختارها سيتم الاشارة اليها في جداول اخرى للربط بين العناصر ويجب عندها المرور على كل ذكر للقيمة في الجداول الأخرى والتأكد من تغييرها للقيمة الجديدة اذا اخترت حقل اسم المستخدم مع الوقت قد تدخل ميزة حذف حساب مستخدم مع ابقاء بياناته ضمن قاعدة البيانات (مثلا باضافة حقل is_deleted)، ما يعني السماح للمستخدمين الجدد باستعمال اسم مستخدم محذوف، ولكن لن يتم السماح بتكرار اسم مستخدم جديد يماثل اسم مستخدم موجود سابقا (ولو كان محذوف بالنسبة لتطبيقك) التأكد من فهرسة الحقول المميزة التي اخترتها لزيادة سرعة جلب البيانات للتخلص من كل هذه المشاكل نضيف مفتاح رئيسي عبارة عن حقل إضافي بدون معنى، مهمته فقط تمييز كل عنصر داخل الجدول بطريقة مجردة لا تتغير مهما تغيرت ميزات تطبيقك نسميه primary key عبارة عن عدد متزايد (أو أي قيم عشوائية مميزة أخرى)
-
بعد إنشاء كلا الجدولين نقوم بإضافة العلاقة بينهما لكل جدول على حدى وربطهما بجدول الربط مع تحديد اسم الحقل الدال على المفتاح الرئيسي في كلا الجدولين لنفترض لدينا الجدولين Parent, Child وجدول ربط Parent_Child فيه تقابلات للمفاتيح الرئيسية من كلا الجدولين بإسم parent_id, child_id // الجدول الأول Parent.belongsToMany( Child, { // اسم جدول الربط through: 'Parent_Child', // اسم المفتاح الدال على الجدول الحالي في جدول الربط السابق foreignKey: 'parent_id' } ) // بنفس الطريقة نربط الجدول الثاني Child.belongsToMany( Parent, { through: 'Parent_Child', foreignKey: 'child_id' } )
-
يجب إعداد التطبيق لاضافة ميزة الرسائل flash اذا كنت تستخدم الحزمة "connect-flash" قم بتغيير الاعدادات للتالي var flash = require('connect-flash'); app.configure(function() { app.use(express.session({ secret : 'topsecrethere' })); app.use(flash()); }); وتأكد من تعيين الرسالة بشكل صحيح كما التالي req.flash('message', 'Email already exists.'); والحصول على الرسالة يكون بالشكل التالي router.get('/register', function(req, res) { res.render('/register', { message: req.flash('message') }); }); لكن رسائل ال flash تستخدم لارفاق رسائل لمرة واحدة عند تحويل المستخدم من مسار لاخر، اذا كنت تريد اظهار الرسالة مباشرة ضمن نفس المسار مرر رسالتك مباشرة كالتالي router.get('/register', function(req, res) { res.render('/register', { message: 'Email already exists.' }); });
-
عند طلب العميل للصفحة بانك سترسل له صفحة HTML فارغة خالية من المحتوى (تقريبا)، ومرتبط بها الشيفرة التي طورتها باستخدام React. عند جلب هذه الشيفرة وتشغيلها داخل المتصفح يقوم React بملئ محتويات الصفحة ويتولى تحديثها هذا ما يدعى ب "التصيير بطرف العميل - Client side rendering" محركات البحث عند وصولها لموقعك لن تقوم بتشغيل javascript اي ستتلقى الصفحة فارغة فقط، أي معلومات وصفية تريدها ان تظهر لمحركات البحث يجب تعديل ملف index.html داخل مجلد public وتضيف كافة المعلومات (ستكون معلومات مشتركة بين كل الصفحات) الحل هو تصيير الصفحة على الخادم (اطار العمل NextJS يستخدم ذلك) ومن ثم ارسالها لزاحف محرك البحث عن طريق ما يسمى "التصيير بطرف الخادم - Server side rending" Helmet يساعدك فقط على اضافة وتغيير محتويات العنصر head خلال عمل مكتبة React سواء على الخادم أو بطرف العميل
-
ما هي الخاصية value ؟ في لغة HTML لكل عنصر خصائص يمكنك تعيينها، العنصر input هو عنصر لادخال البيانات لديه الخاصية value وهي تعبر عن القيمة البيانات التي يمثلها العنصر يمكن الاستفادة من تعيين قيمة هذه الخاصية أن يكون للعنصر قيمة افتراضية وليس فارغا <!-- عنصر ادخال بيانات الاسم مع قيمة افتراضية --> <input name="name" value="mohammad /> عندما يغير المستخدم قيمة الحقل داخل المتصفح ستتغير قيمة الخاصية value. كيف ارسل قيمة العنصر الى قاعدة البيانات ؟ تقوم بإحاطة العنصر بعنصر form وهو مسؤول عن تحديد وجهة البيانات داخله، مع عنصر button لتاكيد الإرسال <!-- عنصر لتحديد اين تريد إرسال البيانات داخله --> <form method="POST" action="/path/to/action"> <input name="name" value="mohammad /> <button>إرسال</button> </form> عند الضغط على الزر سترسل البيانات إلى الوجهة المحددة عبر ارسال طلب HTTP يحتوي على الخاصية name بالقيمة "mohammad". تقوم على الخادم باستلام هذا الطلب واستخراج قيمة name منه ووضعه بقاعدة البيانات.
-
Apache Hadoop هو مجموعة من الأدوات مفتوحة المصدر مهمتها الأساسية إدارة وتخزين ومعالجة مجموعة بيانات كبيرة (جيجابايت - اكسابايت) تستخدم مجموعة الأدوات (المكونات الأساسية) هذه عندما يكون لديك بيانات حجمها كبير وموزعة على عدة خوادم، تستطيع من خلالها إدارة كل البيانات بكفاءة وتنفيذ الاجرائيات كما لو كنت تنفذ الاجرائية على مخدم واحد
-
البروتوكول المتبع للتواصل بين الخادم والعميل (المتصفح) هو HTTP، بنية الطلب تتضمن إمكانية اضافة معلومات حول اللغات الذي يستطيع قبولها (يتقنها) العميل عبر قيمة تسمى Accept-Language، قيمتها تعبر عن لغة أو عدة لغات يفضلها العميل (تعين افتراضيا من قبل المتصفح حسب لغة جهاز العميل مثلا) Accept-Language: * // العميل يقبل أي لغة Accept-Language: ar, en // العميل يفضل العربية ثم الانجليزية بالترتيب على الخادم يمكنك معرفة قبول العميل لأحد اللغات عبر الدالة acceptsLanguages app.use(function(request, response, next) { var lang = request.acceptsLanguages('ar'); // يعيد قيمة اللغة اذا كان يقبلها العميل // lang = 'ar' // يمكنك الان التصرف حسب قيمة اللغة المقبولة ... });
-
الحاجة الأساسية التي تلبيها هذه الحزم هي تمييز طلبات المستخدم الواحد من الطلبات القادمة وتخزين واسترداد معلومات عنه. ما الفرق بين الحزمتين ؟ express-session (بيانات الجلسة بطرف الخادم) يقوم بتخزين البيانات على الخادم (يوجد عدة تضمينات للمخازن حسب نوع المخزن)، ويمرر للعميل فقط معرف يستخدمه لاسترداد معلومات العميل في كل مرة يقوم فيها بطلب cookie-session (بيانات الجلسة بطرف العميل) يقوم بارسال البيانات كاملة للصاحب الطلب ولا يتم تخزين أي بيانات على الخادم. متى تستخدم كل منهما ؟ cookie-session إذا كنت لا تريد متابعة وتطوير مكان التخزين بيانات الجلسة cookie-session إذا كانت بيانات الجلسة خفيفة وحجمها صغير cookie-session إذا كانت لديك بنية خوادم متعددة لا تشترك بمكان تخزين موحد express-session خلاف ذلك أو إذا كان لديك طريقة تخزين مخصصة تفضل استخدامها لبيانات الجسلة
-
السؤال واسع ويحتاج التوضيح والتحديد أكثر، يوجد العديد من التفاصيل التي تحتاج للتوضيح ما مصدر الروابط التي تريد اختصارها هل هي روابط إعادة توجيه بتقابلات مدخلة مسبقا أم روابط لصفحات من نوع معين داخل الموقع نفسه كيف ستتم إدارة روابط اعادة التوجيه وما محتوى صفحة الانتظار..
-
لمعرفة الرابط الأساس الذي تعمل ضمنه تحتاج التالي: البروتوكول الذي يخدم العميل (http - https) يحدد عبر القيمة التالية: $_SERVER['HTTPS'] // هل بروتوكول التشفير مفعل اسم النطاق الذي يمكن للعميل الوصول للمخدم عبره (www.example.com) يحدد عبر القيمة التالية: $_SERVER['SERVER_NAME'] // اسم النطاق الحالي تنسيق القيمتين بالصيغة التالية [بروتوكول + "//:" + اسم نطاق] يمكن تضمين التابع الذي ذكرته كما يلي: function getBaseURL(){ return sprintf( "%s://%s", isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http', $_SERVER['SERVER_NAME'] ); } echo getBaseURL(); // "https://www.example.com"
-
هناك خطأ في طلب على الرابط الأساسي "/" ستجد تفاصيل أكثر عن الخطأ في الأسطر اللاحقة للسطر الذي أرفقته، أرجو إرفاقها لأتمكن من مساعدتك
-
useCallback تفيدك في حالة كنت تريد المحافظة على مرجعية دالة تريد انشائها داخل الدالة render في المكون (أو داخل دالة المكون في حال لم يكن مكون صف) // كل مرة ينفذ فيها هذا السطر ينشئ تابع جديد const myFunction = () => {/*...*/} return ( <div> {/* سيتلقى المكون التالي في كل مرة تابع جديد ولن يستطيع معرفةاذا كنت تمرر نفس التابع دومًا */} <OtherComponent callback={myFunction} /> </div> ) // عند أول تنفيذ لهذا السطر فقط سيتم انشاء تابع جديد // والمرات القادمة سيعيد التابع التابع الأول نفسه const myFunction = useCallback(() => {/*...*/} ,[]) return ( <div> {/* سيتلقى المكون التالي نفس التابع في كل مرة */} <OtherComponent callback={myFunction} /> </div> ) useMemo تفيدك في حال كان لديك عملية حسابية تستهلك وقتا أو موارد تقوم الدالة بتنفيذ العملية فقط عند تغير المتحولات في المصفوفة الممرة لها (أو لا تقوم أبدا بإعادة تنفيذ العملية في حال لم تمرر قيم للمصفوفة) // كل مرة ينفذ فيها هذا السطر سنعيد تنفيذ نفس التابع لحساب النتيجة const value = veryExpensiveCalculation(); return ( <div>{value}</div> ) // عند أول تنفيذ فقط لهذا السطر سيتم حساب القيمة // والمرات القادمة سيعيد نفس الناتج بسرعة دوما const myFunction = useMemo(() => veryExpensiveCalculation(),[]) return ( <div>{value}</div> ) يمكن أيضا استخدام useMemo بطريقة تعمل عمل useCallback (فقط لفهم أوسع لكن حاول استخدام useCallback بدلا عن الطريقة التالية) // عند أول تنفيذ فقط لهذا السطر سيتم انشاء دالة جديدة // والمرات القادمة سيعيد نفس الدالة السابقة وبنفس المرجع const myFunction = useMemo(() => { return () => {/*...*/} },[]) return ( <div> {/* سيتلقى المكون التالي نفس التابع في كل مرة */} <OtherComponent callback={myFunction} /> </div> )
- 2 اجابة
-
- 1
-
-
يمكن لأي صف في جافا الوراثة من صف واحد فقط، وذلك بسبب مشكلة الوراثة المتعددة وتسمى أيضا مشكلة الألماسة بسبب الشكل المتشكل في مخطط ال UML للصفوف في المخطط السابق A أب لكل من C و B قد يقوم كلا الصفين الأبن بتغيير تضمين دالة موروثة من A كل بطريقته الآن اذا سمحنا للصف D بالوراثة من كلا الصفين B و C، فأي من النسختين من نفس الدالة في الأبويم سيرث الصف الأبن؟ class A { public int function name() { return "A"; } } class B extends A { public int function name() { return "B"; } } class C extends A { public int function name() { return "C"; } } class D extends B, C { // إذا سمحنا بالوراثة المتعددة } D d = new D(); d.name(); // أي من الدالتين ورث الصف ؟؟ لذلك الوراثة المتعدد في جافا غير مسموح بها عوضا عنها نستبدل تصميمنا الحالي بتصميم مشابه لما ذكره محمد
-
القسم هو صف من خصائصه المدير والموظفين والعمال داخله، يمكن للصف نفسه التصريح فيما إذا كان يمكن مشاركة العمال مع قسم آخر class Department { // ... public Manager manager; public Employee[] employees; public Worker[] workers; // ... public Boolean canShareWorkersWith(Department otherDepartment) { // بالاعتماد على قواعد مشاركة العمال } // Setters and Getters... } // نستعلم عن امكانية المشاركة if(department.canShareWorkersWith(otherDepartment)){ otherDepartment.setWorkers(department.workers); // تعيين عمال قسم في آخر } باقي الصفوف من مدراء و موظفين و عمال لن تحتاج إلى الوراثة من صف القسم
- 1 جواب
-
- 1
-
-
يجب توضيح تفاصيل أكثر عن الطريقة التي تقوم بها حاليا، يمكنك إتباع احدى الطرق: اذا كنت تبحث في نفس ال 100 صفحة كل مرة يمكن لبرنامجك المرور عليها مرة واحدة وتخزينها محليا ومن ثم عند طلب البحث عن اسم البحث في الصفحات المخزنة محليا، بهذه الطريقة لن تعتمد على سرعة الاتصال لديك سوى أول مرة يمكن تخزين نتائج البحث السابقة محليا، وعند تكرار طلب لنفس الاسم ترجع النتيجة جاهزة مسبقا يمكن إرسال الطلبات على التوازي، بدل من البحث في صفحة واحدة كل مرة يمكن البحث عدة صفحات معا دفعة واحدة سرعة الانترنت لديك هي عنق الزجاجة في النظام الذي تبنيه، يمكن الاستفادة من التخزين المؤقت و الطلبات المتوازية لتحقيق أقصى سرعة ممكنة للتعويض
- 2 اجابة
-
- 1
-
-
يجب اختيار المبرمج صاحب الخبرة وتوكيل دراسة تفاصيل المشروع له وبعدها يستطيع التقرير ما الانسب لمشروعك لبناء الموقع الالكتروني مثلا يوجد عدة استفسارات يجب فهمها بالنظر لمشروعك: هل الموقع سيولد على المخدم أم داخل متصفح الزائر وربط الحصول على البيانات والاوامر بواجهة برمجية مع الواجهة الخلفية ولماذا احداهما الانسب للمشروع ؟ قد يختار المبرمج توليد الموقع على المخدم لمعرفته الجيدة بلغة PHP وإطار العمل Laravel، أو قد يختار الفصل بين الواجهة الامامية والخلفية وذلك لحاجة المشروع للربط أيضا مع تطبيقات الهاتف حينها سيبني الموقع بالاعتماد على لغة Javascript مع اختيار إطار عمل من عدة اطارات عمل متوفرة حسب خبرته فيها وملائمتها للمطلوب القرار الأخير سيعود للمبرمج الذي سيقوم بدراسة متطلباتك واحتياجاتك ويضيف لها معرفته وخبرته باللغات والاطر المتاحة
- 3 اجابة
-
- 1
-
-
مشروعك ينقسم لعدة أقسام، في كل قسم لديك عدة خيارات لا يوجد ما هو الأنسب بالمطلق، يقوم أولا مدير المشروع أو رئيس الفريق البرمجي أو المبرمج الذي سيبني المشروع سيقوم بدراسة شاملة لكل المتطلبات التي ذكرتها وتفصيلها وربما السؤال عن تفاصيل لم تكن واضحة في بداية تسجيل المتطلبات، بعدها يختار اللغات وأطر العمل المناسبة للمشروع حسب عدة عوامل خبرة المبرمج / فريق البرمجة باللغات وأطر العمل المنصات التي ستتاح عبرها منصتك (موقع الكتروني - تطبيق اندرويد - تطبيق IOS) المزايا المتاحة (ارسال الاشعارات - تعدد المستخدمين - التكامل مع خدمات خارجية) يمكنك اذا كنت صاحب المشروع توظيف مبرمجين اصحاب خبرة وكفاءة عبر موقع مستقل منصة Firebase ستوفر لك العديد من الخدمات والادوات منها: ادوات متابعة نشاط المستخدمين على مختلف المنصات (المواقع الكتروني - تطبيقات الهواتف الذكية) قاعدة بيانات من النوع NoSQL مع مزايا مراقبة تغير البيانات بالوقت الحقيقي (تفيد في مزايا الحجز المواعيد وارسال الاشعارات مثلا) والعديد من المزايا بعضها سيناسب مشروعك وأخرى لا ...
- 3 اجابة
-
- 1
-
-
يمكن لجوجل مساعدتك على ازالة المحتوى المحمي بحقوق النشر من على جميع خدماتها فقط وليس على الموقع الاصلي، مع اخبارك إن بالوسائل القضائية المتاحة لمساعدتك إن وجدت قدم طلبك من هنا اختر نوع الخدمات مثلا محرك البحث جوجل اختر نوع المحتوى المنسوخ (كتابة - صور - فيديو ) قدم لهم رابطا لصفحة تحتوي عل المحتوى المنسوخ اجب على اي تفاصيل اخرى تطلب منك ملاحظة: يجب أن تكون أنت صاحب حقوق النشر لكي تتم مساعدتك سيتم متابعة طلبك معك عبر الايميل بعدها