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

Mustafa Suleiman

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

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

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

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

    365

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

  1. بالطبع سيتم سؤالك عن إثبات للهوية في حال قيامك بأي نشاط على باي بال، سواء من خلال بطاقة الرقم القومي أو جواز السفر، وذلك لأن نPayPal يسعى إلى حماية المستخدمين من الاحتيال، وهناك عدد من الطرق المختلفة الأخرى التي يمكنك من خلالها توثيق حسابك، بما في ذلك: تقديم نسخة من كشف حسابك المصرفي. التحقق من رقم هاتفك المحمول. التحقق من عنوانك البريدي. ويختلف مقدار المعلومات التي يُطلب منك تقديمها اعتمادًا على البلد الذي تعيش فيه ونوع حساب PayPal الذي لديك، وإذا طُلب منك توثيق حسابك، فيمكنك القيام بذلك من خلال زيارة موقع PayPal وتسجيل الدخول إلى حسابك. ثم، انقر فوق علامة التبويب "الحساب" وحدد "التوثيق" من القائمة. سيرشدك PayPal بعد ذلك خلال عملية التوثيق.
  2. أولاً عليك بتصميم جدول للمنتجات يحتوي على معلومات المنتجات مثل الاسم والسعر والكمية المتوفرة وغيرها من المعلومات التي تحتاجها كالتالي: CREATE TABLE products ( product_id INT AUTO_INCREMENT PRIMARY KEY, product_name VARCHAR(255) NOT NULL, price DECIMAL(10, 2) NOT NULL, quantity INT NOT NULL ); ثم إنشاء جدول لتخزين بيانات الفواتير مثل تاريخ الفاتورة ومعلومات الموظف وحالة الدفع. CREATE TABLE invoices ( invoice_id INT AUTO_INCREMENT PRIMARY KEY, employee_name VARCHAR(255) NOT NULL, invoice_date DATE NOT NULL, total_amount DECIMAL(10, 2) NOT NULL, amount_paid DECIMAL(10, 2) NOT NULL, payment_status ENUM('Unpaid', 'Partially Paid', 'Paid') NOT NULL ); بعد ذلك ربط جدول المنتجات بجدول الفواتير لكي تتمكن من تتبع التفاصيل الخاصة بكل فاتورة والمنتجات المرتبطة بها: CREATE TABLE invoice_details ( detail_id INT AUTO_INCREMENT PRIMARY KEY, invoice_id INT NOT NULL, product_id INT NOT NULL, quantity INT NOT NULL, subtotal DECIMAL(10, 2) NOT NULL, FOREIGN KEY (invoice_id) REFERENCES invoices (invoice_id), FOREIGN KEY (product_id) REFERENCES products (product_id) ); والآن تأتي خطوة إضافة بيانات المنتجات بإضافة بعض البيانات الاختبارية لجدول المنتجات باستخدام عبارة INSERT INTO. INSERT INTO products (product_name, price, quantity) VALUES ('Product 1', 10.00, 50), ('Product 2', 15.00, 30), ('Product 3', 20.00, 20); وعندما يقوم الموظف بعمل طلب جديد، يتم إنشاء فاتورة جديدة في جدول الفواتير، وربما تحتاج إلى تعبئة بعض المعلومات مثل اسم الموظف وتاريخ الفاتورة. وبعد إنشاء الفاتورة، قم بإضافة تفاصيل الطلب (المنتجات المطلوبة وكمياتها) إلى جدول تفاصيل الفواتير. ثم احتفظ بمعلومات المبلغ المدفوع في جدول الفواتير، وتستطيع تحديث حالة الدفع إلى "Partially Paid" عند دفع جزء من المبلغ وعند دفع المبلغ بالكامل يمكنك تحديث حالة الدفع إلى "Paid". وباستخدام حقل الحالة في جدول الفواتير، بإمكانك متابعة ما إذا كان العميل قد قام بدفع الفاتورة بالكامل أم لا.
  3. لديه خطأ يعني أنه عندما تقوم بتطبيق مشغّل الفحص (null check operator) "!" على قيمة تكون فارغة (null)، وعند استخدام "!" بجانب متغير أو خاصية يفترض أن تكون غير فارغة (non-null)، فإذا كانت القيمة فعليًا فارغة (null)، سيتم رفع خطأ بسبب هذا التصريح غير الصحيح. وفي الكود لديك قبل استخدام المشغّل "!" على المتغير أو الخاصية، عليك بالتحقق إذا كانت القيمة فعليًا غير فارغة باستخدام التحقق من القيمة الفارغة كالتالي: if (myVariable != null) { // قم بتنفيذ العمليات على myVariable هنا } أيضًا استخدم مشغل عدم الائتمان "?" بدلاً من "!" والذي سيتجاوز الخطأ إذا كان المتغير فعليًا فارغًا (null) وسيعيد قيمة افتراضية بدلاً من رفع الخطأ كالتالي: var value = myVariable?.someProperty; وفي حال كانت myVariable فارغة (null)، سيتم تعيين قيمة value بدلاً من رفع الخطأ. بإمكانك أيضًا استخدام ثلاثي العوامل للتحقق من أكثر من خاصية في سلسلة من الخصائص دون رفع الخطأ إذا كان أحد هذه الخصائص فارغًا (null): var value = myVariable?.someProperty?.anotherProperty;
  4. أنت تقصد التصميم المتجاوب للموقع، صحيح؟ ستحتاج إلى استخدام الـ media query من أجل ضبط تصميم الصفحة على مختلف أحجام الشاشات وذلك من خلال إختبار الموقع وتفق الـ Break points التي يصبح فيها التنسيق غير سليم عند حجم معين، وذلك باستخدام أدوات المطور في المتصفح أي بتصغير حجم الموقع أو إختيار حجم معين للشاشة وتصفح الموقع لإختباره. ومن الأفضل أن تعتمد من البداية على الـ Grid والـ Flex ووحدة قياس rem وأيضًا خاصية max-width من أجل تسهيل عملية تجاوب الصفحة. وقد تم ذكر ذلك هنا بالتفصيل: أما في حال كنت تقصد تصميم الموقع نفسه على أداة مثل Figma فستحاج بالطبع إلى تصميم نسخة خاصة بالشاشات الصغيرة وكيف سيتم عرض أقسام وعناصر الموقع على تلك المساحة الصغيرة، وأحيانًا يتم إنشاء نسخة لأجهزة التابلت أيضًا، والأمر عبارة عن إعادة توزيع لعناصر التصميم وتصغير الأحجام أو حذف بعض العناصر الغير ضرورية.
  5. عليك بتجربة التطبيق بالتحديث الأخير بدون أية تعديلات، لتفقد هل المشكلة من التعديلات التي قمت بها وتتعارض من كود معين في التطبيق أم هناك مشكلة في السورس كود نفسه. وهل أنت مطور أم مستخدم للتطبيق فقط؟ ففي حال كنت مطور قد تكون ملفات البناء القديمة غير متوافقة مع التغييرات الجديدة، فحاول إعادة بناء التطبيق من البداية باستخدام أدوات البناء الخاصة بفلاتر. وربما يفيديك حذف الملفات المؤقتة على هاتفك باستخدام أي برنامج لذلك من متجر جوجل بلاي، وأيضًا التأكد من التطبيق متوافق مع إصدار الأندرويد لديك. وهل حاولت تجربة التطبيق على هاتف آخر؟
  6. عليك أن تنتبه إلى أن الدالة isNaN() غير موجودة في C++، والدالة isNaN() هي دالة في JavaScript، وليس في C++. ولتحديد ما إذا كان الرقم الذي أدخله المستخدم هو قيمة غير صالحة في C++، فعليك بالإعتماد على مكتبات iostream و limits التي تحتوي على وظائف الإدخال والإخراج وتعريفات مثل numeric_limits للتحقق من الخصائص العددية. ثم كتابة دالة main() التي تعد نقطة البداية في البرنامج. تقوم بتعريف متغير "n" من النوع double لتخزين العدد الذي سيدخله المستخدم. ويُطلب من المستخدم إدخال عدد من خلال استخدام std::cout و std::cin. std::cout يُستخدم لإخراج رسالة للمستخدم ليدخل العدد المطلوب. ثم نستخدم الحلقة while(true) لتكرار المطالبة بإدخال العدد حتى يُدخل المستخدم عددًا صحيحًا إيجابيًا. داخل الحلقة، استخدم std::cin للتحقق من الإدخال الصحيح، وذلك بوضع std::cin في شرط if للتحقق من نجاح القراءة، وإذا نجحت القراءة، نتحقق مما إذا كان العدد المُدخل (n) أكبر من الصفر، وفي حال إذا كذلك، فإننا نخرج من الحلقة باستخدام break ويكون الإدخال صحيحًا وإيجابيًا. وإذا كان لدينا إدخال غير صحيح (مثل إدخال حرف) أو كان العدد أقل من أو يساوي الصفر، يُطلب من المستخدم إعادة المحاولة من خلال طباعة رسالة "Invalid input. Please enter a positive number: ". ثم معالجة الخطأ بوضع std::cin في حالة خطأ باستخدام std::cin.clear() ومسح المحتوى السابق المدخل بواسطة std::cin.ignore(). وعندما يُدخل المستخدم عددًا صحيحًا إيجابيًا، سنخرج من الحلقة ونطبع الرقم المدخل بواسطة std::cout. وفي النهاية يُعيد البرنامج 0 كرمز للخروج من البرنامج بنجاح. وإليك مثال: #include <iostream> #include <limits> int main() { double n; std::cout << "Enter a positive number: "; while (true) { if (std::cin >> n) { if (n > 0) { break; // المدخل صحيح وإيجابي، نخرج من الحلقة } else { std::cout << "Invalid input. Please enter a positive number: "; } } else { std::cout << "Invalid input. Please enter a number: "; std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } } std::cout << "The number is: " << n << std::endl; return 0; } مقالات ودروس لغة C++‎ في أكاديمية حسوب
  7. استخدم دالة array_combine()، وهي تستقبل مصفوفة من المفاتيح ومصفوفة من القيم وتعيد مصفوفة جديدة يكون كل عنصر فيها هو زوج مفتاح-قيمة من عنصر المصفوفة الأولى مع عنصر المصفوفة الثانية المقابل له. أي في حال لدينا المصفوفة التالية: $friends = [ "Ahmed Gamal" => "AG", "Osama Mohamed" => "OM", "Mahmoud Gamal" => "MG", "Ahmed Samy" => "AS" ]; ونريد دمج أوامر array_reverse() وarray_flip()، نكتب الكود كالتالي: $reversed_and_flipped_friends = array_combine(array_reverse($friends), array_flip($friends)); وستقوم تلك الدالة بإنشاء مصفوفة جديدة كالتالي: [ "OM" => "Osama Mohamed", "AG" => "Ahmed Gamal", "MG" => "Mahmoud Gamal", "AS" => "Ahmed Samy" ] وبإمكانك طباعة المصفوفة الجديدة بالشكل التالي: echo '<pre>'; print_r($reversed_and_flipped_friends); echo '</pre>'; والنتيجة هي: Array ( [OM] => Osama Mohamed [AG] => Ahmed Gamal [MG] => Mahmoud Gamal [AS] => Ahmed Samy )
  8. تقصد أن الظل أسفل الـ navbar غير سليم؟ أما تقصد أنك تحاول إضافة ظل لعنصر absolute؟ من الأسهل إضافة الظل مباشرًة للـ navbar. عامًة في Tailwind CSS، تستطيع استخدام خاصية shadow، وتحتوي خاصية shadow على الأنماط المختلفة للظل، بما في ذلك shadow-sm و shadow-md و shadow-lg وغيرها، ومن الأفضل استخدام shadow-md هنا لأنه يقدم ظل معتدل. <nav class="bg-white p-4 shadow-md"> <!-- محتوى النافبار هنا --> </nav> أما عن طريق CSS فسنقوم بالتالي: .navbar { box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); /* يمكنك ضبط هذه القيم حسب احتياجاتك */ } 0px: إزاحة الظل أفقياً، هنا ليس هناك إزاحة (الظل مباشرة تحت العنصر). 4px: إزاحة الظل عمودياً، أي أن الظل سيكون 4 بكسل أسفل العنصر. 6px: تمويه (blur) الظل. هذا يضيف ضبابية للظل ليبدو أكثر طبيعية. rgba(0, 0, 0, 0.1): اللون والشفافية (opacity) للظل، واستخدمت اللون الأسود (RGB 0, 0, 0) والشفافية 0.1، وبإمكانك تغيير القيم للوصول إلى الظل المطلوب.
  9. حاول استخدام مكتبة أخرى لضغط الفيديو مثل FFmpegAndroid (تدعم جافا فقط) وهي مكتبة منفصلة يتطلب تضمينها واستخدامها في مشروع Android لديك باستخدام Gradle أو تحميل ملف JAR مباشرة. ثم أنشئ AsyncTask مماثلة للكود لديك، ولكن في دالة doInBackground()، قم بتنفيذ عملية ضغط الفيديو مع الصوت باستخدام FFmpeg. بعد ذلك استخدم FFmpeg في doInBackground() لضغط الفيديو مع الصوت، باستخدام الأمر ffmpeg -i input_video.mp4 -c:v libx264 -c:a aac -strict experimental -b:a 128k output_video.mp4 لضغط الفيديو مع الصوت بتنسيق MP4، ويُفترض أن input_video.mp4 هو المسار الكامل للفيديو الذي تم اختياره، و output_video.mp4 هو المسار الذي سيتم حفظ الفيديو المضغوط به. وفي onPostExecute()، استخدم المسار الكامل للفيديو المضغوط لتعيين VideoView. وفي حال أردت استخدام مكتبة حديثة (مكتوبة بواسطة كوتلن) وتدعم Flutter أيضًا وهي أفضل في رأي فاستخدم مكتبة LightCompressor وإليك المستند الرسمي الخاص بها: https://github.com/AbedElazizShe/LightCompressor وهي تعتمد على MediaCodec API في أندرويد.
  10. أنت نستخدم نوع ملف webm، ,وليس هناك دعم من متصفح الويب لصيغة ملف webm، حيث أن الصيغ المدعومة في عنصر audio هي MP3, WAV, و OGG. أي حاول تسجيل الصوت باستخدام صيغة ملف مدعومة على جهاز الكمبيوتر الخاص بك (مثل wav أو ogg)، وتحديث الكود على النحو التالي: في ملف audio.html، غيِّر نوع الصيغة في عنصر <audio> إلى صيغة ملف مدعومة، مثل wav أو ogg: <audio style="display:none" id="audi" controls="controls" src="" type="audio/wav"></audio> وفي ملف audio.php، غيِّر المصفوفة $allowedExtension لتشمل الصيغة التي تم اختيارها في الملف audio.html: if ($audio_url = _file('audio', ['wav', 'ogg'], 1000 * 1000 * 5, 'upload')) { // ... } وفي حال كنت ترغب في دعم صيغ أخرى للملفات الصوتية، فتستطيع إضافتها إلى المصفوفة $allowedExtension في ملف audio.php.
  11. أنت تقصد تمارين للدوال في جافاسكريبت، صحيح؟ تمارين للمبتدئين كتابة دالة تأخذ رقمًا كإدخال وتعيد ضعفه. كتابة دالة تأخذ رقمين كإدخال وتعيد مجموعهما. كتابة دالة تأخذ رقمًا كإدخال وتعيد الفرق بينه وبين 10. كتابة دالة تأخذ رقمًا كإدخال وتعيد النصف الصحيح له. كتابة دالة تأخذ رقمًا كإدخال وتعيد الجذر التربيعي له. تمارين متوسطة كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد مجموعتها. كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد أكبرها. كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد أصغرها. كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد عدد الأعداد الزوجية فيها. كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد عدد الأعداد الفردية فيها. تمارين متقدمة كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تبدأ بحرف متحرك. كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تنتهي بحرف ساكن. كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تحتوي على حرف "a". كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تحتوي على حرف "e". كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تحتوي على حرف "i".
  12. الأمر به مخاطرة بلا شك، لذلك أنت بحاجة إلى تعلم كيفية التداول وكيفية قراءة الرسومات البيانية ومتى يكون هناك منحنى صاعد ومتى يكون هابط، وعوامل أخرى، وستجد على اليوتيوب دورات مناسبة لذلك كبداية. ولكن لا تحاول الاستثمار أبدًا في أي شيء لا تفهمه، ولا تفهم كيف تربح وكيف تخسر وكيف تعوض تلك الخسارة، أي يجب التعلم في البداية ثم المخاطرة برأس مال لا تحتاج إليه لأمور ضرورية ثم خوض التجربة. وإليك بعض المنصات التي يمكنك من خلالها شراء العملات الرقمية: Binance Coinbase Kraken Bitfinex Huobi وأنصحك بالبحث عن دورة التداول في العملات الرقمية على اليوتيوب لتفهم الأمر، ولا تستمع لنصيحة أي أحد بدون دراية وعلم.
  13. هناك عدة أسباب لذلك وأولها هو يجب أن يكون لديك نافذة VBA مفتوحة، قم بالنقر فوق إدراج > ورقة عمل VBA أو انقر فوق رمز VBA في شريط الأدوات القياسي. وفي حال كنت تريد تشغيل رمز في ورقة عمل VBA، فيجب عليك تحديد الورقة أولاً، بالنقر فوق أي خلية في الورقة. ربما أيضًا الرمز يحتوي على خطأ ولن يتم تشغيله، ولتصحيح الخطأ استخدم عارض الأخطاء في Visual Basic Editor لتحديد الخطأ وإصلاحه. وهل تم تعطيل وحدات الماكرو في Excel؟ ولتفعيلها ، انتقل إلى ملف > خيارات > أمان > أمان محتوى ملف Excel، وضمن "وحدات الماكرو المسموح بها في ملف Excel" ، حدد "تشغيل جميع وحدات الماكرو".
  14. أنت على الطريق الصحيح، حيث يجب تحديد فترة زمنية لإنهاء أي أمر في حياتك، فلا تدع أبدًا الأمر للظروف وتقلبات مزاجك، بل تحديد جدول زمني والإلتزام به حتى لو لم يكن لديك الطاقة الكافية كل يوم لكن الاستمرار حتى لو بأقل القليل يوميًا أفضل من لا شيء، وما لا يمكن قياسه لا يمكن إدارته وتحسينه. وأي مسار برمجي بحاجة على الأقل إلى 6 أشهر وقد تصل إلى سنة لبعض الأشخاص، وأنا لا أتحدث عن دورة واحدة بل مسار برمجي مثل الواجهة الأمامية به أكثر من دورة وليس دورة واحدة مثلاً (أساسيات html, css, js) ثم لديك دورة مفصلة ومتقدمة لجافاسكريبت ثم دورة خاصة بـ React. وفي أكاديمية حسوب، ستجد أن الدورة تجمع ما بين أكثر من دورة وتم تقسيمها إلى مسارات. أي أمامك فترة 6 أشهر لإنهاء المسار البرمجي، وقد تصل إلى سنة ولا مشكلة في ذلك حسب مستواك وخبراتك السابقة والوقت المتاح لك يوميًا ومقدار إجتهادك ورغبتك في التعلم فعلاً. وإذا أردت نصيحتي خصص كل الوقت المتاح لك بعد قضاء مهامك اليومية مثل الصلاة وغيرها للبرمجة، أي انقطع حتى عن أصحابك ثم عد إليهم بعد إنتهاء فترة الـ 6 أشهر، ربما ذلك أمر لا يقدر عليه البعض لكن ابتعد عن كل ما يشتتك ولا يدفعك للأمام. فالبعض قد يستغرق فترة 3 أشهر وتجد أنه يتفاخر بأنه أصبح مبرمج، وفي الحقيقة هو ليس كذلك، بل يجب الدراسة بشكل معمق وتنفيذ مشاريع حقيقية والتركيز على الأساسيات وأي فترة أقل من 6 أشهر لا أعتبرها مناسبة. وأثناء تقدير الوقت، لا تنسى زيادة مدة الدورة إلى 4 أضعاف وقتها وذلك لحساب الوقت المستغرق في الفهم والاستيعاب والبحث والتطبيق وخلافه، فأنا مثلاً كنت أتوقف وأقوم بتنفيذ مشروع مختلف مشابه للموجودة في الدورة التي كنت أدرسها من أجل تحدي نفسي لتعلم المزيد والبحث وتثبيت المعلومات، ولا مشكلة في تنفيذ المشروع الموجود في الدورة لكن حاول تنفيذه بمفردك وإعادة الأمر في حال وجدت صعوبة في أول مرة وذلك طبيعي. وأنصحك بقراءة التالي:
  15. يوجد طريقتان لنقل مجلد من مجلد آخر إلى سطح المكتب في Linux. الطريقة الأولى هي استخدام واجهة المستخدم الرسومية (GUI): افتح مدير الملفات. انتقل إلى المجلد الذي يحتوي على المجلد الذي تريد نقله. حدد المجلد الذي تريد نقله. اسحب المجلد إلى سطح المكتب. الطريقة الثانية هي استخدام سطر الأوامر. للقيام بذلك: افتح نافذة موجه الأوامر. انتقل إلى المجلد الذي يحتوي على المجلد الذي تريد نقله في منفذ الأوامر terminal. اكتب الأمر التالي: mv source_folder destination_folder وبالطبع استبدل source_folder باسم المجلد أو الملف، واستبدل اسم destination_folder بالوجهة التي تريد نقل المجلد أو الملف إليها. أي في حال كنت تريد نقل المجلد "my_folder" إلى سطح المكتب، فستكتب الأمر التالي: mv my_folder ~/Desktop وسيؤدي ذلك إلى نقل المجلد "my_folder" إلى سطح المكتب.
  16. استخدم قيمة ذلك الحقل لتنفيذ البحث في قاعدة البيانات، كالتالي: في ملف العرض (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 بعرض النتائج أيضًا.
  17. الـ 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. وأنصحك بقراءة التالي:
  18. السؤال الصحيح هو، هل لديك الوقت الكافي؟ عليك بتحديد الوقت المتاح لك ثم التخطيط على أساسه، وأيضًا تحديد الدورات بناءًا على الهدف والمجال الذي تنوي التخصص به، فلو أردت التأسيس في مجال البرمجة بشكل جيد ولديك الوقت الكافي، فعليك بتعلم C++ أولاً لكن البعض قد يجدها صعبة ويصاب بالإحباط بدون داعي، ولذلك ستجد أغلب دورات أساسيات البرمجة تقوم بتدريس لغة بايثون لكونها لغة قوية وشائعة الاستخدام ومطلوبة وسهلة، أي أن الأمر راجع لك وتستطيع التجربة والحكم ولا مشكلة في ذلك أبدًا لكن بشرط المحاولة. وقد ذكرت أنك درست CS50 ولن تحتاج إلى أكثر من ذلك حاليًا في البداية، عليك فقط بإختيار لغة البرمجة الأولى لك والتمسك بها والتعمق فيها من خلال تنفيذ المشاريع بعد دراسة الأساسيات والتطبيق عليها، وإذا أردت دراسة جافاسكريبت كلغة برمجة أولى فلا مشكلة في ذلك، لكن الصحيح هو C أو C++ ثم بايثون ثم جافاسكريبت رغم أني أفضل C++ ثم بايثون ثم جافاسكريبت، هل أنا تعلمت بتلك الطريقة؟ لا، الوقت لدي كان محدود، لذلك تعلمت أساسيات البرمجة من خلال بايثون لقلة الوقت لدي ولسهولة تعلم بايثون، ثم انتقلت إلى الواجهة الأمامية وتعمقت في جافاسكريبت، ثم تعلمت إطار خاص بالواجهة الأمامية وهو React ثم تعلمت الواجهة الخلفية من خلال node.js وذلك خلال فترة 6 أشهر وبمعدل 10 ساعات يوميًا وربما أكثر، فالأمر ليس بالهين أبدًا. وإذا أردت نصيحة واحدة فقط، ركز على الأساسيات ما استطعت وبشدة ثم طبق عليها بأكثر من مشروع حتى تشعر أنك استوعبتها تمامًا وأصبح الأمر سهل من خلال التكرار. وأنت لديك الوقت كما أظن، فتعلم بالطريقة الصحيحة كما أشرت لك، ثم انتقل للغة الخاصة بالمجال الذي تنوي التخصص به.
  19. أنت تتحدث عن بايثون وبها تُعرف كل من القوائم والصفوف باسم «المجموعات» وبالطبع هناك بعض الاختلافات الرئيسية: القوائم هي بنية بيانات قابلة للتغيير، مما يعني أنه باستطاعتك إضافة عناصر إليها أو حذفها أو تعديلها دون الحاجة إلى إنشاء قائمة جديدة، وتُستخدم القوائم لتخزين البيانات التي لا تحتاج إلى أن تكون مرتبة، مثل قائمة المهام أو قائمة التسوق. الصفوف هي بنية بيانات غير قابلة للتغيير، مما يعني أنه لا يمكنك إضافة عناصر إليها أو حذفها أو تعديلها دون إنشاء صف جديد، وتُستخدم الصفوف عادةً لتخزين البيانات التي تحتاج إلى أن تكون مرتبة، مثل قائمة الطلاب في الفصل الدراسي أو قائمة المنتجات في متجر. متى تستخدم القائمة؟ عندما تحتاج إلى بنية بيانات قابلة للتغيير يمكن أن تحتوي على عناصر من أنواع مختلفة، أي مثل استخدام قائمة لتخزين قائمة المهام أو قائمة التسوق أو قائمة الطلاب في الفصل الدراسي أو قائمة المنتجات في متجر. متى تستخدم الصف؟ في حال أنك تحتاج إلى بنية بيانات غير قابلة للتغيير يمكن أن تحتوي على عناصر من نوع واحد فقط، مثلاً صف لتخزين قائمة الطلاب في الفصل الدراسي أو قائمة المنتجات في متجر. وإليك بعض الأمثلة: # هذا مثال على قائمة تحتوي على أسماء الطلاب في الفصل الدراسي: students = ["John", "Mary", "Peter", "Susan"] # هذا مثال على صف يحتوي على علامات الطلاب في الفصل الدراسي: grades = [90, 80, 70, 60] # هذا مثال على كيفية إضافة عنصر إلى قائمة: students.append("Alice") # هذا مثال على كيفية حذف عنصر من قائمة: students.remove("Mary") # هذا مثال على كيفية تعديل عنصر في قائمة: students[0] = "Jane" # هذا مثال على كيفية إنشاء صف جديد من قائمة: grades_2 = list(grades)
  20. تلك نتيجة طبيعية لدراسة الدورة بالأسلوب الغير صحيح، وفي البداية ستحتاج إلى 3 أشهر على الأقل في حالة الدراسة بشكل يومي لإنهاء الدورة في حال كانت تلك لغة البرمجة الأولى لك، حيث سيتعين عليك المراجعة وإعادة بعض الدروس وإعادة تنفيذ بعض المشاريع بمفردك وخلافه، لكي تتمكن من تثبيت المعلومات. ولا مشكلة إذا استغرقت أكثر من ذلك، لكن يجب ثم يجب تحديد جدول زمني واقعي بناءًا على الوقت المتاح لك وبناءًا على تقديرك لنفسك وعلى المقدار الذي تستطيع استيعابه بشكل يومي، وخصص وقت لكتابة الكود والتدرب على ما تعلمته وليس مشاهدة الفيديوهات فقط. وعليك باستيعاب أنه يوجد ما يسمى بمنحنى النسيان وهو مفهوم يستخدم في علم النفس لوصف طريقة تغير الذاكرة مع مرور الوقت، ويعني كيفية تلاشي الذكريات مع مرور الزمن وتقليل قدرة الفرد على استعادة المعلومات التي تم تخزينها في الذاكرة. في بداية تخزين المعلومات، يكون الاسترجاع سهلًا ودقيقًا، ولكن مع مرور الوقت، يتلاشى الاسترجاع ويصبح أصعب، ويشير منحنى النسيان إلى أن هناك فترة تتلاشى خلالها المعلومات بشكل سريع في البداية، ولكن مع مرور الوقت، يصبح معدل النسيان أقل وأقل، ويتم الحفاظ على الجوهر الأساسي للمعلومات المهمة. فبعد مرور يوم واحد من التعلم، هناك انخفاض في الاسترجاع الدقيق للمعلومات، ويعتمد مدى النسيان على عوامل مثل طبيعة المعلومات ومدى تكرارها وأهميتها بالنسبة للشخص تتراوح نسبة النسيان بعد مرور يوم واحد بين 20% إلى 40% من المعلومات. وبعد 3 أيام من 50% إلى 70% وبعد مرور أسبوع ترتفع النسبة إلى 70% وحتى 90%، وذلك في حال لم تقم بإعادة تكرار ما تعلمته وذلك من خلال تنفيذ مشاريع للتطبيق على ما تعلمته وتثبيت المعلومات واستخدام ما سبق وتعلم أمور جديدة. أي بعد التطبيق لأول مرة، من الأفضل أن تقوم بالتطبيق مرة أخرى بعد مرور أٍسبوع والأمر قد يبدوا ممل، لكن أنت مخير بين ذلك أو ألم نسيان المعلومات وضياع الوقت الذي استغرقته في ذلك، وعليك أيضًا التركيز على الفهم ثم الحفظ وكلاهما مطلوبان لكن الفهم أولاً فهو ما سيسمح لك بالبحث عن المعلومات واستخدامها حتى لو نسيتها، وستنسى بعض الأشياء بالطبع والجميع كذلك حتى من لديه سنوات خبرة، لكن بسبب الفهم والاستيعاب هو قادر على البحث واستخدام ما يريد مباشرًة. وستجد المزيد من التفصيل في النقاش التالي:
  21. 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/) للإشارة إلى المصدر الأصلي.
  22. نستخدم جملة 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 بالاسم الصحيح للجدول الذي تحتوي عليه البيانات.
  23. السؤال متعلق بدورة تطوير واجهات المستخدم، لذلك أرجو منك التعليق أسفل فيديو الدورة المتعلق بالسؤال في التعليقات، وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة، ليتم مساعدتك بشكل أفضل.
  24. عليك بتعديل السطر الخاص بالاستيراد إلى التالي: from TaskController import TaskController وفي حال وجود مشكلة لديك في الدورة أرجو منك التعليق أسفل فيديو الدورة في التعليقات ليتم مساعدتك بشكل أفضل وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة.
  25. أنتي بحاجة إلى كتابة الباسورد الخاص بالنظام ولا مشكلة في حال لم يظهر لك الباسورد يكفي كتابته ثم الضغط على Enter وسيتم التحميل وتأكدي من جود إتصال إنترنت قبل تحميل بايثون. والطريقة الصحيحة لثبيت بايثون على نظام لينكس هي بتنفيذ الأوامر التالية: sudo apt update && sudo apt upgrade -y sudo apt install python3 python3-pip ثم تأكدي من تثبيت بايثون من خلال معرفة الإصدار بالأمر التالي: python3 --version
×
×
  • أضف...