سامح أشرف
الأعضاء-
المساهمات
2934 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
56
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو سامح أشرف
-
الخاصية integrity تقوم بالتأكد من محتوى الملف الذي تريد تحميله وأنه تم تحميله بشكل صحيح من خلال حساب هاش Hash (رمز يعبر عن محتوى الملف): sha384-eXAS9gpSubzWBZ85sXFT30e/QtpWuMez5/IcYcBwYZIiK7Agf3sTyLvXpcP05Dzy وكل ما عليك فعله للحصول على هذا الهاش هو وضع الرابط الخاص بخطوط جوجل في الموقع srihash.org ثم الضغط على Hash وستجد أنه تم توليد عنصر link كامل ويحتوي على الخاصية crossorigin والخاصية integrity بالشكل التالي: <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=El+Messiri&display=swap" integrity="sha384-eXAS9gpSubzWBZ85sXFT30e/QtpWuMez5/IcYcBwYZIiK7Agf3sTyLvXpcP05Dzy" crossorigin="anonymous">
-
هذا ليس خطأ error بل تحذير warning من برنامج VS Code لكي تقوم بإضافة الخاصية crossorigin إلى العنصر link بالشكل التالي: <link rel="stylesheet" href="..." crossorigin="anonymous"> وقد تم شرح هذه الخاصية وكيفية إستخدامها في هذه المقالة (قسم سياسة تعدد المصادر Crossorigin policy): يمكنك تجاهل مصل هذه التحذيرات وسيعمل الموقع بدون مشكلة، ولكن البحث عن معناها وكيفية إصلاحها سوف يزيد من معلوماتك.
- 9 اجابة
-
- 1
-
عناصر الإدخال inputs من نوع checkbox تكون قيمتها منطقية Boolean أي True أو False ، ويتم تخزينها في قاعدة البيانات على شكل رقم واحد أو صفر فقط. أما عناصر dropdown فلها قيم تكون محددة مسبقًا، بالشكل التالي: <select name="pets"> <option value="dog">Dog</option> <option value="cat">Cat</option> <option value="hamster">Hamster</option> </select> لاحظ الخاصية value في العناصر option لها قيمة نصية يتم تحديدها مسبقًا، ويتم تخزين هذه القيمة (القيمة المختارة) في قاعدة البيانات على شكل نص text.
- 1 جواب
-
- 1
-
قواعد البيانات هي مجرد وسيلة لتخزين البيانات في شكل منظم، يمكنك لملف نصي بسيط أن يكون عبارة عن قاعدة بيانات، أو ربما تستخدم قاعدة بيانات لها إمكانيات أكثر مثل MySQL أ, Postgres أو غيرها، ولكن في النهاية ستجد أن البنية واحدة وأن البيانات يتم تخزينها بشكل منظم في قاعدة البيانات، ويمكن ببساطة أن تستخدم قاعدة البيانات لعمل موقع كامل، وتستخدم نفس قاعدة البيانات لتطبيق هاتف للموقع بدون مشكلة. ويمكنك أن تستعمل نفس التقنيات في المواقع والتطبيقات كذلك، ولكن بالنسبة لتطبيقات الهواتف هناك نوعين أساسين من قواعد البيانات: قواعد بيانات محلية Local Database: وفيها يتم تخزين قاعدة البيانات بالكامل على جهاز العميل، لحفظ بعض البيانات مثل إعدادات التطبيق أو لكي يعمل التطبيق بدون إنترنت .. إلخ. قواعد بيانات عامة Global Database: وهي عندما تقوم بإنشاء قاعدة بيانات وتضعها على خادم Server ليتمكن كل المستخدمين من الوصول إليها (عبر التطبيق أو الموقع أو حتى برنامج لسطح المكتب) والحصول على البيانات منها. لذلك يمكنك أن تقوم بعمل قاعدة بيانات واحدة لأكثر من إستخدام بدون مشكلة. يمكنك الإطلاع على هذه المقارنة بين أشهر أنواع قواعد البيانات: وهنا شرح لقواعد بيانات SQLite (غالبًا ما تستعمل كقاعدة بيانات محلية): كل قواعد البيانات السابقة عبارة عن قواعد منظمة Structured وتستعمل لغة SQL لتنفيذ التعليمات، ويوجد نوع آخر من قواعد البيانات وهو NoSQL، هنا مقالة تتحدث عن الفرق بينهما:
- 2 اجابة
-
- 2
-
لم يعد يتم إستخدام file-loader بداية من الإصدار الخامس، وأصبح يتم إستخدام Asset Modules وهي عبارة عن مجموعة من المحملات loaders وهم كالتالي: asset/resource هي بديل لـ file-loader asset/inline بديل لـ url-loader asset/source بديل لـ raw-loader ويتم إستخدامها على النحو التالي: const path = require('path'); module.exports = { entry: './src/index.js', output: { filename: 'main.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { // تضمين الصور test: /\.png/, type: 'asset/resource' } ] }, }; سيتم إستخراج جميع ملفات .png إلى المجلد dist وسيتم حقن مساراتها في إلى الملفات المنتجة. يمكنك الإطلاع على توثيق Asset Modules الرسمي في موقع webpack لمزيد من المعلومات عن كيفية إستخدامها.
- 2 اجابة
-
- 1
-
يمكنك أن تقوم بهذا الأمر من خلا عمل متغير عام global باسم counter وتقوم بزيادة قيمته عند الضغط على الأيقونة، بالشكل التالي let counter = 0; // نعرف متغير عام هنا function open1() { var opened = document.getElementById("open"), closed = document.getElementById("close"); // نزيد القيمة في العنوان counter += 1; document.getElementById("title").innerHTML = counter; opened.style.display = "block"; closed.style.display = "none"; } function close1() { var opened = document.getElementById("open"), closed = document.getElementById("close"); // نزيد القيمة في العنوان counter += 1; document.getElementById("title").innerHTML = counter; opened.style.display = "none"; closed.style.display = "block"; } وإذا أردت أن تقوم بتغير لون العنصر h1 من خلال JavaScript عليك أن تستعمل الكود التالي: var h1 = document.getElementById("title"); // تحديد العنصر h1.style.color = "white"; // تغير لونه
-
إن كنت تستعمل أحدث إصدار من multer، فحاول تجربة الكود التالي: let imagesPaths = []; for (avatar of req.files) { imagesPaths.push(avatar.path); } console.log(imagesPaths); // طباعة مسارات الصور المرفوعة بهذا الشكل سوف تحصل على مسارات الصور ليتم حفظها من خلال الكود التالي: const image = new Home({ avatar: imagesPaths }); await image.save()
-
لك مطلق الحرية في الوقت الذي تستغرقه لإنهاء أي دورة من دورات أكاديمية حسوب وسيكون لك وصول مدى الحياة للدورات التي إشتركت فيها حتى بعد التخرج منها، وعليك أن تقوم بإنهاء أربع مسارات على الأقل من الدورة لكي تتمكن من الحصول على الشهادة وكذلك عليك إجتياز الإختبار الأخير. مع العلم أنك أنت من يحدد متى تريد الخضوع للإختبار الأخير للحصول على الشهادة. يمكنك الإطلاع على أهم الأسئلة المماثلة من خلال صفحة الأسئلة الشائعة، أو إستخدام مركز المساعدة.
- 2 اجابة
-
- 1
-
أنت تقوم بحفظ مصفوفة من الكائنات objects (كل صورة عبارة عن كائن)، وعليك أن تقوم بتحويل مصفوفة الملفات req.files إلى مصفوفة من مسارات الصور: let imagesPaths = []; for(avatar of req.files['avatar']) { imagesPaths.push(avatar.path); } // ثم نقوم بحفظ المصفوفة في قاعدة البيانات const image = new Home({ avatar: imagesPaths }); await image.save()
-
GitHub و GitLab عبارة عن مواقع ويب تستخدم لحفظ الأكواد فيها، يمكنك تخيله مثل Google Drive للأكواد، ويمكنك التسجيل في هذه المواقع بسهولة وبشكل مجاني من خلال الروابط التالية: gitlab github أما بالنسبة لكيفية رفع الأكواد الخاصة بك إلى هذه المواقع فعليك أن تتعلم Git أولًا وهو برنامج لإدارة إصدارات الملفات، هنا فيديو قصير يشرح أساسيات Git وكيف تتعامل معه: أيضًا تحتوي أكاديمية حسوب على شرح مفصل لكل ما يتعلق بـ Git وكيفية إستخدامه مع المواقع السابقة في شكل مقالات يمكنك الإطلاع عليها من هنا: مقالات خاصة بـ Git.
-
لا يمكن تخمين ما إذا كانت تقنية معينة أو لغة برمجة معينة أو غيرها سوف يتم إلغائها أو القضاء عليها، وذلك بسبب وجود الآلاف من المبرمجين الذين يستعملون تقنيات مثل React Native أو غيرها. باللإضافة إلى أن نظام فوشيا سوف يدعم تطبيقات أندرويد -حسب موقع 9to5google- ، وبالتالي ليس من المهم التقنية المستخدمة في إنشاء التطبيق طالما سيكون التطبيق النهائي يعمل على الأندرويد ففي الغالب سيعمل أيضًا على نظام Fuchsia منذ عدة سنوات ظهرت شائعات بأن لغة PHP ستموت ولن يستخدمها أحد (مازال بعض الأشخاص يعتقدون ذلك) ولكن بعد مرور سنوات منذ أن ظهرت هذه الشائعات ومازالت لغة PHP لها نصيب الأسد في لغات برمجة الواجهات الخليفة Backend وصدر إصدار جديد لها (الإصدار 8) منذ أشهر قليلة، وهذا يعني أن اللغة مازالت تتطور وأن هناك الكثير من المبرمجين مازالوا يستخدمن هذه اللغة، وبالمثل لا يمكن لأحد أن يقوم بأن هناك تقنية سوف تقضي على تقنية أخرى، وذلك لأن كل تقنية يكون لها إستخدام مختلف أو هدف مختلف وفريد، وإلا لماذا لا يتم تطوير التقنية القديمة في المقام الأول بدل تطوير تقنية مختلفة من الأساس وإعادة إختراع العجلة من جديد، حيث أن كل هذه التقنيات مفتوحة المصدر ويمكن أن لأي أحد أن يساعد في تطويرها بسهولة. كما يتم أيضًا مقارنة التقنيات بنفس الطريقة، وستجد هنا العديد من الأسئلة المشابهة للمقارنة بين التقنيات: هنا أسئلة للمقارنة بين Flutter وReact Native وبالتأكيد يمكنك أتستعمل أيًا منهما بدون مشكلة. فكما ذكرت سابقًا أنه لا يمكن أن نقارن بين التقنيات لأن كل تقنية لها إستخدامها، لكن يوجد تقنية مفيدة في حالة معينة أكثر من غيرها، فعلى سبيل المثال إن كنت على دراية بتقنتيات الويب (HTMl و CSS و javaScript ..إلخ) فسيكون إستخدام React Native أسهل لأنك لن تضر إلى تعلم لغة برمجة جديدة أو إطار عمل جديد من الصفر.
- 1 جواب
-
- 1
-
يمكنك أن تقوم بإستخدام الدالة select_related بشكل مباشر داخل الدالة get_object_or_404 بالشكل التالي: books = get_object_or_404(Book.objects.select_related(), title__startswith='M', pk=1) بهذا الشكل يمكنك أن تستخدم الدالة select_related داخل الدالة get_object_or_404.0 أيضًا يمكنك جمل where متعددة بنفس الطريقة: obj = get_object_or_404(MyModel.objects.select_related(), whatever=whatever, another=another)
- 2 اجابة
-
- 1
-
يوجد خطأين في الكود، الخطأ الأول هو عملية تحويل السعر إلى رقم وإضافة الرقم إلى الخاصية data-price، حيث بعد تحديد طريقة ترتيب المنتجات ستجد أن الخاصية data-price تحمل القيمة NaN أي ليس رقم Not a Number وذلك لأنك تقوم بتحويل محتوى العنصر li نفسه إلى رقم من خلال الكائن Number ولكن هذه العملية تفشل لأن محتوى العنصر li ليس رقم بل مجموعة من النصوص، لذلك عليك أن تقوم بتحديد محتوى العنصر h4 الموجود داخل المنتجات بالشكل التالي: let select = document.getElementById('select'); let ar = []; for (let i of li) { const last = i.lastElementChild.querySelector('h4'); // محدد العنصر h4 const x = last.textContent.trim(); // نستخرج السعر كـنص const y = Number(x.substring(1)); // نزيل علامة الدولار $ ليتبقى فقط الرقم ونحوله عبر الكائن Number i.setAttribute("data-price", y); console.log(y); ar.push(i); } أما الخطأ الثاني يحدث عندما تقوم بجلب قيمة الخاصية data-price من خلال التابع getAttribute، حيث أن الخواص في HTML يتم تخزين القيم فيه على شكل نصوص وليس أرقام Numbers لذلك يعيد التابع getAttribute السعر على شكل نص وبالتالي تتم عملية مقارنة الأسعار لترتيبها بالشكل التالي: "100.78" > "50.78" // false ولحل هذه المشكلة عليك أن تقوم بتحويل السعر إلى رقم مرة أخرى بالشكل التالي: sortli = li.sort((a, b) => { const ax = Number(a.getAttribute('data-price')); const bx = Number(b.getAttribute('data-price')); return ax > bx ? (1 * dm) : (-1 * dm); }); بهذا الشكل سوف يتم ترتيب العناصر بشكل سليم حسب السعر.
- 1 جواب
-
- 2
-
عليك في البداية تحديد المجال الذي تريد التخصص فيه، هل تريد إنشاء مواقع إلكترونية؟ أو ربما تريد إنشاء تطبيقات الهواتف الذكية؟ أو قد تريد تطوير الألعاب، كل مجال من المجالات السابقة لديه تقنيات ولغات برمجة يتم إستخدامها فيه وهذه التقنيات والبرامج تختلف من مجال إلى آخر، لذلك أول خطوة هي تحديد التخصص الذي تريد العمل فيه، ثم عليك تحديد التقنيات ولغات البرمجة التي سوف تستخدمها في هذا التخصص والتي عليك أن تتعلمها بالترتيب وأن تتدرب على إستخدامها بشكل جيد هنا مقالة توضح أهم المجالات وشرح مبسط له وأهم اللغات والتقنيات المستخدمه فيه: تم نشر أسئلة مشابهة لهذا السؤال كثيرًا في السابق، يمكنك الإطلاع على بعضٍ منها من هنا:
- 1 جواب
-
- 1
-
بالتأكيد يختلف الأمر من شخص إلى آخر كما ذكرت في سؤالك، ولكن إن قمت بمشاهدة ساعة من الفيديوهات يوميًا فسوف تستغرق على الأقل 53 ساعة، وذلك لأن دورة علوم الحاسوب تحتوي على أكثر من 53 ساعة فيديو تدريبية (تمت الإشارة إلى هذا الأمر في صفحة دورة علوم الحاسوب)، ولكن بالطبع فسوف يستغرق أي شخص وقت أطول من هذا لإتمام الدورة بسبب المشاريع العملية والتطبيق وراء المدربين في الفيديو، أو ربما تجد جزئية صعبة قليلًا في الفهم فتستغرق فيها وقت أطول بالتأكيد، حيث ستقوم بإعادة مشاهدة الدرس أو البحث في موسوعة حسوب أو مقالات الأكاديمية أو ربما يظهر لك خطأ في أحد المشاريع وتستغرق بعض الوقت في محاولة إصلاح الخطأ بنفسك .. إلخ. وكنتيجة لما سبق لا يمكن حساب الوقت الذي تحتاجه لإتمام الدورة، ولكن يمكنك أن تقوم أنت بحساب هذا الوقت التقريبي لنفسك من خلال مشاهدة أحد المسارات وحساب الوقت المستغرق لإنهاء المسار بالكامل (مع العلم أن حجم المسارات ليس متساوي تمامًا). كما أنك قد تستغرق وقت أقل إن وجدت أنك تفهم الدروس بسرعة وقمت بتشغيل الفيديدهات بسرعة أعلى 1.5x على سبيل المثال.
- 1 جواب
-
- 1
-
يمكنك القيام بهذا الأمر من خلال المُرَشِح filter الذي يسمى title بالشكل التالي: {{ value|title }} لكن المُرشح السابق سوف يقوم بجعل أول حرف من كل كلمة كبير Uppercase، لذلك يمكنك أن تستعمل مُرشح آخر وهو capfirst: {{ "hello, world"|capfirst }} # Output: "Hello, world" تستطيع أيضًا إستخدام المُرشح lower مع الطرق السابقة لجعل كل الحروف صغيرة lowercase ماعدا الحرف الأول فقط: {{ "heLLO, WORLD"|lower|capfirst }} # Output: "Hello, world"
- 1 جواب
-
- 1
-
يمكنك أن تقوم بهذا الأمر من خلال عمل صنف جديد يرث من الصنف DjangoTestSuiteRunner وتقوم بعمل override للتوابع setup_databases و teardown_databases بحيث تتخطى عملية إعداد قاعدة البيانات بالشكل التالي: # نستدعي الصنف DjangoTestSuiteRunner from django.test.runner import DiscoverRunner class NoDbTesSuiteRunner(DiscoverRunner): def setup_databases(self, **kwargs): pass def teardown_databases(self, old_config, **kwargs): pass الآن يمكنك إستخدام الصنف الذي قمنا بإنشائه لتشغيل الإختبارات tests من خلال الأمر التالي: python manage.py test app --testrunner=app.filename.NoDbTestRunner
- 1 جواب
-
- 1
-
هذه الطريقة (إضافة أقواس مربعة في أكثر من حقل للتعبير عن مصفوفة) ليست من معاير الويب web standard، ولكن لأن لغة PHP وكذلك Ruby on Rails يدعمان هذا الأمر بشكل إفتراضي فستجد أنه يتم إستعمال هذه الطريقة على نطاق واسع في الإنترنت. ويمكن لفلاسك Flask أن يقوم بجلب قيم كل الحقول التي لها نفس الاسم name كذلك من خلال التابع request.form.getlist بالشكل التالي: tags = request.form.getlist('tags[]') لاحظ أنه ليس عليك استخدام [ ] على الإطلاق، حيث سيعمل الكود أيضًا في حالة كان النموذج بالشكل التالي: <input name="tags" type="text" /> <input name="tags" type="text" /> <input name="tags" type="text" /> ولكن حينها سيمكنك الوصول إلى القيم من خلال التابع request.form.getlist بالشكل التالي: tags = request.form.getlist('tags')
- 1 جواب
-
- 1
-
لا يمكنك أن تستعمل Object.query في هذه الحالة وذلك لأن SQL-Alchemy سوف تحاول البحث عن الحقل لوضع قيمة avg وهذا الأمر سيفشل بالتأكيد بدلًا من ذلك يمكنك أن تقوم بإستخدام session.query بالشكل التالي: from sqlalchemy.sql import func session.query(func.avg(Rating.field2).label('average')).filter(Price.product_id==123)
- 1 جواب
-
- 1
-
مكتبة webassets تستخدم لإدارة الملفات الثابتة static files والتي تدعم ضغط وتجميع ملفات css و JavaScript، كما تدعم العمل مع المصرفات compilers مثل CoffeeScript أو Sass (عبر مكتبات مثل pyScss)، ولإستخدامها بشكل سهل مع فلاسك تحتاج إلى إستخدام Flask-Assets بالشكل التالي: from flask import Flask, render_template from flask.ext.assets import Environment, Bundle app = Flask(__name__) assets = Environment(app) assets.url = app.static_url_path scss = Bundle('file1.scss', 'file2.scss', filters='pyscss', output='style.css') assets.register('scss_all', scss) ويمكنك إستخدام الملف المنتج style.css في القوالب بالشكل التالي: {% assets "scss_all" %} <link rel=stylesheet type=text/css href="{{ ASSET_URL }}"> {% endassets %} بهذا الشكل سوف يتم ترجمة الملف file1.scss و file2.scss إلى الملف style.css وسوف يتم إضافة الملف إلى القالب من خلال الكود الأخير.
- 1 جواب
-
- 1
-
إن كان مطور القالب يسمح بإستخدام القالب على مواقع متعددة فلا مشكلة من هذا الأمر ولاحظ الجملة المرفقة: وهذا يعني أنك عندما تقوم بشراء القالب فيمكنك أن تستعمله لأي عدد من النطاقات Domains، ولكن لم يتم توضيح ما إذا كانت النطاقات متعلقة بموقع ويب واحد أم بمواقع مختلفة، ففي حالة كان اقالب يستخدم لموع واحد فقط، فيمكنك أن تستعمل نفس القالب مع نفس الموقع وحتى إن تم تغير نطاق المواقع في المستقبل ولكن لا يمكنك أن تستعمل نفس القالب مع أكثر من موقع في نفس الوقت (أي أن القالب مخصص لموقع واحد فقط حتى ولو تم تغير نطاق domain الموقع)، لذلك عليك التأكد من خلال سؤال مطور القالب نفسه (أو البائع الذي يملك حقوق بيع القالب). أما بالنسبة لوجود كود يقوم بمنع القالب من الإستخدام في مدونات أخرى، فيمكن القيام بهذا الأمر بإستخدام JavaScript فقط، وقد لا يكون من السهل إزالة هذا الأمر إذا كان القالب يعتمد بشكل أساسي على أكواد JavaScript الموجودة فيه أو إذا كانت الأكواد معماة obfuscated (أي أن الكود مشفر ولا يمكن التعديل عليه بسهولة) ويتم هذا الأمر من خلال أدوات مثل obfuscator.
- 4 اجابة
-
- 1
-
توفر أكاديمية حسوب مئات المقالات المختلفة في كل المجالات وخصوصًا البرمجة والتصميم، بالإضافة إلى قناة حسوب على اليوتيوب والتي تحتوي على عشرات الفيديوهات المختلفة والعامة في البرمجة، ويمكنك زيارة القناة من هنا: قناة أكاديمية حسوب على اليوتيوب. بالإضافة إلى دورات أكاديمية حسوب المتعددة، حيث تحتوي الأكاديمية على ست دورات متنوعة والتي يركز جميعها على إستخدام تقنيات الويب لإنشاء المواقع (Backend و Frontend) وتطبيقات الهواتف الذكية، يمكنك زيارة هذه الدورات من هنا: دورات أكاديمية حسوب. في حالة أردت الإنضمام إلى أحد الدورات فأنصحك بالإشتراك بدورة علوم الحاسوب لأنها تشرح كل الأساسيات المطلوبة في البرمجة، بداية من الأساسيات البسيطة مثل المتغيرات والشروط والدوال مرورًا بأنظمة التشغيل والحماية والبروتوكلات والويب وكيفية عمل خوادم الويب والمتصفحات معًا، وصولًا إلى الخوارزميات وهياكل البيانات وأنماط التصميم البرمجية. ولكن أولًا يجب تحديد الهدف من تعلم البرمجة ، هل تريد إنشاء مواقع الويب؟ ربما تطوير الألعاب؟ أو من الممكن إنشاء تطبيقات الهواتف الذكية؟ وكل من هذه المجالات وغيرها تحتاج إلى فهم الأساسيات البرمجية بالطبع ولكن التقنيات المستخدمه فيها متفاوته وكل مجال منهم له تقنياته ومتطلباته وبرامجه .. إلخ، لذلك يجب تحديد الهدف أولًا ثم يتم تحديد المتطلبات والتقنيات التي سوف تستعملها. هنا مقالة تشرح كل مجالات البرمجة الأساسية ومتطبيات كل مجال وأشهر التقنيات المستخدمه فيه كذلك:
-
يمكنك أن تقوم بالتحقق من وجود أي مستخدمين من خلال التابع first بالشكل التالي: exists = db.session.query(User).filter_by(name='mohssen').first() is not None بهذا الشكل سوف يتم تنفيذ إستعلام SQL التالي: SELECT * FROM user WHERE user.name = ? وفي حالة كان الكائن الأول عبارة عن None فذلك يعني عدم وجود أي مستخدمين يحملون الاسم mohssen في جدول users يمكنك أيضًا القيام بنفس الأمر السابق من خلال الدالة bool التي تتحقق منطقيًا من أي كائن ممرر إليها: bool(db.session.query(User).filter_by(name='mohssen').first())
- 1 جواب
-
- 1