سامح أشرف
-
المساهمات
2934 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
56
إجابات الأسئلة
-
إجابة سامح أشرف سؤال في خطأ Cannot read properties of undefined في لغة جافا سكريبت JavaScript كانت الإجابة المقبولة
الخطأ بسبب إستدعاء الدالة btnAction في نهاية الكود، حيث لم تقم بتمرير أي حدث إليها وبالتالي فإن المعامل e غير معرف undefined، وبالتالي يحدث خطأ عند محاولة الوصول إلى الخاصية target ضمن المعامل e
كل ما عليك لحل المشكلة أن تقوم بحذف آخر إستدعاء للدالة btnAction من الكود:
const btns = document.querySelectorAll("button") btns.forEach(btn =>{ btn.addEventListener('click', btnAction) }) function btnAction(e) { let description = e.target.getAttribute("data-cookie") console.log(description); } // هذا السطر هو سبب المشكلة // btnAction()
-
إجابة سامح أشرف سؤال في كيفية توليد ملفات model و requests عند عمل متحكم جديد بشكل تلقائي في لارافيل Laravel؟ كانت الإجابة المقبولة
يمكنك إضافة المعامل resource إلى الأمر make:controller ليتم كتابة كل التوابع الأساسية مثل index و show و store .. إلخ بشكل تلقائي في المتحكم controller:
php artisan make:controller PhotoController --resource كما تستطيع إضافة المعامل model لربط نموذج معين (أو إنشائه في حالة عدم وجوده) مباشرة:
php artisan make:controller PhotoController --model=Photo --resource ويمكن إضافة المعامل requests كذلك لعمل ملف requests تلقائيًا
php artisan make:controller PhotoController --model=Photo --resource --requests بهذا الشكل سوف يتم عمل كل هذه الملف وسيتم تجهيز محتواها الأساسي بشكل تلقائي.
تم شرح كل هذه الأمور وغيرها بشكل مفصل في موسوعة حسوب في هذه الصفحة (وحدات التحكّم (Controllers) في Laravel).
-
إجابة سامح أشرف سؤال في مشكلة حلقة while تتوقف مبكرًا في PHP كانت الإجابة المقبولة
المشكلة لديك هي تحديد قيمة صغيرة للغاية للمتغير successRateحيث أن القيمة 0.5 ستكون أصغر من أي قيمة للمتغير random_rate (ماعدا القيمة 0 بالطبع)، لذلك عليك أن تقوم بتغير قيمة المتغير successRate لتكون قيمة أكبر مثل 50 على سبيل المثال:
أيضًا عليك أن تقوم بنقل جملة طباعة الجملة Congrats for خارج جملة if لكي يتم طباعة الجملة في كل دورة وليس في آخر دورة فقط، بالشكل التالي:
<?php function successfulCompaines($names_array, $rate) { $new_names = []; $index = null; $min = null; foreach ($names_array as $i => $name) { $random_rate = rand(0, 100); if ($min == null) { $index = 0; $min = $random_rate; } if ($random_rate <= $rate) { array_push($new_names, $name); } if ($random_rate < $min) { $index = $i; $min = $random_rate; } } return count($new_names) == 0 ? [$names_array[$index]] : $new_names; } $compaines = array("Lenovo", "Huawei", "Apple", "Amazon", "Microsoft", "Abb", "Netflex", "Siemens", "Samsung", "Adidas", "Uber", "Dell", "Hp", "Walmart", "Tesla", "Google", "Volvo", "Toyota", "Ibm", "Shell"); // نرفع قيمة المتغير التالي $successRate = 50; while (true) { $compaines = successfulCompaines($compaines, $successRate); // ننقل جملة الطباعة إلى هنا echo 'Congrats for ' . $compaines[0]; echo "<br>"; if (count($compaines) == 1) { break; } $successRate /= 2; }
-
إجابة سامح أشرف سؤال في المعامل == يرجع True عند مقارنة نصين مختلفين في PHP؟ كانت الإجابة المقبولة
لا يجب أن تستخدم المعامل == عند المقارنة في PHP خصوصًا عند مقارنة النصوص حيث ستحصل على نتيجة مختلفة عما تتوقعه، فعلى سبيل المثال كل العمليات التالية سوف تُعيد True:
<?php echo "hi" == 0; // True echo 1 == '1'; // True echo '80000' == '8e4'; // True وذلك لأن PHP تقوم بتحويل أنواع القيم، ومن الأفضل إستخدام المعامل === بدلًا من == عند المقارنة بين قيمتين:
<?php echo "hi" === 0; // False echo 1 === '1'; // False echo '80000' === '8e4'; // False
-
إجابة سامح أشرف سؤال في كيفية الحصول على Query من عنوان URL في PHP؟ كانت الإجابة المقبولة
إن كان لديك عنوان URL مُخزن في متغير، فيمكنك تحليله وإستخراج query منه من خلال الدالة parse_url و parse_str بالشكل التالي:
<?php $url = "https://www.example.com/search.php?q=myquery&abc=123"; // نستخرج الـ query من العنوان $query = parse_url($url, PHP_URL_QUERY); // q=myquery&abc=123 // نقوم بتحويل النص السابق إلى مصفوفة ترابطية key-value $queries = array(); parse_str($query, $queries); // يمكن إستخدام المصفوفة أو أحد المفاتيح منها بالشكل التالي echo $queries['abc']; // 123 echo $queries['q']; // myquery ملاحظة: بدءًا من الإصدار PHP 7.2 لا يُفضل استخدام الدالة parse_str() بدون المعامل الثاني لها، لأنها ستقوم في هذه الحالة بتحويل المفاتيح keys إلى متغيرات (q$ و abc$) ، وقد يقوم بعض المخترقين Hackers بإستغلال هذا الأمر في صالحهم ومحاولة إختراق الموقع.
يمكنك الإطلاع على هذه المقالة لمزيد من المعلومات عن كلا الدالتين:
أو من خلال موسوعة حسوب: الدالة parse_str() في PHP
-
إجابة سامح أشرف سؤال في كيفية تحديد كل الصفوف ما عدا بعضها في php mysql؟ كانت الإجابة المقبولة
نعم يمكنك عمل ذلك من خلال إستعمال SQL التالي:
SELECT * FROM `countries` WHERE name != "saudi arabia"; بهذا الشكل سوف يتم تحديد كل الدول ما عدا السعودية.
وإذا كنت تريد تحديد كل الدول ما عدا السعودية ومصر على سبيل المثال فيمكنك أن تستخدم المعامل NOT IN:
SELECT * FROM `countries` WHERE name NOT IN ("saudi arabia", "egypt"); بالتأكيد يمكنك أن تقوم بإضافة قدر ما تشاء من دول إلى الإستعلام السابق، وسوف يتم تحديد باقي الدول فقط.
-
إجابة سامح أشرف سؤال في هل يوجد لديكم معلم خاص للتسويق؟ كانت الإجابة المقبولة
وعليكم السلام ورحمة الله وبركاته
أكاديمية حسوب توفر فقط دورات متخصصة في تطوير المواقع وتطبيقات الجوال، وللآسف لا توفر دورات خاصة بالتسويق في الوقت الحالي، لكن يمكنك الإطلاع على قسم التسويق والمبيعات في الأكاديمية، حيث ستجد المئات من المقالات المفيدة والمتخصصة في كل ما يتعلق بالتسويق بشكل عام، وستجد فيها العديد من النصائح والإرشادات المفيدة.
إن أردت الحصول على مُعلم خاص ليعلمك التسويق ومبادئه، فيمكنك إضافة عرض في مواقع العمل الحر مثل مستقل، وستتوصل بعدد من العروض من أشخاص ذوي خبرة في هذا المجال.
-
إجابة سامح أشرف سؤال في مشكلة Build failed with an exception عند بناء تطبيق flutter كانت الإجابة المقبولة
قد يكون السبب أنك تعمل في مجلد مسمى بأحرف عربية (المجلد "السيرة النبوية")، حاول إعادة تسمية المجلد بأحرف أنجليزية وأعد المحاول، وقم بإعادة تشغيل سطر الأوامر CMD كذلك.
من الجيد أيضًا ألا تضع مسافات في أسماء المجلدات ، لكي لا تحدث مشكلة.
-
إجابة سامح أشرف سؤال في كيفية اضافة مسافة بعد الرقم الدولي في اضافة intl tel input كانت الإجابة المقبولة
لا تدعم الإضافة نفسها هذه الإمكانية، ولكن يمكنك أن تقوم بتعديل الرقم بعد الحصول عليه بالشكل التالي:
$(document).on("click", ".button", function () { const phoneNumber = phone_number.getNumber(); const countryDialCode = phone_number.getSelectedCountryData()['dialCode']; console.log(`+${countryDialCode} ${phoneNumber.slice(countryDialCode.length + 1)}`); }); وسوف تكون النتيجة بالشكل التالي:
"+20 100123456"
-
إجابة سامح أشرف سؤال في كيف نقبل رسالة من المستخدم ونقوم بحفظها في ملف بإستخدام بايثون؟ كانت الإجابة المقبولة
يمكنك أن تقوم بإستخدام الدالة input للحصول على النص من المستخدم بالشكل التالي:
name = input("what's your name?\n") لاحظ أننا نقوم بتخزين ما يقوم المستخدم بكتابته في المتغير name، فعلى سبيل المثال إن قام المستخدم بكتابة "hello" ، فسوف يتم تخزين هذه الكلمة في المتغير name:
والآن نقوم بفتح ملف بإستخدام الدالة open بالشكل التالي:
f = open('names.txt', 'w') # ^^^^^^^^^^ اسم الملف هنا وحرف w يشير إلى أننا سنقوم بالكتابة في الملف write، ونستخدم التابع write للكتابة في الملف على النحو التالي:
f = open('names.txt', 'w') f.write(name) # نكتب قيمة المتغير name في الملف f.close() # نغلق الملف في النهاية بهذا الشكل ستجد ملف جديد تم إنشائه باسم names.txt ويحتوي على ما قام المستخدم بإدخاله -كلمة hello في المثال السابق-
يمكنك الإطلاع على المقالات التالية لمزيد من المعلومات حول إستخدام الملفات في بايثون:
تستطيع أيضًا الإطلاع على موسوعة حسوب لقراءة توثيق هذه الدوال (قراءة الملفات والكتابة فيها في بايثون)
-
إجابة سامح أشرف سؤال في لماذا نكتب __name__ في الصنف Flask عند نقوم بعمل مشروع فلاسك Flask؟ كانت الإجابة المقبولة
__name__ عبارة عن طريقة للحصول على اسم الاستيراد للمكان الذي تم تحديد التطبيق فيه. فعلى سبيل المثال إن كان لدينا ملفين app.py و settings.py، ويحتويان على الأكواد التالية:
الملف app.py import settings print('app.py') print('__name__ in app.py:', __name__)
الملف settings.py print('settings.py') print('__name__ in settings.py:', __name__)
كما تلاحظ من الاكواد السابقة فإن الملف app.py يقوم بإستدعاء الملف settings.py، وكلًا من الملفين يطبعان قيمة __name__ ، وسنحصل على النتيجة التالية عند تشغيل الملف app.py:
settings.py __name__ in settings.py: settings app.py __name__ in app.py: __main__ من الواضح من النتيجة السابقة أن __name__ في الملف settings.py تشير إلى اسم الملف "settings"، بينما في الملف app.py فهي __main__ أي أن هذا الملف هو الملف الرئيسي الذي تم تشغيله من سطر الأوامر. بهذه الطريقة فإن فلاسك Flask يستخدم اسم الاستيراد (الموجود في __name__) لمعرفة مكان البحث عن القوالب templates والملفات الثابتة static files .. إلخ.
عند استخدام حزمة package، إذا حددت تطبيقك في الملف __init__، فسيظل __name__ يشير إلى المكان "الصحيح" إلى حيث توجد الموارد. ومع ذلك ، إذا قمت بتعريف فلاسك Flask في ملف مختلف، مثل mypackage/app.py وأستدعيت هذا الملف الأخير من مكان آخر خارج الحزمة مثل main.py، فإن استخدام __name__ سيخبر فلاسك Flask بالبحث عن الموارد المتعلقة بـ mypackage.app بدلاً من mypackage، أي أنه يشير إلى المكان الصحيح إلى الموارد resources (القوالب templates والملفات الثابتة static files .. إلخ)
استخدام __name__ مجرد اختصار لاستخدام اسم الحزمة. وليس هناك سبب للقول إن الاسم يجب أن يكون اسم الحزمة الأساسية، فالأمر متروك تمامًا لهيكل مشروعك، وإن كان تطبيقك بسيط للغاية (مجموعة من الملفات البسيطة بدون الإعتماد على الحزم) فيمكنك كتابة أي شيء بدلًا من __name__ أو حتى عدم كتابة أي شيء
from flask import Flask app = Flask("") # مجرد نص فارغ @app.route('/') def index(): return "Hello, World!" app.run(debug=True)
-
إجابة سامح أشرف سؤال في ما الفرق بين إستخدام WordPress بدون كود ودورة البرمجة بلغة PHP؟ كانت الإجابة المقبولة
ووردبريس WordPress عبارة عن نظام إدارة محتوى Content Management System، أي أنه يستخدم لإدارة المحتوى في الموقع بغض النظر عن ماهية المحتوى (مقالات، منتجات، صور .. إلخ)، ويوفر ووردبريس الكثير من القوالب templates والاضافات plugins التي تمكنك من تغير سلوك الموقع أو تغير شكله أو إضافة المزيد من المميزات.
من ضمن هذه الإضافات والمميزات الموجودة في ووردبريس، إضافات تسمح لك ببناء صفحات في الموقع (أو تغير شكل الموقع بالكامل) مثل elementor على سبيل المثال، ولكن هذه الإضافات أو هذه الطريقة بشكل عام (بناء المواقع بدون كود) محدودة للغاية وأن تمكنك من إنشاء موقع به مميزات محددة أو إستثنائية وستلجأ في النهاية إلى مبرمج للقيام به الأمور المخصصة customized، لذلك فإن تعلم كتابة كود الموقع بالكامل يسمح لك بتخصيص الموقع بشكل غير محدود حيث سيكون بإمكانك القيام بأي شيء تريده ومن الصفر.
هذا وستتعلم أيضًا كيفية حل المشاكل البرمجية، فعلى سبيل المثال إن كنت تستعمل أحد الإضافات في موقع ووردبريس ولكن وجدت أن الإضافة لا تعمل بسبب خطأ برمجي، فلن تتمكن من حل المشكلة إلا إذا كان لديك معرفة بلغة php (اللغة المستعملة في إنشاء ووردبريس وقوالبه وإضافاته)، وستبحث عن مبرمج لحل هذه المشكلة أيضًا.
أيضًا دورة تطوير تطبيقات الويب باستخدام لغة PHP الموجودة في أكاديمية حسوب تعلمك إستخدام إطار العمل Laravel وهو أشهر إطار عمل للغة PHP والذي يسمح لك بإنشاء أي موقع تريده بدون الاعتماد على نظام إدارة محتوى. مثل ووردبريس، في الواقع يمكنك أن تبني نظام مشابه لووردبربس نفسه باستخدام إطار العمل Laravel.
-
إجابة سامح أشرف سؤال في ما الذي تقدمه شهادة النانو ديجري Nanodegree؟ كانت الإجابة المقبولة
في البداية، كلمة Nanodegree عبارة عن مصطلح تسويقي تطلقه Udacity على دوراتها كوسيلة تسويقية ليس إلا، ولكن في الحقيقة هذا المصطلح ليس له علاقة بالشهادات العلمية على الإطلاق. ودورات Udacity هذه عبارة عن دورات متخصصة في مجالات معينة، فعلى سبيل المثال تجد دورة متخصصة في أساسيات الواجهة الخلفية Backend، ويتم شرح الأساس الذي تعمل به أغلب تقنيات الواجهات الخلفية، ولدى تجربة طويلة في شهادات Nanodegree، حيث أني قُمت بتجربة العديد من دورات Udacity وحصلت على ثلاث شهادات Nanodegree جميعها في مجال الويب (Backend و Frontend)، ومن خلاصة تجربتي وجدت أن:
المحتوى مقسم إلى فصول وكل فصل عبارة عن مجموعة من المقالات والفيديوهات القصيرة. يغلب طابع المقالات والشرح النصي على محتوى الدورة، حيث تجد أن إجمالي طول الفيديوهات (في أحد الفصول) حوالي 30 دقيقة تقريبًا بينما عدد المقالات أكبر بكثير ويستغرق قرائتها حوالي ساعة أو أكثير. تحتوي بعض الدروس على بعض التمارين الأساسية للغاية، كلها إختيارية وتقتصر على إعادة تنفيذ ما تم ذكره في الدرس لذلك وجدت أنها بدون فائدة في أغلب الأحيان. تتخرج من الدورة عندما تقوم بإتمام رفع المشاريع المطلوبة، وتحتوي الشهادة على 3-4 مشاريع (بسيطة ومتوسطة) يظل محتوى الدورة متاح لك لمدة عام واحد فقط، وبعد ذلك تختفي الدورة من حسابك ولا تستطيع الوصول إلى المحتوى مرة أخرى. بالطبع هذه المميزات أفضل من مشاهدة قائمة فيديوهات على اليوتيوب بدون التطبيق أو القيام بأي مشاريع أو وجود دعم فني على الإطلاق، ولكن إن كنت جادًا في الحصول على شهادة متخصصة في أحد مجالات البرمجة وتريد العمل بهذه الشهادة فأنصحك بأحد دورات أكاديمية حسوب، حيث أنها تحتوي على كل المميزات الموجودة في شهادات Nanodegree من Udacity وأكثر، فعلى سبيل المثال لا الحصر تتميز هذه الدورات بـ :
وصول مدى الحياة إلى الدورات، فإذا إشتركت في أحد الدورات فسوف يكون لديك وصول كامل طوال العمر إلى محتوى الدورة (يشمل ذلك التحديثات التي تتم على الدورة)، وبالتالي سوف تبقى على إطلاع بأحدث التقنيات المستخدمه في المجال. يمكنك أن تحدد الوقت الذي ترغب في التعلم فيه، فبما أن الدورة متاحة لك مدى الحياة فيمكنك أن تتعلم محتوى الدورة في أي وقت تشاء، ولست محددًا بوقت معين لتنهي الدورة، بينما شهاداة Nanodegree لها وقت معين لتقوم بإنهاء الدورة وإذا لم تنتهي منها في الوقت المناسب فسوف يتم إستبعادك منها ولن تتمكن من الحصول على الشهادة. محتوى عملي كامل على شكل فيديوهات، كل محتوى دورات حسوب عبارة عن فيديوهات عالية الجودة، يتم تحديثها كل فترة. دعم فني سريع ومساعدة لحل كل المشاكل التي تواجهك أثناء التعلم، تتميز أكاديمية حسوب بعدد كبير من المدربين الذي يساعدون الطلاب بشكل مباشر خلال وقت قليل جدًا من وقت طرح السؤال، حيث يتم الإجابة على أي سؤال خلال 15 دقيقة فقط من وقت طرح السؤال. شرح كامل باللغة العربية الفصحى، قد تكون اللغة عائق لدى بعض الأشخاص الذي يرغبون في التعلم، فعلى عكس دورات Udacity الإنجليزية، فإن كل محتوى أكاديمية حسوب (الدورات والمقالات والأسئلة .. إلخ) يكون باللغة العربية الفصحى. يتم إصدار جميع الشهادات من أكاديمية حسوب فقط بعد اجتياز الامتحان بنجاح. هذه ليست مجرد "شهادات حضور"، ولا يمكن الحصول عليها من خلال الالتحاق بالدورة فقط، ولكن يجب على الطالب عملياً التقديم أثناء الدورة وإجراء المقابلة وإثبات قدراته.
وبوجود أكثر من 5000 مقالة تُعد أكاديمية حسوب أكبر مصدر تقني عربي على الإطلاق، ستجد هنا مئات المقالات التقنية في كل المجالات البرمجية والتصميم والعمل الحر ورياد الأعمال. يتم إضافة مقالات بشكل يومي وفي مختلف المجالات، لذلك ستجد محتوى جديد يومًا بعد آخر.
تستطيع أيضًا الإطلاع على موسوعة حسوب أكبر موسوعة تقنية في العالم العربي، والتي تُعد مرجع شامل في العديد من التقنيات البرمجية.
-
إجابة سامح أشرف سؤال في خطأ cross-origin resource needs a 'crossorigin' attribute to be eligible for integrity validation في VS Code كانت الإجابة المقبولة
هذا ليس خطأ error بل تحذير warning من برنامج VS Code لكي تقوم بإضافة الخاصية crossorigin إلى العنصر link بالشكل التالي:
<link rel="stylesheet" href="..." crossorigin="anonymous"> وقد تم شرح هذه الخاصية وكيفية إستخدامها في هذه المقالة (قسم سياسة تعدد المصادر Crossorigin policy):
يمكنك تجاهل مصل هذه التحذيرات وسيعمل الموقع بدون مشكلة، ولكن البحث عن معناها وكيفية إصلاحها سوف يزيد من معلوماتك.
-
إجابة سامح أشرف سؤال في هل قاعدة بيانات لموقع ويب تختلف عن قواعد بيانات لتطبيقات الجوال؟ كانت الإجابة المقبولة
قواعد البيانات هي مجرد وسيلة لتخزين البيانات في شكل منظم، يمكنك لملف نصي بسيط أن يكون عبارة عن قاعدة بيانات، أو ربما تستخدم قاعدة بيانات لها إمكانيات أكثر مثل MySQL أ, Postgres أو غيرها، ولكن في النهاية ستجد أن البنية واحدة وأن البيانات يتم تخزينها بشكل منظم في قاعدة البيانات، ويمكن ببساطة أن تستخدم قاعدة البيانات لعمل موقع كامل، وتستخدم نفس قاعدة البيانات لتطبيق هاتف للموقع بدون مشكلة.
ويمكنك أن تستعمل نفس التقنيات في المواقع والتطبيقات كذلك، ولكن بالنسبة لتطبيقات الهواتف هناك نوعين أساسين من قواعد البيانات:
قواعد بيانات محلية Local Database: وفيها يتم تخزين قاعدة البيانات بالكامل على جهاز العميل، لحفظ بعض البيانات مثل إعدادات التطبيق أو لكي يعمل التطبيق بدون إنترنت .. إلخ. قواعد بيانات عامة Global Database: وهي عندما تقوم بإنشاء قاعدة بيانات وتضعها على خادم Server ليتمكن كل المستخدمين من الوصول إليها (عبر التطبيق أو الموقع أو حتى برنامج لسطح المكتب) والحصول على البيانات منها. لذلك يمكنك أن تقوم بعمل قاعدة بيانات واحدة لأكثر من إستخدام بدون مشكلة.
يمكنك الإطلاع على هذه المقارنة بين أشهر أنواع قواعد البيانات:
وهنا شرح لقواعد بيانات SQLite (غالبًا ما تستعمل كقاعدة بيانات محلية):
كل قواعد البيانات السابقة عبارة عن قواعد منظمة Structured وتستعمل لغة SQL لتنفيذ التعليمات، ويوجد نوع آخر من قواعد البيانات وهو NoSQL، هنا مقالة تتحدث عن الفرق بينهما:
-
إجابة سامح أشرف سؤال في خطأ h1 not defined في كود جافاسكريبت كانت الإجابة المقبولة
يمكنك أن تقوم بهذا الأمر من خلا عمل متغير عام 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"; // تغير لونه
-
إجابة سامح أشرف سؤال في هل سيؤدى نظام فوشيا الذي تطوره جوجل إلى القضاء على مستقبل ريأكت ناتيف ؟ كانت الإجابة المقبولة
لا يمكن تخمين ما إذا كانت تقنية معينة أو لغة برمجة معينة أو غيرها سوف يتم إلغائها أو القضاء عليها، وذلك بسبب وجود الآلاف من المبرمجين الذين يستعملون تقنيات مثل React Native أو غيرها. باللإضافة إلى أن نظام فوشيا سوف يدعم تطبيقات أندرويد -حسب موقع 9to5google- ، وبالتالي ليس من المهم التقنية المستخدمة في إنشاء التطبيق طالما سيكون التطبيق النهائي يعمل على الأندرويد ففي الغالب سيعمل أيضًا على نظام Fuchsia
منذ عدة سنوات ظهرت شائعات بأن لغة PHP ستموت ولن يستخدمها أحد (مازال بعض الأشخاص يعتقدون ذلك) ولكن بعد مرور سنوات منذ أن ظهرت هذه الشائعات ومازالت لغة PHP لها نصيب الأسد في لغات برمجة الواجهات الخليفة Backend وصدر إصدار جديد لها (الإصدار 8) منذ أشهر قليلة، وهذا يعني أن اللغة مازالت تتطور وأن هناك الكثير من المبرمجين مازالوا يستخدمن هذه اللغة، وبالمثل لا يمكن لأحد أن يقوم بأن هناك تقنية سوف تقضي على تقنية أخرى، وذلك لأن كل تقنية يكون لها إستخدام مختلف أو هدف مختلف وفريد، وإلا لماذا لا يتم تطوير التقنية القديمة في المقام الأول بدل تطوير تقنية مختلفة من الأساس وإعادة إختراع العجلة من جديد، حيث أن كل هذه التقنيات مفتوحة المصدر ويمكن أن لأي أحد أن يساعد في تطويرها بسهولة.
كما يتم أيضًا مقارنة التقنيات بنفس الطريقة، وستجد هنا العديد من الأسئلة المشابهة للمقارنة بين التقنيات:
هنا أسئلة للمقارنة بين Flutter وReact Native وبالتأكيد يمكنك أتستعمل أيًا منهما بدون مشكلة. فكما ذكرت سابقًا أنه لا يمكن أن نقارن بين التقنيات لأن كل تقنية لها إستخدامها، لكن يوجد تقنية مفيدة في حالة معينة أكثر من غيرها، فعلى سبيل المثال إن كنت على دراية بتقنتيات الويب (HTMl و CSS و javaScript ..إلخ) فسيكون إستخدام React Native أسهل لأنك لن تضر إلى تعلم لغة برمجة جديدة أو إطار عمل جديد من الصفر.
-
إجابة سامح أشرف سؤال في إستخدام الدالة get_object_or_404 مع select_related في جانغو Django؟ كانت الإجابة المقبولة
يمكنك أن تقوم بإستخدام الدالة 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)
-
إجابة سامح أشرف سؤال في مشكلة في ترتيب مجموعة من المنتجات حسب السعر في جافاسكريبت JavaScript كانت الإجابة المقبولة
يوجد خطأين في الكود، الخطأ الأول هو عملية تحويل السعر إلى رقم وإضافة الرقم إلى الخاصية 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); }); بهذا الشكل سوف يتم ترتيب العناصر بشكل سليم حسب السعر.
-
إجابة سامح أشرف سؤال في كيفية جعل الحرف الأول كبيرًا في نص داخل قالب جانغو Django template؟ كانت الإجابة المقبولة
يمكنك القيام بهذا الأمر من خلال المُرَشِح filter الذي يسمى title بالشكل التالي:
{{ value|title }} لكن المُرشح السابق سوف يقوم بجعل أول حرف من كل كلمة كبير Uppercase، لذلك يمكنك أن تستعمل مُرشح آخر وهو capfirst:
{{ "hello, world"|capfirst }} # Output: "Hello, world" تستطيع أيضًا إستخدام المُرشح lower مع الطرق السابقة لجعل كل الحروف صغيرة lowercase ماعدا الحرف الأول فقط:
{{ "heLLO, WORLD"|lower|capfirst }} # Output: "Hello, world"
-
إجابة سامح أشرف سؤال في كيفية عمل وحدات إختبار Unit tests بدون قاعدة بيانات في جانغو Django؟ كانت الإجابة المقبولة
يمكنك أن تقوم بهذا الأمر من خلال عمل صنف جديد يرث من الصنف 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
-
إجابة سامح أشرف سؤال في كيفية إرسال عدة مدخلات بنفس الاسم من نموذج Form في فلاسك Flask؟ كانت الإجابة المقبولة
هذه الطريقة (إضافة أقواس مربعة في أكثر من حقل للتعبير عن مصفوفة) ليست من معاير الويب 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')
-
إجابة سامح أشرف سؤال في كيفية إستخدام المجموعة sum لعدد من الصفوف وكذلك المتوسط average يإستخدام SQLAlchemy في فلاسك Flask؟ كانت الإجابة المقبولة
لا يمكنك أن تستعمل 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)
-
إجابة سامح أشرف سؤال في كيفية إستعمال SCSS في تطبيق فلاسك Flask؟ كانت الإجابة المقبولة
مكتبة 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 وسوف يتم إضافة الملف إلى القالب من خلال الكود الأخير.
-
إجابة سامح أشرف سؤال في كيفية التحقق من وجود صفوف في جدول بإستخدام Flask-SQLAlchemy في فلاسك Flask؟ كانت الإجابة المقبولة
يمكنك أن تقوم بالتحقق من وجود أي مستخدمين من خلال التابع 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())