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

لوحة المتصدرين

  1. Raed Elmajdoub

    Raed Elmajdoub

    الأعضاء


    • نقاط

      9

    • المساهمات

      15


  2. مسعود زاهي

    مسعود زاهي

    الأعضاء


    • نقاط

      5

    • المساهمات

      646


  3. Salih Othman

    Salih Othman

    الأعضاء


    • نقاط

      4

    • المساهمات

      33


  4. Flutter Dev

    Flutter Dev

    الأعضاء


    • نقاط

      3

    • المساهمات

      787


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 03/01/22 في كل الموقع

  1. اذا قمت بانشاء تطبيق ويب واريد ان احصل على سرعة عالية في التجاوب في العمليات داخل التطبيق....ماهي العوامل التي تجعل التطبيق قوي وسريع التجاوب؟ هل مثلا اختيار لغة الباك اند تلعب دورا في ذلك...اذا كان الجواب نعم، اذا ماهي اللغة المناسبة لذلك؟
    3 نقاط
  2. السلام عليكم يا معشر المستقلين فتحت حساب في منصة مستقل و كتبت المهارات التي أتقنها للعمل الحر و أدرجت بعض أعمالي و بدات أقدم العروض للأصحاب المشاريع الى حد الان لم يحالفني الحض في الوصول الى اول عميل و عمل على مستقل فهل من نصائح و خبرات أستفيد منها ؟
    3 نقاط
  3. الاهتمام بمهاراتك والخدمات التي تستطيع تقديمها لأصحاب المشاريع هو الأولوية الوحيدة والأساس في حصولك على فرص العمل واختيارك من قبلهم، ركز على التالي: كتابة نبذة توضح مهاراتك والخدمات التي تستطيع تقديمها الاهتمام بمعرض الأعمال وعرض الأعمال ذات الجودة العالية التي قمت بها سابقًا عند حصولك على عمل اهتم بتقديم أعلى جودة للعمل المنفذ لتحصل على تقييم جيد ضمن حسابك قدم عروض تبرز فيها ما الذي تستطيع تقديمه لصاحب العمل ومدى خبرتك الفعلية في مجال المشروع يمكنك الاستفادة من قراءة المقالات التالية: لماذا يتجاهل أصحاب المشاريع عروضك على مستقل كيف تبني معرض أعمالك باحترافية
    2 نقاط
  4. السلام عليكم نعم هناك عدة عوامل مهمة منها لغة برمجة backend انا انصحك ب php laravel او node.js او spring java و server الذي تمت عليه hosting يجب ان يكون ممتازا و انصحك ب server امازون AWS و نضافة الكود يعني ليس هنالك اسطر برمجية لا تقوم باي عمل فقط تقلل من سرعة الاستجابة و القيام بعملية optimization في الكود
    2 نقاط
  5. السلام عليكم لدي حاسوب hp I5 7eme generation Ram 8gega 1T desque dur و أعمل عليه برمجة و تصميم و احيانا مونتاج و هو يعمل بطريقة سلسة و جيدة
    2 نقاط
  6. لدي عدد من عناوين URL المخصصة لعدد من صفحات الهبوط وتنتهي بمعرّف فريد id. أحتاج إلى أن أكون قادرًا على الحصول على المعرف من عنوان URL http://localhost/pageA http://localhost/pageB http://localhost/pageC http://localhost/pageD أريد أن تكون كلمة page ثابتة بينما بجانبها حرف أو رقم يعبر عن الصفحة، كيف أقوم بهذا الأمر؟
    1 نقطة
  7. ما هو الفرق بين تنعيم L1 و L2، ومتى نستخدم كل منهما؟ What is the difference between L1 and L2 regularaization and when to use each one?
    1 نقطة
  8. كلاهما يستخدم لمحاربة (أو معالجة) مشكلة الضبط الزائد Overfitting. L1 ( L1 lasso or norm): يقوم بمحاربة ال OF عن طريق تصغير قيم الأوزان المرتبطة بالميزات feature الأقل أهمية باتجاه ال 0، مما يجعل تأثير بعض ال feature مهمل لأنه يجعل قيم بعض الأوزان صفرية تماماً، ويمكن اعتبار ذلك نوعاً من أنواع اختيار الميزات feature selection، ويعتمد على إضافة حد جديد الى تابع الكلفة (يُسمى معاقبة penalty) يمثل مجموع القيم المطلقة للأوزان مضروباً بمعامل تحكم لمدا (زيادتها تؤدي إلى زيادة تأثير هذه العملية وتصغيرها يؤدي إلى العكس، وهي قيمة بين ال 0 وال 1 وتعتبر من المعاملات العليا HyperParameter التي يجب ضبطها). المعادلة المعبرة عنه: أي أنها تعتمد على إضافة مجموع القيم المطلقة للأوزان مضروباً بمعامل تحكم (لمدا)، إلى تابع الكلفة المستخدم. L2 (L2 ridge): يقوم بمحاربة ال OF عن طريق تصغير قيم الأوزان ولكن لا يجعلها صفرية، ويعتمد على إضافة حد جديد إلى تابع الكلفة يمثل مجموع مربعات الاوزان مضروبا بمعامل تحكم لمدا. المعادلة المعبرة عنه: أي أنها تعتمد على إضافة مجموع مربعات للأوزان مضروباً بمعامل تحكم (لمدا)، إلى تابع الكلفة المستخدم. هناك فروق أخرى يمكن استنتاجها من هذا الكلام ،مثل أن L1 أكثر متانة من L2 بسبب قدرته على التعامل مع القيم الشاذة، في حين أن L2 يعاني من مشكلة القيم الشاذة (أو المتطرفة). أيضاً L1 يقوم ضمنيّاً بعملية feature selection، وهذا قد يكون له أثر سلبي لبعض المهام، بينما L2 لا يقوم بذلك أبداً. يعتبر أيضاً L1 تمثيل متناثر Sparse لأن عدد الأصفار يزداد نتيجة تصفير بعض الأوزان على عكس L2 الذي يعتبر كثيف Dense.
    1 نقطة
  9. اقوم بجلب بيانات جدول كالتالي: $sql = "SELECT * FROM topic LEFT JOIN Table1 ON topic.id = Table1.IdTable1 WHERE state = 1 AND State = 0 AND name Like ? OR Table1.IdTable1 Like ? "; انا اجلب بيانات الجدول الأول الذي اسمه Topic واقوم بجلب بيانات الجدول الذي اسمه Table1 مع وجود شرط ان يكون state يساوي 0 حسنا الان انا أحاول جلب البيانات بشرط من الاثنين اما من خلال name او من خلال IdTable1 المشكلة كالتالي : لو قمت بجلب البيانات من خلال حقل name هنا سوف يعمل شرط state أيضا بحيث سوف يجلب البيانات التي تحتوي على قيمة 0 state ولكن لو قمت بجلب البيانات من خلال Table1.IdTable1 رح تحدث مشكلة وهيا ان state لن يعمل وسوف يجلب جميع البيانات سوى كان state يحمل قيمة 1 او 2 او 3 كيف يمكن حل هذا المشكلة بحيث ان state يجب ان يعمل في كل الحالتين هل توجد طريقة لفعل ذلك؟
    1 نقطة
  10. تمام، نعمل and بين أول شرط state = 0 مع الجزء الآخر للجملة، لكن لن تعمل state = 1 لأنها للتو قيمتها 0 WHERE state = 0 AND ( name Like ? OR Table1.IdTable1 Like ? )";
    1 نقطة
  11. اهلا اخي الكريم لا انا احاول اجلب البيانات من خلال استعلام نوعين يعني ممكن للمستخدم يعمل استعلام من خلال ID او من خلال name ولكن في كل الحالتين احتاج ان يكون البيانات المرجعه ماخذه حقل state في حالة 0 الان هو استعلام name ياخذ حالة 0 ولكن حقل ID لا ياخذ بمعنى ان الاستعلام الذي صار بعد جمله OR لا يتاثر بما قبله وهو state =0 هنا تكملن المشكلة انا احتاج ان ياخذ state 0 مثل استعلام name والذي هو قبل الجمله OR
    1 نقطة
  12. فهمت أنك تريد جلب البيانات في حال state = 1 ثم شرط آخر هو state 0 مع اسم معين أو id ميعن.. جرب التالي: WHERE state = 1 OR ( State = 0 AND name Like ? ) OR (Table1.IdTable1 Like ? )"; أو WHERE state = 0 OR ( State = 1 AND name Like ? ) OR (Table1.IdTable1 Like ? )"; ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ وضع أقواس لكل مجموعة شروط مرتبطة بينهم OR هو حل مشكلتك. AND لها أولوية (يتم تقييم طرفيها ثم استبدالها بقيمة منطقية) ثم ننتقل ل AND الثانية .. ثم يتم تجميع الشرط كاملاً بعبارات OR في حال الاستعلام خطأ، عليك وضع توضيح للشروط التي تستعملها لأنه غير مفهوم.
    1 نقطة
  13. هل قسم الورد بريس الموجود في دورة PHP يكفي انه يجعلني قادرا على ان اشتغل مطور ورد بريس
    1 نقطة
  14. انا اقصد بالظبط المحتوى اللي موجود في دورة PHP للوردبريس كفاية انه يخليني اشتغل علي مواقع العمل الحر مطور ووردبريس متمكن بعد دراسة مسارات الدورة كلها طبعا بس انا حابب اشتغل في الووردبريس
    1 نقطة
  15. أرغب في تمرير متغير إلى جميع القوالب الخاصة بالمشروع، دون تكرار نفس الكود في كل دالة في ملف views.py، فعلى سبيل المثال، أود أن أجعل متغير categories متاحة لجميع القوالب في تطبيق الويب، بدلًا من تمريره يدويًا في كل دالة: def home_page(request): categories = Category.objects.all() # ... return render_to_response('users/home_page.html', {'categories':categories}) def about_page(request): categories = Category.objects.all() # ... return render_to_response('users/about_page.html', {'categories':categories}) كما هو ظاهر في الكود السابق فإن في كلا الدالتين أقوم بجلب التصنيفات categories من قاعدة البيانات وإرسلها إلى القالب، هل توجد طريقة لجعل المتغير categories متاحًا لكل القوالب بشكل إفتراضي بدلًا من تمريره لكل قالب على حدى؟
    1 نقطة
  16. لجعل مُتغير متاحاً في كل القوالب بشكل إفتراضي يجب إنشاء مُعالج سياق (context processor) جديد وإضافته إلى إعدادات جانغو. لفِعل ذلك نقوم بإنشاء ملف بايثون داخل تطبيق جانغو ونقوم بتسميته my_context_processors.py. داخل الملف نقوم بكتابة الشفرة التالية: from myapp.models import Category def categories_processor(request): categories = Category.objects.all() return {'categories': categories} # أنشأنا متغير جديد فيه كل المُنتجات ثم نُضيف my_context_processors داخل ملف الإعدادات: TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'OPTIONS': { 'loaders': [ ... ], 'context_processors': [ 'django.template.context_processors.debug', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', "myapp.my_context_processors.categories_processor" # نُضيفه هنا ], }, } ] بهذا الشكل يكون categories مًتواجداً في كل القوالب.
    1 نقطة
  17. لدي بعض البيانات في ملف CSV وأريد استيرادها إلى نماذج model في جانغو Django ، هنا شكل البيانات التي أريد إستيرادها: 1;"product_1";"20.59";"product description"; 2;"product_2";"29.99";"product description"; 3;"product_3";"18.25";"product description"; 4;"product_4";"37.50";"product description"; لدي نموذج باسم Product. وأريد أن أقوم بإستيراد ملف CSV السابق إلى الحقول الموجودة في النموذج مثل الاسم name والوصف description والسعر price كيف أقوم بهذا الأمر؟
    1 نقطة
  18. يُمكنك إنشاء أمر في جانغو يقوم بقراءة ملف ال CSV وإدخال المعلومات داخل النموذج Product. لإنشاء الأمر نقوم بإنشاء مجلد داخل تطبيق جانغو ونقوم بتسميته management، داخل هذا المجلد نقوم بإنشاء مجلد آخر اسمه commands، وبداخله نقوم بإنشاء ملف بايثون يحمل الإسم insert_products_from_csv.py. نقوم بوضع هذه الشفرة داخل الملف. from django.core.management.base import BaseCommand import csv class Command(BaseCommand): help = 'إنشاء كائنات إنطلاقاً من ملف csv' def add_arguments(self, parser): parser.add_argument('--path', type=str, help="مسار الملف") def handle(self, *args, **options): # نجلب مسار الملف file_path = options['path'] # نقرأ الملف with open(file_path, 'rb') as csv_file: reader = csv.reader(csv_file, delimiter=';') for row in reader: # نستخرج معلومات المُنتج من كل سطر product_id = row[0] product_name = row[1] product_price = row[2] product_description = row[3] # نحفظ المعلومات في النموذج person, created = Person.objects.update_or_create( id=product_id, name=product_name, price=product_price, description=product_description ) لتشغيل الأمر نكتب python manage.py insert_products_from_csv --path "هنا نضع مسار الملف كاملاً"
    1 نقطة
  19. يجب الاشارة الى أن المقصود بمطور وردبرس هو ذاك الشخص الذي يساهم في تطوير مكونات وردبرس ويعمل على تطويرها كنظام ادارة محتوى مفتوح المصدر. إما بإضافة وحدات جديدة أو التعديل في أخرى موجودة أو حتى بالمساهمة بتطوير قوالب وغيرها. في دورة تطوير تطبيقات الويب باستخدام PHP يخصص مسار كامل للتعامل مع تطوير قوالب الوردبرس إبتداءا من مظهره العام الى تجهيزه للنشر. هذا ويتبع بمسار لتطوير متجر إلكتروني في ووردبريس عبر ووكومرس. ونعم سيكون محتوى الدورة كافيا للحصول على أول مشاريعك كمطور لقوالب وردبرس.
    1 نقطة
  20. مشكورين على تفاعلكم... طيب ...الذي اعرفه ان اللارافيل هو اطار عمل للغة PHP وكذلك الدوت نت كور هو اطار عمل للغة السي شارب سؤالي: هل النود اطار عمل للجافا سكربت، ام هي لغة مشتقة من لغة الجافا سكربت؟ سؤال اخر: هل يمكن تخزين عدد لا محدود من البيانات في قواعد البيانات مثل mysql- sql server - mongodb- oracle وماهي قاعدة البيانات المفضلة لديك؟
    1 نقطة
  21. إختيار اللغة لن يؤثر بشكلٍ كبير على أداء التطبيق حيث يوجد عوامل أهم يجب أخذها في الحسبان الإستعلامات التي يتم إستخدامها في قاعدة البيانات, فإن قاعدة البيانات من أكبر مشاكل الأداء فيجب تنفيذ إستعلامات سريعة كثرة الإستعلامات إلى قاعدة البيانات كثرة البيانات الغير مفيدة والتي يمكن الإستغناء عنها كثرة الطلبات التي تقوم بها الصفحة, كلما زادت الطلبات التي ترسلها الصفحة في نفس ذات الوقت أثر على أداء التطبيق حجم الملفات , حاول بقدر المستطاع ضغط الصور والملفات بوجهٍ عام حتى يقل حجم البيانات التي يستقبلها العميل تخزين البيانات في هياكل بيانات مناسبة عدم القيام بأي عمليات حسابية حساسة عند العميل وإستبدالها عند الخادم
    1 نقطة
  22. هدفنا هو استخدام عنوان URL مثل هذا /v1/magazines?page=1&per-page=50 لإنشاء نتائج JSON مثل هذا: { "results": [ { "Programming Today", "publisher": "Harper Collins" }, { "title": "Mountain Biking", "publisher": "Outdoors Limited" } ], "pagination": { "count": 2, "page": 1, "per_page": 50, "pages": 1 } } @app.route("/magazines") def magazines(): # process query parameters page = request.args.get("page", 1, type=int) per_page = request.args.get("per-page", 100, type=int) # query magazines = Magazine.query.paginate(page, per_page) # combine results with pagination results = { "results": [{"title": m.title, "publisher": m.publisher} for m in magazines.items], "pagination": { "count": magazines.total, "page": page, "per_page": per_page, "pages": magazines.pages, }, } return jsonify(results) هذا هو! تمنحنا طريقة ترقيم الصفحات في استعلام sqlalchemy الكثير من المرونة مع القليل جدًا من التعليمات البرمجية وإرجاع مجموعة نتائج محدودة وعرض إجمالي السجلات المتاحة أثناء حساب الصفحات المتبقية بناءً على إعدادنا لكل صفحة.
    1 نقطة
  23. السبب هو الباب 81 هو باب مخصص في linux جرب تغييره الى 3000 أو 5000 app.run(host="127.0.0.1", port=3000, debug=True)
    1 نقطة
  24. أنت تُحاول تشغيل تطبيق flask في المنفذ 81 الذي يُعتبر من المنافذ ذوات الإمتيازات (privileged port) . إستعمل منفذ آخر مثل 5000 لن يطلب منك النظام إمتيازات المُدير لاستعماله. app.run(host="127.0.0.1", port=5000, debug=True) ملاحظة: المنافذ ذوات الإمتيازات هي المنافذ الأقل من 1024 وهي منافذ لا يُسمح للمستخدمين العاديين تشغيل الخوادم عليها - هذا إجراء أمني -.
    1 نقطة
  25. إعدادات جانغُو الإفتراضية لا تعمل على إنشاء ملفات logs. وإنما فقط تقوم بإرسال رسالة إلكترونية إلى مُديري المشروع المُتواجدة عناوينهم الإلكترونية في القائمة ADMINS (في ملف الإعدادات settings.py) في حالة الخطأ رقم 500. إذا أردت إضافة هذا الأمر وحفظ الأخطاء داخل ملفات logs عليك بتغيير القيمة الإفتراضية ل LOGGING في ملف الإعدادات على الشكل التالي: # هذه هي الإعدادات الإفتراضية لجانغو LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse', }, 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', }, }, 'formatters': { 'django.server': { '()': 'django.utils.log.ServerFormatter', 'format': '[{server_time}] {message}', 'style': '{', } }, 'handlers': { 'console': { 'level': 'INFO', 'filters': ['require_debug_true'], 'class': 'logging.StreamHandler', }, 'django.server': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'django.server', }, 'mail_admins': { 'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler' }, ## نقوم بإضافة 'applogfile': { 'level':'DEBUG', 'class':'logging.handlers.RotatingFileHandler', ## هنا نضع المسار الذي تريد حفظ الملفات فيه مع اسم الملف 'filename': os.path.join(BASE_DIR, 'mylog.log'), 'maxBytes': 1024*1024*15, # 15MB الحجم الأقصى للملف الواحد 'backupCount': 10, # العدد الأقصى للملفات }, }, 'loggers': { 'django': { 'handlers': ['console', 'mail_admins', 'applogfile'], #نُضيف الاسم إلى القائمة 'level': 'INFO', }, 'django.server': { 'handlers': ['django.server'], 'level': 'INFO', 'propagate': False, }, }, } ملفات ال logs سوف تُحفظ في المسار وبالاسم الذي حددته في الإعدادات.
    1 نقطة
  26. هذا مثال بسيط لفهم تقسيم الصفحات الخاص ب Flask-SQLAlchemy. نفرض أنه يوجد لدينا صفحة نقوم بعرض مجموعة من الألوان بداخلها. أولاُ نقوم بجلب الألوان: @app.route('/colors') def colors(): # نجلب الألوان من قاعدة البيانات # ونعرضها في القالب colors = Color.query.all() return render_template('colors/all_colors.html', colors=colors) ثانيا نعرض الألوان في القالب: <div class="table-responsive"> <table class="table table-sm table-borderless mb-0"> <thead class="thead-dark"> <tr> <th>S/N</th> <th>Color Name</th> <th>Date Created</th> <th>Actions</th> </tr> </thead> <tbody> {% for color in colors %} <tr> <th scope="row">{{ loop.index }}</th> <td>{{ color.name }}</td> <td>{{ color.created_at }}</td> </tr> {% endfor %} </tbody> </table> </div> كل الألوان سيتم عرضُها. حتى ولو كان عددها كبيراً جداً وهذا سيؤدي إلى ثقل في تحميل الصفحة. الحل طبعا هو إضافة ال pagination. لإضافتها نغير الشفرة إلى: ROWS_PER_PAGE = 10 # نعين عدد الالوان التي نريدها في كل صفحة @app.route('/colors') def colors(): # نضغ إعدادات الترقيم page = request.args.get('page', 1, type=int) # نستعمل الدالة paginate # من Flask SQLAlchemy # ونمرر لها الصفحة الحالية مع عدد الألوان في كل صفحة colors = Color.query.paginate(page=page, per_page=ROWS_PER_PAGE) return render_template('colors/all_colors.html', colors=colors) نقوم بتعديل القالب: لعرض العناصر يجب إستدعاء colors.items بدل colors. <div class="table-responsive"> <table class="table table-sm table-borderless mb-0"> <thead class="thead-dark"> <tr> <th>S/N</th> <th>Color Name</th> <th>Date Created</th> <th>Actions</th> </tr> </thead> <tbody> {% for color in colors.items %} ^^^^^^^^^^^^ <tr> <th scope="row">{{ loop.index }}</th> <td>{{ color.name }}</td> <td>{{ color.created_at }}</td> </tr> {% endfor %} </tbody> </table> </div> <!-- إنشاء روابط تقسيم الصفحات --> <div class="text-right"> <a href="{{ url_for('colors', page=colors.prev_num) }}" class="btn btn-outline-dark {% if colors.page == 1 %}disabled{% endif %}"> &laquo; </a> <!-- نعمل حلقة لعمل رابط لكل صفحة --> {% for page_num in colors.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=2) %} {% if page_num %} <!-- نقوم بكتابة شرط للتحقق من الصفحة الحالية--> {% if colors.page == page_num %} <a href="{{ url_for('colors', page=page_num) }}" class="btn btn-dark"> {{ page_num }} </a> {% else %} <a href="{{ url_for('colors', page=page_num) }}" class="btn btn-outline-dark"> {{ page_num }} </a> {% endif %} {% else %} ... {% endif %} {% endfor %} <a href="{{ url_for('colors', page=colors.next_num) }}" class="btn btn-outline-dark {% if colors.page == colors.pages %}disabled{% endif %}"> &raquo; </a> </div> <p class="text-right mt-3"> Showing page {{ colors.page }} of {{ colors.pages }} </p>
    1 نقطة
  27. الكود غير مكتمل ولم أتمكن من تحديد ما إذا كنت تستخدم stateful أو stateless. ولكن من الأفضل استخدام setState لتغيير حالة المتغيرات في حال كانت ستغيّر من حالة الواجهة لديك بدلاً من تعديل قيمة resposnebody بشكل مباشر، عن طريق إضافة مؤشر من نمط boolean مثلاً للدلالة على أنه تم تحميل البيانات بشكل كامل من الخادم setState(() { _loaded = true; }); وعندها يمكنك التحكّم بعدم الوصول إلى جزء الكود الذي يعتمد على طول المصفوفة length في حال كانت قيمة هذا المتغيّر false. وإذا كنت تستخدم النسخ الأخيرة من dart ستتمكن من تجنب هذه الأخطاء من خلال خاصيات null safety. كما يجب عليك استخدام try و catch عند طلبات التعامل مع خادم الويب لتجنب الأخطاء التي قد تحدث عند عدم القدرة على جلب البيانات أو الاتصال بالخادم.
    1 نقطة
  28. يلعب التحريك Animation دورًا كبيرًا في رفع جاذبية تطبيقات ومواقع الويب للمستخدمين الذين أصبحوا يتوقعون دومًا الحصول على واجهات استخدام تفاعلية عالية التجاوب؛ إلا أن تحريك واجهات الاستخدام ليس أمرًا مباشرًا وسهلًا، حيث يستلزم تحديد ما يجب تحريكه وما تأثير هذا التحريك على انطباع وتجربة المستخدمين. يُستخدم التحريك لإضفاء الحياة على المشاريع. يجب أن يدعم التحريك تفاعل المستخدم. يجب الانتباه لتكلفة تحريك الخصائص والتي قد تختلف من خاصيةٍ لأخرى. أساسيات التحريك نعرض فيما يلي أهم القضايا الواجب الانتباه إليها عند التحريك: اختيار الخصائص المناسبة للتحريك يُضيف التحريك كثيرًا من المتعة للمستخدمين ويرفع من تفاعلهم مع المشروع؛ حيث يُمكن عمليًا تحريك أي شيء، مثل العرض والارتفاع والموضع والألوان والخلفيات؛ ولكن يجب الانتباه في نفس الوقت إلى تأثيرات التحريك على الأداء وانعكاساتها على هوية التطبيق، حيث يُمكن أن يؤثر التحريك المتقطع أو المُختار بصورةٍ سيئة على تردِّي تجربة الاستخدام مما يستلزم الانتباه جيدًا إلى حُسن اختيار التحريك المُناسب والفعّال. استخدام التحريك لدعم التفاعل يجب استخدام التحريك بصورةٍ مدروسة بهدف تعزيز تفاعل المستخدمين (وليس فقط لمجرد إمكانية التحريك)، وتجنبًا لمضايقتهم أو إعاقتهم. يُمكن مثلًا استخدام توهجٍ خفيف، أو حركة ارتدادٍ بسيطة لإعلام المستخدم بتلَقّي أفعاله، مثل النقر على أيقونة قائمة، أو السحب لفتح شريط تمرير، أو النقر على زر. يجب تجنُّب التحريك الذي يقطع أو يُعرقل نشاط المستخدم دون أي داعٍ. تجنب تحريك الخصائص المكلفة يُعدّ التحريك الذي يؤدي إلى تقطُّعاتٍ في الصفحة من أسوأ أنواع التحريك، والذي يُحبط المستخدمين ويُشعرهم بعدم الرضا لدرجة أنهم يتمنون بألّا يوجد أي تحريكٍ على الإطلاق. يُمكن أن تكون بعض الخصائص أكثر تكلفةً من غيرها عند تغييرها، كما يُمكن أن يؤدي هذا التغيير إلى ظهور التقطُّعات في الصفحة؛ حيث يُمكن مثلًا أن يتطلب تغيير ظل صندوق box-shadow لعنصرٍ ما عملية طلاء paint أكثر تكلفةً بكثير من تغيير لون نصه. وبالمثل، من المرجح أن يكون تغيير عرض width عنصر ما أكثر تكلفةً من تغيير تحويلاته transform. نعرض المزيد من الإرشادات حول أداء التحريك في الفقرة الأخيرة من هذه المقالة. يُمكن الالتزام فقط بالتحويلات transforms وتعديلات الشفافية opacity واستخدام "سوف يُعدّل" will-change في حال عدم الرغبة بقراءة المزيد والخوض في التفصيلات. يُمكن معرفة ماذا ينشُط تمامًا عند تحريك أي خاصية بالرجوع إلى مُشغّلات أنماط CSS. التحريك باستخدام أنماط CSS موازنة مع استخدام JavaScript يُمكن التحريك، إما باستخدام أنماط CSS، أو JavaScript؛ حيث يعتمد قرار الاختيار بين واحدٍ منهما على الارتباطات الأخرى للمشروع وعلى أنواع التأثيرات المطلوبة. يُستخدم تحريك CSS لتنفيذ الانتقالات البسيطة من النمط "لقطة واحدة one-shot"، مثل تبديل حالات عناصر الواجهة. يُستخدم تحريك JavaScript للحصول على تأثيراتٍ متقدمة، مثل الارتداد أو التوقف أو الإيقاف المؤقت أو الإرجاع أو الإبطاء. يُمكن استخدام واجهة برمجة التطبيقات للتحريك Web Animations API أو أي إطار عمل حديث مناسب عند اختيار التحريك باستخدام JavaScript. يُمكن إنشاء معظم عمليات التحريك الأساسية باستخدام CSS أو JavaScript، لكن يختلف الجهد والزمن اللازمين لإنشاء التحريك حسب الطريقة المختارة (راجع الفقرة الأخيرة من هذه المقالة)؛ حيث يوجد لكل طريقةٍ محاسنها ومساوئها، نعرض فيما يلي الإرشادات العامة: تُستخدم CSS عندما يكون لعناصر الواجهة حالات أقل محتواة ضمن نفس العنصر؛ حيث تكون الانتقالات والتحريك مثالية لجلب قائمة انتقال إلى جهةٍ معينة مثلًا أو إظهار تلميحٍ ما. يُمكن اللجوء إلى JavaScript للتحكم بالحالات إلا أن التحريك نفسه يكون في CSS. تُستخدم JavaScript عند الحاجة للتحكم الواسع في التحريك. تُعدّ واجهة برمجة التطبيقات Web Animations API المنهج المُعتمد على المعايير القياسية والمتاح حاليًا في معظم المتصفحات الحديثة، مما يوفر كائناتٍ حقيقية مثالية للتطبيقات المعقدة الموجهة بالكائنات. تُعدّ JavaScript مفيدةً أيضًا عند الحاجة إلى إيقاف التحريك، أو إيقافه مؤقتًا، أو إبطائه، أو عكسه. يُمكن استخدام إطار التحريك للطلب requestAnimationFrame مباشرًة عند الحاجة لتنسيق مشهدٍ كاملٍ يدويًا. يُعدّ ذلك منهجًا متقدمًا في JavaScript، إلا أنه يكون مفيدًا عند إنشاء لعبة أو الرسم على لوحة HTML canvas. بالمقابل، في حال استخدام إطار عمل JavaScript الذي يتضمن وظائف التحريك، مثل دالة التحريك ‎.animate() في jQuery، فقد يكون من الأنسب الالتزام بذلك في التحريك عمومًا. التحريك باستخدام CSS يُعدّ التحريك باستخدام CSS أبسط طرق تحريك شيءٍ ما على الشاشة، حيث يوصف هذا الأسلوب بأنه تصريحي لأنه يُحدّد ما المطلوب حدوثه. يُبين المثال التالي تحريك صندوقٍ باستخدام CSS بمقدار 100px في كلا المحورين X و Y، حيث ضُبط زمن الانتقال ليأخذ 500 ميلي ثانية (نصف ثانية). تتغير القيمة transform عند إضافة الصف move ويبدأ الانتقال. .box { transform: translate(0, 0); transition: transform 500ms; } .box.move { transform: translate(100px, 100px); } يُمكن تجريب المثال. يوجد إضافًة إلى مدة الانتقال خياراتٍ للتخفيف easing، والتي تُساهم في جعل التحريك يبدو طبيعيًا. يُمكن الرجوع إلى أساسيات التخفيف لمزيدٍ من التفاصيل. في حال إنشاء صفوفٍ مستقلة في CSS لإدارة التحريك كما هو الحال في المثال أعلاه، يُمكن استخدام JavaScript لتبديل حالة التحريك نعم/لا on/off. box.classList.add('move'); يوفِّر ذلك توازنًا جيدًا للتطبيقات؛ إذ يُمكن للمطور التركيز على إدارة الحالة باستخدام JavaScript، وتعيين الصفوف المناسبة للعناصر المستهدفة ببساطة، وترك المتصفح يتعامل مع التحريك. يُمكن في حال اعتماد هذا المنهج الاستماع إلى أحداث نهاية الانتقال transitionend للعنصر، وذلك في حال قبول التخلي عن دعم الإصدارات الأقدم من Internet Explorer، حيث كان الإصدار 10 هو الإصدار الأول لدعم هذه الأحداث. دعمت جميع المتصفحات الأخرى هذه الأحداث منذ فترة. تكون شيفرة JavaScript المطلوبة للاستماع إلى حدث انتهاء الانتقال كما يلي: var box = document.querySelector('.box'); box.addEventListener('transitionend', onTransitionEnd, false); function onTransitionEnd() { //معالجة إنهاء الانتقال } يُمكن استخدام التحريك في CSS إضافًة إلى استخدام الانتقالات للحصول على مزيدٍ من التحكم في الإطارات الرئيسية للتحريك الفردي والمُدّد الزمنية والتكرارات. ملاحظة: يُعدّ الإطار الرئيسي keyframe مصطلحًا قديمًا من مصطلحات الرسوم المتحركة المرسومة يدويًا. يُنشئ رسامو الرسوم المتحركة إطاراتٍ مُحدّدةً لجزءٍ من العمل، تُدعى الإطارات الرئيسية، والتي من شأنها أن تلتقط أشياءً مثل الجزء الأكثر تطرفًا في حركةٍ ما، ثم يشرعون في رسم جميع الإطارات الفردية بين الإطارات الرئيسية. يسلك التحريك في CSS سلوكًا مشابهًا؛ حيث يُعلَم المتصفح ببعض قيم خصائص CSS في نقاط مُحدّدة ويُطلب منه ملء القيم الناقصة. يُمكن مثلًا تحريك صندوق المثال السابق بنفس الطريقة مع انتقالات وبتكرارٍ لا نهائي، ولكن بدون أي تفاعلٍ للمستخدم مثل النقر. كما يُمكن تغيير عدة خصائص في نفس الوقت: .box { /* اختيار التحريك */ animation-name: movingBox; /* مدّة التحريك */ animation-duration: 1300ms; /* عدد مرات التحريك */ animation-iteration-count: infinite; /* تبديل اتجاه التحريك عند كل دورة فردية */ animation-direction: alternate; } @keyframes movingBox { 0% { transform: translate(0, 0); opacity: 0.3; } 25% { opacity: 0.9; } 50% { transform: translate(100px, 100px); opacity: 0.2; } 100% { transform: translate(30px, 30px); opacity: 0.8; } } يُمكن تجريب المثال. يُمكن تعريف التحريك نفسه بصورةٍ مستقلة عن العنصر الهدف، ويُمكن استخدام خاصية اسم التحريك animation-name لاختيار التحريك المطلوب. يجب إضافة بادئات البائع vendor prefixes إذا أردنا أن يعمل تحريك CSS على المتصفحات القديمة. ويُمكن للعديد من الأدوات أن تُساعد في إنشاء إصدارات CSS مع البادئة المطلوبة، مما يسمح للمطوّر بكتابة الإصدار دون البادئات في ملفات المصدر الخاصة به. التحريك باستخدام JavaScript وواجهة برمجة التطبيقات Web Animations API يُعدّ إنشاء التحريك باستخدام JavaScript أكثر تعقيدًا موازنًة مع كتابة الانتقالات أو التحريك في CSS، إلا أنه يوفر قوةً أكبر للمطورين. يُمكن استخدام واجهة برمجة التطبيقات Web Animations API إما لتحريك خصائص CSS معينة، أو لإنشاء كائناتٍ ذات تأثيرات مركبة. يكون استخدام JavaScript للتحريك حتميًا مع كتابة التعليمات سطريًا inline ضمن الشيفرة، كما يُمكن تغليفها داخل كائناتٍ أخرى. تُبيّن الشيفرة التالية كيفية إنشاء نفس تحريك CSS المُوضح في المثال السابق: var target = document.querySelector('.box'); var player = target.animate([ {transform: 'translate(0)'}, {transform: 'translate(100px, 100px)'} ], 500); player.addEventListener('finish', function() { target.style.transform = 'translate(100px, 100px)'; }); تنحصر المهمة الأساسية للتحريك باستخدام Web Animation في تعديل كيفية تقديم وعرض العنصر للمستخدم؛ أما في حال الرغبة ببقاء العنصر في المكان الذي انتقل إليه، فيجب تعديل أنماطه عند انتهاء التحريك كما في المثال السابق. تُعدّ واجهة برمجة التطبيقات Web Animations API معيارًا جديدًا نسبيًا من W3C، وهو مدعومٌ بصورةٍ أساسية في معظم المتصفحات الحديثة؛ أما بالنسبة للمتصفحات الحديثة غير الداعمة، فيُمكن استخدام المشروع من النوع "نقص الدعم" polyfill المُتاح على github؛ وهو مشروع JavaScript يوفر ميزات Web Animation. توفّر JavaScript للمطور تحكمًا كاملًا في أنماط العنصر عند أي خطوة؛ أي أنه يُمكن إبطاء التحريك أو إيقافه مؤقتًا أو توقيفه أو عكسه من خلال التعامل مع العناصر بصورةٍ مناسبة، ويكون هذا مفيدًا جدًا في بناء التطبيقات المعقدة كائنية التوجه؛ حيث يتمكن المطور من تغليف سلوك التحريك بصورةٍ مناسبة. التحريك والأداء يجب الحفاظ على 60 إطارًا في الثانية عند التحريك دومًا؛ حيث تؤدي أي قيمةٍ أقل من ذلك إلى ظهور التقطيع، أو توقُّف التحريك واللذان يكونان واضحين للمستخدمين مما يؤدي إلى تردّي تجربة الاستخدام. يجب الحرص على ألّا يُسبب التحريك أية مشاكل في الأداء؛ حيث يجب معرفة تأثير أي خاصية في أنماط CSS على الأداء. يجب الانتباه إلى أن جميع الخصائص التي تُغيُّر في هندسة الصفحة (التخطيط) أو تتسب في الطلاء تكون مُكلفةً على نحوٍ خاص. يجب الالتزام بتعديل التحويلات والشفافية ما أمكن ذلك. يُمكن استخدام سوف يُعدّل will-change للتأكد من معرفة المتصفح ما يُخطط لتحريكه. لا يكون تحريك الخصائص مجاني، كما أن تحريك بعض الخصائص أقل كلفةً من غيرها؛ حيث يُعدّل مثلًا تحريك العرض width والارتفاع height لعنصرٍ من هندسته، ويُمكن أن يؤدي ذلك إلى تحريك أو تغيير حجوم عناصرٍ أخرى على الصفحة. تُدعى هذه العملية بالتخطيط أو إعادة التدفق في بعض المتصفحات مثل Firefox المعتمدة على محرك المتصفحات Gecko؛ وهي عمليةٌ مكلفةٌ لاسيما إذا احتوت الصفحة على عناصر كثيرة. كلما يُشغّل التخطيط تحتاج الصفحة أو جزءٌ منها إلى إعادة الطلاء والذي يكون أكثر كلفًة من عملية التخطيط نفسها. يجب تجنُّب تحريك الخصائص التي تؤدي إلى تنشيط التخطيط أو الطلاء ما أمكن ذلك؛ وهذا يعني قصر التحريك على الشفافية opacity أو التحويلات transform بالنسبة لمعظم المتصفحات الحديثة، واللتان يتمكن المتصفح من تحسينها بدرجة عالية. لا يُشكّل التعامل مع التحريك باستخدام JavaScript أو CSS فرقًا بالنسبة للأداء. يُمكن الرجوع إلى CSS Triggers للحصول على قائمةٍ كاملة لما يُنشّط تشغيله عند استخدام خصائص CSS الفردية، كما يُمكن الرجوع للمرجع الكامل لإنشاء تحريك عالي الأداء في عناصر HTML5. استخدام خاصية will-change تُعلّم الخاصية will-change المتصفح بالنية في تعديل خاصية عنصر، مما يسمح للمتصفح بوضع التحسينات الأكثر ملاءمةً في مكانها قبل إجراء التعديل. ومع ذلك، لا يجب الإفراط في استخدام الخاصية will-change؛ لأن ذلك يؤدي إلى إضاعة الموارد ومزيدًا من مشاكل الأداء. تنص أحد القواعد التجريبية الأساسية على أنه إذا كان تنشيط التحريك سيبدأ خلال 200 ميلي ثانية القادمة، إما عن طريق تفاعل المستخدم أو بسبب حالة التطبيق، فإن وضع will-change يُعدّ فكرةً جيدة. يجب تمكين will-change في معظم الحالات لكل خاصيةٍ يُخطط لتحريكها لاحقًا. فعلى سبيل المثال، ستكون إضافة will-change للتحويلات والشفافية في أمثلتنا السابقة على النحو التالي: .box { will-change: transform, opacity; } ستُجري المتصفحات التي تدعم هذه الخاصية (حاليًا معظم المتصفحات الحديثة) التحسينات المناسبة في الخلفية لدعم تعديل هذه الخصائص أو تحريكها. أداء CSS موازنة مع أداء JavaScript يوجد العديد من الصفحات والتعليقات في عالم الويب التي تناقش المزايا النسبية للتحريك باستخدام CSS و JavaScript من منظور الأداء. فيما يلي بعض النقاط التي يجب الانتباه لها: يُدعَم التحريك المعتمد على أنماط CSS و Web Animations بصورةٍ أساسية ويُعالج ضمن خيطٍ thread منفصل يُعرف باسم "الخيط المُركَّب compositor thread"؛ والذي يختلف عن "الخيط الرئيسي main thread" للمتصفح، الذي يُنفذّ التصميم والتخطيط والطلاء وسكريبت جافا؛ مما يعني أنه إذا شغَّل المتصفح بعض المهام المكلفة على الخيط الرئيسي، يبقى التحريك مستمرًا دون أي مقاطعة. يُمكن في كثيرٍ من الحالات معالجة التعديلات الأخرى على التحويلات والشفافية باستخدام الخيط المُركّب. إذا أدى أي تحريكٍ إلى تشغيل الطلاء أو التخطيط أو كليهما، فسيُعهد إلى "الخيط الرئيسي" مهمة تنفيذ العمل وذلك في حالة التحريك المُستند إلى CSS أو JavaScript. يُمكن أن يؤدي الحمل الزائد للتخطيط أو الطلاء إلى بطء أي عملٍ مرتبطٍ بتنفيذ CSS أو JavaScript، مما يجعل المسألة موضع نقاش. يُمكن العودة إلى CSS Triggers لمزيدٍ من المعلومات حول العمل المُنّشط عند تحريك خاصيةٍ ما. ترجمة -وبتصرف- للمقالات التالية: Animations للمؤلف: Paul Lewis. CSS Versus JavaScript Animations للمؤلفين: Paul Lewis و Sam Thorogood. Animations and Performance للمؤلفين: Paul Lewis و Sam Thorogood. اقرأ أيضًا أيّهما أفضل للتحريك Animations؟ جافاسكربت أم CSS؟ خاصيات الحركات الحركات المتعددة المتزامنة الانتقالات وجافاسكربت
    1 نقطة
  29. السلام عليكم ورحمة الله وبركاته ممكن احد يفيدني في هدا الموضوع يكون احسن اريد تجميعية pc وفي الاخر اشكركم على ردودكم سلفاً والسلام.
    1 نقطة
  30. ما يهم في مواصفات الجهاز الذي ستستخدمه للتصميم هو كرت الشاشة والرامات اختر معالج من فئة i5 / i7 من الجيل السابع وما فوق رامات لا تقل عن 8 جيجا كرت شاشة قوي لا يقل عن gtx 1050ti ولزيادة سرعة الرندرة والتعديل ببرامج التصميم أنصح بشراء هارد ssd من نوع nVMe M2 بذاكرة 256 وما فوق وتنصيب كل برامج التصميم عليها ، هذا الأمر وحده سيسرع من معالجة الصور والتصميم بمقدار 6 أضعاف !!
    1 نقطة
  31. بالنسبة للبرمجة فأغلب الحواسيب المتاحة حاليًا تفي بالغرض، وذلك لأن متطلبات البرمجة ليست كبيرة، ويمكن لحسوب من 10 سنوات أن يستخدم في أغلب أنواع البرمجة بدون مشاكل. أما بالنسبة إلى برامج التصميم والجرافيك، فالأمر مختلف قليلًا ومتفاوتة أيضًا، فعلى حسب البرامج المستعملة سيختلف الحد الأدنى من المتطلبات، ولكن يمكن أن نتفق على أن المواصفات التالية تفي بالغرض لأغلب برامج التصميم مثل Adobe Photoshop و Illustrator أو Cinema 4D .. إلخ: وحدة المعالجة المركزية CPU: يفضل أن تكون من نوع inter core i3 - i5 - i7 الجيل العاشر أو أعلى، أو AMD Rayzen 3600 وما فوق. ذاكرة الوصول العشوائي RAM: على الأقل 8 جيجابايت بسرعة 2600 MHz تخزين من نوع SSD: بمساحة 256 جيجابايت على الأقل. بعض أنواع المعالجات تحتوي على بطاقة رسوميات مثل معالجات AMD وبعض معالجات intel وحينها لن تحتاج إلى شراء بطاقة رسوميات عالية، وعلى الجانب الأخر توجد معالجات لا تحتوي على بطاقة رسوميات مثل معالجات intel من سلالة f (مثل intel i5 9400f (لاحظ يتنهي رقم المعالج بحرف f) )، أنصحك ببطاقة Nvidia GeForce GTX 1080 أو أعلى. بالمواصفات السابقة يمكنك العمل على البرامج التالية بسلاسة وبدون مشاكل: كل منتجات Adobe مثل Photoshop و After Effect منتجات AutoDesk مثل AutoCAD و Maya و 3Ds Max و Rivet المحررات البرمجية مثل VS Code و Android Studio برامج أنظمة التشغيل الإفتراضية مثل virtualbox و GenyMotion
    1 نقطة
  32. المواصفات: وحدة المعالجة المركزية : Intel Core i5 – i7 من الجيل العاشر. بطاقة رسومات Intel Iris Plus – Nvidia GeForce GTX 1650 Ti. ذاكرة الوصول العشوائي: 8 جيجابايت – 64 جيجابايت. الشاشة: 15.6 بوصة FHD + (1920 × 1200) IPS – UHD + (3840 × 2400). التخزين: 256 جيجا بايت – 1 تيرا بايت SSD.
    1 نقطة
  33. لاحظت وجود عداد نقاط يسمى السُّمعة بالموقع من يمكنه شرح ذلك لي وما هي أهمية النقاط في الاكادمية
    1 نقطة
×
×
  • أضف...