-
المساهمات
3558 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
34
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو سمير عبود
-
إبتداءً من الإصدار 3.6 اصبح بالإمكان التعديل على عدة عناصر بداخل مصفوفة بحيث يُمكنك إستخدام positional identifier بالشكل التالي: db.collection.update({}, { $unset: { "address.localAddresses.$[].street": true } }) $[] تقوم بحذف كل الخاصيات street من المصفوفة localAddresses، يعمل كعنصر نائب لتحديث جميع العناصر في المصفوفة. بإمكانك تجربة المثال من: هنا إن أردت الحذف المتعدد من عدة مستندات إستخدم multi: true بالشكل التالي: db.collection.update({}, { $unset: { "address.localAddresses.$[].street": true } }, { multi: true })
-
هل بإمكانك التوضيح أي برامج تقصد، هل تقصد برامج تحتاجها في الدورة أم ماذا؟ إذا كنت تقصد دورة تطوير واجهة المُستخدم فقط تابع الدروس و تابع مع المُدرب و إن احتجت لتحميل برنامج سيدلك في الدرس على ماهي البرامج التي ستحتاجها و رابط تنزيلها و كيفية تنزيلها كما أنه سيقوم بتثبيتها على جهازه حتى تتعلم منه طريقة تثبيتها على جهازك و إن حصلت لك مُشكلة ما فستجد في أسفل الدرس صندوق للتعليقات بإمكانك مشاركة المُشكلة معنا من خلاله و سنعمل على مُساعدتك. روابط للمواضيع الشائعة على الأكاديمية: كيف تستفيد من أكاديمية حسوب كيف أصل للدورات التي اشتركت بها كيف أتواصل مع المدرّبين الامتحان والحصول على الشهادة
- 1 جواب
-
- 1
-
-
الأسئلة التي تُراودك طبيعية و قد تم طرحها من قبل العديد من المستقلين قبلك كما أن أجوبة هذه الأسئلة ليست حقيقة ثابتة لذلك يعمل فريق مستقل دائماً على كتابة عدة مقالات في هذا الجانب و تطوير المستقلين فيه على مُدونة مُستقل فأنصحك بالإطلاع على تلك المقالات من خلال هذا الرابط: دليل المستقلين و ستجد غايتك فيه. كما بإمكانك الإطلاع على بعض الكتب و المقالات أيضاً التي نشرتها الأكاديمية هنا على المنصة: مقالات العمل الحر كتب العمل الحر
- 3 اجابة
-
- 1
-
-
التابع .sort() في pymongo يأخذ مُعاملين key و direction لذا ، إذا كنت تريد الترتيب حسب المعرف _id ، فعليك الترتيب بهذا الشكل: .sort("_id", 1) أو: .sort("_id", pymongo.ASCENDING) // أو .sort("_id", pymongo.DESCENDING) إن كنت تريد الترتيب حسب عدة حقول فيُمكنك: .sort([("field1", pymongo.ASCENDING), ("field2", pymongo.DESCENDING)])
-
يُقدم الصنف JPanel ثلاث دوال بانية هي الباني الإفتراضي و الباني الذي يقبل وسيط بولياني و الباني الذي يقبل كائن من الكلاسات التي تُطبق الواجهة LayoutManager حيث يتم استخدام LayoutManagers لترتيب المكونات بطريقة معينة. و LayoutManager هي واجهة يتم تنفيذها بواسطة جميع فئات مديري التخطيط. هناك الفئات التالية التي تمثل مديري التخطيط: BorderLayout FlowLayout و هو الإفتراضي GridLayout CardLayout GridBagLayout BoxLayout GroupLayout ScrollPaneLayout SpringLayout و غيرها حيث لكل صنف من هذه الأصناف طريقته في التخطيط. مثال عن إستخدام الباني الثاني و إستخدام مدير التخطيط BorderLayout: import java.awt.BorderLayout; import javax.swing.*; public class Main { public static void main(String args[]) { // إستخدام الباني الإفتراضي JPanel configurePanel = new JPanel(); configurePanel.add(new JButton("Config")); // إستخدام الباني الإفتراضي JPanel okCancelPanel = new JPanel(); okCancelPanel.add(new JButton("Ok")); okCancelPanel.add(new JButton("Cancel")); // إستخدام باني التخطيط JPanel buttonPanel = new JPanel(new BorderLayout()); buttonPanel.add(configurePanel, BorderLayout.WEST); buttonPanel.add(okCancelPanel, BorderLayout.EAST); // العرض JFrame t = new JFrame("Button Layout Demo"); t.setContentPane(buttonPanel); t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); t.setSize(400, 65); t.setVisible(true); } } و هذه النتيجة: حيث إستخدمنا الباني الإفتراضي لإنشاء لوحتين (panels) واحدة أضفنا لها زر و الثانية أضفنا لها زرين. ثم أنشأنا لوحة ثالثة بإستخدام الباني الذي يقبل وسيط يحدد مدير التخطيط و حددنا النوع على أنه BorderLayout حتى نضيف اللوحتين وفق تخطيط نُحدده فجعلنا اللوحة التي تملك زر وحيد ناحية الغرب ( west ) و اللوحة التي تملك زرين ناحية الشرق (east) و هناك عدة ثوابت يُمكن إستخدامها في مدير التصميم BorderLayout و مديري التخطيط الأخرى لتوزيع العناصر.
- 1 جواب
-
- 2
-
-
لو تم كتابتها بشكل مُباشر سيتم تنفيذها في كل الأحوال أما بإستخدام else مع for فسيتم تنفيذ الكتلة البرمجية الموجودة في else في حالة إنهاء الحلقة بشكل عادي فقط أي أنه إذا تم تنفيذ break فلن يتم تنفيذ جزء else في حالتك: سيتم طباعة كل الأعداد من 0 ل 9 و عند الوصول ل 9 سيتحقق الشرط و يتم تنفيذ break و هنا الحلقة لن يتم إكماله بشكل عادي و بالتالي لن يتم تنفيذ جزء else جرب مثلا التالي: for i in range(3): print(i) if i == 9: print("Found 9") break; else: print("Completed successfully") سيكون الخرج: 0 1 2 Completed successfully أي أن جزء else قد تم تنفيذه و بالتالي فإنه قد تم تنفيذ الحلقة كلها و الخروج منها بشكل عادي. لنٌعطِ مثال آخر و لنفترض أنه طُلب منك إنشاء دالة search للبحث عن عُنصر ما في قائمة و إرجاع الفهرس المتواجد به إن وُجد بإستعمال حلقة for فإذا تم إيجاد العُنصر يتم الخروج من الحلقة دون اكمال بقية العناصر و إذا لم يتم إيجاد العُنصر يتم إرجاع -1 أمامك طريقين إستخدام مُتغير بولياني و تهيئته ب false و عند إيجاد العُنصر يُصبح true ثم القيم ب break للحلقة ثم فحص قيمة المُتغير البولياني و إرجاع القيمة المناسبة: def search(lst, s): found = False for i, val in enumerate(lst): if val == s: found = True break if not found: return -1; return i lst = ["foo", "bar", "baz"] print(search(lst, "baz")) # 2 print(search(lst, "faz")) # -1 أو إستخدام الطريقة for .. else و الإستغناء عن المتغير البولياني: def search(lst, s): for i, val in enumerate(lst): if val == s: break else: return -1; return i lst = ["foo", "bar", "baz"] print(search(lst, "baz")) # 2 print(search(lst, "faz")) # -1 و بهذا يُصبح الكود أكثر مقروئية و إستخدام else مع for في مثل هذه الحالات أكثر منطقية.
- 2 اجابة
-
- 1
-
-
هناك طريقتان لإجراء اختيارات عشوائية بإستعمال إحتمالات إختيار لكل عنصر في بايثون: إذا كنت تستخدم Python 3.6 أو أعلى ، فاستخدم ()random.choices عدا ذلك ، استخدم ()numpy.random.choice random.choices: قدم Python 3.6 دالة جديدة random.choices في الوحدة العشوائية. باستخدامها يمكننا إجراء اختيار عشوائي مرجح مع الاستبدال. يمكنك أيضًا تسميتها عينة عشوائية مرجحة مع الاستبدال. توقيع الدالة كالتالي: random.choices(population, weights=None, *, cum_weights=None, k=1) تقوم بإرجاع قائمة بحجم k للعناصر المختارة من المجتمع (population) population: هي بنية التسلسل أو البيانات التي تريد الإختيار منها weights أو cum_weights: لتحديد احتمال الاختيار لكل عنصر. k: عدد العينات التي تريدها من المجتمع (population) ملاحظة: لا يُمكنك تحديد كل من weights و cum_weights في نفس الوقت بل يجب تحديد أحدهما و إن لم يتم تحديد أحدهما ستكون كل العناصر لديها نفس إحتمال الإختيار. عدد العناصر المُحددة في سلسلة الأوزان يجب أن يكون نفس عدد عناصر المُجتمع (population)، تستطيع إستخدام الأعداد الصحيحة (integers) الغير سالبة او floats في الأوزان، الأوزان يجب أن لا تكون سالبة. مثال: اختيار 5 عناصر من القائمة باحتمالات مختلفة import random numberList = [1, 2, 3, 4, 5] print(random.choices(numberList, weights=(10, 20, 30, 40, 50), k=5)) # Output [5, 5, 4, 5, 4] ملاحظة: كما ترى في الخرج ، تلقينا العُنصر "5" ثلاث مرات لأننا خصصنا له أعلى وزن. لذلك فإن لديها أعلى احتمالية ليتم اختيارها مجموع الأوزان ليس 100 لأنها أوزان نسبية وليست نسبًا. حيث أن الإحتمال لكل عُنصر يُحسب كالتالي: وزن العُنصر / مجموع الأوزان. إذا أردنا إرجاع عُنصر واحد فقط سنُحدد k بواحد لكن ناتج الدالة سيكون قائمة تتكون من عنصر واحد. إذا أردت إنشاء الدالة التي تريدها بإستخدام هذه الطريقة يُمكنك ذلك من خلال: import random numberList = [1, 2, 3, 4] def choice(population, w): return random.choices(population, weights=w, k=1)[0] print(choice(numberList, (0.2, 0.2, 0.4, 0.2))) إستخدام مكتبة numpy: لتثبيت المكتبة: pip install numpy توقيع الدالة المُستخدمة كالتالي: numpy.random.choice(a, size=None, replace=True, p=None) حيث a هو المجتمع أو مصدر البيانات، size هو عدد العناصر التي نريد إختيارها، و p يُستخدم لوضع إحتمالات الإختيار. ملاحظة: يجب ان يكون مجموع الإحتمالات هو 1. إذا أردت إنشاء الدالة التي تريدها بإستخدام هذه الطريقة يُمكنك ذلك من خلال: import numpy as np numberList = [1, 2, 3, 4] def choice(a, w): return np.random.choice(a, p=w) print(choice(numberList, [0.1, 0.6, 0.2, 0.1]))
- 2 اجابة
-
- 1
-
-
الفرق بين النسخ السطحي والنسخ العميق يظهر فقط في الكائنات المركبة (الكائنات التي تحتوي على كائنات أخرى ، مثل القوائم أو نُسخ من الفئات) حيث: يُنشئ النسخ السطحي كائنًا مركبًا جديدًا ثم تُدرج مراجع محتوياته إلى الكائنات الموجودة في الأصل. أما النسخ العميق يُنشئ كائنًا مركبًا جديدًا ، ثم تُدخل نسخًا متكررة فيه من الكائنات الموجودة في الأصل مثال للتوضيح: import copy a = [1, 2] b = [4, 5] c = [a, b] إستخدام النسخ العادي او السطحي: d = copy.copy(c) print(id(c) == id(d)) # False print(id(c[0]) == id(d[0])) # True و هذا ما ذكرناه أن كلاهما يُنشئ كائناً جديداً. لذلك في الأول أعطى False بينما قلنا أنه في النسخ العادي مُحتويات الكائن المُنشأ تُدرج إلى مراجع الكائنات الموجودة في الأصل لذلك أعطى في الطباعة الثانية True. إستخدام النسح العميق: d = copy.deepcopy(c) print(id(c) == id(d)) # False print(id(c[0]) == id(d[0])) # False و هذا ما ذكرناه في النسخ العميق أنه يُنشئ كائناً جديداً ثم يُنشئ كائنات منسوخة من الكائنات الموجودة في الأصل في مُحتويات الكائن الذي نريد نسخه.
- 1 جواب
-
- 1
-
-
لنفترض أنه لديك ملف بالإسم file.txt يحتوي على التالي: line 1 line 2 line 3 و تريد قراءة المُحتوى و طباعته يُمكنك إستخدام الطريقة التالية: with open('file.txt') as f: contents = f.read() print(contents) و سيكون الناتج كالتالي: line 1 line 2 line 3 يُمكنك تجربة المثال من: هنا لقراءة المحتوى سطر وراء سطر يُمكنك ذلك من خلال: with open('file.txt') as f: for line in f: print(line) يُمكنك تجربة المثال من: هنا
-
تأكد أنك تستخدم التابع unset بشكل صحيح فالحقل الذي تريد حذفه هو حقل فرعي لذلك يجب إخبار MongoDB بذلك بإستخدام dot notation بهذا الشكل: .update( {}, { $unset: {'attributes.ips':1}}, {multi: true} ) كما يُمكن أيضاً إستخدام التابع updateMany لتعديل عدة مُستندات: .updateMany( {}, { $unset: {'attributes.ips':1}} )
-
يُمكن القيام بالأمر عن طريق إستخدام where بالشكل التالي: .find( { $where: "this.employees.length > 2" } ); كما يُمكنك أيضاً إستخدام هذه الطريقة: // ابحث عن جميع المستندات التي تحتوي على 3 عناصر على الأقل في المصفوفة .find({'employees.2': {$exists: true}})
- 4 اجابة
-
- 1
-
-
يُمكن الوصول لما تُريد بإستخدام: db.books.find({"book_title": /.*m.*/}) // أو db.books.find({"book_title": /m/}) أنت تبحث عن شيء يحتوي على "m". عامل % في SQL يوافق '.*' في التعبيرات النمطية RegEx. يستخدم MongoDB تعبيرات نمطية أقوى من "LIKE" في SQL. باستخدام التعبيرات النمطية يمكنك إنشاء أي نمط تريد. فيما يلي أنواع مختلفة من المتطلبات والحلول للبحث عن السلاسل باستخدام التعبيرات النمطية. تحتوي على string: db.books.find({book_title:{'$regex' : 'string', '$options' : 'i'}}) لا تحتوي على string: db.books.find({book_title:{'$regex' : '^((?!string).)*$', '$options' : 'i'}}) تبدأ ب string: db.books.find({book_title:{'$regex' : '^string', '$options' : 'i'}}) تنتهي ب string: db.books.find({book_title:{'$regex' : 'string$', '$options' : 'i'}})
-
يُمكن إستخدام الدالتين getattr و setattr للوصول للخاصيات: getattr(x, 'y') <=> x.y setattr(x, 'y', v) <=> x.y = v و هذا تطبيق للدالتين في مثالك: class Foo: def __init__(self): self.attr1 = True self.attr2 = False foo = Foo() x = "attr1" y = 123 setattr(foo, x, y) z = getattr(foo, x) print(z) # 123
- 2 اجابة
-
- 1
-
-
العامل الثلاثي في لغة بايثون مُختلف نوعاً ما مثلاً في جافاسكربت العامل الثلاثي بهذا الشكل: // condition ? exprIfTrue : exprIfFalse // مثال: let x = 2, y = 4; let a = y > x ? y : x; console.log(a); // 4 أما في بايثون: # <expression1> if <condition> else <expression2> # وهي موافقة لِ # if <condition>: <expression1> else: <expression2> # مثال: x = 2 y = 4 a = y if y > x else x print(a) # 4
-
يُمكن الحصول على الفرق بين القائمتين بالشكل التالي: lst1 = ['One', 'Two', 'Three', 'Four'] lst2 = ['One', 'Two'] result = list(set(lst1) - set(lst2)) print(result) # ['Four', 'Three']
-
الأمر بسيط فقط قومي بإتباع بعض الخطوات سأشرحها لك بإستخدام مثال: سنُضيف لإستمارة التسجيل نوع المُستخدم gender: نُضيف الحقل gender إلى جدول المستخدمين: أولا نُنشئ ملف تهجير لإضافة الحقل: php artisan make:migration add_gender_to_users نفتح ملف التهجير و نضيف الحقل للتابع up: $table->enum('gender', ['male', 'female', 'others'])->default('male'); و في التابع down نُضيف: $table->dropColumn('gender'); نقوم بتنفيذ أمر التهجير: php artisan migrate نضيف الحقل لإستمارة تسجيل الدخول في الملف register.blade: <div class="form-group row"> <label for="gender" class="col-md-4 col-form-label text-md-right">{{ __('Gender') }}</label> <div class="col-md-6"> <select class="form-control @error('gender') is-invalid @enderror" name="gender" id="gender" required> <option value="">Select Your Gender</option> <option value="male" {{ old('gender') == 'male' ? 'selected' : '' }}>Male</option> <option value="female" {{ old('gender') == 'female' ? 'selected' : '' }}>Female</option> <option value="others" {{ old('gender') == 'others' ? 'selected' : '' }}>Others</option> </select> @error('gender') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div> نضيف الحقل gender لمصفوفة fillable في النموذج: protected $fillable = [ 'name', 'email', 'password', 'gender' ]; بعد ذلك نتحقق من الحقل في المتحكم RegisterController و نضيف الحقل في إنشاء السجل: 'gender' => ['required', 'string', 'in:male,female,others'], و في الإنشاء: protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'gender' => $data['gender'], // إضافة الحقل 'password' => Hash::make($data['password']), ]); } و هكذا بنفس الطريقة يُمكنك إضافة حقول أخرى.
- 4 اجابة
-
- 1
-
-
بإمكانك إلقاء نظرة على مكتبة: gridstack.js فهي تُوفر الخصائص التي تُريدها. مُستودع المكتبة على github من: هنا
-
في هذه الحالة بإمكانك التواصل مع الدعم الفني من خلال: مركز المساعدة و شرح المُشكلة لهم و سيقومون بتغيير الدورة لك في أقرب وقت. بالتوفيق.
-
المُشكلة لديك في وجود فراغ في قيمة الخاصية method للإستمارة: <form action="/cities" method="POST "enctype = "multipart/form-data"> يجب حذف الفراغ: <form action="/cities" method="POST" enctype="multipart/form-data"> كما أن المسار resource: Route::resource('/cities',citiesController::class); يتضمن مُسبقاً المسار التالي: Route::post("/cities",[citiesController::class,"store"]); فلا داع لتكراره. كما و أنصحك عدم عمل كل شيء مرة واحدة و إنما التدرج في عمل الخصائص فمثلاً البدأ بخاصية المدن و بعد الإنتهاء منها الإنتقال لخاصية أخرى و هكذا. و ليس وضع كافة المسارات في ملف web.php بهذا الشكل ستختلط عليك الأمور أما إن عملت بالقطعة مثلاً الآن المدن: إنشاء النموذج و ملف التهجير و بعد ذلك المسارات الخاصة بالمدن ثم المتحكم و إنشاء عمليات ال crud كلها و بعد ذلك الإنتقال لخاصية أخرى.
- 5 اجابة
-
- 1
-
-
لأن كل المسارات تُؤدي إلى نفس المُتحكم و نفس التابع فالرد نفسه في كل المسارات: Route::get('/Admin', [App\Http\Controllers\HomeController::class, 'index'])->middleware('Admin'); Route::get('/Maneger', [App\Http\Controllers\HomeController::class, 'index'])->middleware('Maneger'); Route::get('/User', [App\Http\Controllers\HomeController::class, 'index'])->middleware('User');
-
لديك خطأ في تسجيل الطبقات الوسيطة على مُستوى Kernel.php عند إستيراد كلاس ما نستعمل مجال إسم ذلك الكلاس و ليس مجال إسم آخر مثلاً: الكلاس Admin التي تُعتبر طبقة وسيطة لا تتبع إلى مجال الإسم: Illuminate\Auth\Middleware و إنما إلى: App\Http\Middleware لذلك عند تسجيلها على مُستوى ال Kernel يجب إستيراد الكلاس بالشكل التالي: 'Admin' => \App\Http\Middleware\Admin::class, نفس الملاحظة بخصوص بقية الطبقات الوسيطة.
- 4 اجابة
-
- 1
-
-
دروس الدورة موجودة في الأكاديمية على شكل صفحات ويب حيث أنه بدون منحك صلاحية لهذه الصفحات من قبل الإدارة لن تتمكني من الوصول لهذه الصفحات و بالتالي لمُحتويات الدورة، عند الإشتراك في أي دورة سيتم منحك تلك الصلاحية و سيتم ربط حسابك بالدورة التي تم الإشتراك فيها. أما إن لم يكن لديك حساب فستتكفل الأكاديمية بفتح حساب لك. عُموماً عند الإشتراك في أي دورة سيتم إرسال كافة التوجيهات من خلال رسالة إلى بريدك الإلكتروني الذي تم الإشتراك به. هناك بعض الأسئلة و المواضيع الشائعة حول الأكاديمية و الدورات يُمكنك الوصول إليها من خلال: مركز المساعدة
-
يُمكنك الوصول إلى ما تريد بإستخدام حلقة للمرور على كافة المفاتيح و التحقق من القيمة إن كانت مُساوية للقيمة المطلوبة نقوم بتخزين المفتاح الموافق لها بهذا الشكل: my_dict = { "Adam" : 18, 'Ebrahim' : 19, "Samir" : 18, "Moahamed" : 30 } wanted_keys = [key for key in my_dict.keys() if 18 == my_dict[key]] print(wanted_keys) # ['Adam', 'Samir']
- 3 اجابة
-
- 1
-
-
منذ الإصدار laravel 5.2 أصبح بالإمكان إستخدام التابع file لإرجاع الملف دون تحميله في جهاز العميل بهذا الشكل: return response()->file($pathToFile); return response()->file($pathToFile, $headers); كما يُمكن إستخدام الطريقة التالية في حالة كنت تستخدم إصدار أقدم: $filename = 'test.pdf'; $path = storage_path($filename); return Response::make(file_get_contents($path), 200, [ 'Content-Type' => 'application/pdf', 'Content-Disposition' => 'inline; filename="'.$filename.'"' ]); لأنه بإستخدامك للتابع download فإنه تلقائياً سيتم إستخدام القيمة attachment للخاصية Content-Disposition التي تفرض على المتصفح تحميل الملف.