سامح أشرف

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

    1,847
  • تاريخ الانضمام

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

  • Days Won

    40

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

1,386 Excellent
  1. لا يمكن تخمين ما إذا كانت تقنية معينة أو لغة برمجة معينة أو غيرها سوف يتم إلغائها أو القضاء عليها، وذلك بسبب وجود الآلاف من المبرمجين الذين يستعملون تقنيات مثل React Native أو غيرها. باللإضافة إلى أن نظام فوشيا سوف يدعم تطبيقات أندرويد -حسب موقع 9to5google- ، وبالتالي ليس من المهم التقنية المستخدمة في إنشاء التطبيق طالما سيكون التطبيق النهائي يعمل على الأندرويد ففي الغالب سيعمل أيضًا على نظام Fuchsia منذ عدة سنوات ظهرت شائعات بأن لغة PHP ستموت ولن يستخدمها أحد (مازال بعض الأشخاص يعتقدون ذلك) ولكن بعد مرور سنوات منذ أن ظهرت هذه الشائعات ومازالت لغة PHP لها نصيب الأسد في لغات برمجة الواجهات الخليفة Backend وصدر إصدار جديد لها (الإصدار 8) منذ أشهر قليلة، وهذا يعني أن اللغة مازالت تتطور وأن هناك الكثير من المبرمجين مازالوا يستخدمن هذه اللغة، وبالمثل لا يمكن لأحد أن يقوم بأن هناك تقنية سوف تقضي على تقنية أخرى، وذلك لأن كل تقنية يكون لها إستخدام مختلف أو هدف مختلف وفريد، وإلا لماذا لا يتم تطوير التقنية القديمة في المقام الأول بدل تطوير تقنية مختلفة من الأساس وإعادة إختراع العجلة من جديد، حيث أن كل هذه التقنيات مفتوحة المصدر ويمكن أن لأي أحد أن يساعد في تطويرها بسهولة. كما يتم أيضًا مقارنة التقنيات بنفس الطريقة، وستجد هنا العديد من الأسئلة المشابهة للمقارنة بين التقنيات: هنا أسئلة للمقارنة بين Flutter وReact Native وبالتأكيد يمكنك أتستعمل أيًا منهما بدون مشكلة. فكما ذكرت سابقًا أنه لا يمكن أن نقارن بين التقنيات لأن كل تقنية لها إستخدامها، لكن يوجد تقنية مفيدة في حالة معينة أكثر من غيرها، فعلى سبيل المثال إن كنت على دراية بتقنتيات الويب (HTMl و CSS و javaScript ..إلخ) فسيكون إستخدام React Native أسهل لأنك لن تضر إلى تعلم لغة برمجة جديدة أو إطار عمل جديد من الصفر.
  2. يمكنك أن تقوم بإستخدام الدالة 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)
  3. يوجد خطأين في الكود، الخطأ الأول هو عملية تحويل السعر إلى رقم وإضافة الرقم إلى الخاصية 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); }); بهذا الشكل سوف يتم ترتيب العناصر بشكل سليم حسب السعر.
  4. عليك في البداية تحديد المجال الذي تريد التخصص فيه، هل تريد إنشاء مواقع إلكترونية؟ أو ربما تريد إنشاء تطبيقات الهواتف الذكية؟ أو قد تريد تطوير الألعاب، كل مجال من المجالات السابقة لديه تقنيات ولغات برمجة يتم إستخدامها فيه وهذه التقنيات والبرامج تختلف من مجال إلى آخر، لذلك أول خطوة هي تحديد التخصص الذي تريد العمل فيه، ثم عليك تحديد التقنيات ولغات البرمجة التي سوف تستخدمها في هذا التخصص والتي عليك أن تتعلمها بالترتيب وأن تتدرب على إستخدامها بشكل جيد هنا مقالة توضح أهم المجالات وشرح مبسط له وأهم اللغات والتقنيات المستخدمه فيه: تم نشر أسئلة مشابهة لهذا السؤال كثيرًا في السابق، يمكنك الإطلاع على بعضٍ منها من هنا:
  5. بالتأكيد يختلف الأمر من شخص إلى آخر كما ذكرت في سؤالك، ولكن إن قمت بمشاهدة ساعة من الفيديوهات يوميًا فسوف تستغرق على الأقل 53 ساعة، وذلك لأن دورة علوم الحاسوب تحتوي على أكثر من 53 ساعة فيديو تدريبية (تمت الإشارة إلى هذا الأمر في صفحة دورة علوم الحاسوب)، ولكن بالطبع فسوف يستغرق أي شخص وقت أطول من هذا لإتمام الدورة بسبب المشاريع العملية والتطبيق وراء المدربين في الفيديو، أو ربما تجد جزئية صعبة قليلًا في الفهم فتستغرق فيها وقت أطول بالتأكيد، حيث ستقوم بإعادة مشاهدة الدرس أو البحث في موسوعة حسوب أو مقالات الأكاديمية أو ربما يظهر لك خطأ في أحد المشاريع وتستغرق بعض الوقت في محاولة إصلاح الخطأ بنفسك .. إلخ. وكنتيجة لما سبق لا يمكن حساب الوقت الذي تحتاجه لإتمام الدورة، ولكن يمكنك أن تقوم أنت بحساب هذا الوقت التقريبي لنفسك من خلال مشاهدة أحد المسارات وحساب الوقت المستغرق لإنهاء المسار بالكامل (مع العلم أن حجم المسارات ليس متساوي تمامًا). كما أنك قد تستغرق وقت أقل إن وجدت أنك تفهم الدروس بسرعة وقمت بتشغيل الفيديدهات بسرعة أعلى 1.5x على سبيل المثال.
  6. يمكنك القيام بهذا الأمر من خلال المُرَشِح filter الذي يسمى title بالشكل التالي: {{ value|title }} لكن المُرشح السابق سوف يقوم بجعل أول حرف من كل كلمة كبير Uppercase، لذلك يمكنك أن تستعمل مُرشح آخر وهو capfirst: {{ "hello, world"|capfirst }} # Output: "Hello, world" تستطيع أيضًا إستخدام المُرشح lower مع الطرق السابقة لجعل كل الحروف صغيرة lowercase ماعدا الحرف الأول فقط: {{ "heLLO, WORLD"|lower|capfirst }} # Output: "Hello, world"
  7. يمكنك أن تقوم بهذا الأمر من خلال عمل صنف جديد يرث من الصنف 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
  8. هذه الطريقة (إضافة أقواس مربعة في أكثر من حقل للتعبير عن مصفوفة) ليست من معاير الويب 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')
  9. لا يمكنك أن تستعمل 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)
  10. مكتبة 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 وسوف يتم إضافة الملف إلى القالب من خلال الكود الأخير.
  11. إن كان مطور القالب يسمح بإستخدام القالب على مواقع متعددة فلا مشكلة من هذا الأمر ولاحظ الجملة المرفقة: وهذا يعني أنك عندما تقوم بشراء القالب فيمكنك أن تستعمله لأي عدد من النطاقات Domains، ولكن لم يتم توضيح ما إذا كانت النطاقات متعلقة بموقع ويب واحد أم بمواقع مختلفة، ففي حالة كان اقالب يستخدم لموع واحد فقط، فيمكنك أن تستعمل نفس القالب مع نفس الموقع وحتى إن تم تغير نطاق المواقع في المستقبل ولكن لا يمكنك أن تستعمل نفس القالب مع أكثر من موقع في نفس الوقت (أي أن القالب مخصص لموقع واحد فقط حتى ولو تم تغير نطاق domain الموقع)، لذلك عليك التأكد من خلال سؤال مطور القالب نفسه (أو البائع الذي يملك حقوق بيع القالب). أما بالنسبة لوجود كود يقوم بمنع القالب من الإستخدام في مدونات أخرى، فيمكن القيام بهذا الأمر بإستخدام JavaScript فقط، وقد لا يكون من السهل إزالة هذا الأمر إذا كان القالب يعتمد بشكل أساسي على أكواد JavaScript الموجودة فيه أو إذا كانت الأكواد معماة obfuscated (أي أن الكود مشفر ولا يمكن التعديل عليه بسهولة) ويتم هذا الأمر من خلال أدوات مثل obfuscator.
  12. توفر أكاديمية حسوب مئات المقالات المختلفة في كل المجالات وخصوصًا البرمجة والتصميم، بالإضافة إلى قناة حسوب على اليوتيوب والتي تحتوي على عشرات الفيديوهات المختلفة والعامة في البرمجة، ويمكنك زيارة القناة من هنا: قناة أكاديمية حسوب على اليوتيوب. بالإضافة إلى دورات أكاديمية حسوب المتعددة، حيث تحتوي الأكاديمية على ست دورات متنوعة والتي يركز جميعها على إستخدام تقنيات الويب لإنشاء المواقع (Backend و Frontend) وتطبيقات الهواتف الذكية، يمكنك زيارة هذه الدورات من هنا: دورات أكاديمية حسوب. في حالة أردت الإنضمام إلى أحد الدورات فأنصحك بالإشتراك بدورة علوم الحاسوب لأنها تشرح كل الأساسيات المطلوبة في البرمجة، بداية من الأساسيات البسيطة مثل المتغيرات والشروط والدوال مرورًا بأنظمة التشغيل والحماية والبروتوكلات والويب وكيفية عمل خوادم الويب والمتصفحات معًا، وصولًا إلى الخوارزميات وهياكل البيانات وأنماط التصميم البرمجية. ولكن أولًا يجب تحديد الهدف من تعلم البرمجة ، هل تريد إنشاء مواقع الويب؟ ربما تطوير الألعاب؟ أو من الممكن إنشاء تطبيقات الهواتف الذكية؟ وكل من هذه المجالات وغيرها تحتاج إلى فهم الأساسيات البرمجية بالطبع ولكن التقنيات المستخدمه فيها متفاوته وكل مجال منهم له تقنياته ومتطلباته وبرامجه .. إلخ، لذلك يجب تحديد الهدف أولًا ثم يتم تحديد المتطلبات والتقنيات التي سوف تستعملها. هنا مقالة تشرح كل مجالات البرمجة الأساسية ومتطبيات كل مجال وأشهر التقنيات المستخدمه فيه كذلك:
  13. يمكنك أن تقوم بالتحقق من وجود أي مستخدمين من خلال التابع 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())
  14. يمكنك أن تستخدم التابع filter والذي يعيد مصفوفة جديدة تحتوي على بعض العناصر المطابقة للشروط، وهنا مثال بسيط: let books = [ [1,"Start with why","Simon Sinek",80.0,13], [2,"But how do it know","J. Clark Scott",59.9,22], [3,"Clean Code","Robert Cecil Martin",50.0,5], [4,"Zero to One","Peter Thiel",47,12], [5,"You don't know JS","Kyle Simpson",39.9,9] ]; // البحث عن الكتاب الذي يحمل الاسم Clean Code books.filter(book => book[1] == "Clean Code"); // [[3, 'Clean Code', 'Robert Cecil Martin', 50, 5]] // البحث عن الكتب التي لديها سعر أقل من 50 books.filter(book => book[3] < 50); // [[4, 'Zero to One', 'Peter Thiel', 47, 12], [5, "You don't know JS", 'Kyle Simpson', 39.9, 9]] // البحث عن كتب المؤلف Kyle Simpson books.filter(book => book[2] == "Kyle Simpson"); // [[5, "You don't know JS", 'Kyle Simpson', 39.9, 9]] يمكنك القراءة أكثر حول التابع filter وكيفية إستخدامه من خلال موسوعة حسوب من هنا.
  15. إن كان لديك مقطع فيديو (وليكن باسم video.mp4) فيمكنك أن تستخرج منه الصور بإستخدام مكتبة cv2 في بايثون، بالشكل التالي: import cv2 vidcap = cv2.VideoCapture('video.mp4') success,image = vidcap.read() count = 0 while success: cv2.imwrite("frame%d.jpg" % count, image) success,image = vidcap.read() print('Read a new frame: ', success) count += 1 يقوم الكود السابق بإستخراج كل الفريمات Frames من مقطع الفيديو ويقوم بحفظ كل صور بصيفة jpg، قد تكون هذه الطريقة بطيئة وتستهلك الكثير من مساحة التخزين بسبب وجود الكثير من الصور، لذلك يمكنك إستخدام الكود التالي الذي يقوم بإستخراج صورة واحدة من كل 30 صورة (ويمكن التحكم في هذا الرقم): import cv2 cap = cv2.VideoCapture('video.mp4') count = 0 while cap.isOpened(): ret, frame = cap.read() if ret: cv2.imwrite('frame{:d}.jpg'.format(count), frame) count += 30 # i.e. at 30 fps, (في الغالب تحتوي الثانية الواحدة على 30 لقطة frame) cap.set(cv2.CAP_PROP_POS_FRAMES, count) else: cap.release() break أما بالنسبة لنشر الصور فعليك البحث عن API خاص بالمنصة التي تريد النشر فيها، فعلى سبيل المثال إن أردت النشر على فيسبوك فعليك البحث عن Facebook API ، حيث تختلف المتطلبات من منصة إلى أخرى ولكن ستكون الفكرة واحدة بينهم، وستجد في الغالب أن المنصة توفر مكتبة لكي تستخدمها وتسمح لك بالنشر (أو القيام بأمور أخرى مختلفة) بسهولة.