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

سامح أشرف

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

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

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

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

    56

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

  1. Webpack عبارة عن مُجمّع ملفات ثابتة (مثل الصور وتنسيقات CSS وغيرها) لتطبيقات JavaScript الحديثة. ويوفر Webpack مجموعة كبيرة من الإعدادات والإضافات التي تسهل هذه العملية، كما يوفر Webpack أيضًا ما يسمى المحملات loaders التي تمكننا من التعامل مع أنواع مختلفة من الملفات وضغطها وتوفيرها في مجلد المشروع النهائي، ونفس الأمر بالنسبة لكود CSS أو SCSS و JavaScript حيث يقوم Webpack بمساعدة babel على سبيل المثال من تحويل كود JavaScript من نسخة حديثة مثل ES6 أو ES7 إلى إصدار أقدم من JavaScript وبالتالي يمكن لمجموعة أكبر من المتصفحات تنفيذ كود JavaScript بدون مشكلة. كما يمكن إستخدام Webpack بملف إعدادات مختلف webpack.config.js لبناء أكثر من نسخة من نفس المشروع، نسخة للتطوير development ونسخة أخرى للنشر production على سبيل المثال. وكل ملخص لما سبق، يقوم Webpack بإستخدام Node.js لعمل الكثير من المهام المعتادة وأتمتتها بسهولة من خلال الكثير من الإضافات plugins والمحملات loaders.
  2. توفر حلقة for في القوالب template الكائن forloop الذي يحتوي على الخاصية counter و counter0 والتي تعبر عن رقم التكرار في الحلقة (يمكن إعتباره مثل index)، حيث يبدأ الأول من 1 بينما counter0 يبدأ من 0 في العد لذلك يمكنك الحصول على النتيجة المرجوة من خلال الكود التالي: <ul> {% for day in daysList %} <li># Day {{ forloop.counter }} - From {{ day.from_location }} to {{ day.to_location }}</li> {% endfor %} </ul> كما يوفر هذا الكائن مجموعة أخرى من الخصائص مثل revcounter و revcounter0 و first و last وكذلك parentloop للتعامل مع حلقات for متداخلة.
  3. ما تعتقده صحيح، حيث في السطر الأول يجب أن تستدعي التابع save لكي يقوم بحفظ الكائن في قاعدة البيانات، وهذا الأمر يفيد إن كنت تريد التعديل على الكائن قبل حفظه، بينما في السطر الثاني يتم إنشاء الكائن بشكل مباشر في قاعدة البيانات في خطوة واحدة، مما يجعل من الكود أقصر وأكثر قابلية للقراءة. حسب توثيق Django: أي أن التابع save يسمح لك بعمل مجموعة من الخيارات المتقدمة، بينما create يسمح لك بحفظ الكائن في قاعدة البيانات في خطوة واحدة. من المميزات التي يسمح لك التابع save القيام بها هي عمل INSERT OR UPDATE للكائن في قاعدة البيانات وبالتالي في حالة وجود الكائن في قاعدة البيانات بالفعل سوف يتم تحديثه، بينما في حالة إستخدام create سوف يظهر خطأ كالتالي: # django.db.utils.IntegrityError: (1062, "Duplicate entry '13' for key 'PRIMARY'") ويمكنك أن تتحكم في هذه الميزة عبر المدخل force_insert والذي يقبل قيمة منطقية True/False. الأمر الأخير هو أن التابع save يقوم بإرجاع None، بينما create يقوم بإرجاع instance من هذا النموذج.
  4. إستخدام المؤقت timer مع أزرار التنقل بشكل منفصل قد يسبب بعض المشاكل، لكن في حالة إستخدمت المؤقت داخل الدالة currentSlide كما وضحت سابقًا، سوف يحل هذه المشكلة، حيث يتم حذف المؤقت في كل مرة يتم الضغط على أحد الأزرار من خلال clearInterval وعمل مؤقت جديد ليبدأ عد خمس ثواني، كالتالي: var timer; // الدالة الخاصة برموز الاتجاهات function currentSlide(n) { showSlides(slideIndex = n); // حذف المؤقت القديم إن وجد if (timer) { clearInterval(timer); } // يتم تعديل قيمة المتغير timer بمؤقت جديد timer = setInterval(function () { showSlides(slideIndex); console.log(slideIndex); slideIndex++; }, 5000); } هذا مجرد تعليق comment لهذه الخاصية (يمكنك كتابة تعليقات CSS داخل الخاصية style بدون مشكلة)، ويمكنك حذف هذه الخاصية (text-align) إن أردت فكل ما تقوم به هو محاذات الأزرار إلى المنتصف.
  5. يمكنك أن تقوم بعمل دالة تقوم بإرجاع عنوان IP ، كالتالي: def getClientIP(request): x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') # في حالة وجود العنصر HTTP_X_FORWARDED_FOR سوف يحتوي على عنوان IP في بدايته if x_forwarded_for: ip = x_forwarded_for.split(',')[0] else: ip = request.META.get('REMOTE_ADDR') return ip لاحظ كيف تم إستخدام التابع get حتى تحتدث مشكلة في حالة عدم وجود المفتاح REMOTE_ADDR (سوف يتم إرجاع None في هذه الحالة). كما يجب أن تتأكد من إعدادات reverse proxy بشكل صحيح (إن وجد)، على سبيل المثال: تثبيت mod_rpaf لخادم الويب Apache. ملاحظة: يحتوي العنصر X-Forwarded-For على عنوان IP في بدايته في أغلب الأحيان، ولكن في أحيان أخرى مثل في خوادم Heroku يتم وضع عنوان IP في نهايته، أي أنك يجب أن تستخدم -1 بدلًا من 0، كالتالي: def getClientIP(request): x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') # في حالة وجود العنصر HTTP_X_FORWARDED_FOR سوف يحتوي على عنوان IP في بدايته if x_forwarded_for: ip = x_forwarded_for.split(',')[-1].strip() else: ip = request.META.get('REMOTE_ADDR') return ip الآن يمكنك أن تستعمل الدالة كالتالي: client_ip = getClientIP(request) كما يمكنك أن تستعمل حزمة جاهزة للحصول على عنوان IP مثل حزمة django-ipware، أولًا يجب تثبيتها من خلال أحد الطرق التالية: 1. easy_install django-ipware 2. pip install django-ipware 3. git clone http://github.com/un33k/django-ipware a. cd django-ipware b. run python setup.py install 4. wget https://github.com/un33k/django-ipware/zipball/master a. unzip the downloaded file b. cd into django-ipware-* directory c. run python setup.py install ويتم إستعمال الحزمة كالتالي: # في ملف عرض view أو middleware حيث يكون الكائن `request` متاحًا from ipware import get_client_ip ip, is_routable = get_client_ip(request) if ip is None: # تعذر الحصول على عنوان IP الخاص بالعميل pass else: # في حالة وجود عنوان IP print(ip)
  6. يتم إستعمال الصنف show لعرض الشرائح، يمكنك أن تقوم بفتح أدوات مطوري المواقع Dev Tools ومراقبة الشرايح في قائمة Elements أثناء تغير الشرائح وستجد أنه يتم إضافة هذا الصنف إلى الشريحة التي يتم تعرضها حاليًا، لذلك قمت بتغير الصنف show في حاوية الأزرار إلى dots بدلًا من show سبب حوث هذه المشكلة هو الضغط على أزرار التنقل أكثر من مرة مما يؤدي إلى تشغيل أكثر من مؤقت في نفس الوقت، لحل هذه المشكلة يجب أن نقوم بعمل متغير timer خارج الدالة currentSlide ونقوم بحذف هذا المؤقت وعمل آخر جديد، كالتالي: var timer; // الدالة الخاصة برموز الاتجاهات function currentSlide(n) { showSlides(slideIndex = n); // حذف المؤقت القديم إن وجد if (timer) { clearInterval(timer); } // يتم تعديل قيمة المتغير timer بمؤقت جديد timer = setInterval(function () { showSlides(slideIndex); console.log(slideIndex); slideIndex++; }, 5000); } كما يمكنك أنك تقوم بجعل المؤقت خارج الدالة currentSlide بدون مشكلة لكي يعمل بشكل إفتراضي، كالتالي: var timer = setInterval(function () { showSlides(slideIndex); console.log(slideIndex); slideIndex++; }, 5000); // الدالة الخاصة برموز الاتجاهات function currentSlide(n) { showSlides(slideIndex = n); } هذا الكود يعمل بشكل سليم ويقوم بتغير الخلفية كل ثلاث ثواني، لكن عليك فصل جملة var i = 0 عن المؤقتت نفسه من خلال وضع فاصلة منقوطة ; بعد تعريف المتغير، كالتالي: $(function () { var images = [ 'images/diagoona-bg-1.jpg', 'images/diagoona-bg-2.jpg', 'images/diagoona-bg-3.jpg']; var imageHead = document.getElementById('image-head'); var i = 0; setInterval(function () { imageHead.style.backgroundImage = 'url(' + images[i] + ')'; i = i + 1; if (i == images.length) { i = 0 } }, 3000); })
  7. لاحظ أنك أستخدمت ملف js.js مرتين، مرة في عنصر head ومرة في نهاية عنصر body، أرجو منك أن تحذف النسخة الأولى الموجودة في عنصر head حتى لا تحدث مشاكل لاحقًا وحدة القياس vh وvw مختلفتان، حيث أن كل منهما يعني نسبة مختلفة، الأولى (vh) إختصارًا لـ viewport height أي طول نافذة (طول الجزء الظاهر منها viewport)، بينما vw إختصار لـ viewport width وتعني عرض النافذة (عرض الجزء الظاهر منها viewport). على العموم يمكنك أن تقوم بجعل حجم الصورة كبير (يملئ عرض الشاشة) من خلال تعديل خصائص top و left في الصنف show: .show { position: absolute; left: 0; top: 0; z-index: -1; // لجعل الصورة تظهر خلف النصوص، يمكنك حذفه إن أردت ولكن سوف تغطي الصورة على النصوص } أيضًا يجب حذف الخاصية position: relative من حاوية عارض الشرائح (الصنف slideshow-container)، لأنه يجعل حجم الصور أصغر. الأمر الأخير، ستلاحظ أن أزرار التنقل لا تعمل، لأن الصنف show يتم تطبيقه على هذه الأزرار (يحتوي على الخاصية z-index بقيمة -1)، بمجرد إزالة هذا الصنف من الأزرار سوف تعمل بشكل بدون مشكلة، وإن أردت تغير مكان هذه الأزرار فيمكنك أن تقوم بذلك من خلال الخاصية margin، كالتالي على سبيل المثال: .dots { /* يجب أن تضيف هذا الصنف إلى عنصر div الحاوي للأزرار*/ margin-top: -75px; /* رفع الأزرار إلى الأعلى قليلًا*/ } لا يوجد مؤقت موجود في كود جافاسريبت، هل متأكد من أنك قمت بحفظ الملف بعد كتابة الكود؟ على العموم لكي تقوم بعمل مؤقت timer في جافاسكريبت يمكنك أن تستعمل دالة setInterval ، كالتالي: var timer = setInterval(function() { showSlides(slideIndex); slideIndex++; // تغير رقم الصورة الحالية }, 5000); // تغير الصورة كل 5 ثواني سيقوم الكود السابق بتغير الصورة كل خمس ثواني. يمكنك أن تقوم بإضافة هذا المؤقت إلى الدالة currentSlide ليبدأ العمل عند الضغط على أحد الأزرار فقط. يتم عرض أول صورة لأن الدالة showSlides يتم تنفيذها بمجرد تحميل ملف js لذلك يجب أن تقوم بحذف السطر رقم 3 في ملف js.js، وبالتالي لن تعمل أي من الدوال إلا إن قمنا بالضغط على أحد أزرار التنقل. قمت بإرفاق المشروع بالتعديل لكي يمكنك أن تلقي نظرة على كل التعديلات ، لكن يجب أن تقوم بتطبيق الخطوات بنفسك مرة أخرى لكي تحصل على أقصى إستفادة. templete 1.zip
  8. يبدو أن لديك خطأ في ملف webpack.config.js حيث أن webpack لم يتعرف على الخاصية writeToDisk ، هل يمكنك التأكد من تثبيت حزمة webpack-dev-server من خلال الأمر التالي: npm install webpack-dev-server --save-dev إن لم يتم حل المشكلة، فربما لديك مشكلة في إصدارات الحزم التي تستعمله، يمكنك معرفة إصدار كل حزمة من خلال ملف package.json إن كانت المشكلة متعلقة بأحد الدروس في أحد الدورات، فأرجو منك ذكر في المشكلة في تعليق أسفل الدرس المتعلق بها.
  9. تتيح لغة SQL الإستعلام عن مجموعة من السجلات من خلال جملة واحدة كالتالي: SELECT * FROM users WHERE id in (1, 2, 3, 4) كما يوفر Django نفس هذه الطريقة في الإستعلام من خلال المعامل in، كالتالي: User.objects.filter(pk__in=[1, 2, 3, 4]) أو يمكنك البحث من خلال شرط معين: User.objects.filter(pk__gt=4) الكود السابق سوف يقوم بإرجاع كل المستخدمين الذين لديهم معرف id أكبر من 4 كما يمكنك أن تستعمل التابع in_bulk أيضًا: User.objects.in_bulk([1, 2, 3, 4]) يأخذ هذا التابع قائمة بقيم الحقول و واسم الحقل الذي سيتم إستخدامه لفهرسة هذه القيم (يتم إستخدام الأرقام بشكل إفتراضي)، ويعيد قاموسًا يعين كل قيمة إلى instance من الكائن بقيمة الحقل المحددة.
  10. يمكنك أن تقوم بحذف السجل بشكل مباشر عبر التابع delete بالشكل التالي: User.objects.get(pk=1).delete() في حالة كنت تريد تحديد السجل بناءً على حقل غير primary key فيمكنك أن تقوم بذلك كالتالي: User.objects.get(likes=1).delete() أو من خلال instance كالتالي: row = User.objects.get(likes=1) row.delete() لاحظ أن الكود السابق سوف يقوم بإطلاق خطأ في حالة لم يتم إيجاد سجل بهذه القيمة، لذلك يمكنك أن تستخدم filter بدلًا من get، كالتالي: User.objects.filter(pk=1).delete() User.objects.filter(likes=1).delete() بهذه الطريقة لن يحدث شيء في حالة لم يتم إيجاد أي سجل لحذفه. وإن كنت تريد حذف جميع السجلات من الجدول، فيمكنك أن تقوم بالتالي: users = User.objects.all() users.delete()
  11. لاحظ في الـ Console يظهر لك يخبربك أن undefined لا يحتوي على الخاصية style، بمعنى آخر لم يتم إيجاد العناصر .mySlides ويتم إعتبار المتغير slides يساوي undefined وهذا الأمر يسبب في تعطل الكود كما هو واضح. سبب هذه المشكلة هو أن كود JavaScript يتم تنفيذه قبل تحميل الصفحة حيث قمت بوضع ملف js.js في عنصر head بينما ينصح دائمًا أن تقوم بإضافته قبل نهاية العنصر body، وبالتالي يتم تنفيذ كود JavaScript عندما يتم تحميل الصفحة بالكامل (بالطبع توجد أستثناءات لهذه القاعدة). <!-- نقوم بوضع السكريبت قبل نهاية جسم الصفحة --> <script src="js/js.js"></script> </body> </html> الأمر الثاني هو في خصائص CSS نفسها، لاحظ أنك عندما تضغط على أزرار التنقل لن سوف تظهر الصور لبرهة ثم تختفي ثانية، وإذا قمت بفحص الصورة، ستجد أنه تتم إضافة الخاصية display: block بشكل صحيح (من خلال كود الجافاسكريبت)، لكن ستجد أيضًا أنه يتم تطبيق الخاصية opacity: 0 مما يؤدي إلى إختفاء الصورة (المحدد .fade:not(.show)) (أحد خصائص Bootstrap)، ولحل هذه المشكلة يجب أن يتم إضافة الصنف show للصورة التي يجب إظهاراها، لذلك سوف نقوم بتعديل كود JavaScript لكي يتم إضافة الصنف show كالتالي: function showSlides(n) { var i; var slides = document.getElementsByClassName("mySlides"); var dots = document.getElementsByClassName("dot"); if (n > slides.length) { slideIndex = 1 } if (n < 1) { slideIndex = slides.length } for (i = 0; i < slides.length; i++) { slides[i].style.display = "none"; // إخفاء كامل الشرائح // حذف الصنف show من كل الصور slides[i].classList.remove('show'); } slides[slideIndex - 1].style.display = "block"; // تعديل تنسيق الشريحة المفعلة slides[slideIndex - 1].classList.add('show'); // إضافة الصنف show إلى الصورة التي يجب إظهارها فقط } بعد عمل هذه التعديل وحفظ الملفات، وإعادة تحديث الصفحة ستجد أن الصور يتم التنقل بينها بشكل سليم.
  12. يوفر Django الصنف connection الذي يسمح لك بمعرفة جمل SQL التي يتم تنفيذها، كالتالي: >>> from django.db import connection >>> connection.queries [{'sql': 'SELECT polls_polls.id, polls_polls.question, polls_polls.pub_date FROM polls_polls', 'time': '0.002'}] يعرض الكود السابق جمل SQL التي تم تنفيذها مع الوقت الذي إستغرقه تنفيذ كل جملة. لاحظ أن connection.queries متاحة فقط في حالة تم ضبط إعدادات Django وتفعيل وضع التطوير DEBUG=True إن كان المشروع يعمل على أكثر من قاعدة بيانات، فيمكنك تحديد قاعدة البيانات بالطريقة التالية: >>> from django.db import connections >>> connections['DATABASE_NAME'].queries في حالة أردت حذف سجل جمل SQL هذا فيمكنك أن تستعمل الدالة reset_queries: from django.db import reset_queries reset_queries() كما أن Querysets لديها الخاصية query التي تمكنك من عرض جملة SQL قبل تنفيذها، كالتالي: print(User.objects.filter(role="admin").query) لاحظ أيضًا أن جمل SQL الناتجة عن هذه العملية قد لا تكون صحيح مع جميع أنواع قواعد البيانات، حيث يقوم Django بإرسال جملة SQL مع القيم بشكل منفصل، وهذا الأمر تم توضيحه في توثيق Django:
  13. يمكنك أن تقوم بذلك بعدة طريق، منها: ضع علامة - قبل اسم الحقل، كالتالي: User.objects.all().filter(role='user').order_by('-created_at') هنا يتم جلب النتائج من قاعدة البيانات بشكل عكسي أي من خلال جملة ORDER BY DESC في SQL، وتعد هذه هي الطريقة الأسرع في تنفيذ المهمة. إستخدم التابع reverse()، كالتالي: User.objects.all().filter(role='user').order_by('created_at').reverse() هنا يتم جلب البيانات بترتيب تصاعدي، ثم يقوم Django بعكس ترتيب النتائج. إستخدم ترتيب القائمة العكسي، كالتالي: User.objects.all().filter(role='user').order_by('created_at')[::-1] تستخدم هذه الطريقة فقط إن أردت تحويل النتائج إلى قائمة list وليس queryset.
  14. يبدو أن هناك خطأين في الكود، وهما كالتالي: أولًا: في جملة for الثانية (الداخلية) يبدو أنه يتم إنقاص المتغير i وليس المتغير j وبالتالي سوف يحدث خطأ في الثنية ثانيًا: هناك قوس ناقس في الجملة التي تقوم بطباعة العناصر. بعد إصلاح هذه المشاكل سوف يكون الكود كالتالي: int[][] array = {{1, 2}, {3,4}, {5, 6}}; for (int i = array.length - 1; i >= 0; i--) { for (int j = array[i].length - 1; j >= 0; j--) System.out.print(array[i][j] + " "); System.out.println(); } ونتيجة تنفيذ هذا الكود، هو طباعة عناصر كل مصفوفة من المصفوفات بشكل عكسي (العنصر الثاني ثم الأول)، كالتالي: 6 5 4 3 2 1
  15. يمكنك أن تستعمل الحزمة django-settings-export، حيث تمكنك من إستخدام متغيرات معينه من ملف settings.py داخل أي قالب template بشكل سهل للغاية. اولًا عليك تثبيت الحزمة من خلال الأمر التالي: pip install django-settings-export بعد ذلك يجب أن تقوم بإعداد ملف settings.py ليشمل الكود التالي: # هنا تخبر Django بأن يقوم بتشغيل هذه الحزمة في القوالب TEMPLATES = [ { 'OPTIONS': { 'context_processors': [ 'django_settings_export.settings_export', ], }, }, ] # هذا مثال لمتغير وسوف نستخدمه في القوالب MY_TEST_DATA = 'any content goes here'; # في هذا الجزء تقوم بكتابة المتغيرات التي تريد إستخدامها في القوالب # لاحظ ان المتغيرات تكتب بشكل نص SETTINGS_EXPORT = [ 'MY_TEST_DATA', ] بعد ذلك يمكنك ان تستخدم المتغير MY_TEST_DATA، كالتالي: <script>var customVar = '{{ settings.MY_TEST_DATA }}';</script> ويمكنك تغير كلمة settings لأي شيء آخر (في حالة حدوث تعارض مع حزمة أخرى)، من خلال عمل متغير SETTINGS_EXPORT_VARIABLE_NAME في ملف settings.py، كالتالي: # نقوم بإعطاء المتغير أي قيمة نصية # يجب ألا تحتوي على مسافات، فقط حروف لاتينية وعلامة _ SETTINGS_EXPORT_VARIABLE_NAME = 'my_config' # في القالب {{ my_config.MY_TEST_DATA }} في حالة كنت تستخدم Django بإصدار اقدم من 1.8 فيجب أن تستخدم الكود التالي لإعداد الحزمة: TEMPLATE_CONTEXT_PROCESSORS = [ 'django_settings_export.settings_export', ]
  16. يوجد مجموعة من الكتب الإنجليزية لتعلم بايثون ومنها: كتاب Think Python: كتاب مجاني ومناسب للمبتدئين، هو عبارة عن مقدمة لبرمجة Python للمبتدئين. يبدأ بالمفاهيم الأساسية للبرمجة، وهو مصمم بعناية لتحديد جميع المصطلحات عند استخدامها لأول مرة ولتطوير كل مفهوم جديد في تقدم منطقي. يتم تقسيم الأجزاء الأكبر حجمًا، مثل البرمجة الموجهة والكائنات العودية recursion إلى سلسلة من الخطوات الأصغر ويتم تقديمها على مدار عدة فصول. كتاب How to Code in Python: كتاب مجاني أيضًا، كتاب مقدم من شركة DigitalOcean (شركة مختصة في الإستضافة والتخزين السحابي)، تم تصميم هذا الكتاب ليتم استخدامه بطريقة منطقية بالنسبة للمبتدئ. بمجرد أن تتعرف على المفاهيم الأساسية المشروحة في الكتاب، يمكنك الاستمرار في استخدام الكتاب كمصدر مرجعي. كتاب Python for Everybody: الهدف من هذا الكتاب المجاني هو تقديم مقدمة في البرمجة. في هذا الكتاب يتم التركيز بشكل أكبر على استخدام Python لحل مشكلات تحليل البيانات الشائعة في عالم المعلوماتية. ملاحظة: تحتوي الأكاديمة على كتاب البرمجة بلغة بايثون، وهو كتاب مترجم إلى العربية مبني على كتاب «How to code in Python» ويأتي شارحًا المفاهيم البرمجية الأساسية بلغة بايثون، رُبط هذا الكتاب مع توثيق لغة بايثون في موسوعة حسوب لتسهيل عملية الاطلاع على أي جزء من اللغة مباشرة وقراءة التفاصيل باللغة العربية. كما يوجد مجموعة ضخمة من المقالات في Python يمكنك الإطلاع عليها من هنا (مقالات بايثون).
  17. يمكنك أن تستعمل الكائن Qمع علامة pipe | كالتالي: from django.db.models import Q Post.objects.filter(Q(creator='owner') | Q(accepted=True)) أو يمكنك أن تقوم بإستخدام علامة pipe | بشكل مباشر كالتالي: posts = Post.objects.filter(post.creator = 'owner') | Post.objects.filter(post.accepted = True)
  18. يمكنك أن تقوم بعمل تجميع aggregation من خلال التابع count كالتالي: # يجب إستدعاؤ التابع أولًا # في حالة تم إستدعاء models مسبقًا فيمكنك أن تستخدمه أيضًا from django.db.models import Count result = (User.objects .values('role') .annotate(dcount=Count('role')).order_by() ) الكود السابق يقوم بتنفيذ جملة SQL التالية: SELECT role, COUNT(role) AS dcount FROM users GROUP BY role وسوف تكون النتيجة كالتالي: [{'role': 'Admin', 'dcount': 2}, {'role': 'User', 'dcount': 2}] إن أردت أن تحتوي النتيجة على أكثر من حقل، فيجب أن تقوم بإضافتهم إلى values كالتالي: .values('role', 'name', 'age') وهناك دائمًا حل آخر بديل وهو أن تقوم بتنفيذ جملة SQL فقط كالتالي: result = User.objects.raw('''SELECT * FROM users GROUP BY role''') لكن لا ينصح إستخدام هذا الحل، لأن جمل SQL المباشرة قد تؤدي إلى حدوث مشاكل أمنية وأخطاء غير متوقعه في كثير من الأحيان.
  19. بشكل إفتراضي يتم تخزين السجلات logs في نظام Linux في أحد المسارات التالية (حسب بنية النظام لديك): /var/log/nginx/nginx_error.log /var/log/nginx/error.log يمكنك عرض آخر جزء من السجل من خلال أمر tail، كالتالي: tail -f /var/log/nginx/error.log لاحظ: يجب تغير المسار في الأمر السابق حسب المسار الذي لديك أما في MacOS فالمسار مختلف وهو: /usr/local/var/log/nginx أما في Windows فيختلف المسار حسب مكان تثبيت الخادم لكن يمكنك الوصول من خلال تنفيذ الأمر التالي: nginx -s reopen أما إن أردت أن يقوم Django بحفظ السجلات فيجب عليك أن تقوم بتعديل ملف settings.py لشمل الكود كالتالي: LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, 'debug.log'), }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'DEBUG', 'propagate': True, }, }, }
  20. في البداية يجب التفريق بين تحيليل البيانات Data analysis وعلم البيانات Data science، والواضح هو أن علم البيانات أشمل وأعم، ويمكن تعريف كل منهما كالتالي: علم البيانات Data science: هو التعامل مع البيانات الغير المنظمة، فهو مزيج من الإحصاءات، والرياضيات، والبرمجة، وحل المشكلات، وجمع البيانات بطرق مختلفة (مثل سحب البيانات web scraping أو الإقتراعات polls .. إلخ)، أي أنّه علم يضم جميع التقنيات التي تقوم بإستخلاص كل المعلومات من البيانات، وهو مفهوم يستخدم للتعامل مع البيانات الكبيرة Big Data، يغطي هذا المفهوم جوانب إعداد البيانات وتنظيفها وتحليلها. تحليل البيانات Data analysis: هو عملية فحص للبيانات الموجودة بهدف إستخلاص معلومات مفيدة، يمكن أن تكون لمعرفة أسباب أو تفسير لشيء من الماضي من أجل أهداف حاضرة أو مستقبلية، ويستلزم تحليل البيانات الخروج بإحصائيات للوصول إلى نتيجة معينة، يحتاج محلل البيانات لمعرفة كيفية العمل مع الأرقام، يُنظر إلى تحليلات البيانات على أنها أهم فرع في علوم البيانات. البيانات الضخمة Big Data: تُعتبَر البيانات الضخمة أنها كميات هائلة جدًا من البيانات تتزايد وتكبر بإستمرار، وليس من الممكن معالجة هذه البيانات أو حتى التعامل معها، وجمعها استنادًا على الطرق التقليدية بسبب كبر حجمها، حيث يتطلب هذا النوع من البيانات أساليب مُبتكرة لمعالجتها. وفي العادة يتم إستعمال هياكل البيانات Data Structure والخوارزميات Algorithms للتعامل معها. يجب أن يكون عالم البيانات على دراية بالأمور التالية: الرياضيات المتقدمة، مثل الجبر الخطي، والمصفوفات، والإحصاء. لغات البرمجة: بالطبع سيحتاج عالم البيانات أن يكون على دراية واسعة بأحد لغات البرمجة مثل Python و matlab أو R أو C++ إدارة البيانات: يجب أن يكون بإمكان كل عالم بيانات أن يدير البيانات وينظمها أو حتى أن يقوم بتجميعها من خلال العديد من الطرق، مثل سحب البيانات web scraping أو عمل إستطلاعات/إقتراعات Polls، حيث لن يكون تجميع البيانات بشكل يدوي وفردي عملي على الإطلاق. الخوارزميات وهياكل البيانات: من الضروري تعلم الخوارزميات وكيفية عملها وأشهرها مثل خوارزميات البحث والترتيب، وكذلك هياكل البيانات، لأن بدونها سيكون التعامل مع البيانات الضخمة Big Data أمرًا بطيئًا للغاية وغير عملي بالمرة. يتم تدريس الأمور السابقة في شكل مواد متعددة وتختلف تسمية وعدد المواد من جامعة إلى أخرى. إن لم يكن لديك معرفة مسبقة في البرمجة، فأنصحك بأن تبدأ بأحد الدورات التي تهيء لك الأمر في البداية، ويوجد العديد من الدورات التي تقدم هذا المحتوى منها المجاني والمدفوع، مثل دورة CS50 (دورة مجانية، تعد بداية جيدة لمن لا يتقن أي لغة برمجة) أو دورة علوم الحاسوب مقدمة من حسوب (دورة مدفوعة، تحتوي على أغلب التقنيات السابقة، مثل أساسيات البرمجة ولغة JavaScript و Python والخوارزميات وهياكل البيانات وغيرها). بعد ذلك يجب أن تتعمق أكثر في لغة برمجة مثل Python (الأكثر إستعمالًا في الوقت الحالي في علوم البيانات)، كما يجب أن تتقن الرياضيات مثل الجبر الخطي والإحصاء والتعامل مع المصفوفات (يوجد مجموعة المكتبات التي تساعدك في هذا الأمر مثل Numpy لبايثون). يمكنك أيضًا أن تبحث عن مشاريع مفتوحة المصدر على GitHub لقراءة الكود المصدر Source Code لمشاريع عديدة وكبيرة، مما يعطيك فكرة ممتازة عن كيفية عمل مشاريع من الصفر وكيف يتم تطويرها، كما قد تحصل على بعض أفكار لمشاريع مستقبلية من هذه الخطوة.
  21. مع إيقاف وضع التطوير Debug mode، لن يتعامل Django مع الملفات الثابتة بعد الآن، حيث يجب أن يتولى خادم الويب الخاص بالإنتاج (Apache أو Nginx) هذا الأمر، وذلك لكي يتم تحميل الملفات الثابتة Static Files بشكل أسرع، حيث يقوم خادم الويب بتحميل الملفات بشكل مباشر دون المرور على طبقة الكود الخاص بالموقع، مما يعني سرعة تحميل أسرع بشكل عام. يمكنك حل المشكلة بشكل مؤقت أثناء التطوير من خلال تشغيل الخادم مع تمرير العلم insecure كالتالي: manage.py runserver --insecure باستخدام العلم insecure، فيجب أن تعلم أنه غير فعال بشكل كبير وربما غير آمن أيضًا. لأن هذا الأمر مخصص للتطوير المحلي فقط local development، ويجب عدم استخدامه مطلقًا في مرحلة الإطلاق Production، وهو متاح فقط إذا كان تطبيق الملفات الثابتة staticfiles موجود في قائمة INSTALLED_APPS الخاص بمشروعك (في ملف settings.py).
  22. يمكنك أن تستعمل الدالة build_absolute_uri() للحصول على عنوان URL المطلق للصفحة الحالية، كالتالي: >>> request.build_absolute_uri() 'https://example.com/posts/slug/how-to-create-django-project/?color=dark' وإن قمت بتمرير عنوان نسبي relative، سوف تعيد الدالة العنوان المطلق absolute URL، كالتالي: >>> request.build_absolute_uri('/posts/slug/') 'https://example.com/posts/slug//' ويمكنك أيضًا أن تقوم بتحديد النطاق domain كالتالي: >>> request.build_absolute_uri('https://anotherSite.com/posts/slug/') 'https://anotherSite.com/posts/slug//' لاحظ أن البروتوكول المستعمل هو نفسه في النتيجة، لذا يجب عليك الحذر في حالة إستعمال برتوكول http غير المشفر.
  23. لكي يعمل Django مع MySQL يجب تثبيت حزمة إضافةي وهي mysqlclient (لـ بايثون 3) أو mysql-python (لـ بايثون 2)، ويمكنك أن تقوم بتثبيتها من خلال الأمر التالي: pip install mysql-python # (python 2) pip install mysqlclient # (python 3) وإن كنت تستعمل نظام التشغيل لينكس (مبني على توزيعة Debian مثل Ubuntu أو Mint) فيمكنك أن تستخدم الأمر التالي: apt-get install python-mysqldb كما يجب عليك تعديل إعدادات المشروع لكي يستخدم MySQL من خلال ملف settings.py، كالتالي: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # تخبر Django بأن يستعمل محرك MySQL 'NAME': 'django', 'HOST': '', # نص فارغ يعني localhost 'PORT': '3306', 'USER': 'root', 'PASSWORD': '', } } ملاحظة: يمكنك حفظ معلومات المستخدم الخاص بقاعدة البيانات في ملف my.cnf على سبيل المثال، كالتالي: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'OPTIONS': { 'read_default_file': '/path/to/my.cnf', }, } }
  24. لا تحتوي الأكاديمية على دورات في التسويق الإلكتروني، ولكن يوجد مجموعة ضخمة من المقالات والدروس المجانية التي قد تفيدك للغاية في مجال التسويق الإلكتروني، وتحتوي هذه المقالات على كل الأساسيات والمباديء التي يحتاج إليها المسوق، مرورًا بأنواع مختلفة من التسويق مثل التسويق بالبريد الإلكتروني أو إستخدام الشبكات الإجتماعية، وأدوات تحليل الزوار، ومجموعة من النصائح والإرشادات أيضًا. يمكنك الوصول إلى هذه المقالات من هنا: https://academy.hsoub.com/marketing/
  25. بالفعل، هذا هو السبب الأساسي الذي تم صنع Flutter من أجله، ونفس الشيء بالنسبة لـ React Native ليس هناك ترتيب معين لتعلم اللغات، حيث أن كل مجال تختلف فيه اللغات المستخدمه فيه، فعلى سبيل المثال، لتعلم إختبار إختراق الويب ستحتاج إلى تعلم HTML و JavaScript و PHP (لأنها الأكثر إستعمالًا في الوقت الحالي) أو لغة برمجة مشابهة (للـ Backend)، ولتعلم إختبار إختراق تطبيقات الهواتف الذكية، فستحتاج إلى تعلم Java و Kotlin (للأندرويد) أو Swift و object-c (للـ iOS) ... إلخ، لذلك لا يوجد ترتيب معين يمكن إتباعه. في حين إن لم تحدد بعد المجال الذي تريد التخصص فيه، فأنصحك بتعلم لغة Python لأنك ستستفيد منها في كل التخصصات، حيث تمكنك هذه اللغة من عمل Scripts تساعدك في عملك وتقوم بعمل أشياء بطريقة تلقائية بدلًا من عملها يدويًا مما يوفر الكثير من الوقت والجهد عليك.
×
×
  • أضف...