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

سامح أشرف

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

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

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

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

    56

كل منشورات العضو سامح أشرف

  1. يجب أولًا أن تقوم بعمل مستودع على GitHub، والمستودع هو المكان الذي يتم تخزين الكود فيه، يمكن إعتباره مثل قناة اليويتوب بالنسبة للفيديوهات. ويمكن أن تقوم بعمل هذا المستودع من خلال هذا الرابط. قم بمليء البيانات مثل اسم المشروع ووصف بسيط له ثم قم بالضغط على Create repository. بهذا ستكون قد قمت بإنشاء مستودع، الآن يجب أن نقوم برفع الكود إلى هذا المستودع، ولعمل هذا يجب أن تستخدم أداة Git وهي أداة مسئولة هذا الأمر، لكي نقوم بإستخدام هذه الأداة نذهب إلى مجلد المشروع ونفتح سطر الأوامر ونقومك بتنفيذ الأمر التالي: git init بعد ذلك ستلاحظ وجود مجلد جديد باسم .git (قد يكون المجلد مخفي ولكي تستطيع رؤيته يجب أن تقوم بإظهار الملفات المخفية في نظامك لكن هذا الأمر لن يؤثر على أي شيء الآن). بعد تنفيذ الأمر السابق يجب أن نقوم بإخبار هذه الأداة عن الملفات التي نريد أن نقوم برفعها إلى GitHub، لذلك سنقوم بتنفيذ الأمر التالي: // لإضافة أي ملف git add index.html // لإضافة كل الملفات مرة واحدة git add . نقوم الآن بحفظ كل التغيرات في كل الملفات التي قمنا بإضافتها من خلال الأمر التالي: // يمكن تغير الرسالة التي بين علامتي التنصيص إلى أي شيء تريد git commit -m="first commit" والآن يتبقى خطوة أخيرة قبل رفع الملفات وهي أن نخبر الأداة عن رابط المستودع الذي سنقوم برفع الملفات إليه، لذا سنقوم بتنفيذ الأمر التالي: // قم بتغير الرابط في البأمر التالي إلى رابط المستودع الخاص بك git remote add origin https://github.com/samehelalfi/projectname.git وكآخر خطوة نقوم بتنفيذ الأمر التالي لرفع الملفات إلى مستودع المشروع على GitHub git push -u origin main
  2. في دالة getMessages يتم إستدعاء الدالة appendMessage وهي المسئولة عن إضافة رسالة أخرى: function getMessages() { // قبل الحصول على رسائلك. shouldScroll = messages.scrollTop + messages.clientHeight === messages.scrollHeight; /* * احصل على رسائلك ، سنقوم بمحاكاتها من خلال إلحاق واحدة جديدة بشكل متزامن. */ // قم بحذف هذا السطر // appendMessage(); // بعد استلام رسائلك. if (!shouldScroll) { scrollToBottom(); } }
  3. هذا بسبب حجم الصور الضخم، يجب تصغير الصور وضغطها أيضًا من خلال ومواقع مثل tinypng.com يحدث هذا بسبب وجود / في بداية مسار الصورة في ملف style.css في السطر 61 يمكنك أن تضيف خاصية overflow: hidden لجسم الصفحة وبالتالي لن يظهر شريط التمرير الأفقي body { overflow-x: hidden; } يمكنك الإطلاع على المقاسات الرئيسية المستخدمه في أحد إطارات العمل مثل Bootstrap ، مع العلم أنك قد تواجهة مشكلة في حجم شاشة معين وحينها تقوم بإصلاح المشكلة من خلال Media Query مخصصة لهذا الحجم. يجب أن تقوم بإزالة تأثير الأصناف الخاصة بمكتبة Wow من خلال إضافة التأثيرات التالية: .header_info ul li a img:hover{ transform: scale(1.2); transition: all ease-in-out 0.3s; /* هذه التأثيرات هنا */ -webkit-animation-name: unset; animation-name: unset; } أو يمكنك أن تقوم بوضع أصناف WOW للعنصر الحاوي للصورة أستخدم موقع cdnjs للحصول على رابط CDN خاص بأي مكتبة معروفة، روابط CDN خاصة بمكتبة wow موجودة هنا يفضل إستخدام أحد إطارات العمل المعروفة مثل Bootstrap لأنها ستسهل عليك الكثير العمل لكن يجب أن تكون قد أتقنت إستخدام CSS و HTML جيدًا بدون إطارات عمل، بعد ذلك يمكنك البدء في تعلم أحد إطارات العمل.
  4. دالة type تقوم بإرجاع نوع كائن ما أو متغير ما : myNumber = 5 myString = "Hello" print(type(myNumber)) # Output: int print(type(myString)) # Output: str بينما الدالة isinstance فهي "تتحقق" من أن المتغير من نوع معين وتقوم بإرجاع True أو False myNumber = 5 myString = "Hello" print(isinstance(myNumber, int)) # Output: True print(isinstance(myString, int)) # Output: False يمكن إستخدام كلا الدالتين في نفس الشيء كالتالي: myNumber = 5 if isinstance(myNumber, int): print("This is a Number") else: print("This is NOT a Number") if type(myNumber) == int: print("This is a Number") else: print("This is NOT a Number")
  5. MongoDB هو نظام قاعدة بيانات NoSQL يخزن البيانات في شكل مستندات BSON. بالنسبة لـ Node.js فإن mongodb هو المحرك الأصلي للتفاعل مع mongodb بينما mongoose هو أداة نمذجة كائنObject modeling tool لـ MongoDB. تم تصميم Mongoose على MongoDB لتزويد المبرمجين بطريقة لنمذجة بياناتهم (أي أن MongoDB هي أساس Mongoose). إستخدام Mongoose، يُمَكِن المستخدم من تحديد schema للمستندات في مجموعة معينة collection. يوفر هذا الأمر الكثير من الراحة في إنشاء وإدارة البيانات في MongoDB. بينما، قد يستغرق تعلم Mongoose بعض الوقت، ولديه بعض القيود في التعامل مع المخططات المعقدة للغاية. Mongoose هو يستخدم نظام ORM الذي يقدم لنا دوال للوصول إلى بيانات mongo من خلال استعلامات سهلة الفهم. ومع ذلك، إذا كان مخطط الـ collection الخاص بك غير متوقع unpredictable (أي ليس له بنية محددة)، أو كنت تريد شيء مشابه لـ Mongo-shell داخل Node.js، فقم بإستخدام برنامج تشغيل MongoDB. لأنه أبسط وأسهل في التعلم. الجانب السلبي هنا هو أنه سيتعين عليك كتابة كميات أكبر من التعليمات البرمجية للتحقق من صحة البيانات، ونسبة الأخطاء أعلى.
  6. يمكنك إستخدام ES6 في مشروع Express عبر القيام بثلاث خطوات كالتالي: تثبيت bable و nodemon: npm install --save-dev @babel/core @babel/preset-env @babel/node nodemon قم بعمل ملف .babelrc في مجلد المشروع الرئيسي وأضف إليه التالي: { "presets": ["@babel/preset-env"] } الخطوة الأخيرة هي تعديل ملف package.json وإضافة nodemon كالتالي: "start": "nodemon --exec babel-node app.js"
  7. يمكنك أن تستعمل JavaScript لتجعل الشريط ينزل إلى نهاية المحادثة، هنا مثال بسيط: كود HTML: <style> .container { position: relative; margin: auto; width: 400px; height: 400px; overflow-y: auto; } .m { background: #f3f3f3; padding: 10px; margin: 10px 0; } </style> <div class="container" id="container"> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> <div class="m">message</div> </div> الكود السابق سيعطي النتيجة التالية: ولتمرير شريط التمرير إلى الأسفل يجب أن نحصل على طول الصندوق من خلال الخاصية offsetHeight ونستخدمها كقيمة للخاصية scrollTop التي تقوم بتمرير شريط التمرير var myElement = document.getElementById('container'); // طول الصندوق = 400 بيكسل var height = myElement.offsetHeight myElement.scrollTop = height; وبهذا سيتم النزول إلى نهاية الصندوق بمجرد تحميل الصفحة.
  8. أعتقد أن Bootstrap لم يكن مثبتًا لديك، بعد إضافته في ملف package.json هل بإمكانك تنفيذ الأمر التالي، ثم إعادة تشغيل المشروع: npm i
  9. لا يجب أن تستعمل jquery مع jquery.slim لأن الأخيرة هي نسخة مصغرة من jquery ولا تحتوي على كل الدوال، يجب فقط إستعمال jquery فقط. كما أن صفحة book1.html تعمل بشكل سليم بمجرد الدخول إلى الرابط الخاص بها (بالطبع بعد تشغيل المشروع). ربما لديك مشكلة في الملفات المؤقتة الخاصة بمتصفح الويب الخاص بك، لذلك عليك تجربة متصفح آخر أو حذف هذه الملفات المؤقتة.
  10. يبدو أن لديك خطأ بسيط في إستدعاء Bootstrap حيث يجب أن يكون بهذا الشكل: import 'bootstrap/dist/css/bootstrap.min.css'; لاحظ اسم الملف bootstrap.min.css مكتوب لديك بشكل خاطيء. يجب أيضًا أن تتأكد من أنك قمت بتثبيت bootstrap بشكل صحيح من خلال التحقق من ملف package.json والذي يجب أن يحتوي على التالي: { // ... "dependencies": { "bootstrap": "^4.6.0", // يجب أن يكون لديك بوتستراب مثبت }, // ... }
  11. بمكن إستخدام التابع readlines حيث يقوم بإرجاع قائمة مكون من أسطر الملف، بالشكل التالي: f = open("rocks.txt", "r") print(f.readlines()) # Output: ['Hello! Welcome to demofile.txt\n', 'This file is for testing purposes.\n'] كما يمكن أيضًا قراءة الملف بالكامل ثم تقسيمه إلى أسطر بالشكل التالي: f = open("rocks.txt", "r") content = f.read() lines = content.split('\n') print(lines) # Output: ['Hello! Welcome to demofile.txt', 'This file is for testing purposes.'] لاحظي أن الفرق بين الطريقتين هي وجود \n في نهاية كل سطر في الطريقة الأولى
  12. يوجد عدة إطارات عمل خاصة بالـ backend في لغة python وأشهرها هما Flask و Django، ويكمن الفرق بينهما في المميزات التي يقدمها كل منهما: Flask: يستعمل في المواقع الصغيرة أو في المواقع التي تقدم API فقط أسهل في التعامل من Django نظرًا إلى أن المميزات التي يقدمها أقل بكثير خفيف وأسرع من Django لكن قد تحتاج إلى تطوير الكثير من الأشياء من الصفر يستعمل في الغالب SQLAlchemy لعمل جمل SQL يعد بداية جيدة لأي شخص يريد أن يبدأ في مجال تطوير المواقع بإستخدام Python Flask ذاي عملية واحدة single process وقد لا تعمل بشكل جيد تحت الحمل الثقيل. ليس هناك طريقة معينة يجب إتباعها لإنشاء الموقع Django: يتم إستعماله في المواقع الكبيرة والضخمة مثل Instagram على سبيل المثال يستخدم بنية MVT (Model View Template) يدعم واجهة رسومية للإدارة Administration Graphical User Interface بشكل أفتراضي يحتوي على الكثير من الأدوات مثل أدوات الحماية والسيو يتأكد Django من أنك تتبع أفضل أفضل الممارسات best practices يدعم Object-Relational Mapping (ORM) فقط للتعامل مع قواعد البيانات أما بالنسبة لتطبيق سطح المكتب فيوجد أيضًا عدة خيارات مثل Kivy أو PyGUI أو PySimpleGUI، وبما أن التطبيق سيرتبط بالموقع من خلال API فبإمكانك حتى أن تستخدم لغات أخرى لعمل تطبيق سطح المكتب مثل C++ أو Java أو C#
  13. يحدث الخطأ بسبب أن ناتج العملية الحسابية سيكون -6 وهو ليس بفهرس index صحيح، أي لا يمكن عمل التالي على سبيل المثال: // هنا سيحدث خطأ لأن قيمة الفهرس سالبة System.out.println(array[-6]); العملية الحسابية في الكود لديكِ تساوي -6، حيث يتم عمل الضرب أولًا: array[array[2]-array[3]*2] // يتم حل الضرب أولًا array[12 - 9*2] array[12 - 18] array[-6] يمكنك عمل عملية الطرح أولًا من خلال وضعها في داخل قوسين كالتالي: int [] array = {7, 2, 12, 9, 3, 10, 8, 3}; // سيتم حل عملية الطرح أولًا System.out.println(array[ (array[2]-array[3]) *2]);
  14. يمكنك إختبار سرعة تحميل الموقع من خلال خدمات مثل: google pagespeed insights gtmetrix pingdom ستخبرك هذه المواقع بسرعة موقعك الحالية، بالإضافة إلى تحلي كامل للموقع ولماذا الموقع بطيء، وخطوات تسريعه إلى أقصى حد، مع بعض النصائح الأخرى لكي يبقى الموقع سريع.
  15. كلمة key ليست كلمة محجوزة ولكن هي أشبه بمتغير يعبر عن عنصر في القاموس ويمكن تغيره إلى أي شيء كالتالي: d = {'x':1,'y':2,'z':3} for i in d: print(i, d[i]) """ Output: x 1 y 2 z 3 """ هذا ما يجعل لغة بايثون أسهل من غيرها في كتابة الكود، حيث تقوم بإدارة الكثير من المهام بشكل تلقائي، فبايثون لغة ذكية للغاية، كما يمكن أن تجعل بايثون تقوم بالمرور على القيم values وليس المفاتيح key كتالي: d = {'x':1,'y':2,'z':3} for item in d.values(): print(item) """ Output: 1 2 3 """
  16. يوجد في بايثون أكثر من طريقة يمكن من خلال حذف ملف أو مجلد: import os # حذف ملف os.remove("/path/to/<file_name>.txt") # حذف مجلد os.rmdir("/path/to/<dir_name>") # في بايثون الإصدار 3.4+ يمكن إستعمال مكتبة pathlib import pathlib # حذف ملف pathlib.Path.unlink("/path/to/<file_name>.txt") # حذف مجلد فارغ pathlib.Path.rmdir("/path/to/<dir_name>")
  17. يبدو أن هناك إختلاف بين الكود المرفق والصور، ربما قام Laravel بحفظ نسخة من ملف index.blade.php في الملفات المؤقتة، ويمكنك تجربة الأمر التالي وإعادة المحاولة: php artisan view:clear
  18. إذا أردتِ التحقق من وجود مفتاح ما في قاموس، فيمكن إستخدام إحدى الطريقتين الآتيين: الطريقة الأولى إستخدام التابع get كالتالي: dict = {'Name': 'Ahmed', 'Age': 7} print ("Value : %s" % dict.get('Age')) #Output: "Value : 7" كما يمكن تعين قيمة إفتراضية في حالة عدم وجود المفتاح age في القاموس كالتالي: dict = {'Name': 'Ahmed'} print ("Value : %s" % dict.get('Age', 18)) #Output: "Value : 18" أما إذا أردتِ التحقق من وجود قيمة value معينة في قاموس فيمكن إستخدام التابع values مع المعامل in كالتالي: dict = {'Name': 'Ahmed', 'age': 7} print ('ahmed' in dict.values()) #Output: True
  19. لتثبيت المكتبة في أناكوندا يمكنك إستعمال الأمر التالي: conda install geopandas إن ظهرت لك نفس المشكلة يمكنك تنفيذ الأوامر التالية لتثبيت المكتبة: pip install wheel pip install pipwin # نستخدم pipwin لتثبيت المكتبات التالية pipwin install numpy pipwin install pandas pipwin install shapely pipwin install gdal pipwin install fiona pipwin install pyproj pipwin install six pipwin install rtree pipwin install geopandas
  20. يمكن أن نقوم بعمل حلقة تكرار للمرور على كل رقم وفحصه، فإن كان أقل من 0 نقوم بكتابة 0 مكانه بالشكل التالي: def removeNegative(lists): # نقوم بالمرور على كل قائمة لدينا for lst in range(len(lists)): # ثم نقوم بالمرور على كل عنصر في كل قائمة for i in range(len(lists[lst])): # إن كان العنصر أقل من صفر نحدث قيمته لتساوي صفرًا if lists[lst][i] < 0: lists[lst][i] = 0 return lists myLists = [[2, -7, 5], [-6, 2, 0], [1, -4, 2], [-2, 6, 8]] newList = removeNegative(myLists) print(newList) # Output: [[2, 0, 5], [0, 2, 0], [1, 0, 2], [0, 6, 8]]
  21. هذا طبيعي بسبب عدم موجود دالة print تطبع أي شيء، ولكي تظهر النتيجة في موجهة الأوامر يجب أن نقوم بطباعتها أولًا من خلال السطر التالي: print(mobiles)
  22. لطباعة درجة الطالب في مادة معينة نستخدم طريقة index لجلب النتيجة المطلوبة بالضبط: print(sampleDict['class']['student']['marks']['physics']) # Output: 70 print(sampleDict['class']['student']['marks']['history']) # Output: 80 أما لطباعة كل درجات الطالب نستخدم التابع items لجلب كل الدرجات لكل المواد في شكل أزواج من الكائن Tuple: print(sampleDict['class']['student']['marks']['physics']) # Output: 70 print(sampleDict['class']['student']['marks']['history']) # Output: 80 for subject, degree in sampleDict['class']['student']['marks'].items(): print(subject, degree) """ OutPut: physics 70 history 80 """
  23. في البداية يجب أن تتعلم الأنظمة التي تريد أن تحميها ومن هو الهاكر الأخلاقي ولماذا يقوم بمحاولة إحتراق الأنظمة؟ بإختصار هو شخص يتم تعينه من قبل شركة أو منظمة معينة لفهم نظامها الداخلي بشكل تام، ثم يبدأ بالتفكير كيف يمكن إستغلال صلاحيات بسيطة في هذا النظام في محاولة إختراق أي شيء داخل هذا النظام، وبعد ذلك يبدأ في ترقيع الثغرات التي إكتشفها للحفاظ على الشركة من هكذا هجمات. هذا ما يسمي بإختبار الإختراق. اذا أردت عن تصبح هاكر أخلاقي أو مختبر إختراق فعليك فهم لغة برمجة جيدًا مثل جافا لنظام اندرويد أو بايثون، وكيفية إدارة أنظمة التشغيل المتعددة خصوصًا لينكس لوجود أغلب أدوات الإختراق عليه، ثم الانتقال لتوزيعات إختبار الاختراق (غالبًا ما تكون في شكل توزيعة جاهزة مثل Kali Linux أو parrot os) والبدء بالبحث عن الثغرات و إستغلالها. يجب أن تكون علي دارية بالشبكات وهيكليتها فمجال الشبكات كبير للغاية وخطير أيضًا. عليك أيضًا البدء بتعلم أشهر أدوات الإختراق مثل ميتاسبلويت و Burp Suite و Hashcat وكيف تعمل هذه الأدوات، فالغالب تكون هذه الأدوات البرامج مفتوحة المصدر.
  24. يمكنك تحميل وتثبيت بايثون من خلال الموقع الرسمي للغة من هنا، وهنا رابط مباشر لتحميل آخر نسخة من اللغة: للويندوز 64bit 32bit للماك
  25. إستعمال np.random.seed يجعل الأرقام العشوائية المولدة قابلة للتوقع (أو يمكن توليد نفس الأرقام العشوائية أكثر من مرة)، فعلى سبيل المثال الكود التالي سيخرج نفس النتيجة: >>> import numpy as np >>> np.random.seed(0) >>> print(np.random.permutation(10)) [2 8 4 9 1 6 7 3 0 5] >>> np.random.seed(0) >>> print(np.random.permutation(10)) [2 8 4 9 1 6 7 3 0 5] لاحظ أن نتيجة الأرقام العشوائية واحدة، وذلك لأننا قمنا بتشغيل (0)np.random.seed مرة أخرى. ويتم إستعمالها في الحالة التي لديك، لكي تظهر نفس النتيجة كل مرة تحاول تشغيل الـ notebook، لكن إن لم نستعملها ففي كل مرة يتم تشغيل الـ notebook ستكون النتيجة عشوائية تمام.
×
×
  • أضف...