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

Mustafa Suleiman

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

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

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

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

    474

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

  1. أنت تقصد التصميم المتجاوب للموقع، صحيح؟ ستحتاج إلى استخدام الـ media query من أجل ضبط تصميم الصفحة على مختلف أحجام الشاشات وذلك من خلال إختبار الموقع وتفق الـ Break points التي يصبح فيها التنسيق غير سليم عند حجم معين، وذلك باستخدام أدوات المطور في المتصفح أي بتصغير حجم الموقع أو إختيار حجم معين للشاشة وتصفح الموقع لإختباره. ومن الأفضل أن تعتمد من البداية على الـ Grid والـ Flex ووحدة قياس rem وأيضًا خاصية max-width من أجل تسهيل عملية تجاوب الصفحة. وقد تم ذكر ذلك هنا بالتفصيل: أما في حال كنت تقصد تصميم الموقع نفسه على أداة مثل Figma فستحاج بالطبع إلى تصميم نسخة خاصة بالشاشات الصغيرة وكيف سيتم عرض أقسام وعناصر الموقع على تلك المساحة الصغيرة، وأحيانًا يتم إنشاء نسخة لأجهزة التابلت أيضًا، والأمر عبارة عن إعادة توزيع لعناصر التصميم وتصغير الأحجام أو حذف بعض العناصر الغير ضرورية.
  2. عليك بتجربة التطبيق بالتحديث الأخير بدون أية تعديلات، لتفقد هل المشكلة من التعديلات التي قمت بها وتتعارض من كود معين في التطبيق أم هناك مشكلة في السورس كود نفسه. وهل أنت مطور أم مستخدم للتطبيق فقط؟ ففي حال كنت مطور قد تكون ملفات البناء القديمة غير متوافقة مع التغييرات الجديدة، فحاول إعادة بناء التطبيق من البداية باستخدام أدوات البناء الخاصة بفلاتر. وربما يفيديك حذف الملفات المؤقتة على هاتفك باستخدام أي برنامج لذلك من متجر جوجل بلاي، وأيضًا التأكد من التطبيق متوافق مع إصدار الأندرويد لديك. وهل حاولت تجربة التطبيق على هاتف آخر؟
  3. عليك أن تنتبه إلى أن الدالة 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++‎ في أكاديمية حسوب
  4. استخدم دالة 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 )
  5. تقصد أن الظل أسفل الـ 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، وبإمكانك تغيير القيم للوصول إلى الظل المطلوب.
  6. حاول استخدام مكتبة أخرى لضغط الفيديو مثل 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 في أندرويد.
  7. أنت نستخدم نوع ملف 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.
  8. أنت تقصد تمارين للدوال في جافاسكريبت، صحيح؟ تمارين للمبتدئين كتابة دالة تأخذ رقمًا كإدخال وتعيد ضعفه. كتابة دالة تأخذ رقمين كإدخال وتعيد مجموعهما. كتابة دالة تأخذ رقمًا كإدخال وتعيد الفرق بينه وبين 10. كتابة دالة تأخذ رقمًا كإدخال وتعيد النصف الصحيح له. كتابة دالة تأخذ رقمًا كإدخال وتعيد الجذر التربيعي له. تمارين متوسطة كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد مجموعتها. كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد أكبرها. كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد أصغرها. كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد عدد الأعداد الزوجية فيها. كتابة دالة تأخذ سلسلة من الأرقام كإدخال وتعيد عدد الأعداد الفردية فيها. تمارين متقدمة كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تبدأ بحرف متحرك. كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تنتهي بحرف ساكن. كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تحتوي على حرف "a". كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تحتوي على حرف "e". كتابة دالة تأخذ سلسلة من الكلمات كإدخال وتعيد عدد الكلمات التي تحتوي على حرف "i".
  9. الأمر به مخاطرة بلا شك، لذلك أنت بحاجة إلى تعلم كيفية التداول وكيفية قراءة الرسومات البيانية ومتى يكون هناك منحنى صاعد ومتى يكون هابط، وعوامل أخرى، وستجد على اليوتيوب دورات مناسبة لذلك كبداية. ولكن لا تحاول الاستثمار أبدًا في أي شيء لا تفهمه، ولا تفهم كيف تربح وكيف تخسر وكيف تعوض تلك الخسارة، أي يجب التعلم في البداية ثم المخاطرة برأس مال لا تحتاج إليه لأمور ضرورية ثم خوض التجربة. وإليك بعض المنصات التي يمكنك من خلالها شراء العملات الرقمية: Binance Coinbase Kraken Bitfinex Huobi وأنصحك بالبحث عن دورة التداول في العملات الرقمية على اليوتيوب لتفهم الأمر، ولا تستمع لنصيحة أي أحد بدون دراية وعلم.
  10. هناك عدة أسباب لذلك وأولها هو يجب أن يكون لديك نافذة VBA مفتوحة، قم بالنقر فوق إدراج > ورقة عمل VBA أو انقر فوق رمز VBA في شريط الأدوات القياسي. وفي حال كنت تريد تشغيل رمز في ورقة عمل VBA، فيجب عليك تحديد الورقة أولاً، بالنقر فوق أي خلية في الورقة. ربما أيضًا الرمز يحتوي على خطأ ولن يتم تشغيله، ولتصحيح الخطأ استخدم عارض الأخطاء في Visual Basic Editor لتحديد الخطأ وإصلاحه. وهل تم تعطيل وحدات الماكرو في Excel؟ ولتفعيلها ، انتقل إلى ملف > خيارات > أمان > أمان محتوى ملف Excel، وضمن "وحدات الماكرو المسموح بها في ملف Excel" ، حدد "تشغيل جميع وحدات الماكرو".
  11. أنت على الطريق الصحيح، حيث يجب تحديد فترة زمنية لإنهاء أي أمر في حياتك، فلا تدع أبدًا الأمر للظروف وتقلبات مزاجك، بل تحديد جدول زمني والإلتزام به حتى لو لم يكن لديك الطاقة الكافية كل يوم لكن الاستمرار حتى لو بأقل القليل يوميًا أفضل من لا شيء، وما لا يمكن قياسه لا يمكن إدارته وتحسينه. وأي مسار برمجي بحاجة على الأقل إلى 6 أشهر وقد تصل إلى سنة لبعض الأشخاص، وأنا لا أتحدث عن دورة واحدة بل مسار برمجي مثل الواجهة الأمامية به أكثر من دورة وليس دورة واحدة مثلاً (أساسيات html, css, js) ثم لديك دورة مفصلة ومتقدمة لجافاسكريبت ثم دورة خاصة بـ React. وفي أكاديمية حسوب، ستجد أن الدورة تجمع ما بين أكثر من دورة وتم تقسيمها إلى مسارات. أي أمامك فترة 6 أشهر لإنهاء المسار البرمجي، وقد تصل إلى سنة ولا مشكلة في ذلك حسب مستواك وخبراتك السابقة والوقت المتاح لك يوميًا ومقدار إجتهادك ورغبتك في التعلم فعلاً. وإذا أردت نصيحتي خصص كل الوقت المتاح لك بعد قضاء مهامك اليومية مثل الصلاة وغيرها للبرمجة، أي انقطع حتى عن أصحابك ثم عد إليهم بعد إنتهاء فترة الـ 6 أشهر، ربما ذلك أمر لا يقدر عليه البعض لكن ابتعد عن كل ما يشتتك ولا يدفعك للأمام. فالبعض قد يستغرق فترة 3 أشهر وتجد أنه يتفاخر بأنه أصبح مبرمج، وفي الحقيقة هو ليس كذلك، بل يجب الدراسة بشكل معمق وتنفيذ مشاريع حقيقية والتركيز على الأساسيات وأي فترة أقل من 6 أشهر لا أعتبرها مناسبة. وأثناء تقدير الوقت، لا تنسى زيادة مدة الدورة إلى 4 أضعاف وقتها وذلك لحساب الوقت المستغرق في الفهم والاستيعاب والبحث والتطبيق وخلافه، فأنا مثلاً كنت أتوقف وأقوم بتنفيذ مشروع مختلف مشابه للموجودة في الدورة التي كنت أدرسها من أجل تحدي نفسي لتعلم المزيد والبحث وتثبيت المعلومات، ولا مشكلة في تنفيذ المشروع الموجود في الدورة لكن حاول تنفيذه بمفردك وإعادة الأمر في حال وجدت صعوبة في أول مرة وذلك طبيعي. وأنصحك بقراءة التالي:
  12. يوجد طريقتان لنقل مجلد من مجلد آخر إلى سطح المكتب في Linux. الطريقة الأولى هي استخدام واجهة المستخدم الرسومية (GUI): افتح مدير الملفات. انتقل إلى المجلد الذي يحتوي على المجلد الذي تريد نقله. حدد المجلد الذي تريد نقله. اسحب المجلد إلى سطح المكتب. الطريقة الثانية هي استخدام سطر الأوامر. للقيام بذلك: افتح نافذة موجه الأوامر. انتقل إلى المجلد الذي يحتوي على المجلد الذي تريد نقله في منفذ الأوامر terminal. اكتب الأمر التالي: mv source_folder destination_folder وبالطبع استبدل source_folder باسم المجلد أو الملف، واستبدل اسم destination_folder بالوجهة التي تريد نقل المجلد أو الملف إليها. أي في حال كنت تريد نقل المجلد "my_folder" إلى سطح المكتب، فستكتب الأمر التالي: mv my_folder ~/Desktop وسيؤدي ذلك إلى نقل المجلد "my_folder" إلى سطح المكتب.
  13. استخدم قيمة ذلك الحقل لتنفيذ البحث في قاعدة البيانات، كالتالي: في ملف العرض (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 بعرض النتائج أيضًا.
  14. الـ 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. وأنصحك بقراءة التالي:
  15. السؤال الصحيح هو، هل لديك الوقت الكافي؟ عليك بتحديد الوقت المتاح لك ثم التخطيط على أساسه، وأيضًا تحديد الدورات بناءًا على الهدف والمجال الذي تنوي التخصص به، فلو أردت التأسيس في مجال البرمجة بشكل جيد ولديك الوقت الكافي، فعليك بتعلم C++ أولاً لكن البعض قد يجدها صعبة ويصاب بالإحباط بدون داعي، ولذلك ستجد أغلب دورات أساسيات البرمجة تقوم بتدريس لغة بايثون لكونها لغة قوية وشائعة الاستخدام ومطلوبة وسهلة، أي أن الأمر راجع لك وتستطيع التجربة والحكم ولا مشكلة في ذلك أبدًا لكن بشرط المحاولة. وقد ذكرت أنك درست CS50 ولن تحتاج إلى أكثر من ذلك حاليًا في البداية، عليك فقط بإختيار لغة البرمجة الأولى لك والتمسك بها والتعمق فيها من خلال تنفيذ المشاريع بعد دراسة الأساسيات والتطبيق عليها، وإذا أردت دراسة جافاسكريبت كلغة برمجة أولى فلا مشكلة في ذلك، لكن الصحيح هو C أو C++ ثم بايثون ثم جافاسكريبت رغم أني أفضل C++ ثم بايثون ثم جافاسكريبت، هل أنا تعلمت بتلك الطريقة؟ لا، الوقت لدي كان محدود، لذلك تعلمت أساسيات البرمجة من خلال بايثون لقلة الوقت لدي ولسهولة تعلم بايثون، ثم انتقلت إلى الواجهة الأمامية وتعمقت في جافاسكريبت، ثم تعلمت إطار خاص بالواجهة الأمامية وهو React ثم تعلمت الواجهة الخلفية من خلال node.js وذلك خلال فترة 6 أشهر وبمعدل 10 ساعات يوميًا وربما أكثر، فالأمر ليس بالهين أبدًا. وإذا أردت نصيحة واحدة فقط، ركز على الأساسيات ما استطعت وبشدة ثم طبق عليها بأكثر من مشروع حتى تشعر أنك استوعبتها تمامًا وأصبح الأمر سهل من خلال التكرار. وأنت لديك الوقت كما أظن، فتعلم بالطريقة الصحيحة كما أشرت لك، ثم انتقل للغة الخاصة بالمجال الذي تنوي التخصص به.
  16. أنت تتحدث عن بايثون وبها تُعرف كل من القوائم والصفوف باسم «المجموعات» وبالطبع هناك بعض الاختلافات الرئيسية: القوائم هي بنية بيانات قابلة للتغيير، مما يعني أنه باستطاعتك إضافة عناصر إليها أو حذفها أو تعديلها دون الحاجة إلى إنشاء قائمة جديدة، وتُستخدم القوائم لتخزين البيانات التي لا تحتاج إلى أن تكون مرتبة، مثل قائمة المهام أو قائمة التسوق. الصفوف هي بنية بيانات غير قابلة للتغيير، مما يعني أنه لا يمكنك إضافة عناصر إليها أو حذفها أو تعديلها دون إنشاء صف جديد، وتُستخدم الصفوف عادةً لتخزين البيانات التي تحتاج إلى أن تكون مرتبة، مثل قائمة الطلاب في الفصل الدراسي أو قائمة المنتجات في متجر. متى تستخدم القائمة؟ عندما تحتاج إلى بنية بيانات قابلة للتغيير يمكن أن تحتوي على عناصر من أنواع مختلفة، أي مثل استخدام قائمة لتخزين قائمة المهام أو قائمة التسوق أو قائمة الطلاب في الفصل الدراسي أو قائمة المنتجات في متجر. متى تستخدم الصف؟ في حال أنك تحتاج إلى بنية بيانات غير قابلة للتغيير يمكن أن تحتوي على عناصر من نوع واحد فقط، مثلاً صف لتخزين قائمة الطلاب في الفصل الدراسي أو قائمة المنتجات في متجر. وإليك بعض الأمثلة: # هذا مثال على قائمة تحتوي على أسماء الطلاب في الفصل الدراسي: students = ["John", "Mary", "Peter", "Susan"] # هذا مثال على صف يحتوي على علامات الطلاب في الفصل الدراسي: grades = [90, 80, 70, 60] # هذا مثال على كيفية إضافة عنصر إلى قائمة: students.append("Alice") # هذا مثال على كيفية حذف عنصر من قائمة: students.remove("Mary") # هذا مثال على كيفية تعديل عنصر في قائمة: students[0] = "Jane" # هذا مثال على كيفية إنشاء صف جديد من قائمة: grades_2 = list(grades)
  17. تلك نتيجة طبيعية لدراسة الدورة بالأسلوب الغير صحيح، وفي البداية ستحتاج إلى 3 أشهر على الأقل في حالة الدراسة بشكل يومي لإنهاء الدورة في حال كانت تلك لغة البرمجة الأولى لك، حيث سيتعين عليك المراجعة وإعادة بعض الدروس وإعادة تنفيذ بعض المشاريع بمفردك وخلافه، لكي تتمكن من تثبيت المعلومات. ولا مشكلة إذا استغرقت أكثر من ذلك، لكن يجب ثم يجب تحديد جدول زمني واقعي بناءًا على الوقت المتاح لك وبناءًا على تقديرك لنفسك وعلى المقدار الذي تستطيع استيعابه بشكل يومي، وخصص وقت لكتابة الكود والتدرب على ما تعلمته وليس مشاهدة الفيديوهات فقط. وعليك باستيعاب أنه يوجد ما يسمى بمنحنى النسيان وهو مفهوم يستخدم في علم النفس لوصف طريقة تغير الذاكرة مع مرور الوقت، ويعني كيفية تلاشي الذكريات مع مرور الزمن وتقليل قدرة الفرد على استعادة المعلومات التي تم تخزينها في الذاكرة. في بداية تخزين المعلومات، يكون الاسترجاع سهلًا ودقيقًا، ولكن مع مرور الوقت، يتلاشى الاسترجاع ويصبح أصعب، ويشير منحنى النسيان إلى أن هناك فترة تتلاشى خلالها المعلومات بشكل سريع في البداية، ولكن مع مرور الوقت، يصبح معدل النسيان أقل وأقل، ويتم الحفاظ على الجوهر الأساسي للمعلومات المهمة. فبعد مرور يوم واحد من التعلم، هناك انخفاض في الاسترجاع الدقيق للمعلومات، ويعتمد مدى النسيان على عوامل مثل طبيعة المعلومات ومدى تكرارها وأهميتها بالنسبة للشخص تتراوح نسبة النسيان بعد مرور يوم واحد بين 20% إلى 40% من المعلومات. وبعد 3 أيام من 50% إلى 70% وبعد مرور أسبوع ترتفع النسبة إلى 70% وحتى 90%، وذلك في حال لم تقم بإعادة تكرار ما تعلمته وذلك من خلال تنفيذ مشاريع للتطبيق على ما تعلمته وتثبيت المعلومات واستخدام ما سبق وتعلم أمور جديدة. أي بعد التطبيق لأول مرة، من الأفضل أن تقوم بالتطبيق مرة أخرى بعد مرور أٍسبوع والأمر قد يبدوا ممل، لكن أنت مخير بين ذلك أو ألم نسيان المعلومات وضياع الوقت الذي استغرقته في ذلك، وعليك أيضًا التركيز على الفهم ثم الحفظ وكلاهما مطلوبان لكن الفهم أولاً فهو ما سيسمح لك بالبحث عن المعلومات واستخدامها حتى لو نسيتها، وستنسى بعض الأشياء بالطبع والجميع كذلك حتى من لديه سنوات خبرة، لكن بسبب الفهم والاستيعاب هو قادر على البحث واستخدام ما يريد مباشرًة. وستجد المزيد من التفصيل في النقاش التالي:
  18. 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/) للإشارة إلى المصدر الأصلي.
  19. نستخدم جملة 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 بالاسم الصحيح للجدول الذي تحتوي عليه البيانات.
  20. السؤال متعلق بدورة تطوير واجهات المستخدم، لذلك أرجو منك التعليق أسفل فيديو الدورة المتعلق بالسؤال في التعليقات، وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة، ليتم مساعدتك بشكل أفضل.
  21. عليك بتعديل السطر الخاص بالاستيراد إلى التالي: from TaskController import TaskController وفي حال وجود مشكلة لديك في الدورة أرجو منك التعليق أسفل فيديو الدورة في التعليقات ليتم مساعدتك بشكل أفضل وطرح الأسئلة العامة هنا في قسم أسئلة البرمجة.
  22. أنتي بحاجة إلى كتابة الباسورد الخاص بالنظام ولا مشكلة في حال لم يظهر لك الباسورد يكفي كتابته ثم الضغط على Enter وسيتم التحميل وتأكدي من جود إتصال إنترنت قبل تحميل بايثون. والطريقة الصحيحة لثبيت بايثون على نظام لينكس هي بتنفيذ الأوامر التالية: sudo apt update && sudo apt upgrade -y sudo apt install python3 python3-pip ثم تأكدي من تثبيت بايثون من خلال معرفة الإصدار بالأمر التالي: python3 --version
  23. تختلف كمية ذاكرة الوصول العشوائي (RAM) التي يحتاجها التعدين من العملة الرقمية إلى أخرى أي حسب صعوبة تعدين العملية والمتبقي منها، فمثلاً يحتاج تعدين البيتكوين إلى ذاكرة وصول عشوائي بسعة 4 غيغابايت على الأقل، بينما يحتاج تعدين الإيثيريوم إلى ذاكرة وصول عشوائي بسعة 8 غيغابايت على الأقل وأنا أتحدث عن الحد الأدنى. ويستهلك تعدين العملات الرقمية كمية كبيرة من الطاقة، وذلك بسبب العمليات الحسابية المعقدة التي تتطلبها عملية التعدين، وتختلف كمية الطاقة التي يستهلكها التعدين من العملة الرقمية إلى أخرى، وذلك حسب خوارزمية التعدين المستخدمة، حيث يستهلك تعدين البيتكوين كمية كبيرة من الطاقة لكونه يعتمد على البطاقة الرسومية GPU بشكل كبير، بينما يستهلك تعدين الإيثيريوم كمية أقل من الطاقة. وبإمكانك حساب استهلاك الطاقة في تعدين العملات الرقمية باستخدام الصيغة التالية: استهلاك الطاقة = قوة الهاش (hash rate) * الجهد الكهربائي (voltage) * التيار الكهربائي (current) حيث: قوة الهاش: هي عدد العمليات الحسابية التي يمكن أن يقوم بها الجهاز في الثانية الواحدة. الجهد الكهربائي: هو مقدار الجهد الكهربائي الذي يتطلبه الجهاز لتشغيله. التيار الكهربائي: هو مقدار التيار الكهربائي الذي يمر عبر الجهاز. ولحساب قوة الهاش استخدم أداة مثل Minerstat أو WhatToMine. بينما لحساب الجهد الكهربائي استخدم أداة مثل FurMark أو OCCT. وكذلك لحساب التيار الكهربائي استخدم أداة مثل HWMonitor أو AIDA64. وانتبه إلى أن استهلاك الطاقة في تعدين العملات الرقمية قد يصبح مرتفعًا جدًا، مما يؤدي إلى ارتفاع فاتورة الكهرباء، لذلك، من المهم اختيار جهاز التعدين الذي يتمتع بكفاءة عالية في استهلاك الطاقة. وأيضًا عليك بحساب الربح بعد خصم تلك المصاريف والفواتير، حيث أن كل بطاقة شاشة تستطيع تعدين عدد معين من العملات الرقمية ولها استهلاك طاقة معين ولها تكلفة إجمالية وهي سعر البطاقة، فعليك بحساب متى ستحصل على تكلفة الكرت ثم تبدأ في الحصول على الربح وأيضًا حساب تكلفة الكهرباء.
  24. لتغيير الألوان في منفذ الأوامر المتضمن في 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
  25. أرجو توضيح ما تريده من خلال صورة أو فيديو لفهم سبب المشكلة ، وما فهمته أنك تريد تثبيت عنوان الجدول بناءًا على الكود الذي وضحته، ونستخدم خاصية position بقيمة sticky من أجل ذلك كالتالي: th { position: sticky; top: 0; background: #146356; color: white; }
×
×
  • أضف...