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

سمير عبود

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

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

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

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

    34

كل منشورات العضو سمير عبود

  1. مرحباً @salahkr نعم بإمكانك الإعتماد على إطار Bootstrap أو أحد الأطر الأخرى ك Foundation أو Bulma أو Materialize ... أو يُمكنك إستخدام tailwind الذي يُعتبر أيضاً إطار عمل من المستوى المنخفض خاص بالcss فعِوض أن تكتب خصائص css ستقوم بكتابة مجموعة من الأصناف (classes) تُعبر عن كل خاصية في كل عنصر و هذا التوثيق الخاص بكل إطار: Tailwind Materialize Bootstrap Bulma Foundation لكن قد تجد نفسك أحياناً في حالات تُحتم عليك تعديل بعض الأشياء و في هذه الحالة سيتوجب عليك كتابة css العادي أحياناً المشروع ككل عبارة عن صفحة واحدة لعرض مُنتج أو صفحة نزول لتطبيق إلكتروني يُمكنك في هذه الحالة إستخدام الcss العادي لأنك بطبيعة الحال لن تحتاج لكافة الكلاسات و الخصائص التي يُوفرها إطار العمل. عند إستخدامك لإطار العمل ستجد نفسك مقيد بالقيم التي يوفرها بعكس عند إستخدامك للcss العادي فستكون لديك الحُرية الكاملة لإستخدام القيم التي تريد. بالتوفيق.
  2. العداد coun يبدأ من 0 إلى الإرتفاع بمعنى إذا كان hgt == 3 فسيكون تكرار الحلقه الخارجية 3 لأن العداد يبدأ من 0 و سيأخذ القيم 0، 1، 2 و هو ما يوافق عدد الصفوف أو الإرتفاع 3 العداد w يأخذ قيما متعلقة ب coun فعندما يكون coun == 0 سيتم الدخول إلى الحلقة الداخلية و تنفيذ محتواها و هذا إذا كان الشرط فيها أقل أو يساوي و بالتالي سيتم طباعة # مرة واحدة. أما عندما يكون coun == 2 فتكرار الحلقة الداخلية سيكون 3 و w سيأخذ القيم 0، 1، 2 و بالتالي سيتم طباعة ### 3 مرات و بهذا الشكل نكون قد حققنا الهرم المطلوب: hgt == 3 coun == 0, 1, 2 : ثلاثة لفات تقابلها 3 صفوف في الهرم w في اللفة الأولى للحلقة الخارجية سيكون 0 و بالتالي طباعة # مرة واحدة ثم الإنتقال إلى سطر جديد w في اللفة الثانية للحلقة الخارجية سيكون 0 ثم 1 و بالتالي طباعة ## مرتين ثم الإنتقال إلى سطر جديد w في اللفة الثالثة للحلقة الخارجية سيكون 0 ثم 1 ثم 2 و بالتالي طباعة ### ثلاث مرات ثم الإنتقال إلى سطر جديد و في هذا الوقت سيكون coun == 2 و عند رفع قيمته ب 1 سيُحقق شرط الخروج من الحلقة الخارجية لأن hgt == 3 ثم إنهاء البرنامج و النتيجة ستكون # ## ### بالتوفيق.
  3. نعم هذا صحيح فالدورات تبدأ معك من البداية لكن أنا نصحتك بدراسة مسار مدخل إلى علوم الحاسوب لأنه سيُسهل عليك فهم دروس لغة روبي كثيراً . اتمنى لك التوفيق
  4. مرحباً @هشام عثمانيه إذا كنت مبتدئ و مهتم بلغة روبي أنصحك قبل كل شيء بدراسة المسار الأول من دورة علوم الحاسوب لأنه عند إشتراكك في أي دورة من دورات الأكاديمية ستستطيع الوصول إلى المسارات الأولى من بقية الدورات الأخرى. لذلك عند إشتراكك في دورة روبي إبدأ بمسار مدخل إلى علوم الحاسوب لأنه يشرح أساسيات البرمجة و الخوارزميات و التفكير المنطقي بأسلوب سهل و مُبسط وشيق. بعد إنهاء هذا المسار ستتمكن من فهم مسار أساسيات لغة روبي و ذلك بمساعدة المدربين أيضاً لأن الأكاديمية توفر لك مجموعة من المدربين لمساعدتك و الرد على إستفساراتك في أي وقت من خلال طرحها في صندوق التعليقات المخصص لكل درس. بالتوفيق.
  5. أولا عليك فهم طريقة كتابة الحلقة for: for ( init; condition; increment ) { // code here } init: يتم تنفيذه مرة واحدة في البداية ويتم فيه تهيئة المتغيرات condition: هو شرط يتم التحقق منه في كل لفة إذا كان الشرط صحيح يتم تنفيذ ما بداخل الحلقة من تعليمات إذا كان خاطئ يتم الخروج من الحلقة. increment: في هذا الجزء يُمكنك تغيير قيمة متغيرات التحكم في الحلقة و يتم تنفيذه كل مرة بعد تنفيذ التعليمات التي بداخل الحلقة و بعده يتم التحقق من الشرط ثانية. لذلك فمقدار التكرار مُعتمد على هذه الأجزاء الثلاثة لكن وجودها ليس ضروري لكن وجود الفاصلة المنقوطة التي تفصل بين هذه الأجزاء ضروري فمثلاً يُمكن أن نجد شيء هكذا: #include <stdio.h> int main() { int i = 2; // init for( ; ; ) { if(i >= 10) { // condition break; } printf("%d\n", i); i += 2; // increment } return 0; } و هذا المُخطط يُوضح طريقة عمل حلقة for: بالتوفيق.
  6. مرحباً @Abderahman Benchalel فلتأخذ البرنامج خطوة بخطوة: أولا: int hgt; هنا قمنا بتعريف متغير من النوع العددي(int) ثانياً: do{ hgt = get_int("height:\n"); } while(hgt < 1 || hgt > 8); في هذا الجزء نقول للبرنامج كرر ما بداخل الحلقة ما دام الإرتفاع الذي يُدخله المُستخدم أصغر تماماً من 1 أو أكبر تماماً من 8 بمعنى إذا أدخل المستخدم عدداً صحيحا من المجال [1,8] سيمر إلى التعليمة التي بعد حلقة do .. while غير هذا سيبقى يسأل المُستخدم عن إدخال الإرتفاع. ثالثاً: for(int count = 0; count < hgt; count++) { // التعليمات التي بداخل هذه الحلقة ستتكرر حسب الإرتفاع for(int w = 0; w < count; w++) { printf("#"); } printf("\n"); } لفهم هذين الحلقتين فلنأخذ مثال و لنجعل hgt = 3 الحلقة الأولى العداد count سيأخذ القيم التالية: 0, 1, 2 من أجل كل قيمة من القيم الثلاثة سنقوم بعمل حلقة سيأخذ العداد w فيها قيماً متعلقة بقيمة العداد الأول بمعنى - عندما يكون count == 0 لن يتم تنفيذ الحلقة الثانية و سيتم تنفيذ فقط أمر الطباعة printf("\n"); و هو يعني أترك السطر الحالي و إنتقل إلى سطر جديد - عندما يكون count == 1 الحلقة الثانية ستتكرر مرة واحدة و السبب أن w سيأخذ قيما من هذا المجال [0, 1[ أي سيأخذ قيمة واحدة و هي 0 و بالتالي سيتم طباعة # مرة واحدة ثم يخرج من الحلقة الداخلية و بالتالي سيجد أمر الإنتقال إلى سطر جديد. - عندما يكون count == 2 الحلقة الثانية ستتكرر مرتين و السبب أن w سيأخذ قيما من هذا المجال [0, 2[ أي 0 ثُم 1 و بالتالي سيتم طباعة ## و بالتالي سيكون الناتج: # ## حتى نحصل على الشكل الصحيح على الحلقة الثانية ان تكون بهذا الشكل: for(int w = 0; w <= count; w++) { printf("#"); } حتى تفهم منطق الفكرة عليك أن تُفكر أنه لدينا جدول عدد صفوفه هو hgt و عدد أعمدته هو hgt و كل خانة مُحددة بإحداثيتن (count, w) بحيث count هو رقم الصف و w هو رقم العمود و نريد ملأ خاناته بهذا الرمز # نحتاج بشكل أساسي إلى حلقتين متداخلتين 1- إذا كنا نريد ملأ كافة الخانات فسيكون تكرار الحلقة الداخلية نفس تكرار الحلقة الخارجية من أجل كل قيمة لعدادها أي أن count سيأخذ قيما من 0 إلى hgt و من أجل كل قيمة له سيأخذ w قيماً من 0 إلى hgt أيضاً. 2- إذا كنا نريد ملأ فقط الخانات التي تحت القطر أو الوتر: الخانات القُطرية هي التي تقع في (1, 1) , (2, 2) ... , (hgt, hgt) بمعنى أن الخانات القطرية يكون فيها الصف يُساوي العمود و في هذه الحالة سيكون تكرار الحلقة الداخلية متعلق بقيمة عداد الحلقة الأولى يعني أن عداد الحلقة الداخلية سيأخذ قيماً من 0 إلى قيمة عداد الحلقة الخارجية في تلك اللفة. بالتوفيق .
  7. مرحباً @Bassel Ahmed لغة البرمجة التي بنيت عليها هذه المكتبة هي لغة JavaScript لذلك تحتاج إلى تعلم أساسيات لغة JavaScript ثم تنتقل إلى تعلم معايير ES6 وما فوق و بعدها تتعلم أساسيات node.js. من خلال الموقع الرسمي للمكتبة فهي تعتبر وحدة خاصة ب node.js للتعامل مع الBots BOT: هو تطبيق برمجي يتم بناؤه لعمل بعض المهام الإعتيادية المتكررة و يعمل بشكل اوتوماتيكي و بشكل اسرع. Node.js : هو نظام برامج مبني على محرك chrome JavaScript v8 و تم عمله لبناء تطبيقات انترنت قابلة للتوسع كخوادم ويب لأن لغة جافاسكربت تعمل فقط في المتصفح و بإستخدام node.js يمكننا إستخدامها في جهة الخادم أيضاً Es6: هي عبارة عن معايير موحدة تم عملها من قبل منظمة متخصصة. بالتوفيق
  8. مرحباً بك نعم يمكنك إستبدال أسماء المتغيرات بأي إسم آخر تراه مناسب لك وذلك وِفق قواعد تسمية المتغيرات لكن عليك تغيير كافة مواضع المتغيرين f1 و f2 بالمتغيرات الجديدة التي اخترتها. بالتوفيق.
  9. مرحباً @Momen Gamal التعبير البرمجي الشرطي ( if statement ) متشابه في كافة لغات البرمجة و يُكتب بهذا الشكل: if (condition) { // في حالة تحقق الشرط } else { // في حالة عدم تحقق الشرط } أما الشرط المٌختصر أو كما يُسمىConditional (ternary) operator فيُكتب بهذا الشكل: condition ? exprIfTrue : exprIfFalse بمعنى إن كان الشرط صحيح نفِذْ ما بعد علامة الإستفهام و إن كان خاطئ نفِذْ ما بعد النقطتين مثلاً: نريد إنشاء دالة لإرجاع القيمة الأكبر (max) من قيمتين أي أننا سنقوم بإنشاء دالة تقبل وسيطين و ترجع الأكبر 1- بإستخدام if statement العادية: function max(n1, n2) { var max; if(n1 > n2) { max = n1; } else { max = n2; } return max; } 2- بإستخدام ال ternary operator: function max(n1, n2){ var max = (n1 > n2) ? n1 : n2; return max; } أو يُمكننا الإستغناء عن المتغير max بهذا الشكل: function max(n1, n2){ return (n1 > n2) ? n1 : n2; } مراجع: 1- MDN 2- موسوعة حسوب 3- javascript.info كما يُمكنك إلقاء نظرة على هذا المقال: بالتوفيق.
  10. مرحباً صالح لا يُمكن معرفة صلاحية الكوبون من عدمه لذلك أنصحك بالتواصل مع فريق الدعم للإستفسار عن الأمر و سيردون عليك في أقرب وقت. يُمكنك زيارة مركز المساعدة من خلال هذا الرابط: إضغط هنا و قُمْ بفتح تذكرة للإستفسار و إن كان الكوبون صالح سيُعلِمونك بذلك. و إن كان معك كوبون صالح يُمكنك إستعماله من خلال: كما يُمكنك الإستفسار من فريق الدعم كيفية إستعماله و الإستفادة منه أيضاً. بالتوفيق.
  11. مرحباً فايزة . بدايةً أدعوك للإطلاع على بعض من مقالات الأكاديمية بخصوص لغة روبي و فهمها من خلال الرابط التالي: إضغط هنا و برأيي عدم التسرع في الإنتقال إلى المسارات القادمة و فهم الأساسيات جيداً لأن فهمها جيداً سيُسهل عليك باقي المسارات حتى ولو اظطررتي لإعادة المسار الأول ثانيةً . إذا كانت الأمور تبدو صعبة الفهم عليك و هذا ما ألاحظه فأنصحك بمشاهدة المسار الأول من دورة علوم الحاسوب لأنه سيكون مفتوح لكِ كما أنه يشرح أساسيات البرمجة و الخوارزميات بأسلوب سهل و مُبسط بعد إنهاء هذا المسار ستتمكنين من فهم مسار أساسيات لغة روبي و ذلك بمساعدة المدربين أيضاً . الصبر و التطبيق العملي مفتاح تعلم البرمجة لا تتسرعي في مُشاهدة الدروس و تخطيها بدون فهم لأن هدفنا ليس إتمام الدورة و إنما فهم فحواها و ما ترمي إليه حتى و لو أخذ منك المسار الأول وقتاً طويلاً. قد يأخذ منك درس واحد مدة 3 أيام لفهمه و هذا هو الأهم لا تكترثي لأي شيء آخر فأغلبنا مر بهذا الأمر في البداية. أنصحك و أنت تشاهدين الدرس بوضع دفتر بجانبك لكتابة بعض الملاحظات المهمة التي يقولها المُدرب لأنكِ ستحتاجين لها للمراجعة في الدروس الموالية أتمنى أن تأخذي هذه النقاط على مُحمل الجد لأنها ستكون مفيدة و مُساعدة لك. دعني أعطيك مثال على درس المتغيرات و العمليات مثلاً: المدرب يعطيك مفاهيم و أمثلة بسيطة بعد مُشاهدة الدرس و كتابة ملاحظاتك و التطبيق مع المُدرب تأتي مرحلة التطبيق مع نفسك و في هذه المرحلة ستُخالفين المُدرب فيها و تجربين أشياء من عندك حتى و لو كانت هذه الأشياء خاطئة إذا ظهرت لك أخطاء ما يُمكنك الرجوع إلى ملاحظاتك أو حتى إعادة الدرس فمثلاً لو قام المُدرب في الدرس بجمع عددين و عرض الناتج ستقومين أنت بجمع 3 أعداد و طرح عدد رابع منها و تطبعين النتيجة و هكذا في الدروس القادمة و بهذا الشكل سيتطور مُستواك شيئاً فشيئاً . أتمنى لكِ التوفيق
  12. مرحباً غالباً ستجدين ملف php.ini ضمن مُجلد php قومي بإتباع الطريقة التي ذكرها الأخ وائل و ستتمكنين من تفعيل إضافة curl. بعد التعديل يُنصح بإيقاف الخادم و إعادة تشغيله مرة ثانية بالتوفيق.
  13. مرحباً @خالد مجذوب البدايات دائماً ما تكون صعبة فحتى تتعود على كتابة الأكواد بنفسك عليك أن تُطبق كثيراً لا تحفظ الأشياء و إنما تعلم كيفية عملها طبق وراء المُدرب كثيراً و أعطِ لنفسك وقت لفهم و إستيعاب الدرس جيداً و لا تنتقل إلى الدرس المُوالي قبل فهمك للدرس الحالي , لا تعتمد فقط على مقاطع الفيديو و الدروس المرئية هناك دروس و مقالات على الأكاديمية ستُفيدك أيضاً اعتمد على موسوعة حسوب فبها توثيق لمُعظم اللغات و التقنيات. بعد إنهائك لمسار من المسارات لا تنتقل مباشرة إلى المسار القادم حاول التفكير في عمل مشروع صغير بالمعرفة و المعلومات التي كسبتها من خلال المسار و من خلال بحثك من هنا و هناك. لا تقلق إن نسيت شيء فيُمكنك الرجوع له في أي وقت و هذا ليس شيء خاطئ بالعكس فهذا شيء جيد فنحن لا نحفظ الشيفرات البرمجية. عند عملك لمشروعك الصغير ستواجهك بعض المشاكل هذه الأخطاء و المشاكل هي ما يجعلك مُحترف و يجعل مُستواك يرقا و يتطور حاول إيجاد حلول لها جرب الحلول التي تراها مناسبة و لا تخف منها جرب حتى ولو كان ما يمليه عليك عقلك خاطئ إبحث من خلال مُحرك البحث أو إسأل هنا في الأكاديمية أو في مجتمع حسوب. ستُلاحظ بعد إنجازك لشيء أو فكرة من مخيلتك ببعض من الراحة و هذا ما سيُعطيك دافع للإستمرار في التعلم . طبق هذه المراحل على كافة مسارات الدورة و ستُلاحظ فرق في المُستوى. في الأخير أريد أن أنوه لشيء و هو أن المرء لن يُصبح خبيراً بين ليلة و ضحاها يحتاج وقت و صبر ومثابرة وإرادة. عليك بالتطبيق العملي كثيرا حتى و لو كنت تٌطبق مع المُدرب أو من فيديو سيأتي وقت و تتعود و تتمكن من الإعتماد على نفسك حاول مُخالفة المُدرب قليلا و جرب بعض الأمور من عندك فهذا سيفيدك أيضاً. آمل أن أكون قد أفدتك بشيء أتمنى لك التوفيق.
  14. مرحباً @Ali Kangooni إذا كنت تريد عرض ثلاث صور مثلاً و عند الضغط على أحد هذه الصور تقوم بعرض صورة من 3 صور أخرى تكون مخفية و تريد عرض هذه الصورة عشوائياً يُمكنك إستخدام هذه الطريقة: اولاً تقوم بإضافة كافة الصور إلى صفحة ال html الخاصة بك بهذا الشكل مثلا: <img id="img_1" src="https://via.placeholder.com/200?text=1" alt="صورة 1"> <img id="img_2" src="https://via.placeholder.com/200?text=2" alt="صورة 2"> <img id="img_3" src="https://via.placeholder.com/200?text=3" alt="صورة 3"> <img id="img_4" src="https://via.placeholder.com/200?text=4" alt="صورة 4"> <img id="img_5" src="https://via.placeholder.com/200?text=5" alt="صورة 5"> <img id="img_6" src="https://via.placeholder.com/200?text=6" alt="صورة 6"> هنا قمنا بإستعمال موقع placeholder لإضافة صور للصفحة كما قمنا بإعطاء كل صورة مُعرف id خاص بها و ستظهر الصور بهذا الشكل: ثانياً نقوم بإخفاء الصور 4 و 5 و 6 و ذلك بإستخدام خاصية display و نقوم بإعطائهم الصنف المُشترك hidden كي نستطيع تحديدهم لاحقاً بالجافاسكربت بهذا الشكل: <img id="img_4" class="hidden" style="display: none;" src="https://via.placeholder.com/200?text=4" alt="صورة 4"> <img id="img_5" class="hidden" style="display: none;" src="https://via.placeholder.com/200?text=5" alt="صورة 5"> <img id="img_6" class="hidden" style="display: none;" src="https://via.placeholder.com/200?text=6" alt="صورة 6"> ثالثاً نقوم بإعطاء الصنف clicked_img للصور 1 و 2 و 3 لأننا سنستخدمه في الجافاسكربت أيضا بهذا الشكل: <img id="img_1" class="clicked_img" src="https://via.placeholder.com/200?text=1" alt="صورة 1"> <img id="img_2" class="clicked_img" src="https://via.placeholder.com/200?text=2" alt="صورة 2"> <img id="img_3" class="clicked_img" src="https://via.placeholder.com/200?text=3" alt="صورة 3"> الآن الصفحة تحمل 6 صور 3 منهم معروضة و 3 مخفية . رابعاً ننتقل إلى جزء الجافاسكرت و سنستخدم مكتبة jQuery لأنها ستُسهل كتابة الشيفرات لذلك سنقوم بتضمينها أولاً بهذا الشكل: <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> خامساً نحتاج إلى كتابة دالة بإستخدام لغة جافاسكربت تقوم بإرجاع كل مرة رقم عشوائي نحن نقوم بتحديد المجال فقط: function randomInteger(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } هذه الدالة تقوم بإرجاع كل مرة رقم عشوائي يكون محصور بين min و max فلو حددنا عند منادة الدالة المعاملات 4 و 6 فستجلب كل مرة رقم عشوائي 4 أو 5 أو 6. سادساً نقوم بكتابة شيفرات الجافاسكربت التي تقوم بمعالجة حدث النقر على الصور الثلاثة الأولى و التي أعطيناها الصنف clicked_img بهذا الشكل: $('.clicked_img').on('click', function() { // clicked_imgبمعنى قم بالتسمع لحدث النقر على أي من العناصر التي تحمل الصنف $('.hidden').hide(); // في حالة حدوث الحدث قم بإخفاء أي عنصر يحمل الصنف hidden var rand = randomInteger(4, 6); // إستدعاء الدالة السابقة لجلب رقم عشوائي من 4 إلى 6 $('#img_' + rand).show(); // بالإستعانة بالرقم العشوائي نكون مُعرف أحد الصور المخفية و نقوم بتحديد العنصر و إظهاره }) سابعاً في حالة كان أحد الصور الثلاثة 4 أو 5 أو 6 ظاهراً و قمنا بالضغط عليه نقوم بإخفائه بهذا الشكل: $('.hidden').on('click', function() { $(this).hide(); }) و هذه ال pen تطبيق للمثال و الشرح أعلاه: بالتوفيق.
  15. يُمكنك دائما قراءة التوثيق الرسمي للتقنية او لغة البرمجة فمثلا typescript: هذا التوثيق الرسمي الخاص بها: إضغط هنا أيضا هناك موسوعة حسوب مرجع المطورين العرب: رابط الموسوعة فهي توفر توثيقاً لمعظم لغات و التقنيات البرمجية. و حتى تكون مُحترف في تقنية ما عليك عمل مشاريع بها بعد تعلم أساسيات هذه التقنية. بالتوفيق.
  16. ال typescript هي مجموعة عليا ( superset ) من جافاسكربت و يتم ترجمة الأكواد والشيفرات التي يتم كتابتها ب TypeScript إلى شيفرات برمجية بلغة JavaScript العادية و ذلك لأن المتصفحات تفهم فقط تعليمات JavaScript . أي أن Typescript هي لغة برمجة . تم تطوير هذه اللغة من قبل شركة Microsoft بهدف تحسين ورفع إنتاجية مطورين جافاسكربت و تعتبر أيضا توسعة للغة جافاسكربت تدعم العديد من ميزات EcmaScript 6 و أيضا تدعم الأنواع و البرمجة الكائنية بما فيها تعريف الأصناف ( classes ) و الواجهات ( interfaces ) ففي لغة جافاسكربت لا نستطيع تحديد نوع المتغيرات فجافاسكربت تتحقق من نوع المتغيرات أثناء تشغيل البرنامج ( runtime ) فهي تعتبر من اللغات Dynamic type checking و هناك لغات تسمى static type checking في هذه اللغات تتم عملية التحقق من الأنواع أثناء الترجمة ( compile time ) و من هذه اللغات نجد c و c++ . نجد أن معظم الأخطاء في كثير من الحالات تكون متعلقة بالأنواع. لذلك فدعم TypeScript للأنواع إضافة جيدة. بالتوفيق.
  17. مرحباً @Momen Gamal أنصحك بالإطلاع على هذا المقال: إضغط هنا فهو يشرح مُعظم نقاط الإختلاف بين الثلاثة و الأمر راجع لك في الأخير فكل مُطور له وجهة نظره و أهدافه و طريقة تعلمه و مجاله. برأيي أن كل من react و vue طريقة تعلمهما أسهل مُقارنة ب angular. ايضا يٌمكنك الإطلاع على هذا الفيديو: و هذا الفيديو باللغة الإنجليزية: بالتوفيق.
  18. مرحباً @Mohammed Aladimi الخطأ يفيد أن الدالة mysqli_query تقبل مُعاملين المُعامل الأول يكون من النوع mysqli و الثاني هو الكويري أو الإستعلام و نوعه string و في الحقيقة أن الدالة تقبل معامل ثالث إختياري هو عبارة عن ثابت يأخذ أحد القيمتين التاليتين: 1- MYSQLI_STORE_RESULT و هو الثابت الإفتراضي أي أننا إذا لم نُحدد سيكون هو المُستخدم 2- MYSQLI_USE_RESULT حسب التوثيق الرسمي أن هذا الثابت نستعمله عندما نريد استرداد كمية كبيرة من البيانات. هناك طريقتين للإستعلام بإستخدام mysqli: 1- الطريقة الإجرائية: ( Procedural ): <?php $connection = mysqli_connect("localhost", "user", "password", "database_name"); // إنشاء رابط الإتصال بقاعدة البيانات // فحص إذا حدثت أخطاء غير متوقعة أثناء الإتصال if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } // إذا تم تجاوز الفحص هذا يعني أن الإتصال تم بنجاح // إذن يُمكننا الإستعلام من قاعدة البيانات if ($result = mysqli_query($connection, "هنا ستقوم بكتابة الإستعلام الذي تريده")) { // نقوم هنا بطباعة النتيجة أو الشيء الذي نريده // code here // أخيراً نقوم بتحرير الذاكرة المرتبطة بالنتيجة mysqli_free_result($result); } // هنا نقوم بإغلاق الإتصال الذي فتحناه مع قاعدة البيانات mysqli_close($connection); ?> 2- عن طريق البرمجة الغرضية التوجه: <?php $mysqli = new mysqli("localhost", "user", "password", "database_name"); // إنشاء كائن أو نسخة من الصنف mysqli // فحص الإتصال if ($mysqli->connect_errno) { printf("Connect failed: %s\n", $mysqli->connect_error); exit(); } // إذا تم تجاوز الفحص هذا يعني أن الإتصال تم بنجاح // إذن يُمكننا الإستعلام من قاعدة البيانات if ($result = $mysqli->query("هنا ستقوم بكتابة الإستعلام الذي تريده")) { // نقوم هنا بطباعة النتيجة أو الشيء الذي نريده // code here // أخيراً نقوم بتحرير الذاكرة المرتبطة بالنتيجة $result->close(); } // هنا نقوم بإغلاق الإتصال الذي فتحناه مع قاعدة البيانات $mysqli->close(); ?> يُمكنك الإطلاع على التوثيق الرسمي: إضغط هنا كما يُمكنك أيضا إستخدام PDO التي تعني PHP Data Objects و تُعتبر إضافة تُعرف واجهة خفيفة للتعامل مع قواعد البيانات المُختلفة و تُوفر هذه الإضافة طبقة تجريد للوصول إلى البيانات يعني أنك ستستخدم نفس الدوال في مُختلف أنواع أنظمة قواعد البيانات ك MySQL و غيرها. بالتوفيق.
  19. مرحباً @عبد الواحد الحدادي نعم بإمكانك تنسيق ال scroll لكن المُشكلة ليست هناك خاصية ثابتة تعتمدها كافة المتصفحات في تنسيقه وليست هناك خصائص رسمية فكل متصفح يستعمل خصائص معينة و خاصة به و هناك متصفحات قديمة لا تدعم فمثلاً متصفحات Webkit اي Safari و Chrome تستخدم العناصر و الأصناف الزائفة التالية لتنسيق شريط التمرير ( scroll bar ) : /* العناصر الزائفة */ ::-webkit-scrollbar { } ::-webkit-scrollbar-button { } ::-webkit-scrollbar-track { } ::-webkit-scrollbar-track-piece { } ::-webkit-scrollbar-thumb { } ::-webkit-scrollbar-corner { } ::-webkit-resizer { } /* الأصناف الزائفة */ :horizontal :vertical :decrement :increment :start :end :double-button :single-button :no-button :corner-present :window-inactive يُمكنك مشاهدة هذه ال pen : إضغط هنا فهي تستخدم هذه العناصر. لكن إن أردت أن يكون تنسيق شريط التمرير نفسه في كافة المتصفحات يُمكنك إستخدام أحد إضافات الجافاسكربت أو الجيكويري و من بين هذه الإضافات nicescroll و هذا مثال عن إستخدامها: طريقة إستخدام الإضافة سهلة ستقوم أولا بتضمين مكتبة الجي كويري ثم تقوم بتضمين الإضافة ثم تقوم بإستخدامها بهذا الشكل <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.nicescroll/3.7.6/jquery.nicescroll.min.js"></script> <script> $(function() { $("#elementID").niceScroll({ cursorwidth: '8px', // تغيير العرض cursorcolor: '#273c75', // تغيير اللون }); }); </script> هناك العديد من الإعدادات و المعاملات يُمكنك الإطلاع عليها من خلال مستودع الإضافة على github من : هنا كما يُمكنك مشاهدة هذا الفيديو فهو يشرح طريقة إستخدامها: بالتوفيق.
  20. مرحباً @Fahad Rahim نعم دروس الدورات تعتمد على gulp 3.9.1. أيضاً مسارات الدورات يتم تحديثها بشكل مُستمر و في هذه الحالة يُمكنك إما متابعة الدورة بنفس الإصدار الذي يستخدمه المُدرب أو إستخدام النُسخة 4 و إذا واجهتك أية مُشكلة يُمكنك الإستفسار عنها من خلال صندوق التعليقات و سنُساعدك في الوصول إلى الحل. عموماً هناك بعض الأشياء التي جاء بها gulp 4 ك gulp.series و gulp.parallel فمثلا لو كانت المهمة تعتمد على مهمات أخرى في gulp 3 كنا نكتب: gulp.task('a', ['b', 'c', 'd']); في gulp 4 لا يمكننا كتابة هذا الشيء وإنما يجب إستخدام gulp.series أو gulp.parallel أو معا بهذا الشكل: gulp.task('a', gulp.series('b', 'c', 'd')); أو gulp.task('a', gulp.parallel('b', 'c', 'd')); بحيث أن series تعني تنفيذ المهمات بالتسلسل أما parallel فتعني تنفيذ المهمات بشكل متزامن و بهذا يتم تقليل وقت التنفيذ. أيضاً في gulp 4 إذا كانت المهمة تحتوي على شيفرات غير متزامنة علينا أن نخبر gulp أن هذه الدالة غير متزامنة بشكل قطعي. في gulp 3 كان الأمر يحدث تلقائياً مثلاً لو قمنا بكتابة هذه المهمة : gulp.task('message', function() { console.log("Hello Gulp 3"); }); ستشتغل في gulp 3 أما في gulp 4 لن تعمل و ستعطي خطأ و لتجاوز هذا الخطأ في gulp 4 هناك عدة طرق من بينها إستخدام async بهذا الشكل: gulp.task('message', async function() { console.log("Hello Gulp 4"); }); أو تنفيذ دالة إرجاع الطلب من داخل المهمة بهذا الدالة: gulp.task('message', function(done) { console.log("Hello Gulp 4"); done(); }); يُمكنك مشاهدة هذا الفيديو لمعرفة كيفية الإنتقال من gulp 3 إلى gulp 4: بالتوفيق.
  21. مرحباً @Abdallah Abdarrahman مع الأسف لن تستطيع تحميل فيديوهات الدورة لأن هذا الشيء غير مسموح به و الأفضل المتابعة أونلاين. مشغل الفيديوهات يدعم الشبكات الضعيفة بإمكانك خفض جودة و دقة المقطع إلى 360p و متابعة الدروس فهذه الجودة لا تحتاج إلى تدفق إنترنت عالي. بالتوفيق
  22. مرحباً @Takla Eshak دورة تطوير تطبيقات الويب باستخدام لغة PHP تُركز بشكل كبير على بناء النظم الخلفية بلغة PHP و إطار العمل Laravel يُستحسن أن يكون لديك معرفة و لو بسيطة بلغة html و css و JavaScript لكن إن قمت بالإشتراك في دورة PHP ستتمكن من الوصول إلى المسارات الأولى من باقي الدورات لذلك قبل البدأ في دورة PHP أنصحك بالإطلاع على المسار الأول من دورة تطوير واجهات المستخدم و الذي هو أساسيات تطوير الويب ففيه ستجد شرح عن أساسيات كل من Html , Css و JavaScript. بالتوفيق
  23. مرحباً @Abdallah Abdarrahman عند إشتراكك بأي دورة من دورات الأكاديمية سيتم إرسال توجيهات و إرشادات لك على بريدك الإلكتروني للوصول إلى مسارات الدورة و كيفية البدأ في الدراسة. إذا واجهت أي مُشكلة في الوصول للدورة يُمكنك دائما مراسلة الدعم الفني من خلال مركز المساعدة وفتح تذكرة بالمُشكلة التي تواجهها و سيقوم فريق الدعم بالرد عليك في أقرب وقت. من خلال حسابك على الأكاديمية ستتمكن من الوصول إلى دوراتك من خلال الرابط التالي: دوراتي أو من خلال القائمة العُلوية: أثناء مُتابعتك للدروس إذا لم تتضح لك المعلومة قم بإعادة الدرس أكثر من مرة حتى تصل للفهم الجيد كما يُمكنك أيضا الإستفسار من خلال صندوق التعليقات أسفل كل درس و سنُقدم لك المُساعدة اللازمة . بالتوفيق
  24. مرحباً @جيروم مينا لا أدري ما الذي تتوقعينه من الأكواد لكن الأكواد متطابقة مع صفحة العرض. 1- إتجاه الصفحة من اليمين إلى اليسار و هذا لأنك قمت بإعطاء الخاصية dir القيمة rtl أي: <html dir="rtl"> </html> 2- جسم الصفحة يحتوي على ثلاث عناصر div في نفس المُستوى أي كلهم أبناء للوسم body: العنصر الأول يأخذ المعرف parent لكنه بدون مُحتوى يأخذ التنسيقات التالية: #parent{ width: 300px; border: 3px solid black; background-color: cadetblue; } و بما أنه بدون محتوى و لم يتم تحديد طول له فيظهر بهذا الشكل. كل من العنصرين ذو المُعرفين child1 و child2 يأخذان صنف التنسيقات child. إذا كُنتِ تريدين أن يكونا العُنصرين من أبناء العنصر parent عليك وضعهما داخله بهذا الشكل: <div id="parent"> <div id="child1" class="child">1</div> <div id="child2" class="child">2</div> </div> الرجاء توضيح المُشكلة التي تواجهيها و سنُساعدك. بالتوفيق
  25. مرحباً @الشيخ المختار الشنقيطس يتمثل الفرق بين الربط الثابت ( static binding ) و الربط الديناميكي ( dynamic binding ) في لغة جافا في: الربط الثابت يحدث أثناء الترجمة و التفسير ( compile time ) بينما الربط الديناميكي يحدث أثناء تشغيل البرنامج ( Runtime ) التوابع ( methods ) و المتغيرات المحددة ك private او static او final تستخدم الربط الثابت بينما يتم ربط التوابع الأخرى ديناميكياً إعتماداً على كائن وقت التشغيل الربط الثابت يستخدم نوع الكلاس بينما الربط الديناميكي يستخدم نوع الكائن في ال overloaded methods يتم إستخدام الربط الثابت بينما في ال overridden methods يتم إستخدام الربط الديناميكي. و هذا مثال عن overloaded methods public class StaticBindingTest { public static void main(String args[]) { Collection c = new HashSet(); StaticBindingTest et = new StaticBindingTest(); et.sort(c); } //overloaded method takes Collection argument public Collection sort(Collection c) { System.out.println("Inside Collection sort method"); return c; } //another overloaded method which takes HashSet argument which is sub class public Collection sort(HashSet hs) { System.out.println("Inside HashSet sort method"); return hs; } } و الخارج سيكون: Inside Collection sort method لأنه نظراً للنقطة 4 فإنه تم إستخدام الربط الثابت إضافةً للنقطة 3 فإن الربط الثابت يعتمد على نوع الكلاس و في هذه الحالة نوع الكلاس هو Collection و هذا مثال آخر عن overridden methods public class DynamicBindingTest { public static void main(String args[]) { Vehicle vehicle = new Car(); //here Type is vehicle but object will be Car vehicle.start(); //Car's start called because start() is overridden method } } class Vehicle { public void start() { System.out.println("Inside start method of Vehicle"); } } class Car extends Vehicle { @Override public void start() { System.out.println("Inside start method of Car"); } } و الخارج سيكون: Inside start method of Car لأنه نظراً للنقطة 4 فإنه تم إستخدام الربط الديناميكي (overridden method) إضافةً للنقطة 3 فإن الربط الديناميكي يعتمد على نوع الكائن و في هذه الحالة نوع الكائن هو Car المصدر: Javarevisited blog post بالتوفيق
×
×
  • أضف...