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

سمير عبود

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

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

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

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

    34

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

  1. حالياً لا توفر الأكاديمية دورات او فيديوهات لتعلم لغة c++ لكن ما توفره هو محتوى نصي عبارة عن مقالات و دروس مكتوبة بشكل يُساعد في تعلم و فهم اللغة يُمكنك الإطلاع على هذه المقالات من خلال هذا الرابط: سلسلة ++c للمحترفين
  2. بإمكانك إستخدام الدالة dict مع الدالة sorted للوصول إلى ما تريد: d = {2:True, 1:False, 4:None, 3:"Hi"} sortedD = dict(sorted(d.items())) print(sortedD) # {1: False, 2: True, 3: 'Hi', 4: None}
  3. الأمر بسيط جداً فإذا نظرنا إليه بعيداً عن الكود فسنجد أن كل مقال ينتمي إلى قسم معين و من جهة معاكسة كل قسم يملك عدة مقالات و على هذا الأساس نقوم بإنشاء العلاقات ففي النموذج Category نضع: public function articles() { return $this->hasMany(Article::class); } و في الجهة المُعاكسة في النموذج Article: public function category() { return $this->belongsTo(Category::class); } بما أن حقل المفتاح الثانوي يتبع عُرف التسمية فلا داعي لتحديده كمعامل في تعريف العلاقة. الآن إذا كان لديك مثلاً مقال مُحدد و تريد الوصول إلى معلومات القسم الذي ينتمي له فالأمر بسيط جدًا ستقوم ب: $article = Article::find(1); $category = $article->category; $categoryName = $category->name; عندما نصل إلى العلاقة كخاصية فإننا نريد جلب السجل بكافة معلوماته.
  4. أظن أنك تقصد توثيق الحساب و التأكد من الهوية، أعتقد أن هذه العملية لا تتم كلها برمجياً و إنما عن طريق أشخاص يعملون ضمن الموقع الخاص بك و يتم التحقق وفق معايير يتم تحديدها مُسبقاً. بعض التطبيقات حتى تُؤكد هويتك الشخصية تطلب منك أخذ صور سيلفي مع شيء يُثبت الهوية سواء جواز سفر، رخصة سياقة، بطاقة هوية وطنية ... و بعد أخذ الصور من كاميرا الهاتف يتم رفعها مباشرة لسيرفر الموقع و التأكد منها و من مطابقة المعلومات المقدمة مُسبقاً من طرف مُستخدم الحساب، يُمكن أن تتم العملية عبر حجز موعد مع أحد العاملين في الموقع عبر مكالمة صوت و صورة و التأكد من المعايير المحددة مُسبقاً.
  5. قد نرغب أحيانا في تنفيذ بلوك من التعليمات البرمجية إذا تحقق شرط ما او قد نرغب بتكرار مجموعة تعليمات برمجية لعدد معين من المرات و هذه الأقواس أو المعقوفات هي ما تجعلنا نعرف بداية البلوك من نهايته و تُساعد مترجم اللغة في فهم ذلك فمثلاً إن كان لدينا: for (int i = 0; i < 5; i++) { // تعليمات برمجية نريد تكرارها } فما هو موجود بين المعقوفات سيتم تكراره 5 مرات. بعض اللغات لا تعتمد على المعقوفات في تحديدها للبلوك فعلى سبيل المثال مفسر لغة بايثون يعتمد على المسافة البادئة للسطر البرمجي مثال: fruits = ["apple", "banana", "cherry"] for x in fruits: print(x) if x == "banana": break تعليمة الطباعة print و تعليمة الشرط if ينتميان لنفس البلوك.
  6. بإمكانك إستخدام حلقتين متداخلتين من النوع for لتحقيق ما تريد: list1 = ["Hello", "take"] list2 = ["Dear", "Sir"] list3 = [] for i in list1: for j in list2: list3.append(i + " " + j) print(list3) # ['Hello Dear', 'Hello Sir', 'take Dear', 'take Sir'] أيضاً بإمكانك إستخدام الحلقتين المتداخلتين في List Comprehension كما يلي: list1 = ["Hello", "take"] list2 = ["Dear", "Sir"] list3 = [i + " " + j for i in list1 for j in list2] print(list3) # ['Hello Dear', 'Hello Sir', 'take Dear', 'take Sir']
  7. السبب أنك تقومين بالإشارة إلى جدول لم يتم إنشاؤه بعد فملف التهجير genders موجود في الترتيب بعد ملف people فلحل المُشكل قومي بتغيير إسم ملف التهجير لجدول genders ليكون قبل people مثلاً بهذا الإسم: 2021_06_01_095234_create_genders_table.php بعد ذلك في ملف people قومي بتغيير: $table->increments('id'); إلى: $table->id(); حتى يتم إستخدام نفس النوع لحقول المفاتيح الأولية و حتى لا تحدث أخطاء مستقبلية بسبب النوع. بعد ذلك يُمكنك إعادة تنفيذ أمر التهجير: php artisan migrate:fresh
  8. الخطأ المُرفق ليس لنفس الملف بل لمشروع آخر، أيضاً هل بإمكانك توضيح الكيفية التي تقومين بها بإضافة المفتاح الثانوي أعتقد أنك تتبعين طريقة خاطئة.
  9. يوفّر Laravel دعم لإنشاء قيود المفاتيح الثانوية، على سبيل المثال لنفرض أننا نريد إضافة مفتاح ثانوي على مُستوى جدول مقالات مرجعه هو المفتاح الأولي في جدول المُستخدمين فإننا نعرّف عمود user_id على جدول posts الذي يشير إلى عمود id في جدول users بهذا الشكل: Schema::table('posts', function (Blueprint $table) { // .. $table->unsignedBigInteger('user_id'); $table->foreign('user_id')->references('id')->on('users'); }); ملاحظة يجب أن يكون المفتاح الثانوي و المفتاح الأولي الذي يشير إليه من نفس النوع و في الإصدارات الأخيرة أصبح نوع المفتاح الأولي المستخدم من طرف لارافل هو BigInteger بعكس الإصدارات الأقدم كان Integer. يمكنك تحديد الإجراء المطلوب أيضًا لخصائص "on delete" و"on update" من القيد: $table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade'); في الإصدار الثامن تم إختصار السطرين أي تعريف الحقل و جعله كمفتاح ثانوي و إضافة القيد بالتالي: Schema::table('posts', function (Blueprint $table) { $table->foreignId('user_id')->constrained(); }); حيث أن التابع foreignId هو إختصار ل unsignedBigInteger بينما constrained هو تابع يُستخدم لتحديد الجدول و العمود الذي سيتم الإشارة إليه. إذا كنت تتبع التسمية user_id فلارافل ستُحدد الجدول المشار إليه من إسم الحقل على أنه users لكن إن لم تتبع العُرف في التسمية و لنفرض أنك أردت تسمية الحقل ب created_by فتحتاج إلى تمرير إسم الجدول كمعامل للتابع constrained بهذا الشكل: Schema::table('posts', function (Blueprint $table) { $table->foreignId('created_by')->constrained("users"); });
  10. يُمكنك دائما تتبع طلبات ajax من خلال قسم Network في أدوات المطورين للمتصفح لمعرفة نتيجة الطلب و معرفة سبب المُشكلة. أعتقد أن لديك مُشكلة في كتابة الإستعلام هل يُمكنك تغيير السطر: إلى التالي $result = $conn->query("INSERT INTO supplying_items (name) VALUES ($name)"); كما أنصحك بالإطلاع على: parameterized prepared statements للحماية من ثغرة SQL injection
  11. الخطأ الذي أدرجته لا يُسببه هذا السطر: $image=$user->images->first(); فحتى لو لم يكن للمُستخدم أية صورة سيُرجع السطر أعلاه null. أي أن المُتغير image سيحوي null. ما يعني أنك إن أردت الوصول إلى أحد خصائص الغرض image بالشكل التالي: $image['path'] سيُعطي الخطأ المُدرج في السؤال: Trying to access array offset on value of type null أما إن أردت الوصول للخاصية بإعتبار image كائن بهذا الشكل مثلاً: $image->path; سيُعطي الخطأ التالي: Trying to get property 'path' of non-object و في هذه الحالة يُمكنك إستخدام عامل التحقق من القيمة الفارغة Null Coalescing Operator بهذا الشكل مثلاً: $image['path'] ?? "default image path" و هكذا إن كانت هناك صورة سيتم إرجاع مسارها أما إن لم يكن هنالك صورة سيتم إرجاع مسار الصورة الإفتراضية و هذا فقط مثال للتوضيح.
  12. المصفوفة fillable ليست إجبارية و إنما يتم إستخدامها في حالة أردنا إتاحة التعيين الجماعي لبعض الحُقول و في هذه الحالة يتم وضع هذه الحقول بداخل هذه المصفوفة. يمكن استخدام التابع create لحفظ سجل جديد في سطر وحيد. لكن قبل القيام بذلك، يجب أن تُعيّن أحد الخاصيات fillable بسبب حماية نماذج Eloquent افتراضيًّا من التعيين الجماعي. لنفترض أنه لديك النموذج User والخاصية name و أردت إنشاء كائن من هذا النموذج ثم تخزينه في قاعدة البيانات فيُمكنك ذلك كالتالي: public function store(Request $request) { // تحقق من الطلب.. $user = new User; $user->name = $request->name; $user->save(); } بهذا الشكل أنت لم تستخدم التعيين الجماعي و في هذه الحالة لست بحاجة لإستخدام المصفوفة fillable. أما إن قمت بالعملية بهذا الشكل: $user = User::create(['name' => 'John Doe']); فسيتم رمي إستثناء من النوع MassAssignmentException و السبب هنا أنك تستخدم التعيين الجماعي و لارافل ستقوم بحمايتك. الآن إن أردت أن تحمي نفسك بنفسك و تُلغي تفعيل حماية لارافل ستستخدم المصفوفة fillable او guarded فالمصفوفة fillable هي بمثابة القائمة البيضاء نضع بها الحقول التي نسمح بتعيينها جماعياً و guarded عكسها. هناك عدة توابع أخرى يُمكن إستعمال التعيين الجماعي معها منها update، firstOrCreate و غيرها ..
  13. مرحباً بك، سيتم التواصل معك عبر بريدك الإلكتروني الذي قمت بالإشتراك من خلاله و سيتم إرسال كافة الإرشادات اللازمة لك التي من خلالها تتمكن من الإلتحاق بالدورة، لمعلومات أكثر يٌمكنك التواصل مع الدعم الفني من خلال مركز المساعدة من: مركز مساعدة أكاديمية حسوب
  14. يُمكنك إستخدام الأفكار التالية لإنشاء البرنامج: لطباعة جملة نستخدم التعليمة System.out.println فمثلاً لسؤال المستخدم عن إسمه يُمكننا إستخدام: System.out.println("Enter your name: "); لإستقبال مُدخلات من المُستخدم نستعمل الحزمة Scanner نقوم بإستيرادها: import java.util.Scanner; ثم نُنشئ كائن من الصنف Scanner: Scanner scanner = new Scanner(System.in); الآن إذا أردنا إستقبال و تخزين إسم المستخدم نقوم بالتالي بعد سؤاله: Scanner scanner = new Scanner(System.in); System.out.println("Enter your name: "); String name = scanner.nextLine(); و هنا عند تشغيل البرنامج سيتم طباعة الجملة و الإنتظار لحين إدخال أي شيء من طرف المُستخدم و الضغط على enter تُخزن في المُتغير name. بعد ذلك يُمكننا سؤال المُستخدم عن عمره و إستقبال المُدخلات في مُتغير: System.out.println("Enter your age: "); int ageInYears = scanner.nextInt(); الآن بما أنه لديك كافة البيانات لحساب العُمر بأي وحدة فمثلاً العُمر بالاشهر هو حاصل ضرب العمر بالسنوات في 12: int ageInMonths = ageInYears * 12; و العمر بالأيام هو حاصل ضرب العمر بالسنوات في 365 لأن السنة بها 365 يوم: int ageInDays = ageInYears * 365; و العمر بالساعات هو حاصل ضرب العمر بالأيام في 24 بعد الحساب يُمكنك الطباعة بأي شكل تريدين: System.out.println("Hello " + name + "\nYour Age in:\nYears: " + ageInYears + "\nMonths: " + ageInMonths + "\nDays: " + ageInDays + "\nHours: " + ageInHours );
  15. المطلوب هو إن كان عدد تكرار الحرف e محصور بين 1 و 3 ترجع الدالة true بينما في الحالة المعاكسة ترجع الدالة false. هناك عدة طرق لمعرفة تكرار حرف ما داخل سلسلة نصية من بينها إستخدام الدالة split التي تقسم السلسلة إلى عناصر حسب محدد و ترجع مصفوفة بهذه العناصر. مثلا: "str1,str2,str3,str4".split(","); // ["str1", "str2", "str3", "str4"] فبالتالي إن أردنا معرفة تكرار الفاصلة في السلسلة أعلاه نقوم بتقسيمها على حسب الفاصلة، ينتج لدينا مصفوفة نحسب عناصرها و ننقص واحد لإرجاع كم مرة تكررت الفاصلة: "str1,str2,str3,str4".split(",").length - 1; // 3 بالتالي نستخدم القاعدة أعلاه لإنشاء الدالة stringE: function stringE(str) { count = str.split("e").length - 1; if (count >= 1 && count <= 3) return true; return false; }
  16. يُمكنك إستخدام المكتبة التالية: natsort فبعد تثبيتها يُمكنك إستخدامها بالشكل التالي: from natsort import os_sorted x = ['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9'] print(os_sorted(x)) و الخرج سيكون كالتالي: ['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13'] كما أنه بإمكانك إنشاء دالة تقوم بما تريد بإستعمال التعابير النمطية و دوال lambda كالتالي: import re def natural_sort(l): convert = lambda text: int(text) if text.isdigit() else text.lower() alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] return sorted(l, key = alphanum_key) x = ['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9'] print(natural_sort(x)) و ستحصل على نفس النتيجة أيضاً.
  17. لم أفهم قصدك جيداً. ألم يطلب منك تحويل هذا التصميم نفسه إلى صفحات ويب بنفس الألوان الموجودة عليه !!!؟
  18. أنت كمطور واجهات ليس عليك أن تكون مصمم فالمصمم هو الذي سيختار الألوان و يحدد تموضع العناصر في التصميم و إنما مهمتك هي تحويل التصميم إلى صفحات ويب متجاوبة سواء كان التصميم صورة أو psd يجب عليك إحترام الألوان الموجودة في التصميم و أهم شيء هو البحث في الانترنت فمثلاً إن أردت البحث عن قوالب psd مجانية لتقليدها و اكتساب خبرة يُمكنك البحث عن: free psd landing page template أو أي شيء يوضح ما تبحث عنه و سيُرشح لك محرك البحث العديد من المواقع التي توفر لك مثل هذه القوالب المجانية. لم أفهم هذا الجزء فالعميل في هذه الحالة لم يطلب منك أن تُصمم الصفحة و إنما هو مجال عملك على ما أعتقد فتحويل psd إلى صفحة ويب أو تحويل تصميم موجود على صورة لا يختلفان عن بعضهما كثيراً. إن كنت لا تعرف ماهي الألوان التي يجب إستخدامها يُمكنك إستخدام إضافة ColorZilla فهي تسمح لك بإلتقاط اللون من على صفحة ويب يُمكنك إضافتها لكروم أو موزيلا فهي موجودة. كما أني أنصحك بأخذ أحد التصاميم الموجودة في مسار خمس صفحات هبوط و حاول تقليدها بنفسك دون الإستعانة بالدروس أو المدرب. إستخدم أحد أطر العمل الخاصة ب css لأنه سيُساعدك كثيراً في إنجاز العمل. إن أردت زيادة و تعلم مهارات التصميم فيُمكنك الإطلاع على الأسئلة في قسم التصميم أو طرح سؤالك في هذا الموضوع هناك حيث ستجد أصحاب خبرة و محترفين في التصميم لتقديم النصح لك.
  19. تتم الوراثة في بايثون عن طريق تمرير الصنف الأب إلى الصنف الإبن كمعامل على هذا الشكل: class BaseClass: Body of base class class DerivedClass(BaseClass): Body of derived class حيث أن BaseClass هو الصنف الأب و DerivedClass هو الصنف الإب. أنصحك بالإطلاع و قراءة هذا الكتاب لأن به كل ما تحتاجين له: البرمجة بلغة بايثون 1.0.0
  20. يتم الأمر بإستخدام لغة css تقوم بإنشاء ملف تنسيقات و تضيف له الخط عن طريق الخاصية font-face: @font-face { font-family: 'Cairo'; src: url('fonts/Cairo-Regular.ttf'); } ثم تقوم بتطبيقه على العناصر التي تريد: .label { -fx-font-family: 'Cairo'; -fx-font-size: 50; } .button .text { -fx-font-family: 'Cairo'; } بعد ذلك تستدعي و تُطبق التنسيقات على ال scene: scene.getStylesheets().add(getClass().getResource("resources/style.css").toExternalForm()); المثال موجود على مستودع github من خلال هذا الرابط: JavaFx Font Test Application و هذه النتيجة استخدمت خط Cairo:
  21. انا فقط اعطيتك رؤوس أقلام و ماهي الطرق المتاحة فمثلا الوقت الذي ستقضيه في بناء تطبيقين ios و اندرويد باللغات الأم ( java و swift ) أكبر من إنشائك للتطبيقين بكود base واحد، فهناك عدة عوامل للإختيار و في الأخير يعتمد الأمر عليك فأنت وحدك من يختار الأنسب و الأفضل لك. خذ كامل وقتك في دراسة الطرق و الأساليب المتاحة و الفروقات بينها بعد ذلك حدد هدفك و ابدأ في التعلم و لا تنتقل من تقنية إلى اخرى دون إتقان ما بين يديك و إنشاء مشاريع فعلية. لنفترض أنك إطلعت على عدة مقالات و درست الطرق الموجودة و في الأخير قررت ان تبرمج التطبيقات على منصة flutter فلا تتعلم جزء من الأساسيات ثم تنتقل إلى تقنية أخرى، بما أنك قررت ان تبرمج على منصة flutter فأكمل الطريق حتى تبرمج تطبيقات كبيرة او متوسطة الحجم و ترفعها على متاجر التطبيقات و لا تستمع إلى الأقاويل التي تشتت المتعلم ان التقنية الفلانية افضل من تقنية أخرى. ادرس الميزات و الفروقات من البداية و حدد الأفضل لك ثم إبدأ. بالتوفيق
  22. ستجد في هذا الدليل كل ما تبحث عنه لأنه سيضعك في بداية الطريق: بعد إختيار مجالك الذي تريد أن تتعلمه ستتضح لك الرؤية. في برمجة تطبيقات الهاتف هناك عدة خيارات بالنسبة لك: فإن أردت إنشاء تطبيقات أصيلة لنظام ios عليك تعلم لغة swift، أما إن أردت إنشاء تطبيقات أصيلة لنظام اندرويد فعليك تعلم لغة جافا (Java) أو لغة كوتلن (Kotlin). لكن في هذه الحالة إن أردت إنشاء تطبيق للمنصتين معاً تحتاج إلى مشروعين مختلفين تطبيقين بأكواد مختلفة. و من هنا جاءت فكرة التطبيقات الهجينة بإستعمال منصة كوردوفا و منصة ionic التي تسمح لك بإنشاء تطبيقين للمنصتين إنطلاقاً من كود و مشروع واحد. لكن أداء هذه التطبيقات مقارنة بالتطبيقات الأصيلة ضعيف. و في السنوات الأخيرة ظهرت فكرة التطبيقات المترجمة ( compiled apps ) الفكرة هنا أنك تبني التطبيق الخاص بك بإستعمال أحد المنصات مثل flutter او react native او غيرها و عند بناء التطبيق لتحويله إلى تطبيق ios او اندرويد يتم ترجمة الكود من لغة المنصة إلى native code أي إلى جافا أو كوتلن في حالة أندرويد و إلى سويفت في حالة ios. قبل البدأ بالتعلم و الخوض في أي مجال إطلع و أدرس الفروقات من خلال البحث عن مقالات تشرح هذه المجالات ثم حدد خيارك و إبدأ التعلم.
  23. sass تم إجراء بعض التعديلات عليها في الإصدارات الحديثة يُمكنك تلافي المشكلة بالتعديل على ملف package.json الموافق للمشروع في إصدار الحزمة: "sass": "1.32.13", ثم إعادة تنفيذ: npm install && npm run dev
  24. يجب أن يكون APP_URL موافق لرابط التصفح حتى يتم عرض الصور بنجاح
×
×
  • أضف...