-
المساهمات
14490 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
384
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Mustafa Suleiman
-
استخدم قيمة ذلك الحقل لتنفيذ البحث في قاعدة البيانات، كالتالي: في ملف العرض (View) الخاص بك، أنشئ نموذج (Form) بحث بالشكل التالي: <form method="GET" action="/search"> <input type="text" name="query" placeholder="ابحث عن الاسم"> <button type="submit">ابحث</button> </form> ثم، في ملف التوجيه (Routes)، حدد مسار للبحث وربطه بوظيفة في وحدة التحكم (Controller)، كالتالي: Route::get('/search', 'SearchController@search'); وفي وحدة التحكم (Controller) الخاصة بالبحث، تستطيع استقبال الاستعلام (query) المدخل من الحقل واستخدامه في جملة البحث، كالتالي: use Illuminate\Http\Request; use App\Models\Table; class SearchController extends Controller { public function search(Request $request) { $query = $request->input('query'); $results = Table::where('name', 'LIKE', '%' . $query . '%')->get(); // عرض النتائج أو قم بالإجراءات المناسبة return view('search_results', ['results' => $results]); } } بحيث تستقبل الاستعلام (query) من الحقل بواسطة كائن Request، ثم استخدامه في جملة البحث للبحث عن السجلات التي تحتوي على الاستعلام في حقل الاسم، وتُرسل النتائج إلى عرض (View) المستخدم لعرضها بطريقة مناسبة. واستبدل Table بالاسم الصحيح للنموذج لديك، واستبدال search_results بعرض النتائج أيضًا.
-
الـ Set هي مجموعة من العناصر الفريدة، حيث يمكن أن تكون العناصر من أي نوع، بما في ذلك الكائنات والأرقام والأحرف والسلاسل، وتستطيع الوصول إلى العناصر في الـ Set عن طريق معرفها، أو عن طريق تكرار جميع العناصر في المجموعة. مثال عن تخزين قائمة من الأرقام باستخدام Set: const set = new Set([1, 2, 3, 4, 5]); // set.has(3) // true // set.has(6) // false تحتوي المجموعة set على الأرقام 1 و 2 و 3 و 4 و 5. لا تحتوي المجموعة على الرقم 6. الـ WeakSet هي مجموعة من الكائنات فقط، ولا يمكن الوصول إلى العناصر في الWeakSet إلا من خلال معرفها، مما يعني أن العناصر في الWeakSet لن يتم جمعها بواسطة GC حتى لا يتم الإشارة إليها بأي طريقة أخرى. الـ Map هي مجموعة من الأزواج، ويكون كل زوج مكونًا من مفتاح وقيمة، وبالإمكان أن تكون المفاتيح في الMap من أي نوع، بما في ذلك الكائنات والأرقام والأحرف والسلاسل، ويتم الوصول إلى القيم في الMap عن طريق معرف المفتاح، أو عن طريق تكرار جميع الأزواج في المجموعة. تخزين قائمة من الكائنات باستخدام Map: const map = new Map([ [1, "Object 1"], [2, "Object 2"], [3, "Object 3"] ]); // map.get(1) // "Object 1" // map.get(4) // undefined تحتوي الخريطة map على الكائنات { id: 1, name: "Object 1" } و { id: 2, name: "Object 2" } و { id: 3, name: "Object 3" }. لا تحتوي الخريطة على الكائن { id: 4, name: "Object 4" }. الـ WeakMap عبارة عن مجموعة من الكائنات فقط، ونصل إلى القيم في الـ WeakMap فقط عن طريق معرف المفتاح.، أي أن القيم في الWeakMap لن يتم جمعها بواسطة GC حتى لا يتم الإشارة إليها بأي طريقة أخرى. والحالات التي تصلح لاستخدام الـ WeakSet والـ WeakMap هي للتعامل مع الكائنات التي لا يجب أن تتم إدارتها أو جمعها من قبل (Garbage Collector - GC) في لغات البرمجة التي تدعم تلك الهياكل ومنها جافاسكريبت. مثلاً قد تستخدم الـ WeakSet لتخزين قائمة بالمراجع إلى الكائنات التي تم إنشاؤها مؤقتًا، بحيث يتم حذف هذه الكائنات بمجرد عدم استخدامها بعد الآن، ونستخدم الـ WeakMap لتخزين مجموعة من الإعدادات، بحيث يتم حذف الإعدادات بمجرد عدم استخدامها بعد الآن. أيضًا تستخدم الـ WeakSet والـ WeakMap للتعامل مع الكائنات التي لا ينبغي الوصول إليها إلا من خلال طريقة معينة، أي نستخدم الـ WeakSet لتخزين قائمة بالمراجع إلى الكائنات التي لا ينبغي الوصول إليها إلا من خلال طريقة معينة، بحيث لا يمكن الوصول إلى هذه الكائنات من أي طريقة أخرى، ونستخدم الـ WeakMap لتخزين مجموعة من الإعدادات، بحيث لا يمكن الوصول إلى هذه الإعدادات إلا من خلال طريقة معينة. وإليك مثال عن تخزين قائمة من الكائنات التي تم إنشاؤها مؤقتًا: const weakSet = new WeakSet(); const obj1 = { id: 1, name: "Object 1" }; const obj2 = { id: 2, name: "Object 2" }; weakSet.add(obj1); weakSet.add(obj2); // delete obj1; // weakSet.has(obj1) // false // weakSet.has(obj2) // true كما ترى، تم حذف الكائن obj1 من مجموعة weakSet، لأنه لم يكن هناك كائنات أخرى تشير إليه. تخزين مجموعة من الإعدادات: const weakMap = new WeakMap(); const setting1 = { key: "key1", value: "value1" }; const setting2 = { key: "key2", value: "value2" }; weakMap.set(setting1, setting1.value); weakMap.set(setting2, setting2.value); // delete setting1; // weakMap.get(setting1) // undefined // weakMap.get(setting2) // "value2" كما ترى، لم يعد بإمكاننا الحصول على قيمة setting1 من مجموعة weakMap، لأنه لم يكن هناك كائنات أخرى تشير إليه، ولكن، لا يزال بإمكاننا الحصول على قيمة setting2. وأنصحك بقراءة التالي:
-
السؤال الصحيح هو، هل لديك الوقت الكافي؟ عليك بتحديد الوقت المتاح لك ثم التخطيط على أساسه، وأيضًا تحديد الدورات بناءًا على الهدف والمجال الذي تنوي التخصص به، فلو أردت التأسيس في مجال البرمجة بشكل جيد ولديك الوقت الكافي، فعليك بتعلم C++ أولاً لكن البعض قد يجدها صعبة ويصاب بالإحباط بدون داعي، ولذلك ستجد أغلب دورات أساسيات البرمجة تقوم بتدريس لغة بايثون لكونها لغة قوية وشائعة الاستخدام ومطلوبة وسهلة، أي أن الأمر راجع لك وتستطيع التجربة والحكم ولا مشكلة في ذلك أبدًا لكن بشرط المحاولة. وقد ذكرت أنك درست CS50 ولن تحتاج إلى أكثر من ذلك حاليًا في البداية، عليك فقط بإختيار لغة البرمجة الأولى لك والتمسك بها والتعمق فيها من خلال تنفيذ المشاريع بعد دراسة الأساسيات والتطبيق عليها، وإذا أردت دراسة جافاسكريبت كلغة برمجة أولى فلا مشكلة في ذلك، لكن الصحيح هو C أو C++ ثم بايثون ثم جافاسكريبت رغم أني أفضل C++ ثم بايثون ثم جافاسكريبت، هل أنا تعلمت بتلك الطريقة؟ لا، الوقت لدي كان محدود، لذلك تعلمت أساسيات البرمجة من خلال بايثون لقلة الوقت لدي ولسهولة تعلم بايثون، ثم انتقلت إلى الواجهة الأمامية وتعمقت في جافاسكريبت، ثم تعلمت إطار خاص بالواجهة الأمامية وهو React ثم تعلمت الواجهة الخلفية من خلال node.js وذلك خلال فترة 6 أشهر وبمعدل 10 ساعات يوميًا وربما أكثر، فالأمر ليس بالهين أبدًا. وإذا أردت نصيحة واحدة فقط، ركز على الأساسيات ما استطعت وبشدة ثم طبق عليها بأكثر من مشروع حتى تشعر أنك استوعبتها تمامًا وأصبح الأمر سهل من خلال التكرار. وأنت لديك الوقت كما أظن، فتعلم بالطريقة الصحيحة كما أشرت لك، ثم انتقل للغة الخاصة بالمجال الذي تنوي التخصص به.
- 4 اجابة
-
- 1
-
-
أنت تتحدث عن بايثون وبها تُعرف كل من القوائم والصفوف باسم «المجموعات» وبالطبع هناك بعض الاختلافات الرئيسية: القوائم هي بنية بيانات قابلة للتغيير، مما يعني أنه باستطاعتك إضافة عناصر إليها أو حذفها أو تعديلها دون الحاجة إلى إنشاء قائمة جديدة، وتُستخدم القوائم لتخزين البيانات التي لا تحتاج إلى أن تكون مرتبة، مثل قائمة المهام أو قائمة التسوق. الصفوف هي بنية بيانات غير قابلة للتغيير، مما يعني أنه لا يمكنك إضافة عناصر إليها أو حذفها أو تعديلها دون إنشاء صف جديد، وتُستخدم الصفوف عادةً لتخزين البيانات التي تحتاج إلى أن تكون مرتبة، مثل قائمة الطلاب في الفصل الدراسي أو قائمة المنتجات في متجر. متى تستخدم القائمة؟ عندما تحتاج إلى بنية بيانات قابلة للتغيير يمكن أن تحتوي على عناصر من أنواع مختلفة، أي مثل استخدام قائمة لتخزين قائمة المهام أو قائمة التسوق أو قائمة الطلاب في الفصل الدراسي أو قائمة المنتجات في متجر. متى تستخدم الصف؟ في حال أنك تحتاج إلى بنية بيانات غير قابلة للتغيير يمكن أن تحتوي على عناصر من نوع واحد فقط، مثلاً صف لتخزين قائمة الطلاب في الفصل الدراسي أو قائمة المنتجات في متجر. وإليك بعض الأمثلة: # هذا مثال على قائمة تحتوي على أسماء الطلاب في الفصل الدراسي: students = ["John", "Mary", "Peter", "Susan"] # هذا مثال على صف يحتوي على علامات الطلاب في الفصل الدراسي: grades = [90, 80, 70, 60] # هذا مثال على كيفية إضافة عنصر إلى قائمة: students.append("Alice") # هذا مثال على كيفية حذف عنصر من قائمة: students.remove("Mary") # هذا مثال على كيفية تعديل عنصر في قائمة: students[0] = "Jane" # هذا مثال على كيفية إنشاء صف جديد من قائمة: grades_2 = list(grades)
- 6 اجابة
-
- 1
-
-
تلك نتيجة طبيعية لدراسة الدورة بالأسلوب الغير صحيح، وفي البداية ستحتاج إلى 3 أشهر على الأقل في حالة الدراسة بشكل يومي لإنهاء الدورة في حال كانت تلك لغة البرمجة الأولى لك، حيث سيتعين عليك المراجعة وإعادة بعض الدروس وإعادة تنفيذ بعض المشاريع بمفردك وخلافه، لكي تتمكن من تثبيت المعلومات. ولا مشكلة إذا استغرقت أكثر من ذلك، لكن يجب ثم يجب تحديد جدول زمني واقعي بناءًا على الوقت المتاح لك وبناءًا على تقديرك لنفسك وعلى المقدار الذي تستطيع استيعابه بشكل يومي، وخصص وقت لكتابة الكود والتدرب على ما تعلمته وليس مشاهدة الفيديوهات فقط. وعليك باستيعاب أنه يوجد ما يسمى بمنحنى النسيان وهو مفهوم يستخدم في علم النفس لوصف طريقة تغير الذاكرة مع مرور الوقت، ويعني كيفية تلاشي الذكريات مع مرور الزمن وتقليل قدرة الفرد على استعادة المعلومات التي تم تخزينها في الذاكرة. في بداية تخزين المعلومات، يكون الاسترجاع سهلًا ودقيقًا، ولكن مع مرور الوقت، يتلاشى الاسترجاع ويصبح أصعب، ويشير منحنى النسيان إلى أن هناك فترة تتلاشى خلالها المعلومات بشكل سريع في البداية، ولكن مع مرور الوقت، يصبح معدل النسيان أقل وأقل، ويتم الحفاظ على الجوهر الأساسي للمعلومات المهمة. فبعد مرور يوم واحد من التعلم، هناك انخفاض في الاسترجاع الدقيق للمعلومات، ويعتمد مدى النسيان على عوامل مثل طبيعة المعلومات ومدى تكرارها وأهميتها بالنسبة للشخص تتراوح نسبة النسيان بعد مرور يوم واحد بين 20% إلى 40% من المعلومات. وبعد 3 أيام من 50% إلى 70% وبعد مرور أسبوع ترتفع النسبة إلى 70% وحتى 90%، وذلك في حال لم تقم بإعادة تكرار ما تعلمته وذلك من خلال تنفيذ مشاريع للتطبيق على ما تعلمته وتثبيت المعلومات واستخدام ما سبق وتعلم أمور جديدة. أي بعد التطبيق لأول مرة، من الأفضل أن تقوم بالتطبيق مرة أخرى بعد مرور أٍسبوع والأمر قد يبدوا ممل، لكن أنت مخير بين ذلك أو ألم نسيان المعلومات وضياع الوقت الذي استغرقته في ذلك، وعليك أيضًا التركيز على الفهم ثم الحفظ وكلاهما مطلوبان لكن الفهم أولاً فهو ما سيسمح لك بالبحث عن المعلومات واستخدامها حتى لو نسيتها، وستنسى بعض الأشياء بالطبع والجميع كذلك حتى من لديه سنوات خبرة، لكن بسبب الفهم والاستيعاب هو قادر على البحث واستخدام ما يريد مباشرًة. وستجد المزيد من التفصيل في النقاش التالي:
-
Google Fonts استخدام Google Fonts مجانيًا ويتضمن العديد من الخطوط المميزة. ولوضع ال attribution لـ Google Fonts، تستطيع إضافة نص صغير في صفحتك أو تطبيقك الذي يحتوي على الخط المستخدم. وبإمكانك استخدام النص التالي كمثال لل attribution لخطوط Google Fonts: "Fonts by Google Fonts" أو "Powered by Google Fonts"، وأيضًا إضافة رابط لصفحة Google Fonts (https://fonts.google.com/) لتوجيه المستخدمين إلى المصدر الأصلي. Font Awesome Icons مكتبة Font Awesome Icons مجانية أيضًا وتوفر مجموعة كبيرة من الأيقونات المتنوعة. ويُفضل وضع attribution لـ Font Awesome Icons ولكنه ليس إلزاميًا. باستطاعتك إضافة attribution في صفحة الاعتمادات أو صفحة الشكر في تطبيقك أو موقعك. مثلاً استخدم النص التالي كمثال لل attribution لـ Font Awesome Icons: "Icons by Font Awesome" أو "Powered by Font Awesome"، أو إضافة رابط لصفحة Font Awesome (https://fontawesome.com/) للإشارة إلى المصدر الأصلي.
-
نستخدم جملة SQL كالتالي للبحث عن الأسماء بجميع الأشكال الممكنة: SELECT * FROM table_name WHERE name LIKE '%محمد%' AND name LIKE '%فادي%' AND name LIKE '%عادل%' AND name LIKE '%جواريش%'; أما إذا كنت تستخدم إطار عمل Laravel وتستخدم ORM Eloquent، فاستخدم الكود التالي: $results = DB::table('table_name') ->where('name', 'LIKE', '%محمد%') ->where('name', 'LIKE', '%فادي%') ->where('name', 'LIKE', '%عادل%') ->where('name', 'LIKE', '%جواريش%') ->get(); وبالطبع نستبدل table_name بالاسم الصحيح للجدول الذي تحتوي عليه البيانات.
-
السؤال متعلق بدورة تطوير واجهات المستخدم، لذلك أرجو منك التعليق أسفل فيديو الدورة المتعلق بالسؤال في التعليقات، وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة، ليتم مساعدتك بشكل أفضل.
-
عليك بتعديل السطر الخاص بالاستيراد إلى التالي: from TaskController import TaskController وفي حال وجود مشكلة لديك في الدورة أرجو منك التعليق أسفل فيديو الدورة في التعليقات ليتم مساعدتك بشكل أفضل وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة.
-
أنتي بحاجة إلى كتابة الباسورد الخاص بالنظام ولا مشكلة في حال لم يظهر لك الباسورد يكفي كتابته ثم الضغط على Enter وسيتم التحميل وتأكدي من جود إتصال إنترنت قبل تحميل بايثون. والطريقة الصحيحة لثبيت بايثون على نظام لينكس هي بتنفيذ الأوامر التالية: sudo apt update && sudo apt upgrade -y sudo apt install python3 python3-pip ثم تأكدي من تثبيت بايثون من خلال معرفة الإصدار بالأمر التالي: python3 --version
-
تختلف كمية ذاكرة الوصول العشوائي (RAM) التي يحتاجها التعدين من العملة الرقمية إلى أخرى أي حسب صعوبة تعدين العملية والمتبقي منها، فمثلاً يحتاج تعدين البيتكوين إلى ذاكرة وصول عشوائي بسعة 4 غيغابايت على الأقل، بينما يحتاج تعدين الإيثيريوم إلى ذاكرة وصول عشوائي بسعة 8 غيغابايت على الأقل وأنا أتحدث عن الحد الأدنى. ويستهلك تعدين العملات الرقمية كمية كبيرة من الطاقة، وذلك بسبب العمليات الحسابية المعقدة التي تتطلبها عملية التعدين، وتختلف كمية الطاقة التي يستهلكها التعدين من العملة الرقمية إلى أخرى، وذلك حسب خوارزمية التعدين المستخدمة، حيث يستهلك تعدين البيتكوين كمية كبيرة من الطاقة لكونه يعتمد على البطاقة الرسومية GPU بشكل كبير، بينما يستهلك تعدين الإيثيريوم كمية أقل من الطاقة. وبإمكانك حساب استهلاك الطاقة في تعدين العملات الرقمية باستخدام الصيغة التالية: استهلاك الطاقة = قوة الهاش (hash rate) * الجهد الكهربائي (voltage) * التيار الكهربائي (current) حيث: قوة الهاش: هي عدد العمليات الحسابية التي يمكن أن يقوم بها الجهاز في الثانية الواحدة. الجهد الكهربائي: هو مقدار الجهد الكهربائي الذي يتطلبه الجهاز لتشغيله. التيار الكهربائي: هو مقدار التيار الكهربائي الذي يمر عبر الجهاز. ولحساب قوة الهاش استخدم أداة مثل Minerstat أو WhatToMine. بينما لحساب الجهد الكهربائي استخدم أداة مثل FurMark أو OCCT. وكذلك لحساب التيار الكهربائي استخدم أداة مثل HWMonitor أو AIDA64. وانتبه إلى أن استهلاك الطاقة في تعدين العملات الرقمية قد يصبح مرتفعًا جدًا، مما يؤدي إلى ارتفاع فاتورة الكهرباء، لذلك، من المهم اختيار جهاز التعدين الذي يتمتع بكفاءة عالية في استهلاك الطاقة. وأيضًا عليك بحساب الربح بعد خصم تلك المصاريف والفواتير، حيث أن كل بطاقة شاشة تستطيع تعدين عدد معين من العملات الرقمية ولها استهلاك طاقة معين ولها تكلفة إجمالية وهي سعر البطاقة، فعليك بحساب متى ستحصل على تكلفة الكرت ثم تبدأ في الحصول على الربح وأيضًا حساب تكلفة الكهرباء.
-
لتغيير الألوان في منفذ الأوامر المتضمن في vscode عليك بالتواجه إلى الإعدادات من خلال الضغط على CTRL + , أو من خلال file ثم Preferences ثم Settings. والآن ابحث عن workbench color في شريط البحث في الإعدادات، وستجد أنه ظهر لك خيار باسم Edit in settings.json اضغط عليه كالتالي: ثم ستجد خاصية باسم workbench.colorCustomizations فقم بإضافة الكود التالي بها: "workbench.colorCustomizations": { "terminal.background":"#131212", "terminal.foreground":"#dddad6", "terminal.ansiBlack":"#1D2021", "terminal.ansiBrightBlack":"#665C54", "terminal.ansiBrightBlue":"#0D6678", "terminal.ansiBrightCyan":"#8BA59B", "terminal.ansiBrightGreen":"#237e02", "terminal.ansiBrightMagenta":"#8F4673", "terminal.ansiBrightRed":"#FB543F", "terminal.ansiBrightWhite":"#FDF4C1", "terminal.ansiBrightYellow":"#FAC03B", "terminal.ansiBlue":"#00a1f9", "terminal.ansiCyan":"#8BA59B", "terminal.ansiGreen":"#95C085", "terminal.ansiMagenta":"#8F4673", "terminal.ansiRed":"#FB543F", "terminal.ansiWhite":"#A89984", "terminal.ansiYellow":"#FAC03B" }, وذلك سيقوم بتخصيص الألوان في منفذ الأوامر، وأهم خاصيتين هما background للون الخلفية وforeground من أجل لون النص. ولا تنسى حفظ التغييرات بالضغط على CTRL + S
-
لغة جافاسكريبت هي لغة خاصة بالواجهة الأمامية في المقام الأول وليست خاصة بالواجهة الخلفية على وجه الخصوص، لكونها لغة تعمل في المتصفح، لكن من خلال بيئة عمل node.js تستطيع استخدامها في الواجهة الخلفية. وبالطبع ستواجه صعوبة في البداية وخصوصًا أول شهر أو شهرين حسوب مستواك في البرمجة، وعليك بالتركيز على تعلم وإتقان لغة برمجة واحدة في البداية، والتركيز على الأساسيات بشدة ثم التطبيق عليها بأكثر من مشروع وزد مستوى الصعوبة تدريجيًا. وبخصوص المسألة البرمجية فحلها بأبسط شكل هو كالتالي: function getEvenNumbers(numbers) { return numbers.filter(number => number % 2 === 0); } حيث تستقبل الدالة مصفوفة من الأرقام كمدخل وتقوم بإرجاع مصفوفة جديدة تحتوي فقط على الأعداد الزوجية، وتستخدم الدالة filter لتصفية المصفوفة الأصلية بناءًا على شرط التحقق من أن العدد يمكن قسمته على 2 بدون باقي، مما يعني أن العدد زوجي أي كالتالي: function getEvenNumbers(numbers) { return numbers.filter(number => number % 2 === 0); } const numbers = [1, 2, 3, 4, 5, 6]; const evenNumbers = getEvenNumbers(numbers); console.log(evenNumbers); // ستقوم بطباعة [2, 4, 6] في وحدة التحكم مقالات ودروس جافاسكريبت في أكاديمية حسوب
- 3 اجابة
-
- 1
-
-
عليك بالتسجيل في مستقل وخمسات وتقديم إثبات للهوية من أجل تفعيل حسابك، ثم إنشاء معرض أعمال إحترافي ومتخصص، بمعنى أنه يجب وجود تناسق أو ثيم في طريقة العرض لكون مجالك فني بالأساس، وأيضًا متخصص أي لا يحتوي على نماذج لأعمال غير المجال الذي تريد العمل به، فذلك يؤدي إلى نتيجة عكسية ويظهر أنك غير محترف وليس على دراية بما تقوم به. حيث أن العملاء في مجال العمل الحر يبحثون عن الشخص المتمكن والمتميز في مجاله بسبب وجود أزمة ثقة في أن المستقل قادر على تنفيذ العمل أم لا، وأيضًا البعض يبحثون السعر الأقل ومن ينفذ لهم كل شيء تقريبًا وبسعر قليل فعليك بإختيار عملائك لتتجنب المشاكل، وفي البداية قد تقدم تضحيات من أجل الحصول على أول مشروع وتقييم. وعليك بمعرفة طريقة كتابة وتقديم عرض جيد ومناسب للقيمة التي ستوفرها للعميل أي لا تبالغ في السعر ولا في العرض الذي ستقدمه، وأنصحك بقراءة التالي: https://blog.mostaql.com/tag/mostaql-freelancers-guide/
-
عليك بتعلم الأنماط الهامة أولاً، ففي مشاريع PHP ولارافيل (Laravel)، هناك العديد من أنماط التصميم (Design Patterns) وهي بالترتيب: Model-View-Controller (MVC) هو نمط تصميم شائع ومفيد في تطوير تطبيقات الويب، ويهدف إلى فصل الأجزاء المختلفة من التطبيق وتنظيمها بشكل منهجي، ولارافيل إطار عمل يعتمد على نمط MVC، حيث يوفر هيكلًا MVC مسبقًا يمكنك استخدامه لتنظيم تطبيقك. Dependency Injection (DI) يهدف إلى تقليل الاعتمادية الزائدة على الكائنات وتعزيز إعادة استخدامها واختبارها بسهولة، وفي لارافيل، تستطيع استخدام حاويات الحقن (Containers) لتنفيذ Dependency Injection وإدارة تبعيات الكائنات. Repository نمط Repository يوفر واجهة للتعامل مع البيانات، ويتم استخدامه لفصل طبقة البيانات عن طبقة الأعمال (Business Layer)، وبإمكانك استخدام ذلك النمط في لارافيل للتفاعل مع قواعد البيانات وتنفيذ العمليات المتعلقة بالبيانات. Singleton نمط Singleton يهدف إلى ضمان أن يتم إنشاء كائن واحد فقط من فئة معينة وتوفير نقطة وصول عامة إليه، وتستطيع الإعتماد عليه في لارافيل لإنشاء مكونات مشتركة في التطبيق التي تحتاج إلى مشاركة بيانات وحالة بين عدة أجزاء من التطبيق. شرح أنماط التصميم في موسوعة حسوب وإذا أردت قراءة كتابة فأنصحك بقراءة Head First design patterns.
- 3 اجابة
-
- 2
-
-
-
لا داعي للقلق من فك الغطاء الخلفي للاب توب، فهو مخصص لذلك، وفي أجهزة اللاب توب الحديثة الأمر سهل لكن في الموديلات القديمة أصعب قليلاً، وفي بعض الأحيان قد تجد منفذ مخصص للرامات أي عليك فك الجزء الصغير المخصص لها وليس كامل الضهر من أجل إضافة قطعة رامات جديدة. ولمعرفة ذلك أنصحك بالبحث عن Disassembly ثم اكتب بجانبها اسم الموديل الخاص بجهازك وستجد على اليوتيوب فيديو يوضح طريقة فتح الجهاز لصيانته. وبخصوص الشركات التي أنصحك بشراء الرامات منها فهى Crucial ثم Kingston ثم Corsair وأيضًا G.SKILL ولدينا Samsung، والأمر يعتمد على الميزانية الخاص بك قم بتحديد الميزانية ثم ابحث عن المتاح من ضمن السابق ذكرهم.
-
بالطبع لا، لكن عليك بتعلم أساسيات التصميم الجيد لواجهات المستخدم مثل إختيار الألوان والمسافات والخطوط وتحديد التصميم بناءًا على مستخدمي الموقع وهوية الشركة المالكة للموقع والتناسق بين عناصر التصميم visual hierarchy. ثم تعلم أيضًا أداة تصميم مناسبة مثل Figma وهي الأفضل الآن بلا منازع وستسهل عليك الكثير من الأمور لكن في البداية ستحتاج وقت لتعلمها. أما بخصوص التصميم نفسه فتستطيع مشاهدة عدة تصماميم من موقع توفر تصماميم جاهزة للمواقع ثم محاولة التقليد ونسخ ما نال إعاجبك ثم تكوين تصميم مختلف، وقد تم ذكر تلك المواقع هنا: ومع الوقت ستتحسن بلا شك وستصبح قادر على تنفيذ تصاميم جيدة لكونك استوعبت القواعد وما يجب فعله وما لا يجب فعله، وأنصحك بالتعلم في البداية من القنوات التالية على اليوتيوب: Ahmad Sekmani Anas Rafaat | أنس رأفت
-
تستطيع حل المشكلة والسماح بتشغيل السكريبتات في PowerShell عن طريق الأمر التالي: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser ثم قم بإعادة تشغيل طرفية PowerShell وأعد تنفيذ الأوامر التي كنت تقوم بها مرة أخرى. وفي حال أنك تريد التعامل مع منفذ أوامر أسهل من PowerShell وتجنب التعقيدات الخاصة بتلك الطرفيات والأوامر المختلفة بها، فأنصحك باستخدام CMD وهي طرفية Command prompt. وتستطيع تشغيلها عن طريق البحث عن CMD في شريط البحث بالأسفل في الويندوز. وبإمكانك تشغيل الطرفية في مسار المشروع مباشرًة من خلال كتابة cmd في شريط العنوان ثم اضغط على Enter كالتالي:
-
تحتاج إلى تنفيذ طريقة onPostExecute في Compressvedio لتنفيذ الإجراءات المطلوبة بعد الانتهاء من ضغط الفيديوK ,إضافة رمز الإرسال إلى السيرفر في تلك الطريقة. تحتاج أيضًا إلى تمرير المسار الذي تم ضغطه للدالة Compressvedio().execute() في onActivityResult()، وأنت تمرر file.getPath() ولكن ذلك غير صحيح، فيجب عليك تمرير مسار الملف الذي تم ضغطه من خلال vediopath في doInBackground(). أي في onActivityResult(): قم بتعيين vediopath إلى القيمة المسترجعة من Compressvedio().execute() بدلاً من file.getPath(). قبل التعديل: new Compressvedio().execute("false", videoUri.toString(), file.getPath()); بعد التعديل: new Compressvedio().execute("false", videoUri.toString(), vediopath); وفي Compressvedio، قم بتنفيذ الإجراءات اللازمة بعد الانتهاء من ضغط الفيديو داخل onPostExecute(). @Override protected void onPostExecute(String s) { super.onPostExecute(s); dialogo.dismiss(); // Get the compressed video file. File filea = new File(s); // Get the file size in kilobytes. float size2 = filea.length() / 1024f; // Log the file size. Log.d("sizs", String.format("Size : %.2f kB", size2)); // Set the display name of the compressed video file. displayName = String.valueOf(Calendar.getInstance().getTimeInMillis() + ".mp4"); // Perform further actions here, such as uploading the compressed video to the server. } وتأكد من إضافة الكود اللازم لرفع الملف المضغوط إلى السيرفر في المكان المناسب داخل onPostExecute().
-
الدورة الأقرب لمجال الذكاء الاصطناعي في أكاديمية حسوب هي دورة بايثون، حيث أنك ستحتاج إلى تعلم بايثون بلا شك إذا أردت التخصص في مجال الذكاء الاصطناعي وأيضًا يوجد بالدورة مسار خاص بـ أساسيات تعلم الآلة Machine Learning وأيضًا مسار خاص بـ تحليل البيانات. وربما لديك تساؤل حول أهمية تعلم الرياضيات في مجال الذكاء الاصطناعي، ووببساطة ما أنت بحاجة إليه في البداية هو التالي: الرياضيات المهمة لتعلم الآلة هي الجبر الخطي والاحتمالات والتفاضل والتكامل (Calculus). في الجبر الخطي، يجب فهم المفاهيم الأساسية مثل الأشعة والفضاء الشعاعي والاستقلال والارتباط الخطي والأشعة الأساسية والقيم الذاتية. في الاحتمالات، يجب معرفة القوانين الأساسية والتوزيعات الشهيرة. في التفاضل والتكامل، يكفي فهم مفاهيم المشتقات، والتكامل غير مهم في البداية. يجب فهم الأساسيات في هذه المجالات معًا، وعدم التركيز على مجال واحد فقط. الرياضيات مهمة لفهم شبكات العصبونات، حيث يمكن تصور الشبكة كتابع يحول الإدخال في فضاء شعاعي بواسطة العمليات الخطية والغير خطية. تدريب الشبكات يعتمد على خوارزمية gradient descent التي تتطلب فهمًا أساسيًا للتفاضل والتكامل. لا يجب التعمق العميق في الرياضيات قبل بدء تعلم الآلة، ويجب التركيز على الأساسيات فقط. يمكن توسيع فهم الرياضيات عند الحاجة، ولا يجب محاولة تعلم كل شيء في الرياضيات بسبب واسعها. الرياضيات المتقطعة ليست ضرورية في شبكات العصبونات، حيث يجب أن تكون الشبكات تابعة مستمرة وتعامل مع التوابع المستمرة والمشتقات. وبعد ذلك ستحتاج إلى دورة متخصصة في الذكاء الاصطناعي وأغلبها باللغة الإنجليزية، على منصات مثل Udemy وCoursera. وأنصحك بالبحث عن machine learning course على اليوتيوب وستجد بعض الدورات المفيدة ومنها دورة باللغة العربية.
-
أولاً عليك باستيعاب أن الخطاف (Hooks) هي ميزة جديدة في React التي تم إدخالها في إصدار React 16.8، وتسمح الـ Hooks بكتابة وإعادة استخدام الحالة والعمليات الجانبية (side effects) في الـ function components بطريقة أكثر بساطة وسهولة مقارنةً بالـ class components. وفيما يلي بعض الفوائد التي يوفرها الخطاف مقارنةً بالـ class components: يتطلب الخطاف أقل كود وصيانة مقارنةً بالـ class components، وتستطيع الإعتماد على الخطافات مباشرة داخل الـ function components دون الحاجة إلى إنشاء فئة منفصلة. يوفر استخدام الحالة المحلية (local state) بشكل مباشر في الـ function components باستخدام useState، مما يجعل إنشاء وتحديث الحالة أكثر بساطة. بإمكانك استخدام الخطاف useEffect للقيام بالعمليات الجانبية مثل الاشتراك في حدث أو إصدار طلب إلى الخادم أو التعامل مع القائمة أو الوقت. يجعل الخطاف من السهل إضافة وإزالة العمليات الجانبية وتتبعها بشكل أفضل. كتابة الخطافات وإعادة استخدامها في مكوناتك المختلفة، مما يسهل إدارة وصيانة الكود. في بعض الحالات، يوفر الخطاف أداءًا أفضل مقارنةً بالـ class components، حيث يتم تحسين أداء الخطافات بشكل مستمر في تحديثات React. وإليك شرح للخطافات التي ذكرتها: useState يسمح لك خطاف useState بإدارة الحالة في مكون وظيفي. يعيد متغير حالة ودالة تحديث. أي في حال لديك مكون يعرض عددًا، يمكنك استخدام خطاف useState لإنشاء متغير حالة يسمى count، بعد ذلك استخدم الدالة setCount لتحديث قيمة المتغير. const [count, setCount] = useState(0); useEffect يسمح لك خطاف useEffect بتنفيذ تأثيرات جانبية في مكون وظيفي، مثل استدعاءات API، أو الاشتراكات، أو المؤقتات. مثلاً لدينا مكون يعرض قائمة بالعناصر، هنا نعتمد على خطاف useEffect لاستدعاء استدعاء API لتحميل العناصر. useEffect(() => { // Make an API call to load the items }, []); ولاحظ أن المصفوفة تعني أنه لا يوجد إعتماديات، بالتالي يتم تشغيل الخطاف مرة واحدة في بداية الـ Rendering للمكون. useRef يتيح لك خطاف useRef الوصول إلى قيمة قابلة للتغيير من داخل مكون وظيفي، والقيمة قابلة للتغيير هي أي شيء مثل عنصر DOM أو وظيفة. أي في حال لدينا مكون يحتاج إلى الوصول إلى عنصر DOM، نستخدم خطاف useRef لإنشاء إشارة إلى العنصر. const myRef = useRef(); useCallback يسمح لك خطاف useCallback بإنشاء وظيفة مؤقتة، وهي مفيدة لتحسين الأداء عندما يكون لديك دالة تعتمد على المتغيرات التي تتغير كثيرًا. مثال: لدينا مكون يحتوي على دالة تعتمد على متغير count، هنا نستخدم خطاف useCallback لإنشاء وظيفة مؤقتة لن تتغير عندما تتغير قيمة count. const myCallback = useCallback(() => { // This function will not be re-evaluated when `count` changes }, [count]); useMemo خطاف آخر وهو useMemo لإنشاء قيمة مؤقتة، لتحسين الأداء أيضًا عندما يكون لديك قيمة تعتمد على المتغيرات التي تتغير كثيرًا. const myValue = useMemo(() => { // This value will not be re-evaluated when `count` changes }, [count]); وكلا الخطافات، useCallback و useMemo، تستطيع استخدامهما لتحسين الأداء عن طريق تجنب إعادة تقييم الدالة، ولكن هناك بعض الاختلافات الرئيسية بين هاتين الخطافين: useCallback تستخدم لمنع إعادة تقييم الدالة عندما تتغير المدخلات، أي إذا كان لديك دالة تعتمد على متغير، اعتمد على useCallback لإنشاء نسخة من الدالة لن تتغير عندما تتغير قيمة المتغير. أما useMemo تستخدم لمنع إعادة تقييم القيمة عندما تتغير المدخلات، ففي حال كان لديك وظيفة تعتمد على متغير، تستطيع استخدام useMemo لإنشاء نسخة من القيمة لن تتغير عندما تتغير قيمة المتغير. useContext يسمح لك خطاف useContext بالوصول إلى سياق من مكون وظيفي، بمعنى أي شيء مثل سياق البيانات أو سياق الحالة. مثلاً عندما تحتاج إلى الوصول إلى سياق البيانات، استخدم خطاف useContext للوصول إلى السياق. const myData = useContext(MyDataContext); useReducer يسمح لك خطاف useReducer بإدارة حالة معقدة في مكون وظيفي، حيث يستخدم خطاف useReducer دالة مخفضة لتحديث الحالة. أي عندما تحتاج إلى إدارة حالة تحتوي على قائمة من العناصر، اعتمد على خطاف useReducer لإنشاء متغير حالة يحتوي على قائمة من العناصر. const [state, dispatch] = useReducer(reducer, initialState); لمحة خاطفة عن الخطافات في React مرجع إلى الواجهة البرمجية للخطافات في React الأسئلة الشائعة حول الخطافات في React
-
forEach، map، filter، و reduce ببساطة هي وظائف تُستخدم لتكرار عناصر المصفوفة، والفرق الرئيسي بينها هو ما تفعله بالعناصر أثناء التكرار. forEach يتكرر عبر جميع عناصر المصفوفة ويؤدي الوظيفة المحددة إلى كل منها. map يتكرر عبر جميع عناصر المصفوفة ويعيد مصفوفة جديدة تحتوي على ناتج تطبيق الوظيفة المحددة على كل عنصر. filter يتكرر عبر جميع عناصر المصفوفة ويعيد مصفوفة جديدة تحتوي فقط على العناصر التي تفي بشرط معين. reduce يتكرر عبر جميع عناصر المصفوفة ويجمعها معًا لإنشاء قيمة واحدة. وإليك مثال على استخدام كل وظيفة: const numbers = [1, 2, 3, 4, 5]; // forEach numbers.forEach(number => console.log(number)); // map const doubledNumbers = numbers.map(number => number * 2); console.log(doubledNumbers); // [2, 4, 6, 8, 10] // filter const evenNumbers = numbers.filter(number => number % 2 === 0); console.log(evenNumbers); // [2, 4, 6] // reduce const sumOfNumbers = numbers.reduce((a, b) => a + b, 0); console.log(sumOfNumbers); // 15 for loop و while loop هي أيضًا وظائف تُستخدم لتكرار العناصر، ولكن الفرق الرئيسي بينها هو أن for loop يحدد عدد المرات التي يجب تكرار فيها الـ loop، بينما while loop يستمر في التكرار حتى يتم استيفاء شرط معين. // for loop for (let i = 0; i < 5; i++) { console.log(i); } // while loop let i = 0; while (i < 5) { console.log(i); i++; } لاحظ أن في for نقوم بالتكرار حتى وصول قيمة i رقم أقل من 5 ونستطيع تعديل تلك القيمة، بمعنى أن عدد مرات التكرار معروفة لدينا. بينما في while لاحظ أن الحلقة تستمر في التكرار في حال الشرط ما زال صحيحًا أي تُستخدم حلقة while عندما لا تعرف عدد المرات التي يجب تكرار فيها التعليمات. أي أن forEach، map، filter، و reduce هي وظائف أكثر تعقيدًا من for loop و while loop، ونستخدمها لكتابة كود أكثر كفاءة وقابلية للقراءة.
-
بالطبع، فإذا أردت أن تصبح مطور واجهة خلفية Back-End فسيتعين عليك إنشاء الواجهات البرمجية API، وإعداد الخادم لاستقبال طلبات CRUD. ولا مشكلة إذا واجهت صعوبة في البداية، فتلك هي طبيعة مجال البرمجة وسيسهل عليك الأمر لاحقًا مع التكرار وإعادة كتابة الكود، وتستطيع البحث ثم السؤال عن أي شيء تريد فهمه أو توضيح له. أما إذا كنت تريد التخصص بالواجهة الأمامية، فتستطيع الإكتفاء بالمفهوم العام والتعرف على طبيعة عمل الخادم والـ API من أجل يكون لديك دراية على ما يجري بالخلفية، حيث أنك ترسل وتستقبل بيانات من الـ API في الواجهة الأمامية. وأنصحك بالإطلاع على التالي:
-
الموقع سرعته جيدة ولا مشكلة في تصفحه، وأرى أنك تستخدم Blogger وهنا لا تتوفر الإضافات المخصصة لتهيئة الموقع مثل ووردبريس، ولكن هناك بعض الأمور التي يمكنك القيام بها وهي: استخدم قالبًا سريعً فبعض القوالب أسرع من غيرها، لذا من المهم اختيار قالب سريع إذا كنت تريد تحسين سرعة موقعك. قم بضغط الصور حيث الصور هي أحد أكبر العوامل التي تؤثر على سرعة موقعك، ويمكنك ضغط الصور لتقليل حجمها دون التأثير على جودتها من خلال صيغة webP. تجنب استخدام الكثير من JavaScript وCSS. JavaScript وCSS فقد تبطئ موقعك إذا تم استخدامها بكثرة، حاول تقليل استخدامهما قدر الإمكان. تخزين الصور في ذاكرة التخزين المؤقت (الكاش) فتخزين الصور في ذاكرة التخزين المؤقت يساعد في تحسين سرعة موقعك عن طريق تقليل عدد المرات التي يحتاج فيها المتصفح إلى تحميل الصور, كالتالي: اختر القالب لديك ثم اضغط على Edit HTML، ثم ابحث عن عنصر <head> وبداخله أضف الكود التالي: <include expiration='7d' path='/assets/**.css'/> <include expiration='7d' path='/assets/**.js'/> <include expiration='3d' path='/assets/**.gif'/> <include expiration='3d' path='/assets/**.jpeg'/> <include expiration='3d' path='/assets/**.jpg'/> <include expiration='3d' path='/assets/**.png'/> استخدم شبكة توصيل المحتوى (CDN). مثل كلاود فلير وهي مجموعة من الخوادم موزعة في جميع أنحاء العالم، ويساعد ذلك في تحسين سرعة موقعك عن طريق تحميل الصور من الخادم الأقرب إلى الزائر.
- 3 اجابة
-
- 1
-