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

شرف الدين حفني

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

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

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

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

    2

كل منشورات العضو شرف الدين حفني

  1. الخطأ 403 يعني أنك ﻻ تمتلك صﻻحية الوصول إلى الresources المطلوبة ع الرغم من إثبات هويتك, فلو كنت لم تثبت هويتك بعد لكان الخطأ المُفترض أن تحصل عليه هو 401 authorization error حسب المعايير القياسية لتصميم الapis فإن ذلك الخطأ بشكلٍ غالب يعني أنك قمت بطلب بيانات ﻻ يمكنك رؤيتها, كمثال إن كنت تطلب بيانات ينقصر رؤيتها على المدير(admin) أو مثلاً تطلب بيانات لمستخدم أخر وليس لك الحق في طلبها. كما من الممكن أن يكون الحساب الخاص بك ليس مُفعل بعد
  2. هذا يعتمد على عدد من العوامل والإجابة عليه تكون حسب النظام الذي تقوم بإنشاؤه فﻻ توجد إجابة ثابتة, ولكن يمكنك إستنباط الحل الأفضل عبر ذكر العيوب والمميزات لإستخدام الtriggers: هل يقوم أكثر من تطبيق بإستخدام نفس قاعدة البيانات أم ﻻ يوجد إلا تطبيق واحد يقوم بالعمليات عليها؟؟ في تلك الحالة تكون نقطة للtriggers إن كان أداء قاعدة البيانات هو امر حرج ومهم إذاً فإن الtriggers تفوز هنا أيضاً, حيث أنك ﻻ تحتاج أن تقوم بإرسال أكثر من إستعﻻم لقاعدة البيانات مما يساهم في خفض ال traffic على قاعدة البيانات ومن عيوب إستخدام الtriggers : يقوم بإنشاء طبقة من الغموض للمطور, حيث تقوم بكتابة جملة إستعﻻمية وتتفاجأ بتغيير في قاعدة البيانات غير الذي كنت تتوقعه كتابة الsql أحيانا يكون أصعب من التعامل مع البيانات من خﻻل لغات البرمجة العامة
  3. يوجد عدة عوامل وإعتبارات يتم أخذها عند تحديد الحقول التي يتم تعليمها كفهرس(index) من الممكن تلخيصهم بالشكل التالي قم بتحديد الفهرس بناءاً على الإستعلامات وليس على الجدول: بمعنى أنك ﻻ تقم بتحديد الفهرس عند إنشاء الجدول من خﻻل تصميم الجدول وإنما تقوم بالتحديد من خﻻل الإستعﻻمات نقوم بتحديد ما الحقول التي تكثر في إستعﻻماتنا ومن خﻻلها نقوم بتحديد الفهرس يتم تحديد الفهرس أيضاً حسب أهمية الإستعﻻمة, بمعنى أنه إن وُجدت إستعﻻمة يتم إستخدامها بكثرة وتقوم بجلب بيانات ثقيلة إذا تلك الإستعﻻمة مهمة ونقوم بأرشفة الحقول المُستخدمة فيها نحاول أيضاً فهرسة الحقول المشتركة بين أكثر من إستعﻻمة نقوم بفهرسة الحقول المُستخدمة في الترتيب والتجميع(order by, group by) حيث أنها تقوم بتسريع تلك العمليات , حيث أن تلك العمليات بطبيعتها في غاية البطئ الخﻻصة: يجب أولاً تحديد الإستعﻻمات الموجودة لديك وتحليلها بشكلٍ جيد ومن ثم نقوم بإستخراج الindexes المناسبة بناءاً على تحليلنا لتلك الإستعﻻمات
  4. من الممكن أن يكون السبب في ذلك هو مسار الصور, جرب أن تكتب المصار بالشكل التالي $_SERVER['DOCUMENT_ROOT']."المسار بالنسبة لمجلد الhtdocs" حيث أن العنصر DOCUMENT_ROOT في المصفوفة $_SERVER تحتوي على المسار الخاص بالخادم إن لم يعمل برجاء التأكد من الصﻻحيات يمكنك التأكد من أن المشكلة ليست من الصﻻحيات عن طريق الذهاب إلى مجلد الصور وتقوم بالتالي file > Right click > Get info ومن ثم جعل الصﻻحيات read&write ومن ثم تجربة الملف مرة أخرى
  5. الأمر مشابه لعملية جمع المعادلات ولكن يتم وضعها بمصفوفة بغرض التسهيل والتنظيم وسهولة العمليات على المصفوفة فبدلاً من كتابة x + 2 - 2z + 4t = 5 2x + 2y - 3z + t = 3 3x + 3y - 4z - 2t = 1 نقوم بكتابة معاملات المعادلات بداخل مصفوفة [ 1 1 -2 4 5 2 2 -3 1 3 3 3 -4 -2 1 ] نعلم أننا ﻻ يمكننا حل معادلة بها أكثر من متغير, فنحاول هنا أن نقوم بجمع المعادلات حتى نحصل على معادلة تحتوي على متغير واحد فقط لنعثر على قيمته, وللحصول على معادلة على هذه الشاكلة نحتاج إلى جعل معاملات باقي المتغيرات بصفر, وﻻيمكننا أن نقوم بتصفيرهم من العدم, يجب أن نجمع المعادلات معاً بشكل رياضي صحيح حتى نحصل على الصورة الصفرية(جميع المعاملات بصفر عدا معامل واحد من المتغيرات) إن ﻻحظت أول معادلتين إن قمنا بضرب أول معادلة *-2 ومن ثم جمعناها على أول معادلة ستكون بالشكل التالي -2*(x + y -2z + 4t)=5*2(كما تﻻحظ يجب ضرب ماقبل اليساوي في نفس العدد بعد عﻻم اليساوي حتى تكون المعادلة صحيحة رياضياً) بعد الضرب تصبح المعادلة -2x -2y +4z -8t = -10 نقوم بجمعها على المعادلة الثانية -2x +2x +2y -2y +4z -3z -8t +t=-10 +3 = 0x +0y +z -7t = -7 نقوم بعد ذلك بالتفكير ومحاولة رؤية معادلات نجمعها تعطي أصفار في المعاملات, سنجد أن حاصل ضرب المعادلة الأولى في 3 مجموعة على المعادلة الثالثة ستعطينا إصفار للمعادلة الثالثة -3*(x + y - 2z + 4t) = 3*-5 =-3x - 3y + 6z - 12t = -15 نجمعها على المعادلة الثالثة -3x + 3x -3y + 3y 6z -4z -12t -2t =-15 +1 = 0x +0y +2z -14t = -14 نﻻحظ أن المعادلات الثانية والثالثة بهما الx وال y بصفر نقوم بتنفيذ تلك الخطوات وتكرارها حتى نحصل على معادلة لا تحتوي إلا على معامل واحد وباقي المتغيرات بصفر لنستطيع مساواة قيمة المتغير بالقيمة التي بعد عﻻمة المساواة ولكن بدلاً من كتابتها على هيئة معادلات نقوم بكتابتها على هيئة مصفوفة
  6. docker هو حاوية, أي أنها تعمل كنظام تشغيل وهمي أو بيئة عمل يتم وضع المشروع بها حتى يتم التأكد من أن المشروع يعمل على نفس بيئة العمل ونفس الإعدادات عند كل المستخدمين فﻻ يحتاج أحد أن يُعدل في بيئة عمله لتتوافق مع المشروع بينما Kubernetes هو أداة لإدارة الحاويات وتنفيذ عمليات تلقائية عليها بشكل أوتوماتيك مثل النشر( deployment) والتشغيل
  7. يوجد عدة طرق لحفظ الصور لكلٍ منها عيوبها ومميزاتها حفظ الصور في قاعدة البيانات مباشرةً ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ تظل تلك الطريقة هي أبسط طريقة لحفظ الصور وهي أن تقوم بحفظ الصور في قاعدة البيانات مباشرةً في حقل من النوع blob مميزات تلك الطريقة: بسيطة في تطبيقها, مجرد أن تستقبل الصور من المُستخدم وتقوم بإرفاقها في قاعدة البيانات كما هي وعند الإستقبال تقوم بجلبها من قاعدة البيانات وإرسالها إلى المُستخدم ضمان عدم وجود صور غير مُستخدمة: حيث أن الصور مرفوقة في قاعدة البيانات, مما يعني في حالة قام مُستخدم بحذف الصورة سيتم حذفها من قاعدة البيانات عن طريق الsql وبالتالي نضمن عدم وجود صور في المساحة التخزينية تم حذفها من قِبل المُستخدم عيوب تلك الطريقة تُسبب مشاكل في الأداء: حيث أن الصور حجمها كبير نسبياً مما يجعل الإستعﻻمات في قاعدة البيانات أبطأ ويقلل من أداؤها يصعب عمل نسخ إحتياطية من الصور في حالة إحتجناها مستقبلياً حفظ الصور في المساحة التخزينية ومن ثم إرفاق عنوانها في قاعدة البيانات ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ مميزات تلك الطريقة تلك الطريقة أفضل في الأداء: حيث هنا تفوز في الأداء لسببين , أولاً بسبب أن قاعدة البيانات أصبحت الأن تقوم بجلب بيانات ذات مساحة أقل مما يعني جمل إستعﻻمية أكثر سرعة حيث أن قاعدة البيانات ﻻ تقوم بجلب الصورة إنما فقط تقوم بجلب العنوان الذي يُشير لتلك الصورة , وأيضاً لأن عملية جلب الصورة نفسها من المساحة التخزينية أسرع من عملية جلبها بواسطة قاعدة البيانات سهل أن تقوم بعمل نسخة إحتياطية للصور عيوب تلك الطريقة أكثر تعقيداً من السابقة حيث أنك تقوم أولاً بوضع الصورة في المساحة التخزينية وإعطائها إسم مميز حتى ﻻ يحصل تداخل بين إسم صورتين وبعد ذلك نجلب العنوان ونقوم بوضعه في قاعدة البيانات, وعند القراءة نقوم بجلب العنوان ومن ثم نجلب الصورة المُرفقة في ذلك العنوان, ويجب التأكد عند التخزين أن العنوان المُسجل في قاعدة البيانات متوافق مع العنوان الفعلي من الممكن أن يتم حذف الصورة من قاعدة البيانات ولكن ﻻ يتم حذفها فعلياً من المساحة التخزينية مما يسمح بإستغﻻل المساحة التخزينية بشكلٍ سيئ حسناً بالنسبة لسؤالك عن أفضل طريقة , فﻻ يوجد أفضل طريقة فكل طريقة تعتمد على إحتياجاتك, ولكن بشكلٍ عام ستجد الطريقة الثانية مناسبة لأغلب الأوقات, ﻻ أعتقد أنني قد إحتجت مطلقاً إلى الطريقة الأولى , الطريقة الثانية تعطي أداءاً جيداً جداً بالنسبة إلى الطريقة الأولى
  8. تقوم sequelize بإنشاء دوال للتعامل مع العﻻقات بين الجداول بشكل تلقائي ويتم تسميتها بشكل تلقائي على النحو الأتي instance.addEntity(); instance.setEntity(); instance.removeEntity(); ونقوم بإستبدال الكلمة entity بالإسم الذي أعطيته للعﻻقة عند إنشاؤها كما في الشكل التالي user.belongsToMany(models.Post,{ through:"likes", as:"post" }) post.belongsToMany(models.User,{ through:"likes", as:"liker" }) في هذه الحالة يمكن محاكاة عملية الإعجاب عبر الشفرة التالية Post.findOne({ post_id }).then((post) => post.addLiker(user_id))
  9. كلا الخطأين يدلان على عدم إمكانية إرسال الطلب بهذا النوع من الطريقة, مثلا أن يكون لدينا ال endpoint التالية http://example.com/user وﻻ يكون بإمكان إرسال طلب عن طريق الhttp method delete فمن الممكن وقتها أن يأتيك أحدى الخطأين ولكن الفرق بينهما كالتالي 415 الطريقة غير مسموح بها method not allowed ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ هذه الرسالة تعني أن تصميم الapi نفسه لا يدعم هذه الطريقة على هذا النوع من الموارد , مثلاً في الendpoint بالأعلى من الممكن أن يكون تصميم الapi ﻻ يدعم وجود خاصية حذف المُستخدم, ففي هذه الحالة يكوون الخطأ من العميل حيث أرسل طلب بطريقة غير موجودة في الapi من الأساس 501 الطريقة لم تُدعم بعد method not implemented ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ في هذه الرسالة تكون الapi مُصممة لإستقبال هذه الطريقة على هذا النوع من الموارد ولكن لم يتم دعممه في الوقت الحالي ولكن من الممكن دعمه في المستقبل, ففي المثال السابق إن كان يوجد بالفعل دالة تستمع للطريقة delete على الuser ولكن لم يتم تفعيل تلك الخاصية بعد(خاصية حذف المُستخدم) سيكون الرد برسالة 501 حيث أن الخطأ هنا من الخادم وليس العميل حيث أن الخادم يستمع إلى تلك الطريقة delete للuser ولكن فقط لم يقم بدعم تلك الخاصية في الوقت الحالي(لم يقوم بعمل implementation للدالة المسؤلة عن تلك الوظيفة)
  10. الخطأ 401 يُعبر عن أن العميل يفتقر في طلبه إلى إثبات هويته بينما الخطأ 403 يُعبر عن أن العميل قد قدم إثبات هويته ولكن ليس له الحق في هذا الطلب فمثلاً إن حاولت إرسال طلب إلى api وكان الapi يشترط وجود header بإسم Authorization يحتوي على الjwt token وقمت بإرسال الطلب دون إرفاق الheader في هذه الحالة ستقوم الapi بإرسال حالة 401 بينما إن قمت بإرسال طلب إلى الapi وحاولت الوصول إلى بيانات لا يمكن الوصول لها إلا من قِبل المدير( admin) وقمت بإرفاق header ال Authorization الذي يحتوي على الjwt خاصتك التي تحمل بياناتك وانت مُستخدم عادي ولست مدير, في هذه الحالة سترد عليك الapi بحالة 403 والتي تعني أن طلبك مفهوم ويحتوي على إثبات الهوية , ولكن هويتك غير مؤهلة لهذا الطلب
  11. يمكنك تنفيذ ذلك عن طريق التالي: نقوم بإختيار عدد الموظفين في الشركة عبر الحقل company_id حيث يعبر عن الشركة التي يعبر بها الموظف, ويتم عن طريق الدالة count بالشكل التالي select count(employee.company_id),employee.company_id from employee ثم نقوم بتصنيف العناصر حسب حقل ال company_id بإستخدام group by group by(employee.company_id) ومن ثم نقوم بترتيب العناصر حسب عدد الcompany_id order by count(employee.company_id)
  12. كﻻ الإستعﻻمين يُعطي نفس النتيجة, ولكن الطريقة الأولى هي الأكثر قرباً للغة المنطق والأسهل في الكتابة ولكن إن قمنا بالمقارنة من حيث الأداء ففي أغلب الأوقات ستجد أن الإستعﻻمة الثانية(بإستخدام الjoin) تكون أسرع وتفوز من ناحية الأداء, وذلك لأن الexecution plan(سلسلة الخطوات المُتبعة عند تنفيذ إستعﻻمة ) في الjoin عادةً تكون أكثر فاعلية حيث يتم إستخدام خوارزميات معينة لضمان الحصول على أقل كمية من البيانات الغير مهمة ولضمان تسريع عملية البحث , بينما عند إستخدام الsubquery ما يحدث هو أن كل البيانات المتضمنة في الإستعﻻمة الداخلية(subquery) يتم جلبها مما يؤثر على أداء قاعدة البيانات مؤخراً يتم تحسين الquery optimizer لأغلب قواعد البيانات ويتم سد تلك الفجوة في الأداء بشكلٍ ملحوظ, ولكن بشكلٍ عام فإن الjoin أسرع ويتم إعتبارها الطريقة الطبيعية لتنفيذ ذلك النوع من الإستعﻻمات, حتى إن في كثيرٍ من الأوقات عند كتابة الsubquery فما يحدث خلف الكواليس هو أن قاعدة البيانات تقوم بتحويل تلك الsub query إلى جملة join مما يعني أن الjoin تُوفر عدداً من الخطوات بغرض تحسين الأداء
  13. طريقتك لإستعمال الfirebase هي طريقة الإصدار 8 , بينما في الغالب أنت تعمل بإستخدام الإصدار9 في الإصدار التاسع تختلف طريقة عمل الfirebase مع react حيث نقوم بدلاً من import firebase from '@firebase/app'; import '@firebase/storage'; نقوم بإستيراد import { initializeApp } from "firebase/app"; import {getStorage, ref} from "firebase/storage"; ونقوم بإعداد الfirebase بإستخدام دالة الinitializeApp وتمرير الإعدادات الخاصة بالمشروع const app = initializeApp(firebaseConfig) ويجب أن يكون لديك كائن للإعدادات(firebaseConfig) حيث يحتوي على اعدادات المشروع كما بالشكل التالي const firebaseConfig = { apiKey: "your api key", authDomain: "your authDoomain", databaseURL: "your database", projectId: "project id", storageBucket: "storage bucket", messagingSenderId: "message id", appId: "your app id", measurementId: "measurement id" }; وللحصول على ذلك الملف يمكنك الدخول إلى موقع فاير بيز وأختيار مشروعك ومن ثم تذهب إلى قائمة ال project settings ومن ثم يمكنك الحصول على كائن التخزين storage والref بالشكل التالي const storage = getStorage(app); const image_ref = ref(storage,"/images");
  14. بالإضافة إلى إجابة أستاذ أحمد, يوجد مواقف تحتاج أن تستخدم فيها الأسماء المستعارة (aliases) حتى تتمكن من تنفيذ الجملة الإستعﻻمية المُراد تنفيذها, مثلاً إن كان لدينا الجدول employee وأردنا أن نجلب جميع الموظفين الذين لديهم نفس المدينة, وقتها نحتاج أن نقوم بما يُدعى بالself join حيث أنك تقوم بكتابة جملة join ولكن بدلاً من أن تكون بين جدولين تكون بين الجدول ونفسه, مثال: SELECT a.name AS name1, n.name AS name2, a.City FROM Customers a, Customers n WHERE a.id <>n.id AND a.City = n.City بدون إعطاء أسماء مستعارة لن نتمكن من تفنيذ جملة مثل السابقة
  15. الأفضل دائماً وأبداً أن تختار نوع البيانات الأقل في المساحة التخزينية, لأن ذلك أولاً سيحفظ بعض المساحة لدى قاعدة البيانات, بالإضافة لزيادة سرعة إستقبال البيانات من قاعدة البيانات, بالإضافة إلى إمكانية الحصول على فهرسة أقل في المساحة بما أن الحالة لها قيم محددة (discrete values) فإذاً من المُفضل إختيار نوع البيانات عددي بدلاً من نصي, لأن الأعداد أقل مساحةً من النصوص, ويمكنك إختيار نوع بيانات عددي صغير نسبياً مثل ال tinyint والtinyint عبارة عن نوع بيانات عددي صحيح يحمل بيانات فقط تتراوح من القيمة 0 حتى 255 ومساحته التخزينية عبارة عن 1 بايت (1byte) وتكون طريقة التخزين كالتالي, نعطي كل حالة رقم معين, مثلاً الإستﻻم نعطيها الرقم 1, قيد التوصيل نعطيه الرقم2 , قيد الطهي الرقم 3 وهكذا, وبدلاً من تخزين الحالات كنصوص نقوم بتخزينها كأرقام
  16. من الممكن القيام بمثل ذلك عبر منصة heroku , نبدأ أولاً بتثبيت heroku command line عبر الأمر التالي لمستخدمين ليونكس sudo snap install --classic heroku وعبر الرابط التالي لمستخدمي ويندوز https://cli-assets.heroku.com/heroku-x86.exe بعد ذلك نقوم بتسجيل الدخول الى حساب heroku الخاص بك عبر نافذة الأوامر بالشكل التالي heroku login Enter your Heroku credentials: Email: your_email.com Password: ********* قم بإنشاء ملف runtime.txt في مجلد المشروع وقم بتحديد اصدار البايثون فيه, على سبيل المثال python-2.7.12 نقوم بانشاء ملف الprocfile في مجلد المشروع لتحديد الأوامر المراد تنفيذها عند بدأ تشغيل المشروع على heroku touch Procfile ومن ثم نقوم بإضافة الأمر التالى في الملف والذي يحدد خادم الويب الذي سيُستخدم في تشغيل المشروع web: gunicorn djangoherokuapp.wsgi --log-file - ومن ثم نقوم بتعديل ملف الsettings.py ووضع الdependencies التالية بالشكل التالي INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'herokuapp', ] ومن ثم نقوم بتثبيت تلك الإعتماديات من أجل عمل المشروع بشكل صحيح على المنصة pip install gunicorn dj-database-url whitenoise psycopg2 ولنجعل heroku يعلم أن المشروع المُراد تثبيته هو مشروع python نقوم بإنشاء ملف requirements.txt pip freeze > requirements.txt ونقوم بتحديد الdependencies وإصداراتها في الملف dj-database-url==0.4.2 Django==1.11.7 gunicorn==19.7.1 psycopg2==2.7.3.2 pytz==2017.3 whitenoise==3.3.1 إن كان المشروع يحتوي على ملفات ثابتة(static files) مثل الhtml, css, javascript, images فإن للأسف heroku ﻻ يقوم بدعم التعامل مع تلك الملفات بشكل إفتراضي لذا سنقوم بإستخدام الwhitenoise الذي قمنا بتثبيته مسبقاً وكتابة الأوامر التالية في ملف الsettings.py PROJECT_ROOT = os.path.join(os.path.abspath(__file__)) STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles') STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(PROJECT_ROOT, 'static'), ) STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' ومن ثم نقوم بإضافة الخدمات الوسيطة(middle ware ) في ملف الsettings.py MIDDLEWARE = [ 'whitenoise.middleware.WhiteNoiseMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] نقوم بعد ذلك بإنشاء المشروع على heroku عبر الأمر التالي heroku create herokudjangoapp نقوم بعد ذلك بتهيئة مستودع git عبر الأمر التالي git init ومن ثم نحتاج لربط ذلك المشروع بالمشروع الذي لدينا على الحاسب heroku git:remote -a herokudjangoapp ومن ثم نقوم بتنفيذ الأوامر التالية من أجل رفع المشروع على heroku git add . git commit -m "first commit" git push heroku master سيستغرق ذلك بعضاً من الوقت ومن ثم ستجد المشروع قد تم رفعه بنجاح
  17. rsync هو برنامج يُستخدم لعمل مزامنة بين المجلدات, حيث يجعل المجلد 1 نسخة طبق الأصل من المجلد 2 , ينسخ الملفات الناقصة, ويحذف الملفات الزائدة أولا نقوم بتثبيت البرنامج عبر الterminal sudo apt-get install rsync بعد ذلك يمكننا إستخدامه بالشكل التالي rsync -av --delete /Directory1/ /Directory2/ الخيار a يجعل البرنامج ينسخ المجلدات أيضاً وليس الملفات فقط, الأمر v جعل البرنامج يقوم بطباعة رسالة يشرح فيها ما حدث تحديداً في التنفيذ, الخيار --delete يخبر البرنامج أن يقوم بحذف أي ملفات زائدة, يمكننا إزالة هذا الخيار إن لم نريد تلك الوظيفة لجعل هذا البرنامج يعمل بشكل تلقائي كل يوم, يمكننا إستخدام برنامج cron وهو برنامج من أجل عمل مهام دورية في نظام لينكس crontab -e ذلك الأمر سيقوم بفتح جدول مهام الcron يمكننا تعديل الجدول ليوافق إحتياجاتنا ونضع به المهام التي نريدها 0 20 * * * rsync -av --delete /hsoub1/ /hsoub2/ هذا الأمر سيجعل البرنامج يتم تنفيذه كل يوم في الساعة 20(الثامنة ليلاً) في الدقيقة صفر
  18. tar هو برنامج للأرشفة , ويتم إعداده بالشكل التالي نقوم أولا بتثبيت البرنامج عبر الterminal (ملحوظة قد يطلب منك الرقم السري للمُستخدم بسبب إستخدامك للأمر sudo ) sudo apt-get install tar tar-doc ونستخدمه عن طريق الأمر التالي, مع إستبدال كلمة option بالخيارات التي تريدها, وإستبدال كلمة file بمسار الملف المُراد أرشفته tar Option File فمثلاً في المثال التالي يُعبر الخيار c عن إنشاء أرشيف جديد, والخيار z عن الضغط والخيار f يُعبر عن كتابة الناتج في الأرشيف , فيتم إذا أرشفة الملفان example_1 و example_2 وكتابة الناتج في الأرشيف hsoub tar -czf hsoub.tar.gz example_1.txt example_2.txt
  19. المثال الأول أفضل من ناحية الأداء , حيث أن في المثال الأول سيتم فلترة الجدول Orders ليتوافق مع الشرط الموضوع بعد كلمة on ومن ثم إختيار العناصر المناسبة INNER JOIN Orders o on p.ProductID = o.ProductID بينما في الشرط الثاني سيتم إختيار عناصر الجدول orders كلها أولاً ومن ثم تتم عملية الفلترة , مما يعني إختيار عناصر أكثر وعمليات بحث أكثر
  20. يُمكنك تنفيذ ذلك عبر إستخدام الإتحاد(union) حيث وظيفة خاصية الإتحاد أن تقوم بدمج عناصر مجموعتين ليصبحو ع هيئة مجموعة واحدة فمثلاً {1, 3, 7, 5} union {2, 4, 6, 8} = {1, 2, 3, 4, 5, 6, 7, 8} ويتم تنفيذه في لغة sql بالشكل التالي (SELECT * FROM a) UNION (SELECT * FROM b) وتقوم بتبديل a و b بإسم الجداول المُراد دمجها
  21. يوجد weak entity وهي روشتة العﻻج(مجموعة العﻻج التي يقترحها الطبيب) , كما أنه يوجد واحدة أخرى وهي العقد بين الصيدلية والشركة ويوجد عﻻقة ثﻻثية(ternary ) بين الصيدلية وشركة الأدوية والدواء
  22. يخبرك في البداية أن كل دواء يتم بيعه بواسطة شركة دواء واحدة فقط ﻻ غير, نستنتج من هذا وجود عﻻقة one-to-many بين الدواء والشركة, والشركة في هذا الحالة هي الone والدواء هو الmany , ولكل جدول دواء يحمل خاصيتين, الأولى هي المعادلة والثانية هي العﻻمة التجارية, مع الأخذ بالإعتبار هنا أن العﻻمة التجارية حقل نادر ﻻ يمكن أن يتواجد لدى أكثر من تسجيل بالنسبة لجدول الشركة لها مفتاح أساسي(primary key) مكون من كلاً من الإسم ورقم الهاتف معاً بعد ذلك يخبرك أن لكل مريض طبيب واحد ولكل طبيب ع الأقل مريض مما يعني أن جدول المريض والطبيب بينهما عﻻقة one to many والواحد هو الطبيب, والكثير هو المريض المريض لديه مفتاح رئيسي وهو حقل الssn وله حقول أخرى الإسم والعنوان والسن الطبيب أيضا لديه في الجدول مفتاح رئيسي وهو الssn وحقول أخرى ليست رئيسية وهي الإسم والتخصص وعدد سنين البرة كل صيدلية تبيع عدد من الأدوية والدواء يمكن أن يباع في أي صيدلية, نفهم من هذه الجملة أن بين جدول الصيدلية وجدول الدواء عﻻقة many-to-many لكل صيدلية عنوان واسم ورقم هاتف وسعر الدواء حيث أن سعر الدواء يختلف من صيدلية لأخرى فسيتم وضعه إذا في الجدول المنفصل الذي سيربط الجدولين ببعض الطبيب من الممكن أن يقترح مجموعة عﻻج للمرضى ولكل مجموعة عﻻج تاريخ وكمية للدواء, مما يعني أن سيكون هناك عﻻقة بين جدول الطبيب وجدول الدواء وسيتم الربط بينهما في جدول خارجي شركة الأدوية من الممكن أن تتعاقد مع أكثر من صيدلية والصيدلية يمكنها التعاقد مع أكثر من شركة مما يعني وجود عﻻقة many-to-many ولكل عقد يتم تخزين تاريخ البدأ والإنتهاء ونص العقد, ويتم تخزين تلك المعلومات في جدول يربط بين الصيدلية والشركة
  23. حاول التطبيق على الأشياء التي تعلمتها من الدورة أولاً, من المُفترض أن تكون قد طبقت وراء المُحاضر بناء موقع شخصي, حاول الأن أن تقوم بإنشاء موقع أخر , ستقابلك بعض المشاكل في محاولتك لإنشاء الموقع , إبحث عن المشاكل وحاول حلها بنفسك حتى تجني أكبر إستفادة ممكنة, إن لم تستطع حلها قم بسؤالنا وسنساعدك قدر المستطاع , وتأكد أنك فهمت أساسيات تطوير الويب بشكلٍ جيد إن كان هنالك شئُ غير واضح بالنسبة إليك قم بنشر سؤالك وسنحاول تبسيطه وتوضيحه ولكن ﻻ تدع شيئاً غير مفهوم او غير واضح بعد ذلك قم بإكمال تعلم بناء واجهة مستخدم تشبه موقع الyoutube مع مراعاة التطبيق وراء المُحاضر خطوة بخطوة والسؤال عن الأشياء الغير واضحة
  24. مرحباً شوق ﻻ يجب أن يحل أحد تكليفاتك, بدلاً من ذلك حاول حلها بنفسك وأنشر سؤال عن الجزئية التي ﻻ تفهمها تحديدا او الجزئية التي يواجهك فيها صعوبة وتحتاج إلى توضيح
  25. الHTTP(Hyper text transfer protocol) هو عبارة عن بروتوكول مُستخدم في نقل البيانات عبر الشبكة يتكون الHTTP من طلب ورد (request& response) ويكون جزأ الطلب مُقدم من المُستخدم (مثل المتصفح) , وجزأ الرد مُقدم من قِبل الخادم ,فمثلاً عند الضغط على زر تسجيل الدخول, يتم إرسال طلب(HTTP Request) إلى الخادم ويكون هذا الطلب حاملاً لبيانات التسجيل مثل البريد الإلكتروني وكلمة السر, ثم يرد الخادم بHTTP Response يحمل البيانات الﻻزمة التي يحتاجها المُستخدم للتعامل مع الموقع كأنه مُسجل يتم إرسال البيانات في الطلب والرد على هيئة نصوص غير مُشفرة, مما يعني أنه إذا إستطاع شخصٌ ما التصنت على الشبكة سيستطيع سرقة البيانات التي يتم تبادلها بين الخادم والمُستخدم, هنا يأتي دور الHTTPS حيث أنها هي هي الHTTP ولكن مَُضاف إليها طبقة حماية حيث تقوم بتشفير البياانات المُتبادلة بين الخادم والعميل لضمان عدم سرقتها في حالة التصنت عليها وبالنسبة لكلمة السر فﻻ يجب تشفيرها وقت تبادل البيانات في حالة إستخدام الHTTPS ولكن بالطبع يجب تشفيرها بواسطة دالة التجزئة(Hash function) قبل إدراجها في قاعدة البيانات
×
×
  • أضف...