اذهب إلى المحتوى

Wael Aljamal

الأعضاء
  • المساهمات

    6975
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    218

كل منشورات العضو Wael Aljamal

  1. في حالتك يمكنك قراءة القيم من local storage خارج useEffect وهذا أفضل حل const [ meetings, setMeetings] = useState([]) // meetings= [{meeting1},{meeting2}] const meetingsData = localStorage.getItem('meetings'); // نقلناها خارج useEffect const meetingsDataJSON = () => JSON.parse(localStorage.getItem('meetings')); // نقلناها خارج useEffect useEffect(() => { if(meetingsData === undefined || meetingsData === '' || meetingsData === null ){ localStorage.setItem('meetings', JSON.stringify([])) } if( meetingsDataJSON().length === 0){ const meetingsInLocalStorage = JSON.parse(localStorage.getItem('meetings')) setMeetings([...meetings, meetingsInLocalStorage]) } },[meetings]) يمكن إضافة مستمع أحداث للتغيرات التي تطرأ على meeting في local storage وتقوم على تحديثها تلقائياً useEffect(() => { function checkMeetingData() { const item = localStorage.getItem('meetingData') if (item) { setMeetingData(item) } } window.addEventListener('storage', checkMeetingData) return () => { window.removeEventListener('storage', checkMeetingData) } }, []) أو بهذه الطريقة: useEffect(() => { window.addEventListener("storage", () => { // تحديث عند حدوث تغييرات في التخزين refetch(); }); return () => { // عند عمل unmounts نحذف مستمع الأحداث window.removeEventListener("storage"); }; }, []);
  2. لديك الخطأ في مسار ملف التنسيقات، لايمك للمسار أن يبدأ ب / لأنه يدل على مسار مطلق بدل أن يكون نشبي، أي يجب أن يبدأ بنقطة /. أو امس المجلد / اسم الملف الحاوي لملف التنسيقات <link rel="stylesheet" href="/style.css" /> ^^^^^^^^^ خطأ جرب أحدهم <link rel="stylesheet" href="./style.css" /> <link rel="stylesheet" href="./css/style.css" /> <link rel="stylesheet" href="css/style.css" /> على كل حال نضمن ملف التنسيقات في index.js وليس في صفحة الويب مباشرة أحيانا النقطة تسبب مشكلة، اكتب المجلد أو اسم الملف مباشرة حسب المسار النسبي، بين ملف التضمين و ملف التنسيقات، لكن لا تبدأ ب / إن كان مشروعك node تأكد من تخديم الملفات الساكنة: app.use(express.static(__dirname + '/public'));
  3. طريقة تعتمد على الحلقة التكرارية، حيث نحسب في كل تكرار للحلقة ناتج قسمة العدد على 10 (قسمة صحيحة) ما يؤدي للتخلص من خانة الآحاد في كل تكرار وفي آخر تكرار تبقى ليدنا خانة وحيدة، وسوف تحوي النتيجة النهائية الصحيحة int x = 123; while (x >= 10) { x = x / 10; } // خلال البرنامج x = 123 x = 12 x = 1 x = 1 // الجواب إذا كان x أصغر من 10 فهو نفسه الإجابة، إن كنت تريد شمل القيم السابة، ثم نقوم بالعمليات على x موجبة بعد ضربها ب -1، أو القيمة المطلقة x = Math.abs(x); أو if ( x < 0) x = -x; // x*= -1; وستعطي نفس النتيجة
  4. لايوجد مشكلة بالنسبة لاستخراج تطبيق أندرويد من أي بيئة cross platorm في نظام التشغيل إن كان ويندوز أو ماك هذا لأن android sdk متاح مجانا و يعمل على جميع الأنظمة, فالمشكلة فقط محصورة ببناء تطبيقات ios لأن شركة apple تحتكر أدوات التطوير ios sdk وليست متوفرة خارج نظام mac os لذلك تحتاج لهذا النظام عند نيتك استخراج تطبيقات ios إن كان المشروع cordova أو Flutter. مع ذلك يمكنك تثبيت نظام ماكنتوش وهو بديل ماك يمكنك تثبيته واستعماله كنظام تشغيل أو حتى على بيئة وهمية virtual machine، أو استخدام ادوات مثل codemagic لبناء تطبيقك الخاص ب ios وهذه متاحة على الانترنت.
  5. كلا، الأوامر هي عبارة عن كلمات نصية عادية، إن تمت كتابتها في cmd منفذ الأوامر يقوم هو بالبحث عن البرنامج التنفيذية المطلوبة المثبتة ومنها كوردوفا .. لتنفيذ الأمر المطلوب، وفي حال كان الأمر صحيح، يتم تنفيذه. بعض الأوامر يجب أن تتم ضمن مسار المشروع، أي يكون مسار التنفيذ هو اسم مجلد المشروع لفتح المجلد في cmd مباشرة اكتب cmd ضمن مسار المشروع ثم اضغط Enter ** أوامر تثبيت البيئات لن تحتاجها إلا في حال حذفك للبرمجيات أو عمل فورمات للحاسوب، عد لدرس الدورة وتابع درس التهيئة من جديد وأعد كتابة الأوامر ** ومن خلال المتابعة مع المدرب باقي الأوامر أغلبها نفسه خاص بتشغيل التطبيق اكتبه مراراً وتكرارا لتحفظه وتتعود عليه لا تتعود على النسخ واللصق.. طريقة فتح المجلد في cmd:
  6. مرحبا عبد العلي، الأوامر التنفيذية تبقى نتيجتها محفوظة، مثل تثبيت أو تحميل أو تعديل إعدادات، لاتقلق لن يحذف شيئ. أما الأوامر نفسها - المستخدمة بكثرة - ستحفظها مع الوقت والتمرين. أوامر تثبيت المكتبات و الاعتماديات لديك تم تنفيذها وكل شيئ على مايرام. أرجو كتابة التعليقات المرتبطة بالدروس في قسم التعليقات أسفل الدرس، وسرعة الاستجابة من المدربين جيدة جداً وتلقى متابعة أفضل من الأسئلة العامة، وطلبك بسرعة لن يفيدك بشئ.. المدرب الذي يعرفل الإجابة لمشكلتك سيكتبها مباشرة. ملاحظة: لحفظ الأوامر يمكنك فتح ملف نصي بسيط وكتابتهم فيه وحفظه.. وهكذا يمكنك العودة إليهم وقتما تشاء
  7. نعم صحيح، بهذه البساطة
  8. يوجد عدة شروحات من الأكاديمية لها، أرجو قرائهم، ومعظمهم يحوي أمثلة
  9. سيكون هكذا: const sayHi = (name) => { console.log(`Hello there ${name}`) } function sayHi (name) { console.log(`Hello there ${name}`) } sayHi ("wael") // wael
  10. هذه تدعى arrow function في جافاسكربت اقرأ عنها أكثر، وهي طريقة تختصر كتابة الدوال،الشيفرة لديك تكافئ تعريف دالة باسم sayHi وتستقبل معامل name..
  11. إن كنت تستخدم المصفوفات الساكنة ذات الطول الثابت، او غيرها يمكن استعمال تابع الترتيب ()std::sort كيف يعمل: int n = 10; // حجم المصفوفة int a = {1,2,3,7,8,4,5,6,0} // تهيئة // int a[n]; قم بالتعريف بهذه الطريقة إن أردن إدخال قيم من حلقة لاحقا sort ( a , a + n) أول وسيط هو مؤشر بدياية المصفوفة ثاني وسيط يمثل مؤشر نهابة المجال الذينريد ترتريبه في المصفوفة اسمها هو نفسه مؤشر على بدايتها، وعملية الجمع تمثل عملية إزاحة للمؤشر الآخر، هذين المؤشرين يحددان طول المصفوفة الخاضع للترتيب يمكن تمرير دالة مخصصة لتابع الترتيب في حال أردنا عمل ترتيب مختلف عن الافتراضي bool comp(int i, int j) { // تستقبل الدالة الوسيطين الحاليين الذين بينهما علاقة ترتيب } sort(a , a + n, comp); يمكن استعمال الدالة sort مع vector بتمرير المؤشرات حسب دوال vector: vector <int > v(n); sort(v.begin(), v.end(), comp); وبالنسبة لعملية البحث عن عنصر في مصفوفة في ++C يمكن استخدام الدالة find والتي تعيد مؤشر على آخر عنصر مرت عليه في المصفوفة، إما يكون العمنصر المطلوب أو مؤشر على نهاية المصفوفة #include <iostream> // std::cout #include <algorithm> // std::find #include <vector> // std::vector int main () { // بحث في مصفوفة عادية int ints[] = { 1, 2, 3, 4 }; int * p; p = std::find (ints, ints+4, 30); if (p != myints+4) std::cout << "موجود: " << *p << '\n'; else std::cout << "غير موجود\n"; // بحث في vector and iterator: std::vector<int> vec (ints,ints+4); std::vector<int>::iterator it; it = find (vec.begin(), vec.end(), 30); if (it != myvector.end()) std::cout << "موجود: " << *it << '\n'; else std::cout << "غير موجود\n"; return 0; } الشكل العام لتابع البحث: if( std::find(vector.begin(), vector.end(), item)!=vector.end() ){ // العنصر موجود } يوجد أيضا تابع البحث الثانئي binary search وهذا يشترط ترتيب المصفوفة: if(binary_search(vector.begin(), vector.end(), item)){ // موجود }
  12. من أهم مبادئ البرمجة، عمل أجزاء صغيرة من الشيفرة البرمجية مسؤولة عن عمل شيئ واحد محدد، لكي نقلل من اعتماد أجزاء الشيفرات على بعضهم وهذا - في حال وجود خطأ - يمكننا من عول المشكلة "الشيفرة التي من الممكن سبب خطأ" وإصلاحها بسهولة بدون العبث مع باقي أجزاء الشيفرة. يمكنك فهم Module على أنها دالة برمجية تعيد لنا غرض وحيد Object يحوي تفاصيل برمجة جزء من المشروع، ويمكن اعتبار كل ملف JS على أنه وحدة منفصلة، كما يمكن في كل وحدة استخدام أسماء المتغيرات بشكل مباشر دون الاكترث من وجودها في مكان آخر من الملف إن كان كبيراً أو وجوده في ملفات أخرى، لأن الوحدات مغلفة ذاتياً، حيث أن التفاصيل التي تكتبها ضمن الوحدة لا يتم مشاركتها للخارج، فقط نشارك الأغراض النهائية التي تلزمنا بمكان آخر. يمكنك مراجعة المقالة: أنماط التصميم في JavaScript: الوحدات
  13. نعم بالطبع، أنت لديك صلاحية مشاهدة المسار الأول من باقي الدورات، وإن دورة علوم الحاسب خاصة بأساسيات البرمجة و الخوارزيمات وتفتح الطريق لك لتصبح أقرب بدجة من لغات البرمجة الحقيقية لتصبح متآلفا مع الشيفرات البرمجية و منطق تنفيذ البرامج وكذا. فهي لن تأخد منك الكثير من الوقت وستجعلك فاهما للخوارزيمات ومراحل تشغيل الكود، كما أن لغة برمجة سكراتش مفيدة جداً للمبتدئين، أنصحك بمتابعة المسار الأول من هذه الدورة. تابع أيضاً أساسيات تطوير الويب HTML - CSS - JS + أساسيات PHP لأن لغة البرمجة الخاصة بمخدم التطبيقات في هذه الدورة ( تطوير تطبيقات الجوال بتقنيات الويب) منها PHP
  14. كلا ليس عليك تثبيت xcode لكي تطور تطبيقات الهاتف، xcode مع حزمة مطوري آبل ضرورية لتطوير تطبيقات IOS بلغة برمجية swift أو مرحلة تصدير تطبيق Flutter. أي على نظام ويندوز يمكنك تثبيت محرر نصوص android studio أو vs code أو غيرهم مه ملحقات عملية التطوير ةالتي تدعى SDK والبدء بالبرمجة.. يوجد حل لتشغيل Xcode على حاسوب ويندوز، لكن يتوجب تحميل نظام تشغيل ماكنتوش على ويندوز كبيئة افتراضية ومن ثم تحميل Xcode عليه، لكن هذا يسبب بطئ شديد في الحاسوب و تحتاج ذاكرة وصول عشوائي Ram حتى 16 غيغا بايت وأكثر ومعالج قوي وحديث. الآن على ويندوز يمكنك برمجة و بناء وتجريب تطبيقات أندرويد، وإن استخدم لغة برمجة جافاسكربت و React Native يوجد أداة Expo التي تساعد المطور على بناء التطبيق لتجريبه على IOS لكن لن تحتاج لبناء تطبيق IOS حتى آخر مرحلة من تجربة التطبيق.. تكلمت عن البرمجة الهجينة للتطبيقات التي تسمح بتنفيذ الشيفرة البرميجة على أكثر من نظام تشغيل للهواتف، أما البيئة IOS Native محصورة ب xcode و mac os.
  15. أعتقد أن الخطأ في الحصول على الطلبية بصيغة JSON تأمد من تفعيل bodyParser ربما تراها متوقفة bodyParser: false وربما id لديك من نوع ObjectID لذلك عليك تحويلها.. const {ObjectId} = require('mongodb'); { "_id": ObjectId(req.user._id)}, حاول وضع الخيار {returnOriginal: false} لنجبر إعادة البيانات المعدلة return collection.findOneAndUpdate( // بحث وتحديث {_id: ObjectId(id)}, فلترة {$set: updatedDoc}, تمرير البيانات المعدلة {returnOriginal: false} // هنا نمنع الاستعلام من إعادة البيانات الأصلية );
  16. تأكد من كتابة Link في next.js على النحو التالي أي الخاصيتين href و as <Link href="/product?slug=something" as="/products/something"> <Link href="/user?id=id" as="/user/id"> <Link prefetch href={`/user?id=${this.props.id}`} as={`/user/${this.props.id}`} > <div>some content</div> </Link> لتصبح: <Link prefetch href={{pathname: '/speaker', query: {id: props.id}}} as={`/speaker/${this.props.id}`} > <div>some content</div> </Link> وإن كنت الصفحة لديك بالشكل: pages/user/[id].js قم بتعريف المسار بالشكل: <Link href={`/user/[id]`} as={`/user/${id}`}> إن وجدت حلاً مختلفاً يمكنك إرفاقه
  17. في تطبيق المخدم لديك، تأكد من إرسال الرد للزبون على شكل JSON.. أي res.json app.get('/', function(req, res){ res.json({ user: 'wael' }); }); يجب أن يرسل المخدم الرد على شكل JSON ليتمكن المتصفح (العميل) من إعادة البيانات لشكل JSON بعد وصولها في حال كنت تريد إرسال غرض كإجابة استخدم JSON.stringify: response.write(JSON.stringify(anObject));
  18. السبب الرئيسي في منعم إعادة ترقيم الأسطر في جدول البيانات وخاصة المفتاح الأساسي هو إمكانية ارتباط القيم من هذا الجدول إلى جداول أخرى، مثلا لديك جدول الموظفين، وجدول الأقسام، ووضعنا موظف واحد كرئيس أو عامل لدى الأقسام، والتي تتم عن طريق وضع رقم المعرف id الخاص بالموظف في أحد خواص جدول الأقسام، حيث أن أي تعديل في أرقام الموظفين سيؤدي لحدوث خطأ في الربط بين الجدولين.. اعتبر أن الموظف استقال، وأخذ رقمه موظف آخر في جدول قاعدة البيانات.. هل سيأخذ وظيفته ومكانه أيضاً؟ كلا.. تخيل أن يتغير ترقيم الموظفين .. سأضع مثال لبنية الجدولين ولاحظ استحالة تعديل ترقيم الموظفين.. جدول موظفين اسم رقم الموظف 1 وائل 2 إياد 3 سامح ثم جدول الأقسام اسم القسم رقم المدير 2 موارد بشرية 1 مدربين 3 بايثون في حال حذف وائل من الجدول الأول سيصبح إياد رقمه 1، و سامح رقمه 3، لاحظ رقم المدير (الذي هو موظف) من الجدول الثاني سيتغير الموظف مدير القسم لكل المستخدمين.. وجود قفزات في id لا تمثل أي مشكلة في سرعة أداء قاعدة البيانات يمكن تطبيق الاستعلام التالي على القاعدة في حال عدم ارتباط الجدول بجداول أخرى: alter table MYTABLE auto_increment = 1; أو SET @reset = 0; UPDATE YOUR_TABLE_NAME SET id = @reset:= @reset + 1;
  19. يمكن استخدام المكتبة tableToExcel.js حيث نتبع الخطوات: تضمين المكتبة عن طريق CDN <script src="https://cdn.jsdelivr.net/gh/linways/table-to-excel@v1.0.4/dist/tableToExcel.js"></script> استخدام المكتبة كالمثال التالي، إنشاء زر تصدير: // زر لتصدير الجدول إلى ملف // يقوم باستدعاء الدالة exportReportToExcel <button id="btnExport" onclick="exportReportToExcel(this)">تصدير التقرير</button> ثم كتابة الدالة: function exportReportToExcel() { let table = document.getElementById("#table1"); // تحديد الجدول // استخدام غرض من المكتبة لعمل التحويل اللازم TableToExcel.convert(table, { // name: `export_file_1.xlsx`, // اسم الملف sheet: { name: 'Sheet x' // اسم الورقة } }); }
  20. تمام تم التثبيت، أغلق هذه النافذة، ثم افتح أي نافذة أخرى ل cmd وتفذ أي تعليمات برمجية ل choco تريدها فقد تم التثبيت بنجاح هو برنامج، لكن نطلق عليه اسم أداة أو مدير الحزم حسب استخدامه، طريقة التحميل هذه تحمل الملفات المصدرية وتثبتها من الانترنت ولا نحمل برنامج تنصيب، هذا الفرق فقط..
  21. هو ليس برنامج تنزله كملف. بعد نسخ السكربت إلى cmd اضغط Enter عندها سيحمل الأداة وينسخ الملفات من الانترنت ويعرض لك حالة التقدم. أطلعني بالمستجدات وفي حال أي مشكلة قم بعمل لقطة شاشة لنفاذة cmd وأرفقها مع التعليق لنحل المشكلة شكراً لك
  22. لتحميل choco نتبع الخطوات التالية الموجودة في موقعهم الرسمي: نقوم بتشغيل cmd مع صلاحيات الأدمن (اكتب cmd في بحث ويندوز ثم اختر run as administrator) ننسخ محتوى تعليمة التنصيب من موقعهم ونفذها في cmd @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin" الرابط الخاص بالتوثيق: installing-chocolatey#cmd بالنسبة للدورات، فقط المسار الأول من باقي الدورات مفتوح وهذه الميزة عامة لجميع الطلاب تمكنهم من الإطلاع على باقي الدورات والاستفادة من مسار الأساسيات من دورة أخرى عند اللزوم.
  23. يمكنك تنفيذ عملية النقل mv = move باستخدام صلاحيات الأدمن إن كان المسار له صلاحيات مستخدم آخر .. sudo mv ~/Pictures/photo1 /usr/share/... ^^^ لاحظ الفرق بين المسار النسبي يمكن أن يبدأ بنقطة /. والمسار المطلق يبدأ ب / فقط، حيث أن usr يجب أن نضع قبلها / للدالة لأن المجلد usr في جذر النظام، أما ~ تدل على مسار المستخدم الحالي cd usr/username => cd ~
  24. نعم يمكن تحديد المجالات التي تريدها، اكتب مثلا اسم اللغة ثم unicode أي arabic unicode في البحث سيظهر لك جدول مجالات اللغة في نظام الترميز وأنت تضمن ما تريده: "[a-zA-Z0-9\u0600-\u065F]" استخدم نفس الفكرة، بداية المجال ثم - ثم نهاية المجال، لمعرفة المحارف بالضبط بدل المحرف x في العمود الأيسر مع الترقيم في أعلى الجدول.. 0 أول حرف في السطر، ثم F الأخير ويمكن وضع أي منهم 012345ِ789ABCDEF ...
  25. أسباب عامة أثناء البرمجة بسبب عدم الإطلاع على التوثيق تكون بسبب كتابة خاصية ما بطريقة خطأ مثلا كلمة user name الجزء الثاني name لايبدأ بحرف كبير $Correo->Username = "foo@gmail.com"; ^^^^^^^^ UserName خطأ مثلا وجود محارف خاصة في قيمة هذه الخاصيات ولنفرض $ لأنه محرف خاص ضمن PHP لذلك يتطلب مننا وضع محرف الهروب escape character / $mail->Password = "pa$word"; خطأ $mail->Password = "pa\$word"; صحيح ^^^^^^^^^ وفي حال استخدام gmail اضبط الإعدادت كما التالي: $mail->SMTPSecure = 'tls'; $mail->Host = 'smtp.gmail.com';
×
×
  • أضف...