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

Hossam Mohamed15

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

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

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

كل منشورات العضو Hossam Mohamed15

  1. جيد ولكن عليك أولاً التحقق من شرعية الأمر لأنه في بعض الدول، قد يكون استخدام Print Spooler API لرصد طباعة المستخدمين دون موافقتهم غير قانوني ويعتبر انتهاكًا للخصوصية. لدينا أكثر من طريقة ولعل أفضلها هي الأخيرة 1. الحصول على نسخة من ملف الطباعة يمكنك استخدام Node.js للوصول إلى مجلد `C:\Windows\System32\spool\PRINTERS` ومراقبته باستمرار لاكتشاف أي ملفات جديدة تم وضعها هناك بعد الطباعة. يمكنك استخدام مكتبة fs في Node.js للقراءة من المجلد ومراقبته. 2. الاشتراك في أحداث الطباعة يمكنك استخدام WMI (Windows Management Instrumentation) في Node.js للاشتراك في أحداث الطباعة في نظام التشغيل Windows. يمكنك استخدام واجهة WMI لتحديد أحداث الطباعة التي ترغب في مراقبتها. 3. تنفيذ أوامر مع Print Spooler API بمجرد اكتشاف ملفات الطباعة الجديدة، يمكنك استخدام مكتبة child_process في Node.js لتنفيذ أوامر تفاعل مع Print Spooler API. يمكنك استخدام هذه الأوامر لتحميل الملفات، أو إعادة توجيهها، أو أي عمليات أخرى ترغب في تنفيذها. وهذا مثال توضيحي : const { exec } = require('child_process'); const fs = require('fs'); // المجلد الذي يتم فيه حفظ ملفات الطباعة const printerSpoolDirectory = 'C:\\Windows\\System32\\spool\\PRINTERS'; // الدالة التي تقوم بقراءة ملفات الطباعة function readPrintedFiles() { fs.readdir(printerSpoolDirectory, (err, files) => { if (err) { console.error('خطأ في قراءة مجلد الطباعة:', err); return; } // فحص كل ملف في مجلد الطباعة files.forEach(file => { // إظهار اسم الملف console.log('ملف مطبوع:', file); // قراءة محتوى الملف إذا كان ذلك ممكنًا fs.readFile(`${printerSpoolDirectory}\\${file}`, 'utf8', (err, data) => { if (err) { console.error('خطأ في قراءة محتوى الملف:', err); return; } console.log('محتوى الملف:', data); }); }); }); } // استدعاء الدالة لقراءة الملفات المطبوعة readPrintedFiles(); ومع ذلك، يجب أن أكرر مرة أخرى أهمية التأكد من القانونية والأخلاقية لما تحاول القيام به، والتأكد من موافقة المستخدمين على مراقبة طباعتهم إذا كان هذا هو الهدف.
  2. هذا الكود ينشئ كائن تاريخ جديد يمثل اليوم الحالي، ثم يطرح يوم واحد من تاريخ اليوم الحالي للحصول على تاريخ الأمس. // الحصول على تاريخ اليوم الحالي var today = new Date(); // طرح يوم واحد من تاريخ اليوم الحالي للحصول على تاريخ الأمس var yesterday = new Date(today); yesterday.setDate(today.getDate() - 1); // عرض التاريخ الأمس console.log("تاريخ الأمس: " + yesterday); ويمكنك الاستمرار وتهيئة التاريخ بالشكل الذي تريد (ايام-ساعات-دقائق) // الحصول على اليوم var day = yesterday.getDay(); // الحصول على الساعة var hours = yesterday.getHours(); // الحصول على الدقائق var minutes = yesterday.getMinutes(); // عرض النتائج console.log("اليوم: " + day); console.log("الساعة: " + hours); console.log("الدقائق: " + minutes);
  3. دعني أشرح لك الامر بشئ من التفصيل. التطبيقات مثل TikTok تستخدم تقنيات متقدمة لتحميل وعرض المحتوى، وتعتمد على الجافا سكريبت وتقنيات الويب المتقدمة مثل AJAX وDynamic Rendering لتحميل المحتوى بشكل ديناميكي أثناء تصفح الصفحة. هذه التقنيات تجعل من الصعب جدًا تجريف كامل محتوى الصفحة باستخدام طرق التجريف التقليدية مثل Requests في بايثون. عندما تفتح صفحة TikTok في متصفح الويب، يتم تحميل العديد من الملفات والموارد الإضافية مثل الفيديوهات والصور والبيانات الديناميكية باستخدام طلبات AJAX أو استدعاءات API. هذه الموارد لا يمكن تجريفها ببساطة باستخدام طلب HTTP واحد، بل تحتاج إلى تفاعل مع الصفحة بشكل ديناميكي وتحليل الاستجابات لكل طلب. بالإضافة إلى ذلك، TikTok ومواقع التواصل الاجتماعي الأخرى قد تستخدم تقنيات لمنع التجريف مثل تقنية CAPTCHA أو حماية بروتوكول النقل HTTPS أو حتى تقنيات تشويش البيانات. هذه الإجراءات تجعل من الصعب جدًا أو حتى مستحيلًا في بعض الحالات تجريف كامل محتوى الصفحة دون تصارع مع الحماية المطبقة. واظن انه دائماً ستحدث مشاكل حين محاولتك لتجريف موقع لا يسمح للتجريف، لأنك ببساطة تحاول الوصول إلى المحتوى بطرق غير رسمية، والبعض يقول بأنه يعد سرقة إلكترونية.
  4. بالنسبة لاستخدام Next.js في مشروع مدونة مع Laravel كباك إند، يمكنك استخدام Next Auth إذا كنت ترغب في إضافة نظام مصادقة للمستخدمين في تطبيقك. يمكن استخدام Next Auth بشكل مستقل عن ما إذا كنت تقوم بتطوير تطبيق Full-Stack أو لا. Next Auth يوفر مجموعة من الخيارات المرنة للمصادقة، بما في ذلك المصادقة باستخدام البريد الإلكتروني وكلمة المرور، أو التوثيق باستخدام الوسائل الاجتماعية مثل Google وFacebook وTwitter وغيرها. لذا، إذا كنت ترغب في إضافة خيارات تسجيل الدخول والتسجيل لمستخدمي مدونتك، فإن Next Auth قد يكون حلاً ملائمًا لك. إذا كنت تفضل عدم استخدام Next Auth، فيمكنك تطبيق نظام المصادقة في Laravel والاتصال به من Next.js باستخدام طرق التواصل المعتادة مثل API. يمكنك إنشاء نقاط نهاية (endpoints) في Laravel للمصادقة واستخدامها من Next.js لتسجيل الدخول والتسجيل والتحقق من صحة الجلسة.
  5. نعم، في العديد من الحالات، يكون فهم أساسيات البرمجة مبهمًا في البداية، ولكن مع مرور الوقت والتقدم في البرمجة، يتضح الصورة ويصبح فهم الأساسيات أكثر وضوحًا. هذا يعود إلى طبيعة عملية التعلم وكيفية تطبيق المفاهيم النظرية عمليًا. عندما تبدأ في تعلم البرمجة، قد تجد صعوبة في فهم بعض المفاهيم الأساسية مثل المتغيرات، الشروط، الحلقات، والدوال. ومع ذلك، مع الممارسة المستمرة وبناء البرامج الصغيرة، ستلاحظ تحسنًا تدريجيًا في فهمك واستيعابك لهذه المفاهيم. بمجرد أن تبدأ في بناء تطبيقات أكبر وأكثر تعقيدًا، ستكتسب مزيدًا من الخبرة والتفاهم في كيفية تنظيم البرامج وحل المشاكل البرمجية بطرق فعالة. يمكن أن تساعدك الممارسة المستمرة والتعلم من الأخطاء في تعزيز فهمك وتطوير مهاراتك في البرمجة. فمثلاً عند دراستي لل Asymptotic analysis وهو موضوع يكرهه معظم الطلبة، لم استوعب ال Big O notations جيداً، ولكني أخذت بعض الملاحظات التي شعرت انها ستفيدني لاحقاً، ومع استمراري في التطيبق وحل المشاكل البرمجية استوعبتها وفهمتها جيداً.
  6. ال bitwise او العمليات الثنائية تتضمن التلاعب بالبتات الفردية individual bits ضمن التمثيل الثنائي للأرقام binary representation. في علوم الحاسوب، يتم تخزين البيانات ومعالجتها على مستوى البتات باستخدام الأصفار والواحدات (0 و 1). تعمل العمليات الثنائية على هذا المستوى الأساسي، مما يتيح للمبرمجين إجراء عمليات على البتات الفردية لتحقيق نتائج محددة. تُستخدم العمليات الثنائية غالبًا في البرمجة على مستوى منخفض، مثل تحسين الشيفرة لتحقيق أفضل أداء، والتلاعب بالعلامات أو الإعدادات في السجلات، والعمل مع البيانات الثنائية. توفر هذه العمليات وسيلة قوية وفعالة لتنفيذ عمليات على مستوى البتات.
  7. نستخدم التعبير الشرطي if else لتحقيق نتيجة ما، وهنا نريد ان نعرف الرقم الاصغر بين رقمين minimum number وتختصر ب min في السطر الأول if a < b : min= a كأننا نقول "لو a اصغر من b فهذا يعني انه الرقم الاصغر بين الرقمين، فنجعل قيمة المتغير min تتمثل في المتغير a .. وهنا لن يدخل على باقي الشرط وهي ال else، ولكن إن لم تكن a اصغر من b .. اي لم يتحقق الشرط .. سيتم الاستمرار بباقي الشروط else: min=b هنا جعلنا قيمة المتغير min بقيمة المتغير b لانه الاصغر ولعلك تجد اكثر من شرط في عملية شرطية طويلة وهنا يتم استخدام elif وهي اختصار ل else if a = 200 b = 33 if b > a: print("b is greater than a") elif a == b: print("a and b are equal") else: print("a is greater than b")
  8. جرب الخطوات التالية وبعد كل خطوة قم بالتحقق مما اذا كان تم حل المشكلة ام لا قبل الانتقال إلى الخطوة التالية :- - قم بإعادة تشغيل VS code - قم بفحص اعدادات ال quick suggestions في ال settings > Editor وتأكد انها مفعلة true - تأكد ان العلامات التي تظهر الاقتراحات كال ! في ال html موجودة في اعدادات ال Editor > Suggest On Trigger Characters - اضغط ctrl + space لفحص IntelliSense، وهي خاصية الإكمال التلقائي في VS Code - قم بإعادة تنصيب VS code وهذا الأخير لا تلجأ إليه إلا في حالة عدم نجاحك في حل المشكلة من الخطوات السابقة.
  9. هذا الامر طبيعي جداً، تحقق من هذه الأمور لحل المشكلة : - تأكد انك قد اضفت ال domain في إعدادات التوجيه Domain Verification وفعلته. - اذهب إلى لوحة التحكم في firebase - اعدادات المشروع - SHA-1 ـ وتأكد انك قمت باضافة باضافة مفتاح SHA-1 الخاص ب Google Play - تحقق من إعدادات الأمان على firebase، اذهب إلى لوحة التحكم - قوانين الوصول وقوانين الأمان. قد تحتاج إلى ضبط بعض القواعد للسماح بالوصول من التطبيق. - راجع API keys وتأكد انها مفعلة.
  10. يجب ان تدرك ان ال border يحيط بحدود الشكل، وعند تحليل الصورتين أجد انك طبقت ال border على المستطيل الخارجي الذي يحتوي على النص، ولكن المطلوب هو انشاء border لعنصر داخل هذا المستطيل الخارجي، ولتحقيق هذا عليك انشاء عنصر div داخلي للتوضيح : <div class="outer"> <div class="inner"> <p>This is an Important Note!</p> </div> </div> ومن ثم تطبيق قواعد ال css المناسبة .outer{ background:#eee; padding: 5px 10px; } .inner{ border-left: 3px solid red; padding: 5px; } بعدها يمكنك التلاعب بقيمة ال padding وال border-width كما تريد لتحقيق النتيجة المطلوبة. -
  11. الحل سهل إن شاء الله ان اتبعت الخطوات : المطلوب هنا استخدام ال classes وال sub classes في البداية سنعرف ال class Human class Human: def __init__(self, name): self.name = name ومن ثم سنشتق منه classes لل Man وال Human وهنا يمكنك ببساطة اضافة اكتر من خاصية في ال class انا اكتفيت باضافة الاسم هنا كمثال توضيحي. class Man(Human): def __init__(self, name): super().__init__(name) class Woman(Human): def __init__(self, name): super().__init__(name) وبعد ذلك سنبني دالة ترجع قيمة المصفوفة Array التي تحمل العنصري objects آدم وحواء def create(): adam = Man("Adam") eve = Woman("Eve") return [adam, eve] وللتحقق يمكننا التكرار داخل المصفوفة وطباعة خصائص العناصر كالأسم مثلاً creation = create() for human in creation: print(f"{human.name}") وبهذا نكون انتهينا من حل المشكلة. تمنياتي بالتوفيق
  12. هناك خطاً بسيط .. انك كتبت username داخل وسم tag ال label وليس بين الوسم الافتتاحي والإغلاقي صححها لتصبح هكذا <label for="user-name">user name</label> <input type="text" id="user-name" name="username" /> كما تلاحظ انني عدلت على طريقة كتابة ال id ... لأنها ستسبب خطأ ما اثناء تطبيق ال style عليها في ال css .. لانه لا يجب ان تضع مسافة بين الاسم المكون من مقطعين .. بدلاً من المسافة ضع - او _
  13. ال closure ببساطة بيتيح للدوال الداخلية انها تستخدم المتغيرات الموجودة في الدوال التي تحتويها الق نظرة على هذا المثال وتابع الشرح function outer() { let x = "انا متغير في الدالة الخارجية"; function inner() { console.log(x); } return inner; } const closureExample = outer(); closureExample(); // سيطبع " انا متغير في الدالة الخارجية" نلاحظ هنا ان الدالة inner هي دالة داخل الدالة outer وتقوم الدالة outer بإرجاعها كقيمة، بينما الدالة inner تستخدم المتغير x في دالة الطباعة console.log ، وهذا ما يتيحه ال closure باختصار، يتيح سماحية استخدام المتغيرات المعرفة في نطاق الدالة التي تحمل في طيها دالة أخرى(حتى بعد انتهاء تنفيذ الدالة outer ) ، والمعروف أيضاً بال scope، وهي المنطقة او الحيز الذي تم تعريف الدوال والمتغيرات فيه. فهمك لل closure يساعدك في بناء كود مرن وفعال، جرب ان تبني دوال بداخل دوال واضافة متغيرات في كل scope لتجربة وفهم ال closure جيداً.
  14. بالطبع يجب عليك اتقان css وفهمها جيداً، ولمنع اللبس يجب عليك اتباع خارطة طريق واضحة وجيدة حتى تصبح full stack developer، إليك توضيح للمهارات التي يجب ان تتقنها : - تطوير الواجهة الأمامية Front end development وتشمل html - css - js ومن ثم تعلم ال responsive design او التطبيق المتجاوب مع كل الأجهزة والشاشات. - أطر العمل ومكتبات الواجهة الأمامية Front end Libraries / frameworks وهنا تختار من بين أطر العمل المشهورة ك React - vue - Angular ومن ثم تعلم الاطر التي تعمل بنظام ال SSR ك next.js و nuxt.js وغيرها على حسب اطر العمل الذي اخترته في البداية فمثلاً إن اخترت react تعلم بعدها Next.js لانها مبنية عليها. - فهم أساسيات الويب مثلا HTTP/HTTPS, RESTful APIs, AJAX - تطوير الجهة الخلفية Back end development وهنا تدرس لغة برمجية وإطار العمل المقابل لها مثلا javascript و node js او python و flask او django، ومن ثم دراسة قواعد البيانات بنوعيها relational و non-relational حتى ان اخترت التخصص في احدهما، لانك ستتعرض طوال الوقت لمشاريع تعمل بقواعد بيانات مختلفة، لذا يجب التعرض للنوعين. - فهم كيفية وبناء API للتفاعل بين الجهة الأمامية والخلفية، ومن ثم فهم إحتياطات الامان في التطبيق وطرق التشفير المختلفة. - وأخيراً وليس آخراً، تعلم نشر التطبيق deployment وإدارة الخوادم Server management حتى تطلق تطبيقات الويب على الخوادم او السيرفرات، باستخدام إحدى الخدمات مثل AWS او Azure او غيرها. ربما أغفلت بعض النقاط الفرعية والتي ستعرفها لاحقاً في مشوارك الدراسي، يمكنك الإطلاع على هذه الخارطة. ولا تنسى قراءة هذه المقالة . لا شك أنه طريق طويل ومرهق وبحاجة إلى بذل الوقت والمجهود، ولكنه ممتع ويستحق خوض التجربة. تمنياتي بالتوفيق
  15. يمكنك تحقيق نفس النتيجة باستخدام for loop let arry = ['****', '***', '**', '*']; for (let i =0; i < arry.length; i++){ console.log(arry[i]) } // output // **** // *** // ** // * هنا استخدمنا for للتكرار عبر كل فهرس لعناصر المصفوفة ومن ثم طباعة العنصر المقابل للفهرس، واستخدمنا طول المصفوفة كعامل إيقاف او كسر للتكرار او الloop .
  16. دالة splice في الجافا سكريبت هي دالة built in تسمح لك بالتعديل على ال array (إضافة او حذف عناصر) والشكل البدائي لها يكون كالتالي : let array = [1, 2, 3, 4, 5]; array.splice(2, 2); console.log(array); // Output: [1, 2, 5] اول عامل يحدد الindex الذي نبدأ منه التعديل .. والثاني يحدد عدد العناصر .. هنا حذفنا عنصرين بدءاً من ال index رقم 2 يمكنك ايضا اضافة عناصر عند index معين كالتالي :- let array = [1, 2, 3, 4, 5]; array.splice(2, 0, 6, 7); console.log(array); // Output: [1, 2, 6, 7, 3, 4, 5] هنا حددنا ان عدد العناصر المحذوفة صفر وان العنصرين 6 و7 سيضافو عند ال index رقم 2 ويمكنك أيضاً استبدال العناصر بعناصر اخرى كالتالي : let array = [1, 2, 3, 4, 5]; array.splice(2, 2, 6, 7); console.log(array); // Output: [1, 2, 6, 7, 5] واعلم ان هذه الدالة تعدل على ال array الأصلي في مكانه.
  17. يجب ان تكون القيم قابلة للتسلسل Serializable لتخزينها في redux، ولكن ال ref يعتبر غير قابل للتسلسل non-serializable، ولحل هذه المشكلة يمكننا تخزين معرفات بدلاً من ال refs نفسها ومن ثم الوصول إلى ال Dom Elements عن طريق تلك المعرفات كالتالي:- كود ال slice import { createSlice } from '@reduxjs/toolkit'; const mySlice = createSlice({ name: 'mySlice', initialState: { elements: {}, // نخزن المراجع هنا بناءا على المعرفات }, reducers: { storeElementRef: (state, action) => { const { id, ref } = action.payload; state.elements[id] = ref; }, }, }); export const { storeElementRef } = mySlice.actions; export const selectElements = (state) => state.mySlice.elements; export default mySlice.reducer; ومن ثم نستخدم هذه المعرفات في الcomponent لتخزينها في ال redux import { useDispatch } from 'react-redux'; import { useEffect, useRef } from 'react'; import { storeElementRef } from './path-to-your-slice'; const MyComponent = () => { const dispatch = useDispatch(); const myElementRef = useRef(null); useEffect(() => { // هنا نقوم بتخزين المرجع في الريدكس باستخدام المعرف dispatch(storeElementRef({ id: 'uniqueId', ref: myElementRef.current })); }, [dispatch]); return <div ref={myElementRef}>Hello, World!</div>; }; وبعدها يكون الاستفادة من ال ref في ال redux slice ممكناً.
  18. مصطلح يطلق على دوال تاخذ دوال أخرى كمعاملات parameters او ترجعها كقيمة // دالة تأخذ دالة أخرى كمعامل function operate(func, x, y) { return func(x, y); } function add(x, y) { return x + y; } const resultAdd = operate(add, 3, 4); // Adds 3 and 4 // دالة ترجع دالة أخرى كقيمة function multiplier(factor) { return function (number) { return number * factor; }; } const double = multiplier(2); const resultDouble = double(5); //return 10
  19. لا يجب عليك حفظ أي شئ اثناء دراستك للبرمجة، كل ما عليك فعله هو تعلم كيف يعمل، ولا يجب عليك تبني اسلوب النسخ واللصق في البداية، لأن هذا سيخلق عندك عادة سيئة ولن يساعدك في بناء عقلية برمجية ناجحة، إليك بعض النصائح التي ساعدتني في بداية تعلمي للبرمجة وبعضها اخطاء قمت بالندم اني لم اهتم بها منذ البداية : - - قم بكتابة الكود والتطبيق عليه بنفسك، لأن التطبيق يعزز فهمك للمفاهيم البرمجية، الأمر اشبه بكونك ترسم شيئاً لأول مرة، وفي كل مرة ترسمه بعد ذلك يصبح الأمر سهلاً، مهما كان هذا الشئ معقداً. - اقرأ اكواد الآخرين، زملاءك في الدورة او على مواقع مجتمعات البرمجة، فهذا يجعلك تضاعف الخبرة التي اكتسبتها، لأنك ستتعرف على طرق جديدة لحل المشكلات. - انتظم في حل المشكلات البرمجية Problem Solving، فهذا الأمر يطور من مهاراتك بشكل سريع، كما انه يساعدك في تعزيز الثقة في نفسك. - قم بمتابعة الاخبار أول بأول في مجال تخصصك (وهذا شئ يتجاهله الكثير)، وأجده من أهم الاشياء، لأن العالم التقني يتقدم بسرعة وبحاجة إلى المتابعة، ومتابعتك له منذ البداية سيجعلها عادة عندك وسيعزز فهمك للمصطلحات والمفاهيم المستعصية. - خذ وقت أكبر في فهم المفاهيم الأساسية، أياً كانت اللغة التي تدرس بها، ك(المتغيرات والفروق بينهم Variables، الدوال Functions، التكرار Loops، البرمجة كائنية التوجه OOP) ولا تنتقل للخطوة التي بعدها حتى تتقن التي قبلها. - ابدأ بتنفيذ مشاريع صغيرة، ولا ترتبط ذهنياً بالشرح الذي لا يرافقه تطبيق عملي، وهذه من أهم النقاط، لأن اساس العمل هو المشاريع، لذا عليك أن تعزز مصادرك التي تتعلم منها وتضيف إليها مصدراً يعلمك بالمشاريع مهما كان صغيراً. - وأخيراً .. الصبر، تحلى بالصبر لأنه عامل مهم في نجاحك كمبرمج، ولأن الصعوبات في عالم البرمجة كثيرة، وأشدها هو عدم الثقة بالنفس، لذا عليك بالتحلي بالصبر وأن تفهم ان لكل شئ حل ولكنك لا تعلمه بعد. تمنياتي بالتوفيق
  20. == تستخدم لمقارنة القيم ببعضها وترجع true او false x = 5 y = 5 result = x == y #الناتج true اما العامل in يستخدم للتحقق من وجود قيمة معينة في تسلسل ما list مثلا، وترجع أيضا true او false، لذا يمكن ان نقول انه يشبه for loop ولكنه لا يقوم بتكرار حقيقي list = [1,2,3,4] result = 3 in list # الناتج true
  21. هذا سلوك في الجافاسكريبت يستخدم لتعريف الدوال والمتغيرات قبل موقعها في الكود، تخيل انه يرفعها إلى أعلى الكود او الscope الذي يتم تعريفها فيه فمثلاً إن كتبت هذا الكود :- var x = 5; function NewFun(){ var y = 7; return y; } NewFun() سيتم اعتباره وفهمه كالتالي var x; x = 5; function NewFun(){ var y; y = 7; return y; } NewFun() لاحظ ان التعريفات ترفع إلى الأعلى ولكن القيم نفسها لا ترفع .. لذا توخى الحذر وافهم جيداً هذا السلوك حتى تتجنب تداخلات غير مرغوب فيها.
  22. اختيارك للتقنية يعتمد على التصميم المراد تنفيذه، عادة يستخدم display flex إذا كان التصميم به صف واحد او عمود واحد، والdisplay grid إذا كان التصميم به اصفف وأعمدة متعددة لسهولة التحكم في عرض وطول العناصر مع الإبقاء على مرونتها. وعندما تتقدم في بناء صفحات معقدة، ستجد هناك استخداماً لكلتا الخاصيتين، ستجد ان ال grid يساعدك في بناء ال layout الأساسي للصفحات اي في نطاق اوسع، وال flex يساعدك في تنظيم العناصر في الdivs أي في نطاق اصغر.. وهذا هو الاستخدام الرائج. لذا عليك فهم واتقان ال grid system يمكنك لعب هذه اللعبة الممتعة التي ستجعلك تتقن ال grid ملاحظة أخيرة :- ستتعلم لاحقاً اطر عمل ومكتبات css مثل Bootstrap و Tailwind ، وستجد أن هذه المكتبات تسهل عليك عملية البناء بدون تعقيد، ومع الوقت ستجد أن الأمر سهل وليس بالتعقيد الذي تراه الآن. تمنياتي بالتوفيق
  23. في البداية قد تكون المفاهيم مجردة بالنسبة لك، وقد تسأل نفسك كثيراً ما فائدة هذا وذاك، فيم سأستخدمه، وما دوره في المشاريع الحقيقية، ولكن عليك إدراك أنك الآن في مرحلة البناء المعرفي، كأنك تتعلم وظيفة كل جزء في السيارة مثلاً، بعدها ستتعلم كيف تقوم بتركيب الأجزاء مع بعضها البعض، ومن ثم إصلاحها وتحسينها .. الأمر سيان .. لذا عليك ان تفهم الأساسيات جيداً لأن فهمها بعمق سيوفر عليك مجهوداً كبيراً فيما بعد، والتطبيق هو خير دليل على الفهم، لذا حاول التطبيق على ما تعلمته قدرما استطعت وبدون أن يصيبك الملل، هذا ما سيميزك عن الطالب المتعجل فيما بعد، أخيراً تنوع مصادر التلقي أمر مهم ولكن ليس في البداية، تعلم الاساسيات من مصدر واحد ثم راجعها من مصدر آخر، ستجد اختلافات في طريقة التفكير والبناء وتنظيم الأكواد، وهذا سيجعلك أكثر انفتاحاً على الأساليب المختلفة.
  24. إن كنت تبحث عن شئ سريع لتعلم البرمجة وترى ان الدورات مدتها طويلة، فهذا اتجاه خاطئ منك وانصحك بالتأني في التعلم والتطبيق المستمر حتى تصل إلى مستوى جيد.. خاصة في فهم الاساسيات.
  25. انصحك باستخدام Laravel Telescope لتحديد مشاكل ال performance بدقة، لأنه في النهاية قد تحتاج إلى تحسين الكود والاهتمام بال cashing
×
×
  • أضف...