-
المساهمات
1690 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
2
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو شرف الدين حفني
-
المقصود هنا تبسيط لفكرة المتغير, ما تريد أن توصله الأستاذة رضوى, أن rate ليس رقم أو عدد, وإنما متغير قد يحمل أي قيمة في أي لحظة , فالأصح أن ﻻ نقول إننا ضربنا الinterest في 0.07, بل أن نقول أننا ضربنا الinterest في قيمة الrate والتي كانت في لحظة الضرب تحمل القيمة 0.07, الموضوع أشبه بحملك لحقيبة تحتوي على مﻻبس ويسألك شخصاً ما عن ما بيدك فتُخبره أنها حقيبة, من الممكن أن تخبره أنها حقيبة تحتوي على مﻻبس, ولكن ليس من المﻻئم إخباره أن ما بيدك "مﻻبس" وإنما هي حقيبة تحتوي على المﻻبس
-
من أجل إنشاء تلك الخاصية تحتاج إلى أن تتعلم الwebSocket وأحد لغات الbackend الweb socket بإختصار هو عبارة عن طلب يتم إرساله إلى الخادم مثل الhttp ولكن يختلف عنه قليلاً في ألية العمل حيث أن ألية عمل طلب الhttp تكون كالتالي يقوم العميل بإرسال الطلب إلى الخادم يقوم الخادم بإرسال رد إلى العميل ينتهي الإتصال بينهما وﻻ يمكن للخادم إرسال بيانات إلى العميل مرة أخرى إلى إن قام العميل بإرسال طلب بينما ال web socket تختلف حيث أنها تعمل بالشكل التالي يقوم العميل بفتح قناة إتصال بينه وبين الخادم ويُرسل طلب يقوم الخادم بإرسال الرد يظل الإتصال مفتوحاً بينهما ويمكن لكل من العميل والخادم إرسال البيانات إلى بعضهم دون الحاجة لفتح إتصال جديد من قِبل العميل وألية عمل الإشعارات في الغالب تكون بنفس الكيفية حيث يقع حدث مُعين فيقوم الخادم بإرسال إشعار إلى العميل عبر تقنية الweb socket دون الحاجة إلى أن يطلب العميل ذلك وتلك مقالة تشرح ألية عمل تلك التقنية بإستخدام الجافاسكريبت
-
بالإضافة إلى إجابة الأستاذ بﻻل, فإنه يوجد عدد من الدوال الخاصة بالمصفوفات في الجافاسكريبت التي تُوضع تحت مُسمى البرمجة الوظيفية(functional programming) والتي تقوم بعدة وظائف تجعل الشفرة البرمجية أسهل في القراءة وأقصر, من بين تلك الدوال يوجد دالة تقوم بتنفيذ الغرض المطلوب من شفرتك البرمجية تُسمى بreduce , تلك الدالة وظيفتها أنها تقوم بالمرور على المصفوفة كلها وتستقبل متغير من نوع دالة الإرجاع(callback function) وتقوم بإعطاء دالة الإرجاع متغيرين عبارة عن العنصر السابق والعنصر الحالي في المصفوفة, وتقوم بتنفيذ عملية تُحددها أنت على تلك العناصر ويكون تعريف الدالة بالشكل التالي reduce((previousValue, currentValue) => { ... } ,initialValue) ويُمثل المتغير initialValue القيمة الإبتدائية للعنصر السابق, حيث في بداية المرور بالمصفوفة لا يكون هنالك عنصر سابق, فيمكن إذا تحويل الشفرة البرمجية خاصتك إلى كود أبسط كما في الشكل التالي const cart = [1,3,4,5,6]; const total = cart.reduce((previousValue, currentValue) => previousValue + currentValue,0); حيث تقوم الدالة بالمرور على عناصر المصفوفة, بدءاً من أول عنصر وهو "1" وتكون قيمة العنصر السابق الإبتدائية بصفر, فيتم جمع صفر مع 1 لتصبح قيمة العنصر الإبتدائية ب1 في الدورة التالية يتم جمع قيمة ال1 مع ال3 لتصبح 4 في الدورة التالية يتم جمع قيمة ال4 مع ال4 فتصبح 8 في الدورة التالية يتم جمع قيمة ال8 مع ال5 فتصبح 13 في الدورة التالية يتم جمع ال13 مع 6 فتصبح 19 ويمكنك قراءة هذا المقال حتى تفهم دوال المصفوفات بشكلٍ أفضل
- 4 اجابة
-
- 2
-
بالإضافة إلى إجابة أستاذ عدنان فإن الview من الممكن أن تقوم بتحسين الأداء, حيث أن الview يوجد منها نوع يُدعى materialized view , هذا النوع على عكس عرض البيانات(view) التقليدي ﻻ يتم تخزين التعريف فقط وإنما يتم تخزين البيانات نفسها وذلك يقوم بتحسين الأداء بناءاً على أكثر من نقطة الفهرسة: بما أن البيانات يتم تخزينها , إذا يمكن أن يتم فهرستها مما يقوم بتقليل الوقت الﻻزم للبحث ويُحسن من الأداء بشكلٍ مباشر تخزين الإستعﻻمات المعقدة : عندما تقوم بتخزين materialized view مبنية على التداخل (join) أو التجميع(aggregation) فإنك ﻻ تحتاج في كل مرة تنفذ فيها الإستعﻻمة أن تقوم قاعدة البيانات بعملية التداخل بين البيانات , إنك فقط تقوم بجلب البيانات من العرض(view) مُحسن الإستعلامات (query optimizer) سيقوم تلقائي بجلب البيانات من العرض إن كان جلبها من هناك أسرع حتى ولو لم تحدد ذلك في الإستعﻻم
- 3 اجابة
-
- 1
-
تلك المشكلة تحدث عند التﻻعب بالمصفوفة وإنتاج مصفوفة تحتاج إلى إعادة الفهرسة (re-indexing) مما يجعل الjson_encode ﻻ يعتبر أن تلك الأرقم هي فهرس للمصفوفة بل يعتبرها مفاتيح نظراً لأنها مفهرسة بشكل غير سليم, الحل أن تقوم بإعادة الفهرسة ويمكنك القيام بذلك ببساطة عبر إستخدام الدالة array_values والتي تأخذ مُعامل واحد عبارة عن المصفوفة المُراد إعادة فهرستها وتُنتج مصفوفة بدون مفاتيح بل بفهرس سليم كما في الشكل التالي $arr = array_values($arr); var_dump(json_encode($arr))
- 2 اجابة
-
- 1
-
جلب النتيحة من قاعدة البيانات مباشرةً عبر الsql join يُعد أفضل وذلك إعتماداً على عدد من الأسباب مثل المكان الطبيعي للتعامل مع البيانات هو قواعد البيانات فﻻ يجب أن أن نجعل الخادم يقوم بتلك المهمة بدلاً عن قاعدة البيانات حتى ﻻ نخالف قاعدة المسؤلية الواحدة" Single responsibility" ويكون كل جزأ في المشروع يقوم بوظيفته يكون الأمر منطقياً أكثر عند تنفيذه بإستعﻻمة واحدة ويكون الشفرة البرمجية قابلة للقراءة بشكل أفضل يكون الأداء أفضل وأوفر للموارد حيث ﻻ تحتاج أن ترسل طلبات مختلفة إلى قاعدة البيانات كل مرة, بل تقوم بإرسال طلب واحد مما يُزيد الأداء ويوفر الموارد تقوم قاعدة البيانات بإستخدام مُحسن الإستعﻻمات(query optimizer) بتنفيذ الإستعﻻمة الواحدة بطريقة فعالة أفضل , فمثلاً عند تنفيذ جملة تقوم بجلب بيانات الموظفين في قسم معين select * from employee inner join department using ssn ستقوم قاعدة البيانات بإستخدام الفهرسة(indexing) جلب البيانات فقط التي تحتوي ع المفتاح ssn , بينما عند تنفيذ نفس الوظيفة عبر جملتين مختلفتين وربطهم بلغة الخادم(php, c#. java) ستضطر إلى جلب جميع البيانات ومن ثم فلترتها مما يعني تنفيذ عمليات أكثر يمكن أن نأخذ مثالاً أخر SELECT e.fname, e.lname FROM employee e WHERE EXISTS ( SELECT 1 FROM payment WHERE payment.emp_id = emp.id ); تلك الجملة تقوم بإرجاع بيانات الموظفين الذين لهم عمليات دفع , هنا تقوم قاعدة البيانات بتنفيذ الجملة الداخلية أولاً ومن ثم تقوم جلب البيانات التي تتطابق فقط مع الجملة الداخلية, إن قمنا بتنفيذها عبر عدة جمل وربطها بلغات البرمجة سنضطر إلى جلب البيانات كلها ومن ثم فلترتها مثل المثال السابق مما يعني عمليات أكثر وبوجهٍ عام في قواعد البيانات يُفضل أغلب الأوقات أن تقوم بتنفيذ الإستعﻻمات عبر جملة واحدة
- 2 اجابة
-
- 2
-
كلمة nosql هي كلمة عمومية بعض الشئ, حيث أن المقصود بال nosql هو أي نوع من أنواع قواعد البيانات التي ﻻ تتبع لغة الsql , من الممكن أن تكون قاعدة البيانات تلك من النوع مفتاح وقيمة(key- value) حيث تعتمد على تخزين البيانات على هيئة مفتاح وقيمة, حيث يجب معرفة المفتاح حتى تستطيع الوصول إلى قيمته مثل قاعدة بيانات Redis وثائقية(document store) حيث تعتمد على تخزين البيانات على هيئة وثائق تُشبه ملفات الjson مثل قاعدة بيانات MongoDB تخزين الرسم البياني( graph store) والتي تعتمد على تخزين البيانات على هيئة هيكل بيانات الgraph مثل قاعدة بيانات Neo4j وأما قواعد بيانات الsql هي قواعد البيانات التي تعتمد في إستعلاماتها وعملياتها على لغة الsql مثل oracle, mysql, postgresql وبالنسبة لسؤالك أيهما تستخدم فذلك يعتمد على نوع البيانات المُراد تخزينها ونوع العمليات المُراد تنفيذها على تلك البيانات ويمكنك معرفة الإجابة على سؤالك بعد قراءة المقارنة التالية سرعة التطوير أو الإنتاجية: الsql تحتاج إلى تصميم جيد للschema حتى تقوم بتخزين البيانات بشكل فعال والإستفادة من خصائص قواعد البيانات العﻻئقية , وبالتالي يُهدر المطور وقتاً في تصميم قاعدة البيانات, على الجانب الأخر بما أن قواعد بيانات الnosql تعتمد على unstructured-data فإن المُطور ﻻ يحتاج إلى التفكير وقتاً طويلاً في تصميم قاعدة البيانات بالإضافة لسهولة تعديل التصميم في الnosql على عكس الsql التي تحتاج إلى عدداً من الأوامر حتى تستطع تعديل التصميم سرعة الكتابة : بما أننا قلنا أن ال nosql ﻻ تحتاج إلى مخطط (schema) هذا يجعل إدخال البيانات سواء بالتحديث أو الإنشاء(create/ update) يتم في غاية السرعة على عكس قواعد البيانات sql التي تحتاج إلى القيام بعمليات تصديق(validation) على البيانات قبل إدخالها مما يُبطئ من عملية الكتابة سرعة القراءة: في تلك النقطة تتفوق الsql بجدارة نظراً لتنظيم البيانات ووجود مخطط واضح مما يُسهل عملية الوصول إلى البيانات وسرعة عملية القراءة بالإضافة إلى تقنية الفهرس ( index technique) التي تجعل من عملية القراءة سريعة إذا ماذا تستخدم؟ إن كنت تحتاج إلى قاعدة بيانات منظمة وواضحة وسهل قراءة البيانات والوصول إليها, أو كنت تحتاج إلى تخزين بيانات مرتبطة ببعض , أو تحتاج قاعدة بيانات تضمن لك سﻻمة البيانات وتنظيمها فعليك إختيار قواعد بيانات الsql على الجانب الأخر إن كنت بحاجة إلى تخزين كمية ضخمة من البيانات غير المنظمة فهنا عليك إختيار الnosql
- 2 اجابة
-
- 2
-
طبيعي أن تشعر في البداية أنك مشتت قليلاً أو تائه بعض الشيئ, ولكن يجب أن تتحدى نفسك وتحاول بعد التطبيق وراء المدرب أن تقوم بعمل الصفحة بمفردك , وإن واجهتك مشاكل في الشفرة البرمجية حاول أن تقوم بالتالي أن تقوم بالبحث وحل المشكلة بنفسك لأن هذا سيساعدك على الفهم وسيثبت المعلومات أن تقوم بإعادة مشاهدة الفيديوهات وتحاول أن تفهم منها ما سبب الخطأ الذي يقابلك إن لم تُوفق قم بسؤالنا وسنشرح لك المشكلة وسببها وخطوات الحل وإن وجدت مفهوماً أو شفرة برمجية أو خاصية...الخ شرحها المُحاضر في الدرس ولم تفهمها بشكل جيد أو وجدت بعض التشويش في فهمها يُمكنك سؤالنا وسنحاول أن نشرح لك ما ينقصك بقدر المستطاع بالتوفيق وحاول أن ﻻ تترك شيئاً في الدورات غير مفهوماً بالنسبة لك لأن هذا سيؤثر سلباً في باقي المسار , ﻻ تتردد أبداً في السؤال عن أي شيئ تجده غير واضح بالنسبة لك , فإن هذا طبيعي لأنك في بداية الطريق وﻻ عيب في ذلك كلنا مررنا بتلك التجربة
- 4 اجابة
-
- 2
-
ستجد في موسوعة حسوب توثيق لجميع الأكواد , بالإضافة إلى أنه يمكنك السؤال عن الكود الذي تقابلك مشكلة في فهمه وسنحاول شرحه لك بقدرِ المُستطاع موسوعة حسوب
- 4 اجابة
-
- 1
-
يمكنك إستخدام الدالة CONCAT والتي تأخذ مُعاملان وتدمجهم ليصبحو معامل واحد كما في الشكل select concat(fname,lname) as fullname from employee ولكن هذا إن كان كلاً من الحقل الأول والثاني من نوع السلسلة النصية , إن كان أحد الحقول أو كﻻهما من نوع بيانات أخر يجب أولاً تغيير هذا النوع وتحويله إلى سلسلة نصية, وتتم تلك العملية بشكلٍ مختلف حسب قاعدة البيانات المُستخدمة في SQL-SERVER: يمكنك إستخدام الدالة CONVERT كما في الشفرة SELECT CONCAT( CONVERT(varchar(10), salary) , fname) as 'salary / name' FROM employee في postgres يمكنك إستخدام الدالة cast SELECT CONCAT(CAST(salary AS text),fname) AS name_salary في mysql ﻻ يجب فعل شيئ فستقوم دالة concat بتحويل الأرقام إلى نصوص بشكلٍ تلقائي select concat(salary, fname) as name_salary
- 2 اجابة
-
- 1
-
LAMP هو إختصار ل(linux, apache, mysql, python/php/perl) هي مجموعة من الحلول تُشبه xampp(apache,mariadb,perl,php) تُستخدم حقبة خدمات lamb لإدارة خوادم الويب وإنشاء المواقع وهي من حقب الحلول المُفضلة لدى مستخدمين لينكس حيث الapache : يُمثل خادم الويب الذي يتم إستضافة وإدارة الموقع من خﻻله linux يُمثل نظام التشغيل مفتوح المصدر الشهير والمُستخدم مع أغلب الخوادم mariadb/mysql تُمثل قاعدة البيانات المُستخدمة python/php/perl تُمثل لغة البرمجة المُستخدمة في برمجة الخادم والتي يُمكن أن تكون أي لغة مُستخدمة في البرمجة الخلفية (backend)
- 2 اجابة
-
- 1
-
يمكنك تحقيق ذلك عبر التعامل مع الأحرف من خﻻل جدول أسكي (ASCII Table) وهو جدول يُمثل كل حرف وما يُقابله من عدد عشري كان أو ثنائي أو ثماني أو سادس عشر, وتكون الخوارزمية بالشكل التالي عند قرائة جدول الأسكي ستﻻحظ الأتي: الأحرف الكبيرة تبدأ من الرقم العشري 65 وتنتهي عند الرقم 90 الأحرف الصغيرة تبدأ من الرقم العشري 97 وتنتهي عند الرقم 122 مما سبق نستنتج أنه يمكننا تحويل الحرف من كبير إلى صغير عبر إضافة 32 رقم يمكننا تحويل الحرف الصغير إلى كبير عبر طرح 32 رقم ولإيجاد قيمة شفرة الأسكي الخاصة بحرف نقوم بتنفيذ الشفرة التالية let name="sharaf"; let asci_code=name.charCodeAt(0); //////سيقوم بإرجاع قيمة الأسكي كود الخاصة بأول حرف ////s=115 ولتحويل قيمة شفرة الأسكي إلى حرف نقوم بإستخدام الشفرة التالية String.fromCharCode(115); ///يقوم بطباعة s فيكون في النهاية الشفرة البرمجية الخاصة بك على الشكل التالي let swappedName = "shImA"; let arr=swappedName.split(''); for (let i=0;i<arr.length;i++){ let char_code=arr[i].charCodeAt(0); arr[i]=char_code<97?String.fromCharCode(char_code+32):String.fromCharCode(char_code-32); } swappedName=arr.join(""); console.log(swappedName);
-
بالإضافة إلى إجابة أستاذ وائل, فإن بيانات الفهرس يتم تخزينها على شاكلة هيكل بيانات الشجرة المتوازنة(b+tree) والتي تعتمد في طريقة تخزينها على أن يحمل كل عنصر في الهيكل ثﻻث معلومات قيمة العنصر مؤشر(pointer) يُشير إلى العنصر على يمينه مؤشر(pointer) يُشير إلى العنصر على يساره وتعتمد الأشجار المتوازنة في ألية عملها على أن دائما وأبداً يكون كل عنصر أكبر من العناصر على يمينه , وأصغر من العناصر على يساره مما يُسهل عملية البحث ويجعلها في أسوأ الحالات تأخذ تعقيد وقتي قيمته O(logn) فعندما نريد إذاً البحث عن عنصر ما في قاعدة البيانات ﻻ نحتاج أن نمر على جميع العناصر وإنما فقط نقوم بالمرور على عدد من العناصر يساوي لوغاريتم العنصر للأساس 2 في أسوأ الحالات ومن الممكن تحديد هيكل البيانات المُستخدم أن يكون من النوع جدول التجزئة( hash table) والذي يعتمد في ألية عمله أن يكون على هيئة القيمة والمفتاح (key&value) فيتم تخزين ناتج تجزئة مفتاح( element hashing) في المصفوفة الخاصة بالجدول, وعند الإحتياج للوصول إليه يتم ذلك في تعقيد وقتي O(1) حيث أن ناتج التجزئة يكون ثابت دائماً فﻻ نحتاج إذا للبحث, ولكن في الحياة العملية ﻻ يتم إستخدام الجدول بسبب وجود عدد من المشاكل مثل إن تم تخزين أكثر من مفتاح لهم نفس ناتج التجزئة(hashing) تحدث حالة تداخل(collision) فيتم تخزين كلا العنصرين في قائمة ويتم تخزين تلك القائمة في العنصر في المصفوفة, وكثرة التداخلات تُسبب إستهﻻك للموارد وأداء سيئ نسبياً ﻻ تعمل جيداً مع العمليات التي نحتاج فيها إلى إستخدام معاملات أكبر من, أو أصغر من , تعمل فقط مع معامل المساواة فمثلاً جملة مثل select * from student where indx>5 سيتم معالجتها بأداء سيئ عند إستخدام جدول التجزئة حيث أنه ﻻ يقوم بتخزين قيمة الفهرس وإنما يٌخزن قيمة التجزئة , فسيكون التعقيد الوقتي هنا مساوي لO(n)
- 2 اجابة
-
- 2
-
مُكون الصور (Image Component) في next.js له عدد من المميزات مما يجعل له حلٌ لمشاكل الأداء(performance issues) حيث يقوم ذلك المُكون بتقديم عدد من المزايا مثل صيغة الصور: حيث ﻻ يقوم ذلك المُكون بتقديم الصور بصيغ قديمة مثل الjpeg, png وإنما يقوم بضغط الصور وتقديمها بصيغ مثل WebP, AVIF مما يجعل حجم الصور أقل بنسبة تُقدر ب20% إلى 30% تحميل الصور: حيث ﻻ يقوم ذلك المُكون بتحميل الصور فور دخول المُستخدم إلى الصفحة وإنما يقوم بتحميل الصور التي فقط يحتاجها المُستخدم ويقوم بعمل scroll إليها خاصية التحميل المُسبق: حيث يمكنك تحديد صورة ما بخاصية التحميل المسبق وتجعلها تحمل للمستخدم مبكراً قبل تحميل باقي الصفحة بالإضافة لمميزات أخرى يُقدمها هذا المُكون تُسهل من التعامل مع الصُور وتسهل عملية إضافة العديد من الخصائص عبر توفيرها
- 2 اجابة
-
- 2
-
المعاملات النصية مثل $like, $gt, $gte, ...etc تم إلغاؤها من بعد الإصدار الخامس من مكتبة الsequelize, لإستخدام تلك المعاملات يمكنك إستخدام الوِحدة(module) Sequelize.Op والتي تمكنك من إستخدام المُعاملات على النحو التالي: const Sequelize = require('sequelize'); const Op = Sequelize.Op; const posts: = await Posts.findAll({ where: { title: { [Op.like]: '%' } } }); ومن الممكن إستخدام الأسلوب القديم في الكتابة ولكن سيعطيك هذا تحذير , ولكن بوجهٍ عام يمكنك تنفيذ الأسلوب القديم ولكن تحتاج أولاً إلى تثبيت أسماء مستعارة من أجل المُعاملات ومن ثم نقوم بتمرير تلك الأسماء إلى الإتصال الجديد القائم بين قاعدة البيانات على النحو التالي const Op = Sequelize.Op; const operatorsAliases = { $like: Op.like, $not: Op.not } const connection = new Sequelize(db, user, pass, { operatorsAliases })
-
الفيزياء والعلوم بوجه عام لن تفيدك في البرمجة بشكل مباشر, قد تفيدك فقط من ناحية تشكيل عقلية لها منهجية عقلية أو في البرامج المرتبطة بالفيزياء مثل برامج الmodelling والتي هي عبارة عن محاكاة لقوانين الفيزياء ولكن من خﻻل الحاسب الألي ليس لها قوانين خاصة بالبرمجة ولكن كما قلت إن قمت بعمل برامج modelling أو ألعاب فبالطبع ستحتاج لقوانين الحركة بالإضافة لقوانين أخرى حسب البرنامج أو اللعبة لن تفيدك بشكل كبير إلا إن قمت بعمل مواقع لها عﻻقة بالفيزياء إن كنت تقصد بالمشكلات البرمجية مهارة الproblem solving فسوف تحتاج الرياضيات وليس الفيزياء نظراً لإعتماد الكثير من المشكلات على نظريات رياضية أو نظريات من علوم الحاسب مبنية على أسس رياضي ولكن بوجهٍ عام حاول أن ﻻ تُشتت نفسك فإن تعلم الفيزياء لن يُفيدك كمبرمج مالم تقوم بعمل برامج فيزيائية أو برامج للمحاكاة,
-
الcontext api هي عبارة عن مكتبة لتسهيل إدارة الحالة(state management) حيث تمكنك من جعل الstate يتم مشاركتها في التطبيق ككل وليست خاصة بكل صفحة, ونقوم بإنشاء الcontext عبر الشفرة البرمجية التالية const MyContext = React.createContext({ tasks:defaultValue, setTasks:()=>{} }); وتستبدل ال defaultValue بالقيمة الإبتدائية للstate , في حالتك هنا من المنطقي أن تكون القيمة الإبتدائية عبارة عن مصفوفة فارغة حيث يكون المستخدم عن بداية التطبيق ليس لديه أي مهام بعد وعندما نريد الوصول إلى الstate الموجودة في الcontext نقوم بوضع الcomponent التي نريد إتاحة الcontext لها داخل وسم يحمل إسم الcontext متبوعاً بكلمة .profider بعد إستدعاء ال MycContext كما مُوضح في الشفرة التالية import MyContext from "./Context/MyContext"; import Header from "./Components/Header"; function App() { const [tasks, setTask] = useState(false); return ( <MyContext.Provider value = {tasks, setTask}> <div> <Header /> </div> </MyContext.Provider> ); } export default App; ومن أجل إستدعاء قيمة ال state داخل إحدى تلك الcomponents الموضوعة داخل الMyContext.Provider نقوم بإستخدام الخُطاف(hoom) المُسمى useContext const [tasks,setTasks]= useContext(MyContext) ونقوم بتغيير قيمة الtask عن طريق إستخدام setTask setTasks(yourValue) وذلك رابط لتوثيق ال context https://wiki.hsoub.com/React#.D8.A7.D8.B3.D8.AA.D8.AE.D8.AF.D8.A7.D9.85_.D8.A7.D9.84.D8.B3.D9.8A.D8.A7.D9.82_.28Context.29
- 7 اجابة
-
- 2
-
حسنا يوجد لديك مشكلتان أنك لم تقوم بكتابة شفرة من أجل إظهار المهام , يجب كتابة شفرة كتلك في صفحة الإظهار {todos.map(todo => ( <TodoList key={todo.key} todo={todo} deleteTodo={deleteTodo} /> ))} أنت ﻻ يمكنك الوصول إلى المهام التي يتم إنشاؤها في صفحة الaddTask , حيث أنك تنشئها في state خاصة بتلك الصفحة, فﻻ يمكن لباقي الصفحات الوصول لها, الحل أن تقوم بمحاولة إرسالها إلى صفحة الإظهار على هيئة props والذي سيكون معقداً نوعا ما, فالحل الأفضل أن تقوم بجعل الstate مُشتركة بين الصفحات عبر إستخدام الcontext api أو ال redux ولكن بما أنك لم تتعلم الredux بعد فيمكنك الأن إستعمال الcontext api والتي ستكون سهلة نسبياً مقارنةً بالredux
- 7 اجابة
-
- 1
-
هل من المفترض أن تظهر المهام في صفحة home?
- 7 اجابة
-
- 1
-
1. بالطبع هي مهمة , فإنه يوجد فرق بين البرمجة وبين التكويد(كتابة الشفرة البرمجية) حيث أن البرمجة في المقام الأول تعتمد على حل المشكلات, أي برنامج يتم تنفيذه هو في الأصل عبارة عن مشكلة وييتم حلها بواسطة ذلك البرنامج ويتم هذا عبر عدد من الخطوات تتمثل في: التعرف على المشكلة وتوضيحها: مثلاً أنت لديك بيانات عمﻻء في مصرف وتريد ترتيبهم, أول خطوة أن تحدد المشكلة وهي أن البيانات غير مرتبة تحديد الأهداف: الهدف من البرنامج هو جعل البيانات مُرتبة سعياً لسهولة التعامل معها وعﻻجها كتابة حل للمشكلة على هيئة خوارزمية التأكد من أن الحل سليم عبر تجربته مع عدد من الحالات حسناً أوقات تكون تلك الخوارزمية عبارة عن حالات عديد من الخطأ والصواب(true & false) في تلك الحالة نقوم بإستخدام شجرة القرارات حيث تكون أكثر أداة مناسبة من أجل دعم إتخاذ القرار المناسب 2. كما إتفقنا فإن أول خطوات كتابة الكود أو البرنامج أن تقوم بتحويله إلى نموذج عقلي بمساعدة أدوات مثل خرائط التدفق أو شجرة القرارات سعياً لتوضيح الفكرة وتسهيل عملية الوصول إلى الحل المطلوب, فبعد رسم شجرة القرارات نقوم بتحويلها إلى كود حيث أن شجرة القرارات هي نموذج بحتي لحل المشكلة(abstract model) نحتاج بعدها إلى تطبيق على ذلك النموذج (implementation) وهو مايتم بإستخدام الكود 3. شجرة القرارات تُستخدم لدعم إتخاذ القرار سواء كان ذلك القرار برمجياً أو في أي حقل أخر حيث كما أوضحنا أن تلك الأدوات تُستخدم لحل المشكلات بشكل بحت أو تجريدي( abstract) سواء كان تطبيقها برمجياً بالكود أو كان تطبيقها بواسطة العامل البشري كالقرارات الإدارية
-
ﻻ يوجد circular linked list في المكتبة القياسية (stl) ولكن يمكنك تحقيق غرضك بإستخدام الvector عن طريق إيجاد باقي قسمة الفهرس index على حجم المُتجه(vector) فمثلاً إن كان لديك مُتجه حجمه 27 فإن قمت بتنفيذ الشفرة cout<<vector.at(27%25) ستجد نفس الناتج إن قمت بتنفيذ cout<<vector.at(2%25) في الحالتين سيأتي بالعنصر في الفهرس رقم 2 وإن كنت تريد معاملة الفهرس السالب بالمثل يمكنك وضع معادلة باقي القسمة بداخل دالة القيمة المطلقة كما في الشفرة البرمجية التالية vector.at(abs(index%vector.size()))
-
سبب تلك المشكلة أنك تقوم بإعطاء دالة الرتب(rank) معاملات (parameters) بينما تلك الدالة تعمل دون تمرير أي معاملات لها, إن كنت تريد ترتيب الموظفين بناءاً على مرتبهم إذا يجب عليك إعطاء الدالة over معامل order by salary لتصبح في النهاية الجملة كالتالي select rank() over(partition by gender order by salary) from employee وبوجه عام, نقوم بإعطاء دالة الover كمعامل أول العمود المُراد تقسيم الصفوف إلى مجموعات طبقاً لقيمته مسبوقاً بكلمة partition في حالتك هنا تريد تقسيم البيانات إلى مجموعات طبقاً لجنسهم , أي طبقاً لقيمة العمودgender ومن ثم نقوم بترتيب العناصر طبقاً للعمود المُراد حساب الرتبة بناءاً عليه بإستخدام جملة order by متوبعةً بإسم العمود
-
أجل يوجد , يمكنك إستخدام الدالة array_map كبديل للدالة map , وتأخذ تلك الدالة معاملين, الأول وهو الدالة المُراد تنفيذها والمعامل الثاني هو المصفوفة المُراد تنفيذ العملية عليها function fun1(){ ////code } $colors = array("red","blue","orange"); print_r(array_map("fun1", $colors)) //////or array_map(function(){ ///code },$colors) ويتم تنفيذ الدالة array_filter كبديل للدالة filter وهي على نفس صيغة الدالة array_map function fun1(){ ////code } $colors = array("red","blue","orange"); print_r(array_filter("fun1", $colors)) //////or array_map(function(){ ///code },$colors) أما بالنسبة للforeach يمكن تنفيذها على النحو التالي foreach ($colors as $c) { ///code } حيث تعبر ال $c عن قيمة العنصر الحالي, حيث أن الforeach تقوم بالمرور على جميع عناصر المصفوفة واحداً تلو الأخر ويمكن أيضا تحقيق الدالة reduce بإستخدام الدالة array_reduce والتي تشبه الدوال السابقة function sum($element1, $element2) { return $element1 + $element2; } $array = array(15, 120, 45, 78); print_r(array_reduce($array, "sum", 0));
- 1 جواب
-
- 1
-
يمكنك عبر تصغير الخط وتعديل مكونات الصفحة بإستخدام الmedia query لتناسب المقاسات الصغيرة
- 9 اجابة
-
- 1