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

Mustafa Suleiman

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

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

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

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

    300

كل منشورات العضو Mustafa Suleiman

  1. تستطيع استخدام الأسلوب configure للقائمة المنسدلة (Combobox) وتحديث قائمة القيم. import tkinter as tk from tkinter import ttk def update_dropdown_values(): new_values = ["New Option 1", "New Option 2", "New Option 3"] dropdown['values'] = new_values root = tk.Tk() dropdown = ttk.Combobox(root, values=["Option 1", "Option 2", "Option 3"]) dropdown.pack() update_button = tk.Button(root, text="تحديث القائمة", command=update_dropdown_values) update_button.pack() root.mainloop() وفي الكود تم إنشاء قائمة منسدلة (Combobox) وتعيين القيم الافتراضية لها باستخدام values الموجودة في البداية، ثم بإضافة زر يقوم بتحديث قيم القائمة المنسدلة عند النقر عليه. وعند النقر على الزر، تستدعى الدالة update_dropdown_values التي تقوم بتعديل values للقائمة المنسدلة وتعيين القيم الجديدة.
  2. اعذرني على التحدث معك بصراحة، لكن بتلك الطريقة لن تصل إلى شيء في البرمجة، فهى مملة بطبيعتها وعملية التعلم مملة أيضًا فقد تواجه مشكلة تقتضي منك يوم كامل لحلها فهل ستترك مجال البرمجة؟ دائمًا ما أنصح أن تجعل الملل صديقًا لك، فللأسف برمجت عقولنا على المكافآت السريعة، تخيل معي أنه قبل أن تتعلم البرمجة تقضي وقتك في مشاهدة التيك توك وفيديوهات يوتيوب السريعة وألعاب الكمبيوتر والسوشيال ميديا وخلافه. وبدأت تعلم البرمجة لتجد أنه لا يوجد مكافآت سريعة، بل جد واجتهاد وساعات مذاكرة طويلة، والمكافأة تأتي بعد فترة من المذاكرة حيث ستجد نفسك تتحسن بعد فترة وتصبح قادر على تنفيذ مشروع بسيط مثلاً وستفرح بذلك. وفي البرمجة لا يوجد طريق مختصر، أو يوجد لكنه نهايته مسدودة، حيث ستصبح قداراتك البرمجية ضعيفة، ولن تتمكن من تعلم تقنيات أو لغات جديدة، فعند التأني في تعلم الأساسيات وبذل الوقت والجهد، فستجد نفسك تتعلم بشكل أسرع فيما بعد وقادر على تجربة أشياء جديدة ومستوعب للمصطلحات البرمجية وتعقيداتها دون مشكلة، ولن تخاف إذا رأيت كود لم تراه من قبل. الأمر أشبه بتخطي فترة التدريب في ألعاب الكمبيوتر، للعب مباشرًة، لتجد نفسك أنك مشتت وتتخبط وتعود إلى التدريب مرة أخرى أو تقوم بالبحث عن كيفية اللعب أو تجاوز عقبة ما؟ وأنصحك بقراءة النقاشات التالية، فستجد بها إجابة على الكثير من الأسئلة لديك:
  3. الأسئلة الإختبارية لا يتم الإجابة عليها بشكل مباشر، ولكن يمكن مساعدتك بإرشادك للخطوات، أو حل مشكلة بالكود لو قمت بتوفيره. وإليك الخطوات البرمجية لرسم الشكل المطلوب باستخدام Java Applet: 1- إنشاء مشروع جديد في بيئة تطوير Java لديك. 2- إنشاء فئة جديدة واعتبرها فئة الرسم (مثلاً DrawingApplet) واجعلها تمتد من java.applet.Applet. 3- ضمن فئة الرسم، قم بتجاوز الطريقة paint() لرسم الشكل المطلوب، وسأوفر لك جزء من الكود للتوضيح فقط: import java.applet.Applet; import java.awt.*; public class DrawingApplet extends Applet { public void paint(Graphics g) { // رسم الشكل البيضاوي الخارجي // رسم الشكل البيضاوي الداخلي // رسم النص } } 4- قم بتصدير وتشغيل البرنامج لرؤية الشكل المطلوب. وتأكد من أنك قد قمت بتثبيت Java Development Kit (JDK) على جهاز الكمبيوتر لديك، وأن بيئة تطوير Java الخاصة بك مُكوّنة بشكل صحيح لكي تتمكن من تشغيل البرنامج. وكمعلومة فقط انتبه إلى أن استخدام Java Applet قد أصبح قديمًا وغير مدعومٍ بشكل جيد في المستعرضات الحديثة، ويُفضل استخدام تقنيات الويب الأحدث مثل HTML5 وCSS3 وJavaScript لتحقيق نفس الغرض. قسم دروس ومقالات لغة جافا في أكاديمية حسوب
  4. لربط أداة Combobox في Tkinter بملف Excel باستخدام مكتبة Openpyxl، عليك بالتالي: 1- استيراد المكتبات المطلوبة: from tkinter import * from tkinter.ttk import Combobox from openpyxl import load_workbook 2- تحميل ملف Excel باستخدام load_workbook: workbook = load_workbook('اسم_الملف.xlsx') sheet = workbook.active # تحديد ورقة العمل النشطة 3- استخراج قيم العمود الأول من ورقة العمل وتخزينها في قائمة: column_values = [cell.value for cell in sheet['A']] # افتراضًا أن القيم في العمود الأول (A) 4- إنشاء نافذة Tkinter وإضافة أداة Combobox: window = Tk() combo = Combobox(window, values=column_values) # تعيين قيم القائمة المنسدلة combo.pack() 5- إضافة دالة تعمل عند اختيار قيمة من Combobox: def on_combobox_selected(event): selected_value = combo.get() # القيمة المحددة من القائمة المنسدلة row_index = column_values.index(selected_value) + 1 # +1 لأن الصفوف تبدأ من 1 وليس 0 corresponding_value = sheet['B' + str(row_index)].value # افتراضًا العمود الثاني (B) # قم بعرض القيمة المقابلة في أداة النص أو قم بطباعتها print(corresponding_value) # يمكنك استخدام أي طريقة تعرض القيمة combo.bind("<<ComboboxSelected>>", on_combobox_selected) # ربط الدالة بحدث اختيار القيمة من Combobox window.mainloop() وبذلك عند اختيار قيمة من Combobox، ستستدعى الدالة on_combobox_selected وسيتم استخراج القيمة المقابلة لها من العمود الثاني (افترضت العمود B) ومن ثم يمكنك طباعتها أو عرضها في أداة النص أو التلاعب بها على النحو الذي ترغب به.
  5. هناك متغيرات في Tkinter مثل StringVar لتحديث قيم القوائم المنسدلة في تطبيقك، وفيما يلي مثال يوضح الأمر لك: import tkinter as tk from tkinter import ttk def update_dropdown(): selected_value.set("New Value") # تحديث قيمة المتغير root = tk.Tk() selected_value = tk.StringVar(root) selected_value.set("Default Value") # القيمة الافتراضية للمتغير dropdown = ttk.Combobox(root, textvariable=selected_value, values=["Option 1", "Option 2", "Option 3"]) dropdown.pack() update_button = tk.Button(root, text="تحديث القائمة", command=update_dropdown) update_button.pack() root.mainloop() قمت بإنشاء متغير selected_value باستخدام StringVar وتعيين القيمة الافتراضية له، ثم إنشاء قائمة منسدلة باستخدام ttk.Combobox وربطها بالمتغير selected_value باستخدام الخاصية textvariable. وعند تحديث قيمة المتغير باستخدام الدالة set()، سيتم تحديث قيمة القائمة المنسدلة تلقائيًا. أيضًا قمت بإضافة زر يقوم بتحديث قيمة المتغير عند النقر عليه، وبإمكانك تغيير القيم المتاحة في القائمة المنسدلة بتعديل قائمة values الموجودة في ttk.Combobox.
  6. لن تستطيع الحصول على عنوان MAC للزائر باستخدام لغة PHP، فعناوين MAC تكون مرتبطة بالأجهزة المادية مثل بطاقات الشبكة والراوترات، ولا يتم إرسالها عبر الإنترنت في طبقة التطبيق، وتُستخدم عناوين MAC في الشبكات المحلية فقط لتوجيه حركة البيانات بين الأجهزة المتصلة في الشبكة المحلية. وستجد على الإنترنت كود مثل التالي: <?php // PHP code to get the MAC address of Server $MAC = exec('getmac'); // Storing 'getmac' value in $MAC $MAC = strtok($MAC, ' '); // Updating $MAC value using strtok function, // strtok is used to split the string into tokens // split character of strtok is defined as a space // because getmac returns transport name after // MAC address echo "MAC address of Server is: $MAC"; ?> لكنه يستخدم للحصول على عنوان MAC للسيرفر الذي يقوم بتشغيل كود PHP، وليس للزائر، أو المستخدمين على نفس الشبكة المحلية لديك. وبإمكانك فقط الحصول على عنوان IP للزائر باستخدام PHP من خلال استخدام المتغير المدمج: $_SERVER['REMOTE_ADDR'] ويعيد هذا المتغير عنوان IP للزائر الحالي الذي يقوم بالوصول إلى صفحة الويب، ويجب أن تكون مدركًا أن عناوين IP متغيرة وغير دائمة بطبيعتها، ويمكن تغييرها أو تخطيها باستخدام بروكسي أو شبكات VPN، وبالتالي قد لا تكون دقيقة بنسبة 100% لتحديد هوية الزائر.
  7. هناك طريقتين لتحميل مستودع على جهازك، والأولى بشكل مباشر عن طريق تحميل المستودع في مشكل ملف مضغوط بصيغة ZIP عن طريق الضغط على زر code باللون الأخضر الموجود في المستودع ثم إختيار Download ZIP كما بالصورة وسيتم التحميل: الطريقة الثانية هي عن طريق نسخ الرابط الموجود أسفل تبويب HTTPS الذي سيظهر لك عن الضغط على زر Code باللون الأخضر في المستودع، وستجد بجانب الرابط زر عند الضغط عليه سيتم نسخ الرابط كما بالصورة السابقة. والآن افتح واجهة سطر الأوامر (Command Line Interface) على جهازك، مثل Git Bash أو Terminal. انتقل إلى المسار الذي ترغب في تحميل المستودع فيه، باستخدام أمر cd للتنقل بين المجلدات، مثلاً: cd اسم المجلد أو المسار أي يجب أن تنتقل إلى المسار الذي تريد عمل نسخ للمستودع به وإليك شرح لكيفية التنقل عن طريق أمر cd، ويجب أن يكون المسار هو مجلد أو تستطيع إنشاء مجلد من خلال سطر الأومر بواسطة الأمر: mkdir اسم المجلد وأسهل طريقة لفتح منفذ الأوامر في مسار سطح المكتب هو الضغط على shift ثم الضغط على زر الفأرة الأيمن وسيظهر لك في القائمة إختيار terminal. بعد ذلك استخدم الأمر git clone مع رابط المستودع الذي قمنا بنسخه، كالتالي: git clone رابط المستودع وبالطبع الأمر يتم تنفيذه في منفذ الأوامر، وإليك مثال: git clone https://github.com/username/repository.git وسيقوم Git بتنزيل المستودع بأكمله إلى المجلد الحالي الذي كنت فيه، وستظهر رسائل توضح تقدم التحميل.
  8. إذا كان السؤال متعلق بأحد الدورات أرجو التعليق أسفل فيديو الدورة وطرح الأسئلة العامة الغير متعلقة بالدورة هنا في قسم أسئلة البرمجة. وبخصوص سؤالك، لديك مشكلة في طريقة استخدام واجهة console حيث أنك استدعيت ميثود log منها بطريقة غير صحيحة كالتالي: console,log() والصحيح هو استخدام نقطة (.) للفصل بين اسم الكائن (console) والدالة (log) التي يتم استدعاؤها على هذا الكائن، حيث يُستخدم هذا النمط في جافاسكريبت للوصول إلى الأعضاء أو الخصائص أو الدوال المتوفرة على الكائنات أو الواجهة. وكما تعلم كل شيء في جافاسكريبت هو عبارة عن كائن، كل شيء. والكائن أو الواجهة (console) هو كائن مدمج في جافاسكريبت يتيح واجهة لإجراءات المستخدم على وحدة التحكم في المستعرض، والدالة (log) تُستخدم لطباعة رسالة في وحدة التحكم أو الـ console في المتصفح. فإذا استخدمت فاصلة (,) بدلاً من النقطة (.)، مثل console,log()، فسيعتبر جافاسكريبت أنها تعبير يحتوي على اسم كائن (console) ودالة آخرى تحمل اسم (log)، وهذا ليس المطلوب، أي تم الفصل بينهم. وما أقصد بواجهة هو أنه في جافاسكريبت، console هي واجهة (Interface) مدمجة تقدم وظائف للتواصل مع وحدة التحكم في المتصفح أو البيئة التي يعمل فيها الكود. وواجهة console تحتوي على عدة دوال مفيدة للإخراج (output) والتحكم في سير التنفيذ. بعض الدوال الشائعة المتوفرة في واجهة console هي: log(): تُستخدم لطباعة رسائل تنبيه أو معلومات في وحدة التحكم. error(): تُستخدم لطباعة رسائل خطأ في وحدة التحكم. warn(): تُستخدم لطباعة رسائل تحذير في وحدة التحكم. info(): تُستخدم لطباعة رسائل معلومات في وحدة التحكم. clear(): تُستخدم لمسح وحدة التحكم من الرسائل السابقة. وغيرها من الدوال المفيدة. وتستطيع استخدام واجهة console للتحقق من قيم المتغيرات أثناء تطوير التطبيقات، وتصحيح الأخطاء، وتقييم أداء الكود.
  9. عند العمل على مشاريع فلاتر (Flutter)، باستطاعتك استخدام أنماط مختلفة لتنظيم وإدارة الكود، وهناك نمطين شائعين في عالم فلاتر هما MVVM و Repository. سأوضح لك الفارق بينهما وسأشرح كل نمط على حدة 1- MVVM (Model-View-ViewModel) يعتبر MVVM من أنماط التصميم الأكثر شيوعًا في تطوير تطبيقات الهواتف المحمولة بما في ذلك فلاتر، وينقسم هذا النمط إلى ثلاثة أجزاء رئيسية: Model: يمثل البيانات والمنطق الخاصة بالتطبيق، ويمكن أن يكون لديك مثيلات للنماذج التي تحتوي على بيانات يستخدمها التطبيق. View: تمثل واجهة المستخدم، وتعرض البيانات المنتجة من ViewModel وتتفاعل مع المستخدم. ViewModel: يعمل كوسيط بين Model و View، ويتولى استرجاع البيانات من Model وتحويلها إلى شكل مناسب للعرض على الـ View، أيضًا يحتوي على المنطق اللازم للتعامل مع استجابة المستخدم. الفكرة الرئيسية وراء MVVM هي فصل الواجهة البصرية عن البيانات والمنطق الخاصة بها، مما يتيح تبسيط عملية اختبار وصيانة التطبيق وسهولة إضافة ميزات جديدة. 2- Repository Pattern يستخدم نمط Repository لإدارة استرجاع البيانات وحفظها في التطبيق، ويقدم هذا النمط واجهة وسيطة (Interface) تحدد العمليات الممكنة مع البيانات مثل الاسترجاع والحفظ والتحديث والحذف، ويقوم المستودع (Repository) الفعلي بتنفيذ هذه العمليات باستخدام مصادر البيانات المناسبة مثل قواعد البيانات أو خدمات الويب. وفي سياق فلاتر، يمكن أن يكون المستودع هو الجزء الذي يسترجع البيانات من قواعد البيانات أو يتصل بخدمات الويب لجلب البيانات، وبإمكانك استخدام Repository Pattern بشكل مستقل أو مع نمط آخر مثل MVVM لتوفير واجهة بين النمطين. أي الفكرة الأساسية وراء Repository Pattern هي تجنب تكرار كود الوصول للبيانات في مختلف أجزاء التطبيق، وتوفير واجهة واحدة للتعامل معها، بدلاً من أن يتم استدعاء وكتابة الاستعلامات المباشرة في أجزاء مختلفة من التطبيق، ويستخدم المستودع كوسيط للتفاعل مع البيانات. الأسلوب الأكثر احترافية الأمر يعتمد على نوع المشروع وحجمه وتعقيده، فعادةً ما ينصح باستخدام نمط MVVM لأنه يفصل واجهة المستخدم عن البيانات ويسهل اختبار وصيانة التطبيق. أما إذا كنت تعمل على مشروع بسيط وغير معقد، فتستطيع استخدام نمط Repository بشكل مستقل، وإذا اقتضى الأمر تستطيع أيضًا استخدام كلا النمطين معًا.
  10. إذا كان سؤالك يتعلق بأحد الدورات فأرجو التعليق أسفل فيديو الدورة المتعلق بالسؤال وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة. وبخصوص سؤالك، فتستطيع تحديد العناصر <input> في CSS باستخدام العديد من الخصائص المختلفة بالإضافة إلى type. فالتحديد بواسطة type="password" يعني أنك تستهدف الحقول ذات النوع "password" فقط، وأيضًا بإمكانك استهداف العناصر <input> باستخدام أي صفة أخرى متوفرة في HTML. مثال على ذلك، استهداف الحقول التي تحتوي على صفة required بالشكل التالي: input[required] { border-color: red; } وهناك العديد من الصفات المختلفة التي يمكن استخدامها لتحديد العناصر <input>، مثل id و class و name وغيرها، وباستطاعتك استخدام هذه الصفات بدلاً من type لتحديد العناصر بطرق مختلفة. مثلاً، استهداف الحقول ذات الـ id المحدد بالشكل التالي: input#myInput { background-color: yellow; } أو يمكنك استهداف الحقول ذات الـ class المحددة بالشكل التالي: input.myClass { font-weight: bold; } أي تستطيع تحديد العناصر <input> بواسطة العديد من الصفات المختلفة وليس فقط type. وأنصحك بقراءة التالي: صفحات تصنيف «CSS Selectors» من موسوعة حسوب
  11. فائدة "document" في الكود الذي في الصورة هي الوصول إلى عنصر في صفحة HTML باستخدام جافا سكريبت، وتستخدم للوصول إلى عناصر HTML الموجودة في صفحة الويب والتعامل معها بشكل ديناميكي. حيث تستخدم الدالة getElementById للوصول إلى عنصر HTML الذي يحمل الهوية "username". وتقوم بحفظ قيمة المدخل الموجود في هذا العنصر في متغير تسميه "username". وتتمثل أهمية "document" في السماح لك بالتفاعل مع صفحة الويب وتعديلها ديناميكياً باستخدام جافا سكريبت، ومن أجل الوصول إلى العناصر المحددة في صفحة الويب مثل النماذج أو العناصر المعرّفة بواسطة الهوية، يجب استخدام "document". وبدون استخدام "document"، لن يكون بإمكانك الوصول إلى عنصر النموذج الذي يحمل الهوية "username"، وبالتالي لن تتمكن من الحصول على قيمة المدخل في هذا العنصر واستخدامها في الجملة التي تعرضها في نافذة التنبيه (alert). أي أن "document" هو كائن يمثل مستند HTML الحالي، ويوفر العديد من الطرق والخصائص للتفاعل مع العناصر في الصفحة وتعديلها والوصول إليها. وللمزيد من الشرح والتفصيل أنصحك بقراءة التالي:
  12. أرجو توضيح السؤال، وما فهمته أنك تحاول حفظ الصورة وكتابة اسم لها في الفوتوشوب صحيح؟ إليك الخطوات: قم بفتح الصورة في برنامج Adobe Photoshop. اختر "File" (ملف) في الشريط العلوي للبرنامج، ثم اختر "Save As" (حفظ ك). ستظهر لك نافذة حفظ الملف، قم بتحديد مسار الحفظ والمجلد الذي ترغب في حفظ الصورة فيه. في الجزء السفلي من نافذة حفظ الملف، ستجد خيار "Format" (تنسيق)، فحدد الصيغة التي ترغب في حفظ الصورة بها، مثل JPEG أو PNG. وفي خانة اسم الملف "File name" تستطيع كتابة الوصف الذي تريده . بمجرد الانتهاء من إضافة الوصف وتحديد اسم الملف ومكان الحفظ، انقر على زر "Save" (حفظ) لحفظ الصورة مع الوصف.
  13. هناك تعارض في أسماء الملفات بسبب الحالة الكبيرة والصغيرة للحروف، وفي ويندوز يتم التفريق بين الحروف الكبيرة والصغيرة في أسماء الملفات. لذلك، يعتبر الملف 'c:/Users/saadaoui/Desktop/Backend/models/product.js' مختلفًا عن الملف 'c:/Users/saadaoui/Desktop/Backend/models/Product.js' بسبب اختلاف الحالة في الحرف الأول من اسم الملف (product.js مقابل Product.js). عندما تستدعي الملف './models/product' في الملف 'c:/Users/saadaoui/Desktop/Backend/index.js'، يحاول النظام إدراج الملف 'product.js' ولكنه يجد تعارضًا بسبب الاختلاف في حالة الحروف. يجب الاستدعاء الصحيح للملف هو الذي يتطابق مع الاسم الفعلي للملف بالضبط من حيث الحالة الكبيرة والصغيرة للحروف، أي الاستدعاء كالتالي: './models/Product' بدلاً من './models/product'. تأكد أيضًا من أنك تستخدم نفس الحالة الكبيرة والصغيرة لاسم الملف عند الاشارة إليه في الملف 'c:/Users/saadaoui/Desktop/Backend/index.js'.
  14. أرجو منك طرح الأسئلة المتعلقة بالدورة أسفل الفيديو في التعليقات وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة.
  15. أرجو منك طرح الأسئلة المتعلقة بالدورة أسفل الفيديو في التعليقات وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة.
  16. في مجال الويب ليس مطلوبة بكثرة، لكن فيما يتعلق بالواجهة الخلفية وتحليل البيانات والذكاء الإصطناعي فهى مطلوبة بكثرة. ولكن كما ذكرت من قبل ودائمًا أكرر أنت من تحدد ذلك، من خلال تفقد المطلوب في سوق العمل لديك وقد أوضحت ذلك بالتفصيل في النقاش التالي: وأيضًا إليك نقاشات متعلقة بنفس الأمر: وبخصوص تعلم Django أم Flask فعليك بتعلم كلاهما، ولكن Django هو المطلوب في سوق العمل وإليك نقاش حول ذلك:
  17. المشكلة تحدث عند تشغيل أمر بناء (build) في مشروع Flutter على Android، والسبب الرئيسي هو عدم وجود توقيع صحيح لأحد المكونات أو الوظائف المستخدمة في المشروع، وعليك بالتالي: 1- تحديث Flutter وأدوات التطوير المرتبطة بها إلى أحدث إصدار، باستخدام الأمر التالي في منفذ الأوامر: flutter upgrade ففي بعض الأحيان تحدث المشكلة بسبب أن إصدار Flutter غير متوافق مع إصدار gradle لديك، فمثلاً لو كان لديك إصدار 3.7 من Flutter فلن يعمل مع إصدار 8 من gradle وبالتالي ستحتاجين إلى استخدام الإصدار 7.4.2 من gradle أو تحديث Flutter. 2- حذف مجلد build في مشروع Flutter وأعيدي تشغيل عملية البناء، بالأوامر التالية: cd <مسار المشروع> flutter clean flutter build apk و cd أقصد بها التوجه إلى المجلد الخاص بالمشروع ثم تنفيذ الأوامر الأخرى بالترتيب. 3- تأكدي من أنك تستخدمي نسخة من Java Development Kit (JDK) متوافقة مع Flutter، وحاليًا يوصى باستخدام JDK بإصدار 8 أو أحدث. وقومي بالتحقق من إعدادات المتغيرات البيئية (Environment Variables) على جهاز الكمبيوتر الخاص بك للتأكد من تعيين المسار الصحيح لـ JDK. 4- تحققي من ملف build.gradle في مشروع Flutter، وتأكدي من أنه لا يوجد أي أخطاء في الإعدادات الخاصة بالتبعيات (dependencies) أو الوظائف المستخدمة. وإذا استمرت المشكلة، فقد تحتاجي إلى مراجعة سجلات الأخطاء (log) المفصلة التي تظهر عند تشغيل الأمر مع خيار --debug للحصول على مزيد من المعلومات حول الخطأ الذي يحدث. وأيضًا حاولي استخدام الأمر التالي: flutter doctor -v لفحص وعرض معلومات مفصلة حول بيئة تطوير Flutter المحلية على جهاز الكمبيوتر لديك، وعند تنفيذ هذا الأمر، ستحصلي على تقرير شامل يوضح حالة تثبيت Flutter والأدوات المرتبطة بها، بما في ذلك الأدوات اللازمة لتطوير تطبيقات Flutter على منصات مختلفة مثل Android وiOS.
  18. في الآونة الأخيرة هناك نقاش دائر حول ما الفرق بين software Developer والـ Software Engineer وإذا بحثت على الإنترنت ستجد أن الـ Software Engineer هو مسؤول عن عملية تصميم السوفت وير أو البرنامج من البداية حتى النهاية من حيث التصميم والتحليل وهيكلة المشروع وخلافه. أما الـ Developer فهو مسؤول عن كتابة الكود فقط، أو تنفيذ المهام المطلوبة منها والتي وضعها الـ Software Engineer، وذلك التعريف على الإنترنت فقط. أما على أرض الوقع فكلاهما سواء وهما شخص واحد، ويجب على الـ Developer الجيد أن يطمح إلى أن يكون Software Engineer ويتعلم أساسيات البرمجة وعلوم الحاسوب ودورة الحياة لتطوير الأنظمة البرمجية SDLC وهي إختصار لـ Software Development Life Cycle، وقد تم توضيحها في النقاش التالي: بالإضافة إلى دراسة الخوارزميات وهياكل البيانات وتعلم مهارة Problem solving، وأنماط التصميم Design Patterns. أيضًا يجب الإلمام بالـ hardware architecture لمعرفة كيف يتم معالجة الكود الخاص بك عن طريق المعالج والنظام والذاكرة العشوائية. وفي بداية تعلمك قد تبدوا الأمور السابقة صعبة الفهم أو لا تجد فائدة لها، وذلك صحيح، ونصيحتي إليك هي بمحاولة فهمها بقدر استطاعتك، ثم تعلم لغة البرمجة الأولى لك والعودة إلى مذاكرة ما سبق مرة أخرى وستجد فائدة كبيرة جدًا وستفهم ما كان مبهم وأشبه بعلوم الفضاء بالنسبة لك في البداية.
  19. ما يؤهلك للعمل في تلك الشركات هو تعلم مجالك بإحترافية وسنوات الخبرة المطلوبة في وصف الوظيفة والأمر مختلف من وظيفة لأخرى، لكن ما يهم حقًا هو تعلم Data Structure وAlgorithms وSystem Design والـ Problem Solving. حيث أنه يتم إختبارك في تلك المهارات بشكل قوي، وستجد العديد من الكورسات التي تؤهلك لإجتياز تلك الإختبارات من خلال تعلم تلك المهارات بشكل قوي وعلى أسس صحيحة، لا أن تحقظ حل بعض الأسئلة الشهيرة فقط فبذلك أنت تخدع نفسك. وأيضًا مهارات الـ Soft skills وتستطيع البحث عنها على اليوتيوب وهي هامة جدًا في مقابلات العمل، بالإضافة إلى تعلم مهارة إنشاء CV قوي أي مهارة كيف تعرض وتسوق لنفسك بشكل مختصر وتلك مهارة هامة سواء في الـ CV أو مقابلة العمل. والأمر سيسير كالتالي: أولاً عليك الحصول على مقابلة عمل، وإليك بعض النقاط حول ذلك: يحتاج المرشح للحصول على مقابلة عمل في إحدى شركات FAANG. تكون هناك الكثير من السير الذاتية التي ترسل لشركات تكنولوجيا المعلومات، ومعظمها سيئة التنسيق ولا تشتمل على تعليم في علوم الحاسوب أو خبرة. هناك بعض الطرق الفعالة لتميز سيرتك الذاتية هنا، مثل: 1. الحصول على توصية من موظف داخل الشركة، 2. وجود خبرة عمل كمبرمج، 3. حصولك على شهادة في علوم الحاسوب، و 4. تقديم سيرة ذاتية تبدو جميلة (قليل من الأخطاء الإملائية، تنسيق جيد، وربما تحتوي على عدة لغات برمجة أو شيء مشابه). والتركيز يجب أن يكون على أسهل طريقة وهي الحصول على توصية، قم ببناء شبكتك الاجتماعية وابحث عن أشخاص يعملون في تلك الشركات الكبرى الذين يمكنهم تقديم سيرتك الذاتية، وهذه خطوة جيدة لك ولهم أيضًا لأن تلك الشركات تدفع مكافآت مالية للمهندسين الذين يوصون بمزيد من المهندسين البرمجيين. بعد ذلك، قم بالتركيز على النقطة الثانية. النقطة الثانية: أداء جيد في المقابلة. بعد تحقيق النقطة الأولى، ستحصل على مقابلات في الشركات الخمس. لاحظ أن معدل نجاح هذه المقابلات منخفض، فعادةً ما تبدأ بامتحان تلقائي أو مكالمة هاتفية لمدة ساعة مع مهندس برمجي أو اثنين، وسيطرحون عليك سؤالًا مأخوذًا مباشرة من "Cracking the Coding Interview"، وستكتب إجابة وتقول "هذا O(N log N)" وسيشيدون بك لأنك واحد من بين خمسة أشخاص تقريبًا تجتازوا تلك الاختبارات الهاتفية وتستمرون في المراحل التالية. وللنجاح في تلك المرحلة، يجب دراسة الخوارزميات وهياكل البيانات، وحل مشاكل مماثلة لـ LeetCode، ونأمل أن يقوم أحد أصدقائك الذين قدمت لهم توصية بإجراء بعض المكالمات التجريبية للممارسة. وهذا النوع من الممارسة سيكون جزءًا كبيرًا من تركيزك خلال فترة العمل لمدة عامين، وهذا هو المعيار الرئيسي الذي ستقيم عليه، إلى احترافيتك أثناء المقابلة والتجهيز الجيد لها. بعد ذلك، ستأتي مرحلة المقابلة في المكان الفعلي (on-site interview) وستكون مشابهة للمقابلة الهاتفية باستثناء أنك ستجري خمسة مقابلات متتالية. وقد يكون لديك فرصة 1 من بين 6 لاجتياز هذه المرحلة، في المتوسط. وستساعدك الممارسة بشكل كبير. الأخبار الجيدة هي أن العملية تعتمد إلى حد كبير على الصدفة، بفرض أنك جيد جدًا في الإجابة على هذا النوع من المشكلات، فإذا ما قمت بالمقابلة في الشركات الخمس، فإن الفرص جيدة جدًا أن يتم اجتيازك في إحداها، وسوف تتحسن قدرتك على المقابلة مع الوقت. بالإضافة إلى ذلك، تتوفر لدى بعض هذه الشركات فرصة لإعادة المقابلة بعد ستة أشهر إلى سنة. لذا، فإن الفرصة لاجتياز المقابلة الأولى ضئيلة، ولكن الفرصة جيدة في الواقع لاجتياز إحدى المقابلات في النهاية، وتحتاج فقط إلى اجتياز المقابلة مرة واحدة. وهل أنت مرتاح في التحدث أمام عدة أشخاص؟ عليك بأن تصبح مرتاحًا من خلال إجراء مقابلات عمل والتعود عليها، وانتبه إلى أن حل مشكلة خوارزمية في المنزل شيء، وحل مشكلة خوارزمية على لوح أبيض أمام عدة أشخاص ومهنة تحقق من ستة أرقام مالية هي شيء آخر تمامًا. وبالطبع عليك العمل على اللغة الإنجليزية الخاصة بك، وأنصحك بمشاهدة الفيديو التالي على اليوتيوب: كيف تصل للشركات العالمية؟ || بودكاست مع المهندس أحمد علي - مهندس برمجيات في شركة فيسبوك. وستتعلم الكثير خلال مقابلة مدتها ساعة ونص من المعلومات المفيدة حقًا.
  20. ذلك الموجه موجود فقط في إطار لارافيل وليس PHP كما تم التوضيح في التعليقات السابقة.
  21. الطريقة الأولى هي عن طريق الدخول على جهازك عن طريق برامج مثل Anydesk أو TeamViewer وتجربة الموقع على جهازك. والطريقة الثانية هي بإرسالة فيديو تعرض من خلال الموقع ومميزاته للعميل. والطريقة الثالثة هي برفع الموقع على استضافة لكن قم بعمل build للمشروع ورفعه، أي أنك لن تقوم برفع الكود المصدري. والطريقة الرابعة هي بإنشاء استضافة محلية للموقع على جهازك، وإرسال الرابط للعميل، كما لو أنك قمت برفعه على استضافة، وأمثلة لتلك الخدمات هي: Ngrok Localtunnel Serveo Teleconsole Pagekite
  22. برمجة الروبوتات تتطلب برمجة على الحاسوب الشخصي وليس بالضرورة استخدام بيئات سحابية مثل Google Colab، وبإمكانك استخدام الحاسوب الشخصي لتطوير وتجربة برامج الروبوتات وتحميلها مباشرة إلى الروبوت. ولكن بعض الأشخاص يفضلون استخدام بيئات سحابية مثل Google Colab لبرمجة الروبوتات بسبب بعض المزايا التي توفرها هذه البيئات. مثلاً، يمكن تشغيل البرامج على خوادم السحابة بدلاً من تشغيلها على الحاسوب الشخصي، وذلك قد يكون مفيدًا في حالة الروبوتات التي تحتاج إلى موارد كبيرة أو للتجربة والتطوير السريع دون الحاجة إلى تثبيت البرامج محليًا. أي ببساطة، إذا كان حاسوبك بمواصفات جيدة فلن تحتاج إلى Google Colab. وإليك مزيد من التفاصيل عن مجال برمجة الروبوتات Robotics :
  23. إذا كنت تريد أخذ لقطة شاشة Screenshot للموقع من أجل وضعه في معرض الأعمال، فهناك إضافات خاصة للمتصفح تسمح لك بذلك وهم: Screely وتلك الإضافة تسمح لك بأخذ لقطة للشاشة ووضعها في إطار لتبدوا إحترافية مثل الصورة التالية: ولكن اللقطة ليست لكامل الموقع، وإذا أردت إلتقاط كامل الموقع فأنصحك بالإضافة التالية: FireShot تلك الإضافة تسمح لك بأخذ لقطات للموقع كيفما تريد ومنها إلتقاط صورة لكامل الموقع وبأعلى جودة:
  24. تلك المشكلة حلها لديك أنت، ولا أحد قادر على حلها لك، فقط سيقدم لك النصائح، ومن لا يريد مساعدة نفسه فلا أحد يستطيع مساعدته، وبإمكانك مساعدة نفسك بتقليل المشتتات من حولك وصاحب الملل، نعم الملل هو من سيدفعك للمذاكرة والقيام بشيء مفيد بدلاً من التركيز على الملهيات والمشتتات التي تبقي عقلك مشغولاً ويتلذذ بجرعات الدوبامين اللحظية وقصيرة الأجل. وطالما اخترت مجالك على أساس سليم، كما شرحت لك من قبل وسأترك لك النقاش هنا: بعد ذلك عليك بإختيار مسار تعليمي مكون من الكورسات اللازمة للحصول على المهارات المطلوبة في ذلك المجال، أي يجب أن تختار الكورسات وتلتزم بها من البداية وبالطبع تستطيع تغييرها إن كانت سيئة لكن فيما يتعلق بالكورسات المجانية فالأمر محدود وليس لديك الكثير من الخيارات. وبخصوص الإلتزام فقد تحدثت عن ذلك من قبل في النقاشات التالية: الإلتزام في تعلم البرمجة وتجنب المشتتات
  25. مسؤولية إنشاء الـ API هي خاصة بمطور الواجهة الخلفية، لكنك تستطيع تعلم ذلك، وذلك ما قصدته بكونك تستطيع، أو بإمكانك استخدام تقنيات توفر لك إنشاء API بدون الحاجة إلى إنشاء سيرفر وتعرف باسم Serverless مثل Netlify Functions وAWS Lambda. وNetlify Functions هي خدمة من Netlify تسمح لك بتشغيل شفراتك كـ API endpoints بشكل بسيط، وهي جزء من خدمات الـ serverless functions، وطريقة لنشر الكود الخادم كـ API endpoints، حيث يتم تشغيلها تلقائيًا عند حدوث حدث محدد، وتقوم بمعالجة الشفرات التي تعمل على الجانب الخادم وتتوقف بعد الإنتهاء من المهمة. وأغلب مطوري تطبيقات يستخدمون Firebase كواجهة خلفية للتطبيق وتتيح لهم إرسال واستقبال الطلبات أي إنشاء API وأيضًا قاعدة بيانات، بكل سهولة، وفقط عليك بتعلم كيفية الإتصال وإنشاء حساب وقاعدة بيانات واستخدام الدوال الخاصة بها في الكود لديك. وأيضًا هناك منصات مشابهة وهم Appwrite وSupabase، وإليك نبذة مختصرة: Firebase مجموعة شاملة من الأدوات التي توفر بنية تحتية قوية لتطوير تطبيقات الهاتف المحمول والويب، وتتضمن Firebase خدمات مختلفة مثل قاعدة بيانات الوثائق (Firestore) وتخزين الملفات والمصادقة وإرسال الإشعارات والتحليلات وغيرها الكثير، وتستطيع استخدام API Firebase لإجراء عمليات القراءة والكتابة والمزيد بدون الحاجة إلى كتابة الكود الخاص بالخلفية. Appwrite منصة خلفية مفتوحة المصدر تساعدك في بناء خدمات الويب السحابية (Backend-as-a-Service) بسهولة، وتوفر Appwrite مجموعة من الخدمات المختلفة مثل قاعدة بيانات الوثائق والتخزين والمصادقة والتحليلات، وبإمكانك استخدام API Appwrite لإنشاء وتعديل واستعلام البيانات دون الحاجة لمعرفة متقدمة بالواجهة الخلفية. Supabase منصة لإنشاء واجهة برمجة تطبيقات قاعدة البيانات (API) مبنية على PostgreSQL، وتوفر Supabase تجربة مشابهة لقاعدة بيانات PostgreSQL التقليدية مع إضافة طبقة من الواجهة البرمجية التي تجعل من السهل إنشاء وتعديل البيانات. وبالطبع تستطيع استخدام API Supabase لإجراء العديد من العمليات القياسية مثل الاستعلامات والإدخال والتحديث والحذف دون الحاجة لمعرفة متقدمة بالواجهة الخلفية. في المجمل، كل هذه المنصات تسعى إلى تبسيط تطوير التطبيقات وتقديم واجهات سهلة الاستخدام للمطورين الذين ليسوا متخصصين في الواجهة الخلفية، ولكن ستحتاج إلى بعض المعرفة الأساسية بمفاهيم الواجهة الخلفية والاستعلامات والتحكم في البيانات لتتمكن من استخدام هذه الأدوات بكفاءة. ولعلك تتسائل ما الفرق بين Serverless ومنصات مثل Firebase؟ ببساطة منصة مثل Firebase توفر تطوير تطبيقات شاملة تقدمها Google، وتتضمن Firebase مجموعة واسعة من الخدمات المستندة إلى السحابة مثل قاعدة بيانات الوثائق (Firestore)، وخدمة التخزين، والمصادقة، وإرسال الإشعارات، والتحليلات، والاستضافة، وغيرها الكثير. ويتم تطوير Firebase بشكل خاص لتسهيل تطوير التطبيقات النقالة وتوفير البنية التحتية اللازمة للتطبيقات الحديثة. من ناحية أخرى، يعتبر Serverless نمطًا لتطوير التطبيقات، ولا يرتبط بمنصة محددة، وتستخدم خدمات Serverless مثل AWS Lambda أو Azure Functions أو Google Cloud Functions لتنفيذ شفرة التطبيق فقط عندما يتم استدعاؤها، دون الحاجة لتكوين وإدارة خادم خاص، أي يتيح لك استخدام Serverless توفير الوقت والجهد في إدارة البنية التحتية وتكوين الخوادم. وFirebase تستخدم تحت الغطاء خدمات Serverless لتنفيذ بعض وظائفها، وكمثال فهي تستخدم Firebase Cloud Functions (وهي خدمة Serverless) لتشغيل الكود المستضاف في Firebase. أي يمكن اعتبار الخدمات السابقة (Supabase وAppwrite وFirebase) جزءًا من النمط Serverless في بعض الجوانب.
×
×
  • أضف...