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

سمير عبود

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

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

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

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

    34

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

  1. لو تم كتابتها بشكل مُباشر سيتم تنفيذها في كل الأحوال أما بإستخدام 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. هناك طريقتان لإجراء اختيارات عشوائية بإستعمال إحتمالات إختيار لكل عنصر في بايثون: إذا كنت تستخدم 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]))
  3. الفرق بين النسخ السطحي والنسخ العميق يظهر فقط في الكائنات المركبة (الكائنات التي تحتوي على كائنات أخرى ، مثل القوائم أو نُسخ من الفئات) حيث: يُنشئ النسخ السطحي كائنًا مركبًا جديدًا ثم تُدرج مراجع محتوياته إلى الكائنات الموجودة في الأصل. أما النسخ العميق يُنشئ كائنًا مركبًا جديدًا ، ثم تُدخل نسخًا متكررة فيه من الكائنات الموجودة في الأصل مثال للتوضيح: 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 و هذا ما ذكرناه في النسخ العميق أنه يُنشئ كائناً جديداً ثم يُنشئ كائنات منسوخة من الكائنات الموجودة في الأصل في مُحتويات الكائن الذي نريد نسخه.
  4. لنفترض أنه لديك ملف بالإسم 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) يُمكنك تجربة المثال من: هنا
  5. تأكد أنك تستخدم التابع unset بشكل صحيح فالحقل الذي تريد حذفه هو حقل فرعي لذلك يجب إخبار MongoDB بذلك بإستخدام dot notation بهذا الشكل: .update( {}, { $unset: {'attributes.ips':1}}, {multi: true} ) كما يُمكن أيضاً إستخدام التابع updateMany لتعديل عدة مُستندات: .updateMany( {}, { $unset: {'attributes.ips':1}} )
  6. لماذا لا تُفكرين في عمل نموذج آخر مثلا Hobby و الربط بينه و بين نموذج User بعلاقة many to many اي كل مستخدم يُمكن أن يكون له عدة هوايات و الهواية يُمكن أن تنتمي لعدة مُستخدمين، و بهذا الشكل تخزين البيانات سيكون أسهل و البحث و الإستعلام بخصوص الهوايات في المستقبل سيكون أسهل
  7. يُمكن القيام بالأمر عن طريق إستخدام where بالشكل التالي: .find( { $where: "this.employees.length > 2" } ); كما يُمكنك أيضاً إستخدام هذه الطريقة: // ابحث عن جميع المستندات التي تحتوي على 3 عناصر على الأقل في المصفوفة .find({'employees.2': {$exists: true}})
  8. يُمكن الوصول لما تُريد بإستخدام: 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'}})
  9. يُمكن إستخدام الدالتين 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
  10. العامل الثلاثي في لغة بايثون مُختلف نوعاً ما مثلاً في جافاسكربت العامل الثلاثي بهذا الشكل: // 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
  11. يُمكن الحصول على الفرق بين القائمتين بالشكل التالي: lst1 = ['One', 'Two', 'Three', 'Four'] lst2 = ['One', 'Two'] result = list(set(lst1) - set(lst2)) print(result) # ['Four', 'Three']
  12. الأمر بسيط فقط قومي بإتباع بعض الخطوات سأشرحها لك بإستخدام مثال: سنُضيف لإستمارة التسجيل نوع المُستخدم 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']), ]); } و هكذا بنفس الطريقة يُمكنك إضافة حقول أخرى.
  13. بإمكانك إلقاء نظرة على مكتبة: gridstack.js فهي تُوفر الخصائص التي تُريدها. مُستودع المكتبة على github من: هنا
  14. في هذه الحالة بإمكانك التواصل مع الدعم الفني من خلال: مركز المساعدة و شرح المُشكلة لهم و سيقومون بتغيير الدورة لك في أقرب وقت. بالتوفيق.
  15. المُشكلة لديك في وجود فراغ في قيمة الخاصية 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 كلها و بعد ذلك الإنتقال لخاصية أخرى.
  16. لأن كل المسارات تُؤدي إلى نفس المُتحكم و نفس التابع فالرد نفسه في كل المسارات: 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');
  17. لديك خطأ في تسجيل الطبقات الوسيطة على مُستوى Kernel.php عند إستيراد كلاس ما نستعمل مجال إسم ذلك الكلاس و ليس مجال إسم آخر مثلاً: الكلاس Admin التي تُعتبر طبقة وسيطة لا تتبع إلى مجال الإسم: Illuminate\Auth\Middleware و إنما إلى: App\Http\Middleware لذلك عند تسجيلها على مُستوى ال Kernel يجب إستيراد الكلاس بالشكل التالي: 'Admin' => \App\Http\Middleware\Admin::class, نفس الملاحظة بخصوص بقية الطبقات الوسيطة.
  18. دروس الدورة موجودة في الأكاديمية على شكل صفحات ويب حيث أنه بدون منحك صلاحية لهذه الصفحات من قبل الإدارة لن تتمكني من الوصول لهذه الصفحات و بالتالي لمُحتويات الدورة، عند الإشتراك في أي دورة سيتم منحك تلك الصلاحية و سيتم ربط حسابك بالدورة التي تم الإشتراك فيها. أما إن لم يكن لديك حساب فستتكفل الأكاديمية بفتح حساب لك. عُموماً عند الإشتراك في أي دورة سيتم إرسال كافة التوجيهات من خلال رسالة إلى بريدك الإلكتروني الذي تم الإشتراك به. هناك بعض الأسئلة و المواضيع الشائعة حول الأكاديمية و الدورات يُمكنك الوصول إليها من خلال: مركز المساعدة
  19. يُمكنك الوصول إلى ما تريد بإستخدام حلقة للمرور على كافة المفاتيح و التحقق من القيمة إن كانت مُساوية للقيمة المطلوبة نقوم بتخزين المفتاح الموافق لها بهذا الشكل: 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']
  20. منذ الإصدار 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 التي تفرض على المتصفح تحميل الملف.
  21. عند إنشائك نُسخة من الصنف UploadedFile قم بتمرير القيمة true لآخر وسيط بهذا الشكل و هذا الوسيط هو وسيط بولياني يأخذ true إن كانت البيئة هي بيئة إختبارية و القيمة الإفتراضية له هي false. $file = new UploadedFile($path, $name, filesize($path), 'image/png', null, true); ^^^^ و هذا مثال يوضح الآلية بإعتبار وجود ملف صورة بالإسم test.png بداخل مجلد tests/stubs: <?php class UploadTest extends TestCase { public function test_upload_works() { $stub = __DIR__.'/stubs/test.png'; $name = str_random(8).'.png'; $path = sys_get_temp_dir().'/'.$name; copy($stub, $path); $file = new UploadedFile($path, $name, filesize($path), 'image/png', null, true); $response = $this->call('POST', '/upload', [], [], ['photo' => $file], ['Accept' => 'application/json']); $this->assertResponseOk(); $content = json_decode($response->getContent()); $this->assertObjectHasAttribute('name', $content); $uploaded = 'uploads'.DIRECTORY_SEPARATOR.$content->name; $this->assertFileExists(public_path($uploaded)); @unlink($uploaded); } } بإمكانك أيضاً النظر إلى التابع fake فهو يُساعد كثيراً في عملية إختبار رفع الملفات مثال: <?php class UploadTest extends TestCase { public function test_upload_works() { $this->post( action('AttachmentController@store'), ['file' => UploadedFile::fake()->image('file.png', 600, 600)] ); /** @var \App\Attachment $attachment */ $this->assertNotNull($attachment = Attachment::query()->first()); $this->assertFileExists($attachment->path()); @unlink($attachment->path()); } }
  22. الفرق بين input و raw_input هو أن raw_input غير موجودة في الإصدار 3.x بينما input موجودة. في الإصدارات 2.x كانت raw_input موجودة و تم إعادة تسميتها إلى input في الإصدارات 3.x، بينما تم حذف الدالة input القديمة. ما يعني أن raw_input القديمة و input الجديدة هما نفس الشيء بينما input القديمة كانت تقرأ الإدخال و تحاول تفسيره او معالجته كأنه تعليمة برمجية. يُمكن محاكاة عمل الدالة input القديمة بإستخدام input بالإضافة إلى الدالة eval: # Python 3 def old_input(str): return eval(input(str)) ex1 = input("type 1: "); # 5 + 6 ex2 = old_input('type 2: ') # 5 + 6 print(ex1) # 5 + 6 print(ex2) # 11
  23. ليس لدي فكرة حول هذا الأمر لقد لاحظت ذلك عند التجربة لكن اعتقدت أنك تفعل ذلك عن عمد، عُموما بإمكانك معرفة السبب بتتبع العملية اي ماذا يحدث عند عرض الصفحة و ماذا يحدث عند وضع علامة صح و تحاول إيجاد السبب.
  24. نعم لقد جربته بالكامل و هو يعمل بشكل ممتاز الآن، عمل جيد إستطعت أن تُدخل أفكارك على التطبيق أنصحك بالمواصلة في ذلك و الإستمرار في مسارات الدورة و ستتعلم الكثير من الأشياء التي ستبني لديك أشياء أخرى. بالتوفيق.
  25. هناك خطأ ما يحدث عند العرض. بإمكانك تفعيل خاصية APP_DEBUG في ملف env. لعرض تفاصيل الخطأ الذي يحدث حتى يُمكنك معالجته. @علي العبدالله لاحظ أن الخطأ الآن يُخبرك: Class "App\Models\day" not found تأكد من أن إسم الملف و الكلاس Day و أعد تسميته في تعريف العلاقة في النموذج Habit لأنه كما أعتقد أن نظام ويندوز لا يأخذ إعتبار لل capital و small في المسارات بينما الأمر يختلف في نظام تشغيل آخر ك لينوكس مثلاً.
×
×
  • أضف...