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

Mustafa Suleiman

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

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

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

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

    495

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

  1. البداية تبدأ بتحسين الأساسيات للملف الشخصي، بمعنى يجب تعديل الصورة الشخصية بصورة إحترافية أكثر وليس صورة شخصية خاصة بوسائل التواصل الإجتماعي. ثم تعديل معرض الأعمال ووضع صور توضح المشروع وليس صورة واحدة فقط، بمعنى قم بإلتقاط صور للمشروع وضعها في وصف المشروع. ثم تحسين الوصف الخاص بحسابك "نبذة عنك" فهي عامة جدًا أي الجميع يكتب ذلك الوصف وخالي من أي إضافة شخصية. ثم عليك تعلم كيفية كتابة عرض إحترافي، وستجد تفصيل هنا: وأثناء تقديم عروض على المشاريع تفقد نوعية المشاريع الأكثر طلبًا والمهارات المطلوبة، وقم بتحسين مستواك في تلك المهارات أو تعلمها، وكذلك المشاريع اعمل على تطوير مشاريع مشابهة لما هو مطلوب بالتالي يصبح لديك مثال وإثبات على أنك تستطيع القيام بالمطلوب، وذلك يحُسن من قبول عرضك بشكل كبير.
  2. بالطبع ما زلت في البداية، بحاجة إلى وقت وممارسة وإلتزام فقط.
  3. صحيح، ومع الوقت سيتحسن مستواك وبالتالي جودة المشاريع ستتحسن بشكل كبير، لذا اختر أفضل المشاريع التي قمت بها وضعها في قسم Featured في حسابك.
  4. ما هي المشكلة التي تواجهها؟ بدون برمجة ستحتاج إلى استخدم أداة BotFather التي توفرها تيليجرام لإنشاء بوت جديد وتلك الخطوة أساسية، بجانب منصة Manybot أو Chatfuel أو ManyChat لإدارة الردود الآلية. أو برمجيًا فستحتاج إلى الإعتماد على مكتبة مثل python-telegram-bot، وكمثال بسيط: from telegram.ext import Updater, MessageHandler, Filters def reply(update, context): if "سعر" in update.message.text: update.message.reply_text("الأسعار: الباقة الأساسية 50 ريال، الباقة المميزة 100 ريال.") elif "تواصل" in update.message.text: update.message.reply_text("للتواصل: @support أو رقم الواتساب 050xxxxxxx") updater = Updater("ضع التوكن هنا") updater.dispatcher.add_handler(MessageHandler(Filters.text, reply)) updater.start_polling()
  5. لا يتم في الشهادة كتابة مسارات معينة، بل يتم بها كتابة أنك اجتزت الدورة كالتالي: والشهادة لا معنى لها بدون تحقيق استفادة من الدورة، هي إثبات على أنك درست محتوى معين ويتم الحصول عليها بعد إختبارات نظرية وعملية وليس لمجرد الحضور لذا هي شهادة لها وزنها، لكن الأهم في مجال البرمجة هو مهاراتك أنت. آلية الإختبار هي كالتالي: بعد إنهاء 4 مسارات من الدورة على الأقل، أو الدورة بالكامل عليك رفع المشاريع التي قمت بها بالدورة على حسابك في github، ثم التحدث لمركز المساعدة وإخبارهم أنك تريد التقدم للإختبار وتوفير روابط المشاريع على github. ثم الإنتظار لبعض الوقت لحين مراجعة المشاريع وسيتم الرد عليك، وتحديد موعد لإجراء مقابلة، وبها يتم: إجراء محادثة صوتيّة لمدة 30 دقيقة يطرح المدرّب عليك أسئلة متعلّقة بالدورة والأمور التي نفّذتها خلالها. يحدد لك المدرّب مشروعًا مرتبطًا بما قمت به أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع إلى أسبوعين. إجراء محادثة صوتيّة أخرى لمدّة 30 دقيقة يناقش بها مشروعك وما نفذته وتطرح أسئلة خلالها. إن سارت على جميع الخطوات السابقة بشكل صحيح، تحصل على الشهادة أو يرشدك المدرّب لأماكن القصور ويطلب منك تداركها ثم التواصل معنا من جديد.
  6. ما قمت به حتى الآن عمل رائع جدًا والقليل من يقوم بالتطبيق بشكل عملي بجانب الدورة أي عدم الإكتفاء بما يتم شرحه والتطبيقات العملية المتاحة. وبخصوص المشاريع فلا أنصحك بوضع المشاريع التي تقوم بها في البداية، فالتصميم لن يكون جيد بطبيعة الحال، لذا انتظر لبعض الوقت لحين العمل على تحسين مهارة التصميم والتي هي بحاجة إلى وقت، وبالطبع ليس عليك أن تكون مُصمم فأنت مطور، أقصد تحسين تلك المهارة من خلال الاستلهام وتعلم أساسيات التصميم الجيد، ولا مشكلة في نقل التصميم كما هو لكن يجب توضيح ذلك عند نشره أي أنك قمت بالجزء البرمجي فقط. المشاريع الأولية هي بمثابة تدريب لك، وكذلك المشاريع التي تتم بالدورة الجميع قام بها، لذا حاول التعديل في التصميم ووضع لمسة خاصة بك وإضافة مزايا أخرى أيضًا، وهي مشاريع مناسبة للنشر لكن مع التعديل. الحالة الوحيدة التي يمكنك بها نشر المشاريع الأولية التي تقوم بها بجانب الدورة، هي بنشر ما تعلمته أيضًا، بمعنى كتابة شرح مفيد به معلومات تختصر ما تعلمته أثناء تنفيذك للمشروع والتحديات التي واجهتها، أي تستطيع نشر المشروعين في منشور واحد، مع وضع صور للتوضيح وليس الروابط فقط. ومع مرور الوقت اختر 3 مشاريع ناضجة وبمستوى جيد وقم بنشرهم على فترات وكتابة ما تعلمته في كل مشروع ونتيجة تراكم الخبرات التي أوصلتك لتنفيذه، وتعيينهم لقسم Featured في حسابك. وبالنسبة للصور اعتمد على التالي: Unsplash https://www.pexels.com/ https://www.freepik.com/ https://www.humaaans.com/ https://www.drawkit.io/ https://blush.design/
  7. الدورة توفر لك الأساسيات الخاصة بتطوير الويب وهي HTML, CSS, JS وبوتستراب و Jquery لكن ستحتاج بعدها إلى تعلم React و Next.js و typescript وtailwind. وستجد تفصيل هنا يوضح لماذا دورة جافاسكريبت هي دورة مُكملة لدورة تطوير واجهات المستخدم:
  8. السؤال غير واضح، في الدورة سيتم دراسة HTML, CSS, JS ومكتبتي بوتستراب وjQuery، لذا ستتعلم أساسيات الويب بالفعل، لكن لتتمكن من أن تصبح مطور واجهات أمامية فيجب تعلم مكتبة أو إطار للواجهة الأمامية مثل React. وستجد تفصيل هنا:
  9. ستحتاج إلى مجموعة من المكتبات لتنفيذ ما تريد، وهم: pyautogui لمحاكاة حركة الماوس والكيبورد. subprocess و os لتشغيل أوامر النظام. psutil لمراقبة موارد النظام CPU، RAM، وخلافه. pywin32 (Windows) للتحكم في نوافذ Windows وتطبيقاتها. أما بالنسبة لأندرويد فستعتمد على ADB للتحكم في الهاتف من الكمبيوتر باستخدام مكتبة بايثون adb-shell وبالطبع يجب ربط الهاتف بالحاسوب عن طريق الـ USB. ثم ستحتاج إلى أتمتة واجهة المستخدم من خلال أحد المكتبات التالية uiautomator, Appium, أو scrcpy مع بايثون. ومثلاً لإرسال رسالة SMS من أندرويد عبر ADB: from adb_shell.adb_device import AdbDeviceTcp device = AdbDeviceTcp("192.168.1.100", 5555) device.connect() device.shell("am start -a android.intent.action.SENDTO -d sms:123456789 --es sms_body 'مرحباً من بايثون' --ez exit_on_sent true") وبالطبع استبدل الرقم 123456789 بالرقم الذي تريد الإرسال إليه، واستبدل 192.168.1.100 بعنوان هاتفك ولمعرفته، افتح الإعدادات ثم خيارات المطور ثم فعل ADB over network، وسيظهر لك عنوان IP مثل 192.168.x.x واستخدمه بدل 192.168.1.100 في الكود. أما بالنسبة لـ IOS فالأمر صعب ومعقد.
  10. أحسنت في ذلك، فيما يخص TypeScript، فالأفضل تعريف الـ Interfaces في ملف منفصل وليكن types.ts أو interfaces.ts في حال إذا ستُستخدم في أكثر من مكان، أو على الأقل خارج الدالة المكونة. أيضاً، النوع id: number | null غير ضروري بما أنك تستخدم Date.now()، فالملاحظة ستحصل دائمًا على id عند إنشائها، وتستطيع تبسيطه إلى id: number. الحالة الوحيدة التي تكون فيها القيمة null هي للمتغير selectedNote، وهو ما قمت به بشكل صحيح useState<number| null>(null)، لكن id داخل كائن الملاحظة نفسه لن يكون null أبدًا. وبالنسبة لتحديد أنواع الدوال، فمعظم الدوال سواء addToNoteHandler و updateNoteHandler لا تحتوي على أنواع محددة للـ parameters الخاصة بها أو القيمة العائدة منها ، وTypeScript تستنتجها بناءًا على الكود الخاص بالدالة، لكن تحديدها صراحةً يجعل الكود أوضح. وللعلم بإمكانك إنشاء Hook مخصص وقابل لإعادة الاستخدام لإدارة أي حالة في localStorage كالتالي: import { useState, useEffect } from 'react'; function useLocalStorage<T>(key: string, initialValue: T): [T, (value: T) => void] { const [storedValue, setStoredValue] = useState<T>(() => { try { const item = window.localStorage.getItem(key); return item ? JSON.parse(item) : initialValue; } catch (error) { console.error(error); return initialValue; } }); const setValue = (value: T) => { try { const valueToStore = value instanceof Function ? value(storedValue) : value; setStoredValue(valueToStore); window.localStorage.setItem(key, JSON.stringify(valueToStore)); } catch (error) { console.error(error); } }; return [storedValue, setValue]; } export default useLocalStorage; واستخدامه في App.tsx كالتالي: import useLocalStorage from './hooks/useLocalStorage'; const [notes, setNotes] = useLocalStorage<Note[]>('notes', []);
  11. Git ليست من اختصاص الدورة، فهي خاصة بدورة واجهات المستخدم، ستجد هنا شرح لتعلم Git: وبخصوص react وعدم تضمينها في دورة تطوير واجهات المستخدم، السبب هو أن الدورة موجهة لتعلم أساسيات الواجهة الأمامية من خلال تعلم اللغات الأساسية التي يعتمد عليها أي مكتبة أو إطار للواجهة الأمامية وهو HTML, CSS, JS. وتعلم تلك اللغات في البداية واجب وضروري، وبدونها ستعاني في فهم ما يدور في الكود الخاص بك عند تعلم تلك المكتبات والإطارات، وأيضًا ستواجه صعوبة في حل المشكلات التي تواجهك وأيضًا تخصيص مشروعك بالشكل الذي ترغب به. ولتعلم React.js الأمر يحتاج إلى فرد مساحة في دورة مختلفة تمامًا، والدورة لن تكون للمبتدئين في الواجهة الأمامية، فأنت بحاجة إلى تعلم اللغات الأساسية كما ذكرت لتفهم ما يحدث وما فائدة ما تتعلمه وتكتبته. ولذلك ستجد أنه تم تخصيص دورة تطوير التطبيقات باستخدام لغة JavaScript من أجل تعلم مكتبة React وإطارات جافاسكريبت الأخرى مثل React Native لتطوير تطبيقات الهاتف وأيضًا Ionic ثم ستتعلم Electron.js لتطوير برامج سطح المكتب. وأيضًا يوجد شرح لإطار Next.js وهو هام جدًا بعد تعلم React من أجل التصيير من جهة الخادم Server-side Rendering. وجميع المسارات الأولى من الدورات الأخرى متاحة لك، وتستطيع الإطلاع عليها فمثلاً في دورة تطوير التطبيقات باستخدام لغة JavaScript المسار الأول هو أساسيات لغة JavaScript وأنصحك بالإطلاع عليه لتعلم المزيد عن جافاسكريبت بجانب ما درسته في دورة تطوير واجهة المستخدم.
  12. أرجو توضيح ما هي الدورة المقصودة، عامًة يوجد تمارين عملية ولكن ليس في جميع المسارات، وأحيانًا هناك مسارات نظرية لذا لا يوجد بها تمارين بطبيعة الحال، كذلك يوجد مشاريع عملية مباشرًة بعد شرح الأسياسات للتطبيق على ما قمنا بدراسته والتوسع أيضًا في الشرح. وفي حال احتجت إلى تمارين ولم تجدها، تستطيع السؤال أسفل الدروس في التعليقات وسيتم توفيرها لك.
  13. بشكل بسيط، في البرمجة الإجرائية التركيز على ما هي الخطوات التي يجب أن تقوم بها، أي البرنامج هو سلسلة من الأوامر، الأمر أشبه بكتابة وصفة طبخ أي تكتب قائمة من التعليمات المرتبة. والبيانات هي كيان سلبي ومنفصل، بمعنى الدوال هي التي تأتي من الخارج وتعمل على تلك البيانات، ويبدأ البرنامج بشكل هرمي بمعنى الدالة الرئيسية تستدعي دوال، وتلك الدوال تستدعي دوال أخرى. والبيانات العامة يمكن الوصول إليها وتعديلها من أي دالة، وذلك يسبب آثارًا جانبية غير متوقعة، كذلك وحالة البرنامج بأكمله محفوظة في متغيرات عامة، مما يجعل تتبع التغييرات صعبًا. للتوضيح: account_balance = 0.0 def deposit(amount): """Procedure to add an amount to the overall balance""" global account_balance account_balance += amount print(f"Deposited {amount}. New balance: {account_balance}") def withdraw(amount): global account_balance if amount <= account_balance: account_balance -= amount print(f"Withdrew {amount}. New balance: {account_balance}") else: print("Error: Insufficient balance.") def show_balance(): print(f"Current balance is: {account_balance}") show_balance() deposit(1000) withdraw(300) show_balance() account_balance = -5000.0 print("Balance manipulated from outside the functions!") show_balance() أما في البرمجاة الكائنية تُعالج ما سبق من خلال التركيز على بناء كائنات رئيسية وكائنات فرعية والتي ترث من الرئيسية، والبيانات والدوال مرتبتطان بشكل وثيق، فالكائن مسؤول عن حماية وإدارة بياناته الخاصة، أي البرنامج يتكون من مجموعة من الكائنات المستقلة التي تتواصل مع بعضها البعض عن طريق استدعاء توابع (الميثودز) بعضها البعض. والغرض من ذلك تطوير نظام معقد بطريقة تجعله سهل الفهم، الصيانة، والتوسيع، وذلك عن طريق مباديء البرمجة الكائنية وهي الوراثة وتعدد الأشكال والتغليف والتجريد. ونفس الكود السابق يُصبح كالتالي: class BankAccount: def __init__(self, initial_balance=0.0): self.balance = initial_balance def deposit(self, amount): if amount > 0: self.balance += amount print(f"Deposited {amount}. New balance: {self.balance}") def withdraw(self, amount): if amount <= self.balance: self.balance -= amount print(f"Withdrew {amount}. New balance: {self.balance}") else: print("Error: Insufficient balance.") def show_balance(self): print(f"Current balance is: {self.balance}") account1 = BankAccount(1000) account2 = BankAccount(5000) account1.show_balance() account1.deposit(200) account1.withdraw(50) account2.show_balance() account2.withdraw(1000) print("Final balance of the first account:") account1.show_balance() print("Final balance of the second account:") account2.show_balance()
  14. بالطبع تستطيع ذلك، يمكنك طرح أي أسئلة متعلقة بأقسام الأسئلة المتاحة بالأكاديمية، ومنها قسم البرمجة والخاص بجميع أسئلة البرمجة.
  15. هل رقمك شخصي أم تجاري؟ فواتساب لا يوفر API رسمي ومجاني للتفاعل مع حسابات واتساب الشخصية بينما يوفر ذلك للحسابات التجارية، بالتالي ستحتاج إلى الإلتفاف حول ذلك. ويوجد حلول عن طريق جافاسكريبت ومنها مكتبة whatsapp-web.js وopen-wa. أما في بايثون فالحل الأفضل هو Selenium لمحاكاة استخدامك لموقع web.whatsapp.com في متصفح حقيقي، وستقوم بكتابة سكربت بايثون يتحكم في المتصفح ليقوم بالخطوات التي كنت ستقوم بها يدويًا. أو استخدام WhatsApp Business API لقراءة الرسائل من المجموعات التي يكون رقمك المرتبط بالـ API عضوًا فيها، وليس فقط الرسائل المباشرة الموجهة لرقمك، وبالطبع الاستخدام ليس مجاني.
  16. الأفضل تعلم أساسيات Git وكيفية استخدام منصة GitHub من الآن، فهي مهارة أساسية لا غنى عنها لأي شخص يعمل في مجال البرمجة، أي اعتد على استخدام Git من الآن، ستجد هنا مصادر: وبخصوص الإختبار، فستقوم بإختباره بشكل يدوي في البداية، وهل يعمل بشكل سليم وفق المطلوب أم لا، وفي حال هناك إدخال من قبل المستخدم فيجب تجربة إدخالات خاطئة ومن المفترض أن يتم التعامل مع تلك الحالات في الكود لديك، أي بدلاً من رقم تُدخل نص وهكذا أو لا تُدخل أي شيء. وكذلك تفقد الأخطاء من خلال الإعتماد على دالة print لطباعة قيم معينة في الكود لتتفقد هل يعمل بشكل سليم أم لا. وبعد فترة ستقوم بتعلم مفهوم Unit testing وهناك مكتبة باسم pytest لذلك.
  17. تستطيع تعديله وليس حذفه، لا تشغل بالك، حاليًا أرجو وضع السؤال أسفل الدرس الخاص به في التعليقات
  18. ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
  19. المشكلة أنك تستخدم كائن حالة واحد filters لجميع متغيرات الفلترة والبحث والترقيم، وباستدعاء setFilters لتغيير أي خاصية مثلاً keyword عند البحث، يتم إنشاء كائن جديد تمامًا في الذاكرة. بالتالي FormFilters يتلقى كائنًا جديدًا في كل مرة ويتلقى دالة جديدة في كل مرة في onApplyFilters، ونفس المبدأ ينطبق على مكون Search عندما تتغير الفلاتر الجانبية. والمشكلة أيضًا ليست فقط في إنشاء كائن جديد، بل في تمرير نفس الكائن وإن كان جديدًا إلى جميع المكونات في آنٍ واحد، فكل مكون يرى أنّ أحد الـ props تغير، فيُعاد تركيبه. لو استخدمت مكتبة إدارة حالة مثل Zustand كان سيجنبك تلك المشكلة من البداية بكل سهولة. بدونها الأفضل استخدام useReducer بدلاً من useState لكن للتسهيل استخدم useState، أي يجب فصل الحالة إلى أجزاء مستقلة، فبدلاً من كائن واحد، استخدم أكثر من useState، بتقسيم كائن filters إلى حالات مستقلة في ProductsPage.jsx: const [keyword, setKeyword] = useState(""); const [pageNumber, setPageNumber] = useState(1); const [formFilters, setFormFilters] = useState({ category: [], minPrice: 0, maxPrice: 2000, sort: "", }); وبما أن useFetchProducts يتوقع كائن واحد، فنستطيع تجميعه باستخدام useMemo، وبالتالي كائن الفلاتر لن يتم إنشاؤه من جديد إلا إذا تغيرت إحدى الحالات التي يعتمد عليها: import { useCallback, useState, useMemo } from "react"; // بعد تعريف الحالات المنفصلة const apiFilters = useMemo(() => ({ keyword, pageNumber, ...formFilters, }), [keyword, pageNumber, formFilters]); const { data, isPending: isProductsPending, isError: isProductsError, error: productsError, } = useFetchProducts(apiFilters); ثم إنشاء دوال المعالجة عن طريق useCallback مع dependencies صحيحة. const handleSearchProducts = useCallback((text) => { setKeyword(text.trim()); setPageNumber(1); }, []); const handlePageChange = useCallback((newPage) => { setPageNumber(newPage); }, []); const handleApplyFilters = useCallback((newFilters) => { setFormFilters(newFilters); setPageNumber(1); }, []); ثم تغليف المكونات الفرعية FormFilters, Search, Pagination بـ React.memo لتستفيد من الـ props المستقرة، في FormFilters.js: import React from 'react'; const FormFilters = ({ }) => { }; export default React.memo(FormFilters); وفي Search.js: import React from 'react'; const Search = ({ }) => { }; export default React.memo(Search);
  20. إذن المتغير buybillForm.BillItemsTable الذي تستخدمه لإضافة الصنف الجديد فارغ في كل مرة تبدأ فيها عملية الإضافة، قم بتجربة العمل على نفس نسخة الـ DataTable التي يستخدمها DataGridView كمصدر بيانات منذ البداية. أي يجب أن يكون فورم الإضافة لا ينشئ DataTable جديد، بل يحصل على مرجع للجدول الأصلي الموجود في buybillForm ويعمل عليه مباشرًة. بمعنى عن فتح فورم إضافة الصنف، قم بتمرير BillItemsTable الحالي إليه عبر الـ constructor وهو AddItemForm: AddItemForm addItemForm = new AddItemForm(this.BillItemsTable); addItemForm.ShowDialog(); ثم استقبل الـ DataTable في الـ constructor واحتفظ به في متغير خاص بالفورم. public partial class AddItemForm : Form { private DataTable currentBillItems; private BuyBillForm mainBuyBillForm; public AddItemForm(DataTable billItemsTable, BuyBillForm ownerForm) { InitializeComponent(); this.currentBillItems = billItemsTable; this.mainBuyBillForm = ownerForm; } } ثم استخدم المتغير المحلي currentBillItems بدلاً من buybillForm.BillItemsTable لكي تضمن أنك تضيف الصفوف إلى نفس الجدول المرتبط بالـ DataGridView. if (e.KeyCode == Keys.Enter) { try { int quantity = 0; decimal price = 0; if (!int.TryParse(qty.Text, out quantity) || !decimal.TryParse(label5.Text, out price)) { MessageBox.Show("تأكد من صحة إدخال الكمية أو السعر", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } bool itemFound = false; foreach (DataRow row in this.currentBillItems.Rows) { if (row["item_code"]?.ToString() == label11.Text) { int oldQty = Convert.ToInt32(row["qty"]); row["qty"] = oldQty + quantity; row["total"] = Convert.ToDecimal(row["price"]) * Convert.ToInt32(row["qty"]); itemFound = true; MessageBox.Show("تم تحديث كمية الصنف بنجاح"); this.mainBuyBillForm.UpdateTotals(); break; } } if (!itemFound) { DataRow newRow = this.currentBillItems.NewRow(); newRow["item_name"] = label3.Text; newRow["item_date"] = label7.Text; newRow["qty"] = quantity; newRow["price"] = price; newRow["total"] = quantity * price; newRow["item_code"] = label11.Text; this.currentBillItems.Rows.Add(newRow); // الإضافة تتم على نفس الجدول الأصلي MessageBox.Show("تمت إضافة الصنف بنجاح"); this.mainBuyBillForm.UpdateTotals(); } } catch (Exception ex) { this.Dispose(); MessageBox.Show("حدث خطأ:\n" + ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
  21. يتوفر برنامج WARP من شركة Cloudflare على مختلف الأنظمة، أي متاح للويندوز والهواتف أيضًا، وهو أشبه بالـ VPN لكن لا يسمح لكِ بتغيير الـ IP لبلد معينة. آلية عمله هي تشفير الإتصال وحماية بياناتك، بالتالي مزود خدمة الإنترنت ISP الخاص بك أو أي شخص على نفس الشبكة العامة لا يمكنه رؤية المواقع التي تتصفحينها أو البيانات التي تتبادليها. كذلك توجيه بياناتك عبر مسارات أسرع وأقل ازدحاماً على شبكة الإنترنت، وذلك يؤدي إلى تحسين ملحوظ في سرعة الإنترنت في حال واجهتي بطيء في إتصال الإنترنت لديكِ. https://one.one.one.one/
  22. لكل شخص طريقته المناسبة في الدراسة، تستطيع تجربة طرق مختلفة وإعتماد ما تجده أنسب لك، البعض يُفضل تدوين النقاط الهامة في مدونة ورقية أو رقمية، والبعض الآخر يُفضل الاستيعاب ثم الحفظ في البداية ثم التطبيق العملي، والأهم نقطة الاستيعاب حيث تستطيع البحث عما تريده في حال نسيته لا مشكلة لأنك استوعبته. الجزئية الأهم هو تجنب الدراسة السلبية، بمعنى المشاهدة كثيرًا وتجنب التطبيق العملي، لكن هناك توضيح هنا، التطبيق العملي لا أقصد به التطبيق بشكل حرفي مع الشرح، فنسبة الاستفادة هنا ليست كبيرة، بل استيعاب الشرح ثم التوقف والتطبيق بمفردك. ستجد تفصيل هنا:
  23. المشكلة ليست في إضافة البيانات، بل في عرضها، أي الـ DataGridView لا يقوم بتحديث نفسه تلقائيًا في كل الحالات عند تعديل الـ DataTable المرتبط به مباشرة، أي بحاجة إلى إشعار بأن البيانات قد تغيرت. وأبسط حل هو أن تخبر الـ DataGridView أن يعيد ربط نفسه بمصدر البيانات بعد إضافة الصف الجديد لإجباره على قراءة البيانات من جديد وعرضها. if (!itemFound) { DataRow newRow = buybillForm.BillItemsTable.NewRow(); newRow["item_name"] = label3.Text; newRow["item_date"] = label7.Text; newRow["qty"] = quantity; newRow["price"] = price; newRow["total"] = quantity * price; newRow["item_code"] = label11.Text; buybillForm.BillItemsTable.Rows.Add(newRow); // <<-- هنا -->> buybillForm.dataGridView1.DataSource = buybillForm.BillItemsTable; MessageBox.Show("تمت إضافة الصنف بنجاح"); } فعند تعيين خاصية DataSource مرة أخرى، سيتم إجبار الـ DataGridView على التخلص من العرض القديم للبيانات ورسم نفسه من جديد بناءًا على الحالة الحالية لـ BillItemsTable، والتي تحتوي الآن على الصف الجديد.
  24. الهدف من الدورة هو شرح أساسيات المفاهيم الخاصة بالبرمجة وعلوم الحاسوب من أجل التأسيس في مجال البرمجة، أي ستحصل على نظرة عامة للمجال ويصبح لديك وعي حقيقي به، وبعدها تستطيع اختيار المجال الذي تريد التخصص به واستكمال مسيرتك البرمجية. أي أنّ الدورة لا توفر تخصص في مجال برمجي محدد أو شرح تقنيات بعينها، وشرط الحصول على وظيفة المذكور في وصف الدورة هو حقك بالطبع، وتستطيع المناقشة حوله من خلال مركز المساعدة فهو المختص بالأمور المالية. وبعد الإنتهاء من الدورة وإجتياز الإختبار سيتم توجهيك وإرشادك لمدة 6 أشهر بعد التخرج. ستجد هنا تفصل لفائدة دورة علوم الحاسوب ليتضح لك الأمر:
  25. المتاح في الأكاديمية هي الدورات الخاصة بالبرمجة، أما فترات التدريب Internships فهي غير متاحة، تستطيعي البحث على مواقع التوظيف مثل LinkedIn و Indeed عن ذلك، وتفقدي المنشورات للأشخاص العاملين في ذلك التخصص فمن فترة لأخرى تجدي مثل تلك الفرص، لذا تحتاجين إلى متابعتهم. لكن تلك الفرص قليلة حاليًا، لذا الطريقة الأفضل للحصول على خبرة هي من خلال التدريب الذاتي وتنفيذ مشاريع قريبة من الواقع العملي وغير مستهلكة بمعنى تجنب المشاريع التي يقوم بها الجميع ومتاحة بكثرة على اليوتيوب. أيضًا العمل على مواقع العمل الحر طريقة جيدة لاكتساب خبرة والإحتكاك بالواقع العملي عن طريق التعامل مع العملاء وتنفيذ المشاريع وتفهم المطلوب، لكن تجنبي التقديم على عروض بدون خبرة جيدة لكي لا تحصلين على تقييمات سلبية، الفكرة الإلمام بما هو مطلوب بنسبة 70% على الأقل. بالنسبة لمصادر تعلم UI/UX تفقدي التالي: وبالنسبة للأمن السيبراني فغير متاح دورات له، وستجدي مصادر هنا:
×
×
  • أضف...