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

Hossam Mohamed15

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

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

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

المعلومات الشخصية

  • النبذة الشخصية
    MERN Web developer

آخر الزوار

لوحة آخر الزوار معطلة ولن تظهر للأعضاء

إنجازات Hossam Mohamed15

عضو مساهم

عضو مساهم (2/3)

22

السمعة بالموقع

2

إجابات الأسئلة

  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 .
×
×
  • أضف...