-
المساهمات
14490 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
384
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Mustafa Suleiman
-
الأمر بسيط، ستتجه إلى صفحة الدورات في أكاديمية حسوب للتعرف عليها وإختيار الدورة المناسبة للمجال الذي تريد التخصص به: https://academy.hsoub.com وأنصحك بقراءة التالي: وبعد إختيار الدورة المناسبة لك، ستجد في صفحة الدورة زر اشترك الآن كالتالي: ولكن ذلك في حالة عدم وجود عروض، وحاليًا يوجد العرض الصيفي وتفاصيله هي الحصول على دورتين بتكلفة دورة واحدة ورابط العرض هو التالي: https://academy.hsoub.com/offers/summer-2023 بعد التوجه للرابط اضغط على زر اشترك الآن، أو قم بالنزول لأسفل وستجد القسم الخاص بإختيار الدورتين وخانات إدخال بيانات البطاقة الإئتمانية ( يجب أن تكون من نوع Debit أو Credit وليس Prepaid) الخاص بك كالتالي: وأخيرًا اضغط على اشترك الآن. وفي حال أردت الدفع بوسيلة أخرى مثل باي بال أو بطاقة الهدية فعليك بالتواصل مع مركز المساعدة في أكاديمية حسوب ليتم مساعدتك. وأنصحك بالإطلاع على قاعدة المعرفة وستجد به الكثير من الإجابات على الأسئلة لديك: https://support.academy.hsoub.com
- 1 جواب
-
- 1
-
-
أولاً، تحتاج إلى إضافة الصورة والنص في الواجهة. باستخدام Row لعرضهما جنبًا إلى جنب: import 'package:flutter/material.dart'; class CustomSwitch extends StatefulWidget { @override _CustomSwitchState createState() => _CustomSwitchState(); } class _CustomSwitchState extends State<CustomSwitch> { bool _isSwitched = false; @override Widget build(BuildContext context) { return Row( children: [ Icon( _isSwitched ? Icons.check_box : Icons.check_box_outline_blank, color: _isSwitched ? Colors.green : Colors.grey, ), SizedBox(width: 8), GestureDetector( onTap: () { setState(() { _isSwitched = !_isSwitched; }); }, child: Text( _isSwitched ? 'تم التفعيل' : 'غير مفعل', style: TextStyle( color: _isSwitched ? Colors.green : Colors.grey, ), ), ), ], ); } } ثم استخدم CustomSwitch في أي مكان ترغب فيه داخل تطبيقك، كالتالي: import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Custom Switch'), ), body: Center( child: CustomSwitch(), ), ), ); } }
-
بإمكانك التحقق من المعلومات عبر طلبات POST و GET باستخدام الـ "Request" المدمجة، والوصول إلى بيانات الطلب من خلال هذا الكائن وتحليلها للتحقق منها. وإليك الخطوات للتوضيح: طلب GET: للوصول إلى بيانات طلب GET، استخدم الـ "query" المدمجة في كائن الطلب. // استقبال البيانات من الطلب GET public function getExample(Request $request) { $data = $request->query(); // تحقق من وجود معلومة معينة بالاستعلام الذي تم إرساله if ($request->has('key')) { // اعمل شيئاً مع المعلومة الموجودة في المفتاح 'key' } // ... تابع باقي المنطق الخاص بك } طلب POST: نستخدم الـ "input" المدمجة في كائن الطلب. // استقبال البيانات من الطلب POST public function postExample(Request $request) { $data = $request->input(); // تحقق من وجود معلومة معينة بالمتغيرات التي تم إرسالها بالطلب POST if ($request->has('key')) { // اعمل شيئاً مع المعلومة الموجودة في المفتاح 'key' } // ... تابع باقي المنطق الخاص بك } في كلا الحالتين، تستطيع الوصول إلى قيمة معينة من خلال استخدام الدالة "input" مع اسم المفتاح كمعامل. وإليك مثال للحصول على قيمة معينة من طلب POST: // استقبال البيانات من الطلب POST public function postExample(Request $request) { $username = $request->input('username'); $password = $request->input('password'); // ... تابع باقي المنطق الخاص بك }
- 3 اجابة
-
- 1
-
-
على الأرجح سؤالك خاص بدورة بايثون، وإن كان كذلك أرجو منك طرح السؤال أسفل فيديو الدورة الخاص بالسؤال في التعليقات من أجل مساعدتك بشكل أفضل، وطرح الأسئلة العامة هنا. والقواميس في بايثون هي مجموعات غير مرتبة من المفاتيح والقيم، بإمكانك استخدامها لتخزين بيانات مختلفة، مثل أسماء الطلاب ودرجاتهم أو أسماء المنتجات وأسعارها. وهناك العديد من فوائد استخدام القواميس في بايثون، منها: سرعة في الوصول إلى البيانات. يمكن استخدامها لتخزين أنواع بيانات مختلفة. تخزين بيانات غير مرتبة. إنشاء مجموعات مترابطة من البيانات. بالإضافة إلى تنظيم البيانات بطريقة سهلة ومفهومة، حيث تستخدم المفاتيح لتصنيف وتنظيم القيم. ومن الممكن استخدام القواميس لتمثيل البيانات كجداول صغيرة مع مفتاح لكل سجل، مما يسهل الوصول إلى السجلات وتعديلها، أو تكوين قواميس متعددة الأبعاد (nested dictionaries) لتمثيل بيانات هيكلية معقدة. وتساعد القواميس في التعامل مع البيانات ذات التنظيم الهيكلي بسهولة، مثل الJSON والـXML. وإليك بعض الأمثلة على كيفية استخدام القواميس في بايثون. تخزين معلومات المستخدمين: # قاموس لتخزين معلومات المستخدمين user_info = { 'اسم المستخدم': 'john_doe', 'البريد الإلكتروني': 'john@example.com', 'العمر': 30, 'المدينة': 'نيويورك' } # الوصول إلى قيمة معينة باستخدام المفتاح print("اسم المستخدم:", user_info['اسم المستخدم']) print("العمر:", user_info['العمر']) لتخزين أسماء المنتجات وأسعارها: products = { "Apple": 100, "Orange": 50, "Banana": 25 } لتخزين بيانات غير مرتبة: data = { "name": "John Doe", "age": 20, "address": "123 Main Street, Anytown, CA" } التحكم في تدفق البرنامج: # تحديد عملية بناءٍ سريعٍ للأرقام operations = { '+': lambda x, y: x + y, '-': lambda x, y: x - y, '*': lambda x, y: x * y, '/': lambda x, y: x / y } operator = '+' # اختيار عملية الجمع num1 = 10 num2 = 5 # استخدام العملية المحددة لإجراء الحساب result = operations[operator](num1, num2) print("النتيجة:", result) تمثيل بيانات هيكلية: # مثال لقاموس متعدد الأبعاد employees = { 'موظف1': { 'الاسم': 'أحمد', 'العمر': 25, 'المدينة': 'القاهرة' }, 'موظف2': { 'الاسم': 'سارة', 'العمر': 30, 'المدينة': 'دبي' } } # الوصول إلى تفاصيل موظف معين print("معلومات موظف1:", employees['موظف1']) print("اسم موظف2:", employees['موظف2']['الاسم']) شرح القواميس dict في بايثون من موسوعة حسوب
-
دورة بايثون تحتوي على أكثر من دورة بداخلها ومقسمة إلى مسارات، وستحتاج إلى 4 أشهر على الأقل والفترة المناسبة هي 6 أشهر والتي أراها مناسبة لدراسة أي مجال برمجي. ولا تجبر نفسك على إنهاء عدد معين من الفيديوهات كل يوم، بل الطريقة الصحيحة هي بتخصيص عدد معين من الساعات بشكل يومي ثم الدراسة ومحاولة الاستيعاب والتطبيق والمراجعة وأهم نقطة هي كتابة الكود بمفردك من أجل تثبيت المعلومات، ولا تعتمد على ذاكرتك أبدًا في تلك النقطة. ومدة الفيديو لا تعني المدة الفعلية لدراسته، أي مثلاً لو لدينا فيديو مدته 30 دقيقة، فستحتاج إلى ساعتين مثلاً من أجل استيعاب ما به والتطبيق من خلال الكود والمراجعة إن احتجت إلى ذلك وأيضًا البحث عن أمور تحتاج إلى توضيح مثلاً، فلا تكتفي بما جاء في الفيديو بل ابحث أيضًا. ونقطة تحديد وقت زمني للإنهاء، هي من أجل الإلتزام وقياس مدى تقدمك، فلو تركت الأمر بدون قياس وإدارة لن تنتهي من الدورة وستجد نفسك استغرقت سنة بدلاً من 6 أشهر. وقد تم الإجابة على سؤالك بشكل مفصل هنا، وشرح كيفية حساب عدد الساعات: وأيضًا أنصحك بقراءة التالي لتوضيح الأمر بخصوص علمية الحفظ أم الفهم:
-
توجه إلى المسار التالي على جهازك من خلال نسخه ولصقه في شريط العنوان ثم اضغط Enter: C:\Program Files\Oracle\VirtualBox\drivers\vboxsup وستجد هناك ملف باسم VBoxSup.inf ثم اضغط بزر الفأرة الأيمن عليه واختر install كالتالي: الآن قم بفتح منفذ الأوامر CMD من خلال البحث عنه في شريط البحث بالأسفل في الويندوز، ثم اختر run as administrator ثم اكتب الأمر التالي: sc start vboxsup والآن حاول تجربة تشغيل النظام على VirtualBox مرة أخرى، لكن بالطبع عليك بإعادة تشغيله بعد تنفيذ الخطوات السابقة.
- 2 اجابة
-
- 2
-
-
-
حاول استخدم أدوات تحليل التطبيق لتحديد الأخطاء، مثل Crashlytics و Sentry لتتبع الأخطاء التي تحدث في تطبيقك وإرسالها إليك، أيضًا اختبر تطبيقك على جهاز أندرويد آخر لتفقد هل المشكلة من جهازك أم لا، ويفضل لو كان به إصدار أندرويد أعلى مثلاً. وبإمكانك إضافة أوامر تسجيل (Log) في أماكن محددة من التطبيق لتتبع تدفق التنفيذ والقيم المتغيرة، واستخدام أدوات تسجيل الأحداث مثل Logcat في Android Studio لعرض السجلات وفهم سير تنفيذ التطبيق والمعلومات المفيدة حول الأخطاء. وإليك الخطوات لكيفية تصحيح أخطاء تطبيق Android: قم بتمكين تصحيح USB على جهازك. يمكنك العثور على هذا الإعداد في قائمة خيارات المطور. توصيل جهازك بالكمبيوتر باستخدام كابل USB. افتح Android Studio. في شريط الأدوات، انقر فوق الزر "تشغيل". حدد خيار "التصحيح". وفي حال كنت تقوم بتصحيح أخطاء تطبيقك لأول مرة، فسيطلب منك Android Studio تثبيت أدوات Android Debug Bridge (ADB). انقر فوق "تثبيت" لتثبيت أدوات ADB. سيقوم Android Studio الآن ببناء تطبيقك وتثبيته على جهازك. بمجرد تثبيت التطبيق، وسيبدأ في التشغيل في وضع التصحيح. والآن تستطيع تعيين نقاط التوقف breakpoints في الكود، ثم الإنتقال سطر بسطر لتفقد أين يقع الخطأ.
-
أنت تتحدث عن درس المجموعات Sets في أساسيات لغة بايثون Python في بنى المعطيات الخطية Data Structures، لذلك أرجو منك التعليق أسفل فيديو الدرس في المرة القادمة ليتم مساعدتك بشكل افضل. وبخصوص سؤالك، المجموعة قابلة للتعديل، يعني أنه بإمكاننا تغيير قائمة العناصر داخلها، سواءً بإضافة عناصر جديدة أو حذف عناصر موجودة. مثال: # إنشاء مجموعة قابلة للتعديل set1 = {1, 2, 3, 4, 5} print(set1) # Output: {1, 2, 3, 4, 5} # إضافة قيمة جديدة set1.add(6) print(set1) # Output: {1, 2, 3, 4, 5, 6} # حذف قيمة set1.remove(3) print(set1) # Output: {1, 2, 4, 5, 6} ومن ناحية أخرى، القيم غير قابلة للتعديل تعني أنه لا يمكن تغيير العناصر بعد إنشاء المجموعة، ولا يُمكن إضافة عناصر جديدة أو حذف العناصر الموجودة. مثال: # إنشاء مجموعة غير قابلة للتعديل باستخدام frozenset frozen_set = frozenset({10, 20, 30, 40}) print(frozen_set) # النتيجة: frozenset({40, 10, 20, 30}) # لا يمكن إجراء أي تغيير في المجموعة الغير قابلة للتعديل # frozen_set.add(50) # سيؤدي هذا إلى خطأ TypeError: 'frozenset' object has no attribute 'add' وبالنسبة لكائن قابل للتكرار (Iterable)، فهو كائن يمكن الانتقال عبر عناصره بشكل متتالٍ، أي أننا نستطيع استخدام الحلقات مثل حلقة for للوصول إلى كل عنصر في الكائن. مثال: # قائمة قابلة للتكرار my_list = [10, 20, 30, 40, 50] # الوصول إلى عناصر القائمة باستخدام حلقة for for item in my_list: print(item) # النتيجة: # 10 # 20 # 30 # 40 # 50 وبالمقابل، الكائن غير قابل للتكرار يعني أنه لا يمكن استخدام الحلقات للوصول إلى العناصر بشكل متتالٍ. مثال: my_number = 42 # لا يمكن استخدام حلقة for مباشرة للعدد (Number) لأنه غير قابل للتكرار for digit in my_number: print(digit) # سيؤدي هذا إلى خطأ TypeError: 'int' object is not iterable وبالنسبة لكيفية جعل المجموعات تحتوي على قيم غير مكررة وفي الوقت نفسه تكون قابلة للتكرار، في لغة Python، فالمجموعات تحتوي على قيم فريدة فقط، مما يعني أنها لا تقبل وجود عناصر مكررة. وعندما تقوم بإضافة قيمة مكررة إلى المجموعة، سيقوم Python تلقائيًا بإزالة القيمة المكررة بحيث تبقى المجموعة تحتوي فقط على القيم الفريدة، مما يسمح للمجموعات أن تكون قابلة للتكرار عند عملية الترتيب والوصول إلى عناصرها، في حين يضمن عدم وجود قيم مكررة فيها. مثال: # إنشاء مجموعة تحتوي على قيم مكررة my_set = {1, 2, 2, 3, 4, 4, 5, 5} # عرض المجموعة print(my_set) # النتيجة: {1, 2, 3, 4, 5} # عند إضافة قيمة مكررة للمجموعة، ستقوم Python تلقائيًا بإزالتها my_set.add(3) print(my_set) # النتيجة: {1, 2, 3, 4, 5} # يمكنك استخدام التحويل إلى مجموعة لإزالة القيم المكررة من قائمة my_list = [1, 2, 2, 3, 4, 4, 5, 5] unique_set = set(my_list) print(unique_set) # النتيجة: {1, 2, 3, 4, 5} المجموعات (Sets) تتكون فعليًا من قيم فريدة غير قابلة للتكرار، ولا يمكن أن تحتوي على عناصر مكررة، وهي في الواقع مجموعة قيم لا تتكرر، ولا تحتوي على ترتيب معين للعناصر. وبخصوص القابلية للتعديل، فالمجموعة (set) هي هيكل بيانات قابل للتعديل (Mutable) في لغة Python، ويمكنك إضافة وحذف العناصر من المجموعة بحرية، أما frozenset فهو هيكل بيانات غير قابل للتعديل (Immutable) ولا يمكن تعديل أو تغيير العناصر الموجودة فيه. شرح المجموعات set في بايثون من موسوعة حسوب
-
الأمر يختلف من لغة برمجة إلى أخرى، لكن المفهوم واحد، حيث أن هناك عدة مفاهيم يجب أن تتقنها وتطبقها بشكل صحيح وأولها أن الكائنات Objects هي العنصر الأساسي في البرمجة الكائنية وتمثل وحدات مستقلة تحتوي على البيانات والسلوكيات المتعلقة بها. ثم مفهوم التركيب والتفكيك (Composition and Aggregation)، حيث تعتمد البرمجة الكائنية على تركيب الكائنات من خلال تضمينها في بعضها البعض (التركيب) أو ربطها بشكل منطقي (التفكيك). يأتي بعد ذلك التوريث (Inheritance) والذي يسمح بإنشاء كائن جديد بناءً على كائن موجود واكتساب الخصائص والسلوكيات من الكائن الأصل. ننتقل بعد ذلك إلى الدوال والأساليب (Methods)، وهي سلوكيات الكائنات وتستخدم لتنفيذ العمليات والإجراءات. ثم مفهوم التغليف (Encapsulation) والذي يتيح لك تجميع البيانات والأساليب ذات الصلة معًا في كائن واحد وإخفاء التفاصيل الداخلية عن الخارج. وأخيرًا مفهوم التحول (Polymorphism) والذي يتيح للكائنات القدرة على تنفيذ نفس الواجهة بطرق مختلفة، ويساعد على تبسيط البرمجة وجعلها أكثر مرونة. وقد تم توضيح مجموعة المبادئ البرمجية الخمسة SOLID Principles التي تهدف إلى جعل التصميم البرمجي قابلًا للتوسع والصيانة. والأمر بسيط، كل ما عليك هو تعلم تلك المفاهيم والتطبيق عليها، ومحاولة تنفيذ مشروع يعتمد على البرمجة الكائنية لإختبار مدى فهمك، ولا مشكلة إذا واجهت صعوبة في البداية فذلك طبيعي، أنت بحاجة إلى الوقت والتكرار . ومن خلال تنفيذ مشاريع كبيرة نسبيًا ستفهم أهمية استخدام البرمجة الكائنية مقارنًة بكتابة الدوال والكود بدون استخدام الكلاسات. وبخصوص الـ Design Patterns فعليك بالإطلاع عليها فقط في البداية، لكن مع التركيز بشدة على نمط Model-View-Controller (MVC) فهو الأكثر استخدامًا وستحتاجه في العمل، أما باقي الأنماط فتستطيع تعلمها بعد مرور فترة وإنهائك أكثر من مشروع، وقد لا تحتاج إليها، وإليك شرح مفصل لما أقصده: شرح أنماط التصميم في موسوعة حسوب
-
المشكلة لديك في اسم كتابة اسم الـ Prop بشكل غير صحيح في مكون Note.js حيث أنك مررت إليه Prop باسم noteClicked ولكنك كتبته باسم noteclicked لاحظ حرف c صغير والصحيح هو حرف C كبير أي يصبح الكود كالتالي: import React from "react"; const Note = (props) => { const {title, noteClicked, active} = props; return ( <li className={`note-item ${active && "active"}`} onClick={noteClicked}> {title} </li> ); }; export default Note; وسيتم حل المشكلة، وأرجو منك طرح الأسئلة الخاصة بالدورات أسفل فيديو الدورة المتعلق بالسؤال في التعليقات، لكي يتم مساعدتك بشكل أفضل، وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة.
- 1 جواب
-
- 2
-
-
هل جربت تصفح الموقع من خلال متصفح آخر؟ في حال تم التصفح بشكل طبيعي فعليك بحذف الملفات المؤقتة للمتصفح الذي يوجد به المشكلة من خلال الضغط على علامة القفل بجان رابط موقع الأكاديمية وذلك في جوجل كروم، ثم إختيار Cookies and site data: بعد ذلك اختر manage Cookies and site data وستظهر لك نافذة بها البيانات الخاصة بالموقع، فقم بحذف الجميع كالتالي: وفي حال لم يتم حل المشكلة، فقد تحتاج إلى حذف جميع الملفات المؤقتة للمتصفح من خلال الضغط على CTRL + SHIFT + DELETE ثم إختيار ALL TIME من القائمة المنسدلة ثم تحديد Cookies and other site data وCached images files ثم الضغط على clear data، لكن يجب التنبيه أن تلك الطريقة تعني تسجيل خروجك من جميع المواقع لأنه سيتم حذف الكوكيز.
- 1 جواب
-
- 1
-
-
ما تريدينه هو رفع مشروع يستخدم Webpack على GitHub pages وقد تم توضيح ذلك من خلال الفيديو التالي: وسأوضح لك الخطوات: أولاً عليك بإنشاء مستودع جديد على GitHub. ثم فتح مجلد الـ build أو dist النهائي فقط في vscode، وهو المجلد الذي يتم به تجميع الكود النهائي للمشروع ليصبح جاهز للنشر. ثم إنشاء مستودع git داخل ذلك المجلد من خلال المر التالي: git init والآن عليك بكتابة الأوامر التالية بالترتيب من أجل رفع المشروع إلى المستودع على GitHub: git add. git commit -m "my first commit" git branch -M main git remote add origin <رابط المستودع على جيت هوب> git push origin main والآن توجهي للمستودع الخاص بالمشروع على GitHub ثم الضغط على تبويب الإعدادات Settings، وستجدي خيار باسم pages اضغطي عليه ثم اختاري الفرع الذي تم رفع المشروع علي ه كما بالصورة: والآن سننتظر قليلاً لحين الحصول على رابط المشروع لتصفحه كما بالصورة: وفي حال أردتي رفع المشروع بالكامل بما في ذلك مجلد build فعليك بتجاهل الخطوة الأولى وإنشاء المستودع في جذر المشروع الرئيسي ثم رفعه إلى المستودع بنفس الأوامر التي ذكرتها لك ثم التوجه إلى الإعدادات وتفعيل pages والآن ستحصلين على رابط أضيفي إليه build في النهاية من أجل تصفح مجلد build، أي كالتالي: https://amine.github.io/test أضيفي إليه أنت build ليصبح كالتالي: https://amine.github.io/test وستجدين المزيد من التوضيح والشرح هنا:
-
مزايا Express error handler تحسين استقرار وتوفر التطبيق. تقليل كمية الكود التي تحتاج إلى كتابتها. إمكانية تجميع الأخطاء حسب نوعها. إمكانية إرسال ردود مفيدة إلى المستخدمين في حالة حدوث خطأ. متى يجب استخدام Express error handler (throw new Error) عند حدوث خطأ في الكود الخاص بك. عند تلقي طلب غير صحيح من المستخدم. عند حدوث خطأ في الاتصال بالشبكة. عند حدوث خطأ في قاعدة البيانات. متى يجب تجنب استخدام Express error handler (throw new Error) عند حدوث خطأ غير متوقع. عند حدوث خطأ لا يمكنك التعامل معه. عند حدوث خطأ غير مهم. وإليك مثال على كيفية استخدام Express error handler: // Handle a 404 error app.use(function(req, res, next) { if (req.originalUrl === '/404') { res.status(404).send('The page you are looking for is not found.'); } else { next(); } }); // Handle a 500 error app.use(function(err, req, res, next) { res.status(500).send('An unexpected error occurred.'); });
- 6 اجابة
-
- 1
-
-
الإختلاف هو في طريقة تحويل البيانات إلى سلسلة، حيث يقوم x-www-form-urlencoded بتحويل البيانات إلى سلسلة باستخدام رمز URL، بينما يحول raw البيانات إلى سلسلة كما هي. ونستخدم x-www-form-urlencoded للبيانات التي سيتم إرسالها عبر نموذج ويب، مثلاً لإرسال اسم المستخدم وكلمة المرور إلى خادم، وتحويل تلك البيانات إلى سلسلة، وستبدوا السلسلة الناتجة كالتالي: username=johndoe&password=secret ولاحظ أنه يتم ترميز البيانات بتنسيق مفتاح/قيمة وإرسالها في جسم الطلب. أي لو في إرسال طلب POST لإضافة مستخدم جديد إلى قاعدة البيانات، يمكنك استخدام x-www-form-urlencoded لإرسال البيانات التالية: مثال URL: http://localhost:3000/api/users Body type: x-www-form-urlencoded البيانات: key: name، value: John Doe key: email، value: johndoe@example.com key: age، value: 30 وفي مشروع Node.js، يجب أن تُعالج طلبات POST هذه الأنواع من البيانات في جسم الطلب، باستخدام إطار عمل مثل Express، ويمكنك قراءة بيانات x-www-form-urlencoded أو raw من جسم الطلب كالتالي: const express = require('express'); const bodyParser = require('body-parser'); const app = express(); // تمكين معالجة x-www-form-urlencoded app.use(bodyParser.urlencoded({ extended: false })); app.post('/api/users', (req, res) => { const { name, email, age } = req.body; // قم بإجراء الإجراءات اللازمة لإضافة المستخدم إلى قاعدة البيانات هنا res.send('تمت إضافة المستخدم بنجاح'); }); app.listen(3000, () => { console.log('الخادم يعمل على المنفذ 3000'); }); بينما يستخدم raw عادةً للبيانات التي لا يمكن تحويلها إلى سلسلة باستخدام رمز URL، أي في حال كنت تريد إرسال ملف إلى خادم، فتستطيع استخدام raw لتحويل الملف إلى سلسلة، وستبدوا السلسلة الناتجة كالتالي: <file content> أي في حال أننا نريد إرسال بيانات في تنسيق غير مشفر، مثل نص عادي (Plain Text) أو JSON أو XML. ولنفترض أنك ترغب في إرسال طلب POST لإضافة مستخدم جديد باستخدام تنسيق JSON، هنا نستخدم Raw لإرسال البيانات التالية: مثال URL: http://localhost:3000/api/users Body type: Raw واختيار JSON من القائمة المنسدلة البيانات (JSON): { "name": "John Doe", "email": "johndoe@example.com", "age": 30 } وبالمثل يتوجب معالجة طلبات POST لذلك النوع من البيانات في جسم الطلب باستخدام إطار عمل مثل Express، ويمكنك قراءة بيانات x-www-form-urlencoded أو raw من جسم الطلب كالتالي: const express = require('express'); const bodyParser = require('body-parser'); const app = express(); // تمكين معالجة JSON app.use(bodyParser.json()); app.post('/api/users', (req, res) => { const { name, email, age } = req.body; // قم بإجراء الإجراءات اللازمة لإضافة المستخدم إلى قاعدة البيانات هنا res.send('تمت إضافة المستخدم بنجاح'); }); app.listen(3000, () => { console.log('الخادم يعمل على المنفذ 3000'); });
- 5 اجابة
-
- 1
-
-
في الواقع أنت على الطريق الصحيح، فليس التعلم بالكم ولكن بالكيف، فقد يستفزك أن ترى البعض ينهي دورة في خلال أسبوع مثلاً بينما أنت تستغرق وقتك في الفهم والاستيعاب وتدوين الملاحظات ثم التطبيق. وقد ترى الأمر ممل ولا تحرز تقدم كبير، والأمر مغاير تمامًا، حيث أنك تحرز تقدم كبير بناءًا على أسلوب المذاكرة الصحيح الذي تتبعه، حيث أن عملية التعلم بالشكل الصحيح بطيئة في البداية وقد تجد نفسك تستغرق يوم كامل في بعض الأجزاء ولا مشكلة في ذلك. طالما أنك تبذل ما بوسعك فلا تقلق، ومع الوقت ستجد نفسك تتعلم بشكل أسرع وأفضل من أي شخص قام بإنهاء الدورة بشكل سريع وظن نفسه أنه أصبح مبرمج، لابد من التأني في البداية والمراجعة بعد مرور فترة من أجل تثبيت المعلومات، والتركيز بشدة على الأساسيات والتعمق بها والتطبيق عليها. وهناك أمر هام يجب التنبيه إليه، بعض الأشخاص يقوم بتدوين كل شيء أو كتابة الكود بشكل نصي في ورقة خارجية مثلاً، وذلك غير صحيح، فقط النقاط الهامة وملاحظات من أجل المراجعة أي كملخص لما فهمته من الدرس، فأنت تستطيع البحث عما تريده على جوجل في أي وقت، المهم هو الفهم والاستيعاب. وأنصحك بقراءة النقاش التالي وستجد به الكثير من الإجابات على الأسئلة لديك:
- 2 اجابة
-
- 1
-
-
العرض الصيفي الحالي يتم تطبيقه على الإشتراكات الجديدة، وهناك حل وحيد وهو الاستفسار عن وجود إمكانية لذلك من خلال سؤال مركز الدعم في أكاديمية حسوب، وسيتم الرد عليك في خلال فترة 24 إلى 48 ساعة. ولكن لا تعلق الكثير من الآمال على ذلك، وحاول أيضًا السؤال عن وجود كوبونات أو خصومات مثلاً بدلاً العرض الصيفي في حال لم يتوفر لك.
-
لا تقلق أبدًا بخصوص ذلك، حتى لو طال الأمر قليلاً سيتم الرد عليك وحل المشكلة، فلا داعي للقلق بخصوص تلك النقطة.
- 4 اجابة
-
- 1
-
-
لكي يتضح لك الأمر، دورة علوم الحاسب ليست موجهة للتخصص في أحد مجالات البرمجة، بل للتاسيس بشكل سليم ودراسة علوم الحاسب من أجل دخول مجال البرمجة بقوة وإختيار المجال الذي تريد التخصص به عن وعي ودراية وأيضًا إمتلاك خبرة كافية لتعلم أي مجال تريد. وأنصحك بقراءة التالي لتفهم الفائدة الكبيرة التي تحصل عليها جراء دراسة علوم الحاسب: لذلك يتم مساندتك لفترة تصل إلى 6 أشهر من تاريخ حصولك إجتيازك للإختبار والحصول على الشهادة، وتوجيهك من أجل التخصص في مجال برمجي مطلوب في سوق العمل والحصول على وظيفة لكن بشرط الجد والإجتهاد، وستجد في أكاديمية حسوب دورات لمختلف المجالات ومنها: دورة تطوير تطبيقات الويب باستخدام لغة PHP دورة تطوير التطبيقات باستخدام لغة JavaScript وبإمكانك دراسة المسار الأول من جميع الدورات الأخرى بشكل مجاني في حال أردت زيادة معلوماتك أو التعمق بشكل أكبر.
- 1 جواب
-
- 1
-
-
لا داعي للقلق عزيزي عبد المالك، في بعض الأحيان يوجد ضغط على فريق الدعم في أكاديمية حسوب، وسيتم الرد عليك خلال 24 إلى 48 ساعة، طالما أنك تحدثت إليهم من خلال حسابك الذي اشتريت من خلاله الدورات وأخبرتهم بالمشكلة فسيتم حلها. لكن حاول تفقد الدورات لديك من خلال تبويب دوراتي كالتالي: وستجد الدورات التي قمت بالإشتراك بها، وهنا توضيح بشكل مفصل: كيف أصل للدورات التي اشتركت بها وحاول مثلاً تسجيل الخروج ثم تسجيل الدخول مرة أخرى لحسابك وتفقد الدورات مرة أخرى لحين الرد عليك من قبل مركز المساعدة في أكاديمية حسوب.
-
الأسئلة الإختبارية لا يتم الإجابة عليها بشكل مباشر، وأنت تريد فعل ذلك من خلال لغة جافا، صحيح؟ سأوضح لك الخطوات باستخدام لغة جافا ومكتبة java.time.LocalDate، حيث سيتعين عليك استيراد المكتبة java.time.LocalDate وjava.time.format.DateTimeFormatter لتعامل مع التواريخ وتنسيقها. ثم إنشاء الدالة الرئيسية (main) التي ستكون نقطة البدء لتنفيذ البرنامج. بعد ذلك حدد التاريخ الثابت الذي ترغب في طرحه من التاريخ الآخر، ويجب أن يكون التاريخ في شكل نصي "yyyy/M/d" ويمكن تخزينه في متغير نصي (String). ثم باستخدام DateTimeFormatter، قم بتحويل النصوص إلى كائنات LocalDate. الآن استخدم دوال minusYears و minusMonths و minusDays لطرح التاريخ الثابت من التاريخ الآخر. وفي النهاية عرض النتيجة باستخدام System.out.println() بناءًا على نمط التنسيق المعين (مثلاً "yyyy/M/d"). وبذلك ستتمكن من طرح التاريخ الثابت (constantDate) من التاريخ الآخر (otherDate) وعرض النتيجة بتنسيق "yyyy/M/d" في الإخراج القياسي، وبالطبع يمكن تحسين الكود بإضافة التحقق من صحة التواريخ المدخلة والتعامل مع الاستثناءات المحتملة.
-
أولاً، Django هو إطار عمل ويب يستند إلى Python، بينما Angular هو إطار عمل ويب يستند إلى JavaScript. ثانيًا، Django و Angular ليسا مصممين خصيصًا لإنشاء تطبيقات أندرويد مما يعني أنك ستحتاجين إلى استخدام إطار عمل من أجل إنشاء تطبيق الهاتف وليس Angular أو Django، مثل React Native أو Flutter، لإنشاء الواجهة الأمامية لتطبيقك. بينما في الواجهة الخلفية نستخدم Django وربطها بالواجهة الأمامية عن طريق الـ API's. بينما لو أردتي استخدام Django فقط فهناك حل وهو تحويل الموقع إلى Progressive Web App (PWA) فتستطيعي استخدام django-pwa من أجل تحويل الموقع إلى نسخة قابلة للاستخدم كتطبيق على الهاتف، وهو أشبه بنسخة من الموقع للهاتف لكن على هيئة تطبيق مع ميزة التصفح بدون إنترنت. وفي حال أردتي بدائل للواجهة الخلفية فهناك NODE.JS في حال قمتي بتعلم React Native فستصبح خيار ممتاز لك، لكونها بيئة عمل تعتمد على جافاسكريبت أيضًا. بينما Flutter يعتمد على لغة Dart. وأنصحك بقراءة التالي: ويوجد في أكاديمية حسوب دورة تطوير تطبيقات باستخدام جافاسكريبت وبها مسار كامل لتطوير تطبيقات الهاتف باستخدام React Native.
- 2 اجابة
-
- 1
-
-
أرجو منك طرح الأسئلة المتعلقة بالدورات أسفل الفيديو الخاص بالسؤال في التعليقات أسفل الفيديو، وطرح الأسئلة العامة هنا. وبخصوص سؤالك حاول القيام بالتالي: sudo chown root:root /etc/vsftpd.conf ثم الأمر التالي: sudo openssl req -x509 -nodes -days 1095 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem ثم التالي: service vsftpd start بعد ذلك الأمر التالي: service vsftpd reload ثم إعادة التشغيل: sudo systemctl restart vsftpd.service ثم التجربة: systemctl status vsftpd
-
في حال أنك تريد استخدام كود من main.js في ملف home.js فعليك بتضمين ملف main.js أولاً حتى تصبح الدوال جاهزة ومعرفة عند استدعائها في ملف home.js حيث أن الكود يتم قراءته من الأعلى للأسفل.
- 1 جواب
-
- 1
-
-
بالطبع فأنت بحاجة إلى تعديل الكود ليتوافق مع التغييرات التي حدثت في الإصدار 8.0. لذلك حاول التحقق من ملفات السكربت والصفحات الخاصة به للتأكد من عدم وجود أخطاء قوية (Fatal Errors) أو رسائل خطأ عند تشغيلها على PHP 8، بالإَضافة إلى التأكد من عدم استخدام الوظائف المتوقفة (deprecated functions) التي قد تكون تم استبدالها بوظائف جديدة في PHP 8. وفي حال لم تتمكن من تحديد سبب التوافقية، بإمكانك استخدام أدوات التحويل (Migration tools) المتاحة لتحويل السكربت من PHP 7 إلى PHP 8، وتلك الأدوات تساعد في اكتشاف التغييرات التي تحتاج إلى إجرائها لتحقيق التوافقية مع PHP 8 ومنها: PHP_CodeSniffer PHPCompatibility rector وستجد هنا الدليل الرسمي الذي يوضح طريقة عمل Migrating أو تحويل الكود من PHP 7.4 إلى PHP 8.0، حيث يتم شرح التغييرات التي حدثت: https://www.php.net/manual/en/migration80.php